atol-online/src/Entities/Vat.php

136 lines
4.0 KiB
PHP
Raw Normal View History

2020-01-11 06:30:25 +00:00
<?php
Начало работы по #5 и #6 - строгая типизация - переработан класс `TestEnvParams`:     - вынесен на уровень выше из под `AtolOnline\Constants`     - вместо констант - две функции для получения актуальных параметров подключения по ФФД1.05 и ФФД1.2 - актуализированы `PaymentObjects` согласно #5 - исходники вынесены не уровень выше в `src` - константы теперь enum через `myclabs/php-enum` - новые константы `DocumentTypes` - классы констант финализированы - все исключения переименованы, а многие так или иначе отрефакторены (не полностью) - новые исключения `InvalidSnoException`, `InvalidPaymentAddressException` - `helpers.php` стал полноценным классом `Helpers` - удалены трейты `HasEmail`, `HasInn`, `RublesKopeksConverter` (конвертация перенесена в `Helpers`) - удалён хелпер `valid_strlen()`, вместо него теперь везде `mb_strlen()` - сущности `Client` и `Company` получили свои имплементации для `email` и `inn` - доработки в `BasicTestCase` - полное покрытие тестами: `Client`, `Company`, `Helpers` - поправлен `phpunit.xml` - везде обновлены копирайты - актуализированы и исправлены phpdoc, return types - начато введение `strict_types=1` - минимальный php теперь 8.0 - обновлены все зависимости - подключен пакет коллекций laravel для будущего использования - теперь можно `composer test` и `composer test-cov`
2021-11-18 04:24:30 +00:00
/*
* Copyright (c) 2020-2021 Антон Аксенов (Anthony Axenov)
2020-01-11 06:30:25 +00:00
*
* This code is licensed under MIT.
* Этот код распространяется по лицензии MIT.
* https://github.com/anthonyaxenov/atol-online/blob/master/LICENSE
*/
declare(strict_types=1);
Начало работы по #5 и #6 - строгая типизация - переработан класс `TestEnvParams`:     - вынесен на уровень выше из под `AtolOnline\Constants`     - вместо констант - две функции для получения актуальных параметров подключения по ФФД1.05 и ФФД1.2 - актуализированы `PaymentObjects` согласно #5 - исходники вынесены не уровень выше в `src` - константы теперь enum через `myclabs/php-enum` - новые константы `DocumentTypes` - классы констант финализированы - все исключения переименованы, а многие так или иначе отрефакторены (не полностью) - новые исключения `InvalidSnoException`, `InvalidPaymentAddressException` - `helpers.php` стал полноценным классом `Helpers` - удалены трейты `HasEmail`, `HasInn`, `RublesKopeksConverter` (конвертация перенесена в `Helpers`) - удалён хелпер `valid_strlen()`, вместо него теперь везде `mb_strlen()` - сущности `Client` и `Company` получили свои имплементации для `email` и `inn` - доработки в `BasicTestCase` - полное покрытие тестами: `Client`, `Company`, `Helpers` - поправлен `phpunit.xml` - везде обновлены копирайты - актуализированы и исправлены phpdoc, return types - начато введение `strict_types=1` - минимальный php теперь 8.0 - обновлены все зависимости - подключен пакет коллекций laravel для будущего использования - теперь можно `composer test` и `composer test-cov`
2021-11-18 04:24:30 +00:00
2020-01-11 06:30:25 +00:00
namespace AtolOnline\Entities;
use AtolOnline\Enums\VatType;
use AtolOnline\Helpers;
use JetBrains\PhpStorm\{
ArrayShape,
Pure};
2020-01-11 06:30:25 +00:00
/**
* Класс, описывающий ставку НДС
*
* @see https://online.atol.ru/files/API_atol_online_v4.pdf Документация, стр 25, 31
2020-01-11 06:30:25 +00:00
*/
final class Vat extends Entity
2020-01-11 06:30:25 +00:00
{
/**
* Конструктор
2020-01-11 06:30:25 +00:00
*
* @param VatType $type Тип ставки НДС (1199, 1105, 1104, 1103, 1102, 1107, 1106)
* @param float $sum Исходная сумма в рублях, от которой нужно расчитать размер НДС
2020-01-11 06:30:25 +00:00
*/
public function __construct(
protected VatType $type,
protected float $sum,
) {
$this->setType($type)->setSum($sum);
2020-01-11 06:30:25 +00:00
}
2020-01-11 06:30:25 +00:00
/**
* Устанавливает тип ставки НДС
* Автоматически пересчитывает итоговый размер НДС от исходной суммы.
2020-01-11 06:30:25 +00:00
*
* @param VatType $type Тип ставки НДС
* @return $this
2020-01-11 06:30:25 +00:00
*/
public function setType(VatType $type): self
2020-01-11 06:30:25 +00:00
{
$this->type = $type;
return $this;
2020-01-11 06:30:25 +00:00
}
2020-01-11 06:30:25 +00:00
/**
* Возвращает тип ставки НДС
2020-01-11 06:30:25 +00:00
*
* @return VatType
2020-01-11 06:30:25 +00:00
*/
public function getType(): VatType
2020-01-11 06:30:25 +00:00
{
return $this->type;
}
2020-01-11 06:30:25 +00:00
/**
* Возвращает исходную сумму, от которой расчитывается размер налога
2020-01-11 06:30:25 +00:00
*
* @return float
*/
public function getSum(): float
2020-01-11 06:30:25 +00:00
{
return $this->sum;
2020-01-11 06:30:25 +00:00
}
2020-01-11 06:30:25 +00:00
/**
* Устанавливает исходную сумму, от которой будет расчитываться итоговый размер НДС.
* Автоматически пересчитывает итоговый размер НДС от исходной суммы.
*
* @param float $rubles Сумма в рублях за предмет расчёта, из которой высчитывается размер НДС
* @return $this
*/
public function setSum(float $rubles): self
2020-01-11 06:30:25 +00:00
{
$this->sum = round($rubles, 2);
2020-01-11 06:30:25 +00:00
return $this;
}
2020-01-11 06:30:25 +00:00
/**
* Возвращает расчитанный итоговый размер ставки НДС в рублях
2020-01-11 06:30:25 +00:00
*
* @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
2020-01-11 06:30:25 +00:00
*/
#[Pure]
public function getCalculated(): float
2020-01-11 06:30:25 +00:00
{
return Helpers::toRub(
match ($this->getType()) {
VatType::VAT10 => Helpers::toKop($this->sum) * 10 / 100,
VatType::VAT18 => Helpers::toKop($this->sum) * 18 / 100,
VatType::VAT20 => Helpers::toKop($this->sum) * 20 / 100,
VatType::VAT110 => Helpers::toKop($this->sum) * 10 / 110,
VatType::VAT118 => Helpers::toKop($this->sum) * 18 / 118,
VatType::VAT120 => Helpers::toKop($this->sum) * 20 / 120,
default => 0,
}
);
2020-01-11 06:30:25 +00:00
}
2020-01-11 06:30:25 +00:00
/**
* Прибавляет указанную сумму к исходной
2020-01-11 06:30:25 +00:00
*
* @param float $rubles
* @return $this
*/
public function addSum(float $rubles): self
2020-01-11 06:30:25 +00:00
{
$this->sum += $rubles;
2020-01-11 06:30:25 +00:00
return $this;
}
2020-01-11 06:30:25 +00:00
/**
* @inheritDoc
*/
#[Pure]
#[ArrayShape(['type' => 'string', 'sum' => 'float'])]
public function jsonSerialize(): array
2020-01-11 06:30:25 +00:00
{
return [
'type' => $this->getType(),
'sum' => $this->getCalculated(),
2020-01-11 06:30:25 +00:00
];
}
}