МСП и агенты

МСП в Gigma ERP — это режим, где в одной платформе живёт много разных бизнесов.

Главное правило простое:

Один проект = один бизнес = один хозяин = свои данные.

Backend должен проверять это правило при каждом чтении и при каждой записи. Если пользователь или агент из проекта A, он не должен видеть, менять или удалять данные проекта B.

Что такое проект

Проект — это граница бизнеса внутри ERP.

К проекту относятся:

  • пользователи;
  • роли и права;
  • отделы и филиалы;
  • заказы;
  • звонки;
  • контрагенты;
  • контакты и банковские реквизиты;
  • меню;
  • интеграции.

Если проще: проект — это “комната бизнеса”. У каждого бизнеса своя комната. Агент получает ключ только от одной комнаты.

Как работает стена между бизнесами

Когда приходит запрос, backend делает три шага:

  1. Смотрит на токен и понимает, кто делает запрос.
  2. Находит проект этого пользователя.
  3. Проверяет, что объект запроса тоже из этого проекта.

Если проекты разные, запрос закрывается.

Обычно API вернёт:

  • 403 — доступ запрещён;
  • 404 — объект не найден для этого пользователя;
  • 422 — запрос понятен, но бизнес-правило нарушено.

Почему нельзя доверять id

id — это только номер записи в базе. Его можно угадать или случайно получить из чужого сценария.

Поэтому агент не должен думать так:

У меня есть order_id = 15, значит я могу открыть заказ 15.

Правильная логика:

У меня есть order_id = 15.
Backend должен проверить, что заказ 15 принадлежит моему проекту.
Если не принадлежит — я останавливаюсь.

Как агент получает доступ

Агент входит как обычный пользователь ERP.

Рекомендуемая схема:

  1. Создать отдельного пользователя для агента внутри проекта.
  2. Дать ему отдельную роль, например agent, manager или operator.
  3. Выдать только нужные права.
  4. Получить пароль через POST /api/send_password.
  5. Войти через POST /api/login и получить токен.
  6. Отправлять этот токен в каждом запросе.

Токен — это временный ключ доступа. Его нужно хранить как пароль.

Отправка пароля агенту

Метод
POST
URL
https://api.gigma.ru/api/send_password
Авторизация
Не требуется
Headers
Accept: application/json; Content-Type: application/json

Параметры запроса

  • login (string, обязательно) — e-mail существующего пользователя агента

Пример запроса

{
    "login": "agent@example.com"
}

Ответ

При успешном действии API отправляет пароль на e-mail пользователя.

{
    "message": "Password successfully send"
}
Важно

Пароль действует ограниченное время. Если агент попробует войти без свежего пароля, API вернёт ошибку Send password before login. Password TTL is 5 minutes.

Вход агента в ERP

Метод
POST
URL
https://api.gigma.ru/api/login
Авторизация
Не требуется
Headers
Accept: application/json; Content-Type: application/json

Параметры запроса

  • login (string, обязательно) — e-mail пользователя агента
  • password (string, обязательно) — пароль из письма после POST /api/send_password
  • device (string, необязательно) — имя устройства или интеграции, например sales-agent

Пример запроса

{
    "login": "agent@example.com",
    "password": "123456",
    "device": "sales-agent"
}

Ответ

В ответе приходит пользователь и токен доступа.

{
    "user": {
        "access_token": {
            "value": "28|example-token"
        },
        "id": 25,
        "login": "agent@example.com",
        "role": {
            "name": "agent"
        },
        "permissions": []
    }
}
Как использовать токен

Во всех следующих запросах агент передаёт токен в заголовке:

Authorization: Bearer 28|example-token

Проверка текущего пользователя агента

Метод
GET
URL
https://api.gigma.ru/api/user
Авторизация
Bearer-токен пользователя ERP
Headers
Accept: application/json; Authorization: Bearer <token>

Зачем нужен запрос

Этот запрос помогает агенту понять, под кем он сейчас работает: какой пользователь, какая роль, какие права.

Пример ответа

{
    "user": {
        "id": 25,
        "login": "agent@example.com",
        "role": {
            "name": "agent"
        },
        "permissions": [
            {
                "name": "view-orders"
            }
        ]
    }
}

Как научить агента работать с МСП

