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;
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);
setUser() {
@ -32,12 +38,15 @@ export abstract class BaseManager {
}
}
setService(dataService, tableName) {
setService(dataService, tableName, dataServiceOpt = null, dataServiceSecondOpt = null) {
this.dataService = dataService;
this.tableName = tableName;
this.queryRunner = this.dataService
.getRepository()
.manager.connection.createQueryRunner(tableName);
if (dataServiceOpt) this.dataServiceFirstOpt = dataServiceOpt;
if (dataServiceSecondOpt) this.dataServiceSecondOpt = dataServiceSecondOpt;
}
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 { BatchResult } from 'src/core/response/domain/ok-response.interface';
import { Injectable } from '@nestjs/common';
import { validateUsedInFormula } from './helpers/validation.helper';
@Injectable()
export class BatchDeleteTaxManager extends BaseBatchDeleteManager<TaxEntity> {
@ -16,6 +17,7 @@ export class BatchDeleteTaxManager extends BaseBatchDeleteManager<TaxEntity> {
}
async validateData(data: TaxEntity): Promise<void> {
await validateUsedInFormula(this.dataServiceFirstOpt, data.name.toLowerCase());
return;
}

View File

@ -8,10 +8,15 @@ import { TaxModel } from '../../../data/models/tax.model';
import { TaxChangeStatusEvent } from '../../entities/event/tax-change-status.event';
import { BatchResult } from 'src/core/response/domain/ok-response.interface';
import { Injectable } from '@nestjs/common';
import { validateUsedInFormula } from './helpers/validation.helper';
@Injectable()
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;
}

View File

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

View File

@ -15,6 +15,7 @@ import { BatchInactiveTaxManager } from './managers/batch-inactive-tax.manager';
import { BatchActiveTaxManager } from './managers/batch-active-tax.manager';
import { BatchDeleteTaxManager } from './managers/batch-delete-tax.manager';
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()
export class TaxDataOrchestrator extends BaseDataTransactionOrchestrator<TaxEntity> {
@ -30,6 +31,7 @@ export class TaxDataOrchestrator extends BaseDataTransactionOrchestrator<TaxEnti
private batchConfirmManager: BatchConfirmTaxManager,
private batchInactiveManager: BatchInactiveTaxManager,
private serviceData: TaxDataService,
private formulaServiceData: SalesPriceFormulaReadService,
) {
super();
}
@ -50,14 +52,14 @@ export class TaxDataOrchestrator extends BaseDataTransactionOrchestrator<TaxEnti
async delete(dataId): Promise<String> {
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();
return this.deleteManager.getResult();
}
async batchDelete(dataIds: string[]): Promise<BatchResult> {
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();
return this.batchDeleteManager.getResult();
}
@ -92,14 +94,14 @@ export class TaxDataOrchestrator extends BaseDataTransactionOrchestrator<TaxEnti
async inactive(dataId): Promise<String> {
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();
return this.inactiveManager.getResult();
}
async batchInactive(dataIds: string[]): Promise<BatchResult> {
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();
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 { BatchInactiveTaxManager } from './domain/usecases/managers/batch-inactive-tax.manager';
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({
imports: [
ConfigModule.forRoot(),
TypeOrmModule.forFeature([TaxModel], CONNECTION_NAME.DEFAULT),
TypeOrmModule.forFeature([TaxModel, SalesPriceFormulaModel], CONNECTION_NAME.DEFAULT),
CqrsModule,
],
controllers: [TaxDataController, TaxReadController],
@ -44,6 +46,7 @@ import { TaxModel } from './data/models/tax.model';
BatchConfirmTaxManager,
BatchInactiveTaxManager,
SalesPriceFormulaReadService,
TaxDataService,
TaxReadService,
@ -51,4 +54,4 @@ import { TaxModel } from './data/models/tax.model';
TaxReadOrchestrator,
],
})
export class TaxModule {}
export class TaxModule { }