--
-- $Id$
--
-- Script containing customer specific configuration sql statements for AASA: Arcadis Aqumen Facility Management for Sabic

DEFINE thisfile = 'AASA.SQL'
DEFINE dbuser   = '^AASA'

SET ECHO ON
SET DEFINE ON
COLUMN fcltlogfile NEW_VALUE fcltlogfile NOPRINT;
WHENEVER SQLERROR EXIT;
SELECT adm.scriptspoolfile('&dbuser', '&thisfile') AS fcltlogfile FROM DUAL;
WHENEVER SQLERROR CONTINUE;
SPOOL &fcltlogfile
SET DEFINE OFF

------ payload begin ------

-- script om dagelijks terugkerende scripts aan te roepen.
CREATE OR REPLACE PROCEDURE aasa_select_daily_task (p_applname   IN   VARCHAR2, p_applrun    IN   VARCHAR2)
AS
BEGIN
   aaxx_daily_task (p_applname, p_applrun);
END;
/

-- budgettracker overrules
CREATE OR REPLACE VIEW aasa_v_export_budget_tracker   (RESULT, result_order) AS SELECT RESULT, result_order FROM aaxx_v_export_budget_tracker;

-- export overrules
-- exact
CREATE OR REPLACE VIEW aasa_v_export_exact            (RESULT, result_order) AS SELECT RESULT, result_order FROM aaxx_v_export_exact_xml;
CREATE OR REPLACE PROCEDURE aasa_select_exact (
   p_applname   IN   VARCHAR2,
   p_applrun    IN   VARCHAR2
)
AS
BEGIN
  aaxx_select_exact_xml(p_applname, p_applrun);
END;
/

CREATE OR REPLACE PROCEDURE aasa_export_exact (
   p_applname   IN   VARCHAR2,
   p_applrun    IN   VARCHAR2,
   p_filedir    IN   VARCHAR2,
   p_filename   IN   VARCHAR2
)
AS
BEGIN
  aaxx_export_exact(p_applname, p_applrun, p_filedir, p_filename);
END;
/

CREATE OR REPLACE VIEW aasa_v_export_verwerk_exact    (RESULT, result_order) AS SELECT RESULT, result_order FROM aaxx_v_export_verwerk_exact;
CREATE OR REPLACE PROCEDURE aasa_export_verwerk_exact (
   p_applname   IN   VARCHAR2,
   p_applrun    IN   VARCHAR2,
   p_filedir    IN   VARCHAR2,
   p_filename   IN   VARCHAR2
)
AS
BEGIN
  aaxx_export_verwerk_exact(p_applname, p_applrun, p_filedir, p_filename);
END;
/

-- bundel catering
-- Als de kostenplaats bij de reservering begint met 77 dan wordt de (top)kostenplaats bepaald a.d.h.v. de cateraar.
CREATE OR REPLACE VIEW aasa_v_catering_kpn
(
   res_rsv_artikel_key,
   res_rsv_artikel_prijs,
   res_rsv_artikel_levering,
   prs_bedrijf_key,
   bu_kostenplaats_key
)
AS
SELECT res_rsv_artikel_key,
       res_rsv_artikel_prijs,
       res_rsv_artikel_levering,
       rdp.prs_bedrijf_key,
       DECODE(SUBSTR(k.prs_kostenplaats_nr, 1,2)
          , '77', DECODE(rdp.prs_bedrijf_key, 66700, 4270    -- Compass Group NL h.o.d.n. Eurest (913910)
                                                   , 247)    -- Appèl (101025)
          ,  (SELECT DISTINCT ta.prs_kostenplaats_key
                FROM prs_afdeling a, prs_v_afdeling_boom ab, prs_afdeling ta
               WHERE     rrr.prs_kostenplaats_key = a.prs_kostenplaats_key
                     AND a.prs_afdeling_key = ab.prs_afdeling_key
                     AND ta.prs_bedrijf_key IS NOT NULL
                     AND ta.prs_afdeling_verwijder IS NULL
                     AND ab.prs_afdeling_key1 = ta.prs_afdeling_key))
           bukpn
  FROM res_rsv_ruimte   rrr,
       res_rsv_artikel  rra,
       res_artikel      ra,
       res_disc_params  rdp,
       prs_kostenplaats k
 WHERE     rrr.res_rsv_ruimte_key = rra.res_rsv_ruimte_key
       AND rra.res_artikel_key = ra.res_artikel_key
       AND ra.res_discipline_key = rdp.res_ins_discipline_key
       AND rrr.res_rsv_ruimte_verwijder IS NULL
       AND rra.res_rsv_artikel_verwijder IS NULL
       AND rra.res_status_bo_key = 5
       AND rrr.prs_kostenplaats_key = k.prs_kostenplaats_key(+);

CREATE OR REPLACE VIEW aasa_v_export_bundel_catering
(
   result,
   result_order
)
AS
   SELECT res_rsv_artikel_key || ';' || res_rsv_artikel_prijs result,
          res_rsv_artikel_key result_order
     FROM aasa_v_catering_kpn;


CREATE OR REPLACE PROCEDURE aasa_export_bundel_catering (
   p_applname   IN VARCHAR2,
   p_applrun    IN VARCHAR2,
   p_filedir    IN VARCHAR2,
   p_filename   IN VARCHAR2)
AS
   CURSOR c_bedr
   IS
        SELECT prs_bedrijf_key
          FROM res_disc_params
         GROUP BY prs_bedrijf_key;

   CURSOR c_kpn (lev_date DATE, p_bedrijf_key NUMBER)
   IS
        SELECT bu_kostenplaats_key, sum(res_rsv_artikel_prijs) prijs
          FROM aasa_v_catering_kpn
         WHERE res_rsv_artikel_levering < lev_date
           AND prs_bedrijf_key = p_bedrijf_key
      GROUP BY bu_kostenplaats_key;

   c_catmld_uitvoertijd          mld_stdmelding.mld_stdmelding_t_uitvoertijd%TYPE := MLD_T_UITVOERTIJD(2, 'D');
   v_errormsg                      VARCHAR (200);
   oracle_err_num                  NUMBER;
   oracle_err_mes                  VARCHAR2 (200);
   v_laatste_export                DATE;
   v_mld_melding_key               NUMBER;
   v_mld_opdr_key                  NUMBER;
   v_prs_bedrijf_key               NUMBER;
   v_prs_dienst_key                NUMBER;
   v_alg_gebouw_key                NUMBER;
   v_alg_locatie_key               NUMBER;
   v_mld_opdr_bedrijfopdr_volgnr   NUMBER;
   v_aanvrager                     NUMBER;
   v_mld_workorder_key             NUMBER;
   v_mld_stdmelding_key            NUMBER;
   v_date                          DATE;
   v_month                         VARCHAR2(30);
   v_count                         NUMBER;
