@bash-app/bash-common 30.385.0 → 30.391.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 (56) hide show
  1. package/dist/__tests__/scenePulse.test.d.ts +2 -0
  2. package/dist/__tests__/scenePulse.test.d.ts.map +1 -0
  3. package/dist/__tests__/scenePulse.test.js +52 -0
  4. package/dist/__tests__/scenePulse.test.js.map +1 -0
  5. package/dist/definitions.d.ts +19 -13
  6. package/dist/definitions.d.ts.map +1 -1
  7. package/dist/definitions.js +13 -12
  8. package/dist/definitions.js.map +1 -1
  9. package/dist/extendedSchemas.d.ts +22 -0
  10. package/dist/extendedSchemas.d.ts.map +1 -1
  11. package/dist/extendedSchemas.js +17 -0
  12. package/dist/extendedSchemas.js.map +1 -1
  13. package/dist/index.d.ts +3 -1
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js +3 -1
  16. package/dist/index.js.map +1 -1
  17. package/dist/scenePulse.d.ts +66 -0
  18. package/dist/scenePulse.d.ts.map +1 -0
  19. package/dist/scenePulse.js +54 -0
  20. package/dist/scenePulse.js.map +1 -0
  21. package/dist/utils/__tests__/paymentUtils.test.js +28 -1
  22. package/dist/utils/__tests__/paymentUtils.test.js.map +1 -1
  23. package/dist/utils/__tests__/serviceAvailabilityDisplay.test.js +56 -1
  24. package/dist/utils/__tests__/serviceAvailabilityDisplay.test.js.map +1 -1
  25. package/dist/utils/__tests__/slugUtils.test.js +5 -3
  26. package/dist/utils/__tests__/slugUtils.test.js.map +1 -1
  27. package/dist/utils/paymentUtils.d.ts +18 -1
  28. package/dist/utils/paymentUtils.d.ts.map +1 -1
  29. package/dist/utils/paymentUtils.js +29 -2
  30. package/dist/utils/paymentUtils.js.map +1 -1
  31. package/dist/utils/service/__tests__/foodAndBeverageQuote.test.d.ts +2 -0
  32. package/dist/utils/service/__tests__/foodAndBeverageQuote.test.d.ts.map +1 -0
  33. package/dist/utils/service/__tests__/foodAndBeverageQuote.test.js +353 -0
  34. package/dist/utils/service/__tests__/foodAndBeverageQuote.test.js.map +1 -0
  35. package/dist/utils/service/foodAndBeverageQuote.d.ts +171 -0
  36. package/dist/utils/service/foodAndBeverageQuote.d.ts.map +1 -0
  37. package/dist/utils/service/foodAndBeverageQuote.js +467 -0
  38. package/dist/utils/service/foodAndBeverageQuote.js.map +1 -0
  39. package/dist/utils/serviceAvailabilityDisplay.d.ts +28 -2
  40. package/dist/utils/serviceAvailabilityDisplay.d.ts.map +1 -1
  41. package/dist/utils/serviceAvailabilityDisplay.js +39 -0
  42. package/dist/utils/serviceAvailabilityDisplay.js.map +1 -1
  43. package/package.json +1 -1
  44. package/prisma/schema.prisma +95 -4
  45. package/src/__tests__/scenePulse.test.ts +69 -0
  46. package/src/definitions.ts +18 -12
  47. package/src/extendedSchemas.ts +23 -0
  48. package/src/index.ts +6 -0
  49. package/src/scenePulse.ts +113 -0
  50. package/src/utils/__tests__/paymentUtils.test.ts +36 -0
  51. package/src/utils/__tests__/serviceAvailabilityDisplay.test.ts +73 -0
  52. package/src/utils/__tests__/slugUtils.test.ts +5 -3
  53. package/src/utils/paymentUtils.ts +47 -2
  54. package/src/utils/service/__tests__/foodAndBeverageQuote.test.ts +502 -0
  55. package/src/utils/service/foodAndBeverageQuote.ts +613 -0
  56. package/src/utils/serviceAvailabilityDisplay.ts +82 -2
