feat: moneta 2.0, MONETA.Assistant payment module for PHPShop 6.7+

This commit is contained in:
2026-10-27 11:45:22 +03:00
parent 78b7405637
commit f8c12ce44a
82 changed files with 7387 additions and 58 deletions
+107
View File
@@ -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);
}
}