@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.
- package/dist/__tests__/ticketBnplPaymentMethods.cashapp.test.d.ts +2 -0
- package/dist/__tests__/ticketBnplPaymentMethods.cashapp.test.d.ts.map +1 -0
- package/dist/__tests__/ticketBnplPaymentMethods.cashapp.test.js +33 -0
- package/dist/__tests__/ticketBnplPaymentMethods.cashapp.test.js.map +1 -0
- package/dist/__tests__/ticketBnplPaymentMethods.test.d.ts +2 -0
- package/dist/__tests__/ticketBnplPaymentMethods.test.d.ts.map +1 -0
- package/dist/__tests__/ticketBnplPaymentMethods.test.js +46 -0
- package/dist/__tests__/ticketBnplPaymentMethods.test.js.map +1 -0
- package/dist/definitions.d.ts +6 -1
- package/dist/definitions.d.ts.map +1 -1
- package/dist/definitions.js.map +1 -1
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/ticketBnplPaymentMethods.d.ts +32 -0
- package/dist/ticketBnplPaymentMethods.d.ts.map +1 -0
- package/dist/ticketBnplPaymentMethods.js +42 -0
- package/dist/ticketBnplPaymentMethods.js.map +1 -0
- package/dist/utils/__tests__/featuredDiscoveryGeo.test.d.ts +2 -0
- package/dist/utils/__tests__/featuredDiscoveryGeo.test.d.ts.map +1 -0
- package/dist/utils/__tests__/featuredDiscoveryGeo.test.js +98 -0
- package/dist/utils/__tests__/featuredDiscoveryGeo.test.js.map +1 -0
- package/dist/utils/__tests__/flyerUtils.test.js +7 -1
- package/dist/utils/__tests__/flyerUtils.test.js.map +1 -1
- package/dist/utils/__tests__/guestSurface.test.d.ts +2 -0
- package/dist/utils/__tests__/guestSurface.test.d.ts.map +1 -0
- package/dist/utils/__tests__/guestSurface.test.js +94 -0
- package/dist/utils/__tests__/guestSurface.test.js.map +1 -0
- package/dist/utils/__tests__/ticketTierSchedule.test.d.ts +2 -0
- package/dist/utils/__tests__/ticketTierSchedule.test.d.ts.map +1 -0
- package/dist/utils/__tests__/ticketTierSchedule.test.js +84 -0
- package/dist/utils/__tests__/ticketTierSchedule.test.js.map +1 -0
- package/dist/utils/featuredDiscoveryGeo.d.ts +30 -0
- package/dist/utils/featuredDiscoveryGeo.d.ts.map +1 -0
- package/dist/utils/featuredDiscoveryGeo.js +47 -0
- package/dist/utils/featuredDiscoveryGeo.js.map +1 -0
- package/dist/utils/flyerUtils.d.ts +5 -0
- package/dist/utils/flyerUtils.d.ts.map +1 -1
- package/dist/utils/flyerUtils.js +24 -0
- package/dist/utils/flyerUtils.js.map +1 -1
- package/dist/utils/guestSurface.d.ts +114 -0
- package/dist/utils/guestSurface.d.ts.map +1 -0
- package/dist/utils/guestSurface.js +164 -0
- package/dist/utils/guestSurface.js.map +1 -0
- package/dist/utils/promotionBlastUtils.d.ts +38 -0
- package/dist/utils/promotionBlastUtils.d.ts.map +1 -0
- package/dist/utils/promotionBlastUtils.js +88 -0
- package/dist/utils/promotionBlastUtils.js.map +1 -0
- package/dist/utils/service/__tests__/defaultOfferAmountUtils.test.d.ts +2 -0
- package/dist/utils/service/__tests__/defaultOfferAmountUtils.test.d.ts.map +1 -0
- package/dist/utils/service/__tests__/defaultOfferAmountUtils.test.js +65 -0
- package/dist/utils/service/__tests__/defaultOfferAmountUtils.test.js.map +1 -0
- package/dist/utils/service/defaultOfferAmountUtils.d.ts +32 -0
- package/dist/utils/service/defaultOfferAmountUtils.d.ts.map +1 -0
- package/dist/utils/service/defaultOfferAmountUtils.js +115 -0
- package/dist/utils/service/defaultOfferAmountUtils.js.map +1 -0
- package/dist/utils/service/serviceBookingExposureUtils.js +1 -1
- package/dist/utils/service/serviceBookingExposureUtils.js.map +1 -1
- package/dist/utils/ticketTierSchedule.d.ts +58 -0
- package/dist/utils/ticketTierSchedule.d.ts.map +1 -0
- package/dist/utils/ticketTierSchedule.js +279 -0
- package/dist/utils/ticketTierSchedule.js.map +1 -0
- package/package.json +5 -2
- package/prisma/schema.prisma +332 -1
- package/src/__tests__/ticketBnplPaymentMethods.cashapp.test.ts +45 -0
- package/src/__tests__/ticketBnplPaymentMethods.test.ts +66 -0
- package/src/definitions.ts +6 -1
- package/src/index.ts +6 -0
- package/src/ticketBnplPaymentMethods.ts +79 -0
- package/src/utils/__tests__/featuredDiscoveryGeo.test.ts +120 -0
- package/src/utils/__tests__/flyerUtils.test.ts +10 -0
- package/src/utils/__tests__/guestSurface.test.ts +128 -0
- package/src/utils/__tests__/ticketTierSchedule.test.ts +131 -0
- package/src/utils/featuredDiscoveryGeo.ts +75 -0
- package/src/utils/flyerUtils.ts +33 -0
- package/src/utils/guestSurface.ts +315 -0
- package/src/utils/promotionBlastUtils.ts +127 -0
- package/src/utils/service/__tests__/defaultOfferAmountUtils.test.ts +102 -0
- package/src/utils/service/defaultOfferAmountUtils.ts +170 -0
- package/src/utils/service/serviceBookingExposureUtils.ts +1 -1
- 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":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EACL,+BAA+B,EAC/B,kBAAkB,GACnB,MAAM,
|
|
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.
|
|
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
|
}
|