Bladeren bron

Testdaten verbessert

Leonard Schulz 1 jaar geleden
bovenliggende
commit
79f59fd9b3

+ 31 - 10
src/main/java/com/tsystems/inwo/vgl/service/DataComparisonService.java

@@ -36,16 +36,37 @@ public class DataComparisonService {
     public boolean detectPersonChanges(JsonNode rightItem, JsonNode rightPerson, JsonNode leftItem, JsonNode leftPerson) {
         if (rightPerson == null || leftPerson == null) return false;
         
-        // Check person fields
-        return !Objects.equals(rightPerson.path("nachname").asText(""), leftPerson.path("nachname").asText("")) ||
-               !Objects.equals(rightPerson.path("vorname").asText(""), leftPerson.path("vorname").asText("")) ||
-               !Objects.equals(rightPerson.path("geburtsdatum").asText(""), leftPerson.path("geburtsdatum").asText("")) ||
-               !Objects.equals(rightPerson.path("familienstand").asText(""), leftPerson.path("familienstand").asText("")) ||
-               !Objects.equals(rightPerson.path("geschlecht").asText(""), leftPerson.path("geschlecht").asText("")) ||
-               !Objects.equals(rightItem.path("verwandtschaftsverhaeltnis").asText(""), leftItem.path("verwandtschaftsverhaeltnis").asText("")) ||
-               !Objects.equals(rightPerson.path("sozialstellung").asText(""), leftPerson.path("sozialstellung").asText("")) ||
-               !Objects.equals(rightItem.path("rolleImHaushalt").asText(""), leftItem.path("rolleImHaushalt").asText("")) ||
-               rightPerson.path("zahlungsempfaenger").asBoolean(false) != leftPerson.path("zahlungsempfaenger").asBoolean(false);
+        // Check all person fields - Hauptfelder
+        if (!Objects.equals(rightPerson.path("nachname").asText(""), leftPerson.path("nachname").asText("")) ||
+            !Objects.equals(rightPerson.path("vorname").asText(""), leftPerson.path("vorname").asText("")) ||
+            !Objects.equals(rightPerson.path("geburtsdatum").asText(""), leftPerson.path("geburtsdatum").asText("")) ||
+            !Objects.equals(rightPerson.path("sterbedatum").asText(""), leftPerson.path("sterbedatum").asText("")) ||
+            !Objects.equals(rightPerson.path("familienstand").asText(""), leftPerson.path("familienstand").asText("")) ||
+            !Objects.equals(rightPerson.path("geschlecht").asText(""), leftPerson.path("geschlecht").asText("")) ||
+            !Objects.equals(rightPerson.path("anrede").asText(""), leftPerson.path("anrede").asText("")) ||
+            !Objects.equals(rightPerson.path("verwandtschaftsverhaeltnis").asText(""), leftPerson.path("verwandtschaftsverhaeltnis").asText("")) ||
+            !Objects.equals(rightPerson.path("ausschlussgrund").asText(""), leftPerson.path("ausschlussgrund").asText("")) ||
+            !Objects.equals(rightPerson.path("sozialstellung").asText(""), leftPerson.path("sozialstellung").asText("")) ||
+            !Objects.equals(rightPerson.path("aufenthaltstitelEnde").asText(""), leftPerson.path("aufenthaltstitelEnde").asText("")) ||
+            rightPerson.path("blockname").asBoolean(false) != leftPerson.path("blockname").asBoolean(false) ||
+            rightPerson.path("antragsteller").asBoolean(false) != leftPerson.path("antragsteller").asBoolean(false) ||
+            rightPerson.path("zahlungsempfaenger").asBoolean(false) != leftPerson.path("zahlungsempfaenger").asBoolean(false)) {
+            return true;
+        }
+        
+        // Check Zusatzfelder (Überlaufbereich)
+        if (!Objects.equals(rightPerson.path("titel").asText(""), leftPerson.path("titel").asText("")) ||
+            !Objects.equals(rightPerson.path("geburtsort").asText(""), leftPerson.path("geburtsort").asText("")) ||
+            !Objects.equals(rightPerson.path("telefon").asText(""), leftPerson.path("telefon").asText("")) ||
+            !Objects.equals(rightPerson.path("aktenzeichenSozial").asText(""), leftPerson.path("aktenzeichenSozial").asText("")) ||
+            !Objects.equals(rightPerson.path("geburtsname").asText(""), leftPerson.path("geburtsname").asText("")) ||
+            !Objects.equals(rightPerson.path("alterName").asText(""), leftPerson.path("alterName").asText("")) ||
+            !Objects.equals(rightPerson.path("email").asText(""), leftPerson.path("email").asText("")) ||
+            !Objects.equals(rightPerson.path("postabrutionsnummer").asText(""), leftPerson.path("postabrutionsnummer").asText(""))) {
+            return true;
+        }
+        
+        return false;
     }
 
     public boolean detectEinkommenChanges(JsonNode rightItem, JsonNode leftItem) {

+ 14 - 25
src/main/java/com/tsystems/inwo/vgl/service/VergleichDataExtractor.java

@@ -110,10 +110,10 @@ public class VergleichDataExtractor {
             hasChanges
         );
         
-        // Item-level fields - angepasst an Schema
-        String verwandtschaftHtml = htmlService.buildItemFieldHtml(
-            rightItem, leftItem,
-            i -> i.path("verwandtschaftsverhaeltnis").asText(""),
+        // Item-level fields - angepasst an Schema (entfernte rolleImHaushalt)
+        String verwandtschaftHtml = htmlService.buildPersonFieldHtml(
+            rightPerson, leftPerson,
+            p -> p.path("verwandtschaftsverhaeltnis").asText(""),
             hasChanges
         );
         
@@ -135,9 +135,9 @@ public class VergleichDataExtractor {
             hasChanges
         );
         
-        String antragstellerHtml = htmlService.buildItemFieldHtml(
-            rightItem, leftItem,
-            i -> i.path("rolleImHaushalt").asText("").equals("Antragsteller") ? "☑" : "☐",
+        String antragstellerHtml = htmlService.buildPersonFieldHtml(
+            rightPerson, leftPerson,
+            p -> p.path("antragsteller").asBoolean(false) ? "☑" : "☐",
             hasChanges
         );
         
@@ -253,19 +253,13 @@ public class VergleichDataExtractor {
             
             if (primaryItem != null) {
                 String artHtml = htmlService.buildEinkommenFieldHtml(rightItem, leftItem, 
-                    i -> {
-                        String art = i.path("art").asText("");
-                        String artZusatz = i.path("artZusatz").asText("");
-                        return !artZusatz.isEmpty() ? art + " (" + artZusatz + ")" : art;
-                    }, hasChanges);
+                    i -> i.path("art").asText(""), hasChanges);
+                
+                String artZusatzHtml = htmlService.buildEinkommenFieldHtml(rightItem, leftItem, 
+                    i -> i.path("artZusatz").asText(""), hasChanges);
                 
                 String faktorHtml = htmlService.buildEinkommenFieldHtml(rightItem, leftItem,
-                    i -> {
-                        double faktor = i.path("faktor").asDouble(12);
-                        return faktor == 12 ? "monatlich" : 
-                               faktor == 1 ? "jährlich" : 
-                               String.format("%.0fx/Jahr", faktor);
-                    }, hasChanges);
+                    i -> String.valueOf(i.path("faktor").asDouble(12)), hasChanges);
                 
                 String betragHtml = htmlService.buildEinkommenFieldHtml(rightItem, leftItem,
                     i -> String.format("%.2f €", i.path("betrag").asDouble(0.0)), hasChanges);
@@ -290,7 +284,7 @@ public class VergleichDataExtractor {
                 
                 result.add(new EinkommenZeile(
                     symbol, symbolClass, rowClass,
-                    artHtml, faktorHtml, betragHtml,
+                    artHtml, artZusatzHtml, faktorHtml, betragHtml,
                     zuschlagHtml, abschlagHtml, werbungskostenHtml
                 ));
             }
@@ -348,12 +342,7 @@ public class VergleichDataExtractor {
                     i -> i.path("art").asText(""), hasChanges);
                 
                 String frequenzHtml = htmlService.buildFreibetragFieldHtml(rightItem, leftItem,
-                    i -> {
-                        double faktor = i.path("faktor").asDouble(12);
-                        return faktor == 12 ? "monatlich" : 
-                               faktor == 1 ? "jährlich" : 
-                               String.format("%.0fx/Jahr", faktor);
-                    }, hasChanges);
+                    i -> String.valueOf(i.path("faktor").asDouble(12)), hasChanges);
                 
                 String betragHtml = htmlService.buildFreibetragFieldHtml(rightItem, leftItem,
                     i -> String.format("%.2f €", i.path("betrag").asDouble(0.0)), hasChanges);

+ 1 - 1
src/main/java/com/tsystems/inwo/vgl/view/EinkommenZeile.java

@@ -1,5 +1,5 @@
 package com.tsystems.inwo.vgl.view;
 
 public record EinkommenZeile(String symbol, String symbolClass, String rowClass,
-                             String artHtml, String faktorHtml, String betragHtml,
+                             String artHtml, String artZusatzHtml, String faktorHtml, String betragHtml,
                              String zuschlagHtml, String abschlagHtml, String werbungskostenHtml) {}

+ 0 - 3
src/main/java/com/tsystems/inwo/vgl/web/VergleichController.java

@@ -1,15 +1,12 @@
 package com.tsystems.inwo.vgl.web;
 
 import com.fasterxml.jackson.databind.*;
-import com.fasterxml.jackson.databind.node.*;
 import com.tsystems.inwo.vgl.service.*;
 import com.tsystems.inwo.vgl.view.*;
-import com.tsystems.inwo.vgl.util.FormatUtil;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.Model;
 import org.springframework.web.bind.annotation.*;
 import java.util.*;
-import java.util.function.Function;
 import java.util.stream.Collectors;
 
 @Controller

+ 3 - 28
src/main/resources/schemas/haushalt-einkommen.schema.json

@@ -1,7 +1,7 @@
 {
   "$id": "https://example.com/haushalt-einkommen.schema.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
-  "title": "Vergleichsansicht – Seite Haushaltsmitglieder & Einkommen",
+  "title": "Vergleichsansicht Seite Haushaltsmitglieder & Einkommen",
   "description": "Seite mit Stammakte → Vorgänge → Zeiträume → Personen je Zeitraum inkl. Einkommen, Freibeträge, Kinderbetreuung.",
   "type": "object",
   "oneOf": [
@@ -170,12 +170,6 @@
         "geschlecht": {
           "type": "string"
         },
-        "staatsangehoerigkeit": {
-          "type": "string"
-        },
-        "adresse": {
-          "$ref": "#/$defs/Adresse"
-        },
         "telefon": {
           "type": "string"
         },
@@ -203,27 +197,16 @@
           "type": "string",
           "description": "Aktenzeichen des Sozialamtes"
         },
-        "transferleistungJN": {
-          "type": "string",
-          "maxLength": 1,
-          "description": "J/N"
-        },
-        "transferleistungArt": {
-          "type": "string"
-        },
         "sozialstellung": {
           "type": "string"
         },
-        "sozialhilfeArt": {
-          "type": "string"
-        },
         "aufenthaltstitelEnde": {
           "type": "string",
           "format": "date"
         },
-        "istKind": {
+        "antragsteller": {
           "type": "boolean",
-          "description": "true, falls Kind im Sinne der Berechnung"
+          "description": "Checkbox für Antragsteller"
         },
         "zahlungsempfaenger": {
           "type": "boolean",
@@ -266,10 +249,6 @@
           "type": "number",
           "minimum": 0
         },
-        "verglRechnungJN": {
-          "type": "string",
-          "maxLength": 1
-        },
         "zuschlag": {
           "type": "number",
           "minimum": 0
@@ -351,10 +330,6 @@
       "type": "object",
       "additionalProperties": false,
       "properties": {
-        "rolleImHaushalt": {
-          "type": "string",
-          "description": "z.B. Antragsteller:in, Partner:in, Kind"
-        },
         "person": {
           "$ref": "#/$defs/PersonBasis"
         },

+ 173 - 125
src/main/resources/static/example-alt.json

@@ -23,21 +23,33 @@
             "ende": "2024-12-31",
             "personen": [
               {
-                "rolleImHaushalt": "Antragsteller",
                 "person": {
                   "id": "person-001",
                   "nachname": "Müller",
                   "vorname": "Tobias",
+                  "titel": "Dr.",
+                  "anrede": "Herr",
                   "geburtsdatum": "1990-05-15",
+                  "geburtsort": "Hamburg",
+                  "geburtsname": "Müller",
                   "geschlecht": "männlich",
                   "familienstand": "verheiratet",
-                  "zahlungsempfaenger": true
+                  "blockname": false,
+                  "sozialstellung": "Angestellter",
+                  "verwandtschaftsverhaeltnis": "Antragsteller",
+                  "aufenthaltstitelEnde": "2030-12-31",
+                  "telefon": "030-12345678",
+                  "email": "tobias.mueller@example.com",
+                  "aktenzeichenSozial": "SZ-001-2024",
+                  "antragsteller": true,
+                  "zahlungsempfaenger": true,
+                  "postabrutionsnummer": "PA123456"
                 },
                 "einkommen": [
                   {
                     "id": "einkommen-001",
                     "art": "Erwerbstätigkeit",
-                    "artZusatz": "Vollzeit",
+                    "artZusatz": "Vollzeit angestellt",
                     "faktor": 12,
                     "betrag": 2800.00,
                     "werbungskosten": 100.00
@@ -61,32 +73,46 @@
                 ]
               },
               {
-                "rolleImHaushalt": "Partner",
                 "person": {
                   "id": "person-002",
                   "nachname": "Müller",
                   "vorname": "Anna",
+                  "anrede": "Frau",
                   "geburtsdatum": "1992-08-20",
+                  "geburtsort": "Berlin",
+                  "alterName": "Schmidt",
                   "geschlecht": "weiblich",
-                  "familienstand": "verheiratet"
+                  "familienstand": "verheiratet",
+                  "blockname": false,
+                  "sozialstellung": "Angestellte",
+                  "verwandtschaftsverhaeltnis": "Ehepartner",
+                  "telefon": "030-87654321",
+                  "email": "anna.mueller@example.com",
+                  "antragsteller": false
                 },
                 "einkommen": [
                   {
                     "id": "einkommen-002",
                     "art": "Minijob",
+                    "artZusatz": "Teilzeit",
                     "faktor": 12,
                     "betrag": 520.00
                   }
                 ]
               },
               {
-                "rolleImHaushalt": "Kind",
                 "person": {
                   "id": "person-003",
                   "nachname": "Müller",
                   "vorname": "Max",
                   "geburtsdatum": "2018-03-10",
-                  "geschlecht": "männlich"
+                  "geburtsort": "Berlin",
+                  "geschlecht": "männlich",
+                  "familienstand": "ledig",
+                  "blockname": false,
+                  "sozialstellung": "Schüler",
+                  "verwandtschaftsverhaeltnis": "Kind",
+                  "antragsteller": false
                 },
                 "kinderbetreuung": [
                   {
@@ -104,193 +130,149 @@
         "stammvorgang": {
           "id": "stammvorgang-002",
           "vorgangstyp": "Weiterleistungsantrag",
-          "vorgangsstatus": "in Bearbeitung"
+          "vorgangsstatus": "abgeschlossen"
         },
         "zeitraeume": [
           {
             "id": "zeitraum-002",
             "beginn": "2025-01-01",
-            "ende": "2025-06-30",
+            "ende": "2025-12-31",
             "personen": [
               {
-                "rolleImHaushalt": "Antragsteller",
                 "person": {
                   "id": "person-001",
                   "nachname": "Müller",
                   "vorname": "Tobias",
+                  "titel": "Dr.",
+                  "anrede": "Herr",
                   "geburtsdatum": "1990-05-15",
+                  "geburtsort": "Hamburg",
+                  "geburtsname": "Müller",
                   "geschlecht": "männlich",
                   "familienstand": "verheiratet",
-                  "zahlungsempfaenger": true
+                  "blockname": false,
+                  "sozialstellung": "Angestellter",
+                  "verwandtschaftsverhaeltnis": "Antragsteller",
+                  "aufenthaltstitelEnde": "2030-12-31",
+                  "telefon": "030-12345678",
+                  "email": "tobias.mueller@example.com",
+                  "aktenzeichenSozial": "SZ-001-2024",
+                  "antragsteller": true,
+                  "zahlungsempfaenger": true,
+                  "postabrutionsnummer": "PA123456"
                 },
                 "einkommen": [
                   {
-                    "id": "einkommen-003",
+                    "id": "einkommen-001",
                     "art": "Erwerbstätigkeit",
-                    "artZusatz": "Vollzeit",
+                    "artZusatz": "Vollzeit angestellt",
                     "faktor": 12,
-                    "betrag": 2950.00,
+                    "betrag": 3100.00,
                     "werbungskosten": 120.00,
                     "zuschlag": 100.00
                   }
                 ],
                 "freibetraege": [
                   {
-                    "id": "freibetrag-002",
+                    "id": "freibetrag-001",
                     "typ": "F",
                     "art": "Erwerbstätigenfreibetrag",
                     "faktor": 12,
-                    "betrag": 320.00
+                    "betrag": 350.00
                   },
                   {
-                    "id": "pauschale-002",
+                    "id": "pauschale-001",
                     "typ": "P",
                     "art": "Versicherungspauschale",
                     "faktor": 12,
-                    "betrag": 35.00
+                    "betrag": 40.00
                   }
                 ]
               },
               {
-                "rolleImHaushalt": "Partner",
                 "person": {
                   "id": "person-002",
                   "nachname": "Müller",
                   "vorname": "Anna",
+                  "anrede": "Frau",
                   "geburtsdatum": "1992-08-20",
+                  "geburtsort": "Berlin",
+                  "alterName": "Schmidt",
                   "geschlecht": "weiblich",
-                  "familienstand": "verheiratet"
-                },
-                "einkommen": [
-                  {
-                    "id": "einkommen-004",
-                    "art": "Teilzeit",
-                    "faktor": 12,
-                    "betrag": 800.00
-                  }
-                ]
-              },
-              {
-                "rolleImHaushalt": "Kind",
-                "person": {
-                  "id": "person-003",
-                  "nachname": "Müller",
-                  "vorname": "Max",
-                  "geburtsdatum": "2018-03-10",
-                  "geschlecht": "männlich"
-                },
-                "kinderbetreuung": [
-                  {
-                    "id": "kita-002",
-                    "kindRef": "person-003",
-                    "betrag": 180.00
-                  }
-                ]
-              },
-              {
-                "rolleImHaushalt": "Kind",
-                "person": {
-                  "id": "person-004",
-                  "nachname": "Müller",
-                  "vorname": "Lisa",
-                  "geburtsdatum": "2021-11-05",
-                  "geschlecht": "weiblich"
-                }
-              }
-            ]
-          },
-          {
-            "id": "zeitraum-003",
-            "beginn": "2025-07-01",
-            "ende": "2025-12-31",
-            "personen": [
-              {
-                "rolleImHaushalt": "Antragsteller",
-                "person": {
-                  "id": "person-001",
-                  "nachname": "Müller",
-                  "vorname": "Tobias",
-                  "geburtsdatum": "1990-05-15",
-                  "geschlecht": "männlich",
                   "familienstand": "verheiratet",
-                  "zahlungsempfaenger": true
+                  "blockname": false,
+                  "sozialstellung": "Angestellte",
+                  "verwandtschaftsverhaeltnis": "Ehepartner",
+                  "telefon": "030-87654321",
+                  "email": "anna.mueller@example.com",
+                  "antragsteller": false
                 },
                 "einkommen": [
                   {
-                    "id": "einkommen-005",
+                    "id": "einkommen-002",
                     "art": "Erwerbstätigkeit",
-                    "artZusatz": "Vollzeit",
+                    "artZusatz": "Teilzeit",
                     "faktor": 12,
-                    "betrag": 3100.00,
-                    "werbungskosten": 120.00,
-                    "zuschlag": 150.00
+                    "betrag": 1200.00,
+                    "werbungskosten": 60.00
                   }
                 ],
                 "freibetraege": [
                   {
-                    "id": "freibetrag-003",
+                    "id": "freibetrag-002",
                     "typ": "F",
                     "art": "Erwerbstätigenfreibetrag",
                     "faktor": 12,
-                    "betrag": 350.00
+                    "betrag": 120.00
                   },
                   {
-                    "id": "pauschale-003",
+                    "id": "pauschale-002",
                     "typ": "P",
                     "art": "Versicherungspauschale",
                     "faktor": 12,
-                    "betrag": 40.00
+                    "betrag": 25.00
                   }
                 ]
               },
               {
-                "rolleImHaushalt": "Partner",
-                "person": {
-                  "id": "person-002",
-                  "nachname": "Müller",
-                  "vorname": "Anna",
-                  "geburtsdatum": "1992-08-20",
-                  "geschlecht": "weiblich",
-                  "familienstand": "verheiratet"
-                },
-                "einkommen": [
-                  {
-                    "id": "einkommen-006",
-                    "art": "Teilzeit",
-                    "faktor": 12,
-                    "betrag": 1200.00
-                  }
-                ]
-              },
-              {
-                "rolleImHaushalt": "Kind",
                 "person": {
                   "id": "person-003",
                   "nachname": "Müller",
                   "vorname": "Max",
                   "geburtsdatum": "2018-03-10",
-                  "geschlecht": "männlich"
+                  "geburtsort": "Berlin",
+                  "geschlecht": "männlich",
+                  "familienstand": "ledig",
+                  "blockname": false,
+                  "sozialstellung": "Schüler",
+                  "verwandtschaftsverhaeltnis": "Kind",
+                  "antragsteller": false
                 },
                 "kinderbetreuung": [
                   {
-                    "id": "kita-003",
+                    "id": "kita-001",
                     "kindRef": "person-003",
-                    "betrag": 200.00
+                    "betrag": 180.00
                   }
                 ]
               },
               {
-                "rolleImHaushalt": "Kind",
                 "person": {
                   "id": "person-004",
                   "nachname": "Müller",
                   "vorname": "Lisa",
                   "geburtsdatum": "2021-11-05",
-                  "geschlecht": "weiblich"
+                  "geburtsort": "Berlin",
+                  "geschlecht": "weiblich",
+                  "familienstand": "ledig",
+                  "blockname": false,
+                  "sozialstellung": "Kind",
+                  "verwandtschaftsverhaeltnis": "Kind",
+                  "antragsteller": false
                 },
                 "kinderbetreuung": [
                   {
-                    "id": "kita-004",
+                    "id": "kita-002",
                     "kindRef": "person-004",
                     "betrag": 120.00
                   }
@@ -304,30 +286,42 @@
         "stammvorgang": {
           "id": "stammvorgang-003",
           "vorgangstyp": "Änderungsantrag",
-          "vorgangsstatus": "eingereicht"
+          "vorgangsstatus": "in Bearbeitung"
         },
         "zeitraeume": [
           {
-            "id": "zeitraum-004",
+            "id": "zeitraum-003",
             "beginn": "2026-01-01",
             "ende": "2026-12-31",
             "personen": [
               {
-                "rolleImHaushalt": "Antragsteller",
                 "person": {
                   "id": "person-001",
                   "nachname": "Müller",
                   "vorname": "Tobias",
+                  "titel": "Dr.",
+                  "anrede": "Herr",
                   "geburtsdatum": "1990-05-15",
+                  "geburtsort": "Hamburg",
+                  "geburtsname": "Müller",
                   "geschlecht": "männlich",
                   "familienstand": "verheiratet",
-                  "zahlungsempfaenger": true
+                  "blockname": false,
+                  "sozialstellung": "Angestellter",
+                  "verwandtschaftsverhaeltnis": "Antragsteller",
+                  "aufenthaltstitelEnde": "2030-12-31",
+                  "telefon": "030-12345678",
+                  "email": "tobias.mueller@example.com",
+                  "aktenzeichenSozial": "SZ-001-2024",
+                  "antragsteller": true,
+                  "zahlungsempfaenger": true,
+                  "postabrutionsnummer": "PA123456"
                 },
                 "einkommen": [
                   {
-                    "id": "einkommen-007",
+                    "id": "einkommen-001",
                     "art": "Erwerbstätigkeit",
-                    "artZusatz": "Vollzeit",
+                    "artZusatz": "Vollzeit angestellt",
                     "faktor": 12,
                     "betrag": 3200.00,
                     "werbungskosten": 130.00
@@ -335,7 +329,7 @@
                 ],
                 "freibetraege": [
                   {
-                    "id": "freibetrag-004",
+                    "id": "freibetrag-001",
                     "typ": "F",
                     "art": "Erwerbstätigenfreibetrag",
                     "faktor": 12,
@@ -344,52 +338,106 @@
                 ]
               },
               {
-                "rolleImHaushalt": "Partner",
                 "person": {
                   "id": "person-002",
                   "nachname": "Müller",
                   "vorname": "Anna",
+                  "anrede": "Frau",
                   "geburtsdatum": "1992-08-20",
+                  "geburtsort": "Berlin",
+                  "alterName": "Schmidt",
                   "geschlecht": "weiblich",
-                  "familienstand": "verheiratet"
+                  "familienstand": "verheiratet",
+                  "blockname": false,
+                  "sozialstellung": "Angestellte",
+                  "verwandtschaftsverhaeltnis": "Ehepartner",
+                  "telefon": "030-87654321",
+                  "email": "anna.mueller@example.com",
+                  "antragsteller": false
                 },
                 "einkommen": [
                   {
-                    "id": "einkommen-008",
-                    "art": "Vollzeit",
+                    "id": "einkommen-002",
+                    "art": "Erwerbstätigkeit",
+                    "artZusatz": "Vollzeit",
                     "faktor": 12,
-                    "betrag": 2400.00
+                    "betrag": 2400.00,
+                    "werbungskosten": 100.00
                   }
                 ],
                 "freibetraege": [
                   {
-                    "id": "freibetrag-005",
+                    "id": "freibetrag-002",
                     "typ": "F",
                     "art": "Erwerbstätigenfreibetrag",
                     "faktor": 12,
                     "betrag": 240.00
+                  },
+                  {
+                    "id": "pauschale-002",
+                    "typ": "P",
+                    "art": "Versicherungspauschale",
+                    "faktor": 12,
+                    "betrag": 35.00
                   }
                 ]
               },
               {
-                "rolleImHaushalt": "Kind",
                 "person": {
                   "id": "person-003",
                   "nachname": "Müller",
                   "vorname": "Max",
                   "geburtsdatum": "2018-03-10",
-                  "geschlecht": "männlich"
+                  "geburtsort": "Berlin",
+                  "geschlecht": "männlich",
+                  "familienstand": "ledig",
+                  "blockname": false,
+                  "sozialstellung": "Schüler",
+                  "verwandtschaftsverhaeltnis": "Kind",
+                  "antragsteller": false
                 }
               },
               {
-                "rolleImHaushalt": "Kind",
                 "person": {
                   "id": "person-004",
                   "nachname": "Müller",
                   "vorname": "Lisa",
                   "geburtsdatum": "2021-11-05",
-                  "geschlecht": "weiblich"
+                  "geburtsort": "Berlin",
+                  "geschlecht": "weiblich",
+                  "familienstand": "ledig",
+                  "blockname": false,
+                  "sozialstellung": "Kind",
+                  "verwandtschaftsverhaeltnis": "Kind",
+                  "antragsteller": false
                 }
+              },
+              {
+                "person": {
+                  "id": "person-005",
+                  "nachname": "Schmidt",
+                  "vorname": "Maria",
+                  "anrede": "Frau",
+                  "geburtsdatum": "1965-12-01",
+                  "geburtsort": "Dresden",
+                  "geschlecht": "weiblich",
+                  "familienstand": "verwitwet",
+                  "blockname": true,
+                  "sozialstellung": "Rentnerin",
+                  "verwandtschaftsverhaeltnis": "Mutter",
+                  "ausschlussgrund": "Einkommen zu hoch",
+                  "telefon": "030-11111111",
+                  "antragsteller": false
+                },
+                "einkommen": [
+                  {
+                    "id": "einkommen-011",
+                    "art": "Rente",
+                    "artZusatz": "Altersrente",
+                    "faktor": 12,
+                    "betrag": 1600.00
+                  }
+                ]
               }
             ]
           }

+ 129 - 20
src/main/resources/static/example-neu.json

@@ -12,35 +12,56 @@
     "vorgaenge": [
       {
         "stammvorgang": {
-          "id": "stammvorgang-001",
-          "vorgangstyp": "Erstantrag",
-          "vorgangsstatus": "abgeschlossen"
+          "id": "stammvorgang-004",
+          "vorgangstyp": "Änderungsantrag",
+          "vorgangsstatus": "genehmigt"
         },
         "zeitraeume": [
           {
-            "id": "zeitraum-001",
-            "beginn": "2024-01-01",
-            "ende": "2024-12-31",
+            "id": "zeitraum-005",
+            "beginn": "2026-01-01",
+            "ende": "2026-12-31",
             "personen": [
               {
-                "rolleImHaushalt": "Antragsteller",
                 "person": {
                   "id": "person-001",
                   "nachname": "Müller",
                   "vorname": "Tobias",
+                  "titel": "Dr.",
+                  "anrede": "Herr",
                   "geburtsdatum": "1990-05-15",
+                  "geburtsort": "Hamburg",
+                  "geburtsname": "Müller",
                   "geschlecht": "männlich",
                   "familienstand": "verheiratet",
-                  "zahlungsempfaenger": true
+                  "blockname": false,
+                  "sozialstellung": "Angestellter",
+                  "verwandtschaftsverhaeltnis": "Antragsteller",
+                  "aufenthaltstitelEnde": "2030-12-31",
+                  "telefon": "030-12345678",
+                  "email": "tobias.mueller@neuemail.com",
+                  "aktenzeichenSozial": "SZ-001-2024",
+                  "antragsteller": true,
+                  "zahlungsempfaenger": true,
+                  "postabrutionsnummer": "PA1234ewewwewe56"
                 },
                 "einkommen": [
                   {
                     "id": "einkommen-001",
                     "art": "Erwerbstätigkeit",
-                    "artZusatz": "Vollzeit",
+                    "artZusatz": "Vollzeit angestellt",
                     "faktor": 12,
-                    "betrag": 2800.00,
-                    "werbungskosten": 100.00
+                    "betrag": 3500.00,
+                    "werbungskosten": 150.00,
+                    "zuschlag": 200.00
+                  },
+                  {
+                    "id": "einkommen-010",
+                    "art": "Nebentätigkeit",
+                    "artZusatz": "Beratung",
+                    "faktor": 12,
+                    "betrag": 800.00,
+                    "werbungskosten": 50.00
                   }
                 ],
                 "freibetraege": [
@@ -49,50 +70,138 @@
                     "typ": "F",
                     "art": "Erwerbstätigenfreibetrag",
                     "faktor": 12,
-                    "betrag": 300.00
+                    "betrag": 400.00
                   },
                   {
                     "id": "pauschale-001",
                     "typ": "P",
                     "art": "Versicherungspauschale",
                     "faktor": 12,
-                    "betrag": 30.00
+                    "betrag": 50.00
+                  },
+                  {
+                    "id": "befristet-001",
+                    "typ": "F",
+                    "art": "Befristeter Freibetrag",
+                    "faktor": 12,
+                    "betrag": 100.00,
+                    "fristDatum": "2026-06-30"
                   }
                 ]
               },
               {
-                "rolleImHaushalt": "Partner",
                 "person": {
                   "id": "person-002",
                   "nachname": "Müller",
                   "vorname": "Anna",
+                  "anrede": "Frau",
                   "geburtsdatum": "1992-08-20",
+                  "geburtsort": "Berlin",
+                  "alterName": "Schmidt",
                   "geschlecht": "weiblich",
-                  "familienstand": "verheiratet"
+                  "familienstand": "verheiratet",
+                  "blockname": false,
+                  "sozialstellung": "Angestellte",
+                  "verwandtschaftsverhaeltnis": "Ehepartner",
+                  "telefon": "030-87654321",
+                  "email": "anna.mueller@example.com",
+                  "antragsteller": false
                 },
                 "einkommen": [
                   {
                     "id": "einkommen-002",
-                    "art": "Minijob",
+                    "art": "Erwerbstätigkeit",
+                    "artZusatz": "Teilzeit",
+                    "faktor": 12,
+                    "betrag": 2100.00,
+                    "werbungskosten": 80.00
+                  }
+                ],
+                "freibetraege": [
+                  {
+                    "id": "freibetrag-002",
+                    "typ": "F",
+                    "art": "Erwerbstätigenfreibetrag",
+                    "faktor": 12,
+                    "betrag": 210.00
+                  },
+                  {
+                    "id": "pauschale-002",
+                    "typ": "P",
+                    "art": "Versicherungspauschale",
                     "faktor": 12,
-                    "betrag": 520.00
+                    "betrag": 30.00
                   }
                 ]
               },
               {
-                "rolleImHaushalt": "Kind",
                 "person": {
                   "id": "person-003",
                   "nachname": "Müller",
                   "vorname": "Max",
                   "geburtsdatum": "2018-03-10",
-                  "geschlecht": "männlich"
+                  "geburtsort": "Berlin",
+                  "geschlecht": "männlich",
+                  "familienstand": "ledig",
+                  "blockname": false,
+                  "sozialstellung": "Schüler",
+                  "verwandtschaftsverhaeltnis": "Kind",
+                  "antragsteller": false
                 },
                 "kinderbetreuung": [
                   {
                     "id": "kita-001",
                     "kindRef": "person-003",
-                    "betrag": 150.00
+                    "betrag": 220.00
+                  }
+                ]
+              },
+              {
+                "person": {
+                  "id": "person-004",
+                  "nachname": "Müller",
+                  "vorname": "Lisa",
+                  "geburtsdatum": "2021-11-05",
+                  "geburtsort": "Berlin",
+                  "geschlecht": "weiblich",
+                  "familienstand": "ledig",
+                  "blockname": false,
+                  "sozialstellung": "Kind",
+                  "verwandtschaftsverhaeltnis": "Kind",
+                  "antragsteller": false
+                },
+                "kinderbetreuung": [
+                  {
+                    "id": "kita-002",
+                    "kindRef": "person-004",
+                    "betrag": 180.00
+                  }
+                ]
+              },
+              {
+                "person": {
+                  "id": "person-005",
+                  "nachname": "Schmidt",
+                  "vorname": "Maria",
+                  "anrede": "Frau",
+                  "geburtsdatum": "1965-12-01",
+                  "geburtsort": "Dresden",
+                  "geschlecht": "weiblich",
+                  "familienstand": "verwitwet",
+                  "blockname": true,
+                  "sozialstellung": "Rentnerin",
+                  "verwandtschaftsverhaeltnis": "Mutter",
+                  "ausschlussgrund": "Einkommen zu hoch",
+                  "telefon": "030-11111111",
+                  "antragsteller": false
+                },
+                "einkommen": [
+                  {
+                    "id": "einkommen-011",
+                    "art": "Rente",
+                    "artZusatz": "Altersrente",
+                    "faktor": 12,
+                    "betrag": 1800.00
                   }
                 ]
               }

+ 41 - 2
src/main/resources/static/styles.css

@@ -231,6 +231,46 @@ button:active {
   font-size: 13px;
 }
 
+/* Vergleichssteuerungen */
+.vergleich-controls {
+  display: flex;
+  align-items: center;
+}
+
+.vergleich-controls-wrapper {
+  display: flex;
+  align-items: center;
+  gap: 16px;
+}
+
+.vorgang-form,
+.zeitraum-form {
+  display: flex;
+  align-items: center;
+  gap: 8px;
+}
+
+.control-group {
+  display: flex;
+  align-items: center;
+  gap: 8px;
+}
+
+.control-group label {
+  font-size: 13px;
+  font-weight: bold;
+  white-space: nowrap;
+}
+
+.vorgang-select,
+.zeitraum-select {
+  width: 200px;
+  padding: 4px 8px;
+  font-size: 13px;
+  min-height: 32px;
+}
+
+/* Legacy Styles für Kompatibilität */
 .zeitraum-controls {
   display: flex;
   align-items: center;
@@ -286,7 +326,7 @@ button:active {
 
 .legende-item:has(.plus) {
   background: var(--gruen-hell);
-  border: 1px solid var(--gruen); /
+  border: 1px solid var(--gruen); 
 }
 
 .legende-item:has(.minus) {
@@ -759,4 +799,3 @@ tr:focus {
     transform: translateY(0);
   }
 }
-

+ 45 - 41
src/main/resources/templates/vergleich.html

@@ -54,46 +54,48 @@
       </div>
       
       <div class="vergleich-controls">
-        <!-- Vorgangsauswahl (links/alt) -->
-        <form method="post" action="/vergleich" class="vorgang-form" role="form" aria-label="Vorgangsauswahl">
-          <input type="hidden" name="schemaName" th:value="${schemaName}"/>
-          <input type="hidden" name="validate" th:value="${validate}"/>
-          <input type="hidden" name="leftJson" th:value="${leftJson}"/>
-          <input type="hidden" name="rightJson" th:value="${rightJson}"/>
-          <input type="hidden" name="rightZeitraumId" th:value="${rightZeitraumId}"/>
-          <input type="hidden" name="personId" th:value="${personId}"/>
-          <input type="hidden" name="kunde" th:value="${activeKunde}"/>
+        <div class="vergleich-controls-wrapper">
+          <!-- Vorgangsauswahl (links/alt) -->
+          <form method="post" action="/vergleich" class="vorgang-form" role="form" aria-label="Vorgangsauswahl">
+            <input type="hidden" name="schemaName" th:value="${schemaName}"/>
+            <input type="hidden" name="validate" th:value="${validate}"/>
+            <input type="hidden" name="leftJson" th:value="${leftJson}"/>
+            <input type="hidden" name="rightJson" th:value="${rightJson}"/>
+            <input type="hidden" name="rightZeitraumId" th:value="${rightZeitraumId}"/>
+            <input type="hidden" name="personId" th:value="${personId}"/>
+            <input type="hidden" name="kunde" th:value="${activeKunde}"/>
+            
+            <div class="control-group">
+              <label for="leftVorgangId">Vergleichsvorgang:</label>
+              <select name="leftVorgangId" id="leftVorgangId" class="vorgang-select" onchange="this.form.submit()">
+                <option th:each="v : ${leftCandidates}" th:value="${v.id}"
+                        th:selected="${v.id == leftVorgangId}"
+                        th:text="${v.vorgangstyp + (!#strings.isEmpty(v.vorgangstyp) ? ' (' + v.id + ')' : v.id)}"></option>
+              </select>
+            </div>
+          </form>
           
-          <div class="control-group">
-            <label for="leftVorgangId">Vergleichsvorgang:</label>
-            <select name="leftVorgangId" id="leftVorgangId" class="vorgang-select" onchange="this.form.submit()">
-              <option th:each="v : ${leftCandidates}" th:value="${v.id}"
-                      th:selected="${v.id == leftVorgangId}"
-                      th:text="${v.vorgangstyp + (!#strings.isEmpty(v.vorgangstyp) ? ' (' + v.id + ')' : v.id)}"></option>
-            </select>
-          </div>
-        </form>
-        
-        <!-- Zeitraumauswahl (links/alt) -->
-        <form method="post" action="/vergleich" class="zeitraum-form" role="form" aria-label="Zeitraumauswahl">
-          <input type="hidden" name="schemaName" th:value="${schemaName}"/>
-          <input type="hidden" name="validate" th:value="${validate}"/>
-          <input type="hidden" name="leftJson" th:value="${leftJson}"/>
-          <input type="hidden" name="rightJson" th:value="${rightJson}"/>
-          <input type="hidden" name="leftVorgangId" th:value="${leftVorgangId}"/>
-          <input type="hidden" name="rightZeitraumId" th:value="${rightZeitraumId}"/>
-          <input type="hidden" name="personId" th:value="${personId}"/>
-          <input type="hidden" name="kunde" th:value="${activeKunde}"/>
-          
-          <div class="control-group">
-            <label for="leftZeitraumId">Zeitraum:</label>
-            <select name="leftZeitraumId" id="leftZeitraumId" class="zeitraum-select" onchange="this.form.submit()">
-              <option th:each="z : ${leftZeitraeumeOfSelected}" th:value="${z.id}"
-                      th:selected="${z.id == leftZeitraumId}"
-                      th:text="${z.beginn} + ' - ' + ${z.ende}"></option>
-            </select>
-          </div>
-        </form>
+          <!-- Zeitraumauswahl (links/alt) -->
+          <form method="post" action="/vergleich" class="zeitraum-form" role="form" aria-label="Zeitraumauswahl">
+            <input type="hidden" name="schemaName" th:value="${schemaName}"/>
+            <input type="hidden" name="validate" th:value="${validate}"/>
+            <input type="hidden" name="leftJson" th:value="${leftJson}"/>
+            <input type="hidden" name="rightJson" th:value="${rightJson}"/>
+            <input type="hidden" name="leftVorgangId" th:value="${leftVorgangId}"/>
+            <input type="hidden" name="rightZeitraumId" th:value="${rightZeitraumId}"/>
+            <input type="hidden" name="personId" th:value="${personId}"/>
+            <input type="hidden" name="kunde" th:value="${activeKunde}"/>
+            
+            <div class="control-group">
+              <label for="leftZeitraumId">Zeitraum:</label>
+              <select name="leftZeitraumId" id="leftZeitraumId" class="zeitraum-select" onchange="this.form.submit()">
+                <option th:each="z : ${leftZeitraeumeOfSelected}" th:value="${z.id}"
+                        th:selected="${z.id == leftZeitraumId}"
+                        th:text="${z.beginn} + ' - ' + ${z.ende}"></option>
+              </select>
+            </div>
+          </form>
+        </div>
       </div>
     </div>
   </header>
@@ -159,9 +161,9 @@
               <th scope="col">Verwandtschaft</th>
               <th scope="col">Ausschlussgrund</th>
               <th scope="col">Soz. Stellung</th>
-              <th scope="col">Ende Aufenthaltstitel</th>
               <th scope="col">Antragsteller</th>
               <th scope="col">Zahlungsempfänger</th>
+              <th scope="col">Ende Aufenthaltstitel</th>
             </tr>
           </thead>
           <tbody>
@@ -197,9 +199,9 @@
                 <td th:utext="${r.verwandtschaftHtml}"></td>
                 <td th:utext="${r.ausschlussgrundHtml}"></td>
                 <td th:utext="${r.sozialstellungHtml}"></td>
-                <td th:utext="${r.aufenthaltstitelEndeHtml}"></td>
                 <td th:utext="${r.antragstellerHtml}"></td>
                 <td th:utext="${r.zahlungsempfaengerHtml}"></td>
+                <td th:utext="${r.aufenthaltstitelEndeHtml}"></td>
               </tr>
               
               <!-- Aufklappbare Detailzeile -->
@@ -269,6 +271,7 @@
             <tr>
               <th scope="col">Änderung</th>
               <th scope="col">Art</th>
+              <th scope="col">Ergänzung</th>
               <th scope="col">Faktor</th>
               <th scope="col">Betrag</th>
               <th scope="col">Zuschlag</th>
@@ -281,6 +284,7 @@
               <td class="sym" th:classappend="' ' + ${z.symbolClass}" th:text="${z.symbol}"
                   th:aria-label="${z.symbol == '+' ? 'Hinzugefügt' : (z.symbol == '-' ? 'Gelöscht' : (z.symbol == '!' ? 'Geändert' : 'Unverändert'))}"></td>
               <td th:utext="${z.artHtml}"></td>
+              <td th:utext="${z.artZusatzHtml}"></td>
               <td th:utext="${z.faktorHtml}"></td>
               <td th:utext="${z.betragHtml}"></td>
               <td th:utext="${z.zuschlagHtml}"></td>