@bash-app/bash-common 30.432.0 → 30.433.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 (68) hide show
  1. package/dist/__tests__/bashSectionTitleForBashType.test.js +2 -0
  2. package/dist/__tests__/bashSectionTitleForBashType.test.js.map +1 -1
  3. package/dist/__tests__/discoveryScope.test.js +9 -1
  4. package/dist/__tests__/discoveryScope.test.js.map +1 -1
  5. package/dist/__tests__/promoCartEngine.test.d.ts +2 -0
  6. package/dist/__tests__/promoCartEngine.test.d.ts.map +1 -0
  7. package/dist/__tests__/promoCartEngine.test.js +174 -0
  8. package/dist/__tests__/promoCartEngine.test.js.map +1 -0
  9. package/dist/__tests__/promoCodeRedemption.test.d.ts +2 -0
  10. package/dist/__tests__/promoCodeRedemption.test.d.ts.map +1 -0
  11. package/dist/__tests__/promoCodeRedemption.test.js +103 -0
  12. package/dist/__tests__/promoCodeRedemption.test.js.map +1 -0
  13. package/dist/__tests__/promoCodeScope.test.d.ts +2 -0
  14. package/dist/__tests__/promoCodeScope.test.d.ts.map +1 -0
  15. package/dist/__tests__/promoCodeScope.test.js +77 -0
  16. package/dist/__tests__/promoCodeScope.test.js.map +1 -0
  17. package/dist/definitions.d.ts +3 -1
  18. package/dist/definitions.d.ts.map +1 -1
  19. package/dist/definitions.js +4 -2
  20. package/dist/definitions.js.map +1 -1
  21. package/dist/discoveryScope.d.ts +6 -6
  22. package/dist/discoveryScope.d.ts.map +1 -1
  23. package/dist/discoveryScope.js +25 -16
  24. package/dist/discoveryScope.js.map +1 -1
  25. package/dist/extendedSchemas.d.ts +1 -0
  26. package/dist/extendedSchemas.d.ts.map +1 -1
  27. package/dist/extendedSchemas.js.map +1 -1
  28. package/dist/index.d.ts +3 -0
  29. package/dist/index.d.ts.map +1 -1
  30. package/dist/index.js +3 -0
  31. package/dist/index.js.map +1 -1
  32. package/dist/promoCartEngine.d.ts +55 -0
  33. package/dist/promoCartEngine.d.ts.map +1 -0
  34. package/dist/promoCartEngine.js +135 -0
  35. package/dist/promoCartEngine.js.map +1 -0
  36. package/dist/promoCodeRedemption.d.ts +44 -0
  37. package/dist/promoCodeRedemption.d.ts.map +1 -0
  38. package/dist/promoCodeRedemption.js +81 -0
  39. package/dist/promoCodeRedemption.js.map +1 -0
  40. package/dist/promoCodeScope.d.ts +85 -0
  41. package/dist/promoCodeScope.d.ts.map +1 -0
  42. package/dist/promoCodeScope.js +93 -0
  43. package/dist/promoCodeScope.js.map +1 -0
  44. package/dist/utils/__tests__/discountEngine/discountCalculator.test.js +8 -1
  45. package/dist/utils/__tests__/discountEngine/discountCalculator.test.js.map +1 -1
  46. package/dist/utils/__tests__/paymentUtils.test.js +87 -4
  47. package/dist/utils/__tests__/paymentUtils.test.js.map +1 -1
  48. package/dist/utils/paymentUtils.d.ts +30 -5
  49. package/dist/utils/paymentUtils.d.ts.map +1 -1
  50. package/dist/utils/paymentUtils.js +43 -11
  51. package/dist/utils/paymentUtils.js.map +1 -1
  52. package/package.json +1 -1
  53. package/prisma/schema.prisma +106 -4
  54. package/src/__tests__/bashSectionTitleForBashType.test.ts +4 -0
  55. package/src/__tests__/discoveryScope.test.ts +22 -1
  56. package/src/__tests__/promoCartEngine.test.ts +201 -0
  57. package/src/__tests__/promoCodeRedemption.test.ts +134 -0
  58. package/src/__tests__/promoCodeScope.test.ts +106 -0
  59. package/src/definitions.ts +4 -2
  60. package/src/discoveryScope.ts +30 -20
  61. package/src/extendedSchemas.ts +1 -0
  62. package/src/index.ts +3 -0
  63. package/src/promoCartEngine.ts +193 -0
  64. package/src/promoCodeRedemption.ts +123 -0
  65. package/src/promoCodeScope.ts +164 -0
  66. package/src/utils/__tests__/discountEngine/discountCalculator.test.ts +8 -0
  67. package/src/utils/__tests__/paymentUtils.test.ts +100 -6
  68. package/src/utils/paymentUtils.ts +56 -13
