Files
bio-concept-pharma/web/modules/colissimorelay/colissimorelay.php
2019-11-17 19:14:07 +01:00

607 lines
24 KiB
PHP

<?php
/**
* NOTICE OF LICENSE
*
* This source file is subject to a commercial license.
* Use, copy, modification or distribution of this source file without written
* license agreement is strictly forbidden.
* In order to obtain a license, please contact us: simon@daig.re
* ...........................................................................
* INFORMATION SUR LA LICENCE D'UTILISATION
*
* L'utilisation de ce fichier source est soumise a une licence commerciale.
* Toute utilisation, reproduction, modification ou distribution du present
* fichier source sans contrat de licence ecrit est expressement interdite.
* Pour obtenir une licence, veuillez nous contacter a l'adresse: simon@daig.re
*
* @package La Poste Colissimo Relay
* @author Agencya
* @copyright Copyright(c) 2015-2018
* @license See Readme.md
* Contact by Email : simon@daig.re
*/
if (!defined('_PS_VERSION_')) {
exit;
}
require_once _PS_MODULE_DIR_.'colissimorelay/classes/Colissimo_Autoload.php';
/**
* Class ColissimoRelay
*/
class ColissimoRelay extends Module
{
/** @var string */
public $colissimo_num_contrat;
/** @var string */
public $colissimo_pass;
/** @var string */
public $url;
/**
* ColissimoPickup constructor.
*/
public function __construct()
{
$this->name = 'colissimorelay';
$this->tab = 'shipping_logistics';
$this->version = '2.3.8';
$this->author = 'Agencya';
$this->module_key = 'd0800c724dd81ee58f3d8556e8f9f981';
$config = Configuration::getMultiple(array('COLISSIMORELAY_NUM_CONTRAT', 'COLISSIMORELAY_PASS'));
if (isset($config['COLISSIMORELAY_NUM_CONTRAT'])) {
$this->colissimo_num_contrat = $config['COLISSIMORELAY_NUM_CONTRAT'];
}
if (isset($config['COLISSIMORELAY_PASS'])) {
$this->colissimo_pass = $config['COLISSIMORELAY_PASS'];
}
$this->bootstrap = true;
parent::__construct();
$this->url = $this->context->shop->getBaseURL(true).'modules/'.$this->name.'/';
$this->displayName = $this->l('Colissimo • Relay');
$this->description = $this->l('Allow your customers to select a pickup point.');
$this->confirmUninstall = $this->l('Are you sure to uninstall this module ?');
if (!isset($this->colissimo_num_contrat) || !isset($this->colissimo_pass) || empty($this->colissimo_num_contrat) || empty($this->colissimo_pass)) {
$this->warning = $this->l('Please enter your La Poste account number and your password in module configuration to use this module.');
}
$this->ps_versions_compliancy = array('min' => '1.5.0.0', 'max' => _PS_VERSION_);
// translations
// $this->l('Closed');
}
/**
* @return bool
*/
public function install()
{
Configuration::updateValue('COLISSIMORELAY_MAPPING_CARRIERS', serialize(array()));
Configuration::updateValue('COLISSIMORELAY_NUM_CONTRAT', '');
Configuration::updateValue('COLISSIMORELAY_PASS', '');
Configuration::updateValue('COLISSIMORELAY_GMAPS_API_KEY', '');
if (version_compare(_PS_VERSION_, '1.6.0.9', '<')) {
return (
parent::install()
&& $this->installDB()
&& $this->registerHook('extraCarrier')
&& $this->registerHook('actionValidateOrder')
&& $this->registerHook('displayHeader')
&& $this->registerHook('displayBackOfficeHeader')
&& $this->registerHook('adminOrder')
&& $this->registerHook('actionCarrierProcess')
);
} else {
return (
parent::install()
&& $this->installDB()
&& $this->registerHook('extraCarrier')
&& $this->registerHook('actionValidateOrder')
&& $this->registerHook('displayHeader')
&& $this->registerHook('displayBackOfficeHeader')
&& $this->registerHook('displayAdminOrderTabShip')
&& $this->registerHook('displayAdminOrderContentShip')
&& $this->registerHook('actionCarrierProcess')
);
}
}
/**
* @return bool
*/
public function installDB()
{
return Db::getInstance()->execute(
'CREATE TABLE IF NOT EXISTS`'._DB_PREFIX_.'colissimo_pickup` (
`id_pickup` INT(10) NOT NULL AUTO_INCREMENT,
`id_cart` INT(10) NOT NULL,
`id_point_pickup` INT(10) NOT NULL,
`date_add` DATETIME NOT NULL,
`date_upd` DATETIME NOT NULL,
PRIMARY KEY ( `id_pickup` )
) ENGINE = '._MYSQL_ENGINE_.' DEFAULT CHARSET = utf8;'
);
}
/**
* @return bool
*/
public function uninstall()
{
if (Shop::isFeatureActive()) {
Shop::setContext(Shop::CONTEXT_ALL);
}
Configuration::deleteByName('COLISSIMORELAY_MAPPING_CARRIERS');
Configuration::deleteByName('COLISSIMORELAY_NUM_CONTRAT');
Configuration::deleteByName('COLISSIMORELAY_PASS');
Configuration::deleteByName('COLISSIMORELAY_GMAPS_API_KEY');
Db::getInstance()->execute('DROP TABLE IF EXISTS `'._DB_PREFIX_.'colissimo_pickup`');
return parent::uninstall();
}
/**
* @param array $params
*/
public function hookHeader($params)
{
if (in_array(Tools::strtolower($this->context->controller->php_self), array('order', 'order-opc', 'orderopc'))) {
try {
// if merchant hasnt configured the module
if (!isset($this->colissimo_num_contrat) || !isset($this->colissimo_pass) || empty($this->colissimo_num_contrat) || empty($this->colissimo_pass)) {
throw new PrestaShopModuleException($this->l('Colissimo pickup module is not configured.'));
}
// load customer address
$address = new Address((int)$params['cart']->id_address_delivery);
if (Validate::isLoadedObject($address)) {
$customer_address = array(
'address1' => $address->address1,
'postcode' => $address->postcode,
'city' => $address->city,
'country' => $address->country,
'countryCode' => Country::getIsoById($address->id_country),
);
} else {
$customer_address = null;
}
// get list of pickup carriers ID mapped in module configuration
$pickupCarriers = array();
$colissimoCarriers = Tools::unSerialize(Configuration::get('COLISSIMORELAY_MAPPING_CARRIERS'));
$carriers = Carrier::getCarriers($this->context->language->id, false, false, false, null, Carrier::ALL_CARRIERS);
foreach ($carriers as $carrier) {
if (array_key_exists((int)$carrier['id_reference'], $colissimoCarriers)) {
if ((int)$colissimoCarriers[(int)$carrier['id_reference']] !== 0) {
$pickupCarriers[] = (int)$carrier['id_carrier'];
}
}
}
// if no pickup carriers available, return
if (empty($pickupCarriers)) {
return;
}
$this->context->controller->addCSS($this->_path . 'views/css/colissimo_carrier.css');
$this->context->controller->addJquery();
$this->context->controller->addJqueryPlugin('fancybox');
if (version_compare(_PS_VERSION_, '1.7', '>=')) {
$this->context->controller->addJS($this->_path . 'views/js/colissimo_carrier_17.js');
} else {
$this->context->controller->addJS($this->_path . 'views/js/colissimo_carrier.js');
}
$this->context->smarty->assign(
array(
'colissimoError' => false,
'colissimo_token' => Tools::substr(Tools::encrypt('colissimorelay/index'), 0, 10),
'id_cart' => $params['cart']->id,
'id_carrier' => $params['cart']->id_carrier ?: 0,
'customer_address' => $customer_address,
'customer_address_json' => json_encode($customer_address),
'maps_api_key' => (string)Configuration::get('COLISSIMORELAY_GMAPS_API_KEY'),
'pickup_carriers' => json_encode($pickupCarriers),
'available_countries' => json_encode(ColissimoRelay_LaPoste::getAvailableCountries()),
'is_logged' => (int)$this->context->customer->isLogged(),
)
);
if (version_compare(_PS_VERSION_, '1.7', '<')) {
$this->context->smarty->assign(
array(
'user_lang' => Tools::strtolower($this->context->language->iso_code),
)
);
}
} catch (Exception $exception) {
$this->context->smarty->assign(
array(
'colissimoError' => $exception->getMessage(),
)
);
}
if (version_compare(_PS_VERSION_, '1.7', '>=')) {
return $this->display(__FILE__, 'header_17.tpl');
} else {
return $this->display(__FILE__, 'header.tpl');
}
}
}
/**
* @param array $params
*/
public function hookDisplayBackOfficeHeader($params)
{
if (Tools::strtolower(Tools::getValue('controller')) == 'adminorders' && Tools::getIsset('id_order')) {
$id_carrier = (int)$params['cart']->id_carrier;
if (ColissimoRelay_LaPoste::getProductIdByCarrierId($id_carrier)) {
$this->context->controller->addCSS($this->_path . 'views/css/colissimorelay.css');
$this->context->controller->addCSS($this->_path . 'views/css/colissimo_carrier.css');
$this->context->controller->addJquery();
$this->context->controller->addJqueryPlugin('fancybox');
$this->context->controller->addJS($this->_path . 'views/js/colissimo_order.js');
try {
// if merchant hasnt configured the module
if (!isset($this->colissimo_num_contrat) || !isset($this->colissimo_pass) || empty($this->colissimo_num_contrat) || empty($this->colissimo_pass)) {
throw new PrestaShopModuleException($this->l('Colissimo pickup module is not configured.'));
}
// load customer address
$order = new Order((int)Tools::getValue('id_order'));
$address = new Address($order->id_address_delivery);
if (!Validate::isLoadedObject($address)) {
throw new PrestaShopModuleException('Can\'t load Address object.');
}
$this->context->smarty->assign(
array(
'colissimoError' => false,
'colissimo_token' => Tools::substr(Tools::encrypt('colissimorelay/index'), 0, 10),
'id_cart' => $params['cart']->id,
'id_carrier' => $params['cart']->id_carrier ?: 0,
'customer_address' => array(
'address1' => $address->address1,
'postcode' => $address->postcode,
'city' => $address->city,
'country' => $address->country,
),
'customer_address_json' => json_encode(
array(
'address1' => $address->address1,
'postcode' => $address->postcode,
'city' => $address->city,
'countryCode' => Country::getIsoById($address->id_country),
)
),
'maps_api_key' => Configuration::get('COLISSIMORELAY_GMAPS_API_KEY'),
'pickup_carriers' => 0,
'available_countries' => json_encode(ColissimoRelay_LaPoste::getAvailableCountries()),
'modules_dir' => _MODULE_DIR_,
'user_lang' => Tools::strtolower($this->context->language->iso_code),
)
);
} catch (Exception $exception) {
$this->context->smarty->assign(
array(
'colissimoError' => $exception->getMessage(),
)
);
}
return $this->display(__FILE__, 'header.tpl');
}
}
}
/**
* @param array $params
* @return string
*/
public function hookExtraCarrier($params)
{
if (version_compare(_PS_VERSION_, '1.7', '<')) {
return $this->display(__FILE__, 'carrier-extra.tpl');
}
}
/**
* @param array $params
* @return string
*/
public function hookDisplayAdminOrderTabShip($params)
{
if (Tools::version_compare(_PS_VERSION_, '1.6', '<')) {
$id_carrier = (int)$params['order']->id_carrier;
} else {
$id_carrier = (int)$params['cart']->id_carrier;
}
if (ColissimoRelay_LaPoste::getProductIdByCarrierId($id_carrier)) {
return $this->display(__FILE__, 'order-shipping-tab.tpl');
}
}
/**
* @param array $params
* @return string
*/
public function hookDisplayAdminOrderContentShip($params)
{
if (Tools::version_compare(_PS_VERSION_, '1.6.0.9', '<')) {
$order = new Order((int)$params['id_order']);
$id_cart = (int)$order->id_cart;
$id_carrier = (int)$order->id_carrier;
unset($order);
} else {
$id_cart = (int)$params['cart']->id;
$id_carrier = (int)$params['cart']->id_carrier;
}
if (ColissimoRelay_LaPoste::getProductIdByCarrierId($id_carrier)) {
$pickup = new ColissimoPickup(ColissimoPickup::getIdByCartId($id_cart));
if (!Validate::isLoadedObject($pickup)) {
$pickup = null;
}
$this->context->smarty->assign(
array(
'colissimo_img' => $this->url.'views/img/',
'pickup' => $pickup,
)
);
if (Tools::version_compare(_PS_VERSION_, '1.6', '<')) {
return $this->display(__FILE__, 'admin-order.tpl');
} else {
return $this->display(__FILE__, 'order-shipping-content.tpl');
}
}
}
/**
* @param array $params
* @return string
*/
public function hookAdminOrder($params)
{
return $this->hookDisplayAdminOrderContentShip($params);
}
/**
* Throw error if customer didn't selected a pickup point
*
* @param array $params
*/
public function hookActionCarrierProcess($params) {
if (version_compare(_PS_VERSION_, '1.7', '<') && get_class($this->context->controller) === 'OrderController') {
if (ColissimoRelay_LaPoste::isPickup(ColissimoRelay_LaPoste::getProductIdByCarrierId((int)$params['cart']->id_carrier))
&& !ColissimoPickup::getIdByCartId((int)$params['cart']->id)) {
die($this->l('Erreur: Vous n\'avez choisi aucun point relais sur votre commande. Merci de désactiver tout bloqueur de publicité ou de script. En cas de doute, merci de nous contacter.'));
}
}
}
/**
* Update cart address with pickup point information
*
* @param array $params
*/
public function hookActionValidateOrder($params)
{
if (ColissimoRelay_LaPoste::isPickup(ColissimoRelay_LaPoste::getProductIdByCarrierId((int)$params['cart']->id_carrier))) {
$cart = $params['cart'];
$order = $params['order'];
$pickup = new ColissimoPickup(ColissimoPickup::getIdByCartId($cart->id));
if (!Validate::isLoadedObject($pickup) || $pickup->id_point_pickup === 0) {
return;
}
$ws = new Colissimo_PickupWebservice();
$point_infos = $ws->getDeliveryPoint(sprintf('%06s', $pickup->id_point_pickup));
if ($cart->id_address_invoice === $cart->id_address_delivery) {
$address = new Address();
} else {
$address = new Address($cart->id_address_delivery);
}
$customer = new Customer($cart->id_customer);
$address->firstname = $customer->firstname;
$address->lastname = $customer->lastname;
$address->id_customer = $cart->id_customer;
$address->id_country = Country::getByIso((string)$point_infos->codePays);
$address->alias = Tools::substr((string)$point_infos->nom, 0, 32);
$address->address1 = Tools::substr((string)$point_infos->adresse1 . ' ' . (string)$point_infos->adresse2, 0, 35);
$address->address2 = (string)$point_infos->nom;
$address->postcode = (string)$point_infos->codePostal;
$address->city = (string)$point_infos->localite;
if ($cart->id_address_invoice === $cart->id_address_delivery) {
$old_address = new Address($cart->id_address_delivery);
$address->phone = $old_address->phone;
$address->phone_mobile = $old_address->phone_mobile;
$address->add();
} else {
$address->update();
}
$cart->id_address_delivery = $address->id;
$cart->update();
$order->id_address_delivery = $address->id;
$order->update();
Db::getInstance()->execute(
'UPDATE `'._DB_PREFIX_.'cart_product`
SET `id_address_delivery` = '.(int)$address->id.'
WHERE `id_cart` = '.(int)$cart->id
);
Db::getInstance()->execute(
'UPDATE `'._DB_PREFIX_.'customization`
SET `id_address_delivery` = '.(int)$address->id.'
WHERE `id_cart` = '.(int)$cart->id
);
}
}
/**
* @return string
*/
public function getContent()
{
$message = false;
if (Tools::isSubmit('submit'.$this->name)) {
Configuration::updateValue('COLISSIMORELAY_MAPPING_CARRIERS', serialize(Tools::getValue('COLISSIMORELAY_MAPPING_CARRIERS')));
Configuration::updateValue('COLISSIMORELAY_NUM_CONTRAT', Tools::getValue('COLISSIMORELAY_NUM_CONTRAT'));
Configuration::updateValue('COLISSIMORELAY_PASS', Tools::getValue('COLISSIMORELAY_PASS'));
Configuration::updateValue('COLISSIMORELAY_GMAPS_API_KEY', Tools::getValue('COLISSIMORELAY_GMAPS_API_KEY'));
$message = $this->displayConfirmation($this->l('The configuration has been updated.'));
}
$this->context->smarty->assign(
array(
'is_configured' => (!isset($this->colissimo_num_contrat) || !isset($this->colissimo_pass) || empty($this->colissimo_num_contrat) || empty($this->colissimo_pass)),
'tracking_conf' => $this->context->link->getAdminLink('AdminModules').'&configure=colissimosuivi',
)
);
if (Tools::version_compare(_PS_VERSION_, '1.6', '<')) {
return $message.$this->display(__FILE__, 'configuration_infos.tpl').$this->renderForm();
} else {
return $message.$this->display(__FILE__, 'configuration_infos.tpl').$this->renderForm();
}
}
/**
* @return string
*/
public function renderForm()
{
$default_lang = (int)Configuration::get('PS_LANG_DEFAULT');
$fields_form = array();
$fields_form[0]['form'] = array(
'legend' => array(
'title' => $this->l('Carriers configuration'),
'icon' => 'icon-truck'
),
);
$fields_form[0]['form']['input'] = array();
foreach (Carrier::getCarriers($this->context->language->id, false, false, false, null, Carrier::ALL_CARRIERS) as $carrier) {
$fields_form[0]['form']['input'][] = array(
'type' => 'select',
'label' => $carrier['name'],
'name' => 'COLISSIMORELAY_MAPPING_CARRIERS['.$carrier['id_reference'].']',
'options' => array(
'query' => ColissimoRelay_LaPoste::getProducts(),
'id' => 'id',
'name' => 'name'
),
);
}
$fields_form[0]['form']['submit'] = array(
'title' => $this->l('Save'),
);
$fields_form[2]['form'] = array(
'legend' => array(
'title' => $this->l('La Poste contract configuration'),
'icon' => 'icon-file'
),
'input' => array(
array(
'type' => 'text',
'label' => $this->l('Coliposte login'),
'name' => 'COLISSIMORELAY_NUM_CONTRAT',
'required' => true
),
array(
'type' => 'text',
'label' => $this->l('Coliposte password'),
'name' => 'COLISSIMORELAY_PASS',
'required' => true
),
array(
'type' => 'text',
'label' => $this->l('Google Maps API key'),
'name' => 'COLISSIMORELAY_GMAPS_API_KEY',
'desc' => '<a href = "https://console.developers.google.com/flows/enableapi?apiid=maps_backend,geocoding_backend,directions_backend,distance_matrix_backend,elevation_backend,places_backend&keyType=CLIENT_SIDE&reusekey=true">'.$this->l('Click here to generate your Google Maps API.').'</a>',
)
),
'submit' => array(
'title' => $this->l('Save'),
)
);
$helper = new HelperForm();
$helper->module = $this;
$helper->name_controller = $this->name;
$helper->token = Tools::getAdminTokenLite('AdminModules');
$helper->currentIndex = AdminController::$currentIndex.'&configure='.$this->name;
$helper->default_form_language = $default_lang;
$helper->allow_employee_form_lang = $default_lang;
$helper->title = $this->displayName;
$helper->show_toolbar = true;
$helper->toolbar_scroll = true;
$helper->submit_action = 'submit'.$this->name;
$helper->toolbar_btn = array(
'save' => array(
'desc' => $this->l('Save'),
'href' => AdminController::$currentIndex.'&configure='.$this->name.'&save'.$this->name.'&token='.Tools::getAdminTokenLite('AdminModules'),
),
'back' => array(
'href' => AdminController::$currentIndex.'&token='.Tools::getAdminTokenLite('AdminModules'),
'desc' => $this->l('Back to list')
)
);
$current = Tools::unSerialize(Configuration::get('COLISSIMORELAY_MAPPING_CARRIERS'));
foreach (Carrier::getCarriers($this->context->language->id, false, false, false, null, Carrier::ALL_CARRIERS) as $carrier) {
if (isset($current[$carrier['id_reference']])) {
$helper->fields_value['COLISSIMORELAY_MAPPING_CARRIERS['.$carrier['id_reference'].']'] = $current[$carrier['id_reference']];
} else {
$helper->fields_value['COLISSIMORELAY_MAPPING_CARRIERS['.$carrier['id_reference'].']'] = 0;
}
}
$helper->fields_value['COLISSIMORELAY_NUM_CONTRAT'] = Configuration::get('COLISSIMORELAY_NUM_CONTRAT');
$helper->fields_value['COLISSIMORELAY_PASS'] = Configuration::get('COLISSIMORELAY_PASS');
$helper->fields_value['COLISSIMORELAY_GMAPS_API_KEY'] = Configuration::get('COLISSIMORELAY_GMAPS_API_KEY');
return $helper->generateForm($fields_form);
}
}