Прощай, Индия: как мы создали свою систему отслеживания задач на замену Jira

Привет, Хабр!

Зовут меня Егор, и в этой статье я хочу рассказать, как мы с ребятами из компании АИСА запилили свой аналог Jira — с блэкджеком и быстрым API на Go.

«Хомячки плакали, кололись, но продолжали грызть суккулент»

Рождение идеи

Чуть больше года назад мы поняли, что планирование и отслеживание работы над проектами с помощью Jira всё ощутимее бьёт по карману. Atlassian тогда еще не ушла из России, но всё равно хотелось адекватной замены для внутреннего использования.

Беглый анализ рынка показал, что аналоги или облачные, или заоблачно дорогие. Отдельные варианты совмещали первое со вторым.

Мы поставили себе несколько задач:

  • концепт интерфейса должен быть максимально простым, чтобы всё было под рукой;

  • писать систему нужно на go, с упором на скорость и современность;

  • легковесность — уж если делать свое, то делать легче и шустрее, чем Jira;

  • скриптование триггеров и логики в настройках;

  • удобный поиск;

  • программа должна «дружить» с Telegram, не заходя в систему.

Ну и, разумеется, импорт из Jira.

Как это работает

Некоторое (кто считал?) число рабочих ночей спустя мы запустили бесплатный сервис plan.aisa.ru. Наше решение для управления проектами.

f12259112db3379ab87ad9628d81f44c.jpg

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

db99fae12917bae530bdb57b91f6be37.png

Пространство состоит из проектов, создание которых обусловлено необходимостью работы в определённых направлениях. С помощью различных проектов пользователь может дирижировать отдельными направлениями в конкретном пространстве, поставленными в них задачами и выполняющими их пользователями.

23f251e2c584fb76a4c950c273a71ea1.png

Идем дальше от общего к частному! В каждом проекте можно создавать отдельные задания разного уровня сложности и объёма, которые необходимо выполнить для реализации проекта.

В карточке каждой задачи можно прописать основную инфу:

  • ID — идентификатор проекта и номер задачи;

  • название;

  • описание;

  • автор

  • статус — текущая стадия выполнения;

  • исполнители — пользователи, которые выполняют задачу;

  • наблюдатели — пользователи, которые контролируют процесс;

  • приоритет — срочность выполнения;

  • родитель — главная задача по отношению к текущей;

  • блокирует — задача, мешающая выполнению текущей;

  • заблокирована — задача, которую блокирует текущая;

  • дата создания;

  • дата выполнения — срок выполнения задачи;

  • теги — цветные метки для удобства фильтрации задач;

  • ссылки — ссылки, прикреплённые к задаче;

  • вложения — добавленные к задаче файлы;

  • подзадачи — задачи, к которым текущая выбрана родителем;

  • связи — двухсторонние связи с другими задачами (по типу linked в jira).

ce104e0aa385603a06c1ecc743db4adb.png

Каждая задача также содержит блок «Активность», расположенный под описанием. В блоке есть три категории: комментарии (для коммуникации участников проекта), активность (история изменений задачи) и статусы (история изменений статусов задачи, а также время нахождения в каждом статусе).

Стандартное отображение таблицей

Стандартное отображение таблицей

Канбан-доска

Канбан-доска

Все текущие задачи можно держать перед глазами. При выбранном отображении «доска» в выпадающем списке в правом верхнем углу задачи отображаются по столбцам. Если не по душе канбан-доски — можно просто выставить их списком, отображать данные по каждой задаче в отдельной колонке, группировать их по тэгам или приоритетности, показывать пустые группы (где нет задач) или скрыть их с глаз долой, фильтровать по текущим статусам.

daa921b64fd4d0a951712ba23be854a2.jpg

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

Чтобы упростить работу по администрированию проектов, мы прописали поддержку переноса задач между проектами. Упор на легко и быстро, помните?

Также в системе АИПлан есть возможность упоминания пользователей в комментариях к задаче. Пользователь получит уведомление при отметке в задаче, даже если не является ни её автором, ни исполнителем, ни наблюдателем.

71fce9cbbc32f7e2264f04982fac81a1.png

Уведомления о любых действиях с задачей можно получать на e-mail либо с помощью Telegram-бота, кому как удобнее. @aiplan_demo_bot помогает взаимодействовать с командой, создавать и управлять задачами прямо из Telegram.

40acfc63e65c884855d91fb3ba12fd01.jpg

Ну и то, с чего всё начиналось — импорт проектов из Jira. Можно перенести свой проект сразу при создании нового в АИПлан. Вводим свои логин и пароль, указываем пространство в системе, куда будет импортирован проект, выбираем блокирующую связь и указываем соответствие приоритетов.

482050629b2a9450615d4935bcc440b0.png

Кроме ролей, в АИПлан в настройках проекта в разделе «Сценарии» можно дополнительно настроить доступ пользователей к функциям в процессе редактирования задачи. Скрипты пишутся на Lua.

Доступны события:

  • изменение статуса;

  • изменение исполнителя;

  • изменения наблюдателя;

  • изменение тегов.

Ниже пример скрипта, запрещающего конкретному участнику проекта переводить задачи в статус «Выполнена».

function BeforeStatusChange(params, newstatus)
  if newstatus.name == "Выполнена" and params.user.email == "iuliia.trusova@aisa.ru" then
    return { status = false, error = "У вас нет прав переводить в этот статус." }
  end
  
  return { status = true }
end

Чувствую, мой эпос несколько затянулся. Остается добавить, что мы в АИСА планируем вывести наше творение в opensource и выложить его на Github. Если будет интересно — могу рассказать про API и как мы его используем с ИИ, или о том, как после блокировки Дискорда в России мы прикрутили в АИПлан jitsi.

© Habrahabr.ru