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

965 lines
42 KiB
PHP

<?php
/**
* Module made by Nukium
*
* @author Nukium
* @copyright 2018 Nukium SAS
* @license All rights reserved
*
* ███ ██ ██ ██ ██ ██ ██ ██ ██ ███ ███
* ████ ██ ██ ██ ██ ██ ██ ██ ██ ████ ████
* ██ ██ ██ ██ ██ █████ ██ ██ ██ ██ ████ ██
* ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██
* ██ ████ ██████ ██ ██ ██ ██████ ██ ██
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
if (!class_exists('NkmCsv')) {
require_once(dirname(__FILE__).'/../../lib/NkmCsv.php');
}
include dirname(__FILE__).'/../../lib/NkmHelper.php';
if (!class_exists('GlsLogClass')) {
require_once dirname(__FILE__).'/../../classes/GlsLogClass.php';
}
class AdminGlsOrderController extends ModuleAdminController
{
private static $tab_lang = array('fr' => 'GLS');
public $order_state = array();
public $importDirectory = null;
public $exportDirectory = null;
public $fromCron = false;
public function __construct($fromCron = false)
{
$this->bootstrap = true;
$this->display = 'view';
// TODO: optimize if possible
if ($fromCron) {
$this->module = new NkmGls();
$this->context = Context::getContext();
$this->fromCron = true;
} else {
parent::__construct();
}
$this->name = 'GlsOrder';
$this->order_state = OrderState::getOrderStates($this->context->language->id);
$this->importDirectory = 'import'.DIRECTORY_SEPARATOR.'winexpe';
$this->exportDirectory = 'export';
}
/**
* Add an entry in the tab menu
* @param Object $module
*/
public static function installInBO()
{
$tab = new Tab();
$tab->active = 1;
$tab->class_name = "AdminGlsOrder";
$tab->name = array();
foreach (Language::getLanguages(true) as $lang) {
if (isset(self::$tab_lang[$lang['iso_code']])) {
$tab->name[(int)$lang['id_lang']] = self::$tab_lang[$lang['iso_code']];
} else {
$tab->name[(int)$lang['id_lang']] = 'GLS';
}
}
$tab->id_parent = (int)Tab::getIdFromClassName('AdminParentOrders');
$tab->module = 'nkmgls';
return $tab->add();
}
/**
* Remove an entry in the tab menu
* @param Object $module
*/
public static function removeFromBO()
{
$id_tab = (int)Tab::getIdFromClassName('AdminGlsOrder');
if ($id_tab) {
$tab = new Tab($id_tab);
if (validate::isLoadedObject($tab)) {
return $tab->delete();
}
}
return false;
}
public function renderView()
{
$statuses = array();
foreach ($this->order_state as $value) {
$statuses[] = array('id_option'=>$value['id_order_state'], 'name'=>$value['name'], 'val'=>$value['id_order_state']);
}
$new_statuses = $statuses;
array_unshift($new_statuses, array('id_option'=>'0', 'name'=>$this->l('(No change)'), 'val'=>''));
if ((bool)Tools::isSubmit('exportOrder') === true && Tools::getValue('exportOrderStep2')) {
// Step 2: Order list
return $this->initFormExportWinexpeStep2();
}
return $this->initFormExportWinexpe($statuses, $new_statuses).$this->initFormImportWinexpe($new_statuses);
}
public function initToolbarTitle()
{
$this->toolbar_title = $this->l('Export & import of GLS orders');
}
public function initFormExportWinexpe($statuses, $new_statuses)
{
$this->fields_value = $this->getConfigFormValues('export');
$tpl = $this->createTemplate('cron_help.tpl');
$tpl->assign(array(
'cron_uri' => $this->context->shop->getBaseURL().'modules/'.$this->module->name.'/cron.php?secure_key='.Configuration::get('GLS_SECURE_KEY').'&action=export',
'cron_path' => _PS_MODULE_DIR_.$this->module->name.DIRECTORY_SEPARATOR.$this->exportDirectory.DIRECTORY_SEPARATOR,
'title' => sprintf($this->l('You can set a cron job that will %s using the following URL:'), $this->l('export orders')),
'btn_title' => sprintf($this->l('Run the automatic %s now'), $this->l('export')),
'title_path' => $this->l('Here is the path to the export folder:'),
));
$this->fields_form = array(
'legend' => array(
'title' => $this->l('Export Orders'),
'icon' => 'icon-upload'
),
'description' => Tools::nl2br(
$this->l('Export your GLS orders by choosing one or more order statuses and click on the export button.').
"\n".$this->l('The file can be directly integrated on the software Winexpe by GLS.').
"\n".$this->l('It\'s possibe to change automatically the order status after exportation.')
),
'input' => array(
array(
'type' => 'checkbox',
'label' => $this->l('Order statuses'),
'name' => 'GLS_EXPORT_ORDER_STATE',
'multiple' => true,
'required' => true,
'values' => array(
'query' => $statuses,
'id' => 'id_option',
'name' => 'name'
),
),
array(
'type' => 'select',
'label' => $this->l('Change order status to'),
'name' => 'GLS_EXPORT_NEW_ORDER_STATE',
'require' => false,
'options' => array(
'query' => $new_statuses,
'id' => 'id_option',
'name' => 'name'
)
),
array(
'type' => 'switch',
'label' => $this->l('Enable automation'),
'name' => 'GLS_EXPORT_AUTOMATION',
'is_bool' => true,
'values' => array(
array(
'id' => 'active_on',
'value' => 1,
'label' => $this->l('Yes')
),
array(
'id' => 'active_off',
'value' => 0,
'label' => $this->l('No')
)
),
'lang' => false,
'hint' => $this->l('The automation allows the integration of your GLS orders directly into the Winexpe software.'),
),
),
'desc' => $tpl->fetch(),
'buttons' => array(
0 => array(
'type' => 'submit',
'title' => $this->l('Check & Export'),
'id' => 'exportOrderStep2',
'name' => 'exportOrderStep2',
'class' => 'pull-right',
'icon' => 'process-icon-next',
'js' => '$(this).val(\'1\')',
),
1 => array(
'type' => 'submit',
'title' => $this->l('Export now'),
'id' => 'exportOrder',
'name' => 'exportOrder',
'class' => 'btn btn-default pull-right',
'icon' => 'process-icon-upload',
),
2 => array(
'type' => 'submit',
'title' => $this->l('Save'),
'id' => 'saveExportOrder',
'name' => 'saveExportOrder',
'class' => 'pull-right',
'icon' => 'process-icon-save',
'js' => '$(this).val(\'1\')',
),
),
);
$this->submit_action = 'exportOrder';
$this->show_toolbar = false;
$this->show_form_cancel_button = false;
return parent::renderForm();
}
public function ajaxProcessExportWinexpeStep2()
{
$return = $this->initFormExportWinexpeStep2();
if (empty($this->errors)) {
die(json_encode($return));
} else {
return false;
}
}
/**
* Export Step 2 - list selected orders
*/
public function initFormExportWinexpeStep2()
{
$export_order_state = array();
if (Configuration::get('GLS_EXPORT_ORDER_STATE')) {
$export_order_state = explode(',', Configuration::get('GLS_EXPORT_ORDER_STATE'));
}
if (is_array($export_order_state) && count($export_order_state) > 0) {
foreach ($this->order_state as $status) {
$this->statuses_array[$status['id_order_state']] = $status['name'];
}
$sql = new DbQuery();
$sql->select('o.*, o.`id_order` AS `id`, CONCAT(LEFT(c.`firstname`, 1), \'. \', c.`lastname`) AS `customer`, osl.`name` AS `osname`, os.`color`, oc.`weight` as `order_weight`')
->from('orders', 'o')
->leftJoin('gls_cart_carrier', 'gls', 'gls.`id_cart` = o.`id_cart` AND gls.`id_customer` = o.`id_customer`')
->leftJoin('customer', 'c', 'c.`id_customer` = o.`id_customer`')
->leftJoin('order_carrier', 'oc', 'o.`id_order` = oc.`id_order`')
->leftJoin('carrier', 'ca', 'o.`id_carrier` = ca.`id_carrier`')
->leftJoin('order_state', 'os', 'os.`id_order_state` = o.`current_state`')
->leftJoin('order_state_lang', 'osl', 'os.`id_order_state` = osl.`id_order_state` AND osl.`id_lang` = '.(int)$this->context->language->id)
->where('ca.id_carrier IS NOT NULL')
->where('ca.`external_module_name` = \'nkmgls\'')
->where('o.current_state IN ('.Configuration::get('GLS_EXPORT_ORDER_STATE').')')
->orderBy('o.id_order ASC');
if (Shop::isFeatureActive() && Shop::getContextShopID()) {
$sql->where('o.id_shop = '.Shop::getContextShopID());
}
$data_order = Db::getInstance()->ExecuteS($sql);
$this->fields_list = array(
'id_order' => array(
'title' => $this->trans('ID', array(), 'Admin.Global'),
'align' => 'text-center',
'class' => 'fixed-width-xs',
),
'reference' => array(
'title' => $this->trans('Reference', array(), 'Admin.Global')
),
'customer' => array(
'title' => $this->trans('Customer', array(), 'Admin.Global'),
'havingFilter' => true,
),
'total_paid_tax_incl' => array(
'title' => $this->trans('Total', array(), 'Admin.Global'),
'align' => 'text-right',
'type' => 'price',
'currency' => true,
'badge_success' => true
),
'payment' => array(
'title' => $this->trans('Payment', array(), 'Admin.Global')
),
'osname' => array(
'title' => $this->trans('Status', array(), 'Admin.Global'),
'type' => 'select',
'color' => 'color',
'list' => $this->statuses_array,
'filter_key' => 'os!id_order_state',
'filter_type' => 'int',
'order_key' => 'osname'
),
'date_add' => array(
'title' => $this->trans('Date', array(), 'Admin.Global'),
'align' => 'text-right',
'type' => 'datetime',
'filter_key' => 'a!date_add'
),
'order_weight' => array(
'title' => $this->trans('Weight', array(), 'Admin.Global') . ' (kg)',
'type' => 'editable',
'filter_key' => 'oc!weight',
'filter_type' => 'float',
'order_key' => 'order_weight',
),
);
$helper = new HelperList();
$helper->module = $this->module;
$helper->identifier = 'id_order';
$helper->shopLinkType = '';
$helper->simple_header = true;
$helper->show_toolbar = true;
$helper->bulk_actions = true;
$helper->force_show_bulk_actions = true;
$helper->no_link = true;
$helper->title = $this->l('GLS orders to export');
$helper->table = 'order';
$helper->token = Tools::getAdminTokenLite('Admin'.$this->name);
$helper->currentIndex = $this->context->link->getAdminLink('Admin'.$this->name);
return $helper->generateList($data_order, $this->fields_list);
} else {
$this->errors[] = $this->l('Please select one or more order status.');
}
}
public function initFormImportWinexpe($new_statuses)
{
$this->fields_value = $this->getConfigFormValues('import');
$tpl = $this->createTemplate('cron_help.tpl');
$tpl->assign(array(
'cron_uri' => $this->context->shop->getBaseURL().'modules/'.$this->module->name.'/cron.php?secure_key='.Configuration::get('GLS_SECURE_KEY').'&action=import',
'cron_path' => _PS_MODULE_DIR_.$this->module->name.DIRECTORY_SEPARATOR.$this->importDirectory.DIRECTORY_SEPARATOR,
'title' => sprintf($this->l('You can set a cron job that will %s using the following URL:'), $this->l('import tracking numbers')),
'btn_title' => sprintf($this->l('Run the automatic %s now'), $this->l('import')),
'title_path' => $this->l('Here is the path to the import folder:'),
));
$this->fields_form = array(
'legend' => array(
'title' => $this->l('Import tracking numbers'),
'icon' => 'icon-download'
),
'description' => $this->l('Import the CSV file provided by the Winexpe software to update the tracking numbers and keep your customers informed about their order\'s delivery.'),
'input' => array(
array(
'type' => 'file',
'label' => $this->l('GLS File'),
'name' => 'winexpeFile',
'required' => true
),
array(
'type' => 'select',
'label' => $this->l('Change order status to'),
'name' => 'GLS_IMPORT_NEW_ORDER_STATE',
'require' => false,
'options' => array(
'query' => $new_statuses,
'id' => 'id_option',
'name' => 'name'
)
),
array(
'type' => 'switch',
'label' => $this->l('Enable automation'),
'name' => 'GLS_IMPORT_AUTOMATION',
'is_bool' => true,
'values' => array(
array(
'id' => 'active_on',
'value' => 1,
'label' => $this->l('Yes')
),
array(
'id' => 'active_off',
'value' => 0,
'label' => $this->l('No')
)
),
'lang' => false,
'hint' => $this->l('The automation allows the integration of tracking numbers in your GLS orders and automatically notify customers.'),
),
),
'desc' => $tpl->fetch(),
'buttons' => array(0 => array(
'type' => 'submit',
'title' => $this->l('Save'),
'id' => 'saveImportOrder',
'name' => 'saveImportOrder',
'class' => 'pull-right',
'icon' => 'process-icon-save',
'js' => '$(this).val(\'1\')',
)),
'submit' => array(
'title' => $this->l('Import now'),
'id' => 'importOrder',
'class' => 'btn btn-default pull-right',
'icon' => 'process-icon-download',
),
);
$this->submit_action = 'importOrder';
$this->show_toolbar = false;
$this->show_form_cancel_button = false;
return parent::renderForm();
}
public function postProcess()
{
if ((bool)Tools::isSubmit('exportOrder') === true) {
// Save configuration
$form_values = $this->getConfigFormValues('export');
foreach ($form_values as $key => $value) {
if (strpos($key, 'GLS_EXPORT_ORDER_STATE') === false) {
Configuration::updateValue($key, trim($value));
}
}
$order_state_selected = array();
foreach ($this->order_state as $value) {
if (Tools::getValue('GLS_EXPORT_ORDER_STATE_'.$value['id_order_state'])) {
$order_state_selected[] = $value['id_order_state'];
}
}
Configuration::updateValue('GLS_EXPORT_ORDER_STATE', implode(',', array_map('intval', $order_state_selected)));
if (!Tools::getValue('ajax')) {
if (!Tools::getValue('saveExportOrder') && !Tools::getValue('exportOrderStep2')) {
// Direct export
$this->exportWinexpe();
} else {
$this->confirmations[] = $this->l('Configuration successfully updated');
}
}
} elseif ((bool)Tools::isSubmit('exportOrderSelected')) {
// Export de la selection (Step 2)
if (Tools::getValue('orderBox') && is_array(Tools::getValue('orderBox')) && count(Tools::getValue('orderBox')) > 0) {
// Direct export
$this->exportWinexpe(Tools::getValue('orderBox'));
} else {
$this->errors[] = $this->l('Please select at least one order.');
}
} elseif ((bool)Tools::isSubmit('importOrder') === true) {
// Save configuration
$form_values = $this->getConfigFormValues('import');
foreach ($form_values as $key => $value) {
Configuration::updateValue($key, trim($value));
}
// Direct import
if (!Tools::getValue('saveImportOrder')) {
$this->importWinexpe();
} else {
$this->confirmations[] = $this->l('Configuration successfully updated');
}
}
return parent::postProcess();
}
/**
* Retourne les données de configuration de l'import ou de l'export suivant le type défini
* @param string $type import ou export
*/
public function getConfigFormValues($type)
{
if ($type == 'import') {
return array(
'GLS_IMPORT_NEW_ORDER_STATE' => Tools::getValue('GLS_IMPORT_NEW_ORDER_STATE', Configuration::get('GLS_IMPORT_NEW_ORDER_STATE')),
'GLS_IMPORT_AUTOMATION' => Tools::getValue('GLS_IMPORT_AUTOMATION', Configuration::get('GLS_IMPORT_AUTOMATION')),
);
} elseif ($type == 'export') {
$fieds = array(
'GLS_EXPORT_NEW_ORDER_STATE' => Tools::getValue('GLS_EXPORT_NEW_ORDER_STATE', Configuration::get('GLS_EXPORT_NEW_ORDER_STATE')),
'GLS_EXPORT_AUTOMATION' => Tools::getValue('GLS_EXPORT_AUTOMATION', Configuration::get('GLS_EXPORT_AUTOMATION')),
);
foreach ($this->order_state as $value) {
if (in_array($value['id_order_state'], explode(',', Configuration::get('GLS_EXPORT_ORDER_STATE')))) {
$fieds['GLS_EXPORT_ORDER_STATE_'.$value['id_order_state']] = true;
} else {
$fieds['GLS_EXPORT_ORDER_STATE_'.$value['id_order_state']] = false;
}
}
return $fieds;
}
}
/**
* Exportation des commandes GLS pour WINEXPE
*/
public function exportWinexpe($_orders = array())
{
$export_order_state = array();
if (Configuration::get('GLS_EXPORT_ORDER_STATE')) {
$export_order_state = explode(',', Configuration::get('GLS_EXPORT_ORDER_STATE'));
}
if ((is_array($export_order_state) && count($export_order_state) > 0) || count($_orders) > 0) {
// récupération des commandes dans le(s) statu(s) $_POST['id_order_state']
$sql = new DbQuery();
$sql->select('o.*, gls.gls_product, gls.parcel_shop_id, gls.customer_phone_mobile, oc.`weight` as `order_weight`, c.`email` as `customer_email`')
->from('orders', 'o')
->leftJoin('gls_cart_carrier', 'gls', 'gls.`id_cart` = o.`id_cart` AND gls.`id_customer` = o.`id_customer`')
->leftJoin('customer', 'c', 'c.`id_customer` = o.`id_customer`')
->leftJoin('order_carrier', 'oc', 'o.`id_order` = oc.`id_order`')
->leftJoin('carrier', 'ca', 'o.`id_carrier` = ca.`id_carrier`')
->where('ca.id_carrier IS NOT NULL')
->where('ca.`external_module_name` = \'nkmgls\'');
if (Shop::isFeatureActive() && Shop::getContextShopID()) {
$sql->where('o.id_shop = '.Shop::getContextShopID());
}
if (is_array($_orders) && count($_orders) > 0) {
$sql->where('o.`id_order` IN ('.implode(',', array_map('intval', $_orders)).')');
} else {
$sql->where('o.current_state IN ('.pSQL(Configuration::get('GLS_EXPORT_ORDER_STATE')).')');
}
$data_order = Db::getInstance()->ExecuteS($sql);
if ($data_order) {
$export_header = array(
'ORDERID' => 'ORDERID',
'ORDERNAME' => 'ORDERNAME',
'PRODUCTNO' => 'PRODUCTNO',
'ORDERWEIGHTOT' => 'ORDERWEIGHTOT',
'CONSID' => 'CONSID',
'CONTACT' => 'CONTACT',
'CONTACTMAIL' => 'CONTACTMAIL',
'CONTACTMOBILE' => 'CONTACTMOBILE',
'CONTACTPHONE' => 'CONTACTPHONE',
'STREET1' => 'STREET1',
'STREET2' => 'STREET2',
'STREET3' => 'STREET3',
'COUNTRYCODE' => 'COUNTRYCODE',
'CITY' => 'CITY',
'ZIPCODE' => 'ZIPCODE',
'REFPR' => 'REFPR');
$csv_file = new NkmCsv();
$csv_file->createTemplate($export_header);
$csv_file->csvDelimeter = ';';
foreach ($data_order as $row) {
if (Shop::isFeatureActive()) {
Shop::setContext(Shop::CONTEXT_SHOP, $row['id_shop']);
$this->context->shop->id_shop_group = Shop::getContextShopGroupID();
$this->context->shop->id = $row['id_shop'];
}
$customer_delivery_address = new Address($row['id_address_delivery']);
if (!empty($row['parcel_shop_id']) && $row['gls_product'] == '17') {
$customer_address = new Address($row['id_address_invoice']);
} else {
$customer_address = $customer_delivery_address;
}
$customer_country_iso = Country::getIsoById($customer_address->id_country);
$csv_line = array();
// ORDERID
if (Configuration::get('GLS_ORDER_PREFIX_ENABLE')) {
$csv_line['ORDERID'] = $row['id_shop'].'-'.$row['id_order'];
} else {
$csv_line['ORDERID'] = $row['id_order'];
}
// ORDERNAME
if (!empty($customer_address->company)) {
$csv_line['ORDERNAME'] = Tools::strtoupper(nkmStripAccents($customer_address->company));
} else {
$csv_line['ORDERNAME'] = Tools::strtoupper(nkmStripAccents($customer_address->firstname.' '.$customer_address->lastname));
}
// PRODUCTNO
if (!empty($row['gls_product'])) {
$csv_line['PRODUCTNO'] = $row['gls_product'];
} else {
$csv_line['PRODUCTNO'] = $this->getGlsProductCode($row['id_carrier'], $customer_country_iso);
}
// ORDERWEIGHTOT
if (Tools::getValue('order_weight_'.$row['id_order']) !== false) {
$csv_line['ORDERWEIGHTOT'] = Tools::ps_round(str_replace(',', '.', Tools::getValue('order_weight_'.$row['id_order'])), 3);
} else {
$csv_line['ORDERWEIGHTOT'] = Tools::ps_round($row['order_weight'], 3);
}
// CONSID
$csv_line['CONSID'] = $row['id_customer'];
// CONTACT
$csv_line['CONTACT'] = Tools::strtoupper(nkmStripAccents($customer_delivery_address->firstname.' '.$customer_delivery_address->lastname));
// CONTACTMAIL
$csv_line['CONTACTMAIL'] = $row['customer_email'];
// CONTACTMOBILE
if (!empty($row['customer_phone_mobile'])) {
$csv_line['CONTACTMOBILE'] = preg_replace('/[^0-9\+]/', '', $row['customer_phone_mobile']);
} else {
$csv_line['CONTACTMOBILE'] = preg_replace('/[^0-9\+]/', '', $customer_address->phone_mobile);
}
// CONTACTPHONE
$contactPhone = preg_replace('/[^0-9\+]/', '', $customer_address->phone);
if (empty($contactPhone)) {
$contactPhone = $csv_line['CONTACTMOBILE'];
}
$csv_line['CONTACTPHONE'] = $contactPhone;
if (empty($csv_line['CONTACTMOBILE'])) {
$csv_line['CONTACTMOBILE'] = $csv_line['CONTACTPHONE'];
}
// limitation à 35 caractères
$tab_adresse = nkmCutSentenceMulti($customer_address->address1, 35);
// STREET1
$csv_line['STREET1'] = Tools::strtoupper(nkmStripAccents($tab_adresse[0]));
if (isset($tab_adresse[1])) {
// STREET2
$csv_line['STREET2'] = Tools::strtoupper(nkmStripAccents($tab_adresse[1]));
// STREET3
$csv_line['STREET3'] = Tools::substr(Tools::strtoupper(nkmStripAccents($customer_address->address2)), 0, 35);
} else {
// STREET2
$csv_line['STREET2'] = Tools::substr(Tools::strtoupper(nkmStripAccents($customer_address->address2)), 0, 35);
// STREET3
$csv_line['STREET3'] = '';
}
// COUNTRYCODE
$csv_line['COUNTRYCODE'] = $customer_country_iso;
// CITY
$csv_line['CITY'] = Tools::substr(Tools::strtoupper(nkmStripAccents($customer_address->city)), 0, 35);
// ZIPCODE
$csv_line['ZIPCODE'] = $customer_address->postcode;
// REFPR
if (!empty($row['parcel_shop_id'])) {
$csv_line['REFPR'] = $row['parcel_shop_id'];
} else {
$csv_line['REFPR'] = '';
}
$csv_file->addEntry($csv_line);
if (Shop::isFeatureActive()) {
Shop::setContext(Shop::CONTEXT_ALL);
}
// Passer les commandes dans le nouveau statut si non vide
if ((int)Tools::getValue('GLS_EXPORT_NEW_ORDER_STATE', Configuration::get('GLS_EXPORT_NEW_ORDER_STATE')) > 0
&& (int)Tools::getValue('GLS_EXPORT_NEW_ORDER_STATE', Configuration::get('GLS_EXPORT_NEW_ORDER_STATE')) != (int)$row['current_state']
) {
$order = new Order($row['id_order'], (int)$this->context->language->id);
$order->setCurrentState(
Tools::getValue('GLS_EXPORT_NEW_ORDER_STATE', Configuration::get('GLS_EXPORT_NEW_ORDER_STATE')),
(int)$this->context->employee->id
);
}
}
if ($this->fromCron) {
// Export file to local directory
$directory = _PS_MODULE_DIR_.DIRECTORY_SEPARATOR.$this->module->name.DIRECTORY_SEPARATOR.$this->exportDirectory.DIRECTORY_SEPARATOR;
file_put_contents($directory.'GlsCmd_'.NkmUdate('YmdHisu').'.csv', $csv_file->buildDoc());
return true;
} else {
header('Content-type: text/csv');
header('Content-Type: application/force-download; charset=ISO-8859-1');
header('Cache-Control: no-store, no-cache');
header('Content-disposition: attachment; filename="GlsCmd_'.NkmUdate('YmdHisu').'.csv"');
exit($csv_file->buildDoc());
}
} else {
$this->errors[] = $this->l('No order has been found.');
}
} else {
$this->errors[] = $this->l('Please select one or more order status.');
}
}
/**
* Importation des données de Winexpe vers PrestaShop pour mettre à jour les numéro de suivi et le statut des commandes
*/
public function importWinexpe()
{
$files = array();
if ($this->fromCron) {
// Scan import directory to find files
$directory = _PS_MODULE_DIR_.DIRECTORY_SEPARATOR.$this->module->name.DIRECTORY_SEPARATOR.$this->importDirectory.DIRECTORY_SEPARATOR;
$files = self::getCsvFiles($directory);
} else {
$extension = array('.txt', '.csv');
// file upload on the form
$file_uploaded = Tools::fileAttachment('winexpeFile', false);
if (!is_null($file_uploaded)
&& !empty($file_uploaded['tmp_name'])
&& $file_uploaded['error'] == 0
&& !empty($file_uploaded['name']) && in_array(Tools::strtolower(Tools::substr($file_uploaded['name'], -4)), $extension)
) {
$files[] = $file_uploaded['tmp_name'];
}
}
if (count($files) > 0) {
$csv_file = new NkmCSVReader();
foreach ($files as $file_path) {
// File parsing
$csv_content = $csv_file->parse_file($file_path, false, true);
if (!$csv_content) {
$this->errors[] = $this->l('File content empty.');
} else {
// use for performance
$verifyTrackingUrl = array();
// use to send email notification with tracking numbers
$sendInTransitEmail = array();
// use for success message
$orderImported = array();
foreach ($csv_content as $line) {
// Order ID
if (Configuration::get('GLS_ORDER_PREFIX_ENABLE')) {
$order_id = explode('-', $line[4]);
if (count($order_id) == 2) {
// TODO: vérifier que le shop_id correspond bien au shop_id courant
$order_id = $order_id[1];
} else {
continue;
}
} else {
$order_id = $line[4];
}
if (Validate::isLoadedObject($order = new Order((int)$order_id))) {
$old_tracking_number = $order->shipping_number;
$line[17] = trim($line[17]);
if (empty($line[17]) || (!empty($line[17])
&& (empty($old_tracking_number) || !empty($old_tracking_number) && strpos($old_tracking_number, $line[17]) === false))
) {
if (!empty($line[17])) {
/**
* update shipping number
*/
$id_order_carrier = $order->getIdOrderCarrier();
$id_carrier = $order->id_carrier;
if (!empty($old_tracking_number)) {
$shippingNumbers = explode(',', $old_tracking_number);
$shippingNumbers[] = $line[17];
$tracking_number = implode(',', $shippingNumbers);
} else {
$tracking_number = $line[17];
}
// si aucun tracking url de défini sur le transporteur récupérer celui par défaut du module
if (!isset($verifyTrackingUrl[$id_carrier])) {
if (Validate::isLoadedObject($carrier = new Carrier($id_carrier))) {
$verifyTrackingUrl[$id_carrier] = true;
if (empty($carrier->url)) {
$carrier->url = pSQL(NkmGls::$trackingUrl);
$carrier->update();
}
}
}
$order_carrier = new OrderCarrier($id_order_carrier);
if (!Validate::isLoadedObject($order_carrier)) {
$this->errors[] = $this->l('The order carrier ID is invalid.');
continue;
} elseif (!empty($tracking_number) && !Validate::isTrackingNumber($tracking_number)) {
$this->errors[] = $this->l('The tracking number is incorrect.');
continue;
} else {
// Keep these two following lines for backward compatibility, remove on 1.6 version
$order->shipping_number = pSQL($tracking_number);
$order->update();
// Update order_carrier
$order_carrier->tracking_number = pSQL($tracking_number);
if ($order_carrier->update()) {
//send mail only if tracking number is different AND not empty AND email doesnt send before
if ($old_tracking_number != $tracking_number) {
$sendInTransitEmail[$order->id] = $order;
}
} else {
$this->errors[] = $this->l('The order carrier cannot be updated.');
continue;
}
}
}
/**
* update order status
*/
if ((int)Tools::getValue('GLS_IMPORT_NEW_ORDER_STATE', Configuration::get('GLS_IMPORT_NEW_ORDER_STATE')) > 0
&& (int)Tools::getValue('GLS_IMPORT_NEW_ORDER_STATE', Configuration::get('GLS_IMPORT_NEW_ORDER_STATE')) != (int)$order->current_state
) {
$order->setCurrentState(
Tools::getValue('GLS_IMPORT_NEW_ORDER_STATE', Configuration::get('GLS_IMPORT_NEW_ORDER_STATE')),
($this->fromCron ? 0 : (int)$this->context->employee->id)
);
}
} else {
$this->errors[] = sprintf($this->l('Tracking number is empty or already integrated for order %s.'), $line[4]);
continue;
}
$orderImported[$order_id] = $order_id;
}
}
if (count($orderImported) > 0) {
// send mail only if tracking number is different AND not empty AND email doesnt send before
foreach ($sendInTransitEmail as $value) {
$id_order_carrier = $value->getIdOrderCarrier();
$order_carrier = new OrderCarrier($id_order_carrier);
if (!$this->module->sendInTransitEmail($order_carrier, $value)) {
$this->errors[] = $this->l('An error occurred while sending an email to the customer.');
}
}
$this->confirmations[] = sprintf($this->l('%d Order(s) successfully processed.'), count($orderImported));
// LOG
$gls_log = new GlsLogClass();
$gls_log->log(sprintf($this->l('Tracking numbers successfully imported for order(s) %s'), implode(', ', array_map('intval', $orderImported))));
}
}
if ($this->fromCron) {
unlink($file_path);
}
}
} elseif (!$this->fromCron) {
$this->errors[] = $this->l('File not found. Make sure you upload a file on the form or on the synchronisation folder.');
}
}
public function setMedia($isNewTheme = false)
{
parent::setMedia($isNewTheme);
$this->addCSS(_PS_MODULE_DIR_.$this->module->name.'/views/css/admin-order.css');
Media::addJsDef(array(
'back_url' => $this->context->link->getAdminLink('Admin'.$this->name),
'ajax_uri' => $this->context->link->getAdminLink('Admin'.$this->name).'&ajax=1&action=exportWinexpeStep2',
));
$this->addJs(_PS_MODULE_DIR_.$this->module->name.'/views/js/admin-order.js');
}
/**
* Retourne le code produit GLS en fonction du pays de destination et du transporteur en question
* @param string $_country
*/
public function getGlsProductCode($_id_carrier, $_country = 'FR')
{
// ID des transporteurs GLS (historique compris)
$carriers_id_history = $this->module->getCarrierIdHistory();
if (!empty($_id_carrier) && is_numeric($_id_carrier)) {
foreach ($carriers_id_history as $k => $v) {
if (in_array($_id_carrier, $v)) {
if ($k == 'GLSCHEZVOUS' && $_country == 'FR') {
return '02';
} elseif ($k == 'GLSCHEZVOUS' && $_country != 'FR') {
return '01';
} elseif ($k == 'GLSCHEZVOUSPLUS' && $_country == 'FR') {
return '18';
} elseif ($k == 'GLSCHEZVOUSPLUS' && $_country != 'FR') {
return '19';
} elseif ($k == 'GLSRELAIS') {
return '17';
} elseif ($k == 'GLS13H') {
return '16';
}
}
}
}
// TODO: gestion d'erreur (impossible de récupérer le code produit GLS)
return false;
}
/**
* Retourne les fichiers CSV d'un répertoire donné
* @param string $dir
*/
protected static function getCsvFiles($directory)
{
$files = array();
$dir = opendir($directory);
while (false !== ($file = readdir($dir))) {
if ($file == '.' || $file == '..') {
continue;
}
$fileInfo = pathinfo($directory.$file);
if (is_file($directory.$file) && Tools::strtoupper($fileInfo['extension']) == 'CSV') {
$files[] = $directory.$file;
}
}
closedir($dir);
return $files;
}
/**
* l function modified for context CRON
* TODO: optimize if possible
*/
protected function l($string, $class = null, $addslashes = false, $htmlentities = true)
{
if ($this->fromCron) {
return $string;
} else {
return parent::l($string, $class, $addslashes, $htmlentities);
}
}
public function initModal()
{
$tpl = $this->createTemplate('modal.tpl');
parent::initModal();
$this->modals[] = array(
'modal_id' => 'modalExportOrderStep2',
'modal_class' => 'modal-lg',
'modal_title' => null,
'modal_content' => $tpl->fetch(),
);
}
}