VergleichsansichtHhmEinkommenToJsonDbFunctions.java 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501
  1. package com.tsystems.diwo.business.queries;
  2. import com.fasterxml.jackson.core.JsonProcessingException;
  3. import com.tsystems.common.InwoLogger;
  4. import com.tsystems.common.model.db.interfaces.IInwoDBCall;
  5. import java.math.BigDecimal;
  6. import java.sql.ResultSet;
  7. import java.sql.SQLException;
  8. import java.sql.Types;
  9. import java.util.ArrayList;
  10. import java.util.Collections;
  11. import java.util.Date;
  12. import java.util.LinkedHashMap;
  13. import java.util.List;
  14. import java.util.Map;
  15. public class VergleichsansichtHhmEinkommenToJsonDbFunctions extends VergleichsansichtBaseDbFunctions {
  16. private static final InwoLogger LOG =
  17. InwoLogger.createInwoLogger( VergleichsansichtHhmEinkommenToJsonDbFunctions.class );
  18. /* ============================================================
  19. ÖFFENTLICHE EINSTIEGE (Root: "stammakte" -> vorgaenge[])
  20. ============================================================ */
  21. public static String buildJsonAktuellerVorgang ( IInwoDBCall dbCall, Integer sakId, Integer lfdnr,
  22. Integer konnr ) throws SQLException, JsonProcessingException {
  23. Map<String, Object> stammakte = fetchStammakte( dbCall, sakId );
  24. Map<String, Object> stammvorgang = fetchStammvorgang( dbCall, sakId, lfdnr );
  25. // Hole bez und wognr aus t_akten
  26. Map<String, Integer> aktenData = fetchBezWognrFromAkten( dbCall, sakId );
  27. // Hole Eingangsdatum für zeitabhängige Lookups
  28. Date eingangsdatum = fetchEingangsdatum( dbCall, sakId, lfdnr );
  29. List<Map<String, Object>> zeitraeume =
  30. fetchZeitraeumeUndDetails( dbCall, aktenData.get( "bez" ), aktenData.get( "wognr" ), lfdnr, eingangsdatum,
  31. /*onlyKonnr*/konnr );
  32. Map<String, Object> vorgangObj = new LinkedHashMap<>();
  33. vorgangObj.put( "stammvorgang", stammvorgang );
  34. vorgangObj.put( "zeitraeume", zeitraeume );
  35. List<Map<String, Object>> vorgaenge = new ArrayList<>();
  36. vorgaenge.add( vorgangObj );
  37. stammakte.put( "vorgaenge", vorgaenge );
  38. String result = om.writeValueAsString( Collections.singletonMap( "stammakte", stammakte ) );
  39. LOG.finest( "Resulting JSON: " + result );
  40. // Close database call at the very end after all queries are completed
  41. dbCall.closeQuery();
  42. return result;
  43. }
  44. /** Alle anderen Vorgänge (≠ lfdnr) + alle deren Zeiträume -> {"stammakte":{..., "vorgaenge":[{...}, ...]}} */
  45. public static String buildJsonAndereVorgaenge ( IInwoDBCall dbCall, Integer sakId,
  46. Integer lfdnr ) throws SQLException, JsonProcessingException {
  47. Map<String, Object> stammakte = fetchStammakte( dbCall, sakId );
  48. List<Integer> andere = fetchAndereLfdnr( dbCall, sakId, lfdnr );
  49. List<Map<String, Object>> vorgaenge = new ArrayList<>();
  50. // Hole bez und wognr aus t_akten
  51. Map<String, Integer> aktenData = fetchBezWognrFromAkten( dbCall, sakId );
  52. for ( Integer otherLfdnr : andere ) {
  53. Map<String, Object> stammvorgang = fetchStammvorgang( dbCall, sakId, otherLfdnr );
  54. // Hole Eingangsdatum für zeitabhängige Lookups
  55. Date eingangsdatum = fetchEingangsdatum( dbCall, sakId, otherLfdnr );
  56. List<Map<String, Object>> zeitraeume =
  57. fetchZeitraeumeUndDetails( dbCall, aktenData.get( "bez" ), aktenData.get( "wognr" ), otherLfdnr,
  58. eingangsdatum, /*onlyKonnr*/null );
  59. Map<String, Object> vorgangObj = new LinkedHashMap<>();
  60. vorgangObj.put( "stammvorgang", stammvorgang );
  61. vorgangObj.put( "zeitraeume", zeitraeume );
  62. vorgaenge.add( vorgangObj );
  63. }
  64. stammakte.put( "vorgaenge", vorgaenge );
  65. String result = om.writeValueAsString( Collections.singletonMap( "stammakte", stammakte ) );
  66. LOG.finest( "Resulting JSON: " + result );
  67. // Close database call at the very end after all queries are completed
  68. dbCall.closeQuery();
  69. return result;
  70. }
  71. /* ===========================
  72. Eingangsdatum
  73. =========================== */
  74. private static Date fetchEingangsdatum ( IInwoDBCall dbCall, Integer sakId, Integer lfdnr ) throws SQLException {
  75. String q = "SELECT EING_DAT FROM T_STAMMVORGAENGE WHERE SAK_ID = :sak_id AND LFDNR = :lfdnr";
  76. dbCall.query( q );
  77. dbCall.in( "sak_id", sakId, Types.INTEGER );
  78. dbCall.in( "lfdnr", lfdnr, Types.INTEGER );
  79. ResultSet rs = dbCall.executeQuery( true );
  80. if ( rs.next() )
  81. return rs.getDate( "EING_DAT" );
  82. return null;
  83. }
  84. /* ===========================
  85. Zeiträume + Details
  86. =========================== */
  87. /**
  88. * Lädt Zeiträume für einen Vorgang.
  89. * - onlyKonnr != null -> nur dieser KONNR (aktueller Vorgang)
  90. * - onlyKonnr == null -> alle Zeiträume (andere Vorgänge)
  91. */
  92. private static List<Map<String, Object>> fetchZeitraeumeUndDetails ( IInwoDBCall dbCall, Integer bez, Integer wognr,
  93. Integer lfdnr, Date eingangsdatum,
  94. Integer onlyKonnr ) throws SQLException {
  95. String base =
  96. "SELECT TO_CHAR(k.KONNR) AS zeitraum_id, " + " TO_CHAR(k.BEGINN_DAT, 'YYYY-MM-DD') AS beginn, " +
  97. " TO_CHAR(k.ENDE_DAT, 'YYYY-MM-DD') AS ende " + "FROM T_KONSTELLATIONEN k " +
  98. "WHERE k.AN_WOGNR = :wognr AND k.AN_BEZ = :bez AND k.AN_LFDNR = :lfdnr ";
  99. String filter = ( onlyKonnr != null ) ? "AND k.KONNR = :konnr " : "";
  100. String order = "ORDER BY k.BEGINN_DAT NULLS FIRST, k.KONNR";
  101. String q = base + filter + order;
  102. dbCall.query( q );
  103. dbCall.in( "wognr", wognr, Types.INTEGER );
  104. dbCall.in( "bez", bez, Types.INTEGER );
  105. dbCall.in( "lfdnr", lfdnr, Types.INTEGER );
  106. if ( onlyKonnr != null )
  107. dbCall.in( "konnr", onlyKonnr, Types.INTEGER );
  108. List<Map<String, Object>> out = new ArrayList<>();
  109. ResultSet rs = dbCall.executeQuery( true );
  110. while ( rs.next() ) {
  111. String zeitraumId = rs.getString( "zeitraum_id" );
  112. String beginn = rs.getString( "beginn" );
  113. String ende = rs.getString( "ende" );
  114. Map<String, Object> zr = new LinkedHashMap<>();
  115. zr.put( "id", zeitraumId );
  116. if ( beginn != null )
  117. zr.put( "beginn", beginn );
  118. if ( ende != null )
  119. zr.put( "ende", ende );
  120. // Personen für diesen Zeitraum laden
  121. List<Map<String, Object>> personen =
  122. fetchPersonenImZeitraum( dbCall, bez, wognr, lfdnr, Integer.parseInt( zeitraumId ), eingangsdatum );
  123. zr.put( "personen", personen );
  124. out.add( zr );
  125. }
  126. return out;
  127. }
  128. /* ===========================
  129. Personen im Zeitraum
  130. =========================== */
  131. private static List<Map<String, Object>> fetchPersonenImZeitraum ( IInwoDBCall dbCall, Integer bez, Integer wognr,
  132. Integer lfdnr, Integer konnr,
  133. Date eingangsdatum ) throws SQLException {
  134. // Hole alle BIK_IDs für diesen Zeitraum
  135. String q =
  136. "SELECT kb.BIK_ID " + "FROM T_KON_BIK kb " + "WHERE kb.KON_AN_WOGNR = :wognr AND kb.KON_AN_BEZ = :bez " +
  137. "AND kb.KON_AN_LFDNR = :lfdnr AND kb.KON_KONNR = :konnr";
  138. dbCall.query( q );
  139. dbCall.in( "wognr", wognr, Types.INTEGER );
  140. dbCall.in( "bez", bez, Types.INTEGER );
  141. dbCall.in( "lfdnr", lfdnr, Types.INTEGER );
  142. dbCall.in( "konnr", konnr, Types.INTEGER );
  143. List<Integer> bikIds = new ArrayList<>();
  144. ResultSet rs = dbCall.executeQuery( true );
  145. while ( rs.next() ) {
  146. bikIds.add( ( ( BigDecimal ) rs.getObject( "BIK_ID" ) ).intValue() );
  147. }
  148. List<Map<String, Object>> personen = new ArrayList<>();
  149. for ( Integer bikId : bikIds ) {
  150. Map<String, Object> personImZeitraum = fetchPersonImZeitraum( dbCall, bikId, eingangsdatum );
  151. if ( personImZeitraum != null ) {
  152. personen.add( personImZeitraum );
  153. }
  154. }
  155. return personen;
  156. }
  157. private static Map<String, Object> fetchPersonImZeitraum ( IInwoDBCall dbCall, Integer bikId,
  158. Date eingangsdatum ) throws SQLException {
  159. // Hole Bewohner-ID aus T_BEWOHNER_IN_KONST
  160. Integer bewId = fetchBewohnerIdFromBik( dbCall, bikId );
  161. if ( bewId == null )
  162. return null;
  163. Map<String, Object> person = fetchPersonBasis( dbCall, bewId, bikId, eingangsdatum );
  164. if ( person == null )
  165. return null;
  166. Map<String, Object> personImZeitraum = new LinkedHashMap<>();
  167. personImZeitraum.put( "person", person );
  168. // Einkommen laden
  169. List<Map<String, Object>> einkommen = fetchEinkommen( dbCall, bikId );
  170. if ( !einkommen.isEmpty() ) {
  171. personImZeitraum.put( "einkommen", einkommen );
  172. }
  173. // Freibeträge laden
  174. List<Map<String, Object>> freibetraege = fetchFreibetraege( dbCall, bikId );
  175. if ( !freibetraege.isEmpty() ) {
  176. personImZeitraum.put( "freibetraege", freibetraege );
  177. }
  178. // Kinderbetreuung laden
  179. List<Map<String, Object>> kinderbetreuung = fetchKinderbetreuung( dbCall, bikId );
  180. if ( !kinderbetreuung.isEmpty() ) {
  181. personImZeitraum.put( "kinderbetreuung", kinderbetreuung );
  182. }
  183. return personImZeitraum;
  184. }
  185. private static Integer fetchBewohnerIdFromBik ( IInwoDBCall dbCall, Integer bikId ) throws SQLException {
  186. String q = "SELECT BEW_ID FROM T_BEWOHNER_IN_KONST WHERE ID = :bik_id";
  187. dbCall.query( q );
  188. dbCall.in( "bik_id", bikId, Types.INTEGER );
  189. ResultSet rs = dbCall.executeQuery( true );
  190. if ( rs.next() ) {
  191. return ( ( BigDecimal ) rs.getObject( "BEW_ID" ) ).intValue();
  192. }
  193. return null;
  194. }
  195. /* ===========================
  196. PersonBasis
  197. =========================== */
  198. private static Map<String, Object> fetchPersonBasis ( IInwoDBCall dbCall, Integer bewId, Integer bikId,
  199. Date eingangsdatum ) throws SQLException {
  200. java.sql.Date eingangDat =
  201. ( eingangsdatum != null ) ? new java.sql.Date( eingangsdatum.getTime() ) :
  202. java.sql
  203. .Date
  204. .valueOf( "2099-12-31" );
  205. String q =
  206. "SELECT " + " TO_CHAR(b.ID) AS id, " + " b.NAME AS nachname, " + " b.VORNAME AS vorname, " +
  207. " b.GEBURTSNAME AS geburtsname, " + " b.NAME_ALT AS alterName, " + " b.TITEL AS titel, " +
  208. " b.ANREDE AS anrede_raw, " + " COALESCE(anr.BESCHREIBUNG, b.ANREDE) AS anrede, " +
  209. " TO_CHAR(b.GEB_DAT, 'YYYY-MM-DD') AS geburtsdatum, " +
  210. " TO_CHAR(b.STERBE_DAT, 'YYYY-MM-DD') AS sterbedatum, " + " b.GEBURTSORT AS geburtsort, " +
  211. " b.GESCHLECHT AS geschlecht_raw, " + " COALESCE(gsch.RV_MEANING, b.GESCHLECHT) AS geschlecht, " +
  212. " b.TELEFON AS telefon, " + " b.EMAIL AS email, " + " b.BLOCKNAME_JN AS blockname_raw, " +
  213. " b.VSNR AS postabrutionsnummer " + "FROM T_BEWOHNER b " + "LEFT JOIN T_SANREDEN anr " +
  214. " ON anr.WERT = b.ANREDE " + "LEFT JOIN DIWO_REF_CODES gsch " +
  215. " ON gsch.RV_LOW_VALUE = b.GESCHLECHT " + " AND gsch.RV_DOMAIN = 'DV_GESCHLECHT' " +
  216. "WHERE b.ID = :bew_id";
  217. dbCall.query( q );
  218. dbCall.in( "bew_id", bewId, Types.INTEGER );
  219. Map<String, Object> person = new LinkedHashMap<>();
  220. ResultSet rs = dbCall.executeQuery( true );
  221. if ( rs.next() ) {
  222. person.put( "id", rs.getString( "id" ) );
  223. person.put( "nachname", rs.getString( "nachname" ) );
  224. person.put( "vorname", rs.getString( "vorname" ) );
  225. putStringIfNotNull( person, "geburtsname", rs.getString( "geburtsname" ) );
  226. putStringIfNotNull( person, "alterName", rs.getString( "alterName" ) );
  227. putStringIfNotNull( person, "titel", rs.getString( "titel" ) );
  228. putStringIfNotNull( person, "anrede", rs.getString( "anrede" ) );
  229. putStringIfNotNull( person, "geburtsdatum", rs.getString( "geburtsdatum" ) );
  230. putStringIfNotNull( person, "sterbedatum", rs.getString( "sterbedatum" ) );
  231. putStringIfNotNull( person, "geburtsort", rs.getString( "geburtsort" ) );
  232. putStringIfNotNull( person, "geschlecht", rs.getString( "geschlecht" ) );
  233. putStringIfNotNull( person, "telefon", rs.getString( "telefon" ) );
  234. putStringIfNotNull( person, "email", rs.getString( "email" ) );
  235. putStringIfNotNull( person, "postabrutionsnummer", rs.getString( "postabrutionsnummer" ) );
  236. person.put( "blockname", "J".equalsIgnoreCase( rs.getString( "blockname_raw" ) ) );
  237. }
  238. // Zusätzliche Daten aus T_BEWOHNER_IN_KONST
  239. fetchPersonBasisZusatz( dbCall, person, bikId, eingangDat );
  240. return person.isEmpty() ? null : person;
  241. }
  242. private static void fetchPersonBasisZusatz ( IInwoDBCall dbCall, Map<String, Object> person, Integer bikId,
  243. java.sql.Date eingangDat ) throws SQLException {
  244. String q =
  245. "SELECT " + " bik.AZ_SOZ AS aktenzeichenSozial, " + " bik.VERWANDT AS verwandt_raw, " +
  246. " COALESCE(verw.BESCHREIBUNG, bik.VERWANDT) AS verwandtschaftsverhaeltnis, " +
  247. " bik.SOZ_STELLUNG AS sozstellung_raw, " +
  248. " COALESCE(sozst.BESCHREIBUNG, bik.SOZ_STELLUNG) AS sozialstellung, " +
  249. " bik.FAMILIENSTAND AS familienstand_raw, " +
  250. " COALESCE(fam.BESCHREIBUNG, bik.FAMILIENSTAND) AS familienstand, " +
  251. " TO_CHAR(bik.ENDE_AUFENTHALTSTITEL, 'YYYY-MM-DD') AS aufenthaltstitelEnde " +
  252. "FROM T_BEWOHNER_IN_KONST bik " + "LEFT JOIN T_SVERWANDTSCHAFT verw " +
  253. " ON verw.WERT = bik.VERWANDT " + " AND :eingang_dat >= verw.AB_DAT " +
  254. " AND :eingang_dat <= NVL(verw.BIS_DAT, DATE '9999-12-31') " + "LEFT JOIN T_SSOZIALSTELLUNGEN sozst " +
  255. " ON sozst.WERT = bik.SOZ_STELLUNG " + " AND :eingang_dat >= sozst.AB_DAT " +
  256. " AND :eingang_dat <= NVL(sozst.BIS_DAT, DATE '9999-12-31') " + "LEFT JOIN T_SFAMILIENSTAND fam " +
  257. " ON fam.WERT = bik.FAMILIENSTAND " + " AND :eingang_dat >= fam.AB_DAT " +
  258. " AND :eingang_dat <= NVL(fam.BIS_DAT, DATE '9999-12-31') " + "WHERE bik.ID = :bik_id";
  259. dbCall.query( q );
  260. dbCall.in( "eingang_dat", eingangDat, Types.DATE );
  261. dbCall.in( "eingang_dat", eingangDat, Types.DATE );
  262. dbCall.in( "eingang_dat", eingangDat, Types.DATE );
  263. dbCall.in( "eingang_dat", eingangDat, Types.DATE );
  264. dbCall.in( "eingang_dat", eingangDat, Types.DATE );
  265. dbCall.in( "eingang_dat", eingangDat, Types.DATE );
  266. dbCall.in( "bik_id", bikId, Types.INTEGER );
  267. ResultSet rs = dbCall.executeQuery( true );
  268. if ( rs.next() ) {
  269. putStringIfNotNull( person, "aktenzeichenSozial", rs.getString( "aktenzeichenSozial" ) );
  270. putStringIfNotNull( person, "verwandtschaftsverhaeltnis", rs.getString( "verwandtschaftsverhaeltnis" ) );
  271. putStringIfNotNull( person, "sozialstellung", rs.getString( "sozialstellung" ) );
  272. putStringIfNotNull( person, "familienstand", rs.getString( "familienstand" ) );
  273. putStringIfNotNull( person, "aufenthaltstitelEnde", rs.getString( "aufenthaltstitelEnde" ) );
  274. }
  275. }
  276. /* ===========================
  277. Einkommen
  278. =========================== */
  279. private static List<Map<String, Object>> fetchEinkommen ( IInwoDBCall dbCall, Integer bikId ) throws SQLException {
  280. String q =
  281. "SELECT " + " TO_CHAR(e.LFDNR) AS id, " + " e.ART AS art, " + " e.ART_ZUSATZ AS artZusatz, " +
  282. " e.FREQUENZ AS faktor, " + " e.BETRAG AS betrag, " + " e.WERB_KOST AS werbungskosten, " +
  283. " e.ZUSCHLAG AS zuschlag, " + " e.ABSCHLAG AS abschlag " + "FROM T_EINKOMMEN e " +
  284. "WHERE e.BIK_ID = :bik_id " + "ORDER BY e.LFDNR";
  285. dbCall.query( q );
  286. dbCall.in( "bik_id", bikId, Types.INTEGER );
  287. List<Map<String, Object>> einkommen = new ArrayList<>();
  288. ResultSet rs = dbCall.executeQuery( true );
  289. while ( rs.next() ) {
  290. Map<String, Object> e = new LinkedHashMap<>();
  291. e.put( "id", rs.getString( "id" ) );
  292. String art = rs.getString( "art" );
  293. String artBeschreibung = lookupEinkommensartBeschreibung( dbCall, art );
  294. e.put( "art", artBeschreibung );
  295. putStringIfNotNull( e, "artZusatz", rs.getString( "artZusatz" ) );
  296. putNumIfNotNull( e, "faktor", rs, "faktor" );
  297. putNumIfNotNull( e, "betrag", rs, "betrag" );
  298. putNumIfNotNull( e, "werbungskosten", rs, "werbungskosten" );
  299. putNumIfNotNull( e, "zuschlag", rs, "zuschlag" );
  300. putNumIfNotNull( e, "abschlag", rs, "abschlag" );
  301. einkommen.add( e );
  302. }
  303. return einkommen;
  304. }
  305. private static String lookupEinkommensartBeschreibung ( IInwoDBCall dbCall, String art ) throws SQLException {
  306. String q = "SELECT BESCHREIBUNG FROM T_SEINKOMMENSARTEN WHERE WERT = :art";
  307. dbCall.query( q );
  308. dbCall.in( "art", art, Types.VARCHAR );
  309. ResultSet rs = dbCall.executeQuery( true );
  310. if ( rs.next() ) {
  311. return rs.getString( "BESCHREIBUNG" );
  312. }
  313. return art; // Fallback auf ursprünglichen Wert
  314. }
  315. /* ===========================
  316. Freibeträge
  317. =========================== */
  318. private static List<Map<String, Object>> fetchFreibetraege ( IInwoDBCall dbCall,
  319. Integer bikId ) throws SQLException {
  320. String q =
  321. "SELECT " + " TO_CHAR(f.LFDNR) AS id, " + " f.ART AS art, " + " f.FREQUENZ AS faktor, " +
  322. " f.BETRAG AS betrag, " + " TO_CHAR(f.FRIST_DAT, 'YYYY-MM-DD') AS fristDatum " +
  323. "FROM T_FREIBETRAEGE f " + "WHERE f.BIK_ID = :bik_id " + "ORDER BY f.LFDNR";
  324. dbCall.query( q );
  325. dbCall.in( "bik_id", bikId, Types.INTEGER );
  326. List<Map<String, Object>> freibetraege = new ArrayList<>();
  327. ResultSet rs = dbCall.executeQuery( true );
  328. while ( rs.next() ) {
  329. Map<String, Object> f = new LinkedHashMap<>();
  330. f.put( "id", rs.getString( "id" ) );
  331. String art = rs.getString( "art" );
  332. f.put( "art", lookupFreibetragBeschreibung( dbCall, art ) );
  333. // Typ aus T_SFREIB_DETAILS ermitteln
  334. String typ = lookupFreibetragTyp( dbCall, art );
  335. if ( typ != null ) {
  336. f.put( "typ", typ );
  337. }
  338. putNumIfNotNull( f, "faktor", rs, "faktor" );
  339. putNumIfNotNull( f, "betrag", rs, "betrag" );
  340. putStringIfNotNull( f, "fristDatum", rs.getString( "fristDatum" ) );
  341. freibetraege.add( f );
  342. }
  343. return freibetraege;
  344. }
  345. private static String lookupFreibetragBeschreibung ( IInwoDBCall dbCall, String art ) throws SQLException {
  346. String q = "SELECT BESCHREIBUNG FROM T_SFREIBETRAGSARTEN WHERE WERT = :art";
  347. dbCall.query( q );
  348. dbCall.in( "art", art, Types.VARCHAR );
  349. ResultSet rs = dbCall.executeQuery( true );
  350. if ( rs.next() ) {
  351. return rs.getString( "BESCHREIBUNG" );
  352. }
  353. return art; // Fallback auf ursprünglichen Wert
  354. }
  355. private static String lookupFreibetragTyp ( IInwoDBCall dbCall, String art ) throws SQLException {
  356. String q = "SELECT KENNUNG FROM T_SFREIB_DETAILS WHERE FREIB_ART = :art";
  357. dbCall.query( q );
  358. dbCall.in( "art", art, Types.VARCHAR );
  359. ResultSet rs = dbCall.executeQuery( true );
  360. if ( rs.next() ) {
  361. String kennung = rs.getString( "KENNUNG" );
  362. // Mapping: S = F, A = P
  363. if ( "S".equals( kennung ) ) {
  364. return "F";
  365. } else if ( "A".equals( kennung ) ) {
  366. return "P";
  367. }
  368. return kennung;
  369. }
  370. return null;
  371. }
  372. /* ===========================
  373. Kinderbetreuung
  374. =========================== */
  375. private static List<Map<String, Object>> fetchKinderbetreuung ( IInwoDBCall dbCall,
  376. Integer bikId ) throws SQLException {
  377. String q =
  378. "SELECT " + " TO_CHAR(ROWNUM) AS id, " + " kb.BIK_ID_KIND AS kindBikId, " +
  379. " kb.BETRAG AS betrag " + "FROM T_KINDERBETREUUNG kb " + "WHERE kb.BIK_ID = :bik_id " +
  380. "ORDER BY kb.BIK_ID_KIND";
  381. dbCall.query( q );
  382. dbCall.in( "bik_id", bikId, Types.INTEGER );
  383. List<Map<String, Object>> kinderbetreuung = new ArrayList<>();
  384. ResultSet rs = dbCall.executeQuery( true );
  385. while ( rs.next() ) {
  386. Map<String, Object> kb = new LinkedHashMap<>();
  387. kb.put( "id", rs.getString( "id" ) );
  388. // Get the original Bewohner ID from the KIND_BEW_ID (which is a BIK_ID)
  389. Integer kindBikId = ( ( BigDecimal ) rs.getObject( "kindBikId" ) ).intValue();
  390. Integer kindBewId = null;
  391. if ( kindBikId != null ) {
  392. kindBewId = fetchBewohnerIdFromBik( dbCall, kindBikId );
  393. }
  394. kb.put( "kindRef", kindBewId != null ? String.valueOf( kindBewId ) : null );
  395. putNumIfNotNull( kb, "betrag", rs, "betrag" );
  396. kinderbetreuung.add( kb );
  397. }
  398. return kinderbetreuung;
  399. }
  400. }