komtet_kassa_sdk 7.1.4
Python SDK for KOMTET Kassa
License: MIT

=======================
komtet-kassa-python-sdk
=======================

Библиотека для интеграции вашего сайта с с облачным сервисом распределенной печати чеков `КОМТЕТ Касса <http://kassa.komtet.ru>`_

.. image:: https://img.shields.io/travis/Komtet/komtet-kassa-python-sdk.svg?style=flat-square
  :target: https://travis-ci.org/Komtet/komtet-kassa-python-sdk

Установка
=========

С помощью pip:

.. code:: bash

    # pip install komtet_kassa_sdk

Вручную:

.. code:: bash

    $ git clone https://github.com/Komtet/komtet-kassa-python-sdk
    $ cd komtet-kassa-python-sdk
    # python setup.py install


Использование v2
================

.. code:: python

    from requests.exceptions import HTTPError
    from komtet_kassa_sdk.v2 import (
        Check, CorrectionCheck, Client, Intent, TaxSystem, VatRate, CorrectionType, PaymentMethod,
        Agent, AgentType, PaymentType, PaymentObject, MarkTypes,
    )

    shop_id = 'идентификатор магазина'
    secret_key = 'секретный ключ'
    client = Client(shop_id, secret_key)

    oid = 'номер операции в вашем магазине'
    intent = Intent.SELL  # Направление платежа
    # Используйте Intent.RETURN для оформления возврата

    check = Check(oid, intent)

    email = 'client@client.ru'   # E-Mail пользователя для отправки электронного чека
    phone = '+79992400041'       # Телефон пользователя
    name = 'Иванов Иван'         # Имя пользователя
    inn = '5834041042'           # Инн пользователя

    check.set_client(email=email, phone=phone, name=name, inn=inn)

    payment_address = 'www.shop.com'   # Платёжный адрес организации

    # Система налогооблажения
    tax_system = TaxSystem.COMMON  # ОСН
    # tax_system = TaxSystem.SIMPLIFIED_IN  # УСН доход
    # tax_system = TaxSystem.SIMPLIFIED_IN_OUT  # УСН доход - расход
    # tax_system = TaxSystem.UTOII  # ЕНВД
    # tax_system = TaxSystem.UST  # ЕСН
    # tax_system = TaxSystem.PATENT  # Патент

    check.set_company(payment_address=payment_address, tax_system=tax_system)

    position_name = 'Наименование позиции'
    position_price = 100  # Цена позиции

    # Единицы измерений
    measure = MeasureTypes.PIECE
    # measure = MeasureTypes.PIECE
    # measure = MeasureTypes.GRAMM
    # measure = MeasureTypes.KILOGRAMM
    # measure = MeasureTypes.TON
    # measure = MeasureTypes.CENTIMETER
    # measure = MeasureTypes.DECIMETER
    # measure = MeasureTypes.METER
    # measure = MeasureTypes.SQUARE_CENTIMETER
    # measure = MeasureTypes.SQUARE_DECIMETER
    # measure = MeasureTypes.SQUARE_METER
    # measure = MeasureTypes.MILLILITER
    # measure = MeasureTypes.LITER
    # measure = MeasureTypes.CUBIC_METER
    # measure = MeasureTypes.KILOWATT_HOUR
    # measure = MeasureTypes.GIGA_CALORIE
    # measure = MeasureTypes.DAY
    # measure = MeasureTypes.HOUR
    # measure = MeasureTypes.MINUTE
    # measure = MeasureTypes.SECOND
    # measure = MeasureTypes.KILOBYTE
    # measure = MeasureTypes.MEGABYTE
    # measure = MeasureTypes.GIGABYTE
    # measure = MeasureTypes.TERABYTE
    # measure = MeasureTypes.OTHER_MEASURMENTS

    # Налоговая ставка
    vat_rate = VatRate.RATE_NO  # Без НДС
    # vat_rate = VatRate.RATE_20  # НДС 20%
    # vat_rate = VatRate.RATE_0  # НДС 0%
    # vat_rate = VatRate.RATE_10  # НДС 10%
    # vat_rate = VatRate.RATE_110  # НДС 10/110
    # vat_rate = VatRate.RATE_120  # НДС 20/120

    #Способ расчёта
    payment_method = PaymentMethod.PRE_PAYMENT_FULL
    # payment_method = PaymentMethod.PRE_PAYMENT_PART
    # payment_method = PaymentMethod.FULL_PAYMENT
    # payment_method = PaymentMethod.ADVANCE
    # payment_method = PaymentMethod.CREDIT_PART
    # payment_method = PaymentMethod.CREDIT_PAY
    # payment_method = PaymentMethod.CREDIT


    # Признак рассчета
    payment_object = PaymentObject.PRODUCT
    # payment_object = PaymentObject.PRODUCT_PRACTICAL
    # payment_object = PaymentObject.WORK
    # payment_object = PaymentObject.SERVICE
    # payment_object = PaymentObject.GAMBLING_BET
    # payment_object = PaymentObject.GAMBLING_WIN
    # payment_object = PaymentObject.LOTTERY_BET
    # payment_object = PaymentObject.LOTTERY_WIN
    # payment_object = PaymentObject.RID
    # payment_object = PaymentObject.PAYMENT
    # payment_object = PaymentObject.COMMISSION
    # payment_object = PaymentObject.COMPOSITE
    # payment_object = PaymentObject.PAY
    # payment_object = PaymentObject.OTHER
    # payment_object = PaymentObject.PROPERTY_RIGHT
    # payment_object = PaymentObject.NON_OPERATING
    # payment_object = PaymentObject.INSURANCE
    # payment_object = PaymentObject.SALES_TAX
    # payment_object = PaymentObject.RESORT_FEE
    # payment_object = PaymentObject.DEPOSIT
    # payment_object = PaymentObject.CONSUMPTION
    # payment_object = PaymentObject.SOLE_PROPRIETOR_CPI_CONTRIBUTINS
    # payment_object = PaymentObject.CPI_CONTRIBUTINS
    # payment_object = PaymentObject.SOLE_PROPRIETOR_CMI_CONTRIBUTINS
    # payment_object = PaymentObject.CMI_CONTRIBUTINS
    # payment_object = PaymentObject.CSI_CONTRIBUTINS
    # payment_object = PaymentObject.CASINO_PAYMENT
    # payment_object = PaymentObject.PAYMENT_OF_THE_MONEY
    # payment_object = PaymentObject.ATHM
    # payment_object = PaymentObject.ATM
    # payment_object = PaymentObject.THM
    # payment_object = PaymentObject.TM

    # Создание позиции
    position = Position(id=1,  # Идентификатор позиции в магазине
                        name='Наименование позиции',
                        price=10, # Цена за единицу
                        quantity=1,  # Количество единиц
                        total=10, # Общая стоимость позиции
                        excise=10, # Акциз
                        measure=measure, # Единица измерения
                        user_data='Дополнительный реквизит предмета расчета',
                        payment_method=payment_method, # Метод расчёта
                        vat=vat_rate,  # Тип налога
                        payment_object=payment_object # Объект расчёта
    )

    # Типы маркировок
    mark_type = MarkTypes.EAN13
    # mark_type = MarkTypes.UNKNOWN
    # mark_type = MarkTypes.EAN8
    # mark_type = MarkTypes.ITF14
    # mark_type = MarkTypes.GS10
    # mark_type = MarkTypes.GS1M
    # mark_type = MarkTypes.GS10
    # mark_type = MarkTypes.SHORT
    # mark_type = MarkTypes.FUR
    # mark_type = MarkTypes.EGAIS20
    # mark_type = MarkTypes.EGAIS30

    # Добавление кода маркировки в позицию
    position.set_mark_code(type=mark_type, code='1234567890123')

    # Установка дробности маркированного товара
    position.set_mark_quantity(numerator=1, denominator=2)

    # Если нужна информация о агенте

    # Создание агента
    agent_info = Agent(agent_type=AgentType.AGENT, phone='+79998887766',
                        name='Названиепоставщика', inn='287381373424')

    # Если нужно, установка платёжного агента
    agent_info.set_paying_agent(operation='Операция1', phones=['+79998887766'])

    # Если нужно, установка оператора приёма платежей
    agent_info.set_receive_payments_operator(phones=['+79998887766'])

    # Если нужно, установка оператора перевода средств
    agent_info.set_money_transfer_operator(phones=['+79998887766'], name='Операторперевода',
                                            address='г. Москва, ул. Складочная д.3',
                                            inn='8634330204')

    # Добавление агента в позицию
    position.set_agent(agent_info)

    # Добавление позиции
    check.add_position(position)

    # Добавление суммы расчёта
    check.add_payment(300)

    # Если нужно распечатать чек (по умолчанию False)
    check.set_print(True)

    # Если нужно задать данные по кассиру, по умолчанию возьмутся с ФН
    check.set_cashier('Иваров И.П.', '1234567890123')

    # Если нужно установить дополнительные параметры чека
    check.set_additional_check_props('445334544')

    # Если нужно получитиь отчёт об успешной фискализации
    check.set_callback_url('http://shop.pro/fiscal_check/callback')

    # Отправка запроса
    try:
        task = client.create_task(check, 'идентификатор очереди')
    except HTTPError as exc:
        print(exc.response.text)
    else:
        print(task)
    # Task(id=1, external_id=2, print_queue_id=3, state='new')
    # id - идентификатор задачи
    # external_id - идентификатор операции в магазине
    # print_queue_id - идентификатор очереди
    # state - состояние задачи


    # Создание чека коррекции

    intent = Intent.SELL_CORRECTION  # Коррекция прихода
    # intent = Intent.BUY_CORRECTION # Коррекция расхода
    # intent = Intent.SELL_RETURN_CORRECTION # Коррекция возврата прихода
    # intent = Intent.BUY_RETURN_CORRECTION # Коррекция возврата расхода

    check = CorrectionCheck(oid, intent)

    # Установка данных компании
    check.set_company(payment_address=payment_address, tax_system=tax_system)

    payment_type = PaymentType.CARD # Тип оплаты, корректирующей суммы
    # payment_method = PaymentType.CARD # электронные
    # payment_method = PaymentType.CASH # наличные

    # Установка суммы коррекции
    check.add_payment(12, payment_type)

    correction_type = CorrectionType.SELF # Тип коррекции
    # correction_type = CorrectionType.SELF # Самостоятельно
    # correction_type = CorrectionType.FORCED # По предписанию

    # Установка данных коррекции
    check.set_correction_info(correction_type,
                             '31.03.2022', # Дата документа коррекции в формате 'dd.mm.yyyy'
                             'K11',        # Номер документа коррекции
    )

    # Создаём позицию коррекции
    position = Position(name='Товар', price=10, quantity=5, total=50,
                        measure=measure, payment_method=payment_method,
                        payment_object=payment_object, vat=vat_rate)

    # Добавляем позицию коррекции
    check.add_position(position)

    # Указание уполномоченного лица
    check.set_authorised_person(
        name='Иванов И.И',
        inn='123456789012'
    )

    # Если нужно получитиь отчёт об успешной фискализации
    check.set_callback_url('http://shop.pro/fiscal_check/callback')

    # Отправка запроса
    try:
        task = client.create_task(check, 'идентификатор очереди')
    except HTTPError as exc:
        print(exc.response.text)
    else:
        print(task)
    # Task(id=1, external_id=2, print_queue_id=3, state='new')
    # id - идентификатор задачи
    # external_id - идентификатор операции в магазине
    # print_queue_id - идентификатор очереди
    # state - состояние задачи

    # Получение информации о поставленной на фискализацию задаче:
    try:
        task_info = client.get_task_info('идентификатор задачи')
    except HTTPError as exc:
        print(exc.response.text)
    else:
        print(task_info)
    # TaskInfo(id=234, external_id='4321', state='done', error_description=None,
    #          fiscal_data={'i': '111',
    #                       'fn': '2222222222222222',
    #                       't': '3333333333333',
    #                       'n': 4,
    #                       'fp': '555555555',
    #                       's': '6666.77'})
    # id - идентификатор задачи
    # external_id - идентификатор операции в магазине
    # state - состояние задачи
    # error_description - описание возникшей ошибки, когда state=='error'
    # fiscal_data - фискальные данные



    # Чтобы проверить, является ли очередь активной, выполните:
    client.is_queue_active('идентификатор очереди')

    # Вы можете указать идентификатор очереди по умолчанию с помощью:
    client.set_default_queue('идентификатор очереди по умолчанию')
    # В этом случае можно не указывать идентификатор очереди всякий раз,
    # когда нужно распечатать чек или проверить состояние очереди:
    assert client.is_queue_active() is True
    try:
        task = client.create_task(check)
    except HTTPError as exc:
        print(exc.response.text)
    else:
        print(task)


