-- Once-script BEDRIJF-import 'Inventarisatie Externe Bedrijven'.
-- Toekomstige systeem-import, maar nu nog klantspecifiek!
-- (c) 2009 SG|facilitor bv 
-- $Revision$ 
-- $Id$
--
-- Support: +31 53 4800700
SET ECHO ON;
SPOOL xskaf_imp_ext_bedrijf.lst;
SET DEFINE OFF;

CREATE TABLE skaf_imp_ext_bedrijf (
   prs_bedrijf_naam VARCHAR (60),
   prs_leverancier_nr VARCHAR (50),
   prs_bedrijf_bezoek_adres VARCHAR (35),
   prs_bedrijf_bezoek_postcode VARCHAR (12),
   prs_bedrijf_bezoek_plaats VARCHAR (30),
   prs_bedrijf_bezoek_land VARCHAR (30),
   prs_bedrijf_telefoon VARCHAR (20),
   prs_bedrijf_fax VARCHAR (20),
   prs_bedrijf_post_adres VARCHAR (35),
   prs_bedrijf_post_postcode VARCHAR (12),
   prs_bedrijf_post_plaats VARCHAR (30),
   prs_bedrijf_post_land VARCHAR (30),
   prs_bedrijf_contact_persoon VARCHAR (30),
   prs_bedrijf_contact_telefoon VARCHAR (20),
   prs_bedrijf_contact_fax VARCHAR (20),
   prs_bedrijf_leverancier NUMBER (1),
   prs_bedrijf_uitvoerende NUMBER (1),
   prs_bedrijf_contract NUMBER (1),
   prs_bedrijf_huurder NUMBER (1),
   prs_bedrijf_ingids NUMBER (1),
   prs_bedrijf_uurloon NUMBER (6,2),
   prs_overeenkomst_nr VARCHAR (20),
   prs_overeenkomst_datum DATE,
   prs_bedrijf_email VARCHAR2 (100),
   prs_bedrijf_opmerking VARCHAR2 (320),
   prs_dienst_omschrijving VARCHAR2 (60),
   alg_locatie_code VARCHAR2(10),
   alg_gebouw_code VARCHAR2(10),
   prs_bedrijf_overig1 VARCHAR2(256),
   prs_bedrijf_overig2 VARCHAR2(256),
   prs_bedrijf_overig3 VARCHAR2(256)
);

INSERT INTO fac_import_app
            (fac_import_app_code, fac_import_app_oms,
             fac_functie_key)
   SELECT 'EXT_BEDRIJF', 'FIP: 9-Aanvullen externe bedrijven',
          fac_functie_key
     FROM fac_functie
    WHERE fac_functie_code = 'WEB_PRSSYS';

/* Formatted on 7-1-2010 13:45:45 (QP5 v5.115.810.9015) */
CREATE OR REPLACE PROCEDURE skaf_import_ext_bedrijf (
   p_applname   IN VARCHAR2,
   p_applrun    IN VARCHAR2,
   p_filedir    IN VARCHAR2,
   p_filename   IN VARCHAR2
)
IS
   c_delim                          VARCHAR2 (1) := ';';
   v_newline                        VARCHAR2 (1000);             -- Input line
   v_errormsg                       VARCHAR2 (1000);
   v_errorhint                      VARCHAR2 (1000);
   oracle_err_num                   NUMBER;
   oracle_err_mes                   VARCHAR2 (200);
   header_is_valid                  NUMBER;
   v_count_tot                      NUMBER (10);
   v_count_import                   NUMBER (10);
   v_ongeldig                       NUMBER (1);
   v_aanduiding                     VARCHAR (200);
   -- De importvelden:
   v_prs_bedrijf_naam               VARCHAR2 (256);                     -- C60
   v_prs_leverancier_nr             VARCHAR2 (256);                     -- C50
   v_prs_bedrijf_bezoek_adres       VARCHAR2 (256);                     -- C35
   v_prs_bedrijf_bezoek_postcode    VARCHAR2 (256);                     -- C12
   v_prs_bedrijf_bezoek_plaats      VARCHAR2 (256);                     -- C30
   v_prs_bedrijf_bezoek_land        VARCHAR2 (256);                     -- C30
   v_prs_bedrijf_telefoon           VARCHAR2 (256);                     -- C20
   v_prs_bedrijf_fax                VARCHAR2 (256);                     -- C20
   v_prs_bedrijf_post_adres         VARCHAR2 (256);                     -- C35
   v_prs_bedrijf_post_postcode      VARCHAR2 (256);                     -- C12
   v_prs_bedrijf_post_plaats        VARCHAR2 (256);                     -- C30
   v_prs_bedrijf_post_land          VARCHAR2 (256);                     -- C30
   v_prs_bedrijf_contact_persoon    VARCHAR2 (256);                     -- C30
   v_prs_bedrijf_contact_telefoon   VARCHAR2 (256);                     -- C20
   v_prs_bedrijf_contact_fax        VARCHAR2 (256);                     -- C20
   v_prs_bedrijf_leverancier        VARCHAR2 (256);                      -- N1
   v_prs_bedrijf_uitvoerende        VARCHAR2 (256);                      -- N1
   v_prs_bedrijf_contract           VARCHAR2 (256);                      -- N1
   v_prs_bedrijf_huurder            VARCHAR2 (256);                      -- N1
   v_prs_bedrijf_ingids             VARCHAR2 (256);                      -- N1
   v_prs_bedrijf_uurloon            VARCHAR2 (256);                    -- N6,2
   v_prs_overeenkomst_nr            VARCHAR2 (256);                     -- C20
   v_prs_overeenkomst_datum         VARCHAR2 (256);                    -- DATE
   v_prs_bedrijf_email              VARCHAR2 (256);                    -- C100
   v_prs_bedrijf_opmerking          VARCHAR2 (512);                    -- C320
   v_prs_dienst_omschrijving        VARCHAR2 (256);                     -- C60
   v_alg_locatie_code               VARCHAR2 (256);                     -- C10
   v_alg_gebouw_code                VARCHAR2 (256);                     -- C10
   v_prs_bedrijf_overig1            VARCHAR2 (256);                    -- C256
   v_prs_bedrijf_overig2            VARCHAR2 (256);                    -- C256
   v_prs_bedrijf_overig3            VARCHAR2 (256);                    -- C256

   -- Overig:
   v_prs_bedrijf_leverancier_n      NUMBER (1);                          -- N1
   v_prs_bedrijf_uitvoerende_n      NUMBER (1);                          -- N1
   v_prs_bedrijf_contract_n         NUMBER (1);                          -- N1
   v_prs_bedrijf_huurder_n          NUMBER (1);                          -- N1
   v_prs_bedrijf_ingids_n           NUMBER (1);                          -- N1
   v_prs_bedrijf_uurloon_n          NUMBER (6, 2);                     -- N6,2
   v_prs_overeenkomst_date          DATE;                              -- DATE

   CURSOR c1
   IS
        SELECT   *
          FROM   fac_imp_file
         WHERE   fac_imp_file_applicatie = p_applname
      ORDER BY   fac_imp_file_index;
