%PDF- %PDF-
| Direktori : /home/bitrix/www/bitrix/modules/sale/handlers/delivery/spsr/ |
| Current File : /home/bitrix/www/bitrix/modules/sale/handlers/delivery/spsr/tracking.php |
<?php
namespace Sale\Handlers\Delivery;
use Bitrix\Sale\Order;
use Bitrix\Main\Error;
use Bitrix\Sale\Result;
use Bitrix\Main\Loader;
use Bitrix\Main\Text\Encoding;
use Bitrix\Main\Localization\Loc;
use Sale\Handlers\Delivery\Spsr\Request;
use Bitrix\Sale\Delivery\Tracking\Statuses;
use Bitrix\Sale\Delivery\Tracking\StatusResult;
Loc::loadMessages(__FILE__);
Loader::registerAutoLoadClasses(
'sale',
array(
'Sale\Handlers\Delivery\SpsrHandler' => 'handlers/delivery/spsr/handler.php',
'Sale\Handlers\Delivery\Spsr\Request' => 'handlers/delivery/spsr/request.php',
)
);
/**
* Class SpsrTracking
* @package \Sale\Handlers\Delivery;
*/
class SpsrTracking extends \Bitrix\Sale\Delivery\Tracking\Base
{
/** @var \Sale\Handlers\Delivery\SpsrHandler */
protected $deliveryService;
/**
* @return string
*/
public function getClassTitle()
{
return Loc::getMessage("SALE_DLV_SRV_SPSR_T_TITLE");
}
/**
* @return string
*/
public function getClassDescription()
{
return Loc::getMessage(
"SALE_DLV_SRV_SPSR_T_DESCR",
array(
'#A1#' => '<a href="http://www.spsr.ru/">',
'#A2#' => '</a>'
)
);
}
/**
* @param array $shipmentData
* @return StatusResult.
*/
public function getStatusShipment($shipmentData)
{
$results = $this->getStatusesShipment(array($shipmentData));
$result = new StatusResult();
if($results->isSuccess())
{
/** @var StatusResult $statusResult */
foreach($results->getData() as $statusResult)
if($statusResult->trackingNumber == $shipmentData['TRACKING_NUMBER'])
return $statusResult;
}
else
{
$result->addErrors($results->getErrors());
}
return $result;
}
/**
* @param int $orderId
* @param int $shipmentId
* @return \Bitrix\Sale\Internals\CollectableEntity|bool|null
* @throws \Bitrix\Main\ArgumentNullException
*/
private function getShipment($orderId, $shipmentId)
{
if($orderId <= 0)
return null;
$order = Order::load($orderId);
if(!$order)
return null;
$sCollect = $order->getShipmentCollection();
if(!$sCollect)
return null;
return $sCollect->getItemById($shipmentId);
}
/**
* @param array $shipmentsData
* @return Result
*/
public function getStatusesShipment(array $shipmentsData)
{
$result = new Result();
if(empty($shipmentsData))
return $result;
/** @var SpsrHandler $parentService */
$parentService = $this->deliveryService->getParentService();
if(!$parentService)
return $result;
$reqParams = array();
foreach($shipmentsData as $shipmentFields)
{
$shipment = $this->getShipment($shipmentFields['ORDER_ID'], $shipmentFields['SHIPMENT_ID']);
/** @var \Bitrix\Sale\Result $res */
$res = $parentService->getSidResult($shipment);
if($res->isSuccess())
{
$data = $res->getData();
$sid = $data[0];
}
else
{
$sid = "";
}
$icn = $parentService->getICN($shipment);
if(!is_array($reqParams[$sid.'_'.$icn]))
$reqParams[$sid.'_'.$icn] = array( 'SID' => $sid, 'ICN' => $icn, 'TRACK_NUMBERS' => array());
$reqParams[$sid.'_'.$icn]['TRACK_NUMBERS'][] = $shipmentFields['TRACKING_NUMBER'];
}
foreach($reqParams as $params)
{
$res = $this->requestStatuses($params['SID'], $params['ICN'], $params['TRACK_NUMBERS']);
if(!$res->isSuccess())
$result->addErrors($res->getErrors());
$result->setData($res->getData());
}
return $result;
}
public function requestStatuses($sid, $icn, $trackingNumbers)
{
$result = new Result();
$request = new Request();
$resultData = array();
$reqRes = $request->getInvoicesInfo(
$sid,
$icn,
LANGUAGE_ID,
$trackingNumbers
);
/** @var \Bitrix\Sale\Result $reqRes */
if($reqRes->isSuccess())
{
$invoicesInfo = $reqRes->getData();
if(!empty($invoicesInfo['root']['#']['Invoices'][0]['#']['Invoice']) && is_array($invoicesInfo['root']['#']['Invoices'][0]['#']['Invoice']))
{
foreach($invoicesInfo['root']['#']['Invoices'][0]['#']['Invoice'] as $invoice)
{
if(!in_array($invoice['@']['InvoiceNumber'], $trackingNumbers))
continue;
$r = new StatusResult();
if(!empty($invoice['#']['events'][0]['#']['event']) && is_array($invoice['#']['events'][0]['#']['event']))
{
$lastEvent = end($invoice['#']['events'][0]['#']['event']);
$r->status = $this->translateStatus($lastEvent['@']['EventNumCode']);
$r->description = $lastEvent['@']['EventName'];
$r->lastChangeTimestamp = $this->translateDate($lastEvent['@']['Date']);
$r->trackingNumber = $invoice['@']['InvoiceNumber'];
}
else
{
$r->addError(new Error(Loc::getMessage('SALE_DLV_SRV_SPSR_T_ERROR_DATA')));
}
$resultData[] = $r;
}
}
elseif(!empty($invoicesInfo['root']['#']['NotFound'][0]['#']['Invoice']) && is_array($invoicesInfo['root']['#']['NotFound'][0]['#']['Invoice']))
{
foreach($invoicesInfo['root']['#']['NotFound'][0]['#']['Invoice'] as $invoice)
{
$r = new StatusResult();
$r->trackingNumber = $invoice['@']['InvoiceNumber'];
$r->addError(
new Error(
self::utfDecode(
$invoice['@']['ErrorMessage']
)
)
);
$resultData[] = $r;
}
}
else
{
$result->addError(new Error(Loc::getMessage('SALE_DLV_SRV_SPSR_T_ERROR_DATA')));
}
}
else
{
$result->addErrors($reqRes->getErrors());
}
if(!empty($resultData))
$result->setData($resultData);
return $result;
}
protected static function translateStatus($externalStatus)
{
if(strlen($externalStatus) <= 0)
return Statuses::UNKNOWN;
$statusMaps = array(
Statuses::WAITING_SHIPMENT => array(),
Statuses::ON_THE_WAY => array(2, 4, 6, 12, 13, 14, 17, 29, 30, 33, 34, 35, 39, 40, 41, 42, 43, 44, 45, 46,
47, 48, 49, 50, 51, 53, 54, 105, 106, 107, 108, 109, 110, 111, 115, 119, 120, 122, 100, 32, 63, 64, 66,
67, 74, 75, 76, 78, 79, 81, 84, 85, 86, 96),
Statuses::ARRIVED => array(1, 8, 26, 31, ),
Statuses::HANDED => array(15, 16, 27, 37, 55, 56, 57, 58, 59, 60, 61, 62, 92, 93, 112, 114, 116 ),
Statuses::PROBLEM => array(5, 7, 9, 10, 11, 18, 19, 20, 21, 22, 23, 24, 25, 28, 36, 38, 52, 113, 117, 123,
124, 125, 126, 127, 128,129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 65, 68, 69,
70, 71, 72, 73, 77, 80, 82, 83, 87, 88, 89, 90, 91, 94, 95, 97, 98, 99, 101, 102, 103, 104, 143, 144,
145, 146, 147, 148, 150, 175),
);
foreach($statusMaps as $internalStatus => $map)
if(in_array($externalStatus, $map))
return $internalStatus;
return Statuses::UNKNOWN;
}
protected static function translateDate($externalDate)
{
$date = new \DateTime($externalDate);
return $date->getTimestamp();
}
/**
* @return array
*/
public function getParamsStructure()
{
return array();
}
protected static function utfDecode($str)
{
if(strtolower(SITE_CHARSET) != 'utf-8')
$str = Encoding::convertEncoding($str, 'UTF-8', SITE_CHARSET);
return $str;
}
/**
* @param string $trackingNumber
* @return string Url were we can see tracking information
*/
public function getTrackingUrl($trackingNumber = '')
{
return 'http://www.spsr.ru/ru/service/monitoring';
}
}