Your IP : 216.73.216.86


Current Path : /var/www/homesaver/www/bitrix/modules/epages.pickpoint/general/
Upload File :
Current File : /var/www/homesaver/www/bitrix/modules/epages.pickpoint/general/pickpoint.php

<?php

use Bitrix\Main\Application;
use Bitrix\Main\Text\Encoding;
use PickPoint\OrderOptions;
use \Bitrix\Main\Config\Option;

class CPickpoint extends CAllPickpoint
{
    private static $processedOrders = array();

    public function PHPArrayToJS($arDest, $sName)
    {
        return "<script>{$sName} = ".self::PHPArrayToJS_in($arDest).'</script>';
    }

    public function PHPArrayToJS_in($arDest)
    {
        if (is_array($arDest)) {
            foreach ($arDest as $k => $v) {
                $arDest[$k] = '"'.$k.'":'.self::PHPArrayToJS_in($v);
            }
            $arDest = '{'.implode(',', $arDest).'}';
        } else {
            $arDest = '"'.self::js_escape($arDest).'"';
        }

        return $arDest;
    }

    public function js_escape($str)
    {
        $obLocation = CSaleLocation::GetList(
            array(
                'SORT' => 'ASC',
                'CITY_NAME_ORIG' => 'ASC',
            ),
            array(
                'COUNTRY_NAME' => 'Russia',
                '!CITY_ID' => null,
                'CITY_LID' => 'en',
                'CITY_NAME' => $sCode,
            ),
            false,
            false,
            array(
                'ID',
                'CITY_ID',
                'CITY_NAME',
                'CITY_NAME_ORIG',
            )
        );

        return $obLocation->Fetch();
    }

    public function GetCity($arFields)
    {
        $iPPID = intval($arFields['PP_ID']) ? intval($arFields['PP_ID']) : 0;

        $iID = 0;
        $sCode = strlen($arFields['CODE']) ? $arFields['CODE'] : '';
        $iPrice = 0;
        $sActive = 'N';
        if ($iPPID) {
            $obPPCity = self::SelectCityByPPID($iPPID);
            if ($arPPCity = $obPPCity->Fetch()) {
                $iBXID = $arPPCity['BX_ID'];
                if ($arPPCity['ACTIVE'] == 'Y') {
                    $sActive = 'Y';
                }
                $arBXCity = self::SelectCityByID($iBXID);
                $iPrice = floatval($arPPCity['PRICE']);
                $sCode = $arBXCity['CITY_NAME'];
            } else {
                $arCity = self::SelectCityByCode($sCode);
                $iBXID = $arCity['ID'];
            }
        } else {
            $arCity = self::SelectCityByCode($sCode);
            $iBXID = $arCity['ID'];
            $iPPID = 0;
        }

        return array(
            'ID' => $iID,
            'CODE' => $sCode,
            'PP_ID' => $iPPID,
            'BX_ID' => $iBXID,
            'PRICE' => $iPrice,
            'ACTIVE' => $sActive,
        );
    }

    public function SelectCityByCode($sCode)
    {
        $obLocation = CSaleLocation::GetList(
            array(
                'SORT' => 'ASC',
                'CITY_NAME_ORIG' => 'ASC',
            ),
            array(
                'COUNTRY_NAME' => 'Russia',
                '!CITY_ID' => null,
                'CITY_LID' => 'en',
                'CITY_NAME' => $sCode,
            ),
            false,
            false,
            array(
                'ID',
                'CITY_ID',
                'CITY_NAME',
                'CITY_NAME_ORIG',
            )
        );

        return $obLocation->Fetch();
    }

    public function SelectCityByID($iBXID)
    {
        $obLocation = CSaleLocation::GetList(
            array(
                'SORT' => 'ASC',
                'CITY_NAME_ORIG' => 'ASC',
            ),
            array(
                'COUNTRY_NAME' => 'Russia',
                '!CITY_ID' => null,
                'CITY_LID' => 'en',
                'CITY_ID' => $iBXID,
            ),
            false,
            false,
            array(
                'ID',
                'CITY_ID',
                'CITY_NAME',
                'CITY_NAME_ORIG',
            )
        );

        return $obLocation->Fetch();
    }

