• Модуль: 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;
}