Files

434 lines
15 KiB
PHP

<?php
/**
* 2007-2020 PrestaShop
*
* NOTICE OF LICENSE
*
* This source file is subject to the Academic Free License (AFL 3.0)
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://opensource.org/licenses/afl-3.0.php
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@prestashop.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to http://www.prestashop.com for more information.
*
* @author PrestaShop SA <contact@prestashop.com>
* @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 ColissimoTrackingModuleFrontController
*
* Ajax processes:
* - showTracking
*
*/
class ColissimoTrackingModuleFrontController extends ModuleFrontController
{
/** @var Colissimo $module */
public $module;
/** @var Order $order */
public $order;
/** @var ColissimoOrder $colissimoOrder */
public $colissimoOrder;
/** @var array $languages */
public $languages = array(
'fr' => 'fr_FR',
'de' => 'de_DE',
'en' => 'en_GB',
'es' => 'es-ES',
'it' => 'it_IT',
'nl' => 'nl_NL',
);
/** @var array $days */
public $days = array(
1 => array(
'fr' => 'lundi',
'en' => 'monday,',
'de' => 'Montag,',
'nl' => 'maandag',
'it' => 'lunedi',
'es' => 'lunes,',
),
2 => array(
'fr' => 'mardi',
'en' => 'tuesday,',
'de' => 'Dienstag,',
'nl' => 'dinsdag',
'it' => 'martedì',
'es' => 'martes,',
),
3 => array(
'fr' => 'mercredi',
'en' => 'wednesday,',
'de' => 'Mittwoch,',
'nl' => 'woensdag',
'it' => 'mercoledì',
'es' => 'miércoles,',
),
4 => array(
'fr' => 'jeudi',
'en' => 'thursday,',
'de' => 'Donnerstag,',
'nl' => 'donderdag',
'it' => 'giovedi',
'es' => 'jueves,',
),
5 => array(
'fr' => 'vendredi',
'en' => 'friday,',
'de' => 'Freitag,',
'nl' => 'vrijdag',
'it' => 'venerdì',
'es' => 'viernes,',
),
6 => array(
'fr' => 'samedi',
'en' => 'saturday,',
'de' => 'Samstag,',
'nl' => 'zaterdag',
'it' => 'sabato',
'es' => 'sábado,',
),
7 => array(
'fr' => 'dimanche',
'en' => 'sunday,',
'de' => 'Sonntag,',
'nl' => 'zondag',
'it' => 'domenica',
'es' => 'domingo,',
),
);
/** @var array $months */
public $months = array(
1 => array(
'fr' => 'janvier',
'en' => 'january',
'de' => 'januar',
'nl' => 'januari',
'it' => 'gennaio',
'es' => 'de enero',
),
2 => array(
'fr' => 'février',
'en' => 'february',
'de' => 'februar',
'nl' => 'februari',
'it' => 'febbraio',
'es' => 'de febrero',
),
3 => array(
'fr' => 'mars',
'en' => 'march',
'de' => 'märz',
'nl' => 'maart',
'it' => 'marzo',
'es' => 'de marzo',
),
4 => array(
'fr' => 'avril',
'en' => 'april',
'de' => 'april',
'nl' => 'april',
'it' => 'aprile',
'es' => 'de abril',
),
5 => array('fr' => 'mai', 'en' => 'may', 'de' => 'mai', 'nl' => 'mei', 'it' => 'maggio', 'es' => 'de mayo'),
6 => array(
'fr' => 'juin',
'en' => 'june',
'de' => 'juni',
'nl' => 'juni',
'it' => 'giugno',
'es' => 'de junio',
),
7 => array(
'fr' => 'juillet',
'en' => 'july',
'de' => 'juli',
'nl' => 'juli',
'it' => 'luglio',
'es' => 'de julio',
),
8 => array(
'fr' => 'août',
'en' => 'august',
'de' => 'august',
'nl' => 'augustus',
'it' => 'agosto',
'es' => 'de agosto',
),
9 => array(
'fr' => 'septembre',
'en' => 'september',
'de' => 'september',
'nl' => 'september',
'it' => 'settembre',
'es' => 'de septiembre',
),
10 => array(
'fr' => 'octobre',
'en' => 'october',
'de' => 'oktober',
'nl' => 'oktober',
'it' => 'ottobre',
'es' => 'de octubre',
),
11 => array(
'fr' => 'novembre',
'en' => 'november',
'de' => 'november',
'nl' => 'november',
'it' => 'novembre',
'es' => 'de noviembre',
),
12 => array(
'fr' => 'décembre',
'en' => 'december',
'de' => 'dezember',
'nl' => 'december',
'it' => 'dicembre',
'es' => 'de diciembre',
),
);
/**
* @return array
*/
public function getTemplateVarPage()
{
$page = parent::getTemplateVarPage();
$page['meta']['robots'] = 'noindex';
$page['meta']['title'] = $this->module->l('Colissimo shipment tracking #').$this->order->reference;
return $page;
}
/**
* @return bool
* @throws PrestaShopDatabaseException
* @throws PrestaShopException
*/
public function checkAccess()
{
$reference = Tools::getValue('order_reference');
$hash = Tools::getValue('hash');
/** @var PrestaShopCollection $orders */
$orders = Order::getByReference($reference);
if (!$orders->count()) {
$this->redirect_after = $this->context->link->getPageLink('my-account');
$this->redirect();
}
/** @var Order $order */
$order = $orders->getFirst();
if (md5($reference.$order->secure_key) !== $hash) {
$this->redirect_after = $this->context->link->getPageLink('my-account');
$this->redirect();
}
$idColissimoOrder = ColissimoOrder::exists($order->id);
if (!$idColissimoOrder) {
$this->redirect_after = $this->context->link->getPageLink('my-account');
$this->redirect();
}
$this->order = $order;
$this->colissimoOrder = new ColissimoOrder((int) $idColissimoOrder);
return parent::checkAccess();
}
/**
* @return bool|void
*/
public function setMedia()
{
parent::setMedia();
$this->module->registerJs(
'colissimo-module-front-tracking',
'front.tracking.js',
array('position' => 'bottom', 'priority' => 150)
);
$this->module->registerCSS('module-colissimo-sprites-flag', 'flag.sprites.css');
$this->module->registerCSS('module-colissimo-front', 'colissimo.front.css');
}
/**
* @param string $template
* @param array $params
* @param null $locale
* @throws PrestaShopException
*/
public function setTemplate($template, $params = array(), $locale = null)
{
if (Tools::version_compare(_PS_VERSION_, '1.7', '<')) {
parent::setTemplate($template, $params, $locale);
} else {
parent::setTemplate('module:colissimo/views/templates/front/'.$template, $params, $locale);
}
}
/**
* @throws PrestaShopException
*/
public function initContent()
{
parent::initContent();
$hash = md5($this->order->reference.$this->order->secure_key);
$labels = $this->colissimoOrder->getShipments($this->context->language->id);
$this->context->smarty->assign(array(
'colissimo_img_path' => $this->module->getPathUri().'views/img/',
'order_reference' => $this->order->reference,
'order_hash' => $hash,
'no_labels' => (!$labels || empty($labels)) ? 1 : 0,
'noindex' => true,
'nofollow' => true,
));
$this->setTemplate($this->module->psFolder.'/tracking.tpl');
}
/**
* @throws Exception
* @throws PrestaShopDatabaseException
* @throws PrestaShopException
* @throws SmartyException
*/
public function displayAjaxShowTracking()
{
$language = new Language((int) $this->context->language->id);
$iso = $language->iso_code;
$locale = isset($this->languages[$iso]) ? $this->languages[$iso] : $this->languages['en'];
$html = array();
$labels = $this->colissimoOrder->getShipments($language->id);
$order = new Order((int) $this->colissimoOrder->id_order);
$this->module->logger->setChannel('Timeline');
$this->module->logger->info(
'Start tracking for order '.$this->order->id.' ('.$this->order->reference.')'
);
foreach ($labels as $label) {
$trackingRequest = new ColissimoTrackingTimelineRequest(ColissimoTools::getCredentials($order->id_shop));
$trackingRequest->setParcelNumber($label['shipping_number'])
->setLang(str_replace('-', '_', $locale))
->setIp($_SERVER['REMOTE_ADDR'])
->buildRequest();
$this->module->logger->info(
'Request',
array('json' => json_decode($trackingRequest->getRequest(true), true))
);
$client = new ColissimoClient();
$client->setRequest($trackingRequest);
try {
/** @var ColissimoTrackingTimelineResponse $trackingResponse */
$trackingResponse = $client->request();
} catch (Exception $e) {
$this->module->logger->error('Exception thrown: '.$e->getMessage());
continue;
}
if ($trackingResponse->status[0]['code']) {
$this->module->logger->error('Error found', $trackingResponse->status[0]['message']);
continue;
}
if ($trackingResponse->parcelDetails['statusDelivery']) {
$this->module->updateTrackingByTypology(
ColissimoTrackingCode::TYPO_DELIVERED,
$this->order,
$label['id_label']
);
} elseif (is_array($trackingResponse->events) && count($trackingResponse->events) > 1) {
$this->module->updateTrackingByTypology(
ColissimoTrackingCode::TYPO_SHIPPED,
$this->order,
$label['id_label']
);
}
foreach ($trackingResponse->events as &$event) {
if ($event['date'] !== null) {
try {
$dateTime = new DateTime($event['date']);
} catch (Exception $e) {
$event['dateDisplay'] = '';
$event['dateDisplayShort'] = '';
continue;
}
$day = $this->days[$dateTime->format('N')];
$day = isset($day[$iso]) ? $day[$iso] : $day['en'];
$month = $this->months[$dateTime->format('n')];
$month = isset($month[$iso]) ? $month[$iso] : $month['en'];
$event['dateDisplay'] = $day.' '.$dateTime->format('j').' '.$month;
$event['dateDisplayShort'] = Tools::displayDate($dateTime->format('Y-m-d H:i:s'));
} else {
$event['dateDisplay'] = '';
$event['dateDisplayShort'] = '';
}
}
foreach ($trackingResponse->timeline as $key => &$step) {
if ($step['date'] !== null) {
try {
$dateTime = new DateTime($step['date']);
} catch (Exception $e) {
$step['dateDisplay'] = '';
$step['dateDisplayShort'] = '';
continue;
}
$day = $this->days[$dateTime->format('N')];
$day = isset($day[$iso]) ? $day[$iso] : $day['en'];
$month = $this->months[$dateTime->format('n')];
$month = isset($month[$iso]) ? $month[$iso] : $month['en'];
$step['dateDisplay'] = $day.' '.$dateTime->format('j').' '.$month;
$step['dateDisplayShort'] = Tools::displayDate($dateTime->format('Y-m-d H:i:s'));
} else {
$step['dateDisplay'] = '';
$step['dateDisplayShort'] = '';
}
if ($step['countryCodeISO']) {
$idCountry = Country::getByIso($step['countryCodeISO']);
$idLang = $this->context->language->id;
$step['countryName'] = $idCountry ? Country::getNameById($idLang, $idCountry) : '';
} else {
$step['countryName'] = '';
}
if ($step['status'] == 'STEP_STATUS_INACTIVE') {
$step['statusClass'] = 'inactive';
} elseif ($step['status'] == 'STEP_STATUS_ACTIVE') {
if (!isset($trackingResponse->timeline[$key + 1])) {
$trackingResponse->parcelDetails['currentStep'] = $step;
$step['statusClass'] = 'active current';
} else {
if ($trackingResponse->timeline[$key + 1]['status'] == 'STEP_STATUS_ACTIVE') {
$step['statusClass'] = 'active';
} else {
$step['statusClass'] = 'active current';
$trackingResponse->parcelDetails['currentStep'] = $step;
}
}
}
}
$shipment = array(
'messages' => $trackingResponse->messages,
'user_messages' => $trackingResponse->userMessages,
'steps_timeline' => $trackingResponse->timeline,
'steps_details' => $trackingResponse->events,
'parcel_details' => $trackingResponse->parcelDetails,
);
$this->context->smarty->assign(array('shipment' => $shipment));
$tpl = $this->module->getTemplatePath($this->module->psFolder.'/_partials/colissimo-shipments.tpl');
$html[] = $this->context->smarty->fetch($tpl);
}
$this->ajaxDie(json_encode(array('error' => count($html) ? 0 : 1, 'html_result' => implode('<hr>', $html))));
}
}