public function save_model($data) { // Used to save Order Header and Order Lines from import or copy of existing $flash = Flash::Instance(); if (empty($data['SOrder']) || empty($data['SOrderLine'])) { $flash->addError('Error trying to save order'); return false; } $errors = array(); $db = DB::Instance(); $db->StartTrans(); $header = $data['SOrder']; $lines_data = DataObjectCollection::joinArray($data['SOrderLine'], 0); if (!$lines_data || empty($lines_data)) { $lines_data[] = $data['SOrderLine']; } $order = SOrder::Factory($header, $errors); if (!$order || count($errors) > 0) { $errors[] = 'Order validation failed'; } elseif (!$order->save()) { $errors[] = 'Order creation failed'; } foreach ($lines_data as $line) { $line['order_id'] = $order->{$order->idField}; $orderline = SOrderLine::Factory($order, $line, $errors); if (!$orderline || count($errors) > 0) { $errors[] = 'Order Line validation failed for line ' . $line['line_number']; } elseif (!$orderline->save()) { $errors[] = 'Order Line creation failed for line ' . $line['line_number']; } } if (count($errors) === 0) { if (!$order->save()) { $errors[] = 'Error updating Sales Order totals'; } else { $result = array('internal_id' => $order->{$order->idField}, 'internal_identifier_field' => $order->identifierField, 'internal_identifier_value' => $order->getidentifierValue()); } } if (count($errors) > 0) { $flash->addErrors($errors); $db->FailTrans(); $result = false; } $db->CompleteTrans(); return $result; }
public function saveselectedproducts() { if (!isset($this->_data['cancelform']) && !$this->checkParams($this->modeltype)) { sendBack(); } $errors = array(); $flash = Flash::Instance(); if (isset($this->_data['cancelform'])) { unset($_SESSION['selectedproducts']); sendBack(); } $selectedproducts = empty($_SESSION['selectedproducts']) ? array() : $_SESSION['selectedproducts']; if (empty($selectedproducts)) { $flash->addError('No products selected - order not created'); sendBack(); } $productlines = new SOProductLineCollection(DataObjectFactory::Factory('SOProductLine')); $sh = new SearchHandler($productlines, false); $sh->addConstraint(new Constraint('id', 'in', '(' . implode(',', array_keys($selectedproducts)) . ')')); $productlines->load($sh); $db = DB::Instance(); $db->StartTrans(); $header = $this->_data[$this->modeltype]; $header['type'] = 'O'; $trans_type = 'Sales Order'; // Check the Customer $customer = DataObjectFactory::Factory('SLCustomer'); $customer->load($header['slmaster_id']); if ($customer) { $header['currency_id'] = $customer->currency_id; $header['payment_term_id'] = $customer->payment_term_id; $header['tax_status_id'] = $customer->tax_status_id; $deliveryAddresses = $customer->getDeliveryAddresses(); $header['del_address_id'] = key($deliveryAddresses); $invoiceAddresses = $customer->getInvoiceAddresses(); $header['inv_address_id'] = key($invoiceAddresses); $header['despatch_action'] = $customer->despatch_action; } else { $errors[] = 'Cannot find Customer'; } if ($customer->accountStopped()) { $flash->addWarning('Customer Account on Stop'); } $header['despatch_date'] = $header['due_date'] = $header['order_date'] = date(DATE_FORMAT); $header['net_value'] = 0; $lines_data = array(); foreach ($productlines as $productline) { $line = array(); $line['productline_id'] = $productline->id; $line['revised_qty'] = $line['os_qty'] = $line['order_qty'] = $this->_data['qty'][$productline->id]; $line['price'] = $productline->price; $line['currency_id'] = $productline->currency_id; $line['glaccount_id'] = $productline->glaccount_id; $line['glcentre_id'] = $productline->glcentre_id; $line['stitem_id'] = $productline->product_detail->stitem_id; $line['stuom_id'] = $productline->product_detail->stuom_id; $line['item_description'] = $productline->product_detail->stitem; $line['description'] = $productline->product_detail->description; $line['tax_rate_id'] = $productline->product_detail->tax_rate_id; $line['net_value'] = bcmul($line['order_qty'], $line['price']); $lines_data[] = $line; $header['net_value'] = bcadd($header['net_value'], $line['net_value']); } $order = SOrder::Factory($header, $errors); if ($order && count($errors) === 0) { $result = $order->save(); } else { $result = false; } if ($result) { foreach ($lines_data as $line_data) { $orderline = SOrderLine::Factory($order, $line_data, $errors); if ($orderline) { $result = $orderline->save(); } else { $result = false; } if (count($errors) > 0 || $result === false) { $errors[] = 'Error saving Sales Order Line '; break; } } } if ($result !== false && $db->CompleteTrans()) { unset($_SESSION['selectedproducts']); $flash->addMessage($trans_type . ' created successfully'); sendTo($this->name, 'edit', $this->_modules, array('id' => $order->id)); } $flash->addError('Error saving ' . $trans_type); $db->FailTrans(); $db->completeTrans(); $flash->addErrors($errors); $this->view->set('page_title', $this->getPageName('', 'Select Products for')); $this->refresh(); }