From 21bf0910c5b1ddeef2f7480e60ead05a0a03104a Mon Sep 17 00:00:00 2001
From: Klaus <klaus@vividnext.co.kr>
Date: Mon, 27 May 2024 15:25:50 +0900
Subject: [PATCH] =?UTF-8?q?=ED=81=AC=EB=A6=AC=EC=97=90=EC=9D=B4=ED=84=B0?=
 =?UTF-8?q?=20=EA=B4=80=EB=A6=AC=EC=9E=90=20-=20=EC=BB=A4=EB=AE=A4?=
 =?UTF-8?q?=EB=8B=88=ED=8B=B0=20=EA=B2=8C=EC=8B=9C=EB=AC=BC=20=EC=A0=95?=
 =?UTF-8?q?=EC=82=B0=20API=20=EC=B6=94=EA=B0=80?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../GetCalculateCommunityPostQueryData.kt     | 11 ++++
 .../GetCalculateCommunityPostResponse.kt      | 16 ++++++
 .../CreatorAdminCalculateController.kt        | 20 +++++++
 .../CreatorAdminCalculateQueryRepository.kt   | 55 +++++++++++++++++++
 .../calculate/CreatorAdminCalculateService.kt | 46 ++++++++++++++++
 ...etCreatorCalculateCommunityPostResponse.kt |  9 +++
 6 files changed, 157 insertions(+)
 create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/GetCalculateCommunityPostQueryData.kt
 create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/GetCalculateCommunityPostResponse.kt
 create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/calculate/GetCreatorCalculateCommunityPostResponse.kt

diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/GetCalculateCommunityPostQueryData.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/GetCalculateCommunityPostQueryData.kt
new file mode 100644
index 0000000..bfe0535
--- /dev/null
+++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/GetCalculateCommunityPostQueryData.kt
@@ -0,0 +1,11 @@
+package kr.co.vividnext.sodalive.admin.calculate
+
+import com.querydsl.core.annotations.QueryProjection
+
+data class GetCalculateCommunityPostQueryData @QueryProjection constructor(
+    val nickname: String,
+    val title: String,
+    val date: String,
+    val numberOfPurchase: Long,
+    val totalCan: Int
+)
diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/GetCalculateCommunityPostResponse.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/GetCalculateCommunityPostResponse.kt
new file mode 100644
index 0000000..d2adac5
--- /dev/null
+++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/GetCalculateCommunityPostResponse.kt
@@ -0,0 +1,16 @@
+package kr.co.vividnext.sodalive.admin.calculate
+
+import com.fasterxml.jackson.annotation.JsonProperty
+
+data class GetCalculateCommunityPostResponse(
+    @JsonProperty("nickname") val nickname: String,
+    @JsonProperty("title") val title: String,
+    @JsonProperty("date") val date: String,
+    @JsonProperty("numberOfPurchase") val numberOfPurchase: Int,
+    @JsonProperty("totalCan") val totalCan: Int,
+    @JsonProperty("totalKrw") val totalKrw: Int,
+    @JsonProperty("paymentFee") val paymentFee: Int,
+    @JsonProperty("settlementAmount") val settlementAmount: Int,
+    @JsonProperty("tax") val tax: Int,
+    @JsonProperty("depositAmount") val depositAmount: Int
+)
diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/calculate/CreatorAdminCalculateController.kt b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/calculate/CreatorAdminCalculateController.kt
index 50235ff..e5f78f6 100644
--- a/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/calculate/CreatorAdminCalculateController.kt
+++ b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/calculate/CreatorAdminCalculateController.kt
@@ -72,4 +72,24 @@ class CreatorAdminCalculateController(private val service: CreatorAdminCalculate
             )
         )
     }
+
+    @GetMapping("/community-post")
+    fun getCalculateCommunityPost(
+        @RequestParam startDateStr: String,
+        @RequestParam endDateStr: String,
+        @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?,
+        pageable: Pageable
+    ) = run {
+        if (member == null) throw SodaException("로그인 정보를 확인해주세요.")
+
+        ApiResponse.ok(
+            service.getCalculateCommunityPost(
+                startDateStr,
+                endDateStr,
+                member.id!!,
+                pageable.offset,
+                pageable.pageSize.toLong()
+            )
+        )
+    }
 }
diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/calculate/CreatorAdminCalculateQueryRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/calculate/CreatorAdminCalculateQueryRepository.kt
index a6d49df..650d160 100644
--- a/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/calculate/CreatorAdminCalculateQueryRepository.kt
+++ b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/calculate/CreatorAdminCalculateQueryRepository.kt
@@ -4,10 +4,12 @@ import com.querydsl.core.types.dsl.DateTimePath
 import com.querydsl.core.types.dsl.Expressions
 import com.querydsl.core.types.dsl.StringTemplate
 import com.querydsl.jpa.impl.JPAQueryFactory
+import kr.co.vividnext.sodalive.admin.calculate.GetCalculateCommunityPostQueryData
 import kr.co.vividnext.sodalive.admin.calculate.GetCalculateContentDonationQueryData
 import kr.co.vividnext.sodalive.admin.calculate.GetCalculateContentQueryData
 import kr.co.vividnext.sodalive.admin.calculate.GetCalculateLiveQueryData
 import kr.co.vividnext.sodalive.admin.calculate.GetCumulativeSalesByContentQueryData
