Рефакторинг исключений, новые константы ограничений

Описывать все слишком долго, TLDR:
- упрощены корневые AtolException, {BasicTooLongException => TooLongException}, {BasicTooManyException => TooManyException}
- InvalidSnoException заменён на InvalidEnumValueException
- добавлены новые константы, общий порядок изменён в соответствии с порядком упоминания в документации, ссылки на которую тоже добавлены с указанием страниц

Помимо этого, в enum-ах теперь должен быть предусмотрен метод getFfdTags()
This commit is contained in:
Anthony Axenov 2021-11-22 14:51:10 +08:00
parent e1303f4fdb
commit 3bf8667437
48 changed files with 482 additions and 603 deletions

View File

@ -161,7 +161,7 @@ abstract class AtolClient
if (empty($login)) { if (empty($login)) {
throw new EmptyLoginException(); throw new EmptyLoginException();
} elseif (mb_strlen($login) > Constraints::MAX_LENGTH_LOGIN) { } elseif (mb_strlen($login) > Constraints::MAX_LENGTH_LOGIN) {
throw new TooLongLoginException($login, Constraints::MAX_LENGTH_LOGIN); throw new TooLongLoginException($login);
} }
$this->login = $login; $this->login = $login;
return $this; return $this;
@ -190,7 +190,7 @@ abstract class AtolClient
if (empty($password)) { if (empty($password)) {
throw new EmptyPasswordException(); throw new EmptyPasswordException();
} elseif (mb_strlen($password) > Constraints::MAX_LENGTH_PASSWORD) { } elseif (mb_strlen($password) > Constraints::MAX_LENGTH_PASSWORD) {
throw new TooLongPasswordException($password, Constraints::MAX_LENGTH_PASSWORD); throw new TooLongPasswordException($password);
} }
$this->password = $password; $this->password = $password;
return $this; return $this;

View File

