* @copyright 2007-2011 PrestaShop SA * @version Release: $Revision: 1.4 $ * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) * International Registered Trademark & Property of PrestaShop SA */ // Avoid direct access to the file if (!defined('_PS_VERSION_')) exit; require_once(_PS_MODULE_DIR_."/tntcarrier/classes/PackageTnt.php"); require_once(_PS_MODULE_DIR_."/tntcarrier/classes/TntWebService.php"); require_once(_PS_MODULE_DIR_."/tntcarrier/classes/OrderInfoTnt.php"); require_once(_PS_MODULE_DIR_."/tntcarrier/classes/serviceCache.php"); class TntCarrier extends CarrierModule { public $id_carrier; private $_html = ''; private $_postErrors = array(); private $_moduleName = 'tntcarrier'; private $_fieldsList = array(); /* ** Construct Method ** */ public function __construct() { $this->name = 'tntcarrier'; $this->tab = 'shipping_logistics'; $this->version = '1.2.1'; $this->author = 'PrestaShop'; $this->limited_countries = array('fr'); parent::__construct (); $this->displayName = $this->l('TNT Express'); $this->description = $this->l('Offer your customers, different delivery methods with TNT'); if (self::isInstalled($this->name)) { global $cookie; $warning = array(); $this->loadingVar(); $carriers = Carrier::getCarriers($cookie->id_lang, true, false, false, null, PS_CARRIERS_AND_CARRIER_MODULES_NEED_RANGE); foreach ($this->_fieldsList as $keyConfiguration => $name) if (!Configuration::get($keyConfiguration) && !empty($name)) $warning[] = '\''.$name.'\' '; // Saving id carrier list $id_carrier_list = array(); foreach($carriers as $carrier) $id_carrier_list[] .= $carrier['id_carrier']; if (count($warning) > 1) $this->warning .= implode(' , ',$warning).$this->l('must be configured to use this module correctly.').' '; if (count($warning) == 1) $this->warning .= implode(' , ',$warning).$this->l('has to be configured to use this module correctly.').' '; } } public function loadingVar() { // Loading Fields List $this->_fieldsList = array( 'TNT_CARRIER_LOGIN' => $this->l('TNT Login'), 'TNT_CARRIER_PASSWORD' => $this->l('TNT Password'), 'TNT_CARRIER_NUMBER_ACCOUNT' => $this->l('TNT Number Account'), 'TNT_CARRIER_SHIPPING_COMPANY' => '', 'TNT_CARRIER_SHIPPING_LASTNAME' => '', 'TNT_CARRIER_SHIPPING_FIRSTNAME' => '', 'TNT_CARRIER_SHIPPING_ADDRESS1' => '', 'TNT_CARRIER_SHIPPING_ADDRESS2' => '', 'TNT_CARRIER_SHIPPING_ZIPCODE' => '', 'TNT_CARRIER_SHIPPING_CITY' => '', 'TNT_CARRIER_SHIPPING_EMAIL' => '', 'TNT_CARRIER_SHIPPING_PHONE' => '', 'TNT_CARRIER_SHIPPING_CLOSING' => '', 'TNT_CARRIER_SHIPPING_DELIVERY' => '', 'TNT_CARRIER_SHIPPING_COLLECT' => '', 'TNT_CARRIER_SHIPPING_PEX' => '', 'TNT_CARRIER_PRINT_STICKER' => '', 'TNT_CARRIER_CORSE_OVERCOST' => '' ); $option = Db::getInstance()->ExecuteS('SELECT * FROM `'._DB_PREFIX_.'tnt_carrier_option`'); foreach($option as $k => $v) { $this->_fieldsList['TNT_CARRIER_'.$v['option'].'_ID'] = (float)($v['id_carrier']); $this->_fieldsList['TNT_CARRIER_'.$v['option'].'_OVERCOST'] = Configuration::get('TNT_CARRIER_'.$v['option'].'_OVERCOST'); } } /* ** Install / Uninstall Methods ** */ public function install() { // Install SQL include(dirname(__FILE__).'/sql-install.php'); foreach ($sql as $s) if (!Db::getInstance()->Execute($s)) return false; // Install Module if (!parent::install() OR !$this->registerHook('updateCarrier') OR !$this->registerHook('orderDetailDisplayed') OR !$this->registerHook('adminOrder') or !$this->registerHook('extraCarrier')) return false; if (file_exists('../modules/'.$this->_moduleName.'/serviceBase.xml')) { $serviceList = simplexml_load_file('../modules/'.$this->_moduleName.'/serviceBase.xml'); if ($serviceList == false) return false; } foreach($serviceList as $k => $v) { $carrierConfig = array( 'name' => $v->name, 'id_tax_rules_group' => 0, 'active' => true, 'deleted' => true, 'shipping_handling' => false, 'range_behavior' => 0, 'delay' => array('fr' => $v->descriptionfr, 'en' => $v->description), 'id_zone' => 1, 'is_module' => true, 'shipping_external' => true, 'external_module_name' => $this->_moduleName, 'need_range' => true ); $id_carrier = $this->installExternalCarrier($carrierConfig); Configuration::updateValue('TNT_CARRIER_'.$v->option.'_ID', (int)($id_carrier)); Db::getInstance()->ExecuteS('INSERT INTO `'._DB_PREFIX_.'tnt_carrier_option` (`option`, `id_carrier`) VALUES ("'.$v->option.'", "'.(int)$id_carrier.'")'); } return true; } public static function installExternalCarrier($config) { $carrier = new Carrier(); $carrier->name = $config['name']; $carrier->id_tax_rules_group = $config['id_tax_rules_group']; $carrier->id_zone = $config['id_zone']; $carrier->active = $config['active']; $carrier->deleted = $config['deleted']; $carrier->delay = $config['delay']; $carrier->shipping_handling = $config['shipping_handling']; $carrier->range_behavior = $config['range_behavior']; $carrier->is_module = $config['is_module']; $carrier->shipping_external = $config['shipping_external']; $carrier->external_module_name = $config['external_module_name']; $carrier->need_range = $config['need_range']; $languages = Language::getLanguages(true); foreach ($languages as $language) { if ($language['iso_code'] == 'fr') $carrier->delay[(int)$language['id_lang']] = $config['delay'][$language['iso_code']]; if ($language['iso_code'] == 'en') $carrier->delay[(int)$language['id_lang']] = $config['delay'][$language['iso_code']]; if ($language['iso_code'] == Language::getIsoById(Configuration::get('PS_LANG_DEFAULT'))) $carrier->delay[(int)$language['id_lang']] = $config['delay'][$language['iso_code']]; } if ($carrier->add()) { $groups = Group::getGroups(true); foreach ($groups as $group) Db::getInstance()->autoExecute(_DB_PREFIX_.'carrier_group', array('id_carrier' => (int)($carrier->id), 'id_group' => (int)($group['id_group'])), 'INSERT'); $rangePrice = new RangePrice(); $rangePrice->id_carrier = $carrier->id; $rangePrice->delimiter1 = '0'; $rangePrice->delimiter2 = '10000'; $rangePrice->add(); $rangeWeight = new RangeWeight(); $rangeWeight->id_carrier = $carrier->id; $rangeWeight->delimiter1 = '0'; $rangeWeight->delimiter2 = '10000'; $rangeWeight->add(); $zones = Zone::getZones(true); foreach ($zones as $zone) { Db::getInstance()->autoExecute(_DB_PREFIX_.'carrier_zone', array('id_carrier' => (int)($carrier->id), 'id_zone' => (int)($zone['id_zone'])), 'INSERT'); Db::getInstance()->autoExecuteWithNullValues(_DB_PREFIX_.'delivery', array('id_carrier' => (int)($carrier->id), 'id_range_price' => (int)($rangePrice->id), 'id_range_weight' => null, 'id_zone' => (int)($zone['id_zone']), 'price' => '0'), 'INSERT'); Db::getInstance()->autoExecuteWithNullValues(_DB_PREFIX_.'delivery', array('id_carrier' => (int)($carrier->id), 'id_range_price' => null, 'id_range_weight' => (int)($rangeWeight->id), 'id_zone' => (int)($zone['id_zone']), 'price' => '0'), 'INSERT'); } // Copy Logo if (!copy(dirname(__FILE__).'/carrier.jpg', _PS_SHIP_IMG_DIR_.'/'.(int)$carrier->id.'.jpg')) return false; // Return ID Carrier return (int)($carrier->id); } return false; } public function uninstall() { // Uninstall Carriers Db::getInstance()->autoExecute(_DB_PREFIX_.'carrier', array('deleted' => 1), 'UPDATE', '`external_module_name` = \'tntcarrier\''); // Uninstall Config foreach ($this->_fieldsList as $keyConfiguration => $name) if (!Configuration::deleteByName($keyConfiguration)) return false; // Uninstall SQL include(dirname(__FILE__).'/sql-uninstall.php'); foreach ($sql as $s) if (!Db::getInstance()->Execute($s)) return false; // Uninstall Module if (!parent::uninstall() OR !$this->unregisterHook('updateCarrier')) return false; return true; } /* ** Form Config Methods ** */ public function getContent() { $this->_html .= '