    public function CheckRequest()
    {
        $parameters = array(
            'PP_ID',
            'PP_ADDRESS',
            'PP_NAME',
            'PP_SMS_PHONE',
            'PP_ZONE',
            'PP_COEFF',
        );

        if (isset($_REQUEST['order']))
        {
            $request = Application::getInstance()->getContext()->getRequest();
            $orderData = $request->get("order");

            if(!Application::getInstance()->isUtfMode())
            {
                $orderData= Encoding::convertEncoding($orderData, 'UTF-8', SITE_CHARSET);
            }
            
            foreach ($parameters as $parameter) {
                if (strlen($orderData[$parameter]) > 0)
                {
                    $_SESSION['PICKPOINT'][$parameter] = $orderData[$parameter];
                }
            }
        }
        else {
            foreach ($parameters as $parameter) {
                if (isset($_REQUEST[$parameter])) {
                    $_SESSION['PICKPOINT'][$parameter] = $_REQUEST[$parameter];
                }
            }
        }

    }

    private static function processOrderAdd($orderId, $deliveryId)
    {
        if (in_array($orderId, static::$processedOrders)) {
            return;
        }

        $MODULE_ID = static::$moduleId;

        $deliveryCode = self::getProfileCodeById($deliveryId);

        $smsPhone = '';
        $orderPhone = COption::GetOptionString('epages.pickpoint', 'pp_order_phone');

        $order = CSaleOrder::GetByID($orderId);
        $orderProps = OrderOptions::getOrderOptions(
            $orderId,
            $order['PERSON_TYPE_ID'],
            []
        );

        $email = $orderProps['EMAIL'];
        $fio = $orderProps['FIO'];

        if  ($orderPhone) {
            $smsPhone = $orderProps['ORDER_PHONE'];
        } else {
            $smsPhone = $_SESSION['PICKPOINT']['PP_SMS_PHONE'];
        }

        if ('pickpoint:postamat' == $deliveryCode) {
            $arToAdd = array(
                'ORDER_ID' => $orderId,
                'POSTAMAT_ID' => $_SESSION['PICKPOINT']['PP_ID'],
                'ADDRESS' => $_SESSION['PICKPOINT']['PP_ADDRESS'],
                'SMS_PHONE' => $smsPhone,
                'EMAIL' => $email,
                'NAME' => $fio,
            );
            self::AddOrderPostamat($arToAdd);
            if (COption::GetOptionString($MODULE_ID, 'pp_add_info', '')) {
                $saleOrder = new CSaleOrder();
                $orderData = $saleOrder->GetByID($orderId);
                $sDescription = "{$orderData['USER_DESCRIPTION']}\n\n"
                    ."{$_SESSION['PICKPOINT']['PP_ID']}\n"
                    ."{$_SESSION['PICKPOINT']['PP_ADDRESS']}\n"
                    ."{$smsPhone}\n"
                    ."{$email}\n"
                    ."{$fio}";

                $saleOrder->Update($orderId, array('USER_DESCRIPTION' => $sDescription, 'COMMENTS' => $sDescription));
            }
        }

        unset($_SESSION['PICKPOINT']);
        static::$processedOrders[] = $orderId;
    }

    public function OnOrderAdd($orderId, $arFields)
    {
        static::processOrderAdd($orderId, $arFields['DELIVERY_ID']);
    }

    public static function OnSaleOrderSaved(\Bitrix\Main\Event $event)
    {
        if (!$event->getParameter('IS_NEW')) {
            return;
        }
        /** @var \Bitrix\Sale\Order $order */
        $order = $event->getParameter('ENTITY');

        static::processOrderAdd($order->getId(), reset($order->getDeliverySystemId()));
    }

    public function OnOrderAddV15($orderId, $arFields)
    {
        static::processOrderAdd($orderId, $arFields['DELIVERY_ID']);
    }

    protected static function getProfileCodeById($profileId)
    {
        //bitrix v16+ check profile ID
        if ($profileId !== 'pickpoint:postamat' && class_exists('Bitrix\Sale\Delivery\Services\Table')) {
            $arDelivery = Bitrix\Sale\Delivery\Services\Table::getList(
                array(
                    'filter' => array(
                        'ID' => $profileId,
                    ),
                    'select' => array('CODE'),
                )
            )->fetch()
            ;

            if ($arDelivery['CODE'] == 'pickpoint:postamat') {
                return $arDelivery['CODE'];
            }
        } else {
            return $profileId;
        }
    }