BEGIN
   -- Eerst opruiming
   DELETE FROM   imp_log
         WHERE   imp_log_applicatie = p_applname;

   DELETE FROM   skaf_imp_ext_bedrijf;

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

   FOR rec1 IN c1
   LOOP
      BEGIN
         v_newline := rec1.fac_imp_file_line;
         v_errormsg := 'Fout opvragen te importeren rij';
         v_aanduiding := '';
         v_ongeldig := 0;
         -- Lees alle veldwaarden
         fac.imp_getfield (v_newline, c_delim, v_prs_bedrijf_naam);
         fac.imp_getfield (v_newline, c_delim, v_prs_leverancier_nr);
         fac.imp_getfield (v_newline, c_delim, v_prs_bedrijf_bezoek_adres);
         fac.imp_getfield (v_newline, c_delim, v_prs_bedrijf_bezoek_postcode);
         fac.imp_getfield (v_newline, c_delim, v_prs_bedrijf_bezoek_plaats);
         fac.imp_getfield (v_newline, c_delim, v_prs_bedrijf_bezoek_land);
         fac.imp_getfield (v_newline, c_delim, v_prs_bedrijf_post_adres);
         fac.imp_getfield (v_newline, c_delim, v_prs_bedrijf_post_postcode);
         fac.imp_getfield (v_newline, c_delim, v_prs_bedrijf_post_plaats);
         fac.imp_getfield (v_newline, c_delim, v_prs_bedrijf_post_land);
         fac.imp_getfield (v_newline, c_delim, v_prs_bedrijf_telefoon);
         fac.imp_getfield (v_newline, c_delim, v_prs_bedrijf_fax);
         fac.imp_getfield (v_newline, c_delim, v_prs_bedrijf_email);
         fac.imp_getfield (v_newline, c_delim, v_prs_bedrijf_contact_persoon);
         fac.imp_getfield (v_newline,
                           c_delim,
                           v_prs_bedrijf_contact_telefoon);
         fac.imp_getfield (v_newline, c_delim, v_prs_bedrijf_contact_fax);
         fac.imp_getfield (v_newline, c_delim, v_prs_bedrijf_leverancier);
         fac.imp_getfield (v_newline, c_delim, v_prs_bedrijf_uitvoerende);
         fac.imp_getfield (v_newline, c_delim, v_prs_bedrijf_contract);
         fac.imp_getfield (v_newline, c_delim, v_prs_bedrijf_huurder);
         fac.imp_getfield (v_newline, c_delim, v_prs_bedrijf_ingids);
         fac.imp_getfield (v_newline, c_delim, v_prs_bedrijf_uurloon);
         fac.imp_getfield (v_newline, c_delim, v_prs_overeenkomst_nr);
         fac.imp_getfield (v_newline, c_delim, v_prs_overeenkomst_datum);
         fac.imp_getfield (v_newline, c_delim, v_prs_bedrijf_opmerking);
         fac.imp_getfield (v_newline, c_delim, v_prs_dienst_omschrijving);
         fac.imp_getfield (v_newline, c_delim, v_alg_locatie_code);
         fac.imp_getfield (v_newline, c_delim, v_alg_gebouw_code);
         fac.imp_getfield (v_newline, c_delim, v_prs_bedrijf_overig1);
         fac.imp_getfield (v_newline, c_delim, v_prs_bedrijf_overig2);
         fac.imp_getfield (v_newline, c_delim, v_prs_bedrijf_overig3);
         v_aanduiding := '[' || v_prs_bedrijf_naam || '] ';

         -- Ik controleer of ik een geldige header heb, dat is: in de juiste kolommen
         -- de juiste kolomkop. Ik controleer daarbij ALLE kolommen!
         -- Ik negeer alles totdat ik een geldige header ben gepasseerd.
         IF (header_is_valid = 0)
         THEN
            IF     UPPER (v_prs_bedrijf_naam) = 'BEDRIJFSNAAM'
               AND UPPER (v_prs_leverancier_nr) = 'LEVERANCIERNUMMER'
               AND UPPER (v_prs_bedrijf_bezoek_adres) = 'BEZOEK_ADRES'
               AND UPPER (v_prs_bedrijf_bezoek_postcode) = 'BEZOEK_POSTCODE'
               AND UPPER (v_prs_bedrijf_bezoek_plaats) = 'BEZOEK_PLAATS'
               AND UPPER (v_prs_bedrijf_bezoek_land) = 'BEZOEK_LAND'
               AND UPPER (v_prs_bedrijf_post_adres) = 'POST_ADRES'
               AND UPPER (v_prs_bedrijf_post_postcode) = 'POST_POSTCODE'
               AND UPPER (v_prs_bedrijf_post_plaats) = 'POST_PLAATS'
               AND UPPER (v_prs_bedrijf_post_land) = 'POST_LAND'
               AND UPPER (v_prs_bedrijf_telefoon) = 'BEDRIJF_TELEFOON'
               AND UPPER (v_prs_bedrijf_fax) = 'BEDRIJF_FAX'
               AND UPPER (v_prs_bedrijf_email) = 'BEDRIJF_EMAIL'
               AND UPPER (v_prs_bedrijf_contact_persoon) = 'CONTACTPERSOON'
               AND UPPER (v_prs_bedrijf_contact_telefoon) =
                     'CONTACT_TELEFOON'
               AND UPPER (v_prs_bedrijf_contact_fax) = 'CONTACT_FAX'
               AND UPPER (v_prs_bedrijf_leverancier) = 'LEVERANCIER'
               AND UPPER (v_prs_bedrijf_uitvoerende) = 'UITVOERENDE'
               AND UPPER (v_prs_bedrijf_contract) = 'CONTRACTANT'
               AND UPPER (v_prs_bedrijf_huurder) = 'HUURDER'
               AND UPPER (v_prs_bedrijf_ingids) = 'TOONINGIDS'
               AND UPPER (v_prs_bedrijf_uurloon) = 'UURLOON'
               AND UPPER (v_prs_overeenkomst_nr) = 'OVEREENKOMSTNUMMER'
               AND UPPER (v_prs_overeenkomst_datum) = 'OVEREENKOMSTDATUM'
               AND UPPER (v_prs_bedrijf_opmerking) = 'OPMERKING'
               AND UPPER (v_prs_dienst_omschrijving) = 'DIENST'
               AND UPPER (v_alg_locatie_code) = 'LOCATIECODE'
               AND UPPER (v_alg_gebouw_code) = 'GEBOUWCODE'
            THEN
               header_is_valid := 1;
            END IF;
         ELSE
            v_count_tot := v_count_tot + 1;
            -- Controleer alle veldwaarden

            v_errorhint := 'Bedrijfsnaam te lang';
            v_prs_bedrijf_naam := TRIM (v_prs_bedrijf_naam);

            IF LENGTH (v_prs_bedrijf_naam) > 60
            THEN
               v_prs_bedrijf_naam := SUBSTR (TRIM (v_prs_bedrijf_naam), 1, 60);
               fac.imp_writelog (
                  p_applname,
                  p_applrun,
                  'W',
                  v_aanduiding || v_errorhint,
                     'Bedrijfsnaam wordt afgebroken tot ['
                  || v_prs_bedrijf_naam
                  || ']'
               );
            END IF;

            v_errorhint := 'Leveranciernummer te lang';
            v_prs_leverancier_nr := TRIM (v_prs_leverancier_nr);

            IF LENGTH (v_prs_leverancier_nr) > 50
            THEN
               v_prs_leverancier_nr :=
                  SUBSTR (TRIM (v_prs_leverancier_nr), 1, 50);
               fac.imp_writelog (
                  p_applname,
                  p_applrun,
                  'W',
                  v_aanduiding || v_errorhint,
                     'Leveranciernummer wordt afgebroken tot ['
                  || v_prs_leverancier_nr
                  || ']'
               );
            END IF;

            v_errorhint := 'Bezoek/adres te lang';
            v_prs_bedrijf_bezoek_adres := TRIM (v_prs_bedrijf_bezoek_adres);

            IF LENGTH (v_prs_bedrijf_bezoek_adres) > 35
            THEN
               v_prs_bedrijf_bezoek_adres :=
                  SUBSTR (TRIM (v_prs_bedrijf_bezoek_adres), 1, 35);
               fac.imp_writelog (
                  p_applname,
                  p_applrun,
                  'W',
                  v_aanduiding || v_errorhint,
                     'Bezoek/adres wordt afgebroken tot ['
                  || v_prs_bedrijf_bezoek_adres
                  || ']'
               );
            END IF;

            v_errorhint := 'Bezoek/postcode te lang';
            v_prs_bedrijf_bezoek_postcode :=
               TRIM (v_prs_bedrijf_bezoek_postcode);

            IF LENGTH (v_prs_bedrijf_bezoek_postcode) > 12
            THEN
               v_prs_bedrijf_bezoek_postcode :=
                  SUBSTR (TRIM (v_prs_bedrijf_bezoek_postcode), 1, 12);
               fac.imp_writelog (
                  p_applname,
                  p_applrun,
                  'W',
                  v_aanduiding || v_errorhint,
                     'Bezoek/postcode wordt afgebroken tot ['
                  || v_prs_bedrijf_bezoek_postcode
                  || ']'
               );
            END IF;

            v_errorhint := 'Bezoek/plaats te lang';
            v_prs_bedrijf_bezoek_plaats := TRIM (v_prs_bedrijf_bezoek_plaats);

            IF LENGTH (v_prs_bedrijf_bezoek_plaats) > 30
            THEN
               v_prs_bedrijf_bezoek_plaats :=
                  SUBSTR (TRIM (v_prs_bedrijf_bezoek_plaats), 1, 30);
               fac.imp_writelog (
                  p_applname,
                  p_applrun,
                  'W',
                  v_aanduiding || v_errorhint,
                     'Bezoek/plaats wordt afgebroken tot ['
                  || v_prs_bedrijf_bezoek_plaats
                  || ']'
               );
            END IF;

            v_errorhint := 'Bezoek/land te lang';
            v_prs_bedrijf_bezoek_land := TRIM (v_prs_bedrijf_bezoek_land);

            IF LENGTH (v_prs_bedrijf_bezoek_land) > 30
            THEN
               v_prs_bedrijf_bezoek_land :=
                  SUBSTR (TRIM (v_prs_bedrijf_bezoek_land), 1, 30);
               fac.imp_writelog (
                  p_applname,
                  p_applrun,
                  'W',
                  v_aanduiding || v_errorhint,
                     'Bezoek/land wordt afgebroken tot ['
                  || v_prs_bedrijf_bezoek_land
                  || ']'
               );
            END IF;

            v_errorhint := 'Post/adres te lang';
            v_prs_bedrijf_post_adres := TRIM (v_prs_bedrijf_post_adres);

            IF LENGTH (v_prs_bedrijf_post_adres) > 35
            THEN
               v_prs_bedrijf_post_adres :=
                  SUBSTR (TRIM (v_prs_bedrijf_post_adres), 1, 35);
               fac.imp_writelog (
                  p_applname,
                  p_applrun,
                  'W',
                  v_aanduiding || v_errorhint,
                     'Post/adres wordt afgebroken tot ['
                  || v_prs_bedrijf_post_adres
                  || ']'
               );
            END IF;

            v_errorhint := 'Post/postcode te lang';
            v_prs_bedrijf_post_postcode := TRIM (v_prs_bedrijf_post_postcode);

            IF LENGTH (v_prs_bedrijf_post_postcode) > 12
            THEN
               v_prs_bedrijf_post_postcode :=
                  SUBSTR (TRIM (v_prs_bedrijf_post_postcode), 1, 12);
               fac.imp_writelog (
                  p_applname,
                  p_applrun,
                  'W',
                  v_aanduiding || v_errorhint,
                     'Post/postcode wordt afgebroken tot ['
                  || v_prs_bedrijf_post_postcode
                  || ']'
               );
            END IF;

            v_errorhint := 'Post/plaats te lang';
            v_prs_bedrijf_post_plaats := TRIM (v_prs_bedrijf_post_plaats);

            IF LENGTH (v_prs_bedrijf_post_plaats) > 30
            THEN
               v_prs_bedrijf_post_plaats :=
                  SUBSTR (TRIM (v_prs_bedrijf_post_plaats), 1, 30);
               fac.imp_writelog (
                  p_applname,
                  p_applrun,
                  'W',
                  v_aanduiding || v_errorhint,
                     'Post/plaats wordt afgebroken tot ['
                  || v_prs_bedrijf_post_plaats
                  || ']'
               );
            END IF;

            v_errorhint := 'Post/land te lang';
            v_prs_bedrijf_post_land := TRIM (v_prs_bedrijf_post_land);

            IF LENGTH (v_prs_bedrijf_post_land) > 30
            THEN
               v_prs_bedrijf_post_land :=
                  SUBSTR (TRIM (v_prs_bedrijf_post_land), 1, 30);
               fac.imp_writelog (
                  p_applname,
                  p_applrun,
                  'W',
                  v_aanduiding || v_errorhint,
                     'Post/land wordt afgebroken tot ['
                  || v_prs_bedrijf_post_land
                  || ']'
               );
            END IF;

            v_errorhint := 'Bedrijf/telefoon te lang';
            v_prs_bedrijf_telefoon := TRIM (v_prs_bedrijf_telefoon);

            IF LENGTH (v_prs_bedrijf_telefoon) > 20
            THEN
               v_prs_bedrijf_telefoon :=
                  SUBSTR (TRIM (v_prs_bedrijf_telefoon), 1, 20);
               fac.imp_writelog (
                  p_applname,
                  p_applrun,
                  'W',
                  v_aanduiding || v_errorhint,
                     'Bedrijf/telefoon wordt afgebroken tot ['
                  || v_prs_bedrijf_telefoon
                  || ']'
               );
            END IF;

            v_errorhint := 'Bedrijf/fax te lang';
            v_prs_bedrijf_fax := TRIM (v_prs_bedrijf_fax);

            IF LENGTH (v_prs_bedrijf_fax) > 20
            THEN
               v_prs_bedrijf_fax := SUBSTR (TRIM (v_prs_bedrijf_fax), 1, 20);
               fac.imp_writelog (
                  p_applname,
                  p_applrun,
                  'W',
                  v_aanduiding || v_errorhint,
                     'Bedrijf/fax wordt afgebroken tot ['
                  || v_prs_bedrijf_fax
                  || ']'
               );
            END IF;

            v_errorhint := 'Bedrijf/e-mail te lang';
            v_prs_bedrijf_email := TRIM (v_prs_bedrijf_email);

            IF LENGTH (v_prs_bedrijf_email) > 100
            THEN
               v_prs_bedrijf_email :=
                  SUBSTR (TRIM (v_prs_bedrijf_email), 1, 100);
               fac.imp_writelog (
                  p_applname,
                  p_applrun,
                  'W',
                  v_aanduiding || v_errorhint,
                     'Bedrijf/e-mail wordt afgebroken tot ['
                  || v_prs_bedrijf_email
                  || ']'
               );
            END IF;

            v_errorhint := 'Contactpersoon te lang';
            v_prs_bedrijf_contact_persoon :=
               TRIM (v_prs_bedrijf_contact_persoon);

            IF LENGTH (v_prs_bedrijf_contact_persoon) > 30
            THEN
               v_prs_bedrijf_contact_persoon :=
                  SUBSTR (TRIM (v_prs_bedrijf_contact_persoon), 1, 30);
               fac.imp_writelog (
                  p_applname,
                  p_applrun,
                  'W',
                  v_aanduiding || v_errorhint,
                     'Contactpersoon wordt afgebroken tot ['
                  || v_prs_bedrijf_contact_persoon
                  || ']'
               );
            END IF;

            v_errorhint := 'Contact/telefoon te lang';
            v_prs_bedrijf_contact_telefoon :=
               TRIM (v_prs_bedrijf_contact_telefoon);

            IF LENGTH (v_prs_bedrijf_contact_telefoon) > 20
            THEN
               v_prs_bedrijf_contact_telefoon :=
                  SUBSTR (TRIM (v_prs_bedrijf_contact_telefoon), 1, 20);
               fac.imp_writelog (
                  p_applname,
                  p_applrun,
                  'W',
                  v_aanduiding || v_errorhint,
                     'Contact/telefoon wordt afgebroken tot ['
                  || v_prs_bedrijf_contact_telefoon
                  || ']'
               );
            END IF;

            v_errorhint := 'Contact/fax te lang';
            v_prs_bedrijf_contact_fax := TRIM (v_prs_bedrijf_contact_fax);

            IF LENGTH (v_prs_bedrijf_contact_fax) > 20
            THEN
               v_prs_bedrijf_contact_fax :=
                  SUBSTR (TRIM (v_prs_bedrijf_contact_fax), 1, 20);
               fac.imp_writelog (
                  p_applname,
                  p_applrun,
                  'W',
                  v_aanduiding || v_errorhint,
                     'Contact/fax wordt afgebroken tot ['
                  || v_prs_bedrijf_contact_fax
                  || ']'
               );
            END IF;

            -- Verder geen foutdetectie; kan dus stricter?
            SELECT   DECODE (
                        SUBSTR (TRIM (UPPER (v_prs_bedrijf_leverancier)),
                                1,
                                1),
                        'J',
                        1,
                        0
                     )
              INTO   v_prs_bedrijf_leverancier_n
              FROM   DUAL;

            -- Verder geen foutdetectie; kan dus stricter?
            SELECT   DECODE (
                        SUBSTR (TRIM (UPPER (v_prs_bedrijf_uitvoerende)),
                                1,
                                1),
                        'J',
                        1,
                        0
                     )
              INTO   v_prs_bedrijf_uitvoerende_n
              FROM   DUAL;

            -- Verder geen foutdetectie; kan dus stricter?
            SELECT   DECODE (
                        SUBSTR (TRIM (UPPER (v_prs_bedrijf_contract)), 1, 1),
                        'J',
                        1,
                        0
                     )
              INTO   v_prs_bedrijf_contract_n
              FROM   DUAL;

            -- Verder geen foutdetectie; kan dus stricter?
            SELECT   DECODE (
                        SUBSTR (TRIM (UPPER (v_prs_bedrijf_huurder)), 1, 1),
                        'J',
                        1,
                        0
                     )
              INTO   v_prs_bedrijf_huurder_n
              FROM   DUAL;

            -- Verder geen foutdetectie; kan dus stricter?
            SELECT   DECODE (
                        SUBSTR (TRIM (UPPER (v_prs_bedrijf_ingids)), 1, 1),
                        'J',
                        1,
                        0
                     )
              INTO   v_prs_bedrijf_ingids_n
              FROM   DUAL;

            v_errorhint := 'Ongeldig uurloon; maximale grootte 9999.99';

            BEGIN
               v_prs_bedrijf_uurloon_n :=
                  fac.safe_to_number (v_prs_bedrijf_uurloon);
            EXCEPTION
               WHEN OTHERS
               THEN
                  v_ongeldig := 1;
                  oracle_err_num := SQLCODE;
                  oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
                  v_errormsg :=
                        v_errorhint
                     || ' ORACLE (error '
                     || oracle_err_num
                     || '/'
                     || oracle_err_mes
                     || ')';
                  fac.imp_writelog (p_applname,
                                    p_applrun,
                                    'E',
                                    v_aanduiding || v_errormsg,
                                    'Regel wordt overgeslagen!');
            END;

            v_errorhint := 'Overeenkomstnummer te lang';
            v_prs_overeenkomst_nr := TRIM (v_prs_overeenkomst_nr);

            IF LENGTH (v_prs_overeenkomst_nr) > 20
            THEN
               v_prs_overeenkomst_nr :=
                  SUBSTR (TRIM (v_prs_overeenkomst_nr), 1, 20);
               fac.imp_writelog (
                  p_applname,
                  p_applrun,
                  'W',
                  v_aanduiding || v_errorhint,
                     'Overeenkomstnummer wordt afgebroken tot ['
                  || v_prs_overeenkomst_nr
                  || ']'
               );
            END IF;

            v_errorhint := 'Ongeldige overeenkomstdatum';
            v_prs_overeenkomst_datum := TRIM (v_prs_overeenkomst_datum);

            IF v_prs_overeenkomst_datum IS NOT NULL
            THEN
               BEGIN
                  v_prs_overeenkomst_date :=
                     TO_DATE (v_prs_overeenkomst_datum, 'dd-mm-yyyy');
               EXCEPTION
                  WHEN OTHERS
                  THEN
                     v_ongeldig := 1;
                     oracle_err_num := SQLCODE;
                     oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
                     v_errormsg :=
                           v_errorhint
                        || ' ORACLE (error '
                        || oracle_err_num
                        || '/'
                        || oracle_err_mes
                        || ')';
                     fac.imp_writelog (p_applname,
                                       p_applrun,
                                       'E',
                                       v_aanduiding || v_errormsg,
                                       'Regel wordt overgeslagen!');
                     COMMIT;
               END;
            ELSE
               v_prs_overeenkomst_date := NULL;
            END IF;

            v_errorhint := 'Opmerking te lang';
            v_prs_bedrijf_opmerking := TRIM (v_prs_bedrijf_opmerking);

            IF LENGTH (v_prs_bedrijf_opmerking) > 320
            THEN
               v_prs_bedrijf_opmerking :=
                  SUBSTR (TRIM (v_prs_bedrijf_opmerking), 1, 320);
               fac.imp_writelog (
                  p_applname,
                  p_applrun,
                  'W',
                  v_aanduiding || v_errorhint,
                     'Opmerking wordt afgebroken tot ['
                  || v_prs_bedrijf_opmerking
                  || ']'
               );
            END IF;

            v_errorhint := 'Dienst te lang';
            v_prs_dienst_omschrijving := TRIM (v_prs_dienst_omschrijving);

            IF LENGTH (v_prs_dienst_omschrijving) > 60
            THEN
               v_prs_dienst_omschrijving :=
                  SUBSTR (TRIM (v_prs_dienst_omschrijving), 1, 60);
               fac.imp_writelog (
                  p_applname,
                  p_applrun,
                  'W',
                  v_aanduiding || v_errorhint,
                     'Dienst wordt afgebroken tot ['
                  || v_prs_dienst_omschrijving
                  || ']'
               );
            END IF;

            v_errorhint := 'Locatiecode te lang';
            v_alg_locatie_code := TRIM (v_alg_locatie_code);

            IF LENGTH (v_alg_locatie_code) > 10
            THEN
               v_alg_locatie_code := NULL;
               fac.imp_writelog (
                  p_applname,
                  p_applrun,
                  'E',
                  v_aanduiding || v_errorhint,
                  'Locatiecode is te lang [' || v_alg_locatie_code || ']'
               );
            END IF;

            v_errorhint := 'Gebouwcode te lang';
            v_alg_gebouw_code := TRIM (v_alg_gebouw_code);

            IF LENGTH (v_alg_gebouw_code) > 10
            THEN
               v_alg_gebouw_code := NULL;
               fac.imp_writelog (
                  p_applname,
                  p_applrun,
                  'E',
                  v_aanduiding || v_errorhint,
                  'Gebouwcode is te lang [' || v_alg_gebouw_code || ']'
               );
            END IF;

            -- Insert geformatteerde import record
            IF v_ongeldig = 0
            THEN
               BEGIN
                  INSERT INTO skaf_imp_ext_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,
                                                       prs_dienst_omschrijving,
                                                       alg_locatie_code,
                                                       alg_gebouw_code,
                                                       prs_bedrijf_overig1,
                                                       prs_bedrijf_overig2,
                                                       prs_bedrijf_overig3
                             )
                    VALUES   (v_prs_bedrijf_naam,
                              v_prs_leverancier_nr,
                              v_prs_bedrijf_bezoek_adres,
                              v_prs_bedrijf_bezoek_postcode,
                              v_prs_bedrijf_bezoek_plaats,
                              v_prs_bedrijf_bezoek_land,
                              v_prs_bedrijf_post_adres,
                              v_prs_bedrijf_post_postcode,
                              v_prs_bedrijf_post_plaats,
                              v_prs_bedrijf_post_land,
                              v_prs_bedrijf_telefoon,
                              v_prs_bedrijf_fax,
                              v_prs_bedrijf_email,
                              v_prs_bedrijf_contact_persoon,
                              v_prs_bedrijf_contact_telefoon,
                              v_prs_bedrijf_contact_fax,
                              v_prs_bedrijf_leverancier_n,
                              v_prs_bedrijf_uitvoerende_n,
                              v_prs_bedrijf_contract_n,
                              v_prs_bedrijf_huurder_n,
                              v_prs_bedrijf_ingids_n,
                              v_prs_bedrijf_uurloon_n,
                              v_prs_overeenkomst_nr,
                              v_prs_overeenkomst_date,
                              v_prs_bedrijf_opmerking,
                              v_prs_dienst_omschrijving,
                              v_alg_locatie_code,
                              v_alg_gebouw_code,
                              v_prs_bedrijf_overig1,
                              v_prs_bedrijf_overig2,
                              v_prs_bedrijf_overig3);

                  v_count_import := v_count_import + 1;
               EXCEPTION
                  WHEN OTHERS
                  THEN
                     oracle_err_num := SQLCODE;
                     oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
                     v_errormsg :=
                           'ORACLE (error '
                        || oracle_err_num
                        || '/'
                        || oracle_err_mes
                        || ')';
                     fac.imp_writelog (
                        p_applname,
                        p_applrun,
                        'E',
                        v_aanduiding || v_errormsg,
                        'Fout bij toevoegen regel aan importtabel skaf_IMP_EXT_BEDRIJF.'
                     );
               END;
            END IF;
         END IF;
      END;
   END LOOP;

   IF (header_is_valid = 0)
   THEN
      fac.imp_writelog (p_applname,
                        p_applrun,
                        'E',
                        'Ongeldig importbestand',
                        'Geen header of header niet volgens specificatie!');
   ELSE
      fac.imp_writelog (
         p_applname,
         p_applrun,
         'S',
         'Relaties: aantal ingelezen importregels: ' || TO_CHAR (v_count_tot),
         ''
      );
      fac.imp_writelog (
         p_applname,
         p_applrun,
         'S',
         'Relaties: aantal ongeldige niet ingelezen importregels: '
         || TO_CHAR (v_count_tot - v_count_import),
         ''
      );
   END IF;

   COMMIT;
