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

	/** @var SalePayment|null $paymentOuter */
	$paymentInner = null;

	/** @var SalePayment|null $paymentOuter */
	$paymentOuter = null;

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

	if (count($paymentCollection) > 2)
		return $result;

	$needSum = $order->getPrice() - $order->getSumPaid();

	if ($needSum > 0)
	{

		/** @var SalePayment $payment */
		foreach ($paymentCollection as $payment)
		{
			if (!$payment->isInner())
			{
				$paymentOuter = $payment;
				break;
			}
		}

		if (!$pay || ($pay && $paidFormUserBudget === false))
		{
			/** @var SalePayment $paymentInner */
			$paymentInner = $paymentCollection->getInnerPayment();
			if (!$paymentInner)
			{
				$paymentInner = $paymentCollection->createInnerPayment();
			}

			if (!$paymentInner)
			{
				throw new MainObjectNotFoundException('Entity inner "Payment" not found');
			}

			$userBudget = SaleInternalsUserBudgetPool::getUserBudget($order->getUserId(), $order->getCurrency());

			$setSum = $userBudget;
			if ($userBudget >= $needSum)
			{
				$setSum = $needSum;
			}

			if ($paymentInner->getId() == 0)
			{
				$paymentInnerFields = array(
					'SUM' => $setSum,
					'CURRENCY' => $order->getCurrency(),
					'DATE_BILL' => new MainTypeDateTime(),
				);

				$r = $paymentInner->setFields($paymentInnerFields);
				if (!$r->isSuccess())
				{
					$result->addErrors($r->getErrors());
				}
			}
			else
			{
				if ($paymentInner->getSum() < $needSum)
				{
					$paymentInner->setField('SUM', $needSum - $paymentInner->getSum());
				}
			}

			if ($pay && $paidFormUserBudget === false)
			{
				$paymentOuter->setField('SUM', $needSum - $setSum);
			}

			$payment = $paymentInner;

		}
		else
		{
			$payment = $paymentOuter;
		}

		if ($pay)
		{

			if ($payment === null)
			{
				$paySystemId = static::getDefaultPaySystemId($order->getPersonTypeId());

				/** @var SalePaySystemService $paySystem */
				if ($paySystem = SalePaySystemManager::getObjectById($paySystemId))
				{
					$registry = SaleRegistry::getInstance(static::getRegistryType());
					/** @var SalePayment $paymentClassName */
					$paymentClassName = $registry->getPaymentClassName();

					$payment = $paymentClassName::create($paymentCollection, $paySystem);
					$payment->setField('SUM', $needSum);
					$payment->setField('DATE_BILL', new MainTypeDateTime());
					$paymentCollection->addItem($payment);
				}
			}

			$operationPayment = $payment;
			if ($paidFormUserBudget === false)
			{
				$operationPayment = $paymentOuter;
			}

			$service = SalePaySystemManager::getObjectById($operationPayment->getPaymentSystemId());
			if ($service)
			{
				$r = $service->creditNoDemand($operationPayment);
				if (!$r->isSuccess())
					$result->addErrors($r->getErrors());
			}
			else
			{
				$result->addError(new MainEntityEntityError(MainLocalizationLoc::getMessage('SALE_COMPATIBLE_PAYSYSTEM_NOT_FOUND')));
				return $result;
			}
		}

		if ($payment->isReturn() && $payment->isInner())
		{
			$r = $payment->setPaid('Y');
		}
		else
		{
			/** @var SaleResult $r */
			$r = $payment->setPaid('Y');

			if ($r->isSuccess())
			{
				if ($pay)
				{
					$operationPayment = $payment;
					if ($paidFormUserBudget === false)
					{
						$operationPayment = $paymentOuter;

						/** @var SaleResult $resultPayment */
						$resultPayment = $paymentOuter->setPaid('Y');
						if (!$resultPayment->isSuccess())
						{
							$result->addErrors($resultPayment->getErrors());
						}
					}

					$service = SalePaySystemManager::getObjectById($operationPayment->getPaymentSystemId());
					if ($service)
					{
						$r = $service->creditNoDemand($operationPayment);
						if (!$r->isSuccess())
							$result->addErrors($r->getErrors());
					}
					else
					{
						$result->addError(new MainEntityEntityError(MainLocalizationLoc::getMessage('SALE_COMPATIBLE_PAYSYSTEM_NOT_FOUND')));
						return $result;
					}
				}

			}
			else
			{
				$result->addErrors($r->getErrors());
			}
		}

		if (!$r->isSuccess())
		{
			$result->addErrors($r->getErrors());
		}

	}

	$result->setData(array('PAID_FROM_BUDGET' => $paidFormUserBudget));

	return $result;
}