@talkpilot/core-db 1.2.2 → 1.3.0

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 (100) hide show
  1. package/.cursor/rules/development.mdc +65 -65
  2. package/DEVELOPMENT.md +98 -98
  3. package/README.md +169 -139
  4. package/README_OLD.md +160 -160
  5. package/dist/municipal/tickets/index.d.ts +2 -1
  6. package/dist/municipal/tickets/index.d.ts.map +1 -1
  7. package/dist/municipal/tickets/index.js +1 -0
  8. package/dist/municipal/tickets/index.js.map +1 -1
  9. package/dist/municipal/tickets/tickets.constants.d.ts +7 -0
  10. package/dist/municipal/tickets/tickets.constants.d.ts.map +1 -0
  11. package/dist/municipal/tickets/tickets.constants.js +10 -0
  12. package/dist/municipal/tickets/tickets.constants.js.map +1 -0
  13. package/dist/municipal/tickets/tickets.deprecated.getters.d.ts +12 -0
  14. package/dist/municipal/tickets/tickets.deprecated.getters.d.ts.map +1 -0
  15. package/dist/municipal/tickets/tickets.deprecated.getters.js +131 -0
  16. package/dist/municipal/tickets/tickets.deprecated.getters.js.map +1 -0
  17. package/dist/municipal/tickets/tickets.getters.d.ts +0 -11
  18. package/dist/municipal/tickets/tickets.getters.d.ts.map +1 -1
  19. package/dist/municipal/tickets/tickets.getters.js +0 -128
  20. package/dist/municipal/tickets/tickets.getters.js.map +1 -1
  21. package/dist/municipal/tickets/tickets.statistics.aggregation.d.ts +45 -0
  22. package/dist/municipal/tickets/tickets.statistics.aggregation.d.ts.map +1 -0
  23. package/dist/municipal/tickets/tickets.statistics.aggregation.js +98 -0
  24. package/dist/municipal/tickets/tickets.statistics.aggregation.js.map +1 -0
  25. package/dist/municipal/tickets/tickets.statistics.dates.d.ts +7 -0
  26. package/dist/municipal/tickets/tickets.statistics.dates.d.ts.map +1 -0
  27. package/dist/municipal/tickets/tickets.statistics.dates.js +40 -0
  28. package/dist/municipal/tickets/tickets.statistics.dates.js.map +1 -0
  29. package/dist/municipal/tickets/tickets.statistics.getters.d.ts +9 -0
  30. package/dist/municipal/tickets/tickets.statistics.getters.d.ts.map +1 -0
  31. package/dist/municipal/tickets/tickets.statistics.getters.js +55 -0
  32. package/dist/municipal/tickets/tickets.statistics.getters.js.map +1 -0
  33. package/dist/municipal/tickets/tickets.statistics.pipeline.d.ts +53 -0
  34. package/dist/municipal/tickets/tickets.statistics.pipeline.d.ts.map +1 -0
  35. package/dist/municipal/tickets/tickets.statistics.pipeline.js +112 -0
  36. package/dist/municipal/tickets/tickets.statistics.pipeline.js.map +1 -0
  37. package/dist/municipal/tickets/tickets.statistics.utils.d.ts +7 -0
  38. package/dist/municipal/tickets/tickets.statistics.utils.d.ts.map +1 -0
  39. package/dist/municipal/tickets/tickets.statistics.utils.js +40 -0
  40. package/dist/municipal/tickets/tickets.statistics.utils.js.map +1 -0
  41. package/dist/municipal/tickets/tickets.types.d.ts +10 -5
  42. package/dist/municipal/tickets/tickets.types.d.ts.map +1 -1
  43. package/dist/talkpilot/calls/calls.constants.d.ts +17 -0
  44. package/dist/talkpilot/calls/calls.constants.d.ts.map +1 -0
  45. package/dist/talkpilot/calls/calls.constants.js +20 -0
  46. package/dist/talkpilot/calls/calls.constants.js.map +1 -0
  47. package/dist/talkpilot/calls/calls.statistics.getters.d.ts +19 -0
  48. package/dist/talkpilot/calls/calls.statistics.getters.d.ts.map +1 -0
  49. package/dist/talkpilot/calls/calls.statistics.getters.js +375 -0
  50. package/dist/talkpilot/calls/calls.statistics.getters.js.map +1 -0
  51. package/dist/talkpilot/calls/calls.statistics.ticketScope.d.ts +12 -0
  52. package/dist/talkpilot/calls/calls.statistics.ticketScope.d.ts.map +1 -0
  53. package/dist/talkpilot/calls/calls.statistics.ticketScope.js +37 -0
  54. package/dist/talkpilot/calls/calls.statistics.ticketScope.js.map +1 -0
  55. package/dist/talkpilot/calls/calls.statistics.tickets.d.ts +17 -0
  56. package/dist/talkpilot/calls/calls.statistics.tickets.d.ts.map +1 -0
  57. package/dist/talkpilot/calls/calls.statistics.tickets.js +33 -0
  58. package/dist/talkpilot/calls/calls.statistics.tickets.js.map +1 -0
  59. package/dist/talkpilot/calls/calls.statistics.types.d.ts +39 -0
  60. package/dist/talkpilot/calls/calls.statistics.types.d.ts.map +1 -0
  61. package/dist/talkpilot/calls/calls.statistics.types.js +3 -0
  62. package/dist/talkpilot/calls/calls.statistics.types.js.map +1 -0
  63. package/dist/talkpilot/calls/calls.types.d.ts +3 -3
  64. package/dist/talkpilot/calls/calls.types.d.ts.map +1 -1
  65. package/dist/talkpilot/calls/calls.types.js +0 -3
  66. package/dist/talkpilot/calls/calls.types.js.map +1 -1
  67. package/dist/talkpilot/calls/index.d.ts +3 -0
  68. package/dist/talkpilot/calls/index.d.ts.map +1 -1
  69. package/dist/talkpilot/calls/index.js +3 -0
  70. package/dist/talkpilot/calls/index.js.map +1 -1
  71. package/dist/utils/date.utils.d.ts +49 -0
  72. package/dist/utils/date.utils.d.ts.map +1 -0
  73. package/dist/utils/date.utils.js +103 -0
  74. package/dist/utils/date.utils.js.map +1 -0
  75. package/dist/utils/statistics.aggregation.d.ts +20 -0
  76. package/dist/utils/statistics.aggregation.d.ts.map +1 -0
  77. package/dist/utils/statistics.aggregation.js +43 -0
  78. package/dist/utils/statistics.aggregation.js.map +1 -0
  79. package/jest.config.js +19 -19
  80. package/package.json +46 -46
  81. package/src/municipal/tickets/__tests__/tickets.getters.spec.ts +1 -37
  82. package/src/municipal/tickets/__tests__/tickets.statistics.spec.ts +104 -0
  83. package/src/municipal/tickets/index.ts +2 -1
  84. package/src/municipal/tickets/tickets.constants.ts +8 -0
  85. package/src/municipal/tickets/tickets.getters.ts +0 -140
  86. package/src/municipal/tickets/tickets.statistics.aggregation.ts +113 -0
  87. package/src/municipal/tickets/tickets.statistics.getters.ts +93 -0
  88. package/src/municipal/tickets/tickets.types.ts +14 -9
  89. package/src/talkpilot/calls/__tests__/calls.statistics.spec.ts +281 -0
  90. package/src/talkpilot/calls/calls.constants.ts +20 -0
  91. package/src/talkpilot/calls/calls.statistics.getters.ts +525 -0
  92. package/src/talkpilot/calls/calls.statistics.types.ts +44 -0
  93. package/src/talkpilot/calls/calls.types.ts +6 -3
  94. package/src/talkpilot/calls/index.ts +3 -0
  95. package/src/utils/date.utils.ts +116 -0
  96. package/tsconfig.json +23 -23
  97. package/dist/talkpilot/calls/calls.dashboard.d.ts +0 -3
  98. package/dist/talkpilot/calls/calls.dashboard.d.ts.map +0 -1
  99. package/dist/talkpilot/calls/calls.dashboard.js +0 -191
  100. package/dist/talkpilot/calls/calls.dashboard.js.map +0 -1
