• Модуль: sale
  • Путь к файлу: ~/bitrix/modules/sale/lib/compatible/ordercompatibility.php
  • Класс: BitrixSaleCompatibleOrderCompatibility
  • Вызов: OrderCompatibility::pay
static function pay($orderId, array $values, $withdraw = false, $pay = false)
{
	$result = new SaleResult();

	$paid = null;
	if (isset($values['PAYED']) && strval($values['PAYED']) != '')
	{
		$values['PAID'] = $values['PAYED'];
	}

	if (intval($orderId) <= 0)
	{
		$result->addError( new SaleResultError(MainLocalizationLoc::getMessage('SALE_COMPATIBLE_ORDER_ID_NOT_FOUND'), 'SALE_COMPATIBLE_ORDER_ID_NOT_FOUND') );
		return $result;
	}

	$registry = SaleRegistry::getInstance(static::getRegistryType());
	/** @var SaleOrder $orderClassName */
	$orderClassName = $registry->getOrderClassName();
	if (!$order = $orderClassName::load($orderId))
	{
		$result->addError( new SaleResultError(MainLocalizationLoc::getMessage('SALE_COMPATIBLE_ORDER_NOT_FOUND'), 'SALE_COMPATIBLE_ORDER_NOT_FOUND') );
		return $result;
	}

	if ($order->isCanceled())
	{
		/** @var SaleResult $r */
		$r = $order->setField('CANCELED', 'N');
		if (!$r->isSuccess())
		{
			$result->addErrors($r->getErrors());
			return $result;
		}
	}

	/** @var SalePaymentCollection $paymentCollection */
	if (!$paymentCollection = $order->getPaymentCollection())
	{
		throw new MainObjectNotFoundException('Entity "PaymentCollection" not found');
	}

	$paidFormUserBudget = false;

	if ($withdraw)
	{
		/** @var SaleResult $r */
		$r = static::payFromBudget($order, $pay);
		if (!$r->isSuccess())
		{
			$result->addErrors($r->getErrors());
		}
		else
		{
			$payBudgetData = $r->getData();
			if (array_key_exists('PAID_FROM_BUDGET', $payBudgetData))
			{
				$paidFormUserBudget = $payBudgetData['PAID_FROM_BUDGET'];
			}
		}

	}


	if (!$paidFormUserBudget)
	{
		/** @var SalePayment $payment */
		foreach ($paymentCollection as $payment)
		{
			if (empty($fields))
			{
				if (isset($values['=DATE_PAYED']))
				{
					$values['DATE_PAID'] = $values['=DATE_PAYED'];
					unset($values['=DATE_PAYED']);
				}

				$values = static::convertDateFields($values, static::getPaymentDateFields());
				$fields = static::clearFields($values, $payment->getAvailableFields());

			}

			if ($values['PAID'] == "N" && !$payment->isPaid())
				continue;

			if ($withdraw && $values['PAID'] == "N" && $payment->isInner())
			{
				/** @var SaleResult $r */
				$r = $payment->setReturn('Y');
				if (!$r->isSuccess())
				{
					$result->addErrors($r->getErrors());
				}
			}
			else
			{
				$oldPaid = $payment->isPaid();
				/** @var SaleResult $r */
				$r = $payment->setPaid($values['PAID']);
				if (!$r->isSuccess())
				{
					$result->addErrors($r->getErrors());
				}

				if ($payment->isInner() && !$oldPaid && $payment->isPaid())
				{
					SaleInternalsUserBudgetPool::addPoolItem($order, ( $payment->getSum() * -1 ), SaleInternalsUserBudgetPool::BUDGET_TYPE_ORDER_UNPAY, $payment);
					if (!$r->isSuccess())
					{
						$result->addErrors($r->getErrors());
					}
				}

			}

			if (isset($fields['PAID']))
			{
				unset($fields['PAID']);
			}

			$r = $payment->setFields($fields);
			if (!$r->isSuccess())
			{
				$result->addErrors($r->getErrors());
			}
		}
	}

	if (!$result->isSuccess())
	{
		return $result;
	}

	/** @var SaleResult $r */
	$r = $order->save();
	if (!$r->isSuccess())
	{
		$result->addErrors($r->getErrors());
	}
	return $result;
}