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

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 svrz_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);


/* Formatted on 5-5-2014 13:12:24 (QP5 v5.136.908.31019) */
CREATE OR REPLACE PROCEDURE svrz_import_perslid (p_import_key IN NUMBER)
AS
   v_errormsg       VARCHAR2 (1000) := '-';
   v_errorhint      VARCHAR2 (1000) := '-';
   oracle_err_num   NUMBER;
   oracle_err_mes   VARCHAR2 (200);
BEGIN
   v_errorhint := 'Generieke import';

   -- De sequence array staat beschreven in PRS_PAC.SRC bij de import_perslid-PROCEDURE.
   prs.import_perslid (
      p_import_key,
         '0;0;0;0;0;0;7;2;3;5;'
      || '4;0;0;0;0;15;16;17;0;1;'
      || '8;18;19;6;0;0;20;21;0;0;'
      || '0;0;0;0;0;0;0;0;0;0;'
      || '0;0;0;0;0;0',
      'personeelsnummer;achternaam;tussenvoegsel;voorletters;voornaam;titel_aanhef;afdelingscode;functie;locatiecode;gebouwcode;bouwlaagvolgnummer;ruimtenummer;werkplekvolgnummer;omschrijving;telefoonnummer;mobiel;email;loginnaam;password;indienstdatum;uitdienstdatum%');
   COMMIT;

   v_errorhint := 'Bepalen stamplaats';

   -- Klantspecifieke aanpassingen.
   -- Locatie/Gebouw/Verdieping/Ruimte bepalen via Afd.code-kolom -> Eigen tabel (key=101) ->
   -- Locatiecode en daaronder de alfabetisch eerste Fictieve ruimte!
   -- 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
   -- naar de bepaalde Ruimte op import-locatie!
   -- Eventuele WPs onder andere vestigingen dan import-vestiging blijven ook ongewijzigd!
   UPDATE fac_imp_perslid i
      SET i.alg_locatie_code =
             (SELECT il.alg_locatie_code
                FROM fac_v_aanwezigusrdata ud, -- Mapping BO4-Afdelingscode -> Locatiecode
                     alg_v_aanweziglocatie il
               WHERE ud.fac_usrtab_key = 101           -- MappingOrg2Loc-tabel
                     AND ud.fac_usrdata_upper = UPPER (i.prs_afdeling_naam)
                     AND UPPER (ud.fac_usrdata_omschr) = UPPER (il.alg_locatie_code)),
          i.alg_gebouw_code =
             (SELECT g1.alg_gebouw_code
                     FROM fac_v_aanwezigusrdata ud, -- Mapping BO4-Afdelingscode -> Locatiecode
                          alg_v_aanweziglocatie l1,
                          alg_v_aanweziggebouw g1,
                          alg_v_aanwezigverdieping v1,
                          alg_v_aanwezigruimte r1
                    WHERE ud.fac_usrtab_key = 101      -- MappingOrg2Loc-tabel
                          AND ud.fac_usrdata_upper = UPPER (i.prs_afdeling_naam)
                          AND UPPER (ud.fac_usrdata_omschr) = UPPER (l1.alg_locatie_code)
                          AND l1.alg_locatie_key = g1.alg_locatie_key
                          AND g1.alg_gebouw_key = v1.alg_gebouw_key
                          AND v1.alg_verdieping_key = r1.alg_verdieping_key
                          AND r1.alg_srtruimte_key = 101    -- Fictieve ruimte
                          AND NOT EXISTS
                                (SELECT 1
                                   FROM alg_v_aanwezigruimte r2,
                                        alg_verdieping v2,
                                        alg_gebouw g2
                                  WHERE r2.alg_srtruimte_key = 101 -- Fictieve ruimte
                                        AND r2.alg_verdieping_key = v2.alg_verdieping_key
                                        AND v2.alg_gebouw_key = g2.alg_gebouw_key
                                        AND g2.alg_gebouw_code || v2.alg_verdieping_code || r2.alg_ruimte_nr <
                                              g1.alg_gebouw_code || v1.alg_verdieping_code || r1.alg_ruimte_nr
                                        AND g2.alg_locatie_key = g1.alg_locatie_key)),
          i.alg_verdieping_volgnr =
             (SELECT v1.alg_verdieping_volgnr
                     FROM fac_v_aanwezigusrdata ud, -- Mapping BO4-Afdelingscode -> Locatiecode
                          alg_v_aanweziglocatie l1,
                          alg_v_aanweziggebouw g1,
                          alg_v_aanwezigverdieping v1,
                          alg_v_aanwezigruimte r1
                    WHERE ud.fac_usrtab_key = 101      -- MappingOrg2Loc-tabel
                          AND ud.fac_usrdata_upper = UPPER (i.prs_afdeling_naam)
                          AND UPPER (ud.fac_usrdata_omschr) = UPPER (l1.alg_locatie_code)
                          AND l1.alg_locatie_key = g1.alg_locatie_key
                          AND g1.alg_gebouw_key = v1.alg_gebouw_key
                          AND v1.alg_verdieping_key = r1.alg_verdieping_key
                          AND r1.alg_srtruimte_key = 101    -- Fictieve ruimte
                          AND NOT EXISTS
                                (SELECT 1
                                   FROM alg_v_aanwezigruimte r2,
                                        alg_verdieping v2,
                                        alg_gebouw g2
                                  WHERE r2.alg_srtruimte_key = 101 -- Fictieve ruimte
                                        AND r2.alg_verdieping_key = v2.alg_verdieping_key
                                        AND v2.alg_gebouw_key = g2.alg_gebouw_key
                                        AND g2.alg_gebouw_code || v2.alg_verdieping_code || r2.alg_ruimte_nr <
                                              g1.alg_gebouw_code || v1.alg_verdieping_code || r1.alg_ruimte_nr
                                        AND g2.alg_locatie_key = g1.alg_locatie_key)),
          i.alg_ruimte_nr =
             (SELECT r1.alg_ruimte_nr
                     FROM fac_v_aanwezigusrdata ud, -- Mapping BO4-Afdelingscode -> Locatiecode
                          alg_v_aanweziglocatie l1,
                          alg_v_aanweziggebouw g1,
                          alg_v_aanwezigverdieping v1,
                          alg_v_aanwezigruimte r1
                    WHERE ud.fac_usrtab_key = 101      -- MappingOrg2Loc-tabel
                          AND ud.fac_usrdata_upper = UPPER (i.prs_afdeling_naam)
                          AND UPPER (ud.fac_usrdata_omschr) = UPPER (l1.alg_locatie_code)
                          AND l1.alg_locatie_key = g1.alg_locatie_key
                          AND g1.alg_gebouw_key = v1.alg_gebouw_key
                          AND v1.alg_verdieping_key = r1.alg_verdieping_key
                          AND r1.alg_srtruimte_key = 101    -- Fictieve ruimte
                          AND NOT EXISTS
                                (SELECT 1
                                   FROM alg_v_aanwezigruimte r2,
                                        alg_verdieping v2,
                                        alg_gebouw g2
                                  WHERE r2.alg_srtruimte_key = 101 -- Fictieve ruimte
                                        AND r2.alg_verdieping_key = v2.alg_verdieping_key
                                        AND v2.alg_gebouw_key = g2.alg_gebouw_key
                                        AND g2.alg_gebouw_code || v2.alg_verdieping_code || r2.alg_ruimte_nr <
                                              g1.alg_gebouw_code || v1.alg_verdieping_code || r1.alg_ruimte_nr
                                        AND g2.alg_locatie_key = g1.alg_locatie_key))
    WHERE NOT EXISTS                                -- Nog geen WP op Locatie!
             (SELECT 1
                FROM fac_v_aanwezigusrdata ud, -- Mapping BO4-Afdelingscode -> Locatiecode
                     alg_v_aanweziglocatie il,
                     prs_v_aanwezigperslid p,
                     prs_perslidwerkplek pw,
                     prs_werkplek cw,
                     alg_v_aanwezigruimte cr,
                     alg_verdieping cv,
                     alg_gebouw cg,
                     alg_locatie cl
               WHERE ud.fac_usrtab_key = 101           -- MappingOrg2Loc-tabel
                     AND ud.fac_usrdata_upper = UPPER (i.prs_afdeling_naam)
                     AND UPPER (ud.fac_usrdata_omschr) = UPPER (il.alg_locatie_code)
                     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 || v_errorhint, 'Inleesproces personen afgebroken!');
END svrz_import_perslid;
/

/* Formatted on 27-9-2017 15:12:48 (QP5 v5.136.908.31019) */
CREATE OR REPLACE PROCEDURE svrz_update_perslid (p_import_key IN NUMBER)
IS
   --CURSOR c_flex
   --IS
   --     SELECT p.prs_perslid_key, p.prs_perslid_nr, i.*
   --       FROM prs_v_aanwezigperslid p, fac_imp_perslid i
   --      WHERE p.prs_perslid_nr = i.prs_perslid_nr
   --   ORDER BY 2;

   -- Let op! Personen die niet meer in dienst zijn -> niet in fac_imp_perslid!
   -- Dubbele perslid_nr? Dan wordt iemand mogelijk niet verwijderd/INACTIEF!
   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 i
                       WHERE UPPER (i.prs_perslid_nr) = UPPER (p.prs_perslid_nr))
      ORDER BY 2;

   v_aanduiding     VARCHAR2 (200);
   v_errorhint      VARCHAR2 (1000);
   v_errormsg       VARCHAR2 (1000);
   oracle_err_num   NUMBER;
   oracle_err_mes   VARCHAR2 (200);
   v_count          NUMBER;
   v_count_tot      NUMBER;
   v_count_new      NUMBER;
BEGIN
   -- Generieke update.
   SELECT COUNT ( * ) INTO v_count FROM fac_imp_perslid;

   IF v_count < 1000
   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;

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

   -- Update flexvelden.
   --FOR rec IN c_flex
   --LOOP
   --   PRS.upsertkenmerk (-1, rec.prs_perslid_key, TO_CHAR (fac.safe_to_date (rec.prs_kenmerk1, 'dd-mm-yyyy'), 'dd-mm-yyyy')); -- Indienst
   --   PRS.upsertkenmerk (-1, rec.prs_perslid_key, TO_CHAR (fac.safe_to_date (rec.prs_kenmerk2, 'dd-mm-yyyy'), 'dd-mm-yyyy')); -- Uitdienst
   --END LOOP;

   -- 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;
   COMMIT;
END svrz_update_perslid;
/


/* Formatted on 16-6-2014 21:48:12 (QP5 v5.136.908.31019) */
CREATE OR REPLACE PROCEDURE svrz_import_bedrijf (p_import_key IN NUMBER)
AS
   v_errormsg       VARCHAR2 (1000) := '-';
   oracle_err_num   NUMBER;
   oracle_err_mes   VARCHAR2 (200);
BEGIN
   fac_import_ext_bedrijf (p_import_key);
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 relaties afgebroken!');
END svrz_import_bedrijf;
/