    public function Calculate($arOrder)
    {
        $MODULE_ID = static::$moduleId;

        $ppzoneID = intval($_SESSION['PICKPOINT']['PP_ZONE']) + 2;

        $obZone = self::SelectZoneByID($ppzoneID);
        $price = 0;
        $minOrderFreePrice = 0;
        if ($arZone = $obZone->Fetch()) {
            $price = $arZone['PRICE'];
            $minOrderFreePrice = $arZone['FREE'];
        }

        if (COption::GetOptionString($MODULE_ID, 'pp_use_coeff', '')) {
            if (doubleval($_SESSION['PICKPOINT']['PP_COEFF']) > 1) {
                if (!$coeff = COption::GetOptionString($MODULE_ID, 'pp_custom_coeff', '')) {
                    $coeff = doubleval($_SESSION['PICKPOINT']['PP_COEFF']);
                }

                $price *= $coeff;
            }
        }

        if (intval($price) > 0) {
            if (intval($minOrderFreePrice) > 0 && $arOrder['PRICE'] >= $minOrderFreePrice) {
                $price = 0;
            }
        }

        return $price;
    }

    public static function CheckPPPaySystem($iPSID, $iPTID)
    {
        $arPS = (CSalePaySystem::GetByID($iPSID, $iPTID));
        if (substr_count($arPS['PSA_ACTION_FILE'], 'epages.pickpoint')) {
            return 1;
        }

        return 0;
    }

    public static function GetOrdersArray()
    {
        $obOrdersPostamat = self::SelectOrderPostamat();
        $arItems = array();
        while ($arOrderPostamat = $obOrdersPostamat->Fetch()) {
            $obOrder = CSaleOrder::GetList(
                array(),
                array(
                    'ID' => $arOrderPostamat['ORDER_ID'],
                    '!STATUS_ID' => 'F',
                    'CANCELED' => 'N',
                ),
                false,
                false,
                array(
                    'ID',
                    'PAY_SYSTEM_ID',
                    'PERSON_TYPE_ID',
                    'DATE_INSERT',
                    'PRICE',
                    'DELIVERY_ID',
                )
            );
            if ($arOrder = $obOrder->Fetch()) {
                if (strpos($arOrder['DELIVERY_ID'], 'pickpoint') !== false) {
                    $arSettings = unserialize($arOrderPostamat['SETTINGS']);
                    $arItem = array(
                        'ORDER_ID' => $arOrder['ID'],
                        'ORDER_DATE' => $arOrder['DATE_INSERT'],
                        'PAYED_BY_PP' => self::CheckPPPaySystem(
                            $arOrder['PAY_SYSTEM_ID'],
                            $arOrder['PERSON_TYPE_ID']
                        ),
                        'PRICE' => $arOrder['PRICE'],
                        'PP_ADDRESS' => $arOrderPostamat['ADDRESS'],
                        'INVOICE_ID' => $arOrderPostamat['PP_INVOICE_ID'],
                        'SETTINGS' => $arSettings,
                        'CANCELED' => $arOrderPostamat['CANCELED']
                    );

                    if (!empty($arOrderPostamat['WIDTH'])){
                        $arItem['WIDTH'] = $arOrderPostamat['WIDTH'];
                    } else {
                        $arItem['WIDTH'] = Option::get('epages.pickpoint', 'pp_dimension_width', '50');
                    }

                    if (!empty($arOrderPostamat['HEIGHT'])){
                        $arItem['HEIGHT'] = $arOrderPostamat['HEIGHT'];
                    } else {
                        $arItem['HEIGHT'] = Option::get('epages.pickpoint', 'pp_dimension_height', '50');
                    }

                    if (!empty($arOrderPostamat['DEPTH'])){
                        $arItem['DEPTH'] = $arOrderPostamat['DEPTH'];
                    } else {
                        $arItem['DEPTH'] = Option::get('epages.pickpoint', 'pp_dimension_depth', '50');
                    }

                    $arItems[] = $arItem;
                }
            }
        }

        return $arItems;
    }

