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