feat(agent-settlement): 에이전트 정산 스냅샷 관리 기능을 추가한다

This commit is contained in:
2026-04-10 02:23:45 +09:00
parent d0be8ec2db
commit 9e4cd1bb6e
10 changed files with 840 additions and 0 deletions

View File

@@ -0,0 +1,80 @@
package kr.co.vividnext.sodalive.partner.agent.settlement.snapshot
import kr.co.vividnext.sodalive.common.BaseEntity
import java.time.LocalDateTime
import javax.persistence.Column
import javax.persistence.Entity
import javax.persistence.EnumType
import javax.persistence.Enumerated
@Entity
class AgentSettlementSnapshot(
@Column(nullable = false, updatable = false)
var periodStart: LocalDateTime,
@Column(nullable = false, updatable = false)
var periodEnd: LocalDateTime,
@Column(nullable = false, updatable = false)
@Enumerated(EnumType.STRING)
var settlementType: AgentSettlementSnapshotType,
@Column(nullable = false, updatable = false)
var agentId: Long,
@Column(nullable = false, updatable = false)
var agentNickname: String,
@Column(nullable = false, updatable = false)
var creatorId: Long,
@Column(nullable = false, updatable = false)
var creatorNickname: String,
@Column(nullable = true, updatable = false)
var assignmentId: Long? = null,
@Column(nullable = true, updatable = false)
var agentSettlementRatioId: Long? = null,
@Column(nullable = true, updatable = false)
var appliedAgentSettlementRatio: Int? = null,
@Column(nullable = false, updatable = false)
var count: Int,
@Column(nullable = false, updatable = false)
var totalCan: Int,
@Column(nullable = false, updatable = false)
var krw: Int,
@Column(nullable = false, updatable = false)
var fee: Int,
@Column(nullable = false, updatable = false)
var settlementAmount: Int,
@Column(nullable = false, updatable = false)
var tax: Int,
@Column(nullable = false, updatable = false)
var depositAmount: Int,
@Column(nullable = false, updatable = false)
var agentSettlementAmount: Int,
@Column(nullable = false, updatable = false)
var finalizedAt: LocalDateTime,
@Column(nullable = false, updatable = false)
var finalizedByMemberId: Long
) : BaseEntity()
enum class AgentSettlementSnapshotType {
LIVE,
CONTENT,
COMMUNITY,
CHANNEL_DONATION,
CONTENT_DONATION
}

View File

@@ -0,0 +1,20 @@
package kr.co.vividnext.sodalive.partner.agent.settlement.snapshot
import org.springframework.data.jpa.repository.JpaRepository
import java.time.LocalDateTime
interface AgentSettlementSnapshotRepository : JpaRepository<AgentSettlementSnapshot, Long> {
fun existsByPeriodStartAndPeriodEndAndSettlementTypeAndAgentId(
periodStart: LocalDateTime,
periodEnd: LocalDateTime,
settlementType: AgentSettlementSnapshotType,
agentId: Long
): Boolean
fun findAllByPeriodStartAndPeriodEndAndSettlementTypeAndAgentIdOrderByCreatorIdDesc(
periodStart: LocalDateTime,
periodEnd: LocalDateTime,
settlementType: AgentSettlementSnapshotType,
agentId: Long
): List<AgentSettlementSnapshot>
}

View File

@@ -0,0 +1,39 @@
package kr.co.vividnext.sodalive.partner.agent.settlement.snapshot
import kr.co.vividnext.sodalive.partner.agent.calculate.GetAgentChannelDonationSettlementByCreatorItem
import kr.co.vividnext.sodalive.partner.agent.calculate.GetAgentSettlementByCreatorItem
fun List<AgentSettlementSnapshot>.toSettlementByCreatorItems(): List<GetAgentSettlementByCreatorItem> {
return map {
GetAgentSettlementByCreatorItem(
creatorId = it.creatorId,
creatorNickname = it.creatorNickname,
count = it.count,
totalCan = it.totalCan,
krw = it.krw,
fee = it.fee,
settlementAmount = it.settlementAmount,
tax = it.tax,
depositAmount = it.depositAmount,
agentSettlementAmount = it.agentSettlementAmount
)
}
}
fun List<AgentSettlementSnapshot>.toChannelDonationSettlementByCreatorItems():
List<GetAgentChannelDonationSettlementByCreatorItem> {
return map {
GetAgentChannelDonationSettlementByCreatorItem(
creatorId = it.creatorId,
creatorNickname = it.creatorNickname,
count = it.count,
totalCan = it.totalCan,
krw = it.krw,
fee = it.fee,
settlementAmount = it.settlementAmount,
withholdingTax = it.tax,
depositAmount = it.depositAmount,
agentSettlementAmount = it.agentSettlementAmount
)
}
}

View File

@@ -0,0 +1,48 @@
package kr.co.vividnext.sodalive.partner.agent.settlement.snapshot
import kr.co.vividnext.sodalive.common.BaseEntity
import javax.persistence.Column
import javax.persistence.Entity
import javax.persistence.FetchType
import javax.persistence.JoinColumn
import javax.persistence.ManyToOne
@Entity
class AgentSettlementSnapshotSourceDetail(
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "snapshot_id", nullable = false)
var snapshot: AgentSettlementSnapshot,
@Column(nullable = true, updatable = false)
var assignmentId: Long? = null,
@Column(nullable = true, updatable = false)
var agentSettlementRatioId: Long? = null,
@Column(nullable = true, updatable = false)
var appliedAgentSettlementRatio: Int? = null,
@Column(nullable = false, updatable = false)
var count: Int,
@Column(nullable = false, updatable = false)
var totalCan: Int,
@Column(nullable = false, updatable = false)
var krw: Int,
@Column(nullable = false, updatable = false)
var fee: Int,
@Column(nullable = false, updatable = false)
var settlementAmount: Int,
@Column(nullable = false, updatable = false)
var tax: Int,
@Column(nullable = false, updatable = false)
var depositAmount: Int,
@Column(nullable = false, updatable = false)
var agentSettlementAmount: Int
) : BaseEntity()

View File

@@ -0,0 +1,5 @@
package kr.co.vividnext.sodalive.partner.agent.settlement.snapshot
import org.springframework.data.jpa.repository.JpaRepository
interface AgentSettlementSnapshotSourceDetailRepository : JpaRepository<AgentSettlementSnapshotSourceDetail, Long>

View File

@@ -0,0 +1,22 @@
package kr.co.vividnext.sodalive.partner.agent.settlement.snapshot
import kr.co.vividnext.sodalive.extensions.convertLocalDateTime
import java.time.LocalDateTime
data class FinalizeAgentSettlementSnapshotRequest(
val agentId: Long,
val settlementType: AgentSettlementSnapshotType,
val startDateStr: String,
val endDateStr: String
) {
fun toDateRange(): Pair<LocalDateTime, LocalDateTime> {
val startDate = startDateStr.convertLocalDateTime()
val endDate = endDateStr.convertLocalDateTime(hour = 23, minute = 59, second = 59)
return startDate to endDate
}
}
data class FinalizeAgentSettlementSnapshotResponse(
val finalizedCount: Int,
val alreadyFinalized: Boolean
)