Colissimo in progress

This commit is contained in:
Etienne Roudeix
2013-11-14 11:21:34 +01:00
parent e8b4a4ac74
commit 48409c29a9
10 changed files with 236 additions and 158 deletions

View File

@@ -25,6 +25,7 @@ namespace Colissimo;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\HttpFoundation\Request;
use Thelia\Exception\OrderException;
use Thelia\Model\Country;
use Thelia\Module\BaseModule;
use Thelia\Module\DeliveryModuleInterface;
@@ -34,144 +35,57 @@ class Colissimo extends BaseModule implements DeliveryModuleInterface
protected $request;
protected $dispatcher;
protected $prices = array(
// area 1 : France
"1" => array(
"slices" => array( // max_weight => price
'0.25' => 5.23,
'0.5' => 5.8,
'0.75' => 6.56,
'1' => 7.13,
'2' => 8.08,
'3' => 9.22,
'5' => 11.31,
'7' => 13.40,
'10' => 16.53,
'15' => 19.14,
'30' => 26.93,
),
),
/*
* area 2 : A Zone
* Union Européenne et Suisse
*/
"2" => array(
"slices" => array( // max_weight => price
'1' => 15.34,
'2' => 16.96,
'3' => 20.47,
'4' => 23.99,
'5' => 27.50,
'6' => 31.02,
'7' => 34.53,
'8' => 38.05,
'9' => 41.56,
'10' => 45.08,
'15' => 51.92,
'20' => 58.76,
'25' => 65.60,
'30' => 72.44,
),
),
/*
* area 3 : B Zone
* Pays de lEurope de lEst (hors Union Européenne), Norvège, Maghreb
*/
"3" => array(
"slices" => array( // max_weight => price
'1' => 18.81,
'2' => 20.62,
'3' => 24.94,
'4' => 29.26,
'5' => 33.58,
'6' => 37.91,
'7' => 42.23,
'8' => 46.55,
'9' => 50.87,
'10' => 55.20,
'15' => 65.08,
'20' => 74.96,
),
),
/*
* area 4 : C Zone
* Pays dAfrique hors Maghreb, Canada, Etats-Unis, Proche et Moyen Orient
*/
"4" => array(
"slices" => array( // max_weight => price
'1' => 22.04,
'2' => 29.55,
'3' => 38.86,
'4' => 48.17,
'5' => 57.48,
'6' => 66.79,
'7' => 76.10,
'8' => 85.41,
'9' => 94.72,
'10' => 104.03,
'15' => 126.92,
'20' => 149.82,
),
),
/*
* area 5 : D Zone
* Autres destinations
*/
"5" => array(
"slices" => array( // max_weight => price
'1' => 25.08,
'2' => 37.72,
'3' => 50.26,
'4' => 62.80,
'5' => 75.34,
'6' => 87.88,
'7' => 100.42,
'8' => 112.96,
'9' => 125.50,
'10' => 138.04,
'15' => 162.74,
'20' => 187.44,
),
),
"6" => array( // area 6 : France OM1
"slices" => array( // max_weight => price
'0.5' => 8.27,
'1' => 12.49,
'2' => 17.05,
'3' => 21.61,
'4' => 26.17,
'5' => 30.73,
'6' => 35.29,
'7' => 39.85,
'8' => 44.41,
'9' => 48.97,
'10' => 53.53,
'15' => 76.33,
'20' => 99.13,
'25' => 121.93,
'30' => 144.73,
),
),
"7" => array( // area 7 : France OM2
"slices" => array( // max_weight => price
'0.5' => 9.88,
'1' => 14.92,
'2' => 26.32,
'3' => 37.72,
'4' => 49.12,
'5' => 60.52,
'6' => 71.92,
'7' => 83.32,
'8' => 94.72,
'9' => 106.12,
'10' => 117.52,
'15' => 174.52,
'20' => 231.52,
'25' => 288.52,
'30' => 345.52,
),
),
);
private static $prices = null;
const JSON_PRICE_RESOURCE = "prices.json";
public function getPrices()
{
if(null === self::$prices) {
self::$prices = json_decode(file_get_contents(sprintf('%s/Config/%s', __DIR__, self::JSON_PRICE_RESOURCE)), true);
}
return self::$prices;
}
/**
* @param $areaId
* @param $weight
*
* @return mixed
* @throws \Thelia\Exception\OrderException
*/
public function getPostageAmount($areaId, $weight)
{
$prices = $this->getPrices();
/* check if Colissimo delivers the asked area */
if(!isset($prices[$areaId]) || !isset($prices[$areaId]["slices"])) {
throw new OrderException("Colissimo delivery unavailable for the chosen delivery country", OrderException::DELIVERY_MODULE_UNAVAILABLE);
}
$areaPrices = $prices[$areaId]["slices"];
ksort($areaPrices);
/* check this weight is not too much */
end($areaPrices);
$maxWeight = key($areaPrices);
if($weight > $maxWeight) {
throw new OrderException(sprintf("Colissimo delivery unavailable for this cart weight (%s kg)", $weight), OrderException::DELIVERY_MODULE_UNAVAILABLE);
}
$postage = current($areaPrices);
while(prev($areaPrices)) {
if($weight > key($areaPrices)) {
break;
}
$postage = current($areaPrices);
}
return $postage;
}
public function setRequest(Request $request)
{
@@ -199,11 +113,18 @@ class Colissimo extends BaseModule implements DeliveryModuleInterface
*
* @param Country $country
* @return mixed
* @throws \Thelia\Exception\OrderException
*/
public function getPostage(Country $country)
{
// TODO: Implement getPostage() method.
return 2;
$cartWeight = $this->getContainer()->get('request')->getSession()->getCart()->getWeight();
$postage = $this->getPostageAmount(
$country->getAreaId(),
$cartWeight
);
return $postage;
}
public function getCode()

View File

@@ -0,0 +1,128 @@
{
"1": {
"_info": "area 1 : France",
"slices": {
"0.25": 5.23,
"0.5": 5.8,
"0.75": 6.56,
"1": 7.13,
"2": 8.08,
"3": 9.22,
"5": 11.31,
"7": 13.4,
"10": 16.53,
"15": 19.14,
"30": 26.93
}
},
"2": {
"_info": "area 2 : A Zone - Union Européenne et Suisse",
"slices": {
"1": 15.34,
"2": 16.96,
"3": 20.47,
"4": 23.99,
"5": 27.5,
"6": 31.02,
"7": 34.53,
"8": 38.05,
"9": 41.56,
"10": 45.08,
"15": 51.92,
"20": 58.76,
"25": 65.6,
"30": 72.44
}
},
"3": {
"_info": "area 3 : B Zone - Pays de lEurope de lEst (hors Union Européenne), Norvège, Maghreb",
"slices": {
"1": 18.81,
"2": 20.62,
"3": 24.94,
"4": 29.26,
"5": 33.58,
"6": 37.91,
"7": 42.23,
"8": 46.55,
"9": 50.87,
"10": 55.2,
"15": 65.08,
"20": 74.96
}
},
"4": {
"_info": "area 4 : C Zone - Pays dAfrique hors Maghreb, Canada, Etats-Unis, Proche et Moyen Orient",
"slices": {
"1": 22.04,
"2": 29.55,
"3": 38.86,
"4": 48.17,
"5": 57.48,
"6": 66.79,
"7": 76.1,
"8": 85.41,
"9": 94.72,
"10": 104.03,
"15": 126.92,
"20": 149.82
}
},
"5": {
"_info": "area 5 : D Zone - Autres destinations",
"slices": {
"1": 25.08,
"2": 37.72,
"3": 50.26,
"4": 62.8,
"5": 75.34,
"6": 87.88,
"7": 100.42,
"8": 112.96,
"9": 125.5,
"10": 138.04,
"15": 162.74,
"20": 187.44
}
},
"6": {
"_info": "area 6 : France OM1",
"slices": {
"0.5": 8.27,
"1": 12.49,
"2": 17.05,
"3": 21.61,
"4": 26.17,
"5": 30.73,
"6": 35.29,
"7": 39.85,
"8": 44.41,
"9": 48.97,
"10": 53.53,
"15": 76.33,
"20": 99.13,
"25": 121.93,
"30": 144.73
}
},
"7": {
"_info": "area 7 : France OM2",
"slices": {
"0.5": 9.88,
"1": 14.92,
"2": 26.32,
"3": 37.72,
"4": 49.12,
"5": 60.52,
"6": 71.92,
"7": 83.32,
"8": 94.72,
"9": 106.12,
"10": 117.52,
"15": 174.52,
"20": 231.52,
"25": 288.52,
"30": 345.52
}
}
}