Explorar el Código

Vergleichskontroller refactored

Leonard Schulz hace 1 año
padre
commit
741c7311ce
Se han modificado 1 ficheros con 87 adiciones y 174 borrados
  1. 87 174
      src/main/java/com/tsystems/inwo/vgl/web/VergleichController.java

+ 87 - 174
src/main/java/com/tsystems/inwo/vgl/web/VergleichController.java

@@ -35,8 +35,7 @@ public class VergleichController {
             @RequestHeader(value = "X-Kunde", required = false) String kundeHeader,
             Model model) {
         
-        // Kunde aus Parameter oder Header ermitteln
-        String activeKunde = kunde != null ? kunde : kundeHeader;
+        String activeKunde = resolveActiveKunde(kunde, kundeHeader);
         
         model.addAttribute("validate", true);
         model.addAttribute("schemaName", "haushalt-einkommen");
@@ -58,8 +57,7 @@ public class VergleichController {
             @RequestHeader(value = "X-Kunde", required = false) String kundeHeader,
             Model model) throws Exception {
 
-        // Kunde aus Parameter oder Header ermitteln
-        String activeKunde = kunde != null ? kunde : kundeHeader;
+        String activeKunde = resolveActiveKunde(kunde, kundeHeader);
 
         JsonNode left = om.readTree(leftJson);
         JsonNode right = om.readTree(rightJson);
@@ -108,47 +106,12 @@ public class VergleichController {
         if (personId == null && !personenRight.isEmpty()) personId = personenRight.get(0).id;
 
         // --- Personen-Tabelle (UNION via person.id) ---
-        Map<String, Pair<JsonNode, JsonNode>> personenPairs = comparisonService.unionByKey(
-                jsonNavigationService.personsArray(rightZeitraum), 
-                jsonNavigationService.personsArray(leftZeitraum), 
-                n -> n.path("person").path("id").asText()
-        );
-        List<MitgliedRow> mitgliederRows = personenPairs.entrySet().stream()
+        PersonComparisonContext context = createPersonComparisonContext(rightZeitraum, leftZeitraum, personId);
+        List<MitgliedRow> mitgliederRows = context.personenPairs.entrySet().stream()
                 .map(e -> dataExtractor.buildMitgliedRow(e.getKey(), e.getValue().right, e.getValue().left))
                 .sorted(Comparator.comparing(MitgliedRow::personId))
                 .toList();
 
-        // --- Details für ausgewählte Person ---
-        JsonNode rightPerson = personenPairs.getOrDefault(personId, new Pair<>(null, null)).right;
-        JsonNode leftPerson = personenPairs.getOrDefault(personId, new Pair<>(null, null)).left;
-
-        // Create personLabel from either right or left person data
-        String personLabel = "(keine Person)";
-        if (rightPerson != null) {
-            personLabel = rightPerson.path("person").path("nachname").asText("") + ", " + rightPerson.path("person").path("vorname").asText("");
-        } else if (leftPerson != null) {
-            personLabel = leftPerson.path("person").path("nachname").asText("") + ", " + leftPerson.path("person").path("vorname").asText("");
-        }
-        
-        // Create a comprehensive person name map that includes persons from both right AND left JSON
-        Map<String, String> personNameByIdRight = new HashMap<>();
-        
-        // Add all persons from right (current) JSON
-        personenRight.stream().forEach(p -> personNameByIdRight.put(p.id, p.label));
-        
-        // Add persons from left JSON that are not already in the map
-        if (leftZeitraum != null) {
-            List<PersonRef> personenLeft = jsonNavigationService.listRightPersons(leftZeitraum);
-            personenLeft.stream()
-                .filter(p -> !personNameByIdRight.containsKey(p.id))
-                .forEach(p -> personNameByIdRight.put(p.id, p.label));
-        }
-
-        // Einkommen / Freibeträge / Kita: jeweils UNION per id
-        List<EinkommenZeile> einkommenZeilen = dataExtractor.buildEinkommenZeilen(rightPerson, leftPerson);
-        List<FreibetragZeile> freibetragZeilen = dataExtractor.buildFreibetragZeilen(rightPerson, leftPerson);
-        List<KitaZeile> kitaZeilen = dataExtractor.buildKitaZeilen(rightPerson, leftPerson, personNameByIdRight);
-
         // --- Model füllen & rendern ---
         model.addAttribute("leftJson", leftJson);
         model.addAttribute("rightJson", rightJson);
@@ -165,10 +128,10 @@ public class VergleichController {
         model.addAttribute("personenRight", personenRight);
         model.addAttribute("personId", personId);
         model.addAttribute("mitgliederRows", mitgliederRows);
-        model.addAttribute("personLabel", personLabel);
-        model.addAttribute("einkommenZeilen", einkommenZeilen);
-        model.addAttribute("freibetragZeilen", freibetragZeilen);
-        model.addAttribute("kitaZeilen", kitaZeilen);
+        model.addAttribute("personLabel", context.personLabel);
+        model.addAttribute("einkommenZeilen", context.einkommenZeilen);
+        model.addAttribute("freibetragZeilen", context.freibetragZeilen);
+        model.addAttribute("kitaZeilen", context.kitaZeilen);
         model.addAttribute("activeKunde", activeKunde);
         return "vergleich";
     }
@@ -186,62 +149,20 @@ public class VergleichController {
         JsonNode left = om.readTree(leftJson);
         JsonNode right = om.readTree(rightJson);
 
-        // --- Rechts (Master) Zeitraum wählen ---
         JsonNode rightZeitraum = jsonNavigationService.findZeitraumById(right, rightZeitraumId);
-        
-        // --- Links (Baseline) Zeitraum finden ---
         JsonNode leftZeitraum = null;
         if (leftZeitraumId != null) {
             leftZeitraum = jsonNavigationService.findZeitraumById(jsonNavigationService.getRootOfVorgang(left, leftVorgangId), leftZeitraumId);
         }
 
-        // --- Personenliste rechts ---
-        List<PersonRef> personenRight = jsonNavigationService.listRightPersons(rightZeitraum);
-
-        // --- Personen-Tabelle (UNION via person.id) ---
-        Map<String, Pair<JsonNode, JsonNode>> personenPairs = comparisonService.unionByKey(
-                jsonNavigationService.personsArray(rightZeitraum), 
-                jsonNavigationService.personsArray(leftZeitraum), 
-                n -> n.path("person").path("id").asText()
-        );
-
-        // --- Details für ausgewählte Person ---
-        JsonNode rightPerson = personenPairs.getOrDefault(personId, new Pair<>(null, null)).right;
-        JsonNode leftPerson = personenPairs.getOrDefault(personId, new Pair<>(null, null)).left;
-
-        // Create personLabel from either right or left person data
-        String personLabel = "(keine Person)";
-        if (rightPerson != null) {
-            personLabel = rightPerson.path("person").path("nachname").asText("") + ", " + rightPerson.path("person").path("vorname").asText("");
-        } else if (leftPerson != null) {
-            personLabel = leftPerson.path("person").path("nachname").asText("") + ", " + leftPerson.path("person").path("vorname").asText("");
-        }
-        
-        // Create a comprehensive person name map that includes persons from both right AND left JSON
-        Map<String, String> personNameByIdRight = new HashMap<>();
-        
-        // Add all persons from right (current) JSON
-        personenRight.stream().forEach(p -> personNameByIdRight.put(p.id, p.label));
-        
-        // Add persons from left JSON that are not already in the map
-        if (leftZeitraum != null) {
-            List<PersonRef> personenLeft = jsonNavigationService.listRightPersons(leftZeitraum);
-            personenLeft.stream()
-                .filter(p -> !personNameByIdRight.containsKey(p.id))
-                .forEach(p -> personNameByIdRight.put(p.id, p.label));
-        }
-
-        // Einkommen / Freibeträge / Kita: jeweils UNION per id
-        List<EinkommenZeile> einkommenZeilen = dataExtractor.buildEinkommenZeilen(rightPerson, leftPerson);
-        List<FreibetragZeile> freibetragZeilen = dataExtractor.buildFreibetragZeilen(rightPerson, leftPerson);
-        List<KitaZeile> kitaZeilen = dataExtractor.buildKitaZeilen(rightPerson, leftPerson, personNameByIdRight);
+        PersonComparisonContext context = createPersonComparisonContext(rightZeitraum, leftZeitraum, personId);
 
         PersonDetailsResponse response = new PersonDetailsResponse(
                 personId,
-                personLabel,
-                einkommenZeilen,
-                freibetragZeilen,
-                kitaZeilen
+                context.personLabel,
+                context.einkommenZeilen,
+                context.freibetragZeilen,
+                context.kitaZeilen
         );
 
         return ResponseEntity.ok(response);
@@ -272,67 +193,28 @@ public class VergleichController {
         // Ersten Zeitraum des neuen Vorgangs als Default wählen
         String newLeftZeitraumId = !leftZ.isEmpty() ? leftZ.get(0).id : null;
         
-        // --- Rechts (Master) Zeitraum ---
         JsonNode rightZeitraum = jsonNavigationService.findZeitraumById(right, rightZeitraumId);
-        
-        // --- Links (Baseline) Zeitraum ---
         JsonNode leftZeitraum = null;
         if (newLeftZeitraumId != null) {
             leftZeitraum = jsonNavigationService.findZeitraumById(jsonNavigationService.getRootOfVorgang(left, newLeftVorgangId), newLeftZeitraumId);
         }
 
-        // --- Personen-Tabelle neu berechnen ---
-        Map<String, Pair<JsonNode, JsonNode>> personenPairs = comparisonService.unionByKey(
-                jsonNavigationService.personsArray(rightZeitraum), 
-                jsonNavigationService.personsArray(leftZeitraum), 
-                n -> n.path("person").path("id").asText()
-        );
-        List<MitgliedRow> mitgliederRows = personenPairs.entrySet().stream()
+        PersonComparisonContext context = createPersonComparisonContext(rightZeitraum, leftZeitraum, personId);
+        List<MitgliedRow> mitgliederRows = context.personenPairs.entrySet().stream()
                 .map(e -> dataExtractor.buildMitgliedRow(e.getKey(), e.getValue().right, e.getValue().left))
                 .sorted(Comparator.comparing(MitgliedRow::personId))
                 .toList();
 
-        // --- Details für ausgewählte Person ---
-        List<PersonRef> personenRight = jsonNavigationService.listRightPersons(rightZeitraum);
-        JsonNode rightPerson = personenPairs.getOrDefault(personId, new Pair<>(null, null)).right;
-        JsonNode leftPerson = personenPairs.getOrDefault(personId, new Pair<>(null, null)).left;
-
-        // Create personLabel from either right or left person data
-        String personLabel = "(keine Person)";
-        if (rightPerson != null) {
-            personLabel = rightPerson.path("person").path("nachname").asText("") + ", " + rightPerson.path("person").path("vorname").asText("");
-        } else if (leftPerson != null) {
-            personLabel = leftPerson.path("person").path("nachname").asText("") + ", " + leftPerson.path("person").path("vorname").asText("");
-        }
-        
-        // Create a comprehensive person name map that includes persons from both right AND left JSON
-        Map<String, String> personNameByIdRight = new HashMap<>();
-        
-        // Add all persons from right (current) JSON
-        personenRight.stream().forEach(p -> personNameByIdRight.put(p.id, p.label));
-        
-        // Add persons from left JSON that are not already in the map
-        if (leftZeitraum != null) {
-            List<PersonRef> personenLeft = jsonNavigationService.listRightPersons(leftZeitraum);
-            personenLeft.stream()
-                .filter(p -> !personNameByIdRight.containsKey(p.id))
-                .forEach(p -> personNameByIdRight.put(p.id, p.label));
-        }
-
-        List<EinkommenZeile> einkommenZeilen = dataExtractor.buildEinkommenZeilen(rightPerson, leftPerson);
-        List<FreibetragZeile> freibetragZeilen = dataExtractor.buildFreibetragZeilen(rightPerson, leftPerson);
-        List<KitaZeile> kitaZeilen = dataExtractor.buildKitaZeilen(rightPerson, leftPerson, personNameByIdRight);
-
         VorgangChangeResponse response = new VorgangChangeResponse(
                 newLeftVorgangId,
                 newLeftZeitraumId,
                 leftZ,
                 mitgliederRows,
                 personId,
-                personLabel,
-                einkommenZeilen,
-                freibetragZeilen,
-                kitaZeilen
+                context.personLabel,
+                context.einkommenZeilen,
+                context.freibetragZeilen,
+                context.kitaZeilen
         );
 
         return ResponseEntity.ok(response);
@@ -351,71 +233,101 @@ public class VergleichController {
         JsonNode left = om.readTree(leftJson);
         JsonNode right = om.readTree(rightJson);
 
-        // --- Rechts (Master) Zeitraum ---
         JsonNode rightZeitraum = jsonNavigationService.findZeitraumById(right, rightZeitraumId);
-        
-        // --- Links (Baseline) Zeitraum ---
         JsonNode leftZeitraum = null;
         if (newLeftZeitraumId != null) {
             leftZeitraum = jsonNavigationService.findZeitraumById(jsonNavigationService.getRootOfVorgang(left, leftVorgangId), newLeftZeitraumId);
         }
 
-        // --- Personen-Tabelle neu berechnen ---
+        PersonComparisonContext context = createPersonComparisonContext(rightZeitraum, leftZeitraum, personId);
+        List<MitgliedRow> mitgliederRows = context.personenPairs.entrySet().stream()
+                .map(e -> dataExtractor.buildMitgliedRow(e.getKey(), e.getValue().right, e.getValue().left))
+                .sorted(Comparator.comparing(MitgliedRow::personId))
+                .toList();
+
+        ZeitraumChangeResponse response = new ZeitraumChangeResponse(
+                newLeftZeitraumId,
+                mitgliederRows,
+                personId,
+                context.personLabel,
+                context.einkommenZeilen,
+                context.freibetragZeilen,
+                context.kitaZeilen
+        );
+
+        return ResponseEntity.ok(response);
+    }
+
+    // ===== Private Helper Methods =====
+    
+    private String resolveActiveKunde(String kunde, String kundeHeader) {
+        return kunde != null ? kunde : kundeHeader;
+    }
+    
+    private PersonComparisonContext createPersonComparisonContext(JsonNode rightZeitraum, JsonNode leftZeitraum, String personId) {
+        // Personen-Tabelle (UNION via person.id)
         Map<String, Pair<JsonNode, JsonNode>> personenPairs = comparisonService.unionByKey(
                 jsonNavigationService.personsArray(rightZeitraum), 
                 jsonNavigationService.personsArray(leftZeitraum), 
                 n -> n.path("person").path("id").asText()
         );
-        List<MitgliedRow> mitgliederRows = personenPairs.entrySet().stream()
-                .map(e -> dataExtractor.buildMitgliedRow(e.getKey(), e.getValue().right, e.getValue().left))
-                .sorted(Comparator.comparing(MitgliedRow::personId))
-                .toList();
 
-        // --- Details für ausgewählte Person ---
-        List<PersonRef> personenRight = jsonNavigationService.listRightPersons(rightZeitraum);
+        // Details für ausgewählte Person
         JsonNode rightPerson = personenPairs.getOrDefault(personId, new Pair<>(null, null)).right;
         JsonNode leftPerson = personenPairs.getOrDefault(personId, new Pair<>(null, null)).left;
 
-        // Create personLabel from either right or left person data
-        String personLabel = "(keine Person)";
+        String personLabel = createPersonLabel(rightPerson, leftPerson);
+        Map<String, String> personNameById = createPersonNameMap(rightZeitraum, leftZeitraum);
+
+        // Einkommen / Freibeträge / Kita: jeweils UNION per id
+        List<EinkommenZeile> einkommenZeilen = dataExtractor.buildEinkommenZeilen(rightPerson, leftPerson);
+        List<FreibetragZeile> freibetragZeilen = dataExtractor.buildFreibetragZeilen(rightPerson, leftPerson);
+        List<KitaZeile> kitaZeilen = dataExtractor.buildKitaZeilen(rightPerson, leftPerson, personNameById);
+
+        return new PersonComparisonContext(personenPairs, personLabel, einkommenZeilen, freibetragZeilen, kitaZeilen);
+    }
+    
+    private String createPersonLabel(JsonNode rightPerson, JsonNode leftPerson) {
         if (rightPerson != null) {
-            personLabel = rightPerson.path("person").path("nachname").asText("") + ", " + rightPerson.path("person").path("vorname").asText("");
+            return rightPerson.path("person").path("nachname").asText("") + ", " + 
+                   rightPerson.path("person").path("vorname").asText("");
         } else if (leftPerson != null) {
-            personLabel = leftPerson.path("person").path("nachname").asText("") + ", " + leftPerson.path("person").path("vorname").asText("");
+            return leftPerson.path("person").path("nachname").asText("") + ", " + 
+                   leftPerson.path("person").path("vorname").asText("");
         }
-        
-        // Create a comprehensive person name map that includes persons from both right AND left JSON
-        Map<String, String> personNameByIdRight = new HashMap<>();
+        return "(keine Person)";
+    }
+    
+    private Map<String, String> createPersonNameMap(JsonNode rightZeitraum, JsonNode leftZeitraum) {
+        Map<String, String> personNameById = new HashMap<>();
         
         // Add all persons from right (current) JSON
-        personenRight.stream().forEach(p -> personNameByIdRight.put(p.id, p.label));
+        List<PersonRef> personenRight = jsonNavigationService.listRightPersons(rightZeitraum);
+        personenRight.forEach(p -> personNameById.put(p.id, p.label));
         
         // Add persons from left JSON that are not already in the map
         if (leftZeitraum != null) {
             List<PersonRef> personenLeft = jsonNavigationService.listRightPersons(leftZeitraum);
             personenLeft.stream()
-                .filter(p -> !personNameByIdRight.containsKey(p.id))
-                .forEach(p -> personNameByIdRight.put(p.id, p.label));
+                .filter(p -> !personNameById.containsKey(p.id))
+                .forEach(p -> personNameById.put(p.id, p.label));
         }
-
-        List<EinkommenZeile> einkommenZeilen = dataExtractor.buildEinkommenZeilen(rightPerson, leftPerson);
-        List<FreibetragZeile> freibetragZeilen = dataExtractor.buildFreibetragZeilen(rightPerson, leftPerson);
-        List<KitaZeile> kitaZeilen = dataExtractor.buildKitaZeilen(rightPerson, leftPerson, personNameByIdRight);
-
-        ZeitraumChangeResponse response = new ZeitraumChangeResponse(
-                newLeftZeitraumId,
-                mitgliederRows,
-                personId,
-                personLabel,
-                einkommenZeilen,
-                freibetragZeilen,
-                kitaZeilen
-        );
-
-        return ResponseEntity.ok(response);
+        
+        return personNameById;
     }
 
-    // ===== Helper-Typen =====
+    // ===== Helper Classes =====
+    
+    private record PersonComparisonContext(
+        Map<String, Pair<JsonNode, JsonNode>> personenPairs,
+        String personLabel,
+        List<EinkommenZeile> einkommenZeilen,
+        List<FreibetragZeile> freibetragZeilen,
+        List<KitaZeile> kitaZeilen
+    ) {}
+
+    // ===== Public Records =====
+    
     public record Z(String id, String beginn, String ende) {}
     public record Vorgang(String id, String vorgangstyp, List<Z> zeitraeume) {}
     public record PersonRef(String id, String label) {}
@@ -424,6 +336,7 @@ public class VergleichController {
     public record PersonDetailsResponse(String personId, String personLabel, List<EinkommenZeile> einkommenZeilen, List<FreibetragZeile> freibetragZeilen, List<KitaZeile> kitaZeilen) {}
     public record VorgangChangeResponse(String leftVorgangId, String leftZeitraumId, List<Z> leftZeitraeume, List<MitgliedRow> mitgliederRows, String personId, String personLabel, List<EinkommenZeile> einkommenZeilen, List<FreibetragZeile> freibetragZeilen, List<KitaZeile> kitaZeilen) {}
     public record ZeitraumChangeResponse(String leftZeitraumId, List<MitgliedRow> mitgliederRows, String personId, String personLabel, List<EinkommenZeile> einkommenZeilen, List<FreibetragZeile> freibetragZeilen, List<KitaZeile> kitaZeilen) {}
+    
     public static final class Pair<R, L> {
         public final R right;
         public final L left;