Справка · Веб-версия · Для администраторов

Авто-генерация заявок

Система умеет автоматически создавать заявки в двух случаях:

  1. При создании объекта — сразу две заявки: «Первичное обследование» и первая «Плановая ТО» за текущий период.
  2. В начале каждого календарного периода — повторная «Плановая ТО» для всех объектов, у которых период подходит (раз в сутки, 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. См. Загрузка и редактирование шаблонов. Если шаблон не загружен — авто-заявка всё равно создаётся, но скачать акт по ней не получится.

Что происходит автоматически

При создании объекта

После успешного создания объекта:

  1. Создаётся заявка с типом, у которого is_default_primary=true, в БД хранится без period_start_date.
  2. Если у периода есть code (не custom/null), создаётся вторая заявка с типом is_default_planned. Её period_start_date — это начало текущего календарного периода (например, для monthly — 1-е число текущего месяца).

Если в справочнике нет ни одного is_default_primary/is_default_planned-типа, соответствующая заявка просто не создаётся — в логах бэка остаётся warning. Объект всё равно создаётся.

Каждый день в 00:30 МСК

APScheduler внутри бэка дёргает tick_planned_orders. Логика по объекту:

  1. Считает period_start_date для сегодняшней даты по period.code.
  2. Смотрит, есть ли уже заявка с (object_id, default_planned_spec_order_id, period_start_date).
  3. Если нет — создаёт.

Идемпотентно: повторный 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'

Что делает:

  1. Для каждого объекта без первички — создаёт.
  2. Вызывает 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 в этом периоде уже отрабатывал.

Связано