Compare commits
57 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| bb05f0c752 | |||
| 1c76608468 | |||
| bd6e208216 | |||
| 7b4411ec01 | |||
| 23fa1f7eb9 | |||
| 929bf84c97 | |||
|
|
5c1c4dba12 | ||
|
|
4c40bebe14 | ||
| d321205ac9 | |||
| 387e6e445f | |||
| 3bd043bde7 | |||
| 7c8ee85b89 | |||
| aab68646e6 | |||
| e1fb74ac01 | |||
| 8d9f218280 | |||
| 9ed999f9fc | |||
| 989c06a383 | |||
| 9bd99c81a9 | |||
| 2943d93962 | |||
| 8eb309bc58 | |||
| b74f652127 | |||
| 1061914a5f | |||
| 5424726a97 | |||
| 2b3713db69 | |||
| a6b57115b6 | |||
| 12e0e49c9b | |||
| 3ffab562f8 | |||
| c05e013a5a | |||
| e282de7e08 | |||
| c14b680be4 | |||
| 7558cb6638 | |||
| d3fe2cba9a | |||
| e70a65fa44 | |||
| ba5166f2cf | |||
| 93f5186b15 | |||
| f2b4952aa5 | |||
| 7899daf421 | |||
| 4cf6e81d5f | |||
| 9d7dd75cd9 | |||
| 4d7e5dd76e | |||
| 0f658d38a9 | |||
| ca32fe5923 | |||
| 9ea1c81666 | |||
| 12b98dcdac | |||
| 1fec446ce0 | |||
| 6256c14522 | |||
| 7dff642f0a | |||
| 670f440620 | |||
| 3385420005 | |||
| ff42eebb8c | |||
| 9121d44a26 | |||
| 600a505c83 | |||
| 4fccf7809d | |||
| 2d29ff3994 | |||
| 954843e3ad | |||
| a619b06a48 | |||
| 0bb194b1f8 |
2
.github/FUNDING.yml
vendored
2
.github/FUNDING.yml
vendored
@@ -1,3 +1,3 @@
|
||||
github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
|
||||
patreon: # Replace with a single Patreon username
|
||||
custom: ['https://money.yandex.ru/to/41001685237530']
|
||||
custom: ['https://yoomoney.ru/to/41001685237530']
|
||||
|
||||
25
.github/workflows/dev.yml
vendored
Normal file
25
.github/workflows/dev.yml
vendored
Normal file
@@ -0,0 +1,25 @@
|
||||
name: Dev build
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ dev ]
|
||||
pull_request:
|
||||
branches: [ dev ]
|
||||
|
||||
jobs:
|
||||
Tests:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
|
||||
- name: Validate composer.json and composer.lock
|
||||
uses: php-actions/composer@40-env
|
||||
with:
|
||||
version: 2
|
||||
php_version: 7.4
|
||||
only_args: --prefer-dist --no-progress
|
||||
|
||||
- name: Run phpunit tests
|
||||
uses: php-actions/phpunit@v8
|
||||
with:
|
||||
configuration: ./phpunit.xml
|
||||
25
.github/workflows/master.yml
vendored
Normal file
25
.github/workflows/master.yml
vendored
Normal file
@@ -0,0 +1,25 @@
|
||||
name: Master build
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ master ]
|
||||
pull_request:
|
||||
branches: [ master ]
|
||||
|
||||
jobs:
|
||||
Tests:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
|
||||
- name: Validate composer.json and composer.lock
|
||||
uses: php-actions/composer@40-env
|
||||
with:
|
||||
version: 2
|
||||
php_version: 7.4
|
||||
only_args: --prefer-dist --no-progress
|
||||
|
||||
- name: Run phpunit tests
|
||||
uses: php-actions/phpunit@v8
|
||||
with:
|
||||
configuration: ./phpunit.xml
|
||||
23
.github/workflows/tests.yml
vendored
23
.github/workflows/tests.yml
vendored
@@ -1,23 +0,0 @@
|
||||
name: Composer and phpunit tests
|
||||
|
||||
on: [push]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v1
|
||||
|
||||
- name: Validate composer.json and composer.lock
|
||||
run: composer validate
|
||||
|
||||
- name: Install composer dependencies
|
||||
run: composer install --prefer-dist --no-progress --no-suggest
|
||||
|
||||
- name: Run phpunit tests
|
||||
uses: php-actions/phpunit@v1.0.0
|
||||
with:
|
||||
# Configuration file location
|
||||
config: ./phpunit.xml
|
||||
@@ -1,5 +1,7 @@
|
||||
# АТОЛ Онлайн
|
||||
|
||||

