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/sale/lib/archive/process/ |
Upload File : |
<?php namespace Bitrix\Sale\Archive\Process; use Bitrix\Main, Bitrix\Main\Type, Bitrix\Main\Localization\Loc, Bitrix\Sale, Bitrix\Sale\Internals, Bitrix\Sale\Archive\Manager; Loc::loadMessages(__FILE__); /** * @package Bitrix\Sale\Archive\Process */ class OrderArchiveItem { private $order = null; private $orderDataFields = []; private $basketDataFields = []; /** * OrderArchiveItem constructor. * * @param Sale\Order $order */ public function __construct(Sale\Order $order) { $this->order = $order; $this->orderDataFields['ORDER'] = $order->getFieldValues(); } /** * @return int */ public function getId() { return $this->order->getId(); } /** * @param $name * @param array $value */ public function addOrderDataField($name, array $value) { if ($name !== 'ORDER') { $this->orderDataFields[$name] = $value; } } /** * @param array $value */ public function addBasketDataFields(array $value) { $this->basketDataFields = $value; } /** * @return Main\Result */ public function archive() { $r = $this->callEventOnBeforeOrderArchived($this->order); if (!$r->isSuccess()) { return $r; } $result = $this->saveOrderArchive(); if ($result->isSuccess()) { $archivedOrderId = $result->getId(); $basketItemIdList = array(); foreach ($this->basketDataFields as $basketItem) { $additionBasketResult = $this->saveBasketItemArchive($basketItem, $archivedOrderId); if ($additionBasketResult->isSuccess()) { $basketItemIdList[] = $additionBasketResult->getId(); } else { $result->addErrors($additionBasketResult->getErrors()); break; } } } if ($result->isSuccess()) { $this->tryUnreserveShipments(); $registry = Sale\Registry::getInstance(Sale\Registry::REGISTRY_TYPE_ORDER); /** @var Sale\Order $orderClass */ $orderClass = $registry->getOrderClassName(); $orderClass::deleteNoDemand($this->getId()); } else { if (!empty($archivedOrderId)) { Internals\OrderArchiveTable::delete($archivedOrderId); } if (!empty($basketItemIdList) && is_array($basketItemIdList)) { foreach ($basketItemIdList as $archivedBasketItemId) { Internals\BasketArchiveTable::delete($archivedBasketItemId); } } } return $result; } /** * @param Sale\Order $order * * @return Main\Result */ private function callEventOnBeforeOrderArchived(Sale\Order $order) { $result = new Main\Result(); $eventManager = Main\EventManager::getInstance(); if ($eventsList = $eventManager->findEventHandlers('sale', Sale\EventActions::EVENT_ON_ORDER_BEFORE_ARCHIVED)) { /** @var Main\Event $event */ $event = new Main\Event('sale', Sale\EventActions::EVENT_ON_ORDER_BEFORE_ARCHIVED, array( 'ENTITY' => $order )); $event->send(); if ($event->getResults()) { /** @var Main\EventResult $eventResult */ foreach($event->getResults() as $eventResult) { if($eventResult->getType() == Main\EventResult::ERROR) { $errorMsg = new Sale\ResultError(Main\Localization\Loc::getMessage('SALE_EVENT_ON_BEFORE_ORDER_SAVED_ERROR'), 'SALE_EVENT_ON_BEFORE_ORDER_SAVED_ERROR'); if ($eventResultData = $eventResult->getParameters()) { if (isset($eventResultData) && $eventResultData instanceof Sale\ResultError) { /** @var ResultError $errorMsg */ $errorMsg = $eventResultData; } } $result->addError($errorMsg); } } } } return $result; } /** * @throws Main\ArgumentException */ private function tryUnreserveShipments() { $shipmentData = $this->getOrderDataField('SHIPMENT'); foreach ($shipmentData as $shipment) { if ($shipment["RESERVED"] == "Y" && $shipment["DEDUCTED"] == "N") { if ($shipmentCollection = $this->order->getShipmentCollection()) { foreach ($shipmentCollection as $shipmentItem) { $shipmentItem->tryUnreserve(); } $this->order->save(); } break; } } } /** * @return Main\Entity\AddResult */ private function saveOrderArchive() { $preparedOrderData = array_intersect_key($this->getOrderDataField('ORDER'), array_flip(Manager::getOrderFieldNames())); $preparedOrderData['ORDER_ID'] = $this->getId(); $preparedOrderData['DATE_ARCHIVED'] = new Type\DateTime(); $preparedOrderData['VERSION'] = Manager::SALE_ARCHIVE_VERSION; $preparedFields = $this->prepareEncodeFields($this->orderDataFields); $preparedOrderData['ORDER_DATA'] = Main\Web\Json::encode($preparedFields); return Internals\OrderArchiveTable::add($preparedOrderData); } private function prepareEncodeFields(array $fields) { foreach ($fields as &$field) { if (is_array($field)) { $field = $this->prepareEncodeFields($field); } elseif ($field instanceof Type\Date) { \CTimeZone::Disable(); $field = $field->toString(); \CTimeZone::Enable(); } } return $fields; } /** * @param array $item * @param $archivedOrderId * * @return Main\Entity\AddResult */ private function saveBasketItemArchive(array $item, $archivedOrderId) { $preparedBasketItems = array_intersect_key($item, array_flip(Manager::getBasketFieldNames())); $preparedBasketItems['ARCHIVE_ID'] = (int)$archivedOrderId; $preparedFields = $this->prepareEncodeFields($item); $preparedBasketItems['BASKET_DATA'] = Main\Web\Json::encode($preparedFields); if (empty($preparedBasketItems['DATE_INSERT'])) { $zeroDate = new \DateTime(); $zeroDate->setDate(0,0,0); $zeroDate->setTime(0,0,0); $preparedBasketItems['DATE_INSERT'] = Type\DateTime::createFromPhp($zeroDate); } return Internals\BasketArchiveTable::add($preparedBasketItems); } private function getOrderDataField($name) { return $this->orderDataFields[$name]; } }