/** * Calculates the prices of deliverables * * and adds them up to the salesproject value */ function calculate_price() { $value = 0; $cost = 0; $deliverable_qb = org_openpsa_sales_salesproject_deliverable_dba::new_query_builder(); $deliverable_qb->add_constraint('salesproject', '=', $this->id); $deliverable_qb->add_constraint('up', '=', 0); $deliverable_qb->add_constraint('state', '<>', org_openpsa_sales_salesproject_deliverable_dba::STATUS_DECLINED); $deliverables = $deliverable_qb->execute(); foreach ($deliverables as $deliverable) { if ($deliverable->orgOpenpsaObtype == org_openpsa_products_product_dba::DELIVERY_SUBSCRIPTION) { $scheduler = new org_openpsa_invoices_scheduler($deliverable); if ($deliverable->end == 0) { // FIXME: Get this from config key 'subscription_profit_months' $cycles = $scheduler->calculate_cycles(12); } else { $cycles = $scheduler->calculate_cycles(); } $value = $value + $deliverable->price * $cycles; $cost = $cost + $deliverable->cost * $cycles; } else { $value = $value + $deliverable->price; $cost = $cost + $deliverable->cost; } } $profit = $value - $cost; if ($this->value != $value || $this->profit != $profit) { $this->value = $value; $this->profit = $value - $cost; $this->update(); } }
public function testHandler_add_create_subscription() { midcom::get('auth')->request_sudo('org.openpsa.sales'); $this->_product->delivery = org_openpsa_products_product_dba::DELIVERY_SUBSCRIPTION; $this->_product->update(); $formdata = array('title' => 'TEST ' . __CLASS__ . '_' . time(), 'continuous' => true, 'start_date' => strftime('%Y-%m-%d')); $url = $this->submit_dm2_form('controller', $formdata, 'org.openpsa.sales', array('deliverable', 'add', $this->_salesproject->guid)); $this->assertEquals('salesproject/' . $this->_salesproject->guid . '/', $url); $qb = org_openpsa_sales_salesproject_deliverable_dba::new_query_builder(); $qb->add_constraint('salesproject', '=', $this->_salesproject->id); $results = $qb->execute(); $this->assertEquals(1, sizeof($results)); $deliverable = $results[0]; $this->register_object($deliverable); $this->assertEquals(org_openpsa_products_product_dba::DELIVERY_SUBSCRIPTION, $deliverable->orgOpenpsaObtype); midcom::get('auth')->drop_sudo(); }
/** * Helper that lists all deliverables belonging to the current project */ private function _list_deliverables() { $qb = org_openpsa_sales_salesproject_deliverable_dba::new_query_builder(); $qb->add_constraint('salesproject', '=', $this->_salesproject->id); $qb->add_constraint('up', '=', 0); if ($this->_salesproject->status != org_openpsa_sales_salesproject_dba::STATUS_LOST) { $qb->add_constraint('state', '<>', org_openpsa_sales_salesproject_deliverable_dba::STATUS_DECLINED); } $qb->add_order('state'); $qb->add_order('metadata.created', 'DESC'); $deliverables = $qb->execute(); foreach ($deliverables as $deliverable) { $this->_controllers[$deliverable->id] = midcom_helper_datamanager2_controller::create('ajax'); $this->_controllers[$deliverable->id]->schemadb =& $this->_request_data['schemadb_salesproject_deliverable']; $this->_controllers[$deliverable->id]->set_storage($deliverable); $this->_controllers[$deliverable->id]->process_ajax(); $this->_request_data['deliverables_objects'][$deliverable->guid] = $deliverable; } }
echo "Could not identify invoice item for task " . $task->get_label() . " on invoice " . $invoice->get_label() . ", creating empty item\n"; flush(); $item = new org_openpsa_invoices_invoice_item_dba(); $item->invoice = $invoice->id; $item->task = $task->id; $item->deliverable = $task->agreement; $item->pricePerUnit = 0; $item->units = 1; $item->description = $task->title . ' (auto-generated)'; $item->create(); } } $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";
function decline() { if ($this->state >= org_openpsa_sales_salesproject_deliverable_dba::STATUS_DECLINED) { return false; } $this->state = org_openpsa_sales_salesproject_deliverable_dba::STATUS_DECLINED; if ($this->update()) { // Update sales project if it doesn't have any open deliverables $qb = org_openpsa_sales_salesproject_deliverable_dba::new_query_builder(); $qb->add_constraint('salesproject', '=', $this->salesproject); $qb->add_constraint('state', '<>', org_openpsa_sales_salesproject_deliverable_dba::STATUS_DECLINED); if ($qb->count() == 0) { // No proposals that are not declined $salesproject = new org_openpsa_sales_salesproject_dba($this->salesproject); $salesproject->status = org_openpsa_sales_salesproject_dba::STATUS_LOST; $salesproject->update(); } return true; } return false; }