fix(SPG-543) BE-Validasi Data Tax - data tidak bisa di delete dan di inactivekan jika dipakai di formula
parent
507bc99510
commit
23f5ed0946
|
@ -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[];
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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',
|
||||||
|
})
|
||||||
|
});
|
||||||
|
}
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 { }
|
||||||
|
|
Loading…
Reference in New Issue