--
-- $Id$
--
-- Stichting Parkhuis Main SQL

DEFINE thisfile = 'STPH.SQL'
DEFINE dbuser   = '^STPH'
DEFINE custid   = 'STPH'

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 ------
--
-- Personen import
--

CREATE OR REPLACE PROCEDURE stph_import_perslid (p_import_key IN NUMBER)
AS
   oracle_err_num            NUMBER;
   oracle_err_mes            VARCHAR2 (200);
   v_errormsg                VARCHAR2 (400);
   v_errorhint               VARCHAR2 (400);
BEGIN

   v_errorhint := 'Generieke update';
   -- de sequence array staat beschreven in PRS_PAC.SRC bij de prs.import_perslid proc
   prs.import_perslid (p_import_key,
                       '0;0;0;0;0;0;6;4;3;1;' ||
                       '2;0;0;0;0;10;0;8;0;5;' ||
                       '7;11;0;0;0;0;12;0;0;0;'||
                       '0;0;0;0;0;0;0;0;0;0;'||
                       '0;0;0;0;0;0',
                       'Roepnaam;Voorletters;Tussenvoegsel;Achternaam;Persnr.;Afdnr.;Functie;Email;Mobile;Telefoon;Loginnaam;%'
                       );
  COMMIT;
EXCEPTION
   WHEN OTHERS
   THEN
      oracle_err_num := SQLCODE;
      oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
      v_errormsg := 'Error ' || oracle_err_num || '/' || oracle_err_mes;
      fac.imp_writelog (p_import_key, 'E', v_errormsg, v_errorhint);
END stph_import_perslid;
/


CREATE OR REPLACE PROCEDURE stph_post_update_perslid (p_import_key IN NUMBER)
AS
    v_kostenplaats_key_perslid  NUMBER(10);
    v_kostenplaats_key_afdeling NUMBER(10);
    v_prs_afdeling_key          NUMBER(10);

    CURSOR c_perslid_kpn_kenmerk
    IS
        SELECT prs_perslid_nr, prs_kenmerk1, prs_perslid_naam, prs_afdeling_naam
        FROM fac_imp_perslid;
BEGIN

   FOR rc IN c_perslid_kpn_kenmerk
   LOOP

        BEGIN

            -- Kostenplaats die als kenmerk is meegegeven bij de persoon
            SELECT MAX(prs_kostenplaats_key)
            INTO v_kostenplaats_key_perslid
            FROM prs_kostenplaats
            WHERE prs_kostenplaats_upper = UPPER(rc.prs_kenmerk1)
            AND prs_kostenplaats_verwijder IS NULL;

            IF v_kostenplaats_key_perslid IS NULL
            THEN
              -- Kostenplaats bij de persoon (vanuit AFAS) staat niet in Facilitor, persoon blijft aan de afdeling gekoppeld volgens AFAS (dus niet naar evt. 'fictieve' afdeling).
              fac.imp_writelog (p_import_key,
                                'W',
                                'Kostenplaats van persoon' || rc.prs_perslid_nr || ' is NIET gevonden)',
                                'Naam:' || rc.prs_perslid_naam  || ' / Afdeling: ' || rc.prs_afdeling_naam
                                );
            ELSE
              -- Kostenplaats record bij de persoon is gevonden,
              -- Nu eerst de kostenplaats van de afdeling bepalen
              SELECT MAX(a.prs_kostenplaats_key)
              INTO v_kostenplaats_key_afdeling
              FROM prs_afdeling a, prs_perslid p
              WHERE p.prs_perslid_nr = rc.prs_perslid_nr
              AND p.prs_perslid_verwijder IS NULL
              AND a.prs_afdeling_key = p.prs_afdeling_key
              AND a.prs_afdeling_verwijder IS NULL;

              -- Als deze afwijkt van de kostenplaats van de afdeling waar persoon onder valt, dan persoon verhuizen naar die fictieve afdeling
              IF v_kostenplaats_key_afdeling IS NOT NULL
              THEN
                  -- Afdeling heeft kostenplaats, nu vergelijken met die van persoon
                  -- Indien ongelijk, dan zoek de fictieve afdeling, want daar persoon aan koppelen.
                  IF v_kostenplaats_key_perslid <> v_kostenplaats_key_afdeling
                  THEN
                      -- Zoek de eerste afdeling (MAX) die kostenplaats van persoon heeft, daar gaat persoon onder vallen.
                      SELECT MAX(a.prs_afdeling_key)
                      INTO v_prs_afdeling_key
                      FROM prs_afdeling a
                      WHERE a.prs_kostenplaats_key = v_kostenplaats_key_perslid
                      AND a.prs_afdeling_verwijder IS NULL;

                      IF v_prs_afdeling_key IS NOT NULL
                      THEN
                          UPDATE prs_perslid p
                          SET p.prs_afdeling_key = v_prs_afdeling_key
                          WHERE p.prs_perslid_nr = rc.prs_perslid_nr
                          AND p.prs_perslid_verwijder IS NULL;
                      END IF;
                  END IF;
              END IF;
            END IF;



        EXCEPTION
            WHEN OTHERS
                THEN
                fac.imp_writelog (p_import_key,
                                'W',
                                'Post update bij persoon' || rc.prs_perslid_nr || ' is NIET volledig uitgevoerd )',
                                'Naam:' || rc.prs_perslid_naam  || ' / Afdeling: ' || rc.prs_afdeling_naam
                                );
        END;
   END LOOP;
END;
/



CREATE OR REPLACE PROCEDURE stph_update_perslid (
   p_import_key IN NUMBER
) IS
  -- Alle personen verwijderen die niet meer in import bestand voorkomen.
  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_count           NUMBER;

BEGIN
    -- generic update

    SELECT count(*)
      INTO v_count
      FROM fac_imp_perslid;

    IF v_count < 300
    THEN
      fac.imp_writelog (p_import_key,
                        'E',
                        'Het aantal te importeren personen is te klein ('
                        || TO_CHAR (v_count) || ')',
                        'Zie Specificatie'
      );
      RETURN;
    END IF;

  -- 'NR' betekent dat op basis van personeelsNummeR wordt gematched.
  -- 'A' betekent altijd alle (andere/overige) werkplekken verwijderen
  prs.update_perslid (p_import_key, 'NR', NULL);

  -- Verwijder personen die niet meer in de import voorkomen.
  FOR rec IN c_del
  LOOP
     BEGIN
       prs.delete_perslid (p_import_key, rec.prs_perslid_key);
     END;
  END LOOP;
  STPH_post_update_perslid (p_import_key);

END stph_update_perslid;
/

--
-- BES-CATALOGUS IMPORT
--
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-- Copy van fac_import_catalogus en fac_update_catalogus van 2015.2 (d.d. 26/10/15 uit fac_pacf.src gekopieerd)
-- rename fac_ -> stph_, met volgende resultaat: 1) stph_import_catalogus 2) stph_update_catalogus en 3) stph_imp_catalogus
--
--
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------


CREATE OR REPLACE PROCEDURE stph_import_catalogus (
   p_import_key IN NUMBER
)
IS
   p_discipline_key   NUMBER(10);
   p_bedrijf_key      NUMBER(10);

   c_delim                     VARCHAR2 (1) := ';';
   v_newline                   VARCHAR2 (4000);                  -- Input line
   v_errormsg                  VARCHAR2 (1000);
   v_errorhint                 VARCHAR2 (1000);
   oracle_err_num              NUMBER;
   oracle_err_mes              VARCHAR2 (200);
   v_aanduiding                VARCHAR2 (200);
   header_is_valid             NUMBER := 0;
   v_count_tot                 NUMBER (10) := 0;
   v_count_import              NUMBER (10) := 0;
   v_ongeldig                  NUMBER (1) := 0;

   -- De importvelden
   v_discipline_omschrijving   VARCHAR2 (255);
   v_bedrijf_naam              VARCHAR2 (255);
   v_catalogus_datum           VARCHAR2 (255);
   v_srtdeel_nr                VARCHAR2 (255);
   v_srtgroep_omschrijving     VARCHAR2 (255);
   v_srtdeel_omschrijving      VARCHAR2 (255);
   v_srtdeel_prijs             VARCHAR2 (255);
   v_srtdeel_eenheid           VARCHAR2 (255);
   v_srtdeel_image             VARCHAR2 (255);
   v_srtdeel_veelvoud          VARCHAR2 (255);
   v_srtdeel_btw               VARCHAR2 (255);
   v_srtdeel_vervaldatum       VARCHAR2 (255);
   v_srtdeel_inkprijs          VARCHAR2 (255);
   v_srtdeel_minimum           VARCHAR2 (255);
   v_bes_staffeltabel_naam     VARCHAR2 (255);
   v_srtdeel_wijzigdagen       VARCHAR2 (255);
   v_srtdeel_annuleerdagen     VARCHAR2 (255);
   v_srtdeel_opmerking         VARCHAR2 (4000); -- straks afgekapt op 2000
   v_bes_srtdeel_voorraadmin   VARCHAR2 (255);
   v_bes_srtdeel_voorraadmax   VARCHAR2 (255);
   v_bes_srtdeel_voorraadfactor VARCHAR2 (255);
   v_bes_srtdeel_maxbestel     VARCHAR2 (255);
   v_bes_inclexcl_btw          VARCHAR2 (255);

   -- Overige velden:
   v_discipline_key            NUMBER (10);
   v_bedrijf_key               NUMBER (10);
   v_bes_staffeltabel_key      NUMBER (10);


   CURSOR c1
   IS
        SELECT   fac_imp_file_line,
                 LENGTH (TRIM (REPLACE (fac_imp_file_line, c_delim, '')))
                    regellengte
          FROM   FAC_IMP_FILE
         WHERE   fac_import_key = p_import_key
      ORDER BY   fac_imp_file_index;
