Перейти к содержанию

Рабочие процессы

Шаблоны

Информация о шаблоне

Шаблоны служат для определения последовательности шагов рабочего процесса. Из пользовательского интерфейса может быть инициировано создание рабочего процесса по шаблону с указанием даты начала (если не указано, будет использоваться текущая дата). От указанной даты на основании заданной последовательности и продолжительности отдельных шагов (элементов шаблона) выстраивается последовательность и вложенность задач, определяются плановые даты начала и окончания для каждой задачи.

Поле Имя Описание Обязательное
key Ключ Уникальный технический ключ для разработчика (не рекомендуется изменять после определения) Да
name Имя Краткое название для пользователей (можно изменять после определения) Да
description Краткое описание Краткое описание шаблона
summary Шаблон Шаблон, по которому будет создаваться "корневая задача"
created_by Создано пользователем Пользователь, создавший шаблон Авто
created_at Создан Дата и время создания шаблона Авто

Задачи шаблона

Элементы шаблона, по которым будут создаваться задачи при создании рабочего процесса. Задают последовательность, продолжительность и другую специфику задач рабочего процесса.

Для каждой задачи в шаблоне могут быть определены свои подзадачи (см поле "Редактировать: Подзадачи")

Поле Имя Описание Обязательное
prev Следует за Задача (элемент шаблона), за которой следует описываемая задача
is_blocked_by_prev Блокируется предыдущей задачей Да (по умолчанию): Задача не может стартовать пока не закрыта предыдущая задача
Нет: Задача может стартовать (по таймеру или в ручном режиме) не дожидаясь закрытия предыдущей
summary Описание Шаблон для описания задачи, может использовать конструкции вида "ключ иерархии в фигурных скобках" ({region.shortname}, {region.description}, {macroregion.shortname} и т.д.) Да
duration_days Длительность (дн) Длительность задачи в днях. Запланированная дата закрытия задачи и дата начала следующей задачи рассчитывается от даты начала прибавлением длительности. Если длительность не указана, дата окончания будет совпадать с датой начала.
owners_groups Владельцы (группы) Список групп, которые будут иметь полные права на задачу (смогут открывать, закрывать и перезапускать задачу, менять описание, дату начала, окончания, длительность, ответственных и т.д.). Владельцы получают уведомления согласно подписке. Если использованы группы, являющиеся шаблонами (название содержит ключи уровней иерархии в фигурных скобках), то вместо задачи будет создаваться несколько задач - по задаче для каждого элемента иерархии из выбранного уровня (подробнее см в разделе шаблоны групп).
assignees_groups Исполнители (группы) Список групп, которые будут назначены исполнителями (смогут закрывать задачу). Могут быть использованы группы, являющиеся шаблонами.
auto_resolve_
on_due_date
Закрывать автоматически по дате Да: при наступлении даты окончания задача закроется автоматически
Нет (по умолчанию): при наступлении даты окончания задача получит пометку "Просрочено"
auto_resolve_
on_subtasks_resolution
Закрывать автоматически при закрытии подзадач Да (по умолчанию): при закрытии всех подзадач задача закроется автоматически
Нет: после закрытия всех подзадач потребуется вручную закрыть задачу.

Обратите внимание: "Владельцами" и "исполнителями" будут назначаться именно группы, а не пользователи, принадлежащие к этим группам

Подписки

В контексте задач "подпиской" называется механизм для рассылки уведомлений на то или иное действие над задачей.

Поле Имя Описание Обязательное
action Действие Действие над задачей, к которому будет привязана рассылка
notify_assignees Уведомить исполнителей Уведомлять всех пользователей, относящихся к группам, которые указаны в Исполнители (группы)
notify_owners Уведомить владельцев Уведомить всех пользователь, относящихся к группам, которые указаны в Влалельцы группы
subject_template Шаблон темы письма Django-шаблон темы письма. Допускается использование контекста вида {{obj.id}}, {{obj.summary}}, {{obj.get_status.label}}, где obj - задача
html_message_template Шаблон тела письма Django-шаблон тела письма. Допускается использование контекста вида {{obj.id}}, {{obj.summary}}, {{obj.get_status.label}}, где obj - задача

Сценарии

Сценарий, который будет автоматически запускаться на то или иное действие над задачей.

Поле Имя Описание Обязательное
action Действие Действие над задачей, к которому будет привязан запуск скрипта Да
script Сценарий Сценарий, который будет выполняться при совершении действия Да
variant Вариант Вариант, с которым будет выполняться сценарий
order Поррядок Порядок, в котором будут выполняться сценарии (если важен)

