Ejemplo n.º 1
0
 public static function salesInvoices($search_data = null, &$errors, $defaults = null)
 {
     $search = new ProjectcostchargeSearch($defaults);
     $search->addSearchField('project_id', 'project_id', 'hidden', '', 'hidden', false);
     $search->addSearchField('slmaster_id', 'Customer', 'hidden', '', 'hidden');
     $search->addSearchField('invoice_id', 'Invoices', 'select');
     $unassigned_list = new SInvoiceLine();
     $unassigned_list->idField = 'invoice_id';
     $unassigned_list->identifierField = 'invoice_number';
     $cc = new ConstraintChain();
     $subquery = "select item_id from project_costs_charges where item_type='SI'";
     $cc->add(new Constraint('id', 'not in', '(' . $subquery . ')'));
     if (isset($search_data['slmaster_id'])) {
         $slmaster_id = $search_data['slmaster_id'];
     } elseif (isset($defaults['slmaster_id'])) {
         $slmaster_id = $defaults['slmaster_id'];
     }
     $cc->add(new Constraint('slmaster_id', '=', $slmaster_id));
     $search->setOptions('invoice_id', $unassigned_list->getAll($cc, false, true));
     $search->setSearchData($search_data, $errors);
     return $search;
 }
Ejemplo n.º 2
0
 public function save_model($data)
 {
     // Used to save Invoice Header and Invoice Lines from import or copy of existing
     $flash = Flash::Instance();
     if (empty($data['SInvoice']) || empty($data['SInvoiceLine'])) {
         $flash->addError('Error trying to save invoice');
         return false;
     }
     $errors = array();
     $db = DB::Instance();
     $db->StartTrans();
     $header = $data['SInvoice'];
     $lines_data = DataObjectCollection::joinArray($data['SInvoiceLine'], 0);
     if (!$lines_data || empty($lines_data)) {
         $lines_data[] = $data['SInvoiceLine'];
     }
     $invoice = SInvoice::Factory($header, $errors);
     if (!$invoice || count($errors) > 0) {
         $errors[] = 'Invoice validation failed';
     } elseif (!$invoice->save()) {
         $errors[] = 'Invoice creation failed';
     }
     if ($invoice) {
         foreach ($lines_data as $line) {
             $line['invoice_id'] = $invoice->{$invoice->idField};
             $invoiceline = SInvoiceLine::Factory($invoice, $line, $errors);
             if (!$invoiceline || count($errors) > 0) {
                 $errors[] = 'Invoice Line validation failed for line ' . $line['line_number'];
             } elseif (!$invoiceline->save()) {
                 $errors[] = 'Invoice Line creation failed for line ' . $line['line_number'];
             }
         }
     }
     if (count($errors) === 0) {
         if (!$invoice->save()) {
             $errors[] = 'Error updating Invoice totals';
         } else {
             $result = array('internal_id' => $invoice->{$invoice->idField}, 'internal_identifier_field' => $invoice->identifierField, 'internal_identifier_value' => $invoice->getidentifierValue());
         }
     }
     if (count($errors) > 0) {
         $flash->addErrors($errors);
         $db->FailTrans();
         $result = false;
     }
     $db->CompleteTrans();
     return $result;
 }
