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