mirror of
https://github.com/bigcapitalhq/bigcapital.git
synced 2026-02-19 14:20:31 +00:00
feat(server): soft deleting tax rates
This commit is contained in:
@@ -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();
|
||||||
|
|||||||
@@ -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.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user