Ejemplo n.º 1
0
 public function testCRUD()
 {
     midcom::get('auth')->request_sudo('org.openpsa.invoices');
     $invoice = new org_openpsa_invoices_invoice_dba();
     $next_number = $invoice->generate_invoice_number();
     $this->assertTrue(is_int($next_number));
     $invoice->number = $next_number;
     $stat = $invoice->create();
     $this->assertTrue($stat);
     $this->register_object($invoice);
     $this->assertEquals($next_number + 1, $invoice->generate_invoice_number());
     $sent = time();
     $date = time() - 3600 * 24;
     $invoice->sent = $sent;
     $invoice->date = $date;
     $stat = $invoice->update();
     $this->assertTrue($stat);
     $invoice->refresh();
     $expected_due = $invoice->get_default('due') * 3600 * 24 + $date;
     $this->assertEquals($expected_due, $invoice->due);
     $stat = $invoice->delete();
     $this->assertTrue($stat);
     $this->assertEquals($next_number, $invoice->generate_invoice_number());
     midcom::get('auth')->drop_sudo();
 }
Ejemplo n.º 2
0
 public function testCRUD()
 {
     midcom::get('auth')->request_sudo('org.openpsa.invoices');
     $data = new org_openpsa_invoices_billing_data_dba();
     $data->linkGuid = self::$_contact->guid;
     $data->useContactAddress = true;
     $stat = $data->create();
     $this->assertTrue($stat, midcom_connection::get_error_string());
     $this->register_object($data);
     $parent = $data->get_parent();
     $this->assertEquals($parent->guid, self::$_contact->guid);
     self::$_contact->refresh();
     $this->assertEquals(self::$_contact->street, $data->street);
     $data->vat = 12;
     $data->due = 12;
     $stat = $data->update();
     $this->assertTrue($stat);
     self::$_contact->refresh();
     $invoice = new org_openpsa_invoices_invoice_dba();
     $invoice->customerContact = self::$_contact->id;
     $invoice_data = $invoice->get_billing_data();
     $this->assertEquals($data->guid, $invoice_data->guid);
     $this->assertEquals($data->vat, $invoice->get_default('vat'));
     $this->assertEquals($data->due, $invoice->get_default('due'));
     $stat = $data->delete();
     $this->assertTrue($stat);
     midcom::get('auth')->drop_sudo();
 }
Ejemplo n.º 3
0
 public function test_int_field()
 {
     midcom::get('auth')->request_sudo('midcom.helper.datamanager2');
     $invoice = new org_openpsa_invoices_invoice_dba();
     $invoice_parameters = array('number' => $invoice->generate_invoice_number());
     $invoice = $this->create_object('org_openpsa_invoices_invoice_dba', $invoice_parameters);
     $request = array('component' => 'org.openpsa.invoices', 'class' => 'org_openpsa_invoices_invoice_dba', 'id_field' => 'id', 'searchfields' => array('number'), 'titlefield' => 'number', 'result_headers' => array(array('title' => 'number', 'name' => 'number')), 'term' => (string) $invoice->number);
     $handler = new midcom_helper_datamanager2_ajax_autocomplete($request);
     $res = $handler->get_results();
     midcom::get('auth')->drop_sudo();
     $this->assertEquals(1, sizeof($res));
     $this->assertEquals($res[0]['label'], $invoice->number);
 }
Ejemplo n.º 4
0
 public function get_qb($field = null, $direction = 'ASC')
 {
     $qb = org_openpsa_invoices_invoice_dba::new_collector('metadata.deleted', false);
     if (!is_null($field)) {
         $qb->add_order($field, $direction);
     }
     $this->_add_filters($qb);
     switch ($this->_list_type) {
         case 'paid':
             $qb->add_constraint('paid', '>', 0);
             break;
         case 'unsent':
             $qb->add_constraint('sent', '=', 0);
             break;
         case 'overdue':
             $qb->add_constraint('sent', '>', 0);
             $qb->add_constraint('paid', '=', 0);
             $qb->add_constraint('due', '<=', mktime(0, 0, 0, date('n'), date('j') - 1, date('Y')));
             break;
         case 'open':
             $qb->add_constraint('sent', '>', 0);
             $qb->add_constraint('paid', '=', 0);
             $qb->add_constraint('due', '>', mktime(0, 0, 0, date('n'), date('j') - 1, date('Y')));
             break;
     }
     $qb->add_order('number');
     return $qb;
 }