@@ -1,8 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.clearGuestJwtByCallNumber = exports.updateTicketFilesByCallNumber = exports.findTicketByQuery = exports.deleteTicket = exports.updateTicket = exports.createTicket = exports.getTicketById = exports.findTicketsByCallSid = exports.findTickets = exports.getTicketsCollection = exports.generateTicketId = void 0;
4
- exports.getTicketsCountByCityAndDateRange = getTicketsCountByCityAndDateRange;
5
- exports.getTicketsSubjectStats = getTicketsSubjectStats;
6
4
  const index_1 = require("../index");
7
5
  /**
8
6
  * Generate a new ticket ID as a string
@@ -54,132 +52,6 @@ const deleteTicket = async (ticketId) => {
54
52
  return result.deletedCount > 0;
55
53
  };
56
54
  exports.deleteTicket = deleteTicket;
57
- /**
58
- * Count tickets by city and date range (createdAt converted to given timezone).
59
- * Used as "open" tickets count when status is not available.
60
- */
61
- async function getTicketsCountByCityAndDateRange(cityName, startStr, endStr, timezone) {
62
- const doc = await (0, exports.getTicketsCollection)()
63
- .aggregate([
64
- { $match: { cityName, callSid: { $exists: true, $nin: [null, ""] } } },
65
- {
66
- $addFields: {
67
- dateLocal: {
68
- $dateToString: { format: "%Y-%m-%d", date: "$createdAt", timezone },
69
- },
70
- },
71
- },
72
- { $match: { dateLocal: { $gte: startStr, $lte: endStr } } },
73
- { $count: "n" },
74
- ])
75
- .next();
76
- return doc?.n ?? 0;
77
- }
78
- /**
79
- * Count of tickets by department (subject) from departmentsSubjects. Different departments (subject_id) are grouped, and sub-subjects are unified under their department.
80
- * Date filter: createdAt in [startStr, endStr] (in the given timezone). Fallback to "Unclassified" when no match is found in the lookup.
81
- */
82
- async function getTicketsSubjectStats(cityName, startStr, endStr, timezone) {
83
- const coll = (0, exports.getTicketsCollection)();
84
- const rows = await coll
85
- .aggregate([
86
- { $match: { cityName } },
87
- {
88
- $addFields: {
89
- dateLocal: {
90
- $dateToString: { format: "%Y-%m-%d", date: "$createdAt", timezone },
91
- },
92
- },
93
- },
94
- { $match: { dateLocal: { $gte: startStr, $lte: endStr } } },
95
- {
96
- $addFields: {
97
- effectiveSubjectId: {
98
- $ifNull: [
99
- "$externalCallFields.event_subject_id",
100
- {
101
- $ifNull: [
102
- "$externalCallFields.event_sub_subject_id",
103
- "$externalCallFields.event_sub_subject_id2",
104
- ],
105
- },
106
- ],
107
- },
108
- },
109
- },
110
- {
111
- $lookup: {
112
- from: "departmentsSubjects",
113
- let: { sid: "$effectiveSubjectId", c: cityName },
114
- pipeline: [
115
- {
116
- $match: {
117
- $expr: {
118
- $and: [
119
- { $eq: ["$cityName", "$$c"] },
120
- {
121
- $or: [
122
- { $eq: ["$subject_id", { $ifNull: ["$$sid", ""] }] },
123
- {
124
- $eq: ["$sub_subject_id", { $ifNull: ["$$sid", ""] }],
125
- },
126
- {
127
- $eq: ["$sub_subject_id2", { $ifNull: ["$$sid", ""] }],
128
- },
129
- ],
130
- },
131
- ],
132
- },
133
- },
134
- },
135
- { $limit: 1 },
136
- ],
137
- as: "subj",
138
- },
139
- },
140
- {
141
- $addFields: {
142
- subject_id: {
143
- $cond: {
144
- if: { $gt: [{ $size: "$subj" }, 0] },
145
- then: {
146
- $ifNull: [{ $arrayElemAt: ["$subj.subject_id", 0] }, ""],
147
- },
148
- else: "",
149
- },
150
- },
151
- subject: {
152
- $cond: {
153
- if: { $gt: [{ $size: "$subj" }, 0] },
154
- then: {
155
- $ifNull: [
156
- { $arrayElemAt: ["$subj.subjectName", 0] },
157
- "Unclassified",
158
- ],
159
- },
160
- else: "Unclassified",
161
- },
162
- },
163
- },
164
- },
165
- {
166
- $group: {
167
- _id: "$subject_id",
168
- subject: { $first: "$subject" },
169
- count: { $sum: 1 },
170
- },
171
- },
172
- { $sort: { count: -1 } },
173
- ])
174
- .toArray();
175
- const total = rows.reduce((s, r) => s + r.count, 0);
176
- return rows.map((r) => ({
177
- subject_name: r.subject,
178
- subject_id: r._id,
179
- count: r.count,
180
- percentage: total > 0 ? Math.round((r.count / total) * 100) : 0,
181
- }));
182
- }
183
55
  const findTicketByQuery = async (query) => {
184
56
  return await (0, exports.getTicketsCollection)().findOne(query);
185
57
  };