    public function GetParam($iOrderID, $iPersonType, $sPPField)
    {
        require $_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/epages.pickpoint/constants.php';
        $arTableOptions = (unserialize(COption::GetOptionString('epages.pickpoint', 'OPTIONS')));
        if (!isset($arTableOptions[$iPersonType][$sPPField])) {
            $arData = array($arOptionDefaults[$sPPField]);
        } else {
            $arData = $arTableOptions[$iPersonType][$sPPField];
        }
        $arReturn = array();
        foreach ($arData as $arOption) {
            switch ($arOption['TYPE']) {
                case 'ANOTHER':
                    $arReturn[] = $arOption['VALUE'];
                    break;
                case 'USER':
                    $obOrder = CSaleOrder::GetList(
                        array(),
                        array('ID' => $iOrderID),
                        false,
                        false,
                        array(
                            'ID',
                            'USER_ID',
                        )
                    );
                    $arOrder = $obOrder->Fetch();
                    $obUser = CUser::GetByID($arOrder['USER_ID']);
                    if ($arUser = $obUser->Fetch()) {
                        if ($arOption['VALUE'] == 'USER_FIO') {
                            $arReturn[] = $arUser['LAST_NAME'].($arUser['NAME']
                                    ? ' '.$arUser['NAME']
                                    :
                                    '').($arUser['SECOND_NAME'] ? ' '.$arUser['SECOND_NAME'] : '');
                        } elseif (strlen($arUser[$arOption['VALUE']])) {
                            $arReturn[] = $arUser[$arOption['VALUE']];
                        }
                    }
                    break;
                case 'ORDER':
                    $arOrder = CSaleOrder::GetByID($iOrderID);
                    $arReturn[] = $arOrder[$arOption['VALUE']];
                    break;
                case 'PROPERTY':
                    $obProperty = CSaleOrderPropsValue::GetList(
                        array(),
                        array(
                            'ORDER_ID' => $iOrderID,
                            'ORDER_PROPS_ID' => $arOption['VALUE'],
                        ),
                        false,
                        false,
                        array('VALUE')
                    );
                    if ($arProperty = $obProperty->Fetch()) {
                        if (strlen($arProperty['VALUE']) > 0) {
                            $arReturn[] = $arProperty['VALUE'];
                        }
                    }
                    break;
            }
        }

        return $arReturn;
    }

