From 7f5e138cf70b40b7fcc11b242c44e96f7f1a3285 Mon Sep 17 00:00:00 2001 From: Klaus Date: Tue, 11 Jun 2024 07:39:07 +0900 Subject: [PATCH 1/4] =?UTF-8?q?=EA=B4=80=EB=A6=AC=EC=9E=90=20-=20=ED=81=AC?= =?UTF-8?q?=EB=A6=AC=EC=97=90=EC=9D=B4=ED=84=B0=20=EC=A0=95=EC=82=B0=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=EB=8D=B0=EC=9D=B4=ED=84=B0=20insert,=20selec?= =?UTF-8?q?t=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CreateCreatorSettlementRatioRequest.kt | 16 +++++++ .../calculate/ratio/CreatorSettlementRatio.kt | 20 ++++++++ .../ratio/CreatorSettlementRatioController.kt | 30 ++++++++++++ .../ratio/CreatorSettlementRatioRepository.kt | 46 +++++++++++++++++++ .../ratio/CreatorSettlementRatioService.kt | 37 +++++++++++++++ .../GetCreatorSettlementRatioResponse.kt | 16 +++++++ 6 files changed, 165 insertions(+) create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/ratio/CreateCreatorSettlementRatioRequest.kt create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/ratio/CreatorSettlementRatio.kt create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/ratio/CreatorSettlementRatioController.kt create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/ratio/CreatorSettlementRatioRepository.kt create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/ratio/CreatorSettlementRatioService.kt create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/ratio/GetCreatorSettlementRatioResponse.kt diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/ratio/CreateCreatorSettlementRatioRequest.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/ratio/CreateCreatorSettlementRatioRequest.kt new file mode 100644 index 0000000..0d9dc2e --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/ratio/CreateCreatorSettlementRatioRequest.kt @@ -0,0 +1,16 @@ +package kr.co.vividnext.sodalive.admin.calculate.ratio + +data class CreateCreatorSettlementRatioRequest( + val memberId: Long, + val subsidy: Int, + val liveSettlementRatio: Int, + val contentSettlementRatio: Int, + val communitySettlementRatio: Int +) { + fun toEntity() = CreatorSettlementRatio( + subsidy = subsidy, + liveSettlementRatio = liveSettlementRatio, + contentSettlementRatio = contentSettlementRatio, + communitySettlementRatio = communitySettlementRatio + ) +} diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/ratio/CreatorSettlementRatio.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/ratio/CreatorSettlementRatio.kt new file mode 100644 index 0000000..33ce414 --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/ratio/CreatorSettlementRatio.kt @@ -0,0 +1,20 @@ +package kr.co.vividnext.sodalive.admin.calculate.ratio + +import kr.co.vividnext.sodalive.common.BaseEntity +import kr.co.vividnext.sodalive.member.Member +import javax.persistence.Entity +import javax.persistence.FetchType +import javax.persistence.JoinColumn +import javax.persistence.OneToOne + +@Entity +data class CreatorSettlementRatio( + val subsidy: Int, + val liveSettlementRatio: Int, + val contentSettlementRatio: Int, + val communitySettlementRatio: Int +) : BaseEntity() { + @OneToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "member_id", nullable = false) + var member: Member? = null +} diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/ratio/CreatorSettlementRatioController.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/ratio/CreatorSettlementRatioController.kt new file mode 100644 index 0000000..10cd41e --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/ratio/CreatorSettlementRatioController.kt @@ -0,0 +1,30 @@ +package kr.co.vividnext.sodalive.admin.calculate.ratio + +import kr.co.vividnext.sodalive.common.ApiResponse +import org.springframework.data.domain.Pageable +import org.springframework.security.access.prepost.PreAuthorize +import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.PostMapping +import org.springframework.web.bind.annotation.RequestBody +import org.springframework.web.bind.annotation.RequestMapping +import org.springframework.web.bind.annotation.RestController + +@RestController +@PreAuthorize("hasRole('ADMIN')") +@RequestMapping("/admin/calculate/ratio") +class CreatorSettlementRatioController(private val service: CreatorSettlementRatioService) { + @PostMapping + fun createCreatorSettlementRatio( + @RequestBody request: CreateCreatorSettlementRatioRequest + ) = ApiResponse.ok(service.createCreatorSettlementRatio(request)) + + @GetMapping + fun getCreatorSettlementRatio( + pageable: Pageable + ) = ApiResponse.ok( + service.getCreatorSettlementRatio( + offset = pageable.offset, + limit = pageable.pageSize.toLong() + ) + ) +} diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/ratio/CreatorSettlementRatioRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/ratio/CreatorSettlementRatioRepository.kt new file mode 100644 index 0000000..e788f53 --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/ratio/CreatorSettlementRatioRepository.kt @@ -0,0 +1,46 @@ +package kr.co.vividnext.sodalive.admin.calculate.ratio + +import com.querydsl.jpa.impl.JPAQueryFactory +import kr.co.vividnext.sodalive.admin.calculate.ratio.QCreatorSettlementRatio.creatorSettlementRatio +import kr.co.vividnext.sodalive.member.QMember.member +import org.springframework.data.jpa.repository.JpaRepository + +interface CreatorSettlementRatioRepository : + JpaRepository, + CreatorSettlementRatioQueryRepository + +interface CreatorSettlementRatioQueryRepository { + fun getCreatorSettlementRatio(offset: Long, limit: Long): List + fun getCreatorSettlementRatioTotalCount(): Int +} + +class CreatorSettlementRatioQueryRepositoryImpl( + private val queryFactory: JPAQueryFactory +) : CreatorSettlementRatioQueryRepository { + override fun getCreatorSettlementRatio(offset: Long, limit: Long): List { + return queryFactory + .select( + QGetCreatorSettlementRatioItem( + member.nickname, + creatorSettlementRatio.subsidy, + creatorSettlementRatio.liveSettlementRatio, + creatorSettlementRatio.contentSettlementRatio, + creatorSettlementRatio.communitySettlementRatio + ) + ) + .from(creatorSettlementRatio) + .innerJoin(creatorSettlementRatio.member, member) + .orderBy(creatorSettlementRatio.id.asc()) + .offset(offset) + .limit(limit) + .fetch() + } + + override fun getCreatorSettlementRatioTotalCount(): Int { + return queryFactory + .select(creatorSettlementRatio.id) + .from(creatorSettlementRatio) + .fetch() + .size + } +} diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/ratio/CreatorSettlementRatioService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/ratio/CreatorSettlementRatioService.kt new file mode 100644 index 0000000..140fb4a --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/ratio/CreatorSettlementRatioService.kt @@ -0,0 +1,37 @@ +package kr.co.vividnext.sodalive.admin.calculate.ratio + +import kr.co.vividnext.sodalive.common.SodaException +import kr.co.vividnext.sodalive.member.MemberRepository +import kr.co.vividnext.sodalive.member.MemberRole +import org.springframework.data.repository.findByIdOrNull +import org.springframework.stereotype.Service +import org.springframework.transaction.annotation.Transactional + +@Service +class CreatorSettlementRatioService( + private val repository: CreatorSettlementRatioRepository, + private val memberRepository: MemberRepository +) { + @Transactional + fun createCreatorSettlementRatio(request: CreateCreatorSettlementRatioRequest) { + val creatorSettlementRatio = request.toEntity() + + val creator = memberRepository.findByIdOrNull(request.memberId) + ?: throw SodaException("잘못된 크리에이터 입니다.") + + if (creator.role != MemberRole.CREATOR) { + throw SodaException("잘못된 크리에이터 입니다.") + } + + creatorSettlementRatio.member = creator + repository.save(creatorSettlementRatio) + } + + @Transactional(readOnly = true) + fun getCreatorSettlementRatio(offset: Long, limit: Long): GetCreatorSettlementRatioResponse { + val totalCount = repository.getCreatorSettlementRatioTotalCount() + val items = repository.getCreatorSettlementRatio(offset, limit) + + return GetCreatorSettlementRatioResponse(totalCount, items) + } +} diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/ratio/GetCreatorSettlementRatioResponse.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/ratio/GetCreatorSettlementRatioResponse.kt new file mode 100644 index 0000000..24a4d96 --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/ratio/GetCreatorSettlementRatioResponse.kt @@ -0,0 +1,16 @@ +package kr.co.vividnext.sodalive.admin.calculate.ratio + +import com.querydsl.core.annotations.QueryProjection + +data class GetCreatorSettlementRatioResponse( + val totalCount: Int, + val items: List +) + +data class GetCreatorSettlementRatioItem @QueryProjection constructor( + val nickname: String, + val subsidy: Int, + val liveSettlementRatio: Int, + val contentSettlementRatio: Int, + val communitySettlementRatio: Int +) -- 2.40.1 From 9396f70f858b68c2784fa55cb0665bfe5ece169e Mon Sep 17 00:00:00 2001 From: Klaus Date: Tue, 11 Jun 2024 16:30:00 +0900 Subject: [PATCH 2/4] =?UTF-8?q?=EA=B4=80=EB=A6=AC=EC=9E=90=20=EB=9D=BC?= =?UTF-8?q?=EC=9D=B4=EB=B8=8C=20=EC=A0=95=EC=82=B0=20-=20=ED=81=AC?= =?UTF-8?q?=EB=A6=AC=EC=97=90=EC=9D=B4=ED=84=B0=20=EC=A0=95=EC=82=B0=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=EB=8D=B0=EC=9D=B4=ED=84=B0=EA=B0=80=20?= =?UTF-8?q?=EC=9E=88=EC=9C=BC=EB=A9=B4=20=ED=95=B4=EB=8B=B9=20=EB=8D=B0?= =?UTF-8?q?=EC=9D=B4=ED=84=B0=EC=97=90=20=EC=9E=85=EB=A0=A5=EB=90=9C=20?= =?UTF-8?q?=EC=A0=95=EC=82=B0=EB=B9=84=EC=9C=A8=EB=A1=9C=20=EA=B3=84?= =?UTF-8?q?=EC=82=B0=EB=90=98=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/calculate/AdminCalculateQueryRepository.kt | 6 +++++- .../admin/calculate/GetCalculateLiveQueryData.kt | 10 ++++++++-- .../calculate/CreatorAdminCalculateQueryRepository.kt | 6 +++++- 3 files changed, 18 insertions(+), 4 deletions(-) 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 b116762..1fb435f 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 @@ -4,6 +4,7 @@ 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.ratio.QCreatorSettlementRatio.creatorSettlementRatio 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 @@ -29,12 +30,15 @@ class AdminCalculateQueryRepository(private val queryFactory: JPAQueryFactory) { liveRoom.price, useCan.canUsage, useCan.id.count(), - useCan.can.add(useCan.rewardCan).sum() + useCan.can.add(useCan.rewardCan).sum(), + creatorSettlementRatio.liveSettlementRatio ) ) .from(useCan) .innerJoin(useCan.room, liveRoom) .innerJoin(liveRoom.member, member) + .leftJoin(creatorSettlementRatio) + .on(member.id.eq(creatorSettlementRatio.member.id)) .where( useCan.isRefund.isFalse .and(liveRoom.beginDateTime.goe(startDate)) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/GetCalculateLiveQueryData.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/GetCalculateLiveQueryData.kt index f8b7e02..d372c7f 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/GetCalculateLiveQueryData.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/GetCalculateLiveQueryData.kt @@ -16,7 +16,9 @@ data class GetCalculateLiveQueryData @QueryProjection constructor( // 참여인원 val memberCount: Long, // 합계 - val totalAmount: Int + val totalAmount: Int, + // 정산비율 + val settlementRatio: Int? ) { fun toGetCalculateLiveResponse(): GetCalculateLiveResponse { val canUsageStr = when (canUsage) { @@ -46,7 +48,11 @@ data class GetCalculateLiveQueryData @QueryProjection constructor( val paymentFee = totalKrw * 0.066f // 정산금액 = (원화 - 결제수수료) 의 70% - val settlementAmount = (totalKrw.toFloat() - paymentFee) * 0.7 + val settlementAmount = if (settlementRatio != null) { + (totalKrw.toFloat() - paymentFee) * (settlementRatio.toFloat() / 100.0f) + } else { + (totalKrw.toFloat() - paymentFee) * 0.7f + } // 원천세 = 정산금액의 3.3% val tax = settlementAmount * 0.033 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 7c534d4..ef433f5 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 @@ -14,6 +14,7 @@ import kr.co.vividnext.sodalive.admin.calculate.QGetCalculateContentDonationQuer import kr.co.vividnext.sodalive.admin.calculate.QGetCalculateContentQueryData import kr.co.vividnext.sodalive.admin.calculate.QGetCalculateLiveQueryData import kr.co.vividnext.sodalive.admin.calculate.QGetCumulativeSalesByContentQueryData +import kr.co.vividnext.sodalive.admin.calculate.ratio.QCreatorSettlementRatio.creatorSettlementRatio 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 @@ -43,12 +44,15 @@ class CreatorAdminCalculateQueryRepository(private val queryFactory: JPAQueryFac liveRoom.price, useCan.canUsage, useCan.id.count(), - useCan.can.add(useCan.rewardCan).sum() + useCan.can.add(useCan.rewardCan).sum(), + creatorSettlementRatio.liveSettlementRatio ) ) .from(useCan) .innerJoin(useCan.room, liveRoom) .innerJoin(liveRoom.member, member) + .leftJoin(creatorSettlementRatio) + .on(member.id.eq(creatorSettlementRatio.member.id)) .where( useCan.isRefund.isFalse .and(liveRoom.beginDateTime.goe(startDate)) -- 2.40.1 From be4a58d1c6c1aa553d6002b410cba67c0a0f1abb Mon Sep 17 00:00:00 2001 From: Klaus Date: Tue, 11 Jun 2024 16:37:09 +0900 Subject: [PATCH 3/4] =?UTF-8?q?=EA=B4=80=EB=A6=AC=EC=9E=90=20=EB=9D=BC?= =?UTF-8?q?=EC=9D=B4=EB=B8=8C=20=EC=A0=95=EC=82=B0=20-=20=ED=81=AC?= =?UTF-8?q?=EB=A6=AC=EC=97=90=EC=9D=B4=ED=84=B0=20=EC=A0=95=EC=82=B0=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=EB=8D=B0=EC=9D=B4=ED=84=B0=EA=B0=80=20?= =?UTF-8?q?=EC=9E=88=EC=9C=BC=EB=A9=B4=20=ED=95=B4=EB=8B=B9=20=EB=8D=B0?= =?UTF-8?q?=EC=9D=B4=ED=84=B0=EC=97=90=20=EC=9E=85=EB=A0=A5=EB=90=9C=20?= =?UTF-8?q?=EC=A0=95=EC=82=B0=EB=B9=84=EC=9C=A8=EB=A1=9C=20=EA=B3=84?= =?UTF-8?q?=EC=82=B0=EB=90=98=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sodalive/admin/calculate/AdminCalculateQueryRepository.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 1fb435f..fde456b 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 @@ -44,7 +44,7 @@ class AdminCalculateQueryRepository(private val queryFactory: JPAQueryFactory) { .and(liveRoom.beginDateTime.goe(startDate)) .and(liveRoom.beginDateTime.loe(endDate)) ) - .groupBy(liveRoom.id, useCan.canUsage) + .groupBy(liveRoom.id, useCan.canUsage, creatorSettlementRatio.liveSettlementRatio) .orderBy(member.nickname.desc(), liveRoom.id.desc(), useCan.canUsage.desc(), formattedDate.desc()) .fetch() } -- 2.40.1 From e2fa126a6737647f0a2335470afd85c5c41dc62a Mon Sep 17 00:00:00 2001 From: Klaus Date: Tue, 11 Jun 2024 16:53:24 +0900 Subject: [PATCH 4/4] =?UTF-8?q?=EA=B4=80=EB=A6=AC=EC=9E=90=20=EC=BD=98?= =?UTF-8?q?=ED=85=90=EC=B8=A0,=20=EC=BB=A4=EB=AE=A4=EB=8B=88=ED=8B=B0=20?= =?UTF-8?q?=EC=A0=95=EC=82=B0=20-=20=ED=81=AC=EB=A6=AC=EC=97=90=EC=9D=B4?= =?UTF-8?q?=ED=84=B0=20=EC=A0=95=EC=82=B0=20=EC=B6=94=EA=B0=80=EB=8D=B0?= =?UTF-8?q?=EC=9D=B4=ED=84=B0=EA=B0=80=20=EC=9E=88=EC=9C=BC=EB=A9=B4=20?= =?UTF-8?q?=ED=95=B4=EB=8B=B9=20=EB=8D=B0=EC=9D=B4=ED=84=B0=EC=97=90=20?= =?UTF-8?q?=EC=9E=85=EB=A0=A5=EB=90=9C=20=EC=A0=95=EC=82=B0=EB=B9=84?= =?UTF-8?q?=EC=9C=A8=EB=A1=9C=20=EA=B3=84=EC=82=B0=EB=90=98=EB=8F=84?= =?UTF-8?q?=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AdminCalculateQueryRepository.kt | 20 +++++++++++++---- .../GetCalculateCommunityPostQueryData.kt | 9 ++++++-- .../calculate/GetCalculateContentQueryData.kt | 10 +++++++-- .../CreatorAdminCalculateQueryRepository.kt | 22 ++++++++++++++----- 4 files changed, 48 insertions(+), 13 deletions(-) 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 fde456b..ac92331 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 @@ -61,18 +61,27 @@ class AdminCalculateQueryRepository(private val queryFactory: JPAQueryFactory) { order.type, order.can, order.id.count(), - order.can.sum() + order.can.sum(), + creatorSettlementRatio.contentSettlementRatio ) ) .from(order) .innerJoin(order.audioContent, audioContent) .innerJoin(audioContent.member, member) + .leftJoin(creatorSettlementRatio) + .on(member.id.eq(creatorSettlementRatio.member.id)) .where( order.createdAt.goe(startDate) .and(order.createdAt.loe(endDate)) .and(order.isActive.isTrue) ) - .groupBy(audioContent.id, order.type, orderFormattedDate, order.can) + .groupBy( + audioContent.id, + order.type, + orderFormattedDate, + order.can, + creatorSettlementRatio.contentSettlementRatio + ) .orderBy(member.id.desc(), orderFormattedDate.desc(), audioContent.id.asc()) .fetch() } @@ -191,19 +200,22 @@ class AdminCalculateQueryRepository(private val queryFactory: JPAQueryFactory) { formattedDate, creatorCommunity.price, useCan.id.count(), - useCan.can.add(useCan.rewardCan).sum() + useCan.can.add(useCan.rewardCan).sum(), + creatorSettlementRatio.communitySettlementRatio ) ) .from(useCan) .innerJoin(useCan.communityPost, creatorCommunity) .innerJoin(creatorCommunity.member, member) + .leftJoin(creatorSettlementRatio) + .on(member.id.eq(creatorSettlementRatio.member.id)) .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) + .groupBy(formattedDate, creatorCommunity.id, creatorSettlementRatio.communitySettlementRatio) .orderBy(member.id.asc(), formattedDate.desc()) .offset(offset) .limit(limit) 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 index d0d5a48..4bd63db 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/GetCalculateCommunityPostQueryData.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/GetCalculateCommunityPostQueryData.kt @@ -9,12 +9,17 @@ data class GetCalculateCommunityPostQueryData @QueryProjection constructor( val date: String, val can: Int, val numberOfPurchase: Long, - val totalCan: Int + val totalCan: Int, + val settlementRatio: Int? ) { fun toGetCalculateCommunityPostResponse(): GetCalculateCommunityPostResponse { val totalKrw = totalCan * 100 val paymentFee = totalKrw * 0.066f - val settlementAmount = (totalKrw.toFloat() - paymentFee) * 0.7 + val settlementAmount = if (settlementRatio != null) { + (totalKrw.toFloat() - paymentFee) * (settlementRatio.toFloat() / 100.0f) + } else { + (totalKrw.toFloat() - paymentFee) * 0.7f + } val tax = settlementAmount * 0.033 val depositAmount = settlementAmount - tax diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/GetCalculateContentQueryData.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/GetCalculateContentQueryData.kt index d26e17d..b886d53 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/GetCalculateContentQueryData.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/GetCalculateContentQueryData.kt @@ -20,7 +20,9 @@ data class GetCalculateContentQueryData @QueryProjection constructor( // 인원 val numberOfPeople: Long, // 합계 - val totalCan: Int + val totalCan: Int, + // 정산비율 + val settlementRatio: Int? ) { fun toGetCalculateContentResponse(): GetCalculateContentResponse { val orderTypeStr = if (orderType == OrderType.RENTAL) { @@ -36,7 +38,11 @@ data class GetCalculateContentQueryData @QueryProjection constructor( val paymentFee = totalKrw * 0.066f // 정산금액 = (원화 - 결제수수료) 의 70% - val settlementAmount = (totalKrw.toFloat() - paymentFee) * 0.7 + val settlementAmount = if (settlementRatio != null) { + (totalKrw.toFloat() - paymentFee) * (settlementRatio.toFloat() / 100.0f) + } else { + (totalKrw.toFloat() - paymentFee) * 0.7f + } // 원천세 = 정산금액의 3.3% val tax = settlementAmount * 0.033 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 ef433f5..7f56747 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 @@ -59,7 +59,7 @@ class CreatorAdminCalculateQueryRepository(private val queryFactory: JPAQueryFac .and(liveRoom.beginDateTime.loe(endDate)) .and(liveRoom.member.id.eq(memberId)) ) - .groupBy(liveRoom.id, useCan.canUsage) + .groupBy(liveRoom.id, useCan.canUsage, creatorSettlementRatio.liveSettlementRatio) .orderBy(liveRoom.id.desc(), useCan.canUsage.desc(), formattedDate.desc()) .fetch() } @@ -105,19 +105,28 @@ class CreatorAdminCalculateQueryRepository(private val queryFactory: JPAQueryFac order.type, order.can, order.id.count(), - order.can.sum() + order.can.sum(), + creatorSettlementRatio.contentSettlementRatio ) ) .from(order) .innerJoin(order.audioContent, audioContent) .innerJoin(audioContent.member, member) + .leftJoin(creatorSettlementRatio) + .on(member.id.eq(creatorSettlementRatio.member.id)) .where( order.createdAt.goe(startDate) .and(order.createdAt.loe(endDate)) .and(order.isActive.isTrue) .and(order.creator.id.eq(memberId)) ) - .groupBy(audioContent.id, order.type, orderFormattedDate, order.can) + .groupBy( + audioContent.id, + order.type, + orderFormattedDate, + order.can, + creatorSettlementRatio.contentSettlementRatio + ) .offset(offset) .limit(limit) .orderBy(member.id.desc(), orderFormattedDate.desc(), audioContent.id.asc()) @@ -279,12 +288,15 @@ class CreatorAdminCalculateQueryRepository(private val queryFactory: JPAQueryFac formattedDate, creatorCommunity.price, useCan.id.count(), - useCan.can.add(useCan.rewardCan).sum() + useCan.can.add(useCan.rewardCan).sum(), + creatorSettlementRatio.communitySettlementRatio ) ) .from(useCan) .innerJoin(useCan.communityPost, creatorCommunity) .innerJoin(creatorCommunity.member, member) + .leftJoin(creatorSettlementRatio) + .on(member.id.eq(creatorSettlementRatio.member.id)) .where( useCan.isRefund.isFalse .and(useCan.canUsage.eq(CanUsage.PAID_COMMUNITY_POST)) @@ -292,7 +304,7 @@ class CreatorAdminCalculateQueryRepository(private val queryFactory: JPAQueryFac .and(useCan.createdAt.loe(endDate)) .and(creatorCommunity.member.id.eq(memberId)) ) - .groupBy(formattedDate, creatorCommunity.id) + .groupBy(formattedDate, creatorCommunity.id, creatorSettlementRatio.communitySettlementRatio) .orderBy(member.id.asc(), formattedDate.desc()) .offset(offset) .limit(limit) -- 2.40.1