ahs-cti 1.0.1-beta.55 → 1.0.1-beta.56

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.
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  AuditReportFullPage
3
- } from "./chunk-6KZFBOWQ.mjs";
3
+ } from "./chunk-222NEEHY.mjs";
4
4
  import "./chunk-2W7AY4QJ.mjs";
5
5
  import "./chunk-VQCHBU2Q.mjs";
6
6
 
@@ -12,4 +12,4 @@ function AuditReportPage({ callUuid }) {
12
12
  export {
13
13
  AuditReportPage as default
14
14
  };
15
- //# sourceMappingURL=auditReport-EL6N3RWV.mjs.map
15
+ //# sourceMappingURL=auditReport-FYPKH5GO.mjs.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  AuditReportDialog
3
- } from "./chunk-6KZFBOWQ.mjs";
3
+ } from "./chunk-222NEEHY.mjs";
4
4
  import {
5
5
  ReportFilterBar,
6
6
  SearchBar,
@@ -553,6 +553,20 @@ function CdrReportContent() {
553
553
  },
554
554
  children: [
555
555
  /* @__PURE__ */ jsx(TableHead, { children: /* @__PURE__ */ jsxs(TableRow, { children: [
556
+ /* @__PURE__ */ jsx(
557
+ TableCell,
558
+ {
559
+ sx: __spreadProps(__spreadValues({}, headCellSx), { minWidth: 110, textAlign: "center" }),
560
+ children: "Audit Report"
561
+ }
562
+ ),
563
+ /* @__PURE__ */ jsx(
564
+ TableCell,
565
+ {
566
+ sx: __spreadProps(__spreadValues({}, headCellSx), { minWidth: 100 }),
567
+ children: "Recording"
568
+ }
569
+ ),
556
570
  [
557
571
  { id: "phoneNumber", label: "Phone Number" },
558
572
  { id: "callStartTime", label: "Call Start" },
@@ -603,21 +617,7 @@ function CdrReportContent() {
603
617
  },
604
618
  children: col.label
605
619
  }
606
- ) }, col.id)),
607
- /* @__PURE__ */ jsx(
608
- TableCell,
609
- {
610
- sx: __spreadProps(__spreadValues({}, headCellSx), { minWidth: 220 }),
611
- children: "Recording"
612
- }
613
- ),
614
- /* @__PURE__ */ jsx(
615
- TableCell,
616
- {
617
- sx: __spreadProps(__spreadValues({}, headCellSx), { minWidth: 110 }),
618
- children: "Audit Report"
619
- }
620
- )
620
+ ) }, col.id))
621
621
  ] }) }),
622
622
  /* @__PURE__ */ jsx(TableBody, { children: sortedRecords.map((row, idx) => /* @__PURE__ */ jsxs(
623
623
  TableRow,
@@ -628,6 +628,25 @@ function CdrReportContent() {
628
628
  "&:hover": { backgroundColor: "#f0f7f8" }
629
629
  },
630
630
  children: [
631
+ /* @__PURE__ */ jsx(TableCell, { sx: { textAlign: "center", verticalAlign: "middle" }, children: /* @__PURE__ */ jsx(Tooltip, { title: "View Audit Report", children: /* @__PURE__ */ jsx(
632
+ IconButton,
633
+ {
634
+ size: "small",
635
+ onClick: () => {
636
+ setSelectedAuditRow(row);
637
+ setAuditDialogOpen(true);
638
+ },
639
+ sx: { color: COLORS.blue, p: 0.4 },
640
+ children: /* @__PURE__ */ jsx(AssignmentIcon, { sx: { fontSize: 16 } })
641
+ }
642
+ ) }) }),
643
+ /* @__PURE__ */ jsx(TableCell, { sx: { verticalAlign: "middle" }, children: row.callUuid ? /* @__PURE__ */ jsx(
644
+ RecordingCell,
645
+ {
646
+ callUuid: row.callUuid,
647
+ recordingPath: row.recordingPath
648
+ }
649
+ ) : null }),
631
650
  /* @__PURE__ */ jsx(
632
651
  TableCell,
633
652
  {
@@ -763,26 +782,7 @@ function CdrReportContent() {
763
782
  borderRadius: "6px"
764
783
  }
765
784
  }
766
- ) }),
767
- /* @__PURE__ */ jsx(TableCell, { children: row.callUuid ? /* @__PURE__ */ jsx(
768
- RecordingCell,
769
- {
770
- callUuid: row.callUuid,
771
- recordingPath: row.recordingPath
772
- }
773
- ) : null }),
774
- /* @__PURE__ */ jsx(TableCell, { children: /* @__PURE__ */ jsx(Tooltip, { title: "View Audit Report", children: /* @__PURE__ */ jsx(
775
- IconButton,
776
- {
777
- size: "small",
778
- onClick: () => {
779
- setSelectedAuditRow(row);
780
- setAuditDialogOpen(true);
781
- },
782
- sx: { color: COLORS.blue, p: 0.4 },
783
- children: /* @__PURE__ */ jsx(AssignmentIcon, { sx: { fontSize: 16 } })
784
- }
785
- ) }) })
785
+ ) })
786
786
  ]
787
787
  },
788
788
  row.callUuid || idx
@@ -842,4 +842,4 @@ var cdrReport_default = CdrReport;
842
842
  export {
843
843
  cdrReport_default as default
844
844
  };
