@stacksjs/commerce 0.70.53 → 0.70.55

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 (165) hide show
  1. package/package.json +3 -2
  2. package/src/carts/destroy.ts +54 -0
  3. package/src/carts/fetch.ts +20 -0
  4. package/src/carts/index.ts +13 -0
  5. package/src/carts/store.ts +75 -0
  6. package/src/carts/update.ts +78 -0
  7. package/src/coupons/destroy.ts +49 -0
  8. package/src/coupons/fetch.ts +510 -0
  9. package/src/coupons/index.ts +30 -0
  10. package/src/coupons/store.ts +46 -0
  11. package/src/coupons/update.ts +147 -0
  12. package/src/customers/destroy.ts +62 -0
  13. package/src/customers/fetch.ts +20 -0
  14. package/src/customers/index.ts +17 -0
  15. package/src/customers/store.ts +45 -0
  16. package/src/customers/update.ts +44 -0
  17. package/src/devices/destroy.ts +54 -0
  18. package/src/devices/export.ts +98 -0
  19. package/src/devices/fetch.ts +125 -0
  20. package/src/devices/index.ts +31 -0
  21. package/src/devices/store.ts +82 -0
  22. package/src/devices/update.ts +125 -0
  23. package/src/errors/destroy.ts +54 -0
  24. package/src/errors/fetch.ts +197 -0
  25. package/src/errors/index.ts +28 -0
  26. package/src/errors/update.ts +116 -0
  27. package/src/gift-cards/destroy.ts +87 -0
  28. package/src/gift-cards/fetch.ts +431 -0
  29. package/src/gift-cards/index.ts +26 -0
  30. package/src/gift-cards/store.ts +56 -0
  31. package/src/gift-cards/update.ts +102 -0
  32. package/src/index.ts +78 -0
  33. package/src/orders/destroy.ts +111 -0
  34. package/src/orders/events.ts +121 -0
  35. package/src/orders/export.ts +158 -0
  36. package/src/orders/fetch.ts +379 -0
  37. package/src/orders/guards.ts +261 -0
  38. package/src/orders/index.ts +91 -0
  39. package/src/orders/place-order.ts +274 -0
  40. package/src/orders/store.ts +51 -0
  41. package/src/orders/totals.ts +190 -0
  42. package/src/orders/update.ts +164 -0
  43. package/src/orders/webhook.ts +312 -0
  44. package/src/payments/destroy.ts +56 -0
  45. package/src/payments/fetch.ts +288 -0
  46. package/src/payments/index.ts +16 -0
  47. package/src/payments/store.ts +63 -0
  48. package/src/payments/update.ts +52 -0
  49. package/src/product.ts +0 -0
  50. package/src/products/categories/destroy.ts +103 -0
  51. package/src/products/categories/fetch.ts +285 -0
  52. package/src/products/categories/index.ts +36 -0
  53. package/src/products/categories/store.ts +87 -0
  54. package/src/products/categories/update.ts +251 -0
  55. package/src/products/index.ts +35 -0
  56. package/src/products/items/destroy.ts +54 -0
  57. package/src/products/items/fetch.ts +282 -0
  58. package/src/products/items/index.ts +26 -0
  59. package/src/products/items/store.ts +84 -0
  60. package/src/products/items/update.ts +324 -0
  61. package/src/products/manufacturers/destroy.ts +56 -0
  62. package/src/products/manufacturers/fetch.ts +117 -0
  63. package/src/products/manufacturers/index.ts +24 -0
  64. package/src/products/manufacturers/store.ts +82 -0
  65. package/src/products/manufacturers/update.ts +113 -0
  66. package/src/products/reviews/destroy.ts +56 -0
  67. package/src/products/reviews/fetch.ts +63 -0
  68. package/src/products/reviews/index.ts +25 -0
  69. package/src/products/reviews/store.ts +46 -0
  70. package/src/products/reviews/update.ts +82 -0
  71. package/src/products/units/destroy.ts +56 -0
  72. package/src/products/units/fetch.ts +20 -0
  73. package/src/products/units/index.ts +13 -0
  74. package/src/products/units/store.ts +162 -0
  75. package/src/products/units/update.ts +159 -0
  76. package/src/products/variants/destroy.ts +56 -0
  77. package/src/products/variants/fetch.ts +20 -0
  78. package/src/products/variants/index.ts +21 -0
  79. package/src/products/variants/store.ts +136 -0
  80. package/src/products/variants/update.ts +104 -0
  81. package/src/receipts/destroy.ts +54 -0
  82. package/src/receipts/export.ts +0 -0
  83. package/src/receipts/fetch.ts +222 -0
  84. package/src/receipts/index.ts +24 -0
  85. package/src/receipts/printer.ts +69 -0
  86. package/src/receipts/store.ts +69 -0
  87. package/src/receipts/update.ts +124 -0
  88. package/src/shippings/delivery-routes/destroy.ts +54 -0
  89. package/src/shippings/delivery-routes/fetch.ts +42 -0
  90. package/src/shippings/delivery-routes/index.ts +26 -0
  91. package/src/shippings/delivery-routes/store.ts +69 -0
  92. package/src/shippings/delivery-routes/update.ts +120 -0
  93. package/src/shippings/digital-deliveries/destroy.ts +111 -0
  94. package/src/shippings/digital-deliveries/fetch.ts +20 -0
  95. package/src/shippings/digital-deliveries/index.ts +26 -0
  96. package/src/shippings/digital-deliveries/store.ts +76 -0
  97. package/src/shippings/digital-deliveries/update.ts +129 -0
  98. package/src/shippings/drivers/destroy.ts +78 -0
  99. package/src/shippings/drivers/fetch.ts +20 -0
  100. package/src/shippings/drivers/index.ts +24 -0
  101. package/src/shippings/drivers/store.ts +69 -0
  102. package/src/shippings/drivers/update.ts +117 -0
  103. package/src/shippings/index.ts +39 -0
  104. package/src/shippings/license-keys/destroy.ts +111 -0
  105. package/src/shippings/license-keys/fetch.ts +20 -0
  106. package/src/shippings/license-keys/index.ts +26 -0
  107. package/src/shippings/license-keys/store.ts +77 -0
  108. package/src/shippings/license-keys/update.ts +117 -0
  109. package/src/shippings/shipping-methods/destroy.ts +111 -0
  110. package/src/shippings/shipping-methods/fetch.ts +62 -0
  111. package/src/shippings/shipping-methods/index.ts +28 -0
  112. package/src/shippings/shipping-methods/store.ts +123 -0
  113. package/src/shippings/shipping-methods/update.ts +120 -0
  114. package/src/shippings/shipping-rates/destroy.ts +102 -0
  115. package/src/shippings/shipping-rates/fetch.ts +320 -0
  116. package/src/shippings/shipping-rates/index.ts +36 -0
  117. package/src/shippings/shipping-rates/store.ts +102 -0
  118. package/src/shippings/shipping-rates/update.ts +139 -0
  119. package/src/shippings/shipping-zones/destroy.ts +111 -0
  120. package/src/shippings/shipping-zones/fetch.ts +96 -0
  121. package/src/shippings/shipping-zones/index.ts +26 -0
  122. package/src/shippings/shipping-zones/store.ts +74 -0
  123. package/src/shippings/shipping-zones/update.ts +156 -0
  124. package/src/tax/destroy.ts +54 -0
  125. package/src/tax/fetch.ts +20 -0
  126. package/src/tax/index.ts +24 -0
  127. package/src/tax/store.ts +69 -0
  128. package/src/tax/update.ts +119 -0
  129. package/src/tests/coupons.test.ts +90 -0
  130. package/src/tests/customers.test.ts +39 -0
  131. package/src/tests/device.test.ts +111 -0
  132. package/src/tests/digitals.test.ts +31 -0
  133. package/src/tests/drivers.test.ts +25 -0
  134. package/src/tests/gift-cards.test.ts +36 -0
  135. package/src/tests/license.test.ts +31 -0
  136. package/src/tests/manufacturers.test.ts +80 -0
  137. package/src/tests/orders.test.ts +25 -0
  138. package/src/tests/payments.test.ts +75 -0
  139. package/src/tests/rates.test.ts +367 -0
  140. package/src/tests/receipts.test.ts +287 -0
  141. package/src/tests/restaurant.test.ts +522 -0
  142. package/src/tests/reviews.test.ts +165 -0
  143. package/src/tests/routes.test.ts +51 -0
  144. package/src/tests/setup.ts +149 -0
  145. package/src/tests/shipping.test.ts +88 -0
  146. package/src/tests/tax.test.ts +25 -0
  147. package/src/tests/units.test.ts +110 -0
  148. package/src/tests/variants.test.ts +133 -0
  149. package/src/tests/waitlist.test.ts +303 -0
  150. package/src/tests/zones.test.ts +86 -0
  151. package/src/types.ts +312 -0
  152. package/src/utils/typed-stats.ts +67 -0
  153. package/src/waitlists/index.ts +19 -0
  154. package/src/waitlists/products/destroy.ts +65 -0
  155. package/src/waitlists/products/export.ts +113 -0
  156. package/src/waitlists/products/fetch.ts +362 -0
  157. package/src/waitlists/products/index.ts +33 -0
  158. package/src/waitlists/products/store.ts +112 -0
  159. package/src/waitlists/products/update.ts +125 -0
  160. package/src/waitlists/restaurant/destroy.ts +65 -0
  161. package/src/waitlists/restaurant/export.ts +107 -0
  162. package/src/waitlists/restaurant/fetch.ts +538 -0
  163. package/src/waitlists/restaurant/index.ts +43 -0
  164. package/src/waitlists/restaurant/store.ts +109 -0
  165. package/src/waitlists/restaurant/update.ts +198 -0
