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;
use MonetaPhpShop\PhoneNumber;
/**
* Ïîêóïàòåëü â ÷åêå — îáúåêò `client` (`kassaspecification.pdf`): íóæåí õîòÿ áû îäèí èç
* `email`/`phone`, ÔÈÎ — òîëüêî âìåñòå ñ íèìè. Ñòðîêè â UTF-8.
*/
final class ReceiptClient
{
public const NAME_MAX_LENGTH = 256;
public const EMAIL_MAX_LENGTH = 64;
/** `phone_number` JSON-ñõåìû Check URL (`cmsspecification.pdf`). */
public const JSON_PHONE_MAX_LENGTH = 13;
/** `kassaspecification.pdf` — äëÿ `CLIENT` â `MNT_ATTRIBUTES`. */
public const KASSA_PHONE_MAX_LENGTH = 19;
/** @var string */
private $name;
/** @var string */
private $email;
/** @var string */
private $phone;
private function __construct(string $name, string $email, string $phone)
{
$this->name = $name;
$this->email = $email;
$this->phone = $phone;
}
/**
* Ïîêóïàòåëü èç äàííûõ çàêàçà èëè null, åñëè ÷åêó íåêóäà óéòè. «Email äëÿ ÷åêîâ» ìåð÷àíòà
* ïîäñòàâëÿåòñÿ, òîëüêî êîãäà ó ïîêóïàòåëÿ íåò íè email, íè òåëåôîíà; ÔÈÎ îñòà¸òñÿ.
*/
public static function fromContacts(string $email, string $phone, string $name, string $fallbackEmail): ?self
{
$phone = PhoneNumber::normalize($phone) ?? '';
if (strlen($phone) > self::KASSA_PHONE_MAX_LENGTH) {
$phone = '';
}
$email = self::email($email);
if (($email === '') && ($phone === '')) {
$email = self::email($fallbackEmail);
}
if (($email === '') && ($phone === '')) {
return null;
}
return new self(ReceiptText::clean($name, self::NAME_MAX_LENGTH), $email, $phone);
}
public function getEmail(): string
{
return $this->email;
}
public function getPhone(): string
{
return $this->phone;
}
/**
* Îáúåêò `client`; ïóñòûå êëþ÷è íå ïåðåäàþòñÿ.
*
* @param int $phoneMaxLength {@see self::JSON_PHONE_MAX_LENGTH} èëè {@see self::KASSA_PHONE_MAX_LENGTH}
*
* @return array<string, string>
*/
public function toArray(int $phoneMaxLength): array
{
$phone = strlen($this->phone) <= $phoneMaxLength ? $this->phone : '';
if (($this->email === '') && ($phone === '')) {
// Òåëåôîí äëèííåå ñõåìû, à email íåò — áåç êîíòàêòà ÔÈÎ êàññà íå ïðèìåò.
return [];
}
return array_filter(
['name' => $this->name, 'email' => $this->email, 'phone' => $phone],
static function (string $value): bool {
return ($value !== '');
},
);
}
private static function email(string $email): string
{
$email = trim($email);
if (
strlen($email) > self::EMAIL_MAX_LENGTH
|| filter_var($email, FILTER_VALIDATE_EMAIL) === false
) {
return '';
}
return $email;
}
}