Compare commits

..

6 Commits

25 changed files with 338 additions and 625 deletions

View File

@ -40,7 +40,7 @@ final class Ffd105Tags
const COMPANY_INN = 1008; const COMPANY_INN = 1008;
/** /**
* Место расчетов * Место расчётов
*/ */
const COMPANY_PADDRESS = 1187; const COMPANY_PADDRESS = 1187;
@ -85,22 +85,65 @@ final class Ffd105Tags
const CASHIER = 1021; const CASHIER = 1021;
/** /**
* Наименование предмета расчета * Наименование предмета расчёта
*/ */
const ITEM_NAME = 1030; const ITEM_NAME = 1030;
/** /**
* Цена за единицу предмета расчета с учетом скидок и наценок * Цена за единицу предмета расчёта с учётом скидок и наценок
*/ */
const ITEM_PRICE = 1079; const ITEM_PRICE = 1079;
/** /**
* Единица измерения предмета расчета * Количество предмета расчёта
*/ */
const ITEM_MEASURE = 1197; const ITEM_QUANTITY = 1023;
/** /**
* Дополнительный реквизит предмета расчета * Стоимость предмета расчёта с учётом скидок и наценок
*/
const ITEM_SUM = 1043;
/**
* Единица измерения предмета расчёта
*/
const ITEM_MEASUREMENT_UNIT = 1197;
/**
* Код товара
*/
const ITEM_NOMENCLATURE_CODE = 1162;
/**
* Признак способа расчёта
*/
const ITEM_PAYMENT_METHOD = 1214;
/**
* Признак предмета расчёта
*/
const ITEM_PAYMENT_OBJECT = 1212;
/**
* Дополнительный реквизит предмета расчёта
*/ */
const ITEM_USERDATA = 1191; const ITEM_USERDATA = 1191;
/**
* Сумма акциза с учётом копеек, включённая в стоимость предмета расчёта
*/
const ITEM_PAYMENT_EXSICE = 1229;
/**
* Цифровой код страны происхождения товара в соответствии с Общероссийским классификатором стран мира
*
* @see https://ru.wikipedia.org/wiki/Общероссийский_классификатор_стран_мира
* @see https://classifikators.ru/oksm
*/
const ITEM_COUNTRY_CODE = 1230;
/**
* Номер таможенной декларации (в соотв. с приказом ФНС России от 24.03.2016 N ММВ-7-15/155)
*/
const DECLARATION_NUMBER = 1231;
} }

View File