BEGIN
  SELECT ins_discipline_key, prs_bedrijf_key
    INTO p_discipline_key, p_bedrijf_key
    FROM fac_import fi, fac_import_app fia
   WHERE fi.fac_import_key = p_import_key
     AND fi.fac_import_app_key = fia.fac_import_app_key;

   -- Eerst opruiming
   -- LET OP: we ondersteunen geen multi-variant meer
   DELETE FROM stph_imp_catalogus;

   FOR rec IN c1
   LOOP
      BEGIN
         v_aanduiding := '';
         v_errorhint := 'Fout inlezen importregel';
         v_newline := rec.fac_imp_file_line;
         v_ongeldig := 0;

         -- Lees alle veldwaarden
         fac.imp_getfield (v_newline, c_delim, v_discipline_omschrijving);
         fac.imp_getfield (v_newline, c_delim, v_bedrijf_naam);
         fac.imp_getfield (v_newline, c_delim, v_catalogus_datum);
         fac.imp_getfield (v_newline, c_delim, v_srtdeel_nr);
         fac.imp_getfield (v_newline, c_delim, v_srtgroep_omschrijving);
         fac.imp_getfield (v_newline, c_delim, v_srtdeel_omschrijving);
         fac.imp_getfield (v_newline, c_delim, v_srtdeel_prijs);
         fac.imp_getfield (v_newline, c_delim, v_srtdeel_eenheid);
         fac.imp_getfield (v_newline, c_delim, v_srtdeel_image);
         fac.imp_getfield (v_newline, c_delim, v_srtdeel_veelvoud);
         fac.imp_getfield (v_newline, c_delim, v_srtdeel_btw);
         fac.imp_getfield (v_newline, c_delim, v_srtdeel_vervaldatum);
         fac.imp_getfield (v_newline, c_delim, v_srtdeel_inkprijs);
         fac.imp_getfield (v_newline, c_delim, v_srtdeel_minimum);
         fac.imp_getfield (v_newline, c_delim, v_bes_staffeltabel_naam);
         fac.imp_getfield (v_newline, c_delim, v_srtdeel_wijzigdagen);
         fac.imp_getfield (v_newline, c_delim, v_srtdeel_annuleerdagen);
         fac.imp_getfield (v_newline, c_delim, v_srtdeel_opmerking);
         -- Voorraad kolommen
         fac.imp_getfield (v_newline, c_delim, v_bes_srtdeel_voorraadmin);
         fac.imp_getfield (v_newline, c_delim, v_bes_srtdeel_voorraadmax);
         fac.imp_getfield (v_newline, c_delim, v_bes_srtdeel_maxbestel);
         fac.imp_getfield (v_newline, c_delim, v_bes_srtdeel_voorraadfactor);
         fac.imp_getfield (v_newline, c_delim, v_bes_inclexcl_btw);



         -- Ik controleer of ik een geldige header heb, dat is: in de juiste kolommen
         -- de juiste kolomkop. Ik controleer daarbij - sinds UWVA#21562 - bijna alle
         -- kolommen (spaties in kolomheaders zijn onhandig bij "round-trip syncen").
         -- Ik negeer alles totdat ik een geldige header ben gepasseerd.
          IF (header_is_valid = 0)
         THEN
            IF UPPER (TRIM (v_discipline_omschrijving)) LIKE 'CATALOGUS%'
               AND UPPER (TRIM (v_bedrijf_naam)) = 'LEVERANCIER'
               --AND UPPER (TRIM (v_catalogus_datum)) = 'CAT DATUM' -- Laat maar!
               AND UPPER (TRIM (v_srtdeel_nr)) = 'ARTIKELNR'
               AND UPPER (TRIM (v_srtgroep_omschrijving)) = 'GROEP'
               AND UPPER (TRIM (v_srtdeel_omschrijving)) = 'OMSCHRIJVING'
               AND UPPER (TRIM (v_srtdeel_prijs)) = 'PRIJS'
               AND UPPER (TRIM (v_srtdeel_eenheid)) = 'EENHEID'
               AND UPPER (TRIM (v_srtdeel_image)) = 'PICTURE'
               AND UPPER (TRIM (v_srtdeel_veelvoud)) = 'ORDERAANTAL'
               AND UPPER (TRIM (v_srtdeel_btw)) = 'TAX'
               AND UPPER (TRIM (v_srtdeel_vervaldatum)) = 'DUEDATE'
               AND UPPER (TRIM (v_srtdeel_inkprijs)) = 'INKOOPPRIJS'
               AND UPPER (TRIM (v_srtdeel_minimum)) = 'MINIMUM'
               AND UPPER (TRIM (v_bes_staffeltabel_naam)) = 'STAFFELTABEL'
               --AND UPPER (TRIM (v_srtdeel_wijzigdagen)) = 'WIJZIGDAGEN' -- Laat maar!
               --AND UPPER (TRIM (v_srtdeel_annuleerdagen)) = 'ANNULEERDAGEN' -- Laat maar!
               AND UPPER (TRIM (v_srtdeel_opmerking)) = 'OPMERKING'
            THEN
               header_is_valid := 1;
               -- Hier checken of we de voorraad-kolommen hebben...
               -- MinVoorraad;Maxvoorraad;Maxbestel;VoorraadFactor;VoorraadOmrekenPrijs
               IF UPPER (TRIM (v_bes_srtdeel_voorraadmin))  = 'MINVOORRAAD'
                  AND UPPER (TRIM (v_bes_srtdeel_voorraadmax)) = 'MAXVOORRAAD'
                  AND UPPER (TRIM (v_bes_srtdeel_maxbestel)) = 'MAXBESTEL'
                  AND UPPER (TRIM (v_bes_srtdeel_voorraadfactor)) = 'VOORRAADFACTOR'
                  AND UPPER (TRIM (v_bes_inclexcl_btw)) = 'VOORRAADOMREKENPRIJS'
               THEN
                -- Met deze waarde '2' doen we wat met de voorraadkolommen.
                header_is_valid := 2;
                fac.imp_writelog (
                  p_import_key,
                  'I',
                  'Voorraad kolommen zijn aanwezig',
                  'Voorraad kolommen worden ingelezen'
               );
               END IF;

            END IF;
         ELSIF rec.regellengte > 1                   -- Lege regels overslaan!
         THEN
            v_count_tot := v_count_tot + 1;
            v_aanduiding :=
                  '['
               || TRIM (v_discipline_omschrijving)
               || '|'
               || TRIM (v_bedrijf_naam)
               || '|'
               || TRIM (v_srtdeel_nr)
               || '] ';

            v_discipline_omschrijving := TRIM (v_discipline_omschrijving);
            v_errorhint :=
               'Catalogus onbekend/ongeldig; regel wordt niet ingelezen';

            SELECT   ins_discipline_key
              INTO   v_discipline_key
              FROM   INS_TAB_DISCIPLINE
             WHERE   UPPER (ins_discipline_omschrijving) =
                        UPPER (v_discipline_omschrijving)
                     AND COALESCE (p_discipline_key, ins_discipline_key) =
                           ins_discipline_key -- CONN#20934/Import bedoelt voor catalogus?
                     AND ins_discipline_module = 'BES'
                     AND ins_discipline_verwijder IS NULL;

            v_bedrijf_naam := TRIM (v_bedrijf_naam);
            v_errorhint :=
               'Bedrijf onbekend/ongeldig; regel wordt niet ingelezen';

            SELECT   prs_bedrijf_key
              INTO   v_bedrijf_key
              FROM   PRS_BEDRIJF
             WHERE   UPPER (prs_bedrijf_naam) = UPPER (v_bedrijf_naam)
                     AND COALESCE (p_bedrijf_key, prs_bedrijf_key) =
                           prs_bedrijf_key     -- Import bedoelt voor bedrijf?
                     AND prs_bedrijf_verwijder IS NULL;

            v_errorhint := 'Fout bij controleren importregel';

            -- Indien leeg, dan catalogusdatum=SYSDATE gebruiken!
            v_catalogus_datum :=
               COALESCE (TRIM (v_catalogus_datum),
                         TO_CHAR (SYSDATE, 'yyyymmdd'));

            IF fac.safe_to_date (v_catalogus_datum, 'yyyymmdd') IS NULL
            THEN
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || 'Ongeldige catalogusdatum',
                                 'Regel wordt niet ingelezen');
               v_ongeldig := 1;
            END IF;

            v_srtdeel_nr := TRIM (v_srtdeel_nr);

            IF LENGTH (v_srtdeel_nr) > 32
            THEN
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || 'Artikelnummer te lang',
                  'Nummer wordt afgebroken (Nr:' || v_srtdeel_nr || ')'
               );
            END IF;

            v_srtgroep_omschrijving := TRIM (v_srtgroep_omschrijving);

            IF LENGTH (v_srtgroep_omschrijving) > 60
            THEN
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || 'Groepomschrijving te lang',
                  'Omschrijving wordt afgebroken (Nr:' || v_srtdeel_nr || ')'
               );
            END IF;

            v_srtdeel_omschrijving := TRIM (v_srtdeel_omschrijving);

            IF LENGTH (v_srtdeel_omschrijving) > 100
            THEN
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || 'Artikelomschrijving te lang',
                  'Omschrijving wordt afgebroken (Nr:' || v_srtdeel_nr || ')'
               );
            END IF;

            -- Indien leeg, dan blijft/wordt prijs=ongedefinieerd=NULL!
            v_srtdeel_prijs := TRIM (v_srtdeel_prijs);

            IF v_srtdeel_prijs IS NOT NULL
               AND fac.safe_to_number (v_srtdeel_prijs) IS NULL
            THEN
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || 'Ongeldige prijs',
                  'Regel wordt niet ingelezen (Nr:' || v_srtdeel_nr || ')'
               );
               v_ongeldig := 1;
            END IF;

            v_srtdeel_eenheid := TRIM (v_srtdeel_eenheid);

            IF LENGTH (v_srtdeel_eenheid) > 30
            THEN
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || 'Eenheid te lang',
                  'Eenheid wordt afgebroken (Nr:' || v_srtdeel_nr || ')'
               );
            END IF;

            v_srtdeel_image := TRIM (v_srtdeel_image);

            IF LENGTH (v_srtdeel_image) > 255
            THEN
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || 'Imagenaam te lang',
                  'Naam wordt afgebroken (Nr:' || v_srtdeel_nr || ')'
               );
            END IF;

            -- Veelvoud mag niet negatief of meer zijn dan 6 posities lang.
            -- Indien leeg, dan veelvoud=1!
            v_srtdeel_veelvoud := COALESCE (TRIM (v_srtdeel_veelvoud), '1');

            IF    fac.safe_to_number (v_srtdeel_veelvoud) IS NULL
               OR fac.safe_to_number (v_srtdeel_veelvoud) < 0
               OR fac.safe_to_number (v_srtdeel_veelvoud) > 999999
            THEN
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || 'Ongeldig veelvoud',
                  'Regel wordt niet ingelezen (Nr:' || v_srtdeel_nr || ')'
               );
               v_ongeldig := 1;
            END IF;

            -- Indien leeg, dan blijft/wordt BTW-tarief=ongedefinieerd=NULL!
            v_srtdeel_btw := TRIM (v_srtdeel_btw);

            IF v_srtdeel_btw IS NOT NULL
               AND fac.safe_to_number (v_srtdeel_btw) IS NULL
            THEN
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || 'Ongeldig BTW-tarief',
                  'Regel wordt niet ingelezen (Nr:' || v_srtdeel_nr || ')'
               );
               v_ongeldig := 1;
            END IF;

            -- Indien leeg, dan blijft/wordt vervaldatum=ongedefinieerd=NULL!
            v_srtdeel_vervaldatum := TRIM (v_srtdeel_vervaldatum);

            IF v_srtdeel_vervaldatum IS NOT NULL
               AND fac.safe_to_date (v_srtdeel_vervaldatum, 'yyyymmdd') IS NULL
            THEN
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || 'Ongeldige vervaldatum',
                  'Regel wordt niet ingelezen (Nr:' || v_srtdeel_nr || ')'
               );
               v_ongeldig := 1;
            END IF;

            -- Indien leeg, dan blijft/wordt inkoopprijs=ongedefinieerd=NULL!
            v_srtdeel_inkprijs := TRIM (v_srtdeel_inkprijs);

            IF v_srtdeel_inkprijs IS NOT NULL
               AND fac.safe_to_number (v_srtdeel_inkprijs) IS NULL
            THEN
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || 'Ongeldige inkoopprijs',
                  'Regel wordt niet ingelezen (Nr:' || v_srtdeel_nr || ')'
               );
               v_ongeldig := 1;
            END IF;

            -- Minimum mag niet negatief of meer zijn dan 6 posities lang.
            -- Indien leeg, dan blijft/wordt minimum=ongedefinieerd=NULL!
            v_srtdeel_minimum := TRIM (v_srtdeel_minimum);

            IF v_srtdeel_minimum IS NOT NULL
               AND (   fac.safe_to_number (v_srtdeel_minimum) IS NULL
                    OR fac.safe_to_number (v_srtdeel_minimum) < 0
                    OR fac.safe_to_number (v_srtdeel_minimum) > 999999)
            THEN
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || 'Ongeldig minimum',
                  'Regel wordt niet ingelezen (Nr:' || v_srtdeel_nr || ')'
               );
               v_ongeldig := 1;
            END IF;

            v_bes_staffeltabel_naam := TRIM (v_bes_staffeltabel_naam);
            v_errorhint :=
               'Fout bij bepalen staffeltabel; regel wordt niet ingelezen';

            IF v_bes_staffeltabel_naam IS NOT NULL
            THEN
               SELECT   bes_staffeltabel_key
                 INTO   v_bes_staffeltabel_key
                 FROM   bes_staffeltabel
                WHERE   UPPER (bes_staffeltabel_naam) =
                           UPPER (v_bes_staffeltabel_naam);
            END IF;

            -- Wijzigdagen mag niet negatief of meer zijn dan 3 posities lang.
            -- Indien leeg, dan blijft/wordt wijzigdagen=ongedefinieerd=NULL!
            v_srtdeel_wijzigdagen := TRIM (v_srtdeel_wijzigdagen);

            IF v_srtdeel_wijzigdagen IS NOT NULL
               AND (   fac.safe_to_number (v_srtdeel_wijzigdagen) IS NULL
                    OR fac.safe_to_number (v_srtdeel_wijzigdagen) < 0
                    OR fac.safe_to_number (v_srtdeel_wijzigdagen) > 999)
            THEN
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || 'Ongeldig aantal wijzigdagen',
                  'Regel wordt niet ingelezen (Nr:' || v_srtdeel_nr || ')'
               );
               v_ongeldig := 1;
            END IF;

            -- Annuleerdagen mag niet negatief of meer zijn dan 3 posities lang.
            -- Indien leeg, dan blijft/wordt annuleerdagen=ongedefinieerd=NULL!
            v_srtdeel_annuleerdagen := TRIM (v_srtdeel_annuleerdagen);

            IF v_srtdeel_annuleerdagen IS NOT NULL
               AND (   fac.safe_to_number (v_srtdeel_annuleerdagen) IS NULL
                    OR fac.safe_to_number (v_srtdeel_annuleerdagen) < 0
                    OR fac.safe_to_number (v_srtdeel_annuleerdagen) > 999)
            THEN
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || 'Ongeldig aantal annuleerdagen',
                  'Regel wordt niet ingelezen (Nr:' || v_srtdeel_nr || ')'
               );
               v_ongeldig := 1;
            END IF;

            v_srtdeel_opmerking := TRIM (v_srtdeel_opmerking);

            IF LENGTH (v_srtdeel_opmerking) > 2000
            THEN
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || 'Opmerking te lang',
                  'Opmerking wordt afgebroken (Nr:' || v_srtdeel_nr || ')'
               );
            END IF;


            IF (header_is_valid = 2)
            THEN

                -- We hebben van doen met de BES interne catalogus (voorraad) kolommen.

                v_bes_srtdeel_voorraadmin := TRIM (v_bes_srtdeel_voorraadmin);
                IF v_bes_srtdeel_voorraadmin IS NOT NULL
                   AND (   fac.safe_to_number (v_bes_srtdeel_voorraadmin) IS NULL
                        OR fac.safe_to_number (v_bes_srtdeel_voorraadmin) < 0
                        OR fac.safe_to_number (v_bes_srtdeel_voorraadmin) > 999999)
                THEN
                   fac.imp_writelog (
                      p_import_key,
                      'W',
                      v_aanduiding || 'Ongeldig minimum voorraad',
                      'Regel wordt niet ingelezen (Nr:' || v_srtdeel_nr || ')'
                   );
                   v_ongeldig := 1;
                END IF;

                v_bes_srtdeel_voorraadmax := TRIM (v_bes_srtdeel_voorraadmax);
                IF v_bes_srtdeel_voorraadmax IS NOT NULL
                   AND (   fac.safe_to_number (v_bes_srtdeel_voorraadmax) IS NULL
                        OR fac.safe_to_number (v_bes_srtdeel_voorraadmax) < 0
                        OR fac.safe_to_number (v_bes_srtdeel_voorraadmax) > 999999)
                THEN
                   fac.imp_writelog (
                      p_import_key,
                      'W',
                      v_aanduiding || 'Ongeldig maximum voorraad',
                      'Regel wordt niet ingelezen (Nr:' || v_srtdeel_nr || ')'
                   );
                   v_ongeldig := 1;
                END IF;

                v_bes_srtdeel_maxbestel := TRIM (v_bes_srtdeel_maxbestel);
                IF v_bes_srtdeel_maxbestel IS NOT NULL
                   AND (   fac.safe_to_number (v_bes_srtdeel_maxbestel) IS NULL
                        OR fac.safe_to_number (v_bes_srtdeel_maxbestel) < 0
                        OR fac.safe_to_number (v_bes_srtdeel_maxbestel) > 1)
                THEN
                   fac.imp_writelog (
                      p_import_key,
                      'W',
                      v_aanduiding || 'Ongeldige MaxBestel',
                      'Regel wordt niet ingelezen (Nr:' || v_srtdeel_nr || ')'
                   );
                   v_ongeldig := 1;
                END IF;

                v_bes_srtdeel_voorraadfactor := TRIM (v_bes_srtdeel_voorraadfactor);
                IF v_bes_srtdeel_voorraadfactor IS NOT NULL
                   AND (   fac.safe_to_number (v_bes_srtdeel_voorraadfactor) IS NULL
                        OR fac.safe_to_number (v_bes_srtdeel_voorraadfactor) < 0
                        OR fac.safe_to_number (v_bes_srtdeel_voorraadfactor) > 999999)
                THEN
                   fac.imp_writelog (
                      p_import_key,
                      'W',
                      v_aanduiding || 'Ongeldig voorraadfactor',
                      'Regel wordt niet ingelezen (Nr:' || v_srtdeel_nr || ')'
                   );
                   v_ongeldig := 1;
                END IF;


                v_bes_inclexcl_btw := TRIM (v_bes_inclexcl_btw);
                IF v_bes_inclexcl_btw IS NOT NULL
                   AND (   fac.safe_to_number (v_bes_inclexcl_btw) IS NULL
                        OR fac.safe_to_number (v_bes_inclexcl_btw) < 0
                        OR fac.safe_to_number (v_bes_inclexcl_btw) > 3)
                THEN
                   fac.imp_writelog (
                      p_import_key,
                      'W',
                      v_aanduiding || 'Ongeldige Voorraad OmrekenPrijs',
                      'Regel wordt niet ingelezen (Nr:' || v_srtdeel_nr || ')'
                   );
                   v_ongeldig := 1;
                END IF;
            END IF;


            IF v_ongeldig = 0
            THEN
               v_errorhint := 'Fout toevoegen importregel';

               INSERT INTO STPH_IMP_CATALOGUS (
                                                 fac_import_key,
                                                 ins_discipline_key,
                                                 prs_bedrijf_key,
                                                 fac_imp_catalogus_datum,
                                                 ins_srtdeel_nr,
                                                 ins_srtgroep_omschrijving,
                                                 ins_srtdeel_omschrijving,
                                                 ins_srtdeel_prijs,
                                                 ins_srtdeel_inkprijs,
                                                 ins_srtdeel_eenheid,
                                                 ins_srtdeel_image,
                                                 ins_srtdeel_veelvoud,
                                                 ins_srtdeel_btw,
                                                 ins_srtdeel_vervaldatum,
                                                 ins_srtdeel_minimum,
                                                 bes_staffeltabel_key,
                                                 ins_srtdeel_wijzigdagen,
                                                 ins_srtdeel_annuleerdagen,
                                                 ins_srtdeel_opmerking
                          )
                 VALUES   (
                              p_import_key,
                              v_discipline_key,
                              v_bedrijf_key,
                              fac.safe_to_date (v_catalogus_datum,
                                                'yyyymmdd'),
                              SUBSTR (v_srtdeel_nr, 1, 32),
                              SUBSTR (v_srtgroep_omschrijving, 1, 60),
                              SUBSTR (v_srtdeel_omschrijving, 1, 100),
                              fac.safe_to_number (v_srtdeel_prijs),
                              fac.safe_to_number (v_srtdeel_inkprijs),
                              SUBSTR (v_srtdeel_eenheid, 1, 30),
                              SUBSTR (v_srtdeel_image, 1, 255),
                              fac.safe_to_number (v_srtdeel_veelvoud),
                              fac.safe_to_number (v_srtdeel_btw),
                              fac.safe_to_date (v_srtdeel_vervaldatum,
                                                'yyyymmdd'),
                              fac.safe_to_number (v_srtdeel_minimum),
                              v_bes_staffeltabel_key,
                              fac.safe_to_number (v_srtdeel_wijzigdagen),
                              fac.safe_to_number (v_srtdeel_annuleerdagen),
                              SUBSTR (v_srtdeel_opmerking, 1, 2000)
                          );

                IF (header_is_valid = 2)
                THEN
                  -- Met voorraad gegevens erbij
                  UPDATE STPH_IMP_CATALOGUS
                  SET
                    bes_srtdeel_voorraadmin = v_bes_srtdeel_voorraadmin,
                    bes_srtdeel_voorraadmax = v_bes_srtdeel_voorraadmax,
                    bes_srtdeel_maxbestel = v_bes_srtdeel_maxbestel,
                    bes_srtdeel_voorraadfactor = v_bes_srtdeel_voorraadfactor,
                    bes_inclexcl_btw = v_bes_inclexcl_btw
                  WHERE fac_import_key = p_import_key
                  AND ins_discipline_key = v_discipline_key
                  AND prs_bedrijf_key = v_bedrijf_key
                  AND ins_srtdeel_nr = SUBSTR (v_srtdeel_nr, 1, 32)
                  AND ins_srtdeel_eenheid = SUBSTR (v_srtdeel_eenheid, 1, 30);
                END IF;

                v_count_import := v_count_import + 1;
            END IF;
         END IF;
      EXCEPTION
         WHEN OTHERS
         THEN
            oracle_err_num := SQLCODE;
            oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
            v_errormsg :=
                  'ORACLE (error '
               || oracle_err_num
               || '/'
               || oracle_err_mes
               || ')';
            fac.imp_writelog (p_import_key,
                              'W',
                              v_aanduiding || v_errormsg,
                              v_errorhint);
      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!');
   ELSE
      fac.imp_writelog (
         p_import_key,
         'S',
         'Inleesproces: aantal ingelezen importregels: '
         || TO_CHAR (v_count_tot),
         ''
      );
      fac.imp_writelog (
         p_import_key,
         'S',
         'Inleesproces: aantal ongeldige niet ingelezen importregels: '
         || TO_CHAR (v_count_tot - v_count_import),
         ''
      );
   END IF;

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


