ahs-cti 1.0.2-beta.3 → 1.0.2-beta.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/dist/agentDetailReport-YTS5NJNJ.mjs +9 -0
  2. package/dist/{agentPerformanceReport-WJEQKLIL.mjs → agentPerformanceReport-E75UWEZI.mjs} +90 -73
  3. package/dist/agentPerformanceReport-E75UWEZI.mjs.map +1 -0
  4. package/dist/callHistory-FC73S476.mjs +746 -0
  5. package/dist/callHistory-FC73S476.mjs.map +1 -0
  6. package/dist/{campaigns-UMAMUUDZ.mjs → campaigns-LWCD4HN3.mjs} +48 -30
  7. package/dist/campaigns-LWCD4HN3.mjs.map +1 -0
  8. package/dist/{cdrReport-4DLCPYQ4.mjs → cdrReport-QMQE2SUJ.mjs} +28 -24
  9. package/dist/cdrReport-QMQE2SUJ.mjs.map +1 -0
  10. package/dist/{chunk-NDBIVYJT.mjs → chunk-CBYAWUB7.mjs} +203 -102
  11. package/dist/chunk-CBYAWUB7.mjs.map +1 -0
  12. package/dist/chunk-CTOIIYHF.mjs +5779 -0
  13. package/dist/chunk-CTOIIYHF.mjs.map +1 -0
  14. package/dist/{chunk-APYLQRX7.mjs → chunk-D37RXY35.mjs} +2 -2
  15. package/dist/{chunk-3SHCNPBA.mjs → chunk-IWJVCG3W.mjs} +13 -12
  16. package/dist/chunk-IWJVCG3W.mjs.map +1 -0
  17. package/dist/chunk-M3VC2ZS2.mjs +17109 -0
  18. package/dist/chunk-M3VC2ZS2.mjs.map +1 -0
  19. package/dist/{chunk-HADAFS7N.mjs → chunk-QXXLASQJ.mjs} +59 -23
  20. package/dist/chunk-QXXLASQJ.mjs.map +1 -0
  21. package/dist/chunk-TUWXFBMW.mjs +82 -0
  22. package/dist/chunk-TUWXFBMW.mjs.map +1 -0
  23. package/dist/index.d.mts +35 -8
  24. package/dist/index.d.ts +36 -9
  25. package/dist/index.js +29067 -2255
  26. package/dist/index.js.map +1 -1
  27. package/dist/index.mjs +64 -132
  28. package/dist/index.mjs.map +1 -1
  29. package/dist/liveStatus-IINLQUK4.mjs +1073 -0
  30. package/dist/liveStatus-IINLQUK4.mjs.map +1 -0
  31. package/dist/{loginReport-JTW2KEUN.mjs → loginReport-NVXJLPBK.mjs} +62 -46
  32. package/dist/loginReport-NVXJLPBK.mjs.map +1 -0
  33. package/package.json +7 -11
  34. package/dist/agentDetailReport-EXJZOAWB.mjs +0 -9
  35. package/dist/agentPerformanceReport-WJEQKLIL.mjs.map +0 -1
  36. package/dist/callHistory-PJV7ZX3R.mjs +0 -364
  37. package/dist/callHistory-PJV7ZX3R.mjs.map +0 -1
  38. package/dist/campaigns-UMAMUUDZ.mjs.map +0 -1
  39. package/dist/cdrReport-4DLCPYQ4.mjs.map +0 -1
  40. package/dist/chunk-3SHCNPBA.mjs.map +0 -1
  41. package/dist/chunk-G5Q2CBVN.mjs +0 -208
  42. package/dist/chunk-G5Q2CBVN.mjs.map +0 -1
  43. package/dist/chunk-HADAFS7N.mjs.map +0 -1
  44. package/dist/chunk-KNTFDU2K.mjs +0 -486
  45. package/dist/chunk-KNTFDU2K.mjs.map +0 -1
  46. package/dist/chunk-NDBIVYJT.mjs.map +0 -1
  47. package/dist/loginReport-JTW2KEUN.mjs.map +0 -1
  48. /package/dist/{agentDetailReport-EXJZOAWB.mjs.map → agentDetailReport-YTS5NJNJ.mjs.map} +0 -0
  49. /package/dist/{chunk-APYLQRX7.mjs.map → chunk-D37RXY35.mjs.map} +0 -0
@@ -0,0 +1,9 @@
1
+ import {
2
+ agentDetailReport_default
3
+ } from "./chunk-IWJVCG3W.mjs";
4
+ import "./chunk-M3VC2ZS2.mjs";
5
+ import "./chunk-CBYAWUB7.mjs";
6
+ export {
7
+ agentDetailReport_default as default
8
+ };
9
+ //# sourceMappingURL=agentDetailReport-YTS5NJNJ.mjs.map
@@ -4,17 +4,19 @@ import {
4
4
  headCellSx,
5
5
  reportBodyCellSx,
6
6
  sortLabelSx
7
- } from "./chunk-KNTFDU2K.mjs";
8
- import {
9
- SDKPermissionGuard
10
- } from "./chunk-HADAFS7N.mjs";
7
+ } from "./chunk-CTOIIYHF.mjs";
11
8
  import {
12
9
  agentDetailReport_default
13
- } from "./chunk-3SHCNPBA.mjs";
10
+ } from "./chunk-IWJVCG3W.mjs";
14
11
  import {
12
+ AdapterDayjs,
15
13
  AppButton,
14
+ LocalizationProvider,
16
15
  PageHeader
17
- } from "./chunk-G5Q2CBVN.mjs";
16
+ } from "./chunk-M3VC2ZS2.mjs";
17
+ import {
18
+ SDKPermissionGuard
19
+ } from "./chunk-QXXLASQJ.mjs";
18
20
  import {
19
21
  END_POINT,
20
22
  SDKProvider,
@@ -22,10 +24,10 @@ import {
22
24
  __spreadProps,
23
25
  __spreadValues,
24
26
  axios_default
25
- } from "./chunk-NDBIVYJT.mjs";
27
+ } from "./chunk-CBYAWUB7.mjs";
26
28
 
27
29
  // call-control-sdk/lib/pages/agentPerformanceReport/index.tsx
