- Модуль: sale
- Путь к файлу: ~/bitrix/modules/sale/lib/shipmentitemcollection.php
- Класс: BitrixSaleShipmentItemCollection
- Вызов: ShipmentItemCollection::save
public function save()
{
$result = new MainEntityResult();
/** @var Shipment $shipment */
if (!$shipment = $this->getShipment())
{
throw new MainObjectNotFoundException('Entity "Shipment" not found');
}
/** @var ShipmentCollection $shipmentCollection */
if (!$shipmentCollection = $shipment->getCollection())
{
throw new MainObjectNotFoundException('Entity "ShipmentCollection" not found');
}
/** @var Order $order */
if (!$order = $shipmentCollection->getOrder())
{
throw new MainObjectNotFoundException('Entity "Order" not found');
}
$itemsFromDb = array();
if ($this->getShipment()->getId() > 0)
{
$itemsFromDbList = static::getList(
array(
"filter" => array("ORDER_DELIVERY_ID" => $this->getShipment()->getId()),
"select" => array("ID", 'BASKET_ID')
)
);
while ($itemsFromDbItem = $itemsFromDbList->fetch())
$itemsFromDb[$itemsFromDbItem["ID"]] = $itemsFromDbItem;
}
/** @var ShipmentItem $shipmentItem */
foreach ($this->collection as $shipmentItem)
{
/** @var BasketItem $basketItem */
if (!$basketItem = $shipmentItem->getBasketItem())
{
continue;
}
if ($basketItem->isBundleParent())
{
$this->addBundleToCollection($basketItem);
}
}
/** @var Shipment $shipment */
if (!$shipment = $this->getShipment())
{
throw new MainObjectNotFoundException('Entity "Shipment" not found');
}
$changeMeaningfulFields = array(
"QUANTITY",
"RESERVED_QUANTITY",
);
/** @var ShipmentItem $shipmentItem */
foreach ($this->collection as $shipmentItem)
{
/** @var BasketItem $basketItem */
if (!$basketItem = $shipmentItem->getBasketItem())
{
continue;
}
$isNew = (bool)($shipmentItem->getId() <= 0);
$isChanged = $shipmentItem->isChanged();
if ($order->getId() > 0 && $isChanged)
{
$logFields = array(
"BASKET_ID" => $basketItem->getId(),
"BASKET_ITEM_NAME" => $basketItem->getField("NAME"),
"BASKET_ITEM_PRODUCT_ID" => $basketItem->getField("PRODUCT_ID"),
"ORDER_DELIVERY_ID" => $shipmentItem->getField("ORDER_DELIVERY_ID"),
);
$fields = $shipmentItem->getFields();
$originalValues = $fields->getOriginalValues();
foreach($originalValues as $originalFieldName => $originalFieldValue)
{
if (in_array($originalFieldName, $changeMeaningfulFields) && $shipmentItem->getField($originalFieldName) != $originalFieldValue)
{
$logFields[$originalFieldName] = $shipmentItem->getField($originalFieldName);
if (!$isNew)
$logFields['OLD_'.$originalFieldName] = $originalFieldValue;
}
}
}
$r = $shipmentItem->save();
if ($r->isSuccess())
{
if ($order->getId() > 0 && $isChanged)
{
$registry = Registry::getInstance(static::getRegistryType());
/** @var OrderHistory $orderHistory */
$orderHistory = $registry->getOrderHistoryClassName();
$orderHistory::addLog(
'SHIPMENT_ITEM',
$order->getId(),
$isNew ? 'SHIPMENT_ITEM_ADD' : 'SHIPMENT_ITEM_UPDATE',
$shipmentItem->getId(),
$shipmentItem,
$logFields,
$orderHistory::SALE_ORDER_HISTORY_LOG_LEVEL_1
);
}
}
else
{
$result->addErrors($r->getErrors());
}
if (isset($itemsFromDb[$shipmentItem->getId()]))
{
unset($itemsFromDb[$shipmentItem->getId()]);
}
}
/** @var Basket $basket */
if (!$basket = $order->getBasket())
{
throw new MainObjectNotFoundException('Entity "Basket" not found');
}
foreach ($itemsFromDb as $k => $v)
{
$v['ENTITY_REGISTRY_TYPE'] = static::getRegistryType();
/** @var MainEvent $event */
$event = new MainEvent('sale', "OnBeforeSaleShipmentItemDeleted", array(
'VALUES' => $v,
));
$event->send();
static::deleteInternal($k);
/** @var MainEvent $event */
$event = new MainEvent('sale', "OnSaleShipmentItemDeleted", array(
'VALUES' => $v,
));
$event->send();
/** @var BasketItem $basketItem */
if ($basketItem = $basket->getItemById($k))
{
$registry = Registry::getInstance(static::getRegistryType());
/** @var OrderHistory $orderHistory */
$orderHistory = $registry->getOrderHistoryClassName();
$orderHistory::addAction(
'SHIPMENT',
$order->getId(),
'SHIPMENT_ITEM_BASKET_REMOVED',
$shipment->getId(),
null,
array(
'NAME' => $basketItem->getField('NAME'),
'QUANTITY' => $basketItem->getQuantity(),
'PRODUCT_ID' => $basketItem->getProductId(),
)
);
}
}
if ($order->getId() > 0)
{
$registry = Registry::getInstance(static::getRegistryType());
/** @var OrderHistory $orderHistory */
$orderHistory = $registry->getOrderHistoryClassName();
$orderHistory::collectEntityFields('SHIPMENT_ITEM', $order->getId());
}
return $result;
}