mirror of
https://github.com/anthonyaxenov/atol-online.git
synced 2024-11-25 03:34:13 +00:00
Новая сущность AdditionalUserProps
с покрытием для будущей поддержки в документе
This commit is contained in:
parent
557c76fefa
commit
359264db64
@ -128,6 +128,11 @@ final class Constraints
|
|||||||
*/
|
*/
|
||||||
const MAX_COUNT_DOC_VATS = 6;
|
const MAX_COUNT_DOC_VATS = 6;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Максимальная сумма одной оплаты
|
||||||
|
*/
|
||||||
|
const MAX_COUNT_PAYMENT_SUM = 99999.999;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Максимальная длина имени кассира (1021)
|
* Максимальная длина имени кассира (1021)
|
||||||
*
|
*
|
||||||
@ -142,16 +147,25 @@ final class Constraints
|
|||||||
*/
|
*/
|
||||||
const MAX_LENGTH_ITEM_CODE = 32;
|
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 CORRECTION_DATE_FORMAT = 'd.m.Y';
|
||||||
|
|
||||||
/**
|
|
||||||
* Максимальная сумма одной оплаты
|
|
||||||
*/
|
|
||||||
const MAX_COUNT_PAYMENT_SUM = 99999.999;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Регулярное выражение для валидации строки ИНН
|
* Регулярное выражение для валидации строки ИНН
|
||||||
*
|
*
|
||||||
|
@ -226,4 +226,19 @@ final class Ffd105Tags
|
|||||||
* Сумма НДС чека по расч. ставке 20/120
|
* Сумма НДС чека по расч. ставке 20/120
|
||||||
*/
|
*/
|
||||||
const DOC_VAT_TYPE_VAT120 = 1106;
|
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;
|
||||||
}
|
}
|
||||||
|
127
src/Entities/AdditionalUserProps.php
Normal file
127
src/Entities/AdditionalUserProps.php
Normal 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(),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
25
src/Exceptions/EmptyAddUserPropNameException.php
Normal file
25
src/Exceptions/EmptyAddUserPropNameException.php
Normal 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];
|
||||||
|
}
|
25
src/Exceptions/EmptyAddUserPropValueException.php
Normal file
25
src/Exceptions/EmptyAddUserPropValueException.php
Normal 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];
|
||||||
|
}
|
28
src/Exceptions/TooLongAddUserPropNameException.php
Normal file
28
src/Exceptions/TooLongAddUserPropNameException.php
Normal 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];
|
||||||
|
}
|
28
src/Exceptions/TooLongAddUserPropValueException.php
Normal file
28
src/Exceptions/TooLongAddUserPropValueException.php
Normal 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];
|
||||||
|
}
|
@ -41,6 +41,7 @@ final class TestEnvParams
|
|||||||
* Возвращает данные для работы с тестовой средой АТОЛ Онлайн ФФД 1.2
|
* Возвращает данные для работы с тестовой средой АТОЛ Онлайн ФФД 1.2
|
||||||
*
|
*
|
||||||
* @return string[]
|
* @return string[]
|
||||||
|
* @noinspection PhpUnused
|
||||||
*/
|
*/
|
||||||
public static function FFD12(): array
|
public static function FFD12(): array
|
||||||
{
|
{
|
||||||
|
104
tests/AtolOnline/Tests/Entities/AdditionalUserPropsTest.php
Normal file
104
tests/AtolOnline/Tests/Entities/AdditionalUserPropsTest.php
Normal 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', '');
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user