@talkpilot/core-db 1.3.0 → 1.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. package/README.md +0 -30
  2. package/dist/municipal/tickets/index.d.ts +1 -2
  3. package/dist/municipal/tickets/index.d.ts.map +1 -1
  4. package/dist/municipal/tickets/index.js +0 -1
  5. package/dist/municipal/tickets/index.js.map +1 -1
  6. package/dist/municipal/tickets/tickets.getters.d.ts +11 -0
  7. package/dist/municipal/tickets/tickets.getters.d.ts.map +1 -1
  8. package/dist/municipal/tickets/tickets.getters.js +128 -0
  9. package/dist/municipal/tickets/tickets.getters.js.map +1 -1
  10. package/dist/municipal/tickets/tickets.types.d.ts +5 -10
  11. package/dist/municipal/tickets/tickets.types.d.ts.map +1 -1
  12. package/dist/talkpilot/calls/calls.types.d.ts +2 -1
  13. package/dist/talkpilot/calls/calls.types.d.ts.map +1 -1
  14. package/dist/talkpilot/calls/calls.types.js +3 -0
  15. package/dist/talkpilot/calls/calls.types.js.map +1 -1
  16. package/dist/talkpilot/calls/dashboard/calls.dashboard.d.ts +1 -33
  17. package/dist/talkpilot/calls/dashboard/calls.dashboard.d.ts.map +1 -1
  18. package/dist/talkpilot/calls/dashboard/calls.dashboard.js +146 -131
  19. package/dist/talkpilot/calls/dashboard/calls.dashboard.js.map +1 -1
  20. package/dist/talkpilot/calls/dashboard/calls.dashboard.types.d.ts +6 -27
  21. package/dist/talkpilot/calls/dashboard/calls.dashboard.types.d.ts.map +1 -1
  22. package/dist/talkpilot/calls/index.d.ts +0 -3
  23. package/dist/talkpilot/calls/index.d.ts.map +1 -1
  24. package/dist/talkpilot/calls/index.js +0 -3
  25. package/dist/talkpilot/calls/index.js.map +1 -1
  26. package/package.json +1 -1
  27. package/src/municipal/tickets/__tests__/tickets.getters.spec.ts +37 -1
  28. package/src/municipal/tickets/index.ts +1 -2
  29. package/src/municipal/tickets/tickets.getters.ts +140 -0
  30. package/src/municipal/tickets/tickets.types.ts +9 -14
  31. package/src/talkpilot/calls/__tests__/calls.dashboard.spec.ts +111 -8
  32. package/src/talkpilot/calls/calls.types.ts +2 -4
  33. package/src/talkpilot/calls/dashboard/calls.dashboard.ts +197 -148
  34. package/src/talkpilot/calls/dashboard/calls.dashboard.types.ts +12 -25
  35. package/src/talkpilot/calls/index.ts +0 -3
  36. package/src/talkpilot/clientsConfig/__tests__/clientsConfig.spec.ts +0 -7
  37. package/dist/municipal/tickets/tickets.constants.d.ts +0 -7
  38. package/dist/municipal/tickets/tickets.constants.d.ts.map +0 -1
  39. package/dist/municipal/tickets/tickets.constants.js +0 -10
  40. package/dist/municipal/tickets/tickets.constants.js.map +0 -1
  41. package/dist/municipal/tickets/tickets.deprecated.getters.d.ts +0 -12
  42. package/dist/municipal/tickets/tickets.deprecated.getters.d.ts.map +0 -1
  43. package/dist/municipal/tickets/tickets.deprecated.getters.js +0 -131
  44. package/dist/municipal/tickets/tickets.deprecated.getters.js.map +0 -1
  45. package/dist/municipal/tickets/tickets.statistics.aggregation.d.ts +0 -45
  46. package/dist/municipal/tickets/tickets.statistics.aggregation.d.ts.map +0 -1
  47. package/dist/municipal/tickets/tickets.statistics.aggregation.js +0 -98
  48. package/dist/municipal/tickets/tickets.statistics.aggregation.js.map +0 -1
  49. package/dist/municipal/tickets/tickets.statistics.dates.d.ts +0 -7
  50. package/dist/municipal/tickets/tickets.statistics.dates.d.ts.map +0 -1
  51. package/dist/municipal/tickets/tickets.statistics.dates.js +0 -40
  52. package/dist/municipal/tickets/tickets.statistics.dates.js.map +0 -1
  53. package/dist/municipal/tickets/tickets.statistics.getters.d.ts +0 -9
  54. package/dist/municipal/tickets/tickets.statistics.getters.d.ts.map +0 -1
  55. package/dist/municipal/tickets/tickets.statistics.getters.js +0 -55
  56. package/dist/municipal/tickets/tickets.statistics.getters.js.map +0 -1
  57. package/dist/municipal/tickets/tickets.statistics.pipeline.d.ts +0 -53
  58. package/dist/municipal/tickets/tickets.statistics.pipeline.d.ts.map +0 -1
  59. package/dist/municipal/tickets/tickets.statistics.pipeline.js +0 -112
  60. package/dist/municipal/tickets/tickets.statistics.pipeline.js.map +0 -1
  61. package/dist/municipal/tickets/tickets.statistics.utils.d.ts +0 -7
  62. package/dist/municipal/tickets/tickets.statistics.utils.d.ts.map +0 -1
  63. package/dist/municipal/tickets/tickets.statistics.utils.js +0 -40
  64. package/dist/municipal/tickets/tickets.statistics.utils.js.map +0 -1
  65. package/dist/talkpilot/calls/calls.constants.d.ts +0 -17
  66. package/dist/talkpilot/calls/calls.constants.d.ts.map +0 -1
  67. package/dist/talkpilot/calls/calls.constants.js +0 -20
  68. package/dist/talkpilot/calls/calls.constants.js.map +0 -1
  69. package/dist/talkpilot/calls/calls.statistics.getters.d.ts +0 -19
  70. package/dist/talkpilot/calls/calls.statistics.getters.d.ts.map +0 -1
  71. package/dist/talkpilot/calls/calls.statistics.getters.js +0 -375
  72. package/dist/talkpilot/calls/calls.statistics.getters.js.map +0 -1
  73. package/dist/talkpilot/calls/calls.statistics.ticketScope.d.ts +0 -12
  74. package/dist/talkpilot/calls/calls.statistics.ticketScope.d.ts.map +0 -1
  75. package/dist/talkpilot/calls/calls.statistics.ticketScope.js +0 -37
  76. package/dist/talkpilot/calls/calls.statistics.ticketScope.js.map +0 -1
  77. package/dist/talkpilot/calls/calls.statistics.tickets.d.ts +0 -17
  78. package/dist/talkpilot/calls/calls.statistics.tickets.d.ts.map +0 -1
  79. package/dist/talkpilot/calls/calls.statistics.tickets.js +0 -33
  80. package/dist/talkpilot/calls/calls.statistics.tickets.js.map +0 -1
  81. package/dist/talkpilot/calls/calls.statistics.types.d.ts +0 -39
  82. package/dist/talkpilot/calls/calls.statistics.types.d.ts.map +0 -1
  83. package/dist/talkpilot/calls/calls.statistics.types.js +0 -3
  84. package/dist/talkpilot/calls/calls.statistics.types.js.map +0 -1
  85. package/dist/utils/date.utils.d.ts +0 -49
  86. package/dist/utils/date.utils.d.ts.map +0 -1
  87. package/dist/utils/date.utils.js +0 -103
  88. package/dist/utils/date.utils.js.map +0 -1
  89. package/dist/utils/statistics.aggregation.d.ts +0 -20
  90. package/dist/utils/statistics.aggregation.d.ts.map +0 -1
  91. package/dist/utils/statistics.aggregation.js +0 -43
  92. package/dist/utils/statistics.aggregation.js.map +0 -1
  93. package/src/municipal/tickets/__tests__/tickets.statistics.spec.ts +0 -104
  94. package/src/municipal/tickets/tickets.constants.ts +0 -8
  95. package/src/municipal/tickets/tickets.statistics.aggregation.ts +0 -113
  96. package/src/municipal/tickets/tickets.statistics.getters.ts +0 -93
  97. package/src/talkpilot/calls/__tests__/calls.statistics.spec.ts +0 -281
  98. package/src/talkpilot/calls/calls.constants.ts +0 -20
  99. package/src/talkpilot/calls/calls.statistics.getters.ts +0 -525
  100. package/src/talkpilot/calls/calls.statistics.types.ts +0 -44
  101. package/src/utils/date.utils.ts +0 -116
