Разработчикам

Полная инструкция по разработке модулей для latteCRM

Эта страница описывает реальный контракт платформы: как устроен модульный слой, как регистрировать web и mobile части модуля, как писать миграции, как запускать mobile-ready модуль и как не ломать ядро CRM при расширении продукта.

Ключевые файлы платформы

includes/module_helpers.php
api/mobile/company_modules.php
api/mobile/module_launch.php
mobile_module_host.php
docs/module-sdk.md
docs/module-development-guide.md

Как мыслить модулем правильно

Модуль в latteCRM это отдельный доменный блок, который подключается к ядру, а не копирует его.

Ядро уже предоставляет компании, пользователей, роли, авторизацию, клиентов, сделки, задачи, счета, биллинг, каталог модулей и mobile host.

Задача модуля это добавить свой домен: производство, склад, сервис, проекты, отраслевую специфику и собственные таблицы.

Если функциональность нужна почти всем компаниям и является системной платформенной возможностью, её лучше развивать в ядре, а не в отдельном модуле.

1. Минимальная структура модуля

Минимум
modules/<module_code>/
  module.json
  index.php
Рекомендуемая структура
modules/<module_code>/
  module.json
  index.php
  settings.php
  includes/
    helpers.php
    permissions.php
    services.php
  migrations/
    001_create_tables.sql
    002_seed_defaults.sql
  assets/
    module.css
    module.js
  mobile/
    index.php
    api/
      dashboard.php
      save.php
    assets/
      app.js
      styles.css

2. Обязательный `module.json`

{
  "code": "warehouse_plus",
  "name": "Склад+",
  "description": "Учет остатков, резервов и движений.",
  "version": "1.2.0",
  "author": "Partner Studio",
  "billing": "paid",
  "price_monthly": 990,
  "icon_class": "fas fa-warehouse",
  "sort_order": 1200,
  "is_active": true,
  "can_be_enabled": true,
  "entry_path": "modules/warehouse_plus/index.php",
  "settings_path": "modules/warehouse_plus/settings.php",
  "menu": {
    "title": "Склад+",
    "path": "modules/warehouse_plus/index.php"
  },
  "mobile": {
    "supported": true,
    "entry_path": "modules/warehouse_plus/mobile/index.php",
    "title": "Склад+",
    "icon": "Warehouse",
    "display_mode": "embedded",
    "min_app_version": "1.0.25"
  }
}
Поле Назначение
code Уникальный код модуля. Только `a-z`, `0-9`, `_`, `-`.
name Название модуля в каталоге и интерфейсе.
description Описание модуля для superadmin и компании.
version Собственная версия модуля.
billing `free` или `paid`.
price_monthly Базовая стоимость модуля в месяц.
entry_path Главная web-страница модуля.
settings_path Опциональная страница настроек.
menu.title / menu.path Подпись и путь для web-меню.
mobile.* Блок mobile-ready поддержки: entry, title, icon, min_app_version.

3. Доступ в web-части модуля

<?php
require_once dirname(__DIR__, 2) . '/includes/db.php';
require_once dirname(__DIR__, 2) . '/includes/auth.php';
require_once dirname(__DIR__, 2) . '/includes/module_helpers.php';

requireLogin();
requireCompanyModuleAccess($pdo, (int)getCurrentCompanyId(), 'warehouse_plus');

Каждая web-страница модуля должна проверять, что пользователь авторизован и что модуль включён именно у текущей компании.

4. Доступ в mobile entry

<?php
require_once dirname(__DIR__, 3) . '/includes/db.php';
require_once dirname(__DIR__, 3) . '/includes/module_helpers.php';

$context = requireMobileModuleLaunchAccess($pdo, 'warehouse_plus');
$companyId = (int)($context['company_id'] ?? 0);

Mobile-ready модуль не должен жить автономно. Он запускается только через `launch_token`, который выдаётся платформой после проверки компании, роли, версии приложения и состояния модуля.

5. Mobile launch flow шаг за шагом

1. Модуль объявляет mobile-блок в `module.json`.
2. `includes/module_helpers.php` считывает манифест и синхронизирует его в `lattecrm.crm_modules`.
3. Mobile-приложение получает каталог через `api/mobile/company_modules.php`.
4. При запуске модуль получает `launch_token` через `api/mobile/module_launch.php`.
5. Приложение открывает `mobile_module_host.php?launch_token=...`.
6. Host валидирует токен, подставляет company context и подключает `mobile.entry_path` модуля.

6. Правила разработки

Не копируйте ядро CRM в модуль. Используйте существующие сущности и helper-слои платформы.
Не создавайте свои сущности клиентов, пользователей и компаний, если задача решается через ядро.
Все web-страницы модуля обязаны проверять авторизацию и право доступа к модулю.
Все mobile entry и mobile API обязаны работать только через launch token и company context.
Миграции модуля должны быть идемпотентными и раскладываться по отдельным `.sql` файлам.
Пути в `module.json` должны быть относительными и без `..`.

7. Чеклист публикации модуля

1
Создать каталог `modules/<module_code>/`.
2
Подготовить `module.json` и web entry.
3
Добавить миграции в `migrations/`.
4
При необходимости подготовить `mobile/index.php` и mobile API.
5
Синхронизировать реестр модулей в `SuperAdmin -> Модули`.
6
Выполнить миграции.
7
Включить модуль для компании в настройках CRM.
8
Проверить web flow, mobile flow и права доступа.

8. Миграции, версии и совместимость

SQL-модули складываются в `migrations/*.sql`. Платформа выполняет их через реестр `lattecrm.crm_module_migrations`, поэтому миграции должны быть небольшими, предсказуемыми и идемпотентными.

Если модуль имеет mobile-ready часть, обязательно указывайте `mobile.min_app_version`, когда mobile API зависит от новых функций приложения.

Версию модуля обновляйте в `module.json`, а при breaking changes проверяйте, что web- и mobile-части умеют корректно работать с текущей версией ядра.

Если модуль поставляется как платный, его цена и доступность дополнительно контролируются через superadmin-каталог модулей.

9. Частые вопросы

Можно ли встроить произвольный React-код прямо в APK? +

Нет. Mobile-ready модуль открывается через `mobile_module_host.php` и живёт как отдельный entry внутри безопасного host-контейнера.

Нужно ли менять ядро для каждого модуля? +

Нет. Нормальный путь это отдельный модуль поверх контрактов ядра. Ядро меняется только под реально платформенные функции.

Как понять, что делать модулем, а не частью CRM? +

Если функция нужна не всем компаниям, относится к отдельному домену и может быть отдельной платной опцией, это хороший кандидат в модуль.

Следующий шаг
Нужен модуль под ваш домен или партнёрская интеграция?
Политика конфиденциальности Условия использования Политика cookie Реквизиты компании