
  
create or replace
PROCEDURE p_calc_periods (c_lizenz IN varchar2, c_user IN varchar2)
IS
BEGIN

  execute immediate q'[ALTER SESSION SET NLS_NUMERIC_CHARACTERS = '.''' ]';

  -- Temporäre Tabelle DT468_TEMP löschen
  execute immediate 'truncate table DT468_TEMP';

  update TEMP_PERIOD_CHANGES set done = 1 where done = 0;

  -- Datensätze in kalk_per anlegen
  insert /*append */ into DT468_TEMP 
  select  res                                 res,
          periode                             periode,
          max(arbeit)                         arbeit,
          
          case when max(arbeit) = 1
           then max(fak_menge) else 0 end          fak_menge,
          case when max(arbeit) = 1
          then max(urlaub) else 0 end         ferien,
          case when max(arbeit) = 1
          then max(abwesenheit) else 0 end    abwesenheit,
          
          case when max(arbeit) = 1
          then max(wert3) else 0 end        grundlast,
          case when max(arbeit) = 1  
          then max(wert4) else 0 end        operativ,
          
          case when max(arbeit) = 1  
          then max(wert5) else 0 end        sonstiges,
          
          case when max(arbeit) = 1
          then max(einh_tag) else 0 end     einh_tag,
            
          case when max(arbeit) = 1 and min(abwesenheit) = 0 and min(urlaub) = 0
          then 
          max(f_calc_capacity(einh_tag, ber3, wert3, einh3, fak_be3, 
                                        ber4, wert4, einh4, fak_be4, 
                                        ber5, wert5, einh5, fak_be5))
          else 0 end verf_kap,
            
          max(RSC)                                  RSC,
          ''                                        kommentar
  from   
         (select r.di001218                         res,
                 kal.di000997                       periode,
                 nvl(kal.DI000999,0)                arbeit,
                 di001234                           fak_menge,
                 
                 nvl(p.DI001340,0)                  urlaub,
                 nvl(p.DI001341,0)                  abwesenheit,
                 
                 r.di000270                         rsc,
                
                 di001233 einh_tag,
                 di001261 ber3,
                 di001267 ber4,
                 di001273 ber5,
                 di001262 wert3,
                 di001268 wert4,
                 di001268 wert5,
                 di001259 einh3,
                 di001265 einh4,
                 di001271 einh5,
                 di001260 fak_be3,
                 di001266 fak_be4,
                 di001272 fak_be5

          from   dt467 r
          
          inner join TEMP_PERIOD_CHANGES t on (di001218 = res_id)
          
          left outer join DT430 kal  
          on (kal.DI000475  = r.di001229 
          and kal.DI000997 >= t.startper 
          and kal.DI000997 <= t.endper)
          
          left outer join dt468 p  
          on (r.di001218 = p.DI001326 and p.DI001327 = kal.DI000997)
          
          where   t.done = 1
          
          and     t.startper  <> to_date('01.01.1970', 'DD.MM.YYYY')            -- Startperiode
          and     t.endper    <> to_date('01.01.1970', 'DD.MM.YYYY')            -- Endperiode
          
          -- Perioden nur anlegen, wenn die Ress. das Flag "Ressource wird beplant" = J gesetzt hat
          -- and DI002499 = 1
          
          -- Perioden nur anlegen, wenn die Ress. das Flag "Verfügbarkeit DS anlegen" = J gesetzt hat
          --and di102153 = 1
          
          -- Perioden nur anlegen, wenn die Ress. als VGR mit Aufwand Rest eingeplant ist
          -- and di001218 in (select di001392 from dt466 where di001423 > 0)  
          and     kal.DI000997 >= t.startper  
          and     kal.DI000997 <= t.endper
          ) f
          
  group by f.res, f.periode
  order by f.res, f.periode;

    --------------------------------------------
    -- dt468 neu anlegen
    MERGE INTO DT468
    USING
     (select * from DT468_TEMP
      where periode is not null) q
    on (di001326  = res 
    and di001327  = periode)
    
    WHEN MATCHED THEN UPDATE SET
    di001342 = grundlast,
    di001343 = operativ,
    di001344 = sonstiges,
    di001339 = einh_tag,
    di001337 = verf_kap,
    di002454 = verf_kap
    
    WHEN NOT MATCHED THEN INSERT
    (
    di001326,                                   -- res
    di001327,                                   -- periode
    di001364,                                   -- arbeit
    di001338,                                   -- Fak.-Menge/Tag
    di001340,                                   -- Ferien
    di001341,                                   -- Abwesenheit
    di001342,                                   -- Per. Faktor 3
    di001343,                                   -- Per. Faktor 4
    di001344,                                   -- Per. Faktor 5
    di001339,                                   -- Einh./Per.
    di001337,                                   -- verf. Kap.
    di002454,                                   -- verd. Kap.
    --DI101247,                                   -- RSC
    di002544,                                   -- Kommentar
    -- Objektschutz
    di001328,                                   -- angelegt am
    di001329,                                   -- geändert am
    di001330,                                   -- rwdu
    di001331,                                   -- angelegt von
    di001332,                                   -- geändert von
    di001333,                                   -- Own. Li
    di000598,                                   -- OSK
    di001334,                                   -- owner
    di001335,                                   -- group
    di001336                                    -- any
    )
    VALUES
    (
    res,                                        -- res
    periode,                                    -- periode
    arbeit,                                     -- arbeit
    fak_menge,                                  -- Fak.-Menge/Tag
    ferien,                                     -- Ferien
    abwesenheit,                                -- Abwesenheit
    grundlast,                                  -- Per. Faktor 3
    operativ,                                   -- Per. Faktor 4
    sonstiges,                                  -- Per. Faktor 5
    einh_tag,                                   -- Einh./Per.
    verf_kap,                                   -- verf. Kap.
    verf_kap,                                   -- verd. Kap.
    --RSC,                                        -- RSC
    kommentar,                                  -- Kommentar
    -- Objektschutz
    to_date(sysdate,'DD.MM.RRRR'),                -- Anlagedatum
    to_date(sysdate,'DD.MM.RRRR'),                -- Änderungsdatum
    7,                                            -- rwdu
    c_user,                                    -- Anlagebenutzer
    c_user,                                    -- Äderungsbenutzer
    c_lizenz,                                     -- Own.Liz.
    '',                                           -- OSK
    7,                                            -- Owner
    7,                                            -- Group
    7                                             -- Any
    );
  
   delete from TEMP_PERIOD_CHANGES where done = 1;

  commit;
  
END p_calc_periods;