' . $this->l('TNT Carrier').'

'; if (!empty($_POST) AND Tools::isSubmit('submitSave')) { $this->_postValidation(); if (!sizeof($this->_postErrors)) $this->_postProcess(); else foreach ($this->_postErrors AS $err) $this->_html .= '
nok '.$err.'
'; } $this->_displayForm(); return $this->_html; } private function _displayForm() { global $smarty; $globalVar = array( 'tab' => htmlentities(Tools::getValue('tab')), 'configure' => htmlentities(Tools::getValue('configure')), 'token' => htmlentities(Tools::getValue('token')), 'tab_module' => htmlentities(Tools::getValue('tab_module')), 'module_name' => htmlentities(Tools::getValue('module_name'))); $smarty->assign('glob', $globalVar); $this->_html .= '
'.$this->l('TNT Carrier Module Status').''; $alert = array(); if (!Configuration::get('TNT_CARRIER_LOGIN') || !Configuration::get('TNT_CARRIER_PASSWORD') || !Configuration::get('TNT_CARRIER_NUMBER_ACCOUNT')) $alert['account'] = 1; if ( !Configuration::get('TNT_CARRIER_SHIPPING_ADDRESS1') || !Configuration::get('TNT_CARRIER_SHIPPING_ZIPCODE') || !Configuration::get('TNT_CARRIER_SHIPPING_CITY') || !Configuration::get('TNT_CARRIER_SHIPPING_EMAIL') || !Configuration::get('TNT_CARRIER_SHIPPING_PHONE')) $alert['shipping'] = 1; if ((Db::getInstance()->getValue('SELECT * FROM `'._DB_PREFIX_.'carrier` WHERE `external_module_name` = "'.$this->_moduleName.'" AND deleted = "0"')) < 1) $alert['service'] = 1; if (count($alert) < 3) { $this->_html .= ''.$this->l('The following parameters are correctly configured and activated on your online store :').''; $this->_html .= ''; } if (count($alert) > 0) { $this->_html .= ''.$this->l('The following parameters have to be configured to be able to use correctly the TNT module :').''; $this->_html .= ''; } $this->_html .= '
 
