Files
speckle-server/packages/server/modules/gatekeeperCore/domain/billing.ts
T
Gergő Jedlicska 5b0bb3b65d gergo/web 2635 set up new plans in the backend (#4031)
* feat(gatekeeper): add new free plan option as an unpaid workspace plan

* feat(workspaces): add feature flag for new plans

* feat(gatekeeper): add free plan option to workspace plans

* Added button in FE

* Make button more beautifuller

* feat(gatekeeper): enable creating workspaces on a free plan

* Fix

* Fix FE linting

---------

Co-authored-by: Mike Tasset <mike.tasset@gmail.com>
2025-02-21 14:49:04 +01:00

89 lines
2.3 KiB
TypeScript

import { z } from 'zod'
// team
export const trialWorkspacePlans = z.literal('starter')
export type TrialWorkspacePlans = z.infer<typeof trialWorkspacePlans>
export const paidWorkspacePlans = z.union([
trialWorkspacePlans,
// pro
z.literal('plus'),
z.literal('business')
])
// new plan stuff below
export const paidWorkspacePlansNew = z.union([
z.literal('ottoman'),
z.literal('habsburg')
])
export type PaidWorkspacePlansNew = z.infer<typeof paidWorkspacePlansNew>
export type PaidWorkspacePlans = z.infer<typeof paidWorkspacePlans>
// these are not publicly exposed for general use on billing enabled servers
export const unpaidWorkspacePlans = z.union([
z.literal('free'),
z.literal('unlimited'),
z.literal('academia'),
z.literal('starterInvoiced'),
z.literal('plusInvoiced'),
z.literal('businessInvoiced')
])
export type UnpaidWorkspacePlans = z.infer<typeof unpaidWorkspacePlans>
export const workspacePlans = z.union([paidWorkspacePlans, unpaidWorkspacePlans])
// this includes the plans your workspace can be on
export type WorkspacePlans = z.infer<typeof workspacePlans>
// this includes the pricing plans a customer can sub to
export type WorkspacePricingPlans = PaidWorkspacePlans | 'guest'
export const workspacePlanBillingIntervals = z.union([
z.literal('monthly'),
z.literal('yearly')
])
export type WorkspacePlanBillingIntervals = z.infer<
typeof workspacePlanBillingIntervals
>
export type UnpaidWorkspacePlanStatuses = 'valid'
export type PaidWorkspacePlanStatuses =
| UnpaidWorkspacePlanStatuses
// | 'paymentNeeded' // unsure if this is needed
| 'paymentFailed'
| 'cancelationScheduled'
| 'canceled'
export type TrialWorkspacePlanStatuses = 'trial' | 'expired'
export type PlanStatuses =
| PaidWorkspacePlanStatuses
| TrialWorkspacePlanStatuses
| UnpaidWorkspacePlanStatuses
type BaseWorkspacePlan = {
workspaceId: string
createdAt: Date
}
export type PaidWorkspacePlan = BaseWorkspacePlan & {
name: PaidWorkspacePlans
status: PaidWorkspacePlanStatuses
}
export type TrialWorkspacePlan = BaseWorkspacePlan & {
name: TrialWorkspacePlans
status: TrialWorkspacePlanStatuses
}
export type UnpaidWorkspacePlan = BaseWorkspacePlan & {
name: UnpaidWorkspacePlans
status: UnpaidWorkspacePlanStatuses
}
export type WorkspacePlan = PaidWorkspacePlan | TrialWorkspacePlan | UnpaidWorkspacePlan