public function save()
{
$result = new EntityResult();
/** @var Order $order */
if (!$order = $this->getOrder())
{
throw new MainObjectNotFoundException('Entity "Order" not found');
}
$itemsFromDb = array();
if ($order->getId() > 0)
{
$itemsFromDbList = static::getList(
array(
"filter" => array("ORDER_ID" => $order->getId()),
"select" => array("ID" , "DELIVERY_NAME", "DELIVERY_ID")
)
);
while ($itemsFromDbItem = $itemsFromDbList->fetch())
$itemsFromDb[$itemsFromDbItem["ID"]] = $itemsFromDbItem;
}
/** @var Shipment $shipment */
foreach ($this->collection as $shipment)
{
if ($shipment->isSystem())
continue;
if (($systemShipment = $this->getSystemShipment()) && $systemShipment->getId() == 0)
{
/** @var Result $r */
$r = $this->cloneShipment($shipment, $systemShipment);
if ($r->isSuccess())
{
break;
}
else
{
$result->addErrors($r->getErrors());
}
}
}
$changeMeaningfulFields = array(
"DELIVERY_LOCATION",
"PRICE_DELIVERY",
"CUSTOM_PRICE_DELIVERY",
"ALLOW_DELIVERY",
"DEDUCTED",
"RESERVED",
"DELIVERY_NAME",
"DELIVERY_ID",
"CANCELED",
"MARKED",
"SYSTEM",
"COMPANY_ID",
"DISCOUNT_PRICE",
"BASE_PRICE_DELIVERY",
"EXTERNAL_DELIVERY",
);
/** @var Shipment $shipment */
foreach ($this->collection as $shipment)
{
$isNew = (bool)($shipment->getId() <= 0);
$isChanged = $shipment->isChanged();
if ($order->getId() > 0 && $isChanged)
{
$logFields = array();
$fields = $shipment->getFields();
$originalValues = $fields->getOriginalValues();
foreach($originalValues as $originalFieldName => $originalFieldValue)
{
if (in_array($originalFieldName, $changeMeaningfulFields) && $shipment->getField($originalFieldName) != $originalFieldValue)
{
$logFields[$originalFieldName] = $shipment->getField($originalFieldName);
if (!$isNew)
$logFields['OLD_'.$originalFieldName] = $originalFieldValue;
}
}
}
$r = $shipment->save();
if ($r->isSuccess())
{
if ($order->getId() > 0)
{
if ($isChanged)
{
$registry = Registry::getInstance(static::getRegistryType());
/** @var OrderHistory $orderHistory */
$orderHistory = $registry->getOrderHistoryClassName();
$orderHistory::addLog(
'SHIPMENT',
$order->getId(),
$isNew ? 'SHIPMENT_ADD' : 'SHIPMENT_UPDATE',
$shipment->getId(),
$shipment,
$logFields,
$orderHistory::SALE_ORDER_HISTORY_LOG_LEVEL_1
);
$orderHistory::addAction(
'SHIPMENT',
$order->getId(),
"SHIPMENT_SAVED",
$shipment->getId(),
$shipment,
array(),
OrderHistory::SALE_ORDER_HISTORY_ACTION_LOG_LEVEL_1
);
}
}
}
else
{
$result->addErrors($r->getErrors());
}
if (isset($itemsFromDb[$shipment->getId()]))
unset($itemsFromDb[$shipment->getId()]);
}
foreach ($itemsFromDb as $k => $v)
{
$v['ENTITY_REGISTRY_TYPE'] = static::getRegistryType();
/** @var MainEvent $event */
$event = new MainEvent('sale', "OnBeforeSaleShipmentDeleted", array(
'VALUES' => $v,
));
$event->send();
$this->deleteInternal($k);
$this->deleteExtraServiceInternal($k);
/** @var MainEvent $event */
$event = new MainEvent('sale', "OnSaleShipmentDeleted", array(
'VALUES' => $v,
));
$event->send();
if ($order->getId() > 0)
{
$registry = Registry::getInstance(static::getRegistryType());
/** @var OrderHistory $orderHistory */
$orderHistory = $registry->getOrderHistoryClassName();
$orderHistory::addAction(
'SHIPMENT',
$order->getId(),
'SHIPMENT_REMOVED',
$k,
null,
array(
'ID' => $k,
'DELIVERY_NAME' => $v['DELIVERY_NAME'],
'DELIVERY_ID' => $v['DELIVERY_ID'],
)
);
$registry = Registry::getInstance(static::getRegistryType());
/** @var EntityMarker $entityMarker */
$entityMarker = $registry->getEntityMarkerClassName();
$entityMarker::deleteByFilter(array(
'=ORDER_ID' => $order->getId(),
'=ENTITY_TYPE' => $entityMarker::ENTITY_TYPE_SHIPMENT,
'=ENTITY_ID' => $k,
));
}
}
if ($order->getId() > 0)
{
$registry = Registry::getInstance(static::getRegistryType());
/** @var OrderHistory $orderHistory */
$orderHistory = $registry->getOrderHistoryClassName();
$orderHistory::collectEntityFields('SHIPMENT', $order->getId());
}
return $result;
}