@@ -42,6 +42,8 @@ describe("bashSectionTitleForBashType", () => {
42
42
  expect(bashSectionTitleForBashType("Ideas")).toBe("Ideas");
43
43
  });
44
44
  it("scope rows use destination copy", () => {
45
+ expect(bashSectionTitleForBashType("Local")).toBe("City & Community Events");
46
+ expect(bashSectionTitleForBashType("State")).toBe("State Events");
45
47
  expect(bashSectionTitleForBashType("National")).toBe("Across the country");
46
48
  expect(bashSectionTitleForBashType("International")).toBe("Worth the flight");
47
49
  expect(bashSectionTitleForBashType("CrewGoing")).toBe("The crew's going");
@@ -1 +1 @@
1
- {"version":3,"file":"bashSectionTitleForBashType.test.js","sourceRoot":"","sources":["../../src/__tests__/bashSectionTitleForBashType.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bashSectionTitleForBashType.test.js","sourceRoot":"","sources":["../../src/__tests__/bashSectionTitleForBashType.test.ts"],"names":[],"mappings":"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"}
@@ -6,8 +6,16 @@ describe("discoveryScope", () => {
6
6
  expect(isHostSettableDiscoveryScope(DiscoveryScope.National)).toBe(false);
7
7
  expect(isHostSettableDiscoveryScope(DiscoveryScope.International)).toBe(false);
8
8
  });
9
- it("infers State from state fair copy", () => {
9
+ it("infers State from a state-run event, not from travel or sponsorship", () => {
10
10
  expect(inferDiscoveryScopeFromText("Utah State Fair")).toBe(DiscoveryScope.State);
11
+ expect(inferDiscoveryScopeFromText("People are coming from statewide")).toBe(DiscoveryScope.Unspecified);
12
+ expect(inferDiscoveryScopeFromText("Sponsored by the Utah state agency office")).toBe(DiscoveryScope.Unspecified);
13
+ expect(inferDiscoveryScopeFromText("Organized by Utah State Parks")).toBe(DiscoveryScope.State);
14
+ expect(inferDiscoveryScopeFromText("Neighborhood party sponsored by the state")).toBe(DiscoveryScope.Unspecified);
15
+ });
16
+ it("infers Local from the organizer, not from how close the party is", () => {
17
+ expect(inferDiscoveryScopeFromText("City of Provo parks and recreation concert")).toBe(DiscoveryScope.Local);
18
+ expect(inferDiscoveryScopeFromText("Sugar House block party")).toBe(DiscoveryScope.Unspecified);
11
19
  });
12
20
  it("infers National from destination brands", () => {
13
21
  expect(inferDiscoveryScopeFromText("EDC Las Vegas")).toBe(DiscoveryScope.National);
@@ -1 +1 @@
1
- {"version":3,"file":"discoveryScope.test.js","sourceRoot":"","sources":["../../src/__tests__/discoveryScope.test.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,2BAA2B,EAC3B,4BAA4B,EAC5B,6BAA6B,GAC9B,MAAM,sBAAsB,CAAC;AAE9B,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,CAAC,4BAA4B,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtE,MAAM,CAAC,4BAA4B,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtE,MAAM,CAAC,4BAA4B,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1E,MAAM,CAAC,4BAA4B,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CACrE,KAAK,CACN,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,CAAC,2BAA2B,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CACzD,cAAc,CAAC,KAAK,CACrB,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,CAAC,2BAA2B,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CACvD,cAAc,CAAC,QAAQ,CACxB,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,CAAC,2BAA2B,CAAC,yBAAyB,CAAC,CAAC,CAAC,IAAI,CACjE,cAAc,CAAC,aAAa,CAC7B,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,CACJ,6BAA6B,CAAC;YAC5B,SAAS,EAAE,cAAc,CAAC,QAAQ;YAClC,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,4BAA4B;SACpC,CAAC,CACH,CAAC,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,MAAM,CACJ,6BAA6B,CAAC;YAC5B,SAAS,EAAE,cAAc,CAAC,QAAQ;YAClC,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,qBAAqB;SAC7B,CAAC,CACH,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,CACJ,6BAA6B,CAAC;YAC5B,SAAS,EAAE,cAAc,CAAC,QAAQ;YAClC,IAAI,EAAE,SAAS;YACf,KAAK,EAAE,aAAa;SACrB,CAAC,CACH,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"discoveryScope.test.js","sourceRoot":"","sources":["../../src/__tests__/discoveryScope.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=promoCartEngine.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"promoCartEngine.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/promoCartEngine.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,174 @@
1
+ import { allocateAcrossTickets, allocateProportionally, resolvePromoForCart, } from "../promoCartEngine.js";
2
+ const now = new Date("2026-10-14T12:00:00Z");
3
+ const earlyBird = { ticketTierId: "early", pricing: "USD", quantity: 2, cashSubtotalCents: 2000, pointsSubtotal: 0 };
4
+ const regular = { ticketTierId: "regular", pricing: "USD", quantity: 1, cashSubtotalCents: 2500, pointsSubtotal: 0 };
5
+ const vip = { ticketTierId: "vip", pricing: "USD", quantity: 1, cashSubtotalCents: 7500, pointsSubtotal: 0 };
6
+ const points = { ticketTierId: "points", pricing: "BASHPOINTS", quantity: 2, cashSubtotalCents: 0, pointsSubtotal: 1000 };
7
+ const free = { ticketTierId: "free", pricing: "FREE", quantity: 3, cashSubtotalCents: 0, pointsSubtotal: 0 };
8
+ describe("allocateProportionally", () => {
9
+ it("splits by weight, flooring, with leftover to the largest line then tier id", () => {
10
+ const result = allocateProportionally(1000, [
11
+ { key: "b", weight: 1000 },
12
+ { key: "a", weight: 1000 },
13
+ { key: "c", weight: 1000 },
14
+ ]);
15
+ expect([...result.entries()].sort()).toEqual([["a", 334], ["b", 333], ["c", 333]]);
16
+ });
17
+ it("gives leftover cents to the largest line first", () => {
18
+ const result = allocateProportionally(1001, [
19
+ { key: "small", weight: 1000 },
20
+ { key: "big", weight: 3000 },
21
+ ]);
22
+ expect(result.get("big")).toBe(751);
23
+ expect(result.get("small")).toBe(250);
24
+ });
25
+ it("never allocates more than the eligible total", () => {
26
+ const result = allocateProportionally(9999, [{ key: "a", weight: 500 }]);
27
+ expect(result.get("a")).toBe(500);
28
+ });
29
+ });
30
+ describe("allocateAcrossTickets", () => {
31
+ it("splits evenly with leftover cents to the lowest ticket ids, summing exactly", () => {
32
+ const result = allocateAcrossTickets(1001, ["t3", "t1", "t2"]);
33
+ expect([...result.entries()]).toEqual([["t1", 334], ["t2", 334], ["t3", 333]]);
34
+ expect([...result.values()].reduce((s, v) => s + v, 0)).toBe(1001);
35
+ });
36
+ });
37
+ describe("resolvePromoForCart", () => {
38
+ it("attribution-only (NONE) on all tiers counts cash, BashPoints, and free tickets with no discount", () => {
39
+ const result = resolvePromoForCart({
40
+ promo: { eligibilityMode: "ALL_TIERS", discountType: "NONE" },
41
+ cartLines: [earlyBird, points, free],
42
+ now,
43
+ });
44
+ expect(result.status).toBe("applied");
45
+ expect(result.cashDiscountTotalCents).toBe(0);
46
+ expect(result.pointsDiscountTotal).toBe(0);
47
+ expect(result.attributedTicketCount).toBe(7);
48
+ });
49
+ it("attributes cash, hybrid, BashPoints-only, and free lines, including a tier added later, with a 0 guest discount", () => {
50
+ const hybrid = {
51
+ ticketTierId: "hybrid",
52
+ pricing: "USD",
53
+ quantity: 1,
54
+ cashSubtotalCents: 3000,
55
+ pointsSubtotal: 100,
56
+ };
57
+ const addedLater = {
58
+ ticketTierId: "tier_added_later",
59
+ pricing: "USD",
60
+ quantity: 4,
61
+ cashSubtotalCents: 4000,
62
+ pointsSubtotal: 0,
63
+ };
64
+ const result = resolvePromoForCart({
65
+ promo: { eligibilityMode: "ALL_TIERS", discountType: "NONE" },
66
+ cartLines: [earlyBird, hybrid, points, free, addedLater],
67
+ now,
68
+ });
69
+ expect(result.status).toBe("applied");
70
+ expect(result.cashDiscountTotalCents).toBe(0);
71
+ expect(result.pointsDiscountTotal).toBe(0);
72
+ expect(result.lines.map((line) => [line.ticketTierId, line.eligible, line.attributedTicketCount])).toEqual([
73
+ ["early", true, 2],
74
+ ["hybrid", true, 1],
75
+ ["points", true, 2],
76
+ ["free", true, 3],
77
+ ["tier_added_later", true, 4],
78
+ ]);
79
+ expect(result.attributedTicketCount).toBe(12);
80
+ });
81
+ it("percentage on selected tiers discounts only those cash lines", () => {
82
+ const result = resolvePromoForCart({
83
+ promo: {
84
+ eligibilityMode: "SELECTED_TIERS",
85
+ eligibleTiers: [{ ticketTierId: "regular" }, { ticketTierId: "vip" }],
86
+ discountType: "PERCENT",
87
+ discountAmountPercentage: 10,
88
+ },
89
+ cartLines: [earlyBird, regular, vip],
90
+ now,
91
+ });
92
+ expect(result.lines.map((l) => [l.ticketTierId, l.cashDiscountCents])).toEqual([
93
+ ["early", 0],
94
+ ["regular", 250],
95
+ ["vip", 750],
96
+ ]);
97
+ expect(result.attributedTicketCount).toBe(2);
98
+ });
99
+ it("percentage leaves BashPoints alone unless the host opts in", () => {
100
+ const off = resolvePromoForCart({
101
+ promo: { eligibilityMode: "ALL_TIERS", discountAmountPercentage: 20 },
102
+ cartLines: [points],
103
+ now,
104
+ });
105
+ expect(off.pointsDiscountTotal).toBe(0);
106
+ expect(off.attributedTicketCount).toBe(2);
107
+ const on = resolvePromoForCart({
108
+ promo: { eligibilityMode: "ALL_TIERS", discountAmountPercentage: 20, discountAppliesToBashPoints: true },
109
+ cartLines: [points],
110
+ now,
111
+ });
112
+ expect(on.pointsDiscountTotal).toBe(200);
113
+ expect(on.lines[0].finalPoints).toBe(800);
114
+ });
115
+ it("fixed cash applies once per order across eligible cash lines, never to points", () => {
116
+ const result = resolvePromoForCart({
117
+ promo: { eligibilityMode: "ALL_TIERS", discountType: "FIXED_CASH", discountAmountInCents: 1000 },
118
+ cartLines: [earlyBird, regular, points],
119
+ now,
120
+ });
121
+ expect(result.cashDiscountTotalCents).toBe(1000);
122
+ expect(result.pointsDiscountTotal).toBe(0);
123
+ const byTier = Object.fromEntries(result.lines.map((l) => [l.ticketTierId, l.cashDiscountCents]));
124
+ expect(byTier).toEqual({ early: 444, regular: 556, points: 0 });
125
+ });
126
+ it("caps a fixed discount at the eligible cash total and floors totals at 0", () => {
127
+ const result = resolvePromoForCart({
128
+ promo: { eligibilityMode: "ALL_TIERS", discountAmountInCents: 99999 },
129
+ cartLines: [regular],
130
+ now,
131
+ });
132
+ expect(result.lines[0].finalCashCents).toBe(0);
133
+ expect(result.cashDiscountTotalCents).toBe(2500);
134
+ });
135
+ it("caps a percentage above 100 at the line price", () => {
136
+ const result = resolvePromoForCart({
137
+ promo: { ticketTierId: "regular", discountAmountPercentage: 150 },
138
+ cartLines: [regular],
139
+ now,
140
+ });
141
+ expect(result.lines[0].cashDiscountCents).toBe(2500);
142
+ });
143
+ it("a legacy single-tier code keeps today's total: whole discount on its one line", () => {
144
+ const result = resolvePromoForCart({
145
+ promo: { ticketTierId: "regular", discountAmountInCents: 500 },
146
+ cartLines: [earlyBird, regular],
147
+ now,
148
+ });
149
+ expect(result.cashDiscountTotalCents).toBe(500);
150
+ expect(result.lines.find((l) => l.ticketTierId === "regular")?.cashDiscountCents).toBe(500);
151
+ });
152
+ it("an all-tiers code covers a tier added after the code was created", () => {
153
+ const result = resolvePromoForCart({
154
+ promo: { eligibilityMode: "ALL_TIERS", discountAmountPercentage: 10 },
155
+ cartLines: [{ ...regular, ticketTierId: "added_later" }],
156
+ now,
157
+ });
158
+ expect(result.lines[0].eligible).toBe(true);
159
+ });
160
+ it("reports not_applicable, expired, and disabled", () => {
161
+ expect(resolvePromoForCart({ promo: { ticketTierId: "vip" }, cartLines: [regular], now }).status).toBe("not_applicable");
162
+ expect(resolvePromoForCart({
163
+ promo: { eligibilityMode: "ALL_TIERS", redeemBy: new Date("2026-10-01") },
164
+ cartLines: [regular],
165
+ now,
166
+ }).status).toBe("expired");
167
+ expect(resolvePromoForCart({
168
+ promo: { eligibilityMode: "ALL_TIERS", disabledAt: now },
169
+ cartLines: [regular],
170
+ now,
171
+ }).status).toBe("disabled");
172
+ });
173
+ });
174
+ //# sourceMappingURL=promoCartEngine.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"promoCartEngine.test.js","sourceRoot":"","sources":["../../src/__tests__/promoCartEngine.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=promoCodeRedemption.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"promoCodeRedemption.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/promoCodeRedemption.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,103 @@
1
+ import { evaluatePromoRedeemability, isPromoCodeRejectReason, normalizePromoRedemptionEmail, pickPromoCodeAmongDuplicates, PROMO_CODE_REJECT_MESSAGES, PROMO_CODE_REJECT_REASONS, } from "../promoCodeRedemption.js";
2
+ const now = new Date("2026-10-14T12:00:00Z");
3
+ function base(overrides = {}) {
4
+ return {
5
+ redeemBy: null,
6
+ disabledAt: null,
7
+ maxRedemptions: null,
8
+ maxUsesPerAccount: null,
9
+ activeOrderCount: 0,
10
+ accountOrderCount: 0,
11
+ now,
12
+ ...overrides,
13
+ };
14
+ }
15
+ describe("evaluatePromoRedeemability", () => {
16
+ it("allows a code with no limits", () => {
17
+ expect(evaluatePromoRedeemability(base())).toBeNull();
18
+ });
19
+ it("rejects a disabled code before anything else", () => {
20
+ expect(evaluatePromoRedeemability(base({ disabledAt: now, redeemBy: new Date("2020-01-01"), activeOrderCount: 99, maxRedemptions: 1 }))).toBe("disabled");
21
+ });
22
+ it("rejects a code past redeemBy and allows one still before it", () => {
23
+ expect(evaluatePromoRedeemability(base({ redeemBy: new Date("2026-10-14T11:59:59Z") }))).toBe("expired");
24
+ expect(evaluatePromoRedeemability(base({ redeemBy: new Date("2026-10-14T12:00:01Z") }))).toBeNull();
25
+ });
26
+ it("counts orders against maxRedemptions: 8 of 10 used leaves room, 10 of 10 is exhausted", () => {
27
+ expect(evaluatePromoRedeemability(base({ maxRedemptions: 10, activeOrderCount: 8 }))).toBeNull();
28
+ expect(evaluatePromoRedeemability(base({ maxRedemptions: 10, activeOrderCount: 10 }))).toBe("exhausted");
29
+ });
30
+ it("treats maxRedemptions 0 or null as unlimited", () => {
31
+ expect(evaluatePromoRedeemability(base({ maxRedemptions: 0, activeOrderCount: 50 }))).toBeNull();
32
+ expect(evaluatePromoRedeemability(base({ maxRedemptions: null, activeOrderCount: 50 }))).toBeNull();
33
+ });
34
+ it("applies the per-account limit only when set", () => {
35
+ expect(evaluatePromoRedeemability(base({ maxUsesPerAccount: 1, accountOrderCount: 1 }))).toBe("already_used");
36
+ expect(evaluatePromoRedeemability(base({ maxUsesPerAccount: 2, accountOrderCount: 1 }))).toBeNull();
37
+ expect(evaluatePromoRedeemability(base({ maxUsesPerAccount: null, accountOrderCount: 9 }))).toBeNull();
38
+ });
39
+ });
40
+ function row(id, overrides = {}) {
41
+ return {
42
+ id,
43
+ ticketTierId: `tier_${id}`,
44
+ promoterId: "promoter_row",
45
+ discountAmountInCents: 500,
46
+ discountAmountPercentage: null,
47
+ redeemBy: null,
48
+ maxRedemptions: null,
49
+ bashPointsRewardPerTicket: null,
50
+ ...overrides,
51
+ };
52
+ }
53
+ describe("pickPromoCodeAmongDuplicates", () => {
54
+ it("returns the only row", () => {
55
+ expect(pickPromoCodeAmongDuplicates([row("b")])).toEqual({ row: row("b") });
56
+ });
57
+ it("picks the oldest id among identical rows", () => {
58
+ const result = pickPromoCodeAmongDuplicates([row("c"), row("a"), row("b")]);
59
+ expect("row" in result && result.row.id).toBe("a");
60
+ });
61
+ it("prefers an identical row whose tier is in the cart", () => {
62
+ const result = pickPromoCodeAmongDuplicates([row("a"), row("b")], ["tier_b"]);
63
+ expect("row" in result && result.row.id).toBe("b");
64
+ });
65
+ it("falls back to the oldest row when no duplicate tier is in the cart", () => {
66
+ const result = pickPromoCodeAmongDuplicates([row("b"), row("a")], ["tier_z"]);
67
+ expect("row" in result && result.row.id).toBe("a");
68
+ });
69
+ it.each([
70
+ ["promoter", { promoterId: "someone_else" }],
71
+ ["discount", { discountAmountInCents: 700 }],
72
+ ["percentage", { discountAmountPercentage: 10, discountAmountInCents: null }],
73
+ ["expiry", { redeemBy: new Date("2027-01-01") }],
74
+ ["limit", { maxRedemptions: 5 }],
75
+ ["BashPoints reward", { bashPointsRewardPerTicket: 25 }],
76
+ ])("asks the host to review duplicates that differ on %s", (_label, diff) => {
77
+ expect(pickPromoCodeAmongDuplicates([row("a"), row("b", diff)])).toEqual({
78
+ reason: "host_review_required",
79
+ });
80
+ });
81
+ it("throws on an empty list", () => {
82
+ expect(() => pickPromoCodeAmongDuplicates([])).toThrow();
83
+ });
84
+ });
85
+ describe("reason helpers", () => {
86
+ it("has a guest message for every reason", () => {
87
+ for (const reason of PROMO_CODE_REJECT_REASONS) {
88
+ expect(PROMO_CODE_REJECT_MESSAGES[reason].length).toBeGreaterThan(0);
89
+ }
90
+ expect(PROMO_CODE_REJECT_MESSAGES.host_review_required).toBe("This code needs the host to review it.");
91
+ });
92
+ it("recognizes reason strings", () => {
93
+ expect(isPromoCodeRejectReason("expired")).toBe(true);
94
+ expect(isPromoCodeRejectReason("nope")).toBe(false);
95
+ expect(isPromoCodeRejectReason(3)).toBe(false);
96
+ });
97
+ it("normalizes emails", () => {
98
+ expect(normalizePromoRedemptionEmail(" Guest@Example.COM ")).toBe("guest@example.com");
99
+ expect(normalizePromoRedemptionEmail(" ")).toBeNull();
100
+ expect(normalizePromoRedemptionEmail(null)).toBeNull();
101
+ });
102
+ });
103
+ //# sourceMappingURL=promoCodeRedemption.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"promoCodeRedemption.test.js","sourceRoot":"","sources":["../../src/__tests__/promoCodeRedemption.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=promoCodeScope.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"promoCodeScope.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/promoCodeScope.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,77 @@
1
+ import { promoCodeAppliesToTier, promoCodeBashEventId, promoCodeDiscountKind, promoCodeEligibleTierIds, getPromoterShareUrl, promoterCodeInputErrors, } from "../promoCodeScope.js";
2
+ describe("promoCodeDiscountKind", () => {
3
+ it("uses the explicit type, else derives it from legacy amounts", () => {
4
+ expect(promoCodeDiscountKind({ discountType: "NONE", discountAmountPercentage: 10 })).toBe("NONE");
5
+ expect(promoCodeDiscountKind({ discountAmountPercentage: 10 })).toBe("PERCENT");
6
+ expect(promoCodeDiscountKind({ discountAmountInCents: 500 })).toBe("FIXED_CASH");
7
+ expect(promoCodeDiscountKind({})).toBe("NONE");
8
+ });
9
+ });
10
+ describe("promoCodeBashEventId", () => {
11
+ it("prefers the row's bash, else the legacy tier's bash", () => {
12
+ expect(promoCodeBashEventId({ bashEventId: "evt_1", ticketTier: { bashEventId: "evt_2" } })).toBe("evt_1");
13
+ expect(promoCodeBashEventId({ ticketTier: { bashEventId: "evt_2" } })).toBe("evt_2");
14
+ expect(promoCodeBashEventId({})).toBeNull();
15
+ });
16
+ });
17
+ describe("promoCodeEligibleTierIds", () => {
18
+ it("returns ALL for an all-tiers code, so tiers added later qualify", () => {
19
+ const allTiers = { eligibilityMode: "ALL_TIERS", ticketTierId: "ga" };
20
+ expect(promoCodeEligibleTierIds(allTiers)).toBe("ALL");
21
+ expect(promoCodeAppliesToTier(allTiers, "tier_added_later")).toBe(true);
22
+ });
23
+ it("uses selected tiers, else the legacy tier", () => {
24
+ expect(promoCodeEligibleTierIds({
25
+ eligibilityMode: "SELECTED_TIERS",
26
+ eligibleTiers: [{ ticketTierId: "ga" }, { ticketTierId: "vip" }, { ticketTierId: "ga" }],
27
+ })).toEqual(["ga", "vip"]);
28
+ expect(promoCodeEligibleTierIds({ ticketTierId: "ga" })).toEqual(["ga"]);
29
+ expect(promoCodeEligibleTierIds({})).toEqual([]);
30
+ expect(promoCodeAppliesToTier({ ticketTierId: "ga" }, "vip")).toBe(false);
31
+ });
32
+ });
33
+ describe("getPromoterShareUrl", () => {
34
+ it("uses the active vanity path when there is one", () => {
35
+ expect(getPromoterShareUrl({
36
+ bashEventId: "evt_1",
37
+ slug: "summer-bash",
38
+ vanityPaths: [
39
+ { segment: "old", status: "Revoked" },
40
+ { segment: "BashFest", status: "Active" },
41
+ ],
42
+ code: " crew 1 ",
43
+ origin: "https://bash.community/",
44
+ })).toBe("https://bash.community/bash/bashfest?promo=CREW%201");
45
+ });
46
+ it("falls back to the id-slug path, never /bashes/", () => {
47
+ const url = getPromoterShareUrl({ bashEventId: "evt_1", slug: "summer-bash", code: "vip" });
48
+ expect(url).toBe("/bash/evt_1-summer-bash?promo=VIP");
49
+ expect(url).not.toContain("/bashes/");
50
+ });
51
+ });
52
+ describe("promoterCodeInputErrors", () => {
53
+ const ok = {
54
+ code: "CREW",
55
+ discountType: "NONE",
56
+ eligibilityMode: "ALL_TIERS",
57
+ };
58
+ it("accepts an attribution-only all-tiers code", () => {
59
+ expect(promoterCodeInputErrors(ok, ["ga"])).toEqual([]);
60
+ });
61
+ it("validates guest percentage 1-100 separately from promoter commission 0-100", () => {
62
+ expect(promoterCodeInputErrors({ ...ok, discountType: "PERCENT", discountValue: 0 }, [])).toContain("Guest discount must be between 1% and 100%.");
63
+ expect(promoterCodeInputErrors({ ...ok, discountType: "PERCENT", discountValue: 100 }, [])).toEqual([]);
64
+ expect(promoterCodeInputErrors({ ...ok, promoterCommissionBps: 0 }, [])).toEqual([]);
65
+ expect(promoterCodeInputErrors({ ...ok, promoterCommissionBps: 10000 }, [])).toEqual([]);
66
+ expect(promoterCodeInputErrors({ ...ok, promoterCommissionBps: 10001 }, [])).toContain("Promoter commission must be between 0% and 100%.");
67
+ });
68
+ it("requires selected tiers on this bash", () => {
69
+ expect(promoterCodeInputErrors({ ...ok, eligibilityMode: "SELECTED_TIERS" }, ["ga"])).toContain("Pick at least one ticket tier.");
70
+ expect(promoterCodeInputErrors({ ...ok, eligibilityMode: "SELECTED_TIERS", eligibleTierIds: ["other"] }, ["ga"])).toContain("A selected tier isn't on this bash.");
71
+ });
72
+ it("blocks saving a promoter code until the reward is reviewed", () => {
73
+ expect(promoterCodeInputErrors({ ...ok, promoterEmail: "p@x.com" }, [])).toContain("Review the promoter reward before saving.");
74
+ expect(promoterCodeInputErrors({ ...ok, promoterEmail: "p@x.com", promoterRewardReviewed: true }, [])).toEqual([]);
75
+ });
76
+ });
77
+ //# sourceMappingURL=promoCodeScope.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"promoCodeScope.test.js","sourceRoot":"","sources":["../../src/__tests__/promoCodeScope.test.ts"],"names":[],"mappings":"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"}
@@ -776,7 +776,9 @@ export declare enum ApiErrorType {
776
776
  /** Host requires waiver / custom terms; buyer did not attest acceptance */
777
777
  EventWaiverNotAccepted = 18,
778
778
  /** Bash is not Published/PreSale. Ticket purchase and checkout creation are blocked */
779
- EventNotAcceptingPurchases = 19
779
+ EventNotAcceptingPurchases = 19,
780
+ /** Promo code can't be used; `code` carries the PromoCodeRejectReason */
781
+ PromoCodeRejected = 20
780
782
  }
781
783
  export type ErrorDataType = Record<RecordKey, unknown>;
782
784
  export declare const StripeErrorToApiErrorType: {