@ -36,40 +36,89 @@ final class Constraints
*/ */
const MAX_LENGTH_PASSWORD = 100; const MAX_LENGTH_PASSWORD = 100;
/**
* Максимальная длина имени покупателя
*/
const MAX_LENGTH_CLIENT_NAME = 256;
/**
* Максимальная длина телефона покупателя
*/
const MAX_LENGTH_CLIENT_PHONE = 64;
/** /**
* Максимальная длина адреса места расчётов * Максимальная длина адреса места расчётов
*/ */
const MAX_LENGTH_PAYMENT_ADDRESS = 256; const MAX_LENGTH_PAYMENT_ADDRESS = 256;
/** /**
* Максимальная длина имени кассира * Максимальная длина наименования покупателя (1227)
* @see https://online.atol.ru/files/API_atol_online_v4.pdf Документация, стр 17
*/ */
const MAX_LENGTH_CASHIER_NAME = 64; const MAX_LENGTH_CLIENT_NAME = 256;
/** /**
* Максимальная длина наименования предмета расчётов * Максимальная длина наименования предмета расчёта (1030)
* @see https://online.atol.ru/files/API_atol_online_v4.pdf Документация, стр 21
*/ */
const MAX_LENGTH_ITEM_NAME = 128; const MAX_LENGTH_ITEM_NAME = 128;
/**
* Максимальная цена за единицу предмета расчёта (1079)
* @see https://online.atol.ru/files/API_atol_online_v4.pdf Документация, стр 21
*/
const MAX_COUNT_ITEM_PRICE = 42949672.95;
/**
* Максимальное количество (вес) единицы предмета расчёта (1023)
* @see https://online.atol.ru/files/API_atol_online_v4.pdf Документация, стр 21
*/
const MAX_COUNT_ITEM_QUANTITY = 99999.999;
/**
* Максимальная стоимость всех предметов расчёта в документе прихода, расхода,
* возврата прихода, возврата расхода (1043)
* @see https://online.atol.ru/files/API_atol_online_v4.pdf Документация, стр 21
*/
const MAX_COUNT_ITEM_SUM = 42949672.95;
/**
* Максимальная длина телефона или email покупателя (1008)
* @see https://online.atol.ru/files/API_atol_online_v4.pdf Документация, стр 17
*/
const MAX_LENGTH_CLIENT_CONTACT = 64;
/**
* Длина операции для платёжного агента (1044)
* @see https://online.atol.ru/files/API_atol_online_v4.pdf Документация, стр 19
*/
const MAX_LENGTH_PAYING_AGENT_OPERATION = 24;
/**
* Максимальное количество предметов расчёта в документе прихода, расхода, возврата прихода, возврата расхода
* @see https://online.atol.ru/files/API_atol_online_v4.pdf Документация, стр 21
*/
const MAX_COUNT_DOC_ITEMS = 100;
/** /**
* Максимальная длина единицы измерения предмета расчётов * Максимальная длина единицы измерения предмета расчётов
* @see https://online.atol.ru/files/API_atol_online_v4.pdf Документация, стр 21
*/ */
const MAX_LENGTH_MEASUREMENT_UNIT = 16; const MAX_LENGTH_MEASUREMENT_UNIT = 16;
/** /**
* Максимальная длина пользовательских данных для предмета расчётов * Максимальная длина пользовательских данных для предмета расчётов (1191)
* @see https://online.atol.ru/files/API_atol_online_v4.pdf Документация, стр 29
*/ */
const MAX_LENGTH_USER_DATA = 64; const MAX_LENGTH_USER_DATA = 64;
/**
* Максимальное количество платежей в любом документе
* @see https://online.atol.ru/files/API_atol_online_v4.pdf Документация, стр 30 и 35
*/
const MAX_COUNT_DOC_PAYMENTS = 10;
/**
* Максимальное количество ставок НДС в любом документе
* @see https://online.atol.ru/files/API_atol_online_v4.pdf Документация, стр 31 и 36
*/
const MAX_COUNT_DOC_VATS = 6;
/**
* Максимальная длина имени кассира (1021)
* @see https://online.atol.ru/files/API_atol_online_v4.pdf Документация, стр 32
*/
const MAX_LENGTH_CASHIER_NAME = 64;
/** /**
* Регулярное выражание для валидации строки ИНН * Регулярное выражание для валидации строки ИНН

View File

@ -15,9 +15,10 @@ use AtolOnline\{
Constants\Constraints, Constants\Constraints,
Exceptions\InvalidEmailException, Exceptions\InvalidEmailException,
Exceptions\InvalidInnLengthException, Exceptions\InvalidInnLengthException,
Exceptions\TooLongClientContactException,
Exceptions\TooLongClientNameException,
Exceptions\TooLongEmailException, Exceptions\TooLongEmailException,
Exceptions\TooLongNameException, Exceptions\TooLongItemNameException};
Exceptions\TooLongPhoneException};
/** /**
* Класс Client, описывающий сущность покупателя * Класс Client, описывающий сущность покупателя
@ -53,8 +54,8 @@ class Client extends Entity
* @param string|null $phone Email. Тег ФФД - 1008. * @param string|null $phone Email. Тег ФФД - 1008.
* @param string|null $email Телефон покупателя. Тег ФФД - 1008. * @param string|null $email Телефон покупателя. Тег ФФД - 1008.
* @param string|null $inn ИНН. Тег ФФД - 1228. * @param string|null $inn ИНН. Тег ФФД - 1228.
* @throws TooLongNameException * @throws TooLongItemNameException
* @throws TooLongPhoneException * @throws TooLongClientContactException
* @throws TooLongEmailException * @throws TooLongEmailException
* @throws InvalidEmailException * @throws InvalidEmailException
* @throws InvalidInnLengthException * @throws InvalidInnLengthException
@ -91,14 +92,14 @@ class Client extends Entity
* *
* @param string|null $name * @param string|null $name
* @return $this * @return $this
* @throws TooLongNameException * @throws TooLongClientNameException
*/ */
public function setName(?string $name): self public function setName(?string $name): self
{ {
if (is_string($name)) { if (is_string($name)) {
$name = preg_replace('/[\n\r\t]/', '', trim($name)); $name = preg_replace('/[\n\r\t]/', '', trim($name));
if (mb_strlen($name) > Constraints::MAX_LENGTH_CLIENT_NAME) { if (mb_strlen($name) > Constraints::MAX_LENGTH_CLIENT_NAME) {
throw new TooLongNameException($name, Constraints::MAX_LENGTH_CLIENT_NAME); throw new TooLongClientNameException($name);
} }
} }
$this->name = empty($name) ? null : $name; $this->name = empty($name) ? null : $name;
@ -128,7 +129,7 @@ class Client extends Entity
if (is_string($email)) { if (is_string($email)) {
$email = preg_replace('/[\n\r\t]/', '', trim($email)); $email = preg_replace('/[\n\r\t]/', '', trim($email));
if (mb_strlen($email) > Constraints::MAX_LENGTH_EMAIL) { if (mb_strlen($email) > Constraints::MAX_LENGTH_EMAIL) {
throw new TooLongEmailException($email, Constraints::MAX_LENGTH_EMAIL); throw new TooLongEmailException($email);
} elseif (filter_var($email, FILTER_VALIDATE_EMAIL) === false) { } elseif (filter_var($email, FILTER_VALIDATE_EMAIL) === false) {
throw new InvalidEmailException($email); throw new InvalidEmailException($email);
} }
@ -156,14 +157,14 @@ class Client extends Entity
* *
* @param string|null $phone Номер телефона * @param string|null $phone Номер телефона
* @return $this * @return $this
* @throws TooLongPhoneException * @throws TooLongClientContactException
*/ */
public function setPhone(?string $phone): self public function setPhone(?string $phone): self
{ {
if (is_string($phone)) { if (is_string($phone)) {
$phone = preg_replace('/[^\d]/', '', trim($phone)); $phone = preg_replace('/[^\d]/', '', trim($phone));
if (mb_strlen($phone) > Constraints::MAX_LENGTH_CLIENT_PHONE) { if (mb_strlen($phone) > Constraints::MAX_LENGTH_CLIENT_CONTACT) {
throw new TooLongPhoneException($phone, Constraints::MAX_LENGTH_CLIENT_PHONE); throw new TooLongClientContactException($phone);
} }
} }
$this->phone = empty($phone) ? null : "+$phone"; $this->phone = empty($phone) ? null : "+$phone";

View File

@ -15,9 +15,9 @@ use AtolOnline\{
Constants\Constraints, Constants\Constraints,
Enums\SnoTypes, Enums\SnoTypes,
Exceptions\InvalidEmailException, Exceptions\InvalidEmailException,
Exceptions\InvalidEnumValueException,
Exceptions\InvalidInnLengthException, Exceptions\InvalidInnLengthException,
Exceptions\InvalidPaymentAddressException, Exceptions\InvalidPaymentAddressException,
Exceptions\InvalidSnoException,
Exceptions\TooLongEmailException, Exceptions\TooLongEmailException,
Exceptions\TooLongPaymentAddressException}; Exceptions\TooLongPaymentAddressException};
@ -58,7 +58,7 @@ class Company extends Entity
* @throws InvalidEmailException * @throws InvalidEmailException
* @throws InvalidInnLengthException * @throws InvalidInnLengthException
* @throws InvalidPaymentAddressException * @throws InvalidPaymentAddressException
* @throws InvalidSnoException * @throws InvalidEnumValueException
* @throws TooLongEmailException * @throws TooLongEmailException
* @throws TooLongPaymentAddressException * @throws TooLongPaymentAddressException
*/ */
@ -96,7 +96,7 @@ class Company extends Entity
{ {
$email = preg_replace('/[\n\r\t]/', '', trim($email)); $email = preg_replace('/[\n\r\t]/', '', trim($email));
if (mb_strlen($email) > Constraints::MAX_LENGTH_EMAIL) { if (mb_strlen($email) > Constraints::MAX_LENGTH_EMAIL) {
throw new TooLongEmailException($email, Constraints::MAX_LENGTH_EMAIL); throw new TooLongEmailException($email);
} elseif (empty($email) || filter_var($email, FILTER_VALIDATE_EMAIL) === false) { } elseif (empty($email) || filter_var($email, FILTER_VALIDATE_EMAIL) === false) {
throw new InvalidEmailException($email); throw new InvalidEmailException($email);
} }
@ -123,14 +123,12 @@ class Company extends Entity
* *
* @param string $sno * @param string $sno
* @return $this * @return $this
* @throws InvalidSnoException * @throws InvalidEnumValueException
*/ */
public function setSno(string $sno): self public function setSno(string $sno): self
{ {
$sno = trim($sno); $sno = trim($sno);
if (empty($sno) || !in_array($sno, SnoTypes::toArray())) { SnoTypes::isValid($sno);
throw new InvalidSnoException($sno);
}
$this->sno = $sno; $this->sno = $sno;
return $this; return $this;
} }
@ -194,7 +192,7 @@ class Company extends Entity
if (empty($payment_address)) { if (empty($payment_address)) {
throw new InvalidPaymentAddressException(); throw new InvalidPaymentAddressException();
} elseif (mb_strlen($payment_address) > Constraints::MAX_LENGTH_PAYMENT_ADDRESS) { } elseif (mb_strlen($payment_address) > Constraints::MAX_LENGTH_PAYMENT_ADDRESS) {
throw new TooLongPaymentAddressException($payment_address, Constraints::MAX_LENGTH_PAYMENT_ADDRESS); throw new TooLongPaymentAddressException($payment_address);
} }
$this->payment_address = $payment_address; $this->payment_address = $payment_address;
return $this; return $this;
@ -203,7 +201,7 @@ class Company extends Entity
/** /**
* @inheritDoc * @inheritDoc
* @throws InvalidEmailException * @throws InvalidEmailException
* @throws InvalidSnoException * @throws InvalidEnumValueException
* @throws InvalidInnLengthException * @throws InvalidInnLengthException
* @throws InvalidPaymentAddressException * @throws InvalidPaymentAddressException
*/ */
@ -215,7 +213,7 @@ class Company extends Entity
: throw new InvalidEmailException(), : throw new InvalidEmailException(),
'sno' => $this->sno 'sno' => $this->sno
? $this->getSno() ? $this->getSno()
: throw new InvalidSnoException(), : throw new InvalidEnumValueException(SnoTypes::class, 'null'),
'inn' => $this->inn 'inn' => $this->inn
? $this->getInn() ? $this->getInn()
: throw new InvalidInnLengthException(), : throw new InvalidInnLengthException(),

View File

@ -13,18 +13,18 @@ namespace AtolOnline\Entities;
use AtolOnline\Constants\Constraints; use AtolOnline\Constants\Constraints;
use AtolOnline\Exceptions\AtolException; use AtolOnline\Exceptions\AtolException;
use AtolOnline\Exceptions\BasicTooManyException;
use AtolOnline\Exceptions\InvalidEmailException; use AtolOnline\Exceptions\InvalidEmailException;
use AtolOnline\Exceptions\InvalidInnLengthException; use AtolOnline\Exceptions\InvalidInnLengthException;
use AtolOnline\Exceptions\InvalidJsonException; use AtolOnline\Exceptions\InvalidJsonException;
use AtolOnline\Exceptions\TooHighPriceException; use AtolOnline\Exceptions\TooHighPriceException;
use AtolOnline\Exceptions\TooLongCashierException; use AtolOnline\Exceptions\TooLongCashierException;
use AtolOnline\Exceptions\TooLongClientContactException;
use AtolOnline\Exceptions\TooLongEmailException; use AtolOnline\Exceptions\TooLongEmailException;
use AtolOnline\Exceptions\TooLongNameException; use AtolOnline\Exceptions\TooLongItemNameException;
use AtolOnline\Exceptions\TooLongPaymentAddressException; use AtolOnline\Exceptions\TooLongPaymentAddressException;
use AtolOnline\Exceptions\TooLongPhoneException;
use AtolOnline\Exceptions\TooLongUnitException; use AtolOnline\Exceptions\TooLongUnitException;
use AtolOnline\Exceptions\TooLongUserdataException; use AtolOnline\Exceptions\TooLongUserdataException;
use AtolOnline\Exceptions\TooManyException;
use AtolOnline\Exceptions\TooManyItemsException; use AtolOnline\Exceptions\TooManyItemsException;
use AtolOnline\Exceptions\TooManyPaymentsException; use AtolOnline\Exceptions\TooManyPaymentsException;
use AtolOnline\Exceptions\TooManyVatsException; use AtolOnline\Exceptions\TooManyVatsException;
@ -66,7 +66,7 @@ class Document extends Entity
* @var float Итоговая сумма чека. Тег ФФД - 1020. * @var float Итоговая сумма чека. Тег ФФД - 1020.
*/ */
protected float $total = 0; protected float $total = 0;
/** /**
* @var string ФИО кассира. Тег ФФД - 1021. * @var string ФИО кассира. Тег ФФД - 1021.
*/ */
@ -76,7 +76,7 @@ class Document extends Entity
* @var CorrectionInfo Данные коррекции * @var CorrectionInfo Данные коррекции
*/ */
protected CorrectionInfo $correction_info; protected CorrectionInfo $correction_info;
/** /**
* Document constructor. * Document constructor.
*/ */
@ -211,7 +211,7 @@ class Document extends Entity
$this->items->set($items); $this->items->set($items);
return $this; return $this;
} }
/** /**
* Возвращает заданного клиента (покупателя) * Возвращает заданного клиента (покупателя)
* *
@ -221,7 +221,7 @@ class Document extends Entity
{ {
return $this->client; return $this->client;
} }
/** /**
* Устанавливает клиента (покупателя) * Устанавливает клиента (покупателя)
* *
@ -233,7 +233,7 @@ class Document extends Entity
$this->client = $client; $this->client = $client;
return $this; return $this;
} }
/** /**
* Возвращает заданную компанию (продавца) * Возвращает заданную компанию (продавца)
* *
@ -243,7 +243,7 @@ class Document extends Entity
{ {
return $this->company; return $this->company;
} }
/** /**
* Устанавливает компанию (продавца) * Устанавливает компанию (продавца)
* *
@ -255,7 +255,7 @@ class Document extends Entity
$this->company = $company; $this->company = $company;
return $this; return $this;
} }
/** /**
* Возвращает ФИО кассира. Тег ФФД - 1021. * Возвращает ФИО кассира. Тег ФФД - 1021.
* *
@ -323,7 +323,7 @@ class Document extends Entity
} }
return $this->total = round($sum, 2); return $this->total = round($sum, 2);
} }
/** /**
* Возвращает итоговую сумму чека. Тег ФФД - 1020. * Возвращает итоговую сумму чека. Тег ФФД - 1020.
* *
@ -344,11 +344,11 @@ class Document extends Entity
* @throws AtolException * @throws AtolException
* @throws InvalidInnLengthException * @throws InvalidInnLengthException
* @throws InvalidJsonException * @throws InvalidJsonException
* @throws TooLongNameException * @throws TooLongItemNameException
* @throws TooLongPaymentAddressException * @throws TooLongPaymentAddressException
* @throws TooLongPhoneException * @throws TooLongClientContactException
* @throws TooHighPriceException * @throws TooHighPriceException
* @throws BasicTooManyException * @throws TooManyException
* @throws TooManyItemsException * @throws TooManyItemsException
* @throws TooManyPaymentsException * @throws TooManyPaymentsException
* @throws TooLongUnitException * @throws TooLongUnitException

View File

@ -13,11 +13,11 @@ namespace AtolOnline\Entities;
use AtolOnline\{ use AtolOnline\{
Constants\Constraints, Constants\Constraints,
Exceptions\BasicTooManyException,
Exceptions\TooHighPriceException, Exceptions\TooHighPriceException,
Exceptions\TooLongNameException, Exceptions\TooLongItemNameException,
Exceptions\TooLongUnitException, Exceptions\TooLongUnitException,
Exceptions\TooLongUserdataException}; Exceptions\TooLongUserdataException,
Exceptions\TooManyException};
/** /**
* Предмет расчёта (товар, услуга) * Предмет расчёта (товар, услуга)
@ -30,22 +30,22 @@ class Item extends Entity
* @var string Наименование. Тег ФФД - 1030. * @var string Наименование. Тег ФФД - 1030.
*/ */
protected string $name; protected string $name;
/** /**
* @var int Цена в копейках (с учётом скидок и наценок). Тег ФФД - 1079. * @var int Цена в копейках (с учётом скидок и наценок). Тег ФФД - 1079.
*/ */
protected int $price = 0; protected int $price = 0;
/** /**
* @var float Количество, вес. Тег ФФД - 1023. * @var float Количество, вес. Тег ФФД - 1023.
*/ */
protected float $quantity = 0.0; protected float $quantity = 0.0;
/** /**
* @var float Сумма в копейках. Тег ФФД - 1043. * @var float Сумма в копейках. Тег ФФД - 1043.
*/ */
protected float $sum = 0; protected float $sum = 0;
/** /**
* @var string Единица измерения количества. Тег ФФД - 1197. * @var string Единица измерения количества. Тег ФФД - 1197.
*/ */
@ -55,17 +55,17 @@ class Item extends Entity
* @var Vat|null Ставка НДС * @var Vat|null Ставка НДС
*/ */
protected ?Vat $vat; protected ?Vat $vat;
/** /**
* @var string Признак способа расчёта. Тег ФФД - 1214. * @var string Признак способа расчёта. Тег ФФД - 1214.
*/ */
protected string $payment_method; protected string $payment_method;
/** /**
* @var string Признак объекта расчёта. Тег ФФД - 1212. * @var string Признак объекта расчёта. Тег ФФД - 1212.
*/ */
protected string $payment_object; protected string $payment_object;
/** /**
* @var string Дополнительный реквизит. Тег ФФД - 1191. * @var string Дополнительный реквизит. Тег ФФД - 1191.
*/ */
@ -81,9 +81,9 @@ class Item extends Entity
* @param string|null $vat_type Ставка НДС * @param string|null $vat_type Ставка НДС
* @param string|null $payment_object Признак * @param string|null $payment_object Признак
* @param string|null $payment_method Способ расчёта * @param string|null $payment_method Способ расчёта
* @throws TooLongNameException Слишком длинное наименование * @throws TooLongItemNameException Слишком длинное наименование
* @throws TooHighPriceException Слишком высокая цена за одну единицу * @throws TooHighPriceException Слишком высокая цена за одну единицу
* @throws BasicTooManyException Слишком большое количество * @throws TooManyException Слишком большое количество
* @throws TooLongUnitException Слишком длинное название единицы измерения * @throws TooLongUnitException Слишком длинное название единицы измерения
*/ */
public function __construct( public function __construct(
@ -117,7 +117,7 @@ class Item extends Entity
$this->setPaymentMethod($payment_method); $this->setPaymentMethod($payment_method);
} }
} }
/** /**
* Возвращает наименование. Тег ФФД - 1030. * Возвращает наименование. Тег ФФД - 1030.
* *
@ -133,18 +133,18 @@ class Item extends Entity
* *
* @param string $name Наименование * @param string $name Наименование
* @return $this * @return $this
* @throws TooLongNameException Слишком длинное имя/наименование * @throws TooLongItemNameException Слишком длинное имя/наименование
*/ */
public function setName(string $name): self public function setName(string $name): self
{ {
$name = trim($name); $name = trim($name);
if (mb_strlen($name) > Constraints::MAX_LENGTH_ITEM_NAME) { if (mb_strlen($name) > Constraints::MAX_LENGTH_ITEM_NAME) {
throw new TooLongNameException($name, Constraints::MAX_LENGTH_ITEM_NAME); throw new TooLongItemNameException($name, Constraints::MAX_LENGTH_ITEM_NAME);
} }
$this->name = $name; $this->name = $name;
return $this; return $this;
} }
/** /**
* Возвращает цену в рублях. Тег ФФД - 1079. * Возвращает цену в рублях. Тег ФФД - 1079.
* *
@ -171,7 +171,7 @@ class Item extends Entity
$this->calcSum(); $this->calcSum();
return $this; return $this;
} }
/** /**
* Возвращает количество. Тег ФФД - 1023. * Возвращает количество. Тег ФФД - 1023.
* *
@ -188,7 +188,7 @@ class Item extends Entity
* @param float $quantity Количество * @param float $quantity Количество
* @param string|null $measurement_unit Единица измерения количества * @param string|null $measurement_unit Единица измерения количества
* @return $this * @return $this
* @throws BasicTooManyException Слишком большое количество * @throws TooManyException Слишком большое количество
* @throws TooHighPriceException Слишком высокая общая стоимость * @throws TooHighPriceException Слишком высокая общая стоимость
* @throws TooLongUnitException Слишком длинное название единицы измерения * @throws TooLongUnitException Слишком длинное название единицы измерения
*/ */
@ -196,7 +196,7 @@ class Item extends Entity
{ {
$quantity = round($quantity, 3); $quantity = round($quantity, 3);
if ($quantity > 99999.999) { if ($quantity > 99999.999) {
throw new BasicTooManyException($quantity, 99999.999); throw new TooManyException($quantity, 99999.999);
} }
$this->quantity = $quantity; $this->quantity = $quantity;
$this->calcSum(); $this->calcSum();
@ -205,7 +205,7 @@ class Item extends Entity
} }
return $this; return $this;
} }
/** /**
* Возвращает заданную единицу измерения количества. Тег ФФД - 1197. * Возвращает заданную единицу измерения количества. Тег ФФД - 1197.
* *
@ -232,7 +232,7 @@ class Item extends Entity
$this->measurement_unit = $measurement_unit; $this->measurement_unit = $measurement_unit;
return $this; return $this;
} }
/** /**
* Возвращает признак способа оплаты. Тег ФФД - 1214. * Возвращает признак способа оплаты. Тег ФФД - 1214.
* *
@ -242,7 +242,7 @@ class Item extends Entity
{ {
return $this->payment_method; return $this->payment_method;
} }
/** /**
* Устанавливает признак способа оплаты. Тег ФФД - 1214. * Устанавливает признак способа оплаты. Тег ФФД - 1214.
* *
@ -255,7 +255,7 @@ class Item extends Entity
$this->payment_method = trim($payment_method); $this->payment_method = trim($payment_method);
return $this; return $this;
} }
/** /**
* Возвращает признак предмета расчёта. Тег ФФД - 1212. * Возвращает признак предмета расчёта. Тег ФФД - 1212.
* *
@ -265,7 +265,7 @@ class Item extends Entity
{ {
return $this->payment_object; return $this->payment_object;
} }
/** /**
* Устанавливает признак предмета расчёта. Тег ФФД - 1212. * Устанавливает признак предмета расчёта. Тег ФФД - 1212.
* *
@ -308,7 +308,7 @@ class Item extends Entity
$this->calcSum(); $this->calcSum();
return $this; return $this;
} }
/** /**
* Возвращает дополнительный реквизит. Тег ФФД - 1191. * Возвращает дополнительный реквизит. Тег ФФД - 1191.
* *
@ -335,7 +335,7 @@ class Item extends Entity
$this->user_data = $user_data; $this->user_data = $user_data;
return $this; return $this;
} }
/** /**
* Возвращает стоимость. Тег ФФД - 1043. * Возвращает стоимость. Тег ФФД - 1043.
* *
@ -364,7 +364,7 @@ class Item extends Entity
} }
return $this->getSum(); return $this->getSum();
} }
/** /**
* @inheritDoc * @inheritDoc
*/ */

View File

@ -11,7 +11,7 @@ declare(strict_types = 1);
namespace AtolOnline\Enums; namespace AtolOnline\Enums;
use MyCLabs\Enum\Enum; use AtolOnline\Enum;
/** /**
* Константы, определяющие типы налогообложения * Константы, определяющие типы налогообложения
@ -49,4 +49,12 @@ final class SnoTypes extends Enum
* Патентная СН * Патентная СН
*/ */
const PATENT = 'patent'; const PATENT = 'patent';
/**
* @return int[] Возвращает массив тегов ФФД
*/
public static function getFfdTags(): array
{
return [1055];
}
} }

