Эта страница описывает реальный контракт платформы: как устроен модульный слой, как регистрировать web и mobile части модуля, как писать миграции, как запускать mobile-ready модуль и как не ломать ядро CRM при расширении продукта.
Модуль в latteCRM это отдельный доменный блок, который подключается к ядру, а не копирует его.
Ядро уже предоставляет компании, пользователей, роли, авторизацию, клиентов, сделки, задачи, счета, биллинг, каталог модулей и mobile host.
Задача модуля это добавить свой домен: производство, склад, сервис, проекты, отраслевую специфику и собственные таблицы.
Если функциональность нужна почти всем компаниям и является системной платформенной возможностью, её лучше развивать в ядре, а не в отдельном модуле.
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
{
"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. |
<?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-страница модуля должна проверять, что пользователь авторизован и что модуль включён именно у текущей компании.
<?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`, который выдаётся платформой после проверки компании, роли, версии приложения и состояния модуля.
SQL-модули складываются в `migrations/*.sql`. Платформа выполняет их через реестр `lattecrm.crm_module_migrations`, поэтому миграции должны быть небольшими, предсказуемыми и идемпотентными.
Если модуль имеет mobile-ready часть, обязательно указывайте `mobile.min_app_version`, когда mobile API зависит от новых функций приложения.
Версию модуля обновляйте в `module.json`, а при breaking changes проверяйте, что web- и mobile-части умеют корректно работать с текущей версией ядра.
Если модуль поставляется как платный, его цена и доступность дополнительно контролируются через superadmin-каталог модулей.
Нет. Mobile-ready модуль открывается через `mobile_module_host.php` и живёт как отдельный entry внутри безопасного host-контейнера.
Нет. Нормальный путь это отдельный модуль поверх контрактов ядра. Ядро меняется только под реально платформенные функции.
Если функция нужна не всем компаниям, относится к отдельному домену и может быть отдельной платной опцией, это хороший кандидат в модуль.