-- Script containing customer generic configuration sql statements for AAFM
-- (c) 2009 SG|facilitor
-- $Revision$
-- $Id$
--
-- Support: +31 53 4800710
SET ECHO ON
SET DEFINE ON
column fcltlogfile new_value fcltlogfile NOPRINT;
select UPPER(USER) || '_AAXX' || '.lst' as fcltlogfile from dual;
spool &fcltlogfile
SET DEFINE OFF


-------------------------------------------------------------------------------
-- KOPPELINGEN MET LEVERANCIERS
-------------------------------------------------------------------------------

--
--
-- !!!!!!!!!!!!!!!!!!
-- Controleer de wijzigingen die in de aaxx gemaakt zijn.
-- !!!!!!!!!!!!!!!!!!!!
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(v_mld_opdr_opmerking, 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
                  UPDATE mld_melding
                     SET mld_melding_opmerking =
                            DECODE (
                               mld_melding_opmerking,
                               NULL,
                               rec.opmerking,
                               rec.opmerking || CHR (13) || CHR (10)
                               || SUBSTR (mld_melding_opmerking,
                                          1,
                                          (4000 - v_count)))
                   WHERE mld_melding_key = v_mld_key
                     AND mld_melding_status IN (4, 7);


                  v_errormsg := 'Fout bij sluiten melding.';

                  SELECT COUNT ( * )
                    INTO v_count
                    FROM (SELECT m.mld_melding_key,
                                 (SELECT COUNT ( * )
                                    FROM mld_opdr o
                                   WHERE mld_melding_key = m.mld_melding_key)
                                    aanw_opdr,
                                 (SELECT COUNT ( * )
                                    FROM mld_opdr o
                                   WHERE mld_melding_key = m.mld_melding_key
                                     AND o.mld_statusopdr_key NOT IN
                                               (1, 2, 6, 7, 9))
                                    open_opdr
                            FROM mld_melding m
                           WHERE m.mld_melding_key = v_mld_key
                             AND m.mld_melding_status IN (4, 7))
                         niet_opgelost
                   WHERE aanw_opdr > 0 AND open_opdr = 0;

                  -- 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;
/


BEGIN adm.systrackscriptId('$Id$', 0); END;
/
COMMIT;
SPOOL OFF
