%PDF- %PDF-
| Direktori : /home/bitrix/www/bitrix/modules/sale/ru/delivery/pecom/ |
| Current File : //home/bitrix/www/bitrix/modules/sale/ru/delivery/pecom/adapter.php |
<?php
namespace Bitrix\Sale\Delivery\Pecom;
use Bitrix\Sale\Location\LocationTable;
/**
* Class Adapter
* @package Bitrix\Sale\Delivery\Pecom
*/
class Adapter
{
public static function preparePreregistrationReqData($arOrder, $profileId, $arConfig)
{
$result = array();
$result["sender"] = array(
"inn" => $arConfig["INN"]["VALUE"],
"city" => static::getFilialAndCity($arConfig["CITY_DELIVERY"]["VALUE"]),
"title" => $arConfig["NAME"]["VALUE"],
"phone" => $arConfig["PHONE"]["VALUE"],
);
$inn = "";
$city = "";
$title = "";
$phone = "";
$address = "";
if(isset($extraParams["location"]))
$city = $extraParams["location"];
$dbOrderProps = \CSaleOrderPropsValue::GetOrderProps($arOrder["ID"]);
while ($arOrderProps = $dbOrderProps->Fetch())
{
if($arOrderProps["CODE"] == "COMPANY" || $arOrderProps["CODE"] == "FIO")
$title = $arOrderProps["VALUE"];
if($arOrderProps["CODE"] == "INN")
$inn = $arOrderProps["VALUE"];
if($arOrderProps["CODE"] == "PHONE")
$phone = $arOrderProps["VALUE"];
if($arOrderProps["CODE"] == "LOCATION")
{
$location = $arOrderProps["VALUE"];
$locDelivery = Adapter::mapLocation($location); // todo: if more than one
$city = static::getFilialAndCity(key($locDelivery));
}
if($arOrderProps["CODE"] == "ADDRESS")
$address = $arOrderProps["VALUE"];
}
$arPacks = \CSaleDeliveryHelper::getBoxesFromConfig($profileId, $arConfig);
$arPackagesParams = \CSaleDeliveryHelper::getRequiredPacks(
$arOrder["ITEMS"],
$arPacks,
0);
$result["cargos"] = array(
array(
"common" => array(
"positionsCount" => count($arPackagesParams),
"decription" => GetMessage("SALE_DH_PECOM_DESCRIPTION_GOODS"),
"orderNumber" => $arOrder["ACCOUNT_NUMBER"],
"paymentForm" => $arConfig["PAYMENT_FORM"]["VALUE"],
"accompanyingDocuments" => false
),
"receiver" => array(
"inn" => $inn,
"city" => $city,
"title" => $title,
"phone" => $phone,
"addressStock" => $address
),
"services" => array(
"transporting" =>array(
"payer" => array(
"type" => 1
)
),
"hardPacking" => array(
"enabled" => \CDeliveryPecom::isConfCheckedVal($arConfig, 'SERVICE_OTHER_RIGID_PACKING'),
"payer" => array(
"type" => \CDeliveryPecom::getConfValue($arConfig, 'SERVICE_OTHER_RIGID_PAYER')
)
),
//!hardPacking or palletTransporting - not both
"palletTransporting" => array(
"enabled" => !\CDeliveryPecom::isConfCheckedVal($arConfig, 'SERVICE_OTHER_RIGID_PACKING') && \CDeliveryPecom::isConfCheckedVal($arConfig, 'SERVICE_OTHER_PALLETE'),
"payer" => array(
"type" => \CDeliveryPecom::getConfValue($arConfig, 'SERVICE_OTHER_PALLETE_PAYER')
)
),
"insurance" => array(
"enabled" => \CDeliveryPecom::isConfCheckedVal($arConfig, 'SERVICE_OTHER_INSURANCE'),
"payer" => array(
"type" => \CDeliveryPecom::getConfValue($arConfig, 'SERVICE_OTHER_INSURANCE_PAYER')
),
"cost" => intval($arOrder["PRICE"])
),
"sealing" => array(
"enabled" => \CDeliveryPecom::isConfCheckedVal($arConfig, 'SERVICE_OTHER_PLOMBIR_ENABLE'),
"payer" => array(
"type" => \CDeliveryPecom::getConfValue($arConfig, 'SERVICE_OTHER_PLOMBIR_PAYER')
)
),
"strapping" => array(
"enabled" => false
),
"documentsReturning" => array(
"enabled" => false
),
"delivery" => array(
"enabled" => \CDeliveryPecom::isConfCheckedVal($arConfig, 'SERVICE_DELIVERY_ENABLED'),
"payer" => array(
"type" => \CDeliveryPecom::getConfValue($arConfig, 'SERVICE_OTHER_DELIVERY_PAYER')
)
)
)
)
);
return $result;
}
protected static function getUpperCityId($locationId)
{
if(strlen($locationId) <= 0)
return 0;
$res = LocationTable::getList(array(
'filter' => array(
array(
'LOGIC' => 'OR',
'=CODE' => $locationId,
'=ID' => $locationId
),
'=PARENTS.TYPE.CODE' => 'CITY',
),
'select' => array(
'ID', 'CODE',
'PID' => 'PARENTS.ID',
)
));
if($loc = $res->fetch())
return $loc['PID'];
return 0;
}
protected static function mapLocation2($internalLocationId)
{
if(intval($internalLocationId) <=0)
return array();
static $result = array();
if(!isset($result[$internalLocationId]))
{
$result[$internalLocationId] = array();
$internalLocation = \CSaleHelper::getLocationByIdHitCached($internalLocationId);
$externalId = Location::getExternalId($internalLocationId);
//Let's try to find upper city
if(strlen($externalId) <= 0)
{
$cityId = self::getUpperCityId($internalLocationId);
$externalId = Location::getExternalId($cityId);
}
if(strlen($externalId) > 0)
{
$result[$internalLocationId] = array(
$externalId => !empty($internalLocation["CITY_NAME_LANG"]) ? $internalLocation["CITY_NAME_LANG"] : ""
);
}
}
return $result[$internalLocationId];
}
/**
* Returns Pecom .location id
* @param $locationId - Bitrix location id
* @param bool $cleanCache
* @return array - Pecom location(s) id
*/
public static function mapLocation($locationId, $cleanCache = false)
{
if(Location::isInstalled())
return self::mapLocation2($locationId);
$cityName = static::getCityNameFromLocationId($locationId);
if(!$cityName)
return array();
$ttl = 2592000;
$cacheId = "SaleDeliveryPecomMapLocations".$locationId;
$data = array();
$cacheManager = \Bitrix\Main\Application::getInstance()->getManagedCache();
if($cleanCache)
{
$cacheManager->clean($cacheId);
}
if($cacheManager->read($ttl, $cacheId))
{
$data = $cacheManager->get($cacheId);
}
if(empty($data))
{
$pecCities = static::getAllPecomCities();
$data = array();
foreach($pecCities as $key => $cities)
{
foreach($cities as $smallCityKey => $smallCityName)
{
$pos = strpos($smallCityName, $cityName);
if($pos !== false
&& (
strlen($cityName) == strlen($smallCityName)
|| (
substr($smallCityName,$pos+strlen($cityName), 1) == " "
&& (
$pos == 0
|| substr($smallCityName,$pos-1, 1) == " "
)
)
)
)
{
$data[$smallCityKey] = $smallCityName;
}
}
}
$cacheManager->set($cacheId, $data);
}
return $data;
}
public static function getAllPecomCities($cleanCache = false)
{
global $APPLICATION;
$ttl = 2592000;
$data = array();
$cacheId = "SaleDeliveryPecomCities";
$cacheManager = \Bitrix\Main\Application::getInstance()->getManagedCache();
if($cleanCache)
{
$cacheManager->clean($cacheId);
}
if($cacheManager->read($ttl, $cacheId))
{
$data = $cacheManager->get($cacheId);
}
if(empty($data))
{
$http = new \Bitrix\Main\Web\HttpClient(array(
"version" => "1.1",
"socketTimeout" => 30,
"streamTimeout" => 30,
"redirect" => true,
"redirectMax" => 5,
"disableSslVerification" => true
));
$jsnData = $http->get("http://www.pecom.ru/ru/calc/towns.php");
$errors = $http->getError();
if (!$jsnData && !empty($errors))
{
$strError = "";
foreach($errors as $errorCode => $errMes)
$strError .= $errorCode.": ".$errMes;
\CEventLog::Add(array(
"SEVERITY" => "ERROR",
"AUDIT_TYPE_ID" => "SALE_DELIVERY",
"MODULE_ID" => "sale",
"ITEM_ID" => "PECOM_GET_TOWNS",
"DESCRIPTION" => $strError,
));
}
$data = json_decode($jsnData, true);
if(strtolower(SITE_CHARSET) != 'utf-8')
{
$data = $APPLICATION->ConvertCharsetArray($data, 'utf-8', SITE_CHARSET);
if(is_array($data))
{
foreach($data as $key => $value)
{
$newKey = $APPLICATION->ConvertCharset($key, 'utf-8', SITE_CHARSET);
$data[$newKey] = $value;
unset($data[$key]);
}
}
}
if(!is_array($data))
$data = array();
$cacheManager->set($cacheId, $data);
}
return $data;
}
public static function getCityNameFromLocationId($locationId)
{
$loc = \CSaleLocation::GetById($locationId);
return isset($loc["CITY_NAME_LANG"]) ? $loc["CITY_NAME_LANG"] : false;
}
public static function getFilialAndCity($cityId)
{
$result = false;
$ttl = 2592000;
$cacheId = "SaleDeliveryPecomFilialAndCity".$cityId;
$cacheManager = \Bitrix\Main\Application::getInstance()->getManagedCache();
if(strlen($cityId) > 0)
{
if($cacheManager->read($ttl, $cacheId))
{
$result = $cacheManager->get($cacheId);
}
else
{
$locations = static::getAllPecomCities();
foreach($locations as $filial => $cities)
{
foreach($cities as $cId => $city)
{
if($cityId == $cId)
{
$result = $filial;
if($filial != $city)
{
$arCity = explode(" ", $city);
$result .= " ".$arCity[0];
}
break;
}
}
}
$cacheManager->set($cacheId, $result);
}
}
return $result;
}
public static function prepareSubscribeReqData($arCargoCodes, $email = "", $phone = "")
{
$arData = array();
if(is_array($arCargoCodes) && !empty($arCargoCodes) && (strlen($email) > 0 || strlen($phone) > 0))
{
$arData["cargoCodes"] = $arCargoCodes;
if(strlen($email) > 0)
$arData["email"] = $email;
if(strlen($phone) > 0)
$arData["phone"] = $phone;
}
return $arData;
}
}