Приклади

Перевірка режиму роботи каси

Після успішної аутентифікації важливо перевірити режим роботи каси, щоб визначити, чи вона працює в офлайн- або онлайн-режимі. Це дозволить правильно налаштувати подальші запити та обробку даних.

Синхронний приклад

from checkbox_sdk.client.synchronous import CheckBoxClient
import time

# Зберігаємо токен в змінній або базі даних
token = "ВАШ_ТОКЕН"

# Створюємо клієнта з токеном
with CheckBoxClient() as client:
    client = client.cashier.authenticate(token=token, license_key="ВАШ_КЛЮЧ_ЛІЦЕНЗІЇ")

    # Перевіряємо режим роботи каси
    register = client.cash_registers.get_cash_register()
    if not register["offline_mode"]:
        print("Каса працює в онлайн-режимі.")
        client.cash_registers.get_offline_codes()
    else:
        print("Каса працює в офлайн-режимі.")
        max_retries = 5
        delay_between_retries = 60

        retries = 0

        while retries < max_retries:
            ping = client.cash_registers.ping_tax_service()
            if ping["error"] is None:
                response = client.cash_registers.go_online()
                if response["status"] == "ok":
                    time.sleep(delay_between_retries) # Каса виходить у онлайн не відразу
                    register = client.cash_registers.get_cash_register()
                    if not register["offline_mode"]:
                        client.cash_registers.get_offline_codes()
                        break
                else:
                    print(f"Спроба {retries + 1} не привела до переведення касового апарату в режим он-лайн.")

                retries += 1

        if retries == max_retries:
            print(f"Не вдалося перевести касу в режим онлайн після {max_retries} спроб.")

    # Подальші дії з касою: відкриття зміни, створення чеків і т.д.

    # Завершення роботи
    client.cashier.sign_out(storage)

Асинхронний приклад

from checkbox_sdk.client.asynchronous import AsyncCheckBoxClient
import asyncio


async def main():
    # Зберігаємо токен в змінній або базі даних
    token = "ВАШ_ТОКЕН"

    # Створюємо клієнта з токеном
    async with AsyncCheckBoxClient(token=token, license_key="ВАШ_КЛЮЧ_ЛІЦЕНЗІЇ") as client:
        # Перевіряємо режим роботи каси
        register = await client.cash_registers.get_cash_register()
        if not register["offline_mode"]:
            print("Каса працює в онлайн-режимі.")
            await client.cash_registers.get_offline_codes()
        else:
            print("Каса працює в офлайн-режимі.")
            while True:
                ping = await client.cash_registers.ping_tax_service()
                if ping["error"] is None:
                    response = await client.cash_registers.go_online()
                    if response["status"] == "ok":
                        await asyncio.sleep(60)  # Каса виходить у онлайн не відразу
                        break
                await asyncio.sleep(5)

        # Подальші дії з касою: відкриття зміни, створення чеків і т.д.

        # Завершення роботи
        await client.cashier.sign_out()

# Запускаємо асинхронну функцію
asyncio.run(main())

В обох прикладах ми перевіряємо режим роботи каси після аутентифікації, використовуючи відповідний метод API. Якщо каса знаходиться в онлайн-режимі, запитуємо список офлайн кодів. Якщо каса в офлайн-режимі, перевіряємо зв’язок з ДПС і, у разі успіху, починаємо вихід в онлайн. Не забудьте замінити ВАШ_ТОКЕН на реальний токен, отриманий під час аутентифікації.

Робота з касовою зміною

Касова зміна не відкривається автоматично із першим чеком. Її потрібно відкрити окремою командою. Для цього скористайтесь відповідним методом API.

Синхронний приклад

from checkbox_sdk.client.synchronous import CheckBoxClient
from checkbox_sdk.exceptions import StatusException

# Зберігаємо токен в змінній або базі даних
token = "ВАШ_ТОКЕН"

with CheckBoxClient() as client:
    client.cashier.authenticate_token(token, license_key="ВАШ_КЛЮЧ_ЛІЦЕНЗІЇ")

    try:
        shift = client.shifts.create_shift(timeout=5)
        if shift["status"] == "OPENED":
            print("Касова зміна відкрита успішно")
    except StatusException as e:
        print(f"Сталася помилка при відкритті касової зміни: {e}")

    # Видаємо чеки

    try:
        client.shifts.close_shift(timeout=5)
    except StatusException as e:
        print(f"Сталася помилка при закритті касової зміни: {e}")

    client.cashier.sign_out()

