403Webshell
Server IP : 80.87.202.40  /  Your IP : 216.73.216.169
Web Server : Apache
System : Linux rospirotorg.ru 5.14.0-539.el9.x86_64 #1 SMP PREEMPT_DYNAMIC Thu Dec 5 22:26:13 UTC 2024 x86_64
User : bitrix ( 600)
PHP Version : 8.2.27
Disable Function : NONE
MySQL : OFF |  cURL : ON |  WGET : ON |  Perl : ON |  Python : OFF |  Sudo : ON |  Pkexec : ON
Directory :  /home/bitrix/ext_www/rospirotorg.ru/bitrix/modules/lpost.delivery/lib/

Upload File :
current_dir [ Writeable] document_root [ Writeable]

 

Command :


[ Back ]     

Current File : /home/bitrix/ext_www/rospirotorg.ru/bitrix/modules/lpost.delivery/lib/tracking.php
<?
namespace Lpost\Delivery;

use \Bitrix\Main\Localization\Loc;
use Lpost\Delivery\Order\OrderShipmentParams\OrderParamsPvz;
use Lpost\Delivery\Order\OrderShipmentParams\OrderParamsZone;
use \Lpost\Delivery\Order\Property;

Loc::loadMessages(__FILE__);

\Bitrix\Main\Loader::IncludeModule('sale');

class Tracking
{
    use Base;

    private $periodRequest = 86400; //next request only through this specified parameter after the previous one
    private $typesOrder = ['R', 'D', 'E']; //R - this order is returned, D - this order is delivery, E - error
    private $lpostIdOrder = '';
    private $orderId;

    public function __construct($orderId = 0)
    {
        $this->orderId = $orderId;
    }

    public function getOrderReturnTypes()
    {
        return [
            1 => Loc::getMessage("lpost.tracking_returnType1"),
            2 => Loc::getMessage("lpost.tracking_returnType2"),
            3 => Loc::getMessage("lpost.tracking_returnType3"),
            4 => Loc::getMessage("lpost.tracking_returnType4")
        ];
    }

    public function getTypesOrder()
    {
        return [
            'R' => Loc::getMessage("lpost.tracking_TypeOrder_R"),
            'D' => Loc::getMessage("lpost.tracking_TypeOrder_D"),
            'E' => Loc::getMessage("lpost.tracking_TypeOrder_E")
        ];
    }

    public function getStatesDelivery()
    {
        return [
            'CREATED'                  => Loc::getMessage("lpost.tracking_StateDelivery_CREATED"),
            'ACT_CREATED'              => Loc::getMessage("lpost.tracking_StateDelivery_ACT_CREATED"),
            'ARRIVED_AT_THE_WAREHOUSE' => Loc::getMessage("lpost.tracking_StateDelivery_ARRIVED_AT_THE_WAREHOUSE"),
            'ACCEPTED_BY_PLACES'       => Loc::getMessage("lpost.tracking_StateDelivery_ACCEPTED_BY_PLACES"),
            'SENT_TO_PICKUP_POINT'     => Loc::getMessage("lpost.tracking_StateDelivery_SENT_TO_PICKUP_POINT"),
            'PLACED_IN_PICKUP_POINT'   => Loc::getMessage("lpost.tracking_StateDelivery_PLACED_IN_PICKUP_POINT"),
            'DONE'                     => Loc::getMessage("lpost.tracking_StateDelivery_DONE"),
            'CANCELLED'                => Loc::getMessage("lpost.tracking_StateDelivery_CANCELLED"),
            //'SHIPPED'                    => Loc::getMessage("lpost.tracking_StateDelivery_SHIPPED"),
            //'DELIVERED'                => Loc::getMessage("lpost.tracking_StateDelivery_DELIVERED")
        ];
    }

