@antelopejs/dms-saas 0.3.8 → 0.3.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/README.md +45 -0
  2. package/dist/invoice-line-items/injection.js +3 -4
  3. package/dist/invoice-line-items/injection.js.map +1 -1
  4. package/dist/routes/tenant/index.d.ts +2 -0
  5. package/dist/routes/tenant/index.js +2 -0
  6. package/dist/routes/tenant/index.js.map +1 -1
  7. package/dist/routes/tenant/tenant-plan-checkout-recovery.d.ts +21 -0
  8. package/dist/routes/tenant/tenant-plan-checkout-recovery.js +140 -0
  9. package/dist/routes/tenant/tenant-plan-checkout-recovery.js.map +1 -0
  10. package/dist/routes/tenant/tenant-plan-checkout.d.ts +2 -0
  11. package/dist/routes/tenant/tenant-plan-checkout.js +180 -0
  12. package/dist/routes/tenant/tenant-plan-checkout.js.map +1 -0
  13. package/dist/routes/tenant/tenant-plan-ops.d.ts +0 -1
  14. package/dist/routes/tenant/tenant-plan-ops.js +0 -100
  15. package/dist/routes/tenant/tenant-plan-ops.js.map +1 -1
  16. package/dist/routes/tenant/tenant-plan.d.ts +3 -0
  17. package/dist/routes/tenant/tenant-plan.js +29 -1
  18. package/dist/routes/tenant/tenant-plan.js.map +1 -1
  19. package/dist/stripe/client.d.ts +1 -0
  20. package/dist/stripe/client.js +3 -2
  21. package/dist/stripe/client.js.map +1 -1
  22. package/dist/stripe/index.d.ts +1 -0
  23. package/dist/stripe/index.js +1 -0
  24. package/dist/stripe/index.js.map +1 -1
  25. package/dist/stripe/payload-shapes.d.ts +17 -0
  26. package/dist/stripe/payload-shapes.js +58 -0
  27. package/dist/stripe/payload-shapes.js.map +1 -0
  28. package/dist/stripe/plan-schedule.js +2 -1
  29. package/dist/stripe/plan-schedule.js.map +1 -1
  30. package/dist/stripe/upcoming-invoice.d.ts +5 -1
  31. package/dist/stripe/upcoming-invoice.js +20 -5
  32. package/dist/stripe/upcoming-invoice.js.map +1 -1
  33. package/dist/stripe/webhook-checkout.js +4 -1
  34. package/dist/stripe/webhook-checkout.js.map +1 -1
  35. package/dist/stripe/webhook-credit-notes.js +4 -8
  36. package/dist/stripe/webhook-credit-notes.js.map +1 -1
  37. package/dist/stripe/webhook-handlers.js +7 -4
  38. package/dist/stripe/webhook-handlers.js.map +1 -1
  39. package/dist/stripe/webhook-shared.js +9 -5
  40. package/dist/stripe/webhook-shared.js.map +1 -1
  41. package/dist/stripe/workspace-checkout.d.ts +6 -0
  42. package/dist/stripe/workspace-checkout.js +60 -2
  43. package/dist/stripe/workspace-checkout.js.map +1 -1
  44. package/dist/upcoming-invoice/mapping.d.ts +2 -2
  45. package/dist/upcoming-invoice/mapping.js +25 -14
  46. package/dist/upcoming-invoice/mapping.js.map +1 -1
  47. package/dist/upcoming-invoice/pricing.js +3 -3
  48. package/dist/upcoming-invoice/pricing.js.map +1 -1
  49. package/dist/workspaces/provisioning.js +2 -4
  50. package/dist/workspaces/provisioning.js.map +1 -1
  51. package/frontend-vue/app/components/PendingCheckoutModal.vue +78 -0
  52. package/frontend-vue/app/components/PlanComparisonModal.vue +5 -0
  53. package/frontend-vue/app/components/PlanUpgradeModal.vue +5 -0
  54. package/frontend-vue/app/components/TenantPlanCard.vue +27 -1
  55. package/frontend-vue/app/components/WorkspaceCreateModal.vue +2 -0
  56. package/frontend-vue/app/composables/useApiErrorMessage.ts +9 -8
  57. package/frontend-vue/app/composables/usePendingCheckout.ts +88 -0
  58. package/frontend-vue/app/composables/useSaasRegistration.ts +1 -0
  59. package/frontend-vue/app/composables/useStripePaymentElement.ts +90 -13
  60. package/frontend-vue/app/composables/useTenantPlan.ts +41 -1
  61. package/frontend-vue/app/custom-pages/auth/no-workspace.vue +1 -0
  62. package/frontend-vue/i18n/locales/saas-en-GB.json +18 -2
  63. package/frontend-vue/i18n/locales/saas-fr-FR.json +18 -2
  64. package/frontend-vue/package.json +3 -0
  65. package/package.json +2 -2
