@bash-app/bash-common 30.260.0 → 30.262.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 (82) hide show
  1. package/dist/__tests__/ticketBnplPaymentMethods.cashapp.test.d.ts +2 -0
  2. package/dist/__tests__/ticketBnplPaymentMethods.cashapp.test.d.ts.map +1 -0
  3. package/dist/__tests__/ticketBnplPaymentMethods.cashapp.test.js +33 -0
  4. package/dist/__tests__/ticketBnplPaymentMethods.cashapp.test.js.map +1 -0
  5. package/dist/__tests__/ticketBnplPaymentMethods.test.d.ts +2 -0
  6. package/dist/__tests__/ticketBnplPaymentMethods.test.d.ts.map +1 -0
  7. package/dist/__tests__/ticketBnplPaymentMethods.test.js +46 -0
  8. package/dist/__tests__/ticketBnplPaymentMethods.test.js.map +1 -0
  9. package/dist/definitions.d.ts +6 -1
  10. package/dist/definitions.d.ts.map +1 -1
  11. package/dist/definitions.js.map +1 -1
  12. package/dist/index.d.ts +6 -0
  13. package/dist/index.d.ts.map +1 -1
  14. package/dist/index.js +6 -0
  15. package/dist/index.js.map +1 -1
  16. package/dist/ticketBnplPaymentMethods.d.ts +32 -0
  17. package/dist/ticketBnplPaymentMethods.d.ts.map +1 -0
  18. package/dist/ticketBnplPaymentMethods.js +42 -0
  19. package/dist/ticketBnplPaymentMethods.js.map +1 -0
  20. package/dist/utils/__tests__/featuredDiscoveryGeo.test.d.ts +2 -0
  21. package/dist/utils/__tests__/featuredDiscoveryGeo.test.d.ts.map +1 -0
  22. package/dist/utils/__tests__/featuredDiscoveryGeo.test.js +98 -0
  23. package/dist/utils/__tests__/featuredDiscoveryGeo.test.js.map +1 -0
  24. package/dist/utils/__tests__/flyerUtils.test.js +7 -1
  25. package/dist/utils/__tests__/flyerUtils.test.js.map +1 -1
  26. package/dist/utils/__tests__/guestSurface.test.d.ts +2 -0
  27. package/dist/utils/__tests__/guestSurface.test.d.ts.map +1 -0
  28. package/dist/utils/__tests__/guestSurface.test.js +94 -0
  29. package/dist/utils/__tests__/guestSurface.test.js.map +1 -0
  30. package/dist/utils/__tests__/ticketTierSchedule.test.d.ts +2 -0
  31. package/dist/utils/__tests__/ticketTierSchedule.test.d.ts.map +1 -0
  32. package/dist/utils/__tests__/ticketTierSchedule.test.js +84 -0
  33. package/dist/utils/__tests__/ticketTierSchedule.test.js.map +1 -0
  34. package/dist/utils/featuredDiscoveryGeo.d.ts +30 -0
  35. package/dist/utils/featuredDiscoveryGeo.d.ts.map +1 -0
  36. package/dist/utils/featuredDiscoveryGeo.js +47 -0
  37. package/dist/utils/featuredDiscoveryGeo.js.map +1 -0
  38. package/dist/utils/flyerUtils.d.ts +5 -0
  39. package/dist/utils/flyerUtils.d.ts.map +1 -1
  40. package/dist/utils/flyerUtils.js +24 -0
  41. package/dist/utils/flyerUtils.js.map +1 -1
  42. package/dist/utils/guestSurface.d.ts +114 -0
  43. package/dist/utils/guestSurface.d.ts.map +1 -0
  44. package/dist/utils/guestSurface.js +164 -0
  45. package/dist/utils/guestSurface.js.map +1 -0
  46. package/dist/utils/promotionBlastUtils.d.ts +38 -0
  47. package/dist/utils/promotionBlastUtils.d.ts.map +1 -0
  48. package/dist/utils/promotionBlastUtils.js +88 -0
  49. package/dist/utils/promotionBlastUtils.js.map +1 -0
  50. package/dist/utils/service/__tests__/defaultOfferAmountUtils.test.d.ts +2 -0
  51. package/dist/utils/service/__tests__/defaultOfferAmountUtils.test.d.ts.map +1 -0
  52. package/dist/utils/service/__tests__/defaultOfferAmountUtils.test.js +65 -0
  53. package/dist/utils/service/__tests__/defaultOfferAmountUtils.test.js.map +1 -0
  54. package/dist/utils/service/defaultOfferAmountUtils.d.ts +32 -0
  55. package/dist/utils/service/defaultOfferAmountUtils.d.ts.map +1 -0
  56. package/dist/utils/service/defaultOfferAmountUtils.js +115 -0
  57. package/dist/utils/service/defaultOfferAmountUtils.js.map +1 -0
  58. package/dist/utils/service/serviceBookingExposureUtils.js +1 -1
  59. package/dist/utils/service/serviceBookingExposureUtils.js.map +1 -1
  60. package/dist/utils/ticketTierSchedule.d.ts +58 -0
  61. package/dist/utils/ticketTierSchedule.d.ts.map +1 -0
  62. package/dist/utils/ticketTierSchedule.js +279 -0
  63. package/dist/utils/ticketTierSchedule.js.map +1 -0
  64. package/package.json +5 -2
  65. package/prisma/schema.prisma +332 -1
  66. package/src/__tests__/ticketBnplPaymentMethods.cashapp.test.ts +45 -0
  67. package/src/__tests__/ticketBnplPaymentMethods.test.ts +66 -0
  68. package/src/definitions.ts +6 -1
  69. package/src/index.ts +6 -0
  70. package/src/ticketBnplPaymentMethods.ts +79 -0
  71. package/src/utils/__tests__/featuredDiscoveryGeo.test.ts +120 -0
  72. package/src/utils/__tests__/flyerUtils.test.ts +10 -0
  73. package/src/utils/__tests__/guestSurface.test.ts +128 -0
  74. package/src/utils/__tests__/ticketTierSchedule.test.ts +131 -0
  75. package/src/utils/featuredDiscoveryGeo.ts +75 -0
  76. package/src/utils/flyerUtils.ts +33 -0
  77. package/src/utils/guestSurface.ts +315 -0
  78. package/src/utils/promotionBlastUtils.ts +127 -0
  79. package/src/utils/service/__tests__/defaultOfferAmountUtils.test.ts +102 -0
  80. package/src/utils/service/defaultOfferAmountUtils.ts +170 -0
  81. package/src/utils/service/serviceBookingExposureUtils.ts +1 -1
  82. package/src/utils/ticketTierSchedule.ts +387 -0
