@bash-app/bash-common 30.236.0 → 30.238.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 (180) hide show
  1. package/dist/__tests__/statusEnums.test.js +88 -7
  2. package/dist/__tests__/statusEnums.test.js.map +1 -1
  3. package/dist/definitions.d.ts +39 -8
  4. package/dist/definitions.d.ts.map +1 -1
  5. package/dist/definitions.js +31 -10
  6. package/dist/definitions.js.map +1 -1
  7. package/dist/extendedSchemas.d.ts +6 -0
  8. package/dist/extendedSchemas.d.ts.map +1 -1
  9. package/dist/extendedSchemas.js.map +1 -1
  10. package/dist/index.d.ts +13 -1
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +16 -4
  13. package/dist/index.js.map +1 -1
  14. package/dist/mirroredPrismaEnums.d.ts +145 -0
  15. package/dist/mirroredPrismaEnums.d.ts.map +1 -0
  16. package/dist/mirroredPrismaEnums.js +136 -0
  17. package/dist/mirroredPrismaEnums.js.map +1 -0
  18. package/dist/utils/__tests__/nonprofitUtils.test.d.ts +2 -0
  19. package/dist/utils/__tests__/nonprofitUtils.test.d.ts.map +1 -0
  20. package/dist/utils/__tests__/nonprofitUtils.test.js +84 -0
  21. package/dist/utils/__tests__/nonprofitUtils.test.js.map +1 -0
  22. package/dist/utils/__tests__/paymentUtils.test.js +87 -0
  23. package/dist/utils/__tests__/paymentUtils.test.js.map +1 -1
  24. package/dist/utils/nonprofitUtils.d.ts +21 -0
  25. package/dist/utils/nonprofitUtils.d.ts.map +1 -0
  26. package/dist/utils/nonprofitUtils.js +29 -0
  27. package/dist/utils/nonprofitUtils.js.map +1 -0
  28. package/dist/utils/paymentUtils.d.ts +23 -0
  29. package/dist/utils/paymentUtils.d.ts.map +1 -1
  30. package/dist/utils/paymentUtils.js +24 -7
  31. package/dist/utils/paymentUtils.js.map +1 -1
  32. package/dist/utils/service/__tests__/billingCapUtils.test.d.ts +2 -0
  33. package/dist/utils/service/__tests__/billingCapUtils.test.d.ts.map +1 -0
  34. package/dist/utils/service/__tests__/billingCapUtils.test.js +120 -0
  35. package/dist/utils/service/__tests__/billingCapUtils.test.js.map +1 -0
  36. package/dist/utils/service/__tests__/cancellationPolicyRefundResolver.test.js +1 -1
  37. package/dist/utils/service/__tests__/cancellationPolicyRefundResolver.test.js.map +1 -1
  38. package/dist/utils/service/__tests__/eventPromoterPhase3.test.d.ts +2 -0
  39. package/dist/utils/service/__tests__/eventPromoterPhase3.test.d.ts.map +1 -0
  40. package/dist/utils/service/__tests__/eventPromoterPhase3.test.js +243 -0
  41. package/dist/utils/service/__tests__/eventPromoterPhase3.test.js.map +1 -0
  42. package/dist/utils/service/__tests__/eventPromoterUtils.test.d.ts +2 -0
  43. package/dist/utils/service/__tests__/eventPromoterUtils.test.d.ts.map +1 -0
  44. package/dist/utils/service/__tests__/eventPromoterUtils.test.js +333 -0
  45. package/dist/utils/service/__tests__/eventPromoterUtils.test.js.map +1 -0
  46. package/dist/utils/service/__tests__/offerAllowListUtils.test.d.ts +2 -0
  47. package/dist/utils/service/__tests__/offerAllowListUtils.test.d.ts.map +1 -0
  48. package/dist/utils/service/__tests__/offerAllowListUtils.test.js +52 -0
  49. package/dist/utils/service/__tests__/offerAllowListUtils.test.js.map +1 -0
  50. package/dist/utils/service/__tests__/offerComparisonUtils.test.d.ts +2 -0
  51. package/dist/utils/service/__tests__/offerComparisonUtils.test.d.ts.map +1 -0
  52. package/dist/utils/service/__tests__/offerComparisonUtils.test.js +111 -0
  53. package/dist/utils/service/__tests__/offerComparisonUtils.test.js.map +1 -0
  54. package/dist/utils/service/__tests__/serviceBookingExposureUtils.test.d.ts +2 -0
  55. package/dist/utils/service/__tests__/serviceBookingExposureUtils.test.d.ts.map +1 -0
  56. package/dist/utils/service/__tests__/serviceBookingExposureUtils.test.js +155 -0
  57. package/dist/utils/service/__tests__/serviceBookingExposureUtils.test.js.map +1 -0
  58. package/dist/utils/service/__tests__/unifiedPricingResolver.test.d.ts +2 -0
  59. package/dist/utils/service/__tests__/unifiedPricingResolver.test.d.ts.map +1 -0
  60. package/dist/utils/service/__tests__/unifiedPricingResolver.test.js +77 -0
  61. package/dist/utils/service/__tests__/unifiedPricingResolver.test.js.map +1 -0
  62. package/dist/utils/service/__tests__/venueFBSettlementUtils.test.d.ts +2 -0
  63. package/dist/utils/service/__tests__/venueFBSettlementUtils.test.d.ts.map +1 -0
  64. package/dist/utils/service/__tests__/venueFBSettlementUtils.test.js +157 -0
  65. package/dist/utils/service/__tests__/venueFBSettlementUtils.test.js.map +1 -0
  66. package/dist/utils/service/__tests__/venueSettlementUtils.test.d.ts +2 -0
  67. package/dist/utils/service/__tests__/venueSettlementUtils.test.d.ts.map +1 -0
  68. package/dist/utils/service/__tests__/venueSettlementUtils.test.js +175 -0
  69. package/dist/utils/service/__tests__/venueSettlementUtils.test.js.map +1 -0
  70. package/dist/utils/service/__tests__/volunteerCompensationUtils.test.d.ts +2 -0
  71. package/dist/utils/service/__tests__/volunteerCompensationUtils.test.d.ts.map +1 -0
  72. package/dist/utils/service/__tests__/volunteerCompensationUtils.test.js +118 -0
  73. package/dist/utils/service/__tests__/volunteerCompensationUtils.test.js.map +1 -0
  74. package/dist/utils/service/apiServiceBookingApiUtils.d.ts.map +1 -1
  75. package/dist/utils/service/apiServiceBookingApiUtils.js +4 -0
  76. package/dist/utils/service/apiServiceBookingApiUtils.js.map +1 -1
  77. package/dist/utils/service/billingCapUtils.d.ts +86 -0
  78. package/dist/utils/service/billingCapUtils.d.ts.map +1 -0
  79. package/dist/utils/service/billingCapUtils.js +96 -0
  80. package/dist/utils/service/billingCapUtils.js.map +1 -0
  81. package/dist/utils/service/cancellationPolicyRefundResolver.d.ts +1 -1
  82. package/dist/utils/service/cancellationPolicyRefundResolver.d.ts.map +1 -1
  83. package/dist/utils/service/cancellationPolicyRefundResolver.js +1 -1
  84. package/dist/utils/service/cancellationPolicyRefundResolver.js.map +1 -1
  85. package/dist/utils/service/eventPromoterUtils.d.ts +319 -0
  86. package/dist/utils/service/eventPromoterUtils.d.ts.map +1 -0
  87. package/dist/utils/service/eventPromoterUtils.js +372 -0
  88. package/dist/utils/service/eventPromoterUtils.js.map +1 -0
  89. package/dist/utils/service/offerAllowListUtils.d.ts +42 -0
  90. package/dist/utils/service/offerAllowListUtils.d.ts.map +1 -0
  91. package/dist/utils/service/offerAllowListUtils.js +49 -0
  92. package/dist/utils/service/offerAllowListUtils.js.map +1 -0
  93. package/dist/utils/service/offerComparisonUtils.d.ts +69 -0
  94. package/dist/utils/service/offerComparisonUtils.d.ts.map +1 -0
  95. package/dist/utils/service/offerComparisonUtils.js +110 -0
  96. package/dist/utils/service/offerComparisonUtils.js.map +1 -0
  97. package/dist/utils/service/serviceBookingExposureUtils.d.ts +111 -0
  98. package/dist/utils/service/serviceBookingExposureUtils.d.ts.map +1 -0
  99. package/dist/utils/service/serviceBookingExposureUtils.js +133 -0
  100. package/dist/utils/service/serviceBookingExposureUtils.js.map +1 -0
  101. package/dist/utils/service/serviceBookingTypes.d.ts +1 -1
  102. package/dist/utils/service/serviceBookingTypes.d.ts.map +1 -1
  103. package/dist/utils/service/serviceUtils.d.ts +2 -1
  104. package/dist/utils/service/serviceUtils.d.ts.map +1 -1
  105. package/dist/utils/service/serviceUtils.js +17 -16
  106. package/dist/utils/service/serviceUtils.js.map +1 -1
  107. package/dist/utils/service/unifiedPricingResolver.d.ts +67 -0
  108. package/dist/utils/service/unifiedPricingResolver.d.ts.map +1 -0
  109. package/dist/utils/service/unifiedPricingResolver.js +75 -0
  110. package/dist/utils/service/unifiedPricingResolver.js.map +1 -0
  111. package/dist/utils/service/venueFBSettlementUtils.d.ts +122 -0
  112. package/dist/utils/service/venueFBSettlementUtils.d.ts.map +1 -0
  113. package/dist/utils/service/venueFBSettlementUtils.js +106 -0
  114. package/dist/utils/service/venueFBSettlementUtils.js.map +1 -0
  115. package/dist/utils/service/venueSettlementUtils.d.ts +107 -0
  116. package/dist/utils/service/venueSettlementUtils.d.ts.map +1 -0
  117. package/dist/utils/service/venueSettlementUtils.js +117 -0
  118. package/dist/utils/service/venueSettlementUtils.js.map +1 -0
  119. package/dist/utils/service/volunteerCompensationUtils.d.ts +75 -0
  120. package/dist/utils/service/volunteerCompensationUtils.d.ts.map +1 -0
  121. package/dist/utils/service/volunteerCompensationUtils.js +88 -0
  122. package/dist/utils/service/volunteerCompensationUtils.js.map +1 -0
  123. package/dist/utils/venueLoyalty/__tests__/eligibilityUtils.test.d.ts +2 -0
  124. package/dist/utils/venueLoyalty/__tests__/eligibilityUtils.test.d.ts.map +1 -0
  125. package/dist/utils/venueLoyalty/__tests__/eligibilityUtils.test.js +67 -0
  126. package/dist/utils/venueLoyalty/__tests__/eligibilityUtils.test.js.map +1 -0
  127. package/dist/utils/venueLoyalty/__tests__/redemptionCodeUtils.test.d.ts +2 -0
  128. package/dist/utils/venueLoyalty/__tests__/redemptionCodeUtils.test.d.ts.map +1 -0
  129. package/dist/utils/venueLoyalty/__tests__/redemptionCodeUtils.test.js +71 -0
  130. package/dist/utils/venueLoyalty/__tests__/redemptionCodeUtils.test.js.map +1 -0
  131. package/dist/utils/venueLoyalty/eligibilityUtils.d.ts +33 -0
  132. package/dist/utils/venueLoyalty/eligibilityUtils.d.ts.map +1 -0
  133. package/dist/utils/venueLoyalty/eligibilityUtils.js +49 -0
  134. package/dist/utils/venueLoyalty/eligibilityUtils.js.map +1 -0
  135. package/dist/utils/venueLoyalty/redemptionCodeUtils.d.ts +35 -0
  136. package/dist/utils/venueLoyalty/redemptionCodeUtils.d.ts.map +1 -0
  137. package/dist/utils/venueLoyalty/redemptionCodeUtils.js +74 -0
  138. package/dist/utils/venueLoyalty/redemptionCodeUtils.js.map +1 -0
  139. package/dist/venueLoyaltyRedemption.d.ts +146 -1
  140. package/dist/venueLoyaltyRedemption.d.ts.map +1 -1
  141. package/dist/venueLoyaltyRedemption.js +18 -2
  142. package/dist/venueLoyaltyRedemption.js.map +1 -1
  143. package/package.json +1 -1
  144. package/prisma/schema.prisma +609 -214
  145. package/src/__tests__/statusEnums.test.ts +119 -11
  146. package/src/definitions.ts +57 -14
  147. package/src/extendedSchemas.ts +6 -0
  148. package/src/index.ts +16 -6
  149. package/src/mirroredPrismaEnums.ts +181 -0
  150. package/src/utils/__tests__/nonprofitUtils.test.ts +117 -0
  151. package/src/utils/__tests__/paymentUtils.test.ts +93 -0
  152. package/src/utils/nonprofitUtils.ts +44 -0
  153. package/src/utils/paymentUtils.ts +33 -7
  154. package/src/utils/service/__tests__/billingCapUtils.test.ts +175 -0
  155. package/src/utils/service/__tests__/cancellationPolicyRefundResolver.test.ts +1 -1
  156. package/src/utils/service/__tests__/eventPromoterPhase3.test.ts +296 -0
  157. package/src/utils/service/__tests__/eventPromoterUtils.test.ts +396 -0
  158. package/src/utils/service/__tests__/offerAllowListUtils.test.ts +76 -0
  159. package/src/utils/service/__tests__/offerComparisonUtils.test.ts +124 -0
  160. package/src/utils/service/__tests__/serviceBookingExposureUtils.test.ts +171 -0
  161. package/src/utils/service/__tests__/unifiedPricingResolver.test.ts +83 -0
  162. package/src/utils/service/__tests__/venueSettlementUtils.test.ts +219 -0
  163. package/src/utils/service/__tests__/volunteerCompensationUtils.test.ts +172 -0
  164. package/src/utils/service/apiServiceBookingApiUtils.ts +4 -0
  165. package/src/utils/service/billingCapUtils.ts +145 -0
  166. package/src/utils/service/cancellationPolicyRefundResolver.ts +1 -1
  167. package/src/utils/service/eventPromoterUtils.ts +644 -0
  168. package/src/utils/service/offerAllowListUtils.ts +81 -0
  169. package/src/utils/service/offerComparisonUtils.ts +197 -0
  170. package/src/utils/service/serviceBookingExposureUtils.ts +218 -0
  171. package/src/utils/service/serviceBookingTypes.ts +4 -0
  172. package/src/utils/service/serviceUtils.ts +18 -21
  173. package/src/utils/service/unifiedPricingResolver.ts +149 -0
  174. package/src/utils/service/venueSettlementUtils.ts +198 -0
  175. package/src/utils/service/volunteerCompensationUtils.ts +145 -0
  176. package/src/utils/venueLoyalty/__tests__/eligibilityUtils.test.ts +103 -0
  177. package/src/utils/venueLoyalty/__tests__/redemptionCodeUtils.test.ts +92 -0
  178. package/src/utils/venueLoyalty/eligibilityUtils.ts +84 -0
  179. package/src/utils/venueLoyalty/redemptionCodeUtils.ts +94 -0
  180. package/src/venueLoyaltyRedemption.ts +177 -2
