ahs-cti 1.0.1-beta.9 → 1.0.2-beta.1
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.
- package/dist/agentDetailReport-2Z5I7XNO.mjs +9 -0
- package/dist/agentDetailReport-2Z5I7XNO.mjs.map +1 -0
- package/dist/agentPerformanceReport-XVYNBFXB.mjs +510 -0
- package/dist/agentPerformanceReport-XVYNBFXB.mjs.map +1 -0
- package/dist/{callHistory-Q44VVLPU.mjs → callHistory-RFHCXVJA.mjs} +22 -27
- package/dist/callHistory-RFHCXVJA.mjs.map +1 -0
- package/dist/campaigns-KUDBCYHP.mjs +2752 -0
- package/dist/campaigns-KUDBCYHP.mjs.map +1 -0
- package/dist/cdrReport-ZSITXXEP.mjs +547 -0
- package/dist/cdrReport-ZSITXXEP.mjs.map +1 -0
- package/dist/chunk-DRD72WVS.mjs +742 -0
- package/dist/chunk-DRD72WVS.mjs.map +1 -0
- package/dist/chunk-G5Q2CBVN.mjs +208 -0
- package/dist/chunk-G5Q2CBVN.mjs.map +1 -0
- package/dist/chunk-I5VT6XXH.mjs +115 -0
- package/dist/chunk-I5VT6XXH.mjs.map +1 -0
- package/dist/chunk-JGYXK7TO.mjs +486 -0
- package/dist/chunk-JGYXK7TO.mjs.map +1 -0
- package/dist/chunk-MR7Z44GR.mjs +49 -0
- package/dist/chunk-MR7Z44GR.mjs.map +1 -0
- package/dist/{chunk-F67ABL74.mjs → chunk-WROV2G6D.mjs} +119 -6
- package/dist/chunk-WROV2G6D.mjs.map +1 -0
- package/dist/chunk-XIRHJLJS.mjs +144 -0
- package/dist/chunk-XIRHJLJS.mjs.map +1 -0
- package/dist/index.d.mts +187 -6
- package/dist/index.d.ts +188 -7
- package/dist/index.js +6769 -418
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +316 -369
- package/dist/index.mjs.map +1 -1
- package/dist/loginReport-FPRGQUEF.mjs +805 -0
- package/dist/loginReport-FPRGQUEF.mjs.map +1 -0
- package/package.json +16 -1
- package/dist/callHistory-Q44VVLPU.mjs.map +0 -1
- package/dist/chunk-F67ABL74.mjs.map +0 -1
|
@@ -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-JGYXK7TO.mjs";
|
|
8
|
+
import {
|
|
9
|
+
SDKPermissionGuard
|
|
10
|
+
} from "./chunk-XIRHJLJS.mjs";
|
|
11
|
+
import {
|
|
12
|
+
agentDetailReport_default
|
|
13
|
+
} from "./chunk-DRD72WVS.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-WROV2G6D.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-XVYNBFXB.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"]}
|