@bash-app/bash-common 30.408.0 → 30.413.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__/partnerDealflow.test.d.ts +2 -0
- package/dist/__tests__/partnerDealflow.test.d.ts.map +1 -0
- package/dist/__tests__/partnerDealflow.test.js +51 -0
- package/dist/__tests__/partnerDealflow.test.js.map +1 -0
- package/dist/__tests__/partnerRevenueShareOptIn.test.d.ts +2 -0
- package/dist/__tests__/partnerRevenueShareOptIn.test.d.ts.map +1 -0
- package/dist/__tests__/partnerRevenueShareOptIn.test.js +55 -0
- package/dist/__tests__/partnerRevenueShareOptIn.test.js.map +1 -0
- package/dist/__tests__/reservedCustomBashEventType.test.d.ts +2 -0
- package/dist/__tests__/reservedCustomBashEventType.test.d.ts.map +1 -0
- package/dist/__tests__/reservedCustomBashEventType.test.js +19 -0
- package/dist/__tests__/reservedCustomBashEventType.test.js.map +1 -0
- package/dist/__tests__/serviceListingDealPreferences.test.d.ts +2 -0
- package/dist/__tests__/serviceListingDealPreferences.test.d.ts.map +1 -0
- package/dist/__tests__/serviceListingDealPreferences.test.js +84 -0
- package/dist/__tests__/serviceListingDealPreferences.test.js.map +1 -0
- package/dist/__tests__/statusEnums.test.js +1 -0
- package/dist/__tests__/statusEnums.test.js.map +1 -1
- package/dist/definitions.d.ts +7 -0
- package/dist/definitions.d.ts.map +1 -1
- package/dist/definitions.js +42 -0
- package/dist/definitions.js.map +1 -1
- package/dist/extendedSchemas.d.ts +101 -1
- package/dist/extendedSchemas.d.ts.map +1 -1
- package/dist/extendedSchemas.js +31 -0
- package/dist/extendedSchemas.js.map +1 -1
- package/dist/homepageSyntheticRows.d.ts +9 -0
- package/dist/homepageSyntheticRows.d.ts.map +1 -0
- package/dist/homepageSyntheticRows.js +26 -0
- package/dist/homepageSyntheticRows.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/membershipDefinitions.d.ts +2 -0
- package/dist/membershipDefinitions.d.ts.map +1 -1
- package/dist/membershipDefinitions.js +2 -0
- package/dist/membershipDefinitions.js.map +1 -1
- package/dist/mirroredPrismaEnums.d.ts +1 -0
- package/dist/mirroredPrismaEnums.d.ts.map +1 -1
- package/dist/mirroredPrismaEnums.js +1 -0
- package/dist/mirroredPrismaEnums.js.map +1 -1
- package/dist/utils/__tests__/slugUtils.test.js +4 -4
- package/dist/utils/__tests__/slugUtils.test.js.map +1 -1
- package/dist/utils/service/partnerDealflow.d.ts +12 -0
- package/dist/utils/service/partnerDealflow.d.ts.map +1 -0
- package/dist/utils/service/partnerDealflow.js +33 -0
- package/dist/utils/service/partnerDealflow.js.map +1 -0
- package/dist/utils/service/partnerRevenueShareOptIn.d.ts +18 -0
- package/dist/utils/service/partnerRevenueShareOptIn.d.ts.map +1 -0
- package/dist/utils/service/partnerRevenueShareOptIn.js +46 -0
- package/dist/utils/service/partnerRevenueShareOptIn.js.map +1 -0
- package/dist/utils/service/serviceListingDealPreferences.d.ts +28 -0
- package/dist/utils/service/serviceListingDealPreferences.d.ts.map +1 -0
- package/dist/utils/service/serviceListingDealPreferences.js +126 -0
- package/dist/utils/service/serviceListingDealPreferences.js.map +1 -0
- package/dist/utils/slugUtils.d.ts +4 -1
- package/dist/utils/slugUtils.d.ts.map +1 -1
- package/dist/utils/slugUtils.js +8 -2
- package/dist/utils/slugUtils.js.map +1 -1
- package/package.json +5 -2
- package/prisma/schema.prisma +69 -0
- package/src/__tests__/partnerDealflow.test.ts +62 -0
- package/src/__tests__/partnerRevenueShareOptIn.test.ts +68 -0
- package/src/__tests__/reservedCustomBashEventType.test.ts +27 -0
- package/src/__tests__/serviceListingDealPreferences.test.ts +112 -0
- package/src/__tests__/statusEnums.test.ts +1 -0
- package/src/definitions.ts +53 -0
- package/src/extendedSchemas.ts +60 -0
- package/src/homepageSyntheticRows.ts +32 -0
- package/src/index.ts +4 -0
- package/src/membershipDefinitions.ts +2 -0
- package/src/mirroredPrismaEnums.ts +1 -0
- package/src/utils/__tests__/slugUtils.test.ts +4 -3
- package/src/utils/service/partnerDealflow.ts +47 -0
- package/src/utils/service/partnerRevenueShareOptIn.ts +70 -0
- package/src/utils/service/serviceListingDealPreferences.ts +184 -0
- package/src/utils/slugUtils.ts +12 -1
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/** Which sales count when a partner shares revenue with the host. */
|
|
2
|
+
export const REVENUE_SHARE_WITH_HOST_BASIS = {
|
|
3
|
+
ALL_SALES: "ALL_SALES",
|
|
4
|
+
REFERRAL_ATTRIBUTED: "REFERRAL_ATTRIBUTED",
|
|
5
|
+
};
|
|
6
|
+
export const REVENUE_SHARE_WITH_HOST_BASIS_LABEL = {
|
|
7
|
+
ALL_SALES: "All sales at the bash",
|
|
8
|
+
REFERRAL_ATTRIBUTED: "Sales from guests using my code only",
|
|
9
|
+
};
|
|
10
|
+
function partnerFieldsFromRecord(row) {
|
|
11
|
+
if (!row)
|
|
12
|
+
return null;
|
|
13
|
+
return row;
|
|
14
|
+
}
|
|
15
|
+
/** Reads partner rev-share opt-in from any service subtype payload. */
|
|
16
|
+
export function readPartnerRevenueShareFields(service) {
|
|
17
|
+
if (service.vendor?.preferences) {
|
|
18
|
+
return partnerFieldsFromRecord(service.vendor.preferences);
|
|
19
|
+
}
|
|
20
|
+
if (service.exhibitor) {
|
|
21
|
+
return partnerFieldsFromRecord(service.exhibitor);
|
|
22
|
+
}
|
|
23
|
+
if (service.sponsor) {
|
|
24
|
+
return partnerFieldsFromRecord(service.sponsor);
|
|
25
|
+
}
|
|
26
|
+
if (service.entertainmentService) {
|
|
27
|
+
return partnerFieldsFromRecord(service.entertainmentService);
|
|
28
|
+
}
|
|
29
|
+
if (service.eventService) {
|
|
30
|
+
return partnerFieldsFromRecord(service.eventService);
|
|
31
|
+
}
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
/** True when listing is open to a revenue-share deal (partner or venue ticket split). */
|
|
35
|
+
export function serviceListingOpenToRevenueShare(service) {
|
|
36
|
+
const venue = service.venue;
|
|
37
|
+
if (venue?.revenueShareEnabled === true &&
|
|
38
|
+
venue.revenueShareHostPercentage != null) {
|
|
39
|
+
return true;
|
|
40
|
+
}
|
|
41
|
+
const partner = readPartnerRevenueShareFields(service);
|
|
42
|
+
return (partner?.openToRevenueShareWithHost === true &&
|
|
43
|
+
partner.revenueShareWithHostPercentage != null &&
|
|
44
|
+
partner.revenueShareWithHostPercentage >= 0);
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=partnerRevenueShareOptIn.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"partnerRevenueShareOptIn.js","sourceRoot":"","sources":["../../../src/utils/service/partnerRevenueShareOptIn.ts"],"names":[],"mappings":"AAEA,qEAAqE;AACrE,MAAM,CAAC,MAAM,6BAA6B,GAAG;IAC3C,SAAS,EAAE,WAAW;IACtB,mBAAmB,EAAE,qBAAqB;CAClC,CAAC;AAKX,MAAM,CAAC,MAAM,mCAAmC,GAG5C;IACF,SAAS,EAAE,uBAAuB;IAClC,mBAAmB,EAAE,sCAAsC;CAC5D,CAAC;AAQF,SAAS,uBAAuB,CAC9B,GAAiD;IAEjD,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,OAAO,GAAG,CAAC;AACb,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,6BAA6B,CAC3C,OAAmB;IAEnB,IAAI,OAAO,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC;QAChC,OAAO,uBAAuB,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAC7D,CAAC;IACD,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QACtB,OAAO,uBAAuB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACpD,CAAC;IACD,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,OAAO,uBAAuB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAClD,CAAC;IACD,IAAI,OAAO,CAAC,oBAAoB,EAAE,CAAC;QACjC,OAAO,uBAAuB,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAC/D,CAAC;IACD,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;QACzB,OAAO,uBAAuB,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IACvD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,yFAAyF;AACzF,MAAM,UAAU,gCAAgC,CAAC,OAAmB;IAClE,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAC5B,IACE,KAAK,EAAE,mBAAmB,KAAK,IAAI;QACnC,KAAK,CAAC,0BAA0B,IAAI,IAAI,EACxC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,OAAO,GAAG,6BAA6B,CAAC,OAAO,CAAC,CAAC;IACvD,OAAO,CACL,OAAO,EAAE,0BAA0B,KAAK,IAAI;QAC5C,OAAO,CAAC,8BAA8B,IAAI,IAAI;QAC9C,OAAO,CAAC,8BAA8B,IAAI,CAAC,CAC5C,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { ServiceExt } from "../../extendedSchemas";
|
|
2
|
+
export type ServiceListingDealBadge = {
|
|
3
|
+
id: string;
|
|
4
|
+
label: string;
|
|
5
|
+
};
|
|
6
|
+
export type ServiceListingDealDetailRow = {
|
|
7
|
+
label: string;
|
|
8
|
+
value: string;
|
|
9
|
+
};
|
|
10
|
+
/** Compact chips for cards and list rows. */
|
|
11
|
+
export declare function getServiceListingDealBadges(service: ServiceExt): ServiceListingDealBadge[];
|
|
12
|
+
/** Longer copy for public detail pages. */
|
|
13
|
+
export declare function getServiceListingDealDetailRows(service: ServiceExt): ServiceListingDealDetailRow[];
|
|
14
|
+
/** Card preview line for in-kind (truncated). */
|
|
15
|
+
export declare function getServiceListingInKindPreview(service: ServiceExt, maxLen?: number): string | null;
|
|
16
|
+
export type PartnerDealflowBookingSnapshot = {
|
|
17
|
+
openToRevenueShareWithHostSnapshot?: boolean;
|
|
18
|
+
revenueShareWithHostPercentageSnapshot?: number | null;
|
|
19
|
+
revenueShareWithHostBasisSnapshot?: string | null;
|
|
20
|
+
openToInKindDealsSnapshot?: boolean;
|
|
21
|
+
inKindDealOfferTextSnapshot?: string | null;
|
|
22
|
+
inKindEstimatedValueCentsSnapshot?: number | null;
|
|
23
|
+
dealRequiresMinimumCashSnapshot?: boolean;
|
|
24
|
+
dealMinimumCashCentsSnapshot?: number | null;
|
|
25
|
+
};
|
|
26
|
+
/** Copy live listing deal prefs onto a booking at confirmation time. */
|
|
27
|
+
export declare function buildPartnerDealflowBookingSnapshot(service: ServiceExt): PartnerDealflowBookingSnapshot;
|
|
28
|
+
//# sourceMappingURL=serviceListingDealPreferences.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serviceListingDealPreferences.d.ts","sourceRoot":"","sources":["../../../src/utils/service/serviceListingDealPreferences.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAYxD,MAAM,MAAM,uBAAuB,GAAG;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,2BAA2B,GAAG;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAqBF,6CAA6C;AAC7C,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,UAAU,GAClB,uBAAuB,EAAE,CAyB3B;AAED,2CAA2C;AAC3C,wBAAgB,+BAA+B,CAC7C,OAAO,EAAE,UAAU,GAClB,2BAA2B,EAAE,CAgD/B;AAED,iDAAiD;AACjD,wBAAgB,8BAA8B,CAC5C,OAAO,EAAE,UAAU,EACnB,MAAM,SAAK,GACV,MAAM,GAAG,IAAI,CAMf;AAED,MAAM,MAAM,8BAA8B,GAAG;IAC3C,kCAAkC,CAAC,EAAE,OAAO,CAAC;IAC7C,sCAAsC,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvD,iCAAiC,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClD,yBAAyB,CAAC,EAAE,OAAO,CAAC;IACpC,2BAA2B,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5C,iCAAiC,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClD,+BAA+B,CAAC,EAAE,OAAO,CAAC;IAC1C,4BAA4B,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9C,CAAC;AAEF,wEAAwE;AACxE,wBAAgB,mCAAmC,CACjD,OAAO,EAAE,UAAU,GAClB,8BAA8B,CAiChC"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { readPartnerDealflowFields, serviceListingOpenToInKindDeal, } from "./partnerDealflow.js";
|
|
2
|
+
import { readPartnerRevenueShareFields, REVENUE_SHARE_WITH_HOST_BASIS_LABEL, serviceListingOpenToRevenueShare, } from "./partnerRevenueShareOptIn.js";
|
|
3
|
+
function formatUsdFromCents(cents) {
|
|
4
|
+
const dollars = cents / 100;
|
|
5
|
+
return dollars % 1 === 0 ? `$${dollars.toFixed(0)}` : `$${dollars.toFixed(2)}`;
|
|
6
|
+
}
|
|
7
|
+
function minimumCashLabel(deal) {
|
|
8
|
+
if (deal?.dealRequiresMinimumCash !== true)
|
|
9
|
+
return null;
|
|
10
|
+
if (typeof deal.dealMinimumCashCents !== "number" || deal.dealMinimumCashCents <= 0) {
|
|
11
|
+
return null;
|
|
12
|
+
}
|
|
13
|
+
return `${formatUsdFromCents(deal.dealMinimumCashCents)} min cash`;
|
|
14
|
+
}
|
|
15
|
+
function truncateOffer(text, maxLen) {
|
|
16
|
+
const t = text.trim();
|
|
17
|
+
if (t.length <= maxLen)
|
|
18
|
+
return t;
|
|
19
|
+
return `${t.slice(0, maxLen - 1).trim()}…`;
|
|
20
|
+
}
|
|
21
|
+
/** Compact chips for cards and list rows. */
|
|
22
|
+
export function getServiceListingDealBadges(service) {
|
|
23
|
+
const badges = [];
|
|
24
|
+
const deal = readPartnerDealflowFields(service);
|
|
25
|
+
if (serviceListingOpenToRevenueShare(service)) {
|
|
26
|
+
badges.push({ id: "rev-share", label: "Rev share" });
|
|
27
|
+
}
|
|
28
|
+
if (serviceListingOpenToInKindDeal(service)) {
|
|
29
|
+
badges.push({ id: "in-kind", label: "In-kind" });
|
|
30
|
+
}
|
|
31
|
+
const minCash = minimumCashLabel(deal);
|
|
32
|
+
if (minCash) {
|
|
33
|
+
badges.push({ id: "min-cash", label: minCash });
|
|
34
|
+
}
|
|
35
|
+
const hostBidOpen = service.vendor?.preferences?.openToHostBids === true ||
|
|
36
|
+
service.exhibitor?.openToHostBids === true ||
|
|
37
|
+
service.sponsor?.openToHostBids === true;
|
|
38
|
+
if (hostBidOpen) {
|
|
39
|
+
badges.push({ id: "host-bids", label: "Host bids" });
|
|
40
|
+
}
|
|
41
|
+
return badges;
|
|
42
|
+
}
|
|
43
|
+
/** Longer copy for public detail pages. */
|
|
44
|
+
export function getServiceListingDealDetailRows(service) {
|
|
45
|
+
const rows = [];
|
|
46
|
+
const deal = readPartnerDealflowFields(service);
|
|
47
|
+
const rev = readPartnerRevenueShareFields(service);
|
|
48
|
+
const venue = service.venue;
|
|
49
|
+
if (venue?.revenueShareEnabled === true && venue.revenueShareHostPercentage != null) {
|
|
50
|
+
rows.push({
|
|
51
|
+
label: "Venue revenue share",
|
|
52
|
+
value: `Host keeps ${venue.revenueShareHostPercentage}% of agreed ticket or bar revenue.`,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
else if (rev?.openToRevenueShareWithHost === true) {
|
|
56
|
+
const pct = rev.revenueShareWithHostPercentage;
|
|
57
|
+
const basis = rev.revenueShareWithHostBasis;
|
|
58
|
+
const basisLabel = basis && basis in REVENUE_SHARE_WITH_HOST_BASIS_LABEL
|
|
59
|
+
? REVENUE_SHARE_WITH_HOST_BASIS_LABEL[basis]
|
|
60
|
+
: null;
|
|
61
|
+
rows.push({
|
|
62
|
+
label: "Revenue share with host",
|
|
63
|
+
value: typeof pct === "number"
|
|
64
|
+
? `Shares ${pct}% with the host${basisLabel ? ` (${basisLabel.toLowerCase()})` : ""}.`
|
|
65
|
+
: "Open to sharing revenue with the host (percentage not set).",
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
if (serviceListingOpenToInKindDeal(service) && deal?.inKindDealOfferText) {
|
|
69
|
+
const est = typeof deal.inKindEstimatedValueCents === "number" &&
|
|
70
|
+
deal.inKindEstimatedValueCents > 0
|
|
71
|
+
? ` Approx. value ${formatUsdFromCents(deal.inKindEstimatedValueCents)}.`
|
|
72
|
+
: "";
|
|
73
|
+
rows.push({
|
|
74
|
+
label: "In-kind / trade offer",
|
|
75
|
+
value: `${deal.inKindDealOfferText.trim()}${est}`,
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
const minCash = minimumCashLabel(deal);
|
|
79
|
+
if (minCash) {
|
|
80
|
+
rows.push({
|
|
81
|
+
label: "Minimum cash on hybrid deals",
|
|
82
|
+
value: `Requires ${minCash.replace(" min cash", "")} minimum cash alongside rev-share or in-kind terms so hosts know you're serious.`,
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
return rows;
|
|
86
|
+
}
|
|
87
|
+
/** Card preview line for in-kind (truncated). */
|
|
88
|
+
export function getServiceListingInKindPreview(service, maxLen = 80) {
|
|
89
|
+
const deal = readPartnerDealflowFields(service);
|
|
90
|
+
if (!serviceListingOpenToInKindDeal(service) || !deal?.inKindDealOfferText) {
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
return truncateOffer(deal.inKindDealOfferText, maxLen);
|
|
94
|
+
}
|
|
95
|
+
/** Copy live listing deal prefs onto a booking at confirmation time. */
|
|
96
|
+
export function buildPartnerDealflowBookingSnapshot(service) {
|
|
97
|
+
const rev = readPartnerRevenueShareFields(service);
|
|
98
|
+
const deal = readPartnerDealflowFields(service);
|
|
99
|
+
const venue = service.venue;
|
|
100
|
+
const snap = {};
|
|
101
|
+
if (venue?.revenueShareEnabled === true) {
|
|
102
|
+
snap.openToRevenueShareWithHostSnapshot = true;
|
|
103
|
+
snap.revenueShareWithHostPercentageSnapshot =
|
|
104
|
+
venue.revenueShareHostPercentage ?? null;
|
|
105
|
+
snap.revenueShareWithHostBasisSnapshot = venue.revenueShareBasis ?? null;
|
|
106
|
+
}
|
|
107
|
+
else if (rev?.openToRevenueShareWithHost === true) {
|
|
108
|
+
snap.openToRevenueShareWithHostSnapshot = true;
|
|
109
|
+
snap.revenueShareWithHostPercentageSnapshot =
|
|
110
|
+
rev.revenueShareWithHostPercentage ?? null;
|
|
111
|
+
snap.revenueShareWithHostBasisSnapshot =
|
|
112
|
+
rev.revenueShareWithHostBasis ?? null;
|
|
113
|
+
}
|
|
114
|
+
if (deal?.openToInKindDeals === true) {
|
|
115
|
+
snap.openToInKindDealsSnapshot = true;
|
|
116
|
+
snap.inKindDealOfferTextSnapshot = deal.inKindDealOfferText?.trim() ?? null;
|
|
117
|
+
snap.inKindEstimatedValueCentsSnapshot =
|
|
118
|
+
deal.inKindEstimatedValueCents ?? null;
|
|
119
|
+
}
|
|
120
|
+
if (deal?.dealRequiresMinimumCash === true) {
|
|
121
|
+
snap.dealRequiresMinimumCashSnapshot = true;
|
|
122
|
+
snap.dealMinimumCashCentsSnapshot = deal.dealMinimumCashCents ?? null;
|
|
123
|
+
}
|
|
124
|
+
return snap;
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=serviceListingDealPreferences.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serviceListingDealPreferences.js","sourceRoot":"","sources":["../../../src/utils/service/serviceListingDealPreferences.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,7 +16,10 @@ export declare function getPublicBashMemoriesPath(bashEventId: string, slug: str
|
|
|
16
16
|
export declare function getBashEventWizardStepPath(bashEventId: string, majorStep: number, subStep: number): string;
|
|
17
17
|
/** Host redirect target: "How" → Payout (Stripe Connect / ticket proceeds). */
|
|
18
18
|
export declare function getBashEventWizardPayoutStepPath(bashEventId: string): string;
|
|
19
|
-
/**
|
|
19
|
+
/**
|
|
20
|
+
* New drafts open on Generate (flyer upload + AI).
|
|
21
|
+
* An existing event id still opens Quick bash so resume does not dump hosts into the composer.
|
|
22
|
+
*/
|
|
20
23
|
export declare function getBashEventWizardStartPath(bashEventId?: string): string;
|
|
21
24
|
export declare function parseBashUrlParams(param: string): {
|
|
22
25
|
id: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slugUtils.d.ts","sourceRoot":"","sources":["../../src/utils/slugUtils.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"slugUtils.d.ts","sourceRoot":"","sources":["../../src/utils/slugUtils.ts"],"names":[],"mappings":"AAyCA,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMlD;AAED,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,MAAM,EACb,eAAe,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,EACvE,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,CAAC,CAajB;AAED,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAE/E;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAC9B,MAAM,CAMR;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CACvC,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAC9B,MAAM,CAER;AAED,yFAAyF;AACzF,wBAAgB,0BAA0B,CACxC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACd,MAAM,CAER;AAED,+EAA+E;AAC/E,wBAAgB,gCAAgC,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAM5E;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CAAC,WAAW,SAAQ,GAAG,MAAM,CAavE;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG,IAAI,CAqB5F;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGlD"}
|
package/dist/utils/slugUtils.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as slugifyImport from "slugify";
|
|
2
|
-
import { BASH_DETAIL_URL, BASH_EVENT_WIZARD_HOW_MAJOR_STEP, BASH_EVENT_WIZARD_HOW_SUBSTEP_PAYOUT, BASH_EVENT_WIZARD_MAJOR, BASH_EVENT_WIZARD_PATH_PREFIX, BASH_EVENT_WIZARD_TEMPLATES_SUBSTEP, } from '../definitions.js';
|
|
2
|
+
import { BASH_DETAIL_URL, BASH_EVENT_WIZARD_GENERATE_SUBSTEP, BASH_EVENT_WIZARD_HOW_MAJOR_STEP, BASH_EVENT_WIZARD_HOW_SUBSTEP_PAYOUT, BASH_EVENT_WIZARD_MAJOR, BASH_EVENT_WIZARD_PATH_PREFIX, BASH_EVENT_WIZARD_TEMPLATES_SUBSTEP, } from '../definitions.js';
|
|
3
3
|
function isSlugifyFn(value) {
|
|
4
4
|
return typeof value === "function";
|
|
5
5
|
}
|
|
@@ -67,8 +67,14 @@ export function getBashEventWizardStepPath(bashEventId, majorStep, subStep) {
|
|
|
67
67
|
export function getBashEventWizardPayoutStepPath(bashEventId) {
|
|
68
68
|
return getBashEventWizardStepPath(bashEventId, BASH_EVENT_WIZARD_HOW_MAJOR_STEP, BASH_EVENT_WIZARD_HOW_SUBSTEP_PAYOUT);
|
|
69
69
|
}
|
|
70
|
-
/**
|
|
70
|
+
/**
|
|
71
|
+
* New drafts open on Generate (flyer upload + AI).
|
|
72
|
+
* An existing event id still opens Quick bash so resume does not dump hosts into the composer.
|
|
73
|
+
*/
|
|
71
74
|
export function getBashEventWizardStartPath(bashEventId = "new") {
|
|
75
|
+
if (bashEventId === "new") {
|
|
76
|
+
return getBashEventWizardStepPath(bashEventId, BASH_EVENT_WIZARD_MAJOR.GENERATE, BASH_EVENT_WIZARD_GENERATE_SUBSTEP.START);
|
|
77
|
+
}
|
|
72
78
|
return getBashEventWizardStepPath(bashEventId, BASH_EVENT_WIZARD_MAJOR.TEMPLATES, BASH_EVENT_WIZARD_TEMPLATES_SUBSTEP.START);
|
|
73
79
|
}
|
|
74
80
|
export function parseBashUrlParams(param) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slugUtils.js","sourceRoot":"","sources":["../../src/utils/slugUtils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,aAAa,MAAM,SAAS,CAAC;AACzC,OAAO,EACL,eAAe,EACf,gCAAgC,EAChC,oCAAoC,EACpC,uBAAuB,EACvB,6BAA6B,EAC7B,mCAAmC,GACpC,MAAM,mBAAmB,CAAC;AAU3B,SAAS,WAAW,CAAC,KAAc;IACjC,OAAO,OAAO,KAAK,KAAK,UAAU,CAAC;AACrC,CAAC;AAED,yFAAyF;AACzF,SAAS,cAAc;IACrB,IAAI,WAAW,CAAC,aAAa,CAAC,EAAE,CAAC;QAC/B,OAAO,aAAa,CAAC;IACvB,CAAC;IACD,IACE,OAAO,aAAa,KAAK,QAAQ;QACjC,aAAa,KAAK,IAAI;QACtB,SAAS,IAAI,aAAa;QAC1B,WAAW,CAAC,aAAa,CAAC,OAAO,CAAC,EAClC,CAAC;QACD,OAAO,aAAa,CAAC,OAAO,CAAC;IAC/B,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;AACxE,CAAC;AAED,MAAM,OAAO,GAAG,cAAc,EAAE,CAAC;AAEjC,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,OAAO,OAAO,CAAC,KAAK,EAAE;QACpB,KAAK,EAAE,IAAI;QACX,MAAM,EAAE,IAAI;QACZ,MAAM,EAAE,gBAAgB;KACzB,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,KAAa,EACb,eAAuE,EACvE,SAAkB;IAElB,MAAM,QAAQ,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IACrC,IAAI,IAAI,GAAG,QAAQ,CAAC;IACpB,IAAI,OAAO,GAAG,CAAC,CAAC;IAEhB,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QACtD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,GAAG,GAAG,QAAQ,IAAI,OAAO,EAAE,CAAC;QAChC,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,WAAmB,EAAE,IAAY;IACrE,OAAO,SAAS,WAAW,IAAI,IAAI,EAAE,CAAC;AACxC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CACrC,WAAmB,EACnB,IAA+B;IAE/B,MAAM,CAAC,GAAG,IAAI,EAAE,IAAI,EAAE,CAAC;IACvB,IAAI,CAAC,EAAE,CAAC;QACN,OAAO,qBAAqB,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IAC/C,CAAC;IACD,OAAO,GAAG,eAAe,IAAI,WAAW,EAAE,CAAC;AAC7C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,yBAAyB,CACvC,WAAmB,EACnB,IAA+B;IAE/B,OAAO,GAAG,uBAAuB,CAAC,WAAW,EAAE,IAAI,CAAC,WAAW,CAAC;AAClE,CAAC;AAED,yFAAyF;AACzF,MAAM,UAAU,0BAA0B,CACxC,WAAmB,EACnB,SAAiB,EACjB,OAAe;IAEf,OAAO,GAAG,6BAA6B,IAAI,WAAW,IAAI,SAAS,IAAI,OAAO,EAAE,CAAC;AACnF,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,gCAAgC,CAAC,WAAmB;IAClE,OAAO,0BAA0B,CAC/B,WAAW,EACX,gCAAgC,EAChC,oCAAoC,CACrC,CAAC;AACJ,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"slugUtils.js","sourceRoot":"","sources":["../../src/utils/slugUtils.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.413.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",
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
"@aws-sdk/client-textract": "^3.1004.0",
|
|
38
38
|
"@aws-sdk/s3-request-presigner": "^3.1004.0",
|
|
39
39
|
"@types/qrcode": "^1.5.5",
|
|
40
|
-
"lodash-es": "
|
|
40
|
+
"lodash-es": "4.18.1",
|
|
41
41
|
"mixpanel-browser": "^2.75.0",
|
|
42
42
|
"qrcode": "^1.5.3",
|
|
43
43
|
"slugify": "^1.6.6"
|
|
@@ -76,5 +76,8 @@
|
|
|
76
76
|
],
|
|
77
77
|
"publishConfig": {
|
|
78
78
|
"access": "public"
|
|
79
|
+
},
|
|
80
|
+
"overrides": {
|
|
81
|
+
"lodash-es": "4.18.1"
|
|
79
82
|
}
|
|
80
83
|
}
|
package/prisma/schema.prisma
CHANGED
|
@@ -913,6 +913,10 @@ model BashEvent {
|
|
|
913
913
|
timezone String?
|
|
914
914
|
startDateTime DateTime?
|
|
915
915
|
endDateTime DateTime?
|
|
916
|
+
/// Wall clock kept when Duplicate clears the calendar day (hour/minute + overnight).
|
|
917
|
+
pendingScheduleClock Json?
|
|
918
|
+
/// When false, public pages and checkout hide sibling series dates and sell only this occurrence.
|
|
919
|
+
advertiseRecurrence Boolean @default(true)
|
|
916
920
|
waiverUrl String?
|
|
917
921
|
waiverRequired Boolean @default(false)
|
|
918
922
|
waiverDisplayType String? @default("inline")
|
|
@@ -1122,6 +1126,12 @@ model BashEvent {
|
|
|
1122
1126
|
fundingShowPledgesOnMeter Boolean @default(false)
|
|
1123
1127
|
/// When true on Rsvp-mode events, affirmative RSVPs land in a host approval queue first.
|
|
1124
1128
|
rsvpRequiresApproval Boolean @default(false)
|
|
1129
|
+
/// Host-set password that gates the public bash page. Null = off. Never returned to clients.
|
|
1130
|
+
eventAccessPasswordHash String?
|
|
1131
|
+
/// HMAC of the host-issued door staff code. Null = off. Never returned to clients.
|
|
1132
|
+
doorAccessCodeDigest String? @unique
|
|
1133
|
+
/// When false, guests cannot start a peer-to-peer ticket transfer. Default on.
|
|
1134
|
+
allowTicketTransfers Boolean @default(true)
|
|
1125
1135
|
/// Hide when guests RSVP'd on host-facing attendee views.
|
|
1126
1136
|
hideRsvpTimestamps Boolean @default(false)
|
|
1127
1137
|
/// Only allow inviting people who share a mutual bash with the host.
|
|
@@ -5900,6 +5910,14 @@ model EventService {
|
|
|
5900
5910
|
fulfillmentModes String[] @default([])
|
|
5901
5911
|
/// Minimum advance-notice days required for F&B bookings (e.g. 7 = one week).
|
|
5902
5912
|
leadTimeDays Int?
|
|
5913
|
+
openToRevenueShareWithHost Boolean @default(false)
|
|
5914
|
+
revenueShareWithHostPercentage Int?
|
|
5915
|
+
revenueShareWithHostBasis String?
|
|
5916
|
+
openToInKindDeals Boolean @default(false)
|
|
5917
|
+
inKindDealOfferText String?
|
|
5918
|
+
inKindEstimatedValueCents Int?
|
|
5919
|
+
dealRequiresMinimumCash Boolean @default(false)
|
|
5920
|
+
dealMinimumCashCents Int?
|
|
5903
5921
|
crowdSize AmountOfGuests? @relation(fields: [crowdSizeId], references: [id], onDelete: Cascade)
|
|
5904
5922
|
serviceRange ServiceRange? @relation(fields: [serviceRangeId], references: [id])
|
|
5905
5923
|
service Service?
|
|
@@ -5958,6 +5976,14 @@ model EntertainmentService {
|
|
|
5958
5976
|
minimumQuantity Int?
|
|
5959
5977
|
tierPricing Json?
|
|
5960
5978
|
pricingNotes String?
|
|
5979
|
+
openToRevenueShareWithHost Boolean @default(false)
|
|
5980
|
+
revenueShareWithHostPercentage Int?
|
|
5981
|
+
revenueShareWithHostBasis String?
|
|
5982
|
+
openToInKindDeals Boolean @default(false)
|
|
5983
|
+
inKindDealOfferText String?
|
|
5984
|
+
inKindEstimatedValueCents Int?
|
|
5985
|
+
dealRequiresMinimumCash Boolean @default(false)
|
|
5986
|
+
dealMinimumCashCents Int?
|
|
5961
5987
|
crowdSize AmountOfGuests? @relation(fields: [crowdSizeId], references: [id], onDelete: Cascade)
|
|
5962
5988
|
serviceRange ServiceRange? @relation(fields: [serviceRangeId], references: [id])
|
|
5963
5989
|
service Service?
|
|
@@ -6072,6 +6098,18 @@ model VendorPreferences {
|
|
|
6072
6098
|
bidMinLeadDays Int?
|
|
6073
6099
|
/// small | medium | large — typical event size the vendor prefers.
|
|
6074
6100
|
bidProjectSize String?
|
|
6101
|
+
/// Partner offers a revenue share with the host instead of (or in addition to) upfront fees.
|
|
6102
|
+
openToRevenueShareWithHost Boolean @default(false)
|
|
6103
|
+
/// 0..100 — share of the partner's relevant sales paid to the host.
|
|
6104
|
+
revenueShareWithHostPercentage Int?
|
|
6105
|
+
/// ALL_SALES | REFERRAL_ATTRIBUTED — which sales count toward the share.
|
|
6106
|
+
revenueShareWithHostBasis String?
|
|
6107
|
+
openToInKindDeals Boolean @default(false)
|
|
6108
|
+
inKindDealOfferText String?
|
|
6109
|
+
inKindEstimatedValueCents Int?
|
|
6110
|
+
/// Minimum cash (cents) required alongside rev-share or in-kind deals.
|
|
6111
|
+
dealRequiresMinimumCash Boolean @default(false)
|
|
6112
|
+
dealMinimumCashCents Int?
|
|
6075
6113
|
createdAt DateTime @default(now())
|
|
6076
6114
|
updatedAt DateTime @updatedAt
|
|
6077
6115
|
vendor Vendor @relation(fields: [vendorId], references: [id], onDelete: Cascade)
|
|
@@ -6150,6 +6188,14 @@ model Exhibitor {
|
|
|
6150
6188
|
bidMinLeadDays Int?
|
|
6151
6189
|
/// small | medium | large — typical event size the exhibitor is comfortable with.
|
|
6152
6190
|
bidProjectSize String?
|
|
6191
|
+
openToRevenueShareWithHost Boolean @default(false)
|
|
6192
|
+
revenueShareWithHostPercentage Int?
|
|
6193
|
+
revenueShareWithHostBasis String?
|
|
6194
|
+
openToInKindDeals Boolean @default(false)
|
|
6195
|
+
inKindDealOfferText String?
|
|
6196
|
+
inKindEstimatedValueCents Int?
|
|
6197
|
+
dealRequiresMinimumCash Boolean @default(false)
|
|
6198
|
+
dealMinimumCashCents Int?
|
|
6153
6199
|
|
|
6154
6200
|
crowdSize AmountOfGuests? @relation(fields: [crowdSizeId], references: [id], onDelete: Cascade)
|
|
6155
6201
|
serviceRange ServiceRange? @relation(fields: [serviceRangeId], references: [id])
|
|
@@ -6186,6 +6232,14 @@ model Sponsor {
|
|
|
6186
6232
|
bidMinLeadDays Int?
|
|
6187
6233
|
/// small | medium | large — typical event size the sponsor is comfortable with.
|
|
6188
6234
|
bidProjectSize String?
|
|
6235
|
+
openToRevenueShareWithHost Boolean @default(false)
|
|
6236
|
+
revenueShareWithHostPercentage Int?
|
|
6237
|
+
revenueShareWithHostBasis String?
|
|
6238
|
+
openToInKindDeals Boolean @default(false)
|
|
6239
|
+
inKindDealOfferText String?
|
|
6240
|
+
inKindEstimatedValueCents Int?
|
|
6241
|
+
dealRequiresMinimumCash Boolean @default(false)
|
|
6242
|
+
dealMinimumCashCents Int?
|
|
6189
6243
|
|
|
6190
6244
|
service Service?
|
|
6191
6245
|
crowdSize AmountOfGuests? @relation(fields: [crowdSizeId], references: [id])
|
|
@@ -6277,6 +6331,11 @@ model Venue {
|
|
|
6277
6331
|
revenueShareBasis String?
|
|
6278
6332
|
/// Free-form notes shown next to the rev-share split.
|
|
6279
6333
|
revenueShareNotes String?
|
|
6334
|
+
openToInKindDeals Boolean @default(false)
|
|
6335
|
+
inKindDealOfferText String?
|
|
6336
|
+
inKindEstimatedValueCents Int?
|
|
6337
|
+
dealRequiresMinimumCash Boolean @default(false)
|
|
6338
|
+
dealMinimumCashCents Int?
|
|
6280
6339
|
|
|
6281
6340
|
fbCarryoverCredits VenueFBCarryoverCredit[]
|
|
6282
6341
|
fbMinimumOverrides VenueFBMinimumOverride[]
|
|
@@ -8075,6 +8134,15 @@ model ServiceBooking {
|
|
|
8075
8134
|
revenueShareHostPctSnapshot Int?
|
|
8076
8135
|
/// Snapshot of `Venue.revenueShareBasis`.
|
|
8077
8136
|
revenueShareBasisSnapshot String?
|
|
8137
|
+
/// Partner / venue deal prefs at confirmation (rev-share, in-kind, min cash).
|
|
8138
|
+
openToRevenueShareWithHostSnapshot Boolean?
|
|
8139
|
+
revenueShareWithHostPercentageSnapshot Int?
|
|
8140
|
+
revenueShareWithHostBasisSnapshot String?
|
|
8141
|
+
openToInKindDealsSnapshot Boolean?
|
|
8142
|
+
inKindDealOfferTextSnapshot String?
|
|
8143
|
+
inKindEstimatedValueCentsSnapshot Int?
|
|
8144
|
+
dealRequiresMinimumCashSnapshot Boolean?
|
|
8145
|
+
dealMinimumCashCentsSnapshot Int?
|
|
8078
8146
|
/// Computed venue rev-share owed (cents) at settlement.
|
|
8079
8147
|
revenueShareCalculatedCents Int?
|
|
8080
8148
|
// Settlement lifecycle state (drives dunning, retries, dispute window).
|
|
@@ -11494,6 +11562,7 @@ enum CreditSourceType {
|
|
|
11494
11562
|
BirthdayReward // Annual BashPoints boost on user's birthday
|
|
11495
11563
|
EventReferralReward // Per-event: attendee referred X friends, earned reward
|
|
11496
11564
|
RsvpBonus // First positive RSVP per user per event
|
|
11565
|
+
AvailabilitySignal // Once per user per availability window period (anti-farm)
|
|
11497
11566
|
TicketCheckout // Completing a free or paid checkout per user per event
|
|
11498
11567
|
AttendanceBonus // Checking in at the event (per ticket)
|
|
11499
11568
|
PostBeforeEvent // First BashFeed post linked to event before it ends
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import type { ServiceExt } from "../extendedSchemas";
|
|
2
|
+
import {
|
|
3
|
+
readPartnerDealflowFields,
|
|
4
|
+
serviceListingOpenToInKindDeal,
|
|
5
|
+
} from "../utils/service/partnerDealflow";
|
|
6
|
+
|
|
7
|
+
describe("partnerDealflow", () => {
|
|
8
|
+
it("detects in-kind listings with non-empty offer text", () => {
|
|
9
|
+
const service = {
|
|
10
|
+
sponsor: {
|
|
11
|
+
openToInKindDeals: true,
|
|
12
|
+
inKindDealOfferText: "100 free socks",
|
|
13
|
+
},
|
|
14
|
+
} as ServiceExt;
|
|
15
|
+
|
|
16
|
+
expect(readPartnerDealflowFields(service)?.openToInKindDeals).toBe(true);
|
|
17
|
+
expect(serviceListingOpenToInKindDeal(service)).toBe(true);
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
it("rejects in-kind when offer text is blank", () => {
|
|
21
|
+
const service = {
|
|
22
|
+
sponsor: {
|
|
23
|
+
openToInKindDeals: true,
|
|
24
|
+
inKindDealOfferText: " ",
|
|
25
|
+
},
|
|
26
|
+
} as ServiceExt;
|
|
27
|
+
|
|
28
|
+
expect(serviceListingOpenToInKindDeal(service)).toBe(false);
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
it("reads dealflow from vendor preferences before flat partner rows", () => {
|
|
32
|
+
const service = {
|
|
33
|
+
vendor: {
|
|
34
|
+
preferences: {
|
|
35
|
+
openToInKindDeals: true,
|
|
36
|
+
inKindDealOfferText: "Sample trays",
|
|
37
|
+
dealRequiresMinimumCash: true,
|
|
38
|
+
dealMinimumCashCents: 5000,
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
sponsor: {
|
|
42
|
+
openToInKindDeals: true,
|
|
43
|
+
inKindDealOfferText: "should not win",
|
|
44
|
+
},
|
|
45
|
+
} as ServiceExt;
|
|
46
|
+
|
|
47
|
+
const row = readPartnerDealflowFields(service);
|
|
48
|
+
expect(row?.inKindDealOfferText).toBe("Sample trays");
|
|
49
|
+
expect(row?.dealMinimumCashCents).toBe(5000);
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
it("does not treat in-kind flag alone as a listing when toggle is off", () => {
|
|
53
|
+
const service = {
|
|
54
|
+
venue: {
|
|
55
|
+
openToInKindDeals: false,
|
|
56
|
+
inKindDealOfferText: "Free room night",
|
|
57
|
+
},
|
|
58
|
+
} as ServiceExt;
|
|
59
|
+
|
|
60
|
+
expect(serviceListingOpenToInKindDeal(service)).toBe(false);
|
|
61
|
+
});
|
|
62
|
+
});
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import type { ServiceExt } from "../extendedSchemas";
|
|
2
|
+
import {
|
|
3
|
+
readPartnerRevenueShareFields,
|
|
4
|
+
serviceListingOpenToRevenueShare,
|
|
5
|
+
} from "../utils/service/partnerRevenueShareOptIn";
|
|
6
|
+
|
|
7
|
+
describe("partnerRevenueShareOptIn", () => {
|
|
8
|
+
it("treats venue ticket/bar rev share as discoverable without partner opt-in", () => {
|
|
9
|
+
const service = {
|
|
10
|
+
venue: {
|
|
11
|
+
revenueShareEnabled: true,
|
|
12
|
+
revenueShareHostPercentage: 10,
|
|
13
|
+
},
|
|
14
|
+
} as ServiceExt;
|
|
15
|
+
|
|
16
|
+
expect(serviceListingOpenToRevenueShare(service)).toBe(true);
|
|
17
|
+
expect(readPartnerRevenueShareFields(service)).toBeNull();
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
it("requires partner opt-in plus a non-null percentage", () => {
|
|
21
|
+
const openNoPct = {
|
|
22
|
+
vendor: {
|
|
23
|
+
preferences: {
|
|
24
|
+
openToRevenueShareWithHost: true,
|
|
25
|
+
revenueShareWithHostPercentage: null,
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
} as ServiceExt;
|
|
29
|
+
|
|
30
|
+
expect(serviceListingOpenToRevenueShare(openNoPct)).toBe(false);
|
|
31
|
+
|
|
32
|
+
const closedWithPct = {
|
|
33
|
+
vendor: {
|
|
34
|
+
preferences: {
|
|
35
|
+
openToRevenueShareWithHost: false,
|
|
36
|
+
revenueShareWithHostPercentage: 20,
|
|
37
|
+
},
|
|
38
|
+
},
|
|
39
|
+
} as ServiceExt;
|
|
40
|
+
|
|
41
|
+
expect(serviceListingOpenToRevenueShare(closedWithPct)).toBe(false);
|
|
42
|
+
|
|
43
|
+
const openZero = {
|
|
44
|
+
exhibitor: {
|
|
45
|
+
openToRevenueShareWithHost: true,
|
|
46
|
+
revenueShareWithHostPercentage: 0,
|
|
47
|
+
},
|
|
48
|
+
} as ServiceExt;
|
|
49
|
+
|
|
50
|
+
expect(serviceListingOpenToRevenueShare(openZero)).toBe(true);
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
it("reads rev-share fields from the first matching partner subtype", () => {
|
|
54
|
+
const service = {
|
|
55
|
+
eventService: {
|
|
56
|
+
openToRevenueShareWithHost: true,
|
|
57
|
+
revenueShareWithHostPercentage: 12,
|
|
58
|
+
revenueShareWithHostBasis: "REFERRAL_ATTRIBUTED",
|
|
59
|
+
},
|
|
60
|
+
} as ServiceExt;
|
|
61
|
+
|
|
62
|
+
expect(readPartnerRevenueShareFields(service)).toEqual({
|
|
63
|
+
openToRevenueShareWithHost: true,
|
|
64
|
+
revenueShareWithHostPercentage: 12,
|
|
65
|
+
revenueShareWithHostBasis: "REFERRAL_ATTRIBUTED",
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
});
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import {
|
|
2
|
+
isReservedCustomBashEventTypeDisplayName,
|
|
3
|
+
} from "../definitions.js";
|
|
4
|
+
|
|
5
|
+
describe("isReservedCustomBashEventTypeDisplayName", () => {
|
|
6
|
+
it("blocks homepage synthetic section titles", () => {
|
|
7
|
+
expect(isReservedCustomBashEventTypeDisplayName("Featured")).toBe(true);
|
|
8
|
+
expect(isReservedCustomBashEventTypeDisplayName("Popular")).toBe(true);
|
|
9
|
+
expect(isReservedCustomBashEventTypeDisplayName("Trending")).toBe(true);
|
|
10
|
+
expect(isReservedCustomBashEventTypeDisplayName("Ideas")).toBe(true);
|
|
11
|
+
expect(isReservedCustomBashEventTypeDisplayName("Pro Events")).toBe(true);
|
|
12
|
+
expect(isReservedCustomBashEventTypeDisplayName("The crew's going")).toBe(
|
|
13
|
+
true
|
|
14
|
+
);
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
it("blocks built-in bash type labels", () => {
|
|
18
|
+
expect(isReservedCustomBashEventTypeDisplayName("Birthday")).toBe(true);
|
|
19
|
+
expect(isReservedCustomBashEventTypeDisplayName("House Party")).toBe(true);
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
it("allows novel custom labels", () => {
|
|
23
|
+
expect(isReservedCustomBashEventTypeDisplayName("Rooftop Party")).toBe(
|
|
24
|
+
false
|
|
25
|
+
);
|
|
26
|
+
});
|
|
27
|
+
});
|