'Нет ошибок', 1 => 'Отсутствует физический канал связи', 2 => 'Ошибка сетевых настроек или нет соединения с сервером ОФД', 3 => 'Разрыв соединения при передаче документа на сервер', 4 => 'Некорректный заголовок сессионного пакета', 5 => 'Превышен таймаут ожидания квитанции', 6 => 'Разрыв соединения при приёме квитанции', 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 */ public function __construct(protected object $data) { 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 */ public function jsonSerialize(): array { return (array)$this->data; } }