Package: komtet_kassa_sdk
Библиотека для интеграции вашего сайта с с облачным сервисом распределенной печати чековКОМТЕТ КассаУстановкаС помощью pip:# pip install komtet_kassa_sdkВручную:$gitclonehttps://github.com/Komtet/komtet-kassa-python-sdk$cdkomtet-kassa-python-sdk# python setup.py installИспользование v2fromrequests.exceptionsimportHTTPErrorfromkomtet_kassa_sdk.v2import(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,'идентификатор очереди')exceptHTTPErrorasexc: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,'идентификатор очереди')exceptHTTPErrorasexc: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('идентификатор задачи')exceptHTTPErrorasexc: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('идентификатор очереди по умолчанию')# В этом случае можно не указывать идентификатор очереди всякий раз,# когда нужно распечатать чек или проверить состояние очереди:assertclient.is_queue_active()isTruetry:task=client.create_task(check)exceptHTTPErrorasexc:print(exc.response.text)else:print(task)Использование v1fromrequests.exceptionsimportHTTPErrorfromkomtet_kassa_sdk.v1import(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_PAYMENTcalculation_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,'идентификатор очереди')exceptHTTPErrorasexc: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,'идентификатор очереди')exceptHTTPErrorasexc: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('идентификатор задачи')exceptHTTPErrorasexc: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('идентификатор очереди по умолчанию')# В этом случае можно не указывать идентификатор очереди всякий раз,# когда нужно распечатать чек или проверить состояние очереди:assertclient.is_queue_active()isTruetry:task=client.create_task(check)exceptHTTPErrorasexc:print(exc.response.text)else:print(task)ChangelogUnreleased7.1.4 (16.11.2023)Поддержка place_address. Правки названия7.1.3 (25.07.2023)Тесты для подакцизного товара в позиции заказа7.1.2 (30.12.2022)Поддержка типа маркировкиgs10на v27.1.1 (09.12.2022)Добавление в чек коррекции v2 метода set_print7.1.0 (03.11.2022)У чека коррекции v2 убран параметр base_nameПараметр base_number теперь является необязательным для чека коррекции v27.0.5 (19.10.2022)Добавлена потерянная запятая в __init__ в v27.0.4 (21.06.2022)Реквизиты покупателя вынесены в объект requisites7.0.3 (06.05.2022)Добавил метод set_client для чека коррекции в v17.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в классеOrder5.3.2 (03.02.2021)Указана кодировка для файла helpers.py5.3.1 (03.02.2021)Правка версии для pypi5.3.0 (03.02.2021)Правка типа ИНН в описании методов классовCheckиCorrectionCheckВ классOrderв методset_clientдобавлен параметрclient_coordinateДобавлен признак расчётаpay5.2.0 (08.10.2020)В классыCheckиClientдобавлен методapply_correction_positionsдля устранения возможных несхождений в ценах позиций5.1.0 (21.09.2020)Для заказов добавлена поддержкаnomenclature_code,is_need_nomenclature_code5.0.0 (08.09.2020)Добавлен классEmployeeдля создания, просмотра, редактирования сотрудниковВ классеClientметодget_couriersзаменен наget_employeesВ классClientдобавлены методыcreate_employee,update_employee,get_employee_info,delete_employee4.2.0 (10.07.2020)Добавлена возможность передать дополнительный реквизит пользователяadditional_user_propsтег 10844.1.0 (25.06.2020)Добавлена возможность передать код товарной номенклатуры в HEX виде4.0.0 (19.06.2020)Параметрtask_idзаменен на параметрexternal_id3.1.1 (21.05.2020)В классCheckдобавлен методapply_discountдля применения скидок ко всему чекуВ классOrderдобавлен методapply_discountдля применения скидок ко всему заказу3.0.1 (19.05.2020)УдаленNomenclatureType3.0.0 (19.05.2020)Замена интерфейса классаNomenclature: удален параметрnomenclature_type2.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_number2.1.0 (27.01.2020)Добавлена поддержка кода номеклатуры в HEX представлении2.0.0 (20.01.2020)Заменены параметрыgtinиserialклассаNomenclatureнаcode1.10.0 (16.12.2019)В методOrder.add_positionдобавлен необязательный параметрagent.1.9.0 (20.11.2019)Добавлен методset_agentв классCheck1.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у классаVatRate1.5.2 (26.06.2019)Добавленно преобразованиеRATE_18иRATE_118вRATE_20иRATE_120у классаVatRate1.5.1 (24.06.2019)Расширен классResponseметодом_asdict1.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в классIntent0.4.0 (09.04.2018)Добавлен методset_authorised_personв классCorrectionCheck0.3.0 (20.03.2018)Добавлена поддержка ФФД 1.0.5 (Признак рассчета, способ рассчета, данные по кассиру,
данные по агенту)0.2.2 (10.11.2017)Добавлен методClient.get_task_infoДобавлен необязательный параметрoidвCheck.add_position0.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)Первый релиз.