%PDF- %PDF-
| Direktori : /home/bitrix/www/bitrix/modules/sale/handlers/paysystem/inner/ |
| Current File : //home/bitrix/www/bitrix/modules/sale/handlers/paysystem/inner/handler.php |
<?php
namespace Sale\Handlers\PaySystem;
use Bitrix\Main\Request;
use Bitrix\Sale\Order;
use Bitrix\Sale\PaySystem;
use Bitrix\Sale\Payment;
use Bitrix\Sale\PriceMaths;
use Bitrix\Sale\Internals\UserBudgetPool;
use Bitrix\Main\Entity\EntityError;
use Bitrix\Main\Localization\Loc;
Loc::loadMessages(__FILE__);
class InnerHandler extends PaySystem\BaseServiceHandler implements PaySystem\IRefund
{
/**
* @param Payment $payment
* @param Request $request
* @return PaySystem\ServiceResult
* @throws \Bitrix\Main\ArgumentOutOfRangeException
*/
public function initiatePay(Payment $payment, Request $request = null)
{
$result = new PaySystem\ServiceResult();
/** @var \Bitrix\Sale\PaymentCollection $paymentCollection */
$paymentCollection = $payment->getCollection();
if ($paymentCollection)
{
/** @var \Bitrix\Sale\Order $order */
$order = $paymentCollection->getOrder();
if ($order)
{
$res = $payment->setPaid('Y');
if ($res->isSuccess())
{
$res = $order->save();
if (!$res->isSuccess())
{
$result->addErrors($res->getErrors());
}
}
else
{
$result->addErrors($res->getErrors());
}
}
}
return $result;
}
/**
* @return array
*/
public function getCurrencyList()
{
return array();
}
/**
* @param Payment $payment
* @param int $refundableSum
* @return PaySystem\ServiceResult
*/
public function refund(Payment $payment, $refundableSum)
{
$result = new PaySystem\ServiceResult();
/** @var \Bitrix\Sale\PaymentCollection $paymentCollection */
$paymentCollection = $payment->getCollection();
/** @var \Bitrix\Sale\Order $order */
$order = $paymentCollection->getOrder();
if ($this->isUserBudgetLock($order))
{
$result->addError(new EntityError(Loc::getMessage('ORDER_PSH_INNER_ERROR_USER_BUDGET_LOCK')));
return $result;
}
UserBudgetPool::addPoolItem($order, $refundableSum, UserBudgetPool::BUDGET_TYPE_ORDER_UNPAY, $payment);
return $result;
}
/**
* @param Payment $payment
* @return PaySystem\ServiceResult
*/
public function creditNoDemand(Payment $payment)
{
$result = new PaySystem\ServiceResult();
/** @var \Bitrix\Sale\PaymentCollection $collection */
$collection = $payment->getCollection();
/** @var \Bitrix\Sale\Order $order */
$order = $collection->getOrder();
if ($this->isUserBudgetLock($order))
{
$result->addError(new EntityError(Loc::getMessage('ORDER_PSH_INNER_ERROR_USER_BUDGET_LOCK')));
return $result;
}
$paymentSum = PriceMaths::roundPrecision($payment->getSum());
$userBudget = PriceMaths::roundPrecision(UserBudgetPool::getUserBudgetByOrder($order));
if($userBudget >= $paymentSum)
UserBudgetPool::addPoolItem($order, ( $paymentSum * -1 ), UserBudgetPool::BUDGET_TYPE_ORDER_PAY, $payment);
else
$result->addError(new EntityError(Loc::getMessage('ORDER_PSH_INNER_ERROR_INSUFFICIENT_MONEY')));
return $result;
}
/**
* @param Payment $payment
* @return PaySystem\ServiceResult
*/
public function debitNoDemand(Payment $payment)
{
return $this->refund($payment, $payment->getSum());
}
/**
* @param Order $order
* @return bool
*/
private function isUserBudgetLock(Order $order)
{
if ($userAccount = \CSaleUserAccount::GetByUserId($order->getUserId(), $order->getCurrency()))
return $userAccount['LOCKED'] == 'Y';
return false;
}
}