%PDF- %PDF-
Server IP : 37.220.80.31 / Your IP : 3.145.107.1 Web Server : Apache/2.4.52 (Ubuntu) System : Linux 3051455-guretool.twc1.net 5.15.0-107-generic #117-Ubuntu SMP Fri Apr 26 12:26:49 UTC 2024 x86_64 User : www-root ( 1010) PHP Version : 7.4.33 Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority, MySQL : OFF | cURL : ON | WGET : OFF | Perl : OFF | Python : OFF | Sudo : OFF | Pkexec : OFF Directory : /var/www/www-root/data/www/dev.artlot24.ru/bitrix/modules/sale/lib/internals/ |
Upload File : |
<?php namespace Bitrix\Sale\Internals; use Bitrix\Main; use Bitrix\Sale; /** * Class ShipmentRules * @package Bitrix\Sale\Internals */ class ShipmentRules { /** * ShipmentRules constructor. */ protected function __construct() { } /** * @param Sale\Order $order * @param PoolQuantity $pool * * @return array */ public static function createOrderRuleMap(Sale\Order $order, PoolQuantity $pool) { $resultList = array(); $items = ItemsPool::getPoolByCode($order->getInternalId()); if (empty($items)) { return $resultList; } foreach ($items as $productId => $shipmentItemList) { foreach ($shipmentItemList as $shipmentItem) { $shipmentItemRule = static::createReserveRule($shipmentItem, $pool); if (!empty($shipmentItemRule) && is_array($shipmentItemRule)) { $resultList[] = $shipmentItemRule; } $shipmentItemRule = static::createShipRule($shipmentItem, $pool); if (!empty($shipmentItemRule) && is_array($shipmentItemRule)) { $resultList[] = $shipmentItemRule; } } } return $resultList; } /** * @param Sale\ShipmentItem $shipmentItem * @param PoolQuantity $pool * * @return array|bool * @throws Main\ObjectNotFoundException */ private static function createShipRule(Sale\ShipmentItem $shipmentItem, PoolQuantity $pool) { $basketItem = $shipmentItem->getBasketItem(); if (!$basketItem) { throw new Main\ObjectNotFoundException('Entity "BasketItem" not found'); } if ($basketItem->isBundleParent()) { return false; } /** @var Sale\ShipmentItemCollection $shipmentItemCollection */ $shipmentItemCollection = $shipmentItem->getCollection(); if (!$shipmentItemCollection) { throw new Main\ObjectNotFoundException('Entity "ShipmentItemCollection" not found'); } $shipment = $shipmentItemCollection->getShipment(); if (!$shipment) { throw new Main\ObjectNotFoundException('Entity "Shipment" not found'); } $poolQuantitiesList = $pool->getQuantities(PoolQuantity::POOL_QUANTITY_TYPE); if (empty($poolQuantitiesList)) { return false; } $productId = $basketItem->getProductId(); $needQuantity = (float)$shipmentItem->getQuantity(); $rule = array( 'SHIPMENT_ITEM' => $shipmentItem, 'PRODUCT_ID' => $productId, 'PROVIDER_NAME' => $basketItem->getProvider(), 'NEED_RESERVE' => $shipmentItem->needReserve(), ); $storeData = Sale\Internals\Catalog\Provider::createMapShipmentItemStoreData($shipmentItem); if (!empty($storeData)) { $shipmentItemIndex = $shipmentItem->getInternalIndex(); $rule['STORE_DATA'] = array( $shipmentItemIndex => $storeData ); } if (array_key_exists($productId, $poolQuantitiesList)) { if ($shipment->needShip() === Sale\Internals\Catalog\Provider::SALE_TRANSFER_PROVIDER_SHIPMENT_NEED_SHIP) { $needQuantity *= -1; } $shipQuantity = $poolQuantitiesList[$productId] - $needQuantity; $rule['ACTION'][PoolQuantity::POOL_QUANTITY_TYPE] = $needQuantity; $pool->set(PoolQuantity::POOL_QUANTITY_TYPE, $productId, $shipQuantity); } return $rule; } /** * @param Sale\ShipmentItem $shipmentItem * @param PoolQuantity $pool * * @return array|bool * @throws Main\ObjectNotFoundException */ private static function createReserveRule(Sale\ShipmentItem $shipmentItem, PoolQuantity $pool) { $basketItem = $shipmentItem->getBasketItem(); if (!$basketItem) { throw new Main\ObjectNotFoundException('Entity "BasketItem" not found'); } /** @var Sale\ShipmentItemCollection $shipmentItemCollection */ $shipmentItemCollection = $shipmentItem->getCollection(); if (!$shipmentItemCollection) { throw new Main\ObjectNotFoundException('Entity "ShipmentItemCollection" not found'); } $shipment = $shipmentItemCollection->getShipment(); if (!$shipment) { throw new Main\ObjectNotFoundException('Entity "Shipment" not found'); } $poolReservationList = $pool->getQuantities(PoolQuantity::POOL_RESERVE_TYPE); if (empty($poolReservationList)) { return false; } $order = $shipment->getParentOrder(); if (!$order) { throw new Main\ObjectNotFoundException('Entity "Order" not found'); } $productId = $basketItem->getProductId(); $needQuantity = floatval($shipmentItem->getNeedReserveQuantity()); $rule = array( 'SHIPMENT_ITEM' => $shipmentItem, 'PRODUCT_ID' => $productId, 'PROVIDER_NAME' => $basketItem->getProvider(), 'STORE' => array() ); if ($shipment->needShip() === Sale\Internals\Catalog\Provider::SALE_TRANSFER_PROVIDER_SHIPMENT_NEED_NOT_SHIP) { return false; } if (isset($poolReservationList[$productId])) { if ($needQuantity == 0) { $needQuantity = $poolReservationList[$productId]; } $reserveQuantity = $poolReservationList[$productId] - $needQuantity; $rule['ACTION'][PoolQuantity::POOL_RESERVE_TYPE] = $needQuantity; $pool->set(PoolQuantity::POOL_RESERVE_TYPE, $productId, $reserveQuantity); } return $rule; } /** * @param array $rules * @param array $context * * @return Sale\Result * @throws Main\ObjectNotFoundException */ public static function saveRules(array $rules, array $context) { $result = new Sale\Result(); $shipProductsList = array(); foreach ($rules as $ruleData) { if (empty($ruleData['ACTION'])) continue; foreach ($ruleData['ACTION'] as $action => $quantity) { if ($quantity == 0) continue; $fields = $ruleData; $fields['QUANTITY'] = $quantity; unset($fields['ACTION']); if ($action == PoolQuantity::POOL_QUANTITY_TYPE) { $shipProductsList[] = $fields; } elseif ($action == PoolQuantity::POOL_RESERVE_TYPE) { $reserveProductsList[] = $fields; } } } if (!empty($reserveProductsList)) { $creator = Sale\Internals\ProviderCreator::create($context); /** @var Sale\ShipmentItem $shipmentItem */ foreach ($reserveProductsList as $reserveProductData) { $creator->addShipmentProductData($reserveProductData); } $r = $creator->reserve(); if ($r->isSuccess()) { $r = $creator->setItemsResultAfterReserve($r); if (!$r->isSuccess()) { $result->addErrors($r->getErrors()); } } else { $result->addErrors($r->getErrors()); } } if (!empty($shipProductsList)) { $creator = Sale\Internals\ProviderCreator::create($context); /** @var Sale\ShipmentItem $shipmentItem */ foreach ($shipProductsList as $shipProductData) { $creator->addShipmentProductData($shipProductData); } $r = $creator->ship(); if (!$r->isSuccess()) { $result->addErrors($r->getErrors()); } if ($r->hasWarnings()) { $result->addWarnings($r->getWarnings()); } $r = $creator->setItemsResultAfterShip($r); if (!$r->isSuccess()) { $result->addErrors($r->getErrors()); } } return $result; } }