feat: 모든 결제 처리에 사용할 공통 Payment 도메인 추가

This commit is contained in:
이상진 2025-10-01 10:31:11 +09:00
parent e25a4f6325
commit fdd55905c3

View File

@ -0,0 +1,179 @@
package com.sangdol.tosspaymock.business.domain
import com.sangdol.tosspaymock.business.domain.cancel.Cancellation
import com.sangdol.tosspaymock.business.domain.card.Card
import com.sangdol.tosspaymock.business.domain.easypay.Easypay
import com.sangdol.tosspaymock.business.domain.transfer.BankTransfer
import java.time.OffsetDateTime
class Payment(
val mid: String,
val lastTransactionKey: String,
val paymentKey: String,
val orderId: String,
val orderName: String,
val taxExemptionAmount: Int = 0,
var status: PaymentStatus = PaymentStatus.DONE,
val requestedAt: OffsetDateTime,
val approvedAt: OffsetDateTime,
val useEscrow: Boolean = false,
val cultureExpense: Boolean = false,
val card: Card? = null,
val virtualAccount: String? = null,
val transfer: BankTransfer? = null,
val mobilePhone: String? = null,
val giftCertificate: String? = null,
val cashReceipt: String? = null,
val cashReceipts: String? = null,
val discount: String? = null,
var cancels: Cancellation? = null,
val secret: String? = null,
val type: PaymentType = PaymentType.NORMAL,
val easyPay: Easypay? = null,
val country: String = "KR",
val failure: String? = null,
val isPartialCancelable: Boolean = true,
val receipt: String? = null,
val checkout: String? = null,
val currency: String = "KRW",
val totalAmount: Int,
val balanceAmount: Int,
val suppliedAmount: Int,
val vat: Int,
val taxFreeAmount: Int = 0,
val method: PaymentMethod,
val version: String = "2022-11-16",
val metadata: String? = null
) {
companion object {
fun randomWithCard(
paymentKey: String,
orderId: String,
amount: Int,
requestedAt: OffsetDateTime
): Payment {
val card = Card.random(amount)
return create(
paymentKey = paymentKey,
orderId = orderId,
requestedAt = requestedAt,
amount = amount,
card = card,
easyPay = null,
bankTransfer = null
)
}
fun randomWithEasypayCard(
paymentKey: String,
orderId: String,
amount: Int,
requestedAt: OffsetDateTime
): Payment {
val easyPay = Easypay.randomWithCard(amount)
val card = Card.random(approvedAmount = (amount - easyPay.discountAmount))
return create(
paymentKey = paymentKey,
orderId = orderId,
requestedAt = requestedAt,
amount = amount,
card = card,
easyPay = easyPay,
bankTransfer = null
)
}
fun randomWithEasypayPrepaid(
paymentKey: String,
orderId: String,
amount: Int,
requestedAt: OffsetDateTime
): Payment {
val easypay = Easypay.randomWithPrepaid(amount)
return create(
paymentKey = paymentKey,
orderId = orderId,
requestedAt = requestedAt,
amount = amount,
card = null,
easyPay = easypay,
bankTransfer = null
)
}
fun randomWithBankTransfer(
paymentKey: String,
orderId: String,
amount: Int,
requestedAt: OffsetDateTime
): Payment {
val bankTransfer = BankTransfer.random()
return create(
paymentKey = paymentKey,
orderId = orderId,
requestedAt = requestedAt,
amount = amount,
card = null,
easyPay = null,
bankTransfer = bankTransfer
)
}
fun randomForCancellation(paymentKey: String, cancellation: Cancellation): Payment {
return create(
paymentKey = paymentKey,
orderId = "orderId",
requestedAt = OffsetDateTime.now(),
amount = cancellation.cancelAmount,
card = null,
easyPay = null,
bankTransfer = null
).apply {
this.status = PaymentStatus.CANCELED
this.cancels = cancellation
}
}
private fun create(
paymentKey: String,
orderId: String,
requestedAt: OffsetDateTime,
amount: Int,
card: Card?,
easyPay: Easypay?,
bankTransfer: BankTransfer?
): Payment {
val vat = (amount * 0.1).toInt()
val suppliedAmount = amount - vat
val paymentMethod = if (bankTransfer != null) {
PaymentMethod.TRANSFER
} else if (easyPay != null) {
PaymentMethod.EASY_PAY
} else {
PaymentMethod.CARD
}
return Payment(
mid = RandomPaymentValueGenerator.mId(),
lastTransactionKey = RandomPaymentValueGenerator.transactionKey(),
paymentKey = paymentKey,
orderId = orderId,
orderName = "테스트 결제",
requestedAt = requestedAt,
approvedAt = OffsetDateTime.now(),
card = card,
easyPay = easyPay,
transfer = bankTransfer,
totalAmount = amount,
balanceAmount = amount,
suppliedAmount = suppliedAmount,
vat = vat,
method = paymentMethod,
)
}
}
}