refactor jahresabrechnung

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

View File

@ -1,53 +1,48 @@
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,
mieter m mieter m
where b.objekt = o.id and where b.objekt = o.id and
w.objekt = o.id and w.objekt = o.id and
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
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 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 // 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 ;