@bash-app/bash-common 30.117.0 → 30.118.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 (31) hide show
  1. package/dist/extendedSchemas.d.ts +54 -0
  2. package/dist/extendedSchemas.d.ts.map +1 -1
  3. package/dist/extendedSchemas.js +10 -1
  4. package/dist/extendedSchemas.js.map +1 -1
  5. package/dist/index.d.ts +1 -0
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js.map +1 -1
  8. package/dist/utils/__tests__/paymentUtils.test.d.ts +6 -0
  9. package/dist/utils/__tests__/paymentUtils.test.d.ts.map +1 -0
  10. package/dist/utils/__tests__/paymentUtils.test.js +77 -0
  11. package/dist/utils/__tests__/paymentUtils.test.js.map +1 -0
  12. package/dist/utils/discountEngine/__tests__/bestPriceResolver.test.d.ts +2 -0
  13. package/dist/utils/discountEngine/__tests__/bestPriceResolver.test.d.ts.map +1 -0
  14. package/dist/utils/discountEngine/__tests__/bestPriceResolver.test.js +457 -0
  15. package/dist/utils/discountEngine/__tests__/bestPriceResolver.test.js.map +1 -0
  16. package/dist/utils/discountEngine/__tests__/eligibilityValidator.test.d.ts +2 -0
  17. package/dist/utils/discountEngine/__tests__/eligibilityValidator.test.d.ts.map +1 -0
  18. package/dist/utils/discountEngine/__tests__/eligibilityValidator.test.js +480 -0
  19. package/dist/utils/discountEngine/__tests__/eligibilityValidator.test.js.map +1 -0
  20. package/package.json +2 -2
  21. package/prisma/COMPREHENSIVE-MIGRATION-README.md +295 -0
  22. package/prisma/MIGRATION-FILES-GUIDE.md +76 -0
  23. package/prisma/comprehensive-migration-20260120.sql +5751 -0
  24. package/prisma/delta-migration-20260120.sql +302 -0
  25. package/prisma/schema.prisma +253 -13
  26. package/prisma/verify-migration.sql +132 -0
  27. package/src/extendedSchemas.ts +10 -1
  28. package/src/index.ts +4 -0
  29. package/src/utils/__tests__/paymentUtils.test.ts +95 -0
  30. package/src/utils/discountEngine/__tests__/bestPriceResolver.test.ts +558 -0
  31. package/src/utils/discountEngine/__tests__/eligibilityValidator.test.ts +655 -0