BEGIN
   -- Facilitor
   v_aanvrager := 4;
   -- key van opdrachttype workorder
   v_mld_workorder_key := 2;

   v_errormsg := 'Bepaal einddatum';

   -- wat is de eerste dag van de huidige maand
   v_date := TO_DATE (TO_CHAR (SYSDATE, 'yyyymm') || '01', 'yyyymmdd');
   v_month := REPLACE(TO_CHAR (v_date-1, 'month-yyyy', 'NLS_DATE_LANGUAGE = ''dutch'''), ' ', '');

   SELECT COUNT (mld_opdr_key)
     INTO v_count
     FROM mld_opdr
    WHERE mld_opdr_omschrijving = 'Cateringreserveringen maand: ' || v_month;

   IF v_count > 0
   THEN
      fac.writelog (
         p_applname,
         'E',
         'Catering export is al eerder uitgevoerd.',
         'Controleer opdrachten met omschrijving: '
         || 'Cateringreserveringen maand: ' || v_month);
   ELSE
      FOR rec1 IN c_bedr
      LOOP
         BEGIN
            FOR rec IN c_kpn (v_date, rec1.prs_bedrijf_key)
            LOOP
               BEGIN
                  IF rec1.prs_bedrijf_key = 66700    -- Compass Group NL h.o.d.n. Eurest
                  THEN
                     -- stdmelding key voor recharge
                     v_mld_stdmelding_key := 2161;      -- SA IP-Catering (int) Recharge
                     -- key van gebouw waar catering op geboekt mag worden
                     v_alg_gebouw_key := 3441;                                    -- ADC
                     v_alg_locatie_key := 101;                                    -- BoZ
                  ELSE
                     -- stdmelding key voor recharge
                     v_mld_stdmelding_key := 2001;
                     -- key van gebouw waar catering op geboekt mag worden
                     v_alg_gebouw_key := 1823;
                     v_alg_locatie_key := 63;
                  END IF;

                  IF rec.bu_kostenplaats_key IS NOT NULL
                  THEN
                     -- controleer of ik een melding heb op deze kpn
                     BEGIN
                        v_errormsg := 'Opzoeken catering melding';

                        SELECT mld_melding_key
                          INTO v_mld_melding_key
                          FROM mld_melding
                         WHERE prs_kostenplaats_key = rec.bu_kostenplaats_key
                           AND mld_stdmelding_key = v_mld_stdmelding_key
                           AND v_date BETWEEN mld_melding_datum
                                          AND  mld_melding_einddatum + 1;
                     EXCEPTION
                        WHEN NO_DATA_FOUND
                        THEN
                           -- geen melding voor deze locatie gevonden. Dan maken we er maar een aan.

                           v_errormsg := 'Aanmaken catering melding';

                           BEGIN
                              INSERT INTO mld_melding (mld_melding_omschrijving,
                                                       prs_perslid_key,
                                                       prs_kostenplaats_key,
                                                       mld_stdmelding_key,
                                                       mld_alg_locatie_key,
                                                       mld_alg_onroerendgoed_keys,
                                                       mld_melding_einddatum,
                                                       mld_melding_datum,
                                                       mld_melding_t_uitvoertijd,
                                                       mld_meldbron_key,
                                                       mld_melding_module,
                                                       mld_melding_spoed)
                                  VALUES ('Catering factuur boekingen',
                                          v_aanvrager,
                                          rec.bu_kostenplaats_key,
                                          v_mld_stdmelding_key,
                                          v_alg_locatie_key,
                                          v_alg_gebouw_key,
                                          TO_DATE (TO_CHAR (v_date, 'YYYY') || '1231',
                                                   'YYYYMMDD'),
                                          TO_DATE (TO_CHAR (v_date, 'YYYY') || '0101',
                                                   'YYYYMMDD'),
                                          c_catmld_uitvoertijd,
                                          5,
                                          'MLD',
                                          3)
                               RETURNING mld_melding_key
                                    INTO v_mld_melding_key;

                              BEGIN
                                 mld.setmeldingstatus (v_mld_melding_key, 2, v_aanvrager);
                              END;

                              BEGIN
                                 mld.setmeldingstatus (v_mld_melding_key, 4, v_aanvrager);
                              END;

                              UPDATE mld_melding
                                 SET mld_melding_behandelaar_key = v_aanvrager
                               WHERE mld_melding_key = v_mld_melding_key;
                           END;
                     END;

                     -- nu gaan we de opdracht aanmaken
                     BEGIN
                        v_mld_opdr_bedrijfopdr_volgnr :=
                           mld.bepaalopdrmeldingvolgnr (v_mld_melding_key);

                        v_errormsg :=
                           'Maak opdracht aan om factuur van cateraar te matchen';

                        -- maak opdracht aan om cateringfactuur van leverancier te matchen
                        INSERT INTO mld_opdr (mld_melding_key,
                                              prs_kostenplaats_key,
                                              mld_statusopdr_key,
                                              mld_typeopdr_key,
                                              prs_perslid_key,
                                              mld_uitvoerende_keys,
                                              mld_opdr_datumbegin,
                                              mld_opdr_einddatum,
                                              mld_opdr_module,
                                              mld_opdr_omschrijving,
                                              mld_opdr_materiaal,
                                              mld_opdr_kosten,
                                              mld_opdr_bedrijfopdr_volgnr)
                        VALUES ( v_mld_melding_key,
                                 rec.bu_kostenplaats_key,
                                 5,                                     -- uitgegeven
                                 v_mld_workorder_key,
                                 v_aanvrager,
                                 rec1.prs_bedrijf_key,
                                 v_date - 1,
                                 fac.datumtijdplusuitvoertijd (SYSDATE, 1, 'DAGEN'),
                                 'MLD',
                                 'Cateringreserveringen maand: ' || v_month,
                                 rec.prijs,
                                 rec.prijs,
                                 v_mld_opdr_bedrijfopdr_volgnr)
                        RETURNING mld_opdr_key INTO v_mld_opdr_key;

                        v_errormsg := 'Update melding status';
                        mld.updatemeldingstatus (v_mld_melding_key, 0, v_aanvrager); -- Facilitor
                        -- meld de opdracht af
                        MLD.setopdrachtstatus (v_mld_opdr_key, 6, v_aanvrager);

                        v_errormsg := 'Voeg regels toe aan mapping tabel';

                        INSERT INTO aaxx_bundel_catering_ref (mld_opdr_key, res_rsv_artikel_key, res_rsv_artikel_prijs, res_rsv_artikel_verwerkt)
                              SELECT v_mld_opdr_key, res_rsv_artikel_key, res_rsv_artikel_prijs, v_date
                                FROM aasa_v_catering_kpn c
                               WHERE res_rsv_artikel_levering < v_date
                                 AND COALESCE(c.bu_kostenplaats_key, -1) = COALESCE(rec.bu_kostenplaats_key, -1);

                        v_errormsg := 'Pas de status van de artikelen aan ' || v_mld_opdr_key;
                        UPDATE res_rsv_artikel rra
                           SET res_rsv_artikel_verwerkt = SYSDATE,
                               res_status_bo_key = 6
                         WHERE EXISTS
                                  (SELECT mld_opdr_key
                                     FROM aaxx_bundel_catering_ref bc
                                    WHERE bc.mld_opdr_key  = v_mld_opdr_key
                                      AND bc.res_rsv_artikel_key = rra.res_rsv_artikel_key);


                     EXCEPTION
                        WHEN OTHERS
                        THEN
                           oracle_err_num := SQLCODE;
                           oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
                           v_errormsg := v_errormsg || ' ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
                           fac.writelog (p_applname, 'E', v_errormsg, '');

                     END;
                  ELSE
                     fac.writelog (p_applname, 'E', 'Een bedrag van: ' || rec.prijs || ' euro kan niet aan een kostenplaats gekoppeld worden!', '');
                  END IF;
               END;
            END LOOP;
         END;
      END LOOP;
   END IF;

   COMMIT;
END;
/


CREATE OR REPLACE VIEW aasa_v_rap_catering_inkoop
(
    fclt_f_exportjob,
    fclt_f_bedrijf,
    afleveradres,
    fclt_f_afleverdatum,
    tijdstip,
    bestelnummer,
    fclt_f_artikelnummer,
    artikelomschrijving,
    interne_artikelprijs,
    aantal,
    fclt_f_besteller,
    afdeling
)
AS
    SELECT TO_CHAR (rra.res_rsv_artikel_verwerkt, 'dd-mm-yyyy'),
           prs_bedrijf_naam,
              alg_locatie_code
           || '-'
           || alg_gebouw_code
           || '-'
           || alg_verdieping_code
           || '-'
           || alg_ruimte_nr
           || ' ('
           || alg_ruimte_omschrijving
           || ')'
               afleveradres,
           TO_CHAR (rra.res_rsv_artikel_levering, 'dd-mm-yyyy')
               datum,
           TO_CHAR (rra.res_rsv_artikel_levering, 'hh24:mi')
               tijd,
           res_reservering_key || '/' || res_rsv_ruimte_volgnr
               bestelnummer,
           res_artikel_nr
               artikelnummer,
           res_artikel_omschrijving
               artikelomschrijving,
           ROUND ((rra.res_rsv_artikel_prijs / rra.res_rsv_artikel_aantal),
                  5)
               interneprijs,
           rra.res_rsv_artikel_aantal
               aantal,
           pf.prs_perslid_naam_full
               besteller,
           k.prs_kostenplaats_nr || '-' || k.prs_kostenplaats_omschrijving
      FROM res_rsv_ruimte               rrr,
           aaxx_bundel_catering_ref     bu,
           prs_bedrijf                  b,
           res_rsv_artikel              rra,
           alg_ruimte                   r,
           alg_verdieping               v,
           alg_gebouw                   g,
           alg_locatie                  l,
           prs_perslid                  p,
           prs_v_perslid_fullnames_all  pf,
           prs_kostenplaats             k,
           res_artikel                  ra,
           mld_opdr                     o,
           (  SELECT COALESCE (MAX (ir2a.alg_ruimte_key), irrr.alg_ruimte_key)
                         alg_ruimte_key,
                     irrr.res_rsv_ruimte_key
                FROM res_rsv_ruimte irrr, res_v_rsv_ruimte_2_alg_ruimte ir2a
               WHERE irrr.res_rsv_ruimte_key = ir2a.res_rsv_ruimte_key(+)
            GROUP BY irrr.res_rsv_ruimte_key, irrr.alg_ruimte_key) r2a
     WHERE     rrr.res_rsv_ruimte_key = rra.res_rsv_ruimte_key
           AND rrr.prs_kostenplaats_key = k.prs_kostenplaats_key
           AND r2a.res_rsv_ruimte_key = rrr.res_rsv_ruimte_key
           AND r2a.alg_ruimte_key = r.alg_ruimte_key
           AND r.alg_verdieping_key = v.alg_verdieping_key
           AND v.alg_gebouw_key = g.alg_gebouw_key
           AND g.alg_locatie_key = l.alg_locatie_key
           AND rrr.res_rsv_ruimte_host_key = p.prs_perslid_key
           AND p.prs_perslid_key = pf.prs_perslid_key
           AND rra.res_rsv_artikel_verwijder IS NULL
           AND rra.res_status_bo_key = 6
           AND rra.res_artikel_key = ra.res_artikel_key
           AND rra.res_rsv_artikel_levering >
               TO_DATE ('20110901', 'yyyymmdd')
           AND rra.res_rsv_artikel_key = bu.res_rsv_artikel_key(+)
           AND bu.mld_opdr_key = o.mld_opdr_key(+)
           AND o.mld_uitvoerende_keys = b.prs_bedrijf_key(+);