@@ -1 +1 @@
1
- {"version":3,"file":"tickets.getters.js","sourceRoot":"","sources":["../../../src/municipal/tickets/tickets.getters.ts"],"names":[],"mappings":";;;AA0EA,8EAqBC;AAMD,wDA0GC;AA/MD,oCAA6D;AAI7D;;;GAGG;AACI,MAAM,gBAAgB,GAAG,GAAW,EAAE;IAC3C,OAAO,IAAI,gBAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC;AACnC,CAAC,CAAC;AAFW,QAAA,gBAAgB,oBAE3B;AAEK,MAAM,oBAAoB,GAAG,GAAuB,EAAE;IAC3D,OAAO,IAAA,aAAK,GAAE,CAAC,UAAU,CAAS,SAAS,CAAC,CAAC;AAC/C,CAAC,CAAC;AAFW,QAAA,oBAAoB,wBAE/B;AAEK,MAAM,WAAW,GAAG,KAAK,EAC9B,SAAyB,EAAE,EACR,EAAE;IACrB,OAAO,MAAM,IAAA,4BAAoB,GAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC;AAC7D,CAAC,CAAC;AAJW,QAAA,WAAW,eAItB;AAEK,MAAM,oBAAoB,GAAG,KAAK,EACvC,OAAe,EACI,EAAE;IACrB,OAAO,MAAM,IAAA,4BAAoB,GAAE,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;AAClE,CAAC,CAAC;AAJW,QAAA,oBAAoB,wBAI/B;AAEK,MAAM,aAAa,GAAG,KAAK,EAChC,QAAgB,EACQ,EAAE;IAC1B,MAAM,MAAM,GAAG,MAAM,IAAA,4BAAoB,GAAE,CAAC,OAAO,CAAC;QAClD,GAAG,EAAE,IAAI,gBAAQ,CAAC,QAAQ,CAAC;KAC5B,CAAC,CAAC;IACH,OAAO,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;AAChC,CAAC,CAAC;AAPW,QAAA,aAAa,iBAOxB;AAEK,MAAM,YAAY,GAAG,KAAK,EAC/B,UAA2D,EAC3D,QAAiB,EACO,EAAE;IAC1B,MAAM,MAAM,GAAW;QACrB,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,gBAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,gBAAQ,EAAE;QACvD,GAAG,UAAU;QACb,SAAS,EAAE,IAAI,IAAI,EAAE;QACrB,SAAS,EAAE,IAAI,IAAI,EAAE;KACtB,CAAC;IACF,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,IAAA,4BAAoB,GAAE,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACtE,OAAO,UAAU,CAAC;AACpB,CAAC,CAAC;AAZW,QAAA,YAAY,gBAYvB;AAEK,MAAM,YAAY,GAAG,KAAK,EAC/B,QAAgB,EAChB,IAA8D,EACtC,EAAE;IAC1B,MAAM,MAAM,GAAG,MAAM,IAAA,4BAAoB,GAAE,CAAC,gBAAgB,CAC1D,EAAE,GAAG,EAAE,IAAI,gBAAQ,CAAC,QAAQ,CAAC,EAAE,EAC/B,EAAE,IAAI,EAAE,EAAE,GAAG,IAAI,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,EAAE,EAAE,EAC5C,EAAE,cAAc,EAAE,OAAO,EAAE,CAC5B,CAAC;IACF,OAAO,MAAM,IAAI,IAAI,CAAC;AACxB,CAAC,CAAC;AAVW,QAAA,YAAY,gBAUvB;AAEK,MAAM,YAAY,GAAG,KAAK,EAAE,QAAgB,EAAoB,EAAE;IACvE,MAAM,MAAM,GAAG,MAAM,IAAA,4BAAoB,GAAE,CAAC,SAAS,CAAC;QACpD,GAAG,EAAE,IAAI,gBAAQ,CAAC,QAAQ,CAAC;KAC5B,CAAC,CAAC;IACH,OAAO,MAAM,CAAC,YAAY,GAAG,CAAC,CAAC;AACjC,CAAC,CAAC;AALW,QAAA,YAAY,gBAKvB;AAEF;;;GAGG;AACI,KAAK,UAAU,iCAAiC,CACrD,QAAgB,EAChB,QAAgB,EAChB,MAAc,EACd,QAAgB;IAEhB,MAAM,GAAG,GAAG,MAAM,IAAA,4BAAoB,GAAE;SACrC,SAAS,CAAgB;QACxB,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE;QACtE;YACE,UAAU,EAAE;gBACV,SAAS,EAAE;oBACT,aAAa,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE;iBACpE;aACF;SACF;QACD,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE;QAC3D,EAAE,MAAM,EAAE,GAAG,EAAE;KAChB,CAAC;SACD,IAAI,EAAE,CAAC;IACV,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;AACrB,CAAC;AAED;;;GAGG;AACI,KAAK,UAAU,sBAAsB,CAC1C,QAAgB,EAChB,QAAgB,EAChB,MAAc,EACd,QAAgB;IAEhB,MAAM,IAAI,GAAG,IAAA,4BAAoB,GAAE,CAAC;IACpC,MAAM,IAAI,GAAG,MAAM,IAAI;SACpB,SAAS,CAAkD;QAC1D,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,EAAE;QACxB;YACE,UAAU,EAAE;gBACV,SAAS,EAAE;oBACT,aAAa,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE;iBACpE;aACF;SACF;QACD,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE;QAC3D;YACE,UAAU,EAAE;gBACV,kBAAkB,EAAE;oBAClB,OAAO,EAAE;wBACP,sCAAsC;wBACtC;4BACE,OAAO,EAAE;gCACP,0CAA0C;gCAC1C,2CAA2C;6BAC5C;yBACF;qBACF;iBACF;aACF;SACF;QACD;YACE,OAAO,EAAE;gBACP,IAAI,EAAE,qBAAqB;gBAC3B,GAAG,EAAE,EAAE,GAAG,EAAE,qBAAqB,EAAE,CAAC,EAAE,QAAQ,EAAE;gBAChD,QAAQ,EAAE;oBACR;wBACE,MAAM,EAAE;4BACN,KAAK,EAAE;gCACL,IAAI,EAAE;oCACJ,EAAE,GAAG,EAAE,CAAC,WAAW,EAAE,KAAK,CAAC,EAAE;oCAC7B;wCACE,GAAG,EAAE;4CACH,EAAE,GAAG,EAAE,CAAC,aAAa,EAAE,EAAE,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE;4CACpD;gDACE,GAAG,EAAE,CAAC,iBAAiB,EAAE,EAAE,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC;6CACrD;4CACD;gDACE,GAAG,EAAE,CAAC,kBAAkB,EAAE,EAAE,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC;6CACtD;yCACF;qCACF;iCACF;6BACF;yBACF;qBACF;oBACD,EAAE,MAAM,EAAE,CAAC,EAAE;iBACd;gBACD,EAAE,EAAE,MAAM;aACX;SACF;QACD;YACE,UAAU,EAAE;gBACV,UAAU,EAAE;oBACV,KAAK,EAAE;wBACL,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC,EAAE;wBACpC,IAAI,EAAE;4BACJ,OAAO,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,kBAAkB,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC;yBACzD;wBACD,IAAI,EAAE,EAAE;qBACT;iBACF;gBACD,OAAO,EAAE;oBACP,KAAK,EAAE;wBACL,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC,EAAE;wBACpC,IAAI,EAAE;4BACJ,OAAO,EAAE;gCACP,EAAE,YAAY,EAAE,CAAC,mBAAmB,EAAE,CAAC,CAAC,EAAE;gCAC1C,cAAc;6BACf;yBACF;wBACD,IAAI,EAAE,cAAc;qBACrB;iBACF;aACF;SACF;QACD;YACE,MAAM,EAAE;gBACN,GAAG,EAAE,aAAa;gBAClB,OAAO,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE;gBAC/B,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE;aACnB;SACF;QACD,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE;KACzB,CAAC;SACD,OAAO,EAAE,CAAC;IAEb,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAS,EAAE,CAAM,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IACjE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC;QAC3B,YAAY,EAAE,CAAC,CAAC,OAAO;QACvB,UAAU,EAAE,CAAC,CAAC,GAAG;QACjB,KAAK,EAAE,CAAC,CAAC,KAAK;QACd,UAAU,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;KAChE,CAAC,CAAC,CAAC;AACN,CAAC;AAEM,MAAM,iBAAiB,GAAG,KAAK,EAAE,KAAsB,EAAE,EAAE;IAChE,OAAO,MAAM,IAAA,4BAAoB,GAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AACrD,CAAC,CAAC;AAFW,QAAA,iBAAiB,qBAE5B;AACF;;GAEG;AACI,MAAM,6BAA6B,GAAG,KAAK,EAAE,MAMnD,EAAoB,EAAE;IACrB,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;IAEhE,MAAM,MAAM,GAAQ,EAAE,CAAC;IACvB,IAAI,MAAM;QAAE,MAAM,CAAC,2BAA2B,CAAC,GAAG,MAAM,CAAC;IACzD,IAAI,MAAM;QAAE,MAAM,CAAC,2BAA2B,CAAC,GAAG,MAAM,CAAC;IACzD,IAAI,MAAM;QAAE,MAAM,CAAC,2BAA2B,CAAC,GAAG,MAAM,CAAC;IAEzD,MAAM,MAAM,GAAG,MAAM,IAAA,4BAAoB,GAAE,CAAC,SAAS,CACnD;QACE,QAAQ,EAAE,QAAQ;QAClB,gCAAgC,EAAE,UAAU;KAC7C,EACD;QACE,IAAI,EAAE;YACJ,GAAG,MAAM;YACT,SAAS,EAAE,IAAI,IAAI,EAAE;SACtB;KACF,CACF,CAAC;IAEF,OAAO,MAAM,CAAC,YAAY,GAAG,CAAC,CAAC;AACjC,CAAC,CAAC;AA5BW,QAAA,6BAA6B,iCA4BxC;AAEF;;GAEG;AACI,MAAM,yBAAyB,GAAG,KAAK,EAAE,MAG/C,EAAoB,EAAE;IACrB,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC;IAExC,MAAM,MAAM,GAAG,MAAM,IAAA,4BAAoB,GAAE,CAAC,SAAS,CACnD,EAAE,QAAQ,EAAE,gCAAgC,EAAE,UAAU,EAAE,EAC1D,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,EAAE,EAAE,CAC9D,CAAC;IAEF,OAAO,MAAM,CAAC,YAAY,GAAG,CAAC,CAAC;AACjC,CAAC,CAAC;AAZW,QAAA,yBAAyB,6BAYpC"}
1
+ {"version":3,"file":"tickets.getters.js","sourceRoot":"","sources":["../../../src/municipal/tickets/tickets.getters.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ import { CityName } from "../utils/types";
2
+ import type { TicketStatsDateRange } 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, dateRange: TicketStatsDateRange) => {
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[], dateRange?: TicketStatsDateRange) => {
34
+ createdAt?: {
35
+ $gte: Date;
36
+ $lte: Date;
37
+ } | undefined;
38
+ cityName: string;
39
+ callSid: {
40
+ $in: string[];
41
+ };
42
+ };
43
+ export declare const subjectGroupStages: (cityName: CityName, limit?: number) => Record<string, unknown>[];
44
+ export declare const runTicketStatsAggregate: <T>(pipeline: Record<string, unknown>[]) => Promise<T[]>;
45
+ //# sourceMappingURL=tickets.statistics.aggregation.d.ts.map
@@ -0,0 +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,sBAAsB,GACjC,UAAU,QAAQ,EAClB,UAAU,MAAM,EAAE,EAClB,YAAY,oBAAoB;;;;;;;;;CAKhC,CAAC;AAEH,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"}
@@ -0,0 +1,98 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.runTicketStatsAggregate = exports.subjectGroupStages = exports.ticketsByCallSidsMatch = exports.ticketsWithCallSidMatch = exports.isDraftSubjectIdExpr = void 0;
4
+ const tickets_constants_1 = require("./tickets.constants");
5
+ const tickets_getters_1 = require("./tickets.getters");
6
+ const effectiveSubjectIdExpr = {
7
+ $ifNull: [
8
+ "$externalCallFields.event_subject_id",
9
+ {
10
+ $ifNull: [
11
+ "$externalCallFields.event_sub_subject_id",
12
+ "$externalCallFields.event_sub_subject_id2",
13
+ ],
14
+ },
15
+ ],
16
+ };
17
+ const departmentsSubjectsLookup = (cityName) => ({
18
+ $lookup: {
19
+ from: "departmentsSubjects",
20
+ let: { sid: "$effectiveSubjectId", c: cityName },
21
+ pipeline: [
22
+ {
23
+ $match: {
24
+ $expr: {
25
+ $and: [
26
+ { $eq: ["$cityName", "$$c"] },
27
+ {
28
+ $or: [
29
+ { $eq: ["$subject_id", { $ifNull: ["$$sid", ""] }] },
30
+ { $eq: ["$sub_subject_id", { $ifNull: ["$$sid", ""] }] },
31
+ { $eq: ["$sub_subject_id2", { $ifNull: ["$$sid", ""] }] },
32
+ ],
33
+ },
34
+ ],
35
+ },
36
+ },
37
+ },
38
+ { $limit: 1 },
39
+ ],
40
+ as: "subj",
41
+ },
42
+ });
43
+ const subjectLabelExpr = {
44
+ $cond: {
45
+ if: { $gt: [{ $size: "$subj" }, 0] },
46
+ then: {
47
+ $ifNull: [{ $arrayElemAt: ["$subj.subjectName", 0] }, tickets_constants_1.UNCLASSIFIED],
48
+ },
49
+ else: tickets_constants_1.UNCLASSIFIED,
50
+ },
51
+ };
52
+ const ticketDateMatch = (dateRange) => ({
53
+ createdAt: { $gte: dateRange.from, $lte: dateRange.to },
54
+ });
55
+ exports.isDraftSubjectIdExpr = {
56
+ $or: [
57
+ { $eq: [{ $type: "$externalCallFields.event_subject_id" }, "missing"] },
58
+ { $eq: ["$externalCallFields.event_subject_id", null] },
59
+ {
60
+ $regexMatch: {
61
+ input: { $ifNull: ["$externalCallFields.event_subject_id", ""] },
62
+ regex: /^\s*$/,
63
+ },
64
+ },
65
+ ],
66
+ };
67
+ const ticketsWithCallSidMatch = (cityName, dateRange) => ({
68
+ cityName,
69
+ callSid: { $exists: true, $nin: [null, ""] },
70
+ ...ticketDateMatch(dateRange),
71
+ });
72
+ exports.ticketsWithCallSidMatch = ticketsWithCallSidMatch;
73
+ const ticketsByCallSidsMatch = (cityName, callSids, dateRange) => ({
74
+ cityName,
75
+ callSid: { $in: callSids },
76
+ ...(dateRange ? ticketDateMatch(dateRange) : {}),
77
+ });
78
+ exports.ticketsByCallSidsMatch = ticketsByCallSidsMatch;
79
+ const subjectGroupStages = (cityName, limit) => {
80
+ const shouldLimit = typeof limit === "number" && limit > 0;
81
+ return [
82
+ { $addFields: { effectiveSubjectId: effectiveSubjectIdExpr } },
83
+ departmentsSubjectsLookup(cityName),
84
+ { $addFields: { subject: subjectLabelExpr } },
85
+ { $group: { _id: "$subject", count: { $sum: 1 } } },
86
+ { $sort: { count: -1 } },
87
+ ...(shouldLimit ? [{ $limit: limit }] : []),
88
+ ];
89
+ };
90
+ exports.subjectGroupStages = subjectGroupStages;
91
+ const runTicketStatsAggregate = async (pipeline) => {
92
+ const rows = await (0, tickets_getters_1.getTicketsCollection)()
93
+ .aggregate(pipeline, { maxTimeMS: tickets_constants_1.STATS_MAX_TIME_MS })
94
+ .toArray();
95
+ return rows;
96
+ };
97
+ exports.runTicketStatsAggregate = runTicketStatsAggregate;
98
+ //# sourceMappingURL=tickets.statistics.aggregation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tickets.statistics.aggregation.js","sourceRoot":"","sources":["../../../src/municipal/tickets/tickets.statistics.aggregation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,40 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tickets.statistics.dates.js","sourceRoot":"","sources":["../../../src/municipal/tickets/tickets.statistics.dates.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { CityName } from "../utils/types";
2
+ import type { SubjectItem, TicketStatsDateRange, TicketStatsDateScope } from "./tickets.types";
3
+ export declare const resolveTicketStatsDateRange: (dateScope?: TicketStatsDateScope) => TicketStatsDateRange;
4
+ export declare const ticketStatsDateScopeFromYmd: (startStr: string, endStr: string, timezone: string) => TicketStatsDateScope;
5
+ export declare const findCallSidsWithTicketsByCity: (cityName: CityName, dateScope?: TicketStatsDateScope) => Promise<string[]>;
6
+ export declare const findCallSidsWithDraftTicketsByCity: (cityName: CityName, dateScope?: TicketStatsDateScope) => Promise<string[]>;
7
+ export declare const findSubjectsByCityAndDateRange: (cityName: CityName, dateScope?: TicketStatsDateScope, limit?: number) => Promise<SubjectItem[]>;
8
+ export declare const findSubjectsByCallSids: (cityName: CityName, callSids: string[], limit?: number, dateScope?: TicketStatsDateScope) => Promise<SubjectItem[]>;
9
+ //# sourceMappingURL=tickets.statistics.getters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tickets.statistics.getters.d.ts","sourceRoot":"","sources":["../../../src/municipal/tickets/tickets.statistics.getters.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAc1C,OAAO,KAAK,EACV,WAAW,EACX,oBAAoB,EACpB,oBAAoB,EACrB,MAAM,iBAAiB,CAAC;AAEzB,eAAO,MAAM,2BAA2B,GACtC,YAAY,oBAAoB,KAC/B,oBAKF,CAAC;AAEF,eAAO,MAAM,2BAA2B,GACtC,UAAU,MAAM,EAChB,QAAQ,MAAM,EACd,UAAU,MAAM,KACf,oBAGD,CAAC;AAEH,eAAO,MAAM,6BAA6B,GACxC,UAAU,QAAQ,EAClB,YAAY,oBAAoB,KAC/B,OAAO,CAAC,MAAM,EAAE,CAMlB,CAAC;AAEF,eAAO,MAAM,kCAAkC,GAC7C,UAAU,QAAQ,EAClB,YAAY,oBAAoB,KAC/B,OAAO,CAAC,MAAM,EAAE,CAOlB,CAAC;AAEF,eAAO,MAAM,8BAA8B,GACzC,UAAU,QAAQ,EAClB,YAAY,oBAAoB,EAChC,QAAQ,MAAM,KACb,OAAO,CAAC,WAAW,EAAE,CAMvB,CAAC;AAEF,eAAO,MAAM,sBAAsB,GACjC,UAAU,QAAQ,EAClB,UAAU,MAAM,EAAE,EAClB,QAAQ,MAAM,EACd,YAAY,oBAAoB,KAC/B,OAAO,CAAC,WAAW,EAAE,CAcvB,CAAC"}
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.findSubjectsByCallSids = exports.findSubjectsByCityAndDateRange = exports.findCallSidsWithDraftTicketsByCity = exports.findCallSidsWithTicketsByCity = exports.ticketStatsDateScopeFromYmd = exports.resolveTicketStatsDateRange = void 0;
4
+ const date_utils_1 = require("../../utils/date.utils");
5
+ const tickets_constants_1 = require("./tickets.constants");
6
+ const tickets_statistics_aggregation_1 = require("./tickets.statistics.aggregation");
7
+ const resolveTicketStatsDateRange = (dateScope) => {
8
+ const to = dateScope?.to ?? new Date();
9
+ const from = dateScope?.from ?? new Date(to.getTime() - tickets_constants_1.DEFAULT_LOOKBACK_DAYS * date_utils_1.DAY_MS);
10
+ return { from, to };
11
+ };
12
+ exports.resolveTicketStatsDateRange = resolveTicketStatsDateRange;
13
+ const ticketStatsDateScopeFromYmd = (startStr, endStr, timezone) => ({
14
+ from: (0, date_utils_1.startOfCalendarDayInTz)(startStr, timezone),
15
+ to: (0, date_utils_1.endOfCalendarDayInTz)(endStr, timezone),
16
+ });
17
+ exports.ticketStatsDateScopeFromYmd = ticketStatsDateScopeFromYmd;
18
+ const findCallSidsWithTicketsByCity = async (cityName, dateScope) => {
19
+ const rows = await (0, tickets_statistics_aggregation_1.runTicketStatsAggregate)([
20
+ { $match: (0, tickets_statistics_aggregation_1.ticketsWithCallSidMatch)(cityName, (0, exports.resolveTicketStatsDateRange)(dateScope)) },
21
+ { $group: { _id: "$callSid" } },
22
+ ]);
23
+ return rows.map((r) => String(r._id)).filter(Boolean);
24
+ };
25
+ exports.findCallSidsWithTicketsByCity = findCallSidsWithTicketsByCity;
26
+ const findCallSidsWithDraftTicketsByCity = async (cityName, dateScope) => {
27
+ const rows = await (0, tickets_statistics_aggregation_1.runTicketStatsAggregate)([
28
+ { $match: (0, tickets_statistics_aggregation_1.ticketsWithCallSidMatch)(cityName, (0, exports.resolveTicketStatsDateRange)(dateScope)) },
29
+ { $match: { $expr: tickets_statistics_aggregation_1.isDraftSubjectIdExpr } },
30
+ { $group: { _id: "$callSid" } },
31
+ ]);
32
+ return rows.map((r) => String(r._id)).filter(Boolean);
33
+ };
34
+ exports.findCallSidsWithDraftTicketsByCity = findCallSidsWithDraftTicketsByCity;
35
+ const findSubjectsByCityAndDateRange = async (cityName, dateScope, limit) => {
36
+ const rows = await (0, tickets_statistics_aggregation_1.runTicketStatsAggregate)([
37
+ { $match: (0, tickets_statistics_aggregation_1.ticketsWithCallSidMatch)(cityName, (0, exports.resolveTicketStatsDateRange)(dateScope)) },
38
+ ...(0, tickets_statistics_aggregation_1.subjectGroupStages)(cityName, limit),
39
+ ]);
40
+ return rows.map((r) => ({ subject: String(r._id), count: r.count }));
41
+ };
42
+ exports.findSubjectsByCityAndDateRange = findSubjectsByCityAndDateRange;
43
+ const findSubjectsByCallSids = async (cityName, callSids, limit, dateScope) => {
44
+ if (!callSids.length)
45
+ return [];
46
+ const rows = await (0, tickets_statistics_aggregation_1.runTicketStatsAggregate)([
47
+ {
48
+ $match: (0, tickets_statistics_aggregation_1.ticketsByCallSidsMatch)(cityName, callSids, dateScope ? (0, exports.resolveTicketStatsDateRange)(dateScope) : undefined),
49
+ },
50
+ ...(0, tickets_statistics_aggregation_1.subjectGroupStages)(cityName, limit),
51
+ ]);
52
+ return rows.map((r) => ({ subject: String(r._id), count: r.count }));
53
+ };
54
+ exports.findSubjectsByCallSids = findSubjectsByCallSids;
55
+ //# sourceMappingURL=tickets.statistics.getters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tickets.statistics.getters.js","sourceRoot":"","sources":["../../../src/municipal/tickets/tickets.statistics.getters.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,112 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tickets.statistics.pipeline.js","sourceRoot":"","sources":["../../../src/municipal/tickets/tickets.statistics.pipeline.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
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