CREATE OR REPLACE PROCEDURE svrz_update_bedrijf (p_import_key IN NUMBER)
AS
   v_errormsg       VARCHAR2 (1000) := '-';
   v_errorhint      VARCHAR2 (1000) := '-';
   oracle_err_num   NUMBER;
   oracle_err_mes   VARCHAR2 (200);
   v_count          NUMBER (10);
   v_count_tot      NUMBER (10);
   v_count_new      NUMBER (10);
   v_count_upd      NUMBER (10);
   v_count_del      NUMBER (10);
   v_aanduiding     VARCHAR2 (200) := '-';

   -- SUBPROC
   PROCEDURE add_bedrijf (p_import_key IN NUMBER)
   AS
      CURSOR c1
      IS
         SELECT *
           FROM fac_imp_ext_bedrijf ib
          WHERE NOT EXISTS
                   (SELECT 1
                      FROM fac_imp_ext_bedrijf
                     WHERE UPPER (prs_bedrijf_naam) =
                              UPPER (ib.prs_bedrijf_naam)
                           AND prs_leverancier_nr < ib.prs_leverancier_nr);

      v_bedrijf_key   NUMBER (10);
   BEGIN
      v_count_tot := 0;
      v_count_new := 0;
      v_count_upd := 0;

      FOR rec IN c1
      LOOP
         BEGIN
            v_count_tot := v_count_tot + 1;
            v_aanduiding :=
                  '['
               || rec.prs_bedrijf_naam
               || '|'
               || rec.prs_leverancier_nr
               || '] ';

            v_errorhint := 'Fout bepalen bedrijf';

            IF rec.prs_leverancier_nr IS NULL
            THEN
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || 'Leveranciernummer ongedefinieerd!',
                  v_errorhint);
               COMMIT;
            ELSE
               SELECT COUNT ( * )
                 INTO v_count
                 FROM prs_v_aanwezigbedrijf
                WHERE UPPER (prs_leverancier_nr) =
                         UPPER (rec.prs_leverancier_nr);

               IF v_count = 0
               THEN
                  v_errorhint := 'Fout toevoegen bedrijf';

                  INSERT INTO prs_bedrijf (prs_bedrijf_naam,
                                           prs_leverancier_nr,
                                           prs_bedrijf_bezoek_adres,
                                           prs_bedrijf_bezoek_postcode,
                                           prs_bedrijf_bezoek_plaats,
                                           prs_bedrijf_bezoek_land,
                                           prs_bedrijf_post_adres,
                                           prs_bedrijf_post_postcode,
                                           prs_bedrijf_post_plaats,
                                           prs_bedrijf_post_land,
                                           prs_bedrijf_telefoon,
                                           prs_bedrijf_fax,
                                           prs_bedrijf_email,
                                           prs_bedrijf_contact_persoon,
                                           prs_bedrijf_contact_telefoon,
                                           prs_bedrijf_contact_fax,
                                           prs_bedrijf_leverancier,
                                           prs_bedrijf_uitvoerende,
                                           prs_bedrijf_contract,
                                           prs_bedrijf_huurder,
                                           prs_bedrijf_ingids,
                                           prs_bedrijf_uurloon,
                                           prs_overeenkomst_nr,
                                           prs_overeenkomst_datum,
                                           prs_bedrijf_opmerking)
                      VALUES (rec.prs_bedrijf_naam,
                              rec.prs_leverancier_nr,
                              rec.prs_bedrijf_bezoek_adres,
                              rec.prs_bedrijf_bezoek_postcode,
                              rec.prs_bedrijf_bezoek_plaats,
                              rec.prs_bedrijf_bezoek_land,
                              rec.prs_bedrijf_post_adres,
                              rec.prs_bedrijf_post_postcode,
                              rec.prs_bedrijf_post_plaats,
                              rec.prs_bedrijf_post_land,
                              rec.prs_bedrijf_telefoon,
                              rec.prs_bedrijf_fax,
                              rec.prs_bedrijf_email,
                              rec.prs_bedrijf_contact_persoon,
                              rec.prs_bedrijf_contact_telefoon,
                              rec.prs_bedrijf_contact_fax,
                              DECODE (rec.prs_bedrijf_leverancier,
                                      1, 1,
                                      NULL),
                              DECODE (rec.prs_bedrijf_uitvoerende,
                                      1, 1,
                                      NULL),
                              DECODE (rec.prs_bedrijf_contract, 1, 1, NULL),
                              DECODE (rec.prs_bedrijf_huurder, 1, 1, NULL),
                              DECODE (rec.prs_bedrijf_ingids, 1, 1, NULL),
                              rec.prs_bedrijf_uurloon,
                              rec.prs_overeenkomst_nr,
                              rec.prs_overeenkomst_datum,
                              rec.prs_bedrijf_opmerking);

                  v_count_new := v_count_new + 1;
               ELSE                                             -- v_count > 0
                  SELECT prs_bedrijf_key
                    INTO v_bedrijf_key
                    FROM prs_v_aanwezigbedrijf
                   WHERE UPPER (prs_leverancier_nr) =
                            UPPER (rec.prs_leverancier_nr);

                  v_errorhint := 'Fout bijwerken bedrijf';

                  UPDATE prs_bedrijf
                     SET prs_bedrijf_naam =
                            COALESCE (rec.prs_bedrijf_naam, prs_bedrijf_naam),
                         prs_bedrijf_bezoek_adres =
                            COALESCE (rec.prs_bedrijf_bezoek_adres,
                                      prs_bedrijf_bezoek_adres),
                         prs_bedrijf_bezoek_postcode =
                            COALESCE (rec.prs_bedrijf_bezoek_postcode,
                                      prs_bedrijf_bezoek_postcode),
                         prs_bedrijf_bezoek_plaats =
                            COALESCE (rec.prs_bedrijf_bezoek_plaats,
                                      prs_bedrijf_bezoek_plaats),
                         prs_bedrijf_bezoek_land =
                            COALESCE (rec.prs_bedrijf_bezoek_land,
                                      prs_bedrijf_bezoek_land),
                         prs_bedrijf_post_adres =
                            COALESCE (rec.prs_bedrijf_post_adres,
                                      prs_bedrijf_post_adres),
                         prs_bedrijf_post_postcode =
                            COALESCE (rec.prs_bedrijf_post_postcode,
                                      prs_bedrijf_post_postcode),
                         prs_bedrijf_post_plaats =
                            COALESCE (rec.prs_bedrijf_post_plaats,
                                      prs_bedrijf_post_plaats),
                         prs_bedrijf_post_land =
                            COALESCE (rec.prs_bedrijf_post_land,
                                      prs_bedrijf_post_land),
                         prs_bedrijf_telefoon =
                            COALESCE (rec.prs_bedrijf_telefoon,
                                      prs_bedrijf_telefoon),
                         prs_bedrijf_fax =
                            COALESCE (rec.prs_bedrijf_fax, prs_bedrijf_fax),
                         prs_bedrijf_email =
                            COALESCE (rec.prs_bedrijf_email,
                                      prs_bedrijf_email),
                         prs_bedrijf_contact_persoon =
                            COALESCE (rec.prs_bedrijf_contact_persoon,
                                      prs_bedrijf_contact_persoon),
                         prs_bedrijf_contact_telefoon =
                            COALESCE (rec.prs_bedrijf_contact_telefoon,
                                      prs_bedrijf_contact_telefoon),
                         prs_bedrijf_contact_fax =
                            COALESCE (rec.prs_bedrijf_contact_fax,
                                      prs_bedrijf_contact_fax),
                         prs_bedrijf_leverancier =
                            DECODE (rec.prs_bedrijf_leverancier, 1, 1, prs_bedrijf_leverancier),
                         prs_bedrijf_uitvoerende =
                            DECODE (rec.prs_bedrijf_uitvoerende, 1, 1, NULL),
                         prs_bedrijf_contract =
                            DECODE (rec.prs_bedrijf_contract, 1, 1, NULL),
                         prs_bedrijf_huurder =
                            DECODE (rec.prs_bedrijf_huurder, 1, 1, NULL),
                         prs_bedrijf_ingids =
                            DECODE (rec.prs_bedrijf_ingids, 1, 1, NULL),
                         prs_bedrijf_uurloon =
                            COALESCE (rec.prs_bedrijf_uurloon,
                                      prs_bedrijf_uurloon),
                         prs_overeenkomst_nr =
                            COALESCE (rec.prs_overeenkomst_nr,
                                      prs_overeenkomst_nr),
                         prs_overeenkomst_datum =
                            COALESCE (rec.prs_overeenkomst_datum,
                                      prs_overeenkomst_datum),
                         prs_bedrijf_opmerking =
                            COALESCE (rec.prs_bedrijf_opmerking,
                                      prs_bedrijf_opmerking)
                   WHERE prs_bedrijf_key = v_bedrijf_key;

                  v_count_upd := v_count_upd + 1;
               END IF;
            --COMMIT;
            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,
                                 'E',
                                 v_aanduiding || v_errormsg,
                                 v_errorhint);
               COMMIT;
         END;
      END LOOP;

      fac.imp_writelog (p_import_key,
                        'S',
                        'Bedrijf: #ingelezen: ' || TO_CHAR (v_count_tot),
                        '');
      fac.imp_writelog (p_import_key,
                        'S',
                        'Bedrijf: #toegevoegd: ' || TO_CHAR (v_count_new),
                        '');
      fac.imp_writelog (p_import_key,
                        'S',
                        'Bedrijf: #bijgewerkt: ' || TO_CHAR (v_count_upd),
                        '');
      COMMIT;
   END;

   -- SUBPROC
   PROCEDURE del_bedrijf (p_import_key IN NUMBER)
   AS
      CURSOR c1
      IS
         SELECT *
           FROM prs_v_aanwezigbedrijf b
          WHERE b.prs_bedrijf_intern IS NULL
                AND b.prs_leverancier_nr IS NOT NULL
                AND NOT EXISTS
                      (SELECT 1
                         FROM fac_imp_ext_bedrijf
                        WHERE prs_leverancier_nr = b.prs_leverancier_nr);

      v_bedrijf_key   NUMBER (10);
   BEGIN
      v_count_del := 0;

      FOR rec IN c1
      LOOP
         BEGIN
            v_aanduiding := '[' || rec.prs_bedrijf_naam || '] ';

            v_errorhint := 'Fout verwijderen bedrijf';

            UPDATE prs_bedrijf
               SET prs_bedrijf_verwijder = SYSDATE
             WHERE prs_bedrijf_key = rec.prs_bedrijf_key;

            v_count_del := v_count_del + 1;

            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,
                                 v_errorhint);
               COMMIT;
         END;
      END LOOP;

      fac.imp_writelog (p_import_key,
                        'S',
                        'Bedrijf: #verwijderd: ' || TO_CHAR (v_count_del),
                        '');
      COMMIT;
   END;
-- MAIN
BEGIN
   SELECT COUNT ( * ) INTO v_count FROM fac_imp_ext_bedrijf;

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

   add_bedrijf (p_import_key);
   --del_bedrijf (p_import_key);
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,
                        'Importproces relaties afgebroken!');
END svrz_update_bedrijf;
/


-- Multi variant voor automatische import via gen_import van Quarto POs.
/* Formatted on 12-11-2014 16:30:30 (QP5 v5.136.908.31019) */
CREATE OR REPLACE PROCEDURE svrz_import_quarto (p_import_key IN NUMBER)
AS
   c_delim                   VARCHAR2 (1) := ';';
   v_newline                 VARCHAR2 (1000);                    -- Input line
   v_errormsg                VARCHAR2 (1000);
   oracle_err_num            NUMBER;
   oracle_err_mes            VARCHAR2 (200);
   v_aanduiding              VARCHAR2 (200) := '';
   header_is_valid           NUMBER := 0;
   v_count_tot               NUMBER (10) := 0;
   v_count_import            NUMBER (10) := 0;
   v_ongeldig                NUMBER (1);
   -- De importvelden
   v_receiver                VARCHAR2 (255);         -- C25/prs_leverancier_nr
   v_receiverName            VARCHAR2 (255);                    -- C100/ignore
   v_customer                VARCHAR2 (255);      -- C30/prs_perslid_voornaam?
   v_customerName            VARCHAR2 (255);                    -- C100/ignore
   v_orderdatum              VARCHAR2 (255);  -- C50/bes_kenmerkbestell_waarde
   v_bestelnr                VARCHAR2 (255);  -- C50/bes_kenmerkbestell_waarde
   v_nummer                  VARCHAR2 (255);             -- C32/bes_srtdeel_nr
   v_questornummer           VARCHAR2 (255); -- C50/ignore (bes_srtdeel_opmerking?)
   v_questoromschrijving     VARCHAR2 (255);  -- C100/bes_srtdeel_omschrijving
   v_inkoopprijs             VARCHAR2 (255); --N8,2/ignore (= prijs_per_verpakking / aantal_per_verpakking)
   v_aantal                  VARCHAR2 (255); --N5/bes_bestelling(/bestelopdr)_item_aantal
   v_prijs_per_verpakking    VARCHAR2 (255);    --N8,2/bes_srtdeel_prijs_prijs
   v_aantal_per_verpakking   VARCHAR2 (255);         --N6/bes_srtdeel_veelvoud
   v_btwperc                 VARCHAR2 (255);              --N3/bes_srtdeel_btw
   v_uom                     VARCHAR2 (255);        -- C30/bes_srtdeel_eenheid

   -- Overige velden:
   CURSOR c1
   IS
        SELECT *
          FROM fac_imp_file
         WHERE fac_import_key = p_import_key
      ORDER BY fac_imp_file_index;