Агенту нужна не “супер-админка”, а инструкция поведения.

Минимальная инструкция:

Ты работаешь только внутри проекта своего токена.
Не выбирай project_id сам.
Не пытайся открыть чужой id.
Если API вернул 403 или 404 — это не твоя зона.
Перед записью проверяй, что объект получен из текущего проекта.
Для опасных действий проси подтверждение человека.

Что агент может делать

Если у агента есть токен пользователя проекта и нужные права, он может:

  • смотреть свои заказы;
  • создавать или обновлять свои рабочие данные;
  • работать со звонками своего проекта;
  • читать своих контрагентов;
  • добавлять контакты и реквизиты только своим контрагентам;
  • работать с меню и интеграциями своего проекта;
  • выполнять внутренние операции, которые разрешены его ролью.

Что агент не должен делать

Агент не должен:

  • использовать общий системный токен для всех бизнесов;
  • сам подставлять чужой project_id;
  • открывать заказ, звонок, контакт или реквизиты по случайному id;
  • получать роль owner, если ему достаточно роли оператора;
  • видеть токены, платежные данные или чувствительные поля без отдельного права;
  • повторять опасное действие автоматически после неизвестной ошибки.

Хорошая роль для агента

Для production лучше заводить отдельную роль agent.

Пример набора прав:

  • view-orders — читать заказы;
  • edit-orders — менять заказы, если агенту это реально нужно;
  • view-counterparties — читать контрагентов;
  • edit-counterparties — менять контрагентов, контакты и реквизиты, если это входит в сценарий;
  • view-communications — читать коммуникации;
  • edit-communications — менять коммуникации;
  • view-tasks — читать задачи;
  • edit-tasks — менять задачи.

Обычно агенту не надо давать:

  • edit-users — управление пользователями;
  • edit-roles — управление ролями;
  • edit-permissions — управление правами;
  • edit-admins — управление администраторами;
  • edit-applications — изменение приложений и витрин без отдельного сценария.

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

Безопасный сценарий работы

Пример правильного сценария:

  1. Агент получает пароль через /api/send_password.
  2. Агент входит через /api/login.
  3. Получает токен.
  4. Проверяет себя через /api/user.
  5. Берёт список доступных заказов через обычный ERP API.
  6. Работает только с теми id, которые получил из своего списка.
  7. Если API вернул 403, 404 или 422, не обходит ошибку, а сообщает человеку.

Полная схема ручек для агента

Агент использует обычные ERP-ручки. Отличие агента от фронта не в URL, а в роли, правах и инструкции поведения.

Эта схема описывает ERP-агента под auth:user. Публичные E-Commerce ручки клиента под auth:counterparty сюда не входят.

Базовый URL:

https://api.gigma.ru/api

Все рабочие ручки ниже, кроме входа, требуют заголовок:

Authorization: Bearer <token>

Как читать таблицы ниже

resource означает стандартный набор:

ДействиеМетод и путь
списокGET /api/<resource>
созданиеPOST /api/<resource>
одна записьGET /api/<resource>/{id}
изменениеPUT/PATCH /api/<resource>/{id}
удалениеDELETE /api/<resource>/{id}

Если у ручки нет удаления, это указано отдельно. Если агенту нужна только безопасная выдача данных, ниже пишем явные GET, а не resource.

Уровни доступа агента

УровеньЗначение
Можнонормальная рабочая ручка для агента при наличии нужного права
Осторожноможно давать только под конкретный сценарий
Обычно нельзяэто админская, системная или опасная зона
Не агентскаявход для внешней системы, а не для агента с Bearer-токеном

Вход и сессия

УровеньРучкаЗачемПраво
МожноPOST /api/send_passwordотправить пароль агенту на e-mailне требуется
МожноPOST /api/loginполучить Bearer-токенне требуется
МожноGET /api/userпроверить текущего пользователя, роль и правалюбой auth:user
МожноPOST /api/user/logoutудалить активные токены пользователялюбой auth:user

Заказы

