Als txt, pdf oder txt herunterladen
Als txt, pdf oder txt herunterladen
Sie sind auf Seite 1von 6

create or replace EDITIONABLE package body versicherungsservice as

/* Die Funktion prueft, ob der Vertrag in der Datenbank existiert


@param p_vertrags_id
@param v_vertrag_exists
@cursor cur_vertrag
@return */
function checkNichtExistierenderVertrag(
p_vertrags_id vertrag.id%type) return vertrag.id%type
as
v_vertrag_exists vertrag.id%type;
cursor cur_vertrag is
select id from vertrag where id = p_vertrags_id;
begin
open cur_vertrag;
loop
fetch cur_vertrag into v_vertrag_exists;
exit when cur_vertrag%notfound;
end loop;
close cur_vertrag;
return(v_vertrag_exists);
end checkNichtExistierenderVertrag;

/* Die Funktion prueft, ob die Deckungsart in der Datenbank existiert


@param p_deckungsart_id
@param v_deckungsart_exists
@cursor cur_deckungsart
@return */
function checkNichtExistierendeDeckungsart(
p_deckungsart_id deckungsart.id%type) return deckungsart.id%type
as
v_deckungsart_exists deckungsart.id%type;
cursor cur_deckungsart is
select id from deckungsart where id = p_deckungsart_id;
begin
open cur_deckungsart;
loop
fetch cur_deckungsart into v_deckungsart_exists;
exit when cur_deckungsart%notfound;
end loop;
close cur_deckungsart;
return(v_deckungsart_exists);
end checkNichtExistierendeDeckungsart;

/* Die Funktion prueft, ob die Deckungsart zum Produkt passt


@param p_vertrags_id
@param p_deckungsart_id
@param v_deckung_exists
@return */
function checkDeckungsartZuProdukt(p_vertrags_id vertrag.id%type,
p_deckungsart_id deckungsart.id%type) return deckungsart.id%type
as
v_deckung_exists deckungsart.id%type;
begin
begin
select deckungsart.id into v_deckung_exists
from deckungsart
join produkt
on produkt.id = deckungsart.produkt_fk
join vertrag
on vertrag.produkt_fk = produkt.id
where vertrag.id = p_vertrags_id
and deckungsart.id = p_deckungsart_id;
exception
when NO_DATA_FOUND then
v_deckung_exists := null;
return(v_deckung_exists);
end;
return(v_deckung_exists);
end checkDeckungsartZuProdukt;

/* Die Funktion prueft, ob die Deckungsart zum Produkt passt


@param p_vertrags_id
@param p_deckungsart_id
@param v_deckung_exists
@return */
function checkUngueltigerDeckungsbetrag(p_deckungsart_id deckungsart.id%type,
p_deckungsbetrag deckung.deckungsbetrag%type) return
deckungsbetrag.deckungsart_fk%type
as
v_deckungsbetrag_gueltig deckungsbetrag.deckungsart_fk%type;
begin
begin
select deckungsart.id into v_deckungsbetrag_gueltig
from deckungsart
left join deckungsbetrag
on deckungsbetrag.deckungsart_FK = deckungsart.id
where deckungsart.id = p_deckungsart_id
and deckungsbetrag = p_deckungsbetrag;
exception
when NO_DATA_FOUND then
v_deckungsbetrag_gueltig := null;
return(v_deckungsbetrag_gueltig);
end;
return(v_deckungsbetrag_gueltig);
end checkUngueltigerDeckungsbetrag;

/* Die Funktion prueft ob der Deckungspreis vorhanden ist


@param p_deckungsart_id
@param p_deckungsbetrag
@paramv_deckungspreis_vorh
@return */
function checkDeckungspreisVorhanden(
p_deckungsart_id deckungsart.id%type,
p_deckungsbetrag deckung.deckungsbetrag%type) return deckungspreis.preis%type
as
v_deckungspreis_vorh deckungspreis.preis%type;
begin
begin
select deckungspreis.preis into v_deckungspreis_vorh
from deckungsbetrag
join deckungspreis
on deckungspreis.deckungsbetrag_fk = deckungsbetrag.id
join deckungsart
on deckungsart.id = deckungsbetrag.deckungsart_fk
join produkt
on produkt.id = deckungsart.produkt_fk
join vertrag
on vertrag.produkt_fk = produkt.id
where extract(year from deckungspreis.gueltig_von) <= extract(year from
vertrag.versicherungsbeginn)
and extract(year from vertrag.versicherungsbeginn) <= extract(year from
deckungspreis.gueltig_bis)
and deckungsbetrag.deckungsbetrag = p_deckungsbetrag
and deckungsart.id = p_deckungsart_id
and rownum = 1;
exception when no_data_found then
v_deckungspreis_vorh := null;
return(v_deckungspreis_vorh);
end;
return(v_deckungspreis_vorh);
end checkDeckungspreisVorhanden;

