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
|
|
|
|
|
*/
|
2020-04-17 12:10:50 +00:00
|
|
|
|
class ItemArray extends Entity
|
2020-01-11 06:30:25 +00:00
|
|
|
|
{
|
|
|
|
|
/**
|
|
|
|
|
* Максимальное количество элементов в массиве
|
2020-04-15 13:39:23 +00:00
|
|
|
|
* По документации ограничение по количеству предметов расчёта = от 1 до 100,
|
|
|
|
|
* однако в схеме sell не указан receipt.properties.items.maxItems
|
2020-01-11 06:30:25 +00:00
|
|
|
|
*/
|
2020-04-15 13:39:23 +00:00
|
|
|
|
public const MAX_COUNT = 100;
|
2020-01-11 06:30:25 +00:00
|
|
|
|
|
|
|
|
|
/**
|
2020-04-17 12:53:03 +00:00
|
|
|
|
* @var Item[] Массив предметов расчёта
|
2020-01-11 06:30:25 +00:00
|
|
|
|
*/
|
|
|
|
|
private $items = [];
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* ItemArray constructor.
|
|
|
|
|
*
|
2020-04-17 12:53:03 +00:00
|
|
|
|
* @param Item[]|null $items Массив предметов расчёта
|
|
|
|
|
* @throws AtolTooManyItemsException Слишком много предметов расчёта
|
2020-01-11 06:30:25 +00:00
|
|
|
|
*/
|
2020-04-17 12:53:03 +00:00
|
|
|
|
public function __construct(?array $items = null)
|
2020-01-11 06:30:25 +00:00
|
|
|
|
{
|
|
|
|
|
if ($items) {
|
|
|
|
|
$this->set($items);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Устанавливает массив предметов расчёта
|
|
|
|
|
*
|
2020-04-17 12:53:03 +00:00
|
|
|
|
* @param Item[] $items Массив предметов расчёта
|
2020-01-11 06:30:25 +00:00
|
|
|
|
* @return $this
|
2020-04-17 12:53:03 +00:00
|
|
|
|
* @throws AtolTooManyItemsException Слишком много предметов расчёта
|
2020-01-11 06:30:25 +00:00
|
|
|
|
*/
|
|
|
|
|
public function set(array $items)
|
|
|
|
|
{
|
|
|
|
|
if ($this->validateCount($items)) {
|
|
|
|
|
$this->items = $items;
|
|
|
|
|
}
|
|
|
|
|
return $this;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Добавляет предмет расчёта в массив
|
|
|
|
|
*
|
2020-04-17 12:53:03 +00:00
|
|
|
|
* @param Item $item Объект предмета расчёта
|
2020-01-11 06:30:25 +00:00
|
|
|
|
* @return $this
|
2020-04-17 12:53:03 +00:00
|
|
|
|
* @throws AtolTooManyItemsException Слишком много предметов расчёта
|
2020-01-11 06:30:25 +00:00
|
|
|
|
*/
|
|
|
|
|
public function add(Item $item)
|
|
|
|
|
{
|
|
|
|
|
if ($this->validateCount()) {
|
|
|
|
|
$this->items[] = $item;
|
|
|
|
|
}
|
|
|
|
|
return $this;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Возвращает массив предметов расчёта
|
|
|
|
|
*
|
2020-04-17 12:53:03 +00:00
|
|
|
|
* @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-04-16 13:46:02 +00:00
|
|
|
|
* Проверяет количество предметов расчёта
|
2020-01-11 06:30:25 +00:00
|
|
|
|
*
|
2020-04-17 12:53:03 +00:00
|
|
|
|
* @param Item[]|null $items Если передать массив, то проверит количество его элементов.
|
|
|
|
|
* Иначе проверит количество уже присвоенных элементов.
|
2020-04-16 13:46:02 +00:00
|
|
|
|
* @return bool true если всё хорошо, иначе выбрасывает исключение
|
2020-04-17 12:53:03 +00:00
|
|
|
|
* @throws AtolTooManyItemsException Слишком много предметов расчёта
|
2020-01-11 06:30:25 +00:00
|
|
|
|
*/
|
2020-04-17 13:33:02 +00:00
|
|
|
|
protected function validateCount(?array $items = null): bool
|
2020-01-11 06:30:25 +00:00
|
|
|
|
{
|
2020-04-17 13:33:02 +00:00
|
|
|
|
if ((!empty($items) && count($items) >= self::MAX_COUNT) || count($this->items) >= self::MAX_COUNT) {
|
2020-05-31 19:58:31 +00:00
|
|
|
|
throw new AtolTooManyItemsException(count($items), self::MAX_COUNT);
|
2020-01-11 06:30:25 +00:00
|
|
|
|
}
|
2020-04-17 13:33:02 +00:00
|
|
|
|
return true;
|
2020-01-11 06:30:25 +00:00
|
|
|
|
}
|
|
|
|
|
}
|