diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/charge/AdminChargeStatusController.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/charge/AdminChargeStatusController.kt index be859be..7047d4f 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/admin/charge/AdminChargeStatusController.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/charge/AdminChargeStatusController.kt @@ -21,6 +21,7 @@ class AdminChargeStatusController(private val service: AdminChargeStatusService) @GetMapping("/detail") fun getChargeStatusDetail( @RequestParam startDateStr: String, - @RequestParam paymentGateway: PaymentGateway - ) = ApiResponse.ok(service.getChargeStatusDetail(startDateStr, paymentGateway)) + @RequestParam paymentGateway: PaymentGateway, + @RequestParam(value = "currency", required = false) currency: String? = null + ) = ApiResponse.ok(service.getChargeStatusDetail(startDateStr, paymentGateway, currency)) } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/charge/AdminChargeStatusQueryRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/charge/AdminChargeStatusQueryRepository.kt index f1ec63c..e3809e9 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/admin/charge/AdminChargeStatusQueryRepository.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/charge/AdminChargeStatusQueryRepository.kt @@ -1,5 +1,6 @@ package kr.co.vividnext.sodalive.admin.charge +import com.querydsl.core.BooleanBuilder import com.querydsl.core.types.dsl.Expressions import com.querydsl.jpa.impl.JPAQueryFactory import kr.co.vividnext.sodalive.can.QCan.can1 @@ -26,6 +27,7 @@ class AdminChargeStatusQueryRepository(private val queryFactory: JPAQueryFactory ), "%Y-%m-%d" ) + val currency = Expressions.stringTemplate("substring({0}, length({0}) - 2, 3)", payment.locale) return queryFactory .select( @@ -33,7 +35,8 @@ class AdminChargeStatusQueryRepository(private val queryFactory: JPAQueryFactory formattedDate, payment.price.sum(), payment.id.count(), - payment.paymentGateway + payment.paymentGateway, + currency ) ) .from(payment) @@ -45,7 +48,7 @@ class AdminChargeStatusQueryRepository(private val queryFactory: JPAQueryFactory .and(charge.status.eq(ChargeStatus.CHARGE)) .and(payment.status.eq(PaymentStatus.COMPLETE)) ) - .groupBy(formattedDate, payment.paymentGateway) + .groupBy(formattedDate, payment.paymentGateway, currency) .orderBy(formattedDate.desc()) .fetch() } @@ -53,7 +56,8 @@ class AdminChargeStatusQueryRepository(private val queryFactory: JPAQueryFactory fun getChargeStatusDetail( startDate: LocalDateTime, endDate: LocalDateTime, - paymentGateway: PaymentGateway + paymentGateway: PaymentGateway, + currency: String? = null ): List { val formattedDate = Expressions.stringTemplate( "DATE_FORMAT({0}, {1})", @@ -66,6 +70,17 @@ class AdminChargeStatusQueryRepository(private val queryFactory: JPAQueryFactory ), "%Y-%m-%d %H:%i:%s" ) + val currencyExpr = Expressions.stringTemplate("substring({0}, length({0}) - 2, 3)", payment.locale) + val whereBuilder = BooleanBuilder() + whereBuilder.and(charge.createdAt.goe(startDate)) + .and(charge.createdAt.loe(endDate)) + .and(charge.status.eq(ChargeStatus.CHARGE)) + .and(payment.status.eq(PaymentStatus.COMPLETE)) + .and(payment.paymentGateway.eq(paymentGateway)) + + if (currency != null) { + whereBuilder.and(currencyExpr.eq(currency)) + } return queryFactory .select( @@ -74,7 +89,7 @@ class AdminChargeStatusQueryRepository(private val queryFactory: JPAQueryFactory member.nickname, payment.method.coalesce(""), payment.price, - payment.locale.coalesce(""), + currencyExpr.coalesce(""), formattedDate ) ) @@ -82,13 +97,7 @@ class AdminChargeStatusQueryRepository(private val queryFactory: JPAQueryFactory .innerJoin(charge.member, member) .innerJoin(charge.payment, payment) .leftJoin(charge.can, can1) - .where( - charge.createdAt.goe(startDate) - .and(charge.createdAt.loe(endDate)) - .and(charge.status.eq(ChargeStatus.CHARGE)) - .and(payment.status.eq(PaymentStatus.COMPLETE)) - .and(payment.paymentGateway.eq(paymentGateway)) - ) + .where(whereBuilder) .orderBy(formattedDate.desc()) .fetch() } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/charge/AdminChargeStatusService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/charge/AdminChargeStatusService.kt index f1b5e7e..ceead40 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/admin/charge/AdminChargeStatusService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/charge/AdminChargeStatusService.kt @@ -20,42 +20,48 @@ class AdminChargeStatusService(val repository: AdminChargeStatusQueryRepository) .withZoneSameInstant(ZoneId.of("UTC")) .toLocalDateTime() - var totalChargeAmount = 0.toBigDecimal() - var totalChargeCount = 0L + val totalsByCurrency = mutableMapOf>() val chargeStatusList = repository.getChargeStatus(startDate, endDate) .map { val chargeAmount = it.amount val chargeCount = it.chargeCount + val currency = it.currency - totalChargeAmount += chargeAmount - totalChargeCount += chargeCount + val prev = totalsByCurrency[currency] ?: (0.toBigDecimal() to 0L) + totalsByCurrency[currency] = (prev.first + chargeAmount) to (prev.second + chargeCount) GetChargeStatusResponse( date = it.date, chargeAmount = chargeAmount, chargeCount = chargeCount, - pg = it.paymentGateWay.name + pg = it.paymentGateWay.name, + currency = currency ) } .toMutableList() - chargeStatusList.add( - 0, - GetChargeStatusResponse( - date = "합계", - chargeAmount = totalChargeAmount, - chargeCount = totalChargeCount, - pg = "" - ) - ) + val summaryRows = totalsByCurrency.entries + .sortedBy { it.key } + .map { (currency, total) -> + GetChargeStatusResponse( + date = "합계", + chargeAmount = total.first, + chargeCount = total.second, + pg = "", + currency = currency + ) + } + + chargeStatusList.addAll(0, summaryRows) return chargeStatusList.toList() } fun getChargeStatusDetail( startDateStr: String, - paymentGateway: PaymentGateway + paymentGateway: PaymentGateway, + currency: String? = null ): List { val dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd") val startDate = LocalDate.parse(startDateStr, dateTimeFormatter).atTime(0, 0, 0) @@ -68,13 +74,13 @@ class AdminChargeStatusService(val repository: AdminChargeStatusQueryRepository) .withZoneSameInstant(ZoneId.of("UTC")) .toLocalDateTime() - return repository.getChargeStatusDetail(startDate, endDate, paymentGateway) + return repository.getChargeStatusDetail(startDate, endDate, paymentGateway, currency) .map { GetChargeStatusDetailResponse( memberId = it.memberId, nickname = it.nickname, method = it.method, - amount = it.amount.toInt(), + amount = it.amount, locale = it.locale, datetime = it.datetime ) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/charge/GetChargeStatusDetailResponse.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/charge/GetChargeStatusDetailResponse.kt index 6e03036..8a6baee 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/admin/charge/GetChargeStatusDetailResponse.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/charge/GetChargeStatusDetailResponse.kt @@ -1,10 +1,12 @@ package kr.co.vividnext.sodalive.admin.charge +import java.math.BigDecimal + data class GetChargeStatusDetailResponse( val memberId: Long, val nickname: String, val method: String, - val amount: Int, + val amount: BigDecimal, val locale: String, val datetime: String ) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/charge/GetChargeStatusQueryDto.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/charge/GetChargeStatusQueryDto.kt index 22bdd4c..c173892 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/admin/charge/GetChargeStatusQueryDto.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/charge/GetChargeStatusQueryDto.kt @@ -8,5 +8,6 @@ data class GetChargeStatusQueryDto @QueryProjection constructor( val date: String, val amount: BigDecimal, val chargeCount: Long, - val paymentGateWay: PaymentGateway + val paymentGateWay: PaymentGateway, + val currency: String ) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/charge/GetChargeStatusResponse.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/charge/GetChargeStatusResponse.kt index 75dffcb..3d914a9 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/admin/charge/GetChargeStatusResponse.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/charge/GetChargeStatusResponse.kt @@ -6,5 +6,6 @@ data class GetChargeStatusResponse( val date: String, val chargeAmount: BigDecimal, val chargeCount: Long, - val pg: String + val pg: String, + val currency: String )