CREATE OR REPLACE VIEW aasa_v_rap_catering_verkoop
(
    fclt_f_bedrijf,
    reservering,
    afleveradres,
    fclt_f_FDC,
    FDC_omschrijving,
    costcenter,
    boekingsdatum,
    fclt_f_periode,
    aanvrager,
    btw,
    totaal
)
AS
      SELECT bedrijf,
             reservering,
             afleveradres,
             kostenplaats_nr,
             kostenplaats,
             costcenter,
             boekingsdatum,
             periode,
             aanvrager,
             btw,
             SUM (totaalprijs)
        FROM (SELECT b.prs_bedrijf_naam
                         bedrijf,
                        rrr.res_reservering_key
                     || '/'
                     || rrr.res_rsv_ruimte_volgnr
                         reservering,
                     (SELECT alg_gebouw_code
                        FROM alg_gebouw g, alg_verdieping v, alg_ruimte r
                       WHERE     r.alg_ruimte_key =
                                 COALESCE (rrr.alg_ruimte_key,
                                           r2a.alg_ruimte_key)
                             AND r.alg_verdieping_key = v.alg_verdieping_key
                             AND v.alg_gebouw_key = g.alg_gebouw_key)
                         afleveradres,
                     k.prs_kostenplaats_nr
                         kostenplaats_nr,
                     k.prs_kostenplaats_omschrijving
                         kostenplaats,
                     (SELECT MAX (res_kenmerkreservering_waarde)
                        FROM res_kenmerkwaarde kw, res_kenmerk rk
                       WHERE     kw.res_kenmerk_key = rk.res_kenmerk_key
                             AND kw.res_rsv_ruimte_key = rrr.res_rsv_ruimte_key
                             AND kw.res_kenmerkwaarde_verwijder IS NULL
                             AND rk.res_srtkenmerk_key = 1)
                         costcenter,
                     TO_CHAR (rra.res_rsv_artikel_levering, 'dd-mm-yyyy')
                         boekingsdatum,
                     TO_CHAR (ADD_MONTHS (rra.res_rsv_artikel_verwerkt, -1),
                              'yyyy-mm')
                         periode,
                     pf.prs_perslid_naam_full
                         aanvrager,
                     rra.res_rsv_artikel_btw
                         btw,
                     rra.res_rsv_artikel_prijs
                         totaalprijs
                FROM res_rsv_artikel            rra,
                     res_rsv_ruimte             rrr,
                     prs_kostenplaats           k,
                     prs_perslid                p,
                     prs_afdeling               a,
                     mld_opdr                   o,
                     prs_bedrijf                b,
                     aaxx_bundel_catering_ref   bu,
                     prs_v_perslid_fullnames_all pf,
                     (  SELECT res_rsv_ruimte_key,
                               MAX (alg_ruimte_key) alg_ruimte_key
                          FROM res_v_rsv_ruimte_2_alg_ruimte
                      GROUP BY res_rsv_ruimte_key) r2a,
                     res_artikel                ra
               WHERE     rra.res_status_bo_key = 6
                     AND rra.res_rsv_ruimte_key = rrr.res_rsv_ruimte_key
                     AND rrr.prs_kostenplaats_key = k.prs_kostenplaats_key
                     AND rrr.res_rsv_ruimte_host_key = p.prs_perslid_key
                     AND rrr.res_rsv_ruimte_key = r2a.res_rsv_ruimte_key(+)
                     AND p.prs_afdeling_key = a.prs_afdeling_key
                     AND p.prs_perslid_key = pf.prs_perslid_key
                     AND rra.res_artikel_key = ra.res_artikel_key
                     AND rra.res_rsv_artikel_key = bu.res_rsv_artikel_key(+)
                     AND bu.mld_opdr_key = o.mld_opdr_key(+)
                     AND o.mld_uitvoerende_keys = b.prs_bedrijf_key(+)
                     AND rra.res_rsv_artikel_levering >
                         TO_DATE ('20110901', 'yyyymmdd'))
    GROUP BY bedrijf,
             reservering,
             afleveradres,
             kostenplaats_nr,
             kostenplaats,
             costcenter,
             boekingsdatum,
             periode,
             aanvrager,
             btw;

-- exact verkoop
CREATE OR REPLACE VIEW aasa_v_export_exact_verkoop    (RESULT, result_order) AS SELECT RESULT, result_order FROM aaxx_v_export_exact_verkoop;
CREATE OR REPLACE PROCEDURE aasa_select_exact_verkoop (
   p_applname   IN   VARCHAR2,
   p_applrun    IN   VARCHAR2
)
AS
BEGIN
  aaxx_select_exact_verkoop(p_applname, p_applrun, to_char(sysdate, 'yyyy'));
END;
/
CREATE OR REPLACE PROCEDURE aasa_export_exact_verkoop (
   p_applname   IN   VARCHAR2,
   p_applrun    IN   VARCHAR2,
   p_filedir    IN   VARCHAR2,
   p_filename   IN   VARCHAR2
)
AS
BEGIN
  aaxx_export_exact_verkoop(p_applname, p_applrun, p_filedir, p_filename, to_char(sysdate, 'yyyy'));
END;
/

-- exact verkoop over het vorige jaar
CREATE OR REPLACE VIEW aasa_v_export_exact_verkoop_vj    (RESULT, result_order) AS SELECT RESULT, result_order FROM aaxx_v_export_exact_verkoop;
CREATE OR REPLACE PROCEDURE aasa_select_exact_verkoop_vj (
   p_applname   IN   VARCHAR2,
   p_applrun    IN   VARCHAR2
)
AS
BEGIN
  aaxx_select_exact_verkoop(p_applname, p_applrun, to_char(to_number(to_char(sysdate, 'yyyy'))-1));
END;
/
CREATE OR REPLACE PROCEDURE aasa_export_exact_verkoop_vj (
   p_applname   IN   VARCHAR2,
   p_applrun    IN   VARCHAR2,
   p_filedir    IN   VARCHAR2,
   p_filename   IN   VARCHAR2
)
AS
BEGIN
  aaxx_export_exact_verkoop(p_applname, p_applrun, p_filedir, p_filename, to_char(to_number(to_char(sysdate, 'yyyy'))-1));
END;
/

-- exact projecturen (XML)
CREATE OR REPLACE VIEW aasa_v_export_exact_uren (result, result_order)
AS SELECT result, result_order FROM aaxx_v_export_exact_uren_xml;
CREATE OR REPLACE PROCEDURE aasa_select_exact_uren (
   p_applname   IN   VARCHAR2,
   p_applrun    IN   VARCHAR2
)
AS
BEGIN
  aaxx_select_exact_uren_xml(p_applname, p_applrun, '');
END;
/

-- verwerk exact projecturen (XML)
CREATE OR REPLACE PROCEDURE aasa_export_verwerk_exact_uren (
   p_applname   IN   VARCHAR2,
   p_applrun    IN   VARCHAR2,
   p_filedir    IN   VARCHAR2,
   p_filename   IN   VARCHAR2
)
AS
BEGIN
  aaxx_export_verwerk_exact_uren(p_applname, p_applrun, p_filedir, p_filename, '');
END;
/

-- import overrulles
-- import srtruimte
CREATE OR REPLACE PROCEDURE aasa_import_contract (p_import_key IN NUMBER)
AS
BEGIN
  aaxx_import_contract(p_import_key);
END;
/

CREATE OR REPLACE PROCEDURE aasa_update_contract (p_import_key IN NUMBER)
AS
BEGIN
  aaxx_update_contract(p_import_key);
END;
/

CREATE OR REPLACE PROCEDURE aasa_import_ruimte (p_import_key IN NUMBER)
AS
BEGIN
  aaxx_import_ruimte(p_import_key);
END;
/

CREATE OR REPLACE PROCEDURE aasa_update_ruimte (p_import_key IN NUMBER)
AS
BEGIN
  aaxx_update_ruimte(p_import_key);
END;
/

-- view voor gebouwlistbox bij bewonermutaties. Ivm nieuwe mobilisatie mogen alleen
-- de nieuw toegevoegde gebouwen hier getoond worden.
CREATE OR REPLACE VIEW aasa_v_gebouw
(
   alg_gebouw_key,
   alg_gebouw_omschrijving
)
AS
   SELECT alg_gebouw_key, alg_gebouw_omschrijving
     FROM alg_gebouw
    WHERE alg_gebouw_verwijder IS NULL
      AND alg_gebouw_aanmaak > TO_DATE ('20131217', 'yyyymmdd');

