Files
hv-schema/query-jahresabrechnung.sql

118 lines
4.3 KiB
SQL

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';
delimiter //
create or replace procedure jahresabrechnung(in p_year year)
modifies sql data
begin
declare v_anteil_mieter_nutzungszeit decimal(20, 10);
declare v_summe_zahlungen decimal(20, 10);
declare v_summe_mietforderungen decimal(20, 10);
declare v_summe_betriebskosten_zahlungen decimal(20, 10);
declare v_betriebskosten_nachzahlung decimal(20, 10);
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;
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
year(datum_soll) = p_year;
if (v_summe_zahlungen is null) then
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)
)
);
end for;
end;
//