mygento / module-kkm

mygento/module-kkm

Модуль интеграции фискальных кассовых аппаратов для Magento в соответствии с 54-ФЗ

magento2-module Compatibility: 2.4.7 Code Quality: Fail Tests: N/A Security: Pass OSL-3.0

Build Status
Latest Stable Version
Total Downloads

Модуль интеграции Онлайн касс для 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, что значит, что если будут отправлены запросы с одинаковыми указанными полями, то сервис ответит данными из кэша.
В кэш помещаются успешные ответы и некоторые ошибки устройства Ккм (см. документацию Чеконлайн)

Процесс отправки данных в Онлайн кассу

  1. На основании сущности Invoice или Creditmemo формируется объект Mygento\Kkm\Api\Data\RequestInterface.
    1.1. При асинхронной передаче - объект помещается в очередь (см. Magento Queue Framework)
    1.2. При синхронной передаче - передается классу Vendor для отправки

  2. Регистрируется попытка отправки данных. Создается сущность Api\Data\TransactionInterface\TransactionAttemptInterface со статусом NEW (1)

  3. Осуществляется передача данных в виде JSON.

    3.1. В случае УСПЕШНОЙ передачи (один из HTTP статусов [200, 400, 401])

    • создается транзакция - сущность Magento\Sales\Api\Data\TransactionInterface в который записываются уникальный идентификатор запроса (UUID - Атол; RequestId - Чеконлайн) и все данные о передаче. В админке это грид Sales -> Transactions.

    • Сущность попытки отправки TransactionAttemptInterface получает статус Sent (2)

    • Создается комментарий к заказу

    • Транзакция получает в ККМ-статус (kkm_status):

      • Атол - wait

      • Чеконлайн - done

        3.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 то отправка так же помещается в очередь.
  4. Только Атол. Модуль автоматически запрашивает у АТОЛа статус по всем транзакциям с ККМ-статусом wait

    4.1 Попытки обновления статуса прекращаются, когда транзакция получает статус done

    4.2 Максимальное количество попыток настройкой модуля ККМ.

  5. В случае НЕУСПЕШНОЙ передачи выполняется несколько попыток отправки с увеличивающимися интервалами (например через 1 минуту, 5 минут, 15 минут, 30 минут, 1 час).

    5.1 Настройка интервалов доступна в настройках модуля ККМ.

    5.2 Максимальное количество попыток отправки тажке ограничего настройкой модуля ККМ.

    5.3 В случае, когда достигается максимальное количество попыток отправки, счетчик попыток обнуляется и отправка возобновляется через сутки.

Процесс повторной отправки данных (Resell)

Работает только для тех чеков, которые были отправлены и имеют статус Done.

  1. На основании Invoice создается чек возврата (refund) и отправляется в Онлайн кассу.
  2. Создается новая запись Payment Transaction, дочерняя от предыдущей отправки sell по этому инвойсу.
  3. Когда статус отправки из п.1 становится Done (Для Чеконлайн статус отправки сразу становится Done в случае успеха) - формируется и отправляется новый чек прихода (sell).
  4. Для нового чека прихода создается новая запись Payment Transaction, дочерняя от транзакции для чека возврата (п.2).
  5. Resell считается завершенным, если новый чек прихода (п.3) получает статус Done. Обновление статуса происходит так же как и во всех остальных случаях (Для Чеконлайн обновление статуса не происходит т.к. работа сервиса устроена по синхронному принципу)

Отчеты

Модуль отправляет отчеты об отправленных данных в Онлайн кассу на емейл (в конфиге). Неуспешные отправки отображаются в этом же письме с доп.деталями. Также этот отчет можно посмотреть в консоли.

  • Еженедельный (за прошлую неделю), Ежедневный (за текущий день), Ежедневный (за вчерашний день)
  • Верстка письма. Файл view/adminhtml/templates/email/kkm_report-mjml.mjml содержит верстку письма. Редактируется с помощью сервиса https://mjml.io/

Поддержка новых версий сервиса АТОЛ Онлайн

Модуль поддерживал версии сервиса v4. Если выйдет новая версия, необходимо сделать след.шаги:

  1. создать class RequestForVersionX наследник абстрактного класса Request
  2. релилизовать его JSON представление - метод jsonSerialize()
  3. добавить создание объекта реквеста в Mygento\Kkm\Model\Atol\RequestFactory
  4. добавить инфу о новой версии сервиса в сурс модель 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. По умолчанию каждую минуту
  • kkm_proceed_scheduled_attempt
    • выполняет повторные попытки отправки запросов по заданному расписанию (scheduled_at).
  • kkm_report
    • Отчет: job отправки отчета. Частота конфигурируется в админке на стр. настроек модуля. По умолчанию ежедневно в 00:07

Консольные команды

  • mygento:kkm:report - Отображает отчет. Аргументы: today, yesterday, week
  • mygento:kkm:refund - Отправляет возврат. Аргументы: IncrementId сущности
  • mygento:kkm:sell - Отправляет счет. Аргументы: IncrementId сущности
  • mygento:kkm:resell - Запускает процесс resell. Отправляет refund по текущему чеку. Аргументы: IncrementId сущности. При указании ключа -f увеличится external_id.
  • mygento:kkm:update-all - Только Атол. Запрашивает данные о статусе всех отправок со статусом wait для указанного стора. Аргументы: StoreID
  • mygento:kkm:update-one - Только Атол. Запрашивает данные о статусе указанной отправки. Аргументы: UUID

No changelog yet

The vendor hasn't published a changelog. Tagged releases appear in the Versions tab.

Versions
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.

Compatibility matrix (Magento × PHP)
Magento PHP 8.2 PHP 8.3 PHP 8.4 PHP 8.5
2.4.7 Pass Pass
2.4.8 Pass Fail di error
2.4.9 Fail di error Fail di error

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.

Static analysis results
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.

PHPStan results by Magento and PHP version
Magento PHP 8.2 PHP 8.3 PHP 8.4 PHP 8.5
2.4.7 183 183
2.4.8 183 194
2.4.9 193 193

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

Unit tests results by Magento and PHP version
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

Integration tests results by Magento and PHP version
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.

Security results
Tool Status Findings Summary
Composer audit Pass 0
Malware scan Pass 0
License
OSL-3.0

More from mygento

View vendor
Make it pay

Turn 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.