/* Die Funktion prueft, ob das Alter des Kunden regelkonform ist.


@param p_vertrags_id
@param p_deckungsart_id
@param v_alter_vorzeichen
@param v_alter_vorzeichen
@param v_alter_ablr
@param v_resultAlter
@param v_alterKunde
@return */
function istAlterRegelkonform(
p_vertrags_id vertrag.id%type,
p_deckungsart_id deckungsart.id%type,
v_alter_vorzeichen varchar,
v_alter_ablr integer
)return boolean
as
v_resultAlter boolean;
v_alterKunde integer;
begin
-- Alter abrufen und in v_alterCheck abspeichern
select 2021-extract(year from geburtsdatum) into v_alterKunde
from vertrag join kunde on kunde.id = vertrag.kunde_fk
where vertrag.id = p_vertrags_id;

-- Prueft Alter des Kunden, wenn Deckungsart 1 oder 2 darf es nicht unter
18 sein
if v_alter_vorzeichen = '<' then
if v_alterKunde < v_alter_ablr then
v_resultAlter := true;
return (v_resultAlter);
end if;
elsif v_alter_vorzeichen = '>' then
if v_alterKunde > v_alter_ablr then
v_resultAlter := true;
return (v_resultAlter);
end if;
end if;
v_resultAlter := false;
return(v_resultAlter);
end istAlterRegelkonform;

/* Die Funktion prueft, ob das der Betrag den Regeln entspricht.


@param p_deckungsart_id
@param p_deckungsbetrag
@param v_betrag_vorzeichen
@param v_betrag_ablr_mit_minus
@param v_nichtRegelbasiert
@param v_betrag_ablr
@return */
function istBetragRegelkonform(
p_deckungsart_id deckungsart.id%type,
p_deckungsbetrag deckung.deckungsbetrag%type,
v_betrag_vorzeichen varchar,
v_betrag_ablr_mit_minus varchar) return boolean
as
v_nichtRegelbasiert boolean := false;
v_betrag_ablr integer;

begin
--Pruefen, ob minus in der Betragszeile, wenn ja dann Abbruch
if v_betrag_ablr_mit_minus = '-' then
v_nichtRegelbasiert := true;
return (v_nichtRegelbasiert);
else
v_betrag_ablr := cast(v_betrag_ablr_mit_minus as integer);
-- Prueft Betrag, ob stimmig mit der Ablehnungsregeltabelle
if v_betrag_vorzeichen = '=' then
if p_deckungsbetrag = v_betrag_ablr then
return (true);
end if;
elsif v_betrag_vorzeichen = '<' then
if p_deckungsbetrag < v_betrag_ablr then
return (true);
end if;
elsif v_betrag_vorzeichen = '<=' then
if p_deckungsbetrag <= v_betrag_ablr then
return (true);
end if;
elsif v_betrag_vorzeichen = '>' then
if p_deckungsbetrag > v_betrag_ablr then
return (true);
end if;
elsif v_betrag_vorzeichen = '>=' then
if p_deckungsbetrag >= v_betrag_ablr then
return (true);
end if;
end if;
end if;
return(v_nichtRegelbasiert);
end istBetragRegelkonform;
-----------------------------------------------------------------------------
-- transfer_sample
-----------------------------------------------------------------------------
procedure create_deckung (
p_vertrags_id vertrag.id%type,
p_deckungsart_id deckungsart.id%type,
p_deckungsbetrag deckung.deckungsbetrag%type
) as

