diff --git a/tosspay-mock/src/main/kotlin/com/sangdol/tosspaymock/business/domain/Payment.kt b/tosspay-mock/src/main/kotlin/com/sangdol/tosspaymock/business/domain/Payment.kt new file mode 100644 index 00000000..25414e87 --- /dev/null +++ b/tosspay-mock/src/main/kotlin/com/sangdol/tosspaymock/business/domain/Payment.kt @@ -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, + ) + } + } +}