|
|
@@ -54,7 +54,6 @@ public class VergleichController {
|
|
|
model.addAttribute("rightJson", rightJson);
|
|
|
model.addAttribute("validate", validate);
|
|
|
model.addAttribute("schemaName", schemaName);
|
|
|
- // versuche dennoch Periodenlisten zu füllen (best-effort) optional
|
|
|
return "test";
|
|
|
}
|
|
|
}
|
|
|
@@ -69,6 +68,9 @@ public class VergleichController {
|
|
|
JsonNode stammvorgangJsonNode = findStammvorgangByZeitraumId(right, rightZeitraumId);
|
|
|
StammvorgangInfo stammvorgangRight = createStammvorgangInfo(stammvorgangJsonNode);
|
|
|
|
|
|
+ // --- Extract stammakte info if available ---
|
|
|
+ StammakteInfo stammakteRight = extractStammakteInfo(right);
|
|
|
+
|
|
|
// --- Links (Baseline) Kandidaten & Auswahl ---
|
|
|
List<Vorgang> leftCand = parseLeftCandidates(left);
|
|
|
List<Z> leftZ = List.of();
|
|
|
@@ -108,9 +110,6 @@ public class VergleichController {
|
|
|
List<FreibetragZeile> freibetragZeilen = buildFreibetragZeilen(rightPerson, leftPerson);
|
|
|
List<KitaZeile> kitaZeilen = buildKitaZeilen(rightPerson, leftPerson, personNameByIdRight);
|
|
|
|
|
|
- // Summary aus Status zählen (einfach aus allen Zeilen)
|
|
|
- Summary summary = countSummary(mitgliederRows, einkommenZeilen, freibetragZeilen, kitaZeilen);
|
|
|
-
|
|
|
// --- Model füllen & rendern ---
|
|
|
model.addAttribute("leftJson", leftJson);
|
|
|
model.addAttribute("rightJson", rightJson);
|
|
|
@@ -123,6 +122,7 @@ public class VergleichController {
|
|
|
model.addAttribute("zeitraeumeRight", zeitrechte);
|
|
|
model.addAttribute("rightZeitraumId", rightZeitraumId);
|
|
|
model.addAttribute("stammvorgangRight", stammvorgangRight);
|
|
|
+ model.addAttribute("stammakteRight", stammakteRight);
|
|
|
model.addAttribute("personenRight", personenRight);
|
|
|
model.addAttribute("personId", personId);
|
|
|
model.addAttribute("mitgliederRows", mitgliederRows);
|
|
|
@@ -130,7 +130,6 @@ public class VergleichController {
|
|
|
model.addAttribute("einkommenZeilen", einkommenZeilen);
|
|
|
model.addAttribute("freibetragZeilen", freibetragZeilen);
|
|
|
model.addAttribute("kitaZeilen", kitaZeilen);
|
|
|
- model.addAttribute("summary", summary);
|
|
|
return "vergleich";
|
|
|
}
|
|
|
|
|
|
@@ -139,6 +138,7 @@ public class VergleichController {
|
|
|
public record Vorgang(String id, String aktenzeichen, List<Z> zeitraeume) {}
|
|
|
public record PersonRef(String id, String label) {}
|
|
|
public record StammvorgangInfo(String id, String aktenzeichen, String beginn, String ende, String bemerkung) {}
|
|
|
+ public record StammakteInfo(String aktenzeichen, String antragstellername, String antragstellerGeburtsdatum, String anschrift) {}
|
|
|
public static final class Pair<R, L> {
|
|
|
public final R right;
|
|
|
public final L left;
|
|
|
@@ -163,11 +163,61 @@ public class VergleichController {
|
|
|
return new StammvorgangInfo(id, aktenzeichen, beginn, ende, bemerkung);
|
|
|
}
|
|
|
|
|
|
+ private static StammakteInfo extractStammakteInfo(JsonNode root) {
|
|
|
+ JsonNode stammakte = root.path("stammakte");
|
|
|
+ if (stammakte.isMissingNode()) {
|
|
|
+ return new StammakteInfo("", "", "", "");
|
|
|
+ }
|
|
|
+
|
|
|
+ String aktenzeichen = stammakte.path("aktenzeichen").asText("");
|
|
|
+ String antragstellername = stammakte.path("antragstellername").asText("");
|
|
|
+ String antragstellerGeburtsdatum = stammakte.path("antragstellerGeburtsdatum").asText("");
|
|
|
+
|
|
|
+ JsonNode anschrift = stammakte.path("anschrift");
|
|
|
+ String anschriftStr = "";
|
|
|
+ if (!anschrift.isMissingNode()) {
|
|
|
+ StringBuilder sb = new StringBuilder();
|
|
|
+ String strasse = anschrift.path("strasse").asText("");
|
|
|
+ String hausnummer = anschrift.path("hausnummer").asText("");
|
|
|
+ String zusatz = anschrift.path("zusatz").asText("");
|
|
|
+ String plz = anschrift.path("plz").asText("");
|
|
|
+ String ort = anschrift.path("ort").asText("");
|
|
|
+
|
|
|
+ if (!strasse.isEmpty()) sb.append(strasse);
|
|
|
+ if (!hausnummer.isEmpty()) sb.append(" ").append(hausnummer);
|
|
|
+ if (!zusatz.isEmpty()) sb.append(" ").append(zusatz);
|
|
|
+ if (!plz.isEmpty() || !ort.isEmpty()) {
|
|
|
+ if (sb.length() > 0) sb.append(", ");
|
|
|
+ if (!plz.isEmpty()) sb.append(plz);
|
|
|
+ if (!ort.isEmpty()) sb.append(" ").append(ort);
|
|
|
+ }
|
|
|
+ anschriftStr = sb.toString();
|
|
|
+ }
|
|
|
+
|
|
|
+ return new StammakteInfo(aktenzeichen, antragstellername, antragstellerGeburtsdatum, anschriftStr);
|
|
|
+ }
|
|
|
+
|
|
|
private static List<Z> extractZeitraeume(JsonNode root) {
|
|
|
List<Z> result = new ArrayList<>();
|
|
|
|
|
|
- // Check if this is the new vorgaenge structure
|
|
|
- if (root.has("vorgaenge") && root.get("vorgaenge").isArray()) {
|
|
|
+ // Check if this is the new stammakte structure
|
|
|
+ if (root.has("stammakte")) {
|
|
|
+ JsonNode stammakte = root.get("stammakte");
|
|
|
+ if (stammakte.has("vorgaenge") && stammakte.get("vorgaenge").isArray()) {
|
|
|
+ for (JsonNode vorgang : stammakte.get("vorgaenge")) {
|
|
|
+ if (vorgang.has("zeitraeume") && vorgang.get("zeitraeume").isArray()) {
|
|
|
+ for (JsonNode zeitraum : vorgang.get("zeitraeume")) {
|
|
|
+ String id = zeitraum.path("id").asText("");
|
|
|
+ String beginn = zeitraum.path("beginn").asText("");
|
|
|
+ String ende = zeitraum.path("ende").asText("");
|
|
|
+ result.add(new Z(id, beginn, ende));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // Check if this is the vorgaenge structure
|
|
|
+ else if (root.has("vorgaenge") && root.get("vorgaenge").isArray()) {
|
|
|
// For vorgaenge structure, collect zeitraeume from all vorgaenge
|
|
|
for (JsonNode vorgang : root.get("vorgaenge")) {
|
|
|
if (vorgang.has("zeitraeume") && vorgang.get("zeitraeume").isArray()) {
|
|
|
@@ -193,8 +243,23 @@ public class VergleichController {
|
|
|
}
|
|
|
|
|
|
private static JsonNode findZeitraumById(JsonNode root, String id) {
|
|
|
- // Check if this is the new vorgaenge structure
|
|
|
- if (root.has("vorgaenge") && root.get("vorgaenge").isArray()) {
|
|
|
+ // Check if this is the new stammakte structure
|
|
|
+ if (root.has("stammakte")) {
|
|
|
+ JsonNode stammakte = root.get("stammakte");
|
|
|
+ if (stammakte.has("vorgaenge") && stammakte.get("vorgaenge").isArray()) {
|
|
|
+ for (JsonNode vorgang : stammakte.get("vorgaenge")) {
|
|
|
+ if (vorgang.has("zeitraeume") && vorgang.get("zeitraeume").isArray()) {
|
|
|
+ for (JsonNode zeitraum : vorgang.get("zeitraeume")) {
|
|
|
+ if (id.equals(zeitraum.path("id").asText(""))) {
|
|
|
+ return zeitraum;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // Check if this is the vorgaenge structure
|
|
|
+ else if (root.has("vorgaenge") && root.get("vorgaenge").isArray()) {
|
|
|
// Search in all vorgaenge
|
|
|
for (JsonNode vorgang : root.get("vorgaenge")) {
|
|
|
if (vorgang.has("zeitraeume") && vorgang.get("zeitraeume").isArray()) {
|
|
|
@@ -217,8 +282,23 @@ public class VergleichController {
|
|
|
}
|
|
|
|
|
|
private static JsonNode findStammvorgangByZeitraumId(JsonNode root, String zeitraumId) {
|
|
|
- // Check if this is the new vorgaenge structure
|
|
|
- if (root.has("vorgaenge") && root.get("vorgaenge").isArray()) {
|
|
|
+ // Check if this is the new stammakte structure
|
|
|
+ if (root.has("stammakte")) {
|
|
|
+ JsonNode stammakte = root.get("stammakte");
|
|
|
+ if (stammakte.has("vorgaenge") && stammakte.get("vorgaenge").isArray()) {
|
|
|
+ for (JsonNode vorgang : stammakte.get("vorgaenge")) {
|
|
|
+ if (vorgang.has("zeitraeume") && vorgang.get("zeitraeume").isArray()) {
|
|
|
+ for (JsonNode zeitraum : vorgang.get("zeitraeume")) {
|
|
|
+ if (zeitraumId.equals(zeitraum.path("id").asText(""))) {
|
|
|
+ return vorgang.path("stammvorgang");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // Check if this is the vorgaenge structure
|
|
|
+ else if (root.has("vorgaenge") && root.get("vorgaenge").isArray()) {
|
|
|
// Search in all vorgaenge for the one containing this zeitraum
|
|
|
for (JsonNode vorgang : root.get("vorgaenge")) {
|
|
|
if (vorgang.has("zeitraeume") && vorgang.get("zeitraeume").isArray()) {
|
|
|
@@ -239,13 +319,28 @@ public class VergleichController {
|
|
|
private static List<Vorgang> parseLeftCandidates(JsonNode left) {
|
|
|
List<Vorgang> result = new ArrayList<>();
|
|
|
|
|
|
- if (left.has("vorgaenge") && left.get("vorgaenge").isArray()) {
|
|
|
+ // Check if this is the new stammakte structure
|
|
|
+ if (left.has("stammakte")) {
|
|
|
+ JsonNode stammakte = left.get("stammakte");
|
|
|
+ if (stammakte.has("vorgaenge") && stammakte.get("vorgaenge").isArray()) {
|
|
|
+ for (JsonNode v : stammakte.get("vorgaenge")) {
|
|
|
+ JsonNode stammvorgang = v.path("stammvorgang");
|
|
|
+ String id = stammvorgang.path("id").asText("");
|
|
|
+ String aktenzeichen = stammvorgang.path("aktenzeichen").asText("");
|
|
|
+ List<Z> zeitraeume = extractZeitraeume(JsonNodeFactory.instance.objectNode().set("vorgaenge",
|
|
|
+ JsonNodeFactory.instance.arrayNode().add(v)));
|
|
|
+ result.add(new Vorgang(id, aktenzeichen, zeitraeume));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if (left.has("vorgaenge") && left.get("vorgaenge").isArray()) {
|
|
|
// a) wenn left.vorgaenge Array
|
|
|
for (JsonNode v : left.get("vorgaenge")) {
|
|
|
JsonNode stammvorgang = v.path("stammvorgang");
|
|
|
String id = stammvorgang.path("id").asText("");
|
|
|
String aktenzeichen = stammvorgang.path("aktenzeichen").asText("");
|
|
|
- List<Z> zeitraeume = extractZeitraeume(v);
|
|
|
+ List<Z> zeitraeume = extractZeitraeume(JsonNodeFactory.instance.objectNode().set("vorgaenge",
|
|
|
+ JsonNodeFactory.instance.arrayNode().add(v)));
|
|
|
result.add(new Vorgang(id, aktenzeichen, zeitraeume));
|
|
|
}
|
|
|
} else {
|
|
|
@@ -261,7 +356,18 @@ public class VergleichController {
|
|
|
}
|
|
|
|
|
|
private static JsonNode getRootOfVorgang(JsonNode left, String vorgangId) {
|
|
|
- if (left.has("vorgaenge") && left.get("vorgaenge").isArray()) {
|
|
|
+ // Check if this is the new stammakte structure
|
|
|
+ if (left.has("stammakte")) {
|
|
|
+ JsonNode stammakte = left.get("stammakte");
|
|
|
+ if (stammakte.has("vorgaenge") && stammakte.get("vorgaenge").isArray()) {
|
|
|
+ for (JsonNode v : stammakte.get("vorgaenge")) {
|
|
|
+ if (vorgangId.equals(v.path("stammvorgang").path("id").asText(""))) {
|
|
|
+ return v;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if (left.has("vorgaenge") && left.get("vorgaenge").isArray()) {
|
|
|
for (JsonNode v : left.get("vorgaenge")) {
|
|
|
if (vorgangId.equals(v.path("stammvorgang").path("id").asText(""))) {
|
|
|
return v;
|
|
|
@@ -762,41 +868,6 @@ public class VergleichController {
|
|
|
return escape(rightVal);
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
- private static Summary countSummary(List<MitgliedRow> m, List<EinkommenZeile> e, List<FreibetragZeile> f, List<KitaZeile> k) {
|
|
|
- int added = 0, removed = 0, changed = 0, typeMismatch = 0;
|
|
|
-
|
|
|
- // Count MitgliedRow changes
|
|
|
- for (MitgliedRow row : m) {
|
|
|
- if ("plus".equals(row.symbolClass())) added++;
|
|
|
- else if ("minus".equals(row.symbolClass())) removed++;
|
|
|
- else if ("warn".equals(row.symbolClass())) changed++;
|
|
|
- }
|
|
|
-
|
|
|
- // Count EinkommenZeile changes
|
|
|
- for (EinkommenZeile row : e) {
|
|
|
- if ("plus".equals(row.symbolClass())) added++;
|
|
|
- else if ("minus".equals(row.symbolClass())) removed++;
|
|
|
- else if ("warn".equals(row.symbolClass())) changed++;
|
|
|
- }
|
|
|
-
|
|
|
- // Count FreibetragZeile changes
|
|
|
- for (FreibetragZeile row : f) {
|
|
|
- if ("plus".equals(row.symbolClass())) added++;
|
|
|
- else if ("minus".equals(row.symbolClass())) removed++;
|
|
|
- else if ("warn".equals(row.symbolClass())) changed++;
|
|
|
- }
|
|
|
-
|
|
|
- // Count KitaZeile changes
|
|
|
- for (KitaZeile row : k) {
|
|
|
- if ("plus".equals(row.symbolClass())) added++;
|
|
|
- else if ("minus".equals(row.symbolClass())) removed++;
|
|
|
- else if ("warn".equals(row.symbolClass())) changed++;
|
|
|
- }
|
|
|
-
|
|
|
- int total = added + removed + changed + typeMismatch;
|
|
|
- return new Summary(added, removed, changed, typeMismatch, total);
|
|
|
- }
|
|
|
|
|
|
// Hilfs-Bausteine für Status und Zellen:
|
|
|
private static String symFor(String status) {
|