* @copyright 2010-2016 La Poste SA
* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0)
* International Registered Trademark & Property of La Poste SA
*/
if (!defined('_PS_VERSION_')) {
exit;
}
require_once _PS_MODULE_DIR_.'colissimo_simplicite/models/ColissimoDeliveryInfo.php';
require_once(_PS_MODULE_DIR_.'colissimo_simplicite/models/ColissimoDeliveryPoint.php');
class Colissimo_simplicite extends CarrierModule
{
protected $config_form = false;
protected $config_single_values_keys = false;
private $api_num_version = '4.0';
protected $initial_cost;
public $url = '';
private $link_to_img = '';
private $config = array(
'name' => 'La Poste - Colissimo Simplicité',
'id_tax_rules_group' => 0,
'url' => 'http://www.colissimo.fr/portail_colissimo/suivreResultat.do?parcelnumber=@',
'active' => true,
'deleted' => 0,
'shipping_handling' => false,
'range_behavior' => 0,
'is_module' => true,
'delay' => array(
'fr' => 'Faites vous livrer en France métropolitaine ou en Europe, dans un des points retrait Colissimo.',
'en' => 'Do you deliver wherever you want in France.'),
'id_zone' => 1,
'shipping_external' => true,
'external_module_name' => 'colissimo_simplicite',
'need_range' => true
);
public function __construct()
{
$this->name = 'colissimo_simplicite';
$this->tab = 'shipping_logistics';
$this->version = '4.0.13';
$this->author = 'Quadra Informatique';
$this->module_key = '8b991db851bdf7c64ca441f1a4481964';
$this->need_instance = 1;
$this->bootstrap = true;
parent::__construct();
$this->displayName = $this->l('Colissimo Simplicite');
$this->description = $this->l('Offer your customer 5 different delivery methods with LaPoste.');
$this->confirmUninstall = $this->l('Removing the module will also delete the associated carrier');
$this->ps_versions_compliancy = array(
'min' => '1.7',
'max' => _PS_VERSION_);
$protocol = 'http://';
$this->link_to_img = $this->_path.'/views/img/';
if (Configuration::get('PS_SSL_ENABLED') && Configuration::get('PS_SSL_ENABLED_EVERYWHERE')) {
$protocol = 'https://';
}
$this->url = $protocol.Tools::getShopDomainSsl().__PS_BASE_URI__.'modules/'.$this->name.'/validation.php';
if (self::isInstalled($this->name)) {
$warning = array();
$so_carrier = new Carrier(Configuration::get('COLISSIMO_CARRIER_ID'));
if (Validate::isLoadedObject($so_carrier)) {
if (!$this->checkZone((int)$so_carrier->id)) {
$warning[] .= $this->l('\'Carrier Zone(s)\'').' ';
}
if (!$this->checkGroup((int)$so_carrier->id)) {
$warning[] .= $this->l('\'Carrier Group\'').' ';
}
if (!$this->checkRange((int)$so_carrier->id)) {
$warning[] .= $this->l('\'Carrier Range(s)\'').' ';
}
if (!$this->checkDelivery((int)$so_carrier->id)) {
$warning[] .= $this->l('\'Carrier price delivery\'').' ';
}
}
//Check config and display warning
if (!Configuration::get('COLISSIMO_ID')) {
$warning[] .= $this->l('\'Id FO\'').' ';
}
if (!Configuration::get('COLISSIMO_KEY')) {
$warning[] .= $this->l('\'Key\'').' ';
}
if (!Configuration::get('COLISSIMO_URL')) {
$warning[] .= $this->l('\'Url So\'').' ';
}
if (count($warning)) {
$this->warning .= implode(' , ', $warning).$this->l('must be configured to use this module correctly').' ';
}
}
$this->config_single_values_keys = array(
'COLISSIMO_CARRIER_ID',
'COLISSIMO_ID',
'COLISSIMO_KEY',
'COLISSIMO_URL',
'COLISSIMO_URL_MOBILE',
'COLISSIMO_URL_POINTDERETRAIT',
'COLISSIMO_WS_URL',
'COLISSIMO_OVERCOST',
'COLISSIMO_COST_SELLER',
'COLISSIMO_SELLER_AMOUNT',
'COLISSIMO_UPG_COUNTRY',
'COLISSIMO_PREPARATION_TIME',
'COLISSIMO_CARRIER_ID',
'COLISSIMO_MIN_COST',
'COLISSIMO_SUP',
'COLISSIMO_SUP_URL',
'COLISSIMO_OVERCOST_TAX',
'COLISSIMO_PERSONAL_PHONE',
'COLISSIMO_PERSONAL_ZIP_CODE',
'COLISSIMO_PERSONAL_QUANTITIES',
'COLISSIMO_PERSONAL_SIRET',
'COLISSIMO_PERSONAL_DATA',
'COLISSIMO_SELLER_IMPACT',
'COLISSIMO_USE_POINTDERETRAIT',
'COLISSIMO_LOGIN',
'COLISSIMO_PASSWORD'
);
$this->config_single_values_keys_exception = array(
'COLISSIMO_PERSONAL_PHONE',
'COLISSIMO_PERSONAL_ZIP_CODE',
'COLISSIMO_PERSONAL_QUANTITIES',
'COLISSIMO_PERSONAL_SIRET',
'COLISSIMO_PERSONAL_DATA',
'COLISSIMO_PERSONAL_ACCEPT'
);
}
public function install()
{
if (extension_loaded('curl') == false) {
$this->_errors[] = $this->l('You have to enable the cURL extension on your server to install this module');
return false;
}
$carrier = $this->addCarrier();
$this->addZones($carrier);
$this->addGroups($carrier);
$this->addRanges($carrier);
if (!Configuration::updateValue('COLISSIMO_ID', null) ||
!Configuration::updateValue('COLISSIMO_KEY', null) ||
!Configuration::updateValue('COLISSIMO_URL', 'ws.colissimo.fr/pudo-fo-frame/storeCall.do') ||
!Configuration::updateValue('COLISSIMO_URL_MOBILE', 'ws-mobile.colissimo.fr/') ||
!Configuration::updateValue('COLISSIMO_PREPARATION_TIME', 1) ||
!Configuration::updateValue('COLISSIMO_OVERCOST', 3.6) ||
!Configuration::updateValue('COLISSIMO_COST_SELLER', false) ||
!Configuration::updateValue('COLISSIMO_SELLER_AMOUNT', 0) ||
!Configuration::updateValue('COLISSIMO_SELLER_IMPACT', 0) ||
!Configuration::updateValue('COLISSIMO_SUP_URL', 'ws.colissimo.fr/supervision-pudo-frame/supervision.jsp') ||
!Configuration::updateValue('COLISSIMO_SUP', true) ||
!Configuration::updateValue('COLISSIMO_TOKEN_POINTDERETRAIT', '') ||
!Configuration::updateValue('COLISSIMO_PDR_TOKEN_HOUR', '') ||
!Configuration::updateValue('COLISSIMO_USE_POINTDERETRAIT', '1') ||
!Configuration::updateValue('COLISSIMO_URL_POINTDERETRAIT', 'ws.colissimo.fr/widget-point-retrait/rest/authenticate.rest') ||
!Configuration::updateValue('COLISSIMO_WS_URL', 'ws.colissimo.fr/') ||
!Configuration::updateValue('COLISSIMO_LOGIN', null) ||
!Configuration::updateValue('COLISSIMO_PASSWORD', null)
) {
return false;
}
include(dirname(__FILE__).'/sql/install.php');
return parent::install() &&
$this->registerHook('header') &&
$this->registerHook('backOfficeHeader') &&
$this->registerHook('updateCarrier') &&
$this->registerHook('actionValidateOrder') &&
$this->registerHook('actionCarrierUpdate') &&
$this->registerHook('displayAdminOrder') &&
$this->registerHook('displayCarrierExtraContent');
}
public function uninstall()
{
$so_id = (int)Configuration::get('COLISSIMO_CARRIER_ID');
//Configuration::deleteByName('COLISSIMO_ID');
//Configuration::deleteByName('COLISSIMO_KEY');
Configuration::deleteByName('COLISSIMO_URL');
Configuration::deleteByName('COLISSIMO_URL_MOBILE');
Configuration::deleteByName('COLISSIMO_OVERCOST');
Configuration::deleteByName('COLISSIMO_COST_SELLER');
Configuration::deleteByName('COLISSIMO_SELLER_AMOUNT');
Configuration::deleteByName('COLISSIMO_SELLER_IMPACT');
Configuration::deleteByName('COLISSIMO_UPG_COUNTRY');
Configuration::deleteByName('COLISSIMO_PREPARATION_TIME');
Configuration::deleteByName('COLISSIMO_CARRIER_ID');
Configuration::deleteByName('COLISSIMO_SUP');
Configuration::deleteByName('COLISSIMO_SUP_URL');
Configuration::deleteByName('COLISSIMO_OVERCOST_TAX');
$carrier = new Carrier($so_id);
$carrier->delete();
include(dirname(__FILE__).'/sql/uninstall.php');
return parent::uninstall();
}
/**
* Load the configuration form
*/
public function getContent()
{
if (((bool)Tools::isSubmit('submitColissimo_simpliciteModule')) == true) {
$this->postProcess();
}
$this->context->smarty->assign(array(
'module_dir' => $this->_path,
'colissimo_version' => $this->version
));
$output = $this->context->smarty->fetch($this->local_path.'views/templates/admin/configure.tpl');
if (!Configuration::get('COLISSIMO_PERSONAL_DATA')) {
$output .= $this->context->smarty->fetch($this->local_path.'views/templates/admin/configure_warning.tpl');
}
return $output.$this->renderForm();
}
protected function renderForm()
{
$helper = new HelperForm();
$helper->show_toolbar = false;
$helper->table = $this->table;
$helper->module = $this;
$helper->default_form_language = $this->context->language->id;
$helper->allow_employee_form_lang = Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG', 0);
$helper->identifier = $this->identifier;
$helper->submit_action = 'submitColissimo_simpliciteModule';
$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->tpl_vars = array(
'fields_value' => $this->getConfigFormValues(), /* Add values for your inputs */
'languages' => $this->context->controller->getLanguages(),
'id_language' => $this->context->language->id,
);
return $helper->generateForm(array(
array(
'form' => $this->getConfigForm()
)
));
}
/**
* Create the structure of your form.
*/
protected function getConfigForm()
{
$form = array(
'legend' => array(
'title' => $this->l('Colissimo Simplicity').' V'.$this->version,
'icon' => 'icon-cogs',
),
'submit' => array(
'title' => $this->l('Save'),
)
);
//======================================================================
// INFO TAB
$form['tabs']['about'] = $this->l('About Colissimo Informations');
// Check current language
$language = new Language($this->context->language->id);
$defaut_tpl = $this->local_path.'views/templates/admin/about_fr.tpl';
if ($language->iso_code != 'fr') {
$defaut_tpl = $this->local_path.'views/templates/admin/about_en.tpl';
}
$form['input'][] = array(
'tab' => 'about',
'type' => 'html',
'name' => 'about',
'html_content' => $this->context->smarty->fetch($defaut_tpl),
);
//======================================================================
// CREDENTIALS TAB
$form['tabs']['credentials'] = $this->l('Merchant Informations');
$form['input'][] = array(
'tab' => 'credentials',
'type' => 'text',
'col' => 2,
'required' => true,
'label' => $this->l('Phone number'),
'name' => 'COLISSIMO_PERSONAL_PHONE',
'desc' => $this->l('Example 0144183004'),
);
$form['input'][] = array(
'tab' => 'credentials',
'type' => 'text',
'col' => 2,
'required' => true,
'label' => $this->l('Zip code'),
'name' => 'COLISSIMO_PERSONAL_ZIP_CODE',
'desc' => $this->l('Example 92300'),
);
$form['input'][] = array(
'tab' => 'credentials',
'type' => 'select',
'required' => true,
'label' => $this->l('Mean number of parcels'),
'name' => 'COLISSIMO_PERSONAL_QUANTITIES',
'options' => array(
'query' => array(
array(
'id' => '< 250 colis / mois',
'name' => $this->l('< 250 colis / mois')
),
array(
'id' => '> 250 colis / mois',
'name' => $this->l('> 250 colis / mois')
),
),
'id' => 'id',
'name' => 'name'
),
);
$form['input'][] = array(
'tab' => 'credentials',
'type' => 'text',
'col' => 2,
'required' => true,
'label' => $this->l('Siret'),
'name' => 'COLISSIMO_PERSONAL_SIRET',
'desc' => $this->l('Siret is 14 number'),
);
$form['input'][] = array(
'tab' => 'credentials',
'type' => 'checkbox',
'required' => true,
'label' => $this->l('Terms & conditions'),
'name' => 'COLISSIMO_PERSONAL',
'desc' => $this->l('In case of refusal, you can sent an email at the following address').
' : modules-prestashop@laposte.fr',
'values' => array(
'query' => array(
array(
'id' => 'ACCEPT',
'name' => $this->l('I accept that informations concerning the number of parcels are sent to our partner La poste - Colissimo'),
'val' => 1
),
),
'id' => 'id',
'name' => 'name',
)
);
//======================================================================
// GENERAL TAB
$form['tabs']['general'] = $this->l('Your Colissimo Box');
$form['input'][] = array(
'tab' => 'general',
'col' => 3,
'type' => 'text',
'required' => true,
'label' => $this->l('Encryption key'),
'name' => 'COLISSIMO_KEY',
'desc' => $this->l('Available in your ').' Colissimo Box '.'
'.
$this->l('by using the menu "Applications > Delivery > Choice of delivery methods" ')
);
$form['input'][] = array(
'tab' => 'general',
'col' => 3,
'type' => 'text',
'required' => true,
'label' => $this->l('Front Office Identifier'),
'name' => 'COLISSIMO_ID',
'desc' => $this->l('Available in your ').' Colissimo Box '.'
'.
$this->l('by using the menu "Applications > Delivery > Choice of delivery methods" ')
);
$form['input'][] = array(
'tab' => 'general',
'col' => 3,
'type' => 'text',
'required' => true,
'label' => $this->l('Order Preparation time'),
'suffix' => $this->l('Day(s)'),
'name' => 'COLISSIMO_PREPARATION_TIME',
'desc' => $this->l('Business days from Monday to Friday').
'
'.$this->l('Must be the same parameter as in your ').
' Colissimo Box '
);
$form['input'][] = array(
'tab' => 'general',
'type' => 'html',
'name' => 'url_note',
'html_content' => '
'.htmlentities($this->url, ENT_NOQUOTES, 'UTF-8').'
'; $return['RETURN_URL'] = ''.htmlentities($this->url, ENT_NOQUOTES, 'UTF-8').'
'; return $return; } protected function savePreactivationRequest() { $employee = new Employee((int)Context::getContext()->cookie->id_employee); $data = array( 'iso_lang' => Tools::strtolower($this->context->language->iso_code), 'iso_country' => Tools::strtoupper($this->context->country->iso_code), 'host' => $_SERVER['HTTP_HOST'], 'ps_version' => _PS_VERSION_, 'ps_creation' => _PS_CREATION_DATE_, 'partner' => $this->name, 'firstname' => $employee->firstname, 'lastname' => $employee->lastname, 'email' => $employee->email, 'shop' => Configuration::get('PS_SHOP_NAME'), 'type' => 'home', 'phone' => Configuration::get('COLISSIMO_PERSONAL_PHONE'), 'zipcode' => Configuration::get('COLISSIMO_PERSONAL_ZIP_CODE'), 'fields' => serialize( array( 'quantities' => Configuration::get('COLISSIMO_PERSONAL_QUANTITIES'), 'siret' => Configuration::get('COLISSIMO_PERSONAL_SIRET'), ) ), ); $query = http_build_query($data); return @Tools::file_get_contents('http://api.prestashop.com/partner/premium/set_request.php?'.$query); } /** * Save form data. */ protected function postProcess() { if (Tools::getValue('COLISSIMO_ID') == null && (!Configuration::get('COLISSIMO_USE_POINTDERETRAIT')) && (Tools::getValue('COLISSIMO_USE_POINTDERETRAIT') == 0)) { $this->context->controller->errors[] = $this->l('ID SO not specified'); } if (Tools::getValue('COLISSIMO_KEY') == null && (Configuration::get('COLISSIMO_USE_POINTDERETRAIT') == 0) && (Tools::getValue('COLISSIMO_USE_POINTDERETRAIT') == 0)) { $this->context->controller->errors[] = $this->l('Key SO not specified'); } if (Tools::getValue('COLISSIMO_LOGIN') == null && (Configuration::get('COLISSIMO_USE_POINTDERETRAIT') == 1) && (Tools::getValue('COLISSIMO_USE_POINTDERETRAIT') == 1 )) { $this->context->controller->errors[] = $this->l('Login Colissimo is not specified, required for free option'); } if (Tools::getValue('COLISSIMO_PASSWORD') == null && (Configuration::get('COLISSIMO_USE_POINTDERETRAIT') == 1) && (Tools::getValue('COLISSIMO_USE_POINTDERETRAIT') == 1 )) { $this->context->controller->errors[] = $this->l('Pass Colissimo is not specified, required for free option'); } if (Tools::getValue('COLISSIMO_PREPARATION_TIME') == null) { $this->context->controller->errors[] = $this->l('Preparation time not specified'); } elseif (!Validate::isInt(Tools::getValue('COLISSIMO_PREPARATION_TIME'))) { $this->context->controller->errors[] = $this->l('Invalid preparation time'); } if (Tools::getValue('COLISSIMO_URL') == null) { $this->context->controller->errors[] = $this->l('Front URL is not specified'); } if (Tools::getValue('COLISSIMO_URL_MOBILE') == null) { $this->context->controller->errors[] = $this->l('Front mobile URL is not specified'); } if (Tools::getValue('COLISSIMO_SUP_URL') == null) { $this->context->controller->errors[] = $this->l('Supervision URL is not specified'); } if (!count($this->context->controller->errors)) { // re allocation id socolissimo if needed if ((int)Tools::getValue('COLISSIMO_CARRIER_ID') != (int)Configuration::get('COLISSIMO_CARRIER_ID')) { Configuration::updateValue( 'COLISSIMO_CARRIER_ID', (int)Tools::getValue('COLISSIMO_CARRIER_ID') ); $this->reallocationCarrier((int)Configuration::get('COLISSIMO_CARRIER_ID')); } foreach ($this->config_single_values_keys as $key) { if (!array_search($key, $this->config_single_values_keys_exception)) { Configuration::updateValue($key, Tools::getValue($key)); } } } $reload_credit = false; if (Configuration::get('COLISSIMO_PERSONAL_DATA')) { if (Tools::getValue('COLISSIMO_PERSONAL_PHONE') && (Tools::getValue('COLISSIMO_PERSONAL_PHONE') != Configuration::get('COLISSIMO_PERSONAL_PHONE'))) { $reload_credit = true; } if (Tools::getValue('COLISSIMO_PERSONAL_ZIP_CODE') && (Tools::getValue('COLISSIMO_PERSONAL_ZIP_CODE') != Configuration::get('COLISSIMO_PERSONAL_ZIP_CODE'))) { $reload_credit = true; } if (Tools::getValue('COLISSIMO_PERSONAL_QUANTITIES') && (Tools::getValue('COLISSIMO_PERSONAL_QUANTITIES') != Configuration::get('COLISSIMO_PERSONAL_QUANTITIES'))) { $reload_credit = true; } if (Tools::getValue('COLISSIMO_PERSONAL_SIRET') && (Tools::getValue('COLISSIMO_PERSONAL_SIRET') != Configuration::get('COLISSIMO_PERSONAL_SIRET'))) { $reload_credit = true; } } if (!Configuration::get('COLISSIMO_PERSONAL_DATA') || $reload_credit) { if (!(bool)preg_match('#^(([\d]{2})([\s]){0,1}){5}$#', Tools::getValue('COLISSIMO_PERSONAL_PHONE'))) { $this->context->controller->errors[] = $this->l('Phone number is incorrect'); } if (!(bool)preg_match('#^(([0-8][0-9])|(9[0-5]))[0-9]{3}$#', Tools::getValue('COLISSIMO_PERSONAL_ZIP_CODE'))) { $this->context->controller->errors[] = $this->l('Zip code is incorrect'); } if (!Tools::getValue('COLISSIMO_PERSONAL_QUANTITIES')) { $this->context->controller->errors[] = $this->l('Mean number is incorrect'); } if (!$this->isSiret(Tools::getValue('COLISSIMO_PERSONAL_SIRET'))) { $this->context->controller->errors[] = $this->l('Siret is incorrect'); } if (!Tools::getValue('COLISSIMO_PERSONAL_ACCEPT')) { $this->context->controller->errors[] = $this->l('You must accept terms and conditions'); } if (!count($this->context->controller->errors)) { Configuration::updateValue('COLISSIMO_PERSONAL_PHONE', Tools::getValue('COLISSIMO_PERSONAL_PHONE')); Configuration::updateValue('COLISSIMO_PERSONAL_ZIP_CODE', Tools::getValue('COLISSIMO_PERSONAL_ZIP_CODE')); Configuration::updateValue('COLISSIMO_PERSONAL_QUANTITIES', Tools::getValue('COLISSIMO_PERSONAL_QUANTITIES')); Configuration::updateValue('COLISSIMO_PERSONAL_SIRET', Tools::getValue('COLISSIMO_PERSONAL_SIRET')); Configuration::updateValue('COLISSIMO_PERSONAL_ACCEPT', Tools::getValue('COLISSIMO_PERSONAL_ACCEPT')); Configuration::updateValue('COLISSIMO_USE_POINTDERETRAIT', Tools::getValue('COLISSIMO_USE_POINTDERETRAIT')); if ($this->savePreactivationRequest()) { Configuration::updateValue('COLISSIMO_PERSONAL_DATA', 1); } } } } public function getOrderShippingCost($params, $shipping_cost) { // for order in BO if (!$this->context->cart instanceof Cart || !$this->context->cart->id) { $this->context->cart = new Cart($params->id); } // check colissimopass module installed and used if (Module::isEnabled('colissimopass')) { // is user connect ? require_once(_PS_MODULE_DIR_.'colissimopass/classes/ColissimoPassUser.php'); if (ColissimoPassUser::isActive()) { return 0; } // is product pass in cart ? $cart = $this->context->cart; $products = $cart->getProducts(); if (is_array($products)) { foreach ($products as $product) { if ($product['id_product'] == (int)Configuration::get('ID_COLISSIMO_PASS_PDT')) { return 0; } } } } if (!$this->initial_cost) { $this->initial_cost = $shipping_cost; } // check api already return a shipping cost ? $api_price = $this->getApiPrice((int)$this->context->cart->id); if ($api_price) { $carrier_colissimo = new Carrier((int)Configuration::get('COLISSIMO_CARRIER_ID')); $address = new Address((int)$this->context->cart->id_address_delivery); $tax = $carrier_colissimo->getTaxesRate($address); // must retrieve the price without tax if needed if ($tax) { (float)$tax_rate = ((float)$tax / 100) + 1; $api_price = (float)$api_price / (float)$tax_rate; } return (float)$api_price; } return $shipping_cost; } public function getOrderShippingCostExternal($params) { return true; } protected function addCarrier() { $carrier = new Carrier(); $carrier->name = $this->config['name']; $carrier->id_tax_rules_group = $this->config['id_tax_rules_group']; $carrier->id_zone = $this->config['id_zone']; $carrier->url = $this->config['url']; $carrier->active = $this->config['active']; $carrier->deleted = $this->config['deleted']; $carrier->shipping_handling = $this->config['shipping_handling']; $carrier->range_behavior = $this->config['range_behavior']; $carrier->is_module = $this->config['is_module']; $carrier->shipping_external = $this->config['shipping_external']; $carrier->external_module_name = $this->config['external_module_name']; $carrier->need_range = $this->config['need_range']; foreach (Language::getLanguages() as $lang) { if ($lang['iso_code'] == 'fr') { $carrier->delay[$lang['id_lang']] = $this->config['delay'][$lang['iso_code']]; } if ($lang['iso_code'] == 'en') { $carrier->delay[$lang['id_lang']] = $this->config['delay'][$lang['iso_code']]; } } if (Shop::isFeatureActive()) { Shop::setContext(Shop::CONTEXT_ALL); } if ($carrier->add() == true) { @copy(dirname(__FILE__).'/views/img/colissimo.jpg', _PS_SHIP_IMG_DIR_.'/'.(int)$carrier->id.'.jpg'); Configuration::updateValue('COLISSIMO_CARRIER_ID', (int)$carrier->id); return $carrier; } return false; } protected function addGroups($carrier) { $groups_ids = array(); $groups = Group::getGroups(Context::getContext()->language->id); foreach ($groups as $group) { $groups_ids[] = $group['id_group']; } $carrier->setGroups($groups_ids); } protected function addRanges($carrier) { $range_price = new RangePrice(); $range_price->id_carrier = $carrier->id; $range_price->delimiter1 = '0'; $range_price->delimiter2 = '10000'; $range_price->add(); $range_weight = new RangeWeight(); $range_weight->id_carrier = $carrier->id; $range_weight->delimiter1 = '0'; $range_weight->delimiter2 = '10000'; $range_weight->add(); } protected function addZones($carrier) { $zones = Zone::getZones(); foreach ($zones as $zone) { $carrier->addZone($zone['id_zone']); } } /** * Add the CSS & JavaScript files you want to be loaded in the BO. */ public function hookBackOfficeHeader() { $this->context->controller->addCSS($this->_path.'views/css/back.css'); } /** * Add the CSS & JavaScript files you want to be added on the FO. */ public function hookHeader() { if (isset($this->context->controller->page_name) && $this->context->controller->page_name == "checkout") { if (Configuration::get('COLISSIMO_USE_POINTDERETRAIT')) { $this->context->controller->addJS($this->_path.'views/js/jquery.frameColiposte.js'); $this->context->controller->addJS($this->_path.'views/js/front_delivery_point.js'); } else { $this->context->controller->addJS($this->_path.'/views/js/front.js'); $this->context->controller->addJqueryPlugin(array( 'fancybox')); } } else { $this->context->controller->addJS($this->_path.'/views/js/redirect.js'); } $this->context->controller->addCSS($this->_path.'/views/css/front.css'); } public function hookActionValidateOrder($params) { if ($params['order']->id_carrier != Configuration::get('COLISSIMO_CARRIER_ID')) { return; } $order = $params['order']; if (Configuration::get('COLISSIMO_USE_POINTDERETRAIT')) { $order->id_address_delivery = $this->isExist( (int)$order->id_address_delivery, (int)$order->id_cart, (int)$order->id_customer ); } else { $order->id_address_delivery = $this->isSameAddress((int)$order->id_address_delivery, (int)$order->id_cart, (int)$order->id_customer); } $order->update(); Configuration::updateValue('COLISSIMO_CONFIGURATION_OK', true); if (Module::isEnabled('colissimopass')) { // is user connect ? require_once(_PS_MODULE_DIR_.'colissimopass/colissimopass.php'); if (ColissimoPassUser::isActive()) { Colissimopass::sendConsignment($order); } } } public function getDeliveryInfosPointderetrait($id_cart, $id_customer) { return Db::getInstance()->getRow( 'SELECT * FROM '._DB_PREFIX_.'colissimo_delivery_point WHERE id_cart = '.(int)$id_cart.' AND id_customer = '.(int)$id_customer ); } public function isExist($id_address, $id_cart, $id_customer) { $id_socolissimo_deliverypoint_info_exist = ColissimoDeliveryPoint::alreadyExists((int)$id_cart, (int)$id_customer); $return = Db::getInstance()->getRow( 'SELECT * FROM '._DB_PREFIX_.'colissimo_delivery_point WHERE id_cart =\''.(int)$id_cart.'\' AND id_customer =\''.(int)$id_customer.'\'' ); if (!$return) { return $id_address; } $socolissimo_deliverypoint_info = new ColissimoDeliveryPoint((int)$id_socolissimo_deliverypoint_info_exist); $new_address = new Address(); $customer = new Customer($id_customer); $sql = Db::getInstance()->getRow('SELECT c.id_country, cl.name FROM '._DB_PREFIX_.'country c LEFT JOIN '._DB_PREFIX_.'country_lang cl ON cl.id_lang = '.(int)$this->context->language->id.' AND cl.id_country = c.id_country WHERE iso_code = "'.pSQL($socolissimo_deliverypoint_info->codePays).'"'); $iso_code = $sql['id_country']; $new_address->id_customer = (int)$id_customer; $new_address->firstname = preg_replace('/\d/', '', Tools::substr($customer->firstname, 0, 32)); $new_address->lastname = preg_replace('/\d/', '', Tools::substr($customer->lastname, 0, 32)); $new_address->postcode = $socolissimo_deliverypoint_info->codePostal; $new_address->city = str_replace('\'', ' ', $socolissimo_deliverypoint_info->localite); $new_address->id_country = $iso_code; $new_address->company = 'Livraison en Point de Retrait'; $new_address->alias = 'Col-Point de retrait-'.date('d-m-Y'); $new_address->address1 = $socolissimo_deliverypoint_info->adresse1; ((isset($socolissimo_deliverypoint_info->adresse2)) ? $new_address->address2 = $socolissimo_deliverypoint_info->adresse2 : $new_address->address2 = ''); $this->context->cart->id_carrier = (int)Configuration::getGlobalValue('COLISSIMO_CARRIER_ID'); $new_address->add(); $new_address->deleted = 1; $new_address->save(); return (int)$new_address->id; } public function hookAdminOrder($params) { require_once _PS_MODULE_DIR_.'colissimo_simplicite/classes/SCFields.php'; $delivery_mode = array( 'DOM' => 'Livraison à domicile', 'BPR' => 'Livraison en Bureau de Poste', 'A2P' => 'Livraison Commerce de proximité', 'MRL' => 'Livraison Commerce de proximité', 'CMT' => 'Livraison Commerce', 'CIT' => 'Livraison en Cityssimo', 'ACP' => 'Agence ColiPoste', 'CDI' => 'Centre de distribution', 'BDP' => 'Bureau de poste Belge', 'RDV' => 'Livraison sur Rendez-vous'); $order = new Order($params['id_order']); $address_delivery = new Address((int)$order->id_address_delivery, (int)$params['cookie']->id_lang); $so_carrier = new Carrier((int)Configuration::get('COLISSIMO_CARRIER_ID')); $order_carrier = new Carrier((int)$order->id_carrier); $id_colissimo_delivery_info = ColissimoDeliveryPoint::alreadyExists((int)$order->id_cart, (int)$order->id_customer); if ((int)$id_colissimo_delivery_info) { $delivery_infos = $this->getDeliveryInfosPointderetrait((int)$order->id_cart, (int)$order->id_customer); $sql = Db::getInstance()->getRow('SELECT * FROM '._DB_PREFIX_.'country c LEFT JOIN '._DB_PREFIX_.'country_lang cl ON cl.id_lang = '.(int)$params['cookie']->id_lang.' AND cl.id_country = c.id_country WHERE iso_code = "'.pSQL($delivery_infos['codePays']).'"'); $name_country = $sql['name']; $is_home = false; $is_free_card = true; } else { $is_free_card = false; $id_colissimo_delivery_info = ColissimoDeliveryInfo::getDeliveryInfoExist((int)$order->id_cart, (int)$order->id_customer); if ((int)$id_colissimo_delivery_info) { $delivery_infos = new ColissimoDeliveryInfo((int)$id_colissimo_delivery_info); $sql = Db::getInstance()->getRow('SELECT * FROM '._DB_PREFIX_.'country c LEFT JOIN '._DB_PREFIX_.'country_lang cl ON cl.id_lang = '.(int)$params['cookie']->id_lang.' AND cl.id_country = c.id_country WHERE iso_code = "'.pSQL($delivery_infos->cecountry).'"'); $name_country = $sql['name']; if (((int)$order_carrier->id_reference == (int)$so_carrier->id_reference) && $delivery_infos->id) { $sc_fields = new SCFields($delivery_infos->delivery_mode); switch ($sc_fields->delivery_mode) { case SCFields::HOME_DELIVERY: $is_home = true; break; case SCFields::RELAY_POINT: $is_home = false; break; } } } } if ((int)$id_colissimo_delivery_info) { $this->context->smarty->assign(array( 'path_img' => $this->_path.'logo.gif', 'delivery_infos' => $delivery_infos, 'address_delivery' => $address_delivery, 'is_home' => $is_home, 'name_country' => $name_country, 'delivery_mode' => $delivery_mode, 'is_free_card' => $is_free_card )); return $this->display(__FILE__, 'views/templates/hook/admin_order.tpl'); } } public function hookActionCarrierUpdate($params) { if (Shop::isFeatureActive()) { Shop::setContext(Shop::CONTEXT_ALL); } if ((int)$params['id_carrier'] == (int)Configuration::get('COLISSIMO_CARRIER_ID')) { Configuration::updateValue('COLISSIMO_CARRIER_ID', (int)$params['carrier']->id); } } public function hookDisplayCarrierExtraContent($params) { $have_selected_point = false; $colissimo_delivery_info = false; $carrier_so = new Carrier((int)Configuration::get('COLISSIMO_CARRIER_ID')); if (!isset($carrier_so) || !$carrier_so->active) { return ''; } $id_carrier = (int)$carrier_so->id; $address_delivery = new Address((int)$params['cart']->id_address_delivery); $country = new Country((int)$address_delivery->id_country); $carriers = Carrier::getCarriers( $this->context->language->id, true, false, false, null, (defined('ALL_CARRIERS') ? ALL_CARRIERS : Carrier::ALL_CARRIERS) ); // bug fix for cart rule with restriction CartRule::autoAddToCart($this->context); // For now works only with single shipping ! if (method_exists($params['cart'], 'carrierIsSelected')) { if ($params['cart']->carrierIsSelected((int)$carrier_so->id, $address_delivery->id)) { $id_carrier = (int)$carrier_so->id; } } $customer = new Customer($address_delivery->id_customer); $gender = array( '1' => 'MR', '2' => 'MME', '3' => 'MLE'); if (in_array((int)$customer->id_gender, array( 1, 2))) { $cecivility = $gender[(int)$customer->id_gender]; } else { $cecivility = 'MR'; } $tax_rate = Tax::getCarrierTaxRate($id_carrier, isset($params['cart']->id_address_delivery) ? $params['cart']->id_address_delivery : null); $std_cost_with_taxes_float = (float)$this->initial_cost * (1 + ($tax_rate / 100)); $std_cost_with_taxes_str = number_format($std_cost_with_taxes_float, 2, ',', ' '); $seller_cost_with_taxes_float = 0; $seller_cost_with_taxes_str = ''; if (Configuration::get('COLISSIMO_COST_SELLER')) { if (Configuration::get('COLISSIMO_COST_IMPACT')) { $seller_cost_with_taxes_float = (float)Configuration::get('COLISSIMO_SELLER_AMOUNT') + $std_cost_with_taxes_float; } else { $seller_cost_with_taxes_float = $std_cost_with_taxes_float - (float)Configuration::get('COLISSIMO_SELLER_AMOUNT'); if ($seller_cost_with_taxes_float < 0) { $seller_cost_with_taxes_float = 0; } } $seller_cost_with_taxes_str = number_format($seller_cost_with_taxes_float, 2, ',', ' '); } $free_shipping = false; $rules = $params['cart']->getCartRules(); if (!empty($rules)) { foreach ($rules as $rule) { if ($rule['free_shipping'] && !$rule['carrier_restriction']) { $free_shipping = true; break; } } if (!$free_shipping) { $key_search = $id_carrier.','; $deliveries_list = $params['cart']->getDeliveryOptionList(); foreach ($deliveries_list as $deliveries) { foreach ($deliveries as $key => $elt) { if ($key == $key_search) { $free_shipping = $elt['is_free']; } } } } } else { // for cart rule with restriction $key_search = $id_carrier.','; $deliveries_list = $params['cart']->getDeliveryOptionList(); foreach ($deliveries_list as $deliveries) { foreach ($deliveries as $key => $elt) { if ($key == $key_search) { $free_shipping = $elt['is_free']; } } } } // town fix $town = str_replace('\'', ' ', Tools::substr($address_delivery->city, 0, 32)); $wsUrl = Configuration::get('COLISSIMO_WS_URL'); if (Configuration::get('COLISSIMO_USE_POINTDERETRAIT')) { if ((int)ColissimoDeliveryPoint::alreadyExists($this->context->cart->id, $this->context->customer->id)) { $have_selected_point = true; $colissimo_delivery_info = new ColissimoDeliveryPoint((int)ColissimoDeliveryPoint::alreadyExists($this->context->cart->id, $this->context->customer->id)); } else { $colissimo_delivery_info = new ColissimoDeliveryPoint(); } $token = Configuration::get('COLISSIMO_TOKEN_POINTDERETRAIT'); $token_update_date = Configuration::get('COLISSIMO_PDR_TOKEN_HOUR'); $now = time(); $diff = abs($now - (strtotime($token_update_date))); if ($token == null || $diff >= 899) { /* conrespond à 15 minutes */ Configuration::updateGlobalValue('COLISSIMO_TOKEN_POINTDERETRAIT', $this->getTokenPointDeRetrait()); Configuration::updateGlobalValue('COLISSIMO_PDR_TOKEN_HOUR', date('Y-m-d H:i:s')); $token = Configuration::get('COLISSIMO_TOKEN_POINTDERETRAIT'); } else { $token = Configuration::get('COLISSIMO_TOKEN_POINTDERETRAIT'); } $inputs = array( 'ceCountry' => $this->replaceAccentedChars($town), 'ceLang' => 'FR', 'dyPreparationTime' => (int)Configuration::Get('COLISSIMO_PREPARATION_TIME'), 'ceAddress' => $this->replaceAccentedChars(Tools::substr($address_delivery->address1, 0, 38)), 'ceZipCode' => $this->replaceAccentedChars($address_delivery->postcode), 'ceTown' => $this->replaceAccentedChars($town), 'dyWeight' => (float)$params['cart']->getTotalWeight() * 1000, 'cePays' => $country->iso_code, 'token' => $token, 'wsUrl' => $wsUrl, ); } else { // Keep this fields order (see doc.) $inputs = array( 'pudoFOId' => Configuration::get('COLISSIMO_ID'), 'ceName' => $this->replaceAccentedChars(Tools::substr($address_delivery->lastname, 0, 34)), 'dyPreparationTime' => (int)Configuration::Get('COLISSIMO_PREPARATION_TIME'), 'dyForwardingCharges' => $std_cost_with_taxes_str, 'dyForwardingChargesCMT' => $seller_cost_with_taxes_str, 'trClientNumber' => (int)$address_delivery->id_customer, 'orderId' => $this->formatOrderId((int)$address_delivery->id), 'numVersion' => $this->api_num_version, 'ceCivility' => $cecivility, 'ceFirstName' => $this->replaceAccentedChars(Tools::substr($address_delivery->firstname, 0, 29)), 'ceCompanyName' => $this->replaceAccentedChars(Tools::substr($address_delivery->company, 0, 38)), 'ceAdress3' => $this->replaceAccentedChars(Tools::substr($address_delivery->address1, 0, 38)), 'ceAdress4' => $this->replaceAccentedChars(Tools::substr($address_delivery->address2, 0, 38)), 'ceZipCode' => $this->replaceAccentedChars($address_delivery->postcode), 'ceTown' => $this->replaceAccentedChars($town), 'ceEmail' => $this->replaceAccentedChars($params['cookie']->email), 'cePhoneNumber' => $this->replaceAccentedChars( str_replace( array( ' ', '.', '-', ',', ';', '/', '\\', '(', ')' ), '', $address_delivery->phone_mobile ) ), 'dyWeight' => (float)$params['cart']->getTotalWeight() * 1000, 'trParamPlus' => $carrier_so->id, 'trReturnUrlKo' => htmlentities($this->url, ENT_NOQUOTES, 'UTF-8'), 'trReturnUrlOk' => htmlentities($this->url, ENT_NOQUOTES, 'UTF-8'), 'CHARSET' => 'UTF-8', 'cePays' => $country->iso_code, 'trInter' => 1, 'ceLang' => 'FR' ); } if (isset($inputs['dyForwardingChargesCMT']) && !$inputs['dyForwardingChargesCMT'] && !Configuration::get('COLISSIMO_COST_SELLER')) { unset($inputs['dyForwardingChargesCMT']); } // set params for Api 3.0 if needed $inputs = $this->setInputParams($inputs); // generate key for API $inputs['signature'] = $this->generateKey($inputs); // calculate lowest cost $from_cost = $std_cost_with_taxes_str; if (($seller_cost_with_taxes_float < $std_cost_with_taxes_float ) && Configuration::get('COLISSIMO_COST_SELLER')) { $from_cost = $seller_cost_with_taxes_str; } $rewrite_active = true; if (!Configuration::get('PS_REWRITING_SETTINGS')) { $rewrite_active = false; } $link = new Link(); if (Configuration::get('COLISSIMO_USE_POINTDERETRAIT') == '1') { $module_link = $link->getModuleLink('colissimo_simplicite', 'redirectdeliverypoint', array(), true); } else { $module_link = $link->getModuleLink('colissimo_simplicite', 'redirect', array(), true); } $module_link_mobile = $link->getModuleLink('colissimo_simplicite', 'redirectmobile', array(), true); // automatic settings api protocol for ssl $protocol = 'http://'; if (Configuration::get('PS_SSL_ENABLED')) { $protocol = 'https://'; } $from_mention = $this->l('From Cost'); $initial_cost = $from_cost.$this->l(' €'); $tax_mention = $this->l(' TTC'); if ($free_shipping) { $from_mention = ''; $initial_cost = $this->l('Free (Will be apply after address selection)'); $tax_mention = ''; } $on_mobile_device = false; if ($this->isMobileDevice()) { $on_mobile_device = true; } $base_url = $protocol.Tools::getShopDomainSsl().__PS_BASE_URI__; $this->context->smarty->assign(array( 'select_label' => $this->l('Select delivery mode'), 'edit_label' => $this->l('Edit delivery mode'), 'token' => sha1('colissimo'._COOKIE_KEY_.Context::getContext()->cookie->id_cart), 'urlSo' => $protocol.Configuration::get('COLISSIMO_URL').'?trReturnUrlKo='.htmlentities($this->url, ENT_NOQUOTES, 'UTF-8'), 'urlSoMobile' => $protocol.Configuration::get('COLISSIMO_URL_MOBILE').'?trReturnUrlKo='.htmlentities($this->url, ENT_NOQUOTES, 'UTF-8'), 'id_carrier' => $id_carrier, 'inputs' => $inputs, 'initialCost_label' => $from_mention, 'initialCost' => $initial_cost, // to change label for price in tpl 'taxMention' => $tax_mention, // to change label for price in tpl 'finishProcess' => $this->l('To choose SoColissimo, click on a delivery method'), 'rewrite_active' => $rewrite_active, 'link_socolissimo' => $module_link, 'link_socolissimo_mobile' => $module_link_mobile, 'module_link' => $module_link, 'on_mobile_device' => $on_mobile_device, 'link_to_img' => $this->link_to_img, 'wsUrl' => $protocol.$wsUrl, 'baseUrl' => $base_url, 'msg_order_carrier_colissimo' => $this->l('Before proceding, you must select relay point first.'), 'have_selected_point' => (int)$have_selected_point, 'relay_info' => $colissimo_delivery_info )); if (Configuration::get('COLISSIMO_USE_POINTDERETRAIT')) { return $this->display(__FILE__, 'colissimo_delivery_point.tpl'); } return $this->display(__FILE__, 'extra_content.tpl'); } /** * Validate SIRET Code Taken from prestashop core for compatibility 1.4 reason * @static * @param $siret SIRET Code * @return boolean Return true if is valid */ public function isSiret($siret) { if (Tools::strlen($siret) != 14) { return false; } $sum = 0; for ($i = 0; $i != 14; $i++) { $tmp = ((($i + 1) % 2) + 1) * (int)$siret[$i]; if ($tmp >= 10) { $tmp -= 9; } $sum += $tmp; } return ($sum % 10 === 0); } public function getApiPrice($id_cart) { if ((int)$id_cart) { return Db::getInstance()->getValue('SELECT dyforwardingcharges FROM '._DB_PREFIX_.'colissimo_delivery_info WHERE id_cart = '.(int)$id_cart); } return false; } public function checkZone($id_carrier) { return (bool)Db::getInstance()->getRow('SELECT * FROM '._DB_PREFIX_.'carrier_zone WHERE id_carrier = '.(int)$id_carrier); } public function checkGroup($id_carrier) { return (bool)Db::getInstance()->getRow('SELECT * FROM '._DB_PREFIX_.'carrier_group WHERE id_carrier = '.(int)$id_carrier); } public function checkRange($id_carrier) { $sql = ''; $carrier = new Carrier($id_carrier); if ($carrier->shipping_method) { switch ($carrier->shipping_method) { case '2': $sql = 'SELECT * FROM '._DB_PREFIX_.'range_price WHERE id_carrier = '.(int)$id_carrier; break; case '1': $sql = 'SELECT * FROM '._DB_PREFIX_.'range_weight WHERE id_carrier = '.(int)$id_carrier; break; } } if (!$sql) { switch (Configuration::get('PS_SHIPPING_METHOD')) { case '0': $sql = 'SELECT * FROM '._DB_PREFIX_.'range_price WHERE id_carrier = '.(int)$id_carrier; break; case '1': $sql = 'SELECT * FROM '._DB_PREFIX_.'range_weight WHERE id_carrier = '.(int)$id_carrier; break; } } return (bool)Db::getInstance()->getRow($sql); } public function checkDelivery($id_carrier) { return (bool)Db::getInstance()->getRow('SELECT * FROM '._DB_PREFIX_.'delivery WHERE id_carrier = '.(int)$id_carrier); } public function reallocationCarrier($id_socolissimo) { // carrier must be module carrier Db::getInstance()->execute('UPDATE '._DB_PREFIX_.'carrier SET shipping_handling = 0, is_module = 1, shipping_external = 1, need_range = 1, external_module_name = "colissimo_simplicite" WHERE id_carrier = '.(int)$id_socolissimo); // old carrier no longer linked with socolissimo Db::getInstance()->execute('UPDATE '._DB_PREFIX_.'carrier SET is_module = 0, external_module_name = "" WHERE id_carrier NOT IN ('.(int)Configuration::get('COLISSIMO_CARRIER_ID').') AND external_module_name = "colissimo_simplicite" '); } /** * Generate good order id format. * * @param $id * @return string */ public function formatOrderId($id) { $str_len = Tools::strlen($id); while ($str_len < 5) { $id = '0'.$id; $str_len = Tools::strlen($id); } return $id; } /** * @param $str * @return mixed */ public function replaceAccentedChars($str) { $str = preg_replace( array( /* Lowercase */ '/[\x{0105}\x{00E0}\x{00E1}\x{00E2}\x{00E3}\x{00E4}\x{00E5}]/u', '/[\x{00E7}\x{010D}\x{0107}]/u', '/[\x{010F}]/u', '/[\x{00E8}\x{00E9}\x{00EA}\x{00EB}\x{011B}\x{0119}]/u', '/[\x{00EC}\x{00ED}\x{00EE}\x{00EF}]/u', '/[\x{0142}\x{013E}\x{013A}]/u', '/[\x{00F1}\x{0148}]/u', '/[\x{00F2}\x{00F3}\x{00F4}\x{00F5}\x{00F6}\x{00F8}]/u', '/[\x{0159}\x{0155}]/u', '/[\x{015B}\x{0161}]/u', '/[\x{00DF}]/u', '/[\x{0165}]/u', '/[\x{00F9}\x{00FA}\x{00FB}\x{00FC}\x{016F}]/u', '/[\x{00FD}\x{00FF}]/u', '/[\x{017C}\x{017A}\x{017E}]/u', '/[\x{00E6}]/u', '/[\x{0153}]/u', /* Uppercase */ '/[\x{0104}\x{00C0}\x{00C1}\x{00C2}\x{00C3}\x{00C4}\x{00C5}]/u', '/[\x{00C7}\x{010C}\x{0106}]/u', '/[\x{010E}]/u', '/[\x{00C8}\x{00C9}\x{00CA}\x{00CB}\x{011A}\x{0118}]/u', '/[\x{0141}\x{013D}\x{0139}]/u', '/[\x{00D1}\x{0147}]/u', '/[\x{00D3}]/u', '/[\x{0158}\x{0154}]/u', '/[\x{015A}\x{0160}]/u', '/[\x{0164}]/u', '/[\x{00D9}\x{00DA}\x{00DB}\x{00DC}\x{016E}]/u', '/[\x{017B}\x{0179}\x{017D}]/u', '/[\x{00C6}]/u', '/[\x{0152}]/u', ), array( 'a', 'c', 'd', 'e', 'i', 'l', 'n', 'o', 'r', 's', 'ss', 't', 'u', 'y', 'z', 'ae', 'oe', 'A', 'C', 'D', 'E', 'L', 'N', 'O', 'R', 'S', 'T', 'U', 'Z', 'AE', 'OE' ), $str ); $array_unauthorised_api = array( ';', '€', '~', '#', '{', '(', '[', '|', '\\', '^', ')', ']', '=', '}', '$', '¤', '£', '%', 'μ', '*', '§', '!', '°', '²', '"', ); foreach ($array_unauthorised_api as $key => $value) { $str = str_replace($value, '', $str); } $str = str_replace('\'', ' ', $str); $str = preg_replace('/\s+/', ' ', $str); return $str; } /** * @param array * @return array */ public function setInputParams($inputs) { $get_mobile_device = Context::getContext()->getMobileDevice(); // set api params for 4.0 and mobile if ($get_mobile_device || $this->isIpad() || $this->isMobile()) { unset($inputs['CHARSET']); $inputs['numVersion'] = '4.0'; } return $inputs; } public function isMobileDevice() { $get_mobile_device = Context::getContext()->getMobileDevice(); // set api params for 4.0 and mobile if ($get_mobile_device || $this->isIpad() || $this->isMobile()) { return true; } return false; } public function upper($str_in) { return Tools::strtoupper(str_replace('-', ' ', Tools::link_rewrite($str_in))); } public function lower($str_in) { return Tools::strtolower(str_replace('-', ' ', Tools::link_rewrite($str_in))); } public function formatName($name) { return preg_replace('/[0-9!<>,;?=+()@#"°{}_$%:]/', '', Tools::stripslashes($name)); } public function isSameAddress($id_address, $id_cart, $id_customer) { $id_colissimo_delivery_info = ColissimoDeliveryInfo::getDeliveryInfoExist((int)$id_cart, (int)$id_customer); if (!$id_colissimo_delivery_info) { return $id_address; } $colissimo_delivery_info = new ColissimoDeliveryInfo((int)$id_colissimo_delivery_info); $ps_address = new Address((int)$id_address); $new_address = new Address(); $sql = Db::getInstance()->getRow('SELECT c.id_country, cl.name FROM '._DB_PREFIX_.'country c LEFT JOIN '._DB_PREFIX_.'country_lang cl ON cl.id_lang = '.(int)$this->context->language->id.' AND cl.id_country = c.id_country WHERE iso_code = "'.pSQL($colissimo_delivery_info->cecountry).'"'); $iso_code = $sql['id_country']; if ($this->upper($ps_address->lastname) != $this->upper($colissimo_delivery_info->prname) || $ps_address->id_country != $iso_code || $this->upper($ps_address->firstname) != $this->upper($colissimo_delivery_info->prfirstname) || $this->upper($ps_address->address1) != $this->upper($colissimo_delivery_info->pradress3) || $this->upper($ps_address->address2) != $this->upper($colissimo_delivery_info->pradress2) || $this->upper($ps_address->postcode) != $this->upper($colissimo_delivery_info->przipcode) || $this->upper($ps_address->city) != $this->upper($colissimo_delivery_info->prtown) || str_replace(array( ' ', '.', '-', ',', ';', '+', '/', '\\', '+', '(', ')'), '', $ps_address->phone_mobile) != $colissimo_delivery_info->cephonenumber) { $new_address->id_customer = (int)$id_customer; $firstname_company = preg_replace('/\d/', '', Tools::substr($colissimo_delivery_info->prfirstname, 0, 31)); $lastname_company = preg_replace('/\d/', '', Tools::substr($colissimo_delivery_info->prname, 0, 32)); $firstname = preg_replace('/\d/', '', Tools::substr($colissimo_delivery_info->cefirstname, 0, 32)); $lastname = preg_replace('/\d/', '', Tools::substr($colissimo_delivery_info->cename, 0, 32)); $new_address->lastname = trim($this->formatName($lastname)); $new_address->firstname = trim($this->formatName($firstname)); $new_address->postcode = $colissimo_delivery_info->przipcode; $new_address->city = str_replace('\'', ' ', $colissimo_delivery_info->prtown); $new_address->id_country = $iso_code; $new_address->alias = 'Colissimo - '.date('d-m-Y'); $new_address->phone_mobile = $colissimo_delivery_info->cephonenumber; $new_address->company = trim($colissimo_delivery_info->cecompanyname); if (!in_array($colissimo_delivery_info->delivery_mode, array( 'DOM', 'RDV'))) { /**$firstname_company_formatted = trim($this->formatName($firstname_company)); $lastname_company_formatted = trim($this->formatName($lastname_company)); $new_address->company = $firstname_company_formatted.' '.$lastname_company_formatted;**/ $new_address->active = 0; $new_address->deleted = 1; $new_address->address1 = $colissimo_delivery_info->pradress1; $new_address->address2 = $colissimo_delivery_info->pradress2; $new_address->add(); $new_address->deleted = 1; $new_address->save(); } else { $new_address->address1 = $colissimo_delivery_info->pradress3; ((isset($colissimo_delivery_info->pradress2)) ? $new_address->address2 = $colissimo_delivery_info->pradress2 : $new_address->address2 = ''); ((isset($colissimo_delivery_info->pradress1)) ? $new_address->other .= $colissimo_delivery_info->pradress1 : $new_address->other = ''); ((isset($colissimo_delivery_info->pradress4)) ? $new_address->other .= ' | '.$colissimo_delivery_info->pradress4 : $new_address->other = ''); $new_address->postcode = $colissimo_delivery_info->przipcode; $new_address->city = str_replace('\'', ' ', $colissimo_delivery_info->prtown); $new_address->id_country = $iso_code; $new_address->alias = 'Colissimo - '.date('d-m-Y'); $new_address->add(); $new_address->active = 0; $new_address->deleted = 1; $new_address->save(); } return (int)$new_address->id; } return (int)$ps_address->id; } /** * Check if agent user is iPad(for so_mobile) * @return bool */ public function isIpad() { return (bool)strpos($_SERVER['HTTP_USER_AGENT'], 'iPad'); } public function isMobile() { if (method_exists(Context::getContext()->mobile_detect, 'isMobile')) { return (bool)Context::getContext()->mobile_detect->isMobile(); } else { return false; } } /** * Generate the signed key * * @static * @param $params * @return string */ public function generateKey($params) { $str = ''; foreach ($params as $key => $value) { if (!in_array(Tools::strtoupper($key), array( 'SIGNATURE'))) { $str .= utf8_decode($value); } } return sha1($str.Tools::strtolower(Configuration::get('COLISSIMO_KEY'))); } public function getTokenPointDeRetrait() { $url = Configuration::get('COLISSIMO_URL_POINTDERETRAIT'); $login = Configuration::get('COLISSIMO_LOGIN'); $password = Configuration::get('COLISSIMO_PASSWORD'); $params = array( 'login' => $login, 'password' => $password ); $autorisation = 'Authorization: Basic'; $content_type = 'Content-Type: application/x-www-form-urlencoded; charset=utf-8'; $curl = curl_init($url); curl_setopt_array( $curl, array( CURLOPT_HTTPHEADER => array( $content_type, 'Accept: application/json', $autorisation ), CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true, CURLOPT_HEADER => false, CURLOPT_POSTFIELDS => http_build_query($params), CURLOPT_SSL_VERIFYPEER => false ) ); $curl_response = curl_exec($curl); if ($curl_response) { $json = json_decode($curl_response); if ($json instanceof stdClass && property_exists($json, 'token')) { return $json->token; } } return false; } }