/** * * @param unknown $sender * @param unknown $params */ public function updateOrder($sender, $params) { $results = $errors = array(); try { Dao::beginTransaction(); if (!isset($params->CallbackParameter->order) || !($order = Order::getByOrderNo($params->CallbackParameter->order->orderNo)) instanceof Order) { throw new Exception('System Error: invalid order passed in!'); } if (!isset($params->CallbackParameter->for) || ($for = trim($params->CallbackParameter->for)) === '') { throw new Exception('System Error: invalid for passed in!'); } $notifyCustomer = isset($params->CallbackParameter->notifyCustomer) && intval($params->CallbackParameter->notifyCustomer) === 1 ? true : false; if (!$order->canEditBy(Core::getRole())) { throw new Exception('You do NOT edit this order as ' . Core::getRole() . '!'); } $hasETA = false; $allPicked = true; $commentType = $for === Comments::TYPE_PURCHASING ? Comments::TYPE_PURCHASING : Comments::TYPE_WAREHOUSE; $emailBody['productUpdate'] = '<table border="1" style="width:100%">'; foreach ($params->CallbackParameter->items as $orderItemId => $obj) { if (!($orderItem = OrderItem::get($orderItemId)) instanceof OrderItem) { throw new Exception("System Error: invalid order item(ID=" . $orderItemId . ')'); } $commentString = ""; $sku = $orderItem->getProduct()->getSku(); $comments = isset($obj->comments) ? trim($obj->comments) : ''; if ($for === Comments::TYPE_PURCHASING) { if (($hasStock = trim($obj->hasStock) === '1' ? true : false) === true) { $orderItem->setIsOrdered(false); $orderItem->setEta(trim(UDate::zeroDate())); $commentString = 'product(SKU=' . $sku . ') marked as in stock'; $emailBody['productUpdate'] .= '<tr>' . '<td>' . $sku . '</td>' . '<td>' . $orderItem->getProduct()->getName() . '</td>' . '<td>' . 'In Stock' . '</td>'; } else { $timeZone = trim(SystemSettings::getSettings(SystemSettings::TYPE_SYSTEM_TIMEZONE)); $now = new UDate('now', $timeZone); if (!($eta = new UDate(trim($obj->eta), $timeZone)) instanceof UDate) { throw new Exception('ETA(=' . trim($obj->eta) . ') is invalid.'); } if ($eta->beforeOrEqualTo($now)) { throw new Exception('ETA can NOT be before now(=' . trim($now) . ').'); } $orderItem->setIsOrdered(trim($obj->hasStock) === '1'); $orderItem->setEta(trim($eta)); $orderItem->setIsOrdered(trim($obj->isOrdered) === '1'); if ($comments !== '') { $commentString = 'Added ETA[' . $eta . '] for product(SKU=' . $sku . '): ' . $comments; $emailBody['productUpdate'] .= '<tr>' . '<td>' . $sku . '</td>' . '<td>' . $orderItem->getProduct()->getName() . '</td>' . '<td>' . 'ETA: ' . $eta->format('d/M/Y') . '</td>'; } $hasETA = true; } $orderItem->setIsPicked(false); } else { if ($for === Comments::TYPE_WAREHOUSE) { $picked = trim($obj->isPicked) === '1' ? true : false; $orderItem->setIsPicked($picked); $commentString = ($picked ? '' : 'NOT ') . 'Picked product(SKU=' . $sku . '): ' . $comments; $emailBody['productUpdate'] .= '<tr>' . '<td>' . $sku . '</td>' . '<td>' . $orderItem->getProduct()->getName() . '</td>' . '<td>' . $picked ? 'Picked by Warehouse' : '' . '</td>'; if ($picked === true) { $orderItem->setIsOrdered(false); $orderItem->setEta(trim(UDate::zeroDate())); } else { $orderItem->setEta(''); $allPicked = false; } $orderItem->reCalMarginFromProduct()->resetCostNMarginFromKits(); } } $emailBody['productUpdate'] .= '</table>'; $commentString .= $notifyCustomer === true ? ' [NOTIFICATION SENT TO CUSTOMER]' : ''; $order->addComment($commentString, $commentType); $orderItem->addComment($commentString, $commentType)->save(); } //push the status of the order $status = trim($order->getStatus()); if ($for === Comments::TYPE_PURCHASING) { if ($hasETA === true) { $order->setStatus(OrderStatus::get(OrderStatus::ID_ETA)); } else { $order->setStatus(OrderStatus::get(OrderStatus::ID_STOCK_CHECKED_BY_PURCHASING)); } $order->addComment('Changed from [' . $status . '] to [' . $order->getStatus() . ']', Comments::TYPE_SYSTEM); $emailBody['orderUpdate'] = 'Order status changed from [' . $status . '] to [' . $order->getStatus() . ']'; } else { if ($for === Comments::TYPE_WAREHOUSE) { if ($allPicked === true) { $order->setStatus(OrderStatus::get(OrderStatus::ID_PICKED)); } else { $order->setStatus(OrderStatus::get(OrderStatus::ID_INSUFFICIENT_STOCK)); } $order->addComment('Changed from [' . $status . '] to [' . $order->getStatus() . ']', Comments::TYPE_SYSTEM); $emailBody['orderUpdate'] = 'Order status changed from [' . $status . '] to [' . $order->getStatus() . ']'; } } $order->save(); //notify customer if ($notifyCustomer === true && $order->getIsFromB2B() === true) { $notificationMsg = trim(OrderNotificationTemplateControl::getMessage($order->getStatus()->getName(), $order)); if ($notificationMsg !== '') { B2BConnector::getConnector(B2BConnector::CONNECTOR_TYPE_ORDER, SystemSettings::getSettings(SystemSettings::TYPE_B2B_SOAP_WSDL), SystemSettings::getSettings(SystemSettings::TYPE_B2B_SOAP_USER), SystemSettings::getSettings(SystemSettings::TYPE_B2B_SOAP_KEY))->changeOrderStatus($order, $order->getStatus()->getMageStatus(), $notificationMsg, true); // $emailTitle = 'Your Order ' . $order->getOrderNo() . ' has been updated'; // // $order->getCustomer()->getEmail() // EmailSender::addEmail('', '*****@*****.**', $emailTitle, $this->_getNotifictionEmail($order, $emailBody, $emailTitle)); // $order->addComment('An email notification has been sent to customer for: ' . $order->getStatus()->getName(), Comments::TYPE_SYSTEM); } } Dao::commitTransaction(); } catch (Exception $ex) { Dao::rollbackTransaction(); $errors[] = $ex->getMessage(); } $params->ResponseData = StringUtilsAbstract::getJson($results, $errors); }