generated from pricelees/issue-pr-template
feat: 임의의 결제 정보를 반환하는 서비스 기능 추가
This commit is contained in:
parent
dab26c49a8
commit
05145ec2ba
@ -0,0 +1,111 @@
|
|||||||
|
package com.sangdol.tosspaymock.business
|
||||||
|
|
||||||
|
import com.sangdol.common.persistence.IDGenerator
|
||||||
|
import com.sangdol.tosspaymock.business.domain.Payment
|
||||||
|
import com.sangdol.tosspaymock.business.domain.cancel.Cancellation
|
||||||
|
import com.sangdol.tosspaymock.exception.TosspayException
|
||||||
|
import com.sangdol.tosspaymock.exception.code.TosspayCancelErrorCode
|
||||||
|
import com.sangdol.tosspaymock.infrastructure.persistence.OrderAmountEntity
|
||||||
|
import com.sangdol.tosspaymock.infrastructure.persistence.OrderAmountRepository
|
||||||
|
import com.sangdol.tosspaymock.web.dto.PaymentCancelRequest
|
||||||
|
import com.sangdol.tosspaymock.web.dto.PaymentConfirmRequest
|
||||||
|
import com.sangdol.tosspaymock.web.dto.PaymentResponse
|
||||||
|
import io.github.oshai.kotlinlogging.KLogger
|
||||||
|
import io.github.oshai.kotlinlogging.KotlinLogging
|
||||||
|
import org.springframework.stereotype.Service
|
||||||
|
|
||||||
|
private val log: KLogger = KotlinLogging.logger {}
|
||||||
|
|
||||||
|
@Service
|
||||||
|
class TosspayService(
|
||||||
|
private val idGenerator: IDGenerator,
|
||||||
|
private val orderAmountRepository: OrderAmountRepository,
|
||||||
|
) {
|
||||||
|
|
||||||
|
fun confirm(request: PaymentConfirmRequest): PaymentResponse {
|
||||||
|
log.info { "[TosspayService.confirm] 결제 확정 시작: paymentKey=${request.paymentKey}, amount=${request.amount}" }
|
||||||
|
|
||||||
|
val payment = choosePayment(request).also { saveAmount(request.paymentKey, it) }
|
||||||
|
|
||||||
|
return payment.toResponse()
|
||||||
|
.also {
|
||||||
|
log.info { "[TosspayService.confirm] 결제 확정 완료: paymentKey=${request.paymentKey}, amount=${request.amount}" }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun cancel(paymentKey: String, request: PaymentCancelRequest): PaymentResponse {
|
||||||
|
log.info { "[TosspayService.cancel] 결제 취소 시작: paymentKey=${paymentKey}" }
|
||||||
|
|
||||||
|
val orderAmount = orderAmountRepository.findByPaymentKey(paymentKey)
|
||||||
|
?: throw TosspayException(TosspayCancelErrorCode.NOT_FOUND_PAYMENT)
|
||||||
|
|
||||||
|
val cancellation = Cancellation.random(
|
||||||
|
cancelReason = request.cancelReason,
|
||||||
|
cancelAmount = request.cancelAmount ?: orderAmount.totalAmount(),
|
||||||
|
easyPayDiscountAmount = orderAmount.easypayDiscountAmount,
|
||||||
|
cardDiscountAmount = orderAmount.cardDiscountAmount,
|
||||||
|
transferDiscountAmount = orderAmount.transferDiscountAmount
|
||||||
|
)
|
||||||
|
|
||||||
|
return Payment.randomForCancellation(paymentKey, cancellation)
|
||||||
|
.toResponse()
|
||||||
|
.also {
|
||||||
|
log.info { "[TosspayService.cancel] 결제 취소 완료: paymentKey=${paymentKey}" }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun choosePayment(request: PaymentConfirmRequest): Payment {
|
||||||
|
log.info { "[TosspayService.choosePayment] 랜덤 결제 정보 생성 시작: paymentKey=${request.paymentKey}, amount=${request.amount}" }
|
||||||
|
val randomValue = Math.random()
|
||||||
|
|
||||||
|
// 70%는 간편결제에 배정
|
||||||
|
return if (randomValue < 0.7) {
|
||||||
|
// 70%의 간편결제 중 70%는 카드
|
||||||
|
if (randomValue < 0.49) {
|
||||||
|
Payment.randomWithEasypayCard(
|
||||||
|
request.paymentKey, request.orderId, request.amount, request.requestedAt
|
||||||
|
).also {
|
||||||
|
log.info { "[Tosspayment.choosePayment] 간편결제 + 카드 결제 객체 생성 완료" }
|
||||||
|
}
|
||||||
|
} else { // 30%는 간편결제 선불 충전액
|
||||||
|
Payment.randomWithEasypayPrepaid(
|
||||||
|
request.paymentKey, request.orderId, request.amount, request.requestedAt
|
||||||
|
).also {
|
||||||
|
log.info { "[Tosspayment.choosePayment] 간편결제 + 충전식 결제 객체 생성 완료" }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (randomValue < 0.95) { // 남은 30% 중 25%는 일반 카드
|
||||||
|
Payment.randomWithCard(
|
||||||
|
request.paymentKey, request.orderId, request.amount, request.requestedAt
|
||||||
|
).also {
|
||||||
|
log.info { "[Tosspayment.choosePayment] 카드 결제 객체 생성 완료" }
|
||||||
|
}
|
||||||
|
} else { // 나머지는 계좌이체
|
||||||
|
Payment.randomWithBankTransfer(
|
||||||
|
request.paymentKey, request.orderId, request.amount, request.requestedAt
|
||||||
|
).also {
|
||||||
|
log.info { "[Tosspayment.choosePayment] 계좌이체 결제 객체 생성 완료" }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun saveAmount(paymentKey: String, payment: Payment) {
|
||||||
|
log.info { "[Tosspayment.saveAmount] 결제 금액 정보 저장 시작: paymentKey=${paymentKey}" }
|
||||||
|
val easypayDiscountAmount = payment.easyPay?.discountAmount ?: 0
|
||||||
|
val cardDiscountAmount = 0
|
||||||
|
val transferDiscountAmount = 0
|
||||||
|
|
||||||
|
val orderAmount = OrderAmountEntity(
|
||||||
|
idGenerator.create(),
|
||||||
|
paymentKey,
|
||||||
|
(payment.totalAmount - easypayDiscountAmount),
|
||||||
|
easypayDiscountAmount,
|
||||||
|
cardDiscountAmount,
|
||||||
|
transferDiscountAmount
|
||||||
|
)
|
||||||
|
|
||||||
|
orderAmountRepository.save(orderAmount).also {
|
||||||
|
log.info { "[Tosspayment.saveAmount] 결제 금액 정보 저장 완료: id=${it.id}, paymentKey=${paymentKey}, amount=${orderAmount.approvedAmount}, easypayDiscount=${orderAmount.easypayDiscountAmount}" }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user