• Модуль: sale
  • Путь к файлу: ~/bitrix/modules/sale/lib/helpers/admin/blocks/orderpayment.php
  • Класс: BitrixSaleHelpersAdminBlocksOrderPayment
  • Вызов: OrderPayment::updateData
static function updateData(SaleOrder &$order, $payments, $canSetPaid = false)
{
	global $USER, $APPLICATION;

	$saleModulePermissions = $APPLICATION->GetGroupRight("sale");

	$result = new Result();
	$data['PAYMENT'] = array();

	if (!$order)
		throw new UserMessageException('Order does not exist');

	foreach ($payments as $payment)
	{
		$paymentId = intval($payment['PAYMENT_ID']);
		$isNew = ($paymentId <= 0);
		$paymentCollection = $order->getPaymentCollection();

		/** @var BitrixSalePayment $paymentItem */
		if ($isNew)
		{
			$paymentItem = $paymentCollection->createItem();
		}
		else
		{
			$paymentItem = $paymentCollection->getItemById($paymentId);

			if (!$paymentItem)
				throw new UserMessageException('Payment does not exist');
		}

		self::$defaultFields = $paymentItem->getFieldValues();

		$isReturn = (isset($payment['IS_RETURN']) && ($payment['IS_RETURN'] == 'Y' || $payment['IS_RETURN'] == 'P'));

		$psService = null;
		if ($payment['PAY_SYSTEM_ID'] > 0)
			$psService = PaySystemManager::getObjectById($payment['PAY_SYSTEM_ID']);

		$paymentFields = array(
			'PAY_SYSTEM_ID' => $payment['PAY_SYSTEM_ID'],
			'COMPANY_ID' => (isset($payment['COMPANY_ID']) && intval($payment['COMPANY_ID']) > 0) ? intval($payment['COMPANY_ID']) : 0,
			'PAY_VOUCHER_NUM' => $payment['PAY_VOUCHER_NUM'],
			'PAY_RETURN_NUM' => $payment['PAY_RETURN_NUM'],
			'PAY_RETURN_COMMENT' => $payment['PAY_RETURN_COMMENT'],
			'COMMENTS' => $payment['COMMENTS'] ?? null,
			'PAY_SYSTEM_NAME' => ($psService) ? $psService->getField('NAME') : ''
		);

		if ($isNew && $saleModulePermissions == "P")
		{
			if (empty($payment['COMPANY_ID']))
			{
				$paymentFields['COMPANY_ID'] = $order->getField('COMPANY_ID');
			}
			if (empty($payment['RESPONSIBLE_ID']))
			{
				$paymentFields['RESPONSIBLE_ID'] = $order->getField('RESPONSIBLE_ID');
				$paymentFields['EMP_RESPONSIBLE_ID'] = $USER->GetID();
				$paymentFields['DATE_RESPONSIBLE_ID'] = new DateTime();
			}

		}

		if (!$paymentItem->isPaid())
			$paymentFields['SUM'] = (float)str_replace(',', '.', $payment['SUM']);

		if ($payment['PRICE_COD'])
			$paymentFields['PRICE_COD'] = $payment['PRICE_COD'];

		if ($isNew)
			$paymentFields['DATE_BILL'] = new DateTime();

		if (!empty($payment['PAY_RETURN_DATE']))
		{
			try
			{
				$paymentFields['PAY_RETURN_DATE'] = new Date($payment['PAY_RETURN_DATE']);
			}
			catch (MainObjectException $exception)
			{
				$result->addError(
					new EntityError(Loc::getMessage('SALE_ORDER_PAYMENT_ERROR_RETURN_DATE_FORMAT'))
				);
			}
		}

		if (!empty($payment['PAY_VOUCHER_DATE']))
		{
			try
			{
				$paymentFields['PAY_VOUCHER_DATE'] = new Date($payment['PAY_VOUCHER_DATE']);
			}
			catch (MainObjectException $exception)
			{
				$result->addError(
					new EntityError(Loc::getMessage('SALE_ORDER_PAYMENT_ERROR_VOUCHER_DATE_FORMAT'))
				);
			}
		}

		if (isset($payment['RESPONSIBLE_ID']))
		{
			$paymentFields['RESPONSIBLE_ID'] = !empty($payment['RESPONSIBLE_ID']) ? $payment['RESPONSIBLE_ID'] : $USER->GetID();
			if ($payment['RESPONSIBLE_ID'] != $paymentItem->getField('RESPONSIBLE_ID'))
			{
				$paymentFields['DATE_RESPONSIBLE_ID'] = new DateTime();
				if (!$isNew)
					$paymentFields['EMP_RESPONSIBLE_ID'] = $USER->GetID();
			}
		}

		if ($result->isSuccess())
		{
			$setResult = $paymentItem->setFields($paymentFields);
			if (!$setResult->isSuccess())
				$result->addErrors($setResult->getErrors());

			if ($isReturn && $payment['OPERATION_ID'])
			{
				$setResult = $paymentItem->setReturn($payment['OPERATION_ID']);
				if (!$setResult->isSuccess())
					$result->addErrors($setResult->getErrors());
			}

			$isReturnChanged = $payment['IS_RETURN_CHANGED'] === 'Y';

			if (!$canSetPaid && !$isReturnChanged)
			{
				$setResult = $paymentItem->setPaid($payment['PAID']);
				if (!$setResult->isSuccess())
					$result->addErrors($setResult->getErrors());
			}

			if (isset($payment['ORDER_STATUS_ID']) && $payment['ORDER_STATUS_ID'])
			{
				$order->setField('STATUS_ID', $payment['ORDER_STATUS_ID']);
			}
		}

		$verify = $paymentItem->verify();
		if (!$verify->isSuccess())
		{
			$result->addErrors($verify->getErrors());
		}

		$data['PAYMENT'][] = $paymentItem;
	}

	$result->setData($data);

	return $result;
}