Files
public/premium_client/TECHNICAL.md

161 lines
8.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Премиум (витрина сервисов)
**name:** premium_client
**version:** 19.0.1.0.0
**author:** MK.Lab
**depends:** `base`, `web`
## Архитектура
Модуль состоит из двух моделей и минимального набора представлений. Не содержит внешних зависимостей, кроме стандартной библиотеки `requests`.
```
premium_client
├── premium.service — карточка сервиса (каталог)
├── premium.order.wizard — форма заявки (временная, удаляется после отправки)
└── res.config.settings — расширение: поля настроек API
```
---
## Модели
### `premium.service` — Карточка сервиса
**Файл:** `models/premium_service.py`
Хранит информацию об одном сервисе в витрине. Сортируется по полю `sequence`, затем по имени.
| Поле | Тип | Описание |
|---|---|---|
| `name` | Char (required, translate) | Название сервиса |
| `sequence` | Integer (default: 10) | Порядок отображения в канбане |
| `category` | Selection (required) | Категория: `services`, `bank`, `wms`, `marketplace`, `industry`, `other` |
| `short_description` | Text (translate) | Краткий текст на карточке канбана |
| `description` | Html (sanitize, translate) | Полное описание на странице сервиса |
| `author_url` | Char | Ссылка на автора или страницу сервиса |
| `image` | Image (max 1024×768) | Изображение сервиса |
#### Права доступа
Создание, изменение и удаление карточек доступно **только администраторам** (`base.group_system`). Обычные пользователи могут только просматривать. Проверка выполняется в переопределённых методах `create()`, `write()` и `unlink()` — при попытке нарушить правило срабатывает ошибка `AccessError`.
#### Методы
**`action_open_form()`** — открывает форму карточки сервиса. Вызывается по кнопке «Подробнее» в канбане.
**`action_open_order_wizard()`** — открывает визард заявки в диалоговом окне. В контекст передаётся `default_service_id`, чтобы визард знал какой сервис заказывается.
---
### `premium.order.wizard` — Форма заявки
**Файл:** `wizard/premium_order_wizard.py`
Временная модель (`TransientModel`) — запись существует только пока пользователь заполняет форму и удаляется после отправки. Предзаполняется данными текущей компании и пользователя.
| Поле | Тип | Описание |
|---|---|---|
| `service_id` | Many2one → `premium.service` (required) | Сервис, на который подаётся заявка |
| `company_name` | Char (required) | Название компании |
| `inn` | Char | ИНН (10 или 12 цифр) |
| `email` | Char (required) | Email для связи |
| `phone_telegram` | Char | Телефон или Telegram |
| `contact_person` | Char | Имя контактного лица |
#### Предзаполнение (`default_get`)
При открытии визарда поля заполняются автоматически:
- `company_name``env.company.name`
- `inn``env.company.vat`
- `email``env.company.email` или `env.user.email`
- `phone_telegram``env.company.phone` или `env.company.mobile`
- `contact_person``env.user.name`
#### Валидация
Проверки выполняются как при изменении поля (`@api.onchange` — показывает предупреждение), так и при сохранении (`@api.constrains` — блокирует отправку):
| Поле | Правило |
|---|---|
| `email` | Соответствие шаблону `*@*.*` |
| `inn` | Только цифры, длина 10 или 12 символов |
#### Метод `action_submit()` — отправка заявки
Выполняет POST-запрос во внешний API. Последовательность шагов:
1. Проверяет заполненность обязательных полей
2. Читает URL и токен из системных параметров (`premium.project_api_url`, `premium.project_api_token`)
3. Если URL не оканчивается на `/newlead/` — добавляет этот суффикс автоматически
4. Формирует заголовки: `Content-Type: application/json` и `X-API-Key: {токен}` (если токен задан)
5. Отправляет запрос с повторными попытками — **3 попытки** с паузой 3 секунды между ними
6. Считает успехом ответ со статусом 200 или 201 и полем `"ok": true` в теле
7. При неудаче всех трёх попыток показывает сообщение с просьбой написать на `info@inf-centre.ru`
**Состав отправляемых данных (`_build_payload`):**
| Поле | Источник |
|---|---|
| `service_id`, `service_name` | Карточка сервиса |
| `service_category`, `service_author_url` | Карточка сервиса |
| `service_description` | HTML-описание сервиса |
| `company_name`, `inn`, `email` | Форма заявки |
| `phone`, `contact_name` | Форма заявки |
| `source_db` | Техническое имя базы данных Odoo |
---
### `res.config.settings` — Расширение настроек
**Файл:** `models/res_config_settings.py`
Добавляет два поля в стандартную форму Настроек Odoo. Значения хранятся как системные параметры (`ir.config_parameter`).
| Поле | Параметр | Описание |
|---|---|---|
| `premium_project_api_url` | `premium.project_api_url` | URL внешнего API для приёма заявок |
| `premium_project_api_token` | `premium.project_api_token` | Токен авторизации (передаётся в заголовке `X-API-Key`) |
При установке модуля оба параметра создаются с заглушечными значениями (`noupdate="1"`) — их нужно заменить реальными в Настройках.
---
## Представления и меню
### Структура меню
```
Премиум (sequence=20)
└── Сервисы → action_premium_services
Режимы: kanban (по умолчанию), list, form
Группировка по умолчанию: category
```
### Канбан-карточка
Каждая карточка показывает: название (по центру), изображение (слева), краткое описание (справа), кнопку «Подробнее». При клике на карточку открывается форма.
### Форма сервиса
Содержит: название, изображение, категорию, ссылку на автора, HTML-описание на вкладке, кнопку **«Заказать»**.
### Форма заявки (визард)
Диалоговое окно с полями компании. Кнопки: **«Отправить»** (primary) и **«Отмена»**.
---
## Предустановленные данные
**Файл:** `data/premium_service_data.xml` (`noupdate="1"`)
При установке создаются 6 карточек-примеров по одной на каждую категорию: Интеграция 1С, Эквайринг в Odoo, WMS модуль, Интеграции с маркетплейсами, Отраслевые решения, Прочие доработки. Карточки не перезаписываются при обновлении модуля.
---
## Безопасность
**Файл:** `security/ir.model.access.csv`
Все авторизованные пользователи (`base.group_user`) имеют право на чтение карточек сервисов и работу с визардом. Создание, редактирование и удаление карточек ограничено только для группы `base.group_system`.