--
-- $Id$
--
-- Script containing customer specific db-configuration for DIAN.
DEFINE thisfile = 'DIAN.SQL'
DEFINE dbuser   = '^DIAN'

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

CREATE OR REPLACE VIEW dian_v_rap_import_log
(
   fclt_f_applicatie,
   datum,
   fclt_f_status,
   omschrijving,
   hint
)
AS
   SELECT COALESCE (fac_import_app_code, imp_log_applicatie),
          TO_CHAR (imp_log_datum, 'dd-mm-yyyy hh24:mi'),
          imp_log_status,
          imp_log_omschrijving,
          imp_log_hint
     FROM imp_log il1, fac_import fi1, fac_import_app fia1
    WHERE il1.fac_import_key = fi1.fac_import_key(+)
          AND fi1.fac_import_app_key = fia1.fac_import_app_key(+)
          AND NOT EXISTS
                (SELECT 1
                   FROM imp_log il2, fac_import fi2
                  WHERE     il2.fac_import_key = fi2.fac_import_key
                        AND fi2.fac_import_app_key = fi1.fac_import_app_key
                        AND il2.fac_import_key > il1.fac_import_key);

CREATE OR REPLACE PROCEDURE dian_import_prs (p_import_key IN NUMBER)
AS
   v_errormsg       VARCHAR2 (1000) := '-';
   oracle_err_num   NUMBER;
   oracle_err_mes   VARCHAR2 (200);
BEGIN
   -- Personeelsnummer (kolom 1) tot 6 posities prefixen met voorloopnullen!
   UPDATE fac_imp_file i
      SET i.fac_imp_file_line =
             SUBSTR ('00000' || SUBSTR (fac_imp_file_line, 1, INSTR (fac_imp_file_line, ';', 1, 1) - 1), -6)
             || SUBSTR (fac_imp_file_line, INSTR (fac_imp_file_line, ';', 1, 1))
    WHERE fac_import_key = p_import_key
          AND fac_imp_file_index > 1
          AND SUBSTR (fac_imp_file_line, 1, 1) != ';';
   COMMIT;

   -- Afdelingsomschrijving (kolom 5) mappen naar afdelingscode!
   UPDATE fac_imp_file i
      SET i.fac_imp_file_line =
             SUBSTR (fac_imp_file_line, 1, INSTR (fac_imp_file_line, ';', 1, 4))
             || (SELECT MAX (prs_afdeling_naam)
                   FROM prs_afdeling
                  WHERE UPPER (prs_afdeling_omschrijving) =
                           UPPER (SUBSTR (fac_imp_file_line,
                                          INSTR (fac_imp_file_line, ';', 1, 4) + 1,
                                          INSTR (fac_imp_file_line, ';', 1, 5) - INSTR (fac_imp_file_line, ';', 1, 4) - 1)))
             || SUBSTR (fac_imp_file_line, INSTR (fac_imp_file_line, ';', 1, 5))
    WHERE fac_import_key = p_import_key
          AND fac_imp_file_index > 1
          AND EXISTS
                (SELECT 1
                   FROM prs_afdeling
                  WHERE UPPER (prs_afdeling_omschrijving) =
                           UPPER (SUBSTR (fac_imp_file_line,
                                          INSTR (fac_imp_file_line, ';', 1, 4) + 1,
                                          INSTR (fac_imp_file_line, ';', 1, 5) - INSTR (fac_imp_file_line, ';', 1, 4) - 1)));
   COMMIT;

   UPDATE fac_imp_file i
      SET i.fac_imp_file_line =
             SUBSTR (fac_imp_file_line, 1, INSTR (fac_imp_file_line, ';', 1, 4))
             || SUBSTR (SUBSTR (fac_imp_file_line,
                                INSTR (fac_imp_file_line, ';', 1, 4) + 1,
                                INSTR (fac_imp_file_line, ';', 1, 5) - INSTR (fac_imp_file_line, ';', 1, 4) - 1), 1, 15)
             || SUBSTR (fac_imp_file_line, INSTR (fac_imp_file_line, ';', 1, 5))
    WHERE fac_import_key = p_import_key
          AND fac_imp_file_index > 1
          AND NOT EXISTS
                (SELECT 1
                   FROM prs_afdeling
                  WHERE UPPER (prs_afdeling_omschrijving) =
                           UPPER (SUBSTR (fac_imp_file_line,
                                          INSTR (fac_imp_file_line, ';', 1, 4) + 1,
                                          INSTR (fac_imp_file_line, ';', 1, 5) - INSTR (fac_imp_file_line, ';', 1, 4) - 1)));
   COMMIT;

   -- Generieke import.
   -- De sequence array staat beschreven in PRS_PAC.SRC bij de import_perslid-PROCEDURE.
   -- Met Stamplaats wordt nog niets gedaan!
   --'%"Personeelsnummer";"Loginnaam";"Achternaam";"Voornaam";"Afdelingsoms";"Functie";"Email";"Stamplaats"%');
   --'%Personeelsnummer;Loginnaam;Achternaam;Voornaam;Afdelingsoms;Functie;Email;Stamplaats%');
   prs.import_perslid (
      p_import_key,
         '0;0;0;0;0;0;5;3;0;4;'
      || '0;0;0;0;0;0;0;7;0;1;'
      || '6;2;0;0;0;0;8;0;0;0;'
      || '0;0;0;0;0;0;0;0;0;0;'
      || '0;0;0;0;0;0',
      '%Personeelsnummer;Loginnaam;Achternaam;Voornaam;Afdelingsoms;Functie;Email;Stamplaats%');

   -- Klantspecifieke aanpassingen.
