--
-- $Id$
--
-- Script containing customer specific configuration sql statements for aaah: Alliance Health Care

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

SET ECHO ON
SET DEFINE ON
COLUMN fcltlogfile NEW_VALUE fcltlogfile NOPRINT;
COLUMN fcltcusttxt NEW_VALUE fcltcusttxt NOPRINT;
WHENEVER SQLERROR CONTINUE;
SELECT adm.getscriptspoolfile('&thisfile') AS fcltlogfile FROM DUAL;
SPOOL &fcltlogfile
WHENEVER SQLERROR EXIT;
SELECT adm.checkscriptcust('&dbuser') AS fcltcusttxt FROM DUAL;
WHENEVER SQLERROR CONTINUE;
---------------------------------------
PROMPT &fcltcusttxt
---------------------------------------
SET DEFINE OFF

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

-- exact verkoop
CREATE OR REPLACE VIEW aaah_v_export_exact_verkoop    (RESULT, result_order) AS SELECT RESULT, result_order FROM aaxx_v_export_exact_verkoop;
CREATE OR REPLACE PROCEDURE aaah_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'), 'CORE');
END;
/
CREATE OR REPLACE PROCEDURE aaah_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'), 'CORE');
END;
/

-- exact verkoop over het vorige jaar
CREATE OR REPLACE VIEW aaah_v_export_exact_verkoop_vj    (RESULT, result_order) AS SELECT RESULT, result_order FROM aaxx_v_export_exact_verkoop;
CREATE OR REPLACE PROCEDURE aaah_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), 'CORE');
END;
/
CREATE OR REPLACE PROCEDURE aaah_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), 'CORE');
END;
/

-- exact projecturen (XML)
CREATE OR REPLACE VIEW aaah_v_export_exact_uren (result, result_order)
AS SELECT result, result_order FROM aaxx_v_export_exact_uren_xml;
CREATE OR REPLACE PROCEDURE aaah_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 aaah_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;
/


-- bundel catering
CREATE OR REPLACE VIEW aaah_v_export_bundel_catering    (RESULT, result_order) AS SELECT RESULT, result_order FROM aaxx_v_export_bundel_catering;
CREATE OR REPLACE PROCEDURE aaah_export_bundel_catering (
   p_applname   IN   VARCHAR2,
   p_applrun    IN   VARCHAR2,
   p_filedir    IN   VARCHAR2,
   p_filename   IN   VARCHAR2
)
AS
BEGIN
  aaxx_export_bundel_catering(p_applname, p_applrun, p_filedir, p_filename);
END;
/


CREATE OR REPLACE PROCEDURE aaah_import_perslid (p_import_key IN NUMBER)
AS
   v_seq_of_columns   VARCHAR (255);
BEGIN
   -- AAAH gebruikt de pipe '|' als scheidingsteken. Deze gaan we even omzetten naar onze ';'
   UPDATE fac_imp_file
      SET fac_imp_file_line = REPLACE (fac_imp_file_line, '|', ';')
    WHERE fac_import_key = p_import_key;

   UPDATE fac_imp_file
      SET fac_imp_file_line = REPLACE (fac_imp_file_line, ',', ';')
    WHERE fac_import_key = p_import_key
      AND fac_imp_file_line LIKE '%givenName%';

   -- Tijdelijke aanpassing om backwards compatable te zijn AAAH#`52771
   UPDATE fac_imp_file
      SET fac_imp_file_line = REPLACE (fac_imp_file_line, 'CostCenter', 'Departmentnumber')
    WHERE fac_import_key = p_import_key
      AND fac_imp_file_line LIKE '%givenName%';

   v_seq_of_columns :=
      '0;0;0;0;0;0;9;2;0;1;0;0;0;0;0;6;7;8;0;3;4;5;0;0;0;0;0;28;29;30;31;32;33;34;35;36;37;38;39;40;41;42;43;44;45;46';
   prs.import_perslid (
      p_import_key,
      v_seq_of_columns,
      '"givenName";"sn";"EmployeeID";"Title";"sAMAccountName";"TelephoneNumber";"Mobile";"mail";"Departmentnumber"%');
