Fiscalization: відмінності між версіями

Матеріал з apidocs
Перейти до: навігація, пошук
 
(Не показані 8 проміжних версій ще одного користувача)
Рядок 1: Рядок 1:
{{DISPLAYTITLE:Fiscalization }}


== 1. Попередні умови ==
== 1. Попередні умови ==
Рядок 4: Рядок 5:


* Бути зареєстрованим у сервісі '''Checkbox''': https://checkbox.ua
* Бути зареєстрованим у сервісі '''Checkbox''': https://checkbox.ua
* Мати в '''Checkbox''':
* Мати в Checkbox:
** зареєстровану '''касу'''
** зареєстровану касу
** створеного '''касира'''
** створеного касира
<br>
<br>


== 2. Дані, які потрібно надати EasyPay ==
== 2. Дані, які потрібно надати EasyPay ==
----Після реєстрації в Checkbox мерчант повинен надіслати менеджеру EasyPay на email такі дані:
----Після реєстрації в Checkbox необхідно '''надіслати менеджеру EasyPay на email''':


'''Ключ ліцензії каси (licenseKey)'''
[[Файл:Ключ ліцензії.png|центр|міні|600x600пкс]]
'''<br>


'''Ключ ліцензії каси''' (<code>licenseKey</code>)
'''PIN-код касира'''
[[Файл:Ключ ліцензії.png|центр|міні|600x600пкс]]
<br>'''PIN-код касира'''
[[Файл:Пін код.png|центр|міні|600x600пкс]]


'''[[Файл:Пін код.png|центр|міні|600x600пкс]]
'''serviceKey''', з якого будуть фіскалізуватися транзакції


'''serviceKey''', з якого потрібно фіскалізувати транзакції. Без передачі цих даних фіскалізація працювати не буде.
⚠️ Без передачі цих даних фіскалізація працювати не буде.
<br>


== 3. Робота зі змінами ==
== 3. Робота зі змінами та часові обмеження ==
----
----
* Зміна відкривається '''автоматично''' разом із першою фіскалізованою транзакцією за день
 
=== '''3.1 Автоматична робота зі змінами''' ===
 
* Зміна '''відкривається автоматично''' разом із першою фіскалізованою транзакцією за день
* Зміна '''автоматично закривається о 23:45'''
* Зміна '''автоматично закривається о 23:45'''
* Мерчанту не потрібно відкривати або закривати зміну вручну
<br>
=== '''3.2 Налаштування автозакриття каси в Checkbox''' ===
У кабінеті Checkbox необхідно обовʼязково встановити автозакриття каси на 23:45 (не раніше).
EasyPay додатково виконує '''автоматичне закриття''' кас о 23:40, але налаштування в кабінеті Checkbox використовується '''як додатковий запобіжник''' для коректної роботи фіскалізації.
<br>


=== '''3.3 Період перезміни (23:30 – 00:00)''' ===
У проміжок часу з 23:30 до 00:00 в EasyPay та Checkbox відбувається перезміна.


=== 4. Загальна схема роботи ===
У цей період:
 
* транзакції та чеки можуть перебувати в статусі обробки
* '''фактична фіскалізація таких транзакцій виконується вже новим днем'''
* це є штатною поведінкою системи та '''не потребує дій з боку Мерчанта'''
<br>
=== '''3.4 Обмеження на ручні дії в Checkbox''' ===
Під час роботи з фіскалізацією через EasyPay:
 
* '''заборонено виконувати''' будь-які ручні дії з касою або чеками через:
** Checkbox.Kasa
** Checkbox Manager
* уся фіскалізація, відкриття/закриття змін та обробка чеків '''виконується EasyPay автоматично'''
<br>
 
== 4. Загальна схема роботи ==
----[[Файл:Схема.png|центр|міні|400x400пкс]]
----[[Файл:Схема.png|центр|міні|400x400пкс]]
<br>
 
# Мерчант створює замовлення (<code>createOrder</code>) з параметрами фіскалізації
# Мерчант створює замовлення (<code>createOrder</code>) з параметрами фіскалізації
# EasyPay ініціює фіскалізацію в сервісі Checkbox
# EasyPay ініціює фіскалізацію в сервісі Checkbox
Рядок 40: Рядок 73:


