findByAreaId($areaId); } return self::$prices; } public function postActivation(ConnectionInterface $con = null) { self::setConfigValue(self::WEBSERVICE_URL, "https://www.dhl.com/fr-fr/home/suivi.html?tracking-id="); $database = new Database($con); $database->insertSql(null, array(__DIR__ . '/Config/thelia.sql')); // Create DHL shipping zones for home delivery $moduleId = self::getModuleId(); $moduleConfiguration = json_decode(file_get_contents(__DIR__. '/Config/prices.json')); if (false === $moduleConfiguration) { throw new TheliaProcessException("Invalid JSON configuration for DHL module"); } // Create all shipping zones, and associate DHL module with them. foreach ($moduleConfiguration->shippingZones as $shippingZone) { AreaQuery::create()->filterByName($shippingZone->name)->delete(); $area = new Area(); $area ->setName($shippingZone->name) ->save(); foreach ($shippingZone->countries as $countryIsoCode) { if (null !== $country = CountryQuery::create()->findOneByIsoalpha3($countryIsoCode)) { (new CountryArea()) ->setAreaId($area->getId()) ->setCountryId($country->getId()) ->save(); } } // Attach this zone to our module (new AreaDeliveryModule()) ->setArea($area) ->setDeliveryModuleId($moduleId) ->save(); // Create base prices foreach ($shippingZone->prices as $price) { (new DHLDeliveryPrice()) ->setAreaId($area->getId()) ->setMaxWeight($price->up_to) ->setPriceWithTax($price->price_euro) ->save(); } } } public function isValidDelivery(Country $country) { if (null !== $area = $this->getAreaForCountry($country)) { $areaId = $area->getId(); $prices = self::getPrices($areaId); /* Check if DHL delivers the area */ if (isset($prices)) { // Yes ! Check if the cart weight is below slice limit $maxWeight = DHLDeliveryPriceQuery::create() ->orderByMaxWeight(Criteria::DESC) ->findOneByAreaId($areaId) ->getMaxWeight(); $cartWeight = $this->getRequest()->getSession()->getSessionCart($this->getDispatcher())->getWeight(); if ($cartWeight <= $maxWeight) { return true; } } } return false; } /** * @param $areaId * @param $weight * * @return mixed * @throws \Thelia\Exception\OrderException */ public static function getPostageAmount($areaId, $weight) { $postage = 0; $prices = self::getPrices($areaId); /* check if DHL delivers the asked area */ if (!isset($prices)) { throw new DeliveryException( Translator::getInstance()->trans( "DHL delivery unavailable for the delivery country", [], self::DOMAIN_NAME ) ); } $maxWeight = DHLDeliveryPriceQuery::create() ->orderByMaxWeight(Criteria::DESC) ->findOneByAreaId($areaId) ->getMaxWeight(); /* Check cart weight is below the maximum weight */ if ($weight > $maxWeight) { throw new DeliveryException( Translator::getInstance()->trans( "DHL delivery unavailable for this cart weight (%weight kg)", array("%weight" => $weight), self::DOMAIN_NAME ) ); } $postageArray = DHLDeliveryPriceQuery::create() ->findByAreaId($areaId); $postage = current($postageArray); while (prev($areaPrices)) { if ($weight > key($areaPrices)) { break; } $postage = current($areaPrices); } return $postage; } /** * * calculate and return delivery price * * @param Country $country * @return mixed * @throws \Thelia\Exception\OrderException */ public function getPostage(Country $country) { $cartWeight = $this->getRequest()->getSession()->getSessionCart($this->getDispatcher())->getWeight(); $postage = self::getPostageAmount( $this->getAreaForCountry($country)->getId(), $cartWeight ); return $postage; } // public function update($currentVersion, $newVersion, ConnectionInterface $con = null) // { // $uploadDir = __DIR__ . '/Config/prices.json'; // if (is_readable($uploadDir) && DHL::getConfigValue(DHLConfigValue::PRICES, null) == null) { // DHL::setConfigValue(DHLConfigValue::PRICES, file_get_contents($uploadDir)); // } // } }