2021-11-20 15:38:19 +00:00
|
|
|
|
<?php
|
2022-12-14 16:19:55 +00:00
|
|
|
|
|
2021-11-20 15:38:19 +00:00
|
|
|
|
/*
|
|
|
|
|
* Copyright (c) 2020-2021 Антон Аксенов (Anthony Axenov)
|
|
|
|
|
*
|
|
|
|
|
* This code is licensed under MIT.
|
|
|
|
|
* Этот код распространяется по лицензии MIT.
|
|
|
|
|
* https://github.com/anthonyaxenov/atol-online/blob/master/LICENSE
|
|
|
|
|
*/
|
|
|
|
|
|
2022-12-14 16:19:55 +00:00
|
|
|
|
declare(strict_types=1);
|
2021-11-20 15:38:19 +00:00
|
|
|
|
|
|
|
|
|
namespace AtolOnline\Entities;
|
|
|
|
|
|
2021-12-03 10:23:00 +00:00
|
|
|
|
use AtolOnline\Exceptions\{
|
|
|
|
|
EmptyMonitorDataException,
|
2021-12-06 06:13:48 +00:00
|
|
|
|
NotEnoughMonitorDataException};
|
2021-11-20 15:38:19 +00:00
|
|
|
|
use DateTime;
|
|
|
|
|
use Exception;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Класс сущности ККТ, получаемой от монитора
|
|
|
|
|
*
|
2021-12-03 10:23:00 +00:00
|
|
|
|
* @see https://online.atol.ru/files/API_service_information.pdf Документация, стр 11
|
2021-12-06 06:13:48 +00:00
|
|
|
|
* @property-read string|null serialNumber Заводской номер ККТ
|
|
|
|
|
* @property-read string|null registrationNumber Регистрационный номер машины (РНМ)
|
|
|
|
|
* @property-read string|null deviceNumber Номер автоматического устройства (внутренний идентификатор устройства)
|
|
|
|
|
* @property-read DateTime|string|null fiscalizationDate Дата активации (фискализации) ФН с указанием таймзоны
|
|
|
|
|
* @property-read DateTime|string|null fiscalStorageExpiration Дата замены ФН (Срок действия ФН), с указанием таймзоны
|
|
|
|
|
* @property-read int|null signedDocuments Количество подписанных документов в ФН
|
|
|
|
|
* @property-read float|null fiscalStoragePercentageUse Наполненость ФН в %
|
|
|
|
|
* @property-read string|null fiscalStorageINN ИНН компании (указанный в ФН)
|
|
|
|
|
* @property-read string|null fiscalStorageSerialNumber Заводской (серийный) номер ФН
|
|
|
|
|
* @property-read string|null fiscalStoragePaymentAddress Адрес расчёта, указанный в ФН
|
|
|
|
|
* @property-read string|null groupCode Код группы кассы
|
|
|
|
|
* @property-read DateTime|string|null timestamp Время и дата формирования данных, UTC
|
|
|
|
|
* @property-read bool|null isShiftOpened Признак открыта смена (true) или закрыта (false)
|
|
|
|
|
* @property-read int|null shiftNumber Номер смены (или "Номер закрытой смены", когда смена закрыта)
|
|
|
|
|
* @property-read int|null shiftReceipt Номер документа за смену (или "Кол-во чеков закрытой смены", когда смена
|
|
|
|
|
* закрыта)
|
|
|
|
|
* @property-read int|null unsentDocs Количество неотправленных документов. Указывается, если значение отлично от 0.
|
|
|
|
|
* @property-read DateTime|string|null firstUnsetDocTimestamp Дата первого неотправленного документа. Указывается, если
|
2021-11-20 15:38:19 +00:00
|
|
|
|
* есть неотправленные документы.
|
2021-12-06 06:13:48 +00:00
|
|
|
|
* @property-read int|null networkErrorCode Код ошибки сети
|
2021-11-20 15:38:19 +00:00
|
|
|
|
*/
|
|
|
|
|
final class Kkt extends Entity
|
|
|
|
|
{
|
|
|
|
|
/**
|
|
|
|
|
* Сопоставление кодов сетевых ошибок ККТ с их описаниями
|
|
|
|
|
*/
|
2021-12-03 10:23:00 +00:00
|
|
|
|
public const ERROR_CODES = [
|
2021-11-20 15:38:19 +00:00
|
|
|
|
0 => 'Нет ошибок',
|
|
|
|
|
1 => 'Отсутствует физический канал связи',
|
|
|
|
|
2 => 'Ошибка сетевых настроек или нет соединения с сервером ОФД',
|
|
|
|
|
3 => 'Разрыв соединения при передаче документа на сервер',
|
|
|
|
|
4 => 'Некорректный заголовок сессионного пакета',
|
|
|
|
|
5 => 'Превышен таймаут ожидания квитанции',
|
2021-11-24 09:54:04 +00:00
|
|
|
|
6 => 'Разрыв соединения при приёме квитанции',
|
2021-11-20 15:38:19 +00:00
|
|
|
|
7 => 'Превышен таймаут передачи документа на сервер',
|
|
|
|
|
8 => 'ОФД-процесс не иницилизирован',
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @var string[] Список обязательных атрибутов
|
|
|
|
|
*/
|
|
|
|
|
private array $properties = [
|
|
|
|
|
'serialNumber',
|
|
|
|
|
'registrationNumber',
|
|
|
|
|
'deviceNumber',
|
|
|
|
|
'fiscalizationDate',
|
|
|
|
|
'fiscalStorageExpiration',
|
|
|
|
|
'signedDocuments',
|
|
|
|
|
'fiscalStoragePercentageUse',
|
|
|
|
|
'fiscalStorageINN',
|
|
|
|
|
'fiscalStorageSerialNumber',
|
|
|
|
|
'fiscalStoragePaymentAddress',
|
|
|
|
|
'groupCode',
|
|
|
|
|
'timestamp',
|
|
|
|
|
'isShiftOpened',
|
|
|
|
|
'shiftNumber',
|
|
|
|
|
'shiftReceipt',
|
|
|
|
|
//'unsentDocs',
|
|
|
|
|
//'firstUnsetDocTimestamp',
|
|
|
|
|
'networkErrorCode',
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @var string[] Массив атрибутов, которые кастуются к DateTime
|
|
|
|
|
*/
|
|
|
|
|
private array $timestamps = [
|
|
|
|
|
'fiscalizationDate',
|
|
|
|
|
'fiscalStorageExpiration',
|
|
|
|
|
'firstUnsetDocTimestamp',
|
|
|
|
|
'timestamp',
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Конструктор
|
|
|
|
|
*
|
|
|
|
|
* @throws EmptyMonitorDataException
|
|
|
|
|
* @throws NotEnoughMonitorDataException
|
|
|
|
|
*/
|
2021-12-03 10:23:00 +00:00
|
|
|
|
public function __construct(protected object $data)
|
2021-11-20 15:38:19 +00:00
|
|
|
|
{
|
|
|
|
|
if (empty((array)$data)) {
|
|
|
|
|
throw new EmptyMonitorDataException();
|
|
|
|
|
}
|
|
|
|
|
$diff = array_diff($this->properties, array_keys((array)$data));
|
|
|
|
|
if (count($diff) !== 0) {
|
|
|
|
|
throw new NotEnoughMonitorDataException($diff);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Эмулирует обращение к атрибутам
|
|
|
|
|
*
|
|
|
|
|
* @param string $name
|
|
|
|
|
* @return null
|
|
|
|
|
* @throws Exception
|
|
|
|
|
*/
|
|
|
|
|
public function __get(string $name)
|
|
|
|
|
{
|
|
|
|
|
if (empty($this->data?->$name)) {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
if (in_array($name, $this->timestamps)) {
|
|
|
|
|
return new DateTime($this->data->$name);
|
|
|
|
|
}
|
|
|
|
|
return $this->data->$name;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @inheritDoc
|
|
|
|
|
*/
|
2021-11-23 17:30:54 +00:00
|
|
|
|
public function jsonSerialize(): array
|
2021-11-20 15:38:19 +00:00
|
|
|
|
{
|
2021-11-23 17:30:54 +00:00
|
|
|
|
return (array)$this->data;
|
2021-11-20 15:38:19 +00:00
|
|
|
|
}
|
|
|
|
|
}
|