@talkpilot/core-db 1.3.9 → 1.3.11

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 (46) hide show
  1. package/README.md +30 -0
  2. package/dist/municipal/tickets/tickets.statistics.aggregation.d.ts +34 -0
  3. package/dist/municipal/tickets/tickets.statistics.aggregation.d.ts.map +1 -1
  4. package/dist/municipal/tickets/tickets.statistics.aggregation.js +14 -1
  5. package/dist/municipal/tickets/tickets.statistics.aggregation.js.map +1 -1
  6. package/dist/municipal/tickets/tickets.statistics.getters.js +2 -2
  7. package/dist/municipal/tickets/tickets.statistics.getters.js.map +1 -1
  8. package/dist/municipal/tickets/tickets.types.d.ts +1 -0
  9. package/dist/municipal/tickets/tickets.types.d.ts.map +1 -1
  10. package/dist/talkpilot/clientsConfig/clientsConfig.types.d.ts +1 -1
  11. package/dist/talkpilot/clientsConfig/clientsConfig.types.d.ts.map +1 -1
  12. package/package.json +1 -1
  13. package/src/municipal/tickets/__tests__/tickets.statistics.spec.ts +28 -2
  14. package/src/municipal/tickets/tickets.statistics.aggregation.ts +14 -0
  15. package/src/municipal/tickets/tickets.statistics.getters.ts +3 -3
  16. package/src/municipal/tickets/tickets.types.ts +1 -0
  17. package/src/talkpilot/clientsConfig/clientsConfig.types.ts +1 -1
  18. package/.claude/settings.local.json +0 -11
  19. package/dist/municipal/tickets/tickets.deprecated.getters.d.ts +0 -12
  20. package/dist/municipal/tickets/tickets.deprecated.getters.d.ts.map +0 -1
  21. package/dist/municipal/tickets/tickets.deprecated.getters.js +0 -131
  22. package/dist/municipal/tickets/tickets.deprecated.getters.js.map +0 -1
  23. package/dist/municipal/tickets/tickets.statistics.dates.d.ts +0 -7
  24. package/dist/municipal/tickets/tickets.statistics.dates.d.ts.map +0 -1
  25. package/dist/municipal/tickets/tickets.statistics.dates.js +0 -40
  26. package/dist/municipal/tickets/tickets.statistics.dates.js.map +0 -1
  27. package/dist/municipal/tickets/tickets.statistics.pipeline.d.ts +0 -53
  28. package/dist/municipal/tickets/tickets.statistics.pipeline.d.ts.map +0 -1
  29. package/dist/municipal/tickets/tickets.statistics.pipeline.js +0 -112
  30. package/dist/municipal/tickets/tickets.statistics.pipeline.js.map +0 -1
  31. package/dist/municipal/tickets/tickets.statistics.utils.d.ts +0 -7
  32. package/dist/municipal/tickets/tickets.statistics.utils.d.ts.map +0 -1
  33. package/dist/municipal/tickets/tickets.statistics.utils.js +0 -40
  34. package/dist/municipal/tickets/tickets.statistics.utils.js.map +0 -1
  35. package/dist/talkpilot/calls/calls.statistics.ticketScope.d.ts +0 -12
  36. package/dist/talkpilot/calls/calls.statistics.ticketScope.d.ts.map +0 -1
  37. package/dist/talkpilot/calls/calls.statistics.ticketScope.js +0 -37
  38. package/dist/talkpilot/calls/calls.statistics.ticketScope.js.map +0 -1
  39. package/dist/talkpilot/calls/calls.statistics.tickets.d.ts +0 -17
  40. package/dist/talkpilot/calls/calls.statistics.tickets.d.ts.map +0 -1
  41. package/dist/talkpilot/calls/calls.statistics.tickets.js +0 -33
  42. package/dist/talkpilot/calls/calls.statistics.tickets.js.map +0 -1
  43. package/dist/utils/statistics.aggregation.d.ts +0 -20
  44. package/dist/utils/statistics.aggregation.d.ts.map +0 -1
  45. package/dist/utils/statistics.aggregation.js +0 -43
  46. package/dist/utils/statistics.aggregation.js.map +0 -1
package/README.md CHANGED
@@ -140,6 +140,8 @@ Refer to `DEVELOPMENT.md` for the full walkthrough, token instructions, and fact
140
140
  | 1.3.7 | Added `disableGenericPrompt` optional boolean field to the `Flow` type and schema (CP-704). |
141
141
  | 1.3.8 | Ticket-count Map getters (CP-1200): deprecated `string[]` ticket getters and `CallsStatsFilter` fields, added `Map<string, number>` replacements; fixed ticket counting in `aggregateCallsSummary`. |
142
142
  | 1.3.9 | Fixed wrap-around hour filter boundary guards (CP-1166): excluded first-day morning calls and last-day evening calls from wrap-around windows. |
143
+ | 1.3.10 | Added optional `isDraft` flag to `Ticket` (CP-1390): explicit draft marking with legacy fallback for existing tickets. |
144
+ | 1.3.11 | Fixed pre-existing broken type declaration import in `clientsConfig.types.d.ts` that caused consumer `tsc` builds to fail. |
143
145
 
144
146
  ### 1.1.9
145
147
 
@@ -245,6 +247,34 @@ When `hourFrom` > `hourTo` (e.g. 23:00–13:00), two silent miscounting bugs exi
245
247
 
246
248
  No API changes — both fixes correct silent miscounting. Upgrading is recommended if you use a wrap-around hour window.
247
249
 
250
+ ### 1.3.10 — Ticket draft flag (CP-1390)
251
+
252
+ Added an optional `isDraft` boolean field to the `Ticket` type.
253
+
254
+ **Added**
255
+
256
+ | Export | Purpose |
257
+ | --- | --- |
258
+ | `Ticket.isDraft` | Optional `boolean`. When `true`, the ticket is a draft. When `false`, it is not. When absent (legacy tickets), draft detection falls back to the previous `event_subject_id` heuristic. |
259
+
260
+ **Affects:** `findCallSidDraftTicketCountsByCity`, `findCallSidsWithDraftTicketsByCity` (draft filtering in ticket statistics).
261
+
262
+ **Do I need to update my app?**
263
+
264
+ No — purely additive. Existing tickets without `isDraft` continue to work unchanged. New consumers (MIS) can pass `isDraft: true` when creating a draft ticket.
265
+
266
+ ### 1.3.11 — Fix clientsConfig type declaration import
267
+
268
+ Fixed a pre-existing broken import path in the published `clientsConfig.types.d.ts` (introduced in an earlier release, unrelated to 1.3.10). Consumer TypeScript builds could fail with:
269
+
270
+ `Cannot find module 'src/utils/shared.types' or its corresponding type declarations.`
271
+
272
+ The import now uses a relative path (`../../utils/shared.types`) so `tsc` resolves it correctly from `node_modules/@talkpilot/core-db/dist/`.
273
+
274
+ **Do I need to update my app?**
275
+
276
+ Yes — upgrade to 1.3.11 if your build failed with the error above (affects any version that shipped the broken declaration). No API or behavior changes otherwise.
277
+
248
278
  ## 🛠 CI/CD & deployment
249
279
 
250
280
  - This package is consumed by Cloud Build-based services (TalkPilot Server, MIS, CIS) as a dependency when Docker images are built. Keep `dist/` in sync with your builds because the compiled artifact is what downstream services install.
@@ -1,5 +1,6 @@
1
1
  import { CityName } from "../utils/types";
2
2
  import type { TicketStatsDateRange } from "./tickets.types";
