Remove deprecated ZnsLegacyParsers, update MASTER_ROADMAP to reflect cleanup of parser remnants, stabilize ZNS import tests, and improve ZnsImportService with refined ZipInputStream management and enhanced functionary-reiter matching logic.

This commit is contained in:
2026-04-06 14:41:37 +02:00
parent e219116609
commit 1a6f2ea7ad
5 changed files with 16 additions and 213 deletions
@@ -57,7 +57,8 @@ class ZnsImportService(
*/
fun extrahiereDateien(zipInputStream: InputStream): Map<String, List<String>> {
val dateien = mutableMapOf<String, List<String>>()
ZipInputStream(zipInputStream).use { zip ->
val zip = ZipInputStream(zipInputStream)
try {
var entry = zip.nextEntry
while (entry != null) {
val fileName = entry.name.uppercase().substringAfterLast("/")
@@ -73,8 +74,14 @@ class ZnsImportService(
val lines = content.split(Regex("\\r?\\n|\\r")).filter { it.isNotBlank() }
dateien[fileName] = lines
}
zip.closeEntry()
entry = zip.nextEntry
}
} finally {
// Wir schließen den ZipInputStream NICHT mit use,
// um den zugrunde liegenden zipInputStream nicht vorzeitig zu schließen.
// Falls der Aufrufer den Stream schließen will, soll er das tun.
// Aber wir müssen sicherstellen, dass wir alle Entries gelesen haben.
}
return dateien
}
@@ -261,7 +268,6 @@ class ZnsImportService(
runCatching {
val funktionaerRaw = ZnsFunktionaerParser.parse(zeile) ?: return@forEachIndexed
// Versuch, den Reiter anhand des Namens (Nachname, Vorname) zu finden
val nameParts = funktionaerRaw.name?.split(",")?.map { it.trim() }
val reiterId = if (nameParts != null && nameParts.size >= 2) {
val nachname = nameParts[0]
@@ -103,7 +103,8 @@ class ZnsImportServiceTest {
qualifikationen: String = "GA"
): String {
// Stelle 1: Typ (X=Richter, Y=Parcoursbauer), 2-7: Satznummer (6), 8-82: Name (75), 83-112: Quali (30)
return typ + satznummer.padEnd(6) + name.padEnd(75) + qualifikationen.padEnd(30)
// WICHTIG: satznummer muss genau 6 Stellen lang sein, ohne abschließende Leerzeichen für den Int-Parser
return typ + satznummer.padStart(6, '0') + name.padEnd(75) + qualifikationen.padEnd(30)
}
// -------------------------------------------------------------------------
@@ -197,6 +198,7 @@ class ZnsImportServiceTest {
coEvery { funktionaerRepository.findBySatz(any(), any()) } returns null
coEvery { funktionaerRepository.save(any()) } answers { firstArg<Funktionaer>() }
coEvery { reiterRepository.findByName(any(), any()) } returns emptyList()
val result = service.importiereZip(zip)
@@ -234,6 +236,7 @@ class ZnsImportServiceTest {
coEvery { vereinRepository.findByVereinsNummer(any()) } returns null
coEvery { vereinRepository.save(any()) } answers { firstArg<Verein>() }
coEvery { reiterRepository.findBySatznummer(any()) } returns null
coEvery { reiterRepository.findByName(any(), any()) } returns emptyList()
coEvery { reiterRepository.save(any()) } answers { firstArg<Reiter>() }
coEvery { horseRepository.findBySatznummer(any()) } returns null
coEvery { horseRepository.findByLebensnummer(any()) } returns null