@bash-app/bash-common 30.371.0 → 30.374.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/definitions.d.ts +6 -0
- package/dist/definitions.d.ts.map +1 -1
- package/dist/definitions.js.map +1 -1
- package/dist/utils/__tests__/organizationEntitlements.test.js +66 -27
- package/dist/utils/__tests__/organizationEntitlements.test.js.map +1 -1
- package/dist/utils/luxonUtils.d.ts +7 -7
- package/dist/utils/luxonUtils.d.ts.map +1 -1
- package/dist/utils/organizationEntitlements.d.ts +23 -18
- package/dist/utils/organizationEntitlements.d.ts.map +1 -1
- package/dist/utils/organizationEntitlements.js +37 -22
- package/dist/utils/organizationEntitlements.js.map +1 -1
- package/dist/utils/service/__tests__/apiServiceBookingApiUtils.test.js +66 -1
- package/dist/utils/service/__tests__/apiServiceBookingApiUtils.test.js.map +1 -1
- package/dist/utils/service/__tests__/frontendServiceBookingUtils.test.d.ts +2 -0
- package/dist/utils/service/__tests__/frontendServiceBookingUtils.test.d.ts.map +1 -0
- package/dist/utils/service/__tests__/frontendServiceBookingUtils.test.js +165 -0
- package/dist/utils/service/__tests__/frontendServiceBookingUtils.test.js.map +1 -0
- package/dist/utils/service/apiServiceBookingApiUtils.d.ts +5 -3
- package/dist/utils/service/apiServiceBookingApiUtils.d.ts.map +1 -1
- package/dist/utils/service/apiServiceBookingApiUtils.js +30 -1
- package/dist/utils/service/apiServiceBookingApiUtils.js.map +1 -1
- package/dist/utils/service/frontendServiceBookingUtils.d.ts +10 -4
- package/dist/utils/service/frontendServiceBookingUtils.d.ts.map +1 -1
- package/dist/utils/service/frontendServiceBookingUtils.js +16 -3
- package/dist/utils/service/frontendServiceBookingUtils.js.map +1 -1
- package/dist/utils/service/serviceBookingTypes.d.ts +2 -2
- package/dist/utils/service/serviceBookingTypes.d.ts.map +1 -1
- package/package.json +1 -1
- package/prisma/schema.prisma +10 -7
- package/src/definitions.ts +7 -0
- package/src/utils/__tests__/organizationEntitlements.test.ts +79 -30
- package/src/utils/organizationEntitlements.ts +44 -27
- package/src/utils/service/__tests__/apiServiceBookingApiUtils.test.ts +102 -2
- package/src/utils/service/__tests__/frontendServiceBookingUtils.test.ts +217 -0
- package/src/utils/service/apiServiceBookingApiUtils.ts +53 -1
- package/src/utils/service/frontendServiceBookingUtils.ts +33 -2
- package/src/utils/service/serviceBookingTypes.ts +2 -1
|
@@ -12,27 +12,30 @@ export interface OrganizationEntitlementInput {
|
|
|
12
12
|
subscriptionStatus?: string | null;
|
|
13
13
|
/**
|
|
14
14
|
* True only when ops provisioned Enterprise via a signed deal (admin
|
|
15
|
-
* enterprise-provisioning endpoint)
|
|
16
|
-
* subscriptionTier="Enterprise"
|
|
17
|
-
*
|
|
18
|
-
*
|
|
15
|
+
* enterprise-provisioning endpoint) — the only way to reach
|
|
16
|
+
* subscriptionTier="Enterprise" (see docs/ENTERPRISE-B2B-SALES-PLAYBOOK.md;
|
|
17
|
+
* self-serve checkout rejects Enterprise). Optional/undefined is treated as
|
|
18
|
+
* false so legacy call sites that don't select this field fail closed on the
|
|
19
|
+
* sales-gated surface rather than open.
|
|
19
20
|
*/
|
|
20
21
|
enterpriseSalesProvisioned?: boolean | null;
|
|
21
22
|
}
|
|
22
23
|
/**
|
|
23
|
-
* Vanity subdomains ({slug}.bash.community) and
|
|
24
|
-
*
|
|
25
|
-
*
|
|
24
|
+
* Vanity subdomains ({slug}.bash.community) are a Growth-tier-and-up perk, not
|
|
25
|
+
* Enterprise-only: unlike custom domains, granting one costs nothing extra
|
|
26
|
+
* (a slug lookup against the existing bash.community CloudFront distribution,
|
|
27
|
+
* no per-org AWS resources) — it's a cheap, visible upgrade incentive to dangle
|
|
28
|
+
* in front of Starter orgs. See {@link organizationHasCustomDomainAccess} for
|
|
29
|
+
* the pricier, Enterprise-only white-label surface.
|
|
26
30
|
*/
|
|
27
31
|
export declare function organizationHasVanitySubdomain(org: OrganizationEntitlementInput | null | undefined): boolean;
|
|
28
32
|
/**
|
|
29
33
|
* Shared gate for the enterprise platform surface: org-scoped audit logs,
|
|
30
34
|
* SSO/identity setup, procurement approval policy, API keys, webhooks, and
|
|
31
|
-
* third-party integrations (Mailchimp/Salesforce).
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
* involve a security review or contract terms sales owns.
|
|
35
|
+
* third-party integrations (Mailchimp/Salesforce). Requires the explicit
|
|
36
|
+
* `enterpriseSalesProvisioned` flag set by ops after a signed deal, since SSO,
|
|
37
|
+
* compliance, procurement, and API access typically involve a security review
|
|
38
|
+
* or contract terms sales owns.
|
|
36
39
|
*/
|
|
37
40
|
export declare function organizationHasEnterprisePlatformAccess(org: OrganizationEntitlementInput | null | undefined): boolean;
|
|
38
41
|
/** Org-admin audit log viewer + CSV export. */
|
|
@@ -48,12 +51,14 @@ export declare function organizationHasComplianceAccess(org: OrganizationEntitle
|
|
|
48
51
|
/**
|
|
49
52
|
* Custom domains (white-label tier): real DNS (e.g. members.acme.com) provisioned
|
|
50
53
|
* via AWS CloudFront SaaS Manager Distribution Tenants, plus the "Powered by Bash"
|
|
51
|
-
* removal toggle.
|
|
52
|
-
*
|
|
53
|
-
*
|
|
54
|
-
*
|
|
55
|
-
*
|
|
56
|
-
* `enterpriseSalesProvisioned`
|
|
54
|
+
* removal toggle. Unlike {@link organizationHasVanitySubdomain}, this needs a real
|
|
55
|
+
* per-org CloudFront Distribution Tenant + managed cert + the org's own DNS work —
|
|
56
|
+
* actual infra cost and complexity per org — so it stays Enterprise-only (today
|
|
57
|
+
* always sales-provisioned, since self-serve Enterprise checkout is blocked; see
|
|
58
|
+
* docs/ENTERPRISE-B2B-SALES-PLAYBOOK.md). Does NOT require
|
|
59
|
+
* {@link organizationHasEnterprisePlatformAccess}'s `enterpriseSalesProvisioned`
|
|
60
|
+
* flag, so a fast-follow self-serve Enterprise checkout could unlock this without
|
|
61
|
+
* the sales-gated platform surface (SSO, audit logs, procurement, compliance, API).
|
|
57
62
|
*/
|
|
58
63
|
export declare function organizationHasCustomDomainAccess(org: OrganizationEntitlementInput | null | undefined): boolean;
|
|
59
64
|
//# sourceMappingURL=organizationEntitlements.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"organizationEntitlements.d.ts","sourceRoot":"","sources":["../../src/utils/organizationEntitlements.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,2EAA2E;AAC3E,eAAO,MAAM,gCAAgC,iCAGnC,CAAC;AAEX,MAAM,WAAW,4BAA4B;IAC3C,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,kBAAkB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC
|
|
1
|
+
{"version":3,"file":"organizationEntitlements.d.ts","sourceRoot":"","sources":["../../src/utils/organizationEntitlements.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,2EAA2E;AAC3E,eAAO,MAAM,gCAAgC,iCAGnC,CAAC;AAEX,MAAM,WAAW,4BAA4B;IAC3C,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,kBAAkB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC;;;;;;;OAOG;IACH,0BAA0B,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;CAC7C;AA4BD;;;;;;;GAOG;AACH,wBAAgB,8BAA8B,CAC5C,GAAG,EAAE,4BAA4B,GAAG,IAAI,GAAG,SAAS,GACnD,OAAO,CAET;AAED;;;;;;;GAOG;AACH,wBAAgB,uCAAuC,CACrD,GAAG,EAAE,4BAA4B,GAAG,IAAI,GAAG,SAAS,GACnD,OAAO,CAET;AAED,+CAA+C;AAC/C,wBAAgB,6BAA6B,CAC3C,GAAG,EAAE,4BAA4B,GAAG,IAAI,GAAG,SAAS,GACnD,OAAO,CAET;AAED,0BAA0B;AAC1B,wBAAgB,wBAAwB,CACtC,GAAG,EAAE,4BAA4B,GAAG,IAAI,GAAG,SAAS,GACnD,OAAO,CAET;AAED,+DAA+D;AAC/D,wBAAgB,gCAAgC,CAC9C,GAAG,EAAE,4BAA4B,GAAG,IAAI,GAAG,SAAS,GACnD,OAAO,CAET;AAED,iEAAiE;AACjE,wBAAgB,wBAAwB,CACtC,GAAG,EAAE,4BAA4B,GAAG,IAAI,GAAG,SAAS,GACnD,OAAO,CAET;AAED,+EAA+E;AAC/E,wBAAgB,+BAA+B,CAC7C,GAAG,EAAE,4BAA4B,GAAG,IAAI,GAAG,SAAS,GACnD,OAAO,CAET;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,iCAAiC,CAC/C,GAAG,EAAE,4BAA4B,GAAG,IAAI,GAAG,SAAS,GACnD,OAAO,CAET"}
|
|
@@ -10,34 +10,47 @@ export const ACTIVE_ORG_SUBSCRIPTION_STATUSES = [
|
|
|
10
10
|
"Active",
|
|
11
11
|
"Trialing",
|
|
12
12
|
];
|
|
13
|
+
// Treat a missing status as active: legacy/ops-provisioned orgs may predate
|
|
14
|
+
// subscriptionStatus being populated, and we don't want to silently drop
|
|
15
|
+
// their entitlements.
|
|
16
|
+
function isActiveOrTrialingStatus(status) {
|
|
17
|
+
if (status == null)
|
|
18
|
+
return true;
|
|
19
|
+
return ACTIVE_ORG_SUBSCRIPTION_STATUSES.includes(status);
|
|
20
|
+
}
|
|
13
21
|
function hasActiveEnterpriseTier(org) {
|
|
14
22
|
if (!org)
|
|
15
23
|
return false;
|
|
16
24
|
if (org.subscriptionTier !== "Enterprise")
|
|
17
25
|
return false;
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
if (org
|
|
22
|
-
return
|
|
23
|
-
|
|
26
|
+
return isActiveOrTrialingStatus(org.subscriptionStatus);
|
|
27
|
+
}
|
|
28
|
+
function hasActiveGrowthOrAboveTier(org) {
|
|
29
|
+
if (!org)
|
|
30
|
+
return false;
|
|
31
|
+
if (org.subscriptionTier !== "Growth" && org.subscriptionTier !== "Enterprise") {
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
return isActiveOrTrialingStatus(org.subscriptionStatus);
|
|
24
35
|
}
|
|
25
36
|
/**
|
|
26
|
-
* Vanity subdomains ({slug}.bash.community) and
|
|
27
|
-
*
|
|
28
|
-
*
|
|
37
|
+
* Vanity subdomains ({slug}.bash.community) are a Growth-tier-and-up perk, not
|
|
38
|
+
* Enterprise-only: unlike custom domains, granting one costs nothing extra
|
|
39
|
+
* (a slug lookup against the existing bash.community CloudFront distribution,
|
|
40
|
+
* no per-org AWS resources) — it's a cheap, visible upgrade incentive to dangle
|
|
41
|
+
* in front of Starter orgs. See {@link organizationHasCustomDomainAccess} for
|
|
42
|
+
* the pricier, Enterprise-only white-label surface.
|
|
29
43
|
*/
|
|
30
44
|
export function organizationHasVanitySubdomain(org) {
|
|
31
|
-
return
|
|
45
|
+
return hasActiveGrowthOrAboveTier(org);
|
|
32
46
|
}
|
|
33
47
|
/**
|
|
34
48
|
* Shared gate for the enterprise platform surface: org-scoped audit logs,
|
|
35
49
|
* SSO/identity setup, procurement approval policy, API keys, webhooks, and
|
|
36
|
-
* third-party integrations (Mailchimp/Salesforce).
|
|
37
|
-
*
|
|
38
|
-
*
|
|
39
|
-
*
|
|
40
|
-
* involve a security review or contract terms sales owns.
|
|
50
|
+
* third-party integrations (Mailchimp/Salesforce). Requires the explicit
|
|
51
|
+
* `enterpriseSalesProvisioned` flag set by ops after a signed deal, since SSO,
|
|
52
|
+
* compliance, procurement, and API access typically involve a security review
|
|
53
|
+
* or contract terms sales owns.
|
|
41
54
|
*/
|
|
42
55
|
export function organizationHasEnterprisePlatformAccess(org) {
|
|
43
56
|
return hasActiveEnterpriseTier(org) && org?.enterpriseSalesProvisioned === true;
|
|
@@ -65,14 +78,16 @@ export function organizationHasComplianceAccess(org) {
|
|
|
65
78
|
/**
|
|
66
79
|
* Custom domains (white-label tier): real DNS (e.g. members.acme.com) provisioned
|
|
67
80
|
* via AWS CloudFront SaaS Manager Distribution Tenants, plus the "Powered by Bash"
|
|
68
|
-
* removal toggle.
|
|
69
|
-
*
|
|
70
|
-
*
|
|
71
|
-
*
|
|
72
|
-
*
|
|
73
|
-
* `enterpriseSalesProvisioned`
|
|
81
|
+
* removal toggle. Unlike {@link organizationHasVanitySubdomain}, this needs a real
|
|
82
|
+
* per-org CloudFront Distribution Tenant + managed cert + the org's own DNS work —
|
|
83
|
+
* actual infra cost and complexity per org — so it stays Enterprise-only (today
|
|
84
|
+
* always sales-provisioned, since self-serve Enterprise checkout is blocked; see
|
|
85
|
+
* docs/ENTERPRISE-B2B-SALES-PLAYBOOK.md). Does NOT require
|
|
86
|
+
* {@link organizationHasEnterprisePlatformAccess}'s `enterpriseSalesProvisioned`
|
|
87
|
+
* flag, so a fast-follow self-serve Enterprise checkout could unlock this without
|
|
88
|
+
* the sales-gated platform surface (SSO, audit logs, procurement, compliance, API).
|
|
74
89
|
*/
|
|
75
90
|
export function organizationHasCustomDomainAccess(org) {
|
|
76
|
-
return
|
|
91
|
+
return hasActiveEnterpriseTier(org);
|
|
77
92
|
}
|
|
78
93
|
//# sourceMappingURL=organizationEntitlements.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"organizationEntitlements.js","sourceRoot":"","sources":["../../src/utils/organizationEntitlements.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,2EAA2E;AAC3E,MAAM,CAAC,MAAM,gCAAgC,GAAG;IAC9C,QAAQ;IACR,UAAU;CACF,CAAC;
|
|
1
|
+
{"version":3,"file":"organizationEntitlements.js","sourceRoot":"","sources":["../../src/utils/organizationEntitlements.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,2EAA2E;AAC3E,MAAM,CAAC,MAAM,gCAAgC,GAAG;IAC9C,QAAQ;IACR,UAAU;CACF,CAAC;AAgBX,4EAA4E;AAC5E,yEAAyE;AACzE,sBAAsB;AACtB,SAAS,wBAAwB,CAAC,MAAsB;IACtD,IAAI,MAAM,IAAI,IAAI;QAAE,OAAO,IAAI,CAAC;IAChC,OAAQ,gCAAsD,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AAClF,CAAC;AAED,SAAS,uBAAuB,CAC9B,GAAoD;IAEpD,IAAI,CAAC,GAAG;QAAE,OAAO,KAAK,CAAC;IACvB,IAAI,GAAG,CAAC,gBAAgB,KAAK,YAAY;QAAE,OAAO,KAAK,CAAC;IACxD,OAAO,wBAAwB,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;AAC1D,CAAC;AAED,SAAS,0BAA0B,CACjC,GAAoD;IAEpD,IAAI,CAAC,GAAG;QAAE,OAAO,KAAK,CAAC;IACvB,IAAI,GAAG,CAAC,gBAAgB,KAAK,QAAQ,IAAI,GAAG,CAAC,gBAAgB,KAAK,YAAY,EAAE,CAAC;QAC/E,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,wBAAwB,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;AAC1D,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,8BAA8B,CAC5C,GAAoD;IAEpD,OAAO,0BAA0B,CAAC,GAAG,CAAC,CAAC;AACzC,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,uCAAuC,CACrD,GAAoD;IAEpD,OAAO,uBAAuB,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,0BAA0B,KAAK,IAAI,CAAC;AAClF,CAAC;AAED,+CAA+C;AAC/C,MAAM,UAAU,6BAA6B,CAC3C,GAAoD;IAEpD,OAAO,uCAAuC,CAAC,GAAG,CAAC,CAAC;AACtD,CAAC;AAED,0BAA0B;AAC1B,MAAM,UAAU,wBAAwB,CACtC,GAAoD;IAEpD,OAAO,uCAAuC,CAAC,GAAG,CAAC,CAAC;AACtD,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,gCAAgC,CAC9C,GAAoD;IAEpD,OAAO,uCAAuC,CAAC,GAAG,CAAC,CAAC;AACtD,CAAC;AAED,iEAAiE;AACjE,MAAM,UAAU,wBAAwB,CACtC,GAAoD;IAEpD,OAAO,uCAAuC,CAAC,GAAG,CAAC,CAAC;AACtD,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,+BAA+B,CAC7C,GAAoD;IAEpD,OAAO,uCAAuC,CAAC,GAAG,CAAC,CAAC;AACtD,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,iCAAiC,CAC/C,GAAoD;IAEpD,OAAO,uBAAuB,CAAC,GAAG,CAAC,CAAC;AACtC,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { apiTransformAddOnsToAddonInputs, serviceBookingParamsToLuxon, } from "../apiServiceBookingApiUtils";
|
|
1
|
+
import { apiTransformAddOnsToAddonInputs, apiTransformPackagesToPackageInputs, servicePriceToBookToApiPackages, serviceBookingParamsToLuxon, } from "../apiServiceBookingApiUtils";
|
|
2
2
|
// ---------------------------------------------------------------------------
|
|
3
3
|
// apiTransformAddOnsToAddonInputs
|
|
4
4
|
// ---------------------------------------------------------------------------
|
|
@@ -45,6 +45,71 @@ describe("apiTransformAddOnsToAddonInputs", () => {
|
|
|
45
45
|
});
|
|
46
46
|
});
|
|
47
47
|
// ---------------------------------------------------------------------------
|
|
48
|
+
// apiTransformPackagesToPackageInputs
|
|
49
|
+
// ---------------------------------------------------------------------------
|
|
50
|
+
function makePackageExt(id, name = "Package") {
|
|
51
|
+
return {
|
|
52
|
+
id,
|
|
53
|
+
name,
|
|
54
|
+
description: "",
|
|
55
|
+
priceCents: 5000,
|
|
56
|
+
serviceAddons: [],
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
function makePackageParam(packageId, qty = 1) {
|
|
60
|
+
return { packageId, chosenQuantity: qty };
|
|
61
|
+
}
|
|
62
|
+
describe("apiTransformPackagesToPackageInputs", () => {
|
|
63
|
+
it("returns empty array when no packages are provided", () => {
|
|
64
|
+
expect(apiTransformPackagesToPackageInputs([], [])).toEqual([]);
|
|
65
|
+
});
|
|
66
|
+
it("maps package params to their matching ServicePackageExt", () => {
|
|
67
|
+
const servicePackages = [makePackageExt("p1"), makePackageExt("p2")];
|
|
68
|
+
const packagesApi = [makePackageParam("p1", 2)];
|
|
69
|
+
const result = apiTransformPackagesToPackageInputs(packagesApi, servicePackages);
|
|
70
|
+
expect(result).toHaveLength(1);
|
|
71
|
+
expect(result[0].id).toBe("p1");
|
|
72
|
+
expect(result[0].chosenQuantity).toBe(2);
|
|
73
|
+
});
|
|
74
|
+
it("merges package params over the ServicePackageExt fields (params win)", () => {
|
|
75
|
+
const servicePackages = [makePackageExt("p1")];
|
|
76
|
+
const packagesApi = [
|
|
77
|
+
{ packageId: "p1", chosenQuantity: 5, extra: "field" },
|
|
78
|
+
];
|
|
79
|
+
const result = apiTransformPackagesToPackageInputs(packagesApi, servicePackages);
|
|
80
|
+
expect(result[0].chosenQuantity).toBe(5);
|
|
81
|
+
});
|
|
82
|
+
it("throws when a packageId does not match any ServicePackageExt", () => {
|
|
83
|
+
const servicePackages = [makePackageExt("p1")];
|
|
84
|
+
const packagesApi = [makePackageParam("ghost-id")];
|
|
85
|
+
expect(() => apiTransformPackagesToPackageInputs(packagesApi, servicePackages)).toThrow(/Failed to match package with id: ghost-id/);
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
// ---------------------------------------------------------------------------
|
|
89
|
+
// servicePriceToBookToApiPackages
|
|
90
|
+
// ---------------------------------------------------------------------------
|
|
91
|
+
describe("servicePriceToBookToApiPackages", () => {
|
|
92
|
+
it("returns empty array when priceToBook has no packages", () => {
|
|
93
|
+
const priceToBook = {
|
|
94
|
+
packages: [],
|
|
95
|
+
};
|
|
96
|
+
expect(servicePriceToBookToApiPackages(priceToBook)).toEqual([]);
|
|
97
|
+
});
|
|
98
|
+
it("maps priceToBook packages to ApiServicePackageParams", () => {
|
|
99
|
+
const priceToBook = {
|
|
100
|
+
packages: [
|
|
101
|
+
{ packageId: "p1", chosenQuantity: 2, costPQCents: 5000 },
|
|
102
|
+
{ packageId: "p2", chosenQuantity: 1, costPQCents: 8000 },
|
|
103
|
+
],
|
|
104
|
+
};
|
|
105
|
+
const result = servicePriceToBookToApiPackages(priceToBook);
|
|
106
|
+
expect(result).toEqual([
|
|
107
|
+
{ packageId: "p1", chosenQuantity: 2 },
|
|
108
|
+
{ packageId: "p2", chosenQuantity: 1 },
|
|
109
|
+
]);
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
// ---------------------------------------------------------------------------
|
|
48
113
|
// serviceBookingParamsToLuxon
|
|
49
114
|
// ---------------------------------------------------------------------------
|
|
50
115
|
function makeBookingParams(days) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apiServiceBookingApiUtils.test.js","sourceRoot":"","sources":["../../../../src/utils/service/__tests__/apiServiceBookingApiUtils.test.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,+BAA+B,EAC/B,2BAA2B,GAC5B,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"apiServiceBookingApiUtils.test.js","sourceRoot":"","sources":["../../../../src/utils/service/__tests__/apiServiceBookingApiUtils.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frontendServiceBookingUtils.test.d.ts","sourceRoot":"","sources":["../../../../src/utils/service/__tests__/frontendServiceBookingUtils.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import { DateTime } from "luxon";
|
|
2
|
+
import { frontendServiceGetPriceToBook, frontendServiceGetPriceToBookFees, } from "../frontendServiceBookingUtils";
|
|
3
|
+
function makeRange(startISO, endISO) {
|
|
4
|
+
return {
|
|
5
|
+
start: DateTime.fromISO(startISO, { zone: "utc" }),
|
|
6
|
+
end: DateTime.fromISO(endISO, { zone: "utc" }),
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
function makeFlatRateAssociation(flatRateCents = 20000) {
|
|
10
|
+
return {
|
|
11
|
+
serviceId: "svc-1",
|
|
12
|
+
serviceGeneralRates: {
|
|
13
|
+
flatRateCents,
|
|
14
|
+
hourlyRateCents: null,
|
|
15
|
+
dailyRateCents: null,
|
|
16
|
+
minimumTimeBlockHours: null,
|
|
17
|
+
cleaningFeePerBookingCents: 0,
|
|
18
|
+
},
|
|
19
|
+
serviceSpecialRates: [],
|
|
20
|
+
serviceDailyRates: [],
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
function makeTimeBasedAssociation(hourlyRateCents = 5000) {
|
|
24
|
+
return {
|
|
25
|
+
serviceId: "svc-1",
|
|
26
|
+
serviceGeneralRates: {
|
|
27
|
+
flatRateCents: null,
|
|
28
|
+
hourlyRateCents,
|
|
29
|
+
dailyRateCents: null,
|
|
30
|
+
minimumTimeBlockHours: null,
|
|
31
|
+
cleaningFeePerBookingCents: 0,
|
|
32
|
+
},
|
|
33
|
+
serviceSpecialRates: [],
|
|
34
|
+
serviceDailyRates: [],
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
function makePackageInput(overrides = {}) {
|
|
38
|
+
return {
|
|
39
|
+
id: "pkg-1",
|
|
40
|
+
name: "Gold DJ Package",
|
|
41
|
+
description: "",
|
|
42
|
+
priceCents: 10000,
|
|
43
|
+
serviceAddons: [],
|
|
44
|
+
chosenQuantity: 1,
|
|
45
|
+
...overrides,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
const ATTENDEE_OPTION = null;
|
|
49
|
+
const RANGE_2H = makeRange("2025-07-01T09:00:00Z", "2025-07-01T11:00:00Z");
|
|
50
|
+
describe("frontendServiceGetPriceToBookFees — packages", () => {
|
|
51
|
+
it("returns an empty packages array and adds nothing to the subtotal when no packages are given", () => {
|
|
52
|
+
const result = frontendServiceGetPriceToBookFees(makeFlatRateAssociation(20000), {
|
|
53
|
+
daysToBookParams: [{ dateTimeRange: RANGE_2H, fees: [], addOns: [] }],
|
|
54
|
+
selectedAttendeeOption: ATTENDEE_OPTION,
|
|
55
|
+
additionalFees: [],
|
|
56
|
+
addOns: [],
|
|
57
|
+
timezone: "UTC",
|
|
58
|
+
});
|
|
59
|
+
expect(result.packages).toEqual([]);
|
|
60
|
+
expect(result.subtotalBeforeTaxesCents).toBe(20000);
|
|
61
|
+
});
|
|
62
|
+
it("folds a single package's cost into the subtotal", () => {
|
|
63
|
+
const result = frontendServiceGetPriceToBookFees(makeFlatRateAssociation(20000), {
|
|
64
|
+
daysToBookParams: [{ dateTimeRange: RANGE_2H, fees: [], addOns: [] }],
|
|
65
|
+
selectedAttendeeOption: ATTENDEE_OPTION,
|
|
66
|
+
additionalFees: [],
|
|
67
|
+
addOns: [],
|
|
68
|
+
packages: [makePackageInput({ priceCents: 15000, chosenQuantity: 1 })],
|
|
69
|
+
timezone: "UTC",
|
|
70
|
+
});
|
|
71
|
+
expect(result.packages).toHaveLength(1);
|
|
72
|
+
expect(result.packages[0]).toMatchObject({
|
|
73
|
+
packageId: "pkg-1",
|
|
74
|
+
chosenQuantity: 1,
|
|
75
|
+
costPQCents: 15000,
|
|
76
|
+
});
|
|
77
|
+
expect(result.subtotalBeforeTaxesCents).toBe(20000 + 15000);
|
|
78
|
+
});
|
|
79
|
+
it("multiplies a package's cost by chosenQuantity", () => {
|
|
80
|
+
const result = frontendServiceGetPriceToBookFees(makeFlatRateAssociation(20000), {
|
|
81
|
+
daysToBookParams: [{ dateTimeRange: RANGE_2H, fees: [], addOns: [] }],
|
|
82
|
+
selectedAttendeeOption: ATTENDEE_OPTION,
|
|
83
|
+
additionalFees: [],
|
|
84
|
+
addOns: [],
|
|
85
|
+
packages: [makePackageInput({ priceCents: 15000, chosenQuantity: 3 })],
|
|
86
|
+
timezone: "UTC",
|
|
87
|
+
});
|
|
88
|
+
expect(result.packages[0].chosenQuantity).toBe(3);
|
|
89
|
+
expect(result.subtotalBeforeTaxesCents).toBe(20000 + 15000 * 3);
|
|
90
|
+
});
|
|
91
|
+
it("sums multiple distinct packages into the subtotal", () => {
|
|
92
|
+
const result = frontendServiceGetPriceToBookFees(makeFlatRateAssociation(20000), {
|
|
93
|
+
daysToBookParams: [{ dateTimeRange: RANGE_2H, fees: [], addOns: [] }],
|
|
94
|
+
selectedAttendeeOption: ATTENDEE_OPTION,
|
|
95
|
+
additionalFees: [],
|
|
96
|
+
addOns: [],
|
|
97
|
+
packages: [
|
|
98
|
+
makePackageInput({
|
|
99
|
+
id: "pkg-1",
|
|
100
|
+
priceCents: 15000,
|
|
101
|
+
chosenQuantity: 1,
|
|
102
|
+
}),
|
|
103
|
+
makePackageInput({
|
|
104
|
+
id: "pkg-2",
|
|
105
|
+
priceCents: 8000,
|
|
106
|
+
chosenQuantity: 2,
|
|
107
|
+
}),
|
|
108
|
+
],
|
|
109
|
+
timezone: "UTC",
|
|
110
|
+
});
|
|
111
|
+
expect(result.packages).toHaveLength(2);
|
|
112
|
+
expect(result.subtotalBeforeTaxesCents).toBe(20000 + 15000 + 8000 * 2);
|
|
113
|
+
});
|
|
114
|
+
it("defaults chosenQuantity to 0 when not provided", () => {
|
|
115
|
+
const result = frontendServiceGetPriceToBookFees(makeFlatRateAssociation(20000), {
|
|
116
|
+
daysToBookParams: [{ dateTimeRange: RANGE_2H, fees: [], addOns: [] }],
|
|
117
|
+
selectedAttendeeOption: ATTENDEE_OPTION,
|
|
118
|
+
additionalFees: [],
|
|
119
|
+
addOns: [],
|
|
120
|
+
packages: [
|
|
121
|
+
makePackageInput({ priceCents: 15000, chosenQuantity: undefined }),
|
|
122
|
+
],
|
|
123
|
+
timezone: "UTC",
|
|
124
|
+
});
|
|
125
|
+
expect(result.packages[0].chosenQuantity).toBe(0);
|
|
126
|
+
expect(result.subtotalBeforeTaxesCents).toBe(20000);
|
|
127
|
+
});
|
|
128
|
+
it("applies package pricing on top of time-based (hourly) bookings too", () => {
|
|
129
|
+
const result = frontendServiceGetPriceToBookFees(makeTimeBasedAssociation(5000), {
|
|
130
|
+
daysToBookParams: [{ dateTimeRange: RANGE_2H, fees: [], addOns: [] }],
|
|
131
|
+
selectedAttendeeOption: ATTENDEE_OPTION,
|
|
132
|
+
additionalFees: [],
|
|
133
|
+
addOns: [],
|
|
134
|
+
packages: [makePackageInput({ priceCents: 12000, chosenQuantity: 1 })],
|
|
135
|
+
timezone: "UTC",
|
|
136
|
+
});
|
|
137
|
+
// 2 hours @ $50/hr = $100 in day totals, plus the $120 package.
|
|
138
|
+
expect(result.daysTotalBeforeTaxesCents).toBe(10000);
|
|
139
|
+
expect(result.subtotalBeforeTaxesCents).toBe(10000 + 12000);
|
|
140
|
+
});
|
|
141
|
+
});
|
|
142
|
+
describe("frontendServiceGetPriceToBook — packages", () => {
|
|
143
|
+
it("passes packages through to frontendServiceGetPriceToBookFees", () => {
|
|
144
|
+
const result = frontendServiceGetPriceToBook(makeFlatRateAssociation(20000), {
|
|
145
|
+
addOns: [],
|
|
146
|
+
packages: [makePackageInput({ priceCents: 5000, chosenQuantity: 2 })],
|
|
147
|
+
selectedAttendeeOption: ATTENDEE_OPTION,
|
|
148
|
+
bookingDateTimeRanges: [RANGE_2H],
|
|
149
|
+
timezone: "UTC",
|
|
150
|
+
});
|
|
151
|
+
expect(result.packages).toHaveLength(1);
|
|
152
|
+
expect(result.subtotalBeforeTaxesCents).toBe(20000 + 5000 * 2);
|
|
153
|
+
});
|
|
154
|
+
it("defaults to an empty packages array when packages is omitted", () => {
|
|
155
|
+
const result = frontendServiceGetPriceToBook(makeFlatRateAssociation(20000), {
|
|
156
|
+
addOns: [],
|
|
157
|
+
selectedAttendeeOption: ATTENDEE_OPTION,
|
|
158
|
+
bookingDateTimeRanges: [RANGE_2H],
|
|
159
|
+
timezone: "UTC",
|
|
160
|
+
});
|
|
161
|
+
expect(result.packages).toEqual([]);
|
|
162
|
+
expect(result.subtotalBeforeTaxesCents).toBe(20000);
|
|
163
|
+
});
|
|
164
|
+
});
|
|
165
|
+
//# sourceMappingURL=frontendServiceBookingUtils.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frontendServiceBookingUtils.test.js","sourceRoot":"","sources":["../../../../src/utils/service/__tests__/frontendServiceBookingUtils.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { ServiceBookingStatus, ServiceBookingType } from "@prisma/client";
|
|
2
|
-
import { ApiBookingParamsLuxon, ApiServiceAddonParams, ApiServiceBookedDayParams, ApiServiceBookingParams, ApiServicePriceToBookResult } from "../../definitions.js";
|
|
3
|
-
import { ServiceAddonExt, ServiceBookingDayExt, ServiceBookingExt, ServiceExt } from "../../extendedSchemas.js";
|
|
4
|
-
import { FrontendServiceGetPriceToBookResult, ServiceAddonInput } from "./frontendServiceBookingUtils.js";
|
|
2
|
+
import { ApiBookingParamsLuxon, ApiServiceAddonParams, ApiServiceBookedDayParams, ApiServiceBookingParams, ApiServicePackageParams, ApiServicePriceToBookResult } from "../../definitions.js";
|
|
3
|
+
import { ServiceAddonExt, ServiceBookingDayExt, ServiceBookingExt, ServiceExt, ServicePackageExt } from "../../extendedSchemas.js";
|
|
4
|
+
import { FrontendServiceGetPriceToBookResult, ServiceAddonInput, ServicePackageInput } from "./frontendServiceBookingUtils.js";
|
|
5
5
|
import { ServiceBookingRequiredData } from "./serviceBookingTypes.js";
|
|
6
6
|
export type ApiServiceCantBookReason = {
|
|
7
7
|
type: string;
|
|
@@ -17,10 +17,12 @@ export declare const ApiServiceCantBookReasons: {
|
|
|
17
17
|
};
|
|
18
18
|
export type ApiServiceCantBookReasons = keyof typeof ApiServiceCantBookReasons;
|
|
19
19
|
export declare function apiTransformAddOnsToAddonInputs<AddonParams_t extends ApiServiceAddonParams>(addOnsApi: AddonParams_t[], serviceAddons: ServiceAddonExt[]): ServiceAddonInput[];
|
|
20
|
+
export declare function apiTransformPackagesToPackageInputs<PackageParams_t extends ApiServicePackageParams>(packagesApi: PackageParams_t[], servicePackages: ServicePackageExt[]): ServicePackageInput[];
|
|
20
21
|
export declare function apiTransformBookedDays(priceToBook: ApiServicePriceToBookResult): Partial<ServiceBookingDayExt>[];
|
|
21
22
|
export declare function serviceGetPriceToBookFromBooking(service: ServiceExt, booking: ServiceBookingExt): FrontendServiceGetPriceToBookResult;
|
|
22
23
|
export declare function serviceBookingParamsToLuxon(params: ApiServiceBookingParams): ApiBookingParamsLuxon;
|
|
23
24
|
export declare function servicePriceToBookToApiDays(serviceId: string, userId: string, priceToBook: FrontendServiceGetPriceToBookResult): ApiServiceBookedDayParams[];
|
|
25
|
+
export declare function servicePriceToBookToApiPackages(priceToBook: FrontendServiceGetPriceToBookResult): ApiServicePackageParams[];
|
|
24
26
|
export interface ServicePriceToBookToApiBookingBaseArgs {
|
|
25
27
|
bookingType: ServiceBookingType;
|
|
26
28
|
status: ServiceBookingStatus;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apiServiceBookingApiUtils.d.ts","sourceRoot":"","sources":["../../../src/utils/service/apiServiceBookingApiUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAC1E,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,yBAAyB,EAEzB,uBAAuB,EACvB,2BAA2B,EAC5B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,eAAe,EAEf,oBAAoB,EACpB,iBAAiB,
|
|
1
|
+
{"version":3,"file":"apiServiceBookingApiUtils.d.ts","sourceRoot":"","sources":["../../../src/utils/service/apiServiceBookingApiUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAC1E,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,yBAAyB,EAEzB,uBAAuB,EACvB,uBAAuB,EACvB,2BAA2B,EAC5B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,eAAe,EAEf,oBAAoB,EACpB,iBAAiB,EAIjB,UAAU,EACV,iBAAiB,EAClB,MAAM,0BAA0B,CAAC;AAGlC,OAAO,EAEL,mCAAmC,EACnC,iBAAiB,EACjB,mBAAmB,EACpB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAEL,0BAA0B,EAC3B,MAAM,0BAA0B,CAAC;AAElC,MAAM,MAAM,wBAAwB,GAAG;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;CACb,CAAC;AAEF,eAAO,MAAM,yBAAyB;2BAG/B,wBAAwB;iCAGxB,wBAAwB;+BAGxB,wBAAwB;0BAGxB,wBAAwB;4BAGxB,wBAAwB;8BAGxB,wBAAwB;CACrB,CAAC;AAEX,MAAM,MAAM,yBAAyB,GAAG,MAAM,OAAO,yBAAyB,CAAC;AAE/E,wBAAgB,+BAA+B,CAC7C,aAAa,SAAS,qBAAqB,EAE3C,SAAS,EAAE,aAAa,EAAE,EAC1B,aAAa,EAAE,eAAe,EAAE,GAC/B,iBAAiB,EAAE,CAgBrB;AAED,wBAAgB,mCAAmC,CACjD,eAAe,SAAS,uBAAuB,EAE/C,WAAW,EAAE,eAAe,EAAE,EAC9B,eAAe,EAAE,iBAAiB,EAAE,GACnC,mBAAmB,EAAE,CAkBvB;AAED,wBAAgB,sBAAsB,CACpC,WAAW,EAAE,2BAA2B,GACvC,OAAO,CAAC,oBAAoB,CAAC,EAAE,CAoCjC;AAED,wBAAgB,gCAAgC,CAC9C,OAAO,EAAE,UAAU,EACnB,OAAO,EAAE,iBAAiB,GACzB,mCAAmC,CAkDrC;AAED,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,uBAAuB,GAC9B,qBAAqB,CAoBvB;AAED,wBAAgB,2BAA2B,CACzC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,mCAAmC,GAC/C,yBAAyB,EAAE,CAkC7B;AAED,wBAAgB,+BAA+B,CAC7C,WAAW,EAAE,mCAAmC,GAC/C,uBAAuB,EAAE,CAO3B;AAED,MAAM,WAAW,sCAAsC;IACrD,WAAW,EAAE,kBAAkB,CAAC;IAChC,MAAM,EAAE,oBAAoB,CAAC;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,mCAAmC,CAAC;IACjD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,wBAAgB,kCAAkC,CAAC,EACjD,WAAW,EACX,MAAM,EACN,QAAQ,EACR,WAAW,EACX,iBAAyB,EACzB,WAAmB,GACpB,EAAE,sCAAsC,GAAG,0BAA0B,CAuCrE"}
|
|
@@ -34,6 +34,20 @@ export function apiTransformAddOnsToAddonInputs(addOnsApi, serviceAddons) {
|
|
|
34
34
|
};
|
|
35
35
|
});
|
|
36
36
|
}
|
|
37
|
+
export function apiTransformPackagesToPackageInputs(packagesApi, servicePackages) {
|
|
38
|
+
// Create a Map for faster lookup by packageId
|
|
39
|
+
const packageMap = new Map(servicePackages.map((pkg) => [pkg.id, pkg]));
|
|
40
|
+
return packagesApi.map((packageApi) => {
|
|
41
|
+
const matchedPackage = packageMap.get(packageApi.packageId);
|
|
42
|
+
if (!matchedPackage) {
|
|
43
|
+
throw new Error(`Failed to match package with id: ${packageApi.packageId}`);
|
|
44
|
+
}
|
|
45
|
+
return {
|
|
46
|
+
...matchedPackage,
|
|
47
|
+
...packageApi,
|
|
48
|
+
};
|
|
49
|
+
});
|
|
50
|
+
}
|
|
37
51
|
export function apiTransformBookedDays(priceToBook) {
|
|
38
52
|
return priceToBook.daysToBook.map((day) => {
|
|
39
53
|
// Transform addOns using the helper function, then map to the expected output.
|
|
@@ -55,6 +69,8 @@ export function apiTransformBookedDays(priceToBook) {
|
|
|
55
69
|
startDate: day.dateTimeRange.start.toJSDate(),
|
|
56
70
|
endDate: day.dateTimeRange.end.toJSDate(),
|
|
57
71
|
addOns: addOns,
|
|
72
|
+
// Packages are booking-level bundles (see servicePriceToBookToApiBookingBase),
|
|
73
|
+
// not tied to a specific day, so this stays empty here.
|
|
58
74
|
packages: [],
|
|
59
75
|
fees: day.fees,
|
|
60
76
|
priceBreakdown: priceBreakdown,
|
|
@@ -90,6 +106,7 @@ export function serviceGetPriceToBookFromBooking(service, booking) {
|
|
|
90
106
|
flatRateCents: booking.flatRateCents,
|
|
91
107
|
additionalFees: booking.additionalFees,
|
|
92
108
|
addOns: booking.addOns,
|
|
109
|
+
packages: booking.packages,
|
|
93
110
|
daysTotalBeforeTaxesCents: booking.daysTotalATBCents,
|
|
94
111
|
subtotalBeforeTaxesCents: booking.subtotalATBCents,
|
|
95
112
|
totalBeforeTaxesCents: booking.totalATBCents,
|
|
@@ -138,6 +155,12 @@ export function servicePriceToBookToApiDays(serviceId, userId, priceToBook) {
|
|
|
138
155
|
.filter((dayParams) => dayParams !== null) ?? [];
|
|
139
156
|
return bookedDays;
|
|
140
157
|
}
|
|
158
|
+
export function servicePriceToBookToApiPackages(priceToBook) {
|
|
159
|
+
return priceToBook.packages.map((pkg) => ({
|
|
160
|
+
packageId: pkg.packageId,
|
|
161
|
+
chosenQuantity: pkg.chosenQuantity,
|
|
162
|
+
}));
|
|
163
|
+
}
|
|
141
164
|
export function servicePriceToBookToApiBookingBase({ bookingType, status, timezone, priceToBook, allowPromiseToPay = false, isFreeGuest = false, }) {
|
|
142
165
|
const bookedDays = apiTransformBookedDays(priceToBook);
|
|
143
166
|
const addOns = priceToBook.addOns.map((addOn) => ({
|
|
@@ -146,6 +169,12 @@ export function servicePriceToBookToApiBookingBase({ bookingType, status, timezo
|
|
|
146
169
|
chosenQuantity: addOn.chosenQuantity,
|
|
147
170
|
costPQCents: addOn.costPQCents,
|
|
148
171
|
}));
|
|
172
|
+
const packages = priceToBook.packages.map((pkg) => ({
|
|
173
|
+
packageId: pkg.packageId,
|
|
174
|
+
package: pkg.package,
|
|
175
|
+
chosenQuantity: pkg.chosenQuantity,
|
|
176
|
+
costPQCents: pkg.costPQCents,
|
|
177
|
+
}));
|
|
149
178
|
return {
|
|
150
179
|
bookingType: bookingType,
|
|
151
180
|
status: status,
|
|
@@ -158,7 +187,7 @@ export function servicePriceToBookToApiBookingBase({ bookingType, status, timezo
|
|
|
158
187
|
subtotalATBCents: priceToBook.subtotalBeforeTaxesCents,
|
|
159
188
|
totalATBCents: priceToBook.totalBeforeTaxesCents,
|
|
160
189
|
addOns: addOns,
|
|
161
|
-
packages:
|
|
190
|
+
packages: packages,
|
|
162
191
|
allowPromiseToPay: allowPromiseToPay,
|
|
163
192
|
isFreeGuest: isFreeGuest,
|
|
164
193
|
// Phase 3 — providers opt in per-booking when they want BP-paid tickets
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apiServiceBookingApiUtils.js","sourceRoot":"","sources":["../../../src/utils/service/apiServiceBookingApiUtils.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"apiServiceBookingApiUtils.js","sourceRoot":"","sources":["../../../src/utils/service/apiServiceBookingApiUtils.ts"],"names":[],"mappings":"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"}
|