feat(server): soft deleting tax rates

This commit is contained in:
Ahmed Bouhuolia
2023-09-18 10:15:55 +02:00
parent 4e53d08497
commit aa52e7d02c
3 changed files with 77 additions and 15 deletions

View File

@@ -6,8 +6,8 @@ exports.up = (knex) => {
table.string('code'); table.string('code');
table.decimal('rate'); table.decimal('rate');
table.string('description'); table.string('description');
table.boolean('is_non_recoverable'); table.boolean('is_non_recoverable').defaultTo(false);
table.boolean('is_compound'); table.boolean('is_compound').defaultTo(false);
table.boolean('active').defaultTo(false); table.boolean('active').defaultTo(false);
table.date('deleted_at'); table.date('deleted_at');
table.timestamps(); table.timestamps();

View File

@@ -1,6 +1,7 @@
import { mixin, Model, raw } from 'objection'; import { mixin, Model, raw } from 'objection';
import TenantModel from 'models/TenantModel'; import TenantModel from 'models/TenantModel';
import ModelSearchable from './ModelSearchable'; import ModelSearchable from './ModelSearchable';
import SoftDeleteQueryBuilder from '@/collection/SoftDeleteQueryBuilder';
export default class TaxRate extends mixin(TenantModel, [ModelSearchable]) { export default class TaxRate extends mixin(TenantModel, [ModelSearchable]) {
/** /**
@@ -10,6 +11,13 @@ export default class TaxRate extends mixin(TenantModel, [ModelSearchable]) {
return 'tax_rates'; return 'tax_rates';
} }
/**
* Soft delete query builder.
*/
static get QueryBuilder() {
return SoftDeleteQueryBuilder;
}
/** /**
* Timestamps columns. * Timestamps columns.
*/ */

View File

@@ -1,17 +1,18 @@
import { Knex } from 'knex';
import { Inject, Service } from 'typedi';
import { import {
IEditTaxRateDTO, IEditTaxRateDTO,
ITaxRateCreatingPayload, ITaxRate,
ITaxRateEditedPayload, ITaxRateEditedPayload,
ITaxRateEditingPayload, ITaxRateEditingPayload,
} from '@/interfaces'; } from '@/interfaces';
import { Inject } from 'typedi';
import UnitOfWork from '../UnitOfWork'; import UnitOfWork from '../UnitOfWork';
import { EventPublisher } from '@/lib/EventPublisher/EventPublisher'; import { EventPublisher } from '@/lib/EventPublisher/EventPublisher';
import HasTenancyService from '../Tenancy/TenancyService'; import HasTenancyService from '../Tenancy/TenancyService';
import { Knex } from 'knex';
import { CommandTaxRatesValidators } from './CommandTaxRatesValidators'; import { CommandTaxRatesValidators } from './CommandTaxRatesValidators';
import events from '@/subscribers/events'; import events from '@/subscribers/events';
@Service()
export class EditTaxRateService { export class EditTaxRateService {
@Inject() @Inject()
private tenancy: HasTenancyService; private tenancy: HasTenancyService;
@@ -25,6 +26,57 @@ export class EditTaxRateService {
@Inject() @Inject()
private validators: CommandTaxRatesValidators; private validators: CommandTaxRatesValidators;
/**
* Detarmines whether the tax rate, name or code have been changed.
* @param {ITaxRate} taxRate
* @param {IEditTaxRateDTO} editTaxRateDTO
* @returns {boolean}
*/
private isTaxRateDTOChanged = (
taxRate: ITaxRate,
editTaxRateDTO: IEditTaxRateDTO
) => {
return (
taxRate.rate !== editTaxRateDTO.rate ||
taxRate.name !== editTaxRateDTO.name ||
taxRate.code !== editTaxRateDTO.code
);
};
/**
* Edits the given tax rate or creates a new if the rate or name have been changed.
* @param {number} tenantId
* @param {ITaxRate} oldTaxRate
* @param {IEditTaxRateDTO} editTaxRateDTO
* @param {Knex.Transaction} trx
* @returns {Promise<ITaxRate>}
*/
private async editTaxRateOrCreate(
tenantId: number,
oldTaxRate: ITaxRate,
editTaxRateDTO: any,
trx?: Knex.Transaction
) {
const { TaxRate } = this.tenancy.models(tenantId);
const isTaxDTOChanged = this.isTaxRateDTOChanged(
oldTaxRate,
editTaxRateDTO
);
if (isTaxDTOChanged) {
// Soft deleting the old tax rate.
await TaxRate.query(trx).findById(oldTaxRate.id).delete();
// Create a new tax rate with new edited data.
return TaxRate.query(trx).insertAndFetch({
...editTaxRateDTO,
});
} else {
return TaxRate.query(trx).patchAndFetchById(oldTaxRate.id, {
...editTaxRateDTO,
});
}
}
/** /**
* Edits the given tax rate. * Edits the given tax rate.
* @param {number} tenantId * @param {number} tenantId
@@ -32,32 +84,34 @@ export class EditTaxRateService {
* @param {IEditTaxRateDTO} taxRateEditDTO * @param {IEditTaxRateDTO} taxRateEditDTO
* @returns {Promise<ITaxRate>} * @returns {Promise<ITaxRate>}
*/ */
public editTaxRate( public async editTaxRate(
tenantId: number, tenantId: number,
taxRateId: number, taxRateId: number,
editTaxRateDTO: IEditTaxRateDTO editTaxRateDTO: IEditTaxRateDTO
) { ) {
const { TaxRate } = this.tenancy.models(tenantId); const { TaxRate } = this.tenancy.models(tenantId);
const oldTaxRate = TaxRate.query().findById(taxRateId); const oldTaxRate = await TaxRate.query().findById(taxRateId);
// Validates the tax rate existance. // Validates the tax rate existance.
this.validators.validateTaxRateExistance(oldTaxRate); this.validators.validateTaxRateExistance(oldTaxRate);
return this.uow.withTransaction(tenantId, async (trx: Knex.Transaction) => { return this.uow.withTransaction(tenantId, async (trx: Knex.Transaction) => {
// Triggers `onTaxRateCreating` event. // Triggers `onTaxRateEditing` event.
await this.eventPublisher.emitAsync(events.taxRates.onCreating, { await this.eventPublisher.emitAsync(events.taxRates.onEditing, {
editTaxRateDTO, editTaxRateDTO,
tenantId, tenantId,
trx, trx,
} as ITaxRateEditingPayload); } as ITaxRateEditingPayload);
const taxRate = await TaxRate.query(trx) const taxRate = await this.editTaxRateOrCreate(
.findById(taxRateId) tenantId,
.patch({ ...editTaxRateDTO }); oldTaxRate,
editTaxRateDTO,
// Triggers `onTaxRateCreated` event. trx
await this.eventPublisher.emitAsync(events.taxRates.onCreated, { );
// Triggers `onTaxRateEdited` event.
await this.eventPublisher.emitAsync(events.taxRates.onEdited, {
editTaxRateDTO, editTaxRateDTO,
taxRate, taxRate,
tenantId, tenantId,