Ejemplo n.º 5
0
 /**
  * Prepare the indexer client
  */
 public function _on_reindex($topic, $config, &$indexer)
 {
     $qb = org_openpsa_invoices_invoice_dba::new_query_builder();
     $schemadb = midcom_helper_datamanager2_schema::load_database($config->get('schemadb'));
     $indexer = new org_openpsa_invoices_midcom_indexer($topic, $indexer);
     $indexer->add_query('invoices', $qb, $schemadb);
     return $indexer;
 }
Ejemplo n.º 6
0
 public static function get_by_number($number)
 {
     $qb = org_openpsa_invoices_invoice_dba::new_query_builder();
     $qb->add_constraint('number', '=', $number);
     $result = $qb->execute();
     if (count($result) == 1) {
         return $result[0];
     }
     return false;
 }
Ejemplo n.º 7
0
 public function load_schemadb()
 {
     $schemadb = midcom_helper_datamanager2_schema::load_database($this->_config->get('schemadb_billing_data'));
     $fields =& $schemadb[$this->get_schema_name()]->fields;
     // Fill VAT select
     $vat_array = explode(',', $this->_config->get('vat_percentages'));
     if (is_array($vat_array) && count($vat_array) > 0) {
         $vat_values = array();
         foreach ($vat_array as $vat) {
             $vat_values[$vat] = "{$vat}%";
         }
         $fields['vat']['type_config']['options'] = $vat_values;
     }
     $dummy_invoice = new org_openpsa_invoices_invoice_dba();
     //set the defaults for vat & due to the schema
     $fields['due']['default'] = $dummy_invoice->get_default('due');
     $fields['vat']['default'] = $dummy_invoice->get_default('vat');
     unset($dummy_invoice);
     return $schemadb;
 }
Ejemplo n.º 8
0
 private function _get_deliverable_invoices($id)
 {
     $mc = org_openpsa_invoices_invoice_item_dba::new_collector('deliverable', $id);
     $ids = $mc->get_values('invoice');
     if (sizeof($ids) < 1) {
         return array();
     }
     $qb = org_openpsa_invoices_invoice_dba::new_query_builder();
     $qb->add_constraint('id', 'IN', $ids);
     $qb->add_constraint('sent', '>=', $this->_request_data['start']);
     $qb->add_constraint('sent', '<=', $this->_request_data['end']);
     return $qb->execute();
 }
Ejemplo n.º 9
0
 /**
  * @param mixed $handler_id The ID of the handler.
  * @param Array $args The argument list.
  * @param Array &$data The local request data.
  */
 public function _handler_goto($handler_id, array $args, array &$data)
 {
     if (!isset($_GET['query'])) {
         $MessageContent = sprintf($this->_l10n->get('no invoice number was handed over'), $this->_l10n->get($_GET['query']));
         midcom::get('uimessages')->add($this->_l10n->get('invoice was not found'), $MessageContent, 'info');
         return new midcom_response_relocate('');
     }
     $invoicenumber = (int) $_GET['query'];
     if ($invoice = org_openpsa_invoices_invoice_dba::get_by_number($invoicenumber)) {
         return new midcom_response_relocate('invoice/' . $invoice->guid . '/');
     }
     $MessageContent = sprintf($this->_l10n->get('there is no invoice with number %s'), $this->_l10n->get($invoicenumber));
     midcom::get('uimessages')->add($this->_l10n->get('invoice was not found'), $MessageContent, 'info');
     return new midcom_response_relocate('');
 }
