@talkpilot/core-db 1.3.38 → 1.3.39

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 (233) hide show
  1. package/.cursor/rules/development.mdc +65 -65
  2. package/DEVELOPMENT.md +141 -141
  3. package/README.md +721 -721
  4. package/dist/talkpilot/clientsConfig/clientsConfig.constants.d.ts +3 -0
  5. package/dist/talkpilot/clientsConfig/clientsConfig.constants.d.ts.map +1 -0
  6. package/dist/talkpilot/clientsConfig/clientsConfig.constants.js +6 -0
  7. package/dist/talkpilot/clientsConfig/clientsConfig.constants.js.map +1 -0
  8. package/dist/talkpilot/clientsConfig/clientsConfig.getters.d.ts +39 -0
  9. package/dist/talkpilot/clientsConfig/clientsConfig.getters.d.ts.map +1 -1
  10. package/dist/talkpilot/clientsConfig/clientsConfig.getters.js +92 -1
  11. package/dist/talkpilot/clientsConfig/clientsConfig.getters.js.map +1 -1
  12. package/dist/talkpilot/clientsConfig/clientsConfig.types.d.ts +4 -0
  13. package/dist/talkpilot/clientsConfig/clientsConfig.types.d.ts.map +1 -1
  14. package/dist/talkpilot/clientsConfig/index.d.ts +1 -0
  15. package/dist/talkpilot/clientsConfig/index.d.ts.map +1 -1
  16. package/dist/talkpilot/clientsConfig/index.js +1 -0
  17. package/dist/talkpilot/clientsConfig/index.js.map +1 -1
  18. package/jest.config.js +20 -20
  19. package/package.json +46 -46
  20. package/src/__tests__/setup.ts +20 -20
  21. package/src/bulkWrite/__tests__/bulkWrite.spec.ts +65 -65
  22. package/src/bulkWrite/bulkWrite.ops.ts +45 -45
  23. package/src/bulkWrite/bulkWrite.types.ts +4 -4
  24. package/src/bulkWrite/index.ts +2 -2
  25. package/src/config.ts +9 -9
  26. package/src/configuration/index.ts +17 -17
  27. package/src/configuration/internalModels/index.ts +3 -3
  28. package/src/configuration/internalModels/internalModels.constants.ts +1 -1
  29. package/src/configuration/internalModels/internalModels.getters.ts +33 -33
  30. package/src/configuration/internalModels/internalModels.types.ts +12 -12
  31. package/src/configuration/models/index.ts +25 -25
  32. package/src/configuration/models/models.constants.ts +13 -13
  33. package/src/configuration/models/models.getters.ts +53 -53
  34. package/src/configuration/models/models.types.ts +79 -79
  35. package/src/configuration/mongodb-client.ts +62 -62
  36. package/src/configuration/prompts/index.ts +2 -2
  37. package/src/configuration/prompts/prompts.getters.ts +49 -49
  38. package/src/configuration/prompts/prompts.types.ts +11 -11
  39. package/src/connection.ts +81 -81
  40. package/src/index.ts +42 -42
  41. package/src/municipal/__tests__/validation.spec.ts +62 -62
  42. package/src/municipal/cities/cities.getters.ts +50 -50
  43. package/src/municipal/cities/cities.types.ts +11 -11
  44. package/src/municipal/cities/index.ts +2 -2
  45. package/src/municipal/departmentsSubjects/__tests__/departmentsSubjects.spec.ts +272 -272
  46. package/src/municipal/departmentsSubjects/departmentsSubjects.getters.ts +317 -317
  47. package/src/municipal/departmentsSubjects/departmentsSubjects.types.ts +73 -73
  48. package/src/municipal/departmentsSubjects/index.ts +9 -9
  49. package/src/municipal/index.ts +22 -22
  50. package/src/municipal/mongodb-client.ts +61 -61
  51. package/src/municipal/muniIssues/__tests__/muniIssues.setters.spec.ts +94 -94
  52. package/src/municipal/muniIssues/__tests__/muniIssues.setup.spec.ts +92 -92
  53. package/src/municipal/muniIssues/index.ts +17 -17
  54. package/src/municipal/muniIssues/muniIssues.constants.ts +18 -18
  55. package/src/municipal/muniIssues/muniIssues.getters.ts +24 -24
  56. package/src/municipal/muniIssues/muniIssues.schema.ts +66 -66
  57. package/src/municipal/muniIssues/muniIssues.setters.ts +24 -24
  58. package/src/municipal/muniIssues/muniIssues.setup.ts +65 -65
  59. package/src/municipal/muniIssues/muniIssues.types.ts +37 -37
  60. package/src/municipal/streets/__tests__/streets.spec.ts +253 -253
  61. package/src/municipal/streets/index.ts +2 -2
  62. package/src/municipal/streets/streets.getters.ts +140 -140
  63. package/src/municipal/streets/streets.types.ts +19 -19
  64. package/src/municipal/systemInstructions/__tests__/getters.spec.ts +113 -113
  65. package/src/municipal/systemInstructions/__tests__/setters.spec.ts +274 -274
  66. package/src/municipal/systemInstructions/index.ts +7 -7
  67. package/src/municipal/systemInstructions/instructions.getters.ts +57 -57
  68. package/src/municipal/systemInstructions/instructions.setters.ts +119 -119
  69. package/src/municipal/systemInstructions/instructions.types.ts +30 -30
  70. package/src/municipal/tickets/__tests__/tickets.getters.spec.ts +30 -30
  71. package/src/municipal/tickets/__tests__/tickets.statistics.spec.ts +99 -99
  72. package/src/municipal/tickets/index.ts +9 -9
  73. package/src/municipal/tickets/tickets.constants.ts +8 -8
  74. package/src/municipal/tickets/tickets.getters.ts +121 -121
  75. package/src/municipal/tickets/tickets.statistics.aggregation.ts +110 -110
  76. package/src/municipal/tickets/tickets.statistics.getters.ts +145 -145
  77. package/src/municipal/tickets/tickets.types.ts +54 -54
  78. package/src/municipal/utils/types.ts +11 -11
  79. package/src/talkpilot/__tests__/db.spec.ts +38 -38
  80. package/src/talkpilot/__tests__/mongodb-client.spec.ts +18 -18
  81. package/src/talkpilot/__tests__/validation.spec.ts +68 -68
  82. package/src/talkpilot/agents/__tests__/agents.getters.spec.ts +29 -29
  83. package/src/talkpilot/agents/agents.getters.ts +34 -34
  84. package/src/talkpilot/agents/agents.types.ts +14 -14
  85. package/src/talkpilot/agents/index.ts +2 -2
  86. package/src/talkpilot/backgroundToolResults/__tests__/backgroundToolResults.getters.spec.ts +147 -147
  87. package/src/talkpilot/backgroundToolResults/backgroundToolResults.getters.ts +65 -65
  88. package/src/talkpilot/backgroundToolResults/backgroundToolResults.types.ts +23 -23
  89. package/src/talkpilot/backgroundToolResults/index.ts +2 -2
  90. package/src/talkpilot/calls/__tests__/callStats.utils.spec.ts +128 -128
  91. package/src/talkpilot/calls/__tests__/calls.dashboard.spec.ts +229 -229
  92. package/src/talkpilot/calls/__tests__/calls.spec.ts +471 -471
  93. package/src/talkpilot/calls/__tests__/calls.statistics.spec.ts +483 -483
  94. package/src/talkpilot/calls/calls.constants.ts +49 -49
  95. package/src/talkpilot/calls/calls.getters.ts +277 -277
  96. package/src/talkpilot/calls/calls.statistics.getters.ts +668 -668
  97. package/src/talkpilot/calls/calls.statistics.types.ts +48 -48
  98. package/src/talkpilot/calls/calls.types.ts +134 -134
  99. package/src/talkpilot/calls/dashboard/calls.dashboard.ts +295 -295
  100. package/src/talkpilot/calls/dashboard/calls.dashboard.types.ts +57 -57
  101. package/src/talkpilot/calls/index.ts +6 -6
  102. package/src/talkpilot/clientAudioBuffers/__tests__/clientAudioBuffer.getters.spec.ts +160 -160
  103. package/src/talkpilot/clientAudioBuffers/clientAudioBuffer.getters.ts +117 -117
  104. package/src/talkpilot/clientAudioBuffers/clientsAudioBuffers.types.ts +25 -25
  105. package/src/talkpilot/clientAudioBuffers/index.ts +2 -2
  106. package/src/talkpilot/clients/__tests__/clients.quota.spec.ts +123 -123
  107. package/src/talkpilot/clients/clients.getters.ts +16 -16
  108. package/src/talkpilot/clients/clients.quota.getters.ts +119 -119
  109. package/src/talkpilot/clients/clients.quota.types.ts +27 -27
  110. package/src/talkpilot/clients/clients.types.ts +18 -18
  111. package/src/talkpilot/clients/index.ts +4 -4
  112. package/src/talkpilot/clientsConfig/__tests__/clientsConfig.getters.spec.ts +318 -0
  113. package/src/talkpilot/clientsConfig/__tests__/clientsConfig.spec.ts +212 -212
  114. package/src/talkpilot/clientsConfig/clientsConfig.constants.ts +2 -0
  115. package/src/talkpilot/clientsConfig/clientsConfig.getters.ts +116 -2
  116. package/src/talkpilot/clientsConfig/clientsConfig.types.ts +4 -0
  117. package/src/talkpilot/clientsConfig/index.ts +3 -2
  118. package/src/talkpilot/contextNotes/__tests__/contextNotes.getters.spec.ts +217 -217
  119. package/src/talkpilot/contextNotes/contextNotes.getters.ts +85 -85
  120. package/src/talkpilot/contextNotes/contextNotes.types.ts +20 -20
  121. package/src/talkpilot/contextNotes/index.ts +2 -2
  122. package/src/talkpilot/flows/__tests__/flows.schema.spec.ts +99 -99
  123. package/src/talkpilot/flows/flows.getter.ts +14 -14
  124. package/src/talkpilot/flows/flows.schema.ts +155 -155
  125. package/src/talkpilot/flows/flows.types.ts +189 -189
  126. package/src/talkpilot/flows/index.ts +2 -2
  127. package/src/talkpilot/groups/__tests__/groups.spec.ts +90 -90
  128. package/src/talkpilot/groups/__tests__/phone.utils.spec.ts +32 -32
  129. package/src/talkpilot/groups/groups.getters.ts +30 -30
  130. package/src/talkpilot/groups/groups.types.ts +29 -29
  131. package/src/talkpilot/groups/index.ts +3 -3
  132. package/src/talkpilot/groups/phone.utils.ts +46 -46
  133. package/src/talkpilot/index.ts +31 -31
  134. package/src/talkpilot/leads/index.ts +2 -2
  135. package/src/talkpilot/leads/leads.getter.ts +6 -6
  136. package/src/talkpilot/leads/leads.schema.ts +33 -33
  137. package/src/talkpilot/leads/leads.types.ts +20 -20
  138. package/src/talkpilot/mongodb-client.ts +78 -78
  139. package/src/talkpilot/phone_numbers/__tests__/phone_numbers.spec.ts +282 -282
  140. package/src/talkpilot/phone_numbers/index.ts +2 -2
  141. package/src/talkpilot/phone_numbers/phone_numbers.getter.ts +176 -176
  142. package/src/talkpilot/phone_numbers/phone_numbers.schema.ts +17 -17
  143. package/src/talkpilot/phone_numbers/phone_numbers.types.ts +30 -30
  144. package/src/talkpilot/plans/__tests__/plans.spec.ts +70 -70
  145. package/src/talkpilot/plans/index.ts +2 -2
  146. package/src/talkpilot/plans/plans.getters.ts +132 -132
  147. package/src/talkpilot/plans/plans.types.ts +89 -89
  148. package/src/talkpilot/products/__tests__/products.getters.spec.ts +44 -44
  149. package/src/talkpilot/products/index.ts +2 -2
  150. package/src/talkpilot/products/products.getters.ts +12 -12
  151. package/src/talkpilot/products/products.types.ts +9 -9
  152. package/src/talkpilot/results/index.ts +7 -7
  153. package/src/talkpilot/results/results.getter.ts +39 -39
  154. package/src/talkpilot/results/results.schema.ts +25 -25
  155. package/src/talkpilot/results/results.types.ts +34 -34
  156. package/src/talkpilot/retry_analyze/__tests__/retryAnalyze.getters.spec.ts +156 -156
  157. package/src/talkpilot/retry_analyze/index.ts +2 -2
  158. package/src/talkpilot/retry_analyze/retryAnalyze.getters.ts +84 -84
  159. package/src/talkpilot/retry_analyze/retryAnalyze.types.ts +13 -13
  160. package/src/talkpilot/sessions/__tests__/sessions.spec.ts +147 -147
  161. package/src/talkpilot/sessions/index.ts +2 -2
  162. package/src/talkpilot/sessions/sessions.getter.ts +92 -92
  163. package/src/talkpilot/sessions/sessions.schema.ts +34 -34
  164. package/src/talkpilot/sessions/sessions.types.ts +30 -30
  165. package/src/talkpilot/subscriptions/__tests__/subscriptions.getters.utils.spec.ts +45 -45
  166. package/src/talkpilot/subscriptions/index.ts +3 -3
  167. package/src/talkpilot/subscriptions/subscriptions.getters.ts +146 -146
  168. package/src/talkpilot/subscriptions/subscriptions.getters.utils.ts +33 -33
  169. package/src/talkpilot/subscriptions/subscriptions.types.ts +66 -66
  170. package/src/talkpilot/utils/__tests__/query.utils.spec.ts +49 -49
  171. package/src/talkpilot/utils/query.utils.ts +21 -21
  172. package/src/test-utils/db-utils.ts +33 -33
  173. package/src/test-utils/factories/index.ts +16 -16
  174. package/src/test-utils/factories/municipal/cities.ts +16 -16
  175. package/src/test-utils/factories/municipal/departmentsSubjects.ts +37 -37
  176. package/src/test-utils/factories/municipal/muniIssues.ts +32 -32
  177. package/src/test-utils/factories/municipal/streets.ts +22 -22
  178. package/src/test-utils/factories/municipal/tickets.ts +39 -39
  179. package/src/test-utils/factories/talkpilot/agents.ts +19 -19
  180. package/src/test-utils/factories/talkpilot/calls.ts +37 -37
  181. package/src/test-utils/factories/talkpilot/clientAudioBuffers.ts +20 -20
  182. package/src/test-utils/factories/talkpilot/clientsConfig.ts +18 -18
  183. package/src/test-utils/factories/talkpilot/contextNotes.ts +40 -40
  184. package/src/test-utils/factories/talkpilot/flows.ts +33 -33
  185. package/src/test-utils/factories/talkpilot/groups.ts +33 -33
  186. package/src/test-utils/factories/talkpilot/phone_numbers.ts +22 -22
  187. package/src/test-utils/factories/talkpilot/sessions.ts +35 -35
  188. package/src/test-utils/factories/websitalk/scans.ts +24 -24
  189. package/src/test-utils/factories/websitalk/websiteUrls.ts +17 -17
  190. package/src/utils/date.utils.ts +126 -126
  191. package/src/utils/shared.types.ts +4 -4
  192. package/src/utils/validation.ts +23 -23
  193. package/src/websitalk/index.ts +16 -16
  194. package/src/websitalk/mongodb-client.ts +61 -61
  195. package/src/websitalk/scans/__tests__/scans.spec.ts +313 -313
  196. package/src/websitalk/scans/index.ts +4 -4
  197. package/src/websitalk/scans/scans.constants.ts +15 -15
  198. package/src/websitalk/scans/scans.getters.ts +160 -160
  199. package/src/websitalk/scans/scans.types.ts +45 -45
  200. package/src/websitalk/scans/scans.utils.ts +5 -5
  201. package/src/websitalk/websiteUrls/__tests__/websiteUrls.spec.ts +77 -77
  202. package/src/websitalk/websiteUrls/index.ts +2 -2
  203. package/src/websitalk/websiteUrls/websiteUrls.getters.ts +65 -65
  204. package/src/websitalk/websiteUrls/websiteUrls.types.ts +13 -13
  205. package/tsconfig.json +23 -23
  206. package/dist/municipal/departmentsSubjects/departmentsSubjects.setters.d.ts +0 -10
  207. package/dist/municipal/departmentsSubjects/departmentsSubjects.setters.d.ts.map +0 -1
  208. package/dist/municipal/departmentsSubjects/departmentsSubjects.setters.js +0 -15
  209. package/dist/municipal/departmentsSubjects/departmentsSubjects.setters.js.map +0 -1
  210. package/dist/municipal/streets/streets.setters.d.ts +0 -10
  211. package/dist/municipal/streets/streets.setters.d.ts.map +0 -1
  212. package/dist/municipal/streets/streets.setters.js +0 -15
  213. package/dist/municipal/streets/streets.setters.js.map +0 -1
  214. package/dist/reconcile/index.d.ts +0 -5
  215. package/dist/reconcile/index.d.ts.map +0 -1
  216. package/dist/reconcile/index.js +0 -21
  217. package/dist/reconcile/index.js.map +0 -1
  218. package/dist/reconcile/reconcile.diff.d.ts +0 -4
  219. package/dist/reconcile/reconcile.diff.d.ts.map +0 -1
  220. package/dist/reconcile/reconcile.diff.js +0 -36
  221. package/dist/reconcile/reconcile.diff.js.map +0 -1
  222. package/dist/reconcile/reconcile.execute.d.ts +0 -7
  223. package/dist/reconcile/reconcile.execute.d.ts.map +0 -1
  224. package/dist/reconcile/reconcile.execute.js +0 -20
  225. package/dist/reconcile/reconcile.execute.js.map +0 -1
  226. package/dist/reconcile/reconcile.ops.d.ts +0 -12
  227. package/dist/reconcile/reconcile.ops.d.ts.map +0 -1
  228. package/dist/reconcile/reconcile.ops.js +0 -24
  229. package/dist/reconcile/reconcile.ops.js.map +0 -1
  230. package/dist/reconcile/reconcile.types.d.ts +0 -32
  231. package/dist/reconcile/reconcile.types.d.ts.map +0 -1
  232. package/dist/reconcile/reconcile.types.js +0 -3
  233. package/dist/reconcile/reconcile.types.js.map +0 -1