@@ -0,0 +1,457 @@
1
+ import { findBestPrice, applyGuardrails, calculateEffectiveRate, } from "../bestPriceResolver";
2
+ import { SpecialOfferType } from "@prisma/client";
3
+ describe("bestPriceResolver", () => {
4
+ const mockPromoCode = {
5
+ id: "promo-1",
6
+ code: "SUMMER20",
7
+ bashEventId: "event-1",
8
+ discountAmountPercentage: 20,
9
+ discountAmountInCents: null,
10
+ maxRedemptions: null,
11
+ redeemBy: null,
12
+ promoterId: null,
13
+ createdAt: new Date(),
14
+ updatedAt: new Date(),
15
+ };
16
+ const mockSpecialOffer = {
17
+ id: "offer-1",
18
+ ticketTierId: "tier-1",
19
+ offerType: SpecialOfferType.EARLY_BIRD,
20
+ title: "Early Bird",
21
+ description: null,
22
+ discountType: "PERCENTAGE",
23
+ discountValue: 15,
24
+ isActive: true,
25
+ canStackWithPromoCodes: true,
26
+ canStackWithOtherOffers: false,
27
+ displayBadge: true,
28
+ badgeText: "EARLY BIRD",
29
+ maxRedemptions: null,
30
+ currentRedemptions: 0,
31
+ createdAt: new Date(),
32
+ updatedAt: new Date(),
33
+ };
34
+ describe("findBestPrice - No Discounts", () => {
35
+ it("should return original price when no discounts available", () => {
36
+ const options = {
37
+ ticketPrice: 5000, // $50
38
+ quantity: 2,
39
+ promoCodes: [],
40
+ specialOffers: [],
41
+ allowStacking: true,
42
+ };
43
+ const result = findBestPrice(options);
44
+ expect(result.originalTotal).toBe(10000); // $100
45
+ expect(result.finalTotal).toBe(10000);
46
+ expect(result.totalSavings).toBe(0);
47
+ expect(result.appliedDiscounts).toHaveLength(0);
48
+ expect(result.explanation).toBe("No discounts applied");
49
+ });
50
+ it("should handle zero quantity", () => {
51
+ const options = {
52
+ ticketPrice: 5000,
53
+ quantity: 0,
54
+ promoCodes: [],
55
+ specialOffers: [],
56
+ allowStacking: true,
57
+ };
58
+ const result = findBestPrice(options);
59
+ expect(result.originalTotal).toBe(0);
60
+ expect(result.finalTotal).toBe(0);
61
+ });
62
+ });
63
+ describe("findBestPrice - Promo Code Only", () => {
64
+ it("should apply single promo code discount", () => {
65
+ const options = {
66
+ ticketPrice: 5000, // $50
67
+ quantity: 2,
68
+ promoCodes: [mockPromoCode], // 20% off
69
+ specialOffers: [],
70
+ allowStacking: true,
71
+ };
72
+ const result = findBestPrice(options);
73
+ expect(result.originalTotal).toBe(10000); // $100
74
+ expect(result.finalTotal).toBe(8000); // $80 after 20% off
75
+ expect(result.totalSavings).toBe(2000); // Saved $20
76
+ expect(result.appliedDiscounts).toHaveLength(1);
77
+ expect(result.appliedDiscounts[0].sourceName).toBe("SUMMER20");
78
+ });
79
+ it("should select best promo code from multiple options", () => {
80
+ const promo30 = {
81
+ ...mockPromoCode,
82
+ id: "promo-2",
83
+ code: "MEGA30",
84
+ discountAmountPercentage: 30,
85
+ };
86
+ const options = {
87
+ ticketPrice: 5000,
88
+ quantity: 2,
89
+ promoCodes: [mockPromoCode, promo30], // 20% vs 30%
90
+ specialOffers: [],
91
+ allowStacking: false,
92
+ };
93
+ const result = findBestPrice(options);
94
+ expect(result.finalTotal).toBe(7000); // Best: 30% off
95
+ expect(result.appliedDiscounts[0].sourceName).toBe("MEGA30");
96
+ });
97
+ it("should handle fixed amount promo code", () => {
98
+ const fixedPromo = {
99
+ ...mockPromoCode,
100
+ discountAmountPercentage: null,
101
+ discountAmountInCents: 1500, // $15 off
102
+ };
103
+ const options = {
104
+ ticketPrice: 5000,
105
+ quantity: 2,
106
+ promoCodes: [fixedPromo],
107
+ specialOffers: [],
108
+ allowStacking: true,
109
+ };
110
+ const result = findBestPrice(options);
111
+ expect(result.originalTotal).toBe(10000);
112
+ expect(result.finalTotal).toBe(8500); // $100 - $15
113
+ expect(result.totalSavings).toBe(1500);
114
+ });
115
+ });
116
+ describe("findBestPrice - Special Offer Only", () => {
117
+ it("should apply single special offer discount", () => {
118
+ const options = {
119
+ ticketPrice: 5000,
120
+ quantity: 2,
121
+ promoCodes: [],
122
+ specialOffers: [mockSpecialOffer], // 15% off
123
+ allowStacking: true,
124
+ };
125
+ const result = findBestPrice(options);
126
+ expect(result.finalTotal).toBe(8500); // $85 after 15% off
127
+ expect(result.totalSavings).toBe(1500); // Saved $15
128
+ expect(result.appliedDiscounts).toHaveLength(1);
129
+ });
130
+ it("should select best offer from multiple options", () => {
131
+ const betterOffer = {
132
+ ...mockSpecialOffer,
133
+ id: "offer-2",
134
+ discountValue: 25, // 25% off
135
+ };
136
+ const options = {
137
+ ticketPrice: 5000,
138
+ quantity: 2,
139
+ promoCodes: [],
140
+ specialOffers: [mockSpecialOffer, betterOffer], // 15% vs 25%
141
+ allowStacking: false,
142
+ };
143
+ const result = findBestPrice(options);
144
+ expect(result.finalTotal).toBe(7500); // Best: 25% off = $75
145
+ expect(result.appliedDiscounts[0].sourceId).toBe("offer-2");
146
+ });
147
+ });
148
+ describe("findBestPrice - Stacking Discounts", () => {
149
+ it("should stack promo code with special offer when allowed", () => {
150
+ const stackableOffer = {
151
+ ...mockSpecialOffer,
152
+ canStackWithPromoCodes: true,
153
+ };
154
+ const options = {
155
+ ticketPrice: 5000, // $50 per ticket
156
+ quantity: 2, // $100 total
157
+ promoCodes: [mockPromoCode], // 20% off
158
+ specialOffers: [stackableOffer], // 15% off
159
+ allowStacking: true,
160
+ };
161
+ const result = findBestPrice(options);
162
+ // Stacked: 20% off $100 = $80, then 15% off $80 = $68
163
+ expect(result.finalTotal).toBeLessThan(8000); // Better than single discount
164
+ expect(result.appliedDiscounts).toHaveLength(2);
165
+ });
166
+ it("should not stack when offer disallows stacking", () => {
167
+ const nonStackableOffer = {
168
+ ...mockSpecialOffer,
169
+ canStackWithPromoCodes: false,
170
+ };
171
+ const options = {
172
+ ticketPrice: 5000,
173
+ quantity: 2,
174
+ promoCodes: [mockPromoCode], // 20% off
175
+ specialOffers: [nonStackableOffer], // 15% off, no stacking
176
+ allowStacking: true,
177
+ };
178
+ const result = findBestPrice(options);
179
+ // Should pick the better single discount (20%)
180
+ expect(result.appliedDiscounts).toHaveLength(1);
181
+ expect(result.finalTotal).toBe(8000); // 20% off
182
+ });
183
+ it("should not stack when global stacking is disabled", () => {
184
+ const stackableOffer = {
185
+ ...mockSpecialOffer,
186
+ canStackWithPromoCodes: true,
187
+ };
188
+ const options = {
189
+ ticketPrice: 5000,
190
+ quantity: 2,
191
+ promoCodes: [mockPromoCode],
192
+ specialOffers: [stackableOffer],
193
+ allowStacking: false, // Global override
194
+ };
195
+ const result = findBestPrice(options);
196
+ // Should pick best single discount
197
+ expect(result.appliedDiscounts).toHaveLength(1);
198
+ });
199
+ it("should stack multiple offers when both allow it", () => {
200
+ const offer1 = {
201
+ ...mockSpecialOffer,
202
+ id: "offer-1",
203
+ discountValue: 10,
204
+ canStackWithOtherOffers: true,
205
+ };
206
+ const offer2 = {
207
+ ...mockSpecialOffer,
208
+ id: "offer-2",
209
+ discountValue: 15,
210
+ canStackWithOtherOffers: true,
211
+ };
212
+ const options = {
213
+ ticketPrice: 5000,
214
+ quantity: 2,
215
+ promoCodes: [],
216
+ specialOffers: [offer1, offer2],
217
+ allowStacking: true,
218
+ };
219
+ const result = findBestPrice(options);
220
+ // Should stack both offers
221
+ expect(result.appliedDiscounts.length).toBeGreaterThan(0);
222
+ });
223
+ });
224
+ describe("findBestPrice - Edge Cases", () => {
225
+ it("should handle 100% discount (free tickets)", () => {
226
+ const freePromo = {
227
+ ...mockPromoCode,
228
+ discountAmountPercentage: 100,
229
+ };
230
+ const options = {
231
+ ticketPrice: 5000,
232
+ quantity: 2,
233
+ promoCodes: [freePromo],
234
+ specialOffers: [],
235
+ allowStacking: true,
236
+ };
237
+ const result = findBestPrice(options);
238
+ expect(result.finalTotal).toBe(0);
239
+ expect(result.totalSavings).toBe(10000);
240
+ });
241
+ it("should not allow negative final price", () => {
242
+ const overDiscount = {
243
+ ...mockPromoCode,
244
+ discountAmountPercentage: null,
245
+ discountAmountInCents: 15000, // $150 off on $100 order
246
+ };
247
+ const options = {
248
+ ticketPrice: 5000,
249
+ quantity: 2, // Total: $100
250
+ promoCodes: [overDiscount],
251
+ specialOffers: [],
252
+ allowStacking: true,
253
+ };
254
+ const result = findBestPrice(options);
255
+ expect(result.finalTotal).toBe(0); // Floor at 0, not negative
256
+ expect(result.totalSavings).toBe(10000); // Capped at original price
257
+ });
258
+ it("should handle very large quantities", () => {
259
+ const options = {
260
+ ticketPrice: 5000,
261
+ quantity: 1000, // Large order
262
+ promoCodes: [mockPromoCode],
263
+ specialOffers: [],
264
+ allowStacking: true,
265
+ };
266
+ const result = findBestPrice(options);
267
+ expect(result.originalTotal).toBe(5000000); // $50,000
268
+ expect(result.finalTotal).toBe(4000000); // 20% off
269
+ });
270
+ it("should handle rounding correctly", () => {
271
+ const options = {
272
+ ticketPrice: 3333, // $33.33
273
+ quantity: 3, // Total: $99.99
274
+ promoCodes: [mockPromoCode], // 20% off
275
+ specialOffers: [],
276
+ allowStacking: true,
277
+ };
278
+ const result = findBestPrice(options);
279
+ // Should round down to nearest cent
280
+ expect(Number.isInteger(result.finalTotal)).toBe(true);
281
+ expect(result.finalTotal).toBeGreaterThan(0);
282
+ });
283
+ });
284
+ describe("applyGuardrails", () => {
285
+ const mockDiscountResult = {
286
+ sourceType: "PROMO_CODE",
287
+ sourceId: "promo-1",
288
+ sourceName: "TEST",
289
+ discountType: "PERCENTAGE",
290
+ discountValue: 50,
291
+ amountDiscounted: 5000,
292
+ originalPrice: 10000,
293
+ finalPrice: 5000,
294
+ };
295
+ it("should enforce minimum price floor", () => {
296
+ const result = applyGuardrails(mockDiscountResult, 6000); // Min $60
297
+ expect(result.finalPrice).toBe(6000); // Capped at min
298
+ expect(result.amountDiscounted).toBe(4000); // Adjusted discount
299
+ });
300
+ it("should enforce maximum discount percentage", () => {
301
+ const result = applyGuardrails(mockDiscountResult, undefined, 30); // Max 30% off
302
+ expect(result.amountDiscounted).toBeLessThanOrEqual(3000); // 30% of $100
303
+ expect(result.finalPrice).toBeGreaterThanOrEqual(7000); // At least $70
304
+ });
305
+ it("should apply both guardrails", () => {
306
+ const result = applyGuardrails(mockDiscountResult, 7500, 30);
307
+ expect(result.finalPrice).toBeGreaterThanOrEqual(7500); // Min floor
308
+ expect(result.amountDiscounted).toBeLessThanOrEqual(3000); // Max discount
309
+ });
310
+ it("should not modify result when within bounds", () => {
311
+ const result = applyGuardrails(mockDiscountResult, 4000, 60);
312
+ expect(result.finalPrice).toBe(5000); // Unchanged
313
+ expect(result.amountDiscounted).toBe(5000); // Unchanged
314
+ });
315
+ });
316
+ describe("calculateEffectiveRate", () => {
317
+ it("should calculate effective discount percentage", () => {
318
+ const result = {
319
+ appliedDiscounts: [],
320
+ originalTotal: 10000, // $100
321
+ finalTotal: 7500, // $75
322
+ totalSavings: 2500, // $25
323
+ explanation: "",
324
+ };
325
+ const rate = calculateEffectiveRate(result);
326
+ expect(rate).toBe(25); // 25% effective discount
327
+ });
328
+ it("should handle zero original price", () => {
329
+ const result = {
330
+ appliedDiscounts: [],
331
+ originalTotal: 0,
332
+ finalTotal: 0,
333
+ totalSavings: 0,
334
+ explanation: "",
335
+ };
336
+ const rate = calculateEffectiveRate(result);
337
+ expect(rate).toBe(0);
338
+ });
339
+ it("should round down to whole percentage", () => {
340
+ const result = {
341
+ appliedDiscounts: [],
342
+ originalTotal: 10000,
343
+ finalTotal: 6666, // 33.34% off
344
+ totalSavings: 3334,
345
+ explanation: "",
346
+ };
347
+ const rate = calculateEffectiveRate(result);
348
+ expect(rate).toBe(33); // Rounded down
349
+ });
350
+ it("should handle 100% discount", () => {
351
+ const result = {
352
+ appliedDiscounts: [],
353
+ originalTotal: 10000,
354
+ finalTotal: 0,
355
+ totalSavings: 10000,
356
+ explanation: "",
357
+ };
358
+ const rate = calculateEffectiveRate(result);
359
+ expect(rate).toBe(100);
360
+ });
361
+ });
362
+ describe("findBestPrice - Complex Scenarios", () => {
363
+ it("should choose best combination among many options", () => {
364
+ const promo10 = {
365
+ ...mockPromoCode,
366
+ id: "promo-10",
367
+ discountAmountPercentage: 10,
368
+ };
369
+ const promo25 = {
370
+ ...mockPromoCode,
371
+ id: "promo-25",
372
+ discountAmountPercentage: 25,
373
+ };
374
+ const offer15 = {
375
+ ...mockSpecialOffer,
376
+ id: "offer-15",
377
+ discountValue: 15,
378
+ canStackWithPromoCodes: false,
379
+ };
380
+ const offer20 = {
381
+ ...mockSpecialOffer,
382
+ id: "offer-20",
383
+ discountValue: 20,
384
+ canStackWithPromoCodes: true,
385
+ };
386
+ const options = {
387
+ ticketPrice: 10000, // $100
388
+ quantity: 1,
389
+ promoCodes: [promo10, promo25],
390
+ specialOffers: [offer15, offer20],
391
+ allowStacking: true,
392
+ };
393
+ const result = findBestPrice(options);
394
+ // Best should be: 25% promo + 20% offer (if stacked)
395
+ // Or 25% promo alone = $75
396
+ // Stacked: 25% off $100 = $75, then 20% off $75 = $60
397
+ expect(result.finalTotal).toBeLessThanOrEqual(7500);
398
+ });
399
+ it("should generate correct explanation string", () => {
400
+ const options = {
401
+ ticketPrice: 5000,
402
+ quantity: 2,
403
+ promoCodes: [mockPromoCode],
404
+ specialOffers: [],
405
+ allowStacking: true,
406
+ };
407
+ const result = findBestPrice(options);
408
+ expect(result.explanation).toContain("SUMMER20");
409
+ expect(result.explanation).not.toBe("No discounts applied");
410
+ });
411
+ it("should handle mixed discount types in stacking", () => {
412
+ const percentPromo = {
413
+ ...mockPromoCode,
414
+ discountAmountPercentage: 20,
415
+ discountAmountInCents: null,
416
+ };
417
+ const fixedOffer = {
418
+ ...mockSpecialOffer,
419
+ discountType: "FIXED_AMOUNT",
420
+ discountValue: 500, // $5 off (in cents)
421
+ canStackWithPromoCodes: true,
422
+ };
423
+ const options = {
424
+ ticketPrice: 5000,
425
+ quantity: 2,
426
+ promoCodes: [percentPromo],
427
+ specialOffers: [fixedOffer],
428
+ allowStacking: true,
429
+ };
430
+ const result = findBestPrice(options);
431
+ // Should stack: 20% off $100 = $80, then $5 off = $75
432
+ expect(result.finalTotal).toBeLessThan(8000);
433
+ expect(result.appliedDiscounts.length).toBeGreaterThan(0);
434
+ });
435
+ });
436
+ describe("findBestPrice - Attribution", () => {
437
+ it("should track promoter attribution", () => {
438
+ const promoWithPromoter = {
439
+ ...mockPromoCode,
440
+ promoterId: "promoter-123",
441
+ };
442
+ const options = {
443
+ ticketPrice: 5000,
444
+ quantity: 2,
445
+ userId: "user-456",
446
+ promoCodes: [promoWithPromoter],
447
+ specialOffers: [],
448
+ allowStacking: true,
449
+ };
450
+ const result = findBestPrice(options);
451
+ expect(result.appliedDiscounts[0]).toHaveProperty("attribution");
452
+ expect(result.appliedDiscounts[0].attribution?.userId).toBe("promoter-123");
453
+ expect(result.appliedDiscounts[0].attribution?.commissionAmount).toBeGreaterThan(0);
454
+ });
455
+ });
456
+ });
457
+ //# sourceMappingURL=bestPriceResolver.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bestPriceResolver.test.js","sourceRoot":"","sources":["../../../../src/utils/discountEngine/__tests__/bestPriceResolver.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=eligibilityValidator.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eligibilityValidator.test.d.ts","sourceRoot":"","sources":["../../../../src/utils/discountEngine/__tests__/eligibilityValidator.test.ts"],"names":[],"mappings":""}