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