108 lines
3.0 KiB
PHP
108 lines
3.0 KiB
PHP
<?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;
|
|
}
|
|
}
|