Ejemplo n.º 3
0
 public function save()
 {
     $flash = Flash::Instance();
     $errors = array();
     $data = $this->_data['SInvoiceLine'];
     if (empty($data['invoice_id'])) {
         $errors[] = 'invoice header not defined';
     } else {
         $sinvoice = DataObjectFactory::Factory('SInvoice');
         if (!$sinvoice->load($data['invoice_id'])) {
             $errors[] = 'Cannot find invoice header';
         } elseif ($sinvoice->isLatest($this->_data['SInvoice'], $errors)) {
             $sinvoiceline = SInvoiceLine::Factory($sinvoice, $data, $errors);
             if ($sinvoiceline && count($errors) == 0) {
                 if (!$sinvoiceline->save($sinvoice)) {
                     $errors[] = 'Failed to save Sales ' . $sinvoice->getFormatted('transaction_type') . ' line';
                 }
             }
         }
     }
     if (count($errors) == 0) {
         $flash->addMessage('Sales ' . $sinvoice->getFormatted('transaction_type') . ' Line Saved');
         if (isset($this->_data['saveAnother'])) {
             $other = array('invoice_id' => $sinvoiceline->invoice_id);
             if (isset($this->_data['dialog'])) {
                 $other += array('dialog' => '');
             }
             if (isset($this->_data['ajax'])) {
                 $other += array('ajax' => '');
             }
             sendTo($this->name, 'new', $this->_modules, $other);
         } else {
             $action = 'view';
             $controller = 'sinvoices';
             $other = array('id' => $sinvoiceline->invoice_id);
         }
         if (isset($this->_data['dialog'])) {
             $link = array('modules' => $this->_modules, 'controller' => $controller, 'action' => $action, 'other' => $other);
             $flash->save();
             echo parent::returnJSONResponse(TRUE, array('redirect' => '/?' . setParamsString($link)));
             exit;
         } else {
             sendTo($controller, $action, $this->_modules, $other);
         }
     } else {
         $flash->addErrors($errors);
         $this->_data['id'] = $this->_data['SInvoiceLine']['id'];
         $this->_data['invoice_id'] = $this->_data['SInvoiceLine']['invoice_id'];
         $this->refresh();
     }
 }