Асинхронний приклад

from checkbox_sdk.client.asynchronous import AsyncCheckBoxClient
from checkbox_sdk.exceptions import StatusException
import asyncio

async def main():
    # Зберігаємо токен в змінній або базі даних
    token = "ВАШ_ТОКЕН"

    async with AsyncCheckBoxClient(token=token, license_key="ВАШ_КЛЮЧ_ЛІЦЕНЗІЇ") as client:
        try:
            shift = await client.shifts.create_shift(timeout=5)
            if shift["status"] == "OPENED":
                print("Касова зміна відкрита успішно")
        except StatusException as e:
            print(f"Сталася помилка при відкритті касової зміни: {e}")

        # Видаємо чеки

        try:
            await client.shifts.close_shift(timeout=5)
        except StatusException as e:
            print(f"Сталася помилка при закритті касової зміни: {e}")

        await client.cashier.sign_out()

# Запускаємо асинхронну функцію
asyncio.run(main())

Продаж

Ось оновлена секція «Продаж» з урахуванням мінімального набору даних та обмеження по частоті запитів:

Продаж

Проведення продажу

Для проведення продажу за допомогою API Checkbox необхідно надати мінімальний набір даних. Цей набір включає:

  • Код товару: Ідентифікатор товару.

  • Назва товару: Опис товару або послуги.

  • Ціна: Ціна одиниці товару.

  • Кількість: Кількість одиниць товару.

  • Тип оплати: Спосіб оплати (готівка, картка і т.д.).

  • Сума оплати: Загальна сума оплати.

Синхронний приклад

from checkbox_sdk.client.synchronous import CheckBoxClient
from checkbox_sdk.exceptions import StatusException

# Зберігаємо токен в змінній або конфігураційному файлі
token = "ВАШ_ТОКЕН"

with CheckBoxClient() as client:
    client.cashier.authenticate_token(token, license_key="ВАШ_КЛЮЧ_ЛІЦЕНЗІЇ")

    # Відкриття касової зміни

    receipt_data =
    {
      "goods": [
        {
          "good": {
            "code": "T100",
            "name": "Тестовий товар 1",
            "price": 5500
          },
          "quantity": 1000
        },
        {
          "good": {
            "code": "T200",
            "name": "Тестовий товар 2",
            "price": 15200
          },
          "quantity": 1000
        }
      ],
      "discounts": [
        {
          "type": "DISCOUNT",
          "mode": "VALUE",
          "value": 2500,
          "name": "Знижка"
        }
      ],
      "payments": [
        {
          "type": "CASHLESS",
          "value": 18200
        }
      ]
    }

    try:
        client.receipts.create_receipt(
            receipt=receipt_data,
            timeout=5,
        )
    except StatusException as e:
            print(f"Сталася помилка при створенні чеку: {e}")

    # Закриття зміни

    client.cashier.sign_out()

Асинхронний приклад

from checkbox_sdk.client.asynchronous import AsyncCheckBoxClient
from checkbox_sdk.exceptions import StatusException
import asyncio

async def main():
    # Зберігаємо токен в змінній або конфігураційному файлі
    token = "ВАШ_ТОКЕН"

    async with AsyncCheckBoxClient(token=token, license_key="ВАШ_КЛЮЧ_ЛІЦЕНЗІЇ") as client:
        # Відкриття касової зміни

        receipt_data = {
            "goods": [
                {
                    "good": {
                        "code": "T100",
                        "name": "Тестовий товар 1",
                        "price": 5500
                    },
                    "quantity": 1000
                },
                {
                    "good": {
                        "code": "T200",
                        "name": "Тестовий товар 2",
                        "price": 15200
                    },
                    "quantity": 1000
                }
            ],
            "discounts": [
                {
                    "type": "DISCOUNT",
                    "mode": "VALUE",
                    "value": 2500,
                    "name": "Знижка"
                }
            ],
            "payments": [
                {
                    "type": "CASHLESS",
                    "value": 18200
                }
            ]
        }

        try:
            await client.receipts.create_receipt(
                receipt=receipt_data,
                timeout=5,
            )
        except StatusException as e:
            print(f"Сталася помилка при створенні чеку: {e}")

        # Закриття зміни

        await client.cashier.sign_out()

# Запускаємо асинхронну функцію
asyncio.run(main())