845
- //# sourceMappingURL=cdrReport-5KKSCFOL.mjs.map
845
+ //# sourceMappingURL=cdrReport-3UVMWQNB.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../call-control-sdk/lib/pages/cdrReport/index.tsx","../call-control-sdk/lib/pages/cdrReport/useCdrReport.ts"],"sourcesContent":["import React, {\r\n useCallback,\r\n useEffect,\r\n useMemo,\r\n useRef,\r\n useState,\r\n} from \"react\";\r\nimport {\r\n Alert,\r\n Box,\r\n Chip,\r\n Paper,\r\n Stack,\r\n Table,\r\n TableBody,\r\n TableCell,\r\n TableContainer,\r\n TableHead,\r\n TableRow,\r\n TablePagination,\r\n TableSortLabel,\r\n CircularProgress,\r\n IconButton,\r\n Tooltip,\r\n} from \"@mui/material\";\r\nimport AppButton from \"../common/components/AppButton\";\r\nimport AuditReportDialog from \"../common/components/AuditReport\";\r\n\r\nimport ReportFilterBar, {\r\n type QuickRange,\r\n} from \"../common/components/ReportFilterBar\";\r\nimport DownloadIcon from \"@mui/icons-material/Download\";\r\nimport RefreshIcon from \"@mui/icons-material/Refresh\";\r\nimport PlayArrowIcon from \"@mui/icons-material/PlayArrow\";\r\nimport FileDownloadIcon from \"@mui/icons-material/FileDownload\";\r\nimport AssignmentIcon from \"@mui/icons-material/Assignment\";\r\n\r\nimport dayjs, { Dayjs } from \"dayjs\";\r\nimport isoWeek from \"dayjs/plugin/isoWeek\";\r\n\r\nimport { LocalizationProvider } from \"@mui/x-date-pickers/LocalizationProvider\";\r\nimport { AdapterDayjs } from \"@mui/x-date-pickers/AdapterDayjs\";\r\nimport {\r\n getCdrReport,\r\n exportCdrReportToExcel,\r\n getRecordingByCall,\r\n getQueues,\r\n type Queue,\r\n} from \"./useCdrReport\";\r\nimport { deepFindArray } from \"../../services/axios\";\r\nimport type { CdrReportParams, CdrRecordResponse } from \"./types\";\r\nimport { type AgentOption } from \"../common/components/AgentMultiSelect\";\r\nimport { headCellSx } 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\n\r\ndayjs.extend(isoWeek);\r\n\r\nconst FONT =\r\n \"'Inter', 'Segoe UI', 'Roboto', -apple-system, BlinkMacSystemFont, sans-serif\";\r\n\r\nconst COLORS = {\r\n navy: \"#0d2a56\",\r\n blue: \"#1565c8\",\r\n green: \"#0a9a62\",\r\n amber: \"#c47c00\",\r\n red: \"#cc2a2a\",\r\n purple: \"#6b3fbf\",\r\n bg: \"transparent\",\r\n surface: \"transparent\",\r\n} as const;\r\n\r\nconst DEFAULT_PAGE_SIZE = 15;\r\n\r\ntype SortKey =\r\n | \"phoneNumber\"\r\n | \"callStartTime\"\r\n | \"callType\"\r\n | \"callStatus\"\r\n | \"agentName\"\r\n | \"queueName\"\r\n | \"extension\"\r\n | \"talkDurationFmt\"\r\n | \"holdDurationFmt\"\r\n | \"ringingDurationFmt\"\r\n | \"queueDurationFmt\"\r\n | \"wrapupDurationFmt\"\r\n | \"disposition\"\r\n | \"remarks\"\r\n | \"wasTransferred\";\r\n\r\ntype SortDir = \"asc\" | \"desc\";\r\n\r\nconst comparator = (\r\n a: CdrRecordResponse,\r\n b: CdrRecordResponse,\r\n key: SortKey,\r\n): number => {\r\n const av = a[key as keyof CdrRecordResponse];\r\n const bv = b[key as keyof CdrRecordResponse];\r\n if (typeof av === \"number\" && typeof bv === \"number\") return av - bv;\r\n if (typeof av === \"boolean\" && typeof bv === \"boolean\")\r\n return (av ? 1 : 0) - (bv ? 1 : 0);\r\n return String(av ?? \"\").localeCompare(String(bv ?? \"\"));\r\n};\r\n\r\nfunction CallTypePill({ value }: { value: string }) {\r\n const v = (value || \"\").toLowerCase();\r\n let color = \"#6b7b8d\";\r\n let bg = \"transparent\";\r\n if (v.includes(\"inbound\")) {\r\n color = COLORS.green;\r\n bg = \"#e6f7ef\";\r\n } else if (v.includes(\"outbound\")) {\r\n color = COLORS.blue;\r\n bg = \"#e3eefa\";\r\n } else if (v.includes(\"internal\")) {\r\n color = COLORS.purple;\r\n bg = \"#f0e8ff\";\r\n }\r\n return (\r\n <Chip\r\n label={value}\r\n size=\"small\"\r\n sx={{\r\n fontFamily: FONT,\r\n bgcolor: bg,\r\n color,\r\n fontWeight: 600,\r\n fontSize: \"0.65rem\",\r\n height: 20,\r\n borderRadius: \"6px\",\r\n }}\r\n />\r\n );\r\n}\r\n\r\nfunction StatusPill({ value }: { value: string }) {\r\n const v = (value || \"\").toLowerCase();\r\n let color = \"#6b7b8d\";\r\n let bg = \"transparent\";\r\n if (v.includes(\"answered\")) {\r\n color = COLORS.green;\r\n bg = \"#e6f7ef\";\r\n } else if (v.includes(\"abandoned\") || v.includes(\"missed\")) {\r\n color = COLORS.red;\r\n bg = \"#fce8e8\";\r\n }\r\n return (\r\n <Chip\r\n label={value}\r\n size=\"small\"\r\n sx={{\r\n fontFamily: FONT,\r\n bgcolor: bg,\r\n color,\r\n fontWeight: 600,\r\n fontSize: \"0.65rem\",\r\n height: 20,\r\n borderRadius: \"6px\",\r\n }}\r\n />\r\n );\r\n}\r\n\r\nfunction RecordingCell({\r\n callUuid,\r\n recordingPath,\r\n}: {\r\n callUuid: string;\r\n recordingPath: string | null;\r\n}) {\r\n const [audioUrl, setAudioUrl] = useState<string | null>(null);\r\n const [loading, setLoading] = useState(false);\r\n const [error, setError] = useState(false);\r\n const unavailable = recordingPath === null;\r\n\r\n const handlePlay = async () => {\r\n if (audioUrl) return;\r\n try {\r\n setLoading(true);\r\n setError(false);\r\n const blob = await getRecordingByCall(callUuid);\r\n const url = URL.createObjectURL(blob);\r\n setAudioUrl(url);\r\n } catch {\r\n setError(true);\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n const handleDownload = async () => {\r\n try {\r\n const blob = audioUrl\r\n ? await fetch(audioUrl).then((r) => r.blob())\r\n : await getRecordingByCall(callUuid);\r\n const url = URL.createObjectURL(blob);\r\n const a = document.createElement(\"a\");\r\n a.href = url;\r\n a.download = `recording_${callUuid}.wav`;\r\n a.click();\r\n URL.revokeObjectURL(url);\r\n } catch {\r\n /* ignore */\r\n }\r\n };\r\n\r\n if (audioUrl) {\r\n return (\r\n <Box sx={{ display: \"flex\", alignItems: \"center\", gap: 0.5 }}>\r\n <audio\r\n controls\r\n autoPlay\r\n src={audioUrl}\r\n onEnded={() => {\r\n if (audioUrl.startsWith(\"blob:\")) URL.revokeObjectURL(audioUrl);\r\n setAudioUrl(null);\r\n }}\r\n style={{ width: 180, height: 30 }}\r\n />\r\n <Tooltip title=\"Download\">\r\n <IconButton\r\n size=\"small\"\r\n onClick={handleDownload}\r\n sx={{ color: COLORS.blue, p: 0.4 }}\r\n >\r\n <FileDownloadIcon sx={{ fontSize: 16 }} />\r\n </IconButton>\r\n </Tooltip>\r\n </Box>\r\n );\r\n }\r\n\r\n return (\r\n <Box sx={{ display: \"flex\", alignItems: \"center\", gap: 0.3 }}>\r\n <Tooltip title={unavailable || error ? \"Recording Unavailable\" : \"Play\"}>\r\n <span>\r\n <IconButton\r\n size=\"small\"\r\n onClick={handlePlay}\r\n disabled={loading || error || unavailable}\r\n sx={{ color: unavailable ? \"#b0b8c8\" : COLORS.green, p: 0.4 }}\r\n >\r\n {loading ? (\r\n <CircularProgress size={14} />\r\n ) : (\r\n <PlayArrowIcon sx={{ fontSize: 16 }} />\r\n )}\r\n </IconButton>\r\n </span>\r\n </Tooltip>\r\n <Tooltip\r\n title={unavailable || error ? \"Recording Unavailable\" : \"Download\"}\r\n >\r\n <span>\r\n <IconButton\r\n size=\"small\"\r\n onClick={handleDownload}\r\n disabled={loading || error || unavailable}\r\n sx={{ color: unavailable ? \"#b0b8c8\" : COLORS.blue, p: 0.4 }}\r\n >\r\n <FileDownloadIcon sx={{ fontSize: 16 }} />\r\n </IconButton>\r\n </span>\r\n </Tooltip>\r\n </Box>\r\n );\r\n}\r\n\r\nfunction CdrReportContent() {\r\n const [startDate, setStartDate] = useState<Dayjs | null>(\r\n dayjs().startOf(\"day\"),\r\n );\r\n const [endDate, setEndDate] = useState<Dayjs | null>(dayjs());\r\n const [activeQuickDate, setActiveQuickDate] = useState<\r\n \"today\" | \"week\" | \"month\" | null\r\n >(\"today\");\r\n const [searchText, setSearchText] = useState(\"\");\r\n\r\n const [selectedAgents, setSelectedAgents] = useState<AgentOption[]>([]);\r\n const [isAllUsersSelected, setIsAllUsersSelected] = useState(false);\r\n\r\n const [queues, setQueues] = useState<Queue[]>([]);\r\n const [selectedQueues, setSelectedQueues] = useState<Queue[]>([]);\r\n\r\n const [callType, setCallType] = useState<string>(\"\");\r\n const [callStatus, setCallStatus] = useState<string>(\"\");\r\n\r\n const [records, setRecords] = useState<CdrRecordResponse[]>([]);\r\n const [totalRecords, setTotalRecords] = useState(0);\r\n const [loading, setLoading] = useState(false);\r\n const [error, setError] = useState(\"\");\r\n\r\n const [page, setPage] = useState(0);\r\n const [rowsPerPage, setRowsPerPage] = useState(DEFAULT_PAGE_SIZE);\r\n const [sortKey, setSortKey] = useState<SortKey>(\"callStartTime\");\r\n const [sortDir, setSortDir] = useState<SortDir>(\"desc\");\r\n\r\n const [auditDialogOpen, setAuditDialogOpen] = useState(false);\r\n const [selectedAuditRow, setSelectedAuditRow] =\r\n useState<CdrRecordResponse | null>(null);\r\n\r\n useEffect(() => {\r\n getQueues()\r\n .then((data) => setQueues(data || []))\r\n .catch(() => setError(\"Failed to load filter options\"));\r\n }, []);\r\n\r\n const handleQuickRangeChange = (range: QuickRange) => {\r\n setActiveQuickDate(range || null);\r\n };\r\n\r\n const [debouncedSearch, setDebouncedSearch] = useState(\"\");\r\n const debounceRef = useRef<ReturnType<typeof setTimeout>>(undefined);\r\n\r\n useEffect(() => {\r\n debounceRef.current = setTimeout(\r\n () => setDebouncedSearch(searchText.trim()),\r\n 400,\r\n );\r\n return () => clearTimeout(debounceRef.current);\r\n }, [searchText]);\r\n\r\n const fetchReport = useCallback(\r\n async (pageNum: number) => {\r\n const sd = startDate ?? dayjs();\r\n const ed = endDate ?? dayjs();\r\n\r\n if (!sd || !ed) {\r\n setError(\"Select a valid date range\");\r\n return;\r\n }\r\n\r\n const params: CdrReportParams = {\r\n start_date: sd.format(\"YYYY-MM-DDTHH:mm:ss\"),\r\n end_date: ed.format(\"YYYY-MM-DDTHH:mm:ss\"),\r\n agent_id:\r\n !isAllUsersSelected && selectedAgents.length > 0\r\n ? selectedAgents.map((a) => a.id)\r\n : undefined,\r\n // All queues selected → send no queue_id (backend returns all).\r\n queue_id:\r\n selectedQueues.length > 0 && selectedQueues.length < queues.length\r\n ? selectedQueues.map((q) => q.id)\r\n : undefined,\r\n call_type: callType || undefined,\r\n status: callStatus || undefined,\r\n search: debouncedSearch || undefined,\r\n page: pageNum + 1,\r\n pageSize: rowsPerPage,\r\n };\r\n\r\n try {\r\n setError(\"\");\r\n setLoading(true);\r\n const response: any = await getCdrReport(params);\r\n setRecords(\r\n deepFindArray<CdrRecordResponse>(response, [\"data\", \"records\"]),\r\n );\r\n setTotalRecords(\r\n response?.records?.total ??\r\n response?.total ??\r\n response?.data?.total ??\r\n 0,\r\n );\r\n } catch (err: any) {\r\n setError(err?.message || \"Failed to fetch CDR report\");\r\n setRecords([]);\r\n } finally {\r\n setLoading(false);\r\n }\r\n },\r\n [\r\n startDate,\r\n endDate,\r\n selectedAgents,\r\n isAllUsersSelected,\r\n selectedQueues,\r\n callType,\r\n callStatus,\r\n debouncedSearch,\r\n rowsPerPage,\r\n ],\r\n );\r\n\r\n useEffect(() => {\r\n setPage(0);\r\n fetchReport(0);\r\n }, [fetchReport]);\r\n\r\n const handleRefresh = () => {\r\n if (activeQuickDate) {\r\n const now = dayjs();\r\n let sd = now.startOf(\"day\");\r\n const ed = now;\r\n if (activeQuickDate === \"week\") sd = now.startOf(\"week\").startOf(\"day\");\r\n else if (activeQuickDate === \"month\")\r\n sd = now.startOf(\"month\").startOf(\"day\");\r\n setStartDate(sd);\r\n setEndDate(ed);\r\n } else {\r\n fetchReport(page);\r\n }\r\n };\r\n\r\n const handlePageChange = useCallback(\r\n (_event: React.MouseEvent<HTMLButtonElement> | null, newPage: number) => {\r\n setPage(newPage);\r\n fetchReport(newPage);\r\n },\r\n [fetchReport],\r\n );\r\n\r\n const handleSort = (key: SortKey) => {\r\n if (sortKey === key) {\r\n setSortDir((d) => (d === \"asc\" ? \"desc\" : \"asc\"));\r\n } else {\r\n setSortKey(key);\r\n setSortDir(\"asc\");\r\n }\r\n };\r\n\r\n const sortedRecords = useMemo(() => {\r\n const rows = [...records];\r\n rows.sort((a, b) => {\r\n const cmp = comparator(a, b, sortKey);\r\n return sortDir === \"asc\" ? cmp : -cmp;\r\n });\r\n return rows;\r\n }, [records, sortKey, sortDir]);\r\n\r\n const handleExportExcel = async () => {\r\n const sd = startDate ?? dayjs();\r\n const ed = endDate ?? dayjs();\r\n const params: CdrReportParams = {\r\n start_date: sd.format(\"YYYY-MM-DDTHH:mm:ss\"),\r\n end_date: ed.format(\"YYYY-MM-DDTHH:mm:ss\"),\r\n agent_id:\r\n !isAllUsersSelected && selectedAgents.length > 0\r\n ? selectedAgents.map((a) => a.id)\r\n : undefined,\r\n queue_id:\r\n selectedQueues.length > 0 && selectedQueues.length < queues.length\r\n ? selectedQueues.map((q) => q.id)\r\n : undefined,\r\n call_type: callType || undefined,\r\n status: callStatus || undefined,\r\n search: debouncedSearch || undefined,\r\n };\r\n try {\r\n await exportCdrReportToExcel(params);\r\n } catch (err: any) {\r\n setError(err?.message || \"Failed to export Excel\");\r\n }\r\n };\r\n\r\n return (\r\n <LocalizationProvider dateAdapter={AdapterDayjs}>\r\n <Box\r\n sx={{\r\n height: \"100%\",\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n fontFamily: FONT,\r\n }}\r\n >\r\n <PageHeader\r\n title=\"CDR Report\"\r\n actions={\r\n <Stack direction=\"row\" alignItems=\"center\" spacing={1}>\r\n <SearchBar\r\n value={searchText}\r\n onChange={setSearchText}\r\n placeholder=\"Search phone, agent...\"\r\n width={250}\r\n />\r\n <SDKPermissionGuard\r\n permissions={[\r\n SDK_PERMISSIONS.REPORTS_CDR_EXPORT,\r\n SDK_PERMISSIONS.REPORTS_CDR_MANAGE,\r\n ]}\r\n showFallback={false}\r\n >\r\n <AppButton\r\n startIcon={\r\n <DownloadIcon sx={{ fontSize: \"0.95rem !important\" }} />\r\n }\r\n disabled={!records.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 <Box sx={{ flex: 1, overflow: \"auto\", py: 0.8, px: 0 }}>\r\n <Box sx={{ mb: 0.8 }}>\r\n <ReportFilterBar\r\n startDate={startDate}\r\n endDate={endDate}\r\n onStartChange={setStartDate}\r\n onEndChange={setEndDate}\r\n quickRange={activeQuickDate || \"\"}\r\n onQuickRangeChange={handleQuickRangeChange}\r\n showAgentSelect\r\n selectedAgents={selectedAgents}\r\n onAgentsChange={setSelectedAgents}\r\n setIsAllUsersSelected={setIsAllUsersSelected}\r\n showQueueSelect\r\n queues={queues}\r\n selectedQueues={selectedQueues}\r\n onQueuesChange={setSelectedQueues}\r\n showCallTypeSelect\r\n selectedCallType={callType}\r\n onCallTypeChange={setCallType}\r\n showStatusSelect\r\n selectedStatus={callStatus}\r\n onStatusChange={setCallStatus}\r\n extra={\r\n <AppButton\r\n startIcon={\r\n <RefreshIcon sx={{ fontSize: \"0.9rem !important\" }} />\r\n }\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 && (\r\n <Alert\r\n severity=\"error\"\r\n sx={{ mt: 1, fontFamily: FONT, fontSize: \"0.78rem\" }}\r\n >\r\n {error}\r\n </Alert>\r\n )}\r\n </Box>\r\n\r\n {loading && (\r\n <Box sx={{ textAlign: \"center\", py: 2.5 }}>\r\n <CircularProgress sx={{ color: COLORS.blue }} size={28} />\r\n </Box>\r\n )}\r\n\r\n <Paper\r\n elevation={0}\r\n sx={{\r\n borderRadius: \"8px\",\r\n border: \"1px solid #e0e7ef\",\r\n overflow: \"hidden\",\r\n mb: 2,\r\n }}\r\n >\r\n <TableContainer>\r\n <Table\r\n size=\"small\"\r\n sx={{\r\n minWidth: 1400,\r\n fontFamily: FONT,\r\n \"& .MuiTableCell-root\": {\r\n fontFamily: FONT,\r\n fontSize: \"0.75rem\",\r\n borderBottom: \"1px solid #eef1f6\",\r\n py: 0.6,\r\n px: 1,\r\n },\r\n }}\r\n >\r\n <TableHead>\r\n <TableRow>\r\n <TableCell\r\n sx={{ ...(headCellSx as object), minWidth: 110, textAlign: \"center\" }}\r\n >\r\n Audit Report\r\n </TableCell>\r\n <TableCell\r\n sx={{ ...(headCellSx as object), minWidth: 100 }}\r\n >\r\n Recording\r\n </TableCell>\r\n {(\r\n [\r\n { id: \"phoneNumber\" as SortKey, label: \"Phone Number\" },\r\n { id: \"callStartTime\" as SortKey, label: \"Call Start\" },\r\n { id: \"callType\" as SortKey, label: \"Call Type\" },\r\n { id: \"callStatus\" as SortKey, label: \"Status\" },\r\n { id: \"agentName\" as SortKey, label: \"User Name\" },\r\n { id: \"queueName\" as SortKey, label: \"Queues\" },\r\n { id: \"extension\" as SortKey, label: \"Extension\" },\r\n {\r\n id: \"talkDurationFmt\" as SortKey,\r\n label: \"Talk Duration\",\r\n },\r\n {\r\n id: \"holdDurationFmt\" as SortKey,\r\n label: \"Hold Duration\",\r\n },\r\n {\r\n id: \"ringingDurationFmt\" as SortKey,\r\n label: \"Ringing Duration\",\r\n },\r\n {\r\n id: \"queueDurationFmt\" as SortKey,\r\n label: \"Queue Duration\",\r\n },\r\n {\r\n id: \"wrapupDurationFmt\" as SortKey,\r\n label: \"Wrapup Duration\",\r\n },\r\n { id: \"disposition\" as SortKey, label: \"Disposition\" },\r\n { id: \"remarks\" as SortKey, label: \"Remarks\" },\r\n {\r\n id: \"wasTransferred\" as SortKey,\r\n label: \"Transferred\",\r\n },\r\n ] as { id: SortKey; label: string }[]\r\n ).map((col) => (\r\n <TableCell key={col.id} sx={headCellSx}>\r\n <TableSortLabel\r\n active={sortKey === col.id}\r\n direction={sortKey === col.id ? sortDir : \"asc\"}\r\n onClick={() => handleSort(col.id)}\r\n sx={{\r\n \"&.MuiTableSortLabel-root\": { color: \"#333\" },\r\n \"&.MuiTableSortLabel-root:hover\": { color: \"#555\" },\r\n \"&.Mui-active\": { color: \"#333\" },\r\n \"& .MuiTableSortLabel-icon\": {\r\n color: \"#333 !important\",\r\n },\r\n }}\r\n >\r\n {col.label}\r\n </TableSortLabel>\r\n </TableCell>\r\n ))}\r\n </TableRow>\r\n </TableHead>\r\n\r\n <TableBody>\r\n {sortedRecords.map((row, idx) => (\r\n <TableRow\r\n key={row.callUuid || idx}\r\n hover\r\n sx={{\r\n backgroundColor: \"#fff\",\r\n \"&:hover\": { backgroundColor: \"#f0f7f8\" },\r\n }}\r\n >\r\n <TableCell sx={{ textAlign: \"center\", verticalAlign: \"middle\" }}>\r\n <Tooltip title=\"View Audit Report\">\r\n <IconButton\r\n size=\"small\"\r\n onClick={() => {\r\n setSelectedAuditRow(row);\r\n setAuditDialogOpen(true);\r\n }}\r\n sx={{ color: COLORS.blue, p: 0.4 }}\r\n >\r\n <AssignmentIcon sx={{ fontSize: 16 }} />\r\n </IconButton>\r\n </Tooltip>\r\n </TableCell>\r\n <TableCell sx={{ verticalAlign: \"middle\" }}>\r\n {row.callUuid ? (\r\n <RecordingCell\r\n callUuid={row.callUuid}\r\n recordingPath={row.recordingPath}\r\n />\r\n ) : null}\r\n </TableCell>\r\n <TableCell\r\n sx={{\r\n fontWeight: 600,\r\n color: COLORS.navy,\r\n fontSize: \"0.75rem\",\r\n }}\r\n >\r\n {row.phoneNumber || \"\"}\r\n </TableCell>\r\n <TableCell sx={{ fontSize: \"0.73rem\", color: \"#4a5568\" }}>\r\n {row.callStartTime\r\n ? dayjs(row.callStartTime).format(\r\n \"DD MMM YYYY hh:mm A\",\r\n )\r\n : \"\"}\r\n </TableCell>\r\n <TableCell>\r\n <CallTypePill value={row.callType || \"\"} />\r\n </TableCell>\r\n <TableCell>\r\n <StatusPill value={row.callStatus || \"\"} />\r\n </TableCell>\r\n <TableCell sx={{ fontSize: \"0.73rem\", color: \"#4a5568\" }}>\r\n {row.agentName || \"\"}\r\n </TableCell>\r\n <TableCell>\r\n {row.queueName ? (\r\n <Chip\r\n label={row.queueName}\r\n size=\"small\"\r\n sx={{\r\n fontFamily: FONT,\r\n backgroundColor: \"#f0ebfa\",\r\n color: COLORS.purple,\r\n fontWeight: 500,\r\n fontSize: \"0.67rem\",\r\n height: 22,\r\n }}\r\n />\r\n ) : null}\r\n </TableCell>\r\n <TableCell sx={{ fontSize: \"0.73rem\", color: \"#4a5568\" }}>\r\n {row.extension || \"\"}\r\n </TableCell>\r\n <TableCell\r\n sx={{\r\n fontWeight: 600,\r\n color: COLORS.blue,\r\n fontSize: \"0.75rem\",\r\n fontVariantNumeric: \"tabular-nums\",\r\n }}\r\n >\r\n {row.talkDurationFmt || \"\"}\r\n </TableCell>\r\n <TableCell\r\n sx={{\r\n fontWeight: 500,\r\n color: COLORS.amber,\r\n fontSize: \"0.75rem\",\r\n fontVariantNumeric: \"tabular-nums\",\r\n }}\r\n >\r\n {row.holdDurationFmt || \"\"}\r\n </TableCell>\r\n <TableCell\r\n sx={{\r\n fontWeight: 500,\r\n fontSize: \"0.75rem\",\r\n fontVariantNumeric: \"tabular-nums\",\r\n }}\r\n >\r\n {row.ringingDurationFmt || \"\"}\r\n </TableCell>\r\n <TableCell\r\n sx={{\r\n fontWeight: 500,\r\n fontSize: \"0.75rem\",\r\n fontVariantNumeric: \"tabular-nums\",\r\n }}\r\n >\r\n {row.queueDurationFmt || \"\"}\r\n </TableCell>\r\n <TableCell\r\n sx={{\r\n fontWeight: 500,\r\n fontSize: \"0.75rem\",\r\n fontVariantNumeric: \"tabular-nums\",\r\n }}\r\n >\r\n {row.wrapupDurationFmt || \"\"}\r\n </TableCell>\r\n <TableCell sx={{ fontSize: \"0.73rem\", color: \"#4a5568\" }}>\r\n {row.disposition || \"\"}\r\n </TableCell>\r\n <TableCell sx={{ fontSize: \"0.73rem\", color: \"#4a5568\" }}>\r\n {row.remarks ? (\r\n <Tooltip title={row.remarks}>\r\n <span\r\n style={{\r\n display: \"inline-block\",\r\n maxWidth: 180,\r\n overflow: \"hidden\",\r\n textOverflow: \"ellipsis\",\r\n whiteSpace: \"nowrap\",\r\n verticalAlign: \"bottom\",\r\n }}\r\n >\r\n {row.remarks}\r\n </span>\r\n </Tooltip>\r\n ) : (\r\n \"\"\r\n )}\r\n </TableCell>\r\n <TableCell>\r\n {row.wasTransferred ? (\r\n <Chip\r\n label=\"Yes\"\r\n size=\"small\"\r\n sx={{\r\n fontFamily: FONT,\r\n backgroundColor: \"#e6f7ef\",\r\n color: COLORS.green,\r\n fontWeight: 600,\r\n fontSize: \"0.65rem\",\r\n height: 20,\r\n borderRadius: \"6px\",\r\n }}\r\n />\r\n ) : (\r\n <Chip\r\n label=\"No\"\r\n size=\"small\"\r\n sx={{\r\n fontFamily: FONT,\r\n backgroundColor: \"transparent\",\r\n color: \"#6b7b8d\",\r\n fontWeight: 600,\r\n fontSize: \"0.65rem\",\r\n height: 20,\r\n borderRadius: \"6px\",\r\n }}\r\n />\r\n )}\r\n </TableCell>\r\n </TableRow>\r\n ))}\r\n </TableBody>\r\n </Table>\r\n </TableContainer>\r\n\r\n <TablePagination\r\n component=\"div\"\r\n count={totalRecords}\r\n page={page}\r\n onPageChange={handlePageChange}\r\n rowsPerPage={rowsPerPage}\r\n rowsPerPageOptions={[10, 15, 25, 50, 100]}\r\n onRowsPerPageChange={(e) => {\r\n setRowsPerPage(parseInt(e.target.value, 10));\r\n setPage(0);\r\n }}\r\n sx={{\r\n borderTop: \"1px solid #eef1f6\",\r\n fontFamily: FONT,\r\n \"& .MuiTablePagination-displayedRows\": {\r\n fontFamily: FONT,\r\n fontSize: \"0.73rem\",\r\n },\r\n \"& .MuiTablePagination-selectLabel\": {\r\n fontFamily: FONT,\r\n fontSize: \"0.73rem\",\r\n },\r\n }}\r\n />\r\n </Paper>\r\n </Box>\r\n </Box>\r\n\r\n <AuditReportDialog\r\n open={auditDialogOpen}\r\n onClose={() => {\r\n setAuditDialogOpen(false);\r\n setSelectedAuditRow(null);\r\n }}\r\n rowData={selectedAuditRow ?? undefined}\r\n />\r\n </LocalizationProvider>\r\n );\r\n}\r\n\r\nconst CdrReport: React.FC = () => (\r\n <SDKProvider>\r\n <CdrReportContent />\r\n </SDKProvider>\r\n);\r\n\r\nexport default CdrReport;\r\n","import { useCallback, useState } from \"react\";\r\nimport axiosInstance from \"../../services/axios\";\r\nimport { END_POINT } from \"../../services/endPoint\";\r\nimport type {\r\n\tCdrAgentFilterOption,\r\n\tCdrQueueFilterOption,\r\n\tCdrRecordsPage,\r\n\tCdrReportParams,\r\n\tCdrReportResponse,\r\n} from \"./types\";\r\n\r\n// ─── Build query string for CDR endpoints ────────────────────────────────────\r\n\r\nfunction buildCdrQuery(params: CdrReportParams): 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) {\r\n\t\tfor (const id of params.agent_id) qs.append(\"agent_id\", String(id));\r\n\t}\r\n\tif (params.queue_id) {\r\n\t\tfor (const id of params.queue_id) qs.append(\"queue_id\", String(id));\r\n\t}\r\n\tif (params.call_type) qs.append(\"call_type\", params.call_type);\r\n\tif (params.status) qs.append(\"status\", params.status);\r\n\tif (params.search) qs.append(\"search\", params.search);\r\n\tif (params.page) qs.append(\"page\", String(params.page));\r\n\tif (params.pageSize) qs.append(\"pageSize\", String(params.pageSize));\r\n\tconst str = qs.toString();\r\n\treturn str ? `?${str}` : \"\";\r\n}\r\n\r\n// ─── CDR records hook ────────────────────────────────────────────────────────\r\n\r\nexport function useCdrReport() {\r\n\tconst [records, setRecords] = useState<CdrRecordsPage[\"data\"]>([]);\r\n\tconst [totalRecords, setTotalRecords] = useState(0);\r\n\tconst [loading, setLoading] = useState(false);\r\n\tconst [error, setError] = useState(\"\");\r\n\r\n\tconst fetchRecords = useCallback(async (params: CdrReportParams): Promise<void> => {\r\n\t\tsetLoading(true);\r\n\t\tsetError(\"\");\r\n\t\ttry {\r\n\t\t\tconst qs = buildCdrQuery(params);\r\n\t\t\tconst res = await axiosInstance.get<CdrRecordsPage>(`${END_POINT.CDR_REPORT_RECORDS}${qs}`);\r\n\t\t\tsetRecords(res.data?.data ?? []);\r\n\t\t\tsetTotalRecords(res.data?.total ?? 0);\r\n\t\t} catch (err: any) {\r\n\t\t\tsetError(\r\n\t\t\t\terr?.response?.data?.message\r\n\t\t\t\t?? err?.response?.data?.detail\r\n\t\t\t\t?? err?.message\r\n\t\t\t\t?? \"Failed to fetch CDR report\"\r\n\t\t\t);\r\n\t\t\tsetRecords([]);\r\n\t\t\tsetTotalRecords(0);\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: CdrReportParams): Promise<void> => {\r\n\t\tconst qs = buildCdrQuery(params);\r\n\t\tconst res = await axiosInstance.get(`${END_POINT.CDR_REPORT_EXPORT_EXCEL}${qs}`, {\r\n\t\t\tresponseType: \"blob\",\r\n\t\t});\r\n\t\tconst blob = res.data as Blob;\r\n\t\tconst url = window.URL.createObjectURL(blob);\r\n\t\tconst a = document.createElement(\"a\");\r\n\t\ta.href = url;\r\n\t\ta.download = `cdr-report-${params.start_date ?? \"export\"}.xlsx`;\r\n\t\tdocument.body.appendChild(a);\r\n\t\ta.click();\r\n\t\ta.remove();\r\n\t\twindow.URL.revokeObjectURL(url);\r\n\t}, []);\r\n\r\n\tconst fetchRecording = useCallback(async (callUuid: string): Promise<Blob> => {\r\n\t\tconst res = await axiosInstance.get(END_POINT.RECORDING_BY_CALL(callUuid), {\r\n\t\t\tresponseType: \"blob\",\r\n\t\t});\r\n\t\treturn res.data;\r\n\t}, []);\r\n\r\n\treturn {\r\n\t\trecords,\r\n\t\ttotalRecords,\r\n\t\tloading,\r\n\t\terror,\r\n\t\tsetError,\r\n\t\tfetchRecords,\r\n\t\texportExcel,\r\n\t\tfetchRecording,\r\n\t};\r\n}\r\n\r\n// ─── CDR filter options hook (agents + queues) ───────────────────────────────\r\n//\r\n// The main app's CdrReport uses the general user-list and master-queue endpoints\r\n// (NOT a CDR-specific filter endpoint). We mirror that here.\r\n// - agents: GET /api/v1/users/?role=AGENT → filter to role === \"AGENT\"\r\n// - queues: GET /api/v1/master/queue\r\n\r\ninterface UserListItem {\r\n\tid: number;\r\n\tuserId: string;\r\n\tfirstName?: string;\r\n\tlastName?: string;\r\n\trole?: string | { name?: string } | null;\r\n}\r\n\r\ninterface QueueListItem {\r\n\tid: number;\r\n\tname: string;\r\n}\r\n\r\nexport function useCdrFilters() {\r\n\tconst [agents, setAgents] = useState<CdrAgentFilterOption[]>([]);\r\n\tconst [queues, setQueues] = useState<CdrQueueFilterOption[]>([]);\r\n\tconst [loading, setLoading] = useState(false);\r\n\r\n\tconst fetchAgents = useCallback(async (): Promise<void> => {\r\n\t\ttry {\r\n\t\t\tconst res = await axiosInstance.get<UserListItem[] | { data: UserListItem[] }>(\r\n\t\t\t\tEND_POINT.USERS_LIST,\r\n\t\t\t\t{ params: { role: \"AGENT\" } },\r\n\t\t\t);\r\n\t\t\tconst raw = Array.isArray(res.data)\r\n\t\t\t\t? res.data\r\n\t\t\t\t: Array.isArray((res.data as any)?.data)\r\n\t\t\t\t\t? (res.data as any).data\r\n\t\t\t\t\t: [];\r\n\t\t\tconst mapped: CdrAgentFilterOption[] = (raw as UserListItem[])\r\n\t\t\t\t.filter((u) => {\r\n\t\t\t\t\tconst roleName = typeof u.role === \"object\" && u.role !== null ? u.role.name : u.role;\r\n\t\t\t\t\treturn roleName === \"AGENT\";\r\n\t\t\t\t})\r\n\t\t\t\t.map((u) => ({\r\n\t\t\t\t\tid: u.id,\r\n\t\t\t\t\tuserId: u.userId,\r\n\t\t\t\t\tfullName: [u.firstName, u.lastName].filter(Boolean).join(\" \") || u.userId,\r\n\t\t\t\t}));\r\n\t\t\tsetAgents(mapped);\r\n\t\t} catch {\r\n\t\t\tsetAgents([]);\r\n\t\t}\r\n\t}, []);\r\n\r\n\tconst fetchQueues = useCallback(async (): Promise<void> => {\r\n\t\ttry {\r\n\t\t\tconst res = await axiosInstance.get<QueueListItem[] | { data: QueueListItem[] }>(\r\n\t\t\t\tEND_POINT.MASTER_QUEUES,\r\n\t\t\t);\r\n\t\t\tconst raw = Array.isArray(res.data)\r\n\t\t\t\t? res.data\r\n\t\t\t\t: Array.isArray((res.data as any)?.data)\r\n\t\t\t\t\t? (res.data as any).data\r\n\t\t\t\t\t: [];\r\n\t\t\tsetQueues((raw as QueueListItem[]).map((q) => ({ id: q.id, name: q.name })));\r\n\t\t} catch {\r\n\t\t\tsetQueues([]);\r\n\t\t}\r\n\t}, []);\r\n\r\n\tconst fetchAll = useCallback(async (): Promise<void> => {\r\n\t\tsetLoading(true);\r\n\t\ttry {\r\n\t\t\tawait Promise.all([fetchAgents(), fetchQueues()]);\r\n\t\t} finally {\r\n\t\t\tsetLoading(false);\r\n\t\t}\r\n\t}, [fetchAgents, fetchQueues]);\r\n\r\n\treturn { agents, queues, loading, fetchAgents, fetchQueues, fetchAll };\r\n}\r\n\r\nexport interface Queue {\r\n\tid: number;\r\n\tname: string;\r\n\tdescription: string;\r\n\tisActive: boolean;\r\n}\r\n\r\nexport async function getQueues(): Promise<Queue[]> {\r\n\tconst res = await axiosInstance.get<QueueListItem[] | { data: QueueListItem[] }>(END_POINT.MASTER_QUEUES);\r\n\tconst raw = Array.isArray(res.data)\r\n\t\t? res.data\r\n\t\t: Array.isArray((res.data as any)?.data)\r\n\t\t\t? (res.data as any).data\r\n\t\t\t: [];\r\n\treturn (raw as QueueListItem[]).map((q) => ({ id: q.id, name: q.name, description: \"\", isActive: true }));\r\n}\r\n\r\nexport async function getCdrReportRecords(params: CdrReportParams): Promise<CdrRecordsPage> {\r\n\tconst qs = buildCdrQuery(params);\r\n\tconst res = await axiosInstance.get<CdrRecordsPage>(`${END_POINT.CDR_REPORT_RECORDS}${qs}`);\r\n\treturn res.data;\r\n}\r\n\r\n/**\r\n * Combined CDR report — stats + the current page of records in one call.\r\n * This is the documented endpoint that honours page/pageSize/search.\r\n */\r\nexport async function getCdrReport(params: CdrReportParams): Promise<CdrReportResponse> {\r\n\tconst qs = buildCdrQuery(params);\r\n\tconst res = await axiosInstance.get<CdrReportResponse>(`${END_POINT.CDR_REPORT}${qs}`);\r\n\treturn res.data;\r\n}\r\n\r\nexport async function exportCdrReportToExcel(params: CdrReportParams): Promise<void> {\r\n\tconst qs = buildCdrQuery(params);\r\n\tconst res = await axiosInstance.get(`${END_POINT.CDR_REPORT_EXPORT_EXCEL}${qs}`, { responseType: \"blob\" });\r\n\tconst url = window.URL.createObjectURL(new Blob([res.data]));\r\n\tconst a = document.createElement(\"a\");\r\n\ta.href = url;\r\n\ta.download = `cdr-report-${params.start_date ?? \"export\"}.xlsx`;\r\n\tdocument.body.appendChild(a);\r\n\ta.click();\r\n\ta.remove();\r\n\twindow.URL.revokeObjectURL(url);\r\n}\r\n\r\nexport async function getRecordingByCall(callUuid: string): Promise<Blob> {\r\n\tconst res = await axiosInstance.get(END_POINT.RECORDING_BY_CALL(callUuid), { responseType: \"blob\" });\r\n\treturn res.data;\r\n}\r\n"],"mappings":"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","names":["useCallback","useState","useState","useCallback"]}
@@ -166,7 +166,7 @@ function OverviewTab({ data }) {
166
166
  /* @__PURE__ */ jsx(SectionTitle, { children: "Audit Metadata" }),
167
167
  /* @__PURE__ */ jsx(Box, { sx: { border: "1px solid", borderColor: "divider", borderRadius: "8px", overflow: "hidden", backgroundColor: "background.paper" }, children: /* @__PURE__ */ jsx(Box, { sx: { display: "flex" }, children: [col1, col2].map((chunk, ci) => /* @__PURE__ */ jsx(Box, { sx: { flex: "1 1 240px", minWidth: 0, borderRight: ci === 0 ? "1px solid" : "none", borderColor: "divider" }, children: chunk.map((item, ii) => /* @__PURE__ */ jsxs(Box, { sx: { display: "flex", alignItems: "baseline", borderBottom: ii < chunk.length - 1 ? "1px solid" : "none", borderColor: "divider", px: "10px", py: "6px", gap: 1 }, children: [
168
168
  /* @__PURE__ */ jsx(Typography, { sx: { fontSize: "0.72rem", color: "text.secondary", minWidth: 140, flexShrink: 0 }, children: item.label }),
169
- /* @__PURE__ */ jsx(Typography, { sx: { fontSize: "0.75rem", color: "text.primary", fontWeight: 500 }, children: item.value === "Not Available" ? "\u2014" : item.value })
169
+ /* @__PURE__ */ jsx(Typography, { sx: { fontSize: "0.75rem", color: "text.primary", fontWeight: 500 }, children: item.value })
170
170
  ] }, ii)) }, ci)) }) })
171
171
  ] }),