28
- import { useState as useState2, useEffect, useCallback as useCallback2, useMemo } from "react";
30
+ import { useState as useState2, useEffect, useCallback as useCallback2, useMemo, useRef } from "react";
29
31
  import {
30
32
  Box,
31
33
  Paper,
@@ -47,8 +49,6 @@ import RefreshIcon from "@mui/icons-material/Refresh";
47
49
  import VisibilityIcon from "@mui/icons-material/Visibility";
48
50
  import dayjs from "dayjs";
49
51
  import isoWeek from "dayjs/plugin/isoWeek";
50
- import { LocalizationProvider } from "@mui/x-date-pickers/LocalizationProvider";
51
- import { AdapterDayjs } from "@mui/x-date-pickers/AdapterDayjs";
52
52
 
53
53
  // call-control-sdk/lib/pages/agentPerformanceReport/useAgentPerformanceReport.ts
54
54
  import { useCallback, useState } from "react";
@@ -65,36 +65,40 @@ function validateReportPayload(payload) {
65
65
  if (!payload.loginUsersOnly && !payload.agents) return { isValid: false, error: "Select at least one agent" };
66
66
  return { isValid: true };
67
67
  }
68
- async function getUserPerformanceReport(payload) {
68
+ function mapAgentPerfRow(a) {
69
+ var _a;
70
+ return {
71
+ agentDetails: { agentId: a.agentId, fullName: a.fullName, process: a.processName, queueNames: a.queueNames },
72
+ calls: { totalCalls: a.totalCalls, answered: a.answeredCalls, missed: a.missedCalls },
73
+ inCalls: { total: a.inCalls },
74
+ outCalls: { total: a.outCalls },
75
+ average: { holdTime: fmtSecs(a.holdTimeSeconds), wrapUp: fmtSecs(a.wrapupSeconds), aht: fmtSecs(a.ahtSeconds), ringing: "00:00:00", dialing: "00:00:00" },
76
+ loginDetails: { loggedInDuration: fmtSecs(a.loginDurationSeconds), talkTime: fmtSecs(a.talkTimeSeconds), idleTime: fmtSecs(a.idleTimeSeconds) },
77
+ breaks: { shortBreak: fmtSecs(a.breakTimeSeconds), breakCount: a.breakCount, lunch: "00:00:00", tea: "00:00:00", training: "00:00:00", meeting: "00:00:00" },
78
+ loginStats: { firstLogin: a.firstLoginTime || "", noOfLogins: 0 },
79
+ adherence: { pct: (_a = a.adherencePct) != null ? _a : null }
80
+ };
81
+ }
82
+ async function getUserPerformanceReportPaged(payload) {
83
+ var _a, _b, _c, _d, _e, _f, _g, _h;
69
84
  const params = {
70
85
  start_date: payload.startDate,
71
86
  end_date: payload.endDate,
72
87
  agent_id: payload.agents,
73
- queue_id: payload.queueIds && payload.queueIds.length > 0 ? payload.queueIds : void 0
88
+ queue_id: payload.queueIds && payload.queueIds.length > 0 ? payload.queueIds : void 0,
89
+ page: (_a = payload.page) != null ? _a : 1,
90
+ pageSize: (_b = payload.pageSize) != null ? _b : 10,
91
+ search: payload.search
74
92
  };
75
- const qs = new URLSearchParams();
76
- if (params.start_date) qs.append("start_date", params.start_date);
77
- if (params.end_date) qs.append("end_date", params.end_date);
78
- if (params.agent_id) for (const id of params.agent_id) qs.append("agent_id", id);
79
- if (params.queue_id) for (const id of params.queue_id) qs.append("queue_id", String(id));
80
- const qsStr = qs.toString();
81
93
  const res = await axios_default.get(
82
- `${END_POINT.AGENT_PERFORMANCE_REPORT_AGENTS}${qsStr ? `?${qsStr}` : ""}`
94
+ `${END_POINT.AGENT_PERFORMANCE_REPORT}${buildQs(params)}`
83
95
  );
84
- return (Array.isArray(res.data) ? res.data : []).map((a) => {
85
- var _a;
86
- return {
87
- agentDetails: { agentId: a.agentId, fullName: a.fullName, process: a.processName, queueNames: a.queueNames },
88
- calls: { totalCalls: a.totalCalls, answered: a.answeredCalls, missed: a.missedCalls },
89
- inCalls: { total: a.inCalls },
90
- outCalls: { total: a.outCalls },
91
- average: { holdTime: fmtSecs(a.holdTimeSeconds), wrapUp: fmtSecs(a.wrapupSeconds), aht: fmtSecs(a.ahtSeconds), ringing: "00:00:00", dialing: "00:00:00" },
92
- loginDetails: { loggedInDuration: fmtSecs(a.loginDurationSeconds), talkTime: fmtSecs(a.talkTimeSeconds), idleTime: fmtSecs(a.idleTimeSeconds) },
93
- breaks: { shortBreak: fmtSecs(a.breakTimeSeconds), breakCount: a.breakCount, lunch: "00:00:00", tea: "00:00:00", training: "00:00:00", meeting: "00:00:00" },
94
- loginStats: { firstLogin: a.firstLoginTime || "", noOfLogins: 0 },
95
- adherence: { pct: (_a = a.adherencePct) != null ? _a : null }
96
- };
97
- });
96
+ const data = res.data;
97
+ const agentsPage = data == null ? void 0 : data.agents;
98
+ const rawRows = Array.isArray(agentsPage) ? agentsPage : Array.isArray(agentsPage == null ? void 0 : agentsPage.data) ? agentsPage.data : [];
99
+ const rows = rawRows.map(mapAgentPerfRow);
100
+ const total = (_h = (_g = (_e = (_c = agentsPage == null ? void 0 : agentsPage.total) != null ? _c : data == null ? void 0 : data.total) != null ? _e : (_d = data == null ? void 0 : data.pagination) == null ? void 0 : _d.total) != null ? _g : (_f = data == null ? void 0 : data.summary) == null ? void 0 : _f.agentsLoggedIn) != null ? _h : rows.length;
101
+ return { rows, total };
98
102
  }
99
103
  async function fetchQueues() {
100
104
  var _a;
@@ -110,16 +114,24 @@ async function fetchProcesses() {
110
114
  if (Array.isArray((_a = res.data) == null ? void 0 : _a.data)) return res.data.data;
111
115
  return [];
112
116
  }
113
- async function exportAgentPerformanceToExcel(params) {
114
- var _a;
117
+ function buildQs(params) {
115
118
  const qs = new URLSearchParams();
116
119
  if (params.start_date) qs.append("start_date", params.start_date);
117
120
  if (params.end_date) qs.append("end_date", params.end_date);
118
121
  if (params.agent_id) for (const id of params.agent_id) qs.append("agent_id", id);
119
122
  if (params.queue_id) for (const id of params.queue_id) qs.append("queue_id", String(id));
120
- const qsStr = qs.toString();
123
+ if (params.process_id) for (const id of params.process_id) qs.append("process_id", String(id));
124
+ if (params.top_n) qs.append("top_n", String(params.top_n));
125
+ if (params.search) qs.append("search", params.search);
126
+ if (params.page) qs.append("page", String(params.page));
127
+ if (params.pageSize) qs.append("pageSize", String(params.pageSize));
128
+ const str = qs.toString();
129
+ return str ? `?${str}` : "";
130
+ }
131
+ async function exportAgentPerformanceToExcel(params) {
132
+ var _a;
121
133
  const res = await axios_default.get(
122
- `${END_POINT.AGENT_PERFORMANCE_REPORT_EXPORT_EXCEL}${qsStr ? `?${qsStr}` : ""}`,
134
+ `${END_POINT.AGENT_PERFORMANCE_REPORT_EXPORT_EXCEL}${buildQs(params)}`,
123
135
  { responseType: "blob" }
124
136
  );
125
137
  const url = URL.createObjectURL(new Blob([res.data]));
@@ -239,6 +251,7 @@ function AgentPerformanceReportContent() {
239
251
  const [endDate, setEndDate] = useState2(dayjs());
240
252
  const [quickRange, setQuickRange] = useState2("today");
241
253
  const [selectedUsers, setSelectedUsers] = useState2([]);
254
+ const [isAllUsersSelected, setIsAllUsersSelected] = useState2(false);
242
255
  const [processes, setProcesses] = useState2([]);
243
256
  const [process, setProcess] = useState2("");
244
257
  const [search, setSearch] = useState2("");
@@ -253,7 +266,14 @@ function AgentPerformanceReportContent() {
253
266
  const [order, setOrder] = useState2("desc");
254
267
  const [page, setPage] = useState2(0);
255
268
  const [rowsPerPage, setRowsPerPage] = useState2(10);
269
+ const [totalCount, setTotalCount] = useState2(-1);
256
270
  const [visibleCols] = useState2(new Set(COLUMNS.map((c) => c.key)));
271
+ const [debouncedSearch, setDebouncedSearch] = useState2("");
272
+ const debounceRef = useRef(void 0);
273
+ useEffect(() => {
274
+ debounceRef.current = setTimeout(() => setDebouncedSearch(search.trim()), 400);
275
+ return () => clearTimeout(debounceRef.current);
276
+ }, [search]);
257
277
  useEffect(() => {
258
278
  fetchProcesses().then((p) => {
259
279
  const mapped = p.map((x) => ({ label: x.name, value: x.name }));
@@ -276,14 +296,13 @@ function AgentPerformanceReportContent() {
276
296
  else if (quickRange === "month") sd = now.startOf("month").startOf("day");
277
297
  setStartDate(sd);
278
298
  setEndDate(ed);
279
- fetchReport(sd, ed);
280
299
  } else {
281
- fetchReport();
300
+ fetchReport(page);
282
301
  }
283
302
  };
284
- const fetchReport = useCallback2(async (sd, ed) => {
285
- const fromDate = sd != null ? sd : startDate;
286
- const toDate = ed != null ? ed : endDate;
303
+ const fetchReport = useCallback2(async (pageNum) => {
304
+ const fromDate = startDate;
305
+ const toDate = endDate;
287
306
  if (!fromDate || !toDate) {
288
307
  setError("Select date range");
289
308
  return;
@@ -294,9 +313,12 @@ function AgentPerformanceReportContent() {
294
313
  startTime: fromDate.format("HH:mm:ss"),
295
314
  endTime: toDate.format("HH:mm:ss"),
296
315
  process,
297
- agents: selectedUsers.map((u) => u.userId),
316
+ agents: isAllUsersSelected ? [] : selectedUsers.map((u) => u.userId),
298
317
  loginUsersOnly,
299
- queueIds: selectedQueues.length > 0 ? selectedQueues.map((q) => q.id) : void 0
318
+ queueIds: selectedQueues.length > 0 && selectedQueues.length < queues.length ? selectedQueues.map((q) => q.id) : void 0,
319
+ search: debouncedSearch || void 0,
320
+ page: pageNum + 1,
321
+ pageSize: rowsPerPage
300
322
  };
301
323
  const valid = validateReportPayload(payload);
302
324
  if (!valid.isValid) {
@@ -306,43 +328,36 @@ function AgentPerformanceReportContent() {
306
328
  try {
307
329
  setLoading(true);
308
330
  setError("");
309
- setPage(0);
310
- const res = await getUserPerformanceReport(payload);
311
- setData(Array.isArray(res) ? res : []);
331
+ const { rows, total } = await getUserPerformanceReportPaged(payload);
332
+ setData(rows);
333
+ setTotalCount(typeof total === "number" ? total : rows.length);
312
334
  } catch (err) {
313
335
  setError((err == null ? void 0 : err.message) || "Failed to fetch report");
314
336
  setData([]);
315
337
  } finally {
316
338
  setLoading(false);
317
339
  }
318
- }, [startDate, endDate, process, selectedUsers, selectedQueues, loginUsersOnly]);
340
+ }, [startDate, endDate, process, selectedUsers, isAllUsersSelected, selectedQueues, loginUsersOnly, debouncedSearch, rowsPerPage]);
319
341
  useEffect(() => {
320
- if (startDate && endDate) {
321
- fetchReport();
322
- }
342
+ setPage(0);
343
+ fetchReport(0);
323
344
  }, [fetchReport]);
324
- const filtered = useMemo(() => {
325
- let d = data;
326
- if (search) {
327
- const s = search.toLowerCase();
328
- d = d.filter(
329
- (r) => {
330
- var _a, _b;
331
- return (((_a = r.agentDetails) == null ? void 0 : _a.fullName) || "").toLowerCase().includes(s) || (((_b = r.agentDetails) == null ? void 0 : _b.agentId) || "").toLowerCase().includes(s);
332
- }
333
- );
334
- }
335
- return d;
336
- }, [data, search]);
345
+ const handlePageChange = useCallback2(
346
+ (_event, newPage) => {
347
+ setPage(newPage);
348
+ fetchReport(newPage);
349
+ },
350
+ [fetchReport]
351
+ );
337
352
  const sorted = useMemo(() => {
338
- return [...filtered].sort((a, b) => {
353
+ return [...data].sort((a, b) => {
339
354
  const av = getVal(a, orderBy);
340
355
  const bv = getVal(b, orderBy);
341
356
  if (typeof av === "number" && typeof bv === "number") return order === "asc" ? av - bv : bv - av;
342
357
  return order === "asc" ? String(av).localeCompare(String(bv)) : String(bv).localeCompare(String(av));
343
358
  });
344
- }, [filtered, orderBy, order]);
345
- const paged = sorted.slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage);
359
+ }, [data, orderBy, order]);
360
+ const paged = sorted;
346
361
  const handleSort = (key) => {
347
362
  setOrder(orderBy === key && order === "asc" ? "desc" : "asc");
348
363
  setOrderBy(key);
@@ -357,8 +372,9 @@ function AgentPerformanceReportContent() {
357
372
  const params = {
358
373
  start_date: fromDate.format("YYYY-MM-DDTHH:mm:ss"),
359
374
  end_date: toDate.format("YYYY-MM-DDTHH:mm:ss"),
360
- agent_id: selectedUsers.length > 0 ? selectedUsers.map((u) => u.userId) : void 0,
361
- queue_id: selectedQueues.length > 0 ? selectedQueues.map((q) => q.id) : void 0
375
+ agent_id: !isAllUsersSelected && selectedUsers.length > 0 ? selectedUsers.map((u) => u.userId) : void 0,
376
+ queue_id: selectedQueues.length > 0 && selectedQueues.length < queues.length ? selectedQueues.map((q) => q.id) : void 0,
377
+ search: debouncedSearch || void 0
362
378
  };
363
379
  try {
364
380
  await exportAgentPerformanceToExcel(params);
@@ -435,6 +451,7 @@ function AgentPerformanceReportContent() {
435
451
  showAgentSelect: true,
436
452
  selectedAgents: selectedUsers,
437
453
  onAgentsChange: setSelectedUsers,
454
+ setIsAllUsersSelected,
438
455
  showQueueSelect: true,
439
456
  queues,
440
457
  selectedQueues,
@@ -486,15 +503,15 @@ function AgentPerformanceReportContent() {
486
503
  TablePagination,
487
504
  {
488
505
  component: "div",
489
- count: filtered.length,
506
+ count: totalCount,
490
507
  page,
491
- onPageChange: (_, p) => setPage(p),
508
+ onPageChange: handlePageChange,
492
509
  rowsPerPage,
493
510
  onRowsPerPageChange: (e) => {
494
511
  setRowsPerPage(parseInt(e.target.value, 10));
495
512
  setPage(0);
496
513
  },
497
- rowsPerPageOptions: [5, 10, 20, 25, 50],
514
+ rowsPerPageOptions: [10, 15, 25, 50, 100],
498
515
  sx: { borderTop: "1px solid #eef1f6", "& .MuiTablePagination-displayedRows": { fontSize: "0.73rem" }, "& .MuiTablePagination-selectLabel": { fontSize: "0.73rem" } }
499
516
  }
500
517
  )
@@ -507,4 +524,4 @@ var agentPerformanceReport_default = AgentPerformanceReport;
507
524
  export {
508
525
  agentPerformanceReport_default as default
509
526
  };
510
- //# sourceMappingURL=agentPerformanceReport-WJEQKLIL.mjs.map
527
+ //# sourceMappingURL=agentPerformanceReport-E75UWEZI.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../call-control-sdk/lib/pages/agentPerformanceReport/index.tsx","../call-control-sdk/lib/pages/agentPerformanceReport/useAgentPerformanceReport.ts"],"sourcesContent":["import React, { useState, useEffect, useCallback, useMemo, useRef } from \"react\";\r\nimport {\r\n Box, Paper, Table, TableBody, TableCell, TableContainer, TableHead,\r\n TableRow, TableSortLabel, TablePagination, CircularProgress, Alert,\r\n Stack, IconButton, Tooltip,\r\n} from \"@mui/material\";\r\nimport AppButton from \"../common/components/AppButton\";\r\nimport FileDownloadIcon from \"@mui/icons-material/FileDownload\";\r\nimport RefreshIcon from \"@mui/icons-material/Refresh\";\r\nimport VisibilityIcon from \"@mui/icons-material/Visibility\";\r\nimport dayjs, { Dayjs } from \"dayjs\";\r\nimport isoWeek from \"dayjs/plugin/isoWeek\";\r\nimport { LocalizationProvider } from \"@mui/x-date-pickers/LocalizationProvider\";\r\nimport { AdapterDayjs } from \"@mui/x-date-pickers/AdapterDayjs\";\r\n\r\ndayjs.extend(isoWeek);\r\n\r\nimport {\r\n fetchQueues, fetchProcesses,\r\n getUserPerformanceReportPaged, validateReportPayload, exportAgentPerformanceToExcel,\r\n type Queue,\r\n} from \"./useAgentPerformanceReport\";\r\nimport type { AgentPerfReportParams, ReportData, ReportRequestPayload } from \"./types\";\r\nimport { type AgentOption } from \"../common/components/AgentMultiSelect\";\r\nimport ReportFilterBar, { type QuickRange, type ProcessOption } from \"../common/components/ReportFilterBar\";\r\nimport { headCellSx as headSx, sortLabelSx, reportBodyCellSx as bodySx } from \"../common/utils/tableStyles\";\r\nimport PageHeader from \"../common/components/PageHeader\";\r\nimport SearchBar from \"../common/components/SearchBar\";\r\n\r\nimport { SDKProvider } from \"../../components/SDKProvider\";\r\nimport { SDKPermissionGuard } from \"../../components/SDKPermissionGuard\";\r\nimport { SDK_PERMISSIONS } from \"../../permissions/sdk-constants\";\r\nimport AgentDetailReport from \"../agentDetailReport\";\r\n\r\nconst C = {\r\n navy: \"#0d2a56\", blue: \"#1565c8\", green: \"#0a9a62\", amber: \"#c47c00\",\r\n red: \"#cc2a2a\", purple: \"#6b3fbf\", teal: \"#0b7a8f\",\r\n bg: \"transparent\", surface: \"#fff\", s2: \"#f7f9fc\", s3: \"#eef2f7\",\r\n b1: \"rgba(20,50,100,.07)\", b2: \"rgba(20,50,100,.13)\",\r\n t1: \"#0d1e35\", t2: \"#364f6e\", t3: \"#7a93b5\", t4: \"#bccad9\",\r\n blt: \"#e8f0fc\", glt: \"#e4f6ef\", alt: \"#fdf3e0\", rlt: \"#fde8e8\",\r\n plt: \"#f0eafa\", tlt: \"#e3f4f7\",\r\n};\r\n\r\ntype Order = \"asc\" | \"desc\";\r\ntype SortKey = string;\r\n\r\nfunction parseDur(d: string): number {\r\n if (!d || d === \"00:00:00\") return 0;\r\n const p = d.split(\":\").map(Number);\r\n if (p.length === 3) return p[0] * 3600 + p[1] * 60 + p[2];\r\n if (p.length === 2) return p[0] * 60 + p[1];\r\n return 0;\r\n}\r\n\r\nfunction fmtDur(s: number): string {\r\n if (!s || s <= 0) return \"00:00:00\";\r\n const h = Math.floor(s / 3600);\r\n const m = Math.floor((s % 3600) / 60);\r\n const sc = Math.floor(s % 60);\r\n return [h, m, sc].map((x) => String(x).padStart(2, \"0\")).join(\":\");\r\n}\r\n\r\nfunction getVal(row: ReportData, key: string): any {\r\n switch (key) {\r\n case \"id\": return row.agentDetails?.agentId || \"\";\r\n case \"name\": return row.agentDetails?.fullName || \"\";\r\n case \"process\": return row.agentDetails?.process || \"\";\r\n case \"queue\": return row.agentDetails?.queueNames || \"\";\r\n case \"total\": return row.calls?.totalCalls ?? 0;\r\n case \"ans\": return row.calls?.answered ?? 0;\r\n case \"miss\": return row.calls?.missed ?? 0;\r\n case \"inTotal\": return row.inCalls?.total ?? 0;\r\n case \"outTotal\": return row.outCalls?.total ?? 0;\r\n case \"aht\": return parseDur(row.average?.aht || \"00:00:00\");\r\n case \"loginDur\": return parseDur(row.loginDetails?.loggedInDuration || \"00:00:00\");\r\n case \"talk\": return parseDur(row.loginDetails?.talkTime || \"00:00:00\");\r\n case \"hold\": return parseDur(row.average?.holdTime || \"00:00:00\");\r\n case \"wrapup\": return parseDur(row.average?.wrapUp || \"00:00:00\");\r\n case \"breakTime\": return parseDur(row.breaks?.lunch || \"00:00:00\") + parseDur(row.breaks?.tea || \"00:00:00\") + parseDur(row.breaks?.training || \"00:00:00\") + parseDur(row.breaks?.meeting || \"00:00:00\") + parseDur(row.breaks?.shortBreak || \"00:00:00\");\r\n case \"idle\": return parseDur(row.loginDetails?.idleTime || \"00:00:00\");\r\n case \"adherence\": return row.adherence?.pct ?? null;\r\n case \"firstLogin\": return row.loginStats?.firstLogin || \"\";\r\n default: return \"\";\r\n }\r\n}\r\n\r\ninterface ColDef { key: string; label: string; group: string; fmt?: (row: ReportData) => any; align?: \"left\" | \"right\" | \"center\"; }\r\n\r\nconst COLUMNS: ColDef[] = [\r\n { key: \"id\", label: \"User ID\", group: \"Agent\" },\r\n { key: \"name\", label: \"Full Name\", group: \"Agent\" },\r\n { key: \"queue\", label: \"Queues\", group: \"Agent\" },\r\n { key: \"total\", label: \"Total Calls\", group: \"Calls\", align: \"right\" },\r\n { key: \"ans\", label: \"Answered\", group: \"Calls\", align: \"right\" },\r\n { key: \"miss\", label: \"Missed\", group: \"Calls\", align: \"right\" },\r\n { key: \"inTotal\", label: \"Inbound\", group: \"Calls\", align: \"right\" },\r\n { key: \"outTotal\", label: \"Outbound\", group: \"Calls\", align: \"right\" },\r\n { key: \"aht\", label: \"AHT\", group: \"Time\", align: \"right\" },\r\n { key: \"loginDur\", label: \"Login Dur\", group: \"Time\", align: \"right\" },\r\n { key: \"talk\", label: \"Talk Time\", group: \"Time\", align: \"right\" },\r\n { key: \"hold\", label: \"Hold Time\", group: \"Time\", align: \"right\" },\r\n { key: \"wrapup\", label: \"Wrapup Time\", group: \"Time\", align: \"right\" },\r\n { key: \"breakTime\", label: \"Break Time\", group: \"Breaks\", align: \"right\" },\r\n { key: \"idle\", label: \"Idle Time\", group: \"Time\", align: \"right\" },\r\n { key: \"firstLogin\", label: \"First Login\", group: \"Login\" },\r\n { key: \"adherence\", label: \"Adherence %\", group: \"Agent\", align: \"right\" },\r\n];\r\n\r\nfunction AgentPerformanceReportContent() {\r\n const [startDate, setStartDate] = useState<Dayjs | null>(dayjs().startOf(\"day\"));\r\n const [endDate, setEndDate] = useState<Dayjs | null>(dayjs());\r\n const [quickRange, setQuickRange] = useState<string>(\"today\");\r\n const [selectedUsers, setSelectedUsers] = useState<AgentOption[]>([]);\r\n const [isAllUsersSelected, setIsAllUsersSelected] = useState(false);\r\n const [processes, setProcesses] = useState<ProcessOption[]>([]);\r\n const [process, setProcess] = useState(\"\");\r\n const [search, setSearch] = useState(\"\");\r\n const [loginUsersOnly] = useState(true);\r\n\r\n const [queues, setQueues] = useState<Queue[]>([]);\r\n const [selectedQueues, setSelectedQueues] = useState<Queue[]>([]);\r\n\r\n const [data, setData] = useState<ReportData[]>([]);\r\n const [loading, setLoading] = useState(false);\r\n const [error, setError] = useState(\"\");\r\n const [selectedAgent, setSelectedAgent] = useState<ReportData | null>(null);\r\n\r\n const [orderBy, setOrderBy] = useState<SortKey>(\"total\");\r\n const [order, setOrder] = useState<Order>(\"desc\");\r\n const [page, setPage] = useState(0);\r\n const [rowsPerPage, setRowsPerPage] = useState(10);\r\n const [totalCount, setTotalCount] = useState(-1);\r\n const [visibleCols] = useState<Set<string>>(new Set(COLUMNS.map((c) => c.key)));\r\n\r\n // Debounced search (sent to the server)\r\n const [debouncedSearch, setDebouncedSearch] = useState(\"\");\r\n const debounceRef = useRef<ReturnType<typeof setTimeout>>(undefined);\r\n\r\n useEffect(() => {\r\n debounceRef.current = setTimeout(() => setDebouncedSearch(search.trim()), 400);\r\n return () => clearTimeout(debounceRef.current);\r\n }, [search]);\r\n\r\n useEffect(() => {\r\n fetchProcesses().then((p) => {\r\n const mapped = p.map((x) => ({ label: x.name, value: x.name }));\r\n setProcesses(mapped);\r\n if (mapped.length) setProcess(mapped[0].value);\r\n }).catch(() => { });\r\n fetchQueues().then((data) => setQueues(data || [])).catch(() => { });\r\n }, []);\r\n\r\n const handleQuickRangeChange = (range: QuickRange) => {\r\n setQuickRange(range);\r\n };\r\n\r\n const handleRefresh = () => {\r\n if (quickRange === \"today\" || quickRange === \"week\" || quickRange === \"month\") {\r\n const now = dayjs();\r\n let sd = now.startOf(\"day\");\r\n const ed = now;\r\n if (quickRange === \"week\") sd = now.startOf(\"week\").startOf(\"day\");\r\n else if (quickRange === \"month\") sd = now.startOf(\"month\").startOf(\"day\");\r\n // Setting the dates re-triggers the auto-fetch effect below.\r\n setStartDate(sd);\r\n setEndDate(ed);\r\n } else {\r\n fetchReport(page);\r\n }\r\n };\r\n\r\n const fetchReport = useCallback(async (pageNum: number) => {\r\n const fromDate = startDate;\r\n const toDate = endDate;\r\n if (!fromDate || !toDate) { setError(\"Select date range\"); return; }\r\n\r\n const payload: ReportRequestPayload = {\r\n startDate: fromDate.format(\"YYYY-MM-DDTHH:mm:ss\"),\r\n endDate: toDate.format(\"YYYY-MM-DDTHH:mm:ss\"),\r\n startTime: fromDate.format(\"HH:mm:ss\"),\r\n endTime: toDate.format(\"HH:mm:ss\"),\r\n process,\r\n agents: isAllUsersSelected ? [] : selectedUsers.map((u) => u.userId),\r\n loginUsersOnly,\r\n queueIds: selectedQueues.length > 0 && selectedQueues.length < queues.length ? selectedQueues.map((q) => q.id) : undefined,\r\n search: debouncedSearch || undefined,\r\n page: pageNum + 1,\r\n pageSize: rowsPerPage,\r\n };\r\n\r\n const valid = validateReportPayload(payload);\r\n if (!valid.isValid) { setError(valid.error || \"Invalid\"); return; }\r\n\r\n try {\r\n setLoading(true);\r\n setError(\"\");\r\n const { rows, total } = await getUserPerformanceReportPaged(payload);\r\n setData(rows);\r\n setTotalCount(typeof total === \"number\" ? total : rows.length);\r\n } catch (err: any) {\r\n setError(err?.message || \"Failed to fetch report\");\r\n setData([]);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [startDate, endDate, process, selectedUsers, isAllUsersSelected, selectedQueues, loginUsersOnly, debouncedSearch, rowsPerPage]);\r\n\r\n useEffect(() => {\r\n setPage(0);\r\n fetchReport(0);\r\n }, [fetchReport]);\r\n\r\n const handlePageChange = useCallback(\r\n (_event: React.MouseEvent<HTMLButtonElement> | null, newPage: number) => {\r\n setPage(newPage);\r\n fetchReport(newPage);\r\n },\r\n [fetchReport],\r\n );\r\n\r\n // Search + paging are server-side; sorting is applied client-side to the current page.\r\n const sorted = useMemo(() => {\r\n return [...data].sort((a, b) => {\r\n const av = getVal(a, orderBy);\r\n const bv = getVal(b, orderBy);\r\n if (typeof av === \"number\" && typeof bv === \"number\") return order === \"asc\" ? av - bv : bv - av;\r\n return order === \"asc\" ? String(av).localeCompare(String(bv)) : String(bv).localeCompare(String(av));\r\n });\r\n }, [data, orderBy, order]);\r\n\r\n const paged = sorted;\r\n\r\n const handleSort = (key: string) => {\r\n setOrder(orderBy === key && order === \"asc\" ? \"desc\" : \"asc\");\r\n setOrderBy(key);\r\n };\r\n\r\n const handleExportExcel = async () => {\r\n const fromDate = startDate;\r\n const toDate = endDate;\r\n if (!fromDate || !toDate) { setError(\"Select date range\"); return; }\r\n const params: AgentPerfReportParams = {\r\n start_date: fromDate.format(\"YYYY-MM-DDTHH:mm:ss\"),\r\n end_date: toDate.format(\"YYYY-MM-DDTHH:mm:ss\"),\r\n agent_id: !isAllUsersSelected && selectedUsers.length > 0\r\n ? selectedUsers.map((u) => u.userId)\r\n : undefined,\r\n queue_id: selectedQueues.length > 0 && selectedQueues.length < queues.length\r\n ? selectedQueues.map((q) => q.id)\r\n : undefined,\r\n search: debouncedSearch || undefined,\r\n };\r\n try {\r\n await exportAgentPerformanceToExcel(params);\r\n } catch (err: any) {\r\n setError(err?.message || \"Failed to export Excel\");\r\n }\r\n };\r\n\r\n const renderCellValue = (row: ReportData, col: ColDef) => {\r\n const v = getVal(row, col.key);\r\n const durKeys = [\"aht\", \"loginDur\", \"talk\", \"hold\", \"wrapup\", \"breakTime\", \"idle\"];\r\n if (durKeys.includes(col.key)) return fmtDur(v);\r\n if (col.key === \"adherence\") return v != null ? `${v}%` : \"—\";\r\n if (col.key === \"firstLogin\") return v ? dayjs(v).format(\"DD MMM YYYY hh:mm A\") : \"\";\r\n return v ?? \"\";\r\n };\r\n\r\n const activeCols = COLUMNS.filter((c) => visibleCols.has(c.key));\r\n\r\n if (selectedAgent) {\r\n return (\r\n <AgentDetailReport\r\n agentRow={selectedAgent}\r\n onBack={() => setSelectedAgent(null)}\r\n initialStartDate={startDate}\r\n initialEndDate={endDate}\r\n initialQuickRange={quickRange}\r\n from=\"REPORTS_LIST\"\r\n />\r\n );\r\n }\r\n\r\n return (\r\n <LocalizationProvider dateAdapter={AdapterDayjs}>\r\n <Box sx={{ background: C.bg, minHeight: \"100vh\" }}>\r\n <PageHeader\r\n title=\" Performance Report\"\r\n actions={\r\n <Stack direction=\"row\" alignItems=\"center\" spacing={1}>\r\n <SearchBar\r\n value={search}\r\n onChange={setSearch}\r\n placeholder=\"Search name, ID...\"\r\n width={250}\r\n />\r\n <SDKPermissionGuard\r\n permissions={[SDK_PERMISSIONS.REPORTS_AGENT_PERFORMANCE_EXPORT, SDK_PERMISSIONS.REPORTS_AGENT_PERFORMANCE_MANAGE]}\r\n showFallback={false}\r\n >\r\n <AppButton\r\n startIcon={<FileDownloadIcon sx={{ fontSize: \"0.95rem !important\" }} />}\r\n disabled={!data.length}\r\n onClick={handleExportExcel}\r\n sx={{ height: 36 }}\r\n >\r\n Export Excel\r\n </AppButton>\r\n </SDKPermissionGuard>\r\n </Stack>\r\n }\r\n />\r\n\r\n <ReportFilterBar\r\n startDate={startDate}\r\n endDate={endDate}\r\n onStartChange={setStartDate}\r\n onEndChange={setEndDate}\r\n quickRange={quickRange}\r\n onQuickRangeChange={handleQuickRangeChange}\r\n showAgentSelect\r\n selectedAgents={selectedUsers}\r\n onAgentsChange={setSelectedUsers}\r\n setIsAllUsersSelected={setIsAllUsersSelected}\r\n showQueueSelect\r\n queues={queues}\r\n selectedQueues={selectedQueues}\r\n onQueuesChange={setSelectedQueues}\r\n showProcessSelect\r\n processes={processes}\r\n selectedProcess={process}\r\n onProcessChange={setProcess}\r\n extra={\r\n <AppButton\r\n startIcon={<RefreshIcon sx={{ fontSize: \"0.9rem !important\" }} />}\r\n disabled={loading}\r\n onClick={handleRefresh}\r\n sx={{ height: 32 }}\r\n >\r\n Refresh\r\n </AppButton>\r\n }\r\n />\r\n\r\n {error && <Alert severity=\"error\" sx={{ mx: 2.5, mt: 1.5 }} onClose={() => setError(\"\")}>{error}</Alert>}\r\n\r\n <Box sx={{ py: 2, px: 1, overflow: \"auto\", position: \"relative\" }}>\r\n {loading && (\r\n <Box sx={{ position: \"absolute\", top: 0, left: 0, right: 0, bottom: 0, background: \"rgba(240,244,248,0.7)\", display: \"flex\", alignItems: \"center\", justifyContent: \"center\", zIndex: 10 }}>\r\n <CircularProgress />\r\n </Box>\r\n )}\r\n\r\n <Paper elevation={0} sx={{ borderRadius: \"8px\", border: \"1px solid #e0e7ef\", overflow: \"hidden\", mb: 2 }}>\r\n <TableContainer>\r\n <Table size=\"small\" sx={{\r\n minWidth: 1400,\r\n \"& .MuiTableCell-root\": { fontSize: \"0.75rem\", borderBottom: \"1px solid #eef1f6\", py: 0.6, px: 1 },\r\n }}>\r\n <TableHead>\r\n <TableRow>\r\n {activeCols.map((col) => (\r\n <TableCell key={col.key} align={col.align || \"left\"} sx={headSx}>\r\n <TableSortLabel active={orderBy === col.key} direction={orderBy === col.key ? order : \"asc\"} onClick={() => handleSort(col.key)} sx={sortLabelSx}>\r\n {col.label}\r\n </TableSortLabel>\r\n </TableCell>\r\n ))}\r\n <TableCell sx={{ ...headSx, width: 48 }}>Detail</TableCell>\r\n </TableRow>\r\n </TableHead>\r\n <TableBody>\r\n {paged.map((row, idx) => (\r\n <TableRow key={idx} hover onClick={() => setSelectedAgent(row)} sx={{\r\n backgroundColor: \"#fff\",\r\n \"&:hover\": { backgroundColor: \"#f0f7f8\" },\r\n cursor: \"pointer\",\r\n }}>\r\n {activeCols.map((col) => (\r\n <TableCell key={col.key} align={col.align || \"left\"} sx={bodySx}>\r\n {renderCellValue(row, col)}\r\n </TableCell>\r\n ))}\r\n <TableCell sx={bodySx} align=\"center\">\r\n <IconButton size=\"small\" onClick={(e) => { e.stopPropagation(); setSelectedAgent(row); }} sx={{ color: C.blue }}>\r\n <VisibilityIcon sx={{ fontSize: 16 }} />\r\n </IconButton>\r\n </TableCell>\r\n </TableRow>\r\n ))}\r\n {paged.length === 0 && (\r\n <TableRow><TableCell colSpan={activeCols.length + 1} sx={{ textAlign: \"center\", py: 4, color: C.t3, fontSize: 13 }}>No data found</TableCell></TableRow>\r\n )}\r\n </TableBody>\r\n </Table>\r\n </TableContainer>\r\n\r\n <TablePagination\r\n component=\"div\" count={totalCount} page={page}\r\n onPageChange={handlePageChange} rowsPerPage={rowsPerPage}\r\n onRowsPerPageChange={(e) => { setRowsPerPage(parseInt(e.target.value, 10)); setPage(0); }}\r\n rowsPerPageOptions={[10, 15, 25, 50, 100]}\r\n sx={{ borderTop: \"1px solid #eef1f6\", \"& .MuiTablePagination-displayedRows\": { fontSize: \"0.73rem\" }, \"& .MuiTablePagination-selectLabel\": { fontSize: \"0.73rem\" } }}\r\n />\r\n </Paper>\r\n </Box>\r\n </Box>\r\n </LocalizationProvider>\r\n );\r\n}\r\n\r\nconst AgentPerformanceReport: React.FC = () => (\r\n <SDKProvider>\r\n <AgentPerformanceReportContent />\r\n </SDKProvider>\r\n);\r\n\r\nexport default AgentPerformanceReport;\r\n","import { useCallback, useState } from \"react\";\r\nimport axiosInstance from \"../../services/axios\";\r\nimport { END_POINT } from \"../../services/endPoint\";\r\nimport type { AgentPerfReportParams, AgentPerfReportResponse, AgentPerfRow, ReportData, ReportRequestPayload } from \"./types\";\r\n\r\nfunction fmtSecs(s: number): string {\r\n\tif (!s || s <= 0) return \"00:00:00\";\r\n\tconst h = Math.floor(s / 3600);\r\n\tconst m = Math.floor((s % 3600) / 60);\r\n\tconst sc = Math.floor(s % 60);\r\n\treturn [h, m, sc].map((x) => String(x).padStart(2, \"0\")).join(\":\");\r\n}\r\n\r\nexport function validateReportPayload(payload: Partial<ReportRequestPayload>): { isValid: boolean; error?: string } {\r\n\tif (!payload.startDate || !payload.startTime) return { isValid: false, error: \"Start date/time required\" };\r\n\tif (!payload.endDate || !payload.endTime) return { isValid: false, error: \"End date/time required\" };\r\n\tif (!payload.loginUsersOnly && !payload.agents) return { isValid: false, error: \"Select at least one agent\" };\r\n\treturn { isValid: true };\r\n}\r\n\r\n// Map a raw AgentPerfRow into the legacy ReportData shape the table renders.\r\nfunction mapAgentPerfRow(a: AgentPerfRow): ReportData {\r\n\treturn {\r\n\t\tagentDetails: { agentId: a.agentId, fullName: a.fullName, process: a.processName, queueNames: a.queueNames },\r\n\t\tcalls: { totalCalls: a.totalCalls, answered: a.answeredCalls, missed: a.missedCalls },\r\n\t\tinCalls: { total: a.inCalls },\r\n\t\toutCalls: { total: a.outCalls },\r\n\t\taverage: { holdTime: fmtSecs(a.holdTimeSeconds), wrapUp: fmtSecs(a.wrapupSeconds), aht: fmtSecs(a.ahtSeconds), ringing: \"00:00:00\", dialing: \"00:00:00\" },\r\n\t\tloginDetails: { loggedInDuration: fmtSecs(a.loginDurationSeconds), talkTime: fmtSecs(a.talkTimeSeconds), idleTime: fmtSecs(a.idleTimeSeconds) },\r\n\t\tbreaks: { shortBreak: fmtSecs(a.breakTimeSeconds), breakCount: a.breakCount, lunch: \"00:00:00\", tea: \"00:00:00\", training: \"00:00:00\", meeting: \"00:00:00\" },\r\n\t\tloginStats: { firstLogin: a.firstLoginTime || \"\", noOfLogins: 0 },\r\n\t\tadherence: { pct: a.adherencePct ?? null },\r\n\t};\r\n}\r\n\r\nexport async function getUserPerformanceReport(payload: ReportRequestPayload): Promise<ReportData[]> {\r\n\tconst params: AgentPerfReportParams = {\r\n\t\tstart_date: payload.startDate,\r\n\t\tend_date: payload.endDate,\r\n\t\tagent_id: payload.agents,\r\n\t\tqueue_id: payload.queueIds && payload.queueIds.length > 0 ? payload.queueIds : undefined,\r\n\t\t// Always send page + pageSize; callers that don't paginate get the full list.\r\n\t\tpage: payload.page ?? 1,\r\n\t\tpageSize: payload.pageSize ?? 500,\r\n\t\tsearch: payload.search,\r\n\t};\r\n\t// Use the combined endpoint, which honours page/pageSize/search.\r\n\tconst res = await axiosInstance.get<AgentPerfReportResponse>(\r\n\t\t`${END_POINT.AGENT_PERFORMANCE_REPORT}${buildQs(params)}`,\r\n\t);\r\n\tconst agentsPage: any = (res.data as any)?.agents;\r\n\tconst agents: AgentPerfRow[] = Array.isArray(agentsPage)\r\n\t\t? agentsPage\r\n\t\t: Array.isArray(agentsPage?.data)\r\n\t\t\t? agentsPage.data\r\n\t\t\t: [];\r\n\treturn agents.map(mapAgentPerfRow);\r\n}\r\n\r\n/**\r\n * Paginated variant — returns the mapped rows for the current page plus the\r\n * real total (so the table shows \"1–25 of N\").\r\n */\r\nexport async function getUserPerformanceReportPaged(\r\n\tpayload: ReportRequestPayload,\r\n): Promise<{ rows: ReportData[]; total: number }> {\r\n\tconst params: AgentPerfReportParams = {\r\n\t\tstart_date: payload.startDate,\r\n\t\tend_date: payload.endDate,\r\n\t\tagent_id: payload.agents,\r\n\t\tqueue_id: payload.queueIds && payload.queueIds.length > 0 ? payload.queueIds : undefined,\r\n\t\tpage: payload.page ?? 1,\r\n\t\tpageSize: payload.pageSize ?? 10,\r\n\t\tsearch: payload.search,\r\n\t};\r\n\tconst res = await axiosInstance.get<AgentPerfReportResponse>(\r\n\t\t`${END_POINT.AGENT_PERFORMANCE_REPORT}${buildQs(params)}`,\r\n\t);\r\n\tconst data = res.data;\r\n\t// `agents` is a paginated envelope ({ data, total, ... }); support a bare array for older shapes.\r\n\tconst agentsPage: any = (data as any)?.agents;\r\n\tconst rawRows: AgentPerfRow[] = Array.isArray(agentsPage)\r\n\t\t? agentsPage\r\n\t\t: Array.isArray(agentsPage?.data)\r\n\t\t\t? agentsPage.data\r\n\t\t\t: [];\r\n\tconst rows = rawRows.map(mapAgentPerfRow);\r\n\tconst total =\r\n\t\tagentsPage?.total ??\r\n\t\t(data as any)?.total ??\r\n\t\t(data as any)?.pagination?.total ??\r\n\t\tdata?.summary?.agentsLoggedIn ??\r\n\t\trows.length;\r\n\treturn { rows, total };\r\n}\r\n\r\nexport interface Queue {\r\n\tid: number;\r\n\tname: string;\r\n\tdescription: string;\r\n\tprocessId?: number;\r\n\tisActive: boolean;\r\n}\r\n\r\nexport interface Process {\r\n\tid: number;\r\n\tname: string;\r\n\tdescription: string;\r\n\tisActive: boolean;\r\n}\r\n\r\nexport async function fetchQueues(): Promise<Queue[]> {\r\n\tconst res = await axiosInstance.get(END_POINT.MASTER_QUEUES);\r\n\tif (Array.isArray(res.data)) return res.data;\r\n\tif (Array.isArray(res.data?.data)) return res.data.data;\r\n\treturn [];\r\n}\r\n\r\nexport async function fetchProcesses(): Promise<Process[]> {\r\n\tconst res = await axiosInstance.get(END_POINT.MASTER_PROCESS);\r\n\tif (Array.isArray(res.data)) return res.data;\r\n\tif (Array.isArray(res.data?.data)) return res.data.data;\r\n\treturn [];\r\n}\r\n\r\nfunction buildQs(params: AgentPerfReportParams): string {\r\n\tconst qs = new URLSearchParams();\r\n\tif (params.start_date) qs.append(\"start_date\", params.start_date);\r\n\tif (params.end_date) qs.append(\"end_date\", params.end_date);\r\n\tif (params.agent_id) for (const id of params.agent_id) qs.append(\"agent_id\", id);\r\n\tif (params.queue_id) for (const id of params.queue_id) qs.append(\"queue_id\", String(id));\r\n\tif (params.process_id) for (const id of params.process_id) qs.append(\"process_id\", String(id));\r\n\tif (params.top_n) qs.append(\"top_n\", String(params.top_n));\r\n\tif (params.search) qs.append(\"search\", params.search);\r\n\tif (params.page) qs.append(\"page\", String(params.page));\r\n\tif (params.pageSize) qs.append(\"pageSize\", String(params.pageSize));\r\n\tconst str = qs.toString();\r\n\treturn str ? `?${str}` : \"\";\r\n}\r\n\r\nexport function useAgentPerformanceReport() {\r\n\tconst [agents, setAgents] = useState<AgentPerfRow[]>([]);\r\n\tconst [loading, setLoading] = useState(false);\r\n\tconst [error, setError] = useState(\"\");\r\n\r\n\tconst fetchAgents = useCallback(async (params: AgentPerfReportParams) => {\r\n\t\tsetLoading(true);\r\n\t\tsetError(\"\");\r\n\t\ttry {\r\n\t\t\tconst res = await axiosInstance.get<AgentPerfRow[]>(\r\n\t\t\t\t`${END_POINT.AGENT_PERFORMANCE_REPORT_AGENTS}${params}`,\r\n\t\t\t);\r\n\t\t\tsetAgents(Array.isArray(res.data) ? res.data : []);\r\n\t\t} catch (err: any) {\r\n\t\t\tsetError(err?.response?.data?.message || err?.message || \"Failed to fetch performance report\");\r\n\t\t\tsetAgents([]);\r\n\t\t} finally {\r\n\t\t\tsetLoading(false);\r\n\t\t}\r\n\t}, []);\r\n\r\n\tconst exportExcel = useCallback(async (params: AgentPerfReportParams) => {\r\n\t\tconst res = await axiosInstance.get(\r\n\t\t\t`${END_POINT.AGENT_PERFORMANCE_REPORT_EXPORT_EXCEL}${buildQs(params)}`,\r\n\t\t\t{ responseType: \"blob\" },\r\n\t\t);\r\n\t\tconst url = URL.createObjectURL(new Blob([res.data]));\r\n\t\tconst a = document.createElement(\"a\");\r\n\t\ta.href = url;\r\n\t\ta.download = `agent-performance-${params.start_date ?? \"export\"}.xlsx`;\r\n\t\ta.click();\r\n\t\tURL.revokeObjectURL(url);\r\n\t}, []);\r\n\r\n\treturn { agents, loading, error, setError, fetchAgents, exportExcel };\r\n}\r\n\r\nexport async function exportAgentPerformanceToExcel(params: AgentPerfReportParams): Promise<void> {\r\n\tconst res = await axiosInstance.get(\r\n\t\t`${END_POINT.AGENT_PERFORMANCE_REPORT_EXPORT_EXCEL}${buildQs(params)}`,\r\n\t\t{ responseType: \"blob\" },\r\n\t);\r\n\tconst url = URL.createObjectURL(new Blob([res.data]));\r\n\tconst a = document.createElement(\"a\");\r\n\ta.href = url;\r\n\ta.download = `agent-performance-${params.start_date ?? \"export\"}.xlsx`;\r\n\ta.click();\r\n\tURL.revokeObjectURL(url);\r\n}\r\n"],"mappings":"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","names":["useState","useCallback","useState","data","useCallback"]}