УровеньРучкаЗачемПраво
Можноresource /api/orders без DELETEсписок, просмотр, создание и изменение заказовview-orders для чтения, edit-orders для записи
МожноGET /api/tables/ordersтабличный список заказов для ERP-интерфейсаview-orders или edit-orders
ОсторожноPOST /api/orders/{order}/request-refundзапрос на возвратedit-orders, плюс сценарий подтверждения человеком
ОсторожноPOST /api/orders/{order}/filesприкрепить файл к заказуedit-orders
МожноGET /api/orders/{order}/historyистория заказадоступ к своему заказу
Осторожноresource /api/orders/{order}/nomenclaturesпозиции/номенклатура заказасвой заказ, обычно edit-orders
МожноPOST /api/orders/calculatorрасчёт ценылюбой авторизованный пользователь с доступом к своим данным

МСП-стена: заказ должен принадлежать проекту агента. Чужой order_id не должен открываться.

Звонки и коммуникации

УровеньРучкаЗачемПраво
МожноGET /api/callsсписок звонков своего проектаview-communications или edit-communications
МожноGET /api/calls/{call}один звонокview-communications или edit-communications
МожноPUT/PATCH /api/calls/{call}изменить звонокedit-communications
МожноGET /api/tables/callsтабличный список звонковview-communications или edit-communications
Не агентскаяPOST /api/callsвходящий webhook телефониисекрет webhook-а, не Bearer-токен агента

МСП-стена: звонок, заказ и контрагент внутри звонка должны быть из проекта агента.

Контрагенты, контакты и реквизиты

УровеньРучкаЗачемПраво
Можноresource /api/counterpartiesклиенты и контрагенты проектаview-counterparties для чтения, edit-counterparties для записи
МожноGET /api/tables/counterpartiesтабличный список контрагентовview-counterparties или edit-counterparties
Можноresource /api/counterparties/{counterparty}/contactsконтакты конкретного контрагентачтение/запись через права контрагента
Можноresource /api/counterparties/{counterparty}/bank_requisitesбанковские реквизиты контрагентачтение/запись через права контрагента
МожноGET /api/counterparties/{counterparty}/historyистория контрагентадоступ к своему контрагенту
МожноGET /api/managersсписок менеджеров для фильтровавторизованный пользователь проекта

МСП-стена: вложенный контакт или реквизит должен принадлежать указанному контрагенту, а контрагент должен принадлежать проекту агента.

Задачи

УровеньРучкаЗачемПраво
МожноGET /api/tasksсписок задач своего проектаview-tasks или edit-tasks
МожноGET /api/tables/tasksтабличный список задачview-tasks или edit-tasks
ОсторожноGET /api/tasks/{task}одна задачаview-tasks или edit-tasks, плюс проверка проекта задачи
ОсторожноPOST /api/tasksсоздать задачу в своём проектеedit-tasks
ОсторожноPUT/PATCH /api/tasks/{task}изменить задачуedit-tasks, плюс проверка проекта задачи

МСП-стена: список фильтруется по проекту агента. Для просмотра и изменения конкретной задачи нельзя доверять одному task_id: сначала подтвердить, что задача из проекта агента.

Пользователи, роли, права, отделы и филиалы

УровеньРучкаЗачемПраво
Осторожноresource /api/usersпользователи проектаview-users для чтения, edit-users для записи
Осторожноresource /api/branchesфилиалы проектаedit-branches
Осторожноresource /api/departmentsотделы проектаedit-departments
Обычно нельзяresource /api/rolesроли проектаedit-roles
Обычно нельзяresource /api/permissionsправа доступаedit-permissions
Обычно нельзяPOST /api/users/{user}/attach_menuпривязать меню пользователюуправление пользователями/меню
Обычно нельзяPOST /api/attach_menu_to_projectпривязать меню проектупроектное администрирование
Обычно нельзяPOST /api/users/{user}/create_menu_from_user_itemsсоздать меню из пользовательских пунктовпроектное администрирование

Для обычного агента эти ручки не нужны. Их стоит давать только агенту-администратору и только в одном проекте.

Интеграции пользователя и филиала