Шаблоны (элементы)

Элементы шаблона - отдельные шаги бизнес-процесса.

Этот раздел панели администратора носит технический характер, работу с шаблонами рекомендуется осуществлять через раздел Шаблоны

Создание рабочего процесс по шаблону

Может быть инициировано из пользовательского интерфейса с указанием названия (если не указано, будет использоваться название из шаблона) и даты (если не указано, будет использоваться "сегодняшняя дата") Для каждого элемента шаблона будут созданы соответствующие задачи (для элемента шаблона, где владельцы или исполнители - шаблоны групп, будет создано несколько задач). "Дата начала" и "дата окончания" для каждой задачи будет определяться автоматически по дате окончания предыдущей задачи и продолжительности текущей задачи, указанной в элементе шаблона.

Важно: Длительность и даты задач считаются в рабочих днях согласно календарю рабочих дней, если он настроен. Если календарь не указан — используются обычные календарные дни.

⚠️ КРИТИЧЕСКАЯ ОШИБКА: Если в системных настройках указан ключ меры для календаря рабочих дней, но сама мера отсутствует, то при создании рабочего процесса возникнет ошибка FAILURE в TaskResult. Перед созданием рабочих процессов необходимо либо: - Удалить системную переменную календаря рабочих дней (если календарь не нужен) - Запустить сценарий fill_working_days для создания и заполнения календаря рабочих дней

Движение по рабочему процессу

Задачи рабочего процесса могут активироваться автоматически при наступлении "даты начала" или вручную владельцем задачи (если не заблокированы предыдущей задачей).

Задачи рабочего процесса могут закрываться автоматически при наступлении "даты окончания" или вручную владельцем задачи.

При закрытии задачи следующая задача не активируется автоматически, а лишь "разблокируется" для активации, если она была заблокирована.

"Даты начала" и "окончания задачи" могут быть изменены владельцем задачи.

Ручная активация, закрытие и переоткрытие задачи никак не влияют на дату начала и дату окончания задачи (это "плановые даты"), эти даты фиксируются в отдельных полях.

Задачи

Задача может быть создана по шаблону рабочего процесса или вручную пользователем.

При создании по шаблону большая часть полей задачи наследуется от соответствующего элемента. Владелец может изменять эти поля.

Динамические поля, такие как "Дата начала" и "Дата окончания" определяются автоматически от контекста и запланированной продолжительности задачи.