|
||||
|
||||
Библиотека для фискализации чеков по 54-ФЗ через [облачную ККТ АТОЛ](https://online.atol.ru/).
|
||||
|
||||
Текущая поддерживаемая версия API: **5.1**
|
||||
@@ -8,7 +10,7 @@
|
||||
|
||||
## Системные требования
|
||||
|
||||
* PHP 7.2+
|
||||
* PHP 7.4+
|
||||
* composer
|
||||
* php-json
|
||||
|
||||
@@ -101,8 +103,6 @@
|
||||
|
||||
## Дополнительные ресурсы
|
||||
|
||||
**Discord-сервер для обсуждения этой библиотеки: [discord.gg/mFYTQmp](https://discord.gg/mFYTQmp)**
|
||||
|
||||
Функционал, находящийся в разработке: [ROADMAP.md](ROADMAP.md)
|
||||
|
||||
Официальные ресурсы АТОЛ Онлайн:
|
||||
|
||||
@@ -25,9 +25,8 @@
|
||||
- [ ] Тесты для регистрации документа расхода
|
||||
- [ ] Тесты для регистрации документа возврата расхода
|
||||
- [ ] Тесты для регистрации документа коррекции расхода
|
||||
- [ ] Вообще все расчёты вообще везде должны быть строго в копейках. Рубли (дроби) должны быть только в JSON-представлениях
|
||||
- [ ] Валидатор схемы для документов прихода, возврата прихода, расхода, возврата расхода
|
||||
- [ ] Валидатор схемы для документов коррекции прихода, коррекции расхода
|
||||
- [ ] Вообще все расчёты вообще везде должны быть строго в копейках.
|
||||
Рубли (дроби) должны быть только в JSON-представлениях
|
||||
|
||||
## Поддержка методов API (регистрация документов)
|
||||
|
||||
|
||||
@@ -3,13 +3,23 @@
|
||||
"description": "Library to use cloud cash register in e-commerce according to Russian Federal Law #54",
|
||||
"license": "MIT",
|
||||
"type": "library",
|
||||
"version": "0.1.1-b",
|
||||
"keywords": [
|
||||
"54-fz",
|
||||
"54-фз",
|
||||
"kkt",
|
||||
"ккт",
|
||||
"e-commerce",
|
||||
"cash",
|
||||
"cash register",
|
||||
"payment",
|
||||
"payment system",
|
||||
"atol",
|
||||
"atol-online"
|
||||
"атол",
|
||||
"atol-online",
|
||||
"атол онлайн"
|
||||
],
|
||||
"homepage": "https://github.com/anthonyaxenov/atol-online",
|
||||
"readme": "https://github.com/anthonyaxenov/atol-online/blob/master/README.md",
|
||||
"authors": [
|
||||
{
|
||||
"name": "Anthony Axenov",
|
||||
@@ -20,10 +30,16 @@
|
||||
"support": {
|
||||
"source": "https://github.com/anthonyaxenov/atol-online",
|
||||
"issues": "https://github.com/anthonyaxenov/atol-online/issues",
|
||||
"chat": "https://discord.gg/mFYTQmp"
|
||||
"docs": "https://github.com/anthonyaxenov/atol-online/blob/master/docs/readme.md"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
"type": "Yoomoney",
|
||||
"url": "https://yoomoney.ru/to/41001685237530"
|
||||
}
|
||||
],
|
||||
"require": {
|
||||
"php": ">=7.2",
|
||||
"php": ">=7.4",
|
||||
"ext-json": "*",
|
||||
"guzzlehttp/guzzle": "^6.5",
|
||||
"psr/log": "^1.1",
|
||||
@@ -35,12 +51,14 @@
|
||||
"autoload": {
|
||||
"classmap": [
|
||||
"src/AtolOnline/Api/",
|
||||
"src/AtolOnline/Api/Schemas/",
|
||||
"src/AtolOnline/Exceptions/",
|
||||
"src/AtolOnline/Entities/",
|
||||
"src/AtolOnline/Traits/",
|
||||
"src/AtolOnline/Constants/",
|
||||
"tests/"
|
||||
],
|
||||
"files": [
|
||||
"src/helpers.php"
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
1052
composer.lock
generated
1052
composer.lock
generated
File diff suppressed because it is too large
Load Diff
@@ -46,10 +46,10 @@ $customer = (new AtolOnline\Entities\Client())
|
||||
* `AtolEmailValidateException` (если email невалиден).
|
||||
|
||||
Метод `setInn()` чистит входную строку от всех символов, кроме цифр, и проверяет длину (либо 10, либо 12 цифр).
|
||||
Выбрасывает исключение `AtolInnWrongLengthException` (если длина строка ИНН некорректна).
|
||||
Выбрасывает исключение `AtolInnWrongLengthException` (если длина ИНН некорректна).
|
||||
|
||||
Метод `setName()` проверяет входную строку на длину (до 256 символов).
|
||||
Выбрасывает исключение `AtolNameTooLongException` (если слишком длинное наименование).
|
||||
Выбрасывает исключение `AtolNameTooLongException` (если слишком длинное имя).
|
||||
|
||||
Метод `setPhone()` чистит входную строку от всех символов, кроме цифр и знака `+`, и проверяет длину (до 64 символов).
|
||||
Выбрасывает исключение `AtolPhoneTooLongException` (если слишком длинный номер телефона).
|
||||
|
||||
@@ -46,7 +46,7 @@ $company = (new AtolOnline\Entities\Company())
|
||||
* `AtolEmailValidateException` (если email невалиден).
|
||||
|
||||
Метод `setInn()` чистит входную строку от всех символов, кроме цифр, и проверяет длину (либо 10, либо 12 цифр).
|
||||
Выбрасывает исключение `AtolInnWrongLengthException` (если длина строка ИНН некорректна).
|
||||
Выбрасывает исключение `AtolInnWrongLengthException` (если длина ИНН некорректна).
|
||||
|
||||
Метод `setPaymentAddress()` проверяет длину (до 256 символов).
|
||||
Выбрасывает исключение `AtolPaymentAddressTooLongException` (если слишком длинный адрес места расчётов).
|
||||
|
||||
@@ -164,4 +164,4 @@ $json_array = $doc->jsonSerialize();
|
||||
|
||||
---
|
||||
|
||||
[Вернуться к содержанию](readme.md)
|
||||
[Вернуться к содержанию](readme.md)
|
||||
|
||||
87
docs/kkt.md
87
docs/kkt.md
@@ -49,12 +49,18 @@ $kkt->getGroup();
|
||||
|
||||
Эти параметры нужно задать [объекту компании](/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).
|
||||
|
||||
В библиотеке есть переключатель настроек ККТ.
|
||||
С его помощью можете поменять вашу боевую ККТ на тестовую и наоборот.
|
||||
@@ -70,13 +76,43 @@ $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()`:
|
||||
@@ -106,29 +142,64 @@ $result = $kkt->buyRefund($document);
|
||||
Для операций, перечисленных выше, документы не должны содержать [данных коррекции](/docs/documents.md#correction).
|
||||
Тогда как для операций коррекции, которые описаны ниже, эти данные должны присутствовать.
|
||||
|
||||
Для регистрации документа **коррекции прихода** необходимо вызвать метод `sellRefund()`:
|
||||
Для регистрации документа **коррекции прихода** необходимо вызвать метод `sellCorrection()`:
|
||||
|
||||
```php
|
||||
$result = $kkt->sellCorrection($document);
|
||||
```
|
||||
|
||||
Для регистрации документа **коррекции расхода** необходимо вызвать метод `buyRefund()`:
|
||||
Для регистрации документа **коррекции расхода** необходимо вызвать метод `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`.
|
||||
@@ -138,7 +209,7 @@ $kkt->getCallbackUrl();
|
||||
Этот объект содержит в себе HTTP-код ответа, массив заголовков и JSON-декодированные данные тела ответа.
|
||||
|
||||
```php
|
||||
$result = $kkt->getLastResponse();
|
||||
$result = $kkt->getLastResponse(); // вернёт последний ответ от API
|
||||
$headers = $result->getHeaders(); // вернёт заголовки
|
||||
$code = $result->getCode(); // вернёт код ответа
|
||||
$body = $result->getContent(); // вернёт JSON-декодированное тело ответа
|
||||
@@ -158,7 +229,7 @@ $err_text = $result->error->text;
|
||||
Проверка корректности ответа (отсутствия ошибок) работает через метод `isValid()`:
|
||||
|
||||
```php
|
||||
$kkt->isValid(); // вернёт true, если ошибок нет
|
||||
$kkt->getLastResponse()->isValid(); // вернёт true, если ошибок нет
|
||||
```
|
||||
|
||||
## Проверка статуса документа
|
||||
|
||||
@@ -9,12 +9,19 @@
|
||||
|
||||
namespace AtolOnline\Api;
|
||||
|
||||
use AtolOnline\{Entities\Document,
|
||||
use AtolOnline\{Constants\Constraints,
|
||||
Constants\TestEnvParams,
|
||||
Entities\Company,
|
||||
Entities\Document,
|
||||
Exceptions\AtolAuthFailedException,
|
||||
Exceptions\AtolCallbackUrlTooLongException,
|
||||
Exceptions\AtolCorrectionInfoException,
|
||||
Exceptions\AtolInvalidCallbackUrlException,
|
||||
Exceptions\AtolInvalidUuidException,
|
||||
Exceptions\AtolKktLoginEmptyException,
|
||||
Exceptions\AtolKktLoginTooLongException,
|
||||
Exceptions\AtolKktPasswordEmptyException,
|
||||
Exceptions\AtolUuidValidateException,
|
||||
Exceptions\AtolKktPasswordTooLongException,
|
||||
Exceptions\AtolWrongDocumentTypeException
|
||||
};
|
||||
use GuzzleHttp\Client;
|
||||
@@ -58,6 +65,7 @@ class Kkt extends Client
|
||||
* @throws \AtolOnline\Exceptions\AtolKktLoginEmptyException Логин ККТ не может быть пустым
|
||||
* @throws \AtolOnline\Exceptions\AtolKktLoginTooLongException Слишком длинный логин ККТ
|
||||
* @throws \AtolOnline\Exceptions\AtolKktPasswordEmptyException Пароль ККТ не может быть пустым
|
||||
* @throws \AtolOnline\Exceptions\AtolKktPasswordTooLongException Слишком длинный пароль ККТ
|
||||
* @see https://guzzle.readthedocs.io/en/latest/request-options.html
|
||||
*/
|
||||
public function __construct(
|
||||
@@ -115,12 +123,10 @@ class Kkt extends Client
|
||||
*/
|
||||
public function setLogin(string $login)
|
||||
{
|
||||
if (!$this->isTestMode()) {
|
||||
if (empty($login)) {
|
||||
throw new AtolKktLoginEmptyException();
|
||||
} elseif (strlen($login) > 100) {
|
||||
throw new AtolKktLoginTooLongException($login, 100);
|
||||
}
|
||||
if (empty($login)) {
|
||||
throw new AtolKktLoginEmptyException();
|
||||
} elseif (valid_strlen($login) > Constraints::MAX_LENGTH_LOGIN) {
|
||||
throw new AtolKktLoginTooLongException($login, Constraints::MAX_LENGTH_LOGIN);
|
||||
}
|
||||
$this->kkt_config['prod']['login'] = $login;
|
||||
return $this;
|
||||
@@ -142,13 +148,14 @@ class Kkt extends Client
|
||||
* @param string $password
|
||||
* @return $this
|
||||
* @throws \AtolOnline\Exceptions\AtolKktPasswordEmptyException Пароль ККТ не может быть пустым
|
||||
* @throws \AtolOnline\Exceptions\AtolKktPasswordTooLongException Слишком длинный пароль ККТ
|
||||
*/
|
||||
public function setPassword(string $password)
|
||||
{
|
||||
if (!$this->isTestMode()) {
|
||||
if (empty($password)) {
|
||||
throw new AtolKktPasswordEmptyException();
|
||||
}
|
||||
if (empty($password)) {
|
||||
throw new AtolKktPasswordEmptyException();
|
||||
} elseif (valid_strlen($password) > Constraints::MAX_LENGTH_PASSWORD) {
|
||||
throw new AtolKktPasswordTooLongException($password, Constraints::MAX_LENGTH_PASSWORD);
|
||||
}
|
||||
$this->kkt_config['prod']['pass'] = $password;
|
||||
return $this;
|
||||
@@ -169,10 +176,17 @@ class Kkt extends Client
|
||||
*
|
||||
* @param string $url
|
||||
* @return $this
|
||||
* @throws \AtolOnline\Exceptions\AtolCallbackUrlTooLongException Слишком длинный Callback URL
|
||||
* @throws \AtolOnline\Exceptions\AtolInvalidCallbackUrlException Невалидный Callback URL
|
||||
*/
|
||||
public function setCallbackUrl(string $url)
|
||||
{
|
||||
$this->kkt_config['prod']['callback_url'] = $url;
|
||||
if (valid_strlen($url) > Constraints::MAX_LENGTH_CALLBACK_URL) {
|
||||
throw new AtolCallbackUrlTooLongException($url, Constraints::MAX_LENGTH_CALLBACK_URL);
|
||||
} elseif (!preg_match(Constraints::PATTERN_CALLBACK_URL, $url)) {
|
||||
throw new AtolInvalidCallbackUrlException('Callback URL not matches with pattern');
|
||||
}
|
||||
$this->kkt_config[$this->isTestMode() ? 'test' : 'prod']['callback_url'] = $url;
|
||||
return $this;
|
||||
}
|
||||
|
||||
@@ -221,105 +235,135 @@ class Kkt extends Client
|
||||
/**
|
||||
* Регистрирует документ прихода
|
||||
*
|
||||
* @param \AtolOnline\Entities\Document $document
|
||||
* @param \AtolOnline\Entities\Document $document Объект документа
|
||||
* @param string|null $external_id Уникальный код документа (если не указан, то будет создан UUID)
|
||||
* @return \AtolOnline\Api\KktResponse
|
||||
* @throws \AtolOnline\Exceptions\AtolWrongDocumentTypeException Некорректный тип документа
|
||||
* @throws \AtolOnline\Exceptions\AtolAuthFailedException Ошибка авторизации
|
||||
* @throws \AtolOnline\Exceptions\AtolCorrectionInfoException В документе есть данные коррекции
|
||||
* @throws \AtolOnline\Exceptions\AtolInnWrongLengthException Некорректная длина ИНН
|
||||
* @throws \AtolOnline\Exceptions\AtolPaymentAddressTooLongException Слишком длинный адрес места расчётов
|
||||
* @throws \AtolOnline\Exceptions\AtolWrongDocumentTypeException Некорректный тип документа
|
||||
* @throws \GuzzleHttp\Exception\GuzzleException
|
||||
*/
|
||||
public function sell(Document $document)
|
||||
public function sell(Document $document, ?string $external_id = null)
|
||||
{
|
||||
if ($document->getCorrectionInfo()) {
|
||||
throw new AtolCorrectionInfoException('Некорректная операция над документом коррекции');
|
||||
}
|
||||
return $this->registerDocument('sell', 'receipt', $document);
|
||||
return $this->registerDocument('sell', 'receipt', $document, $external_id);
|
||||
}
|
||||
|
||||
/**
|
||||
* Регистрирует документ возврата прихода
|
||||
*
|
||||
* @param \AtolOnline\Entities\Document $document
|
||||
* @param \AtolOnline\Entities\Document $document Объект документа
|
||||
* @param string|null $external_id Уникальный код документа (если не указан, то будет создан UUID)
|
||||
* @return \AtolOnline\Api\KktResponse
|
||||
* @throws \AtolOnline\Exceptions\AtolAuthFailedException Ошибка авторизации
|
||||
* @throws \AtolOnline\Exceptions\AtolCorrectionInfoException В документе есть данные коррекции
|
||||
* @throws \AtolOnline\Exceptions\AtolInnWrongLengthException Некорректная длина ИНН
|
||||
* @throws \AtolOnline\Exceptions\AtolPaymentAddressTooLongException Слишком длинный адрес места расчётов
|
||||
* @throws \AtolOnline\Exceptions\AtolPriceTooHighException Слишком большая сумма
|
||||
* @throws \AtolOnline\Exceptions\AtolTooManyVatsException Слишком много ставок НДС
|
||||
* @throws \AtolOnline\Exceptions\AtolWrongDocumentTypeException Некорректный тип документа
|
||||
* @throws \AtolOnline\Exceptions\AtolCorrectionInfoException В документе есть данные коррекции
|
||||
* @throws \GuzzleHttp\Exception\GuzzleException
|
||||
*/
|
||||
public function sellRefund(Document $document)
|
||||
public function sellRefund(Document $document, ?string $external_id = null)
|
||||
{
|
||||
if ($document->getCorrectionInfo()) {
|
||||
throw new AtolCorrectionInfoException('Некорректная операция над документом коррекции');
|
||||
throw new AtolCorrectionInfoException('Invalid operation on correction document');
|
||||
}
|
||||
return $this->registerDocument('sell_refund', 'receipt', $document->clearVats());
|
||||
return $this->registerDocument('sell_refund', 'receipt', $document->clearVats(), $external_id);
|
||||
}
|
||||
|
||||
/**
|
||||
* Регистрирует документ коррекции прихода
|
||||
*
|
||||
* @param \AtolOnline\Entities\Document $document
|
||||
* @param \AtolOnline\Entities\Document $document Объект документа
|
||||
* @param string|null $external_id Уникальный код документа (если не указан, то будет создан UUID)
|
||||
* @return \AtolOnline\Api\KktResponse
|
||||
* @throws \AtolOnline\Exceptions\AtolWrongDocumentTypeException Некорректный тип документа
|
||||
* @throws \AtolOnline\Exceptions\AtolAuthFailedException Ошибка авторизации
|
||||
* @throws \AtolOnline\Exceptions\AtolCorrectionInfoException В документе отсутствуют данные коррекции
|
||||
* @throws \AtolOnline\Exceptions\AtolInnWrongLengthException Некорректная длина ИНН
|
||||
* @throws \AtolOnline\Exceptions\AtolPaymentAddressTooLongException Слишком длинный адрес места расчётов
|
||||
* @throws \AtolOnline\Exceptions\AtolTooManyItemsException Слишком много предметов расчёта
|
||||
* @throws \AtolOnline\Exceptions\AtolWrongDocumentTypeException Некорректный тип документа
|
||||
* @throws \GuzzleHttp\Exception\GuzzleException
|
||||
*/
|
||||
public function sellCorrection(Document $document)
|
||||
public function sellCorrection(Document $document, ?string $external_id = null)
|
||||
{
|
||||
if (!$document->getCorrectionInfo()) {
|
||||
throw new AtolCorrectionInfoException();
|
||||
}
|
||||
$document->setClient(null)->setItems([]);
|
||||
return $this->registerDocument('sell_correction', 'correction', $document);
|
||||
return $this->registerDocument('sell_correction', 'correction', $document, $external_id);
|
||||
}
|
||||
|
||||
/**
|
||||
* Регистрирует документ расхода
|
||||
*
|
||||
* @param \AtolOnline\Entities\Document $document
|
||||
* @param string|null $external_id Уникальный код документа (если не указан, то будет создан UUID)
|
||||
* @return \AtolOnline\Api\KktResponse
|
||||
* @throws \AtolOnline\Exceptions\AtolWrongDocumentTypeException Некорректный тип документа
|
||||
* @throws \AtolOnline\Exceptions\AtolAuthFailedException Ошибка авторизации
|
||||
* @throws \AtolOnline\Exceptions\AtolCorrectionInfoException В документе есть данные коррекции
|
||||
* @throws \AtolOnline\Exceptions\AtolInnWrongLengthException Некорректная длина ИНН
|
||||
* @throws \AtolOnline\Exceptions\AtolPaymentAddressTooLongException Слишком длинный адрес места расчётов
|
||||
* @throws \AtolOnline\Exceptions\AtolWrongDocumentTypeException Некорректный тип документа
|
||||
* @throws \GuzzleHttp\Exception\GuzzleException
|
||||
*/
|
||||
public function buy(Document $document)
|
||||
public function buy(Document $document, ?string $external_id = null)
|
||||
{
|
||||
if ($document->getCorrectionInfo()) {
|
||||
throw new AtolCorrectionInfoException('Некорректная операция над документом коррекции');
|
||||
throw new AtolCorrectionInfoException('Invalid operation on correction document');
|
||||
}
|
||||
return $this->registerDocument('buy', 'receipt', $document);
|
||||
return $this->registerDocument('buy', 'receipt', $document, $external_id);
|
||||
}
|
||||
|
||||
/**
|
||||
* Регистрирует документ возврата расхода
|
||||
*
|
||||
* @param \AtolOnline\Entities\Document $document
|
||||
* @param string|null $external_id Уникальный код документа (если не указан, то будет создан UUID)
|
||||
* @return \AtolOnline\Api\KktResponse
|
||||
* @throws \AtolOnline\Exceptions\AtolAuthFailedException Ошибка авторизации
|
||||
* @throws \AtolOnline\Exceptions\AtolCorrectionInfoException В документе есть данные коррекции
|
||||
* @throws \AtolOnline\Exceptions\AtolInnWrongLengthException Некорректная длина ИНН
|
||||
* @throws \AtolOnline\Exceptions\AtolPaymentAddressTooLongException Слишком длинный адрес места расчётов
|
||||
* @throws \AtolOnline\Exceptions\AtolPriceTooHighException Слишком большая сумма
|
||||
* @throws \AtolOnline\Exceptions\AtolTooManyVatsException Слишком много ставок НДС
|
||||
* @throws \AtolOnline\Exceptions\AtolWrongDocumentTypeException Некорректный тип документа
|
||||
* @throws \AtolOnline\Exceptions\AtolCorrectionInfoException В документе есть данные коррекции
|
||||
* @throws \GuzzleHttp\Exception\GuzzleException
|
||||
*/
|
||||
public function buyRefund(Document $document)
|
||||
public function buyRefund(Document $document, ?string $external_id = null)
|
||||
{
|
||||
if ($document->getCorrectionInfo()) {
|
||||
throw new AtolCorrectionInfoException('Некорректная операция над документом коррекции');
|
||||
throw new AtolCorrectionInfoException('Invalid operation on correction document');
|
||||
}
|
||||
return $this->registerDocument('buy_refund', 'receipt', $document->clearVats());
|
||||
return $this->registerDocument('buy_refund', 'receipt', $document->clearVats(), $external_id);
|
||||
}
|
||||
|
||||
/**
|
||||
* Регистрирует документ коррекции расхода
|
||||
*
|
||||
* @param Document $document
|
||||
* @param \AtolOnline\Entities\Document $document
|
||||
* @param string|null $external_id Уникальный код документа (если не указан, то будет создан UUID)
|
||||
* @return \AtolOnline\Api\KktResponse
|
||||
* @throws \AtolOnline\Exceptions\AtolWrongDocumentTypeException Некорректный тип документа
|
||||
* @throws \AtolOnline\Exceptions\AtolAuthFailedException Ошибка авторизации
|
||||
* @throws \AtolOnline\Exceptions\AtolCorrectionInfoException В документе отсутствуют данные коррекции
|
||||
* @throws \AtolOnline\Exceptions\AtolInnWrongLengthException Некорректная длтина ИНН
|
||||
* @throws \AtolOnline\Exceptions\AtolPaymentAddressTooLongException Слишком длинный адрес места расчётов
|
||||
* @throws \AtolOnline\Exceptions\AtolTooManyItemsException Слишком много предметов расчёта
|
||||
* @throws \AtolOnline\Exceptions\AtolWrongDocumentTypeException Некорректный тип документа
|
||||
* @throws \GuzzleHttp\Exception\GuzzleException
|
||||
*/
|
||||
public function buyCorrection(Document $document)
|
||||
public function buyCorrection(Document $document, ?string $external_id = null)
|
||||
{
|
||||
if (!$document->getCorrectionInfo()) {
|
||||
throw new AtolCorrectionInfoException();
|
||||
}
|
||||
$document->setClient(null)->setItems([]);
|
||||
return $this->registerDocument('buy_correction', 'correction', $document);
|
||||
return $this->registerDocument('buy_correction', 'correction', $document, $external_id);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -327,13 +371,15 @@ class Kkt extends Client
|
||||
*
|
||||
* @param string $uuid UUID регистрации
|
||||
* @return \AtolOnline\Api\KktResponse
|
||||
* @throws \AtolOnline\Exceptions\AtolUuidValidateException Некорректный UUID документа
|
||||
* @throws \AtolOnline\Exceptions\AtolAuthFailedException Ошибка авторизации
|
||||
* @throws \AtolOnline\Exceptions\AtolInvalidUuidException Некорректный UUID документа
|
||||
* @throws \GuzzleHttp\Exception\GuzzleException
|
||||
*/
|
||||
public function getDocumentStatus(string $uuid)
|
||||
{
|
||||
$uuid = trim($uuid);
|
||||
if (!Uuid::isValid($uuid)) {
|
||||
throw new AtolUuidValidateException($uuid);
|
||||
throw new AtolInvalidUuidException($uuid);
|
||||
}
|
||||
$this->auth();
|
||||
return $this->sendAtolRequest('GET', 'report/'.$uuid);
|
||||
@@ -347,7 +393,9 @@ class Kkt extends Client
|
||||
* @param int $retry_count Количество попыток
|
||||
* @param int $timeout Таймаут в секундах между попытками
|
||||
* @return \AtolOnline\Api\KktResponse
|
||||
* @throws \AtolOnline\Exceptions\AtolException Некорректный UUID документа
|
||||
* @throws \AtolOnline\Exceptions\AtolAuthFailedException Ошибка авторизации
|
||||
* @throws \AtolOnline\Exceptions\AtolInvalidUuidException Некорректный UUID документа
|
||||
* @throws \GuzzleHttp\Exception\GuzzleException
|
||||
*/
|
||||
public function pollDocumentStatus(string $uuid, int $retry_count = 5, int $timeout = 1)
|
||||
{
|
||||
@@ -364,6 +412,28 @@ class Kkt extends Client
|
||||
return $response;
|
||||
}
|
||||
|
||||
/**
|
||||
* Возвращает текущий токен авторизации
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getAuthToken(): ?string
|
||||
{
|
||||
return $this->auth_token;
|
||||
}
|
||||
|
||||
/**
|
||||
* Устанавливает заранее известный токен авторизации
|
||||
*
|
||||
* @param string|null $auth_token
|
||||
* @return $this
|
||||
*/
|
||||
public function setAuthToken(?string $auth_token)
|
||||
{
|
||||
$this->auth_token = $auth_token;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Сбрасывает настройки ККТ по умолчанию
|
||||
*/
|
||||
@@ -374,9 +444,9 @@ class Kkt extends Client
|
||||
$this->kkt_config['prod']['pass'] = '';
|
||||
$this->kkt_config['prod']['url'] = 'https://online.atol.ru/possystem/v4';
|
||||
$this->kkt_config['prod']['callback_url'] = '';
|
||||
$this->kkt_config['test']['group'] = 'v4-online-atol-ru_4179';
|
||||
$this->kkt_config['test']['login'] = 'v4-online-atol-ru';
|
||||
$this->kkt_config['test']['pass'] = 'iGFFuihss';
|
||||
$this->kkt_config['test']['group'] = TestEnvParams::GROUP;
|
||||
$this->kkt_config['test']['login'] = TestEnvParams::LOGIN;
|
||||
$this->kkt_config['test']['pass'] = TestEnvParams::PASSWORD;
|
||||
$this->kkt_config['test']['url'] = 'https://testonline.atol.ru/possystem/v4';
|
||||
$this->kkt_config['test']['callback_url'] = '';
|
||||
}
|
||||
@@ -390,7 +460,7 @@ class Kkt extends Client
|
||||
{
|
||||
$headers['Content-type'] = 'application/json; charset=utf-8';
|
||||
if ($this->getAuthToken()) {
|
||||
$headers['Token'] = $this->auth_token;
|
||||
$headers['Token'] = $this->getAuthToken();
|
||||
}
|
||||
return $headers;
|
||||
}
|
||||
@@ -429,6 +499,7 @@ class Kkt extends Client
|
||||
* @param mixed $data Данные для передачи
|
||||
* @param array|null $options Параметры Guzzle
|
||||
* @return \AtolOnline\Api\KktResponse
|
||||
* @throws \GuzzleHttp\Exception\GuzzleException
|
||||
* @see https://guzzle.readthedocs.io/en/latest/request-options.html
|
||||
*/
|
||||
protected function sendAtolRequest(string $http_method, string $api_method, $data = null, array $options = null)
|
||||
@@ -449,6 +520,8 @@ class Kkt extends Client
|
||||
* Производит авторизацию на ККТ и получает токен доступа для дальнейших HTTP-запросов
|
||||
*
|
||||
* @return bool
|
||||
* @throws \AtolOnline\Exceptions\AtolAuthFailedException Ошибка авторизации
|
||||
* @throws \GuzzleHttp\Exception\GuzzleException
|
||||
*/
|
||||
protected function auth()
|
||||
{
|
||||
@@ -458,7 +531,7 @@ class Kkt extends Client
|
||||
'pass' => $this->getPassword(),
|
||||
]);
|
||||
if (!$result->isValid() || !$result->getContent()->token) {
|
||||
return false;
|
||||
throw new AtolAuthFailedException($result);
|
||||
}
|
||||
$this->auth_token = $result->getContent()->token;
|
||||
}
|
||||
@@ -468,36 +541,36 @@ class Kkt extends Client
|
||||
/**
|
||||
* Отправляет документ на регистрацию
|
||||
*
|
||||
* @param string $api_method Метод API
|
||||
* @param string $type Тип документа: receipt, correction
|
||||
* @param \AtolOnline\Entities\Document $document Объект документа
|
||||
* @param string $api_method Метод API
|
||||
* @param string $type Тип документа: receipt, correction
|
||||
* @param \AtolOnline\Entities\Document $document Объект документа
|
||||
* @param string|null $external_id Уникальный код документа (если не указан, то будет создан UUID)
|
||||
* @return \AtolOnline\Api\KktResponse
|
||||
* @throws \AtolOnline\Exceptions\AtolAuthFailedException Ошибка авторизации
|
||||
* @throws \AtolOnline\Exceptions\AtolWrongDocumentTypeException Некорректный тип документа
|
||||
* @throws \Exception
|
||||
* @throws \AtolOnline\Exceptions\AtolInnWrongLengthException Некорректная длина ИНН
|
||||
* @throws \AtolOnline\Exceptions\AtolPaymentAddressTooLongException Слишком длинный адрес места расчётов
|
||||
* @throws \GuzzleHttp\Exception\GuzzleException
|
||||
*/
|
||||
protected function registerDocument(string $api_method, string $type, Document $document)
|
||||
protected function registerDocument(string $api_method, string $type, Document $document, ?string $external_id = null)
|
||||
{
|
||||
$type = trim($type);
|
||||
if (!in_array($type, ['receipt', 'correction'])) {
|
||||
throw new AtolWrongDocumentTypeException($type);
|
||||
}
|
||||
$this->auth();
|
||||
$data = [
|
||||
'timestamp' => date('d.m.y H:i:s'),
|
||||
'external_id' => Uuid::uuid4()->toString(),
|
||||
'service' => ['callback_url' => $this->getCallbackUrl()],
|
||||
$type => $document,
|
||||
];
|
||||
if ($this->isTestMode()) {
|
||||
$document->setCompany(($document->getCompany() ?: new Company())
|
||||
->setInn(TestEnvParams::INN)
|
||||
->setSno(TestEnvParams::SNO)
|
||||
->setPaymentAddress(TestEnvParams::PAYMENT_ADDRESS));
|
||||
}
|
||||
$data['timestamp'] = date('d.m.y H:i:s');
|
||||
$data['external_id'] = $external_id ?: Uuid::uuid4()->toString();
|
||||
$data[$type] = $document;
|
||||
if ($this->getCallbackUrl()) {
|
||||
$data['service'] = ['callback_url' => $this->getCallbackUrl()];
|
||||
}
|
||||
return $this->sendAtolRequest('POST', trim($api_method), $data);
|
||||
}
|
||||
|
||||
/**
|
||||
* Возвращает текущий токен авторизации
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function getAuthToken()
|
||||
{
|
||||
return $this->auth_token;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -81,9 +81,9 @@ class KktResponse implements JsonSerializable
|
||||
/**
|
||||
* Возвращает объект результата запроса
|
||||
*
|
||||
* @return \stdClass
|
||||
* @return stdClass|null
|
||||
*/
|
||||
public function getContent(): stdClass
|
||||
public function getContent(): ?stdClass
|
||||
{
|
||||
return $this->content;
|
||||
}
|
||||
|
||||
@@ -1,23 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace AtolOnline\Api;
|
||||
|
||||
abstract class AtolSchema
|
||||
{
|
||||
/**
|
||||
* @return mixed
|
||||
*/
|
||||
public static function get()
|
||||
{
|
||||
return static::$json
|
||||
?? static::$json = json_decode(file_get_contents(static::$URL));
|
||||
}
|
||||
|
||||
/**
|
||||
* @return false|string
|
||||
*/
|
||||
public static function json()
|
||||
{
|
||||
return json_encode(static::get());
|
||||
}
|
||||
}
|
||||
@@ -1,17 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace AtolOnline\Api;
|
||||
|
||||
class CorrectionSchema extends AtolSchema
|
||||
{
|
||||
/**
|
||||
* @var
|
||||
*/
|
||||
protected static $json;
|
||||
|
||||
/**
|
||||
* Адрес схемы
|
||||
*/
|
||||
protected static $URL = 'https://online.atol.ru/possystem/v4/schema/correction';
|
||||
|
||||
}
|
||||
@@ -1,17 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace AtolOnline\Api;
|
||||
|
||||
class SellSchema extends AtolSchema
|
||||
{
|
||||
/**
|
||||
* @var
|
||||
*/
|
||||
protected static $json;
|
||||
|
||||
/**
|
||||
* Адрес схемы
|
||||
*/
|
||||
protected static $URL = 'https://online.atol.ru/possystem/v4/schema/sell';
|
||||
|
||||
}
|
||||
76
src/AtolOnline/Constants/Constraints.php
Normal file
76
src/AtolOnline/Constants/Constraints.php
Normal file
@@ -0,0 +1,76 @@
|
||||
<?php
|
||||
|
||||
namespace AtolOnline\Constants;
|
||||
|
||||
/**
|
||||
* Класс с константами ограничений: максимальные длины, правила валидации значений
|
||||
*
|
||||
* @package AtolOnline\Constants
|
||||
*/
|
||||
class Constraints
|
||||
{
|
||||
/**
|
||||
* Максимальная длина Callback URL
|
||||
*/
|
||||
const MAX_LENGTH_CALLBACK_URL = 256;
|
||||
|
||||
/**
|
||||
* Максимальная длина email
|
||||
*/
|
||||
const MAX_LENGTH_EMAIL = 64;
|
||||
|
||||
/**
|
||||
* Максимальная длина логина ККТ
|
||||
*/
|
||||
const MAX_LENGTH_LOGIN = 100;
|
||||
|
||||
/**
|
||||
* Максимальная длина пароля ККТ
|
||||
*/
|
||||
const MAX_LENGTH_PASSWORD = 100;
|
||||
|
||||
/**
|
||||
* Максимальная длина имени покупателя
|
||||
*/
|
||||
const MAX_LENGTH_CLIENT_NAME = 256;
|
||||
|
||||
/**
|
||||
* Максимальная длина телефона покупателя
|
||||
*/
|
||||
const MAX_LENGTH_CLIENT_PHONE = 64;
|
||||
|
||||
/**
|
||||
* Максимальная длина адреса места расчётов
|
||||
*/
|
||||
const MAX_LENGTH_PAYMENT_ADDRESS = 256;
|
||||
|
||||
/**
|
||||
* Максимальная длина имени кассира
|
||||
*/
|
||||
const MAX_LENGTH_CASHIER_NAME = 64;
|
||||
|
||||
/**
|
||||
* Максимальная длина наименования предмета расчётов
|
||||
*/
|
||||
const MAX_LENGTH_ITEM_NAME = 128;
|
||||
|
||||
/**
|
||||
* Максимальная длина единицы измерения предмета расчётов
|
||||
*/
|
||||
const MAX_LENGTH_MEASUREMENT_UNIT = 16;
|
||||
|
||||
/**
|
||||
* Максимальная длина пользовательских данных для предмета расчётов
|
||||
*/
|
||||
const MAX_LENGTH_USER_DATA = 64;
|
||||
|
||||
/**
|
||||
* Регулярное выражание для валидации строки ИНН
|
||||
*/
|
||||
const PATTERN_INN = "/(^[0-9]{10}$)|(^[0-9]{12}$)/";
|
||||
|
||||
/**
|
||||
* Регулярное выражание для валидации строки Callback URL
|
||||
*/
|
||||
const PATTERN_CALLBACK_URL = "/^http(s?)\:\/\/[0-9a-zA-Zа-яА-Я]([-.\w]*[0-9a-zA-Zа-яА-Я])*(:(0-9)*)*(\/?)([a-zAZ0-9а-яА-Я\-\.\?\,\'\/\\\+&=%\$#_]*)?$/";
|
||||
}
|
||||
49
src/AtolOnline/Constants/TestEnvParams.php
Normal file
49
src/AtolOnline/Constants/TestEnvParams.php
Normal file
@@ -0,0 +1,49 @@
|
||||
<?php
|
||||
/**
|
||||
* Copyright (c) Антон Аксенов (aka Anthony Axenov)
|
||||
*
|
||||
* This code is licensed under MIT.
|
||||
* Этот код распространяется по лицензии MIT.
|
||||
* https://github.com/anthonyaxenov/atol-online/blob/master/LICENSE
|
||||
*/
|
||||
|
||||
namespace AtolOnline\Constants;
|
||||
|
||||
/**
|
||||
* Константы, определяющие параметры тестовой среды
|
||||
*
|
||||
* @see https://online.atol.ru/files/ffd/test_sreda.txt
|
||||
* @package AtolOnline\Constants
|
||||
*/
|
||||
class TestEnvParams
|
||||
{
|
||||
/**
|
||||
* Логин
|
||||
*/
|
||||
const LOGIN = 'v4-online-atol-ru';
|
||||
|
||||
/**
|
||||
* Пароль
|
||||
*/
|
||||
const PASSWORD = 'iGFFuihss';
|
||||
|
||||
/**
|
||||
* Группа
|
||||
*/
|
||||
const GROUP = 'v4-online-atol-ru_4179';
|
||||
|
||||
/**
|
||||
* Система налогообложения
|
||||
*/
|
||||
const SNO = SnoTypes::OSN;
|
||||
|
||||
/**
|
||||
* ИНН
|
||||
*/
|
||||
const INN = '5544332219';
|
||||
|
||||
/**
|
||||
* Адрес места расчётов
|
||||
*/
|
||||
const PAYMENT_ADDRESS = 'https://v4.online.atol.ru';
|
||||
}
|
||||
@@ -9,7 +9,7 @@
|
||||
|
||||
namespace AtolOnline\Entities;
|
||||
|
||||
use AtolOnline\{Exceptions\AtolNameTooLongException, Exceptions\AtolPhoneTooLongException, Traits\HasEmail, Traits\HasInn};
|
||||
use AtolOnline\{Constants\Constraints, Exceptions\AtolNameTooLongException, Exceptions\AtolPhoneTooLongException, Traits\HasEmail, Traits\HasInn};
|
||||
|
||||
/**
|
||||
* Класс Client, описывающий сущность покупателя
|
||||
@@ -46,11 +46,11 @@ class Client extends Entity
|
||||
* @param string|null $phone Телефон
|
||||
* @param string|null $email Email
|
||||
* @param string|null $inn ИНН
|
||||
* @throws \AtolOnline\Exceptions\AtolEmailTooLongException
|
||||
* @throws \AtolOnline\Exceptions\AtolEmailValidateException
|
||||
* @throws \AtolOnline\Exceptions\AtolInnWrongLengthException
|
||||
* @throws \AtolOnline\Exceptions\AtolNameTooLongException
|
||||
* @throws \AtolOnline\Exceptions\AtolPhoneTooLongException
|
||||
* @throws \AtolOnline\Exceptions\AtolEmailTooLongException Слишком длинный email
|
||||
* @throws \AtolOnline\Exceptions\AtolEmailValidateException Невалидный email
|
||||
* @throws \AtolOnline\Exceptions\AtolInnWrongLengthException Некорректная длина ИНН
|
||||
* @throws \AtolOnline\Exceptions\AtolNameTooLongException Слишком длинное имя
|
||||
* @throws \AtolOnline\Exceptions\AtolPhoneTooLongException СЛишком длинный номер телефона
|
||||
*/
|
||||
public function __construct(?string $name = null, ?string $phone = null, ?string $email = null, ?string $inn = null)
|
||||
{
|
||||
@@ -89,8 +89,8 @@ class Client extends Entity
|
||||
public function setName(string $name)
|
||||
{
|
||||
$name = trim($name);
|
||||
if (strlen($name) > 256) {
|
||||
throw new AtolNameTooLongException($name, 256);
|
||||
if (valid_strlen($name) > Constraints::MAX_LENGTH_CLIENT_NAME) {
|
||||
throw new AtolNameTooLongException($name, Constraints::MAX_LENGTH_CLIENT_NAME);
|
||||
}
|
||||
$this->name = $name;
|
||||
return $this;
|
||||
@@ -119,8 +119,8 @@ class Client extends Entity
|
||||
public function setPhone(string $phone)
|
||||
{
|
||||
$phone = preg_replace("/[^0-9+]/", '', $phone);
|
||||
if (strlen($phone) > 64) {
|
||||
throw new AtolPhoneTooLongException($phone, 64);
|
||||
if (valid_strlen($phone) > Constraints::MAX_LENGTH_CLIENT_PHONE) {
|
||||
throw new AtolPhoneTooLongException($phone, Constraints::MAX_LENGTH_CLIENT_PHONE);
|
||||
}
|
||||
$this->phone = $phone;
|
||||
return $this;
|
||||
|
||||
@@ -9,7 +9,8 @@
|
||||
|
||||
namespace AtolOnline\Entities;
|
||||
|
||||
use AtolOnline\{Exceptions\AtolEmailTooLongException,
|
||||
use AtolOnline\{Constants\Constraints,
|
||||
Exceptions\AtolEmailTooLongException,
|
||||
Exceptions\AtolEmailValidateException,
|
||||
Exceptions\AtolInnWrongLengthException,
|
||||
Exceptions\AtolPaymentAddressTooLongException,
|
||||
@@ -52,10 +53,10 @@ class Company extends Entity
|
||||
* @param string|null $inn
|
||||
* @param string|null $paymentAddress
|
||||
* @param string|null $email
|
||||
* @throws AtolEmailTooLongException
|
||||
* @throws AtolEmailValidateException
|
||||
* @throws AtolInnWrongLengthException
|
||||
* @throws AtolPaymentAddressTooLongException
|
||||
* @throws AtolEmailTooLongException Слишком длинный email
|
||||
* @throws AtolEmailValidateException Невалидный email
|
||||
* @throws AtolInnWrongLengthException Некорректная длина ИНН
|
||||
* @throws AtolPaymentAddressTooLongException Слишком длинный адрес места расчётов
|
||||
*/
|
||||
public function __construct(string $sno = null, string $inn = null, string $paymentAddress = null, string $email = null)
|
||||
{
|
||||
@@ -110,13 +111,13 @@ class Company extends Entity
|
||||
*
|
||||
* @param string $payment_address
|
||||
* @return $this
|
||||
* @throws AtolPaymentAddressTooLongException
|
||||
* @throws AtolPaymentAddressTooLongException Слишком длинный адрес места расчётов
|
||||
*/
|
||||
public function setPaymentAddress(string $payment_address)
|
||||
{
|
||||
$payment_address = trim($payment_address);
|
||||
if (strlen($payment_address) > 256) {
|
||||
throw new AtolPaymentAddressTooLongException($payment_address, 256);
|
||||
if (valid_strlen($payment_address) > Constraints::MAX_LENGTH_PAYMENT_ADDRESS) {
|
||||
throw new AtolPaymentAddressTooLongException($payment_address, Constraints::MAX_LENGTH_PAYMENT_ADDRESS);
|
||||
}
|
||||
$this->payment_address = $payment_address;
|
||||
return $this;
|
||||
|
||||
@@ -68,7 +68,7 @@ class CorrectionInfo extends Entity
|
||||
*/
|
||||
public function getNumber(): ?string
|
||||
{
|
||||
return $this->base_name;
|
||||
return $this->base_number;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -165,7 +165,7 @@ class CorrectionInfo extends Entity
|
||||
'type' => $this->getType() ?? '', // обязателен
|
||||
'base_date' => $this->getDate() ?? '', // обязателен
|
||||
'base_number' => $this->getNumber() ?? '', // обязателен
|
||||
'base_name' => $this->getName() ?? '' // обязателен
|
||||
'base_name' => $this->getName() ?? '' // не обязателен
|
||||
];
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -9,7 +9,10 @@
|
||||
|
||||
namespace AtolOnline\Entities;
|
||||
|
||||
use AtolOnline\Constants\Constraints;
|
||||
use AtolOnline\Exceptions\AtolCashierTooLongException;
|
||||
use AtolOnline\Exceptions\AtolException;
|
||||
use AtolOnline\Exceptions\AtolInvalidJsonException;
|
||||
|
||||
/**
|
||||
* Класс, описывающий документ
|
||||
@@ -60,10 +63,6 @@ class Document extends Entity
|
||||
|
||||
/**
|
||||
* Document constructor.
|
||||
*
|
||||
* @throws \AtolOnline\Exceptions\AtolTooManyItemsException Слишком много предметов расчёта
|
||||
* @throws \AtolOnline\Exceptions\AtolTooManyPaymentsException Слишком много оплат
|
||||
* @throws \AtolOnline\Exceptions\AtolTooManyVatsException Слишком много ставок НДС
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
@@ -82,10 +81,6 @@ class Document extends Entity
|
||||
public function clearVats()
|
||||
{
|
||||
$this->setVats([]);
|
||||
foreach ($this->getItems() as &$item) {
|
||||
$item->setVatType(null);
|
||||
}
|
||||
$this->calcTotal();
|
||||
return $this;
|
||||
}
|
||||
|
||||
@@ -98,11 +93,7 @@ class Document extends Entity
|
||||
*/
|
||||
public function addVat(Vat $vat)
|
||||
{
|
||||
if (count($this->getVats()) == 0 && !$vat->getSum()) {
|
||||
$vat->setSum($this->calcTotal());
|
||||
}
|
||||
$this->vats->add($vat);
|
||||
$this->calcTotal();
|
||||
return $this;
|
||||
}
|
||||
|
||||
@@ -127,7 +118,6 @@ class Document extends Entity
|
||||
public function setVats(array $vats)
|
||||
{
|
||||
$this->vats->set($vats);
|
||||
$this->calcTotal();
|
||||
return $this;
|
||||
}
|
||||
|
||||
@@ -210,9 +200,9 @@ class Document extends Entity
|
||||
/**
|
||||
* Возвращает заданного клиента (покупателя)
|
||||
*
|
||||
* @return Client
|
||||
* @return Client|null
|
||||
*/
|
||||
public function getClient(): Client
|
||||
public function getClient(): ?Client
|
||||
{
|
||||
return $this->client;
|
||||
}
|
||||
@@ -232,9 +222,9 @@ class Document extends Entity
|
||||
/**
|
||||
* Возвращает заданную компанию (продавца)
|
||||
*
|
||||
* @return Company
|
||||
* @return Company|null
|
||||
*/
|
||||
public function getCompany(): Company
|
||||
public function getCompany(): ?Company
|
||||
{
|
||||
return $this->company;
|
||||
}
|
||||
@@ -270,9 +260,11 @@ class Document extends Entity
|
||||
*/
|
||||
public function setCashier(?string $cashier)
|
||||
{
|
||||
$cashier = trim($cashier);
|
||||
if (strlen($cashier) > 64) {
|
||||
throw new AtolCashierTooLongException($cashier);
|
||||
if ($cashier !== null) {
|
||||
$cashier = trim($cashier);
|
||||
if (valid_strlen($cashier) > Constraints::MAX_LENGTH_CASHIER_NAME) {
|
||||
throw new AtolCashierTooLongException($cashier, Constraints::MAX_LENGTH_CASHIER_NAME);
|
||||
}
|
||||
}
|
||||
$this->cashier = $cashier;
|
||||
return $this;
|
||||
@@ -309,11 +301,10 @@ class Document extends Entity
|
||||
public function calcTotal()
|
||||
{
|
||||
$sum = 0;
|
||||
$this->clearVats();
|
||||
foreach ($this->items->get() as $item) {
|
||||
$sum += $item->calcSum();
|
||||
}
|
||||
foreach ($this->vats->get() as $vat) {
|
||||
$vat->setSum($sum);
|
||||
$this->addVat(new Vat($item->getVat()->getType(), $item->getSum()));
|
||||
}
|
||||
return $this->total = round($sum, 2);
|
||||
}
|
||||
@@ -329,21 +320,128 @@ class Document extends Entity
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
* Собирает объект документа из сырой json-строки
|
||||
*
|
||||
* @param string $json
|
||||
* @return \AtolOnline\Entities\Document
|
||||
* @throws \AtolOnline\Exceptions\AtolEmailTooLongException
|
||||
* @throws \AtolOnline\Exceptions\AtolEmailValidateException
|
||||
* @throws \AtolOnline\Exceptions\AtolException
|
||||
* @throws \AtolOnline\Exceptions\AtolInnWrongLengthException
|
||||
* @throws \AtolOnline\Exceptions\AtolInvalidJsonException
|
||||
* @throws \AtolOnline\Exceptions\AtolNameTooLongException
|
||||
* @throws \AtolOnline\Exceptions\AtolPaymentAddressTooLongException
|
||||
* @throws \AtolOnline\Exceptions\AtolPhoneTooLongException
|
||||
* @throws \AtolOnline\Exceptions\AtolPriceTooHighException
|
||||
* @throws \AtolOnline\Exceptions\AtolTooManyException
|
||||
* @throws \AtolOnline\Exceptions\AtolTooManyItemsException
|
||||
* @throws \AtolOnline\Exceptions\AtolTooManyPaymentsException
|
||||
* @throws \AtolOnline\Exceptions\AtolUnitTooLongException
|
||||
* @throws \AtolOnline\Exceptions\AtolUserdataTooLongException
|
||||
*/
|
||||
public static function fromRaw(string $json)
|
||||
{
|
||||
$array = json_decode($json, true);
|
||||
if (json_last_error() !== JSON_ERROR_NONE) {
|
||||
throw new AtolInvalidJsonException();
|
||||
}
|
||||
$doc = new self();
|
||||
if (isset($array['company'])) {
|
||||
$doc->setCompany(new Company(
|
||||
$array['company']['sno'] ?? null,
|
||||
$array['company']['inn'] ?? null,
|
||||
$array['company']['payment_address'] ?? null,
|
||||
$array['company']['email'] ?? null
|
||||
));
|
||||
}
|
||||
if (isset($array['client'])) {
|
||||
$doc->setClient(new Client(
|
||||
$array['client']['name'] ?? null,
|
||||
$array['client']['phone'] ?? null,
|
||||
$array['client']['email'] ?? null,
|
||||
$array['client']['inn'] ?? null
|
||||
));
|
||||
}
|
||||
if (isset($array['correction_info'])) {
|
||||
$doc->setCorrectionInfo(new CorrectionInfo(
|
||||
$array['correction_info']['type'] ?? null,
|
||||
$array['correction_info']['base_date'] ?? null,
|
||||
$array['correction_info']['base_number'] ?? null,
|
||||
$array['correction_info']['base_name'] ?? null,
|
||||
));
|
||||
}
|
||||
if (isset($array['items'])) {
|
||||
foreach ($array['items'] as $ar_item) {
|
||||
$item = new Item(
|
||||
$ar_item['name'] ?? null,
|
||||
$ar_item['price'] ?? null,
|
||||
$ar_item['quantity'] ?? null,
|
||||
$ar_item['measurement_unit'] ?? null,
|
||||
$ar_item['vat']['type'] ?? null,
|
||||
$ar_item['payment_object'] ?? null,
|
||||
$ar_item['payment_method'] ?? null
|
||||
);
|
||||
if (!empty($ar_item['user_data'])) {
|
||||
$item->setUserData($ar_item['user_data'] ?? null);
|
||||
}
|
||||
$doc->addItem($item);
|
||||
}
|
||||
}
|
||||
if (isset($array['payments'])) {
|
||||
foreach ($array['payments'] as $ar_payment) {
|
||||
$payment = new Payment();
|
||||
if (isset($ar_payment['type'])) {
|
||||
$payment->setType($ar_payment['type']);
|
||||
}
|
||||
if (isset($ar_payment['sum'])) {
|
||||
$payment->setSum($ar_payment['sum']);
|
||||
}
|
||||
$doc->payments->add($payment);
|
||||
}
|
||||
}
|
||||
if (isset($array['vats'])) {
|
||||
foreach ($array['vats'] as $vat_payment) {
|
||||
$vat = new Vat();
|
||||
if (isset($vat_payment['type'])) {
|
||||
$vat->setType($vat_payment['type']);
|
||||
}
|
||||
if (isset($vat_payment['sum'])) {
|
||||
$vat->setSum($vat_payment['sum']);
|
||||
}
|
||||
$doc->vats->add($vat);
|
||||
}
|
||||
}
|
||||
if (isset($array['total']) && $array['total'] != $doc->calcTotal()) {
|
||||
throw new AtolException('Real total sum not equals to provided in JSON one');
|
||||
}
|
||||
return $doc;
|
||||
}
|
||||
|
||||
/**
|
||||
* Возвращает массив для кодирования в json
|
||||
*
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function jsonSerialize()
|
||||
{
|
||||
$json = [
|
||||
'company' => $this->getCompany()->jsonSerialize(), // обязательно
|
||||
'payments' => $this->payments->jsonSerialize(), // обязательно
|
||||
'cashier' => $this->getCashier() ?? '',
|
||||
];
|
||||
if ($this->getCompany()) {
|
||||
$json['company'] = $this->getCompany()->jsonSerialize(); // обязательно
|
||||
}
|
||||
if ($this->getPayments()) {
|
||||
$json['payments'] = $this->payments->jsonSerialize(); // обязательно
|
||||
}
|
||||
if ($this->getCashier()) {
|
||||
$json['cashier'] = $this->getCashier();
|
||||
}
|
||||
if ($this->getCorrectionInfo()) {
|
||||
$json['correction_info'] = $this->getCorrectionInfo()->jsonSerialize(); // обязательно для коррекционных
|
||||
} else {
|
||||
$json['client'] = $this->getClient()->jsonSerialize(); // обязательно для некоррекционных
|
||||
$json['items'] = $this->items->jsonSerialize(); // обязательно для некоррекционных
|
||||
if ($this->getClient()) {
|
||||
$json['client'] = $this->getClient()->jsonSerialize(); // обязательно для некоррекционных
|
||||
}
|
||||
if ($this->getItems()) {
|
||||
$json['items'] = $this->items->jsonSerialize(); // обязательно для некоррекционных
|
||||
}
|
||||
$json['total'] = $this->calcTotal(); // обязательно для некоррекционных
|
||||
}
|
||||
if ($this->getVats()) {
|
||||
@@ -351,4 +449,4 @@ class Document extends Entity
|
||||
}
|
||||
return $json;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,9 +9,10 @@
|
||||
|
||||
namespace AtolOnline\Entities;
|
||||
|
||||
use AtolOnline\{Exceptions\AtolNameTooLongException,
|
||||
use AtolOnline\{Constants\Constraints,
|
||||
Exceptions\AtolNameTooLongException,
|
||||
Exceptions\AtolPriceTooHighException,
|
||||
Exceptions\AtolQuantityTooHighException,
|
||||
Exceptions\AtolTooManyException,
|
||||
Exceptions\AtolUnitTooLongException,
|
||||
Exceptions\AtolUserdataTooLongException,
|
||||
Traits\RublesKopeksConverter
|
||||
@@ -83,7 +84,7 @@ class Item extends Entity
|
||||
* @param string|null $payment_method Способ расчёта
|
||||
* @throws AtolNameTooLongException Слишком длинное наименование
|
||||
* @throws AtolPriceTooHighException Слишком высокая цена за одну единицу
|
||||
* @throws AtolQuantityTooHighException Слишком большое количество
|
||||
* @throws AtolTooManyException Слишком большое количество
|
||||
* @throws AtolUnitTooLongException Слишком длинное название единицы измерения
|
||||
*/
|
||||
public function __construct(
|
||||
@@ -101,17 +102,17 @@ class Item extends Entity
|
||||
if ($price) {
|
||||
$this->setPrice($price);
|
||||
}
|
||||
if ($payment_object) {
|
||||
$this->setPaymentObject($payment_object);
|
||||
}
|
||||
if ($quantity) {
|
||||
$this->setQuantity($quantity);
|
||||
}
|
||||
if ($measurement_unit) {
|
||||
$this->setMeasurementUnit($measurement_unit);
|
||||
}
|
||||
if ($vat_type) {
|
||||
$this->setVatType($vat_type);
|
||||
}
|
||||
if ($measurement_unit) {
|
||||
$this->setMeasurementUnit($measurement_unit);
|
||||
if ($payment_object) {
|
||||
$this->setPaymentObject($payment_object);
|
||||
}
|
||||
if ($payment_method) {
|
||||
$this->setPaymentMethod($payment_method);
|
||||
@@ -138,8 +139,8 @@ class Item extends Entity
|
||||
public function setName(string $name)
|
||||
{
|
||||
$name = trim($name);
|
||||
if (strlen($name) > 128) {
|
||||
throw new AtolNameTooLongException($name, 128);
|
||||
if (valid_strlen($name) > Constraints::MAX_LENGTH_ITEM_NAME) {
|
||||
throw new AtolNameTooLongException($name, Constraints::MAX_LENGTH_ITEM_NAME);
|
||||
}
|
||||
$this->name = $name;
|
||||
return $this;
|
||||
@@ -188,7 +189,7 @@ class Item extends Entity
|
||||
* @param float $quantity Количество
|
||||
* @param string|null $measurement_unit Единица измерения количества
|
||||
* @return $this
|
||||
* @throws AtolQuantityTooHighException Слишком большое количество
|
||||
* @throws AtolTooManyException Слишком большое количество
|
||||
* @throws AtolPriceTooHighException Слишком высокая общая стоимость
|
||||
* @throws AtolUnitTooLongException Слишком длинное название единицы измерения
|
||||
*/
|
||||
@@ -196,7 +197,7 @@ class Item extends Entity
|
||||
{
|
||||
$quantity = round($quantity, 3);
|
||||
if ($quantity > 99999.999) {
|
||||
throw new AtolQuantityTooHighException($quantity, 99999.999);
|
||||
throw new AtolTooManyException($quantity, 99999.999);
|
||||
}
|
||||
$this->quantity = $quantity;
|
||||
$this->calcSum();
|
||||
@@ -226,8 +227,8 @@ class Item extends Entity
|
||||
public function setMeasurementUnit(string $measurement_unit)
|
||||
{
|
||||
$measurement_unit = trim($measurement_unit);
|
||||
if (strlen($measurement_unit) > 16) {
|
||||
throw new AtolUnitTooLongException($measurement_unit, 16);
|
||||
if (valid_strlen($measurement_unit) > Constraints::MAX_LENGTH_MEASUREMENT_UNIT) {
|
||||
throw new AtolUnitTooLongException($measurement_unit, Constraints::MAX_LENGTH_MEASUREMENT_UNIT);
|
||||
}
|
||||
$this->measurement_unit = $measurement_unit;
|
||||
return $this;
|
||||
@@ -329,8 +330,8 @@ class Item extends Entity
|
||||
public function setUserData(string $user_data)
|
||||
{
|
||||
$user_data = trim($user_data);
|
||||
if (strlen($user_data) > 64) {
|
||||
throw new AtolUserdataTooLongException($user_data, 64);
|
||||
if (valid_strlen($user_data) > Constraints::MAX_LENGTH_USER_DATA) {
|
||||
throw new AtolUserdataTooLongException($user_data, Constraints::MAX_LENGTH_USER_DATA);
|
||||
}
|
||||
$this->user_data = $user_data;
|
||||
return $this;
|
||||
|
||||
@@ -106,7 +106,7 @@ class ItemArray extends Entity
|
||||
protected function validateCount(?array $items = null): bool
|
||||
{
|
||||
if ((!empty($items) && count($items) >= self::MAX_COUNT) || count($this->items) >= self::MAX_COUNT) {
|
||||
throw new AtolTooManyItemsException(self::MAX_COUNT);
|
||||
throw new AtolTooManyItemsException(count($items), self::MAX_COUNT);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -9,7 +9,6 @@
|
||||
|
||||
namespace AtolOnline\Entities;
|
||||
|
||||
use AtolOnline\Api\SellSchema;
|
||||
use AtolOnline\Exceptions\AtolTooManyPaymentsException;
|
||||
|
||||
/**
|
||||
@@ -19,6 +18,11 @@ use AtolOnline\Exceptions\AtolTooManyPaymentsException;
|
||||
*/
|
||||
class PaymentArray extends Entity
|
||||
{
|
||||
/**
|
||||
* Максимальное количество элементов массива
|
||||
*/
|
||||
public const MAX_COUNT = 10;
|
||||
|
||||
/**
|
||||
* @var Payment[] Массив оплат
|
||||
*/
|
||||
@@ -99,9 +103,8 @@ class PaymentArray extends Entity
|
||||
*/
|
||||
protected function validateCount(?array $payments = null): bool
|
||||
{
|
||||
$max_items = SellSchema::get()->properties->receipt->properties->payments->maxItems;
|
||||
if ((!empty($payments) && count($payments) >= $max_items) || count($this->payments) >= $max_items) {
|
||||
throw new AtolTooManyPaymentsException($max_items);
|
||||
if ((!empty($payments) && count($payments) >= self::MAX_COUNT) || count($this->payments) >= self::MAX_COUNT) {
|
||||
throw new AtolTooManyPaymentsException(count($payments), self::MAX_COUNT);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -26,12 +26,12 @@ class Vat extends Entity
|
||||
private $type;
|
||||
|
||||
/**
|
||||
* @var int Сумма в копейках, от которой пересчитывается размер налога
|
||||
* @var int Сумма в копейках, от которой пересчитывается размер НДС
|
||||
*/
|
||||
private $sum_original = 0;
|
||||
|
||||
/**
|
||||
* @var int Сумма налога в копейках
|
||||
* @var int Сумма НДС в копейках
|
||||
*/
|
||||
private $sum_final = 0;
|
||||
|
||||
@@ -50,7 +50,8 @@ class Vat extends Entity
|
||||
}
|
||||
|
||||
/**
|
||||
* Устанавливает размер НДС от суммы в копейках
|
||||
* Устанавливает:
|
||||
* размер НДС от суммы в копейках
|
||||
*
|
||||
* @param string $type Тип ставки НДС
|
||||
* @param int $kopeks Копейки
|
||||
@@ -66,18 +67,19 @@ class Vat extends Entity
|
||||
case VatTypes::VAT0:
|
||||
return 0;
|
||||
case VatTypes::VAT10:
|
||||
return $kopeks * 10 / 100;
|
||||
//return $kopeks * 10 / 100;
|
||||
case VatTypes::VAT110:
|
||||
return $kopeks * 10 / 110;
|
||||
case VatTypes::VAT18:
|
||||
return $kopeks * 18 / 100;
|
||||
//return $kopeks * 18 / 100;
|
||||
case VatTypes::VAT118:
|
||||
return $kopeks * 18 / 118;
|
||||
case VatTypes::VAT20:
|
||||
return $kopeks * 20 / 100;
|
||||
//return $kopeks * 20 / 100;
|
||||
case VatTypes::VAT120:
|
||||
return $kopeks * 20 / 120;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -9,7 +9,6 @@
|
||||
|
||||
namespace AtolOnline\Entities;
|
||||
|
||||
use AtolOnline\Api\SellSchema;
|
||||
use AtolOnline\Exceptions\AtolTooManyVatsException;
|
||||
|
||||
/**
|
||||
@@ -19,6 +18,11 @@ use AtolOnline\Exceptions\AtolTooManyVatsException;
|
||||
*/
|
||||
class VatArray extends Entity
|
||||
{
|
||||
/**
|
||||
* Максимальное количество элементов массива
|
||||
*/
|
||||
public const MAX_COUNT = 6;
|
||||
|
||||
/**
|
||||
* @var Vat[] Массив ставок НДС
|
||||
*/
|
||||
@@ -62,7 +66,11 @@ class VatArray extends Entity
|
||||
public function add(Vat $vat)
|
||||
{
|
||||
if ($this->validateCount()) {
|
||||
$this->vats[] = $vat;
|
||||
if (isset($this->vats[$vat->getType()])) {
|
||||
$this->vats[$vat->getType()]->addSum($vat->getSum());
|
||||
} else {
|
||||
$this->vats[$vat->getType()] = $vat;
|
||||
}
|
||||
}
|
||||
return $this;
|
||||
}
|
||||
@@ -99,9 +107,8 @@ class VatArray extends Entity
|
||||
*/
|
||||
protected function validateCount(?array $vats = null): bool
|
||||
{
|
||||
$max_items = SellSchema::get()->properties->receipt->properties->vats->maxItems;
|
||||
if ((!empty($vats) && count($vats) >= $max_items) || count($this->vats) >= $max_items) {
|
||||
throw new AtolTooManyVatsException($max_items);
|
||||
if ((!empty($vats) && count($vats) >= self::MAX_COUNT) || count($this->vats) >= self::MAX_COUNT) {
|
||||
throw new AtolTooManyVatsException(count($vats), self::MAX_COUNT);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
41
src/AtolOnline/Exceptions/AtolAuthFailedException.php
Normal file
41
src/AtolOnline/Exceptions/AtolAuthFailedException.php
Normal file
@@ -0,0 +1,41 @@
|
||||
<?php
|
||||
/**
|
||||
* Copyright (c) Антон Аксенов (aka Anthony Axenov)
|
||||
*
|
||||
* This code is licensed under MIT.
|
||||
* Этот код распространяется по лицензии MIT.
|
||||
* https://github.com/anthonyaxenov/atol-online/blob/master/LICENSE
|
||||
*/
|
||||
|
||||
namespace AtolOnline\Exceptions;
|
||||
|
||||
use AtolOnline\Api\KktResponse;
|
||||
use Exception;
|
||||
use Throwable;
|
||||
|
||||
/**
|
||||
* Исключение, возникающее при работе с АТОЛ Онлайн
|
||||
*
|
||||
* @package AtolOnline\Exceptions
|
||||
*/
|
||||
class AtolAuthFailedException extends Exception
|
||||
{
|
||||
/**
|
||||
* AtolAuthFailedException constructor.
|
||||
*
|
||||
* @param \AtolOnline\Api\KktResponse $last_response
|
||||
* @param string $message
|
||||
* @param int $code
|
||||
* @param \Throwable|null $previous
|
||||
*/
|
||||
public function __construct(KktResponse $last_response, $message = "", $code = 0, Throwable $previous = null)
|
||||
{
|
||||
$message = $last_response->isValid()
|
||||
? $message
|
||||
: '['.$last_response->error->code.'] '.$last_response->error->text.
|
||||
'. ERROR_ID: '.$last_response->error->error_id.
|
||||
'. TYPE: '.$last_response->error->type;
|
||||
$code = $last_response->isValid() ? $code : $last_response->error->code;
|
||||
parent::__construct($message, $code, $previous);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
<?php
|
||||
/**
|
||||
* Copyright (c) Антон Аксенов (aka Anthony Axenov)
|
||||
*
|
||||
* This code is licensed under MIT.
|
||||
* Этот код распространяется по лицензии MIT.
|
||||
* https://github.com/anthonyaxenov/atol-online/blob/master/LICENSE
|
||||
*/
|
||||
|
||||
namespace AtolOnline\Exceptions;
|
||||
|
||||
/**
|
||||
* Исключение, возникающее при попытке указать слишком длинный callback_url
|
||||
*
|
||||
* @package AtolOnline\Exceptions
|
||||
*/
|
||||
class AtolCallbackUrlTooLongException extends AtolTooLongException
|
||||
{
|
||||
/**
|
||||
* @var string Сообщение об ошибке
|
||||
*/
|
||||
protected $message = 'Callback URL is too long';
|
||||
}
|
||||
@@ -9,26 +9,22 @@
|
||||
|
||||
namespace AtolOnline\Exceptions;
|
||||
|
||||
use Throwable;
|
||||
|
||||
/**
|
||||
* Исключение, возникающее при попытке указать слишком длинное имя кассира
|
||||
*
|
||||
* @package AtolOnline\Exceptions
|
||||
*/
|
||||
class AtolCashierTooLongException extends AtolException
|
||||
class AtolCashierTooLongException extends AtolTooLongException
|
||||
{
|
||||
/**
|
||||
* AtolCashierTooLongException constructor.
|
||||
*
|
||||
* @param $name
|
||||
* @param string $message
|
||||
* @param int $code
|
||||
* @param Throwable|null $previous
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function __construct($name, $message = "", $code = 0, Throwable $previous = null)
|
||||
{
|
||||
$message = $message ?: 'Слишком длинное имя кассира (макс. длина 64, фактически '.strlen($name).'): '.$name;
|
||||
parent::__construct($message, $code, $previous);
|
||||
}
|
||||
protected $ffd_tags = [
|
||||
1021,
|
||||
];
|
||||
|
||||
/**
|
||||
* @var string Сообщение об ошибке
|
||||
*/
|
||||
protected $message = 'Cashier name is too long';
|
||||
}
|
||||
@@ -9,8 +9,6 @@
|
||||
|
||||
namespace AtolOnline\Exceptions;
|
||||
|
||||
use Throwable;
|
||||
|
||||
/**
|
||||
* Исключение, возникающее при попытке зарегистрировать документ без данных коррекции
|
||||
*
|
||||
@@ -19,15 +17,7 @@ use Throwable;
|
||||
class AtolCorrectionInfoException extends AtolException
|
||||
{
|
||||
/**
|
||||
* AtolNoCorrectionInfoException constructor.
|
||||
*
|
||||
* @param string $message
|
||||
* @param int $code
|
||||
* @param Throwable|null $previous
|
||||
* @var string Сообщение об ошибке
|
||||
*/
|
||||
public function __construct($message = "", $code = 0, Throwable $previous = null)
|
||||
{
|
||||
$message = $message ?: 'В документе отсутствуют данные коррекции';
|
||||
parent::__construct($message, $code, $previous);
|
||||
}
|
||||
protected $message = 'Document must have correction info';
|
||||
}
|
||||
@@ -9,8 +9,6 @@
|
||||
|
||||
namespace AtolOnline\Exceptions;
|
||||
|
||||
use Throwable;
|
||||
|
||||
/**
|
||||
* Исключение, возникающее при попытке указать пустой email
|
||||
*
|
||||
@@ -19,15 +17,15 @@ use Throwable;
|
||||
class AtolEmailEmptyException extends AtolException
|
||||
{
|
||||
/**
|
||||
* AtolEmailEmptyException constructor.
|
||||
*
|
||||
* @param string $message
|
||||
* @param int $code
|
||||
* @param Throwable|null $previous
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function __construct($message = "", $code = 0, Throwable $previous = null)
|
||||
{
|
||||
$message = $message ?: 'Email не может быть пустым';
|
||||
parent::__construct($message, $code, $previous);
|
||||
}
|
||||
protected $ffd_tags = [
|
||||
1008,
|
||||
1117,
|
||||
];
|
||||
|
||||
/**
|
||||
* @var string Сообщение об ошибке
|
||||
*/
|
||||
protected $message = 'Email cannot be empty';
|
||||
}
|
||||
@@ -9,27 +9,23 @@
|
||||
|
||||
namespace AtolOnline\Exceptions;
|
||||
|
||||
use Throwable;
|
||||
|
||||
/**
|
||||
* Исключение, возникающее при попытке указать слишком длинный email
|
||||
*
|
||||
* @package AtolOnline\Exceptions
|
||||
*/
|
||||
class AtolEmailTooLongException extends AtolException
|
||||
class AtolEmailTooLongException extends AtolTooLongException
|
||||
{
|
||||
/**
|
||||
* AtolEmailTooLongException constructor.
|
||||
*
|
||||
* @param $email
|
||||
* @param $max
|
||||
* @param string $message
|
||||
* @param int $code
|
||||
* @param Throwable|null $previous
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function __construct($email, $max, $message = "", $code = 0, Throwable $previous = null)
|
||||
{
|
||||
$message = $message ?: 'Слишком длинный email (макс. длина '.$max.', фактически '.strlen($email).'): '.$email;
|
||||
parent::__construct($message, $code, $previous);
|
||||
}
|
||||
protected $ffd_tags = [
|
||||
1008,
|
||||
1117,
|
||||
];
|
||||
|
||||
/**
|
||||
* @var string Сообщение об ошибке
|
||||
*/
|
||||
protected $message = 'Email is too long';
|
||||
}
|
||||
@@ -18,6 +18,14 @@ use Throwable;
|
||||
*/
|
||||
class AtolEmailValidateException extends AtolException
|
||||
{
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
protected $ffd_tags = [
|
||||
1008,
|
||||
1117,
|
||||
];
|
||||
|
||||
/**
|
||||
* AtolEmailValidateException constructor.
|
||||
*
|
||||
@@ -28,7 +36,6 @@ class AtolEmailValidateException extends AtolException
|
||||
*/
|
||||
public function __construct($email, $message = "", $code = 0, Throwable $previous = null)
|
||||
{
|
||||
$message = $message ?: 'Некорректный email: '.$email;
|
||||
parent::__construct($message, $code, $previous);
|
||||
parent::__construct($message ?: 'Invalid email: '.$email, $code, $previous);
|
||||
}
|
||||
}
|
||||
@@ -10,6 +10,7 @@
|
||||
namespace AtolOnline\Exceptions;
|
||||
|
||||
use Exception;
|
||||
use Throwable;
|
||||
|
||||
/**
|
||||
* Исключение, возникающее при работе с АТОЛ Онлайн
|
||||
@@ -18,5 +19,34 @@ use Exception;
|
||||
*/
|
||||
class AtolException extends Exception
|
||||
{
|
||||
|
||||
/**
|
||||
* @var int[] Теги ФФД
|
||||
*/
|
||||
protected $ffd_tags = null;
|
||||
|
||||
/**
|
||||
* AtolException constructor.
|
||||
*
|
||||
* @param string $message
|
||||
* @param int $code
|
||||
* @param \Throwable|null $previous
|
||||
*/
|
||||
public function __construct($message = "", $code = 0, Throwable $previous = null)
|
||||
{
|
||||
$message = $message ?: $this->message;
|
||||
if ($this->getFfdTags()) {
|
||||
$message .= ' [FFD tags: '.implode(', ', $this->getFfdTags()).']';
|
||||
}
|
||||
parent::__construct($message, $code, $previous);
|
||||
}
|
||||
|
||||
/**
|
||||
* Возвращает теги ФФД, с которыми связано исключение
|
||||
*
|
||||
* @return array|null
|
||||
*/
|
||||
protected function getFfdTags(): ?array
|
||||
{
|
||||
return $this->ffd_tags;
|
||||
}
|
||||
}
|
||||
@@ -18,6 +18,16 @@ use Throwable;
|
||||
*/
|
||||
class AtolInnWrongLengthException extends AtolException
|
||||
{
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
protected $ffd_tags = [
|
||||
1016,
|
||||
1018,
|
||||
1226,
|
||||
1228,
|
||||
];
|
||||
|
||||
/**
|
||||
* AtolInnWrongLengthException constructor.
|
||||
*
|
||||
@@ -28,7 +38,7 @@ class AtolInnWrongLengthException extends AtolException
|
||||
*/
|
||||
public function __construct($inn, $message = "", $code = 0, Throwable $previous = null)
|
||||
{
|
||||
$message = $message ?: 'Длина ИНН должна быть 10 или 12 цифр, фактически '.strlen($inn).': '.$inn;
|
||||
parent::__construct($message, $code, $previous);
|
||||
parent::__construct($message ?: 'INN length must be 10 or 12 digits only, but actual is '.
|
||||
valid_strlen($inn), $code, $previous);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
<?php
|
||||
/**
|
||||
* Copyright (c) Антон Аксенов (aka Anthony Axenov)
|
||||
*
|
||||
* This code is licensed under MIT.
|
||||
* Этот код распространяется по лицензии MIT.
|
||||
* https://github.com/anthonyaxenov/atol-online/blob/master/LICENSE
|
||||
*/
|
||||
|
||||
namespace AtolOnline\Exceptions;
|
||||
|
||||
/**
|
||||
* Исключение, возникающее при попытке указать невалидный callback_url
|
||||
*
|
||||
* @package AtolOnline\Exceptions
|
||||
*/
|
||||
class AtolInvalidCallbackUrlException extends AtolException
|
||||
{
|
||||
/**
|
||||
* @var string Сообщение об ошибке
|
||||
*/
|
||||
protected $message = 'Invalid callback URL';
|
||||
}
|
||||
32
src/AtolOnline/Exceptions/AtolInvalidJsonException.php
Normal file
32
src/AtolOnline/Exceptions/AtolInvalidJsonException.php
Normal file
@@ -0,0 +1,32 @@
|
||||
<?php
|
||||
/**
|
||||
* Copyright (c) Антон Аксенов (aka Anthony Axenov)
|
||||
*
|
||||
* This code is licensed under MIT.
|
||||
* Этот код распространяется по лицензии MIT.
|
||||
* https://github.com/anthonyaxenov/atol-online/blob/master/LICENSE
|
||||
*/
|
||||
|
||||
namespace AtolOnline\Exceptions;
|
||||
|
||||
use Throwable;
|
||||
|
||||
/**
|
||||
* Исключение, возникающее при работе с невалидным JSON
|
||||
*
|
||||
* @package AtolOnline\Exceptions
|
||||
*/
|
||||
class AtolInvalidJsonException extends AtolException
|
||||
{
|
||||
/**
|
||||
* AtolInnWrongLengthException constructor.
|
||||
*
|
||||
* @param string $message
|
||||
* @param int $code
|
||||
* @param Throwable|null $previous
|
||||
*/
|
||||
public function __construct($message = "", $code = 0, Throwable $previous = null)
|
||||
{
|
||||
parent::__construct($message ?: 'Invalid JSON: ['.json_last_error().'] '.json_last_error_msg(), $code, $previous);
|
||||
}
|
||||
}
|
||||
@@ -16,10 +16,10 @@ use Throwable;
|
||||
*
|
||||
* @package AtolOnline\Exceptions
|
||||
*/
|
||||
class AtolUuidValidateException extends AtolException
|
||||
class AtolInvalidUuidException extends AtolException
|
||||
{
|
||||
/**
|
||||
* AtolUuidValidateException constructor.
|
||||
* AtolInvalidUuidException constructor.
|
||||
*
|
||||
* @param $uuid
|
||||
* @param string $message
|
||||
@@ -28,7 +28,6 @@ class AtolUuidValidateException extends AtolException
|
||||
*/
|
||||
public function __construct($uuid, $message = "", $code = 0, Throwable $previous = null)
|
||||
{
|
||||
$message = $message ?: 'Некорректный UUID: '.$uuid;
|
||||
parent::__construct($message, $code, $previous);
|
||||
parent::__construct($message ?: 'Invalid UUID: '.$uuid, $code, $previous);
|
||||
}
|
||||
}
|
||||
@@ -9,8 +9,6 @@
|
||||
|
||||
namespace AtolOnline\Exceptions;
|
||||
|
||||
use Throwable;
|
||||
|
||||
/**
|
||||
* Исключение, возникающее при попытке указать пустой логин ККТ
|
||||
*
|
||||
@@ -19,15 +17,7 @@ use Throwable;
|
||||
class AtolKktLoginEmptyException extends AtolException
|
||||
{
|
||||
/**
|
||||
* AtolKktLoginEmptyException constructor.
|
||||
*
|
||||
* @param string $message
|
||||
* @param int $code
|
||||
* @param Throwable|null $previous
|
||||
* @var string Сообщение об ошибке
|
||||
*/
|
||||
public function __construct($message = "", $code = 0, Throwable $previous = null)
|
||||
{
|
||||
$message = $message ?: 'Логин ККТ не может быть пустым';
|
||||
parent::__construct($message, $code, $previous);
|
||||
}
|
||||
protected $message = 'KKT login cannot be empty';
|
||||
}
|
||||
@@ -9,27 +9,15 @@
|
||||
|
||||
namespace AtolOnline\Exceptions;
|
||||
|
||||
use Throwable;
|
||||
|
||||
/**
|
||||
* Исключение, возникающее при попытке указать слишком длинный логин ККТ
|
||||
*
|
||||
* @package AtolOnline\Exceptions
|
||||
*/
|
||||
class AtolKktLoginTooLongException extends AtolException
|
||||
class AtolKktLoginTooLongException extends AtolTooLongException
|
||||
{
|
||||
/**
|
||||
* AtolKktLoginTooLongException constructor.
|
||||
*
|
||||
* @param $login
|
||||
* @param $max
|
||||
* @param string $message
|
||||
* @param int $code
|
||||
* @param Throwable|null $previous
|
||||
* @var string Сообщение об ошибке
|
||||
*/
|
||||
public function __construct($login, $max, $message = "", $code = 0, Throwable $previous = null)
|
||||
{
|
||||
$message = $message ?: 'Слишком длинный логин ККТ (макс. длина '.$max.', фактически '.strlen($login).'): '.$login;
|
||||
parent::__construct($message, $code, $previous);
|
||||
}
|
||||
protected $message = 'KKT login is too long';
|
||||
}
|
||||
@@ -9,8 +9,6 @@
|
||||
|
||||
namespace AtolOnline\Exceptions;
|
||||
|
||||
use Throwable;
|
||||
|
||||
/**
|
||||
* Исключение, возникающее при попытке указать пустой пароль ККТ
|
||||
*
|
||||
@@ -19,15 +17,7 @@ use Throwable;
|
||||
class AtolKktPasswordEmptyException extends AtolException
|
||||
{
|
||||
/**
|
||||
* AtolKktPasswordEmptyException constructor.
|
||||
*
|
||||
* @param string $message
|
||||
* @param int $code
|
||||
* @param Throwable|null $previous
|
||||
* @var string Сообщение об ошибке
|
||||
*/
|
||||
public function __construct($message = "", $code = 0, Throwable $previous = null)
|
||||
{
|
||||
$message = $message ?: 'Пароль ККТ не может быть пустым';
|
||||
parent::__construct($message, $code, $previous);
|
||||
}
|
||||
protected $message = 'KKT password cannot be empty';
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
<?php
|
||||
/**
|
||||
* Copyright (c) Антон Аксенов (aka Anthony Axenov)
|
||||
*
|
||||
* This code is licensed under MIT.
|
||||
* Этот код распространяется по лицензии MIT.
|
||||
* https://github.com/anthonyaxenov/atol-online/blob/master/LICENSE
|
||||
*/
|
||||
|
||||
namespace AtolOnline\Exceptions;
|
||||
|
||||
/**
|
||||
* Исключение, возникающее при попытке указать слишком длинный пароль ККТ
|
||||
*
|
||||
* @package AtolOnline\Exceptions
|
||||
*/
|
||||
class AtolKktPasswordTooLongException extends AtolTooLongException
|
||||
{
|
||||
/**
|
||||
* @var string Сообщение об ошибке
|
||||
*/
|
||||
protected $message = 'KKT password is too long';
|
||||
}
|
||||
@@ -9,27 +9,26 @@
|
||||
|
||||
namespace AtolOnline\Exceptions;
|
||||
|
||||
use Throwable;
|
||||
|
||||
/**
|
||||
* Исключение, возникающее при попытке указать слишком длинное имя
|
||||
*
|
||||
* @package AtolOnline\Exceptions
|
||||
*/
|
||||
class AtolNameTooLongException extends AtolException
|
||||
class AtolNameTooLongException extends AtolTooLongException
|
||||
{
|
||||
/**
|
||||
* AtolNameTooLongException constructor.
|
||||
*
|
||||
* @param $name
|
||||
* @param $max
|
||||
* @param string $message
|
||||
* @param int $code
|
||||
* @param Throwable|null $previous
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function __construct($name, $max, $message = "", $code = 0, Throwable $previous = null)
|
||||
{
|
||||
$message = $message ?: 'Слишком длинное имя/наименование (макс. длина '.$max.', фактически '.strlen($name).'): '.$name;
|
||||
parent::__construct($message, $code, $previous);
|
||||
}
|
||||
protected $ffd_tags = [
|
||||
1026,
|
||||
1030,
|
||||
1085,
|
||||
1225,
|
||||
1227,
|
||||
];
|
||||
|
||||
/**
|
||||
* @var string Сообщение об ошибке
|
||||
*/
|
||||
protected $message = 'Name is too long';
|
||||
}
|
||||
@@ -9,8 +9,6 @@
|
||||
|
||||
namespace AtolOnline\Exceptions;
|
||||
|
||||
use Throwable;
|
||||
|
||||
/**
|
||||
* Исключение, возникающее при попытке указать слишком длинный платёжный адрес
|
||||
*
|
||||
@@ -19,17 +17,14 @@ use Throwable;
|
||||
class AtolPaymentAddressTooLongException extends AtolException
|
||||
{
|
||||
/**
|
||||
* AtolPaymentAddressTooLongException constructor.
|
||||
*
|
||||
* @param $address
|
||||
* @param $max
|
||||
* @param string $message
|
||||
* @param int $code
|
||||
* @param Throwable|null $previous
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function __construct($address, $max, $message = "", $code = 0, Throwable $previous = null)
|
||||
{
|
||||
$message = $message ?: 'Слишком длинный адрес (макс. длина '.$max.', фактически '.strlen($address).'): '.$address;
|
||||
parent::__construct($message, $code, $previous);
|
||||
}
|
||||
protected $ffd_tags = [
|
||||
1187,
|
||||
];
|
||||
|
||||
/**
|
||||
* @var string Сообщение об ошибке
|
||||
*/
|
||||
protected $message = 'Payment address is too long';
|
||||
}
|
||||
@@ -9,27 +9,26 @@
|
||||
|
||||
namespace AtolOnline\Exceptions;
|
||||
|
||||
use Throwable;
|
||||
|
||||
/**
|
||||
* Исключение, возникающее при попытке указать слишком длинный телефон
|
||||
*
|
||||
* @package AtolOnline\Exceptions
|
||||
*/
|
||||
class AtolPhoneTooLongException extends AtolException
|
||||
class AtolPhoneTooLongException extends AtolTooLongException
|
||||
{
|
||||
/**
|
||||
* AtolPhoneTooLongException constructor.
|
||||
*
|
||||
* @param $phone
|
||||
* @param $max
|
||||
* @param string $message
|
||||
* @param int $code
|
||||
* @param Throwable|null $previous
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function __construct($phone, $max, $message = "", $code = 0, Throwable $previous = null)
|
||||
{
|
||||
$message = $message ?: 'Слишком длинный телефон (макс. длина '.$max.', фактически '.strlen($phone).'): '.$phone;
|
||||
parent::__construct($message, $code, $previous);
|
||||
}
|
||||
protected $ffd_tags = [
|
||||
1008,
|
||||
1073,
|
||||
1074,
|
||||
1075,
|
||||
1171,
|
||||
];
|
||||
|
||||
/**
|
||||
* @var string Сообщение об ошибке
|
||||
*/
|
||||
protected $message = 'Phone is too long';
|
||||
}
|
||||
@@ -9,27 +9,22 @@
|
||||
|
||||
namespace AtolOnline\Exceptions;
|
||||
|
||||
use Throwable;
|
||||
|
||||
/**
|
||||
* Исключение, возникающее при попытке указать слишком высокую цену (сумму)
|
||||
*
|
||||
* @package AtolOnline\Exceptions
|
||||
*/
|
||||
class AtolPriceTooHighException extends AtolException
|
||||
class AtolPriceTooHighException extends AtolTooManyException
|
||||
{
|
||||
/**
|
||||
* AtolPriceTooHighException constructor.
|
||||
*
|
||||
* @param $price
|
||||
* @param $max
|
||||
* @param string $message
|
||||
* @param int $code
|
||||
* @param Throwable|null $previous
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function __construct($price, $max, $message = "", $code = 0, Throwable $previous = null)
|
||||
{
|
||||
$message = $message ?: 'Слишком большая сумма (макс. '.$max.'): '.$price;
|
||||
parent::__construct($message, $code, $previous);
|
||||
}
|
||||
protected $ffd_tags = [
|
||||
1079,
|
||||
];
|
||||
|
||||
/**
|
||||
* @var string Сообщение об ошибке
|
||||
*/
|
||||
protected $message = 'Price is too high';
|
||||
}
|
||||
40
src/AtolOnline/Exceptions/AtolTooLongException.php
Normal file
40
src/AtolOnline/Exceptions/AtolTooLongException.php
Normal file
@@ -0,0 +1,40 @@
|
||||
<?php
|
||||
/**
|
||||
* Copyright (c) Антон Аксенов (aka Anthony Axenov)
|
||||
*
|
||||
* This code is licensed under MIT.
|
||||
* Этот код распространяется по лицензии MIT.
|
||||
* https://github.com/anthonyaxenov/atol-online/blob/master/LICENSE
|
||||
*/
|
||||
|
||||
namespace AtolOnline\Exceptions;
|
||||
|
||||
use Throwable;
|
||||
|
||||
/**
|
||||
* Исключение, возникающее при попытке указать слишком длинное что-либо
|
||||
*
|
||||
* @package AtolOnline\Exceptions
|
||||
*/
|
||||
class AtolTooLongException extends AtolException
|
||||
{
|
||||
/**
|
||||
* @var string Сообщение об ошибке
|
||||
*/
|
||||
protected $message = 'Parameter is too long';
|
||||
|
||||
/**
|
||||
* AtolTooLongException constructor.
|
||||
*
|
||||
* @param $string
|
||||
* @param $max
|
||||
* @param string $message
|
||||
* @param int $code
|
||||
* @param Throwable|null $previous
|
||||
*/
|
||||
public function __construct($string, $max, $message = "", $code = 0, Throwable $previous = null)
|
||||
{
|
||||
parent::__construct($message ?: $this->message.' (max length - '.$max.', actual length - '.
|
||||
valid_strlen($string), $code, $previous);
|
||||
}
|
||||
}
|
||||
@@ -12,14 +12,19 @@ namespace AtolOnline\Exceptions;
|
||||
use Throwable;
|
||||
|
||||
/**
|
||||
* Исключение, возникающее при попытке указать слишком большое количество
|
||||
* Исключение, возникающее при попытке указать слишком большое количество чего-либо
|
||||
*
|
||||
* @package AtolOnline\Exceptions
|
||||
*/
|
||||
class AtolQuantityTooHighException extends AtolException
|
||||
class AtolTooManyException extends AtolException
|
||||
{
|
||||
/**
|
||||
* AtolQuantityTooHighException constructor.
|
||||
* @var string Сообщение об ошибке
|
||||
*/
|
||||
protected $message = 'Quantity is too high';
|
||||
|
||||
/**
|
||||
* AtolTooManyException constructor.
|
||||
*
|
||||
* @param $quantity
|
||||
* @param $max
|
||||
@@ -29,7 +34,7 @@ class AtolQuantityTooHighException extends AtolException
|
||||
*/
|
||||
public function __construct($quantity, $max, $message = "", $code = 0, Throwable $previous = null)
|
||||
{
|
||||
$message = $message ?: 'Слишком большое количество (макс. '.$max.'): '.$quantity;
|
||||
$message = $message ?: $this->message.' (max - '.$max.', actual - '.$quantity.')';
|
||||
parent::__construct($message, $code, $previous);
|
||||
}
|
||||
}
|
||||
@@ -9,26 +9,15 @@
|
||||
|
||||
namespace AtolOnline\Exceptions;
|
||||
|
||||
use Throwable;
|
||||
|
||||
/**
|
||||
* Исключение, возникающее при попытке добавить слишком много предметов расчёта в массив
|
||||
*
|
||||
* @package AtolOnline\Exceptions
|
||||
*/
|
||||
class AtolTooManyItemsException extends AtolException
|
||||
class AtolTooManyItemsException extends AtolTooManyException
|
||||
{
|
||||
/**
|
||||
* AtolTooManyItemsException constructor.
|
||||
*
|
||||
* @param int $max
|
||||
* @param string $message
|
||||
* @param int $code
|
||||
* @param Throwable|null $previous
|
||||
* @var string Сообщение об ошибке
|
||||
*/
|
||||
public function __construct($max, $message = "", $code = 0, Throwable $previous = null)
|
||||
{
|
||||
$message = $message ?: 'Слишком много предметов расчёта (макс. '.$max.')';
|
||||
parent::__construct($message, $code, $previous);
|
||||
}
|
||||
protected $message = 'Too many items';
|
||||
}
|
||||
@@ -9,26 +9,25 @@
|
||||
|
||||
namespace AtolOnline\Exceptions;
|
||||
|
||||
use Throwable;
|
||||
|
||||
/**
|
||||
* Исключение, возникающее при попытке добавить слишком много ставок НДС в массив
|
||||
* Исключение, возникающее при попытке добавить слишком много платежей в массив
|
||||
*
|
||||
* @package AtolOnline\Exceptions
|
||||
*/
|
||||
class AtolTooManyPaymentsException extends AtolException
|
||||
class AtolTooManyPaymentsException extends AtolTooManyException
|
||||
{
|
||||
/**
|
||||
* AtolTooManyPaymentsException constructor.
|
||||
*
|
||||
* @param int $max
|
||||
* @param string $message
|
||||
* @param int $code
|
||||
* @param Throwable|null $previous
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function __construct($max, $message = "", $code = 0, Throwable $previous = null)
|
||||
{
|
||||
$message = $message ?: 'Слишком много платежей (макс. '.$max.')';
|
||||
parent::__construct($message, $code, $previous);
|
||||
}
|
||||
protected $ffd_tags = [
|
||||
1031,
|
||||
1081,
|
||||
1215,
|
||||
1217,
|
||||
];
|
||||
|
||||
/**
|
||||
* @var string Сообщение об ошибке
|
||||
*/
|
||||
protected $message = 'Too many payments';
|
||||
}
|
||||
@@ -9,26 +9,27 @@
|
||||
|
||||
namespace AtolOnline\Exceptions;
|
||||
|
||||
use Throwable;
|
||||
|
||||
/**
|
||||
* Исключение, возникающее при попытке добавить слишком много ставок НДС в массив
|
||||
*
|
||||
* @package AtolOnline\Exceptions
|
||||
*/
|
||||
class AtolTooManyVatsException extends AtolException
|
||||
class AtolTooManyVatsException extends AtolTooManyException
|
||||
{
|
||||
/**
|
||||
* AtolTooManyVatsException constructor.
|
||||
*
|
||||
* @param int $max
|
||||
* @param string $message
|
||||
* @param int $code
|
||||
* @param Throwable|null $previous
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function __construct($max, $message = "", $code = 0, Throwable $previous = null)
|
||||
{
|
||||
$message = $message ?: 'Слишком много ставок НДС (макс. '.$max.')';
|
||||
parent::__construct($message, $code, $previous);
|
||||
}
|
||||
protected $ffd_tags = [
|
||||
1102,
|
||||
1103,
|
||||
1104,
|
||||
1105,
|
||||
1106,
|
||||
1107,
|
||||
];
|
||||
|
||||
/**
|
||||
* @var string Сообщение об ошибке
|
||||
*/
|
||||
protected $message = 'Too many vats';
|
||||
}
|
||||
@@ -9,27 +9,22 @@
|
||||
|
||||
namespace AtolOnline\Exceptions;
|
||||
|
||||
use Throwable;
|
||||
|
||||
/**
|
||||
* Исключение, возникающее при попытке указать слишком длинный телефон
|
||||
*
|
||||
* @package AtolOnline\Exceptions
|
||||
*/
|
||||
class AtolUnitTooLongException extends AtolException
|
||||
class AtolUnitTooLongException extends AtolTooLongException
|
||||
{
|
||||
/**
|
||||
* AtolUnitTooLongException constructor.
|
||||
*
|
||||
* @param $unit
|
||||
* @param $max
|
||||
* @param string $message
|
||||
* @param int $code
|
||||
* @param Throwable|null $previous
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function __construct($unit, $max, $message = "", $code = 0, Throwable $previous = null)
|
||||
{
|
||||
$message = $message ?: 'Слишком длинное название единицы измерения (макс. длина '.$max.', фактически '.strlen($unit).'): '.$unit;
|
||||
parent::__construct($message, $code, $previous);
|
||||
}
|
||||
protected $ffd_tags = [
|
||||
1197,
|
||||
];
|
||||
|
||||
/**
|
||||
* @var string Сообщение об ошибке
|
||||
*/
|
||||
protected $message = 'Measurement unit is too long';
|
||||
}
|
||||
@@ -9,27 +9,22 @@
|
||||
|
||||
namespace AtolOnline\Exceptions;
|
||||
|
||||
use Throwable;
|
||||
|
||||
/**
|
||||
* Исключение, возникающее при попытке указать слишком длинный телефон
|
||||
* Исключение, возникающее при попытке указать слишком длинный дополнительный реквизит
|
||||
*
|
||||
* @package AtolOnline\Exceptions
|
||||
*/
|
||||
class AtolUserdataTooLongException extends AtolException
|
||||
class AtolUserdataTooLongException extends AtolTooLongException
|
||||
{
|
||||
/**
|
||||
* AtolUserdataTooLongException constructor.
|
||||
*
|
||||
* @param $data
|
||||
* @param $max
|
||||
* @param string $message
|
||||
* @param int $code
|
||||
* @param Throwable|null $previous
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function __construct($data, $max, $message = "", $code = 0, Throwable $previous = null)
|
||||
{
|
||||
$message = $message ?: 'Слишком длинный дополнительный реквизит (макс. длина '.$max.', фактически '.strlen($data).'): '.$data;
|
||||
parent::__construct($message, $code, $previous);
|
||||
}
|
||||
protected $ffd_tags = [
|
||||
1191,
|
||||
];
|
||||
|
||||
/**
|
||||
* @var string Сообщение об ошибке
|
||||
*/
|
||||
protected $message = 'User data is too long';
|
||||
}
|
||||
@@ -28,7 +28,6 @@ class AtolWrongDocumentTypeException extends AtolException
|
||||
*/
|
||||
public function __construct($type, $message = "", $code = 0, Throwable $previous = null)
|
||||
{
|
||||
$message = $message ?: 'Некорректный тип документа: ожидался \'receipt\' или \'correction\', указан \''.$type.'\'';
|
||||
parent::__construct($message, $code, $previous);
|
||||
parent::__construct($message ?: "Wrong document type: 'receipt' or 'correction' expected, but '$type' provided", $code, $previous);
|
||||
}
|
||||
}
|
||||
@@ -9,7 +9,7 @@
|
||||
|
||||
namespace AtolOnline\Traits;
|
||||
|
||||
use AtolOnline\{Exceptions\AtolEmailTooLongException, Exceptions\AtolEmailValidateException};
|
||||
use AtolOnline\{Constants\Constraints, Exceptions\AtolEmailTooLongException, Exceptions\AtolEmailValidateException};
|
||||
|
||||
/**
|
||||
* Добавляет объекту функционал для работы с email
|
||||
@@ -38,16 +38,15 @@ trait HasEmail
|
||||
*
|
||||
* @param string $email
|
||||
* @return $this
|
||||
* @throws AtolEmailTooLongException
|
||||
* @throws AtolEmailValidateException
|
||||
* @throws \AtolOnline\Exceptions\AtolEmailTooLongException Слишком длинный email
|
||||
* @throws \AtolOnline\Exceptions\AtolEmailValidateException Невалидный email
|
||||
*/
|
||||
public function setEmail(string $email)
|
||||
{
|
||||
$email = trim($email);
|
||||
if (strlen($email) > 64) {
|
||||
throw new AtolEmailTooLongException($email, 64);
|
||||
}
|
||||
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
|
||||
if (valid_strlen($email) > Constraints::MAX_LENGTH_EMAIL) {
|
||||
throw new AtolEmailTooLongException($email, Constraints::MAX_LENGTH_EMAIL);
|
||||
} elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
|
||||
throw new AtolEmailValidateException($email);
|
||||
}
|
||||
$this->email = $email;
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
|
||||
namespace AtolOnline\Traits;
|
||||
|
||||
use AtolOnline\Constants\Constraints;
|
||||
use AtolOnline\Exceptions\AtolInnWrongLengthException;
|
||||
|
||||
/**
|
||||
@@ -39,12 +40,12 @@ trait HasInn
|
||||
*
|
||||
* @param string $inn
|
||||
* @return $this
|
||||
* @throws AtolInnWrongLengthException
|
||||
* @throws AtolInnWrongLengthException Некорректная длина ИНН
|
||||
*/
|
||||
public function setInn(string $inn)
|
||||
{
|
||||
$inn = preg_replace("/[^0-9]/", '', $inn);
|
||||
if (preg_match_all("/(^[0-9]{10}$)|(^[0-9]{12}$)/", $inn) == 0) {
|
||||
if (preg_match_all(Constraints::PATTERN_INN, $inn) == 0) {
|
||||
throw new AtolInnWrongLengthException($inn);
|
||||
}
|
||||
$this->inn = $inn;
|
||||
|
||||
16
src/helpers.php
Normal file
16
src/helpers.php
Normal file
@@ -0,0 +1,16 @@
|
||||
<?php
|
||||
|
||||
if (!function_exists('valid_strlen')) {
|
||||
/**
|
||||
* Возвращает корректную длину строки
|
||||
*
|
||||
* @param string $value
|
||||
* @return int
|
||||
*/
|
||||
function valid_strlen(string $value): int
|
||||
{
|
||||
return function_exists('mb_strlen')
|
||||
? mb_strlen($value)
|
||||
: strlen($value);
|
||||
}
|
||||
}
|
||||
@@ -42,7 +42,22 @@ class BasicTestCase extends TestCase
|
||||
*/
|
||||
public function tearDown(): void
|
||||
{
|
||||
|
||||
//parent::tearDown();
|
||||
}
|
||||
|
||||
/**
|
||||
* Возвращает случайную строку указанной длины
|
||||
*
|
||||
* @param int $length
|
||||
* @return string
|
||||
*/
|
||||
protected static function randomString($length = 8)
|
||||
{
|
||||
$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
|
||||
$string = '';
|
||||
for ($i = 0; $i < $length; $i++) {
|
||||
$string .= $characters[mt_rand(0, strlen($characters) - 1)];
|
||||
}
|
||||
return $string;
|
||||
}
|
||||
}
|
||||
@@ -13,10 +13,9 @@ use AtolOnline\{Constants\PaymentMethods,
|
||||
Entities\Item,
|
||||
Exceptions\AtolNameTooLongException,
|
||||
Exceptions\AtolPriceTooHighException,
|
||||
Exceptions\AtolQuantityTooHighException,
|
||||
Exceptions\AtolTooManyException,
|
||||
Exceptions\AtolUnitTooLongException,
|
||||
Exceptions\AtolUserdataTooLongException
|
||||
};
|
||||
Exceptions\AtolUserdataTooLongException};
|
||||
|
||||
/**
|
||||
* Class ItemTest
|
||||
@@ -28,7 +27,7 @@ class ItemTest extends BasicTestCase
|
||||
*
|
||||
* @throws AtolOnline\Exceptions\AtolNameTooLongException
|
||||
* @throws AtolOnline\Exceptions\AtolPriceTooHighException
|
||||
* @throws AtolOnline\Exceptions\AtolQuantityTooHighException
|
||||
* @throws AtolOnline\Exceptions\AtolTooManyException
|
||||
* @throws AtolOnline\Exceptions\AtolUnitTooLongException
|
||||
*/
|
||||
public function testConstructor()
|
||||
@@ -57,7 +56,7 @@ class ItemTest extends BasicTestCase
|
||||
*
|
||||
* @throws AtolOnline\Exceptions\AtolNameTooLongException
|
||||
* @throws AtolOnline\Exceptions\AtolPriceTooHighException
|
||||
* @throws AtolOnline\Exceptions\AtolQuantityTooHighException
|
||||
* @throws AtolOnline\Exceptions\AtolTooManyException
|
||||
* @throws AtolOnline\Exceptions\AtolUnitTooLongException
|
||||
* @throws AtolOnline\Exceptions\AtolUserdataTooLongException
|
||||
*/
|
||||
@@ -86,10 +85,7 @@ class ItemTest extends BasicTestCase
|
||||
/**
|
||||
* Тестирует установку ставки НДС разными путями
|
||||
*
|
||||
* @throws AtolOnline\Exceptions\AtolNameTooLongException
|
||||
* @throws AtolOnline\Exceptions\AtolPriceTooHighException
|
||||
* @throws AtolOnline\Exceptions\AtolQuantityTooHighException
|
||||
* @throws AtolOnline\Exceptions\AtolUnitTooLongException
|
||||
* @throws \AtolOnline\Exceptions\AtolPriceTooHighException
|
||||
*/
|
||||
public function testSetVat()
|
||||
{
|
||||
@@ -103,40 +99,33 @@ class ItemTest extends BasicTestCase
|
||||
/**
|
||||
* Тестирует исключение о слишком длинном наименовании
|
||||
*
|
||||
* @throws AtolOnline\Exceptions\AtolNameTooLongException
|
||||
* @throws AtolOnline\Exceptions\AtolPriceTooHighException
|
||||
* @throws AtolOnline\Exceptions\AtolQuantityTooHighException
|
||||
* @throws AtolOnline\Exceptions\AtolUnitTooLongException
|
||||
* @throws \AtolOnline\Exceptions\AtolNameTooLongException
|
||||
*/
|
||||
public function testAtolNameTooLongException()
|
||||
{
|
||||
$item = new Item();
|
||||
$this->expectException(AtolNameTooLongException::class);
|
||||
$item->setName('Банан Банан Банан Банан Банан Банан Банан Банан Банан Банан Банан Банан');
|
||||
$item->setName(self::randomString(130));
|
||||
}
|
||||
|
||||
/**
|
||||
* Тестирует исключение о слишком высоком количестве
|
||||
*
|
||||
* @throws AtolOnline\Exceptions\AtolNameTooLongException
|
||||
* @throws AtolOnline\Exceptions\AtolQuantityTooHighException
|
||||
* @throws AtolOnline\Exceptions\AtolPriceTooHighException
|
||||
* @throws AtolOnline\Exceptions\AtolUnitTooLongException
|
||||
* @throws \AtolOnline\Exceptions\AtolPriceTooHighException
|
||||
* @throws \AtolOnline\Exceptions\AtolTooManyException
|
||||
* @throws \AtolOnline\Exceptions\AtolUnitTooLongException
|
||||
*/
|
||||
public function testAtolQuantityTooHighException()
|
||||
{
|
||||
$item = new Item();
|
||||
$this->expectException(AtolQuantityTooHighException::class);
|
||||
$this->expectException(AtolTooManyException::class);
|
||||
$item->setQuantity(100000.1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Тестирует исключение о слишком высокой цене
|
||||
*
|
||||
* @throws AtolOnline\Exceptions\AtolPriceTooHighException
|
||||
* @throws AtolOnline\Exceptions\AtolNameTooLongException
|
||||
* @throws AtolOnline\Exceptions\AtolQuantityTooHighException
|
||||
* @throws AtolOnline\Exceptions\AtolUnitTooLongException
|
||||
* @throws \AtolOnline\Exceptions\AtolPriceTooHighException
|
||||
*/
|
||||
public function testAtolPriceTooHighException()
|
||||
{
|
||||
@@ -148,11 +137,7 @@ class ItemTest extends BasicTestCase
|
||||
/**
|
||||
* Тестирует исключение о слишком длинных польз. данных
|
||||
*
|
||||
* @throws AtolOnline\Exceptions\AtolUserdataTooLongException
|
||||
* @throws AtolOnline\Exceptions\AtolPriceTooHighException
|
||||
* @throws AtolOnline\Exceptions\AtolNameTooLongException
|
||||
* @throws AtolOnline\Exceptions\AtolQuantityTooHighException
|
||||
* @throws AtolOnline\Exceptions\AtolUnitTooLongException
|
||||
* @throws \AtolOnline\Exceptions\AtolUserdataTooLongException
|
||||
*/
|
||||
public function testAtolUserdataTooLongException()
|
||||
{
|
||||
@@ -164,10 +149,7 @@ class ItemTest extends BasicTestCase
|
||||
/**
|
||||
* Тестирует исключение о слишком длинной единице измерения
|
||||
*
|
||||
* @throws AtolOnline\Exceptions\AtolNameTooLongException
|
||||
* @throws AtolOnline\Exceptions\AtolPriceTooHighException
|
||||
* @throws AtolOnline\Exceptions\AtolQuantityTooHighException
|
||||
* @throws AtolOnline\Exceptions\AtolUnitTooLongException
|
||||
* @throws \AtolOnline\Exceptions\AtolUnitTooLongException
|
||||
*/
|
||||
public function testAtolUnitTooLongException()
|
||||
{
|
||||
|
||||
@@ -22,12 +22,6 @@ class ClientTest extends BasicTestCase
|
||||
{
|
||||
/**
|
||||
* Тестирует установку параметров
|
||||
*
|
||||
* @throws \AtolOnline\Exceptions\AtolEmailTooLongException
|
||||
* @throws \AtolOnline\Exceptions\AtolEmailValidateException
|
||||
* @throws \AtolOnline\Exceptions\AtolNameTooLongException
|
||||
* @throws \AtolOnline\Exceptions\AtolPhoneTooLongException
|
||||
* @throws \AtolOnline\Exceptions\AtolInnWrongLengthException
|
||||
*/
|
||||
public function testConstructor()
|
||||
{
|
||||
@@ -48,30 +42,18 @@ class ClientTest extends BasicTestCase
|
||||
* Тестирует исключение о слишком длинном имени
|
||||
*
|
||||
* @throws \AtolOnline\Exceptions\AtolNameTooLongException
|
||||
* @throws \AtolOnline\Exceptions\AtolEmailTooLongException
|
||||
* @throws \AtolOnline\Exceptions\AtolEmailValidateException
|
||||
* @throws \AtolOnline\Exceptions\AtolPhoneTooLongException
|
||||
* @throws \AtolOnline\Exceptions\AtolInnWrongLengthException
|
||||
*/
|
||||
public function testAtolNameTooLongException()
|
||||
{
|
||||
$customer = new Client();
|
||||
$this->expectException(AtolNameTooLongException::class);
|
||||
$customer->setName('John Doe John Doe John Doe John Doe John Doe '.
|
||||
'John Doe John Doe John Doe John Doe John Doe John Doe John Doe John '.
|
||||
'Doe John Doe John Doe John Doe John DoeJohn Doe John Doe John Doe '.
|
||||
'John Doe John Doe John Doe John Doe John Doe John Doe John Doe John '.
|
||||
'Doe John Doe John Doe John Doe John Doe John Doe John Doe');
|
||||
$customer->setName(self::randomString(257));
|
||||
}
|
||||
|
||||
/**
|
||||
* Тестирует исключение о слишком длинном телефоне
|
||||
*
|
||||
* @throws \AtolOnline\Exceptions\AtolPhoneTooLongException
|
||||
* @throws \AtolOnline\Exceptions\AtolNameTooLongException
|
||||
* @throws \AtolOnline\Exceptions\AtolEmailTooLongException
|
||||
* @throws \AtolOnline\Exceptions\AtolEmailValidateException
|
||||
* @throws \AtolOnline\Exceptions\AtolInnWrongLengthException
|
||||
*/
|
||||
public function testAtolPhoneTooLongException()
|
||||
{
|
||||
@@ -84,42 +66,32 @@ class ClientTest extends BasicTestCase
|
||||
* Тестирует исключение о слишком длинной почте
|
||||
*
|
||||
* @throws \AtolOnline\Exceptions\AtolEmailTooLongException
|
||||
* @throws \AtolOnline\Exceptions\AtolPhoneTooLongException
|
||||
* @throws \AtolOnline\Exceptions\AtolNameTooLongException
|
||||
* @throws \AtolOnline\Exceptions\AtolEmailValidateException
|
||||
* @throws \AtolOnline\Exceptions\AtolInnWrongLengthException
|
||||
*/
|
||||
public function testAtolEmailTooLongException()
|
||||
{
|
||||
$customer = new Client();
|
||||
$this->expectException(AtolEmailTooLongException::class);
|
||||
$customer->setEmail('johnjohnjohnjohnjohnjohndoedoedoedoe@exampleexampleexampleexample.com');
|
||||
$customer->setEmail(self::randomString(65));
|
||||
}
|
||||
|
||||
/**
|
||||
* Тестирует исключение о некорректной почте
|
||||
*
|
||||
* @throws \AtolOnline\Exceptions\AtolEmailValidateException
|
||||
* @throws \AtolOnline\Exceptions\AtolEmailTooLongException
|
||||
* @throws \AtolOnline\Exceptions\AtolPhoneTooLongException
|
||||
* @throws \AtolOnline\Exceptions\AtolNameTooLongException
|
||||
* @throws \AtolOnline\Exceptions\AtolInnWrongLengthException
|
||||
* @throws \AtolOnline\Exceptions\AtolEmailValidateException
|
||||
*/
|
||||
public function testAtolEmailValidateException()
|
||||
{
|
||||
$customer = new Client();
|
||||
$this->expectException(AtolEmailValidateException::class);
|
||||
$customer->setEmail('John Doe');
|
||||
$customer->setEmail(self::randomString(15));
|
||||
}
|
||||
|
||||
/**
|
||||
* Тестирует исключение о некорректной длине ИНН
|
||||
*
|
||||
* @throws \AtolOnline\Exceptions\AtolInnWrongLengthException
|
||||
* @throws \AtolOnline\Exceptions\AtolEmailTooLongException
|
||||
* @throws \AtolOnline\Exceptions\AtolEmailValidateException
|
||||
* @throws \AtolOnline\Exceptions\AtolNameTooLongException
|
||||
* @throws \AtolOnline\Exceptions\AtolPhoneTooLongException
|
||||
*/
|
||||
public function testAtolInnWrongLengthException()
|
||||
{
|
||||
|
||||
@@ -22,11 +22,6 @@ class CompanyTest extends BasicTestCase
|
||||
{
|
||||
/**
|
||||
* Тестирует установку параметров через конструктор
|
||||
*
|
||||
* @throws AtolOnline\Exceptions\AtolEmailTooLongException
|
||||
* @throws AtolOnline\Exceptions\AtolEmailValidateException
|
||||
* @throws AtolOnline\Exceptions\AtolInnWrongLengthException
|
||||
* @throws AtolOnline\Exceptions\AtolPaymentAddressTooLongException
|
||||
*/
|
||||
public function testConstructor()
|
||||
{
|
||||
@@ -46,10 +41,7 @@ class CompanyTest extends BasicTestCase
|
||||
/**
|
||||
* Тестирует исключение о некорректной длине ИНН
|
||||
*
|
||||
* @throws AtolOnline\Exceptions\AtolInnWrongLengthException
|
||||
* @throws AtolOnline\Exceptions\AtolEmailTooLongException
|
||||
* @throws AtolOnline\Exceptions\AtolEmailValidateException
|
||||
* @throws AtolOnline\Exceptions\AtolPaymentAddressTooLongException
|
||||
* @throws \AtolOnline\Exceptions\AtolInnWrongLengthException
|
||||
*/
|
||||
public function testAtolInnWrongLengthException()
|
||||
{
|
||||
@@ -62,49 +54,38 @@ class CompanyTest extends BasicTestCase
|
||||
/**
|
||||
* Тестирует исключение о слишком длинном платёжном адресе
|
||||
*
|
||||
* @throws AtolOnline\Exceptions\AtolPaymentAddressTooLongException
|
||||
* @throws AtolOnline\Exceptions\AtolEmailTooLongException
|
||||
* @throws AtolOnline\Exceptions\AtolEmailValidateException
|
||||
* @throws AtolOnline\Exceptions\AtolInnWrongLengthException
|
||||
* @throws \AtolOnline\Exceptions\AtolPaymentAddressTooLongException
|
||||
*/
|
||||
public function testAtolPaymentAddressTooLongException()
|
||||
{
|
||||
$company = new Company();
|
||||
$this->expectException(AtolPaymentAddressTooLongException::class);
|
||||
$company->setPaymentAddress('John Doe John Doe John Doe John Doe '.
|
||||
'John Doe John Doe John Doe John Doe John Doe John Doe John Doe John Doe John '.
|
||||
'Doe John Doe John Doe John Doe John DoeJohn Doe John Doe John Doe John Doe '.
|
||||
'John Doe John Doe John Doe John Doe John Doe John Doe John Doe John Doe John '.
|
||||
'Doe John Doe John Doe John Doe John Doe');
|
||||
$company->setPaymentAddress(self::randomString(257));
|
||||
}
|
||||
|
||||
/**
|
||||
* Тестирует исключение о слишком длинной почте
|
||||
*
|
||||
* @throws AtolOnline\Exceptions\AtolEmailTooLongException
|
||||
* @throws AtolOnline\Exceptions\AtolEmailValidateException
|
||||
* @throws AtolOnline\Exceptions\AtolInnWrongLengthException
|
||||
* @throws AtolOnline\Exceptions\AtolPaymentAddressTooLongException
|
||||
* @throws \AtolOnline\Exceptions\AtolEmailTooLongException
|
||||
* @throws \AtolOnline\Exceptions\AtolEmailValidateException
|
||||
*/
|
||||
public function testAtolEmailTooLongException()
|
||||
{
|
||||
$company = new Company();
|
||||
$this->expectException(AtolEmailTooLongException::class);
|
||||
$company->setEmail('johnjohnjohnjohnjohnjohndoedoedoedoe@exampleexampleexampleexample.com');
|
||||
$company->setEmail(self::randomString(65));
|
||||
}
|
||||
|
||||
/**
|
||||
* Тестирует исключение о некорректной почте
|
||||
*
|
||||
* @throws AtolOnline\Exceptions\AtolEmailValidateException
|
||||
* @throws AtolOnline\Exceptions\AtolEmailTooLongException
|
||||
* @throws AtolOnline\Exceptions\AtolInnWrongLengthException
|
||||
* @throws AtolOnline\Exceptions\AtolPaymentAddressTooLongException
|
||||
* @throws \AtolOnline\Exceptions\AtolEmailTooLongException
|
||||
* @throws \AtolOnline\Exceptions\AtolEmailValidateException
|
||||
*/
|
||||
public function testAtolEmailValidateException()
|
||||
{
|
||||
$company = new Company();
|
||||
$this->expectException(AtolEmailValidateException::class);
|
||||
$company->setEmail('John Doe');
|
||||
$company->setEmail(self::randomString(15));
|
||||
}
|
||||
}
|
||||
@@ -1,30 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace Unit;
|
||||
|
||||
use AtolOnline\Api\CorrectionSchema;
|
||||
use AtolOnline\Api\SellSchema;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
class SchemaTest extends TestCase
|
||||
{
|
||||
/**
|
||||
* Тестирует корректность работы объекта схемы документа
|
||||
* прихода, возврата прихода, расхода, возврата расхода
|
||||
*/
|
||||
public function testSellSchema()
|
||||
{
|
||||
$this->assertIsObject(SellSchema::get());
|
||||
$this->assertJson(SellSchema::json());
|
||||
}
|
||||
|
||||
/**
|
||||
* Тестирует корректность работы объекта схемы документа
|
||||
* коррекции прихода, коррекции расхода
|
||||
*/
|
||||
public function testCorrectionSchema()
|
||||
{
|
||||
$this->assertIsObject(CorrectionSchema::get());
|
||||
$this->assertJson(CorrectionSchema::json());
|
||||
}
|
||||
}
|
||||
@@ -44,8 +44,8 @@ class VatTest extends BasicTestCase
|
||||
return [
|
||||
[VatTypes::NONE, 100, 0, 0],
|
||||
[VatTypes::VAT0, 100, 0, 0],
|
||||
[VatTypes::VAT10, 100, 10, 12],
|
||||
[VatTypes::VAT18, 100, 18, 21.6],
|
||||
[VatTypes::VAT10, 100, 9.09, 10.9],
|
||||
[VatTypes::VAT18, 100, 15.25, 18.3],
|
||||
];
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user