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 */ 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; } }