@@ -0,0 +1,287 @@
1
+ type ReceiptJsonResponse = ModelRow<typeof Receipt>
2
+ import { beforeEach, describe, expect, it } from 'bun:test'
3
+ import { refreshDatabase } from './setup'
4
+ import { bulkDestroy } from '../receipts/destroy'
5
+ import { fetchAll, fetchPrintsPerHour } from '../receipts/fetch'
6
+ import { bulkStore } from '../receipts/store'
7
+
8
+ beforeEach(async () => {
9
+ await refreshDatabase()
10
+ })
11
+
12
+ describe('Print Log Module', () => {
13
+ describe('store', () => {
14
+ it('should return 0 when trying to bulk store an empty array', async () => {
15
+ const count = await bulkStore([])
16
+ expect(count).toBe(0)
17
+ })
18
+ })
19
+
20
+ describe('destroy', () => {
21
+ it('should return 0 when trying to delete an empty array of print logs', async () => {
22
+ // Try to delete with an empty array
23
+ const deletedCount = await bulkDestroy([])
24
+ expect(deletedCount).toBe(0)
25
+ })
26
+ })
27
+
28
+ describe('fetch', () => {
29
+ it('should fetch all print logs', async () => {
30
+ // Create test print logs
31
+ const requests = [
32
+ {
33
+ printer: 'HP LaserJet',
34
+ document: 'invoice.pdf',
35
+ timestamp: Date.now(),
36
+ status: 'success',
37
+ size: 1024,
38
+ pages: 5,
39
+ duration: 30,
40
+ uuid: '1234567890',
41
+ print_device_id: 1,
42
+ },
43
+ {
44
+ printer: 'Epson Printer',
45
+ document: 'report.pdf',
46
+ timestamp: Date.now(),
47
+ status: 'warning',
48
+ size: 2048,
49
+ pages: 10,
50
+ duration: 45,
51
+ uuid: '1234567890',
52
+ print_device_id: 1,
53
+ },
54
+ {
55
+ printer: 'Canon Printer',
56
+ document: 'document.pdf',
57
+ timestamp: Date.now(),
58
+ status: 'failed',
59
+ size: 512,
60
+ pages: 2,
61
+ duration: 15,
62
+ uuid: '1234567890',
63
+ print_device_id: 1,
64
+ },
65
+ ]
66
+
67
+ // Create the print logs
68
+ await bulkStore(requests)
69
+
70
+ // Fetch all print logs
71
+ const allReceipts = await fetchAll()
72
+ expect(allReceipts).toBeDefined()
73
+ expect(allReceipts.length).toBe(3)
74
+ expect(allReceipts.map((p: ReceiptJsonResponse) => p.printer)).toContain('HP LaserJet')
75
+ expect(allReceipts.map((p: ReceiptJsonResponse) => p.printer)).toContain('Epson Printer')
76
+ expect(allReceipts.map((p: ReceiptJsonResponse) => p.printer)).toContain('Canon Printer')
77
+ })
78
+
79
+ it('should calculate prints per hour statistics within a date range', async () => {
80
+ // Use a fixed timestamp for today at midnight
81
+ const today = new Date()
82
+ today.setHours(0, 0, 0, 0)
83
+ const startDate = today.getTime()
84
+ const endDate = startDate + 86399999 // End of today
85
+
86
+ // Create test receipts with different timestamps
87
+ const requests = [
88
+ {
89
+ printer: 'HP LaserJet',
90
+ document: 'invoice.pdf',
91
+ timestamp: startDate + (2 * 3600000), // 2 AM
92
+ status: 'success',
93
+ size: 1024,
94
+ pages: 5,
95
+ duration: 30,
96
+ uuid: '1234567890',
97
+ print_device_id: 1,
98
+ },
99
+ {
100
+ printer: 'Epson Printer',
101
+ document: 'report.pdf',
102
+ timestamp: startDate + (2 * 3600000), // 2 AM
103
+ status: 'success',
104
+ size: 2048,
105
+ pages: 10,
106
+ duration: 45,
107
+ uuid: '1234567890',
108
+ print_device_id: 1,
109
+ },
110
+ {
111
+ printer: 'Canon Printer',
112
+ document: 'document.pdf',
113
+ timestamp: startDate + (14 * 3600000), // 2 PM
114
+ status: 'warning',
115
+ size: 512,
116
+ pages: 2,
117
+ duration: 15,
118
+ uuid: '1234567890',
119
+ print_device_id: 1,
120
+ },
121
+ {
122
+ printer: 'Brother Printer',
123
+ document: 'error.pdf',
124
+ timestamp: startDate + (14 * 3600000), // 2 PM
125
+ status: 'failed',
126
+ size: 256,
127
+ pages: 1,
128
+ duration: 5,
129
+ uuid: '1234567890',
130
+ print_device_id: 1,
131
+ },
132
+ ]
133
+
134
+ await bulkStore(requests)
135
+
136
+ // Fetch prints per hour statistics
137
+ const stats = await fetchPrintsPerHour(startDate, endDate)
138
+
139
+ // Verify the statistics
140
+ expect(stats).toBeDefined()
141
+ expect(stats.totalPrints).toBe(4)
142
+ expect(stats.totalHours).toBe(24)
143
+
144
+ // Verify hourly breakdown
145
+ expect(stats.hourlyBreakdown).toHaveLength(24)
146
+ expect(stats.hourlyBreakdown[2].count).toBe(2) // 2 prints at 2 AM
147
+ expect(stats.hourlyBreakdown[14].count).toBe(2) // 2 prints at 2 PM
148
+ // All other hours should have 0 prints
149
+ stats.hourlyBreakdown.forEach((hour: { hour: number, count: number }, index: number) => {
150
+ if (index !== 2 && index !== 14) {
151
+ expect(hour.count).toBe(0)
152
+ }
153
+ })
154
+ })
155
+
156
+ it('should return zero statistics when no receipts exist in date range', async () => {
157
+ const now = Date.now()
158
+ const startDate = now - (now % 86400000) // Start of today
159
+ const endDate = startDate + 86399999 // End of today
160
+
161
+ const stats = await fetchPrintsPerHour(startDate, endDate)
162
+
163
+ expect(stats).toBeDefined()
164
+ expect(stats.totalPrints).toBe(0)
165
+ expect(stats.totalHours).toBe(24)
166
+ expect(stats.printsPerHour).toBe(0)
167
+ expect(stats.hourlyBreakdown).toHaveLength(24)
168
+ stats.hourlyBreakdown.forEach((hour: { hour: number, count: number }) => {
169
+ expect(hour.count).toBe(0)
170
+ })
171
+ })
172
+
173
+ it('should calculate correct statistics for a single hour', async () => {
174
+ const now = Date.now()
175
+ const startDate = now - (now % 86400000) // Start of today
176
+ const endDate = startDate + 3600000 // One hour later
177
+
178
+ // Create test receipts all in the same hour
179
+ const requests = [
180
+ {
181
+ printer: 'HP LaserJet',
182
+ document: 'invoice1.pdf',
183
+ timestamp: startDate,
184
+ status: 'success',
185
+ size: 1024,
186
+ pages: 1,
187
+ uuid: '1234567890',
188
+ print_device_id: 1,
189
+ duration: 30,
190
+ },
191
+ {
192
+ printer: 'Epson Printer',
193
+ document: 'invoice2.pdf',
194
+ timestamp: startDate + 1800000, // 30 minutes later
195
+ status: 'success',
196
+ size: 2048,
197
+ pages: 1,
198
+ duration: 45,
199
+ uuid: '1234567890',
200
+ print_device_id: 1,
201
+ },
202
+ {
203
+ printer: 'Canon Printer',
204
+ document: 'invoice3.pdf',
205
+ timestamp: startDate + 3000000, // 50 minutes later
206
+ status: 'success',
207
+ size: 512,
208
+ pages: 1,
209
+ duration: 15,
210
+ uuid: '1234567890',
211
+ print_device_id: 1,
212
+ },
213
+ ]
214
+
215
+ await bulkStore(requests)
216
+
217
+ const stats = await fetchPrintsPerHour(startDate, endDate)
218
+
219
+ expect(stats).toBeDefined()
220
+ expect(stats.totalPrints).toBe(3)
221
+ expect(stats.totalHours).toBe(1)
222
+ expect(stats.printsPerHour).toBe(3) // 3 prints / 1 hour
223
+ expect(stats.hourlyBreakdown).toHaveLength(24)
224
+ // Only the first hour should have prints
225
+ stats.hourlyBreakdown.forEach((hour: { hour: number, count: number }, index: number) => {
226
+ expect(hour.count).toBe(index === 0 ? 3 : 0)
227
+ })
228
+ })
229
+
230
+ it('should only count receipts within the specified date range for hourly statistics', async () => {
231
+ const now = Date.now()
232
+ const startDate = now - (now % 86400000) // Start of today
233
+ const endDate = startDate + 86399999 // End of today
234
+
235
+ // Create receipts with different dates
236
+ const requests = [
237
+ {
238
+ printer: 'HP LaserJet',
239
+ document: 'invoice.pdf',
240
+ timestamp: startDate,
241
+ status: 'success',
242
+ size: 1024,
243
+ pages: 5,
244
+ duration: 30,
245
+ uuid: '1234567890',
246
+ print_device_id: 1,
247
+ },
248
+ {
249
+ printer: 'Epson Printer',
250
+ document: 'report.pdf',
251
+ timestamp: startDate - 86400000, // Yesterday
252
+ status: 'success',
253
+ size: 2048,
254
+ pages: 10,
255
+ duration: 45,
256
+ uuid: '1234567890',
257
+ print_device_id: 1,
258
+ },
259
+ {
260
+ printer: 'Canon Printer',
261
+ document: 'document.pdf',
262
+ timestamp: endDate + 1, // Tomorrow
263
+ status: 'warning',
264
+ size: 512,
265
+ pages: 2,
266
+ duration: 15,
267
+ uuid: '1234567890',
268
+ print_device_id: 1,
269
+ },
270
+ ]
271
+
272
+ await bulkStore(requests)
273
+
274
+ const stats = await fetchPrintsPerHour(startDate, endDate)
275
+
276
+ // Verify only today's receipt is counted
277
+ expect(stats).toBeDefined()
278
+ expect(stats.totalPrints).toBe(1)
279
+ expect(stats.totalHours).toBe(24)
280
+ expect(stats.hourlyBreakdown).toHaveLength(24)
281
+ // Only the first hour should have prints
282
+ stats.hourlyBreakdown.forEach((hour: { hour: number, count: number }, index: number) => {
283
+ expect(hour.count).toBe(index === 0 ? 1 : 0)
284
+ })
285
+ })
286
+ })
287
+ })