Quellcode durchsuchen

Meiteseite angelegt

Leonard Schulz vor 1 Jahr
Ursprung
Commit
21def41a1e

+ 0 - 1
src/main/java/com/tsystems/inwo/vgl/web/HhmEinkommenController.java

@@ -9,7 +9,6 @@ import org.springframework.ui.Model;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.http.ResponseEntity;
 import java.util.*;
-import java.util.stream.Collectors;
 
 @Controller
 @RequestMapping("/hhm-einkommen")

+ 113 - 0
src/main/java/com/tsystems/inwo/vgl/web/MieteController.java

@@ -0,0 +1,113 @@
+package com.tsystems.inwo.vgl.web;
+
+import com.fasterxml.jackson.databind.*;
+import com.tsystems.inwo.vgl.service.*;
+import com.tsystems.inwo.vgl.view.*;
+import com.tsystems.inwo.vgl.view.SharedRecords.*;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.http.ResponseEntity;
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Controller
+@RequestMapping("/miete")
+public class MieteController {
+    private final ObjectMapper om;
+    private final SchemaValidationService validator;
+    private final JsonNavigationService jsonNavigationService;
+    private final DataComparisonService comparisonService;
+    private final VergleichDataExtractor dataExtractor;
+    
+    public MieteController(ObjectMapper om, SchemaValidationService validator, 
+                          JsonNavigationService jsonNavigationService,
+                          DataComparisonService comparisonService,
+                          VergleichDataExtractor dataExtractor) {
+        this.om = om;
+        this.validator = validator;
+        this.jsonNavigationService = jsonNavigationService;
+        this.comparisonService = comparisonService;
+        this.dataExtractor = dataExtractor;
+    }
+
+    @PostMapping
+    public String vergleich(
+            @RequestParam String leftJson,
+            @RequestParam String rightJson,
+            @RequestParam(required = false, defaultValue = "true") boolean validate,
+            @RequestParam(required = false, defaultValue = "miete") String schemaName,
+            @RequestParam(required = false) String leftVorgangId,
+            @RequestParam(required = false) String leftZeitraumId,
+            @RequestParam(required = false) String rightZeitraumId,
+            @RequestParam(required = false) String kunde,
+            @RequestHeader(value = "X-Kunde", required = false) String kundeHeader,
+            Model model) throws Exception {
+
+        String activeKunde = resolveActiveKunde(kunde, kundeHeader);
+
+        JsonNode left = om.readTree(leftJson);
+        JsonNode right = om.readTree(rightJson);
+
+        if (validate) {
+            List<String> err = new ArrayList<>();
+            err.addAll(validator.validate(left, schemaName));
+            err.addAll(validator.validate(right, schemaName));
+            if (!err.isEmpty()) {
+                model.addAttribute("schemaErrors", err);
+                model.addAttribute("leftJson", leftJson);
+                model.addAttribute("rightJson", rightJson);
+                model.addAttribute("validate", validate);
+                model.addAttribute("schemaName", schemaName);
+                return "test";
+            }
+        }
+
+        // --- Rechts (Master) Zeitraum wählen ---
+        List<Z> zeitrechte = jsonNavigationService.extractZeitraeume(right);
+        if (zeitrechte.isEmpty()) throw new IllegalArgumentException("Right JSON hat keine Zeiträume");
+        if (rightZeitraumId == null) rightZeitraumId = zeitrechte.get(0).id();
+        JsonNode rightZeitraum = jsonNavigationService.findZeitraumById(right, rightZeitraumId);
+
+        // --- Find the stammvorgang that contains the selected zeitraum ---
+        JsonNode stammvorgangJsonNode = jsonNavigationService.findStammvorgangByZeitraumId(right, rightZeitraumId);
+        StammvorgangInfo stammvorgangRight = jsonNavigationService.createStammvorgangInfo(stammvorgangJsonNode);
+
+        // --- Extract stammakte info if available ---
+        StammakteInfo stammakteRight = jsonNavigationService.extractStammakteInfo(right);
+
+        // --- Links (Baseline) Kandidaten & Auswahl ---
+        List<Vorgang> leftCand = jsonNavigationService.parseLeftCandidates(left);
+        List<Z> leftZ = List.of();
+        JsonNode leftZeitraum = null;
+        if (!leftCand.isEmpty()) {
+            if (leftVorgangId == null) leftVorgangId = leftCand.get(0).id();
+            final String finalLeftVorgangId = leftVorgangId;
+            leftZ = leftCand.stream().filter(v -> v.id().equals(finalLeftVorgangId)).findFirst().orElse(leftCand.get(0)).zeitraeume();
+            if (leftZeitraumId == null && !leftZ.isEmpty()) leftZeitraumId = leftZ.get(0).id();
+            if (leftZeitraumId != null) leftZeitraum = jsonNavigationService.findZeitraumById(jsonNavigationService.getRootOfVorgang(left, leftVorgangId), leftZeitraumId);
+        }
+
+        // --- Model füllen & rendern ---
+        model.addAttribute("leftJson", leftJson);
+        model.addAttribute("rightJson", rightJson);
+        model.addAttribute("validate", validate);
+        model.addAttribute("schemaName", schemaName);
+        model.addAttribute("leftCandidates", leftCand);
+        model.addAttribute("leftZeitraeumeOfSelected", leftZ);
+        model.addAttribute("leftVorgangId", leftVorgangId);
+        model.addAttribute("leftZeitraumId", leftZeitraumId);
+        model.addAttribute("zeitraeumeRight", zeitrechte);
+        model.addAttribute("rightZeitraumId", rightZeitraumId);
+        model.addAttribute("stammvorgangRight", stammvorgangRight);
+        model.addAttribute("stammakteRight", stammakteRight);
+        model.addAttribute("activeKunde", activeKunde);
+        return "miete";
+    }
+
+    // ===== Private Helper Methods =====
+    
+    private String resolveActiveKunde(String kunde, String kundeHeader) {
+        return kunde != null ? kunde : kundeHeader;
+    }
+}

