diff --git a/src/main/java/com/dangsim/payment/entity/Payment.java b/src/main/java/com/dangsim/payment/entity/Payment.java index c4ac01d..8410861 100644 --- a/src/main/java/com/dangsim/payment/entity/Payment.java +++ b/src/main/java/com/dangsim/payment/entity/Payment.java @@ -103,8 +103,8 @@ public static Payment of(BigDecimal reward, PaymentStatus status, String merchan } - public void updatePaymentSuccessStatus(PaymentStatus successPaymentStatus) { - this.status = successPaymentStatus; + public void updateStatus(PaymentStatus status) { + this.status = status; } public void updatePerformer(User performer) { diff --git a/src/main/java/com/dangsim/pg/service/PaymentGatewayService.java b/src/main/java/com/dangsim/pg/service/PaymentGatewayService.java index 8916626..81fd5b3 100644 --- a/src/main/java/com/dangsim/pg/service/PaymentGatewayService.java +++ b/src/main/java/com/dangsim/pg/service/PaymentGatewayService.java @@ -163,6 +163,6 @@ public void updatePaymentAndTaskStatus(String merchantUid) { .orElseThrow(() -> new BaseException(PaymentErrorCode.NOT_FOUND_PAYMENT)); // 상태 업데이트 - payment.updatePaymentSuccessStatus(PaymentStatus.PAYMENT_SUCCESSES); + payment.updateStatus(PaymentStatus.PAYMENT_SUCCESSES); } } \ No newline at end of file diff --git a/src/main/java/com/dangsim/reward/entity/Reward.java b/src/main/java/com/dangsim/reward/entity/Reward.java index 2ee55b8..50dfc38 100644 --- a/src/main/java/com/dangsim/reward/entity/Reward.java +++ b/src/main/java/com/dangsim/reward/entity/Reward.java @@ -58,17 +58,23 @@ public class Reward extends BaseEntity { private LocalDateTime completedAt; @Builder(access = PRIVATE) - public Reward(BigDecimal amount, Task task, User user, LocalDateTime completedAt) { + public Reward(BigDecimal beforeReward, BigDecimal amount, BigDecimal afterReward, + Task task, User user, LocalDateTime completedAt) { + this.beforeReward = beforeReward; this.amount = amount; + this.afterReward = afterReward; this.task = task; this.user = user; this.requestedAt = LocalDateTime.now(); this.completedAt = completedAt; } - public static Reward of(BigDecimal amount, Task task, User user, LocalDateTime completedAt) { + public static Reward of(BigDecimal beforeReward, BigDecimal amount, BigDecimal afterReward, + Task task, User user, LocalDateTime completedAt) { return Reward.builder() + .beforeReward(beforeReward) .amount(amount) + .afterReward(afterReward) .task(task) .user(user) .requestedAt(LocalDateTime.now()) diff --git a/src/main/java/com/dangsim/reward/service/RewardService.java b/src/main/java/com/dangsim/reward/service/RewardService.java index e725b72..2357cc6 100644 --- a/src/main/java/com/dangsim/reward/service/RewardService.java +++ b/src/main/java/com/dangsim/reward/service/RewardService.java @@ -2,6 +2,7 @@ import com.dangsim.chat.entity.ChatRoom; import com.dangsim.chat.repository.ChatRoomRepository; +import com.dangsim.common.exception.runtime.BaseException; import com.dangsim.payment.entity.Payment; import com.dangsim.payment.repository.PaymentRepository; import com.dangsim.reward.dto.response.RewardChatResponse; @@ -19,6 +20,8 @@ import java.math.BigDecimal; import java.time.LocalDateTime; +import static com.dangsim.user.exception.UserErrorCode.USER_NOT_FOUND; + @Service @RequiredArgsConstructor public class RewardService { @@ -59,16 +62,23 @@ public Reward updateRewardByTaskCompleteBtn(Long chatId) { BigDecimal afterReward = beforeReward.add(rewardAmount); // 6. User reward 값 업데이트 - performer.updateReward(afterReward); +// performer.updateReward(afterReward); + User managedUser = userRepository.findById(performer.getId()) + .orElseThrow(() -> new BaseException(USER_NOT_FOUND)); + managedUser.updateReward(afterReward); + userRepository.save(performer); // 7. 정산 내역 저장 Reward statement = Reward.of( + beforeReward, rewardAmount, + afterReward, task, performer, LocalDateTime.now() ); + rewardStatementRepository.save(statement); return statement; diff --git a/src/main/java/com/dangsim/task/service/TaskService.java b/src/main/java/com/dangsim/task/service/TaskService.java index 85f4729..deae0b5 100644 --- a/src/main/java/com/dangsim/task/service/TaskService.java +++ b/src/main/java/com/dangsim/task/service/TaskService.java @@ -1,11 +1,18 @@ package com.dangsim.task.service; import static com.dangsim.payment.entity.PaymentStatus.*; +import static com.dangsim.payment.entity.QPayment.payment; import static com.dangsim.task.entity.TaskStatus.*; +import static com.dangsim.user.exception.UserErrorCode.USER_NOT_FOUND; +import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.Objects; +import com.dangsim.payment.entity.PaymentStatus; +import com.dangsim.reward.entity.Reward; +import com.dangsim.reward.repository.RewardRepository; +import com.dangsim.user.repository.UserRepository; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -45,6 +52,8 @@ public class TaskService { private final PaymentRepository paymentRepository; private final ChatRoomRepository chatRoomRepository; private final ChatMessageRepository chatMessageRepository; + private final RewardRepository rewardRepository; + private final UserRepository userRepository; @Transactional public TaskResponseDto createTask(TaskRequestDto requestDto, User user) { @@ -96,8 +105,34 @@ public TaskDeleteResponse deleteTaskById(Long taskId, User user) { validateNotAssigned(findTask); + // 작성자(요청자)의 리워드 환불 + BigDecimal beforeReward = user.getReward(); + BigDecimal taskReward = findTask.getReward(); + BigDecimal afterReward = beforeReward.add(taskReward); + + // 리워드 정산 기록 + Reward rewardRecord = Reward.of( + beforeReward, + taskReward, + afterReward, + findTask, + user, + LocalDateTime.now() + ); + + // 사용자 리워드 업데이트 + User managedUser = userRepository.findById(user.getId()) + .orElseThrow(() -> new BaseException(USER_NOT_FOUND)); + managedUser.updateReward(afterReward); + + rewardRepository.save(rewardRecord); + + // payment status 업데이트 + Payment payment = paymentRepository.findByTaskId(findTask.getId()) + .orElseThrow(() -> new BaseException(PaymentErrorCode.NOT_FOUND_PAYMENT));; + payment.updateStatus(PaymentStatus.PAYMENT_REFUNDED); + findTask.updateStatus(TASK_DELETE); - // TODO 소원님: Payment, PG 등등 상태 환블로 변경 return new TaskDeleteResponse(true); } diff --git a/src/test/java/com/dangsim/task/service/TaskServiceTest.java b/src/test/java/com/dangsim/task/service/TaskServiceTest.java index 60f1034..bff4b03 100644 --- a/src/test/java/com/dangsim/task/service/TaskServiceTest.java +++ b/src/test/java/com/dangsim/task/service/TaskServiceTest.java @@ -13,6 +13,9 @@ import java.util.List; import java.util.Optional; +import com.dangsim.reward.entity.Reward; +import com.dangsim.reward.repository.RewardRepository; +import com.dangsim.user.repository.UserRepository; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -72,6 +75,12 @@ public class TaskServiceTest { @InjectMocks PaymentGatewayService paymentGatewayService; + @Mock + UserRepository userRepository; + + @Mock + RewardRepository rewardRepository; + @DisplayName("일치하는 심부름 요청이 없으면 예외가 발생한다.") @Test void throwNotFoundExceptionWhenNotExistTaskByTaskId() { @@ -307,6 +316,9 @@ void deleteTaskByOwnerAndNotMatched() { ReflectionTestUtils.setField(task, "status", TASK_NOT_ASSIGNED); given(taskRepository.findById(any(Long.class))).willReturn(Optional.of(task)); + given(userRepository.findById(requester.getId())).willReturn(Optional.of(requester)); + given(paymentRepository.findByTaskId(any())).willReturn(Optional.of(mock(Payment.class))); + given(rewardRepository.save(any())).willReturn(mock(Reward.class)); // when TaskDeleteResponse responseDto = taskService.deleteTaskById(task.getId(), requester);