BEGIN
   --DELETE FROM svrz_imp_quartomulti q
   --      WHERE q.imp_log_run <> p_import_key
   --            OR EXISTS (SELECT 1
   --                         FROM fac_imp_file
   --                        WHERE SUBSTR (fac_imp_file_line,
   --                                        INSTR (fac_imp_file_line, ';', 1, 5)
   --                                      + 1,
   --                                        INSTR (fac_imp_file_line, ';', 1, 6)
   --                                      - INSTR (fac_imp_file_line, ';', 1, 5)
   --                                      - 1) = q.bestelnr);
   DELETE FROM svrz_imp_quartomulti
         WHERE imp_log_run <> p_import_key;
   COMMIT;

   FOR rec1 IN c1
   LOOP
      BEGIN
         v_newline := rec1.fac_imp_file_line;
         v_errormsg := 'Fout bij opvragen importregel';
         v_aanduiding := '';
         v_ongeldig := 0;

         -- Lees alle veldwaarden
         -- receiver;receiverName;customer;customerName;orderdatum;bestelnr;nummer;questornummer;questoromschrijving;inkoopprijs;aantal;prijs_per_verpakking;aantal_per_verpakking;btwperc;uom
         fac.imp_getfield (v_newline, c_delim, v_receiver);
         fac.imp_getfield (v_newline, c_delim, v_receiverName);
         fac.imp_getfield (v_newline, c_delim, v_customer);
         fac.imp_getfield (v_newline, c_delim, v_customerName);
         fac.imp_getfield (v_newline, c_delim, v_orderdatum);
         fac.imp_getfield (v_newline, c_delim, v_bestelnr);
         fac.imp_getfield (v_newline, c_delim, v_nummer);
         fac.imp_getfield (v_newline, c_delim, v_questornummer);
         fac.imp_getfield (v_newline, c_delim, v_questoromschrijving);
         fac.imp_getfield (v_newline, c_delim, v_inkoopprijs);
         fac.imp_getfield (v_newline, c_delim, v_aantal);
         fac.imp_getfield (v_newline, c_delim, v_prijs_per_verpakking);
         fac.imp_getfield (v_newline, c_delim, v_aantal_per_verpakking);
         fac.imp_getfield (v_newline, c_delim, v_btwperc);
         fac.imp_getfield (v_newline, c_delim, v_uom);
         v_aanduiding :=
               '['
            || v_receiver
            || '|'
            || v_customer
            || '|'
            || v_orderdatum
            || '|'
            || v_bestelnr
            || '|'
            || v_nummer
            || '] ';

         -- Ik controleer of ik een geldige header heb, dat is: in de juiste kolommen
         -- de juiste kolomkop. Ik controleer daarbij ALLE kolommen!
         -- Ik negeer alles totdat ik een geldige header ben gepasseerd.
         IF header_is_valid = 0
         THEN
            IF     UPPER (TRIM (v_receiver)) = 'RECEIVER'
               AND UPPER (TRIM (v_receiverName)) = 'RECEIVERNAME'
               AND UPPER (TRIM (v_customer)) = 'CUSTOMER'
               AND UPPER (TRIM (v_customerName)) = 'CUSTOMERNAME'
               AND UPPER (TRIM (v_orderdatum)) = 'ORDERDATUM'
               AND UPPER (TRIM (v_bestelnr)) = 'BESTELNR'
               AND UPPER (TRIM (v_nummer)) = 'NUMMER'
               AND UPPER (TRIM (v_questornummer)) = 'QUESTORNUMMER'
               AND UPPER (TRIM (v_questoromschrijving)) = 'QUESTOROMSCHRIJVING'
               AND UPPER (TRIM (v_inkoopprijs)) = 'INKOOPPRIJS'
               AND UPPER (TRIM (v_aantal)) = 'AANTAL'
               AND UPPER (TRIM (v_prijs_per_verpakking)) = 'PRIJS_PER_VERPAKKING'
               AND UPPER (TRIM (v_aantal_per_verpakking)) = 'AANTAL_PER_VERPAKKING'
               AND UPPER (TRIM (v_btwperc)) = 'BTWPERC'
               AND UPPER (TRIM (v_uom)) = 'UOM'
            THEN
               header_is_valid := 1;
            END IF;
         ELSE
            v_count_tot := v_count_tot + 1;
            -- Controleer alle veldwaarden
            v_errormsg := 'Receiver ongeldig/ongedefinieerd of te lang';
            v_receiver := TRIM (v_receiver);

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

            --
            v_errormsg := 'ReceiverName ongeldig/ongedefinieerd of te lang';
            v_receiverName := TRIM (v_receiverName);

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

            --
            v_errormsg := 'Customer ongeldig/ongedefinieerd of te lang';
            v_customer := TRIM (v_customer);

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

            -- Don't care
            v_errormsg := 'CustomerName ongeldig';
            v_customerName := TRIM (v_customerName);

            --
            v_errormsg := 'Orderdatum ongeldig';
            v_orderdatum := TRIM (v_orderdatum);

            IF fac.safe_to_date (v_orderdatum, 'yyyymmdd hh24:mi:ss') IS NULL
            THEN
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || v_errormsg,
                                 'Orderdatum wordt genegeerd!');
            END IF;

            --
            v_errormsg := 'Bestelnr ongeldig/ongedefinieerd of te lang';
            v_bestelnr := TRIM (v_bestelnr);

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

            --
            v_errormsg := 'Artikelnummer ongeldig/ongedefinieerd of te lang';
            v_nummer := TRIM (v_nummer);

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

            -- Don't care
            v_errormsg := 'Questornummer ongeldig';
            v_questornummer := TRIM (v_questornummer);

            --
            v_errormsg := 'Artikelomschrijving ongeldig/ongedefinieerd';
            v_questoromschrijving := TRIM (v_questoromschrijving);

            IF v_questoromschrijving IS NULL
            THEN
               v_ongeldig := 1;
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || v_errormsg,
                                 'Regel wordt overgeslagen!');
            END IF;

            --
            v_errormsg := 'Inkoopprijs ongeldig';
            v_inkoopprijs := REPLACE (v_inkoopprijs, ',', '.');

            IF fac.safe_to_number (v_inkoopprijs) IS NULL
            THEN
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || v_errormsg,
                                 'Inkoopprijs wordt genegeerd!');
            END IF;

            --
            v_errormsg := 'Aantal ongeldig';
            v_aantal := REPLACE (v_aantal, ',', '.');

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

            --
            v_errormsg := 'PrijsPerVerpakking ongeldig';
            v_prijs_per_verpakking := REPLACE (v_prijs_per_verpakking, ',', '.');

            IF fac.safe_to_number (v_prijs_per_verpakking) IS NULL
            THEN
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || v_errormsg,
                                 'PrijsPerVerpakking wordt genegeerd!');
            END IF;

            --
            v_errormsg := 'AantalPerVerpakking ongeldig';
            v_aantal_per_verpakking := REPLACE (v_aantal_per_verpakking, ',', '.');

            IF fac.safe_to_number (v_aantal_per_verpakking) IS NULL
            THEN
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || v_errormsg,
                                 'AantalPerVerpakking wordt genegeerd!');
            END IF;

            --
            v_errormsg := 'BTW-percentage ongeldig';
            v_btwperc := REPLACE (v_btwperc, ',', '.');

            IF fac.safe_to_number (v_btwperc) IS NULL
            THEN
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || v_errormsg,
                                 'BTW-percentage wordt genegeerd!');
            END IF;


            -- Don't care
            v_errormsg := 'Eenheid ongeldig';
            v_uom := TRIM (v_uom);

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

                  INSERT INTO svrz_imp_quartomulti (imp_log_run,
                                                    receiver,
                                                    receiverName,
                                                    customer,
                                                    customerName,
                                                    orderdatum,
                                                    bestelnr,
                                                    nummer,
                                                    questornummer,
                                                    questoromschrijving,
                                                    inkoopprijs,
                                                    aantal,
                                                    prijs_per_verpakking,
                                                    aantal_per_verpakking,
                                                    btwperc,
                                                    uom)
                      VALUES (p_import_key,
                              SUBSTR (v_receiver, 1, 25),
                              SUBSTR (v_receiverName, 1, 100),
                              SUBSTR (v_customer, 1, 30),
                              SUBSTR (v_customerName, 1, 100),
                              fac.safe_to_date (v_orderdatum,
                                                'yyyymmdd hh24:mi:ss'),
                              SUBSTR (v_bestelnr, 1, 50),
                              SUBSTR (v_nummer, 1, 32),
                              SUBSTR (v_questornummer, 1, 50),
                              SUBSTR (v_questoromschrijving, 1, 100),
                              fac.safe_to_number (v_inkoopprijs),
                              fac.safe_to_number (v_aantal),
                              fac.safe_to_number (v_prijs_per_verpakking),
                              fac.safe_to_number (v_aantal_per_verpakking),
                              fac.safe_to_number (v_btwperc),
                              SUBSTR (v_uom, 1, 30));

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

   DELETE FROM fac_imp_file
         WHERE fac_import_key = p_import_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_aanduiding || v_errormsg,
                        'Inleesproces Quarto afgebroken!');
END;
/

/* Formatted on 11-5-2015 15:12:48 (QP5 v5.136.908.31019) */
CREATE OR REPLACE PROCEDURE svrz_update_quarto (p_import_key IN NUMBER)
AS
   -- Cursor loopt - op bestelnr! - over alle nieuw ingelezen Quarto POs.
   CURSOR c1
   IS
        SELECT x.receiver,
               x.receiverName,
               b.lev_key,
               b.aantal lev_aant,
               d.cat_key,
               d.aantal cat_aant,
               x.customer,
               x.customerName,
               p.prs_key,
               p.afl_key,
               p.aantal prs_aant,
               k.bes_kenmerk_key,
               TO_CHAR (x.orderdatum, 'dd-mm-yyyy') orderdatum,
               x.bestelnr
          FROM (SELECT DISTINCT receiver, receiverName, customer, customerName, orderdatum, bestelnr
                  FROM svrz_imp_quartomulti
                 WHERE imp_log_run = p_import_key) x
               LEFT JOIN (  SELECT TRIM (prs_bedrijf_naam_upper) lev_id_upper,
                                   MAX (prs_bedrijf_key) lev_key,
                                   COUNT ( * ) aantal
                              FROM prs_v_aanwezigbedrijf
                          GROUP BY TRIM (prs_bedrijf_naam_upper)) b
                  ON UPPER (x.receiverName) = b.lev_id_upper
               LEFT JOIN (  SELECT UPPER(TRIM(SUBSTR (ins_discipline_omschrijving, 3))) cat_id_upper,
                                   MAX (ins_discipline_key) cat_key,
                                   COUNT ( * ) aantal
                              FROM bes_discipline
                             WHERE ins_discipline_verwijder IS NULL
                          GROUP BY UPPER(TRIM(SUBSTR (ins_discipline_omschrijving, 3)))) d
                  ON UPPER (SUBSTR (x.receiverName, 1, 28)) = d.cat_id_upper
               LEFT JOIN (  SELECT UPPER (TRIM (prs_perslid_voornaam)) prs_id_upper,
                                   MAX (prs_perslid_key) prs_key,
                                   MAX (mld_adres_key) afl_key,
                                   COUNT ( * ) aantal
                              FROM prs_v_aanwezigperslid
                          GROUP BY UPPER (TRIM (prs_perslid_voornaam))) p
                  ON UPPER (x.customer) = p.prs_id_upper
               LEFT JOIN (SELECT bes_srtinstallatie_key, bes_kenmerk_key
                            FROM bes_kenmerk
                           WHERE     bes_kenmerk_verwijder IS NULL
                                 AND bes_srtkenmerk_key = 1 -- Opmerking intern
                                 AND bes_kenmerk_niveau = 'D') k
                  ON UPPER (d.cat_key) = k.bes_srtinstallatie_key
      ORDER BY bestelnr;

   c_grp_oms        VARCHAR2 (200) := 'Onbekend';
   v_errormsg       VARCHAR2 (1000);
   oracle_err_num   NUMBER;
   oracle_err_mes   VARCHAR2 (200);
   v_aanduiding     VARCHAR2 (200);
   v_count_tot      NUMBER (10) := 0;
   v_count_new      NUMBER (10) := 0;
   v_count          NUMBER;
   v_autoaccept     bes_disc_params.bes_disc_params_autoacceptrfo%TYPE;
   v_auto_order     bes_disc_params.bes_disc_params_auto_order%TYPE;
   v_leverdagen     bes_disc_params.bes_disc_params_leverdagen%TYPE;
   v_kpn_key        prs_kostenplaats.prs_kostenplaats_key%TYPE;
   v_bes_key        bes_bestelling.bes_bestelling_key%TYPE;
