public static function createDespatchNote($data, &$errors = array()) { $db = DB::Instance(); $db->startTrans(); $result = TRUE; foreach ($data as $header) { $generator = new DespatchNoteNumberHandler(); $despatch_number = $generator->handle(new SODespatchLine()); foreach ($header as $line) { $line['despatch_number'] = $despatch_number; $saveline = SODespatchLine::Factory($line, $errors, 'SODespatchLine'); if ($saveline) { $result = $saveline->save(); if (!$result) { $errors[] = $db->ErrorMsg(); break; } } $orderline = new SOrderLine(); $orderline->load($line['orderline_id']); if ($orderline->isLoaded()) { if (!is_null($orderline->delivery_note)) { $errors[] = 'Order line already selected on DN ' . $orderline->delivery_note; break; } elseif ($orderline->status != $orderline->awaitingDespatchStatus() && $orderline->status != $orderline->pickedStatus()) { $errors[] = 'Order line no longer available for despatch'; break; } elseif (!$orderline->update($line['orderline_id'], 'delivery_note', $despatch_number)) { $errors[] = 'Error updating order line'; break; } } else { $errors[] = 'Error loading order line'; break; } } } if (count($errors) > 0) { $db->FailTrans(); $result = FALSE; } $db->completeTrans(); if (count($data) == 1) { return $saveline->id; } return $result; }
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 save() { $flash = Flash::Instance(); $errors = array(); $data = $this->_data['SOrderLine']; if (empty($data['order_id'])) { $errors[] = 'Order header not defined'; } else { $sorder = DataObjectFactory::Factory('SOrder'); $sorder->load($data['order_id']); if (!$sorder->isLoaded()) { $errors[] = 'Cannot find order header'; } elseif ($sorder->isLatest($this->_data['SOrder'], $errors)) { if (isset($data['cancel_line'])) { $data['status'] = $this->_templateobject->cancelStatus(); $data['glaccount_centre_id'] = NULL; } $sorderline = SOrderLine::Factory($sorder, $data, $errors); if ($sorder->due_date < $sorderline->due_delivery_date) { $sorder->due_date = $sorderline->due_delivery_date; } if ($sorder->due_date < $sorderline->due_delivery_date) { $sorder->despatch_date = $sorderline->due_despatch_date; } if ($sorderline && count($errors) == 0) { if (!$sorderline->save($sorder)) { $errors[] = 'Failed to save order line'; } } } } if (count($errors) == 0) { $flash->addMessage($sorder->getFormatted('type') . ' Line Saved'); if (isset($this->_data['saveAnother'])) { $other = array('order_id' => $sorderline->order_id); sendTo($this->name, 'new', $this->_modules, $other); } else { $action = 'view'; $controller = 'sorders'; $other = array('id' => $sorderline->order_id); } sendTo($controller, $action, $this->_modules, $other); } else { $flash->addErrors($errors); $this->_data['id'] = $this->_data['SOrderLine']['id']; $this->_data['order_id'] = $this->_data['SOrderLine']['order_id']; $this->refresh(); } }
public function save_unpick_list() { if (!isset($this->_data) || !$this->loadData()) { $this->dataError(); sendBack(); } $sorder = $this->_uses[$this->modeltype]; $sorder_data = $this->_data[$this->modeltype]; $sorderline_data = $this->_data['SOrderLine']; $flash = Flash::Instance(); $errors = array(); $db = DB::Instance(); $db->startTrans(); // The value of the $sorder_data[to_location_id] is the whtransfer_rule_id // so get the location_ids for the rule_list - note it is the from_location // because we are transferring into the location from which the goods // will be invoiced/despatched $location_ids = $sorder->despatch_from->rules_list('from_whlocation_id'); $next_line_number = $sorder->getNextLineNumber(); if (isset($sorderline_data)) { foreach ($sorderline_data as $key => $value) { if (!isset($value['id'])) { continue; } $sorderline = DataObjectFactory::Factory('SOrderLine'); $sorderline->load($key); if (!$sorderline) { $errors[] = 'Failed to get order line'; break; } if ($sorderline->revised_qty < $value['del_qty']) { $errors[] = 'Trying to unpick more than was picked!'; break; } elseif ($sorderline->revised_qty > $value['del_qty']) { $data = array(); foreach ($sorderline->getFields() as $field) { if ($field->type == 'date' && $field->value != '') { $data[$field->name] = un_fix_date($field->value); } else { $data[$field->name] = $field->value; } } $data['line_number'] = $next_line_number; $next_line_number++; unset($data['id']); $data['status'] = $sorderline->newStatus(); $data['os_qty'] = $data['revised_qty'] = $data['order_qty'] = $value['del_qty']; $data['net_value'] = round(bcmul($data['revised_qty'], $data['price'], 4), 2); $data['twin_currency_id'] = $sorderline->twin_currency_id; $data['twin_rate'] = $sorderline->twin_rate; $data['base_net_value'] = round(bcdiv($data['net_value'], $data['rate'], 4), 2); $data['twin_net_value'] = round(bcmul($data['base_net_value'], $data['twin_rate'], 4), 2); $neworderline = SOrderLine::Factory($sorder, $data, $errors); if (count($errors) > 0 || !$neworderline || !$neworderline->save()) { $errors[] = 'Failed to unpick required amount'; } else { $sorderline->os_qty = $sorderline->order_qty = $sorderline->revised_qty = $sorderline->revised_qty - $value['del_qty']; $sorder->net_value = bcsub($sorder->net_value, $sorderline->net_value); $sorder->base_net_value = bcsub($sorder->base_net_value, $sorderline->base_net_value); $sorder->twin_net_value = bcsub($sorder->twin_net_value, $sorderline->twin_net_value); $sorderline->net_value = round(bcmul($sorderline->revised_qty, $sorderline->price, 4), 2); $sorderline->base_net_value = round(bcdiv($sorderline->net_value, $sorderline->rate, 4), 2); $sorderline->twin_net_value = round(bcmul($sorderline->base_net_value, $sorderline->twin_rate, 4), 2); $sorder->net_value = bcadd($sorder->net_value, $sorderline->net_value); $sorder->base_net_value = bcadd($sorder->base_net_value, $sorderline->base_net_value); $sorder->twin_net_value = bcadd($sorder->twin_net_value, $sorderline->twin_net_value); } } else { // $sorderline->os_qty+=$value['del_qty']; $sorderline->status = $sorderline->newStatus(); } if (!$sorderline->save()) { $errors[] = 'Failed to unpick item '; break; } if (!is_null($sorderline->stitem_id)) { if (!empty($value['whlocation_id']) && !empty($sorder_data['from_location_id'])) { $data = array(); $data['stitem_id'] = $sorderline->stitem_id; $data['qty'] = $value['del_qty']; $data['process_name'] = 'SO'; $data['process_id'] = $sorderline->order_id; $data['whaction_id'] = ''; if ($value['whlocation_id'] == $location_ids[$sorder_data['from_location_id']]) { $errors['whlocation_id'] = 'Cannot transfer from/to the same location'; break; } $data['to_whlocation_id'] = $value['whlocation_id']; $data['from_whlocation_id'] = $location_ids[$sorder_data['from_location_id']]; $models = STTransaction::prepareMove($data, $errors); if (count($errors) == 0) { foreach ($models as $model) { if (!$model || !$model->save($errors)) { $errors[] = 'Error updating stock'; break; } } } } else { $errors[] = 'Cannot move stock - missing location'; } } // Save header to update status/values if (count($errors) == 0 && !$sorder->save()) { $errors[] = 'Failed to unpick item '; break; } } } else { $errors[] = 'No lines confirmed'; } if (count($errors) > 0) { $flash->addErrors($errors); $db->FailTrans(); $db->CompleteTrans(); $this->refresh(); } else { $flash->addMessage('Unpick action successfully completed'); $db->CompleteTrans(); sendTo($this->name, 'view', $this->_modules, array('id' => $sorder->id)); } }