* @copyright 2023 DPD France S.A.S. * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) */ if (!defined('_PS_VERSION_')) { exit; } // Autoloader Composer. Doit être chargé avant tout le reste. require_once __DIR__ . '/vendor/autoload.php'; require_once __DIR__ . '/config/config.inc.php'; use PrestaShop\Module\DPDFrance\ExternalContentProvider\EprintProvider; use PrestaShop\Module\DPDFrance\ExternalContentProvider\PudoProvider; use PrestaShop\Module\DPDFrance\ExternalContentProvider\LeadtimeProvider; use PrestaShop\Module\DPDFrance\Util\DPDCompliancy; use PrestaShop\Module\DPDFrance\Util\DPDConfig; use PrestaShop\Module\DPDFrance\Util\DPDTools; class DPDFrance extends CarrierModule { // DPD CLASS PROPERTIES /** * @var string */ private $jsPath; /** * @var string */ private $cssPath; /** * @var string */ private $imgPath; /** * @var string */ private $docsPath; /** * @var string */ private $logoPath; /** * @var string */ private $modulePath; /** * Configuration Relais * @var array */ private $configCarrierRelais; /** * Configuration Predict * @var array */ private $configCarrierPredict; /** * Configuration Classic * @var array */ private $configCarrierClassic; /** * Configuration World * @var array */ private $configCarrierWorld; public $multishop_context; private $multishop_context_group; public function __construct() { $this->name = 'dpdfrance'; $this->tab = 'shipping_logistics'; $this->version = '6.2.0'; $this->author = 'DPD France S.A.S. debug by Eolia'; $this->module_key = '41c64060327b5afada101ff25bd38850'; $this->ps_versions_compliancy = ['min' => '1.6.1.0', 'max' => '1.7.0.0']; $this->multishop_context = Shop::CONTEXT_ALL | Shop::CONTEXT_GROUP | Shop::CONTEXT_SHOP; $this->multishop_context_group = Shop::CONTEXT_GROUP; parent::__construct(); $this->displayName = $this->l('DPD France'); $this->description = $this->l("Offer DPD's fast and reliable delivery services to your customers"); $this->limited_countries = ['fr']; $this->confirmUninstall = $this->l('Warning: all the data saved in your database will be deleted. Are you sure you want uninstall this module?'); // Settings paths $this->modulePath = $this->_path; $this->jsPath = $this->_path . 'views/js/'; $this->cssPath = $this->_path . 'views/css/'; $this->imgPath = $this->_path . 'views/img/'; $this->docsPath = $this->_path . 'docs/'; $this->logoPath = $this->_path . 'logo.png'; // Settings Carrier configuration $this->configCarrierRelais = [ 'name' => 'Livraison en relais Pickup', 'id_tax_rules_group' => 0, 'url' => DPDTools::PREFIX_TRACEX_URL . '@', 'active' => true, 'deleted' => 0, 'shipping_handling' => false, 'range_behavior' => 1, 'is_module' => true, 'delay' => [ 'fr' => 'Livraison 24-48h en France vers plus de 8500 relais Pickup.', 'en' => '24-48h delivery in one of our 8500 pick-up points.', 'es' => 'Entrega en 24 a 48 horas en una de nuestras 8500 tiendas.', 'it' => 'Consegna in 24 a 48 ore in uno dei nostri 8.500 negozi.', 'de' => '24-48 Stunden Lieferung in einem unserer 8.500 Geschäften.', ], 'id_zone' => 1, 'shipping_external' => true, 'external_module_name' => 'dpdfrance', 'need_range' => true, 'grade' => 9, ]; $this->configCarrierPredict = [ 'name' => 'Livraison à domicile Predict sur créneau horaire', 'id_tax_rules_group' => 0, 'url' => DPDTools::PREFIX_TRACEX_URL . '@', 'active' => true, 'deleted' => 0, 'shipping_handling' => false, 'range_behavior' => 1, 'is_module' => true, 'delay' => [ 'fr' => 'Livraison sur créneau horaire sous 24-48h en France', 'en' => 'Time slot delivery within 24-48 hours in France', 'es' => 'Entrega en una franja horaria en 24/48 horas en Francia', 'it' => 'Consegna della fascia oraria entro 24-48 ore in Francia', 'de' => 'Zeitfenster-Zustellung innerhalb von 24-48 Stunden in Frankreich', ], 'id_zone' => 1, 'shipping_external' => true, 'external_module_name' => 'dpdfrance', 'need_range' => true, 'grade' => 9, ]; $this->configCarrierClassic = [ 'name' => 'Livraison sur lieu de travail', 'id_tax_rules_group' => 0, 'url' => DPDTools::PREFIX_TRACEX_URL . '@', 'active' => true, 'deleted' => 0, 'shipping_handling' => false, 'range_behavior' => 1, 'is_module' => true, 'delay' => [ 'fr' => 'Livraison 24-48h du lundi au vendredi pour tous ceux qui font le choix de recevoir leur colis sur leur lieu de travail.', 'en' => '24-48h delivery at your workplace only.', 'es' => 'Entrega en 24 a 48 horas en su lugar de trabajo.', 'it' => 'Consegna in 24 a 48 ore sul posto di lavoro.', 'de' => '24-48 Stunden Lieferung an Ihrem Arbeitsplatz.', ], 'id_zone' => 1, 'shipping_external' => true, 'external_module_name' => 'dpdfrance', 'need_range' => true, 'grade' => 9, ]; $this->configCarrierWorld = [ 'name' => 'Livraison internationale par DPD', 'id_tax_rules_group' => 0, 'url' => DPDTools::PREFIX_TRACEX_URL . '@', 'active' => true, 'deleted' => 0, 'shipping_handling' => false, 'range_behavior' => 1, 'is_module' => true, 'delay' => [ 'fr' => 'Livraison partout en Europe et dans le monde entier avec la fiabilité du réseau DPD.', 'en' => 'Delivery all over the world with the reliability of DPD network.', 'es' => 'Entrega mundial con la confiabilidad de la red DPD.', 'it' => 'Consegna in tutto il mondo con l affidabilità della rete di DPD.', 'de' => 'Lieferung in der ganzen Welt mit der Zuverlässigkeit der DPD Netzwerk.', ], 'id_zone' => 1, 'shipping_external' => true, 'external_module_name' => 'dpdfrance', 'need_range' => true, 'grade' => 9, ]; // Check if the module is DISABLED if (!DPDConfig::isModuleEnabled()) { $this->warning = $this->l('Please proceed to the configuration of the DPD plugin'); } // Check if php soap extension is load if (!extension_loaded('soap')) { $this->warning = $this->l('Warning! The PHP extension SOAP is not installed on this server. You must activate it in order to use the DPD plugin'); } // Check if php xml extension is load if (!extension_loaded('xml')) { $this->warning = $this->l('Warning! The PHP extension XML is not installed on this server. You must activate it in order to use the DPD plugin'); } // Check if php xml extension is load if (!extension_loaded('curl')) { $this->warning = $this->l('Warning! The PHP extension CURL is not installed on this server. You must activate it in order to use the DPD plugin'); } } // METHODS ABSTRACT CARRIER MODULE CLASS /** * Manage the Island and Mountain zones overcost calculation to the shipping fee * @param $params * @param float $shipping_cost * @return false|float */ public function getOrderShippingCost($params, $shipping_cost) { if (!$this->context->cart instanceof Cart) { $this->context->cart = new Cart((int)$params->id); } $address = new Address($this->context->cart->id_address_delivery); $isoCode = Country::getIsoById($address->id_country); if ($isoCode !== 'FR') { return $shipping_cost; } $idAddress = $this->context->cart->id_address_delivery; $postCode = DPDTools::getPostcodeByAddress($idAddress); if (Tools::substr($postCode, 0, 2) === '20') { $shipping_cost += DPDConfig::get('DPDFRANCE_SUPP_ILES'); if (DPDConfig::get('DPDFRANCE_SUPP_ILES') < 0) { return false; } } if (in_array($postCode, DPDTools::ISLANDS_ZONE, true)) { $shipping_cost += DPDConfig::get('DPDFRANCE_SUPP_ILES'); if (DPDConfig::get('DPDFRANCE_SUPP_ILES') < 0) { return false; } } if (in_array($postCode, DPDTools::MOUNTAINS_ZONE, true)) { $shipping_cost += DPDConfig::get('DPDFRANCE_SUPP_MONTAGNE'); if (DPDConfig::get('DPDFRANCE_SUPP_MONTAGNE') < 0) { return false; } } return $shipping_cost; } /** * @param $params * @return mixed */ public function getOrderShippingCostExternal($params) { return $params; } // INSTALL /** * Install Admin Tab AdminDPDFrance and AdminDPDFranceReturn, * Register Hooks, * Register Module's Settings Options * * @return bool * @throws PrestaShopDatabaseException */ public function install() { if ( parent::install() && $this->registerAllHooks() && $this->installConfigDB() && $this->installDPDConfigurations() && $this->installModuleTab('AdminDPDFrance', 'DPD France livraison', Tab::getInstanceFromClassName('AdminParentOrders')->id) && $this->installModuleTab('AdminDPDFranceReturn', 'DPD France retour', Tab::getInstanceFromClassName('AdminParentOrders')->id) ) { return true; } $this->_errors[] = $this->l('An error occurred during the installation. Please contact our technical support at support.ecommerce@dpd.fr for more information.'); return false; } /** * Register all hooks * @return bool */ protected function registerAllHooks() { return !( !$this->registerHook('displayHeader') || !$this->registerHook('displayBackOfficeHeader') || !$this->registerHook('displayCarrierList') || !$this->registerHook('actionCarrierUpdate') || !$this->registerHook('actionValidateOrder') || !$this->registerHook('displayCheckoutSummaryTop') || !$this->registerHook('displayPaymentTop') || !$this->registerHook('moduleRoutes') ); } /** * Install default DPD France configuration * @return bool */ protected function installDPDConfigurations() { return Configuration::updateValue('DPDFRANCE_PARAM', '0') && Configuration::updateValue('DPDFRANCE_NOM_EXP', '') && Configuration::updateValue('DPDFRANCE_ADDRESS_EXP', '') && Configuration::updateValue('DPDFRANCE_ADDRESS2_EXP', '') && Configuration::updateValue('DPDFRANCE_CP_EXP', '') && Configuration::updateValue('DPDFRANCE_VILLE_EXP', '') && Configuration::updateValue('DPDFRANCE_TEL_EXP', '') && Configuration::updateValue('DPDFRANCE_GSM_EXP', '') && Configuration::updateValue('DPDFRANCE_EMAIL_EXP', '') && Configuration::updateValue('DPDFRANCE_RELAIS_CARRIER_ID', '') && Configuration::updateValue('DPDFRANCE_RELAIS_DEPOT_CODE', '') && Configuration::updateValue('DPDFRANCE_RELAIS_SHIPPER_CODE', '') && Configuration::updateValue('DPDFRANCE_PREDICT_CARRIER_ID', '') && Configuration::updateValue('DPDFRANCE_PREDICT_DEPOT_CODE', '') && Configuration::updateValue('DPDFRANCE_PREDICT_SHIPPER_CODE', '') && Configuration::updateValue('DPDFRANCE_CLASSIC_CARRIER_ID', '') && Configuration::updateValue('DPDFRANCE_CLASSIC_DEPOT_CODE', '') && Configuration::updateValue('DPDFRANCE_CLASSIC_SHIPPER_CODE', '') && Configuration::updateValue('DPDFRANCE_WEBTRACE_LOGIN', DPDTools::encrypt('1064')) && Configuration::updateValue('DPDFRANCE_WEBTRACE_PASSWORD', DPDTools::encrypt('Pr2%5sHg')) // API = EPRINT && Configuration::updateValue('DPDFRANCE_API_LOGIN', '') && Configuration::updateValue('DPDFRANCE_API_PASSWORD', '') // API = LEADTIME && Configuration::updateValue('DPDFRANCE_DAY_DEFINITE_MODE', '0') && Configuration::updateValue('DPDFRANCE_LEADTIME_API_KEY', '') // Suppléments && Configuration::updateValue('DPDFRANCE_SUPP_ILES', '') && Configuration::updateValue('DPDFRANCE_SUPP_MONTAGNE', '') && Configuration::updateValue('DPDFRANCE_GOOGLE_API_KEY', '') && Configuration::updateValue('DPDFRANCE_FORMAT_MOD', '') && Configuration::updateValue('DPDFRANCE_PRINTER_CONNECT', '') && Configuration::updateValue('DPDFRANCE_PRINTER_PORT', '') && Configuration::updateValue('DPDFRANCE_PRINTER_IP', '') && Configuration::updateValue('DPDFRANCE_HIDE_NETWORK', '') && Configuration::updateValue('DPDFRANCE_PRINTER_SERIAL', '') && Configuration::updateValue('DPDFRANCE_FORMAT_PRINT', '') && Configuration::updateValue('DPDFRANCE_SERVICE_TYPE', '') && Configuration::updateValue('DPDFRANCE_ETAPE_EXPEDITION', (string)DPDTools::ORDER_STATUS_PROCESSING_IN_PROGRESS) && Configuration::updateValue('DPDFRANCE_ETAPE_EXPEDIEE', (string)DPDTools::ORDER_STATUS_SHIPPED) && Configuration::updateValue('DPDFRANCE_ETAPE_LIVRE', (string)DPDTools::ORDER_STATUS_DELIVERED) && Configuration::updateValue('DPDFRANCE_AD_VALOREM', '') && Configuration::updateValue('DPDFRANCE_AUTO_UPDATE', (string)DPDTools::DPD_AUTOUPDATE_DISABLED) && Configuration::updateValue('DPDFRANCE_MARKETPLACE_MODE', '') && Configuration::updateValue('DPDFRANCE_RETOUR_OPTION', (string)DPDTools::NO_RETURN) && Configuration::updateValue('DPDFRANCE_LAST_TRACKING', ''); } /** * Create Table DPDFRANCE_ORDER, DPDFRANCE_SHIPPING, DPDFRANCE_RELAIS_STORAGE, Alter Column Properties * @return bool * @throws PrestaShopDatabaseException */ public function installConfigDB() { // Creation de la table dpdfrance_order $sqlDPDOrder = ' CREATE TABLE IF NOT EXISTS `' . _DB_PREFIX_ . 'dpdfrance_order` ( `id_order` int(10) unsigned NOT NULL, `id_order_dpd` varchar(20) NOT NULL, # Compatibilité GEOLABEL `id_shipment_number_dpd` varchar(64), `id_retour_order_dpd` varchar(64), `error_message` text, `override_return_street` varchar(35), `override_return_zip` varchar(10), `override_return_city` varchar(35), `override_return_phone` varchar(30), `return_print` tinyint(1), PRIMARY KEY(id_order,id_order_dpd)) ENGINE=' . _MYSQL_ENGINE_ . ' DEFAULT CHARSET=utf8;'; if (!Db::getInstance()->Execute($sqlDPDOrder)) { return false; } // Creation de la table dpdfrance_shipping $sqlDPDShipping = ' CREATE TABLE IF NOT EXISTS `' . _DB_PREFIX_ . 'dpdfrance_shipping` ( `id` int(10) unsigned NULL AUTO_INCREMENT, `id_customer` int(10) unsigned NOT NULL, `id_cart` int(10) unsigned NOT NULL, `id_carrier` int(5) unsigned DEFAULT NULL, `service` varchar(3) DEFAULT NULL, `relay_id` varchar(8) DEFAULT NULL, `company` varchar(32) DEFAULT NULL, `address1` varchar(128) DEFAULT NULL, `address2` varchar(128) DEFAULT NULL, `postcode` varchar(10) DEFAULT NULL, `city` varchar(100) DEFAULT NULL, `id_country` int(11) DEFAULT NULL, `gsm_dest` varchar(14) DEFAULT NULL, PRIMARY KEY(id_cart)) ENGINE=' . _MYSQL_ENGINE_ . ' DEFAULT CHARSET=utf8;'; if (!Db::getInstance()->Execute($sqlDPDShipping)) { return false; } // Creation de la table dpdfrance_relais_storage $sqlDPDRelais = ' CREATE TABLE IF NOT EXISTS `' . _DB_PREFIX_ . 'dpdfrance_relais_storage` ( `id_cart` INT UNSIGNED NOT NULL, `id_customer` INT UNSIGNED NOT NULL, `search_relay` TEXT NOT NULL, `relay_list` TEXT NOT NULL, PRIMARY KEY (`id_cart`, `id_customer`) ) ENGINE=' . _MYSQL_ENGINE_ . ' DEFAULT CHARSET=utf8;'; if (!Db::getInstance()->Execute($sqlDPDRelais)) { return false; } if (DPDCompliancy::isMyPrestashopVersion('<', '8.0.0')) { // Alteration de la colonne shipping_number de 32 a 64 chars // Celle-ci n'existe plus à partir de la version 8 et était dépréciée en 1.7. $sqlDPDAlterationTable = 'ALTER TABLE ' . _DB_PREFIX_ . 'orders CHANGE `shipping_number` `shipping_number` VARCHAR(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL'; if (!Db::getInstance()->Execute($sqlDPDAlterationTable)) { return false; } } // Modification des caractéristiques des colonnes de la table dpdfrance_order $this->updateSql(); // Recuperation d'un ou des zones géographiques ayant le mot "France" $resGetZone = DPDTools::getAllFranceZones(); // Si aucune zone ayant le mot "France", on crée la zone "France", on l'active, puis on assigne le pays a la France if (empty($resGetZone)) { DPDTools::createFranceZone(); } // #29526 Règle retenue : on crée la zone si elle n'existe pas. C'est tout. // On ne touche à rien de la configuration du propriétaire de la boutique. //$id_zone_france = []; //if (!empty($resGetZone)) { // // Si plusieurs zones avec France // foreach ($resGetZone as $zone) { // $id_zone_france[] = $zone['id_zone']; // } // // // Affectation de la zone France au pays France et active le pays // $sqlUpdateCountryZone = Db::getInstance()->update( // 'country', // ['id_zone' => $id_zone_france], // 'iso_code = "FR" and active = 1' // ); // if (!$sqlUpdateCountryZone) { // return false; // } //} return true; } /** * Si un champs est manquant alors modification des caractéristiques des colonnes de la table dpdfrance_order * @return bool * @throws PrestaShopDatabaseException */ protected function updateSql() { $fieldsDescription = [ 'id_order' => ['null' => false, 'type' => 'int(10) unsigned'], 'id_order_dpd' => ['null' => false, 'type' => 'varchar(50)'], 'id_retour_order_dpd' => ['null' => false, 'type' => 'varchar(20)'], 'id_shipment_number_dpd' => ['null' => false, 'type' => 'varchar(50)'], 'error_message' => ['null' => true, 'type' => 'text'], 'override_return_street' => ['null' => true, 'type' => 'varchar(35)'], 'override_return_zip' => ['null' => true, 'type' => 'varchar(10)'], 'override_return_city' => ['null' => true, 'type' => 'varchar(35)'], 'override_return_phone' => ['null' => true, 'type' => 'varchar(30)'], 'return_print' => ['null' => true, 'type' => 'varchar(30)'], ]; $fields = [ 'id_order' => true, 'id_order_dpd' => true, 'id_retour_order_dpd' => true, 'id_shipment_number_dpd' => true, 'error_message' => true, 'override_return_street' => true, 'override_return_zip' => true, 'override_return_city' => true, 'override_return_phone' => true, 'return_print' => true, ]; $sql = 'DESCRIBE ' . _DB_PREFIX_ . 'dpdfrance_order'; $results = Db::getInstance()->executeS($sql); foreach ($results as $field) { if ($fields[$field['Field']]) { $fields[$field['Field']] = false; } } foreach ($fields as $key => $field) { if ($field) { $sql = ' ALTER TABLE ' . _DB_PREFIX_ . 'dpdfrance_order ADD ' . $key . ' ' . $fieldsDescription[$key]['type']; if (!$fieldsDescription[$key]['null']) { $sql .= ' NOT NULL'; } Db::getInstance()->execute($sql); } } return true; } /** * Install Admin Tab * @param string $tab_class * @param string $tab_name * @param false|int $id_tab_parent * @return bool */ protected function installModuleTab($tab_class, $tab_name, $id_tab_parent) { $tab = new Tab(); $languages = Language::getLanguages(false); foreach ($languages as $language) { $tab->name[$language['id_lang']] = $tab_name; } $tab->class_name = $tab_class; $tab->module = $this->name; $tab->id_parent = $id_tab_parent; return $tab->save(); } // UPDATE /** * Update Admin DPD Tab * @return void * @throws PrestaShopDatabaseException * @throws PrestaShopException */ public function updateModuleTab() { // On supprime les onglets du backoffice $this->uninstallModuleTab('AdminDPDFrance'); $this->uninstallModuleTab('AdminDPDFranceReturn'); // On recrée ces onglets $this->installModuleTab('AdminDPDFrance', 'DPD France livraison', Tab::getInstanceFromClassName('AdminParentOrders')->id); $this->installModuleTab('AdminDPDFranceReturn', 'DPD France retour', Tab::getInstanceFromClassName('AdminParentOrders')->id); } // UNINSTALL /** * Uninstall Module , Uninstall DPD Admin tab, DPD configuration * @return bool * @throws PrestaShopDatabaseException * @throws PrestaShopException */ public function uninstall() { return !( !parent::uninstall() || !$this->uninstallModuleTab('AdminDPDFrance') || !$this->uninstallModuleTab('AdminDPDFranceReturn') || !Configuration::deleteByName('DPDFRANCE_NOM_EXP') || !Configuration::deleteByName('DPDFRANCE_ADDRESS_EXP') || !Configuration::deleteByName('DPDFRANCE_ADDRESS2_EXP') || !Configuration::deleteByName('DPDFRANCE_CP_EXP') || !Configuration::deleteByName('DPDFRANCE_VILLE_EXP') || !Configuration::deleteByName('DPDFRANCE_TEL_EXP') || !Configuration::deleteByName('DPDFRANCE_EMAIL_EXP') || !Configuration::deleteByName('DPDFRANCE_GSM_EXP') || !Configuration::deleteByName('DPDFRANCE_RELAIS_CARRIER_ID') || !Configuration::deleteByName('DPDFRANCE_RELAIS_DEPOT_CODE') || !Configuration::deleteByName('DPDFRANCE_RELAIS_SHIPPER_CODE') || !Configuration::deleteByName('DPDFRANCE_PREDICT_CARRIER_ID') || !Configuration::deleteByName('DPDFRANCE_PREDICT_DEPOT_CODE') || !Configuration::deleteByName('DPDFRANCE_PREDICT_SHIPPER_CODE') || !Configuration::deleteByName('DPDFRANCE_CLASSIC_CARRIER_ID') || !Configuration::deleteByName('DPDFRANCE_CLASSIC_DEPOT_CODE') || !Configuration::deleteByName('DPDFRANCE_CLASSIC_SHIPPER_CODE') || !Configuration::deleteByName('DPDFRANCE_RELAIS_MYPUDO_URL') || !Configuration::deleteByName('DPDFRANCE_API_LOGIN') || !Configuration::deleteByName('DPDFRANCE_API_PASSWORD') || !Configuration::deleteByName('DPDFRANCE_WEBTRACE_LOGIN') || !Configuration::deleteByName('DPDFRANCE_WEBTRACE_PASSWORD') || !Configuration::deleteByName('DPDFRANCE_DAY_DEFINITE_MODE') || !Configuration::deleteByName('DPDFRANCE_LEADTIME_API_KEY') || !Configuration::deleteByName('DPDFRANCE_SUPP_ILES') || !Configuration::deleteByName('DPDFRANCE_SUPP_MONTAGNE') || !Configuration::deleteByName('DPDFRANCE_GOOGLE_API_KEY') || !Configuration::deleteByName('DPDFRANCE_FORMAT_MOD') || !Configuration::deleteByName('DPDFRANCE_PRINTER_CONNECT') || !Configuration::deleteByName('DPDFRANCE_PRINTER_PORT') || !Configuration::deleteByName('DPDFRANCE_PRINTER_IP') || !Configuration::deleteByName('DPDFRANCE_HIDE_NETWORK') || !Configuration::deleteByName('DPDFRANCE_PRINTER_SERIAL') || !Configuration::deleteByName('DPDFRANCE_FORMAT_PRINT') || !Configuration::deleteByName('DPDFRANCE_SERVICE_TYPE') || !Configuration::deleteByName('DPDFRANCE_ETAPE_EXPEDITION') || !Configuration::deleteByName('DPDFRANCE_ETAPE_EXPEDIEE') || !Configuration::deleteByName('DPDFRANCE_ETAPE_LIVRE') || !Configuration::deleteByName('DPDFRANCE_AUTO_UPDATE') || !Configuration::deleteByName('DPDFRANCE_MARKETPLACE_MODE') || !Configuration::deleteByName('DPDFRANCE_AD_VALOREM') || !Configuration::deleteByName('DPDFRANCE_RETOUR_OPTION') || !Configuration::deleteByName('DPDFRANCE_DATA_SENT') || !Configuration::deleteByName('DPDFRANCE_LAST_TRACKING') || !Configuration::deleteByName('DPDFRANCE_PARAM') ); } /** * Delete DPD Admin Tab * @param $tab_class * @return bool * @throws PrestaShopDatabaseException * @throws PrestaShopException */ protected function uninstallModuleTab($tab_class) { $tab = Tab::getInstanceFromClassName($tab_class); if (!Validate::isLoadedObject($tab)) { // N'existe déjà plus return true; } return $tab->delete(); } // ADMIN MODULE CONFIGURATION PAGE /** * [BACK OFFICE - SETUP] Method used to display the Settings option of DPD. * @return string * @throws PrestaShopDatabaseException * @throws PrestaShopException */ public function getContent() { // Load dependencies $this->loadAsset(); $output = '

