mirror of
https://github.com/anthonyaxenov/atol-online.git
synced 2024-11-26 09:54:15 +00:00
Compare commits
No commits in common. "a7205ff75473fd55b26f58d4f54f9008931b0964" and "f5480328436dcf2d859a43549232c51bdfd5d710" have entirely different histories.
a7205ff754
...
f548032843
@ -40,7 +40,7 @@ final class Ffd105Tags
|
||||
const COMPANY_INN = 1008;
|
||||
|
||||
/**
|
||||
* Место расчётов
|
||||
* Место расчетов
|
||||
*/
|
||||
const COMPANY_PADDRESS = 1187;
|
||||
|
||||
@ -85,65 +85,22 @@ final class Ffd105Tags
|
||||
const CASHIER = 1021;
|
||||
|
||||
/**
|
||||
* Наименование предмета расчёта
|
||||
* Наименование предмета расчета
|
||||
*/
|
||||
const ITEM_NAME = 1030;
|
||||
|
||||
/**
|
||||
* Цена за единицу предмета расчёта с учётом скидок и наценок
|
||||
* Цена за единицу предмета расчета с учетом скидок и наценок
|
||||
*/
|
||||
const ITEM_PRICE = 1079;
|
||||
|
||||
/**
|
||||
* Количество предмета расчёта
|
||||
* Единица измерения предмета расчета
|
||||
*/
|
||||
const ITEM_QUANTITY = 1023;
|
||||
const ITEM_MEASURE = 1197;
|
||||
|
||||
/**
|
||||
* Стоимость предмета расчёта с учётом скидок и наценок
|
||||
*/
|
||||
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_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;
|
||||
}
|
||||
|
@ -56,7 +56,7 @@ class AgentInfo extends Entity
|
||||
?ReceivePaymentsOperator $receive_payments_operator = null,
|
||||
?MoneyTransferOperator $money_transfer_operator = null,
|
||||
) {
|
||||
!is_null($type) && $this->setType($type);
|
||||
!is_null($type) && AgentTypes::isValid($type) && $this->setType($type);
|
||||
!is_null($paying_agent) && $this->setPayingAgent($paying_agent);
|
||||
!is_null($receive_payments_operator) && $this->setReceivePaymentsOperator($receive_payments_operator);
|
||||
!is_null($money_transfer_operator) && $this->setMoneyTransferOperator($money_transfer_operator);
|
||||
@ -77,11 +77,10 @@ class AgentInfo extends Entity
|
||||
*
|
||||
* @param string|null $type
|
||||
* @return AgentInfo
|
||||
* @throws InvalidEnumValueException
|
||||
*/
|
||||
public function setType(?string $type): AgentInfo
|
||||
{
|
||||
AgentTypes::isValid($type) && $this->type = $type;
|
||||
$this->type = $type;
|
||||
return $this;
|
||||
}
|
||||
|
||||
|
@ -49,7 +49,7 @@ class Company extends Entity
|
||||
protected ?string $payment_address;
|
||||
|
||||
/**
|
||||
* Конструктор
|
||||
* Company constructor.
|
||||
*
|
||||
* @param string $sno Система налогообложения продавца (1055)
|
||||
* @param string $inn ИНН (1018)
|
||||
@ -107,6 +107,8 @@ class Company extends Entity
|
||||
/**
|
||||
* Возвращает установленный тип налогообложения
|
||||
*
|
||||
* Тег ФФД - 1055
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getSno(): string
|
||||
@ -117,6 +119,8 @@ class Company extends Entity
|
||||
/**
|
||||
* Устанавливает тип налогообложения
|
||||
*
|
||||
* Тег ФФД - 1055
|
||||
*
|
||||
* @param string $sno
|
||||
* @return $this
|
||||
* @throws InvalidEnumValueException
|
||||
@ -132,6 +136,8 @@ class Company extends Entity
|
||||
/**
|
||||
* Возвращает установленный ИНН
|
||||
*
|
||||
* Тег ФФД - 1018
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getInn(): string
|
||||
@ -142,6 +148,8 @@ class Company extends Entity
|
||||
/**
|
||||
* Устанавливает ИНН
|
||||
*
|
||||
* Тег ФФД - 1018
|
||||
*
|
||||
* @param string $inn
|
||||
* @return $this
|
||||
* @throws InvalidInnLengthException
|
||||
@ -159,6 +167,8 @@ class Company extends Entity
|
||||
/**
|
||||
* Возвращает установленный адрес места расчётов
|
||||
*
|
||||
* Тег ФФД - 1187
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getPaymentAddress(): string
|
||||
@ -169,6 +179,8 @@ class Company extends Entity
|
||||
/**
|
||||
* Устанавливает адрес места расчётов
|
||||
*
|
||||
* Тег ФФД - 1187
|
||||
*
|
||||
* @param string $payment_address
|
||||
* @return $this
|
||||
* @throws TooLongPaymentAddressException
|
||||
|
@ -22,32 +22,32 @@ use AtolOnline\{
|
||||
/**
|
||||
* Предмет расчёта (товар, услуга)
|
||||
*
|
||||
* @see https://online.atol.ru/files/API_atol_online_v4.pdf Документация, стр 21-30
|
||||
* @package AtolOnline\Entities
|
||||
*/
|
||||
class Item extends Entity
|
||||
{
|
||||
/**
|
||||
* @var string Наименование (1030)
|
||||
* @var string Наименование. Тег ФФД - 1030.
|
||||
*/
|
||||
protected string $name;
|
||||
|
||||
/**
|
||||
* @var int Цена в копейках (с учётом скидок и наценок) (1079)
|
||||
* @var int Цена в копейках (с учётом скидок и наценок). Тег ФФД - 1079.
|
||||
*/
|
||||
protected int $price = 0;
|
||||
|
||||
/**
|
||||
* @var float Количество, вес (1023)
|
||||
* @var float Количество, вес. Тег ФФД - 1023.
|
||||
*/
|
||||
protected float $quantity = 0.0;
|
||||
|
||||
/**
|
||||
* @var float Сумма в копейках (1043)
|
||||
* @var float Сумма в копейках. Тег ФФД - 1043.
|
||||
*/
|
||||
protected float $sum = 0;
|
||||
|
||||
/**
|
||||
* @var string Единица измерения количества (1197)
|
||||
* @var string Единица измерения количества. Тег ФФД - 1197.
|
||||
*/
|
||||
protected string $measurement_unit;
|
||||
|
||||
@ -57,17 +57,17 @@ class Item extends Entity
|
||||
protected ?Vat $vat;
|
||||
|
||||
/**
|
||||
* @var string Признак способа расчёта (1214)
|
||||
* @var string Признак способа расчёта. Тег ФФД - 1214.
|
||||
*/
|
||||
protected string $payment_method;
|
||||
|
||||
/**
|
||||
* @var string Признак объекта расчёта (1212)
|
||||
* @var string Признак объекта расчёта. Тег ФФД - 1212.
|
||||
*/
|
||||
protected string $payment_object;
|
||||
|
||||
/**
|
||||
* @var string Дополнительный реквизит (1191)
|
||||
* @var string Дополнительный реквизит. Тег ФФД - 1191.
|
||||
*/
|
||||
protected string $user_data;
|
||||
|
||||
|
115
src/Entities/ItemArray.php
Normal file
115
src/Entities/ItemArray.php
Normal file
@ -0,0 +1,115 @@
|
||||
<?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;
|
||||
}
|
||||
}
|
113
src/Entities/PaymentArray.php
Normal file
113
src/Entities/PaymentArray.php
Normal file
@ -0,0 +1,113 @@
|
||||
<?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;
|
||||
}
|
||||
}
|
@ -12,52 +12,78 @@ declare(strict_types = 1);
|
||||
namespace AtolOnline\Entities;
|
||||
|
||||
use AtolOnline\Enums\VatTypes;
|
||||
use AtolOnline\Helpers;
|
||||
|
||||
/**
|
||||
* Класс, описывающий ставку НДС
|
||||
*
|
||||
* @see https://online.atol.ru/files/API_atol_online_v4.pdf Документация, стр 25, 31
|
||||
* @package AtolOnline\Entities
|
||||
*/
|
||||
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;
|
||||
|
||||
/**
|
||||
* @var float Сумма в рублях, от которой пересчитывается размер НДС
|
||||
* @var int Сумма в копейках, от которой пересчитывается размер НДС
|
||||
*/
|
||||
private float $sum;
|
||||
private int $sum_original = 0;
|
||||
|
||||
/**
|
||||
* Конструктор
|
||||
*
|
||||
* @param string $type Тип ставки НДС (1199, 1105, 1104, 1103, 1102, 1107, 1106)
|
||||
* @param float $rubles Исходная сумма в рублях, от которой нужно расчитать размер НДС
|
||||
* @var int Сумма НДС в копейках
|
||||
*/
|
||||
public function __construct(string $type, float $rubles)
|
||||
{
|
||||
$this->setType($type)->setSum($rubles);
|
||||
}
|
||||
private int $sum_final = 0;
|
||||
|
||||
/**
|
||||
* Устанавливает тип ставки НДС
|
||||
* Автоматически пересчитывает итоговый размер НДС от исходной суммы.
|
||||
* Vat constructor.
|
||||
*
|
||||
* @param string $type Тип ставки НДС
|
||||
* @return $this
|
||||
* @param float|null $rubles Исходная сумма в рублях, от которой нужно расчитать размер НДС
|
||||
*/
|
||||
public function setType(string $type): self
|
||||
public function __construct(string $type = VatTypes::NONE, float $rubles = null)
|
||||
{
|
||||
$type = trim($type);
|
||||
VatTypes::isValid($type) && $this->type = $type;
|
||||
return $this;
|
||||
$this->type = $type;
|
||||
if ($rubles) {
|
||||
$this->setSum($rubles);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Возвращает тип ставки НДС
|
||||
* Устанавливает:
|
||||
* размер НДС от суммы в копейках
|
||||
*
|
||||
* @param string $type Тип ставки НДС
|
||||
* @param int $kopeks Копейки
|
||||
* @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)
|
||||
{
|
||||
switch ($type) {
|
||||
case VatTypes::NONE:
|
||||
case VatTypes::VAT0:
|
||||
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
|
||||
*/
|
||||
@ -67,13 +93,27 @@ class Vat extends Entity
|
||||
}
|
||||
|
||||
/**
|
||||
* Возвращает исходную сумму, от которой расчитывается размер налога
|
||||
* Устанавливает тип ставки НДС. Тег ФФД - 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 getSum(): float
|
||||
public function getFinalSum(): float
|
||||
{
|
||||
return $this->sum;
|
||||
return rubles($this->sum_final);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -83,54 +123,66 @@ class Vat extends Entity
|
||||
* @param float $rubles Сумма в рублях за предмет расчёта, из которой высчитывается размер НДС
|
||||
* @return $this
|
||||
*/
|
||||
public function setSum(float $rubles): self
|
||||
public function setSum(float $rubles): Vat
|
||||
{
|
||||
$this->sum = $rubles;
|
||||
$this->sum_original = kopeks($rubles);
|
||||
$this->setFinal();
|
||||
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
|
||||
public function getSum(): 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,
|
||||
});
|
||||
return rubles($this->sum_original);
|
||||
}
|
||||
|
||||
/**
|
||||
* Прибавляет указанную сумму к исходной
|
||||
* Прибавляет указанную сумму к общей исходной сумме.
|
||||
* Автоматически пересчитывает итоговый размер НДС от новой исходной суммы.
|
||||
*
|
||||
* @param float $rubles
|
||||
* @return $this
|
||||
*/
|
||||
public function addSum(float $rubles): self
|
||||
public function addSum(float $rubles): Vat
|
||||
{
|
||||
$this->sum += $rubles;
|
||||
$this->sum_original += kopeks($rubles);
|
||||
$this->setFinal();
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Расчитывает и возвращает размер НДС от указанной суммы в рублях.
|
||||
* Не изменяет итоговый размер НДС.
|
||||
*
|
||||
* @param float|null $rubles
|
||||
* @return float
|
||||
*/
|
||||
public function calc(float $rubles): float
|
||||
{
|
||||
return rubles(self::calculator($this->type, kopeks($rubles)));
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function jsonSerialize(): array
|
||||
public function jsonSerialize()
|
||||
{
|
||||
return [
|
||||
'type' => $this->getType(),
|
||||
'sum' => $this->getCalculated(),
|
||||
'sum' => $this->getFinalSum(),
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Расчитывает и устанавливает итоговый размер ставки от исходной суммы в копейках
|
||||
*/
|
||||
protected function setFinal(): Vat
|
||||
{
|
||||
$this->sum_final = self::calculator($this->type, $this->sum_original);
|
||||
return $this;
|
||||
}
|
||||
}
|
117
src/Entities/VatArray.php
Normal file
117
src/Entities/VatArray.php
Normal file
@ -0,0 +1,117 @@
|
||||
<?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;
|
||||
}
|
||||
}
|
23
src/Enum.php
Normal file
23
src/Enum.php
Normal file
@ -0,0 +1,23 @@
|
||||
<?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);
|
||||
}
|
||||
}
|
@ -11,10 +11,14 @@ declare(strict_types = 1);
|
||||
|
||||
namespace AtolOnline\Enums;
|
||||
|
||||
use AtolOnline\Enum;
|
||||
|
||||
/**
|
||||
* Константы, определяющие типы агента
|
||||
*
|
||||
* @see https://online.atol.ru/files/API_atol_online_v4.pdf Документация, стр 18
|
||||
* Тег ФФД - 1057
|
||||
*
|
||||
* @see https://online.atol.ru/files/API_atol_online_v4.pdf Документация, стр 18 (agent_info)
|
||||
*/
|
||||
final class AgentTypes extends Enum
|
||||
{
|
||||
@ -54,7 +58,7 @@ final class AgentTypes extends Enum
|
||||
const ANOTHER = 'another';
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
* @return int[] Возвращает массив тегов ФФД
|
||||
*/
|
||||
public static function getFfdTags(): array
|
||||
{
|
||||
|
@ -11,10 +11,14 @@ declare(strict_types = 1);
|
||||
|
||||
namespace AtolOnline\Enums;
|
||||
|
||||
use MyCLabs\Enum\Enum;
|
||||
|
||||
/**
|
||||
* Константы, определяющие типы документов коррекции
|
||||
*
|
||||
* @see https://online.atol.ru/files/API_atol_online_v4.pdf Документация, стр 35
|
||||
* Тег ФФД - 1173
|
||||
*
|
||||
* @see https://online.atol.ru/files/API_atol_online_v4.pdf Документация, стр 35 (correction_info)
|
||||
*/
|
||||
final class CorrectionTypes extends Enum
|
||||
{
|
||||
@ -27,12 +31,4 @@ final class CorrectionTypes extends Enum
|
||||
* По предписанию
|
||||
*/
|
||||
const INSTRUCTION = 'instruction';
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
public static function getFfdTags(): array
|
||||
{
|
||||
return [1173];
|
||||
}
|
||||
}
|
||||
|
@ -11,6 +11,8 @@ declare(strict_types = 1);
|
||||
|
||||
namespace AtolOnline\Enums;
|
||||
|
||||
use MyCLabs\Enum\Enum;
|
||||
|
||||
/**
|
||||
* Константы, определяющие типы документов
|
||||
*/
|
||||
@ -25,12 +27,4 @@ final class DocumentTypes extends Enum
|
||||
* Чек коррекции
|
||||
*/
|
||||
const CORRECTION = 'correction';
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
public static function getFfdTags(): array
|
||||
{
|
||||
return [];
|
||||
}
|
||||
}
|
||||
|
@ -1,37 +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\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;
|
||||
}
|
@ -11,10 +11,14 @@ declare(strict_types = 1);
|
||||
|
||||
namespace AtolOnline\Enums;
|
||||
|
||||
use MyCLabs\Enum\Enum;
|
||||
|
||||
/**
|
||||
* Константы, определяющие признаки способов расчёта
|
||||
*
|
||||
* @see https://online.atol.ru/files/API_atol_online_v4.pdf Документация, стр 22
|
||||
* Тег ФФД - 1214
|
||||
*
|
||||
* @see https://online.atol.ru/files/API_atol_online_v4.pdf Документация, стр 22 (payment_method)
|
||||
*/
|
||||
final class PaymentMethods extends Enum
|
||||
{
|
||||
@ -52,12 +56,4 @@ final class PaymentMethods extends Enum
|
||||
* Оплата кредита
|
||||
*/
|
||||
const CREDIT_PAYMENT = 'credit_payment';
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
public static function getFfdTags(): array
|
||||
{
|
||||
return [1214];
|
||||
}
|
||||
}
|
@ -11,10 +11,14 @@ declare(strict_types = 1);
|
||||
|
||||
namespace AtolOnline\Enums;
|
||||
|
||||
use MyCLabs\Enum\Enum;
|
||||
|
||||
/**
|
||||
* Константы, определяющие признаки предметов расчёта
|
||||
*
|
||||
* @see https://online.atol.ru/files/API_atol_online_v4.pdf Документация, стр 23
|
||||
* Тег ФФД - 1212
|
||||
*
|
||||
* @see https://online.atol.ru/files/API_atol_online_v4.pdf Документация, стр 23 (payment_object)
|
||||
*/
|
||||
final class PaymentObjects extends Enum
|
||||
{
|
||||
@ -111,7 +115,7 @@ final class PaymentObjects extends Enum
|
||||
const RESORT_FEE = 'resort_fee';
|
||||
|
||||
/**
|
||||
* Взнос в счёт оплаты пени, штрафе, вознаграждении, бонусе и ином аналогичном предмете расчёта
|
||||
* Взнос в счёт оплаты пени, штрафе, вознаграждении, бонусе и ином аналогичном предмете расчета
|
||||
*/
|
||||
const AWARD = 'award';
|
||||
|
||||
@ -154,12 +158,4 @@ final class PaymentObjects extends Enum
|
||||
* Платёж казино
|
||||
*/
|
||||
const CASINO_PAYMENT = 'casino_payment';
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
public static function getFfdTags(): array
|
||||
{
|
||||
return [1212];
|
||||
}
|
||||
}
|
||||
|
@ -11,35 +11,37 @@ declare(strict_types = 1);
|
||||
|
||||
namespace AtolOnline\Enums;
|
||||
|
||||
use MyCLabs\Enum\Enum;
|
||||
|
||||
/**
|
||||
* Константы, определяющие виды оплат
|
||||
*
|
||||
* @see https://online.atol.ru/files/API_atol_online_v4.pdf Документация, стр 35
|
||||
* Теги ФФД: 1031, 1081, 1215, 1216, 1217
|
||||
*/
|
||||
final class PaymentTypes extends Enum
|
||||
{
|
||||
/**
|
||||
* Расчёт наличными
|
||||
* Расчёт наличными. Тег ФФД - 1031.
|
||||
*/
|
||||
const CASH = 0;
|
||||
|
||||
/**
|
||||
* Расчёт безналичными
|
||||
* Расчёт безналичными. Тег ФФД - 1081.
|
||||
*/
|
||||
const ELECTRON = 1;
|
||||
|
||||
/**
|
||||
* Предварительная оплата (зачёт аванса)
|
||||
* Предварительная оплата (зачёт аванса). Тег ФФД - 1215.
|
||||
*/
|
||||
const PRE_PAID = 2;
|
||||
|
||||
/**
|
||||
* Предварительная оплата (кредит)
|
||||
* Предварительная оплата (кредит). Тег ФФД - 1216.
|
||||
*/
|
||||
const CREDIT = 3;
|
||||
|
||||
/**
|
||||
* Иная форма оплаты (встречное предоставление)
|
||||
* Иная форма оплаты (встречное предоставление). Тег ФФД - 1217.
|
||||
*/
|
||||
const OTHER = 4;
|
||||
|
||||
@ -72,12 +74,4 @@ final class PaymentTypes extends Enum
|
||||
* Для каждого фискального типа оплаты можно указать расширенный тип оплаты
|
||||
*/
|
||||
const ADD_9 = 9;
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
public static function getFfdTags(): array
|
||||
{
|
||||
return [1031, 1081, 1215, 1216, 1217];
|
||||
}
|
||||
}
|
||||
|
@ -11,10 +11,12 @@ declare(strict_types = 1);
|
||||
|
||||
namespace AtolOnline\Enums;
|
||||
|
||||
use AtolOnline\Enum;
|
||||
|
||||
/**
|
||||
* Константы, определяющие типы налогообложения
|
||||
*
|
||||
* @see https://online.atol.ru/files/API_atol_online_v4.pdf Документация, стр 35
|
||||
* Тег ФДД - 1055
|
||||
*/
|
||||
final class SnoTypes extends Enum
|
||||
{
|
||||
@ -49,7 +51,7 @@ final class SnoTypes extends Enum
|
||||
const PATENT = 'patent';
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
* @return int[] Возвращает массив тегов ФФД
|
||||
*/
|
||||
public static function getFfdTags(): array
|
||||
{
|
||||
|
@ -11,7 +11,7 @@ declare(strict_types = 1);
|
||||
|
||||
namespace AtolOnline\Exceptions;
|
||||
|
||||
use AtolOnline\Enums\Enum;
|
||||
use AtolOnline\Enum;
|
||||
|
||||
/**
|
||||
* Исключение, возникающее при ошибке валидации типа агента
|
||||
|
@ -21,5 +21,5 @@ class TooLongUnitException extends TooLongException
|
||||
{
|
||||
protected $message = 'Слишком длинная единица измерения предмета расчёта';
|
||||
protected float $max = Constraints::MAX_LENGTH_MEASUREMENT_UNIT;
|
||||
protected array $ffd_tags = [Ffd105Tags::ITEM_MEASUREMENT_UNIT];
|
||||
protected array $ffd_tags = [Ffd105Tags::ITEM_MEASURE];
|
||||
}
|
||||
|
@ -17,12 +17,12 @@ final class Helpers
|
||||
/**
|
||||
* Конвертирует копейки в рубли, оставляя только 2 знака после запятой
|
||||
*
|
||||
* @param float|null $kopeks Копейки
|
||||
* @param int|null $kopeks Копейки
|
||||
* @return float Рубли
|
||||
*/
|
||||
public static function toRub(?float $kopeks): float
|
||||
public static function KopToRub(?int $kopeks): float
|
||||
{
|
||||
return round(abs((float)$kopeks) / 100, 2);
|
||||
return round(abs((int)$kopeks) / 100, 2);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -31,7 +31,7 @@ final class Helpers
|
||||
* @param float|null $rubles Рубли
|
||||
* @return int Копейки
|
||||
*/
|
||||
public static function toKop(?float $rubles): int
|
||||
public static function RubToKop(?float $rubles): int
|
||||
{
|
||||
return (int)round(abs((float)$rubles) * 100, 2);
|
||||
}
|
||||
|
@ -12,11 +12,11 @@ declare(strict_types = 1);
|
||||
namespace AtolOnline;
|
||||
|
||||
/**
|
||||
* Константы, определяющие параметры тестовых сред
|
||||
* Константы, определяющие параметры тестовой среды для ФФД 1.05
|
||||
*
|
||||
* @see https://online.atol.ru/files/ffd/test_sreda.txt Параметры настройки тестовых сред
|
||||
*/
|
||||
final class TestEnvParams
|
||||
class TestEnvParams
|
||||
{
|
||||
/**
|
||||
* Возвращает данные для работы с тестовой средой АТОЛ Онлайн ФФД 1.05
|
||||
|
@ -32,7 +32,7 @@ class ClientTest extends BasicTestCase
|
||||
*/
|
||||
public function testConstructorWithoutArgs(): void
|
||||
{
|
||||
$this->assertAtolable(new Client(), []);
|
||||
$this->assertEquals('[]', (string)(new Client()));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1,101 +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 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());
|
||||
}
|
||||
}
|
@ -84,11 +84,11 @@ class HelpersTest extends BasicTestCase
|
||||
* Тестирует перевод копеек в рубли
|
||||
*
|
||||
* @dataProvider providerKopeksToRubles
|
||||
* @covers \AtolOnline\Helpers::toRub
|
||||
* @covers \AtolOnline\Helpers::KopToRub
|
||||
*/
|
||||
public function testKopeksToRubles(?int $kopeks, float $rubles): void
|
||||
{
|
||||
$result = Helpers::toRub($kopeks);
|
||||
$result = Helpers::KopToRub($kopeks);
|
||||
$this->assertIsFloat($result);
|
||||
$this->assertEquals($result, $rubles);
|
||||
}
|
||||
@ -97,11 +97,11 @@ class HelpersTest extends BasicTestCase
|
||||
* Тестирует перевод копеек в рубли
|
||||
*
|
||||
* @dataProvider providerRublesToKopeks
|
||||
* @covers \AtolOnline\Helpers::toKop
|
||||
* @covers \AtolOnline\Helpers::RubToKop
|
||||
*/
|
||||
public function testRublesToKopeks(?float $rubles, int $kopeks): void
|
||||
{
|
||||
$result = Helpers::toKop($rubles);
|
||||
$result = Helpers::RubToKop($rubles);
|
||||
$this->assertIsInt($result);
|
||||
$this->assertEquals($result, $kopeks);
|
||||
}
|
||||
|
55
tests/VatTest_todo.php
Normal file
55
tests/VatTest_todo.php
Normal file
@ -0,0 +1,55 @@
|
||||
<?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],
|
||||
];
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user