== 5. Створення платежу з фіскалізацією ==
== 5. Створення платежу з фіскалізацією ==
----Для фіскалізації транзакції в методі: <code>POST /api/merchant/createOrder</code> потрібно передати обʼєкт <code>fiscalization</code>.
----Для фіскалізації транзакції в методі:


==== 5.1. Приклад запиту <code>createOrder</code> ====
<code>POST /api/merchant/createOrder</code>
<syntaxhighlight lang="json">
 
потрібно передати обʼєкт <code>fiscalization</code>.
 
=== 5.1. Приклад запиту <code>createOrder</code> ===
----<syntaxhighlight lang="json">
{
"order": {
"serviceKey": "MERCHANT-TEST-XXXX",
"orderId": "Fiscalization29",
"description": "Test for fiscalization",
"amount": 3,
"isOneTimePay": false,
"additionalItems": {
"Merchant.UrlNotify": "http://notifysigncheckexample.com"
}
},
"fiscalization": {
"licenseKey": "test8d2f483fafef",
"receiptType": "Url",
"receipt": {
"goods": [
{
"good": {
"code": "9999",
"name": "Wine",
"price": 1.5
},
"quantity": 2
}
],
"payments": [
{
{
  "order": {
"type": "CASHLESS",
    "serviceKey": "MERCHANT-TEST-XXXX",
"value": 3
    "orderId": "Fiscalization29",
}
    "description": "Test for fiscalization",
]
    "amount": 3,
}
    "isOneTimePay": false,
}
    "additionalItems": {
      "Merchant.UrlNotify": "http://notifysigncheckexample.com"
    }
  },
 
  "fiscalization": {
    "licenseKey": "test8d2f483fafef",
    "receiptType": "Url",
    "receipt": {
      "goods": [
        {
          "good": {
            "code": "9999",
            "name": "Wine",
            "price": 1.5
          },
          "quantity": 2
        }
      ],
      "payments": [
        {
          "type": "CASHLESS",
          "value": 3
        }
      ]
    }
  }
}
}
</syntaxhighlight>
</syntaxhighlight>


== 6. Обʼєкт fiscalization — опис полів ==
== 6. Обʼєкт <code>fiscalization</code> ==
----
----


=== '''6.1 Загальна структура''' ===
=== '''6.1. Загальна структура''' ===
 
<table style="width:100%; border-collapse:collapse; border-spacing:0;">
<table style="width:100%; border-collapse:collapse; border-spacing:0;">
     <tr style="border-bottom:1px solid #e6e6e6;">
     <tr style="border-bottom:1px solid #e6e6e6;">
Рядок 117: Рядок 151:
</table>
</table>
<br>
<br>
 
==='''6.2 receipt''' ====
=== '''6.2 receipt''' ===
<!-- 6.2 Обʼєкт receipt -->
<!-- 6.2 Обʼєкт receipt -->
 
<table style="width:100%; border-collapse:collapse; border-spacing:0;">
<table style="width:100%; border-collapse:collapse; border-spacing:0;">
     <tr style="border-bottom:1px solid #e6e6e6;">
     <tr style="border-bottom:1px solid #e6e6e6;">
Рядок 141: Рядок 173:
     </tr>
     </tr>
</table>
</table>
<br>
<br>
 
==== '''6.3 goods[ ]''' ====
=== '''6.3 goods[ ]''' ===
<!-- 6.3 Масив goods[] -->
<table style="width:100%; border-collapse:collapse; border-spacing:0;">
<table style="width:100%; border-collapse:collapse; border-spacing:0;">
     <tr style="border-bottom:1px solid #e6e6e6;">
     <tr style="border-bottom:1px solid #e6e6e6;">
Рядок 176: Рядок 209:
     </tr>
     </tr>
</table>
</table>
<br>Валідація - '''price × quantity = value у payments'''
<br>
'''Валідація:'''
price × quantity = value у payments