CREATE OR REPLACE VIEW aasa_v_rap_gebouw_geg
(
   code,
   fclt_f_vak,
   gebouwnr,
   gebouwnaam,
   fclt_f_fm_er,
   fclt_f_eigenaar,
   fclt_f_klantcode,
   fclt_f_business_unit,
   fclt_f_maint_cat,
   m2,
   code_exact
)
AS
   SELECT alg_gebouw_code code,
          SUBSTR (alg_gebouw_code, 1, 3) vak,
          SUBSTR (alg_gebouw_code, 5, 3) gebouwnr,
          alg_gebouw_naam gebouwnaam,
          (SELECT ud.fac_usrdata_omschr
             FROM fac_usrdata ud, alg_onrgoedkenmerk ogk
            WHERE     ogk.alg_onrgoed_key = g.alg_gebouw_key
                  AND ogk.alg_onrgoedkenmerk_waarde = ud.fac_usrdata_key
                  AND ogk.alg_kenmerk_key = 1040)
             fmer,
          (SELECT ud.fac_usrdata_omschr
             FROM fac_usrdata ud, alg_onrgoedkenmerk ogk
            WHERE     ogk.alg_onrgoed_key = g.alg_gebouw_key
                  AND ogk.alg_onrgoedkenmerk_waarde = ud.fac_usrdata_key
                  AND ogk.alg_kenmerk_key = 1080)
             eigenaar,
          k.prs_kostenplaats_nr klantcode,
          (SELECT ud.fac_usrdata_omschr
             FROM fac_usrdata ud, alg_onrgoedkenmerk ogk
            WHERE     ogk.alg_onrgoed_key = g.alg_gebouw_key
                  AND ogk.alg_onrgoedkenmerk_waarde = ud.fac_usrdata_key
                  AND ogk.alg_kenmerk_key = 1100)
             businessunit,
          (SELECT ud.fac_usrdata_omschr
             FROM fac_usrdata ud, alg_onrgoedkenmerk ogk
            WHERE     ogk.alg_onrgoed_key = g.alg_gebouw_key
                  AND ogk.alg_onrgoedkenmerk_waarde = ud.fac_usrdata_key
                  AND ogk.alg_kenmerk_key = 1140)
             maintcat,
          g.alg_gebouw_bruto_vloeropp m2,
          (SELECT alg_onrgoedkenmerk_waarde
             FROM alg_onrgoedkenmerk ogk
            WHERE ogk.alg_onrgoed_key = g.alg_gebouw_key
                  AND ogk.alg_kenmerk_key = 1120)
             exactcode
     FROM alg_v_aanweziggebouw g, prs_kostenplaats k
    WHERE g.prs_kostenplaats_key = k.prs_kostenplaats_key(+);


CREATE OR REPLACE VIEW aasa_v_rap_perslidgegevens
(
   fclt_f_locatie,
   fclt_f_gebouw,
   verdieping,
   naam,
   lockernummer,
   postvak,
   telefoon,
   mobielnr,
   email,
   personeelsnr,
   inhuur,
   dienstverband,
   organisatie,
   functie
)
AS
   SELECT alg_locatie_omschrijving,
          alg_gebouw_upper,
          alg_verdieping_code,
          prs_perslid_naam_full,
          lo.ins_deel_omschrijving,
          pv.fac_usrdata_omschr,
          p.prs_perslid_telefoonnr,
          p.prs_perslid_mobiel,
          p.prs_perslid_email,
          p.prs_perslid_nr,
          ih.prs_kenmerklink_waarde,
          p.prs_perslid_dienstverband,
          a.prs_afdeling_omschrijving,
          sp.prs_srtperslid_omschrijving
     FROM prs_perslid p,
          prs_afdeling a,
          prs_srtperslid sp,
          prs_v_perslid_fullnames pf,
          prs_v_werkplekperslid_gegevens wp,
          alg_locatie l,
          (SELECT *
             FROM prs_kenmerklink kl, fac_usrdata ud
            WHERE prs_kenmerklink_waarde = ud.fac_usrdata_key
              AND prs_kenmerk_key = 1060) pv,                       -- postvak
          (SELECT *
             FROM prs_kenmerklink
            WHERE prs_kenmerk_key = 1080) ih,                        -- inhuur
          (SELECT *
             FROM ins_deel d, ins_srtdeel sd
            WHERE d.ins_srtdeel_key = sd.ins_srtdeel_key
              AND d.ins_alg_ruimte_type = 'P'
              AND sd.ins_srtgroep_key = 81) lo                       -- locker
    WHERE p.prs_perslid_key = wp.prs_perslid_key(+)
      AND wp.alg_locatie_key = l.alg_locatie_key(+)
      AND p.prs_perslid_key = pv.prs_link_key(+)
      AND p.prs_perslid_key = ih.prs_link_key(+)
      AND p.prs_perslid_key = lo.ins_alg_ruimte_key(+)
      AND p.prs_perslid_key = pf.prs_perslid_key
      AND p.prs_srtperslid_key = sp.prs_srtperslid_key
      AND p.prs_afdeling_key = a.prs_afdeling_key
      AND NOT EXISTS
             (SELECT prs_kenmerklink_key
                FROM prs_kenmerklink kl
               WHERE kl.prs_kenmerk_key = 4
                 AND kl.prs_link_key = p.prs_perslid_key);


