create or replace
function f_calc_capacity 
(p_einh_tag NUMBER,
p_berechnung3 IN NUMBER default 0, p_wert3 IN NUMBER default 0, p_einheit3 IN VARCHAR default 'h', p_faktor_be3 IN NUMBER default 1, 
p_berechnung4 IN NUMBER default 1, p_wert4 IN NUMBER default 0, p_einheit4 IN VARCHAR default 'h', p_faktor_be4 IN NUMBER default 1, 
p_berechnung5 IN NUMBER default 0, p_wert5 IN NUMBER default 0, p_einheit5 IN VARCHAR default 'h', p_faktor_be5 IN NUMBER default 1)

RETURN NUMBER 
IS 
 v_result       number;
 wert_std       number;
 berechnungstyp number;
 -- Default Values, falls Parameter als NULL geliefert werden
 einh_tag       number := 8;
 berechnung3    number(1) := 0;
 berechnung4    number(1) := 1;
 berechnung5    number(1) := 0;
 wert3          number(8,2) := 0;
 wert4          number(8,2) := 0;
 wert5          number(8,2) := 0;
 einheit3       varchar2(2) := 'h';
 einheit4       varchar2(2) := 'h';
 einheit5       varchar2(2) := 'h';
 faktor_be3     number(8,2) := 1;
 faktor_be4     number(8,2) := 1;
 faktor_be5     number(8,2) := 1;
 
BEGIN
/*
  Funktion berechnet die "verfüre Kapazität pro Basisperiode", anhand der 
  Faktor Parameter aus dem Ressourcendatenblatt.
  Default Faktoren im Standard -> GRUNDLAST, MEHRARBEIT, SONSTIGES
  Default Berechnungen im Standard -> GRUNDLAST (-), MEHRARBEIT (+), SONSTIGES (-)
*/

  -- Default Values überschreiben, falls Parameter Werte geliefert wurden
  if p_einh_tag is not null then einh_tag := p_einh_tag; end if;
  
  if p_berechnung3 is not null then berechnung3 := p_berechnung3; end if;  
  if p_berechnung4 is not null then berechnung4 := p_berechnung4; end if;  
  if p_berechnung5 is not null then berechnung5 := p_berechnung5; end if;
  
  if p_wert3 is not null then wert3 := p_wert3; end if; 
  if p_wert4 is not null then wert4 := p_wert4; end if; 
  if p_wert5 is not null then wert5 := p_wert5; end if; 
  
  if p_einheit3 is not null then einheit3 := p_einheit3; end if; 
  if p_einheit4 is not null then einheit4 := p_einheit4; end if; 
  if p_einheit5 is not null then einheit5 := p_einheit5; end if; 
  
  if p_faktor_be3 is not null then faktor_be3 := p_faktor_be3; end if; 
  if p_faktor_be4 is not null then faktor_be4 := p_faktor_be4; end if; 
  if p_faktor_be5 is not null then faktor_be5 := p_faktor_be5; end if; 
  
  v_result := einh_tag;
  
  ------------------------------------------------------------------------------  
  
  if einheit3 = 'h' then
  wert_std := wert3;
  elsif einheit3 = 'T' then
  wert_std := wert3 * faktor_be3;  
  else
  wert_std := wert3 / 100 * einh_tag; 
  end if;
  
  if berechnung3 = 0 then   -- Minus
  berechnungstyp := -1;
  else                      -- Plus
  berechnungstyp := 1;
  end if;
  
  v_result := v_result + (wert_std * berechnungstyp);
  
  ------------------------------------------------------------------------------
  
  if einheit4 = 'h' then
  wert_std := wert4;
  elsif einheit4 = 'T' then
  wert_std := wert4 * faktor_be4;  
  else
  wert_std := wert4 / 100 * einh_tag; 
  end if;
  
  if berechnung4 = 0 then   -- Minus
  berechnungstyp := -1;
  else                      -- Plus
  berechnungstyp := 1;
  end if;
    
  v_result := v_result + (wert_std * berechnungstyp);
  
  ------------------------------------------------------------------------------  
  
  if einheit5 = 'h' then
  wert_std := wert5;
  elsif einheit5 = 'T' then
  wert_std := wert5 * faktor_be5;  
  else
  wert_std := wert5 / 100 * einh_tag; 
  end if;
  
  if berechnung5 = 0 then   -- Minus
  berechnungstyp := -1;
  else                      -- Plus
  berechnungstyp := 1;
  end if;
  
  v_result := v_result + (wert_std * berechnungstyp);  
  
  ------------------------------------------------------------------------------  
  
return v_result;
  
END f_calc_capacity;