mirror of
https://github.com/anthonyaxenov/atol-online.git
synced 2024-11-22 08:04:33 +00:00
Первая итерация Receipt
This commit is contained in:
parent
359264db64
commit
1f3d5d2f3d
@ -148,14 +148,21 @@ final class Constraints
|
|||||||
const MAX_LENGTH_ITEM_CODE = 32;
|
const MAX_LENGTH_ITEM_CODE = 32;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Максимальная длина наименования дополнительного реквизита (1085)
|
* Максимальная длина значения дополнительного реквизита чека (1192)
|
||||||
|
*
|
||||||
|
* @see https://online.atol.ru/files/API_atol_online_v4.pdf Документация, стр 32
|
||||||
|
*/
|
||||||
|
const MAX_LENGTH_ADD_CHECK_PROP = 16;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Максимальная длина наименования дополнительного реквизита пользователя (1085)
|
||||||
*
|
*
|
||||||
* @see https://online.atol.ru/files/API_atol_online_v4.pdf Документация, стр 32
|
* @see https://online.atol.ru/files/API_atol_online_v4.pdf Документация, стр 32
|
||||||
*/
|
*/
|
||||||
const MAX_LENGTH_ADD_USER_PROP_NAME = 64;
|
const MAX_LENGTH_ADD_USER_PROP_NAME = 64;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Максимальная длина значения дополнительного реквизита (1086)
|
* Максимальная длина значения дополнительного реквизита пользователя (1086)
|
||||||
*
|
*
|
||||||
* @see https://online.atol.ru/files/API_atol_online_v4.pdf Документация, стр 32
|
* @see https://online.atol.ru/files/API_atol_online_v4.pdf Документация, стр 32
|
||||||
*/
|
*/
|
||||||
|
@ -227,6 +227,11 @@ final class Ffd105Tags
|
|||||||
*/
|
*/
|
||||||
const DOC_VAT_TYPE_VAT120 = 1106;
|
const DOC_VAT_TYPE_VAT120 = 1106;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Значение дополнительного реквизита чека
|
||||||
|
*/
|
||||||
|
const DOC_ADD_CHECK_PROP_VALUE = 1192;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Дополнительный реквизит пользователя
|
* Дополнительный реквизит пользователя
|
||||||
*/
|
*/
|
||||||
|
@ -20,7 +20,7 @@ use AtolOnline\Exceptions\{
|
|||||||
use JetBrains\PhpStorm\Pure;
|
use JetBrains\PhpStorm\Pure;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Класс, описывающий дополнительный реквизит
|
* Класс, описывающий дополнительный реквизит пользователя
|
||||||
*
|
*
|
||||||
* @see https://online.atol.ru/files/API_atol_online_v4.pdf Документация, стр 32
|
* @see https://online.atol.ru/files/API_atol_online_v4.pdf Документация, стр 32
|
||||||
*/
|
*/
|
||||||
|
394
src/Entities/Receipt.php
Normal file
394
src/Entities/Receipt.php
Normal file
@ -0,0 +1,394 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2020-2021 Антон Аксенов (Anthony Axenov)
|
||||||
|
*
|
||||||
|
* This code is licensed under MIT.
|
||||||
|
* Этот код распространяется по лицензии MIT.
|
||||||
|
* https://github.com/anthonyaxenov/atol-online/blob/master/LICENSE
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types = 1);
|
||||||
|
|
||||||
|
namespace AtolOnline\Entities;
|
||||||
|
|
||||||
|
use AtolOnline\Collections\Items;
|
||||||
|
use AtolOnline\Collections\Payments;
|
||||||
|
use AtolOnline\Collections\Vats;
|
||||||
|
use AtolOnline\Constants\Constraints;
|
||||||
|
use AtolOnline\Exceptions\TooHighPriceException;
|
||||||
|
use AtolOnline\Exceptions\TooLongAddCheckPropException;
|
||||||
|
use AtolOnline\Exceptions\TooLongCashierException;
|
||||||
|
use Exception;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Класс, описывающий документ прихода, расхода, возврата прихода, возврата расхода
|
||||||
|
*
|
||||||
|
* @see https://online.atol.ru/files/API_atol_online_v4.pdf Документация, стр 17
|
||||||
|
*/
|
||||||
|
class Receipt extends Entity
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @var Client Покупатель
|
||||||
|
*/
|
||||||
|
protected Client $client;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var Company Продавец
|
||||||
|
*/
|
||||||
|
protected Company $company;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var AgentInfo|null Агент
|
||||||
|
*/
|
||||||
|
protected ?AgentInfo $agent_info = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var Supplier|null Поставщик
|
||||||
|
*/
|
||||||
|
protected ?Supplier $supplier = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var Items Коллекция предметов расчёта
|
||||||
|
*/
|
||||||
|
protected Items $items;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var Payments Коллекция оплат
|
||||||
|
*/
|
||||||
|
protected Payments $payments;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var Vats|null Коллекция ставок НДС
|
||||||
|
*/
|
||||||
|
protected ?Vats $vats = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var float Итоговая сумма чека
|
||||||
|
*/
|
||||||
|
protected float $total = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var string|null ФИО кассира
|
||||||
|
*/
|
||||||
|
protected ?string $cashier = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var string|null Дополнительный реквизит
|
||||||
|
*/
|
||||||
|
protected ?string $add_check_props;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var AdditionalUserProps|null Дополнительный реквизит пользователя
|
||||||
|
*/
|
||||||
|
protected ?AdditionalUserProps $add_user_props;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Конструктор
|
||||||
|
*/
|
||||||
|
public function __construct(
|
||||||
|
Client $client,
|
||||||
|
Company $company,
|
||||||
|
Items $items,
|
||||||
|
Payments $payments,
|
||||||
|
) {
|
||||||
|
$this->setClient($client)->setCompany($company)->setItems($items)->setPayments($payments);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Возвращает установленного покупателя
|
||||||
|
*
|
||||||
|
* @return Client
|
||||||
|
*/
|
||||||
|
public function getClient(): Client
|
||||||
|
{
|
||||||
|
return $this->client;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Устанаваливает покупателя
|
||||||
|
*
|
||||||
|
* @param Client $client
|
||||||
|
* @return Receipt
|
||||||
|
*/
|
||||||
|
public function setClient(Client $client): self
|
||||||
|
{
|
||||||
|
$this->client = $client;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Возвращает установленного продавца
|
||||||
|
*
|
||||||
|
* @return Company
|
||||||
|
*/
|
||||||
|
public function getCompany(): Company
|
||||||
|
{
|
||||||
|
return $this->company;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Устанаваливает продавца
|
||||||
|
*
|
||||||
|
* @param Company $company
|
||||||
|
* @return Receipt
|
||||||
|
*/
|
||||||
|
public function setCompany(Company $company): self
|
||||||
|
{
|
||||||
|
$this->company = $company;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Возвращает установленного агента
|
||||||
|
*
|
||||||
|
* @return AgentInfo
|
||||||
|
*/
|
||||||
|
public function getAgentInfo(): ?AgentInfo
|
||||||
|
{
|
||||||
|
return $this->agent_info;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Устанаваливает агента
|
||||||
|
*
|
||||||
|
* @param AgentInfo|null $agent_info
|
||||||
|
* @return Receipt
|
||||||
|
*/
|
||||||
|
public function setAgentInfo(?AgentInfo $agent_info): self
|
||||||
|
{
|
||||||
|
$this->agent_info = $agent_info;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Поставщика
|
||||||
|
*
|
||||||
|
* @return Supplier|null
|
||||||
|
*/
|
||||||
|
public function getSupplier(): ?Supplier
|
||||||
|
{
|
||||||
|
return $this->supplier;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Поставщика
|
||||||
|
*
|
||||||
|
* @param Supplier|null $supplier
|
||||||
|
* @return Receipt
|
||||||
|
*/
|
||||||
|
public function setSupplier(?Supplier $supplier): self
|
||||||
|
{
|
||||||
|
$this->supplier = $supplier;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Возвращает установленную коллекцию предметов расчёта
|
||||||
|
*
|
||||||
|
* @return Items
|
||||||
|
*/
|
||||||
|
public function getItems(): Items
|
||||||
|
{
|
||||||
|
return $this->items;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Устанаваливает коллекцию предметов расчёта
|
||||||
|
*
|
||||||
|
* @todo исключение при пустой коллекции
|
||||||
|
* @param Items $items
|
||||||
|
* @return Receipt
|
||||||
|
*/
|
||||||
|
public function setItems(Items $items): self
|
||||||
|
{
|
||||||
|
$this->items = $items;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Возвращает установленную коллекцию оплат
|
||||||
|
*
|
||||||
|
* @return Payments
|
||||||
|
*/
|
||||||
|
public function getPayments(): Payments
|
||||||
|
{
|
||||||
|
return $this->payments;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Устанаваливает коллекцию оплат
|
||||||
|
*
|
||||||
|
* @todo исключение при пустой коллекции
|
||||||
|
* @param Payments $payments
|
||||||
|
* @return Receipt
|
||||||
|
*/
|
||||||
|
public function setPayments(Payments $payments): self
|
||||||
|
{
|
||||||
|
$this->payments = $payments;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Возвращает установленную коллекцию ставок НДС
|
||||||
|
*
|
||||||
|
* @return Vats|null
|
||||||
|
*/
|
||||||
|
public function getVats(): ?Vats
|
||||||
|
{
|
||||||
|
return $this->vats;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Устанаваливает коллекцию ставок НДС
|
||||||
|
*
|
||||||
|
* @param Vats|null $vats
|
||||||
|
* @return Receipt
|
||||||
|
*/
|
||||||
|
public function setVats(?Vats $vats): self
|
||||||
|
{
|
||||||
|
$this->vats = $vats;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Возвращает полную сумму чека
|
||||||
|
*
|
||||||
|
* @return float
|
||||||
|
*/
|
||||||
|
public function getTotal(): float
|
||||||
|
{
|
||||||
|
return $this->total;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Устанавливает полную сумму чека
|
||||||
|
*
|
||||||
|
* @param float $total
|
||||||
|
* @return Receipt
|
||||||
|
*/
|
||||||
|
public function setTotal(float $total): self
|
||||||
|
{
|
||||||
|
$this->total = $total;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Возвращает установленного кассира
|
||||||
|
*
|
||||||
|
* @return string|null
|
||||||
|
*/
|
||||||
|
public function getCashier(): ?string
|
||||||
|
{
|
||||||
|
return $this->cashier;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Устанаваливает кассира
|
||||||
|
*
|
||||||
|
* @param string|null $cashier
|
||||||
|
* @return Receipt
|
||||||
|
* @throws TooLongCashierException
|
||||||
|
*/
|
||||||
|
public function setCashier(?string $cashier): self
|
||||||
|
{
|
||||||
|
if (is_string($cashier)) {
|
||||||
|
$cashier = trim($cashier);
|
||||||
|
if (mb_strlen($cashier) > Constraints::MAX_LENGTH_CASHIER_NAME) {
|
||||||
|
throw new TooLongCashierException($cashier);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$this->cashier = empty($cashier) ? null : $cashier;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Возвращает установленный дополнительный реквизит чека
|
||||||
|
*
|
||||||
|
* @return string|null
|
||||||
|
*/
|
||||||
|
public function getAddCheckProps(): ?string
|
||||||
|
{
|
||||||
|
return $this->add_check_props;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Устанаваливает дополнительный реквизит чека
|
||||||
|
*
|
||||||
|
* @param string|null $add_check_props
|
||||||
|
* @return Receipt
|
||||||
|
* @throws TooLongAddCheckPropException
|
||||||
|
*/
|
||||||
|
public function setAddCheckProps(?string $add_check_props): self
|
||||||
|
{
|
||||||
|
if (is_string($add_check_props)) {
|
||||||
|
$add_check_props = trim($add_check_props);
|
||||||
|
if (mb_strlen($add_check_props) > Constraints::MAX_LENGTH_ADD_CHECK_PROP) {
|
||||||
|
throw new TooLongAddCheckPropException($add_check_props);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$this->add_check_props = empty($add_check_props) ? null : $add_check_props;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Возвращает установленный дополнительный реквизит пользователя
|
||||||
|
*
|
||||||
|
* @return AdditionalUserProps|null
|
||||||
|
*/
|
||||||
|
public function getAddUserProps(): ?AdditionalUserProps
|
||||||
|
{
|
||||||
|
return $this->add_user_props;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Устанаваливает дополнительный реквизит пользователя
|
||||||
|
*
|
||||||
|
* @param AdditionalUserProps|null $add_user_props
|
||||||
|
* @return Receipt
|
||||||
|
*/
|
||||||
|
public function setAddUserProps(?AdditionalUserProps $add_user_props): self
|
||||||
|
{
|
||||||
|
$this->add_user_props = $add_user_props;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Возвращает массив для кодирования в json
|
||||||
|
*
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
public function jsonSerialize(): array
|
||||||
|
{
|
||||||
|
$json = [
|
||||||
|
'client' => $this->getClient(),
|
||||||
|
'company' => $this->getCompany(),
|
||||||
|
'items' => $this->getItems(),
|
||||||
|
'total' => $this->getTotal(),
|
||||||
|
'payment' => $this->getPayments(),
|
||||||
|
];
|
||||||
|
$this->getAgentInfo()?->jsonSerialize() && $json['agent_info'] = $this->getAgentInfo();
|
||||||
|
$this->getSupplier()?->jsonSerialize() && $json['vats'] = $this->getVats();
|
||||||
|
$this->getVats()?->jsonSerialize() && $json['vats'] = $this->getVats();
|
||||||
|
!is_null($this->getAddCheckProps()) && $json['additional_check_props'] = $this->getAddCheckProps();
|
||||||
|
!is_null($this->getCashier()) && $json['cashier'] = $this->getCashier();
|
||||||
|
$this->getAddUserProps()?->jsonSerialize() && $json['additional_user_props'] = $this->getAddUserProps();
|
||||||
|
return $json;
|
||||||
|
}
|
||||||
|
|
||||||
|
///**
|
||||||
|
// * Пересчитывает, сохраняет и возвращает итоговую сумму чека по всем позициям (включая НДС). Тег ФФД - 1020.
|
||||||
|
// *
|
||||||
|
// * @return float
|
||||||
|
// * @throws Exception
|
||||||
|
// */
|
||||||
|
//public function calcTotal(): float
|
||||||
|
//{
|
||||||
|
// $sum = 0;
|
||||||
|
// $this->clearVats();
|
||||||
|
// foreach ($this->items->get() as $item) {
|
||||||
|
// $sum += $item->calcSum();
|
||||||
|
// $this->addVat(new Vat($item->getVat()->getType(), $item->getSum()));
|
||||||
|
// }
|
||||||
|
// return $this->total = round($sum, 2);
|
||||||
|
//}
|
||||||
|
}
|
@ -1,468 +0,0 @@
|
|||||||
<?php
|
|
||||||
/*
|
|
||||||
* Copyright (c) 2020-2021 Антон Аксенов (Anthony Axenov)
|
|
||||||
*
|
|
||||||
* This code is licensed under MIT.
|
|
||||||
* Этот код распространяется по лицензии MIT.
|
|
||||||
* https://github.com/anthonyaxenov/atol-online/blob/master/LICENSE
|
|
||||||
*/
|
|
||||||
|
|
||||||
declare(strict_types = 1);
|
|
||||||
|
|
||||||
namespace AtolOnline\Entities;
|
|
||||||
|
|
||||||
use AtolOnline\Constants\Constraints;
|
|
||||||
use AtolOnline\Exceptions\AtolException;
|
|
||||||
use AtolOnline\Exceptions\InvalidEmailException;
|
|
||||||
use AtolOnline\Exceptions\InvalidInnLengthException;
|
|
||||||
use AtolOnline\Exceptions\InvalidJsonException;
|
|
||||||
use AtolOnline\Exceptions\TooHighPriceException;
|
|
||||||
use AtolOnline\Exceptions\TooLongCashierException;
|
|
||||||
use AtolOnline\Exceptions\TooLongClientContactException;
|
|
||||||
use AtolOnline\Exceptions\TooLongEmailException;
|
|
||||||
use AtolOnline\Exceptions\TooLongItemNameException;
|
|
||||||
use AtolOnline\Exceptions\TooLongMeasurementUnitException;
|
|
||||||
use AtolOnline\Exceptions\TooLongPaymentAddressException;
|
|
||||||
use AtolOnline\Exceptions\TooLongUserdataException;
|
|
||||||
use AtolOnline\Exceptions\TooManyException;
|
|
||||||
use AtolOnline\Exceptions\TooManyItemsException;
|
|
||||||
use AtolOnline\Exceptions\TooManyPaymentsException;
|
|
||||||
use AtolOnline\Exceptions\TooManyVatsException;
|
|
||||||
use Exception;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Класс, описывающий документ
|
|
||||||
*
|
|
||||||
* @package AtolOnline\Entities
|
|
||||||
*/
|
|
||||||
class todoDocument extends Entity
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* @var ItemArray Массив предметов расчёта
|
|
||||||
*/
|
|
||||||
protected ItemArray $items;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var VatArray Массив ставок НДС
|
|
||||||
*/
|
|
||||||
protected VatArray $vats;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var PaymentArray Массив оплат
|
|
||||||
*/
|
|
||||||
protected PaymentArray $payments;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var Company Объект компании (продавца)
|
|
||||||
*/
|
|
||||||
protected Company $company;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var Client Объект клиента (покупателя)
|
|
||||||
*/
|
|
||||||
protected Client $client;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var float Итоговая сумма чека. Тег ФФД - 1020.
|
|
||||||
*/
|
|
||||||
protected float $total = 0;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var string ФИО кассира. Тег ФФД - 1021.
|
|
||||||
*/
|
|
||||||
protected string $cashier;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var todoCorrectionInfo Данные коррекции
|
|
||||||
*/
|
|
||||||
protected todoCorrectionInfo $correction_info;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* todoDocument constructor.
|
|
||||||
*/
|
|
||||||
public function __construct()
|
|
||||||
{
|
|
||||||
$this->vats = new VatArray();
|
|
||||||
$this->payments = new PaymentArray();
|
|
||||||
$this->items = new ItemArray();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Удаляет все налоги из документа и предметов расчёта
|
|
||||||
*
|
|
||||||
* @return $this
|
|
||||||
* @throws TooManyVatsException Слишком много ставок НДС
|
|
||||||
*/
|
|
||||||
public function clearVats(): todoDocument
|
|
||||||
{
|
|
||||||
$this->setVats([]);
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Добавляет новую ставку НДС в массив ставок НДС
|
|
||||||
*
|
|
||||||
* @param Vat $vat Объект ставки НДС
|
|
||||||
* @return $this
|
|
||||||
* @throws TooManyVatsException Слишком много ставок НДС
|
|
||||||
*/
|
|
||||||
public function addVat(Vat $vat): todoDocument
|
|
||||||
{
|
|
||||||
$this->vats->add($vat);
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Возвращает массив ставок НДС
|
|
||||||
*
|
|
||||||
* @return Vat[]
|
|
||||||
*/
|
|
||||||
public function getVats(): array
|
|
||||||
{
|
|
||||||
return $this->vats->get();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Устанавливает массив ставок НДС
|
|
||||||
*
|
|
||||||
* @param Vat[] $vats Массив ставок НДС
|
|
||||||
* @return $this
|
|
||||||
* @throws TooManyVatsException Слишком много ставок НДС
|
|
||||||
* @throws Exception
|
|
||||||
*/
|
|
||||||
public function setVats(array $vats): todoDocument
|
|
||||||
{
|
|
||||||
$this->vats->set($vats);
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Добавляет новую оплату в массив оплат
|
|
||||||
*
|
|
||||||
* @param todoPayment $payment Объект оплаты
|
|
||||||
* @return $this
|
|
||||||
* @throws Exception
|
|
||||||
* @throws TooManyPaymentsException Слишком много оплат
|
|
||||||
*/
|
|
||||||
public function addPayment(todoPayment $payment): todoDocument
|
|
||||||
{
|
|
||||||
if (count($this->getPayments()) == 0 && !$payment->getSum()) {
|
|
||||||
$payment->setSum($this->calcTotal());
|
|
||||||
}
|
|
||||||
$this->payments->add($payment);
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Возвращает массив оплат
|
|
||||||
*
|
|
||||||
* @return todoPayment[]
|
|
||||||
*/
|
|
||||||
public function getPayments(): array
|
|
||||||
{
|
|
||||||
return $this->payments->get();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Устанавливает массив оплат
|
|
||||||
*
|
|
||||||
* @param todoPayment[] $payments Массив оплат
|
|
||||||
* @return $this
|
|
||||||
* @throws TooManyPaymentsException Слишком много оплат
|
|
||||||
*/
|
|
||||||
public function setPayments(array $payments): todoDocument
|
|
||||||
{
|
|
||||||
$this->payments->set($payments);
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Добавляет новый предмет расчёта в массив предметов расчёта
|
|
||||||
*
|
|
||||||
* @param Item $item Объект предмета расчёта
|
|
||||||
* @return $this
|
|
||||||
* @throws TooManyItemsException Слишком много предметов расчёта
|
|
||||||
*/
|
|
||||||
public function addItem(Item $item): todoDocument
|
|
||||||
{
|
|
||||||
$this->items->add($item);
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Возвращает массив предметов расчёта
|
|
||||||
*
|
|
||||||
* @return Item[]
|
|
||||||
*/
|
|
||||||
public function getItems(): array
|
|
||||||
{
|
|
||||||
return $this->items->get();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Устанавливает массив предметов расчёта
|
|
||||||
*
|
|
||||||
* @param Item[] $items Массив предметов расчёта
|
|
||||||
* @return $this
|
|
||||||
* @throws TooManyItemsException Слишком много предметов расчёта
|
|
||||||
*/
|
|
||||||
public function setItems(array $items): todoDocument
|
|
||||||
{
|
|
||||||
$this->items->set($items);
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Возвращает заданного клиента (покупателя)
|
|
||||||
*
|
|
||||||
* @return Client|null
|
|
||||||
*/
|
|
||||||
public function getClient(): ?Client
|
|
||||||
{
|
|
||||||
return $this->client;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Устанавливает клиента (покупателя)
|
|
||||||
*
|
|
||||||
* @param Client|null $client
|
|
||||||
* @return $this
|
|
||||||
*/
|
|
||||||
public function setClient(?Client $client): todoDocument
|
|
||||||
{
|
|
||||||
$this->client = $client;
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Возвращает заданную компанию (продавца)
|
|
||||||
*
|
|
||||||
* @return Company|null
|
|
||||||
*/
|
|
||||||
public function getCompany(): ?Company
|
|
||||||
{
|
|
||||||
return $this->company;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Устанавливает компанию (продавца)
|
|
||||||
*
|
|
||||||
* @param Company|null $company
|
|
||||||
* @return $this
|
|
||||||
*/
|
|
||||||
public function setCompany(?Company $company): todoDocument
|
|
||||||
{
|
|
||||||
$this->company = $company;
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Возвращает ФИО кассира. Тег ФФД - 1021.
|
|
||||||
*
|
|
||||||
* @return string|null
|
|
||||||
*/
|
|
||||||
public function getCashier(): ?string
|
|
||||||
{
|
|
||||||
return $this->cashier;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Устанавливает ФИО кассира. Тег ФФД - 1021.
|
|
||||||
*
|
|
||||||
* @param string|null $cashier
|
|
||||||
* @return $this
|
|
||||||
* @throws TooLongCashierException
|
|
||||||
*/
|
|
||||||
public function setCashier(?string $cashier): todoDocument
|
|
||||||
{
|
|
||||||
if ($cashier !== null) {
|
|
||||||
$cashier = trim($cashier);
|
|
||||||
if (mb_strlen($cashier) > Constraints::MAX_LENGTH_CASHIER_NAME) {
|
|
||||||
throw new TooLongCashierException($cashier, Constraints::MAX_LENGTH_CASHIER_NAME);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$this->cashier = $cashier;
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Возвращает данные коррекции
|
|
||||||
*
|
|
||||||
* @return todoCorrectionInfo|null
|
|
||||||
*/
|
|
||||||
public function getCorrectionInfo(): ?todoCorrectionInfo
|
|
||||||
{
|
|
||||||
return $this->correction_info;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Устанавливает данные коррекции
|
|
||||||
*
|
|
||||||
* @param todoCorrectionInfo|null $correction_info
|
|
||||||
* @return $this
|
|
||||||
*/
|
|
||||||
public function setCorrectionInfo(?todoCorrectionInfo $correction_info): todoDocument
|
|
||||||
{
|
|
||||||
$this->correction_info = $correction_info;
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Пересчитывает, сохраняет и возвращает итоговую сумму чека по всем позициям (включая НДС). Тег ФФД - 1020.
|
|
||||||
*
|
|
||||||
* @return float
|
|
||||||
* @throws Exception
|
|
||||||
*/
|
|
||||||
public function calcTotal(): float
|
|
||||||
{
|
|
||||||
$sum = 0;
|
|
||||||
$this->clearVats();
|
|
||||||
foreach ($this->items->get() as $item) {
|
|
||||||
$sum += $item->calcSum();
|
|
||||||
$this->addVat(new Vat($item->getVat()->getType(), $item->getSum()));
|
|
||||||
}
|
|
||||||
return $this->total = round($sum, 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Возвращает итоговую сумму чека. Тег ФФД - 1020.
|
|
||||||
*
|
|
||||||
* @return float
|
|
||||||
*/
|
|
||||||
public function getTotal(): float
|
|
||||||
{
|
|
||||||
return $this->total;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Собирает объект документа из сырой json-строки
|
|
||||||
*
|
|
||||||
* @param string $json
|
|
||||||
* @return todoDocument
|
|
||||||
* @throws TooLongEmailException
|
|
||||||
* @throws InvalidEmailException
|
|
||||||
* @throws AtolException
|
|
||||||
* @throws InvalidInnLengthException
|
|
||||||
* @throws InvalidJsonException
|
|
||||||
* @throws TooLongItemNameException
|
|
||||||
* @throws TooLongPaymentAddressException
|
|
||||||
* @throws TooLongClientContactException
|
|
||||||
* @throws TooHighPriceException
|
|
||||||
* @throws TooManyException
|
|
||||||
* @throws TooManyItemsException
|
|
||||||
* @throws TooManyPaymentsException
|
|
||||||
* @throws TooLongMeasurementUnitException
|
|
||||||
* @throws TooLongUserdataException
|
|
||||||
* @throws Exception
|
|
||||||
*/
|
|
||||||
public static function fromRaw(string $json): todoDocument
|
|
||||||
{
|
|
||||||
$array = json_decode($json, true);
|
|
||||||
if (json_last_error() !== JSON_ERROR_NONE) {
|
|
||||||
throw new InvalidJsonException();
|
|
||||||
}
|
|
||||||
$doc = new self();
|
|
||||||
if (isset($array['company'])) {
|
|
||||||
$doc->setCompany(new Company(
|
|
||||||
$array['company']['sno'] ?? null,
|
|
||||||
$array['company']['inn'] ?? null,
|
|
||||||
$array['company']['payment_address'] ?? null,
|
|
||||||
$array['company']['email'] ?? null
|
|
||||||
));
|
|
||||||
}
|
|
||||||
if (isset($array['client'])) {
|
|
||||||
$doc->setClient(new Client(
|
|
||||||
$array['client']['name'] ?? null,
|
|
||||||
$array['client']['phone'] ?? null,
|
|
||||||
$array['client']['email'] ?? null,
|
|
||||||
$array['client']['inn'] ?? null
|
|
||||||
));
|
|
||||||
}
|
|
||||||
if (isset($array['correction_info'])) {
|
|
||||||
$doc->setCorrectionInfo(new todoCorrectionInfo(
|
|
||||||
$array['correction_info']['type'] ?? null,
|
|
||||||
$array['correction_info']['base_date'] ?? null,
|
|
||||||
$array['correction_info']['base_number'] ?? null,
|
|
||||||
$array['correction_info']['base_name'] ?? null,
|
|
||||||
));
|
|
||||||
}
|
|
||||||
if (isset($array['items'])) {
|
|
||||||
foreach ($array['items'] as $ar_item) {
|
|
||||||
$item = new Item(
|
|
||||||
$ar_item['name'] ?? null,
|
|
||||||
$ar_item['price'] ?? null,
|
|
||||||
$ar_item['quantity'] ?? null,
|
|
||||||
$ar_item['measurement_unit'] ?? null,
|
|
||||||
$ar_item['vat']['type'] ?? null,
|
|
||||||
$ar_item['payment_object'] ?? null,
|
|
||||||
$ar_item['payment_method'] ?? null
|
|
||||||
);
|
|
||||||
if (!empty($ar_item['user_data'])) {
|
|
||||||
$item->setUserData($ar_item['user_data'] ?? null);
|
|
||||||
}
|
|
||||||
$doc->addItem($item);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (isset($array['payments'])) {
|
|
||||||
foreach ($array['payments'] as $ar_payment) {
|
|
||||||
$payment = new todoPayment();
|
|
||||||
if (isset($ar_payment['type'])) {
|
|
||||||
$payment->setType($ar_payment['type']);
|
|
||||||
}
|
|
||||||
if (isset($ar_payment['sum'])) {
|
|
||||||
$payment->setSum($ar_payment['sum']);
|
|
||||||
}
|
|
||||||
$doc->payments->add($payment);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (isset($array['vats'])) {
|
|
||||||
foreach ($array['vats'] as $vat_payment) {
|
|
||||||
$vat = new Vat();
|
|
||||||
if (isset($vat_payment['type'])) {
|
|
||||||
$vat->setType($vat_payment['type']);
|
|
||||||
}
|
|
||||||
if (isset($vat_payment['sum'])) {
|
|
||||||
$vat->setSum($vat_payment['sum']);
|
|
||||||
}
|
|
||||||
$doc->vats->add($vat);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (isset($array['total']) && $array['total'] != $doc->calcTotal()) {
|
|
||||||
throw new AtolException('Real total sum not equals to provided in JSON one');
|
|
||||||
}
|
|
||||||
return $doc;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Возвращает массив для кодирования в json
|
|
||||||
*
|
|
||||||
* @throws Exception
|
|
||||||
*/
|
|
||||||
public function jsonSerialize(): array
|
|
||||||
{
|
|
||||||
if ($this->getCompany()) {
|
|
||||||
$json['company'] = $this->getCompany()->jsonSerialize(); // обязательно
|
|
||||||
}
|
|
||||||
if ($this->getPayments()) {
|
|
||||||
$json['payments'] = $this->payments->jsonSerialize(); // обязательно
|
|
||||||
}
|
|
||||||
if ($this->getCashier()) {
|
|
||||||
$json['cashier'] = $this->getCashier();
|
|
||||||
}
|
|
||||||
if ($this->getCorrectionInfo()) {
|
|
||||||
$json['correction_info'] = $this->getCorrectionInfo()->jsonSerialize(); // обязательно для коррекционных
|
|
||||||
} else {
|
|
||||||
if ($this->getClient()) {
|
|
||||||
$json['client'] = $this->getClient()->jsonSerialize(); // обязательно для некоррекционных
|
|
||||||
}
|
|
||||||
if ($this->getItems()) {
|
|
||||||
$json['items'] = $this->items->jsonSerialize(); // обязательно для некоррекционных
|
|
||||||
}
|
|
||||||
$json['total'] = $this->calcTotal(); // обязательно для некоррекционных
|
|
||||||
}
|
|
||||||
if ($this->getVats()) {
|
|
||||||
$json['vats'] = $this->vats->jsonSerialize();
|
|
||||||
}
|
|
||||||
return $json;
|
|
||||||
}
|
|
||||||
}
|
|
@ -14,12 +14,12 @@ namespace AtolOnline\Exceptions;
|
|||||||
use AtolOnline\Constants\Ffd105Tags;
|
use AtolOnline\Constants\Ffd105Tags;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Исключение, возникающее при пустом наименовании дополнительного реквизита
|
* Исключение, возникающее при пустом наименовании дополнительного реквизита пользователя
|
||||||
*
|
*
|
||||||
* @see https://online.atol.ru/files/API_atol_online_v4.pdf Документация, стр 32
|
* @see https://online.atol.ru/files/API_atol_online_v4.pdf Документация, стр 32
|
||||||
*/
|
*/
|
||||||
class EmptyAddUserPropNameException extends AtolException
|
class EmptyAddUserPropNameException extends AtolException
|
||||||
{
|
{
|
||||||
protected $message = 'Наименование дополнительного реквизита не может быть пустым';
|
protected $message = 'Наименование дополнительного реквизита пользователя не может быть пустым';
|
||||||
protected array $ffd_tags = [Ffd105Tags::DOC_ADD_USER_PROP_NAME];
|
protected array $ffd_tags = [Ffd105Tags::DOC_ADD_USER_PROP_NAME];
|
||||||
}
|
}
|
||||||
|
@ -14,12 +14,12 @@ namespace AtolOnline\Exceptions;
|
|||||||
use AtolOnline\Constants\Ffd105Tags;
|
use AtolOnline\Constants\Ffd105Tags;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Исключение, возникающее при пустом наименовании дополнительного реквизита
|
* Исключение, возникающее при пустом наименовании дополнительного реквизита пользователя
|
||||||
*
|
*
|
||||||
* @see https://online.atol.ru/files/API_atol_online_v4.pdf Документация, стр 32
|
* @see https://online.atol.ru/files/API_atol_online_v4.pdf Документация, стр 32
|
||||||
*/
|
*/
|
||||||
class EmptyAddUserPropValueException extends AtolException
|
class EmptyAddUserPropValueException extends AtolException
|
||||||
{
|
{
|
||||||
protected $message = 'Значение дополнительного реквизита не может быть пустым';
|
protected $message = 'Значение дополнительного реквизита пользователя не может быть пустым';
|
||||||
protected array $ffd_tags = [Ffd105Tags::DOC_ADD_USER_PROP_NAME];
|
protected array $ffd_tags = [Ffd105Tags::DOC_ADD_USER_PROP_VALUE];
|
||||||
}
|
}
|
||||||
|
28
src/Exceptions/TooLongAddCheckPropException.php
Normal file
28
src/Exceptions/TooLongAddCheckPropException.php
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2020-2021 Антон Аксенов (Anthony Axenov)
|
||||||
|
*
|
||||||
|
* This code is licensed under MIT.
|
||||||
|
* Этот код распространяется по лицензии MIT.
|
||||||
|
* https://github.com/anthonyaxenov/atol-online/blob/master/LICENSE
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types = 1);
|
||||||
|
|
||||||
|
namespace AtolOnline\Exceptions;
|
||||||
|
|
||||||
|
use AtolOnline\Constants\{
|
||||||
|
Constraints,
|
||||||
|
Ffd105Tags};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Исключение, возникающее при попытке указать слишком длинное наименование дополнительного реквизита чека
|
||||||
|
*
|
||||||
|
* @see https://online.atol.ru/files/API_atol_online_v4.pdf Документация, стр 32
|
||||||
|
*/
|
||||||
|
class TooLongAddCheckPropException extends TooLongException
|
||||||
|
{
|
||||||
|
protected $message = 'Слишком длинное наименование дополнительного реквизита чека';
|
||||||
|
protected float $max = Constraints::MAX_LENGTH_ADD_CHECK_PROP;
|
||||||
|
protected array $ffd_tags = [Ffd105Tags::DOC_ADD_CHECK_PROP_VALUE];
|
||||||
|
}
|
@ -16,13 +16,13 @@ use AtolOnline\Constants\{
|
|||||||
Ffd105Tags};
|
Ffd105Tags};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Исключение, возникающее при попытке указать слишком длинное наименование дополнительного реквизита
|
* Исключение, возникающее при попытке указать слишком длинное наименование дополнительного реквизита пользователя
|
||||||
*
|
*
|
||||||
* @see https://online.atol.ru/files/API_atol_online_v4.pdf Документация, стр 32
|
* @see https://online.atol.ru/files/API_atol_online_v4.pdf Документация, стр 32
|
||||||
*/
|
*/
|
||||||
class TooLongAddUserPropNameException extends TooLongException
|
class TooLongAddUserPropNameException extends TooLongException
|
||||||
{
|
{
|
||||||
protected $message = 'Слишком длинное наименование дополнительного реквизита';
|
protected $message = 'Слишком длинное наименование дополнительного реквизита пользователя';
|
||||||
protected float $max = Constraints::MAX_LENGTH_ADD_USER_PROP_NAME;
|
protected float $max = Constraints::MAX_LENGTH_ADD_USER_PROP_NAME;
|
||||||
protected array $ffd_tags = [Ffd105Tags::DOC_ADD_USER_PROP_NAME];
|
protected array $ffd_tags = [Ffd105Tags::DOC_ADD_USER_PROP_NAME];
|
||||||
}
|
}
|
||||||
|
@ -16,13 +16,13 @@ use AtolOnline\Constants\{
|
|||||||
Ffd105Tags};
|
Ffd105Tags};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Исключение, возникающее при попытке указать слишком длинное значение дополнительного реквизита
|
* Исключение, возникающее при попытке указать слишком длинное значение дополнительного реквизита пользователя
|
||||||
*
|
*
|
||||||
* @see https://online.atol.ru/files/API_atol_online_v4.pdf Документация, стр 32
|
* @see https://online.atol.ru/files/API_atol_online_v4.pdf Документация, стр 32
|
||||||
*/
|
*/
|
||||||
class TooLongAddUserPropValueException extends TooLongException
|
class TooLongAddUserPropValueException extends TooLongException
|
||||||
{
|
{
|
||||||
protected $message = 'Слишком длинное значение дополнительного реквизита';
|
protected $message = 'Слишком длинное значение дополнительного реквизита пользователя';
|
||||||
protected float $max = Constraints::MAX_LENGTH_ADD_USER_PROP_VALUE;
|
protected float $max = Constraints::MAX_LENGTH_ADD_USER_PROP_VALUE;
|
||||||
protected array $ffd_tags = [Ffd105Tags::DOC_ADD_USER_PROP_VALUE];
|
protected array $ffd_tags = [Ffd105Tags::DOC_ADD_USER_PROP_VALUE];
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user