172
172
  /* @__PURE__ */ jsxs(Box, { children: [
@@ -190,7 +190,7 @@ var SCORECARD_PARAMS = [
190
190
  { key: "Closing_and_Customer_Education", label: "Closing & Customer Education", defaultMax: 5 }
191
191
  ];
192
192
  function ScorecardTab({ data, primary }) {
193
- var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q;
193
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m;
194
194
  const sc = (_a = data.Quality_Scorecard) != null ? _a : {};
195
195
  const summary = (_b = data.Executive_Audit_Summary) != null ? _b : {};
196
196
  const rawScore = (_d = (_c = sc.Total_Score) != null ? _c : summary.Overall_Audit_Score_Percentage) != null ? _d : 0;
@@ -199,14 +199,10 @@ function ScorecardTab({ data, primary }) {
199
199
  const resultBadge = (_f = (_e = summary.Audit_Result) != null ? _e : sc.Final_Rating) != null ? _f : "N/A";
200
200
  const metrics = [
201
201
  { label: "Audit Result", value: (_g = summary.Audit_Result) != null ? _g : "N/A" },
202
- { label: "Compliance Status", value: (_h = summary.Compliance_Status) != null ? _h : "N/A" },
203
- { label: "First Call Resolution", value: (_i = summary.First_Call_Resolution_FCR) != null ? _i : "N/A" },
204
- { label: "Customer Experience", value: (_k = (_j = summary.Customer_Experience) != null ? _j : summary.Patient_Sentiment) != null ? _k : "N/A" },
205
- { label: "Process Adherence", value: (_l = summary.Process_Adherence) != null ? _l : "N/A" },
206
- { label: "Communication", value: (_m = summary.Communication_Effectiveness) != null ? _m : "N/A" },
207
- { label: "Knowledge Accuracy", value: (_n = summary.Knowledge_Accuracy) != null ? _n : "N/A" },
208
- { label: "Empathy Handling", value: (_o = summary.Empathy_Handling) != null ? _o : "N/A" },
209
- { label: "Risk Severity", value: (_p = summary.Risk_Severity) != null ? _p : "N/A" }
202
+ { label: "First Call Resolution", value: (_h = summary.First_Call_Resolution_FCR) != null ? _h : "N/A" },
203
+ { label: "Patient Experience", value: (_j = (_i = summary.Customer_Experience) != null ? _i : summary.Patient_Sentiment) != null ? _j : "N/A" },
204
+ { label: "Process Adherence", value: (_k = summary.Process_Adherence) != null ? _k : "N/A" },
205
+ { label: "Effective Communication", value: (_l = summary.Communication_Effectiveness) != null ? _l : "N/A" }
210
206
  ];
211
207
  return /* @__PURE__ */ jsxs(Box, { sx: { display: "flex", flexDirection: "column", gap: 2.5 }, children: [
212
208
  /* @__PURE__ */ jsxs(Box, { sx: { display: "flex", gap: 2, flexWrap: "wrap", alignItems: "stretch" }, children: [
@@ -219,10 +215,16 @@ function ScorecardTab({ data, primary }) {
219
215
  /* @__PURE__ */ jsx(Box, { sx: { width: "100%", mt: 0.75 }, children: /* @__PURE__ */ jsx(LinearProgress, { variant: "determinate", value: pct, sx: { height: 6, borderRadius: 3, backgroundColor: alpha(primary, 0.12), "& .MuiLinearProgress-bar": { backgroundColor: primary, borderRadius: 3 } } }) }),
220
216
  /* @__PURE__ */ jsx(Box, { sx: { mt: 0.75 }, children: /* @__PURE__ */ jsx(StatusBadge, { label: resultBadge }) })
221
217
  ] }),
222
- /* @__PURE__ */ jsx(Box, { sx: { flex: 1, minWidth: 260, display: "grid", gridTemplateColumns: "repeat(auto-fill, minmax(160px, 1fr))", gap: "8px" }, children: metrics.filter((m) => m.value && m.value.toLowerCase() !== "n/a").map((m) => /* @__PURE__ */ jsxs(Box, { sx: { border: "1px solid", borderColor: "divider", borderRadius: "6px", backgroundColor: "background.paper", px: "10px", py: "7px", display: "flex", alignItems: "center", justifyContent: "space-between", gap: 1 }, children: [
223
- /* @__PURE__ */ jsx(Typography, { sx: { fontSize: "0.72rem", color: "text.secondary", lineHeight: 1.3, flex: 1 }, children: m.label }),
224
- /* @__PURE__ */ jsx(StatusBadge, { label: m.value })
225
- ] }, m.label)) })
218
+ /* @__PURE__ */ jsxs(Box, { sx: { flex: 1, minWidth: 260, display: "flex", flexDirection: "column", gap: "8px", alignSelf: "stretch" }, children: [
219
+ /* @__PURE__ */ jsx(Box, { sx: { flex: 1, display: "grid", gridTemplateColumns: "repeat(3, 1fr)", gap: "8px" }, children: metrics.slice(0, 3).map((m) => /* @__PURE__ */ jsxs(Box, { sx: { border: "1px solid", borderColor: "divider", borderRadius: "6px", backgroundColor: "background.paper", px: "10px", py: "8px", display: "flex", flexDirection: "column", alignItems: "center", justifyContent: "center", gap: "6px" }, children: [
220
+ /* @__PURE__ */ jsx(Typography, { sx: { fontSize: "0.72rem", color: "text.secondary", lineHeight: 1.3, textAlign: "center" }, children: m.label }),
221
+ /* @__PURE__ */ jsx(StatusBadge, { label: m.value })
222
+ ] }, m.label)) }),
223
+ /* @__PURE__ */ jsx(Box, { sx: { flex: 1, display: "grid", gridTemplateColumns: "repeat(3, 1fr)", gap: "8px" }, children: metrics.slice(3).map((m) => /* @__PURE__ */ jsxs(Box, { sx: { border: "1px solid", borderColor: "divider", borderRadius: "6px", backgroundColor: "background.paper", px: "10px", py: "8px", display: "flex", flexDirection: "column", alignItems: "center", justifyContent: "center", gap: "6px" }, children: [
224
+ /* @__PURE__ */ jsx(Typography, { sx: { fontSize: "0.72rem", color: "text.secondary", lineHeight: 1.3, textAlign: "center" }, children: m.label }),
225
+ /* @__PURE__ */ jsx(StatusBadge, { label: m.value })
226
+ ] }, m.label)) })
227
+ ] })
226
228
  ] }),
227
229
  /* @__PURE__ */ jsxs(Box, { children: [
228
230
  /* @__PURE__ */ jsx(SectionTitle, { children: "Quality Scorecard" }),
@@ -239,7 +241,6 @@ function ScorecardTab({ data, primary }) {
239
241
  var _a2, _b2;
240
242
  const entry = sc[p.key];
241
243
  const rawEntryScore = entry == null ? void 0 : entry.Score_Obtained;
242
- if (typeof rawEntryScore === "string" && rawEntryScore.toLowerCase().trim() === "n/a") return null;
243
244
  const score = typeof rawEntryScore === "string" ? parseFloat(rawEntryScore) || 0 : rawEntryScore != null ? rawEntryScore : 0;
244
245
  const max = (_a2 = entry == null ? void 0 : entry.Weightage) != null ? _a2 : p.defaultMax;
245
246
  return /* @__PURE__ */ jsxs(TableRow, { children: [
@@ -255,7 +256,7 @@ function ScorecardTab({ data, primary }) {
255
256
  /* @__PURE__ */ jsx(TableCell, { sx: __spreadProps(__spreadValues({}, TD), { textAlign: "center", fontWeight: 700 }), children: "100" }),
256
257
  /* @__PURE__ */ jsx(TableCell, { sx: __spreadProps(__spreadValues({}, TD), { textAlign: "center", fontWeight: 700 }), children: overallScore }),
257
258
  /* @__PURE__ */ jsx(TableCell, { sx: __spreadValues({}, TD), children: /* @__PURE__ */ jsx(ProgressCell, { value: { score: overallScore, max: 100 }, primary }) }),
258
- /* @__PURE__ */ jsx(TableCell, { sx: __spreadProps(__spreadValues({}, TD), { fontWeight: 700 }), children: /* @__PURE__ */ jsx(StatusBadge, { label: (_q = sc.Final_Rating) != null ? _q : resultBadge }) })
259
+ /* @__PURE__ */ jsx(TableCell, { sx: __spreadProps(__spreadValues({}, TD), { fontWeight: 700 }), children: /* @__PURE__ */ jsx(StatusBadge, { label: (_m = sc.Final_Rating) != null ? _m : resultBadge }) })
259
260
  ] })
260
261
  ] })
261
262
  ] }) })
@@ -312,7 +313,7 @@ var CHECKLIST_COLS = [
312
313
  { key: "qaObservation", label: "QA Observation / Impact", minWidth: 180 }
313
314
  ];
314
315
  function ChecklistTable({ title, rows }) {
315
- const visibleRows = rows.filter((r) => r.status.toLowerCase().replace(/[^a-z]/g, "") !== "na");
316
+ const visibleRows = rows;
316
317
  if (!visibleRows.length) return null;
317
318
  return /* @__PURE__ */ jsxs(Box, { children: [
318
319
  /* @__PURE__ */ jsx(SectionTitle, { children: title }),
@@ -343,7 +344,7 @@ function DispositionFrameworkTable({ data }) {
343
344
  };
344
345
  });
345
346
  }
346
- ).filter((r) => r.status.toLowerCase().replace(/[^a-z]/g, "") !== "na" && r.expectedFramework.toLowerCase().trim() !== "clinical sensitivity handling");
347
+ ).filter((r) => r.expectedFramework.toLowerCase().trim() !== "clinical sensitivity handling");
347
348
  if (!rows.length) {
348
349
  return /* @__PURE__ */ jsx(Typography, { sx: { fontSize: "0.75rem", color: "text.secondary" }, children: "No disposition framework data available." });
349
350
  }
@@ -409,20 +410,20 @@ function AuditChecklistTab({ data, primary: _primary }) {
409
410
  ] });