View File

@ -12,7 +12,6 @@ declare(strict_types = 1);
namespace AtolOnline\Exceptions; namespace AtolOnline\Exceptions;
use Exception; use Exception;
use Throwable;
/** /**
* Исключение, возникающее при работе с АТОЛ Онлайн * Исключение, возникающее при работе с АТОЛ Онлайн
@ -25,28 +24,15 @@ class AtolException extends Exception
protected array $ffd_tags = []; protected array $ffd_tags = [];
/** /**
* AtolException constructor. * Конструктор
* *
* @param string $message * @param string $message Сообщение
* @param int $code * @param int[] $ffd_tags Переопредление тегов ФФД
* @param Throwable|null $previous
*/ */
public function __construct($message = "", $code = 0, Throwable $previous = null) public function __construct(string $message = '', array $ffd_tags = [])
{ {
$message = $message ?: $this->message; parent::__construct(
if ($this->getFfdTags()) { ($message ?: $this->message) . ' [Теги ФФД: ' . implode(', ', $ffd_tags ?: $this->ffd_tags) . ']'
$message .= ' [FFD tags: '.implode(', ', $this->getFfdTags()).']'; );
}
parent::__construct($message, $code, $previous);
} }
}
/**
* Возвращает теги ФФД, с которыми связано исключение
*
* @return array
*/
protected function getFfdTags(): array
{
return $this->ffd_tags;
}
}

