- Модуль: sale
- Путь к файлу: ~/bitrix/modules/sale/lib/paymentcollection.php
- Класс: BitrixSalePaymentCollection
- Вызов: PaymentCollection::save
public function save()
{
$result = new EntityResult();
/** @var Order $order */
if (!$order = $this->getOrder())
{
throw new MainObjectNotFoundException('Entity "Order" not found');
}
$itemsFromDb = array();
if ($this->getOrder()->getId() > 0)
{
$itemsFromDbList = static::getList(
array(
"filter" => array("ORDER_ID" => $this->getOrder()->getId()),
"select" => array("ID", "PAY_SYSTEM_NAME", "PAY_SYSTEM_ID")
)
);
while ($itemsFromDbItem = $itemsFromDbList->fetch())
$itemsFromDb[$itemsFromDbItem["ID"]] = $itemsFromDbItem;
}
$changeMeaningfulFields = array(
"PAID",
"PAY_SYSTEM_ID",
"PAY_SYSTEM_NAME",
"SUM",
"IS_RETURN",
"ACCOUNT_NUMBER",
"EXTERNAL_PAYMENT",
);
/** @var Payment $payment */
foreach ($this->collection as $payment)
{
$isNew = (bool)($payment->getId() <= 0);
$isChanged = $payment->isChanged();
if ($order->getId() > 0 && $isChanged)
{
$logFields = array();
$fields = $payment->getFields();
$originalValues = $fields->getOriginalValues();
foreach($originalValues as $originalFieldName => $originalFieldValue)
{
if (in_array($originalFieldName, $changeMeaningfulFields) && $payment->getField($originalFieldName) != $originalFieldValue)
{
$logFields[$originalFieldName] = $payment->getField($originalFieldName);
if (!$isNew)
$logFields['OLD_'.$originalFieldName] = $originalFieldValue;
}
}
}
$r = $payment->save();
if ($r->isSuccess())
{
if ($order->getId() > 0)
{
if ($isChanged)
{
$registry = Registry::getInstance(static::getRegistryType());
/** @var OrderHistory $orderHistory */
$orderHistory = $registry->getOrderHistoryClassName();
$orderHistory::addLog(
'PAYMENT',
$order->getId(),
$isNew ? 'PAYMENT_ADD' : 'PAYMENT_UPDATE',
$payment->getId(),
$payment,
$logFields,
$orderHistory::SALE_ORDER_HISTORY_LOG_LEVEL_1
);
$orderHistory::addAction(
'PAYMENT',
$order->getId(),
"PAYMENT_SAVED",
$payment->getId(),
$payment,
array(),
OrderHistory::SALE_ORDER_HISTORY_ACTION_LOG_LEVEL_1
);
}
}
}
else
{
$result->addErrors($r->getErrors());
}
if (isset($itemsFromDb[$payment->getId()]))
{
unset($itemsFromDb[$payment->getId()]);
}
}
foreach ($itemsFromDb as $k => $v)
{
$v['ENTITY_REGISTRY_TYPE'] = static::getRegistryType();
/** @var MainEvent $event */
$event = new MainEvent('sale', "OnBeforeSalePaymentDeleted", array(
'VALUES' => $v,
));
$event->send();
static::deleteInternal($k);
/** @var MainEvent $event */
$event = new MainEvent('sale', "OnSalePaymentDeleted", array(
'VALUES' => $v,
));
$event->send();
if ($order->getId() > 0)
{
$registry = Registry::getInstance(static::getRegistryType());
/** @var OrderHistory $orderHistory */
$orderHistory = $registry->getOrderHistoryClassName();
$orderHistory::addAction('PAYMENT', $order->getId(), 'PAYMENT_REMOVE', $k, null, array(
"PAY_SYSTEM_NAME" => $v["PAY_SYSTEM_NAME"],
"PAY_SYSTEM_ID" => $v["PAY_SYSTEM_ID"],
));
$registry = Registry::getInstance(static::getRegistryType());
/** @var EntityMarker $entityMarker */
$entityMarker = $registry->getEntityMarkerClassName();
$entityMarker::deleteByFilter(array(
'=ORDER_ID' => $order->getId(),
'=ENTITY_TYPE' => $entityMarker::ENTITY_TYPE_PAYMENT,
'=ENTITY_ID' => $k,
));
}
}
if ($order->getId() > 0)
{
$registry = Registry::getInstance(static::getRegistryType());
/** @var OrderHistory $orderHistory */
$orderHistory = $registry->getOrderHistoryClassName();
$orderHistory::collectEntityFields('PAYMENT', $order->getId());
}
return $result;
}