/*
   -- Als geen Loginnaam aangeleverd, dan handmatig toegekende niet wissen.
   UPDATE fac_imp_perslid i
      SET i.prs_perslid_oslogin =
             (SELECT MAX (prs_perslid_oslogin)
                FROM prs_v_aanwezigperslid
               WHERE prs_perslid_nr = i.prs_perslid_nr)
    WHERE i.prs_perslid_oslogin IS NULL        -- Aangeleverde Loginnaam wint!
          AND EXISTS
                (SELECT 1
                   FROM prs_v_aanwezigperslid
                  WHERE prs_perslid_oslogin IS NOT NULL
                        AND prs_perslid_nr = i.prs_perslid_nr);
   COMMIT;

   -- Als geen Voornaam aangeleverd, dan handmatig toegekende niet wissen.
   UPDATE fac_imp_perslid i
      SET i.prs_perslid_voornaam =
             (SELECT MAX (prs_perslid_voornaam)
                FROM prs_v_aanwezigperslid
               WHERE prs_perslid_nr = i.prs_perslid_nr)
    WHERE i.prs_perslid_voornaam IS NULL        -- Aangeleverde Voornaam wint!
          AND EXISTS
                (SELECT 1
                   FROM prs_v_aanwezigperslid
                  WHERE prs_perslid_voornaam IS NOT NULL
                        AND prs_perslid_nr = i.prs_perslid_nr);
   COMMIT;

   -- Als geen Functie aangeleverd, dan handmatig toegekende niet wissen.
   UPDATE fac_imp_perslid i
      SET i.prs_srtperslid_omschrijving =
             (SELECT MAX (prs_srtperslid_omschrijving)
                FROM prs_v_aanwezigperslid
               WHERE prs_perslid_nr = i.prs_perslid_nr)
    WHERE i.prs_srtperslid_omschrijving IS NULL  -- Aangeleverde Functie wint!
          AND EXISTS
                (SELECT 1
                   FROM prs_v_aanwezigperslid
                  WHERE prs_srtperslid_omschrijving IS NOT NULL
                        AND prs_perslid_nr = i.prs_perslid_nr);
   COMMIT;

   -- Als geen Email aangeleverd, dan handmatig toegekende niet wissen.
   UPDATE fac_imp_perslid i
      SET i.prs_perslid_email =
             (SELECT MAX (prs_perslid_email)
                FROM prs_v_aanwezigperslid
               WHERE prs_perslid_nr = i.prs_perslid_nr)
    WHERE i.prs_perslid_email IS NULL              -- Aangeleverde Email wint!
          AND EXISTS
                (SELECT 1
                   FROM prs_v_aanwezigperslid
                  WHERE prs_perslid_email IS NOT NULL
                        AND prs_perslid_nr = i.prs_perslid_nr);
   COMMIT;
*/
   -- Locatie/Gebouw/Verdieping/Ruimte bepalen via Vestiging-kolom -> Eigen tabel (key=1) ->
   -- Gebouw en daaronder Ruimte '_000' op de verdieping met het laagste volgnummer!
   -- Als persoon al een WP heeft op import-locatie, dan is dat de juiste en blijft deze
   -- (handmatig gecorrigeerde WP) ongewijzigd. In alle andere gevallen verhuist persoon naar
   -- '_000' op de meegegeven locatie.
   -- Eventuele WPs onder andere locaties dan import-locatie blijven ook ongewijzigd!
   UPDATE fac_imp_perslid i
      SET i.alg_locatie_code =
             (SELECT il.alg_locatie_code
                FROM fac_v_aanwezigusrdata ud, -- Mapping Kenmerk1-code -> Locatiecode
                     alg_v_aanweziglocatie il
               WHERE ud.fac_usrtab_key = 21
                     AND UPPER (ud.fac_usrdata_code) = UPPER (i.prs_kenmerk1)
                     AND UPPER (ud.fac_usrdata_omschr) = UPPER (il.alg_locatie_code)),
          i.alg_gebouw_code =
             (SELECT ig.alg_gebouw_code
                FROM fac_v_aanwezigusrdata ud, -- Mapping Kenmerk1-code -> Locatiecode
                     alg_v_aanweziglocatie il,
                     alg_v_aanweziggebouw ig
               WHERE ud.fac_usrtab_key = 21
                     AND UPPER (ud.fac_usrdata_code) = UPPER (i.prs_kenmerk1)
                     AND UPPER (ud.fac_usrdata_omschr) = UPPER (il.alg_locatie_code)
                     AND il.alg_locatie_key = ig.alg_locatie_key
                     AND ig.alg_gebouw_code = '_'),
          i.alg_verdieping_volgnr =
             (SELECT iv.alg_verdieping_volgnr
                FROM fac_v_aanwezigusrdata ud, -- Mapping Kenmerk1-code -> Locatiecode
                     alg_v_aanweziglocatie il,
                     alg_v_aanweziggebouw ig,
                     alg_verdieping iv,
                     alg_ruimte ir
               WHERE ud.fac_usrtab_key = 21
                     AND UPPER (ud.fac_usrdata_code) = UPPER (i.prs_kenmerk1)
                     AND UPPER (ud.fac_usrdata_omschr) = UPPER (il.alg_locatie_code)
                     AND il.alg_locatie_key = ig.alg_locatie_key
                     AND ig.alg_gebouw_code = '_'
                     AND ig.alg_gebouw_key = iv.alg_gebouw_key
                     AND iv.alg_verdieping_key = ir.alg_verdieping_key
                     AND ir.alg_ruimte_nr = '_'
                     AND NOT EXISTS
                           (SELECT 1
                              FROM alg_v_aanwezigruimte r, alg_verdieping v
                             WHERE r.alg_ruimte_nr = '_'
                                   AND r.alg_verdieping_key = v.alg_verdieping_key
                                   AND v.alg_verdieping_volgnr < iv.alg_verdieping_volgnr)),
          i.alg_ruimte_nr =
             (SELECT ir.alg_ruimte_nr
                FROM fac_v_aanwezigusrdata ud, -- Mapping Kenmerk1-code -> Locatiecode
                     alg_v_aanweziglocatie il,
                     alg_v_aanweziggebouw ig,
                     alg_verdieping iv,
                     alg_ruimte ir
               WHERE ud.fac_usrtab_key = 21
                     AND UPPER (ud.fac_usrdata_code) = UPPER (i.prs_kenmerk1)
                     AND UPPER (ud.fac_usrdata_omschr) = UPPER (il.alg_locatie_code)
                     AND il.alg_locatie_key = ig.alg_locatie_key
                     AND ig.alg_gebouw_code = '_'
                     AND ig.alg_gebouw_key = iv.alg_gebouw_key
                     AND iv.alg_verdieping_key = ir.alg_verdieping_key
                     AND ir.alg_ruimte_nr = '_'
                     AND NOT EXISTS
                           (SELECT 1
                              FROM alg_v_aanwezigruimte r, alg_verdieping v
                             WHERE r.alg_ruimte_nr = '_'
                                   AND r.alg_verdieping_key = v.alg_verdieping_key
                                   AND v.alg_verdieping_volgnr < iv.alg_verdieping_volgnr))
    WHERE NOT EXISTS                          -- Nog geen werkplek op Locatie!
             (SELECT 1
                FROM fac_v_aanwezigusrdata ud, -- Mapping Kenmerk1-code -> Locatiecode
                     alg_v_aanweziggebouw ig,
                     alg_locatie il,
                     prs_v_aanwezigperslid p,
                     prs_perslidwerkplek pw,
                     prs_werkplek cw,
                     alg_v_aanwezigruimte cr,
                     alg_verdieping cv,
                     alg_gebouw cg
               WHERE ud.fac_usrtab_key = 21
                     AND UPPER (ud.fac_usrdata_code) = UPPER (i.prs_kenmerk1)
                     AND UPPER (ud.fac_usrdata_omschr) = UPPER (il.alg_locatie_code)
                     AND il.alg_locatie_key = ig.alg_locatie_key
                     AND p.prs_perslid_nr = i.prs_perslid_nr
                     AND p.prs_perslid_key = pw.prs_perslid_key
                     AND pw.prs_werkplek_key = cw.prs_werkplek_key
                     AND cw.prs_alg_ruimte_key = cr.alg_ruimte_key
                     AND cr.alg_verdieping_key = cv.alg_verdieping_key
                     AND cv.alg_gebouw_key = cg.alg_gebouw_key
                     AND cg.alg_locatie_key = il.alg_locatie_key);
   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_errormsg, 'Inleesproces personen afgebroken!');
