mirror of
https://github.com/bigcapitalhq/bigcapital.git
synced 2026-02-14 11:50:31 +00:00
53 lines
1.7 KiB
TypeScript
53 lines
1.7 KiB
TypeScript
import { Service } from 'typedi';
|
|
import { NotAllowedChangeSubscriptionPlan } from '@/exceptions';
|
|
import { Plan, Tenant } from '@/system/models';
|
|
|
|
@Service()
|
|
export class Subscription {
|
|
/**
|
|
* Give the tenant a new subscription.
|
|
* @param {number} tenantId - Tenant id.
|
|
* @param {string} planSlug - Plan slug.
|
|
* @param {string} invoiceInterval
|
|
* @param {number} invoicePeriod
|
|
* @param {string} subscriptionSlug
|
|
*/
|
|
public async newSubscribtion(
|
|
tenantId: number,
|
|
planSlug: string,
|
|
subscriptionSlug: string = 'main'
|
|
) {
|
|
const tenant = await Tenant.query().findById(tenantId).throwIfNotFound();
|
|
const plan = await Plan.query().findOne('slug', planSlug).throwIfNotFound();
|
|
|
|
const isFree = plan.price === 0;
|
|
|
|
// Take the invoice interval and period from the given plan.
|
|
const invoiceInterval = plan.invoiceInternal;
|
|
const invoicePeriod = isFree ? Infinity : plan.invoicePeriod;
|
|
|
|
const subscription = await tenant
|
|
.$relatedQuery('subscriptions')
|
|
.modify('subscriptionBySlug', subscriptionSlug)
|
|
.first();
|
|
|
|
// No allowed to re-new the the subscription while the subscription is active.
|
|
if (subscription && subscription.active()) {
|
|
throw new NotAllowedChangeSubscriptionPlan();
|
|
|
|
// In case there is already subscription associated to the given tenant renew it.
|
|
} else if (subscription && subscription.inactive()) {
|
|
await subscription.renew(invoiceInterval, invoicePeriod);
|
|
|
|
// No stored past tenant subscriptions create new one.
|
|
} else {
|
|
await tenant.newSubscription(
|
|
plan.id,
|
|
invoiceInterval,
|
|
invoicePeriod,
|
|
subscriptionSlug
|
|
);
|
|
}
|
|
}
|
|
}
|