@@ -0,0 +1,115 @@
1
+ /**
2
+ * Deterministic default offer amount for a service + bash context.
3
+ * Keeps service cards, budget bar, SendOfferSheet prefill, and bulk offers aligned.
4
+ */
5
+ import { computeOfferComparisonBands, } from "./offerComparisonUtils.js";
6
+ import { resolveUnifiedPricingBlock, } from "./unifiedPricingResolver.js";
7
+ import { SERVICE_DAILY_RATE_HOURS_MIN } from "./serviceRateUtils.js";
8
+ export { SERVICE_DAILY_RATE_HOURS_MIN };
9
+ /** Event length in hours; defaults to 1 when dates are missing or invalid. */
10
+ export function computeBashEventDurationHours(startDateTime, endDateTime) {
11
+ if (!startDateTime || !endDateTime)
12
+ return 1;
13
+ const start = new Date(startDateTime).getTime();
14
+ const end = new Date(endDateTime).getTime();
15
+ if (!Number.isFinite(start) || !Number.isFinite(end))
16
+ return 1;
17
+ const hours = (end - start) / (1000 * 60 * 60);
18
+ return hours >= 0.25 ? hours : 1;
19
+ }
20
+ /** Legacy published-rate estimate (flat → daily if 8+ hrs → hourly × duration). */
21
+ export function calcLegacyRateEstimateCents(rates, durationHours) {
22
+ if (!rates)
23
+ return 0;
24
+ if ((rates.flatRateCents ?? 0) > 0)
25
+ return rates.flatRateCents;
26
+ const hours = durationHours >= 0.25 ? durationHours : 1;
27
+ if (hours >= SERVICE_DAILY_RATE_HOURS_MIN &&
28
+ (rates.dailyRateCents ?? 0) > 0) {
29
+ return rates.dailyRateCents;
30
+ }
31
+ if ((rates.hourlyRateCents ?? 0) > 0) {
32
+ return Math.round(rates.hourlyRateCents * hours);
33
+ }
34
+ if ((rates.dailyRateCents ?? 0) > 0)
35
+ return rates.dailyRateCents;
36
+ return 0;
37
+ }
38
+ function unifiedModelEstimateCents(pricingModel, block, durationHours, expectedAttendees) {
39
+ const base = block.baseRateCents ?? 0;
40
+ const hours = durationHours >= 0.25 ? durationHours : 1;
41
+ switch (pricingModel) {
42
+ case "HOURLY":
43
+ return base > 0 ? Math.round(base * hours) : 0;
44
+ case "PER_DAY":
45
+ if (base <= 0)
46
+ return 0;
47
+ if (hours >= SERVICE_DAILY_RATE_HOURS_MIN)
48
+ return base;
49
+ return Math.round(base * (hours / SERVICE_DAILY_RATE_HOURS_MIN));
50
+ case "FLAT_FEE":
51
+ case "CUSTOM":
52
+ return base > 0 ? base : 0;
53
+ case "PER_ATTENDEE":
54
+ case "PER_PAID_ATTENDEE": {
55
+ const bands = computeOfferComparisonBands({
56
+ pricingModel,
57
+ baseRateCents: base,
58
+ minimumChargeCents: block.minimumChargeCents,
59
+ minimumQuantity: block.minimumQuantity,
60
+ expectedAttendees,
61
+ });
62
+ return bands.expectedTotalCents ?? 0;
63
+ }
64
+ case "PER_BASHPOINTS_ATTENDEE":
65
+ return 0;
66
+ case "TIERED": {
67
+ const bands = computeOfferComparisonBands({
68
+ pricingModel: "TIERED",
69
+ tieredExpectedTierCents: base > 0 ? base : null,
70
+ });
71
+ return bands.expectedTotalCents ?? 0;
72
+ }
73
+ default: {
74
+ const bands = computeOfferComparisonBands({
75
+ pricingModel,
76
+ baseRateCents: base,
77
+ flatRateCents: base > 0 ? base : null,
78
+ });
79
+ return bands.expectedTotalCents ?? 0;
80
+ }
81
+ }
82
+ }
83
+ /**
84
+ * Returns the suggested opening offer in USD cents for this bash, or 0 when
85
+ * no computable rate exists (bulk send should skip those services).
86
+ */
87
+ export function getDefaultOfferAmountCents(params) {
88
+ const { service, durationHours, expectedAttendees } = params;
89
+ const legacyRates = service.serviceRatesAssociation?.serviceGeneralRates;
90
+ const block = resolveUnifiedPricingBlock({
91
+ eventService: service.eventService,
92
+ vendor: service.vendor,
93
+ exhibitor: service.exhibitor,
94
+ sponsor: service.sponsor,
95
+ venue: service.venue,
96
+ entertainmentService: service.entertainmentService,
97
+ volunteerService: service.volunteerService,
98
+ legacyRate: null,
99
+ });
100
+ if (block.fromUnifiedBlock && block.pricingModel) {
101
+ const unified = unifiedModelEstimateCents(block.pricingModel, block, durationHours, expectedAttendees);
102
+ if (unified > 0)
103
+ return unified;
104
+ }
105
+ return calcLegacyRateEstimateCents(legacyRates, durationHours);
106
+ }
107
+ export function formatOfferAmountDollars(cents) {
108
+ return `$${Math.round(cents / 100).toLocaleString("en-US")}`;
109
+ }
110
+ /** Host → provider bulk offers only when a positive USD default exists. */
111
+ export function isBulkHostOfferEligible(amountCents, isParticipationFeeService) {
112
+ return !isParticipationFeeService && amountCents > 0;
113
+ }
114
+ export const BULK_OFFER_MAX_COUNT = 10;
115
+ //# sourceMappingURL=defaultOfferAmountUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaultOfferAmountUtils.js","sourceRoot":"","sources":["../../../src/utils/service/defaultOfferAmountUtils.ts"],"names":[],"mappings":"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"}
@@ -15,7 +15,7 @@
15
15
  * Phase 0 callers passing in `pricingModel: null` for legacy bookings still get