View File

@ -13,7 +13,6 @@ namespace AtolOnline\Exceptions;
use AtolOnline\Api\KktResponse; use AtolOnline\Api\KktResponse;
use Exception; use Exception;
use Throwable;
/** /**
* Исключение, возникающее при неудачной авторизации * Исключение, возникающее при неудачной авторизации
@ -25,17 +24,9 @@ class AuthFailedException extends Exception
* *
* @param KktResponse $response * @param KktResponse $response
* @param string $message * @param string $message
* @param int $code
* @param Throwable|null $previous
*/ */
public function __construct(KktResponse $response, $message = "", $code = 0, Throwable $previous = null) public function __construct(KktResponse $response, string $message = '')
{ {
$message = $response->isValid() parent::__construct(($message ?: 'Ошибка авторизации: ') . ': ' . $response);
? $message
: '[' . $response->error->code . '] ' . $response->error->text .
'. ERROR_ID: ' . $response->error->error_id .
'. TYPE: ' . $response->error->type;
$code = $response->isValid() ? $code : $response->error->code;
parent::__construct($message, $code, $previous);
} }
} }

View File

@ -1,40 +0,0 @@
<?php
/*
* Copyright (c) 2020-2021 Антон Аксенов (Anthony Axenov)
*
* This code is licensed under MIT.
* Этот код распространяется по лицензии MIT.
* https://github.com/anthonyaxenov/atol-online/blob/master/LICENSE
*/
declare(strict_types = 1);
namespace AtolOnline\Exceptions;
use Throwable;
/**
* Исключение, возникающее при попытке указать слишком длинное что-либо
*/
class BasicTooLongException extends AtolException
{
/**
* @var string Сообщение об ошибке
*/
protected $message = 'Parameter is too long';
/**
* AtolTooLongException constructor.
*
* @param $string
* @param $max
* @param string $message
* @param int $code
* @param Throwable|null $previous
*/
public function __construct($string, $max, $message = "", int $code = 0, Throwable $previous = null)
{
parent::__construct($message ?: $this->message . ' (max length - ' . $max . ', actual length - ' .
mb_strlen($string), $code, $previous);
}
}

View File

