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/helpers/

Upload File :
current_dir [ Writeable] document_root [ Writeable]

 

Command :


[ Back ]     

Current File : /home/bitrix/ext_www/rospirotorg.ru/bitrix/modules/sale/lib/helpers/reservedproductcleaner.php
<?php

namespace Bitrix\Sale\Helpers;

use Bitrix\Main\Config\Option;
use Bitrix\Main;
use Bitrix\Main\ORM;
use Bitrix\Main\Type\DateTime;
use Bitrix\Main\Update\Stepper;
use Bitrix\Sale;
use Bitrix\Sale\ReserveQuantityCollection;

class ReservedProductCleaner extends Stepper
{
	private const RECORD_LIMIT = 100;

	protected static $moduleId = "sale";

	public function execute(array &$result)
	{
		$processedRecords = 0;

		$registry = Sale\Registry::getInstance(Sale\Registry::REGISTRY_TYPE_ORDER);
		/** @var Sale\Order $orderClass */
		$orderClass = $registry->getOrderClassName();

		$daysAgo = (int)Option::get("sale", "product_reserve_clear_period");

		if ($daysAgo > 0)
		{
			global $USER;
			$initUser = false;
			$oldUser = null;

			if (!(isset($USER) && $USER instanceof \CUser))
			{
				$initUser = true;
				$oldUser = $USER ?? null;
				$USER = new \CUser;
			}

			$date = new DateTime();
			$parameters = [
				'select' => [
					'ORDER_ID' => 'ORDER.ID',
					'ID',
					'BASKET_ID'
				],
				'filter' => [
					'>QUANTITY' => 0,
					'<=DATE_RESERVE_END' => $date,
					'=ORDER.PAYED' => 'N',
					'=ORDER.CANCELED' => 'N',
				],
				'runtime' => [
					new Main\Entity\ReferenceField(
						'BASKET',
						Sale\Internals\BasketTable::class,
						[
							'=this.BASKET_ID' => 'ref.ID',
						],
						['join_type' => 'inner']
					),
					new Main\Entity\ReferenceField(
						'ORDER',
						Sale\Internals\OrderTable::class,
						[
							'=this.BASKET.ORDER_ID' => 'ref.ID',
						],
						['join_type' => 'inner']
					),
				],
				'limit' => self::RECORD_LIMIT,
			];

			$orderList = [];
			$res = Sale\ReserveQuantityCollection::getList($parameters);
			while ($data = $res->fetch())
			{
				if (!isset($orderList[$data['ORDER_ID']]))
				{
					$orderList[$data['ORDER_ID']] = [];
				}

				if (!isset($orderList[$data['ORDER_ID']][$data['BASKET_ID']]))
				{
					$orderList[$data['ORDER_ID']][$data['BASKET_ID']] = [];
				}

				$orderList[$data['ORDER_ID']][$data['BASKET_ID']][] = $data['ID'];
			}

			foreach ($orderList as $orderId => $basketItemIds)
			{
				$order = $orderClass::load($orderId);
				if (!$order)
				{
					continue;
				}

				$basket = $order->getBasket();
				foreach ($basketItemIds as $basketItemId => $reserveIds)
				{
					/** @var Sale\BasketItem $basketItem */
					$basketItem = $basket->getItemById($basketItemId);
					if (!$basketItem)
					{
						continue;
					}

					foreach ($reserveIds as $reserveId)
					{
						/** @var ReserveQuantityCollection $reserveCollection */
						$reserveCollection = $basketItem->getReserveQuantityCollection();
						if (!$reserveCollection)
						{
							continue;
						}

						$reserve = $reserveCollection->getItemById($reserveId);
						if (!$reserve)
						{
							continue;
						}

						$reserve->delete();

						$processedRecords++;
					}
				}

				$r = $order->save();
				if (!$r->isSuccess())
				{
					$errorText = (string)$order->getField('REASON_MARKED');
					if ($errorText !== '')
					{
						$errorText .= "\n";
					}

					foreach($r->getErrorMessages() as $error)
					{
						if ((string)$error !== '')
						{
							$errorText .= $error."\n";
						}
					}

					Sale\Internals\OrderTable::update($order->getId(), [
						"MARKED" => "Y",
						"REASON_MARKED" => $errorText
					]);
				}
			}

			// crutch for #120087
			if ($initUser)
			{
				ORM\Entity::destroy(Sale\Internals\OrderTable::getEntity());
				if ($oldUser !== null)
				{
					$USER = $oldUser;
				}
			}
			unset($oldUser);
		}

		if ($processedRecords < self::RECORD_LIMIT)
		{
			return self::FINISH_EXECUTION;
		}

		return self::CONTINUE_EXECUTION;
	}
}

Youez - 2016 - github.com/yon3zu
LinuXploit