END dian_import_prs;
/

CREATE OR REPLACE PROCEDURE dian_update_prs (p_import_key IN NUMBER)
AS
   -- Maximaal percentage aan nieuwe medewerkers tov. actieve medewerkers (met
   -- een personeelsnummer).
   c_max_delta_percentage   NUMBER (10) := 25;                         -- 25%!
   v_count_prs_import       NUMBER (10);     -- #actieve personen  na  import!
   v_count_prs_actual       NUMBER (10);     -- #actieve personen voor import!

   -- Mandateren personen met >1 dienstverband, namelijk voor kostenplaats(en)
   -- van de andere dan de eigen afdeling!
/*
   CURSOR c_mandate
   IS
        SELECT p.prs_perslid_key, p.prs_perslid_nr, a.prs_kostenplaats_key
          FROM prs_v_aanwezigperslid p, prs_afdeling a, fac_imp_perslid i
         WHERE p.prs_afdeling_key = a.prs_afdeling_key
               AND UPPER (p.prs_perslid_nr) = UPPER (i.prs_perslid_nr)
               AND a.prs_afdeling_upper != UPPER (i.prs_perslid_naam)
      ORDER BY 2;
*/

   -- Verwijderen personen niet in import!
/*
   CURSOR c_del
   IS
        SELECT p.prs_perslid_key, p.prs_perslid_nr
          FROM prs_v_aanwezigperslid p
         WHERE p.prs_perslid_nr IS NOT NULL
               AND NOT EXISTS
                     (SELECT 1
                        FROM fac_imp_perslid
                       WHERE UPPER (prs_perslid_nr) = UPPER (p.prs_perslid_nr))
      ORDER BY 2;
*/
BEGIN
   -- Bepaal aantal actieve personen in FACILITOR  na  import!
   SELECT COUNT (DISTINCT prs_perslid_nr)
     INTO v_count_prs_import
     FROM fac_imp_perslid
    WHERE prs_perslid_nr IS NOT NULL;

   -- Bepaal aantal actieve personen in FACILITOR voor import!
   SELECT DECODE (COUNT ( * ), 0, 1, COUNT ( * ))
     INTO v_count_prs_actual
     FROM prs_v_aanwezigperslid
    WHERE prs_perslid_nr IS NOT NULL;

   IF (TRUNC ( (v_count_prs_import / v_count_prs_actual) * 100) < (100 - c_max_delta_percentage))
   THEN
      fac.imp_writelog (
         p_import_key,
         'E',
         'Verschil tussen huidig aantal en te importeren aantal personen te groot; zie specificatie!',
            '- max. verschilpercentage = ['
         || TO_CHAR (c_max_delta_percentage)
         || '%]'
         || CHR (13) || CHR (10)
         || '- #personen/import = ['
         || TO_CHAR (v_count_prs_import)
         || ']'
         || CHR (13) || CHR (10)
         || '- #personen/huidig = ['
         || TO_CHAR (v_count_prs_actual)
         || ']');
      RETURN;
   END IF;

   -- Generieke update (op personeelsnummer).
   prs.update_perslid (p_import_key, 'NR', 'D');

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

