2021-12-03 12:09:14 +00:00
|
|
|
|
<?php
|
2022-12-14 16:19:55 +00:00
|
|
|
|
|
2021-12-03 12:09:14 +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-12-03 12:09:14 +00:00
|
|
|
|
|
|
|
|
|
namespace AtolOnline\Entities;
|
|
|
|
|
|
2022-12-14 16:19:55 +00:00
|
|
|
|
use AtolOnline\Constraints;
|
|
|
|
|
use AtolOnline\Enums\CorrectionType;
|
2021-12-03 12:09:14 +00:00
|
|
|
|
use AtolOnline\Exceptions\{
|
|
|
|
|
EmptyCorrectionNumberException,
|
2022-12-14 16:19:55 +00:00
|
|
|
|
InvalidCorrectionDateException,};
|
2021-12-03 12:09:14 +00:00
|
|
|
|
use DateTime;
|
2022-12-14 16:19:55 +00:00
|
|
|
|
use DateTimeImmutable;
|
|
|
|
|
use DateTimeInterface;
|
2021-12-03 12:09:14 +00:00
|
|
|
|
use Exception;
|
|
|
|
|
use JetBrains\PhpStorm\{
|
2022-12-14 16:19:55 +00:00
|
|
|
|
ArrayShape};
|
2021-12-03 12:09:14 +00:00
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Класс, описывающий данные коррекции
|
|
|
|
|
*
|
|
|
|
|
* @see https://online.atol.ru/files/API_atol_online_v4.pdf Документация, стр 35
|
|
|
|
|
*/
|
2021-12-06 08:14:19 +00:00
|
|
|
|
final class CorrectionInfo extends Entity
|
2021-12-03 12:09:14 +00:00
|
|
|
|
{
|
|
|
|
|
/**
|
2022-12-14 16:19:55 +00:00
|
|
|
|
* @var DateTimeImmutable Дата документа основания для коррекции (1178)
|
2021-12-03 12:09:14 +00:00
|
|
|
|
*/
|
2022-12-14 16:19:55 +00:00
|
|
|
|
protected DateTimeImmutable $date;
|
2021-12-03 12:09:14 +00:00
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Конструктор
|
|
|
|
|
*
|
2022-12-14 16:19:55 +00:00
|
|
|
|
* @param CorrectionType $type Тип коррекции (1173)
|
|
|
|
|
* @param DateTimeInterface|string $date Дата документа основания для коррекции (1178)
|
|
|
|
|
* @param string $number Номер документа основания для коррекции (1179)
|
2021-12-03 12:09:14 +00:00
|
|
|
|
* @throws InvalidCorrectionDateException
|
|
|
|
|
* @throws EmptyCorrectionNumberException
|
|
|
|
|
*/
|
2022-12-14 16:19:55 +00:00
|
|
|
|
public function __construct(
|
|
|
|
|
protected CorrectionType $type,
|
|
|
|
|
DateTimeInterface | string $date,
|
|
|
|
|
protected string $number,
|
|
|
|
|
) {
|
|
|
|
|
$this->setType($type)
|
|
|
|
|
->setDate($date)
|
|
|
|
|
->setNumber($number);
|
2021-12-03 12:09:14 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Возвращает тип коррекции
|
|
|
|
|
*
|
2022-12-14 16:19:55 +00:00
|
|
|
|
* @return CorrectionType|null
|
2021-12-03 12:09:14 +00:00
|
|
|
|
*/
|
2022-12-14 16:19:55 +00:00
|
|
|
|
public function getType(): ?CorrectionType
|
2021-12-03 12:09:14 +00:00
|
|
|
|
{
|
|
|
|
|
return $this->type;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Устанавливает тип коррекции
|
|
|
|
|
*
|
2022-12-14 16:19:55 +00:00
|
|
|
|
* @param CorrectionType $type
|
2021-12-03 12:09:14 +00:00
|
|
|
|
* @return $this
|
|
|
|
|
*/
|
2022-12-14 16:19:55 +00:00
|
|
|
|
public function setType(CorrectionType $type): self
|
2021-12-03 12:09:14 +00:00
|
|
|
|
{
|
2022-12-14 16:19:55 +00:00
|
|
|
|
$this->type = $type;
|
2021-12-03 12:09:14 +00:00
|
|
|
|
return $this;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Возвращает дату документа основания для коррекции
|
|
|
|
|
*
|
2022-12-14 16:19:55 +00:00
|
|
|
|
* @return DateTimeImmutable
|
2021-12-03 12:09:14 +00:00
|
|
|
|
*/
|
2022-12-14 16:19:55 +00:00
|
|
|
|
public function getDate(): DateTimeImmutable
|
2021-12-03 12:09:14 +00:00
|
|
|
|
{
|
|
|
|
|
return $this->date;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Устанавливает дату документа основания для коррекции
|
|
|
|
|
*
|
2022-12-14 16:19:55 +00:00
|
|
|
|
* @param DateTimeInterface|string $date Строковая дата в формате d.m.Y либо объект DateTime с датой
|
2021-12-03 12:09:14 +00:00
|
|
|
|
* @return $this
|
|
|
|
|
* @throws InvalidCorrectionDateException
|
|
|
|
|
*/
|
2022-12-14 16:19:55 +00:00
|
|
|
|
public function setDate(DateTimeInterface | string $date): self
|
2021-12-03 12:09:14 +00:00
|
|
|
|
{
|
|
|
|
|
try {
|
|
|
|
|
if (is_string($date)) {
|
2022-12-14 16:19:55 +00:00
|
|
|
|
$this->date = new DateTimeImmutable(trim($date));
|
|
|
|
|
} elseif ($date instanceof DateTime) {
|
|
|
|
|
$this->date = DateTimeImmutable::createFromMutable($date);
|
|
|
|
|
} elseif ($date instanceof DateTimeImmutable) {
|
|
|
|
|
$this->date = $date;
|
2021-12-03 12:09:14 +00:00
|
|
|
|
}
|
|
|
|
|
} catch (Exception $e) {
|
|
|
|
|
throw new InvalidCorrectionDateException($date, $e->getMessage());
|
|
|
|
|
}
|
|
|
|
|
return $this;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Возвращает установленный номер документа основания для коррекции
|
|
|
|
|
*
|
|
|
|
|
* @return string|null
|
|
|
|
|
*/
|
|
|
|
|
public function getNumber(): ?string
|
|
|
|
|
{
|
|
|
|
|
return $this->number;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Устанавливает номер документа основания для коррекции
|
|
|
|
|
*
|
|
|
|
|
* @param string $number
|
|
|
|
|
* @return $this
|
|
|
|
|
* @throws EmptyCorrectionNumberException
|
|
|
|
|
*/
|
|
|
|
|
public function setNumber(string $number): self
|
|
|
|
|
{
|
|
|
|
|
$number = trim($number);
|
|
|
|
|
empty($number) && throw new EmptyCorrectionNumberException();
|
|
|
|
|
$this->number = $number;
|
|
|
|
|
return $this;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @inheritDoc
|
|
|
|
|
*/
|
2022-12-14 16:19:55 +00:00
|
|
|
|
#[ArrayShape([
|
|
|
|
|
'type' => 'string',
|
|
|
|
|
'base_date' => 'string',
|
|
|
|
|
'base_number' => 'string',
|
|
|
|
|
])]
|
2021-12-03 12:09:14 +00:00
|
|
|
|
public function jsonSerialize(): array
|
|
|
|
|
{
|
|
|
|
|
return [
|
|
|
|
|
'type' => $this->getType(),
|
2022-12-14 16:19:55 +00:00
|
|
|
|
'base_date' => $this->getDate()->format(Constraints::CORRECTION_DATE_FORMAT),
|
2021-12-03 12:09:14 +00:00
|
|
|
|
'base_number' => $this->getNumber(),
|
|
|
|
|
];
|
|
|
|
|
}
|
|
|
|
|
}
|