Report
src/golden/report/
Місячний звіт по операторах топ-менеджера у форматі Excel (.xlsx). Один ендпоінт, мігрований на routing-controllers (тег Report у Swagger).
Пов’язаний UI: TODO (тригериться директором/топ-менеджером).
Ендпоінт
POST /golden/report/operators-monthly — @ApiRoles([director, topManager]).
Вхід: { date: string, stackTopManagerId?: string }
date— будь-яка дата місяця (YYYY-MM-DD); звіт будується за весь календарний місяць цієї дати.stackTopManagerId— обов’язковий дляdirector; дляtopManagerігнорується (беретьсяreq.user.id).
Вихід: бінарний .xlsx (Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet). Це не JSON — обгортку SuccessWrapperInterceptor обходимо через return res (патерн як у Electron API downloadUpdate).
Що в звіті
Один лист, рядок на оператора, що працював у цього топа за місяць. Сирі дані кладемо в комірки, фінальні метрики рахуються формулами Excel (щоб розрахунок можна було перевірити в комірці — менше спорів):
| Колонка | Джерело / формула |
|---|---|
| Operator Name & Nickname | RMQ StackOperatorWithFamily |
| Balance | сума sum за місяць з golden_statistics_relations (MongoDB) по operatorId. sum — денна дельта, тож баланс місяця = сума по днях |
| Online (min), Online days (>1 min) | getOperatorOnlineByDays (effective online, обрізане по межах дня) |
| Avg Effective Online (min/day) | формула =Online / Online days |
| OTRR total / on-time tasks | TaskRepository.getOnTimeReplyRateByDaysForTeam (жовті таски: ChatActiveUnanswered, ChatFinishedUnanswered, UnansweredMessage; on-time = відповідь до dateTimerEnd) |
| OTRR % | формула =on-time / total * 100 |
| Completed total / on-time | TaskRepository.getCompletedOnTimeByDaysForTeam — усі титули тасок (крім another_task); completed = flagTaskCompleted (answer до dateTimerEnd або без таймера). Дзеркалить AnalystService.getPercentageCompletedTasksMonthByDate |
| % Completed On Time | формула =on-time / total * 100 |
Нюанси
- Оператори топа визначаються через Metric
MetricTeamUtilsService.findTopManagerOperatorsPeriods— повертає операторів + дні їх активності в цього топа. Сирі денні дані фільтруються черезisBelong(...), щоб не приписати дні поза періодом оператора в топа. - OTRR vs «% completed tasks on time» — дві різні метрики:
- OTRR — лише 3 unanswered чат/меседж-титули (
ChatActiveUnanswered,ChatFinishedUnanswered,UnansweredMessage), on-time = answer доdateTimerEnd. - % completed — усі титули тасок (крім скасованих як
another_task); completed = answer вчасно до таймера або без таймера (логікаflagTaskCompleted). Тобто ширший набір.
- OTRR — лише 3 unanswered чат/меседж-титули (
- Avg. Effective online in online days — знаменник = к-сть днів, у які онлайн був > 1 хв (а не всі активні дні), як і просив замовник.