|
|
@@ -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;
|
|
|
+ }
|
|
|
+}
|