/********************************************************************************
* Delivery services http://pecom.ru/
* https://kabinet.pecom.ru/api/v1/
*******************************************************************************/
use \Bitrix\Main\Loader;
use \Bitrix\Sale\Result;
use \Bitrix\Sale\Shipment;
Loader::includeModule("sale");
Loader::registerAutoLoadClasses(
'sale',
array(
'Bitrix\\Sale\\Delivery\\Pecom\\Request' => 'ru/delivery/pecom/request.php',
'Bitrix\\Sale\\Delivery\\Pecom\\Adapter' => 'ru/delivery/pecom/adapter.php',
'Bitrix\\Sale\\Delivery\\Pecom\\Calculator' => 'ru/delivery/pecom/calculator.php',
'Bitrix\\Sale\\Delivery\\Pecom\\Location' => 'ru/delivery/pecom/location.php'
)
);
use Bitrix\Sale\Delivery\Pecom\Adapter;
use Bitrix\Sale\Delivery\Pecom\Request;
use Bitrix\Sale\Delivery\Pecom\Calculator;
use Bitrix\Sale\Delivery\Pecom\Location;
IncludeModuleLangFile($_SERVER["DOCUMENT_ROOT"].'/bitrix/modules/sale/delivery/delivery_pecom.php');
require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/sale/lib/delivery/inputs.php");
class CDeliveryPecom
{
public static $EXTRA_DEMENSIONS_WEIGHT = 1000; // (kg)
public static $EXTRA_DIMENSIONS_SIZE = 5; // (m)
public static $PAYER_SHOP = "1";
public static $PAYER_BUYER = "2";
public static function Init()
{
return array(
/* Basic description */
'SID' => 'pecom',
'NAME' => GetMessage('SALE_DH_PECOM_NAME'),
'DESCRIPTION' => GetMessage('SALE_DH_PECOM_DESCRIPTION').' http://pecom.ru',
'DESCRIPTION_INNER' => GetMessage('SALE_DH_PECOM_DESCRIPTION').' http://pecom.ru',
'BASE_CURRENCY' => 'RUB',
'HANDLER' => __FILE__,
/* Handler methods */
'DBGETSETTINGS' => array('CDeliveryPecom', 'getSettings'),
'DBSETSETTINGS' => array('CDeliveryPecom', 'setSettings'),
'GETCONFIG' => array('CDeliveryPecom', 'getConfig'),
'GETFEATURES' => array('CDeliveryPecom', 'getFeatures'),
'COMPABILITY' => array('CDeliveryPecom', 'compability'),
'CALCULATOR' => array('CDeliveryPecom', 'calculate'),
'GETEXTRAINFOPARAMS' => array('CDeliveryPecom', 'getExtraInfoParams'),
'GETORDERSACTIONSLIST' => array('CDeliveryPecom', 'getActionsList'),
'EXECUTEACTION' => array('CDeliveryPecom', 'executeAction'),
'GET_ADMIN_MESSAGE' => array('CDeliveryPecom', 'getAdminMessage'),
'EXEC_ADMIN_ACTION' => array('CDeliveryPecom', 'execAdminAction'),
'GET_ADD_INFO_SHIPMENT_VIEW' => array('CDeliveryPecom', 'getAdditionalInfoShipmentView'),
'GET_ADD_INFO_SHIPMENT_EDIT' => array('CDeliveryPecom', 'getAdditionalInfoShipmentEdit'),
'PROCESS_ADD_INFO_SHIPMENT_EDIT' => array('CDeliveryPecom', 'processAdditionalInfoShipmentEdit'),
/* List of delivery profiles */
"PROFILES" => array(
"auto" => array(
"TITLE" => GetMessage("SALE_DH_PECOM_AUTO_TITLE"),
"DESCRIPTION" => GetMessage("SALE_DH_PECOM_AUTO_DESCR"),
'RESTRICTIONS_WEIGHT' => array(0, 0),
'RESTRICTIONS_SUM' => array(0),
'TAX_RATE' => 0,
'RESTRICTIONS_DIMENSIONS' => array("425", "265", "380")
),
"avia" => array(
"TITLE" => GetMessage("SALE_DH_PECOM_AVIA_TITLE"),
"DESCRIPTION" => GetMessage("SALE_DH_PECOM_AVIA_DESCR"),
'RESTRICTIONS_WEIGHT' => array(0, 0),
'RESTRICTIONS_SUM' => array(0),
'TAX_RATE' => 0,
'RESTRICTIONS_DIMENSIONS' => array("425", "265", "380")
)
)
);
}
public static function getExtraInfoParams($arOrder, $arConfig, $profileId, $siteId)
{
$result = array();
$locationsTo = Adapter::mapLocation($arOrder["LOCATION_TO"]);
if(count($locationsTo) > 1)
{
$locValues = array();
foreach($locationsTo as $locId => $locName)
{
$locValues[$locId] = $locName;
}
$result["location"] = array(
"TYPE" => "DROPDOWN",
"TITLE" => GetMessage("SALE_DH_PECOM_EXTRA_LOCATION"),
"VALUES" => $locValues
);
}
return $result;
}
public static function getConfig($siteId = false)
{
$shopLocationId = CSaleHelper::getShopLocationId($siteId);
$arShopLocation = CSaleHelper::getLocationByIdHitCached($shopLocationId);
$locDescription = [];
if (!empty($arShopLocation) && is_array($arShopLocation))
{
$descriptionFields = [
'COUNTRY_NAME_LANG',
'REGION_NAME_LANG',
'CITY_NAME_LANG',
];
foreach ($descriptionFields as $fieldName)
{
$value = trim((string)($arShopLocation[$fieldName] ?? ''));
if ($value !== '')
{
$locDescription[] = $value;
}
}
}
$locString = implode(', ', $locDescription);
$locDelivery = Adapter::mapLocation($shopLocationId);
$arConfig = array(
'CONFIG_GROUPS' => array(
'exchange_sett' => GetMessage('SALE_DH_PECOM_EXCH_TITLE'),
'add_services' => GetMessage('SALE_DH_PECOM_ADD_SERVICES_TITLE'),
'auto' => GetMessage('SALE_DH_PECOM_AUTO_TITLE'),
'avia' => GetMessage('SALE_DH_PECOM_AVIA_TITLE'),
),
"CONFIG" => array(
"LOGIN" => array(
"DEFAULT" => '',
"TITLE" => GetMessage('SALE_DH_PECOM_EXCH_LOGIN'),
"GROUP" => "exchange_sett"
),
"KEY" => array(
"DEFAULT" => '',
"TITLE" => GetMessage('SALE_DH_PECOM_EXCH_KEY'),
"GROUP" => "exchange_sett"
),
"NAME" => array(
"DEFAULT" => '',
"TITLE" => GetMessage('SALE_DH_PECOM_EXCH_NAME'),
"GROUP" => "exchange_sett"
),
"INN" => array(
"DEFAULT" => '',
"TITLE" => GetMessage('SALE_DH_PECOM_EXCH_INN'),
"GROUP" => "exchange_sett"
),
"CITY" => array(
"TYPE" => "TEXT_RO",
"TITLE" => GetMessage('SALE_DH_PECOM_EXCH_CITY'),
"DEFAULT" => $locString,
"GROUP" => "exchange_sett"
),
"CITY_DELIVERY" => array(
"TYPE" => "DROPDOWN",
"TITLE" => GetMessage('SALE_DH_PECOM_EXCH_CITY_DELIVERY'),
"VALUES" => $locDelivery,
"GROUP" => "exchange_sett"
),
"PHONE" => array(
"DEFAULT" => '',
"TITLE" => GetMessage('SALE_DH_PECOM_EXCH_PHONE'),
"GROUP" => "exchange_sett"
),
"PAYMENT_FORM" => array(
"TYPE" => "DROPDOWN",
"DEFAULT" => self::$PAYER_BUYER,
"TITLE" => GetMessage('SALE_DH_PECOM_AS_PAYMENT_FORM'),
"GROUP" => "exchange_sett",
"VALUES" => array(
self::$PAYER_SHOP => GetMessage('SALE_DH_PECOM_AS_PAYMENT_BANK'),
self::$PAYER_BUYER => GetMessage('SALE_DH_PECOM_AS_PAYMENT_KASSA')
)
),
"SERVICE_TAKE" => array(
'TYPE' => 'SECTION',
'TITLE' => GetMessage('SALE_DH_PECOM_AS_TAKE'),
'GROUP' => 'add_services',
),
"SERVICE_TAKE_ENABLED" => array(
'TYPE' => 'CHECKBOX',
'TITLE' => GetMessage('SALE_DH_PECOM_AS_TAKE_ENABLE'),
'GROUP' => 'add_services',
'DEFAULT' => '',
'HIDE_BY_NAMES' => array('SERVICE_TAKE_TENT_ENABLED', 'SERVICE_TAKE_HYDRO_ENABLED')
),
"SERVICE_TAKE_TENT_ENABLED" => array(
'TYPE' => 'CHECKBOX',
'TITLE' => GetMessage('SALE_DH_PECOM_AS_TAKE_TENT'),
'GROUP' => 'add_services',
'DEFAULT' => ''
),
"SERVICE_TAKE_HYDRO_ENABLED" => array(
'TYPE' => 'CHECKBOX',
'TITLE' => GetMessage('SALE_DH_PECOM_AS_TAKE_HYDRO'),
'GROUP' => 'add_services',
'DEFAULT' => ''
),
"SERVICE_DELIVERY" => array(
'TYPE' => 'SECTION',
'TITLE' => GetMessage('SALE_DH_PECOM_AS_DELIVERY'),
'GROUP' => 'add_services',
),
"SERVICE_DELIVERY_ENABLED" => array(
'TYPE' => 'CHECKBOX',
'TITLE' => GetMessage('SALE_DH_PECOM_AS_DELIVERY_ENABLE'),
'GROUP' => 'add_services',
'DEFAULT' => '',
'HIDE_BY_NAMES' => array('SERVICE_DELIVERY_TENT_ENABLED', 'SERVICE_DELIVERY_HYDRO_ENABLED', 'SERVICE_OTHER_DELIVERY_PAYER')
),
"SERVICE_DELIVERY_TENT_ENABLED" => array(
'TYPE' => 'CHECKBOX',
'TITLE' => GetMessage('SALE_DH_PECOM_AS_DELIVERY_TENT'),
'GROUP' => 'add_services',
'DEFAULT' => ''
),
"SERVICE_DELIVERY_HYDRO_ENABLED" => array(
'TYPE' => 'CHECKBOX',
'TITLE' => GetMessage('SALE_DH_PECOM_AS_DELIVERY_HYDRO'),
'GROUP' => 'add_services',
'DEFAULT' => ''
),
"SERVICE_OTHER_DELIVERY_PAYER" => array(
'TYPE' => 'DROPDOWN',
'TITLE' => GetMessage('SALE_DH_PECOM_AS_PAYER'),
'GROUP' => 'add_services',
'DEFAULT' => self::$PAYER_BUYER,
"VALUES" => array(
self::$PAYER_SHOP => GetMessage('SALE_DH_PECOM_AS_PAYER_SHOP'),
self::$PAYER_BUYER => GetMessage('SALE_DH_PECOM_AS_PAYER_BUYER')
)
),
"SERVICE_OTHER" => array(
'TYPE' => 'SECTION',
'TITLE' => GetMessage('SALE_DH_PECOM_AS_OTHER'),
'GROUP' => 'add_services',
),
"SERVICE_OTHER_PLOMBIR_ENABLE" => array(
'TYPE' => 'CHECKBOX',
'TITLE' => GetMessage('SALE_DH_PECOM_AS_OTHER_PLOMBIR_ENABLE'),
'GROUP' => 'add_services',
'DEFAULT' => '',
'HIDE_BY_NAMES' => array('SERVICE_OTHER_PLOMBIR_COUNT', 'SERVICE_OTHER_PLOMBIR_PAYER')
),
"SERVICE_OTHER_PLOMBIR_COUNT" => array(
'TYPE' => 'STRING',
'TITLE' => GetMessage('SALE_DH_PECOM_AS_OTHER_PLOMBIR_COUNT'),
'GROUP' => 'add_services',
'DEFAULT' => '0',
),
"SERVICE_OTHER_PLOMBIR_PAYER" => array(
'TYPE' => 'DROPDOWN',
'TITLE' => GetMessage('SALE_DH_PECOM_AS_PAYER'),
'GROUP' => 'add_services',
'DEFAULT' => self::$PAYER_BUYER,
"VALUES" => array(
self::$PAYER_SHOP => GetMessage('SALE_DH_PECOM_AS_PAYER_SHOP'),
self::$PAYER_BUYER => GetMessage('SALE_DH_PECOM_AS_PAYER_BUYER')
)
),
"SERVICE_OTHER_PALLETE" => array(
'TYPE' => 'CHECKBOX',
'TITLE' => GetMessage('SALE_DH_PECOM_AS_OTHER_PALLETE'),
'GROUP' => 'add_services',
'DEFAULT' => '',
'TOP_LINE' => 'Y',
'HIDE_BY_NAMES' => array('SERVICE_OTHER_PALLETE_PAYER')
),
"SERVICE_OTHER_PALLETE_PAYER" => array(
'TYPE' => 'DROPDOWN',
'TITLE' => GetMessage('SALE_DH_PECOM_AS_PAYER'),
'GROUP' => 'add_services',
'DEFAULT' => self::$PAYER_BUYER,
"VALUES" => array(
self::$PAYER_SHOP => GetMessage('SALE_DH_PECOM_AS_PAYER_SHOP'),
self::$PAYER_BUYER => GetMessage('SALE_DH_PECOM_AS_PAYER_BUYER')
)
),
"SERVICE_OTHER_INSURANCE" => array(
'TYPE' => 'CHECKBOX',
'TITLE' => GetMessage('SALE_DH_PECOM_AS_OTHER_INSURANCE'),
'GROUP' => 'add_services',
'DEFAULT' => '',
'TOP_LINE' => 'Y',
'HIDE_BY_NAMES' => array('SERVICE_OTHER_INSURANCE_PAYER')
),
"SERVICE_OTHER_INSURANCE_PAYER" => array(
'TYPE' => 'DROPDOWN',
'TITLE' => GetMessage('SALE_DH_PECOM_AS_PAYER'),
'GROUP' => 'add_services',
'DEFAULT' => self::$PAYER_BUYER,
"VALUES" => array(
self::$PAYER_SHOP => GetMessage('SALE_DH_PECOM_AS_PAYER_SHOP'),
self::$PAYER_BUYER => GetMessage('SALE_DH_PECOM_AS_PAYER_BUYER')
)
),
"SERVICE_OTHER_RIGID_PACKING" => array(
'TYPE' => 'CHECKBOX',
'TITLE' => GetMessage('SALE_DH_PECOM_AS_OTHER_RIGID_PACKING'),
'GROUP' => 'add_services',
'DEFAULT' => '',
'TOP_LINE' => 'Y',
'HIDE_BY_NAMES' => array('SERVICE_OTHER_RIGID_PAYER')
),
"SERVICE_OTHER_RIGID_PAYER" => array(
'TYPE' => 'DROPDOWN',
'TITLE' => GetMessage('SALE_DH_PECOM_AS_PAYER'),
'GROUP' => 'add_services',
'DEFAULT' => self::$PAYER_BUYER,
"VALUES" => array(
self::$PAYER_SHOP => GetMessage('SALE_DH_PECOM_AS_PAYER_SHOP'),
self::$PAYER_BUYER => GetMessage('SALE_DH_PECOM_AS_PAYER_BUYER')
)
)
)
);
$aviableBoxes = self::getAviableBoxes();
foreach ($aviableBoxes as $boxId => $arBox)
{
CSaleDeliveryHelper::makeBoxConfig($boxId, $arBox, 'auto', $arConfig);
CSaleDeliveryHelper::makeBoxConfig($boxId, $arBox, 'avia', $arConfig);
}
return $arConfig;
}
public static function getSettings($strSettings)
{
return unserialize($strSettings, ['allowed_classes' => false]);
}
public static function setSettings($arSettings)
{
unset($arSettings["CITY"]);
foreach ($arSettings as $key => $value)
{
if ($value <> '')
$arSettings[$key] = $value;
else
unset($arSettings[$key]);
}
return serialize($arSettings);
}
public static function getFeatures($arConfig)
{
$arResult = array();
$mesEnabled = GetMessage("SALE_DH_PECOM_FEATURE_ENABLED");
if($arConfig["SERVICE_TAKE_ENABLED"]["VALUE"] == "Y")
$arResult[GetMessage("SALE_DH_PECOM_AS_TAKE_ENABLE")] = $mesEnabled;
if($arConfig["SERVICE_TAKE_TENT_ENABLED"]["VALUE"] == "Y")
$arResult[GetMessage("SALE_DH_PECOM_AS_TAKE_TENT")] = $mesEnabled;
if($arConfig["SERVICE_TAKE_HYDRO_ENABLED"]["VALUE"] == "Y")
$arResult[GetMessage("SALE_DH_PECOM_AS_TAKE_HYDRO")] = $mesEnabled;
if($arConfig["SERVICE_DELIVERY_ENABLED"]["VALUE"] == "Y")
$arResult[GetMessage("SALE_DH_PECOM_AS_DELIVERY_ENABLE")] = $mesEnabled;
if($arConfig["SERVICE_DELIVERY_TENT_ENABLED"]["VALUE"] == "Y")
$arResult[GetMessage("SALE_DH_PECOM_AS_DELIVERY_TENT")] = $mesEnabled;
if($arConfig["SERVICE_DELIVERY_HYDRO_ENABLED"]["VALUE"] == "Y")
$arResult[GetMessage("SALE_DH_PECOM_AS_DELIVERY_HYDRO")] = $mesEnabled;
if($arConfig["SERVICE_OTHER_DELIVERY_PAYER"]["VALUE"] == self::$PAYER_SHOP)
$arResult[GetMessage("SALE_DH_PECOM_AS_PAYER")] = GetMessage('SALE_DH_PECOM_AS_PAYER_SHOP');
else
$arResult[GetMessage("SALE_DH_PECOM_AS_PAYER")] = GetMessage('SALE_DH_PECOM_AS_PAYER_BUYER');
if($arConfig["SERVICE_OTHER_PLOMBIR_ENABLE"]["VALUE"] == "Y")
$arResult[GetMessage("SALE_DH_PECOM_AS_OTHER_PLOMBIR_ENABLE")] = $mesEnabled;
if($arConfig["SERVICE_OTHER_PALLETE"]["VALUE"] == "Y")
$arResult[GetMessage("SALE_DH_PECOM_AS_OTHER_PALLETE")] = $mesEnabled;
if($arConfig["SERVICE_OTHER_INSURANCE"]["VALUE"] == "Y")
$arResult[GetMessage("SALE_DH_PECOM_AS_OTHER_INSURANCE")] = $mesEnabled;
if($arConfig["SERVICE_OTHER_RIGID_PACKING"]["VALUE"] == "Y")
$arResult[GetMessage("SALE_DH_PECOM_AS_OTHER_RIGID_PACKING")] = $mesEnabled;
return $arResult;
}
public static function calculate($profile, $arConfig, $arOrder, $STEP, $TEMP = false)
{
$ttl = 604800; //week
$cacheId = "SaleDeliveryPecomCalc_".$profile."_".md5(serialize($arConfig))."_".md5(serialize($arOrder));
$cacheManager = \Bitrix\Main\Application::getInstance()->getManagedCache();
if($cacheManager->read($ttl, $cacheId))
{
$result = $cacheManager->get($cacheId);
}
else
{
$calc = new Calculator($arOrder, $arConfig, $profile);
$result = $calc->getPriceInfo();
$cacheManager->set($cacheId, $result);
}
return $result;
}
public static function compability($arOrder, $arConfig)
{
$ttl = 604800;
$cacheId = "SaleDeliveryPecomCompability".$arConfig["CITY_DELIVERY"]["VALUE"].$arOrder["LOCATION_TO"];
$arResult = array();
$cacheManager = \Bitrix\Main\Application::getInstance()->getManagedCache();
if($cacheManager->read($ttl, $cacheId))
{
$arResult = $cacheManager->get($cacheId);
}
if(empty($arResult))
{
$calc = new Calculator($arOrder, $arConfig);
$arResult =$calc->getCompabilityInfo();
$cacheManager->set($cacheId, $arResult);
}
return $arResult;
}
public static function getConfValue(&$arConfig, $key)
{
return CSaleDeliveryHelper::getConfValue($arConfig[$key]);
}
public static function isConfCheckedVal(&$arConfig, $key)
{
return $arConfig[$key]['VALUE'] == 'Y'
||(
!isset($arConfig[$key]['VALUE'])
&& $arConfig[$key]['DEFAULT'] == 'Y'
);
}
public static function getActionsList()
{
$actions = CSaleDeliveryHandler::getActionsNames();
return array(
"REQUEST_SELF" => $actions["REQUEST_SELF"],
//"REQUEST_TAKE" => $actions["REQUEST_TAKE"]
);
}
protected static function sendRequest($apiLogin, $apiKey, $controller, $action, $data)
{
$pcr = new Request($apiLogin, $apiKey);
try
{
$requestResult = $pcr->send($controller, $action, $data);
if(isset($requestResult["error"]))
{
$result = array(
"RESULT" => "ERROR",
"TEXT" => $requestResult["error"]["title"].": ".$requestResult["error"]["message"],
"DATA" => $requestResult
);
}
else
{
$result = array(
"RESULT" => "OK",
"DATA" => $requestResult
);
}
}
catch(\Exception $e)
{
$result = array(
"RESULT" => "ERROR",
"TEXT" => $e->getMessage()
);
}
return $result;
}
protected static function getPhoneEmail($orderId)
{
$result = array(
"EMAIL" => "",
"PHONE" => ""
);
$dbOrderProps = \CSaleOrderPropsValue::GetOrderProps($orderId);
while ($arOrderProps = $dbOrderProps->Fetch())
{
if($arOrderProps["CODE"] == "EMAIL")
$result["EMAIL"] = $arOrderProps["VALUE"];
if($arOrderProps["CODE"] == "PHONE")
$result["PHONE"] = $arOrderProps["VALUE"];
}
return $result;
}
public static function executeAction($actionId, $profileId, $arOrder, $arConfig)
{
$reqResult = array();
$result = array();
switch($actionId)
{
case "REQUEST_SELF":
$controller = 'preregistration';
$action = 'submit';
$data = Adapter::preparePreregistrationReqData($arOrder, $profileId, $arConfig);
$reqResult = static::sendRequest($arConfig["LOGIN"]["VALUE"], $arConfig["KEY"]["VALUE"], $controller, $action, $data);
if( isset($reqResult["DATA"]["cargos"][0]["cargoCode"]))
{
$result["TRACKING_NUMBER"] = $reqResult["DATA"]["cargos"][0]["cargoCode"];
if(isset($reqResult["DATA"]["documentId"]))
$result["DELIVERY_DOC_NUM"] = $reqResult["DATA"]["documentId"];
$phoneAndEmail = static::getPhoneEmail($arOrder["ID"]);
$subsData = Adapter::prepareSubscribeReqData(
array($reqResult["DATA"]["cargos"][0]["cargoCode"]),
$phoneAndEmail["EMAIL"],
$phoneAndEmail["PHONE"]
);
$subsResult = static::sendRequest($arConfig["LOGIN"]["VALUE"], $arConfig["KEY"]["VALUE"], "notification", "cargosubscribe", $subsData);
}
break;
case "REQUEST_STATUS":
$controller = 'cargos';
$action = 'status';
$data = array(
'cargoCodes' => array(
$arOrder['TRACKING_NUMBER']
)
);
$reqResult = static::sendRequest($arConfig["LOGIN"]["VALUE"], $arConfig["KEY"]["VALUE"], $controller, $action, $data);
break;
case "REQUEST_TAKE":
$reqResult = array(
"RESULT" => "ERROR",
"TEXT" => ""
);
break;
}
$result["RESULT"] = $reqResult["RESULT"];
if(isset($reqResult["TEXT"]))
$result["TEXT"] = $reqResult["TEXT"];
if(isset($reqResult["DATA"]))
$result["DATA"] = $reqResult["DATA"];
return $result;
}
protected static function getAviableBoxes()
{
return array(
array(
"NAME" => GetMessage("SALE_DH_RP_STNDRD_BOX"),
"DIMENSIONS" => array("425", "265", "380")
)
);
}
public static function getAdminMessage()
{
$result = array();
$message = '';
if(!Location::isInstalled())
{
$message =
GetMessage('SALE_DH_PECOM_LOC_INSTALL').
'. '.
GetMessage('SALE_DH_PECOM_LOC_INSTALL_START').
'
';
}
if(isset($_SESSION['PECOM_LOCATIONS_MAP_ERRORS']) && is_array($_SESSION['PECOM_LOCATIONS_MAP_ERRORS']))
{
/** @var \Bitrix\Main\Error $error */
foreach($_SESSION['PECOM_LOCATIONS_MAP_ERRORS'] as $error)
$message .= $error->getMessage()."\n
";
unset($_SESSION['PECOM_LOCATIONS_MAP_ERRORS']);
}
if($message <> '')
{
$result = array(
'MESSAGE' => $message,
"TYPE" => "ERROR",
"HTML" => true
);
}
return $result;
}
public static function execAdminAction()
{
$result = new \Bitrix\Sale\Result();
if(isset($_REQUEST['PECOM_LOCATIONS_START_MAP']) && $_REQUEST['PECOM_LOCATIONS_START_MAP'] == 'Y' && !Location::isInstalled())
$result = Location::install();
if(!$result->isSuccess())
$_SESSION['PECOM_LOCATIONS_MAP_ERRORS'] = $result->getErrors();
return $result;
}
public static function getAdditionalInfoShipmentEdit(Shipment $shipment)
{
$shipmentId = $shipment->getId();
if(intval($shipmentId) <= 0)
return array();
if(self::isRequestSelfSent($shipmentId))
{
$date = self::getRequestSelfSentDate($shipmentId);
$inputs = array(
'REQUEST_SELF' => array(
'LABEL' => GetMessage('SALE_DH_PECOM_PRELIMINARY_REQUEST'),
'TYPE' => 'DELIVERY_READ_ONLY',
'VALUE' => GetMessage('SALE_DH_PECOM_PRELIMINARY_REQUEST_SENT').' '.$date.'.'
)
);
}
else
{
$inputs = array(
'REQUEST_SELF' => array(
'LABEL' => GetMessage('SALE_DH_PECOM_PRELIMINARY_SEND_REQUEST'),
'TYPE' => 'Y/N',
'VALUE' => 'N'
)
);
}
return $inputs;
}
public static function getAdditionalInfoShipmentView(Shipment $shipment)
{
$shipmentId = $shipment->getId();
if(intval($shipmentId) <= 0)
return array();
if(self::isRequestSelfSent($shipmentId))
$value = GetMessage('SALE_DH_PECOM_PRELIMINARY_REQUEST_SENT').' '.self::getRequestSelfSentDate($shipmentId);
else
$value = GetMessage('SALE_DH_PECOM_PRELIMINARY_REQUEST_NOT_SENT');
$inputs = array(
'REQUEST_SELF' => array(
'LABEL' => GetMessage('SALE_DH_PECOM_PRELIMINARY_REQUEST'),
'TYPE' => 'DELIVERY_READ_ONLY',
'VALUE' => $value
)
);
return $inputs;
}
protected static function isRequestSelfSent($shipmentId)
{
return self::getRequestSelfSentDate($shipmentId) !== null;
}
protected static function getRequestSelfSentDate($shipmentId)
{
static $result = array();
if(!isset($result[$shipmentId]))
{
$result[$shipmentId] = null;
$dbRes = \Bitrix\Sale\Internals\OrderDeliveryReqTable::getList(array(
'filter'=>array('=SHIPMENT_ID' => $shipmentId),
));
while($req = $dbRes->fetch())
{
if(!is_null($req["DATE_REQUEST"]) && !empty($req["PARAMS"]["TYPE"]) && $req["PARAMS"]["TYPE"] == "REQUEST_SELF")
{
$result[$shipmentId] = $req["DATE_REQUEST"];
break;
}
}
}
return $result[$shipmentId];
}
public static function processAdditionalInfoShipmentEdit(Shipment $shipment, array $requestData)
{
if(empty($requestData['REQUEST_SELF']) || $requestData['REQUEST_SELF'] != 'Y')
return null;
$shipmentId = $shipment->getId();
if(intval($shipmentId) <= 0)
return null;
$dt = new \Bitrix\Main\Type\DateTime();
$arResult = CSaleDeliveryHandler::executeAction(
\CSaleDelivery::getCodeById(
$shipment->getDeliveryId()
),
'REQUEST_SELF',
\CAllSaleDelivery::convertOrderNewToOld(
$shipment
)
);
if(!$arResult)
return null;
$res = \Bitrix\Sale\Internals\OrderDeliveryReqTable::add(
array(
"SHIPMENT_ID" => $shipmentId,
"ORDER_ID" => $shipment->getCollection()->getOrder()->getId(),
"DATE_REQUEST" => $dt,
"PARAMS" => array(
"TYPE" => "REQUEST_SELF",
"RESULT" => $arResult
)
)
);
if(!$res->isSuccess())
return null;
if(isset($arResult["TRACKING_NUMBER"]))
$shipment->setField("TRACKING_NUMBER", $arResult["TRACKING_NUMBER"]);
if(isset($arResult["DELIVERY_DOC_NUM"]))
{
$shipment->setField("DELIVERY_DOC_NUM", $arResult["DELIVERY_DOC_NUM"]);
$shipment->setField("DELIVERY_DOC_DATE", $dt);
}
return $shipment;
}
}
AddEventHandler('sale', 'onSaleDeliveryHandlersBuildList', array('CDeliveryPecom', 'Init'));
?>