public static function getRealTimeRates(ShippingRateCalculator $handler, Shipment $shipment) { $rates = new ShippingRateSet(); $handler->setWeight($shipment->getChargeableWeight()); $order = $shipment->order->get(); if ($order->isMultiAddress->get()) { $address = $shipment->shippingAddress->get(); } else { $address = $order->shippingAddress->get(); } if (!$address) { return $rates; } $handler->setDestCountry($address->countryID->get()); $handler->setDestState($address->state->get() ? $address->state->get()->code->get() : $address->stateName->get()); $handler->setDestZip($address->postalCode->get()); $config = $shipment->getApplication()->getConfig(); $handler->setSourceCountry($config->get('STORE_COUNTRY')); $handler->setSourceZip($config->get('STORE_ZIP')); $handler->setSourceState($config->get('STORE_STATE')); foreach ($handler->getAllRates() as $k => $rate) { $newRate = new ShipmentDeliveryRate(); $newRate->setApplication($shipment->getApplication()); $newRate->setCost($rate->getCostAmount(), $rate->getCostCurrency()); $newRate->setServiceName($rate->getServiceName()); $newRate->setClassName($rate->getClassName()); $newRate->setProviderName($rate->getProviderName()); $newRate->setServiceId($rate->getClassName() . '_' . $k); $rates->add($newRate); } return $rates; }
public static function getRealTimeRates(ShippingRateCalculator $handler, Shipment $shipment) { $rates = new ShippingRateSet(); $handler->setWeight($shipment->getChargeableWeight()); $order = $shipment->order->get(); // TODO: fix issue when address has zip and country data, but are missing city, user and record id! // (now workround - get address id, if $address has no id, load address by id) if ($order->isMultiAddress->get()) { $address = $shipment->shippingAddress->get(); $arr = $shipment->toArray(); } else { $address = $order->shippingAddress->get(); $arr = $order->toArray(); } if (!$address->getID() && array_key_exists('shippingAddressID', $arr)) { $address = ActiveRecordModel::getInstanceByID('UserAddress', $arr['shippingAddressID'], true); } if (!$address) { return $rates; } $handler->setDestCountry($address->countryID->get()); $handler->setDestState($address->state->get() ? $address->state->get()->code->get() : $address->stateName->get()); $handler->setDestZip($address->postalCode->get()); $handler->setDestCity($address->city->get()); $config = $shipment->getApplication()->getConfig(); $handler->setSourceCountry($config->get('STORE_COUNTRY')); $handler->setSourceZip($config->get('STORE_ZIP')); $handler->setSourceState($config->get('STORE_STATE')); foreach ($handler->getAllRates() as $k => $rate) { $newRate = new ShipmentDeliveryRate(); $newRate->setApplication($shipment->getApplication()); $newRate->setCost($rate->getCostAmount(), $rate->getCostCurrency()); $newRate->setServiceName($rate->getServiceName()); $newRate->setClassName($rate->getClassName()); $newRate->setProviderName($rate->getProviderName()); $newRate->setServiceId($rate->getClassName() . '_' . $k); $rates->add($newRate); } return $rates; }
/** * 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); }
/** * Returns real time shipping rates for the particular shipment * * @return ShippingRateSet */ public function getRealTimeRates(Shipment $shipment) { $rates = new ShippingRateSet(); $app = self::getApplication(); foreach ($app->getEnabledRealTimeShippingServices() as $handler) { $rates->merge(ShipmentDeliveryRate::getRealTimeRates($app->getShippingHandler($handler), $shipment)); } return $rates; }