CREATE OR REPLACE VIEW aasa_v_noti_resreminder
(
   code,
   sender,
   receiver,
   text,
   key,
   xkey
)
AS
   SELECT 'RESINF',
          NULL,
          rsvr.res_rsv_ruimte_contact_key,
             'Reservering '
          || res.res_reservering_key
          || ': U heeft op '
          || TO_CHAR (rsvr.res_rsv_ruimte_van, 'DD-MM')
          || ' van '
          || TO_CHAR (rsvr.res_rsv_ruimte_van, 'HH24:MI')
          || ' tot '
          || TO_CHAR (rsvr.res_rsv_ruimte_tot, 'HH24:MI')
          || ' ruimte '
          || r.res_ruimte_nr
          || ' gereserveerd.',
          res.res_reservering_key,
          rsvr.res_rsv_ruimte_key
     FROM res_v_aanwezigreservering res,
          res_v_aanwezigrsv_ruimte rsvr,
          res_ruimte_opstelling opst,
          res_disc_params rdp,
          res_ruimte r
    WHERE r.res_discipline_key = rdp.res_ins_discipline_key
      AND rdp.res_disc_params_noti_dagen IS NOT NULL
      AND res.res_reservering_key = rsvr.res_reservering_key
      AND opst.res_ruimte_opstel_key = rsvr.res_ruimte_opstel_key
      AND opst.res_ruimte_key = r.res_ruimte_key
      AND rsvr.res_status_fo_key <= 5
      AND (rsvr.res_rsv_ruimte_van BETWEEN fac.datumtijdplusuitvoertijd (
                                              SYSDATE,
                                              res_disc_params_noti_dagen,
                                              'DAGEN')
                                       AND  fac.datumtijdplusuitvoertijd (
                                               SYSDATE,
                                               res_disc_params_noti_dagen + 1,
                                               'DAGEN')
        OR rsvr.res_rsv_ruimte_van BETWEEN fac.datumtijdplusuitvoertijd (
                                              SYSDATE,
                                              1,
                                              'DAGEN')
                                       AND  fac.datumtijdplusuitvoertijd (
                                               SYSDATE,
                                               2,
                                               'DAGEN'))
      AND TO_CHAR (SYSDATE, 'D') NOT IN (1, 7)
      AND rsvr.res_rsv_ruimte_van >= SYSDATE
   UNION ALL
     SELECT 'RESINF',
            NULL,
            res_rsv_ruimte_contact_key,
               'Reservering '
            || res_reservering_key
            || ': U heeft op '
            || TO_CHAR (MIN (van), 'dd-mm')
            || DECODE (
                  MIN (van),
                  MAX (tot),
                  ' om ' || TO_CHAR (MIN (van), 'hh24:mi'),
                     ' van '
                  || TO_CHAR (MIN (van), 'hh24:mi')
                  || ' tot '
                  || TO_CHAR (MAX (tot), 'hh24:mi'))
            || ' in ruimte ('
            || (SELECT    alg_gebouw_code
                       || '-'
                       || alg_verdieping_code
                       || '-'
                       || alg_ruimte_nr
                  FROM alg_v_onroerendgoed_gegevens arg
                 WHERE arg.alg_ruimte_key = ruimte_key)
            || ') '
            || COUNT (res_reservering_key)
            || ' voorziening(en) gereserveerd.',
            res_reservering_key,
            res_rsv_ruimte_key
       FROM (SELECT rsvr.res_rsv_ruimte_contact_key,
                    res.res_reservering_key,
                    rsvd.res_rsv_deel_van van,
                    rsvd.res_rsv_deel_tot tot,
                    rsvr.res_rsv_ruimte_key,
                    rsvr.alg_ruimte_key ruimte_key
               FROM res_v_aanwezigreservering res,
                    res_v_aanwezigrsv_ruimte rsvr,
                    res_disc_params rdp,
                    res_rsv_deel rsvd,
                    res_deel rd
              WHERE rsvd.res_rsv_ruimte_key = rsvr.res_rsv_ruimte_key
                AND rd.res_deel_key = rsvd.res_deel_key
                AND rd.res_discipline_key = rdp.res_ins_discipline_key
                AND rdp.res_disc_params_noti_dagen IS NOT NULL
                AND res.res_reservering_key = rsvr.res_reservering_key
                AND rsvr.res_ruimte_opstel_key IS NULL
                AND rsvr.res_status_fo_key <= 5
                AND rsvd.res_rsv_deel_verwijder IS NULL
                AND (rsvd.res_rsv_deel_van BETWEEN fac.datumtijdplusuitvoertijd (
                                                      SYSDATE,
                                                      res_disc_params_noti_dagen,
                                                      'DAGEN')
                                               AND  fac.datumtijdplusuitvoertijd (
                                                       SYSDATE,
                                                       res_disc_params_noti_dagen
                                                       + 1,
                                                       'DAGEN')
                  OR rsvd.res_rsv_deel_van BETWEEN fac.datumtijdplusuitvoertijd (
                                                      SYSDATE,
                                                      1,
                                                      'DAGEN')
                                               AND  fac.datumtijdplusuitvoertijd (
                                                       SYSDATE,
                                                       2,
                                                       'DAGEN'))
                AND TO_CHAR (SYSDATE, 'D') NOT IN (1, 7)
                AND rsvd.res_rsv_deel_van >= SYSDATE
             UNION ALL
             SELECT rsvr.res_rsv_ruimte_contact_key,
                    res.res_reservering_key,
                    rsva.res_rsv_artikel_levering van,
                    rsva.res_rsv_artikel_levering tot,
                    rsvr.res_rsv_ruimte_key,
                    rsvr.alg_ruimte_key ruimte_key
               FROM res_v_aanwezigreservering res,
                    res_v_aanwezigrsv_ruimte rsvr,
                    res_disc_params rdp,
                    res_rsv_artikel rsva,
                    res_artikel ra
              WHERE rsva.res_rsv_ruimte_key = rsvr.res_rsv_ruimte_key
                AND ra.res_discipline_key = rdp.res_ins_discipline_key
                AND rsva.res_artikel_key = ra.res_artikel_key
                AND rdp.res_disc_params_noti_dagen IS NOT NULL
                AND res.res_reservering_key = rsvr.res_reservering_key
                AND rsvr.res_ruimte_opstel_key IS NULL
                AND rsvr.res_status_fo_key <= 5
                AND rsva.res_rsv_artikel_verwijder IS NULL
                AND (rsva.res_rsv_artikel_levering BETWEEN fac.datumtijdplusuitvoertijd (
                                                              SYSDATE,
                                                              res_disc_params_noti_dagen,
                                                              'DAGEN')
                                                       AND  fac.datumtijdplusuitvoertijd (
                                                               SYSDATE,
                                                               res_disc_params_noti_dagen
                                                               + 1,
                                                               'DAGEN')
                  OR rsva.res_rsv_artikel_levering BETWEEN fac.datumtijdplusuitvoertijd (
                                                              SYSDATE,
                                                              1,
                                                              'DAGEN')
                                                       AND  fac.datumtijdplusuitvoertijd (
                                                               SYSDATE,
                                                               2,
                                                               'DAGEN'))
                AND TO_CHAR (SYSDATE, 'D') NOT IN (1, 7)
                AND rsva.res_rsv_artikel_levering >= SYSDATE)
   GROUP BY res_rsv_ruimte_contact_key,
            res_reservering_key,
            res_rsv_ruimte_key,
            ruimte_key;

-- notificatie naar onderstaand email adres als er een melding in de vakgroep goedkeuring aangemaakt wordt.
CREATE OR REPLACE VIEW aasa_v_noti_goedkeuring
(
   sender,
   receiver,
   text,
   code,
   fac_srtnotificatie_key,
   key,
   xkey,
   xemail,
   xmobile
)
AS
   SELECT NULL sender,
          NULL receiver,
          NULL text,
          'CUST07' code,
          NULL fac_srtnotificatie_key,
          m.mld_melding_key key,
          NULL xkey,
          'headofficeEurope.authorizations@sabic-europe.com' xemail,
          NULL xmobile
     FROM mld_melding m, mld_stdmelding std
    WHERE m.mld_stdmelding_key = std.mld_stdmelding_key
      AND std.mld_ins_discipline_key = 1222            -- vakgroep goedkeuring
      AND m.mld_melding_datum BETWEEN TO_DATE (
                                         TO_CHAR (SYSDATE, 'yyyymmdd hh24'),
                                         'yyyymmdd hh24')
                                      - (1 / 24)
                                  AND  TO_DATE (
                                          TO_CHAR (SYSDATE, 'yyyymmdd hh24'),
                                          'yyyymmdd hh24')
      AND m.mld_melding_status = 2;


-- !!!!!!!!!!!!!!!!!!
-- Controleer de wijzigingen die in de aaxx gemaakt zijn. (Afsplitsing dateert van 6 maart 2015)
-- !!!!!!!!!!!!!!!!!!!!
CREATE OR REPLACE PROCEDURE aasa_import_opdrstat_strukton (
   p_import_key IN NUMBER)
AS
   c_delim                VARCHAR2 (1) := ';';
   v_newline              VARCHAR2 (1000);                       -- Input line
   v_errormsg             VARCHAR2 (1000);
   oracle_err_num         NUMBER;
   oracle_err_mes         VARCHAR2 (200);
   v_aanduiding           VARCHAR2 (1200);
   v_dummy                VARCHAR2 (200);
   header_is_valid        NUMBER := 0;
   v_count                NUMBER;
   v_count_tot            NUMBER (10) := 0;
   v_count_import         NUMBER (10) := 0;
   v_ongeldig             NUMBER (1) := 0;
   -- De importvelden
   v_mld_opdr_opmerking   VARCHAR2 (4000);
   v_mld_opdr_key         NUMBER (10);
   v_mld_opdr_key_tekst   VARCHAR2 (100);
   v_extern_nummer        VARCHAR2 (100);
   v_status               NUMBER (10);
   v_status_tekst         VARCHAR2 (100);
   v_status_code          VARCHAR2 (100);
   v_datumtijd            DATE;
   v_datumtijd_tekst      VARCHAR2 (100);
   v_opmerking            VARCHAR2 (3000);
   v_totaal               NUMBER (8,2);
   v_totaal_str           VARCHAR2 (100);

   -- Overige velden:
   CURSOR c1
   IS
        SELECT *
          FROM fac_imp_file
         WHERE fac_import_key = p_import_key
      ORDER BY fac_imp_file_index;
