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.*; @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 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 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 leftCand = jsonNavigationService.parseLeftCandidates(left); List 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); } // --- Wohnungsvergleich --- WohnungZeile wohnungZeile = dataExtractor.buildWohnungZeile(rightZeitraum, leftZeitraum); // --- Mietedaten --- MieteZeile mieteZeile = dataExtractor.buildMieteZeile(rightZeitraum, leftZeitraum); // --- Untermieter und Mitbewohner --- List untermieterZeilen = dataExtractor.buildUntermieterZeilen(rightZeitraum, leftZeitraum); List mitbewohnerZeilen = dataExtractor.buildMitbewohnerZeilen(rightZeitraum, leftZeitraum); // --- 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("wohnungZeile", wohnungZeile); model.addAttribute("mieteZeile", mieteZeile); model.addAttribute("untermieterZeilen", untermieterZeilen); model.addAttribute("mitbewohnerZeilen", mitbewohnerZeilen); model.addAttribute("activeKunde", activeKunde); model.addAttribute("pageTitle", "Miete-/Wohnungsdaten"); return "miete"; } @PostMapping("/api/vorgang-change") @ResponseBody public ResponseEntity changeLeftVorgang( @RequestParam String leftJson, @RequestParam String rightJson, @RequestParam String rightZeitraumId, @RequestParam String newLeftVorgangId) throws Exception { JsonNode left = om.readTree(leftJson); JsonNode right = om.readTree(rightJson); // --- Links (Baseline) Kandidaten & neue Auswahl --- List leftCand = jsonNavigationService.parseLeftCandidates(left); final String finalLeftVorgangId = newLeftVorgangId; List leftZ = leftCand.stream() .filter(v -> v.id().equals(finalLeftVorgangId)) .findFirst() .orElse(leftCand.get(0)) .zeitraeume(); // Ersten Zeitraum des neuen Vorgangs als Default wählen String newLeftZeitraumId = !leftZ.isEmpty() ? leftZ.get(0).id() : null; JsonNode rightZeitraum = jsonNavigationService.findZeitraumById(right, rightZeitraumId); JsonNode leftZeitraum = null; if (newLeftZeitraumId != null) { leftZeitraum = jsonNavigationService.findZeitraumById(jsonNavigationService.getRootOfVorgang(left, newLeftVorgangId), newLeftZeitraumId); } // --- Wohnungsvergleich --- WohnungZeile wohnungZeile = dataExtractor.buildWohnungZeile(rightZeitraum, leftZeitraum); // --- Mietedaten --- MieteZeile mieteZeile = dataExtractor.buildMieteZeile(rightZeitraum, leftZeitraum); // --- Untermieter und Mitbewohner --- List untermieterZeilen = dataExtractor.buildUntermieterZeilen(rightZeitraum, leftZeitraum); List mitbewohnerZeilen = dataExtractor.buildMitbewohnerZeilen(rightZeitraum, leftZeitraum); VorgangChangeResponse response = new VorgangChangeResponse( newLeftVorgangId, newLeftZeitraumId, leftZ, wohnungZeile, mieteZeile, untermieterZeilen, mitbewohnerZeilen ); return ResponseEntity.ok(response); } @PostMapping("/api/zeitraum-change") @ResponseBody public ResponseEntity changeLeftZeitraum( @RequestParam String leftJson, @RequestParam String rightJson, @RequestParam String leftVorgangId, @RequestParam String rightZeitraumId, @RequestParam String newLeftZeitraumId) throws Exception { JsonNode left = om.readTree(leftJson); JsonNode right = om.readTree(rightJson); JsonNode rightZeitraum = jsonNavigationService.findZeitraumById(right, rightZeitraumId); JsonNode leftZeitraum = null; if (newLeftZeitraumId != null) { leftZeitraum = jsonNavigationService.findZeitraumById(jsonNavigationService.getRootOfVorgang(left, leftVorgangId), newLeftZeitraumId); } // --- Wohnungsvergleich --- WohnungZeile wohnungZeile = dataExtractor.buildWohnungZeile(rightZeitraum, leftZeitraum); // --- Mietedaten --- MieteZeile mieteZeile = dataExtractor.buildMieteZeile(rightZeitraum, leftZeitraum); // --- Untermieter und Mitbewohner --- List untermieterZeilen = dataExtractor.buildUntermieterZeilen(rightZeitraum, leftZeitraum); List mitbewohnerZeilen = dataExtractor.buildMitbewohnerZeilen(rightZeitraum, leftZeitraum); ZeitraumChangeResponse response = new ZeitraumChangeResponse( newLeftZeitraumId, wohnungZeile, mieteZeile, untermieterZeilen, mitbewohnerZeilen ); return ResponseEntity.ok(response); } // ===== Private Helper Methods ===== private String resolveActiveKunde(String kunde, String kundeHeader) { return kunde != null ? kunde : kundeHeader; } // ===== Response Classes ===== public record VorgangChangeResponse( String newLeftVorgangId, String newLeftZeitraumId, List leftZeitraeumeOfSelected, WohnungZeile wohnungZeile, MieteZeile mieteZeile, List untermieterZeilen, List mitbewohnerZeilen ) {} public record ZeitraumChangeResponse( String newLeftZeitraumId, WohnungZeile wohnungZeile, MieteZeile mieteZeile, List untermieterZeilen, List mitbewohnerZeilen ) {} }