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(); }
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(); }
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); }
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; }
/** * 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; }
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; }
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; }
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(); }
/** * @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(''); }
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); }
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')); } } }
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 }
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; }
/** * 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; }
$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) {
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()); } }
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(); }
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(); } }
/** * 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; }
} ?> </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);
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; }