- Модуль: sale
- Путь к файлу: ~/bitrix/modules/sale/lib/shipmentitemstore.php
- Класс: BitrixSaleShipmentItemStore
- Вызов: ShipmentItemStore::onFieldModify
protected function onFieldModify($name, $oldValue, $value)
{
global $USER;
if (is_object($USER) && $USER->isAuthorized())
{
$this->setFieldNoDemand('MODIFIED_BY', $USER->GetID());
}
$this->setFieldNoDemand('DATE_MODIFY', new MainTypeDateTime());
$result = parent::onFieldModify($name, $oldValue, $value);
if (!$result->isSuccess())
{
return $result;
}
if (
$name === 'STORE_ID'
&& $this->needMoveReserve()
)
{
$shipmentItem = $this->getCollection()->getShipmentItem();
$basketItem = $shipmentItem->getBasketItem();
/** @var ReserveQuantityCollection $reserveCollection */
$reserveCollection = $basketItem->getReserveQuantityCollection();
if (
$reserveCollection
&& $shipmentItem->getReservedQuantity() > 0
&& $this->getQuantity() > 0
)
{
$storeIdFrom = (int)$oldValue ?: Configuration::getDefaultStoreId();
$storeIdTo = (int)$value;
if (
$storeIdFrom === 0
|| $storeIdTo === 0
|| $storeIdFrom === $storeIdTo
)
{
return $result;
}
$reserveTo = $reserveFrom = null;
/** @var ReserveQuantity $reserve */
foreach ($reserveCollection as $reserve)
{
if ($reserve->getStoreId() === $storeIdFrom)
{
$reserveFrom = $reserve;
}
elseif ($reserve->getStoreId() === $storeIdTo)
{
$reserveTo = $reserve;
}
if ($reserveTo && $reserveFrom)
{
break;
}
}
if ($reserveFrom)
{
$settableQuantity = $reserveFrom->getQuantity() - $this->getQuantity();
if ($settableQuantity > 0)
{
$reserveFrom->setField('QUANTITY', $settableQuantity);
}
else
{
$reserveFrom->delete();
}
}
if (!$reserveTo)
{
$reserveTo = $reserveCollection->create();
$reserveTo->setStoreId($storeIdTo);
}
$reserveTo->setQuantity($reserveTo->getQuantity() + $this->getQuantity());
}
}
elseif (
$name === 'QUANTITY'
&& $this->needMoveReserve()
)
{
$shipmentItem = $this->getCollection()->getShipmentItem();
$basketItem = $shipmentItem->getBasketItem();
/** @var ReserveQuantityCollection $reserveCollection */
$reserveCollection = $basketItem->getReserveQuantityCollection();
if ($reserveCollection && $shipmentItem->getReservedQuantity() > 0)
{
if ($value > $oldValue)
{
$storeIdFrom = Configuration::getDefaultStoreId();
$storeIdTo = $this->getStoreId();
}
else
{
$storeIdTo = Configuration::getDefaultStoreId();
$storeIdFrom = $this->getStoreId();
}
if (
$storeIdFrom === 0
|| $storeIdTo === 0
|| $storeIdFrom === $storeIdTo
)
{
return $result;
}
$reserveTo = $reserveFrom = null;
/** @var ReserveQuantity $reserve */
foreach ($reserveCollection as $reserve)
{
if ($reserve->getStoreId() === $storeIdFrom)
{
$reserveFrom = $reserve;
}
elseif ($reserve->getStoreId() === $storeIdTo)
{
$reserveTo = $reserve;
}
if ($reserveTo && $reserveFrom)
{
break;
}
}
$delta = abs($oldValue - $value);
if ($reserveFrom)
{
$settableQuantity = $reserveFrom->getQuantity() - $delta;
if ($settableQuantity > 0)
{
$reserveFrom->setField('QUANTITY', $settableQuantity);
}
else
{
$reserveFrom->delete();
}
}
if (!$reserveTo)
{
$reserveTo = $reserveCollection->create();
$reserveTo->setStoreId($storeIdTo);
}
$reserveTo->setQuantity($reserveTo->getQuantity() + $delta);
}
}
return $result;
}