mirror of
https://github.com/anthonyaxenov/atol-online.git
synced 2024-11-15 22:00:55 +00:00
AnthonyAxenov
77481884ad
- строгая типизация - переработан класс `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`
115 lines
3.5 KiB
PHP
115 lines
3.5 KiB
PHP
<?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;
|
||
}
|
||
} |