    public function getStatesReturn()
    {
        return [
            'CREATED'                  => Loc::getMessage("lpost.tracking_StateReturn_CREATED"),
            'READY_FOR_RETURN'         => Loc::getMessage("lpost.tracking_StateReturn_READY_FOR_RETURN"),
            'SENT_TO_WAREHOUSE'        => Loc::getMessage("lpost.tracking_StateReturn_SENT_TO_WAREHOUSE"),
            'ARRIVED_AT_THE_WAREHOUSE' => Loc::getMessage("lpost.tracking_StateReturn_ARRIVED_AT_THE_WAREHOUSE"),
            'ACCEPTED_BY_PLACES'       => Loc::getMessage("lpost.tracking_StateReturn_ACCEPTED_BY_PLACES"),
            'RETURNED_TO_PARTNER'      => Loc::getMessage("lpost.tracking_StateReturn_RETURNED_TO_PARTNER"),
            'ARCHIVE'                  => Loc::getMessage("lpost.tracking_StateReturn_ARCHIVE"),
        ];
    }

    private function checkUpdate()
    {
        $res = $this->getStateOrder();
        if ($res != false) {
            if ($res['is_check_status']) {
                return true;
            }
        }
        return false;
    }

    private function tmpState()
    {
        return [
            [
                "ID_Order"                => "ABC26197473",
                "StateDelivery"           => "DONE",
                "DateChangeStateDelivery" => "24-03-2020 15:00",
                "PaymentMethod"           => "��������",
                "CheckUml"                => "https://check.ofd.ru/",
                "Summ"                    => 1000
            ],
            [
                "ID_Order"                => "ABC26197473",
                "StateDelivery"           => "DONE",
                "DateChangeStateDelivery" => "24-03-2020 15:00",
                "PaymentMethod"           => "�����",
                "CheckUml"                => "https://check.ofd.ru/",
                "Summ"                    => 1000,
                "StateReturn"             => "CREATED",
                "DateChangeStateReturn"   => "24-03-2020 15:00",

            ],
            [
                "ID_Order"                => "ABC26197473",
                "StateDelivery"           => "CANCELLED",
                "DateChangeStateDelivery" => "24-03-2020 15:00",
                "CheckUml"                => "https://check.ofd.ru/",
                "Summ"                    => 1000,
                "StateReturn"             => "CREATED",
                "DateChangeStateReturn"   => "24-03-2020 15:00",
            ],
            [
                "ID_Order"                => "ABC26197473",
                "StateDelivery"           => "ARRIVED_AT_THE_WAREHOUSE",
                "DateChangeStateDelivery" => "24-03-2020 15:00",
                "StateInf"                => "����������� ���� 870047733451"
            ],
            [
                "ID_Order" => "ABC26197473",
                "Message"  => "�� ������ �����������"
            ]
        ];
    }

    public function updateStateOrder()
    {
        if ($this->checkUpdate()) {

            $statuses = $this->tmpState();
            $newStatus = array_rand($statuses);
            $currentStatusArr = $statuses[$newStatus];
            $stateDate = empty($currentStatusArr['StateReturn']) ? $currentStatusArr['DateChangeStateDelivery'] : $currentStatusArr['DateChangeStateReturn'];
            $newState = [
                'id_order'       => $this->orderId,
                'id_order_lpost' => $this->lpostIdOrder,
                'state_order'    => empty($currentStatusArr['StateReturn']) ? 'D' : 'R',
                'state'          => empty($currentStatusArr['StateReturn']) ? $currentStatusArr['StateDelivery'] : $currentStatusArr['StateReturn'],
                'params'         => \Bitrix\Main\Web\Json::encode($currentStatusArr),
                'date_change'    => new \Bitrix\Main\Type\DateTime($stateDate, "d-m-Y H:i")
            ];

            $resOld = \Lpost\Delivery\Entity\TrackingTable::getList([
                "filter" => [
                    "id_order" => $this->orderId
                ],
                "select" => ["*"],
                "order"  => ['id' => 'desc']
            ])->fetch();
            if ($resOld['state_order'] == $newState['state_order'] && $resOld['state'] == $newState['state']) {
                $newState['date_request'] = new \Bitrix\Main\Type\DateTime();
                \Lpost\Delivery\Entity\TrackingTable::update($resOld['id'], $newState);
            }
            else {
                \Lpost\Delivery\Entity\TrackingTable::add($newState);
            }
        }
    }

