Общие сеттеры-геттеры сущностей вынесены в трейты HasEmail, HasInn, HasPhones

Кодстайл и микрорефакторинг сущностей
This commit is contained in:
Anthony Axenov 2021-12-03 18:23:00 +08:00
parent c30c7d069f
commit 2260233e3f
13 changed files with 305 additions and 453 deletions

View File

@ -45,21 +45,21 @@ class AgentInfo extends Entity
* Конструктор * Конструктор
* *
* @param string|null $type Признак агента (1057) * @param string|null $type Признак агента (1057)
* @param PayingAgent|null $paying_agent Платёжный агент * @param PayingAgent|null $pagent Платёжный агент
* @param ReceivePaymentsOperator|null $receive_payments_operator Оператор по приёму платежей * @param ReceivePaymentsOperator|null $rp_operator Оператор по приёму платежей
* @param MoneyTransferOperator|null $money_transfer_operator Оператор перевода * @param MoneyTransferOperator|null $mt_operator Оператор перевода
* @throws InvalidEnumValueException * @throws InvalidEnumValueException
*/ */
public function __construct( public function __construct(
?string $type = null, ?string $type = null,
?PayingAgent $paying_agent = null, ?PayingAgent $pagent = null,
?ReceivePaymentsOperator $receive_payments_operator = null, ?ReceivePaymentsOperator $rp_operator = null,
?MoneyTransferOperator $money_transfer_operator = null, ?MoneyTransferOperator $mt_operator = null,
) { ) {
!is_null($type) && $this->setType($type); !is_null($type) && $this->setType($type);
!is_null($paying_agent) && $this->setPayingAgent($paying_agent); !is_null($pagent) && $this->setPayingAgent($pagent);
!is_null($receive_payments_operator) && $this->setReceivePaymentsOperator($receive_payments_operator); !is_null($rp_operator) && $this->setReceivePaymentsOperator($rp_operator);
!is_null($money_transfer_operator) && $this->setMoneyTransferOperator($money_transfer_operator); !is_null($mt_operator) && $this->setMoneyTransferOperator($mt_operator);
} }
/** /**
@ -79,7 +79,7 @@ class AgentInfo extends Entity
* @return AgentInfo * @return AgentInfo
* @throws InvalidEnumValueException * @throws InvalidEnumValueException
*/ */
public function setType(?string $type): AgentInfo public function setType(?string $type): self
{ {
AgentTypes::isValid($type) && $this->type = $type; AgentTypes::isValid($type) && $this->type = $type;
return $this; return $this;
@ -98,12 +98,12 @@ class AgentInfo extends Entity
/** /**
* Устанавливает платёжного агента * Устанавливает платёжного агента
* *
* @param PayingAgent|null $paying_agent * @param PayingAgent|null $agent
* @return AgentInfo * @return AgentInfo
*/ */
public function setPayingAgent(?PayingAgent $paying_agent): AgentInfo public function setPayingAgent(?PayingAgent $agent): self
{ {
$this->paying_agent = $paying_agent; $this->paying_agent = $agent;
return $this; return $this;
} }
@ -120,12 +120,12 @@ class AgentInfo extends Entity
/** /**
* Устанавливает оператора по приёму платежей * Устанавливает оператора по приёму платежей
* *
* @param ReceivePaymentsOperator|null $receive_payments_operator * @param ReceivePaymentsOperator|null $operator
* @return AgentInfo * @return AgentInfo
*/ */
public function setReceivePaymentsOperator(?ReceivePaymentsOperator $receive_payments_operator): AgentInfo public function setReceivePaymentsOperator(?ReceivePaymentsOperator $operator): self
{ {
$this->receive_payments_operator = $receive_payments_operator; $this->receive_payments_operator = $operator;
return $this; return $this;
} }
@ -142,12 +142,12 @@ class AgentInfo extends Entity
/** /**
* Устанавливает оператора перевода * Устанавливает оператора перевода
* *
* @param MoneyTransferOperator|null $money_transfer_operator * @param MoneyTransferOperator|null $operator
* @return AgentInfo * @return AgentInfo
*/ */
public function setMoneyTransferOperator(?MoneyTransferOperator $money_transfer_operator): AgentInfo public function setMoneyTransferOperator(?MoneyTransferOperator $operator): self
{ {
$this->money_transfer_operator = $money_transfer_operator; $this->money_transfer_operator = $operator;
return $this; return $this;
} }

View File

@ -11,14 +11,19 @@ declare(strict_types = 1);
namespace AtolOnline\Entities; namespace AtolOnline\Entities;
use AtolOnline\{ use AtolOnline\Constants\Constraints;
Constants\Constraints, use AtolOnline\Exceptions\{
Exceptions\InvalidEmailException, InvalidEmailException,
Exceptions\InvalidInnLengthException, InvalidInnLengthException,
Exceptions\InvalidPhoneException, InvalidPhoneException,
Exceptions\TooLongClientContactException, TooLongClientNameException,
Exceptions\TooLongClientNameException, TooLongEmailException
Exceptions\TooLongEmailException}; };
use AtolOnline\Traits\{
HasEmail,
HasInn
};
use JetBrains\PhpStorm\Pure;
/** /**
* Класс, описывающий покупателя * Класс, описывающий покупателя
@ -27,38 +32,30 @@ use AtolOnline\{
*/ */
class Client extends Entity class Client extends Entity
{ {
use HasEmail, HasInn;
/** /**
* @var string|null Наименование (1227) * @var string|null Наименование (1227)
*/ */
protected ?string $name = null; protected ?string $name = null;
/**
* @var string|null Email (1008)
*/
protected ?string $email = null;
/** /**
* @var string|null Телефон (1008) * @var string|null Телефон (1008)
*/ */
protected ?string $phone = null; protected ?string $phone = null;
/**
* @var string|null ИНН (1228)
*/
protected ?string $inn = null;
/** /**
* Конструктор объекта покупателя * Конструктор объекта покупателя
* *
* @param string|null $name Наименование (1227) * @param string|null $name Наименование (1227)
* @param string|null $phone Email (1008)
* @param string|null $email Телефон (1008) * @param string|null $email Телефон (1008)
* @param string|null $phone Email (1008)
* @param string|null $inn ИНН (1228) * @param string|null $inn ИНН (1228)
* @throws TooLongClientNameException
* @throws TooLongClientContactException
* @throws TooLongEmailException
* @throws InvalidEmailException * @throws InvalidEmailException
* @throws InvalidInnLengthException * @throws InvalidInnLengthException
* @throws InvalidPhoneException
* @throws TooLongClientNameException
* @throws TooLongEmailException
*/ */
public function __construct( public function __construct(
?string $name = null, ?string $name = null,
@ -101,38 +98,6 @@ class Client extends Entity
return $this; return $this;
} }
/**
* Возвращает установленный email
*
* @return string|null
*/
public function getEmail(): ?string
{
return $this->email;
}
/**
* Устанавливает email
*
* @param string|null $email
* @return $this
* @throws TooLongEmailException Слишком длинный email
* @throws InvalidEmailException Невалидный email
*/
public function setEmail(?string $email): self
{
if (is_string($email)) {
$email = preg_replace('/[\n\r\t]/', '', trim($email));
if (mb_strlen($email) > Constraints::MAX_LENGTH_EMAIL) {
throw new TooLongEmailException($email);
} elseif (filter_var($email, FILTER_VALIDATE_EMAIL) === false) {
throw new InvalidEmailException($email);
}
}
$this->email = empty($email) ? null : $email;
return $this;
}
/** /**
* Возвращает установленный телефон * Возвращает установленный телефон
* *
@ -162,38 +127,10 @@ class Client extends Entity
return $this; return $this;
} }
/**
* Возвращает установленный ИНН
*
* @return string|null
*/
public function getInn(): ?string
{
return $this->inn;
}
/**
* Устанавливает ИНН
*
* @param string|null $inn
* @return $this
* @throws InvalidInnLengthException Некорректная длина ИНН
*/
public function setInn(?string $inn): self
{
if (is_string($inn)) {
$inn = preg_replace('/[^\d]/', '', trim($inn));
if (preg_match_all(Constraints::PATTERN_INN, $inn) === 0) {
throw new InvalidInnLengthException($inn);
}
}
$this->inn = empty($inn) ? null : $inn;
return $this;
}
/** /**
* @inheritDoc * @inheritDoc
*/ */
#[Pure]
public function jsonSerialize(): array public function jsonSerialize(): array
{ {
$json = []; $json = [];

View File

@ -14,12 +14,18 @@ namespace AtolOnline\Entities;
use AtolOnline\{ use AtolOnline\{
Constants\Constraints, Constants\Constraints,
Enums\SnoTypes, Enums\SnoTypes,
Exceptions\InvalidEmailException, Traits\HasEmail,
Exceptions\InvalidEnumValueException, Traits\HasInn
Exceptions\InvalidInnLengthException, };
Exceptions\InvalidPaymentAddressException, use AtolOnline\Exceptions\{
Exceptions\TooLongEmailException, InvalidEmailException,
Exceptions\TooLongPaymentAddressException}; InvalidEnumValueException,
InvalidInnLengthException,
InvalidPaymentAddressException,
TooLongEmailException,
TooLongPaymentAddressException
};
use JetBrains\PhpStorm\ArrayShape;
/** /**
* Класс, описывающий сущность компании-продавца * Класс, описывающий сущность компании-продавца
@ -28,21 +34,13 @@ use AtolOnline\{
*/ */
class Company extends Entity class Company extends Entity
{ {
/** use HasEmail, HasInn;
* @var string|null Почта (1117)
*/
protected ?string $email;
/** /**
* @var string|null Система налогообложения продавца (1055) * @var string|null Система налогообложения продавца (1055)
*/ */
protected ?string $sno; protected ?string $sno;
/**
* @var string|null ИНН (1018)
*/
protected ?string $inn;
/** /**
* @var string|null Место расчётов (адрес интернет-магазина) (1187) * @var string|null Место расчётов (адрес интернет-магазина) (1187)
*/ */
@ -74,36 +72,6 @@ class Company extends Entity
$this->setPaymentAddress($payment_address); $this->setPaymentAddress($payment_address);
} }
/**
* Возвращает установленный email
*
* @return string
*/
public function getEmail(): string
{
return $this->email;
}
/**
* Устанавливает email
*
* @param string $email
* @return $this
* @throws TooLongEmailException Слишком длинный email
* @throws InvalidEmailException Невалидный email
*/
public function setEmail(string $email): self
{
$email = preg_replace('/[\n\r\t]/', '', trim($email));
if (mb_strlen($email) > Constraints::MAX_LENGTH_EMAIL) {
throw new TooLongEmailException($email);
} elseif (empty($email) || filter_var($email, FILTER_VALIDATE_EMAIL) === false) {
throw new InvalidEmailException($email);
}
$this->email = $email;
return $this;
}
/** /**
* Возвращает установленный тип налогообложения * Возвращает установленный тип налогообложения
* *
@ -129,33 +97,6 @@ class Company extends Entity
return $this; return $this;
} }
/**
* Возвращает установленный ИНН
*
* @return string
*/
public function getInn(): string
{
return $this->inn;
}
/**
* Устанавливает ИНН
*
* @param string $inn
* @return $this
* @throws InvalidInnLengthException
*/
public function setInn(string $inn): self
{
$inn = preg_replace('/[^\d]/', '', trim($inn));
if (empty($inn) || preg_match_all(Constraints::PATTERN_INN, $inn) === 0) {
throw new InvalidInnLengthException($inn);
}
$this->inn = $inn;
return $this;
}
/** /**
* Возвращает установленный адрес места расчётов * Возвращает установленный адрес места расчётов
* *
@ -193,6 +134,12 @@ class Company extends Entity
* @throws InvalidInnLengthException * @throws InvalidInnLengthException
* @throws InvalidPaymentAddressException * @throws InvalidPaymentAddressException
*/ */
#[ArrayShape([
'email' => "string",
'sno' => "string",
'inn' => "string",
'payment_address' => "string",
])]
public function jsonSerialize(): array public function jsonSerialize(): array
{ {
return [ return [

View File

@ -11,26 +11,28 @@ declare(strict_types = 1);
namespace AtolOnline\Entities; namespace AtolOnline\Entities;
use AtolOnline\{ use AtolOnline\Constants\Constraints;
Constants\Constraints, use AtolOnline\Enums\{
Enums\PaymentMethods, PaymentMethods,
Enums\PaymentObjects, PaymentObjects,
Enums\VatTypes, VatTypes
Exceptions\EmptyItemNameException, };
Exceptions\InvalidDeclarationNumberException, use AtolOnline\Exceptions\{
Exceptions\InvalidEnumValueException, EmptyItemNameException,
Exceptions\InvalidOKSMCodeException, InvalidDeclarationNumberException,
Exceptions\NegativeItemExciseException, InvalidEnumValueException,
Exceptions\NegativeItemPriceException, InvalidOKSMCodeException,
Exceptions\NegativeItemQuantityException, NegativeItemExciseException,
Exceptions\TooHighItemQuantityException, NegativeItemPriceException,
Exceptions\TooHighPriceException, NegativeItemQuantityException,
Exceptions\TooHighSumException, TooHighItemQuantityException,
Exceptions\TooLongItemCodeException, TooHighPriceException,
Exceptions\TooLongItemNameException, TooHighSumException,
Exceptions\TooLongMeasurementUnitException, TooLongItemCodeException,
Exceptions\TooLongUserdataException, TooLongItemNameException,
Exceptions\TooManyException TooLongMeasurementUnitException,
TooLongUserdataException,
TooManyException
}; };
/** /**
@ -153,7 +155,7 @@ class Item extends Entity
* *
* @param string $name Наименование * @param string $name Наименование
* @return $this * @return $this
* @throws TooLongItemNameException Слишком длинное имя/наименование * @throws TooLongItemNameException
* @throws EmptyItemNameException * @throws EmptyItemNameException
*/ */
public function setName(string $name): self public function setName(string $name): self
@ -186,6 +188,7 @@ class Item extends Entity
* @return $this * @return $this
* @throws NegativeItemPriceException * @throws NegativeItemPriceException
* @throws TooHighPriceException * @throws TooHighPriceException
* @throws TooHighSumException
*/ */
public function setPrice(float $rubles): self public function setPrice(float $rubles): self
{ {
@ -217,6 +220,7 @@ class Item extends Entity
* @return $this * @return $this
* @throws TooHighItemQuantityException * @throws TooHighItemQuantityException
* @throws NegativeItemQuantityException * @throws NegativeItemQuantityException
* @throws TooHighSumException
*/ */
public function setQuantity(float $quantity): self public function setQuantity(float $quantity): self
{ {
@ -457,7 +461,7 @@ class Item extends Entity
* *
* @param string|null $user_data Дополнительный реквизит * @param string|null $user_data Дополнительный реквизит
* @return $this * @return $this
* @throws TooLongUserdataException Слишком длинный дополнительный реквизит * @throws TooLongUserdataException
*/ */
public function setUserData(?string $user_data): self public function setUserData(?string $user_data): self
{ {
@ -485,8 +489,9 @@ class Item extends Entity
* @param float|null $excise * @param float|null $excise
* @return Item * @return Item
* @throws NegativeItemExciseException * @throws NegativeItemExciseException
* @throws TooHighSumException
*/ */
public function setExcise(?float $excise): Item public function setExcise(?float $excise): self
{ {
if ($excise < 0) { if ($excise < 0) {
throw new NegativeItemExciseException($this->getName(), $excise); throw new NegativeItemExciseException($this->getName(), $excise);
@ -558,25 +563,6 @@ class Item extends Entity
return $this; return $this;
} }
/**
* Расчитывает стоимость и размер НДС на неё
*
* @return float
* @throws TooHighPriceException Слишком большая сумма
*/
//public function calcSum(): float
//{
// $sum = $this->quantity * $this->price;
// if (rubles($sum) > 42949672.95) {
// throw new TooHighPriceException($sum, 42949672.95);
// }
// $this->sum = $sum;
// if ($this->vat) {
// $this->vat->setSum(rubles($sum));
// }
// return $this->getSum();
//}
/** /**
* @inheritDoc * @inheritDoc
* @throws TooHighSumException * @throws TooHighSumException

View File

@ -11,14 +11,17 @@ declare(strict_types = 1);
namespace AtolOnline\Entities; namespace AtolOnline\Entities;
use AtolOnline\Exceptions\EmptyMonitorDataException; use AtolOnline\Exceptions\{
use AtolOnline\Exceptions\NotEnoughMonitorDataException; EmptyMonitorDataException,
NotEnoughMonitorDataException
};
use DateTime; use DateTime;
use Exception; use Exception;
/** /**
* Класс сущности ККТ, получаемой от монитора * Класс сущности ККТ, получаемой от монитора
* *
* @see https://online.atol.ru/files/API_service_information.pdf Документация, стр 11
* @property string|null serialNumber Заводской номер ККТ * @property string|null serialNumber Заводской номер ККТ
* @property string|null registrationNumber Регистрационный номер машины (РНМ) * @property string|null registrationNumber Регистрационный номер машины (РНМ)
* @property string|null deviceNumber Номер автоматического устройства (внутренний идентификатор устройства) * @property string|null deviceNumber Номер автоматического устройства (внутренний идентификатор устройства)
@ -38,14 +41,13 @@ use Exception;
* @property DateTime|string|null firstUnsetDocTimestamp Дата первого неотправленного документа. Указывается, если * @property DateTime|string|null firstUnsetDocTimestamp Дата первого неотправленного документа. Указывается, если
* есть неотправленные документы. * есть неотправленные документы.
* @property int|null networkErrorCode Код ошибки сети * @property int|null networkErrorCode Код ошибки сети
* @see https://online.atol.ru/files/API_service_information.pdf Документация, стр 11
*/ */
final class Kkt extends Entity final class Kkt extends Entity
{ {
/** /**
* Сопоставление кодов сетевых ошибок ККТ с их описаниями * Сопоставление кодов сетевых ошибок ККТ с их описаниями
*/ */
public const ERROR_CODES = [ public const ERROR_CODES = [
0 => 'Нет ошибок', 0 => 'Нет ошибок',
1 => 'Отсутствует физический канал связи', 1 => 'Отсутствует физический канал связи',
2 => 'Ошибка сетевых настроек или нет соединения с сервером ОФД', 2 => 'Ошибка сетевых настроек или нет соединения с сервером ОФД',
@ -97,7 +99,7 @@ final class Kkt extends Entity
* @throws EmptyMonitorDataException * @throws EmptyMonitorDataException
* @throws NotEnoughMonitorDataException * @throws NotEnoughMonitorDataException
*/ */
public function __construct(protected \stdClass $data) public function __construct(protected object $data)
{ {
if (empty((array)$data)) { if (empty((array)$data)) {
throw new EmptyMonitorDataException(); throw new EmptyMonitorDataException();

View File

@ -11,9 +11,14 @@ declare(strict_types = 1);
namespace AtolOnline\Entities; namespace AtolOnline\Entities;
use AtolOnline\Constants\Constraints; use AtolOnline\Exceptions\{
use AtolOnline\Exceptions\InvalidInnLengthException; InvalidInnLengthException,
use AtolOnline\Exceptions\InvalidPhoneException; InvalidPhoneException
};
use AtolOnline\Traits\{
HasInn,
HasPhones
};
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
/** /**
@ -23,6 +28,8 @@ use Illuminate\Support\Collection;
*/ */
class MoneyTransferOperator extends Entity class MoneyTransferOperator extends Entity
{ {
use HasInn, HasPhones;
/** /**
* @var string|null Наименование (1026) * @var string|null Наименование (1026)
*/ */
@ -111,69 +118,6 @@ class MoneyTransferOperator extends Entity
return $this; return $this;
} }
/**
* Возвращает установленные номера телефонов
*
* @todo вытащить в трейт
* @return Collection
*/
public function getPhones(): Collection
{
return $this->phones;
}
/**
* Устанавливает массив номеров телефонов
*
* @todo вытащить в трейт
* @param array|Collection|null $phones
* @return $this
* @throws InvalidPhoneException
*/
public function setPhones(array|Collection|null $phones): self
{
if (!is_null($phones)) {
$phones = is_array($phones) ? collect($phones) : $phones;
$phones->each(function ($phone) {
$phone = preg_replace('/[^\d]/', '', trim($phone));
if (preg_match(Constraints::PATTERN_PHONE, $phone) != 1) {
throw new InvalidPhoneException($phone);
}
});
}
$this->phones = $phones ?? collect();
return $this;
}
/**
* Возвращает установленный ИНН
*
* @return string|null
*/
public function getInn(): ?string
{
return $this->inn;
}
/**
* Устанавливает ИНН
*
* @param string|null $inn
* @return $this
* @throws InvalidInnLengthException Некорректная длина ИНН
*/
public function setInn(?string $inn): self
{
if (is_string($inn)) {
$inn = preg_replace('/[^\d]/', '', trim($inn));
if (preg_match_all(Constraints::PATTERN_INN, $inn) === 0) {
throw new InvalidInnLengthException($inn);
}
}
$this->inn = $inn ?: null;
return $this;
}
/** /**
* @inheritDoc * @inheritDoc
*/ */

View File

@ -12,8 +12,11 @@ declare(strict_types = 1);
namespace AtolOnline\Entities; namespace AtolOnline\Entities;
use AtolOnline\Constants\Constraints; use AtolOnline\Constants\Constraints;
use AtolOnline\Exceptions\InvalidPhoneException; use AtolOnline\Exceptions\{
use AtolOnline\Exceptions\TooLongPayingAgentOperationException; InvalidPhoneException,
TooLongPayingAgentOperationException
};
use AtolOnline\Traits\HasPhones;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
/** /**
@ -23,16 +26,13 @@ use Illuminate\Support\Collection;
*/ */
class PayingAgent extends Entity class PayingAgent extends Entity
{ {
use HasPhones;
/** /**
* @var string|null Наименование операции (1044) * @var string|null Наименование операции (1044)
*/ */
protected ?string $operation = null; protected ?string $operation = null;
/**
* @var Collection Телефоны платёжного агента (1073)
*/
protected Collection $phones;
/** /**
* Конструктор * Конструктор
* *
@ -78,40 +78,6 @@ class PayingAgent extends Entity
return $this->operation; return $this->operation;
} }
/**
* Устанавливает массив номеров телефонов
*
* @todo вытащить в трейт
* @param array|Collection|null $phones
* @return $this
* @throws InvalidPhoneException
*/
public function setPhones(array|Collection|null $phones): self
{
if (!is_null($phones)) {
$phones = is_array($phones) ? collect($phones) : $phones;
$phones->each(function ($phone) {
$phone = preg_replace('/[^\d]/', '', trim($phone));
if (preg_match(Constraints::PATTERN_PHONE, $phone) != 1) {
throw new InvalidPhoneException($phone);
}
});
}
$this->phones = empty($phones) ? collect() : $phones;
return $this;
}
/**
* Возвращает установленные номера телефонов
*
* @todo вытащить в трейт
* @return Collection
*/
public function getPhones(): Collection
{
return $this->phones;
}
/** /**
* @inheritDoc * @inheritDoc
*/ */

View File

@ -11,8 +11,8 @@ declare(strict_types = 1);
namespace AtolOnline\Entities; namespace AtolOnline\Entities;
use AtolOnline\Constants\Constraints;
use AtolOnline\Exceptions\InvalidPhoneException; use AtolOnline\Exceptions\InvalidPhoneException;
use AtolOnline\Traits\HasPhones;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
/** /**
@ -22,10 +22,7 @@ use Illuminate\Support\Collection;
*/ */
class ReceivePaymentsOperator extends Entity class ReceivePaymentsOperator extends Entity
{ {
/** use HasPhones;
* @var Collection Телефоны оператора по приёму платежей (1074)
*/
protected Collection $phones;
/** /**
* Конструктор * Конструктор
@ -33,46 +30,11 @@ class ReceivePaymentsOperator extends Entity
* @param array|Collection|null $phones Телефоны оператора по приёму платежей (1074) * @param array|Collection|null $phones Телефоны оператора по приёму платежей (1074)
* @throws InvalidPhoneException * @throws InvalidPhoneException
*/ */
public function __construct( public function __construct(array|Collection|null $phones = null)
array|Collection|null $phones = null, {
) {
$this->setPhones($phones); $this->setPhones($phones);
} }
/**
* Возвращает установленные номера телефонов
*
* @todo вытащить в трейт
* @return Collection
*/
public function getPhones(): Collection
{
return $this->phones;
}
/**
* Устанавливает массив номеров телефонов
*
* @todo вытащить в трейт
* @param array|Collection|null $phones
* @return $this
* @throws InvalidPhoneException
*/
public function setPhones(array|Collection|null $phones): self
{
if (!is_null($phones)) {
$phones = is_array($phones) ? collect($phones) : $phones;
$phones->each(function ($phone) {
$phone = preg_replace('/[^\d]/', '', trim($phone));
if (preg_match(Constraints::PATTERN_PHONE, $phone) != 1) {
throw new InvalidPhoneException($phone);
}
});
}
$this->phones = empty($phones) ? collect() : $phones;
return $this;
}
/** /**
* @inheritDoc * @inheritDoc
*/ */

View File

@ -11,9 +11,14 @@ declare(strict_types = 1);
namespace AtolOnline\Entities; namespace AtolOnline\Entities;
use AtolOnline\Constants\Constraints; use AtolOnline\Exceptions\{
use AtolOnline\Exceptions\InvalidInnLengthException; InvalidInnLengthException,
use AtolOnline\Exceptions\InvalidPhoneException; InvalidPhoneException
};
use AtolOnline\Traits\{
HasInn,
HasPhones
};
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
/** /**
@ -23,21 +28,13 @@ use Illuminate\Support\Collection;
*/ */
class Supplier extends Entity class Supplier extends Entity
{ {
use HasPhones, HasInn;
/** /**
* @var string|null Наименование (1225) * @var string|null Наименование (1225)
*/ */
protected ?string $name = null; protected ?string $name = null;
/**
* @var string|null ИНН (1226)
*/
protected ?string $inn = null;
/**
* @var Collection Телефоны (1171)
*/
protected Collection $phones;
/** /**
* Конструктор * Конструктор
* *
@ -80,69 +77,6 @@ class Supplier extends Entity
return $this; return $this;
} }
/**
* Возвращает установленные номера телефонов
*
* @todo вытащить в трейт
* @return Collection
*/
public function getPhones(): Collection
{
return $this->phones;
}
/**
* Устанавливает массив номеров телефонов
*
* @todo вытащить в трейт
* @param array|Collection|null $phones
* @return $this
* @throws InvalidPhoneException
*/
public function setPhones(array|Collection|null $phones): self
{
if (!is_null($phones)) {
$phones = is_array($phones) ? collect($phones) : $phones;
$phones->each(function ($phone) {
$phone = preg_replace('/[^\d]/', '', trim($phone));
if (preg_match(Constraints::PATTERN_PHONE, $phone) != 1) {
throw new InvalidPhoneException($phone);
}
});
}
$this->phones = empty($phones) ? collect() : $phones;
return $this;
}
/**
* Возвращает установленный ИНН
*
* @return string|null
*/
public function getInn(): ?string
{
return $this->inn;
}
/**
* Устанавливает ИНН
*
* @param string|null $inn
* @return $this
* @throws InvalidInnLengthException Некорректная длина ИНН
*/
public function setInn(?string $inn): self
{
if (is_string($inn)) {
$inn = preg_replace('/[^\d]/', '', trim($inn));
if (preg_match_all(Constraints::PATTERN_INN, $inn) === 0) {
throw new InvalidInnLengthException($inn);
}
}
$this->inn = empty($inn) ? null : $inn;
return $this;
}
/** /**
* @inheritDoc * @inheritDoc
*/ */

View File

@ -14,6 +14,10 @@ namespace AtolOnline\Entities;
use AtolOnline\Enums\VatTypes; use AtolOnline\Enums\VatTypes;
use AtolOnline\Exceptions\InvalidEnumValueException; use AtolOnline\Exceptions\InvalidEnumValueException;
use AtolOnline\Helpers; use AtolOnline\Helpers;
use JetBrains\PhpStorm\{
ArrayShape,
Pure
};
/** /**
* Класс, описывающий ставку НДС * Класс, описывающий ставку НДС
@ -37,6 +41,7 @@ class Vat extends Entity
* *
* @param string $type Тип ставки НДС (1199, 1105, 1104, 1103, 1102, 1107, 1106) * @param string $type Тип ставки НДС (1199, 1105, 1104, 1103, 1102, 1107, 1106)
* @param float $rubles Исходная сумма в рублях, от которой нужно расчитать размер НДС * @param float $rubles Исходная сумма в рублях, от которой нужно расчитать размер НДС
* @throws InvalidEnumValueException
*/ */
public function __construct(string $type, float $rubles) public function __construct(string $type, float $rubles)
{ {
@ -99,16 +104,16 @@ class Vat extends Entity
* @see https://glavkniga.ru/situations/k500734 * @see https://glavkniga.ru/situations/k500734
* @see https://www.b-kontur.ru/nds-kalkuljator-online * @see https://www.b-kontur.ru/nds-kalkuljator-online
*/ */
#[Pure]
public function getCalculated(): float public function getCalculated(): float
{ {
$kopeks = Helpers::toKop($this->sum);
return Helpers::toRub(match ($this->getType()) { return Helpers::toRub(match ($this->getType()) {
VatTypes::VAT10 => $kopeks * 10 / 100, VatTypes::VAT10 => Helpers::toKop($this->sum) * 10 / 100,
VatTypes::VAT18 => $kopeks * 18 / 100, VatTypes::VAT18 => Helpers::toKop($this->sum) * 18 / 100,
VatTypes::VAT20 => $kopeks * 20 / 100, VatTypes::VAT20 => Helpers::toKop($this->sum) * 20 / 100,
VatTypes::VAT110 => $kopeks * 10 / 110, VatTypes::VAT110 => Helpers::toKop($this->sum) * 10 / 110,
VatTypes::VAT118 => $kopeks * 18 / 118, VatTypes::VAT118 => Helpers::toKop($this->sum) * 18 / 118,
VatTypes::VAT120 => $kopeks * 20 / 120, VatTypes::VAT120 => Helpers::toKop($this->sum) * 20 / 120,
default => 0, default => 0,
}); });
} }
@ -128,6 +133,8 @@ class Vat extends Entity
/** /**
* @inheritDoc * @inheritDoc
*/ */
#[Pure]
#[ArrayShape(['type' => 'string', 'sum' => 'float'])]
public function jsonSerialize(): array public function jsonSerialize(): array
{ {
return [ return [

57
src/Traits/HasEmail.php Normal file
View File

@ -0,0 +1,57 @@
<?php
/*
* Copyright (c) 2020-2021 Антон Аксенов (Anthony Axenov)
*
* This code is licensed under MIT.
* Этот код распространяется по лицензии MIT.
* https://github.com/anthonyaxenov/atol-online/blob/master/LICENSE
*/
namespace AtolOnline\Traits;
use AtolOnline\Constants\Constraints;
use AtolOnline\Exceptions\InvalidEmailException;
use AtolOnline\Exceptions\TooLongEmailException;
/**
* Трейт для сущностей, которые могут иметь email
*/
trait HasEmail
{
/**
* @var string|null Email (1008, 1117)
*/
protected ?string $email = null;
/**
* Устанавливает email
*
* @param string|null $email
* @return $this
* @throws TooLongEmailException
* @throws InvalidEmailException
*/
public function setEmail(?string $email): static
{
if (is_string($email)) {
$email = preg_replace('/[\n\r\t]/', '', trim($email));
if (mb_strlen($email) > Constraints::MAX_LENGTH_EMAIL) {
throw new TooLongEmailException($email);
} elseif (filter_var($email, FILTER_VALIDATE_EMAIL) === false) {
throw new InvalidEmailException($email);
}
}
$this->email = empty($email) ? null : $email;
return $this;
}
/**
* Возвращает установленный email
*
* @return string|null
*/
public function getEmail(): ?string
{
return $this->email;
}
}

53
src/Traits/HasInn.php Normal file
View File

@ -0,0 +1,53 @@
<?php
/*
* Copyright (c) 2020-2021 Антон Аксенов (Anthony Axenov)
*
* This code is licensed under MIT.
* Этот код распространяется по лицензии MIT.
* https://github.com/anthonyaxenov/atol-online/blob/master/LICENSE
*/
namespace AtolOnline\Traits;
use AtolOnline\Constants\Constraints;
use AtolOnline\Exceptions\InvalidInnLengthException;
/**
* Трейт для сущностей, которые могут иметь ИНН
*/
trait HasInn
{
/**
* @var string|null ИНН (1226, 1228, 1018)
*/
protected ?string $inn = null;
/**
* Устанавливает ИНН
*
* @param string|null $inn
* @return $this
* @throws InvalidInnLengthException
*/
public function setInn(?string $inn): static
{
if (is_string($inn)) {
$inn = preg_replace('/[^\d]/', '', trim($inn));
if (preg_match_all(Constraints::PATTERN_INN, $inn) === 0) {
throw new InvalidInnLengthException($inn);
}
}
$this->inn = empty($inn) ? null : $inn;
return $this;
}
/**
* Возвращает установленный ИНН
*
* @return string|null
*/
public function getInn(): ?string
{
return $this->inn;
}
}

57
src/Traits/HasPhones.php Normal file
View File

@ -0,0 +1,57 @@
<?php
/*
* Copyright (c) 2020-2021 Антон Аксенов (Anthony Axenov)
*
* This code is licensed under MIT.
* Этот код распространяется по лицензии MIT.
* https://github.com/anthonyaxenov/atol-online/blob/master/LICENSE
*/
namespace AtolOnline\Traits;
use AtolOnline\Constants\Constraints;
use AtolOnline\Exceptions\InvalidPhoneException;
use Illuminate\Support\Collection;
/**
* Трейт для сущностей, которые могут иметь массив номеров телефонов
*/
trait HasPhones
{
/**
* @var Collection Телефоны платёжного агента (1073), поставщика (1171), оператора по приёму платежей (1074)
*/
protected Collection $phones;
/**
* Устанавливает массив номеров телефонов
*
* @param array|Collection|null $phones
* @return $this
* @throws InvalidPhoneException
*/
public function setPhones(array|Collection|null $phones): static
{
if (!is_null($phones)) {
$phones = is_array($phones) ? collect($phones) : $phones;
$phones->each(function ($phone) {
$phone = preg_replace('/[^\d]/', '', trim($phone));
if (preg_match(Constraints::PATTERN_PHONE, $phone) != 1) {
throw new InvalidPhoneException($phone);
}
});
}
$this->phones = empty($phones) ? collect() : $phones;
return $this;
}
/**
* Возвращает установленные номера телефонов
*
* @return Collection
*/
public function getPhones(): Collection
{
return $this->phones;
}
}