From dc172ea4f644685680595b716d05cc3fcfccd4dc Mon Sep 17 00:00:00 2001 From: Joosa Kurvinen Date: Mon, 17 Feb 2025 12:23:06 +0200 Subject: [PATCH] new income causes new decision even when data has not changed --- .../evaka/invoicing/FinanceDecisionUtils.kt | 1 + .../evaka/invoicing/domain/FeeDecisions.kt | 13 +++++++----- .../espoo/evaka/invoicing/domain/Incomes.kt | 21 +++++++++++++------ .../invoicing/domain/VoucherValueDecisions.kt | 14 ++++++++----- 4 files changed, 33 insertions(+), 16 deletions(-) diff --git a/service/src/main/kotlin/fi/espoo/evaka/invoicing/FinanceDecisionUtils.kt b/service/src/main/kotlin/fi/espoo/evaka/invoicing/FinanceDecisionUtils.kt index b192c8d109f..283e839b927 100644 --- a/service/src/main/kotlin/fi/espoo/evaka/invoicing/FinanceDecisionUtils.kt +++ b/service/src/main/kotlin/fi/espoo/evaka/invoicing/FinanceDecisionUtils.kt @@ -41,6 +41,7 @@ fun mapIncomeToDecisionIncome( coefficientMultiplierProvider: IncomeCoefficientMultiplierProvider, ): DecisionIncome = DecisionIncome( + id = income.id, effect = income.effect, data = income.data.mapValues { (_, value) -> diff --git a/service/src/main/kotlin/fi/espoo/evaka/invoicing/domain/FeeDecisions.kt b/service/src/main/kotlin/fi/espoo/evaka/invoicing/domain/FeeDecisions.kt index dee1d3c7394..b75a8bf49c4 100644 --- a/service/src/main/kotlin/fi/espoo/evaka/invoicing/domain/FeeDecisions.kt +++ b/service/src/main/kotlin/fi/espoo/evaka/invoicing/domain/FeeDecisions.kt @@ -144,14 +144,17 @@ enum class FeeDecisionDifference(val contentEquals: (d1: FeeDecision, d2: FeeDec d1.children.map { it.child.id }.toSet() == d2.children.map { it.child.id }.toSet() }), INCOME({ d1, d2 -> + val logic = + if (d2.validFrom < LocalDate.of(2025, 1, 1)) IncomeComparisonVersion.V1 + else IncomeComparisonVersion.V2 setOf( - d1.headOfFamilyIncome?.effectiveComparable(), - d1.partnerIncome?.effectiveComparable(), + d1.headOfFamilyIncome?.effectiveComparable(logic), + d1.partnerIncome?.effectiveComparable(logic), ) == setOf( - d2.headOfFamilyIncome?.effectiveComparable(), - d2.partnerIncome?.effectiveComparable(), - ) && decisionChildrenEquals(d1, d2) { it.childIncome?.effectiveComparable() } + d2.headOfFamilyIncome?.effectiveComparable(logic), + d2.partnerIncome?.effectiveComparable(logic), + ) && decisionChildrenEquals(d1, d2) { it.childIncome?.effectiveComparable(logic) } }), PLACEMENT({ d1, d2 -> decisionChildrenEquals(d1, d2) { it.placement } }), SERVICE_NEED({ d1, d2 -> diff --git a/service/src/main/kotlin/fi/espoo/evaka/invoicing/domain/Incomes.kt b/service/src/main/kotlin/fi/espoo/evaka/invoicing/domain/Incomes.kt index 214eebd8447..f714a10f17c 100644 --- a/service/src/main/kotlin/fi/espoo/evaka/invoicing/domain/Incomes.kt +++ b/service/src/main/kotlin/fi/espoo/evaka/invoicing/domain/Incomes.kt @@ -52,8 +52,14 @@ data class IncomeRequest( val attachments: List = listOf(), ) +enum class IncomeComparisonVersion { + V1, + V2, +} + @JsonIgnoreProperties(ignoreUnknown = true) data class DecisionIncome( + val id: IncomeId?, val effect: IncomeEffect, val data: Map, val totalIncome: Int, @@ -61,13 +67,16 @@ data class DecisionIncome( val total: Int, val worksAtECHA: Boolean, ) { - fun effectiveComparable(): DecisionIncome? { - return when (this.effect) { - IncomeEffect.NOT_AVAILABLE, - IncomeEffect.INCOMPLETE -> null - else -> this + fun effectiveComparable(version: IncomeComparisonVersion): DecisionIncome? = + when (version) { + IncomeComparisonVersion.V1 -> + when (this.effect) { + IncomeEffect.NOT_AVAILABLE, + IncomeEffect.INCOMPLETE -> null + else -> this + } + IncomeComparisonVersion.V2 -> this } - } } @JsonIgnoreProperties(ignoreUnknown = true) diff --git a/service/src/main/kotlin/fi/espoo/evaka/invoicing/domain/VoucherValueDecisions.kt b/service/src/main/kotlin/fi/espoo/evaka/invoicing/domain/VoucherValueDecisions.kt index 9fee4077abc..ca29d89d208 100644 --- a/service/src/main/kotlin/fi/espoo/evaka/invoicing/domain/VoucherValueDecisions.kt +++ b/service/src/main/kotlin/fi/espoo/evaka/invoicing/domain/VoucherValueDecisions.kt @@ -163,14 +163,18 @@ enum class VoucherValueDecisionDifference( setOf(d1.headOfFamilyId, d1.partnerId) == setOf(d2.headOfFamilyId, d2.partnerId) }), INCOME({ d1, d2 -> + val logic = + if (d2.validFrom < LocalDate.of(2025, 1, 1)) IncomeComparisonVersion.V1 + else IncomeComparisonVersion.V2 setOf( - d1.headOfFamilyIncome?.effectiveComparable(), - d1.partnerIncome?.effectiveComparable(), + d1.headOfFamilyIncome?.effectiveComparable(logic), + d1.partnerIncome?.effectiveComparable(logic), ) == setOf( - d2.headOfFamilyIncome?.effectiveComparable(), - d2.partnerIncome?.effectiveComparable(), - ) && d1.childIncome?.effectiveComparable() == d2.childIncome?.effectiveComparable() + d2.headOfFamilyIncome?.effectiveComparable(logic), + d2.partnerIncome?.effectiveComparable(logic), + ) && + d1.childIncome?.effectiveComparable(logic) == d2.childIncome?.effectiveComparable(logic) }), FAMILY_SIZE({ d1, d2 -> d1.familySize == d2.familySize }), PLACEMENT({ d1, d2 -> d1.placement == d2.placement }),