public function testCRUD() { midcom::get('auth')->request_sudo('org.openpsa.invoices'); $item = new org_openpsa_invoices_invoice_item_dba(); $item->invoice = self::$_invoice->id; $item->deliverable = self::$_deliverable->id; $item->pricePerUnit = 100; $item->units = 2.5; $stat = $item->create(); $this->assertTrue($stat); $this->register_object($item); $parent = $item->get_parent(); $this->assertEquals($parent->guid, self::$_invoice->guid); self::$_invoice->refresh(); self::$_deliverable->refresh(); $this->assertEquals(self::$_invoice->sum, 250); $this->assertEquals(self::$_deliverable->invoiced, 250); $this->assertEquals(self::$_deliverable->state, org_openpsa_sales_salesproject_deliverable_dba::STATUS_INVOICED); $item->units = 3.5; $stat = $item->update(); $this->assertTrue($stat); self::$_invoice->refresh(); self::$_deliverable->refresh(); $this->assertEquals(self::$_invoice->sum, 350); $this->assertEquals(self::$_deliverable->invoiced, 350); $stat = $item->delete(); $this->assertTrue($stat); self::$_invoice->refresh(); self::$_deliverable->refresh(); $this->assertEquals(self::$_invoice->sum, 0); $this->assertEquals(self::$_deliverable->invoiced, 0); midcom::get('auth')->drop_sudo(); }
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 }
/** * @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_itemedit($handler_id, array $args, array &$data) { $this->_verify_post_data(); $invoice = new org_openpsa_invoices_invoice_dba($args[0]); midcom::get()->skip_page_style = true; switch ($_POST['oper']) { case 'edit': if (strpos($_POST['id'], 'new_') === 0) { $item = new org_openpsa_invoices_invoice_item_dba(); $item->invoice = $invoice->id; $item->create(); } else { $item = new org_openpsa_invoices_invoice_item_dba((int) $_POST['id']); } $item->units = (double) str_replace(',', '.', $_POST['quantity']); $item->pricePerUnit = (double) str_replace(',', '.', $_POST['price']); $item->description = $_POST['description']; if (!$item->update()) { throw new midcom_error('Failed to update item: ' . midcom_connection::get_error_string()); } break; case 'del': $item = new org_openpsa_invoices_invoice_item_dba((int) $_POST['id']); if (!$item->delete()) { throw new midcom_error('Failed to delete item: ' . midcom_connection::get_error_string()); } break; default: throw new midcom_error('Invalid operation "' . $_POST['oper'] . '"'); } $data['saved_values'] = array('id' => $item->id, 'quantity' => $item->units, 'price' => $item->pricePerUnit, 'description' => $item->description, 'position' => $item->position, 'oldid' => $_POST['id']); }
flush(); $found = true; break; } } } if (!$found) { echo "Could not identify invoice item for deliverable " . $deliverable->title . " on invoice " . $invoice->get_label() . ", creating empty item\n"; flush(); $item = new org_openpsa_invoices_invoice_item_dba(); $item->invoice = $invoice->id; $item->deliverable = $deliverable->id; $item->pricePerUnit = 0; $item->units = 1; $item->description = $deliverable->title . ' (auto-generated)'; $item->create(); } } $relatedto->delete(); } } $qb_items = org_openpsa_invoices_invoice_item_dba::new_query_builder(); $qb_items->add_constraint('task', '>', 0); $qb_items->add_constraint('deliverable', '=', 0); $items = $qb_items->execute(); foreach ($items as $item) { try { $task = new org_openpsa_projects_task_dba($item->task); } catch (midcom_error $e) { echo 'Failed to load task #' . $item->task . ': ' . $e->getMessage() . ", skipping\n"; flush();
/** * Helper function to get invoice_item for the passed task id, if there is no item * it will return a new created one */ private function _probe_invoice_item_for_task($task_id) { //check if there is already an invoice_item for this task $qb_invoice_item = org_openpsa_invoices_invoice_item_dba::new_query_builder(); $qb_invoice_item->add_constraint('invoice', '=', $this->id); $qb_invoice_item->add_constraint('task', '=', $task_id); $invoice_items = $qb_invoice_item->execute(); if (count($invoice_items) == 1) { $invoice_item = $invoice_items[0]; } else { if (count($invoice_items) > 1) { debug_add('More than one item found for task #' . $task_id . ', only returning the first', MIDCOM_LOG_INFO); $invoice_item = $invoice_items[0]; } else { $invoice_item = new org_openpsa_invoices_invoice_item_dba(); $invoice_item->task = $task_id; $invoice_item->invoice = $this->id; $invoice_item->create(); } } return $invoice_item; }