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; }
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(); } }
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; }