Авто-генерация заявок
Система умеет автоматически создавать заявки в двух случаях:
- При создании объекта — сразу две заявки: «Первичное обследование» и первая «Плановая ТО» за текущий период.
- В начале каждого календарного периода — повторная «Плановая ТО» для всех объектов, у которых период подходит (раз в сутки, 00:30 МСК).
Как настроить (один раз на env)
1. Тип расписания у периодов
Открой Справочники → Периоды. У каждого периода в форме редактирования есть поле «Тип расписания (для авто-генерации заявок)»:
| Значение | Когда tick создаёт заявку |
|---|---|
monthly |
1-е число каждого месяца |
quarterly |
1 января / 1 апреля / 1 июля / 1 октября |
semiannual |
1 января, 1 июля |
yearly |
1 января |
custom |
никогда — авто-tick этот объект пропустит |
| (пусто) | то же что custom |
Если у объекта период с пустым code или custom, плановые авто-заявки для него создаваться не будут, но первичка при создании объекта всё равно появится.
2. Вид заявки по умолчанию
Открой Справочники → Виды заявок. В форме редактирования есть секция «Авто-генерация» с двумя чекбоксами:
- «По умолчанию для планового ТО» — будет использоваться для cron-tick'а раз в сутки.
- «По умолчанию для первичного обследования» — будет использоваться при создании объекта.
⚠️ На каждый из этих флагов может быть выставлена не более одной записи в справочнике. Если ставишь флаг новому типу, форма предупредит — флаг автоматически снимется со старого владельца.
После миграции из коробки уже отмечены:
- системный тип
code='primary'→ первичное обследование; - системный тип
code='planned'→ плановое ТО.
Можно перевесить на свои типы, если нужны кастомные.
3. Шаблон документа у этих типов
Чтобы «📥 Скачать акт» работало, у primary и planned должен быть загружен .docx/.dotx. См. Загрузка и редактирование шаблонов. Если шаблон не загружен — авто-заявка всё равно создаётся, но скачать акт по ней не получится.
Что происходит автоматически
При создании объекта
После успешного создания объекта:
- Создаётся заявка с типом, у которого
is_default_primary=true, в БД хранится безperiod_start_date. - Если у периода есть
code(неcustom/null), создаётся вторая заявка с типомis_default_planned. Еёperiod_start_date— это начало текущего календарного периода (например, дляmonthly— 1-е число текущего месяца).
Если в справочнике нет ни одного is_default_primary/is_default_planned-типа, соответствующая заявка просто не создаётся — в логах бэка остаётся warning. Объект всё равно создаётся.
Каждый день в 00:30 МСК
APScheduler внутри бэка дёргает tick_planned_orders. Логика по объекту:
- Считает
period_start_dateдля сегодняшней даты поperiod.code. - Смотрит, есть ли уже заявка с
(object_id, default_planned_spec_order_id, period_start_date). - Если нет — создаёт.
Идемпотентно: повторный tick в тот же день / месяц ничего нового не создаёт.
Ручной запуск tick'а (для проверки)
Шестерёнка в правом верху → «🗓 Запустить авто-tick заявок». Видна только superadmin'у.
После клика — выскочит уведомление:
- ✅ summary: «всего объектов=X, создано=Y, уже есть=Z, пропущено (нет period.code)=N…».
- ⚠️ если были ошибки на отдельных объектах — они отдельными warning-уведомлениями.
Удобно, чтобы прямо сейчас проверить настройку — не ждать 00:30.
Бэкфилл существующих объектов
После того как фича впервые включена на env, для уже созданных объектов первички и текущей плановой нет. Их можно догнать командой:
# 192.168.1.8 (под autoreport-юзером):
sudo -u autoreport bash -lc 'set -a && source /etc/autoreport/prod.env && set +a && cd /opt/autoreport/prod/backend && poetry run python scripts/backfill_planned_orders.py'
# VDS (через docker):
ssh -p 48461 deploy@188.120.227.138 \
'cd /opt/auto-report/Auto_Report && docker compose exec backend python scripts/backfill_planned_orders.py'
Что делает:
- Для каждого объекта без первички — создаёт.
- Вызывает
tick_planned_ordersдля текущего периода — добивает плановые.
Идемпотентно. Можно запускать повторно — продублировать не сможет.
Формат номера авто-заявки
<object.number_in_contract>/<MM>/<YYYY>/<customer.short_name>/<contract.short_subject>/<spec_order.short_name>/<seq>
| Часть | Что |
|---|---|
object.number_in_contract |
Номер объекта внутри договора |
MM / YYYY |
Месяц/год даты создания заявки (для tick'а — месяц period_start_date) |
customer.short_name |
Краткое имя заказчика; / → -, пусто → — |
contract.short_subject |
Краткий предмет договора; те же правила санации |
spec_order.short_name |
Краткое название типа заявки; fallback на name, потом на code |
seq |
Порядковый номер в рамках пары (объект × тип заявки) |
Пример: 1/06/2026/ООО «Ромашка»/ТО АПС/Плановое ТО/3.
seq per-type — то есть «плановая/1, плановая/2…» считается отдельно от «первичная/1». Это специально, чтобы нумерация в каждом виде была своя и непрерывная.
От чьего имени создаются заявки
От protected-юзера system (создан миграцией e7c2a5d1f3b8). Он не активен (is_active=false), пароль неизвестен — войти под ним нельзя. Удалить из UI тоже — is_protected=true.
В списках заявок такие записи отображаются как созданные system. Можно фильтровать по нему через фильтр «Создатель», если такой используется.
Что делать, если что-то идёт не так
| Симптом | Где смотреть |
|---|---|
| При создании объекта не появились заявки | Логи бэка: Авто-генерация заявок для объекта id=X упала. Скорее всего нет default-spec_order или сидинг не отработал. |
| Tick ничего не создал, ошибок нет | Проверь period.code у объектов — custom/null их пропускает. |
| Tick жалуется «нет is_default_planned» | В справочнике «Виды заявок» отметь чекбокс на нужном типе. |
| Дублей нет, но и новых нет | Проверь, что текущий period_start_date отличается от последнего сохранённого. Возможно tick в этом периоде уже отрабатывал. |
Связано
- Загрузка и редактирование шаблонов — чтобы «Скачать акт» работало.
- Метки в шаблонах документов — словарь Jinja-меток.
- Заявки — общая семантика поля номера / типа / статуса.