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 e3809e9..df5d897 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 @@ -15,7 +15,7 @@ import java.time.LocalDateTime @Repository class AdminChargeStatusQueryRepository(private val queryFactory: JPAQueryFactory) { - fun getChargeStatus(startDate: LocalDateTime, endDate: LocalDateTime): List { + fun getChargeStatus(startDate: LocalDateTime, endDate: LocalDateTime): List { val formattedDate = Expressions.stringTemplate( "DATE_FORMAT({0}, {1})", Expressions.dateTimeTemplate( @@ -31,11 +31,41 @@ class AdminChargeStatusQueryRepository(private val queryFactory: JPAQueryFactory return queryFactory .select( - QGetChargeStatusQueryDto( + QGetChargeStatusResponse( formattedDate, payment.price.sum(), payment.id.count(), - payment.paymentGateway, + payment.paymentGateway.stringValue(), + currency.coalesce("KRW") + ) + ) + .from(payment) + .innerJoin(payment.charge, charge) + .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)) + ) + .groupBy(formattedDate, payment.paymentGateway, currency.coalesce("KRW")) + .orderBy(formattedDate.desc()) + .fetch() + } + + fun getChargeStatusSummary(startDate: LocalDateTime, endDate: LocalDateTime): List { + val currency = Expressions.stringTemplate( + "substring({0}, length({0}) - 2, 3)", + payment.locale + ).coalesce("KRW") + + return queryFactory + .select( + QGetChargeStatusResponse( + Expressions.stringTemplate("'합계'"), // date + payment.price.sum(), + payment.id.count(), + Expressions.stringTemplate("''"), currency ) ) @@ -48,8 +78,8 @@ class AdminChargeStatusQueryRepository(private val queryFactory: JPAQueryFactory .and(charge.status.eq(ChargeStatus.CHARGE)) .and(payment.status.eq(PaymentStatus.COMPLETE)) ) - .groupBy(formattedDate, payment.paymentGateway, currency) - .orderBy(formattedDate.desc()) + .groupBy(currency) + .orderBy(currency.asc()) .fetch() } @@ -70,7 +100,10 @@ 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 currencyExpr = Expressions.stringTemplate( + "substring({0}, length({0}) - 2, 3)", + payment.locale + ).coalesce("KRW") val whereBuilder = BooleanBuilder() whereBuilder.and(charge.createdAt.goe(startDate)) .and(charge.createdAt.loe(endDate)) @@ -89,7 +122,7 @@ class AdminChargeStatusQueryRepository(private val queryFactory: JPAQueryFactory member.nickname, payment.method.coalesce(""), payment.price, - currencyExpr.coalesce(""), + currencyExpr, formattedDate ) ) 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 ceead40..18bf00d 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,39 +20,8 @@ class AdminChargeStatusService(val repository: AdminChargeStatusQueryRepository) .withZoneSameInstant(ZoneId.of("UTC")) .toLocalDateTime() - val totalsByCurrency = mutableMapOf>() - - val chargeStatusList = repository.getChargeStatus(startDate, endDate) - .map { - val chargeAmount = it.amount - val chargeCount = it.chargeCount - val currency = it.currency - - 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, - currency = currency - ) - } - .toMutableList() - - val summaryRows = totalsByCurrency.entries - .sortedBy { it.key } - .map { (currency, total) -> - GetChargeStatusResponse( - date = "합계", - chargeAmount = total.first, - chargeCount = total.second, - pg = "", - currency = currency - ) - } - + val summaryRows = repository.getChargeStatusSummary(startDate, endDate) + val chargeStatusList = repository.getChargeStatus(startDate, endDate).toMutableList() chargeStatusList.addAll(0, summaryRows) return chargeStatusList.toList() 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 deleted file mode 100644 index c173892..0000000 --- a/src/main/kotlin/kr/co/vividnext/sodalive/admin/charge/GetChargeStatusQueryDto.kt +++ /dev/null @@ -1,13 +0,0 @@ -package kr.co.vividnext.sodalive.admin.charge - -import com.querydsl.core.annotations.QueryProjection -import kr.co.vividnext.sodalive.can.payment.PaymentGateway -import java.math.BigDecimal - -data class GetChargeStatusQueryDto @QueryProjection constructor( - val date: String, - val amount: BigDecimal, - val chargeCount: Long, - 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 3d914a9..c7bcb0a 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 @@ -1,8 +1,9 @@ package kr.co.vividnext.sodalive.admin.charge +import com.querydsl.core.annotations.QueryProjection import java.math.BigDecimal -data class GetChargeStatusResponse( +data class GetChargeStatusResponse @QueryProjection constructor( val date: String, val chargeAmount: BigDecimal, val chargeCount: Long,