CREATE OR REPLACE PROCEDURE dian_import_exact (p_import_key IN NUMBER)
AS
   c_delim               VARCHAR2 (1) := ';';
   c_client_fkey         NUMBER (10) := 621;                         -- Cliënt
   c_client_anaam        VARCHAR2 (4) := 'EXTB';
   v_errormsg            VARCHAR2 (1000);
   oracle_err_num        NUMBER;
   oracle_err_mes        VARCHAR2 (200);
   v_aanduiding          VARCHAR2 (200);
   v_ongeldig            NUMBER (1);
   v_newline             VARCHAR2 (1000);                        -- Input line
   header_is_valid       NUMBER;
   v_count_tot           NUMBER (10);
   v_count_import        NUMBER (10);
   -- De importvelden:
   v_clientid            VARCHAR2 (255);                                -- C16
   v_clientnaam          VARCHAR2 (255);                                -- C60
   v_clientvoorletters   VARCHAR2 (255);                                -- C15
   v_clientgeslacht      VARCHAR2 (255);                                 -- N1
   v_clienttelefoon      VARCHAR2 (255);                                -- C15
   v_clientemail         VARCHAR2 (255);                               -- C200
   v_artnr               VARCHAR2 (255);                                -- C32
   v_artikelomschrijving VARCHAR2 (255);                               -- C100
   v_artikelprijs        VARCHAR2 (255);                               -- N8.2
   v_artikeleenheid      VARCHAR2 (255);                                -- C30
   v_aantal_ce           VARCHAR2 (255);                                 -- Nx

   CURSOR c1
   IS
        SELECT fac_imp_file_line
          FROM fac_imp_file
         WHERE fac_import_key = p_import_key
      ORDER BY fac_imp_file_index;