BEGIN
   -- Loop over alle nieuw ingelezen Quarto POs.
   FOR po IN c1
   LOOP
      BEGIN
         v_aanduiding :=
               '['
            || po.receiverName
            || '|'
            || po.customer
            || '|'
            || po.orderdatum
            || '|'
            || po.bestelnr
            || '] ';
         v_count_tot := v_count_tot + 1;

         -- Valideer dat configuratie 1-duidig is!
         v_errormsg := 'Fout controleren configuratie.';

         IF     po.lev_aant = 1
            AND po.cat_aant = 1
            AND po.prs_aant = 1
            AND po.bes_kenmerk_key IS NOT NULL
         THEN
            v_errormsg := 'Fout bepalen catalogus.';

            SELECT bes_disc_params_autoacceptrfo,
                   bes_disc_params_auto_order,
                   bes_disc_params_leverdagen
              INTO v_autoaccept, v_auto_order, v_leverdagen
              FROM bes_disc_params
             WHERE bes_ins_discipline_key = po.cat_key;

            v_errormsg := 'Fout bepalen kostenplaats.';

            SELECT a.prs_kostenplaats_key
              INTO v_kpn_key
              FROM prs_perslid p, prs_afdeling a
             WHERE p.prs_perslid_key = po.prs_key
                   AND p.prs_afdeling_key = a.prs_afdeling_key;

            v_errormsg := 'Fout controleren Quarto-bestelnr.';

            SELECT COUNT ( * )
              INTO v_count
              FROM bes_kenmerkbestell bk, bes_kenmerk k
             WHERE     bk.bes_kenmerk_key = k.bes_kenmerk_key
                   AND k.bes_srtkenmerk_key = 1            -- Opmerking intern
                   AND INSTR (bk.bes_kenmerkbestell_waarde, po.bestelnr) > 0 ;

            IF v_count = 0
            THEN
               v_errormsg := 'Fout toevoegen bestelling.';

               INSERT INTO bes_bestelling (prs_perslid_key,
                                           prs_perslid_key_voor,
                                           prs_kostenplaats_key,
                                           bes_bestelling_leverdatum,
                                           mld_adres_key_lev,
                                           bes_bestelling_plaats,
                                           bes_bestelling_module,
                                           bes_bestelling_levkosten,
                                           bes_bestelling_korting)
                   VALUES (po.prs_key,
                           po.prs_key,
                           v_kpn_key,
                           TRUNC(fac.datumtijdplusuitvoertijd (SYSDATE,
                                                               v_leverdagen,
                                                               'DAGEN')),
                           po.afl_key,
                           NULL,
                           'BES',
                           0,
                           0)
                RETURNING bes_bestelling_key
                     INTO v_bes_key;

               -- Vul 'Opmerking intern'-kenmerkveld met bestelnr (orderdatum)
               -- uit Quarto!
               v_errormsg := 'Fout toevoegen kenmerk.';

               INSERT INTO bes_kenmerkbestell (bes_bestelling_key,
                                               bes_kenmerk_key,
                                               bes_kenmerkbestell_waarde)
                   VALUES (v_bes_key,
                           po.bes_kenmerk_key,
                              'Quarto-bestelnr: '
                           || po.bestelnr
                           || ' ('
                           || po.orderdatum
                           || ')');

               -- Loop over alle orderitems per Quarto PO.
               FOR item
                  IN (  SELECT nummer,
                               questornummer,
                               questoromschrijving,
                               inkoopprijs,
                               aantal,
                               prijs_per_verpakking,
                               aantal_per_verpakking,
                               btwperc,
                               uom
                          FROM svrz_imp_quartomulti
                         WHERE imp_log_run = p_import_key
                               AND bestelnr = po.bestelnr
                      ORDER BY nummer)
               LOOP
                  BEGIN
                     v_errormsg := 'Fout toevoegen artikel.';

                     bes.upsert_srtdeel (po.cat_key,     -- ins_discipline_key
                                         c_grp_oms, -- bes_srtgroep_omschrijving
                                         item.questoromschrijving,
                                         item.prijs_per_verpakking,
                                         item.btwperc,
                                         item.uom,
                                         item.nummer,
                                         po.lev_key,
                                         NULL,                  -- Vervaldatum
                                         '',                          -- Image
                                         item.aantal_per_verpakking,
                                         '');                     -- Opmerking

                     v_errormsg := 'Fout toevoegen bestelling-item.';

                     INSERT INTO bes_bestelling_item (bes_bestelling_key,
                                                      bes_srtdeel_key,
                                                      bes_bestelling_item_aantal,
                                                      bes_bestelling_item_brutoprijs,
                                                      bes_bestelling_item_inkprijs,
                                                      bes_bestelling_item_prijs)
                          SELECT v_bes_key,
                                 sd.bes_srtdeel_key,
                                 item.aantal,
                                 bes.getsrtdeelprijs (sd.bes_srtdeel_key, NULL),
                                 bes.getsrtdeelinkprijs (sd.bes_srtdeel_key, NULL),
                                 item.prijs_per_verpakking
                            FROM bes_srtdeel sd, bes_srtgroep sg
                           WHERE     sg.ins_discipline_key = po.cat_key
                                 AND sg.bes_srtgroep_omschrijving = c_grp_oms
                                 AND sg.bes_srtgroep_key = sd.bes_srtgroep_key
                                 AND sd.bes_srtdeel_nr = item.nummer
                                 AND sd.bes_srtdeel_omschrijving = item.questoromschrijving
                                 AND sd.bes_srtdeel_btw = item.btwperc
                                 AND sd.bes_srtdeel_eenheid = item.uom
                                 AND sd.bes_srtdeel_veelvoud = item.aantal_per_verpakking
                        ORDER BY sd.bes_srtdeel_key DESC;

                     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,
                                          'ITEM-loop');
                  END;
               END LOOP;


               fac.trackaction ('BESNEW',
                                v_bes_key,
                                po.prs_key,
                                NULL,
                                NULL);
               bes.setbestellingstatus (v_bes_key, po.prs_key, po.prs_key);

               IF v_auto_order = 1
               THEN
                  bes.makeOrders (po.prs_key, v_bes_key);
               END IF;

               COMMIT;
               v_count_new := v_count_new + 1;
            ELSE
               fac.imp_writelog (p_import_key,
                                 'E',
                                 v_aanduiding || v_errormsg,
                                 'Quarto-bestelnr bestaat al');
            END IF;
         ELSE
            fac.imp_writelog (p_import_key,
                              'E',
                              v_aanduiding || v_errormsg,
                              'Inrichtingsfout');
         END IF;
      EXCEPTION
         WHEN OTHERS
         THEN
            oracle_err_num := SQLCODE;
            oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
            v_errormsg :=
                  v_errormsg
               || ' ORACLE (error '
               || oracle_err_num
               || '/'
               || oracle_err_mes
               || ')';
            fac.imp_writelog (p_import_key,
                              'E',
                              v_aanduiding || v_errormsg,
                              'PO-loop');
      END;
   END LOOP;

   fac.imp_writelog (p_import_key,
                     'S',
                     'POs/#ingelezen: ' || TO_CHAR (v_count_tot),
                     '');
   fac.imp_writelog (p_import_key,
                     'S',
                     'POs/#toegevoegd: ' || TO_CHAR (v_count_new),
                     '');
   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,
                        'Importproces Quarto afgebroken!');
END;
/

/* Formatted on 30-3-2015 23:36:24 (QP5 v5.136.908.31019) */
CREATE OR REPLACE VIEW svrz_v_export_nachtwerk
(
   RESULT,
   result_order
)
AS
   SELECT    'CALL GENEREER1BESOPDRPDF.BAT '
          || TO_CHAR (bo.bes_bestelopdr_key)
          || ' PUR-C1'
          || REPLACE (
                SUBSTR ('0000000' || bo.bes_bestelopdr_id,
                        INSTR ('0000000' || bo.bes_bestelopdr_id, '/') - 6),
                '/',
                '-'),
          bes_bestelopdr_key
     FROM bes_bestelopdr bo, fac_tracking t
    WHERE     bo.bes_bestelopdr_status = 4                    -- In bestelling
          AND bo.bes_bestelopdr_key = t.fac_tracking_refkey
          AND t.fac_srtnotificatie_key = 142                         -- BES2SN
          AND TRUNC (t.fac_tracking_datum) = TRUNC (SYSDATE - 1)
   UNION ALL
   SELECT    'CALL GENEREER1MLDOPDRPDF.BAT '
          || TO_CHAR (o.mld_opdr_key)
          || ' PUR-N1'
          || SUBSTR ('0000000' || TO_CHAR (o.mld_melding_key), -6)
          || '-'
          || TO_CHAR (o.mld_opdr_bedrijfopdr_volgnr),
          mld_opdr_key
     FROM mld_opdr o, fac_tracking t
    WHERE     o.mld_statusopdr_key = 5                           -- Uitgegeven
          AND o.mld_opdr_key = t.fac_tracking_refkey
          AND t.fac_srtnotificatie_key = 91                          -- ORDSNT
          AND TRUNC (t.fac_tracking_datum) = TRUNC (SYSDATE - 1);

-- Dummy export NACHTWERK!
CREATE OR REPLACE PROCEDURE svrz_select_nachtwerk (p_applname   IN VARCHAR2,
                                                   p_applrun    IN VARCHAR2)
AS
   c_lev_cond_srtk   NUMBER (10) := 81;
   v_errormsg        VARCHAR2 (1000);
   oracle_err_num    NUMBER;
   oracle_err_mes    VARCHAR2 (200);

   -- Cursor loopt over alle bestelopdracht-items met status 'In bestelling';
   -- deze worden verondersteld te zijn geleverd na 'leverdagen'+'notidagen'!
   CURSOR cboi
   IS
      SELECT DISTINCT bo.bes_bestelopdr_key
        FROM bes_bestelopdr bo,
             bes_bestelopdr_item boi,
             bes_bestelling_item bi,
             bes_bestelling b,
             bes_srtdeel sd,
             bes_srtgroep sg,
             bes_disc_params dp
       WHERE bo.bes_bestelopdr_status = 4                     -- In bestelling
             AND bo.bes_bestelopdr_key = boi.bes_bestelopdr_key
             AND boi.bes_bestelopdr_item_key = bi.bes_bestelopdr_item_key
             AND bi.bes_bestelling_key = b.bes_bestelling_key
             AND bi.bes_srtdeel_key = sd.bes_srtdeel_key
             AND sd.bes_srtgroep_key = sg.bes_srtgroep_key
             --AND sg.ins_discipline_key = -1
             AND sg.ins_discipline_key = dp.bes_ins_discipline_key
             AND dp.bes_disc_params_noti_dagen IS NOT NULL
             AND (b.bes_bestelling_datum IS NULL OR fac.datumtijdplusuitvoertijd (b.bes_bestelling_leverdatum, dp.bes_disc_params_noti_dagen, 'DAGEN') < SYSDATE);

   -- Cursor loopt over alle bestelling-items met status 'Besteld' waarvan
   -- de bijbehorende bestelopdracht-items zijn geleverd; deze worden dan ook
   -- gesloten!
   CURSOR cbi
   IS
      SELECT DISTINCT b.bes_bestelling_key
        FROM bes_bestelling b,
             bes_bestelling_item bi,
             bes_bestelopdr_item boi
       WHERE b.bes_bestelling_status = 5                            -- Besteld
             AND b.bes_bestelling_key = bi.bes_bestelling_key
             --AND bi.bes_bestelling_item_aantal != COALESCE (bi.bes_bestelling_item_aantalontv, 0)
             AND bi.bes_bestelopdr_item_key = boi.bes_bestelopdr_item_key
             AND boi.bes_bestelopdr_item_aantal = boi.bes_bestelopdr_item_aantalontv;

   -- SVRZ#55788: Cursor loopt over de bestel-catalogi en maakt Label-kenmerk
   --             aan met (een kopie van) de Leveringscondities zoals bij de
   --             betreffende relatie ingevuld (en indien nog niet aangemaakt).
   CURSOR ccat
   IS
      SELECT dp.bes_ins_discipline_key, kl.prs_kenmerklink_waarde lev_condities
        FROM bes_disc_params dp,
             prs_kenmerklink kl
       WHERE dp.bes_disc_params_punch_bedr_key = kl.prs_link_key
             AND kl.prs_kenmerk_key = 1000               -- Leveringscondities
             AND NOT EXISTS
                   (SELECT 1
                      FROM bes_kenmerk
                     WHERE bes_srtkenmerk_key = c_lev_cond_srtk
                           AND bes_srtinstallatie_key = dp.bes_ins_discipline_key)
      UNION ALL
      SELECT DISTINCT dp.bes_ins_discipline_key, kl.prs_kenmerklink_waarde lev_condities
        FROM bes_disc_params dp,
             bes_srtgroep sg1,
             bes_srtdeel sd1,
             prs_kenmerklink kl
       WHERE dp.bes_disc_params_punch_bedr_key IS NULL
             AND dp.bes_ins_discipline_key = sg1.ins_discipline_key
             AND sg1.bes_srtgroep_key = sd1.bes_srtgroep_key
             AND sd1.prs_bedrijf_key = kl.prs_link_key
             AND kl.prs_kenmerk_key = 1000               -- Leveringscondities
             AND NOT EXISTS
                   (SELECT 1
                      FROM bes_srtgroep sg2, bes_srtdeel sd2
                     WHERE sg2.bes_srtgroep_key = sd2.bes_srtgroep_key
                           AND sg2.ins_discipline_key = sg1.ins_discipline_key
                           AND sd2.prs_bedrijf_key != sd1.prs_bedrijf_key)
             AND NOT EXISTS
                   (SELECT 1
                      FROM bes_kenmerk
                     WHERE bes_srtkenmerk_key = c_lev_cond_srtk
                           AND bes_srtinstallatie_key = dp.bes_ins_discipline_key);
BEGIN
   v_errormsg := 'Fout leveren bestelopdracht';

   FOR rec IN cboi
   LOOP
      -- Zeg dat alles geleverd is wat besteld is.
      UPDATE bes_bestelopdr_item
         SET bes_bestelopdr_item_aantalontv = bes_bestelopdr_item_aantal
       WHERE bes_bestelopdr_key = rec.bes_bestelopdr_key;

      bes.updatebestelopdrstatus (rec.bes_bestelopdr_key, NULL);
   END LOOP;

   v_errormsg := 'Fout sluiten bestelaanvraag';

   FOR rec IN cbi
   LOOP
      -- Sluit alle aanvraagregels af die nu geheel geleverd zijn.
      UPDATE bes_bestelling_item
         SET bes_bestelling_item_aantalontv = bes_bestelling_item_aantal
       WHERE bes_bestelling_key = rec.bes_bestelling_key;

      bes.updatebestellingstatus (rec.bes_bestelling_key, NULL);
   END LOOP;

   COMMIT;

   v_errormsg := 'Fout toevoegen leveringscondities';

   FOR rec IN ccat
   LOOP
      INSERT INTO bes_kenmerk (bes_srtkenmerk_key,
                               bes_srtinstallatie_key,
                               bes_kenmerk_type,
                               bes_kenmerk_niveau,
                               bes_kenmerk_volgnummer,
                               bes_kenmerk_default)
          VALUES (c_lev_cond_srtk,
                  rec.bes_ins_discipline_key,
                  'B',
                  'D',
                  1,
                  rec.lev_condities);
   END LOOP;

   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.writelog (p_applname, 'E', 'Proces NACHTWERK afgebroken!', v_errormsg);