Использование v1
================

.. code:: python

    from requests.exceptions import HTTPError
    from komtet_kassa_sdk.v1 import (
        Check, CorrectionCheck, Client, Intent, TaxSystem, VatRate, CorrectionType, PaymentMethod,
        Agent, AgentType, CalculationSubject, CalculationMethod
    )

    shop_id = 'идентификатор магазина'
    secret_key = 'секретный ключ'
    client = Client(shop_id, secret_key)

    oid = 'номер операции в вашем магазине'
    email = 'E-Mail пользователя для отправки электронного чека'

    intent = Intent.SELL  # Направление платежа
    # Используйте Intent.RETURN для оформления возврата

    # Система налогооблажения
    tax_system = TaxSystem.COMMON  # ОСН
    # tax_system = TaxSystem.SIMPLIFIED_IN  # УСН доход
    # tax_system = TaxSystem.SIMPLIFIED_IN_OUT  # УСН доход - расход
    # tax_system = TaxSystem.UTOII  # ЕНВД
    # tax_system = TaxSystem.UST  # ЕСН
    # tax_system = TaxSystem.PATENT  # Патент

    check = Check(oid, email, intent, tax_system)

    position_name = 'Наименование позиции'
    position_price = 100  # Цена позиции
    check.add_position(position_name, position_price)

    # Налоговая ставка
    vat_rate = VatRate.RATE_20  # НДС 20%
    # vat_rate = VatRate.RATE_NO  # Без НДС
    # vat_rate = VatRate.RATE_0  # НДС 0%
    # vat_rate = VatRate.RATE_10  # НДС 10%
    # vat_rate = VatRate.RATE_110  # НДС 10/110
    # vat_rate = VatRate.RATE_120  # НДС 20/120
    # Можно указать просто число:
    # vat_rate = 20
    # или строку:
    # vat_rate = '10'
    # или даже так:
    # vat_rate = '20%'
    # а ещё вот так:
    # vat_rate = 0.20

    # Добавление позиции
    check.add_position(
        'Наименование позиции',
        oid=123,  # Идентификатор позиции в магазине
        price=100,  # Цена за единицу
        quantity=2,  # Количество единиц (по умолчанию 1)
        total=200,  # Общая стоимость позиции (по умолчанию price * quantity)
        vat=vat_rate  # По умолчанию Без НДС (VatRate.RATE_NO),

        calculation_method=CalculationMethod.FULL_PAYMENT, # По умолчанию FULL_PAYMENT
        calculation_subject=CalculationSubject.PRODUCT, # По умолчанию PRODUCT

        # Необязательный атрибут, указывается только при продаже комиссионером собственных и
        # комиссионных товаров
        agent = Agent(AgentType.COMMISSIONAIRE, '+77777777777', 'ООО "Лютик"', '12345678901')
    )

    # Добавление суммы расчёта
    check.add_payment(300)

    # Если нужно распечатать чек (по умолчанию False)
    check.set_print(True)

    # Если нужно задать данные по кассиру, по умолчанию возьмутся с ФН
    check.set_cashier('Иваров И.П.', '1234567890123')

    # Если нужно нужно передать данные клиента для фискализации
    check.set_client('Пупкин П.П.', '123412341234')

    # Отправка запроса
    try:
        task = client.create_task(check, 'идентификатор очереди')
    except HTTPError as exc:
        print(exc.response.text)
    else:
        print(task)
    # Task(id=1, external_id=2, print_queue_id=3, state='new')
    # id - идентификатор задачи
    # external_id - идентификатор операции в магазине
    # print_queue_id - идентификатор очереди
    # state - состояние задачи


    # Создание чека коррекции

    intent = Intent.SELL_CORRECTION  # Коррекция прихода
    # intent = Intent.BUY_CORRECTION # Коррекция расхода
    # intent = Intent.SELL_RETURN_CORRECTION # Коррекция возврата прихода
    # intent = Intent.BUY_RETURN_CORRECTION # Коррекция возврата расхода

    check = CorrectionCheck(oid, intent, sno)

    payment_method = PaymentMethod.CARD # Метод оплаты, корректирующей суммы
    # payment_method = PaymentMethod.CARD # электронные
    # payment_method = PaymentMethod.CASH # наличные

    # Установка суммы коррекции
    check.add_payment(
      correction_sum=12, # Сумма
      payment_method=payment_method
    )

    correction_type = CorrectionType.SELF # Тип коррекции
    # correction_type = CorrectionType.SELF # Самостоятельно
    # correction_type = CorrectionType.FORCED # По предписанию

    # Установка данных коррекции
    check.set_correction_data(
        type=correction_type,
        data='2017-09-28', # Дата документа коррекции в формате 'yyyy-mm-dd'
        document='К111', # Номер документа коррекции
        description='Отключение электричества' # Описание коррекции
    )
    # Указание уполномоченного лица
    check.set_authorised_person(
        name='Иванов И.И',
        inn='123456789012'
    )

    # Указание данных клиента
    check.set_client(
        name='Иванов И.П.',
        inn='1231231231'
    )

    # Отправка запроса
    try:
        task = client.create_task(check, 'идентификатор очереди')
    except HTTPError as exc:
        print(exc.response.text)
    else:
        print(task)
    # Task(id=1, external_id=2, print_queue_id=3, state='new')
    # id - идентификатор задачи
    # external_id - идентификатор операции в магазине
    # print_queue_id - идентификатор очереди
    # state - состояние задачи

    # Получение информации о поставленной на фискализацию задаче:
    try:
        task_info = client.get_task_info('идентификатор задачи')
    except HTTPError as exc:
        print(exc.response.text)
    else:
        print(task_info)
    # TaskInfo(id=234, external_id='4321', state='done', error_description=None,
    #          fiscal_data={'i': '111',
    #                       'fn': '2222222222222222',
    #                       't': '3333333333333',
    #                       'n': 4,
    #                       'fp': '555555555',
    #                       's': '6666.77'})
    # id - идентификатор задачи
    # external_id - идентификатор операции в магазине
    # state - состояние задачи
    # error_description - описание возникшей ошибки, когда state=='error'
    # fiscal_data - фискальные данные



    # Чтобы проверить, является ли очередь активной, выполните:
    client.is_queue_active('идентификатор очереди')

    # Вы можете указать идентификатор очереди по умолчанию с помощью:
    client.set_default_queue('идентификатор очереди по умолчанию')
    # В этом случае можно не указывать идентификатор очереди всякий раз,
    # когда нужно распечатать чек или проверить состояние очереди:
    assert client.is_queue_active() is True
    try:
        task = client.create_task(check)
    except HTTPError as exc:
        print(exc.response.text)
    else:
        print(task)

