Skip to content

Commit 003e6f8

Browse files
authored
Merge pull request #1234 from statisticsnorway/bugfix-regnskap-controls
Bugfix regnskap controls
2 parents 482408b + 60fc2e8 commit 003e6f8

File tree

11 files changed

+116
-51
lines changed

11 files changed

+116
-51
lines changed

kontroller/src/main/kotlin/no/ssb/kostra/area/regnskap/RegnskapValidator.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ abstract class RegnskapValidator(
5454
Rule020KombinasjonDriftKontoklasseFunksjon(invalidDriftFunksjonList = invalidDriftFunksjonList),
5555
Rule025KombinasjonDriftKontoklasseArt(invalidDriftArtList = invalidDriftArtList),
5656
Rule030KombinasjonDriftKontoklasseArt(illogicalDriftArtList = listOf("285", "660")),
57-
Rule035KombinasjonDriftKontoklasseArt(illogicalDriftArtList = listOf("520", "920")),
57+
Rule035KombinasjonDriftKontoklasseArt(),
5858
Rule040KombinasjonInvesteringKontoklasseFunksjon(invalidInvesteringFunksjonList = invalidInvesteringFunksjonList),
5959
Rule045KombinasjonInvesteringKontoklasseFunksjon(illogicalInvesteringFunksjonArtList = illogicalInvesteringFunksjonList),
6060
Rule050KombinasjonInvesteringKontoklasseArt(invalidInvesteringArtList = invalidInvesteringArtList),

kontroller/src/main/kotlin/no/ssb/kostra/area/regnskap/kostra/KommuneKostraMain.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,7 @@ class KommuneKostraMain(
242242
) {
243243
listOf("280", "512", "521", "522", "529", "670", "910", "911", "912", "922", "929", "970")
244244
} else {
245-
listOf("280", "512", "521", "522", "529", "670", "910", "911", "912", "921", "922", "929", "970")
245+
listOf("280", "511", "512", "521", "522", "529", "670", "910", "911", "912", "921", "922", "929", "970")
246246
}
247247

248248
// Kun gyldig i drift og skal fjernes fra investering

kontroller/src/main/kotlin/no/ssb/kostra/validation/rule/regnskap/kostra/Rule035KombinasjonDriftKontoklasseArt.kt

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,28 +2,34 @@ package no.ssb.kostra.validation.rule.regnskap.kostra
22

33
import no.ssb.kostra.area.regnskap.RegnskapConstants.FIELD_ART
44
import no.ssb.kostra.area.regnskap.RegnskapConstants.FIELD_BELOP
5+
import no.ssb.kostra.area.regnskap.RegnskapConstants.FIELD_FUNKSJON
56
import no.ssb.kostra.program.KostraRecord
67
import no.ssb.kostra.validation.report.Severity
78
import no.ssb.kostra.validation.rule.AbstractNoArgsRule
89
import no.ssb.kostra.validation.rule.regnskap.kostra.extensions.isBevilgningDriftRegnskap
910

10-
class Rule035KombinasjonDriftKontoklasseArt(
11-
private val illogicalDriftArtList: List<String>
12-
) : AbstractNoArgsRule<List<KostraRecord>>(
11+
class Rule035KombinasjonDriftKontoklasseArt : AbstractNoArgsRule<List<KostraRecord>>(
1312
"Kontroll 035 : Kombinasjon i driftsregnskapet, kontoklasse og art",
14-
Severity.INFO
13+
Severity.ERROR
1514
) {
1615
override fun validate(context: List<KostraRecord>) = context.filter { kostraRecord ->
1716
kostraRecord.isBevilgningDriftRegnskap()
18-
&& kostraRecord[FIELD_ART] in illogicalDriftArtList
1917
&& kostraRecord.fieldAsIntOrDefault(FIELD_BELOP) != 0
18+
&& kostraRecord[FIELD_ART] in artList
19+
&& kostraRecord[FIELD_FUNKSJON] !in funksjonList
2020
}.map { kostraRecord ->
2121
createValidationReportEntry(
22-
messageText = "Kun advarsel, hindrer ikke innsending: (${kostraRecord[FIELD_ART]}) regnes å være " +
23-
"ulogisk i driftsregnskapet, med mindre posteringen gjelder sosiale utlån og næringsutlån eller " +
24-
"mottatte avdrag på sosiale utlån og næringsutlån, som finansieres av driftsinntekter.",
22+
messageText = "Feilmelding: (${kostraRecord[FIELD_ART]}) er kun gyldig i driftsregnskapet mot funksjonene 281 og 325. " +
23+
"Art 520 Utlån – kun gyldig i drift for sosiale utlån, (funksjon 281) og næringsutlån (funksjon 325) som finansieres av driftsinntekter. " +
24+
"Art 920 Mottatte avdrag på utlån – kun gyldig i drift for mottatte avdrag på sosiale utlån (funksjon 281) og næringsutlån (funksjon 325) som har blitt finansiert av driftsinntekter. " +
25+
"Fant art (${kostraRecord[FIELD_ART]}), funksjon (${kostraRecord[FIELD_FUNKSJON].trim()}).",
2526
lineNumbers = listOf(kostraRecord.lineNumber)
2627
)
2728
}.ifEmpty { null }
29+
30+
companion object {
31+
val artList = listOf("520", "920")
32+
val funksjonList = listOf("281 ", "325 ")
33+
}
2834
}
2935

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package no.ssb.kostra.validation.rule.regnskap.kostra
22

33
import no.ssb.kostra.area.regnskap.RegnskapConstants
4+
import no.ssb.kostra.area.regnskap.RegnskapConstants.FIELD_ART
5+
import no.ssb.kostra.area.regnskap.RegnskapConstants.FIELD_FUNKSJON
46
import no.ssb.kostra.program.KostraRecord
57
import no.ssb.kostra.program.KotlinArguments
68
import no.ssb.kostra.validation.report.Severity
@@ -10,8 +12,8 @@ import no.ssb.kostra.validation.rule.regnskap.kostra.extensions.isFylkeRegnskap
1012

1113
class Rule081KombinasjonBevilgningFunksjonArt :
1214
AbstractRule<List<KostraRecord>>(
13-
"Kontroll 081 : Ugyldig kombinasjon i bevilgningsregnskapet, funksjon og art",
14-
Severity.ERROR,
15+
"Kontroll 081 : Ulogisk kombinasjon i bevilgningsregnskapet, funksjon og art",
16+
Severity.WARNING,
1517
) {
1618
override fun validate(
1719
context: List<KostraRecord>,
@@ -20,21 +22,21 @@ class Rule081KombinasjonBevilgningFunksjonArt :
2022
.filter { kostraRecord ->
2123
kostraRecord.isBevilgningRegnskap() &&
2224
!kostraRecord.isFylkeRegnskap() &&
23-
kostraRecord[RegnskapConstants.FIELD_FUNKSJON].trim() == REQUIRED_FUNCTION &&
24-
kostraRecord[RegnskapConstants.FIELD_ART] !in qualifyingArtCodes &&
25-
kostraRecord.fieldAsIntOrDefault(RegnskapConstants.FIELD_BELOP) != 0
25+
kostraRecord.fieldAsIntOrDefault(RegnskapConstants.FIELD_BELOP) != 0 &&
26+
kostraRecord[FIELD_FUNKSJON].trim() == REQUIRED_FUNCTION &&
27+
kostraRecord[FIELD_ART] !in qualifyingArtCodes
2628
}.map { kostraRecord ->
2729
createValidationReportEntry(
2830
messageText =
29-
"Det er kun art 450 og art 810 som er logiske i kombinasjon med funksjon 850. " +
31+
"Det er kun artene 450, 810 og 850 som er logiske i kombinasjon med funksjon 850. " +
3032
"Andre arter er ulogiske i kombinasjon med funksjon 850.",
3133
lineNumbers = listOf(kostraRecord.lineNumber),
32-
severity = if (arguments.kvartal.first() in RegnskapConstants.WARNING_QUARTERS) Severity.WARNING else Severity.ERROR,
34+
severity = if (arguments.kvartal.first() in setOf('3', '4')) Severity.ERROR else Severity.WARNING,
3335
)
3436
}.ifEmpty { null }
3537

3638
companion object {
37-
internal val qualifyingArtCodes = setOf("450", "810")
39+
internal val qualifyingArtCodes = setOf("450", "810", "850")
3840
internal const val REQUIRED_FUNCTION = "850"
3941
}
4042
}

kontroller/src/main/kotlin/no/ssb/kostra/validation/rule/regnskap/kostra/Rule125SummeringBalanseDifferanse.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import no.ssb.kostra.validation.report.Severity
77
import no.ssb.kostra.validation.rule.AbstractRule
88
import no.ssb.kostra.validation.rule.regnskap.kostra.extensions.isAktiva
99
import no.ssb.kostra.validation.rule.regnskap.kostra.extensions.isBalanseRegnskap
10+
import no.ssb.kostra.validation.rule.regnskap.kostra.extensions.isPassiva
1011

1112
class Rule125SummeringBalanseDifferanse : AbstractRule<List<KostraRecord>>(
1213
"Kontroll 125 : Summeringskontroller balanseregnskapet, differanse i balanseregnskapet",
@@ -15,6 +16,7 @@ class Rule125SummeringBalanseDifferanse : AbstractRule<List<KostraRecord>>(
1516
override fun validate(context: List<KostraRecord>, arguments: KotlinArguments) = context
1617
.filter { it.isBalanseRegnskap() }
1718
.takeIf { it.any() }
19+
?.filter { it.isAktiva() || it.isPassiva() }
1820
?.partition { it.isAktiva() }
1921
?.let { (aktivaPosteringer, passivaPosteringer) ->
2022
Pair(

kontroller/src/main/kotlin/no/ssb/kostra/validation/rule/regnskap/kostra/Rule190Memoriakonti.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,16 @@ import no.ssb.kostra.program.KostraRecord
66
import no.ssb.kostra.validation.report.Severity
77
import no.ssb.kostra.validation.rule.AbstractNoArgsRule
88
import no.ssb.kostra.validation.rule.regnskap.kostra.extensions.isBalanseRegnskap
9+
import no.ssb.kostra.validation.rule.regnskap.kostra.extensions.isMemoriaKonti
910

1011
class Rule190Memoriakonti : AbstractNoArgsRule<List<KostraRecord>>(
1112
"Kontroll 190 : Memoriakonti",
1213
Severity.WARNING
1314
) {
1415
override fun validate(context: List<KostraRecord>) = context
15-
.filter { it.isBalanseRegnskap() && it.fieldAsIntOrDefault(FIELD_KAPITTEL) in 9100..9999 }
16+
.filter { it.isBalanseRegnskap() }
1617
.takeIf { it.any() }
18+
?.filter { it.isMemoriaKonti() }
1719
?.partition { it.fieldAsIntOrDefault(FIELD_KAPITTEL) == 9999 }
1820
?.let { (motpostMemoriakontiPosteringer, memoriakontiPosteringer) ->
1921
Pair(
@@ -22,7 +24,7 @@ class Rule190Memoriakonti : AbstractNoArgsRule<List<KostraRecord>>(
2224
)
2325
}
2426
?.takeUnless { (motpostMemoriakonti, memoriakonti) ->
25-
memoriakonti + motpostMemoriakonti in -30..30
27+
memoriakonti + motpostMemoriakonti in -10..10
2628
}
2729
?.let { (motpostMemoriakonti, memoriakonti) ->
2830
createSingleReportEntryList(

kontroller/src/main/kotlin/no/ssb/kostra/validation/rule/regnskap/kostra/extensions/KostraRecordRegnskapExtensions.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,9 @@ fun KostraRecord.isAktiva() =
6565
fun KostraRecord.isPassiva() =
6666
fieldAsIntOrDefault(FIELD_KAPITTEL) in 31..5999
6767

68+
fun KostraRecord.isMemoriaKonti() =
69+
fieldAsIntOrDefault(FIELD_KAPITTEL) in 9100..9999
70+
6871
fun KostraRecord.isOsloInternRegnskap() =
6972
this.isOslo()
7073
&& fieldAsString(FIELD_SKJEMA) in setOf("0A", "0M")

kontroller/src/test/kotlin/no/ssb/kostra/validation/rule/regnskap/kostra/Rule035KombinasjonDriftKontoklasseArtTest.kt

Lines changed: 43 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package no.ssb.kostra.validation.rule.regnskap.kostra
33
import io.kotest.core.spec.style.BehaviorSpec
44
import no.ssb.kostra.area.regnskap.RegnskapConstants.FIELD_ART
55
import no.ssb.kostra.area.regnskap.RegnskapConstants.FIELD_BELOP
6+
import no.ssb.kostra.area.regnskap.RegnskapConstants.FIELD_FUNKSJON
67
import no.ssb.kostra.area.regnskap.RegnskapConstants.FIELD_KONTOKLASSE
78
import no.ssb.kostra.area.regnskap.RegnskapConstants.FIELD_SKJEMA
89
import no.ssb.kostra.area.regnskap.RegnskapFieldDefinitions
@@ -11,43 +12,70 @@ import no.ssb.kostra.program.extension.toKostraRecord
1112
import no.ssb.kostra.validation.report.Severity
1213
import no.ssb.kostra.validation.rule.ForAllRowItem
1314
import no.ssb.kostra.validation.rule.KostraTestFactory.validationRuleNoArgsTest
15+
import kotlin.text.trim
1416

1517
class Rule035KombinasjonDriftKontoklasseArtTest : BehaviorSpec({
1618
include(
1719
validationRuleNoArgsTest(
18-
sut = Rule035KombinasjonDriftKontoklasseArt(listOf("520")),
19-
expectedSeverity = Severity.INFO,
20+
sut = Rule035KombinasjonDriftKontoklasseArt(),
21+
expectedSeverity = Severity.ERROR,
2022
ForAllRowItem(
21-
"all conditions match",
22-
kostraRecordsInTest(1, 520, 1),
23-
expectedErrorMessage = "Kun advarsel, hindrer ikke innsending: (520) regnes å være ulogisk i " +
24-
"driftsregnskapet, med mindre posteringen gjelder sosiale utlån og næringsutlån " +
25-
"eller mottatte avdrag på sosiale utlån og næringsutlån, som finansieres av " +
26-
"driftsinntekter.",
23+
"isBevilgningDriftRegnskap = false",
24+
kostraRecordsInTest(0, 520, 100, 1),
2725
),
2826
ForAllRowItem(
29-
"isBevilgningDriftRegnskap = false",
30-
kostraRecordsInTest(0, 520, 1),
27+
"belop = 0",
28+
kostraRecordsInTest(1, 100, 520, 0),
3129
),
3230
ForAllRowItem(
33-
"art != 520",
34-
kostraRecordsInTest(1, 521, 1),
31+
"art !in (520, 920)",
32+
kostraRecordsInTest(1, 281, 100, 1),
3533
),
3634
ForAllRowItem(
37-
"belop = 0",
38-
kostraRecordsInTest(1, 520, 0),
39-
)
35+
"art = 520, funksjon = 281",
36+
kostraRecordsInTest(1, 281, 520, 1),
37+
),
38+
ForAllRowItem(
39+
"art = 520, funksjon = 325",
40+
kostraRecordsInTest(1, 325, 520, 1),
41+
),
42+
ForAllRowItem(
43+
"art = 920, funksjon = 281",
44+
kostraRecordsInTest(1, 281, 920, 1),
45+
),
46+
ForAllRowItem(
47+
"art = 920, funksjon = 325",
48+
kostraRecordsInTest(1, 325, 920, 1),
49+
),
50+
ForAllRowItem(
51+
"all conditions match",
52+
kostraRecordsInTest(1, 100, 520, 1),
53+
expectedErrorMessage = "Feilmelding: (520) er kun gyldig i driftsregnskapet mot funksjonene 281 og 325. " +
54+
"Art 520 Utlån – kun gyldig i drift for sosiale utlån, (funksjon 281) og næringsutlån (funksjon 325) som finansieres av driftsinntekter. " +
55+
"Art 920 Mottatte avdrag på utlån – kun gyldig i drift for mottatte avdrag på sosiale utlån (funksjon 281) og næringsutlån (funksjon 325) som har blitt finansiert av driftsinntekter. " +
56+
"Fant art (520), funksjon (100).",
57+
),
58+
ForAllRowItem(
59+
"all conditions match",
60+
kostraRecordsInTest(1, 100, 920, 1),
61+
expectedErrorMessage = "Feilmelding: (920) er kun gyldig i driftsregnskapet mot funksjonene 281 og 325. " +
62+
"Art 520 Utlån – kun gyldig i drift for sosiale utlån, (funksjon 281) og næringsutlån (funksjon 325) som finansieres av driftsinntekter. " +
63+
"Art 920 Mottatte avdrag på utlån – kun gyldig i drift for mottatte avdrag på sosiale utlån (funksjon 281) og næringsutlån (funksjon 325) som har blitt finansiert av driftsinntekter. " +
64+
"Fant art (920), funksjon (100).",
65+
),
4066
)
4167
)
4268
}) {
4369
companion object {
4470
private fun kostraRecordsInTest(
4571
kontoklasse: Int,
72+
funksjon: Int,
4673
art: Int,
4774
belop: Int
4875
) = mapOf(
4976
FIELD_SKJEMA to "0A",
5077
FIELD_KONTOKLASSE to "$kontoklasse",
78+
FIELD_FUNKSJON to "$funksjon ",
5179
FIELD_ART to "$art",
5280
FIELD_BELOP to "$belop"
5381
).toKostraRecord(1, RegnskapFieldDefinitions.fieldDefinitions).asList()

kontroller/src/test/kotlin/no/ssb/kostra/validation/rule/regnskap/kostra/Rule081KombinasjonBevilgningFunksjonArtTest.kt

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ class Rule081KombinasjonBevilgningFunksjonArtTest :
1515
include(
1616
KostraTestFactory.validationRuleNoArgsTest(
1717
sut = Rule081KombinasjonBevilgningFunksjonArt(),
18-
expectedSeverity = Severity.ERROR,
18+
expectedSeverity = Severity.WARNING,
1919
ForAllRowItem(
2020
description = "annually, isBevilgningRegnskap = false",
2121
context = kostraRecordsInTest("0B", 850, 450, 1),
@@ -45,31 +45,31 @@ class Rule081KombinasjonBevilgningFunksjonArtTest :
4545
description = "annually, all conditions match, 0A",
4646
context = kostraRecordsInTest("0A", 850, 100, 1),
4747
expectedErrorMessage =
48-
"Det er kun art 450 og art 810 som er logiske i kombinasjon med funksjon 850. " +
48+
"Det er kun artene 450, 810 og 850 som er logiske i kombinasjon med funksjon 850. " +
4949
"Andre arter er ulogiske i kombinasjon med funksjon 850.",
5050
arguments = kostraArguments(" "),
5151
),
5252
ForAllRowItem(
5353
description = "annually, all conditions match, 0I",
5454
context = kostraRecordsInTest("0I", 850, 100, 1),
5555
expectedErrorMessage =
56-
"Det er kun art 450 og art 810 som er logiske i kombinasjon med funksjon 850. " +
56+
"Det er kun artene 450, 810 og 850 som er logiske i kombinasjon med funksjon 850. " +
5757
"Andre arter er ulogiske i kombinasjon med funksjon 850.",
5858
arguments = kostraArguments(" "),
5959
),
6060
ForAllRowItem(
6161
description = "annually, all conditions match, 0M",
6262
context = kostraRecordsInTest("0M", 850, 100, 1),
6363
expectedErrorMessage =
64-
"Det er kun art 450 og art 810 som er logiske i kombinasjon med funksjon 850. " +
64+
"Det er kun artene 450, 810 og 850 som er logiske i kombinasjon med funksjon 850. " +
6565
"Andre arter er ulogiske i kombinasjon med funksjon 850.",
6666
arguments = kostraArguments(" "),
6767
),
6868
ForAllRowItem(
6969
description = "1. quarter, all conditions match",
7070
context = kostraRecordsInTest("0A", 850, 100, 1),
7171
expectedErrorMessage =
72-
"Det er kun art 450 og art 810 som er logiske i kombinasjon med funksjon 850. " +
72+
"Det er kun artene 450, 810 og 850 som er logiske i kombinasjon med funksjon 850. " +
7373
"Andre arter er ulogiske i kombinasjon med funksjon 850.",
7474
arguments = kostraArguments("1"),
7575
expectedSeverity = Severity.WARNING,
@@ -78,7 +78,7 @@ class Rule081KombinasjonBevilgningFunksjonArtTest :
7878
description = "4. quarter, all conditions match",
7979
context = kostraRecordsInTest("0A", 850, 100, 1),
8080
expectedErrorMessage =
81-
"Det er kun art 450 og art 810 som er logiske i kombinasjon med funksjon 850. " +
81+
"Det er kun artene 450, 810 og 850 som er logiske i kombinasjon med funksjon 850. " +
8282
"Andre arter er ulogiske i kombinasjon med funksjon 850.",
8383
arguments = kostraArguments("4"),
8484
expectedSeverity = Severity.ERROR,
@@ -102,3 +102,4 @@ class Rule081KombinasjonBevilgningFunksjonArtTest :
102102
private fun kostraArguments(kvartal: String) = RuleTestData.argumentsInTest.copy(kvartal = kvartal)
103103
}
104104
}
105+

0 commit comments

Comments
 (0)