УровеньРучкаЗачемПраво
ОсторожноGET /api/users/{user}/integrationsинтеграции пользователясвой проект, обычно админский сценарий
ОсторожноGET /api/users/{user}/integrations/{integration}одна интеграция пользователясвой проект
ОсторожноPUT/PATCH /api/users/{user}/integrations/{integration}изменить интеграцию пользователясвой проект
Осторожноresource /api/users/{user}/integrations/{integration}/parameters только index/store/show/destroyпараметры интеграции пользователясвой проект
Осторожноresource /api/branches/{branch}/bank_requisitesреквизиты филиалафилиал своего проекта
Осторожноresource /api/branches/{branch}/bank_requisites/{bank_requisite}/integrations только index/show/updateинтеграции реквизитов филиалафилиал своего проекта
Осторожноresource /api/branches/{branch}/bank_requisites/{bank_requisite}/integrations/{integration}/parameters только index/store/show/destroyпараметры интеграций реквизитов филиалафилиал своего проекта

МСП-стена: user, branch, bank_requisite и integration должны быть внутри проекта агента.

Меню

УровеньРучкаЗачемПраво
Осторожноresource /api/menusменю проектапроектное администрирование
МожноGET /api/menus/default/itemsдефолтные пункты менюавторизованный пользователь
Осторожноresource /api/menus/{menu}/items только index/store/show/update/destroyпункты конкретного менюменю своего проекта

МСП-стена: проектное меню не должно смешиваться с глобальными шаблонами и чужими пользовательскими пунктами.

Справочники и таблицы для чтения

Эти ручки обычно нужны агенту для выбора значений в формах и фильтрах. В этом разделе разрешено только чтение. POST, PUT/PATCH и DELETE по справочникам давать отдельно и только под задачу администратора.

УровеньРучкаЗачем
МожноGET /api/screens, GET /api/screens/{id}экраны/разделы
МожноGET /api/file_types, GET /api/file_types/{id}типы файлов
МожноGET /api/counterparty_types, GET /api/counterparty_types/{id}типы контрагентов
МожноGET /api/call_statuses, GET /api/call_statuses/{id}статусы звонков
МожноGET /api/communication_types, GET /api/communication_types/{id}типы коммуникаций
МожноGET /api/sales_channels, GET /api/sales_channels/{id}каналы продаж
МожноGET /api/order_statuses, GET /api/order_statuses/{id}статусы заказов
МожноGET /api/task_statuses, GET /api/task_statuses/{id}статусы задач
МожноGET /api/cities, GET /api/cities/{id}города
МожноGET /api/countries, GET /api/countries/{id}страны
МожноGET /api/brands, GET /api/brands/{id}бренды
МожноGET /api/integration_types, GET /api/integration_types/{id}типы интеграций
МожноGET /api/integrations, GET /api/integrations/{id}интеграции
МожноGET /api/storage_units, GET /api/storage_units/{id}единицы хранения
МожноGET /api/branches_listсписок филиалов
МожноGET /api/responsible_usersответственные пользователи
МожноGET /api/categories/creatorsсоздатели категорий

Если справочник начинает менять деньги, доступы или витрины, переводить его из “можно” в “осторожно”.

Номенклатура, склады и остатки

УровеньРучкаЗачемПраво
Осторожноresource /api/categoriesкатегории номенклатурыview-categories, create-categories, edit-categories
ОсторожноGET /api/tagsтеги номенклатурысправочник тегов, не считать проектной стеной без отдельной проверки
ОсторожноPOST /api/nomenclatures/exportэкспорт номенклатурыview-nomenclatures или edit-nomenclatures
ОсторожноPOST /api/nomenclatures/importимпорт номенклатурыопасная массовая операция
Осторожноresource /api/nomenclaturesтовары/услугиview-nomenclatures, create-nomenclatures, edit-nomenclatures
Осторожноresource /api/nomenclatures/{nomenclature}/compositions только index/store/update/destroyсостав карточкиноменклатура своего проекта
Осторожноresource /api/warehousesскладыview-warehouses, create-warehouses, edit-warehouses
Осторожноresource /api/inventoriesостаткипроектная фильтрация склада/номенклатуры; отдельной policy нет
ОсторожноPOST /api/inventories/uploadимпорт остатковопасная массовая операция
Осторожноresource /api/warehouses/{warehouse}/integrationsинтеграции складасклад своего проекта
Осторожноresource /api/warehouses/{warehouse}/integrations/{integration}/parametersпараметры интеграции складасклад своего проекта
Осторожноresource /api/warehouses/{warehouse}/nomenclaturesостатки номенклатуры на складесклад своего проекта
МожноGET /api/tables/nomenclaturesтабличная номенклатураview-nomenclatures или edit-nomenclatures
МожноGET /api/tables/warehousesтабличные складыview-warehouses или edit-warehouses
МожноGET /api/tables/inventoriesтабличные остаткипроектная фильтрация склада/номенклатуры
МожноGET /api/tables/reservationsтабличные резервыпроектная фильтрация склада/номенклатуры