+ 1 - 7
src/main/java/com/tsystems/inwo/vgl/web/VergleichController.java → src/main/java/com/tsystems/inwo/vgl/web/TestController.java

@@ -1,17 +1,11 @@
 package com.tsystems.inwo.vgl.web;
 
-import com.fasterxml.jackson.databind.*;
-import com.tsystems.inwo.vgl.service.*;
-import com.tsystems.inwo.vgl.view.*;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.Model;
 import org.springframework.web.bind.annotation.*;
-import org.springframework.http.ResponseEntity;
-import java.util.*;
-import java.util.stream.Collectors;
 
 @Controller
-public class VergleichController {
+public class TestController {
 
     @GetMapping("/test")
     public String test(

+ 99 - 0
src/main/resources/static/example-miete-alt.json

@@ -0,0 +1,99 @@
+{
+  "stammakte": {
+    "aktenzeichen": "12345/2023",
+    "antragstellername": "Müller, Hans",
+    "antragstellerGeburtsdatum": "1980-05-15",
+    "anschrift": {
+      "strasse": "Musterstraße",
+      "hausnummer": "123",
+      "plz": "10115",
+      "ort": "Berlin"
+    },
+    "vorgaenge": [
+      {
+        "stammvorgang": {
+          "id": "vorgang-1",
+          "vorgangstyp": "Erstantrag",
+          "vorgangsstatus": "Bewilligt"
+        },
+        "zeitraeume": [
+          {
+            "id": "zeitraum-1",
+            "beginn": "2023-01-01",
+            "ende": "2023-12-31",
+            "miete": {
+              "id": "miete-1",
+              "miete": 650.00,
+              "mieteAlt": 600.00,
+              "heizung": 120.00,
+              "heizungP": "Fernwärme",
+              "warmwasser": 45.00,
+              "warmwasserP": "zentral",
+              "moeblierung": 0.00,
+              "sonstZuschlag": 25.00,
+              "sonstZuschlagBeschr": "Hausmeisterservice",
+              "beitragDritter": 0.00,
+              "energie": 80.00,
+              "energieP": "Strom",
+              "stellplatz": 0.00,
+              "untermieter": [
+                {
+                  "miId": "miete-1",
+                  "lfdnr": 1,
+                  "name": "Schmidt",
+                  "vorname": "Anna",
+                  "flaeche": 20.0,
+                  "miete": 200.00,
+                  "heizung": 30.00,
+                  "heizungP": "anteilig",
+                  "warmwasser": 15.00,
+                  "warmwasserP": "anteilig",
+                  "moeblierung": 0.00,
+                  "sonst": 10.00
+                }
+              ],
+              "mitbewohner": [
+                {
+                  "miId": "miete-1",
+                  "lfdnr": 1,
+                  "name": "Weber",
+                  "vorname": "Klaus",
+                  "entgelt": 150.00,
+                  "heizung": 20.00,
+                  "heizungP": "anteilig",
+                  "warmwasser": 10.00,
+                  "warmwasserP": "anteilig",
+                  "sonst": 5.00
+                }
+              ]
+            }
+          },
+          {
+            "id": "zeitraum-2",
+            "beginn": "2024-01-01",
+            "ende": "2024-06-30",
+            "miete": {
+              "id": "miete-2",
+              "miete": 675.00,
+              "mieteAlt": 650.00,
+              "heizung": 130.00,
+              "heizungP": "Fernwärme",
+              "warmwasser": 50.00,
+              "warmwasserP": "zentral",
+              "moeblierung": 0.00,
+              "sonstZuschlag": 30.00,
+              "sonstZuschlagBeschr": "Hausmeisterservice + Reinigung",
+              "beitragDritter": 0.00,
+              "energie": 85.00,
+              "energieP": "Strom",
+              "stellplatz": 25.00,
+              "stellplatzP": "Tiefgarage",
+              "untermieter": [],
+              "mitbewohner": []
+            }
+          }
+        ]
+      }
+    ]
+  }
+}

+ 162 - 0
src/main/resources/static/example-miete-neu.json

@@ -0,0 +1,162 @@
+{
+  "stammakte": {
+    "aktenzeichen": "12345/2023",
+    "antragstellername": "Müller, Hans",
+    "antragstellerGeburtsdatum": "1980-05-15",
+    "anschrift": {
+      "strasse": "Musterstraße",
+      "hausnummer": "123",
+      "zusatz": "2. OG",
+      "plz": "10115",
+      "ort": "Berlin"
+    },
+    "vorgaenge": [
+      {
+        "stammvorgang": {
+          "id": "vorgang-1",
+          "vorgangstyp": "Weiterbewilligung",
+          "vorgangsstatus": "Bewilligt"
+        },
+        "zeitraeume": [
+          {
+            "id": "zeitraum-1",
+            "beginn": "2023-01-01",
+            "ende": "2023-12-31",
+            "miete": {
+              "id": "miete-1",
+              "miete": 680.00,
+              "mieteAlt": 650.00,
+              "heizung": 135.00,
+              "heizungP": "Fernwärme",
+              "warmwasser": 55.00,
+              "warmwasserP": "zentral",
+              "moeblierung": 50.00,
+              "moeblierungP": "Küche möbliert",
+              "sonstZuschlag": 35.00,
+              "sonstZuschlagBeschr": "Hausmeisterservice + Garten",
+              "beitragDritter": 100.00,
+              "energie": 90.00,
+              "energieP": "Strom + Gas",
+              "stellplatz": 30.00,
+              "stellplatzP": "Außenstellplatz",
+              "gewerbeZuschlag": 0.00,
+              "umietZuschlag": 0.00,
+              "untermieter": [
+                {
+                  "miId": "miete-1",
+                  "lfdnr": 1,
+                  "name": "Schmidt",
+                  "vorname": "Anna",
+                  "flaeche": 25.0,
+                  "miete": 250.00,
+                  "heizung": 40.00,
+                  "heizungP": "anteilig",
+                  "warmwasser": 20.00,
+                  "warmwasserP": "anteilig",
+                  "moeblierung": 20.00,
+                  "moeblierungP": "Möbel",
+                  "sonst": 15.00
+                },
+                {
+                  "miId": "miete-1",
+                  "lfdnr": 2,
+                  "name": "Neumann",
+                  "vorname": "Peter",
+                  "flaeche": 15.0,
+                  "miete": 180.00,
+                  "heizung": 25.00,
+                  "heizungP": "anteilig",
+                  "warmwasser": 12.00,
+                  "warmwasserP": "anteilig",
+                  "moeblierung": 0.00,
+                  "sonst": 8.00
+                }
+              ],
+              "mitbewohner": [
+                {
+                  "miId": "miete-1",
+                  "lfdnr": 1,
+                  "name": "Weber",
+                  "vorname": "Klaus",
+                  "entgelt": 180.00,
+                  "heizung": 25.00,
+                  "heizungP": "anteilig",
+                  "warmwasser": 15.00,
+                  "warmwasserP": "anteilig",
+                  "sonst": 10.00
+                }
+              ]
+            }
+          },
+          {
+            "id": "zeitraum-2",
+            "beginn": "2024-01-01",
+            "ende": "2024-06-30",
+            "miete": {
+              "id": "miete-2",
+              "miete": 720.00,
+              "mieteAlt": 680.00,
+              "heizung": 145.00,
+              "heizungP": "Fernwärme",
+              "warmwasser": 60.00,
+              "warmwasserP": "zentral",
+              "moeblierung": 75.00,
+              "moeblierungP": "Vollmöbliert",
+              "sonstZuschlag": 40.00,
+              "sonstZuschlagBeschr": "Hausmeisterservice + Garten + Internet",
+              "beitragDritter": 150.00,
+              "energie": 95.00,
+              "energieP": "Strom + Gas",
+              "stellplatz": 35.00,
+              "stellplatzP": "Tiefgarage",
+              "gewerbeZuschlag": 50.00,
+              "gewerbeZuschlagP": "Büronutzung",
+              "gewerbeFlaeche": 10.0,
+              "umietZuschlag": 25.00,
+              "untermieter": [],
+              "mitbewohner": [
+                {
+                  "miId": "miete-2",
+                  "lfdnr": 1,
+                  "name": "Fischer",
+                  "vorname": "Maria",
+                  "entgelt": 200.00,
+                  "heizung": 30.00,
+                  "heizungP": "anteilig",
+                  "warmwasser": 18.00,
+                  "warmwasserP": "anteilig",
+                  "sonst": 12.00
+                }
+              ]
+            }
+          },
+          {
+            "id": "zeitraum-3",
+            "beginn": "2024-07-01",
+            "ende": "2024-12-31",
+            "miete": {
+              "id": "miete-3",
+              "miete": 750.00,
+              "mieteAlt": 720.00,
+              "heizung": 150.00,
+              "heizungP": "Fernwärme",
+              "warmwasser": 65.00,
+              "warmwasserP": "zentral",
+              "moeblierung": 100.00,
+              "moeblierungP": "Vollmöbliert + Elektrogeräte",
+              "sonstZuschlag": 45.00,
+              "sonstZuschlagBeschr": "Vollservice",
+              "beitragDritter": 200.00,
+              "energie": 100.00,
+              "energieP": "Ökostrom + Gas",
+              "stellplatz": 40.00,
+              "stellplatzP": "Tiefgarage mit E-Ladesäule",
+              "untermieter": [],
+              "mitbewohner": []
+            }
+          }
+        ]
+      }
+    ]
+  }
+}

+ 75 - 0
src/main/resources/templates/miete.html

@@ -0,0 +1,75 @@
+<!DOCTYPE html>
+<html lang="de" xmlns:th="http://www.thymeleaf.org">
+<head>
+    <meta charset="UTF-8"/>
+    <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
+    <title>DIWO Vergleich – Miete</title>
+    <link rel="stylesheet" href="/styles.css"/>
+    <!-- JavaScript Module -->
+    <script src="/js/cookie-utils.js"></script>
+    <script src="/js/ajax-handlers.js"></script>
+    <script src="/js/ui-updater.js"></script>
+    <script src="/js/interactions.js"></script>
+    <script src="/js/color-scheme.js"></script>
+    <script src="/js/app.js"></script>
+</head>
+<body>
+
+  <!-- Header-Fragment einbinden -->
+  <div th:replace="~{fragments/header :: header}"></div>
+
+  <!-- Vergleichslegende-Fragment einbinden -->
+  <div th:replace="~{fragments/legend :: legend}"></div>
+
+  <!-- Miete Hauptinhalt -->
+  <main role="main">
+    <div class="section-container">
+      <div class="section-header" onclick="toggleSection('miete')" role="button" tabindex="0" 
+           onkeypress="handleKeyPress(event, 'miete')" aria-expanded="true" aria-controls="miete-content">
+        <span class="toggle-icon" id="miete-icon" aria-hidden="true">▼</span>
+        <h3>Mietdaten</h3>
+      </div>
+      <div class="section-content" id="miete-content">
+        <!-- Hier werden später die Mietdaten angezeigt -->
+        <p>Mietvergleich wird hier angezeigt.</p>
+        
+        <!-- Debug-Information für JSON-Daten -->
+        <div th:if="${leftJson != null}" style="margin-top: 20px; padding: 10px; background-color: #f5f5f5; border-radius: 5px;">
+          <h4>Erhaltene Daten:</h4>
+          <p><strong>Left JSON erhalten:</strong> <span th:text="${#strings.length(leftJson)}"></span> Zeichen</p>
+          <p><strong>Right JSON erhalten:</strong> <span th:text="${#strings.length(rightJson)}"></span> Zeichen</p>
+          <p><strong>Schema:</strong> <span th:text="${schemaName}"></span></p>
+          <p><strong>Validation:</strong> <span th:text="${validate}"></span></p>
+          <p><strong>Aktiver Kunde:</strong> <span th:text="${activeKunde}"></span></p>
+          
+          <div th:if="${leftCandidates != null and !leftCandidates.empty}">
+            <p><strong>Left Candidates:</strong> <span th:text="${#lists.size(leftCandidates)}"></span></p>
+          </div>
+          
+          <div th:if="${zeitraeumeRight != null and !zeitraeumeRight.empty}">
+            <p><strong>Right Zeiträume:</strong> <span th:text="${#lists.size(zeitraeumeRight)}"></span></p>
+          </div>
+          
+          <div th:if="${stammvorgangRight != null}">
+            <p><strong>Stammvorgang Right ID:</strong> <span th:text="${stammvorgangRight.id()}"></span></p>
+          </div>
+          
+          <div th:if="${stammakteRight != null}">
+            <p><strong>Stammakte Right:</strong> <span th:text="${stammakteRight.aktenzeichen()}"></span></p>
+          </div>
+        </div>
+      </div>
+    </div>
+
+    <!-- Hidden data for AJAX requests -->
+    <div id="ajax-data" style="display: none;" aria-hidden="true">
+      <input type="hidden" id="leftJson" th:value="${leftJson}"/>
+      <input type="hidden" id="rightJson" th:value="${rightJson}"/>
+      <input type="hidden" id="leftVorgangId" th:value="${leftVorgangId}"/>
+      <input type="hidden" id="leftZeitraumId" th:value="${leftZeitraumId}"/>
+      <input type="hidden" id="rightZeitraumId" th:value="${rightZeitraumId}"/>
+    </div>
+  </main>
+
+</body>
+</html>

+ 52 - 5
src/main/resources/templates/test.html

@@ -5,6 +5,12 @@
   <h1>Vergleich – Testseite</h1>
   
   <div class="row" style="margin-bottom: 1rem;">
+    <label>Schema auswählen: 
+      <select id="schemaSelect" onchange="updateSchema()">
+        <option value="haushalt-einkommen">Haushalt/Einkommen</option>
+        <option value="miete">Miete</option>
+      </select>
+    </label>
     <button type="button" onclick="loadExamples()">📄 Beispiel-JSONs laden</button>
     <button type="button" onclick="clearTextareas()">🗑️ Leeren</button>
   </div>
@@ -14,12 +20,12 @@
     <ul><li th:each="e : ${schemaErrors}" th:text="${e}"></li></ul>
   </div>
 
-  <form method="post" action="/hhm-einkommen" class="grid-2">
+  <form method="post" id="mainForm" action="/hhm-einkommen" class="grid-2">
     <div><label>Left JSON (Basis/Alt)</label><textarea id="leftJson" name="leftJson" th:text="${leftJson}" rows="20"></textarea></div>
     <div><label>Right JSON (Neu/Wahrheit)</label><textarea id="rightJson" name="rightJson" th:text="${rightJson}" rows="20"></textarea></div>
     <div class="full row">
       <label><input type="checkbox" name="validate" th:checked="${validate ?: true}"> Gegen Schema validieren</label>
-      <label>Schema-Name: <input type="text" name="schemaName" th:value="${schemaName ?: 'haushalt-einkommen'}"></label>
+      <label>Schema-Name: <input type="text" id="schemaNameInput" name="schemaName" th:value="${schemaName ?: 'haushalt-einkommen'}"></label>
       <label>Kunde/Bundesland: 
         <select name="kunde">
           <option value="">-- Kein Logo --</option>
@@ -66,21 +72,53 @@
   </div>
 
   <script>
+    function updateSchema() {
+      const schemaSelect = document.getElementById('schemaSelect');
+      const schemaNameInput = document.getElementById('schemaNameInput');
+      const mainForm = document.getElementById('mainForm');
+      
+      const selectedSchema = schemaSelect.value;
+      schemaNameInput.value = selectedSchema;
+      
+      // Form-Action je nach Schema anpassen
+      if (selectedSchema === 'miete') {
+        mainForm.action = '/miete';
+      } else {
+        mainForm.action = '/hhm-einkommen';
+      }
+      
+      // Automatisch Beispieldaten laden
+      loadExamples();
+    }
+    
     async function loadExamples() {
       try {
+        const schemaSelect = document.getElementById('schemaSelect');
+        const selectedSchema = schemaSelect.value;
+        
+        let altFile, neuFile;
+        
+        if (selectedSchema === 'miete') {
+          altFile = '/example-miete-alt.json';
+          neuFile = '/example-miete-neu.json';
+        } else {
+          altFile = '/example-alt.json';
+          neuFile = '/example-neu.json';
+        }
+        
         // Lade Alt-Beispiel
-        const altResponse = await fetch('/example-alt.json');
+        const altResponse = await fetch(altFile);
         const altJson = await altResponse.json();
         
         // Lade Neu-Beispiel
-        const neuResponse = await fetch('/example-neu.json');
+        const neuResponse = await fetch(neuFile);
         const neuJson = await neuResponse.json();
         
         // Fülle Textareas mit formatierten JSONs
         document.getElementById('leftJson').value = JSON.stringify(altJson, null, 2);
         document.getElementById('rightJson').value = JSON.stringify(neuJson, null, 2);
         
-        console.log('Beispiel-JSONs erfolgreich geladen');
+        console.log('Beispiel-JSONs für Schema "' + selectedSchema + '" erfolgreich geladen');
       } catch (error) {
         console.error('Fehler beim Laden der Beispiel-JSONs:', error);
         alert('Fehler beim Laden der Beispiel-JSONs: ' + error.message);
@@ -97,6 +135,15 @@
       const leftJson = document.getElementById('leftJson');
       const rightJson = document.getElementById('rightJson');
       
+      // Schema-Wert aus Input übernehmen falls vorhanden
+      const schemaNameInput = document.getElementById('schemaNameInput');
+      const schemaSelect = document.getElementById('schemaSelect');
+      
+      if (schemaNameInput.value) {
+        schemaSelect.value = schemaNameInput.value;
+        updateSchema();
+      }
+      
       if (!leftJson.value.trim() && !rightJson.value.trim()) {
         loadExamples();
       }