From 971687936ff3340d26aef6eb1092e1346d6019a3 Mon Sep 17 00:00:00 2001 From: KNU-K Date: Mon, 11 Aug 2025 14:54:50 +0900 Subject: [PATCH 1/4] feat: update refund processing to change payment status to ABORTED and filter payments by DONE status --- .../application/refund/RefundService.java | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/main/java/life/mosu/mosuserver/application/refund/RefundService.java b/src/main/java/life/mosu/mosuserver/application/refund/RefundService.java index 2cbbff09..3c08190a 100644 --- a/src/main/java/life/mosu/mosuserver/application/refund/RefundService.java +++ b/src/main/java/life/mosu/mosuserver/application/refund/RefundService.java @@ -1,6 +1,8 @@ package life.mosu.mosuserver.application.refund; import life.mosu.mosuserver.application.refund.processor.TossRefundProcessor; +import life.mosu.mosuserver.domain.payment.entity.PaymentJpaEntity; +import life.mosu.mosuserver.domain.payment.entity.PaymentStatus; import life.mosu.mosuserver.domain.payment.projection.PaymentWithLunchProjection; import life.mosu.mosuserver.domain.payment.repository.PaymentJpaRepository; import life.mosu.mosuserver.domain.refund.entity.RefundJpaEntity; @@ -48,14 +50,23 @@ public void doProcess(Long userId, MergedRefundRequest request) { PaymentWithLunchProjection targetPayment = findPaymentOrThrow(paymentKey, examApplicationId); + log.info("target payment log : {}", targetPayment); int totalQuantity = getTotalPaymentCount(paymentKey); + + log.info("total quantity log : {}", totalQuantity); + int refundAmount = calculateRefundAmount(totalQuantity, targetPayment.lunchChecked()); RefundJpaEntity refundEntity = processRefund(request, refundAmount, targetPayment.examApplicationId()); try { refundJpaRepository.save(refundEntity); + PaymentJpaEntity payment = paymentJpaRepository.findByExamApplicationId( + targetPayment.examApplicationId()) + .orElseThrow(() -> new CustomRuntimeException(ErrorCode.PAYMENT_NOT_FOUND)); + + payment.changeStatus(PaymentStatus.ABORTED); eventTxService.publishSuccessEvent(refundEntity.getTransactionKey(), refundAmount, userId, targetPayment.examId(), examApplicationId); } catch (Exception e) { @@ -75,7 +86,8 @@ private PaymentWithLunchProjection findPaymentOrThrow(String paymentKey, } private int getTotalPaymentCount(String paymentKey) { - return paymentJpaRepository.findByPaymentKey(paymentKey).size(); + return paymentJpaRepository.findByPaymentKeyAndPaymentStatus(paymentKey, PaymentStatus.DONE) + .size(); } private int calculateRefundAmount(int totalQuantity, boolean lunchChecked) { From 37b8e9c1081931cb886832547016d455594f80cf Mon Sep 17 00:00:00 2001 From: KNU-K Date: Mon, 11 Aug 2025 14:54:56 +0900 Subject: [PATCH 2/4] feat: add method to find payments by status and exam application ID in PaymentJpaRepository --- .../domain/payment/repository/PaymentJpaRepository.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/java/life/mosu/mosuserver/domain/payment/repository/PaymentJpaRepository.java b/src/main/java/life/mosu/mosuserver/domain/payment/repository/PaymentJpaRepository.java index 32d1becd..c45efc26 100644 --- a/src/main/java/life/mosu/mosuserver/domain/payment/repository/PaymentJpaRepository.java +++ b/src/main/java/life/mosu/mosuserver/domain/payment/repository/PaymentJpaRepository.java @@ -2,7 +2,9 @@ import java.time.LocalDateTime; import java.util.List; +import java.util.Optional; import life.mosu.mosuserver.domain.payment.entity.PaymentJpaEntity; +import life.mosu.mosuserver.domain.payment.entity.PaymentStatus; import life.mosu.mosuserver.domain.payment.projection.PaymentWithLunchProjection; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; @@ -34,7 +36,8 @@ public interface PaymentJpaRepository extends JpaRepository findByPaymentKeyWithLunch(String paymentKey); - List findByPaymentKey(String paymentKey); + List findByPaymentKeyAndPaymentStatus(String paymentKey, + PaymentStatus status); @Query(""" SELECT p @@ -43,4 +46,6 @@ public interface PaymentJpaRepository extends JpaRepository findFailedPayments(@Param("time") LocalDateTime time); + + Optional findByExamApplicationId(Long examApplicationId); } From 04fe08c6654e16c1c849515a3d8864320b246868 Mon Sep 17 00:00:00 2001 From: KNU-K Date: Mon, 11 Aug 2025 14:55:02 +0900 Subject: [PATCH 3/4] feat: remove payment deletion by exam application ID after refund notification --- .../mosuserver/application/refund/tx/RefundTxEventListener.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/life/mosu/mosuserver/application/refund/tx/RefundTxEventListener.java b/src/main/java/life/mosu/mosuserver/application/refund/tx/RefundTxEventListener.java index 0779b23e..dccc27df 100644 --- a/src/main/java/life/mosu/mosuserver/application/refund/tx/RefundTxEventListener.java +++ b/src/main/java/life/mosu/mosuserver/application/refund/tx/RefundTxEventListener.java @@ -35,7 +35,6 @@ public void afterCommitHandler(RefundTxEvent event) { RefundContext ctx = event.getContext(); quotaSyncService.sync(ctx.examId()); log.info("[AFTER_COMMIT] 환불 성공 후 알림톡 발송 시작: orderId={}", ctx.transactionKey()); - paymentJpaRepository.deleteByExamApplicationId(ctx.examApplicationId()); sendNotification(ctx.userId(), ctx.examApplicationId()); } From 0fc0ead6184c7cb6cea386366606c90676ab5516 Mon Sep 17 00:00:00 2001 From: KNU-K Date: Mon, 11 Aug 2025 17:04:43 +0900 Subject: [PATCH 4/4] feat: update method to find exam application by application ID in CreateVirtualAccountProcessor --- .../processor/CreateVirtualAccountProcessor.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/life/mosu/mosuserver/application/virtualaccount/processor/CreateVirtualAccountProcessor.java b/src/main/java/life/mosu/mosuserver/application/virtualaccount/processor/CreateVirtualAccountProcessor.java index a0b72233..581a5406 100644 --- a/src/main/java/life/mosu/mosuserver/application/virtualaccount/processor/CreateVirtualAccountProcessor.java +++ b/src/main/java/life/mosu/mosuserver/application/virtualaccount/processor/CreateVirtualAccountProcessor.java @@ -30,7 +30,8 @@ public class CreateVirtualAccountProcessor implements @Override public VirtualAccountResponse process(CreateVirtualAccountRequest request) { - var application = examApplicationJpaRepository.findById(request.applicationId()) + var application = examApplicationJpaRepository.findByApplicationId(request.applicationId()) + .stream().findFirst() .orElseThrow( () -> new CustomRuntimeException(ErrorCode.EXAM_APPLICATION_NOT_FOUND));