ahs-cti 1.0.1-beta.9 → 1.0.2-beta.2

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 (35) hide show
  1. package/dist/agentDetailReport-EXJZOAWB.mjs +9 -0
  2. package/dist/agentDetailReport-EXJZOAWB.mjs.map +1 -0
  3. package/dist/agentPerformanceReport-WJEQKLIL.mjs +510 -0
  4. package/dist/agentPerformanceReport-WJEQKLIL.mjs.map +1 -0
  5. package/dist/{callHistory-Q44VVLPU.mjs → callHistory-PJV7ZX3R.mjs} +22 -27
  6. package/dist/callHistory-PJV7ZX3R.mjs.map +1 -0
  7. package/dist/campaigns-UMAMUUDZ.mjs +2752 -0
  8. package/dist/campaigns-UMAMUUDZ.mjs.map +1 -0
  9. package/dist/cdrReport-4DLCPYQ4.mjs +547 -0
  10. package/dist/cdrReport-4DLCPYQ4.mjs.map +1 -0
  11. package/dist/chunk-3SHCNPBA.mjs +742 -0
  12. package/dist/chunk-3SHCNPBA.mjs.map +1 -0
  13. package/dist/chunk-APYLQRX7.mjs +49 -0
  14. package/dist/chunk-APYLQRX7.mjs.map +1 -0
  15. package/dist/chunk-G5Q2CBVN.mjs +208 -0
  16. package/dist/chunk-G5Q2CBVN.mjs.map +1 -0
  17. package/dist/chunk-HADAFS7N.mjs +144 -0
  18. package/dist/chunk-HADAFS7N.mjs.map +1 -0
  19. package/dist/chunk-I5VT6XXH.mjs +115 -0
  20. package/dist/chunk-I5VT6XXH.mjs.map +1 -0
  21. package/dist/chunk-KNTFDU2K.mjs +486 -0
  22. package/dist/chunk-KNTFDU2K.mjs.map +1 -0
  23. package/dist/{chunk-F67ABL74.mjs → chunk-NDBIVYJT.mjs} +122 -6
  24. package/dist/chunk-NDBIVYJT.mjs.map +1 -0
  25. package/dist/index.d.mts +187 -6
  26. package/dist/index.d.ts +188 -7
  27. package/dist/index.js +6776 -420
  28. package/dist/index.js.map +1 -1
  29. package/dist/index.mjs +320 -371
  30. package/dist/index.mjs.map +1 -1
  31. package/dist/loginReport-JTW2KEUN.mjs +805 -0
  32. package/dist/loginReport-JTW2KEUN.mjs.map +1 -0
  33. package/package.json +16 -1
  34. package/dist/callHistory-Q44VVLPU.mjs.map +0 -1
  35. package/dist/chunk-F67ABL74.mjs.map +0 -1
