array( 'name' => 'GLS Chez vous', 'delay' => array('fr' => 'Colis livré en 24h à 48h.'), 'grade' => 9, ), 'GLSRELAIS' => array( 'name' => 'GLS Point Relais®', 'delay' => array('fr' => 'Retrait en Point Relais® de votre choix. Vous êtes informé par E-mail ou SMS de l\'arrivé de votre colis.'), 'grade' => 9, ), 'GLSCHEZVOUSPLUS' => array( 'name' => 'GLS Chez vous +', 'delay' => array('fr' => 'Vous êtes prévenus par mail et SMS de la date et du créneau horaire de livraison.'), 'grade' => 9, ), 'GLS13H' => array( 'name' => 'GLS avant 13h', 'delay' => array('fr' => 'Livraison Express en 24H en France métropolitaine, remise en mains propres le lendemain avant 13H.'), 'grade' => 9, ), ); public static $trackingUrl = 'https://gls-group.eu/FR/fr/suivi-colis?match=@'; private static $ftp_host = 'ftp.gls-france.com'; private static $ftp_login = 'addonline'; private static $ftp_pwd = '-mAfXmTqC'; public $importDirectory = ''; /** * Liste des templates de hooks * @var unknown */ private $templates = array ( 'displayCarrierExtraContent' => 'carrier_extra_content.tpl', 'displayOrderDetail' => 'order_detail.tpl', 'displayAfterCarrier' => 'error.tpl', 'displayInfoByCart' => 'info_by_cart.tpl', 'displayWorkingsDay' => 'working_day.tpl' ); /** * Utile pour ne pas afficher certains transporteurs * @var int */ public $id_carrier = null; private static $old_shop_context = array(); public function __construct() { $this->name = 'nkmgls'; $this->tab = 'shipping_logistics'; $this->version = '1.2.1'; $this->author = 'Nukium'; $this->module_key = 'd792bc0479dc21963d46aae4c3fa0dbd'; $this->need_instance = 0; $this->bootstrap = true; if (version_compare(_PS_VERSION_, '1.7.', '<')) { $this->ps_versions_compliancy = array( 'min' => '1.6', 'max' => _PS_VERSION_ ); } else { $this->ps_versions_compliancy = array( 'min' => '1.7.0.0', 'max' => _PS_VERSION_ ); } $this->displayName = $this->l('GLS, your shipping partner'); $this->description = $this->l('Give your customers the choice of the shipping method that suits them.'); parent::__construct(); $this->initialize(); } private function initialize() { $secure_key = Configuration::get('GLS_SECURE_KEY'); if ($secure_key === false) { Configuration::updateValue('GLS_SECURE_KEY', Tools::strtoupper(Tools::passwdGen(16))); } $this->importDirectory = _PS_MODULE_DIR_.$this->name.DIRECTORY_SEPARATOR.'import'.DIRECTORY_SEPARATOR; } public function install() { self::$old_shop_context['type'] = Shop::getContext(); if (Shop::getContext() == Shop::CONTEXT_GROUP) { self::$old_shop_context['id'] = Shop::getContextShopGroupID(true); } else { self::$old_shop_context['id'] = Shop::getContextShopID(true); } if (Shop::isFeatureActive()) { Shop::setContext(Shop::CONTEXT_ALL); } Configuration::updateValue('GLS_GLSRELAIS_XL_ONLY', ''); Configuration::updateValue('GLS_WSLOGIN', ''); Configuration::updateValue('GLS_WSPWD', ''); Configuration::updateValue('GLS_AGENCY_CODE', ''); Configuration::updateValue('GLS_GOOGLE_MAPS_API_KEY', ''); Configuration::updateValue('GLS_GOOGLE_MAPS_API_SCRIPT_ENABLE', '1'); Configuration::updateValue('GLS_ORDER_PREFIX_ENABLE', '1'); Configuration::updateValue('GLS_LAST_SYNCHRO_DATE', date('Y-m-d H:i:s')); Configuration::updateValue('GLS_SYNCHRO_FILE_CONTENT_HASH', ''); Configuration::updateValue('GLS_EXPORT_AUTOMATION', ''); Configuration::updateValue('GLS_EXPORT_NEW_ORDER_STATE', ''); Configuration::updateValue('GLS_EXPORT_ORDER_STATE', ''); Configuration::updateValue('GLS_IMPORT_AUTOMATION', ''); Configuration::updateValue('GLS_IMPORT_NEW_ORDER_STATE', ''); Configuration::updateValue('GLS_API_CUSTOMER_ID', ''); Configuration::updateValue('GLS_API_CONTACT_ID', ''); Configuration::updateValue('GLS_API_DELIVERY_LABEL_FORMAT', 'A6'); Configuration::updateValue('GLS_API_SHOP_RETURN_SERVICE', '0'); Configuration::updateValue('GLS_API_SHOP_RETURN_EMAIL_ALERT', '0'); Configuration::updateValue('GLS_API_LOGIN', ''); Configuration::updateValue('GLS_API_PWD', ''); Configuration::updateValue('GLS_API_SHOP_RETURN_ADDRESS', '1'); foreach (array_keys(self::$carrier_definition) as $key) { Configuration::updateValue('GLS_'.$key.'_ID', ''); Configuration::updateValue('GLS_'.$key.'_LOG', ''); } $installDB = $this->installDBConfig(); // On a reinit le context initial pour la création des transporteurs if (Shop::isFeatureActive()) { Shop::setContext(Shop::CONTEXT_ALL); } return parent::install() && $installDB && AdminGlsOrderController::installInBO() && AdminGlsLabelController::installInBO() && AdminGlsAjaxController::installInBO() && $this->registerHook('displayBackOfficeHeader') && $this->registerHook('actionAdminControllerSetMedia') && $this->registerHook('actionFrontControllerSetMedia') && $this->registerHook('displayHeader') && $this->registerHook('displayCarrierExtraContent') && $this->registerHook('actionCarrierUpdate') && $this->registerHook('actionObjectCarrierUpdateAfter') && $this->registerHook('displayOrderDetail') && $this->registerHook('displayAfterCarrier') && $this->registerHook('actionValidateStepComplete') && $this->registerHook('actionValidateOrder') && $this->registerHook('actionCarrierProcess') && $this->registerHook('registerGDPRConsent') && $this->registerHook('actionDeleteGDPRCustomer') && $this->registerHook('actionObjectCustomerDeleteAfter') && $this->registerHook('actionExportGDPRData'); } public function uninstall() { Configuration::deleteByName('GLS_GLSRELAIS_XL_ONLY'); Configuration::deleteByName('GLS_WSLOGIN'); Configuration::deleteByName('GLS_WSPWD'); Configuration::deleteByName('GLS_AGENCY_CODE'); Configuration::deleteByName('GLS_GOOGLE_MAPS_API_KEY'); Configuration::deleteByName('GLS_GOOGLE_MAPS_API_SCRIPT_ENABLE'); Configuration::deleteByName('GLS_ORDER_PREFIX_ENABLE'); Configuration::deleteByName('GLS_LAST_SYNCHRO_DATE'); Configuration::deleteByName('GLS_SYNCHRO_FILE_CONTENT_HASH'); Configuration::deleteByName('GLS_SECURE_KEY'); Configuration::deleteByName('GLS_EXPORT_AUTOMATION'); Configuration::deleteByName('GLS_EXPORT_NEW_ORDER_STATE'); Configuration::deleteByName('GLS_EXPORT_ORDER_STATE'); Configuration::deleteByName('GLS_IMPORT_AUTOMATION'); Configuration::deleteByName('GLS_IMPORT_NEW_ORDER_STATE'); Configuration::deleteByName('GLS_API_CUSTOMER_ID'); Configuration::deleteByName('GLS_API_CONTACT_ID'); Configuration::deleteByName('GLS_API_DELIVERY_LABEL_FORMAT'); Configuration::deleteByName('GLS_API_SHOP_RETURN_SERVICE'); Configuration::deleteByName('GLS_API_SHOP_RETURN_EMAIL_ALERT'); Configuration::deleteByName('GLS_API_LOGIN'); Configuration::deleteByName('GLS_API_PWD'); Configuration::deleteByName('GLS_API_SHOP_RETURN_ADDRESS'); Configuration::deleteByName('GLS_API_SHOP_RETURN_ADDRESS_NAME'); Configuration::deleteByName('GLS_API_SHOP_RETURN_ADDRESS_ADDRESS1'); Configuration::deleteByName('GLS_API_SHOP_RETURN_ADDRESS_ADDRESS2'); Configuration::deleteByName('GLS_API_SHOP_RETURN_ADDRESS_POSTCODE'); Configuration::deleteByName('GLS_API_SHOP_RETURN_ADDRESS_CITY'); Configuration::deleteByName('GLS_API_SHOP_RETURN_ADDRESS_COUNTRY'); foreach (array_keys(self::$carrier_definition) as $key) { // Il faut conserver LOG pour l'historique des commandes $gls_carrier_id = Configuration::get('GLS_'.$key.'_ID'); if (!empty($gls_carrier_id)) { $history_log = explode('|', Configuration::get('GLS_'.$key.'_LOG')); $history_log[] = $gls_carrier_id; Configuration::updateValue('GLS_'.$key.'_LOG', implode('|', array_map('intval', $history_log))); // désactivation du transporteur anciennement associé if (Validate::isLoadedObject($object = new Carrier((int)$gls_carrier_id))) { $object->active = false; $object->update(); } } $gls_carrier_id = Configuration::deleteByName('GLS_'.$key.'_ID'); } return parent::uninstall() && Db::getInstance()->Execute('DROP TABLE IF EXISTS `'._DB_PREFIX_.'gls_agency_postcode`') && GlsLogClass::removeDbTable() && AdminGlsOrderController::removeFromBO() && AdminGlsLabelController::removeFromBO() && AdminGlsAjaxController::removeFromBO(); } private function installDBConfig() { //__ Création d'une table sauvegardant les points relais sélectionnés au moment de la commande if (!Db::getInstance()->Execute('CREATE TABLE IF NOT EXISTS `' . _DB_PREFIX_ . 'gls_cart_carrier` ( `id_cart` int(10) UNSIGNED NOT NULL DEFAULT \'0\', `id_customer` int(10) unsigned NOT NULL DEFAULT \'0\', `id_carrier` int(10) UNSIGNED NOT NULL DEFAULT \'0\', `gls_product` varchar(255) NOT NULL, `parcel_shop_id` varchar(255) DEFAULT NULL, `name` varchar(255) DEFAULT NULL, `address1` varchar(255) DEFAULT NULL, `address2` varchar(255) DEFAULT NULL, `postcode` varchar(255) DEFAULT NULL, `city` varchar(255) DEFAULT NULL, `phone` varchar(255) DEFAULT NULL, `phone_mobile` varchar(255) DEFAULT NULL, `customer_phone_mobile` varchar(255) NOT NULL, `id_country` int(10) unsigned DEFAULT NULL, `parcel_shop_working_day` TEXT DEFAULT NULL, PRIMARY KEY (`id_cart`,`id_customer`) ) ENGINE=' . _MYSQL_ENGINE_ . ' DEFAULT CHARSET=utf8;')) { return false; } //__ Création d'une table contenant la restriction par codes postaux et code agence GLS pour le sevice de livraison avant 13H if (Db::getInstance()->Execute('CREATE TABLE IF NOT EXISTS `' . _DB_PREFIX_ . 'gls_agency_postcode` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `agency_code` varchar(255) NOT NULL, `postcode_start` varchar(5) NOT NULL, `postcode_end` varchar(5) NOT NULL, PRIMARY KEY (`id`), KEY `agency_code` (`agency_code`) ) ENGINE=' . _MYSQL_ENGINE_ . ' DEFAULT CHARSET=utf8;')) { // File parsing $csv_file = new NkmCSVReader(); $csv_content = $csv_file->parse_file($this->importDirectory.'tbzipdeltimes.csv', false, true); $this->synchronizeAgencyPostcodeRestriction(true, $csv_content); } else { return false; } //__ table des logs if (!GlsLogClass::createDbTable()) { return false; } //__ Création d'une zone France si innexistante $sql = new DbQuery(); $sql->select('z.`id_zone`') ->from('zone', 'z') ->where('z.`name` LIKE \'%France%\''); $id_zone_france = Db::getInstance()->getValue($sql); if (!$id_zone_france) { $zone = new Zone(); $zone->name = 'France'; $zone->active = true; if (!$zone->add()) { $this->_errors[] = $this->l('Impossible to create carrier zone France.'); return false; } $id_zone_france = $zone->id; } $id_country_france = Country::getByIso('FR'); if (!$id_country_france) { $this->_errors[] = $this->l('Country FR not found.'); return false; } //__ Vérification que le pays est bien dans la zone sinon insertion $old_id_zone_france = Country::getIdZone($id_country_france); if ($id_zone_france != $old_id_zone_france) { $country = new Country(); $country->affectZoneToSelection(array($id_country_france), $id_zone_france); //__ Reconfiguration de cette zone sur les autres modes de livraison livrant en France $sql = new DbQuery(); $sql->select('c.*') ->from('carrier', 'c') ->leftJoin('carrier_zone', 'cz', 'cz.`id_carrier` = c.`id_carrier`') ->leftJoin('zone', 'z', 'z.`id_zone` = '.(int)$old_id_zone_france) ->where('c.`active` = 1') ->where('cz.`id_zone` = '.(int) $old_id_zone_france) ->where('z.`active` = 1'); foreach (Db::getInstance()->executeS($sql) as $value) { $sql = new DbQuery(); $sql->select('*') ->from('carrier_zone') ->where('`id_carrier` = '.(int) $value['id_carrier']) ->where('`id_zone` = '.(int) $id_zone_france); if (!Db::getInstance()->getValue($sql)) { Db::getInstance()->execute('INSERT INTO `'._DB_PREFIX_.'carrier_zone` (`id_carrier`, `id_zone`) VALUES ('.(int) $value['id_carrier'].', '.(int) $id_zone_france.')'); // Copy existing ranges price to new zone if non exist Db::getInstance()->execute(' INSERT INTO `'._DB_PREFIX_.'delivery` (`id_carrier`, `id_shop`, `id_shop_group`, `id_range_price`, `id_range_weight`, `id_zone`, `price`) ( SELECT '.(int) $value['id_carrier'].', `id_shop`, `id_shop_group`, `id_range_price`, `id_range_weight`, '.(int) $id_zone_france.', `price` FROM `'._DB_PREFIX_.'delivery` WHERE `id_carrier` = '.(int) $value['id_carrier'].' AND `id_zone` = '.(int) $old_id_zone_france.' ) '); } } } //__ Création des transporteurs GLS $create_carrier = true; foreach (self::$carrier_definition as $key => $value) { $create_carrier &= $this->createCarrier($key, $id_zone_france); } return $create_carrier; } /** * Load the configuration form */ public function getContent() { $output = null; /** * If values have been submitted in the form, process. */ if ((bool)Tools::isSubmit('submit'.$this->name) === true) { $output = $this->postProcess(); } //__ Use for documentations links if (in_array($this->context->language->iso_code, self::$lang_doc)) { $this->context->smarty->assign('iso_lang', $this->context->language->iso_code); } else { $this->context->smarty->assign('iso_lang', 'en'); } $this->context->smarty->assign(array( 'ps_version' => $this->getPrestaShopVersion(), 'order_link' => $this->context->link->getAdminLink('AdminGlsOrder'), 'label_link' => $this->context->link->getAdminLink('AdminGlsLabel'), 'carrier_link' => $this->context->link->getAdminLink('AdminCarriers'), )); $header = $this->context->smarty->fetch($this->local_path . 'views/templates/admin/configure_header.tpl'); $footer = $this->context->smarty->fetch($this->local_path . 'views/templates/admin/configure.tpl'); return $output . $header . $this->renderForm() . $this->renderLog() . $footer; } protected function renderForm() { $helper = new HelperForm(); $helper->show_toolbar = false; $helper->table = $this->table; $helper->module = $this; $lang = new Language((int) Configuration::get('PS_LANG_DEFAULT')); $helper->default_form_language = $lang->id; $helper->allow_employee_form_lang = Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG', 0); $helper->identifier = $this->identifier; $helper->submit_action = 'submit' . $this->name; $helper->currentIndex = $this->context->link->getAdminLink('AdminModules', false).'&configure='. $this->name.'&tab_module='.$this->tab.'&module_name='.$this->name; $helper->token = Tools::getAdminTokenLite('AdminModules'); $helper->title = $this->l('Configure carriers'); $helper->tpl_vars = array( 'fields_value' => $this->getConfigFormValues(), /* Add values for your inputs */ 'languages' => $this->context->controller->getLanguages(), 'id_language' => $this->context->language->id, 'ajax_uri' => $this->context->link->getAdminLink('AdminGlsAjax').'&ajax=1&action=createCarrier', ); return $helper->generateForm($this->getConfigForm()); } public function renderLog() { $helper = $this->initList(); if (Tools::getIsset('submitReset'.$helper->table)) { $_POST = array(); $this->_filter = false; unset($this->_filterHaving); unset($this->_having); } $sql = new DbQuery(); $sql->select('l.*') ->from('gls_log', 'l'); // Process list filtering if ((bool)Tools::isSubmit('submitFilter'.$helper->table) === true && Tools::getValue('action') != 'reset_filters') { $date_add = Tools::getValue($helper->table.'Filter_date_add'); if ($date_add && is_array($date_add) && count($date_add) > 0) { if (isset($date_add[0]) && !empty($date_add[0])) { if (!Validate::isDate($date_add[0])) { $this->errors[] = $this->trans('The \'From\' date format is invalid (YYYY-MM-DD)', array(), 'Admin.Notifications.Error'); } else { $sql->where('date_add >= \''.pSQL(Tools::dateFrom($date_add[0])).'\''); } } if (isset($date_add[1]) && !empty($date_add[1])) { if (!Validate::isDate($date_add[1])) { $this->errors[] = $this->trans('The \'To\' date format is invalid (YYYY-MM-DD)', array(), 'Admin.Notifications.Error'); } else { $sql->where('date_add <= \''.pSQL(Tools::dateTo($date_add[1])).'\''); } } } $message = Tools::getValue($helper->table.'Filter_message'); if ($message) { $sql->where('message LIKE \'%'.pSQL(trim($message)).'%\''); } } $orderBy = Tools::getValue($helper->table.'Orderby', 'l.date_add'); $orderWay = Tools::getValue($helper->table.'Orderway', 'DESC'); if (Validate::isOrderBy($orderBy) && Validate::isOrderWay($orderWay)) { $sql->orderBy($orderBy.' '.$orderWay); } $data = Db::getInstance()->ExecuteS($sql); $helper->listTotal = count($data); if ($helper->listTotal > 0) { /* Paginate the result */ $page = ($page = Tools::getValue('submitFilter'.$helper->table)) ? $page : 1; $pagination = ($pagination = Tools::getValue($helper->table.'_pagination')) ? $pagination : 50; $data = $this->paginateLog($data, $page, $pagination); $content = $helper->generateList($data, $this->fields_list); } else { $content = $this->context->smarty->fetch($this->local_path . 'views/templates/admin/log.tpl'); } return $content; } protected function getConfigForm() { $carriers = Carrier::getCarriers($this->context->language->id, false, false, false, null, null); foreach ($carriers as $key => $value) { $carriers[$key]['name'] .= ' ('.$this->l('ID:').' '.$value['id_carrier'].')'; } $address = $this->context->shop->getAddress(); $this->context->smarty->assign(array('gls_logo' => __PS_BASE_URI__.'modules/'.$this->name.'/views/img/admin/'.'gls-logo.jpg')); $fields_form = array(); $fields_form[0] = array( 'form' => array( 'legend' => array( 'title' => $this->l('Welcome to the GLS official module') ), 'input' => array( array( 'type' => 'html', 'name' => $this->context->smarty->fetch($this->local_path . 'views/templates/admin/config_intro.tpl'), 'label' => '', 'col' => '12', ), ), ) ); $input = array(); $i = 0; $len = count(self::$carrier_definition); foreach (self::$carrier_definition as $key => $value) { $this->context->smarty->assign(array('carrier_key' => $key)); $input[] = array( 'type' => 'select', 'label' => $value['name'], 'name' => 'GLS_'.$key.'_ID', 'required' => true, 'options' => array( 'query' => $carriers, 'id' => 'id_carrier', 'name' => 'name', 'default' => array('value' => 0, 'label' => $this->l('None - Disable this service')), ), 'col' => '12', 'form_group_class' => 'col-lg-4', 'carrier_img' => __PS_BASE_URI__.'modules/'.$this->name.'/views/img/admin/'.Tools::strtolower($key).'.jpg', ); $input[] = array( 'type' => 'html', 'name' => $this->context->smarty->fetch($this->local_path . 'views/templates/admin/config_btn_create_carrier.tpl'), 'label' => ' ', 'col' => '12', 'form_group_class' => 'col-lg-6 new-carrier', ); /** * Specific options */ if ($key == 'GLSRELAIS') { $input[] = array( 'type' => 'switch', 'label' => $this->l('Display only XL Points Relais®'), 'name' => 'GLS_GLSRELAIS_XL_ONLY', 'required' => true, 'is_bool' => true, 'values' => array( array( 'id' => 'active_on', 'value' => 1, 'label' => $this->l('Yes') ), array( 'id' => 'active_off', 'value' => 0, 'label' => $this->l('No') ) ), 'hint' => $this->l('Points Relais® that can store packages greater than 20 kg, if the length exceeds 120cm or dimension l x 2w x h exceeds 180cm.'), 'lang' => false, 'form_group_class' => 'col-lg-10 extra-config', ); } if ($i !== $len - 1) { $input[] = array( 'type' => 'hr', 'name' => 'hr', ); } $i++; } $fields_form[1] = array( 'form' => array( 'legend' => array( 'title' => $this->l('Select a carrier for each GLS service you want to propose'), ), 'input' => $input, 'submit' => array( 'title' => $this->l('Save'), 'class' => 'btn btn-default pull-right' ) ) ); $this->context->smarty->assign(array( 'anchor_title' => $this->l('Click here to retrieve your Google Maps API Key'), 'anchor_link' => 'https://developers.google.com/maps/documentation/javascript/get-api-key', 'anchor_target' => 'target="_blank"', )); $fields_form[2] = array( 'form' => array( 'legend' => array( 'title' => $this->l('Fill in your account details'), ), 'input' => array( array( 'type' => 'text', 'label' => $this->l('Webservice login'), 'required' => true, 'lang' => false, 'name' => 'GLS_WSLOGIN', 'col' => '12', ), array( 'type' => 'text', 'label' => $this->l('Webservice password'), 'required' => true, 'lang' => false, 'name' => 'GLS_WSPWD', 'col' => '12', ), array( 'type' => 'text', 'label' => $this->l('GLS agency code'), 'required' => true, 'lang' => false, 'name' => 'GLS_AGENCY_CODE', 'hint' => $this->l('Fill in the GLS agency code from where the package is sent.'), 'col' => '12', ), array( 'type' => 'text', 'label' => $this->l('Google Maps API Key'), 'required' => true, 'lang' => false, 'name' => 'GLS_GOOGLE_MAPS_API_KEY', 'desc' => $this->context->smarty->fetch($this->local_path . 'views/templates/admin/anchor.tpl'), 'col' => '12', ), array( 'type' => 'switch', 'label' => $this->l('Include Google Maps API Script'), 'required' => true, 'lang' => false, 'name' => 'GLS_GOOGLE_MAPS_API_SCRIPT_ENABLE', 'is_bool' => true, 'values' => array( array( 'id' => 'active_on', 'value' => 1, 'label' => $this->l('Yes') ), array( 'id' => 'active_off', 'value' => 0, 'label' => $this->l('No') ) ), 'hint' => $this->l('Disable this option if you have a problem to display the map.'), 'col' => '12', ), array( 'type' => 'switch', 'label' => $this->l('Include an order prefix in GLS export/import'), 'required' => true, 'lang' => false, 'name' => 'GLS_ORDER_PREFIX_ENABLE', 'is_bool' => true, 'values' => array( array( 'id' => 'active_on', 'value' => 1, 'label' => $this->l('Yes') ), array( 'id' => 'active_off', 'value' => 0, 'label' => $this->l('No') ) ), 'hint' => $this->l('This option is required for multishops, it is enabled by default.'), 'col' => '12', ), array( 'type' => 'html', 'name' => $this->l('Labels printing'), 'label' => '', 'col' => '12', 'form_group_class' => 'panel-heading', ), array( 'type' => 'text', 'label' => $this->l('Web API login'), 'required' => false, 'lang' => false, 'name' => 'GLS_API_LOGIN', 'col' => '12', ), array( 'type' => 'text', 'label' => $this->l('Web API password'), 'required' => false, 'lang' => false, 'name' => 'GLS_API_PWD', 'col' => '12', ), array( 'type' => 'text', 'label' => $this->l('Customer ID (Web API)'), 'required' => false, 'lang' => false, 'name' => 'GLS_API_CUSTOMER_ID', 'col' => '12', ), array( 'type' => 'text', 'label' => $this->l('Contact ID (Web API)'), 'required' => false, 'lang' => false, 'name' => 'GLS_API_CONTACT_ID', 'col' => '12', ), array( 'type' => 'select', 'label' => $this->l('Delivery label format'), 'name' => 'GLS_API_DELIVERY_LABEL_FORMAT', 'required' => false, 'options' => array( 'query' => array( array('id' => 'A4', 'name' => $this->l('A4')), array('id' => 'A5', 'name' => $this->l('A5')), array('id' => 'A6', 'name' => $this->l('A6')) ), 'id' => 'id', 'name' => 'name', ), 'col' => '12', ), array( 'type' => 'switch', 'label' => $this->l('Enable shop return service'), 'required' => false, 'name' => 'GLS_API_SHOP_RETURN_SERVICE', 'is_bool' => true, 'values' => array( array( 'id' => 'active_on', 'value' => 1, 'label' => $this->l('Yes') ), array( 'id' => 'active_off', 'value' => 0, 'label' => $this->l('No') ) ), 'col' => '12', ), array( 'type' => 'switch', 'label' => $this->l('Enable shop return notification email'), 'required' => false, 'name' => 'GLS_API_SHOP_RETURN_EMAIL_ALERT', 'is_bool' => true, 'values' => array( array( 'id' => 'active_on', 'value' => 1, 'label' => $this->l('Yes') ), array( 'id' => 'active_off', 'value' => 0, 'label' => $this->l('No') ) ), 'hint' => $this->l('Enable this option if you want to notify the customer after return label is generated.'), 'col' => '12', ), array( 'type' => 'switch', 'label' => $this->l('Use the same return address as the one configured for the shop'), 'required' => false, 'name' => 'GLS_API_SHOP_RETURN_ADDRESS', 'is_bool' => true, 'values' => array( array( 'id' => 'active_on', 'value' => 1, 'label' => $this->l('Yes') ), array( 'id' => 'active_off', 'value' => 0, 'label' => $this->l('No') ) ), 'col' => '12', ), array( 'type' => 'text', 'label' => $this->l('Company or return contact name'), 'name' => 'GLS_API_SHOP_RETURN_ADDRESS_NAME', 'required' => true, 'col' => '12', 'form_group_class' => 'return-address', ), array( 'type' => 'text', 'label' => $this->trans('Address', array(), 'Admin.Global'), 'name' => 'GLS_API_SHOP_RETURN_ADDRESS_ADDRESS1', 'required' => true, 'default_value' => $address->address1, 'col' => '12', 'form_group_class' => 'return-address', ), array( 'type' => 'text', 'label' => $this->trans('Address (2)', array(), 'Admin.Global'), 'name' => 'GLS_API_SHOP_RETURN_ADDRESS_ADDRESS2', 'col' => '12', 'form_group_class' => 'return-address', ), array( 'type' => 'text', 'label' => $this->trans('Zip/postal code', array(), 'Admin.Global'), 'name' => 'GLS_API_SHOP_RETURN_ADDRESS_POSTCODE', 'required' => true, 'col' => '12', 'form_group_class' => 'return-address', ), array( 'type' => 'text', 'label' => $this->trans('City', array(), 'Admin.Global'), 'name' => 'GLS_API_SHOP_RETURN_ADDRESS_CITY', 'required' => true, 'col' => '12', 'form_group_class' => 'return-address', ), array( 'type' => 'select', 'label' => $this->trans('Country', array(), 'Admin.Global'), 'name' => 'GLS_API_SHOP_RETURN_ADDRESS_COUNTRY', 'required' => true, 'options' => array( 'query' => Country::getCountries($this->context->language->id), 'id' => 'id_country', 'name' => 'name', ), 'col' => '12', 'form_group_class' => 'return-address', ), array( 'type' => 'text', 'label' => $this->trans('Name', array(), 'Admin.Global'), 'name' => 'GLS_API_SHOP_RETURN_ADDRESS_NAME_DEFAULT', 'required' => true, 'disabled' => true, 'col' => '12', 'form_group_class' => 'return-address default-address', ), array( 'type' => 'text', 'label' => $this->trans('Address', array(), 'Admin.Global'), 'name' => 'GLS_API_SHOP_RETURN_ADDRESS_ADDRESS1_DEFAULT', 'required' => true, 'default_value' => $address->address1, 'disabled' => true, 'col' => '12', 'form_group_class' => 'return-address default-address', ), array( 'type' => 'text', 'label' => $this->trans('Address (2)', array(), 'Admin.Global'), 'name' => 'GLS_API_SHOP_RETURN_ADDRESS_ADDRESS2_DEFAULT', 'disabled' => true, 'col' => '12', 'form_group_class' => 'return-address default-address', ), array( 'type' => 'text', 'label' => $this->trans('Zip/postal code', array(), 'Admin.Global'), 'name' => 'GLS_API_SHOP_RETURN_ADDRESS_POSTCODE_DEFAULT', 'required' => true, 'disabled' => true, 'col' => '12', 'form_group_class' => 'return-address default-address', ), array( 'type' => 'text', 'label' => $this->trans('City', array(), 'Admin.Global'), 'name' => 'GLS_API_SHOP_RETURN_ADDRESS_CITY_DEFAULT', 'required' => true, 'disabled' => true, 'col' => '12', 'form_group_class' => 'return-address default-address', ), array( 'type' => 'select', 'label' => $this->trans('Country', array(), 'Admin.Global'), 'name' => 'GLS_API_SHOP_RETURN_ADDRESS_COUNTRY_DEFAULT', 'required' => true, 'options' => array( 'query' => Country::getCountries($this->context->language->id), 'id' => 'id_country', 'name' => 'name', ), 'disabled' => true, 'col' => '12', 'form_group_class' => 'return-address default-address', ), ), 'submit' => array( 'title' => $this->l('Save'), 'class' => 'btn btn-default pull-right' ) ) ); $this->context->smarty->assign(array( 'gls_logo' => __PS_BASE_URI__.'modules/'.$this->name.'/views/img/admin/'.'gls-logo.jpg', 'zones_link' => $this->context->link->getAdminLink('AdminZones'), )); $fields_form[3] = array( 'form' => array( 'legend' => array( 'title' => $this->l('Support') ), 'input' => array( array( 'type' => 'html', 'name' => $this->context->smarty->fetch($this->local_path . 'views/templates/admin/config_faq.tpl'), 'label' => '', 'col' => '12', ), ), ) ); $fields_form[4] = array( 'form' => array( 'legend' => array( 'title' => $this->l('Logs') ) ) ); return $fields_form; } public function paginateLog($data, $page = 1, $pagination = 50) { if (count($data) > $pagination) { $data = array_slice($data, $pagination * ($page - 1), $pagination); } return $data; } private function initList() { $this->fields_list = array( 'message' => array( 'title' => $this->l('Message'), 'type' => 'text', 'filter_key' => 'message', 'width' => '500', ), 'date_add' => array( 'title' => $this->l('Date'), 'filter_key' => 'date_add', 'type' => 'date', 'width' => '245', 'align' => 'right', ), ); $helper = new HelperList(); $helper->module = $this; $helper->shopLinkType = ''; $helper->no_link = true; $helper->show_toolbar = false; $helper->simple_header = false; $helper->row_hover = false; $helper->actions = array(''); $helper->identifier = 'id_gls_log'; $helper->table = 'gls_log'; $helper->currentIndex = $this->context->link->getAdminLink('AdminModules', false).'&configure='.$this->name; $helper->token = Tools::getAdminTokenLite('AdminModules'); return $helper; } public function getConfigFormValues() { $address = $this->context->shop->getAddress(); $fields_values = array( 'GLS_GLSRELAIS_XL_ONLY' => Tools::getValue('GLS_GLSRELAIS_XL_ONLY', Configuration::get('GLS_GLSRELAIS_XL_ONLY')), 'GLS_WSLOGIN' => Tools::getValue('GLS_WSLOGIN', Configuration::get('GLS_WSLOGIN')), 'GLS_WSPWD' => Tools::getValue('GLS_WSPWD', Configuration::get('GLS_WSPWD')), 'GLS_AGENCY_CODE' => Tools::getValue('GLS_AGENCY_CODE', Configuration::get('GLS_AGENCY_CODE')), 'GLS_GOOGLE_MAPS_API_KEY' => Tools::getValue('GLS_GOOGLE_MAPS_API_KEY', Configuration::get('GLS_GOOGLE_MAPS_API_KEY')), 'GLS_GOOGLE_MAPS_API_SCRIPT_ENABLE' => Tools::getValue('GLS_GOOGLE_MAPS_API_SCRIPT_ENABLE', Configuration::get('GLS_GOOGLE_MAPS_API_SCRIPT_ENABLE')), 'GLS_ORDER_PREFIX_ENABLE' => Tools::getValue('GLS_ORDER_PREFIX_ENABLE', Configuration::get('GLS_ORDER_PREFIX_ENABLE')), 'GLS_API_CUSTOMER_ID' => Tools::getValue('GLS_API_CUSTOMER_ID', Configuration::get('GLS_API_CUSTOMER_ID')), 'GLS_API_CONTACT_ID' => Tools::getValue('GLS_API_CONTACT_ID', Configuration::get('GLS_API_CONTACT_ID')), 'GLS_API_DELIVERY_LABEL_FORMAT' => Tools::getValue('GLS_API_DELIVERY_LABEL_FORMAT', Configuration::get('GLS_API_DELIVERY_LABEL_FORMAT')), 'GLS_API_SHOP_RETURN_SERVICE' => Tools::getValue('GLS_API_SHOP_RETURN_SERVICE', Configuration::get('GLS_API_SHOP_RETURN_SERVICE')), 'GLS_API_SHOP_RETURN_EMAIL_ALERT' => Tools::getValue('GLS_API_SHOP_RETURN_EMAIL_ALERT', Configuration::get('GLS_API_SHOP_RETURN_EMAIL_ALERT')), 'GLS_API_LOGIN' => Tools::getValue('GLS_API_LOGIN', Configuration::get('GLS_API_LOGIN')), 'GLS_API_PWD' => Tools::getValue('GLS_API_PWD', Configuration::get('GLS_API_PWD')), 'GLS_API_SHOP_RETURN_ADDRESS' => Tools::getValue('GLS_API_SHOP_RETURN_ADDRESS', Configuration::get('GLS_API_SHOP_RETURN_ADDRESS')), 'GLS_API_SHOP_RETURN_ADDRESS_NAME' => Tools::getValue('GLS_API_SHOP_RETURN_ADDRESS_NAME', Configuration::get('GLS_API_SHOP_RETURN_ADDRESS_NAME', null, null, null, Configuration::get('PS_SHOP_NAME'))), 'GLS_API_SHOP_RETURN_ADDRESS_ADDRESS1' => Tools::getValue('GLS_API_SHOP_RETURN_ADDRESS_ADDRESS1', Configuration::get('GLS_API_SHOP_RETURN_ADDRESS_ADDRESS1', null, null, null, $address->address1)), 'GLS_API_SHOP_RETURN_ADDRESS_ADDRESS2' => Tools::getValue('GLS_API_SHOP_RETURN_ADDRESS_ADDRESS2', Configuration::get('GLS_API_SHOP_RETURN_ADDRESS_ADDRESS2', null, null, null, $address->address2)), 'GLS_API_SHOP_RETURN_ADDRESS_POSTCODE' => Tools::getValue('GLS_API_SHOP_RETURN_ADDRESS_POSTCODE', Configuration::get('GLS_API_SHOP_RETURN_ADDRESS_POSTCODE', null, null, null, $address->postcode)), 'GLS_API_SHOP_RETURN_ADDRESS_CITY' => Tools::getValue('GLS_API_SHOP_RETURN_ADDRESS_CITY', Configuration::get('GLS_API_SHOP_RETURN_ADDRESS_CITY', null, null, null, $address->city)), 'GLS_API_SHOP_RETURN_ADDRESS_COUNTRY' => Tools::getValue('GLS_API_SHOP_RETURN_ADDRESS_COUNTRY', Configuration::get('GLS_API_SHOP_RETURN_ADDRESS_COUNTRY', null, null, null, (int)$address->id_country)), 'GLS_API_SHOP_RETURN_ADDRESS' => Tools::getValue('GLS_API_SHOP_RETURN_ADDRESS', Configuration::get('GLS_API_SHOP_RETURN_ADDRESS')), 'GLS_API_SHOP_RETURN_ADDRESS_NAME_DEFAULT' => Configuration::get('PS_SHOP_NAME'), 'GLS_API_SHOP_RETURN_ADDRESS_ADDRESS1_DEFAULT' => $address->address1, 'GLS_API_SHOP_RETURN_ADDRESS_ADDRESS2_DEFAULT' => $address->address2, 'GLS_API_SHOP_RETURN_ADDRESS_POSTCODE_DEFAULT' => $address->postcode, 'GLS_API_SHOP_RETURN_ADDRESS_CITY_DEFAULT' => $address->city, 'GLS_API_SHOP_RETURN_ADDRESS_COUNTRY_DEFAULT' => (int)$address->id_country, ); //__ GLS Carrier configuration foreach (array_keys(self::$carrier_definition) as $key) { $fields_values['GLS_'.$key.'_ID'] = Tools::getValue('GLS_'.$key.'_ID', Configuration::get('GLS_'.$key.'_ID')); } return $fields_values; } /** * Save form data. */ protected function postProcess() { $output = null; $output_info = ''; $form_values = $this->getConfigFormValues(); //__ GLS avant 13H: Test du renseignement du code agence GLS if ($form_values['GLS_GLS13H_ID']) { if (!$form_values['GLS_AGENCY_CODE']) { $output .= $this->displayError($this->l('Your GLS agency code is necessary to propose the service GLS before 13H.')); } } //__ Tests spécifiques pour le service GLS Relais if ($form_values['GLS_GLSRELAIS_ID']) { if (!$form_values['GLS_WSLOGIN'] || !$form_values['GLS_WSPWD']) { $output .= $this->displayError($this->l('Your webservice login and password are necessary to propose the service GLS Point Relais®.')); } else { // Used when gls webservice is down @ini_set('default_socket_timeout', '5'); //__ Test de connexion $gls = new GlsController($form_values); $result = $gls->searchRelay('34000'); @ini_restore('default_socket_timeout'); if (!$result) { $output_info .= $this->displayWarning($this->l('GLS WebService temporarily unavailable.')); } elseif ($result && isset($result->exitCode->ErrorCode) && $result->exitCode->ErrorCode == 502) { $output .= $this->displayError($this->l('Incorrect GLS webservice login and/or password.')); } } $this->context->smarty->assign(array( 'anchor_title' => $this->l('Click here to get an API Key'), 'anchor_link' => 'https://developers.google.com/maps/documentation/javascript/get-api-key', 'anchor_target' => 'target="_blank"', )); //__ Erreur si affichage du script Google mais Google Maps API KEY non renseigné if (!$form_values['GLS_GOOGLE_MAPS_API_KEY'] && $form_values['GLS_GOOGLE_MAPS_API_SCRIPT_ENABLE']) { $output .= $this->displayError($this->l('A Google Maps API Key is necessary to locate Points Relais® using Google Maps.') .Tools::nl2br("\n").$this->context->smarty->fetch($this->local_path . 'views/templates/admin/anchor.tpl')); } } if (!$output) { foreach ($form_values as $key => $value) { switch ($key) { case 'GLS_GLSRELAIS_ID': case 'GLS_GLS13H_ID': case 'GLS_GLSCHEZVOUS_ID': case 'GLS_GLSCHEZVOUSPLUS_ID': $old_carrier_id = Configuration::get($key); if (is_numeric($value) && (int)$value > 0 && (int)$value != (int)$old_carrier_id) { $this->defineCarrierAsModule((int)$value); // activation du nouveau transporteur if (Validate::isLoadedObject($object = new Carrier((int)$value))) { $object->active = true; $object->update(); } } if ((int)$old_carrier_id > 0 && (int)$value != (int)$old_carrier_id) { // désactivation du transporteur anciennement associé if (Validate::isLoadedObject($object = new Carrier((int)$old_carrier_id))) { $object->active = false; $object->update(); } // On sauvegarde l'ancien ID dans les logs $log_key = Tools::strReplaceFirst('_ID', '_LOG', $key); $history_log = explode('|', Configuration::get($log_key)); $history_log[] = $old_carrier_id; Configuration::updateValue($log_key, implode('|', array_map('intval', $history_log))); } break; default: break; } Configuration::updateValue($key, trim($value)); } $output = $this->displayConfirmation($this->l('Settings updated')).$output_info; } return $output; } /** * CSS and JS files added on the BO for PS 17 */ public function hookActionAdminControllerSetMedia() { } /** * CSS and JS files added on the BO for PS16 */ public function hookDisplayBackOfficeHeader() { if (Tools::getValue('controller') == 'AdminModules' && Tools::getValue('configure') == $this->name) { if (method_exists($this->context->controller, 'addJquery')) { $this->context->controller->addJquery(); } $this->context->controller->addCSS($this->_path . '/views/css/admin.css'); $this->context->controller->addJS($this->_path . '/views/js/admin.js'); } } /** * Display module in hooks * @param string $hookName * @param array $params * TODO: à compléter même si non utilisé pour retro compatibilité 1.6 */ public function renderWidget($hookName, array $_params) { switch ($hookName) { case 'displayHeader': $this->hookDisplayHeader(); break; case 'displayCarrierExtraContent': return $this->hookDisplayCarrierExtraContent($_params); default: break; } // $result = $this->getWidgetVariables($hookName, $_params); // $this->smarty->assign($result); // $template_file = $this->templates[$hookName]; // return $this->fetch('module:'.$this->name.'/views/templates/hook/'.$template_file); } public function getWidgetVariables($hookName, array $params) { } /** * Création des transporteurs GLS * @param string $_code * @param int $_id_zone_france */ public function createCarrier($_code, $_id_zone_france = null) { if (!array_key_exists($_code, self::$carrier_definition)) { $this->_errors[] = $this->l('GLS carrier code is wrong.'); return false; } if (Shop::isFeatureActive() && !empty(self::$old_shop_context)) { Shop::setContext(self::$old_shop_context['type'], self::$old_shop_context['id']); } $carrier = new Carrier(); $carrier->name = self::$carrier_definition[$_code]['name']; $carrier->id_tax_rules_group = 0; $carrier->active = true; $carrier->deleted = 0; $carrier->url = self::$trackingUrl; $carrier->delay = self::$carrier_definition[$_code]['delay']; $carrier->shipping_handling = false; //__ If out-of-range behavior carrier is set to "Deactivate carrier" $carrier->range_behavior = 0; $carrier->is_module = true; /* * Défini à true pour pouvoir interragir sur le prix et l'affichage du transporteur * (restriction quelconque en fonction des données de l'utilisateur et du marchand) */ $carrier->need_range = true; $carrier->shipping_external = true; $carrier->external_module_name = 'nkmgls'; $carrier->grade = self::$carrier_definition[$_code]['grade']; foreach (Language::getLanguages(true) as $language) { if (array_key_exists($language['iso_code'], self::$carrier_definition[$_code]['delay'])) { $carrier->delay[$language['id_lang']] =self::$carrier_definition[$_code]['delay'][$language['iso_code']]; } else { $carrier->delay[$language['id_lang']] = self::$carrier_definition[$_code]['delay']['fr']; } } if ($carrier->add()) { //__ Groups restriction $groups = Group::getgroups(true); $tmp_groups = array(); foreach ($groups as $value) { $tmp_groups[] = $value['id_group']; } $carrier->setGroups($tmp_groups, false); /** * Zone configuration */ switch ($_code) { case 'GLSRELAIS': case 'GLSCHEZVOUSPLUS': case 'GLS13H': if (is_null($_id_zone_france)) { $sql = new DbQuery(); $sql->select('z.`id_zone`') ->from('zone', 'z') ->where('z.`name` LIKE \'%France%\''); foreach (Db::getInstance()->ExecuteS($sql) as $value) { $carrier->addZone((int)$value['id_zone']); } } else { $carrier->addZone((int)$_id_zone_france); } break; default: $zones = Zone::getZones(); foreach ($zones as $zone) { $carrier->addZone($zone['id_zone']); } break; } /** * Aucun prix par défaut */ //__ Range price default // $rp = new RangePrice(); // $rp->id_carrier = $carrier->id; // $rp->delimiter1 = 0; // $rp->delimiter2 = 100000; // $rp->add(); //__ Range weight default // $rw = new RangeWeight(); // $rw->id_carrier = $carrier->id; // $rw->delimiter1 = '0'; // $rw->delimiter2 = '30'; // $rw->add(); // Db::getInstance()->update( // 'delivery', // array('price' => 4.90), // 'id_carrier='.(int)$carrier->id.' AND (id_range_price='.(int)$rp->id.' OR id_range_weight='.(int)$rw->id.')' // ); //__ carrier logo (format JPG) if (!copy(dirname(__FILE__).'/views/img/admin/'.Tools::strtolower($_code).'.jpg', _PS_SHIP_IMG_DIR_.'/'.$carrier->id.'.jpg')) { $this->_errors[] = sprintf($this->l('Error to copy GLS carrier logo %s'), $_code); } } else { $this->_errors[] = sprintf($this->l('Error to create GLS carrier %s'), $_code); return false; } //__ Si le service est déjà associé à un transporteur alors il faut le désactiver et gérer l'historique $old_id_carrier = Configuration::get('GLS_'.Tools::strtoupper($_code).'_ID'); if ($old_id_carrier) { $history_log = explode('|', Configuration::get('GLS_'.Tools::strtoupper($_code).'_LOG')); $history_log[] = $old_id_carrier; Configuration::updateValue('GLS_'.Tools::strtoupper($_code).'_LOG', implode('|', array_map('intval', $history_log))); if (Validate::isLoadedObject($object = new Carrier((int)$old_id_carrier))) { $object->active = false; $object->update(); } } return Configuration::updateValue('GLS_'.Tools::strtoupper($_code).'_ID', (int)$carrier->id); } public function getOrderShippingCost($params, $shipping_cost) { if ((int)$this->id_carrier == (int)Configuration::get('GLS_GLS13H_ID')) { if (Configuration::get('GLS_AGENCY_CODE')) { // Run synchronisation check $this->synchronizeAgencyPostcodeRestriction(); $address = new Address((int)$this->context->cart->id_address_delivery); $query = new DbQuery(); $query->select('g.*') ->from('gls_agency_postcode', 'g') ->where('g.`agency_code` = \''.pSQL(Configuration::get('GLS_AGENCY_CODE')).'\'') ->where('\''.pSQL($address->postcode).'\' >= `postcode_start`') ->where('\''.pSQL($address->postcode).'\' <= `postcode_end`'); if (!Db::getInstance()->getRow($query)) { return false; } } else { return false; } } elseif ((int)$this->id_carrier == (int)Configuration::get('GLS_GLSRELAIS_ID')) { if (!Configuration::get('GLS_WSLOGIN') || !Configuration::get('GLS_WSPWD')) { return false; } } return $shipping_cost; } public function getOrderShippingCostExternal($params) { return $params; } /** * Récupération des informations supplémentaires en fonction du transporteur * @param array $_params * @return mixed */ public function hookDisplayCarrierExtraContent($_params) { if (isset($_params['carrier'])) { $error = array(); $config = $this->getConfigFormValues(); //__ récupération d'une éventuelle sélection déjà effectuée $cart_carrier_detail = self::getCartCarrierDetail($_params['cart']->id, $_params['cart']->id_customer, $_params['carrier']['id']); //__ récupération du numéro de mobile en session $customer_default_phone_mobile = ''; if (isset($this->context->cart->id_address_delivery)) { $customer_default_delivery_address = new Address($this->context->cart->id_address_delivery); $customer_default_phone_mobile = $customer_default_delivery_address->phone_mobile; if (empty($customer_default_phone_mobile) && !empty($customer_default_delivery_address->phone)) { $customer_default_phone_mobile = $customer_default_delivery_address->phone; } } if ($_params['carrier']['id'] == $config['GLS_GLSRELAIS_ID']) { $relay_points = ''; //__ Récupération de l'adresse de livraison du client if ($this->context->cart->id_address_delivery) { $address = new Address((int)$this->context->cart->id_address_delivery); // FIXME: cela n'est peut être pas nécessaire car on peut directement récupérer le postcode de cette manière $address->postcode non ? $address_details = $address->getFields(); $country_iso = Country::getIsoById($address_details['id_country']); // Used when gls webservice is down @ini_set('default_socket_timeout', '5'); $gls = new GlsController($config); $result = $gls->searchRelay($address_details['postcode'], $address_details['city'], $country_iso, $address_details['address1']); @ini_restore('default_socket_timeout'); //__ gestion des erreurs du webservice if (isset($result->exitCode->ErrorCode)) { if ((int)$result->exitCode->ErrorCode == 998 || (int)$result->exitCode->ErrorCode == 999) { //__ Aucun relais trouvé, recherche alternative $error = array('code' => $result->exitCode->ErrorCode, 'message' => $this->l('We haven\'t found any Points Relais® in your delivery area. Please expand your search.')); } elseif ((int)$result->exitCode->ErrorCode == 0) { $relay_points = $result->SearchResults; /** * FIXME: ne fonctionne pas sur la version 1.7.2.4 */ // $cookie_data = array( // 'search_address' => array('country' => $country_iso, 'postcode' => $address_details['postcode'], 'city' => $address_details['city']) // ); //__ Si restriction sur relais XL if ($config['GLS_GLSRELAIS_XL_ONLY']) { foreach ($relay_points as $key => $value) { if (!empty($value->Parcelshop->Address->Name1) && Tools::substr($value->Parcelshop->Address->Name1, -2) != 'XL') { unset($relay_points[$key]); } } $relay_points = array_values($relay_points); } if (count($relay_points) <= 0) { $error = array('code' => 998, 'message' => $this->l('We haven\'t found any Points Relais® in your delivery area. Please expand your search.')); } //__ On sauvegarde le résultat de la recherche dans session // foreach ($relay_points as $value) { // $cookie_data[$value->Parcelshop->ParcelShopId] = array( // 'airLineDistance' => $value->AirLineDistance, // 'Name1' => $value->Parcelshop->Address->Name1, // 'Street1' => $value->Parcelshop->Address->Street1, // 'ZipCode' => $value->Parcelshop->Address->ZipCode, // 'City' => $value->Parcelshop->Address->City, // 'Country' => $value->Parcelshop->Address->Country, // 'Phone' => $value->Parcelshop->Phone->Contact, // 'Mobile' => $value->Parcelshop->Mobile->Contact, // 'email' => $value->Parcelshop->Email, // 'url' => $value->Parcelshop->URL, // 'latitude' => $value->Parcelshop->GLSCoordinates->Latitude, // 'longitude' => $value->Parcelshop->GLSCoordinates->Longitude, // 'GLSWorkingDay' => $value->Parcelshop->GLSWorkingDay, // 'Name2' => (!empty($value->Parcelshop->Address->Name2) ? $value->Parcelshop->Address->Name2 : ''), // 'Name3' => (!empty($value->Parcelshop->Address->Name3) ? $value->Parcelshop->Address->Name3 : ''), // 'ContactName' => (!empty($value->Parcelshop->Address->ContactName) ? $value->Parcelshop->Address->ContactName : ''), // 'BlockNo1' => (!empty($value->Parcelshop->Address->BlockNo1) ? $value->Parcelshop->Address->BlockNo1 : ''), // 'Street2' => (!empty($value->Parcelshop->Address->Street2) ? $value->Parcelshop->Address->Street2 : ''), // 'BlockNo2' => (!empty($value->Parcelshop->Address->BlockNo2) ? $value->Parcelshop->Address->BlockNo2 : ''), // 'Province' => (!empty($value->Parcelshop->Address->Province) ? $value->Parcelshop->Address->Province : ''), // ); // } //__ Enregistrement des données de recherche dans le contexte cookie // $this->context->cookie->__set('gls_cookie', json_encode($cookie_data)); /** * Fin du FIXME */ } else { $error = array('code' => $result->exitCode->ErrorCode, 'message' => $result->exitCode->ErrorDscr); } } else { $error = array('code' => '', 'message' => $this->l('Service temporarily unavailable, try again later.')); } } // TODO: passer le nombre de relais à afficher en paramètre $this->smarty->assign(array( 'trans_days' => array( '0' => $this->l('Monday'), '1' => $this->l('Tuesday'), '2' => $this->l('Wednesday'), '3' => $this->l('Thursday'), '4' => $this->l('Friday'), '5' => $this->l('Saturday'), '6' => $this->l('Sunday')), 'only_xl' => $config['GLS_GLSRELAIS_XL_ONLY'], 'relay_points' => $relay_points, 'force_gsm' => true, 'is_relay_carrier' => true, 'error' => $error, 'name_carrier' => $_params['carrier']['name'], 'id_carrier' => $_params['carrier']['id'], 'current_relay' => ($cart_carrier_detail && !empty($cart_carrier_detail['parcel_shop_id']) ? $cart_carrier_detail['parcel_shop_id'] : ''), 'current_customer_mobile' => ($cart_carrier_detail && !empty($cart_carrier_detail['customer_phone_mobile']) ? $cart_carrier_detail['customer_phone_mobile'] : $customer_default_phone_mobile), 'customer_mobile_title' => $this->l('Please fill in your mobile number, you will be notified by sms for the delivery'), )); //__ Contraintes sur le mode de livraison en point relais return $this->fetch('module:'.$this->name.'/views/templates/hook/'.$this->templates['displayCarrierExtraContent']); } elseif ($_params['carrier']['id'] == $config['GLS_GLS13H_ID'] || $_params['carrier']['id'] == $config['GLS_GLSCHEZVOUSPLUS_ID']) { $this->smarty->assign(array( 'relay_points' => false, 'force_gsm' => true, 'is_relay_carrier' => false, 'error' => $error, 'name_carrier' => $_params['carrier']['name'], 'id_carrier' => $_params['carrier']['id'], 'current_relay' => '', 'current_customer_mobile' => ($cart_carrier_detail && !empty($cart_carrier_detail['customer_phone_mobile']) ? $cart_carrier_detail['customer_phone_mobile'] : $customer_default_phone_mobile), 'customer_mobile_title' => ($_params['carrier']['id'] == $config['GLS_GLSCHEZVOUSPLUS_ID'] ? $this->l('Please fill in your mobile number, you will be notified by sms for the delivery') : $this->l('Please fill in your mobile number to make use of')), )); //__ Contraintes sur le mode de livraison avant 13H return $this->fetch('module:'.$this->name.'/views/templates/hook/'.$this->templates['displayCarrierExtraContent']); } } } /** * CSS & JavaScript files added on the FO. */ public function hookDisplayHeader() { } // In a module class public function hookActionFrontControllerSetMedia($params) { //__ TODO: attention registerStylesheet non compatibles PS16 if (isset($this->context->controller->page_name) && $this->context->controller->page_name == 'checkout') { Media::addJsDef(array( 'gls_display_delivery_option_url' => $this->context->link->getModuleLink($this->name, 'checkout', array(), true), 'glsrelais_carrier_id' => (int)Configuration::get('GLS_GLSRELAIS_ID'), 'gls13h_carrier_id' => (int)Configuration::get('GLS_GLS13H_ID'), 'glschezvousplus_carrier_id' => (int)Configuration::get('GLS_GLSCHEZVOUSPLUS_ID'), 'gls_js_general_error' => $this->l('Unexpected error occured.'), 'gls_js_relay_error' => $this->l('Please select a Point Relais® on the list.'), 'gls_js_search_error' => $this->l('Please fill-in a valid postcode.'), 'gls_js_mobile_error' => $this->l('Please fill-in a valid mobile number (e.g. +XXXXXXXXXXX or 0XXXXXXXXX).'), )); if (Configuration::get('GLS_GOOGLE_MAPS_API_SCRIPT_ENABLE')) { $this->context->controller->registerJavascript( 'module-gls-googlemaps', 'https://maps.googleapis.com/maps/api/js?key='.Configuration::get('GLS_GOOGLE_MAPS_API_KEY'), array('server' => 'remote', 'attributes' => array('async', 'defer')) ); } $this->context->controller->registerJavascript( 'module-gls-frontjs', 'modules/'.$this->name.'/views/js/front.js', array('position' => 'bottom', 'priority' => 100) ); } $this->context->controller->registerStylesheet( 'module-gls-frontcss', 'modules/'.$this->name.'/views/css/front.css', array('media' => 'all') ); } /** * Permet de sauvegarder l'historique de modification des transporteurs GLS * On est obligatoirement en contexte ALLSHOP car forcé par prestashop * @param array $params */ public function hookActionCarrierUpdate($params) { foreach (array_keys(self::$carrier_definition) as $key) { if (Shop::isFeatureActive()) { foreach (Shop::getShops(true) as $shop) { if ((int)$params['id_carrier'] == (int)Configuration::get('GLS_'.$key.'_ID', null, $shop['id_shop_group'], $shop['id_shop'])) { Configuration::updateValue('GLS_'.$key.'_ID', (int)$params['carrier']->id, false, $shop['id_shop_group'], $shop['id_shop']); $history_log = explode('|', Configuration::get('GLS_'.$key.'_LOG', null, $shop['id_shop_group'], $shop['id_shop'])); $history_log[] = $params['id_carrier']; Configuration::updateValue('GLS_'.$key.'_LOG', implode('|', array_map('intval', $history_log)), false, $shop['id_shop_group'], $shop['id_shop']); } } } elseif ((int)$params['id_carrier'] == (int)Configuration::get('GLS_'.$key.'_ID')) { Configuration::updateValue('GLS_'.$key.'_ID', (int)$params['carrier']->id); $history_log = explode('|', Configuration::get('GLS_'.$key.'_LOG')); $history_log[] = $params['id_carrier']; Configuration::updateValue('GLS_'.$key.'_LOG', implode('|', array_map('intval', $history_log))); } } } /** * Suppression d'un transporteur * On est obligatoirement en contexte ALLSHOP car forcé par prestashop * @param array $params */ public function hookActionObjectCarrierUpdateAfter($params) { if (Validate::isLoadedObject($params['object']) && $params['object']->deleted) { // Si le transporteur a été supprimé définitivement if (!Carrier::getCarrierByReference($params['object']->id_reference)) { foreach (array_keys(self::$carrier_definition) as $key) { if (Shop::isFeatureActive()) { foreach (Shop::getShops(true) as $shop) { if ((int)$params['object']->id == (int)Configuration::get('GLS_'.$key.'_ID', null, $shop['id_shop_group'], $shop['id_shop'])) { Configuration::updateValue('GLS_'.$key.'_ID', '', false, $shop['id_shop_group'], $shop['id_shop']); $history_log = explode('|', Configuration::get('GLS_'.$key.'_LOG', null, $shop['id_shop_group'], $shop['id_shop'])); $history_log[] = $params['object']->id; Configuration::updateValue('GLS_'.$key.'_LOG', implode('|', array_map('intval', $history_log)), false, $shop['id_shop_group'], $shop['id_shop']); } } } elseif ((int)$params['object']->id == (int)Configuration::get('GLS_'.$key.'_ID')) { Configuration::updateValue('GLS_'.$key.'_ID', ''); $history_log = explode('|', Configuration::get('GLS_'.$key.'_LOG')); $history_log[] = $params['object']->id; Configuration::updateValue('GLS_'.$key.'_LOG', implode('|', array_map('intval', $history_log))); } } } } } /** * Sets some parameters when a carrier is define as a GLS module * @param int $id_carrier */ public function defineCarrierAsModule($id_carrier) { $sql = new DbQuery(); $sql->select('external_module_name') ->from('carrier') ->where('id_carrier = '.(int)$id_carrier); $external_module = Db::getInstance()->getValue($sql); if ($external_module !== false && $external_module != 'nkmgls') { Db::getInstance()->execute(' UPDATE '._DB_PREFIX_.'carrier SET shipping_handling = 0, is_module = 1, shipping_external = 1, need_range = 1, external_module_name = \'nkmgls\' WHERE id_carrier = '.(int)$id_carrier); } } public function hookDisplayOrderDetail($params) { //__ TODO: a décommenter lorsqu'on aura ajouté plus de détail sur le point relais (horaires, map) // $glsRelaisIds = $this->getCarrierIdHistory('GLSRELAIS'); // $addressDelivery = $this->getGlsRelayAddress($params['order']->id_cart, $params['order']->id_carrier, $params['order']->id_customer); // if ($addressDelivery // && $addressDelivery['addressObject'] // && isset($glsRelaisIds['GLSRELAIS']) // && in_array($params['order']->id_carrier, $glsRelaisIds['GLSRELAIS'])) { // $this->smarty->assign(array( // 'address_delivery' => $addressDelivery['addressObject'], // 'address_delivery_formatted' => AddressFormat::generateAddress($addressDelivery['addressObject'], array(), Tools::nl2br("\n")), // )); // return $this->fetch('module:'.$this->name.'/views/templates/hook/'.$this->templates['displayOrderDetail']); // } } /** * permet de récupérer les informations enregistrées concernant le panier et le transporteur GLS * @param unknown $_id */ public static function getCartCarrierDetail($_id_cart, $_id_customer, $_id_carrier = null) { $query = new DbQuery(); $query->select('c.*') ->from('gls_cart_carrier', 'c') ->where('c.`id_customer` = '.(int)$_id_customer) ->where('c.`id_cart` = '.(int)$_id_cart); if (!empty($_id_carrier)) { $query->where('c.`id_carrier` = '.(int)$_id_carrier); } return Db::getInstance()->getRow($query); } public function hookDisplayAfterCarrier() { return $this->fetch('module:'.$this->name.'/views/templates/hook/'.$this->templates['displayAfterCarrier']); } /** * Permet de définir si l'étape de choix de livraison est complète * @param unknown $params */ public function hookActionValidateStepComplete($params) { if ($params['step_name'] == 'delivery') { if (isset($params['request_params']['delivery_option'])) { //__ Get the first value $id_carrier_selected = (int)reset($params['request_params']['delivery_option']); if ($id_carrier_selected == (int)Configuration::get('GLS_GLSRELAIS_ID') || $id_carrier_selected == (int)Configuration::get('GLS_GLS13H_ID') || $id_carrier_selected == (int)Configuration::get('GLS_GLSCHEZVOUSPLUS_ID') ) { //__ Test de saisie du numéro de mobile si nécessaire if (!isset($params['request_params']['gls_customer_mobile_'.$id_carrier_selected]) || (isset($params['request_params']['gls_customer_mobile_'.$id_carrier_selected]) && empty($params['request_params']['gls_customer_mobile_'.$id_carrier_selected])) ) { $params['completed'] &= false; } //__ Test de sélection d'un point relay if ($id_carrier_selected == (int)Configuration::get('GLS_GLSRELAIS_ID')) { if (!self::getCartCarrierDetail($params['cookie']->id_cart, $params['cookie']->id_customer, $id_carrier_selected)) { $params['completed'] &= false; } } } } } return $params['completed']; } /** * Permet de faire une action à la validation de l'étape du choix des modes de livraison * @param unknown $params */ public function hookActionCarrierProcess($params) { // Suppression des donénes GLS si le transporteur sélectionné n'est pas GLS if (!empty($params['cart'])) { $cart_detail = self::getCartCarrierDetail((int)$params['cart']->id, (int)$params['cart']->id_customer); if ($cart_detail && (int)$cart_detail['id_carrier'] != (int)$params['cart']->id_carrier) { Db::getInstance()->delete('gls_cart_carrier', 'id_cart = "'.pSQL((int)$params['cart']->id).'"'); } } } /** * Permet de récupérer et d'importer le fichier CSV contenant les restrictions par codes postaux en fonction du code agence de point retrait * @param bool $_force * @param string $_file_content */ public function synchronizeAgencyPostcodeRestriction($_force = false, $_file_content = null) { // Dont call on ajax context if (Tools::getValue('ajax') != '1') { //__ Get last update date $toSynchronize = false; $last_update_date = Configuration::get('GLS_LAST_SYNCHRO_DATE', ''); // Si la dernière synchro date de plus de 24h $last_update = new DateTime($last_update_date); $now = new DateTime(); if (empty($last_update_date) || $last_update->format('Ymd') < $now->format('Ymd')) { // Mise à jour de la date de synchro Configuration::updateValue('GLS_LAST_SYNCHRO_DATE', date('Y-m-d H:i:s')); // Ressource locale qui contiendra le fichier téléchargé $filename = 'tbzipdeltimes_'.date('Ymd').'.csv'; $handle = fopen($this->importDirectory.$filename, 'w'); // Connexion basique avec timeout de 5s $conn_id = ftp_connect(self::$ftp_host, 21, 5); $login_result = ftp_login($conn_id, self::$ftp_login, self::$ftp_pwd); if ($login_result) { foreach (ftp_nlist($conn_id, ".") as $f) { // il existe un fichier au format if (preg_match('/^tbzipdeltimes_(\d{8}).csv$/i', $f, $date)) { // Le fichier est plus récent que la date de dernière synchro if (empty($last_update_date) || $date[1] > $last_update->format('Ymd')) { // download the file into $handle if (ftp_fget($conn_id, $handle, $f, FTP_ASCII, 0)) { // Check hash of the file $hash = md5_file($this->importDirectory.$filename); if ($hash != Configuration::get('GLS_SYNCHRO_FILE_CONTENT_HASH', '')) { Configuration::updateValue('GLS_SYNCHRO_FILE_CONTENT_HASH', $hash); $toSynchronize = true; $csv_file = new NkmCSVReader(); $_file_content = $csv_file->parse_file($this->importDirectory.$filename, false, true); break; } } } } } } // Fermeture de la connexion et du pointeur de fichier ftp_close($conn_id); fclose($handle); unlink($this->importDirectory.$filename); } if ($_force || $toSynchronize) { if (!empty($_file_content) && is_array($_file_content) && count($_file_content) > 0) { $query = ''; foreach ($_file_content as $line) { $query .= '(\''.pSQL($line[0]).'\', \''.pSQL($line[1]).'\', \''.pSQL($line[2]).'\'),'; } $query = trim($query, ','); if (!empty($query)) { if (Db::getInstance()->execute('TRUNCATE TABLE `' . _DB_PREFIX_ . 'gls_agency_postcode`')) { Db::getInstance()->execute('INSERT INTO `' . _DB_PREFIX_ . 'gls_agency_postcode` (`agency_code`, `postcode_start`, `postcode_end`) VALUES '.$query); } } } } } } /** * Retourne tous les IDs des modes de livraison du module GLS (historique compris en cas de modification du transporteur) */ public function getCarrierIdHistory($_code = null) { $search = array(); if (!is_null($_code) && array_key_exists($_code, self::$carrier_definition)) { $search[$_code] = self::$carrier_definition[$_code]; } else { $search = self::$carrier_definition; } $result = array(); foreach (array_keys($search) as $key) { $log = Configuration::get('GLS_'.$key.'_LOG', null, $this->context->shop->id_shop_group, $this->context->shop->id); if (!empty($log)) { $history_log = explode('|', Configuration::get('GLS_'.$key.'_LOG', null, $this->context->shop->id_shop_group, $this->context->shop->id)); } else { $history_log = array(); } $carrier_id = Configuration::get('GLS_'.$key.'_ID', 0, $this->context->shop->id_shop_group, $this->context->shop->id); if ((int)$carrier_id > 0) { $history_log[] = Configuration::get('GLS_'.$key.'_ID', null, $this->context->shop->id_shop_group, $this->context->shop->id); } foreach ($history_log as $k => $v) { if (empty($v)) { unset($history_log[$k]); } } $result[$key] = $history_log; } return $result; } /** * Cron Export/import GLS */ public function cronTask() { try { $controller = new AdminGlsOrderController(true); $exportConfig = $controller->getConfigFormValues('export'); $importConfig = $controller->getConfigFormValues('import'); /** * Import des commandes */ if ($importConfig['GLS_IMPORT_AUTOMATION'] && (!Tools::getIsset('action') || (Tools::getIsset('action') && Tools::getValue('action') === 'import')) ) { $controller->importWinexpe(); if (!empty($controller->errors)) { // LOG $gls_log = new GlsLogClass(); $gls_log->log($this->l('Automatic import:') .' '. implode(Tools::nl2br("\n"), array_map('pSQL', $controller->errors))); } } /** * Export des commandes */ if ($exportConfig['GLS_EXPORT_AUTOMATION'] && (!Tools::getIsset('action') || (Tools::getIsset('action') && Tools::getValue('action') === 'export')) ) { $controller->exportWinexpe(); if (!empty($controller->errors)) { // LOG $gls_log = new GlsLogClass(); $gls_log->log($this->l('Automatic export:') .' '. implode(Tools::nl2br("\n"), array_map('pSQL', $controller->errors))); } } } catch (Exception $e) { die($e->getMessage()); } } public function displayInfoByCart($_id_cart) { // TODO: Essayer de factoriser le code ci-dessous avec celui affichant l'adresse du point relais dans l'historique de commande $query = new DbQuery(); $query->select('c.*') ->from('gls_cart_carrier', 'c') ->where('c.`id_cart` = '.(int)$_id_cart); if ($result = Db::getInstance()->getRow($query)) { //__ Define a delivery address to display $addressDelivery = new Address(); $addressDelivery->company = $result['name']; $addressDelivery->address1 = $result['address1']; $addressDelivery->address2 = $result['address2']; $addressDelivery->postcode = $result['postcode']; $addressDelivery->city = $result['city']; $addressDelivery->phone_mobile = $result['phone_mobile']; $addressDelivery->phone = $result['phone']; $addressDelivery->id_country = $result['id_country']; $addressDelivery->country = Country::getNameById($this->context->language->id, (int)$result['id_country']); $this->context->smarty->assign(array( 'parcel_shop_id' => $result['parcel_shop_id'], 'address_delivery' => $addressDelivery, 'address_delivery_formatted' => AddressFormat::generateAddress($addressDelivery, array(), Tools::nl2br("\n")), )); return $this->context->smarty->fetch($this->local_path . 'views/templates/admin/'.$this->templates['displayInfoByCart']); } } private function getPrestaShopVersion() { if (version_compare(_PS_VERSION_, '1.7.', '<')) { return '1.6'; } elseif (version_compare(_PS_VERSION_, '1.7.1', '<')) { return '1.7.0'; } elseif (version_compare(_PS_VERSION_, '1.7.2', '<')) { return '1.7.1'; } else { return '1.7'; } } /** * Envoi d'un email de confirmation commande GLS * Modification de l'adresse de livraison * @param array $params */ public function hookActionValidateOrder($params) { // Suppression des donénes GLS si le transporteur sélectionné n'est pas GLS $order_detail = self::getCartCarrierDetail($params['order']->id_cart, $params['order']->id_customer); if ($order_detail && (int)$order_detail['id_carrier'] != (int)$params['order']->id_carrier) { Db::getInstance()->delete('gls_cart_carrier', 'id_cart = "'.pSQL($params['order']->id_cart).'"'); } else { $glsRelaisIds = $this->getCarrierIdHistory('GLSRELAIS'); $addressDelivery = $this->getGlsRelayAddress($params['order']->id_cart, $params['order']->id_carrier, $params['order']->id_customer); if ($addressDelivery && $addressDelivery['addressObject'] && isset($glsRelaisIds['GLSRELAIS']) && in_array($params['order']->id_carrier, $glsRelaisIds['GLSRELAIS']) ) { $id_lang = (int)$params['order']->id_lang; $customer = new Customer($params['order']->id_customer); $carrier = new Carrier((int)$params['order']->id_carrier); //__ Modification de l'adresse de livraison du client try { $new_address = clone $addressDelivery['addressObject']; $customer_address = new Address($params['order']->id_address_delivery); //__ Ajout de certaines informations client $new_address->alias = $carrier->name; $new_address->id_customer = $params['order']->id_customer; $new_address->firstname = $customer_address->firstname; $new_address->lastname = $customer_address->lastname; if (empty($new_address->phone_mobile)) { $new_address->phone_mobile = $addressDelivery['glsOrderDetail']['customer_phone_mobile']; } $new_address->deleted = true; $new_address->add(); $params['order']->id_address_delivery = $new_address->id; $params['order']->update(); } catch (Exception $e) { // TODO: Log error } if (isset($addressDelivery['glsOrderDetail'])) { $GLSWorkingDayObject = json_decode($addressDelivery['glsOrderDetail']['parcel_shop_working_day'], true); } $working_days = $this->displayWorkingsDay($GLSWorkingDayObject); if (!is_array($working_days) || empty($working_days)) { $working_days = array('html' => '', 'txt' => ''); } $vars = array( '{gls_logo}' => $this->context->shop->getBaseURL(true, false).$this->_path.'views/img/mails/gls-logo.jpg', '{firstname}' => $customer->firstname, '{lastname}' => $customer->lastname, '{email}' => $customer->email, '{order_name}' => $params['order']->reference, '{date}' => Tools::displayDate($params['order']->date_add, null), '{payment}' => Tools::substr($params['order']->payment, 0, 255), '{carrier}' => $carrier->name, '{address_delivery_formatted_html}' => AddressFormat::generateAddress($addressDelivery['addressObject'], array(), Tools::nl2br("\n")), '{address_delivery_formatted_txt}' => AddressFormat::generateAddress($addressDelivery['addressObject'], array(), "\n"), '{address_delivery_hours_html}' => $working_days['html'], '{address_delivery_hours_txt}' => $working_days['txt'], ); return Mail::Send( (int)$id_lang, 'gls_new_order', $this->l('GLS Order confirmation', false, (int)$id_lang), $vars, $customer->email, $customer->firstname.' '.$customer->lastname, null, null, null, null, dirname(__FILE__).'/mails/', false ); } } } /** * Display relay working day in table * @param object $_GLSWorkingDayObject */ public function displayWorkingsDay($_GLSWorkingDayObject = array()) { $trans_days = array( '0' => $this->l('Monday'), '1' => $this->l('Tuesday'), '2' => $this->l('Wednesday'), '3' => $this->l('Thursday'), '4' => $this->l('Friday'), '5' => $this->l('Saturday'), '6' => $this->l('Sunday'), ); $html = ''; $txt = ''; if ($_GLSWorkingDayObject && is_array($_GLSWorkingDayObject) && count($_GLSWorkingDayObject) > 0) { $this->smarty->assign(array( 'trans_days' => $trans_days, 'workingDayObject' => $_GLSWorkingDayObject, )); $html = $this->fetch('module:'.$this->name.'/views/templates/hook/'.$this->templates['displayWorkingsDay']); foreach ($trans_days as $day => $dname) { if (isset($_GLSWorkingDayObject[$day])) { if ($_GLSWorkingDayObject[$day]['Breaks']['Hours']['From']) { $txt .= $dname.': '."\n". Tools::substr($_GLSWorkingDayObject[$day]['OpeningHours']['Hours']['From'], 0, 2).':'.Tools::substr($_GLSWorkingDayObject[$day]['OpeningHours']['Hours']['From'], 2, 2). ' - '.Tools::substr($_GLSWorkingDayObject[$day]['Breaks']['Hours']['From'], 0, 2).':'.Tools::substr($_GLSWorkingDayObject[$day]['Breaks']['Hours']['From'], 2, 2). "\n".Tools::substr($_GLSWorkingDayObject[$day]['Breaks']['Hours']['To'], 0, 2).':'.Tools::substr($_GLSWorkingDayObject[$day]['Breaks']['Hours']['To'], 2, 2). ' - '.Tools::substr($_GLSWorkingDayObject[$day]['OpeningHours']['Hours']['To'], 0, 2).':'.Tools::substr($_GLSWorkingDayObject[$day]['OpeningHours']['Hours']['To'], 2, 2); } else { $txt .= $dname.': '.Tools::substr($_GLSWorkingDayObject[$day]['OpeningHours']['Hours']['From'], 0, 2).':'.Tools::substr($_GLSWorkingDayObject[$day]['OpeningHours']['Hours']['From'], 2, 2). Tools::substr($_GLSWorkingDayObject[$day]['OpeningHours']['Hours']['To'], 0, 2).':'.Tools::substr($_GLSWorkingDayObject[$day]['OpeningHours']['Hours']['To'], 2, 2); } } else { $txt .= $dname.': '.$this->l('Closed'); } $txt .= "\n"; } } return array('txt' => $txt, 'html' => $html); } /** * Retourne l'adresse du point relay sous format d'objet Address * @param unknown $_id_cart * @param unknown $_id_carrier * @param unknown $_id_customer */ public function getGlsRelayAddress($_id_cart, $_id_carrier, $_id_customer) { if (empty($_id_cart) || empty($_id_carrier) || empty($_id_customer)) { return false; } $order_detail = self::getCartCarrierDetail($_id_cart, $_id_customer, $_id_carrier); if ($order_detail) { //__ Define a delivery address to display $addressDelivery = new Address(); $addressDelivery->company = $order_detail['name']; $addressDelivery->address1 = $order_detail['address1']; $addressDelivery->address2 = $order_detail['address2']; $addressDelivery->postcode = $order_detail['postcode']; $addressDelivery->city = $order_detail['city']; $addressDelivery->phone_mobile = $order_detail['phone_mobile']; $addressDelivery->phone = $order_detail['phone']; $addressDelivery->id_country = $order_detail['id_country']; $addressDelivery->country = Country::getNameById($this->context->language->id, (int)$order_detail['id_country']); return array('addressObject' => $addressDelivery, 'glsOrderDetail' => $order_detail); } return false; } /** * Envoi du mail au client avec le numéro de suivi * @param object $_order_carrier * @param object $_order */ public function sendInTransitEmail($_order_carrier, $_order, $_id_carrier = null) { if (version_compare(_PS_VERSION_, '1.7.1', '<') || Shop::isFeatureActive()) { if (is_null($_id_carrier)) { $_id_carrier = $_order->id_carrier; } $customer = new Customer((int)$_order->id_customer); $carrier = new Carrier((int)$_id_carrier, $_order->id_lang); if (Validate::isLoadedObject($customer) && Validate::isLoadedObject($carrier)) { $translator = Context::getContext()->getTranslator(); $orderLanguage = new Language((int) $_order->id_lang); $templateVars = array( '{followup}' => str_replace('@', $_order->shipping_number, $carrier->url), '{firstname}' => $customer->firstname, '{lastname}' => $customer->lastname, '{id_order}' => $_order->id, '{shipping_number}' => $_order->shipping_number, '{order_name}' => $_order->getUniqReference() ); return Mail::Send( (int)$_order->id_lang, 'in_transit', $translator->trans( 'Package in transit', array(), 'Emails.Subject', $orderLanguage->locale ), $templateVars, $customer->email, $customer->firstname . ' ' . $customer->lastname, null, null, null, null, _PS_MAIL_DIR_, false, (int)$_order->id_shop ); } } else { // Exception possible en mode debug return @$_order_carrier->sendInTransitEmail($_order); } // TODO: est il utile d'executer le hook à ce niveau ? // $customer = new Customer((int)$order->id_customer); // $carrier = new Carrier((int)$order->id_carrier, $order->id_lang); // Hook::exec('actionAdminOrdersTrackingNumberUpdate', array( // 'order' => $order, // 'customer' => $customer, // 'carrier' => $carrier // ), null, false, true, false, $order->id_shop); return false; } public function hookActionDeleteGDPRCustomer($customer) { if (!empty($customer['id_customer']) && Validate::isLoadedObject(new Customer((int)$customer['id']))) { if (Db::getInstance()->execute('UPDATE `' . _DB_PREFIX_ . 'gls_cart_carrier` SET `customer_phone_mobile`=\'\', `id_customer`='.(int)Configuration::get('PSGDPR_ANONYMOUS_CUSTOMER').' WHERE id_customer = '.(int)$customer['id'])) { return json_encode(true); } return json_encode($this->l('GLS : Unable to delete customer using id.')); } } public function hookActionObjectCustomerDeleteAfter($params) { Db::getInstance()->execute('UPDATE `' . _DB_PREFIX_ . 'gls_cart_carrier` SET `customer_phone_mobile`=\'\', `id_customer`='.(int)Configuration::get('PSGDPR_ANONYMOUS_CUSTOMER').' WHERE id_customer = '.(int)$params['object']->id); } public function hookActionExportGDPRData($customer) { if (!empty($customer['id']) && Validate::isLoadedObject(new Customer((int)$customer['id']))) { $data = array(); $res = Db::getInstance()->ExecuteS("SELECT * FROM "._DB_PREFIX_."gls_cart_carrier WHERE id_customer = '".(int)$customer['id']."'"); if ($res) { foreach ($res as $value) { array_push($data, array( $this->l('ID cart') => $value['id_cart'], $this->l('Customer phone mobile') => $value['customer_phone_mobile'], )); } return json_encode($data); } return json_encode($this->l('No data found.')); } } }