Ejemplo n.º 10
0
 public function testGenerate_invoice_number()
 {
     $qb = org_openpsa_invoices_invoice_dba::new_query_builder();
     $qb->add_order('number', 'DESC');
     $qb->set_limit(1);
     midcom::get('auth')->request_sudo('org.openpsa.invoices');
     $last_invoice = $qb->execute_unchecked();
     midcom::get('auth')->drop_sudo();
     if (count($last_invoice) == 0) {
         $previous = 0;
     } else {
         $previous = $last_invoice[0]->number;
     }
     $calculator = new org_openpsa_sales_calculator_default();
     $exp = $previous + 1;
     $stat = $calculator->generate_invoice_number();
     $this->assertEquals($exp, $stat);
 }
Ejemplo n.º 11
0
 public function add_next_previous($object, $toolbar, $urlprefix)
 {
     if ($object->number > 1) {
         $qb = org_openpsa_invoices_invoice_dba::new_query_builder();
         $qb->add_constraint('number', '<', $object->number);
         $qb->set_limit(1);
         $qb->add_order('number', 'DESC');
         $results = $qb->execute();
         if (sizeof($results) == 1) {
             $toolbar->add_item(array(MIDCOM_TOOLBAR_URL => $urlprefix . $results[0]->guid . '/', MIDCOM_TOOLBAR_LABEL => $this->_l10n_midcom->get('previous'), MIDCOM_TOOLBAR_ICON => 'stock-icons/16x16/back.png', MIDCOM_TOOLBAR_ACCESSKEY => 'p'));
         }
     }
     if ($object->number + 1 < $object->generate_invoice_number()) {
         $qb = org_openpsa_invoices_invoice_dba::new_query_builder();
         $qb->add_constraint('number', '>', $object->number);
         $qb->set_limit(1);
         $qb->add_order('number', 'ASC');
         $results = $qb->execute();
         if (sizeof($results) == 1) {
             $toolbar->add_item(array(MIDCOM_TOOLBAR_URL => $urlprefix . $results[0]->guid . '/', MIDCOM_TOOLBAR_LABEL => $this->_l10n_midcom->get('next'), MIDCOM_TOOLBAR_ICON => 'stock-icons/16x16/next.png', MIDCOM_TOOLBAR_ACCESSKEY => 'n'));
         }
     }
 }
Ejemplo n.º 12
0
 private function _generate_invoice()
 {
     $invoice = new org_openpsa_invoices_invoice_dba();
     $invoice->customer = (int) $_POST['org_openpsa_invoices_invoice_customer'];
     $invoice->number = $invoice->generate_invoice_number();
     $invoice->owner = midcom_connection::get_user();
     $invoice->vat = $invoice->get_default('vat');
     $invoice->description = $invoice->get_default('remarks');
     if (!$invoice->create()) {
         midcom::get('uimessages')->add($this->_l10n->get('org.openpsa.invoices'), $this->_l10n->get('failed to create invoice, reason ') . midcom_connection::get_error_string(), 'error');
         return false;
     }
     // create invoice_items
     foreach ($_POST['org_openpsa_invoices_invoice_tasks'] as $task_id => $invoiceable) {
         if (!$invoiceable) {
             continue;
         }
         $task = $this->_tasks[$task_id];
         //instance the invoice_items
         $item = new org_openpsa_invoices_invoice_item_dba();
         $item->task = $task_id;
         try {
             $deliverable = org_openpsa_sales_salesproject_deliverable_dba::get_cached($task->agreement);
             $item->deliverable = $deliverable->id;
         } catch (midcom_error $e) {
             $e->log();
         }
         $item->invoice = $invoice->id;
         $item->description = $task->title;
         $item->pricePerUnit = (double) $_POST['org_openpsa_invoices_invoice_tasks_price'][$task_id];
         $item->units = (double) $_POST['org_openpsa_invoices_invoice_tasks_units'][$task_id];
         $item->create();
         // Connect invoice to the tasks involved
         org_openpsa_projects_workflow::mark_invoiced($task, $invoice);
     }
     // Generate "Send invoice" task
     $invoice_sender_guid = $this->_config->get('invoice_sender');
     if (!empty($invoice_sender_guid)) {
         $invoice->generate_invoicing_task($invoice_sender_guid);
     }
     midcom::get('uimessages')->add($this->_l10n->get('org.openpsa.invoices'), sprintf($this->_l10n->get('invoice %s created'), $invoice->get_label()), 'ok');
     midcom::get()->relocate("invoice/edit/{$invoice->guid}/");
     // This will exit
 }
