diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/ChargeService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/ChargeService.kt index 4b8486e..66ea314 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/ChargeService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/ChargeService.kt @@ -5,6 +5,7 @@ import kr.co.bootpay.Bootpay import kr.co.vividnext.sodalive.can.CanRepository import kr.co.vividnext.sodalive.can.charge.event.ChargeSpringEvent import kr.co.vividnext.sodalive.can.coupon.CanCouponNumberRepository +import kr.co.vividnext.sodalive.can.coupon.CouponType import kr.co.vividnext.sodalive.can.payment.Payment import kr.co.vividnext.sodalive.can.payment.PaymentGateway import kr.co.vividnext.sodalive.can.payment.PaymentStatus @@ -12,6 +13,11 @@ import kr.co.vividnext.sodalive.common.SodaException import kr.co.vividnext.sodalive.google.GooglePlayService import kr.co.vividnext.sodalive.member.Member import kr.co.vividnext.sodalive.member.MemberRepository +import kr.co.vividnext.sodalive.point.MemberPoint +import kr.co.vividnext.sodalive.point.MemberPointRepository +import kr.co.vividnext.sodalive.point.PointGrantLog +import kr.co.vividnext.sodalive.point.PointGrantLogRepository +import kr.co.vividnext.sodalive.useraction.ActionType import okhttp3.MediaType.Companion.toMediaTypeOrNull import okhttp3.OkHttpClient import okhttp3.Request @@ -27,6 +33,7 @@ import org.springframework.stereotype.Service import org.springframework.transaction.annotation.Transactional import java.math.BigDecimal import java.math.RoundingMode +import java.time.LocalDateTime @Service @Transactional(readOnly = true) @@ -36,6 +43,9 @@ class ChargeService( private val memberRepository: MemberRepository, private val couponNumberRepository: CanCouponNumberRepository, + private val grantLogRepository: PointGrantLogRepository, + private val memberPointRepository: MemberPointRepository, + private val objectMapper: ObjectMapper, private val okHttpClient: OkHttpClient, private val applicationEventPublisher: ApplicationEventPublisher, @@ -64,23 +74,53 @@ class ChargeService( if (canCouponNumber.member != null) { throw SodaException("이미 사용한 쿠폰번호 입니다.") } - canCouponNumber.member = member val coupon = canCouponNumber.canCoupon!! - val couponCharge = Charge(0, coupon.can, status = ChargeStatus.COUPON) - couponCharge.title = "${coupon.can} 캔" - couponCharge.member = member - val payment = Payment( - status = PaymentStatus.COMPLETE, - paymentGateway = PaymentGateway.PG - ) - payment.method = coupon.couponName - couponCharge.payment = payment - chargeRepository.save(couponCharge) + when (coupon.couponType) { + CouponType.CAN -> { + val couponCharge = Charge(0, coupon.can, status = ChargeStatus.COUPON) + couponCharge.title = "${coupon.can} 캔" + couponCharge.member = member - member.charge(0, coupon.can, "pg") + val payment = Payment( + status = PaymentStatus.COMPLETE, + paymentGateway = PaymentGateway.PG + ) + payment.method = coupon.couponName + couponCharge.payment = payment + chargeRepository.save(couponCharge) + + member.charge(0, coupon.can, "pg") + } + + CouponType.POINT -> { + val memberId = member.id!! + val point = coupon.can + val actionType = ActionType.COUPON + + grantLogRepository.save( + PointGrantLog( + memberId = memberId, + point = point, + actionType = actionType, + policyId = null, + orderId = null, + couponName = coupon.couponName + ) + ) + + memberPointRepository.save( + MemberPoint( + memberId = memberId, + point = point, + actionType = actionType, + expiresAt = LocalDateTime.now().plusDays(3) + ) + ) + } + } } @Transactional diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/point/PointGrantLog.kt b/src/main/kotlin/kr/co/vividnext/sodalive/point/PointGrantLog.kt index 83666c6..e2c3ab5 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/point/PointGrantLog.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/point/PointGrantLog.kt @@ -13,5 +13,6 @@ data class PointGrantLog( @Enumerated(EnumType.STRING) val actionType: ActionType, val policyId: Long?, - val orderId: Long? + val orderId: Long?, + val couponName: String? = null ) : BaseEntity()