- строгая типизация - переработан класс `TestEnvParams`: - вынесен на уровень выше из под `AtolOnline\Constants` - вместо констант - две функции для получения актуальных параметров подключения по ФФД1.05 и ФФД1.2 - актуализированы `PaymentObjects` согласно #5 - исходники вынесены не уровень выше в `src` - константы теперь enum через `myclabs/php-enum` - новые константы `DocumentTypes` - классы констант финализированы - все исключения переименованы, а многие так или иначе отрефакторены (не полностью) - новые исключения `InvalidSnoException`, `InvalidPaymentAddressException` - `helpers.php` стал полноценным классом `Helpers` - удалены трейты `HasEmail`, `HasInn`, `RublesKopeksConverter` (конвертация перенесена в `Helpers`) - удалён хелпер `valid_strlen()`, вместо него теперь везде `mb_strlen()` - сущности `Client` и `Company` получили свои имплементации для `email` и `inn` - доработки в `BasicTestCase` - полное покрытие тестами: `Client`, `Company`, `Helpers` - поправлен `phpunit.xml` - везде обновлены копирайты - актуализированы и исправлены phpdoc, return types - начато введение `strict_types=1` - минимальный php теперь 8.0 - обновлены все зависимости - подключен пакет коллекций laravel для будущего использования - теперь можно `composer test` и `composer test-cov`
This commit is contained in:
227
src/Entities/Company.php
Normal file
227
src/Entities/Company.php
Normal file
@@ -0,0 +1,227 @@
|
||||
<?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\Entities;
|
||||
|
||||
use AtolOnline\{
|
||||
Constants\Constraints,
|
||||
Constants\SnoTypes,
|
||||
Exceptions\InvalidEmailException,
|
||||
Exceptions\InvalidInnLengthException,
|
||||
Exceptions\InvalidPaymentAddressException,
|
||||
Exceptions\InvalidSnoException,
|
||||
Exceptions\TooLongEmailException,
|
||||
Exceptions\TooLongPaymentAddressException};
|
||||
|
||||
/**
|
||||
* Класс, описывающий сущность компании-продавца
|
||||
*
|
||||
* @package AtolOnline\Entities
|
||||
*/
|
||||
class Company extends Entity
|
||||
{
|
||||
/**
|
||||
* @var string|null Почта. Тег ФФД - 1117.
|
||||
*/
|
||||
protected ?string $email;
|
||||
|
||||
/**
|
||||
* @var string|null Система налогообложения продавца. Тег ФФД - 1055.
|
||||
*/
|
||||
protected ?string $sno;
|
||||
|
||||
/**
|
||||
* @var string|null ИНН. Тег ФФД - 1018.
|
||||
*/
|
||||
protected ?string $inn;
|
||||
|
||||
/**
|
||||
* @var string|null Место расчётов (адрес интернет-магазина). Тег ФФД - 1187.
|
||||
*/
|
||||
protected ?string $payment_address;
|
||||
|
||||
/**
|
||||
* Company constructor.
|
||||
*
|
||||
* @param string $sno
|
||||
* @param string $inn
|
||||
* @param string $payment_address
|
||||
* @param string $email
|
||||
* @throws InvalidEmailException
|
||||
* @throws InvalidInnLengthException
|
||||
* @throws InvalidPaymentAddressException
|
||||
* @throws InvalidSnoException
|
||||
* @throws TooLongEmailException
|
||||
* @throws TooLongPaymentAddressException
|
||||
*/
|
||||
public function __construct(
|
||||
string $email,
|
||||
string $sno,
|
||||
string $inn,
|
||||
string $payment_address,
|
||||
) {
|
||||
$this->setEmail($email);
|
||||
$this->setSno($sno);
|
||||
$this->setInn($inn);
|
||||
$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, Constraints::MAX_LENGTH_EMAIL);
|
||||
} elseif (empty($email) || filter_var($email, FILTER_VALIDATE_EMAIL) === false) {
|
||||
throw new InvalidEmailException($email);
|
||||
}
|
||||
$this->email = $email;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Возвращает установленный тип налогообложения
|
||||
*
|
||||
* Тег ФФД - 1055
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getSno(): string
|
||||
{
|
||||
return $this->sno;
|
||||
}
|
||||
|
||||
/**
|
||||
* Устанавливает тип налогообложения
|
||||
*
|
||||
* Тег ФФД - 1055
|
||||
*
|
||||
* @param string $sno
|
||||
* @return $this
|
||||
* @throws InvalidSnoException
|
||||
*/
|
||||
public function setSno(string $sno): Company
|
||||
{
|
||||
$sno = trim($sno);
|
||||
if (empty($sno) || !in_array($sno, SnoTypes::toArray())) {
|
||||
throw new InvalidSnoException($sno);
|
||||
}
|
||||
$this->sno = $sno;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Возвращает установленный ИНН
|
||||
*
|
||||
* Тег ФФД - 1018
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getInn(): string
|
||||
{
|
||||
return $this->inn;
|
||||
}
|
||||
|
||||
/**
|
||||
* Устанавливает ИНН
|
||||
*
|
||||
* Тег ФФД - 1018
|
||||
*
|
||||
* @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;
|
||||
}
|
||||
|
||||
/**
|
||||
* Возвращает установленный адрес места расчётов
|
||||
*
|
||||
* Тег ФФД - 1187
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getPaymentAddress(): string
|
||||
{
|
||||
return $this->payment_address;
|
||||
}
|
||||
|
||||
/**
|
||||
* Устанавливает адрес места расчётов
|
||||
*
|
||||
* Тег ФФД - 1187
|
||||
*
|
||||
* @param string $payment_address
|
||||
* @return $this
|
||||
* @throws TooLongPaymentAddressException
|
||||
* @throws InvalidPaymentAddressException
|
||||
*/
|
||||
public function setPaymentAddress(string $payment_address): Company
|
||||
{
|
||||
$payment_address = trim($payment_address);
|
||||
if (empty($payment_address)) {
|
||||
throw new InvalidPaymentAddressException();
|
||||
} elseif (mb_strlen($payment_address) > Constraints::MAX_LENGTH_PAYMENT_ADDRESS) {
|
||||
throw new TooLongPaymentAddressException($payment_address, Constraints::MAX_LENGTH_PAYMENT_ADDRESS);
|
||||
}
|
||||
$this->payment_address = $payment_address;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
* @throws InvalidEmailException
|
||||
* @throws InvalidSnoException
|
||||
* @throws InvalidInnLengthException
|
||||
* @throws InvalidPaymentAddressException
|
||||
*/
|
||||
public function jsonSerialize(): object
|
||||
{
|
||||
return (object)[
|
||||
'email' => $this->email
|
||||
? $this->getEmail()
|
||||
: throw new InvalidEmailException(),
|
||||
'sno' => $this->sno
|
||||
? $this->getSno()
|
||||
: throw new InvalidSnoException(),
|
||||
'inn' => $this->inn
|
||||
? $this->getInn()
|
||||
: throw new InvalidInnLengthException(),
|
||||
'payment_address' => $this->payment_address
|
||||
? $this->getPaymentAddress()
|
||||
: throw new InvalidPaymentAddressException(),
|
||||
];
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user