package/README.md CHANGED
@@ -177,6 +177,51 @@ the catalogue has no free plan, nothing is attached and a warning is logged.
177
177
  Once attached, the plan's permissions cap the workspace's members like any
178
178
  other plan (see [Tenant owner permissions](#tenant-owner-permissions)).
179
179
 
180
+ ## Stripe API version and webhooks
181
+
182
+ Every Stripe request is made with API version `2025-08-27.basil`, the version
183
+ the installed `stripe` SDK is generated for (`STRIPE_API_VERSION` in
184
+ `src/stripe/client.ts`; the build fails if the two drift apart).
185
+
186
+ A webhook endpoint renders its events in its **own** API version, set in the
187
+ Stripe Dashboard (Developers → Webhooks → the endpoint → API version), not in
188
+ the version of the requests. Set every endpoint that targets
189
+ `/api/saas/webhooks/stripe` to `2025-08-27.basil`. Until then dms-saas still
190
+ accepts events rendered in older versions: the fields basil moved — the
191
+ subscription billing period (now on each subscription item), the invoice's
192
+ subscription (`parent.subscription_details`), invoice and credit note taxes
193
+ (`total_taxes`), and the credit note refund (`refunds`) — are read from their
194
+ basil location first and from their older one second.
195
+
196
+ Checkout Sessions opt out of Stripe Managed Payments
197
+ (`managed_payments[enabled]=false`). An account that enabled Managed Payments
198
+ applies it to every session by default, but dms-saas is its own merchant of
199
+ record: it collects tax ids, runs Stripe Tax on its invoices, injects invoice
200
+ items and issues credit notes, none of which a Managed Payments session allows.
201
+
202
+ ## Starting a paid plan
203
+
204
+ Moving a workspace without a Stripe subscription to a paid plan opens a Stripe
205
+ Checkout Session. The request is recorded on the subscription as a pending
206
+ checkout before Stripe is called, and the session's completion or expiry
207
+ webhook resolves it. A pending checkout never blocks the owner for good:
208
+
209
+ - when Stripe refuses to open the session (a 4xx answer), the pending
210
+ checkout, the trial it reserved and the Stripe customer it created are
211
+ rolled back, and the request answers
212
+ `422 saas.errors.billing.checkout_rejected`; the owner can retry at once;
213
+ - when Stripe cannot be reached or answers a 5xx, a session may exist, so the
214
+ pending checkout stays and the request answers
215
+ `503 saas.errors.billing.checkout_unavailable`;
216
+ - the next attempt reconciles what it finds: a pending checkout whose recorded
217
+ session has expired, or which never recorded a session within 15 minutes, is
218
+ released and a new session is opened. Its redirect URL only reaches the
219
+ owner once the session is recorded, so an unrecorded session is one nobody
220
+ can pay;
221
+ - a recorded session that is still open answers
222
+ `409 saas.errors.plan.checkout_in_progress`, and any other pending plan
223
+ change `409 saas.errors.plan.change_in_progress`.
224
+
180
225
  ## Plans and Stripe
181
226
 
182
227
  dms-saas keeps every plan billed through Stripe linked to a Stripe product and
@@ -10,6 +10,7 @@ const interface_database_decorators_1 = require("@antelopejs/interface-database-
10
10
  const invoice_line_items_1 = require("@antelopejs/interface-dms-saas/invoice-line-items");
11
11
  const invoice_line_items_2 = require("../implementations/dms-saas/invoice-line-items");
12
12
  const client_1 = require("../stripe/client");
13
+ const payload_shapes_1 = require("../stripe/payload-shapes");
13
14
  const db_1 = require("../db");
14
15
  const billing_window_1 = require("./billing-window");
15
16
  exports.LINE_KEY_METADATA = "saasLineKey";
@@ -47,13 +48,11 @@ async function buildInjectionTarget(invoice, tenantId, customerId) {
47
48
  const subscription = await (0, interface_database_decorators_1.GetModel)(db_1.TenantSubscriptionModel, tenantId).findOne();
48
49
  const context = (0, billing_window_1.clipInvoiceUsageWindow)({
49
50
  tenantId,
50
- invoiceId: invoice.id,
51
+ invoiceId: (0, payload_shapes_1.requireInvoiceId)(invoice),
51
52
  currency: invoice.currency,
52
53
  periodStart: stripeSecondsToDate(invoice.period_start),
53
54
  periodEnd: stripeSecondsToDate(invoice.period_end),
54
- }, subscription, typeof invoice.subscription === "string"
55
- ? invoice.subscription
56
- : (invoice.subscription?.id ?? null));
55
+ }, subscription, (0, payload_shapes_1.readInvoiceSubscriptionId)(invoice));
57
56
  return context ? { customerId, context } : null;
58
57
  }
59
58
  async function fetchInjectedLineKeys(invoiceId) {
@@ -1 +1 @@
1
- {"version":3,"file":"injection.js","sourceRoot":"","sources":["../../src/invoice-line-items/injection.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"injection.js","sourceRoot":"","sources":["../../src/invoice-line-items/injection.ts"],"names":[],"mappings":"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"}
@@ -3,6 +3,8 @@ export * from "./billing-self-refund";
3
3
  export * from "./data-export";
4
4
  export * from "./tenant-billing";
5
5
  export * from "./tenant-plan";
6
+ export * from "./tenant-plan-checkout";
7
+ export * from "./tenant-plan-checkout-recovery";
6
8
  export * from "./tenant-plan-ops";
7
9
  export * from "./tenant-seats";
8
10
  export * from "./workspaces";
@@ -19,6 +19,8 @@ __exportStar(require("./billing-self-refund"), exports);
19
19
  __exportStar(require("./data-export"), exports);
20
20
  __exportStar(require("./tenant-billing"), exports);
21
21
  __exportStar(require("./tenant-plan"), exports);
22
+ __exportStar(require("./tenant-plan-checkout"), exports);
23
+ __exportStar(require("./tenant-plan-checkout-recovery"), exports);
22
24
  __exportStar(require("./tenant-plan-ops"), exports);
23
25
  __exportStar(require("./tenant-seats"), exports);
24
26
  __exportStar(require("./workspaces"), exports);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/routes/tenant/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,mDAAiC;AACjC,wDAAsC;AACtC,gDAA8B;AAC9B,mDAAiC;AACjC,gDAA8B;AAC9B,oDAAkC;AAClC,iDAA+B;AAC/B,+CAA6B"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/routes/tenant/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,mDAAiC;AACjC,wDAAsC;AACtC,gDAA8B;AAC9B,mDAAiC;AACjC,gDAA8B;AAC9B,yDAAuC;AACvC,kEAAgD;AAChD,oDAAkC;AAClC,iDAA+B;AAC/B,+CAA6B"}
@@ -0,0 +1,21 @@
1
+ import type { TenantSubscription, TenantSubscriptionModel } from "../../db";
2
+ export declare const UNRECORDED_CHECKOUT_TTL_MS: number;
3
+ export declare const CHECKOUT_CANCELLED_PARAM = "checkout";
4
+ export declare const CHECKOUT_CANCELLED_VALUE = "cancelled";
5
+ export declare const CHECKOUT_OPERATION_PARAM = "checkoutOperation";
6
+ export interface PendingCheckout {
7
+ targetPlanId: string | null;
8
+ checkoutUrl: string | null;
9
+ expiresAt: Date | null;
10
+ isPaid: boolean;
11
+ }
12
+ export interface PendingCheckoutResult {
13
+ pending: PendingCheckout | null;
14
+ }
15
+ export interface CancelCheckoutResult {
16
+ released: boolean;
17
+ }
18
+ export declare function withCheckoutCancelMarker(cancelUrl: string, operationId: string): string;
19
+ export declare function releaseAbandonedCheckout(subscription: TenantSubscription, model: TenantSubscriptionModel, now?: Date): Promise<TenantSubscription>;
20
+ export declare function describePendingCheckout(subscription: TenantSubscription | undefined): Promise<PendingCheckoutResult>;
21
+ export declare function cancelPendingCheckout(subscription: TenantSubscription | undefined, model: TenantSubscriptionModel, operationId: string | null, now?: Date): Promise<CancelCheckoutResult>;
@@ -0,0 +1,140 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.CHECKOUT_OPERATION_PARAM = exports.CHECKOUT_CANCELLED_VALUE = exports.CHECKOUT_CANCELLED_PARAM = exports.UNRECORDED_CHECKOUT_TTL_MS = void 0;
7
+ exports.withCheckoutCancelMarker = withCheckoutCancelMarker;
8
+ exports.releaseAbandonedCheckout = releaseAbandonedCheckout;
9
+ exports.describePendingCheckout = describePendingCheckout;
10
+ exports.cancelPendingCheckout = cancelPendingCheckout;
11
+ const interface_api_1 = require("@antelopejs/interface-api");
12
+ const logging_1 = require("@antelopejs/interface-core/logging");
13
+ const stripe_1 = __importDefault(require("stripe"));
14
+ const client_1 = require("../../stripe/client");
15
+ const workspace_checkout_1 = require("../../stripe/workspace-checkout");
16
+ const tenant_plan_ops_1 = require("./tenant-plan-ops");
17
+ const CHECKOUT_KIND = "checkout";
18
+ const MS_PER_MINUTE = 60_000;
19
+ const MS_PER_SECOND = 1000;
20
+ const LOG_PREFIX = "[dms-saas:checkout]";
21
+ const CHECKOUT_IN_PROGRESS_KEY = "saas.errors.plan.checkout_in_progress";
22
+ const CHECKOUT_ALREADY_PAID_KEY = "saas.errors.plan.checkout_already_paid";
23
+ exports.UNRECORDED_CHECKOUT_TTL_MS = 15 * MS_PER_MINUTE;
24
+ exports.CHECKOUT_CANCELLED_PARAM = "checkout";
25
+ exports.CHECKOUT_CANCELLED_VALUE = "cancelled";
26
+ exports.CHECKOUT_OPERATION_PARAM = "checkoutOperation";
27
+ function withCheckoutCancelMarker(cancelUrl, operationId) {
28
+ const url = new URL(cancelUrl);
29
+ url.searchParams.set(exports.CHECKOUT_CANCELLED_PARAM, exports.CHECKOUT_CANCELLED_VALUE);
30
+ url.searchParams.set(exports.CHECKOUT_OPERATION_PARAM, operationId);
31
+ return url.toString();
32
+ }
33
+ function pendingCheckoutTransition(subscription) {
34
+ const transition = subscription?.domainTransition;
35
+ return transition?.kind === CHECKOUT_KIND ? transition : null;
36
+ }
37
+ async function retrieveRecordedSession(subscription, transition) {
38
+ if (!subscription.stripeCheckoutSessionId)
39
+ return null;
40
+ const session = await (0, client_1.getStripeClient)().checkout.sessions.retrieve(subscription.stripeCheckoutSessionId);
41
+ return session.metadata?.operationId === transition.operationId
42
+ ? session
43
+ : null;
44
+ }
45
+ function isUnrecordedPastTtl(transition, now) {
46
+ const age = now.getTime() - new Date(transition.requestedAt).getTime();
47
+ return age >= exports.UNRECORDED_CHECKOUT_TTL_MS;
48
+ }
49
+ async function releaseCheckoutTransition(subscription, model, session) {
50
+ const operationId = subscription.domainTransition?.operationId;
51
+ logging_1.Logging.Warn(`${LOG_PREFIX} releasing abandoned checkout ${operationId} of tenant ${subscription._id}`);
52
+ const outcome = await model.mutateRevision(subscription, {
53
+ domainTransition: null,
54
+ stripeCheckoutSessionId: null,
55
+ });
56
+ const released = await model.get(subscription._id);
57
+ if (!released)
58
+ throw new Error("Subscription vanished during release");
59
+ const isStillPending = released.domainTransition?.operationId === operationId;
60
+ if (outcome !== "applied" && isStillPending)
61
+ throw new Error(`Checkout release ${outcome}; reload before retry`);
62
+ if (session)
63
+ await (0, workspace_checkout_1.releaseCheckoutTrialReservation)(session, released._id);
64
+ return released;
65
+ }
66
+ async function findAbandonment(subscription, transition, now) {
67
+ const session = await retrieveRecordedSession(subscription, transition);
68
+ if (session)
69
+ return { isAbandoned: session.status === "expired", session };
70
+ return { isAbandoned: isUnrecordedPastTtl(transition, now), session };
71
+ }
72
+ async function releaseAbandonedCheckout(subscription, model, now = new Date()) {
73
+ const transition = pendingCheckoutTransition(subscription);
74
+ if (!transition)
75
+ return subscription;
76
+ const { isAbandoned, session } = await findAbandonment(subscription, transition, now);
77
+ if (!isAbandoned)
78
+ return subscription;
79
+ return releaseCheckoutTransition(subscription, model, session);
80
+ }
81
+ function describeSession(transition, session) {
82
+ if (session?.status === "expired")
83
+ return null;
84
+ const isOpen = session?.status === "open";
85
+ return {
86
+ targetPlanId: transition.targetPlanId,
87
+ checkoutUrl: isOpen ? (session.url ?? null) : null,
88
+ expiresAt: isOpen && session.expires_at
89
+ ? new Date(session.expires_at * MS_PER_SECOND)
90
+ : null,
91
+ isPaid: session?.status === "complete",
92
+ };
93
+ }
94
+ async function describePendingCheckout(subscription) {
95
+ const transition = pendingCheckoutTransition(subscription);
96
+ if (!subscription || !transition)
97
+ return { pending: null };
98
+ const session = await retrieveRecordedSession(subscription, transition);
99
+ return { pending: describeSession(transition, session) };
100
+ }
101
+ async function expireOpenSession(session) {
102
+ if (session.status !== "open")
103
+ return session;
104
+ const sessions = (0, client_1.getStripeClient)().checkout.sessions;
105
+ try {
106
+ return await sessions.expire(session.id);
107
+ }
108
+ catch (error) {
109
+ if (!(error instanceof stripe_1.default.errors.StripeInvalidRequestError))
110
+ throw error;
111
+ return sessions.retrieve(session.id);
112
+ }
113
+ }
114
+ const CANCELLATION_REFUSALS = {
115
+ open: CHECKOUT_IN_PROGRESS_KEY,
116
+ complete: CHECKOUT_ALREADY_PAID_KEY,
117
+ };
118
+ async function cancelRecordedSession(subscription, model, session) {
119
+ const settled = await expireOpenSession(session);
120
+ const refusal = settled.status && CANCELLATION_REFUSALS[settled.status];
121
+ if (refusal)
122
+ throw new interface_api_1.HTTPResult(tenant_plan_ops_1.HTTP_CONFLICT, refusal);
123
+ await releaseCheckoutTransition(subscription, model, settled);
124
+ return { released: true };
125
+ }
126
+ async function cancelPendingCheckout(subscription, model, operationId, now = new Date()) {
127
+ const transition = pendingCheckoutTransition(subscription);
128
+ if (!subscription || !transition)
129
+ return { released: false };
130
+ if (operationId && operationId !== transition.operationId)
131
+ return { released: false };
132
+ const session = await retrieveRecordedSession(subscription, transition);
133
+ if (session)
134
+ return cancelRecordedSession(subscription, model, session);
135
+ if (!isUnrecordedPastTtl(transition, now))
136
+ throw new interface_api_1.HTTPResult(tenant_plan_ops_1.HTTP_CONFLICT, CHECKOUT_IN_PROGRESS_KEY);
137
+ await releaseCheckoutTransition(subscription, model, null);
138
+ return { released: true };
139
+ }
140
+ //# sourceMappingURL=tenant-plan-checkout-recovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tenant-plan-checkout-recovery.js","sourceRoot":"","sources":["../../../src/routes/tenant/tenant-plan-checkout-recovery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { type ChangePlanResult, type PlanChangeRequest } from "./tenant-plan-ops";
2
+ export declare function startPaidCheckout(request: PlanChangeRequest): Promise<ChangePlanResult>;
@@ -0,0 +1,180 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.startPaidCheckout = startPaidCheckout;
4
+ const node_crypto_1 = require("node:crypto");
5
+ const interface_api_1 = require("@antelopejs/interface-api");
6
+ const interface_api_util_1 = require("@antelopejs/interface-api-util");
7
+ const logging_1 = require("@antelopejs/interface-core/logging");
8
+ const interface_database_decorators_1 = require("@antelopejs/interface-database-decorators");
9
+ const tenant_lifecycle_1 = require("@antelopejs/interface-dms/tenant-lifecycle");
10
+ const billing_state_1 = require("../../billing-state");
11
+ const config_1 = require("../../config");
12
+ const db_1 = require("../../db");
13
+ const client_1 = require("../../stripe/client");
14
+ const workspace_checkout_1 = require("../../stripe/workspace-checkout");
15
+ const utils_1 = require("../../utils");
16
+ const complimentary_1 = require("../../workspaces/complimentary");
17
+ const trial_identity_model_1 = require("../../workspaces/db/trial-identity.model");
18
+ const tenant_plan_ops_1 = require("./tenant-plan-ops");
19
+ const tenant_plan_checkout_recovery_1 = require("./tenant-plan-checkout-recovery");
20
+ const HTTP_UNPROCESSABLE = 422;
21
+ const HTTP_SERVICE_UNAVAILABLE = 503;
22
+ const PENDING_PAYMENT_STATUS = "pending_payment";
23
+ const PLACEHOLDER_PLAN_ID = null;
24
+ const CHECKOUT_KIND = "checkout";
25
+ const LOG_PREFIX = "[dms-saas:checkout]";
26
+ const NO_TRIAL = { days: 0, reservedIdentityId: null };
27
+ function asNonEmptyString(value) {
28
+ return typeof value === "string" && value.trim().length > 0
29
+ ? value.trim()
30
+ : null;
31
+ }
32
+ function validateCheckoutRedirectInput(body) {
33
+ const successUrl = asNonEmptyString(body.successUrl);
34
+ const cancelUrl = asNonEmptyString(body.cancelUrl);
35
+ (0, interface_api_util_1.assert)(successUrl && (0, config_1.isAllowedRedirectUrl)(successUrl), tenant_plan_ops_1.HTTP_BAD_REQUEST, "saas.errors.billing.invalid_return_url");
36
+ (0, interface_api_util_1.assert)(cancelUrl && (0, config_1.isAllowedRedirectUrl)(cancelUrl), tenant_plan_ops_1.HTTP_BAD_REQUEST, "saas.errors.billing.invalid_return_url");
37
+ return { successUrl, cancelUrl };
38
+ }
39
+ async function resolveCheckoutTrial(request) {
40
+ const { newPlan, user, tenantId } = request;
41
+ if (!newPlan.trialDays || newPlan.trialDays <= 0)
42
+ return NO_TRIAL;
43
+ const trialConsumptionModel = (0, interface_database_decorators_1.GetModel)(db_1.TrialConsumptionModel);
44
+ const emailHash = (0, utils_1.hashEmail)(user.email);
45
+ if (await trialConsumptionModel.existsForIdentity(emailHash, null)) {
46
+ return NO_TRIAL;
47
+ }
48
+ const identities = (0, interface_database_decorators_1.GetModel)(trial_identity_model_1.TrialIdentityModel);
49
+ const id = (0, trial_identity_model_1.trialIdentityId)("email", emailHash);
50
+ if ((await identities.get(id))?.tenantId)
51
+ return NO_TRIAL;
52
+ if (!(await identities.reserve(id, tenantId)))
53
+ return NO_TRIAL;
54
+ return { days: newPlan.trialDays, reservedIdentityId: id };
55
+ }
56
+ async function initializeCheckoutSubscription(request) {
57
+ if (request.subscription)
58
+ return request.subscription;
59
+ await request.tenantSubscriptionModel.insert({
60
+ _id: request.tenantId,
61
+ planId: PLACEHOLDER_PLAN_ID,
62
+ status: PENDING_PAYMENT_STATUS,
63
+ isComplimentary: false,
64
+ paidUsagePeriods: [],
65
+ stripeCustomerId: null,
66
+ stripeSubscriptionId: null,
67
+ stripeCheckoutSessionId: null,
68
+ createdBy: request.user._id,
69
+ createdAt: new Date(),
70
+ updatedAt: new Date(),
71
+ });
72
+ const subscription = await request.tenantSubscriptionModel.get(request.tenantId);
73
+ if (!subscription)
74
+ throw new Error("Checkout subscription acknowledgement requires reconciliation");
75
+ return subscription;
76
+ }
77
+ async function attachCheckoutSession(checkout, subscription, model, operationId) {
78
+ await model.updateDuringTransition(subscription._id, operationId, {
79
+ isComplimentary: (0, complimentary_1.isComplimentarySubscription)(subscription),
80
+ stripeCustomerId: checkout.customerId,
81
+ stripeCheckoutSessionId: checkout.sessionId,
82
+ updatedAt: new Date(),
83
+ });
84
+ }
85
+ async function expireUnusableSession(error) {
86
+ if (!(error instanceof workspace_checkout_1.UnusableCheckoutSessionError))
87
+ return;
88
+ await (0, client_1.getStripeClient)().checkout.sessions.expire(error.sessionId);
89
+ }
90
+ async function rollbackCheckoutAttempt(attempt, model) {
91
+ await model.completeTransition(attempt.subscriptionId, attempt.operationId, {});
92
+ if (attempt.reservedTrialIdentityId) {
93
+ await (0, interface_database_decorators_1.GetModel)(trial_identity_model_1.TrialIdentityModel)
94
+ .releaseUnused(attempt.reservedTrialIdentityId, attempt.tenantId)
95
+ .catch((releaseError) => logging_1.Logging.Warn(`${LOG_PREFIX} failed to release the trial reserved by checkout ${attempt.operationId}`, releaseError));
96
+ }
97
+ if (attempt.createdCustomerId) {
98
+ await (0, workspace_checkout_1.deleteStripeCustomerIfExists)(attempt.createdCustomerId).catch((cleanupError) => logging_1.Logging.Warn(`${LOG_PREFIX} failed to delete unused Stripe customer ${attempt.createdCustomerId}`, cleanupError));
99
+ }
100
+ }
101
+ async function failCheckoutAttempt(error, attempt, model) {
102
+ logging_1.Logging.Error(`${LOG_PREFIX} Stripe Checkout failed for tenant ${attempt.tenantId}`, error);
103
+ const isUnusableSession = error instanceof workspace_checkout_1.UnusableCheckoutSessionError;
104
+ if (!(0, workspace_checkout_1.isDefinitiveStripeRejection)(error) && !isUnusableSession) {
105
+ throw new interface_api_1.HTTPResult(HTTP_SERVICE_UNAVAILABLE, "saas.errors.billing.checkout_unavailable");
106
+ }
107
+ await expireUnusableSession(error);
108
+ await rollbackCheckoutAttempt(attempt, model);
109
+ throw new interface_api_1.HTTPResult(HTTP_UNPROCESSABLE, "saas.errors.billing.checkout_rejected");
110
+ }
111
+ async function admitCheckout(request) {
112
+ const model = request.tenantSubscriptionModel;
113
+ const subscription = await (0, tenant_plan_checkout_recovery_1.releaseAbandonedCheckout)(await initializeCheckoutSubscription(request), model);
114
+ (0, interface_api_util_1.assert)(!subscription.domainTransition, tenant_plan_ops_1.HTTP_CONFLICT, subscription.domainTransition?.kind === CHECKOUT_KIND
115
+ ? "saas.errors.plan.checkout_in_progress"
116
+ : "saas.errors.plan.change_in_progress");
117
+ const operationId = (0, node_crypto_1.randomUUID)();
118
+ await model.beginTransition(subscription, {
119
+ operationId,
120
+ kind: CHECKOUT_KIND,
121
+ targetPlanId: request.newPlan._id,
122
+ requestedAt: new Date(),
123
+ });
124
+ return {
125
+ subscription,
126
+ operationId,
127
+ tenantId: request.tenantId,
128
+ subscriptionId: subscription._id,
129
+ createdCustomerId: null,
130
+ reservedTrialIdentityId: null,
131
+ };
132
+ }
133
+ async function openCheckoutSession(request, attempt, target) {
134
+ const { existingCustomerId, redirect } = target;
135
+ const trial = await resolveCheckoutTrial(request);
136
+ attempt.reservedTrialIdentityId = trial.reservedIdentityId;
137
+ const customerId = existingCustomerId ??
138
+ (await (0, workspace_checkout_1.createTenantCheckoutCustomer)({
139
+ operationId: attempt.operationId,
140
+ tenantId: request.tenantId,
141
+ ownerEmail: request.user.email,
142
+ }));
143
+ if (!existingCustomerId)
144
+ attempt.createdCustomerId = customerId;
145
+ return (0, workspace_checkout_1.createWorkspaceCheckoutSession)({
146
+ operationId: attempt.operationId,
147
+ tenantId: request.tenantId,
148
+ ownerEmail: request.user.email,
149
+ stripePriceId: target.stripePriceId,
150
+ trialDays: trial.days,
151
+ successUrl: redirect.successUrl,
152
+ cancelUrl: (0, tenant_plan_checkout_recovery_1.withCheckoutCancelMarker)(redirect.cancelUrl, attempt.operationId),
153
+ planId: request.newPlan._id,
154
+ existingCustomerId: customerId,
155
+ reservedTrialIdentityId: trial.reservedIdentityId,
156
+ });
157
+ }
158
+ async function createAdmittedCheckout(request) {
159
+ const { tenantId, newPlan, body, tenantSubscriptionModel } = request;
160
+ const redirect = validateCheckoutRedirectInput(body);
161
+ const stripePriceId = newPlan.paymentProviderRefs?.stripePriceId;
162
+ (0, interface_api_util_1.assert)(stripePriceId, tenant_plan_ops_1.HTTP_BAD_REQUEST, "saas.errors.plan.no_stripe_price");
163
+ const { subscription, ...attempt } = await admitCheckout(request);
164
+ const checkout = await openCheckoutSession(request, attempt, {
165
+ stripePriceId,
166
+ existingCustomerId: subscription.stripeCustomerId ?? null,
167
+ redirect,
168
+ }).catch((error) => failCheckoutAttempt(error, attempt, tenantSubscriptionModel));
169
+ await attachCheckoutSession(checkout, subscription, tenantSubscriptionModel, attempt.operationId);
170
+ await (0, billing_state_1.recomputeTenantBillingState)(tenantId);
171
+ return {
172
+ ...tenant_plan_ops_1.UNCHANGED_RESULT_BASE,
173
+ planId: newPlan._id,
174
+ checkoutUrl: checkout.url,
175
+ };
176
+ }
177
+ async function startPaidCheckout(request) {
178
+ return (0, tenant_lifecycle_1.runTenantLifecycleOperation)(request.tenantId, () => createAdmittedCheckout(request));
179
+ }
180
+ //# sourceMappingURL=tenant-plan-checkout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tenant-plan-checkout.js","sourceRoot":"","sources":["../../../src/routes/tenant/tenant-plan-checkout.ts"],"names":[],"mappings":"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"}
@@ -50,7 +50,6 @@ export declare function loadAndValidateTargetPlan(planModel: PlanModel, planId:
50
50
  export declare function assertSeatLimit(tenantId: string, plan: Plan): Promise<void>;
51
51
  export declare function finalizeImmediateChange(tenantId: string, subscription: TenantSubscription, newPlan: Plan): Promise<void>;
52
52
  export declare function isPaidPlan(plan: Plan): boolean;
53
- export declare function startPaidCheckout(request: PlanChangeRequest): Promise<ChangePlanResult>;
54
53
  export declare function insertFreeSubscription(user: User, newPlanId: string, tenantId: string, tenantSubscriptionModel: TenantSubscriptionModel): Promise<ChangePlanResult>;
55
54
  export declare function scheduleDowngrade(tenantId: string, subscription: TenantSubscription, newPlan: Plan): Promise<ChangePlanResult>;
56
55
  export declare function dropPendingChange(tenantId: string, subscription: TenantSubscription): Promise<ChangePlanResult>;