* @copyright 2007-2020 PrestaShop SA
* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0)
* International Registered Trademark & Property of PrestaShop SA
*/
/**
* Class Colissimo
*/
class Colissimo extends CarrierModule
{
const ID_PRODUCT_ADDONS = 42138;
const COLIVIEW_URL = 'https://www.colissimo.entreprise.laposte.fr/fr';
const COLISHIP_URL = 'https://www.colissimo.fr/entreprise/coliship/login?lang=fr';
/** @var ColissimoLogger $logger */
public $logger;
/** @var ColissimoLabelGenerator $labelGenerator */
public $labelGenerator;
/** @var int $id_carrier */
public $id_carrier;
/** @var array $controllers */
public $controllers = array(
'widget',
'tracking',
'return',
);
/** @var array $PNAMailObject */
public $PNAMailObject = array(
'fr' => 'Envoi de la commande %s en cours',
'en' => 'Shipment of order %s in progress',
);
/** @var array $returnLabelMailObject */
public $returnLabelMailObject = array(
'fr' => 'Etiquette retour pour votre commande %s',
'en' => 'Return label for order %s',
);
/** @var string $psFolder (used for Front-Office template rendering) */
public $psFolder;
/**
* @var array $controllersBO
*/
public $controllersBO = array(
'AdminColissimoAffranchissement',
'AdminColissimoDepositSlip',
'AdminColissimoDashboard',
'AdminColissimoColiship',
);
/** @var ColissimoModuleConfiguration $moduleConfiguration */
private $moduleConfiguration;
/** @var string $boTheme */
public $boTheme;
/**
* Colissimo constructor.
*/
public function __construct()
{
require_once(dirname(__FILE__).'/classes/module.classes.php');
require_once(dirname(__FILE__).'/lib/loader.php');
$this->name = 'colissimo';
$this->tab = 'shipping_logistics';
$this->version = '1.4.1';
$this->module_key = 'cce3f48c72001910b4bbda7b7492b5ba';
$this->author = 'Colissimo';
$this->need_instance = 0;
$this->bootstrap = true;
parent::__construct();
$this->displayName = $this->l('Colissimo');
$this->description = $this->l('Colissimo module for PrestaShop');
$this->ps_versions_compliancy = array('min' => '1.6', 'max' => _PS_VERSION_);
$this->initLogger();
$this->logger->setChannel('Main');
$this->labelGenerator = new ColissimoLabelGenerator($this->logger);
$prestaShopVersion = str_replace('.', '', _PS_VERSION_);
$this->psFolder = 'prestashop_'.(int) Tools::substr($prestaShopVersion, 0, 2);
$this->boTheme = Tools::version_compare(_PS_VERSION_, '1.7.7.0', '>=') ? 'new_theme' : 'legacy';
}
/**
* @return bool
*/
public function install()
{
$enableLogs = Configuration::get('COLISSIMO_LOGS');
Configuration::updateValue('COLISSIMO_LOGS', 1);
$this->initLogger();
$this->logger->setChannel('Install');
try {
$this->testTechnicalRequirements(false);
if (!parent::install()) {
return false;
}
$this->createModuleTables();
$this->createModuleCarriersAndServices();
$this->createTrackingCodes(ColissimoTools::getColissimoTrackingCodesSource());
$this->setDefaultConfiguration();
$this->installMenus();
$this->installOrderStates();
} catch (Exception $e) {
$this->logger->error($e->getMessage());
$this->_errors[] = $e->getMessage();
return false;
}
if (version_compare(_PS_VERSION_, '1.7', '>=')) {
$this->registerHook('actionValidateStepComplete');
} else {
$this->registerHook('actionCarrierProcess');
$this->registerHook('displayPaymentTop');
}
if (Tools::version_compare(_PS_VERSION_, '1.7.7.0', '>=')) {
$this->registerHook('displayAdminOrderMainBottom');
} else {
$this->registerHook('displayAdminOrder');
}
Configuration::updateValue('COLISSIMO_LOGS', $enableLogs);
return $this->registerHook('actionAdminControllerSetMedia') &&
$this->registerHook('header') &&
$this->registerHook('newOrder') &&
$this->registerHook('moduleRoutes') &&
$this->registerHook('displayCarrierExtraContent') &&
$this->registerHook('extraCarrier') &&
$this->registerHook('displayAdminColissimoAffranchissementListAfter') &&
$this->registerHook('displayAdminColissimoDashboardListAfter') &&
$this->registerHook('actionObjectColissimoDepositSlipDeleteAfter') &&
$this->registerHook('actionObjectOrderAddBefore') &&
$this->registerHook('displayCustomerAccount') &&
$this->registerHook('displayOrderDetail') &&
$this->registerHook('actionAdminOrdersTrackingNumberUpdate') &&
$this->registerHook('displayAdminProductsExtra') &&
$this->registerHook('actionProductUpdate') &&
$this->registerHook('actionAdminCategoriesControllerSaveAfter') &&
$this->registerHook('actionCategoryFormBuilderModifier') &&
$this->registerHook('actionAfterCreateCategoryFormHandler') &&
$this->registerHook('actionAfterUpdateCategoryFormHandler') &&
$this->registerHook('actionAdminCategoriesFormModifier') &&
$this->registerHook('addWebserviceResources');
}
/**
* @return bool
* @throws PrestaShopException
*/
public function uninstall()
{
if (Tools::version_compare(_PS_VERSION_, '1.7', '<')) {
$moduleTabs = Tab::getCollectionFromModule($this->name);
foreach ($moduleTabs as $moduleTab) {
$moduleTab->delete();
}
}
return parent::uninstall();
}
/**
*
*/
public function initLogger()
{
$logFile = ColissimoTools::getCurrentLogFilePath();
if (Configuration::get('COLISSIMO_LOGS')) {
$handler = new ColissimoFileHandler($logFile);
} else {
$handler = new ColissimoNullHandler();
}
$this->logger = new ColissimoLogger($handler, $this->version);
}
/**
* @param bool $testCredentials
* @throws Exception
*/
public function testTechnicalRequirements($testCredentials)
{
if (extension_loaded('curl') == false) {
throw new Exception($this->l('You need to enable the cURL extension to use this module.'));
}
if (extension_loaded('zip') == false) {
throw new Exception($this->l('You need to enable the zip PHP extension to use this module.'));
}
if (extension_loaded('soap') == false) {
throw new Exception($this->l('You need to enable the SOAP extension to use this module.'));
}
if ($testCredentials) {
if (!Configuration::get('COLISSIMO_ACCOUNT_LOGIN') || !Configuration::get('COLISSIMO_ACCOUNT_PASSWORD')) {
throw new Exception($this->l('Please configure your contract number & password to use this module.'));
}
}
}
/**
* @throws Exception
*/
public function createModuleTables()
{
$colissimoServices = "CREATE TABLE IF NOT EXISTS `"._DB_PREFIX_."colissimo_service` (
`id_colissimo_service` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`id_carrier` INT(10) UNSIGNED NULL DEFAULT '0',
`product_code` VARCHAR(5) NOT NULL DEFAULT '0',
`commercial_name` VARCHAR(50) NOT NULL DEFAULT '0',
`destination_type` ENUM('FRANCE','OM','EUROPE','WORLDWIDE', 'INTRA_DOM') NOT NULL DEFAULT 'FRANCE',
`is_signature` TINYINT(1) UNSIGNED NOT NULL DEFAULT '0',
`is_pickup` TINYINT(3) UNSIGNED NOT NULL DEFAULT '0',
`is_return` TINYINT(3) UNSIGNED NOT NULL DEFAULT '0',
`type` VARCHAR(50) NOT NULL DEFAULT '0',
PRIMARY KEY (`id_colissimo_service`),
INDEX `product_code` (`product_code`),
INDEX `id_carrier` (`id_carrier`)
)";
$colissimoOrder = "CREATE TABLE IF NOT EXISTS `"._DB_PREFIX_."colissimo_order` (
`id_colissimo_order` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`id_order` INT(10) UNSIGNED NOT NULL,
`id_colissimo_service` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`id_colissimo_pickup_point` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`migration` TINYINT(3) UNSIGNED NOT NULL DEFAULT '0',
`hidden` TINYINT(3) UNSIGNED NULL DEFAULT '0',
PRIMARY KEY (`id_colissimo_order`),
INDEX `id_order` (`id_order`),
INDEX `id_colissimo_service` (`id_colissimo_service`),
INDEX `id_colissimo_pickup_point` (`id_colissimo_pickup_point`)
)";
$colissimoLabel = "CREATE TABLE IF NOT EXISTS `"._DB_PREFIX_."colissimo_label` (
`id_colissimo_label` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`id_colissimo_order` INT(10) UNSIGNED NOT NULL,
`id_colissimo_deposit_slip` INT(10) UNSIGNED NULL DEFAULT '0',
`shipping_number` VARCHAR(45) NOT NULL,
`label_format` VARCHAR(3) NOT NULL,
`return_label` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`cn23` TINYINT(1) UNSIGNED NOT NULL DEFAULT '0',
`coliship` TINYINT(1) NOT NULL DEFAULT '0',
`migration` TINYINT(3) UNSIGNED NOT NULL DEFAULT '0',
`insurance` TINYINT(3) UNSIGNED NULL DEFAULT NULL,
`file_deleted` TINYINT(3) UNSIGNED NOT NULL DEFAULT '0',
`date_add` DATETIME NOT NULL,
PRIMARY KEY (`id_colissimo_label`),
INDEX `id_colissimo_order` (`id_colissimo_order`),
INDEX `id_colissimo_deposit_slip` (`id_colissimo_deposit_slip`)
)";
$colissimoDepositSlip = "CREATE TABLE IF NOT EXISTS `"._DB_PREFIX_."colissimo_deposit_slip` (
`id_colissimo_deposit_slip` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`filename` VARCHAR(45) NOT NULL,
`number` INT(11) UNSIGNED NOT NULL,
`nb_parcel` INT(11) UNSIGNED NOT NULL,
`file_deleted` TINYINT(3) UNSIGNED NOT NULL DEFAULT '0',
`date_add` DATETIME NOT NULL,
PRIMARY KEY (`id_colissimo_deposit_slip`),
INDEX `number` (`number`)
)";
$colissimoPickupPoint = "CREATE TABLE IF NOT EXISTS `"._DB_PREFIX_."colissimo_pickup_point` (
`id_colissimo_pickup_point` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`colissimo_id` VARCHAR(8) NOT NULL,
`company_name` VARCHAR(64) NOT NULL,
`address1` VARCHAR(120) NOT NULL,
`address2` VARCHAR(120) NULL DEFAULT NULL,
`address3` VARCHAR(120) NULL DEFAULT NULL,
`city` VARCHAR(80) NOT NULL,
`zipcode` VARCHAR(10) NOT NULL,
`country` VARCHAR(64) NOT NULL,
`iso_country` VARCHAR(2) NOT NULL,
`product_code` VARCHAR(3) NOT NULL,
`network` VARCHAR(10) NULL DEFAULT NULL,
`date_add` DATETIME NOT NULL,
`date_upd` DATETIME NOT NULL,
PRIMARY KEY (`id_colissimo_pickup_point`),
INDEX `colissimo_id` (`colissimo_id`),
INDEX `iso_country` (`iso_country`),
INDEX `product_code` (`product_code`)
)";
$colissimoCartPickupPoint = "CREATE TABLE IF NOT EXISTS `"._DB_PREFIX_."colissimo_cart_pickup_point` (
`id_cart` INT(11) NOT NULL DEFAULT '0',
`id_colissimo_pickup_point` INT(11) NOT NULL DEFAULT '0',
`mobile_phone` VARCHAR(50) NULL DEFAULT NULL,
PRIMARY KEY (`id_cart`, `id_colissimo_pickup_point`),
UNIQUE INDEX `id_cart` (`id_cart`)
)";
$colissimoShipmentTracking = "CREATE TABLE IF NOT EXISTS `"._DB_PREFIX_."colissimo_shipment_tracking` (
`id_colissimo_label` INT(11) UNSIGNED NOT NULL DEFAULT '0',
`status_text` VARCHAR(255) NULL DEFAULT NULL,
`typology` VARCHAR(10) NULL DEFAULT NULL,
`date_upd` DATETIME NOT NULL,
PRIMARY KEY (`id_colissimo_label`)
)";
$colissimoTrackingCode = "CREATE TABLE IF NOT EXISTS `"._DB_PREFIX_."colissimo_tracking_code` (
`id_colissimo_tracking_code` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`clp_code` VARCHAR(10) NOT NULL DEFAULT '0',
`inovert_code` VARCHAR(10) NULL DEFAULT '0',
`typology` VARCHAR(10) NULL DEFAULT NULL,
`internal_text` VARCHAR(255) NULL DEFAULT NULL,
PRIMARY KEY (`id_colissimo_tracking_code`),
INDEX `clp_code` (`clp_code`),
INDEX `inovert_code` (`inovert_code`),
INDEX `typology` (`typology`)
)";
$colissimoMailboxReturn = "CREATE TABLE IF NOT EXISTS `"._DB_PREFIX_."colissimo_mailbox_return` (
`id_colissimo_label` INT(10) UNSIGNED NOT NULL,
`pickup_date` VARCHAR(50) NULL DEFAULT NULL,
`pickup_before` VARCHAR(5) NULL DEFAULT NULL,
PRIMARY KEY (`id_colissimo_label`),
INDEX `id_colissimo_label` (`id_colissimo_label`)
)";
$colissimoCustomCategory = "CREATE TABLE IF NOT EXISTS `"._DB_PREFIX_."colissimo_custom_category` (
`id_colissimo_custom_category` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`id_category` INT(10) NULL DEFAULT 0,
`short_desc` VARCHAR(64) NULL DEFAULT NULL,
`id_country_origin` INT(10) NULL DEFAULT 0,
`hs_code` VARCHAR(50) NULL DEFAULT NULL,
PRIMARY KEY (`id_colissimo_custom_category`)
)";
$colissimoCustomProduct = "CREATE TABLE IF NOT EXISTS `"._DB_PREFIX_."colissimo_custom_product` (
`id_colissimo_custom_product` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`id_product` INT(10) NULL DEFAULT 0,
`short_desc` VARCHAR(64) NULL DEFAULT NULL,
`id_country_origin` INT(10) NULL DEFAULT 0,
`hs_code` VARCHAR(50) NULL DEFAULT NULL,
PRIMARY KEY (`id_colissimo_custom_product`)
)";
$createTablesQueries = array(
'services' => $colissimoServices,
'order' => $colissimoOrder,
'label' => $colissimoLabel,
'deposit_slip' => $colissimoDepositSlip,
'pickup_point' => $colissimoPickupPoint,
'cart_pickup_point' => $colissimoCartPickupPoint,
'shipment_tracking' => $colissimoShipmentTracking,
'tracking_code' => $colissimoTrackingCode,
'mailbox_return' => $colissimoMailboxReturn,
'custom_category' => $colissimoCustomCategory,
'custom_product' => $colissimoCustomProduct,
);
try {
foreach ($createTablesQueries as $name => $createTablesQuery) {
Db::getInstance()
->execute($createTablesQuery);
$this->logger->info('Table '.$name.' created.');
}
} catch (Exception $e) {
$this->logger->error($e->getMessage());
throw new Exception($this->l('Cannot create tables.'));
}
$columnExists = Db::getInstance()->executeS('SHOW COLUMNS FROM `'._DB_PREFIX_.'colissimo_order` LIKE "hidden"');
if (empty($columnExists)) {
$result = Db::getInstance()
->execute('ALTER TABLE `'._DB_PREFIX_.'colissimo_order` ADD COLUMN `hidden` TINYINT(3) UNSIGNED NULL DEFAULT \'0\' AFTER `migration`;');
if (!$result) {
$this->logger->error('Cannot add column in colissimo_order table.');
}
$this->logger->info('New column hidden in colissimo_order created.');
}
$columnExists = Db::getInstance()
->executeS('SHOW COLUMNS FROM `'._DB_PREFIX_.'colissimo_label` LIKE "insurance"');
if (empty($columnExists)) {
$result = Db::getInstance()
->execute(
'ALTER TABLE `'._DB_PREFIX_.'colissimo_label` ADD COLUMN `insurance` TINYINT(3) UNSIGNED NULL DEFAULT NULL AFTER `migration`'
);
if (!$result) {
$this->logger->error('Cannot add column insurance in colissimo_label table.');
}
$this->logger->info('New column insurance in colissimo_label created.');
}
}
/**
* @throws Exception
* @throws PrestaShopDatabaseException
* @throws PrestaShopException
*/
public function createModuleCarriersAndServices()
{
$existingColissimoCarriers = Configuration::getMultiple(
array(
'COLISSIMO_CARRIER_AVEC_SIGNATURE',
'COLISSIMO_CARRIER_SANS_SIGNATURE',
'COLISSIMO_CARRIER_RELAIS',
)
);
$colissimoCarriers = array(
array(
'name' => 'Colissimo Domicile sans signature',
'delays' => array(
'fr' => 'Livraison à domicile',
'en' => 'Home delivery in mailbox',
),
'url' => '',
'active' => true,
'shipping_handling' => false,
'range_behavior' => 0,
'is_module' => true,
'is_free' => false,
'shipping_external' => true,
'need_range' => true,
'external_module_name' => $this->name,
'shipping_method' => Carrier::SHIPPING_METHOD_WEIGHT,
'service' => 'SANS_SIGNATURE',
),
array(
'name' => 'Colissimo Domicile avec signature',
'delays' => array(
'fr' => 'Livraison à domicile contre signature',
'en' => 'Home delivery with proof of delivery',
),
'url' => '',
'active' => true,
'shipping_handling' => false,
'range_behavior' => 0,
'is_module' => true,
'is_free' => false,
'shipping_external' => true,
'need_range' => true,
'external_module_name' => $this->name,
'shipping_method' => Carrier::SHIPPING_METHOD_WEIGHT,
'service' => 'AVEC_SIGNATURE',
),
array(
'name' => 'Colissimo Points de retrait',
'delays' => array(
'fr' => 'Livraison à la poste, en relais Pickup & consignes Pickup Station',
'en' => 'Delivery at post office, Pickup points & lockers',
),
'url' => '',
'active' => true,
'shipping_handling' => false,
'range_behavior' => 0,
'is_module' => true,
'is_free' => false,
'shipping_external' => true,
'need_range' => true,
'external_module_name' => $this->name,
'shipping_method' => Carrier::SHIPPING_METHOD_WEIGHT,
'service' => 'RELAIS',
),
);
$languages = Language::getLanguages(false);
foreach ($colissimoCarriers as $colissimoCarrier) {
$idCarrier = $existingColissimoCarriers['COLISSIMO_CARRIER_'.$colissimoCarrier['service']];
$oldCarrier = ColissimoCarrier::getCarrierByReference((int) $idCarrier);
if ($oldCarrier !== false &&
Validate::isLoadedObject($oldCarrier) &&
$oldCarrier->external_module_name == $this->name
) {
$this->logger->info('Carrier already exists');
continue;
}
$this->logger->info('Creating carrier '.$colissimoCarrier['service']);
$newCarrier = $this->createCarrier($colissimoCarrier, $languages);
$newCarrier->setGroups(Group::getGroups($this->context->language->id));
}
$carriersToKeep = Configuration::getMultiple(
array(
'COLISSIMO_CARRIER_AVEC_SIGNATURE',
'COLISSIMO_CARRIER_SANS_SIGNATURE',
'COLISSIMO_CARRIER_RELAIS',
)
);
//@formatter:off
Db::getInstance()->update(
'carrier',
array('deleted' => 1),
'external_module_name = "'.pSQL($this->name).'" AND id_reference NOT IN('.implode(',', array_map('intval', $carriersToKeep)).')'
);
//@formatter:off
$colissimoServices = ColissimoTools::getColissimoServicesSource();
$this->logger->info('Services from CSV', array('csv' => $colissimoServices));
try {
$this->createServices($colissimoServices);
} catch (Exception $e) {
$this->logger->error($e->getMessage());
throw new Exception($this->l('Cannot create Colissimo services.'));
}
}
/**
* @param array|bool $trackingCodes
* @throws Exception
*/
public function createTrackingCodes($trackingCodes)
{
if ($trackingCodes === false) {
throw new Exception(
$this->l('Cannot process tracking codes csv files. Please check permissions on the module directory')
);
}
$exceptionsCount = 0;
foreach ($trackingCodes as $trackingCode) {
$colissimoTrackingCode = ColissimoTrackingCode::getByClpCode($trackingCode['clp_code']);
$colissimoTrackingCode->clp_code = pSQL($trackingCode['clp_code']);
$colissimoTrackingCode->inovert_code = pSQL($trackingCode['inovert_code']);
$colissimoTrackingCode->typology = pSQL($trackingCode['typology']);
$colissimoTrackingCode->internal_text = pSQL($trackingCode['internal_text']);
try {
$colissimoTrackingCode->save();
} catch (Exception $e) {
$this->logger->error($e->getMessage());
$exceptionsCount++;
continue;
}
}
$this->logger->info('Tracking codes created. '.$exceptionsCount.' errors thrown.');
}
/**
* @param array $carrierArray
* @param array $languages
* @return ColissimoCarrier
* @throws Exception
* @throws PrestaShopException
*/
public function createCarrier($carrierArray, $languages)
{
$carrier = new ColissimoCarrier();
$carrier->hydrate($carrierArray);
foreach ($languages as $language) {
$carrier->delay[(int) $language['id_lang']] =
isset($carrierArray['delays'][$language['iso_code']]) ? $carrierArray['delays'][$language['iso_code']] :
$carrierArray['delays']['en'];
}
if (!$carrier->save()) {
throw new Exception($this->l('Cannot create carriers.'));
}
if (Tools::version_compare(_PS_VERSION_, '1.7', '>=')) {
$logoPath = _PS_MODULE_DIR_.$this->name.'/views/img/colissimo_carrier_17.png';
} else {
$logoPath = _PS_MODULE_DIR_.$this->name.'/views/img/colissimo_carrier.png';
}
$carrier->setLogo($logoPath, $this->context->language->id);
Configuration::updateGlobalValue('COLISSIMO_CARRIER_'.$carrierArray['service'], $carrier->id);
return $carrier;
}
/**
* @param array $colissimoServices
* @throws Exception
* @throws PrestaShopException
*/
public function createServices($colissimoServices)
{
foreach ($colissimoServices as $serviceKey => $services) {
foreach ($services as $service) {
$id = ColissimoService::getServiceIdByProductCodeDestinationType(
$service['product_code'],
$service['destination_type']
);
$colissimoService = new ColissimoService((int) $id);
$colissimoService->hydrate($service);
$colissimoService->id_carrier = (int) Configuration::get('COLISSIMO_CARRIER_'.$serviceKey);
$colissimoService->type = pSQL($serviceKey);
$colissimoService->save();
$this->logger->info('Saved service '.$serviceKey.': '.(int) $colissimoService->id);
}
}
}
/**
*
*/
public function setDefaultConfiguration()
{
//@formatter:off
Configuration::updateValue('COLISSIMO_ACCOUNT_LOGIN', '');
Configuration::updateValue('COLISSIMO_ACCOUNT_PASSWORD', '');
Configuration::updateValue('COLISSIMO_ACCOUNT_TYPE', '{"FRANCE":1}');
Configuration::updateValue('COLISSIMO_SENDER_ADDRESS', '');
Configuration::updateValue('COLISSIMO_RETURN_ADDRESS', '');
Configuration::updateValue('COLISSIMO_USE_RETURN_ADDRESS', 0);
Configuration::updateValue('COLISSIMO_WIDGET_ENDPOINT', 'https://ws.colissimo.fr/widget-point-retrait/rest/authenticate.rest');
Configuration::updateValue('COLISSIMO_ENABLE_BREXIT', 0);
Configuration::updateValue('COLISSIMO_WIDGET_REMOTE', 1);
Configuration::updateValue('COLISSIMO_WIDGET_COLOR_1', '#333333');
Configuration::updateValue('COLISSIMO_WIDGET_COLOR_2', '#EA690A');
Configuration::updateValue('COLISSIMO_WIDGET_FONT', 'Arial');
$generateLabelStatuses = array_fill_keys(array((int) Configuration::get('PS_OS_PREPARATION')), 1);
Configuration::updateValue('COLISSIMO_ORDER_PREPARATION_TIME', 1);
Configuration::updateValue('COLISSIMO_GENERATE_LABEL_STATUSES', json_encode($generateLabelStatuses));
Configuration::updateValue('COLISSIMO_USE_SHIPPING_IN_PROGRESS', 1);
Configuration::updateValue('COLISSIMO_USE_HANDLED_BY_CARRIER', 0);
Configuration::updateValue('COLISSIMO_GENERATE_LABEL_PRESTASHOP', 1);
Configuration::updateValue('COLISSIMO_POSTAGE_MODE_MANUAL', 1);
Configuration::updateValue('COLISSIMO_LABEL_FORMAT', 'PDF_A4_300dpi');
Configuration::updateValue('COLISSIMO_DEFAULT_HS_CODE', '');
Configuration::updateValue('COLISSIMO_INSURE_SHIPMENTS', 0);
Configuration::updateValue('COLISSIMO_ENABLE_RETURN', 0);
Configuration::updateValue('COLISSIMO_AUTO_PRINT_RETURN_LABEL', 0);
Configuration::updateValue('COLISSIMO_DISPLAY_RETURN_LABEL_CUSTOMER', 0);
Configuration::updateValue('COLISSIMO_ENABLE_MAILBOX_RETURN', 0);
Configuration::updateGlobalValue('COLISSIMO_FILES_LIMIT', 3000);
Configuration::updateGlobalValue('COLISSIMO_FILES_LIFETIME', 14);
//@formatter:on
}
/**
* @return array
*/
public function getTabs()
{
$languages = Language::getLanguages(false);
$tabNames = array();
foreach ($languages as $language) {
if ($language['iso_code'] == 'fr') {
$tabNames['dashboard'][$language['locale']] = 'Colissimo - Tableau de bord';
$tabNames['dashboard'][$language['iso_code']] = 'Colissimo - Tableau de bord';
$tabNames['postage'][$language['locale']] = 'Colissimo - Affranchissement';
$tabNames['postage'][$language['iso_code']] = 'Colissimo - Affranchissement';
$tabNames['deposit'][$language['locale']] = 'Colissimo - Bordereaux';
$tabNames['deposit'][$language['iso_code']] = 'Colissimo - Bordereaux';
$tabNames['coliship'][$language['locale']] = 'Colissimo - Coliship';
$tabNames['coliship'][$language['iso_code']] = 'Colissimo - Coliship';
} else {
$tabNames['dashboard'][$language['locale']] = 'Colissimo - Dashboard';
$tabNames['dashboard'][$language['iso_code']] = 'Colissimo - Dashboard';
$tabNames['postage'][$language['locale']] = 'Colissimo - Postage';
$tabNames['postage'][$language['iso_code']] = 'Colissimo - Postage';
$tabNames['deposit'][$language['locale']] = 'Colissimo - Deposit slip';
$tabNames['deposit'][$language['iso_code']] = 'Colissimo - Deposit slip';
$tabNames['coliship'][$language['locale']] = 'Colissimo - Coliship';
$tabNames['coliship'][$language['iso_code']] = 'Colissimo - Coliship';
}
}
$tabs = array(
array(
'visible' => false,
'class_name' => 'AdminColissimoTestCredentials',
),
array(
'visible' => false,
'class_name' => 'AdminColissimoLabel',
),
array(
'visible' => false,
'class_name' => 'AdminColissimoMigration',
),
array(
'visible' => false,
'class_name' => 'AdminColissimoLogs',
),
array(
'visible' => true,
'class_name' => 'AdminColissimoDashboard',
'parent_class_name' => 'AdminParentShipping',
'ParentClassName' => 'AdminParentShipping',
'name' => $tabNames['dashboard'],
),
array(
'visible' => true,
'class_name' => 'AdminColissimoAffranchissement',
'parent_class_name' => 'AdminParentShipping',
'ParentClassName' => 'AdminParentShipping',
'name' => $tabNames['postage'],
),
array(
'visible' => true,
'class_name' => 'AdminColissimoDepositSlip',
'parent_class_name' => 'AdminParentShipping',
'ParentClassName' => 'AdminParentShipping',
'name' => $tabNames['deposit'],
),
array(
'visible' => true,
'class_name' => 'AdminColissimoColiship',
'parent_class_name' => 'AdminParentShipping',
'ParentClassName' => 'AdminParentShipping',
'name' => $tabNames['coliship'],
),
);
return $tabs;
}
/**
* @throws Exception
*/
public function installMenus()
{
if (Tools::version_compare(_PS_VERSION_, '1.7.1', '<')) {
$tabs = $this->getTabs();
foreach ($tabs as $tab) {
$this->installMenu($tab);
}
}
}
/**
* @param array $menu
* @throws Exception
*/
public function installMenu($menu)
{
$tab = new Tab();
$tab->active = (bool) $menu['visible'];
$tab->name = array();
$tab->class_name = pSQL($menu['class_name']);
$names = isset($menu['name']) ? $menu['name'] : array('en' => $menu['class_name']);
$langs = Language::getLanguages(true);
foreach ($langs as $lang) {
$tab->name[$lang['id_lang']] =
isset($names[$lang['iso_code']]) ? pSQL($names[$lang['iso_code']]) : pSQL($names['en']);
}
if (isset($menu['parent_class_name'])) {
$tab->id_parent = (int) Tab::getIdFromClassName($menu['parent_class_name']);
}
$tab->module = pSQL($this->name);
if (!$tab->add()) {
throw new Exception($this->l('Cannot create Colissimo menu.'));
}
}
/**
* @throws PrestaShopDatabaseException
* @throws PrestaShopException
*/
public function installOrderStates()
{
$shippingInProgressLang = array(
'fr' => 'En cours d’expédition',
'en' => 'Shipping in progress',
);
$shippingInProgressState = new OrderState(
(int) Configuration::getGlobalValue('COLISSIMO_OS_SHIPPING_IN_PROGRESS')
);
if (!Validate::isLoadedObject($shippingInProgressState)) {
$shippingInProgressState->name = array();
$shippingInProgressState->module_name = pSQL($this->name);
$shippingInProgressState->color = '#e6600c';
$shippingInProgressState->send_email = false;
$shippingInProgressState->hidden = false;
$shippingInProgressState->delivery = false;
$shippingInProgressState->logable = false;
$shippingInProgressState->invoice = false;
$languages = Language::getLanguages(false);
foreach ($languages as $language) {
$name = isset($shippingInProgressLang[$language['iso_code']]) ? $shippingInProgressLang[$language['iso_code']] : $shippingInProgressLang['en'];
$shippingInProgressState->name[(int) $language['id_lang']] = pSQL($name);
}
if ($shippingInProgressState->save()) {
$source = _PS_MODULE_DIR_.$this->name.'/views/img/os_colissimo.gif';
$destination = _PS_ROOT_DIR_.'/img/os/'.(int) $shippingInProgressState->id.'.gif';
@copy($source, $destination);
Configuration::updateGlobalValue(
'COLISSIMO_OS_SHIPPING_IN_PROGRESS',
(int) $shippingInProgressState->id
);
}
}
$handledByCarrierLang = array(
'fr' => 'Remis au transporteur',
'en' => 'Handled by carrier',
);
$handledByCarrierState = new OrderState(
(int) Configuration::getGlobalValue('COLISSIMO_OS_HANDLED_BY_CARRIER')
);
if (!Validate::isLoadedObject($handledByCarrierState)) {
$handledByCarrierState->name = array();
$handledByCarrierState->module_name = pSQL($this->name);
$handledByCarrierState->color = '#e6600c';
$handledByCarrierState->send_email = false;
$handledByCarrierState->hidden = false;
$handledByCarrierState->delivery = false;
$handledByCarrierState->logable = false;
$handledByCarrierState->invoice = false;
$languages = Language::getLanguages(false);
foreach ($languages as $language) {
$name = isset($handledByCarrierLang[$language['iso_code']]) ? $handledByCarrierLang[$language['iso_code']] : $handledByCarrierLang['en'];
$handledByCarrierState->name[(int) $language['id_lang']] = pSQL($name);
}
if ($handledByCarrierState->save()) {
$source = _PS_MODULE_DIR_.$this->name.'/views/img/os_colissimo.gif';
$destination = _PS_ROOT_DIR_.'/img/os/'.(int) $handledByCarrierState->id.'.gif';
@copy($source, $destination);
Configuration::updateGlobalValue(
'COLISSIMO_OS_HANDLED_BY_CARRIER',
(int) $handledByCarrierState->id
);
}
}
}
/**
* @return array
* @throws SmartyException
*/
public function getWhatsNewModal()
{
return array(
'modal_id' => 'colissimo-modal-whatsnew',
'modal_class' => 'modal-lg',
'modal_title' => ' '.$this->l('What\'s new?'),
'modal_content' => $this->context->smarty->fetch($this->local_path.'views/templates/admin/whatsnew/whatsnew.tpl'),
);
}
/**
* @return string
* @throws Exception
* @throws SmartyException
*/
public function getContent()
{
$this->context->controller->modals[] = $this->getWhatsNewModal();
$this->setColissimoHeader();
$this->moduleConfiguration =
new ColissimoModuleConfiguration($this->context, $this->local_path, $this->getPathUri(), $this->version);
$this->postProcessConfiguration();
$output = $this->moduleConfiguration->getContent();
if (empty($this->moduleConfiguration->modulesToMigrate)) {
$senderAddress = new ColissimoMerchantAddress('sender');
$errors = $this->validateMerchantAddress($senderAddress);
if (!empty($errors)) {
//@formatter:off
$this->context->controller->warnings[] = $this->l('Please fill you sender address in the "My Colissimo account" tab to take full advantage of the module\'s features.');
//@formatter:on
foreach ($errors as $error) {
$this->context->controller->warnings[] = $error;
}
}
if (Configuration::get('COLISSIMO_USE_RETURN_ADDRESS')) {
$returnAddress = new ColissimoMerchantAddress('return');
$errors = $this->validateMerchantAddress($returnAddress);
if (!empty($errors)) {
//@formatter:off
$this->context->controller->warnings[] = $this->l('Please fill a valid return address.');
//@formatter:on
foreach ($errors as $error) {
$this->context->controller->warnings[] = $error;
}
}
}
}
return $output;
}
/**
*
*/
public function postProcessConfiguration()
{
$this->context->smarty->assign('active', 'intro');
if (Tools::isSubmit('submitColissimoSenderAddressConfigForm')) {
$this->context->smarty->assign('active', 'account');
$this->postProcessSenderAddress();
} elseif (Tools::isSubmit('submitColissimoReturnAddressConfigForm')) {
$this->context->smarty->assign('active', 'account');
$this->postProcessReturnAddress();
} elseif (Tools::isSubmit('submitColissimoAccountConfigForm')) {
$this->context->smarty->assign('active', 'account');
$this->postProcessAccountConfig();
} elseif (Tools::isSubmit('submitColissimoEnableBrexit')) {
$this->context->smarty->assign('active', 'fo');
$this->postProcessEnableBrexit();
} elseif (Tools::isSubmit('submitColissimoWidgetConfigForm')) {
$this->context->smarty->assign('active', 'fo');
$this->postProcessWidgetConfig();
} elseif (Tools::isSubmit('submitColissimoBackConfigForm')) {
$this->context->smarty->assign('active', 'bo');
$this->postProcessBackConfig();
} elseif (Tools::isSubmit('submitColissimoShipmentsConfigForm')) {
$this->context->smarty->assign('active', 'bo');
$this->postProcessShipmentsConfig();
} elseif (Tools::isSubmit('submitColissimoFilesConfigForm')) {
$this->context->smarty->assign('active', 'files');
$this->postProcessFilesConfig();
}
}
/**
* @param ColissimoMerchantAddress $merchandAddress
* @return array
*/
public function validateMerchantAddress($merchandAddress)
{
$errors = array();
if (!Validate::isName($merchandAddress->lastName)) {
$errors[] = $this->l('Please fill a valid lastname.');
}
if (!Validate::isName($merchandAddress->firstName)) {
$errors[] = $this->l('Please fill a valid fistname.');
}
if (!Validate::isAddress($merchandAddress->line0) ||
!Validate::isAddress($merchandAddress->line1) ||
!Validate::isAddress($merchandAddress->line2) ||
!Validate::isAddress($merchandAddress->line3)
) {
$errors[] = $this->l('Please fill a valid address.');
}
if (!Validate::isCityName($merchandAddress->city)) {
$errors[] = $this->l('Please fill a valid city.');
}
if ($merchandAddress->countryCode) {
try {
$country = new Country((int) Country::getByIso($merchandAddress->countryCode));
if (!Validate::isPostCode($merchandAddress->zipCode) ||
!$country->checkZipCode($merchandAddress->zipCode)
) {
$errors[] = $this->l('Please fill a valid zipcode.');
}
} catch (Exception $e) {
$errors[] = $this->l('Please fill a valid country.');
}
}
if (Tools::isSubmit('colissimo_is_mobile_valid')) {
if (Tools::getValue('colissimo_is_mobile_valid') == 0) {
$errors[] = $this->l('Please fill a valid phone number.');
}
}
if (!Validate::isEmail($merchandAddress->email)) {
$errors[] = $this->l('Please fill a valid email address.');
}
return $errors;
}
public function validateSenderAddress($senderAddress)
{
$errors = array();
if (!Validate::isName($senderAddress['sender_lastname'])) {
$errors[] = $this->l('Please fill a valid lastname.');
}
if (!Validate::isName($senderAddress['sender_firstname'])) {
$errors[] = $this->l('Please fill a valid fistname.');
}
if (!Validate::isAddress($senderAddress['sender_address1']) ||
!Validate::isAddress($senderAddress['sender_address2']) ||
!Validate::isAddress($senderAddress['sender_address3']) ||
!Validate::isAddress($senderAddress['sender_address4'])
) {
$errors[] = $this->l('Please fill a valid address.');
}
if (!Validate::isCityName($senderAddress['sender_city'])) {
$errors[] = $this->l('Please fill a valid city.');
}
try {
$country = new Country((int) Country::getByIso($senderAddress['sender_country']));
if (!Validate::isPostCode($senderAddress['sender_zipcode']) ||
!$country->checkZipCode($senderAddress['sender_zipcode'])
) {
$errors[] = $this->l('Please fill a valid zipcode.');
}
} catch (Exception $e) {
$errors[] = $this->l('Please fill a valid country.');
}
if (!Validate::isPostCode($senderAddress['sender_zipcode']) ||
!$country->checkZipCode($senderAddress['sender_zipcode'])
) {
$errors[] = $this->l('Please fill a valid zipcode.');
}
if ($senderAddress['colissimo_is_mobile_valid'] == 0) {
$errors[] = $this->l('Please fill a valid phone.');
}
if (!Validate::isEmail($senderAddress['sender_email'])) {
$errors[] = $this->l('Please fill a valid email address.');
}
return $errors;
}
/**
* @param array|mixed $returnAddress
* @return array
*/
public function validateReturnAddress($returnAddress)
{
$errors = array();
if (!Validate::isName($returnAddress['return_lastname'])) {
$errors[] = $this->l('Please fill a valid return lastname.');
}
if (!Validate::isName($returnAddress['return_firstname'])) {
$errors[] = $this->l('Please fill a valid return fistname.');
}
if (!Validate::isAddress($returnAddress['return_address1']) ||
!Validate::isAddress($returnAddress['return_address2']) ||
!Validate::isAddress($returnAddress['return_address3']) ||
!Validate::isAddress($returnAddress['return_address4'])
) {
$errors[] = $this->l('Please fill valid return addresses values.');
}
if (!Validate::isCityName($returnAddress['return_city'])) {
$errors[] = $this->l('Please fill a valid return city.');
}
try {
$country = new Country((int) Country::getByIso($returnAddress['return_country']));
if (!Validate::isPostCode($returnAddress['return_zipcode']) ||
!$country->checkZipCode($returnAddress['return_zipcode'])
) {
$errors[] = $this->l('Please fill a valid return zipcode.');
}
} catch (Exception $e) {
$errors[] = $this->l('Please fill a valid return country.');
}
if ($returnAddress['colissimo_is_mobile_valid'] == 0) {
$errors[] = $this->l('Please fill a valid return phone.');
}
if (!Validate::isEmail($returnAddress['return_email'])) {
$errors[] = $this->l('Please fill a valid return email address.');
}
return $errors;
}
/**
*
*/
public function postProcessSenderAddress()
{
$senderAddressFromPost = ColissimoTools::getValueMultiple($this->moduleConfiguration->senderAddressFields);
$senderAddressFromPost['sender_phone'] = $senderAddressFromPost['sender_phone']['full'];
$senderAddress = new ColissimoMerchantAddress('sender', $senderAddressFromPost);
$errors = $this->validateMerchantAddress($senderAddress);
if (!empty($errors)) {
$this->context->controller->errors = $errors;
} else {
Configuration::updateValue('COLISSIMO_SENDER_ADDRESS', $senderAddress->toJSON());
$this->context->controller->confirmations = $this->l('Sender address saved successfully.');
}
}
/**
*
*/
public function postProcessReturnAddress()
{
$returnAddressFromPost = ColissimoTools::getValueMultiple($this->moduleConfiguration->returnAddressFields);
$returnAddressFromPost['return_phone'] = $returnAddressFromPost['return_phone']['full'];
$returnAddress = new ColissimoMerchantAddress('return', $returnAddressFromPost);
$errors = $this->validateMerchantAddress($returnAddress);
if (!empty($errors)) {
$this->context->controller->errors = $errors;
} else {
Configuration::updateValue('COLISSIMO_RETURN_ADDRESS', $returnAddress->toJSON());
$this->context->controller->confirmations = $this->l('Return address saved successfully.');
}
}
/**
*
*/
public function postProcessAccountConfig()
{
$keys = $this->moduleConfiguration->accountFields;
foreach ($keys as $key) {
Configuration::updateValue($key, trim(Tools::getValue($key)));
}
$accountTypeChoices = Tools::getValue('COLISSIMO_ACCOUNT_TYPE');
if ($accountTypeChoices) {
$accountType = array();
foreach ($accountTypeChoices as $accountTypeChoice) {
$accountType[$accountTypeChoice[0]] = 1;
}
Configuration::updateValue('COLISSIMO_ACCOUNT_TYPE', json_encode($accountType));
$this->context->controller->confirmations = $this->l('Account details saved successfully.');
} else {
$this->context->controller->errors = $this->l('Please select at least one account type.');
}
}
/**
*
*/
public function postProcessEnableBrexit()
{
Configuration::updateValue('COLISSIMO_ENABLE_BREXIT', Tools::getValue('COLISSIMO_ENABLE_BREXIT'));
$this->context->controller->confirmations = $this->l('Brexit configuration saved successfully.');
}
/**
*
*/
public function postProcessWidgetConfig()
{
$keys = $this->moduleConfiguration->widgetFields;
foreach ($keys as $key) {
Configuration::updateValue($key, Tools::getValue($key));
}
$this->context->controller->confirmations = $this->l('Widget configuration saved successfully.');
}
/**
*
*/
public function postProcessBackConfig()
{
$keys = $this->moduleConfiguration->backFields;
if (!ctype_digit(Tools::getValue('COLISSIMO_ORDER_PREPARATION_TIME'))) {
$this->context->controller->errors = $this->l('Please fill a valid preparation time value (integer only).');
return;
}
$useThermalPrinter = Tools::getValue('COLISSIMO_USE_THERMAL_PRINTER');
$useEthernet = Tools::getValue('COLISSIMO_USE_ETHERNET');
if ($useThermalPrinter &&
$useEthernet &&
!filter_var(Tools::getValue('COLISSIMO_PRINTER_IP_ADDR', FILTER_VALIDATE_IP))
) {
$this->context->controller->errors = $this->l('Please fill a valid IP address.');
return;
}
$hsCode = Tools::getValue('COLISSIMO_DEFAULT_HS_CODE');
if ($hsCode && !ColissimoTools::isValidHsCode($hsCode)) {
//@formatter:off
$this->context->controller->errors = $this->l('Please fill a valid HS Code value. Expected formats: 6, 8 or 10 digits only.');
//@formatter:on
return;
}
foreach ($keys as $key) {
Configuration::updateValue($key, Tools::getValue($key));
}
if (Tools::getValue('COLISSIMO_GENERATE_LABEL_STATUSES')) {
$statuses = array_fill_keys(Tools::getValue('COLISSIMO_GENERATE_LABEL_STATUSES'), 1);
} else {
$statuses = array();
}
Configuration::updateValue('COLISSIMO_GENERATE_LABEL_STATUSES', json_encode($statuses));
$this->context->controller->confirmations = $this->l('Back-office configuration saved successfully.');
}
/**
*
*/
public function postProcessShipmentsConfig()
{
$keys = $this->moduleConfiguration->defaultShipmentsFields;
foreach ($keys as $key) {
Configuration::updateValue($key, Tools::getValue($key));
}
$this->context->controller->confirmations = $this->l('Default shipments configuration saved successfully.');
}
/**
*
*/
public function postProcessFilesConfig()
{
$keys = $this->moduleConfiguration->filesFields;
if (!ctype_digit(Tools::getValue('COLISSIMO_FILES_LIMIT')) ||
!ctype_digit(Tools::getValue('COLISSIMO_FILES_LIFETIME'))
) {
//@formatter:off
$this->context->controller->errors = $this->l('Please fill a valid files limit value and files lifetime value (integers only).');
//@formatter:on
return;
}
foreach ($keys as $key) {
Configuration::updateGlobalValue($key, Tools::getValue($key));
}
$this->context->controller->confirmations = $this->l('Files management configuration saved successfully.');
}
/**
*
*/
public function ajaxProcessUseReturnAddress()
{
$return_adr = Tools::getValue('returnAddress');
Configuration::updateValue('COLISSIMO_USE_RETURN_ADDRESS', (int) $return_adr);
$return = array(
'error' => false,
'message' => $this->l('Parameter saved successfully'),
);
die(json_encode($return));
}
/**
*
*/
public function setColissimoHeader()
{
$data = array(
'img_path' => $this->getPathUri().'views/img/',
'module_path' => $this->getPathUri(),
'module_version' => $this->version,
'id_product_addons' => self::ID_PRODUCT_ADDONS,
'coliview_url' => self::COLIVIEW_URL,
);
$this->context->smarty->assign(array('data' => $data));
}
/**
* @return string
* @throws Exception
* @throws SmartyException
*/
public function setColissimoControllerHeader()
{
$this->context->smarty->assign('link', $this->context->link);
$this->setColissimoHeader();
$header = $this->context->smarty->fetch($this->local_path.'views/templates/admin/_partials/header.back.tpl');
$this->context->smarty->assign(
'coliship_enabled',
(int) !Configuration::get('COLISSIMO_GENERATE_LABEL_PRESTASHOP')
);
$quickAccess =
$this->context->smarty->fetch($this->local_path.'views/templates/admin/_partials/quick-access.tpl');
return $header.$quickAccess;
}
/**
* @param Cart $cart
* @param float $shippingCost
* @param array|null $products
* @return float|bool
*/
public function getPackageShippingCost($cart, $shippingCost, $products)
{
$accountType = json_decode(Configuration::get('COLISSIMO_ACCOUNT_TYPE'), true);
$deliveryAddr = new Address((int) $cart->id_address_delivery);
if (Validate::isLoadedObject($deliveryAddr)) {
$isoCountryCustomer = Country::getIsoById((int) $deliveryAddr->id_country);
$destinationType = ColissimoTools::getDestinationTypeByIdCountry($deliveryAddr->id_country);
} else {
$idDefaultCountry = Configuration::get('PS_COUNTRY_DEFAULT');
$isoCountryCustomer = Country::getIsoById((int) $idDefaultCountry);
$destinationType = ColissimoTools::getDestinationTypeByIdCountry((int) $idDefaultCountry);
}
$carrier = new Carrier((int) $this->id_carrier);
$idCarrierReference = $carrier->id_reference;
$idService = ColissimoService::getServiceIdByIdCarrierDestinationType($idCarrierReference, $destinationType);
$colissimoService = new ColissimoService((int) $idService);
if ($idService) {
if (!$colissimoService->isEligibleToAccount($isoCountryCustomer, $accountType)) {
return false;
}
if ($this->isPassDelivery()) {
return 0;
}
return $shippingCost;
} else {
return false;
}
}
/**
* @param Cart $cart
* @param float $shippingCost
* @return bool|float
*/
public function getOrderShippingCost($cart, $shippingCost)
{
return $this->getPackageShippingCost($cart, $shippingCost, null);
}
/**
* @return bool
*/
public function isPassDelivery()
{
if (Module::isEnabled('colissimopass')) {
require_once(_PS_MODULE_DIR_.'colissimopass/classes/ColissimoPassUser.php');
if (ColissimoPassUser::isActive()) {
return true;
}
// 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 true;
}
}
}
}
return false;
}
/**
* @param array $params
* @return bool
*/
public function getOrderShippingCostExternal($params)
{
return false;
}
/**
* @return ColissimoLogger
*/
public function getLogger()
{
return $this->logger;
}
/**
* @param int $idOrder
* @throws Exception
* @throws PrestaShopDatabaseException
* @throws PrestaShopException
*/
public function postProcessColissimoValidateService($idOrder)
{
$order = new Order($idOrder);
$idColissimoOrder = ColissimoOrder::exists($idOrder);
$colissimoOrder = new ColissimoOrder((int) $idColissimoOrder);
$pickupPoint = ColissimoPickupPoint::getPickupPointByIdColissimo(Tools::getValue('id_colissimo_pickup_point'));
$previousIdColissimoService = $colissimoOrder->id_colissimo_service;
$previousService = ColissimoService::getServiceTypeById($previousIdColissimoService);
$previousAddress = new Address((int) $order->id_address_delivery);
$colissimoOrder->id_order = (int) $idOrder;
$idServiceToAssociate = (int) Tools::getValue('colissimo_service_to_associate');
if (!$idServiceToAssociate && !$pickupPoint->id) {
throw new Exception($this->l('Please choose a pickup point or select another service.'));
}
if (!$idServiceToAssociate) {
$destinationType = ColissimoTools::getDestinationTypeByIsoCountry($pickupPoint->iso_country);
$idServiceToAssociate = ColissimoService::getServiceIdByProductCodeDestinationType(
$pickupPoint->product_code,
$destinationType
);
}
$colissimoOrder->id_colissimo_service = (int) $idServiceToAssociate;
$colissimoOrder->id_colissimo_pickup_point = (int) $pickupPoint->id;
$colissimoOrder->migration = 0;
$colissimoOrder->hidden = 0;
$colissimoOrder->save();
$newService = ColissimoService::getServiceTypeById($colissimoOrder->id_colissimo_service);
if ($previousService === ColissimoService::TYPE_RELAIS && $newService !== ColissimoService::TYPE_RELAIS) {
$order->id_address_delivery = $order->id_address_invoice;
$order->update();
} elseif ($newService === ColissimoService::TYPE_RELAIS && $colissimoOrder->id_colissimo_pickup_point) {
$idNewAddress = ColissimoTools::createAddressFromPickupPoint(
$pickupPoint,
$order,
$previousAddress->phone
);
$order->id_address_delivery = (int) $idNewAddress;
$order->update();
}
}
/**
* @param string $typology
* @param Order $order
* @param int $labelId
* @param string $statusText
* @throws PrestaShopDatabaseException
* @throws Exception
*/
public function updateTrackingByTypology($typology, $order, $labelId, $statusText = '')
{
$idStatusShipped = Configuration::get('PS_OS_SHIPPING');
$idStatusDelivered = Configuration::get('PS_OS_DELIVERED');
if ($typology == ColissimoTrackingCode::TYPO_DELIVERED) {
if (!$order->getHistory($this->context->language->id, $idStatusDelivered)) {
$this->logger->info('Update order status to "Delivered"');
$history = new OrderHistory();
$history->id_order = (int) $order->id;
$history->changeIdOrderState((int) $idStatusDelivered, (int) $order->id);
$history->addWithemail();
}
} elseif ($typology == ColissimoTrackingCode::TYPO_SHIPPED) {
if (!$order->getHistory($this->context->language->id, $idStatusShipped) &&
!$order->getHistory($this->context->language->id, $idStatusDelivered)
) {
$this->logger->info('Update order status to "Shipped"');
$history = new OrderHistory();
$history->id_order = (int) $order->id;
$history->changeIdOrderState((int) $idStatusShipped, (int) $order->id);
$history->addWithemail();
}
}
if ($statusText) {
Db::getInstance()
->insert(
'colissimo_shipment_tracking',
array(
'id_colissimo_label' => (int) $labelId,
'status_text' => pSQL($statusText),
'typology' => pSQL($typology),
'date_upd' => date('Y-m-d H:i:s'),
),
false,
true,
Db::REPLACE
);
}
}
/**
* @param ColissimoLabel $colissimoLabel
* @return string
* @throws Exception
* @throws PrestaShopDatabaseException
*/
public function updateOrderTracking(ColissimoLabel $colissimoLabel)
{
$colissimoOrder = new ColissimoOrder((int) $colissimoLabel->id_colissimo_order);
$order = new Order((int) $colissimoOrder->id_order);
$request = new ColissimoTrackingSimpleRequest(ColissimoTools::getCredentials($order->id_shop));
$request->setSkybillNumber($colissimoLabel->shipping_number);
$this->logger->infoXml('Log XML request', $request->getRequest(true));
$client = new ColissimoClient();
$client->setRequest($request);
try {
/** @var ColissimoTrackingSimpleResponse $response */
$response = $client->request();
} catch (Exception $e) {
$this->logger->error('Exception thrown: '.$e->getMessage());
throw new Exception($this->l('Label #').$colissimoLabel->shipping_number.'
'.$e->getMessage());
}
if ($response->errorCode) {
$this->logger->error(sprintf('Error found: (%s) %s', $response->errorCode, $response->errorMessage));
throw new Exception($this->l('Label #').$colissimoLabel->shipping_number.'
'.$response->errorMessage);
}
$inovertCode = $response->eventCode;
$typology = ColissimoTrackingCode::getTypologyByInovertCode($inovertCode);
if (!$typology && $inovertCode != ColissimoTrackingCode::EVENT_WAITING_SHIPMENT_HANDLING) {
$typology = ColissimoTrackingCode::TYPO_SHIPPED;
}
$this->logger->info('Update tracking.');
$this->updateTrackingByTypology(
$typology,
new Order((int) $colissimoOrder->id_order),
$colissimoLabel->id,
$response->eventLibelle
);
return sprintf($this->l('Label #%s updated'), $colissimoLabel->shipping_number);
}
/**
* @return bool|string
* @throws Exception
*/
public function getWidgetToken()
{
$this->logger->setChannel('FrontWidgetToken');
$credentials = array_merge(
ColissimoTools::getCredentials(),
array('force_endpoint' => Configuration::get('COLISSIMO_WIDGET_ENDPOINT'))
);
$tokenRequest = new ColissimoWidgetAuthenticationRequest($credentials);
$client = new ColissimoClient();
$client->setRequest($tokenRequest);
try {
/** @var ColissimoWidgetAuthenticationResponse $response */
$response = $client->request();
} catch (Exception $e) {
$this->logger->error($e->getMessage());
return false;
}
return $response->token;
}
/**
* @param Order $order
* @return array
* @throws PrestaShopDatabaseException
* @throws PrestaShopException
*/
public function getEligibleServiceByOrder($order)
{
$accountType = json_decode(Configuration::get('COLISSIMO_ACCOUNT_TYPE'), true);
$deliveryAddr = new Address((int) $order->id_address_delivery);
if (Validate::isLoadedObject($deliveryAddr)) {
$isoCountryCustomer = Country::getIsoById((int) $deliveryAddr->id_country);
$destinationType = ColissimoTools::getDestinationTypeByIdCountry($deliveryAddr->id_country);
} else {
$idDefaultCountry = Configuration::get('PS_COUNTRY_DEFAULT');
$isoCountryCustomer = Country::getIsoById((int) $idDefaultCountry);
$destinationType = ColissimoTools::getDestinationTypeByIdCountry((int) $idDefaultCountry);
}
$eligibleServices = array();
$serviceIds = ColissimoService::getServiceIdsByDestinationType($destinationType);
foreach ($serviceIds as $serviceId) {
$colissimoService = new ColissimoService((int) $serviceId);
if ($colissimoService->isEligibleToAccount($isoCountryCustomer, $accountType)) {
if (!$colissimoService->is_pickup) {
$eligibleServices[(int) $serviceId] = $colissimoService->commercial_name;
} else {
$eligibleServices[0] = $this->l('Pickup point');
}
}
}
krsort($eligibleServices);
return $eligibleServices;
}
/**
* @param int $idColissimoOrder
* @param string $channel
* @throws Exception
*/
public function assignColissimoOrderVariables($idColissimoOrder, $channel = '')
{
$colissimoOrder = new ColissimoOrder((int) $idColissimoOrder);
$order = new Order((int) $colissimoOrder->id_order);
$orderDetails = $order->getOrderDetailList();
$weightUnit = Configuration::get('PS_WEIGHT_UNIT');
$orderTotals = array(
'amount' => $order->total_paid_tax_incl,
'shipping' => $order->total_shipping_tax_incl,
'weight' => $order->getTotalWeight(),
'id_currency' => $order->id_currency,
'weight_unit' => $weightUnit,
);
$colissimoPickupPoint = new ColissimoPickupPoint((int) $colissimoOrder->id_colissimo_pickup_point);
if (Validate::isLoadedObject($colissimoPickupPoint)) {
$pickupPointId = $colissimoPickupPoint->colissimo_id;
} else {
$pickupPointId = false;
}
$shipments = $colissimoOrder->getShipments($this->context->language->id);
$colissimoService = new ColissimoService((int) $colissimoOrder->id_colissimo_service);
$this->context->smarty->assign(
array(
'id_colissimo_order' => $idColissimoOrder,
'id_order' => $order->id,
'delivery_addr' => new Address((int) $order->id_address_delivery),
'customer' => new Customer((int) $order->id_customer),
'order_details' => $orderDetails,
'order_totals' => $orderTotals,
'shipments' => $shipments,
'show_visibility_btn' => !$shipments && $colissimoOrder->hidden == 1,
'colissimo_channel' => $channel,
'colissimo_service' => $colissimoService->commercial_name,
'coliship_enabled' => !Configuration::get('COLISSIMO_GENERATE_LABEL_PRESTASHOP'),
'pickup_point_id' => $pickupPointId,
)
);
}
/**
* @param int $idOrder
* @return string|false
* @throws PrestaShopDatabaseException
* @throws PrestaShopException
* @throws SmartyException
*/
public function getColissimoOrderToAssignHtml($idOrder)
{
$order = new Order((int) $idOrder);
if (!Validate::isLoadedObject($order)) {
return false;
}
$eligibleServices = $this->getEligibleServiceByOrder($order);
if (empty($eligibleServices)) {
return false;
}
$this->context->smarty->assign(array('id_order' => (int) $idOrder));
return $this->context->smarty->fetch(sprintf(
'extends:%s|%s',
$this->local_path.'views/templates/admin/admin_order/'.$this->boTheme.'/layout-block.tpl',
$this->local_path.'views/templates/admin/admin_order/'.$this->boTheme.'/order-association.tpl'
));
}
/**
* @param string $id
* @param string $url
* @param array $params
*/
public function registerExternalJs($id, $url, $params = array())
{
if (version_compare(_PS_VERSION_, '1.7', '>=')) {
$this->context->controller->registerJavascript($id, $url, $params);
} else {
$this->context->controller->addJS($url);
}
}
/**
* @param string $id
* @param string $filename
* @param array $params
*/
public function registerJs($id, $filename, $params = array())
{
if (version_compare(_PS_VERSION_, '1.7', '>=')) {
$this->context->controller->registerJavascript($id, 'modules/'.$this->name.'/views/js/'.$filename, $params);
} else {
$this->context->controller->addJS($this->_path.'views/js/'.$filename);
}
}
/**
* @param string $id
* @param string $filename
* @param array $params
*/
public function registerCSS($id, $filename, $params = array())
{
if (version_compare(_PS_VERSION_, '1.7', '>=')) {
$this->context->controller->registerStylesheet(
$id,
'modules/'.$this->name.'/views/css/'.$filename,
$params
);
} else {
$this->context->controller->addCSS($this->_path.'views/css/'.$filename);
}
}
/**
* @param array $params
* @return bool
* @throws PrestaShopDatabaseException
* @throws PrestaShopException
*/
public function hookNewOrder($params)
{
$this->logger->setChannel('HookNewOrder');
$this->logger->info('Hook newOrder called');
$order = new Order((int) $params['order']->id);
if (Validate::isLoadedObject($order) && $order->current_state != Configuration::get('PS_OS_ERROR')) {
$carrier = new Carrier((int) $order->id_carrier);
$idCarrierReference = $carrier->id_reference;
$this->logger->info(
sprintf('Order #%d - Carrier details', $order->id),
array('id_carrier' => $order->id_carrier, 'id_reference' => $carrier->id_reference)
);
$this->logger->info(
sprintf('Order #%d - Order Carrier details', $order->id),
ColissimoOrderCarrier::getAllByIdOrder($order->id)
);
if ($carrier->external_module_name != $this->name) {
$this->logger->info(
sprintf('Order #%d - Not a Colissimo Carrier.', $order->id),
array('id' => (int) $idCarrierReference)
);
return true;
}
$deliveryAddr = new Address((int) $order->id_address_delivery);
$destinationType = ColissimoTools::getDestinationTypeByIdCountry((int) $deliveryAddr->id_country);
$serviceType = ColissimoService::getServiceTypeByIdCarrier((int) $idCarrierReference);
$colissimoOrder = new ColissimoOrder();
$colissimoOrder->id_order = (int) $order->id;
if ($serviceType == ColissimoService::TYPE_RELAIS) {
$this->logger->info(sprintf('Order #%d - Carrier type : RELAIS', $order->id));
$idColissimoPickupPoint = ColissimoCartPickupPoint::getByCartId($order->id_cart);
$colissimoPickupPoint = new ColissimoPickupPoint((int) $idColissimoPickupPoint);
$productCode = $colissimoPickupPoint->product_code;
$idColissimoService = ColissimoService::getServiceIdByProductCodeDestinationType(
$productCode,
$destinationType
);
$colissimoOrder->id_colissimo_pickup_point = (int) $idColissimoPickupPoint;
} else {
$this->logger->info(sprintf('Order #%d - Carrier type : DOMICILE', $order->id));
$idColissimoService = ColissimoService::getServiceIdByIdCarrierDestinationType(
(int) $idCarrierReference,
$destinationType
);
$colissimoOrder->id_colissimo_pickup_point = 0;
}
$colissimoOrder->id_colissimo_service = (int) $idColissimoService;
$colissimoOrder->migration = 0;
$colissimoOrder->hidden = 0;
try {
$colissimoOrder->save();
} catch (Exception $e) {
$this->logger->error(sprintf('Order #%d - Cannot save order. '.$e->getMessage(), $order->id));
return true;
}
if (Module::isEnabled('colissimopass')) {
require_once(_PS_MODULE_DIR_.'colissimopass/colissimopass.php');
if (ColissimoPassUser::isActive()) {
$this->logger->info(sprintf('Order #%d - ColissimoPass order', $order->id));
Colissimopass::sendConsignment($order);
}
}
$this->logger->info(
sprintf('Order #%d - Colissimo Order created', $order->id),
array('obj' => $colissimoOrder)
);
} else {
$this->logger->error('Not a valid order.');
}
return true;
}
/**
* @param array $params
* @throws SmartyException
*/
public function hookDisplayAdminColissimoAffranchissementListAfter($params)
{
return $this->context->smarty->display(
$this->local_path.'views/templates/hook/admin/displayAdminColissimoAffranchissementListAfter.tpl'
);
}
/**
* @param array $params
* @throws SmartyException
*/
public function hookDisplayAdminColissimoDashboardListAfter($params)
{
return $this->context->smarty->display(
$this->local_path.'views/templates/hook/admin/displayAdminColissimoDashboardListAfter.tpl'
);
}
/**
* @param array $params
* @throws PrestaShopDatabaseException
* @throws PrestaShopException
*/
public function hookActionObjectOrderAddBefore($params)
{
/** @var Order $order */
$order = $params['object'];
$this->logger->setChannel('HookOrderAddBefore');
$idCarrier = $order->id_carrier;
$carrier = new Carrier((int) $idCarrier);
$deliveryAddressOrigin = new Address((int) $order->id_address_delivery);
$serviceType = ColissimoService::getServiceTypeByIdCarrier($carrier->id_reference);
if ($serviceType == ColissimoService::TYPE_RELAIS) {
$idColissimoPickupPoint = ColissimoCartPickupPoint::getByCartId((int) $order->id_cart);
$pickupPoint = new ColissimoPickupPoint((int) $idColissimoPickupPoint);
if (Validate::isLoadedObject($pickupPoint)) {
try {
$idNewAdress = ColissimoTools::createAddressFromPickupPoint(
$pickupPoint,
$order,
$deliveryAddressOrigin->phone
);
} catch (Exception $e) {
$this->logger->error($e->getMessage());
return;
}
$order->id_address_delivery = (int) $idNewAdress;
Db::getInstance()->update(
'customization',
array('id_address_delivery' => (int) $idNewAdress),
'id_cart = '.(int) $order->id_cart
);
} else {
$this->logger->error('ColissimoPickupPoint object not valid.');
}
}
}
/**
* @param array $params
* @return bool
*/
public function hookActionObjectColissimoDepositSlipDeleteAfter($params)
{
$object = $params['object'];
return Db::getInstance()
->update(
'colissimo_label',
array('id_colissimo_deposit_slip' => 0),
'id_colissimo_deposit_slip = '.(int) $object->id
);
}
/**
* @param array $params
* @return bool|string
* @throws Exception
*/
public function hookDisplayCarrierExtraContent($params)
{
$carrier = $params['carrier'];
$serviceType = ColissimoService::getServiceTypeByIdCarrier((int) $carrier['id_reference']);
if ($serviceType == ColissimoService::TYPE_RELAIS) {
$token = $this->getWidgetToken();
if ($token !== false && $token !== null) {
$selectedPickupPoint = ColissimoCartPickupPoint::getByCartId($this->context->cart->id);
$pickupPoint = new ColissimoPickupPoint((int) $selectedPickupPoint);
/** @var Cart $cart */
$cart = $params['cart'];
$deliveryAddr = new Address((int) $cart->id_address_delivery);
if ($pickupPoint->iso_country == 'FR' &&
in_array(Country::getIsoById($deliveryAddr->id_country), array('FR', 'MC'))
) {
// About the widget, France and Monaco can be considered the same country
// For Colissimo, Monaco pickup points are located in France
} else {
if ($pickupPoint->iso_country != Country::getIsoById($deliveryAddr->id_country)) {
$pickupPoint = new ColissimoPickupPoint();
Db::getInstance()
->delete('colissimo_cart_pickup_point', 'id_cart = '.(int) $cart->id);
}
}
$font = ColissimoModuleConfiguration::$widgetFonts[(int) Configuration::get('COLISSIMO_WIDGET_FONT')];
$widgetIsoList = ColissimoPickupPoint::$availableLanguages;
$customerIso = $this->context->language->iso_code;
$widgetLang = in_array($customerIso, $widgetIsoList) ? $customerIso : 'en';
$needMobileValidation = Configuration::get('PS_ORDER_PROCESS_TYPE');
$mobilePhone = ColissimoCartPickupPoint::getMobilePhoneByCartId((int) $cart->id);
if (!$mobilePhone) {
$mobilePhone = $deliveryAddr->phone_mobile;
}
$this->context->smarty->assign(
array(
'link' => $this->context->link,
'colissimo_widget_token' => $token,
'colissimo_pickup_point' => $pickupPoint,
'delivery_addr' => array(
'address' => $deliveryAddr->address1,
'zipcode' => $deliveryAddr->postcode,
'city' => $deliveryAddr->city,
'iso_country' => Country::getIsoById($deliveryAddr->id_country),
),
'mobile_phone' => $mobilePhone,
'widget_police' => $font,
'widget_color_1' => Configuration::get('COLISSIMO_WIDGET_COLOR_1'),
'widget_color_2' => Configuration::get('COLISSIMO_WIDGET_COLOR_2'),
'preparation_time' => Configuration::get('COLISSIMO_ORDER_PREPARATION_TIME'),
'colissimo_widget_lang' => $widgetLang,
'need_mobile_validation' => (int) $needMobileValidation,
'colissimo_img_path' => $this->getPathUri().'views/img/',
)
);
return $this->display(
__FILE__,
'views/templates/hook/front/'.$this->psFolder.'/displayCarrierExtraContent.tpl'
);
}
}
return false;
}
/**
* @param array $params
* @return bool
*/
public function hookActionCarrierProcess($params)
{
$cart = $params['cart'];
$carrier = new Carrier((int) $cart->id_carrier);
$serviceType = ColissimoService::getServiceTypeByIdCarrier($carrier->id_reference);
if ($serviceType !== ColissimoService::TYPE_RELAIS) {
return true;
}
if (!Tools::getValue('id_colissimo_pickup_point')) {
$this->context->controller->errors[] =
$this->l('Please select a pickup-point or choose another shipping option.');
return false;
}
$phoneNumber = Tools::getValue('colissimo_pickup_mobile_phone');
if (!$phoneNumber || !is_array($phoneNumber) || !isset($phoneNumber['full']) || !$phoneNumber['full']) {
$this->context->controller->errors[] = $this->l('Please fill in your mobile phone number.');
return false;
}
$phoneNumberValue = $phoneNumber['full'];
if (!Tools::getValue('colissimo_is_mobile_valid')) {
$this->context->controller->errors[] = $this->l('Please fill a valid mobile phone number.');
return false;
}
try {
ColissimoCartPickupPoint::updateMobilePhoneByCartId($cart->id, $phoneNumberValue);
} catch (Exception $e) {
$this->logger->error($e->getMessage());
$this->context->controller->errors[] = $this->l('Cannot save mobile phone number.');
return false;
}
return true;
}
/**
* @param array $params
* @return bool|string
* @throws Exception
*/
public function hookExtraCarrier($params)
{
/** @var Cart $cart */
$cart = $params['cart'];
$carrier = new Carrier((int) $cart->id_carrier);
$params['carrier'] = array(
'id_reference' => $carrier->id_reference,
);
return $this->hookDisplayCarrierExtraContent($params);
}
/**
* @param array $params
*/
public function hookActionValidateStepComplete($params)
{
if ($params['step_name'] != 'delivery') {
return;
}
/** @var Cart $cart */
$cart = $params['cart'];
$carrier = new Carrier((int) $cart->id_carrier);
$serviceType = ColissimoService::getServiceTypeByIdCarrier($carrier->id_reference);
if ($serviceType !== ColissimoService::TYPE_RELAIS) {
return;
}
if (!isset($params['request_params']['id_colissimo_pickup_point']) ||
!$params['request_params']['id_colissimo_pickup_point']
) {
$params['completed'] = false;
$this->context->controller->errors[] =
$this->l('Please select a pickup-point or choose another shipping option.');
return;
}
$phoneNumberIntl = isset($params['request_params']['colissimo_pickup_mobile_phone']['full']) ?
$params['request_params']['colissimo_pickup_mobile_phone']['full'] :
false;
if (!$phoneNumberIntl) {
$params['completed'] = false;
$this->context->controller->errors[] = $this->l('Please fill in your mobile phone number.');
return;
}
$isPhoneNumberValid = isset($params['request_params']['colissimo_is_mobile_valid']) ?
$params['request_params']['colissimo_is_mobile_valid'] :
0;
if (!$isPhoneNumberValid) {
$params['completed'] = false;
$this->context->controller->errors[] = $this->l('Please fill a valid mobile phone number.');
return;
}
try {
ColissimoCartPickupPoint::updateMobilePhoneByCartId($cart->id, $phoneNumberIntl);
} catch (Exception $e) {
$this->logger->error($e->getMessage());
$params['completed'] = false;
$this->context->controller->errors[] = $this->l('Cannot save mobile phone number.');
return;
}
}
/**
* @param array $params
* @return string
* @throws SmartyException
*/
public function hookDisplayPaymentTop($params)
{
if (Configuration::get('PS_ORDER_PROCESS_TYPE') && Tools::version_compare(_PS_VERSION_, 1.7, '<')) {
/** @var Cart $cart */
$cart = $params['cart'];
$carrier = new Carrier((int) $cart->id_carrier);
if (ColissimoService::getServiceTypeByIdCarrier($carrier->id_reference) == ColissimoService::TYPE_RELAIS) {
$pickupPointId = ColissimoCartPickupPoint::getByCartId($cart->id);
$mobilePhone = ColissimoCartPickupPoint::getMobilePhoneByCartId($cart->id);
if ($pickupPointId && $mobilePhone) {
$this->context->smarty->assign('show_info', 0);
} else {
$this->context->smarty->assign('show_info', 1);
}
} else {
$this->context->smarty->assign('show_info', 0);
}
return $this->context->smarty->fetch(
$this->local_path.'views/templates/hook/front/prestashop_16/displayPaymentTop.tpl'
);
}
return '';
}
public function displayAdminOrder($params)
{
$this->setColissimoHeader();
$idOrder = $params['id_order'];
if (Tools::isSubmit('submitColissimoValidateService')) {
try {
$this->postProcessColissimoValidateService($idOrder);
} catch (Exception $e) {
$this->logger->error($e->getMessage());
$this->context->controller->errors[] = $e->getMessage();
}
}
$idColissimoOrder = ColissimoOrder::exists($idOrder);
if (!$idColissimoOrder) {
return $this->getColissimoOrderToAssignHtml($idOrder);
}
$this->assignColissimoOrderVariables((int) $idColissimoOrder, 'HookAdminOrder');
return $this->context->smarty->fetch(
sprintf(
'extends:%s|%s',
$this->local_path.'views/templates/admin/admin_order/'.$this->boTheme.'/layout-block.tpl',
$this->local_path.'views/templates/admin/admin_order/'.$this->boTheme.'/order-detail.tpl'
)
);
}
/**
* @param $params
* @return string
* @throws Exception
*/
public function hookDisplayAdminOrderMainBottom($params)
{
return $this->displayAdminOrder($params);
}
/**
* @param array $params
* @return string
* @throws Exception
*/
public function hookAdminOrder($params)
{
return Tools::version_compare(_PS_VERSION_, '1.7.7.0', '>=') ? false : $this->displayAdminOrder($params);
}
/**
* @return array
*/
public function hookModuleRoutes()
{
return array(
'module-colissimo-tracking' => array(
'controller' => 'tracking',
'rule' => 'suivicolissimo/{order_reference}/{hash}',
'keywords' => array(
'order_reference' => array('regexp' => '[A-Z0-9]{9}', 'param' => 'order_reference'),
'hash' => array('regexp' => '[a-z0-9]{32}', 'param' => 'hash'),
),
'params' => array(
'fc' => 'module',
'module' => $this->name,
),
),
'module-colissimo-return' => array(
'controller' => 'return',
'rule' => 'colissimo-retour',
'keywords' => array(),
'params' => array(
'fc' => 'module',
'module' => $this->name,
),
),
);
}
/**
* @param array $params
* @return string
* @throws Exception
*/
public function hookCustomerAccount($params)
{
if (!Configuration::get('COLISSIMO_ENABLE_RETURN') ||
!Configuration::get('COLISSIMO_DISPLAY_RETURN_LABEL_CUSTOMER')
) {
return '';
}
return $this->display(__FILE__, 'views/templates/hook/front/'.$this->psFolder.'/displayCustomerAccount.tpl');
}
/**
* @param array $params
* @throws PrestaShopDatabaseException
* @throws PrestaShopException
*/
public function hookActionAdminOrdersTrackingNumberUpdate($params)
{
/** @var Order $order */
$order = $params['order'];
/** @var Carrier $carrier */
$carrier = $params['carrier'];
$this->logger->setChannel('ManualTrackingUpdate');
$this->logger->info('Hook called.');
if (($idColissimoOrder = ColissimoOrder::exists($order->id)) != 0) {
$orderCarrier = ColissimoOrderCarrier::getByIdOrder($order->id);
if (Validate::isLoadedObject($orderCarrier) && $orderCarrier->tracking_number) {
$idCarrierReference = $carrier->id_reference;
if (!ColissimoService::getServiceTypeByIdCarrier($idCarrierReference)) {
$this->logger->info('Not a Colissimo carrier.');
return;
}
$colissimoOrder = new ColissimoOrder($idColissimoOrder);
$labelIds = $colissimoOrder->getLabelIds();
$sendPNAMail = 0;
if (!count($labelIds)) {
$this->logger->info('Label to be created.');
$colissimoLabel = new ColissimoLabel();
$colissimoLabel->id_colissimo_order = (int) $colissimoOrder->id;
$colissimoLabel->id_colissimo_deposit_slip = 0;
$colissimoLabel->label_format = 'pdf';
$colissimoLabel->return_label = 0;
$colissimoLabel->cn23 = 0;
$colissimoLabel->coliship = 1;
$colissimoLabel->migration = 0;
$colissimoLabel->insurance = null;
$colissimoLabel->file_deleted = 0;
$sendPNAMail = 1;
} elseif (count($labelIds) == 1) {
$this->logger->info('Label to be updated.');
$colissimoLabel = new ColissimoLabel((int) $labelIds[0]);
} else {
return;
}
$colissimoLabel->shipping_number = pSQL($orderCarrier->tracking_number);
try {
$colissimoLabel->save(true);
$this->logger->info(
'Label created/updated.',
array(
'id_label' => $colissimoLabel->id,
'shipping_number' => $orderCarrier->tracking_number,
)
);
} catch (Exception $e) {
$this->logger->error($e->getMessage());
return;
}
if ($sendPNAMail) {
$this->logger->info('Sending PNA mail.');
$isoLangOrder = Language::getIsoById($order->id_lang);
if (isset($this->module->PNAMailObject[$isoLangOrder])) {
$object = $this->PNAMailObject[$isoLangOrder];
} else {
$object = $this->PNAMailObject['en'];
}
$hash = md5($order->reference.$order->secure_key);
$link = $this->context->link->getModuleLink(
'colissimo',
'tracking',
array('order_reference' => $order->reference, 'hash' => $hash)
);
ColissimoTools::sendHandlingShipmentMail(
$order,
sprintf($object, $order->reference),
$link
);
}
}
}
}
/**
* @param array $params
* @return string|bool
* @throws Exception
*/
public function hookDisplayOrderDetail($params)
{
$order = $params['order'];
$colissimoOrderExists = ColissimoOrder::exists($order->id);
if (!$colissimoOrderExists) {
return false;
}
$shipments = ColissimoOrder::getShipmentsByColissimoOrderId($colissimoOrderExists, $order->id_lang);
if (empty($shipments)) {
return false;
}
$hash = md5($order->reference.$order->secure_key);
$link = $this->context->link->getModuleLink(
'colissimo',
'tracking',
array('order_reference' => $order->reference, 'hash' => $hash),
null,
$order->id_lang,
$order->id_shop
);
$data = array(
'img_path' => $this->getPathUri().'views/img/',
'pna_url' => $link,
);
$this->context->smarty->assign('data', $data);
return $this->display(__FILE__, 'views/templates/hook/front/'.$this->psFolder.'/displayOrderDetail.tpl');
}
/**
* @param array $params
* @return string
* @throws PrestaShopDatabaseException
* @throws PrestaShopException
*/
public function hookDisplayAdminProductsExtra($params)
{
$idProduct = _PS_VERSION_ < '1.7' ? (int) Tools::getValue('id_product') : (int) $params['id_product'];
$countries = Country::getCountries((int) Context::getContext()->cookie->id_lang);
$productCustomDetails = ColissimoCustomProduct::getByIdProduct((int) $idProduct);
$this->context->smarty->assign(
array(
'countries' => $countries,
'ps_version' => _PS_VERSION_,
'product_details' => $productCustomDetails,
)
);
$tpl = Tools::version_compare(_PS_VERSION_, '1.7', '<') ? '_16' : '';
return $this->display(__FILE__, 'views/templates/hook/admin/displayAdminCustomProduct'.$tpl.'.tpl');
}
/**
* @param array $params
* @throws PrestaShopDatabaseException
* @throws PrestaShopException
*/
public function hookActionProductUpdate($params)
{
$idProduct = $params['id_product'];
$hsCode = Tools::getValue('hs_code');
$shortDescription = Tools::getValue('short_desc');
$countryOrigin = Tools::getValue('country_origin');
$customProduct = ColissimoCustomProduct::getByIdProduct((int) $idProduct);
$customProduct->id_product = (int) $idProduct;
$customProduct->short_desc = $shortDescription;
$customProduct->id_country_origin = (int) $countryOrigin;
$customProduct->hs_code = $hsCode;
$customProduct->save();
}
/**
* @param array $params
* @throws PrestaShopDatabaseException
* @throws PrestaShopException
*/
public function hookActionAdminCategoriesFormModifier($params)
{
$countries = Country::getCountries((int) Context::getContext()->cookie->id_lang);
array_unshift($countries, ['id_country' => '0', 'name' => $this->l('-- Please select a country --')]);
$params['fields']['colissimo'] = array(
'form' => array(
'legend' => array(
'title' => $this->l('Customs data Colissimo'),
'icon' => 'icon-tags',
),
'input' => array(
array(
'type' => 'text',
'label' => $this->l('Short description'),
'name' => 'colissimo_short_desc',
'size' => 64,
),
array(
'type' => 'select',
'label' => $this->l('Origin country'),
'name' => 'colissimo_country_origin',
'options' => array(
'query' => $countries,
'id' => 'id_country',
'name' => 'name',
),
),
array(
'type' => 'text',
'label' => $this->l('HS Code'),
'name' => 'colissimo_hs_code',
),
),
'submit' => array(
'title' => $this->l('Save'),
),
),
);
$idCategory = (int) Tools::getValue('id_category');
$categoryCustomDetails = ColissimoCustomCategory::getByIdCategory($idCategory);
$params['fields_value']['colissimo_short_desc'] = $categoryCustomDetails->short_desc;
$params['fields_value']['colissimo_country_origin'] = $categoryCustomDetails->id_country_origin;
$params['fields_value']['colissimo_hs_code'] = $categoryCustomDetails->hs_code;
}
/**
* @param array $params
* @throws PrestaShopDatabaseException
* @throws PrestaShopException
*/
public function hookActionAdminCategoriesControllerSaveAfter($params)
{
$idCategory = (int) Tools::getValue('id_category');
$shortDescription = Tools::getValue('colissimo_short_desc');
$countryOrigin = Tools::getValue('colissimo_country_origin');
$hsCode = Tools::getValue('colissimo_hs_code');
$customCategory = ColissimoCustomCategory::getByIdCategory((int) $idCategory);
$customCategory->id_category = (int) $idCategory;
$customCategory->short_desc = $shortDescription;
$customCategory->id_country_origin = (int) $countryOrigin;
$customCategory->hs_code = $hsCode;
$customCategory->save();
}
/**
* @param array $params
* @throws \PrestaShop\PrestaShop\Core\Module\Exception\ModuleErrorException
* @throws PrestaShopDatabaseException
* @throws PrestaShopException
*/
public function hookActionAfterUpdateCategoryFormHandler($params)
{
$this->updateCategoryCustomData($params);
}
/**
* @param array $params
* @throws \PrestaShop\PrestaShop\Core\Module\Exception\ModuleErrorException
* @throws PrestaShopDatabaseException
* @throws PrestaShopException
*/
public function hookActionAfterCreateCategoryFormHandler($params)
{
$this->updateCategoryCustomData($params);
}
/**
* @param array $params
* @throws \PrestaShop\PrestaShop\Core\Module\Exception\ModuleErrorException
* @throws PrestaShopDatabaseException
* @throws PrestaShopException
*/
private function updateCategoryCustomData($params)
{
$customCategory = new ColissimoCustomCategory((int) $params['form_data']['colissimo_custom_category_id']);
$customCategory->id_category = $params['id'];
$customCategory->short_desc = $params['form_data']['colissimo_short_desc'];
$customCategory->id_country_origin = (int) $params['form_data']['colissimo_country_origin'];
$customCategory->hs_code = $params['form_data']['colissimo_hs_code'];
try {
$customCategory->save();
} catch (Exception $e) {
throw new \PrestaShop\PrestaShop\Core\Module\Exception\ModuleErrorException($e->getMessage());
}
}
/**
* @param array $params
* @throws PrestaShopDatabaseException
* @throws PrestaShopException
*/
public function hookActionCategoryFormBuilderModifier($params)
{
/** @var \Symfony\Component\Form\FormBuilderInterface $formBuilder */
$formBuilder = $params['form_builder'];
$customCategory = ColissimoCustomCategory::getByIdCategory($params['id']);
$countries = Country::getCountries($this->context->language->id);
$countryChoices = array();
array_walk(
$countries,
function (&$country) use (&$countryChoices) {
$countryChoices[$country['name']] = $country['id_country'];
}
);
$formBuilder->add(
'colissimo_short_desc',
\Symfony\Component\Form\Extension\Core\Type\TextType::class,
array('label' => $this->l('Short description'), 'required' => false)
);
$formBuilder->add(
'colissimo_country_origin',
\Symfony\Component\Form\Extension\Core\Type\ChoiceType::class,
array('label' => $this->l('Origin country'), 'choices' => $countryChoices, 'required' => false)
);
$formBuilder->add(
'colissimo_hs_code',
\Symfony\Component\Form\Extension\Core\Type\TextType::class,
array('label' => $this->l('HS Code'), 'required' => false)
);
$formBuilder->add(
'colissimo_custom_category_id',
\Symfony\Component\Form\Extension\Core\Type\HiddenType::class,
array('data' => $customCategory->id)
);
$params['data']['colissimo_short_desc'] = $customCategory->short_desc;
$params['data']['colissimo_country_origin'] = $customCategory->id_country_origin;
$params['data']['colissimo_hs_code'] = $customCategory->hs_code;
$formBuilder->setData($params['data']);
}
/**
*
*/
public function hookActionAdminControllerSetMedia()
{
if (Tools::getValue('module_name') == $this->name || Tools::getValue('configure') == $this->name) {
Media::addJsDef(array('baseAdminDir' => __PS_BASE_URI__.basename(_PS_ADMIN_DIR_).'/'));
Media::addJsDef(array('baseDir' => __PS_BASE_URI__));
$this->context->controller->addCSS($this->_path.'views/css/header.back.css');
$this->context->controller->addCSS($this->_path.'views/css/config.back.css');
$this->context->controller->addCSS($this->_path.'views/css/admin.modal.css');
$this->context->controller->addJqueryPlugin('colorpicker');
$this->context->controller->addJS($this->_path.'views/js/jquery.inputmask.bundle.js');
$this->context->controller->addJS($this->_path.'views/js/config.back.js');
}
if (in_array(Tools::getValue('controller'), $this->controllersBO)) {
Media::addJsDef(array('baseAdminDir' => __PS_BASE_URI__.basename(_PS_ADMIN_DIR_).'/'));
$this->context->controller->addCSS($this->_path.'views/css/header.back.css');
$this->context->controller->addCSS($this->_path.'views/css/admin.back.css');
$this->context->controller->addCSS($this->_path.'views/css/admin.modal.css');
$this->context->controller->addJS($this->_path.'views/js/admin.back.js');
$this->context->controller->addJS($this->_path.'views/js/print.min.js');
}
if (Tools::getValue('controller') == 'AdminOrders') {
Media::addJsDef(array('baseAdminDir' => __PS_BASE_URI__.basename(_PS_ADMIN_DIR_).'/'));
$this->context->controller->addCSS($this->_path.'views/css/admin.back.css');
$this->context->controller->addCSS($this->_path.'views/css/admin.order.css');
$this->context->controller->addCSS($this->_path.'views/css/header.back.css');
$this->context->controller->addCSS($this->_path.'views/css/admin.modal.css');
$this->context->controller->addJS($this->_path.'views/js/admin.back.js');
$this->context->controller->addJS($this->_path.'views/js/jquery.plugin.colissimo.js');
$this->context->controller->addJS($this->_path.'views/js/print.min.js');
$this->context->controller->addCSS($this->_path.'views/css/bootstrap.colissimo.min.css');
$this->context->controller->addCSS($this->_path.'views/css/colissimo.widget.css');
$this->context->controller->addCSS($this->_path.'views/css/mapbox.css');
}
}
/**
*
*/
public function hookHeader()
{
if ($this->context->controller->php_self == 'order' || $this->context->controller->php_self == 'order-opc') {
$this->context->controller->addCSS($this->_path.'views/css/colissimo.front.css');
$this->context->controller->addCSS($this->_path.'views/css/colissimo.modal.css');
$this->context->controller->addCSS($this->_path.'views/css/intlTelInput.css');
if (!Configuration::get('COLISSIMO_WIDGET_REMOTE')) {
$this->context->controller->addCSS($this->_path.'views/css/bootstrap.colissimo.min.css');
$this->context->controller->addCSS($this->_path.'views/css/colissimo.widget.css');
$this->context->controller->addCSS($this->_path.'views/css/mapbox.css');
}
$pluginPath = Media::getJqueryPluginPath('autocomplete', null);
if (version_compare(_PS_VERSION_, '1.7', '>=')) {
if (!empty($pluginPath['js'])) {
$this->context->controller->unregisterJavascript(
str_replace(_PS_JS_DIR_.'jquery/plugins/', '', $pluginPath['js'])
);
}
$this->context->controller->addJqueryUI('ui.autocomplete');
} else {
$jsFiles = $this->context->controller->js_files;
$hasAutocomplete = array_search('/js/jquery/plugins/autocomplete/jquery.autocomplete.js', $jsFiles);
if (!$hasAutocomplete) {
$this->context->controller->removeJS(
str_replace(_PS_JS_DIR_.'jquery/plugins/', '', $pluginPath['js'])
);
$this->context->controller->addJqueryUI('ui.autocomplete');
}
}
$this->registerJs(
'colissimo-intltelinput',
'intlTelInput.min.js',
array('position' => 'bottom', 'priority' => 150)
);
if (!Configuration::get('COLISSIMO_WIDGET_REMOTE')) {
$this->registerJs(
'colissimo-bootstrap',
'bootstrap.min.js',
array('position' => 'bottom', 'priority' => 150)
);
}
$this->registerJs(
'colissimo-module-front-widget',
'widget.js',
array('position' => 'bottom', 'priority' => 150)
);
if (!Configuration::get('COLISSIMO_WIDGET_REMOTE')) {
$this->registerJs(
'colissimo-plugin-widget',
'jquery.plugin.colissimo.js',
array('position' => 'bottom', 'priority' => 150)
);
} else {
$this->registerExternalJs(
'colissimo-front-widget',
'https://ws.colissimo.fr/widget-point-retrait/resources/js/jquery.plugin.colissimo.min.js',
array('server' => 'remote')
);
}
$this->registerJS(
'colissimo-js-custom',
'colissimo.custom.js',
array('position' => 'bottom', 'priority' => 250)
);
$this->registerCSS(
'colissimo-css-custom',
'colissimo.custom.css',
array('position' => 'bottom', 'priority' => 250)
);
}
if ($this->context->controller->php_self == 'history' ||
$this->context->controller->php_self == 'order-detail'
) {
$this->context->controller->addCSS($this->_path.'views/css/colissimo.front.css');
}
}
/**
* @param array $params
* @return array
*/
public function hookAddWebserviceResources($params)
{
return array(
'colissimo_custom_products' => array(
'class' => 'ColissimoCustomProduct',
'forbidden_method' => array('HEAD', 'POST', 'PUT', 'DELETE'),
),
'colissimo_custom_categories' => array(
'class' => 'ColissimoCustomCategory',
'forbidden_method' => array('HEAD', 'POST', 'PUT', 'DELETE'),
),
'colissimo_ace' => array(
'class' => 'ColissimoACE',
'forbidden_method' => array('GET', 'HEAD', 'PUT', 'DELETE'),
),
);
}
}