Важно: часть inventory-permissions (view-nomenclatures, view-warehouses, view-shops и похожие) может не быть заведена базовым seeder-ом. Перед выдачей агенту проверить конкретную роль в БД. Для агента безопаснее начинать с чтения. Импорт и массовые изменения лучше делать только после подтверждения человека.

Магазины, приложения, страницы и витрина

УровеньРучкаЗачемПраво
Осторожноresource /api/shopsмагазины/точки продажview-shops, create-shops, edit-shops
ОсторожноapiResource /api/shops/{shop}/hoursчасы работы магазинаshop своего проекта, обычно edit-shops
ОсторожноGET/POST /api/shops/{shop}/holidaysпраздники магазинаshop своего проекта, обычно edit-shops
ОсторожноapiResource /api/shops/{shop}/exceptionsисключения графикаshop своего проекта, обычно edit-shops
Осторожноresource /api/applicationsприложения/витриныview-applications, create-applications, edit-applications
Осторожноresource /api/applications/{application}/categoriesкатегории витриныприложение своего проекта
ОсторожноPOST /api/applications/{application}/categories/{category}/up/downсортировка категорийприложение своего проекта
Осторожноresource /api/applications/{application}/brandsбренды витриныприложение своего проекта
ОсторожноPOST /api/applications/{application}/brands/{brand}/up/downсортировка брендовприложение своего проекта
ОсторожноPOST /api/applications/{application}/warehouses/{warehouse}/up/downсортировка складов витриныприложение и склад своего проекта
Осторожноresource /api/applications/{application}/blocksблоки витриныприложение своего проекта
Осторожноresource /api/applications/{application}/menu_itemsменю витриныприложение своего проекта
ОсторожноPOST /api/applications/{application}/menu_items/{menu_item}/up/downсортировка меню витриныприложение своего проекта
Осторожноresource /api/pagesстраницыпроектный доступ, влияет на витрину
МожноGET /api/tables/applicationsтабличные приложенияview-applications или edit-applications
МожноGET /api/tables/shopsтабличные магазиныview-shops или edit-shops
МожноGET /api/tables/pagesтабличные страницыпроектный доступ, только чтение

Важно: shop-permissions (view-shops, create-shops, edit-shops) тоже проверить в роли/БД перед выдачей агенту. Эта зона меняет то, что видит клиент в витрине. Для обычного агента лучше только чтение.

Webhooks приложений

УровеньРучкаЗачем
ОсторожноGET /api/applications/{application}/webhooksсписок webhook-ов приложения
ОсторожноPOST /api/applications/{application}/webhooksсоздать webhook
ОсторожноGET /api/applications/{application}/webhooks/{webhook}посмотреть webhook
ОсторожноPATCH /api/applications/{application}/webhooks/{webhook}изменить webhook
ОсторожноDELETE /api/applications/{application}/webhooks/{webhook}удалить webhook
ОсторожноGET /api/applications/{application}/webhooks/{webhook}/deliveriesдоставки webhook-а
ОсторожноPOST /api/applications/{application}/webhooks/{webhook}/deliveries/{delivery}/resendповторить доставку
Обычно нельзяPOST /api/applications/{application}/webhooks/{webhook}/rotate-secretсменить секрет webhook-а

Webhook-и могут отправлять данные наружу. В backend доступ к ним ограничен проектом приложения и ролью owner/admin. Агенту давать только при явной задаче интеграции.

Файлы, Dadata и вспомогательные запросы

УровеньРучкаЗачем
ОсторожноGET /api/filesсписок файлов
ОсторожноGET /api/files/{file}один файл
ОсторожноPOST /api/filesзагрузить файл
ОсторожноPOST /api/files/{file}обновить файл
ОсторожноDELETE /api/files/{file}удалить файл
МожноPOST /api/search_addressпоиск адреса
МожноPOST /api/search_companyпоиск компании
МожноPOST /api/search_bankпоиск банка
МожноPOST /api/search_nomenclatureпоиск номенклатуры