/* Formatted on 19-7-2011 17:34:34 (QP5 v5.115.810.9015) */
CREATE OR REPLACE PROCEDURE stph_update_catalogus (
   p_import_key IN NUMBER
)
AS
   v_errormsg       VARCHAR2 (1000);
   oracle_err_num   NUMBER;
   oracle_err_mes   VARCHAR2 (200);
   v_aanduiding     VARCHAR2 (200);
   v_disc_oms       VARCHAR2 (100);
   v_bedr_naam      VARCHAR2 (100);

   -- Voor één catalogus
   PROCEDURE l_update_catalogus (pdisc_key IN NUMBER, pbedr_key IN NUMBER)
   AS
      CURSOR c_delsrtdeel (
         cdisc_key   IN            NUMBER,
         cbedr_key   IN            NUMBER
      )
      IS
         SELECT   sd.bes_srtdeel_key,
                  sd.bes_srtdeel_nr,
                  sd.bes_srtdeel_omschrijving
           FROM   bes_srtdeel sd, bes_srtgroep sg
          WHERE       sd.bes_srtgroep_key = sg.bes_srtgroep_key
                  AND sg.ins_discipline_key = cdisc_key
                  AND sd.prs_bedrijf_key = cbedr_key
                  AND sd.bes_srtdeel_verwijder IS NULL
                  AND NOT EXISTS -- Niet meer in importbestand irt. cat/bedrijf!
                        (SELECT   1
                           FROM   stph_imp_catalogus f
                          WHERE   fac_import_key = p_import_key
                                  AND f.ins_discipline_key = cdisc_key
                                  AND f.prs_bedrijf_key = cbedr_key
                                  AND UPPER (f.ins_srtdeel_nr) =
                                        UPPER (sd.bes_srtdeel_nr));

      CURSOR c_delsrtgroep (
         cdisc_key   IN            NUMBER,
         cbedr_key   IN            NUMBER
      )
      IS
         SELECT   sg.bes_srtgroep_key, sg.bes_srtgroep_omschrijving
           FROM   bes_srtgroep sg
          WHERE   sg.ins_discipline_key = cdisc_key
                  AND sg.bes_srtgroep_verwijder IS NULL
                  AND NOT EXISTS -- Niet meer in importbestand irt. alleen cat!
                        (SELECT   1
                           FROM   stph_imp_catalogus f
                          WHERE   fac_import_key = p_import_key
                                  AND f.ins_discipline_key = cdisc_key
                                  AND UPPER (f.ins_srtgroep_omschrijving) =
                                        UPPER (sg.bes_srtgroep_omschrijving))
                  AND NOT EXISTS -- Waaronder geen artikelen van ander bedrijf!
                        (SELECT   1
                           FROM   bes_srtdeel sd
                          WHERE   sd.bes_srtgroep_key = sg.bes_srtgroep_key
                                  AND sd.prs_bedrijf_key <> cbedr_key);

      CURSOR c_inssrtgroep (
         cdisc_key   IN            NUMBER,
         cbedr_key   IN            NUMBER
      )
      IS
         SELECT   DISTINCT f.ins_srtgroep_omschrijving
           FROM   stph_imp_catalogus f
          WHERE   fac_import_key = p_import_key
                  AND f.ins_srtgroep_omschrijving IS NOT NULL
                  AND f.ins_discipline_key = cdisc_key
                  AND f.prs_bedrijf_key = cbedr_key
                  AND NOT EXISTS
                        (SELECT   1
                           FROM   bes_srtgroep sg
                          WHERE   sg.ins_discipline_key = cdisc_key
                                  AND UPPER (sg.bes_srtgroep_omschrijving) =
                                        UPPER (f.ins_srtgroep_omschrijving)
                                  AND sg.bes_srtgroep_verwijder IS NULL);

      CURSOR c_updsrtdeel (
         cdisc_key   IN            NUMBER,
         cbedr_key   IN            NUMBER
      )
      IS
         SELECT   s.bes_srtdeel_key, f.*
           FROM   stph_imp_catalogus f, bes_srtgroep g, bes_srtdeel s
          WHERE       fac_import_key = p_import_key
                  AND f.ins_discipline_key = cdisc_key
                  AND f.prs_bedrijf_key = cbedr_key
                  AND g.ins_discipline_key = cdisc_key
                  AND g.bes_srtgroep_key = s.bes_srtgroep_key
                  AND UPPER (s.bes_srtdeel_nr) = UPPER (f.ins_srtdeel_nr)
                  AND s.prs_bedrijf_key = cbedr_key
                  AND s.bes_srtdeel_verwijder IS NULL;

      CURSOR c_inssrtdeel (
         cdisc_key   IN            NUMBER,
         cbedr_key   IN            NUMBER
      )
      IS
         SELECT   f.*
           FROM   stph_imp_catalogus f
          WHERE   fac_import_key = p_import_key
                  AND f.ins_discipline_key = cdisc_key
                  AND f.prs_bedrijf_key = cbedr_key
                  AND NOT EXISTS
                        (SELECT   1
                           FROM   bes_srtgroep g, bes_srtdeel s
                          WHERE   g.ins_discipline_key = cdisc_key
                                  AND g.bes_srtgroep_key = s.bes_srtgroep_key
                                  AND UPPER (s.bes_srtdeel_nr) =
                                        UPPER (f.ins_srtdeel_nr)
                                  AND s.prs_bedrijf_key = cbedr_key
                                  AND s.bes_srtdeel_verwijder IS NULL);

      ccount            NUMBER (10);
      l_srtgroep_key    NUMBER (10);
      l_bes_srtdeel_key bes_srtdeel.bes_srtdeel_key%TYPE;
      l_omschrijving    bes_srtdeel.bes_srtdeel_omschrijving%TYPE;
      l_prijs           bes_srtdeel_prijs.bes_srtdeel_prijs_prijs%TYPE;
      l_inkprijs        bes_srtdeel_prijs.bes_srtdeel_prijs_inkprijs%TYPE;
      l_veelvoud        bes_srtdeel.bes_srtdeel_veelvoud%TYPE;
      l_minimum         bes_srtdeel.bes_srtdeel_minimum%TYPE;
      l_wijzigdagen     bes_srtdeel.bes_srtdeel_wijzigdagen%TYPE;
      l_annuleerdagen   bes_srtdeel.bes_srtdeel_annuleerdagen%TYPE;
      l_opmerking       bes_srtdeel.bes_srtdeel_opmerking%TYPE;
   BEGIN
      -- DELETE SRTDEEL
      ccount := 0;

      FOR rec IN c_delsrtdeel (pdisc_key, pbedr_key)
      LOOP
         v_errormsg := 'Fout bij verwijderen artikel ' || rec.bes_srtdeel_nr;

         UPDATE   bes_srtdeel
            SET   bes_srtdeel_verwijder = SYSDATE
          WHERE   bes_srtdeel_key = rec.bes_srtdeel_key;

         v_errormsg := 'Fout bij verwijderen artikelkenmerken ' || rec.bes_srtdeel_nr;
         UPDATE   bes_kenmerk
            SET   bes_kenmerk_verwijder = SYSDATE
          WHERE   bes_kenmerk_niveau = 'S'
            AND   bes_srtinstallatie_key = rec.bes_srtdeel_key;

         fac.imp_writelog (
            p_import_key,
            'I',
               v_aanduiding
            || 'Artikel '
            || rec.bes_srtdeel_nr
            || '/'
            || rec.bes_srtdeel_omschrijving
            || ' is verwijderd',
            ''
         );
         ccount := ccount + 1;
      END LOOP;

      fac.imp_writelog (
         p_import_key,
         'S',
            v_aanduiding
         || 'Er zijn '
         || TO_CHAR (ccount)
         || ' artikelen verwijderd',
         ''
      );

      COMMIT;

      -- DELETE SRTGROEP
      ccount := 0;

      FOR rec IN c_delsrtgroep (pdisc_key, pbedr_key)
      LOOP
         v_errormsg := 'Fout bij verwijderen groep ' || rec.bes_srtgroep_omschrijving;

         UPDATE   bes_srtgroep
            SET   bes_srtgroep_verwijder = SYSDATE
          WHERE   bes_srtgroep_key = rec.bes_srtgroep_key;

         v_errormsg := 'Fout bij verwijderen groepskenmerken ' || rec.bes_srtgroep_omschrijving;
         UPDATE   bes_kenmerk
            SET   bes_kenmerk_verwijder = SYSDATE
          WHERE   bes_kenmerk_niveau = 'G'
            AND   bes_srtinstallatie_key = rec.bes_srtgroep_key;

         fac.imp_writelog (
            p_import_key,
            'I',
               v_aanduiding
            || 'Groep '
            || rec.bes_srtgroep_omschrijving
            || ' is verwijderd',
            ''
         );
         ccount := ccount + 1;
      END LOOP;

      fac.imp_writelog (
         p_import_key,
         'S',
            v_aanduiding
         || 'Er zijn '
         || TO_CHAR (ccount)
         || ' groepen verwijderd',
         ''
      );

      COMMIT;

      -- INSERT SRTGROEP
      ccount := 0;

      FOR rec IN c_inssrtgroep (pdisc_key, pbedr_key)
      LOOP
         BEGIN
            v_errormsg :=
               'Fout bij toevoegen groep ' || rec.ins_srtgroep_omschrijving;

            INSERT INTO bes_srtgroep (
                                         ins_discipline_key,
                                         bes_srtgroep_omschrijving
                       )
              VALUES   (pdisc_key, rec.ins_srtgroep_omschrijving);

            fac.imp_writelog (
               p_import_key,
               'I',
                  v_aanduiding
               || 'Groep '
               || rec.ins_srtgroep_omschrijving
               || ' is toegevoegd',
               ''
            );
            ccount := ccount + 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,
                                 'W',
                                 v_aanduiding || v_errormsg,
                                 '');
         END;
      END LOOP;

      fac.imp_writelog (
         p_import_key,
         'S',
            v_aanduiding
         || 'Er zijn '
         || TO_CHAR (ccount)
         || ' groepen toegevoegd',
         ''
      );

      COMMIT;

      -- UPDATE SRTDEEL
      ccount := 0;

      FOR rec IN c_updsrtdeel (pdisc_key, pbedr_key)
      LOOP
         BEGIN
            v_errormsg :=
               'Fout bij bepalen groep ' || rec.ins_srtgroep_omschrijving;

            SELECT   bes_srtgroep_key
              INTO   l_srtgroep_key
              FROM   bes_srtgroep
             WHERE   bes_srtgroep_verwijder IS NULL
                     AND ins_discipline_key = pdisc_key
                     AND UPPER (bes_srtgroep_omschrijving) =
                           UPPER (rec.ins_srtgroep_omschrijving);

            v_errormsg :=
               'Fout bij bepalen huidige artikel-velden '
               || rec.ins_srtdeel_nr;

            -- Tbv. logging de oude waarden opzoeken.
            SELECT   bes_srtdeel_omschrijving,
                     bes.getsrtdeelprijs (rec.bes_srtdeel_key, NULL),
                     bes.getsrtdeelinkprijs (rec.bes_srtdeel_key, NULL),
                     bes_srtdeel_veelvoud,
                     bes_srtdeel_minimum,
                     bes_srtdeel_wijzigdagen,
                     bes_srtdeel_annuleerdagen,
                     bes_srtdeel_opmerking
              INTO   l_omschrijving,
                     l_prijs,
                     l_inkprijs,
                     l_veelvoud,
                     l_minimum,
                     l_wijzigdagen,
                     l_annuleerdagen,
                     l_opmerking
              FROM   bes_srtdeel
             WHERE   bes_srtdeel_verwijder IS NULL
                     AND bes_srtdeel_key = rec.bes_srtdeel_key;

            v_errormsg := 'Fout bij bijwerken artikel ' || rec.ins_srtdeel_nr;

            -- Codetechnisch zou hier bes.upsert_srtdeel() passen, maar die doet bv nog geen inkprijs.
            -- Later nog eens TODO
            UPDATE   bes_srtdeel
               SET   bes_srtgroep_key = l_srtgroep_key,
                     bes_srtdeel_omschrijving = rec.ins_srtdeel_omschrijving,
                     bes_srtdeel_image = rec.ins_srtdeel_image,
                     bes_srtdeel_btw = rec.ins_srtdeel_btw,
                     bes_srtdeel_eenheid = rec.ins_srtdeel_eenheid,
                     bes_srtdeel_vervaldatum = rec.ins_srtdeel_vervaldatum,
                     bes_srtdeel_veelvoud = rec.ins_srtdeel_veelvoud,
                     bes_srtdeel_minimum = rec.ins_srtdeel_minimum,
                     bes_staffeltabel_key = rec.bes_staffeltabel_key,
                     bes_srtdeel_wijzigdagen = rec.ins_srtdeel_wijzigdagen,
                     bes_srtdeel_annuleerdagen = rec.ins_srtdeel_annuleerdagen,
                     bes_srtdeel_opmerking = rec.ins_srtdeel_opmerking
             WHERE   bes_srtdeel_verwijder IS NULL
                 AND bes_srtdeel_key = rec.bes_srtdeel_key;

            IF l_omschrijving <> rec.ins_srtdeel_omschrijving
            THEN
               fac.imp_writelog (
                  p_import_key,
                  'I',
                     'Artikel '
                  || rec.ins_srtdeel_nr
                  || '/'
                  || rec.ins_srtdeel_omschrijving
                  || ' is gewijzigd',
                     'Omschrijving '
                  || l_omschrijving
                  || ' -> '
                  || rec.ins_srtdeel_omschrijving
               );
            END IF;

            bes.upsert_srtdeel_prijs (rec.bes_srtdeel_key, rec.ins_srtdeel_prijs, rec.ins_srtdeel_inkprijs);

            IF l_prijs <> rec.ins_srtdeel_prijs
            THEN
               fac.imp_writelog (
                  p_import_key,
                  'I',
                     'Artikel '
                  || rec.ins_srtdeel_nr
                  || '/'
                  || rec.ins_srtdeel_omschrijving
                  || ' is gewijzigd',
                  'Prijs ' || l_prijs || ' -> ' || rec.ins_srtdeel_prijs
               );
            END IF;

            IF l_inkprijs <> rec.ins_srtdeel_inkprijs
            THEN
               fac.imp_writelog (
                  p_import_key,
                  'I',
                     'Artikel '
                  || rec.ins_srtdeel_nr
                  || '/'
                  || rec.ins_srtdeel_omschrijving
                  || ' is gewijzigd',
                     'Inkoopprijs '
                  || l_inkprijs
                  || ' -> '
                  || rec.ins_srtdeel_inkprijs
               );
            END IF;

            IF l_veelvoud <> rec.ins_srtdeel_veelvoud
            THEN
               fac.imp_writelog (
                  p_import_key,
                  'I',
                     'Artikel '
                  || rec.ins_srtdeel_nr
                  || '/'
                  || rec.ins_srtdeel_omschrijving
                  || ' is gewijzigd',
                     'Bestelveelvoud '
                  || l_veelvoud
                  || ' -> '
                  || rec.ins_srtdeel_veelvoud
               );
            END IF;

            IF l_minimum <> rec.ins_srtdeel_minimum
            THEN
               fac.imp_writelog (
                  p_import_key,
                  'I',
                     'Artikel '
                  || rec.ins_srtdeel_nr
                  || '/'
                  || rec.ins_srtdeel_omschrijving
                  || ' is gewijzigd',
                     'Bestelminimum '
                  || l_minimum
                  || ' -> '
                  || rec.ins_srtdeel_minimum
               );
            END IF;

            IF l_wijzigdagen <> rec.ins_srtdeel_wijzigdagen
            THEN
               fac.imp_writelog (
                  p_import_key,
                  'I',
                     'Artikel '
                  || rec.ins_srtdeel_nr
                  || '/'
                  || rec.ins_srtdeel_omschrijving
                  || ' is gewijzigd',
                     'Wijzigdagen '
                  || l_wijzigdagen
                  || ' -> '
                  || rec.ins_srtdeel_wijzigdagen
               );
            END IF;

            IF l_annuleerdagen <> rec.ins_srtdeel_annuleerdagen
            THEN
               fac.imp_writelog (
                  p_import_key,
                  'I',
                     'Artikel '
                  || rec.ins_srtdeel_nr
                  || '/'
                  || rec.ins_srtdeel_omschrijving
                  || ' is gewijzigd',
                     'Annuleerdagen '
                  || l_annuleerdagen
                  || ' -> '
                  || rec.ins_srtdeel_annuleerdagen
               );
            END IF;

            IF l_opmerking <> rec.ins_srtdeel_opmerking
            THEN
               fac.imp_writelog (
                  p_import_key,
                  'I',
                     'Artikel '
                  || rec.ins_srtdeel_nr
                  || '/'
                  || rec.ins_srtdeel_opmerking
                  || ' is gewijzigd',
                     'Opmerking '
                  || l_opmerking
                  || ' -> '
                  || rec.ins_srtdeel_opmerking
               );
            END IF;

            ccount := ccount + 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,
                                 'W',
                                 v_aanduiding || v_errormsg,
                                 '');
         END;
      END LOOP;

      fac.imp_writelog (
         p_import_key,
         'S',
            v_aanduiding
         || 'Er zijn '
         || TO_CHAR (ccount)
         || ' artikelen bijgewerkt',
         ''
      );

      COMMIT;

      -- INSERT SRTDEEL
      ccount := 0;

      FOR rec IN c_inssrtdeel (pdisc_key, pbedr_key)
      LOOP
         BEGIN
            v_errormsg :=
               'Fout bij bepalen groep ' || rec.ins_srtgroep_omschrijving;

            SELECT   bes_srtgroep_key
              INTO   l_srtgroep_key
              FROM   bes_srtgroep
             WHERE   bes_srtgroep_verwijder IS NULL
                     AND ins_discipline_key = pdisc_key
                     AND UPPER (bes_srtgroep_omschrijving) =
                           UPPER (rec.ins_srtgroep_omschrijving);

            v_errormsg := 'Fout bij toevoegen artikel ' || rec.ins_srtdeel_nr;

            INSERT INTO bes_srtdeel (bes_srtgroep_key,
                                     bes_srtdeel_nr,
                                     bes_srtdeel_omschrijving,
                                     bes_srtdeel_image,
                                     bes_srtdeel_btw,
                                     bes_srtdeel_eenheid,
                                     bes_srtdeel_dimensie,
                                     prs_bedrijf_key,
                                     bes_srtdeel_vervaldatum,
                                     bes_srtdeel_veelvoud,
                                     bes_srtdeel_minimum,
                                     bes_staffeltabel_key,
                                     bes_srtdeel_wijzigdagen,
                                     bes_srtdeel_annuleerdagen,
                                     bes_srtdeel_opmerking)
              VALUES   (l_srtgroep_key,
                        rec.ins_srtdeel_nr,
                        rec.ins_srtdeel_omschrijving,
                        rec.ins_srtdeel_image,
                        rec.ins_srtdeel_btw,
                        rec.ins_srtdeel_eenheid,
                        0,
                        pbedr_key,
                        rec.ins_srtdeel_vervaldatum,
                        rec.ins_srtdeel_veelvoud,
                        rec.ins_srtdeel_minimum,
                        rec.bes_staffeltabel_key,
                        rec.ins_srtdeel_wijzigdagen,
                        rec.ins_srtdeel_annuleerdagen,
                        rec.ins_srtdeel_opmerking)
            RETURNING   bes_srtdeel_key INTO l_bes_srtdeel_key;

            bes.upsert_srtdeel_prijs (l_bes_srtdeel_key, rec.ins_srtdeel_prijs, rec.ins_srtdeel_inkprijs);

            fac.imp_writelog (
               p_import_key,
               'I',
                  v_aanduiding
               || 'Artikel '
               || rec.ins_srtdeel_nr
               || '/'
               || rec.ins_srtdeel_omschrijving
               || ' is toegevoegd',
               ''
            );
            ccount := ccount + 1;
         EXCEPTION
            WHEN DUP_VAL_ON_INDEX
            THEN
               v_errormsg := 'Artikelnummer dubbel in importbestand';
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || v_errormsg,
                                 '');
            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,
                                 'W',
                                 v_aanduiding || v_errormsg,
                                 '');
         END;
      END LOOP;

      fac.imp_writelog (
         p_import_key,
         'S',
            v_aanduiding
         || 'Er zijn '
         || TO_CHAR (ccount)
         || ' artikelen toegevoegd',
         ''
      );

      COMMIT;
   END;

   PROCEDURE l_update_voorraad (pdisc_key IN NUMBER, pbedr_key IN NUMBER)
   AS
      -- Cursor van alle artikelen (die dus op dit punt zijn gesynct met de importtabel), waarvan we de voorraad-info van het bijbehorende inkoopartikel willen gaan zoeken...
      CURSOR c_updsrtdeel_voorraad (
         cdisc_key   IN            NUMBER,
         cbedr_key   IN            NUMBER
      )
      IS
         SELECT   s.bes_srtdeel_key, f.*
           FROM   stph_imp_catalogus f, bes_srtgroep g, bes_srtdeel s
          WHERE       fac_import_key = p_import_key
                  AND f.ins_discipline_key = cdisc_key
                  AND f.prs_bedrijf_key = cbedr_key
                  AND g.ins_discipline_key = cdisc_key
                  AND g.bes_srtgroep_key = s.bes_srtgroep_key
                  AND UPPER (s.bes_srtdeel_nr) = UPPER (f.ins_srtdeel_nr)
                  AND s.prs_bedrijf_key = cbedr_key
                  AND s.bes_srtdeel_verwijder IS NULL;

      ccount            NUMBER (10);
      l_bes_discipline_key_inkoop  bes_disc_params.bes_ins_discipline_key_inkoop%TYPE;
      l_bes_srtdeel_key bes_srtdeel.bes_srtdeel_key%TYPE;
      l_prijs           bes_srtdeel_prijs.bes_srtdeel_prijs_prijs%TYPE;

   BEGIN

      ccount := 0;

      SELECT dp.bes_ins_discipline_key_inkoop
      INTO l_bes_discipline_key_inkoop
      FROM bes_disc_params dp
      WHERE dp.bes_ins_discipline_key = pdisc_key;

      IF l_bes_discipline_key_inkoop IS NOT NULL
      THEN
        -- We hebben van doen met een magazijn catalogus die is gkoppeld aan inkoopcatalogus met discipline-key 'l_bes_discipline_key_inkoop'
        -- De voorraad gegevens moeten in de overeenkomstige artikel van die inkoopcatalogus worden bijgewerkt.

         fac.imp_writelog (
            p_import_key,
            'I',
               v_aanduiding
            || 'Inkoop catalogus is gevonden: key = '
            || l_bes_discipline_key_inkoop,
            ''
         );

        FOR rec IN c_updsrtdeel_voorraad (pdisc_key, pbedr_key)
        LOOP
            BEGIN
              v_errormsg :=
                 'Fout bij bepalen artikel in de inkoopcatalogus ' || rec.ins_srtdeel_nr;

               -- Op zoek naar het overeenkomstige artikel in de inkoopcatalogus, op basis van artikelnummer (bes_srtdeel_nr) welke niet verwijderd is van de catalogus met key 'l_bes_discipline_key_inkoop'
               -- Daarbij JUIST geen check op eenheid, die is namelijk vooral anders (b.v. inkoopcatalogus heeft '1 pak van 4 stuks' en de magazijncatalogus heeft 'per stuk')
               SELECT s.bes_srtdeel_key
               INTO l_bes_srtdeel_key
               FROM bes_srtdeel s, bes_srtgroep g
               WHERE UPPER (s.bes_srtdeel_nr) = UPPER (rec.ins_srtdeel_nr)
               AND s.bes_srtgroep_key = g.bes_srtgroep_key
               AND s.bes_srtdeel_verwijder IS NULL
               AND g.ins_discipline_key = l_bes_discipline_key_inkoop;

               UPDATE bes_srtdeel
               SET  bes_srtdeel_voorraadmin = rec.bes_srtdeel_voorraadmin,
                    bes_srtdeel_voorraadmax = rec.bes_srtdeel_voorraadmax,
                    bes_srtdeel_voorraadfactor = rec.bes_srtdeel_voorraadfactor,
                    bes_srtdeel_maxbestel = COALESCE(rec.bes_srtdeel_maxbestel,0)
               WHERE bes_srtdeel_key = l_bes_srtdeel_key;

               l_prijs := NULL;
               CASE rec.bes_inclexcl_btw
                  WHEN '1'
                  THEN
                    -- 1. Prijs van artikel van inerne (magazijn)catalogus omrekenen obv factor, zonder btw omrekening (100 euro met factor 50 -> 100/50 = 2 euro)
                    l_prijs := rec.ins_srtdeel_prijs / COALESCE(rec.bes_srtdeel_voorraadfactor,1);
                  WHEN '2'
                  THEN
                    -- 2. is omrekenen obv de voorraadfactor excl btw (prijzen staan incl btw, en je wilt naar excl btw intern) (100 euro met factor 50 en 21% btw -> 100 - 21% BTW /50 = 82,64 / 50 = 1,65)
                    IF fac.safe_to_number(rec.ins_srtdeel_btw) IS NOT NULL
                    THEN  l_prijs := (rec.ins_srtdeel_prijs * 100) / (100 + fac.safe_to_number(rec.ins_srtdeel_btw));
                          l_prijs :=  l_prijs / COALESCE(rec.bes_srtdeel_voorraadfactor,1);
                    ELSE fac.imp_writelog (
                          p_import_key,
                          'W',
                          'BTW bij artkel ' || rec.ins_srtdeel_nr || ' is NIET gevonden',
                          'Prijs wordt niet omgerekend'
                       );
                    END IF;
                  WHEN '3'
                  THEN
                    -- 3. is omrekenen obv de voorraadfactor incl btw (prijzen staan excl btw, en je wilt naar incl btw intern) (100 euro met factor 50 en 21% btw -> 100 + 21% BTW = 121,00 / 50 = 2,42)
                    IF fac.safe_to_number(rec.ins_srtdeel_btw) IS NOT NULL
                    THEN  l_prijs := rec.ins_srtdeel_prijs * ((100 + fac.safe_to_number(rec.ins_srtdeel_btw))/100);
                          l_prijs := l_prijs / COALESCE(rec.bes_srtdeel_voorraadfactor,1);
                    ELSE fac.imp_writelog (
                          p_import_key,
                          'W',
                          'BTW bij artkel ' || rec.ins_srtdeel_nr || ' is NIET gevonden',
                          'Prijs wordt niet omgerekend'
                       );
                    END IF;
                  ELSE
                      NULL;
               END CASE;
               IF l_prijs IS NOT NULL
               THEN
                  l_prijs := ROUND (l_prijs,2);
                  -- Inkoopprijs NULL, magazijn catalogus is dit niet relevant, is uitgangspunt
                  bes.upsert_srtdeel_prijs (rec.bes_srtdeel_key, l_prijs, NULL);
               END IF;
               ccount := ccount + 1;
            EXCEPTION
              WHEN DUP_VAL_ON_INDEX
              THEN
                 v_errormsg := 'Artikelnummer dubbel in inkoopcatalogus';
                 fac.imp_writelog (p_import_key,
                                   'W',
                                   v_aanduiding || v_errormsg,
                                   '');
              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,
                                   'W',
                                   v_aanduiding || v_errormsg,
                                   '');
            END;
        END LOOP;
      ELSE
         fac.imp_writelog (
            p_import_key,
            'W',
               v_aanduiding
            || 'Inkoop catalogus is NIET gevonden',
            ''
         );
      END IF;
      fac.imp_writelog (
         p_import_key,
         'S',
            v_aanduiding
         || 'Er zijn '
         || TO_CHAR (ccount)
         || ' artikelen met waarvan de voorraadgegevens zijn bijgewerkt',
         ''
        );
   END;