@ -11,13 +11,12 @@ declare(strict_types = 1);
namespace AtolOnline\Exceptions; namespace AtolOnline\Exceptions;
use AtolOnline\Entities\CorrectionInfo;
/** /**
* Исключение, возникающее при попытке зарегистрировать документ без данных коррекции * Исключение, возникающее при попытке зарегистрировать документ коррекции без соотв. данных
*/ */
class EmptyCorrectionInfoException extends AtolException class EmptyCorrectionInfoException extends AtolException
{ {
/** protected $message = 'Документ должен содержать объект ' . CorrectionInfo::class;
* @var string Сообщение об ошибке }
*/
protected $message = 'Document must have correction info';
}

View File

@ -13,19 +13,10 @@ namespace AtolOnline\Exceptions;
/** /**
* Исключение, возникающее при попытке указать пустой email * Исключение, возникающее при попытке указать пустой email
* @see https://online.atol.ru/files/API_atol_online_v4.pdf Документация, стр 17
*/ */
class EmptyEmailException extends AtolException class EmptyEmailException extends AtolException
{ {
/** protected $message = 'Email не может быть пустым';
* @inheritDoc protected array $ffd_tags = [1008, 1117];
*/ }
protected array $ffd_tags = [
1008,
1117,
];
/**
* @var string Сообщение об ошибке
*/
protected $message = 'Email cannot be empty';
}

View File

@ -12,12 +12,10 @@ declare(strict_types = 1);
namespace AtolOnline\Exceptions; namespace AtolOnline\Exceptions;
/** /**
* Исключение, возникающее при попытке указать пустой логин ККТ * Исключение, возникающее при попытке указать пустой логин
* @see https://online.atol.ru/files/API_atol_online_v4.pdf Документация, стр 12
*/ */
class EmptyLoginException extends AtolException class EmptyLoginException extends AtolException
{ {
/** protected $message = 'Логин не может быть пустым';
* @var string Сообщение об ошибке }
*/
protected $message = 'KKT login cannot be empty';
}

View File

@ -16,8 +16,5 @@ namespace AtolOnline\Exceptions;
*/ */
class EmptyMonitorDataException extends AtolException class EmptyMonitorDataException extends AtolException
{ {
/** protected $message = 'Не возможно создать объект ККт без данных от мониторинга';
* @var string Сообщение об ошибке }
*/
protected $message = 'Cannot create KKT entity without data from monitor';
}

View File

@ -12,12 +12,10 @@ declare(strict_types = 1);
namespace AtolOnline\Exceptions; namespace AtolOnline\Exceptions;
/** /**
* Исключение, возникающее при попытке указать пустой пароль ККТ * Исключение, возникающее при попытке указать пустой пароль
* @see https://online.atol.ru/files/API_atol_online_v4.pdf Документация, стр 12
*/ */
class EmptyPasswordException extends AtolException class EmptyPasswordException extends AtolException
{ {
/** protected $message = 'Пароль не может быть пустым';
* @var string Сообщение об ошибке }
*/
protected $message = 'KKT password cannot be empty';
}

View File

@ -16,8 +16,5 @@ namespace AtolOnline\Exceptions;
*/ */
class InvalidCallbackUrlException extends AtolException class InvalidCallbackUrlException extends AtolException
{ {
/** protected $message = 'Невалидный callback_url';
* @var string Сообщение об ошибке }
*/
protected $message = 'Invalid callback URL';
}

View File

@ -1,38 +0,0 @@
<?php
/*
* Copyright (c) 2020-2021 Антон Аксенов (Anthony Axenov)
*
* This code is licensed under MIT.
* Этот код распространяется по лицензии MIT.
* https://github.com/anthonyaxenov/atol-online/blob/master/LICENSE
*/
declare(strict_types = 1);
namespace AtolOnline\Exceptions;
use AtolOnline\Enums\DocumentTypes;
use Throwable;
/**
* Исключение, возникающее при попытке указать некорректный тип документа
*/
class InvalidDocumentTypeException extends AtolException
{
/**
* Конструктор
*
* @param string $type
* @param string $message
* @param int $code
* @param Throwable|null $previous
*/
public function __construct($type = '', $message = "", $code = 0, Throwable $previous = null)
{
parent::__construct(
$message ?: "Wrong document type: '$type'. Valid ones: " . implode(', ', DocumentTypes::toArray()),
$code,
$previous
);
}
}

View File

@ -11,31 +11,21 @@ declare(strict_types = 1);
namespace AtolOnline\Exceptions; namespace AtolOnline\Exceptions;
use Throwable;
/** /**
* Исключение, возникающее при ошибке валидации email * Исключение, возникающее при ошибке валидации email
* @see https://online.atol.ru/files/API_atol_online_v4.pdf Документация, стр 17
*/ */
class InvalidEmailException extends AtolException class InvalidEmailException extends AtolException
{ {
/** protected array $ffd_tags = [1008, 1117];
* @inheritDoc
*/
protected array $ffd_tags = [
1008,
1117,
];
/** /**
* AtolEmailValidateException constructor. * Конструктор
* *
* @param string $email * @param string $email
* @param string $message
* @param int $code
* @param Throwable|null $previous
*/ */
public function __construct(string $email = '', $message = "", $code = 0, Throwable $previous = null) public function __construct(string $email = '')
{ {
parent::__construct($message ?: "Invalid email: '$email'", $code, $previous); parent::__construct("Невалидный email: '$email'");
} }
} }

View File

@ -0,0 +1,38 @@
<?php
/*
* Copyright (c) 2020-2021 Антон Аксенов (Anthony Axenov)
*
* This code is licensed under MIT.
* Этот код распространяется по лицензии MIT.
* https://github.com/anthonyaxenov/atol-online/blob/master/LICENSE
*/
declare(strict_types = 1);
namespace AtolOnline\Exceptions;
use AtolOnline\Enum;
/**
* Исключение, возникающее при ошибке валидации типа агента
*/
class InvalidEnumValueException extends AtolException
{
/**
* Конструктор
*
* @param string $enum
* @param mixed $value
* @param string $message
* @param array $ffd_tags
*/
public function __construct(string $enum, mixed $value, string $message = '', array $ffd_tags = [])
{
/** @var $enum Enum */
parent::__construct(
($message ?: "Некорректное значение $enum::$value.") .
" Допустимые значения: " . implode(', ', $enum::toArray()),
$ffd_tags ?: $enum::getFfdTags()
);
}
}

View File

@ -11,37 +11,23 @@ declare(strict_types = 1);
namespace AtolOnline\Exceptions; namespace AtolOnline\Exceptions;
use Throwable;
/** /**
* Исключение, возникающее при попытке указать ИНН некорректной длины * Исключение, возникающее при попытке указать ИНН некорректной длины
*/ */
class InvalidInnLengthException extends AtolException class InvalidInnLengthException extends AtolException
{ {
/** protected array $ffd_tags = [1016, 1018, 1226, 1228];
* @inheritDoc
*/
protected array $ffd_tags = [
1016,
1018,
1226,
1228,
];
/** /**
* AtolInnWrongLengthException constructor. * Конструктор
* *
* @param string $inn * @param string $inn
* @param string $message * @param string $message
* @param int $code
* @param Throwable|null $previous
*/ */
public function __construct($inn = '', $message = "", $code = 0, Throwable $previous = null) public function __construct(string $inn = '', string $message = '')
{ {
parent::__construct( parent::__construct(
$message ?: 'INN length must be 10 or 12 digits only, actual is ' . strlen($inn), $message ?: 'Длина ИНН должна быть 10 или 12 цифр, фактически - ' . strlen($inn),
$code,
$previous
); );
} }
} }

View File

@ -11,26 +11,16 @@ declare(strict_types = 1);
namespace AtolOnline\Exceptions; namespace AtolOnline\Exceptions;
use Throwable;
/** /**
* Исключение, возникающее при работе с невалидным JSON * Исключение, возникающее при работе с невалидным JSON
*/ */
class InvalidJsonException extends AtolException class InvalidJsonException extends AtolException
{ {
/** /**
* AtolInnWrongLengthException constructor. * Конструктор
*
* @param string $message
* @param int $code
* @param Throwable|null $previous
*/ */
public function __construct($message = "", $code = 0, Throwable $previous = null) public function __construct()
{ {
parent::__construct( parent::__construct('[' . json_last_error() . '] ' . json_last_error_msg());
$message ?: 'Invalid JSON: [' . json_last_error() . '] ' . json_last_error_msg(),
$code,
$previous
);
} }
} }

View File

@ -11,34 +11,22 @@ declare(strict_types = 1);
namespace AtolOnline\Exceptions; namespace AtolOnline\Exceptions;
use Throwable;
/** /**
* Исключение, возникающее при попытке указать некорректный платёжный адрес * Исключение, возникающее при попытке указать некорректный адрес места расчётов
* @see https://online.atol.ru/files/API_atol_online_v4.pdf Документация, стр 35
*/ */
class InvalidPaymentAddressException extends AtolException class InvalidPaymentAddressException extends AtolException
{ {
/** protected array $ffd_tags = [1187];
* @inheritDoc
*/
protected array $ffd_tags = [
1187,
];
/** /**
* Конструктор * Конструктор
* *
* @param string $address * @param string $address
* @param string $message * @param string $message
* @param int $code
* @param Throwable|null $previous
*/ */
public function __construct($address = '', $message = "", $code = 0, Throwable $previous = null) public function __construct($address = '', $message = "")
{ {
parent::__construct( parent::__construct($message ?: "Некорректный адрес места расчётов: '$address'");
$message ?: "Wrong payment address: '$address'",
$code,
$previous
);
} }
} }

View File

@ -1,45 +0,0 @@
<?php
/*
* Copyright (c) 2020-2021 Антон Аксенов (Anthony Axenov)
*
* This code is licensed under MIT.
* Этот код распространяется по лицензии MIT.
* https://github.com/anthonyaxenov/atol-online/blob/master/LICENSE
*/
declare(strict_types = 1);
namespace AtolOnline\Exceptions;
use AtolOnline\Enums\SnoTypes;
use Throwable;
/**
* Исключение, возникающее при попытке указать некорректную СНО
*/
class InvalidSnoException extends AtolException
{
/**
* @inheritDoc
*/
protected array $ffd_tags = [
1055,
];
/**
* Конструктор
*
* @param string $sno
* @param string $message
* @param int $code
* @param Throwable|null $previous
*/
public function __construct($sno = '', $message = "", $code = 0, Throwable $previous = null)
{
parent::__construct(
$message ?: "Wrong SNO: '$sno'. Valid ones: " . implode(', ', SnoTypes::toArray()),
$code,
$previous
);
}
}

View File

@ -11,23 +11,21 @@ declare(strict_types = 1);
namespace AtolOnline\Exceptions; namespace AtolOnline\Exceptions;
use Throwable;
/** /**
* Исключение, возникающее при ошибке валидации UUID * Исключение, возникающее при ошибке валидации UUID
*/ */
class InvalidUuidException extends AtolException class InvalidUuidException extends AtolException
{ {
/** /**
* AtolInvalidUuidException constructor. * Конструктор
* *
* @param $uuid * @param $uuid
* @param string $message * @param string $message
* @param int $code * @param int $code
* @param Throwable|null $previous * @param Throwable|null $previous
*/ */
public function __construct($uuid, $message = "", $code = 0, Throwable $previous = null) public function __construct(?string $uuid = null)
{ {
parent::__construct($message ?: 'Invalid UUID: '.$uuid, $code, $previous); parent::__construct('Невалидный UUID' . ($uuid ? ': ' . $uuid : ''));
} }
} }

View File

@ -11,8 +11,6 @@ declare(strict_types = 1);
namespace AtolOnline\Exceptions; namespace AtolOnline\Exceptions;
use Throwable;
/** /**
* Исключение, возникающее при попытке создать объект ККТ с неполными данными от монитора * Исключение, возникающее при попытке создать объект ККТ с неполными данными от монитора
*/ */
@ -21,18 +19,16 @@ class NotEnoughMonitorDataException extends AtolException
/** /**
* @var string Сообщение об ошибке * @var string Сообщение об ошибке
*/ */
protected $message = 'Cannot create KKT entity without these properties: '; protected $message = 'Невозможно создать объект ККТ без следующих атрибутов: ';
/** /**
* Конструктор * Конструктор
* *
* @param array $props_diff * @param array $props_diff
* @param string $message * @param string $message
* @param int $code
* @param Throwable|null $previous
*/ */
public function __construct(array $props_diff, $message = "", int $code = 0, Throwable $previous = null) public function __construct(array $props_diff, string $message = '')
{ {
parent::__construct($message ?: $this->message . implode(', ', $props_diff), $code, $previous); parent::__construct($message ?: $this->message . implode(', ', $props_diff));
} }
} }

View File

@ -14,7 +14,7 @@ namespace AtolOnline\Exceptions;
/** /**
* Исключение, возникающее при попытке указать слишком высокую цену (сумму) * Исключение, возникающее при попытке указать слишком высокую цену (сумму)
*/ */
class TooHighPriceException extends BasicTooManyException class TooHighPriceException extends TooManyException
{ {
/** /**
* @inheritDoc * @inheritDoc

View File

@ -11,13 +11,13 @@ declare(strict_types = 1);
namespace AtolOnline\Exceptions; namespace AtolOnline\Exceptions;
use AtolOnline\Constants\Constraints;
/** /**
* Исключение, возникающее при попытке указать слишком длинный callback_url * Исключение, возникающее при попытке указать слишком длинный callback_url
*/ */
class TooLongCallbackUrlException extends BasicTooLongException class TooLongCallbackUrlException extends TooLongException
{ {
/** protected $message = 'Слишком длинный адрес колбека';
* @var string Сообщение об ошибке protected int $max = Constraints::MAX_LENGTH_CALLBACK_URL;
*/ }
protected $message = 'Callback URL is too long';
}

View File

@ -11,20 +11,14 @@ declare(strict_types = 1);
namespace AtolOnline\Exceptions; namespace AtolOnline\Exceptions;
use AtolOnline\Constants\Constraints;
/** /**
* Исключение, возникающее при попытке указать слишком длинное имя кассира * Исключение, возникающее при попытке указать слишком длинное имя кассира
*/ */
class TooLongCashierException extends BasicTooLongException class TooLongCashierException extends TooLongException
{ {
/** protected $message = 'Слишком длинное имя кассира';
* @inheritDoc protected int $max = Constraints::MAX_LENGTH_CASHIER_NAME;
*/ protected array $ffd_tags = [1021];
protected array $ffd_tags = [ }
1021,
];
/**
* @var string Сообщение об ошибке
*/
protected $message = 'Cashier name is too long';
}

View File

@ -11,24 +11,14 @@ declare(strict_types = 1);
namespace AtolOnline\Exceptions; namespace AtolOnline\Exceptions;
use AtolOnline\Constants\Constraints;
/** /**
* Исключение, возникающее при попытке указать слишком длинный телефон * Исключение, возникающее при попытке указать слишком длинный телефон или email покупателя
*/ */
class TooLongPhoneException extends BasicTooLongException class TooLongClientContactException extends TooLongException
{ {
/** protected $message = 'Cлишком длинный телефон или email покупателя';
* @inheritDoc protected int $max = Constraints::MAX_LENGTH_CLIENT_CONTACT;
*/ protected array $ffd_tags = [1008];
protected array $ffd_tags = [ }
1008,
1073,
1074,
1075,
1171,
];
/**
* @var string Сообщение об ошибке
*/
protected $message = 'Phone is too long';
}

View File

@ -0,0 +1,24 @@
<?php
/*
* Copyright (c) 2020-2021 Антон Аксенов (Anthony Axenov)
*
* This code is licensed under MIT.
* Этот код распространяется по лицензии MIT.
* https://github.com/anthonyaxenov/atol-online/blob/master/LICENSE
*/
declare(strict_types = 1);
namespace AtolOnline\Exceptions;
use AtolOnline\Constants\Constraints;
/**
* Исключение, возникающее при попытке указать слишком длинное наименование покупателя
*/
class TooLongClientNameException extends TooLongException
{
protected $message = 'Cлишком длинное наименование покупателя';
protected int $max = Constraints::MAX_LENGTH_CLIENT_NAME;
protected array $ffd_tags = [1227];
}

View File

@ -11,21 +11,14 @@ declare(strict_types = 1);
namespace AtolOnline\Exceptions; namespace AtolOnline\Exceptions;
use AtolOnline\Constants\Constraints;
/** /**
* Исключение, возникающее при попытке указать слишком длинный email * Исключение, возникающее при попытке указать слишком длинный email
*/ */
class TooLongEmailException extends BasicTooLongException class TooLongEmailException extends TooLongException
{ {
/** protected $message = 'Слишком длинный email';
* @inheritDoc protected int $max = Constraints::MAX_LENGTH_EMAIL;
*/ protected array $ffd_tags = [1008, 1117];
protected array $ffd_tags = [ }
1008,
1117,
];
/**
* @var string Сообщение об ошибке
*/
protected $message = 'Email is too long';
}

View File

@ -0,0 +1,44 @@
<?php
/*
* Copyright (c) 2020-2021 Антон Аксенов (Anthony Axenov)
*
* This code is licensed under MIT.
* Этот код распространяется по лицензии MIT.
* https://github.com/anthonyaxenov/atol-online/blob/master/LICENSE
*/
declare(strict_types = 1);
namespace AtolOnline\Exceptions;
/**
* Исключение, возникающее при попытке указать слишком длинное что-либо
*/
class TooLongException extends AtolException
{
/**
* @var string Сообщение об ошибке
*/
protected $message = 'Слишком длинное значение';
/**
* @var int Максимальная длина строки
*/
protected int $max = 0;
/**
* Конструктор
*
* @param string $value
* @param string $message
* @param int $max
*/
public function __construct(string $value, string $message = '', int $max = 0)
{
$message = ($message ?: $this->message) . ': '. $value;
if ($max > 0 || $this->max > 0) {
$message .= ' (макс. = ' . ($max ?? $this->max) . ', фактически = ' . mb_strlen($value) . ')';
}
parent::__construct($message);
}
}

View File

@ -11,24 +11,14 @@ declare(strict_types = 1);
namespace AtolOnline\Exceptions; namespace AtolOnline\Exceptions;
use AtolOnline\Constants\Constraints;
/** /**
* Исключение, возникающее при попытке указать слишком длинное имя * Исключение, возникающее при попытке указать слишком длинное имя
*/ */
class TooLongNameException extends BasicTooLongException class TooLongItemNameException extends TooLongException
{ {
/** protected $message = 'Слишком длинное наименование предмета расчёта';
* @inheritDoc protected int $max = Constraints::MAX_LENGTH_ITEM_NAME;
*/ protected array $ffd_tags = [1030];
protected array $ffd_tags = [ }
1026,
1030,
1085,
1225,
1227,
];
/**
* @var string Сообщение об ошибке
*/
protected $message = 'Name is too long';
}

View File

@ -11,13 +11,13 @@ declare(strict_types = 1);
namespace AtolOnline\Exceptions; namespace AtolOnline\Exceptions;
use AtolOnline\Constants\Constraints;
/** /**
* Исключение, возникающее при попытке указать слишком длинный логин ККТ * Исключение, возникающее при попытке указать слишком длинный логин ККТ
*/ */
class TooLongLoginException extends BasicTooLongException class TooLongLoginException extends TooLongException
{ {
/** protected $message = 'Слишком длинный логин';
* @var string Сообщение об ошибке protected int $max = Constraints::MAX_LENGTH_LOGIN;
*/ }
protected $message = 'KKT login is too long';
}

View File

@ -11,13 +11,13 @@ declare(strict_types = 1);
namespace AtolOnline\Exceptions; namespace AtolOnline\Exceptions;
use AtolOnline\Constants\Constraints;
/** /**
* Исключение, возникающее при попытке указать слишком длинный пароль ККТ * Исключение, возникающее при попытке указать слишком длинный пароль ККТ
*/ */
class TooLongPasswordException extends BasicTooLongException class TooLongPasswordException extends TooLongException
{ {
/** protected $message = 'Слишком длинный пароль';
* @var string Сообщение об ошибке protected int $max = Constraints::MAX_LENGTH_PASSWORD;
*/ }
protected $message = 'KKT password is too long';
}

View File

@ -0,0 +1,24 @@
<?php
/*
* Copyright (c) 2020-2021 Антон Аксенов (Anthony Axenov)
*
* This code is licensed under MIT.
* Этот код распространяется по лицензии MIT.
* https://github.com/anthonyaxenov/atol-online/blob/master/LICENSE
*/
declare(strict_types = 1);
namespace AtolOnline\Exceptions;
use AtolOnline\Constants\Constraints;
/**
* Исключение, возникающее при попытке указать слишком длинную операцию для платёжного агента
*/
class TooLongPayingAgentOperationException extends TooLongException
{
protected $message = 'Слишком длинное yаименование операции платёжного агента';
protected int $max = Constraints::MAX_LENGTH_PAYING_AGENT_OPERATION;
protected array $ffd_tags = [1073];
}

View File

@ -11,20 +11,14 @@ declare(strict_types = 1);
namespace AtolOnline\Exceptions; namespace AtolOnline\Exceptions;
/** use AtolOnline\Constants\Constraints;
* Исключение, возникающее при попытке указать слишком длинный платёжный адрес
*/
class TooLongPaymentAddressException extends AtolException
{
/**
* @inheritDoc
*/
protected array $ffd_tags = [
1187,
];
/** /**
* @var string Сообщение об ошибке * Исключение, возникающее при попытке указать слишком длинный адрес места расчётов
*/ */
protected $message = 'Payment address is too long'; class TooLongPaymentAddressException extends TooLongException
} {
protected $message = 'Слишком длинный адрес места расчётов';
protected int $max = Constraints::MAX_LENGTH_PAYMENT_ADDRESS;
protected array $ffd_tags = [1187];
}

View File

@ -11,20 +11,14 @@ declare(strict_types = 1);
namespace AtolOnline\Exceptions; namespace AtolOnline\Exceptions;
/** use AtolOnline\Constants\Constraints;
* Исключение, возникающее при попытке указать слишком длинный телефон
*/
class TooLongUnitException extends BasicTooLongException
{
/**
* @inheritDoc
*/
protected array $ffd_tags = [
1197,
];
/** /**
* @var string Сообщение об ошибке * Исключение, возникающее при попытке указать слишком длинную единицу измерения предмета расчёта
*/ */
protected $message = 'Measurement unit is too long'; class TooLongUnitException extends TooLongException
} {
protected $message = 'Слишком длинная единица измерения предмета расчёта';
protected int $max = Constraints::MAX_LENGTH_MEASUREMENT_UNIT;
protected array $ffd_tags = [1197];
}

View File

@ -11,20 +11,14 @@ declare(strict_types = 1);
namespace AtolOnline\Exceptions; namespace AtolOnline\Exceptions;
use AtolOnline\Constants\Constraints;
/** /**
* Исключение, возникающее при попытке указать слишком длинный дополнительный реквизит * Исключение, возникающее при попытке указать слишком длинный дополнительный реквизит
*/ */
class TooLongUserdataException extends BasicTooLongException class TooLongUserdataException extends TooLongException
{ {
/** protected $message = 'Слишком длинный дополнительный реквизит предмета расчёта';
* @inheritDoc protected int $max = Constraints::MAX_LENGTH_USER_DATA;
*/ protected array $ffd_tags = [1191];
protected array $ffd_tags = [ }
1191,
];
/**
* @var string Сообщение об ошибке
*/
protected $message = 'User data is too long';
}

View File

@ -11,33 +11,34 @@ declare(strict_types = 1);
namespace AtolOnline\Exceptions; namespace AtolOnline\Exceptions;
use Throwable;
/** /**
* Исключение, возникающее при попытке указать слишком большое количество чего-либо * Исключение, возникающее при попытке указать слишком большое количество чего-либо
*/ */
class BasicTooManyException extends AtolException class TooManyException extends AtolException
{ {
/** /**
* @var string Сообщение об ошибке * @var string Сообщение об ошибке
*/ */
protected $message = 'Quantity is too high'; protected $message = 'Слишком большое количество';
/** /**
* AtolTooManyException constructor. * @var int Максимальное количество
*
* @param float $quantity
* @param float $max
* @param string $message
* @param int $code
* @param Throwable|null $previous
*/ */
public function __construct(float $quantity, float $max, $message = "", int $code = 0, Throwable $previous = null) protected int $max = 0;
/**
* Конструктор
*
* @param float $value
* @param string $message
* @param float $max
*/
public function __construct(float $value, string $message = '', float $max = 0)
{ {
parent::__construct( $message = ($message ?: $this->message) . ': ' . $value;
$message ?: $this->message . ' (max - ' . $max . ', actual - ' . $quantity . ')', if ($max > 0 || $this->max > 0) {
$code, $message .= ' (макс. = ' . ($max ?? $this->max) . ', фактически = ' . $value . ')';
$previous }
); parent::__construct($message);
} }
} }

View File

@ -11,13 +11,13 @@ declare(strict_types = 1);
namespace AtolOnline\Exceptions; namespace AtolOnline\Exceptions;
use AtolOnline\Constants\Constraints;
/** /**
* Исключение, возникающее при попытке добавить слишком много предметов расчёта в массив * Исключение, возникающее при попытке добавить слишком много предметов расчёта в массив
*/ */
class TooManyItemsException extends BasicTooManyException class TooManyItemsException extends TooManyException
{ {
/** protected $message = 'Слишком много предметов расчёта в документе';
* @var string Сообщение об ошибке protected int $max = Constraints::MAX_COUNT_DOC_ITEMS;
*/ }
protected $message = 'Too many items';
}

View File

@ -11,23 +11,13 @@ declare(strict_types = 1);
namespace AtolOnline\Exceptions; namespace AtolOnline\Exceptions;
use AtolOnline\Constants\Constraints;
/** /**
* Исключение, возникающее при попытке добавить слишком много платежей в массив * Исключение, возникающее при попытке добавить слишком много платежей в массив
*/ */
class TooManyPaymentsException extends BasicTooManyException class TooManyPaymentsException extends TooManyException
{ {
/** protected $message = 'Слишком много платежей в документе';
* @inheritDoc protected int $max = Constraints::MAX_COUNT_DOC_PAYMENTS;
*/ }
protected array $ffd_tags = [
1031,
1081,
1215,
1217,
];
/**
* @var string Сообщение об ошибке
*/
protected $message = 'Too many payments';
}

View File

@ -11,25 +11,13 @@ declare(strict_types = 1);
namespace AtolOnline\Exceptions; namespace AtolOnline\Exceptions;
use AtolOnline\Constants\Constraints;
/** /**
* Исключение, возникающее при попытке добавить слишком много ставок НДС в массив * Исключение, возникающее при попытке добавить слишком много ставок НДС в массив
*/ */
class TooManyVatsException extends BasicTooManyException class TooManyVatsException extends TooManyException
{ {
/** protected $message = 'Слишком много ставок НДС в документе';
* @inheritDoc protected int $max = Constraints::MAX_COUNT_DOC_VATS;
*/ }
protected array $ffd_tags = [
1102,
1103,
1104,
1105,
1106,
1107,
];
/**
* @var string Сообщение об ошибке
*/
protected $message = 'Too many vats';
}

View File

@ -12,6 +12,7 @@ declare(strict_types = 1);
namespace AtolOnlineTests; namespace AtolOnlineTests;
use AtolOnline\Entities\Entity; use AtolOnline\Entities\Entity;
use AtolOnline\Helpers;
use GuzzleHttp\Client; use GuzzleHttp\Client;
use GuzzleHttp\Exception\GuzzleException; use GuzzleHttp\Exception\GuzzleException;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
@ -89,57 +90,40 @@ class BasicTestCase extends TestCase
*/ */
public function assertIsSameClass(object|string $expected, object|string $actual): void public function assertIsSameClass(object|string $expected, object|string $actual): void
{ {
$this->assertEquals( $this->assertTrue(Helpers::isSameClass($expected, $actual));
is_object($expected) ? $expected::class : $expected,
is_object($actual) ? $actual::class : $actual
);
} }
/** /**
* Тестирует наследование класса (объекта) от указанных классов * Тестирует наследование класса (объекта) от указанных классов
* *
* @param object|string $class
* @param string[] $parents * @param string[] $parents
* @param object|string $actual
*/ */
public function assertExtendsClasses(array $parents, object|string $actual): void public function assertExtendsClasses(object|string $class, array $parents): void
{ {
$this->checkClassesIntersection($parents, $actual, 'class_parents'); $this->assertTrue(Helpers::checkExtendsClasses($class, $parents));
} }
/** /**
* Тестирует имплементацию классом (объектом) указанных интерфейсов * Тестирует имплементацию классом (объектом) указанных интерфейсов
* *
* @param string[] $parents * @param object|string $class
* @param object|string $actual * @param string[] $interfaces
*/ */
public function assertImplementsInterfaces(array $parents, object|string $actual): void public function assertImplementsInterfaces(object|string $class, array $interfaces): void
{ {
$this->checkClassesIntersection($parents, $actual, 'class_implements'); $this->assertTrue(Helpers::checkImplementsInterfaces($class, $interfaces));
} }
/** /**
* Тестирует использование классом (объектом) указанных трейтов * Тестирует использование классом (объектом) указанных трейтов
* *
* @param string[] $parents * @param object|string $class
* @param object|string $actual * @param string[] $traits
*/ */
public function assertUsesTraits(array $parents, object|string $actual): void public function assertUsesTraits(object|string $class, array $traits): void
{ {
$this->checkClassesIntersection($parents, $actual, 'class_uses'); $this->assertTrue(Helpers::checkUsesTraits($traits, $class));
}
/**
* Проверяет пересечение классов указанной функцией SPL
*
* @param object|string $class Класс для проверки на вхождение, или объект, класс коего нужно проверить
* @param array $classes Массив классов, вхождение в который нужно проверить
* @param string $function class_parents|class_implements|class_uses
*/
protected function checkClassesIntersection(array $classes, object|string $class, string $function): void
{
$actual_classes = is_object($class) ? $function($class) : [$class::class];
$this->assertIsArray($actual_classes);
$this->assertNotEmpty(array_intersect($classes, $actual_classes));
} }
/** /**

View File

@ -13,11 +13,11 @@ use AtolOnline\{
Entities\Client, Entities\Client,
Exceptions\InvalidEmailException, Exceptions\InvalidEmailException,
Exceptions\InvalidInnLengthException, Exceptions\InvalidInnLengthException,
Exceptions\TooLongClientContactException,
Exceptions\TooLongClientNameException,
Exceptions\TooLongEmailException, Exceptions\TooLongEmailException,
Exceptions\TooLongNameException, Exceptions\TooLongItemNameException,
Exceptions\TooLongPhoneException, Helpers};
Helpers
};
/** /**
* Набор тестов для проверки работы класс покупателя * Набор тестов для проверки работы класс покупателя
@ -135,7 +135,7 @@ class ClientTest extends BasicTestCase
* @covers \AtolOnline\Entities\Client * @covers \AtolOnline\Entities\Client
* @covers \AtolOnline\Entities\Client::setName * @covers \AtolOnline\Entities\Client::setName
* @covers \AtolOnline\Entities\Client::getName * @covers \AtolOnline\Entities\Client::getName
* @throws TooLongNameException * @throws TooLongClientNameException
*/ */
public function testNullableNames(mixed $name): void public function testNullableNames(mixed $name): void
{ {
@ -149,7 +149,7 @@ class ClientTest extends BasicTestCase
* @covers \AtolOnline\Entities\Client * @covers \AtolOnline\Entities\Client
* @covers \AtolOnline\Entities\Client::setName * @covers \AtolOnline\Entities\Client::setName
* @covers \AtolOnline\Entities\Client::getName * @covers \AtolOnline\Entities\Client::getName
* @throws TooLongNameException * @throws TooLongItemNameException
*/ */
public function testValidName(): void public function testValidName(): void
{ {
@ -163,12 +163,11 @@ class ClientTest extends BasicTestCase
* *
* @covers \AtolOnline\Entities\Client * @covers \AtolOnline\Entities\Client
* @covers \AtolOnline\Entities\Client::setName * @covers \AtolOnline\Entities\Client::setName
* @covers \AtolOnline\Exceptions\TooLongNameException * @covers \AtolOnline\Exceptions\TooLongClientNameException
* @throws TooLongNameException
*/ */
public function testInvalidName(): void public function testInvalidName(): void
{ {
$this->expectException(TooLongNameException::class); $this->expectException(TooLongClientNameException::class);
(new Client())->setName(Helpers::randomStr(400)); (new Client())->setName(Helpers::randomStr(400));
} }
@ -182,7 +181,7 @@ class ClientTest extends BasicTestCase
* @covers \AtolOnline\Entities\Client * @covers \AtolOnline\Entities\Client
* @covers \AtolOnline\Entities\Client::setPhone * @covers \AtolOnline\Entities\Client::setPhone
* @covers \AtolOnline\Entities\Client::getPhone * @covers \AtolOnline\Entities\Client::getPhone
* @throws TooLongPhoneException * @throws TooLongClientContactException
*/ */
public function testNullablePhones(mixed $phone): void public function testNullablePhones(mixed $phone): void
{ {
@ -197,7 +196,7 @@ class ClientTest extends BasicTestCase
* @covers \AtolOnline\Entities\Client * @covers \AtolOnline\Entities\Client
* @covers \AtolOnline\Entities\Client::setPhone * @covers \AtolOnline\Entities\Client::setPhone
* @covers \AtolOnline\Entities\Client::getPhone * @covers \AtolOnline\Entities\Client::getPhone
* @throws TooLongPhoneException * @throws TooLongClientContactException
*/ */
public function testValidPhone(string $input, string $output): void public function testValidPhone(string $input, string $output): void
{ {
@ -210,12 +209,12 @@ class ClientTest extends BasicTestCase
* *
* @covers \AtolOnline\Entities\Client * @covers \AtolOnline\Entities\Client
* @covers \AtolOnline\Entities\Client::setPhone * @covers \AtolOnline\Entities\Client::setPhone
* @covers \AtolOnline\Exceptions\TooLongPhoneException * @covers \AtolOnline\Exceptions\TooLongClientContactException
* @throws TooLongPhoneException * @throws TooLongClientContactException
*/ */
public function testInvalidPhone(): void public function testTooLongClientPhone(): void
{ {
$this->expectException(TooLongPhoneException::class); $this->expectException(TooLongClientContactException::class);
(new Client())->setPhone('99999999999999999999999999999999999999999999999999999999999999999999999999'); (new Client())->setPhone('99999999999999999999999999999999999999999999999999999999999999999999999999');
} }
@ -315,4 +314,4 @@ class ClientTest extends BasicTestCase
$this->expectException(InvalidInnLengthException::class); $this->expectException(InvalidInnLengthException::class);
(new Client())->setInn('1234567890123'); (new Client())->setInn('1234567890123');
} }
} }

View File

@ -13,9 +13,9 @@ use AtolOnline\{
Entities\Company, Entities\Company,
Enums\SnoTypes, Enums\SnoTypes,
Exceptions\InvalidEmailException, Exceptions\InvalidEmailException,
Exceptions\InvalidEnumValueException,
Exceptions\InvalidInnLengthException, Exceptions\InvalidInnLengthException,
Exceptions\InvalidPaymentAddressException, Exceptions\InvalidPaymentAddressException,
Exceptions\InvalidSnoException,
Exceptions\TooLongEmailException, Exceptions\TooLongEmailException,
Exceptions\TooLongPaymentAddressException, Exceptions\TooLongPaymentAddressException,
Helpers}; Helpers};
@ -85,11 +85,11 @@ class CompanyTest extends BasicTestCase
* *
* @covers \AtolOnline\Entities\Company * @covers \AtolOnline\Entities\Company
* @covers \AtolOnline\Entities\Company::setSno * @covers \AtolOnline\Entities\Company::setSno
* @covers \AtolOnline\Exceptions\InvalidSnoException * @covers \AtolOnline\Exceptions\InvalidEnumValueException
*/ */
public function testInvalidSnoException() public function testInvalidSnoException()
{ {
$this->expectException(InvalidSnoException::class); $this->expectException(InvalidEnumValueException::class);
new Company('company@example.com', 'test', '1234567890', 'https://example.com'); new Company('company@example.com', 'test', '1234567890', 'https://example.com');
} }

View File

@ -14,11 +14,11 @@ use AtolOnline\{
Enums\PaymentMethods, Enums\PaymentMethods,
Enums\PaymentObjects, Enums\PaymentObjects,
Enums\VatTypes, Enums\VatTypes,
Exceptions\BasicTooManyException,
Exceptions\TooHighPriceException, Exceptions\TooHighPriceException,
Exceptions\TooLongNameException, Exceptions\TooLongItemNameException,
Exceptions\TooLongUnitException, Exceptions\TooLongUnitException,
Exceptions\TooLongUserdataException,}; Exceptions\TooLongUserdataException,
Exceptions\TooManyException,};
/** /**
* Class ItemTest * Class ItemTest
@ -102,12 +102,12 @@ class ItemTestTodo extends BasicTestCase
/** /**
* Тестирует исключение о слишком длинном наименовании * Тестирует исключение о слишком длинном наименовании
* *
* @throws TooLongNameException * @throws TooLongItemNameException
*/ */
public function testAtolNameTooLongException() public function testAtolNameTooLongException()
{ {
$item = new Item(); $item = new Item();
$this->expectException(TooLongNameException::class); $this->expectException(TooLongItemNameException::class);
$item->setName(Helpers::randomStr(130)); $item->setName(Helpers::randomStr(130));
} }
@ -115,13 +115,13 @@ class ItemTestTodo extends BasicTestCase
* Тестирует исключение о слишком высоком количестве * Тестирует исключение о слишком высоком количестве
* *
* @throws TooHighPriceException * @throws TooHighPriceException
* @throws BasicTooManyException * @throws TooManyException
* @throws TooLongUnitException * @throws TooLongUnitException
*/ */
public function testAtolQuantityTooHighException() public function testAtolQuantityTooHighException()
{ {
$item = new Item(); $item = new Item();
$this->expectException(BasicTooManyException::class); $this->expectException(TooManyException::class);
$item->setQuantity(100000.1); $item->setQuantity(100000.1);
} }
@ -160,4 +160,4 @@ class ItemTestTodo extends BasicTestCase
$this->expectException(TooLongUnitException::class); $this->expectException(TooLongUnitException::class);
$item->setMeasurementUnit('кг кг кг кг кг кг кг кг кг '); $item->setMeasurementUnit('кг кг кг кг кг кг кг кг кг ');
} }
} }

View File

@ -56,7 +56,7 @@ class KktMonitorTest extends BasicTestCase
$client = new KktMonitor(); $client = new KktMonitor();
$this->assertIsObject($client); $this->assertIsObject($client);
$this->assertIsSameClass(KktMonitor::class, $client); $this->assertIsSameClass(KktMonitor::class, $client);
$this->assertExtendsClasses([AtolClient::class], $client); $this->assertExtendsClasses($client, [AtolClient::class]);
} }
/** /**
@ -76,8 +76,8 @@ class KktMonitorTest extends BasicTestCase
{ {
$client = new KktMonitor(false, 'login', 'password', []); $client = new KktMonitor(false, 'login', 'password', []);
$this->assertIsObject($client); $this->assertIsObject($client);
$this->assertIsSameClass(KktMonitor::class, $client); $this->assertIsSameClass($client, KktMonitor::class);
$this->assertExtendsClasses([AtolClient::class], $client); $this->assertExtendsClasses($client, [AtolClient::class]);
} }
/** /**