+import kr.co.vividnext.sodalive.admin.calculate.QGetCalculateCommunityPostQueryData
 import kr.co.vividnext.sodalive.admin.calculate.QGetCalculateContentDonationQueryData
 import kr.co.vividnext.sodalive.admin.calculate.QGetCalculateContentQueryData
 import kr.co.vividnext.sodalive.admin.calculate.QGetCalculateLiveQueryData
@@ -16,6 +18,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
@@ -246,4 +249,56 @@ class CreatorAdminCalculateQueryRepository(private val queryFactory: JPAQueryFac
             .orderBy(member.id.asc(), donationFormattedDate.desc())
             .fetch()
     }
+
+    fun getCalculateCommunityPostTotalCount(startDate: LocalDateTime?, endDate: LocalDateTime?, memberId: Long): Int {
+        val formattedDate = getFormattedDate(useCan.createdAt)
+        return queryFactory
+            .select(creatorCommunity.id)
+            .from(useCan)
+            .innerJoin(useCan.communityPost, creatorCommunity)
+            .innerJoin(creatorCommunity.member, member)
+            .where(
+                useCan.isRefund.isFalse
+                    .and(useCan.canUsage.eq(CanUsage.DONATION))
+                    .and(useCan.createdAt.goe(startDate))
+                    .and(useCan.createdAt.loe(endDate))
+                    .and(creatorCommunity.member.id.eq(memberId))
+            )
+            .groupBy(formattedDate, creatorCommunity.id)
+            .fetch()
+            .size
+    }
+
+    fun getCalculateCommunityPostList(
+        startDate: LocalDateTime?,
+        endDate: LocalDateTime?,
+        memberId: Long,
+        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.DONATION))
+                    .and(useCan.createdAt.goe(startDate))
+                    .and(useCan.createdAt.loe(endDate))
+                    .and(creatorCommunity.member.id.eq(memberId))
+            )
+            .groupBy(formattedDate, creatorCommunity.id)
+            .orderBy(member.id.asc(), formattedDate.desc())
+            .fetch()
+    }
 }
diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/calculate/CreatorAdminCalculateService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/calculate/CreatorAdminCalculateService.kt
index f6c0330..cb5f11b 100644
--- a/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/calculate/CreatorAdminCalculateService.kt
+++ b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/calculate/CreatorAdminCalculateService.kt
@@ -1,6 +1,7 @@
 package kr.co.vividnext.sodalive.creator.admin.calculate
 
 import kr.co.vividnext.sodalive.admin.calculate.CumulativeSalesByContentItem
+import kr.co.vividnext.sodalive.admin.calculate.GetCalculateCommunityPostResponse
 import kr.co.vividnext.sodalive.admin.calculate.GetCalculateContentDonationResponse
 import kr.co.vividnext.sodalive.admin.calculate.GetCalculateContentResponse
 import kr.co.vividnext.sodalive.admin.calculate.GetCalculateLiveResponse
@@ -288,4 +289,49 @@ class CreatorAdminCalculateService(private val repository: CreatorAdminCalculate
 
         return GetCreatorCalculateContentDonationResponse(totalCount, items)
     }
+
+    fun getCalculateCommunityPost(
+        startDateStr: String,
+        endDateStr: String,
+        memberId: Long,
+        offset: Long,
+        limit: Long
+    ): GetCreatorCalculateCommunityPostResponse {
+        val dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd")
+        val startDate = LocalDate.parse(startDateStr, dateTimeFormatter).atTime(0, 0, 0)
+            .atZone(ZoneId.of("Asia/Seoul"))
+            .withZoneSameInstant(ZoneId.of("UTC"))
+            .toLocalDateTime()
+
+        val endDate = LocalDate.parse(endDateStr, dateTimeFormatter).atTime(23, 59, 59)
+            .atZone(ZoneId.of("Asia/Seoul"))
+            .withZoneSameInstant(ZoneId.of("UTC"))
+            .toLocalDateTime()
+
+        val totalCount = repository.getCalculateCommunityPostTotalCount(startDate, endDate, memberId)
+        val items = repository
+            .getCalculateCommunityPostList(startDate, endDate, memberId, 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()
+                )
+            }
+
+        return GetCreatorCalculateCommunityPostResponse(totalCount, items)
+    }
 }
diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/calculate/GetCreatorCalculateCommunityPostResponse.kt b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/calculate/GetCreatorCalculateCommunityPostResponse.kt
new file mode 100644
index 0000000..9c6169f
--- /dev/null
+++ b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/calculate/GetCreatorCalculateCommunityPostResponse.kt
@@ -0,0 +1,9 @@
+package kr.co.vividnext.sodalive.creator.admin.calculate
+
+import com.fasterxml.jackson.annotation.JsonProperty
+import kr.co.vividnext.sodalive.admin.calculate.GetCalculateCommunityPostResponse
+
+data class GetCreatorCalculateCommunityPostResponse(
+    @JsonProperty("totalCount") val totalCount: Int,
+    @JsonProperty("items") val items: List<GetCalculateCommunityPostResponse>
+)