mirror of
https://github.com/anthonyaxenov/atol-online.git
synced 2024-11-22 17:24:33 +00:00
Compare commits
6 Commits
71d1f2900c
...
9fa55e7c5f
Author | SHA1 | Date | |
---|---|---|---|
9fa55e7c5f | |||
2e8099e0a4 | |||
d7f3c81fac | |||
e22c1cb091 | |||
58bc344a86 | |||
fdc5ab112a |
2
.github/FUNDING.yml
vendored
2
.github/FUNDING.yml
vendored
@ -1,3 +1,3 @@
|
|||||||
github: anthonyaxenov
|
#github: anthonyaxenov
|
||||||
patreon: anthonyaxenov
|
patreon: anthonyaxenov
|
||||||
custom: [ 'https://yoomoney.ru/to/41001685237530' ]
|
custom: [ 'https://yoomoney.ru/to/41001685237530' ]
|
||||||
|
2
.github/workflows/ci.yml
vendored
2
.github/workflows/ci.yml
vendored
@ -6,7 +6,7 @@ on:
|
|||||||
push:
|
push:
|
||||||
branches: [ master, dev ]
|
branches: [ master, dev ]
|
||||||
pull_request:
|
pull_request:
|
||||||
branches: [ master, dev ]
|
branches: [ dev ]
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
Tests:
|
Tests:
|
||||||
|
30
README.md
30
README.md
@ -6,36 +6,30 @@
|
|||||||
[![Total Downloads](https://img.shields.io/packagist/dt/axenov/atol-online)](https://packagist.org/packages/axenov/atol-online)
|
[![Total Downloads](https://img.shields.io/packagist/dt/axenov/atol-online)](https://packagist.org/packages/axenov/atol-online)
|
||||||
[![License](https://img.shields.io/packagist/l/axenov/atol-online?color=%23369883)](LICENSE)
|
[![License](https://img.shields.io/packagist/l/axenov/atol-online?color=%23369883)](LICENSE)
|
||||||
|
|
||||||
Библиотека для фискализации чеков по 54-ФЗ через [облачную ККТ АТОЛ](https://online.atol.ru/).
|
Библиотека для фискализации чеков по 54-ФЗ через [облачные ККТ АТОЛ](https://online.atol.ru/).
|
||||||
|
|
||||||
**[Документация](/docs/readme.md)**
|
**[Документация](/docs/readme.md)**
|
||||||
|
|
||||||
---
|
Текущие поддерживаемые версии АТОЛ Онлайн:
|
||||||
|
|
||||||
**В ветке `dev` проводится глубокий рефакторинг, стабилизация и активная подготовка к `v1.0.0`.
|
| Протокол | API | ФФД | Статус |
|
||||||
Документация актуализируется постепенно.**
|
|----------|-----|------|----------------|
|
||||||
|
| v4 | 5.8 | 1.05 | Поддерживается |
|
||||||
|
| v5 | 2.0 | 1.2 | В планах |
|
||||||
|
|
||||||
---
|
Состояние веток:
|
||||||
|
|
||||||
| master | [![GitHub Workflow Status (master)](https://img.shields.io/github/workflow/status/anthonyaxenov/atol-online/CI/master?logo=github)](https://github.com/anthonyaxenov/atol-online/actions/workflows/ci.yml) | [![codecov](https://codecov.io/gh/anthonyaxenov/atol-online/branch/master/graph/badge.svg?token=WR2IV7FTF0)](https://codecov.io/gh/anthonyaxenov/atol-online) |
|
| master | [![GitHub Workflow Status (master)](https://img.shields.io/github/workflow/status/anthonyaxenov/atol-online/CI/master?logo=github)](https://github.com/anthonyaxenov/atol-online/actions/workflows/ci.yml) | [![codecov](https://codecov.io/gh/anthonyaxenov/atol-online/branch/master/graph/badge.svg?token=WR2IV7FTF0)](https://codecov.io/gh/anthonyaxenov/atol-online) |
|
||||||
|--------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
|--------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||||
| dev | [![GitHub Workflow Status (dev)](https://img.shields.io/github/workflow/status/anthonyaxenov/atol-online/CI/dev?logo=github)](https://github.com/anthonyaxenov/atol-online/actions/workflows/ci.yml) | [![codecov dev](https://codecov.io/gh/anthonyaxenov/atol-online/branch/dev/graph/badge.svg?token=WR2IV7FTF0)](https://codecov.io/gh/anthonyaxenov/atol-online) |
|
| dev | [![GitHub Workflow Status (dev)](https://img.shields.io/github/workflow/status/anthonyaxenov/atol-online/CI/dev?logo=github)](https://github.com/anthonyaxenov/atol-online/actions/workflows/ci.yml) | [![codecov dev](https://codecov.io/gh/anthonyaxenov/atol-online/branch/dev/graph/badge.svg?token=WR2IV7FTF0)](https://codecov.io/gh/anthonyaxenov/atol-online) |
|
||||||
|
|
||||||
Текущие поддерживаемые версии АТОЛ Онлайн:
|
|
||||||
|
|
||||||
| Протокол | API | ФФД | Статус |
|
|
||||||
|----------|-----|------|-------------|
|
|
||||||
| v4 | 5.8 | 1.05 | Рефакторинг |
|
|
||||||
| v5 | 2.0 | 1.2 | В планах |
|
|
||||||
|
|
||||||
## Плюшечки
|
## Плюшечки
|
||||||
|
|
||||||
* Мониторинг ККТ и ФН
|
* Мониторинг ККТ и ФН
|
||||||
* Фискализация докумнетов на облачной ККТ
|
* Фискализация докумнетов на облачной ККТ
|
||||||
* Валидация данных до отправки документа на ККТ (насколько это возможно, согласно схеме)
|
* Валидация данных до отправки документа на ККТ (насколько это возможно, согласно схеме)
|
||||||
* Расчёты денег в копейках
|
* Расчёты денег в копейках
|
||||||
* PSR-4 автозагрузка
|
* PSR-4 автозагрузка, покрытие настоящими тестами, fluent-setters
|
||||||
<!--* Фактически полное покрытие тестами-->
|
|
||||||
|
|
||||||
## Системные требования
|
## Системные требования
|
||||||
|
|
||||||
@ -51,7 +45,7 @@
|
|||||||
|
|
||||||
### Подключение библиотеки
|
### Подключение библиотеки
|
||||||
|
|
||||||
1. Установить библиотеку пакет к проекту:
|
1. Подключить пакет к проекту:
|
||||||
```bash
|
```bash
|
||||||
composer require axenov/atol-online
|
composer require axenov/atol-online
|
||||||
```
|
```
|
||||||
@ -70,10 +64,10 @@
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
composer test # обычное тестирование
|
composer test # обычное тестирование
|
||||||
composer test-cov # тестирование с покрытием
|
composer coverage # тестирование с покрытием
|
||||||
```
|
```
|
||||||
|
|
||||||
После тестирования с покрытием создаётся отчёт в директории `.coverage-report` в корне репозитория.
|
После тестирования с покрытием создаётся отчёт в директории `.coverage` в корне репозитория.
|
||||||
|
|
||||||
## Использование библиотеки
|
## Использование библиотеки
|
||||||
|
|
||||||
@ -90,8 +84,6 @@ composer test-cov # тестирование с покрытием
|
|||||||
|
|
||||||
## Дополнительные ресурсы
|
## Дополнительные ресурсы
|
||||||
|
|
||||||
* **[Документация к библиотеке](/docs/readme.md)**
|
|
||||||
* Telegram-канал: [@atolonline_php](https://t.me/atolonline_php)
|
|
||||||
* [Документация АТОЛ Онлайн](https://online.atol.ru/lib/)
|
* [Документация АТОЛ Онлайн](https://online.atol.ru/lib/)
|
||||||
|
|
||||||
## Лицензия
|
## Лицензия
|
||||||
|
@ -1,67 +0,0 @@
|
|||||||
# Работа с клиентами (покупателями)
|
|
||||||
|
|
||||||
[Вернуться к содержанию](readme.md)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
Объект покупателя инициализируется следующим образом:
|
|
||||||
|
|
||||||
```php
|
|
||||||
$customer = new AtolOnline\Entities\Client();
|
|
||||||
```
|
|
||||||
|
|
||||||
У объекта покупателя могут быть указаны любые из следующих атрибутов:
|
|
||||||
* email (тег ФФД 1008);
|
|
||||||
* ИНН (тег ФФД 1128);
|
|
||||||
* наименование (тег ФФД 1127);
|
|
||||||
* номер телефона (тег ФФД 1008).
|
|
||||||
|
|
||||||
> Все эти атрибуты являются **необязательными**.
|
|
||||||
> Если указаны одновременно и email, и номер телефона, то ОФД отправит чек только на email.
|
|
||||||
|
|
||||||
Указать эти атрибуты можно двумя способами:
|
|
||||||
|
|
||||||
```php
|
|
||||||
// 1 способ - через конструктор
|
|
||||||
$customer = new AtolOnline\Entities\Client(
|
|
||||||
'John Doe', // наименование
|
|
||||||
'john@example.com', // email
|
|
||||||
'+1/22/99*73s dsdas654 5s6', // номер телефона +122997365456
|
|
||||||
'+fasd3\qe3fs_=nac990139928czc' // номер ИНН 3399013928
|
|
||||||
);
|
|
||||||
|
|
||||||
// 2 способ - через сеттеры
|
|
||||||
$customer = (new AtolOnline\Entities\Client())
|
|
||||||
->setEmail('john@example.com')
|
|
||||||
->setInn('+fasd3\q3fs_=nac9901 3928c-c')
|
|
||||||
->setName('John Doe')
|
|
||||||
->setPhone('+1/22/99*73s dsdas654 5s6');
|
|
||||||
|
|
||||||
// либо комбинация этих способов
|
|
||||||
```
|
|
||||||
|
|
||||||
Получить установленные значения атрибутов можно через геттеры:
|
|
||||||
|
|
||||||
```php
|
|
||||||
$customer->getInn();
|
|
||||||
$customer->getEmail();
|
|
||||||
$customer->getName();
|
|
||||||
$customer->getPhone();
|
|
||||||
```
|
|
||||||
|
|
||||||
Объект класса приводится к JSON-строке автоматически или принудительно:
|
|
||||||
|
|
||||||
```php
|
|
||||||
echo $customer;
|
|
||||||
$json_string = (string)$customer;
|
|
||||||
```
|
|
||||||
|
|
||||||
Чтобы получить те же данные в виде массива, нужно вызвать метод `jsonSerialize()`:
|
|
||||||
|
|
||||||
```php
|
|
||||||
$json_array = $customer->jsonSerialize();
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
[Вернуться к содержанию](readme.md)
|
|
19
docs/collection.md
Normal file
19
docs/collection.md
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
# Коллекция сущностей
|
||||||
|
|
||||||
|
[Вернуться к содержанию](readme.md#toc)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Коллекциями являются объекты, способные хранить в себе [сущности](entity.md). Они унаследованы
|
||||||
|
от `Illuminate/Support/Collection` и полностью поддерживают все
|
||||||
|
[стандартные методы коллекций Laravel](https://laravel.com/docs/master/collections).
|
||||||
|
|
||||||
|
Помимо этого, они валидируют количество и вид сущностей, которые могут хранить в себе, согласно схеме АТОЛ Онлайн API.
|
||||||
|
|
||||||
|
Коллекции ведут себя аналогично самим сущностям в части приведения к массивам и json-ификации.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Читай также: [Сущность](entity.md)
|
||||||
|
|
||||||
|
[Вернуться к содержанию](readme.md#toc)
|
@ -1,67 +0,0 @@
|
|||||||
# Работа с компанией (продавцом)
|
|
||||||
|
|
||||||
[Вернуться к содержанию](readme.md)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
Объект компании инициализируется следующим образом:
|
|
||||||
|
|
||||||
```php
|
|
||||||
$customer = new AtolOnline\Entities\Company();
|
|
||||||
```
|
|
||||||
|
|
||||||
У объекта компании должны быть указаны все следующие атрибуты:
|
|
||||||
* email (тег ФФД 1117);
|
|
||||||
* ИНН (тег ФФД 1018);
|
|
||||||
* тип системы налогообложения (тег ФФД 1055) - все типы перечислены в классе `AtolOnline\Constants\SnoTypes`;
|
|
||||||
* адрес места расчётов (тег ФФД 1187) - для интернет-сервисов указывается URL с протоколом.
|
|
||||||
|
|
||||||
> Все эти атрибуты являются **обязательными**.
|
|
||||||
> Для тестового режима используйте значения ИНН и адреса места расчётов, [указанные здесь](https://online.atol.ru/files/ffd/test_sreda.txt).
|
|
||||||
|
|
||||||
Указать эти атрибуты можно двумя способами:
|
|
||||||
|
|
||||||
```php
|
|
||||||
// 1 способ - через конструктор (все аргументы обязательны)
|
|
||||||
$company = new AtolOnline\Entities\Company(
|
|
||||||
'company@example.com' // email
|
|
||||||
AtolOnline\Constants\SnoTypes::OSN, // тип СНО
|
|
||||||
'5544332219', // номер ИНН
|
|
||||||
'https://v4.online.atol.ru', // адрес места расчётов
|
|
||||||
);
|
|
||||||
|
|
||||||
// 2 способ - через сеттеры
|
|
||||||
$company
|
|
||||||
->setEmail('company@example.com')
|
|
||||||
->setInn('5544332219')
|
|
||||||
->setSno(AtolOnline\Constants\SnoTypes::USN_INCOME)
|
|
||||||
->setPaymentAddress('https://v4.online.atol.ru');
|
|
||||||
|
|
||||||
// либо комбинация этих способов
|
|
||||||
```
|
|
||||||
|
|
||||||
Получить установленные значения параметров можно через геттеры:
|
|
||||||
|
|
||||||
```php
|
|
||||||
$company->getInn();
|
|
||||||
$company->getEmail();
|
|
||||||
$company->getPaymentAddress();
|
|
||||||
$company->getSno();
|
|
||||||
```
|
|
||||||
|
|
||||||
Объект класса приводится к JSON-строке автоматически или принудительно:
|
|
||||||
|
|
||||||
```php
|
|
||||||
echo $company;
|
|
||||||
$json_string = (string)$company;
|
|
||||||
```
|
|
||||||
|
|
||||||
Чтобы получить те же данные в виде массива, нужно вызвать метод `jsonSerialize()`:
|
|
||||||
|
|
||||||
```php
|
|
||||||
$json_array = $company->jsonSerialize();
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
[Вернуться к содержанию](readme.md)
|
|
@ -1,62 +0,0 @@
|
|||||||
# Работа с данными коррекции
|
|
||||||
|
|
||||||
[Вернуться к содержанию](readme.md)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
Объект для данных коррекции инициализируется следующим образом:
|
|
||||||
|
|
||||||
```php
|
|
||||||
$info = new AtolOnline\Entities\CorrectionInfo();
|
|
||||||
```
|
|
||||||
|
|
||||||
У объекта должны быть указаны все следующие обязательные атрибуты:
|
|
||||||
* тип коррекции (тег ФФД 1173) - все типы перечислены в классе `AtolOnline\Constants\CorrectionTypes`;
|
|
||||||
* дата документа основания для коррекции в формате `d.m.Y` (тег ФФД 1178);
|
|
||||||
* номер документа основания для коррекции (тег ФФД 1179).
|
|
||||||
|
|
||||||
Указать эти атрибуты можно двумя способами:
|
|
||||||
|
|
||||||
```php
|
|
||||||
use AtolOnline\{Entities\CorrectionInfo, Constants\CorrectionTypes};
|
|
||||||
|
|
||||||
// 1 способ - через конструктор
|
|
||||||
$info = new CorrectionInfo(
|
|
||||||
CorrectionTypes::SELF, // тип коррекции
|
|
||||||
'01.01.2019', // дата документа коррекции
|
|
||||||
'12345', // номер документа коррекции
|
|
||||||
);
|
|
||||||
|
|
||||||
// 2 способ - через сеттеры
|
|
||||||
$info = (new CorrectionInfo())
|
|
||||||
->setType(CorrectionTypes::INSTRUCTION)
|
|
||||||
->setDate('01.01.2019')
|
|
||||||
->setNumber('9999');
|
|
||||||
|
|
||||||
// либо комбинация этих способов
|
|
||||||
```
|
|
||||||
|
|
||||||
Получить установленные значения атрибутов можно через геттеры:
|
|
||||||
|
|
||||||
```php
|
|
||||||
$info->getType();
|
|
||||||
$info->getDate();
|
|
||||||
$info->getNumber();
|
|
||||||
```
|
|
||||||
|
|
||||||
Объект класса приводится к JSON-строке автоматически или принудительным приведением к `string`:
|
|
||||||
|
|
||||||
```php
|
|
||||||
echo $customer;
|
|
||||||
$json_string = (string)$customer;
|
|
||||||
```
|
|
||||||
|
|
||||||
Чтобы получить те же данные в виде массива, нужно вызвать метод `jsonSerialize()`:
|
|
||||||
|
|
||||||
```php
|
|
||||||
$json_array = $customer->jsonSerialize();
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
[Вернуться к содержанию](readme.md)
|
|
@ -1,167 +0,0 @@
|
|||||||
# Работа с документами
|
|
||||||
|
|
||||||
[Вернуться к содержанию](readme.md)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
Объект документа инициализируется следующим образом:
|
|
||||||
|
|
||||||
```php
|
|
||||||
$doc = new AtolOnline\Entities\Document();
|
|
||||||
```
|
|
||||||
|
|
||||||
Для документов **прихода, возврата прихода, расхода и возврата расхода** должны быть указаны все следующие обязательные атрибуты:
|
|
||||||
* [клиент](/docs/client.md);
|
|
||||||
* [компания](/docs/company.md);
|
|
||||||
* [предметы расчёта](/docs/items.md);
|
|
||||||
* [оплаты](/docs/payments.md).
|
|
||||||
|
|
||||||
Для документов **коррекции прихода и коррекции расхода** должны быть указаны все следующие обязательные атрибуты:
|
|
||||||
* [компания](/docs/company.md);
|
|
||||||
* [оплаты](/docs/payments.md);
|
|
||||||
* [ставки НДС](/docs/vats.md);
|
|
||||||
* [данные коррекции](/docs/correction_info.md).
|
|
||||||
|
|
||||||
Для любых документов также могут быть указаны следующие необязательные атрибуты:
|
|
||||||
* ФИО кассира (тег ФФД - 1021).
|
|
||||||
|
|
||||||
Установка атрибутов документа происходит через сеттеры.
|
|
||||||
|
|
||||||
## Работа с клиентом
|
|
||||||
|
|
||||||
Для этого существуют следующие методы:
|
|
||||||
|
|
||||||
```php
|
|
||||||
$doc->setClient($client);
|
|
||||||
$doc->getClient();
|
|
||||||
```
|
|
||||||
|
|
||||||
> О работе с клиентами более подробно читайте [здесь](/docs/client.md).
|
|
||||||
|
|
||||||
## Работа с компанией
|
|
||||||
|
|
||||||
Для этого существуют следующие методы:
|
|
||||||
|
|
||||||
```php
|
|
||||||
$doc->setCompany($company);
|
|
||||||
$doc->getCompany();
|
|
||||||
```
|
|
||||||
|
|
||||||
> О работе с компаниями более подробно читайте [здесь](/docs/company.md).
|
|
||||||
|
|
||||||
## Работа с предметами расчёта
|
|
||||||
|
|
||||||
Внутри документа существует [массив предметов расчёта](/docs/items.md#array).
|
|
||||||
По умолчанию он пуст.
|
|
||||||
Напрямую для манипуляций объект массива недоступен.
|
|
||||||
Работа с ним происходит через методы документа:
|
|
||||||
|
|
||||||
```php
|
|
||||||
$doc->setItems([$item1, $item2]);
|
|
||||||
$doc->addItem($item3);
|
|
||||||
$doc->getItems();
|
|
||||||
```
|
|
||||||
|
|
||||||
Соответственно, эти методы выбрасывают те же исключения, что методы самого массива.
|
|
||||||
|
|
||||||
## Работа с оплатами
|
|
||||||
|
|
||||||
Внутри документа существует [массив оплат](/docs/payments.md#array).
|
|
||||||
По умолчанию он пуст.
|
|
||||||
Напрямую для манипуляций объект массива недоступен.
|
|
||||||
Работа с ним происходит через методы документа:
|
|
||||||
|
|
||||||
```php
|
|
||||||
$doc->setPayments([$payment1, $payment2]);
|
|
||||||
$doc->addPayment($payment3);
|
|
||||||
$doc->getPayments();
|
|
||||||
```
|
|
||||||
|
|
||||||
Соответственно, эти методы выбрасывают те же исключения, что методы самого массива.
|
|
||||||
|
|
||||||
Следует отметить, что если при выполнении метода `addPayment()` выполняются следующие условия:
|
|
||||||
* аргументом передан объект оплаты, у которого не задана сумма,
|
|
||||||
* ранее документу не задавались оплаты,
|
|
||||||
то автоматически этому объекту оплаты задаётся полная сумма чека.
|
|
||||||
|
|
||||||
## Работа со ставками НДС
|
|
||||||
|
|
||||||
Внутри документа существует [массив ставок НДС](/docs/vats.md#array).
|
|
||||||
По умолчанию он пуст.
|
|
||||||
Напрямую для манипуляций объект массива недоступен.
|
|
||||||
Работа с ним происходит через методы документа:
|
|
||||||
|
|
||||||
```php
|
|
||||||
$doc->setVats([$vat1, $vat2]);
|
|
||||||
$doc->addVat($vat3);
|
|
||||||
$doc->getVats();
|
|
||||||
```
|
|
||||||
|
|
||||||
Соответственно, эти методы выбрасывают те же исключения, что методы самого массива.
|
|
||||||
|
|
||||||
Также существует метод `clearVats()`, который удаляет все вложенные объекты ставок НДС - из предметов расчёта и самого документа.
|
|
||||||
|
|
||||||
Следует отметить, что если при выполнении метода `addVat()` выполняются следующие условия:
|
|
||||||
* аргументом передан объект ставки, у которого не задана сумма,
|
|
||||||
* ранее документу не задавались ставки,
|
|
||||||
то автоматически этому объекту налога задаётся полная сумма чека, от которой расчитывается итоговый размер налога.
|
|
||||||
|
|
||||||
## Общая сумма документа
|
|
||||||
|
|
||||||
Расчёт происходит автоматически в следующих случаях:
|
|
||||||
* изменение предметов расчёта (`setItems()`, `addItem()`);
|
|
||||||
* добавление оплат (`addPayment()` в случае, когда оплата передана без суммы);
|
|
||||||
* изменение ставок НДС (`setVats()`, `clearVats()`, `addVat()` в случае, когда ставка передана без суммы);
|
|
||||||
* приведение объекта документа к строке.
|
|
||||||
|
|
||||||
Также можно вызвать вручную метод `calcTotal()`.
|
|
||||||
Он расчитывает полную сумму чека по предметам расчёта и пересчитывает **все** налоговые ставки.
|
|
||||||
|
|
||||||
Получить итог можно с помощью метода `getTotal()`.
|
|
||||||
|
|
||||||
Всё в рублях.
|
|
||||||
|
|
||||||
<a name='correction'></a>
|
|
||||||
## Работа с данными коррекции
|
|
||||||
|
|
||||||
Если документ создаётся с целью коррекции прихода или расхода, то он обязательно должен содержать [данные коррекции](/docs/correction_info.md).
|
|
||||||
|
|
||||||
Задать и получить эти данные очень просто:
|
|
||||||
|
|
||||||
```php
|
|
||||||
$doc->setCorrectionInfo(new AtolOnline\Entities\CorrectionInfo(
|
|
||||||
AtolOnline\Constants\CorrectionTypes::SELF, // тип коррекции
|
|
||||||
'01.01.2019', // дата документа коррекции
|
|
||||||
'12345', // номер документа коррекции
|
|
||||||
'test' // описание коррекции
|
|
||||||
));
|
|
||||||
$doc->getCorrectionInfo();
|
|
||||||
```
|
|
||||||
|
|
||||||
## Работа с кассиром
|
|
||||||
|
|
||||||
Для этого существуют следующие методы:
|
|
||||||
|
|
||||||
```php
|
|
||||||
$doc->setCashier('Иванова Лариса Васильевна');
|
|
||||||
$doc->getCashier();
|
|
||||||
```
|
|
||||||
|
|
||||||
## Прочее
|
|
||||||
|
|
||||||
Объект класса приводится к JSON-строке автоматически или принудительным приведением к `string`:
|
|
||||||
|
|
||||||
```php
|
|
||||||
echo $doc;
|
|
||||||
$json_string = (string)$doc;
|
|
||||||
```
|
|
||||||
|
|
||||||
Чтобы получить те же данные в виде массива, нужно вызвать метод `jsonSerialize()`:
|
|
||||||
|
|
||||||
```php
|
|
||||||
$json_array = $doc->jsonSerialize();
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
[Вернуться к содержанию](readme.md)
|
|
52
docs/entity.md
Normal file
52
docs/entity.md
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
# Сущность
|
||||||
|
|
||||||
|
[Вернуться к содержанию](readme.md#toc)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Сущностями являются все классы, которые необходимы для взаимодействия с API. Они находятся в директори `src/Entities` и
|
||||||
|
расширяют абстрактный класс `AtolOnline\Entities\Entity`.
|
||||||
|
|
||||||
|
Каждая сущность содержит в себе только те данные, которые необходимы согласно схемы АТОЛ Онлайн API.
|
||||||
|
|
||||||
|
Ниже перечислены возможности сущностей.
|
||||||
|
|
||||||
|
## Приведение к строке JSON
|
||||||
|
|
||||||
|
```php
|
||||||
|
echo $entity;
|
||||||
|
$json_string = (string)$entity;
|
||||||
|
```
|
||||||
|
|
||||||
|
## Приведение к массиву
|
||||||
|
|
||||||
|
```php
|
||||||
|
// результат идентичен
|
||||||
|
$json_array1 = $entity->jsonSerialize();
|
||||||
|
$json_array2 = $entity->toArray();
|
||||||
|
```
|
||||||
|
|
||||||
|
## Чтение из массива
|
||||||
|
|
||||||
|
```php
|
||||||
|
$var = new \AtolOnline\Entities\Client('Иванов Иван');
|
||||||
|
echo $var['name']; // 'Иванов Иван'
|
||||||
|
$var['name'] = 'Петров Пётр'; // BadMethodCallException
|
||||||
|
```
|
||||||
|
|
||||||
|
## Fluent-сеттеры
|
||||||
|
|
||||||
|
Реализованы на уровне конкретных классов сущностей, но у некоторых могут полностью отсуствовать.
|
||||||
|
|
||||||
|
```php
|
||||||
|
$entity->setFoo($value)->setBar('bar')->...
|
||||||
|
```
|
||||||
|
|
||||||
|
Сеттеры валидируют и фильтруют данные согласно схеме АТОЛ Онлайн API, а в случае ошибочных значений -- выбрасывают
|
||||||
|
исключения.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Читай также: [Коллекция сущностей](collection.md)
|
||||||
|
|
||||||
|
[Вернуться к содержанию](readme.md#toc)
|
237
docs/fiscalizing.md
Normal file
237
docs/fiscalizing.md
Normal file
@ -0,0 +1,237 @@
|
|||||||
|
# Фискализация документов
|
||||||
|
|
||||||
|
[Вернуться к содержанию](readme.md#toc)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Доступ к ККТ
|
||||||
|
|
||||||
|
Для работы с облачной ККТ необходимы следующие параметры:
|
||||||
|
|
||||||
|
* логин;
|
||||||
|
* пароль;
|
||||||
|
* код группы.
|
||||||
|
|
||||||
|
Чтоы получить их, нужно:
|
||||||
|
|
||||||
|
1. авторизоваться в личном кабинете [online.atol.ru](https://online.atol.ru/lk/Account/Login);
|
||||||
|
2. на странице [Мои компании](https://online.atol.ru/lk/Company/List) нажать кнопку **Настройки интегратора**.
|
||||||
|
Скачается XML-файл с нужными настройками.
|
||||||
|
|
||||||
|
Также для работы потребуются:
|
||||||
|
|
||||||
|
* ИНН продавца;
|
||||||
|
* URL места расчёта (ссылка на ваш интернет-сервис).
|
||||||
|
|
||||||
|
## Использование
|
||||||
|
|
||||||
|
Объект ККТ инициализируется следующим образом:
|
||||||
|
|
||||||
|
```php
|
||||||
|
$kkt = new AtolOnline\Api\Fiscalizer();
|
||||||
|
```
|
||||||
|
|
||||||
|
Установить параметры подключения можно двумя путями:
|
||||||
|
|
||||||
|
```php
|
||||||
|
use AtolOnline\Api\Fiscalizer;
|
||||||
|
|
||||||
|
// 1 способ - через конструктор
|
||||||
|
$kkt = new Fiscalizer(group: 'mygroup', login: 'mylogin', password: 'mypassword');
|
||||||
|
|
||||||
|
// 2 способ - через сеттеры
|
||||||
|
$kkt = (new Fiscalizer())
|
||||||
|
->setLogin($login)
|
||||||
|
->setGroup($group)
|
||||||
|
->setPassword($password);
|
||||||
|
```
|
||||||
|
|
||||||
|
<a name="testmode"></a>
|
||||||
|
|
||||||
|
## Тестовый режим
|
||||||
|
|
||||||
|
По умолчанию фискализатор создаётся для работы в тестовом режиме. Это означает, что работа с АТОЛ Онлайн API будет
|
||||||
|
происходить [в тестовой среде](https://online.atol.ru/files/ffd/test_sreda.txt).
|
||||||
|
|
||||||
|
> Под тестовым режимом работы подразумевается использование тестовых ККТ, которые принадлежат компании АТОЛ.
|
||||||
|
|
||||||
|
Управление тестовым режимом происходит следующим образом:
|
||||||
|
|
||||||
|
```php
|
||||||
|
$kkt = new Fiscalizer(); // включен по умолчанию
|
||||||
|
$kkt = new Fiscalizer(false); // выключен явно
|
||||||
|
$kkt->setTestMode(); // включен явно
|
||||||
|
$kkt->setTestMode(true); // включен явно
|
||||||
|
$kkt->setTestMode(false); // выключен явно
|
||||||
|
```
|
||||||
|
|
||||||
|
**При включенном тестовом режиме используются тестовые ККТ**, т.к. перед отправкой запроса подменяются:
|
||||||
|
|
||||||
|
* логин;
|
||||||
|
* пароль;
|
||||||
|
* группа ККТ;
|
||||||
|
* ИНН клиента (покупателя);
|
||||||
|
* ИНН и адрес места расчётов компании (продавца).
|
||||||
|
|
||||||
|
Таким образом:
|
||||||
|
|
||||||
|
* использовать тестовый режим -- безопасно;
|
||||||
|
* при переключении тестового режима устанавливать заново свои параметры подключения не требуется.
|
||||||
|
|
||||||
|
**При выключенном тестовом режиме используются ваши ККТ.**
|
||||||
|
|
||||||
|
Если по каким-то причинам у вас не получится использовать тестовый режим, вы можете проводить свои тесты в боевом
|
||||||
|
режиме (на собственной ККТ). В этом случае важно понимать следующее:
|
||||||
|
|
||||||
|
1. сразу после оформления документа **прихода** необходимо оформлять точно такой же документ **возврата прихода**;
|
||||||
|
2. [вы обязательно забудете о пункте 1](http://murphy-law.net.ru/basics.html);
|
||||||
|
3. пп. 1 и 2 в любом случае скажутся на ваших финансовых отчётах;
|
||||||
|
4. вся ответственность за пп. 1-3 и последствия ложится только на вас.
|
||||||
|
|
||||||
|
## Авторизация на ККТ
|
||||||
|
|
||||||
|
Перед первым запросом на ККТ происходит аутентификация на сервере по логину и паролю. В ответ приходит авторизационный
|
||||||
|
токен, срок жизни коего равен **24 часам**. После первой успешной операции возможно получить этот токен следующим
|
||||||
|
образом:
|
||||||
|
|
||||||
|
```php
|
||||||
|
$kkt->getToken(); // вернёт строку длиной 128 символа
|
||||||
|
```
|
||||||
|
|
||||||
|
Этот токен можно сохранить и переиспользовать в течение всего срока его жизни, но далее следует получить новый токен.
|
||||||
|
|
||||||
|
Ранее полученный токен следует указывать до отправки запросов следующим образом:
|
||||||
|
|
||||||
|
```php
|
||||||
|
$kkt->setToken($token_string);
|
||||||
|
```
|
||||||
|
|
||||||
|
Если токен был установлен перед выполнением операции, то при выполнении операции будет использоваться именно он. Если
|
||||||
|
операция завершится ошибочно из-за истёкшего токена, следует повторить операцию без использования метода `setToken()`,
|
||||||
|
либо обнулив его следующим образом:
|
||||||
|
|
||||||
|
```php
|
||||||
|
$kkt->setToken(null);
|
||||||
|
```
|
||||||
|
|
||||||
|
Тогда будет получен новый токен.
|
||||||
|
|
||||||
|
## Регистрация документа
|
||||||
|
|
||||||
|
Для регистрации документа **прихода** необходимо вызвать метод `sell()`:
|
||||||
|
|
||||||
|
```php
|
||||||
|
$result = $kkt->sell($document);
|
||||||
|
$result2 = $receipt->sell($kkt);
|
||||||
|
```
|
||||||
|
|
||||||
|
Для регистрации документа **возврата прихода** необходимо вызвать метод `sellRefund()`:
|
||||||
|
|
||||||
|
```php
|
||||||
|
$result = $kkt->sellRefund($document);
|
||||||
|
$result2 = $receipt->sellRefund($kkt);
|
||||||
|
```
|
||||||
|
|
||||||
|
Для регистрации документа **расхода** необходимо вызвать метод `buy()`:
|
||||||
|
|
||||||
|
```php
|
||||||
|
$result = $kkt->buy($document);
|
||||||
|
$result2 = $receipt->buy($kkt);
|
||||||
|
```
|
||||||
|
|
||||||
|
Для регистрации документа **возврата расхода** необходимо вызвать метод `buyRefund()`:
|
||||||
|
|
||||||
|
```php
|
||||||
|
$result = $kkt->buyRefund($document);
|
||||||
|
$result2 = $receipt->buyRefund($kkt);
|
||||||
|
```
|
||||||
|
|
||||||
|
Для регистрации документа **коррекции прихода** необходимо вызвать метод `sellCorrection()`:
|
||||||
|
|
||||||
|
```php
|
||||||
|
$result = $kkt->sellCorrect($document);
|
||||||
|
$result2 = $correction->sellCorrect($kkt);
|
||||||
|
```
|
||||||
|
|
||||||
|
Для регистрации документа **коррекции расхода** необходимо вызвать метод `buyCorrection()`:
|
||||||
|
|
||||||
|
```php
|
||||||
|
$result = $kkt->buyCorrect($document);
|
||||||
|
$result2 = $correction->buyCorrect($kkt);
|
||||||
|
```
|
||||||
|
|
||||||
|
### Собственный идентификатор документа (`external_id`)
|
||||||
|
|
||||||
|
Каждый документ, переданный на ККТ для регистрации, всегда имеет свой идентификатор, абсолютно уникальный среди всех
|
||||||
|
документов когда-либо регистрировавшихся на ККТ, даже если при регистрации были ошибки. По умолчанию это UUID версии 4.
|
||||||
|
|
||||||
|
Чтобы использовать собственный идентификатор, следует передать нужное строковое значение вторым параметром в любой из
|
||||||
|
шести описанных выше методов, например:
|
||||||
|
|
||||||
|
```php
|
||||||
|
$result = $kkt->sellRefund($document, 'order_' . $order->id);
|
||||||
|
```
|
||||||
|
|
||||||
|
Если `external_id` не указан явно или имеет пустое значение, то будет сгенерирован новый UUID. Узнать его можно будет
|
||||||
|
только в ответе от ККТ после регистрации документа в очереди на фискализацию.
|
||||||
|
|
||||||
|
### Передача `callback_url`
|
||||||
|
|
||||||
|
Перед регистрацией документа можно указать `callback_url`. АТОЛ отправит на указанный URL результат регистрации. По
|
||||||
|
этому адресу должен располагаться ваш собственный обработчик статуса фискализации.
|
||||||
|
|
||||||
|
```php
|
||||||
|
$kkt->setCallbackUrl('http://example.com/process-kkt-result');
|
||||||
|
$kkt->getCallbackUrl();
|
||||||
|
```
|
||||||
|
|
||||||
|
## Проверка статуса документа
|
||||||
|
|
||||||
|
Если перед отправкой документа на регистрацию был задан `callback_url` через метод `setCallbackUrl()`, то ответ придёт
|
||||||
|
на указанный адрес автоматически, как только документ обработается на стороне ККТ. Ответ может быть как об успешной
|
||||||
|
регистрации, так и ошибочной.
|
||||||
|
|
||||||
|
В любом случае, вам доступны два метода, с помощью которых вы можете проверять статус документа самостоятельно:
|
||||||
|
|
||||||
|
```php
|
||||||
|
$kkt->getDocumentStatus(); // делает единичный запрос
|
||||||
|
$kkt->pollDocumentStatus(); // делает запросы до получения конечного статуса (не-wait)
|
||||||
|
```
|
||||||
|
|
||||||
|
Эти методы принимают на вход `uuid` кода регистрации. Этот UUID нужно взять из ответа, полученного при отправке
|
||||||
|
документа на регистрацию:
|
||||||
|
|
||||||
|
```php
|
||||||
|
$sell_result = $kkt->sell($document);
|
||||||
|
$status = $kkt->pollDocumentStatus($sell_result->uuid);
|
||||||
|
```
|
||||||
|
|
||||||
|
Метод `pollDocumentStatus()` многократно опрашивает ККТ на предмет состояния документа. Метод может принимать до трёх
|
||||||
|
параметров:
|
||||||
|
|
||||||
|
* uuid;
|
||||||
|
* количество попыток (по умолчанию — 5);
|
||||||
|
* время между попытками в секундах (по умолчанию — 1).
|
||||||
|
|
||||||
|
```php
|
||||||
|
// Проверять статус 10 раз на протяжении 20 секунд — каждые две секунды
|
||||||
|
$kkt->pollDocumentStatus($sell_result->uuid, 10, 20);
|
||||||
|
```
|
||||||
|
|
||||||
|
Учитывайте, что метод вернёт результат как только сменится статус регистрации на успешный `done` или ошибочный `error`.
|
||||||
|
|
||||||
|
Использовать его лучше сразу после отправки документа на регистрацию (как в примере выше).
|
||||||
|
|
||||||
|
> Как правило, фискализация одного документа занимает 4-6 секунд с учётом регистрации.
|
||||||
|
|
||||||
|
Метод `getDocumentStatus()` принимает на вход только `uuid` и запрашивает состояние документа лишь единожды.
|
||||||
|
Использовать его целесообразнее в те моменты, когда нет необходимости знать успех регистрации сразу после отправки
|
||||||
|
документа.
|
||||||
|
|
||||||
|
> Обратите внимание, что АТОЛ позволяет получать статус документа в течение 32 суток с момента его регистрации.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Читай также: [Обработка ответа API](response.md)
|
||||||
|
|
||||||
|
[Вернуться к содержанию](readme.md#toc)
|
202
docs/items.md
202
docs/items.md
@ -1,202 +0,0 @@
|
|||||||
# Работа с предметами расчёта
|
|
||||||
|
|
||||||
[Вернуться к содержанию](readme.md)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Один объект
|
|
||||||
|
|
||||||
Объект предмета расчёта инициализируется следующим образом:
|
|
||||||
|
|
||||||
```php
|
|
||||||
$vat = new AtolOnline\Entities\Item();
|
|
||||||
```
|
|
||||||
|
|
||||||
У объекта предмета расчёта должны быть указаны все следующие обязательные атрибуты:
|
|
||||||
* наименование (тег ФФД - 1030);
|
|
||||||
* цена (тег ФФД - 1079);
|
|
||||||
* количество, вес (тег ФФД - 1023).
|
|
||||||
|
|
||||||
У объекта предмета расчёта также могут быть указаны следующие необязательные атрибуты:
|
|
||||||
* единица измерения количества (тег ФФД - 1197);
|
|
||||||
* признак способа оплаты (тег ФФД - 1214) - перечислены в классе `AtolOnline\Constants\PaymentMethods`;
|
|
||||||
* признак предмета расчёта (тег ФФД - 1212) - перечислены в классе `AtolOnline\Constants\PaymentObjects`;
|
|
||||||
* [ставка НДС](/docs/vats.md);
|
|
||||||
* дополнительный реквизит (тег ФФД - 1191).
|
|
||||||
|
|
||||||
Установить многие (но не все) атрибуты можно следующими способами:
|
|
||||||
|
|
||||||
```php
|
|
||||||
use AtolOnline\{
|
|
||||||
Constants\PaymentMethods,
|
|
||||||
Constants\PaymentObjects,
|
|
||||||
Constants\VatTypes,
|
|
||||||
Entities\Item
|
|
||||||
};
|
|
||||||
|
|
||||||
// 1 способ - через конструктор
|
|
||||||
$item = new Item(
|
|
||||||
'Банан', // наименование
|
|
||||||
100, // цена
|
|
||||||
1, // количество, вес
|
|
||||||
'кг', // единица измерения
|
|
||||||
VatTypes::VAT20, // ставка НДС
|
|
||||||
PaymentObjects::SERVICE, // признак предмета расчёта
|
|
||||||
PaymentMethods::FULL_PAYMENT // признак способа расчёта
|
|
||||||
);
|
|
||||||
|
|
||||||
// 2 способ - через сеттеры
|
|
||||||
$item = new Item();
|
|
||||||
$item->setName('Банан');
|
|
||||||
$item->setPrice(100);
|
|
||||||
$item->setQuantity(2.41);
|
|
||||||
//$item->setQuantity(2.41, 'кг');
|
|
||||||
$item->setMeasurementUnit('кг');
|
|
||||||
$item->setVatType(VatTypes::VAT20);
|
|
||||||
$item->setPaymentObject(PaymentObjects::COMMODITY);
|
|
||||||
$item->setPaymentMethod(PaymentMethods::FULL_PAYMENT);
|
|
||||||
```
|
|
||||||
|
|
||||||
Метод `setName()` проверяет входную строку на длину (до 128 символов).
|
|
||||||
Выбрасывает исключение `AtolNameTooLongException` (если слишком длинное наименование).
|
|
||||||
|
|
||||||
Метод `setPrice()` проверяет аргумент на величину (до 42949672.95) и пересчитывает общую стоимость.
|
|
||||||
Выбрасывает исключение `AtolPriceTooHighException` (если цена слишком высока).
|
|
||||||
|
|
||||||
Метод `setMeasurementUnit()` проверяет входную строку на длину (до 16 символов).
|
|
||||||
Выбрасывает исключение `AtolUnitTooLongException` (если слишком длинная строка единицы измерения).
|
|
||||||
|
|
||||||
Метод `setQuantity()` проверяет первый аргумент на величину (до 99999.999) и пересчитывает общую стоимость.
|
|
||||||
Выбрасывает исключения:
|
|
||||||
* `AtolQuantityTooHighException` (если количество слишком велико);
|
|
||||||
* `AtolPriceTooHighException` (если общая стоимость слишком велика).
|
|
||||||
|
|
||||||
Также вторым аргументом может принимать единицу измерения количества.
|
|
||||||
В этом случае дополнительно работает сеттер `setMeasurementUnit()`.
|
|
||||||
|
|
||||||
Метод `setVatType()` задаёт тип ставки НДС, пересчитывает размер налога и общую стоимость.
|
|
||||||
Выбрасывает исключение `AtolPriceTooHighException` (если цена слишком высока).
|
|
||||||
Может принимать `null` для удаления налога.
|
|
||||||
|
|
||||||
Дополнительный реквизит устанавливается отдельным методом `setUserData()`:
|
|
||||||
|
|
||||||
```php
|
|
||||||
$item->setUserData('some data');
|
|
||||||
```
|
|
||||||
|
|
||||||
Он проверяет строку на длину (до 64 символов).
|
|
||||||
Выбрасывает исключение `AtolUserdataTooLongException` (если слишком длинный дополнительный реквизит).
|
|
||||||
|
|
||||||
Для установки признака предмета расчёта существует метод `setPaymentObject()`.
|
|
||||||
На вход следует передавать одной из значений, перечисленных в классе `AtolOnline\Constants\PaymentObjects`.
|
|
||||||
|
|
||||||
```php
|
|
||||||
$item->setPaymentObject(AtolOnline\Constants\PaymentObjects::JOB);
|
|
||||||
```
|
|
||||||
|
|
||||||
Для установки признака способа оплаты существует метод `setPaymentMethod()`.
|
|
||||||
На вход следует передавать одной из значений, перечисленных в классе `AtolOnline\Constants\PaymentMethods`.
|
|
||||||
|
|
||||||
```php
|
|
||||||
$item->setPaymentMethod(AtolOnline\Constants\PaymentMethods::FULL_PAYMENT);
|
|
||||||
```
|
|
||||||
|
|
||||||
Для получения заданных значений атрибутов реализованы соответствующие геттеры:
|
|
||||||
|
|
||||||
```php
|
|
||||||
$item->getName();
|
|
||||||
$item->getPrice();
|
|
||||||
$item->getQuantity();
|
|
||||||
$item->getMeasurementUnit();
|
|
||||||
$item->getPaymentMethod();
|
|
||||||
$item->getPaymentObject();
|
|
||||||
$item->getVat(); // возвращает объект ставки НДС либо null
|
|
||||||
$item->getUserData();
|
|
||||||
```
|
|
||||||
|
|
||||||
Для пересчёта общей стоимости и размера налога существует метод `calcSum()`.
|
|
||||||
|
|
||||||
```php
|
|
||||||
$item->calcSum();
|
|
||||||
```
|
|
||||||
|
|
||||||
Этот метод отрабатывает при вызове `setPrice()`, `setQuantity()` и `setVatType()`.
|
|
||||||
Выбрасывает исключение `AtolPriceTooHighException` (если общая сумма слишком высока).
|
|
||||||
|
|
||||||
Получить уже расчитанную общую сумму можно простым геттером:
|
|
||||||
|
|
||||||
```php
|
|
||||||
$item->getSum();
|
|
||||||
```
|
|
||||||
|
|
||||||
Объект класса приводится к JSON-строке автоматически или принудительным приведением к `string`:
|
|
||||||
|
|
||||||
```php
|
|
||||||
echo $item;
|
|
||||||
$json_string = (string)$item;
|
|
||||||
```
|
|
||||||
|
|
||||||
Чтобы получить те же данные в виде массива, нужно вызвать метод `jsonSerialize()`:
|
|
||||||
|
|
||||||
```php
|
|
||||||
$json_array = $item->jsonSerialize();
|
|
||||||
```
|
|
||||||
|
|
||||||
<a name="array"></a>
|
|
||||||
## Массив объектов предметов расчёта
|
|
||||||
|
|
||||||
> Максимальное количество объектов в массиве - 100.
|
|
||||||
|
|
||||||
Массив инициализируется следующим образом:
|
|
||||||
|
|
||||||
```php
|
|
||||||
$item_array = new AtolOnline\Entities\ItemArray();
|
|
||||||
```
|
|
||||||
|
|
||||||
Чтобы задать содержимое массива, используйте метод `set()`:
|
|
||||||
|
|
||||||
```php
|
|
||||||
$item_array->set([
|
|
||||||
$item_object1,
|
|
||||||
$item_object2
|
|
||||||
]);
|
|
||||||
```
|
|
||||||
|
|
||||||
Очистить его можно передачей в сеттер пустого массива:
|
|
||||||
|
|
||||||
```php
|
|
||||||
$item_array->set([]);
|
|
||||||
```
|
|
||||||
|
|
||||||
Чтобы добавить объект к существующим элементам массива, используйте метод `add()`:
|
|
||||||
|
|
||||||
```php
|
|
||||||
$item = new AtolOnline\Entities\Item('Банан', 100, 1);
|
|
||||||
$item_array->add($item);
|
|
||||||
```
|
|
||||||
|
|
||||||
Методы `set()` и `add()` проверяют количество элементов в массиве перед его обновлением.
|
|
||||||
Выбрасывают исключение `AtolTooManyItemsException` (если в массиве уже максимальное количество объектов).
|
|
||||||
|
|
||||||
Чтобы получить содержимое массива, используйте метод `get()`:
|
|
||||||
|
|
||||||
```php
|
|
||||||
$item_array->get();
|
|
||||||
```
|
|
||||||
|
|
||||||
Объект класса приводится к JSON-строке автоматически или принудительным приведением к `string`:
|
|
||||||
|
|
||||||
```php
|
|
||||||
echo $item_array;
|
|
||||||
$json_string = (string)$item_array;
|
|
||||||
```
|
|
||||||
|
|
||||||
Чтобы получить те же данные в виде массива, нужно вызвать метод `jsonSerialize()`:
|
|
||||||
|
|
||||||
```php
|
|
||||||
$json_array = $item_array->jsonSerialize();
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
[Вернуться к содержанию](readme.md)
|
|
317
docs/kkt.md
317
docs/kkt.md
@ -1,317 +0,0 @@
|
|||||||
# Работа с ККТ
|
|
||||||
|
|
||||||
[Вернуться к содержанию](readme.md)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Доступ к ККТ
|
|
||||||
|
|
||||||
Для работы с облачной ККТ необходимы следующие параметры:
|
|
||||||
|
|
||||||
* логин;
|
|
||||||
* пароль;
|
|
||||||
* код группы.
|
|
||||||
|
|
||||||
Чтоы получить их, нужно:
|
|
||||||
|
|
||||||
1. авторизоваться в личном кабинете [online.atol.ru](https://online.atol.ru/lk/Account/Login);
|
|
||||||
2. на странице [Мои компании](https://online.atol.ru/lk/Company/List) нажать кнопку **Настройки интегратора**.
|
|
||||||
Скачается XML-файл с нужными настройками.
|
|
||||||
|
|
||||||
Также для работы потребуются:
|
|
||||||
|
|
||||||
* ИНН продавца;
|
|
||||||
* URL места расчёта (ссылка на ваш интернет-сервис).
|
|
||||||
|
|
||||||
## Использование
|
|
||||||
|
|
||||||
Объект ККТ инициализируется следующим образом:
|
|
||||||
|
|
||||||
```php
|
|
||||||
$kkt = new AtolOnline\Api\Kkt();
|
|
||||||
```
|
|
||||||
|
|
||||||
## Настройка ККТ
|
|
||||||
|
|
||||||
Для работы с облачной ККТ необходимы следующие параметры:
|
|
||||||
* логин кассы;
|
|
||||||
* пароль кассы;
|
|
||||||
* код группы кассы;
|
|
||||||
|
|
||||||
Чтоб получить их, нужно:
|
|
||||||
1. авторизоваться на [online.atol.ru](https://online.atol.ru/lk/Account/Login);
|
|
||||||
2. на странице [Мои компании](https://online.atol.ru/lk/Company/List) нажать кнопку **Настройки интегратора**.
|
|
||||||
Скачается XML-файл с нужными настройками.
|
|
||||||
|
|
||||||
Установить эти параметры можно двумя путями:
|
|
||||||
|
|
||||||
```php
|
|
||||||
// 1 способ - через конструктор
|
|
||||||
$kkt = new AtolOnline\Api\Kkt($group, $login, $password);
|
|
||||||
|
|
||||||
// 2 способ - через сеттеры
|
|
||||||
$kkt = (new AtolOnline\Api\Kkt())
|
|
||||||
->setLogin($login)
|
|
||||||
->setGroup($group)
|
|
||||||
->setPassword($password);
|
|
||||||
```
|
|
||||||
|
|
||||||
Получить заданные параметры можно через соответствующие геттеры:
|
|
||||||
|
|
||||||
```php
|
|
||||||
$kkt->getLogin();
|
|
||||||
$kkt->getPassword();
|
|
||||||
$kkt->getGroup();
|
|
||||||
```
|
|
||||||
|
|
||||||
Также для работы потребуются:
|
|
||||||
* ИНН продавца;
|
|
||||||
* URL места расчёта (ссылка на ваш интернет-сервис).
|
|
||||||
|
|
||||||
Эти параметры нужно задать [объекту компании](/docs/company.md), который будет передаваться в документах через эту ККТ.
|
|
||||||
|
|
||||||
<a name='testmode'></a>
|
|
||||||
## Тестовый режим
|
|
||||||
|
|
||||||
На самом деле, в АТОЛ Онлайн нет понятия *тестовая операция* или чего-то в этом духе.
|
|
||||||
АТОЛ предоставляет нам отдельную тестовую среду (ККТ).
|
|
||||||
[Её настройки](https://online.atol.ru/files/ffd/test_sreda.txt) уже указаны в коде библиотеки.
|
|
||||||
*Под тестовым режимом работы подразумевается использование другой (тестовой) ККТ.*
|
|
||||||
|
|
||||||
При включенном тестовом режиме:
|
|
||||||
* меняется логин, пароль и группа (для обращения на тестовую ККТ)
|
|
||||||
* между авторизацией и операцией над документом, в `Company` документа переопределяется ИНН, СНО и адрес места
|
|
||||||
расчётов на те, что указаны в [параметрах тестовой среды](https://online.atol.ru/files/ffd/test_sreda.txt).
|
|
||||||
|
|
||||||
В библиотеке есть переключатель настроек ККТ.
|
|
||||||
С его помощью можете поменять вашу боевую ККТ на тестовую и наоборот.
|
|
||||||
Это можно сделать одним из следующих способов:
|
|
||||||
|
|
||||||
```php
|
|
||||||
// включить в любом месте кода:
|
|
||||||
$kkt->setTestMode();
|
|
||||||
$kkt->setTestMode(true);
|
|
||||||
$kkt->setTestMode(false); // выключить
|
|
||||||
```
|
|
||||||
|
|
||||||
> Если вы включили тестовый режим (как показано выше), то используются именно эта ККТ, а не ваша.
|
|
||||||
> После выключения тестового режима настройки доступа к ККТ меняются на ваши (используется уже ваша ККТ).
|
|
||||||
|
|
||||||
Для включения тестового режима необязательно задавать параметры боевой ККТ.
|
|
||||||
|
|
||||||
Если по каким-то причинам у вас не получится использовать тестовый режим, вы можете проводить свои тесты в боевом
|
|
||||||
режиме (на собственной ККТ).
|
|
||||||
В этом случае важно понимать следующее:
|
|
||||||
1. сразу после оформления документа **прихода** необходимо оформлять точно такой же документ **возврата прихода**;
|
|
||||||
2. [вы обязательно забудете о пункте 1](http://murphy-law.net.ru/basics.html);
|
|
||||||
3. пп. 1 и 2 в любом случае скажутся на ваших финансовых отчётах;
|
|
||||||
4. вся ответственность за пп. 1-3 и последствия ложится только на вас.
|
|
||||||
|
|
||||||
## Авторизация на ККТ
|
|
||||||
|
|
||||||
Перед первым запросом на ККТ происходит аутентификация на сервере по логину и паролю.
|
|
||||||
В ответ приходит авторизационный токен, срок жизни коего равен **24 часам**.
|
|
||||||
После первой успешной операции возможно получить этот токен следующим образом:
|
|
||||||
|
|
||||||
```php
|
|
||||||
$kkt->getAuthToken(); // вернёт строку длиной 128 символа
|
|
||||||
```
|
|
||||||
|
|
||||||
Этот токен можно сохранить и переиспользовать в течение всего срока его жизни.
|
|
||||||
Спустя это время следует получить новый токен.
|
|
||||||
|
|
||||||
Для дальнейшего использования однажды полученный токен следует указывать следующим образом:
|
|
||||||
|
|
||||||
```php
|
|
||||||
$kkt->setAuthToken($token_string);
|
|
||||||
```
|
|
||||||
|
|
||||||
Если токен был установлен перед выполнением операции, то при выполнении операции будет использоваться именно он, а новый
|
|
||||||
запрашиваться не будет. Если операция завершится ошибочно из-за истёкшего токена, следует повторить операцию без
|
|
||||||
использования метода `setAuthToken()`, либо обнулив его следующим образом:
|
|
||||||
|
|
||||||
```php
|
|
||||||
$kkt->setAuthToken(null);
|
|
||||||
```
|
|
||||||
|
|
||||||
## Регистрация документа
|
|
||||||
|
|
||||||
Для регистрации документа **прихода** необходимо вызвать метод `sell()`:
|
|
||||||
|
|
||||||
```php
|
|
||||||
$result = $kkt->sell($document);
|
|
||||||
```
|
|
||||||
|
|
||||||
Для регистрации документа **возврата прихода** необходимо вызвать метод `sellRefund()`:
|
|
||||||
|
|
||||||
```php
|
|
||||||
$result = $kkt->sellRefund($document);
|
|
||||||
```
|
|
||||||
|
|
||||||
Для регистрации документа **расхода** необходимо вызвать метод `buy()`:
|
|
||||||
|
|
||||||
```php
|
|
||||||
$result = $kkt->buy($document);
|
|
||||||
```
|
|
||||||
|
|
||||||
Для регистрации документа **возврата расхода** необходимо вызвать метод `buyRefund()`:
|
|
||||||
|
|
||||||
```php
|
|
||||||
$result = $kkt->buyRefund($document);
|
|
||||||
```
|
|
||||||
|
|
||||||
Для операций, перечисленных выше, документы не должны содержать [данных коррекции](/docs/documents.md#correction).
|
|
||||||
Тогда как для операций коррекции, которые описаны ниже, эти данные должны присутствовать.
|
|
||||||
|
|
||||||
Для регистрации документа **коррекции прихода** необходимо вызвать метод `sellCorrection()`:
|
|
||||||
|
|
||||||
```php
|
|
||||||
$result = $kkt->sellCorrection($document);
|
|
||||||
```
|
|
||||||
|
|
||||||
Для регистрации документа **коррекции расхода** необходимо вызвать метод `buyCorrection()`:
|
|
||||||
|
|
||||||
```php
|
|
||||||
$result = $kkt->buyCorrection($document);
|
|
||||||
```
|
|
||||||
|
|
||||||
Любой из перечисленных выше шести методов может выбросить исключение `AtolAuthFailedException` при ошибке
|
|
||||||
аутентификации или авторизации.
|
|
||||||
|
|
||||||
### Собственный идентификатор документа
|
|
||||||
|
|
||||||
Каждый документ, переданный на ККТ для регистрации, всегда имеет свой идентификатор, абсолютно уникальный среди всех
|
|
||||||
документов когда-либо регистрировавшихся на ККТ, даже если при регистрации были ошибки.
|
|
||||||
По умолчанию это UUID версии 4.
|
|
||||||
|
|
||||||
Чтобы использовать собственный идентификатор, следует передать нужное строковое значение вторым параметром в любой из
|
|
||||||
шести описанных выше методов, например:
|
|
||||||
|
|
||||||
```php
|
|
||||||
$kkt->sell($document, $my_unique_id);
|
|
||||||
$kkt->sellRefund($document, $my_unique_id);
|
|
||||||
$kkt->buy($document, $my_unique_id);
|
|
||||||
$kkt->buyRefund($document, $my_unique_id);
|
|
||||||
$kkt->sellCorrection($document, $my_unique_id);
|
|
||||||
$kkt->buyCorrection($document, $my_unique_id);
|
|
||||||
```
|
|
||||||
|
|
||||||
Если `$my_unique_id` равен `null` или пустой строке, то будет сгенерирован новый UUID.
|
|
||||||
Узнать его можно будет только в ответе от ККТ.
|
|
||||||
|
|
||||||
### Передача callback_url
|
|
||||||
|
|
||||||
Перед регистрацией документа можно указать `callback_url`.
|
|
||||||
АТОЛ отправит на указанный URL результат регистрации.
|
|
||||||
По этому адресу должен располагаться код, который будет обрабатывать этот результат.
|
|
||||||
|
|
||||||
```php
|
|
||||||
$kkt->setCallbackUrl('http://example.com/process-kkt-result');
|
|
||||||
$kkt->getCallbackUrl();
|
|
||||||
```
|
|
||||||
|
|
||||||
Метод `setCallbackUrl()` проверяет входную строку на длину (до 256 символов) и валидность формата url по
|
|
||||||
регулярному выражению:
|
|
||||||
|
|
||||||
```
|
|
||||||
^http(s?)\:\/\/[0-9a-zA-Zа-яА-Я]([-.\w]*[0-9a-zA-Zа-яА-Я])*(:(0-9)*)*(\/?)([a-zAZ0-9а-яА-Я\-\.\?\,\'\/\\\+&=%$#_]*)?$
|
|
||||||
```
|
|
||||||
|
|
||||||
Выбрасывает исключения:
|
|
||||||
* `AtolCallbackUrlTooLongException` (если слишком длинный url);
|
|
||||||
* `AtolInvalidCallbackUrlException` (если url невалиден).
|
|
||||||
|
|
||||||
## Обработка результата регистрации
|
|
||||||
|
|
||||||
Методы `sell()`, `sellRefund()`, `sellCorrection()`, `buy()`, `buyRefund()` и `buyCorrection()` возвращают объект `AtolOnline\Api\KktResponse`.
|
|
||||||
|
|
||||||
Этот же объект можно получить через геттер `getLastResponse()`.
|
|
||||||
|
|
||||||
Этот объект содержит в себе HTTP-код ответа, массив заголовков и JSON-декодированные данные тела ответа.
|
|
||||||
|
|
||||||
```php
|
|
||||||
$result = $kkt->getLastResponse(); // вернёт последний ответ от API
|
|
||||||
$headers = $result->getHeaders(); // вернёт заголовки
|
|
||||||
$code = $result->getCode(); // вернёт код ответа
|
|
||||||
$body = $result->getContent(); // вернёт JSON-декодированное тело ответа
|
|
||||||
```
|
|
||||||
|
|
||||||
Обращаться к полям JSON-декодированного объекта можно опуская вызов метода `getContent()` таким образом:
|
|
||||||
|
|
||||||
```php
|
|
||||||
// вернёт значение поля uuid
|
|
||||||
$uuid = $result->getContent()->uuid;
|
|
||||||
$uuid = $result->uuid;
|
|
||||||
// вернёт текст ошибки
|
|
||||||
$err_text = $result->getContent()->error->text;
|
|
||||||
$err_text = $result->error->text;
|
|
||||||
```
|
|
||||||
|
|
||||||
Проверка корректности ответа (отсутствия ошибок) работает через метод `isValid()`:
|
|
||||||
|
|
||||||
```php
|
|
||||||
$kkt->getLastResponse()->isValid(); // вернёт true, если ошибок нет
|
|
||||||
```
|
|
||||||
|
|
||||||
## Проверка статуса документа
|
|
||||||
|
|
||||||
Если перед отправкой документа на регистрацию был задан callback_url через метод `setCallbackUrl()`, то ответ придёт на указанный адрес автоматически, как только документ обработается на стороне ККТ.
|
|
||||||
Ответ может быть как об успешной регистрации, так и ошибочной.
|
|
||||||
|
|
||||||
В любом случае, вам доступны два метода, с помощью которых вы можете проверять статус документа самостоятельно:
|
|
||||||
|
|
||||||
```php
|
|
||||||
$kkt->getDocumentStatus();
|
|
||||||
$kkt->pollDocumentStatus();
|
|
||||||
```
|
|
||||||
|
|
||||||
Эти методы принимают на вход `uuid` кода регистрации.
|
|
||||||
Этот UUID можно получить из ответа, полученного при отправке документа на регистрацию:
|
|
||||||
|
|
||||||
```php
|
|
||||||
$sell_result = $kkt->sell($document);
|
|
||||||
$kkt->pollDocumentStatus($sell_result->uuid);
|
|
||||||
$kkt->getDocumentStatus($sell_result->uuid);
|
|
||||||
```
|
|
||||||
|
|
||||||
Метод `pollDocumentStatus()` многократно опрашивает ККТ на предмет состояния документа.
|
|
||||||
Метод может принимать до трёх параметров:
|
|
||||||
* uuid;
|
|
||||||
* количество попыток (по умолчанию — 5);
|
|
||||||
* время между попытками в секундах (по умолчанию — 1).
|
|
||||||
|
|
||||||
```php
|
|
||||||
// Проверять статус 10 раз на протяжении 20 секунд — каждые две секунды
|
|
||||||
$kkt->pollDocumentStatus($sell_result->uuid, 10, 20);
|
|
||||||
```
|
|
||||||
|
|
||||||
Учитывайте, что метод вернёт результат как только сменится статус регистрации на успешный или ошибочный.
|
|
||||||
|
|
||||||
Использовать его лучше сразу после отправки документа на регистрацию (как в примере выше).
|
|
||||||
|
|
||||||
> Как правило, полная регистрация одного документа занимает 4-5 секунд.
|
|
||||||
|
|
||||||
Метод `getDocumentStatus()` принимает на вход только `uuid` и запрашивает состояние документа лишь единожды.
|
|
||||||
Использовать его целесообразнее в те моменты, когда нет необходимости знать успех регистрации сразу после отправки документа.
|
|
||||||
|
|
||||||
> Обратите внимание, что АТОЛ позволяет получать статус документа в течение 32 суток с момента его регистрации.
|
|
||||||
|
|
||||||
Методы `pollDocumentStatus()` и `getDocumentStatus()` возвращают объект `AtolOnline\Api\KktResponse`.
|
|
||||||
Оба выбрасывают исключение `AtolUuidValidateException` (если переданная строка UUID невалидна).
|
|
||||||
|
|
||||||
Объект класса приводится к JSON-строке автоматически или принудительным приведением к `string`:
|
|
||||||
|
|
||||||
```php
|
|
||||||
echo $item;
|
|
||||||
$json_string = (string)$item;
|
|
||||||
```
|
|
||||||
|
|
||||||
Чтобы получить те же данные в виде массива, нужно вызвать метод `jsonSerialize()`:
|
|
||||||
|
|
||||||
```php
|
|
||||||
$json_array = $item->jsonSerialize();
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
[Вернуться к содержанию](readme.md)
|
|
@ -1,6 +1,6 @@
|
|||||||
# Мониторинг ККТ
|
# Мониторинг ККТ
|
||||||
|
|
||||||
[Вернуться к содержанию](readme.md)
|
[Вернуться к содержанию](readme.md#toc)
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@ -12,13 +12,13 @@
|
|||||||
|
|
||||||
```php
|
```php
|
||||||
// можно передать параметры подключения в конструктор
|
// можно передать параметры подключения в конструктор
|
||||||
$monitor = new AtolOnline\Api\KktMonitor(
|
$monitor = new AtolOnline\Api\Monitor(
|
||||||
login: 'mylogin',
|
login: 'mylogin',
|
||||||
password: 'qwerty'
|
password: 'qwerty'
|
||||||
);
|
);
|
||||||
|
|
||||||
// можно - отдельными сеттерами
|
// можно - отдельными сеттерами
|
||||||
$monitor = new AtolOnline\Api\KktMonitor();
|
$monitor = new AtolOnline\Api\Monitor();
|
||||||
->setLogin($credentials['login'])
|
->setLogin($credentials['login'])
|
||||||
->setPassword($credentials['password']);
|
->setPassword($credentials['password']);
|
||||||
```
|
```
|
||||||
@ -30,7 +30,7 @@ $monitor = new AtolOnline\Api\KktMonitor();
|
|||||||
|
|
||||||
```php
|
```php
|
||||||
// передачей в конструктор `false` первым параметром:
|
// передачей в конструктор `false` первым параметром:
|
||||||
$monitor = new AtolOnline\Api\KktMonitor(false, /*...*/);
|
$monitor = new AtolOnline\Api\Monitor(false, /*...*/);
|
||||||
|
|
||||||
// или отдельным сеттером
|
// или отдельным сеттером
|
||||||
$monitor->setTestMode(false);
|
$monitor->setTestMode(false);
|
||||||
@ -107,10 +107,12 @@ $kkt = $monitor->getOne($kkts->first()->serialNumber);
|
|||||||
|
|
||||||
Класс `AtolOnline\Api\KktMonitor` расширяет абстрактный класс `AtolOnline\Api\AtolClient`.
|
Класс `AtolOnline\Api\KktMonitor` расширяет абстрактный класс `AtolOnline\Api\AtolClient`.
|
||||||
|
|
||||||
Это значит, что последний ответ от API АТОЛ всегда сохраняется объектом класса `AtolOnline\Api\KktResponse`. К нему
|
Это значит, что последний ответ от API АТОЛ всегда сохраняется объектом класса `AtolOnline\Api\AtolReponse`. К нему
|
||||||
можно обратиться через метод `AtolOnline\Api\KktMonitor::getResponse()`, независимо от того, что возвращают другие
|
можно обратиться через метод `AtolOnline\Api\KktMonitor::getResponse()`, независимо от того, что возвращают другие
|
||||||
методы монитора.
|
методы монитора.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
[Вернуться к содержанию](readme.md)
|
Читай также: [Обработка ответа API](response.md)
|
||||||
|
|
||||||
|
[Вернуться к содержанию](readme.md#toc)
|
||||||
|
134
docs/payments.md
134
docs/payments.md
@ -1,134 +0,0 @@
|
|||||||
# Работа с оплатами
|
|
||||||
|
|
||||||
[Вернуться к содержанию](readme.md)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Один объект
|
|
||||||
|
|
||||||
Объект оплаты инициализируется следующим образом:
|
|
||||||
|
|
||||||
```php
|
|
||||||
$payment = new AtolOnline\Entities\Payment();
|
|
||||||
```
|
|
||||||
|
|
||||||
У объекта оплаты должны быть указаны все следующие атрибуты:
|
|
||||||
* тип оплаты (теги ФФД: 1031, 1081, 1215, 1216, 1217) - все типы перечислены в классе `AtolOnline\Constants\PaymentTypes` (по умолчанию `ELECTRON`)
|
|
||||||
* сумма оплаты (теги ФФД: 1031, 1081, 1215, 1216, 1217; по умолчанию 0)
|
|
||||||
|
|
||||||
> Все эти атрибуты являются **обязательными**.
|
|
||||||
|
|
||||||
Установить атрибуты можно следующими способами:
|
|
||||||
|
|
||||||
```php
|
|
||||||
// 1 способ - через конструктор
|
|
||||||
$payment = new AtolOnline\Entities\Payment(
|
|
||||||
AtolOnline\Constants\PaymentTypes::OTHER, // тип оплаты
|
|
||||||
123.45 // сумма оплаты
|
|
||||||
);
|
|
||||||
|
|
||||||
// 2 способ - через сеттер
|
|
||||||
$payment = (new AtolOnline\Entities\Payment())
|
|
||||||
->setType(AtolOnline\Constants\PaymentTypes::OTHER) // тип оплаты
|
|
||||||
->setSum(123.45); // сумма оплаты
|
|
||||||
```
|
|
||||||
|
|
||||||
Размер налога высчитывается автоматически из общей суммы.
|
|
||||||
Сумму, от которой нужно расчитать размер налога, можно передать следующими способами:
|
|
||||||
|
|
||||||
```php
|
|
||||||
// 1 способ - через конструктор
|
|
||||||
$payment = new AtolOnline\Entities\Payment(
|
|
||||||
AtolOnline\Constants\PaymentTypes::CASH, // тип оплаты
|
|
||||||
1234.56 // сумма оплаты в рублях
|
|
||||||
);
|
|
||||||
|
|
||||||
// 2 способ - через сеттер
|
|
||||||
$payment = (new AtolOnline\Entities\Payment())
|
|
||||||
->setType(AtolOnline\Constants\PaymentTypes::CASH) // тип оплаты
|
|
||||||
->setSum(1234.56); // сумма оплаты в рублях
|
|
||||||
```
|
|
||||||
|
|
||||||
Получить установленную сумму оплаты в рублях можно через геттер `getSum()`:
|
|
||||||
|
|
||||||
```php
|
|
||||||
var_dump($payment->getSum());
|
|
||||||
```
|
|
||||||
|
|
||||||
Объект класса приводится к JSON-строке автоматически или принудительным приведением к `string`:
|
|
||||||
|
|
||||||
```php
|
|
||||||
echo $payment;
|
|
||||||
$json_string = (string)$payment;
|
|
||||||
```
|
|
||||||
|
|
||||||
Чтобы получить те же данные в виде массива, нужно вызвать метод `jsonSerialize()`:
|
|
||||||
|
|
||||||
```php
|
|
||||||
$json_array = $payment->jsonSerialize();
|
|
||||||
```
|
|
||||||
|
|
||||||
<a name="array"></a>
|
|
||||||
## Массив объектов оплат
|
|
||||||
|
|
||||||
> Максимальное количество объектов в массиве - 10.
|
|
||||||
|
|
||||||
Массив инициализируется следующим образом:
|
|
||||||
|
|
||||||
```php
|
|
||||||
$payment_array = new AtolOnline\Entities\PaymentArray();
|
|
||||||
```
|
|
||||||
|
|
||||||
Чтобы задать содержимое массива, используйте метод `set()`:
|
|
||||||
|
|
||||||
```php
|
|
||||||
use AtolOnline\{Constants\PaymentTypes, Entities\Payment};
|
|
||||||
|
|
||||||
$payment_array->set([
|
|
||||||
new Payment(PaymentTypes::ELECTRON, 123),
|
|
||||||
new Payment(PaymentTypes::ELECTRON, 53.2),
|
|
||||||
new Payment(PaymentTypes::ELECTRON, 23.99),
|
|
||||||
new Payment(PaymentTypes::ELECTRON, 11.43)
|
|
||||||
]);
|
|
||||||
```
|
|
||||||
|
|
||||||
Очистить его можно передачей в сеттер пустого массива:
|
|
||||||
|
|
||||||
```php
|
|
||||||
$payment_array->set([]);
|
|
||||||
```
|
|
||||||
|
|
||||||
Чтобы добавить объект к существующим элементам массива, используйте метод `add()`:
|
|
||||||
|
|
||||||
```php
|
|
||||||
use AtolOnline\{Constants\PaymentTypes, Entities\Payment};
|
|
||||||
|
|
||||||
$payment = new Payment(PaymentTypes::PRE_PAID, 20);
|
|
||||||
$payment_array->add($payment);
|
|
||||||
```
|
|
||||||
|
|
||||||
Методы `set()` и `add()` проверяют количество элементов в массиве перед его обновлением.
|
|
||||||
Выбрасывают исключение `AtolTooManyPaymentsException` (если в массиве уже максимальное количество объектов).
|
|
||||||
|
|
||||||
Чтобы получить содержимое массива, используйте метод `get()`:
|
|
||||||
|
|
||||||
```php
|
|
||||||
$payment_array->get();
|
|
||||||
```
|
|
||||||
|
|
||||||
Объект класса приводится к JSON-строке автоматически или принудительным приведением к `string`:
|
|
||||||
|
|
||||||
```php
|
|
||||||
echo $payment_array;
|
|
||||||
$json_string = (string)$payment_array;
|
|
||||||
```
|
|
||||||
|
|
||||||
Чтобы получить те же данные в виде массива, нужно вызвать метод `jsonSerialize()`:
|
|
||||||
|
|
||||||
```php
|
|
||||||
$json_array = $payment_array->jsonSerialize();
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
[Вернуться к содержанию](readme.md)
|
|
@ -1,26 +1,42 @@
|
|||||||
# Документация к библиотеке
|
# Документация к библиотеке
|
||||||
|
|
||||||
|
<a id="toc"></a>
|
||||||
|
|
||||||
|
## Содержание
|
||||||
|
|
||||||
|
* [Общий алгоритм](#getstarted)
|
||||||
|
* [Сущность](entity.md)
|
||||||
|
* [Коллекция сущностей](collection.md)
|
||||||
|
* [Мониторинг ККТ](monitoring.md)
|
||||||
|
* [Фискализация документа](fiscalizing.md)
|
||||||
|
* [Обработка ответа API](response.md)
|
||||||
|
|
||||||
|
Если вы нашли опечатку или какое-то несоответствие — делайте pull-request.
|
||||||
|
|
||||||
|
<a id="getstarted"></a>
|
||||||
|
|
||||||
## Общий алгоритм
|
## Общий алгоритм
|
||||||
|
|
||||||
1. Задать настройки ККТ
|
1. Создать документ `AtolOnline\Entities\Receipt` или `AtolOnline\Entities\Correction`, добавив в него все необходимые
|
||||||
2. Собрать данные о покупателе
|
данные
|
||||||
3. Собрать данные о продавце
|
2. Отправить документ на регистрацию:
|
||||||
4. Собрать данные о предметах расчёта (товары, услуги и пр.)
|
2.1. *Необязательно:* при отправке задать `callback_url`, на который АТОЛ отправит HTTP POST о состоянии документа;
|
||||||
5. Создать документ, добавив в него покупателя, продавца и предметы расчёта
|
2.2. *Необязательно:* при отправке задать `external_id`, чтобы присвоить свой уникальный идентификатор документа;
|
||||||
6. Отправить документ на регистрацию:
|
3. Запомнить `uuid` из пришедшего ответа, поскольку он пригодится для последующей проверки статуса фискализации.
|
||||||
6.1. *Необязательно:* задать `callback_url`, на который АТОЛ отправит HTTP POST о состоянии документа.
|
|
||||||
7. Запомнить `uuid` из пришедшего ответа, поскольку он пригодится для последующей проверки статуса фискализации.
|
|
||||||
> Если с документом был передан `callback_url`, то ответ придёт на этот самый URL.
|
> Если с документом был передан `callback_url`, то ответ придёт на этот самый URL.
|
||||||
Если с документом **НЕ** был передан `callback_url` **либо** callback от АТОЛа не пришёл в течение 300 секунд (5 минут), нужно запрашивать вручную по `uuid`, пришедшему от АТОЛа в ответ на регистрацию документа.
|
> Он должен быть обработан вашим сервисом в соответствии с бизнес-процессом.
|
||||||
8. Проверить состояние документа:
|
|
||||||
8.1. взять `uuid` ответа, полученного на запрос фискализации;
|
> Если с документом **не был** передан `callback_url` **либо** callback от АТОЛа не пришёл в течение 300 секунд
|
||||||
8.2. отправить его в запросе состояния документа.
|
> (5 минут), нужно запрашивать вручную по `uuid`, пришедшему от АТОЛа в ответ на регистрацию документа.
|
||||||
|
4. Проверить состояние документа:
|
||||||
|
4.1. взять `uuid` ответа, полученного на запрос фискализации;
|
||||||
|
4.2. отправить его в запросе состояния документа.
|
||||||
> Данные о документе можно получить только в течение 32 суток после успешной фискализации.
|
> Данные о документе можно получить только в течение 32 суток после успешной фискализации.
|
||||||
|
|
||||||
В зависимости от специфики бизнеса, в документах можно/нужно передавать также и другую информацию. Подробности в
|
В зависимости от специфики бизнеса, в документах можно/нужно передавать разную информацию. Подробности в документации
|
||||||
документациях и исходниках.
|
АТОЛ Онлайн и исходниках библиотеки.
|
||||||
|
|
||||||
### Об отправке электронного чека покупателю
|
## Об отправке электронного чека покупателю
|
||||||
|
|
||||||
После успешной фискализации документа покупатель автоматически получит уведомление **от ОФД**, который используется в
|
После успешной фискализации документа покупатель автоматически получит уведомление **от ОФД**, который используется в
|
||||||
связке с вашей ККТ:
|
связке с вашей ККТ:
|
||||||
@ -31,19 +47,3 @@
|
|||||||
* если на стороне ОФД необходима и подключена услуга СМС-информирования (уточняйте подробности о своего ОФД).
|
* если на стороне ОФД необходима и подключена услуга СМС-информирования (уточняйте подробности о своего ОФД).
|
||||||
|
|
||||||
> Если заданы email и телефон, то ОФД отдаёт приоритет email.
|
> Если заданы email и телефон, то ОФД отдаёт приоритет email.
|
||||||
|
|
||||||
## Подготовка документа
|
|
||||||
|
|
||||||
1. [Работа с клиентами (покупателями)](client.md)
|
|
||||||
2. [Работа с компанией (продавцом)](company.md)
|
|
||||||
3. [Работа с оплатами](payments.md)
|
|
||||||
4. [Работа со ставками НДС](vats.md)
|
|
||||||
5. [Работа с предметами расчёта](items.md)
|
|
||||||
6. [Работа с данными коррекции](correction_info.md)
|
|
||||||
7. [Работа с документами](documents.md)
|
|
||||||
8. [Работа с ККТ](kkt.md)
|
|
||||||
9. [Мониторинг ККТ](monitoring.md)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
Если вы нашли опечатку или какое-то несоответствие — делайте pull-request.
|
|
||||||
|
57
docs/response.md
Normal file
57
docs/response.md
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
# Обработка ответа API
|
||||||
|
|
||||||
|
[Вернуться к содержанию](readme.md#toc)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Объект класса `AtolOnline\Api\AtolResponse` возвращается всеми методами, которые обращаются к АТОЛ Онлайн API.
|
||||||
|
|
||||||
|
Поскольку классы `AtolOnline\Api\Fiscalizer` и `AtolOnline\Api\KktMonitor` наследуются от
|
||||||
|
абстрактного `AtolOnline\Api\AtolClient`, они оба предоставляют метод `getLastReponse()` для возврата последнего
|
||||||
|
полученного ответа от API.
|
||||||
|
|
||||||
|
Таким образом, а общем случае необязательно сразу сохранять ответ в переменную:
|
||||||
|
|
||||||
|
```php
|
||||||
|
$response = $kkt->sell($receipt);
|
||||||
|
```
|
||||||
|
|
||||||
|
Достаточно обратиться к нему позднее:
|
||||||
|
|
||||||
|
```php
|
||||||
|
$kkt->sell($receipt);
|
||||||
|
// ...
|
||||||
|
$response = $kkt->getLastResponse();
|
||||||
|
```
|
||||||
|
|
||||||
|
Однако, при сложной логике и многократных запросах следует пользоваться этим с умом и осторожностью.
|
||||||
|
|
||||||
|
Объект `AtolResponse` содержит в себе HTTP-код ответа, массив заголовков и JSON-декодированные данные тела ответа.
|
||||||
|
|
||||||
|
```php
|
||||||
|
$headers = $response->getHeaders(); // вернёт заголовки
|
||||||
|
$code = $response->getCode(); // вернёт код ответа
|
||||||
|
$body = $response->getContent(); // вернёт JSON-декодированный объект тела ответа
|
||||||
|
```
|
||||||
|
|
||||||
|
Обращаться к полям тела ответа можно опуская вызов метода `getContent()`:
|
||||||
|
|
||||||
|
```php
|
||||||
|
// вернёт значение поля uuid
|
||||||
|
$uuid = $response->getContent()->uuid;
|
||||||
|
$uuid = $response->uuid;
|
||||||
|
|
||||||
|
// вернёт текст ошибки
|
||||||
|
$err_text = $response->getContent()->error->text;
|
||||||
|
$err_text = $response->error->text;
|
||||||
|
```
|
||||||
|
|
||||||
|
Проверка успешности операции доступна через метод `isSuccessful()`:
|
||||||
|
|
||||||
|
```php
|
||||||
|
$response->isSuccessful(); // вернёт true, если ошибок нет
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
[Вернуться к содержанию](readme.md#toc)
|
128
docs/vats.md
128
docs/vats.md
@ -1,128 +0,0 @@
|
|||||||
# Работа со ставками НДС
|
|
||||||
|
|
||||||
[Вернуться к содержанию](readme.md)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Один объект
|
|
||||||
|
|
||||||
Объект ставки НДС инициализируется следующим образом:
|
|
||||||
|
|
||||||
```php
|
|
||||||
use AtolOnline\Entities\Vat;
|
|
||||||
use AtolOnline\Enums\VatTypes;
|
|
||||||
|
|
||||||
$vat = new Vat(
|
|
||||||
VatTypes::VAT10, // тип ставки
|
|
||||||
123.45 // сумма в рублях, от которой считать ставку
|
|
||||||
);
|
|
||||||
```
|
|
||||||
|
|
||||||
Для типа и суммы имеются отдельные сеттеры:
|
|
||||||
|
|
||||||
```php
|
|
||||||
$vat->setType(VatTypes::VAT20)
|
|
||||||
->setSum(100.15); // 123.45 заменится на 100.15
|
|
||||||
```
|
|
||||||
|
|
||||||
Общую сумму, из которой расчитывается размер налога, можно увеличить, используя метод `addSum()`. Указанная в рублях
|
|
||||||
сумма увеличится на указанные рубли. Для уменьшения суммы следует передать отрицательное число.
|
|
||||||
|
|
||||||
```php
|
|
||||||
$vat->addSum(40) // 100.15 + 40 = 140.15р
|
|
||||||
->addSum(-15); // 140.15 - 15 = 125.15р
|
|
||||||
```
|
|
||||||
|
|
||||||
Получить установленную сумму можно через геттер `getSum()`:
|
|
||||||
|
|
||||||
```php
|
|
||||||
$vat->getSum(); // 125.15р
|
|
||||||
```
|
|
||||||
|
|
||||||
Размер налога по ставке высчитывается из этой общей суммы. Не смотря на то, что геттер и сеттер работают с рублями, **
|
|
||||||
расчёты производятся в копейках**. Сделать это можно через `getCalculated()`:
|
|
||||||
|
|
||||||
```php
|
|
||||||
$vat->getCalculated();
|
|
||||||
// для примера выше это 20% от 125.15р = 25.03р
|
|
||||||
```
|
|
||||||
|
|
||||||
Разберём комплексный пример изменения типа ставки и расчётной суммы:
|
|
||||||
|
|
||||||
Объект класса приводится к JSON-строке автоматически или принудительно:
|
|
||||||
|
|
||||||
```php
|
|
||||||
echo $vat;
|
|
||||||
$json_string = (string)$vat;
|
|
||||||
```
|
|
||||||
|
|
||||||
Чтобы получить те же данные в виде массива, нужно вызвать метод `jsonSerialize()`:
|
|
||||||
|
|
||||||
```php
|
|
||||||
$json_array = $vat->jsonSerialize();
|
|
||||||
```
|
|
||||||
|
|
||||||
<a name="array"></a>
|
|
||||||
## Массив объектов ставок НДС
|
|
||||||
|
|
||||||
> Максимальное количество в массиве - 6.
|
|
||||||
|
|
||||||
Массив инициализируется следующим образом:
|
|
||||||
|
|
||||||
```php
|
|
||||||
$vat_array = new AtolOnline\Entities\VatArray();
|
|
||||||
```
|
|
||||||
|
|
||||||
Чтобы задать содержимое массива, используйте метод `set()`:
|
|
||||||
|
|
||||||
```php
|
|
||||||
use AtolOnline\{Constants\VatTypes, Entities\Vat};
|
|
||||||
|
|
||||||
$vat_array->set([
|
|
||||||
new Vat(VatTypes::VAT10, 123),
|
|
||||||
new Vat(VatTypes::VAT110, 53.2),
|
|
||||||
new Vat(VatTypes::VAT20, 23.99),
|
|
||||||
new Vat(VatTypes::VAT120, 11.43)
|
|
||||||
]);
|
|
||||||
```
|
|
||||||
|
|
||||||
Очистить его можно передачей в сеттер пустого массива:
|
|
||||||
|
|
||||||
```php
|
|
||||||
$vat_array->set([]);
|
|
||||||
```
|
|
||||||
|
|
||||||
Чтобы добавить объект к существующим элементам массива, используйте метод `add()`:
|
|
||||||
|
|
||||||
```php
|
|
||||||
use AtolOnline\{Constants\VatTypes, Entities\Vat};
|
|
||||||
|
|
||||||
$vat = new Vat(VatTypes::VAT20, 20);
|
|
||||||
$vat_array->add($vat);
|
|
||||||
```
|
|
||||||
|
|
||||||
Методы `set()` и `add()` проверяют количество элементов в массиве перед его обновлением.
|
|
||||||
Выбрасывают исключение `AtolTooManyVatsException` (если в массиве уже максимальное количество объектов).
|
|
||||||
|
|
||||||
Чтобы получить содержимое массива, используйте метод `get()`:
|
|
||||||
|
|
||||||
```php
|
|
||||||
$vat_array->get();
|
|
||||||
```
|
|
||||||
|
|
||||||
Объект класса приводится к JSON-строке автоматически или принудительным приведением к `string`:
|
|
||||||
|
|
||||||
```php
|
|
||||||
echo $vat_array;
|
|
||||||
$json_string = (string)$vat_array;
|
|
||||||
```
|
|
||||||
|
|
||||||
Чтобы получить те же данные в виде массива, нужно вызвать метод `jsonSerialize()`:
|
|
||||||
|
|
||||||
```php
|
|
||||||
$json_array = $vat_array->jsonSerialize();
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
[Вернуться к содержанию](readme.md)
|
|
@ -35,9 +35,9 @@ abstract class AtolClient
|
|||||||
protected array $request;
|
protected array $request;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var KktResponse|null Последний ответ сервера АТОЛ
|
* @var AtolResponse|null Последний ответ сервера АТОЛ
|
||||||
*/
|
*/
|
||||||
protected ?KktResponse $response;
|
protected ?AtolResponse $response;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var bool Флаг тестового режима
|
* @var bool Флаг тестового режима
|
||||||
@ -106,9 +106,9 @@ abstract class AtolClient
|
|||||||
/**
|
/**
|
||||||
* Возвращает последний ответ сервера
|
* Возвращает последний ответ сервера
|
||||||
*
|
*
|
||||||
* @return KktResponse|null
|
* @return AtolResponse|null
|
||||||
*/
|
*/
|
||||||
public function getLastResponse(): ?KktResponse
|
public function getLastResponse(): ?AtolResponse
|
||||||
{
|
{
|
||||||
return $this->response;
|
return $this->response;
|
||||||
}
|
}
|
||||||
@ -263,7 +263,7 @@ abstract class AtolClient
|
|||||||
'login' => $this->getLogin() ?? throw new EmptyLoginException(),
|
'login' => $this->getLogin() ?? throw new EmptyLoginException(),
|
||||||
'pass' => $this->getPassword() ?? throw new EmptyPasswordException(),
|
'pass' => $this->getPassword() ?? throw new EmptyPasswordException(),
|
||||||
]);
|
]);
|
||||||
if (!$result->isValid() || !$result->getContent()->token) {
|
if (!$result->isSuccessful() || !$result->getContent()->token) {
|
||||||
throw new AuthFailedException($result);
|
throw new AuthFailedException($result);
|
||||||
}
|
}
|
||||||
return $result->getContent()?->token;
|
return $result->getContent()?->token;
|
||||||
@ -276,7 +276,7 @@ abstract class AtolClient
|
|||||||
* @param string $url URL
|
* @param string $url URL
|
||||||
* @param array|null $data Данные для передачи
|
* @param array|null $data Данные для передачи
|
||||||
* @param array|null $options Параметры Guzzle
|
* @param array|null $options Параметры Guzzle
|
||||||
* @return KktResponse
|
* @return AtolResponse
|
||||||
* @throws GuzzleException
|
* @throws GuzzleException
|
||||||
* @see https://guzzle.readthedocs.io/en/latest/request-options.html
|
* @see https://guzzle.readthedocs.io/en/latest/request-options.html
|
||||||
*/
|
*/
|
||||||
@ -285,7 +285,7 @@ abstract class AtolClient
|
|||||||
string $url,
|
string $url,
|
||||||
?array $data = null,
|
?array $data = null,
|
||||||
?array $options = null
|
?array $options = null
|
||||||
): KktResponse {
|
): AtolResponse {
|
||||||
$http_method = strtoupper(trim($http_method));
|
$http_method = strtoupper(trim($http_method));
|
||||||
$options['headers'] = array_merge($this->getHeaders(), $options['headers'] ?? []);
|
$options['headers'] = array_merge($this->getHeaders(), $options['headers'] ?? []);
|
||||||
$http_method != 'GET' && $options['json'] = $data;
|
$http_method != 'GET' && $options['json'] = $data;
|
||||||
@ -294,7 +294,7 @@ abstract class AtolClient
|
|||||||
'url' => $url,
|
'url' => $url,
|
||||||
], $options);
|
], $options);
|
||||||
$response = $this->http->request($http_method, $url, $options);
|
$response = $this->http->request($http_method, $url, $options);
|
||||||
return $this->response = new KktResponse($response);
|
return $this->response = new AtolResponse($response);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -328,5 +328,4 @@ abstract class AtolClient
|
|||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
abstract protected function getMainEndpoint(): string;
|
abstract protected function getMainEndpoint(): string;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -15,8 +15,7 @@ namespace AtolOnline\Api;
|
|||||||
|
|
||||||
use JetBrains\PhpStorm\{
|
use JetBrains\PhpStorm\{
|
||||||
ArrayShape,
|
ArrayShape,
|
||||||
Pure
|
Pure};
|
||||||
};
|
|
||||||
use JsonSerializable;
|
use JsonSerializable;
|
||||||
use Psr\Http\Message\ResponseInterface;
|
use Psr\Http\Message\ResponseInterface;
|
||||||
use Stringable;
|
use Stringable;
|
||||||
@ -27,7 +26,7 @@ use Stringable;
|
|||||||
* @property mixed $error
|
* @property mixed $error
|
||||||
* @package AtolOnline\Api
|
* @package AtolOnline\Api
|
||||||
*/
|
*/
|
||||||
class KktResponse implements JsonSerializable, Stringable
|
final class AtolResponse implements JsonSerializable, Stringable
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* @var int Код ответа сервера
|
* @var int Код ответа сервера
|
||||||
@ -104,7 +103,7 @@ class KktResponse implements JsonSerializable, Stringable
|
|||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
#[Pure]
|
#[Pure]
|
||||||
public function isValid(): bool
|
public function isSuccessful(): bool
|
||||||
{
|
{
|
||||||
return !empty($this->getCode())
|
return !empty($this->getCode())
|
||||||
&& !empty($this->getContent())
|
&& !empty($this->getContent())
|
@ -38,7 +38,7 @@ use Ramsey\Uuid\Uuid;
|
|||||||
/**
|
/**
|
||||||
* Класс фискализатора для регистрации документов на ККТ
|
* Класс фискализатора для регистрации документов на ККТ
|
||||||
*/
|
*/
|
||||||
class KktFiscalizer extends AtolClient
|
final class Fiscalizer extends AtolClient
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* @var string|null Группа ККТ
|
* @var string|null Группа ККТ
|
||||||
@ -139,7 +139,7 @@ class KktFiscalizer extends AtolClient
|
|||||||
*
|
*
|
||||||
* @param Receipt $receipt Объект документа
|
* @param Receipt $receipt Объект документа
|
||||||
* @param string|null $external_id Уникальный код документа (если не указан, то будет создан новый UUID)
|
* @param string|null $external_id Уникальный код документа (если не указан, то будет создан новый UUID)
|
||||||
* @return KktResponse|null
|
* @return AtolResponse|null
|
||||||
* @throws AuthFailedException
|
* @throws AuthFailedException
|
||||||
* @throws EmptyLoginException
|
* @throws EmptyLoginException
|
||||||
* @throws EmptyPasswordException
|
* @throws EmptyPasswordException
|
||||||
@ -149,7 +149,7 @@ class KktFiscalizer extends AtolClient
|
|||||||
* @throws InvalidPaymentAddressException
|
* @throws InvalidPaymentAddressException
|
||||||
* @throws TooLongPaymentAddressException
|
* @throws TooLongPaymentAddressException
|
||||||
*/
|
*/
|
||||||
public function sell(Receipt $receipt, ?string $external_id = null): ?KktResponse
|
public function sell(Receipt $receipt, ?string $external_id = null): ?AtolResponse
|
||||||
{
|
{
|
||||||
return $this->registerDocument('sell', $receipt, $external_id);
|
return $this->registerDocument('sell', $receipt, $external_id);
|
||||||
}
|
}
|
||||||
@ -159,7 +159,7 @@ class KktFiscalizer extends AtolClient
|
|||||||
*
|
*
|
||||||
* @param Receipt $receipt Объект документа
|
* @param Receipt $receipt Объект документа
|
||||||
* @param string|null $external_id Уникальный код документа (если не указан, то будет создан новый UUID)
|
* @param string|null $external_id Уникальный код документа (если не указан, то будет создан новый UUID)
|
||||||
* @return KktResponse|null
|
* @return AtolResponse|null
|
||||||
* @throws AuthFailedException
|
* @throws AuthFailedException
|
||||||
* @throws EmptyLoginException
|
* @throws EmptyLoginException
|
||||||
* @throws EmptyPasswordException
|
* @throws EmptyPasswordException
|
||||||
@ -169,7 +169,7 @@ class KktFiscalizer extends AtolClient
|
|||||||
* @throws InvalidPaymentAddressException
|
* @throws InvalidPaymentAddressException
|
||||||
* @throws TooLongPaymentAddressException
|
* @throws TooLongPaymentAddressException
|
||||||
*/
|
*/
|
||||||
public function sellRefund(Receipt $receipt, ?string $external_id = null): ?KktResponse
|
public function sellRefund(Receipt $receipt, ?string $external_id = null): ?AtolResponse
|
||||||
{
|
{
|
||||||
return $this->registerDocument('sell_refund', $receipt, $external_id);
|
return $this->registerDocument('sell_refund', $receipt, $external_id);
|
||||||
}
|
}
|
||||||
@ -179,7 +179,7 @@ class KktFiscalizer extends AtolClient
|
|||||||
*
|
*
|
||||||
* @param Correction $correction Объект документа
|
* @param Correction $correction Объект документа
|
||||||
* @param string|null $external_id Уникальный код документа (если не указан, то будет создан новый UUID)
|
* @param string|null $external_id Уникальный код документа (если не указан, то будет создан новый UUID)
|
||||||
* @return KktResponse|null
|
* @return AtolResponse|null
|
||||||
* @throws AuthFailedException
|
* @throws AuthFailedException
|
||||||
* @throws EmptyLoginException
|
* @throws EmptyLoginException
|
||||||
* @throws EmptyPasswordException
|
* @throws EmptyPasswordException
|
||||||
@ -189,7 +189,7 @@ class KktFiscalizer extends AtolClient
|
|||||||
* @throws InvalidPaymentAddressException
|
* @throws InvalidPaymentAddressException
|
||||||
* @throws TooLongPaymentAddressException
|
* @throws TooLongPaymentAddressException
|
||||||
*/
|
*/
|
||||||
public function sellCorrect(Correction $correction, ?string $external_id = null): ?KktResponse
|
public function sellCorrect(Correction $correction, ?string $external_id = null): ?AtolResponse
|
||||||
{
|
{
|
||||||
return $this->registerDocument('sell_correction', $correction, $external_id);
|
return $this->registerDocument('sell_correction', $correction, $external_id);
|
||||||
}
|
}
|
||||||
@ -199,7 +199,7 @@ class KktFiscalizer extends AtolClient
|
|||||||
*
|
*
|
||||||
* @param Receipt $receipt Объект документа
|
* @param Receipt $receipt Объект документа
|
||||||
* @param string|null $external_id Уникальный код документа (если не указан, то будет создан новый UUID)
|
* @param string|null $external_id Уникальный код документа (если не указан, то будет создан новый UUID)
|
||||||
* @return KktResponse|null
|
* @return AtolResponse|null
|
||||||
* @throws AuthFailedException
|
* @throws AuthFailedException
|
||||||
* @throws EmptyLoginException
|
* @throws EmptyLoginException
|
||||||
* @throws EmptyPasswordException
|
* @throws EmptyPasswordException
|
||||||
@ -209,7 +209,7 @@ class KktFiscalizer extends AtolClient
|
|||||||
* @throws InvalidPaymentAddressException
|
* @throws InvalidPaymentAddressException
|
||||||
* @throws TooLongPaymentAddressException
|
* @throws TooLongPaymentAddressException
|
||||||
*/
|
*/
|
||||||
public function buy(Receipt $receipt, ?string $external_id = null): ?KktResponse
|
public function buy(Receipt $receipt, ?string $external_id = null): ?AtolResponse
|
||||||
{
|
{
|
||||||
return $this->registerDocument('buy', $receipt, $external_id);
|
return $this->registerDocument('buy', $receipt, $external_id);
|
||||||
}
|
}
|
||||||
@ -219,7 +219,7 @@ class KktFiscalizer extends AtolClient
|
|||||||
*
|
*
|
||||||
* @param Receipt $receipt Объект документа
|
* @param Receipt $receipt Объект документа
|
||||||
* @param string|null $external_id Уникальный код документа (если не указан, то будет создан UUID)
|
* @param string|null $external_id Уникальный код документа (если не указан, то будет создан UUID)
|
||||||
* @return KktResponse|null
|
* @return AtolResponse|null
|
||||||
* @throws AuthFailedException
|
* @throws AuthFailedException
|
||||||
* @throws EmptyLoginException
|
* @throws EmptyLoginException
|
||||||
* @throws EmptyPasswordException
|
* @throws EmptyPasswordException
|
||||||
@ -229,7 +229,7 @@ class KktFiscalizer extends AtolClient
|
|||||||
* @throws InvalidPaymentAddressException
|
* @throws InvalidPaymentAddressException
|
||||||
* @throws TooLongPaymentAddressException
|
* @throws TooLongPaymentAddressException
|
||||||
*/
|
*/
|
||||||
public function buyRefund(Receipt $receipt, ?string $external_id = null): ?KktResponse
|
public function buyRefund(Receipt $receipt, ?string $external_id = null): ?AtolResponse
|
||||||
{
|
{
|
||||||
return $this->registerDocument('buy_refund', $receipt, $external_id);
|
return $this->registerDocument('buy_refund', $receipt, $external_id);
|
||||||
}
|
}
|
||||||
@ -239,7 +239,7 @@ class KktFiscalizer extends AtolClient
|
|||||||
*
|
*
|
||||||
* @param Correction $correction Объект документа
|
* @param Correction $correction Объект документа
|
||||||
* @param string|null $external_id Уникальный код документа (если не указан, то будет создан новый UUID)
|
* @param string|null $external_id Уникальный код документа (если не указан, то будет создан новый UUID)
|
||||||
* @return KktResponse|null
|
* @return AtolResponse|null
|
||||||
* @throws AuthFailedException
|
* @throws AuthFailedException
|
||||||
* @throws EmptyLoginException
|
* @throws EmptyLoginException
|
||||||
* @throws EmptyPasswordException
|
* @throws EmptyPasswordException
|
||||||
@ -249,7 +249,7 @@ class KktFiscalizer extends AtolClient
|
|||||||
* @throws InvalidPaymentAddressException
|
* @throws InvalidPaymentAddressException
|
||||||
* @throws TooLongPaymentAddressException
|
* @throws TooLongPaymentAddressException
|
||||||
*/
|
*/
|
||||||
public function buyCorrect(Correction $correction, ?string $external_id = null): ?KktResponse
|
public function buyCorrect(Correction $correction, ?string $external_id = null): ?AtolResponse
|
||||||
{
|
{
|
||||||
return $this->registerDocument('buy_correction', $correction, $external_id);
|
return $this->registerDocument('buy_correction', $correction, $external_id);
|
||||||
}
|
}
|
||||||
@ -258,14 +258,14 @@ class KktFiscalizer extends AtolClient
|
|||||||
* Проверяет статус чека на ККТ один раз
|
* Проверяет статус чека на ККТ один раз
|
||||||
*
|
*
|
||||||
* @param string $uuid UUID регистрации
|
* @param string $uuid UUID регистрации
|
||||||
* @return KktResponse|null
|
* @return AtolResponse|null
|
||||||
* @throws AuthFailedException
|
* @throws AuthFailedException
|
||||||
* @throws EmptyLoginException
|
* @throws EmptyLoginException
|
||||||
* @throws EmptyPasswordException
|
* @throws EmptyPasswordException
|
||||||
* @throws GuzzleException
|
* @throws GuzzleException
|
||||||
* @throws InvalidUuidException
|
* @throws InvalidUuidException
|
||||||
*/
|
*/
|
||||||
public function getDocumentStatus(string $uuid): ?KktResponse
|
public function getDocumentStatus(string $uuid): ?AtolResponse
|
||||||
{
|
{
|
||||||
!Uuid::isValid($uuid = trim($uuid)) && throw new InvalidUuidException($uuid);
|
!Uuid::isValid($uuid = trim($uuid)) && throw new InvalidUuidException($uuid);
|
||||||
return $this->auth()
|
return $this->auth()
|
||||||
@ -280,19 +280,19 @@ class KktFiscalizer extends AtolClient
|
|||||||
* @param string $uuid UUID регистрации
|
* @param string $uuid UUID регистрации
|
||||||
* @param int $retry_count Количество попыток
|
* @param int $retry_count Количество попыток
|
||||||
* @param int $timeout Таймаут в секундах между попытками
|
* @param int $timeout Таймаут в секундах между попытками
|
||||||
* @return KktResponse|null
|
* @return AtolResponse|null
|
||||||
* @throws AuthFailedException
|
* @throws AuthFailedException
|
||||||
* @throws EmptyLoginException
|
* @throws EmptyLoginException
|
||||||
* @throws EmptyPasswordException
|
* @throws EmptyPasswordException
|
||||||
* @throws GuzzleException
|
* @throws GuzzleException
|
||||||
* @throws InvalidUuidException
|
* @throws InvalidUuidException
|
||||||
*/
|
*/
|
||||||
public function pollDocumentStatus(string $uuid, int $retry_count = 5, int $timeout = 1): ?KktResponse
|
public function pollDocumentStatus(string $uuid, int $retry_count = 5, int $timeout = 1): ?AtolResponse
|
||||||
{
|
{
|
||||||
$try = 0;
|
$try = 0;
|
||||||
do {
|
do {
|
||||||
$response = $this->getDocumentStatus($uuid);
|
$response = $this->getDocumentStatus($uuid);
|
||||||
if ($response->isValid() && $response->getContent()->status == 'done') {
|
if ($response->isSuccessful() && $response->getContent()->status == 'done') {
|
||||||
break;
|
break;
|
||||||
} else {
|
} else {
|
||||||
sleep($timeout);
|
sleep($timeout);
|
||||||
@ -308,7 +308,7 @@ class KktFiscalizer extends AtolClient
|
|||||||
* @param string $api_method Метод API
|
* @param string $api_method Метод API
|
||||||
* @param Receipt|Correction $document Документ
|
* @param Receipt|Correction $document Документ
|
||||||
* @param string|null $external_id Уникальный код документа (если не указан, то будет создан новый UUID)
|
* @param string|null $external_id Уникальный код документа (если не указан, то будет создан новый UUID)
|
||||||
* @return KktResponse|null
|
* @return AtolResponse|null
|
||||||
* @throws AuthFailedException
|
* @throws AuthFailedException
|
||||||
* @throws EmptyLoginException
|
* @throws EmptyLoginException
|
||||||
* @throws EmptyPasswordException
|
* @throws EmptyPasswordException
|
||||||
@ -322,7 +322,7 @@ class KktFiscalizer extends AtolClient
|
|||||||
string $api_method,
|
string $api_method,
|
||||||
Receipt|Correction $document,
|
Receipt|Correction $document,
|
||||||
?string $external_id = null
|
?string $external_id = null
|
||||||
): ?KktResponse {
|
): ?AtolResponse {
|
||||||
$this->isTestMode() && $document->getCompany()
|
$this->isTestMode() && $document->getCompany()
|
||||||
->setInn(TestEnvParams::FFD105()['inn'])
|
->setInn(TestEnvParams::FFD105()['inn'])
|
||||||
->setPaymentAddress(TestEnvParams::FFD105()['payment_address']);
|
->setPaymentAddress(TestEnvParams::FFD105()['payment_address']);
|
@ -27,7 +27,7 @@ use JetBrains\PhpStorm\Pure;
|
|||||||
*
|
*
|
||||||
* @see https://online.atol.ru/files/API_service_information.pdf Документация
|
* @see https://online.atol.ru/files/API_service_information.pdf Документация
|
||||||
*/
|
*/
|
||||||
class KktMonitor extends AtolClient
|
final class Monitor extends AtolClient
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* @inheritDoc
|
* @inheritDoc
|
||||||
@ -56,14 +56,14 @@ class KktMonitor extends AtolClient
|
|||||||
*
|
*
|
||||||
* @param int|null $limit
|
* @param int|null $limit
|
||||||
* @param int|null $offset
|
* @param int|null $offset
|
||||||
* @return KktResponse|null
|
* @return AtolResponse|null
|
||||||
* @throws GuzzleException
|
* @throws GuzzleException
|
||||||
* @throws AuthFailedException
|
* @throws AuthFailedException
|
||||||
* @throws EmptyLoginException
|
* @throws EmptyLoginException
|
||||||
* @throws EmptyPasswordException
|
* @throws EmptyPasswordException
|
||||||
* @see https://online.atol.ru/files/API_service_information.pdf Документация, стр 9
|
* @see https://online.atol.ru/files/API_service_information.pdf Документация, стр 9
|
||||||
*/
|
*/
|
||||||
protected function fetchAll(?int $limit = null, ?int $offset = null): ?KktResponse
|
protected function fetchAll(?int $limit = null, ?int $offset = null): ?AtolResponse
|
||||||
{
|
{
|
||||||
$params = [];
|
$params = [];
|
||||||
!is_null($limit) && $params['limit'] = $limit;
|
!is_null($limit) && $params['limit'] = $limit;
|
||||||
@ -95,11 +95,11 @@ class KktMonitor extends AtolClient
|
|||||||
* Получает от API информацию о конкретной ККТ по её серийному номеру
|
* Получает от API информацию о конкретной ККТ по её серийному номеру
|
||||||
*
|
*
|
||||||
* @param string $serial_number
|
* @param string $serial_number
|
||||||
* @return KktResponse
|
* @return AtolResponse
|
||||||
* @throws GuzzleException
|
* @throws GuzzleException
|
||||||
* @see https://online.atol.ru/files/API_service_information.pdf Документация, стр 11
|
* @see https://online.atol.ru/files/API_service_information.pdf Документация, стр 11
|
||||||
*/
|
*/
|
||||||
protected function fetchOne(string $serial_number): KktResponse
|
protected function fetchOne(string $serial_number): AtolResponse
|
||||||
{
|
{
|
||||||
return $this->sendRequest(
|
return $this->sendRequest(
|
||||||
'GET',
|
'GET',
|
@ -10,8 +10,8 @@
|
|||||||
namespace AtolOnline\Entities;
|
namespace AtolOnline\Entities;
|
||||||
|
|
||||||
use AtolOnline\{
|
use AtolOnline\{
|
||||||
Api\KktFiscalizer,
|
Api\AtolResponse,
|
||||||
Api\KktResponse,
|
Api\Fiscalizer,
|
||||||
Collections\Payments,
|
Collections\Payments,
|
||||||
Collections\Vats,
|
Collections\Vats,
|
||||||
Constants\Constraints};
|
Constants\Constraints};
|
||||||
@ -33,7 +33,7 @@ use JetBrains\PhpStorm\ArrayShape;
|
|||||||
*
|
*
|
||||||
* @see https://online.atol.ru/files/API_atol_online_v4.pdf Документация, стр 35
|
* @see https://online.atol.ru/files/API_atol_online_v4.pdf Документация, стр 35
|
||||||
*/
|
*/
|
||||||
class Correction extends Entity
|
final class Correction extends Entity
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* Тип документа
|
* Тип документа
|
||||||
@ -188,7 +188,7 @@ class Correction extends Entity
|
|||||||
*
|
*
|
||||||
* @return Vats|null
|
* @return Vats|null
|
||||||
*/
|
*/
|
||||||
public function getVats(): ?Vats
|
public function getVats(): Vats
|
||||||
{
|
{
|
||||||
return $this->vats ?? new Vats();
|
return $this->vats ?? new Vats();
|
||||||
}
|
}
|
||||||
@ -200,7 +200,7 @@ class Correction extends Entity
|
|||||||
* @return $this
|
* @return $this
|
||||||
* @throws Exception
|
* @throws Exception
|
||||||
*/
|
*/
|
||||||
public function setVats(?Vats $vats): self
|
public function setVats(Vats $vats): self
|
||||||
{
|
{
|
||||||
$vats->checkCount();
|
$vats->checkCount();
|
||||||
$vats->checkItemsClasses();
|
$vats->checkItemsClasses();
|
||||||
@ -211,9 +211,9 @@ class Correction extends Entity
|
|||||||
/**
|
/**
|
||||||
* Регистрирует коррекцию прихода по текущему документу
|
* Регистрирует коррекцию прихода по текущему документу
|
||||||
*
|
*
|
||||||
* @param KktFiscalizer $fiscalizer Объект фискализатора
|
* @param Fiscalizer $fiscalizer Объект фискализатора
|
||||||
* @param string|null $external_id Уникальный код документа (если не указан, то будет создан новый UUID)
|
* @param string|null $external_id Уникальный код документа (если не указан, то будет создан новый UUID)
|
||||||
* @return KktResponse|null
|
* @return AtolResponse|null
|
||||||
* @throws AuthFailedException
|
* @throws AuthFailedException
|
||||||
* @throws EmptyLoginException
|
* @throws EmptyLoginException
|
||||||
* @throws EmptyPasswordException
|
* @throws EmptyPasswordException
|
||||||
@ -223,7 +223,7 @@ class Correction extends Entity
|
|||||||
* @throws InvalidPaymentAddressException
|
* @throws InvalidPaymentAddressException
|
||||||
* @throws TooLongPaymentAddressException
|
* @throws TooLongPaymentAddressException
|
||||||
*/
|
*/
|
||||||
public function sellCorrect(KktFiscalizer $fiscalizer, ?string $external_id = null): ?KktResponse
|
public function sellCorrect(Fiscalizer $fiscalizer, ?string $external_id = null): ?AtolResponse
|
||||||
{
|
{
|
||||||
return $fiscalizer->sellCorrect($this, $external_id);
|
return $fiscalizer->sellCorrect($this, $external_id);
|
||||||
}
|
}
|
||||||
@ -231,9 +231,9 @@ class Correction extends Entity
|
|||||||
/**
|
/**
|
||||||
* Регистрирует коррекцию расхода по текущему документу
|
* Регистрирует коррекцию расхода по текущему документу
|
||||||
*
|
*
|
||||||
* @param KktFiscalizer $fiscalizer Объект фискализатора
|
* @param Fiscalizer $fiscalizer Объект фискализатора
|
||||||
* @param string|null $external_id Уникальный код документа (если не указан, то будет создан новый UUID)
|
* @param string|null $external_id Уникальный код документа (если не указан, то будет создан новый UUID)
|
||||||
* @return KktResponse|null
|
* @return AtolResponse|null
|
||||||
* @throws AuthFailedException
|
* @throws AuthFailedException
|
||||||
* @throws EmptyLoginException
|
* @throws EmptyLoginException
|
||||||
* @throws EmptyPasswordException
|
* @throws EmptyPasswordException
|
||||||
@ -243,7 +243,7 @@ class Correction extends Entity
|
|||||||
* @throws InvalidPaymentAddressException
|
* @throws InvalidPaymentAddressException
|
||||||
* @throws TooLongPaymentAddressException
|
* @throws TooLongPaymentAddressException
|
||||||
*/
|
*/
|
||||||
public function buyCorrect(KktFiscalizer $fiscalizer, ?string $external_id = null): ?KktResponse
|
public function buyCorrect(Fiscalizer $fiscalizer, ?string $external_id = null): ?AtolResponse
|
||||||
{
|
{
|
||||||
return $fiscalizer->buyCorrect($this, $external_id);
|
return $fiscalizer->buyCorrect($this, $external_id);
|
||||||
}
|
}
|
||||||
|
@ -38,7 +38,7 @@ abstract class Entity implements JsonSerializable, Stringable, Arrayable, ArrayA
|
|||||||
'correction_info' => "\AtolOnline\Entities\CorrectionInfo",
|
'correction_info' => "\AtolOnline\Entities\CorrectionInfo",
|
||||||
'payments' => "array",
|
'payments' => "array",
|
||||||
'vats' => "\AtolOnline\Collections\Vats|null",
|
'vats' => "\AtolOnline\Collections\Vats|null",
|
||||||
'cashier' => "\null|string"
|
'cashier' => "null|string",
|
||||||
])]
|
])]
|
||||||
public function toArray()
|
public function toArray()
|
||||||
{
|
{
|
||||||
|
@ -11,8 +11,8 @@ declare(strict_types = 1);
|
|||||||
|
|
||||||
namespace AtolOnline\Entities;
|
namespace AtolOnline\Entities;
|
||||||
|
|
||||||
use AtolOnline\Api\KktFiscalizer;
|
use AtolOnline\Api\AtolResponse;
|
||||||
use AtolOnline\Api\KktResponse;
|
use AtolOnline\Api\Fiscalizer;
|
||||||
use AtolOnline\Collections\Items;
|
use AtolOnline\Collections\Items;
|
||||||
use AtolOnline\Collections\Payments;
|
use AtolOnline\Collections\Payments;
|
||||||
use AtolOnline\Collections\Vats;
|
use AtolOnline\Collections\Vats;
|
||||||
@ -377,9 +377,9 @@ final class Receipt extends Entity
|
|||||||
/**
|
/**
|
||||||
* Регистрирует приход по текущему документу
|
* Регистрирует приход по текущему документу
|
||||||
*
|
*
|
||||||
* @param KktFiscalizer $fiscalizer Объект фискализатора
|
* @param Fiscalizer $fiscalizer Объект фискализатора
|
||||||
* @param string|null $external_id Уникальный код документа (если не указан, то будет создан новый UUID)
|
* @param string|null $external_id Уникальный код документа (если не указан, то будет создан новый UUID)
|
||||||
* @return KktResponse|null
|
* @return AtolResponse|null
|
||||||
* @throws AuthFailedException
|
* @throws AuthFailedException
|
||||||
* @throws EmptyLoginException
|
* @throws EmptyLoginException
|
||||||
* @throws EmptyPasswordException
|
* @throws EmptyPasswordException
|
||||||
@ -389,7 +389,7 @@ final class Receipt extends Entity
|
|||||||
* @throws InvalidPaymentAddressException
|
* @throws InvalidPaymentAddressException
|
||||||
* @throws TooLongPaymentAddressException
|
* @throws TooLongPaymentAddressException
|
||||||
*/
|
*/
|
||||||
public function sell(KktFiscalizer $fiscalizer, ?string $external_id = null): ?KktResponse
|
public function sell(Fiscalizer $fiscalizer, ?string $external_id = null): ?AtolResponse
|
||||||
{
|
{
|
||||||
return $fiscalizer->sell($this, $external_id);
|
return $fiscalizer->sell($this, $external_id);
|
||||||
}
|
}
|
||||||
@ -397,9 +397,9 @@ final class Receipt extends Entity
|
|||||||
/**
|
/**
|
||||||
* Регистрирует возврат прихода по текущему документу
|
* Регистрирует возврат прихода по текущему документу
|
||||||
*
|
*
|
||||||
* @param KktFiscalizer $fiscalizer Объект фискализатора
|
* @param Fiscalizer $fiscalizer Объект фискализатора
|
||||||
* @param string|null $external_id Уникальный код документа (если не указан, то будет создан новый UUID)
|
* @param string|null $external_id Уникальный код документа (если не указан, то будет создан новый UUID)
|
||||||
* @return KktResponse|null
|
* @return AtolResponse|null
|
||||||
* @throws AuthFailedException
|
* @throws AuthFailedException
|
||||||
* @throws EmptyLoginException
|
* @throws EmptyLoginException
|
||||||
* @throws EmptyPasswordException
|
* @throws EmptyPasswordException
|
||||||
@ -409,7 +409,7 @@ final class Receipt extends Entity
|
|||||||
* @throws InvalidPaymentAddressException
|
* @throws InvalidPaymentAddressException
|
||||||
* @throws TooLongPaymentAddressException
|
* @throws TooLongPaymentAddressException
|
||||||
*/
|
*/
|
||||||
public function sellRefund(KktFiscalizer $fiscalizer, ?string $external_id = null): ?KktResponse
|
public function sellRefund(Fiscalizer $fiscalizer, ?string $external_id = null): ?AtolResponse
|
||||||
{
|
{
|
||||||
return $fiscalizer->sellRefund($this, $external_id);
|
return $fiscalizer->sellRefund($this, $external_id);
|
||||||
}
|
}
|
||||||
@ -417,9 +417,9 @@ final class Receipt extends Entity
|
|||||||
/**
|
/**
|
||||||
* Регистрирует расход по текущему документу
|
* Регистрирует расход по текущему документу
|
||||||
*
|
*
|
||||||
* @param KktFiscalizer $fiscalizer Объект фискализатора
|
* @param Fiscalizer $fiscalizer Объект фискализатора
|
||||||
* @param string|null $external_id Уникальный код документа (если не указан, то будет создан новый UUID)
|
* @param string|null $external_id Уникальный код документа (если не указан, то будет создан новый UUID)
|
||||||
* @return KktResponse|null
|
* @return AtolResponse|null
|
||||||
* @throws AuthFailedException
|
* @throws AuthFailedException
|
||||||
* @throws EmptyLoginException
|
* @throws EmptyLoginException
|
||||||
* @throws EmptyPasswordException
|
* @throws EmptyPasswordException
|
||||||
@ -429,7 +429,7 @@ final class Receipt extends Entity
|
|||||||
* @throws InvalidPaymentAddressException
|
* @throws InvalidPaymentAddressException
|
||||||
* @throws TooLongPaymentAddressException
|
* @throws TooLongPaymentAddressException
|
||||||
*/
|
*/
|
||||||
public function buy(KktFiscalizer $fiscalizer, ?string $external_id = null): ?KktResponse
|
public function buy(Fiscalizer $fiscalizer, ?string $external_id = null): ?AtolResponse
|
||||||
{
|
{
|
||||||
return $fiscalizer->buy($this, $external_id);
|
return $fiscalizer->buy($this, $external_id);
|
||||||
}
|
}
|
||||||
@ -437,9 +437,9 @@ final class Receipt extends Entity
|
|||||||
/**
|
/**
|
||||||
* Регистрирует возврат расхода по текущему документу
|
* Регистрирует возврат расхода по текущему документу
|
||||||
*
|
*
|
||||||
* @param KktFiscalizer $fiscalizer Объект фискализатора
|
* @param Fiscalizer $fiscalizer Объект фискализатора
|
||||||
* @param string|null $external_id Уникальный код документа (если не указан, то будет создан новый UUID)
|
* @param string|null $external_id Уникальный код документа (если не указан, то будет создан новый UUID)
|
||||||
* @return KktResponse|null
|
* @return AtolResponse|null
|
||||||
* @throws AuthFailedException
|
* @throws AuthFailedException
|
||||||
* @throws EmptyLoginException
|
* @throws EmptyLoginException
|
||||||
* @throws EmptyPasswordException
|
* @throws EmptyPasswordException
|
||||||
@ -449,7 +449,7 @@ final class Receipt extends Entity
|
|||||||
* @throws InvalidPaymentAddressException
|
* @throws InvalidPaymentAddressException
|
||||||
* @throws TooLongPaymentAddressException
|
* @throws TooLongPaymentAddressException
|
||||||
*/
|
*/
|
||||||
public function buyRefund(KktFiscalizer $fiscalizer, ?string $external_id = null): ?KktResponse
|
public function buyRefund(Fiscalizer $fiscalizer, ?string $external_id = null): ?AtolResponse
|
||||||
{
|
{
|
||||||
return $fiscalizer->buyRefund($this, $external_id);
|
return $fiscalizer->buyRefund($this, $external_id);
|
||||||
}
|
}
|
||||||
|
@ -11,7 +11,7 @@ declare(strict_types = 1);
|
|||||||
|
|
||||||
namespace AtolOnline\Exceptions;
|
namespace AtolOnline\Exceptions;
|
||||||
|
|
||||||
use AtolOnline\Api\KktResponse;
|
use AtolOnline\Api\AtolResponse;
|
||||||
use Exception;
|
use Exception;
|
||||||
use JetBrains\PhpStorm\Pure;
|
use JetBrains\PhpStorm\Pure;
|
||||||
|
|
||||||
@ -23,11 +23,11 @@ class AuthFailedException extends Exception
|
|||||||
/**
|
/**
|
||||||
* Конструктор
|
* Конструктор
|
||||||
*
|
*
|
||||||
* @param KktResponse $response
|
* @param AtolResponse $response
|
||||||
* @param string $message
|
* @param string $message
|
||||||
*/
|
*/
|
||||||
#[Pure]
|
#[Pure]
|
||||||
public function __construct(KktResponse $response, string $message = '')
|
public function __construct(AtolResponse $response, string $message = '')
|
||||||
{
|
{
|
||||||
parent::__construct(($message ?: 'Ошибка авторизации: ') . ': ' . $response);
|
parent::__construct(($message ?: 'Ошибка авторизации: ') . ': ' . $response);
|
||||||
}
|
}
|
||||||
|
@ -16,7 +16,7 @@ use AtolOnline\{
|
|||||||
Tests\BasicTestCase};
|
Tests\BasicTestCase};
|
||||||
use AtolOnline\Api\{
|
use AtolOnline\Api\{
|
||||||
AtolClient,
|
AtolClient,
|
||||||
KktFiscalizer};
|
Fiscalizer};
|
||||||
use AtolOnline\Exceptions\{
|
use AtolOnline\Exceptions\{
|
||||||
AuthFailedException,
|
AuthFailedException,
|
||||||
EmptyCorrectionNumberException,
|
EmptyCorrectionNumberException,
|
||||||
@ -39,8 +39,6 @@ use AtolOnline\Exceptions\{
|
|||||||
TooHighPaymentSumException,
|
TooHighPaymentSumException,
|
||||||
TooLongCallbackUrlException,
|
TooLongCallbackUrlException,
|
||||||
TooLongItemNameException,
|
TooLongItemNameException,
|
||||||
TooLongLoginException,
|
|
||||||
TooLongPasswordException,
|
|
||||||
TooLongPaymentAddressException,
|
TooLongPaymentAddressException,
|
||||||
TooManyException};
|
TooManyException};
|
||||||
use GuzzleHttp\Exception\GuzzleException;
|
use GuzzleHttp\Exception\GuzzleException;
|
||||||
@ -48,7 +46,7 @@ use GuzzleHttp\Exception\GuzzleException;
|
|||||||
/**
|
/**
|
||||||
* Набор тестов для проверки работы фискализатора
|
* Набор тестов для проверки работы фискализатора
|
||||||
*/
|
*/
|
||||||
class KktFiscalizerTest extends BasicTestCase
|
class FiscalizerTest extends BasicTestCase
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* @var array Массив UUID-ов результатов регистрации документов для переиспользования
|
* @var array Массив UUID-ов результатов регистрации документов для переиспользования
|
||||||
@ -60,13 +58,13 @@ class KktFiscalizerTest extends BasicTestCase
|
|||||||
* Тестирует успешное создание объекта фискализатора без аргументов конструктора
|
* Тестирует успешное создание объекта фискализатора без аргументов конструктора
|
||||||
*
|
*
|
||||||
* @return void
|
* @return void
|
||||||
* @covers \AtolOnline\Api\KktFiscalizer
|
* @covers \AtolOnline\Api\Fiscalizer
|
||||||
*/
|
*/
|
||||||
public function testConstructorWithourArgs(): void
|
public function testConstructorWithourArgs(): void
|
||||||
{
|
{
|
||||||
$fisc = new KktFiscalizer();
|
$fisc = new Fiscalizer();
|
||||||
$this->assertIsObject($fisc);
|
$this->assertIsObject($fisc);
|
||||||
$this->assertIsSameClass(KktFiscalizer::class, $fisc);
|
$this->assertIsSameClass(Fiscalizer::class, $fisc);
|
||||||
$this->assertExtendsClasses([AtolClient::class], $fisc);
|
$this->assertExtendsClasses([AtolClient::class], $fisc);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -74,41 +72,41 @@ class KktFiscalizerTest extends BasicTestCase
|
|||||||
* Тестирует установку и возврат группы ККТ
|
* Тестирует установку и возврат группы ККТ
|
||||||
*
|
*
|
||||||
* @return void
|
* @return void
|
||||||
* @covers \AtolOnline\Api\KktFiscalizer
|
* @covers \AtolOnline\Api\Fiscalizer
|
||||||
* @covers \AtolOnline\Api\KktFiscalizer::getGroup
|
* @covers \AtolOnline\Api\Fiscalizer::getGroup
|
||||||
* @covers \AtolOnline\Api\KktFiscalizer::setGroup
|
* @covers \AtolOnline\Api\Fiscalizer::setGroup
|
||||||
*/
|
*/
|
||||||
public function testGroup(): void
|
public function testGroup(): void
|
||||||
{
|
{
|
||||||
// test mode
|
// test mode
|
||||||
$this->assertEquals(
|
$this->assertEquals(
|
||||||
TestEnvParams::FFD105()['group'],
|
TestEnvParams::FFD105()['group'],
|
||||||
(new KktFiscalizer(group: 'group'))->getGroup()
|
(new Fiscalizer(group: 'group'))->getGroup()
|
||||||
);
|
);
|
||||||
// prod mode
|
// prod mode
|
||||||
$this->assertEquals('group', (new KktFiscalizer(false, group: 'group'))->getGroup());
|
$this->assertEquals('group', (new Fiscalizer(false, group: 'group'))->getGroup());
|
||||||
$this->assertNull((new KktFiscalizer(false))->getGroup());
|
$this->assertNull((new Fiscalizer(false))->getGroup());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Тестирует выброс исключения при попытке передать пустую группу ККТ в конструктор
|
* Тестирует выброс исключения при попытке передать пустую группу ККТ в конструктор
|
||||||
*
|
*
|
||||||
* @return void
|
* @return void
|
||||||
* @covers \AtolOnline\Api\KktFiscalizer
|
* @covers \AtolOnline\Api\Fiscalizer
|
||||||
* @covers \AtolOnline\Api\KktFiscalizer::setGroup
|
* @covers \AtolOnline\Api\Fiscalizer::setGroup
|
||||||
* @covers \AtolOnline\Exceptions\EmptyGroupException
|
* @covers \AtolOnline\Exceptions\EmptyGroupException
|
||||||
*/
|
*/
|
||||||
public function testEmptyGroupException(): void
|
public function testEmptyGroupException(): void
|
||||||
{
|
{
|
||||||
$this->expectException(EmptyGroupException::class);
|
$this->expectException(EmptyGroupException::class);
|
||||||
new KktFiscalizer(group: "\n\r \0\t");
|
new Fiscalizer(group: "\n\r \0\t");
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Тестирует выброс исключения при попытке установить слишком длинный адрес колбека
|
* Тестирует выброс исключения при попытке установить слишком длинный адрес колбека
|
||||||
*
|
*
|
||||||
* @return void
|
* @return void
|
||||||
* @covers \AtolOnline\Api\KktFiscalizer::setCallbackUrl
|
* @covers \AtolOnline\Api\Fiscalizer::setCallbackUrl
|
||||||
* @covers \AtolOnline\Exceptions\TooLongCallbackUrlException
|
* @covers \AtolOnline\Exceptions\TooLongCallbackUrlException
|
||||||
* @throws InvalidCallbackUrlException
|
* @throws InvalidCallbackUrlException
|
||||||
* @throws TooLongCallbackUrlException
|
* @throws TooLongCallbackUrlException
|
||||||
@ -116,14 +114,14 @@ class KktFiscalizerTest extends BasicTestCase
|
|||||||
public function testTooLongCallbackUrlException(): void
|
public function testTooLongCallbackUrlException(): void
|
||||||
{
|
{
|
||||||
$this->expectException(TooLongCallbackUrlException::class);
|
$this->expectException(TooLongCallbackUrlException::class);
|
||||||
(new KktFiscalizer())->setCallbackUrl(Helpers::randomStr(Constraints::MAX_LENGTH_CALLBACK_URL + 1));
|
(new Fiscalizer())->setCallbackUrl(Helpers::randomStr(Constraints::MAX_LENGTH_CALLBACK_URL + 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Тестирует выброс исключения при попытке установить слишком длинный адрес колбека
|
* Тестирует выброс исключения при попытке установить слишком длинный адрес колбека
|
||||||
*
|
*
|
||||||
* @return void
|
* @return void
|
||||||
* @covers \AtolOnline\Api\KktFiscalizer::setCallbackUrl
|
* @covers \AtolOnline\Api\Fiscalizer::setCallbackUrl
|
||||||
* @covers \AtolOnline\Exceptions\InvalidCallbackUrlException
|
* @covers \AtolOnline\Exceptions\InvalidCallbackUrlException
|
||||||
* @throws InvalidCallbackUrlException
|
* @throws InvalidCallbackUrlException
|
||||||
* @throws TooLongCallbackUrlException
|
* @throws TooLongCallbackUrlException
|
||||||
@ -131,7 +129,7 @@ class KktFiscalizerTest extends BasicTestCase
|
|||||||
public function testInvalidCallbackUrlException(): void
|
public function testInvalidCallbackUrlException(): void
|
||||||
{
|
{
|
||||||
$this->expectException(InvalidCallbackUrlException::class);
|
$this->expectException(InvalidCallbackUrlException::class);
|
||||||
(new KktFiscalizer())->setCallbackUrl(Helpers::randomStr());
|
(new Fiscalizer())->setCallbackUrl(Helpers::randomStr());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -139,15 +137,15 @@ class KktFiscalizerTest extends BasicTestCase
|
|||||||
*
|
*
|
||||||
* @param mixed $param
|
* @param mixed $param
|
||||||
* @return void
|
* @return void
|
||||||
* @covers \AtolOnline\Api\KktFiscalizer::setCallbackUrl
|
* @covers \AtolOnline\Api\Fiscalizer::setCallbackUrl
|
||||||
* @covers \AtolOnline\Api\KktFiscalizer::getCallbackUrl
|
* @covers \AtolOnline\Api\Fiscalizer::getCallbackUrl
|
||||||
* @dataProvider providerNullableStrings
|
* @dataProvider providerNullableStrings
|
||||||
* @throws InvalidCallbackUrlException
|
* @throws InvalidCallbackUrlException
|
||||||
* @throws TooLongCallbackUrlException
|
* @throws TooLongCallbackUrlException
|
||||||
*/
|
*/
|
||||||
public function testNullableCallbackUrl(mixed $param): void
|
public function testNullableCallbackUrl(mixed $param): void
|
||||||
{
|
{
|
||||||
$this->assertNull((new KktFiscalizer())->setCallbackUrl($param)->getCallbackUrl());
|
$this->assertNull((new Fiscalizer())->setCallbackUrl($param)->getCallbackUrl());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -155,11 +153,11 @@ class KktFiscalizerTest extends BasicTestCase
|
|||||||
*
|
*
|
||||||
* @return void
|
* @return void
|
||||||
* @covers \AtolOnline\Entities\Receipt::sell
|
* @covers \AtolOnline\Entities\Receipt::sell
|
||||||
* @covers \AtolOnline\Api\KktFiscalizer::sell
|
* @covers \AtolOnline\Api\Fiscalizer::sell
|
||||||
* @covers \AtolOnline\Api\KktFiscalizer::getFullUrl
|
* @covers \AtolOnline\Api\Fiscalizer::getFullUrl
|
||||||
* @covers \AtolOnline\Api\KktFiscalizer::getAuthEndpoint
|
* @covers \AtolOnline\Api\Fiscalizer::getAuthEndpoint
|
||||||
* @covers \AtolOnline\Api\KktFiscalizer::getMainEndpoint
|
* @covers \AtolOnline\Api\Fiscalizer::getMainEndpoint
|
||||||
* @covers \AtolOnline\Api\KktFiscalizer::registerDocument
|
* @covers \AtolOnline\Api\Fiscalizer::registerDocument
|
||||||
* @throws AuthFailedException
|
* @throws AuthFailedException
|
||||||
* @throws EmptyItemNameException
|
* @throws EmptyItemNameException
|
||||||
* @throws EmptyItemsException
|
* @throws EmptyItemsException
|
||||||
@ -175,16 +173,14 @@ class KktFiscalizerTest extends BasicTestCase
|
|||||||
* @throws TooHighItemPriceException
|
* @throws TooHighItemPriceException
|
||||||
* @throws TooHighPaymentSumException
|
* @throws TooHighPaymentSumException
|
||||||
* @throws TooLongItemNameException
|
* @throws TooLongItemNameException
|
||||||
* @throws TooLongLoginException
|
|
||||||
* @throws TooLongPasswordException
|
|
||||||
* @throws TooLongPaymentAddressException
|
* @throws TooLongPaymentAddressException
|
||||||
* @throws TooManyException
|
* @throws TooManyException
|
||||||
* @throws GuzzleException
|
* @throws GuzzleException
|
||||||
*/
|
*/
|
||||||
public function testSell(): void
|
public function testSell(): void
|
||||||
{
|
{
|
||||||
$fisc_result = $this->newReceipt()->sell(new KktFiscalizer());
|
$fisc_result = $this->newReceipt()->sell(new Fiscalizer());
|
||||||
$this->assertTrue($fisc_result->isValid());
|
$this->assertTrue($fisc_result->isSuccessful());
|
||||||
$this->assertEquals('wait', $fisc_result->getContent()->status);
|
$this->assertEquals('wait', $fisc_result->getContent()->status);
|
||||||
self::$registered_uuids[] = $fisc_result->getContent()->uuid;
|
self::$registered_uuids[] = $fisc_result->getContent()->uuid;
|
||||||
}
|
}
|
||||||
@ -194,11 +190,11 @@ class KktFiscalizerTest extends BasicTestCase
|
|||||||
*
|
*
|
||||||
* @return void
|
* @return void
|
||||||
* @covers \AtolOnline\Entities\Receipt::sellRefund
|
* @covers \AtolOnline\Entities\Receipt::sellRefund
|
||||||
* @covers \AtolOnline\Api\KktFiscalizer::sellRefund
|
* @covers \AtolOnline\Api\Fiscalizer::sellRefund
|
||||||
* @covers \AtolOnline\Api\KktFiscalizer::getFullUrl
|
* @covers \AtolOnline\Api\Fiscalizer::getFullUrl
|
||||||
* @covers \AtolOnline\Api\KktFiscalizer::getAuthEndpoint
|
* @covers \AtolOnline\Api\Fiscalizer::getAuthEndpoint
|
||||||
* @covers \AtolOnline\Api\KktFiscalizer::getMainEndpoint
|
* @covers \AtolOnline\Api\Fiscalizer::getMainEndpoint
|
||||||
* @covers \AtolOnline\Api\KktFiscalizer::registerDocument
|
* @covers \AtolOnline\Api\Fiscalizer::registerDocument
|
||||||
* @throws AuthFailedException
|
* @throws AuthFailedException
|
||||||
* @throws EmptyItemNameException
|
* @throws EmptyItemNameException
|
||||||
* @throws EmptyItemsException
|
* @throws EmptyItemsException
|
||||||
@ -214,16 +210,14 @@ class KktFiscalizerTest extends BasicTestCase
|
|||||||
* @throws TooHighItemPriceException
|
* @throws TooHighItemPriceException
|
||||||
* @throws TooHighPaymentSumException
|
* @throws TooHighPaymentSumException
|
||||||
* @throws TooLongItemNameException
|
* @throws TooLongItemNameException
|
||||||
* @throws TooLongLoginException
|
|
||||||
* @throws TooLongPasswordException
|
|
||||||
* @throws TooLongPaymentAddressException
|
* @throws TooLongPaymentAddressException
|
||||||
* @throws TooManyException
|
* @throws TooManyException
|
||||||
* @throws GuzzleException
|
* @throws GuzzleException
|
||||||
*/
|
*/
|
||||||
public function testSellRefund(): void
|
public function testSellRefund(): void
|
||||||
{
|
{
|
||||||
$fisc_result = $this->newReceipt()->sellRefund(new KktFiscalizer());
|
$fisc_result = $this->newReceipt()->sellRefund(new Fiscalizer());
|
||||||
$this->assertTrue($fisc_result->isValid());
|
$this->assertTrue($fisc_result->isSuccessful());
|
||||||
$this->assertEquals('wait', $fisc_result->getContent()->status);
|
$this->assertEquals('wait', $fisc_result->getContent()->status);
|
||||||
self::$registered_uuids[] = $fisc_result->getContent()->uuid;
|
self::$registered_uuids[] = $fisc_result->getContent()->uuid;
|
||||||
}
|
}
|
||||||
@ -233,11 +227,11 @@ class KktFiscalizerTest extends BasicTestCase
|
|||||||
*
|
*
|
||||||
* @return void
|
* @return void
|
||||||
* @covers \AtolOnline\Entities\Correction::sellCorrect
|
* @covers \AtolOnline\Entities\Correction::sellCorrect
|
||||||
* @covers \AtolOnline\Api\KktFiscalizer::sellCorrect
|
* @covers \AtolOnline\Api\Fiscalizer::sellCorrect
|
||||||
* @covers \AtolOnline\Api\KktFiscalizer::getFullUrl
|
* @covers \AtolOnline\Api\Fiscalizer::getFullUrl
|
||||||
* @covers \AtolOnline\Api\KktFiscalizer::getAuthEndpoint
|
* @covers \AtolOnline\Api\Fiscalizer::getAuthEndpoint
|
||||||
* @covers \AtolOnline\Api\KktFiscalizer::getMainEndpoint
|
* @covers \AtolOnline\Api\Fiscalizer::getMainEndpoint
|
||||||
* @covers \AtolOnline\Api\KktFiscalizer::registerDocument
|
* @covers \AtolOnline\Api\Fiscalizer::registerDocument
|
||||||
* @throws AuthFailedException
|
* @throws AuthFailedException
|
||||||
* @throws EmptyLoginException
|
* @throws EmptyLoginException
|
||||||
* @throws EmptyPasswordException
|
* @throws EmptyPasswordException
|
||||||
@ -248,18 +242,16 @@ class KktFiscalizerTest extends BasicTestCase
|
|||||||
* @throws InvalidPaymentAddressException
|
* @throws InvalidPaymentAddressException
|
||||||
* @throws NegativePaymentSumException
|
* @throws NegativePaymentSumException
|
||||||
* @throws TooHighPaymentSumException
|
* @throws TooHighPaymentSumException
|
||||||
* @throws TooLongLoginException
|
|
||||||
* @throws TooLongPasswordException
|
|
||||||
* @throws TooLongPaymentAddressException
|
* @throws TooLongPaymentAddressException
|
||||||
* @throws EmptyCorrectionNumberException
|
* @throws EmptyCorrectionNumberException
|
||||||
* @throws InvalidCorrectionDateException
|
* @throws InvalidCorrectionDateException
|
||||||
*/
|
*/
|
||||||
public function testSellCorrect(): void
|
public function testSellCorrect(): void
|
||||||
{
|
{
|
||||||
$fisc_result = $this->newCorrection()->sellCorrect(new KktFiscalizer());
|
$fisc_result = $this->newCorrection()->sellCorrect(new Fiscalizer());
|
||||||
$this->assertTrue($fisc_result->isValid());
|
$this->assertTrue($fisc_result->isSuccessful());
|
||||||
$this->assertEquals('wait', $fisc_result->getContent()->status);
|
$this->assertEquals('wait', $fisc_result->getContent()->status);
|
||||||
self::$registered_uuids[] = $fisc_result->getContent()->uuid;
|
//self::$registered_uuids[] = $fisc_result->getContent()->uuid;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -267,11 +259,11 @@ class KktFiscalizerTest extends BasicTestCase
|
|||||||
*
|
*
|
||||||
* @return void
|
* @return void
|
||||||
* @covers \AtolOnline\Entities\Receipt::buy
|
* @covers \AtolOnline\Entities\Receipt::buy
|
||||||
* @covers \AtolOnline\Api\KktFiscalizer::buy
|
* @covers \AtolOnline\Api\Fiscalizer::buy
|
||||||
* @covers \AtolOnline\Api\KktFiscalizer::getFullUrl
|
* @covers \AtolOnline\Api\Fiscalizer::getFullUrl
|
||||||
* @covers \AtolOnline\Api\KktFiscalizer::getAuthEndpoint
|
* @covers \AtolOnline\Api\Fiscalizer::getAuthEndpoint
|
||||||
* @covers \AtolOnline\Api\KktFiscalizer::getMainEndpoint
|
* @covers \AtolOnline\Api\Fiscalizer::getMainEndpoint
|
||||||
* @covers \AtolOnline\Api\KktFiscalizer::registerDocument
|
* @covers \AtolOnline\Api\Fiscalizer::registerDocument
|
||||||
* @throws AuthFailedException
|
* @throws AuthFailedException
|
||||||
* @throws EmptyItemNameException
|
* @throws EmptyItemNameException
|
||||||
* @throws EmptyItemsException
|
* @throws EmptyItemsException
|
||||||
@ -287,18 +279,16 @@ class KktFiscalizerTest extends BasicTestCase
|
|||||||
* @throws TooHighItemPriceException
|
* @throws TooHighItemPriceException
|
||||||
* @throws TooHighPaymentSumException
|
* @throws TooHighPaymentSumException
|
||||||
* @throws TooLongItemNameException
|
* @throws TooLongItemNameException
|
||||||
* @throws TooLongLoginException
|
|
||||||
* @throws TooLongPasswordException
|
|
||||||
* @throws TooLongPaymentAddressException
|
* @throws TooLongPaymentAddressException
|
||||||
* @throws TooManyException
|
* @throws TooManyException
|
||||||
* @throws GuzzleException
|
* @throws GuzzleException
|
||||||
*/
|
*/
|
||||||
public function testBuy(): void
|
public function testBuy(): void
|
||||||
{
|
{
|
||||||
$fisc_result = $this->newReceipt()->buy(new KktFiscalizer());
|
$fisc_result = $this->newReceipt()->buy(new Fiscalizer());
|
||||||
$this->assertTrue($fisc_result->isValid());
|
$this->assertTrue($fisc_result->isSuccessful());
|
||||||
$this->assertEquals('wait', $fisc_result->getContent()->status);
|
$this->assertEquals('wait', $fisc_result->getContent()->status);
|
||||||
self::$registered_uuids[] = $fisc_result->getContent()->uuid;
|
//self::$registered_uuids[] = $fisc_result->getContent()->uuid;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -306,11 +296,11 @@ class KktFiscalizerTest extends BasicTestCase
|
|||||||
*
|
*
|
||||||
* @return void
|
* @return void
|
||||||
* @covers \AtolOnline\Entities\Receipt::buyRefund
|
* @covers \AtolOnline\Entities\Receipt::buyRefund
|
||||||
* @covers \AtolOnline\Api\KktFiscalizer::buyRefund
|
* @covers \AtolOnline\Api\Fiscalizer::buyRefund
|
||||||
* @covers \AtolOnline\Api\KktFiscalizer::getFullUrl
|
* @covers \AtolOnline\Api\Fiscalizer::getFullUrl
|
||||||
* @covers \AtolOnline\Api\KktFiscalizer::getAuthEndpoint
|
* @covers \AtolOnline\Api\Fiscalizer::getAuthEndpoint
|
||||||
* @covers \AtolOnline\Api\KktFiscalizer::getMainEndpoint
|
* @covers \AtolOnline\Api\Fiscalizer::getMainEndpoint
|
||||||
* @covers \AtolOnline\Api\KktFiscalizer::registerDocument
|
* @covers \AtolOnline\Api\Fiscalizer::registerDocument
|
||||||
* @throws AuthFailedException
|
* @throws AuthFailedException
|
||||||
* @throws EmptyItemNameException
|
* @throws EmptyItemNameException
|
||||||
* @throws EmptyItemsException
|
* @throws EmptyItemsException
|
||||||
@ -326,18 +316,16 @@ class KktFiscalizerTest extends BasicTestCase
|
|||||||
* @throws TooHighItemPriceException
|
* @throws TooHighItemPriceException
|
||||||
* @throws TooHighPaymentSumException
|
* @throws TooHighPaymentSumException
|
||||||
* @throws TooLongItemNameException
|
* @throws TooLongItemNameException
|
||||||
* @throws TooLongLoginException
|
|
||||||
* @throws TooLongPasswordException
|
|
||||||
* @throws TooLongPaymentAddressException
|
* @throws TooLongPaymentAddressException
|
||||||
* @throws TooManyException
|
* @throws TooManyException
|
||||||
* @throws GuzzleException
|
* @throws GuzzleException
|
||||||
*/
|
*/
|
||||||
public function testBuyRefund(): void
|
public function testBuyRefund(): void
|
||||||
{
|
{
|
||||||
$fisc_result = $this->newReceipt()->buyRefund(new KktFiscalizer());
|
$fisc_result = $this->newReceipt()->buyRefund(new Fiscalizer());
|
||||||
$this->assertTrue($fisc_result->isValid());
|
$this->assertTrue($fisc_result->isSuccessful());
|
||||||
$this->assertEquals('wait', $fisc_result->getContent()->status);
|
$this->assertEquals('wait', $fisc_result->getContent()->status);
|
||||||
self::$registered_uuids[] = $fisc_result->getContent()->uuid;
|
//self::$registered_uuids[] = $fisc_result->getContent()->uuid;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -345,11 +333,11 @@ class KktFiscalizerTest extends BasicTestCase
|
|||||||
*
|
*
|
||||||
* @return void
|
* @return void
|
||||||
* @covers \AtolOnline\Entities\Correction::buyCorrect
|
* @covers \AtolOnline\Entities\Correction::buyCorrect
|
||||||
* @covers \AtolOnline\Api\KktFiscalizer::buyCorrect
|
* @covers \AtolOnline\Api\Fiscalizer::buyCorrect
|
||||||
* @covers \AtolOnline\Api\KktFiscalizer::getFullUrl
|
* @covers \AtolOnline\Api\Fiscalizer::getFullUrl
|
||||||
* @covers \AtolOnline\Api\KktFiscalizer::getAuthEndpoint
|
* @covers \AtolOnline\Api\Fiscalizer::getAuthEndpoint
|
||||||
* @covers \AtolOnline\Api\KktFiscalizer::getMainEndpoint
|
* @covers \AtolOnline\Api\Fiscalizer::getMainEndpoint
|
||||||
* @covers \AtolOnline\Api\KktFiscalizer::registerDocument
|
* @covers \AtolOnline\Api\Fiscalizer::registerDocument
|
||||||
* @throws AuthFailedException
|
* @throws AuthFailedException
|
||||||
* @throws EmptyLoginException
|
* @throws EmptyLoginException
|
||||||
* @throws EmptyPasswordException
|
* @throws EmptyPasswordException
|
||||||
@ -360,37 +348,34 @@ class KktFiscalizerTest extends BasicTestCase
|
|||||||
* @throws InvalidPaymentAddressException
|
* @throws InvalidPaymentAddressException
|
||||||
* @throws NegativePaymentSumException
|
* @throws NegativePaymentSumException
|
||||||
* @throws TooHighPaymentSumException
|
* @throws TooHighPaymentSumException
|
||||||
* @throws TooLongLoginException
|
|
||||||
* @throws TooLongPasswordException
|
|
||||||
* @throws TooLongPaymentAddressException
|
* @throws TooLongPaymentAddressException
|
||||||
* @throws EmptyCorrectionNumberException
|
* @throws EmptyCorrectionNumberException
|
||||||
* @throws InvalidCorrectionDateException
|
* @throws InvalidCorrectionDateException
|
||||||
*/
|
*/
|
||||||
public function testBuyCorrect(): void
|
public function testBuyCorrect(): void
|
||||||
{
|
{
|
||||||
$fisc_result = $this->newCorrection()->buyCorrect(new KktFiscalizer());
|
$fisc_result = $this->newCorrection()->buyCorrect(new Fiscalizer());
|
||||||
$this->assertTrue($fisc_result->isValid());
|
$this->assertTrue($fisc_result->isSuccessful());
|
||||||
$this->assertEquals('wait', $fisc_result->getContent()->status);
|
$this->assertEquals('wait', $fisc_result->getContent()->status);
|
||||||
self::$registered_uuids[] = $fisc_result->getContent()->uuid;
|
//self::$registered_uuids[] = $fisc_result->getContent()->uuid;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Тестирует разовое получение статуса фискализации документа
|
* Тестирует разовое получение статуса фискализации документа
|
||||||
*
|
*
|
||||||
* @return void
|
* @return void
|
||||||
* @covers \AtolOnline\Api\KktFiscalizer::getDocumentStatus
|
* @covers \AtolOnline\Api\Fiscalizer::getDocumentStatus
|
||||||
|
* @depends testSell
|
||||||
* @throws AuthFailedException
|
* @throws AuthFailedException
|
||||||
* @throws EmptyLoginException
|
* @throws EmptyLoginException
|
||||||
* @throws EmptyPasswordException
|
* @throws EmptyPasswordException
|
||||||
* @throws GuzzleException
|
* @throws GuzzleException
|
||||||
* @throws InvalidUuidException
|
* @throws InvalidUuidException
|
||||||
* @throws TooLongLoginException
|
|
||||||
* @throws TooLongPasswordException
|
|
||||||
*/
|
*/
|
||||||
public function testGetDocumentStatus(): void
|
public function testGetDocumentStatus(): void
|
||||||
{
|
{
|
||||||
$fisc_status = (new KktFiscalizer())->getDocumentStatus(self::$registered_uuids[0]);
|
$fisc_status = (new Fiscalizer())->getDocumentStatus(array_shift(self::$registered_uuids));
|
||||||
$this->assertTrue($fisc_status->isValid());
|
//$this->assertTrue($fisc_status->isSuccessful());
|
||||||
$this->assertTrue(in_array($fisc_status->getContent()->status, ['wait', 'done']));
|
$this->assertTrue(in_array($fisc_status->getContent()->status, ['wait', 'done']));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -398,20 +383,18 @@ class KktFiscalizerTest extends BasicTestCase
|
|||||||
* Тестирует опрос API на получение статуса фискализации документа
|
* Тестирует опрос API на получение статуса фискализации документа
|
||||||
*
|
*
|
||||||
* @return void
|
* @return void
|
||||||
* @covers \AtolOnline\Api\KktFiscalizer::pollDocumentStatus
|
* @covers \AtolOnline\Api\Fiscalizer::pollDocumentStatus
|
||||||
|
* @depends testSellRefund
|
||||||
* @throws AuthFailedException
|
* @throws AuthFailedException
|
||||||
* @throws EmptyLoginException
|
* @throws EmptyLoginException
|
||||||
* @throws EmptyPasswordException
|
* @throws EmptyPasswordException
|
||||||
* @throws GuzzleException
|
* @throws GuzzleException
|
||||||
* @throws InvalidUuidException
|
* @throws InvalidUuidException
|
||||||
* @throws TooLongLoginException
|
|
||||||
* @throws TooLongPasswordException
|
|
||||||
*/
|
*/
|
||||||
public function testPollDocumentStatus(): void
|
public function testPollDocumentStatus(): void
|
||||||
{
|
{
|
||||||
$fisc_status = (new KktFiscalizer())->pollDocumentStatus(self::$registered_uuids[1]);
|
$fisc_status = (new Fiscalizer())->pollDocumentStatus(array_shift(self::$registered_uuids));
|
||||||
$this->assertTrue($fisc_status->isValid());
|
//$this->assertTrue($fisc_status->isSuccessful());
|
||||||
$this->assertEquals('done', $fisc_status->getContent()->status);
|
$this->assertEquals('done', $fisc_status->getContent()->status);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -10,8 +10,8 @@
|
|||||||
namespace AtolOnline\Tests\Api;
|
namespace AtolOnline\Tests\Api;
|
||||||
|
|
||||||
use AtolOnline\Api\AtolClient;
|
use AtolOnline\Api\AtolClient;
|
||||||
use AtolOnline\Api\KktMonitor;
|
use AtolOnline\Api\AtolResponse;
|
||||||
use AtolOnline\Api\KktResponse;
|
use AtolOnline\Api\Monitor;
|
||||||
use AtolOnline\Entities\Kkt;
|
use AtolOnline\Entities\Kkt;
|
||||||
use AtolOnline\Exceptions\AuthFailedException;
|
use AtolOnline\Exceptions\AuthFailedException;
|
||||||
use AtolOnline\Exceptions\EmptyLoginException;
|
use AtolOnline\Exceptions\EmptyLoginException;
|
||||||
@ -29,20 +29,20 @@ use GuzzleHttp\Exception\GuzzleException;
|
|||||||
/**
|
/**
|
||||||
* Набор тестов для проверки работы API-клиента на примере монитора ККТ
|
* Набор тестов для проверки работы API-клиента на примере монитора ККТ
|
||||||
*/
|
*/
|
||||||
class KktMonitorTest extends BasicTestCase
|
class MonitorTest extends BasicTestCase
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* Возвращает объект монитора для тестирования с тестовым API АТОЛ
|
* Возвращает объект монитора для тестирования с тестовым API АТОЛ
|
||||||
*
|
*
|
||||||
* @return KktMonitor
|
* @return Monitor
|
||||||
* @throws EmptyLoginException
|
* @throws EmptyLoginException
|
||||||
* @throws EmptyPasswordException
|
* @throws EmptyPasswordException
|
||||||
* @throws TooLongLoginException
|
* @throws TooLongLoginException
|
||||||
* @throws TooLongPasswordException
|
* @throws TooLongPasswordException
|
||||||
*/
|
*/
|
||||||
private function newTestClient(): KktMonitor
|
private function newTestClient(): Monitor
|
||||||
{
|
{
|
||||||
return (new KktMonitor(true))
|
return (new Monitor(true))
|
||||||
->setLogin(TestEnvParams::FFD105()['login'])
|
->setLogin(TestEnvParams::FFD105()['login'])
|
||||||
->setPassword(TestEnvParams::FFD105()['password']);
|
->setPassword(TestEnvParams::FFD105()['password']);
|
||||||
}
|
}
|
||||||
@ -50,24 +50,24 @@ class KktMonitorTest extends BasicTestCase
|
|||||||
/**
|
/**
|
||||||
* Тестирует успешное создание объекта монитора без аргументов конструктора
|
* Тестирует успешное создание объекта монитора без аргументов конструктора
|
||||||
*
|
*
|
||||||
* @covers \AtolOnline\Api\KktMonitor::__construct
|
* @covers \AtolOnline\Api\Monitor::__construct
|
||||||
*/
|
*/
|
||||||
public function testConstructorWithoutArgs(): void
|
public function testConstructorWithoutArgs(): void
|
||||||
{
|
{
|
||||||
$client = new KktMonitor();
|
$client = new Monitor();
|
||||||
$this->assertIsObject($client);
|
$this->assertIsObject($client);
|
||||||
$this->assertIsSameClass(KktMonitor::class, $client);
|
$this->assertIsSameClass(Monitor::class, $client);
|
||||||
$this->assertExtendsClasses([AtolClient::class], $client);
|
$this->assertExtendsClasses([AtolClient::class], $client);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Тестирует успешное создание объекта монитора с аргументами конструктора
|
* Тестирует успешное создание объекта монитора с аргументами конструктора
|
||||||
*
|
*
|
||||||
* @covers \AtolOnline\Api\KktMonitor::__construct
|
* @covers \AtolOnline\Api\Monitor::__construct
|
||||||
* @covers \AtolOnline\Api\KktMonitor::setLogin
|
* @covers \AtolOnline\Api\Monitor::setLogin
|
||||||
* @covers \AtolOnline\Api\KktMonitor::getLogin
|
* @covers \AtolOnline\Api\Monitor::getLogin
|
||||||
* @covers \AtolOnline\Api\KktMonitor::setPassword
|
* @covers \AtolOnline\Api\Monitor::setPassword
|
||||||
* @covers \AtolOnline\Api\KktMonitor::getPassword
|
* @covers \AtolOnline\Api\Monitor::getPassword
|
||||||
* @throws EmptyLoginException
|
* @throws EmptyLoginException
|
||||||
* @throws EmptyPasswordException
|
* @throws EmptyPasswordException
|
||||||
* @throws TooLongLoginException
|
* @throws TooLongLoginException
|
||||||
@ -75,27 +75,28 @@ class KktMonitorTest extends BasicTestCase
|
|||||||
*/
|
*/
|
||||||
public function testConstructorWithArgs(): void
|
public function testConstructorWithArgs(): void
|
||||||
{
|
{
|
||||||
$client = new KktMonitor(false, 'login', 'password', []);
|
$client = new Monitor(false, 'login', 'password', []);
|
||||||
$this->assertIsObject($client);
|
$this->assertIsObject($client);
|
||||||
$this->assertIsSameClass($client, KktMonitor::class);
|
$this->assertIsSameClass($client, Monitor::class);
|
||||||
$this->assertExtendsClasses([AtolClient::class], $client);
|
$this->assertExtendsClasses([AtolClient::class], $client);
|
||||||
}
|
}
|
||||||
|
//
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Тестирует установку и возврат логина
|
* Тестирует установку и возврат логина
|
||||||
*
|
*
|
||||||
* @covers \AtolOnline\Api\KktMonitor::__construct
|
* @covers \AtolOnline\Api\Monitor::__construct
|
||||||
* @covers \AtolOnline\Api\KktMonitor::getLogin
|
* @covers \AtolOnline\Api\Monitor::getLogin
|
||||||
* @covers \AtolOnline\Api\KktMonitor::setLogin
|
* @covers \AtolOnline\Api\Monitor::setLogin
|
||||||
* @throws EmptyLoginException
|
* @throws EmptyLoginException
|
||||||
* @throws TooLongLoginException
|
* @throws TooLongLoginException
|
||||||
*/
|
*/
|
||||||
public function testLogin(): void
|
public function testLogin(): void
|
||||||
{
|
{
|
||||||
$client = new KktMonitor(false, login: 'login');
|
$client = new Monitor(false, login: 'login');
|
||||||
$this->assertEquals('login', $client->getLogin());
|
$this->assertEquals('login', $client->getLogin());
|
||||||
|
|
||||||
$client = new KktMonitor();
|
$client = new Monitor();
|
||||||
$this->assertEquals(TestEnvParams::FFD105()['login'], $client->getLogin());
|
$this->assertEquals(TestEnvParams::FFD105()['login'], $client->getLogin());
|
||||||
|
|
||||||
$client->setLogin('login');
|
$client->setLogin('login');
|
||||||
@ -105,21 +106,21 @@ class KktMonitorTest extends BasicTestCase
|
|||||||
/**
|
/**
|
||||||
* Тестирует исключение при попытке передать пустой логин в конструктор
|
* Тестирует исключение при попытке передать пустой логин в конструктор
|
||||||
*
|
*
|
||||||
* @covers \AtolOnline\Api\KktMonitor::__construct
|
* @covers \AtolOnline\Api\Monitor::__construct
|
||||||
* @covers \AtolOnline\Api\KktMonitor::setLogin
|
* @covers \AtolOnline\Api\Monitor::setLogin
|
||||||
* @covers \AtolOnline\Exceptions\EmptyLoginException
|
* @covers \AtolOnline\Exceptions\EmptyLoginException
|
||||||
*/
|
*/
|
||||||
public function testEmptyLoginException(): void
|
public function testEmptyLoginException(): void
|
||||||
{
|
{
|
||||||
$this->expectException(EmptyLoginException::class);
|
$this->expectException(EmptyLoginException::class);
|
||||||
new KktMonitor(login: '');
|
new Monitor(login: '');
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Тестирует исключение при попытке передать слишком длинный логин в конструктор
|
* Тестирует исключение при попытке передать слишком длинный логин в конструктор
|
||||||
*
|
*
|
||||||
* @covers \AtolOnline\Api\KktMonitor::__construct
|
* @covers \AtolOnline\Api\Monitor::__construct
|
||||||
* @covers \AtolOnline\Api\KktMonitor::setLogin
|
* @covers \AtolOnline\Api\Monitor::setLogin
|
||||||
* @covers \AtolOnline\Exceptions\TooLongLoginException
|
* @covers \AtolOnline\Exceptions\TooLongLoginException
|
||||||
* @throws EmptyLoginException
|
* @throws EmptyLoginException
|
||||||
* @throws EmptyPasswordException
|
* @throws EmptyPasswordException
|
||||||
@ -129,24 +130,24 @@ class KktMonitorTest extends BasicTestCase
|
|||||||
public function testTooLongLoginException(): void
|
public function testTooLongLoginException(): void
|
||||||
{
|
{
|
||||||
$this->expectException(TooLongLoginException::class);
|
$this->expectException(TooLongLoginException::class);
|
||||||
new KktMonitor(login: Helpers::randomStr(101));
|
new Monitor(login: Helpers::randomStr(101));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Тестирует установку и возврат пароля
|
* Тестирует установку и возврат пароля
|
||||||
*
|
*
|
||||||
* @covers \AtolOnline\Api\KktMonitor::__construct
|
* @covers \AtolOnline\Api\Monitor::__construct
|
||||||
* @covers \AtolOnline\Api\KktMonitor::getPassword
|
* @covers \AtolOnline\Api\Monitor::getPassword
|
||||||
* @covers \AtolOnline\Api\KktMonitor::setPassword
|
* @covers \AtolOnline\Api\Monitor::setPassword
|
||||||
* @throws EmptyPasswordException
|
* @throws EmptyPasswordException
|
||||||
* @throws TooLongPasswordException
|
* @throws TooLongPasswordException
|
||||||
*/
|
*/
|
||||||
public function testPassword(): void
|
public function testPassword(): void
|
||||||
{
|
{
|
||||||
$client = new KktMonitor(false, password: 'password');
|
$client = new Monitor(false, password: 'password');
|
||||||
$this->assertEquals('password', $client->getPassword());
|
$this->assertEquals('password', $client->getPassword());
|
||||||
|
|
||||||
$client = new KktMonitor();
|
$client = new Monitor();
|
||||||
$this->assertEquals(TestEnvParams::FFD105()['password'], $client->getPassword());
|
$this->assertEquals(TestEnvParams::FFD105()['password'], $client->getPassword());
|
||||||
|
|
||||||
$client->setPassword('password');
|
$client->setPassword('password');
|
||||||
@ -156,21 +157,21 @@ class KktMonitorTest extends BasicTestCase
|
|||||||
/**
|
/**
|
||||||
* Тестирует исключение при попытке передать пустой пароль в конструктор
|
* Тестирует исключение при попытке передать пустой пароль в конструктор
|
||||||
*
|
*
|
||||||
* @covers \AtolOnline\Api\KktMonitor::__construct
|
* @covers \AtolOnline\Api\Monitor::__construct
|
||||||
* @covers \AtolOnline\Api\KktMonitor::setPassword
|
* @covers \AtolOnline\Api\Monitor::setPassword
|
||||||
* @covers \AtolOnline\Exceptions\EmptyPasswordException
|
* @covers \AtolOnline\Exceptions\EmptyPasswordException
|
||||||
*/
|
*/
|
||||||
public function testEmptyPasswordException(): void
|
public function testEmptyPasswordException(): void
|
||||||
{
|
{
|
||||||
$this->expectException(EmptyPasswordException::class);
|
$this->expectException(EmptyPasswordException::class);
|
||||||
new KktMonitor(password: '');
|
new Monitor(password: '');
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Тестирует исключение при попытке передать слишком длинный пароль в конструктор
|
* Тестирует исключение при попытке передать слишком длинный пароль в конструктор
|
||||||
*
|
*
|
||||||
* @covers \AtolOnline\Api\KktMonitor::__construct
|
* @covers \AtolOnline\Api\Monitor::__construct
|
||||||
* @covers \AtolOnline\Api\KktMonitor::setPassword
|
* @covers \AtolOnline\Api\Monitor::setPassword
|
||||||
* @throws EmptyLoginException
|
* @throws EmptyLoginException
|
||||||
* @throws EmptyPasswordException
|
* @throws EmptyPasswordException
|
||||||
* @throws TooLongLoginException
|
* @throws TooLongLoginException
|
||||||
@ -179,34 +180,34 @@ class KktMonitorTest extends BasicTestCase
|
|||||||
public function testConstructorWithLongPassword(): void
|
public function testConstructorWithLongPassword(): void
|
||||||
{
|
{
|
||||||
$this->expectException(TooLongPasswordException::class);
|
$this->expectException(TooLongPasswordException::class);
|
||||||
new KktMonitor(password: Helpers::randomStr(101));
|
new Monitor(password: Helpers::randomStr(101));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Тестирует установку тестового режима
|
* Тестирует установку тестового режима
|
||||||
*
|
*
|
||||||
* @covers \AtolOnline\Api\KktMonitor::__construct
|
* @covers \AtolOnline\Api\Monitor::__construct
|
||||||
* @covers \AtolOnline\Api\KktMonitor::isTestMode
|
* @covers \AtolOnline\Api\Monitor::isTestMode
|
||||||
* @covers \AtolOnline\Api\KktMonitor::setTestMode
|
* @covers \AtolOnline\Api\Monitor::setTestMode
|
||||||
*/
|
*/
|
||||||
public function testTestMode(): void
|
public function testTestMode(): void
|
||||||
{
|
{
|
||||||
$client = new KktMonitor();
|
$client = new Monitor();
|
||||||
$this->assertTrue($client->isTestMode());
|
$this->assertTrue($client->isTestMode());
|
||||||
|
|
||||||
$client = new KktMonitor(true);
|
$client = new Monitor(true);
|
||||||
$this->assertTrue($client->isTestMode());
|
$this->assertTrue($client->isTestMode());
|
||||||
|
|
||||||
$client = new KktMonitor(false);
|
$client = new Monitor(false);
|
||||||
$this->assertFalse($client->isTestMode());
|
$this->assertFalse($client->isTestMode());
|
||||||
|
|
||||||
$client = (new KktMonitor())->setTestMode();
|
$client = (new Monitor())->setTestMode();
|
||||||
$this->assertTrue($client->isTestMode());
|
$this->assertTrue($client->isTestMode());
|
||||||
|
|
||||||
$client = (new KktMonitor())->setTestMode(true);
|
$client = (new Monitor())->setTestMode(true);
|
||||||
$this->assertTrue($client->isTestMode());
|
$this->assertTrue($client->isTestMode());
|
||||||
|
|
||||||
$client = (new KktMonitor())->setTestMode(false);
|
$client = (new Monitor())->setTestMode(false);
|
||||||
$this->assertFalse($client->isTestMode());
|
$this->assertFalse($client->isTestMode());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -214,10 +215,10 @@ class KktMonitorTest extends BasicTestCase
|
|||||||
* Тестирует авторизацию
|
* Тестирует авторизацию
|
||||||
*
|
*
|
||||||
* @covers \AtolOnline\Api\AtolClient::getHeaders
|
* @covers \AtolOnline\Api\AtolClient::getHeaders
|
||||||
* @covers \AtolOnline\Api\KktMonitor::sendRequest
|
* @covers \AtolOnline\Api\Monitor::sendRequest
|
||||||
* @covers \AtolOnline\Api\KktMonitor::getAuthEndpoint
|
* @covers \AtolOnline\Api\Monitor::getAuthEndpoint
|
||||||
* @covers \AtolOnline\Api\KktMonitor::doAuth
|
* @covers \AtolOnline\Api\Monitor::doAuth
|
||||||
* @covers \AtolOnline\Api\KktMonitor::auth
|
* @covers \AtolOnline\Api\Monitor::auth
|
||||||
* @covers \AtolOnline\Exceptions\AuthFailedException
|
* @covers \AtolOnline\Exceptions\AuthFailedException
|
||||||
* @throws EmptyLoginException
|
* @throws EmptyLoginException
|
||||||
* @throws EmptyPasswordException
|
* @throws EmptyPasswordException
|
||||||
@ -237,8 +238,8 @@ class KktMonitorTest extends BasicTestCase
|
|||||||
* Тестирует возврат токена после авторизации
|
* Тестирует возврат токена после авторизации
|
||||||
*
|
*
|
||||||
* @depends testAuth
|
* @depends testAuth
|
||||||
* @covers \AtolOnline\Api\KktMonitor::setToken
|
* @covers \AtolOnline\Api\Monitor::setToken
|
||||||
* @covers \AtolOnline\Api\KktMonitor::getToken
|
* @covers \AtolOnline\Api\Monitor::getToken
|
||||||
* @covers \AtolOnline\Exceptions\AuthFailedException
|
* @covers \AtolOnline\Exceptions\AuthFailedException
|
||||||
* @throws AuthFailedException
|
* @throws AuthFailedException
|
||||||
* @throws EmptyLoginException
|
* @throws EmptyLoginException
|
||||||
@ -249,7 +250,7 @@ class KktMonitorTest extends BasicTestCase
|
|||||||
*/
|
*/
|
||||||
public function testGetToken(): void
|
public function testGetToken(): void
|
||||||
{
|
{
|
||||||
$client = new KktMonitor();
|
$client = new Monitor();
|
||||||
$this->assertNull($client->getToken());
|
$this->assertNull($client->getToken());
|
||||||
|
|
||||||
$this->skipIfMonitoringIsOffline();
|
$this->skipIfMonitoringIsOffline();
|
||||||
@ -262,7 +263,7 @@ class KktMonitorTest extends BasicTestCase
|
|||||||
* Тестирует возврат объекта последнего ответа от API
|
* Тестирует возврат объекта последнего ответа от API
|
||||||
*
|
*
|
||||||
* @depends testAuth
|
* @depends testAuth
|
||||||
* @covers \AtolOnline\Api\KktMonitor::getLastResponse
|
* @covers \AtolOnline\Api\Monitor::getLastResponse
|
||||||
* @covers \AtolOnline\Exceptions\AuthFailedException
|
* @covers \AtolOnline\Exceptions\AuthFailedException
|
||||||
* @throws AuthFailedException
|
* @throws AuthFailedException
|
||||||
* @throws EmptyLoginException
|
* @throws EmptyLoginException
|
||||||
@ -276,17 +277,17 @@ class KktMonitorTest extends BasicTestCase
|
|||||||
$this->skipIfMonitoringIsOffline();
|
$this->skipIfMonitoringIsOffline();
|
||||||
$client = $this->newTestClient();
|
$client = $this->newTestClient();
|
||||||
$client->auth();
|
$client->auth();
|
||||||
$this->assertIsSameClass(KktResponse::class, $client->getLastResponse());
|
$this->assertIsSameClass(AtolResponse::class, $client->getLastResponse());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* [Мониторинг] Тестирует получение данных о всех ККТ
|
* [Мониторинг] Тестирует получение данных о всех ККТ
|
||||||
*
|
*
|
||||||
* @depends testAuth
|
* @depends testAuth
|
||||||
* @covers \AtolOnline\Api\KktMonitor::getMainEndpoint
|
* @covers \AtolOnline\Api\Monitor::getMainEndpoint
|
||||||
* @covers \AtolOnline\Api\AtolClient::getUrlToMethod
|
* @covers \AtolOnline\Api\AtolClient::getUrlToMethod
|
||||||
* @covers \AtolOnline\Api\KktMonitor::fetchAll
|
* @covers \AtolOnline\Api\Monitor::fetchAll
|
||||||
* @covers \AtolOnline\Api\KktMonitor::getAll
|
* @covers \AtolOnline\Api\Monitor::getAll
|
||||||
* @covers \AtolOnline\Exceptions\AuthFailedException
|
* @covers \AtolOnline\Exceptions\AuthFailedException
|
||||||
* @throws AuthFailedException
|
* @throws AuthFailedException
|
||||||
* @throws EmptyLoginException
|
* @throws EmptyLoginException
|
||||||
@ -312,10 +313,10 @@ class KktMonitorTest extends BasicTestCase
|
|||||||
* [Мониторинг] Тестирует получение данных о конкретной ККТ
|
* [Мониторинг] Тестирует получение данных о конкретной ККТ
|
||||||
*
|
*
|
||||||
* @depends testAuth
|
* @depends testAuth
|
||||||
* @covers \AtolOnline\Api\KktMonitor::getMainEndpoint
|
* @covers \AtolOnline\Api\Monitor::getMainEndpoint
|
||||||
* @covers \AtolOnline\Api\AtolClient::getUrlToMethod
|
* @covers \AtolOnline\Api\AtolClient::getUrlToMethod
|
||||||
* @covers \AtolOnline\Api\KktMonitor::fetchOne
|
* @covers \AtolOnline\Api\Monitor::fetchOne
|
||||||
* @covers \AtolOnline\Api\KktMonitor::getOne
|
* @covers \AtolOnline\Api\Monitor::getOne
|
||||||
* @covers \AtolOnline\Entities\Kkt::__construct
|
* @covers \AtolOnline\Entities\Kkt::__construct
|
||||||
* @covers \AtolOnline\Entities\Kkt::__get
|
* @covers \AtolOnline\Entities\Kkt::__get
|
||||||
* @covers \AtolOnline\Entities\Kkt::jsonSerialize
|
* @covers \AtolOnline\Entities\Kkt::jsonSerialize
|
Loading…
Reference in New Issue
Block a user