BEGIN
   DELETE FROM fac_imp_perslid;
   DELETE FROM fac_imp_catalogus;
   COMMIT;

   header_is_valid := 0;
   v_count_tot := 0;
   v_count_import := 0;

   FOR rec1 IN c1
   LOOP
      BEGIN
         v_errormsg := 'Fout opvragen importregel';
         v_aanduiding := '';
         v_ongeldig := 0;
         v_newline := rec1.fac_imp_file_line;
         -- Lees alle veldwaarden
         -- ClientId;ClientAchternaam;ClientVoorletters;ClientGeslacht;ClientTelefoon;ClientEmail;Artikelnr;Omschrijving;Prijs;Eenheid
         -- ClientID;ClientNaam;ClientVoorletters;ClientGeslacht;ClientTelefoon;ClientEmail;Artnr;ArtikelOmschrijving;ArtikelPrijs;ArtikelEenheid;aantal_ce
         fac.imp_getfield (v_newline, c_delim, v_clientid);
         fac.imp_getfield (v_newline, c_delim, v_clientnaam);
         fac.imp_getfield (v_newline, c_delim, v_clientvoorletters);
         fac.imp_getfield (v_newline, c_delim, v_clientgeslacht);
         fac.imp_getfield (v_newline, c_delim, v_clienttelefoon);
         fac.imp_getfield (v_newline, c_delim, v_clientemail);
         fac.imp_getfield (v_newline, c_delim, v_artnr);
         fac.imp_getfield (v_newline, c_delim, v_artikelomschrijving);
         fac.imp_getfield (v_newline, c_delim, v_artikelprijs);
         fac.imp_getfield (v_newline, c_delim, v_artikeleenheid);
         fac.imp_getfield (v_newline, c_delim, v_aantal_ce);

         v_aanduiding := '[' || v_clientid || '|' || v_artnr || '] ';

         -- Ik controleer of ik een geldige header heb, dat is: in de juiste kolommen
         -- de juiste kolomkop. Ik controleer daarbij ALLE kolommen!
         -- Ik negeer alles totdat ik een geldige header ben gepasseerd.
         IF (header_is_valid = 0)
         THEN
            IF     UPPER (v_clientid) = 'CLIENTID'
               AND UPPER (v_clientnaam) = 'CLIENTNAAM'
               AND UPPER (v_clientvoorletters) = 'CLIENTVOORLETTERS'
               AND UPPER (v_clientgeslacht) = 'CLIENTGESLACHT'
               AND UPPER (v_clienttelefoon) = 'CLIENTTELEFOON'
               AND UPPER (v_clientemail) = 'CLIENTEMAIL'
               AND UPPER (v_artnr) = 'ARTNR'
               AND UPPER (v_artikelomschrijving) = 'ARTIKELOMSCHRIJVING'
               AND UPPER (v_artikelprijs) = 'ARTIKELPRIJS'
               AND UPPER (v_artikeleenheid) = 'ARTIKELEENHEID'
               AND UPPER (v_aantal_ce) = 'AANTAL_CE'
            THEN
               header_is_valid := 1;
            END IF;
         ELSE
            v_count_tot := v_count_tot + 1;
            -- Controleer alle veldwaarden
            v_errormsg := 'ClientId ongeldig; ongedefinieerd of te lang';
            v_clientid := TRIM (v_clientid);

            IF v_clientid IS NULL OR LENGTH (v_clientid) > 16
            THEN
               v_ongeldig := 1;
               fac.imp_writelog (p_import_key, 'W', v_aanduiding || v_errormsg, 'Regel overgeslagen!');
            END IF;

            --
            v_errormsg := 'ClientNaam ongeldig; ongedefinieerd of te lang';
            v_clientnaam := TRIM (v_clientnaam);

            IF v_clientnaam IS NULL OR LENGTH (v_clientnaam) > 60
            THEN
               v_ongeldig := 1;
               fac.imp_writelog (p_import_key, 'W', v_aanduiding || v_errormsg, 'Regel overgeslagen!');
            END IF;

            --
            v_errormsg := 'ClientVoorletters ongeldig; ongedefinieerd of te lang';
            v_clientvoorletters := TRIM (v_clientvoorletters);

            IF LENGTH (v_clientvoorletters) > 15
            THEN
               v_clientvoorletters := SUBSTR (v_clientvoorletters, 1, 15);
               fac.imp_writelog (p_import_key, 'W', v_aanduiding || v_errormsg, 'ClientVoorletters afgekapt!');
            END IF;

            --
            v_errormsg := 'ClientGeslacht ongeldig';
            v_clientgeslacht := TRIM (v_clientgeslacht);

            IF v_clientgeslacht NOT IN ('M', 'V')
            THEN
               v_clientgeslacht := '';
               fac.imp_writelog (p_import_key, 'I', v_aanduiding || v_errormsg, 'ClientGeslacht genegeerd!');
            END IF;

            --
            v_errormsg := 'ClientTelefoon te lang';
            v_clienttelefoon := TRIM (v_clienttelefoon);

            IF LENGTH (v_clienttelefoon) > 15
            THEN
               v_clienttelefoon := SUBSTR (v_clienttelefoon, 1, 15);
               fac.imp_writelog (p_import_key, 'I', v_aanduiding || v_errormsg, 'ClientTelefoon afgekapt!');
            END IF;

            --
            v_errormsg := 'ClientEmail te lang';
            v_clientemail := TRIM (v_clientemail);

            IF LENGTH (v_clientemail) > 200
            THEN
               v_clientemail := SUBSTR (v_clientemail, 1, 200);
               fac.imp_writelog (p_import_key, 'I', v_aanduiding || v_errormsg, 'ClientEmail afgekapt!');
            END IF;

            --
            v_errormsg := 'ArtNr ongeldig; ongedefinieerd of te lang';
            v_artnr := TRIM (v_artnr);

            IF v_artnr IS NULL OR LENGTH (v_artnr) > 32
            THEN
               v_ongeldig := 1;
               fac.imp_writelog (p_import_key, 'W', v_aanduiding || v_errormsg, 'Regel overgeslagen!');
            END IF;

            --
            v_errormsg := 'ArtikelOmschrijving ongeldig; ongedefinieerd of te lang';
            v_artikelomschrijving := TRIM (v_artikelomschrijving);

            IF v_artikelomschrijving IS NULL OR LENGTH (v_artikelomschrijving) > 100
            THEN
               v_ongeldig := 1;
               fac.imp_writelog (p_import_key, 'W', v_aanduiding || v_errormsg, 'Regel overgeslagen!');
            END IF;

            --
            v_errormsg := 'ArtikelPrijs ongeldig';
            v_artikelprijs := TRIM (v_artikelprijs);

            --IF fac.safe_to_number (v_artikelprijs) IS NULL
            IF v_artikelprijs IS NOT NULL AND fac.safe_to_number (v_artikelprijs) IS NULL
            THEN
               v_ongeldig := 1;
               fac.imp_writelog (p_import_key, 'W', v_aanduiding || v_errormsg, 'Regel overgeslagen!');
            END IF;

            --
            v_errormsg := 'ArtikelEenheid te lang';
            v_artikeleenheid := TRIM (v_artikeleenheid);

            IF LENGTH (v_artikeleenheid) > 30
            THEN
               v_artikeleenheid := SUBSTR (v_artikeleenheid, 1, 30);
               fac.imp_writelog (p_import_key, 'I', v_aanduiding || v_errormsg, 'ArtikelEenheid afgekapt!');
            END IF;

            --
            v_errormsg := 'aantal_ce ongeldig';
            v_aantal_ce := TRIM (v_aantal_ce);

            --IF fac.safe_to_number (v_aantal_ce) IS NULL
            IF v_aantal_ce IS NOT NULL AND fac.safe_to_number (v_aantal_ce) IS NULL
            THEN
               v_ongeldig := 1;
               fac.imp_writelog (p_import_key, 'I', v_aanduiding || v_errormsg, 'Regel overgeslagen!');
            END IF;

            -- Insert geformatteerde import record
            IF v_ongeldig = 0
            THEN
               BEGIN
                  v_errormsg := 'Fout wegschrijven importregels';

                  INSERT INTO fac_imp_perslid (fac_import_key,
                                               prs_perslid_oslogin,
                                               prs_perslid_naam,
                                               prs_perslid_voorletters,
                                               prs_perslid_geslacht,
                                               prs_perslid_telefoonnr,
                                               prs_perslid_email,
                                               prs_afdeling_naam,
                                               prs_srtperslid_omschrijving)
                     SELECT p_import_key,
                            v_clientid,
                            v_clientnaam,
                            v_clientvoorletters,
                            DECODE (v_clientgeslacht, 'M', 1, 'V', 0, NULL),
                            v_clienttelefoon,
                            v_clientemail,
                            c_client_anaam,
                            prs_srtperslid_omschrijving
                       FROM prs_srtperslid
                      WHERE prs_srtperslid_key = c_client_fkey
                            AND NOT EXISTS
                                  (SELECT 1
                                     FROM fac_imp_perslid
                                    WHERE prs_perslid_oslogin = v_clientid);

                  INSERT INTO fac_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,
                              NULL,
                              NULL,
                              TRUNC (SYSDATE),
                              v_artnr,
                              v_clientid,
                              v_artikelomschrijving,
                              0,
                              NULL,
                              DECODE (UPPER (v_artikeleenheid),
                                      'STUKS', DECODE (v_aantal_ce, 1, 'stuks', 'per ' || v_aantal_ce || ' stuks'),
                                      LOWER (v_artikeleenheid) || ' à ' || v_aantal_ce),
                              NULL,
                              NULL,
                              NULL,
                              NULL,
                              NULL,
                              NULL,
                              NULL,
                              NULL,
                              NULL);
                  v_count_import := v_count_import + 1;
               EXCEPTION
                  WHEN OTHERS
                  THEN
                     oracle_err_num := SQLCODE;
                     oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
                     v_errormsg := v_errormsg || ' ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
                     fac.imp_writelog (p_import_key, 'W', v_aanduiding || v_errormsg, '');
               END;
               COMMIT;
            END IF;
         END IF;
      END;
   END LOOP;

   IF (header_is_valid = 0)
   THEN
      fac.imp_writelog (p_import_key, 'E', 'Ongeldig importbestand', 'Geen header of header niet volgens specificatie!');
   ELSE
      fac.imp_writelog (p_import_key, 'S', 'BES-catalogi/#ingelezen importregels: ' || TO_CHAR (v_count_tot), '' );
      fac.imp_writelog (p_import_key, 'S', 'BES-catalogi/#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 := v_errormsg || ' ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
      fac.imp_writelog (p_import_key, 'E', v_aanduiding || v_errormsg, 'Inleesproces BES-catalogi afgebroken!');
END dian_import_exact;
/

CREATE OR REPLACE PROCEDURE dian_update_exact (p_import_key IN NUMBER)
AS
   -- Maximaal percentage aan nieuwe medewerkers tov. actieve medewerkers (met
   -- een personeelsnummer).
   c_max_delta_percentage   NUMBER (10) := 50;                         -- 50%!
   c_client_fkey            NUMBER (10) := 621;                      -- Cliënt
   c_client_anaam           VARCHAR2 (4) := 'EXTB';
   c_exact_bkey             NUMBER (10) := 641;                       -- Exact
   c_default_gkey           NUMBER (10) := 1;                -- _Default-groep
   c_clientbeheer_gkey      NUMBER (10) := 61;           -- CliëntBeheer-groep
   v_errormsg               VARCHAR2 (1000);
   oracle_err_num           NUMBER;
   oracle_err_mes           VARCHAR2 (200);
   v_aanduiding             VARCHAR2 (200);
   v_count_prs_import       NUMBER (10);     -- #actieve personen  na  import!
   v_count_prs_actual       NUMBER (10);     -- #actieve personen voor import!
   v_count                  NUMBER (10);
   v_discipline_key         NUMBER (10);

   -- Verwijderen cliënten niet in import!
   CURSOR c_prsdel
   IS
        SELECT p.prs_perslid_key
          FROM prs_v_aanwezigperslid p, prs_afdeling a
         WHERE p.prs_srtperslid_key = c_client_fkey                  -- Cliënt
               AND p.prs_afdeling_key = a.prs_afdeling_key
               AND a.prs_afdeling_naam = c_client_anaam
               AND NOT EXISTS
                     (SELECT 1
                        FROM fac_imp_perslid
                       WHERE prs_perslid_oslogin = p.prs_perslid_oslogin)
      ORDER BY 1;

   -- Aanmaken BES-catalogi en fac_imp_catalogus-tabel verrijken/aanvullen met
   -- ins_discipline_key (per cliënt) en prs_bedrijf_key (Exact).
   CURSOR c_besins
   IS
        SELECT DISTINCT prs_perslid_oslogin, prs_perslid_naam
          FROM fac_imp_perslid
      ORDER BY 1;
BEGIN
   v_errormsg := 'Fout bepalen verschil';

   -- Bepaal aantal actieve cliënten in FACILITOR  na  import!
   SELECT COUNT (DISTINCT prs_perslid_oslogin)
     INTO v_count_prs_import
     FROM fac_imp_perslid
    WHERE prs_perslid_oslogin IS NOT NULL;

   -- Bepaal aantal actieve cliënten in FACILITOR voor import!
   SELECT DECODE (COUNT ( * ), 0, 1, COUNT ( * ))
     INTO v_count_prs_actual
     FROM prs_v_aanwezigperslid p, prs_afdeling a
    WHERE p.prs_srtperslid_key = c_client_fkey                       -- Cliënt
          AND p.prs_afdeling_key = a.prs_afdeling_key
          AND a.prs_afdeling_naam = c_client_anaam;

   IF (TRUNC ( (v_count_prs_import / v_count_prs_actual) * 100) < (100 - c_max_delta_percentage))
   THEN
      fac.imp_writelog (
         p_import_key,
         'E',
         'Verschil tussen huidig aantal en te importeren aantal cliënten te groot!',
            '- max. verschilpercentage = [' || TO_CHAR (c_max_delta_percentage) || '%]'
         || CHR (13) || CHR (10)
         || '- #cliënten/import = [' || TO_CHAR (v_count_prs_import) || ']'
         || CHR (13) || CHR (10)
         || '- #cliënten/huidig = [' || TO_CHAR (v_count_prs_actual) || ']');
      RETURN;
   END IF;

   v_errormsg := 'Fout toevoegen cliënten';

   -- Generieke update (op loginnaam).
   prs.update_perslid (p_import_key, 'LOGIN', NULL);

   v_errormsg := 'Fout afnemen _Default-groepen';

   -- Nieuwe/bestaande cliënten de '_Default'-groep afnemen!
   DELETE FROM fac_gebruikersgroep gg
         WHERE gg.fac_groep_key = c_default_gkey                   -- _Default
               AND EXISTS
                     (SELECT 1
                        FROM prs_v_aanwezigperslid p, prs_afdeling a
                       WHERE p.prs_srtperslid_key = c_client_fkey    -- Cliënt
                             AND p.prs_afdeling_key = a.prs_afdeling_key
                             AND a.prs_afdeling_naam = c_client_anaam
                             AND p.prs_perslid_key = gg.prs_perslid_key);
   COMMIT;

   v_errormsg := 'Fout verwijderen cliënten';

   -- Verwijderen cliënten niet in import!
   FOR rec IN c_prsdel
   LOOP
      prs.delete_perslid (p_import_key, rec.prs_perslid_key);
   END LOOP;

   v_errormsg := 'Fout toevoegen catalogi';

   -- Aanmaken BES-catalogi en fac_imp_catalogus-tabel verrijken/aanvullen met
   -- ins_discipline_key (per cliënt) en prs_bedrijf_key (Exact).
   -- LET OP-Catalogus-naamconventie: <perslid_naam>/<perslid_oslogin>
   FOR rec IN c_besins
   LOOP
      SELECT COUNT ( * )
        INTO v_count
        FROM ins_tab_discipline td
       WHERE td.ins_discipline_verwijder IS NULL
             AND td.ins_discipline_module = 'BES'
             AND INSTR (UPPER (td.ins_discipline_omschrijving), '/' || rec.prs_perslid_oslogin) > 0;

      IF v_count = 0
      THEN
         INSERT INTO ins_tab_discipline (ins_discipline_module,
                                         ins_discipline_omschrijving,
                                         ins_discipline_kpnverplicht,
                                         ins_discipline_btw)
             VALUES ('BES',
                     rec.prs_perslid_naam || '/' || rec.prs_perslid_oslogin,
                     2,   -- DIAN#57093: Kostenplaats niet tonen (per 2019.1)!
                     0)
          RETURNING ins_discipline_key
               INTO v_discipline_key;

         INSERT INTO bes_disc_params (bes_ins_discipline_key,
                                      bes_disc_params_auto_order,
                                      bes_disc_params_autoacceptrfo,
                                      bes_disc_params_leverdagen,
                                      bes_disc_params_module,
                                      bes_disc_params_bonotify,
                                      bes_disc_params_bestelmode,
                                      bes_disc_params_hide_cost_fe)
             VALUES (v_discipline_key, 1, 1, 0, 'BES', 0, 2, 1);
      ELSE                                       -- Exception als v_count > 1!
         SELECT td.ins_discipline_key
           INTO v_discipline_key
           FROM ins_tab_discipline td
          WHERE td.ins_discipline_verwijder IS NULL
                AND td.ins_discipline_module = 'BES'
                AND INSTR (UPPER (td.ins_discipline_omschrijving), '/' || rec.prs_perslid_oslogin) > 0;
      END IF;

      UPDATE fac_imp_catalogus
         SET ins_discipline_key = v_discipline_key,
             prs_bedrijf_key = c_exact_bkey                           -- Exact
       WHERE ins_srtgroep_omschrijving = rec.prs_perslid_oslogin;
      COMMIT;
   END LOOP;

   v_errormsg := 'Fout bijwerken catalogi';

   -- Generieke update
   fac_update_catalogus (p_import_key);

   v_errormsg := 'Fout toevoegen Cliënt-groepen';

   -- Per cliënt een 'Cliënt'-groep toevoegen (zover nog niet toegevoegd)!
   -- LET OP-Autorisatiegroep-naamconventie: <perslid_oslogin>/<perslid_naam>
   INSERT INTO fac_groep (fac_groep_omschrijving)
      SELECT SUBSTR (p.prs_perslid_oslogin || '/' || p.prs_perslid_naam, 1, 30)
        FROM prs_v_aanwezigperslid p, prs_afdeling a
       WHERE p.prs_srtperslid_key = c_client_fkey                    -- Cliënt
             AND p.prs_afdeling_key = a.prs_afdeling_key
             AND a.prs_afdeling_naam = c_client_anaam
             AND NOT EXISTS
                   (SELECT 1
                      FROM fac_groep
                     WHERE INSTR (fac_groep_upper, p.prs_perslid_oslogin || '/') > 0);
   COMMIT;

   v_errormsg := 'Fout inkleuren Cliënt-groepen';

   -- Elke 'Cliënt'-groep inkleuren met BESUSE-rechten op "eigen" catalogus en
   -- de 'CliëntBeheer'-groep BESFOF/BESBOF/BESBOR-rechten op alle catalogi!
   INSERT INTO fac_groeprechten (fac_groep_key,
                                 fac_functie_key,
                                 ins_discipline_key,
                                 fac_gebruiker_prs_level_read,
                                 fac_gebruiker_alg_level_read,
                                 fac_gebruiker_prs_level_write,
                                 fac_gebruiker_alg_level_write)
      SELECT g.fac_groep_key,
             f.fac_functie_key,
             td.ins_discipline_key,
             -1,
             -1,
             -1,
             -1
        FROM prs_v_aanwezigperslid p, prs_afdeling a, fac_groep g, fac_functie f, ins_tab_discipline td
       WHERE p.prs_srtperslid_key = c_client_fkey                    -- Cliënt
             AND p.prs_afdeling_key = a.prs_afdeling_key
             AND a.prs_afdeling_naam = c_client_anaam
             AND INSTR (g.fac_groep_upper, p.prs_perslid_oslogin || '/') > 0
             AND f.fac_functie_code = 'WEB_BESUSE'
             AND INSTR (UPPER (td.ins_discipline_omschrijving), '/' || p.prs_perslid_oslogin) > 0
             AND td.ins_discipline_module = 'BES'
             AND NOT EXISTS
                   (SELECT 1
                      FROM fac_groeprechten
                     WHERE fac_groep_key = g.fac_groep_key
                           AND fac_functie_key = f.fac_functie_key
                           AND ins_discipline_key = td.ins_discipline_key)
      UNION ALL
      SELECT c_clientbeheer_gkey,                              -- CliëntBeheer
             f.fac_functie_key,
             td.ins_discipline_key,
             -1,
             -1,
             9,
             9
        FROM prs_v_aanwezigperslid p, prs_afdeling a, fac_functie f, ins_tab_discipline td
       WHERE p.prs_srtperslid_key = c_client_fkey                    -- Cliënt
             AND p.prs_afdeling_key = a.prs_afdeling_key
             AND a.prs_afdeling_naam = c_client_anaam
             AND f.fac_functie_code IN ('WEB_BESFOF', 'WEB_BESBOF', 'WEB_BESBOR')
             AND INSTR (UPPER (td.ins_discipline_omschrijving), '/' || p.prs_perslid_oslogin) > 0
             AND td.ins_discipline_module = 'BES'
             AND NOT EXISTS
                   (SELECT 1
                      FROM fac_groeprechten
                     WHERE fac_groep_key = c_clientbeheer_gkey -- CliëntBeheer
                           AND fac_functie_key = f.fac_functie_key
                           AND ins_discipline_key = td.ins_discipline_key);
   COMMIT;

   v_errormsg := 'Fout toekennen Cliënt-groepen';

   -- Nieuwe/bestaande cliënten de *eigen* 'Cliënt'-groep toekennen (zover nog
   -- niet toegekend)!
   INSERT INTO fac_gebruikersgroep (fac_groep_key, prs_perslid_key)
      SELECT g.fac_groep_key, p.prs_perslid_key
        FROM prs_v_aanwezigperslid p, prs_afdeling a, fac_groep g
       WHERE p.prs_srtperslid_key = c_client_fkey                    -- Cliënt
             AND p.prs_afdeling_key = a.prs_afdeling_key
             AND a.prs_afdeling_naam = c_client_anaam
             AND INSTR (fac_groep_upper, p.prs_perslid_oslogin || '/') > 0
             AND NOT EXISTS
                   (SELECT 1
                      FROM fac_gebruikersgroep
                     WHERE prs_perslid_key = p.prs_perslid_key
                           AND fac_groep_key = g.fac_groep_key);
   COMMIT;
EXCEPTION
   WHEN OTHERS
   THEN
      oracle_err_num := SQLCODE;
      oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
      v_errormsg := v_errormsg || ' ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ') ';
      fac.imp_writelog (p_import_key, 'E', v_errormsg, 'Updateproces BES-catalogi afgebroken!');
      COMMIT;
