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;
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user