    public function getStateOrder()
    {
        $res = \Lpost\Delivery\Entity\TrackingTable::getList([
            "filter" => [
                "id_order" => $this->orderId
            ],
            "select" => ["*"],
            "order"  => ['id' => 'desc']
        ])->fetch();

        if ($res !== false) {
            $this->lpostIdOrder = $res['id_order_lpost'];
            if(!empty($res['params'])){
                
                $res['params'] =  \Bitrix\Main\Web\Json::decode($res['params']);
                
                /*if(isset($res['params']['StateReturn'])){
                
                    $res['params']['OrderReturn'][] = [
                        'IDProductPartner' => '94',
                        'NameShort' => 'Платье Модница на Прогулке',
                        'Quantity' => 1,
                        'ReturnType' => 1,
                    ];
                    $res['params']['OrderReturn'][] = [
                        'IDProductPartner' => '95',
                        'NameShort' => 'Платье Модница на Прогулке тест',
                        'Quantity' => 2,
                        'ReturnType' => 2,
                    ];
                }*/
                
                if(!empty($res['params']['OrderReturn']) && is_array($res['params']['OrderReturn'])){
                    
                    foreach($res['params']['OrderReturn'] as $key => $orderReturn){
                        $res['params']['OrderReturn'][$key]['ReturnTypeName'] = $this->getOrderReturnTypes()[$orderReturn['ReturnType']];
                    }
                }
                else
                    $res['params']['OrderReturn'] = [];
                
                if(empty($res['params']['StateReturn']))
                    $res['params']['StateReturn'] = '';
            }
            else
                $res['params'] = [];
            $res['state_name'] = $res['state'];
            $states = $res['state_order'] == 'D' ? $this->getStatesDelivery() : $this->getStatesReturn();
            $res['state_name'] = empty($states[$res['state']]) ? $res['state'] : $states[$res['state']];
            $res['is_check_status'] = ($res['state'] == 'DONE' || $res['state'] == 'RETURNED_TO_PARTNER') ? false : true;
            if ($res['is_check_status']) {
                $currentPeriod = time() - $res['date_request']->getTimestamp();
                if ($currentPeriod < $this->periodRequest) {
                    $res['is_check_status'] = false;
                }
            }
        }
        else
            $res['params']['OrderReturn'] = [];
        
        return $res;
    }