END svrz_select_nachtwerk;
/

/* Formatted on 12-9-2014 17:42:24 (QP5 v5.136.908.31019) */
CREATE OR REPLACE VIEW svrz_v_imp_bes_artikel_sync
(
   fclt_f_catalogusnaam,
   leverancier,
   catdatum,
   artikelnr,
   groep,
   omschrijving,
   prijs,
   eenheid,
   picture,
   orderaantal,
   tax,
   duedate,
   inkoopprijs,
   minimum,
   staffeltabel,
   wijzigdagen,
   annuleerdagen,
   opmerking
)
AS
   SELECT td.ins_discipline_omschrijving,
          b.prs_bedrijf_naam,
          TO_CHAR (td.ins_discipline_aanmaak, 'yyyymmdd'),
          sd.bes_srtdeel_nr,
          sg.bes_srtgroep_omschrijving,
          sd.bes_srtdeel_omschrijving,
          TO_CHAR (bes.getsrtdeelprijs (sd.bes_srtdeel_key, NULL)),
          sd.bes_srtdeel_eenheid,
          sd.bes_srtdeel_image,
          TO_CHAR (sd.bes_srtdeel_veelvoud),
          TO_CHAR (sd.bes_srtdeel_btw),
          TO_CHAR (sd.bes_srtdeel_vervaldatum, 'yyyymmdd'),
          TO_CHAR (bes.getsrtdeelinkprijs (sd.bes_srtdeel_key, NULL)),
          NULL,
          bs.bes_staffeltabel_naam,
          TO_CHAR (sd.bes_srtdeel_wijzigdagen),
          TO_CHAR (sd.bes_srtdeel_annuleerdagen),
          sd.bes_srtdeel_opmerking
     FROM ins_tab_discipline td,
          bes_srtgroep sg,
          bes_srtdeel sd,
          prs_bedrijf b,
          bes_staffeltabel bs
    WHERE     td.ins_discipline_module = 'BES'
          AND td.ins_discipline_verwijder IS NULL
          AND td.ins_discipline_key = sg.ins_discipline_key
          AND sg.bes_srtgroep_verwijder IS NULL
          AND sg.bes_srtgroep_key = sd.bes_srtgroep_key
          AND sd.bes_srtdeel_verwijder IS NULL
          AND sd.prs_bedrijf_key = b.prs_bedrijf_key
          AND bs.bes_staffeltabel_key(+) = sd.bes_staffeltabel_key;

/* Formatted on 3-11-2014 16:36:24 (QP5 v5.136.908.31019) */
CREATE OR REPLACE VIEW svrz_v_afleveradres_lijst
(
   adres_id,
   adres_naam,
   adres,
   postcode,
   plaats,
   land
)
AS
   SELECT COALESCE (a.mld_adres_gebouw_ruimte, l.alg_locatie_code)
          || SUBSTR (
                a.mld_adres_bezoek_adres,
                DECODE (INSTR (a.mld_adres_bezoek_adres, ' ', -1),
                        0, 100,
                        INSTR (a.mld_adres_bezoek_adres, ' ', -1) + 1))
             adres_id,
          a.mld_adres_naam adres_naam,
          a.mld_adres_bezoek_adres adres,
          a.mld_adres_bezoek_postcode postcode,
          a.mld_adres_bezoek_plaats plaats,
          a.mld_adres_bezoek_land land
     FROM mld_adres a, alg_locatie l
    WHERE     a.mld_adres_verwijder IS NULL
          AND a.mld_adres_afleveradres = 1
          AND a.alg_locatie_key = l.alg_locatie_key;

CREATE OR REPLACE VIEW svrz_v_afleveradres_check
(
   loc_key,
   loc_code,
   loc_oms,
   loc_badres,
   loc_bposcode,
   loc_bplaats,
   loc_bland,
   loc_padres,
   loc_ppostcode,
   loc_pplaats,
   loc_pland,
   geb_key,
   geb_code,
   geb_naam,
   afl_key,
   afl_loc_key,
   afl_naam,
   afl_geb_ruimte,
   afl_badres,
   afl_bpostcode,
   afl_bplaats,
   afl_bland,
   afl_padres,
   afl_ppostcode,
   afl_pplaats,
   afl_pland
)
AS
   SELECT TO_CHAR (x.alg_locatie_key) loc_key,
          x.alg_locatie_code loc_code,
          x.alg_locatie_omschrijving loc_oms,
          x.alg_locatie_adres loc_badres,
          x.alg_locatie_postcode loc_bposcode,
          x.alg_locatie_plaats loc_bplaats,
          x.alg_locatie_land loc_bland,
          x.alg_locatie_post_adres loc_padres,
          x.alg_locatie_post_postcode loc_ppostcode,
          x.alg_locatie_post_plaats loc_pplaats,
          x.alg_locatie_post_land loc_pland,
          TO_CHAR (x.alg_gebouw_key) geb_key,
          x.alg_gebouw_upper geb_code,
          x.alg_gebouw_naam geb_naam,
          TO_CHAR (y.mld_adres_key) afl_key,
          TO_CHAR (y.alg_locatie_key) afl_loc_key,
          y.mld_adres_naam afl_naam,
          y.mld_adres_gebouw_ruimte gebouw_ruimte,
          y.mld_adres_bezoek_adres afl_badres,
          y.mld_adres_bezoek_postcode afl_bpostcode,
          y.mld_adres_bezoek_plaats afl_bplaats,
          y.mld_adres_bezoek_land afl_bland,
          y.mld_adres_post_adres afl_padres,
          y.mld_adres_post_postcode afl_ppostcode,
          y.mld_adres_post_plaats afl_pplaats,
          y.mld_adres_post_land afl_pland
     FROM    (SELECT l.alg_locatie_key,
                     l.alg_locatie_code,
                     l.alg_locatie_omschrijving,
                     l.alg_locatie_adres,
                     l.alg_locatie_postcode,
                     l.alg_locatie_plaats,
                     l.alg_locatie_land,
                     l.alg_locatie_post_adres,
                     l.alg_locatie_post_postcode,
                     l.alg_locatie_post_plaats,
                     l.alg_locatie_post_land,
                     g.alg_gebouw_key,
                     g.alg_gebouw_upper,
                     g.alg_gebouw_naam,
                     g.mld_adres_key
                FROM alg_v_aanweziglocatie l, alg_v_aanweziggebouw g
               WHERE l.alg_locatie_key = g.alg_locatie_key) x
          FULL JOIN
             (SELECT ma.mld_adres_key,
                     ma.mld_adres_naam,
                     ma.mld_adres_gebouw_ruimte,
                     ma.mld_adres_bezoek_adres,
                     ma.mld_adres_bezoek_postcode,
                     ma.mld_adres_bezoek_plaats,
                     ma.mld_adres_bezoek_land,
                     ma.mld_adres_post_adres,
                     ma.mld_adres_post_postcode,
                     ma.mld_adres_post_plaats,
                     ma.mld_adres_post_land,
                     ma.alg_locatie_key
                FROM mld_adres ma
               WHERE ma.mld_adres_afleveradres = 1
                     AND ma.mld_adres_verwijder IS NULL) y
          ON x.mld_adres_key = y.mld_adres_key;

/* Formatted on 21-4-2015 15:52:25 (QP5 v5.136.908.31019) */
CREATE OR REPLACE VIEW svrz_v_noti_order_afschrift
(
   code,
   sender,
   receiver,
   text,
   key,
   par1,
   par2,
   xkey
)
AS                                                      -- Afschrift C-orders!
   SELECT DISTINCT
          sn.fac_srtnotificatie_code,
          NULL,
          b.prs_perslid_key,                                      -- Besteller
          REPLACE (
             sn.fac_srtnotificatie_oms,
             '##CNR##',
             'PUR-C1'
             || SUBSTR ('0000000' || bo.bes_bestelopdr_id, INSTR ('0000000' || bo.bes_bestelopdr_id, '/') - 6)),
          bo.bes_bestelopdr_key,
          NULL,
          NULL,
          NULL
     FROM fac_tracking t,
          bes_bestelopdr bo,
          bes_bestelopdr_item boi,
          bes_bestelling_item bi,
          bes_bestelling b,
          fac_srtnotificatie sn,
          fac_notificatie_job nj
    WHERE     t.fac_srtnotificatie_key = 142                         -- BES2SN
          AND t.fac_tracking_refkey = bo.bes_bestelopdr_key
          AND bo.bes_bestelopdr_key = boi.bes_bestelopdr_key
          AND boi.bes_bestelopdr_item_key = bi.bes_bestelopdr_item_key
          AND bi.bes_bestelling_key = b.bes_bestelling_key
          AND sn.fac_srtnotificatie_code = 'CUST01'
          AND nj.fac_notificatie_job_view = 'SVRZ_V_NOTI_ORDER_AFSCHRIFT'
          AND t.fac_tracking_datum BETWEEN nj.fac_notificatie_job_nextrun - (nj.fac_notificatie_job_interval / 24) AND nj.fac_notificatie_job_nextrun
   UNION ALL                                            -- Afschrift N-orders!
   SELECT sn.fac_srtnotificatie_code,
          NULL,
          m.prs_perslid_key,                                      -- Aanvrager
          REPLACE (
             sn.fac_srtnotificatie_oms,
             '##NNR##',
             'PUR-N1'
             || SUBSTR ('0000000' || TO_CHAR (o.mld_melding_key), -6)
             || '/'
             || TO_CHAR (o.mld_opdr_bedrijfopdr_volgnr)),
          o.mld_opdr_key,
          NULL,
          NULL,
          NULL
     FROM fac_tracking t,
          mld_opdr o,
          mld_melding m,
          mld_stdmelding sm,
          ins_tab_discipline td,
          fac_srtnotificatie sn,
          fac_notificatie_job nj
    WHERE     t.fac_srtnotificatie_key = 91                          -- ORDSNT
          AND t.fac_tracking_refkey = o.mld_opdr_key
          AND o.mld_melding_key = m.mld_melding_key
          AND m.mld_stdmelding_key = sm.mld_stdmelding_key
          AND sm.mld_ins_discipline_key = td.ins_discipline_key
          AND td.ins_srtdiscipline_key = 1                           -- Inkoop
          AND sn.fac_srtnotificatie_code = 'CUST02'
          AND nj.fac_notificatie_job_view = 'SVRZ_V_NOTI_ORDER_AFSCHRIFT'
          AND t.fac_tracking_datum BETWEEN nj.fac_notificatie_job_nextrun - (nj.fac_notificatie_job_interval / 24) AND nj.fac_notificatie_job_nextrun;

CREATE OR REPLACE VIEW svrz_v_noti_cntreminder
(
   code,
   sender,
   receiver,
   text,
   key,
   xkey
)
AS
   SELECT '',
          NULL,
          c.prs_perslid_key_beh,
             'RappŠl: Contract '
          || c.cnt_contract_nummer_intern
          || ' ('
          || 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,
          NULL
     FROM cnt_v_aanwezigcontract c, prs_bedrijf b
    WHERE c.ins_discipline_key != 1541 -- Onderhoudscontracten HO niet notificeren!
          AND c.cnt_contract_status = 0                                 -- Actief
          AND c.cnt_prs_bedrijf_key = b.prs_bedrijf_key
          AND SYSDATE BETWEEN cnt.cnt_getrappeldatum (c.cnt_contract_key) AND cnt.cnt_getopzegdatum (c.cnt_contract_key);

CREATE OR REPLACE VIEW svrz_v_rap_contactafdeling
(
   afdeling,
   bedrijf,
   post_adres,
   post_postcode,
   post_plaats,
   post_land,
   bezoek_adres,
   bezoek_postcode,
   bezoek_plaats,
   bezoek_land,
   telefoon,
   fax,
   telefoon2,
   contactpersoon,
   contactpersoon_telefoon,
   contactpersoon_fax,
   opmerking,
   everancier_nr,
   overeenkomst_nr,
   overeenkomst_datum,
   email,
   fclt_h_afdeling_key
)
AS
   SELECT DISTINCT a.prs_afdeling_naam,
                   b.prs_bedrijf_naam,
                   b.prs_bedrijf_post_adres,
                   b.prs_bedrijf_post_postcode,
                   b.prs_bedrijf_post_plaats,
                   b.prs_bedrijf_post_land,
                   b.prs_bedrijf_bezoek_adres,
                   b.prs_bedrijf_bezoek_postcode,
                   b.prs_bedrijf_bezoek_plaats,
                   b.prs_bedrijf_bezoek_land,
                   b.prs_bedrijf_telefoon,
                   b.prs_bedrijf_fax,
                   b.prs_bedrijf_telefoon2,
                   b.prs_bedrijf_contact_persoon,
                   b.prs_bedrijf_contact_telefoon,
                   b.prs_bedrijf_contact_fax,
                   b.prs_bedrijf_opmerking,
                   b.prs_leverancier_nr,
                   b.prs_overeenkomst_nr,
                   b.prs_overeenkomst_datum,
                   b.prs_bedrijf_email,
                   a.prs_afdeling_key
     FROM cnt_contract c, prs_bedrijf b, prs_v_afdeling a
    WHERE cnt_contract_verwijder IS NULL
      AND c.cnt_contract_status = 0
      AND a.prs_afdeling_key = c.prs_afdeling_key_eig
      AND b.prs_bedrijf_key = c.cnt_prs_bedrijf_key;