Ejemplo n.º 4
0
 private function createPostInvoice($sorder, &$errors)
 {
     if ($sorder->customerdetails->accountStopped()) {
         $errors[] = 'Cannot create invoice, customer account stopped';
         return FALSE;
     }
     set_time_limit(0);
     $linestatuses = $sorder->getLineStatuses();
     $linestatus = $linestatuses['count'];
     if (!$sorder->someLinesDespatched($linestatus) && !$sorder->someLinesPicked($linestatus)) {
         $errors[] = 'No lines picked or despatched';
         return FALSE;
     }
     $sinvoicelines = array();
     $db = DB::Instance();
     $db->startTrans();
     $sodespatchlines = array();
     $create_sodespatchlines = array();
     $latest_despatch_date = 0;
     $sorderline = DataObjectFactory::Factory('SOrderLine');
     $sorderlines = new SOrderLineCollection($sorderline);
     $sh = new SearchHandler($sorderlines, FALSE);
     $sh->addConstraint(new Constraint('order_id', '=', $sorder->id));
     $statuses = array($db->qstr($sorderline->despatchStatus()), $db->qstr($sorderline->pickedStatus()));
     $sh->addConstraint(new Constraint('status', 'in', '(' . implode(',', $statuses) . ')'));
     $sorderlines->load($sh);
     $sodespatchline = DataObjectFactory::Factory('SODespatchLine');
     foreach ($sorderlines as $sorderline) {
         $sinvoiceline = array();
         $sodespatchlines[$sorderline->id]['id'] = $sorderline->id;
         $sodespatchlines[$sorderline->id]['line_number'] = $sorderline->line_number;
         if ($sorderline->status == $sorderline->pickedStatus()) {
             $sinvoiceline['move_stock'] = 't';
             $sorderline->del_qty = $sorderline->revised_qty;
             $sorderline->actual_despatch_date = fix_date(date(DATE_FORMAT));
             if (!is_null($sorderline->stitem_id)) {
                 $create_sodespatchlines[$sorder->id][$sorderline->id] = SODespatchLine::makeline($sorder, $sorderline, $errors);
                 $create_sodespatchlines[$sorder->id][$sorderline->id]['status'] = $sodespatchline->despatchStatus();
             }
             $sodespatchlines[$sorderline->id]['fields'] = array('status', 'del_qty', 'actual_despatch_date');
             $sodespatchlines[$sorderline->id]['values'] = array($sorderline->invoicedStatus(), $sorderline->del_qty, $sorderline->actual_despatch_date);
         } else {
             $sodespatchlines[$sorderline->id]['fields'] = array('status');
             $sodespatchlines[$sorderline->id]['values'] = array($sorderline->invoicedStatus());
         }
         foreach ($sorderline->getFields() as $key => $value) {
             $sinvoiceline[$key] = $sorderline->{$key};
         }
         foreach ($sorderline->audit_fields as $field) {
             unset($sinvoiceline[$field]);
         }
         if ($sorderline->actual_despatch_date > $latest_despatch_date) {
             $latest_despatch_date = $sorderline->actual_despatch_date;
         }
         $sinvoiceline['sales_order_id'] = $sorderline->order_id;
         $sinvoiceline['order_line_id'] = $sorderline->id;
         $sinvoiceline['sales_qty'] = $sorderline->del_qty;
         $sinvoiceline['sales_price'] = $sorderline->price;
         $sinvoiceline['net_value'] = bcmul($sorderline->price, $sorderline->del_qty);
         $sinvoiceline['glaccount_centre_id'] = null;
         $sinvoiceline['id'] = '';
         $sinvoicelines[] = $sinvoiceline;
     }
     if (count($errors) == 0 && count($create_sodespatchlines) > 0 && !SODespatchLine::createDespatchNote($create_sodespatchlines, $errors)) {
         $errors[] = 'Error creating Despatch Note';
     }
     foreach ($sodespatchlines as $id => $data) {
         $data['fields'][] = 'glaccount_centre_id';
         $data['values'][] = 'null';
         $result = $this->_uses['SOrderLine']->update($id, $data['fields'], $data['values']);
         if (!$result) {
             $errors['id' . $id] = 'Failed to update order line ' . $data['line_number'] . ' : ' . $db->errorMsg();
         }
     }
     if (count($errors) == 0) {
         // Check line statuses and update header status accordingly
         if (!$sorder->save()) {
             $errors[] = 'Failed to update order header ' . $db->ErrorMsg();
         }
     }
     if (count($sinvoicelines) == 0) {
         $errors[] = 'Failed to create invoice lines';
     }
     // Save the Invoice Header if no errors
     if (count($errors) == 0) {
         $sinvoiceheader = array();
         foreach ($sorder->getFields() as $key => $value) {
             $sinvoiceheader[$key] = $sorder->{$key};
         }
         foreach ($sorder->audit_fields as $field) {
             unset($sinvoiceheader[$field]);
         }
         $sinvoiceheader['id'] = '';
         $sinvoiceheader['sales_order_id'] = $sorder->id;
         $sinvoiceheader['sales_order_number'] = $sorder->order_number;
         $sinvoiceheader['despatch_date'] = un_fix_date($latest_despatch_date);
         $sinvoiceheader['transaction_type'] = 'I';
         $sinvoiceheader['invoice_date'] = un_fix_date($latest_despatch_date);
         $sinvoice = SInvoice::Factory($sinvoiceheader, $errors);
         if ($sinvoice) {
             $result = $sinvoice->save();
             if (!$result) {
                 $errors[] = 'Failed to create invoice';
             }
         }
     }
     // Save the Invoice Lines if no errors
     if (count($errors) == 0) {
         $result = FALSE;
         foreach ($sinvoicelines as $line_data) {
             $sinvoiceline = SInvoiceLine::Factory($sinvoice, $line_data, $errors);
             if ($sinvoiceline) {
                 $result = $sinvoiceline->save();
             }
             if (!$result) {
                 $errors[] = 'Failed to create invoice line ' . $db->ErrorMsg();
                 break;
             }
         }
         // Now save the header again to update the totals
         $result = $sinvoice->save();
         if (!$result) {
             $errors[] = 'Failed to update invoice totals';
             $errors[] = $db->ErrorMsg();
         }
     }
     // Post the Invoice if no errors
     if (count($errors) == 0) {
         $result = $sinvoice->post($errors);
         if (!$result) {
             $errors[] = 'Failed to post invoice';
         }
         foreach ($sodespatchlines as $id => $data) {
             $sodespatchlines = new SODespatchLineCollection($sodespatchline);
             $sh = new SearchHandler($sodespatchlines, FALSE);
             $sh->addConstraint(new Constraint('orderline_id', '=', $id));
             $sh->addConstraint(new Constraint('status', '=', $sodespatchline->despatchStatus()));
             $sh->addConstraint(new Constraint('invoice_id', 'is', 'NULL'));
             if ($sodespatchlines->update(array('invoice_id', 'invoice_number'), array($sinvoice->id, $sinvoice->invoice_number), $sh) === false) {
                 $errors[] = 'Error updating despatch lines : ' . $db->ErrorMsg();
             }
         }
     }
     if (count($errors) > 0) {
         $db->FailTrans();
         $result = FALSE;
     } else {
         // Everything is OK so return the newly created Invoice object
         $result = $sinvoice;
     }
     $db->CompleteTrans();
     return $result;
 }