diff --git a/src/core/modules/domain/usecase/base.manager.ts b/src/core/modules/domain/usecase/base.manager.ts index e4101b6..28f16d3 100644 --- a/src/core/modules/domain/usecase/base.manager.ts +++ b/src/core/modules/domain/usecase/base.manager.ts @@ -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[]; diff --git a/src/modules/transaction/tax/domain/usecases/managers/batch-delete-tax.manager.ts b/src/modules/transaction/tax/domain/usecases/managers/batch-delete-tax.manager.ts index 97b1e1d..16c8400 100644 --- a/src/modules/transaction/tax/domain/usecases/managers/batch-delete-tax.manager.ts +++ b/src/modules/transaction/tax/domain/usecases/managers/batch-delete-tax.manager.ts @@ -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 { @@ -16,6 +17,7 @@ export class BatchDeleteTaxManager extends BaseBatchDeleteManager { } async validateData(data: TaxEntity): Promise { + await validateUsedInFormula(this.dataServiceFirstOpt, data.name.toLowerCase()); return; } diff --git a/src/modules/transaction/tax/domain/usecases/managers/batch-inactive-tax.manager.ts b/src/modules/transaction/tax/domain/usecases/managers/batch-inactive-tax.manager.ts index f00ec20..ba81b4c 100644 --- a/src/modules/transaction/tax/domain/usecases/managers/batch-inactive-tax.manager.ts +++ b/src/modules/transaction/tax/domain/usecases/managers/batch-inactive-tax.manager.ts @@ -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 { - validateData(data: TaxEntity): Promise { + + // dataServiceFirstOpt adalah formula service + + async validateData(data: TaxEntity): Promise { + await validateUsedInFormula(this.dataServiceFirstOpt, data.name.toLowerCase()); return; } diff --git a/src/modules/transaction/tax/domain/usecases/managers/delete-tax.manager.ts b/src/modules/transaction/tax/domain/usecases/managers/delete-tax.manager.ts index bb0b9cc..8bb511f 100644 --- a/src/modules/transaction/tax/domain/usecases/managers/delete-tax.manager.ts +++ b/src/modules/transaction/tax/domain/usecases/managers/delete-tax.manager.ts @@ -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 { @@ -15,6 +16,7 @@ export class DeleteTaxManager extends BaseDeleteManager { } async validateProcess(): Promise { + await validateUsedInFormula(this.dataServiceFirstOpt, this.data.name.toLowerCase()); return; } diff --git a/src/modules/transaction/tax/domain/usecases/managers/helpers/validation.helper.ts b/src/modules/transaction/tax/domain/usecases/managers/helpers/validation.helper.ts new file mode 100644 index 0000000..f4826a1 --- /dev/null +++ b/src/modules/transaction/tax/domain/usecases/managers/helpers/validation.helper.ts @@ -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', + }) + }); +} \ No newline at end of file diff --git a/src/modules/transaction/tax/domain/usecases/managers/inactive-tax.manager.ts b/src/modules/transaction/tax/domain/usecases/managers/inactive-tax.manager.ts index f92cfff..618e831 100644 --- a/src/modules/transaction/tax/domain/usecases/managers/inactive-tax.manager.ts +++ b/src/modules/transaction/tax/domain/usecases/managers/inactive-tax.manager.ts @@ -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 { getResult(): string { - return `Success inactive data ${this.result.name}`; + return `Success inactive data ${ this.result.name }`; } async validateProcess(): Promise { + await validateUsedInFormula(this.dataServiceFirstOpt, this.data.name.toLowerCase()); return; } diff --git a/src/modules/transaction/tax/domain/usecases/tax-data.orchestrator.ts b/src/modules/transaction/tax/domain/usecases/tax-data.orchestrator.ts index ddaafc4..6e77b90 100644 --- a/src/modules/transaction/tax/domain/usecases/tax-data.orchestrator.ts +++ b/src/modules/transaction/tax/domain/usecases/tax-data.orchestrator.ts @@ -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 { @@ -30,6 +31,7 @@ export class TaxDataOrchestrator extends BaseDataTransactionOrchestrator { 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 { 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 { 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 { 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(); } diff --git a/src/modules/transaction/tax/tax.module.ts b/src/modules/transaction/tax/tax.module.ts index ef35bc6..9c1fc47 100644 --- a/src/modules/transaction/tax/tax.module.ts +++ b/src/modules/transaction/tax/tax.module.ts @@ -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 { }