BEGIN
   -- Doorloop alle catalogi/ bedrijven. Er kunnen er in theorie meerdere tegelijk zijn
   FOR rec IN
        (SELECT   DISTINCT ins_discipline_key, prs_bedrijf_key
          FROM   stph_imp_catalogus
         WHERE   fac_import_key = p_import_key)
   LOOP
      BEGIN
         -- Puur voor logging toch even catalogus- en bedrijfsnaam bepalen!
         v_aanduiding := '[' || TO_CHAR (rec.ins_discipline_key) || '] ';
         v_errormsg := 'Fout bepalen catalogus';

         SELECT   ins_discipline_omschrijving
           INTO   v_disc_oms
           FROM   ins_tab_discipline
          WHERE   ins_discipline_key = rec.ins_discipline_key;

         v_aanduiding := '[' || TO_CHAR (rec.prs_bedrijf_key) || '] ';
         v_errormsg := 'Fout bepalen bedrijf';

         SELECT   prs_bedrijf_naam
           INTO   v_bedr_naam
           FROM   prs_v_aanwezigbedrijf
          WHERE   prs_bedrijf_key = rec.prs_bedrijf_key;

         fac.imp_writelog (
            p_import_key,
            'I',
            'Import van catalogus ' || v_disc_oms || '/' || v_bedr_naam,
               'discipline: '
            || rec.ins_discipline_key
            || ', bedrijf: '
            || rec.prs_bedrijf_key
         );

         COMMIT;

         v_aanduiding := '[' || v_disc_oms || '|' || v_bedr_naam || '] ';
         l_update_catalogus (rec.ins_discipline_key, rec.prs_bedrijf_key);
         l_update_voorraad (rec.ins_discipline_key, rec.prs_bedrijf_key);

      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,
                              '');
            COMMIT;
      END;
   END LOOP;
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,
                        'Verwerken catalogus afgebroken!');
END stph_update_catalogus;
/



--------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-- Einde Copy van fac_import_catalogus en fac_update_catalogus van 2015.2 (d.d. 26/10/15 uit fac_pacf.src gekopieerd)
--
--
--
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------





------
------ FACTUUREXPORT / KOPPELING DBS
------

--------------------------------------------------
-- DBS1: Factuurexport

-- view tbv export naar financieel systeem DBS
CREATE OR REPLACE VIEW stph_v_factuur_mldcnt_gegevens (
   fin_factuur_key,
   opdracht_id,
   fin_factuur_datum,
   fin_factuur_boekmaand,
   fin_factuur_nr,
   fin_factuur_totaal,
   fin_factuur_totaal_btw,
   fin_factuur_totaal_dbs,
   prs_bedrijf_key,
   prs_leverancier_nr,
   fin_factuurregel_totaal,
   fin_factuurregel_btw,
   fin_factuurregel_totaal_dbs,
   fin_factuurregel_btw_perc,
   fin_btwtabelwaarde_btwcode,
   fin_factuurregel_nr,
   fin_factuurregel_omschrijving,
   fin_factuur_debiteur_nr,
   project_nummer,
   prs_kostensoort_oms,
   prs_kostensoort_doorbelasten,
   prs_kostenplaats_nr,
   bes_opdr_key,
   mld_opdr_key,
   cnt_contract_key,
   fin_factuur_statuses_key
   )
