161 lines
8.9 KiB
Markdown
161 lines
8.9 KiB
Markdown
# Премиум (витрина сервисов)
|
||
**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`.
|