'; $this->_html .= $this->_displayFormConfig(); } private function _displayFormConfig() { global $smarty; $var = array('account' => $this->_displayFormAccount(), 'shipping' => $this->_displayFormShipping(), 'service' => $this->_displayService(), 'country' => $this->_displayCountry('Corse'), 'info' => $this->_displayInfo('weight')); $smarty->assign('varMain', $var); $html = $this->display( __FILE__, 'tpl/main.tpl' ); if (isset($_GET['id_tab'])) $html .= ''; return $html; } private function _displayFormAccount() { global $smarty; $var = array('login' => htmlentities(Tools::getValue('tnt_carrier_login', Configuration::get('TNT_CARRIER_LOGIN'))), 'password' => htmlentities(Tools::getValue('tnt_carrier_password', Configuration::get('TNT_CARRIER_PASSWORD'))), 'account' => htmlentities(Tools::getValue('tnt_carrier_number_account', Configuration::get('TNT_CARRIER_NUMBER_ACCOUNT')))); $smarty->assign('varAccount', $var); return $this->display( __FILE__, 'tpl/accountForm.tpl' ); } private function _displayFormShipping() { global $cookie, $smarty; $var = array('moduleName' => $this->_moduleName, 'collect' => Configuration::get('TNT_CARRIER_SHIPPING_COLLECT'), 'pex' => Configuration::get('TNT_CARRIER_SHIPPING_PEX'), 'company' => Configuration::get('TNT_CARRIER_SHIPPING_COMPANY'), 'lastName' => Configuration::get('TNT_CARRIER_SHIPPING_LASTNAME'), 'firstName' => Configuration::get('TNT_CARRIER_SHIPPING_FIRSTNAME'), 'address1' => Configuration::get('TNT_CARRIER_SHIPPING_ADDRESS1'), 'address2' => Configuration::get('TNT_CARRIER_SHIPPING_ADDRESS2'), 'zipCode' => Configuration::get('TNT_CARRIER_SHIPPING_ZIPCODE'), 'city' => Configuration::get('TNT_CARRIER_SHIPPING_CITY'), 'email' => Configuration::get('TNT_CARRIER_SHIPPING_EMAIL'), 'phone' => Configuration::get('TNT_CARRIER_SHIPPING_PHONE'), 'closing' => Configuration::get('TNT_CARRIER_SHIPPING_CLOSING'), 'delivery' => Configuration::get('TNT_CARRIER_SHIPPING_DELIVERY'), 'sticker' => Configuration::get('TNT_CARRIER_PRINT_STICKER')); $smarty->assign('varShipping', $var); return $this->display( __FILE__, 'tpl/shippingForm.tpl' ); } private function _displayService() { global $smarty; if (Tools::getValue('action') == 'del' && Tools::getValue('service') != '') { $id = Tools::getValue('service'); Db::getInstance()->Execute('UPDATE `'._DB_PREFIX_.'carrier` SET `deleted` = "1" WHERE `id_carrier` = '.(int)($id).''); $option = Db::getInstance()->ExecuteS('SELECT `option` FROM `'._DB_PREFIX_.'tnt_carrier_option` WHERE `id_carrier` = "'.(int)($id).'"'); Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'tnt_carrier_option` WHERE `id_carrier` = '.(int)($id).''); Configuration::deleteByName('TNT_CARRIER_'.$option[0]['option'].'_ID'); Configuration::deleteByName('TNT_CARRIER_'.$option[0]['option'].'_OVERCOST'); } $irow = 0; $serviceList = Db::getInstance()->ExecuteS('SELECT c.deleted, c.name, cl.delay, o.option FROM `'._DB_PREFIX_.'carrier` c, `'._DB_PREFIX_.'carrier_lang` cl, `'._DB_PREFIX_.'tnt_carrier_option` o , `'._DB_PREFIX_.'lang` l WHERE c.external_module_name = "'.$this->_moduleName.'" AND c.id_carrier = cl.id_carrier AND cl.id_lang = l.id_lang AND l.iso_code = "'.Language::getIsoById(Configuration::get('PS_LANG_DEFAULT')).'" AND o.id_carrier = c.id_carrier'); foreach ($serviceList as $k => $v) { $serviceList[$k]['optionId'] = Configuration::get('TNT_CARRIER_'.$v['option'].'_ID'); $serviceList[$k]['optionOvercost'] = (Configuration::get('TNT_CARRIER_'.$v['option'].'_OVERCOST') ? Configuration::get('TNT_CARRIER_'.$v['option'].'_OVERCOST') : '0'); } $var = array('serviceList' => $serviceList, 'action' => htmlentities(Tools::getValue('action')), 'section' => htmlentities(Tools::getValue('section')), 'form' => $this->_displayFormService(htmlentities(Tools::getValue('service')))); $smarty->assign('varService', $var); return $this->display( __FILE__, 'tpl/service.tpl' ); } private function _displayInfo($cat) { if (Tools::getValue('action') == 'del' && Tools::getValue($cat) != '') { $id = Tools::getValue($cat); Db::getInstance()->ExecuteS('DELETE FROM `'._DB_PREFIX_.'tnt_carrier_'.bqSQL($cat).'` WHERE `id_'.bqSQL($cat).'` = '.(int)$id.''); } $html = ' add '.$this->l('Add additional charges depending on the package weight').'

'; $List = Db::getInstance()->ExecuteS('SELECT * FROM `'._DB_PREFIX_.'tnt_carrier_'.bqSQL($cat).'` ORDER BY `id_'.bqSQL($cat).'`'); $irow = 0; foreach ($List as $v) { $html .= ''; } $html .= '
'.$this->l('ID').''.$this->l('Weight Min').''.$this->l('Weight Max').''.$this->l('Additionnal charge (Euros)').'
'.$v['id_'.$cat.''].' '.$v[''.$cat.'_min'].' '.((float)$v[''.$cat.'_max'] == 0 ? '∞' : $v[''.$cat.'_max']).' '.$v['additionnal_charges'].' edit delete

'.((Tools::getValue('action') == 'edit' || Tools::getValue('action') == 'new') && Tools::getValue('section') == $cat ? $this->_displayFormInfo(htmlentities($cat), htmlentities(Tools::getValue($cat))) : '').'
'; return $html; } private function _displayCountry($country) { global $smarty; $var = array( 'country' => $country, 'overcost' => (Configuration::get('TNT_CARRIER_'.strtoupper($country).'_OVERCOST') ? Configuration::get('TNT_CARRIER_'.strtoupper($country).'_OVERCOST') : '0'), 'action' => htmlentities(Tools::getValue('action')), 'section' => htmlentities(Tools::getValue('section')), 'getCountry' => htmlentities(Tools::getValue('country')), 'form' => (Tools::getValue('country') != '' ? $this->_displayFormCountry(htmlentities(Tools::getValue('country'))) : '') ); $smarty->assign('varCountry', $var); return $this->display( __FILE__, 'tpl/country.tpl' ); } private function _displayFormService($id = null) { global $smarty; $name = ''; $description = ''; $code = ''; $charge = ''; $display = ''; if ($id != null) { $service = Db::getInstance()->ExecuteS('SELECT c.deleted, c.name, l.delay, o.option, o.additionnal_charges FROM `'._DB_PREFIX_.'carrier` c, `'._DB_PREFIX_.'carrier_lang` l, `'._DB_PREFIX_.'tnt_carrier_option` o WHERE c.id_carrier = "'.(int)$id.'" AND c.id_carrier = l.id_carrier AND l.id_lang = "1" AND o.id_carrier = c.id_carrier'); if ($service != NULL) { $name = $service[0]['name']; $description = $service[0]['delay']; $code = $service[0]['option']; $charge = $service[0]['additionnal_charges']; $display = $service[0]['deleted']; } } $var = array('id' => $id, 'name' => $name, 'description' => $description, 'code' => $code, 'charge' => $charge, 'display' => $display); $smarty->assign('varServiceForm', $var); return $this->display( __FILE__, 'tpl/serviceForm.tpl' ); } private function _displayFormInfo($cat, $id = null) { $info_min = ''; $info_max = ''; $charge = ''; if ($id != null) { $info = Db::getInstance()->ExecuteS('SELECT * FROM `'._DB_PREFIX_.'tnt_carrier_'.$cat.'` WHERE `id_'.$cat.'` = "'.$id.'"'); $info_min = $info[0][$cat.'_min']; $info_max = ((float)$info[0][$cat.'_max'] == 0 ? '': $info[0][$cat.'_max']); $charge = $info[0]['additionnal_charges']; } $html = '
'.($id != null ? '' : '').'
'.$this->l('Weight min').''.$this->l('Weight max (can be empty)').''.$this->l('Additionnal charge').'
'; return $html; } private function _displayFormCountry($country) { global $smarty; $var = array( 'country' => $country, 'overcost' => Configuration::get('TNT_CARRIER_'.strtoupper($country).'_OVERCOST') ); $smarty->assign('varCountryForm', $var); return $this->display( __FILE__, 'tpl/countryForm.tpl' ); } private function _postValidation() { if (Tools::getValue('section') == 'account') $this->_postValidationAccount(); elseif (Tools::getValue('section') == 'shipping') $this->_postValidationShipping(); elseif (Tools::getValue('section') == 'service') $this->_postValidationService(); elseif (Tools::getValue('section') == 'weight') $this->_postValidationInfo(Tools::getValue('section')); elseif (Tools::getValue('section') == 'country') $this->_postValidationCountry(); } private function _postProcess() { } private function _postValidationAccount() { $login = Tools::getValue('tnt_carrier_login'); $password = Tools::getValue('tnt_carrier_password'); $number = Tools::getValue('tnt_carrier_number_account'); if (!$login || !$password || !$number) $this->_postErrors[] = $this->l('All the fields are required'); Configuration::updateValue('TNT_CARRIER_LOGIN', $login); Configuration::updateValue('TNT_CARRIER_PASSWORD', $password); Configuration::updateValue('TNT_CARRIER_NUMBER_ACCOUNT', $number); } private function _postValidationShipping() { $collect = '1';//Tools::getValue('tnt_carrier_shipping_collect'); $company = Tools::getValue('tnt_carrier_shipping_company'); $pex = Tools::getValue('tnt_carrier_shipping_pex'); $lname = Tools::getValue('tnt_carrier_shipping_last_name'); $fname = Tools::getValue('tnt_carrier_shipping_first_name'); $address1 = Tools::getValue('tnt_carrier_shipping_address1'); $address2 = Tools::getValue('tnt_carrier_shipping_address2'); $postal_code = Tools::getValue('tnt_carrier_shipping_postal_code'); $city = Tools::getValue('tnt_carrier_shipping_city'); $email = Tools::getValue('tnt_carrier_shipping_email'); $phone = Tools::getValue('tnt_carrier_shipping_phone'); $closing = Tools::getValue('tnt_carrier_shipping_closing'); $delivery = Tools::getValue('tnt_carrier_shipping_delivery'); $print = Tools::getValue('tnt_carrier_print_sticker'); if (!$collect && $pex == '') $this->_postErrors[] = $this->l('The pex code is missing'); if ($collect && $company == '') $this->_postErrors[] = $this->l('Company name is missing'); if ($collect && !$lname) $this->_postErrors[] = $this->l('Contact last name is missing'); if ($collect && !$fname) $this->_postErrors[] = $this->l('Contact first name is missing'); if (!$address1) $this->_postErrors[] = $this->l('Address is missing'); if (isset($address2) && strlen($address2) >= 32) $this->_postErrors[] = $this->l('Address line 2 must be under 32 characters'); if (!$postal_code) $this->_postErrors[] = $this->l('Postal code is missing'); if (!$email) $this->_postErrors[] = $this->l('Contact email address is missing'); if (!$phone) $this->_postErrors[] = $this->l('Contact phone number is missing'); if ($collect && $closing == '') $this->_postErrors[] = $this->l('Company closing time is missing'); Configuration::updateValue('TNT_CARRIER_SHIPPING_COLLECT', $collect); Configuration::updateValue('TNT_CARRIER_SHIPPING_COMPANY', $company); Configuration::updateValue('TNT_CARRIER_SHIPPING_LASTNAME', $lname); Configuration::updateValue('TNT_CARRIER_SHIPPING_FIRSTNAME', $fname); Configuration::updateValue('TNT_CARRIER_SHIPPING_ADDRESS1', $address1); Configuration::updateValue('TNT_CARRIER_SHIPPING_ADDRESS2', $address2); Configuration::updateValue('TNT_CARRIER_SHIPPING_ZIPCODE', $postal_code); Configuration::updateValue('TNT_CARRIER_SHIPPING_CITY', $city); Configuration::updateValue('TNT_CARRIER_SHIPPING_EMAIL', $email); Configuration::updateValue('TNT_CARRIER_SHIPPING_PHONE', $phone); Configuration::updateValue('TNT_CARRIER_SHIPPING_CLOSING', $closing); Configuration::updateValue('TNT_CARRIER_SHIPPING_DELIVERY', $delivery); Configuration::updateValue('TNT_CARRIER_SHIPPING_PEX', $pex); Configuration::updateValue('TNT_CARRIER_PRINT_STICKER', $print); } private function _postValidationService() { if (Tools::getValue('action') == 'new' && Tools::getValue('service_id') != null ) $this->_postValidationEditService(); elseif (Tools::getValue('action') == 'new' && Tools::getValue('service_id') == null) $this->_postValidationNewService(); } private function _postValidationInfo($cat) { if (Tools::getValue('action') == 'new' && Tools::getValue($cat.'_id') != null ) $this->_postValidationEditInfo($cat); elseif (Tools::getValue('action') == 'new' && Tools::getValue($cat.'_id') == null) $this->_postValidationNewInfo($cat); } private function _postValidationNewService() { $name = Tools::getValue('tnt_carrier_service_name'); $description = Tools::getValue('tnt_carrier_service_description'); $code = Tools::getValue('tnt_carrier_service_code'); $charge = Tools::getValue('tnt_carrier_service_charge'); $display = Tools::getValue('tnt_carrier_service_display'); if ($name == '') $this->_postErrors[] = $this->l('You have to give a name service'); if ($code == '') $this->_postErrors[] = $this->l('You have to give a code service'); if ($description == '') $this->_postErrors[] = $this->l('You have to give a description of the service'); if ($display == '1') $delete = false; else $delete = true; if (!$this->_postErrors) { $carrierConfig = array( 'name' => $name, 'id_tax_rules_group' => 0, 'active' => true, 'deleted' => $delete, 'shipping_handling' => false, 'range_behavior' => 0, 'delay' => array('fr' => $description, 'en' => $description, Language::getIsoById(Configuration::get('PS_LANG_DEFAULT')) => $description), 'id_zone' => 1, 'is_module' => true, 'shipping_external' => true, 'external_module_name' => $this->_moduleName, 'need_range' => true ); $id_carrier = $this->installExternalCarrier($carrierConfig); Db::getInstance()->autoExecute(_DB_PREFIX_.'tnt_carrier_option', array('id_carrier' => (int)($id_carrier), 'option' => pSQL($code), 'additionnal_charges' => (float)($charge)),'INSERT'); Configuration::updateValue('TNT_CARRIER_'.pSQL($code).'_ID', (int)($id_carrier)); Configuration::updateValue('TNT_CARRIER_'.pSQL($code).'_OVERCOST', (float)($charge)); $this->_fieldsList['TNT_CARRIER_'.pSQL($code).'_OVERCOST'] = (float)($charge); $this->_fieldsList['TNT_CARRIER_'.pSQL($code).'_ID'] = (float)($id_carrier); $this->_html .= $this->displayConfirmation($this->l('Service updated')); } } private function _postValidationEditService() { $id = Tools::getValue('service_id'); $name = Tools::getValue('tnt_carrier_service_name'); $description = Tools::getValue('tnt_carrier_service_description'); $code = Tools::getValue('tnt_carrier_service_code'); $charge = Tools::getValue('tnt_carrier_service_charge'); $display = Tools::getValue('tnt_carrier_service_display'); if ($name == '') $this->_postErrors[] = $this->l('You have to give a name service'); if ($code == '') $this->_postErrors[] = $this->l('You have to give a code service'); if ($description == '') $this->_postErrors[] = $this->l('You have to give a description of the service'); if ($display == '1') $display = '0'; else $display = '1'; if (!$this->_postErrors) { Db::getInstance()->Execute('UPDATE `'._DB_PREFIX_.'carrier` SET `name` = "'.pSQL($name).'", `deleted` = "'.(int)($display).'" WHERE `id_carrier` = '.(int)($id).''); Db::getInstance()->Execute('UPDATE `'._DB_PREFIX_.'carrier_lang` SET `delay` = "'.pSQL($description).'" WHERE `id_carrier` = '.(int)($id).''); Db::getInstance()->Execute('UPDATE `'._DB_PREFIX_.'tnt_carrier_option` SET `option` = "'.pSQL($code).'" WHERE `id_carrier` = '.(int)($id).''); Configuration::updateValue('TNT_CARRIER_'.pSQL($code).'_OVERCOST', (float)($charge)); Configuration::updateValue('TNT_CARRIER_'.pSQL($code).'_ID', (int)($id)); $this->_fieldsList['TNT_CARRIER_'.pSQL($code).'_OVERCOST'] = (float)($charge); $this->_fieldsList['TNT_CARRIER_'.pSQL($code).'_ID'] = (float)($id); $this->_html .= $this->displayConfirmation($this->l('Service updated')); } } private function _postValidationNewInfo($cat) { $info_min = Tools::getValue('tnt_carrier_'.$cat.'_min'); $info_max = Tools::getValue('tnt_carrier_'.$cat.'_max'); $charge = Tools::getValue('tnt_carrier_'.$cat.'_charge'); Db::getInstance()->autoExecute(_DB_PREFIX_.'tnt_carrier_'.bqSQL($cat).'', array( ''.pSQL($cat).'_min' => (float)($info_min), ''.pSQL($cat).'_max' => (float)($info_max), 'additionnal_charges' => (float)($charge)),'INSERT'); $this->_html .= $this->displayConfirmation($this->l('Service updated')); } private function _postValidationEditInfo($cat) { $id = Tools::getValue($cat.'_id'); $info_min = Tools::getValue('tnt_carrier_'.$cat.'_min'); $info_max = Tools::getValue('tnt_carrier_'.$cat.'_max'); $charge = Tools::getValue('tnt_carrier_'.$cat.'_charge'); Db::getInstance()->Execute('UPDATE `'._DB_PREFIX_.'tnt_carrier_'.$cat.'` SET `'.bqSQL($cat).'_min` = "'.(float)($info_min).'", `'.bqSQL($cat).'_max` = "'.(float)($info_max).'", `additionnal_charges` = "'.(float)$charge.'" WHERE `id_'.bqSQL($cat).'` = '.(int)($id).''); $this->_html .= $this->displayConfirmation($this->l('Service updated')); } private function _postValidationCountry() { $country = Tools::getValue('tnt_carrier_country'); $overcost = Tools::getValue('tnt_carrier_'.$country.'_overcost'); Configuration::updateValue('TNT_CARRIER_'.strtoupper($country).'_OVERCOST', $overcost); } public function get_followup($shipping_number) { return false; } /* ** Hook update carrier ** */ public function hookextraCarrier($params) { global $smarty; $id_cart = $params['cart']->id; $smarty->assign('id_cart', (int)$id_cart); return $this->display( __FILE__, 'tpl/relaisColis.tpl' ); } public function hookadminOrder($params) { global $currentIndex, $smarty; $table = 'order'; $token = Tools::getValue('token'); $errorShipping = 0; $carrierName = Db::getInstance()->ExecuteS('SELECT c.external_module_name FROM `'._DB_PREFIX_.'carrier` as c, `'._DB_PREFIX_.'orders` as o WHERE c.id_carrier = o.id_carrier AND o.id_order = "'.(int)($params['id_order']).'"'); if ($carrierName!= null && $carrierName[0]['external_module_name'] != $this->_moduleName) return false; if (!Configuration::get('TNT_CARRIER_LOGIN') || !Configuration::get('TNT_CARRIER_PASSWORD') || !Configuration::get('TNT_CARRIER_NUMBER_ACCOUNT')) { $var = array("error" => $this->l("You don't have a TNT account"), 'shipping_numbers' => '', 'sticker' => ''); $smarty->assign('var', $var); return $this->display( __FILE__, 'tpl/shippingNumber.tpl' ); } if (Configuration::get('TNT_CARRIER_SHIPPING_COLLECT')) { if (!Configuration::get('TNT_CARRIER_SHIPPING_COMPANY') || !Configuration::get('TNT_CARRIER_SHIPPING_ADDRESS1') || !Configuration::get('TNT_CARRIER_SHIPPING_ZIPCODE') || !Configuration::get('TNT_CARRIER_SHIPPING_CITY') || !Configuration::get('TNT_CARRIER_SHIPPING_EMAIL') || !Configuration::get('TNT_CARRIER_SHIPPING_PHONE') || !Configuration::get('TNT_CARRIER_SHIPPING_CLOSING')) $errorShipping = 1; } else { if (!Configuration::get('TNT_CARRIER_SHIPPING_PEX') || !Configuration::get('TNT_CARRIER_SHIPPING_ADDRESS1') || !Configuration::get('TNT_CARRIER_SHIPPING_ZIPCODE') || !Configuration::get('TNT_CARRIER_SHIPPING_CITY') || !Configuration::get('TNT_CARRIER_SHIPPING_EMAIL') || !Configuration::get('TNT_CARRIER_SHIPPING_PHONE')) $errorShipping = 1; } if ($errorShipping) { $var = array("error" => $this->l("You didn't give a collect address in the TNT module configuration"), 'shipping_numbers' => '', 'sticker' => ''); $smarty->assign('var', $var); return $this->display( __FILE__, 'tpl/shippingNumber.tpl' ); } $orderInfoTnt = new OrderInfoTnt((int)($params['id_order'])); $info = $orderInfoTnt->getInfo(); if (!is_array($info) && $info != false) { $var = array("error" => $info, "weight" => '', "weightHidden" => '1', "date" => '', "dateHidden" => '1', 'currentIndex' => $currentIndex, 'table' => $table, 'token' => $token); $smarty->assign('var', $var); return $this->display( __FILE__, 'tpl/formerror.tpl' ); } $dataWeight = (int)(Tools::getValue('weightErrorOrder')); if ($dataWeight != 0) $info[1]['weight'][0] = $dataWeight; $pack = new PackageTnt((int)($params['id_order'])); if ($info[0]['shipping_number'] == '' && $pack->getOrder()->hasBeenShipped()) { $tntWebService = new TntWebService(); try { $package = $tntWebService->getPackage($info); } catch( SoapFault $e ) { if (strrpos($e->faultstring, "weight")) $weightError = 1; if (strrpos($e->faultstring, "shippingDate")) $dateError = date("Y-m-d"); $error = $this->l("Problem : ") . $e->faultstring; $var = array("error" => $error, "weight" => (isset($weightError) ? $weightError : ''), "weightHidden" => (!isset($weightError) ? $info[1]['weight'] : ''), "date" => (isset($dateError) ? $dateError : ''), "dateHidden" => (!isset($dateError) ? $info[2]['delivery_date'] : ''), 'currentIndex' => $currentIndex, 'table' => $table, 'token' => $token); $smarty->assign('var', $var); return $this->display( __FILE__, 'tpl/formerror.tpl' ); } catch( Exception $e ) { $error = $this->l("Problem : failed"); } if (isset($package->Expedition->parcelResponses->parcelNumber)) $pack->setShippingNumber($package->Expedition->parcelResponses->parcelNumber); else foreach ($package->Expedition->parcelResponses as $k => $v) $pack->setShippingNumber($v->parcelNumber); file_put_contents("../modules/".$this->_moduleName.'/pdf/'.$pack->getOrder()->shipping_number.'.pdf', $package->Expedition->PDFLabels); } if ($pack->getShippingNumber() != '') { $var = array( 'lang_shippingNumber' => $this->l('The shipping number(s)'), 'lang_sticker' => $this->l('The sticker'), 'lang_expedition' => $this->l('Expedition'), 'error' => '', 'shipping_numbers' => $pack->getShippingNumber(), 'sticker' => "../modules/".$this->_moduleName.'/pdf/'.$pack->getOrder()->shipping_number.'.pdf', 'date' => $info[2]['delivery_date'], 'place' => Configuration::get('TNT_CARRIER_SHIPPING_ADDRESS1')." ".Configuration::get('TNT_CARRIER_SHIPPING_ADDRESS2')."
".Configuration::get('TNT_CARRIER_SHIPPING_ZIPCODE')." ".$this->putCityInNormeTnt(Configuration::get('TNT_CARRIER_SHIPPING_CITY'))); $smarty->assign('var', $var); return $this->display( __FILE__, 'tpl/shippingNumber.tpl' ); } return false; } public function hookorderDetailDisplayed($params) { global $smarty; $tab = $params['order']->getFields(); $shipping_number = $tab['shipping_number']; $id_carrier = $tab['id_carrier']; $erreur = null; $follow = array(); $carrierName = Db::getInstance()->ExecuteS('SELECT external_module_name FROM `'._DB_PREFIX_.'carrier` WHERE `id_carrier` = "'.(int)($id_carrier).'"'); if ($carrierName != null && $carrierName[0]['external_module_name'] == $this->_moduleName && $shipping_number != '') { $pack = new PackageTnt($params['order']->id); $numbers = $pack->getShippingNumber(); $smarty->assign('numbers', $numbers); return $this->display( __FILE__, 'tpl/waitingFollow.tpl' ); } } public function hookupdateCarrier($params) { $option = Db::getInstance()->ExecuteS('SELECT option FROM `'._DB_PREFIX_.'tnt_carrier_option` WHERE id_carrier = "'.(int)$params['id_carrier'].'"'); Configuration::updateValue('TNT_CARRIER_'.$option[0]['option'].'_ID', (int)($params['carrier']->id)); } /* ** Front Methods ** ** If you set need_range at true when you created your carrier (in install method), the method called by the cart will be getOrderShippingCost ** If not, the method called will be getOrderShippingCostExternal ** ** $params var contains the cart, the customer, the address ** $shipping_cost var contains the price calculated by the range in carrier tab ** */ public function getOrderShippingCost($params, $shipping_cost) { if (!Tools::getValue('step')) return false; if ((int)(Tools::getValue('step')) > 2) serviceCache::deleteServices($params->id); $product = $params->getProducts(); $weight = 0; $add = 0; $id_customer = $params->id_customer; $date_exp = $params->date_upd; $id_adress_delivery = $params->id_address_delivery; $info = Db::getInstance()->ExecuteS('SELECT postcode, city, company FROM `'._DB_PREFIX_.'address` WHERE `id_address` = "'.(int)($id_adress_delivery).'"'); foreach($product as $k => $v) $weight += (float)($v['weight']); if ((int)(Tools::getValue('step')) == 2) { if (!Configuration::get('TNT_CARRIER_LOGIN') || !Configuration::get('TNT_CARRIER_PASSWORD') || !Configuration::get('TNT_CARRIER_NUMBER_ACCOUNT')) return false; if (!Configuration::get('TNT_CARRIER_SHIPPING_ADDRESS1') || !Configuration::get('TNT_CARRIER_SHIPPING_ZIPCODE') || !Configuration::get('TNT_CARRIER_SHIPPING_CITY')) return false; $serviceCache = new serviceCache($params->id, $info[0]['postcode']); if (!$serviceCache->getFaisabilityAtThisTime()) { $serviceCache->deletePreviousServices(); $tntWebService = new TntWebService(); if (date("N") == 6) $date_exp = date("Y-m-d", mktime(0, 0, 0, date("m") , date("d")+2, date("Y"))); elseif (date("N") == 7) $date_exp = date("Y-m-d", mktime(0, 0, 0, date("m") , date("d")+1, date("Y"))); try { $service = $tntWebService->faisabilite($date_exp, Configuration::get('TNT_CARRIER_SHIPPING_ZIPCODE'), $this->putCityInNormeTnt(Configuration::get('TNT_CARRIER_SHIPPING_CITY')), $info[0]['postcode'], $this->putCityInNormeTnt($info[0]['city']), ($info[0]['company'] != '' ? "ENTERPRISE" : 'INDIVIDUAL')); $serviceRelais = $tntWebService->faisabilite($date_exp, Configuration::get('TNT_CARRIER_SHIPPING_ZIPCODE'), $this->putCityInNormeTnt(Configuration::get('TNT_CARRIER_SHIPPING_CITY')), $info[0]['postcode'], $this->putCityInNormeTnt($info[0]['city']), "DROPOFFPOINT"); } catch( SoapFault $e ) { $erreur = $this->l("Problem : ") . $e->faultstring; } catch( Exception $e ) { $erreur = $this->l("Problem : follow failed"); } if (!isset($erreur)) $serviceCache->putInCache($service, $serviceRelais); } $service = $serviceCache->getServices(); if ($service != NULL) foreach ($service as $v) { if (Configuration::get('TNT_CARRIER_'.$v['code'].'_ID')) if (Configuration::get('TNT_CARRIER_'.$v['code'].'_ID') == $this->id_carrier) $priceCarrier = Configuration::get('TNT_CARRIER_'.$v['code'].'_OVERCOST'); } } if (!isset($priceCarrier)) { if ($option = Db::getInstance()->ExecuteS('SELECT `option` FROM `'._DB_PREFIX_.'tnt_carrier_option` WHERE `id_carrier` = "'.(int)($this->id_carrier).'"')) $priceCarrier = Configuration::get('TNT_CARRIER_'.$option[0]['option'].'_OVERCOST'); } $zero = 0; $weightLimit = Db::getInstance()->ExecuteS('SELECT additionnal_charges FROM `'._DB_PREFIX_.'tnt_carrier_weight` WHERE `weight_min` < "'.(float)($weight).'" AND (`weight_max` > "'.(float)($weight).'" OR `weight_max` = "'.(float)$zero.'")'); $currency = Db::getInstance()->ExecuteS('SELECT conversion_rate FROM `'._DB_PREFIX_.'currency` WHERE `id_currency` = "'.(int)($params->id_currency).'"'); if ($weightLimit != null) $add += (float)($weightLimit[0]['additionnal_charges']); if (substr($info[0]['postcode'], 0, 2) == "20") $add += (float)(Configuration::get('TNT_CARRIER_CORSE_OVERCOST')); if (isset($priceCarrier)) return (($priceCarrier + $add) * $currency[0]['conversion_rate']); return false; } public function getOrderShippingCostExternal($params) { return getOrderShippingCost($params, null); } public function putCityInNormeTnt($city) { $city = iconv("utf-8", 'ASCII//TRANSLIT', $city); $city = mb_strtoupper($city, 'utf-8'); $table = array('`' => '','\''=> '', '^' => '','À'=>'A', 'Á'=>'A', 'Â'=>'A', 'Ã'=>'A', 'Ä'=>'A', 'Å'=>'A', 'Æ'=>'A', 'Ç'=>'C', 'È'=>'E', 'É'=>'E', 'Ê'=>'E', 'Ë'=>'E', 'Ì'=>'I', 'Í'=>'I', 'Î'=>'I', 'Ï'=>'I', 'Ñ'=>'N', 'Ò'=>'O', 'Ó'=>'O', 'Ô'=>'O', 'Õ'=>'O', 'Ö'=>'O', 'Ø'=>'O', 'Ù'=>'U', 'Ú'=>'U', 'Û'=>'U', 'Ü'=>'U', 'Ý'=>'Y', 'Þ'=>'B'); $city = strtr($city, $table); $old = array("SAINT", "-"); $new = array("ST", " "); return (str_replace($old, $new, $city)); } }