==== '''6.4 payments[ ]''' ====
==== '''6.4 payments[ ]''' ====
<!-- 6.4 Масив payments[] -->
<table style="width:100%; border-collapse:collapse; border-spacing:0;">
<table style="width:100%; border-collapse:collapse; border-spacing:0;"><tr style="border-bottom:1px solid #e6e6e6;">
    <tr style="border-bottom:1px solid #e6e6e6;">
       <th style="text-align:left; padding:12px 16px;">Поле</th>
       <th style="text-align:left; padding:12px 16px;">Поле</th>
       <th style="text-align:left; padding:12px 16px;">Тип</th>
       <th style="text-align:left; padding:12px 16px;">Тип</th>
       <th style="text-align:left; padding:12px 16px;">Обовʼязкове</th>
       <th style="text-align:left; padding:12px 16px;">Обовʼязкове</th>
       <th style="text-align:left; padding:12px 16px;">Опис</th>
       <th style="text-align:left; padding:12px 16px;">Опис</th>
     </tr><tr style="border-bottom:1px solid #efefef;">
     </tr>
    <tr style="border-bottom:1px solid #efefef;">
       <td style="padding:16px;">type</td>
       <td style="padding:16px;">type</td>
       <td style="padding:16px;">string</td>
       <td style="padding:16px;">string</td>
       <td style="padding:16px;">✅</td>
       <td style="padding:16px;">✅</td>
       <td style="padding:16px;">Завжди <code style="background:#f3f3f3; padding:2px 6px; border-radius:6px;">CASHLESS</code>
       <td style="padding:16px;">Завжди <code style="background:#f3f3f3; padding:2px 6px; border-radius:6px;">"CASHLESS"</code>
       </td>
       </td>
     </tr>
     </tr>
Рядок 197: Рядок 233:
       <td style="padding:16px;">✅</td>
       <td style="padding:16px;">✅</td>
       <td style="padding:16px;">Сума платежу</td>
       <td style="padding:16px;">Сума платежу</td>
     </tr></table>
     </tr>
 
</table>
== Перевірка статусу фіскалізації ==
<br>
<code>POST /api/merchant/fiscalization/check</code>


== 7. Перевірка статусу фіскалізації ==
----<br>
<p style="border: 1px solid #9ACD32; background-color: rgba(192, 255, 192, 0.5); padding: 10px; border-radius: 8px; font-family: Arial, sans-serif; font-size: 14px; font-weight: normal; position: relative; padding-left: 80px;">
    <span style="position: absolute; top: 10px; left: 10px; background-color: #006400; color: white; padding: 2px 12px; border-radius: 4px; font-size: 14px; font-weight: bold;">POST</span>
    <span style="margin-left: 5px; font-weight: bold; font-size: 16px;">/api/merchant/fiscalization/check</span>
</p>
=== Приклад запиту ===
=== Приклад запиту ===
<syntaxhighlight lang="json">
<syntaxhighlight lang="json">
Рядок 216: Рядок 257:
* '''<code>InProcess</code>''' — в обробці
* '''<code>InProcess</code>''' — в обробці
* '''<code>Declined</code>''' — помилка
* '''<code>Declined</code>''' — помилка
 
<br>


== 8. Повернення коштів (<code>CancelOrder</code>) ==
== 8. Повернення коштів (<code>CancelOrder</code>) ==
Рядок 222: Рядок 263:


=== Часткове повернення ===
=== Часткове повернення ===
Умови:
'''Умови:'''


* транзакція була фіскалізована
* транзакція була фіскалізована
* повертається частина товарів
* повертається частина товарів
 
