@antelopejs/dms-saas 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (195) hide show
  1. package/README.md +307 -33
  2. package/dist/billing-state/index.d.ts +1 -0
  3. package/dist/billing-state/index.js +1 -0
  4. package/dist/billing-state/index.js.map +1 -1
  5. package/dist/billing-state/past-due-banner.d.ts +4 -0
  6. package/dist/billing-state/past-due-banner.js +25 -0
  7. package/dist/billing-state/past-due-banner.js.map +1 -0
  8. package/dist/config/runtime.d.ts +6 -1
  9. package/dist/config/runtime.js +50 -1
  10. package/dist/config/runtime.js.map +1 -1
  11. package/dist/crons/recompute-billing-state.js +4 -1
  12. package/dist/crons/recompute-billing-state.js.map +1 -1
  13. package/dist/data-api/platformOwner/index.d.ts +1 -0
  14. package/dist/data-api/platformOwner/index.js +1 -0
  15. package/dist/data-api/platformOwner/index.js.map +1 -1
  16. package/dist/data-api/platformOwner/invitations.d.ts +22 -0
  17. package/dist/data-api/platformOwner/invitations.js +121 -0
  18. package/dist/data-api/platformOwner/invitations.js.map +1 -0
  19. package/dist/data-api/platformOwner/invoice-options.js +3 -2
  20. package/dist/data-api/platformOwner/invoice-options.js.map +1 -1
  21. package/dist/data-api/platformOwner/workspaces.d.ts +3 -0
  22. package/dist/data-api/platformOwner/workspaces.js +64 -12
  23. package/dist/data-api/platformOwner/workspaces.js.map +1 -1
  24. package/dist/data-api/tenant/tenant-invoices.js +2 -10
  25. package/dist/data-api/tenant/tenant-invoices.js.map +1 -1
  26. package/dist/hooks/register.js +2 -1
  27. package/dist/hooks/register.js.map +1 -1
  28. package/dist/implementations/dms-saas/billing.d.ts +2 -1
  29. package/dist/implementations/dms-saas/billing.js +6 -0
  30. package/dist/implementations/dms-saas/billing.js.map +1 -1
  31. package/dist/index.js +5 -0
  32. package/dist/index.js.map +1 -1
  33. package/dist/invoice-line-items/billing-window.js +2 -2
  34. package/dist/invoice-line-items/billing-window.js.map +1 -1
  35. package/dist/invoice-line-items/injection.d.ts +10 -0
  36. package/dist/invoice-line-items/injection.js +7 -3
  37. package/dist/invoice-line-items/injection.js.map +1 -1
  38. package/dist/operator-actions/db/lifecycle-delivery.model.js +1 -3
  39. package/dist/operator-actions/db/lifecycle-delivery.model.js.map +1 -1
  40. package/dist/operator-actions/db/lifecycle-delivery.table.d.ts +1 -1
  41. package/dist/operator-actions/db/lifecycle-delivery.table.js.map +1 -1
  42. package/dist/operator-actions/db/operator-action.model.js +1 -3
  43. package/dist/operator-actions/db/operator-action.model.js.map +1 -1
  44. package/dist/operator-actions/db/operator-action.table.d.ts +1 -1
  45. package/dist/operator-actions/db/operator-action.table.js.map +1 -1
  46. package/dist/operator-actions/index.d.ts +1 -0
  47. package/dist/operator-actions/index.js +1 -0
  48. package/dist/operator-actions/index.js.map +1 -1
  49. package/dist/operator-actions/invitation-commands.d.ts +12 -0
  50. package/dist/operator-actions/invitation-commands.js +46 -0
  51. package/dist/operator-actions/invitation-commands.js.map +1 -0
  52. package/dist/operator-actions/types.d.ts +1 -1
  53. package/dist/pages/platform/dashboard.js +2 -4
  54. package/dist/pages/platform/dashboard.js.map +1 -1
  55. package/dist/pages/platform/workspaces/detail.js +40 -1
  56. package/dist/pages/platform/workspaces/detail.js.map +1 -1
  57. package/dist/pages/platform/workspaces/index.d.ts +2 -8
  58. package/dist/pages/platform/workspaces/index.js +27 -111
  59. package/dist/pages/platform/workspaces/index.js.map +1 -1
  60. package/dist/pages/public/legal/privacy-policy.js +2 -1
  61. package/dist/pages/public/legal/privacy-policy.js.map +1 -1
  62. package/dist/pages/public/legal/terms-and-conditions.js +2 -1
  63. package/dist/pages/public/legal/terms-and-conditions.js.map +1 -1
  64. package/dist/pages/public/legal/terms-of-use.js +2 -1
  65. package/dist/pages/public/legal/terms-of-use.js.map +1 -1
  66. package/dist/plans/index.d.ts +1 -0
  67. package/dist/plans/index.js +1 -0
  68. package/dist/plans/index.js.map +1 -1
  69. package/dist/plans/platform-support.d.ts +2 -0
  70. package/dist/plans/platform-support.js +19 -0
  71. package/dist/plans/platform-support.js.map +1 -0
  72. package/dist/plans/seat-capacity.d.ts +9 -2
  73. package/dist/plans/seat-capacity.js +59 -12
  74. package/dist/plans/seat-capacity.js.map +1 -1
  75. package/dist/plans/seat-hooks.js +34 -13
  76. package/dist/plans/seat-hooks.js.map +1 -1
  77. package/dist/routes/platformOwner/credit-notes-issue.js +2 -1
  78. package/dist/routes/platformOwner/credit-notes-issue.js.map +1 -1
  79. package/dist/routes/platformOwner/dashboard.d.ts +8 -6
  80. package/dist/routes/platformOwner/dashboard.js +31 -17
  81. package/dist/routes/platformOwner/dashboard.js.map +1 -1
  82. package/dist/routes/platformOwner/index.d.ts +1 -0
  83. package/dist/routes/platformOwner/index.js +1 -0
  84. package/dist/routes/platformOwner/index.js.map +1 -1
  85. package/dist/routes/platformOwner/workspace-invitations.d.ts +13 -0
  86. package/dist/routes/platformOwner/workspace-invitations.js +73 -0
  87. package/dist/routes/platformOwner/workspace-invitations.js.map +1 -0
  88. package/dist/routes/public/register.d.ts +7 -3
  89. package/dist/routes/public/register.js +42 -27
  90. package/dist/routes/public/register.js.map +1 -1
  91. package/dist/routes/tenant/tenant-billing.d.ts +7 -11
  92. package/dist/routes/tenant/tenant-billing.js +34 -26
  93. package/dist/routes/tenant/tenant-billing.js.map +1 -1
  94. package/dist/routes/tenant/tenant-plan-ops.js +2 -2
  95. package/dist/routes/tenant/tenant-plan-ops.js.map +1 -1
  96. package/dist/routes/tenant/tenant-plan.d.ts +1 -0
  97. package/dist/routes/tenant/tenant-plan.js +27 -2
  98. package/dist/routes/tenant/tenant-plan.js.map +1 -1
  99. package/dist/routes/tenant/tenant-seats.d.ts +2 -4
  100. package/dist/routes/tenant/tenant-seats.js.map +1 -1
  101. package/dist/routes/tenant/workspaces.d.ts +2 -0
  102. package/dist/routes/tenant/workspaces.js +10 -4
  103. package/dist/routes/tenant/workspaces.js.map +1 -1
  104. package/dist/stripe/upcoming-invoice.d.ts +21 -0
  105. package/dist/stripe/upcoming-invoice.js +42 -0
  106. package/dist/stripe/upcoming-invoice.js.map +1 -0
  107. package/dist/stripe/webhook-dispatch.js +2 -0
  108. package/dist/stripe/webhook-dispatch.js.map +1 -1
  109. package/dist/types/config.d.ts +9 -0
  110. package/dist/types/config.js +7 -0
  111. package/dist/types/config.js.map +1 -1
  112. package/dist/upcoming-invoice/db/preview-cache.model.d.ts +38 -0
  113. package/dist/upcoming-invoice/db/preview-cache.model.js +57 -0
  114. package/dist/upcoming-invoice/db/preview-cache.model.js.map +1 -0
  115. package/dist/upcoming-invoice/db/preview-cache.table.d.ts +10 -0
  116. package/dist/upcoming-invoice/db/preview-cache.table.js +42 -0
  117. package/dist/upcoming-invoice/db/preview-cache.table.js.map +1 -0
  118. package/dist/upcoming-invoice/eligibility.d.ts +17 -0
  119. package/dist/upcoming-invoice/eligibility.js +52 -0
  120. package/dist/upcoming-invoice/eligibility.js.map +1 -0
  121. package/dist/upcoming-invoice/invalidation.d.ts +2 -0
  122. package/dist/upcoming-invoice/invalidation.js +39 -0
  123. package/dist/upcoming-invoice/invalidation.js.map +1 -0
  124. package/dist/upcoming-invoice/mapping.d.ts +8 -0
  125. package/dist/upcoming-invoice/mapping.js +82 -0
  126. package/dist/upcoming-invoice/mapping.js.map +1 -0
  127. package/dist/upcoming-invoice/outcomes.d.ts +13 -0
  128. package/dist/upcoming-invoice/outcomes.js +15 -0
  129. package/dist/upcoming-invoice/outcomes.js.map +1 -0
  130. package/dist/upcoming-invoice/preview.d.ts +3 -0
  131. package/dist/upcoming-invoice/preview.js +80 -0
  132. package/dist/upcoming-invoice/preview.js.map +1 -0
  133. package/dist/upcoming-invoice/pricing.d.ts +3 -0
  134. package/dist/upcoming-invoice/pricing.js +84 -0
  135. package/dist/upcoming-invoice/pricing.js.map +1 -0
  136. package/dist/upcoming-invoice/usage.d.ts +14 -0
  137. package/dist/upcoming-invoice/usage.js +53 -0
  138. package/dist/upcoming-invoice/usage.js.map +1 -0
  139. package/dist/workspaces/billing-identity.d.ts +19 -0
  140. package/dist/workspaces/billing-identity.js +51 -0
  141. package/dist/workspaces/billing-identity.js.map +1 -0
  142. package/dist/workspaces/default-plan.d.ts +5 -0
  143. package/dist/workspaces/default-plan.js +110 -0
  144. package/dist/workspaces/default-plan.js.map +1 -0
  145. package/dist/workspaces/index.d.ts +2 -0
  146. package/dist/workspaces/index.js +2 -0
  147. package/dist/workspaces/index.js.map +1 -1
  148. package/dist/workspaces/invitations.d.ts +26 -0
  149. package/dist/workspaces/invitations.js +112 -0
  150. package/dist/workspaces/invitations.js.map +1 -0
  151. package/dist/workspaces/provisioning.d.ts +3 -3
  152. package/dist/workspaces/provisioning.js +49 -11
  153. package/dist/workspaces/provisioning.js.map +1 -1
  154. package/frontend-vue/app/components/BillingIdentityFields.vue +179 -0
  155. package/frontend-vue/app/components/PastDueBanner.vue +81 -0
  156. package/frontend-vue/app/components/PaymentMethodCard.vue +94 -38
  157. package/frontend-vue/app/components/PlanComparisonModal.vue +62 -26
  158. package/frontend-vue/app/components/PlanUpgradeModal.vue +181 -0
  159. package/frontend-vue/app/components/PlatformNotes.vue +4 -0
  160. package/frontend-vue/app/components/RefundButton.vue +10 -1
  161. package/frontend-vue/app/components/Register.vue +49 -92
  162. package/frontend-vue/app/components/SeatQuotaBanner.vue +28 -0
  163. package/frontend-vue/app/components/TenantBillingForm.vue +52 -128
  164. package/frontend-vue/app/components/TenantPlanCard.vue +68 -10
  165. package/frontend-vue/app/components/UserSummaryCard.vue +12 -10
  166. package/frontend-vue/app/components/WorkspaceAdminCreateModal.vue +202 -0
  167. package/frontend-vue/app/components/WorkspaceCreateModal.vue +46 -9
  168. package/frontend-vue/app/components/WorkspaceInvitationLink.vue +106 -0
  169. package/frontend-vue/app/components/WorkspaceSummaryCard.vue +39 -15
  170. package/frontend-vue/app/components/WorkspaceSuspended.vue +3 -5
  171. package/frontend-vue/app/components/WorkspaceSwitcherWidget.vue +8 -5
  172. package/frontend-vue/app/composables/useBillingCountries.ts +25 -5
  173. package/frontend-vue/app/composables/useBillingDocumentType.ts +9 -5
  174. package/frontend-vue/app/composables/useBillingIdentity.ts +141 -0
  175. package/frontend-vue/app/composables/useInvitationLink.ts +69 -0
  176. package/frontend-vue/app/composables/usePastDueBannerAction.ts +20 -0
  177. package/frontend-vue/app/composables/usePlanComparison.ts +15 -0
  178. package/frontend-vue/app/composables/usePlanFeatureFormat.ts +312 -20
  179. package/frontend-vue/app/composables/usePlanFeatureLabel.ts +24 -0
  180. package/frontend-vue/app/composables/useSaasRegistration.ts +110 -223
  181. package/frontend-vue/app/composables/useSeatQuota.ts +8 -0
  182. package/frontend-vue/app/composables/useStripePaymentElement.ts +3 -3
  183. package/frontend-vue/app/composables/useWorkspaceAccessCache.ts +29 -2
  184. package/frontend-vue/app/composables/useWorkspaceFinalization.ts +7 -32
  185. package/frontend-vue/app/custom-pages/auth/no-workspace.vue +49 -194
  186. package/frontend-vue/app/plugins/auth-links.ts +0 -4
  187. package/frontend-vue/app/plugins/billing-data-types.ts +4 -2
  188. package/frontend-vue/app/types/runtime-config.ts +13 -0
  189. package/frontend-vue/dms.frontend.ts +10 -4
  190. package/frontend-vue/i18n/locales/saas-en-GB.json +161 -36
  191. package/frontend-vue/i18n/locales/saas-fr-FR.json +162 -37
  192. package/frontend-vue/package.json +0 -1
  193. package/frontend-vue/pnpm-lock.yaml +1 -125
  194. package/package.json +5 -5
  195. package/frontend-vue/app/middleware/workspace-suspended.global.ts +0 -59