Changelog
=========

Unreleased
----------


7.1.4 (16.11.2023)
------------------
- Поддержка place_address. Правки названия

7.1.3 (25.07.2023)
------------------
- Тесты для подакцизного товара в позиции заказа

7.1.2 (30.12.2022)
------------------
- Поддержка типа маркировки `gs10` на v2

7.1.1 (09.12.2022)
------------------
- Добавление в чек коррекции v2 метода set_print

7.1.0 (03.11.2022)
------------------
- У чека коррекции v2 убран параметр base_name
- Параметр base_number теперь является необязательным для чека коррекции v2

7.0.5 (19.10.2022)
------------------
- Добавлена потерянная запятая в __init__ в v2

7.0.4 (21.06.2022)
------------------
- Реквизиты покупателя вынесены в объект requisites

7.0.3 (06.05.2022)
------------------
- Добавил метод set_client для чека коррекции в v1

7.0.2 (06.04.2022)
------------------
- Параметр `email` для метода `set_client` в классах `Check`, `CorrectionCheck` является необязательным

7.0.1 (21.12.2021)
------------------
- Поднята версия для pypi
- Исправлен механизм публикации

7.0.0 (21.12.2021)
------------------
- Тесты перенесены в докер
- Плагин разбит на подмодули (v1, v2)
- В версии v2 реализована новая схема постановки чеков
- Вся кодовая база была покрыта тестами
- Изменена схема чека коррекции для v1 структуры(Создан BaseCheck класс от которого наследуются Check/CorrectionCheck)
- Исправлены направления платежей для чека коррекции