Ejemplo n.º 13
0
 public static function render_and_attach_pdf(org_openpsa_invoices_invoice_dba $invoice)
 {
     if ($invoice->date == 0 || $invoice->deliverydate == 0) {
         $time = time();
         if ($invoice->date == 0) {
             $invoice->date = $time;
         }
         if ($invoice->deliverydate == 0) {
             $invoice->deliverydate = $time;
         }
         $invoice->update();
     }
     // renders the pdf and attaches it to the invoice
     $client_class = midcom_baseclasses_components_configuration::get('org.openpsa.invoices', 'config')->get('invoice_pdfbuilder_class');
     if (!class_exists($client_class)) {
         debug_add('Could not find PDF renderer, aborting silently', MIDCOM_LOG_INFO);
         return false;
     }
     $pdf_builder = new $client_class($invoice);
     // tmp filename
     $tmp_dir = $GLOBALS["midcom_config"]["midcom_tempdir"];
     $title = str_replace("#", "", $invoice->get_label());
     $tmp_file = $tmp_dir . "/" . $title . ".pdf";
     // render pdf to tmp filename
     $render = $pdf_builder->render($tmp_file);
     // cleanup old attachments
     $pdf_files = org_openpsa_helpers::get_attachment_urls($invoice, "pdf_file");
     if (count($pdf_files) > 0) {
         foreach ($pdf_files as $guid => $url) {
             $attachment = new midcom_db_attachment($guid);
             $attachment->delete();
         }
     }
     $attachment = $invoice->create_attachment($title . '.pdf', $title, "application/pdf");
     if (!$attachment) {
         debug_add("Failed to create invoice attachment for pdf", MIDCOM_LOG_ERROR);
         return false;
     }
     $copy = $attachment->copy_from_file($tmp_file);
     if (!$copy) {
         debug_add("Failed to copy pdf from " . $tmp_file . " to attachment", MIDCOM_LOG_ERROR);
         return false;
     }
     // set parameter for datamanager to find the pdf
     if (!$invoice->set_parameter("midcom.helper.datamanager2.type.blobs", "guids_pdf_file", $attachment->guid . ":" . $attachment->guid) || !$attachment->set_parameter('org.openpsa.invoices', 'auto_generated', md5_file($tmp_file))) {
         debug_add("Failed to create attachment parameters, last midgard error was: " . midcom_connection::get_error_string(), MIDCOM_LOG_ERROR);
         return false;
     }
     return true;
 }
Ejemplo n.º 14
0
 /**
  * helper function - contains code to mark invoice as sent,
  * maybe move it to invoice-class ?
  *
  * @param org_openpsa_invoices_invoice_dba $invoice contains invoice
  */
 private function _mark_as_sent(org_openpsa_invoices_invoice_dba $invoice)
 {
     if (!$invoice->sent) {
         $invoice->sent = time();
         if ($invoice->update()) {
             $this->_request_data['message']['message'] = sprintf($this->_l10n->get('marked invoice %s sent'), $invoice->get_label());
         } else {
             $this->_request_data['message']['message'] = sprintf($this->_l10n->get('could not mark invoice %s paid'), $invoice->get_label());
             return false;
         }
         $mc = new org_openpsa_relatedto_collector($invoice->guid, 'org_openpsa_projects_task_dba');
         $tasks = $mc->get_related_objects();
         // Close "Send invoice" task
         foreach ($tasks as $task) {
             if (org_openpsa_projects_workflow::complete($task) && !isset($args["no_redirect"])) {
                 midcom::get('uimessages')->add($this->_l10n->get('org.openpsa.invoices'), sprintf($this->_l10n->get('marked task "%s" finished'), $task->title), 'ok');
             }
         }
     }
     return true;
 }
