118 lines
4.3 KiB
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;
|
|
//
|
|
|