From 891b2fe69e3ed5db5295edd538c2abdc89b08699 Mon Sep 17 00:00:00 2001 From: KyuCheol Hwang Date: Thu, 18 Jan 2024 16:06:49 +0900 Subject: [PATCH 01/16] =?UTF-8?q?feat:=20=EC=83=81=ED=92=88=20=EA=B3=84?= =?UTF-8?q?=EC=A2=8C=20=EB=B2=88=ED=98=B8=20=ED=8C=8C=EC=8B=B1=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=EC=9C=A0=ED=8B=B8=20=ED=81=B4=EB=9E=98=EC=8A=A4=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 상품 계좌 번호 파싱하는 유틸 클래스 구현 --- .../common/utils/AccountNumberSplitter.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 src/main/java/kr/co/fastcampus/yanabada/common/utils/AccountNumberSplitter.java diff --git a/src/main/java/kr/co/fastcampus/yanabada/common/utils/AccountNumberSplitter.java b/src/main/java/kr/co/fastcampus/yanabada/common/utils/AccountNumberSplitter.java new file mode 100644 index 00000000..b2b0ed7a --- /dev/null +++ b/src/main/java/kr/co/fastcampus/yanabada/common/utils/AccountNumberSplitter.java @@ -0,0 +1,16 @@ +package kr.co.fastcampus.yanabada.common.utils; + +import lombok.AccessLevel; +import lombok.NoArgsConstructor; + +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class AccountNumberSplitter { + + private static final int LENGTH = 4; + + public static String split(String accountNumber) { + int beginIndex = accountNumber.length() - LENGTH; + + return accountNumber.substring(beginIndex); + } +} From 24c77515642d8c1763d0b29e26b5b4e4800b0363 Mon Sep 17 00:00:00 2001 From: KyuCheol Hwang Date: Thu, 18 Jan 2024 16:07:24 +0900 Subject: [PATCH 02/16] =?UTF-8?q?feat:=20=EC=95=BC=EB=86=80=EC=9E=90=20?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=20=EA=B4=80=EB=A0=A8=20=EC=98=88=EC=99=B8=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 야놀자 페이 관련 예외 구현 --- .../common/exception/DuplicateYanoljaPayException.java | 9 +++++++++ .../exception/IncorrectYanoljaPayPasswordException.java | 9 +++++++++ .../common/exception/NotEnoughPointException.java | 9 +++++++++ .../exception/NotEnoughYanoljaPayBalanceException.java | 9 +++++++++ 4 files changed, 36 insertions(+) create mode 100644 src/main/java/kr/co/fastcampus/yanabada/common/exception/DuplicateYanoljaPayException.java create mode 100644 src/main/java/kr/co/fastcampus/yanabada/common/exception/IncorrectYanoljaPayPasswordException.java create mode 100644 src/main/java/kr/co/fastcampus/yanabada/common/exception/NotEnoughPointException.java create mode 100644 src/main/java/kr/co/fastcampus/yanabada/common/exception/NotEnoughYanoljaPayBalanceException.java diff --git a/src/main/java/kr/co/fastcampus/yanabada/common/exception/DuplicateYanoljaPayException.java b/src/main/java/kr/co/fastcampus/yanabada/common/exception/DuplicateYanoljaPayException.java new file mode 100644 index 00000000..b7108c47 --- /dev/null +++ b/src/main/java/kr/co/fastcampus/yanabada/common/exception/DuplicateYanoljaPayException.java @@ -0,0 +1,9 @@ +package kr.co.fastcampus.yanabada.common.exception; + +import static kr.co.fastcampus.yanabada.common.response.ErrorCode.DUPLICATE_YANOLJAPAY; + +public class DuplicateYanoljaPayException extends BaseException { + public DuplicateYanoljaPayException() { + super(DUPLICATE_YANOLJAPAY.getMessage()); + } +} diff --git a/src/main/java/kr/co/fastcampus/yanabada/common/exception/IncorrectYanoljaPayPasswordException.java b/src/main/java/kr/co/fastcampus/yanabada/common/exception/IncorrectYanoljaPayPasswordException.java new file mode 100644 index 00000000..e1f3590b --- /dev/null +++ b/src/main/java/kr/co/fastcampus/yanabada/common/exception/IncorrectYanoljaPayPasswordException.java @@ -0,0 +1,9 @@ +package kr.co.fastcampus.yanabada.common.exception; + +import static kr.co.fastcampus.yanabada.common.response.ErrorCode.INCORRECT_YANOLJAPAY_PASSWORD; + +public class IncorrectYanoljaPayPasswordException extends BaseException { + public IncorrectYanoljaPayPasswordException() { + super(INCORRECT_YANOLJAPAY_PASSWORD.getMessage()); + } +} diff --git a/src/main/java/kr/co/fastcampus/yanabada/common/exception/NotEnoughPointException.java b/src/main/java/kr/co/fastcampus/yanabada/common/exception/NotEnoughPointException.java new file mode 100644 index 00000000..27eeb094 --- /dev/null +++ b/src/main/java/kr/co/fastcampus/yanabada/common/exception/NotEnoughPointException.java @@ -0,0 +1,9 @@ +package kr.co.fastcampus.yanabada.common.exception; + +import static kr.co.fastcampus.yanabada.common.response.ErrorCode.NOT_ENOUGH_POINT; + +public class NotEnoughPointException extends BaseException { + public NotEnoughPointException() { + super(NOT_ENOUGH_POINT.getMessage()); + } +} diff --git a/src/main/java/kr/co/fastcampus/yanabada/common/exception/NotEnoughYanoljaPayBalanceException.java b/src/main/java/kr/co/fastcampus/yanabada/common/exception/NotEnoughYanoljaPayBalanceException.java new file mode 100644 index 00000000..92bda97f --- /dev/null +++ b/src/main/java/kr/co/fastcampus/yanabada/common/exception/NotEnoughYanoljaPayBalanceException.java @@ -0,0 +1,9 @@ +package kr.co.fastcampus.yanabada.common.exception; + +import static kr.co.fastcampus.yanabada.common.response.ErrorCode.NOT_ENOUGH_YANOLJAPAY_BALANCE; + +public class NotEnoughYanoljaPayBalanceException extends BaseException { + public NotEnoughYanoljaPayBalanceException() { + super(NOT_ENOUGH_YANOLJAPAY_BALANCE.getMessage()); + } +} From 10011c9c1248e450ab81007d221a00e19b3167f3 Mon Sep 17 00:00:00 2001 From: KyuCheol Hwang Date: Thu, 18 Jan 2024 16:07:50 +0900 Subject: [PATCH 03/16] =?UTF-8?q?feat:=20=EC=95=BC=EB=86=80=EC=9E=90=20?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=20=EA=B4=80=EB=A0=A8=20=EC=9A=94=EC=B2=AD=20?= =?UTF-8?q?=EB=B0=8F=20=EC=9D=91=EB=8B=B5=20DTO=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 야놀자 페이 관련 요청 및 응답 DTO 구현 --- .../dto/request/YanoljaPayAmountRequest.java | 16 +++++++++++ .../YanoljaPayHistorySearchRequest.java | 12 ++++++++ .../dto/request/YanoljaPaySaveRequest.java | 19 +++++++++++++ .../response/YanoljaPayHistoryIdResponse.java | 15 ++++++++++ .../YanoljaPayHistoryInfoResponse.java | 27 ++++++++++++++++++ .../YanoljaPayHistorySummaryPageResponse.java | 28 +++++++++++++++++++ .../YanoljaPayHistorySummaryResponse.java | 25 +++++++++++++++++ .../dto/response/YanoljaPayInfoResponse.java | 19 +++++++++++++ .../response/YanoljaPaySummaryResponse.java | 18 ++++++++++++ 9 files changed, 179 insertions(+) create mode 100644 src/main/java/kr/co/fastcampus/yanabada/domain/payment/dto/request/YanoljaPayAmountRequest.java create mode 100644 src/main/java/kr/co/fastcampus/yanabada/domain/payment/dto/request/YanoljaPayHistorySearchRequest.java create mode 100644 src/main/java/kr/co/fastcampus/yanabada/domain/payment/dto/request/YanoljaPaySaveRequest.java create mode 100644 src/main/java/kr/co/fastcampus/yanabada/domain/payment/dto/response/YanoljaPayHistoryIdResponse.java create mode 100644 src/main/java/kr/co/fastcampus/yanabada/domain/payment/dto/response/YanoljaPayHistoryInfoResponse.java create mode 100644 src/main/java/kr/co/fastcampus/yanabada/domain/payment/dto/response/YanoljaPayHistorySummaryPageResponse.java create mode 100644 src/main/java/kr/co/fastcampus/yanabada/domain/payment/dto/response/YanoljaPayHistorySummaryResponse.java create mode 100644 src/main/java/kr/co/fastcampus/yanabada/domain/payment/dto/response/YanoljaPayInfoResponse.java create mode 100644 src/main/java/kr/co/fastcampus/yanabada/domain/payment/dto/response/YanoljaPaySummaryResponse.java diff --git a/src/main/java/kr/co/fastcampus/yanabada/domain/payment/dto/request/YanoljaPayAmountRequest.java b/src/main/java/kr/co/fastcampus/yanabada/domain/payment/dto/request/YanoljaPayAmountRequest.java new file mode 100644 index 00000000..fec02cec --- /dev/null +++ b/src/main/java/kr/co/fastcampus/yanabada/domain/payment/dto/request/YanoljaPayAmountRequest.java @@ -0,0 +1,16 @@ +package kr.co.fastcampus.yanabada.domain.payment.dto.request; + +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Positive; + +public record YanoljaPayAmountRequest( + @NotNull + @Positive + Long amount, + + @NotEmpty + String simplePassword +) { + +} diff --git a/src/main/java/kr/co/fastcampus/yanabada/domain/payment/dto/request/YanoljaPayHistorySearchRequest.java b/src/main/java/kr/co/fastcampus/yanabada/domain/payment/dto/request/YanoljaPayHistorySearchRequest.java new file mode 100644 index 00000000..e947bf0e --- /dev/null +++ b/src/main/java/kr/co/fastcampus/yanabada/domain/payment/dto/request/YanoljaPayHistorySearchRequest.java @@ -0,0 +1,12 @@ +package kr.co.fastcampus.yanabada.domain.payment.dto.request; + +import java.util.List; +import kr.co.fastcampus.yanabada.domain.payment.entity.enums.TransactionType; + +public record YanoljaPayHistorySearchRequest( + List types, + Integer page, + Integer size +) { + +} diff --git a/src/main/java/kr/co/fastcampus/yanabada/domain/payment/dto/request/YanoljaPaySaveRequest.java b/src/main/java/kr/co/fastcampus/yanabada/domain/payment/dto/request/YanoljaPaySaveRequest.java new file mode 100644 index 00000000..b7a943e4 --- /dev/null +++ b/src/main/java/kr/co/fastcampus/yanabada/domain/payment/dto/request/YanoljaPaySaveRequest.java @@ -0,0 +1,19 @@ +package kr.co.fastcampus.yanabada.domain.payment.dto.request; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Pattern; + +public record YanoljaPaySaveRequest( + @NotBlank + @Pattern(regexp = "^\\d{6}$") + String simplePassword, + + @NotBlank + String bankName, + + @NotBlank + @Pattern(regexp = "^\\d{10,14}$") + String accountNumber +) { + +} diff --git a/src/main/java/kr/co/fastcampus/yanabada/domain/payment/dto/response/YanoljaPayHistoryIdResponse.java b/src/main/java/kr/co/fastcampus/yanabada/domain/payment/dto/response/YanoljaPayHistoryIdResponse.java new file mode 100644 index 00000000..5c21078a --- /dev/null +++ b/src/main/java/kr/co/fastcampus/yanabada/domain/payment/dto/response/YanoljaPayHistoryIdResponse.java @@ -0,0 +1,15 @@ +package kr.co.fastcampus.yanabada.domain.payment.dto.response; + +import kr.co.fastcampus.yanabada.domain.payment.entity.YanoljaPayHistory; +import lombok.Builder; + +@Builder +public record YanoljaPayHistoryIdResponse( + Long yanoljaPayHistoryId +) { + public static YanoljaPayHistoryIdResponse from(YanoljaPayHistory yanoljaPayHistory) { + return YanoljaPayHistoryIdResponse.builder() + .yanoljaPayHistoryId(yanoljaPayHistory.getId()) + .build(); + } +} diff --git a/src/main/java/kr/co/fastcampus/yanabada/domain/payment/dto/response/YanoljaPayHistoryInfoResponse.java b/src/main/java/kr/co/fastcampus/yanabada/domain/payment/dto/response/YanoljaPayHistoryInfoResponse.java new file mode 100644 index 00000000..a4284f77 --- /dev/null +++ b/src/main/java/kr/co/fastcampus/yanabada/domain/payment/dto/response/YanoljaPayHistoryInfoResponse.java @@ -0,0 +1,27 @@ +package kr.co.fastcampus.yanabada.domain.payment.dto.response; + +import kr.co.fastcampus.yanabada.domain.payment.entity.YanoljaPay; +import kr.co.fastcampus.yanabada.domain.payment.entity.YanoljaPayHistory; +import kr.co.fastcampus.yanabada.domain.payment.entity.enums.TransactionType; +import lombok.Builder; + +@Builder +public record YanoljaPayHistoryInfoResponse( + TransactionType type, + Long amount, + String bankName, + String bankAccount, + Long balance +) { + public static YanoljaPayHistoryInfoResponse from(YanoljaPayHistory yanoljaPayHistory) { + YanoljaPay yanoljaPay = yanoljaPayHistory.getYanoljaPay(); + + return YanoljaPayHistoryInfoResponse.builder() + .type(yanoljaPayHistory.getTransactionType()) + .amount(yanoljaPayHistory.getTransactionAmount()) + .bankName(yanoljaPay.getBankName()) + .bankAccount(yanoljaPay.getAccountNumber()) + .balance(yanoljaPay.getBalance()) + .build(); + } +} diff --git a/src/main/java/kr/co/fastcampus/yanabada/domain/payment/dto/response/YanoljaPayHistorySummaryPageResponse.java b/src/main/java/kr/co/fastcampus/yanabada/domain/payment/dto/response/YanoljaPayHistorySummaryPageResponse.java new file mode 100644 index 00000000..8a7e566b --- /dev/null +++ b/src/main/java/kr/co/fastcampus/yanabada/domain/payment/dto/response/YanoljaPayHistorySummaryPageResponse.java @@ -0,0 +1,28 @@ +package kr.co.fastcampus.yanabada.domain.payment.dto.response; + +import java.util.List; +import java.util.stream.Collectors; +import kr.co.fastcampus.yanabada.domain.payment.entity.YanoljaPayHistory; +import lombok.Builder; +import org.springframework.data.domain.Page; + +@Builder +public record YanoljaPayHistorySummaryPageResponse( + List histories, + long totalElements, + int totalPages +) { + + public static YanoljaPayHistorySummaryPageResponse from(Page page) { + return YanoljaPayHistorySummaryPageResponse.builder() + .histories( + page.getContent() + .stream() + .map(YanoljaPayHistorySummaryResponse::from) + .collect(Collectors.toList()) + ) + .totalElements(page.getTotalElements()) + .totalPages(page.getTotalPages()) + .build(); + } +} diff --git a/src/main/java/kr/co/fastcampus/yanabada/domain/payment/dto/response/YanoljaPayHistorySummaryResponse.java b/src/main/java/kr/co/fastcampus/yanabada/domain/payment/dto/response/YanoljaPayHistorySummaryResponse.java new file mode 100644 index 00000000..dfe55439 --- /dev/null +++ b/src/main/java/kr/co/fastcampus/yanabada/domain/payment/dto/response/YanoljaPayHistorySummaryResponse.java @@ -0,0 +1,25 @@ +package kr.co.fastcampus.yanabada.domain.payment.dto.response; + +import java.time.LocalDateTime; +import kr.co.fastcampus.yanabada.domain.payment.entity.YanoljaPayHistory; +import kr.co.fastcampus.yanabada.domain.payment.entity.enums.TransactionType; +import lombok.Builder; + +@Builder +public record YanoljaPayHistorySummaryResponse( + Long historyId, + String contents, + Long amount, + TransactionType type, + LocalDateTime transactionTime +) { + public static YanoljaPayHistorySummaryResponse from(YanoljaPayHistory history) { + return YanoljaPayHistorySummaryResponse.builder() + .historyId(history.getId()) + .contents(history.getContents()) + .amount(history.getTransactionAmount()) + .type(history.getTransactionType()) + .transactionTime(history.getTransactionTime()) + .build(); + } +} diff --git a/src/main/java/kr/co/fastcampus/yanabada/domain/payment/dto/response/YanoljaPayInfoResponse.java b/src/main/java/kr/co/fastcampus/yanabada/domain/payment/dto/response/YanoljaPayInfoResponse.java new file mode 100644 index 00000000..8d85fa83 --- /dev/null +++ b/src/main/java/kr/co/fastcampus/yanabada/domain/payment/dto/response/YanoljaPayInfoResponse.java @@ -0,0 +1,19 @@ +package kr.co.fastcampus.yanabada.domain.payment.dto.response; + +import kr.co.fastcampus.yanabada.domain.payment.entity.YanoljaPay; +import lombok.Builder; + +@Builder +public record YanoljaPayInfoResponse( + Long balance, + String bankName, + String accountNumber +) { + public static YanoljaPayInfoResponse from(YanoljaPay yanoljaPay) { + return YanoljaPayInfoResponse.builder() + .balance(yanoljaPay.getBalance()) + .bankName(yanoljaPay.getBankName()) + .accountNumber(yanoljaPay.getAccountNumber()) + .build(); + } +} diff --git a/src/main/java/kr/co/fastcampus/yanabada/domain/payment/dto/response/YanoljaPaySummaryResponse.java b/src/main/java/kr/co/fastcampus/yanabada/domain/payment/dto/response/YanoljaPaySummaryResponse.java new file mode 100644 index 00000000..3c5c0860 --- /dev/null +++ b/src/main/java/kr/co/fastcampus/yanabada/domain/payment/dto/response/YanoljaPaySummaryResponse.java @@ -0,0 +1,18 @@ +package kr.co.fastcampus.yanabada.domain.payment.dto.response; + +import kr.co.fastcampus.yanabada.domain.payment.entity.YanoljaPay; +import lombok.Builder; + +@Builder +public record YanoljaPaySummaryResponse( + Long balance, + Boolean hasJoinedYanoljaPay +) { + + public static YanoljaPaySummaryResponse from(YanoljaPay yanoljaPay) { + return YanoljaPaySummaryResponse.builder() + .balance(yanoljaPay.getBalance()) + .hasJoinedYanoljaPay(yanoljaPay.getAccountNumber() != null) + .build(); + } +} From c203a2d76a86d7a2e3d37e5f970749547d4108ee Mon Sep 17 00:00:00 2001 From: KyuCheol Hwang Date: Thu, 18 Jan 2024 16:08:20 +0900 Subject: [PATCH 04/16] =?UTF-8?q?feat:=20=EC=95=BC=EB=86=80=EC=9E=90=20?= =?UTF-8?q?=ED=9E=88=EC=8A=A4=ED=86=A0=EB=A6=AC=20=EA=B4=80=EB=A0=A8=20?= =?UTF-8?q?=EC=98=88=EC=99=B8=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 야놀자 히스토리 관련 예외 구현 --- .../exception/YanoljaPayHistoryNotFoundException.java | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 src/main/java/kr/co/fastcampus/yanabada/common/exception/YanoljaPayHistoryNotFoundException.java diff --git a/src/main/java/kr/co/fastcampus/yanabada/common/exception/YanoljaPayHistoryNotFoundException.java b/src/main/java/kr/co/fastcampus/yanabada/common/exception/YanoljaPayHistoryNotFoundException.java new file mode 100644 index 00000000..3e36ef2f --- /dev/null +++ b/src/main/java/kr/co/fastcampus/yanabada/common/exception/YanoljaPayHistoryNotFoundException.java @@ -0,0 +1,10 @@ +package kr.co.fastcampus.yanabada.common.exception; + +import static kr.co.fastcampus.yanabada.common.response.ErrorCode.YANOLJAPAY_HISTORY_NOT_FOUND; + +public class YanoljaPayHistoryNotFoundException extends BaseException { + + public YanoljaPayHistoryNotFoundException() { + super(YANOLJAPAY_HISTORY_NOT_FOUND.getMessage()); + } +} From 39d643f53a24e0d3e7fd18f5a102c086186c80a9 Mon Sep 17 00:00:00 2001 From: KyuCheol Hwang Date: Thu, 18 Jan 2024 16:08:37 +0900 Subject: [PATCH 05/16] =?UTF-8?q?feat:=20=EC=98=88=EC=99=B8=20=EB=A9=94?= =?UTF-8?q?=EC=8B=9C=EC=A7=80=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 예외 메시지 구현 --- .../co/fastcampus/yanabada/common/response/ErrorCode.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/java/kr/co/fastcampus/yanabada/common/response/ErrorCode.java b/src/main/java/kr/co/fastcampus/yanabada/common/response/ErrorCode.java index 387d0f00..b06c2214 100644 --- a/src/main/java/kr/co/fastcampus/yanabada/common/response/ErrorCode.java +++ b/src/main/java/kr/co/fastcampus/yanabada/common/response/ErrorCode.java @@ -13,7 +13,8 @@ public enum ErrorCode { ORDER_NOT_FOUND("존재하지 않는 예약입니다."), PRODUCT_NOT_FOUND("존재하지 않는 상품입니다."), TRADE_NOT_FOUND("존재하지 않는 거래입니다."), - PAY_NOT_FOUND("야놀자 페이를 찾을 수 없습니다."), + YANOLJAPAY_NOT_FOUND("야놀자 페이를 찾을 수 없습니다."), + YANOLJAPAY_HISTORY_NOT_FOUND("야놀자 페이 내역을 찾을 수 없습니다."), ACCESS_FORBIDDEN("권한이 없습니다."), ORDER_NOT_SELLABLE("판매할 수 없는 예약입니다."), INVALID_SELLING_PRICE_RANGE("판매가는 구매가보다 클 수 없습니다."), @@ -37,6 +38,10 @@ public enum ErrorCode { ILLEGAL_PRODUCT_STATUS("해당 기능을 수행할 수 없는 상품 상태입니다."), CANNOT_TRADE_OWN_PRODUCT("자신이 등록한 상품을 거래할 수 없습니다."), ILLEGAL_TRADE_STATUS("해당 기능을 수행할 수 없는 거래 상태입니다."), + NOT_ENOUGH_POINT("포인트가 부족합니다."), + NOT_ENOUGH_YANOLJAPAY_BALANCE("야놀자 페이 잔액이 부족합니다."), + DUPLICATE_YANOLJAPAY("이미 야놀자 페이에 가입되어있습니다."), + INCORRECT_YANOLJAPAY_PASSWORD("일치하지 않는 야놀자 페이 비밀번호 입니다."), ; private final String message; From e2b46a407d956653f0e0f95cda52b462863a493f Mon Sep 17 00:00:00 2001 From: KyuCheol Hwang Date: Thu, 18 Jan 2024 16:09:15 +0900 Subject: [PATCH 06/16] =?UTF-8?q?feat:=20=EC=95=BC=EB=86=80=EC=9E=90=20?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=20=EB=82=B4=EC=97=AD=20repository=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 야놀자 페이 내역 repository 구현 --- .../YanoljaPayHistoryRepository.java | 13 +++ .../YanoljaPayHistoryRepositoryCustom.java | 14 +++ ...YanoljaPayHistoryRepositoryCustomImpl.java | 93 +++++++++++++++++++ 3 files changed, 120 insertions(+) create mode 100644 src/main/java/kr/co/fastcampus/yanabada/domain/payment/repository/YanoljaPayHistoryRepository.java create mode 100644 src/main/java/kr/co/fastcampus/yanabada/domain/payment/repository/YanoljaPayHistoryRepositoryCustom.java create mode 100644 src/main/java/kr/co/fastcampus/yanabada/domain/payment/repository/YanoljaPayHistoryRepositoryCustomImpl.java diff --git a/src/main/java/kr/co/fastcampus/yanabada/domain/payment/repository/YanoljaPayHistoryRepository.java b/src/main/java/kr/co/fastcampus/yanabada/domain/payment/repository/YanoljaPayHistoryRepository.java new file mode 100644 index 00000000..39de8a47 --- /dev/null +++ b/src/main/java/kr/co/fastcampus/yanabada/domain/payment/repository/YanoljaPayHistoryRepository.java @@ -0,0 +1,13 @@ +package kr.co.fastcampus.yanabada.domain.payment.repository; + +import kr.co.fastcampus.yanabada.common.exception.YanoljaPayHistoryNotFoundException; +import kr.co.fastcampus.yanabada.domain.payment.entity.YanoljaPayHistory; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface YanoljaPayHistoryRepository + extends JpaRepository, YanoljaPayHistoryRepositoryCustom { + + default YanoljaPayHistory getYanoljaPayHistory(Long id) { + return findById(id).orElseThrow(YanoljaPayHistoryNotFoundException::new); + } +} diff --git a/src/main/java/kr/co/fastcampus/yanabada/domain/payment/repository/YanoljaPayHistoryRepositoryCustom.java b/src/main/java/kr/co/fastcampus/yanabada/domain/payment/repository/YanoljaPayHistoryRepositoryCustom.java new file mode 100644 index 00000000..de14604c --- /dev/null +++ b/src/main/java/kr/co/fastcampus/yanabada/domain/payment/repository/YanoljaPayHistoryRepositoryCustom.java @@ -0,0 +1,14 @@ +package kr.co.fastcampus.yanabada.domain.payment.repository; + +import kr.co.fastcampus.yanabada.domain.payment.dto.request.YanoljaPayHistorySearchRequest; +import kr.co.fastcampus.yanabada.domain.payment.entity.YanoljaPay; +import kr.co.fastcampus.yanabada.domain.payment.entity.YanoljaPayHistory; +import org.springframework.data.domain.Page; + +public interface YanoljaPayHistoryRepositoryCustom { + + Page getHistoriesByYanoljaPayAndSearchRequest( + YanoljaPay yanoljaPay, + YanoljaPayHistorySearchRequest request + ); +} diff --git a/src/main/java/kr/co/fastcampus/yanabada/domain/payment/repository/YanoljaPayHistoryRepositoryCustomImpl.java b/src/main/java/kr/co/fastcampus/yanabada/domain/payment/repository/YanoljaPayHistoryRepositoryCustomImpl.java new file mode 100644 index 00000000..a0acc9bd --- /dev/null +++ b/src/main/java/kr/co/fastcampus/yanabada/domain/payment/repository/YanoljaPayHistoryRepositoryCustomImpl.java @@ -0,0 +1,93 @@ +package kr.co.fastcampus.yanabada.domain.payment.repository; + +import static kr.co.fastcampus.yanabada.domain.payment.entity.QYanoljaPayHistory.yanoljaPayHistory; + +import com.querydsl.core.types.dsl.BooleanExpression; +import com.querydsl.jpa.impl.JPAQuery; +import com.querydsl.jpa.impl.JPAQueryFactory; +import java.util.List; +import kr.co.fastcampus.yanabada.domain.payment.dto.request.YanoljaPayHistorySearchRequest; +import kr.co.fastcampus.yanabada.domain.payment.entity.YanoljaPay; +import kr.co.fastcampus.yanabada.domain.payment.entity.YanoljaPayHistory; +import kr.co.fastcampus.yanabada.domain.payment.entity.enums.TransactionType; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; + +@RequiredArgsConstructor +public class YanoljaPayHistoryRepositoryCustomImpl implements YanoljaPayHistoryRepositoryCustom { + + private static final int DEFAULT_PAGE_OFFSET = 0; + private static final int DEFAULT_PAGE_SIZE = 20; + + private final JPAQueryFactory queryFactory; + + @Override + public Page getHistoriesByYanoljaPayAndSearchRequest( + YanoljaPay yanoljaPay, + YanoljaPayHistorySearchRequest request + ) { + int offset = getOffset(request.page()); + int limit = getLimit(request.size()); + Pageable pageable = PageRequest.of(offset, limit); + + JPAQuery query = createQuery(yanoljaPay, request); + List histories = query + .offset(pageable.getOffset()) + .limit(pageable.getPageSize()) + .fetch(); + int totalCount = getTotalCount(query); + + return new PageImpl<>(histories, pageable, totalCount); + } + + private JPAQuery createQuery( + YanoljaPay yanoljaPay, + YanoljaPayHistorySearchRequest request + ) { + return queryFactory.selectFrom(yanoljaPayHistory) + .where( + equalYanoljaPay(yanoljaPay), + isInTypes(request.types()) + ) + .orderBy(yanoljaPayHistory.id.desc()); + } + + private BooleanExpression equalYanoljaPay(YanoljaPay yanoljaPay) { + if (yanoljaPay == null) { + return null; + } + + return yanoljaPayHistory.yanoljaPay.eq(yanoljaPay); + } + + private BooleanExpression isInTypes(List types) { + if (types == null || types.isEmpty()) { + return null; + } + + return yanoljaPayHistory.transactionType.in(types); + } + + private int getOffset(Integer page) { + if (page == null || page <= 0) { + return DEFAULT_PAGE_OFFSET; + } + + return page - 1; + } + + private int getLimit(Integer size) { + if (size == null || size <= 0) { + return DEFAULT_PAGE_SIZE; + } + + return size; + } + + private int getTotalCount(JPAQuery query) { + return query.fetch().size(); + } +} From 6e2b0e1ba5c4294030fc54724620dd7aa0fd6e84 Mon Sep 17 00:00:00 2001 From: KyuCheol Hwang Date: Thu, 18 Jan 2024 16:10:31 +0900 Subject: [PATCH 07/16] =?UTF-8?q?refactor:=20=EA=B1=B0=EB=9E=98=20?= =?UTF-8?q?=EA=B4=80=EB=A0=A8=20DTO=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 거래 관련 DTO 수정 --- .../payment/dto/request/TradeSaveRequest.java | 8 +++++--- .../dto/response/PurchaseTradeInfoResponse.java | 15 +++++---------- 2 files changed, 10 insertions(+), 13 deletions(-) diff --git a/src/main/java/kr/co/fastcampus/yanabada/domain/payment/dto/request/TradeSaveRequest.java b/src/main/java/kr/co/fastcampus/yanabada/domain/payment/dto/request/TradeSaveRequest.java index 28e4af70..1341baad 100644 --- a/src/main/java/kr/co/fastcampus/yanabada/domain/payment/dto/request/TradeSaveRequest.java +++ b/src/main/java/kr/co/fastcampus/yanabada/domain/payment/dto/request/TradeSaveRequest.java @@ -4,7 +4,7 @@ import jakarta.validation.constraints.NotNull; import java.time.LocalDateTime; import kr.co.fastcampus.yanabada.common.utils.EntityCodeGenerator; -import kr.co.fastcampus.yanabada.common.utils.FeeCalculator; +import kr.co.fastcampus.yanabada.common.utils.PayFeeCalculator; import kr.co.fastcampus.yanabada.domain.member.entity.Member; import kr.co.fastcampus.yanabada.domain.order.entity.enums.PaymentType; import kr.co.fastcampus.yanabada.domain.payment.entity.Trade; @@ -32,7 +32,9 @@ public record TradeSaveRequest( Integer point, @NotNull - PaymentType paymentType + PaymentType paymentType, + + String simplePassword ) { public Trade toEntity( Product product, @@ -49,7 +51,7 @@ public Trade toEntity( userPersonPhoneNumber, product.getOrder().getPrice(), product.getPrice(), - FeeCalculator.calculate(product.getPrice()), + PayFeeCalculator.calculate(product.getPrice(), paymentType), point, paymentType, EntityCodeGenerator.generate(), diff --git a/src/main/java/kr/co/fastcampus/yanabada/domain/payment/dto/response/PurchaseTradeInfoResponse.java b/src/main/java/kr/co/fastcampus/yanabada/domain/payment/dto/response/PurchaseTradeInfoResponse.java index 69ba4ddc..c0103526 100644 --- a/src/main/java/kr/co/fastcampus/yanabada/domain/payment/dto/response/PurchaseTradeInfoResponse.java +++ b/src/main/java/kr/co/fastcampus/yanabada/domain/payment/dto/response/PurchaseTradeInfoResponse.java @@ -1,11 +1,10 @@ package kr.co.fastcampus.yanabada.domain.payment.dto.response; import java.time.LocalDateTime; -import kr.co.fastcampus.yanabada.domain.accommodation.entity.Accommodation; -import kr.co.fastcampus.yanabada.domain.accommodation.entity.Room; import kr.co.fastcampus.yanabada.domain.order.entity.enums.PaymentType; import kr.co.fastcampus.yanabada.domain.payment.entity.Trade; import kr.co.fastcampus.yanabada.domain.payment.entity.enums.TradeStatus; +import kr.co.fastcampus.yanabada.domain.product.dto.response.ProductSummaryResponse; import kr.co.fastcampus.yanabada.domain.product.entity.Product; import lombok.Builder; @@ -16,18 +15,15 @@ public record PurchaseTradeInfoResponse( Integer price, Integer sellingPrice, Integer fee, + Integer point, PaymentType paymentType, - String accommodationName, - String accommodationImage, - String roomName, + ProductSummaryResponse product, String tradeCode, String sellerName, LocalDateTime registeredDate ) { public static PurchaseTradeInfoResponse from(Trade trade) { Product product = trade.getProduct(); - Room room = product.getOrder().getRoom(); - Accommodation accommodation = room.getAccommodation(); return PurchaseTradeInfoResponse.builder() .tradeId(trade.getId()) @@ -35,10 +31,9 @@ public static PurchaseTradeInfoResponse from(Trade trade) { .price(trade.getPrice()) .sellingPrice(trade.getSellingPrice()) .fee(trade.getFee()) + .point(trade.getPoint()) .paymentType(trade.getPaymentType()) - .accommodationName(accommodation.getName()) - .accommodationImage(accommodation.getImage()) - .roomName(room.getName()) + .product(ProductSummaryResponse.from(product)) .tradeCode(trade.getCode()) .sellerName(trade.getSeller().getNickName()) .registeredDate(trade.getRegisteredDate()) From 4c50013cfe8d07a0f050f663a176b9c0eefd66d4 Mon Sep 17 00:00:00 2001 From: KyuCheol Hwang Date: Thu, 18 Jan 2024 16:11:13 +0900 Subject: [PATCH 08/16] =?UTF-8?q?rename:=20=ED=8E=98=EC=9D=B4=20=EC=88=98?= =?UTF-8?q?=EC=88=98=EB=A3=8C=20=EA=B3=84=EC=82=B0=EA=B8=B0=20=EC=9C=A0?= =?UTF-8?q?=ED=8B=B8=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=9D=B4=EB=A6=84=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 페이 수수료 계산기 유틸 클래스 이름 변경 --- .../yanabada/common/utils/FeeCalculator.java | 13 ------------- .../common/utils/PayFeeCalculator.java | 19 +++++++++++++++++++ 2 files changed, 19 insertions(+), 13 deletions(-) delete mode 100644 src/main/java/kr/co/fastcampus/yanabada/common/utils/FeeCalculator.java create mode 100644 src/main/java/kr/co/fastcampus/yanabada/common/utils/PayFeeCalculator.java diff --git a/src/main/java/kr/co/fastcampus/yanabada/common/utils/FeeCalculator.java b/src/main/java/kr/co/fastcampus/yanabada/common/utils/FeeCalculator.java deleted file mode 100644 index 5e60a5d2..00000000 --- a/src/main/java/kr/co/fastcampus/yanabada/common/utils/FeeCalculator.java +++ /dev/null @@ -1,13 +0,0 @@ -package kr.co.fastcampus.yanabada.common.utils; - -import lombok.NoArgsConstructor; - -@NoArgsConstructor -public class FeeCalculator { - - private static final double FEE_RATE = 0.05; - - public static int calculate(int price) { - return (int) (price * FEE_RATE); - } -} diff --git a/src/main/java/kr/co/fastcampus/yanabada/common/utils/PayFeeCalculator.java b/src/main/java/kr/co/fastcampus/yanabada/common/utils/PayFeeCalculator.java new file mode 100644 index 00000000..23982282 --- /dev/null +++ b/src/main/java/kr/co/fastcampus/yanabada/common/utils/PayFeeCalculator.java @@ -0,0 +1,19 @@ +package kr.co.fastcampus.yanabada.common.utils; + +import static kr.co.fastcampus.yanabada.domain.order.entity.enums.PaymentType.YANOLJA_PAY; + +import kr.co.fastcampus.yanabada.domain.order.entity.enums.PaymentType; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +public class PayFeeCalculator { + + private static final double FEE_RATE = 0.05; + + public static int calculate(int price, PaymentType paymentType) { + if (paymentType == YANOLJA_PAY) { + return 0; + } + return (int) (price * FEE_RATE); + } +} From 6703e5d245c924aecf8404f299bc60d00de2befd Mon Sep 17 00:00:00 2001 From: KyuCheol Hwang Date: Thu, 18 Jan 2024 16:11:52 +0900 Subject: [PATCH 09/16] =?UTF-8?q?refactor:=20=ED=8E=98=EC=9D=B4=20?= =?UTF-8?q?=EA=B4=80=EB=A0=A8=20=EC=97=94=ED=8B=B0=ED=8B=B0=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 페이 관련 엔티티 수정 --- .../domain/payment/entity/YanoljaPay.java | 57 ++++++++++++------- .../payment/entity/YanoljaPayHistory.java | 21 ++++--- 2 files changed, 48 insertions(+), 30 deletions(-) diff --git a/src/main/java/kr/co/fastcampus/yanabada/domain/payment/entity/YanoljaPay.java b/src/main/java/kr/co/fastcampus/yanabada/domain/payment/entity/YanoljaPay.java index a8a1ca00..9566e962 100644 --- a/src/main/java/kr/co/fastcampus/yanabada/domain/payment/entity/YanoljaPay.java +++ b/src/main/java/kr/co/fastcampus/yanabada/domain/payment/entity/YanoljaPay.java @@ -10,10 +10,10 @@ import jakarta.persistence.JoinColumn; import jakarta.persistence.OneToMany; import jakarta.persistence.OneToOne; -import jakarta.persistence.OrderBy; import java.util.ArrayList; import java.util.List; import kr.co.fastcampus.yanabada.common.baseentity.BaseEntity; +import kr.co.fastcampus.yanabada.common.exception.NotEnoughYanoljaPayBalanceException; import kr.co.fastcampus.yanabada.domain.member.entity.Member; import lombok.AccessLevel; import lombok.Getter; @@ -32,45 +32,34 @@ public class YanoljaPay extends BaseEntity { @JoinColumn(name = "member_id") private Member member; - @Column(length = 13) + @Column private String accountNumber; @Column private String simplePassword; - @Column(length = 100) + @Column private String bankName; - @Column(length = 200) - private String bankImage; - - @Column(length = 500) - private String contents; - @Column(nullable = false) private Long balance; @OneToMany(fetch = FetchType.LAZY, mappedBy = "yanoljaPay", cascade = CascadeType.ALL, orphanRemoval = true ) - @OrderBy("transactionTime desc") - private final List paymentHistories = new ArrayList<>(); + private final List histories = new ArrayList<>(); private YanoljaPay( Member member, String accountNumber, String simplePassword, String bankName, - String bankImage, - String contents, Long balance ) { this.member = member; this.accountNumber = accountNumber; this.simplePassword = simplePassword; this.bankName = bankName; - this.bankImage = bankImage; - this.contents = contents; this.balance = balance; } @@ -79,8 +68,6 @@ public static YanoljaPay create( String accountNumber, String simplePassword, String bankName, - String bankImage, - String contents, Long balance ) { return new YanoljaPay( @@ -88,9 +75,41 @@ public static YanoljaPay create( accountNumber, simplePassword, bankName, - bankImage, - contents, balance ); } + + public void setAccountNumber(String accountNumber) { + this.accountNumber = accountNumber; + } + + public void setBankName(String bankName) { + this.bankName = bankName; + } + + public void setSimplePassword(String simplePassword) { + this.simplePassword = simplePassword; + } + + public void deposit(long amount) { + balance += amount; + } + + public void withdraw(long amount) { + if (balance < amount) { + throw new NotEnoughYanoljaPayBalanceException(); + } + balance -= amount; + } + + public void charge(long amount) { + balance += amount; + } + + public void disburse(long amount) { + if (balance < amount) { + throw new NotEnoughYanoljaPayBalanceException(); + } + balance -= amount; + } } \ No newline at end of file diff --git a/src/main/java/kr/co/fastcampus/yanabada/domain/payment/entity/YanoljaPayHistory.java b/src/main/java/kr/co/fastcampus/yanabada/domain/payment/entity/YanoljaPayHistory.java index 4f206d37..1cc6b8d3 100644 --- a/src/main/java/kr/co/fastcampus/yanabada/domain/payment/entity/YanoljaPayHistory.java +++ b/src/main/java/kr/co/fastcampus/yanabada/domain/payment/entity/YanoljaPayHistory.java @@ -11,7 +11,6 @@ import jakarta.persistence.JoinColumn; import jakarta.persistence.ManyToOne; import java.time.LocalDateTime; -import kr.co.fastcampus.yanabada.domain.member.entity.Member; import kr.co.fastcampus.yanabada.domain.payment.entity.enums.TransactionType; import lombok.AccessLevel; import lombok.Getter; @@ -26,6 +25,9 @@ public class YanoljaPayHistory { @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; + @Column(nullable = false) + private String contents; + @Column(nullable = false) private Long transactionAmount; // 거래 금액 필드 @@ -40,33 +42,30 @@ public class YanoljaPayHistory { @JoinColumn(name = "yanolja_pay_id") private YanoljaPay yanoljaPay; - public Member getMember() { - return yanoljaPay != null ? yanoljaPay.getMember() : null; - } - - private YanoljaPayHistory( YanoljaPay yanoljaPay, + String contents, Long transactionAmount, - String transactionType, + TransactionType transactionType, LocalDateTime transactionTime ) { this.yanoljaPay = yanoljaPay; + this.contents = contents; this.transactionAmount = transactionAmount; - this.transactionType = TransactionType.valueOf(transactionType); + this.transactionType = transactionType; this.transactionTime = transactionTime; } - public static YanoljaPayHistory create( - YanoljaPay yanoljaPay, + String contents, Long transactionAmount, - String transactionType, + TransactionType transactionType, LocalDateTime transactionTime ) { return new YanoljaPayHistory( yanoljaPay, + contents, transactionAmount, transactionType, transactionTime From 9b862a2b615e798cc9bb4af64351e55853b27404 Mon Sep 17 00:00:00 2001 From: KyuCheol Hwang Date: Thu, 18 Jan 2024 16:12:48 +0900 Subject: [PATCH 10/16] =?UTF-8?q?refactor:=20=EA=B1=B0=EB=9E=98=20?= =?UTF-8?q?=EC=88=98=EB=8B=A8,=20=EB=82=B4=EC=97=AD=20=ED=83=80=EC=9E=85?= =?UTF-8?q?=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 거래 수단, 내역 타입 변경 --- .../order/entity/enums/PaymentType.java | 2 +- .../dto/response/PaymentHistoryResponse.java | 31 ------------------- .../dto/response/YanoljaPayHomeResponse.java | 25 --------------- .../payment/entity/enums/TransactionType.java | 22 +++++-------- 4 files changed, 8 insertions(+), 72 deletions(-) delete mode 100644 src/main/java/kr/co/fastcampus/yanabada/domain/payment/dto/response/PaymentHistoryResponse.java delete mode 100644 src/main/java/kr/co/fastcampus/yanabada/domain/payment/dto/response/YanoljaPayHomeResponse.java diff --git a/src/main/java/kr/co/fastcampus/yanabada/domain/order/entity/enums/PaymentType.java b/src/main/java/kr/co/fastcampus/yanabada/domain/order/entity/enums/PaymentType.java index 1c92c554..63555d5c 100644 --- a/src/main/java/kr/co/fastcampus/yanabada/domain/order/entity/enums/PaymentType.java +++ b/src/main/java/kr/co/fastcampus/yanabada/domain/order/entity/enums/PaymentType.java @@ -1,5 +1,5 @@ package kr.co.fastcampus.yanabada.domain.order.entity.enums; public enum PaymentType { - NAVER_PAY + NAVER_PAY, YANOLJA_PAY, } diff --git a/src/main/java/kr/co/fastcampus/yanabada/domain/payment/dto/response/PaymentHistoryResponse.java b/src/main/java/kr/co/fastcampus/yanabada/domain/payment/dto/response/PaymentHistoryResponse.java deleted file mode 100644 index 2497b6c0..00000000 --- a/src/main/java/kr/co/fastcampus/yanabada/domain/payment/dto/response/PaymentHistoryResponse.java +++ /dev/null @@ -1,31 +0,0 @@ -package kr.co.fastcampus.yanabada.domain.payment.dto.response; - -import java.time.LocalDateTime; -import kr.co.fastcampus.yanabada.domain.payment.entity.YanoljaPay; -import kr.co.fastcampus.yanabada.domain.payment.entity.YanoljaPayHistory; -import lombok.Builder; - -@Builder -public record PaymentHistoryResponse( - String contents, - String transactionType, - String bankName, - String bankImage, - String accountNumber, - Long transactionAmount, - LocalDateTime transactionTime -) { - - public static PaymentHistoryResponse from(YanoljaPayHistory history) { - YanoljaPay payInfo = history.getYanoljaPay(); - return PaymentHistoryResponse.builder() - .contents(payInfo.getContents()) - .transactionType(history.getTransactionType().getDescription()) - .bankName(payInfo.getBankName()) - .bankImage(payInfo.getBankImage()) - .accountNumber(payInfo.getAccountNumber()) - .transactionAmount(history.getTransactionAmount()) - .transactionTime(history.getTransactionTime()) - .build(); - } -} \ No newline at end of file diff --git a/src/main/java/kr/co/fastcampus/yanabada/domain/payment/dto/response/YanoljaPayHomeResponse.java b/src/main/java/kr/co/fastcampus/yanabada/domain/payment/dto/response/YanoljaPayHomeResponse.java deleted file mode 100644 index 5c2e99e0..00000000 --- a/src/main/java/kr/co/fastcampus/yanabada/domain/payment/dto/response/YanoljaPayHomeResponse.java +++ /dev/null @@ -1,25 +0,0 @@ -package kr.co.fastcampus.yanabada.domain.payment.dto.response; - -import java.util.List; -import java.util.stream.Collectors; -import kr.co.fastcampus.yanabada.domain.payment.entity.YanoljaPay; -import lombok.Builder; - -@Builder -public record YanoljaPayHomeResponse( - Long balance, - List paymentHistories -) { - - public static YanoljaPayHomeResponse from(YanoljaPay yanoljaPay) { - List paymentHistoryResponses = - yanoljaPay.getPaymentHistories().stream() - .map(PaymentHistoryResponse::from) - .collect(Collectors.toList()); - - return YanoljaPayHomeResponse.builder() - .balance(yanoljaPay.getBalance()) - .paymentHistories(paymentHistoryResponses) - .build(); - } -} diff --git a/src/main/java/kr/co/fastcampus/yanabada/domain/payment/entity/enums/TransactionType.java b/src/main/java/kr/co/fastcampus/yanabada/domain/payment/entity/enums/TransactionType.java index 6ec57e78..85a08feb 100644 --- a/src/main/java/kr/co/fastcampus/yanabada/domain/payment/entity/enums/TransactionType.java +++ b/src/main/java/kr/co/fastcampus/yanabada/domain/payment/entity/enums/TransactionType.java @@ -1,19 +1,11 @@ package kr.co.fastcampus.yanabada.domain.payment.entity.enums; -public enum TransactionType { - - DEPOSIT("입금"), - WITHDRAW("출금"), - DISBURSEMENT("인출"), - CHARGE("충전"); - - private final String description; +import lombok.RequiredArgsConstructor; - TransactionType(String description) { - this.description = description; - } - - public String getDescription() { - return description; - } +@RequiredArgsConstructor +public enum TransactionType { + DEPOSIT, //입금 + WITHDRAW, //출금 + DISBURSEMENT, //인출 + CHARGE //충전 } \ No newline at end of file From ae25a6152ca89e85458ea660ce188435723c9704 Mon Sep 17 00:00:00 2001 From: KyuCheol Hwang Date: Thu, 18 Jan 2024 16:14:11 +0900 Subject: [PATCH 11/16] =?UTF-8?q?feat:=20=EA=B2=B0=EC=A0=9C=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EA=B4=80=EB=A0=A8=20Controller,=20Service=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 결제 로직 관련 Controller, Service 추가 --- .../YanoljaPayNotFoundException.java | 4 +- .../controller/YanoljaPayController.java | 73 +++++++- .../domain/payment/service/TradeService.java | 119 ++++++++++++- .../payment/service/YanoljaPayService.java | 163 +++++++++++++++++- .../product/service/ProductService.java | 44 ++++- 5 files changed, 381 insertions(+), 22 deletions(-) diff --git a/src/main/java/kr/co/fastcampus/yanabada/common/exception/YanoljaPayNotFoundException.java b/src/main/java/kr/co/fastcampus/yanabada/common/exception/YanoljaPayNotFoundException.java index 183c382c..8992e7f8 100644 --- a/src/main/java/kr/co/fastcampus/yanabada/common/exception/YanoljaPayNotFoundException.java +++ b/src/main/java/kr/co/fastcampus/yanabada/common/exception/YanoljaPayNotFoundException.java @@ -1,10 +1,10 @@ package kr.co.fastcampus.yanabada.common.exception; -import static kr.co.fastcampus.yanabada.common.response.ErrorCode.PAY_NOT_FOUND; +import static kr.co.fastcampus.yanabada.common.response.ErrorCode.YANOLJAPAY_NOT_FOUND; public class YanoljaPayNotFoundException extends BaseException { public YanoljaPayNotFoundException() { - super(PAY_NOT_FOUND.getMessage()); + super(YANOLJAPAY_NOT_FOUND.getMessage()); } } diff --git a/src/main/java/kr/co/fastcampus/yanabada/domain/payment/controller/YanoljaPayController.java b/src/main/java/kr/co/fastcampus/yanabada/domain/payment/controller/YanoljaPayController.java index 991254bb..9a0893e8 100644 --- a/src/main/java/kr/co/fastcampus/yanabada/domain/payment/controller/YanoljaPayController.java +++ b/src/main/java/kr/co/fastcampus/yanabada/domain/payment/controller/YanoljaPayController.java @@ -1,11 +1,21 @@ package kr.co.fastcampus.yanabada.domain.payment.controller; +import jakarta.validation.Valid; import kr.co.fastcampus.yanabada.common.response.ResponseBody; -import kr.co.fastcampus.yanabada.domain.payment.dto.response.YanoljaPayHomeResponse; +import kr.co.fastcampus.yanabada.domain.payment.dto.request.YanoljaPayAmountRequest; +import kr.co.fastcampus.yanabada.domain.payment.dto.request.YanoljaPayHistorySearchRequest; +import kr.co.fastcampus.yanabada.domain.payment.dto.request.YanoljaPaySaveRequest; +import kr.co.fastcampus.yanabada.domain.payment.dto.response.YanoljaPayHistoryIdResponse; +import kr.co.fastcampus.yanabada.domain.payment.dto.response.YanoljaPayHistoryInfoResponse; +import kr.co.fastcampus.yanabada.domain.payment.dto.response.YanoljaPayHistorySummaryPageResponse; +import kr.co.fastcampus.yanabada.domain.payment.dto.response.YanoljaPayInfoResponse; +import kr.co.fastcampus.yanabada.domain.payment.dto.response.YanoljaPaySummaryResponse; import kr.co.fastcampus.yanabada.domain.payment.service.YanoljaPayService; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -16,9 +26,64 @@ public class YanoljaPayController { private final YanoljaPayService yanoljaPayService; - @GetMapping("/{memberId}") - public ResponseBody getYanoljaPay(@PathVariable Long memberId) { - return ResponseBody.ok(yanoljaPayService.getYanoljaPay(memberId)); + @GetMapping("/summary") + public ResponseBody getYanoljaPaySummary() { + return ResponseBody.ok(yanoljaPayService.getYanoljaPaySummary(2L)); + } + + @GetMapping + public ResponseBody getYanoljaPay() { + return ResponseBody.ok(yanoljaPayService.getYanoljaPay(2L)); + } + + @PostMapping + public ResponseBody saveYanoljaPay( + @RequestBody @Valid YanoljaPaySaveRequest request + ) { + yanoljaPayService.saveYanoljaPay(2L, request); + return ResponseBody.ok(); + } + + @PostMapping("/charge") + public ResponseBody chargeYanoljaPay( + @RequestBody @Valid YanoljaPayAmountRequest request + ) { + return ResponseBody.ok( + yanoljaPayService.chargeYanoljaPay(2L, request) + ); + } + + @PostMapping("/disburse") + public ResponseBody disburseYanoljaPay( + @RequestBody @Valid YanoljaPayAmountRequest request + ) { + return ResponseBody.ok( + yanoljaPayService.disburseYanoljaPay(1L, request) + ); + } + + @GetMapping("/histories") + public ResponseBody getYanoljaPayHistories( + YanoljaPayHistorySearchRequest request + ) { + return ResponseBody.ok( + yanoljaPayService.getYanoljaPayHistoriesBySearchRequest( + 2L, + request + ) + ); + } + + @GetMapping("/histories/{historyId}") + public ResponseBody getYanoljaPayHistory( + @PathVariable("historyId") Long historyId + ) { + return ResponseBody.ok( + yanoljaPayService.getYanoljaPayHistory( + 2L, + historyId + ) + ); } } diff --git a/src/main/java/kr/co/fastcampus/yanabada/domain/payment/service/TradeService.java b/src/main/java/kr/co/fastcampus/yanabada/domain/payment/service/TradeService.java index 506f76f1..104ccc5a 100644 --- a/src/main/java/kr/co/fastcampus/yanabada/domain/payment/service/TradeService.java +++ b/src/main/java/kr/co/fastcampus/yanabada/domain/payment/service/TradeService.java @@ -1,25 +1,39 @@ package kr.co.fastcampus.yanabada.domain.payment.service; +import static kr.co.fastcampus.yanabada.domain.order.entity.enums.PaymentType.YANOLJA_PAY; import static kr.co.fastcampus.yanabada.domain.payment.entity.enums.TradeStatus.WAITING; +import static kr.co.fastcampus.yanabada.domain.payment.entity.enums.TransactionType.DEPOSIT; +import static kr.co.fastcampus.yanabada.domain.payment.entity.enums.TransactionType.WITHDRAW; +import java.time.LocalDateTime; import java.util.Objects; import kr.co.fastcampus.yanabada.common.exception.AccessForbiddenException; import kr.co.fastcampus.yanabada.common.exception.CannotTradeOwnProductException; import kr.co.fastcampus.yanabada.common.exception.IllegalProductStatusException; import kr.co.fastcampus.yanabada.common.exception.IllegalTradeStatusException; +import kr.co.fastcampus.yanabada.common.exception.IncorrectYanoljaPayPasswordException; +import kr.co.fastcampus.yanabada.common.exception.NotEnoughPointException; import kr.co.fastcampus.yanabada.common.exception.TradeNotFoundException; +import kr.co.fastcampus.yanabada.common.exception.YanoljaPayNotFoundException; import kr.co.fastcampus.yanabada.common.utils.EntityCodeGenerator; +import kr.co.fastcampus.yanabada.common.utils.PayFeeCalculator; +import kr.co.fastcampus.yanabada.domain.accommodation.entity.Accommodation; import kr.co.fastcampus.yanabada.domain.member.entity.Member; import kr.co.fastcampus.yanabada.domain.member.repository.MemberRepository; import kr.co.fastcampus.yanabada.domain.order.entity.Order; import kr.co.fastcampus.yanabada.domain.order.entity.enums.OrderStatus; +import kr.co.fastcampus.yanabada.domain.order.entity.enums.PaymentType; import kr.co.fastcampus.yanabada.domain.order.repository.OrderRepository; import kr.co.fastcampus.yanabada.domain.payment.dto.request.TradeSaveRequest; import kr.co.fastcampus.yanabada.domain.payment.dto.response.ApprovalTradeInfoResponse; import kr.co.fastcampus.yanabada.domain.payment.dto.response.PurchaseTradeInfoResponse; import kr.co.fastcampus.yanabada.domain.payment.dto.response.TradeIdResponse; import kr.co.fastcampus.yanabada.domain.payment.entity.Trade; +import kr.co.fastcampus.yanabada.domain.payment.entity.YanoljaPay; +import kr.co.fastcampus.yanabada.domain.payment.entity.YanoljaPayHistory; import kr.co.fastcampus.yanabada.domain.payment.repository.TradeRepository; +import kr.co.fastcampus.yanabada.domain.payment.repository.YanoljaPayHistoryRepository; +import kr.co.fastcampus.yanabada.domain.payment.repository.YanoljaPayRepository; import kr.co.fastcampus.yanabada.domain.product.entity.Product; import kr.co.fastcampus.yanabada.domain.product.entity.enums.ProductStatus; import kr.co.fastcampus.yanabada.domain.product.repository.ProductRepository; @@ -35,6 +49,8 @@ public class TradeService { private final MemberRepository memberRepository; private final ProductRepository productRepository; private final OrderRepository orderRepository; + private final YanoljaPayRepository yanoljaPayRepository; + private final YanoljaPayHistoryRepository yanoljaPayHistoryRepository; @Transactional public TradeIdResponse saveTrade( @@ -45,9 +61,12 @@ public TradeIdResponse saveTrade( Member seller = product.getOrder().getMember(); Member buyer = memberRepository.getMember(buyerId); - validateTradeSaveRequest(product, seller, buyer); + validateTradeSaveRequest(product, seller, buyer, request.point()); - //TODO: Buyer 결제 + long bill = product.getPrice() + + PayFeeCalculator.calculate(product.getPrice(), request.paymentType()) + - request.point(); + payBill(buyer, bill, request, product); product.book(); @@ -65,14 +84,15 @@ public void approveTrade(Long sellerId, Long tradeId) { validateTradeApproveRequest(seller, trade); - //TODO: Buyer 결제 + long bill = trade.getSellingPrice(); + receiveBill(seller, bill, trade.getProduct()); trade.complete(); trade.getProduct().soldOut(); trade.getProduct().getOrder().trade(); orderRepository.save(createOrderFromTrade(trade)); - //TODO: Seller에게 알림 + //TODO: Buyer에게 알림 } @Transactional @@ -82,7 +102,8 @@ public void rejectTrade(Long sellerId, Long tradeId) { validateTradeRejectRequest(seller, trade); - //TODO: Buyer에게 환불 진행 + long bill = trade.getSellingPrice() + trade.getFee() - trade.getPoint(); + refundBill(trade.getBuyer(), bill, trade.getPaymentType(), trade.getProduct()); trade.reject(); trade.getProduct().onSale(); @@ -97,7 +118,8 @@ public void cancelTrade(Long buyerId, Long tradeId) { validateTradeCancelRequest(buyer, trade); - //TODO: Buyer에게 환불 + long bill = trade.getSellingPrice() + trade.getFee() - trade.getPoint(); + refundBill(buyer, bill, trade.getPaymentType(), trade.getProduct()); trade.cancel(); trade.getProduct().onSale(); @@ -113,7 +135,7 @@ public ApprovalTradeInfoResponse getApprovalTrade(Long memberId, Long tradeId) { if (trade.getHasSellerDeleted()) { throw new TradeNotFoundException(); } - if (!Objects.equals(member, trade.getSeller()) || trade.getStatus() == WAITING) { + if (!Objects.equals(member, trade.getSeller())) { throw new AccessForbiddenException(); } @@ -128,7 +150,7 @@ public PurchaseTradeInfoResponse getPurchaseTrade(Long memberId, Long tradeId) { if (trade.getHasBuyerDeleted()) { throw new TradeNotFoundException(); } - if (!Objects.equals(member, trade.getBuyer()) || trade.getStatus() == WAITING) { + if (!Objects.equals(member, trade.getBuyer())) { throw new AccessForbiddenException(); } @@ -153,13 +175,21 @@ public void deleteTrade(Long memberId, Long tradeId) { } } - private void validateTradeSaveRequest(Product product, Member seller, Member buyer) { + private void validateTradeSaveRequest( + Product product, + Member seller, + Member buyer, + Integer point + ) { if (product.getStatus() != ProductStatus.ON_SALE) { throw new IllegalProductStatusException(); } if (Objects.equals(seller, buyer)) { throw new CannotTradeOwnProductException(); } + if (buyer.getPoint() < point) { + throw new NotEnoughPointException(); + } } private void validateTradeApproveRequest(Member seller, Trade trade) { @@ -208,4 +238,75 @@ private Order createOrderFromTrade(Trade trade) { EntityCodeGenerator.generate() ); } + + private void payBill(Member member, long bill, TradeSaveRequest request, Product product) { + if (request.paymentType() != YANOLJA_PAY) { + return; + } + + YanoljaPay yanoljaPay = yanoljaPayRepository.findByMember(member) + .orElseThrow(YanoljaPayNotFoundException::new); + + if (yanoljaPay.getAccountNumber() == null) { + throw new YanoljaPayNotFoundException(); + } + + if (!Objects.equals(request.simplePassword(), yanoljaPay.getSimplePassword())) { + throw new IncorrectYanoljaPayPasswordException(); + } + + Accommodation accommodation = product.getOrder().getRoom().getAccommodation(); + yanoljaPay.withdraw(bill); + yanoljaPayHistoryRepository.save( + YanoljaPayHistory.create( + yanoljaPay, + "'" + accommodation.getName() + "'" + " 상품 구매", + bill, + WITHDRAW, + LocalDateTime.now() + ) + ); + } + + private void receiveBill(Member member, long bill, Product product) { + YanoljaPay yanoljaPay = yanoljaPayRepository.findByMember(member) + .orElseThrow(YanoljaPayNotFoundException::new); + Accommodation accommodation = product.getOrder().getRoom().getAccommodation(); + + yanoljaPay.deposit(bill); + yanoljaPayHistoryRepository.save( + YanoljaPayHistory.create( + yanoljaPay, + "'" + accommodation.getName() + "'" + " 상품 판매", + bill, + DEPOSIT, + LocalDateTime.now() + ) + ); + } + + private void refundBill(Member member, long bill, PaymentType paymentType, Product product) { + if (paymentType != YANOLJA_PAY) { + return; + } + + YanoljaPay yanoljaPay = yanoljaPayRepository.findByMember(member) + .orElseThrow(YanoljaPayNotFoundException::new); + + if (yanoljaPay.getAccountNumber() == null) { + throw new YanoljaPayNotFoundException(); + } + + Accommodation accommodation = product.getOrder().getRoom().getAccommodation(); + yanoljaPay.deposit(bill); + yanoljaPayHistoryRepository.save( + YanoljaPayHistory.create( + yanoljaPay, + "'" + accommodation.getName() + "'" + " 결제 취소", + bill, + DEPOSIT, + LocalDateTime.now() + ) + ); + } } diff --git a/src/main/java/kr/co/fastcampus/yanabada/domain/payment/service/YanoljaPayService.java b/src/main/java/kr/co/fastcampus/yanabada/domain/payment/service/YanoljaPayService.java index 8e8f2acb..1d5120e6 100644 --- a/src/main/java/kr/co/fastcampus/yanabada/domain/payment/service/YanoljaPayService.java +++ b/src/main/java/kr/co/fastcampus/yanabada/domain/payment/service/YanoljaPayService.java @@ -1,10 +1,28 @@ package kr.co.fastcampus.yanabada.domain.payment.service; +import static kr.co.fastcampus.yanabada.domain.payment.entity.enums.TransactionType.CHARGE; +import static kr.co.fastcampus.yanabada.domain.payment.entity.enums.TransactionType.DISBURSEMENT; + +import java.time.LocalDateTime; +import java.util.Objects; +import kr.co.fastcampus.yanabada.common.exception.AccessForbiddenException; +import kr.co.fastcampus.yanabada.common.exception.DuplicateYanoljaPayException; +import kr.co.fastcampus.yanabada.common.exception.IncorrectYanoljaPayPasswordException; import kr.co.fastcampus.yanabada.common.exception.YanoljaPayNotFoundException; +import kr.co.fastcampus.yanabada.common.utils.AccountNumberSplitter; import kr.co.fastcampus.yanabada.domain.member.entity.Member; import kr.co.fastcampus.yanabada.domain.member.repository.MemberRepository; -import kr.co.fastcampus.yanabada.domain.payment.dto.response.YanoljaPayHomeResponse; +import kr.co.fastcampus.yanabada.domain.payment.dto.request.YanoljaPayAmountRequest; +import kr.co.fastcampus.yanabada.domain.payment.dto.request.YanoljaPayHistorySearchRequest; +import kr.co.fastcampus.yanabada.domain.payment.dto.request.YanoljaPaySaveRequest; +import kr.co.fastcampus.yanabada.domain.payment.dto.response.YanoljaPayHistoryIdResponse; +import kr.co.fastcampus.yanabada.domain.payment.dto.response.YanoljaPayHistoryInfoResponse; +import kr.co.fastcampus.yanabada.domain.payment.dto.response.YanoljaPayHistorySummaryPageResponse; +import kr.co.fastcampus.yanabada.domain.payment.dto.response.YanoljaPayInfoResponse; import kr.co.fastcampus.yanabada.domain.payment.entity.YanoljaPay; +import kr.co.fastcampus.yanabada.domain.payment.dto.response.YanoljaPaySummaryResponse; +import kr.co.fastcampus.yanabada.domain.payment.entity.YanoljaPayHistory; +import kr.co.fastcampus.yanabada.domain.payment.repository.YanoljaPayHistoryRepository; import kr.co.fastcampus.yanabada.domain.payment.repository.YanoljaPayRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -15,19 +33,154 @@ public class YanoljaPayService { private final YanoljaPayRepository yanoljaPayRepository; + private final YanoljaPayHistoryRepository yanoljaPayHistoryRepository; private final MemberRepository memberRepository; + @Transactional(readOnly = true) + public YanoljaPaySummaryResponse getYanoljaPaySummary(Long memberId) { + Member member = memberRepository.getMember(memberId); + YanoljaPay yanoljaPay = yanoljaPayRepository.findByMember(member) + .orElseThrow(YanoljaPayNotFoundException::new); + + return YanoljaPaySummaryResponse.from(yanoljaPay); + } + + @Transactional(readOnly = true) + public YanoljaPayInfoResponse getYanoljaPay(Long memberId) { + Member member = memberRepository.getMember(memberId); + YanoljaPay yanoljaPay = yanoljaPayRepository.findByMember(member) + .orElseThrow(YanoljaPayNotFoundException::new); + + if (yanoljaPay.getAccountNumber() == null) { + throw new YanoljaPayNotFoundException(); + } + + return YanoljaPayInfoResponse.from(yanoljaPay); + } + + @Transactional + public void saveYanoljaPay( + Long memberId, + YanoljaPaySaveRequest request + ) { + Member member = memberRepository.getMember(memberId); + YanoljaPay yanoljaPay = yanoljaPayRepository.findByMember(member) + .orElseThrow(YanoljaPayNotFoundException::new); + + if (yanoljaPay.getAccountNumber() != null) { + throw new DuplicateYanoljaPayException(); + } + + yanoljaPay.setAccountNumber(request.accountNumber()); + yanoljaPay.setBankName(request.bankName()); + yanoljaPay.setSimplePassword(request.simplePassword()); + } + + @Transactional + public YanoljaPayHistoryIdResponse chargeYanoljaPay( + Long memberId, + YanoljaPayAmountRequest request + ) { + Member member = memberRepository.getMember(memberId); + YanoljaPay yanoljaPay = yanoljaPayRepository.findByMember(member) + .orElseThrow(YanoljaPayNotFoundException::new); + + if (yanoljaPay.getAccountNumber() == null) { + throw new YanoljaPayNotFoundException(); + } + if (!Objects.equals(yanoljaPay.getSimplePassword(), request.simplePassword())) { + throw new IncorrectYanoljaPayPasswordException(); + } + + yanoljaPay.charge(request.amount()); + + return YanoljaPayHistoryIdResponse.from( + yanoljaPayHistoryRepository.save( + YanoljaPayHistory.create( + yanoljaPay, + "야놀자 페이 충전(" + + yanoljaPay.getBankName() + + " " + + AccountNumberSplitter.split(yanoljaPay.getAccountNumber()) + + ")", + request.amount(), + CHARGE, + LocalDateTime.now() + ) + ) + ); + } + @Transactional - public YanoljaPayHomeResponse getYanoljaPay(Long memberId) { + public YanoljaPayHistoryIdResponse disburseYanoljaPay( + Long memberId, + YanoljaPayAmountRequest request + ) { Member member = memberRepository.getMember(memberId); + YanoljaPay yanoljaPay = yanoljaPayRepository.findByMember(member) + .orElseThrow(YanoljaPayNotFoundException::new); + + if (yanoljaPay.getAccountNumber() == null) { + throw new YanoljaPayNotFoundException(); + } + if (!Objects.equals(yanoljaPay.getSimplePassword(), request.simplePassword())) { + throw new IncorrectYanoljaPayPasswordException(); + } + + yanoljaPay.disburse(request.amount()); - return getYanoljaPay(member); + return YanoljaPayHistoryIdResponse.from( + yanoljaPayHistoryRepository.save( + YanoljaPayHistory.create( + yanoljaPay, + "야놀자 페이 인출(" + + yanoljaPay.getBankName() + + " " + + AccountNumberSplitter.split(yanoljaPay.getAccountNumber()) + + ")", + request.amount(), + DISBURSEMENT, + LocalDateTime.now() + ) + ) + ); } - private YanoljaPayHomeResponse getYanoljaPay(Member member) { + @Transactional(readOnly = true) + public YanoljaPayHistoryInfoResponse getYanoljaPayHistory(Long memberId, Long historyId) { + Member member = memberRepository.getMember(memberId); YanoljaPay yanoljaPay = yanoljaPayRepository.findByMember(member) .orElseThrow(YanoljaPayNotFoundException::new); - return YanoljaPayHomeResponse.from(yanoljaPay); + if (yanoljaPay.getAccountNumber() == null) { + throw new YanoljaPayNotFoundException(); + } + + YanoljaPayHistory history = yanoljaPayHistoryRepository.getYanoljaPayHistory(historyId); + + if (!Objects.equals(history.getYanoljaPay().getMember(), member)) { + throw new AccessForbiddenException(); + } + + return YanoljaPayHistoryInfoResponse.from(history); + } + + @Transactional(readOnly = true) + public YanoljaPayHistorySummaryPageResponse getYanoljaPayHistoriesBySearchRequest( + Long memberId, YanoljaPayHistorySearchRequest request + ) { + Member member = memberRepository.getMember(memberId); + YanoljaPay yanoljaPay = yanoljaPayRepository.findByMember(member) + .orElseThrow(YanoljaPayNotFoundException::new); + + if (yanoljaPay.getAccountNumber() == null) { + throw new YanoljaPayNotFoundException(); + } + + return YanoljaPayHistorySummaryPageResponse.from( + yanoljaPayHistoryRepository.getHistoriesByYanoljaPayAndSearchRequest( + yanoljaPay, request + ) + ); } } \ No newline at end of file diff --git a/src/main/java/kr/co/fastcampus/yanabada/domain/product/service/ProductService.java b/src/main/java/kr/co/fastcampus/yanabada/domain/product/service/ProductService.java index ba6a68a1..4900fbdd 100644 --- a/src/main/java/kr/co/fastcampus/yanabada/domain/product/service/ProductService.java +++ b/src/main/java/kr/co/fastcampus/yanabada/domain/product/service/ProductService.java @@ -1,5 +1,7 @@ package kr.co.fastcampus.yanabada.domain.product.service; +import static kr.co.fastcampus.yanabada.domain.order.entity.enums.PaymentType.YANOLJA_PAY; +import static kr.co.fastcampus.yanabada.domain.payment.entity.enums.TransactionType.DEPOSIT; import static kr.co.fastcampus.yanabada.domain.product.entity.enums.ProductStatus.CANCELED; import static kr.co.fastcampus.yanabada.domain.product.entity.enums.ProductStatus.ON_SALE; import static kr.co.fastcampus.yanabada.domain.product.entity.enums.ProductStatus.SOLD_OUT; @@ -7,6 +9,7 @@ import io.micrometer.common.util.StringUtils; import java.time.LocalDate; +import java.time.LocalDateTime; import java.util.List; import java.util.Objects; import kr.co.fastcampus.yanabada.common.exception.AccessForbiddenException; @@ -15,13 +18,20 @@ import kr.co.fastcampus.yanabada.common.exception.OrderNotSellableException; import kr.co.fastcampus.yanabada.common.exception.SaleEndDateRangeException; import kr.co.fastcampus.yanabada.common.exception.SellingPriceRangeException; +import kr.co.fastcampus.yanabada.common.exception.YanoljaPayNotFoundException; +import kr.co.fastcampus.yanabada.domain.accommodation.entity.Accommodation; import kr.co.fastcampus.yanabada.domain.member.entity.Member; import kr.co.fastcampus.yanabada.domain.member.repository.MemberRepository; import kr.co.fastcampus.yanabada.domain.order.entity.Order; import kr.co.fastcampus.yanabada.domain.order.entity.enums.OrderStatus; +import kr.co.fastcampus.yanabada.domain.order.entity.enums.PaymentType; import kr.co.fastcampus.yanabada.domain.order.repository.OrderRepository; +import kr.co.fastcampus.yanabada.domain.payment.entity.YanoljaPay; +import kr.co.fastcampus.yanabada.domain.payment.entity.YanoljaPayHistory; import kr.co.fastcampus.yanabada.domain.payment.entity.enums.TradeStatus; import kr.co.fastcampus.yanabada.domain.payment.repository.TradeRepository; +import kr.co.fastcampus.yanabada.domain.payment.repository.YanoljaPayHistoryRepository; +import kr.co.fastcampus.yanabada.domain.payment.repository.YanoljaPayRepository; import kr.co.fastcampus.yanabada.domain.product.dto.request.ProductPatchRequest; import kr.co.fastcampus.yanabada.domain.product.dto.request.ProductSaveRequest; import kr.co.fastcampus.yanabada.domain.product.dto.request.ProductSearchRequest; @@ -49,6 +59,10 @@ public class ProductService { private final TradeRepository tradeRepository; + private final YanoljaPayRepository yanoljaPayRepository; + + private final YanoljaPayHistoryRepository yanoljaPayHistoryRepository; + @Transactional public ProductIdResponse saveProduct( Long memberId, @@ -137,12 +151,12 @@ public void cancelProduct( } @Scheduled(cron = CRON_SCHEDULING) + @Transactional public void expireProducts() { List products = productRepository.getBySaleEndDateExpired(); products.forEach( product -> { if (product.getIsAutoCancel()) { - //TODO: 예약 취소되면서 예약자에게 환불 product.getOrder().cancel(); } cancelTradeRelatedToProduct(product); @@ -155,7 +169,8 @@ private void cancelTradeRelatedToProduct(Product product) { tradeRepository.findByProduct(product) .forEach(trade -> { if (trade.getStatus() == TradeStatus.WAITING) { - //TODO: Buyer에게 환불 진행 + long bill = trade.getSellingPrice() + trade.getFee() - trade.getPoint(); + refundBill(trade.getBuyer(), bill, trade.getPaymentType(), trade.getProduct()); trade.reject(); //TODO: Buyer에게 알림 (Optional) } @@ -211,4 +226,29 @@ private void validateProductCancelRequest(Member member, Product product) { throw new IllegalProductStatusException(); } } + + private void refundBill(Member member, long bill, PaymentType paymentType, Product product) { + if (paymentType != YANOLJA_PAY) { + return; + } + + YanoljaPay yanoljaPay = yanoljaPayRepository.findByMember(member) + .orElseThrow(YanoljaPayNotFoundException::new); + + if (yanoljaPay.getAccountNumber() == null) { + throw new YanoljaPayNotFoundException(); + } + + Accommodation accommodation = product.getOrder().getRoom().getAccommodation(); + yanoljaPay.deposit(bill); + yanoljaPayHistoryRepository.save( + YanoljaPayHistory.create( + yanoljaPay, + "'" + accommodation.getName() + "'" + " 결제 취소", + bill, + DEPOSIT, + LocalDateTime.now() + ) + ); + } } From f82257529780ce60be3cedf064a5dfb944b4420f Mon Sep 17 00:00:00 2001 From: KyuCheol Hwang Date: Thu, 18 Jan 2024 17:03:57 +0900 Subject: [PATCH 12/16] =?UTF-8?q?style:=20=EC=98=81=EB=AC=B8=20=EC=88=9C?= =?UTF-8?q?=EC=84=9C=EC=97=90=20=EB=A7=9E=EA=B2=8C=20import=20=EB=AC=B8=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 영문 순서에 맞게 import 문 수정 --- .../yanabada/domain/payment/service/YanoljaPayService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/kr/co/fastcampus/yanabada/domain/payment/service/YanoljaPayService.java b/src/main/java/kr/co/fastcampus/yanabada/domain/payment/service/YanoljaPayService.java index 1d5120e6..40dd496d 100644 --- a/src/main/java/kr/co/fastcampus/yanabada/domain/payment/service/YanoljaPayService.java +++ b/src/main/java/kr/co/fastcampus/yanabada/domain/payment/service/YanoljaPayService.java @@ -19,8 +19,8 @@ import kr.co.fastcampus.yanabada.domain.payment.dto.response.YanoljaPayHistoryInfoResponse; import kr.co.fastcampus.yanabada.domain.payment.dto.response.YanoljaPayHistorySummaryPageResponse; import kr.co.fastcampus.yanabada.domain.payment.dto.response.YanoljaPayInfoResponse; -import kr.co.fastcampus.yanabada.domain.payment.entity.YanoljaPay; import kr.co.fastcampus.yanabada.domain.payment.dto.response.YanoljaPaySummaryResponse; +import kr.co.fastcampus.yanabada.domain.payment.entity.YanoljaPay; import kr.co.fastcampus.yanabada.domain.payment.entity.YanoljaPayHistory; import kr.co.fastcampus.yanabada.domain.payment.repository.YanoljaPayHistoryRepository; import kr.co.fastcampus.yanabada.domain.payment.repository.YanoljaPayRepository; From 26e6c211efc67bcd9b9ca0a69cd7be8d892865f9 Mon Sep 17 00:00:00 2001 From: KyuCheol Hwang Date: Thu, 18 Jan 2024 22:58:12 +0900 Subject: [PATCH 13/16] =?UTF-8?q?fix:=20querydsl=20=ED=8E=98=EC=9D=B4?= =?UTF-8?q?=EC=A7=95=20=EC=B2=98=EB=A6=AC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit querydsl 페이징 처리 수정 --- .../repository/YanoljaPayHistoryRepositoryCustomImpl.java | 2 +- .../domain/product/repository/ProductRepositoryCustomImpl.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/kr/co/fastcampus/yanabada/domain/payment/repository/YanoljaPayHistoryRepositoryCustomImpl.java b/src/main/java/kr/co/fastcampus/yanabada/domain/payment/repository/YanoljaPayHistoryRepositoryCustomImpl.java index a0acc9bd..8b93311d 100644 --- a/src/main/java/kr/co/fastcampus/yanabada/domain/payment/repository/YanoljaPayHistoryRepositoryCustomImpl.java +++ b/src/main/java/kr/co/fastcampus/yanabada/domain/payment/repository/YanoljaPayHistoryRepositoryCustomImpl.java @@ -38,7 +38,7 @@ public Page getHistoriesByYanoljaPayAndSearchRequest( .offset(pageable.getOffset()) .limit(pageable.getPageSize()) .fetch(); - int totalCount = getTotalCount(query); + int totalCount = getTotalCount(createQuery(yanoljaPay, request)); return new PageImpl<>(histories, pageable, totalCount); } diff --git a/src/main/java/kr/co/fastcampus/yanabada/domain/product/repository/ProductRepositoryCustomImpl.java b/src/main/java/kr/co/fastcampus/yanabada/domain/product/repository/ProductRepositoryCustomImpl.java index 0724147c..83d343e8 100644 --- a/src/main/java/kr/co/fastcampus/yanabada/domain/product/repository/ProductRepositoryCustomImpl.java +++ b/src/main/java/kr/co/fastcampus/yanabada/domain/product/repository/ProductRepositoryCustomImpl.java @@ -61,7 +61,7 @@ public Page getBySearchRequest(ProductSearchRequest request) { .offset(pageable.getOffset()) .limit(pageable.getPageSize()) .fetch(); - int totalCount = getTotalCount(query); + int totalCount = getTotalCount(createQuery(request)); return new PageImpl<>(products, pageable, totalCount); } From c43ebc7004e287239338fd82fd0ae5182fdf358b Mon Sep 17 00:00:00 2001 From: KyuCheol Hwang Date: Thu, 18 Jan 2024 22:59:31 +0900 Subject: [PATCH 14/16] =?UTF-8?q?refactor:=20YanoljaPayHistory=20=EC=97=94?= =?UTF-8?q?=ED=8B=B0=ED=8B=B0=EC=97=90=20ContentsType=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit YanoljaPayHistory 엔티티에 ContentsType 추가 --- .../domain/payment/entity/YanoljaPayHistory.java | 9 +++++++++ .../domain/payment/entity/enums/ContentsType.java | 5 +++++ 2 files changed, 14 insertions(+) create mode 100644 src/main/java/kr/co/fastcampus/yanabada/domain/payment/entity/enums/ContentsType.java diff --git a/src/main/java/kr/co/fastcampus/yanabada/domain/payment/entity/YanoljaPayHistory.java b/src/main/java/kr/co/fastcampus/yanabada/domain/payment/entity/YanoljaPayHistory.java index 1cc6b8d3..d48239b5 100644 --- a/src/main/java/kr/co/fastcampus/yanabada/domain/payment/entity/YanoljaPayHistory.java +++ b/src/main/java/kr/co/fastcampus/yanabada/domain/payment/entity/YanoljaPayHistory.java @@ -11,6 +11,7 @@ import jakarta.persistence.JoinColumn; import jakarta.persistence.ManyToOne; import java.time.LocalDateTime; +import kr.co.fastcampus.yanabada.domain.payment.entity.enums.ContentsType; import kr.co.fastcampus.yanabada.domain.payment.entity.enums.TransactionType; import lombok.AccessLevel; import lombok.Getter; @@ -25,6 +26,10 @@ public class YanoljaPayHistory { @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; + @Enumerated(EnumType.STRING) + @Column(nullable = false) + private ContentsType contentsType; + @Column(nullable = false) private String contents; @@ -44,12 +49,14 @@ public class YanoljaPayHistory { private YanoljaPayHistory( YanoljaPay yanoljaPay, + ContentsType contentsType, String contents, Long transactionAmount, TransactionType transactionType, LocalDateTime transactionTime ) { this.yanoljaPay = yanoljaPay; + this.contentsType = contentsType; this.contents = contents; this.transactionAmount = transactionAmount; this.transactionType = transactionType; @@ -58,6 +65,7 @@ private YanoljaPayHistory( public static YanoljaPayHistory create( YanoljaPay yanoljaPay, + ContentsType contentsType, String contents, Long transactionAmount, TransactionType transactionType, @@ -65,6 +73,7 @@ public static YanoljaPayHistory create( ) { return new YanoljaPayHistory( yanoljaPay, + contentsType, contents, transactionAmount, transactionType, diff --git a/src/main/java/kr/co/fastcampus/yanabada/domain/payment/entity/enums/ContentsType.java b/src/main/java/kr/co/fastcampus/yanabada/domain/payment/entity/enums/ContentsType.java new file mode 100644 index 00000000..35b9401d --- /dev/null +++ b/src/main/java/kr/co/fastcampus/yanabada/domain/payment/entity/enums/ContentsType.java @@ -0,0 +1,5 @@ +package kr.co.fastcampus.yanabada.domain.payment.entity.enums; + +public enum ContentsType { + SALE, PURCHASE, REFUND, CHARGE, DISBURSEMENT +} From f837fb7ce0fd6028890cc9c5e52ce921a0d3d8e6 Mon Sep 17 00:00:00 2001 From: KyuCheol Hwang Date: Thu, 18 Jan 2024 23:00:11 +0900 Subject: [PATCH 15/16] =?UTF-8?q?refactor:=20=EC=95=BC=EB=86=80=EC=9E=90?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=20=EC=9D=B4=EC=9A=A9=EB=82=B4=EC=97=AD=20?= =?UTF-8?q?=EC=9D=91=EB=8B=B5=20DTO=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 야놀자페이 이용내역 응답 DTO 수정 --- .../payment/dto/response/YanoljaPayHistorySummaryResponse.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/kr/co/fastcampus/yanabada/domain/payment/dto/response/YanoljaPayHistorySummaryResponse.java b/src/main/java/kr/co/fastcampus/yanabada/domain/payment/dto/response/YanoljaPayHistorySummaryResponse.java index dfe55439..3e4ee9e2 100644 --- a/src/main/java/kr/co/fastcampus/yanabada/domain/payment/dto/response/YanoljaPayHistorySummaryResponse.java +++ b/src/main/java/kr/co/fastcampus/yanabada/domain/payment/dto/response/YanoljaPayHistorySummaryResponse.java @@ -2,12 +2,14 @@ import java.time.LocalDateTime; import kr.co.fastcampus.yanabada.domain.payment.entity.YanoljaPayHistory; +import kr.co.fastcampus.yanabada.domain.payment.entity.enums.ContentsType; import kr.co.fastcampus.yanabada.domain.payment.entity.enums.TransactionType; import lombok.Builder; @Builder public record YanoljaPayHistorySummaryResponse( Long historyId, + ContentsType contentsType, String contents, Long amount, TransactionType type, @@ -16,6 +18,7 @@ public record YanoljaPayHistorySummaryResponse( public static YanoljaPayHistorySummaryResponse from(YanoljaPayHistory history) { return YanoljaPayHistorySummaryResponse.builder() .historyId(history.getId()) + .contentsType(history.getContentsType()) .contents(history.getContents()) .amount(history.getTransactionAmount()) .type(history.getTransactionType()) From 24a871faaab6b1318f564b50a1fca11463797fa4 Mon Sep 17 00:00:00 2001 From: KyuCheol Hwang Date: Thu, 18 Jan 2024 23:01:25 +0900 Subject: [PATCH 16/16] =?UTF-8?q?refactor:=20=EC=83=81=ED=92=88,=20?= =?UTF-8?q?=EA=B1=B0=EB=9E=98,=20=ED=8E=98=EC=9D=B4=20Controller,=20Servic?= =?UTF-8?q?e=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 상품, 거래, 페이 Controller, Service 수정 --- .../payment/controller/TradeController.java | 4 ++-- .../controller/YanoljaPayController.java | 2 +- .../domain/payment/service/TradeService.java | 12 +++++++++--- .../payment/service/YanoljaPayService.java | 19 +++++++++---------- .../product/service/ProductService.java | 4 +++- 5 files changed, 24 insertions(+), 17 deletions(-) diff --git a/src/main/java/kr/co/fastcampus/yanabada/domain/payment/controller/TradeController.java b/src/main/java/kr/co/fastcampus/yanabada/domain/payment/controller/TradeController.java index ac941d46..8757a592 100644 --- a/src/main/java/kr/co/fastcampus/yanabada/domain/payment/controller/TradeController.java +++ b/src/main/java/kr/co/fastcampus/yanabada/domain/payment/controller/TradeController.java @@ -57,7 +57,7 @@ public ResponseBody cancelTrade( return ResponseBody.ok(); } - @GetMapping("/{tradeId}/approvals") + @GetMapping("/approvals/{tradeId}") public ResponseBody getApprovalTrade( @PathVariable("tradeId") Long tradeId ) { @@ -66,7 +66,7 @@ public ResponseBody getApprovalTrade( ); } - @GetMapping("/{tradeId}/purchases") + @GetMapping("/purchases/{tradeId}") public ResponseBody getPurchaseTrade( @PathVariable("tradeId") Long tradeId ) { diff --git a/src/main/java/kr/co/fastcampus/yanabada/domain/payment/controller/YanoljaPayController.java b/src/main/java/kr/co/fastcampus/yanabada/domain/payment/controller/YanoljaPayController.java index 9a0893e8..3a1c7991 100644 --- a/src/main/java/kr/co/fastcampus/yanabada/domain/payment/controller/YanoljaPayController.java +++ b/src/main/java/kr/co/fastcampus/yanabada/domain/payment/controller/YanoljaPayController.java @@ -58,7 +58,7 @@ public ResponseBody disburseYanoljaPay( @RequestBody @Valid YanoljaPayAmountRequest request ) { return ResponseBody.ok( - yanoljaPayService.disburseYanoljaPay(1L, request) + yanoljaPayService.disburseYanoljaPay(2L, request) ); } diff --git a/src/main/java/kr/co/fastcampus/yanabada/domain/payment/service/TradeService.java b/src/main/java/kr/co/fastcampus/yanabada/domain/payment/service/TradeService.java index 104ccc5a..384a5957 100644 --- a/src/main/java/kr/co/fastcampus/yanabada/domain/payment/service/TradeService.java +++ b/src/main/java/kr/co/fastcampus/yanabada/domain/payment/service/TradeService.java @@ -1,6 +1,9 @@ package kr.co.fastcampus.yanabada.domain.payment.service; import static kr.co.fastcampus.yanabada.domain.order.entity.enums.PaymentType.YANOLJA_PAY; +import static kr.co.fastcampus.yanabada.domain.payment.entity.enums.ContentsType.PURCHASE; +import static kr.co.fastcampus.yanabada.domain.payment.entity.enums.ContentsType.REFUND; +import static kr.co.fastcampus.yanabada.domain.payment.entity.enums.ContentsType.SALE; import static kr.co.fastcampus.yanabada.domain.payment.entity.enums.TradeStatus.WAITING; import static kr.co.fastcampus.yanabada.domain.payment.entity.enums.TransactionType.DEPOSIT; import static kr.co.fastcampus.yanabada.domain.payment.entity.enums.TransactionType.WITHDRAW; @@ -260,7 +263,8 @@ private void payBill(Member member, long bill, TradeSaveRequest request, Product yanoljaPayHistoryRepository.save( YanoljaPayHistory.create( yanoljaPay, - "'" + accommodation.getName() + "'" + " 상품 구매", + PURCHASE, + accommodation.getName(), bill, WITHDRAW, LocalDateTime.now() @@ -277,7 +281,8 @@ private void receiveBill(Member member, long bill, Product product) { yanoljaPayHistoryRepository.save( YanoljaPayHistory.create( yanoljaPay, - "'" + accommodation.getName() + "'" + " 상품 판매", + SALE, + accommodation.getName(), bill, DEPOSIT, LocalDateTime.now() @@ -302,7 +307,8 @@ private void refundBill(Member member, long bill, PaymentType paymentType, Produ yanoljaPayHistoryRepository.save( YanoljaPayHistory.create( yanoljaPay, - "'" + accommodation.getName() + "'" + " 결제 취소", + REFUND, + accommodation.getName(), bill, DEPOSIT, LocalDateTime.now() diff --git a/src/main/java/kr/co/fastcampus/yanabada/domain/payment/service/YanoljaPayService.java b/src/main/java/kr/co/fastcampus/yanabada/domain/payment/service/YanoljaPayService.java index 40dd496d..51fbf594 100644 --- a/src/main/java/kr/co/fastcampus/yanabada/domain/payment/service/YanoljaPayService.java +++ b/src/main/java/kr/co/fastcampus/yanabada/domain/payment/service/YanoljaPayService.java @@ -1,6 +1,5 @@ package kr.co.fastcampus.yanabada.domain.payment.service; -import static kr.co.fastcampus.yanabada.domain.payment.entity.enums.TransactionType.CHARGE; import static kr.co.fastcampus.yanabada.domain.payment.entity.enums.TransactionType.DISBURSEMENT; import java.time.LocalDateTime; @@ -22,6 +21,8 @@ import kr.co.fastcampus.yanabada.domain.payment.dto.response.YanoljaPaySummaryResponse; import kr.co.fastcampus.yanabada.domain.payment.entity.YanoljaPay; import kr.co.fastcampus.yanabada.domain.payment.entity.YanoljaPayHistory; +import kr.co.fastcampus.yanabada.domain.payment.entity.enums.ContentsType; +import kr.co.fastcampus.yanabada.domain.payment.entity.enums.TransactionType; import kr.co.fastcampus.yanabada.domain.payment.repository.YanoljaPayHistoryRepository; import kr.co.fastcampus.yanabada.domain.payment.repository.YanoljaPayRepository; import lombok.RequiredArgsConstructor; @@ -98,13 +99,12 @@ public YanoljaPayHistoryIdResponse chargeYanoljaPay( yanoljaPayHistoryRepository.save( YanoljaPayHistory.create( yanoljaPay, - "야놀자 페이 충전(" - + yanoljaPay.getBankName() + ContentsType.CHARGE, + yanoljaPay.getBankName() + " " - + AccountNumberSplitter.split(yanoljaPay.getAccountNumber()) - + ")", + + AccountNumberSplitter.split(yanoljaPay.getAccountNumber()), request.amount(), - CHARGE, + TransactionType.CHARGE, LocalDateTime.now() ) ) @@ -133,11 +133,10 @@ public YanoljaPayHistoryIdResponse disburseYanoljaPay( yanoljaPayHistoryRepository.save( YanoljaPayHistory.create( yanoljaPay, - "야놀자 페이 인출(" - + yanoljaPay.getBankName() + ContentsType.DISBURSEMENT, + yanoljaPay.getBankName() + " " - + AccountNumberSplitter.split(yanoljaPay.getAccountNumber()) - + ")", + + AccountNumberSplitter.split(yanoljaPay.getAccountNumber()), request.amount(), DISBURSEMENT, LocalDateTime.now() diff --git a/src/main/java/kr/co/fastcampus/yanabada/domain/product/service/ProductService.java b/src/main/java/kr/co/fastcampus/yanabada/domain/product/service/ProductService.java index 4900fbdd..82c21f2f 100644 --- a/src/main/java/kr/co/fastcampus/yanabada/domain/product/service/ProductService.java +++ b/src/main/java/kr/co/fastcampus/yanabada/domain/product/service/ProductService.java @@ -1,6 +1,7 @@ package kr.co.fastcampus.yanabada.domain.product.service; import static kr.co.fastcampus.yanabada.domain.order.entity.enums.PaymentType.YANOLJA_PAY; +import static kr.co.fastcampus.yanabada.domain.payment.entity.enums.ContentsType.REFUND; import static kr.co.fastcampus.yanabada.domain.payment.entity.enums.TransactionType.DEPOSIT; import static kr.co.fastcampus.yanabada.domain.product.entity.enums.ProductStatus.CANCELED; import static kr.co.fastcampus.yanabada.domain.product.entity.enums.ProductStatus.ON_SALE; @@ -244,7 +245,8 @@ private void refundBill(Member member, long bill, PaymentType paymentType, Produ yanoljaPayHistoryRepository.save( YanoljaPayHistory.create( yanoljaPay, - "'" + accommodation.getName() + "'" + " 결제 취소", + REFUND, + accommodation.getName(), bill, DEPOSIT, LocalDateTime.now()