@@ -0,0 +1,353 @@
1
+ import { CELEBRATION_CAKE_FLAVORS, EVENT_SERVICE_FULFILLMENT_MODES, celebrationCakeStartingPriceLabel, encodeCakeOption, filterCelebrationCakeFulfillmentModes, filterFulfillmentModes, foodAndBeverageLeadTimeLabel, foodAndBeverageQuoteCents, foodAndBeverageRateSummary, getFoodAndBeverageMenuCategories, isBelowGuestMinimum, GRAZING_TABLE_STYLES, encodeGrazingOption, grazingTableStartingPriceLabel, isCelebrationCakeEventService, isCelebrationCakeFulfillmentMode, isFoodAndBeverageEventService, isFulfillmentMode, isGrazingTableEventService, isOfficiantEventService, isPackagePricedFoodEventService, isPerGuestFoodAndBeverageEventService, packagePricedFoodStartingPriceLabel, parseCakeOptions, parseGrazingOptions, quotedGuestCount, serializeCakeOptions, serializeGrazingOptions, } from "../foodAndBeverageQuote.js";
2
+ describe("isFoodAndBeverageEventService", () => {
3
+ it("returns true for FoodAndBeverage eventServiceType", () => {
4
+ expect(isFoodAndBeverageEventService({ eventServiceType: "FoodAndBeverage" })).toBe(true);
5
+ });
6
+ it("returns true for canonical subtype even without eventServiceType", () => {
7
+ expect(isFoodAndBeverageEventService({ eventServiceSubType: "Caterer" })).toBe(true);
8
+ expect(isFoodAndBeverageEventService({ eventServiceSubType: "DessertBar" })).toBe(true);
9
+ expect(isFoodAndBeverageEventService({ eventServiceSubType: "CelebrationCake" })).toBe(true);
10
+ expect(isFoodAndBeverageEventService({ eventServiceSubType: "GrazingTable" })).toBe(true);
11
+ });
12
+ it("returns true for legacy/alias subtypes", () => {
13
+ expect(isFoodAndBeverageEventService({ eventServiceSubType: "PrivateChef" })).toBe(true);
14
+ expect(isFoodAndBeverageEventService({ eventServiceSubType: "Bartender" })).toBe(true);
15
+ });
16
+ it("returns false for unrelated types", () => {
17
+ expect(isFoodAndBeverageEventService({ eventServiceType: "EventPlanningAndManagement" })).toBe(false);
18
+ expect(isFoodAndBeverageEventService({ eventServiceSubType: "EventPlanner" })).toBe(false);
19
+ });
20
+ it("returns false when both are null/undefined", () => {
21
+ expect(isFoodAndBeverageEventService({})).toBe(false);
22
+ expect(isFoodAndBeverageEventService({ eventServiceType: null, eventServiceSubType: null })).toBe(false);
23
+ });
24
+ });
25
+ describe("EVENT_SERVICE_FULFILLMENT_MODES", () => {
26
+ it("contains Pickup, Delivery, and FullService", () => {
27
+ expect(EVENT_SERVICE_FULFILLMENT_MODES).toContain("Pickup");
28
+ expect(EVENT_SERVICE_FULFILLMENT_MODES).toContain("Delivery");
29
+ expect(EVENT_SERVICE_FULFILLMENT_MODES).toContain("FullService");
30
+ expect(EVENT_SERVICE_FULFILLMENT_MODES).toHaveLength(3);
31
+ });
32
+ });
33
+ describe("getFoodAndBeverageMenuCategories", () => {
34
+ it("returns Caterer chips for Caterer subtype", () => {
35
+ const chips = getFoodAndBeverageMenuCategories("Caterer");
36
+ expect(chips).toContain("Salads");
37
+ expect(chips).toContain("Mains");
38
+ expect(chips).toContain("Sides");
39
+ });
40
+ it("returns DessertBar chips for DessertBar subtype", () => {
41
+ const chips = getFoodAndBeverageMenuCategories("DessertBar");
42
+ expect(chips).toContain("Cakes");
43
+ expect(chips).toContain("Cupcakes");
44
+ });
45
+ it("falls back to generic chips for unknown subtypes", () => {
46
+ const chips = getFoodAndBeverageMenuCategories("SomeUnknownType");
47
+ expect(chips.length).toBeGreaterThan(0);
48
+ expect(chips).toContain("Mains");
49
+ });
50
+ it("returns generic chips for null subtype", () => {
51
+ const chips = getFoodAndBeverageMenuCategories(null);
52
+ expect(chips.length).toBeGreaterThan(0);
53
+ });
54
+ });
55
+ describe("quotedGuestCount", () => {
56
+ it("returns headcount when no minimum is set", () => {
57
+ expect(quotedGuestCount(80)).toBe(80);
58
+ expect(quotedGuestCount(80, null)).toBe(80);
59
+ expect(quotedGuestCount(80, 0)).toBe(80);
60
+ });
61
+ it("returns headcount when above minimum", () => {
62
+ expect(quotedGuestCount(80, 25)).toBe(80);
63
+ });
64
+ it("floors to minimum when headcount is below", () => {
65
+ expect(quotedGuestCount(10, 25)).toBe(25);
66
+ expect(quotedGuestCount(0, 25)).toBe(25);
67
+ });
68
+ it("returns minimum exactly when headcount equals minimum", () => {
69
+ expect(quotedGuestCount(25, 25)).toBe(25);
70
+ });
71
+ it("never returns a negative count", () => {
72
+ expect(quotedGuestCount(-5)).toBe(0);
73
+ });
74
+ });
75
+ describe("foodAndBeverageQuoteCents", () => {
76
+ it("calculates basic per-guest price", () => {
77
+ // $18/guest × 100 guests = $1,800
78
+ expect(foodAndBeverageQuoteCents({ baseRateCents: 1800, headcount: 100 })).toBe(180000);
79
+ });
80
+ it("floors headcount at minimumQuantity", () => {
81
+ // $18/guest × min 25 guests; host enters 10 → billed for 25
82
+ expect(foodAndBeverageQuoteCents({
83
+ baseRateCents: 1800,
84
+ headcount: 10,
85
+ minimumQuantity: 25,
86
+ })).toBe(1800 * 25);
87
+ });
88
+ it("does not floor when headcount is above minimum", () => {
89
+ expect(foodAndBeverageQuoteCents({
90
+ baseRateCents: 1800,
91
+ headcount: 80,
92
+ minimumQuantity: 25,
93
+ })).toBe(1800 * 80);
94
+ });
95
+ it("applies minimumChargeCents dollar floor after guest floor", () => {
96
+ // $8/guest × 25 guests (floored from 5) = $200. Min charge $500 → $500.
97
+ expect(foodAndBeverageQuoteCents({
98
+ baseRateCents: 800,
99
+ headcount: 5,
100
+ minimumQuantity: 25,
101
+ minimumChargeCents: 50000,
102
+ })).toBe(50000);
103
+ });
104
+ it("dollar floor does not fire when rate total already exceeds it", () => {
105
+ // $18/guest × 50 guests = $900 > $500 min charge
106
+ expect(foodAndBeverageQuoteCents({
107
+ baseRateCents: 1800,
108
+ headcount: 50,
109
+ minimumQuantity: 25,
110
+ minimumChargeCents: 50000,
111
+ })).toBe(1800 * 50);
112
+ });
113
+ it("returns 0 for zero baseRate", () => {
114
+ expect(foodAndBeverageQuoteCents({ baseRateCents: 0, headcount: 100 })).toBe(0);
115
+ });
116
+ it("returns 0 for negative headcount", () => {
117
+ expect(foodAndBeverageQuoteCents({ baseRateCents: 1800, headcount: -1 })).toBe(0);
118
+ });
119
+ });
120
+ describe("foodAndBeverageRateSummary", () => {
121
+ it("formats without a minimum", () => {
122
+ const result = foodAndBeverageRateSummary(1800);
123
+ expect(result).toBe("$18 / guest");
124
+ });
125
+ it("formats with a minimum", () => {
126
+ const result = foodAndBeverageRateSummary(1800, 25);
127
+ expect(result).toBe("$18 / guest · min 25 guests");
128
+ });
129
+ it("formats cents correctly", () => {
130
+ const result = foodAndBeverageRateSummary(1850);
131
+ expect(result).toBe("$18.50 / guest");
132
+ });
133
+ });
134
+ describe("foodAndBeverageLeadTimeLabel", () => {
135
+ it("returns null for falsy inputs", () => {
136
+ expect(foodAndBeverageLeadTimeLabel(null)).toBeNull();
137
+ expect(foodAndBeverageLeadTimeLabel(0)).toBeNull();
138
+ expect(foodAndBeverageLeadTimeLabel(undefined)).toBeNull();
139
+ });
140
+ it("formats days when not divisible by 7", () => {
141
+ expect(foodAndBeverageLeadTimeLabel(1)).toBe("Needs 1 day notice");
142
+ expect(foodAndBeverageLeadTimeLabel(5)).toBe("Needs 5 days notice");
143
+ expect(foodAndBeverageLeadTimeLabel(10)).toBe("Needs 10 days notice");
144
+ });
145
+ it("formats weeks when divisible by 7", () => {
146
+ expect(foodAndBeverageLeadTimeLabel(7)).toBe("Needs 1 week notice");
147
+ expect(foodAndBeverageLeadTimeLabel(14)).toBe("Needs 2 weeks notice");
148
+ });
149
+ });
150
+ describe("package-priced food detection", () => {
151
+ it("treats cake and grazing as package-priced, not per-guest", () => {
152
+ expect(isPackagePricedFoodEventService({ eventServiceSubType: "CelebrationCake" })).toBe(true);
153
+ expect(isPackagePricedFoodEventService({ eventServiceSubType: "GrazingTable" })).toBe(true);
154
+ expect(isPackagePricedFoodEventService({ eventServiceSubType: "Caterer" })).toBe(false);
155
+ expect(isPackagePricedFoodEventService({})).toBe(false);
156
+ });
157
+ it("isPerGuestFoodAndBeverage is false for cake and grazing", () => {
158
+ expect(isPerGuestFoodAndBeverageEventService({
159
+ eventServiceType: "FoodAndBeverage",
160
+ eventServiceSubType: "CelebrationCake",
161
+ })).toBe(false);
162
+ expect(isPerGuestFoodAndBeverageEventService({
163
+ eventServiceType: "FoodAndBeverage",
164
+ eventServiceSubType: "GrazingTable",
165
+ })).toBe(false);
166
+ expect(isPerGuestFoodAndBeverageEventService({
167
+ eventServiceType: "FoodAndBeverage",
168
+ eventServiceSubType: "Caterer",
169
+ })).toBe(true);
170
+ });
171
+ it("isGrazingTableEventService is true only for GrazingTable", () => {
172
+ expect(isGrazingTableEventService({ eventServiceSubType: "GrazingTable" })).toBe(true);
173
+ expect(isGrazingTableEventService({ eventServiceSubType: "CelebrationCake" })).toBe(false);
174
+ expect(isGrazingTableEventService({})).toBe(false);
175
+ });
176
+ it("isOfficiantEventService is true only for Officiant", () => {
177
+ expect(isOfficiantEventService({ eventServiceSubType: "Officiant" })).toBe(true);
178
+ expect(isOfficiantEventService({ eventServiceSubType: "HostingSupportOther" })).toBe(false);
179
+ expect(isFoodAndBeverageEventService({ eventServiceSubType: "Officiant" })).toBe(false);
180
+ });
181
+ });
182
+ describe("isCelebrationCakeEventService", () => {
183
+ it("returns true only for CelebrationCake", () => {
184
+ expect(isCelebrationCakeEventService({ eventServiceSubType: "CelebrationCake" })).toBe(true);
185
+ expect(isCelebrationCakeEventService({ eventServiceSubType: "Caterer" })).toBe(false);
186
+ expect(isCelebrationCakeEventService({ eventServiceSubType: "DessertBar" })).toBe(false);
187
+ expect(isCelebrationCakeEventService({})).toBe(false);
188
+ expect(isCelebrationCakeEventService({ eventServiceSubType: null })).toBe(false);
189
+ });
190
+ });
191
+ describe("parseCakeOptions", () => {
192
+ it("returns empty groups for null or empty input", () => {
193
+ expect(parseCakeOptions(null)).toEqual({
194
+ flavors: [],
195
+ frostings: [],
196
+ fillings: [],
197
+ dietary: [],
198
+ other: [],
199
+ });
200
+ expect(parseCakeOptions([])).toEqual({
201
+ flavors: [],
202
+ frostings: [],
203
+ fillings: [],
204
+ dietary: [],
205
+ other: [],
206
+ });
207
+ });
208
+ it("splits prefixed chips and keeps unprefixed leftovers", () => {
209
+ const parsed = parseCakeOptions([
210
+ "flavor:Red Velvet",
211
+ "frosting:Chocolate Buttercream",
212
+ "filling:Lemon Custard",
213
+ "dietary:Gluten-Free",
214
+ "Desserts",
215
+ ]);
216
+ expect(parsed.flavors).toEqual(["Red Velvet"]);
217
+ expect(parsed.frostings).toEqual(["Chocolate Buttercream"]);
218
+ expect(parsed.fillings).toEqual(["Lemon Custard"]);
219
+ expect(parsed.dietary).toEqual(["Gluten-Free"]);
220
+ expect(parsed.other).toEqual(["Desserts"]);
221
+ });
222
+ it("round-trips through serializeCakeOptions", () => {
223
+ const serialized = serializeCakeOptions({
224
+ flavors: ["Vanilla", "Chocolate"],
225
+ frostings: ["Fondant"],
226
+ fillings: [],
227
+ dietary: ["Vegan"],
228
+ });
229
+ expect(serialized).toEqual([
230
+ "flavor:Vanilla",
231
+ "flavor:Chocolate",
232
+ "frosting:Fondant",
233
+ "dietary:Vegan",
234
+ ]);
235
+ expect(parseCakeOptions(serialized)).toEqual({
236
+ flavors: ["Vanilla", "Chocolate"],
237
+ frostings: ["Fondant"],
238
+ fillings: [],
239
+ dietary: ["Vegan"],
240
+ other: [],
241
+ });
242
+ });
243
+ it("encodeCakeOption uses lowercase prefixes", () => {
244
+ expect(encodeCakeOption("flavor", "Red Velvet")).toBe("flavor:Red Velvet");
245
+ expect(CELEBRATION_CAKE_FLAVORS).toContain("Red Velvet");
246
+ });
247
+ });
248
+ describe("celebrationCakeStartingPriceLabel", () => {
249
+ it("returns null when there is no starting price", () => {
250
+ expect(celebrationCakeStartingPriceLabel(null)).toBeNull();
251
+ expect(celebrationCakeStartingPriceLabel(0)).toBeNull();
252
+ });
253
+ it("formats whole-dollar starting prices", () => {
254
+ expect(celebrationCakeStartingPriceLabel(35000)).toBe("Cakes start at $350");
255
+ });
256
+ });
257
+ describe("grazing options", () => {
258
+ it("returns empty groups for null or empty input", () => {
259
+ expect(parseGrazingOptions(null)).toEqual({
260
+ styles: [],
261
+ proteins: [],
262
+ dietary: [],
263
+ other: [],
264
+ });
265
+ expect(parseGrazingOptions([])).toEqual({
266
+ styles: [],
267
+ proteins: [],
268
+ dietary: [],
269
+ other: [],
270
+ });
271
+ });
272
+ it("splits prefixed chips and keeps unprefixed leftovers", () => {
273
+ const parsed = parseGrazingOptions([
274
+ "style:Classic Charcuterie",
275
+ "protein:Cured Meats",
276
+ "dietary:Gluten-Free",
277
+ "Mains",
278
+ ]);
279
+ expect(parsed.styles).toEqual(["Classic Charcuterie"]);
280
+ expect(parsed.proteins).toEqual(["Cured Meats"]);
281
+ expect(parsed.dietary).toEqual(["Gluten-Free"]);
282
+ expect(parsed.other).toEqual(["Mains"]);
283
+ });
284
+ it("round-trips through serializeGrazingOptions", () => {
285
+ const serialized = serializeGrazingOptions({
286
+ styles: ["Modern Grazing"],
287
+ proteins: ["Artisan Cheeses"],
288
+ dietary: ["Vegan"],
289
+ });
290
+ expect(serialized).toEqual([
291
+ "style:Modern Grazing",
292
+ "protein:Artisan Cheeses",
293
+ "dietary:Vegan",
294
+ ]);
295
+ expect(parseGrazingOptions(serialized)).toEqual({
296
+ styles: ["Modern Grazing"],
297
+ proteins: ["Artisan Cheeses"],
298
+ dietary: ["Vegan"],
299
+ other: [],
300
+ });
301
+ });
302
+ it("encodeGrazingOption uses lowercase prefixes", () => {
303
+ expect(encodeGrazingOption("style", "Seasonal")).toBe("style:Seasonal");
304
+ expect(GRAZING_TABLE_STYLES).toContain("Classic Charcuterie");
305
+ });
306
+ });
307
+ describe("grazing and package starting-price labels", () => {
308
+ it("formats grazing starting prices", () => {
309
+ expect(grazingTableStartingPriceLabel(null)).toBeNull();
310
+ expect(grazingTableStartingPriceLabel(17500)).toBe("Boards start at $175");
311
+ });
312
+ it("delegates packagePricedFoodStartingPriceLabel by subtype", () => {
313
+ expect(packagePricedFoodStartingPriceLabel("GrazingTable", 17500)).toBe("Boards start at $175");
314
+ expect(packagePricedFoodStartingPriceLabel("CelebrationCake", 35000)).toBe("Cakes start at $350");
315
+ expect(packagePricedFoodStartingPriceLabel("Caterer", 35000)).toBeNull();
316
+ });
317
+ });
318
+ describe("isBelowGuestMinimum", () => {
319
+ it("returns false when no minimum is set", () => {
320
+ expect(isBelowGuestMinimum(5)).toBe(false);
321
+ expect(isBelowGuestMinimum(5, null)).toBe(false);
322
+ expect(isBelowGuestMinimum(5, 0)).toBe(false);
323
+ });
324
+ it("returns true when below minimum", () => {
325
+ expect(isBelowGuestMinimum(10, 25)).toBe(true);
326
+ });
327
+ it("returns false when exactly at minimum", () => {
328
+ expect(isBelowGuestMinimum(25, 25)).toBe(false);
329
+ });
330
+ it("returns false when above minimum", () => {
331
+ expect(isBelowGuestMinimum(100, 25)).toBe(false);
332
+ });
333
+ });
334
+ describe("fulfillment mode filters", () => {
335
+ it("keeps known F&B modes and drops unknowns", () => {
336
+ expect(isFulfillmentMode("Pickup")).toBe(true);
337
+ expect(isFulfillmentMode("FullService")).toBe(true);
338
+ expect(isFulfillmentMode("Curbside")).toBe(false);
339
+ expect(filterFulfillmentModes(["Pickup", "Curbside", "Delivery", "FullService"])).toEqual(["Pickup", "Delivery", "FullService"]);
340
+ expect(filterFulfillmentModes(null)).toEqual([]);
341
+ });
342
+ it("keeps cake pickup/delivery only", () => {
343
+ expect(isCelebrationCakeFulfillmentMode("Pickup")).toBe(true);
344
+ expect(isCelebrationCakeFulfillmentMode("FullService")).toBe(false);
345
+ expect(filterCelebrationCakeFulfillmentModes([
346
+ "Pickup",
347
+ "FullService",
348
+ "Delivery",
349
+ ])).toEqual(["Pickup", "Delivery"]);
350
+ expect(filterCelebrationCakeFulfillmentModes(undefined)).toEqual([]);
351
+ });
352
+ });
353
+ //# sourceMappingURL=foodAndBeverageQuote.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"foodAndBeverageQuote.test.js","sourceRoot":"","sources":["../../../../src/utils/service/__tests__/foodAndBeverageQuote.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,171 @@
1
+ /**
2
+ * Shared quote logic for Food & Beverage event-service listings.
3
+ *
4
+ * Rules:
5
+ * - Priced per-guest (PER_ATTENDEE pricingModel).
6
+ * - Headcount floors at minimumQuantity if set.
7
+ * - Dollar total floors at minimumChargeCents if set.
8
+ * - Packages and add-ons still stack on top.
9
+ * - No check-in true-up (promoter settlement) — headcount is snapshotted
10
+ * at booking time only.
11
+ *
12
+ * Keep this module pure (no Prisma, no React). Import it in bash-app, api,
13
+ * and frontendServiceBookingUtils via the index.
14
+ */
15
+ /**
16
+ * All FoodAndBeverageSubType values (mirrors the Prisma enum).
17
+ * Also include legacy/alias strings the wizard uses (Caterer, PrivateChef, etc.)
18
+ * so detection works before the DB normalises them.
19
+ */
20
+ export declare const FOOD_AND_BEVERAGE_SUBTYPES: Set<string>;
21
+ /**
22
+ * Custom-order celebration cakes — consultation, serving-size packages,
23
+ * pickup/delivery. Not a dessert station (DessertBar) and not per-guest catering.
24
+ */
25
+ export declare function isCelebrationCakeEventService(opts: {
26
+ eventServiceSubType?: string | null;
27
+ }): boolean;
28
+ /**
29
+ * Charcuterie boards and grazing tables — board/table packages, not per-guest catering.
30
+ */
31
+ export declare function isGrazingTableEventService(opts: {
32
+ eventServiceSubType?: string | null;
33
+ }): boolean;
34
+ /**
35
+ * Wedding / ceremony officiant. Hosting Support — not F&B, not Entertainment Emcee.
36
+ */
37
+ export declare function isOfficiantEventService(opts: {
38
+ eventServiceSubType?: string | null;
39
+ }): boolean;
40
+ /** Cake and grazing: CUSTOM starting price + ServicePackage tiers. Never per-guest. */
41
+ export declare const PACKAGE_PRICED_FOOD_SUBTYPES: Set<string>;
42
+ export declare function isPackagePricedFoodEventService(opts: {
43
+ eventServiceSubType?: string | null;
44
+ }): boolean;
45
+ /**
46
+ * Return true when a listing is an F&B EventService — either by top-level
47
+ * type or by subtype string (for legacy/alias safety).
48
+ */
49
+ export declare function isFoodAndBeverageEventService(opts: {
50
+ eventServiceType?: string | null;
51
+ eventServiceSubType?: string | null;
52
+ }): boolean;
53
+ /**
54
+ * Per-guest F&B only. Cake and grazing use packages — never this path.
55
+ */
56
+ export declare function isPerGuestFoodAndBeverageEventService(opts: {
57
+ eventServiceType?: string | null;
58
+ eventServiceSubType?: string | null;
59
+ }): boolean;
60
+ export declare const EVENT_SERVICE_FULFILLMENT_MODES: readonly ["Pickup", "Delivery", "FullService"];
61
+ export type FoodAndBeverageFulfillmentMode = (typeof EVENT_SERVICE_FULFILLMENT_MODES)[number];
62
+ export declare function isFulfillmentMode(mode: string): mode is FoodAndBeverageFulfillmentMode;
63
+ export declare function filterFulfillmentModes(modes?: readonly string[] | null): FoodAndBeverageFulfillmentMode[];
64
+ export declare const FULFILLMENT_MODE_LABEL: Record<FoodAndBeverageFulfillmentMode, string>;
65
+ /**
66
+ * Suggested menu category chips shown in the wizard and on the listing.
67
+ * Providers can add custom values; these are just pre-populated starting points.
68
+ * Not SKUs — no flavors, quantities, or prices here.
69
+ */
70
+ export declare const FB_MENU_CATEGORY_SUGGESTIONS: Record<string, readonly string[]>;
71
+ /**
72
+ * Get suggested menu categories for a subtype.
73
+ * Falls back to a generic list if the subtype is not found.
74
+ */
75
+ export declare function getFoodAndBeverageMenuCategories(subtype?: string | null): readonly string[];
76
+ export interface FoodAndBeverageQuoteParams {
77
+ /** Cents per guest (baseRateCents from EventService). */
78
+ baseRateCents: number;
79
+ /** Host-entered guest count for the booking. */
80
+ headcount: number;
81
+ /** Minimum bookable guests (minimumQuantity from EventService). 0 = no floor. */
82
+ minimumQuantity?: number | null;
83
+ /** Hard dollar floor regardless of headcount (minimumChargeCents). 0 = no floor. */
84
+ minimumChargeCents?: number | null;
85
+ }
86
+ /**
87
+ * The effective guest count used for the quote.
88
+ * Floors at minimumQuantity so the provider is never charged less than their floor.
89
+ */
90
+ export declare function quotedGuestCount(headcount: number, minimumQuantity?: number | null): number;
91
+ /**
92
+ * Total food & beverage quote in cents, before packages, add-ons, and fees.
93
+ *
94
+ * Calculation order (mirrors the brochure's structure):
95
+ * 1. Floor headcount at minimumQuantity → quotedGuests
96
+ * 2. Compute rate total: baseRateCents × quotedGuests
97
+ * 3. Floor at minimumChargeCents
98
+ *
99
+ * Packages and add-ons are NOT included here — they are added on top by
100
+ * frontendServiceBookingUtils (same as for all other service types).
101
+ */
102
+ export declare function foodAndBeverageQuoteCents({ baseRateCents, headcount, minimumQuantity, minimumChargeCents, }: FoodAndBeverageQuoteParams): number;
103
+ /**
104
+ * Human-readable summary string, e.g. "$18 / guest · min 25 guests".
105
+ */
106
+ export declare function foodAndBeverageRateSummary(baseRateCents: number, minimumQuantity?: number | null): string;
107
+ /**
108
+ * Return true if the entered headcount is below the listing's minimum.
109
+ * Use this to block checkout with a human-readable message.
110
+ */
111
+ export declare function isBelowGuestMinimum(headcount: number, minimumQuantity?: number | null): boolean;
112
+ /**
113
+ * Human-readable lead time label, e.g. "Needs 7 days notice" or "Needs 2 weeks notice".
114
+ * Rounds partial weeks only when evenly divisible.
115
+ */
116
+ export declare function foodAndBeverageLeadTimeLabel(leadTimeDays?: number | null): string | null;
117
+ export declare const CELEBRATION_CAKE_FULFILLMENT_MODES: readonly ["Pickup", "Delivery"];
118
+ export type CelebrationCakeFulfillmentMode = (typeof CELEBRATION_CAKE_FULFILLMENT_MODES)[number];
119
+ export declare function isCelebrationCakeFulfillmentMode(mode: string): mode is CelebrationCakeFulfillmentMode;
120
+ export declare function filterCelebrationCakeFulfillmentModes(modes?: readonly string[] | null): CelebrationCakeFulfillmentMode[];
121
+ export declare const CAKE_OPTION_KINDS: readonly ["flavor", "frosting", "filling", "dietary"];
122
+ export type CakeOptionKind = (typeof CAKE_OPTION_KINDS)[number];
123
+ export declare const CELEBRATION_CAKE_FLAVORS: readonly ["Vanilla", "Chocolate", "Red Velvet", "Marble", "Carrot", "Lemon", "Almond", "Funfetti", "Spice", "Coconut"];
124
+ export declare const CELEBRATION_CAKE_FROSTINGS: readonly ["Vanilla Buttercream", "Chocolate Buttercream", "Cream Cheese", "Whipped Cream", "Fondant", "Ganache", "Swiss Meringue"];
125
+ export declare const CELEBRATION_CAKE_FILLINGS: readonly ["Raspberry", "Lemon Custard", "Chocolate Mousse", "Strawberry", "Cream Cheese", "Cannoli", "Vanilla Buttercream"];
126
+ export declare const CELEBRATION_CAKE_DIETARY: readonly ["Gluten-Free", "Vegan", "Nut-Free", "Sugar-Free", "Dairy-Free"];
127
+ export declare function encodeCakeOption(kind: CakeOptionKind, value: string): string;
128
+ export interface ParsedCakeOptions {
129
+ flavors: string[];
130
+ frostings: string[];
131
+ fillings: string[];
132
+ dietary: string[];
133
+ other: string[];
134
+ }
135
+ /**
136
+ * Split prefixed cake chips back into grouped lists.
137
+ * Unprefixed leftovers land in `other` (caterer-style chips, if mixed).
138
+ */
139
+ export declare function parseCakeOptions(goodsOrServices?: readonly string[] | null): ParsedCakeOptions;
140
+ export declare function serializeCakeOptions(opts: {
141
+ flavors?: readonly string[];
142
+ frostings?: readonly string[];
143
+ fillings?: readonly string[];
144
+ dietary?: readonly string[];
145
+ }): string[];
146
+ /**
147
+ * Listing line, e.g. "Cakes start at $350". Null when no starting price.
148
+ */
149
+ export declare function celebrationCakeStartingPriceLabel(minimumChargeCents?: number | null): string | null;
150
+ export declare function grazingTableStartingPriceLabel(minimumChargeCents?: number | null): string | null;
151
+ export declare function packagePricedFoodStartingPriceLabel(eventServiceSubType?: string | null, minimumChargeCents?: number | null): string | null;
152
+ export declare const GRAZING_TABLE_FULFILLMENT_MODES: readonly ["Pickup", "Delivery", "FullService"];
153
+ export declare const GRAZING_OPTION_KINDS: readonly ["style", "protein", "dietary"];
154
+ export type GrazingOptionKind = (typeof GRAZING_OPTION_KINDS)[number];
155
+ export declare const GRAZING_TABLE_STYLES: readonly ["Classic Charcuterie", "Modern Grazing", "Cheese Board", "Dessert Board", "Breakfast Board", "Seasonal"];
156
+ export declare const GRAZING_TABLE_PROTEINS: readonly ["Cured Meats", "Artisan Cheeses", "Smoked Fish", "Plant-Based", "Crudité"];
157
+ export declare const GRAZING_TABLE_DIETARY: readonly ["Gluten-Free", "Vegan", "Nut-Free", "Dairy-Free"];
158
+ export declare function encodeGrazingOption(kind: GrazingOptionKind, value: string): string;
159
+ export interface ParsedGrazingOptions {
160
+ styles: string[];
161
+ proteins: string[];
162
+ dietary: string[];
163
+ other: string[];
164
+ }
165
+ export declare function parseGrazingOptions(goodsOrServices?: readonly string[] | null): ParsedGrazingOptions;
166
+ export declare function serializeGrazingOptions(opts: {
167
+ styles?: readonly string[];
168
+ proteins?: readonly string[];
169
+ dietary?: readonly string[];
170
+ }): string[];
171
+ //# sourceMappingURL=foodAndBeverageQuote.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"foodAndBeverageQuote.d.ts","sourceRoot":"","sources":["../../../src/utils/service/foodAndBeverageQuote.ts"],"names":[],"mappings":"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"}