{"version":3,"sources":["../call-control-sdk/lib/pages/cdrReport/useCdrReport.ts"],"sourcesContent":["import { useCallback, useState } from \"react\";\r\nimport axiosInstance from \"../../services/axios\";\r\nimport { END_POINT } from \"../../services/endPoint\";\r\nimport { appendSort } from \"../common/utils/sort\";\r\nimport type {\r\n\tCdrAgentFilterOption,\r\n\tCdrQueueFilterOption,\r\n\tCdrRecordsPage,\r\n\tCdrReportParams,\r\n\tCdrReportResponse,\r\n\tConferenceReportResponse,\r\n\tCrmFormFieldOption,\r\n\tCrmFormOption,\r\n\tFieldMappingResponse,\r\n\tFieldMappingUpdatePayload,\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.did_number) {\r\n\t\tif (Array.isArray(params.did_number)) {\r\n\t\t\tfor (const d of params.did_number) qs.append(\"did_number\", String(d));\r\n\t\t} else {\r\n\t\t\tqs.append(\"did_number\", String(params.did_number));\r\n\t\t}\r\n\t}\r\n\tif (params.did) {\r\n\t\tif (Array.isArray(params.did)) {\r\n\t\t\tfor (const d of params.did) qs.append(\"did\", String(d));\r\n\t\t} else {\r\n\t\t\tqs.append(\"did\", String(params.did));\r\n\t\t}\r\n\t}\r\n\tif (params.did_id) {\r\n\t\tif (Array.isArray(params.did_id)) {\r\n\t\t\tfor (const id of params.did_id) qs.append(\"did_id\", String(id));\r\n\t\t} else {\r\n\t\t\tqs.append(\"did_id\", String(params.did_id));\r\n\t\t}\r\n\t}\r\n\tif (params.didNumber) {\r\n\t\tif (Array.isArray(params.didNumber)) {\r\n\t\t\tfor (const d of params.didNumber) qs.append(\"didNumber\", String(d));\r\n\t\t} else {\r\n\t\t\tqs.append(\"didNumber\", String(params.didNumber));\r\n\t\t}\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\t// Explicit undefined check: `false` is a real filter value (non-conference\r\n\t// calls only), so it must still reach the wire. Omitted means \"all\".\r\n\tif (params.isConference !== undefined) qs.append(\"isConference\", String(params.isConference));\r\n\tif (params.page) qs.append(\"page\", String(params.page));\r\n\tif (params.pageSize) qs.append(\"pageSize\", String(params.pageSize));\r\n\tappendSort(qs, params);\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\nasync function fetchAllTenantDids(tenantId: number | string): Promise<{ id: number | string; didNumber: string; friendlyName?: string | null }[]> {\r\n\tconst pageSize = 500;\r\n\tconst all: { id: number | string; didNumber: string; friendlyName?: string | null }[] = [];\r\n\tlet page = 1;\r\n\r\n\twhile (page > 0) {\r\n\t\tconst res = await axiosInstance.get(END_POINT.TENANT_DIDS(tenantId), { params: { page, pageSize } });\r\n\t\tconst raw = Array.isArray(res.data)\r\n\t\t\t? res.data\r\n\t\t\t: Array.isArray((res.data as any)?.data)\r\n\t\t\t\t? (res.data as any).data\r\n\t\t\t\t: [];\r\n\r\n\t\tif (!raw.length) break;\r\n\r\n\t\tall.push(...raw.map((d: any) => ({\r\n\t\t\tid: d.id,\r\n\t\t\tdidNumber: d.did_number ?? d.didNumber,\r\n\t\t\tfriendlyName: d.friendly_name ?? d.friendlyName,\r\n\t\t})));\r\n\r\n\t\tif (raw.length < pageSize) break;\r\n\t\tpage += 1;\r\n\t}\r\n\r\n\tall.sort((a, b) => {\r\n\t\tconst nameA = a.friendlyName || a.didNumber || \"\";\r\n\t\tconst nameB = b.friendlyName || b.didNumber || \"\";\r\n\t\treturn nameA.localeCompare(nameB, undefined, { numeric: true, sensitivity: \"base\" });\r\n\t});\r\n\r\n\treturn all;\r\n}\r\n\r\nexport async function getCdrFilterDids(tenantId?: number | string | null): Promise<{ id: number | string; didNumber: string; friendlyName?: string | null }[]> {\r\n\tlet tid = tenantId;\r\n\tif (!tid) {\r\n\t\ttry {\r\n\t\t\tconst stored = typeof sessionStorage !== \"undefined\" ? sessionStorage.getItem(\"tenantInfo\") : null;\r\n\t\t\tif (stored) {\r\n\t\t\t\tconst parsed = JSON.parse(stored);\r\n\t\t\t\ttid = parsed?.tenantId ?? parsed?.id ?? parsed?.tenant_id;\r\n\t\t\t}\r\n\t\t} catch {}\r\n\t}\r\n\tif (!tid) {\r\n\t\ttry {\r\n\t\t\tconst storedUser = typeof sessionStorage !== \"undefined\" ? sessionStorage.getItem(\"auth_user\") : null;\r\n\t\t\tif (storedUser) {\r\n\t\t\t\tconst parsed = JSON.parse(storedUser);\r\n\t\t\t\ttid = parsed?.tenantInfo?.tenantId ?? parsed?.tenantId ?? parsed?.tenant_id;\r\n\t\t\t}\r\n\t\t} catch {}\r\n\t}\r\n\tif (tid) {\r\n\t\ttry {\r\n\t\t\treturn await fetchAllTenantDids(tid);\r\n\t\t} catch {\r\n\t\t\t// ignore\r\n\t\t}\r\n\t}\r\n\treturn [];\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\n/**\r\n * Conference legs for one call — the timeline behind the CDR \"Conference\" column.\r\n * Calls that never entered a bridge come back with an empty `participants` list.\r\n */\r\nexport async function getConferenceReport(callUuid: string): Promise<ConferenceReportResponse> {\r\n\tconst res = await axiosInstance.get<ConferenceReportResponse>(END_POINT.CONFERENCE_REPORT(callUuid));\r\n\treturn res.data;\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\r\n// ─── Saved export field selection (CRM columns) ──────────────────────────────\r\n\r\nexport async function getFieldMapping(reportType: string): Promise<FieldMappingResponse | null> {\r\n\tconst res = await axiosInstance.get(END_POINT.FIELD_MAPPING, { params: { reportType } });\r\n\treturn res.data ?? null;\r\n}\r\n\r\nexport async function saveFieldMapping(\r\n\treportType: string,\r\n\tpayload: FieldMappingUpdatePayload,\r\n): Promise<FieldMappingResponse> {\r\n\tconst res = await axiosInstance.put(END_POINT.FIELD_MAPPING, payload, { params: { reportType } });\r\n\treturn res.data;\r\n}\r\n\r\nexport async function getCrmForms(): Promise<CrmFormOption[]> {\r\n\tconst res = await axiosInstance.get<CrmFormOption[]>(END_POINT.CRM_FORMS);\r\n\treturn Array.isArray(res.data) ? res.data : [];\r\n}\r\n\r\ninterface CrmFormFieldSection {\r\n\tfields: CrmFormFieldOption[];\r\n}\r\n\r\nexport async function getCrmFormFields(formId: number): Promise<CrmFormFieldOption[]> {\r\n\tconst res = await axiosInstance.get<CrmFormFieldSection[]>(END_POINT.CRM_FORM_FIELDS(formId));\r\n\tconst sections = Array.isArray(res.data) ? res.data : [];\r\n\treturn sections.flatMap((s) => s.fields ?? []);\r\n}\r\n"],"mappings":"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","names":["_a"]}