END aaah_import_perslid;
/


CREATE OR REPLACE PROCEDURE aaah_update_perslid (
   p_import_key IN NUMBER
) IS

CURSOR c_del
IS
    SELECT p.prs_perslid_key, p.prs_perslid_nr, pf.prs_perslid_naam_full
      FROM fac_imp_perslid i, prs_perslid p, prs_v_perslid_fullnames_all pf
     WHERE p.prs_perslid_nr = i.prs_perslid_nr(+)
       AND pf.prs_perslid_key = p.prs_perslid_key
       AND p.prs_perslid_nr IS NOT NULL
       AND i.prs_perslid_nr IS NULL
       AND p.prs_perslid_verwijder IS NULL
    ORDER BY 2;

v_perslid_key     NUMBER;
v_perslid_nr      VARCHAR2(100);
v_kostenplaats_nr VARCHAR2(100);
v_count           NUMBER;

BEGIN
	-- generic update
   prs.update_perslid (p_import_key, 'NR', 'A');

   FOR rec IN c_del
   LOOP
      BEGIN
        prs.delete_perslid (p_import_key, rec.prs_perslid_key);
      END;
   END LOOP;

  UPDATE prs_perslid
     SET fac_profiel_key = 23
   WHERE     fac_profiel_key IS NULL
         AND prs_perslid_verwijder IS NULL
         AND prs_perslid_flags = 0
         AND prs_perslid_nr IS NULL;

END aaah_update_perslid;
/

-------------------------------------------------------------------------------
-- KOPPELINGEN MET LEVERANCIER ABSOLUTA
-------------------------------------------------------------------------------
CREATE OR REPLACE PROCEDURE aaah_import_upd_absoluta (
   p_import_key IN NUMBER)
