diff --git a/service/src/main/kotlin/com/sangdol/roomescape/payment/mapper/PaymentClientDTOMappingExtensions.kt b/service/src/main/kotlin/com/sangdol/roomescape/payment/mapper/PaymentClientDTOMappingExtensions.kt index cc2979a8..e5794fd0 100644 --- a/service/src/main/kotlin/com/sangdol/roomescape/payment/mapper/PaymentClientDTOMappingExtensions.kt +++ b/service/src/main/kotlin/com/sangdol/roomescape/payment/mapper/PaymentClientDTOMappingExtensions.kt @@ -1,5 +1,7 @@ package com.sangdol.roomescape.payment.mapper +import com.sangdol.roomescape.payment.business.domain.* +import com.sangdol.roomescape.payment.business.event.PaymentEvent import com.sangdol.roomescape.payment.dto.CancelDetail import com.sangdol.roomescape.payment.dto.PaymentGatewayResponse import com.sangdol.roomescape.payment.exception.PaymentErrorCode @@ -94,3 +96,88 @@ fun CancelDetail.toEntity( transferDiscountAmount = this.transferDiscountAmount, easypayDiscountAmount = this.easyPayDiscountAmount ) + +fun PaymentGatewayResponse.toEvent(reservationId: Long): PaymentEvent { + return PaymentEvent( + reservationId = reservationId, + paymentKey = this.paymentKey, + orderId = this.orderId, + type = this.type, + status = this.status, + totalAmount = this.totalAmount, + vat = this.vat, + suppliedAmount = this.suppliedAmount, + method = this.method, + requestedAt = this.requestedAt.toInstant(), + approvedAt = this.approvedAt.toInstant(), + detail = this.toDetail() + ) +} + +fun PaymentGatewayResponse.toDetail(): PaymentDetail { + return when(this.method) { + PaymentMethod.TRANSFER -> this.toBankTransferDetail() + PaymentMethod.CARD -> this.toCardDetail() + PaymentMethod.EASY_PAY -> { + if (this.card != null) { + this.toEasypayCardDetail() + } else { + this.toEasypayPrepaidDetail() + } + } + + else -> throw PaymentException(PaymentErrorCode.NOT_SUPPORTED_PAYMENT_TYPE) + } +} + +private fun PaymentGatewayResponse.toBankTransferDetail(): BankTransferPaymentDetail { + val bankTransfer = this.transfer ?: throw PaymentException(PaymentErrorCode.PAYMENT_UNEXPECTED_ERROR) + + return BankTransferPaymentDetail( + bankCode = bankTransfer.bankCode, + settlementStatus = bankTransfer.settlementStatus + ) +} + +private fun PaymentGatewayResponse.toCardDetail(): CardPaymentDetail { + val cardDetail = this.card ?: throw PaymentException(PaymentErrorCode.PAYMENT_UNEXPECTED_ERROR) + + return CardPaymentDetail( + issuerCode = cardDetail.issuerCode, + number = cardDetail.number, + amount = cardDetail.amount, + cardType = cardDetail.cardType, + ownerType = cardDetail.ownerType, + isInterestFree = cardDetail.isInterestFree, + approveNo = cardDetail.approveNo, + installmentPlanMonths = cardDetail.installmentPlanMonths + ) +} + +private fun PaymentGatewayResponse.toEasypayCardDetail(): EasypayCardPaymentDetail { + val cardDetail = this.card ?: throw PaymentException(PaymentErrorCode.PAYMENT_UNEXPECTED_ERROR) + val easypay = this.easyPay ?: throw PaymentException(PaymentErrorCode.PAYMENT_UNEXPECTED_ERROR) + + return EasypayCardPaymentDetail( + issuerCode = cardDetail.issuerCode, + number = cardDetail.number, + amount = cardDetail.amount, + cardType = cardDetail.cardType, + ownerType = cardDetail.ownerType, + isInterestFree = cardDetail.isInterestFree, + approveNo = cardDetail.approveNo, + installmentPlanMonths = cardDetail.installmentPlanMonths, + easypayProvider = easypay.provider, + easypayDiscountAmount = easypay.discountAmount + ) +} + +private fun PaymentGatewayResponse.toEasypayPrepaidDetail(): EasypayPrepaidPaymentDetail { + val easypay = this.easyPay ?: throw PaymentException(PaymentErrorCode.PAYMENT_UNEXPECTED_ERROR) + + return EasypayPrepaidPaymentDetail( + provider = easypay.provider, + amount = easypay.amount, + discountAmount = easypay.discountAmount + ) +} diff --git a/service/src/test/kotlin/com/sangdol/roomescape/payment/business/event/PaymentEventListenerTest.kt b/service/src/test/kotlin/com/sangdol/roomescape/payment/PaymentEventListenerTest.kt similarity index 95% rename from service/src/test/kotlin/com/sangdol/roomescape/payment/business/event/PaymentEventListenerTest.kt rename to service/src/test/kotlin/com/sangdol/roomescape/payment/PaymentEventListenerTest.kt index c8a987f9..1808ea2d 100644 --- a/service/src/test/kotlin/com/sangdol/roomescape/payment/business/event/PaymentEventListenerTest.kt +++ b/service/src/test/kotlin/com/sangdol/roomescape/payment/PaymentEventListenerTest.kt @@ -1,6 +1,7 @@ -package com.sangdol.roomescape.payment.business.event +package com.sangdol.roomescape.payment import com.sangdol.roomescape.payment.business.domain.PaymentMethod +import com.sangdol.roomescape.payment.business.event.PaymentEventListener import com.sangdol.roomescape.payment.infrastructure.persistence.PaymentCardDetailEntity import com.sangdol.roomescape.payment.infrastructure.persistence.PaymentDetailRepository import com.sangdol.roomescape.payment.infrastructure.persistence.PaymentRepository @@ -50,4 +51,4 @@ class PaymentEventListenerTest( } } } -} +} \ No newline at end of file