feat: moneta 2.0, MONETA.Assistant payment module for PHPShop 6.7+
This commit is contained in:
@@ -0,0 +1,107 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace MonetaPhpShop\receipt;
|
||||
|
||||
/**
|
||||
* Ñòàâêà ÍÄÑ ïîçèöèè ÷åêà: êîä `vat` äëÿ JSON Check URL (`cmsspecification.pdf`)
|
||||
* è òåã `vatTag` äëÿ `INVENTORY` (`kassaspecification.pdf`).
|
||||
*
|
||||
* Èç íàñòðîåê PHPShop ìîäóëü áåð¸ò òîëüêî ïðÿìûå ñòàâêè ïî ïðîöåíòó. Ðàñ÷¸òíûå (`vat120`, `1106`…)
|
||||
* ïðèâÿçàíû ê àâàíñàì è ïðåäîïëàòå (`pm` `advance`/`prepayment`) — èõ ìîäóëü ñàì íå âûáèðàåò,
|
||||
* òîëüêî ìåð÷àíò íàñòðîéêîé ({@see VatSetting}).
|
||||
* Value-îáúåêò âìåñòî enum — PHP 7.4.
|
||||
*/
|
||||
final class Vat
|
||||
{
|
||||
public const NONE = 'none';
|
||||
|
||||
/** Ïðîöåíò ñòàâêè -> êîä `vat`. */
|
||||
private const BY_PERCENT = [
|
||||
0 => 'vat0',
|
||||
5 => 'vat5',
|
||||
7 => 'vat7',
|
||||
10 => 'vat10',
|
||||
20 => 'vat20',
|
||||
22 => 'vat22',
|
||||
];
|
||||
|
||||
/**
|
||||
* Êîä `vat` (`cmsspecification.pdf`) -> `vatTag` (`kassaspecification.pdf`).
|
||||
*/
|
||||
private const TAGS = [
|
||||
self::NONE => '1105',
|
||||
'vat0' => '1104',
|
||||
'vat5' => '1108',
|
||||
'vat7' => '1109',
|
||||
'vat10' => '1103',
|
||||
'vat20' => '1102',
|
||||
'vat22' => '1113',
|
||||
'vat105' => '1110',
|
||||
'vat107' => '1111',
|
||||
'vat110' => '1107',
|
||||
'vat120' => '1106',
|
||||
'vat122' => '1114',
|
||||
];
|
||||
|
||||
/** @var string */
|
||||
private $code;
|
||||
|
||||
private function __construct(string $code)
|
||||
{
|
||||
$this->code = $code;
|
||||
}
|
||||
|
||||
public static function none(): self
|
||||
{
|
||||
return new self(self::NONE);
|
||||
}
|
||||
|
||||
/**
|
||||
* Ñòàâêà ïî êîäó `vat`; íåèçâåñòíûé êîä — null.
|
||||
*/
|
||||
public static function fromCode(string $code): ?self
|
||||
{
|
||||
return isset(self::TAGS[$code]) ? new self($code) : null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Ñòàâêà èç íàñòðîåê PHPShop — ñâîáîäíîå ÷èñëî ïðîöåíòîâ (`nds`, `ofd_nds` äîñòàâêè).
|
||||
* Ïóñòî èëè ñòàâêè íåò â ïåðå÷íå êàññû — «áåç ÍÄÑ»: íåèçâåñòíóþ ñòàâêó íå óãàäûâàåì.
|
||||
*/
|
||||
public static function fromPercent(string $percent): self
|
||||
{
|
||||
return self::tryFromPercent($percent) ?? self::none();
|
||||
}
|
||||
|
||||
/**
|
||||
* Êàê {@see self::fromPercent()}, íî ïóñòîå èëè íåèçâåñòíîå çíà÷åíèå — null: âûçûâàþùèé
|
||||
* ïðåäóïðåæäàåò ìåð÷àíòà, ÷òî ïîçèöèÿ óéä¸ò â ÷åê «áåç ÍÄÑ».
|
||||
*/
|
||||
public static function tryFromPercent(string $percent): ?self
|
||||
{
|
||||
$percent = trim($percent);
|
||||
if (preg_match('/\A[0-9]{1,3}(?:[.,]0+)?\z/', $percent) !== 1) {
|
||||
return null;
|
||||
}
|
||||
$value = (int) $percent;
|
||||
|
||||
return isset(self::BY_PERCENT[$value]) ? new self(self::BY_PERCENT[$value]) : null;
|
||||
}
|
||||
|
||||
public function getCode(): string
|
||||
{
|
||||
return $this->code;
|
||||
}
|
||||
|
||||
public function getTag(): string
|
||||
{
|
||||
return self::TAGS[$this->code];
|
||||
}
|
||||
|
||||
public function equals(self $other): bool
|
||||
{
|
||||
return ($this->code === $other->code);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user