@ -56,7 +56,7 @@ class AgentInfo extends Entity
?ReceivePaymentsOperator $receive_payments_operator = null, ?ReceivePaymentsOperator $receive_payments_operator = null,
?MoneyTransferOperator $money_transfer_operator = null, ?MoneyTransferOperator $money_transfer_operator = null,
) { ) {
!is_null($type) && AgentTypes::isValid($type) && $this->setType($type); !is_null($type) && $this->setType($type);
!is_null($paying_agent) && $this->setPayingAgent($paying_agent); !is_null($paying_agent) && $this->setPayingAgent($paying_agent);
!is_null($receive_payments_operator) && $this->setReceivePaymentsOperator($receive_payments_operator); !is_null($receive_payments_operator) && $this->setReceivePaymentsOperator($receive_payments_operator);
!is_null($money_transfer_operator) && $this->setMoneyTransferOperator($money_transfer_operator); !is_null($money_transfer_operator) && $this->setMoneyTransferOperator($money_transfer_operator);
@ -77,10 +77,11 @@ class AgentInfo extends Entity
* *
* @param string|null $type * @param string|null $type
* @return AgentInfo * @return AgentInfo
* @throws InvalidEnumValueException
*/ */
public function setType(?string $type): AgentInfo public function setType(?string $type): AgentInfo
{ {
$this->type = $type; AgentTypes::isValid($type) && $this->type = $type;
return $this; return $this;
} }

View File

@ -49,7 +49,7 @@ class Company extends Entity
protected ?string $payment_address; protected ?string $payment_address;
/** /**
* Company constructor. * Конструктор
* *
* @param string $sno Система налогообложения продавца (1055) * @param string $sno Система налогообложения продавца (1055)
* @param string $inn ИНН (1018) * @param string $inn ИНН (1018)
@ -107,8 +107,6 @@ class Company extends Entity
/** /**
* Возвращает установленный тип налогообложения * Возвращает установленный тип налогообложения
* *
* Тег ФФД - 1055
*
* @return string * @return string
*/ */
public function getSno(): string public function getSno(): string
@ -119,8 +117,6 @@ class Company extends Entity
/** /**
* Устанавливает тип налогообложения * Устанавливает тип налогообложения
* *
* Тег ФФД - 1055
*
* @param string $sno * @param string $sno
* @return $this * @return $this
* @throws InvalidEnumValueException * @throws InvalidEnumValueException
@ -136,8 +132,6 @@ class Company extends Entity
/** /**
* Возвращает установленный ИНН * Возвращает установленный ИНН
* *
* Тег ФФД - 1018
*
* @return string * @return string
*/ */
public function getInn(): string public function getInn(): string
@ -148,8 +142,6 @@ class Company extends Entity
/** /**
* Устанавливает ИНН * Устанавливает ИНН
* *
* Тег ФФД - 1018
*
* @param string $inn * @param string $inn
* @return $this * @return $this
* @throws InvalidInnLengthException * @throws InvalidInnLengthException
@ -167,8 +159,6 @@ class Company extends Entity
/** /**
* Возвращает установленный адрес места расчётов * Возвращает установленный адрес места расчётов
* *
* Тег ФФД - 1187
*
* @return string * @return string
*/ */
public function getPaymentAddress(): string public function getPaymentAddress(): string
@ -179,8 +169,6 @@ class Company extends Entity
/** /**
* Устанавливает адрес места расчётов * Устанавливает адрес места расчётов
* *
* Тег ФФД - 1187
*
* @param string $payment_address * @param string $payment_address
* @return $this * @return $this
* @throws TooLongPaymentAddressException * @throws TooLongPaymentAddressException

View File

@ -22,32 +22,32 @@ use AtolOnline\{
/** /**
* Предмет расчёта (товар, услуга) * Предмет расчёта (товар, услуга)
* *
* @package AtolOnline\Entities * @see https://online.atol.ru/files/API_atol_online_v4.pdf Документация, стр 21-30
*/ */
class Item extends Entity class Item extends Entity
{ {
/** /**
* @var string Наименование. Тег ФФД - 1030. * @var string Наименование (1030)
*/ */
protected string $name; protected string $name;
/** /**
* @var int Цена в копейках (с учётом скидок и наценок). Тег ФФД - 1079. * @var int Цена в копейках (с учётом скидок и наценок) (1079)
*/ */
protected int $price = 0; protected int $price = 0;
/** /**
* @var float Количество, вес. Тег ФФД - 1023. * @var float Количество, вес (1023)
*/ */
protected float $quantity = 0.0; protected float $quantity = 0.0;
/** /**
* @var float Сумма в копейках. Тег ФФД - 1043. * @var float Сумма в копейках (1043)
*/ */
protected float $sum = 0; protected float $sum = 0;
/** /**
* @var string Единица измерения количества. Тег ФФД - 1197. * @var string Единица измерения количества (1197)
*/ */
protected string $measurement_unit; protected string $measurement_unit;
@ -57,17 +57,17 @@ class Item extends Entity
protected ?Vat $vat; protected ?Vat $vat;
/** /**
* @var string Признак способа расчёта. Тег ФФД - 1214. * @var string Признак способа расчёта (1214)
*/ */
protected string $payment_method; protected string $payment_method;
/** /**
* @var string Признак объекта расчёта. Тег ФФД - 1212. * @var string Признак объекта расчёта (1212)
*/ */
protected string $payment_object; protected string $payment_object;
/** /**
* @var string Дополнительный реквизит. Тег ФФД - 1191. * @var string Дополнительный реквизит (1191)
*/ */
protected string $user_data; protected string $user_data;

View File

@ -1,115 +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;
use AtolOnline\Exceptions\TooManyItemsException;
/**
* Класс, описывающий массив предметов расчёта
*
* @package AtolOnline\Entities
*/
class ItemArray extends Entity
{
/**
* Максимальное количество элементов в массиве
* По документации ограничение по количеству предметов расчёта = от 1 до 100,
* однако в схеме sell не указан receipt.properties.items.maxItems
*/
public const MAX_COUNT = 100;
/**
* @var Item[] Массив предметов расчёта
*/
private array $items = [];
/**
* ItemArray constructor.
*
* @param Item[]|null $items Массив предметов расчёта
* @throws TooManyItemsException Слишком много предметов расчёта
*/
public function __construct(?array $items = null)
{
if ($items) {
$this->set($items);
}
}
/**
* Устанавливает массив предметов расчёта
*
* @param Item[] $items Массив предметов расчёта
* @return $this
* @throws TooManyItemsException Слишком много предметов расчёта
*/
public function set(array $items): ItemArray
{
if ($this->validateCount($items)) {
$this->items = $items;
}
return $this;
}
/**
* Добавляет предмет расчёта в массив
*
* @param Item $item Объект предмета расчёта
* @return $this
* @throws TooManyItemsException Слишком много предметов расчёта
*/
public function add(Item $item): ItemArray
{
if ($this->validateCount()) {
$this->items[] = $item;
}
return $this;
}
/**
* Возвращает массив предметов расчёта
*
* @return Item[]
*/
public function get(): array
{
return $this->items;
}
/**
* @inheritDoc
*/
public function jsonSerialize()
{
$result = [];
foreach ($this->get() as $item) {
$result[] = $item->jsonSerialize();
}
return $result;
}
/**
* Проверяет количество предметов расчёта
*
* @param Item[]|null $items Если передать массив, то проверит количество его элементов.
* Иначе проверит количество уже присвоенных элементов.
* @return bool true если всё хорошо, иначе выбрасывает исключение
* @throws TooManyItemsException Слишком много предметов расчёта
*/
protected function validateCount(?array $items = null): bool
{
if ((!empty($items) && count($items) >= self::MAX_COUNT) || count($this->items) >= self::MAX_COUNT) {
throw new TooManyItemsException(count($items), self::MAX_COUNT);
}
return true;
}
}

View File

@ -1,113 +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;
use AtolOnline\Exceptions\TooManyPaymentsException;
/**
* Класс, описывающий массив оплат
*
* @package AtolOnline\Entities
*/
class PaymentArray extends Entity
{
/**
* Максимальное количество элементов массива
*/
public const MAX_COUNT = 10;
/**
* @var Payment[] Массив оплат
*/
private array $payments = [];
/**
* ItemArray constructor.
*
* @param Payment[]|null $payments Массив оплат
* @throws TooManyPaymentsException Слишком много оплат
*/
public function __construct(?array $payments = null)
{
if ($payments) {
$this->set($payments);
}
}
/**
* Устанавливает массив оплат
*
* @param Payment[] $payments
* @return $this
* @throws TooManyPaymentsException Слишком много оплат
*/
public function set(array $payments): PaymentArray
{
if ($this->validateCount($payments)) {
$this->payments = $payments;
}
return $this;
}
/**
* Добавляет новую оплату к заданным
*
* @param Payment $payment Объект оплаты
* @return $this
* @throws TooManyPaymentsException Слишком много оплат
*/
public function add(Payment $payment): PaymentArray
{
if ($this->validateCount()) {
$this->payments[] = $payment;
}
return $this;
}
/**
* Возвращает массив оплат
*
* @return Payment[]
*/
public function get(): array
{
return $this->payments;
}
/**
* @inheritDoc
*/
public function jsonSerialize()
{
$result = [];
foreach ($this->get() as $payment) {
$result[] = $payment->jsonSerialize();
}
return $result;
}
/**
* Проверяет количество налоговых ставок
*
* @param Payment[]|null $payments Если передать массив, то проверит количество его элементов.
* Иначе проверит количество уже присвоенных элементов.
* @return bool true если всё хорошо, иначе выбрасывает исключение
* @throws TooManyPaymentsException Слишком много оплат
*/
protected function validateCount(?array $payments = null): bool
{
if ((!empty($payments) && count($payments) >= self::MAX_COUNT) || count($this->payments) >= self::MAX_COUNT) {
throw new TooManyPaymentsException(count($payments), self::MAX_COUNT);
}
return true;
}
}

View File

@ -12,78 +12,52 @@ declare(strict_types = 1);
namespace AtolOnline\Entities; namespace AtolOnline\Entities;
use AtolOnline\Enums\VatTypes; use AtolOnline\Enums\VatTypes;
use AtolOnline\Helpers;
/** /**
* Класс, описывающий ставку НДС * Класс, описывающий ставку НДС
* *
* @package AtolOnline\Entities * @see https://online.atol.ru/files/API_atol_online_v4.pdf Документация, стр 25, 31
*/ */
class Vat extends Entity class Vat extends Entity
{ {
/** /**
* @var string Выбранный тип ставки НДС. Тег ФФД - 1199, 1105, 1104, 1103, 1102, 1107, 1106. * @var string Тип ставки НДС (1199, 1105, 1104, 1103, 1102, 1107, 1106)
*/ */
private string $type; private string $type;
/** /**
* @var int Сумма в копейках, от которой пересчитывается размер НДС * @var float Сумма в рублях, от которой пересчитывается размер НДС
*/ */
private int $sum_original = 0; private float $sum;
/** /**
* @var int Сумма НДС в копейках * Конструктор
*/
private int $sum_final = 0;
/**
* Vat constructor.
* *
* @param string $type Тип ставки НДС * @param string $type Тип ставки НДС (1199, 1105, 1104, 1103, 1102, 1107, 1106)
* @param float|null $rubles Исходная сумма в рублях, от которой нужно расчитать размер НДС * @param float $rubles Исходная сумма в рублях, от которой нужно расчитать размер НДС
*/ */
public function __construct(string $type = VatTypes::NONE, float $rubles = null) public function __construct(string $type, float $rubles)
{ {
$this->type = $type; $this->setType($type)->setSum($rubles);
if ($rubles) {
$this->setSum($rubles);
}
} }
/** /**
* Устанавливает: * Устанавливает тип ставки НДС
* размер НДС от суммы в копейках * Автоматически пересчитывает итоговый размер НДС от исходной суммы.
* *
* @param string $type Тип ставки НДС * @param string $type Тип ставки НДС
* @param int $kopeks Копейки * @return $this
* @return float|int
* @see https://nalog-nalog.ru/nds/nalogovaya_baza_nds/kak-schitat-nds-pravilno-vychislyaem-20-ot-summy-primer-algoritm/
* @see https://glavkniga.ru/situations/k500734
* @see https://www.b-kontur.ru/nds-kalkuljator-online
*/ */
protected static function calculator(string $type, int $kopeks) public function setType(string $type): self
{ {
switch ($type) { $type = trim($type);
case VatTypes::NONE: VatTypes::isValid($type) && $this->type = $type;
case VatTypes::VAT0: return $this;
return 0;
case VatTypes::VAT10:
//return $kopeks * 10 / 100;
case VatTypes::VAT110:
return $kopeks * 10 / 110;
case VatTypes::VAT18:
//return $kopeks * 18 / 100;
case VatTypes::VAT118:
return $kopeks * 18 / 118;
case VatTypes::VAT20:
//return $kopeks * 20 / 100;
case VatTypes::VAT120:
return $kopeks * 20 / 120;
}
return 0;
} }
/** /**
* Возвращает тип ставки НДС. Тег ФФД - 1199, 1105, 1104, 1103, 1102, 1107, 1106. * Возвращает тип ставки НДС
* *
* @return string * @return string
*/ */
@ -91,45 +65,7 @@ class Vat extends Entity
{ {
return $this->type; return $this->type;
} }
/**
* Устанавливает тип ставки НДС. Тег ФФД - 1199, 1105, 1104, 1103, 1102, 1107, 1106.
* Автоматически пересчитывает итоговый размер НДС от исходной суммы.
*
* @param string $type Тип ставки НДС
* @return $this
*/
public function setType(string $type): Vat
{
$this->type = $type;
$this->setFinal();
return $this;
}
/**
* Возвращает расчитанный итоговый размер ставки НДС в рублях. Тег ФФД - 1200.
*
* @return float
*/
public function getFinalSum(): float
{
return rubles($this->sum_final);
}
/**
* Устанавливает исходную сумму, от которой будет расчитываться итоговый размер НДС.
* Автоматически пересчитывает итоговый размер НДС от исходной суммы.
*
* @param float $rubles Сумма в рублях за предмет расчёта, из которой высчитывается размер НДС
* @return $this
*/
public function setSum(float $rubles): Vat
{
$this->sum_original = kopeks($rubles);
$this->setFinal();
return $this;
}
/** /**
* Возвращает исходную сумму, от которой расчитывается размер налога * Возвращает исходную сумму, от которой расчитывается размер налога
* *
@ -137,52 +73,64 @@ class Vat extends Entity
*/ */
public function getSum(): float public function getSum(): float
{ {
return rubles($this->sum_original); return $this->sum;
} }
/** /**
* Прибавляет указанную сумму к общей исходной сумме. * Устанавливает исходную сумму, от которой будет расчитываться итоговый размер НДС.
* Автоматически пересчитывает итоговый размер НДС от новой исходной суммы. * Автоматически пересчитывает итоговый размер НДС от исходной суммы.
*
* @param float $rubles Сумма в рублях за предмет расчёта, из которой высчитывается размер НДС
* @return $this
*/
public function setSum(float $rubles): self
{
$this->sum = $rubles;
return $this;
}
/**
* Возвращает sdрасчитанный итоговый размер ставки НДС в рублях
*
* @return float
* @see https://nalog-nalog.ru/nds/nalogovaya_baza_nds/kak-schitat-nds-pravilno-vychislyaem-20-ot-summy-primer-algoritm/
* @see https://glavkniga.ru/situations/k500734
* @see https://www.b-kontur.ru/nds-kalkuljator-online
*/
public function getCalculated(): float
{
$kopeks = Helpers::toKop($this->sum);
return Helpers::toRub(match ($this->getType()) {
VatTypes::VAT10 => $kopeks * 10 / 100,
VatTypes::VAT18 => $kopeks * 18 / 100,
VatTypes::VAT20 => $kopeks * 20 / 100,
VatTypes::VAT110 => $kopeks * 10 / 110,
VatTypes::VAT118 => $kopeks * 18 / 118,
VatTypes::VAT120 => $kopeks * 20 / 120,
default => 0,
});
}
/**
* Прибавляет указанную сумму к исходной
* *
* @param float $rubles * @param float $rubles
* @return $this * @return $this
*/ */
public function addSum(float $rubles): Vat public function addSum(float $rubles): self
{ {
$this->sum_original += kopeks($rubles); $this->sum += $rubles;
$this->setFinal();
return $this; return $this;
} }
/**
* Расчитывает и возвращает размер НДС от указанной суммы в рублях.
* Не изменяет итоговый размер НДС.
*
* @param float|null $rubles
* @return float
*/
public function calc(float $rubles): float
{
return rubles(self::calculator($this->type, kopeks($rubles)));
}
/** /**
* @inheritDoc * @inheritDoc
*/ */
public function jsonSerialize() public function jsonSerialize(): array
{ {
return [ return [
'type' => $this->getType(), 'type' => $this->getType(),
'sum' => $this->getFinalSum(), 'sum' => $this->getCalculated(),
]; ];
} }
}
/**
* Расчитывает и устанавливает итоговый размер ставки от исходной суммы в копейках
*/
protected function setFinal(): Vat
{
$this->sum_final = self::calculator($this->type, $this->sum_original);
return $this;
}
}

View File

@ -1,117 +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;
use AtolOnline\Exceptions\TooManyVatsException;
/**
* Класс, описывающий массив ставок НДС
*
* @package AtolOnline\Entities
*/
class VatArray extends Entity
{
/**
* Максимальное количество элементов массива
*/
public const MAX_COUNT = 6;
/**
* @var Vat[] Массив ставок НДС
*/
private array $vats = [];
/**
* VatArray constructor.
*
* @param Vat[]|null $vats Массив ставок НДС
* @throws TooManyVatsException Слишком много ставок НДС
*/
public function __construct(?array $vats = null)
{
if ($vats) {
$this->set($vats);
}
}
/**
* Устанавливает массив ставок НДС
*
* @param Vat[] $vats Массив ставок НДС
* @return $this
* @throws TooManyVatsException Слишком много ставок НДС
*/
public function set(array $vats): VatArray
{
if ($this->validateCount($vats)) {
$this->vats = $vats;
}
return $this;
}
/**
* Добавляет новую ставку НДС в массив
*
* @param Vat $vat Объект ставки НДС
* @return $this
* @throws TooManyVatsException Слишком много ставок НДС
*/
public function add(Vat $vat): VatArray
{
if ($this->validateCount()) {
if (isset($this->vats[$vat->getType()])) {
$this->vats[$vat->getType()]->addSum($vat->getSum());
} else {
$this->vats[$vat->getType()] = $vat;
}
}
return $this;
}
/**
* Возвращает массив ставок НДС
*
* @return Vat[]
*/
public function get(): array
{
return $this->vats;
}
/**
* @inheritDoc
*/
public function jsonSerialize()
{
$result = [];
foreach ($this->get() as $vat) {
$result[] = $vat->jsonSerialize();
}
return $result;
}
/**
* Проверяет количество налоговых ставок
*
* @param Vat[]|null $vats Если передать массив, то проверит количество его элементов.
* Иначе проверит количество уже присвоенных элементов.
* @return bool true если всё хорошо, иначе выбрасывает исключение
* @throws TooManyVatsException Слишком много ставок НДС
*/
protected function validateCount(?array $vats = null): bool
{
if ((!empty($vats) && count($vats) >= self::MAX_COUNT) || count($this->vats) >= self::MAX_COUNT) {
throw new TooManyVatsException(count($vats), self::MAX_COUNT);
}
return true;
}
}

View File

@ -1,23 +0,0 @@
<?php
declare(strict_types = 1);
namespace AtolOnline;
use AtolOnline\Exceptions\InvalidEnumValueException;
/**
* Расширение класса перечисления
*/
class Enum extends \MyCLabs\Enum\Enum
{
/**
* @inheritDoc
* @throws InvalidEnumValueException
*/
public static function isValid($value)
{
return parent::isValid($value)
?: throw new InvalidEnumValueException(static::class, $value);
}
}

View File

@ -11,14 +11,10 @@ declare(strict_types = 1);
namespace AtolOnline\Enums; namespace AtolOnline\Enums;
use AtolOnline\Enum;
/** /**
* Константы, определяющие типы агента * Константы, определяющие типы агента
* *
* Тег ФФД - 1057 * @see https://online.atol.ru/files/API_atol_online_v4.pdf Документация, стр 18
*
* @see https://online.atol.ru/files/API_atol_online_v4.pdf Документация, стр 18 (agent_info)
*/ */
final class AgentTypes extends Enum final class AgentTypes extends Enum
{ {
@ -58,7 +54,7 @@ final class AgentTypes extends Enum
const ANOTHER = 'another'; const ANOTHER = 'another';
/** /**
* @return int[] Возвращает массив тегов ФФД * @inheritDoc
*/ */
public static function getFfdTags(): array public static function getFfdTags(): array
{ {

View File

@ -11,14 +11,10 @@ declare(strict_types = 1);
namespace AtolOnline\Enums; namespace AtolOnline\Enums;
use MyCLabs\Enum\Enum;
/** /**
* Константы, определяющие типы документов коррекции * Константы, определяющие типы документов коррекции
* *
* Тег ФФД - 1173 * @see https://online.atol.ru/files/API_atol_online_v4.pdf Документация, стр 35
*
* @see https://online.atol.ru/files/API_atol_online_v4.pdf Документация, стр 35 (correction_info)
*/ */
final class CorrectionTypes extends Enum final class CorrectionTypes extends Enum
{ {
@ -31,4 +27,12 @@ final class CorrectionTypes extends Enum
* По предписанию * По предписанию
*/ */
const INSTRUCTION = 'instruction'; const INSTRUCTION = 'instruction';
/**
* @inheritDoc
*/
public static function getFfdTags(): array
{
return [1173];
}
} }

View File

@ -11,8 +11,6 @@ declare(strict_types = 1);
namespace AtolOnline\Enums; namespace AtolOnline\Enums;
use MyCLabs\Enum\Enum;
/** /**
* Константы, определяющие типы документов * Константы, определяющие типы документов
*/ */
@ -27,4 +25,12 @@ final class DocumentTypes extends Enum
* Чек коррекции * Чек коррекции
*/ */
const CORRECTION = 'correction'; const CORRECTION = 'correction';
/**
* @inheritDoc
*/
public static function getFfdTags(): array
{
return [];
}
} }

37
src/Enums/Enum.php Normal file
View File

@ -0,0 +1,37 @@
<?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\Enums;
use AtolOnline\Exceptions\InvalidEnumValueException;
/**
* Расширение класса перечисления
*/
abstract class Enum extends \MyCLabs\Enum\Enum
{
/**
* @inheritDoc
* @throws InvalidEnumValueException
*/
public static function isValid($value)
{
return parent::isValid($value)
?: throw new InvalidEnumValueException(static::class, $value);
}
/**
* Возвращает массив тегов ФФД
*
* @return int[]
*/
abstract public static function getFfdTags(): array;
}

View File

@ -11,14 +11,10 @@ declare(strict_types = 1);
namespace AtolOnline\Enums; namespace AtolOnline\Enums;
use MyCLabs\Enum\Enum;
/** /**
* Константы, определяющие признаки способов расчёта * Константы, определяющие признаки способов расчёта
* *
* Тег ФФД - 1214 * @see https://online.atol.ru/files/API_atol_online_v4.pdf Документация, стр 22
*
* @see https://online.atol.ru/files/API_atol_online_v4.pdf Документация, стр 22 (payment_method)
*/ */
final class PaymentMethods extends Enum final class PaymentMethods extends Enum
{ {
@ -56,4 +52,12 @@ final class PaymentMethods extends Enum
* Оплата кредита * Оплата кредита
*/ */
const CREDIT_PAYMENT = 'credit_payment'; const CREDIT_PAYMENT = 'credit_payment';
}
/**
* @inheritDoc
*/
public static function getFfdTags(): array
{
return [1214];
}
}

View File

@ -11,14 +11,10 @@ declare(strict_types = 1);
namespace AtolOnline\Enums; namespace AtolOnline\Enums;
use MyCLabs\Enum\Enum;
/** /**
* Константы, определяющие признаки предметов расчёта * Константы, определяющие признаки предметов расчёта
* *
* Тег ФФД - 1212 * @see https://online.atol.ru/files/API_atol_online_v4.pdf Документация, стр 23
*
* @see https://online.atol.ru/files/API_atol_online_v4.pdf Документация, стр 23 (payment_object)
*/ */
final class PaymentObjects extends Enum final class PaymentObjects extends Enum
{ {
@ -115,7 +111,7 @@ final class PaymentObjects extends Enum
const RESORT_FEE = 'resort_fee'; const RESORT_FEE = 'resort_fee';
/** /**
* Взнос в счёт оплаты пени, штрафе, вознаграждении, бонусе и ином аналогичном предмете расчета * Взнос в счёт оплаты пени, штрафе, вознаграждении, бонусе и ином аналогичном предмете расчёта
*/ */
const AWARD = 'award'; const AWARD = 'award';
@ -158,4 +154,12 @@ final class PaymentObjects extends Enum
* Платёж казино * Платёж казино
*/ */
const CASINO_PAYMENT = 'casino_payment'; const CASINO_PAYMENT = 'casino_payment';
/**
* @inheritDoc
*/
public static function getFfdTags(): array
{
return [1212];
}
} }

View File

@ -11,37 +11,35 @@ declare(strict_types = 1);
namespace AtolOnline\Enums; namespace AtolOnline\Enums;
use MyCLabs\Enum\Enum;
/** /**
* Константы, определяющие виды оплат * Константы, определяющие виды оплат
* *
* Теги ФФД: 1031, 1081, 1215, 1216, 1217 * @see https://online.atol.ru/files/API_atol_online_v4.pdf Документация, стр 35
*/ */
final class PaymentTypes extends Enum final class PaymentTypes extends Enum
{ {
/** /**
* Расчёт наличными. Тег ФФД - 1031. * Расчёт наличными
*/ */
const CASH = 0; const CASH = 0;
/** /**
* Расчёт безналичными. Тег ФФД - 1081. * Расчёт безналичными
*/ */
const ELECTRON = 1; const ELECTRON = 1;
/** /**
* Предварительная оплата (зачёт аванса). Тег ФФД - 1215. * Предварительная оплата (зачёт аванса)
*/ */
const PRE_PAID = 2; const PRE_PAID = 2;
/** /**
* Предварительная оплата (кредит). Тег ФФД - 1216. * Предварительная оплата (кредит)
*/ */
const CREDIT = 3; const CREDIT = 3;
/** /**
* Иная форма оплаты (встречное предоставление). Тег ФФД - 1217. * Иная форма оплаты (встречное предоставление)
*/ */
const OTHER = 4; const OTHER = 4;
@ -74,4 +72,12 @@ final class PaymentTypes extends Enum
* Для каждого фискального типа оплаты можно указать расширенный тип оплаты * Для каждого фискального типа оплаты можно указать расширенный тип оплаты
*/ */
const ADD_9 = 9; const ADD_9 = 9;
/**
* @inheritDoc
*/
public static function getFfdTags(): array
{
return [1031, 1081, 1215, 1216, 1217];
}
} }

View File

@ -11,12 +11,10 @@ declare(strict_types = 1);
namespace AtolOnline\Enums; namespace AtolOnline\Enums;
use AtolOnline\Enum;
/** /**
* Константы, определяющие типы налогообложения * Константы, определяющие типы налогообложения
* *
* Тег ФДД - 1055 * @see https://online.atol.ru/files/API_atol_online_v4.pdf Документация, стр 35
*/ */
final class SnoTypes extends Enum final class SnoTypes extends Enum
{ {
@ -51,10 +49,10 @@ final class SnoTypes extends Enum
const PATENT = 'patent'; const PATENT = 'patent';
/** /**
* @return int[] Возвращает массив тегов ФФД * @inheritDoc
*/ */
public static function getFfdTags(): array public static function getFfdTags(): array
{ {
return [1055]; return [1055];
} }
} }

View File

@ -11,7 +11,7 @@ declare(strict_types = 1);
namespace AtolOnline\Exceptions; namespace AtolOnline\Exceptions;
use AtolOnline\Enum; use AtolOnline\Enums\Enum;
/** /**
* Исключение, возникающее при ошибке валидации типа агента * Исключение, возникающее при ошибке валидации типа агента

View File

@ -21,5 +21,5 @@ class TooLongUnitException extends TooLongException
{ {
protected $message = 'Слишком длинная единица измерения предмета расчёта'; protected $message = 'Слишком длинная единица измерения предмета расчёта';
protected float $max = Constraints::MAX_LENGTH_MEASUREMENT_UNIT; protected float $max = Constraints::MAX_LENGTH_MEASUREMENT_UNIT;
protected array $ffd_tags = [Ffd105Tags::ITEM_MEASURE]; protected array $ffd_tags = [Ffd105Tags::ITEM_MEASUREMENT_UNIT];
} }

View File

@ -17,12 +17,12 @@ final class Helpers
/** /**
* Конвертирует копейки в рубли, оставляя только 2 знака после запятой * Конвертирует копейки в рубли, оставляя только 2 знака после запятой
* *
* @param int|null $kopeks Копейки * @param float|null $kopeks Копейки
* @return float Рубли * @return float Рубли
*/ */
public static function KopToRub(?int $kopeks): float public static function toRub(?float $kopeks): float
{ {
return round(abs((int)$kopeks) / 100, 2); return round(abs((float)$kopeks) / 100, 2);
} }
/** /**
@ -31,7 +31,7 @@ final class Helpers
* @param float|null $rubles Рубли * @param float|null $rubles Рубли
* @return int Копейки * @return int Копейки
*/ */
public static function RubToKop(?float $rubles): int public static function toKop(?float $rubles): int
{ {
return (int)round(abs((float)$rubles) * 100, 2); return (int)round(abs((float)$rubles) * 100, 2);
} }

View File

@ -12,11 +12,11 @@ declare(strict_types = 1);
namespace AtolOnline; namespace AtolOnline;
/** /**
* Константы, определяющие параметры тестовой среды для ФФД 1.05 * Константы, определяющие параметры тестовых сред
* *
* @see https://online.atol.ru/files/ffd/test_sreda.txt Параметры настройки тестовых сред * @see https://online.atol.ru/files/ffd/test_sreda.txt Параметры настройки тестовых сред
*/ */
class TestEnvParams final class TestEnvParams
{ {
/** /**
* Возвращает данные для работы с тестовой средой АТОЛ Онлайн ФФД 1.05 * Возвращает данные для работы с тестовой средой АТОЛ Онлайн ФФД 1.05
@ -55,4 +55,4 @@ class TestEnvParams
'endpoint_ofd' => '', 'endpoint_ofd' => '',
]; ];
} }
} }

View File

@ -32,7 +32,7 @@ class ClientTest extends BasicTestCase
*/ */
public function testConstructorWithoutArgs(): void public function testConstructorWithoutArgs(): void
{ {
$this->assertEquals('[]', (string)(new Client())); $this->assertAtolable(new Client(), []);
} }
/** /**

View File

@ -0,0 +1,101 @@
<?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\Vat,
Enums\VatTypes,
Tests\BasicTestCase
};
/**
* Набор тестов для проверки работы класса ставки НДС
*/
class VatTest extends BasicTestCase
{
/**
* Провайдер данных для тестирования разных типов ставок НДС
*
* @return array
*/
public function providerVatsSet(): array
{
return [
[VatTypes::NONE, 0],
[VatTypes::VAT0, 0],
[VatTypes::VAT10, 10],
[VatTypes::VAT18, 18],
[VatTypes::VAT20, 20],
[VatTypes::VAT110, 9.09],
[VatTypes::VAT118, 15.25],
[VatTypes::VAT120, 16.67],
];
}
/**
* Провайдер данных для тестирования разных типов ставок НДС
*
* @return array
*/
public function providerVatsAdd(): array
{
return [
[VatTypes::VAT10, 12, 10],
[VatTypes::VAT18, 21.6, 18],
[VatTypes::VAT20, 24, 20],
[VatTypes::VAT110, 10.91, 9.09],
[VatTypes::VAT118, 18.31, 15.25],
[VatTypes::VAT120, 20, 16.67],
];
}
/**
* Тестирует конструктор без передачи значений и приведение к json
*
* @param string $type Тип НДС
* @param float $sum Исходная сумма
* @dataProvider providerVatsSet
* @covers \AtolOnline\Entities\Vat
* @covers \AtolOnline\Entities\Vat::setType
* @covers \AtolOnline\Entities\Vat::getType
* @covers \AtolOnline\Entities\Vat::setSum
* @covers \AtolOnline\Entities\Vat::getSum
* @covers \AtolOnline\Entities\Vat::getCalculated
* @covers \AtolOnline\Entities\Vat::jsonSerialize
*/
public function testConstructor(string $type, float $sum): void
{
$vat = new Vat($type, $sum);
$this->assertAtolable($vat, [
'type' => $vat->getType(),
'sum' => $vat->getCalculated(),
]);
$this->assertEquals($type, $vat->getType());
$this->assertEquals($sum, $vat->getSum());
}
/**
* Тестирует расчёт суммы НДС от исходной суммы 100+20р и 100-20р
*
* @dataProvider providerVatsAdd
* @param string $type Тип НДС
* @param float $after_plus Результат после +20р
* @param float $after_minus Результат после -20р
* @covers \AtolOnline\Entities\Vat::addSum
* @covers \AtolOnline\Entities\Vat::getCalculated
*/
public function testVatAdd(string $type, float $after_plus, float $after_minus)
{
$vat = (new Vat($type, 100))->addSum(20); // 120р
$this->assertEquals($after_plus, $vat->getCalculated());
$vat->addSum(-20); // 100р
$this->assertEquals($after_minus, $vat->getCalculated());
}
}

View File

@ -84,11 +84,11 @@ class HelpersTest extends BasicTestCase
* Тестирует перевод копеек в рубли * Тестирует перевод копеек в рубли
* *
* @dataProvider providerKopeksToRubles * @dataProvider providerKopeksToRubles
* @covers \AtolOnline\Helpers::KopToRub * @covers \AtolOnline\Helpers::toRub
*/ */
public function testKopeksToRubles(?int $kopeks, float $rubles): void public function testKopeksToRubles(?int $kopeks, float $rubles): void
{ {
$result = Helpers::KopToRub($kopeks); $result = Helpers::toRub($kopeks);
$this->assertIsFloat($result); $this->assertIsFloat($result);
$this->assertEquals($result, $rubles); $this->assertEquals($result, $rubles);
} }
@ -97,11 +97,11 @@ class HelpersTest extends BasicTestCase
* Тестирует перевод копеек в рубли * Тестирует перевод копеек в рубли
* *
* @dataProvider providerRublesToKopeks * @dataProvider providerRublesToKopeks
* @covers \AtolOnline\Helpers::RubToKop * @covers \AtolOnline\Helpers::toKop
*/ */
public function testRublesToKopeks(?float $rubles, int $kopeks): void public function testRublesToKopeks(?float $rubles, int $kopeks): void
{ {
$result = Helpers::RubToKop($rubles); $result = Helpers::toKop($rubles);
$this->assertIsInt($result); $this->assertIsInt($result);
$this->assertEquals($result, $kopeks); $this->assertEquals($result, $kopeks);
} }

View File

@ -1,55 +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
*/
namespace AtolOnlineTests;
use AtolOnline\{
Entities\Vat,
Enums\VatTypes};
/**
* Class VatTest
*/
class VatTestTodo extends BasicTestCase
{
/**
* Тестирует каждый тип ставки НДС
*
* @dataProvider vatProvider
* @param string $vat_type Тип НДС
* @param float $sum Исходная сумма
* @param float $expected_set Ожидаемый результат после установки суммы
* @param float $expected_add Ожидаемый результат после прибавления 20р
*/
public function testVat(string $vat_type, float $sum, float $expected_set, float $expected_add)
{
$vat = new Vat($vat_type);
$this->assertEquals(0, $vat->getFinalSum(), 'Test ' . $vat_type . ' | 1 step');
$vat->setSum($sum);
$this->assertEquals($expected_set, $vat->getFinalSum(), 'Test ' . $vat_type . ' | 2 step');
$vat->addSum(20);
$this->assertEquals($expected_add, $vat->getFinalSum(), 'Test ' . $vat_type . ' | 3 step');
$vat->addSum(-20);
}
/**
* Провайдер данных для тестирования разных типов ставок НДС
*
* @return array
*/
public function vatProvider()
{
return [
[VatTypes::NONE, 100, 0, 0],
[VatTypes::VAT0, 100, 0, 0],
[VatTypes::VAT10, 100, 9.09, 10.9],
[VatTypes::VAT18, 100, 15.25, 18.3],
];
}
}