diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/AdminCalculateController.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/AdminCalculateController.kt index 2231204..30dbe37 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/AdminCalculateController.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/AdminCalculateController.kt @@ -34,4 +34,18 @@ class AdminCalculateController(private val service: AdminCalculateService) { @RequestParam startDateStr: String, @RequestParam endDateStr: String ) = ApiResponse.ok(service.getCalculateContentDonationList(startDateStr, endDateStr)) + + @GetMapping("/community-post") + fun getCalculateCommunityPost( + @RequestParam startDateStr: String, + @RequestParam endDateStr: String, + pageable: Pageable + ) = ApiResponse.ok( + service.getCalculateCommunityPost( + startDateStr, + endDateStr, + pageable.offset, + pageable.pageSize.toLong() + ) + ) } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/AdminCalculateQueryRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/AdminCalculateQueryRepository.kt index 6c43dab..cdd1433 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/AdminCalculateQueryRepository.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/AdminCalculateQueryRepository.kt @@ -8,6 +8,7 @@ import kr.co.vividnext.sodalive.can.use.CanUsage import kr.co.vividnext.sodalive.can.use.QUseCan.useCan import kr.co.vividnext.sodalive.content.QAudioContent.audioContent import kr.co.vividnext.sodalive.content.order.QOrder.order +import kr.co.vividnext.sodalive.explorer.profile.creatorCommunity.QCreatorCommunity.creatorCommunity import kr.co.vividnext.sodalive.live.room.QLiveRoom.liveRoom import kr.co.vividnext.sodalive.member.QMember.member import org.springframework.stereotype.Repository @@ -152,4 +153,35 @@ class AdminCalculateQueryRepository(private val queryFactory: JPAQueryFactory) { .orderBy(member.id.asc(), donationFormattedDate.desc()) .fetch() } + + fun getCalculateCommunityPostList( + startDate: LocalDateTime?, + endDate: LocalDateTime?, + offset: Long, + limit: Long + ): List<GetCalculateCommunityPostQueryData> { + val formattedDate = getFormattedDate(useCan.createdAt) + return queryFactory + .select( + QGetCalculateCommunityPostQueryData( + member.nickname, + Expressions.stringTemplate("substring({0}, 1, 10)", creatorCommunity.content), + formattedDate, + useCan.id.count(), + useCan.can.add(useCan.rewardCan).sum() + ) + ) + .from(useCan) + .innerJoin(useCan.communityPost, creatorCommunity) + .innerJoin(creatorCommunity.member, member) + .where( + useCan.isRefund.isFalse + .and(useCan.canUsage.eq(CanUsage.PAID_COMMUNITY_POST)) + .and(useCan.createdAt.goe(startDate)) + .and(useCan.createdAt.loe(endDate)) + ) + .groupBy(formattedDate, creatorCommunity.id) + .orderBy(member.id.asc(), formattedDate.desc()) + .fetch() + } } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/AdminCalculateService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/AdminCalculateService.kt index 8b1bd4c..2e5a780 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/AdminCalculateService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/AdminCalculateService.kt @@ -2,6 +2,7 @@ package kr.co.vividnext.sodalive.admin.calculate import kr.co.vividnext.sodalive.can.use.CanUsage import kr.co.vividnext.sodalive.content.order.OrderType +import kr.co.vividnext.sodalive.extensions.convertLocalDateTime import org.springframework.cache.annotation.Cacheable import org.springframework.stereotype.Service import org.springframework.transaction.annotation.Transactional @@ -266,4 +267,37 @@ class AdminCalculateService(private val repository: AdminCalculateQueryRepositor } .toList() } + + fun getCalculateCommunityPost( + startDateStr: String, + endDateStr: String, + offset: Long, + limit: Long + ): List<GetCalculateCommunityPostResponse> { + val startDate = startDateStr.convertLocalDateTime() + val endDate = endDateStr.convertLocalDateTime(hour = 23, minute = 59, second = 59) + + return repository + .getCalculateCommunityPostList(startDate, endDate, offset, limit) + .map { + val totalKrw = it.totalCan * 100 + val paymentFee = totalKrw * 0.066f + val settlementAmount = (totalKrw.toFloat() - paymentFee) * 0.7 + val tax = settlementAmount * 0.033 + val depositAmount = settlementAmount - tax + + GetCalculateCommunityPostResponse( + nickname = it.nickname, + title = it.title, + date = it.date, + numberOfPurchase = it.numberOfPurchase.toInt(), + totalCan = it.totalCan, + totalKrw = totalKrw, + paymentFee = paymentFee.roundToInt(), + settlementAmount = settlementAmount.roundToInt(), + tax = tax.roundToInt(), + depositAmount = depositAmount.roundToInt() + ) + } + } } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/extensions/StringExtensions.kt b/src/main/kotlin/kr/co/vividnext/sodalive/extensions/StringExtensions.kt index ff1bb02..3e810b5 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/extensions/StringExtensions.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/extensions/StringExtensions.kt @@ -1,9 +1,26 @@ package kr.co.vividnext.sodalive.extensions +import java.time.LocalDate import java.time.LocalDateTime +import java.time.ZoneId import java.time.format.DateTimeFormatter fun String.convertLocalDateTime(format: String): LocalDateTime { val dateTimeFormatter = DateTimeFormatter.ofPattern(format) return LocalDateTime.parse(this, dateTimeFormatter) } + +fun String.convertLocalDateTime( + format: String = "yyyy-MM-dd", + currentTimeZoneStr: String = "ASIA/Seoul", + hour: Int = 0, + minute: Int = 0, + second: Int = 0 +): LocalDateTime { + val dateTimeFormatter = DateTimeFormatter.ofPattern(format) + return LocalDate.parse(this, dateTimeFormatter) + .atTime(hour, minute, second) + .atZone(ZoneId.of(currentTimeZoneStr)) + .withZoneSameInstant(ZoneId.of("UTC")) + .toLocalDateTime() +}