PopugJira - is a task tracker with additional accounting and analytics utilities
Created as education project, showing my capabilities in building asynchronous microservice architecture
If you want to see project evolution please go to closed pull requests
Many thanks to authors of the course about asynchronous architecture: @f213, @davydovanton
Project description & requirements (russian language only)
Топ-менеджмент UberPopug Inc столкнулся с проблемой производительности сотрудников. Чтобы повысить производительность, было принято решение выкинуть текущий таск-трекер и написать особый PopugJira, который должен будет увеличить производительность сотрудников на неопределенный процент. Чтобы попуги развивались и изучали новые направления, была придумана инновационная схема ассайна каждой задачи на случайного сотрудника. А для повышения мотивации топ-менеджмент решил сделать корпоративный аккаунтинг в таск-трекере, чтобы по количеству выполненных задач выплачивать сотрудникам зарплату. При этом задачи оцениваются с плавающим коэффициентом (местами отрицательным).
В ходе обсуждения задачи с топ-менеджментом были выявлены следующие требования:
- Таск-трекер должен быть отдельным дашбордом и доступен всем сотрудникам компании UberPopug Inc.
- Авторизация в таск-трекере должна выполняться через общий сервис авторизации UberPopug Inc (у нас там инновационная система авторизации на основе формы клюва).
- В таск-трекере должны быть только задачи. Проектов, скоупов и спринтов никому не надо, ибо минимализм.
- В таск-трекере новые таски может создавать кто угодно. У задачи должны быть описание, статус (выполнена или нет) и попуг, на которого заассайнена задача.
- Менеджеры или администраторы должны иметь кнопку «заассайнить задачи», которая возьмет все открытые задачи и рандомно заассайнит каждую на любого из сотрудников. Не успел закрыть задачу до реассайна — сорян, делай следующую.
- Дополнение: Ассайнить задачу можно на кого угодно, это может быть любой аккаунт из системы.
- Дополнение: Ассайнить задачу можно только кнопкой «заассайнить задачи»
- Дополнение: при нажатии кнопки «заассайнить задачи» все текущие не закрытые задачи должны быть случайным образом перетасованы между каждым аккаунтом в системе
- Дополнение: мы не заморачиваемся на ограничение по нажатию на кнопку «заассайнить задачи». Ее можно нажимать хоть каждую секунду.
- Дополнение: на одного сотрудника может выпасть любое количество новых задач, может выпасть нуль, а может и 10.
- Каждый сотрудник должен иметь возможность видеть в отдельном месте список заассайненных на него задач + отметить задачу выполненной.
- После ассайна новой задачи сотруднику должно приходить оповещение на почту, в слак и в смс.
- Аккаунтинг должен быть в отдельном дашборде и доступным только для администраторов и бухгалтеров.
- Авторизация в таск-трекере должна выполняться через общий сервис аунтификации UberPopug Inc.
- У каждого из сотрудников должен быть свой счет, который показывает, сколько за сегодня он получил денег. У счета должен быть аудитлог того, за что были списаны или начислены деньги, с подробным описанием каждой из задач.
- Расценки:
- Дополнение: цена на задачу определяется единоразово, в момент ее появления в системе (можно с минимальной задержкой)
- у сотрудника появилась новая задача —
rand(-10..-20)$
- сотрудник выполнил задачу —
rand(20..40)$
- Дополнение: деньги списываются сразу после ассайна на сотрудника, а начисляются после выполнения задачи.
- Дополнение: отрицательный баланс переносится на следующий день. Единственный способ его погасить - закрыть достаточное количество задач в течении дня.
- Вверху выводить количество заработанных топ менеджером за сегодня денег.
- Дополнение: т.е. сумма всех закрытых и созданных задач за день с противоположным знаком:
(sum(completed task amount) + sum(created task fee)) * -1
- Дополнение: т.е. сумма всех закрытых и созданных задач за день с противоположным знаком:
- В конце дня необходимо считать, сколько денег сотрудник получил за рабочий день, слать на почту сумму выплаты.
- После выплаты баланса (в конце дня) он должен обнуляться и в аудитлоге должно быть отображено, что была выплачена сумма.
- Дашборд должен выводить информацию по дням, а не за весь период сразу.
- изначально хватит только за сегодня. если чувствуете, что успеете сделать аналитику за каждый день недели - будет круто
- Аналитика — это отдельный дашборд, доступный только админам.
- Нужно указывать, сколько заработал топ-менеджмент за сегодня: сколько попугов ушло в минус.
- Нужно показывать самую дорогую задачу за: день, неделю и месяц.
-
Дополнение: самой дорогой задачей является задача с наивысшей ценной из списка всех закрытых задач за определенный период времени
-
Дополнение: пример того, как это может выглядеть:
03.03 - самая дорогая задача - 28$ 02.03 - самая дорогая задача - 38$ 01.03 - самая дорогая задача - 23$ 01-03 марта - самая дорогая задача - 38$
-
- Никакого сложного UI-дизайна не надо, хватит самого банального бутстрапа или чистого html.
- Нотификации достаточно вывести в консоль, что они произошли. Ничего делать не нужно.
- Никакого реалтайма тоже не нужно, хватит рефреша страницы.
- Язык и технологии можно выбрать любые.
- Дополнение: Оповещения делать обычным выводом в STDOUT терминала, реальной логики отправки сообщений на почту, в слак или еще куда-то быть не должно.
- Все права на PopugJira принадлежат UberPopug Inc.
IdentityServer4 with ASP.NET Identity authorization service.
Contains registration and signing logic. Using OpenID through oAuth with Jwt.
ASP.NET 5 WebApi service.
Used for creating/updating goals for users.
ASP.NET 5 WebApi service.
Used for payment processing to users
ASP.NET 5 WebApi service.
User for provide analytics information
ASP.NET 5 WebApi service
User for notify users about some actions in the system
Blazor WebAssembly application
Used as client application for user's browser. Communicates with all microservices
PopugJira.Microservice - library, contains base logic for every microservice. Just for simplify building new microservices.
PopugJira.AutoDI - library, contains logic for automatic dependency injection.
PopugJira.Common - library, contains other shared logic
PopugJira.EventBus - library, contains schema registry for events and base logic for event bus.
Each microservice uses shared RabbitMQ instance.
Each microservice contains separated SQLite database and manipulates data only within that database.
All databases places into PopugJira (blazor) project folder during initialization of each service.
- Deploy shared RabbitMQ instance
- Download and install .NET 5 SDK
- Clone repository into any local folder
- Change RabbitMQ connection strings into each microservice (
appsettings.json
) - Run all services (order of launch doesn't matter)
- Navigate to
https://localhost:5001
orhttp://localhost:5000
- Register few users (with different roles, note that not all roles has access to all parts of the system)
- Login as any registered user
- Enjoy