/* Formatted on 19-5-2016 10:42:24 (QP5 v5.136.908.31019) */
CREATE OR REPLACE VIEW svrz_v_rap_ho_contracten
(
   hide_f_sortering,
   fclt_x_eindjaar,
   cnt_contract_key,
   contractnr,
   locatie,
   beschrijving,
   contractpartij,
   contractbedrag,                                -- Toegevoegd met SVRZ#37644
   einddatum
)
AS
   SELECT x.prs_bedrijf_naam || x.cnt_contract_nummer_intern || '.' || x.cnt_contract_versie,
          TO_CHAR (x.cnt_contract_looptijd_tot, 'yyyy'),
          x.cnt_contract_key,
          x.cnt_contract_nummer_intern || DECODE (x.cnt_contract_versie, NULL, '', 0, '', '.' || x.cnt_contract_versie),
          cp.scope locatie,
          x.cnt_contract_omschrijving,
          x.prs_bedrijf_naam,
          x.cnt_contract_kosten,
          x.cnt_contract_looptijd_tot
     FROM    (SELECT c.cnt_contract_key,
                     c.cnt_contract_nummer_intern,
                     c.cnt_contract_versie,
                     c.cnt_contract_omschrijving,
                     b.prs_bedrijf_naam,
                     c.cnt_contract_kosten,
                     c.cnt_contract_looptijd_tot
                FROM cnt_v_aanwezigcontract c, prs_bedrijf b
               WHERE c.ins_discipline_key = 1541    -- Onderhoudscontracten HO
                     AND c.cnt_contract_status = 0                   -- Actief
                     AND c.cnt_contract_looptijd_tot > TRUNC (SYSDATE, 'yyyy')
                     AND c.cnt_prs_bedrijf_key = b.prs_bedrijf_key) x
          LEFT JOIN
             (  SELECT cp.cnt_contract_key, LISTAGG (cp.locatie, CHR (13) || CHR (10)) WITHIN GROUP (ORDER BY cp.locatie) scope
                  FROM (SELECT cp.cnt_contract_key,
                               l.alg_locatie_omschrijving || ' (' || l.alg_locatie_code || ')' locatie
                          FROM cnt_contract_plaats cp, alg_locatie l
                         WHERE cp.cnt_alg_plaats_code = 'L'
                               AND cp.cnt_alg_plaats_key = l.alg_locatie_key
                        UNION
                        SELECT cp.cnt_contract_key,
                               l.alg_locatie_omschrijving || ' (' || l.alg_locatie_code || ')' locatie
                          FROM cnt_contract_plaats cp, alg_gebouw g, alg_locatie l
                         WHERE cp.cnt_alg_plaats_code = 'G'
                               AND cp.cnt_alg_plaats_key = g.alg_gebouw_key
                               AND g.alg_locatie_key = l.alg_locatie_key) cp
              GROUP BY cp.cnt_contract_key) cp
          ON x.cnt_contract_key = cp.cnt_contract_key;
/*
-- SVRZ#38249
CREATE OR REPLACE VIEW svrz_v_rap_contractoverzicht
(
   hide_f_sortering,
   fclt_3d_discipline_key,
   cnt_contract_key,
   fclt_f_contractsoort,
   fclt_x_eindjaar,
   contractnr,
   locatie,
   beschrijving,
   contractpartij,
   contractbedrag,
   einddatum
)
AS
   SELECT x.ins_discipline_omschrijving || x.prs_bedrijf_naam || x.cnt_contract_nummer_intern || '.' || x.cnt_contract_versie,
          x.ins_discipline_key,
          x.cnt_contract_key,
          x.ins_discipline_omschrijving,
          TO_CHAR (x.cnt_contract_looptijd_tot, 'yyyy'),
          x.cnt_contract_nummer_intern || DECODE (x.cnt_contract_versie, NULL, '', 0, '', '.' || x.cnt_contract_versie),
          cp.scope locatie,
          x.cnt_contract_omschrijving,
          x.prs_bedrijf_naam,
          x.cnt_contract_kosten,
          x.cnt_contract_looptijd_tot
     FROM    (SELECT c.ins_discipline_key,
                     c.cnt_contract_key,
                     td.ins_discipline_omschrijving,
                     c.cnt_contract_nummer_intern,
                     c.cnt_contract_versie,
                     c.cnt_contract_omschrijving,
                     b.prs_bedrijf_naam,
                     c.cnt_contract_kosten,
                     c.cnt_contract_looptijd_tot
                FROM cnt_v_aanwezigcontract c, ins_tab_discipline td, prs_bedrijf b
               WHERE c.cnt_contract_status = 0                       -- Actief
                     AND c.cnt_contract_looptijd_tot > TRUNC (SYSDATE, 'yyyy')
                     AND c.ins_discipline_key = td.ins_discipline_key
                     AND c.cnt_prs_bedrijf_key = b.prs_bedrijf_key) x
          LEFT JOIN
             (  SELECT cp.cnt_contract_key, LISTAGG (cp.locatie, CHR (13) || CHR (10)) WITHIN GROUP (ORDER BY cp.locatie) scope
                  FROM (SELECT cp.cnt_contract_key,
                               l.alg_locatie_omschrijving || ' (' || l.alg_locatie_code || ')' locatie
                          FROM cnt_contract_plaats cp, alg_locatie l
                         WHERE cp.cnt_alg_plaats_code = 'L'
                               AND cp.cnt_alg_plaats_key = l.alg_locatie_key
                        UNION
                        SELECT cp.cnt_contract_key,
                               l.alg_locatie_omschrijving || ' (' || l.alg_locatie_code || ')' locatie
                          FROM cnt_contract_plaats cp, alg_gebouw g, alg_locatie l
                         WHERE cp.cnt_alg_plaats_code = 'G'
                               AND cp.cnt_alg_plaats_key = g.alg_gebouw_key
                               AND g.alg_locatie_key = l.alg_locatie_key) cp
              GROUP BY cp.cnt_contract_key) cp
          ON x.cnt_contract_key = cp.cnt_contract_key;
*/
/* Formatted on 11-3-2016 9:42:24 (QP5 v5.136.908.31019) */
/* Tbv. demo Bedrijfskleding in Acceptatie; met SVRZ#36013 binnenkort misschien definitief (en anders weg)!!!
CREATE OR REPLACE VIEW svrz_v_kleding_artikelen
(
   bes_srtdeel_key,
   bes_srtdeel_oms,
   bes_srtdeel_vvd
)
AS
   SELECT sd.bes_srtdeel_key,
          sd.bes_srtdeel_omschrijving,
          sd.bes_srtdeel_verwijder
     FROM bes_srtgroep sg, bes_srtdeel sd
    WHERE sg.ins_discipline_key = 1721                         -- Wessels B.V.
          AND sd.bes_srtgroep_key = sg.bes_srtgroep_key;
*/


-- SVRZ#51694: Notificatie bij update of verwijdering van objecten die vallen
--             onder de disciplines 'Uitleen personeel' en 'Werkkleding'.
CREATE OR REPLACE VIEW svrz_v_rap_bezittingen
(
   ins_deel_key,
   extra_key,                                                -- Moet zo heten!
   gebruiker,
   identificatie,
   objectsoort,
   beschrijving,
   registratiedatum,
   verwijderdatum,
   tonen,
   inleverdatum
)
AS
   SELECT d.ins_deel_key,
          d.ins_alg_ruimte_key,                                   -- Gebruiker
          pf.prs_perslid_naam_friendly,
          d.ins_deel_omschrijving,
          sd.ins_srtdeel_omschrijving,
          d.ins_deel_opmerking,
          d.ins_deel_aanmaak,
          d.ins_deel_verwijder,
          DECODE (d.ins_deel_verwijder, NULL, DECODE (SIGN (ADD_MONTHS (d.ins_deel_vervaldatum, 1) - SYSDATE), -1, 0, 1), 0) tonen,
          DECODE (SIGN (d.ins_deel_vervaldatum - SYSDATE), -1, d.ins_deel_vervaldatum, NULL) inleverdatum
     FROM ins_deel d,                -- Inclusief recent verwijderde objecten!
          prs_v_perslid_fullnames_all pf,
          ins_srtdeel sd
    WHERE d.ins_discipline_key IN (781, 2261) -- Uitleen Personeel/Werkkleding
          AND d.ins_alg_ruimte_type = 'P'
          AND d.ins_alg_ruimte_key = pf.prs_perslid_key
          AND COALESCE (d.ins_deel_verwijder, SYSDATE) >= TRUNC (SYSDATE - 1)
          AND d.ins_srtdeel_key = sd.ins_srtdeel_key;

CREATE OR REPLACE VIEW svrz_v_noti_bezittingen
(
   code,
   sender,
   receiver,
   text,
   key,
   xkey
)
AS
   SELECT DISTINCT
          sn.fac_srtnotificatie_code,
          NULL,
          v.extra_key,
          REPLACE (sn.fac_srtnotificatie_oms, '##AANT##', (SELECT COUNT ( * ) FROM svrz_v_rap_bezittingen WHERE extra_key = v.extra_key)),
          r.fac_usrrap_key,
          v.extra_key
     FROM svrz_v_rap_bezittingen v, fac_tracking t, fac_usrrap r, fac_srtnotificatie sn
    WHERE v.ins_deel_key = t.fac_tracking_refkey
          AND t.fac_srtnotificatie_key IN (93, 94)            -- INSNEW/INSUPD
          AND NOT EXISTS                    -- Niet tijdens een import gedaan!
                (SELECT 1
                   FROM fac_import
                  WHERE fac_import_app_key = 42                         -- INS
                        AND prs_perslid_key = t.prs_perslid_key
                        AND t.fac_tracking_datum BETWEEN fac_import_datum_gelezen AND fac_import_datum_verwerkt)
          AND t.fac_tracking_datum >
                DECODE (
                   TO_CHAR (SYSDATE + 5 / 1440, 'HH24'),
                   '09', TO_DATE (TO_CHAR (SYSDATE - 1, 'dd-mm-yyyy') || ' 18:00',  'dd-mm-yyyy hh24:mi'),
                   '12', TO_DATE (TO_CHAR (SYSDATE, 'dd-mm-yyyy') || ' 09:00', 'dd-mm-yyyy hh24:mi'),
                   '15', TO_DATE (TO_CHAR (SYSDATE, 'dd-mm-yyyy') || ' 12:00', 'dd-mm-yyyy hh24:mi'),
                   '18', TO_DATE (TO_CHAR (SYSDATE, 'dd-mm-yyyy') || ' 15:00', 'dd-mm-yyyy hh24:mi'),
                   SYSDATE + 5 / 1440)
          AND UPPER (r.fac_usrrap_view_name) = 'SVRZ_V_RAP_BEZITTINGEN'
          AND sn.fac_srtnotificatie_code = 'CUST03'
   UNION   -- INSDEL wordt niet getrackt, dus op basis van ins_deel_verwijder!
   SELECT DISTINCT
          sn.fac_srtnotificatie_code,
          NULL,
          v.extra_key,
          REPLACE (sn.fac_srtnotificatie_oms, '##AANT##', (SELECT COUNT ( * ) FROM svrz_v_rap_bezittingen WHERE extra_key = v.extra_key)),
          r.fac_usrrap_key,
          v.extra_key
     FROM svrz_v_rap_bezittingen v,
          (  SELECT d1.ins_deel_key, COUNT ( * ) aantal
               FROM ins_deel d1, ins_deel d2
              WHERE d1.ins_discipline_key IN (781, 2261)
                    AND d1.ins_deel_verwijder > TRUNC (SYSDATE - 1) -- Sinds gisteren verwijderd tegelijk met andere objecten
                    AND d1.ins_deel_verwijder BETWEEN d2.ins_deel_verwijder - 1 / 86400 AND d2.ins_deel_verwijder + 1 / 86400
           GROUP BY d1.ins_deel_key) d,
          fac_usrrap r,
          fac_srtnotificatie sn
    WHERE v.ins_deel_key = d.ins_deel_key
          AND d.aantal < 10
          AND v.verwijderdatum >
                DECODE (
                   TO_CHAR (SYSDATE + 5 / 1440, 'HH24'),
                   '09', TO_DATE (TO_CHAR (SYSDATE - 1, 'dd-mm-yyyy') || ' 18:00',  'dd-mm-yyyy hh24:mi'),
                   '12', TO_DATE (TO_CHAR (SYSDATE, 'dd-mm-yyyy') || ' 09:00', 'dd-mm-yyyy hh24:mi'),
                   '15', TO_DATE (TO_CHAR (SYSDATE, 'dd-mm-yyyy') || ' 12:00', 'dd-mm-yyyy hh24:mi'),
                   '18', TO_DATE (TO_CHAR (SYSDATE, 'dd-mm-yyyy') || ' 15:00', 'dd-mm-yyyy hh24:mi'),
                   SYSDATE + 5 / 1440)
          AND UPPER (r.fac_usrrap_view_name) = 'SVRZ_V_RAP_BEZITTINGEN'
          AND sn.fac_srtnotificatie_code = 'CUST03';

