09-dashboard

Дашборди

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 дашборди не використовують.

Логіка

  1. Сітка (dashboard-weeks.ts) — 26 тижнів до неділі to. Тиждень, чию неділю ще не записано в relations, не показується, сітка закінчується попередньою неділею. to до 2024-07-01 включно — порожньо.
  2. Межі ролі (dashboard-scope.ts):
    • relations — увесь проєкт, тімлід, оператор; топ — лише дні, коли тімлід був у топа;
    • online — у команді тімліда чи топа лише оператори з відрізками в команді і лише в їхніх межах (TeamPeriodsService, спільний зі статистикою);
    • активність вибраного тімліда чи оператора — відрізки з журналів Stack.
  3. Джерела рахують поля тижнів у межах ролі.
  4. Порожні тижні: після останнього дня relations ролі і поза активністю вибраного користувача — усі поля null. Роль без жодного запису отримує нулі.

Суми рахуються агрегацією в Mongo одразу по тижнях, без вибірки relations у пам’ять.

Джерела Golden

ДжерелоПоляДані
BalanceSourceamount, levelsrelations: сума операцій TU за тиждень; рівень TU — останній з історії картки TU у Stack до неділі 23:59, без історії — NEW
OperationTypesSourcetypesrelations: сума кожного типу операції, частки категорій проєкту; other — решта
RUSourcerurelations: RU з операціями тижня; новий — RU без платних операцій у project_statistics до місяця першого тижня сітки (сума > 0, без службових типів і подарунків), який у межах ролі трапляється в сітці вперше. Перевірка — пошук першої такої операції RU за індексом project + ruId + day
PartnerOnlineSourcepartnerOnlineтижні online на партнері: унікальні й середні RU, усі TU партнера, наші TU; лише для всього проєкту і всіх тімлідів топа
OperatorOnlineSourceonline, onlineSecвідрізки online операторів з relations ролі

Списки для фільтрів

У межах 26 тижнів: тімліди director — за журналом тімлідів (у команді на кінець тижнів або заблоковані чи видалені всередині вікна); без журналу — не заблоковані й не видалені зараз. Оператори і тімліди топа — з relations у межах ролі. Пункту «Free Profiles» немає.

API для frontend

Усі роути приймають project і to — неділю останнього тижня.

РоутРоліПоля
POST /v2/dashboard/directordirectorteamLeadProjectId?
POST /v2/dashboard/team-leadтімлід, directorteamLeadProjectId, operatorProjectId?
POST /v2/dashboard/operatoroperator, directoroperatorProjectId
POST /v2/dashboard/top-managertop manager, directorteamLeadProjectId?, operatorProjectId?, topManagerUserId?
POST /v2/dashboard/team-leadsdirector—
POST /v2/dashboard/team-lead-operatorsdirector, тімлідteamLeadProjectId
POST /v2/dashboard/top-manager-team-leadstop manager, directortopManagerUserId?
POST /v2/dashboard/top-manager-operatorstop manager, directorteamLeadProjectId?, topManagerUserId?
POST /v2/dashboard/partner-online-hoursdirectorfrom — понеділок тижня замість 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) — разом із даними цих проєктів.