6.0.0 (02.03.2021)
------------------

- Параметр `sno` для класса `Order` является обязательным
- Изменен порядок передачи параметра `sno` в классе `Order`

5.3.2 (03.02.2021)
------------------

- Указана кодировка для файла helpers.py

5.3.1 (03.02.2021)
------------------

- Правка версии для pypi

5.3.0 (03.02.2021)
------------------

- Правка типа ИНН в описании методов классов `Check` и `CorrectionCheck`
- В класс `Order` в метод `set_client` добавлен параметр `client_coordinate`
- Добавлен признак расчёта `pay`

5.2.0 (08.10.2020)
------------------

- В классы `Check` и `Client` добавлен метод `apply_correction_positions` для устранения возможных несхождений в ценах позиций

5.1.0 (21.09.2020)
------------------

- Для заказов добавлена поддержка `nomenclature_code`, `is_need_nomenclature_code`

5.0.0 (08.09.2020)
------------------

- Добавлен класс `Employee` для создания, просмотра, редактирования сотрудников
- В классе `Client` метод `get_couriers` заменен на `get_employees`
- В класс `Client` добавлены методы `create_employee`, `update_employee`, `get_employee_info`, `delete_employee`

4.2.0 (10.07.2020)
------------------

- Добавлена возможность передать дополнительный реквизит пользователя `additional_user_props` тег 1084

