52 lines
1.8 KiB
PHP
52 lines
1.8 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace paygw_moneta\local\order;
|
|
|
|
use core_payment\helper;
|
|
use paygw_moneta\local\ErrorLogLogger;
|
|
use paygw_moneta\local\GatewayConfig;
|
|
use paygw_moneta\local\Logger;
|
|
use paygw_moneta\local\Money;
|
|
|
|
/**
|
|
* Текущая цена оплачиваемого объекта (с наценкой шлюза) против суммы заказа:
|
|
* Pay URL и ссылка на оплату не должны давать дожать заказ, если цена
|
|
* изменилась после его создания.
|
|
*
|
|
* @package paygw_moneta
|
|
* @copyright 2026 Moneta Labs {@link https://moneta.ru/}
|
|
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
|
*/
|
|
class CurrentPrice
|
|
{
|
|
public function __construct(
|
|
private readonly Logger $logger = new ErrorLogLogger(),
|
|
) {}
|
|
|
|
/**
|
|
* Сумма заказа равна текущей стоимости объекта. Объект мог исчезнуть —
|
|
* тогда и оплачивать нечего.
|
|
*/
|
|
public function matches(Order $order): bool
|
|
{
|
|
try {
|
|
$payable = helper::get_payable($order->component, $order->paymentArea, $order->itemId);
|
|
$current = Money::fromFloat(
|
|
helper::get_rounded_cost(
|
|
$payable->get_amount(),
|
|
$payable->get_currency(),
|
|
helper::get_gateway_surcharge(GatewayConfig::GATEWAY),
|
|
),
|
|
);
|
|
} catch (\Throwable $exception) {
|
|
$this->logger->error('Оплачиваемый объект недоступен: ' . get_class($exception));
|
|
|
|
return false;
|
|
}
|
|
|
|
return $payable->get_currency() === $order->currency && $current->equals($order->amount);
|
|
}
|
|
}
|