/**
  * Queue a shipment for net suite
  *
  * @param OrderShipment $Model
  * @param null $priority
  * @param null $delay
  * @param $id
  * @param array $payload
  * @return bool
  */
 public function queueForNetSuite(OrderShipment $Model, $priority = null, $delay = null, $id = null, $payload = [])
 {
     if (empty($id)) {
         $id = $Model->id;
     }
     if ($delay != null) {
         $this->delay_seconds = $delay;
     }
     /**
      * Queue Order in SQS for post purchase modifications
      */
     if (Sqs::useQueue()) {
         /**
          * Queue For NetSuite
          */
         $sqs = new Sqs(Sqs::queueUrl('ns_export_shipments_queue'));
         $sqs->sendJSON(['id' => $id, 'name' => 'Shipment', 'delay_seconds' => $this->delay_seconds, 'payload' => $payload, 'timeout' => 30.0, 'created' => date("Y-m-d H:i:s")], $this->delay_seconds, $priority);
     }
     return $Model->saveField('order_shipment_status_id', OrderShipmentStatus::PROCESSING);
 }
 /**
  * Close a shipment
  *
  * @param OrderShipment $Model
  * @param null $id
  * @param null $snap_shipment
  * @param null $date_created
  * @return bool
  * @throws Exception
  */
 public function closeShipment(OrderShipment $Model, $id = null, $snap_shipment = null, $date_created = null)
 {
     if (empty($id)) {
         $id = $Model->id;
     }
     if (empty($snap_shipment)) {
         throw new Exception('No Snap Shipment');
     }
     $this->User = ClassRegistry::init('User');
     $now = new DateTime();
     $is_backorder = FALSE;
     $charm_order = FALSE;
     $order_shipment = $Model->find('first', ['contain' => ['Order' => ['OrderCustomer' => ['Email']], 'OrderItem'], 'conditions' => ['OrderShipment.id' => $id]]);
     foreach ($order_shipment['OrderShipment']['OrderItem'] as $item) {
         if ($item['order_item_type_id'] == OrderItemType::TYPE_BACK_ORDER) {
             $is_backorder = TRUE;
         }
     }
     if ($order_shipment['Order']['order_type_id'] == Order::TYPE_CHARM) {
         $charm_order = TRUE;
     }
     $shipment_tracking_number = $order_shipment['OrderShipment']['tracking_number'];
     $shipment_date_shipped = $order_shipment['OrderShipment']['date_shipped'];
     /** @noinspection PhpUndefinedFieldInspection */
     $snap_tracking_number = $snap_shipment->CarrierTrackingNumber;
     /** @noinspection PhpUndefinedFieldInspection */
     $snap_shipping_method = $snap_shipment->ShippingMethod;
     /** @noinspection PhpUndefinedFieldInspection */
     $snap_date_closed = $snap_shipment->DateClosed;
     /** @noinspection PhpUndefinedFieldInspection */
     $snap_customer_name = $snap_shipment->CustomerName;
     /** @noinspection PhpUndefinedFieldInspection */
     $snap_order_id = $snap_shipment->CustomerRef;
     $order_status_id = $order_shipment['Order']['order_status_id'];
     $country_id = $order_shipment['OrderShipment']['country_id'];
     $user_id = $order_shipment['Order']['user_id'];
     $email = $order_shipment['Order']['OrderCustomer']['Email']['email'];
     if (empty($shipment_tracking_number) && empty($shipment_date_shipped)) {
         $Model->saveField("tracking_number", $snap_tracking_number);
         $Model->saveField("carrier", $snap_shipping_method);
         $Model->saveField("date_shipped", $snap_date_closed);
         $Model->saveField('order_shipment_status_id', OrderShipmentStatus::FULFILLED);
     }
     //to try to avoid sending too many emails, check the order status.
     $notification_date_obj = new DateTime($date_created);
     $interval = $now->diff($notification_date_obj);
     if ($interval->days >= 2) {
         return true;
     }
     if ($order_status_id == Order::STATUS_SHIPPED && !$is_backorder && $interval->days >= 2) {
         return true;
     }
     if ($snap_tracking_number && $snap_shipping_method) {
         $tracking_url = $Model->getTrackingLink($snap_tracking_number, $snap_shipping_method);
     } else {
         $tracking_url = '';
     }
     if (!$charm_order) {
         /** @noinspection PhpUndefinedFieldInspection */
         $email_data = ["name" => $snap_customer_name, "order_id" => $snap_order_id, "tracking_number" => $snap_shipment->CarrierTrackingNumber, "tracking_url" => $tracking_url, "country_id" => $country_id];
         $userLocale = $this->User->userLocale($user_id);
         $usable_userLocale = empty($userLocale['User']['locale']) ? 'en_US' : $userLocale['User']['locale'];
         if (!empty($email)) {
             YouniqueEmail::queueEmail($email_data, 'en_us_tracking_numbers', $email, 'email order tracking', 'purchase-page', $usable_userLocale);
         }
     }
     return true;
 }