mygento / module-kkm
mygento/module-kkm
Модуль интеграции фискальных кассовых аппаратов для Magento в соответствии с 54-ФЗ
Модуль интеграции Онлайн касс для Magento 2
Модуль разрабатывается для полной поддержки требований 54 ФЗ интернет-магазинами на Magento 2 для сервисов:
- АТОЛ онлайн. Модуль поддерживает версию сервиса АТОЛ v4 (ФФД 1.05).
- Чеконлайн.
Функциональность модуля
Передача данных в Онлайн кассу
- отправляет данные о счете/возврате:
- автоматически при создании счета (настраивается в конфигурации)
- автоматически при создании возврата (настраивается в конфигурации)
- вручную одной из консольных команд (см. ниже)
- вручную из админки кнопкой на странице Счета или Возврата
Повторная передача данных в Онлайн кассу (Resell)
(Не путать с чеком коррекции)
- Отменяет предыдущий чек прихода (по Invoice) и отправляет новый.
- вручную при нажатии кнопки
Resellв админке - консольной командой (см. ниже)
- другой модуль может триггерить
\Mygento\Kkm\Api\Processor\SendInterface::proceedResellRefund
- вручную при нажатии кнопки
Получение данных из АТОЛ
- получает из АТОЛ данные о статусе регистрации счета/возврата
- автоматически (настраивается в конфигурации). После обработки данных АТОЛ отправляет результат обратно (колбек). По умолчанию URL: http://shop.ru/kkm/frontend/callback
- крон задачей для проверки статусов
- вручную из админки кнопкой на странице Счета или Возврата
- консольной командой
mygento:kkm:update-one {$uuid}илиmygento:kkm:update-all {$storeId}
Получение данных из Чеконлайн
Работа сервиса Чеконлайн построена по синхронному принципу, понятие «статус»
документа в сервисе отсутствует.
Вместо этого используются кэширование ответов. Ключём кэша являются поля Group, RequestId, ClientId, что значит, что если будут отправлены запросы с одинаковыми указанными полями, то сервис ответит данными из кэша.
В кэш помещаются успешные ответы и некоторые ошибки устройства Ккм (см. документацию Чеконлайн)
Процесс отправки данных в Онлайн кассу
-
На основании сущности Invoice или Creditmemo формируется объект
Mygento\Kkm\Api\Data\RequestInterface.
1.1. При асинхронной передаче - объект помещается в очередь (см. Magento Queue Framework)
1.2. При синхронной передаче - передается классуVendorдля отправки -
Регистрируется попытка отправки данных. Создается сущность
Api\Data\TransactionInterface\TransactionAttemptInterfaceсо статусомNEW(1) -
Осуществляется передача данных в виде JSON.
3.1. В случае УСПЕШНОЙ передачи (один из HTTP статусов
[200, 400, 401])-
создается транзакция - сущность
Magento\Sales\Api\Data\TransactionInterfaceв который записываются уникальный идентификатор запроса (UUID - Атол; RequestId - Чеконлайн) и все данные о передаче. В админке это грид Sales -> Transactions. -
Сущность попытки отправки
TransactionAttemptInterfaceполучает статусSent(2) -
Создается комментарий к заказу
-
Транзакция получает в ККМ-статус (kkm_status):
-
Атол -
wait -
Чеконлайн -
done3.2. В случае НЕУСПЕШНОЙ передачи (статусы отличные от
[200, 400, 401](так же500для Чеконлайн), отсутствие ответа от сервера, некорректные данные в инвойсе или возврате)
-
-
Сущность попытки отправки
TransactionAttemptInterfaceполучает статусError(3) -
Создается комментарий к заказу с описанием причины ошибки
-
Заказ получает статус "KKM Failed"
-
Если выброшено исключение
VendorBadServerAnswerException(сервер не отвечает и еще в некоторых случаях) и включена асинхронная передача - то отправка будет снова помещена в очередь. -
Если выброшено исключение
VendorNonFatalErrorExceptionи включена асинхронная передача - то:- Атол - выполняется генерация нового external_id и отправка будет снова помещена в очередь.
- Чеконлайн - Сущность транзакции получает статус
waitи отправка снова помещается в очередь без генерации нового external_id, т.к. ответ с нефатальной ошибкой не кэшируется. Так же при работе «облачного» сервиса Чеконлайн могут возникать ошибки
возвращающие HTTP код 500 и структуру, содержащая поля:FCEError,ErrorDescription,DeviceиFatal. ПолеFatalсо значениемtrueпоказывает, что повторное выполнение запроса приведёт к
ошибке. Если полеFatalравноfalseто отправка так же помещается в очередь.
-
-
Только Атол. Модуль автоматически запрашивает у АТОЛа статус по всем транзакциям с ККМ-статусом
wait4.1 Попытки обновления статуса прекращаются, когда транзакция получает статус
done4.2 Максимальное количество попыток настройкой модуля ККМ.
-
В случае НЕУСПЕШНОЙ передачи выполняется несколько попыток отправки с увеличивающимися интервалами (например через 1 минуту, 5 минут, 15 минут, 30 минут, 1 час).
5.1 Настройка интервалов доступна в настройках модуля ККМ.
5.2 Максимальное количество попыток отправки тажке ограничего настройкой модуля ККМ.
5.3 В случае, когда достигается максимальное количество попыток отправки, счетчик попыток обнуляется и отправка возобновляется через сутки.
Процесс повторной отправки данных (Resell)
Работает только для тех чеков, которые были отправлены и имеют статус Done.
- На основании Invoice создается чек возврата (refund) и отправляется в Онлайн кассу.
- Создается новая запись Payment Transaction, дочерняя от предыдущей отправки
sellпо этому инвойсу. - Когда статус отправки из п.1 становится
Done(Для Чеконлайн статус отправки сразу становитсяDoneв случае успеха) - формируется и отправляется новый чек прихода (sell). - Для нового чека прихода создается новая запись Payment Transaction, дочерняя от транзакции для чека возврата (п.2).
- Resell считается завершенным, если новый чек прихода (п.3) получает статус
Done. Обновление статуса происходит так же как и во всех остальных случаях (Для Чеконлайн обновление статуса не происходит т.к. работа сервиса устроена по синхронному принципу)
Отчеты
Модуль отправляет отчеты об отправленных данных в Онлайн кассу на емейл (в конфиге). Неуспешные отправки отображаются в этом же письме с доп.деталями. Также этот отчет можно посмотреть в консоли.
- Еженедельный (за прошлую неделю), Ежедневный (за текущий день), Ежедневный (за вчерашний день)
- Верстка письма. Файл
view/adminhtml/templates/email/kkm_report-mjml.mjmlсодержит верстку письма. Редактируется с помощью сервиса https://mjml.io/
Поддержка новых версий сервиса АТОЛ Онлайн
Модуль поддерживал версии сервиса v4. Если выйдет новая версия, необходимо сделать след.шаги:
- создать class RequestForVersionX наследник абстрактного класса Request
- релилизовать его JSON представление - метод jsonSerialize()
- добавить создание объекта реквеста в Mygento\Kkm\Model\Atol\RequestFactory
- добавить инфу о новой версии сервиса в сурс модель Mygento\Kkm\Model\Source\ApiVersion
Использование очередей
- отправка сообщений в Онлайн кассу может осуществляться в двух режимах:
- синхронный (сразу после сохранения сущности или ручной отправки);
- асинхронно (через нативный механизм очередей сообщений Magento).
- режим работы настраивается в конфигурации
Ручная отправка данных
- Отправка данных на странице сущности
- Отправка данных консольной командой с указанием IncrementId сущности
Логирование сообщений
- Модуль логирует (при включенном режиме Debug в Stores -> Configuration -> Mygento Extensions -> Extensions and Support) все запросы (и ответы).
- Лог запросов доступен на странице конфигурации модуля
Список Rewrite
нет
Список событий и плагинов, Описание действий и причины
События
- sales_order_invoice_save_commit_after:
- отправляет данные по инвойсу после его сохранения.
- sales_order_creditmemo_save_commit_after:
- отправляет данные по возврату после сохранения.
Плагины
- before плагин
ExtraSalesViewToolbarButtonsна методMagento\Backend\Block\Widget\Button\Toolbar::pushButtonsдобавляет кнопки Отправки в Онлайн кассу и кнопку проверки статуса на страницу сущности в админке
Список доступных реализованных API
нет
Список встроенных тестов, что и как они тестируют
нет
Cron-процессы
- kkm_statuses
- Только Атол. Обновление статуса: job обновляет статусы транзакций, у которых статус
wait. По умолчанию каждую минуту
- Только Атол. Обновление статуса: job обновляет статусы транзакций, у которых статус
- kkm_proceed_scheduled_attempt
- выполняет повторные попытки отправки запросов по заданному расписанию (scheduled_at).
- kkm_report
- Отчет: job отправки отчета. Частота конфигурируется в админке на стр. настроек модуля. По умолчанию ежедневно в 00:07
Консольные команды
mygento:kkm:report- Отображает отчет. Аргументы: today, yesterday, weekmygento:kkm:refund- Отправляет возврат. Аргументы: IncrementId сущностиmygento:kkm:sell- Отправляет счет. Аргументы: IncrementId сущностиmygento:kkm:resell- Запускает процесс resell. Отправляет refund по текущему чеку. Аргументы: IncrementId сущности. При указании ключа-fувеличится external_id.mygento:kkm:update-all- Только Атол. Запрашивает данные о статусе всех отправок со статусомwaitдля указанного стора. Аргументы: StoreIDmygento:kkm:update-one- Только Атол. Запрашивает данные о статусе указанной отправки. Аргументы: UUID
No changelog yet
The vendor hasn't published a changelog. Tagged releases appear in the Versions tab.
| Version | Stability | QA Status | Compatibility | Released |
|---|---|---|---|---|
| 2.4.4 | stable | Fail | Magento 2.4.7 Details | 2025-12-25 11:00:41 |
| 2.4.3 | stable | Not tested | Not yet tested Details | 2025-09-02 12:47:03 |
| 2.4.2 | stable | Not tested | Not yet tested Details | 2024-05-16 07:55:47 |
| 2.4.1 | stable | Not tested | Not yet tested Details | 2022-08-30 14:12:22 |
| 2.4.0 | stable | Not tested | Not yet tested Details | 2022-04-27 12:18:07 |
| 2.3.23 | stable | Not tested | Not yet tested Details | 2021-04-28 12:10:25 |
| 2.3.22 | stable | Not tested | Not yet tested Details | 2021-04-12 09:52:49 |
| 2.3.21 | stable | Not tested | Not yet tested Details | 2021-04-08 22:27:09 |
| 2.3.20 | stable | Not tested | Not yet tested Details | 2021-04-05 09:38:32 |
| 2.3.19 | stable | Not tested | Not yet tested Details | 2021-03-29 09:11:01 |
| 2.3.17 | stable | Not tested | Not yet tested Details | 2020-12-14 12:58:16 |
| 2.3.17-RC3 | RC | Not tested | Not yet tested Details | 2020-10-02 13:27:12 |
| 2.3.17-RC1 | RC | Not tested | Not yet tested Details | 2020-09-18 15:43:05 |
| 2.3.16 | stable | Not tested | Not yet tested Details | 2020-07-30 15:44:34 |
| 2.3.15 | stable | Not tested | Not yet tested Details | 2020-07-29 16:24:45 |
| 2.3.14 | stable | Not tested | Not yet tested Details | 2020-07-07 12:38:19 |
| 2.3.12 | stable | Not tested | Not yet tested Details | 2020-04-28 12:42:02 |
| 2.3.11 | stable | Not tested | Not yet tested Details | 2020-03-19 14:52:52 |
| 2.3.10 | stable | Not tested | Not yet tested Details | 2020-03-02 09:39:36 |
| 2.3.9 | stable | Not tested | Not yet tested Details | 2020-02-26 13:16:06 |
| 2.3.8 | stable | Not tested | Not yet tested Details | 2020-02-17 20:47:01 |
| 2.3.7 | stable | Not tested | Not yet tested Details | 2019-12-27 11:20:04 |
| 2.3.5 | stable | Not tested | Not yet tested Details | 2019-07-11 15:00:18 |
| 2.3.4 | stable | Not tested | Not yet tested Details | 2019-07-11 10:02:45 |
| 2.3.3 | stable | Not tested | Not yet tested Details | 2019-06-14 15:28:30 |
| 2.3.2 | stable | Not tested | Not yet tested Details | 2019-05-28 12:32:02 |
| 2.3.0 | stable | Not tested | Not yet tested Details | 2019-03-20 13:24:58 |
| 1.2.1 | stable | Not tested | Not yet tested Details | 2019-01-28 12:37:17 |
| 1.2.0 | stable | Not tested | Not yet tested Details | 2018-12-20 08:33:42 |
| 1.1.9 | stable | Not tested | Not yet tested Details | 2018-10-30 14:50:22 |
| 1.1.8 | stable | Not tested | Not yet tested Details | 2018-10-23 11:00:46 |
| 1.1.6.1 | stable | Not tested | Not yet tested Details | 2018-03-29 17:05:37 |
| 1.1.6 | stable | Not tested | Not yet tested Details | 2018-02-06 10:48:24 |
| 1.1.5 | stable | Not tested | Not yet tested Details | 2018-02-02 10:44:10 |
| 1.1.4.1 | stable | Not tested | Not yet tested Details | 2018-01-31 07:35:41 |
| 1.1.4 | stable | Not tested | Not yet tested Details | 2018-01-30 16:52:09 |
| 1.1.7 | stable | Not tested | Not yet tested Details | 2017-10-27 14:50:03 |
| 1.1.3 | stable | Not tested | Not yet tested Details | 2017-10-27 14:50:03 |
| 1.1.2 | stable | Not tested | Not yet tested Details | 2017-10-27 11:50:27 |
| 1.1.1 | stable | Not tested | Not yet tested Details | 2017-08-24 15:59:51 |
| 1.1.0 | stable | Not tested | Not yet tested Details | 2017-08-16 07:58:53 |
| 1.0.4 | stable | Not tested | Not yet tested Details | 2017-06-30 15:59:18 |
Requires 2
| Package | Constraint |
|---|---|
| magento/framework-message-queue | 100.4.* |
| mygento/module-base | ~2.4.3 |
Requires-dev 1
| Package | Constraint |
|---|---|
| mygento/coding-standard | ~2.14.0 |
Compatibility
Each Magento release line is installed on its supported PHP versions, then the module is built (DI compilation + static-content deploy) and its unit and integration suites are run. The matrix shows the lines and PHP versions the module is confirmed to install and run on. Code-quality results further down (phpstan, phpcs, …) are reported separately and never affect compatibility.
Code Quality
Advisory checks against the module's source. Static analysis runs once across the whole module; PHPStan re-runs per Magento + PHP version because resolvable symbols differ between releases. These NEVER affect the Compatibility badge — a phpcs finding can't make a module incompatible.
Static analysis
Coding standards (phpcs), mess detection (phpmd), copy-pasted code (cpd), PHP cross-version compatibility, composer.json validity. Each runs once for the whole module.
| Tool | Status | Findings | Summary |
|---|---|---|---|
| PHPCS | Fail | 105 | 6 errors, 99 warnings (ruleset: Magento2) — 32 auto-fixable with phpcbf |
| PHPMD | Warning | 47 | 47 rule violations (MissingImport:33, UndefinedVariable:10, ExcessiveClassComplexity:4) |
| Cpd | Warning | 2 | 2 duplicated chunks spanning 36 total lines (min-lines=5, min-tokens=70) |
| Composer validate | Pass | 0 |
PHPStan
Type-checks the module's PHP against a real Magento install at the configured gate level. Re-runs per Magento and PHP version because resolvable symbols differ between releases. Cell → details modal.
Tests
Unit and integration suites, run for each applicable Magento and PHP version. A test failure speaks to the module's behaviour, not its compatibility with a Magento line, so it is reported here separately and never reddens the compatibility matrix.
Unit tests
| Magento | PHP 8.2 | PHP 8.3 | PHP 8.4 | PHP 8.5 |
|---|---|---|---|---|
| 2.4.7 | N/A | N/A | ||
| 2.4.8 | N/A | N/A | ||
| 2.4.9 | N/A | N/A |
Integration tests
| Magento | PHP 8.2 | PHP 8.3 | PHP 8.4 | PHP 8.5 |
|---|---|---|---|---|
| 2.4.7 | N/A | N/A | ||
| 2.4.8 | N/A | N/A | ||
| 2.4.9 | N/A | N/A |
Security
Security checks run directly against the module: an audit of its declared dependencies for known vulnerabilities (composer audit) and a scan of its source for malware and web-shell signatures. Each runs once. A malware detection fails the version outright.
More from mygento
View vendorTurn an existing module into recurring revenue.
If you already maintain a Magento 2 module on GitHub or GitLab, listing it on Packagento takes about five minutes. We mirror your tags, handle distribution signing, and route paid licenses through Stripe Connect, so you can keep shipping the way you already do.