    public function ExportXML($arIDs)
    {
        require $_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/epages.pickpoint/constants.php';
        global $APPLICATION;

        $sReturn = '<'."?xml version='1.0' encoding='UTF-8'?".">\n<documents>\n";
        foreach ($arIDs as $iOrderID) {
            $obOrder = CSaleOrder::GetList(
                array(),
                array('ID' => $iOrderID),
                false,
                false,
                array(
                    'ID',
                    'PERSON_TYPE_ID',
                    'PAY_SYSTEM_ID',
                )
            );
            if ($arOrder = $obOrder->Fetch()) {
                $obData = self::SelectOrderPostamat($arOrder['ID']);
                $arData = $obData->Fetch();
                $sReturn .= "\t<document>\n";
                $arFIO = self::GetParam($arOrder['ID'], $arOrder['PERSON_TYPE_ID'], 'FIO');
                $sFIO = current($arFIO);
                $sReturn .= "\t\t<fio>{$sFIO}</fio>\n";
                $sReturn .= "\t\t<sms_phone>{$arData['SMS_PHONE']}</sms_phone>\n";
                $arEmail = self::GetParam($arOrder['ID'], $arOrder['PERSON_TYPE_ID'], 'EMAIL');
                $sEmail = current($arEmail);
                $sReturn .= "\t\t<email>{$sEmail}</email>\n";
                $arAdditionalPhones = self::GetParam(
                    $arOrder['ID'],
                    $arOrder['PERSON_TYPE_ID'],
                    'ADDITIONAL_PHONES'
                );
                $sReturn .= "\t\t<additional_phones>\n";
                foreach ($arAdditionalPhones as $sPhone) {
                    $sReturn .= "\t\t\t<phone>{$sPhone}</phone>\n";
                }
                $sReturn .= "\t\t</additional_phones>\n";
                $sReturn .= "\t\t<order_id>{$arOrder['ID']}</order_id>\n";
                if (self::CheckPPPaySystem($arOrder['PAY_SYSTEM_ID'], $arOrder['PERSON_TYPE_ID'])) {
                    $iPrice = number_format($_REQUEST['EXPORT'][$arOrder['ID']]['PAYED'], 2, '.', '');
                } else {
                    $iPrice = 0;
                }
                $sReturn .= "\t\t<summ_rub>{$iPrice}</summ_rub>\n";
                $sReturn .= "\t\t<terminal_id>{$arData['POSTAMAT_ID']}</terminal_id>\n";
                $sReturn .= "\t\t<type_service>{$arServiceTypes[$_REQUEST['EXPORT'][$arOrder['ID']]['SERVICE_TYPE']]}</type_service>\n";
                $sReturn .= "\t\t<type_reception>{$arEnclosingTypes[$_REQUEST['EXPORT'][$arOrder['ID']]['ENCLOSING_TYPE']]}</type_reception>\n";
                $sEmbed = COption::GetOptionString('epages.pickpoint', 'pp_enclosure', '');
                $sReturn .= "\t\t<embed>{$sEmbed}</embed>\n";
                $sReturn .= "\t\t<size_x>{$arSizes[$_REQUEST['EXPORT'][$arOrder['ID']]['SIZE']]['SIZE_X']}</size_x>\n";
                $sReturn .= "\t\t<size_y>{$arSizes[$_REQUEST['EXPORT'][$arOrder['ID']]['SIZE']]['SIZE_Y']}</size_y>\n";
                $sReturn .= "\t\t<size_z>{$arSizes[$_REQUEST['EXPORT'][$arOrder['ID']]['SIZE']]['SIZE_Z']}</size_z>\n";
                $sReturn .= "\t</document>\n";
            }
        }
        $sReturn .= '</documents>';
        $APPLICATION->RestartBuffer();
        ob_start();
        echo $sReturn;
        $contents = ob_get_contents();
        ob_end_clean();
        header('Content-Type: application/xml; charset=utf-8');
        header('Content-Disposition: attachment; filename="pickpoint_export.xml"');
        header('Content-Length: '.strlen($contents));
        echo $contents;
        die();
    }