4.1.0 (25.06.2020)
------------------

- Добавлена возможность передать код товарной номенклатуры в HEX виде

4.0.0 (19.06.2020)
------------------

- Параметр `task_id` заменен на параметр `external_id`

3.1.1 (21.05.2020)
------------------

- В класс `Check` добавлен метод  `apply_discount` для применения скидок ко всему чеку
- В класс `Order` добавлен метод  `apply_discount` для применения скидок ко всему заказу

3.0.1 (19.05.2020)
------------------

- Удален `NomenclatureType`


3.0.0 (19.05.2020)
------------------

- Замена интерфейса класса `Nomenclature`: удален параметр `nomenclature_type`


2.4.0 (26.03.2020)
------------------

- В класс `Check` добавлен метод `set_additional_check_props` для поддержки дополнительного реквизита чека

2.3.1 (19.03.2020)
------------------

- Загрузка одного чека без мультизагрузки

2.3.0 (13.03.2020)
------------------

- В класс `Client` добавлен метод `create_tasks` для множественной загрузки чеков

2.2.0 (02.03.2020)
------------------

- Для заказов добавлена поддержка `excise`, `country_code`, `declaration_number`

2.1.0 (27.01.2020)
------------------

- Добавлена поддержка кода номеклатуры в HEX представлении

