274 lines
8.9 KiB
PHP
274 lines
8.9 KiB
PHP
|
<?php
|
||
|
/*
|
||
|
* 2007-2011 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-2011 PrestaShop SA
|
||
|
* @version Release: $Revision: 8783 $
|
||
|
* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0)
|
||
|
* International Registered Trademark & Property of PrestaShop SA
|
||
|
*/
|
||
|
|
||
|
/*
|
||
|
* Interface
|
||
|
*/
|
||
|
require_once(dirname(__FILE__).'/IMondialRelayWSMethod.php');
|
||
|
|
||
|
/*
|
||
|
* Allow to retrieve relay point details - 'WSI2_DetailPointRelais'
|
||
|
*/
|
||
|
class MRRelayDetail implements IMondialRelayWSMethod
|
||
|
{
|
||
|
private $_fields = array(
|
||
|
'list' => array(
|
||
|
'Enseigne' => array(
|
||
|
'required' => true,
|
||
|
'value' => '',
|
||
|
'regexValidation' => '#^[0-9A-Z]{2}[0-9A-Z ]{6}$#'),
|
||
|
'Num' => array(
|
||
|
'required' => true,
|
||
|
'value' => '',
|
||
|
'regexValidation' => '#^[0-9]{6}$#'),
|
||
|
'Pays' => array(
|
||
|
'required' => true,
|
||
|
'value' => '',
|
||
|
'regexValidation' => '#^[A-Z]{2}$#'),
|
||
|
'Security' => array(
|
||
|
'required' => true,
|
||
|
'value' => '',
|
||
|
'regexValidation' => '#^[0-9A-Z]{32}$#')));
|
||
|
|
||
|
private $_relayPointNumList = array();
|
||
|
private $_id_address_delivery = 0;
|
||
|
private $_webServiceKey = '';
|
||
|
private $_mondialRelay = NULL;
|
||
|
private $_markCode = '';
|
||
|
|
||
|
private $_resultList = array(
|
||
|
'error' => array(),
|
||
|
'success' => array());
|
||
|
|
||
|
private $_webserviceURL = 'http://www.mondialrelay.fr/webservice/Web_Services.asmx?WSDL';
|
||
|
|
||
|
public function __construct($params)
|
||
|
{
|
||
|
$this->_relayPointNumList = $params['relayPointNumList'];
|
||
|
$this->_id_address_delivery = (int)($params['id_address_delivery']);
|
||
|
$this->_webServiceKey = Configuration::get('MR_KEY_WEBSERVICE');
|
||
|
$this->_markCode = Configuration::get('MR_CODE_MARQUE');
|
||
|
}
|
||
|
|
||
|
public function __destruct()
|
||
|
{
|
||
|
unset($this->_mondialRelay);
|
||
|
}
|
||
|
|
||
|
public function init()
|
||
|
{
|
||
|
$this->_mondialRelay = new MondialRelay();
|
||
|
$address = new Address($this->_id_address_delivery);
|
||
|
|
||
|
if (!$address)
|
||
|
throw new Exception($this->_mondialrelay->l('Customer address can\'t be found'));
|
||
|
|
||
|
$this->_fields['list']['Enseigne']['value'] = Configuration::get('MR_ENSEIGNE_WEBSERVICE');
|
||
|
$this->_fields['list']['Pays']['value'] = Country::getIsoById($address->id_country);
|
||
|
|
||
|
foreach ($this->_relayPointNumList as $num)
|
||
|
{
|
||
|
// Storage temporary
|
||
|
$base = $this->_fields;
|
||
|
$tmp = &$base['list'];
|
||
|
|
||
|
$tmp['Num']['value'] = $num;
|
||
|
$this->_fieldsList[] = $base;
|
||
|
}
|
||
|
$this->_generateMD5SecurityKey();
|
||
|
unset($address);
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* Generate the MD5 key for each param list
|
||
|
*/
|
||
|
private function _generateMD5SecurityKey()
|
||
|
{
|
||
|
// RootCase is the array case where the main information are stored
|
||
|
// it's an array containing id_mr_selected and an array with the necessary fields
|
||
|
foreach($this->_fieldsList as &$rootCase)
|
||
|
{
|
||
|
$concatenationValue = '';
|
||
|
foreach($rootCase['list'] as $paramName => &$valueDetailed)
|
||
|
if ($paramName != 'Texte' && $paramName != 'Security')
|
||
|
{
|
||
|
// Mac server make an empty string instead of a cleaned string
|
||
|
// TODO : test on windows and linux server
|
||
|
$cleanedString = MRTools::replaceAccentedCharacters($valueDetailed['value']);
|
||
|
$valueDetailed['value'] = !empty($cleanedString) ? strtoupper($cleanedString) : strtoupper($valueDetailed['value']);
|
||
|
|
||
|
// Call a pointer function if exist to do different test
|
||
|
if (isset($valueDetailed['methodValidation']) &&
|
||
|
method_exists('MRTools', $valueDetailed['methodValidation']) &&
|
||
|
isset($valueDetailed['params']) &&
|
||
|
MRTools::$valueDetailed['methodValidation']($valueDetailed['value'], $valueDetailed['params']))
|
||
|
$concatenationValue .= $valueDetailed['value'];
|
||
|
// Use simple Regex test given by MondialRelay
|
||
|
else if (isset($valueDetailed['regexValidation']) &&
|
||
|
preg_match($valueDetailed['regexValidation'], $valueDetailed['value'], $matches))
|
||
|
$concatenationValue .= $valueDetailed['value'];
|
||
|
// If the key is required, we set an error, else it's skipped
|
||
|
else if ((!strlen($valueDetailed['value']) && $valueDetailed['required']) || strlen($valueDetailed['value']))
|
||
|
{
|
||
|
if (empty($valueDetailed['value']))
|
||
|
$error = $this->_mondialRelay->l('This key').' ['.$paramName.'] '.$this->_mondialRelay->l('is empty and need to be filled');
|
||
|
else
|
||
|
$error = 'This key ['.$paramName.'] hasn\'t a valid value format : '.$valueDetailed['value'];
|
||
|
$this->_resultList['error'][$rootCase['list']['Num']['value']] = $error;
|
||
|
}
|
||
|
}
|
||
|
$concatenationValue .= $this->_webServiceKey;
|
||
|
$rootCase['list']['Security']['value' ] = strtoupper(md5($concatenationValue));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* Get the values with associated fields name
|
||
|
* @fields : array containing multiple values information
|
||
|
*/
|
||
|
private function _getSimpleParamArray($fields)
|
||
|
{
|
||
|
$params = array();
|
||
|
|
||
|
foreach($fields as $keyName => $valueDetailed)
|
||
|
$params[$keyName] = $valueDetailed['value'];
|
||
|
return $params;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* Manage the return value of the webservice, handle the errors or build the
|
||
|
* succeed message
|
||
|
*/
|
||
|
private function _parseResult($client, $result, $params)
|
||
|
{
|
||
|
$errors = array();
|
||
|
|
||
|
if ($client->fault)
|
||
|
$errors[$errorTotal++] = $this->_mondialRelay->l('It seems the request isn\'t valid:').
|
||
|
$result;
|
||
|
$result = $result['WSI2_DetailPointRelaisResult'];
|
||
|
if (($errorNumber = $result['STAT']) != 0)
|
||
|
{
|
||
|
$errors[] = $this->_mondialRelay->l('There is an error number : ').$errorNumber;
|
||
|
$errors[] = $this->_mondialRelay->l('Details : ').
|
||
|
$this->_mondialRelay->getErrorCodeDetail($errorNumber);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
$HDayList = array(
|
||
|
'Horaires_Lundi' => $this->_mondialRelay->l('Monday'),
|
||
|
'Horaires_Mardi' => $this->_mondialRelay->l('Tuesday'),
|
||
|
'Horaires_Mercredi' => $this->_mondialRelay->l('Wednesday'),
|
||
|
'Horaires_Jeudi' => $this->_mondialRelay->l('Thursday'),
|
||
|
'Horaires_Vendredi' => $this->_mondialRelay->l('Friday'),
|
||
|
'Horaires_Samedi' => $this->_mondialRelay->l('Saturday'),
|
||
|
'Horaires_Dimanche' => $this->_mondialRelay->l('Sunday'));
|
||
|
|
||
|
$orderedDate = array();
|
||
|
// Format hour properly
|
||
|
$priority = 0;
|
||
|
foreach($HDayList as $day => $tradDayName)
|
||
|
{
|
||
|
foreach($result[$day]['string'] as $num => &$value)
|
||
|
if ($value == '0000')
|
||
|
$value = '';
|
||
|
else
|
||
|
$value = implode('h', str_split($value, 2));
|
||
|
$orderedDate[$priority++] = array('name' => $tradDayName, 'list' => $result[$day]);
|
||
|
unset($result[$day]);
|
||
|
}
|
||
|
$result['orderedDate'] = $orderedDate;
|
||
|
$this->_resultList['success'][$result['Num']] = $result;
|
||
|
}
|
||
|
$this->_resultList['error'][] = $errors;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* Send one or multiple request to the webservice
|
||
|
*/
|
||
|
public function send()
|
||
|
{
|
||
|
if ($client = new nusoap_client($this->_webserviceURL, true))
|
||
|
{
|
||
|
$client->soap_defencoding = 'UTF-8';
|
||
|
$client->decode_utf8 = false;
|
||
|
|
||
|
foreach($this->_fieldsList as $rootCase)
|
||
|
{
|
||
|
$params = $this->_getSimpleParamArray($rootCase['list']);
|
||
|
$result = $client->call(
|
||
|
'WSI2_DetailPointRelais',
|
||
|
$params,
|
||
|
'http://www.mondialrelay.fr/webservice/',
|
||
|
'http://www.mondialrelay.fr/webservice/WSI2_GetEtiquettes');
|
||
|
|
||
|
$this->_parseResult($client, $result, $params);
|
||
|
}
|
||
|
unset($client);
|
||
|
}
|
||
|
else
|
||
|
throw new Exception($this->_mondialRelay->l('The Mondial Relay webservice isn\'t currently reliable'));
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
** Generate a list of perma link
|
||
|
*/
|
||
|
static public function getPermaLink($relayList, $id_address_delivery)
|
||
|
{
|
||
|
if (!($address = new Address($id_address_delivery)))
|
||
|
return array();
|
||
|
|
||
|
$permaList = array();
|
||
|
$iso = strtoupper(Country::getIsoById($address->id_country));
|
||
|
$ens = strtoupper(Configuration::get('MR_ENSEIGNE_WEBSERVICE').Configuration::get('MR_CODE_MARQUE'));
|
||
|
$url = 'http://www.mondialrelay.com/public/permanent/details_relais.aspx?ens='.
|
||
|
Configuration::get('MR_ENSEIGNE_WEBSERVICE').Configuration::get('MR_CODE_MARQUE');
|
||
|
foreach($relayList as $num => $relayNum)
|
||
|
{
|
||
|
$crc = strtoupper(MD5('<'.$ens.'>'.$relayNum.$iso.'<'.Configuration::get('MR_KEY_WEBSERVICE').'>'));
|
||
|
$permaList[$relayNum] = $url.'&num='.$relayNum.'&pays='.$iso.'&crc='.$crc;
|
||
|
}
|
||
|
unset($address);
|
||
|
return $permaList;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* Get the values with associated fields name
|
||
|
*/
|
||
|
public function getFieldsList()
|
||
|
{
|
||
|
return $this->_fieldsList['list'];
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* Get the result of one or multiple send request
|
||
|
*/
|
||
|
public function getResult()
|
||
|
{
|
||
|
return $this->_resultList;
|
||
|
}
|
||
|
}
|