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/sale/lib/archive/process/

Upload File :
current_dir [ Writeable] document_root [ Writeable]

 

Command :


[ Back ]     

Current File : /home/bitrix/ext_www/rospirotorg.ru/bitrix/modules/sale/lib/archive/process/orderarchiveitem.php
<?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];
	}

}

Youez - 2016 - github.com/yon3zu
LinuXploit