From d00bc84cd5299d8fc8e417999a4e242f580df21d Mon Sep 17 00:00:00 2001 From: Benjamin Perche Date: Wed, 19 Feb 2014 09:51:22 +0100 Subject: [PATCH] Add dynamical prices editing in Colissimo modified: local/modules/Colissimo/AdminIncludes/module_configuration.html modified: local/modules/Colissimo/Colissimo.php modified: local/modules/Colissimo/Config/config.xml modified: local/modules/Colissimo/Config/module.xml modified: local/modules/Colissimo/Config/prices.json new file: local/modules/Colissimo/Config/routing.xml modified: local/modules/Colissimo/Config/thelia.sql new file: local/modules/Colissimo/Controller/EditPrices.php new file: local/modules/Colissimo/I18n/en_US.php new file: local/modules/Colissimo/I18n/fr_FR.php modified: local/modules/Colissimo/Listener/SendMail.php new file: local/modules/Colissimo/Loop/CheckRightsLoop.php modified: local/modules/Colissimo/Loop/Price.php modified: local/modules/Colissimo/documentation/TarifsAvril2013.pdf modified: local/modules/Colissimo/documentation/readme.txt --- .../AdminIncludes/module_configuration.html | 135 +++++++++++------- local/modules/Colissimo/Colissimo.php | 4 +- local/modules/Colissimo/Config/config.xml | 1 + local/modules/Colissimo/Config/module.xml | 0 local/modules/Colissimo/Config/prices.json | 129 +---------------- local/modules/Colissimo/Config/routing.xml | 10 ++ local/modules/Colissimo/Config/thelia.sql | 0 .../Colissimo/Controller/EditPrices.php | 90 ++++++++++++ local/modules/Colissimo/I18n/en_US.php | 21 +++ local/modules/Colissimo/I18n/fr_FR.php | 21 +++ local/modules/Colissimo/Listener/SendMail.php | 0 .../Colissimo/Loop/CheckRightsLoop.php | 82 +++++++++++ local/modules/Colissimo/Loop/Price.php | 0 .../documentation/TarifsAvril2013.pdf | Bin .../Colissimo/documentation/readme.txt | 0 15 files changed, 310 insertions(+), 183 deletions(-) mode change 100644 => 100755 local/modules/Colissimo/AdminIncludes/module_configuration.html mode change 100644 => 100755 local/modules/Colissimo/Colissimo.php mode change 100644 => 100755 local/modules/Colissimo/Config/config.xml mode change 100644 => 100755 local/modules/Colissimo/Config/module.xml mode change 100644 => 100755 local/modules/Colissimo/Config/prices.json create mode 100755 local/modules/Colissimo/Config/routing.xml mode change 100644 => 100755 local/modules/Colissimo/Config/thelia.sql create mode 100755 local/modules/Colissimo/Controller/EditPrices.php create mode 100644 local/modules/Colissimo/I18n/en_US.php create mode 100644 local/modules/Colissimo/I18n/fr_FR.php mode change 100644 => 100755 local/modules/Colissimo/Listener/SendMail.php create mode 100755 local/modules/Colissimo/Loop/CheckRightsLoop.php mode change 100644 => 100755 local/modules/Colissimo/Loop/Price.php mode change 100644 => 100755 local/modules/Colissimo/documentation/TarifsAvril2013.pdf mode change 100644 => 100755 local/modules/Colissimo/documentation/readme.txt diff --git a/local/modules/Colissimo/AdminIncludes/module_configuration.html b/local/modules/Colissimo/AdminIncludes/module_configuration.html old mode 100644 new mode 100755 index 3ce3abb79..0a8b6060d --- a/local/modules/Colissimo/AdminIncludes/module_configuration.html +++ b/local/modules/Colissimo/AdminIncludes/module_configuration.html @@ -1,3 +1,13 @@ +
+ + {loop name="checkrights.colissimo" type="colissimo.check.rights"} +
+

{$ERRMES} {$ERRFILE} | {intl l="Please change the access rights"}.

+
+ {/loop} +
+ +{elseloop rel="checkrights.colissimo"}
@@ -5,22 +15,35 @@

{intl l="Colissimo Module allows to send your products all around the world with La Poste."}

-
-

{intl l="Prices are not dynamically editable yet."}

-

{intl l="Prices below can be edited in local/modules/Colissimo/Config/prices.json file."}

