3namespace Bitrix\Sale\Reservation;
5use Bitrix\Main\Application;
6use Bitrix\Main\DB\SqlExpression;
8use Bitrix\Main\ORM\Data\DeleteResult;
10use Bitrix\Sale\Internals\BasketTable;
11use Bitrix\Main\Type\DateTime;
12use Bitrix\Sale\Internals\StoreProductTable;
13use Bitrix\Sale\Reservation\Internals\BasketReservationHistoryTable;
14use Bitrix\Sale\Reservation\Internals\BasketReservationTable;
24 Loader::includeModule(
'catalog');
33 private function roundQuantity(
float $quantity): float
36 return round($quantity,
$precision, PHP_ROUND_HALF_DOWN);
54 '=RESERVATION_ID' => $reservationId,
57 foreach (
$rows as $row)
59 $total += (float)$row[
'QUANTITY'];
77 BasketTable::getList([
82 'filter' => $basketItemFilter,
87 $basket2productIds = array_filter(array_column($basketItems,
'PRODUCT_ID',
'ID'));
88 if (empty($basket2productIds))
102 '=PRODUCT_ID' => $basket2productIds,
105 foreach (
$rows as $row)
107 $calculator->setStoreQuantity($row[
'STORE_ID'], $row[
'PRODUCT_ID'], $row[
'AMOUNT']);
114 'STORE_ID' =>
'RESERVATION.STORE_ID',
115 'BASKET_ID' =>
'RESERVATION.BASKET_ID',
116 'PRODUCT_ID' =>
'RESERVATION.BASKET.PRODUCT_ID',
119 '!RESERVATION.STORE_ID' =>
null,
120 '=RESERVATION.BASKET.PRODUCT_ID' => $basket2productIds,
123 'DATE_RESERVE' =>
'ASC',
127 foreach ($reservationsRows as $row)
129 $calculator->addReservationHistory(
137 return $calculator->getQuantityForBatch($basket2productIds);
151 '=ORDER_ID' => $orderId,
180 $basketItem = BasketTable::getRow([
188 if (!$basketItem || !$basketItem[
'PRODUCT_ID'])
193 $productId = (int)$basketItem[
'PRODUCT_ID'];
199 '=STORE_ID' => $storeId,
200 '=PRODUCT_ID' => $productId,
203 if (!$storeQuantityRow)
209 $calculator->setStoreQuantity($storeId, $productId, $storeQuantityRow[
'AMOUNT']);
215 'BASKET_ID' =>
'RESERVATION.BASKET_ID',
218 '=RESERVATION.STORE_ID' => $storeId,
219 '=RESERVATION.BASKET.PRODUCT_ID' => $productId,
222 'DATE_RESERVE' =>
'ASC',
225 foreach ($reservationsRows as $row)
227 $calculator->addReservationHistory(
235 return $calculator->getQuantityForItem($productId, $basketId, $storeId);
256 private function addQuantity(
int $reservationId,
float $quantity):
Result
259 'RESERVATION_ID' => $reservationId,
261 'QUANTITY' => $quantity,
276 throw new Exception(
'Reservation not found');
279 return $this->addQuantity($reservationId, (
float)$reservation[
'QUANTITY']);
305 throw new Exception(
'Reservation not found');
308 $reservationQuantity = $this->roundQuantity($reservation[
'QUANTITY']);
311 if ($reservationQuantity !== $historyQuantity)
313 return $this->addQuantity($reservationId, $reservationQuantity - $historyQuantity);
347 '=RESERVATION_ID' => $reservationId,
350 foreach (
$rows as $row)
353 foreach ($deleteResult->getErrors() as $err)
static getRowById($id, array $parameters=[])
static getRow(array $parameters)
static getList(array $parameters=array())
static update($primary, array $data)
deleteByReservation(int $reservationId)
updateByReservation(int $reservationId)
addByReservation(int $reservationId)
getAvailableCountForBasketItem(int $basketId, int $storeId)
getAvailableCountForOrder(int $orderId)
update(int $id, array $fields)
getQuantityByReservation(int $reservationId)
getAvailableCountForBasketItems(array $basketItemFilter)
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)