AS
   c_delim                VARCHAR2 (1) := ';';
   v_newline              VARCHAR2 (1000);                       -- Input line
   v_errormsg             VARCHAR2 (4000);
   oracle_err_num         NUMBER;
   oracle_err_mes         VARCHAR2 (200);
   v_aanduiding           VARCHAR2 (1200);
   header_is_valid        NUMBER := 0;
   v_ongeldig             NUMBER (1) := 0;
   -- De importvelden
   v_bestelopdr_id          VARCHAR2(1000);              -- VARCHAR2(30)
   v_datum_tijd             VARCHAR2(1000);              -- DATE
   v_line_number            VARCHAR2(1000);              -- NUMBER
   v_srtdeel_nummer         VARCHAR2(1000);              -- VARCHAR2(32)
   v_srtdeel_omschrijving   VARCHAR2(1000);              -- VARCHAR2(100)
   v_srtdeel_opmerking      VARCHAR2(2000);
   v_bestelling_item_aantal VARCHAR2(1000);            -- NUMBER(5)
   v_srtdeel_prijs_prijs    VARCHAR2(1000);              -- NUMBER(8,2)
   v_srtdeel_btw            VARCHAR2(1000);              -- NUMBER(3)
   v_bestelling_leverdatum  VARCHAR2(1000);             -- DATE
   v_supplier_ref           VARCHAR2(1000);              -- VARCHAR2(30)
   v_aflever_postcode       VARCHAR2(1000);              -- VARCHAR2(15)
   v_aflever_adres          VARCHAR2(1000);              -- VARCHAR2(50)
   v_kostenplaats_nr        VARCHAR2(1000);              -- VARCHAR2(30)
   v_catalogus              VARCHAR2(1000);              -- VARCHAR2(50)

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

   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_bestelopdr_id);
         fac.imp_getfield (v_newline, c_delim, v_datum_tijd);
         fac.imp_getfield (v_newline, c_delim, v_line_number);
         fac.imp_getfield (v_newline, c_delim, v_srtdeel_nummer);
         fac.imp_getfield (v_newline, c_delim, v_srtdeel_omschrijving);
         fac.imp_getfield (v_newline, c_delim, v_srtdeel_opmerking);
         fac.imp_getfield (v_newline, c_delim, v_bestelling_item_aantal);
         fac.imp_getfield (v_newline, c_delim, v_srtdeel_prijs_prijs);
         fac.imp_getfield (v_newline, c_delim, v_srtdeel_btw);
         fac.imp_getfield (v_newline, c_delim, v_bestelling_leverdatum);
         fac.imp_getfield (v_newline, c_delim, v_supplier_ref);
         fac.imp_getfield (v_newline, c_delim, v_aflever_postcode);
         fac.imp_getfield (v_newline, c_delim, v_aflever_adres);
         fac.imp_getfield (v_newline, c_delim, v_catalogus);
         fac.imp_getfield (v_newline, c_delim, v_kostenplaats_nr);
         v_aanduiding :=
               '['
            || v_bestelopdr_id
            || '|'
            || v_srtdeel_nummer
            || '] ';

         -- 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 rec1.fac_imp_file_line = 'referenceID;dateTime;lineNumber;itemId;description;quantity;itemPrice;itemTax;deliveryDate;supplierRef;postcode;adres;catalogus;kostenplaats'
            THEN
               header_is_valid := 1;
            END IF;
         ELSE
            -- Controleer alle veldwaarden
            v_errormsg := 'Fout inlezen [' || v_bestelopdr_id || ']';

            INSERT INTO aaah_imp_upd_absoluta (bes_bestelopdr_id,
                                               datum_tijd,
                                               line_number,
                                               bes_srtdeel_nummer,
                                               bes_srtdeel_omschrijving,
                                               bes_srtdeel_opmerking,
                                               bes_bestelling_item_aantal,
                                               bes_srtdeel_prijs_prijs,
                                               bes_srtdeel_btw,
                                               bes_bestelling_leverdatum,
                                               supplier_ref,
                                               aflever_postcode,
                                               aflever_adres,
                                               catalogus,
                                               prs_kostenplaats_nr)
                      VALUES (SUBSTR(v_bestelopdr_id,1,30),
                              TO_DATE(v_datum_tijd, 'yyyy-mm-dd hh24:mi:ss'),
                              TO_NUMBER(v_line_number),
                              SUBSTR(v_srtdeel_nummer,1,32),
                              SUBSTR(v_srtdeel_omschrijving,1,100),
                              v_srtdeel_opmerking,
                              TO_NUMBER(v_bestelling_item_aantal),
                              TO_NUMBER(v_srtdeel_prijs_prijs),
                              TO_NUMBER(v_srtdeel_btw),
                              TO_DATE(v_bestelling_leverdatum, 'yyyy-mm-dd hh24:mi:ss'),
                              SUBSTR(v_supplier_ref,1,30),
                              SUBSTR(v_aflever_postcode,1,15),
                              SUBSTR(v_aflever_adres,1,50),
                              SUBSTR(v_catalogus,1,50),
                              SUBSTR(v_kostenplaats_nr,1,30));

         END IF;
      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 aaah_imp_upd_absoluta.');
      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 := SUBSTR(
            v_errormsg
         || 'ORACLE (error '
         || oracle_err_num
         || '/'
         || oracle_err_mes
         || ')', 1, 490);
      fac.imp_writelog (p_import_key,
                        'E',
                        SUBSTR(v_aanduiding, 1, 500) || ' - ' || v_errormsg,
                        'Inleesproces update Absoluta afgebroken!');
END;
/