END dian_update_exact;
/

/*
DELETE FROM bes_srtdeel;
DELETE FROM bes_srtgroep;
DELETE FROM bes_disc_params;
DELETE FROM ins_tab_discipline td WHERE TD.INS_DISCIPLINE_MODULE = 'BES';
*/

-- DIAN#55593: RTMs
CREATE OR REPLACE VIEW DIAN_V_GRAPH_MLD_NEW (FCLT_XAS_, FCLT_YAS_)
AS
   SELECT SUM (nietnieuw) aantal, COUNT (mld_key) totaal
     FROM (SELECT mld_melding_key mld_key,
                  DECODE (mld_melding_status,
                          0, 0,                                     -- Pending
                          2, 0,                                   -- Ingevoerd
                          3, 0,                                    -- Ingezien
                          1)
                     nietnieuw
             FROM mld_melding
            WHERE mld_melding_status IN (2, 3, 4, 7, 0) -- 2-Ingevoerd, 3-Ingezien, 4-Geaccepteerd, 7-Uitgegeven, 0-Pending
                                                         );

CREATE OR REPLACE VIEW DIAN_V_GRAPH_MLD_ACP (FCLT_XAS_, FCLT_YAS_)
AS
   SELECT SUM (nogoptijd) aantal, COUNT (mld_key) totaal
     FROM (SELECT mld_melding_key mld_key,
                  DECODE (SIGN (mld_melding_acceptdatum_std - TRUNC (COALESCE (fac.gettrackingdate ('MLDACP', mld_melding_key), SYSDATE), 'mi')),
                          -1, 0,
                          1)
                     nogoptijd
             FROM mld_melding
            WHERE mld_melding_status IN (2, 3, 4, 7, 0) -- 2-Ingevoerd, 3-Ingezien, 4-Geaccepteerd, 7-Uitgegeven, 0-Pending
                                                         );

