@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.
- package/package.json +3 -2
- package/src/carts/destroy.ts +54 -0
- package/src/carts/fetch.ts +20 -0
- package/src/carts/index.ts +13 -0
- package/src/carts/store.ts +75 -0
- package/src/carts/update.ts +78 -0
- package/src/coupons/destroy.ts +49 -0
- package/src/coupons/fetch.ts +510 -0
- package/src/coupons/index.ts +30 -0
- package/src/coupons/store.ts +46 -0
- package/src/coupons/update.ts +147 -0
- package/src/customers/destroy.ts +62 -0
- package/src/customers/fetch.ts +20 -0
- package/src/customers/index.ts +17 -0
- package/src/customers/store.ts +45 -0
- package/src/customers/update.ts +44 -0
- package/src/devices/destroy.ts +54 -0
- package/src/devices/export.ts +98 -0
- package/src/devices/fetch.ts +125 -0
- package/src/devices/index.ts +31 -0
- package/src/devices/store.ts +82 -0
- package/src/devices/update.ts +125 -0
- package/src/errors/destroy.ts +54 -0
- package/src/errors/fetch.ts +197 -0
- package/src/errors/index.ts +28 -0
- package/src/errors/update.ts +116 -0
- package/src/gift-cards/destroy.ts +87 -0
- package/src/gift-cards/fetch.ts +431 -0
- package/src/gift-cards/index.ts +26 -0
- package/src/gift-cards/store.ts +56 -0
- package/src/gift-cards/update.ts +102 -0
- package/src/index.ts +78 -0
- package/src/orders/destroy.ts +111 -0
- package/src/orders/events.ts +121 -0
- package/src/orders/export.ts +158 -0
- package/src/orders/fetch.ts +379 -0
- package/src/orders/guards.ts +261 -0
- package/src/orders/index.ts +91 -0
- package/src/orders/place-order.ts +274 -0
- package/src/orders/store.ts +51 -0
- package/src/orders/totals.ts +190 -0
- package/src/orders/update.ts +164 -0
- package/src/orders/webhook.ts +312 -0
- package/src/payments/destroy.ts +56 -0
- package/src/payments/fetch.ts +288 -0
- package/src/payments/index.ts +16 -0
- package/src/payments/store.ts +63 -0
- package/src/payments/update.ts +52 -0
- package/src/product.ts +0 -0
- package/src/products/categories/destroy.ts +103 -0
- package/src/products/categories/fetch.ts +285 -0
- package/src/products/categories/index.ts +36 -0
- package/src/products/categories/store.ts +87 -0
- package/src/products/categories/update.ts +251 -0
- package/src/products/index.ts +35 -0
- package/src/products/items/destroy.ts +54 -0
- package/src/products/items/fetch.ts +282 -0
- package/src/products/items/index.ts +26 -0
- package/src/products/items/store.ts +84 -0
- package/src/products/items/update.ts +324 -0
- package/src/products/manufacturers/destroy.ts +56 -0
- package/src/products/manufacturers/fetch.ts +117 -0
- package/src/products/manufacturers/index.ts +24 -0
- package/src/products/manufacturers/store.ts +82 -0
- package/src/products/manufacturers/update.ts +113 -0
- package/src/products/reviews/destroy.ts +56 -0
- package/src/products/reviews/fetch.ts +63 -0
- package/src/products/reviews/index.ts +25 -0
- package/src/products/reviews/store.ts +46 -0
- package/src/products/reviews/update.ts +82 -0
- package/src/products/units/destroy.ts +56 -0
- package/src/products/units/fetch.ts +20 -0
- package/src/products/units/index.ts +13 -0
- package/src/products/units/store.ts +162 -0
- package/src/products/units/update.ts +159 -0
- package/src/products/variants/destroy.ts +56 -0
- package/src/products/variants/fetch.ts +20 -0
- package/src/products/variants/index.ts +21 -0
- package/src/products/variants/store.ts +136 -0
- package/src/products/variants/update.ts +104 -0
- package/src/receipts/destroy.ts +54 -0
- package/src/receipts/export.ts +0 -0
- package/src/receipts/fetch.ts +222 -0
- package/src/receipts/index.ts +24 -0
- package/src/receipts/printer.ts +69 -0
- package/src/receipts/store.ts +69 -0
- package/src/receipts/update.ts +124 -0
- package/src/shippings/delivery-routes/destroy.ts +54 -0
- package/src/shippings/delivery-routes/fetch.ts +42 -0
- package/src/shippings/delivery-routes/index.ts +26 -0
- package/src/shippings/delivery-routes/store.ts +69 -0
- package/src/shippings/delivery-routes/update.ts +120 -0
- package/src/shippings/digital-deliveries/destroy.ts +111 -0
- package/src/shippings/digital-deliveries/fetch.ts +20 -0
- package/src/shippings/digital-deliveries/index.ts +26 -0
- package/src/shippings/digital-deliveries/store.ts +76 -0
- package/src/shippings/digital-deliveries/update.ts +129 -0
- package/src/shippings/drivers/destroy.ts +78 -0
- package/src/shippings/drivers/fetch.ts +20 -0
- package/src/shippings/drivers/index.ts +24 -0
- package/src/shippings/drivers/store.ts +69 -0
- package/src/shippings/drivers/update.ts +117 -0
- package/src/shippings/index.ts +39 -0
- package/src/shippings/license-keys/destroy.ts +111 -0
- package/src/shippings/license-keys/fetch.ts +20 -0
- package/src/shippings/license-keys/index.ts +26 -0
- package/src/shippings/license-keys/store.ts +77 -0
- package/src/shippings/license-keys/update.ts +117 -0
- package/src/shippings/shipping-methods/destroy.ts +111 -0
- package/src/shippings/shipping-methods/fetch.ts +62 -0
- package/src/shippings/shipping-methods/index.ts +28 -0
- package/src/shippings/shipping-methods/store.ts +123 -0
- package/src/shippings/shipping-methods/update.ts +120 -0
- package/src/shippings/shipping-rates/destroy.ts +102 -0
- package/src/shippings/shipping-rates/fetch.ts +320 -0
- package/src/shippings/shipping-rates/index.ts +36 -0
- package/src/shippings/shipping-rates/store.ts +102 -0
- package/src/shippings/shipping-rates/update.ts +139 -0
- package/src/shippings/shipping-zones/destroy.ts +111 -0
- package/src/shippings/shipping-zones/fetch.ts +96 -0
- package/src/shippings/shipping-zones/index.ts +26 -0
- package/src/shippings/shipping-zones/store.ts +74 -0
- package/src/shippings/shipping-zones/update.ts +156 -0
- package/src/tax/destroy.ts +54 -0
- package/src/tax/fetch.ts +20 -0
- package/src/tax/index.ts +24 -0
- package/src/tax/store.ts +69 -0
- package/src/tax/update.ts +119 -0
- package/src/tests/coupons.test.ts +90 -0
- package/src/tests/customers.test.ts +39 -0
- package/src/tests/device.test.ts +111 -0
- package/src/tests/digitals.test.ts +31 -0
- package/src/tests/drivers.test.ts +25 -0
- package/src/tests/gift-cards.test.ts +36 -0
- package/src/tests/license.test.ts +31 -0
- package/src/tests/manufacturers.test.ts +80 -0
- package/src/tests/orders.test.ts +25 -0
- package/src/tests/payments.test.ts +75 -0
- package/src/tests/rates.test.ts +367 -0
- package/src/tests/receipts.test.ts +287 -0
- package/src/tests/restaurant.test.ts +522 -0
- package/src/tests/reviews.test.ts +165 -0
- package/src/tests/routes.test.ts +51 -0
- package/src/tests/setup.ts +149 -0
- package/src/tests/shipping.test.ts +88 -0
- package/src/tests/tax.test.ts +25 -0
- package/src/tests/units.test.ts +110 -0
- package/src/tests/variants.test.ts +133 -0
- package/src/tests/waitlist.test.ts +303 -0
- package/src/tests/zones.test.ts +86 -0
- package/src/types.ts +312 -0
- package/src/utils/typed-stats.ts +67 -0
- package/src/waitlists/index.ts +19 -0
- package/src/waitlists/products/destroy.ts +65 -0
- package/src/waitlists/products/export.ts +113 -0
- package/src/waitlists/products/fetch.ts +362 -0
- package/src/waitlists/products/index.ts +33 -0
- package/src/waitlists/products/store.ts +112 -0
- package/src/waitlists/products/update.ts +125 -0
- package/src/waitlists/restaurant/destroy.ts +65 -0
- package/src/waitlists/restaurant/export.ts +107 -0
- package/src/waitlists/restaurant/fetch.ts +538 -0
- package/src/waitlists/restaurant/index.ts +43 -0
- package/src/waitlists/restaurant/store.ts +109 -0
- 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
|
+
})
|