@@ -0,0 +1,9 @@
1
+ import {
2
+ agentDetailReport_default
3
+ } from "./chunk-3SHCNPBA.mjs";
4
+ import "./chunk-G5Q2CBVN.mjs";
5
+ import "./chunk-NDBIVYJT.mjs";
6
+ export {
7
+ agentDetailReport_default as default
8
+ };
9
+ //# sourceMappingURL=agentDetailReport-EXJZOAWB.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,510 @@
1
+ import {
2
+ ReportFilterBar,
3
+ SearchBar,
4
+ headCellSx,
5
+ reportBodyCellSx,
6
+ sortLabelSx
7
+ } from "./chunk-KNTFDU2K.mjs";
8
+ import {
9
+ SDKPermissionGuard
10
+ } from "./chunk-HADAFS7N.mjs";
11
+ import {
12
+ agentDetailReport_default
13
+ } from "./chunk-3SHCNPBA.mjs";
14
+ import {
15
+ AppButton,
16
+ PageHeader
17
+ } from "./chunk-G5Q2CBVN.mjs";
18
+ import {
19
+ END_POINT,
20
+ SDKProvider,
21
+ SDK_PERMISSIONS,
22
+ __spreadProps,
23
+ __spreadValues,
24
+ axios_default
25
+ } from "./chunk-NDBIVYJT.mjs";
26
+
27
+ // call-control-sdk/lib/pages/agentPerformanceReport/index.tsx
28
+ import { useState as useState2, useEffect, useCallback as useCallback2, useMemo } from "react";
29
+ import {
30
+ Box,
31
+ Paper,
32
+ Table,
33
+ TableBody,
34
+ TableCell,
35
+ TableContainer,
36
+ TableHead,
37
+ TableRow,
38
+ TableSortLabel,
39
+ TablePagination,
40
+ CircularProgress,
41
+ Alert,
42
+ Stack,
43
+ IconButton
44
+ } from "@mui/material";
45
+ import FileDownloadIcon from "@mui/icons-material/FileDownload";
46
+ import RefreshIcon from "@mui/icons-material/Refresh";
47
+ import VisibilityIcon from "@mui/icons-material/Visibility";
48
+ import dayjs from "dayjs";
49
+ 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
+
53
+ // call-control-sdk/lib/pages/agentPerformanceReport/useAgentPerformanceReport.ts
54
+ import { useCallback, useState } from "react";
55
+ function fmtSecs(s) {
56
+ if (!s || s <= 0) return "00:00:00";
57
+ const h = Math.floor(s / 3600);
58
+ const m = Math.floor(s % 3600 / 60);
59
+ const sc = Math.floor(s % 60);
60
+ return [h, m, sc].map((x) => String(x).padStart(2, "0")).join(":");
61
+ }
62
+ function validateReportPayload(payload) {
63
+ if (!payload.startDate || !payload.startTime) return { isValid: false, error: "Start date/time required" };
64
+ if (!payload.endDate || !payload.endTime) return { isValid: false, error: "End date/time required" };
65
+ if (!payload.loginUsersOnly && !payload.agents) return { isValid: false, error: "Select at least one agent" };
66
+ return { isValid: true };
67
+ }
68
+ async function getUserPerformanceReport(payload) {
69
+ const params = {
70
+ start_date: payload.startDate,
71
+ end_date: payload.endDate,
72
+ agent_id: payload.agents,
73
+ queue_id: payload.queueIds && payload.queueIds.length > 0 ? payload.queueIds : void 0
74
+ };
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
+ const res = await axios_default.get(
82
+ `${END_POINT.AGENT_PERFORMANCE_REPORT_AGENTS}${qsStr ? `?${qsStr}` : ""}`
83
+ );
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
+ });
98
+ }
99
+ async function fetchQueues() {
100
+ var _a;
101
+ const res = await axios_default.get(END_POINT.MASTER_QUEUES);
102
+ if (Array.isArray(res.data)) return res.data;
103
+ if (Array.isArray((_a = res.data) == null ? void 0 : _a.data)) return res.data.data;
104
+ return [];
105
+ }
106
+ async function fetchProcesses() {
107
+ var _a;
108
+ const res = await axios_default.get(END_POINT.MASTER_PROCESS);
109
+ if (Array.isArray(res.data)) return res.data;
110
+ if (Array.isArray((_a = res.data) == null ? void 0 : _a.data)) return res.data.data;
111
+ return [];
112
+ }
113
+ async function exportAgentPerformanceToExcel(params) {
114
+ var _a;
115
+ const qs = new URLSearchParams();
116
+ if (params.start_date) qs.append("start_date", params.start_date);
117
+ if (params.end_date) qs.append("end_date", params.end_date);
118
+ if (params.agent_id) for (const id of params.agent_id) qs.append("agent_id", id);
119
+ if (params.queue_id) for (const id of params.queue_id) qs.append("queue_id", String(id));
120
+ const qsStr = qs.toString();
121
+ const res = await axios_default.get(
122
+ `${END_POINT.AGENT_PERFORMANCE_REPORT_EXPORT_EXCEL}${qsStr ? `?${qsStr}` : ""}`,
123
+ { responseType: "blob" }
124
+ );
125
+ const url = URL.createObjectURL(new Blob([res.data]));
126
+ const a = document.createElement("a");
127
+ a.href = url;
128
+ a.download = `agent-performance-${(_a = params.start_date) != null ? _a : "export"}.xlsx`;
129
+ a.click();
130
+ URL.revokeObjectURL(url);
131
+ }
132
+
133
+ // call-control-sdk/lib/pages/agentPerformanceReport/index.tsx
134
+ import { jsx, jsxs } from "react/jsx-runtime";
135
+ dayjs.extend(isoWeek);
136
+ var C = {
137
+ navy: "#0d2a56",
138
+ blue: "#1565c8",
139
+ green: "#0a9a62",
140
+ amber: "#c47c00",
141
+ red: "#cc2a2a",
142
+ purple: "#6b3fbf",
143
+ teal: "#0b7a8f",
144
+ bg: "transparent",
145
+ surface: "#fff",
146
+ s2: "#f7f9fc",
147
+ s3: "#eef2f7",
148
+ b1: "rgba(20,50,100,.07)",
149
+ b2: "rgba(20,50,100,.13)",
150
+ t1: "#0d1e35",
151
+ t2: "#364f6e",
152
+ t3: "#7a93b5",
153
+ t4: "#bccad9",
154
+ blt: "#e8f0fc",
155
+ glt: "#e4f6ef",
156
+ alt: "#fdf3e0",
157
+ rlt: "#fde8e8",
158
+ plt: "#f0eafa",
159
+ tlt: "#e3f4f7"
160
+ };
161
+ function parseDur(d) {
162
+ if (!d || d === "00:00:00") return 0;
163
+ const p = d.split(":").map(Number);
164
+ if (p.length === 3) return p[0] * 3600 + p[1] * 60 + p[2];
165
+ if (p.length === 2) return p[0] * 60 + p[1];
166
+ return 0;
167
+ }
168
+ function fmtDur(s) {
169
+ if (!s || s <= 0) return "00:00:00";
170
+ const h = Math.floor(s / 3600);
171
+ const m = Math.floor(s % 3600 / 60);
172
+ const sc = Math.floor(s % 60);
173
+ return [h, m, sc].map((x) => String(x).padStart(2, "0")).join(":");
174
+ }
175
+ function getVal(row, key) {
176
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _A, _B;
177
+ switch (key) {
178
+ case "id":
179
+ return ((_a = row.agentDetails) == null ? void 0 : _a.agentId) || "";
180
+ case "name":
181
+ return ((_b = row.agentDetails) == null ? void 0 : _b.fullName) || "";
182
+ case "process":
183
+ return ((_c = row.agentDetails) == null ? void 0 : _c.process) || "";
184
+ case "queue":
185
+ return ((_d = row.agentDetails) == null ? void 0 : _d.queueNames) || "";
186
+ case "total":
187
+ return (_f = (_e = row.calls) == null ? void 0 : _e.totalCalls) != null ? _f : 0;
188
+ case "ans":
189
+ return (_h = (_g = row.calls) == null ? void 0 : _g.answered) != null ? _h : 0;
190
+ case "miss":
191
+ return (_j = (_i = row.calls) == null ? void 0 : _i.missed) != null ? _j : 0;
192
+ case "inTotal":
193
+ return (_l = (_k = row.inCalls) == null ? void 0 : _k.total) != null ? _l : 0;
194
+ case "outTotal":
195
+ return (_n = (_m = row.outCalls) == null ? void 0 : _m.total) != null ? _n : 0;
196
+ case "aht":
197
+ return parseDur(((_o = row.average) == null ? void 0 : _o.aht) || "00:00:00");
198
+ case "loginDur":
199
+ return parseDur(((_p = row.loginDetails) == null ? void 0 : _p.loggedInDuration) || "00:00:00");
200
+ case "talk":
201
+ return parseDur(((_q = row.loginDetails) == null ? void 0 : _q.talkTime) || "00:00:00");
202
+ case "hold":
203
+ return parseDur(((_r = row.average) == null ? void 0 : _r.holdTime) || "00:00:00");
204
+ case "wrapup":
205
+ return parseDur(((_s = row.average) == null ? void 0 : _s.wrapUp) || "00:00:00");
206
+ case "breakTime":
207
+ return parseDur(((_t = row.breaks) == null ? void 0 : _t.lunch) || "00:00:00") + parseDur(((_u = row.breaks) == null ? void 0 : _u.tea) || "00:00:00") + parseDur(((_v = row.breaks) == null ? void 0 : _v.training) || "00:00:00") + parseDur(((_w = row.breaks) == null ? void 0 : _w.meeting) || "00:00:00") + parseDur(((_x = row.breaks) == null ? void 0 : _x.shortBreak) || "00:00:00");
208
+ case "idle":
209
+ return parseDur(((_y = row.loginDetails) == null ? void 0 : _y.idleTime) || "00:00:00");
210
+ case "adherence":
211
+ return (_A = (_z = row.adherence) == null ? void 0 : _z.pct) != null ? _A : null;
212
+ case "firstLogin":
213
+ return ((_B = row.loginStats) == null ? void 0 : _B.firstLogin) || "";
214
+ default:
215
+ return "";
216
+ }
217
+ }
218
+ var COLUMNS = [
219
+ { key: "id", label: "User ID", group: "Agent" },
220
+ { key: "name", label: "Full Name", group: "Agent" },
221
+ { key: "queue", label: "Queues", group: "Agent" },
222
+ { key: "total", label: "Total Calls", group: "Calls", align: "right" },
223
+ { key: "ans", label: "Answered", group: "Calls", align: "right" },
224
+ { key: "miss", label: "Missed", group: "Calls", align: "right" },
225
+ { key: "inTotal", label: "Inbound", group: "Calls", align: "right" },
226
+ { key: "outTotal", label: "Outbound", group: "Calls", align: "right" },
227
+ { key: "aht", label: "AHT", group: "Time", align: "right" },
228
+ { key: "loginDur", label: "Login Dur", group: "Time", align: "right" },
229
+ { key: "talk", label: "Talk Time", group: "Time", align: "right" },
230
+ { key: "hold", label: "Hold Time", group: "Time", align: "right" },
231
+ { key: "wrapup", label: "Wrapup Time", group: "Time", align: "right" },
232
+ { key: "breakTime", label: "Break Time", group: "Breaks", align: "right" },
233
+ { key: "idle", label: "Idle Time", group: "Time", align: "right" },
234
+ { key: "firstLogin", label: "First Login", group: "Login" },
235
+ { key: "adherence", label: "Adherence %", group: "Agent", align: "right" }
236
+ ];
237
+ function AgentPerformanceReportContent() {
238
+ const [startDate, setStartDate] = useState2(dayjs().startOf("day"));
239
+ const [endDate, setEndDate] = useState2(dayjs());
240
+ const [quickRange, setQuickRange] = useState2("today");
241
+ const [selectedUsers, setSelectedUsers] = useState2([]);
242
+ const [processes, setProcesses] = useState2([]);
243
+ const [process, setProcess] = useState2("");
244
+ const [search, setSearch] = useState2("");
245
+ const [loginUsersOnly] = useState2(true);
246
+ const [queues, setQueues] = useState2([]);
247
+ const [selectedQueues, setSelectedQueues] = useState2([]);
248
+ const [data, setData] = useState2([]);
249
+ const [loading, setLoading] = useState2(false);
250
+ const [error, setError] = useState2("");
251
+ const [selectedAgent, setSelectedAgent] = useState2(null);
252
+ const [orderBy, setOrderBy] = useState2("total");
253
+ const [order, setOrder] = useState2("desc");
254
+ const [page, setPage] = useState2(0);
255
+ const [rowsPerPage, setRowsPerPage] = useState2(10);
256
+ const [visibleCols] = useState2(new Set(COLUMNS.map((c) => c.key)));
257
+ useEffect(() => {
258
+ fetchProcesses().then((p) => {
259
+ const mapped = p.map((x) => ({ label: x.name, value: x.name }));
260
+ setProcesses(mapped);
261
+ if (mapped.length) setProcess(mapped[0].value);
262
+ }).catch(() => {
263
+ });
264
+ fetchQueues().then((data2) => setQueues(data2 || [])).catch(() => {
265
+ });
266
+ }, []);
267
+ const handleQuickRangeChange = (range) => {
268
+ setQuickRange(range);
269
+ };
270
+ const handleRefresh = () => {
271
+ if (quickRange === "today" || quickRange === "week" || quickRange === "month") {
272
+ const now = dayjs();
273
+ let sd = now.startOf("day");
274
+ const ed = now;
275
+ if (quickRange === "week") sd = now.startOf("week").startOf("day");
276
+ else if (quickRange === "month") sd = now.startOf("month").startOf("day");
277
+ setStartDate(sd);
278
+ setEndDate(ed);
279
+ fetchReport(sd, ed);
280
+ } else {
281
+ fetchReport();
282
+ }
283
+ };
284
+ const fetchReport = useCallback2(async (sd, ed) => {
285
+ const fromDate = sd != null ? sd : startDate;
286
+ const toDate = ed != null ? ed : endDate;
287
+ if (!fromDate || !toDate) {
288
+ setError("Select date range");
289
+ return;
290
+ }
291
+ const payload = {
292
+ startDate: fromDate.format("YYYY-MM-DDTHH:mm:ss"),
293
+ endDate: toDate.format("YYYY-MM-DDTHH:mm:ss"),
294
+ startTime: fromDate.format("HH:mm:ss"),
295
+ endTime: toDate.format("HH:mm:ss"),
296
+ process,
297
+ agents: selectedUsers.map((u) => u.userId),
298
+ loginUsersOnly,
299
+ queueIds: selectedQueues.length > 0 ? selectedQueues.map((q) => q.id) : void 0
300
+ };
301
+ const valid = validateReportPayload(payload);
302
+ if (!valid.isValid) {
303
+ setError(valid.error || "Invalid");
304
+ return;
305
+ }
306
+ try {
307
+ setLoading(true);
308
+ setError("");
309
+ setPage(0);
310
+ const res = await getUserPerformanceReport(payload);
311
+ setData(Array.isArray(res) ? res : []);
312
+ } catch (err) {
313
+ setError((err == null ? void 0 : err.message) || "Failed to fetch report");
314
+ setData([]);
315
+ } finally {
316
+ setLoading(false);
317
+ }
318
+ }, [startDate, endDate, process, selectedUsers, selectedQueues, loginUsersOnly]);
319
+ useEffect(() => {
320
+ if (startDate && endDate) {
321
+ fetchReport();
322
+ }
323
+ }, [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]);
337
+ const sorted = useMemo(() => {
338
+ return [...filtered].sort((a, b) => {
339
+ const av = getVal(a, orderBy);
340
+ const bv = getVal(b, orderBy);
341
+ if (typeof av === "number" && typeof bv === "number") return order === "asc" ? av - bv : bv - av;
342
+ return order === "asc" ? String(av).localeCompare(String(bv)) : String(bv).localeCompare(String(av));
343
+ });
344
+ }, [filtered, orderBy, order]);
345
+ const paged = sorted.slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage);
346
+ const handleSort = (key) => {
347
+ setOrder(orderBy === key && order === "asc" ? "desc" : "asc");
348
+ setOrderBy(key);
349
+ };
350
+ const handleExportExcel = async () => {
351
+ const fromDate = startDate;
352
+ const toDate = endDate;
353
+ if (!fromDate || !toDate) {
354
+ setError("Select date range");
355
+ return;
356
+ }
357
+ const params = {
358
+ start_date: fromDate.format("YYYY-MM-DDTHH:mm:ss"),
359
+ 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
362
+ };
363
+ try {
364
+ await exportAgentPerformanceToExcel(params);
365
+ } catch (err) {
366
+ setError((err == null ? void 0 : err.message) || "Failed to export Excel");
367
+ }
368
+ };
369
+ const renderCellValue = (row, col) => {
370
+ const v = getVal(row, col.key);
371
+ const durKeys = ["aht", "loginDur", "talk", "hold", "wrapup", "breakTime", "idle"];
372
+ if (durKeys.includes(col.key)) return fmtDur(v);
373
+ if (col.key === "adherence") return v != null ? `${v}%` : "\u2014";
374
+ if (col.key === "firstLogin") return v ? dayjs(v).format("DD MMM YYYY hh:mm A") : "";
375
+ return v != null ? v : "";
376
+ };
377
+ const activeCols = COLUMNS.filter((c) => visibleCols.has(c.key));
378
+ if (selectedAgent) {
379
+ return /* @__PURE__ */ jsx(
380
+ agentDetailReport_default,
381
+ {
382
+ agentRow: selectedAgent,
383
+ onBack: () => setSelectedAgent(null),
384
+ initialStartDate: startDate,
385
+ initialEndDate: endDate,
386
+ initialQuickRange: quickRange,
387
+ from: "REPORTS_LIST"
388
+ }
389
+ );
390
+ }
391
+ return /* @__PURE__ */ jsx(LocalizationProvider, { dateAdapter: AdapterDayjs, children: /* @__PURE__ */ jsxs(Box, { sx: { background: C.bg, minHeight: "100vh" }, children: [
392
+ /* @__PURE__ */ jsx(
393
+ PageHeader,
394
+ {
395
+ title: " Performance Report",
396
+ actions: /* @__PURE__ */ jsxs(Stack, { direction: "row", alignItems: "center", spacing: 1, children: [
397
+ /* @__PURE__ */ jsx(
398
+ SearchBar,
399
+ {
400
+ value: search,
401
+ onChange: setSearch,
402
+ placeholder: "Search name, ID...",
403
+ width: 250
404
+ }
405
+ ),
406
+ /* @__PURE__ */ jsx(
407
+ SDKPermissionGuard,
408
+ {
409
+ permissions: [SDK_PERMISSIONS.REPORTS_AGENT_PERFORMANCE_EXPORT, SDK_PERMISSIONS.REPORTS_AGENT_PERFORMANCE_MANAGE],
410
+ showFallback: false,
411
+ children: /* @__PURE__ */ jsx(
412
+ AppButton,
413
+ {
414
+ startIcon: /* @__PURE__ */ jsx(FileDownloadIcon, { sx: { fontSize: "0.95rem !important" } }),
415
+ disabled: !data.length,
416
+ onClick: handleExportExcel,
417
+ sx: { height: 36 },
418
+ children: "Export Excel"
419
+ }
420
+ )
421
+ }
422
+ )
423
+ ] })
424
+ }
425
+ ),
426
+ /* @__PURE__ */ jsx(
427
+ ReportFilterBar,
428
+ {
429
+ startDate,
430
+ endDate,
431
+ onStartChange: setStartDate,
432
+ onEndChange: setEndDate,
433
+ quickRange,
434
+ onQuickRangeChange: handleQuickRangeChange,
435
+ showAgentSelect: true,
436
+ selectedAgents: selectedUsers,
437
+ onAgentsChange: setSelectedUsers,
438
+ showQueueSelect: true,
439
+ queues,
440
+ selectedQueues,
441
+ onQueuesChange: setSelectedQueues,
442
+ showProcessSelect: true,
443
+ processes,
444
+ selectedProcess: process,
445
+ onProcessChange: setProcess,
446
+ extra: /* @__PURE__ */ jsx(
447
+ AppButton,
448
+ {
449
+ startIcon: /* @__PURE__ */ jsx(RefreshIcon, { sx: { fontSize: "0.9rem !important" } }),
450
+ disabled: loading,
451
+ onClick: handleRefresh,
452
+ sx: { height: 32 },
453
+ children: "Refresh"
454
+ }
455
+ )
456
+ }
457
+ ),
458
+ error && /* @__PURE__ */ jsx(Alert, { severity: "error", sx: { mx: 2.5, mt: 1.5 }, onClose: () => setError(""), children: error }),
459
+ /* @__PURE__ */ jsxs(Box, { sx: { py: 2, px: 1, overflow: "auto", position: "relative" }, children: [
460
+ loading && /* @__PURE__ */ jsx(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 }, children: /* @__PURE__ */ jsx(CircularProgress, {}) }),
461
+ /* @__PURE__ */ jsxs(Paper, { elevation: 0, sx: { borderRadius: "8px", border: "1px solid #e0e7ef", overflow: "hidden", mb: 2 }, children: [
462
+ /* @__PURE__ */ jsx(TableContainer, { children: /* @__PURE__ */ jsxs(Table, { size: "small", sx: {
463
+ minWidth: 1400,
464
+ "& .MuiTableCell-root": { fontSize: "0.75rem", borderBottom: "1px solid #eef1f6", py: 0.6, px: 1 }
465
+ }, children: [
466
+ /* @__PURE__ */ jsx(TableHead, { children: /* @__PURE__ */ jsxs(TableRow, { children: [
467
+ activeCols.map((col) => /* @__PURE__ */ jsx(TableCell, { align: col.align || "left", sx: headCellSx, children: /* @__PURE__ */ jsx(TableSortLabel, { active: orderBy === col.key, direction: orderBy === col.key ? order : "asc", onClick: () => handleSort(col.key), sx: sortLabelSx, children: col.label }) }, col.key)),
468
+ /* @__PURE__ */ jsx(TableCell, { sx: __spreadProps(__spreadValues({}, headCellSx), { width: 48 }), children: "Detail" })
469
+ ] }) }),
470
+ /* @__PURE__ */ jsxs(TableBody, { children: [
471
+ paged.map((row, idx) => /* @__PURE__ */ jsxs(TableRow, { hover: true, onClick: () => setSelectedAgent(row), sx: {
472
+ backgroundColor: "#fff",
473
+ "&:hover": { backgroundColor: "#f0f7f8" },
474
+ cursor: "pointer"
475
+ }, children: [
476
+ activeCols.map((col) => /* @__PURE__ */ jsx(TableCell, { align: col.align || "left", sx: reportBodyCellSx, children: renderCellValue(row, col) }, col.key)),
477
+ /* @__PURE__ */ jsx(TableCell, { sx: reportBodyCellSx, align: "center", children: /* @__PURE__ */ jsx(IconButton, { size: "small", onClick: (e) => {
478
+ e.stopPropagation();
479
+ setSelectedAgent(row);
480
+ }, sx: { color: C.blue }, children: /* @__PURE__ */ jsx(VisibilityIcon, { sx: { fontSize: 16 } }) }) })
481
+ ] }, idx)),
482
+ paged.length === 0 && /* @__PURE__ */ jsx(TableRow, { children: /* @__PURE__ */ jsx(TableCell, { colSpan: activeCols.length + 1, sx: { textAlign: "center", py: 4, color: C.t3, fontSize: 13 }, children: "No data found" }) })
483
+ ] })
484
+ ] }) }),
485
+ /* @__PURE__ */ jsx(
486
+ TablePagination,
487
+ {
488
+ component: "div",
489
+ count: filtered.length,
490
+ page,
491
+ onPageChange: (_, p) => setPage(p),
492
+ rowsPerPage,
493
+ onRowsPerPageChange: (e) => {
494
+ setRowsPerPage(parseInt(e.target.value, 10));
495
+ setPage(0);
496
+ },
497
+ rowsPerPageOptions: [5, 10, 20, 25, 50],
498
+ sx: { borderTop: "1px solid #eef1f6", "& .MuiTablePagination-displayedRows": { fontSize: "0.73rem" }, "& .MuiTablePagination-selectLabel": { fontSize: "0.73rem" } }
499
+ }
500
+ )
501
+ ] })
502
+ ] })
503
+ ] }) });
504
+ }
505
+ var AgentPerformanceReport = () => /* @__PURE__ */ jsx(SDKProvider, { children: /* @__PURE__ */ jsx(AgentPerformanceReportContent, {}) });
506
+ var agentPerformanceReport_default = AgentPerformanceReport;
507
+ export {
508
+ agentPerformanceReport_default as default
509
+ };
510
+ //# sourceMappingURL=agentPerformanceReport-WJEQKLIL.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 } 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 getUserPerformanceReport, 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 [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 [visibleCols] = useState<Set<string>>(new Set(COLUMNS.map((c) => c.key)));\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 setStartDate(sd);\r\n setEndDate(ed);\r\n fetchReport(sd, ed);\r\n } else {\r\n fetchReport();\r\n }\r\n };\r\n\r\n const fetchReport = useCallback(async (sd?: Dayjs | null, ed?: Dayjs | null) => {\r\n const fromDate = sd ?? startDate;\r\n const toDate = ed ?? 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: selectedUsers.map((u) => u.userId),\r\n loginUsersOnly,\r\n queueIds: selectedQueues.length > 0 ? selectedQueues.map((q) => q.id) : undefined,\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 setPage(0);\r\n const res = await getUserPerformanceReport(payload);\r\n setData(Array.isArray(res) ? res : []);\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, selectedQueues, loginUsersOnly]);\r\n\r\n useEffect(() => {\r\n if (startDate && endDate) {\r\n fetchReport();\r\n }\r\n }, [fetchReport]);\r\n\r\n const filtered = useMemo(() => {\r\n let d = data;\r\n if (search) {\r\n const s = search.toLowerCase();\r\n d = d.filter((r) =>\r\n (r.agentDetails?.fullName || \"\").toLowerCase().includes(s) ||\r\n (r.agentDetails?.agentId || \"\").toLowerCase().includes(s)\r\n );\r\n }\r\n return d;\r\n }, [data, search]);\r\n\r\n const sorted = useMemo(() => {\r\n return [...filtered].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 }, [filtered, orderBy, order]);\r\n\r\n const paged = sorted.slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage);\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: selectedUsers.length > 0 ? selectedUsers.map((u) => u.userId) : undefined,\r\n queue_id: selectedQueues.length > 0 ? selectedQueues.map((q) => q.id) : 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 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={filtered.length} page={page}\r\n onPageChange={(_, p) => setPage(p)} rowsPerPage={rowsPerPage}\r\n onRowsPerPageChange={(e) => { setRowsPerPage(parseInt(e.target.value, 10)); setPage(0); }}\r\n rowsPerPageOptions={[5, 10, 20, 25, 50]}\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, 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\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};\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\tconst qsStr = qs.toString();\r\n\tconst res = await axiosInstance.get<AgentPerfRow[]>(\r\n\t\t`${END_POINT.AGENT_PERFORMANCE_REPORT_AGENTS}${qsStr ? `?${qsStr}` : \"\"}`,\r\n\t);\r\n\treturn (Array.isArray(res.data) ? res.data : []).map((a: AgentPerfRow) => ({\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 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\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}${buildQs(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 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\tconst qsStr = qs.toString();\r\n\tconst res = await axiosInstance.get(\r\n\t\t`${END_POINT.AGENT_PERFORMANCE_REPORT_EXPORT_EXCEL}${qsStr ? `?${qsStr}` : \"\"}`,\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"]}