/**
  *
  * @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);
 }