fix(SPG-543) BE-Validasi Data Tax - data tidak bisa di delete dan di inactivekan jika dipakai di formula

pull/3/head
Aswin Ashar Abdullah 2024-06-20 16:07:07 +07:00
parent 507bc99510
commit 23f5ed0946
8 changed files with 48 additions and 9 deletions

View File

@ -22,6 +22,12 @@ export abstract class BaseManager {
protected eventBus: EventBus; protected eventBus: EventBus;
abstract get validateRelations(): validateRelations[]; abstract get validateRelations(): validateRelations[];
// sebagai optional yang dapat digunakan
public dataServiceFirstOpt: any;
// sebagai optional yang dapat digunakan
public dataServiceSecondOpt: any;
private readonly baseLog = new Logger(BaseManager.name); private readonly baseLog = new Logger(BaseManager.name);
setUser() { setUser() {
@ -32,12 +38,15 @@ export abstract class BaseManager {
} }
} }
setService(dataService, tableName) { setService(dataService, tableName, dataServiceOpt = null, dataServiceSecondOpt = null) {
this.dataService = dataService; this.dataService = dataService;
this.tableName = tableName; this.tableName = tableName;
this.queryRunner = this.dataService this.queryRunner = this.dataService
.getRepository() .getRepository()
.manager.connection.createQueryRunner(tableName); .manager.connection.createQueryRunner(tableName);
if (dataServiceOpt) this.dataServiceFirstOpt = dataServiceOpt;
if (dataServiceSecondOpt) this.dataServiceSecondOpt = dataServiceSecondOpt;
} }
abstract get eventTopics(): EventTopics[]; abstract get eventTopics(): EventTopics[];

View File

