Интеграция онлайн-кассы Комтет с сайтом
Доброго времени друзья, сегодня я хочу рассказать об опыте работы с API онлайн-кассы от компании Комтет, об интеграции её с сайтом совместных покупок(интернет-магазином) в рамках 54-ФЗ, где продажа подразумевает прием предоплаты от пользователей, с последующей полной оплатой заказа спустя пару недель, где также ряд товаров идет с маркировкой(487-ФЗ), в итоге как первое так и второе должно отобразиться в «пробиваемых» электронных чеках. И конечно же я расскажу о настройке таких параметров как — система налогообложения, наличие НДС и способ оплаты. Далее обо всем подробнее.
Алгоритм работы
В нашем случае, алгоритм работы и пробитие чеков подразумевает пробитие предварительных чеков о предоплате, с последующим пробитием второго чека о полном расчете или о возврате предоплаты, т.к. бизнес модель подразумевает выкуп товара у поставщика по заказу клиента, а товара может и не оказаться. Также мы работаем с клиентом(т.е. не продаем товар, а оказываем услугу) по агентскому договору, что также должно отобраться в чеках, чтобы последующее начисление налогов было корректным(только с суммы агентского вознаграждения).
По этому алгоритм работы у нас такой:
- Принимаем заказ и выставляем счет на сумму предоплаты в процентах от стоимости заказа, в некоторых случаях сумма предоплаты может равняться 100%. Во всех случаях это должно отразиться в чеках.
- Клиент производит оплату на сумму предоплаты, на что наш сайт отправляет по API Комтет запрос на печать чека предоплаты с такими параметрами: без НДС , УСН доход — расход 15%, оплата картой, сумма предоплаты, название услуги и заказанного товара, стоимость товара, количество, общая сумма, данные о кассире, данные о маркировке товара(если есть).
- Спустя некоторое время, когда пользователь получает свой заказ(заказанный товар), мы пробиваем основной закрывающий чек, указывая в нем те данные что и при предоплате, но сам чек уже имеет статус «полная оплата».
- В случае если пользователь по какой-то причине отказался от заказа или мы не можем его выполнить, то мы оформляем возврат и пробиваем соответствующий чек возврата.
- Также функционал должен предусматривать внесение корректировок, например если стоимость заказа изменилась или изменился список товаров.
Настройка кассы в личном кабинете Комтет
1. Регистрируемся на сайте Комтет и переходим в личный кабинет(ЛК).
2. Для тестирования вам будут выданы тестовые данные, для этого в ЛК в разделе Фискализация->Магазины нужно создать первый тестовый магазин, указав параметры: домен сайта, URL возврата в случае успеха и URL возврата в случае неудачи.
3. Затем переходим в раздел Фискализация->Кассы, создаем Очередь и Кассу, указывая ФИО и ИНН кассира, связываем их. Касса последовательно разбирает задачи из очереди на фискализацию. К одной очереди можно добавить несколько касс, чтобы увеличить скорость обработки чеков.
4. Для тестирования Кассы, вам потребуется скачать программу под Windows, далее установить её и настроить, указав при этом значения из полей ID кассы и секретный ключ кассы (их можно посмотреть в настройках кассы). Программа под Windows будет имитировать работу кассы на вашей тестовой среде. Как это выглядит вы можете посмотреть на скриншотах ниже.
5. После проделанной процедуры вы можете перейти к тестированию, а именно отправлять на печать чеки с помощью API Комтет, указав в его параметрах работы данные тестовой кассы. Все чеки будут печататься в тестовом режиме, на указанные вами Email адреса будут приходить чеки в электронном виде, где вы сможете посмотреть все их параметры и при необходимости внести настройки в свой скрипт работы с API.
6. После завершения тестирования вы сможете переключить работу API в боевой режим, указав параметры реальной онлайн кассы, вместо тестовой. Также по окончанию тестирования необходимо уведомить тех. поддержку Комтет, они со свой стороны, перед переключением в боевой режим, проверят корректность работы вашей интеграции.
Описание API
Для работы с API, отправки данных для печати чеков, средствами PHP, предусмотрена специальная библиотека komtet-kassa-php-sdk, которая содержит в себе все необходимы классы и методы. Документация далеко не исчерпывающая и для понимания того, как работать например с чеками предоплаты было не понятно, для этого потребовалось заглянуть в сами скрипты, а по некоторым вопросом связаться с поддержкой. Ниже я приведу несколько примеров взаимодействия с API, которых нет в документации к SDK(хоть он их, разумеется, и поддерживает).
Разумеется можно реализовать и свои классы и методы работы с API, документация по ссылке.
Первым делом необходимо создать менеджер очередей(из документации к SDK):
<?php use Komtet\KassaSdk\Client; use Komtet\KassaSdk\QueueManager; $key = 'идентификатор магазина'; $secret = 'секретный ключ'; // PSR-совместимый логгер (опциональный параметр) $logger = null; $client = new Client($key, $secret, $logger); $manager = new QueueManager($client); |
После чего зарегистрировать очереди:
<?php $manager->registerQueue('queue-name-1', 'queue-id-1'); $manager->registerQueue('queue-name-2', 'queue-id-2'); // 'queue-name-1' и 'queue-name-2' - произвольные псевдомимы для обращения к очередям. // 'queue-id-1' и 'queue-id-2' - идентификаторы очередей, созданных в личном кабинете. |
Отправка чека на печать:
<?php use Komtet\KassaSdk\Agent; use Komtet\KassaSdk\Buyer; use Komtet\KassaSdk\Check; use Komtet\KassaSdk\Cashier; use Komtet\KassaSdk\Payment; use Komtet\KassaSdk\Position; use Komtet\KassaSdk\TaxSystem; use Komtet\KassaSdk\Vat; use Komtet\KassaSdk\Exception\SdkException; // уникальный ID, предоставляемый магазином $checkID = 'id'; // E-Mail клиента, на который будет отправлен E-Mail с чеком. $clientEmail = 'user@host'; $check = Check::createSell($checkID, $clientEmail, TaxSystem::COMMON); // или Check::createSellReturn для оформления возврата // Говорим, что чек нужно распечатать $check->setShouldPrint(true); $vat = new Vat(Vat::RATE_20); // Позиция в чеке: имя, цена, кол-во, общая стоимость, налог $position = new Position('name', 100, 1, 100, $vat); // Опционально можно установить: // Идентификатор позиции // $position->setId('123'); // Единицу измерения // $position->setMeasureName('Кг.'); // Cпособ расчета // $position->setCalculationMethod(CalculationMethod::FULL_PAYMENT); // Признак расчета // $position->setCalculationSubject(CalculationSubject::PRODUCT); // Агента по предмету расчета // $agent = new Agent(Agent::COMMISSIONAIRE, "+77777777777", "ООО 'Лютик'", "12345678901"); // $position->setAgent($agent); //Код маркировки товара (487-ФЗ) // $position->setNomenclature('123'); $check->addPosition($position); // Итоговая сумма расчёта $payment = new Payment(Payment::TYPE_CARD, 100); $check->addPayment($payment); // Добавление данных покупателя (опционально) $buyer = new Buyer('Пупкин П.П.', '123412341234'); $check->addBuyer($buyer); // Добавление кассира (опционально) $cashier = new Cashier('Иваров И.П.', '1234567890123'); $check->addCashier($cashier); // Добавляем чек в очередь. try { $manager->putCheck($check, 'queue-name-1'); } catch (SdkException $e) { echo $e->getMessage(); } |
Отправка чека коррекции:
<?php use Komtet\KassaSdk\Correction; use Komtet\KassaSdk\CorrectionCheck; use Komtet\KassaSdk\AuthorisedPerson; // Данные коррекции // createSelf для самостоятельной коррекции // createForced для коррекции по предписанию $correction = Correction::createSelf( '2012-12-21', // Дата документа коррекции в формате yyyy-mm-dd '4815162342', // Номер документа коррекции 'description' // Описание коррекции ); // createSell для коррекции прихода // createSellReturn для коррекции расхода $check = CorrectionCheck::createSell( '4815162342', // Номер операции в вашей системе '4815162342', // Серийный номер принтера TaxSystem::COMMON, // Система налогообложения $correction // Данные коррекции ); $check->setPayment( new Payment(Payment::TYPE_CARD, 4815), // Общая сумма по чеку new Vat('120') // Ставка налога ); $authorised_person = new AuthorisedPerson( 'Иваров И.И.', // ФИО '123456789012' // ИНН ); $check->setAuthorisedPerson($authorised_person); // Добавляем чек в очередь. try { $manager->putCheck($check, 'queue-name-1'); } catch (SdkException $e) { echo $e->getMessage(); } |
Отправка чека на предоплату сумма равная 100%:
<?php use Komtet\KassaSdk\Agent; use Komtet\KassaSdk\Buyer; use Komtet\KassaSdk\Check; use Komtet\KassaSdk\Cashier; use Komtet\KassaSdk\Payment; use Komtet\KassaSdk\Position; use Komtet\KassaSdk\TaxSystem; use Komtet\KassaSdk\Vat; use Komtet\KassaSdk\Exception\SdkException; use Komtet\KassaSdk\Client; use Komtet\KassaSdk\QueueManager; // уникальный ID, предоставляемый магазином $checkID = 'id'; // E-Mail клиента, на который будет отправлен E-Mail с чеком. $clientEmail = 'user@host'; $check = Check::createSellReturn($checkID, $clientEmail, TaxSystem::COMMON); // или Check::createSellReturn для оформления возврата // Говорим, что чек нужно распечатать $check->setShouldPrint(true); $vat = new Vat(Vat::RATE_20); // Позиция в чеке: имя, цена, кол-во, общая стоимость, налог $position = new Position('name', 100, 1, 100, $vat); // Cпособ расчета предварительный расчет 100% $position->setCalculationMethod(CalculationMethod::PRE_PAYMENT_FULL); $check->addPosition($position); // Итоговая сумма расчёта $payment = new Payment(Payment::TYPE_CARD, 100); $check->addPayment($payment); // Добавление данных покупателя (опционально) $buyer = new Buyer('Пупкин П.П.', '123412341234'); $check->addBuyer($buyer); // Добавление кассира (опционально) $cashier = new Cashier('Иваров И.П.', '1234567890123'); $check->addCashier($cashier); // Добавляем чек в очередь. try { $manager->putCheck($check, 'queue-name-1'); } catch (SdkException $e) { echo $e->getMessage(); } |
Отправка чека на предоплату сумма НЕ равная 100%, например 30%:
<?php use Komtet\KassaSdk\Agent; use Komtet\KassaSdk\Buyer; use Komtet\KassaSdk\Check; use Komtet\KassaSdk\Cashier; use Komtet\KassaSdk\Payment; use Komtet\KassaSdk\Position; use Komtet\KassaSdk\TaxSystem; use Komtet\KassaSdk\Vat; use Komtet\KassaSdk\Exception\SdkException; use Komtet\KassaSdk\Client; use Komtet\KassaSdk\QueueManager; // уникальный ID, предоставляемый магазином $checkID = 'id'; // E-Mail клиента, на который будет отправлен E-Mail с чеком. $clientEmail = 'user@host'; $check = Check::createSellReturn($checkID, $clientEmail, TaxSystem::COMMON); // или Check::createSellReturn для оформления возврата // Говорим, что чек нужно распечатать $check->setShouldPrint(true); $vat = new Vat(Vat::RATE_20); // Позиция в чеке: имя, цена, кол-во, общая стоимость 30%, налог $position = new Position('name', 30, 1, 30, $vat); // Cпособ расчета предварительный расчет 30% $position->setCalculationMethod(CalculationMethod::PRE_PAYMENT_PART); $check->addPosition($position); // Итоговая сумма расчёта $payment = new Payment(Payment::TYPE_CARD, 100); $check->addPayment($payment); // Добавление данных покупателя (опционально) $buyer = new Buyer('Пупкин П.П.', '123412341234'); $check->addBuyer($buyer); // Добавление кассира (опционально) $cashier = new Cashier('Иваров И.П.', '1234567890123'); $check->addCashier($cashier); // Добавляем чек в очередь. try { $manager->putCheck($check, 'queue-name-1'); } catch (SdkException $e) { echo $e->getMessage(); } |
Чек для оформления возврата:
<?php use Komtet\KassaSdk\Agent; use Komtet\KassaSdk\Buyer; use Komtet\KassaSdk\Check; use Komtet\KassaSdk\Cashier; use Komtet\KassaSdk\Payment; use Komtet\KassaSdk\Position; use Komtet\KassaSdk\TaxSystem; use Komtet\KassaSdk\Vat; use Komtet\KassaSdk\Exception\SdkException; // уникальный ID, предоставляемый магазином $checkID = 'id'; // E-Mail клиента, на который будет отправлен E-Mail с чеком. $clientEmail = 'user@host'; $check = Check::createSellReturn($checkID, $clientEmail, TaxSystem::COMMON); // или Check::createSellReturn для оформления возврата // Говорим, что чек нужно распечатать $check->setShouldPrint(true); $vat = new Vat(Vat::RATE_20); // Позиция в чеке: имя, цена, кол-во, общая стоимость, налог $position = new Position('name', 100, 1, 100, $vat); $check->addPosition($position); // Итоговая сумма расчёта $payment = new Payment(Payment::TYPE_CARD, 100); $check->addPayment($payment); // Добавление данных покупателя (опционально) $buyer = new Buyer('Пупкин П.П.', '123412341234'); $check->addBuyer($buyer); // Добавление кассира (опционально) $cashier = new Cashier('Иваров И.П.', '1234567890123'); $check->addCashier($cashier); // Добавляем чек в очередь. try { $manager->putCheck($check, 'queue-name-1'); } catch (SdkException $e) { echo $e->getMessage(); } |
Список констант для НДС
Vat::RATE_NO | Без НДС |
Vat::RATE_0 | НДС 0% |
Vat::RATE_10 | НДС 10% |
Vat::RATE_20 | НДС 20% |
Vat::RATE_110 | Расчетная ставка 10/110 |
Vat::RATE_120 | Расчетная ставка 20/120 |
Список констант методов оплаты
CalculationMethod::PRE_PAYMENT_FULL | Полная предварительная оплата до момента передачи предмета расчета «ПРЕДОПЛАТА 100 %» |
CalculationMethod::PRE_PAYMENT_PART | Частичная предварительная оплата до момента передачи предмета расчета — «ПРЕДОПЛАТА» |
CalculationMethod::FULL_PAYMENT | Полная оплата, в том числе с учетом аванса (предварительной оплаты) в момент передачи предмета расчета «ПОЛНЫЙ РАСЧЕТ» |
CalculationMethod::ADVANCE | Аванс |
CalculationMethod::CREDIT_PART | Частичная оплата предмета расчета в момент его передачи с последующей оплатой в кредит «ЧАСТИЧНЫЙ РАСЧЕТ И КРЕДИТ» |
CalculationMethod::CREDIT_PAY | Оплата предмета расчета после его передачи с оплатой в кредит (оплата кредита) «ОПЛАТА КРЕДИТА» |
CalculationMethod::CREDIT | Передача предмета расчета без его оплаты в момент его передачи с последующей оплатой в кредит — «ПЕРЕДАЧА В КРЕДИТ» |
Список констант признаков расчета
CalculationSubject::PRODUCT | Товар, за исключением подакцизного товара |
CalculationSubject::PRODUCT_PRACTICAL | Подакцизный товар |
CalculationSubject::WORK | Работа |
CalculationSubject::SERVICE | Услуга |
CalculationSubject::GAMBLING_BET | Прием ставок при осуществлении деятельности по проведению азартных игр |
CalculationSubject::GAMBLING_WIN | Выплата денежных средств в виде выигрыша при осуществлении деятельности по проведению азартных игр |
CalculationSubject::LOTTERY_BET | Прием денежных средств при реализации лотерейных билетов, электронных лотерейных билетов, приеме лотерейных ставок при осуществлении деятельности по проведению лотерей |
CalculationSubject::LOTTERY_WIN | Выплата денежных средств в виде выигрыша при осуществлении деятельности по проведению лотерей |
CalculationSubject::RID | Предоставление прав на использование результатов интеллектуальной деятельности или средств индивидуализации «ПРЕДОСТАВЛЕНИЕ РИД» или «РИД» |
CalculationSubject::PAYMENT | Об авансе, задатке, предоплате, кредите, взносе в счет оплаты, пени, штрафе, вознаграждении, бонусе и ином аналогичном предмете расчета |
CalculationSubject::COMMISSION | Вознаграждении пользователя, являющегося платежным агентом (субагентом), банковским платежным агентом (субагентом), комиссионером, поверенным или иным агентом |
CalculationSubject::COMPOSITE | О предмете расчета, состоящем из предметов, каждому из которых может быть присвоено значение от «0» до «11» (0-11 — это вышеперечисленные) |
CalculationSubject::PAY | Взнос в счет оплаты пени, штрафа, вознаграждения, бонуса или иного аналогичного предмета расчета |
CalculationSubject::OTHER | О предмете расчета, не относящемуся к предметам расчета, которым может быть присвоено значение от «0» до «12» (0-12 — это вышеперечисленные) |
CalculationSubject::PROPERTY_RIGHT | Передача имущественного права |
CalculationSubject::NON_OPERATING | Внереализационный доход |
CalculationSubject::INSURANCE | Страховые взносы |
CalculationSubject::SALES_TAX | Торговый сбор |
CalculationSubject::RESORT_FEE | Курортный сбор |
Список констант типа оплаты
Payment::TYPE_CARD | Электронными |
Payment::TYPE_CASH | Наличными |
Payment::TYPE_PREPAYMENT | Cумма предоплатой (зачет аванса и/или предыдущих платежей) |
Payment::TYPE_CREDIT | Cумма постоплатой (кредит) |
Payment::TYPE_COUNTER_PROVISIONING | Cумма встречным предлжением |
Список констант типа системы налогообложения
TaxSystem::COMMON | Единый налог |
TaxSystem::SIMPLIFIED_IN | Доход |
TaxSystem::SIMPLIFIED_IN_OUT | Доход/Расход |
TaxSystem::UTOII | Единый налог на вмененный доход |
TaxSystem::UST | Единый социальный налог |
TaxSystem::PATENT | Патент |
Заключение
При интеграции, на сайте был реализован функционал с учетом множества различных ситуаций, отмена или изменение параметров сделки, внесение корректировок и т.д., все эти действия сопряжены с автоматической печатью чеков, что существенно снижает нагрузку на кассира или бухгалтерию(что чаще всего), в тех случаях когда приходится вносить корректировки вручную.
Если вам нужна помощь в интеграции онлайн кассы, обращайтесь, буду раз сотрудничеству!
Похожие записи
Оставить комментарий
Full Stack
Senior, Architect
предложить оффер
- jQuery: как получить значение атрибута?
- PHP работа с изображением, класс SimpleImage
- Интеграция с API ОСАГО сайта sravni.ru
- Комментарии на PHP, Ajax, mySQL
- PHP: Категории бесконечного уровня вложенности.
- Nginx редирект на другой сервис с сохранением URL спросил (а) Сергей
- Исполнитель пропал, почему такое случается и понять с кем работать? спросил (а) Артем
- Можно ли WordPress считать универсальным движком? спросил (а) Андрей
- Что такое самописный скрипт или CMS? спросил (а) Антон
- Как при поиске в linux используя grep, добавить исключения? спросил (а) Алексей
- Консольный скрипт(JavaScript) для автоматических заказов на OZON к записи
- Консольный скрипт(JavaScript) для автоматических заказов на OZON к записи
- Как создать Telegram-бота с авторизацией через сайт к записи
- PHP скрипт: каталог закладок на сайты к записи
- Валидация на PHP к записи
- Сколько зарабатывают в бизнесе на совместных покупках к записи
- Сколько зарабатывают в бизнесе на совместных покупках к записи
Archive
- +2024 (34)
- Декабрь 2024 (6)
- Ноябрь 2024 (13)
- Октябрь 2024 (8)
- Сентябрь 2024 (1)
- Август 2024 (5)
- Май 2024 (1)
- +2023 (27)
- Ноябрь 2023 (1)
- Октябрь 2023 (13)
- Сентябрь 2023 (10)
- Апрель 2023 (1)
- Март 2023 (1)
- Февраль 2023 (1)
- +2022 (21)
- Декабрь 2022 (11)
- Ноябрь 2022 (1)
- Май 2022 (2)
- Апрель 2022 (2)
- Март 2022 (3)
- Февраль 2022 (1)
- Январь 2022 (1)
- +2021 (17)
- Декабрь 2021 (5)
- Ноябрь 2021 (2)
- Июль 2021 (1)
- Июнь 2021 (2)
- Май 2021 (5)
- Апрель 2021 (1)
- Март 2021 (1)
- +2020 (20)
- Декабрь 2020 (6)
- Сентябрь 2020 (2)
- Август 2020 (1)
- Июль 2020 (2)
- Май 2020 (2)
- Апрель 2020 (2)
- Март 2020 (2)
- Февраль 2020 (1)
- Январь 2020 (2)
- +2019 (18)
- Декабрь 2019 (3)
- Ноябрь 2019 (2)
- Октябрь 2019 (2)
- Сентябрь 2019 (1)
- Август 2019 (2)
- Июль 2019 (1)
- Июнь 2019 (1)
- Апрель 2019 (2)
- Март 2019 (1)
- Февраль 2019 (3)
- +2018 (44)
- Декабрь 2018 (4)
- Ноябрь 2018 (7)
- Октябрь 2018 (8)
- Сентябрь 2018 (1)
- Август 2018 (4)
- Июль 2018 (5)
- Май 2018 (3)
- Апрель 2018 (7)
- Март 2018 (1)
- Февраль 2018 (2)
- Январь 2018 (2)
- +2017 (19)
- Декабрь 2017 (2)
- Ноябрь 2017 (1)
- Октябрь 2017 (1)
- Сентябрь 2017 (2)
- Июль 2017 (1)
- Июнь 2017 (1)
- Май 2017 (2)
- Апрель 2017 (3)
- Март 2017 (2)
- Февраль 2017 (1)
- Январь 2017 (3)
- +2016 (36)
- Декабрь 2016 (3)
- Ноябрь 2016 (3)
- Октябрь 2016 (2)
- Сентябрь 2016 (3)
- Август 2016 (7)
- Июнь 2016 (3)
- Май 2016 (3)
- Апрель 2016 (3)
- Февраль 2016 (1)
- Январь 2016 (8)
- +2015 (36)
- Ноябрь 2015 (5)
- Октябрь 2015 (4)
- Сентябрь 2015 (1)
- Август 2015 (8)
- Июнь 2015 (1)
- Май 2015 (4)
- Апрель 2015 (8)
- Март 2015 (3)
- Февраль 2015 (2)
- +2014 (26)
- Ноябрь 2014 (2)
- Октябрь 2014 (5)
- Сентябрь 2014 (6)
- Июль 2014 (1)
- Июнь 2014 (2)
- Май 2014 (3)
- Апрель 2014 (6)
- Февраль 2014 (1)
- +2013 (27)
- Декабрь 2013 (2)
- Ноябрь 2013 (1)
- Октябрь 2013 (1)
- Август 2013 (1)
- Июль 2013 (3)
- Июнь 2013 (10)
- Май 2013 (1)
- Апрель 2013 (2)
- Февраль 2013 (3)
- Январь 2013 (3)
- +2012 (41)
- Декабрь 2012 (2)
- Ноябрь 2012 (3)
- Октябрь 2012 (7)
- Сентябрь 2012 (2)
- Август 2012 (1)
- Июль 2012 (3)
- Июнь 2012 (2)
- Май 2012 (6)
- Апрель 2012 (2)
- Март 2012 (7)
- Февраль 2012 (5)
- Январь 2012 (1)
- +2011 (57)
- Декабрь 2011 (6)
- Ноябрь 2011 (2)
- Октябрь 2011 (3)
- Сентябрь 2011 (5)
- Август 2011 (4)
- Июль 2011 (3)
- Июнь 2011 (3)
- Май 2011 (3)
- Апрель 2011 (4)
- Март 2011 (10)
- Февраль 2011 (5)
- Январь 2011 (9)
- +2010 (43)
- Декабрь 2010 (7)
- Ноябрь 2010 (21)
- Октябрь 2010 (14)
- Сентябрь 2010 (1)
Свежие записи
- Шифрование в PHP и расшифровка в JavaScript по ключу 15.12.2024
- Объединить несколько PDF в один документ (linux, php) 14.12.2024
- Восстановление работы служб сервера в случае ошибки Mysql —upgrade 12.12.2024
- Пакетное добавление сайтов в панель ISP Manager 6 07.12.2024
- Обрезка документа PDF в Linux из PHP 06.12.2024