mirror of
https://github.com/bigcapitalhq/bigcapital.git
synced 2026-02-19 14:20:31 +00:00
refactor: tenant proxy providers
This commit is contained in:
@@ -2,12 +2,16 @@ import { Inject, Injectable } from '@nestjs/common';
|
||||
import { keyBy, sumBy } from 'lodash';
|
||||
import { ItemEntry } from '@/modules/TransactionItemEntry/models/ItemEntry';
|
||||
import { TaxRateModel } from './models/TaxRate.model';
|
||||
import { TenantModelProxy } from '../System/models/TenantBaseModel';
|
||||
|
||||
@Injectable()
|
||||
export class ItemEntriesTaxTransactions {
|
||||
constructor(
|
||||
@Inject(ItemEntry.name) private itemEntryModel: typeof ItemEntry,
|
||||
@Inject(TaxRateModel.name) private taxRateModel: typeof TaxRateModel,
|
||||
@Inject(ItemEntry.name)
|
||||
private itemEntryModel: TenantModelProxy<typeof ItemEntry>,
|
||||
|
||||
@Inject(TaxRateModel.name)
|
||||
private taxRateModel: TenantModelProxy<typeof TaxRateModel>,
|
||||
) {}
|
||||
|
||||
/**
|
||||
@@ -17,7 +21,7 @@ export class ItemEntriesTaxTransactions {
|
||||
*/
|
||||
public assocTaxAmountWithheldFromEntries = (model: any) => {
|
||||
const entries = model.entries.map((entry) =>
|
||||
this.itemEntryModel.fromJson(entry),
|
||||
this.itemEntryModel().fromJson(entry),
|
||||
);
|
||||
const taxAmountWithheld = sumBy(entries, 'taxAmount');
|
||||
|
||||
@@ -25,47 +29,47 @@ export class ItemEntriesTaxTransactions {
|
||||
model.taxAmountWithheld = taxAmountWithheld;
|
||||
}
|
||||
return model;
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Associates tax rate id from tax code to entries.
|
||||
* @param {any} entries
|
||||
*/
|
||||
public assocTaxRateIdFromCodeToEntries = async (entries: any) => {
|
||||
const entriesWithCode = entries.filter((entry) => entry.taxCode);
|
||||
const taxCodes = entriesWithCode.map((entry) => entry.taxCode);
|
||||
const foundTaxCodes = await this.taxRateModel
|
||||
.query()
|
||||
.whereIn('code', taxCodes);
|
||||
const entriesWithCode = entries.filter((entry) => entry.taxCode);
|
||||
const taxCodes = entriesWithCode.map((entry) => entry.taxCode);
|
||||
const foundTaxCodes = await this.taxRateModel()
|
||||
.query()
|
||||
.whereIn('code', taxCodes);
|
||||
|
||||
const taxCodesMap = keyBy(foundTaxCodes, 'code');
|
||||
const taxCodesMap = keyBy(foundTaxCodes, 'code');
|
||||
|
||||
return entries.map((entry) => {
|
||||
if (entry.taxCode) {
|
||||
entry.taxRateId = taxCodesMap[entry.taxCode]?.id;
|
||||
}
|
||||
return entry;
|
||||
});
|
||||
};
|
||||
return entries.map((entry) => {
|
||||
if (entry.taxCode) {
|
||||
entry.taxRateId = taxCodesMap[entry.taxCode]?.id;
|
||||
}
|
||||
return entry;
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* Associates tax rate from tax id to entries.
|
||||
* @returns {Promise<ItemEntry[]>}
|
||||
*/
|
||||
public assocTaxRateFromTaxIdToEntries = async (entries: ItemEntry[]) => {
|
||||
const entriesWithId = entries.filter((e) => e.taxRateId);
|
||||
const taxRateIds = entriesWithId.map((e) => e.taxRateId);
|
||||
const foundTaxes = await this.taxRateModel
|
||||
.query()
|
||||
.whereIn('id', taxRateIds);
|
||||
const entriesWithId = entries.filter((e) => e.taxRateId);
|
||||
const taxRateIds = entriesWithId.map((e) => e.taxRateId);
|
||||
const foundTaxes = await this.taxRateModel()
|
||||
.query()
|
||||
.whereIn('id', taxRateIds);
|
||||
|
||||
const taxRatesMap = keyBy(foundTaxes, 'id');
|
||||
const taxRatesMap = keyBy(foundTaxes, 'id');
|
||||
|
||||
return entries.map((entry) => {
|
||||
if (entry.taxRateId) {
|
||||
entry.taxRate = taxRatesMap[entry.taxRateId]?.rate;
|
||||
}
|
||||
return entry;
|
||||
});
|
||||
};
|
||||
return entries.map((entry) => {
|
||||
if (entry.taxRateId) {
|
||||
entry.taxRate = taxRatesMap[entry.taxRateId]?.rate;
|
||||
}
|
||||
return entry;
|
||||
});
|
||||
};
|
||||
}
|
||||
|
||||
@@ -9,6 +9,7 @@ import { EventEmitter2 } from '@nestjs/event-emitter';
|
||||
import { UnitOfWork } from '@/modules/Tenancy/TenancyDB/UnitOfWork.service';
|
||||
import { TaxRateModel } from '../models/TaxRate.model';
|
||||
import { events } from '@/common/events/events';
|
||||
import { TenantModelProxy } from '@/modules/System/models/TenantBaseModel';
|
||||
|
||||
@Injectable()
|
||||
export class ActivateTaxRateService {
|
||||
@@ -24,7 +25,7 @@ export class ActivateTaxRateService {
|
||||
private readonly validators: CommandTaxRatesValidators,
|
||||
|
||||
@Inject(TaxRateModel.name)
|
||||
private readonly taxRateModel: typeof TaxRateModel,
|
||||
private readonly taxRateModel: TenantModelProxy<typeof TaxRateModel>,
|
||||
) {}
|
||||
|
||||
/**
|
||||
@@ -33,7 +34,7 @@ export class ActivateTaxRateService {
|
||||
* @returns {Promise<ITaxRate>}
|
||||
*/
|
||||
public async activateTaxRate(taxRateId: number) {
|
||||
const oldTaxRate = await this.taxRateModel.query().findById(taxRateId);
|
||||
const oldTaxRate = await this.taxRateModel().query().findById(taxRateId);
|
||||
|
||||
// Validates the tax rate existance.
|
||||
this.validators.validateTaxRateExistance(oldTaxRate);
|
||||
@@ -48,7 +49,7 @@ export class ActivateTaxRateService {
|
||||
trx,
|
||||
} as ITaxRateActivatingPayload);
|
||||
|
||||
const taxRate = await this.taxRateModel
|
||||
const taxRate = await this.taxRateModel()
|
||||
.query(trx)
|
||||
.findById(taxRateId)
|
||||
.patch({ active: true });
|
||||
|
||||
@@ -6,15 +6,16 @@ import { TaxRateModel } from '../models/TaxRate.model';
|
||||
import { Inject } from '@nestjs/common';
|
||||
import { Injectable } from '@nestjs/common';
|
||||
import { ServiceError } from '@/modules/Items/ServiceError';
|
||||
import { TenantModelProxy } from '@/modules/System/models/TenantBaseModel';
|
||||
|
||||
@Injectable()
|
||||
export class CommandTaxRatesValidators {
|
||||
/**
|
||||
* @param {typeof TaxRateModel} taxRateModel - The tax rate model.
|
||||
* @param {TenantModelProxy<typeof TaxRateModel>} taxRateModel - The tax rate model.
|
||||
*/
|
||||
constructor(
|
||||
@Inject(TaxRateModel.name)
|
||||
private readonly taxRateModel: typeof TaxRateModel,
|
||||
private readonly taxRateModel: TenantModelProxy<typeof TaxRateModel>,
|
||||
) {}
|
||||
|
||||
/**
|
||||
@@ -54,7 +55,7 @@ export class CommandTaxRatesValidators {
|
||||
* @param {Knex.Transaction} trx -
|
||||
*/
|
||||
public async validateTaxCodeUnique(taxCode: string, trx?: Knex.Transaction) {
|
||||
const foundTaxCode = await this.taxRateModel
|
||||
const foundTaxCode = await this.taxRateModel()
|
||||
.query(trx)
|
||||
.findOne({ code: taxCode });
|
||||
|
||||
|
||||
@@ -10,6 +10,7 @@ import { TaxRateModel } from '../models/TaxRate.model';
|
||||
import { UnitOfWork } from '@/modules/Tenancy/TenancyDB/UnitOfWork.service';
|
||||
import { EventEmitter2 } from '@nestjs/event-emitter';
|
||||
import { events } from '@/common/events/events';
|
||||
import { TenantModelProxy } from '@/modules/System/models/TenantBaseModel';
|
||||
|
||||
@Injectable()
|
||||
export class CreateTaxRate {
|
||||
@@ -25,7 +26,7 @@ export class CreateTaxRate {
|
||||
private readonly validators: CommandTaxRatesValidators,
|
||||
|
||||
@Inject(TaxRateModel.name)
|
||||
private readonly taxRateModel: typeof TaxRateModel,
|
||||
private readonly taxRateModel: TenantModelProxy<typeof TaxRateModel>,
|
||||
) {}
|
||||
|
||||
/**
|
||||
@@ -34,36 +35,32 @@ export class CreateTaxRate {
|
||||
*/
|
||||
public async createTaxRate(
|
||||
createTaxRateDTO: ICreateTaxRateDTO,
|
||||
trx?: Knex.Transaction
|
||||
trx?: Knex.Transaction,
|
||||
) {
|
||||
// Validates the tax code uniquiness.
|
||||
await this.validators.validateTaxCodeUnique(
|
||||
createTaxRateDTO.code,
|
||||
trx
|
||||
);
|
||||
await this.validators.validateTaxCodeUnique(createTaxRateDTO.code, trx);
|
||||
|
||||
return this.uow.withTransaction(
|
||||
async (trx: Knex.Transaction) => {
|
||||
// Triggers `onTaxRateCreating` event.
|
||||
await this.eventEmitter.emitAsync(events.taxRates.onCreating, {
|
||||
createTaxRateDTO,
|
||||
trx,
|
||||
} as ITaxRateCreatingPayload);
|
||||
return this.uow.withTransaction(async (trx: Knex.Transaction) => {
|
||||
// Triggers `onTaxRateCreating` event.
|
||||
await this.eventEmitter.emitAsync(events.taxRates.onCreating, {
|
||||
createTaxRateDTO,
|
||||
trx,
|
||||
} as ITaxRateCreatingPayload);
|
||||
|
||||
const taxRate = await this.taxRateModel.query(trx).insertAndFetch({
|
||||
const taxRate = await this.taxRateModel()
|
||||
.query(trx)
|
||||
.insertAndFetch({
|
||||
...createTaxRateDTO,
|
||||
});
|
||||
|
||||
// Triggers `onTaxRateCreated` event.
|
||||
await this.eventEmitter.emitAsync(events.taxRates.onCreated, {
|
||||
createTaxRateDTO,
|
||||
taxRate,
|
||||
trx,
|
||||
} as ITaxRateCreatedPayload);
|
||||
// Triggers `onTaxRateCreated` event.
|
||||
await this.eventEmitter.emitAsync(events.taxRates.onCreated, {
|
||||
createTaxRateDTO,
|
||||
taxRate,
|
||||
trx,
|
||||
} as ITaxRateCreatedPayload);
|
||||
|
||||
return taxRate;
|
||||
},
|
||||
trx
|
||||
);
|
||||
return taxRate;
|
||||
}, trx);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,6 +9,7 @@ import { TaxRateModel } from '../models/TaxRate.model';
|
||||
import { EventEmitter2 } from '@nestjs/event-emitter';
|
||||
import { UnitOfWork } from '@/modules/Tenancy/TenancyDB/UnitOfWork.service';
|
||||
import { events } from '@/common/events/events';
|
||||
import { TenantModelProxy } from '@/modules/System/models/TenantBaseModel';
|
||||
|
||||
@Injectable()
|
||||
export class DeleteTaxRateService {
|
||||
@@ -24,7 +25,7 @@ export class DeleteTaxRateService {
|
||||
private readonly validators: CommandTaxRatesValidators,
|
||||
|
||||
@Inject(TaxRateModel.name)
|
||||
private readonly taxRateModel: typeof TaxRateModel,
|
||||
private readonly taxRateModel: TenantModelProxy<typeof TaxRateModel>,
|
||||
) {}
|
||||
|
||||
/**
|
||||
@@ -33,7 +34,7 @@ export class DeleteTaxRateService {
|
||||
* @returns {Promise<void>}
|
||||
*/
|
||||
public async deleteTaxRate(taxRateId: number): Promise<void> {
|
||||
const oldTaxRate = await this.taxRateModel.query().findById(taxRateId);
|
||||
const oldTaxRate = await this.taxRateModel().query().findById(taxRateId);
|
||||
|
||||
// Validates the tax rate existance.
|
||||
this.validators.validateTaxRateExistance(oldTaxRate);
|
||||
@@ -45,7 +46,7 @@ export class DeleteTaxRateService {
|
||||
trx,
|
||||
} as ITaxRateDeletingPayload);
|
||||
|
||||
await this.taxRateModel.query(trx).findById(taxRateId).delete();
|
||||
await this.taxRateModel().query(trx).findById(taxRateId).delete();
|
||||
|
||||
// Triggers `onTaxRateDeleted` event.
|
||||
await this.eventEmitter.emitAsync(events.taxRates.onDeleted, {
|
||||
|
||||
@@ -11,6 +11,7 @@ import { TaxRateModel } from '../models/TaxRate.model';
|
||||
import { UnitOfWork } from '@/modules/Tenancy/TenancyDB/UnitOfWork.service';
|
||||
import { events } from '@/common/events/events';
|
||||
import { EventEmitter2 } from '@nestjs/event-emitter';
|
||||
import { TenantModelProxy } from '@/modules/System/models/TenantBaseModel';
|
||||
|
||||
@Injectable()
|
||||
export class EditTaxRateService {
|
||||
@@ -18,7 +19,7 @@ export class EditTaxRateService {
|
||||
* @param {EventEmitter2} eventEmitter - The event emitter.
|
||||
* @param {UnitOfWork} uow - The unit of work.
|
||||
* @param {CommandTaxRatesValidators} validators - The tax rates validators.
|
||||
* @param {typeof TaxRateModel} taxRateModel - The tax rate model.
|
||||
* @param {TenantModelProxy<typeof TaxRateModel>} taxRateModel - The tax rate model.
|
||||
*/
|
||||
constructor(
|
||||
private readonly eventEmitter: EventEmitter2,
|
||||
@@ -26,18 +27,18 @@ export class EditTaxRateService {
|
||||
private readonly validators: CommandTaxRatesValidators,
|
||||
|
||||
@Inject(TaxRateModel.name)
|
||||
private readonly taxRateModel: typeof TaxRateModel,
|
||||
private readonly taxRateModel: TenantModelProxy<typeof TaxRateModel>,
|
||||
) {}
|
||||
|
||||
/**
|
||||
* Detarmines whether the tax rate, name or code have been changed.
|
||||
* Determines whether the tax rate, name or code have been changed.
|
||||
* @param {ITaxRate} taxRate
|
||||
* @param {IEditTaxRateDTO} editTaxRateDTO
|
||||
* @returns {boolean}
|
||||
*/
|
||||
private isTaxRateDTOChanged = (
|
||||
taxRate: TaxRateModel,
|
||||
editTaxRateDTO: IEditTaxRateDTO
|
||||
editTaxRateDTO: IEditTaxRateDTO,
|
||||
) => {
|
||||
return (
|
||||
taxRate.rate !== editTaxRateDTO.rate ||
|
||||
@@ -57,25 +58,29 @@ export class EditTaxRateService {
|
||||
private async editTaxRateOrCreate(
|
||||
oldTaxRate: TaxRateModel,
|
||||
editTaxRateDTO: IEditTaxRateDTO,
|
||||
trx?: Knex.Transaction
|
||||
trx?: Knex.Transaction,
|
||||
) {
|
||||
const isTaxDTOChanged = this.isTaxRateDTOChanged(
|
||||
oldTaxRate,
|
||||
editTaxRateDTO
|
||||
editTaxRateDTO,
|
||||
);
|
||||
if (isTaxDTOChanged) {
|
||||
// Soft deleting the old tax rate.
|
||||
await this.taxRateModel.query(trx).findById(oldTaxRate.id).delete();
|
||||
await this.taxRateModel().query(trx).findById(oldTaxRate.id).delete();
|
||||
|
||||
// Create a new tax rate with new edited data.
|
||||
return this.taxRateModel.query(trx).insertAndFetch({
|
||||
...omit(oldTaxRate, ['id']),
|
||||
...editTaxRateDTO,
|
||||
});
|
||||
return this.taxRateModel()
|
||||
.query(trx)
|
||||
.insertAndFetch({
|
||||
...omit(oldTaxRate, ['id']),
|
||||
...editTaxRateDTO,
|
||||
});
|
||||
} else {
|
||||
return this.taxRateModel.query(trx).patchAndFetchById(oldTaxRate.id, {
|
||||
...editTaxRateDTO,
|
||||
});
|
||||
return this.taxRateModel()
|
||||
.query(trx)
|
||||
.patchAndFetchById(oldTaxRate.id, {
|
||||
...editTaxRateDTO,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -85,11 +90,8 @@ export class EditTaxRateService {
|
||||
* @param {IEditTaxRateDTO} editTaxRateDTO - The tax rate data to edit.
|
||||
* @returns {Promise<ITaxRate>}
|
||||
*/
|
||||
public async editTaxRate(
|
||||
taxRateId: number,
|
||||
editTaxRateDTO: IEditTaxRateDTO
|
||||
) {
|
||||
const oldTaxRate = await this.taxRateModel.query().findById(taxRateId);
|
||||
public async editTaxRate(taxRateId: number, editTaxRateDTO: IEditTaxRateDTO) {
|
||||
const oldTaxRate = await this.taxRateModel().query().findById(taxRateId);
|
||||
|
||||
// Validates the tax rate existance.
|
||||
this.validators.validateTaxRateExistance(oldTaxRate);
|
||||
@@ -104,7 +106,7 @@ export class EditTaxRateService {
|
||||
const taxRate = await this.editTaxRateOrCreate(
|
||||
oldTaxRate,
|
||||
editTaxRateDTO,
|
||||
trx
|
||||
trx,
|
||||
);
|
||||
// Triggers `onTaxRateEdited` event.
|
||||
await this.eventEmitter.emitAsync(events.taxRates.onEdited, {
|
||||
|
||||
@@ -9,6 +9,7 @@ import { UnitOfWork } from '@/modules/Tenancy/TenancyDB/UnitOfWork.service';
|
||||
import { TaxRateModel } from '../models/TaxRate.model';
|
||||
import { EventEmitter2 } from '@nestjs/event-emitter';
|
||||
import { events } from '@/common/events/events';
|
||||
import { TenantModelProxy } from '@/modules/System/models/TenantBaseModel';
|
||||
|
||||
@Injectable()
|
||||
export class InactivateTaxRateService {
|
||||
@@ -24,7 +25,7 @@ export class InactivateTaxRateService {
|
||||
private readonly validators: CommandTaxRatesValidators,
|
||||
|
||||
@Inject(TaxRateModel.name)
|
||||
private readonly taxRateModel: typeof TaxRateModel,
|
||||
private readonly taxRateModel: TenantModelProxy<typeof TaxRateModel>,
|
||||
) {}
|
||||
|
||||
/**
|
||||
@@ -33,7 +34,7 @@ export class InactivateTaxRateService {
|
||||
* @returns {Promise<ITaxRate>}
|
||||
*/
|
||||
public async inactivateTaxRate(taxRateId: number) {
|
||||
const oldTaxRate = await this.taxRateModel.query().findById(taxRateId);
|
||||
const oldTaxRate = await this.taxRateModel().query().findById(taxRateId);
|
||||
|
||||
// Validates the tax rate existance.
|
||||
this.validators.validateTaxRateExistance(oldTaxRate);
|
||||
@@ -48,7 +49,7 @@ export class InactivateTaxRateService {
|
||||
trx,
|
||||
} as ITaxRateActivatingPayload);
|
||||
|
||||
const taxRate = await this.taxRateModel
|
||||
const taxRate = await this.taxRateModel()
|
||||
.query(trx)
|
||||
.findById(taxRateId)
|
||||
.patch({ active: false });
|
||||
|
||||
@@ -3,6 +3,7 @@ import { TransformerInjectable } from '@/modules/Transformer/TransformerInjectab
|
||||
import { TaxRateTransformer } from './TaxRate.transformer';
|
||||
import { TaxRateModel } from '../models/TaxRate.model';
|
||||
import { CommandTaxRatesValidators } from '../commands/CommandTaxRatesValidator.service';
|
||||
import { TenantModelProxy } from '@/modules/System/models/TenantBaseModel';
|
||||
|
||||
@Injectable()
|
||||
export class GetTaxRateService {
|
||||
@@ -13,7 +14,7 @@ export class GetTaxRateService {
|
||||
*/
|
||||
constructor(
|
||||
@Inject(TaxRateModel.name)
|
||||
private readonly taxRateModel: typeof TaxRateModel,
|
||||
private readonly taxRateModel: TenantModelProxy<typeof TaxRateModel>,
|
||||
private readonly validators: CommandTaxRatesValidators,
|
||||
private readonly transformer: TransformerInjectable,
|
||||
) {}
|
||||
@@ -24,15 +25,12 @@ export class GetTaxRateService {
|
||||
* @returns {Promise<ITaxRate>}
|
||||
*/
|
||||
public async getTaxRate(taxRateId: number) {
|
||||
const taxRate = await this.taxRateModel.query().findById(taxRateId);
|
||||
const taxRate = await this.taxRateModel().query().findById(taxRateId);
|
||||
|
||||
// Validates the tax rate existance.
|
||||
this.validators.validateTaxRateExistance(taxRate);
|
||||
|
||||
// Transforms the tax rate.
|
||||
return this.transformer.transform(
|
||||
taxRate,
|
||||
new TaxRateTransformer()
|
||||
);
|
||||
return this.transformer.transform(taxRate, new TaxRateTransformer());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,12 +2,14 @@ import { Inject, Injectable } from '@nestjs/common';
|
||||
import { TaxRateTransformer } from './TaxRate.transformer';
|
||||
import { TransformerInjectable } from '@/modules/Transformer/TransformerInjectable.service';
|
||||
import { TaxRateModel } from '../models/TaxRate.model';
|
||||
import { TenantModelProxy } from '@/modules/System/models/TenantBaseModel';
|
||||
|
||||
@Injectable()
|
||||
export class GetTaxRatesService {
|
||||
constructor(
|
||||
private transformer: TransformerInjectable,
|
||||
@Inject(TaxRateModel.name) private taxRateModel: typeof TaxRateModel,
|
||||
@Inject(TaxRateModel.name)
|
||||
private taxRateModel: TenantModelProxy<typeof TaxRateModel>,
|
||||
) {}
|
||||
|
||||
/**
|
||||
@@ -16,7 +18,7 @@ export class GetTaxRatesService {
|
||||
*/
|
||||
public async getTaxRates() {
|
||||
// Retrieves the tax rates.
|
||||
const taxRates = await this.taxRateModel.query().orderBy('name', 'ASC');
|
||||
const taxRates = await this.taxRateModel().query().orderBy('name', 'ASC');
|
||||
|
||||
// Transforms the tax rates.
|
||||
return this.transformer.transform(taxRates, new TaxRateTransformer());
|
||||
|
||||
Reference in New Issue
Block a user