v_vertrag_id_c vertrag.id%type;
v_deckungsart_id_c deckungsart.id%type;
v_deckung_c deckung.vertrag_fk%type;
v_deckungsbetrag_c deckungsbetrag.deckungsart_fk%type;
v_deckungspreis_vorh deckungsbetrag.id%type;
v_alterNichtRegelbasiert boolean;
v_betragNichtRegelbasiert boolean;

--Variablen fuer Betragscheck


type t_betrag_vorzeichen is table of varchar(2);
v_betrag_vorzeichen t_betrag_vorzeichen;
type t_betrag_ablr_mit_minus is table of varchar(255);
v_betrag_ablr_mit_minus t_betrag_ablr_mit_minus;

--Variablen fuer Alterscheck


type t_alter_vorzeichen is table of varchar(2);
v_alter_vorzeichen t_alter_vorzeichen;
type t_alter_ablr is table of integer;
v_alter_ablr t_alter_ablr;

begin
--Check, ob der Vertrag existiert
v_vertrag_id_c := checkNichtExistierenderVertrag(p_vertrags_id);

--Check, ob die Deckungsart existiert


v_deckungsart_id_c := checkNichtExistierendeDeckungsart (p_deckungsart_id);

-- Check, ob die Deckungsart zu dem Produkt passt


v_deckung_c := checkDeckungsartZuProdukt(p_vertrags_id, p_deckungsart_id);

-- Check, ob der Deckungsbetrag gueltig ist


v_deckungsbetrag_c := checkUngueltigerDeckungsbetrag(p_deckungsart_id,
p_deckungsbetrag);

-- Check, ob der Deckungspreis vorhanden ist


v_deckungspreis_vorh := checkDeckungspreisVorhanden(p_deckungsart_id,
p_deckungsbetrag);

--Exception ausloesen, wenn folgende Faelle vorliegen


if v_vertrag_id_c is null then
raise exc_vertrag_existiert_nicht;
elsif v_deckungsart_id_c is null then
raise exc_deckungsart_existiert_nicht;
elsif v_deckung_c is null then
raise exc_deckungsart_passt_nicht_zu_produkt;
elsif v_deckungsbetrag_c is null then
raise exc_ungueltiger_deckungsbetrag;
elsif v_deckungspreis_vorh is null then
raise exc_deckungspreis_nicht_vorhanden;
end if;

--Alter und Betrag wird aus den Ablehnungstabelle uebernehmen


select regexp_substr(r_alter, '[^ - ]+',1,1), cast(regexp_substr(r_alter, '[^ -
]+',1,2) as integer), regexp_substr(r_betrag, '[^ - ]+',1,1),
regexp_substr(r_betrag, '[^ - ]+',1,2)
bulk collect into v_alter_vorzeichen, v_alter_ablr, v_betrag_vorzeichen,
v_betrag_ablr_mit_minus
from deckungsart join ablehnungsregel on ablehnungsregel.deckungsart_fk =
deckungsart.id
where deckungsart_fk = p_deckungsart_id;

for i in 1..v_alter_ablr.count
loop
--Check Alter deklarieren
v_alterNichtRegelbasiert := istAlterRegelkonform(p_vertrags_id,
p_deckungsart_id, v_alter_vorzeichen(i), v_alter_ablr(i));
--Check Amount deklarieren
v_betragNichtRegelbasiert := istBetragRegelkonform(p_deckungsart_id,
p_deckungsbetrag, v_betrag_vorzeichen(i), v_betrag_ablr_mit_minus(i));

-- Exception sofort ausloesen, wenn deckungsart 1 oder 2 nicht erfuellt


ist, sonst pruefen, ob Alter oder Betrag etc. passt
if p_deckungsart_id = 1 or p_deckungsart_id = 2 then
if v_alterNichtRegelbasiert = true then
raise exc_deckungsart_nicht_regelkonform;
end if;
elsif p_deckungsart_id = 3 then
if v_alterNichtRegelbasiert and v_betragNichtRegelbasiert then
raise exc_deckungsart_nicht_regelkonform;
end if;
end if;

end loop;

insert into deckung values(p_vertrags_id, p_deckungsart_id, p_deckungsbetrag);

end create_deckung;

end versicherungsservice;

Das könnte Ihnen auch gefallen