2.0.0 (20.01.2020)
------------------

- Заменены параметры `gtin` и `serial` класса `Nomenclature` на `code`

1.10.0 (16.12.2019)
-------------------

- В метод `Order.add_position` добавлен необязательный параметр `agent`.

1.9.0 (20.11.2019)
------------------

- Добавлен метод `set_agent` в класс `Check`


1.8.0 (18.11.2019)
------------------

- Параметр `inn` методов `Check.set_client` и `CorrectionCheck.set_authorised_person` необязателен для ввода

1.7.0 (13.09.2019)
------------------

- Заменен базовый класс для `OrderInfo`, `CouriersInfo` на собственную реализацию

1.6.0 (12.08.2019)
------------------

- Параметры функции `Check.set_client` необязательны для ввода


1.5.5 (18.07.2019)
------------------

- Добавлены празнаки рассчета `PROPERTY_RIGHT`, `NON_OPERATING`, `INSURANCE`, `SALES_TAX`, `RESORT_FEE` в класс `CalculationSubject`
- Добавлен классы `Nomenclature` и `NomenclatureType` для создания маркировок
- В позицию на чек фискализации добавлены необязательные поля суммы акциза, цифровой код страны и номер таможенной декларации

1.5.4 (08.07.2019)
------------------

- Параметры функции `Check.set_client` необязательны для ввода, но в случае использования функции inn
  обязательный параметр для передачи

