mirror of
https://github.com/anthonyaxenov/atol-online.git
synced 2024-11-25 02:24:11 +00:00
Поддержка correction_info
This commit is contained in:
parent
05fd25e810
commit
d533164d1b
@ -142,6 +142,11 @@ final class Constraints
|
|||||||
*/
|
*/
|
||||||
const MAX_LENGTH_ITEM_CODE = 32;
|
const MAX_LENGTH_ITEM_CODE = 32;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Формат даты документа коррекции
|
||||||
|
*/
|
||||||
|
const CORRECTION_DATE_FORMAT = 'd.m.Y';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Регулярное выражение для валидации строки ИНН
|
* Регулярное выражение для валидации строки ИНН
|
||||||
*
|
*
|
||||||
|
@ -162,6 +162,11 @@ final class Ffd105Tags
|
|||||||
*/
|
*/
|
||||||
const CORRECTION_TYPE = 1173;
|
const CORRECTION_TYPE = 1173;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Дата документа основания для коррекции
|
||||||
|
*/
|
||||||
|
const CORRECTION_DATE = 1178;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Сумма по чеку (БСО) наличными
|
* Сумма по чеку (БСО) наличными
|
||||||
*/
|
*/
|
||||||
|
@ -66,10 +66,7 @@ final class Company extends Entity
|
|||||||
string $inn,
|
string $inn,
|
||||||
string $payment_address,
|
string $payment_address,
|
||||||
) {
|
) {
|
||||||
$this->setEmail($email);
|
$this->setEmail($email)->setSno($sno)->setInn($inn)->setPaymentAddress($payment_address);
|
||||||
$this->setSno($sno);
|
|
||||||
$this->setInn($inn);
|
|
||||||
$this->setPaymentAddress($payment_address);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -92,8 +89,7 @@ final class Company extends Entity
|
|||||||
public function setSno(string $sno): self
|
public function setSno(string $sno): self
|
||||||
{
|
{
|
||||||
$sno = trim($sno);
|
$sno = trim($sno);
|
||||||
SnoTypes::isValid($sno);
|
SnoTypes::isValid($sno) && $this->sno = $sno;
|
||||||
$this->sno = $sno;
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
157
src/Entities/CorrectionInfo.php
Normal file
157
src/Entities/CorrectionInfo.php
Normal file
@ -0,0 +1,157 @@
|
|||||||
|
<?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\Enums\CorrectionTypes;
|
||||||
|
use AtolOnline\Exceptions\{
|
||||||
|
EmptyCorrectionNumberException,
|
||||||
|
InvalidCorrectionDateException,
|
||||||
|
InvalidEnumValueException
|
||||||
|
};
|
||||||
|
use DateTime;
|
||||||
|
use Exception;
|
||||||
|
use JetBrains\PhpStorm\{
|
||||||
|
ArrayShape,
|
||||||
|
Pure
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Класс, описывающий данные коррекции
|
||||||
|
*
|
||||||
|
* @see https://online.atol.ru/files/API_atol_online_v4.pdf Документация, стр 35
|
||||||
|
*/
|
||||||
|
class CorrectionInfo extends Entity
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @var string|null Тип коррекции (1173)
|
||||||
|
*/
|
||||||
|
protected ?string $type = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var string|null Дата документа основания для коррекции (1178)
|
||||||
|
*/
|
||||||
|
protected ?string $date = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var string|null Номер документа основания для коррекции (1179)
|
||||||
|
*/
|
||||||
|
protected ?string $number = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Конструктор
|
||||||
|
*
|
||||||
|
* @param string $type Тип коррекции
|
||||||
|
* @param string $date Дата документа
|
||||||
|
* @param string $number Номер документа
|
||||||
|
* @throws InvalidEnumValueException
|
||||||
|
* @throws InvalidCorrectionDateException
|
||||||
|
* @throws EmptyCorrectionNumberException
|
||||||
|
*/
|
||||||
|
public function __construct(string $type, string $date, string $number)
|
||||||
|
{
|
||||||
|
$this->setType($type)->setDate($date)->setNumber($number);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Возвращает тип коррекции
|
||||||
|
*
|
||||||
|
* @return string|null
|
||||||
|
*/
|
||||||
|
public function getType(): ?string
|
||||||
|
{
|
||||||
|
return $this->type;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Устанавливает тип коррекции
|
||||||
|
*
|
||||||
|
* @param string $type
|
||||||
|
* @return $this
|
||||||
|
* @throws InvalidEnumValueException
|
||||||
|
*/
|
||||||
|
public function setType(string $type): self
|
||||||
|
{
|
||||||
|
$type = trim($type);
|
||||||
|
CorrectionTypes::isValid($type) && $this->type = $type;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Возвращает дату документа основания для коррекции
|
||||||
|
*
|
||||||
|
* @return string|null
|
||||||
|
*/
|
||||||
|
public function getDate(): ?string
|
||||||
|
{
|
||||||
|
return $this->date;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Устанавливает дату документа основания для коррекции
|
||||||
|
*
|
||||||
|
* @param DateTime|string $date Строковая дата в формате d.m.Y либо объект DateTime с датой
|
||||||
|
* @return $this
|
||||||
|
* @throws InvalidCorrectionDateException
|
||||||
|
*/
|
||||||
|
public function setDate(DateTime|string $date): self
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
if (is_string($date)) {
|
||||||
|
$date = new DateTime(trim($date));
|
||||||
|
}
|
||||||
|
$this->date = $date->format(Constraints::CORRECTION_DATE_FORMAT);
|
||||||
|
} catch (Exception $e) {
|
||||||
|
throw new InvalidCorrectionDateException($date, $e->getMessage());
|
||||||
|
}
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Возвращает установленный номер документа основания для коррекции
|
||||||
|
*
|
||||||
|
* @return string|null
|
||||||
|
*/
|
||||||
|
public function getNumber(): ?string
|
||||||
|
{
|
||||||
|
return $this->number;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Устанавливает номер документа основания для коррекции
|
||||||
|
*
|
||||||
|
* @param string $number
|
||||||
|
* @return $this
|
||||||
|
* @throws EmptyCorrectionNumberException
|
||||||
|
*/
|
||||||
|
public function setNumber(string $number): self
|
||||||
|
{
|
||||||
|
$number = trim($number);
|
||||||
|
empty($number) && throw new EmptyCorrectionNumberException();
|
||||||
|
$this->number = $number;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @inheritDoc
|
||||||
|
*/
|
||||||
|
#[Pure]
|
||||||
|
#[ArrayShape(['type' => 'string', 'base_date' => 'string', 'base_number' => 'string'])]
|
||||||
|
public function jsonSerialize(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'type' => $this->getType(),
|
||||||
|
'base_date' => $this->getDate(),
|
||||||
|
'base_number' => $this->getNumber(),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
@ -1,134 +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\Entities;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Класс todoCorrectionInfo, описывающий данные чек коррекции
|
|
||||||
*/
|
|
||||||
class todoCorrectionInfo extends Entity
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* @var string Тип коррекции. Тег ФФД - 1173.
|
|
||||||
*/
|
|
||||||
protected string $type;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var string Дата документа основания для коррекции. Тег ФФД - 1178.
|
|
||||||
*/
|
|
||||||
protected string $base_date;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var string Номер документа основания для коррекции. Тег ФФД - 1179.
|
|
||||||
*/
|
|
||||||
protected string $base_number;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* todoCorrectionInfo constructor.
|
|
||||||
*
|
|
||||||
* @param string|null $type Тип коррекции
|
|
||||||
* @param string|null $base_date Дата документа
|
|
||||||
* @param string|null $base_number Номер документа
|
|
||||||
*/
|
|
||||||
public function __construct(
|
|
||||||
?string $type = null,
|
|
||||||
?string $base_date = null,
|
|
||||||
?string $base_number = null
|
|
||||||
) {
|
|
||||||
$type && $this->setType($type);
|
|
||||||
$base_date && $this->setDate($base_date);
|
|
||||||
$base_number && $this->setNumber($base_number);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Возвращает номер документа основания для коррекции.
|
|
||||||
* Тег ФФД - 1179.
|
|
||||||
*
|
|
||||||
* @return string|null
|
|
||||||
*/
|
|
||||||
public function getNumber(): ?string
|
|
||||||
{
|
|
||||||
return $this->base_number;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Устанавливает номер документа основания для коррекции.
|
|
||||||
* Тег ФФД - 1179.
|
|
||||||
*
|
|
||||||
* @param string $number
|
|
||||||
* @return $this
|
|
||||||
*/
|
|
||||||
public function setNumber(string $number): todoCorrectionInfo
|
|
||||||
{
|
|
||||||
$this->base_number = trim($number);
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Возвращает дату документа основания для коррекции.
|
|
||||||
* Тег ФФД - 1178.
|
|
||||||
*
|
|
||||||
* @return string|null
|
|
||||||
*/
|
|
||||||
public function getDate(): ?string
|
|
||||||
{
|
|
||||||
return $this->base_date;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Устанавливает дату документа основания для коррекции.
|
|
||||||
* Тег ФФД - 1178.
|
|
||||||
*
|
|
||||||
* @param string $date Строка в формате d.m.Y
|
|
||||||
* @return $this
|
|
||||||
*/
|
|
||||||
public function setDate(string $date): todoCorrectionInfo
|
|
||||||
{
|
|
||||||
$this->base_date = $date;
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Возвращает тип коррекции.
|
|
||||||
* Тег ФФД - 1173.
|
|
||||||
*
|
|
||||||
* @return string|null
|
|
||||||
*/
|
|
||||||
public function getType(): ?string
|
|
||||||
{
|
|
||||||
return $this->type;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Устанавливает тип коррекции.
|
|
||||||
* Тег ФФД - 1173.
|
|
||||||
*
|
|
||||||
* @param string $type
|
|
||||||
* @return $this
|
|
||||||
*/
|
|
||||||
public function setType(string $type): todoCorrectionInfo
|
|
||||||
{
|
|
||||||
$this->type = $type;
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @inheritDoc
|
|
||||||
*/
|
|
||||||
public function jsonSerialize(): array
|
|
||||||
{
|
|
||||||
return [
|
|
||||||
'type' => $this->getType() ?? '',
|
|
||||||
'base_date' => $this->getDate() ?? '',
|
|
||||||
'base_number' => $this->getNumber() ?? '',
|
|
||||||
];
|
|
||||||
}
|
|
||||||
}
|
|
@ -24,8 +24,7 @@ abstract class Enum extends \MyCLabs\Enum\Enum
|
|||||||
*/
|
*/
|
||||||
public static function isValid($value)
|
public static function isValid($value)
|
||||||
{
|
{
|
||||||
return parent::isValid($value)
|
return parent::isValid($value) ?: throw new InvalidEnumValueException(static::class, $value);
|
||||||
?: throw new InvalidEnumValueException(static::class, $value);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
23
src/Exceptions/EmptyCorrectionNumberException.php
Normal file
23
src/Exceptions/EmptyCorrectionNumberException.php
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
<?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;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Исключение, возникающее при пустом номере документа коррекции
|
||||||
|
*/
|
||||||
|
class EmptyCorrectionNumberException extends AtolException
|
||||||
|
{
|
||||||
|
protected $message = 'Номер документа коррекции не может быть пустым';
|
||||||
|
protected array $ffd_tags = [Ffd105Tags::CORRECTION_DATE];
|
||||||
|
}
|
33
src/Exceptions/InvalidCorrectionDateException.php
Normal file
33
src/Exceptions/InvalidCorrectionDateException.php
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
<?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;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Исключение, возникающее при попытке указать некорректную дату коррекции
|
||||||
|
*/
|
||||||
|
class InvalidCorrectionDateException extends AtolException
|
||||||
|
{
|
||||||
|
protected array $ffd_tags = [Ffd105Tags::CORRECTION_DATE];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Конструктор
|
||||||
|
*
|
||||||
|
* @param string $date
|
||||||
|
* @param string $message
|
||||||
|
*/
|
||||||
|
public function __construct(string $date = '', string $message = '')
|
||||||
|
{
|
||||||
|
parent::__construct("Ошибка даты документа коррекции '$date': " . $message);
|
||||||
|
}
|
||||||
|
}
|
106
tests/AtolOnline/Tests/Entities/CorrectionInfoTest.php
Normal file
106
tests/AtolOnline/Tests/Entities/CorrectionInfoTest.php
Normal file
@ -0,0 +1,106 @@
|
|||||||
|
<?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\{
|
||||||
|
Entities\CorrectionInfo,
|
||||||
|
Enums\CorrectionTypes,
|
||||||
|
Exceptions\EmptyCorrectionNumberException,
|
||||||
|
Exceptions\InvalidCorrectionDateException,
|
||||||
|
Exceptions\InvalidEnumValueException,
|
||||||
|
Helpers,
|
||||||
|
Tests\BasicTestCase
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Набор тестов для проверки работы класса данных коррекции
|
||||||
|
*/
|
||||||
|
class CorrectionInfoTest extends BasicTestCase
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Тестирует конструктор
|
||||||
|
*
|
||||||
|
* @covers \AtolOnline\Entities\CorrectionInfo
|
||||||
|
* @covers \AtolOnline\Entities\CorrectionInfo::setType
|
||||||
|
* @covers \AtolOnline\Entities\CorrectionInfo::getType
|
||||||
|
* @covers \AtolOnline\Entities\CorrectionInfo::setDate
|
||||||
|
* @covers \AtolOnline\Entities\CorrectionInfo::getDate
|
||||||
|
* @covers \AtolOnline\Entities\CorrectionInfo::setNumber
|
||||||
|
* @covers \AtolOnline\Entities\CorrectionInfo::getNumber
|
||||||
|
* @covers \AtolOnline\Entities\CorrectionInfo::jsonSerialize
|
||||||
|
* @return void
|
||||||
|
* @throws InvalidEnumValueException
|
||||||
|
* @throws InvalidCorrectionDateException
|
||||||
|
* @throws EmptyCorrectionNumberException
|
||||||
|
*/
|
||||||
|
public function testConstructor(): void
|
||||||
|
{
|
||||||
|
$this->assertAtolable(
|
||||||
|
new CorrectionInfo(CorrectionTypes::SELF, '01.01.2021', $number = Helpers::randomStr()),
|
||||||
|
[
|
||||||
|
'type' => CorrectionTypes::SELF,
|
||||||
|
'base_date' => '01.01.2021',
|
||||||
|
'base_number' => $number,
|
||||||
|
]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Тестирует исключение при некорректном типе
|
||||||
|
*
|
||||||
|
* @covers \AtolOnline\Entities\CorrectionInfo
|
||||||
|
* @covers \AtolOnline\Entities\CorrectionInfo::setType
|
||||||
|
* @covers \AtolOnline\Enums\CorrectionTypes::isValid
|
||||||
|
* @covers \AtolOnline\Exceptions\InvalidEnumValueException
|
||||||
|
* @return void
|
||||||
|
* @throws EmptyCorrectionNumberException
|
||||||
|
* @throws InvalidCorrectionDateException
|
||||||
|
* @throws InvalidEnumValueException
|
||||||
|
*/
|
||||||
|
public function testInvalidEnumValueException(): void
|
||||||
|
{
|
||||||
|
$this->expectException(InvalidEnumValueException::class);
|
||||||
|
$this->expectExceptionMessage('Некорректное значение AtolOnline\Enums\CorrectionTypes::wrong_value');
|
||||||
|
new CorrectionInfo('wrong_value', '01.01.2021', Helpers::randomStr());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Тестирует исключение при некорректной дате
|
||||||
|
*
|
||||||
|
* @covers \AtolOnline\Entities\CorrectionInfo
|
||||||
|
* @covers \AtolOnline\Entities\CorrectionInfo::setDate
|
||||||
|
* @covers \AtolOnline\Enums\CorrectionTypes::isValid
|
||||||
|
* @covers \AtolOnline\Exceptions\InvalidCorrectionDateException
|
||||||
|
* @return void
|
||||||
|
* @throws EmptyCorrectionNumberException
|
||||||
|
* @throws InvalidCorrectionDateException
|
||||||
|
* @throws InvalidEnumValueException
|
||||||
|
*/
|
||||||
|
public function testInvalidCorrectionDateException(): void
|
||||||
|
{
|
||||||
|
$this->expectException(InvalidCorrectionDateException::class);
|
||||||
|
new CorrectionInfo(CorrectionTypes::SELF, Helpers::randomStr(), Helpers::randomStr());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Тестирует исключение при некорректной дате
|
||||||
|
*
|
||||||
|
* @covers \AtolOnline\Entities\CorrectionInfo
|
||||||
|
* @covers \AtolOnline\Entities\CorrectionInfo::setNumber
|
||||||
|
* @covers \AtolOnline\Enums\CorrectionTypes::isValid
|
||||||
|
* @covers \AtolOnline\Exceptions\EmptyCorrectionNumberException
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testEmptyCorrectionNumberException(): void
|
||||||
|
{
|
||||||
|
$this->expectException(EmptyCorrectionNumberException::class);
|
||||||
|
new CorrectionInfo(CorrectionTypes::SELF, '01.01.2021', "\n\r\t\0");
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user