AS
   SELECT DISTINCT f.fin_factuur_key,
          COALESCE (TO_CHAR (cnt_contract_nummer),
                    (SELECT    sd.ins_srtdiscipline_prefix
                            || m.mld_melding_key
                            || '/'
                            || o.mld_opdr_bedrijfopdr_volgnr
                     FROM mld_melding m,
                          mld_stdmelding std,
                          ins_tab_discipline d,
                          ins_srtdiscipline sd
                     WHERE m.mld_melding_key = o.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)
          )
             opdracht_id,
          f.fin_factuur_datum,
          f.fin_factuur_boekmaand,
          f.fin_factuur_nr,
          f.fin_factuur_totaal,
          f.fin_factuur_totaal_btw,
           CASE
              WHEN ROUND(f.fin_factuur_totaal + f.fin_factuur_totaal_btw,2) > 0
              THEN LPAD(TO_CHAR(10000 * ROUND(f.fin_factuur_totaal + f.fin_factuur_totaal_btw,4)), 12, '0') || '-'
              ELSE LPAD(TO_CHAR(10000 * ROUND(ABS(f.fin_factuur_totaal + f.fin_factuur_totaal_btw),4)), 12, '0') || '+'
          END fin_factuur_totaal_dbs,
          COALESCE (b_c.prs_bedrijf_key, b_o.prs_bedrijf_key) prs_bedrijf_key,
          COALESCE (b_c.prs_leverancier_nr, b_o.prs_leverancier_nr) prs_leverancier_nr,
          fr.fin_factuurregel_totaal,
          fr.fin_factuurregel_btw,
          CASE
              WHEN ROUND(fr.fin_factuurregel_totaal + fr.fin_factuurregel_btw,2) > 0
              THEN LPAD(TO_CHAR(10000 * ROUND(fr.fin_factuurregel_totaal + fr.fin_factuurregel_btw,4)), 12, '0') || LPAD('0',12,'0')
              ELSE LPAD('0',12,'0') || LPAD(TO_CHAR(10000 * ROUND(ABS(fr.fin_factuurregel_totaal + fr.fin_factuurregel_btw),4)), 12, '0')
          END fin_factuurregel_totaal_dbs,
          btw.fin_btwtabelwaarde_perc,
          btw.fin_btwtabelwaarde_code,
          fr.fin_factuurregel_nr,
          fr.fin_factuurregel_omschrijving,
          f.fin_factuur_debiteur_nr,
          NULL projectnummer,
          COALESCE(ks_regel.prs_kostensoort_oms,ks.prs_kostensoort_oms),
          DECODE(ks_regel.prs_kostensoort_oms, NULL, ks.prs_kostensoort_doorbelasten, ks_regel.prs_kostensoort_doorbelasten),
          COALESCE (kp_c.prs_kostenplaats_nr, kp_o.prs_kostenplaats_nr) prs_kostenplaats_nr,
          NULL bes_opdr_key,
          o.mld_opdr_key,
          c.cnt_contract_key,
          f.fin_factuur_statuses_key
   FROM fin_factuur f,
        fin_factuurregel fr,
        fin_btwtabelwaarde btw,
        mld_opdr o,
        mld_typeopdr ot,
        cnt_contract c,
        prs_bedrijf b_o,
        prs_bedrijf b_c,
        prs_kostensoort ks,
        prs_kostensoort ks_regel,
        prs_kostenplaats kp_c,
        prs_kostenplaats kp_o
   WHERE f.fin_factuur_key = fr.fin_factuur_key
   AND fr.fin_btwtabelwaarde_key = btw.fin_btwtabelwaarde_key
   AND f.bes_bestelopdr_key is null
   AND f.mld_opdr_key = o.mld_opdr_key(+)
   AND o.prs_kostenplaats_key = kp_o.prs_kostenplaats_key (+)
   AND o.mld_typeopdr_key = ot.mld_typeopdr_key(+)
   AND f.cnt_contract_key = c.cnt_contract_key(+)
   AND o.mld_uitvoerende_keys = b_o.prs_bedrijf_key(+)
   AND c.cnt_prs_bedrijf_key = b_c.prs_bedrijf_key(+)
   AND c.prs_kostenplaats_key = kp_c.prs_kostenplaats_key (+)
   AND f.prs_kostensoort_key = ks.prs_kostensoort_key(+)
   AND fr.prs_kostensoort_key = ks_regel.prs_kostensoort_key(+);


CREATE OR REPLACE VIEW stph_v_factuur_bes_gegevens (
   fin_factuur_key,
   opdracht_id,
   fin_factuur_datum,
   fin_factuur_boekmaand,
   fin_factuur_nr,
   fin_factuur_totaal,
   fin_factuur_totaal_btw,
   fin_factuur_totaal_dbs,
   prs_bedrijf_key,
   prs_leverancier_nr,
   fin_factuurregel_totaal,
   fin_factuurregel_btw,
   fin_factuurregel_totaal_dbs,
   fin_factuurregel_btw_perc,
   fin_btwtabelwaarde_btwcode,
   fin_factuurregel_nr,
   fin_factuurregel_omschrijving,
   fin_factuur_debiteur_nr,
   project_nummer,
   prs_kostensoort_oms,
   prs_kostensoort_doorbelasten,
   prs_kostenplaats_nr,
   bes_opdr_key,
   mld_opdr_key,
   cnt_contract_key,
   fin_factuur_statuses_key
   )
AS
   SELECT DISTINCT f.fin_factuur_key,
          TO_CHAR (bo.bes_bestelopdr_id) opdracht_id,
          f.fin_factuur_datum,
          f.fin_factuur_boekmaand,
          f.fin_factuur_nr,
          f.fin_factuur_totaal,
          f.fin_factuur_totaal_btw,
          CASE
              WHEN ROUND(f.fin_factuur_totaal + f.fin_factuur_totaal_btw,2) > 0
              THEN LPAD(TO_CHAR(10000 * ROUND(f.fin_factuur_totaal + f.fin_factuur_totaal_btw,4)), 12, '0') || '-'
              ELSE LPAD(TO_CHAR(10000 * ROUND(ABS(f.fin_factuur_totaal + f.fin_factuur_totaal_btw),4)), 12, '0') || '+'
          END fin_factuur_totaal_dbs,
          b.prs_bedrijf_key,
          b.prs_leverancier_nr,
          fr.fin_factuurregel_totaal,
          fr.fin_factuurregel_btw,
          CASE
              WHEN ROUND(fr.fin_factuurregel_totaal + fr.fin_factuurregel_btw,2) > 0
              THEN LPAD(TO_CHAR(10000 * ROUND(fr.fin_factuurregel_totaal + fr.fin_factuurregel_btw,4)), 12, '0') || LPAD('0',12,'0')
              ELSE LPAD('0',12,'0') || LPAD(TO_CHAR(10000 * ROUND(ABS(fr.fin_factuurregel_totaal + fr.fin_factuurregel_btw),4)), 12, '0')
          END fin_factuurregel_totaal_dbs,
          btw.fin_btwtabelwaarde_perc,
          btw.fin_btwtabelwaarde_code,
          fr.fin_factuurregel_nr,
          fr.fin_factuurregel_omschrijving,
          f.fin_factuur_debiteur_nr,
          NULL projectnummer,
          COALESCE(ks_regel.prs_kostensoort_oms,ks.prs_kostensoort_oms),
          DECODE(ks_regel.prs_kostensoort_oms, NULL, ks.prs_kostensoort_doorbelasten, ks_regel.prs_kostensoort_doorbelasten),
          kp.prs_kostenplaats_nr,
          bo.bes_bestelopdr_key bes_opdr_key,
          NULL mld_opdr_key,
          NULL cnt_contract_key,
          f.fin_factuur_statuses_key
     FROM  bes_bestelopdr bo,
           prs_bedrijf b,
           bes_bestelling bes,
           bes_bestelopdr_item boi,
           bes_bestelling_item bi,
           fin_factuur f,
           fin_factuurregel fr,
           fin_btwtabelwaarde btw,
           prs_kostensoort ks,
           prs_kostensoort ks_regel,
           prs_kostenplaats kp
      WHERE b.prs_bedrijf_key = bo.prs_bedrijf_key
        AND bo.bes_bestelopdr_key = boi.bes_bestelopdr_key
        AND bi.bes_bestelopdr_item_key = boi.bes_bestelopdr_item_key
        AND bes.bes_bestelling_key = bi.bes_bestelling_key
        AND kp.prs_kostenplaats_key = bes.prs_kostenplaats_key
        AND f.prs_kostensoort_key = ks.prs_kostensoort_key(+)
        AND fr.prs_kostensoort_key = ks_regel.prs_kostensoort_key(+)
        AND f.bes_bestelopdr_key = bo.bes_bestelopdr_key
        AND f.fin_factuur_key = fr.fin_factuur_key
        AND fr.fin_btwtabelwaarde_key = btw.fin_btwtabelwaarde_key;


CREATE OR REPLACE VIEW stph_v_factuur_geg
AS
SELECT * from stph_v_factuur_mldcnt_gegevens
UNION
SELECT * from stph_v_factuur_bes_gegevens;


CREATE OR REPLACE VIEW stph_v_factuur_geg_akkoord
AS
SELECT * from stph_v_factuur_mldcnt_gegevens
WHERE fin_factuur_statuses_key = 6
UNION
SELECT * from stph_v_factuur_bes_gegevens
WHERE fin_factuur_statuses_key = 6;



-- Exportbestand die voor DBS wordt gegenereerd, bestaande uit kopregel (factuur-nivo) en bijbehorende sub-regels (factuurregels)
--
-- Velden kopregel:
-- 1: uniek boekstuknummer van 10 posities (fin_factuur_key), posities 1-9
-- 2: factuurnummer van 16 posities, posities 10-25
-- 3: factuurdatum van 8 posities in formaat ddmmjjjjj, posities 26-33
-- 4: verdeelperiode van 6 posities in formaat jjjjmm, posities 34-39
-- 5: leveranciernummer van 4 posities, posities 40-43
-- 6: factuurregelnummer, in kopregel 00000 (5 posities, in subregel het opeenvolgend regelnr van de factuurregel), posities 44-48
-- 7: factuurregelomschrijving, in kopregel leeg (30 spaties), in subregel de omschrijving van de factuurregel), posities 49-78
-- 8: kostensoort, in kopregel 00000 (5 posities) in subregel de kostensoort), posities 79-83
-- 9: kostenplaats, in kopregel 0000 (4 posities), in subregel de kostenplaats, posities 84-87
-- 10: Debet/Credit: totaal factuurbedrag incl BTW (11 posities), bedrag in centen met achteraan een min-teken '-' (debet-post) of plus-teken (credit-post) (dus 123.95 euro -> 0000012395-), posities 88-98,
-- 11: Debet: totaal factuurregelbedrag, in kopregel leeg (10 nullen), posities 99-108
-- 12: Credit: totaal factuurregelbedrag indien NEGATIEF, in kopregel leeg (10 nullen), posities 109-118


-- Velden subregel:
-- 1: uniek boekstuknummer van 10 posities (fin_factuur_key), posities 1-9
-- 2: factuurnummer van 20 posities, posities 10-25
-- 3: factuurdatum van 8 posities in formaat ddmmjjjjj, posities 26-33
-- 4: verdeelperiode van 6 posities in formaat jjjjmm, posities 34-39
-- 5: leveranciernummer van 4 posities, posities 40-43
-- 6: factuurregelnummer, in kopregel 00000 (5 posities, in subregel het opeenvolgend regelnr van de factuurregel), posities 44-48
-- 7: factuurregelomschrijving, in kopregel leeg (30 spaties), in subregel de omschrijving van de factuurregel), posities 49-78
-- 8: kostensoort, in kopregel 00000 (6 posities) in subregel de kostensoort), posities 79-84
-- 9: kostenplaats, in kopregel 0000 (4 posities), in subregel de kostenplaats, posities 85-88
-- 10: Debet/Credit: totaal factuurbedrag incl BTW (11 posities), in subregel leeg (10 nullen) met een extra 0 vanwege de het min of plusteken in kopregel, posities 89-99,
-- 11: Debet: totaal factuurregelbedrag, (10 posities), bedrag in centen (dus 123.95 euro -> 0000012395), posities 110-119 (NB: hier geen min-teken! alleen in kopregel)
-- 12: Credit: totaal factuurregelbedrag indien NEGATIEF, (10 posities), bedrag in centen (dus 123.95 euro -> 0000012395), posities 120-129



CREATE OR REPLACE VIEW stph_v_export_dbs
(result, result_order)
AS
SELECT  SUBSTR(MAX(fin_factuur_boekmaand),1,4) || LPAD(MAX(fin_factuur_key), 5, '0') ||
        LPAD(MAX(fin_factuur_nr), 16, '0') ||
        TO_CHAR (MAX(fin_factuur_datum), 'ddmmyyyy') ||
        SUBSTR(MAX(fin_factuur_boekmaand),1,4) || LPAD(SUBSTR(MAX(fin_factuur_boekmaand),6,2) , 2, '0') ||
        LPAD(COALESCE(MAX(prs_leverancier_nr),'0'), 4, '0') ||
        LPAD('0',5,'0')         ||
        LPAD(' ',30,' ')        ||
        LPAD('0',6,'0')         ||
        LPAD('0',4,'0')         ||
        MAX(fin_factuur_totaal_dbs)  ||
        LPAD('0',12,'0')        ||
        LPAD('0',12,'0')
   , SUBSTR(MAX(fin_factuur_boekmaand),1,4) || LPAD(MAX(fin_factuur_key), 5, '0') || LPAD('0',5,'0')
FROM stph_v_factuur_geg_akkoord fg
GROUP by fin_factuur_key
UNION ALL
SELECT  SUBSTR(fin_factuur_boekmaand,1,4) || LPAD(fin_factuur_key, 5, '0')  ||
        LPAD(fin_factuur_nr, 16, '0')     ||
        TO_CHAR (fin_factuur_datum, 'ddmmyyyy') ||
        SUBSTR(fin_factuur_boekmaand,1,4) || LPAD(SUBSTR(fin_factuur_boekmaand,6,2) , 2, '0') ||
        LPAD(COALESCE(prs_leverancier_nr,'0'), 4, '0') ||
        LPAD(fin_factuurregel_nr,5,'0')   ||
        LPAD(COALESCE(fin_factuurregel_omschrijving, ' '),30,' ') ||
        LPAD(prs_kostensoort_oms,6,'0')   ||
        LPAD(prs_kostenplaats_nr,4,'0')   ||
        LPAD('0',12,'0')                  || '0' ||
        fin_factuurregel_totaal_dbs
   , SUBSTR(fin_factuur_boekmaand,1,4) || LPAD(fin_factuur_key, 5, '0') || LPAD(fin_factuurregel_nr,5,'0')
FROM stph_v_factuur_geg_akkoord fg;



CREATE OR REPLACE PROCEDURE stph_export_dbs (
   p_applname   IN   VARCHAR2,
   p_applrun    IN   VARCHAR2,
   p_filedir    IN   VARCHAR2,
   p_filename   IN   VARCHAR2
)
AS

   -- In cursor cfactuur alle facturen die worden geexporteerd...
    CURSOR cfactuur
    IS
        SELECT fin_factuur_key
        FROM stph_v_factuur_geg_akkoord
        GROUP BY fin_factuur_key;

BEGIN
  -- DE EXPORT IS OP BASIS VAN EEN VIEW GEREALISEERD, WAARNA NU ALS LAATSTE STAP NOG WAT ADMINISTRATIE VOLGT...
  FOR cfact IN cfactuur
  LOOP
      -- Zowel de factuur in tracking zetten als de status op verwerkt (=7) zetten
      fin.setfactuurstatus (cfact.fin_factuur_key, 7, NULL);
  END LOOP;
END;
/



CREATE OR REPLACE VIEW stph_v_export_undo_dbs (
   result,
   result_order
   )
