komtet-kassa-sdk 8.0.0
Python SDK for KOMTET Kassa
License: MIT

# komtet-kassa-python-sdk
        
        Библиотека для интеграции вашего сайта с с облачным сервисом
        распределенной печати чеков [КОМТЕТ Касса](http://kassa.komtet.ru)
        
        # Установка
        
        С помощью pip:
        
        ``` bash
        # pip install komtet_kassa_sdk
        ```
        
        Вручную:
        
        ``` bash
        $ git clone https://github.com/Komtet/komtet-kassa-python-sdk
        $ cd komtet-kassa-python-sdk
        # python setup.py install
        ```
        
        # Использование v2
        
        ``` 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_0  # НДС 0%
        # vat_rate = VatRate.RATE_5  # НДС 5%
        # vat_rate = VatRate.RATE_7  # НДС 7%
        # vat_rate = VatRate.RATE_10  # НДС 10%
        # vat_rate = VatRate.RATE_20  # НДС 20%
        # vat_rate = VatRate.RATE_105  # НДС 5/105
        # vat_rate = VatRate.RATE_107  # НДС 7/107
        # 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
        
        # Часовая зона
        timezone = TimeZone.TIME_ZONE_1     # UTC+2
        # timezone = TimeZone.TIME_ZONE_2    # UTC+3
        # timezone = TimeZone.TIME_ZONE_3    # UTC+4
        # timezone = TimeZone.TIME_ZONE_4    # UTC+5
        # timezone = TimeZone.TIME_ZONE_5    # UTC+6
        # timezone = TimeZone.TIME_ZONE_6    # UTC+7
        # timezone = TimeZone.TIME_ZONE_7    # UTC+8
        # timezone = TimeZone.TIME_ZONE_8    # UTC+9
        # timezone = TimeZone.TIME_ZONE_9    # UTC+10
        # timezone = TimeZone.TIME_ZONE_10    # UTC+11
        # timezone = TimeZone.TIME_ZONE_11    # UTC+12
        
        # Планируемый статус товара
        planned_status=PlannedStatus.PLANNED_STATUS_1
        # planned_status=PlannedStatus.PLANNED_STATUS_2
        # planned_status=PlannedStatus.PLANNED_STATUS_3
        # planned_status=PlannedStatus.PLANNED_STATUS_4
        # planned_status=PlannedStatus.PLANNED_STATUS_5
        # planned_status=PlannedStatus.PLANNED_STATUS_6
        
        # Создание позиции
        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)
        
        # Если нужно установить планируемый статус товара
        position.set_planned_status(planned_status=PlannedStatus.PLANNED_STATUS_1)
        
        # Добавление позиции
        check.add_position(position)
        
        # Добавление суммы расчёта
        check.add_payment(300)
        
        # Если нужно распечатать чек (по умолчанию False)
        check.set_print(True)
        
        # Если нужно задать данные по кассиру, по умолчанию возьмутся с ФН
        check.set_cashier('Иваров И.П.', '1234567890123')
        
        # Если нужно установить дополнительные параметры чека
        check.set_additional_check_props('445334544')
        
        # Если нужно установить признак расчета в Интернет
        check.check.set_internet(True)
        
        # Если нужно установить сведения об оплате в безналичном порядке
        check.add_cashless_payment(sum=2000, method=2, id='transaction_1',
                                    additional_info='Дополнительные сведения')
        
        # Если нужно установить часовую зону
        check.set_timezone(timezone=TimeZone.TIME_ZONE_2)
        
        # Если нужно получитиь отчёт об успешной фискализации
        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
        
        ``` 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_5  # НДС 5%
        # vat_rate = VatRate.RATE_7  # НДС 7%
        # vat_rate = VatRate.RATE_10  # НДС 10%
        # vat_rate = VatRate.RATE_105  # НДС 5/105
        # vat_rate = VatRate.RATE_107  # НДС 7/107
        # 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')
        
        # Если нужно установить признак расчета в Интернет
        check.check.set_internet(True)
        
        # Если нужно установить сведения об оплате в безналичном порядке
        check.add_cashless_payment(sum=2000, method=2, id='transaction_1',
                                    additional_info='Дополнительные сведения')
        
        # Отправка запроса
        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
        ----------
        
        8.0.0 (20.11.2025)
        ------------------
          - Прекращена поддержка НДС 18% и НДС 18/118
          - Добавлена поддержка НДС 22% и НДС 22/122
        
        7.5.0 (06.11.2025)
        ------------------
          - Изменения по v1:
            - В классе `TaxSystem` удалена система налогообложения ЕНВД
          - Изменения по v2:
            - В классе `TaxSystem` удалена система налогообложения ЕНВД
        
        7.4.4 (08.09.2025)
        ------------------
          - Изменения по v1:
            - В методе `set_correction_data` параметр `document_number` стал необязательным
        
        7.4.3 (08.09.2025)
        ------------------
          - Изменения по v1:
            - В методе `set_correction_data` параметр `document_number` стал необязательным
        
        7.4.2 (15.08.2025)
        ------------------
          - Изменения по v1:
            - В класс `CorrectionCheck` добавлен метод `set_user` - email или телефон пользователя для отправки электронного чека
            - В методе `set_correction_data` параметр `description` стал необязательным (устарел и будет удален в будущих версиях)
        
        7.4.1 (12.08.2025)
        ------------------
          - Изменения по v2:
            - В класс `PlannedStatus` добавлен `PLANNED_STATUS_255` - cтатус товара, подлежащего обязательной маркировке, не изменился
        
        7.4.0 (05.08.2025)
        ------------------
          - Изменения по v1:
            - В классы `Check` и `CorrectionCheck` добавлен метод `set_internet` - признак расчета в "Интернет"
            - В класс `Check` добавлен метод  `add_cashless_payment` - сведения об оплате безналичными
        
          - Изменения по v2:
            - В классы `Check` и `CorrectionCheck` добавлен метод `set_internet` - признак расчета в "Интернет"
            - В классы `Check` и `CorrectionCheck` добавлен метод `set_timezone` - часовая зона
            - В класс `Check` добавлен метод  `add_cashless_payment` - сведения об оплате безналичными
            - В класс `Position` добавлен метод  `set_planned_status` - планируемый статус товара
        
        7.3.1 (27.05.2025)
        ------------------
        - Возможность установки флага признака использования ОСУ для позиции чека v2
        
        7.3.0 (10.04.2025)
        ------------------
        - Возможность не передавать операцию и телефоны в set_paying_agent_info()
        
        7.2.0 (06.11.2024)
        ------------------
        - Поддержка НДС 5%, НДС 7%, НДС 5/105 и НДС 7/107
        
        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`