@@ -1,40 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ticketStatsDateScopeFromYmd = exports.resolveTicketStatsDateRange = void 0;
4
- const DEFAULT_LOOKBACK_DAYS = 30;
5
- const DAY_MS = 24 * 60 * 60 * 1000;
6
- const formatYmdInTz = (date, timezone) => new Intl.DateTimeFormat("en-CA", { timeZone: timezone }).format(date);
7
- const dateAtNoonUtc = (dateStr) => {
8
- const [y, m, d] = dateStr.split("-").map(Number);
9
- return new Date(Date.UTC(y, m - 1, d, 12, 0, 0));
10
- };
11
- const startOfCalendarDayInTz = (dateStr, timezone) => {
12
- const anchor = dateAtNoonUtc(dateStr).getTime();
13
- let low = anchor - 2 * DAY_MS;
14
- let high = anchor + DAY_MS;
15
- while (high - low > 1) {
16
- const mid = Math.floor((low + high) / 2);
17
- if (formatYmdInTz(new Date(mid), timezone) >= dateStr)
18
- high = mid;
19
- else
20
- low = mid;
21
- }
22
- return new Date(high);
23
- };
24
- const endOfCalendarDayInTz = (dateStr, timezone) => {
25
- const [y, m, d] = dateStr.split("-").map(Number);
26
- const nextDay = new Date(Date.UTC(y, m - 1, d + 1)).toISOString().slice(0, 10);
27
- return new Date(startOfCalendarDayInTz(nextDay, timezone).getTime() - 1);
28
- };
29
- const resolveTicketStatsDateRange = (dateScope) => {
30
- const to = dateScope?.to ?? new Date();
31
- const from = dateScope?.from ?? new Date(to.getTime() - DEFAULT_LOOKBACK_DAYS * DAY_MS);
32
- return { from, to };
33
- };
34
- exports.resolveTicketStatsDateRange = resolveTicketStatsDateRange;
35
- const ticketStatsDateScopeFromYmd = (startStr, endStr, timezone) => ({
36
- from: startOfCalendarDayInTz(startStr, timezone),
37
- to: endOfCalendarDayInTz(endStr, timezone),
38
- });
39
- exports.ticketStatsDateScopeFromYmd = ticketStatsDateScopeFromYmd;
40
- //# sourceMappingURL=tickets.statistics.utils.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tickets.statistics.utils.js","sourceRoot":"","sources":["../../../src/municipal/tickets/tickets.statistics.utils.ts"],"names":[],"mappings":"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"}
@@ -1,17 +0,0 @@
1
- /** Customer role within a conference call. */
2
- export declare const CONFERENCE_ROLE_CUSTOMER: "customer";
3
- /** Supervisor role within a conference call. */
4
- export declare const CONFERENCE_ROLE_SUPERVISOR: "supervisor";
5
- /** Hours in a single day. */
6
- export declare const HOURS_PER_DAY = 24;
7
- /** Max execution time (ms) for calls statistics aggregations. */
8
- export declare const STATS_MAX_TIME_MS = 30000;
9
- /**
10
- * When the client calls bar chart should group by week or month instead of day:
11
- * > MONTH threshold -> one bar per month
12
- * > WEEK threshold -> one bar per week
13
- * otherwise -> one bar per day
14
- */
15
- export declare const TREND_MONTH_BUCKET_MIN_MONTHS = 6;
16
- export declare const TREND_WEEK_BUCKET_MIN_MONTHS = 3;
17
- //# sourceMappingURL=calls.constants.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"calls.constants.d.ts","sourceRoot":"","sources":["../../../src/talkpilot/calls/calls.constants.ts"],"names":[],"mappings":"AAAA,8CAA8C;AAC9C,eAAO,MAAM,wBAAwB,EAAG,UAAmB,CAAC;AAE5D,gDAAgD;AAChD,eAAO,MAAM,0BAA0B,EAAG,YAAqB,CAAC;AAEhE,6BAA6B;AAC7B,eAAO,MAAM,aAAa,KAAK,CAAC;AAEhC,iEAAiE;AACjE,eAAO,MAAM,iBAAiB,QAAS,CAAC;AAExC;;;;;GAKG;AACH,eAAO,MAAM,6BAA6B,IAAI,CAAC;AAC/C,eAAO,MAAM,4BAA4B,IAAI,CAAC"}
@@ -1,20 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.TREND_WEEK_BUCKET_MIN_MONTHS = exports.TREND_MONTH_BUCKET_MIN_MONTHS = exports.STATS_MAX_TIME_MS = exports.HOURS_PER_DAY = exports.CONFERENCE_ROLE_SUPERVISOR = exports.CONFERENCE_ROLE_CUSTOMER = void 0;
4
- /** Customer role within a conference call. */
5
- exports.CONFERENCE_ROLE_CUSTOMER = "customer";
6
- /** Supervisor role within a conference call. */
7
- exports.CONFERENCE_ROLE_SUPERVISOR = "supervisor";
8
- /** Hours in a single day. */
9
- exports.HOURS_PER_DAY = 24;
10
- /** Max execution time (ms) for calls statistics aggregations. */
11
- exports.STATS_MAX_TIME_MS = 30_000;
12
- /**
13
- * When the client calls bar chart should group by week or month instead of day:
14
- * > MONTH threshold -> one bar per month
15
- * > WEEK threshold -> one bar per week
16
- * otherwise -> one bar per day
17
- */
18
- exports.TREND_MONTH_BUCKET_MIN_MONTHS = 6;
19
- exports.TREND_WEEK_BUCKET_MIN_MONTHS = 3;
20
- //# sourceMappingURL=calls.constants.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"calls.constants.js","sourceRoot":"","sources":["../../../src/talkpilot/calls/calls.constants.ts"],"names":[],"mappings":";;;AAAA,8CAA8C;AACjC,QAAA,wBAAwB,GAAG,UAAmB,CAAC;AAE5D,gDAAgD;AACnC,QAAA,0BAA0B,GAAG,YAAqB,CAAC;AAEhE,6BAA6B;AAChB,QAAA,aAAa,GAAG,EAAE,CAAC;AAEhC,iEAAiE;AACpD,QAAA,iBAAiB,GAAG,MAAM,CAAC;AAExC;;;;;GAKG;AACU,QAAA,6BAA6B,GAAG,CAAC,CAAC;AAClC,QAAA,4BAA4B,GAAG,CAAC,CAAC"}
@@ -1,19 +0,0 @@
1
- import type { CallsHourlyBucket, CallsRoutingAggregation, CallsStatsFilter, CallsSummaryAggregation, CallsTrendBucket, ResolvedTimeBucket } from "./calls.statistics.types";
2
- export declare const rangeDurationDays: (startStr: string, endStr: string) => number;
3
- /**
4
- * Number of distinct calendar months the [startStr, endStr] range spans, inclusive.
5
- * Counts month boundaries rather than 30-day periods: e.g. Jan 31 -> Feb 1 returns 2.
6
- */
7
- export declare const rangeDurationMonths: (startStr: string, endStr: string) => number;
8
- /**
9
- * Chooses how the client calls-over-time bar chart groups each column:
10
- * one bar per day, week, or calendar month. Short ranges stay daily; longer
11
- * ones switch to weekly or monthly so the chart does not show hundreds of bars.
12
- */
13
- export declare const resolveTimeBucketFromRange: (startStr: string, endStr: string) => ResolvedTimeBucket;
14
- export declare const aggregateCallsSummary: (filter: CallsStatsFilter) => Promise<CallsSummaryAggregation>;
15
- export declare const aggregateCallsTrend: (filter: CallsStatsFilter, bucket: ResolvedTimeBucket) => Promise<CallsTrendBucket[]>;
16
- export declare const aggregateCallsHourlyByRange: (filter: CallsStatsFilter) => Promise<CallsHourlyBucket[]>;
17
- export declare const aggregateCallsRouting: (filter: CallsStatsFilter) => Promise<CallsRoutingAggregation>;
18
- export declare const findFilteredCallSids: (filter: CallsStatsFilter) => Promise<string[]>;
19
- //# sourceMappingURL=calls.statistics.getters.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"calls.statistics.getters.d.ts","sourceRoot":"","sources":["../../../src/talkpilot/calls/calls.statistics.getters.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAEV,iBAAiB,EACjB,uBAAuB,EACvB,gBAAgB,EAChB,uBAAuB,EACvB,gBAAgB,EAChB,kBAAkB,EACnB,MAAM,0BAA0B,CAAC;AAoJlC,eAAO,MAAM,iBAAiB,GAAI,UAAU,MAAM,EAAE,QAAQ,MAAM,KAAG,MAIpE,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,mBAAmB,GAAI,UAAU,MAAM,EAAE,QAAQ,MAAM,KAAG,MAItE,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,0BAA0B,GACrC,UAAU,MAAM,EAChB,QAAQ,MAAM,KACb,kBAKF,CAAC;AAoJF,eAAO,MAAM,qBAAqB,GAChC,QAAQ,gBAAgB,KACvB,OAAO,CAAC,uBAAuB,CAqDjC,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAC9B,QAAQ,gBAAgB,EACxB,QAAQ,kBAAkB,KACzB,OAAO,CAAC,gBAAgB,EAAE,CAwD5B,CAAC;AAEF,eAAO,MAAM,2BAA2B,GACtC,QAAQ,gBAAgB,KACvB,OAAO,CAAC,iBAAiB,EAAE,CAY7B,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAChC,QAAQ,gBAAgB,KACvB,OAAO,CAAC,uBAAuB,CA2BjC,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAAU,QAAQ,gBAAgB,KAAG,OAAO,CAAC,MAAM,EAAE,CAMrF,CAAC"}
@@ -1,375 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.findFilteredCallSids = exports.aggregateCallsRouting = exports.aggregateCallsHourlyByRange = exports.aggregateCallsTrend = exports.aggregateCallsSummary = exports.resolveTimeBucketFromRange = exports.rangeDurationMonths = exports.rangeDurationDays = void 0;
4
- const calls_getters_1 = require("./calls.getters");
5
- const calls_constants_1 = require("./calls.constants");
6
- const date_utils_1 = require("../../utils/date.utils");
7
- const tickets_statistics_getters_1 = require("../../municipal/tickets/tickets.statistics.getters");
8
- const emptySummary = () => ({
9
- totalCalls: 0,
10
- avgDurationSeconds: 0,
11
- openTickets: 0,
12
- draftTickets: 0,
13
- });
14
- const emptyRouting = () => ({
15
- aiHandled: 0,
16
- transferred: 0,
17
- hijacked: 0,
18
- });
19
- const isTransferred = { $eq: ["$redirectedCall", true] };
20
- const isHijacked = {
21
- $and: [
22
- { $eq: ["$isConferenceCall", true] },
23
- { $ne: ["$redirectedCall", true] },
24
- ],
25
- };
26
- const countIf = (condition) => ({
27
- $sum: { $cond: [condition, 1, 0] },
28
- });
29
- const needsTicketStatusFilter = (filters) => {
30
- if (!filters?.length)
31
- return false;
32
- const hasOpened = filters.includes("opened");
33
- const hasNotOpened = filters.includes("not_opened");
34
- return hasOpened !== hasNotOpened;
35
- };
36
- const routingMatch = (routing) => {
37
- if (!routing?.length)
38
- return null;
39
- const clauses = [];
40
- if (routing.includes("transferred"))
41
- clauses.push({ redirectedCall: true });
42
- if (routing.includes("hijacked")) {
43
- clauses.push({ isConferenceCall: true, redirectedCall: { $ne: true } });
44
- }
45
- if (routing.includes("ai_only")) {
46
- clauses.push({
47
- redirectedCall: { $ne: true },
48
- $or: [
49
- { isConferenceCall: { $ne: true } },
50
- { isConferenceCall: { $exists: false } },
51
- ],
52
- });
53
- }
54
- return clauses.length ? { $or: clauses } : null;
55
- };
56
- const ticketStatusMatch = (filter) => {
57
- if (!needsTicketStatusFilter(filter.ticketStatusFilters))
58
- return null;
59
- const sids = filter.callSidsWithTickets ?? [];
60
- const openedOnly = filter.ticketStatusFilters?.includes("opened");
61
- return { callSid: openedOnly ? { $in: sids } : { $nin: sids } };
62
- };
63
- const hourMatch = (filter) => {
64
- const { hourFrom, hourTo } = filter;
65
- if (hourFrom == null && hourTo == null)
66
- return null;
67
- const hour = {};
68
- if (hourFrom != null)
69
- hour.$gte = hourFrom;
70
- if (hourTo != null)
71
- hour.$lte = hourTo;
72
- return { hour };
73
- };
74
- const createdAtMatchForFilter = (filter) => {
75
- const bounds = (0, tickets_statistics_getters_1.ticketStatsDateScopeFromYmd)(filter.startStr, filter.endStr, filter.timezone);
76
- return { createdAt: { $gte: bounds.from, $lte: bounds.to } };
77
- };
78
- const buildCallsMatchStages = (filter) => {
79
- const hourRange = hourMatch(filter);
80
- const routing = routingMatch(filter.callRouting);
81
- const ticketMatch = ticketStatusMatch(filter);
82
- return [
83
- {
84
- $match: {
85
- clientId: filter.clientId,
86
- isIncomingCall: true,
87
- ...createdAtMatchForFilter(filter),
88
- },
89
- },
90
- {
91
- $addFields: {
92
- dateLocal: {
93
- $dateToString: {
94
- format: "%Y-%m-%d",
95
- date: "$createdAt",
96
- timezone: filter.timezone,
97
- },
98
- },
99
- hour: { $hour: { date: "$createdAt", timezone: filter.timezone } },
100
- },
101
- },
102
- { $match: { dateLocal: { $gte: filter.startStr, $lte: filter.endStr } } },
103
- ...(hourRange ? [{ $match: hourRange }] : []),
104
- ...(routing ? [{ $match: routing }] : []),
105
- ...(ticketMatch ? [{ $match: ticketMatch }] : []),
106
- ];
107
- };
108
- const aggregateCalls = (filter, ...tail) => (0, calls_getters_1.getCallsCollection)().aggregate([...buildCallsMatchStages(filter), ...tail], {
109
- maxTimeMS: calls_constants_1.STATS_MAX_TIME_MS,
110
- });
111
- const trendBucketExpr = (bucket, timezone) => bucket === "day"
112
- ? { bucket: "$dateLocal" }
113
- : {
114
- bucket: {
115
- $dateToString: {
116
- format: "%Y-%m-%d",
117
- date: { $dateTrunc: { date: "$createdAt", unit: bucket, timezone } },
118
- timezone,
119
- },
120
- },
121
- };
122
- const mapTrendRow = (row) => ({
123
- bucket: String(row._id),
124
- totalCalls: row.totalCalls,
125
- openTickets: row.openTickets,
126
- });
127
- const rangeDurationDays = (startStr, endStr) => {
128
- const start = (0, date_utils_1.toUtcDate)(startStr).getTime();
129
- const end = (0, date_utils_1.toUtcDate)(endStr).getTime();
130
- return Math.floor((end - start) / date_utils_1.DAY_MS) + 1;
131
- };
132
- exports.rangeDurationDays = rangeDurationDays;
133
- /**
134
- * Number of distinct calendar months the [startStr, endStr] range spans, inclusive.
135
- * Counts month boundaries rather than 30-day periods: e.g. Jan 31 -> Feb 1 returns 2.
136
- */
137
- const rangeDurationMonths = (startStr, endStr) => {
138
- const [sy, sm] = (0, date_utils_1.parseYmd)(startStr);
139
- const [ey, em] = (0, date_utils_1.parseYmd)(endStr);
140
- return (ey - sy) * 12 + (em - sm) + 1;
141
- };
142
- exports.rangeDurationMonths = rangeDurationMonths;
143
- /**
144
- * Chooses how the client calls-over-time bar chart groups each column:
145
- * one bar per day, week, or calendar month. Short ranges stay daily; longer
146
- * ones switch to weekly or monthly so the chart does not show hundreds of bars.
147
- */
148
- const resolveTimeBucketFromRange = (startStr, endStr) => {
149
- const months = (0, exports.rangeDurationMonths)(startStr, endStr);
150
- if (months > calls_constants_1.TREND_MONTH_BUCKET_MIN_MONTHS)
151
- return "month";
152
- if (months > calls_constants_1.TREND_WEEK_BUCKET_MIN_MONTHS)
153
- return "week";
154
- return "day";
155
- };
156
- exports.resolveTimeBucketFromRange = resolveTimeBucketFromRange;
157
- const weekBucketKeyForDate = (dateStr, timezone) => {
158
- const anchor = (0, date_utils_1.dateAtNoonUtc)(dateStr);
159
- const weekStart = new Date(anchor.getTime() - (0, date_utils_1.getWeekdayInTz)(anchor, timezone) * date_utils_1.DAY_MS);
160
- return (0, date_utils_1.formatYmdInTz)(weekStart, timezone);
161
- };
162
- const formatWeekBucketRange = (weekStartStr, clipStartStr, clipEndStr) => {
163
- const weekEndStr = (0, date_utils_1.addDaysToDateStr)(weekStartStr, 6);
164
- const start = weekStartStr < clipStartStr ? clipStartStr : weekStartStr;
165
- const end = weekEndStr > clipEndStr ? clipEndStr : weekEndStr;
166
- return `${start}/${end}`;
167
- };
168
- const monthBucketKey = (y, m) => `${y}-${String(m).padStart(2, "0")}-01`;
169
- const emptyTrendBucket = (bucket) => ({
170
- bucket,
171
- totalCalls: 0,
172
- openTickets: 0,
173
- });
174
- const indexTrendRowsByBucket = (rows) => new Map(rows.map((row) => [row.bucket, row]));
175
- const fillDailyTrendBuckets = (rows, startStr, endStr) => {
176
- const byBucket = indexTrendRowsByBucket(rows);
177
- const filled = [];
178
- for (let cursor = startStr; cursor <= endStr; cursor = (0, date_utils_1.ymdToStr)(...(0, date_utils_1.incrementYmd)(...(0, date_utils_1.parseYmd)(cursor)))) {
179
- filled.push(byBucket.get(cursor) ?? emptyTrendBucket(cursor));
180
- }
181
- return filled;
182
- };
183
- const fillMonthlyTrendBuckets = (rows, startStr, endStr, timezone) => {
184
- const byBucket = indexTrendRowsByBucket(rows);
185
- const startParts = (0, date_utils_1.getYmdInTz)((0, date_utils_1.dateAtNoonUtc)(startStr), timezone);
186
- const endParts = (0, date_utils_1.getYmdInTz)((0, date_utils_1.dateAtNoonUtc)(endStr), timezone);
187
- const filled = [];
188
- let { y, m } = startParts;
189
- while (y < endParts.y || (y === endParts.y && m <= endParts.m)) {
190
- const bucket = monthBucketKey(y, m);
191
- filled.push(byBucket.get(bucket) ?? emptyTrendBucket(bucket));
192
- m += 1;
193
- if (m > 12) {
194
- m = 1;
195
- y += 1;
196
- }
197
- }
198
- return filled;
199
- };
200
- const fillWeeklyTrendBuckets = (rows, startStr, endStr, timezone) => {
201
- const byBucket = indexTrendRowsByBucket(rows);
202
- const filled = [];
203
- const seen = new Set();
204
- for (let i = 0, days = (0, exports.rangeDurationDays)(startStr, endStr); i < days; i += 1) {
205
- const bucket = formatWeekBucketRange(weekBucketKeyForDate((0, date_utils_1.addDaysToDateStr)(startStr, i), timezone), startStr, endStr);
206
- if (seen.has(bucket))
207
- continue;
208
- seen.add(bucket);
209
- filled.push(byBucket.get(bucket) ?? emptyTrendBucket(bucket));
210
- }
211
- return filled;
212
- };
213
- const fillTrendBuckets = (rows, bucket, startStr, endStr, timezone) => {
214
- switch (bucket) {
215
- case "day":
216
- return fillDailyTrendBuckets(rows, startStr, endStr);
217
- case "week":
218
- return fillWeeklyTrendBuckets(rows, startStr, endStr, timezone);
219
- case "month":
220
- return fillMonthlyTrendBuckets(rows, startStr, endStr, timezone);
221
- default: {
222
- return fillDailyTrendBuckets(rows, startStr, endStr);
223
- }
224
- }
225
- };
226
- const resolveHourRange = (filter) => {
227
- const { hourFrom, hourTo } = filter;
228
- if (hourFrom == null && hourTo == null)
229
- return { hourFrom: 0, hourTo: calls_constants_1.HOURS_PER_DAY - 1 };
230
- return {
231
- hourFrom: hourFrom ?? 0,
232
- hourTo: hourTo ?? calls_constants_1.HOURS_PER_DAY - 1,
233
- };
234
- };
235
- const roundOneDecimal = (value) => Math.round(value * 10) / 10;
236
- const toHourlyDistribution = (rows, hourRange, daysInRange) => {
237
- const counts = new Map(rows.map((r) => [Number(r._id), r.totalCalls]));
238
- const { hourFrom, hourTo } = hourRange;
239
- const buckets = [];
240
- for (let hour = hourFrom; hour <= hourTo; hour += 1) {
241
- const totalCalls = counts.get(hour) ?? 0;
242
- buckets.push({
243
- hour,
244
- totalCalls,
245
- avgCalls: roundOneDecimal(daysInRange > 0 ? totalCalls / daysInRange : 0),
246
- });
247
- }
248
- return buckets;
249
- };
250
- const aggregateCallsSummary = async (filter) => {
251
- const hasTickets = Boolean(filter.callSidsWithTickets?.length || filter.callSidsWithDraftTickets?.length);
252
- const hasStatusFilter = needsTicketStatusFilter(filter.ticketStatusFilters);
253
- if (!hasTickets && !hasStatusFilter) {
254
- const result = await aggregateCalls(filter, {
255
- $group: { _id: null, totalCalls: { $sum: 1 }, avgDurationSeconds: { $avg: "$callLength" } },
256
- }).next();
257
- if (!result)
258
- return emptySummary();
259
- return {
260
- totalCalls: result.totalCalls,
261
- avgDurationSeconds: roundOneDecimal(result.avgDurationSeconds ?? 0),
262
- openTickets: 0,
263
- draftTickets: 0,
264
- };
265
- }
266
- // Single pass: project per-call data, handle ticket status filter and counting in JS.
267
- // Avoids embedding callSidsWithTickets inside any MongoDB pipeline stage.
268
- const rows = await aggregateCalls({ ...filter, ticketStatusFilters: undefined }, { $project: { _id: 0, callSid: 1, callLength: 1 } }).toArray();
269
- const ticketSet = new Set(filter.callSidsWithTickets ?? []);
270
- const draftSet = new Set(filter.callSidsWithDraftTickets ?? []);
271
- const openedOnly = hasStatusFilter && filter.ticketStatusFilters.includes("opened");
272
- const notOpenedOnly = hasStatusFilter && filter.ticketStatusFilters.includes("not_opened");
273
- let totalCalls = 0;
274
- let totalDuration = 0;
275
- let openTickets = 0;
276
- let draftTickets = 0;
277
- for (const row of rows) {
278
- const sid = row.callSid;
279
- const hasTicket = ticketSet.has(sid);
280
- if (openedOnly && !hasTicket)
281
- continue;
282
- if (notOpenedOnly && hasTicket)
283
- continue;
284
- totalCalls += 1;
285
- totalDuration += row.callLength ?? 0;
286
- if (hasTicket)
287
- openTickets += 1;
288
- if (draftSet.has(sid))
289
- draftTickets += 1;
290
- }
291
- if (!totalCalls)
292
- return emptySummary();
293
- return {
294
- totalCalls,
295
- avgDurationSeconds: roundOneDecimal(totalDuration / totalCalls),
296
- openTickets,
297
- draftTickets,
298
- };
299
- };
300
- exports.aggregateCallsSummary = aggregateCallsSummary;
301
- const aggregateCallsTrend = async (filter, bucket) => {
302
- const ticketSet = filter.callSidsWithTickets?.length
303
- ? new Set(filter.callSidsWithTickets)
304
- : null;
305
- if (ticketSet) {
306
- const rows = await aggregateCalls({ ...filter, ticketStatusFilters: undefined }, { $addFields: trendBucketExpr(bucket, filter.timezone) }, { $project: { _id: 0, bucket: 1, callSid: 1 } }).toArray();
307
- const openedOnly = needsTicketStatusFilter(filter.ticketStatusFilters) && filter.ticketStatusFilters.includes("opened");
308
- const notOpenedOnly = needsTicketStatusFilter(filter.ticketStatusFilters) && filter.ticketStatusFilters.includes("not_opened");
309
- const byBucket = new Map();
310
- for (const row of rows) {
311
- const sid = row.callSid;
312
- const hasTicket = ticketSet.has(sid);
313
- if (openedOnly && !hasTicket)
314
- continue;
315
- if (notOpenedOnly && hasTicket)
316
- continue;
317
- const label = bucket === "week"
318
- ? formatWeekBucketRange(String(row.bucket), filter.startStr, filter.endStr)
319
- : String(row.bucket);
320
- const cur = byBucket.get(label) ?? { totalCalls: 0, openTickets: 0 };
321
- cur.totalCalls += 1;
322
- if (hasTicket)
323
- cur.openTickets += 1;
324
- byBucket.set(label, cur);
325
- }
326
- const mappedRows = [...byBucket.entries()]
327
- .map(([label, counts]) => ({ bucket: label, ...counts }));
328
- return fillTrendBuckets(mappedRows, bucket, filter.startStr, filter.endStr, filter.timezone);
329
- }
330
- const rows = await aggregateCalls(filter, { $addFields: trendBucketExpr(bucket, filter.timezone) }, { $group: { _id: "$bucket", totalCalls: { $sum: 1 } } }, { $sort: { _id: 1 } }).toArray();
331
- const mappedRows = bucket === "week"
332
- ? rows.map((row) => ({
333
- bucket: formatWeekBucketRange(String(row._id), filter.startStr, filter.endStr),
334
- totalCalls: row.totalCalls,
335
- openTickets: 0,
336
- }))
337
- : rows.map((row) => mapTrendRow({ _id: row._id, totalCalls: row.totalCalls, openTickets: 0 }));
338
- return fillTrendBuckets(mappedRows, bucket, filter.startStr, filter.endStr, filter.timezone);
339
- };
340
- exports.aggregateCallsTrend = aggregateCallsTrend;
341
- const aggregateCallsHourlyByRange = async (filter) => {
342
- const rows = await aggregateCalls(filter, { $group: { _id: "$hour", totalCalls: { $sum: 1 } } }, { $sort: { _id: 1 } }).toArray();
343
- return toHourlyDistribution(rows.map((r) => ({ _id: r._id, totalCalls: r.totalCalls })), resolveHourRange(filter), (0, exports.rangeDurationDays)(filter.startStr, filter.endStr));
344
- };
345
- exports.aggregateCallsHourlyByRange = aggregateCallsHourlyByRange;
346
- const aggregateCallsRouting = async (filter) => {
347
- const result = await aggregateCalls(filter, {
348
- $group: {
349
- _id: null,
350
- transferred: countIf(isTransferred),
351
- hijacked: countIf(isHijacked),
352
- totalCalls: { $sum: 1 },
353
- },
354
- }, {
355
- $addFields: {
356
- aiHandled: {
357
- $subtract: ["$totalCalls", { $add: ["$transferred", "$hijacked"] }],
358
- },
359
- },
360
- }).next();
361
- if (!result)
362
- return emptyRouting();
363
- return {
364
- aiHandled: result.aiHandled,
365
- transferred: result.transferred,
366
- hijacked: result.hijacked,
367
- };
368
- };
369
- exports.aggregateCallsRouting = aggregateCallsRouting;
370
- const findFilteredCallSids = async (filter) => {
371
- const rows = await aggregateCalls(filter, { $group: { _id: "$callSid" } }).toArray();
372
- return rows.map((r) => String(r._id)).filter(Boolean);
373
- };
374
- exports.findFilteredCallSids = findFilteredCallSids;
375
- //# sourceMappingURL=calls.statistics.getters.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"calls.statistics.getters.js","sourceRoot":"","sources":["../../../src/talkpilot/calls/calls.statistics.getters.ts"],"names":[],"mappings":"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"}
@@ -1,12 +0,0 @@
1
- import type { TicketStatsDateScope } from "../../municipal/tickets/tickets.types";
2
- import type { CallsStatsFilter, CallsStatsTicketScope } from "./calls.statistics.types";
3
- declare const needsTicketStatusFilter: (filters?: CallsStatsFilter["ticketStatusFilters"]) => boolean;
4
- export declare const ticketStatsDateScopeForFilter: (filter: CallsStatsFilter) => TicketStatsDateScope;
5
- export declare const resolveCallsStatsTicketScope: (filter: CallsStatsFilter) => Promise<CallsStatsTicketScope | undefined>;
6
- /** Call SIDs with a ticket among filtered calls (for opened / not_opened $match). */
7
- export declare const resolveTicketStatusCallSids: (filter: CallsStatsFilter, scope: CallsStatsTicketScope, filteredCallSids: string[]) => Promise<string[]>;
8
- export declare const countOpenAndDraftAmongCallSids: (scope: CallsStatsTicketScope, callSids: string[]) => Promise<import("../../municipal/tickets/tickets.types").TicketCallsCountAmongCallSids>;
9
- export declare const ticketSidsSetAmongCallSids: (scope: CallsStatsTicketScope, callSids: string[]) => Promise<Set<string>>;
10
- export declare const wantsTicketMetrics: (filter: CallsStatsFilter) => boolean;
11
- export { needsTicketStatusFilter };
12
- //# sourceMappingURL=calls.statistics.ticketScope.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"calls.statistics.ticketScope.d.ts","sourceRoot":"","sources":["../../../src/talkpilot/calls/calls.statistics.ticketScope.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAClF,OAAO,KAAK,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAExF,QAAA,MAAM,uBAAuB,GAC3B,UAAU,gBAAgB,CAAC,qBAAqB,CAAC,YAMlD,CAAC;AAEF,eAAO,MAAM,6BAA6B,GACxC,QAAQ,gBAAgB,KACvB,oBAC2E,CAAC;AAE/E,eAAO,MAAM,4BAA4B,GACvC,QAAQ,gBAAgB,KACvB,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAS3C,CAAC;AAEF,qFAAqF;AACrF,eAAO,MAAM,2BAA2B,GACtC,QAAQ,gBAAgB,EACxB,OAAO,qBAAqB,EAC5B,kBAAkB,MAAM,EAAE,KACzB,OAAO,CAAC,MAAM,EAAE,CAC0D,CAAC;AAE9E,eAAO,MAAM,8BAA8B,GACzC,OAAO,qBAAqB,EAC5B,UAAU,MAAM,EAAE,2FACqD,CAAC;AAE1E,eAAO,MAAM,0BAA0B,GACrC,OAAO,qBAAqB,EAC5B,UAAU,MAAM,EAAE,KACjB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAGnB,CAAC;AAEJ,eAAO,MAAM,kBAAkB,GAAI,QAAQ,gBAAgB,KAAG,OAEpC,CAAC;AAE3B,OAAO,EAAE,uBAAuB,EAAE,CAAC"}
@@ -1,37 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.needsTicketStatusFilter = exports.wantsTicketMetrics = exports.ticketSidsSetAmongCallSids = exports.countOpenAndDraftAmongCallSids = exports.resolveTicketStatusCallSids = exports.resolveCallsStatsTicketScope = exports.ticketStatsDateScopeForFilter = void 0;
4
- const clientsConfig_getters_1 = require("../clientsConfig/clientsConfig.getters");
5
- const tickets_statistics_getters_1 = require("../../municipal/tickets/tickets.statistics.getters");
6
- const needsTicketStatusFilter = (filters) => {
7
- if (!filters?.length)
8
- return false;
9
- const hasOpened = filters.includes("opened");
10
- const hasNotOpened = filters.includes("not_opened");
11
- return hasOpened !== hasNotOpened;
12
- };
13
- exports.needsTicketStatusFilter = needsTicketStatusFilter;
14
- const ticketStatsDateScopeForFilter = (filter) => (0, tickets_statistics_getters_1.ticketStatsDateScopeFromYmd)(filter.startStr, filter.endStr, filter.timezone);
15
- exports.ticketStatsDateScopeForFilter = ticketStatsDateScopeForFilter;
16
- const resolveCallsStatsTicketScope = async (filter) => {
17
- const city = filter.cityName ??
18
- (await (0, clientsConfig_getters_1.getClientConfig)(filter.clientId))?.products?.municipal?.cityName;
19
- if (!city)
20
- return undefined;
21
- return {
22
- city: city,
23
- dateScope: (0, exports.ticketStatsDateScopeForFilter)(filter),
24
- };
25
- };
26
- exports.resolveCallsStatsTicketScope = resolveCallsStatsTicketScope;
27
- /** Call SIDs with a ticket among filtered calls (for opened / not_opened $match). */
28
- const resolveTicketStatusCallSids = async (filter, scope, filteredCallSids) => (0, tickets_statistics_getters_1.findCallSidsWithTicketsAmong)(scope.city, filteredCallSids, scope.dateScope);
29
- exports.resolveTicketStatusCallSids = resolveTicketStatusCallSids;
30
- const countOpenAndDraftAmongCallSids = (scope, callSids) => (0, tickets_statistics_getters_1.countTicketCallsAmongCallSids)(scope.city, callSids, scope.dateScope);
31
- exports.countOpenAndDraftAmongCallSids = countOpenAndDraftAmongCallSids;
32
- const ticketSidsSetAmongCallSids = async (scope, callSids) => new Set(await (0, tickets_statistics_getters_1.findCallSidsWithTicketsAmong)(scope.city, callSids, scope.dateScope));
33
- exports.ticketSidsSetAmongCallSids = ticketSidsSetAmongCallSids;
34
- const wantsTicketMetrics = (filter) => needsTicketStatusFilter(filter.ticketStatusFilters) ||
35
- Boolean(filter.cityName);
36
- exports.wantsTicketMetrics = wantsTicketMetrics;
37
- //# sourceMappingURL=calls.statistics.ticketScope.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"calls.statistics.ticketScope.js","sourceRoot":"","sources":["../../../src/talkpilot/calls/calls.statistics.ticketScope.ts"],"names":[],"mappings":";;;AAAA,kFAAyE;AAEzE,mGAI4D;AAI5D,MAAM,uBAAuB,GAAG,CAC9B,OAAiD,EACjD,EAAE;IACF,IAAI,CAAC,OAAO,EAAE,MAAM;QAAE,OAAO,KAAK,CAAC;IACnC,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC7C,MAAM,YAAY,GAAG,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;IACpD,OAAO,SAAS,KAAK,YAAY,CAAC;AACpC,CAAC,CAAC;AA6CO,0DAAuB;AA3CzB,MAAM,6BAA6B,GAAG,CAC3C,MAAwB,EACF,EAAE,CACxB,IAAA,wDAA2B,EAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;AAHlE,QAAA,6BAA6B,iCAGqC;AAExE,MAAM,4BAA4B,GAAG,KAAK,EAC/C,MAAwB,EACoB,EAAE;IAC9C,MAAM,IAAI,GACR,MAAM,CAAC,QAAQ;QACf,CAAC,MAAM,IAAA,uCAAe,EAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC;IAC1E,IAAI,CAAC,IAAI;QAAE,OAAO,SAAS,CAAC;IAC5B,OAAO;QACL,IAAI,EAAE,IAAgB;QACtB,SAAS,EAAE,IAAA,qCAA6B,EAAC,MAAM,CAAC;KACjD,CAAC;AACJ,CAAC,CAAC;AAXW,QAAA,4BAA4B,gCAWvC;AAEF,qFAAqF;AAC9E,MAAM,2BAA2B,GAAG,KAAK,EAC9C,MAAwB,EACxB,KAA4B,EAC5B,gBAA0B,EACP,EAAE,CACrB,IAAA,yDAA4B,EAAC,KAAK,CAAC,IAAI,EAAE,gBAAgB,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;AALjE,QAAA,2BAA2B,+BAKsC;AAEvE,MAAM,8BAA8B,GAAG,CAC5C,KAA4B,EAC5B,QAAkB,EAClB,EAAE,CAAC,IAAA,0DAA6B,EAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;AAH7D,QAAA,8BAA8B,kCAG+B;AAEnE,MAAM,0BAA0B,GAAG,KAAK,EAC7C,KAA4B,EAC5B,QAAkB,EACI,EAAE,CACxB,IAAI,GAAG,CACL,MAAM,IAAA,yDAA4B,EAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC,CAC1E,CAAC;AANS,QAAA,0BAA0B,8BAMnC;AAEG,MAAM,kBAAkB,GAAG,CAAC,MAAwB,EAAW,EAAE,CACtE,uBAAuB,CAAC,MAAM,CAAC,mBAAmB,CAAC;IACnD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AAFd,QAAA,kBAAkB,sBAEJ"}
@@ -1,17 +0,0 @@
1
- import type { CityName } from "../../municipal/utils/types";
2
- import type { TicketStatsDateScope } from "../../municipal/tickets/tickets.types";
3
- import type { CallsStatsFilter } from "./calls.statistics.types";
4
- export type CallsStatsTicketScope = {
5
- city: CityName;
6
- dateScope: TicketStatsDateScope;
7
- };
8
- declare const needsTicketStatusFilter: (filters?: CallsStatsFilter["ticketStatusFilters"]) => boolean;
9
- export declare const ticketStatsDateScopeForFilter: (filter: CallsStatsFilter) => TicketStatsDateScope;
10
- export declare const resolveCallsStatsTicketScope: (filter: CallsStatsFilter) => Promise<CallsStatsTicketScope | undefined>;
11
- /** Call SIDs with a ticket among filtered calls (for opened / not_opened $match). */
12
- export declare const resolveTicketStatusCallSids: (filter: CallsStatsFilter, scope: CallsStatsTicketScope, filteredCallSids: string[]) => Promise<string[]>;
13
- export declare const countOpenAndDraftAmongCallSids: (scope: CallsStatsTicketScope, callSids: string[]) => Promise<import("../../municipal/tickets/tickets.types").TicketCallsCountAmongCallSids>;
14
- export declare const ticketSidsSetAmongCallSids: (scope: CallsStatsTicketScope, callSids: string[]) => Promise<Set<string>>;
15
- export declare const wantsTicketMetrics: (filter: CallsStatsFilter) => boolean;
16
- export { needsTicketStatusFilter };
17
- //# sourceMappingURL=calls.statistics.tickets.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"calls.statistics.tickets.d.ts","sourceRoot":"","sources":["../../../src/talkpilot/calls/calls.statistics.tickets.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAM5D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAClF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAEjE,MAAM,MAAM,qBAAqB,GAAG;IAClC,IAAI,EAAE,QAAQ,CAAC;IACf,SAAS,EAAE,oBAAoB,CAAC;CACjC,CAAC;AAEF,QAAA,MAAM,uBAAuB,GAAI,UAAU,gBAAgB,CAAC,qBAAqB,CAAC,YAKjF,CAAC;AAEF,eAAO,MAAM,6BAA6B,GACxC,QAAQ,gBAAgB,KACvB,oBAC2E,CAAC;AAE/E,eAAO,MAAM,4BAA4B,GACvC,QAAQ,gBAAgB,KACvB,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAM3C,CAAC;AAEF,qFAAqF;AACrF,eAAO,MAAM,2BAA2B,GACtC,QAAQ,gBAAgB,EACxB,OAAO,qBAAqB,EAC5B,kBAAkB,MAAM,EAAE,KACzB,OAAO,CAAC,MAAM,EAAE,CAKhB,CAAC;AAEJ,eAAO,MAAM,8BAA8B,GACzC,OAAO,qBAAqB,EAC5B,UAAU,MAAM,EAAE,2FACqD,CAAC;AAE1E,eAAO,MAAM,0BAA0B,GACrC,OAAO,qBAAqB,EAC5B,UAAU,MAAM,EAAE,KACjB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAC8D,CAAC;AAErF,eAAO,MAAM,kBAAkB,GAAI,QAAQ,gBAAgB,KAAG,OACmB,CAAC;AAElF,OAAO,EAAE,uBAAuB,EAAE,CAAC"}