EXCEPTION
   WHEN OTHERS
   THEN
      oracle_err_num := SQLCODE;
      oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
      v_errormsg :=
         'ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
      fac.imp_writelog (p_applname,
                        p_applrun,
                        'E',
                        v_errormsg,
                        'Inleesproces relaties afgebroken!');
END skaf_import_ext_bedrijf;
/

/* Formatted on 7-1-2010 13:48:48 (QP5 v5.115.810.9015) */
CREATE OR REPLACE PROCEDURE skaf_update_ext_bedrijf (
   p_applname   IN VARCHAR2,
   p_applrun    IN VARCHAR2
)
AS
   CURSOR c_bedrijf
   IS
        SELECT   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
          FROM   skaf_imp_ext_bedrijf
      GROUP BY   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;

   CURSOR c_dienst
   IS
      SELECT   DISTINCT prs_dienst_omschrijving
        FROM   skaf_imp_ext_bedrijf
       WHERE   prs_dienst_omschrijving IS NOT NULL;

   CURSOR c_dienstlocgebouw
   IS
      SELECT   prs_dienst_omschrijving,
               alg_locatie_code,
               alg_gebouw_code,
               prs_bedrijf_naam
        FROM   skaf_imp_ext_bedrijf
       WHERE   prs_dienst_omschrijving IS NOT NULL;

   v_errormsg          VARCHAR2 (1000);
   v_error_hint        VARCHAR2 (1000);
   oracle_err_num      NUMBER;
   oracle_err_mes      VARCHAR2 (200);
   v_count_tot         NUMBER (10);
   v_count_update      NUMBER (10);
   v_alg_locatie_key   NUMBER (10);
   v_alg_gebouw_key    NUMBER (10);
   v_prs_dienst_key    NUMBER (10);
   v_prs_bedrijf_key   NUMBER (10);