@@ -0,0 +1,26 @@
1
+ import type { User } from "@antelopejs/interface-dms/auth/db";
2
+ import { type UserInvite } from "@antelopejs/interface-dms/db";
3
+ export type InvitationEmailDelivery = "sent" | "failed";
4
+ export type InvitationStatus = "pending" | "expired";
5
+ export interface InvitationLink {
6
+ link: string;
7
+ expiresAt: Date;
8
+ }
9
+ interface InvitationSender {
10
+ workspaceName?: string;
11
+ inviterName?: string;
12
+ }
13
+ type DeliverableInvitation = Pick<UserInvite, "email" | "token" | "firstname" | "lastname" | "language">;
14
+ export interface ReissuedInvitation {
15
+ invite: UserInvite;
16
+ emailDelivery: InvitationEmailDelivery;
17
+ }
18
+ export declare function invitationStatusOf(invite: Pick<UserInvite, "expiresAt">, now?: Date): InvitationStatus;
19
+ export declare function buildInvitationLink(invite: Pick<UserInvite, "email" | "token" | "firstname" | "lastname">): Promise<string>;
20
+ export declare function inviterNameOf(user: Pick<User, "name">): string | undefined;
21
+ export declare function deliverInvitationEmail(invite: DeliverableInvitation, sender?: InvitationSender): Promise<InvitationEmailDelivery>;
22
+ export declare function countPendingInvitations(tenantId: string, now?: Date): Promise<number>;
23
+ export declare function findPendingOwnerInvite(tenantId: string): Promise<UserInvite | undefined>;
24
+ export declare function resendInvitation(tenantId: string, inviteId: string, inviterName?: string): Promise<ReissuedInvitation>;
25
+ export declare function resolveInvitationLink(tenantId: string, inviteId: string): Promise<InvitationLink>;
26
+ export {};
@@ -0,0 +1,112 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.invitationStatusOf = invitationStatusOf;
4
+ exports.buildInvitationLink = buildInvitationLink;
5
+ exports.inviterNameOf = inviterNameOf;
6
+ exports.deliverInvitationEmail = deliverInvitationEmail;
7
+ exports.countPendingInvitations = countPendingInvitations;
8
+ exports.findPendingOwnerInvite = findPendingOwnerInvite;
9
+ exports.resendInvitation = resendInvitation;
10
+ exports.resolveInvitationLink = resolveInvitationLink;
11
+ const interface_api_util_1 = require("@antelopejs/interface-api-util");
12
+ const logging_1 = require("@antelopejs/interface-core/logging");
13
+ const interface_database_decorators_1 = require("@antelopejs/interface-database-decorators");
14
+ const auth_1 = require("@antelopejs/interface-dms/auth");
15
+ const client_base_url_1 = require("@antelopejs/interface-dms/client-base-url");
16
+ const db_1 = require("@antelopejs/interface-dms/db");
17
+ const invite_resolution_1 = require("@antelopejs/interface-dms/invite-resolution");
18
+ const invites_1 = require("@antelopejs/interface-dms/invites");
19
+ const HTTP_NOT_FOUND = 404;
20
+ const SIGNUP_PATH = "/auth/signup";
21
+ function invitationStatusOf(invite, now = new Date()) {
22
+ return invite.expiresAt.getTime() > now.getTime() ? "pending" : "expired";
23
+ }
24
+ async function buildInvitationLink(invite) {
25
+ const params = new URLSearchParams({
26
+ token: invite.token,
27
+ email: invite.email,
28
+ });
29
+ const name = (0, invites_1.inviteeDisplayName)(invite.firstname, invite.lastname);
30
+ if (name)
31
+ params.set("name", name);
32
+ const baseUrl = (await (0, client_base_url_1.GetClientBaseUrl)()) ?? "";
33
+ return `${baseUrl}${SIGNUP_PATH}?${params.toString()}`;
34
+ }
35
+ function inviterNameOf(user) {
36
+ return user.name?.trim() || undefined;
37
+ }
38
+ function invitationEmailContext(invite, sender) {
39
+ return {
40
+ workspaceName: sender.workspaceName,
41
+ inviterName: sender.inviterName,
42
+ language: invite.language,
43
+ };
44
+ }
45
+ async function deliverInvitationEmail(invite, sender = {}) {
46
+ try {
47
+ await (0, auth_1.sendAdminInviteEmail)(invite.email, invite.token, (0, invites_1.inviteeDisplayName)(invite.firstname, invite.lastname), invitationEmailContext(invite, sender));
48
+ return "sent";
49
+ }
50
+ catch (error) {
51
+ logging_1.Logging.Error(`[dms-saas] invitation email to "${invite.email}" could not be sent:`, error);
52
+ return "failed";
53
+ }
54
+ }
55
+ async function countPendingInvitations(tenantId, now = new Date()) {
56
+ const invites = await (0, interface_database_decorators_1.GetModel)(db_1.UserInviteModel, tenantId).getAll();
57
+ return invites.filter((invite) => invitationStatusOf(invite, now) === "pending").length;
58
+ }
59
+ async function findPendingOwnerInvite(tenantId) {
60
+ const invites = await (0, interface_database_decorators_1.GetModel)(db_1.UserInviteModel, tenantId).getAll();
61
+ return invites
62
+ .filter((invite) => invite.asTenantOwner)
63
+ .sort((a, b) => a.createdAt.getTime() - b.createdAt.getTime())[0];
64
+ }
65
+ async function loadActionableInvite(tenantId, inviteId) {
66
+ const invite = await (0, invite_resolution_1.loadInviteForAction)(tenantId, inviteId);
67
+ (0, interface_api_util_1.assert)(invite, HTTP_NOT_FOUND, "saas.errors.invitations.not_found");
68
+ await (0, invite_resolution_1.assertInviteReady)(tenantId, invite);
69
+ return invite;
70
+ }
71
+ async function renewInvite(tenantId, invite) {
72
+ const { inviteId } = await (0, invites_1.createUserInviteToken)({
73
+ tenantId,
74
+ replacesInvite: invite,
75
+ email: invite.email,
76
+ firstname: invite.firstname,
77
+ lastname: invite.lastname,
78
+ language: invite.language,
79
+ roleIds: invite.roles_ids,
80
+ asTenantOwner: invite.asTenantOwner,
81
+ skipEmailValidation: invite.skipEmailValidation,
82
+ extensions: invite.extensions ?? undefined,
83
+ replacementReason: "resent",
84
+ });
85
+ const renewed = await (0, interface_database_decorators_1.GetModel)(db_1.UserInviteModel, tenantId).get(inviteId);
86
+ if (!renewed)
87
+ throw new Error("Renewed invitation was not persisted");
88
+ return renewed;
89
+ }
90
+ async function workspaceNameOf(tenantId) {
91
+ const tenant = await (0, interface_database_decorators_1.GetModel)(db_1.TenantModel).get(tenantId);
92
+ return tenant?.name || undefined;
93
+ }
94
+ async function resendInvitation(tenantId, inviteId, inviterName) {
95
+ const invite = await renewInvite(tenantId, await loadActionableInvite(tenantId, inviteId));
96
+ const emailDelivery = await deliverInvitationEmail(invite, {
97
+ workspaceName: await workspaceNameOf(tenantId),
98
+ inviterName,
99
+ });
100
+ return { invite, emailDelivery };
101
+ }
102
+ async function resolveInvitationLink(tenantId, inviteId) {
103
+ const stored = await loadActionableInvite(tenantId, inviteId);
104
+ const invite = invitationStatusOf(stored) === "pending"
105
+ ? stored
106
+ : await renewInvite(tenantId, stored);
107
+ return {
108
+ link: await buildInvitationLink(invite),
109
+ expiresAt: invite.expiresAt,
110
+ };
111
+ }
112
+ //# sourceMappingURL=invitations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invitations.js","sourceRoot":"","sources":["../../src/workspaces/invitations.ts"],"names":[],"mappings":"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"}
@@ -11,13 +11,12 @@ export interface WorkspaceBillingProfile {
11
11
  export interface WorkspaceProvisioningPayload extends WorkspaceBillingProfile {
12
12
  workspaceName: string;
13
13
  planId: string;
14
- paymentMethodId: string;
14
+ paymentMethodId?: string;
15
15
  extras?: Record<string, unknown>;
16
16
  }
17
17
  export interface StripeCustomerProfile extends WorkspaceBillingProfile {
18
18
  email: string;
19
19
  fallbackName: string;
20
- paymentMethodId: string;
21
20
  }
22
21
  export interface WorkspaceProvisioningHandles {
23
22
  mustPreserveWorkspace?: boolean;
@@ -45,5 +44,6 @@ export interface ProvisionedWorkspace {
45
44
  }
46
45
  export declare function assertBillingCountry(address: WorkspaceAddressInput | undefined): void;
47
46
  export declare function ensurePlanIsAvailableForCustomer(planId: string, customerType: WorkspaceCustomerType): Promise<Plan>;
48
- export declare function resolveCardDetails(paymentMethodId: string): Promise<CardDetails>;
47
+ export declare function resolveCardDetails(paymentMethodId: string | undefined): Promise<CardDetails>;
48
+ export declare function resolveRegistrationPlan(): Promise<Plan>;
49
49
  export declare function provisionWorkspace(input: WorkspaceProvisioningInput): Promise<ProvisionedWorkspace>;
@@ -4,6 +4,7 @@ exports.rollbackWorkspaceProvisioning = void 0;
4
4
  exports.assertBillingCountry = assertBillingCountry;
5
5
  exports.ensurePlanIsAvailableForCustomer = ensurePlanIsAvailableForCustomer;
6
6
  exports.resolveCardDetails = resolveCardDetails;
7
+ exports.resolveRegistrationPlan = resolveRegistrationPlan;
7
8
  exports.provisionWorkspace = provisionWorkspace;
8
9
  const interface_api_util_1 = require("@antelopejs/interface-api-util");
9
10
  const interface_database_decorators_1 = require("@antelopejs/interface-database-decorators");
@@ -17,11 +18,14 @@ const tenant_provisioning_1 = require("../hooks/tenant-provisioning");
17
18
  const lifecycle_outbox_1 = require("../operator-actions/lifecycle-outbox");
18
19
  const stripe_1 = require("../stripe");
19
20
  const utils_1 = require("../utils");
21
+ const default_plan_1 = require("./default-plan");
22
+ const free_workspace_guard_1 = require("./free-workspace-guard");
20
23
  const provisioning_state_1 = require("./provisioning-state");
21
24
  var provisioning_rollback_1 = require("./provisioning-rollback");
22
25
  Object.defineProperty(exports, "rollbackWorkspaceProvisioning", { enumerable: true, get: function () { return provisioning_rollback_1.rollbackWorkspaceProvisioning; } });
23
26
  const HTTP_BAD_REQUEST = 400;
24
27
  const HTTP_NOT_FOUND = 404;
28
+ const HTTP_CONFLICT = 409;
25
29
  const ACTIVE_STATUS = "active";
26
30
  const TRIALING_STATUS = "trialing";
27
31
  const SEAT_BILLING_INITIAL_QUANTITY = 1;
@@ -34,7 +38,20 @@ async function ensurePlanIsAvailableForCustomer(planId, customerType) {
34
38
  (0, interface_api_util_1.assert)(plan.audience === "any" || plan.audience === customerType, HTTP_BAD_REQUEST, "saas.errors.plan.not_available_for_customer_type");
35
39
  return plan;
36
40
  }
41
+ const NO_CARD = { fingerprint: null, billingAddress: undefined };
42
+ const CARDLESS_BILLING = {
43
+ stripeCustomerId: null,
44
+ subscription: {
45
+ stripeSubscriptionId: null,
46
+ startedAt: null,
47
+ isTrialing: false,
48
+ currentPeriodEnd: null,
49
+ latestInvoiceId: null,
50
+ },
51
+ };
37
52
  async function resolveCardDetails(paymentMethodId) {
53
+ if (!paymentMethodId)
54
+ return NO_CARD;
38
55
  const stripe = (0, stripe_1.getStripeClient)();
39
56
  const paymentMethod = await stripe.paymentMethods.retrieve(paymentMethodId);
40
57
  const address = paymentMethod.billing_details?.address;
@@ -52,7 +69,12 @@ async function resolveCardDetails(paymentMethodId) {
52
69
  : undefined,
53
70
  };
54
71
  }
55
- async function createStripeCustomer(profile, handles) {
72
+ async function resolveRegistrationPlan() {
73
+ const freePlan = await (0, default_plan_1.resolveDefaultPlan)();
74
+ (0, interface_api_util_1.assert)(freePlan, HTTP_CONFLICT, "saas.errors.plan.no_free_plan");
75
+ return freePlan;
76
+ }
77
+ async function createStripeCustomer(profile, paymentMethodId, handles) {
56
78
  const stripe = (0, stripe_1.getStripeClient)();
57
79
  const metadata = {
58
80
  customerType: profile.customerType,
@@ -70,11 +92,11 @@ async function createStripeCustomer(profile, handles) {
70
92
  }, { idempotencyKey: `provisioning-customer:${handles.tenantId}` });
71
93
  handles.stripeCustomerId = customer.id;
72
94
  await (0, provisioning_state_1.recordProvisioningState)(handles);
73
- await stripe.paymentMethods.attach(profile.paymentMethodId, {
95
+ await stripe.paymentMethods.attach(paymentMethodId, {
74
96
  customer: customer.id,
75
97
  });
76
98
  await stripe.customers.update(customer.id, {
77
- invoice_settings: { default_payment_method: profile.paymentMethodId },
99
+ invoice_settings: { default_payment_method: paymentMethodId },
78
100
  });
79
101
  await (0, stripe_1.reconcileStripeTaxId)(customer.id, {
80
102
  customerType: profile.customerType,
@@ -129,6 +151,7 @@ async function createSubscription(input) {
129
151
  handles.mustPreserveWorkspace = false;
130
152
  return {
131
153
  stripeSubscriptionId: subscription.id,
154
+ startedAt: (0, utils_1.stripeSecondsToDate)(subscription.start_date) ?? new Date(),
132
155
  isTrialing: grantTrial,
133
156
  currentPeriodEnd: (0, utils_1.stripeSecondsToDate)(subscription.current_period_end),
134
157
  latestInvoiceId: typeof subscription.latest_invoice === "string"
@@ -163,6 +186,12 @@ async function settleSubscriptionPayment(subscription, tenantId, handles) {
163
186
  throw error;
164
187
  }
165
188
  }
189
+ function initialPaidUsagePeriods(subscription) {
190
+ const { stripeSubscriptionId, startedAt } = subscription;
191
+ if (!stripeSubscriptionId || !startedAt)
192
+ return [];
193
+ return [{ stripeSubscriptionId, start: startedAt, end: null }];
194
+ }
166
195
  async function insertTenantRecords(input) {
167
196
  const { tenantId, payload, subscription } = input;
168
197
  const tenantSubscriptionModel = (0, interface_database_decorators_1.GetModel)(db_3.TenantSubscriptionModel, tenantId);
@@ -171,6 +200,8 @@ async function insertTenantRecords(input) {
171
200
  {
172
201
  planId: payload.planId,
173
202
  status: subscription.isTrialing ? TRIALING_STATUS : ACTIVE_STATUS,
203
+ isComplimentary: false,
204
+ paidUsagePeriods: initialPaidUsagePeriods(subscription),
174
205
  stripeCustomerId: input.stripeCustomerId,
175
206
  stripeSubscriptionId: subscription.stripeSubscriptionId,
176
207
  currentPeriodEnd: subscription.currentPeriodEnd,
@@ -216,6 +247,7 @@ async function createOwnedTenant(workspaceName, userId, handles) {
216
247
  async function provisionWorkspace(input) {
217
248
  const plan = await (0, interface_database_decorators_1.GetModel)(db_3.PlanModel).get(input.payload.planId);
218
249
  (0, interface_api_util_1.assert)(plan, HTTP_NOT_FOUND, "saas.errors.plan.not_available");
250
+ (0, interface_api_util_1.assert)(input.payload.paymentMethodId || (0, free_workspace_guard_1.isFreePlan)(plan), HTTP_BAD_REQUEST, "saas.errors.workspace.payment_method_required");
219
251
  await (0, provisioning_state_1.beginProvisioningAttempt)(input, plan);
220
252
  try {
221
253
  const provisioned = await runProvisioning(input);
@@ -227,20 +259,26 @@ async function provisionWorkspace(input) {
227
259
  throw error;
228
260
  }
229
261
  }
230
- async function runProvisioning(input) {
231
- const { userId, payload, stripeCustomerProfile, card, handles } = input;
232
- const plan = await (0, interface_database_decorators_1.GetModel)(db_3.PlanModel).get(payload.planId);
233
- (0, interface_api_util_1.assert)(plan, HTTP_NOT_FOUND, "saas.errors.plan.not_available");
234
- const stripeCustomerId = await createStripeCustomer(stripeCustomerProfile, handles);
262
+ async function provisionStripeBilling(input, plan, paymentMethodId) {
263
+ const { stripeCustomerProfile, handles } = input;
264
+ const stripeCustomerId = await createStripeCustomer(stripeCustomerProfile, paymentMethodId, handles);
235
265
  const subscription = await createSubscription({
236
266
  stripeCustomerId,
237
267
  plan,
238
- userId,
268
+ userId: input.userId,
239
269
  email: stripeCustomerProfile.email,
240
- cardFingerprint: card.fingerprint,
270
+ cardFingerprint: input.card.fingerprint,
241
271
  handles,
242
272
  });
243
- handles.stripeSubscriptionId = subscription.stripeSubscriptionId;
273
+ return { stripeCustomerId, subscription };
274
+ }
275
+ async function runProvisioning(input) {
276
+ const { userId, payload, stripeCustomerProfile, card, handles } = input;
277
+ const plan = await (0, interface_database_decorators_1.GetModel)(db_3.PlanModel).get(payload.planId);
278
+ (0, interface_api_util_1.assert)(plan, HTTP_NOT_FOUND, "saas.errors.plan.not_available");
279
+ const { stripeCustomerId, subscription } = payload.paymentMethodId
280
+ ? await provisionStripeBilling(input, plan, payload.paymentMethodId)
281
+ : CARDLESS_BILLING;
244
282
  const tenantId = await createOwnedTenant(payload.workspaceName, userId, handles);
245
283
  await (0, tenant_lifecycle_1.runTenantLifecycleOperation)(tenantId, () => insertTenantRecords({
246
284
  tenantId,
@@ -1 +1 @@
1
- {"version":3,"file":"provisioning.js","sourceRoot":"","sources":["../../src/workspaces/provisioning.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"provisioning.js","sourceRoot":"","sources":["../../src/workspaces/provisioning.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,179 @@
1
+ <script setup lang="ts">
2
+ import { computed } from "vue";
3
+
4
+ type VatBadgeColor = "success" | "warning";
5
+
6
+ const props = defineProps<{
7
+ /** Fields flagged after a submit attempt. */
8
+ invalidFields?: BillingIdentityField[];
9
+ vatVerificationStatus?: VatVerificationStatus | null;
10
+ isLocked?: boolean;
11
+ }>();
12
+
13
+ const draft = defineModel<BillingIdentityDraft>({ required: true });
14
+
15
+ const CUSTOMER_TYPES: CustomerType[] = ["business", "individual"];
16
+ const VAT_BADGE_COLORS: Record<VatVerificationStatus, VatBadgeColor> = {
17
+ verified: "success",
18
+ pending: "warning",
19
+ unverified: "warning",
20
+ };
21
+ const FIELD_KEY_PREFIX = "saas.workspace.billing.identity";
22
+
23
+ const { countryItems } = useBillingCountries();
24
+ const { t } = useI18n();
25
+
26
+ const isBusiness = computed(() => draft.value.customerType === "business");
27
+
28
+ function fieldError(field: BillingIdentityField): string | undefined {
29
+ return props.invalidFields?.includes(field)
30
+ ? t(`${FIELD_KEY_PREFIX}.errors.${field}`)
31
+ : undefined;
32
+ }
33
+
34
+ function selectCustomerType(customerType: CustomerType): void {
35
+ if (props.isLocked) return;
36
+ draft.value = { ...draft.value, customerType };
37
+ }
38
+ </script>
39
+
40
+ <template>
41
+ <div class="flex flex-col gap-4">
42
+ <UFormField
43
+ :label="$t('saas.register.customer_type.label')"
44
+ :error="fieldError('customerType')"
45
+ >
46
+ <div
47
+ role="radiogroup"
48
+ :aria-label="$t('saas.register.customer_type.label')"
49
+ class="grid gap-2 sm:grid-cols-2"
50
+ >
51
+ <button
52
+ v-for="customerType in CUSTOMER_TYPES"
53
+ :key="customerType"
54
+ type="button"
55
+ role="radio"
56
+ :aria-checked="draft.customerType === customerType"
57
+ :disabled="isLocked"
58
+ class="rounded-lg border p-3 text-left transition-colors disabled:cursor-default"
59
+ :class="
60
+ draft.customerType === customerType
61
+ ? 'border-primary bg-primary/5'
62
+ : 'border-default hover:bg-elevated/50'
63
+ "
64
+ @click="selectCustomerType(customerType)"
65
+ >
66
+ <span class="block text-sm font-medium">
67
+ {{ $t(`saas.register.customer_type.${customerType}`) }}
68
+ </span>
69
+ <span class="text-muted block text-xs">
70
+ {{ $t(`${FIELD_KEY_PREFIX}.customer_type_hint.${customerType}`) }}
71
+ </span>
72
+ </button>
73
+ </div>
74
+ </UFormField>
75
+
76
+ <template v-if="isBusiness">
77
+ <UFormField
78
+ :label="$t('saas.register.field.company_name')"
79
+ :error="fieldError('companyName')"
80
+ required
81
+ >
82
+ <UInput
83
+ v-model="draft.companyName"
84
+ autocomplete="organization"
85
+ :disabled="isLocked"
86
+ class="w-full"
87
+ />
88
+ </UFormField>
89
+ <UFormField
90
+ :label="$t('saas.register.field.vat_number')"
91
+ :hint="$t(`${FIELD_KEY_PREFIX}.optional`)"
92
+ >
93
+ <div class="flex flex-wrap items-center gap-2">
94
+ <UInput
95
+ v-model="draft.vatNumber"
96
+ :disabled="isLocked"
97
+ class="min-w-40 grow"
98
+ />
99
+ <UBadge
100
+ v-if="vatVerificationStatus"
101
+ :color="VAT_BADGE_COLORS[vatVerificationStatus]"
102
+ variant="subtle"
103
+ >
104
+ {{ $t(`saas.workspace.billing.vat.${vatVerificationStatus}`) }}
105
+ </UBadge>
106
+ </div>
107
+ </UFormField>
108
+ </template>
109
+
110
+ <h4 class="font-semibold">{{ $t("saas.register.billing_address") }}</h4>
111
+ <UFormField
112
+ :label="$t('saas.register.field.country')"
113
+ :error="fieldError('country')"
114
+ required
115
+ >
116
+ <USelectMenu
117
+ v-model="draft.country"
118
+ :items="countryItems"
119
+ value-key="value"
120
+ :disabled="isLocked"
121
+ :placeholder="$t(`${FIELD_KEY_PREFIX}.country_placeholder`)"
122
+ class="w-full"
123
+ />
124
+ </UFormField>
125
+ <UFormField
126
+ :label="$t('saas.register.field.address_line1')"
127
+ :error="fieldError('line1')"
128
+ required
129
+ >
130
+ <UInput
131
+ v-model="draft.line1"
132
+ autocomplete="address-line1"
133
+ :disabled="isLocked"
134
+ class="w-full"
135
+ />
136
+ </UFormField>
137
+ <div class="grid gap-4 sm:grid-cols-2">
138
+ <UFormField
139
+ :label="$t('saas.register.field.postal_code')"
140
+ :error="fieldError('postalCode')"
141
+ required
142
+ >
143
+ <UInput
144
+ v-model="draft.postalCode"
145
+ autocomplete="postal-code"
146
+ :disabled="isLocked"
147
+ class="w-full"
148
+ />
149
+ </UFormField>
150
+ <UFormField
151
+ :label="$t('saas.register.field.city')"
152
+ :error="fieldError('city')"
153
+ required
154
+ >
155
+ <UInput
156
+ v-model="draft.city"
157
+ autocomplete="address-level2"
158
+ :disabled="isLocked"
159
+ class="w-full"
160
+ />
161
+ </UFormField>
162
+ </div>
163
+
164
+ <UFormField
165
+ :label="$t('saas.workspace.billing.billing_email.label')"
166
+ :description="$t('saas.workspace.billing.billing_email.hint')"
167
+ :error="fieldError('billingEmail')"
168
+ required
169
+ >
170
+ <UInput
171
+ v-model="draft.billingEmail"
172
+ type="email"
173
+ autocomplete="email"
174
+ :disabled="isLocked"
175
+ class="w-full"
176
+ />
177
+ </UFormField>
178
+ </div>
179
+ </template>
@@ -0,0 +1,81 @@
1
+ <script setup lang="ts">
2
+ import { computed, onMounted } from "vue";
3
+
4
+ const KEY_PREFIX = "saas.workspace.billing.past_due.banner";
5
+ const BILLING_PATH = "/settings/workspace/billing";
6
+ const DEADLINE_FORMAT: Intl.DateTimeFormatOptions = {
7
+ day: "numeric",
8
+ month: "long",
9
+ };
10
+
11
+ // Rendered as the content of the DMS layout banner registered server-side
12
+ // (see registerPastDueBanner), which already decided it shows and draws the
13
+ // alert chrome, icon and role around it.
14
+ const { data, load } = useBillingStatus();
15
+ const { formatMinorUnits } = useMoneyFormat();
16
+ const { t, locale } = useI18n();
17
+
18
+ // Owner-only in the API payload: a member gets the generic line and no
19
+ // settle button, the owner pays.
20
+ const invoice = computed(() => data.value?.unpaidInvoice ?? null);
21
+ const action = computed(() => resolvePastDueBannerAction(data.value));
22
+
23
+ // Without the invoice details the owner still has to be told where to act,
24
+ // while a member is only told who does.
25
+ const genericMessage = computed(() =>
26
+ data.value?.isTenantOwner
27
+ ? t(`${KEY_PREFIX}.generic_owner`)
28
+ : t(`${KEY_PREFIX}.generic`),
29
+ );
30
+
31
+ const message = computed(() => {
32
+ if (!invoice.value) return genericMessage.value;
33
+ const amount = formatMinorUnits(invoice.value.amount, invoice.value.currency);
34
+ const subject = { invoice: invoice.value.number ?? amount, amount };
35
+ const suspendOn = formatDate(
36
+ invoice.value.suspendAt,
37
+ locale.value,
38
+ DEADLINE_FORMAT,
39
+ );
40
+ return suspendOn
41
+ ? t(`${KEY_PREFIX}.with_deadline`, { ...subject, date: suspendOn })
42
+ : t(`${KEY_PREFIX}.summary`, subject);
43
+ });
44
+
45
+ function settle(): void {
46
+ const url = invoice.value?.hostedInvoiceUrl;
47
+ if (!url || typeof window === "undefined") return;
48
+ window.open(url, "_blank", "noopener");
49
+ }
50
+
51
+ onMounted(load);
52
+ </script>
53
+
54
+ <template>
55
+ <div
56
+ data-saas-past-due-banner
57
+ class="flex flex-wrap items-center gap-x-3 gap-y-2"
58
+ >
59
+ <p class="min-w-0 grow">{{ message }}</p>
60
+ <UButton
61
+ v-if="action === 'settle'"
62
+ size="sm"
63
+ color="error"
64
+ variant="outline"
65
+ trailing-icon="i-ph-arrow-square-out"
66
+ @click="settle"
67
+ >
68
+ {{ $t(`${KEY_PREFIX}.settle`) }}
69
+ </UButton>
70
+ <UButton
71
+ v-else-if="action === 'open_billing'"
72
+ size="sm"
73
+ color="error"
74
+ variant="outline"
75
+ trailing-icon="i-ph-arrow-right"
76
+ :to="BILLING_PATH"
77
+ >
78
+ {{ $t(`${KEY_PREFIX}.open_billing`) }}
79
+ </UButton>
80
+ </div>
81
+ </template>