From 19ca0482dfb34c7a710872245c48fef465ec5c6c Mon Sep 17 00:00:00 2001 From: Wolfgang Hottgenroth Date: Fri, 22 Jan 2021 10:34:48 +0100 Subject: [PATCH] refactor jahresabrechnung --- query-jahresabrechnung.sql | 137 +++++++++++++++---------------------- 1 file changed, 57 insertions(+), 80 deletions(-) diff --git a/query-jahresabrechnung.sql b/query-jahresabrechnung.sql index d34aecb..e61484b 100644 --- a/query-jahresabrechnung.sql +++ b/query-jahresabrechnung.sql @@ -1,53 +1,48 @@ -create or replace view abrechnung1 as - select b.jahr as jahr, - (b.betrag / o.flaeche * w.flaeche) as anteil, - o.shortname as objekt, - w.shortname as wohnung, - concat(m.vorname, ' ', m.nachname) as mieter, - m.id as mieter_id, - (timestampdiff(month, - if (year(m.einzug) = b.jahr, m.einzug, makedate(b.jahr, 1)), - if (m.auszug is not null, m.auszug, last_day(makedate(b.jahr, 365))) - ) + 1) as nutzungszeit - from betriebskosten_abrechnung b, - objekt o, - wohnung w, - mieter m - where b.objekt = o.id and - w.objekt = o.id and - m.wohnung = w.id and - (year(m.einzug) = b.jahr or year(m.auszug) = b.jahr); - -create or replace view abrechnung2 as - select jahr, - anteil / 12 * nutzungszeit as anteil, - objekt, - wohnung, - mieter, - mieter_id - from abrechnung1; - -create or replace view abrechnung3 as - select a.jahr as jahr, - a.anteil as anteil, - a.objekt as objekt, - a.wohnung as wohnung, - m.vorname as vorname, - m.nachname as nachname, - m.anrede as anrede, - m.strasse as strasse, - m.plz as plz, - m.ort as ort - from abrechnung2 a, - mieter m - where m.id = a.mieter_id; - -select * from abrechnung3 where jahr = '2020'; +create or replace view betriebskosten_anteil_mieter as + select (b.betrag / o.flaeche * w.flaeche) as anteil, + o.id as objekt, + w.id as wohnung, + m.id as mieter, + b.id as abrechnung, + (timestampdiff(month, + if (year(m.einzug) = b.jahr, m.einzug, makedate(b.jahr, 1)), + if (m.auszug is not null, m.auszug, last_day(makedate(b.jahr, 365))) + ) + 1) as nutzungszeit, + b. jahr as jahr + from betriebskosten_abrechnung b, + objekt o, + wohnung w, + mieter m + where b.objekt = o.id and + w.objekt = o.id and + m.wohnung = w.id and + (year(m.einzug) = b.jahr or year(m.auszug) = b.jahr); +create table jahresabrechnung_summary ( + id integer unsigned not null auto_increment, + abrechnung integer unsigned not null, + mieter integer unsigned not null, + nutzungszeit integer not null, + anteil_pro_flaeche decimal(20, 10) not null, + anteil_pro_flaeche_nutzungszeit decimal(20, 10) not null, + vorauszahlung decimal(20, 2) not null, + nachzahlung decimal(20, 2) not null, + summe_zahlungen decimal(20, 2) not null, + summe_zahlungen_anteil_miete decimal(20, 2) not null, + constraint primary key(id), + constraint unique key uk_jahresabrechnung_summary_mieter_abrechnung (abrechnung, mieter), + constraint foreign key fk_jahresabrechnung_summary_betriebskosten_abrechnung (abrechnung) + references betriebskosten_abrechnung(id) + on delete restrict + on update cascade, + constraint foreign key fk_jahresabrechnung_summary_mieter (mieter) + references mieter(id) + on delete restrict + on update cascade +) engine=InnoDB; delimiter // - create or replace procedure jahresabrechnung(in p_year year) modifies sql data begin @@ -59,26 +54,14 @@ begin declare v_error_message varchar(128); declare c_anteil_mieter cursor (cp_year year) for - select (b.betrag / o.flaeche * w.flaeche) as anteil, - o.id as objekt, - w.id as wohnung, - m.id as mieter, - (timestampdiff(month, - if (year(m.einzug) = b.jahr, m.einzug, makedate(b.jahr, 1)), - if (m.auszug is not null, m.auszug, last_day(makedate(b.jahr, 365))) - ) + 1) as nutzungszeit - from betriebskosten_abrechnung b, - objekt o, - wohnung w, - mieter m - where b.objekt = o.id and - w.objekt = o.id and - m.wohnung = w.id and - (year(m.einzug) = b.jahr or year(m.auszug) = b.jahr) and - b.jahr = cp_year; + select anteil, objekt, wohnung, mieter, abrechnung, + nutzungszeit, jahr + from betriebskosten_anteil_mieter + where jahr = cp_year; for rec in c_anteil_mieter(p_year) do set v_anteil_mieter_nutzungszeit = rec.anteil / 12 * rec.nutzungszeit; + select sum(betrag) into v_summe_zahlungen from zahlung where mieter = rec.mieter and @@ -87,31 +70,25 @@ begin set v_error_message = concat('No Zahlungen for Mieter ', rec.mieter); signal sqlstate '45000' set message_text = v_error_message; end if; + select sum(anteil_miete) into v_summe_mietforderungen from forderung where mieter = rec.mieter and year(datum) = p_year; + set v_summe_betriebskosten_zahlungen = v_summe_zahlungen - v_summe_mietforderungen; set v_betriebskosten_nachzahlung = v_anteil_mieter_nutzungszeit - v_summe_betriebskosten_zahlungen; - insert into forderung (mieter, datum, betrag, anteil_betriebskosten_nachzahlung, ref_wohnung) - values(rec.mieter, curdate(), v_betriebskosten_nachzahlung, v_betriebskosten_nachzahlung, rec.wohnung); - - call log(concat('Mieter: ', - cast(rec.mieter as char), - ', Anteil: ', - cast(v_anteil_mieter_nutzungszeit as char), - ', Zahlungen: ', - cast(v_summe_zahlungen as char), - ', Mietforderungen: ', - cast(v_summe_mietforderungen as char), - ', Betriebskostenvorauszahlung: ', - cast(v_summe_betriebskosten_zahlungen as char), - ', Rest: ', - cast(v_betriebskosten_nachzahlung as char) - ) - ); + insert into jahresabrechnung_summary (abrechnung, mieter, nutzungszeit, anteil_pro_flaeche, + anteil_pro_flaeche_nutzungszeit, vorauszahlung, + nachzahlung, summe_zahlungen, summe_zahlungen_anteil_miete) + values(rec.abrechnung, rec.mieter, rec.nutzungszeit, rec.anteil, + v_anteil_mieter_nutzungszeit, v_summe_betriebskosten_zahlungen, + v_betriebskosten_nachzahlung, v_summe_zahlungen, v_summe_mietforderungen); end for; end; // +delimiter ; + +