BEGIN
   v_count_tot := 0;
   v_count_update := 0;

   FOR rec1 IN c_bedrijf
   LOOP
      BEGIN
         v_count_tot := v_count_tot + 1;
         v_errormsg :=
               'Kan relatie niet wegschrijven ['
            || rec1.prs_bedrijf_naam
            || '] ';

         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   (rec1.prs_bedrijf_naam,
                     rec1.prs_leverancier_nr,
                     rec1.prs_bedrijf_bezoek_adres,
                     rec1.prs_bedrijf_bezoek_postcode,
                     rec1.prs_bedrijf_bezoek_plaats,
                     rec1.prs_bedrijf_bezoek_land,
                     rec1.prs_bedrijf_post_adres,
                     rec1.prs_bedrijf_post_postcode,
                     rec1.prs_bedrijf_post_plaats,
                     rec1.prs_bedrijf_post_land,
                     rec1.prs_bedrijf_telefoon,
                     rec1.prs_bedrijf_fax,
                     rec1.prs_bedrijf_email,
                     rec1.prs_bedrijf_contact_persoon,
                     rec1.prs_bedrijf_contact_telefoon,
                     rec1.prs_bedrijf_contact_fax,
                     DECODE (rec1.prs_bedrijf_leverancier, 1, 1, NULL),
                     DECODE (rec1.prs_bedrijf_uitvoerende, 1, 1, NULL),
                     DECODE (rec1.prs_bedrijf_contract, 1, 1, NULL),
                     DECODE (rec1.prs_bedrijf_huurder, 1, 1, NULL),
                     DECODE (rec1.prs_bedrijf_ingids, 1, 1, NULL),
                     rec1.prs_bedrijf_uurloon,
                     rec1.prs_overeenkomst_nr,
                     rec1.prs_overeenkomst_datum,
                     rec1.prs_bedrijf_opmerking);

         v_count_update := v_count_update + 1;

         COMMIT;
      EXCEPTION
         WHEN OTHERS
         THEN
            v_error_hint := v_errormsg;
            oracle_err_num := SQLCODE;
            oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
            v_errormsg :=
                  v_errormsg
               || 'ORACLE (error '
               || oracle_err_num
               || '/'
               || oracle_err_mes
               || ')';
            fac.imp_writelog (p_applname,
                              p_applrun,
                              'E',
                              v_errormsg,
                              v_error_hint);
            COMMIT;                                             -- tbv logging
      END;
   END LOOP;

   fac.imp_writelog (p_applname,
                     p_applrun,
                     'S',
                     'Relaties: aantal ingelezen: ' || TO_CHAR (v_count_tot),
                     '');
   fac.imp_writelog (
      p_applname,
      p_applrun,
      'S',
      'Relaties: aantal toegevoegd: ' || TO_CHAR (v_count_update),
      ''
   );


   v_count_tot := 0;
   v_count_update := 0;

   FOR rec2 IN c_dienst
   LOOP
      BEGIN
         v_count_tot := v_count_tot + 1;

         v_errormsg :=
               'Kan dienst niet bepalen ['
            || rec2.prs_dienst_omschrijving
            || '] ';

         BEGIN
            SELECT   prs_dienst_key
              INTO   v_prs_dienst_key
              FROM   prs_dienst
             WHERE   UPPER (prs_dienst_omschrijving) =
                        UPPER (rec2.prs_dienst_omschrijving);
         EXCEPTION
            WHEN NO_DATA_FOUND
            THEN
               v_errormsg :=
                     'Kan dienst niet wegschrijven ['
                  || rec2.prs_dienst_omschrijving
                  || '] ';

               INSERT INTO prs_dienst (prs_dienst_omschrijving)
                 VALUES   (rec2.prs_dienst_omschrijving);
         END;

         v_count_update := v_count_update + 1;

         COMMIT;
      EXCEPTION
         WHEN OTHERS
         THEN
            v_error_hint := v_errormsg;
            oracle_err_num := SQLCODE;
            oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
            v_errormsg :=
                  v_errormsg
               || 'ORACLE (error '
               || oracle_err_num
               || '/'
               || oracle_err_mes
               || ')';
            fac.imp_writelog (p_applname,
                              p_applrun,
                              'E',
                              v_errormsg,
                              v_error_hint);
            COMMIT;                                             -- tbv logging
      END;
   END LOOP;



   fac.imp_writelog (p_applname,
                     p_applrun,
                     'S',
                     'Diensten: aantal ingelezen: ' || TO_CHAR (v_count_tot),
                     '');
   fac.imp_writelog (
      p_applname,
      p_applrun,
      'S',
      'Diensten: aantal toegevoegd: ' || TO_CHAR (v_count_update),
      ''
   );

   v_count_tot := 0;
   v_count_update := 0;

   FOR rec3 IN c_dienstlocgebouw
   LOOP
      BEGIN
         v_count_tot := v_count_tot + 1;

         v_errormsg :=
               'Kan dienst niet bepalen ['
            || rec3.prs_dienst_omschrijving
            || '] ';

         SELECT   prs_dienst_key
           INTO   v_prs_dienst_key
           FROM   prs_dienst
          WHERE   prs_dienst_omschrijving = rec3.prs_dienst_omschrijving;

         v_errormsg :=
            'Kan locatie niet bepalen [' || rec3.alg_locatie_code || '] ';

         IF rec3.alg_locatie_code IS NOT NULL
         THEN
            SELECT   alg_locatie_key
              INTO   v_alg_locatie_key
              FROM   alg_v_aanweziglocatie
             WHERE   alg_locatie_code = rec3.alg_locatie_code;
         ELSE
            v_alg_locatie_key := NULL;
         END IF;

         v_errormsg :=
            'Kan gebouw niet bepalen [' || rec3.alg_gebouw_code || '] ';

         IF rec3.alg_gebouw_code IS NOT NULL
         THEN
            SELECT   alg_gebouw_key
              INTO   v_alg_gebouw_key
              FROM   alg_v_aanweziggebouw
             WHERE   alg_gebouw_code = rec3.alg_gebouw_code
                     AND alg_locatie_key = v_alg_locatie_key;
         ELSE
            v_alg_gebouw_key := NULL;
         END IF;

         v_errormsg :=
            'Kan bedrijf niet bepalen [' || rec3.prs_bedrijf_naam || '] ';

         SELECT   prs_bedrijf_key
           INTO   v_prs_bedrijf_key
           FROM   prs_v_aanwezigbedrijf
          WHERE   prs_bedrijf_naam = rec3.prs_bedrijf_naam;

         v_errormsg :=
               'Kan bedrijf/dienst/loc/gebouw niet wegschrijven ['
            || rec3.prs_bedrijf_naam
            || '/'
            || rec3.prs_dienst_omschrijving
            || '/'
            || rec3.alg_locatie_code
            || '/'
            || rec3.alg_gebouw_code
            || '] ';


         INSERT INTO prs_bedrijfdienstlocatie (
                                                  prs_dienst_key,
                                                  prs_bedrijf_key,
                                                  alg_locatie_key,
                                                  alg_gebouw_key
                    )
           VALUES   (
                        v_prs_dienst_key,
                        v_prs_bedrijf_key,
                        DECODE (v_alg_gebouw_key,
                                NULL, v_alg_locatie_key,
                                NULL),
                        v_alg_gebouw_key
                    );

         v_count_update := v_count_update + 1;

         COMMIT;
      EXCEPTION
         WHEN OTHERS
         THEN
            v_error_hint := v_errormsg;
            oracle_err_num := SQLCODE;
            oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
            v_errormsg :=
                  v_errormsg
               || 'ORACLE (error '
               || oracle_err_num
               || '/'
               || oracle_err_mes
               || ')';
            fac.imp_writelog (p_applname,
                              p_applrun,
                              'E',
                              v_errormsg,
                              v_error_hint);
            COMMIT;                                             -- tbv logging
      END;
   END LOOP;



   fac.imp_writelog (
      p_applname,
      p_applrun,
      'S',
      'Bedrijf/dienst/locatie: aantal ingelezen: ' || TO_CHAR (v_count_tot),
      ''
   );
   fac.imp_writelog (
      p_applname,
      p_applrun,
      'S',
      'Bedrijf/dienst/locatie: aantal toegevoegd: '
      || TO_CHAR (v_count_update),
      ''
   );

   COMMIT;
EXCEPTION
   WHEN OTHERS
   THEN
      oracle_err_num := SQLCODE;
      oracle_err_mes := SUBSTR (SQLERRM, 1, 150);
      v_errormsg :=
            v_errormsg
         || 'ORACLE (error '
         || oracle_err_num
         || '/'
         || oracle_err_mes
         || ')';
      fac.imp_writelog (p_applname,
                        p_applrun,
                        'E',
                        'Importproces relaties afgebroken!',
                        v_errormsg);
END skaf_update_ext_bedrijf;
/

COMMIT;
SPOOL OFF;
