2020-01-11 06:30:25 +00:00
# Работа с К К Т
2020-01-11 10:08:49 +00:00
[Вернуться к содержанию ](readme.md )
---
2020-01-11 06:30:25 +00:00
Объект К К Т инициализируется следующим образом:
```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 ), который будет передаваться в документах через эту К К Т .
2020-06-07 11:39:26 +00:00
< a name = 'testmode' > < / a >
2020-01-11 06:30:25 +00:00
## Тестовый режим
Н а самом деле, в АТОЛ Онлайн нет понятия *тестовая операция* или чего-то в этом духе.
2020-06-04 14:29:36 +00:00
АТОЛ предоставляет нам отдельную тестовую среду (К К Т ).
2020-01-11 06:30:25 +00:00
[Её настройки ](https://online.atol.ru/files/ffd/test_sreda.txt ) уже указаны в коде библиотеки.
2020-06-04 14:29:36 +00:00
*Под тестовым режимом работы подразумевается использование другой (тестовой) К К Т .*
При включенном тестовом режиме:
* меняется логин, пароль и группа (для обращения на тестовую К К Т )
* между авторизацией и операцией над документом, в `Company` документа переопределяется ИНН, С Н О и адрес места
расчётов на те, что указаны в [параметрах тестовой среды ](https://online.atol.ru/files/ffd/test_sreda.txt ).
2020-01-11 06:30:25 +00:00
В библиотеке есть переключатель настроек К К Т .
С е г о помощью можете поменять вашу боевую К К Т на тестовую и наоборот.
Это можно сделать одним из следующих способов:
```php
// включить в любом месте кода:
$kkt->setTestMode();
$kkt->setTestMode(true);
$kkt->setTestMode(false); // выключить
```
> Если вы включили тестовый режим (как показано выше), то используются именно эта К К Т , а не ваша.
> После выключения тестового режима настройки доступа к К К Т меняются на ваши (используется уже ваша К К Т ).
2020-06-04 14:29:36 +00:00
Для включения тестового режима необязательно задавать параметры боевой К К Т .
Если по каким-то причинам у вас не получится использовать тестовый режим, вы можете проводить свои тесты в боевом
режиме (на собственной К К Т ).
2020-01-11 06:30:25 +00:00
В этом случае важно понимать следующее:
1. сразу после оформления документа **прихода** необходимо оформлять точно такой же документ **возврата прихода** ;
2. [вы обязательно забудете о пункте 1 ](http://murphy-law.net.ru/basics.html );
3. пп. 1 и 2 в любом случае скажутся на ваших финансовых отчётах;
4. вся ответственность за пп. 1-3 и последствия ложится только на вас.
2020-06-07 11:39:26 +00:00
## Авторизация на К К Т
2020-06-04 14:29:36 +00:00
2020-06-07 11:39:26 +00:00
Перед первым запросом на К К Т происходит аутентификация на сервере по логину и паролю.
В ответ приходит авторизационный токен, срок жизни коего равен **24 часам** .
2020-06-04 14:29:36 +00:00
После первой успешной операции возможно получить этот токен следующим образом:
```php
$kkt->getAuthToken(); // вернёт строку длиной 128 символа
```
Этот токен можно сохранить и переиспользовать в течение всего срока е г о жизни.
Спустя это время следует получить новый токен.
2020-06-07 11:39:26 +00:00
Для дальнейшего использования однажды полученный токен следует указывать следующим образом:
2020-06-04 14:29:36 +00:00
```php
$kkt->setAuthToken($token_string);
```
Если токен был установлен перед выполнением операции, то при выполнении операции будет использоваться именно он, а новый
запрашиваться не будет. Если операция завершится ошибочно из-за истёкшего токена, следует повторить операцию без
использования метода `setAuthToken()` , либо обнулив е г о следующим образом:
```php
$kkt->setAuthToken(null);
```
2020-01-11 06:30:25 +00:00
## Регистрация документа
Для регистрации документа **прихода** необходимо вызвать метод `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 ).
Тогда как для операций коррекции, которые описаны ниже, эти данные должны присутствовать.
2020-06-04 14:29:36 +00:00
Для регистрации документа **коррекции прихода** необходимо вызвать метод `sellCorrection()` :
2020-01-11 06:30:25 +00:00
```php
$result = $kkt->sellCorrection($document);
```
2020-06-04 14:29:36 +00:00
Для регистрации документа **коррекции расхода** необходимо вызвать метод `buyCorrection()` :
2020-01-11 06:30:25 +00:00
```php
$result = $kkt->buyCorrection($document);
```
2020-06-07 11:39:26 +00:00
Любой из перечисленных выше шести методов может выбросить исключение `AtolAuthFailedException` при ошибке
аутентификации или авторизации.
2020-06-04 14:29:36 +00:00
### Собственный идентификатор документа
Каждый документ, переданный на К К Т для регистрации, всегда имеет свой идентификатор, абсолютно уникальный среди всех
документов когда-либо регистрировавшихся на К К Т , даже если при регистрации были ошибки.
По умолчанию это 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.
Узнать е г о можно будет только в ответе от К К Т .
2020-01-11 06:30:25 +00:00
### Передача callback_url
Перед регистрацией документа можно указать `callback_url` .
АТОЛ отправит на указанный URL результат регистрации.
2020-06-04 14:29:36 +00:00
По этому адресу должен располагаться код, который будет обрабатывать этот результат.
2020-01-11 06:30:25 +00:00
```php
$kkt->setCallbackUrl('http://example.com/process-kkt-result');
$kkt->getCallbackUrl();
```
2020-06-07 11:39:26 +00:00
Метод `setCallbackUrl()` проверяет входную строку на длину (до 256 символов) и валидность формата url по
регулярному выражению:
```
^http(s?)\:\/\/[0-9a-zA-Zа -яА-Я ]([-.\w]*[0-9a-zA-Zа -яА-Я] )*(:(0-9)*)*(\/?)([a-zAZ0-9а -яА-Я\-\.\?\,\'\/\\\+& =%$#_]*)?$
```
Выбрасывает исключения:
* `AtolCallbackUrlTooLongException` (если слишком длинный url);
* `AtolInvalidCallbackUrlException` (если url невалиден).
2020-01-11 06:30:25 +00:00
## Обработка результата регистрации
Методы `sell()` , `sellRefund()` , `sellCorrection()` , `buy()` , `buyRefund()` и `buyCorrection()` возвращают объект `AtolOnline\Api\KktResponse` .
Этот же объект можно получить через геттер `getLastResponse()` .
Этот объект содержит в с е б е HTTP-код ответа, массив заголовков и JSON-декодированные данные тела ответа.
```php
2020-06-07 11:39:26 +00:00
$result = $kkt->getLastResponse(); // вернёт последний ответ от API
2020-01-11 06:30:25 +00:00
$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
2020-06-04 14:29:36 +00:00
$kkt->getLastResponse()->isValid(); // вернёт true, если ошибок нет
2020-01-11 06:30:25 +00:00
```
## Проверка статуса документа
Если перед отправкой документа на регистрацию был задан 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();
```
2020-01-11 10:08:49 +00:00
---
[Вернуться к содержанию ](readme.md )