' . $this->displayName . '

'; // BEGINNING DPD DELIVERY OPTIONS // DPD Relais carrier creation if (Tools::isSubmit('submitCreateCarrierRelais')) { $this->createCarrier($this->configCarrierRelais, 'relais'); $output .= '
' . $this->l('DPD Relais carrier created') . '
'; $output .= ''; } // DPD Predict carrier creation if (Tools::isSubmit('submitCreateCarrierPredict')) { $this->createCarrier($this->configCarrierPredict, 'predict'); $output .= '
' . $this->l('Predict carrier created') . '
'; $output .= ''; } // DPD Classic carrier creation if (Tools::isSubmit('submitCreateCarrierClassic')) { $this->createCarrier($this->configCarrierClassic, 'classic'); $output .= '
' . $this->l('Classic carrier created') . '
'; $output .= ''; } // DPD Intercontinental carrier creation if (Tools::isSubmit('submitCreateCarrierWorld')) { $this->createCarrier($this->configCarrierWorld, 'world'); $output .= '
' . $this->l('Intercontinental carrier created') . '
'; $output .= ''; } // END DPD DELIVERY OPTIONS // * SUBMIT ALL FORM if (Tools::isSubmit('submitRcReferer')) { // Vos données d'expéditeur DPDConfig::updateValue('DPDFRANCE_NOM_EXP', Tools::getValue('nom_exp')); DPDConfig::updateValue('DPDFRANCE_ADDRESS_EXP', Tools::getValue('address_exp')); DPDConfig::updateValue('DPDFRANCE_ADDRESS2_EXP', Tools::getValue('address2_exp')); DPDConfig::updateValue('DPDFRANCE_CP_EXP', Tools::getValue('cp_exp')); DPDConfig::updateValue('DPDFRANCE_VILLE_EXP', Tools::getValue('ville_exp')); DPDConfig::updateValue('DPDFRANCE_TEL_EXP', Tools::getValue('tel_exp')); DPDConfig::updateValue('DPDFRANCE_EMAIL_EXP', Tools::getValue('email_exp')); DPDConfig::updateValue('DPDFRANCE_GSM_EXP', Tools::getValue('gsm_exp')); // Services de livraison // DPD Relais carrier reassignment if ((int)Tools::getValue('dpdfrance_relais_carrier_id') !== DPDConfig::get('DPDFRANCE_RELAIS_CARRIER_ID')) { // Le Log ID DPD Relais est mis à jour automatiquement dans la fonction DPDConfig::updateValue() DPDConfig::updateValue('DPDFRANCE_RELAIS_CARRIER_ID', Tools::getValue('dpdfrance_relais_carrier_id')); $this->reaffectationCarrier(DPDConfig::get('DPDFRANCE_RELAIS_CARRIER_ID')); } DPDConfig::updateValue('DPDFRANCE_RELAIS_DEPOT_CODE', Tools::getValue('relais_depot_code')); DPDConfig::updateValue('DPDFRANCE_RELAIS_SHIPPER_CODE', Tools::getValue('relais_shipper_code')); // DPD Predict carrier reassignment if ((int)Tools::getValue('dpdfrance_predict_carrier_id') !== DPDConfig::get('DPDFRANCE_PREDICT_CARRIER_ID')) { // Le Log ID DPD Predict est mis à jour automatiquement dans la fonction DPDConfig::updateValue() DPDConfig::updateValue('DPDFRANCE_PREDICT_CARRIER_ID', Tools::getValue('dpdfrance_predict_carrier_id')); $this->reaffectationCarrier(DPDConfig::get('DPDFRANCE_PREDICT_CARRIER_ID')); } DPDConfig::updateValue('DPDFRANCE_PREDICT_DEPOT_CODE', Tools::getValue('predict_depot_code')); DPDConfig::updateValue('DPDFRANCE_PREDICT_SHIPPER_CODE', Tools::getValue('predict_shipper_code')); // DPD Classic carrier reassignment if ((int)Tools::getValue('dpdfrance_classic_carrier_id') !== DPDConfig::get('DPDFRANCE_CLASSIC_CARRIER_ID')) { // Le Log ID DPD Classic est mis à jour automatiquement dans la fonction DPDConfig::updateValue() DPDConfig::updateValue('DPDFRANCE_CLASSIC_CARRIER_ID', Tools::getValue('dpdfrance_classic_carrier_id')); $this->reaffectationCarrier(DPDConfig::get('DPDFRANCE_CLASSIC_CARRIER_ID')); } DPDConfig::updateValue('DPDFRANCE_CLASSIC_DEPOT_CODE', Tools::getValue('classic_depot_code')); DPDConfig::updateValue('DPDFRANCE_CLASSIC_SHIPPER_CODE', Tools::getValue('classic_shipper_code')); // Réglages avancés DPDConfig::updateValue('DPDFRANCE_RELAIS_MYPUDO_URL', Tools::getValue('mypudo_url')); DPDConfig::updateValue('DPDFRANCE_SUPP_ILES', Tools::getValue('supp_iles')); DPDConfig::updateValue('DPDFRANCE_SUPP_MONTAGNE', Tools::getValue('supp_montagne')); // On ne met la valeur des clés à jour que si elles on étaient saisies if (!in_array(trim(Tools::getValue('google_api_key')), ['', false])) { DPDConfig::updateValue('DPDFRANCE_GOOGLE_API_KEY', Tools::getValue('google_api_key')); } DPDConfig::updateValue('DPDFRANCE_DAY_DEFINITE_MODE', Tools::getValue('day_definite_mode')); if (!in_array(trim(Tools::getValue('leadtime_api_key')), ['', false])) { DPDConfig::updateValue('DPDFRANCE_LEADTIME_API_KEY', Tools::getValue('leadtime_api_key')); } DPDConfig::updateValue('DPDFRANCE_API_LOGIN', Tools::getValue('api_login')); // On ne met la valeur de mot de passe à jour que si elle a été saisie if (!in_array(trim(Tools::getValue('api_password')), ['', false])) { DPDConfig::updateValue('DPDFRANCE_API_PASSWORD', Tools::getValue('api_password')); } if (!empty(trim(Tools::getValue('webtrace_login')))) { DPDConfig::updateValue('DPDFRANCE_WEBTRACE_LOGIN', Tools::getValue('webtrace_login')); } if (!empty(trim(Tools::getValue('webtrace_password')))) { DPDConfig::updateValue('DPDFRANCE_WEBTRACE_PASSWORD', Tools::getValue('webtrace_password')); } // Si la personne a joué avec le formulaire login Webtrace et password Webtrace if (empty(trim(Tools::getValue('webtrace_login'))) && empty(trim(Tools::getValue('webtrace_password')))) { DPDConfig::updateValue('DPDFRANCE_WEBTRACE_LOGIN', '1064'); DPDConfig::updateValue('DPDFRANCE_WEBTRACE_PASSWORD', 'Pr2%5sHg'); } // Gestion des expeditions DPDConfig::updateValue('DPDFRANCE_ETAPE_EXPEDITION', Tools::getValue('id_expedition')); DPDConfig::updateValue('DPDFRANCE_ETAPE_EXPEDIEE', Tools::getValue('id_expedie')); DPDConfig::updateValue('DPDFRANCE_ETAPE_LIVRE', Tools::getValue('id_livre')); if ((int)Tools::getValue('auto_update') !== DPDConfig::get('DPDFRANCE_AUTO_UPDATE')) { DPDConfig::updateValue('DPDFRANCE_AUTO_UPDATE', Tools::getValue('auto_update')); $this->setTrackingURLs(DPDConfig::get('DPDFRANCE_AUTO_UPDATE')); } DPDConfig::updateValue('DPDFRANCE_MARKETPLACE_MODE', Tools::getValue('marketplace_mode')); DPDConfig::updateValue('DPDFRANCE_AD_VALOREM', Tools::getValue('ad_valorem')); DPDConfig::updateValue('DPDFRANCE_RETOUR_OPTION', Tools::getValue('retour')); DPDConfig::updateValue('DPDFRANCE_SERVICE_TYPE', Tools::getValue('service_type')); DPDConfig::updateValue('DPDFRANCE_PRINTER_CONNECT', Tools::getValue('format_printer_connect')); DPDConfig::updateValue('DPDFRANCE_PRINTER_PORT', Tools::getValue('format_printer_port')); DPDConfig::updateValue('DPDFRANCE_PRINTER_IP', Tools::getValue('format_printer_ip')); DPDConfig::updateValue('DPDFRANCE_HIDE_NETWORK', Tools::getValue('format_hide_network')); DPDConfig::updateValue('DPDFRANCE_PRINTER_SERIAL', Tools::getValue('format_printer_serial')); // Gestion des extensions autorisées à l'aide d'une "liste blanche" switch (trim(Tools::getValue('format_mod'))) { case 'zpl': case 'epl': case 'pdf': DPDConfig::updateValue('DPDFRANCE_FORMAT_MOD', Tools::getValue('format_mod')); break; default: DPDConfig::updateValue('DPDFRANCE_FORMAT_MOD', 'pdf'); } DPDConfig::updateValue('DPDFRANCE_FORMAT_PRINT', Tools::getValue('format_print')); DPDConfig::updateValue('DPDFRANCE_PARAM', true); $output .= '
' . $this->l('Settings updated') . '
'; } return $output . $this->displayForm(); } /** * [BACK OFFICE - SETUP] Module configuration page - FORM */ protected function displayForm() { // Check if PHP SOAP AND XML extensions is loaded if (!extension_loaded('soap') || !extension_loaded('xml') || !extension_loaded('curl')) { if (!extension_loaded('soap')) { echo '
' . $this->l('Warning! The PHP extension SOAP is not installed on this server. You must activate it in order to use the DPD plugin') . '
'; } if (!extension_loaded('xml')) { echo '
' . $this->l('Warning! The PHP extension XML is not installed on this server. You must activate it in order to use the DPD plugin') . '
'; } if (!extension_loaded('curl')) { echo '
' . $this->l('Warning! The PHP extension CURL is not installed on this server. You must activate it in order to use the DPD plugin') . '
'; } return false; } $optionAutoUpdate = [ $this->l('Disabled'), $this->l('Enabled - Tracking links by reference'), $this->l('Enabled - Tracking links by parcel no.'), $this->l('Enabled - Tracking links by id order'), ]; $optionMarketPlace = $optionDayDefinite = [ $this->l('Disabled'), $this->l('Enabled'), ]; $optionVd = [ $this->l('Integrated parcel insurance service (33 € / kg)'), $this->l('Ad Valorem insurance service'), ]; $optionRetour = [ '0' => $this->l('No returns'), '4' => $this->l('Prepared'), '3' => $this->l('On Demand'), ]; $id_lang = Context::getContext()->language->id; $docPath = $this->getDocsPath() . 'readme_dpdfrance_prestashop.pdf'; // Generate variables to check if dpd configuration is already registered in database for these options. $dpdfranceGoogle = Configuration::get('DPDFRANCE_GOOGLE_API_KEY') ? true : ''; $dpdfranceLeadtime = Configuration::get('DPDFRANCE_LEADTIME_API_KEY') ? true : ''; $dpdfranceApi = Configuration::get('DPDFRANCE_API_PASSWORD') ? true : ''; $dpdfranceWebtrace = Configuration::get('DPDFRANCE_WEBTRACE_PASSWORD') ? true : ''; // Send variable to Smarty $this->context->smarty->assign([ 'is_debug' => DPDFRANCE_DEV_MODE, 'js_path' => $this->getJsPath(), 'css_path' => $this->getCssPath(), 'docs_path' => $docPath, 'img_path' => $this->getImgPath(), 'nom_exp' => Tools::getValue('nom_exp', DPDConfig::get('DPDFRANCE_NOM_EXP')), 'address_exp' => Tools::getValue('address_exp', DPDConfig::get('DPDFRANCE_ADDRESS_EXP')), 'address2_exp' => Tools::getValue('address2_exp', DPDConfig::get('DPDFRANCE_ADDRESS2_EXP')), 'cp_exp' => Tools::getValue('cp_exp', DPDConfig::get('DPDFRANCE_CP_EXP')), 'ville_exp' => Tools::getValue('ville_exp', DPDConfig::get('DPDFRANCE_VILLE_EXP')), 'tel_exp' => Tools::getValue('tel_exp', DPDConfig::get('DPDFRANCE_TEL_EXP')), 'email_exp' => Tools::getValue('email_exp', DPDConfig::get('DPDFRANCE_EMAIL_EXP')), 'gsm_exp' => Tools::getValue('gsm_exp', DPDConfig::get('DPDFRANCE_GSM_EXP')), // On affichera les depot_code sur 3 digits dans le formulaire 'relais_depot_code' => sprintf('%03d', Tools::getValue('relais_depot_code', DPDConfig::get('DPDFRANCE_RELAIS_DEPOT_CODE'))), 'predict_depot_code' => sprintf('%03d', Tools::getValue('predict_depot_code', DPDConfig::get('DPDFRANCE_PREDICT_DEPOT_CODE'))), 'classic_depot_code' => sprintf('%03d', Tools::getValue('classic_depot_code', DPDConfig::get('DPDFRANCE_CLASSIC_DEPOT_CODE'))), 'relais_shipper_code' => Tools::getValue('relais_shipper_code', DPDConfig::get('DPDFRANCE_RELAIS_SHIPPER_CODE')), 'predict_shipper_code' => Tools::getValue('predict_shipper_code', DPDConfig::get('DPDFRANCE_PREDICT_SHIPPER_CODE')), 'classic_shipper_code' => Tools::getValue('classic_shipper_code', DPDConfig::get('DPDFRANCE_CLASSIC_SHIPPER_CODE')), 'carriers' => Carrier::getCarriers($id_lang, false, false, false, null, (defined('ALL_CARRIERS') ? ALL_CARRIERS : null)), 'dpdfrance_relais_carrier_id' => Tools::getValue('dpdfrance_relais_carrier_id', DPDConfig::get('DPDFRANCE_RELAIS_CARRIER_ID')), 'dpdfrance_predict_carrier_id' => Tools::getValue('dpdfrance_predict_carrier_id', DPDConfig::get('DPDFRANCE_PREDICT_CARRIER_ID')), 'dpdfrance_classic_carrier_id' => Tools::getValue('dpdfrance_classic_carrier_id', DPDConfig::get('DPDFRANCE_CLASSIC_CARRIER_ID')), 'mypudo_url' => Tools::getValue('mypudo_url', DPDConfig::get('DPDFRANCE_RELAIS_MYPUDO_URL')), 'format_mod' => Tools::getValue('format_mod', DPDConfig::get('DPDFRANCE_FORMAT_MOD')), 'format_printer_connect' => Tools::getValue('format_printer_connect', DPDConfig::get('DPDFRANCE_PRINTER_CONNECT')), 'format_printer_port' => Tools::getValue('format_printer_port', DPDConfig::get('DPDFRANCE_PRINTER_PORT')), 'format_printer_ip' => Tools::getValue('format_printer_ip', DPDConfig::get('DPDFRANCE_PRINTER_IP')), 'format_hide_network' => Tools::getValue('format_hide_network', DPDConfig::get('DPDFRANCE_HIDE_NETWORK')), 'format_printer_serial' => Tools::getValue('format_printer_serial', DPDConfig::get('DPDFRANCE_PRINTER_SERIAL')), 'format_print' => Tools::getValue('format_print', DPDConfig::get('DPDFRANCE_FORMAT_PRINT')), 'service_type' => Tools::getValue('service_type', DPDConfig::get('DPDFRANCE_SERVICE_TYPE')), 'supp_iles' => Tools::getValue('supp_iles', DPDConfig::get('DPDFRANCE_SUPP_ILES')), 'supp_montagne' => Tools::getValue('supp_montagne', DPDConfig::get('DPDFRANCE_SUPP_MONTAGNE')), 'dpdfrance_google' => $dpdfranceGoogle, 'dpdfrance_leadtime' => $dpdfranceLeadtime, 'dpdfrance_api' => $dpdfranceApi, 'dpdfrance_webtrace' => $dpdfranceWebtrace, // On ne renvoie pas les mots de passe enregistrés dans le front pour empêcher leur récupération par un tiers. // Eprint 'api_login' => Tools::getValue('api_login', DPDConfig::get('DPDFRANCE_API_LOGIN')), // Webtrace 'webtrace_login' => Tools::getValue('webtrace_login', DPDConfig::get('DPDFRANCE_WEBTRACE_LOGIN') !== '1064' ? DPDConfig::get('DPDFRANCE_WEBTRACE_LOGIN') : '' ), 'etats_factures' => OrderState::getOrderStates($id_lang), 'dpdfrance_etape_expedition' => Tools::getValue('id_expedition', DPDConfig::get('DPDFRANCE_ETAPE_EXPEDITION')), 'dpdfrance_etape_expediee' => Tools::getValue('id_expedie', DPDConfig::get('DPDFRANCE_ETAPE_EXPEDIEE')), 'dpdfrance_etape_livre' => Tools::getValue('id_livre', DPDConfig::get('DPDFRANCE_ETAPE_LIVRE')), 'auto_update' => Tools::getValue('auto_update', DPDConfig::get('DPDFRANCE_AUTO_UPDATE')), 'marketplace_mode' => Tools::getValue('marketplace_mode', DPDConfig::get('DPDFRANCE_MARKETPLACE_MODE') ? '1' : '0'), 'day_definite_mode' => Tools::getValue('day_definite_mode', DPDConfig::get('DPDFRANCE_DAY_DEFINITE_MODE') ? '1' : '0'), 'dpdfrance_ad_valorem' => Tools::getValue('ad_valorem', DPDConfig::get('DPDFRANCE_AD_VALOREM') ? '1' : '0'), 'dpdfrance_retour_option' => Tools::getValue('retour', DPDConfig::get('DPDFRANCE_RETOUR_OPTION')), 'cron_url' => $this->context->shop->getBaseURL(true).'modules/dpdfrance/cron.php?token='.urlencode(Tools::passwdHash('dpdfrance-cron')), // Options des