BEGIN
   -- Eerst opruiming
   DELETE FROM aaxx_imp_opdrstat_strukton;

   COMMIT;

   FOR rec1 IN c1
   LOOP
      BEGIN
         v_newline := rec1.fac_imp_file_line;
         v_errormsg := 'Fout opvragen te importeren rij';
         v_aanduiding := '';
         v_ongeldig := 0;

         fac.imp_getfield (v_newline, c_delim, v_mld_opdr_key_tekst);
         fac.imp_getfield (v_newline, c_delim, v_extern_nummer);
         fac.imp_getfield (v_newline, c_delim, v_status_code);       -- typeID
         fac.imp_getfield (v_newline, c_delim, v_datumtijd_tekst);
         fac.imp_getfield (v_newline, c_delim, v_status_tekst);
         fac.imp_getfield (v_newline, c_delim, v_opmerking);
         fac.imp_getfield (v_newline, c_delim, v_totaal_str);
         v_totaal := fac.safe_to_number(v_totaal_str);

         fac.imp_writelog (p_import_key, 'I', 'v_totaal_str:' || v_totaal_str || ' v_totaal:' || v_totaal || ' fac.safe_to_number(v_totaal_str):' || fac.safe_to_number(v_totaal_str),'');

         v_opmerking := substr(v_opmerking, 1, 1000);
         -- verwijder de markering voor cr/lf die we zelf in de stylesheet toegevoegd hebben.
         v_opmerking := replace(v_opmerking, '@@',CHR (13) || CHR (10));
         v_aanduiding :=
               '['
            || v_extern_nummer
            || '|'
            || v_mld_opdr_key_tekst
            || '|'
            || v_status_tekst
            || '|'
            || v_opmerking
            || '] ';

         -- Ik controleer of ik een geldige header heb, dat is: in de juiste kolommen
         -- de juiste kolomkop. Ik controleer daarbij ALLE kolommen!
         -- Ik negeer alles totdat ik een geldige header ben gepasseerd.
         IF (header_is_valid = 0)
         THEN
            IF     UPPER (TRIM (v_mld_opdr_key_tekst)) = 'REFERENCEID'
               AND UPPER (TRIM (v_extern_nummer)) = 'SERVICEREQUESTID'
               AND UPPER (TRIM (v_status_code)) = 'TYPEID'
               AND UPPER (TRIM (v_datumtijd_tekst)) = 'DATETIME'
               AND UPPER (TRIM (v_opmerking)) = 'REMARKS'
               AND UPPER (TRIM (v_totaal_str)) = 'TOTAL'
            THEN
               header_is_valid := 1;
            END IF;
         ELSE
            v_count_tot := v_count_tot + 1;
            -- Controleer alle veldwaarden
            v_errormsg := 'Fout inlezen mld_opdr_key [' || v_aanduiding || ']';
            v_mld_opdr_key := TRIM (v_mld_opdr_key);

            BEGIN
               SELECT o.mld_opdr_key, o.mld_opdr_opmerking
                 INTO v_mld_opdr_key, v_mld_opdr_opmerking
                 FROM mld_opdr o, mld_melding m, ins_tab_discipline d, ins_srtdiscipline sd, mld_stdmelding std
                WHERE o.mld_melding_key = m.mld_melding_key
                  AND m.mld_stdmelding_key = std.mld_stdmelding_key
                  AND std.mld_ins_discipline_key = d.ins_discipline_key
                  AND d.ins_srtdiscipline_key = sd.ins_srtdiscipline_key
                  AND sd.ins_srtdiscipline_prefix || m.mld_melding_key || '/' || o.mld_opdr_bedrijfopdr_volgnr = v_mld_opdr_key_tekst;

            EXCEPTION WHEN NO_DATA_FOUND THEN
               BEGIN
                 fac.imp_writelog (p_import_key, 'W',  'Opdracht kan niet gevonden worden. [' || v_aanduiding || ']', '');

               -- kijk nu of de opdracht gevonden kan worden a.d.h.v het Struktonnummer
               SELECT o.mld_opdr_key, o.mld_opdr_opmerking
                 INTO v_mld_opdr_key, v_mld_opdr_opmerking
                 FROM mld_opdr o, mld_kenmerkopdr ko, mld_kenmerk k
                WHERE o.mld_opdr_key = ko.mld_opdr_key
                  AND ko.mld_kenmerk_key = k.mld_kenmerk_key
                  AND k.mld_srtkenmerk_key = 35
                  AND ko.mld_kenmerkopdr_waarde = v_extern_nummer;

               EXCEPTION WHEN OTHERS THEN
                  v_ongeldig := 1;
                  v_errormsg := 'Opdracht kan niet gevonden worden (intern/externnr).  [' || v_aanduiding || ']';
                  v_mld_opdr_key := NULL;
               END;
            END;

            IF v_ongeldig = 0
            THEN
               v_errormsg :=
                  'Fout bij bepalen status [' || v_aanduiding || ']';

               CASE
                  WHEN v_status_code = '5'
                  THEN
                     v_status := 5;                              -- uitgegeven
                  WHEN v_status_code = '10'
                  THEN
                     v_status := 8;                            -- geaccepteerd
                  WHEN v_status_code = '20'                  -- monteur gereed
                  THEN
                     v_status := 6;                                -- afgemeld
                  WHEN v_status_code = '25'               -- specialist gereed
                  THEN
                     v_status := 6;                                -- afgemeld
                  WHEN v_status_code = '30'                -- technisch gereed
                  THEN
                     v_status := 6;                                -- afgemeld
             --   AASA#32991
             --     WHEN v_status_code = '40'                     -- uitgeprijst
             --     THEN
             --        v_status := 9;                                -- afgerond
                  WHEN v_status_code = '70'
                  THEN
                     v_status := 1;                             -- geannuleerd
                  WHEN v_status_code = '80'
                  THEN
                     v_status := 1;                               -- afgewezen
                  ELSE
                     v_status := NULL;
                     v_ongeldig := 1;   -- nog te bezien.
               END CASE;
            END IF;

            -- Lees alle veldwaarden
            IF v_ongeldig = 0
            THEN
               v_errormsg :=
                  'Fout bij converteren datumtijd [' || v_aanduiding || ']';
               v_datumtijd :=
                  fac.safe_to_date (
                     REPLACE (
                        SUBSTR (v_datumtijd_tekst,
                                1,
                                INSTR (v_datumtijd_tekst, '.') - 1),
                        'T',
                        ' '),
                     'yyyy-mm-dd hh24:mi:ss');

               IF v_datumtijd = NULL
               THEN
                  v_ongeldig := 0;
               END IF;
            END IF;

            IF v_ongeldig = 0
            THEN
               v_errormsg :=
                  'Fout bij aanvullen opmerking [' || v_aanduiding || ']';

               -- controleer of de opmerking niet leeg is en of dezelfde opmerking al bij een eerdere statusovergang
               -- gemeld is.
               IF v_opmerking IS NOT NULL AND INSTR(COALESCE(v_mld_opdr_opmerking, 'QueQuLeQue'), v_opmerking) = 0
               THEN
                  v_opmerking :=
                        '['
                     || v_datumtijd_tekst
                     || '] - '
                     || v_status_tekst
                     || CHR (13)
                     || CHR (10)
                     || v_opmerking;
               ELSE
                  v_opmerking :=
                     '[' || v_datumtijd_tekst || '] - ' || v_status_tekst;
               END IF;
            END IF;

            -- Insert geformatteerde import record
            IF (v_ongeldig = 0)
            THEN
               BEGIN
                  v_errormsg :=
                        'Fout toevoegen opdracht status ['
                     || v_aanduiding
                     || ']';

                  INSERT INTO aaxx_imp_opdrstat_strukton (mld_opdr_key,
                                                          extern_nummer,
                                                          status,
                                                          datumtijd,
                                                          opmerking,
                                                          totaal)
                      VALUES (v_mld_opdr_key,
                              v_extern_nummer,
                              v_status,
                              v_datumtijd,
                              v_opmerking,
                              v_totaal);

                  v_count_import := v_count_import + 1;
               EXCEPTION
                  WHEN OTHERS
                  THEN
                     oracle_err_num := SQLCODE;
                     oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
                     v_errormsg :=
                           v_errormsg
                        || ' ORACLE (error '
                        || oracle_err_num
                        || '/'
                        || oracle_err_mes
                        || ')';
                     fac.imp_writelog (
                        p_import_key,
                        'E',
                        v_aanduiding || v_errormsg,
                        'Fout bij toevoegen regel aan importtabel aaxx_imp_opdr_status_strukton.');
               END;
            ELSE
               fac.imp_writelog (p_import_key,
                                 'E',
                                 v_errormsg,
                                 '');
            END IF;
         END IF;
      END;
   END LOOP;

   IF (header_is_valid = 0)
   THEN
      fac.imp_writelog (p_import_key,
                        'E',
                        'Ongeldig importbestand',
                        'Geen header of header niet volgens specificatie!');
   END IF;

   COMMIT;
EXCEPTION
   WHEN OTHERS
   THEN
      oracle_err_num := SQLCODE;
      oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
      v_errormsg :=
            v_errormsg
         || 'ORACLE (error '
         || oracle_err_num
         || '/'
         || oracle_err_mes
         || ')';
      fac.imp_writelog (p_import_key,
                        'E',
                        v_aanduiding || v_errormsg,
                        'Inleesproces opdrachtstatusberichten afgebroken!');
END;
/




CREATE OR REPLACE PROCEDURE aasa_update_opdrstat_strukton (
   p_import_key IN NUMBER)
