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
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 ;