feat: Payment system with voucher cards.

feat: Design with inversion dependency injection architecture.
feat: Prettier http middleware.
feat: Re-write items categories with preferred accounts.
This commit is contained in:
Ahmed Bouhuolia
2020-08-27 20:39:55 +02:00
parent e23b8d9947
commit e4270dc039
63 changed files with 2567 additions and 462 deletions

View File

@@ -1,4 +1,6 @@
import BaseModel from '@/models/Model';
import { Model } from 'objection';
import SubscriptionPeriod from '@/services/Subscription/SubscriptionPeriod';
export default class Tenant extends BaseModel {
/**
@@ -7,4 +9,63 @@ export default class Tenant extends BaseModel {
static get tableName() {
return 'tenants';
}
/**
* Query modifiers.
*/
static modifiers() {
return {
subscriptions(builder) {
builder.withGraphFetched('subscriptions');
},
};
}
/**
* Relations mappings.
*/
static get relationMappings() {
const PlanSubscription = require('./Subscriptions/PlanSubscription');
return {
subscriptions: {
relation: Model.HasManyRelation,
modelClass: this.relationBindKnex(PlanSubscription.default),
join: {
from: 'tenants.id',
to: 'subscription_plan_subscriptions.tenantId',
}
},
}
}
/**
* Retrieve the subscribed plans ids.
* @return {number[]}
*/
async subscribedPlansIds() {
const { subscriptions } = this;
return chain(subscriptions).map('planId').unq();
}
/**
* Records a new subscription for the associated tenant.
* @param {string} subscriptionSlug
* @param {IPlan} plan
*/
newSubscription(subscriptionSlug, plan) {
const trial = new SubscriptionPeriod(plan.trialInterval, plan.trialPeriod)
const period = new SubscriptionPeriod(plan.invoiceInterval, plan.invoicePeriod, trial.getEndDate());
return this.$relatedQuery('subscriptions').insert({
slug: subscriptionSlug,
planId: plan.id,
trialStartedAt: trial.getStartDate(),
trialEndsAt: trial.getEndDate(),
startsAt: period.getStartDate(),
endsAt: period.getEndDate(),
});
}
}