CREATE OR REPLACE PROCEDURE aaah_update_upd_absoluta (p_import_key IN NUMBER)
AS
   -- Cursor loopt - in volgorde! - over alle ingelezen opdrachtstatusberichten.
   CURSOR c
   IS
        SELECT *
          FROM aaah_imp_upd_absoluta
      ORDER BY line_number;

   CURSOR c_del (c_bestelling_key NUMBER)
   IS
      SELECT boi.bes_bestelopdr_item_key, bes_bestelling_item_key, bes_srtdeel_omschrijving, bes_bestelling_item_aantal
        FROM bes_bestelling b,
             bes_bestelling_item bi,
             bes_bestelopdr_item boi,
             bes_bestelopdr bo,
             bes_srtdeel sd
       WHERE b.bes_bestelling_key = bi.bes_bestelling_key
         AND bi.bes_bestelopdr_item_key = boi.bes_bestelopdr_item_key(+)
         AND boi.bes_bestelopdr_key = bo.bes_bestelopdr_key(+)
         AND bi.bes_srtdeel_key = sd.bes_srtdeel_key
         AND b.bes_bestelling_key = c_bestelling_key
         AND bi.bes_bestelling_item_aantal <> 0
         AND NOT EXISTS
                (SELECT 1
                   FROM aaah_imp_upd_absoluta i
                  WHERE sd.bes_srtdeel_nr =
                           i.bes_srtdeel_nummer || '/' || i.supplier_ref);

   v_errormsg       VARCHAR2 (1000);
   oracle_err_num   NUMBER;
   oracle_err_mes   VARCHAR2 (200);
   v_aanduiding     VARCHAR2 (200);
   v_count          NUMBER;

   v_bestelling_item_aantal BES_BESTELLING_ITEM.BES_BESTELLING_ITEM_AANTAL%TYPE;
   v_bestelopdr_item_posnr  BES_BESTELOPDR_ITEM.BES_BESTELOPDR_ITEM_POSNR%TYPE;
   v_bestelling_item_key    BES_BESTELLING_ITEM.BES_BESTELLING_ITEM_KEY%TYPE;
   v_srtdeel_key            BES_SRTDEEL.BES_SRTDEEL_KEY%TYPE;
   v_bestelopdr_item_key    BES_BESTELOPDR_ITEM.BES_BESTELOPDR_ITEM_KEY%TYPE;
   v_bestelling_key         BES_BESTELLING.BES_BESTELLING_KEY%TYPE;
   v_bestelling_status      BES_BESTELLING.BES_BESTELLING_STATUS%TYPE;
   v_bestelopdr_key         BES_BESTELOPDR.BES_BESTELOPDR_KEY%TYPE;
   v_bestelopdr_status      BES_BESTELOPDR.BES_BESTELOPDR_STATUS%TYPE;
   v_adres_key_lev          MLD_ADRES.MLD_ADRES_KEY%TYPE;
   v_adres_key_lev2         MLD_ADRES.MLD_ADRES_KEY%TYPE;
   v_srtgroep_key           BES_SRTGROEP.BES_SRTGROEP_KEY%TYPE;                 -- Groep waar producten van Absoluta onder vallen.
   v_kostenplaats_key       PRS_KOSTENPLAATS.PRS_KOSTENPLAATS_KEY%TYPE;

   c_adres_key_lev          MLD_ADRES.MLD_ADRES_KEY%TYPE := 40;                 -- Hoofdkantoor
   c_perslid_key            PRS_PERSLID.PRS_PERSLID_KEY%TYPE := 62;             -- Absoluta API user
   c_kostenplaats_key       PRS_KOSTENPLAATS.PRS_KOSTENPLAATS_KEY%TYPE := 32;   -- General management
   c_bedrijf_key            PRS_BEDRIJF.PRS_BEDRIJF_KEY%TYPE := 941;            -- Absoluta
   c_srtgroep_key           BES_SRTGROEP.BES_SRTGROEP_KEY%TYPE := 41;           -- Groep waar producten van Absoluta onder vallen.

 BEGIN
   -- Loop door alle geimporteerde bestelregels en verwerk deze.
   FOR rec IN c
   LOOP
      BEGIN
         v_aanduiding :=
               '['
            || rec.bes_bestelopdr_id
            || '|'
            || rec.bes_srtdeel_nummer
            || '] ';

         -- Kijken of het afleveradres bestaat
         BEGIN
            SELECT MAX(mld_adres_key), COUNT(*)
              INTO v_adres_key_lev, v_count
              FROM mld_adres
             WHERE UPPER(REPLACE(mld_adres_bezoek_postcode, ' ')) = UPPER(REPLACE(rec.aflever_postcode, ' '));

            -- Test of er meer afleveradressen zijn met dezelfde postcode
            IF v_count > 1 THEN
               BEGIN
                  SELECT MAX(mld_adres_key), COUNT(*)
                    INTO v_adres_key_lev2, v_count
                    FROM mld_adres
                   WHERE UPPER(REPLACE(mld_adres_bezoek_postcode, ' ')) = UPPER(REPLACE(rec.aflever_postcode, ' '))
                     AND UPPER(REPLACE(mld_adres_bezoek_adres, ' ')) = UPPER(REPLACE(rec.aflever_adres, ' '));

                  IF v_count = 1
                  THEN
                     v_adres_key_lev := [REDACTED];
                  END IF;

               EXCEPTION WHEN OTHERS
               THEN
                  fac.imp_writelog (p_import_key,
                                    'W',
                                    v_aanduiding || ' Afleveradres kan niet uniek gevonden worden',
                                    'Fout bij verwerken update Absoluta.');
               END;
            END IF;

            IF v_adres_key_lev IS NULL
            THEN
               v_adres_key_lev := c_adres_key_lev;
            END IF;

         EXCEPTION WHEN OTHERS
         THEN
            -- terugvallen op de standaard.
            v_adres_key_lev := c_adres_key_lev;

            fac.imp_writelog (p_import_key,
                              'W',
                              v_aanduiding || ' Afleveradres kan niet gevonden worden',
                              'Fout bij verwerken update Absoluta.');
         END;


         IF v_bestelling_key IS NULL
         THEN
            IF rec.bes_bestelopdr_id IS NULL
            THEN
               -- probeer de bestelling te achterhalen a.d.h.v. het artikelnummer. Het artikelnummer in FACILITOR is
               -- namelijk opgebouwd uit het referentienummer van de leverancier en het artikelnummer:
               --    bes_srtdeel_nr = bes_srtdeel_nummer || '/' || supplier_ref

               BEGIN
                  SELECT DISTINCT b.bes_bestelling_key,
                                  b.bes_bestelling_status,
                                  bo.bes_bestelopdr_key,
                                  bo.bes_bestelopdr_status
                    INTO v_bestelling_key,
                         v_bestelling_status,
                         v_bestelopdr_key,
                         v_bestelopdr_status
                    FROM bes_bestelling b,
                         bes_bestelling_item bi,
                         bes_srtdeel sd,
                         bes_bestelopdr_item boi,
                         bes_bestelopdr bo
                   WHERE b.bes_bestelling_key = bi.bes_bestelling_key
                     AND bi.bes_srtdeel_key = sd.bes_srtdeel_key
                     AND bi.bes_bestelopdr_item_key = boi.bes_bestelopdr_item_key
                     AND boi.bes_bestelopdr_key = bo.bes_bestelopdr_key
                     AND sd.bes_srtdeel_nr LIKE '%/' || rec.supplier_ref;
               EXCEPTION
               WHEN NO_DATA_FOUND THEN
                  v_bestelling_key := NULL;
               WHEN OTHERS THEN
                  v_bestelling_key := NULL;
                  fac.imp_writelog (p_import_key,
                        'E',
                        v_aanduiding || 'Hoewel artikel voorkomt kan bestelling niet uniek gevonden worden.',
                        'Fout bij verwerken update Absoluta.');
               END;

               -- We gaan een nieuwe bestelling aanmaken die vanuit Absoluta geiniteerd is.
               -- We hebben dan geen kostenplaats, dus zoeken we deze op in FACILITOR.

               BEGIN
                  SELECT prs_kostenplaats_key
                    INTO v_kostenplaats_key
                    FROM prs_kostenplaats
                   WHERE prs_kostenplaats_verwijder IS NULL
                     AND prs_kostenplaats_nr = rec.prs_kostenplaats_nr;
               EXCEPTION WHEN NO_DATA_FOUND
               THEN
                  v_kostenplaats_key := c_kostenplaats_key;
               END;

               IF v_bestelling_key IS NULL
               THEN
                  -- maak nieuwe bestelling aan
                  INSERT INTO bes_bestelling (bes_bestelling_status,
                                              bes_bestelling_module,
                                              bes_bestelling_leverdatum,
                                              prs_perslid_key,
                                              prs_kostenplaats_key,
                                              mld_adres_key_lev,
                                              bes_bestelling_levkosten,
                                              bes_bestelling_korting,
                                              prs_perslid_key_voor)
                                     VALUES ( 2,
                                              'BES',
                                              rec.bes_bestelling_leverdatum,
                                              c_perslid_key,
                                              v_kostenplaats_key,
                                              v_adres_key_lev,
                                              0,
                                              0,
                                              c_perslid_key)
                         RETURNING bes_bestelling_key
                              INTO v_bestelling_key;
                  v_bestelling_status := 2;   -- nieuw

                  -- maak nieuwe opdracht aan
                  INSERT INTO bes_bestelopdr (bes_bestelopdr_id,
                                              bes_bestelopdr_status,
                                              prs_bedrijf_key,
                                              mld_adres_key_lev,
                                              mld_adres_key_fac,
                                              bes_bestelopdr_levkosten,
                                              bes_bestelopdr_korting,
                                              prs_perslid_key)
                      VALUES (v_bestelling_key || '/1',
                              2,
                              c_bedrijf_key,
                              v_adres_key_lev,
                              NULL,                 -- factuur adres
                              0,
                              0,
                              c_perslid_key)
                         RETURNING bes_bestelopdr_key
                            INTO v_bestelopdr_key;
                  v_bestelopdr_status := 2;
               END IF;

            ELSE
               -- Verzamel bestelopdracht gegevens.
               v_errormsg := 'Zoek bestelopdr';
               SELECT bes_bestelopdr_key, bes_bestelopdr_status
                 INTO v_bestelopdr_key, v_bestelopdr_status
                 FROM bes_bestelopdr bo
                WHERE bo.bes_bestelopdr_id = rec.bes_bestelopdr_id;

               -- Verzamel bestelgegevens.
               v_errormsg := 'Zoek bestelling';
               SELECT bes_bestelling_key, bes_bestelling_status
                 INTO v_bestelling_key, v_bestelling_status
                 FROM bes_bestelling b
                WHERE b.bes_bestelling_key = SUBSTR(rec.bes_bestelopdr_id, 1, INSTR(rec.bes_bestelopdr_id, '/')-1);
            END IF;
         END IF;

         -- Nu gaan we de catalogus achterhalen. Er zijn namelijk drie verschillende catalogi die door Aliance gebruikt worden.
         -- Allereerst zoeken we bij bestaande artikelen onder welke catalogus deze vallen.
         SELECT MAX(bes_srtgroep_key)
           INTO v_srtgroep_key
           FROM bes_bestelling_item bi, bes_srtdeel sd
          WHERE bi.bes_bestelling_key = v_bestelling_key
            AND bi.bes_srtdeel_key = sd.bes_srtdeel_key;

         -- Als dit niet lukt (bijvoorbeeld bij een nieuwe bestelling), dan gebruiken we de catalogus tag (accounthash) uit de xml.
         IF v_srtgroep_key IS NULL
         THEN
            SELECT MAX(bes_srtgroep_key)
              INTO v_srtgroep_key
              FROM bes_disc_params bdp, bes_srtgroep sg
             WHERE bdp.bes_disc_params_punchouturl LIKE '%' || rec.catalogus || '%'
               AND bdp.bes_ins_discipline_key = sg.ins_discipline_key
               AND sg.bes_srtgroep_verwijder IS NULL;
         END IF;

         -- kunnen we helemaal niets vinden dan vallen we terug op de default.
         IF v_srtgroep_key IS NULL
         THEN
            v_srtgroep_key := c_srtgroep_key;
         END IF;

         -- En nu op zoek naar het bestelling_item (als die gevonden kan worden)
         BEGIN
            v_errormsg := 'Zoek bestelingitem';
            SELECT bes_bestelling_item_key, sd.bes_srtdeel_key, bes_bestelopdr_item_key, bes_bestelling_item_aantal
              INTO v_bestelling_item_key, v_srtdeel_key, v_bestelopdr_item_key, v_bestelling_item_aantal
              FROM bes_bestelling_item bi, bes_srtdeel sd
             WHERE bi.bes_bestelling_key = v_bestelling_key
               AND bi.bes_srtdeel_key = sd.bes_srtdeel_key
               AND sd.bes_srtdeel_nr = rec.bes_srtdeel_nummer || '/' || rec.supplier_ref;

            -- Aanpassen huidige bestelling
            v_errormsg := 'Aanpassen srtdeel';
            UPDATE bes_srtdeel SET bes_srtdeel_omschrijving = rec.bes_srtdeel_omschrijving,
                                   bes_srtdeel_opmerking = rec.bes_srtdeel_opmerking,
                                   bes_srtdeel_btw = rec.bes_srtdeel_btw,
                                   bes_srtdeel_notitie = REPLACE(rec.bes_bestelling_leverdatum, ' ', 'T')
             WHERE bes_srtdeel_key = v_srtdeel_key;

             v_errormsg := 'Aanpassen srtdeel prijs';
             UPDATE bes_srtdeel_prijs SET bes_srtdeel_prijs_prijs = rec.bes_srtdeel_prijs_prijs
              WHERE bes_srtdeel_key = v_srtdeel_key;

              v_errormsg := 'Aanpassen bestelopdr item';
             UPDATE bes_bestelopdr_item SET bes_bestelopdr_item_aantal = rec.bes_bestelling_item_aantal,
                                            bes_bestelopdr_item_omschrijv = rec.bes_srtdeel_omschrijving,
                                            bes_bestelopdr_item_prijs = rec.bes_srtdeel_prijs_prijs,
                                            bes_bestelopdr_item_brutoprijs = rec.bes_srtdeel_prijs_prijs
              WHERE bes_bestelopdr_item_key = v_bestelopdr_item_key;

             v_errormsg := 'Aanpassen bestelling item';
             UPDATE bes_bestelling_item SET bes_bestelling_item_aantal = rec.bes_bestelling_item_aantal,
                                            bes_bestelling_item_brutoprijs = rec.bes_srtdeel_prijs_prijs,
                                            bes_bestelling_item_prijs = rec.bes_srtdeel_prijs_prijs
              WHERE bes_bestelling_item_key = v_bestelling_item_key;

             -- tracking toevoegen
             IF v_bestelling_item_aantal <> rec.bes_bestelling_item_aantal
             THEN
                FAC.trackaction ('#BESUPD', v_bestelling_key, c_perslid_key, NULL, 'Aantal artikel: ' || rec.bes_srtdeel_omschrijving || ' ' || v_bestelling_item_aantal || ' -> ' || rec.bes_bestelling_item_aantal);
             END IF;
         EXCEPTION WHEN NO_DATA_FOUND
         THEN
            v_errormsg := 'Toevoegen srtdeel';
            INSERT INTO bes_srtdeel (bes_srtgroep_key,
                                     bes_srtdeel_omschrijving,
                                     bes_srtdeel_opmerking,
                                     bes_srtdeel_aanmaak,
                                     bes_srtdeel_verwijder,
                                     bes_srtdeel_btw,
                                     bes_srtdeel_eenheid,
                                     bes_srtdeel_nr,
                                     prs_bedrijf_key,
                                     bes_srtdeel_veelvoud,
                                     bes_srtdeel_notitie)
                   VALUES (v_srtgroep_key,
                           rec.bes_srtdeel_omschrijving,
                           rec.bes_srtdeel_opmerking,
                           sysdate,
                           sysdate,
                           rec.bes_srtdeel_btw,
                           'EA',
                           rec.bes_srtdeel_nummer || '/' || rec.supplier_ref,
                           c_bedrijf_key,
                           1,
                           REPLACE(rec.bes_bestelling_leverdatum, ' ', 'T'))
                   RETURNING bes_srtdeel_key INTO v_srtdeel_key;

             v_errormsg := 'Toevoegen srtdeel prijs';
             INSERT INTO bes_srtdeel_prijs (bes_srtdeel_key, bes_srtdeel_prijs_prijs)
                    VALUES (v_srtdeel_key, rec.bes_srtdeel_prijs_prijs);

             v_errormsg := 'Toevoegen bestelopdr item';
             SELECT COALESCE(MAX(bes_bestelopdr_item_posnr),0)+1
               INTO v_bestelopdr_item_posnr
               FROM bes_bestelopdr_item
              WHERE bes_bestelopdr_key = v_bestelopdr_key;

             INSERT INTO bes_bestelopdr_item ( bes_bestelopdr_key,
                                               bes_bestelopdr_item_posnr,
                                               bes_bestelopdr_item_aantal,
                                               bes_bestelopdr_item_omschrijv,
                                               bes_bestelopdr_item_prijs,
                                               bes_bestelopdr_item_brutoprijs,
                                               bes_bestelopdr_item_status)
                    VALUES (v_bestelopdr_key,
                            v_bestelopdr_item_posnr,
                            rec.bes_bestelling_item_aantal,
                            rec.bes_srtdeel_omschrijving,
                            rec.bes_srtdeel_prijs_prijs,
                            rec.bes_srtdeel_prijs_prijs,
                            v_bestelopdr_status)
                    RETURNING bes_bestelopdr_item_key INTO v_bestelopdr_item_key;

             v_errormsg := 'Toevoegen bestelling item';
             INSERT INTO bes_bestelling_item (bes_bestelling_key,
                                              bes_bestelling_item_aantal,
                                              bes_bestelling_item_brutoprijs,
                                              bes_bestelling_item_prijs,
                                              bes_bestelopdr_item_key,
                                              bes_bestelling_item_status,
                                              bes_srtdeel_key)
                    VALUES (v_bestelling_key,
                            rec.bes_bestelling_item_aantal,
                            rec.bes_srtdeel_prijs_prijs,
                            rec.bes_srtdeel_prijs_prijs,
                            v_bestelopdr_item_key,
                            v_bestelling_status,
                            v_srtdeel_key);
             -- tracking toevoegen
             v_errormsg := 'Toevoegen tracking bij nieuw artikel';
             FAC.trackaction ('#BESUPD', v_bestelling_key, c_perslid_key, NULL, 'Aantal artikel: ' || rec.bes_srtdeel_omschrijving || ' 0 -> ' || rec.bes_bestelling_item_aantal);
         END;

      END;
   END LOOP;

   FOR rec1 IN c_del(v_bestelling_key)
   LOOP
      BEGIN
         -- verwijder bes_bestelling_item
         UPDATE bes_bestelling_item
            SET bes_bestelling_item_aantal = 0
          WHERE bes_bestelling_item_key = rec1.bes_bestelling_item_key;

         -- verwijder bes_bestelopdr_item
         UPDATE bes_bestelopdr_item
            SET bes_bestelopdr_item_aantal = 0
          WHERE bes_bestelopdr_item_key = rec1.bes_bestelopdr_item_key;
         NULL;

         FAC.trackaction ('#BESUPD', v_bestelling_key, c_perslid_key, NULL, 'Aantal artikel: ' || rec1.bes_srtdeel_omschrijving || ' ' || rec1.bes_bestelling_item_aantal || ' -> 0');
      END;
   END LOOP;

   IF v_bestelling_status = 2
   THEN
      v_errormsg := 'Aanpassen status nieuwe bestelling';
      UPDATE bes_bestelling_item
         SET bes_bestelling_item_status = 5
       WHERE bes_bestelling_key = v_bestelling_key;

      UPDATE bes_bestelopdr_item
         SET bes_bestelopdr_item_status = 4
       WHERE bes_bestelopdr_key = v_bestelopdr_key;

      BES.setbestellingstatus (v_bestelling_key, 5, 4);
   END IF;
   -- zet de status van de bestelopdracht op 'In behandeling' om ervoor te zorgen dat de bestelling
   -- alsnog naar absoluta gaat.
   BES.setbestelopdrstatus (v_bestelopdr_key, 3, 4);

   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 update Absoluta.');
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