AS
   -- Cursor loopt - in volgorde! - over alle ingelezen opdrachtstatusberichten.
   CURSOR c1
   IS
        SELECT mld_opdr_key,
               extern_nummer,
               datumtijd,
               status,
               opmerking,
               totaal
          FROM aaxx_imp_opdrstat_strukton
      ORDER BY 1, 3;

   CURSOR cp (
      c_opdr_key IN NUMBER)
   IS
        SELECT pf.prs_perslid_key
          FROM fac_tracking tr,
               fac_srtnotificatie str,
               prs_v_perslid_fullnames_all pf
         WHERE tr.fac_srtnotificatie_key = str.fac_srtnotificatie_key
           AND tr.prs_perslid_key = pf.prs_perslid_key(+)
           AND (str.fac_srtnotificatie_code = 'ORDFOK'
            AND tr.fac_tracking_refkey = c_opdr_key
            AND str.fac_srtnotificatie_xmlnode IN ('opdracht'))
      ORDER BY fac_tracking_datum DESC, fac_tracking_key DESC;

   v_errormsg              VARCHAR2 (1000);
   oracle_err_num          NUMBER;
   oracle_err_mes          VARCHAR2 (200);
   v_aanduiding            VARCHAR2 (200);
   v_count_tot             NUMBER (10);
   v_count                 NUMBER (10);
   v_mld_key               NUMBER (10) := 0;
   v_opdr_key              NUMBER (10) := 0;
   v_opdr_status           NUMBER (10) := 0;
   v_user_key              NUMBER (10) := 0;
   v_opdr_approved         mld_opdr.mld_opdr_approved%TYPE;
   v_approver_key          prs_perslid.prs_perslid_key%TYPE;
   v_mld_typeopdr_key      mld_typeopdr.mld_typeopdr_key%TYPE;
   v_mld_kenmerk_key       mld_kenmerk.mld_kenmerk_key%TYPE;
   v_mld_kenmerkopdr_key   mld_kenmerkopdr.mld_kenmerkopdr_key%TYPE;
   v_mld_srtkenmerk_key    mld_srtkenmerk.mld_srtkenmerk_key%TYPE;
   v_perslid_key           prs_perslid.prs_perslid_key%TYPE;
   v_opdr_kosten           mld_opdr.mld_opdr_kosten%TYPE;
   v_typeopdr_gvs          mld_typeopdr.mld_typeopdr_gvs%TYPE;
   v_mld_kk                mld_melding.mld_kosten_klant%TYPE;
   v_mld_kostenpl_key      mld_melding.prs_kostenplaats_key%TYPE;
   v_opdr_kostenpl_key     mld_opdr.prs_kostenplaats_key%TYPE;
   v_mld_perslid_key       mld_melding.prs_perslid_key%TYPE;
   v_mld_disc_key          ins_tab_discipline.ins_discipline_key%TYPE;
   v_refiat                NUMBER (1);
   v_reapprove             NUMBER (1);