CREATE OR REPLACE VIEW DIAN_V_GRAPH_MLD_AFM (FCLT_XAS_, FCLT_YAS_)
AS
   SELECT SUM (nogoptijd) aantal, COUNT (mld_key) totaal
     FROM (SELECT mld_melding_key mld_key,
                  DECODE (SIGN (GREATEST (mld_melding_einddatum, mld_melding_einddatum_std) - TRUNC (SYSDATE, 'mi')),
                          -1, 0,
                          1)
                     nogoptijd
             FROM mld_melding
            WHERE mld_melding_status IN (2, 3, 4, 7, 0) -- 2-Ingevoerd, 3-Ingezien, 4-Geaccepteerd, 7-Uitgegeven, 0-Pending
                                                         );

CREATE OR REPLACE VIEW DIAN_V_GRAPH_BHNDLR_OPEN
(
   FCLT_XAS_,
   FCLT_YAS_,
   FCLT_YAS2_,
   VOLGORDE
)
AS
     SELECT COALESCE (prs_perslid_naam_full, '<Onbekend>'),
            SUM (nogoptijd),
            COUNT ( * ) - SUM (nogoptijd),
            0 - COUNT ( * )
       FROM (SELECT p.prs_perslid_naam_full,
                    DECODE (SIGN (GREATEST (mld_melding_einddatum, mld_melding_einddatum_std) - TRUNC (SYSDATE, 'mi')),
                            -1, 0,
                            1)
                       nogoptijd
               FROM mld_melding m, prs_v_perslid_fullnames_all p
              WHERE m.mld_melding_status IN (2, 3, 4, 7, 0) -- 2-Ingevoerd, 3-Ingezien, 4-Geaccepteerd, 7-Uitgegeven, 0-Pending
                    AND m.mld_melding_behandelaar_key = p.prs_perslid_key)
   GROUP BY prs_perslid_naam_full
   UNION ALL        -- Extra kolom zodat voorgaande kolommen helemaal getoond?
   SELECT ' ', 0, 0, 0 FROM DUAL;

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

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

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