AS
SELECT REPLACE(REPLACE(f.fin_factuur_key
       || ';'
       || opdracht_id
       || ';'
       || fin_factuur_datum
       || ';'
       || fin_factuur_nr
       || ';'
       || prs_bedrijf_key
       || ';'
       || fin_factuurregel_totaal
       || ';'
       || fin_factuurregel_btw
       || ';'
       || fin_factuurregel_nr
       || ';'
       || fin_factuur_debiteur_nr
       || ';'
       || project_nummer
       || ';'
       || prs_kostensoort_oms
       || ';'
       || bes_opdr_key
       || ';'
       || mld_opdr_key
       || ';'
       || cnt_contract_key
      ,CHR (13), ''), CHR (10), '<ret>'), f.fin_factuur_key
 FROM stph_v_factuur_geg f, fac_tracking t, fac_srtnotificatie sn
 WHERE sn.fac_srtnotificatie_code ='FINVER'
 AND sn.fac_srtnotificatie_key = t.fac_srtnotificatie_key
 AND t.fac_tracking_datum >= (SELECT MAX(t1.fac_tracking_datum) - (1 / (24*60))
                              FROM fac_tracking t1
                              WHERE t1.fac_srtnotificatie_key = t.fac_srtnotificatie_key)
 AND f.fin_factuur_key = t.fac_tracking_refkey
 AND f.fin_factuur_statuses_key = 7;



CREATE OR REPLACE PROCEDURE stph_select_undo_dbs (
   p_applname   IN   VARCHAR2,
   p_applrun    IN   VARCHAR2
)
AS
  v_errormsg       VARCHAR (200);
BEGIN
  v_errormsg := 'Geen akties';

END;
/

-- Procedure om alle geexporteerde facturen naar status akkoord terug te zetten.
CREATE OR REPLACE PROCEDURE stph_export_undo_dbs (
   p_applname   IN   VARCHAR2,
   p_applrun    IN   VARCHAR2,
   p_filedir    IN   VARCHAR2,
   p_filename   IN   VARCHAR2
)
AS
   CURSOR cfactuur
    IS
      SELECT DISTINCT f.fin_factuur_key
      FROM fac_tracking t, fac_srtnotificatie sn, fin_factuur f
      WHERE sn.fac_srtnotificatie_code ='FINVER'
      AND sn.fac_srtnotificatie_key = t.fac_srtnotificatie_key
      AND t.fac_tracking_datum >= (SELECT MAX(t1.fac_tracking_datum) - (1 / (24*60))
                                   FROM fac_tracking t1
                                   WHERE t1.fac_srtnotificatie_key = t.fac_srtnotificatie_key)
      AND f.fin_factuur_key = t.fac_tracking_refkey
      AND fin_factuur_statuses_key = 7;

   v_errormsg       VARCHAR (200);
   oracle_err_num   NUMBER;
   oracle_err_mes   VARCHAR2 (200);
BEGIN
  v_errormsg := 'Geen akties';

  FOR cfact IN cfactuur
  LOOP
      -- Eerst de factuur in tracking zetten...
      -- Omdat van 7 naar 6 niet mag/geoorloofd is, lukt het niet via
      -- de reguliere functie fin.setfactuurstatus (cfact.fin_factuur_key, 6, NULL);

      -- Dan maar zelf en custom-made:
      fac.trackaction ('FINFOK', cfact.fin_factuur_key, NULL, NULL, 'Factuur uit archief teruggezet');
      UPDATE fin_factuur
      SET fin_factuur_statuses_key = 6
      WHERE fin_factuur_key = cfact.fin_factuur_key;

  END LOOP;
END;
/


--------------------------------------------------
-- DBS2: Catering export
-- Velden catering-regels voor intern doorbelasten (DBS) van de vorige maand, die niet dirty zijn.

CREATE OR REPLACE VIEW stph_v_res_catering_2_dbs
AS
   SELECT rr.res_reservering_key,
          rr.res_rsv_ruimte_volgnr,
          rr.res_rsv_ruimte_key,
          r.res_ruimte_key,
          r.res_ruimte_nr,
          l.alg_locatie_code,
          l.alg_locatie_omschrijving,
          g.alg_gebouw_code,
          g.alg_gebouw_naam,
          v.alg_verdieping_volgnr,
          v.alg_verdieping_omschrijving,
          ar.alg_ruimte_nr,
          ar.alg_ruimte_omschrijving,
          op.res_opstelling_key,
          op.res_opstelling_omschrijving,
          rr.res_rsv_ruimte_van,
          rr.res_rsv_ruimte_omschrijving,
          rr.res_rsv_ruimte_opmerking,
          rr.res_rsv_ruimte_bezoekers,
          rr.res_status_fo_key,
          rr.res_status_bo_key,
          ra.res_rsv_artikel_levering,
          TO_CHAR(ra.res_rsv_artikel_levering, 'DD-MM-YYYY') datum,
          TO_CHAR(ra.res_rsv_artikel_levering, 'HH24:MI') tijd,
          ra.res_rsv_artikel_aantal aantal,
          a.res_artikel_key,
          a.res_artikel_nr artikelnr,
          a.res_artikel_omschrijving artikeloms,
          d.ins_discipline_key,
          d.ins_discipline_omschrijving catalogus,
          ra.res_rsv_artikel_prijs, a.res_artikel_prijs,
          a.res_artikel_prijs eenheidsprijs,
          res.getartikelprijs(ra.res_rsv_artikel_key) totaalprijs,
          c.prs_perslid_naam contact_naam,
          c.prs_perslid_tussenvoegsel contact_tussenvoegsel,
          c.prs_perslid_voorletters contact_voorletters,
          c.prs_perslid_voornaam contact_voornaam,
          DECODE(c.prs_perslid_geslacht,0,'V',1,'M', '') contact_geslacht,
          c.prs_perslid_email contact_email,
          c.prs_perslid_telefoonnr contact_telefoonnr,
          c.prs_perslid_mobiel contact_mobiel,
          h.prs_perslid_naam host_naam,
          h.prs_perslid_tussenvoegsel host_tussenvoegsel,
          h.prs_perslid_voorletters host_voorletters,
          h.prs_perslid_voornaam host_voornaam,
          DECODE(h.prs_perslid_geslacht,0,'V',1,'M', '') host_geslacht,
          h.prs_perslid_email host_email,
          h.prs_perslid_telefoonnr host_telefoonnr,
          h.prs_perslid_mobiel host_mobiel,
          k.prs_kostenplaats_nr,
          ks.prs_kostensoort_oms
     FROM res_rsv_artikel ra,
          res_artikel a,
          res_discipline d,
          res_rsv_ruimte rr,
          res_ruimte_opstelling ro,
          res_opstelling op,
          res_ruimte r,
          alg_ruimte ar,
          alg_verdieping v,
          alg_gebouw g,
          alg_locatie l,
          prs_perslid c,
          prs_kostenplaats k,
          prs_kostensoort ks,
          prs_perslid h
    WHERE rr.res_rsv_ruimte_verwijder IS NULL
      AND rr.res_rsv_ruimte_van >= to_date('01-' || to_char(sysdate - to_char(sysdate, 'DD') - 1, 'MM-YYYY'), 'DD-MM-YYYY')
      AND rr.res_rsv_ruimte_van < to_date('01-' || to_char(sysdate, 'MM-YYYY'), 'DD-MM-YYYY')
      AND a.res_artikel_key = ra.res_artikel_key
      AND d.ins_discipline_key = a.res_discipline_key
      AND d.ins_discipline_min_level = 2
      AND rr.res_rsv_ruimte_key = ra.res_rsv_ruimte_key
      AND rr.res_ruimte_opstel_key = ro.res_ruimte_opstel_key(+)
      AND ro.res_ruimte_key = r.res_ruimte_key (+)
      AND ro.res_opstelling_key = op.res_opstelling_key (+)
      AND rr.alg_ruimte_key = ar.alg_ruimte_key (+)
      AND ar.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 rr.res_rsv_ruimte_contact_key = c.prs_perslid_key
      AND k.prs_kostenplaats_key = rr.prs_kostenplaats_key
      AND d.prs_kostensoort_key = ks.prs_kostensoort_key (+)
      AND rr.res_rsv_ruimte_host_key = h.prs_perslid_key
      AND rr.res_rsv_ruimte_dirtlevel = 0;


-- Velden catering-regels voor intern doorbelasten (DBS) van de vorige maand, die definitief zijn (gemaakt).
-- 1e regel bij catering
-- 1: kostensoort bij de catalogus, posities 1-6
-- 2: kostenplaats bij de reservering van 4 posities, posities 7-10
-- 3: debet: bedrag in centen, in 10 posities, posities 11-20
-- 4: credit: bedrag in centen, in 10 posities, posities 21-30, allemaal 0
-- 2e bijbehorende regel bij catering
-- 1: kostensoort 83211, posities 1-6
-- 2: kostenplaats 2020, 4 posities, posities 7-10
-- 3: debet: bedrag in centen, in 10 posities, posities 11-20, allemaal 0
-- 4: credit: bedrag in centen, in 10 posities, posities 21-30

-- Aanvulling: zie call  STPH#36545
-- Tegenboeking (2e bijbehorende regel) 'Catering'Catalogus "Dienstverlening logistiek" (key= 581) -> kostenplaats 2061 en kostensoort 41900
-- Tegenboeking (2e bijbehorende regel) 'Catering'Catalogus "Dienstverlening receptie"  (key= 582) -> kostenplaats 2005 en kostensoort 41900

CREATE OR REPLACE VIEW stph_v_export_catering_dbs
(result, result_order)
AS
    SELECT  LPAD(prs_kostensoort_oms,6,'0')   ||
            LPAD(prs_kostenplaats_nr,4,'0')   ||
            LPAD(TO_CHAR(ROUND(100 * totaalprijs,2)), 10, '0')  ||
            '0000000000'
       , LPAD(res_reservering_key, 10, '0') || LPAD(res_rsv_ruimte_volgnr,5,'0') || '1'
    FROM stph_v_res_catering_2_dbs
    WHERE res_status_fo_key = 2
    AND totaalprijs <> 0
UNION ALL
    SELECT  '832110' ||
            '2020' ||
            '0000000000' ||
            LPAD(TO_CHAR(ROUND(100 * totaalprijs,2)), 10, '0')
       , LPAD(res_reservering_key, 10, '0') || LPAD(res_rsv_ruimte_volgnr,5,'0') || '2'
    FROM stph_v_res_catering_2_dbs
    WHERE res_status_fo_key = 2
    AND totaalprijs <> 0
    AND ins_discipline_key NOT IN (581, 582)
UNION ALL
  SELECT  '419000' ||
          '2061' ||
          '0000000000' ||
          LPAD(TO_CHAR(ROUND(100 * totaalprijs,2)), 10, '0')
     , LPAD(res_reservering_key, 10, '0') || LPAD(res_rsv_ruimte_volgnr,5,'0') || '2'
  FROM stph_v_res_catering_2_dbs
  WHERE res_status_fo_key = 2
  AND totaalprijs <> 0
  AND ins_discipline_key = 581
UNION ALL
  SELECT  '419000' ||
          '2005' ||
          '0000000000' ||
          LPAD(TO_CHAR(ROUND(100 * totaalprijs,2)), 10, '0')
     , LPAD(res_reservering_key, 10, '0') || LPAD(res_rsv_ruimte_volgnr,5,'0') || '2'
  FROM stph_v_res_catering_2_dbs
  WHERE res_status_fo_key = 2
  AND totaalprijs <> 0
  AND ins_discipline_key = 582;


--------------------------------------------------
-- DBS3: Interne bestellingen export
-- Een interne bestelopdracht gaat naar "interne" relatiebeheer "Centraal Magazijn", dit is prs_bedrijf_key = 422
-- Een interne bestelopdracht "dagvers" gaat naar "interne" relatiebeheer "Centrale Keuken", dit is prs_bedrijf_key = 1401

CREATE OR REPLACE VIEW stph_v_bes_intern_2_dbs
(  prs_bedrijf_key,
   bes_bestelopdr_key,
   bes_bestelopdr_item_posnr,
   prs_kostensoort_oms,
   prs_kostensoort_tegenboeking,
   prs_kostenplaats_nr,
   bes_bestelopdr_item_aantalontv,
   bes_bestelopdr_item_brutoprijs,
   bes_srtdeel_btw
)
AS
    SELECT b.prs_bedrijf_key,
          boi.bes_bestelopdr_key,
          boi.bes_bestelopdr_item_posnr,
          COALESCE(ks_groep.prs_kostensoort_oms, ks.prs_kostensoort_oms),
          COALESCE(ks_groep.prs_kostensoort_refcode,ks.prs_kostensoort_refcode),
          kp.prs_kostenplaats_nr,
          boi.bes_bestelopdr_item_aantalontv,
          boi.bes_bestelopdr_item_brutoprijs,
          sd.bes_srtdeel_btw
     FROM  bes_bestelopdr bo,
           prs_bedrijf b,
           bes_bestelling bes,
           bes_bestelopdr_item boi,
           bes_bestelling_item bi,
           prs_kostenplaats kp,
           bes_srtdeel sd,
           bes_srtgroep sg,
           bes_discipline d,
           prs_kostensoort ks,
           prs_kostensoort ks_groep
      WHERE b.prs_bedrijf_key IN (422, 1401)
        AND b.prs_bedrijf_key = bo.prs_bedrijf_key
        AND bo.bes_bestelopdr_key = boi.bes_bestelopdr_key
        AND bi.bes_bestelopdr_item_key = boi.bes_bestelopdr_item_key
        AND bes.bes_bestelling_key = bi.bes_bestelling_key
        AND kp.prs_kostenplaats_key = bes.prs_kostenplaats_key
        AND sd.bes_srtdeel_key =  bi.bes_srtdeel_key
        AND sg.BES_SRTGROEP_KEY = sd. BES_SRTGROEP_KEY
        AND d.ins_discipline_key = sg.ins_discipline_key
        AND d.prs_kostensoort_key  = ks.prs_kostensoort_key (+)
        AND sg.prs_kostensoort_key = ks_groep.prs_kostensoort_key (+)
        AND bo.bes_bestelopdr_status = 6;


-- Velden interne bestelopdracht-regels voor intern doorbelasten (DBS), die geleverd zijn geadministreerd.
-- 1e regel bij interne bestelregel.
-- 1: eerst kostensoort bes_groep, indien leeg dan kostensoort bij de catalogus, posities 1-6
-- 2: kostenplaats bij de bestelling van 4 posities, posities 7-10
-- 3: debet: bedrag in centen, in 10 posities, posities 11-20
-- 4: credit: bedrag in centen, in 10 posities, posities 21-30, allemaal 0
-- 2e bijbehorende regel bij bestelregel
-- 1: kostensoort_tegenboeking die hoort bij kostensoort uit 1e regel, (dus eerst KS groep, indien leeg dan KS catalogus) posities 1-6
-- 2: kostenplaats 0000, 4 posities, posities 7-10
-- 3: debet: bedrag in centen, in 10 posities, posities 11-20, allemaal 0
-- 4: credit: bedrag in centen, in 10 posities, posities 21-30


CREATE OR REPLACE VIEW stph_v_export_intern_magazijn
(result, result_order)
AS
SELECT  LPAD(prs_kostensoort_oms,6,'0')   ||
        LPAD(prs_kostenplaats_nr,4,'0')   ||
        LPAD(TO_CHAR(100 * ROUND(COALESCE(bes_bestelopdr_item_aantalontv,0) * bes_bestelopdr_item_brutoprijs,2)), 10, '0')  ||
        '0000000000'
   , LPAD(bes_bestelopdr_key, 10, '0') || LPAD(bes_bestelopdr_item_posnr,5,'0') || '1'
FROM stph_v_bes_intern_2_dbs
WHERE bes_bestelopdr_item_brutoprijs <> 0
AND prs_bedrijf_key = 422
UNION ALL
SELECT  LPAD(prs_kostensoort_tegenboeking,6,'0')  ||
        '0000' ||
        '0000000000' ||
        LPAD(TO_CHAR(100 * ROUND(COALESCE(bes_bestelopdr_item_aantalontv,0) * bes_bestelopdr_item_brutoprijs,2)), 10, '0')
   , LPAD(bes_bestelopdr_key, 10, '0') || LPAD(bes_bestelopdr_item_posnr,5,'0') || '2'
