MieteController.java 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. package com.tsystems.inwo.vgl.web;
  2. import com.fasterxml.jackson.databind.*;
  3. import com.tsystems.inwo.vgl.service.*;
  4. import com.tsystems.inwo.vgl.view.*;
  5. import com.tsystems.inwo.vgl.view.SharedRecords.*;
  6. import org.springframework.stereotype.Controller;
  7. import org.springframework.ui.Model;
  8. import org.springframework.web.bind.annotation.*;
  9. import org.springframework.http.ResponseEntity;
  10. import java.util.*;
  11. @Controller
  12. @RequestMapping("/miete")
  13. public class MieteController {
  14. private final ObjectMapper om;
  15. private final SchemaValidationService validator;
  16. private final JsonNavigationService jsonNavigationService;
  17. private final DataComparisonService comparisonService;
  18. private final VergleichDataExtractor dataExtractor;
  19. public MieteController(ObjectMapper om, SchemaValidationService validator,
  20. JsonNavigationService jsonNavigationService,
  21. DataComparisonService comparisonService,
  22. VergleichDataExtractor dataExtractor) {
  23. this.om = om;
  24. this.validator = validator;
  25. this.jsonNavigationService = jsonNavigationService;
  26. this.comparisonService = comparisonService;
  27. this.dataExtractor = dataExtractor;
  28. }
  29. @PostMapping
  30. public String vergleich(
  31. @RequestParam String leftJson,
  32. @RequestParam String rightJson,
  33. @RequestParam(required = false, defaultValue = "true") boolean validate,
  34. @RequestParam(required = false, defaultValue = "miete") String schemaName,
  35. @RequestParam(required = false) String leftVorgangId,
  36. @RequestParam(required = false) String leftZeitraumId,
  37. @RequestParam(required = false) String rightZeitraumId,
  38. @RequestParam(required = false) String kunde,
  39. @RequestHeader(value = "X-Kunde", required = false) String kundeHeader,
  40. Model model) throws Exception {
  41. String activeKunde = resolveActiveKunde(kunde, kundeHeader);
  42. JsonNode left = om.readTree(leftJson);
  43. JsonNode right = om.readTree(rightJson);
  44. if (validate) {
  45. List<String> err = new ArrayList<>();
  46. err.addAll(validator.validate(left, schemaName));
  47. err.addAll(validator.validate(right, schemaName));
  48. if (!err.isEmpty()) {
  49. model.addAttribute("schemaErrors", err);
  50. model.addAttribute("leftJson", leftJson);
  51. model.addAttribute("rightJson", rightJson);
  52. model.addAttribute("validate", validate);
  53. model.addAttribute("schemaName", schemaName);
  54. return "test";
  55. }
  56. }
  57. // --- Rechts (Master) Zeitraum wählen ---
  58. List<Z> zeitrechte = jsonNavigationService.extractZeitraeume(right);
  59. if (zeitrechte.isEmpty()) throw new IllegalArgumentException("Right JSON hat keine Zeiträume");
  60. if (rightZeitraumId == null) rightZeitraumId = zeitrechte.get(0).id();
  61. JsonNode rightZeitraum = jsonNavigationService.findZeitraumById(right, rightZeitraumId);
  62. // --- Find the stammvorgang that contains the selected zeitraum ---
  63. JsonNode stammvorgangJsonNode = jsonNavigationService.findStammvorgangByZeitraumId(right, rightZeitraumId);
  64. StammvorgangInfo stammvorgangRight = jsonNavigationService.createStammvorgangInfo(stammvorgangJsonNode);
  65. // --- Extract stammakte info if available ---
  66. StammakteInfo stammakteRight = jsonNavigationService.extractStammakteInfo(right);
  67. // --- Links (Baseline) Kandidaten & Auswahl ---
  68. List<Vorgang> leftCand = jsonNavigationService.parseLeftCandidates(left);
  69. List<Z> leftZ = List.of();
  70. JsonNode leftZeitraum = null;
  71. if (!leftCand.isEmpty()) {
  72. if (leftVorgangId == null) leftVorgangId = leftCand.get(0).id();
  73. final String finalLeftVorgangId = leftVorgangId;
  74. leftZ = leftCand.stream().filter(v -> v.id().equals(finalLeftVorgangId)).findFirst().orElse(leftCand.get(0)).zeitraeume();
  75. if (leftZeitraumId == null && !leftZ.isEmpty()) leftZeitraumId = leftZ.get(0).id();
  76. if (leftZeitraumId != null) leftZeitraum = jsonNavigationService.findZeitraumById(jsonNavigationService.getRootOfVorgang(left, leftVorgangId), leftZeitraumId);
  77. }
  78. // --- Wohnungsvergleich ---
  79. WohnungZeile wohnungZeile = dataExtractor.buildWohnungZeile(rightZeitraum, leftZeitraum);
  80. // --- Mietedaten ---
  81. MieteZeile mieteZeile = dataExtractor.buildMieteZeile(rightZeitraum, leftZeitraum);
  82. // --- Untermieter und Mitbewohner ---
  83. List<UntermieterZeile> untermieterZeilen = dataExtractor.buildUntermieterZeilen(rightZeitraum, leftZeitraum);
  84. List<MitbewohnerZeile> mitbewohnerZeilen = dataExtractor.buildMitbewohnerZeilen(rightZeitraum, leftZeitraum);
  85. // --- Model füllen & rendern ---
  86. model.addAttribute("leftJson", leftJson);
  87. model.addAttribute("rightJson", rightJson);
  88. model.addAttribute("validate", validate);
  89. model.addAttribute("schemaName", schemaName);
  90. model.addAttribute("leftCandidates", leftCand);
  91. model.addAttribute("leftZeitraeumeOfSelected", leftZ);
  92. model.addAttribute("leftVorgangId", leftVorgangId);
  93. model.addAttribute("leftZeitraumId", leftZeitraumId);
  94. model.addAttribute("zeitraeumeRight", zeitrechte);
  95. model.addAttribute("rightZeitraumId", rightZeitraumId);
  96. model.addAttribute("stammvorgangRight", stammvorgangRight);
  97. model.addAttribute("stammakteRight", stammakteRight);
  98. model.addAttribute("wohnungZeile", wohnungZeile);
  99. model.addAttribute("mieteZeile", mieteZeile);
  100. model.addAttribute("untermieterZeilen", untermieterZeilen);
  101. model.addAttribute("mitbewohnerZeilen", mitbewohnerZeilen);
  102. model.addAttribute("activeKunde", activeKunde);
  103. model.addAttribute("pageTitle", "Miete-/Wohnungsdaten");
  104. return "miete";
  105. }
  106. @PostMapping("/api/vorgang-change")
  107. @ResponseBody
  108. public ResponseEntity<VorgangChangeResponse> changeLeftVorgang(
  109. @RequestParam String leftJson,
  110. @RequestParam String rightJson,
  111. @RequestParam String rightZeitraumId,
  112. @RequestParam String newLeftVorgangId) throws Exception {
  113. JsonNode left = om.readTree(leftJson);
  114. JsonNode right = om.readTree(rightJson);
  115. // --- Links (Baseline) Kandidaten & neue Auswahl ---
  116. List<Vorgang> leftCand = jsonNavigationService.parseLeftCandidates(left);
  117. final String finalLeftVorgangId = newLeftVorgangId;
  118. List<Z> leftZ = leftCand.stream()
  119. .filter(v -> v.id().equals(finalLeftVorgangId))
  120. .findFirst()
  121. .orElse(leftCand.get(0))
  122. .zeitraeume();
  123. // Ersten Zeitraum des neuen Vorgangs als Default wählen
  124. String newLeftZeitraumId = !leftZ.isEmpty() ? leftZ.get(0).id() : null;
  125. JsonNode rightZeitraum = jsonNavigationService.findZeitraumById(right, rightZeitraumId);
  126. JsonNode leftZeitraum = null;
  127. if (newLeftZeitraumId != null) {
  128. leftZeitraum = jsonNavigationService.findZeitraumById(jsonNavigationService.getRootOfVorgang(left, newLeftVorgangId), newLeftZeitraumId);
  129. }
  130. // --- Wohnungsvergleich ---
  131. WohnungZeile wohnungZeile = dataExtractor.buildWohnungZeile(rightZeitraum, leftZeitraum);
  132. // --- Mietedaten ---
  133. MieteZeile mieteZeile = dataExtractor.buildMieteZeile(rightZeitraum, leftZeitraum);
  134. // --- Untermieter und Mitbewohner ---
  135. List<UntermieterZeile> untermieterZeilen = dataExtractor.buildUntermieterZeilen(rightZeitraum, leftZeitraum);
  136. List<MitbewohnerZeile> mitbewohnerZeilen = dataExtractor.buildMitbewohnerZeilen(rightZeitraum, leftZeitraum);
  137. VorgangChangeResponse response = new VorgangChangeResponse(
  138. newLeftVorgangId,
  139. newLeftZeitraumId,
  140. leftZ,
  141. wohnungZeile,
  142. mieteZeile,
  143. untermieterZeilen,
  144. mitbewohnerZeilen
  145. );
  146. return ResponseEntity.ok(response);
  147. }
  148. @PostMapping("/api/zeitraum-change")
  149. @ResponseBody
  150. public ResponseEntity<ZeitraumChangeResponse> changeLeftZeitraum(
  151. @RequestParam String leftJson,
  152. @RequestParam String rightJson,
  153. @RequestParam String leftVorgangId,
  154. @RequestParam String rightZeitraumId,
  155. @RequestParam String newLeftZeitraumId) throws Exception {
  156. JsonNode left = om.readTree(leftJson);
  157. JsonNode right = om.readTree(rightJson);
  158. JsonNode rightZeitraum = jsonNavigationService.findZeitraumById(right, rightZeitraumId);
  159. JsonNode leftZeitraum = null;
  160. if (newLeftZeitraumId != null) {
  161. leftZeitraum = jsonNavigationService.findZeitraumById(jsonNavigationService.getRootOfVorgang(left, leftVorgangId), newLeftZeitraumId);
  162. }
  163. // --- Wohnungsvergleich ---
  164. WohnungZeile wohnungZeile = dataExtractor.buildWohnungZeile(rightZeitraum, leftZeitraum);
  165. // --- Mietedaten ---
  166. MieteZeile mieteZeile = dataExtractor.buildMieteZeile(rightZeitraum, leftZeitraum);
  167. // --- Untermieter und Mitbewohner ---
  168. List<UntermieterZeile> untermieterZeilen = dataExtractor.buildUntermieterZeilen(rightZeitraum, leftZeitraum);
  169. List<MitbewohnerZeile> mitbewohnerZeilen = dataExtractor.buildMitbewohnerZeilen(rightZeitraum, leftZeitraum);
  170. ZeitraumChangeResponse response = new ZeitraumChangeResponse(
  171. newLeftZeitraumId,
  172. wohnungZeile,
  173. mieteZeile,
  174. untermieterZeilen,
  175. mitbewohnerZeilen
  176. );
  177. return ResponseEntity.ok(response);
  178. }
  179. // ===== Private Helper Methods =====
  180. private String resolveActiveKunde(String kunde, String kundeHeader) {
  181. return kunde != null ? kunde : kundeHeader;
  182. }
  183. // ===== Response Classes =====
  184. public record VorgangChangeResponse(
  185. String newLeftVorgangId,
  186. String newLeftZeitraumId,
  187. List<Z> leftZeitraeumeOfSelected,
  188. WohnungZeile wohnungZeile,
  189. MieteZeile mieteZeile,
  190. List<UntermieterZeile> untermieterZeilen,
  191. List<MitbewohnerZeile> mitbewohnerZeilen
  192. ) {}
  193. public record ZeitraumChangeResponse(
  194. String newLeftZeitraumId,
  195. WohnungZeile wohnungZeile,
  196. MieteZeile mieteZeile,
  197. List<UntermieterZeile> untermieterZeilen,
  198. List<MitbewohnerZeile> mitbewohnerZeilen
  199. ) {}
  200. }