From c5cec31ab5d32f876e2bd89c80766daa86d682b3 Mon Sep 17 00:00:00 2001 From: Aswin Ashar Abdullah Date: Sat, 20 Jul 2024 22:12:09 +0700 Subject: [PATCH] fix(SPG-641) Validasi ketika process save untuk aksi di rekonsiliasi, save data di refund, dan aksi di booking --- .../batch-cancel-reconciliation.manager.ts | 17 ++++++++++++++++- .../managers/cancel-reconciliation.manager.ts | 16 +++++++++++++++- .../managers/batch-confirm-refund.manager.ts | 10 ++++++++-- .../usecases/managers/confirm-refund.manager.ts | 8 ++++++++ .../usecases/managers/create-refund.manager.ts | 9 ++++++++- .../usecases/managers/update-refund.manager.ts | 9 ++++++++- .../domain/usecases/refund-data.orchestrator.ts | 14 ++++++++++++-- src/modules/transaction/refund/refund.module.ts | 5 ++++- .../usecases/handlers/refund-update.handler.ts | 2 +- 9 files changed, 80 insertions(+), 10 deletions(-) diff --git a/src/modules/transaction/reconciliation/domain/usecases/managers/batch-cancel-reconciliation.manager.ts b/src/modules/transaction/reconciliation/domain/usecases/managers/batch-cancel-reconciliation.manager.ts index b70dd80..5db3089 100644 --- a/src/modules/transaction/reconciliation/domain/usecases/managers/batch-cancel-reconciliation.manager.ts +++ b/src/modules/transaction/reconciliation/domain/usecases/managers/batch-cancel-reconciliation.manager.ts @@ -11,10 +11,25 @@ import { } from '@nestjs/common'; import { TransactionEntity } from 'src/modules/transaction/transaction/domain/entities/transaction.entity'; import { TransactionModel } from 'src/modules/transaction/transaction/data/models/transaction.model'; +import { STATUS } from 'src/core/strings/constants/base.constants'; @Injectable() export class BatchCancelReconciliationManager extends BaseBatchUpdateStatusManager { - validateData(data: TransactionEntity): Promise { + async validateData(data: TransactionEntity): Promise { + const transaction = await this.dataService.getOneByOptions({ + where: { + id: data.id, + }, + }); + + if (transaction.status != STATUS.SETTLED) { + throw new UnprocessableEntityException({ + statusCode: HttpStatus.UNPROCESSABLE_ENTITY, + message: `Failed! cant cancel transaction not settled`, + error: 'Unprocessable Entity', + }); + } + Object.assign(data, { reconciliation_mdr: this.data.reconciliation_mdr ?? null, reconciliation_confirm_by: this.user.name, diff --git a/src/modules/transaction/reconciliation/domain/usecases/managers/cancel-reconciliation.manager.ts b/src/modules/transaction/reconciliation/domain/usecases/managers/cancel-reconciliation.manager.ts index 8874667..fb48668 100644 --- a/src/modules/transaction/reconciliation/domain/usecases/managers/cancel-reconciliation.manager.ts +++ b/src/modules/transaction/reconciliation/domain/usecases/managers/cancel-reconciliation.manager.ts @@ -4,6 +4,7 @@ import { UnprocessableEntityException, } from '@nestjs/common'; import { BaseUpdateStatusManager } from 'src/core/modules/domain/usecase/managers/base-update-status.manager'; +import { STATUS } from 'src/core/strings/constants/base.constants'; import { EventTopics, validateRelations, @@ -18,7 +19,20 @@ export class CancelReconciliationManager extends BaseUpdateStatusManager { - if (this.data.is_recap_transaction) { + // untuk dapat current status + const transaction = await this.dataService.getOneByOptions({ + where: { + id: this.dataId, + }, + }); + + if (transaction.status != STATUS.SETTLED) { + throw new UnprocessableEntityException({ + statusCode: HttpStatus.UNPROCESSABLE_ENTITY, + message: `Failed! cant cancel transaction not settled`, + error: 'Unprocessable Entity', + }); + } else if (this.data.is_recap_transaction) { throw new UnprocessableEntityException({ statusCode: HttpStatus.UNPROCESSABLE_ENTITY, message: `Failed! cant cancel recap data`, diff --git a/src/modules/transaction/refund/domain/usecases/managers/batch-confirm-refund.manager.ts b/src/modules/transaction/refund/domain/usecases/managers/batch-confirm-refund.manager.ts index e904591..678566a 100644 --- a/src/modules/transaction/refund/domain/usecases/managers/batch-confirm-refund.manager.ts +++ b/src/modules/transaction/refund/domain/usecases/managers/batch-confirm-refund.manager.ts @@ -16,8 +16,14 @@ import { STATUS } from 'src/core/strings/constants/base.constants'; @Injectable() export class BatchConfirmRefundManager extends BaseBatchUpdateStatusManager { - validateData(data: RefundEntity): Promise { - if (![STATUS.DRAFT, STATUS.PENDING].includes(data.status)) { + async validateData(data: RefundEntity): Promise { + if (data?.['transaction']?.status != STATUS.SETTLED) { + throw new UnprocessableEntityException({ + statusCode: HttpStatus.UNPROCESSABLE_ENTITY, + message: `Failed! only transaction with status ${STATUS.SETTLED} can be refund`, + error: 'Unprocessable Entity', + }); + } else if (![STATUS.DRAFT, STATUS.PENDING].includes(data.status)) { throw new UnprocessableEntityException({ statusCode: HttpStatus.UNPROCESSABLE_ENTITY, message: `Failed! only data with status ${STATUS.DRAFT} and ${STATUS.PENDING} can be confirmed`, diff --git a/src/modules/transaction/refund/domain/usecases/managers/confirm-refund.manager.ts b/src/modules/transaction/refund/domain/usecases/managers/confirm-refund.manager.ts index f56080f..1de469c 100644 --- a/src/modules/transaction/refund/domain/usecases/managers/confirm-refund.manager.ts +++ b/src/modules/transaction/refund/domain/usecases/managers/confirm-refund.manager.ts @@ -38,6 +38,14 @@ export class ConfirmRefundManager extends BaseUpdateStatusManager relations: ['transaction'], }); + if (data.transaction.status != STATUS.SETTLED) { + throw new UnprocessableEntityException({ + statusCode: HttpStatus.UNPROCESSABLE_ENTITY, + message: `Failed! only transaction with status ${STATUS.SETTLED} can be refund`, + error: 'Unprocessable Entity', + }); + } + if (data.status == STATUS.DRAFT) { Object.assign(this.data, { code: `RF-${data.transaction?.invoice_code?.split('-')[1]}`, diff --git a/src/modules/transaction/refund/domain/usecases/managers/create-refund.manager.ts b/src/modules/transaction/refund/domain/usecases/managers/create-refund.manager.ts index 7b90581..5b630e8 100644 --- a/src/modules/transaction/refund/domain/usecases/managers/create-refund.manager.ts +++ b/src/modules/transaction/refund/domain/usecases/managers/create-refund.manager.ts @@ -30,7 +30,14 @@ export class CreateRefundManager extends BaseCreateManager { refund_items: refund_items, }); - if (this.data.transaction?.status != STATUS.SETTLED) { + const transaction = await this.dataServiceFirstOpt.getOneByOptions({ + where: { + id: this.data.transaction.id, + status: STATUS.SETTLED, + }, + }); + + if (!transaction) { throw new UnprocessableEntityException({ statusCode: HttpStatus.UNPROCESSABLE_ENTITY, message: `Failed! only transaction with status ${STATUS.SETTLED} can be refund`, diff --git a/src/modules/transaction/refund/domain/usecases/managers/update-refund.manager.ts b/src/modules/transaction/refund/domain/usecases/managers/update-refund.manager.ts index 5674c3f..86e8602 100644 --- a/src/modules/transaction/refund/domain/usecases/managers/update-refund.manager.ts +++ b/src/modules/transaction/refund/domain/usecases/managers/update-refund.manager.ts @@ -17,7 +17,14 @@ import { STATUS } from 'src/core/strings/constants/base.constants'; @Injectable() export class UpdateRefundManager extends BaseUpdateManager { async validateProcess(): Promise { - if (this.data.transaction?.status != STATUS.SETTLED) { + const transaction = await this.dataServiceFirstOpt.getOneByOptions({ + where: { + id: this.data.transaction.id, + status: STATUS.SETTLED, + }, + }); + + if (!transaction) { throw new UnprocessableEntityException({ statusCode: HttpStatus.UNPROCESSABLE_ENTITY, message: `Failed! only transaction with status ${STATUS.SETTLED} can be refund`, diff --git a/src/modules/transaction/refund/domain/usecases/refund-data.orchestrator.ts b/src/modules/transaction/refund/domain/usecases/refund-data.orchestrator.ts index 065ef91..c4500a1 100644 --- a/src/modules/transaction/refund/domain/usecases/refund-data.orchestrator.ts +++ b/src/modules/transaction/refund/domain/usecases/refund-data.orchestrator.ts @@ -12,6 +12,7 @@ import { BatchDeleteRefundManager } from './managers/batch-delete-refund.manager import { TABLE_NAME } from 'src/core/strings/constants/table.constants'; import { CancelRefundManager } from './managers/cancel-refund.manager'; import { BatchCancelRefundManager } from './managers/batch-cancel-refund.manager'; +import { TransactionDataService } from 'src/modules/transaction/transaction/data/services/transaction-data.service'; @Injectable() export class RefundDataOrchestrator { @@ -25,18 +26,27 @@ export class RefundDataOrchestrator { private batchCancelManager: BatchCancelRefundManager, private batchConfirmManager: BatchConfirmRefundManager, private serviceData: RefundDataService, + private transactionDataService: TransactionDataService, ) {} async create(data): Promise { this.createManager.setData(data); - this.createManager.setService(this.serviceData, TABLE_NAME.REFUND); + this.createManager.setService( + this.serviceData, + TABLE_NAME.REFUND, + this.transactionDataService, + ); await this.createManager.execute(); return this.createManager.getResult(); } async update(dataId, data): Promise { this.updateManager.setData(dataId, data); - this.updateManager.setService(this.serviceData, TABLE_NAME.REFUND); + this.updateManager.setService( + this.serviceData, + TABLE_NAME.REFUND, + this.transactionDataService, + ); await this.updateManager.execute(); return this.updateManager.getResult(); } diff --git a/src/modules/transaction/refund/refund.module.ts b/src/modules/transaction/refund/refund.module.ts index fbae71e..c45fc5a 100644 --- a/src/modules/transaction/refund/refund.module.ts +++ b/src/modules/transaction/refund/refund.module.ts @@ -21,12 +21,14 @@ import { RefundModel } from './data/models/refund.model'; import { BatchCancelRefundManager } from './domain/usecases/managers/batch-cancel-refund.manager'; import { CancelRefundManager } from './domain/usecases/managers/cancel-refund.manager'; import { RefundItemModel } from './data/models/refund-item.model'; +import { TransactionDataService } from '../transaction/data/services/transaction-data.service'; +import { TransactionModel } from '../transaction/data/models/transaction.model'; @Module({ imports: [ ConfigModule.forRoot(), TypeOrmModule.forFeature( - [RefundModel, RefundItemModel], + [RefundModel, RefundItemModel, TransactionModel], CONNECTION_NAME.DEFAULT, ), CqrsModule, @@ -46,6 +48,7 @@ import { RefundItemModel } from './data/models/refund-item.model'; RefundDataService, RefundReadService, + TransactionDataService, RefundDataOrchestrator, RefundReadOrchestrator, diff --git a/src/modules/transaction/transaction/domain/usecases/handlers/refund-update.handler.ts b/src/modules/transaction/transaction/domain/usecases/handlers/refund-update.handler.ts index 3d83ed7..7d15c32 100644 --- a/src/modules/transaction/transaction/domain/usecases/handlers/refund-update.handler.ts +++ b/src/modules/transaction/transaction/domain/usecases/handlers/refund-update.handler.ts @@ -18,7 +18,7 @@ export class RefundUpdatedHandler if ( old_data.status != current_data.data || - event.data.op == OPERATION.DELETE + (event.data.op == OPERATION.DELETE && current_data.status != STATUS.DRAFT) ) { const queryRunner = this.dataService .getRepository()