CREATE OR REPLACE VIEW svrz_v_perslid_nr_all
(
   prs_perslid_key,
   prs_perslid_naam_full,
   prs_perslid_naam_friendly,
   prs_perslid_verwijder
)
AS
   SELECT pf.prs_perslid_key,
          pf.prs_perslid_naam_full || ' [' || p.prs_perslid_nr || ']',
          pf.prs_perslid_naam_friendly || ' [' || p.prs_perslid_nr || ']',
          p.prs_perslid_verwijder
     FROM prs_perslid p, prs_v_perslid_fullnames_all pf
    WHERE SUBSTR (p.prs_perslid_oslogin, 1, 1) != '_'
          AND p.prs_perslid_key = pf.prs_perslid_key;

CREATE OR REPLACE VIEW svrz_v_relaties_u_ict
(
   prs_bedrijf_key,
   prs_bedrijf_naam,
   prs_bedrijf_verwijder
)
AS
   SELECT b.prs_bedrijf_key, b.prs_bedrijf_naam, b.prs_bedrijf_verwijder
     FROM prs_bedrijf b
    WHERE b.prs_bedrijf_uitvoerende = 1;

-- SVRZ#55239: Mail2Melding bij migratie Topdesk naar FACILITOR. Twee stromen:
-- - HELPDESK -: Soortmelding 1691 (Hardware/Computer) onder Vakgroep 3038
--               (Helpdesk I+A) onder Vakgroeptype 161!
-- - CLIENTPORTAAL -: Soortmelding 1697 (Clientportaal) onder Vakgroep 3042
--                    (Servicedesk MijnCaress) onder Vakgroeptype 161!
CREATE OR REPLACE PROCEDURE SVRZ_processemail (
   pfrom        IN VARCHAR2,
   pto          IN VARCHAR2,
   psubject     IN VARCHAR2,
   pbody        IN VARCHAR2,
   psessionid   IN VARCHAR2,
   puserkey     IN NUMBER DEFAULT NULL)
AS
   c_onbekend_key       NUMBER (10) := 36281;           -- Onbekende gebruiker
   v_errormsg           VARCHAR2 (1000);
   oracle_err_num       NUMBER;
   oracle_err_mes       VARCHAR2 (200);
   v_exist_ticket       VARCHAR2 (255) := '';
   v_perslid_key        NUMBER (10);
   v_kostenplaats_key   NUMBER (10);
   v_locatie_key        NUMBER (10);
   v_discipline_key     NUMBER (10);
   v_stdmelding_key     NUMBER (10);
   v_melding_key        NUMBER (10);
   v_folder_kkey        NUMBER (10);
   v_count              NUMBER (10);