1.5.3 (26.06.2019)
------------------

- Исправлено преобразование `RATE_118` в `RATE_120` у класса `VatRate`

1.5.2 (26.06.2019)
------------------

- Добавленно преобразование `RATE_18` и `RATE_118` в `RATE_20` и `RATE_120` у класса `VatRate`

1.5.1 (24.06.2019)
------------------

- Расширен класс `Response` методом `_asdict`

1.5.0 (24.06.2019)
------------------

- Заменен базовый класс для `Task`, `TaskInfo` на собственную реализацию

1.4.0 (13.06.2019)
------------------

- В класс `Order` добавлена возможность передать предоплату и тип платежа

1.3.0 (04.06.2019)
------------------

- Класс `Check` расширен методами `set_client` и `set_cashier` для передачи дополнительных данных
  по чеку

1.2.0 (16.05.2019)
------------------

- Класс `Order` расширен методом `add_callback_url` для оповещения магазина

1.1.1 (16.04.2019)
------------------

- Изменен идентификатор позиции заказа

1.1.0 (15.04.2019)
------------------

- Добавлен класс `Order` для создания и обновления заявок.
- Класс `Client` расширен методами `get_orders`, `get_couriers`, `create_order`, `update_order`,
  `get_order_info`, `delete_order` для работы с заявками.

1.0.0 (18.01.2019)
------------------

- Убраны атрибуты `RATE_18` и `RATE_118` у класса `VatRate`.

0.7.0 (10.12.2018)
------------------

- Класс `VatRate` расширен атрибутами `RATE_20` и `RATE_120`.

0.6.0 (20.11.2018)
------------------

- Класс `Agent` расширен методами `set_paying_agent_info`, `set_receive_payments_operator_info` и
  `set_money_transfer_operator_info` для передачи дополнительных атрибутов платежного агента,
  оператора по приему платежей и оператора перевода, соответственно.
- В класс `Check` добавлен необязательный параметр `payment_address` и метод `set_callback_url`.

0.5.0 (14.08.2018)
------------------

- Добавлены направления платежа `BUY` и `BUY_RETURN` в класс `Intent`

0.4.0 (09.04.2018)
------------------

- Добавлен метод `set_authorised_person` в класс `CorrectionCheck`

0.3.0 (20.03.2018)
------------------

- Добавлена поддержка ФФД 1.0.5 (Признак рассчета, способ рассчета, данные по кассиру,
  данные по агенту)

0.2.2 (10.11.2017)
------------------

- Добавлен метод `Client.get_task_info`
- Добавлен необязательный параметр `oid` в `Check.add_position`

0.2.1 (28.09.2017)
------------------

- Добавлен чек коррекции.
- Добавлена возможность указать вид оплаты.
- В позицию на чек фискализации добавлено необязательное поле единицы измерения.

0.2.0 (11.08.2017)
------------------

- Для отправки запросов теперь используется класс `Client`.
- При отправке запроса на добавление задачи в очередь теперь возвращается namedtuple вместо словаря.
- Удалены исключения. Вместо них используются исключения из requests.
- Константы сгруппированы в классы.
- Убрана валидация параметров при создании экземпляра чека и его элементов.
  Валидация уже осуществляется на сервере.
- В налогах теперь указывается только ставка (высчитывается на сервере).
- В позиции убран параметр `discount` (высчитывается на сервере).
- 99.9% покрытие кода тестами.
- Прочие небольшие изменения.

0.1.6 (31.07.2016)
------------------

- `print_out()` теперь возвращает ответ от сервера.

0.1.5 (10.07.2017)
------------------

- Исправлена возможность установки `sno` чека в ОСН.

0.1.4 (06.07.2017)
------------------

- Добавлен новый параметр чека `sno` (система налогооблажения).

0.1.1 (26.06.2017)
------------------

- Переезд на https.

0.1.0 (19.06.2017)
------------------

- Первый релиз.