fix(calculate): 콘텐츠 후원 정산 비율을 70퍼센트로 통일한다
This commit is contained in:
16
docs/20260305_콘텐츠후원정산70퍼센트검증및최적화.md
Normal file
16
docs/20260305_콘텐츠후원정산70퍼센트검증및최적화.md
Normal file
@@ -0,0 +1,16 @@
|
||||
- [x] `getCalculateContentDonationList` 호출 경로(Controller → Service → QueryData) 확인
|
||||
- [x] 유료/무료 콘텐츠 후원 정산 비율이 모두 70%로 적용되는지 검증
|
||||
- [x] `GetCalculateContentDonationQueryData` 계산 로직의 불필요 분기/중복 제거 및 가독성 개선
|
||||
- [x] 관련 테스트/빌드/정적 진단 실행 및 결과 확인
|
||||
|
||||
---
|
||||
|
||||
## 검증 기록
|
||||
|
||||
### 1차 구현
|
||||
- 무엇을: `GetCalculateContentDonationQueryData`에서 유료/무료 공통 정산 비율 70% 적용 상태를 확인하고, 정산 계산 상수(`KRW_PER_CAN`, `PAYMENT_FEE_RATE`, `SETTLEMENT_RATE`, `TAX_RATE`)를 `companion object`로 추출해 계산 로직을 정리했다.
|
||||
- 왜: 유료/무료 분기 제거 후 동일 70% 정책을 명확히 유지하고, `BigDecimal` 상수 재사용으로 계산 의도와 유지보수성을 높이기 위해서다.
|
||||
- 어떻게: 호출 경로(`AdminCalculateController` → `AdminCalculateService` → `AdminCalculateQueryRepository` → `GetCalculateContentDonationQueryData`)를 확인했고, 정적 진단은 `.kt` LSP 미구성으로 대체 검증했다. 실행 명령과 결과는 아래와 같다.
|
||||
- `lsp_diagnostics` (`GetCalculateContentDonationQueryData.kt`): Kotlin LSP 미지원으로 실행 불가(환경 제약 확인)
|
||||
- `./gradlew test`: 성공 (`BUILD SUCCESSFUL`)
|
||||
- `./gradlew build`: 성공 (`BUILD SUCCESSFUL`, `ktlintMainSourceSetCheck` 포함)
|
||||
@@ -20,33 +20,32 @@ data class GetCalculateContentDonationQueryData @QueryProjection constructor(
|
||||
// 합계
|
||||
val totalCan: Int
|
||||
) {
|
||||
fun toGetCalculateContentDonationResponse(): GetCalculateContentDonationResponse {
|
||||
// 원화 = totalCoin * 100 ( 캔 1개 = 100원 )
|
||||
val totalKrw = BigDecimal(totalCan).multiply(BigDecimal(100))
|
||||
|
||||
// 결제수수료 : 6.6%
|
||||
val paymentFee = totalKrw.multiply(BigDecimal(0.066))
|
||||
|
||||
// 정산금액
|
||||
// 유료콘텐츠 (원화 - 결제수수료) 의 90%
|
||||
// 무료콘텐츠 (원화 - 결제수수료) 의 70%
|
||||
val settlementAmount = if (price > 0) {
|
||||
totalKrw.subtract(paymentFee).multiply(BigDecimal(0.9))
|
||||
} else {
|
||||
totalKrw.subtract(paymentFee).multiply(BigDecimal(0.7))
|
||||
companion object {
|
||||
private val KRW_PER_CAN = BigDecimal("100")
|
||||
private val PAYMENT_FEE_RATE = BigDecimal("0.066")
|
||||
private val SETTLEMENT_RATE = BigDecimal("0.7")
|
||||
private val TAX_RATE = BigDecimal("0.033")
|
||||
}
|
||||
|
||||
fun toGetCalculateContentDonationResponse(): GetCalculateContentDonationResponse {
|
||||
// 원화 = totalCoin * 100 ( 캔 1개 = 100원 )
|
||||
val totalKrw = BigDecimal(totalCan).multiply(KRW_PER_CAN)
|
||||
|
||||
// 결제수수료 : 6.6%
|
||||
val paymentFee = totalKrw.multiply(PAYMENT_FEE_RATE)
|
||||
|
||||
// 정산금액
|
||||
// 유료콘텐츠 (원화 - 결제수수료) 의 70%
|
||||
// 무료콘텐츠 (원화 - 결제수수료) 의 70%
|
||||
val settlementAmount = totalKrw.subtract(paymentFee).multiply(SETTLEMENT_RATE)
|
||||
|
||||
// 원천세 = 정산금액의 3.3%
|
||||
val tax = settlementAmount.multiply(BigDecimal(0.033))
|
||||
val tax = settlementAmount.multiply(TAX_RATE)
|
||||
|
||||
// 입금액
|
||||
val depositAmount = settlementAmount.subtract(tax)
|
||||
|
||||
val paidOrFree = if (price > 0) {
|
||||
"유료"
|
||||
} else {
|
||||
"무료"
|
||||
}
|
||||
val paidOrFree = if (price > 0) "유료" else "무료"
|
||||
|
||||
return GetCalculateContentDonationResponse(
|
||||
nickname = nickname,
|
||||
|
||||
Reference in New Issue
Block a user