report

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 & NicknameRMQ 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 tasksTaskRepository.getOnTimeReplyRateByDaysForTeam (жовті таски: ChatActiveUnanswered, ChatFinishedUnanswered, UnansweredMessage; on-time = відповідь до dateTimerEnd)
OTRR %формула =on-time / total * 100
Completed total / on-timeTaskRepository.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). Тобто ширший набір.
  • Avg. Effective online in online days — знаменник = к-сть днів, у які онлайн був > 1 хв (а не всі активні дні), як і просив замовник.