    public function ExportOrders($arIDs)
    {
        global $APPLICATION;
        $MODULE_ID = static::$moduleId;
        $api_login = COption::GetOptionString($MODULE_ID, 'pp_api_login', '');
        $api_password = COption::GetOptionString($MODULE_ID, 'pp_api_password', '');
        $authResult = self::Login($api_login, $api_password);
        if (!is_array($authResult['ERROR'])) {
            $sessionId = $authResult;
            if (strlen($sessionId) > 0) {
                require $_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/epages.pickpoint/constants.php';
                $ikn_number = COption::GetOptionString($MODULE_ID, 'pp_ikn_number', '');
                $store_city = COption::GetOptionString($MODULE_ID, 'pp_from_city', '');
                $store_address = COption::GetOptionString($MODULE_ID, 'pp_store_address', '');
                $store_phone = COption::GetOptionString($MODULE_ID, 'pp_store_phone', '');
                $sEmbed = COption::GetOptionString($MODULE_ID, 'pp_enclosure', '');
                $ClientReturnAddress = array(
                    'PhoneNumber' => $store_phone,
                    'CityName' => $store_city,
                    'Address' => $store_address,
                );
                $arQuery = array('SessionId' => $sessionId);
                foreach ($arIDs as $iOrderID) {
                    $arSending = array('IKN' => $ikn_number);
                    $arInvoice = array();
                    $obOrder = CSaleOrder::GetList(
                        array(),
                        array('ID' => $iOrderID),
                        false,
                        false,
                        array(
                            'ID',
                            'PRICE',
                            'PERSON_TYPE_ID',
                            'PAY_SYSTEM_ID',
                        )
                    );
                    if ($arOrder = $obOrder->Fetch()) {
                        $obData = self::SelectOrderPostamat($arOrder['ID']);
                        $arData = $obData->Fetch();

                        $arFIO = self::GetParam($arOrder['ID'], $arOrder['PERSON_TYPE_ID'], 'FIO');
                        $sFIO = current($arFIO);

                        $arSending['EDTN'] = $arOrder['ID'];
                        $arInvoice['SenderCode'] = $arOrder['ID'];
                        $arInvoice['Description'] = $sEmbed;
                        $arInvoice['RecipientName'] = $sFIO;
                        $arInvoice['PostamatNumber'] = $arData['POSTAMAT_ID'];
                        $arInvoice['MobilePhone'] = $arData['SMS_PHONE'];

                        $arEmail = self::GetParam($arOrder['ID'], $arOrder['PERSON_TYPE_ID'], 'EMAIL');
                        $sEmail = current($arEmail);

                        $arInvoice['Email'] = $sEmail;
                        if (self::CheckPPPaySystem($arOrder['PAY_SYSTEM_ID'], $arOrder['PERSON_TYPE_ID'])) {
                            $arInvoice['PostageType'] = $arServiceTypesCodes[1];
                        } else {
                            $arInvoice['PostageType'] = $arServiceTypesCodes[0];
                        }
                        $arInvoice['GettingType']
                            = $arEnclosingTypesCodes[$_REQUEST['EXPORT'][$arOrder['ID']]['ENCLOSING_TYPE']];
                        $arInvoice['PayType'] = 1;

                        if (self::CheckPPPaySystem($arOrder['PAY_SYSTEM_ID'], $arOrder['PERSON_TYPE_ID'])
                            || ($_REQUEST['EXPORT'][$arOrder['ID']]['PAYED']) > 0
                        ) {
                            //$iPrice = number_format($_REQUEST["EXPORT"][$arOrder["ID"]]["PAYED"],2,".","");
                            $iPrice = number_format($arOrder['PRICE'], 2, '.', '');
                        } else {
                            $iPrice = 0;
                        }
                        $arInvoice['Sum'] = $iPrice;
                        $arInvoice['ClientReturnAddress'] = $ClientReturnAddress;

                        $arInvoice['UnclaimedReturnAddress'] = $ClientReturnAddress;

                        $arSending['Invoice'] = $arInvoice;
                        $arQuery['Sendings'][] = $arSending;
                    }
                }
                if (count($arQuery['Sendings']) > 0) {
                    $response = self::Query('createsending', $arQuery);

                    foreach ($response->CreatedSendings as $key => $createdSendings) {
                        if ($createdSendings->ErrorMessage) {
                            self::checkErrors($createdSendings);
                        } elseif (intval($createdSendings->InvoiceNumber) > 0) {
                            self::SetOrderInvoice(
                                $arQuery['Sendings'][$key]['Invoice']['SenderCode'],
                                $createdSendings->InvoiceNumber
                            );
                        }
                    }
                    foreach ($response->RejectedSendings as $rejectedSending) {
                        self::checkErrors($rejectedSending);
                    }
                }

                self::Logout($sessionId);
            }
        } else {
            return $authResult;
        }
    }

    public function SaveOrderOptions($orderID)
    {
        if (is_array($_REQUEST['EXPORT'][$orderID])) {
            $settings = serialize($_REQUEST['EXPORT'][$orderID]);
            self::SetOrderSettings($orderID, $settings);
        }
    }

    private function checkErrors($response)
    {
        global $APPLICATION;

        if ($response->ErrorMessage) {
            if (defined('BX_UTF') && BX_UTF == true) {
                $APPLICATION->ThrowException($response->ErrorMessage);
            } else {
                $APPLICATION->ThrowException(
                    $APPLICATION->ConvertCharset($response->ErrorMessage, 'utf-8', 'windows-1251')
                );
            }
        }
    }

    private static function Query($method, $arQuery)
    {
        global $APPLICATION;
        $MODULE_ID = static::$moduleId;
        $bpp_test_mode = COption::GetOptionString($MODULE_ID, 'pp_test_mode', '');
        if ($bpp_test_mode) {
            $apiUrl = '/apitest/';
        } else {
            $apiUrl = '/api/';
        }
        if (!(defined('BX_UTF') && BX_UTF == true)) {
            $arQuery = $APPLICATION->ConvertCharsetArray($arQuery, 'windows-1251', 'utf-8');
        }
        $response = QueryGetData(
            'e-solution.pickpoint.ru',
            '80',
            $apiUrl.$method,
            json_encode($arQuery),
            $error_number = 0,
            $error_text = '',
            'POST',
            '',
            'application/json'
        );

        $response = json_decode($response);

        self::checkErrors($response);

        return $response;
    }