'''<br>
Особливості:
'''Особливості:'''


* обʼєкт <code>fiscalization</code> '''обовʼязковий'''
* обʼєкт <code>fiscalization</code> '''обовʼязковий'''

Поточна версія на 13:52, 28 січня 2026


1. Попередні умови


Для фіскалізації транзакцій мерчант повинен:

  • Бути зареєстрованим у сервісі Checkbox: https://checkbox.ua
  • Мати в Checkbox:
    • зареєстровану касу
    • створеного касира


2. Дані, які потрібно надати EasyPay


Після реєстрації в Checkbox необхідно надіслати менеджеру EasyPay на email:

Ключ ліцензії каси (licenseKey)


PIN-код касира

serviceKey, з якого будуть фіскалізуватися транзакції

⚠️ Без передачі цих даних фіскалізація працювати не буде.

3. Робота зі змінами та часові обмеження


3.1 Автоматична робота зі змінами

  • Зміна відкривається автоматично разом із першою фіскалізованою транзакцією за день
  • Зміна автоматично закривається о 23:45
  • Мерчанту не потрібно відкривати або закривати зміну вручну


3.2 Налаштування автозакриття каси в Checkbox

У кабінеті Checkbox необхідно обовʼязково встановити автозакриття каси на 23:45 (не раніше).

EasyPay додатково виконує автоматичне закриття кас о 23:40, але налаштування в кабінеті Checkbox використовується як додатковий запобіжник для коректної роботи фіскалізації.


3.3 Період перезміни (23:30 – 00:00)

У проміжок часу з 23:30 до 00:00 в EasyPay та Checkbox відбувається перезміна.

У цей період:

  • транзакції та чеки можуть перебувати в статусі обробки
  • фактична фіскалізація таких транзакцій виконується вже новим днем
  • це є штатною поведінкою системи та не потребує дій з боку Мерчанта


3.4 Обмеження на ручні дії в Checkbox

Під час роботи з фіскалізацією через EasyPay:

  • заборонено виконувати будь-які ручні дії з касою або чеками через:
    • Checkbox.Kasa
    • Checkbox Manager
  • уся фіскалізація, відкриття/закриття змін та обробка чеків виконується EasyPay автоматично


4. Загальна схема роботи


  1. Мерчант створює замовлення (createOrder) з параметрами фіскалізації
  2. EasyPay ініціює фіскалізацію в сервісі Checkbox
  3. Checkbox формує фіскальний чек
  4. Статус фіскалізації та URL чека:
    • надсилаються в callback, або
    • доступні через метод fiscalization/check
  5. У разі повернення коштів використовується метод CancelOrder


5. Створення платежу з фіскалізацією


Для фіскалізації транзакції в методі:

POST /api/merchant/createOrder

потрібно передати обʼєкт fiscalization.

5.1. Приклад запиту createOrder


{
"order": {
"serviceKey": "MERCHANT-TEST-XXXX",
"orderId": "Fiscalization29",
"description": "Test for fiscalization",
"amount": 3,
"isOneTimePay": false,
"additionalItems": {
"Merchant.UrlNotify": "http://notifysigncheckexample.com"
}
},
"fiscalization": {
"licenseKey": "test8d2f483fafef",
"receiptType": "Url",
"receipt": {
"goods": [
{
"good": {
"code": "9999",
"name": "Wine",
"price": 1.5
},
"quantity": 2
}
],
"payments": [
{
"type": "CASHLESS",
"value": 3
}
]
}
}
}

6. Обʼєкт fiscalization


6.1. Загальна структура

Поле Тип Обов'язкове Опис
licenseKey string Ключ ліцензії каси Checkbox
receiptType string Завжди "Url"
receipt object Дані фіскального чека


6.2 receipt

Поле Тип Обовʼязкове Опис
goods array Перелік товарів
payments array Інформація про оплату


6.3 goods[ ]

Поле Тип Обовʼязкове Опис
good.code string Код товару
good.name string Назва товару
good.price decimal Ціна за одиницю
quantity decimal Кількість (до 3 знаків після коми)


Валідація: price × quantity = value у payments

6.4 payments[ ]

Поле Тип Обовʼязкове Опис
type string Завжди "CASHLESS"
value decimal Сума платежу


7. Перевірка статусу фіскалізації



POST /api/merchant/fiscalization/check

Приклад запиту

{
"orderId": "Fiscalization29",
"transactionid": 111111,
"serviceKey": "MERCHANT-TEST-XXXX"
}

Можливі статуси

  • Accepted — фіскалізація успішна
  • InProcess — в обробці
  • Declined — помилка


8. Повернення коштів (CancelOrder)


Часткове повернення

Умови:

  • транзакція була фіскалізована
  • повертається частина товарів


Особливості:

  • обʼєкт fiscalization обовʼязковий
  • передаються тільки товари та суми, які повертаються


Повне повернення

  • повертається вся сума платежу
  • обʼєкт fiscalization можна не передавати