Дашборди
src/dashboard/ — дашборди director, тімліда, оператора і топа: 26 тижнів пн–нд з полями з джерел проєкту і списки для фільтрів.
Дані: project_statistics_relations, project_statistics, project_partner_online_weeks, відрізки online · Swagger: тег Dashboard · План: DashboardService
Що робить модуль
- Будує сітку 26 тижнів до вибраної неділі й межі ролі: дні тімліда в топа, дні оператора в команді, активність вибраного користувача.
- Рахує поля кожного тижня джерелами проєкту в межах ролі; набір джерел свій у кожного проєкту (
DashboardSources). - Віддає списки тімлідів і операторів для фільтрів у межах тих самих 26 тижнів.
Спільні кроки — у DashboardService, джерела — у src/dashboard/sources/. Реалізовано Golden; Chathouse, Prime і Udate підключаються своїми джерелами. ClickHouse дашборди не використовують.
Логіка
- Сітка (
dashboard-weeks.ts) — 26 тижнів до неділіto. Тиждень, чию неділю ще не записано в relations, не показується, сітка закінчується попередньою неділею.toдо 2024-07-01 включно — порожньо. - Межі ролі (
dashboard-scope.ts):- relations — увесь проєкт, тімлід, оператор; топ — лише дні, коли тімлід був у топа;
- online — у команді тімліда чи топа лише оператори з відрізками в команді і лише в їхніх межах (
TeamPeriodsService, спільний зі статистикою); - активність вибраного тімліда чи оператора — відрізки з журналів Stack.
- Джерела рахують поля тижнів у межах ролі.
- Порожні тижні: після останнього дня relations ролі і поза активністю вибраного користувача — усі поля
null. Роль без жодного запису отримує нулі.
Суми рахуються агрегацією в Mongo одразу по тижнях, без вибірки relations у пам’ять.
Джерела Golden
| Джерело | Поля | Дані |
|---|---|---|
BalanceSource | amount, levels | relations: сума операцій TU за тиждень; рівень TU — останній з історії картки TU у Stack до неділі 23:59, без історії — NEW |
OperationTypesSource | types | relations: сума кожного типу операції, частки категорій проєкту; other — решта |
RUSource | ru | relations: RU з операціями тижня; новий — RU без платних операцій у project_statistics до місяця першого тижня сітки (сума > 0, без службових типів і подарунків), який у межах ролі трапляється в сітці вперше. Перевірка — пошук першої такої операції RU за індексом project + ruId + day |
PartnerOnlineSource | partnerOnline | тижні online на партнері: унікальні й середні RU, усі TU партнера, наші TU; лише для всього проєкту і всіх тімлідів топа |
OperatorOnlineSource | online, onlineSec | відрізки online операторів з relations ролі |
Списки для фільтрів
У межах 26 тижнів: тімліди director — за журналом тімлідів (у команді на кінець тижнів або заблоковані чи видалені всередині вікна); без журналу — не заблоковані й не видалені зараз. Оператори і тімліди топа — з relations у межах ролі. Пункту «Free Profiles» немає.
API для frontend
Усі роути приймають project і to — неділю останнього тижня.
| Роут | Ролі | Поля |
|---|---|---|
POST /v2/dashboard/director | director | teamLeadProjectId? |
POST /v2/dashboard/team-lead | тімлід, director | teamLeadProjectId, operatorProjectId? |
POST /v2/dashboard/operator | operator, director | operatorProjectId |
POST /v2/dashboard/top-manager | top manager, director | teamLeadProjectId?, operatorProjectId?, topManagerUserId? |
POST /v2/dashboard/team-leads | director | — |
POST /v2/dashboard/team-lead-operators | director, тімлід | teamLeadProjectId |
POST /v2/dashboard/top-manager-team-leads | top manager, director | topManagerUserId? |
POST /v2/dashboard/top-manager-operators | top manager, director | teamLeadProjectId?, topManagerUserId? |
POST /v2/dashboard/partner-online-hours | director | from — понеділок тижня замість to |
Звірка з legacy
dashboard/directorпротиgetForDirector(неділі 2026-09-27, 2026-03-29, 2025-12-28; увесь проєкт і кожен тімлід вікна — 36, 22, 22; 26 тижнів):amount,levels,types,ru— 0 розбіжностей. Online — 0, крім legacy-дублів відрізка з тим самим початком (тиждень 19–25.01.2026 — 2 год 15 хв по проєкту) і тижня 20–26.10.2025 на межі форматів online.- Роути тімліда, оператора і топа (неділя 2026-09-27; кожен тімлід і по 2 оператори, кожен п’ятий оператор, 8 топів): значення тижнів ті самі. Відрізняються порожні тижні: legacy обробляє події одного дня в неправильному порядку і помиляється з активністю оператора, якого в той день зняли й призначили знову; тут відрізки йдуть за журналом.
- Online на партнері і списки для фільтрів (неділі 2026-09-27 і 2026-03-29): 0 розбіжностей, крім списків топа за березень — legacy бере відкритий період тімліда в топа без верхньої межі.
- Час: увесь проєкт — 2,2–2,6 с проти 3,2–3,9 с legacy; найдовше — дві паралельні агрегації relations по 1,1–1,4 с.
Нюанси
- Legacy-помилки, які не перенесено: «Free Profiles» з порожнечею або падінням; рівень
NO_LEVEL, що валив дашборд (тут TU з ним не йде в середні); падіння топа на тімліді, якого не було в топа (тут нулі). - Задачі в дашборд не переносяться до переробки задач; колекції
*_task_dashboardsне мігрують.
Борг
- Межі ролі беруться з тіла запиту без перевірки власника, як у legacy: тімлід може запросити дашборд чужої команди, топ — чужого топа.
- RU інших проєктів (з favorites), TU в роботі (Chathouse, Prime, Udate) і створені чати (Prime) — разом із даними цих проєктів.