Новая сущность `AdditionalUserProps` с покрытием для будущей поддержки в документе

pull/15/head
Anthony Axenov 2021-12-06 19:21:42 +08:00
parent 557c76fefa
commit 359264db64
9 changed files with 372 additions and 5 deletions

View File

@ -128,6 +128,11 @@ final class Constraints
*/
const MAX_COUNT_DOC_VATS = 6;
/**
* Максимальная сумма одной оплаты
*/
const MAX_COUNT_PAYMENT_SUM = 99999.999;
/**
* Максимальная длина имени кассира (1021)
*
@ -142,16 +147,25 @@ final class Constraints
*/
const MAX_LENGTH_ITEM_CODE = 32;
/**
* Максимальная длина наименования дополнительного реквизита (1085)
*
* @see https://online.atol.ru/files/API_atol_online_v4.pdf Документация, стр 32
*/
const MAX_LENGTH_ADD_USER_PROP_NAME = 64;
/**
* Максимальная длина значения дополнительного реквизита (1086)
*
* @see https://online.atol.ru/files/API_atol_online_v4.pdf Документация, стр 32
*/
const MAX_LENGTH_ADD_USER_PROP_VALUE = 256;
/**
* Формат даты документа коррекции
*/
const CORRECTION_DATE_FORMAT = 'd.m.Y';
/**
* Максимальная сумма одной оплаты
*/
const MAX_COUNT_PAYMENT_SUM = 99999.999;
/**
* Регулярное выражение для валидации строки ИНН
*

View File

@ -226,4 +226,19 @@ final class Ffd105Tags
* Сумма НДС чека по расч. ставке 20/120
*/
const DOC_VAT_TYPE_VAT120 = 1106;
/**
* Дополнительный реквизит пользователя
*/
const DOC_ADD_USER_PROP = 1084;
/**
* Наименование дополнительного реквизита пользователя
*/
const DOC_ADD_USER_PROP_NAME = 1085;
/**
* Значение дополнительного реквизита пользователя
*/
const DOC_ADD_USER_PROP_VALUE = 1086;
}

View File

@ -0,0 +1,127 @@
<?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;
use AtolOnline\Exceptions\{
EmptyAddUserPropNameException,
EmptyAddUserPropValueException,
TooLongAddUserPropNameException,
TooLongAddUserPropValueException};
use JetBrains\PhpStorm\Pure;
/**
* Класс, описывающий дополнительный реквизит
*
* @see https://online.atol.ru/files/API_atol_online_v4.pdf Документация, стр 32
*/
final class AdditionalUserProps extends Entity
{
/**
* @var string Наименование (1085)
*/
protected string $name;
/**
* @var string Значение (1086)
*/
protected string $value;
/**
* Конструктор объекта покупателя
*
* @param string $name Наименование (1227)
* @param string $value Значение (1008)
* @throws EmptyAddUserPropNameException
* @throws EmptyAddUserPropValueException
* @throws TooLongAddUserPropNameException
* @throws TooLongAddUserPropValueException
*/
public function __construct(string $name, string $value)
{
$this->setName($name)->setValue($value);
}
/**
* Возвращает наименование реквизита
*
* @return string
*/
public function getName(): string
{
return $this->name;
}
/**
* Устанавливает наименование реквизита
*
* @param string $name
* @return $this
* @throws TooLongAddUserPropNameException
* @throws EmptyAddUserPropNameException
*/
public function setName(string $name): self
{
$name = trim($name);
if (mb_strlen($name) > Constraints::MAX_LENGTH_ADD_USER_PROP_NAME) {
throw new TooLongAddUserPropNameException($name);
}
if (empty($name)) {
throw new EmptyAddUserPropNameException($name);
}
$this->name = $name;
return $this;
}
/**
* Возвращает установленный телефон
*
* @return string|null
*/
public function getValue(): ?string
{
return $this->value;
}
/**
* Устанавливает значение реквизита
*
* @param string $value
* @return $this
* @throws TooLongAddUserPropValueException
* @throws EmptyAddUserPropValueException
*/
public function setValue(string $value): self
{
$value = trim($value);
if (mb_strlen($value) > Constraints::MAX_LENGTH_CLIENT_NAME) {
throw new TooLongAddUserPropValueException($value);
}
if (empty($value)) {
throw new EmptyAddUserPropValueException($value);
}
$this->value = $value;
return $this;
}
/**
* @inheritDoc
*/
#[Pure]
public function jsonSerialize(): array
{
return [
'name' => $this->getName(),
'value' => $this->getValue(),
];
}
}

View File

@ -0,0 +1,25 @@
<?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\Ffd105Tags;
/**
* Исключение, возникающее при пустом наименовании дополнительного реквизита
*
* @see https://online.atol.ru/files/API_atol_online_v4.pdf Документация, стр 32
*/
class EmptyAddUserPropNameException extends AtolException
{
protected $message = 'Наименование дополнительного реквизита не может быть пустым';
protected array $ffd_tags = [Ffd105Tags::DOC_ADD_USER_PROP_NAME];
}

View File