3
+ /** Legacy draft detection for tickets created before isDraft existed. */
3
4
  export declare const isDraftSubjectIdExpr: {
4
5
  $or: ({
5
6
  $eq: (string | {
@@ -19,6 +20,39 @@ export declare const isDraftSubjectIdExpr: {
19
20
  $eq?: undefined;
20
21
  })[];
21
22
  };
23
+ /**
24
+ * Draft when isDraft is true, not draft when isDraft is false,
25
+ * otherwise fall back to legacy subject-id heuristic for older tickets.
26
+ */
27
+ export declare const isDraftTicketExpr: {
28
+ $or: ({
29
+ $eq: (string | boolean)[];
30
+ $and?: undefined;
31
+ } | {
32
+ $and: ({
33
+ $or: ({
34
+ $eq: (string | {
35
+ $type: string;
36
+ })[];
37
+ $regexMatch?: undefined;
38
+ } | {
39
+ $eq: (string | null)[];
40
+ $regexMatch?: undefined;
41
+ } | {
42
+ $regexMatch: {
43
+ input: {
44
+ $ifNull: string[];
45
+ };
46
+ regex: RegExp;
47
+ };
48
+ $eq?: undefined;
49
+ })[];
50
+ } | {
51
+ $ne: (string | boolean)[];
52
+ })[];
53
+ $eq?: undefined;
54
+ })[];
55
+ };
22
56
  export declare const ticketsWithCallSidMatch: (cityName: CityName, dateRange: TicketStatsDateRange) => {
23
57
  createdAt: {
24
58
  $gte: Date;
@@ -1 +1 @@
1
- {"version":3,"file":"tickets.statistics.aggregation.d.ts","sourceRoot":"","sources":["../../../src/municipal/tickets/tickets.statistics.aggregation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAG1C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAuD5D,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;CAWhC,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAClC,UAAU,QAAQ,EAClB,WAAW,oBAAoB;;;;;;;;;;CAK/B,CAAC;AAEH,eAAO,MAAM,uBAAuB,GAClC,UAAU,QAAQ,KACjB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAIzB,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAAU,CAAC,EAC7C,UAAU,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAClC,OAAO,CAAC,CAAC,EAAE,CAKb,CAAC"}
1
+ {"version":3,"file":"tickets.statistics.aggregation.d.ts","sourceRoot":"","sources":["../../../src/municipal/tickets/tickets.statistics.aggregation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAG1C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAuD5D,yEAAyE;AACzE,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;CAWhC,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAO7B,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAClC,UAAU,QAAQ,EAClB,WAAW,oBAAoB;;;;;;;;;;CAK/B,CAAC;AAEH,eAAO,MAAM,uBAAuB,GAClC,UAAU,QAAQ,KACjB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAIzB,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAAU,CAAC,EAC7C,UAAU,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAClC,OAAO,CAAC,CAAC,EAAE,CAKb,CAAC"}
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.runTicketStatsAggregate = exports.subjectResolutionStages = exports.ticketsWithCallSidMatch = exports.isDraftSubjectIdExpr = void 0;
3
+ exports.runTicketStatsAggregate = exports.subjectResolutionStages = exports.ticketsWithCallSidMatch = exports.isDraftTicketExpr = exports.isDraftSubjectIdExpr = void 0;
4
4
  const tickets_constants_1 = require("./tickets.constants");
5
5
  const tickets_getters_1 = require("./tickets.getters");
6
6
  const effectiveSubjectIdExpr = {
@@ -52,6 +52,7 @@ const subjectLabelExpr = {
52
52
  const ticketDateMatch = (dateRange) => ({
53
53
  createdAt: { $gte: dateRange.from, $lte: dateRange.to },
54
54
  });
55
+ /** Legacy draft detection for tickets created before isDraft existed. */
55
56
  exports.isDraftSubjectIdExpr = {
56
57
  $or: [
57
58
  { $eq: [{ $type: "$externalCallFields.event_subject_id" }, "missing"] },
@@ -64,6 +65,18 @@ exports.isDraftSubjectIdExpr = {
64
65
  },
65
66
  ],
66
67
  };
68
+ /**
69
+ * Draft when isDraft is true, not draft when isDraft is false,
70
+ * otherwise fall back to legacy subject-id heuristic for older tickets.
71
+ */
72
+ exports.isDraftTicketExpr = {
73
+ $or: [
74
+ { $eq: ["$isDraft", true] },
75
+ {
76
+ $and: [{ $ne: ["$isDraft", false] }, exports.isDraftSubjectIdExpr],
77
+ },
78
+ ],
79
+ };
67
80
  const ticketsWithCallSidMatch = (cityName, dateRange) => ({
68
81
  cityName,
69
82
  callSid: { $exists: true, $nin: [null, ""] },
@@ -1 +1 @@
1
- {"version":3,"file":"tickets.statistics.aggregation.js","sourceRoot":"","sources":["../../../src/municipal/tickets/tickets.statistics.aggregation.ts"],"names":[],"mappings":";;;AACA,2DAAsE;AACtE,uDAAyD;AAGzD,MAAM,sBAAsB,GAAG;IAC7B,OAAO,EAAE;QACP,sCAAsC;QACtC;YACE,OAAO,EAAE;gBACP,0CAA0C;gBAC1C,2CAA2C;aAC5C;SACF;KACF;CACF,CAAC;AAEF,MAAM,yBAAyB,GAAG,CAAC,QAAkB,EAAE,EAAE,CAAC,CAAC;IACzD,OAAO,EAAE;QACP,IAAI,EAAE,qBAAqB;QAC3B,GAAG,EAAE,EAAE,GAAG,EAAE,qBAAqB,EAAE,CAAC,EAAE,QAAQ,EAAE;QAChD,QAAQ,EAAE;YACR;gBACE,MAAM,EAAE;oBACN,KAAK,EAAE;wBACL,IAAI,EAAE;4BACJ,EAAE,GAAG,EAAE,CAAC,WAAW,EAAE,KAAK,CAAC,EAAE;4BAC7B;gCACE,GAAG,EAAE;oCACH,EAAE,GAAG,EAAE,CAAC,aAAa,EAAE,EAAE,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE;oCACpD,EAAE,GAAG,EAAE,CAAC,iBAAiB,EAAE,EAAE,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE;oCACxD,EAAE,GAAG,EAAE,CAAC,kBAAkB,EAAE,EAAE,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE;iCAC1D;6BACF;yBACF;qBACF;iBACF;aACF;YACD,EAAE,MAAM,EAAE,CAAC,EAAE;SACd;QACD,EAAE,EAAE,MAAM;KACX;CACF,CAAC,CAAC;AAEH,MAAM,gBAAgB,GAAG;IACvB,KAAK,EAAE;QACL,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC,EAAE;QACpC,IAAI,EAAE;YACJ,OAAO,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,mBAAmB,EAAE,CAAC,CAAC,EAAE,EAAE,gCAAY,CAAC;SACpE;QACD,IAAI,EAAE,gCAAY;KACnB;CACF,CAAC;AAEF,MAAM,eAAe,GAAG,CAAC,SAA+B,EAAE,EAAE,CAAC,CAAC;IAC5D,SAAS,EAAE,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC,EAAE,EAAE;CACxD,CAAC,CAAC;AAEU,QAAA,oBAAoB,GAAG;IAClC,GAAG,EAAE;QACH,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,sCAAsC,EAAE,EAAE,SAAS,CAAC,EAAE;QACvE,EAAE,GAAG,EAAE,CAAC,sCAAsC,EAAE,IAAI,CAAC,EAAE;QACvD;YACE,WAAW,EAAE;gBACX,KAAK,EAAE,EAAE,OAAO,EAAE,CAAC,sCAAsC,EAAE,EAAE,CAAC,EAAE;gBAChE,KAAK,EAAE,OAAO;aACf;SACF;KACF;CACF,CAAC;AAEK,MAAM,uBAAuB,GAAG,CACrC,QAAkB,EAClB,SAA+B,EAC/B,EAAE,CAAC,CAAC;IACJ,QAAQ;IACR,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE;IAC5C,GAAG,eAAe,CAAC,SAAS,CAAC;CAC9B,CAAC,CAAC;AAPU,QAAA,uBAAuB,2BAOjC;AAEI,MAAM,uBAAuB,GAAG,CACrC,QAAkB,EACS,EAAE,CAAC;IAC9B,EAAE,UAAU,EAAE,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,EAAE;IAC9D,yBAAyB,CAAC,QAAQ,CAAC;IACnC,EAAE,UAAU,EAAE,EAAE,OAAO,EAAE,gBAAgB,EAAE,EAAE;CAC9C,CAAC;AANW,QAAA,uBAAuB,2BAMlC;AAEK,MAAM,uBAAuB,GAAG,KAAK,EAC1C,QAAmC,EACrB,EAAE;IAChB,MAAM,IAAI,GAAG,MAAM,IAAA,sCAAoB,GAAE;SACtC,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,qCAAiB,EAAE,CAAC;SACrD,OAAO,EAAE,CAAC;IACb,OAAO,IAAW,CAAC;AACrB,CAAC,CAAC;AAPW,QAAA,uBAAuB,2BAOlC"}
1
+ {"version":3,"file":"tickets.statistics.aggregation.js","sourceRoot":"","sources":["../../../src/municipal/tickets/tickets.statistics.aggregation.ts"],"names":[],"mappings":"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"}
@@ -40,7 +40,7 @@ exports.findCallSidTicketCountsByCity = findCallSidTicketCountsByCity;
40
40
  const findCallSidsWithDraftTicketsByCity = async (cityName, dateScope) => {
41
41
  const rows = await (0, tickets_statistics_aggregation_1.runTicketStatsAggregate)([
42
42
  { $match: (0, tickets_statistics_aggregation_1.ticketsWithCallSidMatch)(cityName, (0, exports.resolveTicketStatsDateRange)(dateScope)) },
43
- { $match: { $expr: tickets_statistics_aggregation_1.isDraftSubjectIdExpr } },
43
+ { $match: { $expr: tickets_statistics_aggregation_1.isDraftTicketExpr } },
44
44
  { $group: { _id: "$callSid" } },
45
45
  ]);
46
46
  return rows
@@ -51,7 +51,7 @@ exports.findCallSidsWithDraftTicketsByCity = findCallSidsWithDraftTicketsByCity;
51
51
  const findCallSidDraftTicketCountsByCity = async (cityName, dateScope) => {
52
52
  const rows = await (0, tickets_statistics_aggregation_1.runTicketStatsAggregate)([
53
53
  { $match: (0, tickets_statistics_aggregation_1.ticketsWithCallSidMatch)(cityName, (0, exports.resolveTicketStatsDateRange)(dateScope)) },
54
- { $match: { $expr: tickets_statistics_aggregation_1.isDraftSubjectIdExpr } },
54
+ { $match: { $expr: tickets_statistics_aggregation_1.isDraftTicketExpr } },
55
55
  { $group: { _id: "$callSid", ticketCount: { $sum: 1 } } },
56
56
  ]);
57
57
  return new Map(rows
@@ -1 +1 @@
1
- {"version":3,"file":"tickets.statistics.getters.js","sourceRoot":"","sources":["../../../src/municipal/tickets/tickets.statistics.getters.ts"],"names":[],"mappings":";;;AACA,uDAIgC;AAChC,2DAA4D;AAC5D,qFAK0C;AAOnC,MAAM,2BAA2B,GAAG,CACzC,SAAgC,EACV,EAAE;IACxB,MAAM,EAAE,GAAG,SAAS,EAAE,EAAE,IAAI,IAAI,IAAI,EAAE,CAAC;IACvC,MAAM,IAAI,GACR,SAAS,EAAE,IAAI,IAAI,IAAI,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,yCAAqB,GAAG,mBAAM,CAAC,CAAC;IAC7E,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;AACtB,CAAC,CAAC;AAPW,QAAA,2BAA2B,+BAOtC;AAEK,MAAM,2BAA2B,GAAG,CACzC,QAAgB,EAChB,MAAc,EACd,QAAgB,EACM,EAAE,CAAC,CAAC;IAC1B,IAAI,EAAE,IAAA,mCAAsB,EAAC,QAAQ,EAAE,QAAQ,CAAC;IAChD,EAAE,EAAE,IAAA,iCAAoB,EAAC,MAAM,EAAE,QAAQ,CAAC;CAC3C,CAAC,CAAC;AAPU,QAAA,2BAA2B,+BAOrC;AAEH,6DAA6D;AACtD,MAAM,6BAA6B,GAAG,KAAK,EAChD,QAAkB,EAClB,SAAgC,EACb,EAAE;IACrB,MAAM,IAAI,GAAG,MAAM,IAAA,wDAAuB,EAAmB;QAC3D,EAAE,MAAM,EAAE,IAAA,wDAAuB,EAAC,QAAQ,EAAE,IAAA,mCAA2B,EAAC,SAAS,CAAC,CAAC,EAAE;QACrF,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE,EAAE;KAChC,CAAC,CAAC;IACH,OAAO,IAAI;SACR,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,IAAI,CAAC,CAAC,GAAG,KAAK,EAAE,CAAC;SAC5C,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/B,CAAC,CAAC;AAXW,QAAA,6BAA6B,iCAWxC;AAEK,MAAM,6BAA6B,GAAG,KAAK,EAChD,QAAkB,EAClB,SAAgC,EACF,EAAE;IAChC,MAAM,IAAI,GAAG,MAAM,IAAA,wDAAuB,EAAwC;QAChF,EAAE,MAAM,EAAE,IAAA,wDAAuB,EAAC,QAAQ,EAAE,IAAA,mCAA2B,EAAC,SAAS,CAAC,CAAC,EAAE;QACrF,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE;KAC1D,CAAC,CAAC;IACH,OAAO,IAAI,GAAG,CACZ,IAAI;SACD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,IAAI,CAAC,CAAC,GAAG,KAAK,EAAE,CAAC;SAC5C,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,WAAW,CAAC,CAAC,CAC9C,CAAC;AACJ,CAAC,CAAC;AAbW,QAAA,6BAA6B,iCAaxC;AAGF,kEAAkE;AAC3D,MAAM,kCAAkC,GAAG,KAAK,EACrD,QAAkB,EAClB,SAAgC,EACb,EAAE;IACrB,MAAM,IAAI,GAAG,MAAM,IAAA,wDAAuB,EAAmB;QAC3D,EAAE,MAAM,EAAE,IAAA,wDAAuB,EAAC,QAAQ,EAAE,IAAA,mCAA2B,EAAC,SAAS,CAAC,CAAC,EAAE;QACrF,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,qDAAoB,EAAE,EAAE;QAC3C,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE,EAAE;KAChC,CAAC,CAAC;IACH,OAAO,IAAI;SACR,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,IAAI,CAAC,CAAC,GAAG,KAAK,EAAE,CAAC;SAC5C,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/B,CAAC,CAAC;AAZW,QAAA,kCAAkC,sCAY7C;AAEK,MAAM,kCAAkC,GAAG,KAAK,EACrD,QAAkB,EAClB,SAAgC,EACF,EAAE;IAChC,MAAM,IAAI,GAAG,MAAM,IAAA,wDAAuB,EAAwC;QAChF,EAAE,MAAM,EAAE,IAAA,wDAAuB,EAAC,QAAQ,EAAE,IAAA,mCAA2B,EAAC,SAAS,CAAC,CAAC,EAAE;QACrF,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,qDAAoB,EAAE,EAAE;QAC3C,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE;KAC1D,CAAC,CAAC;IACH,OAAO,IAAI,GAAG,CACZ,IAAI;SACD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,IAAI,CAAC,CAAC,GAAG,KAAK,EAAE,CAAC;SAC5C,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,WAAW,CAAC,CAAC,CAC9C,CAAC;AACJ,CAAC,CAAC;AAdW,QAAA,kCAAkC,sCAc7C;AAEK,MAAM,qBAAqB,GAAG,KAAK,EACxC,QAAkB,EAClB,SAAgC,EACH,EAAE;IAC/B,MAAM,IAAI,GAAG,MAAM,IAAA,wDAAuB,EAAyC;QACjF,EAAE,MAAM,EAAE,IAAA,wDAAuB,EAAC,QAAQ,EAAE,IAAA,mCAA2B,EAAC,SAAS,CAAC,CAAC,EAAE;QACrF,GAAG,IAAA,wDAAuB,EAAC,QAAQ,CAAC;QACpC,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE;KACjD,CAAC,CAAC;IACH,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;AACvF,CAAC,CAAC;AAVW,QAAA,qBAAqB,yBAUhC"}
1
+ {"version":3,"file":"tickets.statistics.getters.js","sourceRoot":"","sources":["../../../src/municipal/tickets/tickets.statistics.getters.ts"],"names":[],"mappings":"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"}
@@ -5,6 +5,7 @@ export type Ticket = {
5
5
  createdAt: Date;
6
6
  updatedAt: Date;
7
7
  callSid?: string;
8
+ isDraft?: boolean;
8
9
  cityName: CityName;
9
10
  externalCallFields: {
10
11
  first_name?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"tickets.types.d.ts","sourceRoot":"","sources":["../../../src/municipal/tickets/tickets.types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAE3C,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C,MAAM,MAAM,MAAM,GAAG;IACnB,GAAG,EAAE,QAAQ,CAAC;IACd,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,QAAQ,CAAC;IACnB,kBAAkB,EAAE;QAClB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,oBAAoB,CAAC,EAAE,MAAM,CAAC;QAC9B,qBAAqB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACtC,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;AAEvC,MAAM,MAAM,WAAW,GAAG;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,EAAE,CAAC,EAAE,IAAI,CAAC;CACX,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,IAAI,EAAE,IAAI,CAAC;IACX,EAAE,EAAE,IAAI,CAAC;CACV,CAAC"}
1
+ {"version":3,"file":"tickets.types.d.ts","sourceRoot":"","sources":["../../../src/municipal/tickets/tickets.types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAE3C,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C,MAAM,MAAM,MAAM,GAAG;IACnB,GAAG,EAAE,QAAQ,CAAC;IACd,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,QAAQ,CAAC;IACnB,kBAAkB,EAAE;QAClB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,oBAAoB,CAAC,EAAE,MAAM,CAAC;QAC9B,qBAAqB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACtC,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;AAEvC,MAAM,MAAM,WAAW,GAAG;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,EAAE,CAAC,EAAE,IAAI,CAAC;CACX,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,IAAI,EAAE,IAAI,CAAC;IACX,EAAE,EAAE,IAAI,CAAC;CACV,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import { WithId } from "mongodb";
2
- import { CallLengthThresholds } from "src/utils/shared.types";
2
+ import { CallLengthThresholds } from "../../utils/shared.types";
3
3
  export type InitiateCallForShortSlaConfig = {
4
4
  active: boolean;
5
5
  max_hours: number;
@@ -1 +1 @@
1
- {"version":3,"file":"clientsConfig.types.d.ts","sourceRoot":"","sources":["../../../src/talkpilot/clientsConfig/clientsConfig.types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"clientsConfig.types.d.ts","sourceRoot":"","sources":["../../../src/talkpilot/clientsConfig/clientsConfig.types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@talkpilot/core-db",
3
- "version": "1.3.9",
3
+ "version": "1.3.11",
4
4
  "description": "Core database package for centralized connections and ORM integration.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -29,7 +29,7 @@ describe("tickets statistics getters", () => {
29
29
  expect(await findCallSidTicketCountsByCity(CITY, mayScope())).toEqual(new Map([["CA-in-range", 1]]));
30
30
  });
31
31
 
32
- it("should treat whitespace-only event_subject_id as draft", async () => {
32
+ it("should treat whitespace-only event_subject_id as draft for legacy tickets", async () => {
33
33
  await getTicketsCollection().insertMany([
34
34
  createTicket({
35
35
  cityName: CITY,
@@ -46,7 +46,33 @@ describe("tickets statistics getters", () => {
46
46
  externalCallFields: { event_subject_id: "100" },
47
47
  }),
48
48
  ]);
49
- expect(await findCallSidDraftTicketCountsByCity(CITY, mayScope())).toEqual(new Map([["CA-draft-whitespace", 1]]));
49
+ expect(await findCallSidDraftTicketCountsByCity(CITY, mayScope())).toEqual(
50
+ new Map([["CA-draft-whitespace", 1]]),
51
+ );
52
+ });
53
+
54
+ it("should use isDraft when set, overriding legacy heuristics", async () => {
55
+ await getTicketsCollection().insertMany([
56
+ createTicket({
57
+ cityName: CITY,
58
+ callSid: "CA-explicit-draft",
59
+ isDraft: true,
60
+ createdAt: new Date("2026-05-15T10:00:00.000Z"),
61
+ updatedAt: new Date("2026-05-15T10:00:00.000Z"),
62
+ externalCallFields: { event_subject_id: "100" },
63
+ }),
64
+ createTicket({
65
+ cityName: CITY,
66
+ callSid: "CA-explicit-not-draft",
67
+ isDraft: false,
68
+ createdAt: new Date("2026-05-16T10:00:00.000Z"),
69
+ updatedAt: new Date("2026-05-16T10:00:00.000Z"),
70
+ externalCallFields: {},
71
+ }),
72
+ ]);
73
+ expect(await findCallSidDraftTicketCountsByCity(CITY, mayScope())).toEqual(
74
+ new Map([["CA-explicit-draft", 1]]),
75
+ );
50
76
  });
51
77
  it("should count multiple tickets on the same callSid", async () => {
52
78
  await getTicketsCollection().insertMany([
@@ -56,6 +56,7 @@ const ticketDateMatch = (dateRange: TicketStatsDateRange) => ({
56
56
  createdAt: { $gte: dateRange.from, $lte: dateRange.to },
57
57
  });
58
58
 
59
+ /** Legacy draft detection for tickets created before isDraft existed. */
59
60
  export const isDraftSubjectIdExpr = {
60
61
  $or: [
61
62
  { $eq: [{ $type: "$externalCallFields.event_subject_id" }, "missing"] },
@@ -69,6 +70,19 @@ export const isDraftSubjectIdExpr = {
69
70
  ],
70
71
  };
71
72
 
73
+ /**
74
+ * Draft when isDraft is true, not draft when isDraft is false,
75
+ * otherwise fall back to legacy subject-id heuristic for older tickets.
76
+ */
77
+ export const isDraftTicketExpr = {
78
+ $or: [
79
+ { $eq: ["$isDraft", true] },
80
+ {
81
+ $and: [{ $ne: ["$isDraft", false] }, isDraftSubjectIdExpr],
82
+ },
83
+ ],
84
+ };
85
+
72
86
  export const ticketsWithCallSidMatch = (
73
87
  cityName: CityName,
74
88
  dateRange: TicketStatsDateRange,
@@ -6,7 +6,7 @@ import {
6
6
  } from "../../utils/date.utils";
7
7
  import { DEFAULT_LOOKBACK_DAYS } from "./tickets.constants";
8
8
  import {
9
- isDraftSubjectIdExpr,
9
+ isDraftTicketExpr,
10
10
  runTicketStatsAggregate,
11
11
  subjectResolutionStages,
12
12
  ticketsWithCallSidMatch,
@@ -72,7 +72,7 @@ export const findCallSidsWithDraftTicketsByCity = async (
72
72
  ): Promise<string[]> => {
73
73
  const rows = await runTicketStatsAggregate<{ _id: unknown }>([
74
74
  { $match: ticketsWithCallSidMatch(cityName, resolveTicketStatsDateRange(dateScope)) },
75
- { $match: { $expr: isDraftSubjectIdExpr } },
75
+ { $match: { $expr: isDraftTicketExpr } },
76
76
  { $group: { _id: "$callSid" } },
77
77
  ]);
78
78
  return rows
@@ -86,7 +86,7 @@ export const findCallSidDraftTicketCountsByCity = async (
86
86
  ): Promise<Map<string, number>> => {
87
87
  const rows = await runTicketStatsAggregate<{ _id: unknown; ticketCount: number }>([
88
88
  { $match: ticketsWithCallSidMatch(cityName, resolveTicketStatsDateRange(dateScope)) },
89
- { $match: { $expr: isDraftSubjectIdExpr } },
89
+ { $match: { $expr: isDraftTicketExpr } },
90
90
  { $group: { _id: "$callSid", ticketCount: { $sum: 1 } } },
91
91
  ]);
92
92
  return new Map(
@@ -7,6 +7,7 @@ export type Ticket = {
7
7
  createdAt: Date;
8
8
  updatedAt: Date;
9
9
  callSid?: string;
10
+ isDraft?: boolean;
10
11
  cityName: CityName;
11
12
  externalCallFields: {
12
13
  first_name?: string;
@@ -1,5 +1,5 @@
1
1
  import { WithId } from "mongodb";
2
- import { CallLengthThresholds } from "src/utils/shared.types";
2
+ import { CallLengthThresholds } from "../../utils/shared.types";
3
3
 
4
4
  // ---------------------------------------------------------------------------
5
5
  // Moked106 (MIS)
@@ -1,11 +0,0 @@
1
- {
2
- "permissions": {
3
- "allow": [
4
- "Bash(npx jest *)",
5
- "Bash(git reset *)",
6
- "Bash(git tag *)",
7
- "Bash(node -p \"require\\('./package.json'\\).version\")",
8
- "Bash(echo \"version: $\\(node -p \"require\\('./package.json'\\).version\"\\)\")"
9
- ]
10
- }
11
- }
@@ -1,12 +0,0 @@
1
- import type { SubjectStatsItem } from "./tickets.types";
2
- /**
3
- * @deprecated Use `findCallSidsWithTicketsByCity` with `ticketStatsDateScopeFromYmd` instead.
4
- * Will be removed in 3.0.0.
5
- */
6
- export declare function getTicketsCountByCityAndDateRange(cityName: string, startStr: string, endStr: string, timezone: string): Promise<number>;
7
- /**
8
- * @deprecated Use `findFilteredCallSids` + `findSubjectsByCallSids` instead.
9
- * Will be removed in 3.0.0.
10
- */
11
- export declare function getTicketsSubjectStats(cityName: string, startStr: string, endStr: string, timezone: string): Promise<SubjectStatsItem[]>;
12
- //# sourceMappingURL=tickets.deprecated.getters.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tickets.deprecated.getters.d.ts","sourceRoot":"","sources":["../../../src/municipal/tickets/tickets.deprecated.getters.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAExD;;;GAGG;AACH,wBAAsB,iCAAiC,CACrD,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,CAAC,CAgBjB;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,CAC1C,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAoG7B"}
@@ -1,131 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getTicketsCountByCityAndDateRange = getTicketsCountByCityAndDateRange;
4
- exports.getTicketsSubjectStats = getTicketsSubjectStats;
5
- const tickets_getters_1 = require("./tickets.getters");
6
- /**
7
- * @deprecated Use `findCallSidsWithTicketsByCity` with `ticketStatsDateScopeFromYmd` instead.
8
- * Will be removed in 3.0.0.
9
- */
10
- async function getTicketsCountByCityAndDateRange(cityName, startStr, endStr, timezone) {
11
- const doc = await (0, tickets_getters_1.getTicketsCollection)()
12
- .aggregate([
13
- { $match: { cityName, callSid: { $exists: true, $nin: [null, ""] } } },
14
- {
15
- $addFields: {
16
- dateLocal: {
17
- $dateToString: { format: "%Y-%m-%d", date: "$createdAt", timezone },
18
- },
19
- },
20
- },
21
- { $match: { dateLocal: { $gte: startStr, $lte: endStr } } },
22
- { $count: "n" },
23
- ])
24
- .next();
25
- return doc?.n ?? 0;
26
- }
27
- /**
28
- * @deprecated Use `findFilteredCallSids` + `findSubjectsByCallSids` instead.
29
- * Will be removed in 3.0.0.
30
- */
31
- async function getTicketsSubjectStats(cityName, startStr, endStr, timezone) {
32
- const rows = await (0, tickets_getters_1.getTicketsCollection)()
33
- .aggregate([
34
- { $match: { cityName } },
35
- {
36
- $addFields: {
37
- dateLocal: {
38
- $dateToString: { format: "%Y-%m-%d", date: "$createdAt", timezone },
39
- },
40
- },
41
- },
42
- { $match: { dateLocal: { $gte: startStr, $lte: endStr } } },
43
- {
44
- $addFields: {
45
- effectiveSubjectId: {
46
- $ifNull: [
47
- "$externalCallFields.event_subject_id",
48
- {
49
- $ifNull: [
50
- "$externalCallFields.event_sub_subject_id",
51
- "$externalCallFields.event_sub_subject_id2",
52
- ],
53
- },
54
- ],
55
- },
56
- },
57
- },
58
- {
59
- $lookup: {
60
- from: "departmentsSubjects",
61
- let: { sid: "$effectiveSubjectId", c: cityName },
62
- pipeline: [
63
- {
64
- $match: {
65
- $expr: {
66
- $and: [
67
- { $eq: ["$cityName", "$$c"] },
68
- {
69
- $or: [
70
- { $eq: ["$subject_id", { $ifNull: ["$$sid", ""] }] },
71
- {
72
- $eq: ["$sub_subject_id", { $ifNull: ["$$sid", ""] }],
73
- },
74
- {
75
- $eq: ["$sub_subject_id2", { $ifNull: ["$$sid", ""] }],
76
- },
77
- ],
78
- },
79
- ],
80
- },
81
- },
82
- },
83
- { $limit: 1 },
84
- ],
85
- as: "subj",
86
- },
87
- },
88
- {
89
- $addFields: {
90
- subject_id: {
91
- $cond: {
92
- if: { $gt: [{ $size: "$subj" }, 0] },
93
- then: {
94
- $ifNull: [{ $arrayElemAt: ["$subj.subject_id", 0] }, ""],
95
- },
96
- else: "",
97
- },
98
- },
99
- subject: {
100
- $cond: {
101
- if: { $gt: [{ $size: "$subj" }, 0] },
102
- then: {
103
- $ifNull: [
104
- { $arrayElemAt: ["$subj.subjectName", 0] },
105
- "Unclassified",
106
- ],
107
- },
108
- else: "Unclassified",
109
- },
110
- },
111
- },
112
- },
113
- {
114
- $group: {
115
- _id: "$subject_id",
116
- subject: { $first: "$subject" },
117
- count: { $sum: 1 },
118
- },
119
- },
120
- { $sort: { count: -1 } },
121
- ])
122
- .toArray();
123
- const total = rows.reduce((sum, row) => sum + row.count, 0);
124
- return rows.map((row) => ({
125
- subject_name: row.subject,
126
- subject_id: row._id,
127
- count: row.count,
128
- percentage: total > 0 ? Math.round((row.count / total) * 100) : 0,
129
- }));
130
- }
131
- //# sourceMappingURL=tickets.deprecated.getters.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tickets.deprecated.getters.js","sourceRoot":"","sources":["../../../src/municipal/tickets/tickets.deprecated.getters.ts"],"names":[],"mappings":"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"}
@@ -1,7 +0,0 @@
1
- import type { TicketStatsDateScope } from "./tickets.types";
2
- export declare const resolveTicketStatsDateRange: (dateScope?: TicketStatsDateScope) => {
3
- from: Date;
4
- to: Date;
5
- };
6
- export declare const ticketStatsDateScopeFromYmd: (startStr: string, endStr: string, timezone: string) => TicketStatsDateScope;
7
- //# sourceMappingURL=tickets.statistics.dates.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tickets.statistics.dates.d.ts","sourceRoot":"","sources":["../../../src/municipal/tickets/tickets.statistics.dates.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAiC5D,eAAO,MAAM,2BAA2B,GACtC,YAAY,oBAAoB,KAC/B;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,EAAE,EAAE,IAAI,CAAA;CAKxB,CAAC;AAEF,eAAO,MAAM,2BAA2B,GACtC,UAAU,MAAM,EAChB,QAAQ,MAAM,EACd,UAAU,MAAM,KACf,oBAGD,CAAC"}
@@ -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.dates.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tickets.statistics.dates.js","sourceRoot":"","sources":["../../../src/municipal/tickets/tickets.statistics.dates.ts"],"names":[],"mappings":";;;AAEA,MAAM,qBAAqB,GAAG,EAAE,CAAC;AACjC,MAAM,MAAM,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAEnC,MAAM,aAAa,GAAG,CAAC,IAAU,EAAE,QAAgB,EAAU,EAAE,CAC7D,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AAExE,MAAM,aAAa,GAAG,CAAC,OAAe,EAAQ,EAAE;IAC9C,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACjD,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AACnD,CAAC,CAAC;AAEF,MAAM,sBAAsB,GAAG,CAAC,OAAe,EAAE,QAAgB,EAAQ,EAAE;IACzE,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC;IAChD,IAAI,GAAG,GAAG,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC;IAC9B,IAAI,IAAI,GAAG,MAAM,GAAG,MAAM,CAAC;IAE3B,OAAO,IAAI,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACzC,IAAI,aAAa,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,IAAI,OAAO;YAAE,IAAI,GAAG,GAAG,CAAC;;YAC7D,GAAG,GAAG,GAAG,CAAC;IACjB,CAAC;IAED,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC;AACxB,CAAC,CAAC;AAEF,MAAM,oBAAoB,GAAG,CAAC,OAAe,EAAE,QAAgB,EAAQ,EAAE;IACvE,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACjD,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC/E,OAAO,IAAI,IAAI,CAAC,sBAAsB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;AAC3E,CAAC,CAAC;AAEK,MAAM,2BAA2B,GAAG,CACzC,SAAgC,EACN,EAAE;IAC5B,MAAM,EAAE,GAAG,SAAS,EAAE,EAAE,IAAI,IAAI,IAAI,EAAE,CAAC;IACvC,MAAM,IAAI,GACR,SAAS,EAAE,IAAI,IAAI,IAAI,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,qBAAqB,GAAG,MAAM,CAAC,CAAC;IAC7E,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;AACtB,CAAC,CAAC;AAPW,QAAA,2BAA2B,+BAOtC;AAEK,MAAM,2BAA2B,GAAG,CACzC,QAAgB,EAChB,MAAc,EACd,QAAgB,EACM,EAAE,CAAC,CAAC;IAC1B,IAAI,EAAE,sBAAsB,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAChD,EAAE,EAAE,oBAAoB,CAAC,MAAM,EAAE,QAAQ,CAAC;CAC3C,CAAC,CAAC;AAPU,QAAA,2BAA2B,+BAOrC"}
@@ -1,53 +0,0 @@
1
- import { CityName } from "../utils/types";
2
- import type { SubjectItem, TicketStatsDateScope } from "./tickets.types";
3
- export declare const isDraftSubjectIdExpr: {
4
- $or: ({
5
- $eq: (string | {
6
- $type: string;
7
- })[];
8
- $regexMatch?: undefined;
9
- } | {
10
- $eq: (string | null)[];
11
- $regexMatch?: undefined;
12
- } | {
13
- $regexMatch: {
14
- input: {
15
- $ifNull: string[];
16
- };
17
- regex: RegExp;
18
- };
19
- $eq?: undefined;
20
- })[];
21
- };
22
- export declare const ticketsWithCallSidMatch: (cityName: CityName, dateScope?: TicketStatsDateScope) => {
23
- createdAt: {
24
- $gte: Date;
25
- $lte: Date;
26
- };
27
- cityName: string;
28
- callSid: {
29
- $exists: boolean;
30
- $nin: (string | null)[];
31
- };
32
- };
33
- export declare const ticketsByCallSidsMatch: (cityName: CityName, callSids: string[], dateScope?: TicketStatsDateScope) => {
34
- createdAt?: {
35
- $gte: Date;
36
- $lte: Date;
37
- } | undefined;
38
- cityName: string;
39
- callSid: {
40
- $in: string[];
41
- };
42
- };
43
- export declare const callSidGroupStages: () => Record<string, unknown>[];
44
- export declare const subjectGroupStages: (cityName: CityName, limit?: number) => Record<string, unknown>[];
45
- export declare const runTicketStatsAggregate: <T>(pipeline: Record<string, unknown>[]) => Promise<T[]>;
46
- export declare const mapCallSidRows: (rows: {
47
- _id: unknown;
48
- }[]) => string[];
49
- export declare const mapSubjectRows: (rows: {
50
- _id: unknown;
51
- count: number;
52
- }[]) => SubjectItem[];
53
- //# sourceMappingURL=tickets.statistics.pipeline.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tickets.statistics.pipeline.d.ts","sourceRoot":"","sources":["../../../src/municipal/tickets/tickets.statistics.pipeline.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAG1C,OAAO,KAAK,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAiBzE,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;CAWhC,CAAC;AA4CF,eAAO,MAAM,uBAAuB,GAClC,UAAU,QAAQ,EAClB,YAAY,oBAAoB;;;;;;;;;;CAKhC,CAAC;AAEH,eAAO,MAAM,sBAAsB,GACjC,UAAU,QAAQ,EAClB,UAAU,MAAM,EAAE,EAClB,YAAY,oBAAoB;;;;;;;;;CAKhC,CAAC;AAEH,eAAO,MAAM,kBAAkB,QAAO,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAE5D,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAC7B,UAAU,QAAQ,EAClB,QAAQ,MAAM,KACb,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAUzB,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAAU,CAAC,EAC7C,UAAU,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAClC,OAAO,CAAC,CAAC,EAAE,CAKb,CAAC;AAEF,eAAO,MAAM,cAAc,GAAI,MAAM;IAAE,GAAG,EAAE,OAAO,CAAA;CAAE,EAAE,KAAG,MAAM,EAChB,CAAC;AAEjD,eAAO,MAAM,cAAc,GAAI,MAAM;IAAE,GAAG,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAAE,KAAG,WAAW,EAMjF,CAAC"}
@@ -1,112 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.mapSubjectRows = exports.mapCallSidRows = exports.runTicketStatsAggregate = exports.subjectGroupStages = exports.callSidGroupStages = exports.ticketsByCallSidsMatch = exports.ticketsWithCallSidMatch = exports.isDraftSubjectIdExpr = void 0;
4
- const tickets_getters_1 = require("./tickets.getters");
5
- const tickets_statistics_utils_1 = require("./tickets.statistics.utils");
6
- const UNCLASSIFIED = "ללא מחלקה";
7
- const STATS_MAX_TIME_MS = 30_000;
8
- const effectiveSubjectIdExpr = {
9
- $ifNull: [
10
- "$externalCallFields.event_subject_id",
11
- {
12
- $ifNull: [
13
- "$externalCallFields.event_sub_subject_id",
14
- "$externalCallFields.event_sub_subject_id2",
15
- ],
16
- },
17
- ],
18
- };
19
- exports.isDraftSubjectIdExpr = {
20
- $or: [
21
- { $eq: [{ $type: "$externalCallFields.event_subject_id" }, "missing"] },
22
- { $eq: ["$externalCallFields.event_subject_id", null] },
23
- {
24
- $regexMatch: {
25
- input: { $ifNull: ["$externalCallFields.event_subject_id", ""] },
26
- regex: /^\s*$/,
27
- },
28
- },
29
- ],
30
- };
31
- const departmentsSubjectsLookup = (cityName) => ({
32
- $lookup: {
33
- from: "departmentsSubjects",
34
- let: { sid: "$effectiveSubjectId", c: cityName },
35
- pipeline: [
36
- {
37
- $match: {
38
- $expr: {
39
- $and: [
40
- { $eq: ["$cityName", "$$c"] },
41
- {
42
- $or: [
43
- { $eq: ["$subject_id", { $ifNull: ["$$sid", ""] }] },
44
- { $eq: ["$sub_subject_id", { $ifNull: ["$$sid", ""] }] },
45
- { $eq: ["$sub_subject_id2", { $ifNull: ["$$sid", ""] }] },
46
- ],
47
- },
48
- ],
49
- },
50
- },
51
- },
52
- { $limit: 1 },
53
- ],
54
- as: "subj",
55
- },
56
- });
57
- const subjectLabelExpr = {
58
- $cond: {
59
- if: { $gt: [{ $size: "$subj" }, 0] },
60
- then: {
61
- $ifNull: [{ $arrayElemAt: ["$subj.subjectName", 0] }, UNCLASSIFIED],
62
- },
63
- else: UNCLASSIFIED,
64
- },
65
- };
66
- const ticketDateMatchStage = (dateScope) => {
67
- const { from, to } = (0, tickets_statistics_utils_1.resolveTicketStatsDateRange)(dateScope);
68
- return { createdAt: { $gte: from, $lte: to } };
69
- };
70
- const ticketsWithCallSidMatch = (cityName, dateScope) => ({
71
- cityName,
72
- callSid: { $exists: true, $nin: [null, ""] },
73
- ...ticketDateMatchStage(dateScope),
74
- });
75
- exports.ticketsWithCallSidMatch = ticketsWithCallSidMatch;
76
- const ticketsByCallSidsMatch = (cityName, callSids, dateScope) => ({
77
- cityName,
78
- callSid: { $in: callSids },
79
- ...(dateScope ? ticketDateMatchStage(dateScope) : {}),
80
- });
81
- exports.ticketsByCallSidsMatch = ticketsByCallSidsMatch;
82
- const callSidGroupStages = () => [
83
- { $group: { _id: "$callSid" } },
84
- ];
85
- exports.callSidGroupStages = callSidGroupStages;
86
- const subjectGroupStages = (cityName, limit) => {
87
- const shouldLimit = typeof limit === "number" && limit > 0;
88
- return [
89
- { $addFields: { effectiveSubjectId: effectiveSubjectIdExpr } },
90
- departmentsSubjectsLookup(cityName),
91
- { $addFields: { subject: subjectLabelExpr } },
92
- { $group: { _id: "$subject", count: { $sum: 1 } } },
93
- { $sort: { count: -1 } },
94
- ...(shouldLimit ? [{ $limit: limit }] : []),
95
- ];
96
- };
97
- exports.subjectGroupStages = subjectGroupStages;
98
- const runTicketStatsAggregate = async (pipeline) => {
99
- const rows = await (0, tickets_getters_1.getTicketsCollection)()
100
- .aggregate(pipeline, { maxTimeMS: STATS_MAX_TIME_MS })
101
- .toArray();
102
- return rows;
103
- };
104
- exports.runTicketStatsAggregate = runTicketStatsAggregate;
105
- const mapCallSidRows = (rows) => rows.map((r) => String(r._id)).filter(Boolean);
106
- exports.mapCallSidRows = mapCallSidRows;
107
- const mapSubjectRows = (rows) => rows.map((r) => ({
108
- subject: String(r._id),
109
- count: r.count,
110
- }));
111
- exports.mapSubjectRows = mapSubjectRows;
112
- //# sourceMappingURL=tickets.statistics.pipeline.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tickets.statistics.pipeline.js","sourceRoot":"","sources":["../../../src/municipal/tickets/tickets.statistics.pipeline.ts"],"names":[],"mappings":"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"}
@@ -1,7 +0,0 @@
1
- import type { TicketStatsDateScope } from "./tickets.types";
2
- export declare const resolveTicketStatsDateRange: (dateScope?: TicketStatsDateScope) => {
3
- from: Date;
4
- to: Date;
5
- };
6
- export declare const ticketStatsDateScopeFromYmd: (startStr: string, endStr: string, timezone: string) => TicketStatsDateScope;
7
- //# sourceMappingURL=tickets.statistics.utils.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tickets.statistics.utils.d.ts","sourceRoot":"","sources":["../../../src/municipal/tickets/tickets.statistics.utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAiC5D,eAAO,MAAM,2BAA2B,GACtC,YAAY,oBAAoB,KAC/B;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,EAAE,EAAE,IAAI,CAAA;CAKxB,CAAC;AAEF,eAAO,MAAM,2BAA2B,GACtC,UAAU,MAAM,EAChB,QAAQ,MAAM,EACd,UAAU,MAAM,KACf,oBAGD,CAAC"}
@@ -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,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"}
@@ -1,33 +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 { city: city, dateScope: (0, exports.ticketStatsDateScopeForFilter)(filter) };
22
- };
23
- exports.resolveCallsStatsTicketScope = resolveCallsStatsTicketScope;
24
- /** Call SIDs with a ticket among filtered calls (for opened / not_opened $match). */
25
- const resolveTicketStatusCallSids = async (filter, scope, filteredCallSids) => (0, tickets_statistics_getters_1.findCallSidsWithTicketsAmong)(scope.city, filteredCallSids, scope.dateScope);
26
- exports.resolveTicketStatusCallSids = resolveTicketStatusCallSids;
27
- const countOpenAndDraftAmongCallSids = (scope, callSids) => (0, tickets_statistics_getters_1.countTicketCallsAmongCallSids)(scope.city, callSids, scope.dateScope);
28
- exports.countOpenAndDraftAmongCallSids = countOpenAndDraftAmongCallSids;
29
- const ticketSidsSetAmongCallSids = async (scope, callSids) => new Set(await (0, tickets_statistics_getters_1.findCallSidsWithTicketsAmong)(scope.city, callSids, scope.dateScope));
30
- exports.ticketSidsSetAmongCallSids = ticketSidsSetAmongCallSids;
31
- const wantsTicketMetrics = (filter) => needsTicketStatusFilter(filter.ticketStatusFilters) || Boolean(filter.cityName);
32
- exports.wantsTicketMetrics = wantsTicketMetrics;
33
- //# sourceMappingURL=calls.statistics.tickets.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"calls.statistics.tickets.js","sourceRoot":"","sources":["../../../src/talkpilot/calls/calls.statistics.tickets.ts"],"names":[],"mappings":";;;AAAA,kFAAyE;AAEzE,mGAI4D;AAS5D,MAAM,uBAAuB,GAAG,CAAC,OAAiD,EAAE,EAAE;IACpF,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;AA2CO,0DAAuB;AAzCzB,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,EAAE,IAAI,EAAE,IAAgB,EAAE,SAAS,EAAE,IAAA,qCAA6B,EAAC,MAAM,CAAC,EAAE,CAAC;AACtF,CAAC,CAAC;AARW,QAAA,4BAA4B,gCAQvC;AAEF,qFAAqF;AAC9E,MAAM,2BAA2B,GAAG,KAAK,EAC9C,MAAwB,EACxB,KAA4B,EAC5B,gBAA0B,EACP,EAAE,CACrB,IAAA,yDAA4B,EAC1B,KAAK,CAAC,IAAI,EACV,gBAAgB,EAChB,KAAK,CAAC,SAAS,CAChB,CAAC;AATS,QAAA,2BAA2B,+BASpC;AAEG,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,CAAC,MAAM,IAAA,yDAA4B,EAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;AAJxE,QAAA,0BAA0B,8BAI8C;AAE9E,MAAM,kBAAkB,GAAG,CAAC,MAAwB,EAAW,EAAE,CACtE,uBAAuB,CAAC,MAAM,CAAC,mBAAmB,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AADrE,QAAA,kBAAkB,sBACmD"}
@@ -1,20 +0,0 @@
1
- /** Default server-side cap for statistics aggregations (30s). */
2
- export declare const DEFAULT_STATS_MAX_TIME_MS = 30000;
3
- /** Log a warning when SID arrays exceed this size (BSON / pipeline pressure). */
4
- export declare const MAX_RECOMMENDED_SID_ARRAY_SIZE = 10000;
5
- export type StatisticsAggregationOptions = {
6
- maxTimeMS?: number;
7
- };
8
- export declare class StatisticsTimeoutError extends Error {
9
- constructor(maxTimeMS: number);
10
- }
11
- export declare const resolveMaxTimeMS: (options?: StatisticsAggregationOptions) => number;
12
- /** Builds a constant lookup object for O(1) membership checks via $getField. */
13
- export declare const buildCallSidLookup: (callSids: string[]) => Record<string, true>;
14
- /**
15
- * $expr that is true when `$callSid` is in `callSids`.
16
- * Prefer over `$in` for large arrays embedded in aggregation pipelines.
17
- */
18
- export declare const callSidInSetExpr: (callSids: string[]) => Record<string, unknown>;
19
- export declare const warnIfLargeSidArray: (label: string, callSids: string[]) => void;
20
- //# sourceMappingURL=statistics.aggregation.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"statistics.aggregation.d.ts","sourceRoot":"","sources":["../../src/utils/statistics.aggregation.ts"],"names":[],"mappings":"AAAA,iEAAiE;AACjE,eAAO,MAAM,yBAAyB,QAAS,CAAC;AAEhD,iFAAiF;AACjF,eAAO,MAAM,8BAA8B,QAAS,CAAC;AAErD,MAAM,MAAM,4BAA4B,GAAG;IACzC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,qBAAa,sBAAuB,SAAQ,KAAK;gBACnC,SAAS,EAAE,MAAM;CAI9B;AAED,eAAO,MAAM,gBAAgB,GAAI,UAAU,4BAA4B,KAAG,MACzB,CAAC;AAElD,gFAAgF;AAChF,eAAO,MAAM,kBAAkB,GAAI,UAAU,MAAM,EAAE,KAAG,MAAM,CAAC,MAAM,EAAE,IAAI,CACK,CAAC;AAEjF;;;GAGG;AACH,eAAO,MAAM,gBAAgB,GAAI,UAAU,MAAM,EAAE,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAW1E,CAAC;AAEH,eAAO,MAAM,mBAAmB,GAAI,OAAO,MAAM,EAAE,UAAU,MAAM,EAAE,KAAG,IAMvE,CAAC"}
@@ -1,43 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.warnIfLargeSidArray = exports.callSidInSetExpr = exports.buildCallSidLookup = exports.resolveMaxTimeMS = exports.StatisticsTimeoutError = exports.MAX_RECOMMENDED_SID_ARRAY_SIZE = exports.DEFAULT_STATS_MAX_TIME_MS = void 0;
4
- /** Default server-side cap for statistics aggregations (30s). */
5
- exports.DEFAULT_STATS_MAX_TIME_MS = 30_000;
6
- /** Log a warning when SID arrays exceed this size (BSON / pipeline pressure). */
7
- exports.MAX_RECOMMENDED_SID_ARRAY_SIZE = 10_000;
8
- class StatisticsTimeoutError extends Error {
9
- constructor(maxTimeMS) {
10
- super(`Statistics aggregation exceeded maxTimeMS (${maxTimeMS})`);
11
- this.name = "StatisticsTimeoutError";
12
- }
13
- }
14
- exports.StatisticsTimeoutError = StatisticsTimeoutError;
15
- const resolveMaxTimeMS = (options) => options?.maxTimeMS ?? exports.DEFAULT_STATS_MAX_TIME_MS;
16
- exports.resolveMaxTimeMS = resolveMaxTimeMS;
17
- /** Builds a constant lookup object for O(1) membership checks via $getField. */
18
- const buildCallSidLookup = (callSids) => Object.fromEntries(callSids.map((sid) => [sid, true]));
19
- exports.buildCallSidLookup = buildCallSidLookup;
20
- /**
21
- * $expr that is true when `$callSid` is in `callSids`.
22
- * Prefer over `$in` for large arrays embedded in aggregation pipelines.
23
- */
24
- const callSidInSetExpr = (callSids) => ({
25
- $eq: [
26
- {
27
- $getField: {
28
- field: "$callSid",
29
- input: (0, exports.buildCallSidLookup)(callSids),
30
- default: false,
31
- },
32
- },
33
- true,
34
- ],
35
- });
36
- exports.callSidInSetExpr = callSidInSetExpr;
37
- const warnIfLargeSidArray = (label, callSids) => {
38
- if (callSids.length > exports.MAX_RECOMMENDED_SID_ARRAY_SIZE) {
39
- console.warn(`[core-db statistics] ${label}: ${callSids.length} call SIDs exceeds recommended max (${exports.MAX_RECOMMENDED_SID_ARRAY_SIZE}). Narrow the date range or cache SIDs once per request.`);
40
- }
41
- };
42
- exports.warnIfLargeSidArray = warnIfLargeSidArray;
43
- //# sourceMappingURL=statistics.aggregation.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"statistics.aggregation.js","sourceRoot":"","sources":["../../src/utils/statistics.aggregation.ts"],"names":[],"mappings":";;;AAAA,iEAAiE;AACpD,QAAA,yBAAyB,GAAG,MAAM,CAAC;AAEhD,iFAAiF;AACpE,QAAA,8BAA8B,GAAG,MAAM,CAAC;AAMrD,MAAa,sBAAuB,SAAQ,KAAK;IAC/C,YAAY,SAAiB;QAC3B,KAAK,CAAC,8CAA8C,SAAS,GAAG,CAAC,CAAC;QAClE,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;IACvC,CAAC;CACF;AALD,wDAKC;AAEM,MAAM,gBAAgB,GAAG,CAAC,OAAsC,EAAU,EAAE,CACjF,OAAO,EAAE,SAAS,IAAI,iCAAyB,CAAC;AADrC,QAAA,gBAAgB,oBACqB;AAElD,gFAAgF;AACzE,MAAM,kBAAkB,GAAG,CAAC,QAAkB,EAAwB,EAAE,CAC7E,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAyB,CAAC;AADpE,QAAA,kBAAkB,sBACkD;AAEjF;;;GAGG;AACI,MAAM,gBAAgB,GAAG,CAAC,QAAkB,EAA2B,EAAE,CAAC,CAAC;IAChF,GAAG,EAAE;QACH;YACE,SAAS,EAAE;gBACT,KAAK,EAAE,UAAU;gBACjB,KAAK,EAAE,IAAA,0BAAkB,EAAC,QAAQ,CAAC;gBACnC,OAAO,EAAE,KAAK;aACf;SACF;QACD,IAAI;KACL;CACF,CAAC,CAAC;AAXU,QAAA,gBAAgB,oBAW1B;AAEI,MAAM,mBAAmB,GAAG,CAAC,KAAa,EAAE,QAAkB,EAAQ,EAAE;IAC7E,IAAI,QAAQ,CAAC,MAAM,GAAG,sCAA8B,EAAE,CAAC;QACrD,OAAO,CAAC,IAAI,CACV,wBAAwB,KAAK,KAAK,QAAQ,CAAC,MAAM,uCAAuC,sCAA8B,0DAA0D,CACjL,CAAC;IACJ,CAAC;AACH,CAAC,CAAC;AANW,QAAA,mBAAmB,uBAM9B"}