@ -8,6 +8,7 @@ import { TaxModel } from '../../../data/models/tax.model';
import { TaxDeletedEvent } from '../../entities/event/tax-deleted.event'; import { TaxDeletedEvent } from '../../entities/event/tax-deleted.event';
import { BatchResult } from 'src/core/response/domain/ok-response.interface'; import { BatchResult } from 'src/core/response/domain/ok-response.interface';
import { Injectable } from '@nestjs/common'; import { Injectable } from '@nestjs/common';
import { validateUsedInFormula } from './helpers/validation.helper';
@Injectable() @Injectable()
export class BatchDeleteTaxManager extends BaseBatchDeleteManager<TaxEntity> { export class BatchDeleteTaxManager extends BaseBatchDeleteManager<TaxEntity> {
@ -16,6 +17,7 @@ export class BatchDeleteTaxManager extends BaseBatchDeleteManager<TaxEntity> {
} }
async validateData(data: TaxEntity): Promise<void> { async validateData(data: TaxEntity): Promise<void> {
await validateUsedInFormula(this.dataServiceFirstOpt, data.name.toLowerCase());
return; return;
} }

View File

@ -8,10 +8,15 @@ import { TaxModel } from '../../../data/models/tax.model';
import { TaxChangeStatusEvent } from '../../entities/event/tax-change-status.event'; import { TaxChangeStatusEvent } from '../../entities/event/tax-change-status.event';
import { BatchResult } from 'src/core/response/domain/ok-response.interface'; import { BatchResult } from 'src/core/response/domain/ok-response.interface';
import { Injectable } from '@nestjs/common'; import { Injectable } from '@nestjs/common';
import { validateUsedInFormula } from './helpers/validation.helper';
@Injectable() @Injectable()
export class BatchInactiveTaxManager extends BaseBatchUpdateStatusManager<TaxEntity> { export class BatchInactiveTaxManager extends BaseBatchUpdateStatusManager<TaxEntity> {
validateData(data: TaxEntity): Promise<void> {
// dataServiceFirstOpt adalah formula service
async validateData(data: TaxEntity): Promise<void> {
await validateUsedInFormula(this.dataServiceFirstOpt, data.name.toLowerCase());
return; return;
} }

View File

@ -7,6 +7,7 @@ import {
} from 'src/core/strings/constants/interface.constants'; } from 'src/core/strings/constants/interface.constants';
import { TaxModel } from '../../../data/models/tax.model'; import { TaxModel } from '../../../data/models/tax.model';
import { TaxDeletedEvent } from '../../entities/event/tax-deleted.event'; import { TaxDeletedEvent } from '../../entities/event/tax-deleted.event';
import { validateUsedInFormula } from './helpers/validation.helper';
@Injectable() @Injectable()
export class DeleteTaxManager extends BaseDeleteManager<TaxEntity> { export class DeleteTaxManager extends BaseDeleteManager<TaxEntity> {
@ -15,6 +16,7 @@ export class DeleteTaxManager extends BaseDeleteManager<TaxEntity> {
} }
async validateProcess(): Promise<void> { async validateProcess(): Promise<void> {
await validateUsedInFormula(this.dataServiceFirstOpt, this.data.name.toLowerCase());
return; return;
} }

View File

@ -0,0 +1,14 @@
import { HttpStatus, UnprocessableEntityException } from "@nestjs/common";
export async function validateUsedInFormula(formulaDataService, name) {
const formulas = await formulaDataService.getManyByOptions();
formulas?.forEach(formula => {
const allWords = formula?.formula_string?.replace(/[^a-zA-Z0-9]/g, ' ').split(' ');
if (allWords.find(item => item.toLowerCase() == name))
throw new UnprocessableEntityException({
statusCode: HttpStatus.UNPROCESSABLE_ENTITY,
message: `Failed! tax ${ name } already used in ${ formula.type } formula`,
error: 'Unprocessable Entity',
})
});
}

View File

@ -7,14 +7,16 @@ import {
} from 'src/core/strings/constants/interface.constants'; } from 'src/core/strings/constants/interface.constants';
import { TaxModel } from '../../../data/models/tax.model'; import { TaxModel } from '../../../data/models/tax.model';
import { TaxChangeStatusEvent } from '../../entities/event/tax-change-status.event'; import { TaxChangeStatusEvent } from '../../entities/event/tax-change-status.event';
import { validateUsedInFormula } from './helpers/validation.helper';
@Injectable() @Injectable()
export class InactiveTaxManager extends BaseUpdateStatusManager<TaxEntity> { export class InactiveTaxManager extends BaseUpdateStatusManager<TaxEntity> {
getResult(): string { getResult(): string {
return `Success inactive data ${this.result.name}`; return `Success inactive data ${ this.result.name }`;
} }
async validateProcess(): Promise<void> { async validateProcess(): Promise<void> {
await validateUsedInFormula(this.dataServiceFirstOpt, this.data.name.toLowerCase());
return; return;
} }

View File

@ -15,6 +15,7 @@ import { BatchInactiveTaxManager } from './managers/batch-inactive-tax.manager';
import { BatchActiveTaxManager } from './managers/batch-active-tax.manager'; import { BatchActiveTaxManager } from './managers/batch-active-tax.manager';
import { BatchDeleteTaxManager } from './managers/batch-delete-tax.manager'; import { BatchDeleteTaxManager } from './managers/batch-delete-tax.manager';
import { TABLE_NAME } from 'src/core/strings/constants/table.constants'; import { TABLE_NAME } from 'src/core/strings/constants/table.constants';
import { SalesPriceFormulaReadService } from 'src/modules/transaction/sales-price-formula/data/services/sales-price-formula-read.service';
@Injectable() @Injectable()
export class TaxDataOrchestrator extends BaseDataTransactionOrchestrator<TaxEntity> { export class TaxDataOrchestrator extends BaseDataTransactionOrchestrator<TaxEntity> {
@ -30,6 +31,7 @@ export class TaxDataOrchestrator extends BaseDataTransactionOrchestrator<TaxEnti
private batchConfirmManager: BatchConfirmTaxManager, private batchConfirmManager: BatchConfirmTaxManager,
private batchInactiveManager: BatchInactiveTaxManager, private batchInactiveManager: BatchInactiveTaxManager,
private serviceData: TaxDataService, private serviceData: TaxDataService,
private formulaServiceData: SalesPriceFormulaReadService,
) { ) {
super(); super();
} }
@ -50,14 +52,14 @@ export class TaxDataOrchestrator extends BaseDataTransactionOrchestrator<TaxEnti
async delete(dataId): Promise<String> { async delete(dataId): Promise<String> {
this.deleteManager.setData(dataId); this.deleteManager.setData(dataId);
this.deleteManager.setService(this.serviceData, TABLE_NAME.TAX); this.deleteManager.setService(this.serviceData, TABLE_NAME.TAX, this.formulaServiceData);
await this.deleteManager.execute(); await this.deleteManager.execute();
return this.deleteManager.getResult(); return this.deleteManager.getResult();
} }
async batchDelete(dataIds: string[]): Promise<BatchResult> { async batchDelete(dataIds: string[]): Promise<BatchResult> {
this.batchDeleteManager.setData(dataIds); this.batchDeleteManager.setData(dataIds);
this.batchDeleteManager.setService(this.serviceData, TABLE_NAME.TAX); this.batchDeleteManager.setService(this.serviceData, TABLE_NAME.TAX, this.formulaServiceData);
await this.batchDeleteManager.execute(); await this.batchDeleteManager.execute();
return this.batchDeleteManager.getResult(); return this.batchDeleteManager.getResult();
} }
@ -92,14 +94,14 @@ export class TaxDataOrchestrator extends BaseDataTransactionOrchestrator<TaxEnti
async inactive(dataId): Promise<String> { async inactive(dataId): Promise<String> {
this.inactiveManager.setData(dataId, STATUS.INACTIVE); this.inactiveManager.setData(dataId, STATUS.INACTIVE);
this.inactiveManager.setService(this.serviceData, TABLE_NAME.TAX); this.inactiveManager.setService(this.serviceData, TABLE_NAME.TAX, this.formulaServiceData);
await this.inactiveManager.execute(); await this.inactiveManager.execute();
return this.inactiveManager.getResult(); return this.inactiveManager.getResult();
} }
async batchInactive(dataIds: string[]): Promise<BatchResult> { async batchInactive(dataIds: string[]): Promise<BatchResult> {
this.batchInactiveManager.setData(dataIds, STATUS.INACTIVE); this.batchInactiveManager.setData(dataIds, STATUS.INACTIVE);
this.batchInactiveManager.setService(this.serviceData, TABLE_NAME.TAX); this.batchInactiveManager.setService(this.serviceData, TABLE_NAME.TAX, this.formulaServiceData);
await this.batchInactiveManager.execute(); await this.batchInactiveManager.execute();
return this.batchInactiveManager.getResult(); return this.batchInactiveManager.getResult();
} }

View File

@ -22,11 +22,13 @@ import { BatchActiveTaxManager } from './domain/usecases/managers/batch-active-t
import { BatchConfirmTaxManager } from './domain/usecases/managers/batch-confirm-tax.manager'; import { BatchConfirmTaxManager } from './domain/usecases/managers/batch-confirm-tax.manager';
import { BatchInactiveTaxManager } from './domain/usecases/managers/batch-inactive-tax.manager'; import { BatchInactiveTaxManager } from './domain/usecases/managers/batch-inactive-tax.manager';
import { TaxModel } from './data/models/tax.model'; import { TaxModel } from './data/models/tax.model';
import { SalesPriceFormulaReadService } from '../sales-price-formula/data/services/sales-price-formula-read.service';
import { SalesPriceFormulaModel } from '../sales-price-formula/data/models/sales-price-formula.model';
@Module({ @Module({
imports: [ imports: [
ConfigModule.forRoot(), ConfigModule.forRoot(),
TypeOrmModule.forFeature([TaxModel], CONNECTION_NAME.DEFAULT), TypeOrmModule.forFeature([TaxModel, SalesPriceFormulaModel], CONNECTION_NAME.DEFAULT),
CqrsModule, CqrsModule,
], ],
controllers: [TaxDataController, TaxReadController], controllers: [TaxDataController, TaxReadController],
@ -44,6 +46,7 @@ import { TaxModel } from './data/models/tax.model';
BatchConfirmTaxManager, BatchConfirmTaxManager,
BatchInactiveTaxManager, BatchInactiveTaxManager,
SalesPriceFormulaReadService,
TaxDataService, TaxDataService,
TaxReadService, TaxReadService,
@ -51,4 +54,4 @@ import { TaxModel } from './data/models/tax.model';
TaxReadOrchestrator, TaxReadOrchestrator,
], ],
}) })
export class TaxModule {} export class TaxModule { }