FROM stph_v_bes_intern_2_dbs
WHERE bes_bestelopdr_item_brutoprijs <> 0
AND prs_bedrijf_key = 422;


-- Velden interne bestelopdracht-regels voor intern doorbelasten (DBS), die geleverd zijn geadministreerd.
-- 1e regel bij interne bestelregel.
-- 1: eerst kostensoort bes_groep, indien leeg dan kostensoort bij de catalogus, posities 1-6
-- 2: kostenplaats bij de bestelling van 4 posities, posities 7-10
-- 3: debet: bedrag in centen, in 10 posities, posities 11-20
-- 4: credit: bedrag in centen, in 10 posities, posities 21-30, allemaal 0
-- 2e bijbehorende regel bij bestelregel
-- 1: kostensoort_tegenboeking die hoort bij kostensoort uit 1e regel, (dus eerst KS groep, indien leeg dan KS catalogus) posities 1-6
-- 2: kostenplaats 0000, 4 posities, posities 7-10
-- 3: debet: bedrag in centen, in 10 posities, posities 11-20, allemaal 0
-- 4: credit: bedrag in centen, in 10 posities, posities 21-30


CREATE OR REPLACE VIEW stph_v_export_intern_keuken
(result, result_order)
AS
SELECT  LPAD(prs_kostensoort_oms,6,'0')   ||
        LPAD(prs_kostenplaats_nr,4,'0')   ||
        LPAD(TO_CHAR(100 * ROUND(COALESCE(bes_bestelopdr_item_aantalontv,0) * bes_bestelopdr_item_brutoprijs,2)), 10, '0')  ||
        '0000000000'
   , LPAD(bes_bestelopdr_key, 10, '0') || LPAD(bes_bestelopdr_item_posnr,5,'0') || '1'
FROM stph_v_bes_intern_2_dbs
WHERE bes_bestelopdr_item_brutoprijs <> 0
AND prs_bedrijf_key = 1401
UNION ALL
SELECT  LPAD(prs_kostensoort_oms,6,'0')   ||
        '2010' ||
        '0000000000' ||
        LPAD(TO_CHAR(100 * ROUND(COALESCE(bes_bestelopdr_item_aantalontv,0) * bes_bestelopdr_item_brutoprijs,2)), 10, '0')
   , LPAD(bes_bestelopdr_key, 10, '0') || LPAD(bes_bestelopdr_item_posnr,5,'0') || '2'
FROM stph_v_bes_intern_2_dbs
WHERE bes_bestelopdr_item_brutoprijs <> 0
AND prs_bedrijf_key = 1401;


-- Op de balans ook de externe catalogus die gekoppeld is aan een (of meer) van die interne catalogi.
-- Dus als tegenhanger van de interne "magazijn voorraad" catalogi die via VIEW stph_v_bes_intern_2_dbs verlopen....
-- Te bepalen via de kolom bes_ins_discipline_key_inkoop
--
CREATE OR REPLACE VIEW stph_v_bes_extern_2_dbs
(  prs_bedrijf_key,
   bes_bestelopdr_key,
   bes_bestelopdr_item_posnr,
   prs_kostensoort_oms,
   prs_kostensoort_tegenboeking,
   prs_kostenplaats_nr,
   bes_bestelopdr_item_aantalontv,
   bes_bestelopdr_item_brutoprijs,
   bes_srtdeel_btw
)
AS
SELECT b.prs_bedrijf_key,
          boi.bes_bestelopdr_key,
          boi.bes_bestelopdr_item_posnr,
          COALESCE(ks_groep.prs_kostensoort_oms, ks.prs_kostensoort_oms),
          COALESCE(ks_groep.prs_kostensoort_refcode,ks.prs_kostensoort_refcode),
          kp.prs_kostenplaats_nr,
          boi.bes_bestelopdr_item_aantalontv,
          boi.bes_bestelopdr_item_brutoprijs,
          sd.bes_srtdeel_btw
     FROM  bes_bestelopdr bo,
           prs_bedrijf b,
           bes_bestelling bes,
           bes_bestelopdr_item boi,
           bes_bestelling_item bi,
           prs_kostenplaats kp,
           bes_srtdeel sd,
           bes_srtgroep sg,
           bes_discipline d,
           bes_disc_params dp,
           prs_kostensoort ks,
           prs_kostensoort ks_groep
      WHERE  b.prs_bedrijf_key = bo.prs_bedrijf_key
        AND bo.bes_bestelopdr_key = boi.bes_bestelopdr_key
        AND bi.bes_bestelopdr_item_key = boi.bes_bestelopdr_item_key
        AND bes.bes_bestelling_key = bi.bes_bestelling_key
        AND kp.prs_kostenplaats_key = bes.prs_kostenplaats_key
        AND sd.bes_srtdeel_key =  bi.bes_srtdeel_key
        AND sg.BES_SRTGROEP_KEY = sd. BES_SRTGROEP_KEY
        AND d.ins_discipline_key = sg.ins_discipline_key
        AND d.ins_discipline_key = dp.bes_ins_discipline_key
        AND EXISTS (select 'x' FROM bes_disc_params dp2 WHERE dp2.bes_ins_discipline_key_inkoop =  dp.bes_ins_discipline_key)
        AND d.prs_kostensoort_key  = ks.prs_kostensoort_key (+)
        AND sg.prs_kostensoort_key = ks_groep.prs_kostensoort_key (+)
        AND bo.bes_bestelopdr_status = 6;

-- Dit zou ook een DB4 bestand kunnen zijn, maar er is gekozen om deze regels tesamen met het bestaande DB3 bestand weg te schrijven...
-- Zie VIEW stph_v_export_intern_bes_dbs en Export-PROCEDURE stph_v_export_intern_bes_dbs
-- Daarin is deze nieuw view ook verwerkt....
-- Let op: de prijzen van de externe catalogi zijn excl BTW, doorbelasting is incl BTW, daarom wordt het BTW percentage erbij opgeteld.
CREATE OR REPLACE VIEW stph_v_export_externe_voorraad
(result, result_order)
AS
SELECT  LPAD(prs_kostensoort_tegenboeking,6,'0')  ||
        '0000'  ||
        LPAD(TO_CHAR(100 * ROUND(COALESCE(bes_bestelopdr_item_aantalontv,0) * (1 + 0.01 * COALESCE(bes_srtdeel_btw,0)) * bes_bestelopdr_item_brutoprijs,2)), 10, '0') ||
        '0000000000'
   , LPAD(bes_bestelopdr_key, 10, '0') || LPAD(bes_bestelopdr_item_posnr,5,'0') || '1'
FROM stph_v_bes_extern_2_dbs
WHERE bes_bestelopdr_item_brutoprijs <> 0
UNION ALL
SELECT  '320100'   ||
        '0000' ||
        '0000000000' ||
        LPAD(TO_CHAR(100 * ROUND(COALESCE(bes_bestelopdr_item_aantalontv,0) * (1 + 0.01 * COALESCE(bes_srtdeel_btw,0)) * bes_bestelopdr_item_brutoprijs,2)), 10, '0')
   , LPAD(bes_bestelopdr_key, 10, '0') || LPAD(bes_bestelopdr_item_posnr,5,'0') || '2'
FROM stph_v_bes_extern_2_dbs
WHERE bes_bestelopdr_item_brutoprijs <> 0;


CREATE OR REPLACE VIEW stph_v_export_intern_bes_dbs
(result, result_order)
AS
SELECT * FROM stph_v_export_intern_magazijn
UNION ALL
SELECT * FROM stph_v_export_intern_keuken
UNION ALL
SELECT * FROM stph_v_export_externe_voorraad;


CREATE OR REPLACE PROCEDURE stph_export_intern_bes_dbs (
   p_applname   IN   VARCHAR2,
   p_applrun    IN   VARCHAR2,
   p_filedir    IN   VARCHAR2,
   p_filename   IN   VARCHAR2
)
AS

   -- In cursor cbesopdr alle bestelopdrachten die worden geexporteerd...
    CURSOR cbesopdracht
    IS
        SELECT DISTINCT bes_bestelopdr_key
        FROM stph_v_bes_intern_2_dbs
        UNION
        SELECT DISTINCT bes_bestelopdr_key
        FROM stph_v_bes_extern_2_dbs;

BEGIN
  -- DE EXPORT IS OP BASIS VAN EEN VIEW GEREALISEERD, WAARNA NU ALS LAATSTE STAP NOG WAT ADMINISTRATIE VOLGT...
  FOR cbesopdr IN cbesopdracht
  LOOP
      -- De bestelopdracht op verwerkt zetten
      bes.setbestelopdrstatus (cbesopdr.bes_bestelopdr_key, 7, NULL);
  END LOOP;
END;
/

-- STPH#34969 voorraad weergeven en evt max voorraad kunnen gebruiken
CREATE OR REPLACE VIEW stph_v_rap_voorraad
(
   hide_f_srtgroep_omschrijving,
   artikel_nr,
   voorraad
)
AS
   SELECT   bes_srtgroep_omschrijving,
            bes_srtdeel_nr,
            COALESCE (aantal_geleverd * intern_voorraadfactor, 0)
            - COALESCE (aantal_intern_uit, 0)
               voorraad
     FROM   (  SELECT   a.bes_srtdeel_key,
                        a.bes_srtdeel_nr,
                        SUM (a.aantal_intern_uit) aantal_intern_uit,
                        SUM (a.aantal_geleverd) aantal_geleverd,
                        b.intern_voorraadfactor,
                        a.bes_srtgroep_omschrijving
                 FROM   (  SELECT   COALESCE (bo.bes_srtdeel_key_inkoop,
                                              bo.bes_srtdeel_key)
                                       bes_srtdeel_key,
                                    bo.bes_srtdeel_nr,
                                    bo.bes_ins_discipline_key,
                                    bo.inkoop_disc,
                                    SUM (bo.aantal_intern) aantal_intern_uit,
                                    SUM (bo.aantal_extern_geleverd)
                                       aantal_geleverd,
                                    bes_srtgroep_omschrijving
                             FROM   (  SELECT   sd.bes_srtdeel_nr,
                                                sd.bes_srtdeel_key,
                                                bes_srtgroep_omschrijving,
                                                (SELECT   isd2.bes_srtdeel_key
                                                   FROM   bes_srtdeel isd2,
                                                          bes_srtgroep isg2,
                                                          bes_discipline bd2
                                                  WHERE   isd2.bes_srtgroep_key =
                                                             isg2.bes_srtgroep_key
                                                          AND bd2.ins_discipline_key =
                                                                isg2.ins_discipline_key
                                                          AND isd2.bes_srtdeel_nr LIKE
                                                                sd.bes_srtdeel_nr
                                                          AND bes_srtdeel_verwijder IS NULL
                                                          AND bd2.ins_discipline_key =
                                                                dp.bes_ins_discipline_key_inkoop)
                                                   bes_srtdeel_key_inkoop,
                                                dp.bes_ins_discipline_key,
                                                dp.bes_ins_discipline_key_inkoop
                                                   inkoop_disc,
                                                SUM (bi.bes_bestelling_item_aantal)
                                                   aantal_intern,
                                                TO_NUMBER (NULL) aantal_open_order,
                                                TO_NUMBER (NULL)
                                                   aantal_extern_geleverd
                                         FROM   bes_discipline bd,
                                                bes_v_aanwezigsrtgroep g,
                                                bes_v_aanwezigsrtdeel sd,
                                                bes_bestelling b,
                                                bes_bestelling_item bi,
                                                bes_disc_params dp
                                        WHERE   sd.bes_srtgroep_key =
                                                   g.bes_srtgroep_key
                                                AND bi.bes_srtdeel_key =
                                                      sd.bes_srtdeel_key
                                                AND b.bes_bestelling_key =
                                                      bi.bes_bestelling_key
                                                AND g.ins_discipline_key =
                                                      bd.ins_discipline_key
                                                AND bd.ins_discipline_key =
                                                      dp.bes_ins_discipline_key
                                                AND sd.bes_srtdeel_verwijder IS NULL
                                                AND dp.bes_ins_discipline_key_inkoop IS NOT NULL
                                                AND dp.bes_ins_discipline_key_inkoop =
                                                      221
                                                AND (sd.bes_srtdeel_vervaldatum IS NULL
                                                     OR sd.bes_srtdeel_vervaldatum >
                                                          SYSDATE)
                                     GROUP BY   sd.bes_srtdeel_nr,
                                                sd.bes_srtdeel_key,
                                                dp.bes_ins_discipline_key,
                                                dp.bes_ins_discipline_key_inkoop,
                                                bes_srtgroep_omschrijving
                                     UNION ALL
                                       SELECT   sd.bes_srtdeel_nr,
                                                sd.bes_srtdeel_key,
                                                bes_srtgroep_omschrijving,
                                                NULL bes_srtdeel_key_inkoop,
                                                dp.bes_ins_discipline_key,
                                                bd.ins_discipline_key inkoop_disc,
                                                TO_NUMBER (NULL) aantal_intern,
                                                SUM (bi.bes_bestelling_item_aantal)
                                                - SUM(COALESCE (
                                                         bi.bes_bestelling_item_aantalontv,
                                                         0
                                                      ))
                                                   aantal_open_order,
                                                TO_NUMBER (NULL)
                                                   aantal_extern_geleverd
                                         FROM   bes_discipline bd,
                                                bes_v_aanwezigsrtgroep g,
                                                bes_v_aanwezigsrtdeel sd,
                                                bes_bestelling b,
                                                bes_bestelling_item bi,
                                                bes_bestelopdr_item bo,
                                                bes_disc_params dp
                                        WHERE   sd.bes_srtgroep_key =
                                                   g.bes_srtgroep_key
                                                AND bi.bes_srtdeel_key =
                                                      sd.bes_srtdeel_key
                                                AND b.bes_bestelling_key =
                                                      bi.bes_bestelling_key
                                                AND bi.bes_bestelopdr_item_key =
                                                      bo.bes_bestelopdr_item_key
                                                AND g.ins_discipline_key =
                                                      bd.ins_discipline_key
                                                AND bd.ins_discipline_key =
                                                      dp.bes_ins_discipline_key
                                                AND sd.bes_srtdeel_verwijder IS NULL
                                                AND b.bes_bestelling_status IN
                                                         (2, 3, 4, 5)
                                                AND dp.bes_ins_discipline_key_inkoop IS NULL
                                                AND dp.bes_ins_discipline_key IN
                                                         (SELECT   dp1.bes_ins_discipline_key_inkoop
                                                            FROM   bes_disc_params dp1
                                                           WHERE   dp1.bes_ins_discipline_key_inkoop IS NOT NULL)
                                                AND bd.ins_discipline_key = 221
                                                AND (sd.bes_srtdeel_vervaldatum IS NULL
                                                     OR sd.bes_srtdeel_vervaldatum >
                                                          SYSDATE)
                                     GROUP BY   bes_srtdeel_nr,
                                                sd.bes_srtdeel_key,
                                                dp.bes_ins_discipline_key,
                                                bd.ins_discipline_key,
                                                bes_srtgroep_omschrijving
                                     UNION ALL
                                       SELECT   sd.bes_srtdeel_nr,
                                                sd.bes_srtdeel_key,
                                                bes_srtgroep_omschrijving,
                                                NULL bes_srtdeel_key_inkoop,
                                                dp.bes_ins_discipline_key,
                                                bd.ins_discipline_key inkoop_disc,
                                                TO_NUMBER (NULL) aantal_intern,
                                                TO_NUMBER (NULL) aantal_open_order,
                                                SUM(COALESCE (
                                                       bi.bes_bestelling_item_aantalontv,
                                                       0
                                                    ))
                                                   aantal_extern_geleverd
                                         FROM   bes_discipline bd,
                                                bes_v_aanwezigsrtgroep g,
                                                bes_v_aanwezigsrtdeel sd,
                                                bes_bestelling b,
                                                bes_bestelling_item bi,
                                                bes_bestelopdr_item bo,
                                                bes_disc_params dp
                                        WHERE   sd.bes_srtgroep_key =
                                                   g.bes_srtgroep_key
                                                AND bi.bes_srtdeel_key =
                                                      sd.bes_srtdeel_key
                                                AND b.bes_bestelling_key =
                                                      bi.bes_bestelling_key
                                                AND bi.bes_bestelopdr_item_key =
                                                      bo.bes_bestelopdr_item_key
                                                AND g.ins_discipline_key =
                                                      bd.ins_discipline_key
                                                AND bd.ins_discipline_key =
                                                      dp.bes_ins_discipline_key
                                                AND sd.bes_srtdeel_verwijder IS NULL
                                                AND (b.bes_bestelling_status IN
                                                           (6, 7)
                                                     OR (bo.bes_bestelopdr_item_ontvangen IS NOT NULL
                                                         AND b.bes_bestelling_status IN
                                                                  (5)))
                                                AND dp.bes_ins_discipline_key_inkoop IS NULL
                                                AND dp.bes_ins_discipline_key IN
                                                         (SELECT   dp1.bes_ins_discipline_key_inkoop
                                                            FROM   bes_disc_params dp1
                                                           WHERE   dp1.bes_ins_discipline_key_inkoop IS NOT NULL)
                                                AND bd.ins_discipline_key = 221
                                                AND (sd.bes_srtdeel_vervaldatum IS NULL
                                                     OR sd.bes_srtdeel_vervaldatum >
                                                          SYSDATE)
                                     GROUP BY   bes_srtdeel_nr,
                                                sd.bes_srtdeel_key,
                                                dp.bes_ins_discipline_key,
                                                bd.ins_discipline_key,
                                                bes_srtgroep_omschrijving,
                                                bes_srtgroep_omschrijving) bo
                         GROUP BY   bo.bes_srtdeel_key,
                                    bo.bes_srtdeel_key_inkoop,
                                    bo.bes_srtdeel_nr,
                                    bo.bes_ins_discipline_key,
                                    bo.inkoop_disc,
                                    bes_srtgroep_omschrijving) a,
                        (SELECT   sd2.bes_srtdeel_nr,
                                  sd2.bes_srtdeel_voorraadfactor
                                     intern_voorraadfactor,
                                  sg2.ins_discipline_key,
                                  sd2.bes_srtdeel_omschrijving
                                     bes_srtdeel_omschrijving
                           FROM   bes_srtdeel sd2, bes_srtgroep sg2
                          WHERE   sd2.bes_srtgroep_key = sg2.bes_srtgroep_key
                                  AND sd2.bes_srtdeel_verwijder IS NULL) b
                WHERE   a.bes_srtdeel_nr = b.bes_srtdeel_nr
                        AND a.inkoop_disc = b.ins_discipline_key
             GROUP BY   a.bes_srtdeel_key,
                        a.bes_srtdeel_nr,
                        a.inkoop_disc,
                        a.bes_srtgroep_omschrijving,
                        b.intern_voorraadfactor,
                        b.bes_srtdeel_omschrijving) l;