    private function Login($login, $password)
    {
        $arQuery = array(
            'Login' => $login,
            'Password' => $password,
        );

        $response = self::Query('login', $arQuery);

        if (!$response->ErrorMessage && $response->SessionId) {
            return $response->SessionId;
        } else {
            return array('ERROR' => $response->ErrorMessage);
        }
    }

    private function Logout($sessionId)
    {
        $arQuery = array('SessionId' => $sessionId);
        $response = self::Query('logout', $arQuery);
    }

    public function GetCitiesCSV()
    {
        $MODULE_ID = static::$moduleId;
        $iTimeDelta = 86400; //Next Day

        if (@fopen(PP_CSV_URL, 'r')) {
            $sFileData = file_get_contents(PP_CSV_URL);
        }
        if (defined('BX_UTF') && BX_UTF == true) {
            $sFileData = iconv('windows-1251', 'utf-8', $sFileData);
        }
        if (strlen($sFileData) > 0) {
            file_put_contents($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/epages.pickpoint/cities.csv', $sFileData);
            $hFile = fopen($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/epages.pickpoint/cities.csv', 'r');
            $arCities = array();
            while ($sStr = fgets($hFile)) {
                $arStr = explode(';', $sStr);
                $arCities[] = trim($arStr[0]);
            }
            if (!empty($arCities)) {
                self::DeleteCities($arCities);
            } else {
                $iTimeDelta = 3600;
            } // 1 hour
        } else {
            $iTimeDelta = 3600;
        } // 1 hour
        COption::SetOptionInt($MODULE_ID, 'pp_city_download_timestamp', time() + $iTimeDelta);
    }

    public function GetZonesArray()
    {
        $arZones = array();
        $obZone = self::SelectZones();

        while ($arZone = $obZone->Fetch()) {
            $arZones[$arZone['ZONE_ID']] = $arZone;
        }

        return $arZones;
    }

    public function OnSCOrderOneStepDeliveryHandler(&$arResult, &$arUserResult)
    {
        global $DB;

        if (empty($arResult['DELIVERY'])) {
            return;
        }

        $content = '';

        $widgetParamsString = '';
        $str_from_city = COption::GetOptionString('epages.pickpoint', 'pp_from_city');
        $pp_ikn_number = COption::GetOptionString('epages.pickpoint', 'pp_ikn_number');
        $autoLocation = COption::GetOptionString('epages.pickpoint', 'pp_city_location');
        $cityFromProp = COption::GetOptionString('epages.pickpoint', 'pp_order_city_status');
        $orderPhone = COption::GetOptionString('epages.pickpoint', 'pp_order_phone');

        $cityNamePP = '';
        $phonePP = '';

        if ($cityFromProp)
        {
            $propsString = COption::GetOptionString('epages.pickpoint', 'OPTIONS');
            $props = unserialize($propsString);
            $locationId = $arUserResult['ORDER_PROP'][$props[$arUserResult['PERSON_TYPE_ID']]['ORDER_LOCATION'][0]['VALUE']];
            $ppCityData = PickPoint\Helper::checkPPCityAvailable($locationId);

            if ($ppCityData['STATUS']) {
                $cityNamePP = PickPoint\Helper::getEngCityName($ppCityData['DATA']['NAME_RU']);
            }
        } elseif ($autoLocation) {

            $locationId = PickPoint\Helper::getLocationIdByGeoPosition();

            $ppCityData = PickPoint\Helper::checkPPCityAvailable($locationId);

            if ($ppCityData['STATUS']) {
                $cityNamePP = PickPoint\Helper::getEngCityName($ppCityData['DATA']['NAME_RU']);
            }
        }

        if (!empty($cityNamePP) || !empty($str_from_city)){
            if ($str_from_city){
                $widgetParamsString .= ", { fromcity: '". $str_from_city . "'";
                $widgetParamsString .= ", ikn: '". $pp_ikn_number . "'";
            }
            if ($cityNamePP){
                $widgetParamsString .= ", cities:['" . $cityNamePP . "']";
            }
            $widgetParamsString .= '}';
        }

        ob_start();
        require $_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/epages.pickpoint/block.php';
        $content = ob_get_contents();
        ob_end_clean();

        $_REQUEST['PP_ID'] = strlen($_REQUEST['PP_ID']) > 0 ? $_REQUEST['PP_ID'] : $_SESSION['PICKPOINT']['PP_ID'];
        $_REQUEST['PP_ADDRESS'] = strlen($_REQUEST['PP_ADDRESS']) > 0 ? $_REQUEST['PP_ADDRESS']
            : $_SESSION['PICKPOINT']['PP_ADDRESS'];
        $_REQUEST['PP_ZONE'] = strlen($_REQUEST['PP_ZONE']) > 0 ? $_REQUEST['PP_ZONE']
            : $_SESSION['PICKPOINT']['PP_ZONE'];
        $_REQUEST['PP_NAME'] = strlen($_REQUEST['PP_NAME']) > 0 ? $_REQUEST['PP_NAME']
            : $_SESSION['PICKPOINT']['PP_NAME'];
        $_REQUEST['PP_COEFF'] = strlen($_REQUEST['PP_COEFF']) > 0 ? $_REQUEST['PP_COEFF']
            : $_SESSION['PICKPOINT']['PP_COEFF'];

        $content .= '<input id = "pp_address" type = "hidden" name = "PP_ADDRESS" value = "'
            .$_REQUEST['PP_ADDRESS']
            .'"/><input id = "pp_zone" type = "hidden" name = "PP_ZONE" value = "'
            .$_REQUEST['PP_ZONE']
            .'"/><input id = "pp_name" type = "hidden" name = "PP_NAME" value = "'
            .$_REQUEST['PP_NAME']
            .'"/><input id = "pp_coeff" type = "hidden" name = "PP_COEFF" value = "'
            .$_REQUEST['PP_COEFF']
            .'"/>';

        //check if sale module was converted to new structure, introduced in v15.5.10
        if (!$DB->TableExists('b_sale_delivery_srv')) { //old version
            if (isset($arResult['DELIVERY']['pickpoint'])) {
                $arResult['DELIVERY']['pickpoint']['PROFILES']['postamat']['DESCRIPTION'] .= $content;
                $arResult['DELIVERY']['pickpoint']['PROFILES']['postamat']['DESCRIPTION']
                    .= '<input id = "pp_id" type = "hidden" name = "PP_ID" value = "'
                    .$_REQUEST['PP_ID']
                    .'" data-delivery-id="pickpoint:postamat"/>';
            }
        } else { //new version
            foreach ($arResult['DELIVERY'] as &$arDelivery) {
                $serviceRes = Bitrix\Sale\Delivery\Services\Table::getList(
                    array(
                        'filter' => array(
                            'ID' => $arDelivery['ID'],
                        ),
                        'select' => array('CODE'),
                    )
                );
                $arDeliveryCode = $serviceRes->fetch();

                if (strpos($arDeliveryCode['CODE'], 'pickpoint') !== false) {
                    $arDelivery['DESCRIPTION'] .= $content;
                    $arDelivery['DESCRIPTION'] .= '<input id = "pp_id" type = "hidden" name = "PP_ID" value = "'
                        .$_REQUEST['PP_ID']
                        .'" data-delivery-id="'.$arDelivery['ID'].'"/>';
                }
            }
        }
    }

    public function addPickpointJs()
    {
        global $APPLICATION;
        $MODULE_ID = static::$moduleId;

        //include widget js files
        $APPLICATION->AddHeadString(
            '<script type="text/javascript" src="//pickpoint.ru/select/postamat.js" charset="utf-8"></script>'
        );
        if (defined('BX_UTF') && BX_UTF == true) {
            $APPLICATION->AddHeadScript("/bitrix/js/{$MODULE_ID}/script_utf.js");
        } else {
            $APPLICATION->AddHeadScript("/bitrix/js/{$MODULE_ID}/script.js");
        }
        //$APPLICATION->AddHeadString('<script type="text/javascript">if(typeof CheckData === "function") CheckData();</script>');
    }
}