@@ -1,128 +1,128 @@
1
- import {
2
- addDays,
3
- countCallsByPhoneInRange,
4
- range,
5
- startOfDay,
6
- getCallsCollection,
7
- } from "../calls.getters";
8
- import {
9
- createIncomingCallDoc,
10
- createOutGoingCallDoc,
11
- } from "../../../test-utils/factories";
12
-
13
- describe("callStats.utils", () => {
14
- describe("countCallsByPhoneInRange", () => {
15
- it("counts outgoing calls for a phone within a date range", async () => {
16
- const phone = "+972500000001";
17
- const baseDate = new Date("2023-01-10T10:00:00Z");
18
-
19
- const outgoingInside = createOutGoingCallDoc({
20
- customerPhoneNumber: phone,
21
- createdAt: addDays(baseDate, 0),
22
- });
23
- const outgoingOutsideBefore = createOutGoingCallDoc({
24
- customerPhoneNumber: phone,
25
- createdAt: addDays(baseDate, -2),
26
- });
27
- const outgoingOutsideAfter = createOutGoingCallDoc({
28
- customerPhoneNumber: phone,
29
- createdAt: addDays(baseDate, 2),
30
- });
31
-
32
- await getCallsCollection().insertMany([
33
- { ...outgoingInside, updatedAt: outgoingInside.createdAt, env: "test" },
34
- {
35
- ...outgoingOutsideBefore,
36
- updatedAt: outgoingOutsideBefore.createdAt,
37
- env: "test",
38
- },
39
- {
40
- ...outgoingOutsideAfter,
41
- updatedAt: outgoingOutsideAfter.createdAt,
42
- env: "test",
43
- },
44
- ]);
45
-
46
- const since = addDays(baseDate, -1);
47
- const until = addDays(baseDate, 1);
48
-
49
- const count = await countCallsByPhoneInRange(
50
- phone,
51
- { isOutgoingCall: true },
52
- { since, until },
53
- );
54
-
55
- expect(count).toBe(1);
56
- });
57
-
58
- it("filters by incoming/outgoing flags", async () => {
59
- const phone = "+972500000002";
60
- const createdAt = new Date("2023-02-01T12:00:00Z");
61
-
62
- const outgoing = createOutGoingCallDoc({
63
- customerPhoneNumber: phone,
64
- createdAt,
65
- });
66
- const incoming = createIncomingCallDoc({
67
- customerPhoneNumber: phone,
68
- createdAt,
69
- });
70
-
71
- await getCallsCollection().insertMany([
72
- { ...outgoing, updatedAt: outgoing.createdAt, env: "test" },
73
- { ...incoming, updatedAt: incoming.createdAt, env: "test" },
74
- ]);
75
-
76
- const outgoingCount = await countCallsByPhoneInRange(
77
- phone,
78
- { isOutgoingCall: true },
79
- range.between(addDays(createdAt, -1), addDays(createdAt, 1)),
80
- );
81
- const incomingCount = await countCallsByPhoneInRange(
82
- phone,
83
- { isIncomingCall: true },
84
- range.between(addDays(createdAt, -1), addDays(createdAt, 1)),
85
- );
86
-
87
- expect(outgoingCount).toBe(1);
88
- expect(incomingCount).toBe(1);
89
- });
90
- });
91
-
92
- describe("date helpers", () => {
93
- it("startOfDay normalizes to midnight", () => {
94
- const d = new Date("2023-03-10T15:30:45.000Z");
95
- const s = startOfDay(d);
96
- expect(s.getUTCHours()).toBe(0);
97
- expect(s.getUTCMinutes()).toBe(0);
98
- expect(s.getUTCSeconds()).toBe(0);
99
- expect(s.getUTCMilliseconds()).toBe(0);
100
- });
101
-
102
- it("addDays shifts the date by given days", () => {
103
- const d = new Date("2023-03-10T00:00:00.000Z");
104
- expect(addDays(d, 1).getUTCDate()).toBe(11);
105
- expect(addDays(d, -1).getUTCDate()).toBe(9);
106
- });
107
-
108
- it("range helpers produce expected bounds", () => {
109
- const base = new Date("2023-03-15T10:00:00.000Z");
110
-
111
- const betweenRange = range.between(addDays(base, -1), addDays(base, 1));
112
- expect(betweenRange.since).toEqual(addDays(base, -1));
113
- expect(betweenRange.until).toEqual(addDays(base, 1));
114
-
115
- const yesterdayRange = range.yesterday();
116
- expect(yesterdayRange.since).toBeInstanceOf(Date);
117
- expect(yesterdayRange.until).toBeInstanceOf(Date);
118
-
119
- const todayFullRange = range.todayFull();
120
- expect(todayFullRange.since).toBeInstanceOf(Date);
121
- expect(todayFullRange.until).toBeInstanceOf(Date);
122
-
123
- const startToNowRange = range.startOfDayToNow(base);
124
- expect(startToNowRange.since).toEqual(startOfDay(base));
125
- expect(startToNowRange.until).toBeInstanceOf(Date);
126
- });
127
- });
128
- });
1
+ import {
2
+ addDays,
3
+ countCallsByPhoneInRange,
4
+ range,
5
+ startOfDay,
6
+ getCallsCollection,
7
+ } from "../calls.getters";
8
+ import {
9
+ createIncomingCallDoc,
10
+ createOutGoingCallDoc,
11
+ } from "../../../test-utils/factories";
12
+
13
+ describe("callStats.utils", () => {
14
+ describe("countCallsByPhoneInRange", () => {
15
+ it("counts outgoing calls for a phone within a date range", async () => {
16
+ const phone = "+972500000001";
17
+ const baseDate = new Date("2023-01-10T10:00:00Z");
18
+
19
+ const outgoingInside = createOutGoingCallDoc({
20
+ customerPhoneNumber: phone,
21
+ createdAt: addDays(baseDate, 0),
22
+ });
23
+ const outgoingOutsideBefore = createOutGoingCallDoc({
24
+ customerPhoneNumber: phone,
25
+ createdAt: addDays(baseDate, -2),
26
+ });
27
+ const outgoingOutsideAfter = createOutGoingCallDoc({
28
+ customerPhoneNumber: phone,
29
+ createdAt: addDays(baseDate, 2),
30
+ });
31
+
32
+ await getCallsCollection().insertMany([
33
+ { ...outgoingInside, updatedAt: outgoingInside.createdAt, env: "test" },
34
+ {
35
+ ...outgoingOutsideBefore,
36
+ updatedAt: outgoingOutsideBefore.createdAt,
37
+ env: "test",
38
+ },
39
+ {
40
+ ...outgoingOutsideAfter,
41
+ updatedAt: outgoingOutsideAfter.createdAt,
42
+ env: "test",
43
+ },
44
+ ]);
45
+
46
+ const since = addDays(baseDate, -1);
47
+ const until = addDays(baseDate, 1);
48
+
49
+ const count = await countCallsByPhoneInRange(
50
+ phone,
51
+ { isOutgoingCall: true },
52
+ { since, until },
53
+ );
54
+
55
+ expect(count).toBe(1);
56
+ });
57
+
58
+ it("filters by incoming/outgoing flags", async () => {
59
+ const phone = "+972500000002";
60
+ const createdAt = new Date("2023-02-01T12:00:00Z");
61
+
62
+ const outgoing = createOutGoingCallDoc({
63
+ customerPhoneNumber: phone,
64
+ createdAt,
65
+ });
66
+ const incoming = createIncomingCallDoc({
67
+ customerPhoneNumber: phone,
68
+ createdAt,
69
+ });
70
+
71
+ await getCallsCollection().insertMany([
72
+ { ...outgoing, updatedAt: outgoing.createdAt, env: "test" },
73
+ { ...incoming, updatedAt: incoming.createdAt, env: "test" },
74
+ ]);
75
+
76
+ const outgoingCount = await countCallsByPhoneInRange(
77
+ phone,
78
+ { isOutgoingCall: true },
79
+ range.between(addDays(createdAt, -1), addDays(createdAt, 1)),
80
+ );
81
+ const incomingCount = await countCallsByPhoneInRange(
82
+ phone,
83
+ { isIncomingCall: true },
84
+ range.between(addDays(createdAt, -1), addDays(createdAt, 1)),
85
+ );
86
+
87
+ expect(outgoingCount).toBe(1);
88
+ expect(incomingCount).toBe(1);
89
+ });
90
+ });
91
+
92
+ describe("date helpers", () => {
93
+ it("startOfDay normalizes to midnight", () => {
94
+ const d = new Date("2023-03-10T15:30:45.000Z");
95
+ const s = startOfDay(d);
96
+ expect(s.getUTCHours()).toBe(0);
97
+ expect(s.getUTCMinutes()).toBe(0);
98
+ expect(s.getUTCSeconds()).toBe(0);
99
+ expect(s.getUTCMilliseconds()).toBe(0);
100
+ });
101
+
102
+ it("addDays shifts the date by given days", () => {
103
+ const d = new Date("2023-03-10T00:00:00.000Z");
104
+ expect(addDays(d, 1).getUTCDate()).toBe(11);
105
+ expect(addDays(d, -1).getUTCDate()).toBe(9);
106
+ });
107
+
108
+ it("range helpers produce expected bounds", () => {
109
+ const base = new Date("2023-03-15T10:00:00.000Z");
110
+
111
+ const betweenRange = range.between(addDays(base, -1), addDays(base, 1));
112
+ expect(betweenRange.since).toEqual(addDays(base, -1));
113
+ expect(betweenRange.until).toEqual(addDays(base, 1));
114
+
115
+ const yesterdayRange = range.yesterday();
116
+ expect(yesterdayRange.since).toBeInstanceOf(Date);
117
+ expect(yesterdayRange.until).toBeInstanceOf(Date);
118
+
119
+ const todayFullRange = range.todayFull();
120
+ expect(todayFullRange.since).toBeInstanceOf(Date);
121
+ expect(todayFullRange.until).toBeInstanceOf(Date);
122
+
123
+ const startToNowRange = range.startOfDayToNow(base);
124
+ expect(startToNowRange.since).toEqual(startOfDay(base));
125
+ expect(startToNowRange.until).toBeInstanceOf(Date);
126
+ });
127
+ });
128
+ });