    /**
     * @throws \Bitrix\Main\ObjectPropertyException
     * @throws \Bitrix\Main\NotImplementedException
     * @throws \Bitrix\Main\ArgumentException
     * @throws \Bitrix\Main\SystemException
     */
    public function addOrder($orderManager, $data)
    {

        $options = Settings::getInstance();
        $calculate = new \Lpost\Delivery\Calculate($data['profile']['ID']);
        $propertyCollection = $orderManager->getOrder()->getPropertyCollection();
        $shipmentCollection = $orderManager->getOrder()->getShipmentCollection();
        $paymentCollection = $orderManager->getOrder()->getPaymentCollection();
        $shipmentParams = "";
        $params = $calculate->getDefaultParams($data['profile']['ID']);
        $basketItems = $orderManager->getOrder()->getBasket();
        $idSklad = 1;
        $issueType = 0;
        $pickupType = (strpos($data['profile']['CLASS_NAME'], "Zone") !== false) ? "zone" : "pvz";

        foreach ($shipmentCollection as $shipment) {
            if (!$shipment->isSystem()) {
                $shipmentParams = $shipment->getField("PARAMS");
                $shipmentParams = (!empty($shipmentParams)) ? \Bitrix\Main\Web\Json::decode($shipmentParams) : false;
            }
        }

        if (!empty($data['profile']['ID']) && !empty($params['ID_SKLAD'])) {
            $idSklad = $params['ID_SKLAD'];
        }

        if (!empty($data['profile']['ID']) && !empty($params['ISSUE_TYPE'])) {
            $issueType = (int) $params['ISSUE_TYPE'];
        }

        if (
            isset($shipmentParams[OrderParamsPvz::PARAMS_PICKUP_ID])
            AND $shipmentParams[OrderParamsPvz::PARAMS_PICKUP_ID] !== false
        ) {
            $pickupId = $shipmentParams[OrderParamsPvz::PARAMS_PICKUP_ID];
        }

        if (
            isset($shipmentParams[OrderParamsZone::PARAMS_ZONE_ID])
            AND !empty($shipmentParams[OrderParamsZone::PARAMS_ZONE_ID])
        ) {
            $pickupId = $shipmentParams[OrderParamsZone::PARAMS_ZONE_ID];
        }

        if ($pickupType == "pvz" && (!isset($pickupId) || $this->isOrderPrepayment($orderManager->getOrder(), $pickupId, $pickupType))) {
            return false;
        }

        $name = $orderManager->getOrderName();
        $phone = $orderManager->getOrderPhone();
        $email = $orderManager->getOrderEmail();

        $arDataOrder = [
            "ID_Whence" => 2,
            "Order"     => [
                [
                    "PartnerNumber"  => strval($order->getId()),
                    "ID_Sklad"       => (int)$idSklad,
                    "IssueType"      => $issueType,
                    "Value"          => $calculate->getInsurance($basketItems->getPrice(), $data['profile']['ID']),
                    "SumPayment"     => round($paymentCollection->isPaid() ? 0 : $order->getPrice(), 2),
                    "SumPrePayment"  => round($paymentCollection->isPaid() ? $order->getPrice() : 0, 2),
                    "SumDelivery"    => $order->getDeliveryPrice(),
                    "SumServices"    => 0,
                    "CustomerNumber" => strval($order->getId()),
                    "CustomerName"   => $name,
                    "Phone"          => \Lpost\Delivery\Tools::formattingForApiOrderPhone($phone),
                    "Email"          => $email,
                    "Comment"        => $order->getField('USER_DESCRIPTION'),
                ]
            ]
        ];

        if($porch = $orderManager->getOrderProp("integration_field_porch")){
            $arDataOrder["Order"][0]["Porch"] = (int)$porch;
        }
        if($floor = $orderManager->getOrderProp( "integration_field_floor")){
            $arDataOrder["Order"][0]["Floor"] = (int)$floor;
        }
        if($flat = $orderManager->getOrderProp( "integration_field_flat")){
            $arDataOrder["Order"][0]["Flat"] = (int)$flat;
        }
        if($code = $orderManager->getOrderProp( "integration_field_code")){
            $arDataOrder["Order"][0]["Code"] = $code;
        }

        if ($pickupType == "zone") {

            $propDateDelivery = new Property\Entity\PropertyDateDelivery();
            $propTimeDelivery = new Property\Entity\PropertyTimeDelivery();

            $orderManager->fillPropertyValue($propDateDelivery);
            $orderManager->fillPropertyValue($propTimeDelivery);

            $address = $orderManager->getOrderAddress();

            // Если в это свойство были записанны дополнительные данные, то вырезаем их
            $address = preg_replace('/^"#[\d.,]+"\s/', '', $address);
            $location = $orderManager->getOrderLocation();
            $coords = explode(",", $shipmentParams[OrderParamsZone::PARAMS_ZONE_COORDS]);

            $arDataOrder["Order"][0]["Address"] = "$location, $address";
            $arDataOrder["Order"][0]["Latitude"] = $coords[0];
            $arDataOrder["Order"][0]["Longitude"] = $coords[1];

            if($propDateDeliveryValue = $propDateDelivery->getValue()) {
                $arDataOrder["Order"][0]["DateDeliv"] = $propDateDeliveryValue;
            }
            $arDataOrder["Order"][0]["TypeIntervalDeliv"] = (int)str_replace("_0", 0, $propTimeDelivery->getValue());

            $this->setShippingCost($orderManager->getOrder(), $arDataOrder);
        }
        else {
            $arDataOrder["Order"][0]["ID_PickupPoint"] = (int)$pickupId;
        }

        $dimensionsBasket = $calculate->getDimensionBasketItems($basketItems, $data['profile']['ID']);
        $weightDefault = $dimensionsBasket['Weight'] > 1 ? $dimensionsBasket['Weight'] : 1;
        
        if($dimensionsBasket['Weight'] > 30000){
            
            \CModule::IncludeModule("catalog");
            
            $barcode = \Lpost\Delivery\Tools::getBarcode($this->orderManager->getDepartureNumber());
            $dimensionsDefault = $calculate->getDefaultParams($this->orderManager->getDeliveryId());
            $calcDimDefault = !empty($dimensionsDefault['CALC_DIMENSIONS_DEFAULT']) && $dimensionsDefault['CALC_DIMENSIONS_DEFAULT'] == 'product' ? 'product' : 'order'; // Значения габаритов по умолчанию для
            $goodsDimensionFrom = !empty($dimensionsDefault['GOODS_DIMENSIONS_FROM']) && $dimensionsDefault['GOODS_DIMENSIONS_FROM'] == 'product' ? 'product' : 'default'; // Забор информации о размерах товара
            
            // массив единиц товаров и их вес
            $arBasketItemsOne = $arBasketItemsOneId = [];
            foreach($basketItems as $basketItem) {

                $basketItemQuantity = $basketItem->getQuantity();   
                for( ; $basketItemQuantity > 0; $basketItemQuantity--){
                    
                    $weight = (int)$basketItem->getWeight();
                
                    if(empty($weight)) {
                        
                        if($calcDimDefault == 'product') { // значения по умолчанию для одного товара
                        
                            $weight += isset($dimensionsDefault['DEFAULT_WEIGHT']) ? $dimensionsDefault['DEFAULT_WEIGHT'] : 100;
                        }
                    }
                    
                    $arDataProduct = [
                        'IDProductPartner' => $basketItem->getProductId(),
                        'NameShort' => $basketItem->getField('NAME'),
                        'Price' => $basketItem->getPrice(),
                        'Barcode' => $barcode,
                        'NDS' => ((float)$basketItem->getField('VAT_RATE')) * 100,
                        'Quantity' => 1,
                        'Weight' => $weight,
                    ];
                    
                    if($goodsDimensionFrom == 'product'){ // Забор информации о размерах товара из товара
                
                        $arDimentions = $basketItem->getField('DIMENSIONS');
                        if (is_string($arDimentions))
                        {
                            $arDimentions = unserialize($arDimentions);
                        }
                        if(empty($arDimentions['WIDTH']) || empty($arDimentions['HEIGHT']) || empty($arDimentions['LENGTH'])){
                            $product = \CCatalogProduct::GetByID($basketItem->getProductId());
                            $arDimentions = [
                                'WIDTH' => $product['WIDTH'],
                                'HEIGHT' => $product['HEIGHT'],
                                'LENGTH' => $product['LENGTH'],
                            ];
                        }
                        
                        if($calcDimDefault == 'product') {
                            if(empty($arDimentions["LENGTH"]))
                                $arDimentions["LENGTH"] = isset($dimensionsDefault['DEFAULT_LENGTH']) ? $dimensionsDefault['DEFAULT_LENGTH'] : 380;
                            if(empty($arDimentions["WIDTH"]))
                                $arDimentions["WIDTH"] = isset($dimensionsDefault['DEFAULT_WIDTH']) ? $dimensionsDefault['DEFAULT_WIDTH'] : 380;
                            if(empty($arDimentions["HEIGHT"]))
                                $arDimentions["HEIGHT"] = isset($dimensionsDefault['DEFAULT_HEIGHT']) ? $dimensionsDefault['DEFAULT_HEIGHT'] : 380;
                        }
                        
                        $arDataProduct["Length"] = $arDimentions['LENGTH'];
                        $arDataProduct["Width"] = $arDimentions['WIDTH'];
                        $arDataProduct["Height"] = $arDimentions['HEIGHT'];
                    }
                    
                    if(!isset($arBasketItemsOneId[$arDataProduct['IDProductPartner']])){
                        
                        $valuedMarkingCode = null;
                        if($fieldMarkingCode && ($issueType == 0 || $issueType == 1) && (int)$basketItem->getQuantity() == 1){
                        
                            $dbItem = \Bitrix\Iblock\ElementTable::getList([
                                'select' => ['ID', 'IBLOCK_ID'],
                                'filter' => ['ID' => $basketItem->getProductId()],
                                'limit' => 1,
                            ]);
                            if($arItem = $dbItem->fetch()) {
                                $dbProperty = \CIBlockElement::getProperty($arItem['IBLOCK_ID'], $arItem['ID'], ['sort', 'asc'], ['CODE' => $fieldMarkingCode]);
                                if($arProperty = $dbProperty->fetch()) {
                                    if($arProperty['VALUE'])
                                        $valuedMarkingCode = $arProperty['VALUE'];
                                }
                            }
                        }
                        
                        $arBasketItemsOneId[$arDataProduct['IDProductPartner']]['valuedMarkingCode'] = $valuedMarkingCode;
                    }
                    else
                        $valuedMarkingCode = $arBasketItemsOneId[$arDataProduct['IDProductPartner']]['valuedMarkingCode'];
                    
                    if($valuedMarkingCode)
                        $arDataProduct['ChestnyZnak'] = $valuedMarkingCode;
                    
                    $arBasketItemsOne[] = $arDataProduct;
                }
            }
            
            unset($arBasketItemsOneId);
            
            $arDataProducts = [];
            $curCargoesDimensions = [
                "Length" => 0,
                "Width"  => 0,
                "Height" => 0,
                "Weight" => 0,
            ];
            $curCargoesInd = 0;
            
            foreach($arBasketItemsOne as $basketItem){
                
                if(!empty($basketItem['Weight']))
                    $curCargoesDimensions['Weight'] += $basketItem['Weight'];
              
                if($curCargoesDimensions['Weight'] > 30000){
                    
                    sort($arDataProducts);
                    
                    if($calcDimDefault == 'order'){ // значения по умолчанию для всего заказа
                        
                        if(empty($curCargoesDimensions["Weight"]))
                            $curCargoesDimensions["Weight"] = isset($dimensionsDefault['DEFAULT_WEIGHT']) ? $dimensionsDefault['DEFAULT_WEIGHT'] : 100;
                        if(empty($curCargoesDimensions["Length"]))
                            $curCargoesDimensions["Length"] = isset($dimensionsDefault['DEFAULT_LENGTH']) ? $dimensionsDefault['DEFAULT_LENGTH'] : 380;
                        if(empty($curCargoesDimensions["Width"]))
                            $curCargoesDimensions["Width"] = isset($dimensionsDefault['DEFAULT_WIDTH']) ? $dimensionsDefault['DEFAULT_WIDTH'] : 380;
                        if(empty($curCargoesDimensions["Height"]))
                            $curCargoesDimensions["Height"] = isset($dimensionsDefault['DEFAULT_HEIGHT']) ? $dimensionsDefault['DEFAULT_HEIGHT'] : 380;
                    }
                    
                    $arCargoes = [
                        "Weight"  => $curCargoesDimensions['Weight'] - $basketItem['Weight'],
                        "Length"  => (int)$curCargoesDimensions['Length'],
                        "Width"   => (int)$curCargoesDimensions['Width'],
                        "Height"  => (int)$curCargoesDimensions['Height'],
                        "Product" => $arDataProducts
                    ];
                    
                    $this->dataSent["Order"][0]["Cargoes"][$curCargoesInd] = $arCargoes;
                    $curCargoesInd++;
                    
                    $arDataProducts = [];
                    $arDataProducts[$basketItem['IDProductPartner']] = [
                        "IDProductPartner" => $basketItem['IDProductPartner'],
                        "NameShort"        => $basketItem['NameShort'],
                        "Price"            => $basketItem['Price'],
                        "Barcode"          => $basketItem['Barcode'],
                        "NDS"              => $basketItem['NDS'],
                        "Quantity"         => $basketItem['Quantity'],
                    ];
                    
                    $curCargoesDimensions = [
                        "Length" => $basketItem['Length'],
                        "Width"  => $basketItem['Width'],
                        "Height" => $basketItem['Height'],
                        "Weight" => $basketItem['Weight']
                    ];
                }
                else{
                    
                    if(!empty($basketItem['Length']))
                        $curCargoesDimensions['Length'] += $basketItem['Length'];
                    if(!empty($basketItem['Width']))
                        $curCargoesDimensions['Width'] += $basketItem['Width'];
                    if(!empty($basketItem['Height']))
                        $curCargoesDimensions['Height'] += $basketItem['Height'];
                    
                    if(isset($arDataProducts[$basketItem['IDProductPartner']]))
                        $arDataProducts[$basketItem['IDProductPartner']]['Quantity'] += 1;
                    else            
                        $arDataProducts[$basketItem['IDProductPartner']] = [
                            "IDProductPartner" => $basketItem['IDProductPartner'],
                            "NameShort"        => $basketItem['NameShort'],
                            "Price"            => $basketItem['Price'],
                            "Barcode"          => $basketItem['Barcode'],
                            "NDS"              => $basketItem['NDS'],
                            "Quantity"         => $basketItem['Quantity'],
                        ];
                    }
            }
            
            if(!empty($arDataProducts)){
                
                if($calcDimDefault == 'order'){ // значения по умолчанию для всего заказа
                        
                    if(empty($curCargoesDimensions["Weight"]))
                        $curCargoesDimensions["Weight"] = isset($dimensionsDefault['DEFAULT_WEIGHT']) ? $dimensionsDefault['DEFAULT_WEIGHT'] : 100;
                    if(empty($curCargoesDimensions["Length"]))
                        $curCargoesDimensions["Length"] = isset($dimensionsDefault['DEFAULT_LENGTH']) ? $dimensionsDefault['DEFAULT_LENGTH'] : 380;
                    if(empty($curCargoesDimensions["Width"]))
                        $curCargoesDimensions["Width"] = isset($dimensionsDefault['DEFAULT_WIDTH']) ? $dimensionsDefault['DEFAULT_WIDTH'] : 380;
                    if(empty($curCargoesDimensions["Height"]))
                        $curCargoesDimensions["Height"] = isset($dimensionsDefault['DEFAULT_HEIGHT']) ? $dimensionsDefault['DEFAULT_HEIGHT'] : 380;
                }
                
                sort($arDataProducts);
                $arCargoes = [
                    "Weight"  => $curCargoesDimensions['Weight'],
                    "Length"  => (int)$curCargoesDimensions['Length'],
                    "Width"   => (int)$curCargoesDimensions['Width'],
                    "Height"  => (int)$curCargoesDimensions['Height'],
                    "Product" => $arDataProducts
                ];
                $this->dataSent["Order"][0]["Cargoes"][$curCargoesInd] = $arCargoes;
            }
        }
        else{
        
            $arDataOrder["Order"][0]["Cargoes"][] = [
                "Weight"  => $dimensionsBasket['Weight'] > 1 ? $dimensionsBasket['Weight'] : 1,
                "Length"  => (int)$dimensionsBasket['Length'],
                "Width"   => (int)$dimensionsBasket['Width'],
                "Height"  => (int)$dimensionsBasket['Height'],
                "Product" => []
            ];
            
            \Bitrix\Main\Loader::includeModule('iblock');
            $fieldMarkingCode = Settings::getInstance()->getOption('integration_field_marking_code');

            foreach ($basketItems as $basketItem) {
                
                if((int)$basketItem->getQuantity() <= 0)
                    continue;
                
                if($fieldMarkingCode && ($issueType == 0 || $issueType == 1) && (int)$basketItem->getQuantity() == 1){
                    
                    $valuedMarkingCode = null;
                    $dbItem = \Bitrix\Iblock\ElementTable::getList([
                        'select' => ['ID', 'IBLOCK_ID'],
                        'filter' => ['ID' => $basketItem->getProductId()],
                        'limit' => 1,
                    ]);
                    if($arItem = $dbItem->fetch()) {
                        $dbProperty = \CIBlockElement::getProperty($arItem['IBLOCK_ID'], $arItem['ID'], ['sort', 'asc'], ['CODE' => $fieldMarkingCode]);
                        if($arProperty = $dbProperty->fetch()) {
                            if($arProperty['VALUE'])
                                $valuedMarkingCode = $arProperty['VALUE'];
                        }
                    }
                }
                
                $arDataProduct = [
                    "IDProductPartner" => $basketItem->getProductId(),
                    "NameShort"        => $basketItem->getField('NAME'),
                    "Price"            => $basketItem->getPrice(),
                    "Barcode"          => \Lpost\Delivery\Tools::getBarcode($this->orderManager->getDepartureNumber()),
                    "NDS"              => ((float)$basketItem->getField('VAT_RATE')) * 100,
                    "Quantity"         => $basketItem->getQuantity(),
                ];
                
                if($valuedMarkingCode)
                    $arDataProduct['ChestnyZnak'] = $valuedMarkingCode;
                
                $arDataOrder["Order"][0]["Cargoes"][0]['Product'][] = $arDataProduct;
            }
        }

        $data = $this->getData(
            "CreateOrders",
            [
                "token" => $this->getToken(),
                "json"  => str_replace("\u0027", "\u0027\u0027", \Bitrix\Main\Web\Json::encode($arDataOrder))
            ],
            "POST"
        );

        if(isset($data['JSON_TXT']) AND !empty($data['JSON_TXT'])) {
            $data = \Bitrix\Main\Web\Json::decode($data['JSON_TXT']);
        }

        if (empty($data[0]['ID_Order'])) {
            $this->setError(
                "Error saving an order in the api",
                true,
                [$data, $arDataOrder]
            );
        }

        if(!empty($data[0]['Message'])) {
            // $orderManager->
        }

        return (!empty($data[0]['ID_Order'])) ? $data[0] : "";

    }