CREATE OR REPLACE VIEW stph_v_noti_cntreminder
(
   code,
   sender,
   receiver,
   text,
   key,
   par1,
   par2,
   xkey
)
AS
   SELECT 'CNTUPD',
          '',
          COALESCE (c.prs_perslid_key_eig, c.prs_perslid_key_beh),
          'Rappèl: Contract ' || c.cnt_contract_nummer_intern
          || DECODE (cnt_contract_versie,
                     NULL, '',
                     '.' || cnt_contract_versie)
          || ' ('
          || c.cnt_contract_omschrijving
          || ' '
          || b.prs_bedrijf_naam
          || ')'
          || ' moet uiterlijk per '
          || TO_CHAR (cnt.cnt_getopzegdatum (c.cnt_contract_key),
                      'DD-MM-YYYY')
          || ' worden verlengd of opgezegd.',
          c.cnt_contract_key,
          c.cnt_contract_nummer_intern,
          cnt.cnt_getopzegdatum (c.cnt_contract_key),
          NULL
     FROM cnt_v_aanwezigcontract c, prs_bedrijf b
    WHERE b.prs_bedrijf_key = c.cnt_prs_bedrijf_key
      AND cnt_contract_verwijder IS NULL
      AND cnt_contract_status = 0
      AND (SYSDATE BETWEEN cnt.cnt_getrappeldatum (c.cnt_contract_key)
                       AND  cnt.cnt_getopzegdatum (c.cnt_contract_key));



--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
------            INVOICESHARING.COM            INVOICESHARING.COM            INVOICESHARING.COM            INVOICESHARING.COM            INVOICESHARING.COM                    ------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


CREATE OR REPLACE PROCEDURE stph_import_invoicesharing (p_import_key IN NUMBER)
AS
    v_seq_of_columns VARCHAR(50);
BEGIN

--In de XSL: factuurnr(1);factuurdatum(2);opdrachtnr(3);omschrijving(4);bedrag(5);btwperc(6);btwbedrag(7);btw_verlegd(8);document(9);kostensoort(10);
--hulp voor pos      :  '1;2;3;4;5;6;7;8;9;0;1;2;3;4;5;16;7;8;9;0'
    v_seq_of_columns := '0;1;2;3;0;0;4;0;5;7;6;9;0;0;0;10;0;0;0;0';

      -- Variabelelijst
    -- v_leveranciernr: 1
    -- v_factuurnr: 2            (VERPLICHT, anders zet Facilitor '-' in factuurnr, en is status van factuur "Incompleet")
    -- v_factuurdatum: 3
    -- v_ordernr: 4              (VERPLICHT, anders is status van factuur "Incompleet")
    -- v_locatie: 5
    -- v_afleverdatum: 6
    -- v_omschrijving: 7
    -- v_aantal: 8
    -- v_kostprijs: 9            (VERPLICHT, anders is status van factuur "Incompleet")
    -- v_btw_bedrag: 10          (VERPLICHT, of anders veld 11, anders is status van factuur "Incompleet")
    -- v_btw: 11                 (VERPLICHT, of anders veld 10, anders is status van factuur "Incompleet")
    -- v_docid: 12
    -- v_debiteur_nr: 13
    -- v_opmerking: 14
    -- v_btw_verlegd: 15         (VERPLICHT, Ja/Nee/<leeg> waarbij leeg gelijk is aan Nee. Andere waarden leidt tot "Incompleet")
    -- v_kenmerk1: 16
    -- v_kenmerk1: 17
    -- v_kenmerk1: 18
    -- v_kenmerk1: 19
    -- v_kenmerk1: 20
    -- v_boekmaand: 21

    fac_import_factuur_body(p_import_key, v_seq_of_columns);
END;
/

CREATE OR REPLACE PROCEDURE stph_postupdate_invoicesharing (p_import_key IN NUMBER)
AS
    v_prs_kostensoort_key       prs_kostensoort.prs_kostensoort_key%TYPE;
    v_fin_kostensoort_key       prs_kostensoort.prs_kostensoort_key%TYPE;

    CURSOR cfactuurregel_kostensoort
    IS
        SELECT DISTINCT fin_factuur_key, factuurnr, fin_factuurregel_key, kenmerk1, fac_imp_file_index
        FROM fac_imp_factuur
        WHERE fac_import_key = p_import_key;
BEGIN
   FOR rc IN cfactuurregel_kostensoort
   LOOP
        BEGIN

            -- Dan gaan we op zoek of de kostensoort aangeleverd door InvoiceSharing, wel bestaat in Facilitor, zo nee, dan laten we die onbekende kostensoort op regelnivo LEEG
            SELECT MAX(prs_kostensoort_key)
            INTO v_prs_kostensoort_key
            FROM prs_kostensoort
            WHERE prs_kostensoort_upper = UPPER(rc.kenmerk1);

            IF v_prs_kostensoort_key IS NOT NULL
            THEN
                -- We hebben een geldige kostensoort van InvoiceSharing ontvangen, die gaan we zetten.
                -- Wel nog ff checken of deze kostensoort al bij factuur staat, want dan hoeven we dit op factuurregel niet te zetten (dan neemt die de kostensoort van factuur 'over')

                SELECT COALESCE(f.prs_kostensoort_key,-1)
                INTO v_fin_kostensoort_key
                FROM fin_factuur f, fin_factuurregel fr
                WHERE f.fin_factuur_key = fr.fin_factuur_key
                AND fr.fin_factuurregel_key = rc.fin_factuurregel_key;

                IF v_fin_kostensoort_key <> v_prs_kostensoort_key
                THEN
                    -- De kostensoort is NIET dezelfde als bij factuur, dus we gaan hem op factuurregel nivo zetten.
                    UPDATE fin_factuurregel
                    SET prs_kostensoort_key = v_prs_kostensoort_key
                    WHERE fin_factuurregel_key = rc.fin_factuurregel_key;
                END IF;
            ELSE
              -- STPH#38624: als er GEEN of een FOUTE/ONBEKENDE kostensoort bij de import wordt meegegeven, dat dan de status op "Ingevoerd" terug wordt gezet.
              UPDATE fin_factuur
              SET fin_factuur_statuses_key = 2
              WHERE fin_factuur_key = (SELECT fin_factuur_key FROM fin_factuurregel fr WHERE fr.fin_factuurregel_key = rc.fin_factuurregel_key);
            END IF;

        EXCEPTION
            WHEN OTHERS
                THEN
                fac.imp_writelog (p_import_key,
                                'W',
                                'Van factuur met key ' || rc.fin_factuur_key || ' is de kostensoort niet verwerkt (regel ' || rc.fac_imp_file_index || ')',
                                'Factuurnr:' || rc.factuurnr  || ' / Kostensoort: ' || rc.kenmerk1
                                );
        END;
   END LOOP;
END;
/
CREATE OR REPLACE PROCEDURE stph_update_invoicesharing (p_import_key IN NUMBER)
AS
BEGIN
   -- Standaard FCLT verwerk import facturen
   fac_update_factuur (p_import_key);
   stph_postupdate_invoicesharing(p_import_key);
END;
/


CREATE OR REPLACE PROCEDURE stph_import_afasonline (p_import_key IN NUMBER)
AS
   oracle_err_num            NUMBER;
   oracle_err_mes            VARCHAR2 (200);
   v_errormsg                VARCHAR2 (400);
   v_errorhint               VARCHAR2 (400);
BEGIN

   v_errorhint := 'Generieke update';
   -- de sequence array staat beschreven in PRS_PAC.SRC bij de prs.import_perslid proc
   prs.import_perslid (p_import_key,
                       '0;0;0;0;0;0;6;4;3;1;' ||
                       '2;0;0;0;0;10;0;8;0;5;' ||
                       '7;11;0;0;0;0;12;0;0;0;'||
                       '0;0;0;0;0;0;0;0;0;0;'||
                       '0;0;0;0;0;0',
                       '"Roepnaam";"Voorletters";"Tussenvoegsel";"Achternaam";"Persnr.";"Afdnr.";"Functie";"Email";"Mobile";"Telefoon";"Loginnaam";"Kostenplaats"'
                       );
  COMMIT;
EXCEPTION
   WHEN OTHERS
   THEN
      oracle_err_num := SQLCODE;
      oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
      v_errormsg := 'Error ' || oracle_err_num || '/' || oracle_err_mes;
      fac.imp_writelog (p_import_key, 'E', v_errormsg, v_errorhint);
END stph_import_afasonline;
/


CREATE OR REPLACE PROCEDURE stph_update_afasonline (
   p_import_key IN NUMBER
) IS
  -- Alle personen verwijderen die niet meer in import bestand voorkomen.
  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_count           NUMBER;

BEGIN
    -- generic update

    SELECT count(*)
      INTO v_count
      FROM fac_imp_perslid;

    IF v_count < 300
    THEN
      fac.imp_writelog (p_import_key,
                        'E',
                        'Het aantal te importeren personen is te klein ('
                        || TO_CHAR (v_count) || ')',
                        'Zie Specificatie'
      );
      RETURN;
    END IF;

  -- 'NR' betekent dat op basis van personeelsNummeR wordt gematched.
  -- 'A' betekent altijd alle (andere/overige) werkplekken verwijderen
  prs.update_perslid (p_import_key, 'NR', NULL);

  -- Verwijder personen die niet meer in de import voorkomen.
  FOR rec IN c_del
  LOOP
     BEGIN
       prs.delete_perslid (p_import_key, rec.prs_perslid_key);
     END;
  END LOOP;
  STPH_post_update_afasonline (p_import_key);

END stph_update_afasonline;
/

CREATE OR REPLACE PROCEDURE stph_post_update_afasonline (p_import_key IN NUMBER)
AS
    v_kostenplaats_key_perslid  NUMBER(10);
    v_kostenplaats_key_afdeling NUMBER(10);
    v_prs_afdeling_key          NUMBER(10);

    CURSOR c_perslid_kpn_kenmerk
    IS
        SELECT prs_perslid_nr, prs_kenmerk1, prs_perslid_naam, prs_afdeling_naam
        FROM fac_imp_perslid;
BEGIN

   FOR rc IN c_perslid_kpn_kenmerk
   LOOP

        BEGIN

            -- Kostenplaats die als kenmerk is meegegeven bij de persoon
            SELECT MAX(prs_kostenplaats_key)
            INTO v_kostenplaats_key_perslid
            FROM prs_kostenplaats
            WHERE prs_kostenplaats_upper = UPPER(rc.prs_kenmerk1)
            AND prs_kostenplaats_verwijder IS NULL;

            IF v_kostenplaats_key_perslid IS NULL
            THEN
              -- Kostenplaats bij de persoon (vanuit AFAS) staat niet in Facilitor, persoon blijft aan de afdeling gekoppeld volgens AFAS (dus niet naar evt. 'fictieve' afdeling).
              fac.imp_writelog (p_import_key,
                                'W',
                                'Kostenplaats van persoon' || rc.prs_perslid_nr || ' is NIET gevonden)',
                                'Naam:' || rc.prs_perslid_naam  || ' / Afdeling: ' || rc.prs_afdeling_naam
                                );
            ELSE
              -- Kostenplaats record bij de persoon is gevonden,
              -- Nu eerst de kostenplaats van de afdeling bepalen
              SELECT MAX(a.prs_kostenplaats_key)
              INTO v_kostenplaats_key_afdeling
              FROM prs_afdeling a, prs_perslid p
              WHERE p.prs_perslid_nr = rc.prs_perslid_nr
              AND p.prs_perslid_verwijder IS NULL
              AND a.prs_afdeling_key = p.prs_afdeling_key
              AND a.prs_afdeling_verwijder IS NULL;

              -- Als deze afwijkt van de kostenplaats van de afdeling waar persoon onder valt, dan persoon verhuizen naar die fictieve afdeling
              IF v_kostenplaats_key_afdeling IS NOT NULL
              THEN
                  -- Afdeling heeft kostenplaats, nu vergelijken met die van persoon
                  -- Indien ongelijk, dan zoek de fictieve afdeling, want daar persoon aan koppelen.
                  IF v_kostenplaats_key_perslid <> v_kostenplaats_key_afdeling
                  THEN
                      -- Zoek de eerste afdeling (MAX) die kostenplaats van persoon heeft, daar gaat persoon onder vallen.
                      SELECT MAX(a.prs_afdeling_key)
                      INTO v_prs_afdeling_key
                      FROM prs_afdeling a
                      WHERE a.prs_kostenplaats_key = v_kostenplaats_key_perslid
                      AND a.prs_afdeling_verwijder IS NULL;

                      IF v_prs_afdeling_key IS NOT NULL
                      THEN
                          UPDATE prs_perslid p
                          SET p.prs_afdeling_key = v_prs_afdeling_key
                          WHERE p.prs_perslid_nr = rc.prs_perslid_nr
                          AND p.prs_perslid_verwijder IS NULL;
                      END IF;
                  END IF;
              END IF;
            END IF;



        EXCEPTION
            WHEN OTHERS
                THEN
                fac.imp_writelog (p_import_key,
                                'W',
                                'Post update bij persoon' || rc.prs_perslid_nr || ' is NIET volledig uitgevoerd )',
                                'Naam:' || rc.prs_perslid_naam  || ' / Afdeling: ' || rc.prs_afdeling_naam
                                );
        END;
   END LOOP;
END;
/

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

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

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