Файлы могут содержать персональные или финансовые данные, поэтому права на них стоит давать отдельно. В текущей policy список и загрузка требуют edit-users, а один файл можно смотреть, менять и удалять только его создателю.

История

УровеньРучкаЗачем
МожноGET /api/users/{user}/historyистория пользователя своего проекта
МожноGET /api/branches/{branch}/historyистория филиала своего проекта
МожноGET /api/counterparties/{counterparty}/historyистория контрагента своего проекта
МожноGET /api/applications/{application}/historyистория приложения своего проекта
МожноGET /api/categories/{category}/historyистория категории своего проекта
МожноGET /api/warehouses/{warehouse}/historyистория склада своего проекта
МожноGET /api/warehouses/{warehouse}/nomenclatures/{nomenclature}/historyистория остатка своего проекта
МожноGET /api/shops/{shop}/historyистория магазина своего проекта
МожноGET /api/nomenclatures/{nomenclature}/historyистория номенклатуры своего проекта
МожноGET /api/inventories/{inventory}/historyистория остатка своего проекта
ОсторожноGET /api/departments/historyистория отделов
ОсторожноGET /api/roles/historyистория ролей
ОсторожноGET /api/permissions/historyистория прав

История полезна агенту для объяснения “что изменилось”. Но если история содержит чужой проект, это баг МСП-стены.

Скидки, промо и билеты

УровеньРучкаЗачем
Осторожноresource /api/discounts без create/edit-страницскидки и промокоды
ОсторожноGET /api/discounts/statsстатистика скидок
ОсторожноPOST /api/discounts/{discount}/pauseпоставить скидку на паузу
ОсторожноPOST /api/discounts/{discount}/activateвключить скидку
ОсторожноPOST /api/discounts/{discount}/archiveархивировать скидку
ОсторожноGET /api/tables/discounts/{discount}/usagesприменения скидки
ОсторожноGET /api/admin/tickets/lookupнайти билет по токену
ОсторожноGET /api/admin/tickets/by-order/{order_id}найти билет по заказу
ОсторожноPOST /api/admin/tickets/redeemпогасить билет
ОсторожноPOST /api/admin/tickets/unredeemоткатить гашение

Эти ручки влияют на деньги, доступы или посещение события. Агенту лучше давать их только с подтверждением человека.

Служебные и неагентские зоны

УровеньРучкаПочему
Не агентскаяGET /api/infohealth/version без пользовательского контекста
Не агентскаяPOST /api/{token}/webhookTelegram webhook, не Bearer-токен агента
Не агентскаяPOST /api/callswebhook телефонии, защищается отдельным секретом
Обычно нельзяGET /api/debug/yookassa-trace/{paymentId}временная диагностика платежей
Обычно нельзяresource /api/settingsсистемные настройки
Обычно нельзяresource /api/promotionsпромо-логика без отдельного сценария
Обычно нельзяresource /api/eventslegacy-события/заказы, пока фронт не переведён

Минимальный набор ручек для первого агента

Для безопасного первого запуска лучше начать так:

ЗадачаРучкиПрава
ВойтиPOST /api/send_password, POST /api/login, GET /api/userне требуется для входа
Читать заказыGET /api/orders, GET /api/orders/{order}, GET /api/tables/ordersview-orders
Читать клиентовGET /api/counterparties, GET /api/counterparties/{counterparty}, GET /api/tables/counterpartiesview-counterparties
Читать звонкиGET /api/calls, GET /api/calls/{call}, GET /api/tables/callsview-communications
Читать задачиGET /api/tasks, GET /api/tasks/{task}, GET /api/tables/tasksview-tasks
Писать рабочие измененияPATCH/POST только в нужной группесоответствующий edit-*

Всё остальное лучше подключать по одному сценарию и после теста на двух проектах: агент проекта A не должен видеть проект B.

Короткое правило для разработчика

Перед любым новым API для МСП нужно ответить на один вопрос:

Где в этом запросе доказано, что данные принадлежат проекту текущего пользователя?

Если ответа нет, API небезопасен.

Короткое правило для агента

Мой токен — это мой проект. Всё, что не принадлежит моему проекту, для меня закрыто.

© 2026 Itecho ERP