@ -0,0 +1,25 @@
<?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\Ffd105Tags;
/**
* Исключение, возникающее при пустом наименовании дополнительного реквизита
*
* @see https://online.atol.ru/files/API_atol_online_v4.pdf Документация, стр 32
*/
class EmptyAddUserPropValueException extends AtolException
{
protected $message = 'Значение дополнительного реквизита не может быть пустым';
protected array $ffd_tags = [Ffd105Tags::DOC_ADD_USER_PROP_NAME];
}

View File

@ -0,0 +1,28 @@
<?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,
Ffd105Tags};
/**
* Исключение, возникающее при попытке указать слишком длинное наименование дополнительного реквизита
*
* @see https://online.atol.ru/files/API_atol_online_v4.pdf Документация, стр 32
*/
class TooLongAddUserPropNameException extends TooLongException
{
protected $message = 'Слишком длинное наименование дополнительного реквизита';
protected float $max = Constraints::MAX_LENGTH_ADD_USER_PROP_NAME;
protected array $ffd_tags = [Ffd105Tags::DOC_ADD_USER_PROP_NAME];
}

View File

@ -0,0 +1,28 @@
<?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,
Ffd105Tags};
/**
* Исключение, возникающее при попытке указать слишком длинное значение дополнительного реквизита
*
* @see https://online.atol.ru/files/API_atol_online_v4.pdf Документация, стр 32
*/
class TooLongAddUserPropValueException extends TooLongException
{
protected $message = 'Слишком длинное значение дополнительного реквизита';
protected float $max = Constraints::MAX_LENGTH_ADD_USER_PROP_VALUE;
protected array $ffd_tags = [Ffd105Tags::DOC_ADD_USER_PROP_VALUE];
}

View File

@ -41,6 +41,7 @@ final class TestEnvParams
* Возвращает данные для работы с тестовой средой АТОЛ Онлайн ФФД 1.2
*
* @return string[]
* @noinspection PhpUnused
*/
public static function FFD12(): array
{

View File

@ -0,0 +1,104 @@
<?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\Tests\Entities;
use AtolOnline\{
Constants\Constraints,
Entities\AdditionalUserProps,
Exceptions\EmptyAddUserPropNameException,
Exceptions\EmptyAddUserPropValueException,
Exceptions\TooLongAddUserPropNameException,
Exceptions\TooLongAddUserPropValueException,
Helpers,
Tests\BasicTestCase};
use Exception;
/**
* Набор тестов для проверки работы класса ставки дополнительного реквизита
*/
class AdditionalUserPropsTest extends BasicTestCase
{
/**
* Тестирует конструктор
*
* @covers \AtolOnline\Entities\AdditionalUserProps
* @covers \AtolOnline\Entities\AdditionalUserProps::getName
* @covers \AtolOnline\Entities\AdditionalUserProps::setName
* @covers \AtolOnline\Entities\AdditionalUserProps::setValue
* @covers \AtolOnline\Entities\AdditionalUserProps::getValue
* @covers \AtolOnline\Entities\AdditionalUserProps::jsonSerialize
* @throws Exception
*/
public function testConstructor(): void
{
$this->assertAtolable(
new AdditionalUserProps('name', 'value'),
[
'name' => 'name',
'value' => 'value',
]
);
}
/**
* Тестирует выброс исключения при слишком длинном наименовании
*
* @covers \AtolOnline\Entities\AdditionalUserProps::setName
* @covers \AtolOnline\Exceptions\TooLongAddUserPropNameException
* @throws EmptyAddUserPropNameException
* @throws EmptyAddUserPropValueException
* @throws TooLongAddUserPropValueException
*/
public function testTooLongAddCheckPropNameException(): void
{
$this->expectException(TooLongAddUserPropNameException::class);
new AdditionalUserProps(Helpers::randomStr(Constraints::MAX_LENGTH_ADD_USER_PROP_NAME + 1), 'value');
}
/**
* Тестирует выброс исключения при пустом наименовании
*
* @covers \AtolOnline\Entities\AdditionalUserProps::setName
* @covers \AtolOnline\Exceptions\EmptyAddUserPropNameException
*/
public function testEmptyAddCheckPropNameException(): void
{
$this->expectException(EmptyAddUserPropNameException::class);
new AdditionalUserProps('', 'value');
}
/**
* Тестирует выброс исключения при слишком длинном значении
*
* @covers \AtolOnline\Entities\AdditionalUserProps::setValue
* @covers \AtolOnline\Exceptions\TooLongAddUserPropValueException
* @throws EmptyAddUserPropNameException
* @throws EmptyAddUserPropValueException
* @throws TooLongAddUserPropValueException
* @throws TooLongAddUserPropNameException
*/
public function testTooLongAddCheckPropValueException(): void
{
$this->expectException(TooLongAddUserPropValueException::class);
new AdditionalUserProps('name', Helpers::randomStr(Constraints::MAX_LENGTH_ADD_USER_PROP_VALUE + 1));
}
/**
* Тестирует выброс исключения при пустом значении
*
* @covers \AtolOnline\Entities\AdditionalUserProps::setValue
* @covers \AtolOnline\Exceptions\EmptyAddUserPropValueException
*/
public function testEmptyAddCheckPropValueException(): void
{
$this->expectException(EmptyAddUserPropValueException::class);
new AdditionalUserProps('name', '');
}
}