Ejemplo n.º 15
0
        $relatedto->delete();
    }
}
$deliverable_qb = org_openpsa_sales_salesproject_deliverable_dba::new_query_builder();
$deliverables = $deliverable_qb->execute();
foreach ($deliverables as $deliverable) {
    $relatedto_qb = org_openpsa_relatedto_dba::new_query_builder();
    $relatedto_qb->add_constraint('toGuid', '=', $deliverable->guid);
    $relatedto_qb->add_constraint('fromClass', '=', 'org_openpsa_invoices_invoice_dba');
    $relatedtos = $relatedto_qb->execute();
    if (sizeof($relatedtos) == 0) {
        echo "Deliverable " . $deliverable->title . " has no invoice relatedtos, skipping\n";
        flush();
    }
    foreach ($relatedtos as $relatedto) {
        $invoice = new org_openpsa_invoices_invoice_dba($relatedto->fromGuid);
        $items = $invoice->get_invoice_items();
        if (sizeof($items) == 0) {
            echo "Invoice " . $invoice->get_label() . " has no items, creating one for deliverable\n";
            flush();
            $item = new org_openpsa_invoices_invoice_item_dba();
            $item->invoice = $invoice->id;
            $item->deliverable = $deliverable->id;
            $item->pricePerUnit = $invoice->sum;
            $item->units = 1;
            $item->description = $deliverable->title . ' (auto-generated)';
            $item->create();
        } else {
            $found = false;
            foreach ($items as $item) {
                if ($item->deliverable == $deliverable->id) {
Ejemplo n.º 16
0
 private function _create_invoice($cycle_number = null)
 {
     $salesproject = new org_openpsa_sales_salesproject_dba($this->_deliverable->salesproject);
     $invoice = new org_openpsa_invoices_invoice_dba();
     $invoice->customer = $salesproject->customer;
     $invoice->customerContact = $salesproject->customerContact;
     $invoice->number = $invoice->generate_invoice_number();
     $invoice->owner = $salesproject->owner;
     $invoice->vat = $invoice->get_default('vat');
     $invoice->description = $invoice->get_default('remarks');
     if ($invoice->create()) {
         // Register the cycle number for reporting purposes
         if (!is_null($cycle_number)) {
             $invoice->parameter('org.openpsa.sales', 'cycle_number', $cycle_number);
         }
         return $invoice;
     } else {
         throw new midcom_error('Failed to create invoice, ' . midcom_connection::get_error_string());
     }
 }
Ejemplo n.º 17
0
 function _load_defaults()
 {
     $this->_defaults['date'] = time();
     $this->_defaults['deliverydate'] = time();
     // Set default due date and copy customer remarks to invoice description
     if (array_key_exists('customer', $this->_request_data)) {
         $dummy = new org_openpsa_invoices_invoice_dba();
         $dummy->customer = $this->_request_data['customer']->id;
         $this->_defaults['vat'] = $dummy->get_default('vat');
         if (is_a($this->_request_data['customer'], 'org_openpsa_contacts_person_dba')) {
             $this->_defaults['customerContact'] = $this->_request_data['customer']->id;
         }
         // we got a customer, set description default
         $this->_defaults['description'] = $dummy->get_default('remarks');
         unset($dummy);
     } else {
         $due_date = $this->_config->get('default_due_days') * 3600 * 24 + time();
         $this->_defaults['due'] = $due_date;
     }
     // Generate invoice number
     $client_class = midcom_baseclasses_components_configuration::get('org.openpsa.sales', 'config')->get('calculator');
     $calculator = new $client_class();
     $this->_defaults['number'] = $calculator->generate_invoice_number();
     $this->_defaults['owner'] = midcom_connection::get_user();
 }
Ejemplo n.º 18
0
 public static function update_invoice(org_openpsa_invoices_invoice_dba $invoice)
 {
     $invoice_sum = self::get_sum(array('invoice' => $invoice->id));
     $invoice_sum = round($invoice_sum, 2);
     if ($invoice_sum != round($invoice->sum, 2)) {
         $invoice->sum = $invoice_sum;
         $invoice->update();
     }
 }
Ejemplo n.º 19
0
 /**
  * Returns identifier number for next invoice
  *
  * @return int invoice number
  */
 public function generate_invoice_number()
 {
     $qb = org_openpsa_invoices_invoice_dba::new_query_builder();
     $qb->add_order('number', 'DESC');
     $qb->set_limit(1);
     midcom::get('auth')->request_sudo('org.openpsa.invoices');
     $last_invoice = $qb->execute_unchecked();
     midcom::get('auth')->drop_sudo();
     if (count($last_invoice) == 0) {
         $previous = 0;
     } else {
         $previous = $last_invoice[0]->number;
     }
     return $previous + 1;
 }
Ejemplo n.º 20
0
}
?>
</div>

<div class="main">
<?php 
$data['datamanager']->display_view(true);
//add tabs
$tabs = array();
$siteconfig = org_openpsa_core_siteconfig::get_instance();
$invoices_url = $siteconfig->get_node_relative_url('org.openpsa.invoices');
$sales_url = $siteconfig->get_node_relative_url('org.openpsa.sales');
//TODO: Check for privileges somehow
$invoices_url = $siteconfig->get_node_relative_url('org.openpsa.invoices');
if ($invoices_url) {
    $qb = org_openpsa_invoices_invoice_dba::new_query_builder();
    $qb->add_constraint('customerContact', '=', $data['person']->id);
    $qb->set_limit(1);
    if ($qb->count() > 0) {
        $tabs[] = array('url' => $invoices_url . "list/customer/all/{$data['person']->guid}/", 'title' => midcom::get('i18n')->get_string('invoices', 'org.openpsa.invoices'));
    }
}
if ($sales_url) {
    $qb = org_openpsa_sales_salesproject_dba::new_query_builder();
    $qb->add_constraint('customerContact', '=', $data['person']->id);
    $qb->set_limit(1);
    if ($qb->count() > 0) {
        $tabs[] = array('url' => $sales_url . "list/customer/{$data['person']->guid}/", 'title' => midcom::get('i18n')->get_string('salesprojects', 'org.openpsa.sales'));
    }
}
org_openpsa_widgets_ui::render_tabs($data['person']->guid, $tabs);
Ejemplo n.º 21
0
 private function _load_invoices($status)
 {
     if ($status == 'scheduled') {
         $siteconfig = org_openpsa_core_siteconfig::get_instance();
         $this->_sales_url = $siteconfig->get_node_full_url('org.openpsa.sales');
         return $this->_get_scheduled_invoices();
     }
     $qb = org_openpsa_invoices_invoice_dba::new_query_builder();
     if ($status != 'unsent') {
         $qb->begin_group('AND');
         $qb->add_constraint($this->_request_data['date_field'], '>=', $this->_request_data['start']);
         $qb->add_constraint($this->_request_data['date_field'], '<', $this->_request_data['end']);
         $qb->end_group();
     }
     if ($this->_request_data['query_data']['resource'] != 'all') {
         $this->_request_data['query_data']['resource_expanded'] = $this->_expand_resource($this->_request_data['query_data']['resource']);
         $qb->add_constraint('owner', 'IN', $this->_request_data['query_data']['resource_expanded']);
     }
     switch ($status) {
         case 'unsent':
             $qb->add_constraint('sent', '=', 0);
             $qb->add_constraint('paid', '=', 0);
             break;
         case 'paid':
             $qb->add_constraint('paid', '>', 0);
             break;
         case 'overdue':
             $qb->add_constraint('sent', '>', 0);
             $qb->add_constraint('due', '<', mktime(0, 0, 0, date('n'), date('j') - 1, date('Y')));
             $qb->add_constraint('paid', '=', 0);
             break;
         case 'open':
             $qb->add_constraint('sent', '>', 0);
             $qb->add_constraint('paid', '=', 0);
             $qb->add_constraint('due', '>', mktime(0, 0, 0, date('n'), date('j') - 1, date('Y')));
             break;
     }
     $qb->add_order($this->_request_data['date_field'], 'DESC');
     $invoices = $qb->execute();
     return $invoices;
 }