コード例 #1
0
ファイル: SODespatchLine.php プロジェクト: uzerpllp/uzerp
 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;
 }
コード例 #2
0
ファイル: SOrder.php プロジェクト: uzerpllp/uzerp
 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;
 }
コード例 #3
0
 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();
     }
 }
コード例 #4
0
ファイル: SordersController.php プロジェクト: uzerpllp/uzerp
 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));
     }
 }