16
16
  * a sensible flat-fee fallback.
17
17
  */
18
- import { DEFAULT_MAX_BILLABLE_MULTIPLIER, isFlatPricingModel, } from "./billingCapUtils";
18
+ import { DEFAULT_MAX_BILLABLE_MULTIPLIER, isFlatPricingModel, } from "./billingCapUtils.js";
19
19
  /**
20
20
  * Pricing-model strings recognized by the exposure util. Stays a string
21
21
  * literal (not the Prisma enum) so this util compiles for the browser bundle.
@@ -1 +1 @@
1
- {"version":3,"file":"serviceBookingExposureUtils.js","sourceRoot":"","sources":["../../../src/utils/service/serviceBookingExposureUtils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"serviceBookingExposureUtils.js","sourceRoot":"","sources":["../../../src/utils/service/serviceBookingExposureUtils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Ticket tier release / expiry / sold-out schedule resolver — shared by API + bash-app.
3
+ */
4
+ import type { TicketTierAvailability } from "../definitions.js";
5
+ export type PreReleaseDisplay = "Tease" | "Hidden";
6
+ export type PresaleAudience = "Public" | "Ambashador" | "BashInsider" | "Promoters";
7
+ export type TicketTierSchedulePhase = "HostHidden" | "HiddenPreRelease" | "TeasePreRelease" | "Live" | "Expired" | "SoldOut";
8
+ export type TicketTierScheduleInput = {
9
+ availabilityType?: string | null;
10
+ availableAt?: Date | string | null;
11
+ expiresAt?: Date | string | null;
12
+ preReleaseDisplay?: string | null;
13
+ hidden?: boolean | null;
14
+ isManuallySoldOut?: boolean | null;
15
+ isWaitlistTier?: boolean | null;
16
+ availabilityTypeUnlock?: string | null;
17
+ availableWhenInterestReached?: number | null;
18
+ unlockWhenTicketsSold?: number | null;
19
+ presaleAudience?: string | null;
20
+ publicAvailableAt?: Date | string | null;
21
+ };
22
+ export type TicketTierScheduleContext = {
23
+ now?: Date;
24
+ availableInventory?: number;
25
+ ideaInterestCount?: number;
26
+ ticketsSoldCount?: number;
27
+ isViewerEngaged?: boolean;
28
+ isViewerAmbashador?: boolean;
29
+ isViewerBashInsider?: boolean;
30
+ isViewerPromoterForEvent?: boolean;
31
+ };
32
+ export type TicketTierScheduleState = {
33
+ phase: TicketTierSchedulePhase;
34
+ availableAt: string | null;
35
+ expiresAt: string | null;
36
+ canPurchase: boolean;
37
+ soldOut: boolean;
38
+ showWaitlistCta: boolean;
39
+ guestVisible: boolean;
40
+ availability: TicketTierAvailability;
41
+ hostPreviewLabel: string;
42
+ };
43
+ export type ScheduleValidationIssue = {
44
+ field: string;
45
+ message: string;
46
+ severity: "error" | "warn";
47
+ };
48
+ /**
49
+ * Resolve guest-visible phase and purchase eligibility for a ticket tier.
50
+ */
51
+ export declare function resolveTicketTierScheduleState(tier: TicketTierScheduleInput, ctx?: TicketTierScheduleContext): TicketTierScheduleState;
52
+ export declare function validateTicketTierScheduleInput(tier: TicketTierScheduleInput, bashEvent?: {
53
+ startDateTime?: Date | string | null;
54
+ }): ScheduleValidationIssue[];
55
+ export declare function scheduleValidationHasErrors(issues: ScheduleValidationIssue[]): boolean;
56
+ /** Whether tier should appear on guest detail ticket list (incl. tease). */
57
+ export declare function isTicketTierGuestListVisible(state: TicketTierScheduleState): boolean;
58
+ //# sourceMappingURL=ticketTierSchedule.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ticketTierSchedule.d.ts","sourceRoot":"","sources":["../../src/utils/ticketTierSchedule.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAEhE,MAAM,MAAM,iBAAiB,GAAG,OAAO,GAAG,QAAQ,CAAC;AAEnD,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,YAAY,GAAG,aAAa,GAAG,WAAW,CAAC;AAEpF,MAAM,MAAM,uBAAuB,GAC/B,YAAY,GACZ,kBAAkB,GAClB,iBAAiB,GACjB,MAAM,GACN,SAAS,GACT,SAAS,CAAC;AAEd,MAAM,MAAM,uBAAuB,GAAG;IACpC,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,WAAW,CAAC,EAAE,IAAI,GAAG,MAAM,GAAG,IAAI,CAAC;IACnC,SAAS,CAAC,EAAE,IAAI,GAAG,MAAM,GAAG,IAAI,CAAC;IACjC,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,MAAM,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IACxB,iBAAiB,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IACnC,cAAc,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAChC,sBAAsB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC,4BAA4B,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7C,qBAAqB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,iBAAiB,CAAC,EAAE,IAAI,GAAG,MAAM,GAAG,IAAI,CAAC;CAC1C,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACtC,GAAG,CAAC,EAAE,IAAI,CAAC;IACX,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,wBAAwB,CAAC,EAAE,OAAO,CAAC;CACpC,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,KAAK,EAAE,uBAAuB,CAAC;IAC/B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,WAAW,EAAE,OAAO,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,eAAe,EAAE,OAAO,CAAC;IACzB,YAAY,EAAE,OAAO,CAAC;IACtB,YAAY,EAAE,sBAAsB,CAAC;IACrC,gBAAgB,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,GAAG,MAAM,CAAC;CAC5B,CAAC;AAmEF;;GAEG;AACH,wBAAgB,8BAA8B,CAC5C,IAAI,EAAE,uBAAuB,EAC7B,GAAG,GAAE,yBAA8B,GAClC,uBAAuB,CAgKzB;AA6BD,wBAAgB,+BAA+B,CAC7C,IAAI,EAAE,uBAAuB,EAC7B,SAAS,CAAC,EAAE;IAAE,aAAa,CAAC,EAAE,IAAI,GAAG,MAAM,GAAG,IAAI,CAAA;CAAE,GACnD,uBAAuB,EAAE,CAgD3B;AAED,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,uBAAuB,EAAE,GAAG,OAAO,CAEtF;AAED,4EAA4E;AAC5E,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,uBAAuB,GAAG,OAAO,CAMpF"}
@@ -0,0 +1,279 @@
1
+ /**
2
+ * Ticket tier release / expiry / sold-out schedule resolver — shared by API + bash-app.
3
+ */
4
+ function toDate(value) {
5
+ if (value == null)
6
+ return null;
7
+ const d = value instanceof Date ? value : new Date(value);
8
+ return Number.isNaN(d.getTime()) ? null : d;
9
+ }
10
+ function toIso(value) {
11
+ const d = toDate(value);
12
+ return d ? d.toISOString() : null;
13
+ }
14
+ function normalizePreReleaseDisplay(value) {
15
+ return value === "Hidden" ? "Hidden" : "Tease";
16
+ }
17
+ function isOnDate(type) {
18
+ return type === "OnDate";
19
+ }
20
+ function isPresaleAudienceEligible(audience, ctx) {
21
+ switch (audience) {
22
+ case "Ambashador":
23
+ return ctx.isViewerAmbashador === true;
24
+ case "BashInsider":
25
+ return ctx.isViewerBashInsider === true;
26
+ case "Promoters":
27
+ return ctx.isViewerPromoterForEvent === true;
28
+ default:
29
+ return true;
30
+ }
31
+ }
32
+ function resolveUnlockAvailability(tier, ctx) {
33
+ const type = tier.availabilityType ?? "Immediate";
34
+ if (type === "UnlockWhenInterestReached") {
35
+ const threshold = tier.availableWhenInterestReached ?? 0;
36
+ const count = ctx.ideaInterestCount ?? 0;
37
+ const available = count >= threshold;
38
+ return {
39
+ available,
40
+ reason: "UnlockWhenInterestReached",
41
+ interestCount: count,
42
+ interestThreshold: threshold,
43
+ };
44
+ }
45
+ if (type === "UnlockWhenTicketsSold") {
46
+ const threshold = tier.unlockWhenTicketsSold ?? 0;
47
+ const count = ctx.ticketsSoldCount ?? 0;
48
+ const available = count >= threshold;
49
+ return {
50
+ available,
51
+ reason: "UnlockWhenTicketsSold",
52
+ ticketsSoldCount: count,
53
+ ticketsSoldThreshold: threshold,
54
+ };
55
+ }
56
+ return null;
57
+ }
58
+ /**
59
+ * Resolve guest-visible phase and purchase eligibility for a ticket tier.
60
+ */
61
+ export function resolveTicketTierScheduleState(tier, ctx = {}) {
62
+ const now = ctx.now ?? new Date();
63
+ const availableAt = toDate(tier.availableAt);
64
+ const expiresAt = toDate(tier.expiresAt);
65
+ const publicAvailableAt = toDate(tier.publicAvailableAt);
66
+ const inventory = ctx.availableInventory;
67
+ const manualSoldOut = tier.isManuallySoldOut === true;
68
+ /** Only treat as inventory sold-out when callers supply a count — unknown ≠ zero. */
69
+ const soldOut = manualSoldOut || (inventory !== undefined && inventory <= 0);
70
+ const preDisplay = normalizePreReleaseDisplay(tier.preReleaseDisplay);
71
+ const type = tier.availabilityType ?? "Immediate";
72
+ if (tier.hidden) {
73
+ return buildState({
74
+ phase: "HostHidden",
75
+ availableAt,
76
+ expiresAt,
77
+ canPurchase: false,
78
+ soldOut,
79
+ isWaitlistTier: tier.isWaitlistTier,
80
+ availability: { available: false },
81
+ hostPreviewLabel: "Hidden by host",
82
+ });
83
+ }
84
+ if (expiresAt && now >= expiresAt) {
85
+ return buildState({
86
+ phase: "Expired",
87
+ availableAt,
88
+ expiresAt,
89
+ canPurchase: false,
90
+ soldOut,
91
+ isWaitlistTier: tier.isWaitlistTier,
92
+ availability: { available: false },
93
+ hostPreviewLabel: "Expired",
94
+ });
95
+ }
96
+ const unlockAvail = resolveUnlockAvailability(tier, ctx);
97
+ if (unlockAvail && !unlockAvail.available) {
98
+ return buildState({
99
+ phase: type === "OnDate" && availableAt && now < availableAt
100
+ ? preDisplay === "Hidden" ? "HiddenPreRelease" : "TeasePreRelease"
101
+ : "TeasePreRelease",
102
+ availableAt,
103
+ expiresAt,
104
+ canPurchase: false,
105
+ soldOut,
106
+ isWaitlistTier: tier.isWaitlistTier,
107
+ availability: unlockAvail,
108
+ hostPreviewLabel: "Unlock pending",
109
+ });
110
+ }
111
+ if (isOnDate(type) && availableAt && now < availableAt) {
112
+ const phase = preDisplay === "Hidden" ? "HiddenPreRelease" : "TeasePreRelease";
113
+ return buildState({
114
+ phase,
115
+ availableAt,
116
+ expiresAt,
117
+ canPurchase: false,
118
+ soldOut,
119
+ isWaitlistTier: tier.isWaitlistTier,
120
+ availability: {
121
+ available: false,
122
+ reason: "OnDate",
123
+ availableAt: availableAt.toISOString(),
124
+ },
125
+ hostPreviewLabel: phase === "HiddenPreRelease" ? "Hidden until release" : "Tease + countdown",
126
+ });
127
+ }
128
+ const presaleAudience = tier.presaleAudience ?? "Public";
129
+ if (presaleAudience !== "Public") {
130
+ const publicOpensAt = publicAvailableAt ?? availableAt;
131
+ const presaleOpen = !availableAt || now >= availableAt;
132
+ const publicOpen = !publicOpensAt || now >= publicOpensAt;
133
+ const eligible = isPresaleAudienceEligible(presaleAudience, ctx);
134
+ if (!publicOpen && (!presaleOpen || !eligible)) {
135
+ return buildState({
136
+ phase: presaleOpen && !publicOpen ? "TeasePreRelease" : "HiddenPreRelease",
137
+ availableAt: publicOpensAt ?? availableAt,
138
+ expiresAt,
139
+ canPurchase: false,
140
+ soldOut,
141
+ isWaitlistTier: tier.isWaitlistTier,
142
+ availability: {
143
+ available: false,
144
+ reason: "OnDate",
145
+ availableAt: (publicOpensAt ?? availableAt)?.toISOString(),
146
+ },
147
+ hostPreviewLabel: `${presaleAudience} presale`,
148
+ });
149
+ }
150
+ if (presaleOpen && !publicOpen && !eligible) {
151
+ return buildState({
152
+ phase: "TeasePreRelease",
153
+ availableAt: publicOpensAt,
154
+ expiresAt,
155
+ canPurchase: false,
156
+ soldOut,
157
+ isWaitlistTier: tier.isWaitlistTier,
158
+ availability: {
159
+ available: false,
160
+ reason: "OnDate",
161
+ availableAt: publicOpensAt?.toISOString(),
162
+ },
163
+ hostPreviewLabel: "Public sale scheduled",
164
+ });
165
+ }
166
+ }
167
+ if (type === "EngagedUsersOnly" && ctx.isViewerEngaged === false) {
168
+ return buildState({
169
+ phase: soldOut ? "SoldOut" : "Live",
170
+ availableAt,
171
+ expiresAt,
172
+ canPurchase: false,
173
+ soldOut,
174
+ isWaitlistTier: tier.isWaitlistTier,
175
+ availability: {
176
+ available: false,
177
+ reason: "EngagedUsersOnly",
178
+ isViewerEngaged: false,
179
+ },
180
+ hostPreviewLabel: soldOut ? "Sold out" : "RSVP required",
181
+ });
182
+ }
183
+ if (soldOut) {
184
+ return buildState({
185
+ phase: "SoldOut",
186
+ availableAt,
187
+ expiresAt,
188
+ canPurchase: false,
189
+ soldOut: true,
190
+ isWaitlistTier: tier.isWaitlistTier,
191
+ availability: { available: false },
192
+ hostPreviewLabel: manualSoldOut ? "Sold out (manual)" : "Sold out",
193
+ });
194
+ }
195
+ const availability = unlockAvail ?? { available: true };
196
+ if (type === "EngagedUsersOnly") {
197
+ availability.reason = "EngagedUsersOnly";
198
+ availability.isViewerEngaged = ctx.isViewerEngaged;
199
+ }
200
+ return buildState({
201
+ phase: "Live",
202
+ availableAt,
203
+ expiresAt,
204
+ canPurchase: true,
205
+ soldOut: false,
206
+ isWaitlistTier: tier.isWaitlistTier,
207
+ availability,
208
+ hostPreviewLabel: "Live",
209
+ });
210
+ }
211
+ function buildState(args) {
212
+ const guestVisible = args.phase !== "HostHidden" &&
213
+ args.phase !== "HiddenPreRelease" &&
214
+ args.phase !== "Expired";
215
+ return {
216
+ phase: args.phase,
217
+ availableAt: toIso(args.availableAt),
218
+ expiresAt: toIso(args.expiresAt),
219
+ canPurchase: args.canPurchase,
220
+ soldOut: args.soldOut,
221
+ showWaitlistCta: args.soldOut && args.isWaitlistTier === true,
222
+ guestVisible,
223
+ availability: args.availability,
224
+ hostPreviewLabel: args.hostPreviewLabel,
225
+ };
226
+ }
227
+ export function validateTicketTierScheduleInput(tier, bashEvent) {
228
+ const issues = [];
229
+ const type = tier.availabilityType ?? "Immediate";
230
+ const availableAt = toDate(tier.availableAt);
231
+ const expiresAt = toDate(tier.expiresAt);
232
+ const start = bashEvent ? toDate(bashEvent.startDateTime) : null;
233
+ if (isOnDate(type) && !availableAt) {
234
+ issues.push({
235
+ field: "availableAt",
236
+ message: "Release date and time are required when scheduling a tier.",
237
+ severity: "error",
238
+ });
239
+ }
240
+ if (availableAt && expiresAt && expiresAt <= availableAt) {
241
+ issues.push({
242
+ field: "expiresAt",
243
+ message: "Expires must be after the release time.",
244
+ severity: "error",
245
+ });
246
+ }
247
+ if (expiresAt && expiresAt <= new Date()) {
248
+ issues.push({
249
+ field: "expiresAt",
250
+ message: "Expires must be in the future.",
251
+ severity: "error",
252
+ });
253
+ }
254
+ if (start && availableAt && availableAt > start) {
255
+ issues.push({
256
+ field: "availableAt",
257
+ message: "Release is after the event start — double-check the time.",
258
+ severity: "warn",
259
+ });
260
+ }
261
+ if (start && expiresAt && expiresAt > start) {
262
+ issues.push({
263
+ field: "expiresAt",
264
+ message: "Tier expires after the event starts — unusual but allowed.",
265
+ severity: "warn",
266
+ });
267
+ }
268
+ return issues;
269
+ }
270
+ export function scheduleValidationHasErrors(issues) {
271
+ return issues.some((i) => i.severity === "error");
272
+ }
273
+ /** Whether tier should appear on guest detail ticket list (incl. tease). */
274
+ export function isTicketTierGuestListVisible(state) {
275
+ return (state.guestVisible ||
276
+ state.phase === "TeasePreRelease" ||
277
+ state.phase === "SoldOut");
278
+ }
279
+ //# sourceMappingURL=ticketTierSchedule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ticketTierSchedule.js","sourceRoot":"","sources":["../../src/utils/ticketTierSchedule.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bash-app/bash-common",
3
- "version": "30.260.0",
3
+ "version": "30.262.0",
4
4
  "description": "Common data and scripts to use on the frontend and backend",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -63,5 +63,8 @@
63
63
  "dist",
64
64
  "src",
65
65
  "prisma"
66
- ]
66
+ ],
67
+ "publishConfig": {
68
+ "access": "public"
69
+ }
67
70
  }