77 lines
2.4 KiB
PHP
77 lines
2.4 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace MonetaPhpShop\order;
|
|
|
|
use MonetaPhpShop\ModuleInfo;
|
|
use MonetaPhpShop\protocol\AssistantProtocol;
|
|
use MonetaPhpShop\Settings;
|
|
|
|
/**
|
|
* Ìîæíî ëè ñåé÷àñ îïëàòèòü çàêàç ÷åðåç Ìîíåòó. Îäíî ïðàâèëî äëÿ êíîïêè îïëàòû
|
|
* è äëÿ Check URL, ÷òîáû ôîðìà íå âûäàâàëàñü òàì, ãäå ïðîâåðî÷íûé çàïðîñ îòêàæåò.
|
|
*
|
|
* Çíà÷åíèÿ êîíñòàíò — êîäû ïðè÷èí äëÿ æóðíàëà ìîäóëÿ; íå ïåðåèìåíîâûâàòü.
|
|
*/
|
|
final class PaymentEligibility
|
|
{
|
|
public const PAYABLE = 'payable';
|
|
public const NOT_CONFIGURED = 'not_configured';
|
|
public const OTHER_PAYMENT_METHOD = 'other_payment_method';
|
|
public const ALREADY_PAID = 'already_paid';
|
|
public const CANCELLED = 'cancelled';
|
|
public const AWAITING_STATUS = 'awaiting_status';
|
|
public const UNSUPPORTED_CURRENCY = 'unsupported_currency';
|
|
public const ZERO_AMOUNT = 'zero_amount';
|
|
|
|
/** Ñòàòóñ PHPShop «Àííóëèðîâàí» (`PHPShopOrderFunction::changeStatus()` âîçâðàùàåò òîâàð íà ñêëàä). */
|
|
public const STATUS_CANCELLED = 1;
|
|
|
|
private function __construct() {}
|
|
|
|
/**
|
|
* @param string $shopCurrency ISO-êîä âàëþòû çàêàçà èç PHPShop (`getDefaultValutaIso(true)`)
|
|
*/
|
|
public static function check(Settings $settings, Order $order, string $shopCurrency): string
|
|
{
|
|
if (!$settings->isConfigured()) {
|
|
return self::NOT_CONFIGURED;
|
|
}
|
|
|
|
if ($order->getPaymentMethodId() !== ModuleInfo::PAYMENT_METHOD_ID) {
|
|
return self::OTHER_PAYMENT_METHOD;
|
|
}
|
|
|
|
if (self::isPaid($settings, $order)) {
|
|
return self::ALREADY_PAID;
|
|
}
|
|
|
|
if ($order->getStatusId() === self::STATUS_CANCELLED) {
|
|
return self::CANCELLED;
|
|
}
|
|
|
|
if (!$settings->isPayableRightAfterCheckout() && $order->getStatusId() !== $settings->getPayableStatus()) {
|
|
return self::AWAITING_STATUS;
|
|
}
|
|
|
|
if (AssistantProtocol::normalizeCurrency($shopCurrency) === null) {
|
|
return self::UNSUPPORTED_CURRENCY;
|
|
}
|
|
|
|
if (!$order->getAmount()->isPositive()) {
|
|
return self::ZERO_AMOUNT;
|
|
}
|
|
|
|
return self::PAYABLE;
|
|
}
|
|
|
|
/**
|
|
* Îïëà÷åí: ôëàã `paid` ÿäðà èëè ñòàòóñ «ïîñëå îïëàòû» èç íàñòðîåê ìîäóëÿ.
|
|
*/
|
|
public static function isPaid(Settings $settings, Order $order): bool
|
|
{
|
|
return $order->isPaidFlag() || ($order->getStatusId() === $settings->getPaidStatus());
|
|
}
|
|
}
|