atol-online/src/AtolOnline/Entities/ItemArray.php

113 lines
3.5 KiB
PHP
Raw Normal View History

2020-01-11 06:30:25 +00:00
<?php
/**
* Copyright (c) Антон Аксенов (aka Anthony Axenov)
*
* This code is licensed under MIT.
* Этот код распространяется по лицензии MIT.
* https://github.com/anthonyaxenov/atol-online/blob/master/LICENSE
*/
namespace AtolOnline\Entities;
use AtolOnline\Exceptions\AtolTooManyItemsException;
/**
* Класс, описывающий массив предметов расчёта
*
* @package AtolOnline\Entities
*/
class ItemArray extends Entity
2020-01-11 06:30:25 +00:00
{
/**
* Максимальное количество элементов в массиве
* По документации ограничение по количеству предметов расчёта = от 1 до 100,
* однако в схеме sell не указан receipt.properties.items.maxItems
2020-01-11 06:30:25 +00:00
*/
public const MAX_COUNT = 100;
2020-01-11 06:30:25 +00:00
/**
* @var Item[] Массив предметов расчёта
2020-01-11 06:30:25 +00:00
*/
private $items = [];
/**
* ItemArray constructor.
*
* @param Item[]|null $items Массив предметов расчёта
* @throws AtolTooManyItemsException Слишком много предметов расчёта
2020-01-11 06:30:25 +00:00
*/
public function __construct(?array $items = null)
2020-01-11 06:30:25 +00:00
{
if ($items) {
$this->set($items);
}
}
/**
* Устанавливает массив предметов расчёта
*
* @param Item[] $items Массив предметов расчёта
2020-01-11 06:30:25 +00:00
* @return $this
* @throws AtolTooManyItemsException Слишком много предметов расчёта
2020-01-11 06:30:25 +00:00
*/
public function set(array $items)
{
if ($this->validateCount($items)) {
$this->items = $items;
}
return $this;
}
/**
* Добавляет предмет расчёта в массив
*
* @param Item $item Объект предмета расчёта
2020-01-11 06:30:25 +00:00
* @return $this
* @throws AtolTooManyItemsException Слишком много предметов расчёта
2020-01-11 06:30:25 +00:00
*/
public function add(Item $item)
{
if ($this->validateCount()) {
$this->items[] = $item;
}
return $this;
}
/**
* Возвращает массив предметов расчёта
*
* @return Item[]
2020-01-11 06:30:25 +00:00
*/
public function get()
{
return $this->items;
}
/**
* @inheritDoc
*/
public function jsonSerialize()
{
$result = [];
foreach ($this->get() as $item) {
$result[] = $item->jsonSerialize();
}
return $result;
}
/**
* Проверяет количество предметов расчёта
2020-01-11 06:30:25 +00:00
*
* @param Item[]|null $items Если передать массив, то проверит количество его элементов.
* Иначе проверит количество уже присвоенных элементов.
* @return bool true если всё хорошо, иначе выбрасывает исключение
* @throws AtolTooManyItemsException Слишком много предметов расчёта
2020-01-11 06:30:25 +00:00
*/
protected function validateCount(?array $items = null): bool
2020-01-11 06:30:25 +00:00
{
if ((!empty($items) && count($items) >= self::MAX_COUNT) || count($this->items) >= self::MAX_COUNT) {
throw new AtolTooManyItemsException(count($items), self::MAX_COUNT);
2020-01-11 06:30:25 +00:00
}
return true;
2020-01-11 06:30:25 +00:00
}
}