Поле Имя Описание Обязательное
parent Родительская задача Родительская задача (если задача является подзадачей)
prev Предыдущая задача Предыдущая задача
is_blocked_by_prev Блокируется предыдущей задачей Да (по умолчанию): Задача не может стартовать пока не закрыта предыдущая задача
Нет: Задача может стартовать (по таймеру или в ручном режиме) не дожидаясь закрытия предыдущей
summary Описание Краткое описание (макс длина 200 символов) Да
description Краткое описание Развёрнутое описание (комментарий к описанию без ограничений на длину)
start_date Дата начала Запланированная дата активации задачи (не меняется при досрочной активации, может быть изменена владельцем)
duration Длительность (дн) Запланированная продолжительность задачи (при создании по шаблону используется длительность из шаблона, при изменении "Даты начала" или "Даты окончания" динамически пересчитывается Авто
end_date Дата окончания Запланированная дата закрытия задачи (не меняется при досрочном закрытии, может быть изменена владельцем)
Статус Статус задачи Авто
Подзадачи Ссылка на подзадачи (задачи, для которых задача является "родительской"). Выводится в виде "{кол-во закрытых}/{общ. кол-во}" Авто
assignees_groups Исполнители (группы) Группы, назначенные исполнителями задачи (пользователи из этих групп могут закрывать задачу)
assignees_users Исполнители пользователи Отдельные пользователи, назначенные исполнителями
owners_groups Исполнители (группы) Группы, назначенные владельцами задачи (могут выполнять любые действия над заадачей)
owners_users Исполнители (пользователи) Отдельные пользователи, назначенные владельцами
auto_resolve_
on_due_date
Закрывать автоматически по дате Наследуется из элемента шаблона, может быть изменено владельцем
auto_resolve_
on_subtasks_resolution
Закрывать автоматически при закрытии подзадач Наследуется из элемента шаблона, может быть изменено владельцем
Открыто Дата и время, когда задача была фактически открыта Авто
Открыл Пользователь, который инициировал открытие задачи (batch_user для автоматического открытия) Авто
Подписки Подписки, привязанные к задаче. Подробнее см раздел подписки шаблона рабочего процесса. Владелец может редактировать список.
Сценарии Сценарии, привязанные к задаче. Подробнее см раздел сценарии шаблона рабочего процесса. Владелец может редактировать список.

Статус задачи

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

Также у задачи есть отдельные флаги "Закрыто" и "Просрочено", который упрощает фильтрацию.

Статус Комментарий
Ожидает Задача ещё не активирована
Обрабатывается Задача активирована, но ещё не закрыта
Закрыто Задача закрыта

Комментарий для разработчика: см planiqum.core.workflow.models.Issue.STATES и planiqum.core.workflow.models.Issue.get_status

Просроченные задачи

"Просрочено" не является статусом задачи это лишь "флаг", который показывает, что запланированная "Дата окончания" уже наступила, а задача ещё не была закрыта. Задача в любом статусе может иметь флаг "Просрочено":

  • Ожидает, обрабатывается: задача ещё не завершена, но "Дата окончания" уже прошла
  • Закрыто: задача была закрыта уже после "Даты окончания"

Действия над задачей

Для задачи определены действия, выполнение которых переводит задачу из одного статуса в другой.

Ключ Название Описание
ACTIVATE Активация Активация задачи. Может инициироваться пользователем или происходить автоматически при наступлении "Даты начала".
CLOSE Закрытие Закрытие задачи. Может инициироваться пользователем или происходить автоматически при наступлении "Даты окончания" (если установлен флаг Закрывать автоматически по дате) или закрытии всех подзадач (если установлен флаг Закрывать автоматически при закрытии подзадач.
DEACTIVATE Деактивация Возвращение задачи в неактивный режим. Может инициироваться пользователем.
REOPEN Переоткрытие Повторное открытие задачи. Может инициироваться пользователем.
OVERDUE Превышение срока Переход задачи в соответствующий статус. Происходит автоматически при превышении "Даты окончания".

Сценарии

В системе используется один объединённый сценарий, который автоматически выполняется каждую минуту (см. документацию для разработчика). Этот сценарий последовательно выполняет три шага:

  1. Создание рабочих процессов по расписанию — автоматически создаёт новые процессы по шаблонам, если наступила дата их запуска.
  2. Активация задач по дате начала — активирует задачи, у которых наступила дата начала, если они не заблокированы предыдущими задачами.
  3. Закрытие задач по дате окончания — закрывает задачи, у которых наступила дата окончания, либо помечает их как просроченные, если не установлен флаг автозакрытия.

Важно: Если при создании задачи указана дата начала, которая уже в прошлом, такая задача будет активирована автоматически сразу в процессе создания, без ожидания запуска сценария.

Техническая реализация: см. задачу workflow_maintenance_task в файле src/planiqum/core/workflow/scripts/workflow_maintenance.py и расписание в src/planiqum/core/celery.py.

Рабочие процессы: инструкция для администратора

Настройка шаблонов рабочих процессов

  • Для сложных процессов используйте вложенность (parent) и последовательность (prev) задач.
  • Для параллельных веток не связывайте задачи через prev — они будут выполняться одновременно.
  • Длительность родительской задачи рассчитывается автоматически по критическому пути (максимум по веткам).
  • При изменении длительности подзадачи пересчёт происходит автоматически.

Пример шаблона:

Ключ Имя prev parent Длительность (дн)
root Корень
a Задача A root 2
b Задача B root 3
b1 Задача B1 b 5
c Задача C root 1
  • В этом примере root = max(a, b, c), b = b1.
  • Если у задачи есть prev, она начнётся только после завершения предыдущей.
  • Если у задачи есть parent, она будет подзадачей родителя.

Проверка структуры и отладка

  • После создания шаблона проверьте структуру через визуализацию или таблицу.
  • Для сложных процессов используйте тесты (см. документацию разработчика).
  • При изменении длительности или добавлении подзадач убедитесь, что пересчёт происходит автоматически.

Типовые ошибки и их решение

  • Если длительность не пересчитывается — проверьте корректность структуры шаблона (parent/prev).
  • Если задачи не отображаются — проверьте права доступа и фильтры.
  • Для сложных сценариев используйте smoke-тесты (см. документацию разработчика).

Рекомендации

  • Используйте осмысленные ключи и имена для задач.
  • Для типовых процессов создавайте шаблоны с примерами вложенности и последовательности.
  • Проверяйте структуру шаблона перед запуском процессов.

Расчёт продолжительности (duration_days)

  • Для расчёта продолжительности задачи (duration_days) используется функция calculate_duration(start_date, due_date) из planiqum.core.workflow.utils, которая учитывает рабочие дни, если они настроены в системе.
  • При изменении даты окончания (due_date) или даты начала (start_date) у задачи, значение duration_days пересчитывается автоматически.
  • Если новая продолжительность задачи становится больше, чем у других подзадач одного родителя, это значение "всплывает" вверх по иерархии и становится определяющим для родителя и далее до корня.
  • Если у родителя есть несколько подзадач, то в качестве duration_days родителя берётся максимальное значение из всех дочерних задач.
  • Если календарь рабочих дней не настроен — используется обычный календарь.

Расчёт даты окончания (due_date)

  • Для расчёта даты окончания задачи (due_date) используется функция calculate_due_date(start_date, duration_days) из planiqum.core.workflow.utils, которая учитывает рабочие дни, если они настроены в системе.
  • Нельзя просто прибавлять timedelta к дате начала — используйте только функцию calculate_due_date, чтобы корректно учитывать рабочие и выходные дни.
  • При изменении продолжительности (duration_days) или даты начала (start_date) у задачи, значение due_date пересчитывается автоматически с помощью этой функции.
  • Если календарь рабочих дней не настроен — используется обычный календарь.

Подробнее см. Календарь рабочих дней


Автоматическое создание рабочих процессов по расписанию

В системе Planiqum можно настроить автоматическое создание рабочих процессов по расписанию для любого шаблона. Для этого используется модель Расписание рабочего процесса (WorkflowSchedule), которая настраивается через панель администратора.

Сценарии использования

  • Ежедневное создание процессов (например, запуск процесса каждый день)
  • Еженедельное создание процессов (например, запуск процесса каждую неделю)
  • Ежемесячное создание процессов (например, запуск процесса 1-го числа каждого месяца)
  • Создание процессов заранее (например, создать процесс за 3 дня до даты начала)
  • Ограничение по датам (например, создавать процессы только в течение определённого периода)

Как настроить расписание в панели администратора

  1. Перейдите в раздел Рабочие процессы > Расписания рабочих процессов.
  2. Нажмите Добавить расписание.
  3. Заполните поля:
  4. Шаблон — выберите шаблон рабочего процесса, для которого будет действовать расписание.
  5. Активно — отметьте, если расписание должно быть активно (иначе процессы создаваться не будут).
  6. Дата начала — укажите дату первого запуска (например, 2024-01-01).
  7. Дата окончания — (опционально) укажите дату, после которой процессы создаваться не будут.
  8. Периодичность — выберите, как часто создавать процесс:
    • ежедневно
    • еженедельно
    • ежемесячно
    • ежегодно
  9. Интервал — укажите интервал между запусками (например, 2 для «каждые 2 недели»).
  10. Создать за N дней до начала — (опционально) если нужно создать процесс заранее (например, за 3 дня до даты начала).
  11. Шаблон — (опционально) переопределяет шаблон описания процесса.

Пример 1: Ежедневное создание процесса

  • Шаблон: «Согласование бюджета»
  • Активно: Да
  • Дата начала: 2024-01-01
  • Периодичность: ежедневно
  • Интервал: 1

Пример 2: Еженедельное создание процесса

  • Шаблон: «Планирование продаж»
  • Активно: Да
  • Дата начала: 2024-01-01
  • Периодичность: еженедельно
  • Интервал: 1

Пример 3: Создание процесса за 3 дня до даты начала

  • Шаблон: «Запуск рекламной кампании»
  • Активно: Да
  • Дата начала: 2024-02-01
  • Периодичность: ежемесячно
  • Интервал: 1
  • Создать за N дней до начала: 3

Описание всех полей расписания

Поле Описание
Шаблон Шаблон рабочего процесса, для которого действует расписание
Активно Если не отмечено — процессы по этому расписанию не создаются
Дата начала Дата первого запуска процесса
Дата окончания (опционально) Дата, после которой процессы не создаются
Периодичность Как часто создавать процесс (ежедневно, еженедельно, ежемесячно, ежегодно)
Интервал Интервал между запусками (например, 2 — каждые 2 недели)
Создать за N дней до начала (опционально) За сколько дней до даты начала создать процесс
Шаблон (опционально) Переопределяет шаблон описания процесса

Важные детали

  • Можно создать несколько расписаний для одного шаблона.
  • Если расписание не активно — процессы не будут создаваться.
  • Все созданные процессы получают ссылку на объект расписания (видно в деталях процесса).
  • Время суток для запуска процесса не задаётся — процессы создаются при срабатывании периодической задачи (обычно раз в минуту).
  • Если требуется сложная логика — обратитесь к разработчику.

Подробнее о технологии

Для технических деталей, примеров кода и тестов см. документацию для разработчика.