Refactor master data infrastructure to streamline Reiter and Bundesland relationships, add V012 migration, harmonize domain models, implement repository methods for enhanced ZNS import logic, and update associated tests.

This commit is contained in:
2026-04-06 16:39:06 +02:00
parent 1a6f2ea7ad
commit 0ae9a1f1b8
15 changed files with 284 additions and 76 deletions
@@ -6,6 +6,8 @@ import at.mocode.masterdata.domain.repository.VereinRepository
import at.mocode.masterdata.domain.repository.HorseRepository
import at.mocode.masterdata.domain.repository.FunktionaerRepository
import at.mocode.masterdata.domain.repository.ReiterRepository
import at.mocode.masterdata.domain.repository.LandRepository
import at.mocode.masterdata.domain.repository.BundeslandRepository
import at.mocode.zns.parser.ZnsFunktionaerParser
import at.mocode.zns.parser.ZnsPferdParser
import at.mocode.zns.parser.ZnsReiterParser
@@ -40,7 +42,9 @@ class ZnsImportService(
private val vereinRepository: VereinRepository,
private val reiterRepository: ReiterRepository,
private val horseRepository: HorseRepository,
private val funktionaerRepository: FunktionaerRepository
private val funktionaerRepository: FunktionaerRepository,
private val landRepository: LandRepository,
private val bundeslandRepository: BundeslandRepository
) {
companion object {
@@ -166,7 +170,19 @@ class ZnsImportService(
var aktualisiert = 0
zeilen.forEachIndexed { index, zeile ->
runCatching {
val reiter = ZnsReiterParser.parse(zeile) ?: return@forEachIndexed
val parsed = ZnsReiterParser.parse(zeile) ?: return@forEachIndexed
// Relationen auflösen
val verein = parsed.vereinsName?.let { vereinRepository.findByExactName(it) }
val bundesland = parsed.bundeslandNummer?.let { bundeslandRepository.findByNr(it) }
val nation = parsed.nation?.let { landRepository.findByIsoAlpha3Code(it) }
val reiter = parsed.copy(
vereinId = verein?.vereinId,
bundeslandId = bundesland?.bundeslandId,
nationId = nation?.landId
)
val vorhanden = reiterRepository.findBySatznummer(reiter.satznummer)
if (vorhanden == null) {
reiterRepository.save(reiter)
@@ -179,6 +195,9 @@ class ZnsImportService(
bundeslandNummer = reiter.bundeslandNummer,
vereinsName = reiter.vereinsName,
nation = reiter.nation,
vereinId = reiter.vereinId,
bundeslandId = reiter.bundeslandId,
nationId = reiter.nationId,
reiterLizenz = reiter.reiterLizenz,
startkarte = reiter.startkarte,
fahrLizenz = reiter.fahrLizenz,
@@ -8,6 +8,8 @@ import at.mocode.masterdata.domain.repository.FunktionaerRepository
import at.mocode.masterdata.domain.repository.HorseRepository
import at.mocode.masterdata.domain.repository.ReiterRepository
import at.mocode.masterdata.domain.repository.VereinRepository
import at.mocode.masterdata.domain.repository.LandRepository
import at.mocode.masterdata.domain.repository.BundeslandRepository
import io.mockk.coEvery
import io.mockk.coVerify
import io.mockk.mockk
@@ -28,6 +30,8 @@ class ZnsImportServiceTest {
private val reiterRepository = mockk<ReiterRepository>()
private val horseRepository = mockk<HorseRepository>()
private val funktionaerRepository = mockk<FunktionaerRepository>()
private val landRepository = mockk<LandRepository>()
private val bundeslandRepository = mockk<BundeslandRepository>()
private lateinit var service: ZnsImportService
@@ -35,7 +39,19 @@ class ZnsImportServiceTest {
@BeforeEach
fun setUp() {
service = ZnsImportService(vereinRepository, reiterRepository, horseRepository, funktionaerRepository)
service = ZnsImportService(
vereinRepository,
reiterRepository,
horseRepository,
funktionaerRepository,
landRepository,
bundeslandRepository
)
// Standard-Stubs für optionale Lookups, damit Tests ohne spezifische Erwartungen nicht fehlschlagen
coEvery { landRepository.findByIsoAlpha3Code(any()) } returns null
coEvery { bundeslandRepository.findByNr(any()) } returns null
coEvery { vereinRepository.findByExactName(any()) } returns null
}
// -------------------------------------------------------------------------
@@ -244,6 +260,9 @@ class ZnsImportServiceTest {
coEvery { horseRepository.save(any()) } answers { firstArg<Pferd>() }
coEvery { funktionaerRepository.findBySatz(any(), any()) } returns null
coEvery { funktionaerRepository.save(any()) } answers { firstArg<Funktionaer>() }
coEvery { vereinRepository.findByExactName(any()) } returns null
coEvery { bundeslandRepository.findByNr(any()) } returns null
coEvery { landRepository.findByIsoAlpha3Code(any()) } returns null
// Importiere nacheinander (Simulation eines vollständigen Workflows)
val res1 = service.importiereZip(zipVerein)