feat(agent-settlement): 에이전트 정산 스냅샷 관리 기능을 추가한다
This commit is contained in:
@@ -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
|
||||
}
|
||||
@@ -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>
|
||||
}
|
||||
@@ -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
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -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()
|
||||
@@ -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>
|
||||
@@ -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
|
||||
)
|
||||
Reference in New Issue
Block a user