示例#1
0
 /**
  * @param Shipment $dataObject
  * @return \Magento\Sales\Model\Order\Shipment
  * @throws \Exception
  */
 public function getModel(Shipment $dataObject)
 {
     $this->shipmentLoader->setOrderId($dataObject->getOrderId());
     $this->shipmentLoader->setShipmentId($dataObject->getEntityId());
     $items = [];
     foreach ($dataObject->getItems() as $item) {
         $items[$item->getOrderItemId()] = $item->getQty();
     }
     $shipmentItems = ['items' => $items];
     $this->shipmentLoader->setShipment($shipmentItems);
     $this->shipmentLoader->setTracking($dataObject->getTracks());
     return $this->shipmentLoader->load();
 }
示例#2
0
 /**
  * Calculate a delivery rate for a particular shipment
  *
  * @return ShipmentDeliveryRate
  */
 public function getDeliveryRate(Shipment $shipment)
 {
     $hasFreeShipping = false;
     // get applicable rates
     if (self::WEIGHT_BASED == $this->rangeType->get()) {
         $weight = $shipment->getChargeableWeight($this->deliveryZone->get());
         $cond = new EqualsOrLessCond(new ARFieldHandle('ShippingRate', 'weightRangeStart'), $weight * 1.000001);
         $cond->addAND(new EqualsOrMoreCond(new ARFieldHandle('ShippingRate', 'weightRangeEnd'), $weight * 0.99999));
     } else {
         $total = $shipment->getSubTotal(Shipment::WITHOUT_TAXES);
         $cond = new EqualsOrLessCond(new ARFieldHandle('ShippingRate', 'subtotalRangeStart'), $total * 1.000001);
         $cond->addAND(new EqualsOrMoreCond(new ARFieldHandle('ShippingRate', 'subtotalRangeEnd'), $total * 0.99999));
     }
     $f = new ARSelectFilter(new EqualsCond(new ARFieldHandle('ShippingRate', 'shippingServiceID'), $this->getID()));
     $f->mergeCondition($cond);
     $rates = ActiveRecordModel::getRecordSet('ShippingRate', $f);
     if (!$rates->size()) {
         return null;
     }
     $itemCount = $shipment->getChargeableItemCount($this->deliveryZone->get());
     $maxRate = 0;
     foreach ($rates as $rate) {
         $charge = $rate->flatCharge->get();
         foreach ($shipment->getItems() as $item) {
             $charge += $rate->getItemCharge($item) * $item->getCount();
         }
         if (self::WEIGHT_BASED == $this->rangeType->get()) {
             $charge += $rate->perKgCharge->get() * $weight;
         } else {
             $charge += $rate->subtotalPercentCharge->get() / 100 * $total;
         }
         if ($charge > $maxRate) {
             $maxRate = $charge;
         }
     }
     return ShipmentDeliveryRate::getNewInstance($this, $maxRate);
 }