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 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); } // --- 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; } }