From bcdf656d5dac296a9bd217ec6b4c97e8b48c7416 Mon Sep 17 00:00:00 2001 From: shancheas Date: Thu, 8 Aug 2024 15:34:34 +0700 Subject: [PATCH 1/4] fix: midtrans error total != qty * price --- .../midtrans/data/services/midtrans.service.ts | 8 ++++++-- .../usecases/helpers/mapping-transaction.helper.ts | 2 +- .../midtrans/infrastructure/midtrans.controller.ts | 11 +++++++++++ .../usecases/managers/confirm-transaction.manager.ts | 2 ++ 4 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/modules/configuration/midtrans/data/services/midtrans.service.ts b/src/modules/configuration/midtrans/data/services/midtrans.service.ts index 5a3d658..fbd328c 100644 --- a/src/modules/configuration/midtrans/data/services/midtrans.service.ts +++ b/src/modules/configuration/midtrans/data/services/midtrans.service.ts @@ -1,14 +1,14 @@ import { Injectable } from '@nestjs/common'; import { EventBus } from '@nestjs/cqrs'; import { mappingMidtransTransaction } from '../../domain/usecases/helpers/mapping-transaction.helper'; -const midtransClient = require('midtrans-client'); +import { Snap } from 'midtrans-client'; @Injectable() export class MidtransService { constructor(private eventBus: EventBus) {} get midtransInstance() { - return new midtransClient.Snap({ + return new Snap({ isProduction: false, serverKey: process.env.MIDTRANS_SERVER_KEY, clientKey: process.env.MIDTRANS_CLIENT_KEY, @@ -19,6 +19,10 @@ export class MidtransService { return await this.midtransInstance.transaction.status(orderId); } + async cancelOrder(orderId: string): Promise { + return await this.midtransInstance.transaction.cancel(orderId); + } + async create(body): Promise { const data = mappingMidtransTransaction(body); return await this.midtransInstance.createTransaction(data); diff --git a/src/modules/configuration/midtrans/domain/usecases/helpers/mapping-transaction.helper.ts b/src/modules/configuration/midtrans/domain/usecases/helpers/mapping-transaction.helper.ts index 0e6cb4c..5bcc510 100644 --- a/src/modules/configuration/midtrans/domain/usecases/helpers/mapping-transaction.helper.ts +++ b/src/modules/configuration/midtrans/domain/usecases/helpers/mapping-transaction.helper.ts @@ -2,7 +2,7 @@ export function mappingMidtransTransaction(transaction) { const item_details = transaction.items?.map((item) => { return { quantity: Number(item.qty), - price: Number(item.total_price), + price: Number(item.total_price) / Number(item.qty), name: item.item_name, category: item.item_category_name, }; diff --git a/src/modules/configuration/midtrans/infrastructure/midtrans.controller.ts b/src/modules/configuration/midtrans/infrastructure/midtrans.controller.ts index cd19a56..17df4cf 100644 --- a/src/modules/configuration/midtrans/infrastructure/midtrans.controller.ts +++ b/src/modules/configuration/midtrans/infrastructure/midtrans.controller.ts @@ -34,6 +34,17 @@ export class MidtransController { } } + @Get(':id/cancel') + async cancel(@Param('id') id: string) { + try { + const data = await this.dataService.cancelOrder(id); + return data; + } catch (error) { + console.log(error.message); + throw new Error('Gagal update status transaksi'); + } + } + @Post('callback') async callback(@Body() callback: MidtransDto) { const data = await this.dataService.getStatus(callback?.order_id); diff --git a/src/modules/transaction/transaction/domain/usecases/managers/confirm-transaction.manager.ts b/src/modules/transaction/transaction/domain/usecases/managers/confirm-transaction.manager.ts index 2a8bc73..f122f0e 100644 --- a/src/modules/transaction/transaction/domain/usecases/managers/confirm-transaction.manager.ts +++ b/src/modules/transaction/transaction/domain/usecases/managers/confirm-transaction.manager.ts @@ -14,6 +14,7 @@ import { TransactionChangeStatusEvent } from '../../entities/event/transaction-c import { STATUS } from 'src/core/strings/constants/base.constants'; import { generateInvoiceCodeHelper } from './helpers/generate-invoice-code.helper'; import { TransactionPaymentType } from '../../../constants'; +import { apm } from 'src/core/apm'; @Injectable() export class ConfirmTransactionManager extends BaseUpdateStatusManager { @@ -47,6 +48,7 @@ export class ConfirmTransactionManager extends BaseUpdateStatusManager Date: Thu, 8 Aug 2024 15:47:39 +0700 Subject: [PATCH 2/4] fix(SPG-817): send email when status expired --- .../mail/domain/handlers/payment-transaction.handler.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/configuration/mail/domain/handlers/payment-transaction.handler.ts b/src/modules/configuration/mail/domain/handlers/payment-transaction.handler.ts index 30955b4..60231a8 100644 --- a/src/modules/configuration/mail/domain/handlers/payment-transaction.handler.ts +++ b/src/modules/configuration/mail/domain/handlers/payment-transaction.handler.ts @@ -215,7 +215,7 @@ export class PaymentTransactionHandler else if ( !from_refund && old_data.status != current_data.status && - [STATUS.PENDING].includes(current_data.status) + [STATUS.PENDING, STATUS.EXPIRED].includes(current_data.status) ) { const pdf = await GeneratePdf( transaction, From a61f8b853de9ca71a6f10c320f640b6ec7727e0e Mon Sep 17 00:00:00 2001 From: shancheas Date: Thu, 8 Aug 2024 17:07:03 +0700 Subject: [PATCH 3/4] fix(SPG-817): invoice expired not send email --- .../handlers/payment-transaction.handler.ts | 24 +++++++++++++++++-- .../midtrans-transaction-callback.handler.ts | 2 +- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/modules/configuration/mail/domain/handlers/payment-transaction.handler.ts b/src/modules/configuration/mail/domain/handlers/payment-transaction.handler.ts index 60231a8..7779add 100644 --- a/src/modules/configuration/mail/domain/handlers/payment-transaction.handler.ts +++ b/src/modules/configuration/mail/domain/handlers/payment-transaction.handler.ts @@ -10,6 +10,7 @@ import { TransactionUpdatedEvent } from 'src/modules/transaction/transaction/dom import { RefundChangeStatusEvent } from 'src/modules/transaction/refund/domain/entities/event/refund-change-status.event'; import { RefundCreatedEvent } from 'src/modules/transaction/refund/domain/entities/event/refund-created.event'; import { TABLE_NAME } from 'src/core/strings/constants/table.constants'; +import { Logger } from '@nestjs/common'; @EventsHandler( TransactionChangeStatusEvent, @@ -38,7 +39,7 @@ export class PaymentTransactionHandler }, }); - const transaction = await this.dataService.getOneByOptions({ + let transaction = await this.dataService.getOneByOptions({ where: { id: data_id, }, @@ -50,6 +51,20 @@ export class PaymentTransactionHandler ], }); + if (!transaction) { + transaction = await this.dataService.getOneByOptions({ + where: { + id: event.data.id, + }, + relations: [ + 'items', + 'refunds', + 'refunds.refund_items', + 'refunds.refund_items.transaction_item', + ], + }); + } + Object.assign(transaction, { booking_date: new Date(transaction.booking_date).toDateString(), booking_date_before: new Date( @@ -101,6 +116,7 @@ export class PaymentTransactionHandler transaction['refund'] && [STATUS.DRAFT].includes(transaction['refund'].status) ) { + Logger.verbose('Send Refund Request', 'PaymentTransaction'); const pdf = await GeneratePdf( transaction, InvoiceType.REFUND_REQUEST, @@ -130,6 +146,7 @@ export class PaymentTransactionHandler transaction['refund'] && transaction['refund'].status == STATUS.REFUNDED ) { + Logger.verbose('Send Refund Confirmation', 'PaymentTransaction'); const pdf = await GeneratePdf( transaction, InvoiceType.REFUND_CONFIRMATION, @@ -159,6 +176,7 @@ export class PaymentTransactionHandler old_data.status != current_data.status && [STATUS.ACTIVE, STATUS.SETTLED].includes(current_data.status) ) { + Logger.verbose('Send Payment Settled', 'PaymentTransaction'); const pdf = await GeneratePdf( transaction, InvoiceType.PAYMENT_CONFIRMATION, @@ -188,6 +206,7 @@ export class PaymentTransactionHandler old_data.status != current_data.status && [STATUS.PENDING].includes(current_data.status) ) { + Logger.verbose('Send Confirmation to Pending', 'PaymentTransaction'); const pdf = await GeneratePdf( transaction, InvoiceType.BOOKING_INVOICE, @@ -210,13 +229,13 @@ export class PaymentTransactionHandler pdf, ); } - // payment expired else if ( !from_refund && old_data.status != current_data.status && [STATUS.PENDING, STATUS.EXPIRED].includes(current_data.status) ) { + Logger.verbose('Send Payment Expired', 'PaymentTransaction'); const pdf = await GeneratePdf( transaction, InvoiceType.INVOICE_EXPIRED, @@ -248,6 +267,7 @@ export class PaymentTransactionHandler current_data.status, ) ) { + Logger.verbose('Send Change Booking Date', 'PaymentTransaction'); const pdf = await GeneratePdf( transaction, InvoiceType.BOOKING_DATE_CHANGE, diff --git a/src/modules/transaction/transaction/domain/usecases/handlers/midtrans-transaction-callback.handler.ts b/src/modules/transaction/transaction/domain/usecases/handlers/midtrans-transaction-callback.handler.ts index f116154..01cc894 100644 --- a/src/modules/transaction/transaction/domain/usecases/handlers/midtrans-transaction-callback.handler.ts +++ b/src/modules/transaction/transaction/domain/usecases/handlers/midtrans-transaction-callback.handler.ts @@ -60,7 +60,7 @@ export class MidtransCallbackHandler new TransactionChangeStatusEvent({ id: data_id, old: old_data, - data: data, + data: { ...data, status: transaction.status }, user: BLANK_USER, description: 'Midtrans Callback', module: TABLE_NAME.TRANSACTION, From e9c819987ed6c91e9c7b3ede65b39e7588ad1659 Mon Sep 17 00:00:00 2001 From: shancheas Date: Thu, 8 Aug 2024 17:27:51 +0700 Subject: [PATCH 4/4] fix: add payment_midtrans_url to transactions --- .../domain/usecases/managers/detail-transaction.manager.ts | 2 ++ .../domain/usecases/managers/index-transaction.manager.ts | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/modules/transaction/transaction/domain/usecases/managers/detail-transaction.manager.ts b/src/modules/transaction/transaction/domain/usecases/managers/detail-transaction.manager.ts index 49a7213..806b602 100644 --- a/src/modules/transaction/transaction/domain/usecases/managers/detail-transaction.manager.ts +++ b/src/modules/transaction/transaction/domain/usecases/managers/detail-transaction.manager.ts @@ -81,6 +81,8 @@ export class DetailTransactionManager extends BaseDetailManager `${this.tableName}.payment_type_method_name`, `${this.tableName}.payment_type_method_number`, + `${this.tableName}.payment_midtrans_url`, + `refunds.id`, `refunds.code`, `refunds.refund_date`,