BEGIN
   CASE
      WHEN UPPER (pto) LIKE 'HELPDESK@%'
      THEN
         -- Bepaal de melder/noteur op basis van e-mail adres zoals in pfrom?
         v_errormsg := 'Fout bepalen melder ' || COALESCE (pfrom, '???');
         SELECT COUNT (*)
           INTO v_count
           FROM prs_v_aanwezigperslid
          WHERE UPPER (prs_perslid_email) LIKE UPPER (pfrom) || '%';

         IF v_count = 1
         THEN
              SELECT p.prs_perslid_key, a.prs_kostenplaats_key, MIN (wpg.alg_locatie_key)
                INTO v_perslid_key, v_kostenplaats_key, v_locatie_key
                FROM prs_v_aanwezigperslid p, prs_afdeling a,
                     (SELECT pw.prs_perslid_key, pw.prs_werkplek_key
                        FROM prs_perslidwerkplek pw
                       WHERE NOT EXISTS
                                (SELECT 1
                                   FROM prs_perslidwerkplek
                                  WHERE prs_perslid_key = pw.prs_perslid_key
                                        AND prs_perslidwerkplek_key > pw.prs_perslidwerkplek_key)) pw,
                     prs_v_werkplekperslid_gegevens wpg
               WHERE p.prs_afdeling_key = a.prs_afdeling_key
                     AND UPPER (p.prs_perslid_email) LIKE UPPER (pfrom) || '%'
                     AND p.prs_perslid_key = pw.prs_perslid_key(+)
                     AND pw.prs_werkplek_key = wpg.prs_werkplek_key(+)
            GROUP BY p.prs_perslid_key, a.prs_kostenplaats_key;
         ELSE -- Melder kan niet 1-duidig worden bepaald, dus Onbekend en 61=Servicecentrum!
            SELECT p.prs_perslid_key, a.prs_kostenplaats_key, 61
              INTO v_perslid_key, v_kostenplaats_key, v_locatie_key
              FROM prs_v_aanwezigperslid p, prs_afdeling a
             WHERE p.prs_afdeling_key = a.prs_afdeling_key
                   AND p.prs_perslid_key = c_onbekend_key;
         END IF;

         v_errormsg := 'Fout bepalen bestaande melding';
         v_exist_ticket := psubject;
         IF REGEXP_INSTR (v_exist_ticket, '\d') > 0
         THEN
            v_exist_ticket := SUBSTR (v_exist_ticket, REGEXP_INSTR (v_exist_ticket, '\d')) || 'x'; -- Gedeelte vanaf eerste cijfer in v_exist_ticket plus 'x'!
            v_exist_ticket := SUBSTR (v_exist_ticket, 1, REGEXP_INSTR (v_exist_ticket, '\D') - 1); -- Gedeelte tot eerste niet-cijfer in v_exist_ticket!
         ELSE
            v_exist_ticket := 'x';
         END IF;

         SELECT COUNT (*)
           INTO v_count
           FROM mld_melding
          WHERE mld_melding_key = fac.safe_to_number (v_exist_ticket);

         -- Om te voorkomen dat huisnummers in het Onderwerp resulteren in het
         -- toevoegen van Notities, dit alleen doen voor nummers > 16000!
         IF v_count = 1 AND fac.safe_to_number (v_exist_ticket) > 16000
         THEN                                -- Notitie bij bestaande melding!
            SELECT mld_stdmelding_key, mld_melding_key
              INTO v_stdmelding_key, v_melding_key
              FROM mld_melding
             WHERE mld_melding_key = fac.safe_to_number (v_exist_ticket);

            v_errormsg := 'Fout toevoegen notitie';
            INSERT INTO mld_melding_note (mld_melding_key,
                                          prs_perslid_key,
                                          mld_melding_note_omschrijving,
                                          mld_melding_note_flag)
                VALUES (v_melding_key,
                        v_perslid_key,
                        pfrom || CHR (13) || CHR (10) || psubject || CHR (13) || CHR (10) || SUBSTR (pbody, 1, 2000),
                        0);

            INSERT INTO fac_result (fac_result_sessionid, fac_result_naam, fac_result_waarde)
                VALUES (psessionid, 'maillog', 'Notitie onder exist-melding ' || v_melding_key);

            -- Vlaggetjes zetten zoals mld_edit_note.asp dat doet!
            IF fac.getsetting ('mld_melding_actiecode') = 1
            THEN
               UPDATE mld_melding
                  SET mld_melding_actiecode = 1 + 128         -- BO + Attentie
                WHERE mld_melding_key = v_melding_key;
            END IF;
         ELSE                                               -- Nieuwe melding!
            -- Bepaal de afgesproken soortmelding met key=1691=Harware/Computer!
            v_errormsg := 'Fout bepalen soortmelding';
            SELECT mld_ins_discipline_key, mld_stdmelding_key
              INTO v_discipline_key, v_stdmelding_key
              FROM mld_stdmelding
             WHERE mld_stdmelding_key = 1691;

            -- Suggested extensions:
            -- - Check for MLDUSE-write autorisations
            -- - Parse the subject to find the appropriate stdmelding, if uniquely possible
            -- - Append (as a note?) to an existing melding if #key is found in the subject
            v_errormsg := 'Fout toevoegen melding';
            INSERT INTO mld_melding (mld_melding_module,
                                     mld_meldbron_key,
                                     mld_alg_locatie_key,
                                     mld_alg_onroerendgoed_keys,
                                     mld_melding_datum,
                                     mld_melding_omschrijving,
                                     mld_stdmelding_key,
                                     mld_melding_t_uitvoertijd,
                                     prs_kostenplaats_key,
                                     prs_perslid_key,
                                     prs_perslid_key_voor,
                                     mld_melding_status,
                                     mld_melding_spoed,
                                     mld_melding_onderwerp,
                                     mld_melding_behandelaar2_key,
                                     mld_ins_discipline_key)
                VALUES ('MLD',
                        4,                                            -- email
                        v_locatie_key,
                        NULL,                                --v_onrgoed_keys,
                        SYSDATE,
                        pfrom || CHR (13) || CHR (10) || SUBSTR (pbody, 1, 2000),
                        v_stdmelding_key,
                        NULL,
                        v_kostenplaats_key,
                        v_perslid_key,
                        v_perslid_key,
                        NULL,
                        3,                                     -- prio normaal
                        SUBSTR (psubject, 1, 80),
                        NULL,
                        3141)                               -- BT Helpdesk I+A
             RETURNING mld_melding_key
                  INTO v_melding_key;

            mld.setmeldingstatus (v_melding_key, 2, v_perslid_key);

            INSERT INTO fac_result (fac_result_sessionid, fac_result_naam, fac_result_waarde)
                VALUES (psessionid, 'maillog', 'Geregistreerd onder melding ' || v_melding_key);
         END IF;

 	     -- Find the lowest volgnummer of the Folder-flexfield.
 	     SELECT MIN (k1.mld_kenmerk_key)
           INTO v_folder_kkey
           FROM mld_stdmelding sm1, ins_tab_discipline td1, mld_kenmerk k1, mld_srtkenmerk sk1
  	      WHERE sm1.mld_stdmelding_key = v_stdmelding_key
                AND sm1.mld_ins_discipline_key = td1.ins_discipline_key
                AND k1.mld_kenmerk_verwijder IS NULL
                AND k1.mld_srtkenmerk_key = sk1.mld_srtkenmerk_key
                AND sk1.mld_srtkenmerk_kenmerktype = 'M'
                AND ((k1.mld_stdmelding_key = sm1.mld_stdmelding_key AND k1.mld_kenmerk_niveau = 'S')
                      OR (k1.mld_stdmelding_key = td1.ins_discipline_key AND k1.mld_kenmerk_niveau = 'D')
                      OR (k1.mld_stdmelding_key = td1.ins_srtdiscipline_key AND k1.mld_kenmerk_niveau = 'T'))
                AND NOT EXISTS
                       (SELECT 1
                          FROM mld_stdmelding sm2, ins_tab_discipline td2, mld_kenmerk k2, mld_srtkenmerk sk2
                         WHERE sm2.mld_stdmelding_key = v_stdmelding_key
                               AND sm2.mld_ins_discipline_key = td2.ins_discipline_key
                               AND k2.mld_kenmerk_verwijder IS NULL
                               AND k2.mld_srtkenmerk_key = sk2.mld_srtkenmerk_key
                               AND sk2.mld_srtkenmerk_kenmerktype = 'M'
                               AND ((k2.mld_stdmelding_key = sm2.mld_stdmelding_key AND k2.mld_kenmerk_niveau = 'S')
                                    OR (k2.mld_stdmelding_key = td2.ins_discipline_key AND k2.mld_kenmerk_niveau = 'D')
                                    OR (k2.mld_stdmelding_key = td2.ins_srtdiscipline_key AND k2.mld_kenmerk_niveau = 'T'))
                               AND k2.mld_kenmerk_volgnummer < k1.mld_kenmerk_volgnummer);

 	     IF v_folder_kkey IS NOT NULL
 	     THEN
            INSERT INTO fac_result (fac_result_sessionid, fac_result_naam, fac_result_waarde)
               VALUES (psessionid, 'kenmerkpath', 'MLD\M' || TO_CHAR (TRUNC (v_melding_key / 1000), 'FM0000') || '___\M' || v_melding_key || '\' || v_folder_kkey || '\');
 	     END IF;

         -- Handle workflow actions for completion (in case of new melding).
         IF v_count = 0
         THEN
            MLD.mld_nextworkflowstep (v_melding_key, -1);        -- -1=Initial
         END IF;
      WHEN UPPER (pto) LIKE 'CLIENTPORTAAL@%'
      THEN
         -- Melder/noteur per definitie Onbekend en 61=Servicecentrum!
         v_errormsg := 'Fout bepalen melder ' || COALESCE (pfrom, '???');
         SELECT p.prs_perslid_key, a.prs_kostenplaats_key, 61
           INTO v_perslid_key, v_kostenplaats_key, v_locatie_key
           FROM prs_v_aanwezigperslid p, prs_afdeling a
          WHERE p.prs_afdeling_key = a.prs_afdeling_key
                AND p.prs_perslid_key = c_onbekend_key;

         v_errormsg := 'Fout bepalen bestaande melding';
         v_exist_ticket := psubject;
         IF REGEXP_INSTR (v_exist_ticket, '\d') > 0
         THEN
            v_exist_ticket := SUBSTR (v_exist_ticket, REGEXP_INSTR (v_exist_ticket, '\d')) || 'x'; -- Gedeelte vanaf eerste cijfer in v_exist_ticket plus 'x'!
            v_exist_ticket := SUBSTR (v_exist_ticket, 1, REGEXP_INSTR (v_exist_ticket, '\D') - 1); -- Gedeelte tot eerste niet-cijfer in v_exist_ticket!
         ELSE
            v_exist_ticket := 'x';
         END IF;

         SELECT COUNT (*)
           INTO v_count
           FROM mld_melding
          WHERE mld_melding_key = fac.safe_to_number (v_exist_ticket);

         -- Om te voorkomen dat huisnummers in het Onderwerp resulteren in het
         -- toevoegen van Notities, dit alleen doen voor nummers > 16000!
         IF v_count = 1 AND fac.safe_to_number (v_exist_ticket) > 16000
         THEN                                -- Notitie bij bestaande melding!
            SELECT mld_stdmelding_key, mld_melding_key
              INTO v_stdmelding_key, v_melding_key
              FROM mld_melding
             WHERE mld_melding_key = fac.safe_to_number (v_exist_ticket);

            v_errormsg := 'Fout toevoegen notitie';
            INSERT INTO mld_melding_note (mld_melding_key,
                                          prs_perslid_key,
                                          mld_melding_note_omschrijving,
                                          mld_melding_note_flag)
                VALUES (v_melding_key,
                        v_perslid_key,
                        pfrom || CHR (13) || CHR (10) || psubject || CHR (13) || CHR (10) || SUBSTR (pbody, 1, 2000),
                        0);

            INSERT INTO fac_result (fac_result_sessionid, fac_result_naam, fac_result_waarde)
                VALUES (psessionid, 'maillog', 'Notitie onder exist-melding ' || v_melding_key);

            -- Vlaggetjes zetten zoals mld_edit_note.asp dat doet!
            IF fac.getsetting ('mld_melding_actiecode') = 1
            THEN
               UPDATE mld_melding
                  SET mld_melding_actiecode = 1 + 128         -- BO + Attentie
                WHERE mld_melding_key = v_melding_key;
            END IF;
         ELSE                                               -- Nieuwe melding!
            -- Bepaal de afgesproken soortmelding met key=1697=Clientportaal!
            v_errormsg := 'Fout bepalen soortmelding';
            SELECT mld_ins_discipline_key, mld_stdmelding_key
              INTO v_discipline_key, v_stdmelding_key
              FROM mld_stdmelding
             WHERE mld_stdmelding_key = 1697;

            -- Suggested extensions:
            -- - Check for MLDUSE-write autorisations
            -- - Parse the subject to find the appropriate stdmelding, if uniquely possible
            -- - Append (as a note?) to an existing melding if #key is found in the subject
            v_errormsg := 'Fout toevoegen melding';
            INSERT INTO mld_melding (mld_melding_module,
                                     mld_meldbron_key,
                                     mld_alg_locatie_key,
                                     mld_alg_onroerendgoed_keys,
                                     mld_melding_datum,
                                     mld_melding_omschrijving,
                                     mld_stdmelding_key,
                                     mld_melding_t_uitvoertijd,
                                     prs_kostenplaats_key,
                                     prs_perslid_key,
                                     prs_perslid_key_voor,
                                     mld_melding_status,
                                     mld_melding_spoed,
                                     mld_melding_onderwerp,
                                     mld_melding_behandelaar2_key,
                                     mld_ins_discipline_key)
                VALUES ('MLD',
                        4,                                            -- email
                        v_locatie_key,
                        NULL,                                --v_onrgoed_keys,
                        SYSDATE,
                        pfrom || CHR (13) || CHR (10) || SUBSTR (pbody, 1, 2000),
                        v_stdmelding_key,
                        NULL,
                        v_kostenplaats_key,
                        v_perslid_key,
                        v_perslid_key,
                        NULL,
                        3,                                     -- prio normaal
                        SUBSTR (psubject, 1, 80),
                        NULL,
                        3061)                  -- BT Medewerkers Cliëntportaal
             RETURNING mld_melding_key
                  INTO v_melding_key;

            v_errormsg := 'Fout toevoegen Emailadres';
            INSERT INTO mld_kenmerkmelding (mld_melding_key,
                                            mld_kenmerk_key,
                                            mld_kenmerkmelding_waarde)
                VALUES (v_melding_key,
                        1101,                                    -- Emailadres
                        SUBSTR (pfrom, 1, 50));

            mld.setmeldingstatus (v_melding_key, 2, v_perslid_key);

            INSERT INTO fac_result (fac_result_sessionid, fac_result_naam, fac_result_waarde)
                VALUES (psessionid, 'maillog', 'Geregistreerd onder melding ' || v_melding_key);
         END IF;

 	     -- Find the lowest volgnummer of the Folder-flexfield.
 	     SELECT MIN (k1.mld_kenmerk_key)
           INTO v_folder_kkey
           FROM mld_stdmelding sm1, ins_tab_discipline td1, mld_kenmerk k1, mld_srtkenmerk sk1
  	      WHERE sm1.mld_stdmelding_key = v_stdmelding_key
                AND sm1.mld_ins_discipline_key = td1.ins_discipline_key
                AND k1.mld_kenmerk_verwijder IS NULL
                AND k1.mld_srtkenmerk_key = sk1.mld_srtkenmerk_key
                AND sk1.mld_srtkenmerk_kenmerktype = 'M'
                AND ((k1.mld_stdmelding_key = sm1.mld_stdmelding_key AND k1.mld_kenmerk_niveau = 'S')
                      OR (k1.mld_stdmelding_key = td1.ins_discipline_key AND k1.mld_kenmerk_niveau = 'D')
                      OR (k1.mld_stdmelding_key = td1.ins_srtdiscipline_key AND k1.mld_kenmerk_niveau = 'T'))
                AND NOT EXISTS
                       (SELECT 1
                          FROM mld_stdmelding sm2, ins_tab_discipline td2, mld_kenmerk k2, mld_srtkenmerk sk2
                         WHERE sm2.mld_stdmelding_key = v_stdmelding_key
                               AND sm2.mld_ins_discipline_key = td2.ins_discipline_key
                               AND k2.mld_kenmerk_verwijder IS NULL
                               AND k2.mld_srtkenmerk_key = sk2.mld_srtkenmerk_key
                               AND sk2.mld_srtkenmerk_kenmerktype = 'M'
                               AND ((k2.mld_stdmelding_key = sm2.mld_stdmelding_key AND k2.mld_kenmerk_niveau = 'S')
                                    OR (k2.mld_stdmelding_key = td2.ins_discipline_key AND k2.mld_kenmerk_niveau = 'D')
                                    OR (k2.mld_stdmelding_key = td2.ins_srtdiscipline_key AND k2.mld_kenmerk_niveau = 'T'))
                               AND k2.mld_kenmerk_volgnummer < k1.mld_kenmerk_volgnummer);

 	     IF v_folder_kkey IS NOT NULL
 	     THEN
            INSERT INTO fac_result (fac_result_sessionid, fac_result_naam, fac_result_waarde)
               VALUES (psessionid, 'kenmerkpath', 'MLD\M' || TO_CHAR (TRUNC (v_melding_key / 1000), 'FM0000') || '___\M' || v_melding_key || '\' || v_folder_kkey || '\');
 	     END IF;

         -- Handle workflow actions for completion (in case of new melding).
         IF v_count = 0
         THEN
            MLD.mld_nextworkflowstep (v_melding_key, -1);        -- -1=Initial
         END IF;
      ELSE
         INSERT INTO fac_result (fac_result_sessionid, fac_result_naam, fac_result_waarde)
             VALUES (psessionid, 'errormsg', 'Ontvanger ongeldig - Neem contact op met uw systeembeheerder ');
   END CASE;
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.writelog ('PROCESSEMAIL', 'E', 'SVRZ_processemail afgebroken!', '[' || pfrom || '] ' || v_errormsg);
      INSERT INTO fac_result (fac_result_sessionid, fac_result_naam, fac_result_waarde)
          VALUES (psessionid, 'errormsg', 'Database fout - Neem contact op met uw systeembeheerder ');
      COMMIT;
END;
/

-- Notificatie naar externe clientportaal-melders (per e-mail binnengelopen via
-- SVRZ_processemail()).
CREATE OR REPLACE VIEW svrz_v_noti_clientportaal
(
   sender,
   receiver,
   text,
   code,
   key,
   xkey,
   xsender,
   xemail,
   xmobile,
   attachments
)
AS
   SELECT NULL,
          NULL,
          REPLACE (
             REPLACE (
                REPLACE (
                   lcl.x ('fac_srtnotificatie_oms', sn.fac_srtnotificatie_key, sn.fac_srtnotificatie_oms),
                   '##KEY##', TO_CHAR (x.mld_melding_key)),
                '##STDMLD##', TO_CHAR (x.mld_stdmelding_omschrijving)),
             '##DISC##', TO_CHAR (x.ins_discipline_omschrijving)),
          sn.fac_srtnotificatie_code,                       -- TODO:Of CUSTxx?
          x.mld_melding_key,
          NULL,
          'clientportaal@svrz.nl',
          x.receiver,
          NULL,
          DECODE (
             x.fac_srtnotificatie_key,
             22, 'MLD/M' || SUBSTR (LPAD (TO_CHAR (x.mld_melding_key), 7, '0'), 1, 4) || '___/M' || TO_CHAR (x.mld_melding_key) || '/' || TO_CHAR (y.mld_kenmerk_key) || '/*',
             NULL)
     FROM (  SELECT m.mld_melding_key,
                    sm.mld_stdmelding_key,
                    md.ins_discipline_key,
                    md.ins_srtdiscipline_key,
                    sm.mld_stdmelding_omschrijving,
                    md.ins_discipline_omschrijving,
                    km.mld_kenmerkmelding_waarde receiver,
                    MAX (t.fac_srtnotificatie_key) fac_srtnotificatie_key -- MLDAFM wint van MLDACP wint van MLDNOT!
               FROM mld_melding m,
                    mld_stdmelding sm,
                    mld_discipline md,
                    mld_kenmerkmelding km,
                    (SELECT fac_tracking_refkey,
                            fac_tracking_datum,
                            fac_srtnotificatie_key
                       FROM fac_tracking
                      WHERE fac_srtnotificatie_key IN (21, 22)   -- MLDACP/AFM
                     UNION ALL
                     SELECT mld_melding_key fac_tracking_refkey,
                            mld_melding_note_aanmaak fac_tracking_datum,
                            0 fac_srtnotificatie_key       -- Bah, vieze truc!
                       FROM mld_melding_note
                      WHERE MOD (mld_melding_note_flag, 2) = 1) t, -- Zichtbaar voor melder
                    fac_notificatie_job nj
              WHERE m.mld_stdmelding_key = sm.mld_stdmelding_key
                    AND sm.mld_ins_discipline_key = md.ins_discipline_key
                    AND m.mld_melding_key = km.mld_melding_key
                    AND km.mld_kenmerkmelding_verwijder IS NULL
                    AND km.mld_kenmerk_key = 1101                -- Emailadres
                    AND m.mld_melding_key = t.fac_tracking_refkey
                    AND nj.fac_notificatie_job_view = 'SVRZ_V_NOTI_CLIENTPORTAAL'
                    AND t.fac_tracking_datum BETWEEN nj.fac_notificatie_job_nextrun - (nj.fac_notificatie_job_interval / 24) AND nj.fac_notificatie_job_nextrun
           GROUP BY m.mld_melding_key,
                    sm.mld_stdmelding_key,
                    md.ins_discipline_key,
                    md.ins_srtdiscipline_key,
                    sm.mld_stdmelding_omschrijving,
                    md.ins_discipline_omschrijving,
                    km.mld_kenmerkmelding_waarde) x
          LEFT JOIN (SELECT mld_stdmelding_key, mld_kenmerk_niveau, mld_kenmerk_key
                       FROM mld_kenmerk
                      WHERE mld_kenmerk_verwijder IS NULL
                            AND mld_srtkenmerk_key = -1) y -- Bij afmelden mee te sturen bijlagen
             ON ((x.mld_stdmelding_key = y.mld_stdmelding_key AND y.mld_kenmerk_niveau = 'S')
                 OR (x.ins_discipline_key = y.mld_stdmelding_key AND y.mld_kenmerk_niveau = 'D')
                 OR (x.ins_srtdiscipline_key = y.mld_stdmelding_key AND y.mld_kenmerk_niveau = 'T'))
          LEFT JOIN fac_srtnotificatie sn                        -- 341=MLDNOT
             ON DECODE (x.fac_srtnotificatie_key, 0, 341, x.fac_srtnotificatie_key) = sn.fac_srtnotificatie_key;

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