크리에이터 기준 라이브 합계 정산 API 추가
This commit is contained in:
		| @@ -48,4 +48,18 @@ class AdminCalculateController(private val service: AdminCalculateService) { | |||||||
|             pageable.pageSize.toLong() |             pageable.pageSize.toLong() | ||||||
|         ) |         ) | ||||||
|     ) |     ) | ||||||
|  |  | ||||||
|  |     @GetMapping("/live-by-creator") | ||||||
|  |     fun getCalculateLiveByCreator( | ||||||
|  |         @RequestParam startDateStr: String, | ||||||
|  |         @RequestParam endDateStr: String, | ||||||
|  |         pageable: Pageable | ||||||
|  |     ) = ApiResponse.ok( | ||||||
|  |         service.getCalculateLiveByCreator( | ||||||
|  |             startDateStr, | ||||||
|  |             endDateStr, | ||||||
|  |             pageable.offset, | ||||||
|  |             pageable.pageSize.toLong() | ||||||
|  |         ) | ||||||
|  |     ) | ||||||
| } | } | ||||||
|   | |||||||
| @@ -224,4 +224,44 @@ class AdminCalculateQueryRepository(private val queryFactory: JPAQueryFactory) { | |||||||
|             .limit(limit) |             .limit(limit) | ||||||
|             .fetch() |             .fetch() | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     fun getCalculateLiveByCreatorTotalCount(startDate: LocalDateTime, endDate: LocalDateTime): Int { | ||||||
|  |         return queryFactory | ||||||
|  |             .select(member.id) | ||||||
|  |             .from(useCan) | ||||||
|  |             .innerJoin(useCan.room, liveRoom) | ||||||
|  |             .innerJoin(liveRoom.member, member) | ||||||
|  |             .leftJoin(creatorSettlementRatio) | ||||||
|  |             .on(member.id.eq(creatorSettlementRatio.member.id)) | ||||||
|  |             .groupBy(member.id) | ||||||
|  |             .fetch() | ||||||
|  |             .size | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     fun getCalculateLiveByCreator( | ||||||
|  |         startDate: LocalDateTime, | ||||||
|  |         endDate: LocalDateTime, | ||||||
|  |         offset: Long, | ||||||
|  |         limit: Long | ||||||
|  |     ): List<GetCalculateLiveByCreatorQueryData> { | ||||||
|  |         return queryFactory | ||||||
|  |             .select( | ||||||
|  |                 QGetCalculateLiveByCreatorQueryData( | ||||||
|  |                     member.email, | ||||||
|  |                     member.nickname, | ||||||
|  |                     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)) | ||||||
|  |             .groupBy(member.id) | ||||||
|  |             .orderBy(useCan.can.add(useCan.rewardCan).desc()) | ||||||
|  |             .offset(offset) | ||||||
|  |             .limit(limit) | ||||||
|  |             .fetch() | ||||||
|  |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -88,4 +88,21 @@ class AdminCalculateService(private val repository: AdminCalculateQueryRepositor | |||||||
|  |  | ||||||
|         return GetCreatorCalculateCommunityPostResponse(totalCount, items) |         return GetCreatorCalculateCommunityPostResponse(totalCount, items) | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     fun getCalculateLiveByCreator( | ||||||
|  |         startDateStr: String, | ||||||
|  |         endDateStr: String, | ||||||
|  |         offset: Long, | ||||||
|  |         limit: Long | ||||||
|  |     ) = run { | ||||||
|  |         val startDate = startDateStr.convertLocalDateTime() | ||||||
|  |         val endDate = endDateStr.convertLocalDateTime(hour = 23, minute = 59, second = 59) | ||||||
|  |  | ||||||
|  |         val totalCount = repository.getCalculateLiveByCreatorTotalCount(startDate, endDate) | ||||||
|  |         val items = repository | ||||||
|  |             .getCalculateLiveByCreator(startDate, endDate, offset, limit) | ||||||
|  |             .map { it.toGetCalculateLiveByCreator() } | ||||||
|  |  | ||||||
|  |         GetCalculateLiveByCreatorResponse(totalCount, items) | ||||||
|  |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -0,0 +1,14 @@ | |||||||
|  | package kr.co.vividnext.sodalive.admin.calculate | ||||||
|  |  | ||||||
|  | import com.fasterxml.jackson.annotation.JsonProperty | ||||||
|  |  | ||||||
|  | data class GetCalculateLiveByCreatorItem( | ||||||
|  |     @JsonProperty("email") val email: String, | ||||||
|  |     @JsonProperty("nickname") val nickname: String, | ||||||
|  |     @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 | ||||||
|  | ) | ||||||
| @@ -0,0 +1,44 @@ | |||||||
|  | package kr.co.vividnext.sodalive.admin.calculate | ||||||
|  |  | ||||||
|  | import com.querydsl.core.annotations.QueryProjection | ||||||
|  | import java.math.BigDecimal | ||||||
|  | import java.math.RoundingMode | ||||||
|  |  | ||||||
|  | data class GetCalculateLiveByCreatorQueryData @QueryProjection constructor( | ||||||
|  |     val email: String, | ||||||
|  |     val nickname: String, | ||||||
|  |     val totalCan: Int, | ||||||
|  |     val settlementRatio: Int? | ||||||
|  | ) { | ||||||
|  |     fun toGetCalculateLiveByCreator(): GetCalculateLiveByCreatorItem { | ||||||
|  |         // 원화 = totalCoin * 100 ( 캔 1개 = 100원 ) | ||||||
|  |         val totalKrw = BigDecimal(totalCan).multiply(BigDecimal(100)) | ||||||
|  |  | ||||||
|  |         // 결제수수료 : 6.6% | ||||||
|  |         val paymentFee = totalKrw.multiply(BigDecimal(0.066)) | ||||||
|  |  | ||||||
|  |         // 정산금액 = (원화 - 결제수수료) 의 70% | ||||||
|  |         val settlementAmount = if (settlementRatio != null) { | ||||||
|  |             totalKrw.subtract(paymentFee).multiply(BigDecimal(settlementRatio).divide(BigDecimal(100.0))) | ||||||
|  |         } else { | ||||||
|  |             totalKrw.subtract(paymentFee).multiply(BigDecimal(0.7)) | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         // 원천세 = 정산금액의 3.3% | ||||||
|  |         val tax = settlementAmount.multiply(BigDecimal(0.033)) | ||||||
|  |  | ||||||
|  |         // 입금액 | ||||||
|  |         val depositAmount = settlementAmount.subtract(tax) | ||||||
|  |  | ||||||
|  |         return GetCalculateLiveByCreatorItem( | ||||||
|  |             email = email, | ||||||
|  |             nickname = nickname, | ||||||
|  |             totalCan = totalCan, | ||||||
|  |             totalKrw = totalKrw.toInt(), | ||||||
|  |             paymentFee = paymentFee.setScale(0, RoundingMode.HALF_UP).toInt(), | ||||||
|  |             settlementAmount = settlementAmount.setScale(0, RoundingMode.HALF_UP).toInt(), | ||||||
|  |             tax = tax.setScale(0, RoundingMode.HALF_UP).toInt(), | ||||||
|  |             depositAmount = depositAmount.setScale(0, RoundingMode.HALF_UP).toInt() | ||||||
|  |         ) | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,6 @@ | |||||||
|  | package kr.co.vividnext.sodalive.admin.calculate | ||||||
|  |  | ||||||
|  | data class GetCalculateLiveByCreatorResponse( | ||||||
|  |     val totalCount: Int, | ||||||
|  |     val items: List<GetCalculateLiveByCreatorItem> | ||||||
|  | ) | ||||||
		Reference in New Issue
	
	Block a user