    private function isOrderPrepayment($order, $pickupId, $type)
    {
        $isCash = false;

        if($type == "zone") {
            $zone = \Lpost\Delivery\Main\Zone::getZone([
                "id_pickup" => $pickupId
            ]);
            $isCash = $zone['is_cash'];

        }
        else {
            $pvz = \Lpost\Delivery\Main\Pvz::getPvz([
                "id_pickup" => $pickupId
            ]);
            $isCash = $pvz['is_cash'];
        }

        if($isCash !== false AND (int)$isCash === 0 AND !$order->isPaid())
        {
            return true;
        }
        return false;
    }

    public static function updateStateShipment(\Bitrix\Sale\Order $order, $state, $save = true)
    {

        $shipmentCollection = $order->getShipmentCollection();
        foreach ($shipmentCollection as $shipment) {
            if (!$shipment->isSystem()) {
                break;
            }
        }

        if(empty($shipment) || $shipment->isSystem()) {
            return false;
        }

        switch($state){
            case "CREATED": if(Settings::getInstance()->getOption('is_auto_allow_delivery') != 'N')
                                $shipment->setField("ALLOW_DELIVERY", "Y");
                            break;
            case "ACT_CREATED": $shipment->setField("DEDUCTED", "Y"); break;
            case "DONE": $shipment->setField("STATUS_ID", "DF"); break;
        }

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

    private function setShippingCost(\Bitrix\Sale\Order $order, &$arDataOrder)
    {
        $options = Settings::getInstance();

        if ($options->getOption("SHIPPING_COST_ACTIVE") == "Y") {

            $valueSumRansom = $options->getOption("SHIPPING_COST_VALUE_SUM_RANSOM");
            $valueSumDelivery = $options->getOption("SHIPPING_COST_VALUE_SUM_DELIVERY");
            
            if(!empty($valueSumRansom) && !empty($valueSumDelivery)){
                
                $arSumRansom = unserialize($valueSumRansom);
                $arSumDelivery = unserialize($valueSumDelivery);     
                
                foreach($arSumRansom as $key => $valueSumRansom){
                    
                    if(empty($valueSumRansom))
                        continue;
                    
                    $valueSumDelivery = $arSumDelivery[$key];

                    if (
                        $options->getOption("SHIPPING_COST_VALUE_SUM_RANSOM_TYPE")
                        == \Lpost\Delivery\TabOptions\TabShippingCost::VALUE_SUM_RANDOM_TYPE_PERCENT
                    ) {
                        $valueSumRansom = ($order->getPrice() - $order->getDeliveryPrice()) * ($valueSumRansom / 100);
                        $valueSumDelivery = $order->getDeliveryPrice() * ($valueSumDelivery / 100);
                    }

                    if ($valueSumRansom < ($order->getPrice() - $order->getDeliveryPrice())) {
                        $arDataOrder["Order"][0]["PaymentSettings"][] = [
                            "ValueSumRansom"   => (int)$valueSumRansom,
                            "ValueSumDelivery" => (int)$valueSumDelivery
                        ];
                    }
                }
            }
        }

        if($options->getOption("SHIPPING_COST_TAKE_MONEY_IF_REFUSAL") == "Y") {

            $valueSumRansom = 0;
            $valueSumDelivery = $order->getDeliveryPrice();

            $arDataOrder["Order"][0]["PaymentSettings"][] = [
                "ValueSumRansom" => $valueSumRansom,
                "ValueSumDelivery" => $valueSumDelivery
            ];
        }
    }
}

Youez - 2016 - github.com/yon3zu
LinuXploit