miete.html 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288
  1. <!DOCTYPE html>
  2. <html lang="de" xmlns:th="http://www.thymeleaf.org">
  3. <head>
  4. <meta charset="UTF-8"/>
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
  6. <title>DIWO Vergleich – Miete</title>
  7. <link rel="stylesheet" href="/css/global.css"/>
  8. <link rel="stylesheet" href="/css/header.css"/>
  9. <link rel="stylesheet" href="/css/legend.css"/>
  10. <link rel="stylesheet" href="/css/miete.css"/>
  11. <link rel="stylesheet" href="/css/footer.css"/>
  12. <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css"/>
  13. <!-- JavaScript Module -->
  14. <script src="/js/cookie-utils.js"></script>
  15. <script src="/js/ajax-handlers.js"></script>
  16. <script src="/js/ui-updater-miete.js"></script>
  17. <script src="/js/interactions.js"></script>
  18. <script src="/js/color-scheme.js"></script>
  19. <script src="/js/clipboard-utils.js"></script>
  20. <script src="/js/app.js"></script>
  21. </head>
  22. <body>
  23. <!-- Header-Fragment einbinden -->
  24. <div th:replace="~{fragments/header :: header}"></div>
  25. <!-- Vergleichslegende-Fragment einbinden -->
  26. <div th:replace="~{fragments/legend :: legend}"></div>
  27. <!-- Wohnung Header-Vergleich -->
  28. <main role="main">
  29. <div class="section-container">
  30. <div class="section-header" onclick="toggleSection('wohnung')" role="button" tabindex="0"
  31. onkeypress="handleKeyPress(event, 'wohnung')" aria-expanded="true" aria-controls="wohnung-content">
  32. <span class="toggle-icon" id="wohnung-icon" aria-hidden="true">▼</span>
  33. <h3>Wohnung</h3>
  34. </div>
  35. <div class="section-content" id="wohnung-content">
  36. <div th:if="${wohnungZeile != null}" th:class="${wohnungZeile.rowClass}">
  37. <!-- Wohnung Grid als Tabelle -->
  38. <table class="wohnung-grid-table">
  39. <tr>
  40. <td class="label-cell">Mietverhältnis</td>
  41. <td class="value-cell" th:utext="${wohnungZeile.mietverhaeltnisHtml}"></td>
  42. <td class="label-cell">Fläche (m²)</td>
  43. <td class="value-cell" th:utext="${wohnungZeile.flaecheHtml}"></td>
  44. <td class="label-cell">Bad</td>
  45. <td class="value-cell" th:utext="${wohnungZeile.badHtml}"></td>
  46. <td class="label-cell">Name (Vermiet)</td>
  47. <td class="value-cell" th:utext="${wohnungZeile.nameEigHtml}"></td>
  48. <td class="label-cell">Telefon</td>
  49. <td class="value-cell" th:utext="${wohnungZeile.telefonEigHtml}"></td>
  50. </tr>
  51. <tr>
  52. <td class="label-cell">öffentl. geförd. Wohnungsbau</td>
  53. <td class="value-cell" th:utext="${wohnungZeile.sozBauJnHtml}"></td>
  54. <td class="label-cell">Bezugsfert</td>
  55. <td class="value-cell" th:utext="${wohnungZeile.fertigDatHtml}"></td>
  56. <td class="label-cell">Heizung</td>
  57. <td class="value-cell" th:utext="${wohnungZeile.heizungHtml}"></td>
  58. <td class="label-cell">Adresse</td>
  59. <td class="value-cell" th:utext="${wohnungZeile.adresseEigHtml}"></td>
  60. <td colspan="2"></td> <!-- Leere Zellen für das 5. Paar -->
  61. </tr>
  62. </table>
  63. </div>
  64. </div>
  65. </div>
  66. <!-- Miete -->
  67. <div class="section-container">
  68. <div class="section-header" onclick="toggleSection('miete')" role="button" tabindex="0"
  69. onkeypress="handleKeyPress(event, 'miete')" aria-expanded="true" aria-controls="miete-content">
  70. <span class="toggle-icon" id="miete-icon" aria-hidden="true">▼</span>
  71. <h3>Miete</h3>
  72. </div>
  73. <div class="section-content" id="miete-content">
  74. <div th:if="${mieteZeile != null}" th:class="${mieteZeile.rowClass}">
  75. <!-- Miete Grid als echte Tabelle mit 7 Spalten -->
  76. <table class="miete-grid-table">
  77. <!-- Header-Zeile mit Spaltenüberschriften -->
  78. <thead>
  79. <tr>
  80. <th class="miete-header-cell" colspan="2">Allgemeine Daten</th>
  81. <th class="miete-header-cell" colspan="">Abzüge</th>
  82. <th class="miete-header-cell" colspan="">Werte</th>
  83. <th class="miete-header-cell" aria-label="Pauschale für Abzugsarten">Pauschale</th>
  84. <td class="empty-cell"></td>
  85. <td class="empty-cell"></td>
  86. </tr>
  87. </thead>
  88. <tbody>
  89. <!-- Erste Zeile: Gesamtmiete -->
  90. <tr>
  91. <td class="label-cell">* Gesamtmiete</td>
  92. <td class="value-cell" th:utext="${mieteZeile.gesamtmieteHtml}"></td>
  93. <td class="label-cell">Heizung</td>
  94. <td class="value-cell" th:utext="${mieteZeile.heizungHtml}"></td>
  95. <td class="pauschale-cell" th:utext="${mieteZeile.heizungPauschaleHtml}"></td>
  96. <td class="empty-cell"></td>
  97. <td class="empty-cell"></td>
  98. </tr>
  99. <!-- Zweite Zeile: Zuschläge -->
  100. <tr>
  101. <td class="label-cell">Zuschläge</td>
  102. <td class="value-cell" th:utext="${mieteZeile.zuschlägeHtml}"></td>
  103. <td class="label-cell">Warmwasser</td>
  104. <td class="value-cell" th:utext="${mieteZeile.warmwasserHtml}"></td>
  105. <td class="pauschale-cell" th:utext="${mieteZeile.warmwasserPauschaleHtml}"></td>
  106. <td class="empty-cell"></td>
  107. <td class="empty-cell"></td>
  108. </tr>
  109. <!-- Dritte Zeile: Art des Zuschlages -->
  110. <tr>
  111. <td class="label-cell">Art des Zuschlages</td>
  112. <td class="value-cell" th:utext="${mieteZeile.artZuschlagHtml}"></td>
  113. <td class="label-cell">Kosten HH-Energie</td>
  114. <td class="value-cell" th:utext="${mieteZeile.kostenHhEnergieHtml}"></td>
  115. <td class="pauschale-cell" th:utext="${mieteZeile.energiePauschaleHtml}"></td>
  116. <td class="empty-cell"></td>
  117. <td class="empty-cell"></td>
  118. </tr>
  119. <!-- Jährliche Kosten Überschrift -->
  120. <tr>
  121. <td class="section-header-cell" colspan="2">Jährliche Kosten</td>
  122. <td class="label-cell">Garage/Stellplatz</td>
  123. <td class="value-cell" th:utext="${mieteZeile.stellplatzHtml}"></td>
  124. <td class="pauschale-cell" th:utext="${mieteZeile.stellplatzPauschaleHtml}"></td>
  125. <td class="empty-cell"></td>
  126. <td class="empty-cell"></td>
  127. </tr>
  128. <!-- Fernwärme -->
  129. <tr>
  130. <td class="label-cell">Fernwärme</td>
  131. <td class="value-cell" th:utext="${mieteZeile.jhrlFernwaermeHtml}"></td>
  132. <td class="label-cell">Möblierungszuschläge</td>
  133. <td class="value-cell" th:utext="${mieteZeile.moeblierungszuschlagHtml}"></td>
  134. <td class="pauschale-cell" th:utext="${mieteZeile.moeblierungPauschaleHtml}"></td>
  135. <td class="empty-cell"></td>
  136. <td class="empty-cell"></td>
  137. </tr>
  138. <!-- Fernwarmwasser -->
  139. <tr>
  140. <td class="label-cell">Fernwarmwasser</td>
  141. <td class="value-cell" th:utext="${mieteZeile.jhrlFernwarmwasserHtml}"></td>
  142. <td class="label-cell">Gewerbezuschläge</td>
  143. <td class="value-cell" th:utext="${mieteZeile.gewerbezuschlagHtml}"></td>
  144. <td class="pauschale-cell" th:utext="${mieteZeile.gewerbePauschaleHtml}"></td>
  145. <td class="label-cell">Gewerbefläche in m²</td>
  146. <td class="value-cell gewerbefläche-cell" th:utext="${mieteZeile.gewerbeflaecheHtml}"></td>
  147. </tr>
  148. <!-- Fernwärme und -warmwasser -->
  149. <tr>
  150. <td class="label-cell">Fernwärme und -warmwasser</td>
  151. <td class="value-cell" th:utext="${mieteZeile.jhrlFernwUndWHtml}"></td>
  152. <td class="label-cell">Untermietzuschläge</td>
  153. <td class="value-cell" th:utext="${mieteZeile.untermietzuschlagHtml}"></td>
  154. <td class="empty-cell"></td>
  155. <td class="empty-cell"></td>
  156. <td class="empty-cell"></td>
  157. </tr>
  158. <!-- Sonstige Zuschläge -->
  159. <tr>
  160. <td class="empty-cell"></td>
  161. <td class="empty-cell"></td>
  162. <td class="label-cell">sonstige Zuschläge</td>
  163. <td class="value-cell" th:utext="${mieteZeile.sonstZuschlagHtml}"></td>
  164. <td class="pauschale-cell" th:utext="${mieteZeile.sonstPauschaleHtml}"></td>
  165. <td class="empty-cell"></td>
  166. <td class="empty-cell"></td>
  167. </tr>
  168. <!-- Leistungen Dritter -->
  169. <tr>
  170. <td class="empty-cell"></td>
  171. <td class="empty-cell"></td>
  172. <td class="label-cell">Leistungen Dritter</td>
  173. <td class="value-cell" th:utext="${mieteZeile.leistungenDritterHtml}"></td>
  174. <td class="empty-cell"></td>
  175. <td class="empty-cell"></td>
  176. <td class="empty-cell"></td>
  177. </tr>
  178. </tbody>
  179. </table>
  180. </div>
  181. </div>
  182. </div>
  183. <!-- Untermieter -->
  184. <div class="section-container">
  185. <div class="section-header" onclick="toggleSection('untermieter')" role="button" tabindex="0"
  186. onkeypress="handleKeyPress(event, 'untermieter')" aria-expanded="true" aria-controls="untermieter-content">
  187. <span class="toggle-icon" id="untermieter-icon" aria-hidden="true">▼</span>
  188. <h3>Untermieterin/Untermieter</h3>
  189. </div>
  190. <div class="section-content" id="untermieter-content">
  191. <table role="table" aria-labelledby="untermieter-caption" id="untermieter-table">
  192. <thead>
  193. <tr>
  194. <th scope="col">Änderung</th>
  195. <th scope="col">Name</th>
  196. <th scope="col">Vorname</th>
  197. <th scope="col">Miete</th>
  198. <th scope="col">Fläche</th>
  199. <th scope="col">sonst. Kosten</th>
  200. <th scope="col">Heizung</th>
  201. <th scope="col">Heizungspauschale</th>
  202. <th scope="col">Warmwasser</th>
  203. <th scope="col">Warmwasserpauschale</th>
  204. <th scope="col">Möblierung</th>
  205. <th scope="col">Möblierungspauschale</th>
  206. </tr>
  207. </thead>
  208. <tbody>
  209. <tr th:each="z : ${untermieterZeilen}" th:class="${z.rowClass}">
  210. <td th:class="'sym ' + ${z.symbolClass}" th:utext="${z.symbol}"
  211. th:aria-label="${z.symbol.contains('fa-plus') ? 'Hinzugefügt' : (z.symbol.contains('fa-minus') ? 'Gelöscht' : (z.symbol.contains('fa-exclamation') ? 'Geändert' : 'Unverändert'))}"></td>
  212. <td th:utext="${z.nameHtml}"></td>
  213. <td th:utext="${z.vornameHtml}"></td>
  214. <td th:utext="${z.mieteHtml}"></td>
  215. <td th:utext="${z.flaecheHtml}"></td>
  216. <td th:utext="${z.sonstHtml}"></td>
  217. <td th:utext="${z.heizungHtml}"></td>
  218. <td th:utext="${z.heizungPHtml}"></td>
  219. <td th:utext="${z.warmwasserHtml}"></td>
  220. <td th:utext="${z.warmwasserPHtml}"></td>
  221. <td th:utext="${z.moeblierungHtml}"></td>
  222. <td th:utext="${z.moeblierungPHtml}"></td>
  223. </tr>
  224. </tbody>
  225. </table>
  226. </div>
  227. </div>
  228. <!-- Mitbewohner -->
  229. <div class="section-container">
  230. <div class="section-header" onclick="toggleSection('mitbewohner')" role="button" tabindex="0"
  231. onkeypress="handleKeyPress(event, 'mitbewohner')" aria-expanded="true" aria-controls="mitbewohner-content">
  232. <span class="toggle-icon" id="mitbewohner-icon" aria-hidden="true">▼</span>
  233. <h3>mitbewohnende Person</h3>
  234. </div>
  235. <div class="section-content" id="mitbewohner-content">
  236. <table role="table" aria-labelledby="mitbewohner-caption" id="mitbewohner-table">
  237. <thead>
  238. <tr>
  239. <th scope="col">Änderung</th>
  240. <th scope="col">Name</th>
  241. <th scope="col">Vorname</th>
  242. <th scope="col">Miete</th>
  243. <th scope="col">sonst. Kosten</th>
  244. <th scope="col">Heizung</th>
  245. <th scope="col">Heizungspauschale</th>
  246. <th scope="col">Warmwasser</th>
  247. <th scope="col">Warmwasserpauschale</th>
  248. </tr>
  249. </thead>
  250. <tbody>
  251. <tr th:each="z : ${mitbewohnerZeilen}" th:class="${z.rowClass}">
  252. <td th:class="'sym ' + ${z.symbolClass}" th:utext="${z.symbol}"
  253. th:aria-label="${z.symbol.contains('fa-plus') ? 'Hinzugefügt' : (z.symbol.contains('fa-minus') ? 'Gelöscht' : (z.symbol.contains('fa-exclamation') ? 'Geändert' : 'Unverändert'))}"></td>
  254. <td th:utext="${z.nameHtml}"></td>
  255. <td th:utext="${z.vornameHtml}"></td>
  256. <td th:utext="${z.entgeltHtml}"></td>
  257. <td th:utext="${z.sonstHtml}"></td>
  258. <td th:utext="${z.heizungHtml}"></td>
  259. <td th:utext="${z.heizungPHtml}"></td>
  260. <td th:utext="${z.warmwasserHtml}"></td>
  261. <td th:utext="${z.warmwasserPHtml}"></td>
  262. </tr>
  263. </tbody>
  264. </table>
  265. </div>
  266. </div>
  267. <!-- Hidden data for AJAX requests -->
  268. <div id="ajax-data" style="display: none;" aria-hidden="true">
  269. <input type="hidden" id="leftJson" th:value="${leftJson}"/>
  270. <input type="hidden" id="rightJson" th:value="${rightJson}"/>
  271. <input type="hidden" id="leftVorgangId" th:value="${leftVorgangId}"/>
  272. <input type="hidden" id="leftZeitraumId" th:value="${leftZeitraumId}"/>
  273. <input type="hidden" id="rightZeitraumId" th:value="${rightZeitraumId}"/>
  274. </div>
  275. </main>
  276. <!-- Footer-Fragment einbinden -->
  277. <div th:replace="~{fragments/footer :: footer}"></div>
  278. </body>
  279. </html>