410
411
  }
411
412
  function RootCauseAnalysisTab({ data, primary }) {
412
- var _a, _b, _c;
413
- const rcaRows = (_b = ((_a = data.Root_Cause_Analysis) != null ? _a : []).filter((r) => (r == null ? void 0 : r.Observation) && (r == null ? void 0 : r.Observation) !== "N/A")) != null ? _b : [];
414
- const rec = (_c = data.Auditor_Recommendation) != null ? _c : {};
413
+ var _a, _b;
414
+ const rcaRows = (_a = data.Root_Cause_Analysis) != null ? _a : [];
415
+ const rec = (_b = data.Auditor_Recommendation) != null ? _b : {};
415
416
  return /* @__PURE__ */ jsxs(Box, { sx: { display: "flex", flexDirection: "column", gap: 2 }, children: [
416
417
  /* @__PURE__ */ jsxs(Box, { children: [
417
418
  /* @__PURE__ */ jsx(SectionTitle, { children: "Root Cause Analysis" }),
418
419
  rcaRows.length > 0 ? /* @__PURE__ */ jsx(TableContainer, { sx: { border: "1px solid", borderColor: "divider", borderRadius: "8px", overflow: "hidden" }, children: /* @__PURE__ */ jsxs(Table, { size: "small", children: [
419
420
  /* @__PURE__ */ jsx(TableHead, { children: /* @__PURE__ */ jsx(TableRow, { children: [{ label: "Observation", minWidth: 180 }, { label: "Root Cause", minWidth: 200 }, { label: "Impact", minWidth: 200 }, { label: "Severity", minWidth: 90 }].map((col, i) => /* @__PURE__ */ jsx(TableCell, { sx: __spreadProps(__spreadValues({}, TH), { minWidth: col.minWidth }), children: col.label }, i)) }) }),
420
421
  /* @__PURE__ */ jsx(TableBody, { children: rcaRows.map((row, ri) => {
421
- var _a2, _b2, _c2;
422
+ var _a2, _b2, _c;
422
423
  return /* @__PURE__ */ jsxs(TableRow, { sx: { "&:last-child td": { borderBottom: 0 } }, children: [
423
424
  /* @__PURE__ */ jsx(TableCell, { sx: __spreadValues({}, TD), children: (_a2 = row.Observation) != null ? _a2 : "\u2014" }),
424
425
  /* @__PURE__ */ jsx(TableCell, { sx: __spreadValues({}, TD), children: (_b2 = row.Root_Cause) != null ? _b2 : "\u2014" }),
425
- /* @__PURE__ */ jsx(TableCell, { sx: __spreadValues({}, TD), children: (_c2 = row.Impact) != null ? _c2 : "\u2014" }),
426
+ /* @__PURE__ */ jsx(TableCell, { sx: __spreadValues({}, TD), children: (_c = row.Impact) != null ? _c : "\u2014" }),
426
427
  /* @__PURE__ */ jsx(TableCell, { sx: __spreadProps(__spreadValues({}, TD), { textAlign: "center" }), children: row.Severity ? /* @__PURE__ */ jsx(StatusBadge, { label: row.Severity }) : "\u2014" })
427
428
  ] }, ri);
428
429
  }) })
@@ -654,4 +655,4 @@ export {
654
655
  AuditReportDialog,
655
656
  AuditReportFullPage
656
657
  };
657
- //# sourceMappingURL=chunk-6KZFBOWQ.mjs.map
658
+ //# sourceMappingURL=chunk-222NEEHY.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../call-control-sdk/lib/pages/common/components/AuditReport.tsx"],"sourcesContent":["import React, { useEffect, useState } from \"react\";\r\nimport { createPortal } from \"react-dom\";\r\nimport {\r\n Avatar,\r\n Box,\r\n Typography,\r\n Table,\r\n TableBody,\r\n TableCell,\r\n TableContainer,\r\n TableHead,\r\n TableRow,\r\n Tabs,\r\n Tab,\r\n LinearProgress,\r\n useTheme,\r\n Dialog,\r\n IconButton,\r\n GlobalStyles,\r\n CircularProgress,\r\n Alert,\r\n ToggleButton,\r\n ToggleButtonGroup,\r\n} from \"@mui/material\";\r\nimport { alpha } from \"@mui/material/styles\";\r\nimport type { SxProps, Theme } from \"@mui/material/styles\";\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\nimport LaunchIcon from \"@mui/icons-material/Launch\";\r\nimport CheckCircleOutlineIcon from \"@mui/icons-material/CheckCircleOutlined\";\r\nimport HighlightOffIcon from \"@mui/icons-material/HighlightOff\";\r\nimport RemoveCircleOutlineIcon from \"@mui/icons-material/RemoveCircleOutlined\";\r\nimport axiosInstance from \"../../../services/axios\";\r\nimport { END_POINT } from \"../../../services/endPoint\";\r\nimport type { CdrRecordResponse } from \"../../cdrReport/types\";\r\n\r\n// ─── API response types ────────────────────────────────────────────────────────\r\n\r\ninterface AuditMetadata {\r\n Hospital_Name?: string;\r\n \"Process/Department\"?: string;\r\n Call_Disposition?: string;\r\n Call_Category?: string;\r\n Call_Type?: string;\r\n Call_Date_Time?: string;\r\n Call_Duration?: string;\r\n Agent_Name?: string;\r\n Employee_ID?: string;\r\n Team_Leader?: string;\r\n Auditor_Name?: string;\r\n Language?: string;\r\n Recording_ID?: string;\r\n}\r\n\r\ninterface ExecutiveAuditSummary {\r\n Overall_Audit_Score_Percentage?: number | string;\r\n Audit_Result?: string;\r\n First_Call_Resolution_FCR?: string;\r\n Patient_Sentiment?: string;\r\n Process_Adherence?: string;\r\n Communication_Effectiveness?: string;\r\n Compliance_Status?: string;\r\n Customer_Experience?: string;\r\n Knowledge_Accuracy?: string;\r\n Empathy_Handling?: string;\r\n Risk_Severity?: string;\r\n}\r\n\r\ninterface ScorecardEntry {\r\n Weightage?: number;\r\n Score_Obtained?: number | string;\r\n Remarks?: string;\r\n}\r\n\r\ninterface QualityScorecard {\r\n Opening_and_Greeting?: ScorecardEntry;\r\n Verification_and_Authentication?: ScorecardEntry;\r\n Communication_and_Soft_Skills?: ScorecardEntry;\r\n Process_and_Workflow_Adherence?: ScorecardEntry;\r\n Resolution_Accuracy?: ScorecardEntry;\r\n Empathy_and_Patient_Assurance?: ScorecardEntry;\r\n Call_Handling?: ScorecardEntry;\r\n CRM_Documentation_Alignment?: ScorecardEntry;\r\n Closing_and_Customer_Education?: ScorecardEntry;\r\n Total_Score?: number;\r\n Final_Rating?: string;\r\n}\r\n\r\ninterface DispositionFramework {\r\n dispositionType?: string;\r\n frameworks?: Array<{\r\n expectedFramework?: string;\r\n status?: string;\r\n remarks?: string;\r\n }>;\r\n}\r\n\r\ninterface ChecklistItem {\r\n parameter?: string;\r\n expectedStandard?: string;\r\n status?: string;\r\n remarks?: string;\r\n qaObservation?: string;\r\n}\r\n\r\ninterface ChecklistGroup {\r\n items?: ChecklistItem[];\r\n}\r\n\r\ntype ObsRecord = Record<string, { Status?: string; Remarks?: string; Observation_Impact?: string }>;\r\n\r\ninterface SectionWiseAuditObservations {\r\n Opening_and_Greeting?: ObsRecord;\r\n Verification_and_Authentication?: ObsRecord;\r\n Communication_and_Soft_Skills?: ObsRecord;\r\n Process_and_Workflow_Adherence?: ChecklistGroup[];\r\n Empathy_and_Patient_Assurance?: ObsRecord;\r\n Call_Handling?: ObsRecord;\r\n Call_Closure_and_Customer_Education?: ObsRecord;\r\n}\r\n\r\ninterface RootCauseItem {\r\n Observation?: string;\r\n Root_Cause?: string;\r\n Impact?: string;\r\n Severity?: string;\r\n}\r\n\r\ninterface AuditorRecommendation {\r\n Key_Strengths?: string[] | string;\r\n Improvement_Areas?: string[] | string;\r\n}\r\n\r\nexport interface NewAuditApiResponse {\r\n Audit_Metadata?: AuditMetadata;\r\n Conversation_Type_Classification?: Record<string, string>;\r\n Call_Summary?: string;\r\n transcript?: string;\r\n Executive_Audit_Summary?: ExecutiveAuditSummary;\r\n Quality_Scorecard?: QualityScorecard;\r\n Disposition_Based_Quality_Framework?: DispositionFramework[];\r\n Section_Wise_Audit_Observations_Checklist?: SectionWiseAuditObservations;\r\n Root_Cause_Analysis?: RootCauseItem[];\r\n Auditor_Recommendation?: AuditorRecommendation;\r\n Final_Auditor_Remarks?: string;\r\n}\r\n\r\n\r\nfunction toStringArray(value: string[] | string | undefined): string[] {\r\n if (!value) return [];\r\n if (Array.isArray(value)) return value;\r\n return value.split(\"\\n\").map((l) => l.replace(/^\\s*[\\*\\-]\\s*/, \"\").trim()).filter(Boolean);\r\n}\r\n\r\n// ─── Colour helpers ────────────────────────────────────────────────────────────\r\n\r\nconst STATUS_COLOUR: Record<string, { color: string; bg: string }> = {\r\n completed: { color: \"#2e7d32\", bg: \"#e8f5e9\" },\r\n complied: { color: \"#2e7d32\", bg: \"#e8f5e9\" },\r\n pass: { color: \"#2e7d32\", bg: \"#e8f5e9\" },\r\n compliant: { color: \"#2e7d32\", bg: \"#e8f5e9\" },\r\n achieved: { color: \"#2e7d32\", bg: \"#e8f5e9\" },\r\n strong: { color: \"#2e7d32\", bg: \"#e8f5e9\" },\r\n excellent: { color: \"#2e7d32\", bg: \"#e8f5e9\" },\r\n low: { color: \"#2e7d32\", bg: \"#e8f5e9\" },\r\n no: { color: \"#2e7d32\", bg: \"#e8f5e9\" },\r\n good: { color: \"#1565c0\", bg: \"#e3f2fd\" },\r\n partial: { color: \"#e65100\", bg: \"#fff3e0\" },\r\n moderate: { color: \"#e65100\", bg: \"#fff3e0\" },\r\n medium: { color: \"#e65100\", bg: \"#fff3e0\" },\r\n missed: { color: \"#c62828\", bg: \"#ffebee\" },\r\n fail: { color: \"#c62828\", bg: \"#ffebee\" },\r\n high: { color: \"#c62828\", bg: \"#ffebee\" },\r\n yes: { color: \"#c62828\", bg: \"#ffebee\" },\r\n \"n/a\": { color: \"#757575\", bg: \"#f5f5f5\" },\r\n na: { color: \"#757575\", bg: \"#f5f5f5\" },\r\n};\r\n\r\nfunction resolveColour(label: string): { color: string; bg: string } {\r\n const key = label.toLowerCase().trim();\r\n if (STATUS_COLOUR[key]) return STATUS_COLOUR[key];\r\n const stripped = key.replace(/[^a-z]/g, \"\");\r\n return STATUS_COLOUR[stripped] ?? { color: \"#555\", bg: \"#f0f0f0\" };\r\n}\r\n\r\nfunction StatusBadge({ label }: { label: string }) {\r\n const { color, bg } = resolveColour(label);\r\n return (\r\n <Box sx={{ display: \"inline-flex\", alignItems: \"center\", px: \"7px\", py: \"2px\", borderRadius: \"4px\", backgroundColor: bg, whiteSpace: \"nowrap\" }}>\r\n <Typography sx={{ fontSize: \"0.72rem\", fontWeight: 600, color, letterSpacing: \"0.02em\" }}>\r\n {label.toUpperCase()}\r\n </Typography>\r\n </Box>\r\n );\r\n}\r\n\r\nfunction StatusIconBadge({ label }: { label: string }) {\r\n const key = label.toLowerCase().replace(/[^a-z]/g, \"\");\r\n let icon: React.ReactNode;\r\n if (key === \"complied\" || key === \"completed\" || key === \"pass\") {\r\n icon = <CheckCircleOutlineIcon sx={{ fontSize: 15, color: \"#2e7d32\" }} />;\r\n } else if (key === \"partial\") {\r\n icon = <RemoveCircleOutlineIcon sx={{ fontSize: 15, color: \"#e65100\" }} />;\r\n } else if (key === \"na\") {\r\n icon = <RemoveCircleOutlineIcon sx={{ fontSize: 15, color: \"#757575\" }} />;\r\n } else {\r\n icon = <HighlightOffIcon sx={{ fontSize: 15, color: \"#c62828\" }} />;\r\n }\r\n return (\r\n <Box sx={{ display: \"inline-flex\", alignItems: \"center\", gap: \"4px\" }}>\r\n {icon}\r\n <StatusBadge label={label} />\r\n </Box>\r\n );\r\n}\r\n\r\ninterface ProgressValue { score: number; max: number }\r\n\r\nfunction ProgressCell({ value, primary }: { value: ProgressValue; primary: string }) {\r\n const pct = Math.min(Math.round((value.score / value.max) * 100), 100);\r\n const barColor = pct < 80 ? \"#c62828\" : primary;\r\n return (\r\n <Box sx={{ display: \"flex\", alignItems: \"center\", gap: 1, minWidth: 100 }}>\r\n <LinearProgress variant=\"determinate\" value={pct} sx={{ flex: 1, height: 5, borderRadius: 3, backgroundColor: alpha(barColor, 0.12), \"& .MuiLinearProgress-bar\": { backgroundColor: barColor, borderRadius: 3 } }} />\r\n <Typography sx={{ fontSize: \"0.68rem\", color: \"text.secondary\", minWidth: 28, textAlign: \"right\" }}>{pct}%</Typography>\r\n </Box>\r\n );\r\n}\r\n\r\n// ─── Shared styles ─────────────────────────────────────────────────────────────\r\n\r\nconst TH: SxProps<Theme> = { fontSize: \"0.72rem\", fontWeight: 700, color: \"text.secondary\", py: \"7px\", px: \"10px\", backgroundColor: \"#f5f7f8\", borderBottom: \"1px solid\", borderColor: \"divider\", whiteSpace: \"nowrap\" };\r\nconst TD: SxProps<Theme> = { fontSize: \"0.75rem\", color: \"text.primary\", py: \"6px\", px: \"10px\", borderBottom: \"1px solid\", borderColor: \"divider\", verticalAlign: \"middle\" };\r\n\r\nfunction SectionTitle({ children }: { children: React.ReactNode }) {\r\n return (\r\n <Typography sx={{ fontSize: \"0.78rem\", fontWeight: 700, color: \"text.primary\", mb: \"8px\", mt: \"4px\" }}>\r\n {children}\r\n </Typography>\r\n );\r\n}\r\n\r\n// ─── Transcript bubbles (mirrors Transcript.tsx chat layout) ───────────────────\r\n\r\nfunction TranscriptBubbles({ text }: { text: string }) {\r\n const lines = text.split(\"\\n\").filter((l) => l.trim().length > 0);\r\n if (!lines.length) {\r\n return <Typography sx={{ fontSize: \"0.75rem\", color: \"text.secondary\" }}>No transcript available.</Typography>;\r\n }\r\n return (\r\n <Box sx={{ display: \"flex\", flexDirection: \"column\", gap: \"6px\" }}>\r\n {lines.map((line, idx) => {\r\n const isPatient = line.trim().toLowerCase().startsWith(\"patient\");\r\n const text = line.replace(/^\\s*(Patient|Agent)\\s*:\\s*/i, \"\");\r\n return (\r\n <Box key={idx} sx={{ display: \"flex\", justifyContent: isPatient ? \"flex-end\" : \"flex-start\", alignItems: \"flex-end\", gap: \"6px\" }}>\r\n {!isPatient && <Avatar sx={{ width: 22, height: 22, fontSize: 12 }} />}\r\n <Box\r\n sx={(t) => ({\r\n maxWidth: \"70%\",\r\n px: \"10px\",\r\n py: \"7px\",\r\n borderRadius: isPatient ? \"8px 8px 0 8px\" : \"8px 8px 8px 0\",\r\n backgroundColor: isPatient ? t.palette.primary.main : \"#fff\",\r\n color: isPatient ? t.palette.common.white : \"#222\",\r\n border: isPatient ? \"none\" : \"1px solid #e0e0e0\",\r\n fontSize: \"0.78rem\",\r\n lineHeight: 1.5,\r\n })}\r\n >\r\n {text}\r\n </Box>\r\n {isPatient && <Avatar sx={{ width: 22, height: 22, fontSize: 12 }} />}\r\n </Box>\r\n );\r\n })}\r\n </Box>\r\n );\r\n}\r\n\r\n// ─── Overview Tab ──────────────────────────────────────────────────────────────\r\n\r\nfunction OverviewTab({ data }: { data: NewAuditApiResponse }) {\r\n const meta = data.Audit_Metadata ?? {};\r\n const kvItems = [\r\n { label: \"Hospital Name\", value: meta.Hospital_Name ?? \"N/A\" },\r\n { label: \"Call Duration\", value: meta.Call_Duration ?? \"N/A\" },\r\n { label: \"Department\", value: meta[\"Process/Department\"] ?? \"N/A\" },\r\n { label: \"Agent Name\", value: meta.Agent_Name ?? \"N/A\" },\r\n { label: \"Call Disposition\", value: meta.Call_Disposition ?? \"N/A\" },\r\n { label: \"Employee ID\", value: meta.Employee_ID ?? \"N/A\" },\r\n { label: \"Call Category\", value: meta.Call_Category ?? \"N/A\" },\r\n { label: \"Team Leader\", value: meta.Team_Leader ?? \"N/A\" },\r\n { label: \"Call Type\", value: meta.Call_Type ?? \"N/A\" },\r\n { label: \"Auditor Name\", value: meta.Auditor_Name ?? \"N/A\" },\r\n { label: \"Call Date & Time\", value: meta.Call_Date_Time ?? \"N/A\" },\r\n { label: \"Language\", value: meta.Language ?? \"N/A\" },\r\n { label: \"Recording ID\", value: meta.Recording_ID ?? \"N/A\" },\r\n ];\r\n const half = Math.ceil(kvItems.length / 2);\r\n const col1 = kvItems.slice(0, half);\r\n const col2 = kvItems.slice(half);\r\n\r\n return (\r\n <Box sx={{ display: \"flex\", flexDirection: \"column\", gap: 2 }}>\r\n {/* Audit Metadata */}\r\n <Box>\r\n <SectionTitle>Audit Metadata</SectionTitle>\r\n <Box sx={{ border: \"1px solid\", borderColor: \"divider\", borderRadius: \"8px\", overflow: \"hidden\", backgroundColor: \"background.paper\" }}>\r\n <Box sx={{ display: \"flex\" }}>\r\n {[col1, col2].map((chunk, ci) => (\r\n <Box key={ci} sx={{ flex: \"1 1 240px\", minWidth: 0, borderRight: ci === 0 ? \"1px solid\" : \"none\", borderColor: \"divider\" }}>\r\n {chunk.map((item, ii) => (\r\n <Box key={ii} sx={{ display: \"flex\", alignItems: \"baseline\", borderBottom: ii < chunk.length - 1 ? \"1px solid\" : \"none\", borderColor: \"divider\", px: \"10px\", py: \"6px\", gap: 1 }}>\r\n <Typography sx={{ fontSize: \"0.72rem\", color: \"text.secondary\", minWidth: 140, flexShrink: 0 }}>{item.label}</Typography>\r\n <Typography sx={{ fontSize: \"0.75rem\", color: \"text.primary\", fontWeight: 500 }}>\r\n {item.value}\r\n </Typography>\r\n </Box>\r\n ))}\r\n </Box>\r\n ))}\r\n </Box>\r\n </Box>\r\n </Box>\r\n\r\n {/* Call Summary */}\r\n <Box>\r\n <SectionTitle>Call Summary</SectionTitle>\r\n <Box sx={{ border: \"1px solid\", borderColor: \"divider\", borderRadius: \"8px\", backgroundColor: \"background.paper\", px: \"14px\", py: \"10px\", maxHeight: 160, overflowY: \"auto\" }}>\r\n <Typography sx={{ fontSize: \"0.75rem\", color: \"text.secondary\", lineHeight: 1.7 }}>\r\n {data.Call_Summary ?? \"No summary available.\"}\r\n </Typography>\r\n </Box>\r\n </Box>\r\n\r\n {/* Call Transcription */}\r\n <Box>\r\n <SectionTitle>Call Transcription</SectionTitle>\r\n <Box sx={{ border: \"1px solid\", borderColor: \"divider\", borderRadius: \"8px\", backgroundColor: \"#f9f9f9\", px: \"14px\", py: \"12px\", maxHeight: 320, overflowY: \"auto\" }}>\r\n <TranscriptBubbles text={data.transcript ?? \"\"} />\r\n </Box>\r\n </Box>\r\n </Box>\r\n );\r\n}\r\n\r\n// ─── Scorecard Tab ─────────────────────────────────────────────────────────────\r\n\r\nconst SCORECARD_PARAMS: Array<{ key: keyof QualityScorecard; label: string; defaultMax: number }> = [\r\n { key: \"Opening_and_Greeting\", label: \"Opening & Greeting\", defaultMax: 10 },\r\n { key: \"Verification_and_Authentication\", label: \"Verification & Authentication\", defaultMax: 10 },\r\n { key: \"Communication_and_Soft_Skills\", label: \"Communication & Soft Skills\", defaultMax: 15 },\r\n { key: \"Process_and_Workflow_Adherence\", label: \"Process & Workflow Adherence\", defaultMax: 25 },\r\n { key: \"Resolution_Accuracy\", label: \"Resolution Accuracy\", defaultMax: 20 },\r\n { key: \"Empathy_and_Patient_Assurance\", label: \"Empathy & Patient Assurance\", defaultMax: 10 },\r\n { key: \"Call_Handling\", label: \"Call Handling\", defaultMax: 5 },\r\n { key: \"Closing_and_Customer_Education\", label: \"Closing & Customer Education\", defaultMax: 5 },\r\n];\r\n\r\nfunction ScorecardTab({ data, primary }: { data: NewAuditApiResponse; primary: string }) {\r\n const sc = data.Quality_Scorecard ?? {};\r\n const summary = data.Executive_Audit_Summary ?? {};\r\n\r\n const rawScore = sc.Total_Score ?? summary.Overall_Audit_Score_Percentage ?? 0;\r\n const overallScore = typeof rawScore === \"string\" ? parseFloat(rawScore.replace(\"%\", \"\")) || 0 : rawScore;\r\n const pct = Math.min(Math.round((overallScore / 100) * 100), 100);\r\n const resultBadge = summary.Audit_Result ?? sc.Final_Rating ?? \"N/A\";\r\n\r\n const metrics = [\r\n { label: \"Audit Result\", value: summary.Audit_Result ?? \"N/A\" },\r\n { label: \"First Call Resolution\", value: summary.First_Call_Resolution_FCR ?? \"N/A\" },\r\n { label: \"Patient Experience\", value: summary.Customer_Experience ?? summary.Patient_Sentiment ?? \"N/A\" },\r\n { label: \"Process Adherence\", value: summary.Process_Adherence ?? \"N/A\" },\r\n { label: \"Effective Communication\", value: summary.Communication_Effectiveness ?? \"N/A\" },\r\n ];\r\n\r\n return (\r\n <Box sx={{ display: \"flex\", flexDirection: \"column\", gap: 2.5 }}>\r\n {/* Overall score + metric cards */}\r\n <Box sx={{ display: \"flex\", gap: 2, flexWrap: \"wrap\", alignItems: \"stretch\" }}>\r\n <Box sx={{ display: \"flex\", flexDirection: \"column\", alignItems: \"center\", justifyContent: \"center\", border: \"1px solid\", borderColor: \"divider\", borderRadius: \"8px\", backgroundColor: \"background.paper\", px: 3, py: 2, minWidth: 140, gap: 0.5 }}>\r\n <Typography sx={{ fontSize: \"0.72rem\", color: \"text.secondary\", fontWeight: 600, mb: 0.5, letterSpacing: \"0.04em\" }}>OVERALL SCORE</Typography>\r\n <Box sx={{ display: \"flex\", alignItems: \"baseline\", gap: \"3px\" }}>\r\n <Typography sx={{ fontSize: \"2.4rem\", fontWeight: 700, color: primary, lineHeight: 1 }}>{overallScore}</Typography>\r\n <Typography sx={{ fontSize: \"0.85rem\", color: \"text.secondary\", fontWeight: 600 }}>/100</Typography>\r\n </Box>\r\n <Box sx={{ width: \"100%\", mt: 0.75 }}>\r\n <LinearProgress variant=\"determinate\" value={pct} sx={{ height: 6, borderRadius: 3, backgroundColor: alpha(primary, 0.12), \"& .MuiLinearProgress-bar\": { backgroundColor: primary, borderRadius: 3 } }} />\r\n </Box>\r\n <Box sx={{ mt: 0.75 }}><StatusBadge label={resultBadge} /></Box>\r\n </Box>\r\n <Box sx={{ flex: 1, minWidth: 260, display: \"flex\", flexDirection: \"column\", gap: \"8px\", alignSelf: \"stretch\" }}>\r\n <Box sx={{ flex: 1, display: \"grid\", gridTemplateColumns: \"repeat(3, 1fr)\", gap: \"8px\" }}>\r\n {metrics.slice(0, 3).map((m) => (\r\n <Box key={m.label} sx={{ border: \"1px solid\", borderColor: \"divider\", borderRadius: \"6px\", backgroundColor: \"background.paper\", px: \"10px\", py: \"8px\", display: \"flex\", flexDirection: \"column\", alignItems: \"center\", justifyContent: \"center\", gap: \"6px\" }}>\r\n <Typography sx={{ fontSize: \"0.72rem\", color: \"text.secondary\", lineHeight: 1.3, textAlign: \"center\" }}>{m.label}</Typography>\r\n <StatusBadge label={m.value} />\r\n </Box>\r\n ))}\r\n </Box>\r\n <Box sx={{ flex: 1, display: \"grid\", gridTemplateColumns: \"repeat(3, 1fr)\", gap: \"8px\" }}>\r\n {metrics.slice(3).map((m) => (\r\n <Box key={m.label} sx={{ border: \"1px solid\", borderColor: \"divider\", borderRadius: \"6px\", backgroundColor: \"background.paper\", px: \"10px\", py: \"8px\", display: \"flex\", flexDirection: \"column\", alignItems: \"center\", justifyContent: \"center\", gap: \"6px\" }}>\r\n <Typography sx={{ fontSize: \"0.72rem\", color: \"text.secondary\", lineHeight: 1.3, textAlign: \"center\" }}>{m.label}</Typography>\r\n <StatusBadge label={m.value} />\r\n </Box>\r\n ))}\r\n </Box>\r\n </Box>\r\n </Box>\r\n\r\n {/* Quality Scorecard table */}\r\n <Box>\r\n <SectionTitle>Quality Scorecard</SectionTitle>\r\n <TableContainer sx={{ border: \"1px solid\", borderColor: \"divider\", borderRadius: \"8px\", overflow: \"hidden\" }}>\r\n <Table size=\"small\">\r\n <TableHead>\r\n <TableRow>\r\n {[\r\n { label: \"Evaluation Parameter\", align: \"left\", minWidth: 180 },\r\n { label: \"Weightage\", align: \"center\", minWidth: 90 },\r\n { label: \"Score\", align: \"center\", minWidth: 80 },\r\n { label: \"\", align: \"left\", minWidth: 120 },\r\n { label: \"Remarks\", align: \"left\", minWidth: 160 },\r\n ].map((col, i) => (\r\n <TableCell key={i} sx={{ ...TH, textAlign: col.align as any, minWidth: col.minWidth }}>{col.label}</TableCell>\r\n ))}\r\n </TableRow>\r\n </TableHead>\r\n <TableBody>\r\n {SCORECARD_PARAMS.map((p) => {\r\n const entry = sc[p.key] as ScorecardEntry | undefined;\r\n const rawEntryScore = entry?.Score_Obtained;\r\n const score = typeof rawEntryScore === \"string\" ? parseFloat(rawEntryScore) || 0 : (rawEntryScore ?? 0);\r\n const max = entry?.Weightage ?? p.defaultMax;\r\n return (\r\n <TableRow key={p.key}>\r\n <TableCell sx={{ ...TD }}>{p.label}</TableCell>\r\n <TableCell sx={{ ...TD, textAlign: \"center\" }}>{max}</TableCell>\r\n <TableCell sx={{ ...TD, textAlign: \"center\" }}>{rawEntryScore ?? \"—\"}</TableCell>\r\n <TableCell sx={{ ...TD }}><ProgressCell value={{ score, max }} primary={primary} /></TableCell>\r\n <TableCell sx={{ ...TD }}>{entry?.Remarks ?? \"—\"}</TableCell>\r\n </TableRow>\r\n );\r\n })}\r\n <TableRow sx={{ backgroundColor: \"#f5f7f8\", \"& td\": { borderBottom: 0 } }}>\r\n <TableCell sx={{ ...TD, fontWeight: 700 }}>Total Score</TableCell>\r\n <TableCell sx={{ ...TD, textAlign: \"center\", fontWeight: 700 }}>100</TableCell>\r\n <TableCell sx={{ ...TD, textAlign: \"center\", fontWeight: 700 }}>{overallScore}</TableCell>\r\n <TableCell sx={{ ...TD }}><ProgressCell value={{ score: overallScore, max: 100 }} primary={primary} /></TableCell>\r\n <TableCell sx={{ ...TD, fontWeight: 700 }}><StatusBadge label={sc.Final_Rating ?? resultBadge} /></TableCell>\r\n </TableRow>\r\n </TableBody>\r\n </Table>\r\n </TableContainer>\r\n </Box>\r\n </Box>\r\n );\r\n}\r\n\r\n// ─── Audit Checklist Tab ───────────────────────────────────────────────────────\r\n\r\ninterface ChecklistRow { parameter: string; expectedStandard: string; status: string; remarks: string; qaObservation: string }\r\n\r\nconst OPENING_LABELS: Record<string, string> = { Standard_Greeting_Used: \"Standard Greeting Used\", Hospital_Name_Mentioned: \"Hospital Name Mentioned\", Agent_Introduction_Provided: \"Agent Introduction Provided\", Professional_Tone_Maintained: \"Professional Tone Maintained\" };\r\nconst OPENING_EXPECTED: Record<string, string> = { Standard_Greeting_Used: \"Agent must greet as per approved hospital script\", Hospital_Name_Mentioned: \"Mandatory hospital identification\", Agent_Introduction_Provided: \"Agent must introduce self\", Professional_Tone_Maintained: \"Warm and professional tone expected\" };\r\n\r\nconst VERIFICATION_LABELS: Record<string, string> = { Patient_Name_Captured: \"Patient Name Captured\", \"Existing_New_Patient_Validation\": \"Existing/New Patient Validation\", Registered_Mobile_Number_Verified: \"Registered Mobile Number Verified\", \"Secondary_Authentication_DOB_UHID\": \"Secondary Authentication (DOB/UHID)\" };\r\nconst VERIFICATION_EXPECTED: Record<string, string> = { Patient_Name_Captured: \"Mandatory for identification\", \"Existing_New_Patient_Validation\": \"Required for workflow routing\", Registered_Mobile_Number_Verified: \"Mandatory authentication step\", \"Secondary_Authentication_DOB_UHID\": \"Recommended compliance practice\" };\r\n\r\nconst COMM_LABELS: Record<string, string> = { Clarity_of_Speech: \"Clarity of Speech\", Active_Listening_Demonstrated: \"Active Listening Demonstrated\", Avoidance_of_Dead_Air: \"Avoidance of Dead Air\", Professional_Language_Usage: \"Professional Language Usage\", Empathy_Statements_Used: \"Empathy Statements Used\" };\r\nconst COMM_EXPECTED: Record<string, string> = { Clarity_of_Speech: \"Clear and understandable communication\", Active_Listening_Demonstrated: \"Agent should acknowledge caller inputs\", Avoidance_of_Dead_Air: \"Minimal silence during call\", Professional_Language_Usage: \"No slang/rude language\", Empathy_Statements_Used: \"Emotional acknowledgement expected\" };\r\n\r\nconst EMPATHY_LABELS: Record<string, string> = { Patient_Concern_Acknowledged: \"Patient Concern Acknowledged\", Empathy_Toward_Patient_Condition: \"Empathy Toward Patient Condition\", Severity_Red_Flag_Probing: \"Severity/Red Flag Probing\", Professional_Behaviour_Maintained: \"Professional Behaviour Maintained\" };\r\nconst EMPATHY_EXPECTED: Record<string, string> = { Patient_Concern_Acknowledged: \"Agent should acknowledge caller concern\", Empathy_Toward_Patient_Condition: \"Empathetic reassurance expected\", Severity_Red_Flag_Probing: \"Escalation probing recommended where applicable\", Professional_Behaviour_Maintained: \"Calm and respectful handling required\" };\r\n\r\nconst CALL_HANDLING_LABELS: Record<string, string> = { \"Placing the Call on Hold\": \"Placing the Call on Hold\", Resuming_After_Hold: \"Resuming After Hold\", Apologizing_for_Inconvenience: \"Apologizing for Inconvenience\", Offering_Further_Assistance: \"Offering Further Assistance\" };\r\nconst CALL_HANDLING_EXPECTED: Record<string, string> = { \"Placing the Call on Hold\": \"Inform customer before placing on hold\", Resuming_After_Hold: \"Thank customer for holding\", Apologizing_for_Inconvenience: \"Apologize for any delays\", Offering_Further_Assistance: \"Ask if further help is needed\" };\r\n\r\nconst CLOSURE_LABELS: Record<string, string> = { Additional_Assistance_Offered: \"Additional Assistance Offered\", Professional_Closing_Provided: \"Professional Closing Provided\", \"Wellness/Courtesy_Statement_Used\": \"Wellness/Courtesy Statement Used\" };\r\nconst CLOSURE_EXPECTED: Record<string, string> = { Additional_Assistance_Offered: \"Mandatory closure check\", Professional_Closing_Provided: \"Standard closure etiquette expected\", \"Wellness/Courtesy_Statement_Used\": \"Positive healthcare closure preferred\" };\r\n\r\nconst EXCLUDED_KEYS = new Set([\"Patient_Data_Handling\", \"Recontact_Information_Shared\"]);\r\n\r\nfunction obsRecordToRows(record: ObsRecord | undefined, labelMap: Record<string, string>, expectedMap: Record<string, string>): ChecklistRow[] {\r\n return Object.entries(record ?? {})\r\n .filter(([key]) => !EXCLUDED_KEYS.has(key))\r\n .map(([key, val]) => ({\r\n parameter: labelMap[key] ?? key.replace(/_/g, \" \"),\r\n expectedStandard: expectedMap[key] ?? \"—\",\r\n status: val.Status ?? \"N/A\",\r\n remarks: val.Remarks ?? \"—\",\r\n qaObservation: val.Observation_Impact ?? \"—\",\r\n }));\r\n}\r\n\r\nfunction processWorkflowRows(groups: ChecklistGroup[] | undefined): ChecklistRow[] {\r\n return (groups ?? []).flatMap((g) =>\r\n (g?.items ?? []).map((item) => ({\r\n parameter: item.parameter ?? \"—\",\r\n expectedStandard: item.expectedStandard ?? \"—\",\r\n status: item.status ?? \"N/A\",\r\n remarks: item.remarks ?? \"—\",\r\n qaObservation: item.qaObservation ?? \"—\",\r\n })),\r\n );\r\n}\r\n\r\nconst CHECKLIST_COLS = [\r\n { key: \"parameter\", label: \"Audit Parameter\", minWidth: 180 },\r\n { key: \"expectedStandard\", label: \"Expected Standard\", minWidth: 200 },\r\n { key: \"status\", label: \"Status\", minWidth: 130 },\r\n { key: \"remarks\", label: \"Remarks\", minWidth: 160 },\r\n { key: \"qaObservation\", label: \"QA Observation / Impact\", minWidth: 180 },\r\n];\r\n\r\nfunction ChecklistTable({ title, rows }: { title: string; rows: ChecklistRow[] }) {\r\n const visibleRows = rows;\r\n if (!visibleRows.length) return null;\r\n return (\r\n <Box>\r\n <SectionTitle>{title}</SectionTitle>\r\n <TableContainer sx={{ border: \"1px solid\", borderColor: \"divider\", borderRadius: \"8px\", overflow: \"hidden\" }}>\r\n <Table size=\"small\">\r\n <TableHead>\r\n <TableRow>\r\n {CHECKLIST_COLS.map((col) => (\r\n <TableCell key={col.key} sx={{ ...TH, minWidth: col.minWidth }}>{col.label}</TableCell>\r\n ))}\r\n </TableRow>\r\n </TableHead>\r\n <TableBody>\r\n {visibleRows.map((row, ri) => (\r\n <TableRow key={ri} sx={{ \"&:last-child td\": { borderBottom: 0 } }}>\r\n <TableCell sx={{ ...TD }}>{row.parameter}</TableCell>\r\n <TableCell sx={{ ...TD }}>{row.expectedStandard}</TableCell>\r\n <TableCell sx={{ ...TD }}><StatusIconBadge label={row.status} /></TableCell>\r\n <TableCell sx={{ ...TD }}>{row.remarks}</TableCell>\r\n <TableCell sx={{ ...TD }}>{row.qaObservation}</TableCell>\r\n </TableRow>\r\n ))}\r\n </TableBody>\r\n </Table>\r\n </TableContainer>\r\n </Box>\r\n );\r\n}\r\n\r\nfunction DispositionFrameworkTable({ data }: { data: NewAuditApiResponse }) {\r\n const rows = (data.Disposition_Based_Quality_Framework ?? []).flatMap((df) =>\r\n (df?.frameworks ?? []).map((fw) => ({\r\n dispositionType: df.dispositionType ?? \"—\",\r\n expectedFramework: fw.expectedFramework ?? \"—\",\r\n status: fw.status ?? \"N/A\",\r\n remarks: fw.remarks ?? \"—\",\r\n })),\r\n ).filter((r) => r.expectedFramework.toLowerCase().trim() !== \"clinical sensitivity handling\");\r\n\r\n if (!rows.length) {\r\n return <Typography sx={{ fontSize: \"0.75rem\", color: \"text.secondary\" }}>No disposition framework data available.</Typography>;\r\n }\r\n\r\n return (\r\n <Box>\r\n <SectionTitle>Disposition-Based Quality Framework</SectionTitle>\r\n <TableContainer sx={{ border: \"1px solid\", borderColor: \"divider\", borderRadius: \"8px\", overflow: \"hidden\" }}>\r\n <Table size=\"small\">\r\n <TableHead>\r\n <TableRow>\r\n {[\r\n { label: \"Disposition Type\", minWidth: 160 },\r\n { label: \"Expected Framework\", minWidth: 200 },\r\n { label: \"Status\", minWidth: 120 },\r\n { label: \"Remarks\", minWidth: 160 },\r\n ].map((col, i) => (\r\n <TableCell key={i} sx={{ ...TH, minWidth: col.minWidth }}>{col.label}</TableCell>\r\n ))}\r\n </TableRow>\r\n </TableHead>\r\n <TableBody>\r\n {rows.map((row, ri) => (\r\n <TableRow key={ri} sx={{ \"&:last-child td\": { borderBottom: 0 } }}>\r\n <TableCell sx={{ ...TD }}>{row.dispositionType}</TableCell>\r\n <TableCell sx={{ ...TD }}>{row.expectedFramework}</TableCell>\r\n <TableCell sx={{ ...TD }}><StatusIconBadge label={row.status} /></TableCell>\r\n <TableCell sx={{ ...TD }}>{row.remarks}</TableCell>\r\n </TableRow>\r\n ))}\r\n </TableBody>\r\n </Table>\r\n </TableContainer>\r\n </Box>\r\n );\r\n}\r\n\r\nfunction AuditChecklistTab({ data, primary: _primary }: { data: NewAuditApiResponse; primary: string }) {\r\n const [view, setView] = useState<\"overview\" | \"detailed\">(\"overview\");\r\n const obs = data.Section_Wise_Audit_Observations_Checklist ?? {};\r\n\r\n return (\r\n <Box sx={{ display: \"flex\", flexDirection: \"column\", gap: 2 }}>\r\n <Box sx={{ display: \"flex\", justifyContent: \"flex-start\" }}>\r\n <ToggleButtonGroup\r\n value={view}\r\n exclusive\r\n onChange={(_, v) => v && setView(v)}\r\n size=\"small\"\r\n sx={{\r\n \"& .MuiToggleButton-root\": {\r\n fontSize: \"0.72rem\",\r\n fontWeight: 600,\r\n textTransform: \"none\",\r\n px: 1.5,\r\n py: \"4px\",\r\n border: \"1px solid\",\r\n borderColor: \"divider\",\r\n color: \"text.secondary\",\r\n \"&.Mui-selected\": { backgroundColor: _primary, color: \"#fff\", borderColor: _primary, \"&:hover\": { backgroundColor: _primary } },\r\n },\r\n }}\r\n >\r\n <ToggleButton value=\"overview\">Overview</ToggleButton>\r\n <ToggleButton value=\"detailed\">Detailed</ToggleButton>\r\n </ToggleButtonGroup>\r\n </Box>\r\n\r\n {view === \"overview\" && <DispositionFrameworkTable data={data} />}\r\n\r\n {view === \"detailed\" && (\r\n <Box sx={{ display: \"flex\", flexDirection: \"column\", gap: 2 }}>\r\n <ChecklistTable title=\"Opening & Greeting\" rows={obsRecordToRows(obs.Opening_and_Greeting, OPENING_LABELS, OPENING_EXPECTED)} />\r\n <ChecklistTable title=\"Verification & Authentication\" rows={obsRecordToRows(obs.Verification_and_Authentication, VERIFICATION_LABELS, VERIFICATION_EXPECTED)} />\r\n <ChecklistTable title=\"Communication Effectiveness\" rows={obsRecordToRows(obs.Communication_and_Soft_Skills, COMM_LABELS, COMM_EXPECTED)} />\r\n <ChecklistTable title=\"Process & Workflow Adherence\" rows={processWorkflowRows(obs.Process_and_Workflow_Adherence)} />\r\n <ChecklistTable title=\"Empathy & Patient Assurance\" rows={obsRecordToRows(obs.Empathy_and_Patient_Assurance, EMPATHY_LABELS, EMPATHY_EXPECTED)} />\r\n <ChecklistTable title=\"Call Handling\" rows={obsRecordToRows(obs.Call_Handling, CALL_HANDLING_LABELS, CALL_HANDLING_EXPECTED)} />\r\n <ChecklistTable title=\"Call Closure & Customer Education\" rows={obsRecordToRows(obs.Call_Closure_and_Customer_Education, CLOSURE_LABELS, CLOSURE_EXPECTED)} />\r\n </Box>\r\n )}\r\n </Box>\r\n );\r\n}\r\n\r\n// ─── Root Cause Analysis Tab ───────────────────────────────────────────────────\r\n\r\nfunction RootCauseAnalysisTab({ data, primary }: { data: NewAuditApiResponse; primary: string }) {\r\n const rcaRows = data.Root_Cause_Analysis ?? [];\r\n const rec = data.Auditor_Recommendation ?? {};\r\n\r\n return (\r\n <Box sx={{ display: \"flex\", flexDirection: \"column\", gap: 2 }}>\r\n <Box>\r\n <SectionTitle>Root Cause Analysis</SectionTitle>\r\n {rcaRows.length > 0 ? (\r\n <TableContainer sx={{ border: \"1px solid\", borderColor: \"divider\", borderRadius: \"8px\", overflow: \"hidden\" }}>\r\n <Table size=\"small\">\r\n <TableHead>\r\n <TableRow>\r\n {[{ label: \"Observation\", minWidth: 180 }, { label: \"Root Cause\", minWidth: 200 }, { label: \"Impact\", minWidth: 200 }, { label: \"Severity\", minWidth: 90 }].map((col, i) => (\r\n <TableCell key={i} sx={{ ...TH, minWidth: col.minWidth }}>{col.label}</TableCell>\r\n ))}\r\n </TableRow>\r\n </TableHead>\r\n <TableBody>\r\n {rcaRows.map((row, ri) => (\r\n <TableRow key={ri} sx={{ \"&:last-child td\": { borderBottom: 0 } }}>\r\n <TableCell sx={{ ...TD }}>{row.Observation ?? \"—\"}</TableCell>\r\n <TableCell sx={{ ...TD }}>{row.Root_Cause ?? \"—\"}</TableCell>\r\n <TableCell sx={{ ...TD }}>{row.Impact ?? \"—\"}</TableCell>\r\n <TableCell sx={{ ...TD, textAlign: \"center\" }}>{row.Severity ? <StatusBadge label={row.Severity} /> : \"—\"}</TableCell>\r\n </TableRow>\r\n ))}\r\n </TableBody>\r\n </Table>\r\n </TableContainer>\r\n ) : (\r\n <Box sx={{ border: \"1px solid\", borderColor: \"divider\", borderRadius: \"8px\", px: \"14px\", py: \"10px\", backgroundColor: \"background.paper\" }}>\r\n <Typography sx={{ fontSize: \"0.75rem\", color: \"text.secondary\" }}>No significant root causes identified for this interaction.</Typography>\r\n </Box>\r\n )}\r\n </Box>\r\n\r\n {(toStringArray(rec.Key_Strengths).length > 0 || toStringArray(rec.Improvement_Areas).length > 0) && (\r\n <Box>\r\n <SectionTitle>Auditor's Recommendation</SectionTitle>\r\n <Box sx={{ display: \"flex\", gap: 2, flexWrap: \"wrap\" }}>\r\n {[\r\n { title: \"Key Strengths\", items: toStringArray(rec.Key_Strengths), color: \"#2e7d32\" },\r\n { title: \"Improvement Areas\", items: toStringArray(rec.Improvement_Areas), color: \"#e65100\" },\r\n ].filter((g) => (g.items?.length ?? 0) > 0).map((g) => (\r\n <Box key={g.title} sx={{ flex: \"1 1 200px\", border: \"1px solid\", borderColor: \"divider\", borderRadius: \"6px\", backgroundColor: \"background.paper\", px: \"14px\", py: \"10px\" }}>\r\n <Typography sx={{ fontSize: \"0.78rem\", fontWeight: 600, color: \"text.primary\", mb: \"8px\" }}>{g.title}</Typography>\r\n {g.items?.map((item, ii) => (\r\n <Box key={ii} sx={{ display: \"flex\", alignItems: \"flex-start\", gap: \"7px\", mb: \"5px\" }}>\r\n <Box sx={{ width: 5, height: 5, borderRadius: \"50%\", backgroundColor: g.color, mt: \"5px\", flexShrink: 0 }} />\r\n <Typography sx={{ fontSize: \"0.75rem\", color: \"text.secondary\", lineHeight: 1.5 }}>{item}</Typography>\r\n </Box>\r\n ))}\r\n </Box>\r\n ))}\r\n </Box>\r\n </Box>\r\n )}\r\n\r\n {data.Final_Auditor_Remarks && (\r\n <Box sx={{ border: \"1px solid\", borderLeft: \"3px solid\", borderColor: \"divider\", borderLeftColor: primary, borderRadius: \"6px\", px: \"14px\", py: \"10px\", backgroundColor: alpha(primary, 0.04) }}>\r\n <Typography sx={{ fontSize: \"0.78rem\", fontWeight: 600, color: primary, mb: \"6px\" }}>Final Auditor Remarks</Typography>\r\n <Typography sx={{ fontSize: \"0.75rem\", color: \"text.secondary\", lineHeight: 1.6 }}>{data.Final_Auditor_Remarks}</Typography>\r\n </Box>\r\n )}\r\n </Box>\r\n );\r\n}\r\n\r\n// ─── Static tabs ───────────────────────────────────────────────────────────────\r\n\r\nconst STATIC_TABS = [\r\n { id: \"overview\", label: \"Overview\" },\r\n { id: \"scorecard\", label: \"Scorecard\" },\r\n { id: \"checklist\", label: \"Audit Checklist\" },\r\n { id: \"rca\", label: \"Root Cause Analysis\" },\r\n];\r\n\r\n// ─── Data hook ─────────────────────────────────────────────────────────────────\r\n\r\nfunction useAuditReportData(callUuid?: string, active = true) {\r\n const [activeTab, setActiveTab] = useState(0);\r\n const [apiData, setApiData] = useState<NewAuditApiResponse | null>(null);\r\n const [auditLoading, setAuditLoading] = useState(false);\r\n const [auditError, setAuditError] = useState<string | null>(null);\r\n\r\n useEffect(() => {\r\n setApiData(null);\r\n setAuditError(null);\r\n setActiveTab(0);\r\n\r\n if (!active || !callUuid) return;\r\n\r\n let cancelled = false;\r\n setAuditLoading(true);\r\n axiosInstance\r\n .get<NewAuditApiResponse>(END_POINT.CALLSAGE_AUDIT(callUuid))\r\n .then((res) => { if (!cancelled) setApiData(res.data); })\r\n .catch((err: any) => {\r\n if (!cancelled) setAuditError(err?.response?.data?.message ?? err?.message ?? \"Failed to generate audit report\");\r\n })\r\n .finally(() => { if (!cancelled) setAuditLoading(false); });\r\n return () => { cancelled = true; };\r\n }, [active, callUuid]);\r\n\r\n return { activeTab, setActiveTab, apiData, auditLoading, auditError };\r\n}\r\n\r\n// ─── Print layout ──────────────────────────────────────────────────────────────\r\n\r\nconst PRINT_ROOT_ID = \"audit-report-print-root\";\r\n\r\nconst PRINT_STYLES = (\r\n <GlobalStyles\r\n styles={{\r\n [`#${PRINT_ROOT_ID}`]: { position: \"absolute\", width: \"1px\", height: \"1px\", overflow: \"hidden\", clip: \"rect(0 0 0 0)\", clipPath: \"inset(50%)\", whiteSpace: \"nowrap\", pointerEvents: \"none\" },\r\n \"@media print\": {\r\n \"body *\": { visibility: \"hidden\" },\r\n [`#${PRINT_ROOT_ID}`]: { visibility: \"visible\", position: \"absolute\", top: 0, left: 0, width: \"100%\", height: \"auto\", overflow: \"visible\", clip: \"auto\", clipPath: \"none\", whiteSpace: \"normal\", padding: \"0 8mm\", boxSizing: \"border-box\" },\r\n [`#${PRINT_ROOT_ID} *`]: { visibility: \"visible\", printColorAdjust: \"exact\", WebkitPrintColorAdjust: \"exact\" } as React.CSSProperties,\r\n },\r\n }}\r\n />\r\n);\r\n\r\n// ─── Inner component (shared by dialog + full-page) ───────────────────────────\r\n\r\ninterface AuditReportInnerProps {\r\n callUuid?: string;\r\n active?: boolean;\r\n primary: string;\r\n onClose?: () => void;\r\n onMaximize?: () => void;\r\n}\r\n\r\nfunction buildHeaderBadges(data: NewAuditApiResponse): Array<{ label: string; value: string; asBadge?: boolean }> {\r\n const sc = data.Quality_Scorecard ?? {};\r\n const summary = data.Executive_Audit_Summary ?? {};\r\n const meta = data.Audit_Metadata ?? {};\r\n return [\r\n { label: \"Call Disposition\", value: meta.Call_Disposition ?? \"N/A\" },\r\n { label: \"Result\", value: summary.Audit_Result ?? \"N/A\", asBadge: true },\r\n { label: \"Score\", value: `${sc.Total_Score ?? summary.Overall_Audit_Score_Percentage ?? 0}/100` },\r\n ];\r\n}\r\n\r\nfunction AuditReportInner({ callUuid, active = true, primary, onClose, onMaximize }: AuditReportInnerProps) {\r\n const { activeTab, setActiveTab, apiData, auditLoading, auditError } = useAuditReportData(callUuid, active);\r\n\r\n const headerBadges = apiData ? buildHeaderBadges(apiData) : [];\r\n const subtitle = apiData\r\n ? [apiData.Audit_Metadata?.Agent_Name, apiData.Audit_Metadata?.Hospital_Name, apiData.Audit_Metadata?.Call_Date_Time].filter(Boolean).join(\" · \") || undefined\r\n : undefined;\r\n\r\n const iconButtonSx = {\r\n flexShrink: 0, width: 28, height: 28, borderRadius: \"6px\", backgroundColor: \"action.hover\", color: \"text.secondary\",\r\n \"&:hover\": { backgroundColor: \"action.selected\", color: \"text.primary\" },\r\n transition: \"all 0.15s ease\",\r\n } as const;\r\n\r\n function renderTab() {\r\n if (!apiData) return null;\r\n switch (activeTab) {\r\n case 0: return <OverviewTab data={apiData} />;\r\n case 1: return <ScorecardTab data={apiData} primary={primary} />;\r\n case 2: return <AuditChecklistTab data={apiData} primary={primary} />;\r\n case 3: return <RootCauseAnalysisTab data={apiData} primary={primary} />;\r\n default: return null;\r\n }\r\n }\r\n\r\n return (\r\n <>\r\n {PRINT_STYLES}\r\n {createPortal(\r\n <div id={PRINT_ROOT_ID}>\r\n <Box sx={{ mb: 2.5, pb: 1.5, borderBottom: \"2px solid\", borderColor: \"divider\" }}>\r\n <Typography sx={{ fontSize: \"1.2rem\", fontWeight: 700, color: \"text.primary\" }}>Audit Report</Typography>\r\n {subtitle && <Typography sx={{ fontSize: \"0.8rem\", color: \"text.secondary\", mt: \"4px\" }}>{subtitle}</Typography>}\r\n </Box>\r\n {apiData && (\r\n <Box sx={{ display: \"flex\", flexDirection: \"column\", gap: 3 }}>\r\n <OverviewTab data={apiData} />\r\n <ScorecardTab data={apiData} primary={primary} />\r\n <AuditChecklistTab data={apiData} primary={primary} />\r\n <RootCauseAnalysisTab data={apiData} primary={primary} />\r\n </Box>\r\n )}\r\n </div>,\r\n document.body,\r\n )}\r\n\r\n {/* Title bar */}\r\n <Box sx={{ px: { xs: 2, md: 2.5 }, py: \"12px\", display: \"flex\", alignItems: \"flex-start\", justifyContent: \"space-between\", gap: 1, borderBottom: \"1px solid\", borderColor: \"divider\", flexShrink: 0 }}>\r\n <Box sx={{ minWidth: 0 }}>\r\n <Typography sx={{ fontWeight: 700, fontSize: { xs: \"1rem\", sm: \"1.2rem\" }, color: \"text.primary\", lineHeight: 1.3 }}>Audit Report</Typography>\r\n {subtitle && <Typography sx={{ fontSize: \"0.78rem\", color: \"text.secondary\", mt: \"3px\" }}>{subtitle}</Typography>}\r\n </Box>\r\n <Box sx={{ display: \"flex\", alignItems: \"center\", gap: 0.75, flexShrink: 0 }}>\r\n {onMaximize && (\r\n <IconButton size=\"small\" onClick={onMaximize} title=\"Open in new tab\" sx={iconButtonSx}>\r\n <LaunchIcon sx={{ fontSize: 14 }} />\r\n </IconButton>\r\n )}\r\n {onClose && (\r\n <IconButton size=\"small\" onClick={onClose} title=\"Close\" sx={iconButtonSx}>\r\n <CloseIcon sx={{ fontSize: 15 }} />\r\n </IconButton>\r\n )}\r\n </Box>\r\n </Box>\r\n\r\n {/* Header badges */}\r\n {headerBadges.length > 0 && (\r\n <Box sx={{ px: { xs: 2, md: 2.5 }, py: \"8px\", display: \"flex\", alignItems: \"center\", gap: \"8px\", flexWrap: \"wrap\", borderBottom: \"1px solid\", borderColor: \"divider\", backgroundColor: \"#f5f7f8\", flexShrink: 0 }}>\r\n {headerBadges.map((badge, i) =>\r\n badge.asBadge ? (\r\n <StatusBadge key={i} label={badge.value} />\r\n ) : (\r\n <Box key={i} sx={{ display: \"flex\", alignItems: \"center\", gap: \"5px\", px: \"9px\", height: 26, border: \"1px solid\", borderColor: \"divider\", borderRadius: \"5px\", backgroundColor: \"background.paper\" }}>\r\n <Box sx={{ width: 5, height: 5, borderRadius: \"50%\", backgroundColor: primary, flexShrink: 0 }} />\r\n <Typography sx={{ fontSize: \"0.72rem\", color: \"text.secondary\", whiteSpace: \"nowrap\" }}>\r\n <Box component=\"span\" sx={{ fontWeight: 600, color: \"text.primary\", mr: \"3px\" }}>{badge.label}:</Box>\r\n {badge.value}\r\n </Typography>\r\n </Box>\r\n ),\r\n )}\r\n </Box>\r\n )}\r\n\r\n {/* Static tabs */}\r\n <Box sx={{ borderBottom: \"1px solid\", borderColor: \"divider\", backgroundColor: \"background.paper\", flexShrink: 0 }}>\r\n <Tabs\r\n value={activeTab}\r\n onChange={(_, v) => setActiveTab(v)}\r\n variant=\"scrollable\"\r\n scrollButtons=\"auto\"\r\n sx={{\r\n minHeight: 40,\r\n px: { xs: 1, md: 2 },\r\n \"& .MuiTab-root\": { fontSize: \"0.78rem\", fontWeight: 600, minHeight: 40, textTransform: \"none\", color: \"text.secondary\", py: 0, px: 1.5, \"&.Mui-selected\": { color: primary } },\r\n \"& .MuiTabs-indicator\": { backgroundColor: primary, height: 2 },\r\n }}\r\n >\r\n {STATIC_TABS.map((tab) => (\r\n <Tab key={tab.id} label={tab.label} disableRipple />\r\n ))}\r\n </Tabs>\r\n </Box>\r\n\r\n {/* Tab content */}\r\n <Box sx={{ flex: 1, overflow: \"auto\", px: { xs: 2, md: 2.5 }, py: 2 }}>\r\n {auditLoading && (\r\n <Box sx={{ display: \"flex\", justifyContent: \"center\", alignItems: \"center\", py: 6 }}>\r\n <CircularProgress size={32} />\r\n </Box>\r\n )}\r\n {!auditLoading && auditError && (\r\n <Alert severity=\"warning\" sx={{ mb: 2, fontSize: \"0.78rem\" }}>{auditError}</Alert>\r\n )}\r\n {!auditLoading && !auditError && !apiData && (\r\n <Box sx={{ display: \"flex\", justifyContent: \"center\", alignItems: \"center\", py: 6 }}>\r\n <Typography sx={{ fontSize: \"0.78rem\", color: \"text.secondary\" }}>No audit data available.</Typography>\r\n </Box>\r\n )}\r\n {!auditLoading && apiData && renderTab()}\r\n </Box>\r\n </>\r\n );\r\n}\r\n\r\n// ─── \"Open in new tab\" URL resolver (host-configurable) ─────────────────────────\r\n//\r\n// The maximize button opens the full-page audit report in a new browser tab.\r\n// This SDK runs inside different host apps that may mount the audit-report route\r\n// at a different path, behind a router `basename`, or with hash routing — so the\r\n// host decides how that URL is built. The default targets a ROOT-level\r\n// \"/audit-report/:callUuid\" route (what ahs-cti-ui registers); a host that mounts\r\n// the route elsewhere should call `setAuditReportUrlResolver` once at startup.\r\n\r\n/** Builds the URL the maximize button opens for a given call. */\r\nexport type AuditReportUrlResolver = (callUuid: string) => string;\r\n\r\nlet auditReportUrlResolver: AuditReportUrlResolver = (callUuid) =>\r\n `/audit-report/${encodeURIComponent(callUuid)}`;\r\n\r\n/**\r\n * Configure how the audit-report maximize button builds its new-tab URL.\r\n * Call once during host-app startup, alongside registering the route that\r\n * renders `SDKPages.AuditReportPage`.\r\n *\r\n * @example\r\n * // Route registered at \"/reports/audit-report/:callUuid\":\r\n * setAuditReportUrlResolver((id) => `/reports/audit-report/${encodeURIComponent(id)}`);\r\n * // Hash router:\r\n * setAuditReportUrlResolver((id) => `/#/audit-report/${encodeURIComponent(id)}`);\r\n */\r\nexport function setAuditReportUrlResolver(resolver: AuditReportUrlResolver): void {\r\n auditReportUrlResolver = resolver;\r\n}\r\n\r\n// ─── Public exports ────────────────────────────────────────────────────────────\r\n\r\ninterface AuditReportDialogProps {\r\n open: boolean;\r\n onClose: () => void;\r\n width?: string;\r\n rowData?: CdrRecordResponse;\r\n /**\r\n * Per-instance override of the maximize behaviour. When provided it takes\r\n * precedence over the globally-configured resolver — useful for in-app\r\n * navigation instead of opening a new tab.\r\n */\r\n onMaximize?: (callUuid: string) => void;\r\n}\r\n\r\n/**\r\n * Audit report shown in a modal dialog. The maximize button opens the same\r\n * report full-screen in a new browser tab. The URL is built by the\r\n * host-configured resolver (see `setAuditReportUrlResolver`).\r\n */\r\nexport default function AuditReportDialog({ open, onClose, width = \"80vw\", rowData, onMaximize }: AuditReportDialogProps) {\r\n const theme = useTheme();\r\n const primary = theme.palette.primary.main;\r\n const callUuid = rowData?.callUuid;\r\n\r\n const handleMaximize = () => {\r\n if (!callUuid) return;\r\n if (onMaximize) {\r\n onMaximize(callUuid);\r\n return;\r\n }\r\n // NOTE: open WITHOUT \"noopener\" so the new tab inherits a copy of this\r\n // tab's sessionStorage (auth session + API token live there) — otherwise\r\n // the new tab boots logged-out.\r\n window.open(auditReportUrlResolver(callUuid), \"_blank\");\r\n };\r\n\r\n return (\r\n <Dialog\r\n open={open}\r\n onClose={onClose}\r\n fullWidth\r\n slotProps={{\r\n paper: {\r\n sx: { width, maxWidth: width, height: \"90vh\", display: \"flex\", flexDirection: \"column\", overflow: \"hidden\", borderRadius: \"10px\" },\r\n },\r\n }}\r\n >\r\n {open && (\r\n <AuditReportInner\r\n callUuid={callUuid}\r\n active={open}\r\n primary={primary}\r\n onClose={onClose}\r\n onMaximize={callUuid ? handleMaximize : undefined}\r\n />\r\n )}\r\n </Dialog>\r\n );\r\n}\r\n\r\n/**\r\n * Stand-alone full-page audit report rendered by the `/audit-report/:callUuid` route.\r\n */\r\nexport function AuditReportFullPage({ callUuid }: { callUuid?: string }) {\r\n const theme = useTheme();\r\n const primary = theme.palette.primary.main;\r\n\r\n return (\r\n <Box sx={{ height: \"100vh\", display: \"flex\", flexDirection: \"column\", overflow: \"hidden\", backgroundColor: \"background.paper\" }}>\r\n <AuditReportInner callUuid={callUuid} active primary={primary} />\r\n </Box>\r\n );\r\n}\r\n\r\n"],"mappings":"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","names":["text","_a","_b"]}