BEGIN
   -- Loop door alle geimporteerde opdrachtstatusberichten en verwerk deze.
   v_count_tot := 0;

   -- Stel de key in van het srtkenmerk 'Ref. Nr. Leverancier'. Hier wordt
   -- het nummer dat Strukton aan de call gegeven heeft geregistreerd.
   IF aaxx_get_user = 'SABIC'
   THEN
      v_mld_srtkenmerk_key := 35;
   END IF;

   IF aaxx_get_user = 'ENEXIS'
   THEN
      v_mld_srtkenmerk_key := 381;
   END IF;

   IF aaxx_get_user = 'ESSENT'
   THEN
      v_mld_srtkenmerk_key := 741;
   END IF;

   IF aaxx_get_user = 'NS'
   THEN
      v_mld_srtkenmerk_key := 761;
   END IF;

   IF aaxx_get_user = 'DSM'
   THEN
      v_mld_srtkenmerk_key := 123;
   END IF;

   IF aaxx_get_user = 'VL'
   THEN
      v_mld_srtkenmerk_key := 82;
   END IF;

   IF aaxx_get_user = 'HUNTSMAN'
   THEN
      v_mld_srtkenmerk_key := 381;
   END IF;

   IF aaxx_get_user = 'DOW'
   THEN
      v_mld_srtkenmerk_key := 81;
   END IF;

   v_user_key := 10;                                          -- Strukton user

   FOR rec IN c1
   LOOP
      BEGIN
         v_aanduiding :=
               '['
            || rec.mld_opdr_key
            || '|'
            || SUBSTR (rec.opmerking, 1, 100)
            || '] ';
         v_count_tot := v_count_tot + 1;
         v_count := 0;

         -- Key van melding/opdracht bepalen en externnr bij opdracht opslaan.
         IF (rec.mld_opdr_key IS NOT NULL)
         THEN
            v_errormsg := 'Fout bij bepalen opdracht.';

            SELECT mld_melding_key,
                   mld_opdr_key,
                   mld_statusopdr_key,
                   mld_typeopdr_key
              INTO v_mld_key,
                   v_opdr_key,
                   v_opdr_status,
                   v_mld_typeopdr_key
              FROM mld_opdr
             WHERE mld_opdr_key = rec.mld_opdr_key;

            v_errormsg := 'Fout bij bepalen kenmerk extern nummer.';

            SELECT k.mld_kenmerk_key
              INTO v_mld_kenmerk_key
              FROM mld_kenmerk k
             WHERE k.mld_srtkenmerk_key = v_mld_srtkenmerk_key
               AND k.mld_typeopdr_key = v_mld_typeopdr_key;

            v_errormsg := 'Fout bij bepalen kenmerkopdracht extern nummer.';

            SELECT MAX (ko.mld_kenmerkopdr_key)
              INTO v_mld_kenmerkopdr_key
              FROM mld_kenmerkopdr ko
             WHERE ko.mld_opdr_key = v_opdr_key
               AND v_mld_kenmerk_key = ko.mld_kenmerk_key;

            v_errormsg := 'Fout bij aanpassen extern nummer.';

            IF v_mld_kenmerkopdr_key IS NULL
            THEN
               -- kenmerk toevoegen
               INSERT INTO mld_kenmerkopdr (mld_kenmerk_key,
                                            mld_opdr_key,
                                            mld_kenmerkopdr_waarde)
                   VALUES (v_mld_kenmerk_key, v_opdr_key, rec.extern_nummer);
            ELSE
               -- kenmerk aanpassen
               UPDATE mld_kenmerkopdr
                  SET mld_kenmerkopdr_waarde = rec.extern_nummer
                WHERE mld_kenmerkopdr_key = v_mld_kenmerkopdr_key;
            END IF;

            v_errormsg := 'Fout bij bijwerken opdracht-opmerking.';

            v_count := LENGTH (rec.opmerking) + 5; -- Beetje speling qua lengte!

            UPDATE mld_opdr
               SET mld_opdr_opmerking =
                      DECODE (
                         mld_opdr_opmerking,
                         NULL,
                         rec.opmerking,
                            rec.opmerking
                         || CHR (13)
                         || CHR (10)
                         || SUBSTR (mld_opdr_opmerking, 1, (4000 - v_count)))
             WHERE mld_opdr_key = v_opdr_key;

            IF v_opdr_status <> rec.status
            THEN
               IF rec.status = 8 AND v_opdr_status = 5
               THEN
                  -- Accepteer opdracht als de opdracht uitgegeven was
                  mld.setopdrachtstatus (v_opdr_key, 8, v_user_key); -- Facilitor
               ELSIF rec.status = 6 AND v_opdr_status = 5
               THEN
                  -- Meld de opdracht af als deze uitgegeven was
                  mld.setopdrachtstatus (v_opdr_key, 8, v_user_key); -- Facilitor, eerst accepteren
                  mld.setopdrachtstatus (v_opdr_key, 6, v_user_key); -- Facilitor
               ELSIF rec.status = 6 AND v_opdr_status = 8
               THEN
                  -- Meld de opdracht af als deze geaccepteerd was
                  mld.setopdrachtstatus (v_opdr_key, 6, v_user_key); -- Facilitor
               ELSIF rec.status = 1 AND v_opdr_status = 5
               THEN
                  -- Opdracht is afgewezen op het moment dat de opdracht nog niet geaccepteerd is.
                  mld.setopdrachtstatus (v_opdr_key, 1, v_user_key); -- Facilitor
                  mld.updatemeldingstatusav (v_mld_key,
                                             0,
                                             v_user_key,
                                             0);
               ELSIF rec.status = 1 AND v_opdr_status = 8
               THEN
                  -- Opdracht is afgewezen op het moment dat de opdracht al geaccepteerd is.
                  mld.setopdrachtstatus (v_opdr_key, 6, v_user_key); -- Facilitor
               --MLD.updatemeldingstatusAV (v_mld_key, 0, v_user_key, 0);
               ELSIF rec.status = 9 AND v_opdr_status = 6
               THEN
                  -- Opdracht is afgerond en opdrachtstatus was afgemeld.
                  mld.setopdrachtstatus (v_opdr_key, 9, v_user_key); -- Facilitor
               END IF;

               IF rec.status = 6 AND v_opdr_status <> 6
               THEN
                  -- Sinds AADO#30922 wordt de melding niet meer automatisch afgemeld.
                  MLD.updatemeldingstatusAV (v_mld_key, 0, v_user_key, 0);
               ELSE
                  IF rec.status = 9 AND v_opdr_status <> 9
                  THEN
                     -- Oorspronkelijke gegevens opdracht ophalen.
                     -- var opdr_info = mld.mld_opdr_info(opdr_key);
                     SELECT mld_opdr_kosten,
                            mld_typeopdr_gvs,
                            mld_kosten_klant,
                            m.prs_kostenplaats_key,
                            o.prs_kostenplaats_key,
                            m.prs_perslid_key,
                            std.mld_ins_discipline_key
                       INTO v_opdr_kosten,
                            v_typeopdr_gvs,
                            v_mld_kk,
                            v_mld_kostenpl_key,
                            v_opdr_kostenpl_key,
                            v_mld_perslid_key,
                            v_mld_disc_key
                       FROM mld_opdr o,
                            mld_melding m,
                            mld_typeopdr t,
                            mld_stdmelding std
                      WHERE o.mld_melding_key = m.mld_melding_key
                        AND m.mld_stdmelding_key = std.mld_stdmelding_key
                        AND o.mld_typeopdr_key = t.mld_typeopdr_key
                        AND o.mld_opdr_key = v_opdr_key;

                     -- Hergoedkeuring (Ter goedkeuring) wordt (pas) vereist als het opdrachtbedrag hoger is dan al is goedgekeurd en boven de GVS-grens uitkomt.
                     -- Herfiattering (Ter fiattering) wordt (pas) vereist indien het bedrag boven het mandaat van de oorspronkelijke (laatste) fiatteur uitkomt
                     -- en boven de GVS-grens uitkomt.
                     -- Hergoedkeuring en herfiattering kan alleen als het totaalbedrag van de opdracht is verhoogd en alleen in de statussen 5, 8, 6 en 9 (de uitvoeringsfase en de afhandelingsfase).
                     -- Hergoedkeuring en herfiattering kan leiden tot een tijdelijke terugkeer naar de voorfase status 3 of 10.
                     IF rec.totaal > v_opdr_kosten
                     THEN
                        fac.imp_writelog (p_import_key, 'I', 'rec.totaal > v_opdr_kosten: ' || rec.totaal || ' - ' || v_opdr_kosten, '');

                        -- Hergoedkeuring (Ter goedkeuring) wordt (pas) vereist als het opdrachtbedrag hoger is dan al is goedgekeurd en boven de GVS-grens uitkomt.
                        IF rec.totaal > COALESCE (v_opdr_approved, 0) AND rec.totaal > v_typeopdr_gvs
                        THEN
                           v_reapprove := 1;
                        ELSE
                           v_reapprove := 0;
                        END IF;

                        fac.imp_writelog (p_import_key, 'I', 'hergoedkeuring: ' || v_reapprove || ' - ' || v_opdr_approved || ' - ' || v_typeopdr_gvs, '');


                        -- Herfiattering (Ter fiattering) wordt (pas) vereist indien het bedrag boven het mandaat van de oorspronkelijke (laatste) fiatteur uitkomt
                        -- en boven de GVS-grens uitkomt.
                        -- Bepaal het mandaat van de oorspronkelijke (laatste) fiatteur.
                        -- Ook als er de vorige keer geen kosten waren dan moet pas worden geherfiatteerd als (tot_kosten > mandaat),
                        -- waarbij de mandaat van de Melder/aanvrager van melding of de user is.
                        v_perslid_key := NULL;

                        IF rec.totaal > v_opdr_kosten AND rec.totaal > 0 AND rec.totaal > v_typeopdr_gvs
                        THEN
                           fac.imp_writelog (p_import_key, 'I', 'F - rec.totaal > v_opdr_kosten: ' || rec.totaal || ' - ' || v_opdr_kosten || ' - ' || v_typeopdr_gvs, '');
                           -- De totale kosten zijn verhoogd en het bedrag zit boven de GVS-grens.
                           -- Bepaling oorspronkelijke (laatste) fiatteur, als die er was.
                           v_perslid_key := NULL;

                           FOR rec2 IN cp (v_opdr_key)
                           LOOP
                              BEGIN
                                 v_perslid_key := rec2.prs_perslid_key;
                              END;
                           END LOOP;

                           fac.imp_writelog (p_import_key, 'I', 'F - laatste fiatteur: ' || v_perslid_key, '');

                           IF v_perslid_key IS NULL
                           THEN
                              -- Dan waren de opdracht kosten onder het mandaat van mijzelf of de BO-medewerker.
                              -- Als de kostenplaats bij de opdracht overruled is dan wordt altijd tegen het profiel van de BO-medewerker getest.
                              IF v_mld_kk = 1
                             AND v_mld_kostenpl_key = v_opdr_kostenpl_key
                              THEN
                                 v_perslid_key := v_mld_perslid_key; -- Melder/aanvrager van melding
                              END IF;
                           END IF;

                           fac.imp_writelog (p_import_key, 'I', 'F - indien onbekend terugvallen op melder: ' || v_perslid_key, '');


                           IF    fac.getsetting ('mld_use_order_approval') = 1
                             AND (rec.totaal >
                                     fac.getsetting ('can_selfapprove')
                               OR rec.totaal >
                                     prs.getprofiellimiet (v_perslid_key, v_mld_disc_key))
                           THEN
                              -- Er moet (opnieuw) gefiatteerd worden. Is er wel iemand met voldoende mandaat? Indien er niemand gevonden kan worden mag de wijziging niet doorgaan.
                              -- Het mandaat is al te hoog voor de melder/aanvrager van de melding of mijzelf.

                              v_approver_key :=
                                 prs.getkpverantwoordelijke (
                                    v_opdr_kostenpl_key,
                                    fac.getsetting ('prs_approvemethod'),
                                    v_user_key);
                              v_refiat := 1;
                              -- er moet (her)fiattering plaatsvinden
                              fac.imp_writelog (p_import_key, 'I', 'F - (her)fiatteur: ' || v_approver_key, '');
                           END IF;
                        END IF;
                     END IF;

                     IF v_reapprove = 1 OR v_refiat = 1
                     THEN
                        -- Zet de refiat waarden. Het hergoedkeurings- en/of herfiatteringstraject wordt opnieuw ingegaan. // Tracking hiervan is niet nodig.
                        IF v_opdr_kosten > 0
                        THEN
                           UPDATE mld_opdr
                              SET mld_opdr_materiaal_refiat = mld_opdr_materiaal,
                                  mld_opdr_kosten_refiat = mld_opdr_kosten
                            WHERE mld_opdr_key = v_opdr_key;
                        END IF;

                        -- Ook voor status 5 wordt refiatstatus gezet zodat bekend is dat het om een herfiattering gaat. De fiatteringsvoorwaarde is dan iets anders.
                        UPDATE mld_opdr
                           SET mld_statusopdr_key_refiat = mld_statusopdr_key
                         WHERE mld_opdr_key = v_opdr_key;

                        -- Goedkeuring opnieuw ingaan kan alleen als het approved bedrag leeg is.
                        UPDATE mld_opdr
                           SET mld_opdr_approved_refiat = mld_opdr_approved
                         WHERE mld_opdr_key = v_opdr_key;

                        UPDATE mld_opdr
                           SET mld_opdr_approved = NULL,
                               mld_opdr_materiaal = rec.totaal,
                               mld_opdr_kosten = rec.totaal
                         WHERE mld_opdr_key = v_opdr_key;
                     ELSE
                        UPDATE mld_opdr
                           SET mld_opdr_materiaal = rec.totaal,
                               mld_opdr_kosten  = rec.totaal
                         WHERE mld_opdr_key = v_opdr_key;
                     END IF;

                     -- geef in de tracking aan dat de kosten via de interface aangepast zijn.
                     IF v_opdr_kosten <> rec.totaal
                     THEN
                        fac.trackaction ('ORDUPD', v_opdr_key, v_user_key, SYSDATE,
                              'Gewijzigd' || CHR (13) || CHR (10)
                           || 'Materiaal: ' || v_opdr_kosten || ' --> ' || rec.totaal || CHR (13) || CHR (10)
                           || 'Totaal: ' || v_opdr_kosten || ' --> ' || rec.totaal);
                     END IF;

                     IF v_reapprove = 1
                     THEN
                        -- Zetten van de status van de gewijzigde opdracht op "Ter goedkeuring" en afhandelen van de tracking (status + uitvoerende tracking) en daarmee notificatie.
                        -- status = 10;  Ter goedkeuring.
                        mld.setopdrachtstatus (v_opdr_key, 10, v_user_key);
                     ELSE
                        IF v_refiat = 1
                        THEN
                           -- Zetten van de status van de gewijzigde opdracht op "Ter fiattering" en afhandelen van de tracking (status + uitvoerende tracking) en daarmee notificatie.
                           -- status = 3; // Ter fiattering.
                           mld.setopdrachtstatus (v_opdr_key, 3, v_user_key);
                        END IF;
                     END IF;
                  END IF;
               END IF;
            END IF;
         END IF;

         COMMIT;
      EXCEPTION
         WHEN OTHERS
         THEN
            oracle_err_num := SQLCODE;
            oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
            v_errormsg :=
                  v_errormsg
               || ' ORACLE (error '
               || oracle_err_num
               || '/'
               || oracle_err_mes
               || ')';
            fac.imp_writelog (p_import_key,
                              'E',
                              v_aanduiding || v_errormsg,
                              'Fout bij verwerken opdrachtstatusbericht.');
      END;
   END LOOP;

   COMMIT;
END;
/

------ payload end   ------

SET DEFINE OFF
BEGIN adm.systrackscriptId ('$Id$', 0); END;
/

COMMIT;
SET ECHO OFF
SPOOL OFF
SET DEFINE ON
PROMPT Logfile of this upgrade is: &fcltlogfile