-
-
+ {* -- Add price slice confirmation dialog ----------------------------------- *} {loop type="area" name="list area" backend_context=true} + {include + file = "includes/generic-create-dialog.html" + + dialog_id = "price_slice_create_dialog_{$ID}" + dialog_title = {intl l="Create a price slice"} + dialog_body = " + + + + + " + + form_action="{url path="/admin/module/colissimo/prices"}" + + dialog_ok_label = {intl l="Create"} + dialog_cancel_label = {intl l="Cancel"} + }
@@ -31,19 +54,56 @@ - {loop type="colissimo" name="colissimo" area=$ID} - - - - - - {/loop} + {loop type="colissimo" name="colissimo" area=$ID} + {* -- EDIT price slice confirmation dialog ----------------------------------- *} + {include + file = "includes/generic-confirm-dialog.html" + + dialog_id = "price_slice_edit_dialog_{$ID}_{$MAX_WEIGHT|replace:'.':'-'}" + dialog_title = {intl l="Edit a price slice"} + dialog_message = " + + + + " + + form_action="{url path="/admin/module/colissimo/prices"}" + dialog_ok_label = {intl l="Edit"} + dialog_cancel_label = {intl l="Cancel"} + } + {* -- Delete price slice confirmation dialog ----------------------------------- *} + {include + file = "includes/generic-confirm-dialog.html" + + dialog_id = "price_slice_delete_dialog_{$ID}_{$MAX_WEIGHT|replace:'.':'-'}" + dialog_title = {intl l="Delete a price slice"} + dialog_message = " + + + {intl l="Do you really want to delete this slice ?"}" + + form_action="{url path="/admin/module/colissimo/prices"}" + dialog_ok_label = {intl l="Delete"} + dialog_cancel_label = {intl l="Cancel"} + } + + + + + + + {/loop}
{intl l="Area : "}{$NAME} {loop type="auth" name="can_create" role="ADMIN" module="colissimo" access="CREATE"} - - - + + + {/loop}
{$MAX_WEIGHT}{$PRICE} -
- {loop type="auth" name="can_change" role="ADMIN" module="colissimo" access="UPDATE"} - - {/loop} -
-
{$MAX_WEIGHT}{$PRICE} +
+ {loop type="auth" name="can_change" role="ADMIN" module="colissimo" access="UPDATE"} + + + + + + + {/loop} +
+
@@ -53,35 +113,4 @@
- -{* -- Add price slice confirmation dialog ----------------------------------- *} - -{include - file = "includes/generic-create-dialog.html" - - dialog_id = "price_slice_create_dialog" - dialog_title = {intl l="Create a price slice"} - dialog_body = "Not available yet." - - dialog_ok_label = {intl l="Create"} - dialog_cancel_label = {intl l="Cancel"} -} - -{* -- Delete price slice confirmation dialog ----------------------------------- *} - -{include - file = "includes/generic-confirm-dialog.html" - - dialog_id = "price_slice_delete_dialog" - dialog_title = {intl l="Delete a price slice"} - dialog_message = "Not available yet." - - dialog_ok_label = {intl l="Delete"} - dialog_cancel_label = {intl l="Cancel"} -} - - \ No newline at end of file +{/elseloop} \ No newline at end of file diff --git a/local/modules/Colissimo/Colissimo.php b/local/modules/Colissimo/Colissimo.php old mode 100644 new mode 100755 index 294c916e7..c970e4fe4 --- a/local/modules/Colissimo/Colissimo.php +++ b/local/modules/Colissimo/Colissimo.php @@ -39,12 +39,12 @@ class Colissimo extends BaseModule implements DeliveryModuleInterface private static $prices = null; - const JSON_PRICE_RESOURCE = "prices.json"; + const JSON_PRICE_RESOURCE = "/Config/prices.json"; public static function getPrices() { if(null === self::$prices) { - self::$prices = json_decode(file_get_contents(sprintf('%s/Config/%s', __DIR__, self::JSON_PRICE_RESOURCE)), true); + self::$prices = json_decode(file_get_contents(sprintf('%s%s', __DIR__, self::JSON_PRICE_RESOURCE)), true); } return self::$prices; diff --git a/local/modules/Colissimo/Config/config.xml b/local/modules/Colissimo/Config/config.xml old mode 100644 new mode 100755 index 1ea694eff..220bef695 --- a/local/modules/Colissimo/Config/config.xml +++ b/local/modules/Colissimo/Config/config.xml @@ -6,6 +6,7 @@ + diff --git a/local/modules/Colissimo/Config/module.xml b/local/modules/Colissimo/Config/module.xml old mode 100644 new mode 100755 diff --git a/local/modules/Colissimo/Config/prices.json b/local/modules/Colissimo/Config/prices.json old mode 100644 new mode 100755 index dd1888dc6..3fc2e0cd7 --- a/local/modules/Colissimo/Config/prices.json +++ b/local/modules/Colissimo/Config/prices.json @@ -1,128 +1 @@ -{ - "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 l’Europe de l’Est (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 d’Afrique 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 - } - } -} \ No newline at end of file +{"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\u00e9enne 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 l\u2019Europe de l\u2019Est (hors Union Europ\u00e9enne), Norv\u00e8ge, 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 d\u2019Afrique 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}}} \ No newline at end of file diff --git a/local/modules/Colissimo/Config/routing.xml b/local/modules/Colissimo/Config/routing.xml new file mode 100755 index 000000000..d9e8517e0 --- /dev/null +++ b/local/modules/Colissimo/Config/routing.xml @@ -0,0 +1,10 @@ + + + + + Colissimo\Controller\EditPrices::editprices + + + diff --git a/local/modules/Colissimo/Config/thelia.sql b/local/modules/Colissimo/Config/thelia.sql old mode 100644 new mode 100755 diff --git a/local/modules/Colissimo/Controller/EditPrices.php b/local/modules/Colissimo/Controller/EditPrices.php new file mode 100755 index 000000000..989ed7d68 --- /dev/null +++ b/local/modules/Colissimo/Controller/EditPrices.php @@ -0,0 +1,90 @@ +. */ +/* */ +/*************************************************************************************/ + +namespace Colissimo\Controller; +use Colissimo\Colissimo; +use Thelia\Model\AreaQuery; +use Thelia\Controller\Admin\BaseAdminController; + +/** + * Class EditPrices + * @package Colissimo\Controller + * @author Thelia + */ +class EditPrices extends BaseAdminController +{ + + public function editprices() + { + // Get data & treat + $post = $this->getRequest(); + $operation = $post->get('operation'); + $area = $post->get('area'); + $weight = $post->get('weight'); + $price = $post->get('price'); + if( preg_match("#^add|delete$#", $operation) && + preg_match("#^\d+$#", $area) && + preg_match("#^\d+\.?\d*$#", $weight) + ) { + // check if area exists in db + $exists = AreaQuery::create() + ->findPK($area); + if ($exists !== null) { + $json_path= __DIR__."/../".Colissimo::JSON_PRICE_RESOURCE; + + if (is_readable($json_path)) { + $json_data = json_decode(file_get_contents($json_path),true); + } elseif(!file_exists($json_path)) { + $json_data = array(); + } else { + throw new \Exception("Can't read Colissimo".Colissimo::JSON_PRICE_RESOURCE.". Please change the rights on the file."); + } + if((float) $weight > 0 && $operation == "add" + && preg_match("#\d+\.?\d*#", $price)) { + $json_data[$area]['slices'][$weight] = $price; + } elseif ($operation == "delete") { + if(isset($json_data[$area]['slices'][$weight])) + unset($json_data[$area]['slices'][$weight]); + } else { + throw new \Exception("Weight must be superior to 0"); + } + ksort($json_data[$area]['slices']); + if ((file_exists($json_path) ?is_writable($json_path):is_writable(__DIR__."/../"))) { + $file = fopen($json_path, 'w'); + fwrite($file, json_encode($json_data));; + fclose($file); + } else { + throw new \Exception("Can't write Colissimo".Colissimo::JSON_PRICE_RESOURCE.". Please change the rights on the file."); + } + } else { + throw new \Exception("Area not found"); + } + } else { + throw new \ErrorException("Arguments are missing or invalid"); + } + + return $this->redirectToRoute("admin.module.configure",array(), + array ( 'module_code'=>"Colissimo", + '_controller' => 'Thelia\\Controller\\Admin\\ModuleController::configureAction')); + } +} diff --git a/local/modules/Colissimo/I18n/en_US.php b/local/modules/Colissimo/I18n/en_US.php new file mode 100644 index 000000000..2156e65ee --- /dev/null +++ b/local/modules/Colissimo/I18n/en_US.php @@ -0,0 +1,21 @@ +'Can\'t read Config directory', + 'Can\'t write Config directory'=>'Can\'t write Config directory', + 'Can\'t read file'=>'Can\'t read file', + 'Can\'t write file'=>'Can\'t write file', + 'Please change the access rights'=>'Please change the access rights', + 'Colissimo Module allows to send your products all around the world with La Poste.'=>'Colissimo Module allows to send your products all around the world with La Poste.', + 'Create a price slice'=>'Create a price slice', + 'Weight up to ... (kg)'=>'Weight up to ... (kg)', + 'Price ('=>'Price (', + 'Create'=>'Create', + 'Cancel'=>'Cancel', + 'Area '=>'Area ', + 'Actions'=>'Actions', + 'Edit a price slice'=>'Edit a price slice', + 'Edit'=>'Edit', + 'Delete a price slice'=>'Delete a price slice', + 'Do you really want to delete this slice '=>'Do you really want to delete this slice ', + 'Delete'=>'Delete', + ); \ No newline at end of file diff --git a/local/modules/Colissimo/I18n/fr_FR.php b/local/modules/Colissimo/I18n/fr_FR.php new file mode 100644 index 000000000..c5d08c8b9 --- /dev/null +++ b/local/modules/Colissimo/I18n/fr_FR.php @@ -0,0 +1,21 @@ +'Le dossier Config ne peut être lu', + 'Can\'t write Config directory'=>'Le dossier Config ne peut être écrit', + 'Can\'t read file'=>'Le fichier suivant ne peut être lu', + 'Can\'t write file'=>'Le fichier suivant ne peut être écrit', + 'Please change the access rights'=>'Veuillez changer les droits d\'accès', + 'Colissimo Module allows to send your products all around the world with La Poste.'=>'Le module Colissimo vous permet d\'envoyer des colis dans le monde entier avec La Poste.', + 'Create a price slice' => 'Créer une tranche de prix', + 'Weight up to ... (kg)'=>'Poids ... (kg)', + 'Price (€)'=>'Prix (€)', + 'Create'=>'Créer', + 'Cancel'=>'Annuler', + 'Area : '=>'Zone de livraison : ', + 'Actions'=>'Actions', + 'Edit'=>'Modifer', + 'Edit a price slice' => 'Modifier une tranche de prix', + 'Delete a price slice' => 'Supprimer une tranche de prix', + 'Do you really want to delete this slice ?'=>'Voulez-vous réellement supprimer cette tranche de prix ?', + 'Delete'=>'Supprimer', + ); \ No newline at end of file diff --git a/local/modules/Colissimo/Listener/SendMail.php b/local/modules/Colissimo/Listener/SendMail.php old mode 100644 new mode 100755 diff --git a/local/modules/Colissimo/Loop/CheckRightsLoop.php b/local/modules/Colissimo/Loop/CheckRightsLoop.php new file mode 100755 index 000000000..05afc70ca --- /dev/null +++ b/local/modules/Colissimo/Loop/CheckRightsLoop.php @@ -0,0 +1,82 @@ +. */ +/* */ +/*************************************************************************************/ + +namespace Colissimo\Loop; + +use Thelia\Core\Template\Loop\Argument\ArgumentCollection; +use Thelia\Core\Template\Element\BaseLoop; +use Thelia\Core\Template\Element\LoopResultRow; +use Thelia\Core\Template\Element\LoopResult; +use Thelia\Core\Template\Element\ArraySearchLoopInterface; +use Thelia\Core\Translation\Translator; + +/** + * Class CheckRightsLoop + * @package Colissimo\Looop + * @author Thelia + */ + +class CheckRightsLoop extends BaseLoop implements ArraySearchLoopInterface +{ + protected function getArgDefinitions() + { + return new ArgumentCollection(); + } + + public function buildArray() + { + $ret = array(); + $dir = __DIR__."/../Config/"; + if (!is_readable($dir)) { + $ret[] = array("ERRMES"=>Translator::getInstance()->trans("Can't read Config directory"), "ERRFILE"=>""); + } + if (!is_writable($dir)) { + $ret[] = array("ERRMES"=>Translator::getInstance()->trans("Can't write Config directory"), "ERRFILE"=>""); + } + if ($handle = opendir($dir)) { + while (false !== ($file = readdir($handle))) { + if (strlen($file) > 5 && substr($file, -5) === ".json") { + if (!is_readable($dir.$file)) { + $ret[] = array("ERRMES"=>Translator::getInstance()->trans("Can't read file"), "ERRFILE"=>"Colissimo/Config/".$file); + } + if (!is_writable($dir.$file)) { + $ret[] = array("ERRMES"=>Translator::getInstance()->trans("Can't write file"), "ERRFILE"=>"Colissimo/Config/".$file); + } + } + } + } + + return $ret; + } + public function parseResults(LoopResult $loopResult) + { + foreach ($loopResult->getResultDataCollection() as $arr) { + $loopResultRow = new LoopResultRow(); + $loopResultRow->set("ERRMES", $arr["ERRMES"]) + ->set("ERRFILE", $arr["ERRFILE"]); + $loopResult->addRow($loopResultRow); + } + + return $loopResult; + } +} diff --git a/local/modules/Colissimo/Loop/Price.php b/local/modules/Colissimo/Loop/Price.php old mode 100644 new mode 100755 diff --git a/local/modules/Colissimo/documentation/TarifsAvril2013.pdf b/local/modules/Colissimo/documentation/TarifsAvril2013.pdf old mode 100644 new mode 100755 diff --git a/local/modules/Colissimo/documentation/readme.txt b/local/modules/Colissimo/documentation/readme.txt old mode 100644 new mode 100755