@@ -0,0 +1,333 @@
1
+ import { describe, expect, it } from "@jest/globals";
2
+ import { EVENT_PROMOTER_LATE_CANCEL_HOURS, EVENT_PROMOTER_LATE_CANCEL_PENALTY_FRACTION, EVENT_PROMOTER_LOCKED_PRICING_MODEL, buildIssuePromoCodeDeepLink, computeEventPromoterDepositCents, computeEventPromoterSettlement, decideEventPromoterCancellation, isPerAttendeeLockedPromotionSubType, validateEventPromoterPricing, } from "../eventPromoterUtils.js";
3
+ describe("isPerAttendeeLockedPromotionSubType", () => {
4
+ it("returns true for Promoter subtype", () => {
5
+ expect(isPerAttendeeLockedPromotionSubType("Promoter")).toBe(true);
6
+ });
7
+ it("returns false for other Promotion subtypes", () => {
8
+ expect(isPerAttendeeLockedPromotionSubType("Influencer")).toBe(false);
9
+ expect(isPerAttendeeLockedPromotionSubType("ContentCreator")).toBe(false);
10
+ expect(isPerAttendeeLockedPromotionSubType("CelebrityAppearance")).toBe(false);
11
+ });
12
+ it("returns false for null / undefined / unrelated strings", () => {
13
+ expect(isPerAttendeeLockedPromotionSubType(null)).toBe(false);
14
+ expect(isPerAttendeeLockedPromotionSubType(undefined)).toBe(false);
15
+ expect(isPerAttendeeLockedPromotionSubType("AnythingElse")).toBe(false);
16
+ });
17
+ });
18
+ describe("validateEventPromoterPricing", () => {
19
+ it("passes when subtype is locked and pricing is PER_ATTENDEE", () => {
20
+ expect(validateEventPromoterPricing({
21
+ eventServiceSubType: "Promoter",
22
+ pricingModel: EVENT_PROMOTER_LOCKED_PRICING_MODEL,
23
+ })).toEqual({ ok: true });
24
+ });
25
+ it("rejects PROMOTER + non-PER_ATTENDEE pricing model", () => {
26
+ const result = validateEventPromoterPricing({
27
+ eventServiceSubType: "Promoter",
28
+ pricingModel: "HOURLY",
29
+ });
30
+ expect(result.ok).toBe(false);
31
+ if (!result.ok) {
32
+ expect(result.expected).toEqual([
33
+ "PER_ATTENDEE",
34
+ "PER_PAID_ATTENDEE",
35
+ "PER_BASHPOINTS_ATTENDEE",
36
+ ]);
37
+ expect(result.reason).toContain("PER_ATTENDEE");
38
+ }
39
+ });
40
+ it("rejects PROMOTER + null pricing model", () => {
41
+ const result = validateEventPromoterPricing({
42
+ eventServiceSubType: "Promoter",
43
+ pricingModel: null,
44
+ });
45
+ expect(result.ok).toBe(false);
46
+ });
47
+ it("passes any pricing model for non-Promoter subtypes", () => {
48
+ expect(validateEventPromoterPricing({
49
+ eventServiceSubType: "Influencer",
50
+ pricingModel: "HOURLY",
51
+ })).toEqual({ ok: true });
52
+ expect(validateEventPromoterPricing({
53
+ eventServiceSubType: "ContentCreator",
54
+ pricingModel: "FLAT_FEE",
55
+ })).toEqual({ ok: true });
56
+ });
57
+ });
58
+ describe("computeEventPromoterDepositCents", () => {
59
+ it("returns expected attendees * baseRate when minimum is below expected", () => {
60
+ expect(computeEventPromoterDepositCents({
61
+ bashExpectedAttendees: 200,
62
+ baseRateCents: 500,
63
+ minimumQuantity: 50,
64
+ })).toBe(100_000);
65
+ });
66
+ it("uses minimumQuantity floor when expected is below it", () => {
67
+ expect(computeEventPromoterDepositCents({
68
+ bashExpectedAttendees: 30,
69
+ baseRateCents: 500,
70
+ minimumQuantity: 100,
71
+ })).toBe(50_000);
72
+ });
73
+ it("returns null when baseRateCents is missing or 0", () => {
74
+ expect(computeEventPromoterDepositCents({
75
+ bashExpectedAttendees: 200,
76
+ baseRateCents: null,
77
+ minimumQuantity: 100,
78
+ })).toBeNull();
79
+ expect(computeEventPromoterDepositCents({
80
+ bashExpectedAttendees: 200,
81
+ baseRateCents: 0,
82
+ minimumQuantity: 100,
83
+ })).toBeNull();
84
+ });
85
+ it("treats negative expected attendees as 0", () => {
86
+ expect(computeEventPromoterDepositCents({
87
+ bashExpectedAttendees: -10,
88
+ baseRateCents: 500,
89
+ minimumQuantity: null,
90
+ })).toBe(0);
91
+ });
92
+ });
93
+ describe("computeEventPromoterSettlement", () => {
94
+ const baseInput = {
95
+ baseRateCents: 500,
96
+ expectedAttendeesAtBooking: 200,
97
+ };
98
+ it("returns zero delta when checked-in matches expected exactly", () => {
99
+ const result = computeEventPromoterSettlement({
100
+ ...baseInput,
101
+ totalCheckedInAttendees: 200,
102
+ });
103
+ expect(result.finalCount).toBe(200);
104
+ expect(result.settlementDeltaCents).toBe(0);
105
+ expect(result.totalCents).toBe(100_000);
106
+ expect(result.ceilingHit).toBe(false);
107
+ });
108
+ it("returns positive delta when more attendees show up than expected", () => {
109
+ const result = computeEventPromoterSettlement({
110
+ ...baseInput,
111
+ totalCheckedInAttendees: 250,
112
+ });
113
+ expect(result.finalCount).toBe(250);
114
+ expect(result.settlementDeltaCents).toBe(25_000);
115
+ expect(result.totalCents).toBe(125_000);
116
+ expect(result.ceilingHit).toBe(false);
117
+ });
118
+ it("returns negative delta (refund) when fewer attendees show up", () => {
119
+ const result = computeEventPromoterSettlement({
120
+ ...baseInput,
121
+ totalCheckedInAttendees: 150,
122
+ });
123
+ expect(result.finalCount).toBe(150);
124
+ expect(result.settlementDeltaCents).toBe(-25_000);
125
+ expect(result.totalCents).toBe(75_000);
126
+ });
127
+ it("caps finalCount at maxAttendeesAttributable and sets ceilingHit", () => {
128
+ const result = computeEventPromoterSettlement({
129
+ ...baseInput,
130
+ totalCheckedInAttendees: 500,
131
+ maxAttendeesAttributable: 250,
132
+ });
133
+ expect(result.finalCount).toBe(250);
134
+ expect(result.ceilingHit).toBe(true);
135
+ expect(result.settlementDeltaCents).toBe(25_000);
136
+ });
137
+ it("does not set ceilingHit when checked-in is exactly the ceiling", () => {
138
+ const result = computeEventPromoterSettlement({
139
+ ...baseInput,
140
+ totalCheckedInAttendees: 250,
141
+ maxAttendeesAttributable: 250,
142
+ });
143
+ expect(result.finalCount).toBe(250);
144
+ expect(result.ceilingHit).toBe(false);
145
+ });
146
+ it("applies minimumQuantity floor when checked-in is below it", () => {
147
+ const result = computeEventPromoterSettlement({
148
+ ...baseInput,
149
+ totalCheckedInAttendees: 50,
150
+ minimumQuantity: 100,
151
+ });
152
+ expect(result.finalCount).toBe(100);
153
+ expect(result.settlementDeltaCents).toBe(-50_000);
154
+ });
155
+ it("worked example A: 200 expected / 250 ceiling / 220 checked-in", () => {
156
+ const result = computeEventPromoterSettlement({
157
+ baseRateCents: 500,
158
+ expectedAttendeesAtBooking: 200,
159
+ totalCheckedInAttendees: 220,
160
+ maxAttendeesAttributable: 250,
161
+ });
162
+ expect(result.finalCount).toBe(220);
163
+ expect(result.settlementDeltaCents).toBe(10_000);
164
+ expect(result.ceilingHit).toBe(false);
165
+ });
166
+ it("worked example B: 100 expected / 150 ceiling / 220 checked-in (capped)", () => {
167
+ const result = computeEventPromoterSettlement({
168
+ baseRateCents: 500,
169
+ expectedAttendeesAtBooking: 100,
170
+ totalCheckedInAttendees: 220,
171
+ maxAttendeesAttributable: 150,
172
+ });
173
+ expect(result.finalCount).toBe(150);
174
+ expect(result.settlementDeltaCents).toBe(25_000);
175
+ expect(result.ceilingHit).toBe(true);
176
+ });
177
+ it("treats negative checked-in as 0", () => {
178
+ const result = computeEventPromoterSettlement({
179
+ ...baseInput,
180
+ totalCheckedInAttendees: -10,
181
+ });
182
+ expect(result.finalCount).toBe(0);
183
+ expect(result.settlementDeltaCents).toBe(-100_000);
184
+ });
185
+ it("treats null ceiling as no cap", () => {
186
+ const result = computeEventPromoterSettlement({
187
+ ...baseInput,
188
+ totalCheckedInAttendees: 999,
189
+ maxAttendeesAttributable: null,
190
+ });
191
+ expect(result.finalCount).toBe(999);
192
+ expect(result.ceilingHit).toBe(false);
193
+ });
194
+ });
195
+ describe("buildIssuePromoCodeDeepLink", () => {
196
+ it("includes bashEventId, promoterUserId, and source param", () => {
197
+ const url = buildIssuePromoCodeDeepLink({
198
+ bashEventId: "bash-1",
199
+ promoterUserId: "user-9",
200
+ });
201
+ expect(url).toContain("/bashes/bash-1/edit");
202
+ expect(url).toContain("step=how");
203
+ expect(url).toContain("open=promo-codes");
204
+ expect(url).toContain("promoterUserId=user-9");
205
+ expect(url).toContain("source=event-promoter-booking");
206
+ expect(url).not.toContain("ticketTierId=");
207
+ });
208
+ it("adds ticketTierId when provided", () => {
209
+ const url = buildIssuePromoCodeDeepLink({
210
+ bashEventId: "bash-1",
211
+ promoterUserId: "user-9",
212
+ ticketTierId: "tier-42",
213
+ });
214
+ expect(url).toContain("ticketTierId=tier-42");
215
+ });
216
+ it("omits ticketTierId when null/undefined", () => {
217
+ const urlNull = buildIssuePromoCodeDeepLink({
218
+ bashEventId: "bash-1",
219
+ promoterUserId: "user-9",
220
+ ticketTierId: null,
221
+ });
222
+ const urlUndef = buildIssuePromoCodeDeepLink({
223
+ bashEventId: "bash-1",
224
+ promoterUserId: "user-9",
225
+ });
226
+ expect(urlNull).not.toContain("ticketTierId=");
227
+ expect(urlUndef).not.toContain("ticketTierId=");
228
+ });
229
+ });
230
+ describe("decideEventPromoterCancellation", () => {
231
+ const HOUR = 60 * 60 * 1000;
232
+ const now = Date.parse("2026-05-12T12:00:00Z");
233
+ it("blocks any cancellation once the booking is settled", () => {
234
+ const result = decideEventPromoterCancellation({
235
+ who: "host",
236
+ nowMs: now,
237
+ bashStartMs: now + 100 * HOUR,
238
+ bashEndMs: now + 105 * HOUR,
239
+ depositCents: 100_000,
240
+ alreadySettled: true,
241
+ });
242
+ expect(result.allow).toBe(false);
243
+ expect(result.outcome).toBe("Blocked");
244
+ expect(result.refundCents).toBe(0);
245
+ });
246
+ it("host: full refund when bash is far in the future", () => {
247
+ const result = decideEventPromoterCancellation({
248
+ who: "host",
249
+ nowMs: now,
250
+ bashStartMs: now + 100 * HOUR,
251
+ bashEndMs: now + 105 * HOUR,
252
+ depositCents: 100_000,
253
+ alreadySettled: false,
254
+ });
255
+ expect(result.allow).toBe(true);
256
+ expect(result.outcome).toBe("FullRefund");
257
+ expect(result.refundCents).toBe(100_000);
258
+ expect(result.penaltyFraction).toBe(0);
259
+ });
260
+ it("host: partial refund inside the late-cancel window", () => {
261
+ const result = decideEventPromoterCancellation({
262
+ who: "host",
263
+ nowMs: now,
264
+ bashStartMs: now + (EVENT_PROMOTER_LATE_CANCEL_HOURS - 6) * HOUR,
265
+ bashEndMs: now + (EVENT_PROMOTER_LATE_CANCEL_HOURS - 1) * HOUR,
266
+ depositCents: 100_000,
267
+ alreadySettled: false,
268
+ });
269
+ expect(result.outcome).toBe("PartialRefund");
270
+ expect(result.penaltyFraction).toBe(EVENT_PROMOTER_LATE_CANCEL_PENALTY_FRACTION);
271
+ expect(result.refundCents).toBe(75_000);
272
+ });
273
+ it("host: NoRefund once the bash has started — settlement handles money", () => {
274
+ const result = decideEventPromoterCancellation({
275
+ who: "host",
276
+ nowMs: now,
277
+ bashStartMs: now - 1 * HOUR,
278
+ bashEndMs: now + 4 * HOUR,
279
+ depositCents: 100_000,
280
+ alreadySettled: false,
281
+ });
282
+ expect(result.allow).toBe(false);
283
+ expect(result.outcome).toBe("NoRefund");
284
+ });
285
+ it("promoter: full refund any time before the bash starts", () => {
286
+ const result = decideEventPromoterCancellation({
287
+ who: "promoter",
288
+ nowMs: now,
289
+ bashStartMs: now + 3 * HOUR,
290
+ bashEndMs: now + 8 * HOUR,
291
+ depositCents: 100_000,
292
+ alreadySettled: false,
293
+ });
294
+ expect(result.allow).toBe(true);
295
+ expect(result.outcome).toBe("FullRefund");
296
+ expect(result.refundCents).toBe(100_000);
297
+ });
298
+ it("promoter: blocked once the bash has started", () => {
299
+ const result = decideEventPromoterCancellation({
300
+ who: "promoter",
301
+ nowMs: now,
302
+ bashStartMs: now - 1 * HOUR,
303
+ bashEndMs: now + 4 * HOUR,
304
+ depositCents: 100_000,
305
+ alreadySettled: false,
306
+ });
307
+ expect(result.allow).toBe(false);
308
+ expect(result.outcome).toBe("Blocked");
309
+ });
310
+ it("admin: always allowed, full refund before bash, NoRefund after", () => {
311
+ const before = decideEventPromoterCancellation({
312
+ who: "admin",
313
+ nowMs: now,
314
+ bashStartMs: now + 100 * HOUR,
315
+ bashEndMs: now + 105 * HOUR,
316
+ depositCents: 100_000,
317
+ alreadySettled: false,
318
+ });
319
+ expect(before.allow).toBe(true);
320
+ expect(before.outcome).toBe("FullRefund");
321
+ const after = decideEventPromoterCancellation({
322
+ who: "admin",
323
+ nowMs: now,
324
+ bashStartMs: now - 5 * HOUR,
325
+ bashEndMs: now - 1 * HOUR,
326
+ depositCents: 100_000,
327
+ alreadySettled: false,
328
+ });
329
+ expect(after.allow).toBe(true);
330
+ expect(after.outcome).toBe("NoRefund");
331
+ });
332
+ });
333
+ //# sourceMappingURL=eventPromoterUtils.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eventPromoterUtils.test.js","sourceRoot":"","sources":["../../../../src/utils/service/__tests__/eventPromoterUtils.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=offerAllowListUtils.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"offerAllowListUtils.test.d.ts","sourceRoot":"","sources":["../../../../src/utils/service/__tests__/offerAllowListUtils.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,52 @@
1
+ import { describe, expect, it } from "@jest/globals";
2
+ import { DEFAULT_PRICING_MODEL_ALLOW_LIST_BY_SERVICE_TYPE, validateOfferAgainstAllowList, } from "../offerAllowListUtils.js";
3
+ describe("validateOfferAgainstAllowList", () => {
4
+ it("passes when allow-list is empty (no host restriction)", () => {
5
+ expect(validateOfferAgainstAllowList({
6
+ offered: "PER_ATTENDEE",
7
+ allowList: [],
8
+ }).ok).toBe(true);
9
+ expect(validateOfferAgainstAllowList({
10
+ offered: "FLAT_FEE",
11
+ allowList: null,
12
+ }).ok).toBe(true);
13
+ });
14
+ it("passes when offered model is on the allow-list", () => {
15
+ expect(validateOfferAgainstAllowList({
16
+ offered: "PER_PAID_ATTENDEE",
17
+ allowList: ["FLAT_FEE", "PER_PAID_ATTENDEE"],
18
+ }).ok).toBe(true);
19
+ });
20
+ it("rejects when offered model is NOT on the allow-list", () => {
21
+ const r = validateOfferAgainstAllowList({
22
+ offered: "PER_BASHPOINTS_ATTENDEE",
23
+ allowList: ["FLAT_FEE", "PER_PAID_ATTENDEE"],
24
+ });
25
+ expect(r.ok).toBe(false);
26
+ if (!r.ok) {
27
+ expect(r.reason).toContain("FLAT_FEE");
28
+ expect(r.reason).toContain("PER_BASHPOINTS_ATTENDEE");
29
+ }
30
+ });
31
+ it("rejects when offered is missing", () => {
32
+ const r = validateOfferAgainstAllowList({
33
+ offered: null,
34
+ allowList: ["FLAT_FEE"],
35
+ });
36
+ expect(r.ok).toBe(false);
37
+ if (!r.ok)
38
+ expect(r.reason).toMatch(/missing/);
39
+ });
40
+ });
41
+ describe("DEFAULT_PRICING_MODEL_ALLOW_LIST_BY_SERVICE_TYPE", () => {
42
+ it("has a default for every service vertical the wizard ships", () => {
43
+ expect(DEFAULT_PRICING_MODEL_ALLOW_LIST_BY_SERVICE_TYPE.Vendors.length).toBeGreaterThan(0);
44
+ expect(DEFAULT_PRICING_MODEL_ALLOW_LIST_BY_SERVICE_TYPE.Exhibitors.length).toBeGreaterThan(0);
45
+ expect(DEFAULT_PRICING_MODEL_ALLOW_LIST_BY_SERVICE_TYPE.Sponsors.length).toBeGreaterThan(0);
46
+ expect(DEFAULT_PRICING_MODEL_ALLOW_LIST_BY_SERVICE_TYPE.Venues.length).toBeGreaterThan(0);
47
+ expect(DEFAULT_PRICING_MODEL_ALLOW_LIST_BY_SERVICE_TYPE.EntertainmentServices
48
+ .length).toBeGreaterThan(0);
49
+ expect(DEFAULT_PRICING_MODEL_ALLOW_LIST_BY_SERVICE_TYPE.EventServices.length).toBeGreaterThan(0);
50
+ });
51
+ });
52
+ //# sourceMappingURL=offerAllowListUtils.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"offerAllowListUtils.test.js","sourceRoot":"","sources":["../../../../src/utils/service/__tests__/offerAllowListUtils.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=offerComparisonUtils.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"offerComparisonUtils.test.d.ts","sourceRoot":"","sources":["../../../../src/utils/service/__tests__/offerComparisonUtils.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,111 @@
1
+ import { describe, expect, it } from "@jest/globals";
2
+ import { computeOfferComparisonBands } from "../offerComparisonUtils.js";
3
+ describe("computeOfferComparisonBands FLAT family", () => {
4
+ it("returns identical bands for FLAT_FEE", () => {
5
+ const r = computeOfferComparisonBands({
6
+ pricingModel: "FLAT_FEE",
7
+ flatRateCents: 50_000,
8
+ });
9
+ expect(r.expectedTotalCents).toBe(50_000);
10
+ expect(r.worstCaseCents).toBe(50_000);
11
+ expect(r.bestCaseCents).toBe(50_000);
12
+ expect(r.reasoning).toContain("Fixed price");
13
+ });
14
+ it("HOURLY and PER_DAY treated as flat", () => {
15
+ expect(computeOfferComparisonBands({
16
+ pricingModel: "HOURLY",
17
+ baseRateCents: 15_000,
18
+ }).expectedTotalCents).toBe(15_000);
19
+ expect(computeOfferComparisonBands({
20
+ pricingModel: "PER_DAY",
21
+ baseRateCents: 40_000,
22
+ }).expectedTotalCents).toBe(40_000);
23
+ });
24
+ });
25
+ describe("computeOfferComparisonBands PER_ATTENDEE family", () => {
26
+ it("expects rate * expected, applies minimum floor", () => {
27
+ const r = computeOfferComparisonBands({
28
+ pricingModel: "PER_ATTENDEE",
29
+ baseRateCents: 500,
30
+ expectedAttendees: 200,
31
+ minimumQuantity: 100,
32
+ minimumChargeCents: 70_000,
33
+ });
34
+ expect(r.expectedTotalCents).toBe(100_000);
35
+ expect(r.bestCaseCents).toBeGreaterThanOrEqual(70_000);
36
+ });
37
+ it("worst case respects maxBillableCents when present", () => {
38
+ const r = computeOfferComparisonBands({
39
+ pricingModel: "PER_PAID_ATTENDEE",
40
+ baseRateCents: 500,
41
+ expectedAttendees: 200,
42
+ maxBillableCents: 200_000,
43
+ });
44
+ expect(r.worstCaseCents).toBe(200_000);
45
+ });
46
+ it("worst case defaults to 1.5x when no cap", () => {
47
+ const r = computeOfferComparisonBands({
48
+ pricingModel: "PER_ATTENDEE",
49
+ baseRateCents: 500,
50
+ expectedAttendees: 200,
51
+ });
52
+ expect(r.worstCaseCents).toBe(Math.round(200 * 500 * 1.5));
53
+ });
54
+ });
55
+ describe("computeOfferComparisonBands PER_BASHPOINTS_ATTENDEE", () => {
56
+ it("returns BP bands only, USD bands null", () => {
57
+ const r = computeOfferComparisonBands({
58
+ pricingModel: "PER_BASHPOINTS_ATTENDEE",
59
+ baseRateBashPoints: 10,
60
+ expectedAttendees: 200,
61
+ minimumQuantity: 100,
62
+ });
63
+ expect(r.expectedTotalCents).toBeNull();
64
+ expect(r.expectedTotalBp).toBe(2000);
65
+ expect(r.bestCaseBp).toBe(1000);
66
+ });
67
+ });
68
+ describe("computeOfferComparisonBands revenue-share", () => {
69
+ it("expected = basis * pct; worst case zero", () => {
70
+ const r = computeOfferComparisonBands({
71
+ pricingModel: "TICKET_REVENUE_PERCENTAGE",
72
+ expectedBasisCents: 1_000_000,
73
+ percentage: 30,
74
+ });
75
+ expect(r.expectedTotalCents).toBe(300_000);
76
+ expect(r.bestCaseCents).toBe(300_000);
77
+ expect(r.worstCaseCents).toBe(0);
78
+ });
79
+ it("clamps percentage", () => {
80
+ const r = computeOfferComparisonBands({
81
+ pricingModel: "PRODUCT_SALES_PERCENTAGE",
82
+ expectedBasisCents: 1_000_000,
83
+ percentage: 200,
84
+ });
85
+ expect(r.expectedTotalCents).toBe(1_000_000);
86
+ });
87
+ });
88
+ describe("computeOfferComparisonBands TIERED", () => {
89
+ it("uses chosen tier as expected, low/high for bands", () => {
90
+ const r = computeOfferComparisonBands({
91
+ pricingModel: "TIERED",
92
+ tieredExpectedTierCents: 200_000,
93
+ tieredLowestTierCents: 100_000,
94
+ tieredHighestTierCents: 500_000,
95
+ });
96
+ expect(r.expectedTotalCents).toBe(200_000);
97
+ expect(r.bestCaseCents).toBe(100_000);
98
+ expect(r.worstCaseCents).toBe(500_000);
99
+ });
100
+ });
101
+ describe("computeOfferComparisonBands fallback", () => {
102
+ it("treats unknown model as flat", () => {
103
+ const r = computeOfferComparisonBands({
104
+ pricingModel: "MYSTERY_MODEL",
105
+ baseRateCents: 30_000,
106
+ });
107
+ expect(r.expectedTotalCents).toBe(30_000);
108
+ expect(r.reasoning).toContain("Unrecognized");
109
+ });
110
+ });
111
+ //# sourceMappingURL=offerComparisonUtils.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"offerComparisonUtils.test.js","sourceRoot":"","sources":["../../../../src/utils/service/__tests__/offerComparisonUtils.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=serviceBookingExposureUtils.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serviceBookingExposureUtils.test.d.ts","sourceRoot":"","sources":["../../../../src/utils/service/__tests__/serviceBookingExposureUtils.test.ts"],"names":[],"mappings":""}