refactor jahresabrechnung

This commit is contained in:
2021-01-22 10:34:48 +01:00
parent f1b2e7abdb
commit 19ca0482df

View File

@ -1,14 +1,14 @@
create or replace view abrechnung1 as create or replace view betriebskosten_anteil_mieter as
select b.jahr as jahr, select (b.betrag / o.flaeche * w.flaeche) as anteil,
(b.betrag / o.flaeche * w.flaeche) as anteil, o.id as objekt,
o.shortname as objekt, w.id as wohnung,
w.shortname as wohnung, m.id as mieter,
concat(m.vorname, ' ', m.nachname) as mieter, b.id as abrechnung,
m.id as mieter_id,
(timestampdiff(month, (timestampdiff(month,
if (year(m.einzug) = b.jahr, m.einzug, makedate(b.jahr, 1)), 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))) if (m.auszug is not null, m.auszug, last_day(makedate(b.jahr, 365)))
) + 1) as nutzungszeit ) + 1) as nutzungszeit,
b. jahr as jahr
from betriebskosten_abrechnung b, from betriebskosten_abrechnung b,
objekt o, objekt o,
wohnung w, wohnung w,
@ -18,36 +18,31 @@ create or replace view abrechnung1 as
m.wohnung = w.id and m.wohnung = w.id and
(year(m.einzug) = b.jahr or year(m.auszug) = b.jahr); (year(m.einzug) = b.jahr or year(m.auszug) = b.jahr);
create or replace view abrechnung2 as create table jahresabrechnung_summary (
select jahr, id integer unsigned not null auto_increment,
anteil / 12 * nutzungszeit as anteil, abrechnung integer unsigned not null,
objekt, mieter integer unsigned not null,
wohnung, nutzungszeit integer not null,
mieter, anteil_pro_flaeche decimal(20, 10) not null,
mieter_id anteil_pro_flaeche_nutzungszeit decimal(20, 10) not null,
from abrechnung1; vorauszahlung decimal(20, 2) not null,
nachzahlung decimal(20, 2) not null,
create or replace view abrechnung3 as summe_zahlungen decimal(20, 2) not null,
select a.jahr as jahr, summe_zahlungen_anteil_miete decimal(20, 2) not null,
a.anteil as anteil, constraint primary key(id),
a.objekt as objekt, constraint unique key uk_jahresabrechnung_summary_mieter_abrechnung (abrechnung, mieter),
a.wohnung as wohnung, constraint foreign key fk_jahresabrechnung_summary_betriebskosten_abrechnung (abrechnung)
m.vorname as vorname, references betriebskosten_abrechnung(id)
m.nachname as nachname, on delete restrict
m.anrede as anrede, on update cascade,
m.strasse as strasse, constraint foreign key fk_jahresabrechnung_summary_mieter (mieter)
m.plz as plz, references mieter(id)
m.ort as ort on delete restrict
from abrechnung2 a, on update cascade
mieter m ) engine=InnoDB;
where m.id = a.mieter_id;
select * from abrechnung3 where jahr = '2020';
delimiter // delimiter //
create or replace procedure jahresabrechnung(in p_year year) create or replace procedure jahresabrechnung(in p_year year)
modifies sql data modifies sql data
begin begin
@ -59,26 +54,14 @@ begin
declare v_error_message varchar(128); declare v_error_message varchar(128);
declare c_anteil_mieter declare c_anteil_mieter
cursor (cp_year year) for cursor (cp_year year) for
select (b.betrag / o.flaeche * w.flaeche) as anteil, select anteil, objekt, wohnung, mieter, abrechnung,
o.id as objekt, nutzungszeit, jahr
w.id as wohnung, from betriebskosten_anteil_mieter
m.id as mieter, where jahr = cp_year;
(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;
for rec in c_anteil_mieter(p_year) do for rec in c_anteil_mieter(p_year) do
set v_anteil_mieter_nutzungszeit = rec.anteil / 12 * rec.nutzungszeit; set v_anteil_mieter_nutzungszeit = rec.anteil / 12 * rec.nutzungszeit;
select sum(betrag) into v_summe_zahlungen select sum(betrag) into v_summe_zahlungen
from zahlung from zahlung
where mieter = rec.mieter and where mieter = rec.mieter and
@ -87,31 +70,25 @@ begin
set v_error_message = concat('No Zahlungen for Mieter ', rec.mieter); set v_error_message = concat('No Zahlungen for Mieter ', rec.mieter);
signal sqlstate '45000' set message_text = v_error_message; signal sqlstate '45000' set message_text = v_error_message;
end if; end if;
select sum(anteil_miete) into v_summe_mietforderungen select sum(anteil_miete) into v_summe_mietforderungen
from forderung from forderung
where mieter = rec.mieter and where mieter = rec.mieter and
year(datum) = p_year; year(datum) = p_year;
set v_summe_betriebskosten_zahlungen = v_summe_zahlungen - v_summe_mietforderungen; set v_summe_betriebskosten_zahlungen = v_summe_zahlungen - v_summe_mietforderungen;
set v_betriebskosten_nachzahlung = v_anteil_mieter_nutzungszeit - v_summe_betriebskosten_zahlungen; set v_betriebskosten_nachzahlung = v_anteil_mieter_nutzungszeit - v_summe_betriebskosten_zahlungen;
insert into forderung (mieter, datum, betrag, anteil_betriebskosten_nachzahlung, ref_wohnung) insert into jahresabrechnung_summary (abrechnung, mieter, nutzungszeit, anteil_pro_flaeche,
values(rec.mieter, curdate(), v_betriebskosten_nachzahlung, v_betriebskosten_nachzahlung, rec.wohnung); anteil_pro_flaeche_nutzungszeit, vorauszahlung,
nachzahlung, summe_zahlungen, summe_zahlungen_anteil_miete)
call log(concat('Mieter: ', values(rec.abrechnung, rec.mieter, rec.nutzungszeit, rec.anteil,
cast(rec.mieter as char), v_anteil_mieter_nutzungszeit, v_summe_betriebskosten_zahlungen,
', Anteil: ', v_betriebskosten_nachzahlung, v_summe_zahlungen, v_summe_mietforderungen);
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)
)
);
end for; end for;
end; end;
// //
delimiter ;