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

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 PROCEDURE dvon_import_prs (p_import_key IN NUMBER)
AS
   oracle_err_num            NUMBER;
   oracle_err_mes            VARCHAR2 (200);
   v_errormsg                VARCHAR2 (400);
   v_errorhint               VARCHAR2 (400);
   v_newline                 FAC_IMP_FILE.FAC_IMP_FILE_LINE%TYPE;
BEGIN

   BEGIN
      SELECT fac_imp_file_line
        INTO v_newline
        FROM fac_imp_file
       WHERE fac_import_key = p_import_key
         AND fac_imp_file_index = 1;

      IF v_newline LIKE
                  CHR (TO_NUMBER ('EF', 'xx'))
               || CHR (TO_NUMBER ('BB', 'xx'))
               || CHR (TO_NUMBER ('BF', 'xx'))
               || '%'
      THEN
         -- EF BB BF aangetroffen
         fac.imp_writelog (p_import_key,
                           'W',
                           'Byte Order Mark aangetroffen',
                           'Bestand heeft onbehandeld UTF-8 formaat.'
                          );
         v_newline := SUBSTR (v_newline, 4);
      END IF;

      -- Verwijder de dubbele quotes
      v_newline := REPLACE (v_newline, '"');

      UPDATE fac_imp_file
         SET fac_imp_file_line = v_newline
       WHERE fac_import_key = p_import_key
         AND fac_imp_file_index = 1;


   EXCEPTION WHEN OTHERS
   THEN
      fac.imp_writelog (p_import_key,
                        'E',
                        'Fout bij controle op Byte Order Mark',
                        ''
                       );
   END;

   v_errorhint := 'Generieke update';
   -- de sequence array staat beschreven in PRS_PAC.SRC bij de prs.import_perslid proc
   prs.import_perslid (p_import_key,
                       '0;0;0;0;0;0;5;2;0;3;'||
                       '0;0;0;0;0;0;0;4;0;0;'||
                       '5;1;0;0;0;0;0;0;0;0;'||
                       '0;0;0;0;0;0;0;0;0;0;'||
                       '0;0;0;0;0;0',
                       'accountnaam;achternaam;voornaam;e-mail;afdeling'
                       );

UPDATE fac_imp_perslid
SET prs_srtperslid_omschrijving = 'Onbekend'
WHERE fac_import_key = p_import_key;

  COMMIT;
EXCEPTION
   WHEN OTHERS
   THEN
      oracle_err_num := SQLCODE;
      oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
      v_errormsg := 'Error ' || oracle_err_num || '/' || oracle_err_mes;
      fac.imp_writelog (p_import_key, 'E', v_errormsg, v_errorhint);
END dvon_import_prs;
/

CREATE OR REPLACE PROCEDURE dvon_update_prs (
   p_import_key IN NUMBER
) IS
  -- Alle personen verwijderen die niet meer in import bestand voorkomen.
  CURSOR c_del
  IS
      SELECT p.prs_perslid_key, p.prs_perslid_oslogin, pf.prs_perslid_naam_full
        FROM fac_imp_perslid i, prs_perslid p, prs_v_perslid_fullnames_all pf
       WHERE p.prs_perslid_oslogin = i.prs_perslid_oslogin(+)
         AND pf.prs_perslid_key = p.prs_perslid_key
         AND p.prs_perslid_oslogin IS NOT NULL
         AND i.prs_perslid_oslogin IS NULL
         AND p.prs_perslid_verwijder IS NULL
         AND p.prs_perslid_oslogin NOT LIKE '%_%'
         AND p.prs_perslid_oslogin2 IS NULL
      ORDER BY 2;

  v_count           NUMBER;

BEGIN
    -- generic update

    SELECT count(*)
      INTO v_count
      FROM fac_imp_perslid;

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

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

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

END dvon_update_prs;
/

-- Custom imports hier
-- Catalogusartikelen import, gebaseerd op de FIP uit FAC_PACF.SRC incl kenmerken van bestelregel

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

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

   -- De importvelden
   v_discipline_omschrijving   VARCHAR2 (255);  -- Catalogus naam (moet al bestaan)
   v_bedrijf_naam              VARCHAR2 (255);  -- Leverancier
   v_srtdeel_nr                VARCHAR2 (255);  -- Artikelnr
   v_srtgroep_omschrijving     VARCHAR2 (255);  -- Artikelgroep
   v_srtdeel_omschrijving      VARCHAR2 (255);  -- Artikelomschrijving
   v_srtdeel_prijs             VARCHAR2 (255);  -- v_srtdeel_prijs = 0
   v_srtdeel_eenheid           VARCHAR2 (255);  -- Stuk / Pak / etc.
   v_srtdeel_image             VARCHAR2 (255);  -- Picture
   v_srtdeel_wijzigdagen       VARCHAR2 (255);  -- Behouden
   v_srtdeel_annuleerdagen     VARCHAR2 (255);  -- Behouden
   v_srtdeel_vervaldatum       VARCHAR2 (255);  -- DueDate
   v_srtdeel_minimumvoorraad   VARCHAR2 (255);  -- Minimumvoorraad
   v_srtdeel_maximumvoorraad   VARCHAR2 (255);  -- Maximumvoorraad
   v_srtdeel_opmerking         VARCHAR2 (4000); -- straks afgekapt op 2000
   v_srtdeel_objectsrtcode     VARCHAR2 (255);  -- Objectsoortcode
   v_srtdeel_kenmerksrt        VARCHAR2 (255);  -- Kenmerksoort (moet deze al bestaan? - Ja, maat)  
   v_srtdeel_volgnr            VARCHAR2 (255);  -- Volgnummer
   v_srtdeel_verplicht         VARCHAR2 (255);  -- Verplicht
   v_srtdeel_groep             VARCHAR2 (255);  -- Kenmerkgroep
   
   -- Overige velden
   v_discipline_key            NUMBER (10);
   v_bedrijf_key               NUMBER (10);
   v_bes_staffeltabel_key      NUMBER (10);
   
CURSOR c1
IS
     SELECT   fac_imp_file_line,
              LENGTH (TRIM (REPLACE (fac_imp_file_line, c_delim, '')))
                 regellengte
       FROM   FAC_IMP_FILE
      WHERE   fac_import_key = p_import_key
   ORDER BY   fac_imp_file_index;

BEGIN
  SELECT ins_discipline_key, prs_bedrijf_key
    INTO p_discipline_key, p_bedrijf_key
    FROM fac_import fi, fac_import_app fia
   WHERE fi.fac_import_key = p_import_key
     AND fi.fac_import_app_key = fia.fac_import_app_key;

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

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

         -- Lees alle veldwaarden
         fac.imp_getfield (v_newline, c_delim, v_discipline_omschrijving);                              
         fac.imp_getfield (v_newline, c_delim, v_bedrijf_naam);          
         fac.imp_getfield (v_newline, c_delim, v_srtdeel_nr);             
         fac.imp_getfield (v_newline, c_delim, v_srtgroep_omschrijving);  
         fac.imp_getfield (v_newline, c_delim, v_srtdeel_omschrijving);   
         fac.imp_getfield (v_newline, c_delim, v_srtdeel_prijs);          
         fac.imp_getfield (v_newline, c_delim, v_srtdeel_eenheid);        
         fac.imp_getfield (v_newline, c_delim, v_srtdeel_image);   
         fac.imp_getfield (v_newline, c_delim, v_srtdeel_wijzigdagen);    
         fac.imp_getfield (v_newline, c_delim, v_srtdeel_annuleerdagen);           
         fac.imp_getfield (v_newline, c_delim, v_srtdeel_vervaldatum);    
         fac.imp_getfield (v_newline, c_delim, v_srtdeel_minimumvoorraad);
         fac.imp_getfield (v_newline, c_delim, v_srtdeel_maximumvoorraad);
         fac.imp_getfield (v_newline, c_delim, v_srtdeel_opmerking);      
         fac.imp_getfield (v_newline, c_delim, v_srtdeel_objectsrtcode); 
         fac.imp_getfield (v_newline, c_delim, v_srtdeel_kenmerksrt);     
         fac.imp_getfield (v_newline, c_delim, v_srtdeel_volgnr);        
         fac.imp_getfield (v_newline, c_delim, v_srtdeel_verplicht);      
         fac.imp_getfield (v_newline, c_delim, v_srtdeel_groep);       
        
        -- Ik controleer of ik een geldige header heb, dat is: in de juiste kolommen
         -- de juiste kolomkop. Ik controleer daarbij - sinds UWVA#21562 - bijna alle
         -- kolommen (spaties in kolomheaders zijn onhandig bij "round-trip syncen").
         -- Ik negeer alles totdat ik een geldige header ben gepasseerd.
         IF (header_is_valid = 0)
         THEN
                IF UPPER (TRIM (v_discipline_omschrijving)) LIKE 'CATALOGUS%'
               AND UPPER (TRIM (v_bedrijf_naam)) = 'LEVERANCIER'          
               AND UPPER (TRIM (v_srtdeel_nr)) = 'ARTIKELNR'             
               AND UPPER (TRIM (v_srtgroep_omschrijving)) = 'GROEP'  
               AND UPPER (TRIM (v_srtdeel_omschrijving)) = 'OMSCHRIJVING'   
               AND UPPER (TRIM (v_srtdeel_prijs)) = 'PRIJS'          
               AND UPPER (TRIM (v_srtdeel_eenheid)) =  'EENHEID'       
               AND UPPER (TRIM (v_srtdeel_image)) = 'PICTURE'
               AND UPPER (TRIM (v_srtdeel_wijzigdagen)) = 'WIJZIGDAGEN'    
               AND UPPER (TRIM (v_srtdeel_annuleerdagen)) = 'ANNULEERDAGEN'                 
               AND UPPER (TRIM (v_srtdeel_vervaldatum)) = 'DUEDATE'    
               AND UPPER (TRIM (v_srtdeel_minimumvoorraad)) = 'MINIMUMVOORRAAD'
               AND UPPER (TRIM (v_srtdeel_maximumvoorraad)) = 'MAXIMUMVOORRAAD'
               AND UPPER (TRIM (v_srtdeel_opmerking)) = 'OPMERKING'      
               AND UPPER (TRIM (v_srtdeel_objectsrtcode)) = 'OBJECTSOORTCODE'  
               AND UPPER (TRIM (v_srtdeel_kenmerksrt)) = 'KENMERKSOORT'     
               AND UPPER (TRIM (v_srtdeel_volgnr)) = 'VOLGNUMMER'         
               AND UPPER (TRIM (v_srtdeel_verplicht)) = 'VERPLICHT'      
               AND UPPER (TRIM (v_srtdeel_groep)) = 'KENMERKGROEP'
           THEN
           header_is_valid := 1;
        END IF;
     ELSIF rec.regellengte > 1                   -- Lege regels overslaan!
     THEN
        v_count_tot := v_count_tot + 1;
        v_aanduiding :=
              '['
           || TRIM (v_discipline_omschrijving)
           || '|'
           || TRIM (v_bedrijf_naam)
           || '|'
           || TRIM (v_srtdeel_nr)
           || '] ';

        v_discipline_omschrijving := TRIM (v_discipline_omschrijving);
        v_errorhint :=
           'Catalogus onbekend/ongeldig; regel wordt niet ingelezen';
           
            SELECT   ins_discipline_key
              INTO   v_discipline_key
              FROM   INS_TAB_DISCIPLINE
             WHERE   UPPER (ins_discipline_omschrijving) =
                        UPPER (v_discipline_omschrijving)
                     AND ins_discipline_module = 'BES'
                     AND ins_discipline_verwijder IS NULL;

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

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

            v_errorhint := 'Fout bij controleren importregel';      
            
            v_srtdeel_nr := TRIM (v_srtdeel_nr);

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

            v_srtgroep_omschrijving := TRIM (v_srtgroep_omschrijving);

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

            v_srtdeel_omschrijving := TRIM (v_srtdeel_omschrijving);

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

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

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

            v_srtdeel_eenheid := TRIM (v_srtdeel_eenheid);

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

            v_srtdeel_image := TRIM (v_srtdeel_image);

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

            v_srtdeel_vervaldatum := TRIM (v_srtdeel_vervaldatum);

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

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

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

            v_srtdeel_opmerking := TRIM (v_srtdeel_opmerking);

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

            IF v_ongeldig = 0
            THEN
               v_errorhint := 'Fout toevoegen importregel';
               
               INSERT INTO DVON_IMP_CATARTIKEL (
                                  fac_import_key,
                                  ins_discipline_key,
                                  prs_bedrijf_key,
                                  ins_srtdeel_nr,
                                  ins_srtgroep_omschrijving,
                                  ins_srtdeel_omschrijving,
                                  ins_srtdeel_prijs,
                                  ins_srtdeel_eenheid,
                                  ins_srtdeel_image,
                                  ins_srtdeel_vervaldatum,
                                  ins_srtdeel_minimumvoorraad,
                                  ins_srtdeel_maximumvoorraad,
                                  ins_srtdeel_wijzigdagen,
                                  ins_srtdeel_annuleerdagen,
                                  ins_srtdeel_opmerking,
                                  ins_kenmerk_objectsrtcode,
                                  ins_kenmerk_kenmerksrt,
                                  ins_kenmerk_volgnr,
                                  ins_kenmerk_verplicht,
                                  ins_kenmerk_groep )
                 VALUES   (                                  
                              p_import_key,                          
                              v_discipline_key,
                              v_bedrijf_key,
                              SUBSTR (v_srtdeel_nr, 1, 32),
                              SUBSTR (v_srtgroep_omschrijving, 1, 60),
                              SUBSTR (v_srtdeel_omschrijving, 1, 100),
                              COALESCE (fac.safe_to_number (v_srtdeel_prijs), 0),
                              SUBSTR (v_srtdeel_eenheid, 1, 30),
                              SUBSTR (v_srtdeel_image, 1, 255),
                              fac.safe_to_date (v_srtdeel_vervaldatum,
                                                'yyyymmdd'),
                              fac.safe_to_number (v_srtdeel_minimumvoorraad),
                              fac.safe_to_number (v_srtdeel_maximumvoorraad),                              
                              fac.safe_to_number (v_srtdeel_wijzigdagen),
                              fac.safe_to_number (v_srtdeel_annuleerdagen),
                              SUBSTR (v_srtdeel_opmerking, 1, 2000),
                              SUBSTR (v_srtdeel_objectsrtcode, 1, 10),
                              SUBSTR (v_srtdeel_kenmerksrt, 1, 50),   
                              fac.safe_to_number (v_srtdeel_volgnr),
                              fac.safe_to_number (v_srtdeel_verplicht),
                              fac.safe_to_number (v_srtdeel_groep)
                          );
              v_count_import := v_count_import + 1;
           END IF;
        END IF;
     EXCEPTION
        WHEN OTHERS
        THEN
           oracle_err_num := SQLCODE;
           oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
           v_errormsg :=
                 'ORACLE (error '
              || oracle_err_num
              || '/'
              || oracle_err_mes
              || ')';
           fac.imp_writelog (p_import_key,
                             'W',
                             v_aanduiding || v_errormsg,
                             v_errorhint);
     END;
  END LOOP;
  
     IF (header_is_valid = 0)
   THEN
      fac.imp_writelog (p_import_key,
                        'E',
                        'Ongeldig importbestand',
                        'Geen header of header niet volgens specificatie!');
   ELSE
      fac.imp_writelog (
         p_import_key,
         'S',
         'Inleesproces: aantal ingelezen importregels: '
         || TO_CHAR (v_count_tot),
         ''
      );
      fac.imp_writelog (
         p_import_key,
         'S',
         'Inleesproces: aantal ongeldige niet ingelezen importregels: '
         || TO_CHAR (v_count_tot - v_count_import),
         ''
      );
   END IF;

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

   -- Update artikelen
CREATE OR REPLACE PROCEDURE DVON_UPDATE_CATARTIKEL (
   p_import_key IN NUMBER
)
AS
   v_errormsg       VARCHAR2 (1000);
   oracle_err_num   NUMBER;
   oracle_err_mes   VARCHAR2 (200);
   v_aanduiding     VARCHAR2 (200);
   v_disc_oms       VARCHAR2 (100);
   v_bedr_naam      VARCHAR2 (100);

   -- Update artikelen
   PROCEDURE l_update_catartikel (pdisc_key IN NUMBER, pbedr_key IN NUMBER)
   AS
          
      CURSOR c_updsrtdeel
      IS
         SELECT   s.bes_srtdeel_key, d.*
           FROM   dvon_imp_catartikel d, bes_srtgroep g, bes_srtdeel s
          WHERE       fac_import_key = p_import_key
                   AND d.ins_discipline_key = g.ins_discipline_key
              --   AND d.prs_bedrijf_key = cbedr_key
              --    AND g.ins_discipline_key = cdisc_key
                  AND g.bes_srtgroep_key = s.bes_srtgroep_key
                  AND UPPER (s.bes_srtdeel_nr) = UPPER (d.ins_srtdeel_nr)
               --   AND s.prs_bedrijf_key = cbedr_key
                  AND s.bes_srtdeel_verwijder IS NULL;

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

      ccount            NUMBER (10);
      l_srtgroep_key    NUMBER (10);
      l_bes_srtdeel_key bes_srtdeel.bes_srtdeel_key%TYPE;
      l_omschrijving    bes_srtdeel.bes_srtdeel_omschrijving%TYPE;
      l_prijs           bes_srtdeel_prijs.bes_srtdeel_prijs_prijs%TYPE;
   --   l_inkprijs        bes_srtdeel_prijs.bes_srtdeel_prijs_inkprijs%TYPE;
   --   l_veelvoud        bes_srtdeel.bes_srtdeel_veelvoud%TYPE;
      l_minimumvoorraad bes_srtdeel.bes_srtdeel_voorraadmin%TYPE;
      l_maximumvoorraad bes_srtdeel.bes_srtdeel_voorraadmax%TYPE;
      l_wijzigdagen     bes_srtdeel.bes_srtdeel_wijzigdagen%TYPE;
      l_annuleerdagen   bes_srtdeel.bes_srtdeel_annuleerdagen%TYPE;
      l_opmerking       bes_srtdeel.bes_srtdeel_opmerking%TYPE;

BEGIN      
      -- UPDATE SRTDEEL
      ccount := 0;

      FOR rec IN c_updsrtdeel
      LOOP
         BEGIN
            v_errormsg :=
               'Fout bij bepalen groep ' || rec.ins_srtgroep_omschrijving;

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

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

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

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

            -- Codetechnisch zou hier bes.upsert_srtdeel() passen, maar die doet bv nog geen inkprijs.
            -- Later nog eens TODO
            UPDATE   bes_srtdeel
               SET   bes_srtgroep_key = l_srtgroep_key,
                     bes_srtdeel_omschrijving = rec.ins_srtdeel_omschrijving,
                     bes_srtdeel_image = rec.ins_srtdeel_image,
                  --   bes_srtdeel_btw = rec.ins_srtdeel_btw,
                     bes_srtdeel_eenheid = rec.ins_srtdeel_eenheid,
                     bes_srtdeel_vervaldatum = rec.ins_srtdeel_vervaldatum,
                  --   bes_srtdeel_veelvoud = rec.ins_srtdeel_veelvoud,
                     bes_srtdeel_voorraadmin = rec.ins_srtdeel_minimumvoorraad,
                     bes_srtdeel_voorraadmax = rec.ins_srtdeel_maximumvoorraad,
                  --   bes_staffeltabel_key = rec.bes_staffeltabel_key,
                     bes_srtdeel_wijzigdagen = rec.ins_srtdeel_wijzigdagen,
                     bes_srtdeel_annuleerdagen = rec.ins_srtdeel_annuleerdagen,
                     bes_srtdeel_opmerking = rec.ins_srtdeel_opmerking,
                     ins_srtdeel_key = (select ins_srtdeel_key
                                          from ins_srtdeel i
                                         where i.ins_srtdeel_code_upper = UPPER (rec.ins_kenmerk_objectsrtcode))
             WHERE   bes_srtdeel_verwijder IS NULL
                 AND bes_srtdeel_key = rec.bes_srtdeel_key
         RETURNING   bes_srtdeel_key INTO l_bes_srtdeel_key;
         
              UPDATE bes_kenmerk    
                 SET bes_srtkenmerk_key = (select bes_srtkenmerk_key 
                                             from bes_srtkenmerk b 
                                            where b.bes_srtkenmerk_upper = UPPER (rec.ins_kenmerk_kenmerksrt)),
                  --   bes_kenmerk_type = 'I',
                  --   bes_kenmerk_niveau = 'S',
                     bes_kenmerk_verplicht = rec.ins_kenmerk_verplicht,
                     bes_kenmerk_groep = rec.ins_kenmerk_groep,
                     bes_kenmerk_volgnummer = rec.ins_kenmerk_volgnr
               WHERE bes_srtinstallatie_key = l_bes_srtdeel_key;

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

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

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

            IF l_minimumvoorraad <> rec.ins_srtdeel_minimumvoorraad
            THEN
               fac.imp_writelog (
                  p_import_key,
                  'I',
                     'Artikel '
                  || rec.ins_srtdeel_nr
                  || '/'
                  || rec.ins_srtdeel_omschrijving
                  || ' is gewijzigd',
                     'Miinimumvoorraad '
                  || l_minimumvoorraad
                  || ' -> '
                  || rec.ins_srtdeel_minimumvoorraad
               );
            END IF;
            
            IF l_maximumvoorraad <> rec.ins_srtdeel_maximumvoorraad
            THEN
               fac.imp_writelog (
                  p_import_key,
                  'I',
                     'Artikel '
                  || rec.ins_srtdeel_nr
                  || '/'
                  || rec.ins_srtdeel_omschrijving
                  || ' is gewijzigd',
                     'Maximumvoorraad '
                  || l_maximumvoorraad
                  || ' -> '
                  || rec.ins_srtdeel_maximumvoorraad
               );
            END IF;

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

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

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

            ccount := ccount + 1;
         EXCEPTION
            WHEN OTHERS
            THEN
               oracle_err_num := SQLCODE;
               oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
               v_errormsg :=
                     v_errormsg
                  || ' ORACLE (error '
                  || oracle_err_num
                  || '/'
                  || oracle_err_mes
                  || ')';
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || v_errormsg,
                                 '');
         END;
      END LOOP;

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

      COMMIT;

      -- INSERT SRTDEEL
      ccount := 0;

      FOR rec IN c_inssrtdeel
      LOOP
         BEGIN
            v_errormsg :=
               'Fout bij bepalen groep ' || rec.ins_srtgroep_omschrijving;

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

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

            INSERT INTO bes_srtdeel (bes_srtgroep_key,
                                     bes_srtdeel_nr,
                                     bes_srtdeel_omschrijving,
                                     bes_srtdeel_image,
                                   -- bes_srtdeel_btw,
                                     bes_srtdeel_eenheid,
                                     bes_srtdeel_dimensie,
                                     prs_bedrijf_key,
                                     bes_srtdeel_vervaldatum,
                                   -- bes_srtdeel_veelvoud,
                                     bes_srtdeel_voorraadmin,
                                     bes_srtdeel_voorraadmax,
                                   -- bes_staffeltabel_key,
                                     bes_srtdeel_wijzigdagen,
                                     bes_srtdeel_annuleerdagen,
                                     bes_srtdeel_opmerking,
                                     ins_srtdeel_key)
              VALUES   (l_srtgroep_key,
                        rec.ins_srtdeel_nr,
                        rec.ins_srtdeel_omschrijving,
                        rec.ins_srtdeel_image,
                      --  rec.ins_srtdeel_btw,
                        rec.ins_srtdeel_eenheid,
                        0,
                        pbedr_key,
                        rec.ins_srtdeel_vervaldatum,
                      --  rec.ins_srtdeel_veelvoud,
                        rec.ins_srtdeel_minimumvoorraad,
                        rec.ins_srtdeel_minimumvoorraad,
                      -- rec.bes_staffeltabel_key,
                        rec.ins_srtdeel_wijzigdagen,
                        rec.ins_srtdeel_annuleerdagen,
                        rec.ins_srtdeel_opmerking,
                        (select i.ins_srtdeel_key
                           from ins_srtdeel i
                          where i.ins_srtdeel_code_upper = UPPER (rec.ins_kenmerk_objectsrtcode)))
            RETURNING   bes_srtdeel_key INTO l_bes_srtdeel_key;

            bes.upsert_srtdeel_prijs (l_bes_srtdeel_key, rec.ins_srtdeel_prijs, 0);
            
           INSERT INTO bes_kenmerk  (bes_srtkenmerk_key,
                                     bes_srtinstallatie_key,
                                     bes_kenmerk_type,
                                     bes_kenmerk_niveau,
                                     bes_kenmerk_verplicht,
                                     bes_kenmerk_groep,
                                     bes_kenmerk_volgnummer)
              VALUES   ((select bes_srtkenmerk_key 
                           from bes_srtkenmerk b 
                        where b.bes_srtkenmerk_upper = UPPER (rec.ins_kenmerk_kenmerksrt)),
                        l_bes_srtdeel_key,
                        'I',
                        'S',
                        rec.ins_kenmerk_verplicht,
                        rec.ins_kenmerk_groep,
                        rec.ins_kenmerk_volgnr);

            fac.imp_writelog (
               p_import_key,
               'I',
                  v_aanduiding
               || 'Artikel '
               || rec.ins_srtdeel_nr
               || '/'
               || rec.ins_srtdeel_omschrijving
               || ' is toegevoegd',
               ''
            );
            ccount := ccount + 1;
      EXCEPTION
         WHEN DUP_VAL_ON_INDEX
         THEN
            v_errormsg := 'Artikelnummer dubbel in importbestand';
            fac.imp_writelog (p_import_key,
                              'W',
                              v_aanduiding || v_errormsg,
                              '');
         WHEN OTHERS
         THEN
            oracle_err_num := SQLCODE;
            oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
            v_errormsg :=
                  v_errormsg
               || ' ORACLE (error '
               || oracle_err_num
               || '/'
               || oracle_err_mes
               || ')';
            fac.imp_writelog (p_import_key,
                              'W',
                              v_aanduiding || v_errormsg,
                              '');
         END;
      END LOOP;

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

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

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

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

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

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

         COMMIT;

         v_aanduiding := '[' || v_disc_oms || '|' || v_bedr_naam || '] ';
         l_update_catartikel (rec.ins_discipline_key, rec.prs_bedrijf_key);
      EXCEPTION
         WHEN OTHERS
         THEN
            oracle_err_num := SQLCODE;
            oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
            v_errormsg :=
                  v_errormsg
               || ' ORACLE (error '
               || oracle_err_num
               || '/'
               || oracle_err_mes
               || ')';
            fac.imp_writelog (p_import_key,
                              'E',
                              v_aanduiding || v_errormsg,
                              '');
            COMMIT;
      END;
   END LOOP;
EXCEPTION
   WHEN OTHERS
   THEN
      oracle_err_num := SQLCODE;
      oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
      v_errormsg :=
            v_errormsg
         || ' ORACLE (error '
         || oracle_err_num
         || '/'
         || oracle_err_mes
         || ')';
      fac.imp_writelog (p_import_key,
                        'E',
                        v_aanduiding || v_errormsg,
                        'Verwerken catalogus afgebroken!');
   END DVON_UPDATE_CATARTIKEL;
/

-- Objectsoorten import

CREATE OR REPLACE PROCEDURE DVON_IMPORT_OBJSRT (
   p_import_key IN NUMBER
)
IS
   c_delim                     VARCHAR2 (1) := ';';
   v_newline                   fac_imp_file.fac_imp_file_line%TYPE;    -- Input line
   v_errormsg                  VARCHAR2 (1000);
   v_errorhint                 VARCHAR2 (1000);
   oracle_err_num              NUMBER;
   oracle_err_mes              VARCHAR2 (200);
   v_aanduiding                VARCHAR2 (200);
   header_is_valid             NUMBER := 0;
   v_count_tot                 NUMBER (10) := 0;
   v_count_import              NUMBER (10) := 0;
   v_ongeldig                  NUMBER (1) := 0;

   -- De importvelden
   v_key_objsrtkey             VARCHAR2 (255);  -- Key van bestaande objectsoort (alleen bij exports)
   v_discipline_omschrijving   VARCHAR2 (255);  -- Discipline omschrijving (moet al bestaan)
   v_srtgroep_omschrijving     VARCHAR2 (255);  -- Objectgroep naam (moet al bestaan)
   v_srtdeel_code              VARCHAR2 (255);  -- Objectcode
   v_srtdeel_omschrijving      VARCHAR2 (255);  -- Objectomschrijving
   v_srtdeel_uitleenbaar       VARCHAR2 (255);  -- Uitleenbaar ja/nee
   v_bedrijf_naam              VARCHAR2 (255);  -- Leverancier (kenmerk bij objectsoort)
   v_srtdeel_vervaldatum       VARCHAR2 (255);  -- Vervaldatum object
   v_srtkenmerk_naam           VARCHAR2 (255);  -- Kenmerksoort (moet al bestaan)
   v_srtkenmerk_bewerkbij      VARCHAR2 (255);  -- Kenmerk bewerken bij object of objectsoort
   v_srtkenmerk_volgnr         VARCHAR2 (255);  -- Volgnummer
   v_srtkenmerk_verplicht      VARCHAR2 (255);  -- Verplicht
   v_srtkenmerk_groep          VARCHAR2 (255);  -- Kenmerkgroep
   v_file_index                NUMBER;

   
   -- Overige velden
   v_discipline_key            NUMBER (10);
   v_srtgroep_key              NUMBER (10);
   v_bedrijf_key               NUMBER (10);
   v_leverancier_key           NUMBER (10);
      
   CURSOR c1
   IS
        SELECT   *
          FROM   fac_imp_file
         WHERE   fac_import_key = p_import_key
      ORDER BY   fac_imp_file_index;

   -- Controleer tijdens import-fase alleen op bestaan van kenmerksoort (of
   -- deze - via een kenmerk - wel is gedefinieerd voor de betreffende object-
   -- discipline/groep/soort, volgt pas tijdens de update-fase)!
   
   FUNCTION bepaal_srtkenmerk_key (p_kw IN VARCHAR)
      RETURN VARCHAR
   IS
      v_srtkenmerk_key   NUMBER;
      v_kenmerk_groep    NUMBER;
      v_kw               VARCHAR(250);
   BEGIN
      v_kenmerk_groep := 0;
      v_kw := p_kw;
      IF INSTR (v_kw, '|') > 1
      THEN
        v_kenmerk_groep := SUBSTR (v_kw, INSTR (v_kw, '|') + 1);
        v_kw := SUBSTR (v_kw, 1, INSTR (v_kw, '|') - 1);
      END IF;

      IF fac.safe_to_number (v_kw) IS NULL
      THEN                -- kenmerkwaarde is alfanumeriek (dus omschrijving)!
         SELECT   ins_srtkenmerk_key
           INTO   v_srtkenmerk_key
           FROM   ins_v_aanwezigsrtkenmerk
          WHERE   ins_srtkenmerk_upper = UPPER (v_kw)
                  AND ins_srtkenmerk_kenmerktype IN ('C', 'D', 'N', 'R', 'S', 'X', 'B');
      ELSE                             -- kenmerkwaarde is numeriek (dus key)!
         SELECT   ins_srtkenmerk_key
           INTO   v_srtkenmerk_key
           FROM   ins_v_aanwezigsrtkenmerk
          WHERE   ins_srtkenmerk_key = fac.safe_to_number (v_kw)
                  AND ins_srtkenmerk_kenmerktype IN ('C', 'D', 'N', 'R', 'S', 'X', 'B');
      END IF;

      RETURN TO_CHAR(v_srtkenmerk_key) || '|' || TO_CHAR(v_kenmerk_groep);
   EXCEPTION
      WHEN NO_DATA_FOUND
      THEN
         IF p_kw IS NULL OR UPPER (p_kw) LIKE 'KENMERK%'
         THEN
            RETURN NULL;
         ELSE
            fac.imp_writelog (p_import_key,
                              'W',
                              'Fout bij bepalen kenmerksoort [' || p_kw || ']',
                              'Bestaat niet of type ongeldig');
            COMMIT;
            RETURN NULL;
         END IF;
   END;

   -- Eerst opruiming
   BEGIN
   DELETE FROM DVON_IMP_OBJSRT;
   
   COMMIT;   
    
   v_count_tot := 0;
   v_count_import := 0;
   header_is_valid := 0; 
    
   FOR rec1 IN c1
   LOOP
      BEGIN
         v_newline := rec1.fac_imp_file_line;
         v_file_index := rec1.fac_imp_file_index;
         v_errormsg := 'Fout bij opvragen importregel';
         v_aanduiding := '';
         v_ongeldig := 0;

         -- Lees alle veldwaarden
         fac.imp_getfield (v_newline, c_delim, v_key_objsrtkey); 
         fac.imp_getfield (v_newline, c_delim, v_discipline_omschrijving); 
         fac.imp_getfield (v_newline, c_delim, v_srtgroep_omschrijving);          
         fac.imp_getfield (v_newline, c_delim, v_srtdeel_code);             
         fac.imp_getfield (v_newline, c_delim, v_srtdeel_omschrijving);  
         fac.imp_getfield (v_newline, c_delim, v_srtdeel_uitleenbaar);
         fac.imp_getfield (v_newline, c_delim, v_bedrijf_naam);         
         fac.imp_getfield (v_newline, c_delim, v_srtdeel_vervaldatum);
         fac.imp_getfield (v_newline, c_delim, v_srtkenmerk_naam);
         fac.imp_getfield (v_newline, c_delim, v_srtkenmerk_bewerkbij);
         fac.imp_getfield (v_newline, c_delim, v_srtkenmerk_volgnr);
         fac.imp_getfield (v_newline, c_delim, v_srtkenmerk_verplicht);
         fac.imp_getfield (v_newline, c_delim, v_srtkenmerk_groep);    

         v_aanduiding :=
               '['
            || v_discipline_omschrijving
            || '|'
            || v_srtgroep_omschrijving
            || '|'
            || v_srtdeel_code
            || '|'
            || v_srtdeel_omschrijving
            || '] ';
        
         -- Ik controleer of ik een geldige header heb, dat is: in de juiste kolommen
         -- de juiste kolomkop. Ik controleer daarbij alle NIET-kenmerk kolommen!
         -- Ik negeer alles totdat ik een geldige header ben gepasseerd.
         
         IF (header_is_valid = 0)
         THEN
                IF UPPER (TRIM (v_key_objsrtkey)) = 'OBJSRTKEY'
               AND UPPER (TRIM (v_discipline_omschrijving)) LIKE 'DISCIPLINEOMSCHRIJVING%'         
               AND UPPER (TRIM (v_srtgroep_omschrijving)) = 'GROEPSOORTOMSCHRIJVING'             
               AND UPPER (TRIM (v_srtdeel_code)) = 'OBJECTSOORTCODE'  
               AND UPPER (TRIM (v_srtdeel_omschrijving)) = 'OBJECTSOORTOMSCHRIJVING'   
               AND UPPER (TRIM (v_srtdeel_uitleenbaar)) = 'UITLEENBAAR'
               AND UPPER (TRIM (v_bedrijf_naam)) = 'LEVERANCIER'
               AND UPPER (TRIM (v_srtdeel_vervaldatum)) = 'VERVALDATUM'
               AND UPPER (TRIM (v_srtkenmerk_naam)) = 'KENMERKSOORT'
               AND UPPER (TRIM (v_srtkenmerk_bewerkbij)) LIKE 'BEWERKEN%'         
               AND UPPER (TRIM (v_srtkenmerk_volgnr)) = 'VOLGNUMMER'
               AND UPPER (TRIM (v_srtkenmerk_verplicht)) = 'VERPLICHT'
               AND UPPER (TRIM (v_srtkenmerk_groep)) = 'GROEP'
           THEN
           header_is_valid := 1;
        END IF;
         ELSE
            v_count_tot := v_count_tot + 1;
            -- Controleer alle veldwaarden
            v_errormsg := 'Disciplineomschrijving ongeldig';
            v_discipline_omschrijving :=
               TRIM (v_discipline_omschrijving);

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

            --
            v_errormsg := 'Groepsoortomschrijving ongeldig';
            v_srtgroep_omschrijving := TRIM (v_srtgroep_omschrijving);

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

            --
            v_errormsg := 'Objectsoortcode ongeldig';
            v_srtdeel_code := TRIM (v_srtdeel_code);

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

            --
            v_errormsg := 'Objectsoortomschrijving ongeldig';
            v_srtdeel_omschrijving := TRIM (v_srtdeel_omschrijving);

            IF v_srtdeel_omschrijving IS NULL
               OR LENGTH (v_srtdeel_omschrijving) > 100
            THEN
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || v_errormsg,
                                 'Regel wordt overgeslagen');
               v_ongeldig := 1;
            END IF;
            
        v_discipline_omschrijving := TRIM (v_discipline_omschrijving);
        v_errorhint := 'Discipline onbekend/ongeldig; regel wordt niet ingelezen';
           
            SELECT   ins_discipline_key
              INTO   v_discipline_key
              FROM   INS_TAB_DISCIPLINE
             WHERE   UPPER (ins_discipline_omschrijving) =
                        UPPER (v_discipline_omschrijving)
                     AND ins_discipline_module = 'INS'
                     AND ins_discipline_verwijder IS NULL;

            v_srtgroep_omschrijving := TRIM (v_srtgroep_omschrijving);
            v_errorhint :=
               'Objectgroep onbekend/ongeldig; regel wordt niet ingelezen';

            SELECT   ins_srtgroep_key
              INTO   v_srtgroep_key
              FROM   ins_srtgroep
             WHERE   UPPER (ins_srtgroep_omschrijving) = UPPER (v_srtgroep_omschrijving)
                     AND ins_discipline_key = v_discipline_key
                     AND ins_srtgroep_verwijder IS NULL;

            SELECT   prs_bedrijf_key
              INTO   v_bedrijf_key
              FROM   PRS_BEDRIJF
             WHERE   prs_bedrijf_naam_upper LIKE '%DIENST VERVOER%'
                     AND prs_bedrijf_verwijder IS NULL;
                     
              IF v_bedrijf_naam IS NOT NULL
            THEN
                SELECT  f.fac_usrdata_key
                  INTO   v_leverancier_key
                  FROM   fac_usrdata f
                 WHERE   UPPER (f.fac_usrdata_omschr) = UPPER (v_bedrijf_naam);
         END IF;
      
        IF v_ongeldig = 0
            THEN
               BEGIN
                  v_errormsg := 'Fout bij wegschrijven importregel';
               
               INSERT INTO DVON_IMP_OBJSRT (
                                            fac_import_key,
                                            ins_objsrt_key,
                                            ins_discipline_key, 
                                            prs_bedrijf_key,
                                            ins_srtgroep_key,
                                            ins_srtdeel_code,
                                            ins_srtdeel_omschrijving,
                                            ins_srtdeel_uitleenbaar,
                                            ins_srtkenmerk_levkey,
                                            ins_srtdeel_vervaldatum,
                                            ins_srtkenmerk_naam,
                                            ins_srtkenmerk_bewerkbij,
                                            ins_srtkenmerk_volgnr,
                                            ins_srtkenmerk_verplicht,
                                            ins_srtkenmerk_groep
                                            )
                 VALUES   (                                  
                              p_import_key,
                              v_key_objsrtkey,
                              v_discipline_key,
                              v_bedrijf_key,
                              v_srtgroep_key,        
                              v_srtdeel_code,       
                              v_srtdeel_omschrijving,
                              DECODE (v_srtdeel_uitleenbaar, 'ja', 1, NULL),
                              v_leverancier_key,
                              TO_DATE (v_srtdeel_vervaldatum, 'DD-MM-YYYY'),
                              v_srtkenmerk_naam,
                              v_srtkenmerk_bewerkbij,
                              v_srtkenmerk_volgnr,
                              DECODE (v_srtkenmerk_verplicht, 'ja', 1, NULL),
                              v_srtkenmerk_groep
                          );
                       COMMIT;
              v_count_import := v_count_import + 1;
               EXCEPTION
                  WHEN OTHERS
                  THEN
                     oracle_err_num := SQLCODE;
                     oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
                     v_errormsg :=
                           v_errormsg
                        || ' ORACLE (error '
                        || oracle_err_num
                        || '/'
                        || oracle_err_mes
                        || ')';
                     fac.imp_writelog (p_import_key,
                                       'W',
                                       v_aanduiding || v_errormsg,
                                       '');
                     COMMIT;
               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',
         'Objecten/aantal ingelezen importregels: ' || TO_CHAR (v_count_tot),
         ''
      );
      fac.imp_writelog (
         p_import_key,
         'S',
         'Objecten/aantal ongeldige niet ingelezen importregels: '
         || TO_CHAR (v_count_tot - v_count_import),
         ''
      );
   END IF;

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

CREATE OR REPLACE PROCEDURE DVON_UPDATE_OBJSRT (p_import_key IN NUMBER)
AS
   v_errormsg       VARCHAR2 (1000) := '-';
   oracle_err_num   NUMBER;
   oracle_err_mes   VARCHAR2 (200);
   v_aanduiding     VARCHAR2 (200);

   -- SUBPROC
   PROCEDURE add_srtdeel (p_import_key IN NUMBER)
   AS
      CURSOR c1
      IS
           SELECT ins_discipline_key,
                  ins_srtgroep_key,
                  UPPER (ins_srtdeel_code) ins_srtdeel_code_upper,
                  UPPER (ins_srtdeel_omschrijving) ins_srtdeel_upper,
                  ins_srtdeel_code,
                  ins_srtdeel_omschrijving,
                  ins_srtdeel_uitleenbaar,
                  ins_srtkenmerk_levkey,
                  ins_srtdeel_vervaldatum,
                  ins_srtkenmerk_naam,
                  ins_srtkenmerk_bewerkbij,
                  ins_srtkenmerk_volgnr,
                  ins_srtkenmerk_verplicht,
                  ins_srtkenmerk_groep,
                  prs_bedrijf_key
             FROM DVON_IMP_OBJSRT
            WHERE ins_objsrt_key IS NULL;
        -- GROUP BY ins_discipline_key,
        --          ins_srtgroep_key,
        --          UPPER (ins_srtdeel_code),
        --          UPPER (ins_srtdeel_omschrijving);

      CURSOR c2
      IS
           SELECT ins_objsrt_key,
                  ins_discipline_key,
                  ins_srtgroep_key,
                  ins_srtdeel_code,
                  ins_srtdeel_omschrijving,
                  ins_srtdeel_uitleenbaar,
                  ins_srtkenmerk_levkey,
                  ins_srtdeel_vervaldatum,
                  prs_bedrijf_key,
                  ins_srtkenmerk_naam,
                  ins_srtkenmerk_bewerkbij,
                  ins_srtkenmerk_volgnr,
                  ins_srtkenmerk_verplicht,
                  ins_srtkenmerk_groep
             FROM DVON_IMP_OBJSRT
            WHERE ins_objsrt_key IS NOT NULL;
       -- GROUP BY ins_objsrt_key,
       --          ins_discipline_key,
       --          ins_srtgroep_key,
       --          ins_srtdeel_code,
       --          ins_srtdeel_omschrijving;

      v_discipline_key   NUMBER (10);
      v_srtgroep_key     NUMBER (10);
      ccount             NUMBER (10);
      v_count_tot        NUMBER (10);
      v_count_update     NUMBER (10);
      v_srtdeel_key      NUMBER (10);
      v_srtkenmerk_key   NUMBER (10);
   BEGIN
      v_count_tot := 0;
      v_count_update := 0;

      FOR rec IN c1
      LOOP
         BEGIN
            v_count_tot := v_count_tot + 1;
            v_errormsg := 'Fout bij bepalen discipline';

            SELECT ins_discipline_key
              INTO v_discipline_key
              FROM ins_tab_discipline
             WHERE     ins_discipline_verwijder IS NULL
                   AND ins_discipline_module = 'INS'
                   AND ins_discipline_key = rec.ins_discipline_key;

            v_errormsg := 'Fout bij bepalen groepsoort';

            SELECT ins_srtgroep_key
              INTO v_srtgroep_key
              FROM ins_srtgroep
             WHERE     ins_srtgroep_verwijder IS NULL
                   AND ins_srtgroep_module = 'INS'
                   AND ins_discipline_key = v_discipline_key
                   AND ins_srtgroep_key = rec.ins_srtgroep_key;

            v_errormsg :=
                  'Fout bij toevoegen objectsoort ['
               || rec.ins_srtdeel_omschrijving
               || ']';

            SELECT COUNT ( * )
              INTO ccount
              FROM ins_srtdeel
             WHERE     ins_srtdeel_verwijder IS NULL
                   AND ins_srtdeel_module = 'INS'
                   AND ins_srtgroep_key = v_srtgroep_key
                   AND TRIM (ins_srtdeel_upper) = rec.ins_srtdeel_upper;

            SELECT ins_srtkenmerk_key
              INTO v_srtkenmerk_key
              FROM ins_srtkenmerk
             WHERE ins_srtkenmerk_upper = UPPER (rec.ins_srtkenmerk_naam);

            IF ccount = 0
            THEN
               -- binding 17 betekent ruimtegebonden of persoonsgebonden
               INSERT INTO ins_srtdeel (ins_srtgroep_key,
                                        ins_srtdeel_module,
                                        ins_srtdeel_code,
                                        ins_srtdeel_omschrijving,
                                        ins_srtdeel_vervaldatum,
                                        ins_srtdeel_uitleenbaar,
                                        ins_srtdeel_binding,
                                        prs_bedrijf_key)
                   VALUES (v_srtgroep_key,
                           'INS',
                           rec.ins_srtdeel_code,
                           rec.ins_srtdeel_omschrijving,
                           rec.ins_srtdeel_vervaldatum,
                           rec.ins_srtdeel_uitleenbaar,
                           17,
                           rec.prs_bedrijf_key)
                RETURNING ins_srtdeel_key
                     INTO v_srtdeel_key;

               INSERT INTO ins_kenmerk (ins_srtkenmerk_key,
                                        ins_srtinstallatie_key,
                                        ins_kenmerk_niveau,
                                        ins_kenmerk_bewerkniveau,
                                        ins_kenmerk_wissen,
                                        ins_kenmerk_volgnummer,
                                        ins_kenmerk_verplicht)
                   VALUES (v_srtkenmerk_key,
                           DECODE (rec.ins_srtkenmerk_bewerkbij,
                                   'soort', v_discipline_key,
                                   'deel', v_srtdeel_key),
                           'S',
                           DECODE (rec.ins_srtkenmerk_bewerkbij,
                                   'soort', 'S',
                                   'deel', 'D'),
                           0,
                           rec.ins_srtkenmerk_volgnr,
                           rec.ins_srtkenmerk_verplicht);
               
              INSERT INTO ins_kenmerkdeel (ins_deel_key,
                                           ins_kenmerk_key,
                                           ins_kenmerkdeel_waarde
                                           )
                    VALUES (v_srtdeel_key,
                            241, -- kenmerkkey van leverancier
                            rec.ins_srtkenmerk_levkey);
                                          
               v_count_update := v_count_update + 1;
            END IF;

            COMMIT;
         EXCEPTION
            WHEN OTHERS
            THEN
               oracle_err_num := SQLCODE;
               oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
               v_errormsg :=
                     v_errormsg
                  || ' (error '
                  || oracle_err_num
                  || '/'
                  || oracle_err_mes
                  || ')';
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_errormsg,
                                 '');
               COMMIT;
         END;
      END LOOP;
      
      FOR rec IN c2
      LOOP
         BEGIN
         -- Bepaal de soort kenmerk key
         
            SELECT ins_srtkenmerk_key
              INTO v_srtkenmerk_key
              FROM ins_srtkenmerk
             WHERE ins_srtkenmerk_upper = UPPER (rec.ins_srtkenmerk_naam);
             
            UPDATE ins_srtdeel
               SET ins_srtgroep_key = rec.ins_srtgroep_key,
                   ins_srtdeel_code = rec.ins_srtdeel_code,
                   ins_srtdeel_omschrijving = rec.ins_srtdeel_omschrijving,
                   ins_srtdeel_vervaldatum = rec.ins_srtdeel_vervaldatum,
                   ins_srtdeel_uitleenbaar = rec.ins_srtdeel_uitleenbaar,
                   prs_bedrijf_key = rec.prs_bedrijf_key
             WHERE ins_srtdeel_key = rec.ins_objsrt_key
             RETURNING ins_srtdeel_key INTO v_srtdeel_key;
         
          UPDATE ins_kenmerk 
             SET ins_kenmerk_bewerkniveau = DECODE (rec.ins_srtkenmerk_bewerkbij,
                                                    'soort', 'S',
                                                    'deel', 'D'),
                 ins_kenmerk_volgnummer = rec.ins_srtkenmerk_volgnr,
                 ins_kenmerk_verplicht = rec.ins_srtkenmerk_verplicht
           WHERE ins_srtinstallatie_key = v_srtdeel_key;
           
           UPDATE ins_kenmerkdeel
              SET ins_kenmerkdeel_waarde = rec.ins_srtkenmerk_levkey
            WHERE ins_deel_key = v_srtdeel_key
              AND ins_kenmerk_key = 241
              AND ins_kenmerkdeel_waarde != rec.ins_srtkenmerk_levkey;
           
         END;
      END LOOP;

      fac.imp_writelog (
         p_import_key,
         'S',
         'Objectsoorten/aantal ingelezen: ' || TO_CHAR (v_count_tot),
         '');
      fac.imp_writelog (
         p_import_key,
         'S',
         'Objectsoorten/aantal toegevoegd: ' || TO_CHAR (v_count_update),
         '');
      COMMIT;
   END;
-- MAIN
BEGIN
   --  add_kostensoort (p_import_key);
   --  add_insdiscipline (p_import_key);
   --  add_resdiscipline (p_import_key);
   --  add_srtgroep (p_import_key);
   add_srtdeel (p_import_key);
 -- add_deel (p_import_key);
EXCEPTION
   WHEN OTHERS
   THEN
      oracle_err_num := SQLCODE;
      oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
      v_errormsg :=
            v_errormsg
         || ' (error '
         || oracle_err_num
         || '/'
         || oracle_err_mes
         || ')';
      fac.imp_writelog (p_import_key,
                        'E',
                        v_errormsg,
                        'Importproces objecten afgebroken!');
END DVON_UPDATE_OBJSRT;
/

CREATE OR REPLACE PROCEDURE dvon_import_orgkost (p_import_key IN NUMBER
                                                   )
AS
   c_fielddelimitor               VARCHAR2 (1) := ';';
   v_newline                      VARCHAR2 (1000);          -- Input line
   v_errormsg                     VARCHAR2 (1000);
   oracle_err_num                 NUMBER;
   oracle_err_mes                 VARCHAR2 (200);
   header_is_valid                NUMBER;
   v_count                        NUMBER;
   v_ongeldig                     NUMBER (1);
   v_mode                         NUMBER (1);
   v_aanduiding                   VARCHAR2 (200);
   v_all_null                     BOOLEAN;
   v_count_error                  NUMBER (10);
   v_count_tot                    NUMBER (10);
   v_count_import                 NUMBER (10);
   
   -- De importvelden:
   v_bedrijf_naam                  VARCHAR2 (256);
   v_afdeling_naam                 VARCHAR2 (256);
   v_afdeling_naam_parent          VARCHAR2 (256);
   v_afdeling_omschrijving         VARCHAR2 (256);
   v_kostenplaats_nr               VARCHAR2 (256);           -- Overlap hier met import_kpn
   v_kostenplaats_omschrijving     VARCHAR2 (255);
   v_kostenplaats_module           VARCHAR2 (255);
   v_kostenplaats_begin            VARCHAR2 (255);
   v_kostenplaats_begin_d          DATE;
   v_kostenplaats_eind             VARCHAR2 (255);
   v_kostenplaats_eind_d           DATE;
   v_kostenplaatsgrp_oms           VARCHAR2 (255);
   v_kostenplaatsgrp_key           NUMBER (10);
   v_perslid                       VARCHAR2 (255);
   v_perslid_key                   NUMBER (10);
   v_kostenplaats_limiet           VARCHAR2 (255);
   v_kostenplaats_limietperiode    VARCHAR2 (255);
   v_kostenplaats_extern           VARCHAR2 (255);
   v_kostenplaats_fiat             VARCHAR2 (255);
   v_fiatteur_1                    VARCHAR2 (255);
   v_fiatteur_1_key                NUMBER (10);
   v_fiatteur_2                    VARCHAR2 (255);
   v_fiatteur_2_key                NUMBER (10);
   v_fiatteur_3                    VARCHAR2 (255);
   v_fiatteur_3_key                NUMBER (10);
   v_kostenplaatsgrp_nr            VARCHAR2 (255);
   v_kostenplaatsgrp_limiet        VARCHAR2 (255);
   v_kostenplaatsgrp_limietp VARCHAR2 (255);
   
   -- PRS_BEDRIJF
   CURSOR c1
   IS
        SELECT   *
          FROM   fac_imp_file
         WHERE   fac_import_key = p_import_key
      ORDER BY   fac_imp_file_index;
BEGIN
   -- Eerst opruiming
   DELETE FROM   DVON_IMP_ORGKOST;

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

   FOR rec1 IN c1
   LOOP
      BEGIN
         v_errormsg := 'Fout FETCH te importeren rij';

         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_fielddelimitor, v_bedrijf_naam);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_afdeling_naam_parent);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_afdeling_naam);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_afdeling_omschrijving);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_kostenplaats_nr);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_kostenplaats_omschrijving);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_kostenplaats_module);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_kostenplaats_begin);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_kostenplaats_eind);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_perslid);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_kostenplaats_limiet);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_kostenplaats_limietperiode);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_kostenplaats_extern);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_kostenplaats_fiat);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_kostenplaatsgrp_oms);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_kostenplaatsgrp_nr);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_fiatteur_1);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_fiatteur_2);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_fiatteur_3);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_kostenplaatsgrp_limiet);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_kostenplaatsgrp_limietp);
         
         v_aanduiding := v_bedrijf_naam || '|' || v_afdeling_naam || '|' || v_afdeling_omschrijving || '|' || v_kostenplaats_nr || '|' || v_kostenplaats_omschrijving;        
         
         IF (header_is_valid = 0)
         THEN
            IF     UPPER (v_bedrijf_naam) = 'BEDRIJFSNAAM'
               AND UPPER (v_afdeling_naam_parent) = 'AFDELINGSCODEPARENT'
               AND UPPER (v_kostenplaats_nr) = 'KOSTENPLAATS'
               AND UPPER (v_perslid) = 'BUDGETHOUDER'
               AND UPPER (v_kostenplaats_fiat) = 'OPDRACHTENFIATTEREN'     
            THEN
               header_is_valid := 1;
            END IF;
         ELSE
            v_count_tot := v_count_tot + 1;
            --fac.imp_writelog (p_import_key, 'I', v_aanduiding, '');
            -- Controleer alle veldwaarde
            v_bedrijf_naam := TRIM (v_bedrijf_naam);

            IF LENGTH (v_bedrijf_naam) > 60
            THEN
               v_bedrijf_naam := SUBSTR (v_bedrijf_naam, 1, 60);
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || 'Bedrijf-aanduiding is te lang',
                                 'Aanduiding wordt afgebroken tot [' || v_bedrijf_naam || ']'
                                );
            END IF;

            --
            v_afdeling_naam := TRIM (v_afdeling_naam);

            IF LENGTH (v_afdeling_naam) > 15
            THEN
               v_afdeling_naam := SUBSTR (v_afdeling_naam, 1, 15);
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || 'Afdeling-aanduiding is te lang',
                                 'Aanduiding wordt afgebroken tot [' || v_afdeling_naam || ']'
                                );
            END IF;

            --
            v_afdeling_naam_parent := TRIM (v_afdeling_naam_parent);

            IF LENGTH (v_afdeling_naam_parent) > 15
            THEN
               v_afdeling_naam_parent := SUBSTR (v_afdeling_naam_parent, 1, 15);
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || 'Afdeling-aanduiding is te lang',
                                 'Aanduiding wordt afgebroken tot [' || v_afdeling_naam_parent || ']'
                                );
            END IF;

            --
            v_afdeling_omschrijving := TRIM (v_afdeling_omschrijving);

            IF LENGTH (v_afdeling_omschrijving) > 60
            THEN
               v_afdeling_omschrijving := SUBSTR (v_afdeling_omschrijving, 1, 60);
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || 'Afdelingsomschrijving is te lang',
                                 'Aanduiding wordt afgebroken tot [' || v_afdeling_omschrijving || ']'
                                );
            END IF;

            --
            v_kostenplaats_nr := TRIM (v_kostenplaats_nr);

            IF LENGTH (v_kostenplaats_nr) > 30
            THEN
               v_kostenplaats_nr := SUBSTR (v_kostenplaats_nr, 1, 30);
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || 'Kostenplaats-aanduiding is te lang',
                                 'Aanduiding wordt afgebroken tot [' || v_kostenplaats_nr || ']'
                                );
            END IF;
            
               IF LENGTH (v_kostenplaats_omschrijving) > 60
               THEN
                  v_kostenplaats_omschrijving := SUBSTR (v_kostenplaats_omschrijving, 1, 60);
                  fac.imp_writelog (
                     p_import_key,
                     'W',
                     v_aanduiding || 'Kostenpaatsomschrijving is te lang',
                        'Kostenpaatsomschrijving wordt afgebroken tot ['
                     || v_kostenplaats_omschrijving
                     || ']');
               END IF;

               --
               v_kostenplaats_module := UPPER (TRIM (v_kostenplaats_module));

               IF v_kostenplaats_module NOT IN ('ALG', 'PRS', 'PRJ')
               THEN
                  v_kostenplaats_module := 'PRS';
                  fac.imp_writelog (
                     p_import_key,
                     'E',
                     v_aanduiding || 'Ongelding kostenplaatstype',
                     'Kostenplaatstype wordt aangepast naar [' || v_kostenplaats_module || ']');
               END IF;

               --
               v_kostenplaats_begin := TRIM (v_kostenplaats_begin);
               v_kostenplaats_begin_d := fac.safe_to_date (v_kostenplaats_begin, 'dd-mm-yyyy');

               IF v_kostenplaats_begin IS NOT NULL AND v_kostenplaats_begin_d IS NULL
               THEN
                  fac.imp_writelog (p_import_key,
                                    'E',
                                    v_aanduiding || 'Kostenplaatsbegin is ongeldig',
                                    'Kostenplaatsbegin wordt leeg gemaakt');
               END IF;

               --
               v_kostenplaats_eind := TRIM (v_kostenplaats_eind);
               v_kostenplaats_eind_d := fac.safe_to_date (v_kostenplaats_eind, 'dd-mm-yyyy');

               IF v_kostenplaats_eind IS NOT NULL AND v_kostenplaats_eind_d IS NULL
               THEN
                  fac.imp_writelog (p_import_key,
                                    'E',
                                    v_aanduiding || 'Kostenplaatseind is ongeldig',
                                    'Kostenplaatseind wordt leeg gemaakt');
               END IF;

               --
               v_kostenplaatsgrp_oms := TRIM (v_kostenplaatsgrp_oms);

               IF v_kostenplaatsgrp_oms IS NOT NULL
               THEN
                  BEGIN
                     SELECT prs_kostenplaatsgrp_key
                       INTO v_kostenplaatsgrp_key
                       FROM prs_kostenplaatsgrp
                      WHERE UPPER (prs_kostenplaatsgrp_oms) = UPPER (v_kostenplaatsgrp_oms);
                  EXCEPTION
                     WHEN NO_DATA_FOUND
                     THEN
                        v_kostenplaatsgrp_key := v_kostenplaatsgrp_key;

                        fac.imp_writelog (
                           p_import_key,
                           'E',
                           v_aanduiding || 'Kostenplaatsgroep-aanduiding kan niet gevonden worden',
                           'Kostenplaatsgroep wordt aangemaakt [' || v_kostenplaatsgrp_oms || ']');
                  END;
               ELSE
                  v_kostenplaatsgrp_key := NULL;
               END IF;

               --
               v_perslid := TRIM (v_perslid);

               IF v_perslid IS NOT NULL
               THEN
                  BEGIN
                     SELECT prs_perslid_key
                       INTO v_perslid_key
                       FROM prs_perslid
                      WHERE prs_perslid_oslogin = UPPER (v_perslid)
                         OR prs_perslid_oslogin = UPPER (v_perslid);
                  EXCEPTION
                     WHEN NO_DATA_FOUND
                     THEN
                        v_perslid_key := NULL;

                        fac.imp_writelog (
                           p_import_key,
                           'E',
                           v_aanduiding || 'Budgethouder-aanduiding kan niet gevonden worden',
                           'Budgethouder wordt leeg gemaakt [' || v_perslid || ']');
                  END;
               ELSE
                  v_perslid_key := NULL;
               END IF;

               v_kostenplaats_limiet := TRIM (v_kostenplaats_limiet);

               v_kostenplaats_limietperiode := UPPER (TRIM (v_kostenplaats_limietperiode));

               IF v_kostenplaats_limietperiode IS NOT NULL
              AND v_kostenplaats_limietperiode NOT IN ('J', 'M')
               THEN
                  fac.imp_writelog (
                     p_import_key,
                     'E',
                     v_aanduiding || 'Budgetperiode-aanduiding kan niet gevonden worden',
                     'Budgetperiode wordt leeg gemaakt [' || v_kostenplaats_limietperiode || ']');
               END IF;

               v_kostenplaats_extern := TRIM (v_kostenplaats_extern);

               IF v_kostenplaats_extern IS NOT NULL AND v_kostenplaats_extern NOT IN ('0', '1')
               THEN
                  v_kostenplaats_extern := NULL;
                  fac.imp_writelog (
                     p_import_key,
                     'E',
                     v_aanduiding || 'Kostenplaats extern-aanduiding kan niet gevonden worden',
                     'Kostenplaats_extern-aanduiding wordt leeg gemaakt');
               END IF;

               v_kostenplaats_fiat := TRIM (v_kostenplaats_fiat);

               IF v_kostenplaats_fiat IS NOT NULL AND v_kostenplaats_fiat NOT IN ('0', '1')
               THEN
                  v_kostenplaats_fiat := NULL;
                  fac.imp_writelog (
                     p_import_key,
                     'E',
                     v_aanduiding || 'Opdrachtfiatteren-aanduiding kan niet gevonden worden',
                     'Opdrachtfiatteren-aanduiding wordt leeg gemaakt');
               END IF;
             
            IF v_fiatteur_1 IS NOT NULL
            THEN
              BEGIN
                     SELECT prs_perslid_key
                       INTO v_fiatteur_1_key
                       FROM prs_perslid
                      WHERE prs_perslid_oslogin = UPPER (v_fiatteur_1)
                         OR prs_perslid_oslogin = UPPER (v_fiatteur_1);
                  EXCEPTION
                     WHEN NO_DATA_FOUND
                     THEN
                        v_fiatteur_1_key := NULL;

                        fac.imp_writelog (
                           p_import_key,
                           'E',
                           v_aanduiding || 'Fiatteur 1 kan niet gevonden worden',
                           'Fiatteur 1 wordt leeg gemaakt [' || v_fiatteur_1 || ']');
                  END;
               ELSE
                  v_fiatteur_1_key := NULL;
               END IF;
             
            IF v_fiatteur_2 IS NOT NULL
            THEN
              BEGIN
                     SELECT prs_perslid_key
                       INTO v_fiatteur_2_key
                       FROM prs_perslid
                      WHERE prs_perslid_oslogin = UPPER (v_fiatteur_2)
                         OR prs_perslid_oslogin = UPPER (v_fiatteur_2);
                  EXCEPTION
                     WHEN NO_DATA_FOUND
                     THEN
                        v_fiatteur_2_key := NULL;

                        fac.imp_writelog (
                           p_import_key,
                           'E',
                           v_aanduiding || 'Fiatteur 2 kan niet gevonden worden',
                           'Fiatteur 3 wordt leeg gemaakt [' || v_fiatteur_2 || ']');
                  END;
               ELSE
                  v_fiatteur_2_key := NULL;
               END IF;
               
            IF v_fiatteur_3 IS NOT NULL
            THEN
              BEGIN
                     SELECT prs_perslid_key
                       INTO v_fiatteur_3_key
                       FROM prs_perslid
                      WHERE prs_perslid_oslogin = UPPER (v_fiatteur_3)
                         OR prs_perslid_oslogin = UPPER (v_fiatteur_3);
                  EXCEPTION
                     WHEN NO_DATA_FOUND
                     THEN
                        v_fiatteur_3_key := NULL;

                        fac.imp_writelog (
                           p_import_key,
                           'E',
                           v_aanduiding || 'Fiatteur 3 kan niet gevonden worden',
                           'Fiatteur 3 wordt leeg gemaakt [' || v_fiatteur_3 || ']');
                  END;
               ELSE
                  v_fiatteur_3_key := NULL;
               END IF;

            v_all_null :=
                   (v_bedrijf_naam IS NULL)
               AND (v_afdeling_naam IS NULL)
               AND (v_afdeling_naam_parent IS NULL)
               AND (v_afdeling_omschrijving IS NULL)
               AND (v_kostenplaats_nr IS NULL);

            -- Insert geformatteerde import record
            IF v_ongeldig = 0
            THEN
               v_errormsg := 'Fout bij toevoegen te impoteren bedrijf/afdeling/kostenplaats [' || v_aanduiding || ']';

               INSERT INTO DVON_IMP_ORGKOST (prs_bedrijf_naam,
                                             prs_afdeling_naam,
                                             prs_afdeling_naam_parent,
                                             prs_afdeling_omschrijving,
                                             prs_kostenplaats_nr,
                                             prs_kostenplaats_omschrijving,
                                             prs_kostenplaats_module,
                                             prs_kostenplaats_begin,
                                             prs_kostenplaats_eind,
                                             prs_kostenplaatsgrp_key,
                                             prs_perslid_key,
                                             prs_kostenplaats_limiet,
                                             prs_kostenplaats_limietperiode,
                                             prs_kostenplaats_extern,
                                             prs_kostenplaats_fiat,
                                             prs_fiatteur_1,
                                             prs_fiatteur_2,
                                             prs_fiatteur_3,
                                             prs_kostenplaatsgrp_oms,
                                             prs_kostenplaatsgrp_nr,                                             
                                             prs_kostenplaatsgrp_limiet,
                                             prs_kostenplaatsgrp_limietp
                                             )
                 VALUES   (
                              v_bedrijf_naam,
                              v_afdeling_naam,
                              v_afdeling_naam_parent,
                              v_afdeling_omschrijving,
                              v_kostenplaats_nr,
                              v_kostenplaats_omschrijving,
                              v_kostenplaats_module,
                              v_kostenplaats_begin_d,
                              v_kostenplaats_eind_d,
                              v_kostenplaatsgrp_key,
                              v_perslid_key,
                              fac.safe_to_number (v_kostenplaats_limiet),
                              DECODE (v_kostenplaats_limietperiode, 'M', 1, 'J', 2, 0),
                              fac.safe_to_number (v_kostenplaats_extern),
                              fac.safe_to_number (v_kostenplaats_fiat),
                              v_fiatteur_1_key,
                              v_fiatteur_2_key,
                              v_fiatteur_3_key,
                              v_kostenplaatsgrp_oms,
                              v_kostenplaatsgrp_nr,
                              fac.safe_to_number (v_kostenplaatsgrp_limiet),
                              DECODE (v_kostenplaatsgrp_limietp, 'M', 1, 'J', 2, 0)
                              );

               v_count_import := v_count_import + 1;
            END IF;
         END IF;
      END;
   END LOOP;

   IF (header_is_valid = 0)
   THEN
      fac.imp_writelog (p_import_key,
                        'E',
                        v_aanduiding || 'Ongeldig importbestand',
                        'Geen geldige headerregel aanwezig'
                       );
   ELSE
      fac.imp_writelog (p_import_key, 'S', 'Bedrijf: aantal ingelezen regels: ' || TO_CHAR (v_count_tot), '');
      fac.imp_writelog (p_import_key,
                        'S',
                        'Bedrijf: aantal ongeldige 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 := 'error ' || oracle_err_num || '/' || oracle_err_mes;
      fac.imp_writelog (p_import_key, 'E', v_errormsg, '');
END dvon_import_orgkost;
/


CREATE OR REPLACE PROCEDURE dvon_import_orgkost_del (
  p_import_key IN NUMBER
) IS

BEGIN

  dvon_import_orgkost(p_import_key);

END;
/

CREATE OR REPLACE PROCEDURE DVON_UPDATE_ORGKOST (p_import_key IN NUMBER)
AS
   v_errormsg       VARCHAR2 (1000) := '-';
   oracle_err_num   NUMBER;
   oracle_err_mes   VARCHAR2 (200);
   v_aanduiding     VARCHAR2 (200);

-- SUBPROC   
 PROCEDURE add_organisatie (
   p_import_key IN NUMBER
) IS

  c_fielddelimitor            VARCHAR2 (1) := ';';

  v_newline                   fac_imp_file.fac_imp_file_line%TYPE;    -- Input line
  v_errormsg                  VARCHAR2 (1000);
  v_errorhint                 VARCHAR2 (1000);
  oracle_err_num              NUMBER;
  oracle_err_mes              VARCHAR2 (200);
  v_aanduiding                VARCHAR2 (200);

  v_count                     NUMBER(10);
  v_ongeldig                  NUMBER(1);
  v_count_update              NUMBER(10);
  v_count_error               NUMBER(10);
  v_count_tot                 NUMBER(10);

  --
  v_bedrijf_key               NUMBER(10);
  v_kostenplaats_key          NUMBER(10);
  v_prs_afdeling_parentkey    NUMBER(10);

  CURSOR cBedrijf
  IS
    SELECT  min(prs_bedrijf_naam) prs_bedrijf_naam
      FROM  DVON_IMP_ORGKOST
      WHERE prs_bedrijf_naam is not null
     GROUP BY upper(prs_bedrijf_naam);

  recBedrijf cBedrijf%ROWTYPE;

  -- Bij 1-op-1 relatie tussen kostenplaats en afdeling de kostenplaatsomschrijving zetten op
  -- de afdelingsomschrijving, ander de kostenplaatsomschrijving leeg laten.
  CURSOR cKPN
  IS
    SELECT  MIN(prs_kostenplaats_nr)                              prs_kostenplaats_nr,
            DECODE(COUNT(*),1,MAX(prs_afdeling_omschrijving),'')  prs_kostenplaats_omschrijving,
            'PRS'                                                 prs_kostenplaats_module
      FROM  DVON_IMP_ORGKOST
      WHERE prs_kostenplaats_nr IS NOT NULL
     GROUP BY UPPER(prs_kostenplaats_nr);

  recKPN cKpn%ROWTYPE;

  CURSOR cAfdeling1
  IS
    SELECT    MIN(prs_bedrijf_naam)                 prs_bedrijf_naam
             ,UPPER(prs_bedrijf_naam)               prs_bedrijf_naam_upper
             ,MIN(prs_afdeling_naam)                prs_afdeling_naam
             ,UPPER(prs_afdeling_naam)              prs_afdeling_upper
             ,MAX(prs_afdeling_omschrijving)        prs_afdeling_omschrijving
             ,MIN(prs_afdeling_naam_parent)         prs_afdeling_naam_parent
             ,MIN(UPPER(prs_afdeling_naam_parent))  prs_afdeling_naam_parent_upper
             ,MAX(prs_kostenplaats_nr)              prs_kostenplaats_nr
             ,MAX(UPPER(prs_kostenplaats_nr))       prs_kostenplaats_upper
             ,NIVEAU
        FROM  (SELECT 1  NIVEAU,
                      a1.prs_bedrijf_naam,
                      a1.prs_afdeling_naam,
                      a1.prs_afdeling_omschrijving,
                      a1.prs_kostenplaats_nr,
                      '' PRS_AFDELING_NAAM_PARENT
                 FROM DVON_IMP_ORGKOST a1
                WHERE a1.prs_afdeling_naam_parent IS NULL
              UNION ALL
               SELECT 2,
                      a2.prs_bedrijf_naam,
                      a2.prs_afdeling_naam,
                      a2.prs_afdeling_omschrijving,
                      a2.prs_kostenplaats_nr,
                      a1.prs_afdeling_naam
                 FROM DVON_IMP_ORGKOST a1, DVON_IMP_ORGKOST a2
                WHERE a2.prs_afdeling_naam_parent = a1.prs_afdeling_naam
                  AND a1.prs_afdeling_naam_parent IS NULL
              UNION ALL
               SELECT 3,
                      a3.prs_bedrijf_naam,
                      a3.prs_afdeling_naam,
                      a3.prs_afdeling_omschrijving,
                      a3.prs_kostenplaats_nr,
                      a2.prs_afdeling_naam
                 FROM DVON_IMP_ORGKOST a1, DVON_IMP_ORGKOST a2, DVON_IMP_ORGKOST a3
                WHERE a3.prs_afdeling_naam_parent = a2.prs_afdeling_naam
                  AND a2.prs_afdeling_naam_parent = a1.prs_afdeling_naam
                  AND a1.prs_afdeling_naam_parent IS NULL
              UNION ALL
               SELECT 4,
                      a4.prs_bedrijf_naam,
                      a4.prs_afdeling_naam,
                      a4.prs_afdeling_omschrijving,
                      a4.prs_kostenplaats_nr,
                      a3.prs_afdeling_naam
                 FROM DVON_IMP_ORGKOST a1, DVON_IMP_ORGKOST a2, DVON_IMP_ORGKOST a3, DVON_IMP_ORGKOST a4
                WHERE a4.prs_afdeling_naam_parent = a3.prs_afdeling_naam
                  AND a3.prs_afdeling_naam_parent = a2.prs_afdeling_naam
                  AND a2.prs_afdeling_naam_parent = a1.prs_afdeling_naam
                  AND a1.prs_afdeling_naam_parent IS NULL
              UNION ALL
               SELECT 5,
                      a5.prs_bedrijf_naam,
                      a5.prs_afdeling_naam,
                      a5.prs_afdeling_omschrijving,
                      a5.prs_kostenplaats_nr,
                      a4.prs_afdeling_naam
                 FROM DVON_IMP_ORGKOST a1, DVON_IMP_ORGKOST a2, DVON_IMP_ORGKOST a3, DVON_IMP_ORGKOST a4, DVON_IMP_ORGKOST a5
                WHERE a5.prs_afdeling_naam_parent = a4.prs_afdeling_naam
                  AND a4.prs_afdeling_naam_parent = a3.prs_afdeling_naam
                  AND a3.prs_afdeling_naam_parent = a2.prs_afdeling_naam
                  AND a2.prs_afdeling_naam_parent = a1.prs_afdeling_naam
                  AND a1.prs_afdeling_naam_parent IS NULL)
       WHERE ((prs_bedrijf_naam IS NOT NULL) AND (prs_afdeling_naam IS NOT NULL)) -- geen lege regels
    GROUP BY UPPER(prs_bedrijf_naam), UPPER(prs_afdeling_naam), NIVEAU
    ORDER BY NIVEAU;

  recAfdeling1 cAfdeling1%ROWTYPE;

BEGIN

  OPEN cBedrijf;
  v_count_update := 0;
  v_count_tot := 0;
  v_count_error := 0;
  IF cBedrijf%ISOPEN THEN

    LOOP
      BEGIN

        FETCH cBedrijf INTO recBedrijf;
        EXIT WHEN cBedrijf%NOTFOUND;
        v_count_tot := v_count_tot + 1;

        v_aanduiding := recBedrijf.PRS_BEDRIJF_NAAM||'| ';
        v_errormsg := '';
        v_errorhint := '';

        v_errorhint := 'Kijken of bedrijf al bestaat';
        SELECT count(*)
        INTO   v_count
        FROM   prs_bedrijf
        WHERE  upper(prs_bedrijf_naam_upper) = upper(recBedrijf.prs_bedrijf_naam)
        AND    prs_bedrijf_verwijder is null;

        IF (v_count = 0) THEN

          v_errorhint := 'Fout bij toevoegen bedrijf';
          INSERT INTO PRS_BEDRIJF (
           prs_bedrijf_naam
          ,prs_bedrijf_intern
          ) VALUES (
          recBedrijf.prs_bedrijf_naam
          ,1
          );

          commit;
          v_count_update := v_count_update + 1;

        END IF;

        EXCEPTION WHEN OTHERS THEN
          v_count_error := v_count_error + 1;
          oracle_err_num := SQLCODE;
          oracle_err_mes := SUBSTR(SQLERRM, 1, 200);
          IF (v_errormsg = '') THEN
            v_errormsg := 'Fout tijdens verwerken van bedrijf ['||recBedrijf.PRS_BEDRIJF_NAAM||']';
          END IF;
          v_errorhint := v_errorhint||': ' || oracle_err_mes;

          fac.imp_writelog (p_import_key,
                        'E',
                        v_aanduiding||v_errormsg,
                        v_errorhint
                       );

          commit; -- tbv logging

      END;
    END LOOP;

    fac.imp_writelog (p_import_key,
                  'S',
                  'Bedrijf: verwerkte regels zonder foutmelding: '||to_char(v_count_tot-v_count_error),
                  ''
                 );

    fac.imp_writelog (p_import_key,
                  'S',
                  'Bedrijf: verwerkte regels met foutmelding: <b>'||to_char(v_count_error),
                  ''
                 );

  END IF;

  OPEN cKPN;
  v_count_update := 0;
  v_count_tot := 0;
  v_count_error := 0;
  IF cKPN%ISOPEN THEN

    LOOP
      BEGIN
        v_aanduiding := recKPN.PRS_KOSTENPLAATS_NR||'| ';
        v_errormsg := '';
        v_errorhint := '';

        FETCH cKPN INTO recKPN;
        EXIT WHEN cKPN%NOTFOUND;
        v_count_tot := v_count_tot + 1;

        v_aanduiding := recBedrijf.PRS_BEDRIJF_NAAM||'| ';
        v_errormsg := '';
        v_errorhint := '';

        v_errorhint := 'Kijken of de kostenplaats al bestaat';
        SELECT count(*)
        INTO   v_count
        FROM   prs_kostenplaats
        WHERE  prs_kostenplaats_verwijder is null
        AND    upper(prs_kostenplaats_upper) = upper(recKPN.prs_kostenplaats_nr);

        IF (v_count = 0) THEN

          v_errorhint := 'Fout bij toevoegen kostenplaats';
          INSERT INTO PRS_KOSTENPLAATS
          (PRS_KOSTENPLAATS_NR
          ,PRS_KOSTENPLAATS_OMSCHRIJVING
          ,PRS_KOSTENPLAATS_MODULE)
          VALUES
          (recKPN.prs_kostenplaats_nr
          ,recKPN.prs_kostenplaats_omschrijving
          ,recKPN.prs_kostenplaats_module);

          commit;
          v_count_update := v_count_update + 1;

        END IF;

        EXCEPTION WHEN OTHERS THEN
          v_count_error := v_count_error + 1;
          oracle_err_num := SQLCODE;
          oracle_err_mes := SUBSTR(SQLERRM, 1, 200);
          IF (v_errormsg = '') THEN
            v_errormsg := 'Fout tijdens verwerken van kostenplaats ['||recKPN.PRS_KOSTENPLAATS_NR||']';
          END IF;
          v_errorhint := v_errorhint||': ' || oracle_err_mes;

          fac.imp_writelog (p_import_key,
                        'E',
                        v_aanduiding||v_errormsg,
                        v_errorhint
                       );

          commit; -- tbv logging

      END;
    END LOOP;

    fac.imp_writelog (p_import_key,
                  'S',
                  'Kostenplaats: verwerkte regels zonder foutmelding: '||to_char(v_count_tot-v_count_error),
                  ''
                 );

    fac.imp_writelog (p_import_key,
                  'S',
                  'Kostenplaats: verwerkte regels met foutmelding: <b>'||to_char(v_count_error),
                  ''
                 );

  END IF;


  OPEN cAfdeling1;
  v_count_update := 0;
  v_count_tot := 0;
  v_count_error := 0;
  IF cAfdeling1%ISOPEN THEN

    LOOP
      BEGIN

        FETCH cAfdeling1 INTO recAfdeling1;
        EXIT WHEN cAfdeling1%NOTFOUND;
        v_count_tot := v_count_tot + 1;

        v_aanduiding := recAfdeling1.prs_bedrijf_naam||'|'||recAfdeling1.prs_afdeling_naam||'|'||recAfdeling1.prs_afdeling_naam_parent ||'| ';
        v_errormsg := '';
        v_errorhint := '';

        IF (recAfdeling1.niveau = 1) THEN
          v_errorhint := 'Bedrijf niet gevonden bij afdeling';
          v_prs_afdeling_parentkey := to_number(NULL);
          SELECT prs_bedrijf_key
          INTO   v_bedrijf_key
          FROM   prs_bedrijf
          WHERE  prs_bedrijf_verwijder IS NULL
          AND    prs_bedrijf_naam_upper = recAfdeling1.prs_bedrijf_naam_upper;
        ELSE
          v_errorhint := 'Parent van de afdeling niet gevonden';
          v_bedrijf_key := to_number(NULL);
          SELECT prs_afdeling_key
          INTO   v_prs_afdeling_parentkey
          FROM   prs_afdeling
          WHERE  prs_afdeling_verwijder IS NULL
          AND    prs_afdeling_upper = recAfdeling1.prs_afdeling_naam_parent_upper;
        END IF;

        v_errorhint := 'Bepalen of afdeling bestaat';
        SELECT count(*)
        INTO   v_count
        FROM   prs_afdeling
        WHERE  upper(rtrim(prs_afdeling_omschrijving)) = upper(rtrim(recAfdeling1.prs_afdeling_omschrijving))
        AND    prs_afdeling_verwijder is null;

        v_errorhint := 'Kostenplaats bij afdeling bepalen';
        SELECT  COUNT(*), NVL(MAX(prs_kostenplaats_key),to_number(NULL))
        INTO    v_count, v_kostenplaats_key
        FROM    PRS_KOSTENPLAATS
        WHERE   prs_kostenplaats_verwijder IS NULL
        AND     prs_kostenplaats_upper = UPPER(trim(recAfdeling1.prs_kostenplaats_upper))
        AND     UPPER(prs_kostenplaats_module) = 'PRS';

        v_errorhint := 'Kostenplaats bij afdeling bepalen';
        SELECT  COUNT(*)
        INTO    v_count
        FROM    PRS_AFDELING
        WHERE   prs_afdeling_verwijder IS NULL
        AND     prs_afdeling_upper = UPPER(trim(recAfdeling1.prs_afdeling_upper));

        v_errorhint := 'Fout bij toevoegen afdeling';
        IF (v_count = 0) THEN

          INSERT INTO PRS_AFDELING
          (prs_afdeling_naam
          ,prs_afdeling_omschrijving
          ,prs_bedrijf_key
          ,prs_afdeling_parentkey
          ,prs_kostenplaats_key
          )
           VALUES
          (recAfdeling1.prs_afdeling_naam
          ,recAfdeling1.prs_afdeling_omschrijving
          ,v_bedrijf_key
          ,v_prs_afdeling_parentkey
          ,v_kostenplaats_key
          );

          COMMIT;
          v_count_update := v_count_update + 1;

        END IF;

        EXCEPTION WHEN OTHERS THEN

          v_count_error := v_count_error + 1;
          oracle_err_num := SQLCODE;
          oracle_err_mes := SUBSTR(SQLERRM, 1, 200);
          IF (v_errormsg = '') THEN
            v_errormsg := 'Fout tijdens verwerken van afdeling ['||recAfdeling1.PRS_AFDELING_NAAM||']';
          END IF;
          v_errorhint := v_errorhint||': ' || oracle_err_mes;

          fac.imp_writelog (p_import_key,
                        'E',
                        v_aanduiding||v_errormsg,
                        v_errorhint
                       );

          commit; -- tbv logging
      END;
    END LOOP;

    fac.imp_writelog (p_import_key,
                  'S',
                  'Afdeling: verwerkte regels zonder foutmelding: '||to_char(v_count_tot-v_count_error),
                  ''
                 );

    fac.imp_writelog (p_import_key,
                  'S',
                  'Afdeling: verwerkte regels met foutmelding: <b>'||to_char(v_count_error),
                  ''
                 );

  END IF;
  CLOSE cAfdeling1;
  END;
  
  -- SUBPROC
  PROCEDURE add_organisatie_del (
   p_import_key IN NUMBER
) IS

BEGIN

  fac.imp_prs_delete_organisatie(p_import_key,1);
  add_organisatie(p_import_key);

END;

 -- SUBPROC
PROCEDURE update_kostenplaats (p_import_key IN NUMBER)
AS
   CURSOR c
   IS
      SELECT DISTINCT
             prs_kostenplaats_nr,           
             prs_kostenplaats_omschrijving,      
             prs_kostenplaats_module,           
             prs_kostenplaats_begin,            
             prs_kostenplaats_eind,            
             prs_kostenplaatsgrp_key,           
             prs_perslid_key,             
             prs_kostenplaats_limiet,          
             prs_kostenplaats_limietperiode,   
             prs_kostenplaats_extern,
             prs_kostenplaats_fiat,  
             prs_kostenplaatsgrp_oms,
             prs_kostenplaatsgrp_nr,
             prs_fiatteur_1,
             prs_fiatteur_2,
             prs_fiatteur_3,
             prs_kostenplaatsgrp_limiet,
             prs_kostenplaatsgrp_limietp
             FROM DVON_IMP_ORGKOST;

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

   v_kostenplaats_key     prs_kostenplaats.prs_kostenplaats_key%TYPE;
   v_kostenplaatsgrp_key  prs_kostenplaatsgrp.prs_kostenplaatsgrp_key%TYPE;
   
BEGIN
   FOR rec IN c
   LOOP
      BEGIN
         BEGIN
            v_aanduiding := rec.prs_kostenplaatsgrp_nr || '|' || rec.prs_kostenplaatsgrp_oms;

            v_errorhint := 'Opzoeken kostenplaatsgroep';

            SELECT prs_kostenplaatsgrp_key
              INTO v_kostenplaatsgrp_key
              FROM prs_kostenplaatsgrp
             WHERE UPPER (prs_kostenplaatsgrp_oms) = UPPER (rec.prs_kostenplaatsgrp_oms);
         EXCEPTION
            WHEN NO_DATA_FOUND
            THEN
               v_errorhint := 'Toevoegen kostenplaatsgroep';

               INSERT INTO prs_kostenplaatsgrp (prs_kostenplaatsgrp_oms)
                   VALUES (rec.prs_kostenplaats_omschrijving)
                RETURNING prs_kostenplaatsgrp_key
                     INTO v_kostenplaatsgrp_key;
         END;
      
         BEGIN
            v_aanduiding := rec.prs_kostenplaats_nr || '|' || rec.prs_kostenplaats_omschrijving;

            v_errorhint := 'Opzoeken kostenplaats';

            SELECT prs_kostenplaats_key
              INTO v_kostenplaats_key
              FROM prs_kostenplaats
             WHERE prs_kostenplaats_verwijder IS NULL
               AND prs_kostenplaats_upper = UPPER (rec.prs_kostenplaats_nr);
         EXCEPTION
            WHEN NO_DATA_FOUND
            THEN
               v_errorhint := 'Toevoegen kostenplaats';

               INSERT INTO prs_kostenplaats (prs_kostenplaats_nr,
                                             prs_kostenplaats_module,
                                             prs_kostenplaats_omschrijving)
                   VALUES (rec.prs_kostenplaats_nr,
                           rec.prs_kostenplaats_module,
                           rec.prs_kostenplaats_omschrijving)
                RETURNING prs_kostenplaats_key
                     INTO v_kostenplaats_key;
         END;

          -- Even de kostenplaats groep updaten, dit kunnen fiatteuren en/of limieten zijn
        UPDATE prs_kostenplaatsgrp g
           SET prs_kostenplaatsgrp_oms = rec.prs_kostenplaatsgrp_oms,
               prs_kostenplaatsgrp_limiet = rec.prs_kostenplaatsgrp_limiet,
               prs_kostenplaatsgrp_limperiode = rec.prs_kostenplaatsgrp_limietp,
               prs_kostenplaatsgrp_nr = rec.prs_kostenplaatsgrp_nr,
               prs_perslid_key = rec.prs_fiatteur_1,
               prs_kostenplaatsgrp_fiat2_key = rec.prs_fiatteur_2,
               prs_kostenplaatsgrp_fiat3_key = rec.prs_fiatteur_3
         WHERE g.prs_kostenplaatsgrp_key = v_kostenplaatsgrp_key;

        -- We hebben nu een kostenplaats record aangemaakt of gevonden.
         -- Dan gaan we deze nu updaten.
         v_errorhint := 'Aanpassen kostenplaats';

         UPDATE prs_kostenplaats k
            SET prs_kostenplaats_omschrijving = rec.prs_kostenplaats_omschrijving,
                prs_kostenplaats_module = rec.prs_kostenplaats_module,
                prs_kostenplaats_begin = rec.prs_kostenplaats_begin,
                prs_kostenplaats_eind = rec.prs_kostenplaats_eind,
                prs_kostenplaatsgrp_key = rec.prs_kostenplaatsgrp_key,
                prs_perslid_key = rec.prs_perslid_key,
                prs_kostenplaats_limiet = rec.prs_kostenplaats_limiet,
                prs_kostenplaats_limietperiode = rec.prs_kostenplaats_limietperiode,
                prs_kostenplaats_extern =
                   COALESCE (rec.prs_kostenplaats_extern, prs_kostenplaats_extern),
                prs_kostenplaats_fiat = COALESCE (rec.prs_kostenplaats_fiat, prs_kostenplaats_fiat)
          WHERE k.prs_kostenplaats_key = v_kostenplaats_key;
         
      EXCEPTION
         WHEN OTHERS
         THEN
            oracle_err_num := SQLCODE;
            oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
            v_errormsg := 'error ' || oracle_err_num || '/' || oracle_err_mes;
            fac.imp_writelog (p_import_key,
                              'E',
                              v_errormsg,
                              v_errorhint || ' | ' || v_aanduiding);
      END;
   END LOOP;
EXCEPTION
   WHEN OTHERS
   THEN
      oracle_err_num := SQLCODE;
      oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
      v_errormsg := 'error ' || oracle_err_num || '/' || oracle_err_mes;
      fac.imp_writelog (p_import_key,
                        'E',
                        v_errormsg,
                        v_errorhint || ' | ' || v_aanduiding);
END;

-- MAIN
BEGIN
   add_organisatie (p_import_key);
   add_organisatie_del (p_import_key);
   update_kostenplaats (p_import_key);
EXCEPTION
   WHEN OTHERS
   THEN
      oracle_err_num := SQLCODE;
      oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
      v_errormsg :=
            v_errormsg
         || ' (error '
         || oracle_err_num
         || '/'
         || oracle_err_mes
         || ')';
      fac.imp_writelog (p_import_key,
                        'E',
                        v_errormsg,
                        'Importproces afgebroken!');
END DVON_UPDATE_ORGKOST;
/

CREATE OR REPLACE PROCEDURE dvon_import_extrains (p_import_key IN NUMBER)
IS
   c_delim                         VARCHAR2 (1) := ';';
   v_newline                       fac_imp_file.fac_imp_file_line%TYPE;    -- 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 (400);
   v_ins_srtkenmerk_key1           VARCHAR2 (255);
   v_ins_srtkenmerk_key2           VARCHAR2 (255);
   v_ins_srtkenmerk_key3           VARCHAR2 (255);
   v_ins_srtkenmerk_key4           VARCHAR2 (255);
   v_ins_srtkenmerk_key5           VARCHAR2 (255);
   v_ins_srtkenmerk_key6           VARCHAR2 (255);
   v_ins_srtkenmerk_key7           VARCHAR2 (255);
   v_ins_srtkenmerk_key8           VARCHAR2 (255);
   v_ins_srtkenmerk_key9           VARCHAR2 (255);
   v_ins_srtkenmerk_key10          VARCHAR2 (255);
   v_ins_srtkenmerk_key11          VARCHAR2 (255);
   v_ins_srtkenmerk_key12          VARCHAR2 (255);
   v_ins_srtkenmerk_key13          VARCHAR2 (255);
   v_ins_srtkenmerk_key14          VARCHAR2 (255);
   v_ins_srtkenmerk_key15          VARCHAR2 (255);
   v_ins_srtkenmerk_key16          VARCHAR2 (255);
   v_ins_srtkenmerk_key17          VARCHAR2 (255);
   v_ins_srtkenmerk_key18          VARCHAR2 (255);
   v_ins_srtkenmerk_key19          VARCHAR2 (255);
   v_ins_srtkenmerk_key20          VARCHAR2 (255);
   -- De importvelden
   v_ins_discipline_omschrijving   VARCHAR2 (255);                      -- C60
   v_ins_discipline_kostensoort    VARCHAR2 (255);                       --C60
   v_ins_srtgroep_omschrijving     VARCHAR2 (255);                      -- C60
   v_ins_srtdeel_code              VARCHAR2 (255);                      -- C10
   v_ins_srtdeel_omschrijving      VARCHAR2 (255);                     -- C100
   v_ins_deel_omschrijving         VARCHAR2 (255);                      -- C60
   v_ins_deel_opmerking            VARCHAR2 (1000);                     -- C320
   v_reserveerbaar                 VARCHAR2 (255);                       -- C1
   v_reserveerbaar_n               NUMBER (1);                           -- N1
   v_res_deel_eenheid              VARCHAR2 (255);                      -- C10
   v_res_deel_prijs                VARCHAR2 (255);                     -- N7,2
   v_res_deel_prijs_n              NUMBER (7, 2);                      -- N7,2
   v_alg_locatie_code              VARCHAR2 (255);                      -- C10
   v_alg_gebouw_code               VARCHAR2 (255);                      -- C12
   v_alg_verdieping_volgnr         VARCHAR2 (255);                       -- N3
   v_alg_verdieping_volgnr_n       NUMBER (3);                           -- N3
   v_alg_ruimte_nr                 VARCHAR2 (255);                      -- C10
   v_res_deel_alg_level            VARCHAR2 (255);       -- C1 (naar -1 t/m 5)
   v_res_deel_alg_level_n          NUMBER (1);                           -- N1
   v_res_discipline_omschrijving   VARCHAR2 (255);                      -- C60
   v_res_discipline_kostensoort    VARCHAR2 (255);                      -- C60
   v_prs_perslid_matchcode         VARCHAR2 (255);
   v_prs_perslid_matchwaarde       VARCHAR2 (255);
   v_ins_kenmerkwaarde1            VARCHAR2 (4000);
   v_ins_kenmerkwaarde2            VARCHAR2 (4000);
   v_ins_kenmerkwaarde3            VARCHAR2 (4000);
   v_ins_kenmerkwaarde4            VARCHAR2 (4000);
   v_ins_kenmerkwaarde5            VARCHAR2 (4000);
   v_ins_kenmerkwaarde6            VARCHAR2 (4000);
   v_ins_kenmerkwaarde7            VARCHAR2 (4000);
   v_ins_kenmerkwaarde8            VARCHAR2 (4000);
   v_ins_kenmerkwaarde9            VARCHAR2 (4000);
   v_ins_kenmerkwaarde10           VARCHAR2 (4000);
   v_ins_kenmerkwaarde11           VARCHAR2 (4000);
   v_ins_kenmerkwaarde12           VARCHAR2 (4000);
   v_ins_kenmerkwaarde13           VARCHAR2 (4000);
   v_ins_kenmerkwaarde14           VARCHAR2 (4000);
   v_ins_kenmerkwaarde15           VARCHAR2 (4000);
   v_ins_kenmerkwaarde16           VARCHAR2 (4000);
   v_ins_kenmerkwaarde17           VARCHAR2 (4000);
   v_ins_kenmerkwaarde18           VARCHAR2 (4000);
   v_ins_kenmerkwaarde19           VARCHAR2 (4000);
   v_ins_kenmerkwaarde20           VARCHAR2 (4000);
   v_file_index                    NUMBER;

   -- Overige velden:
   CURSOR c1
   IS
        SELECT   *
          FROM   fac_imp_file
         WHERE   fac_import_key = p_import_key
      ORDER BY   fac_imp_file_index;

   -- Controleer tijdens import-fase alleen op bestaan van kenmerksoort (of
   -- deze - via een kenmerk - wel is gedefinieerd voor de betreffende object-
   -- discipline/groep/soort, volgt pas tijdens de update-fase)!
   --
   -- kw is bijvoorbeeld 'Parkeercode' of 'Parkeercode|3' waarbij de laatste in groep 3 zit
   -- het resultaat is NULL (als niet gevonden) of 234|3 voor strkenmer_key 234 in groep 3
   -- Als geen groep is meegegeven wordt 234|0 opgeleverd (de default groep)
   FUNCTION bepaal_srtkenmerk_key (p_kw IN VARCHAR)
      RETURN VARCHAR
   IS
      v_srtkenmerk_key   NUMBER;
      v_kenmerk_groep    NUMBER;
      v_kw               VARCHAR(250);
   BEGIN
      v_kenmerk_groep := 0;
      v_kw := p_kw;
      IF INSTR (v_kw, '|') > 1
      THEN
        v_kenmerk_groep := SUBSTR (v_kw, INSTR (v_kw, '|') + 1);
        v_kw := SUBSTR (v_kw, 1, INSTR (v_kw, '|') - 1);
      END IF;

     IF p_kw LIKE 'maat'
     THEN                -- maat, dus maar even wegzetten (wordt later gesplitst)
        SELECT   9999
          INTO   v_srtkenmerk_key
          FROM   DUAL;

       ELSE                    -- kenmerkwaarde is alfanumeriek (dus omschrijving)!
        SELECT   ins_srtkenmerk_key
          INTO   v_srtkenmerk_key
          FROM   ins_v_aanwezigsrtkenmerk
         WHERE   ins_srtkenmerk_upper = UPPER (v_kw)
                 AND ins_srtkenmerk_kenmerktype IN ('C', 'D', 'N', 'R', 'S', 'X', 'B');
   END IF;

      RETURN TO_CHAR(v_srtkenmerk_key) || '|' || TO_CHAR(v_kenmerk_groep);
   EXCEPTION
      WHEN NO_DATA_FOUND
      THEN
         IF p_kw IS NULL OR UPPER (p_kw) LIKE 'KENMERK%'
         THEN
            RETURN NULL;
         ELSE
            fac.imp_writelog (p_import_key,
                              'W',
                              'Fout bij bepalen kenmerksoort [' || p_kw || ']',
                              'Bestaat niet of type ongeldig');
            COMMIT;
            RETURN NULL;
         END IF;
   END;
BEGIN
   -- Eerst opruiming
   DELETE FROM   fac_imp_ins;

   COMMIT;

   v_count_tot := 0;
   v_count_import := 0;
   header_is_valid := 0;
   v_prs_perslid_matchcode := '';

   FOR rec1 IN c1
   LOOP
      BEGIN
         v_newline := rec1.fac_imp_file_line;
         v_file_index := rec1.fac_imp_file_index;
         v_errormsg := 'Fout bij opvragen importregel';
         v_aanduiding := '';
         v_ongeldig := 0;
         -- Lees alle veldwaarden
         fac.imp_getfield (v_newline, c_delim, v_ins_discipline_omschrijving);
         fac.imp_getfield (v_newline, c_delim, v_ins_discipline_kostensoort);
         fac.imp_getfield (v_newline, c_delim, v_ins_srtgroep_omschrijving);
         fac.imp_getfield (v_newline, c_delim, v_ins_srtdeel_code);
         fac.imp_getfield (v_newline, c_delim, v_ins_srtdeel_omschrijving);
         fac.imp_getfield (v_newline, c_delim, v_ins_deel_omschrijving);
         fac.imp_getfield (v_newline, c_delim, v_ins_deel_opmerking);
         fac.imp_getfield (v_newline, c_delim, v_reserveerbaar);
         fac.imp_getfield (v_newline, c_delim, v_res_deel_eenheid);
         fac.imp_getfield (v_newline, c_delim, v_res_deel_prijs);
         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_alg_verdieping_volgnr);
         fac.imp_getfield (v_newline, c_delim, v_alg_ruimte_nr);
         fac.imp_getfield (v_newline, c_delim, v_res_deel_alg_level);
         fac.imp_getfield (v_newline, c_delim, v_res_discipline_omschrijving);
         fac.imp_getfield (v_newline, c_delim, v_res_discipline_kostensoort);
         fac.imp_getfield (v_newline, c_delim, v_prs_perslid_matchcode);
         fac.imp_getfield (v_newline, c_delim, v_prs_perslid_matchwaarde);
         fac.imp_getfield (v_newline, c_delim, v_ins_kenmerkwaarde1);
         fac.imp_getfield (v_newline, c_delim, v_ins_kenmerkwaarde2);
         fac.imp_getfield (v_newline, c_delim, v_ins_kenmerkwaarde3);
         fac.imp_getfield (v_newline, c_delim, v_ins_kenmerkwaarde4);
         fac.imp_getfield (v_newline, c_delim, v_ins_kenmerkwaarde5);
         fac.imp_getfield (v_newline, c_delim, v_ins_kenmerkwaarde6);
         fac.imp_getfield (v_newline, c_delim, v_ins_kenmerkwaarde7);
         fac.imp_getfield (v_newline, c_delim, v_ins_kenmerkwaarde8);
         fac.imp_getfield (v_newline, c_delim, v_ins_kenmerkwaarde9);
         fac.imp_getfield (v_newline, c_delim, v_ins_kenmerkwaarde10);
         fac.imp_getfield (v_newline, c_delim, v_ins_kenmerkwaarde11);
         fac.imp_getfield (v_newline, c_delim, v_ins_kenmerkwaarde12);
         fac.imp_getfield (v_newline, c_delim, v_ins_kenmerkwaarde13);
         fac.imp_getfield (v_newline, c_delim, v_ins_kenmerkwaarde14);
         fac.imp_getfield (v_newline, c_delim, v_ins_kenmerkwaarde15);
         fac.imp_getfield (v_newline, c_delim, v_ins_kenmerkwaarde16);
         fac.imp_getfield (v_newline, c_delim, v_ins_kenmerkwaarde17);
         fac.imp_getfield (v_newline, c_delim, v_ins_kenmerkwaarde18);
         fac.imp_getfield (v_newline, c_delim, v_ins_kenmerkwaarde19);
         fac.imp_getfield (v_newline, c_delim, v_ins_kenmerkwaarde20);

         v_aanduiding :=
               '['
            || v_ins_discipline_omschrijving
            || '|'
            || v_ins_srtgroep_omschrijving
            || '|'
            || v_ins_srtdeel_code
            || '|'
            || v_ins_srtdeel_omschrijving
            || '|'
            || v_ins_deel_omschrijving
            || '] ';

         -- Ik controleer of ik een geldige header heb, dat is: in de juiste kolommen
         -- de juiste kolomkop. Ik controleer daarbij alle NIET-kenmerk kolommen!
         -- Ik negeer alles totdat ik een geldige header ben gepasseerd.
         IF (header_is_valid = 0)
         THEN
            IF UPPER (v_ins_discipline_omschrijving) =
                  'DISCIPLINEOMSCHRIJVING'
               AND UPPER (v_ins_discipline_kostensoort) =
                     'DISCIPLINEKOSTENSOORT'
               AND UPPER (v_ins_srtgroep_omschrijving) =
                     'GROEPSOORTOMSCHRIJVING'
               AND UPPER (v_ins_srtdeel_code) = 'OBJECTSOORTCODE'
               AND UPPER (v_ins_srtdeel_omschrijving) =
                     'OBJECTSOORTOMSCHRIJVING'
               AND UPPER (v_ins_deel_omschrijving) = 'OBJECTOMSCHRIJVING'
               AND UPPER (v_ins_deel_opmerking) = 'OBJECTOPMERKING'
               AND UPPER (v_reserveerbaar) = 'RESERVEERBAAR'
               AND UPPER (v_res_deel_eenheid) = 'EENHEID'
               AND UPPER (v_res_deel_prijs) = 'PRIJS'
               AND UPPER (v_alg_locatie_code) = 'LOCATIECODE'
               AND UPPER (v_alg_gebouw_code) = 'GEBOUWCODE'
               AND UPPER (v_alg_verdieping_volgnr) = 'BOUWLAAGVOLGNUMMER'
               AND UPPER (v_alg_ruimte_nr) = 'RUIMTENUMMER'
               AND UPPER (v_res_deel_alg_level) = 'RESERVERINGSCOPE'
               AND UPPER (v_res_discipline_omschrijving) = 'CATALOGUSNAAM'
               AND UPPER (v_res_discipline_kostensoort) =
                     'CATALOGUSKOSTENSOORT'
               AND UPPER (v_prs_perslid_matchcode) = 'PERSOONMATCHCODE'
               AND UPPER (v_prs_perslid_matchwaarde) = 'PERSOONMATCHWAARDE'
            THEN
               v_ins_srtkenmerk_key1 := bepaal_srtkenmerk_key (v_ins_kenmerkwaarde1);
               v_ins_srtkenmerk_key2 := bepaal_srtkenmerk_key (v_ins_kenmerkwaarde2);
               v_ins_srtkenmerk_key3 := bepaal_srtkenmerk_key (v_ins_kenmerkwaarde3);
               v_ins_srtkenmerk_key4 := bepaal_srtkenmerk_key (v_ins_kenmerkwaarde4);
               v_ins_srtkenmerk_key5 := bepaal_srtkenmerk_key (v_ins_kenmerkwaarde5);
               v_ins_srtkenmerk_key6 := bepaal_srtkenmerk_key (v_ins_kenmerkwaarde6);
               v_ins_srtkenmerk_key7 := bepaal_srtkenmerk_key (v_ins_kenmerkwaarde7);
               v_ins_srtkenmerk_key8 := bepaal_srtkenmerk_key (v_ins_kenmerkwaarde8);
               v_ins_srtkenmerk_key9 := bepaal_srtkenmerk_key (v_ins_kenmerkwaarde9);
               v_ins_srtkenmerk_key10 := bepaal_srtkenmerk_key (v_ins_kenmerkwaarde10);
               v_ins_srtkenmerk_key11 := bepaal_srtkenmerk_key (v_ins_kenmerkwaarde11);
               v_ins_srtkenmerk_key12 := bepaal_srtkenmerk_key (v_ins_kenmerkwaarde12);
               v_ins_srtkenmerk_key13 := bepaal_srtkenmerk_key (v_ins_kenmerkwaarde13);
               v_ins_srtkenmerk_key14 := bepaal_srtkenmerk_key (v_ins_kenmerkwaarde14);
               v_ins_srtkenmerk_key15 := bepaal_srtkenmerk_key (v_ins_kenmerkwaarde15);
               v_ins_srtkenmerk_key16 := bepaal_srtkenmerk_key (v_ins_kenmerkwaarde16);
               v_ins_srtkenmerk_key17 := bepaal_srtkenmerk_key (v_ins_kenmerkwaarde17);
               v_ins_srtkenmerk_key18 := bepaal_srtkenmerk_key (v_ins_kenmerkwaarde18);
               v_ins_srtkenmerk_key19 := bepaal_srtkenmerk_key (v_ins_kenmerkwaarde19);
               v_ins_srtkenmerk_key20 := bepaal_srtkenmerk_key (v_ins_kenmerkwaarde20);

               header_is_valid := 1;
            END IF;
         ELSE
            v_count_tot := v_count_tot + 1;
            -- Controleer alle veldwaarden
            v_errormsg := 'Disciplineomschrijving ongeldig';
            v_ins_discipline_omschrijving :=
               TRIM (v_ins_discipline_omschrijving);

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

            --
            v_errormsg := 'Kostensoort ongeldig';
            v_ins_discipline_kostensoort :=
               TRIM (v_ins_discipline_kostensoort);

            IF LENGTH (v_ins_discipline_kostensoort) > 60
            THEN
               v_ins_discipline_kostensoort :=
                  SUBSTR (v_ins_discipline_kostensoort, 1, 60);
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || v_errormsg,
                     'Disciplinekostensoort wordt afgebroken tot ['
                  || v_ins_discipline_kostensoort
                  || ']'
               );
            END IF;

            --
            v_errormsg := 'Groepsoortomschrijving ongeldig';
            v_ins_srtgroep_omschrijving := TRIM (v_ins_srtgroep_omschrijving);

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

            --
            v_errormsg := 'Objectsoortcode ongeldig';
            v_ins_srtdeel_code := TRIM (v_ins_srtdeel_code);

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

            --
            v_errormsg := 'Objectsoortomschrijving ongeldig';
            v_ins_srtdeel_omschrijving := TRIM (v_ins_srtdeel_omschrijving);

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

            --
            v_errormsg := 'Objectomschrijving ongeldig';
            v_ins_deel_omschrijving := TRIM (v_ins_deel_omschrijving);

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

            v_errormsg := 'Objectopmerking ongeldig';
            v_ins_deel_opmerking := TRIM (v_ins_deel_opmerking);

            IF LENGTH (v_ins_deel_opmerking) > 320
            THEN
               v_ins_deel_opmerking := SUBSTR (v_ins_deel_opmerking, 1, 320);
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || v_errormsg,
                     'Objectopmerking wordt afgebroken tot ['
                  || v_ins_deel_opmerking
                  || ']'
               );
            END IF;

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

            --
            v_errormsg := 'Eenheid ongeldig';
            v_res_deel_eenheid := TRIM (v_res_deel_eenheid);

            IF LENGTH (v_res_deel_eenheid) > 10
            THEN
               v_res_deel_eenheid := SUBSTR (v_res_deel_eenheid, 1, 10);
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || v_errormsg,
                     'Eenheid wordt afgebroken tot ['
                  || v_res_deel_eenheid
                  || ']'
               );
            END IF;

            --
            v_errormsg := 'Prijs ongeldig; maximale grootte 99999.99';
            v_res_deel_prijs := TRIM (v_res_deel_prijs);
            v_res_deel_prijs_n := NULL;

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

            --
            v_errormsg := 'Locatiecode ongeldig';
            v_alg_locatie_code := TRIM (v_alg_locatie_code);

            IF LENGTH (v_alg_locatie_code) > 10
            THEN
               v_alg_locatie_code := SUBSTR (v_alg_locatie_code, 1, 10);
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || v_errormsg,
                     'Locatiecode wordt afgebroken tot ['
                  || v_alg_locatie_code
                  || ']'
               );
            END IF;

            --
            v_errormsg := 'Gebouwcode ongeldig';
            v_alg_gebouw_code := TRIM (v_alg_gebouw_code);

            IF LENGTH (v_alg_gebouw_code) > 12
            THEN
               v_alg_gebouw_code := SUBSTR (v_alg_gebouw_code, 1, 12);
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || v_errormsg,
                     'Gebouwcode wordt afgebroken tot ['
                  || v_alg_gebouw_code
                  || ']'
               );
            END IF;

            --
            v_errormsg := 'Bouwlaagvolgnummer ongeldig';
            v_alg_verdieping_volgnr := TRIM (v_alg_verdieping_volgnr);
            v_alg_verdieping_volgnr_n := NULL;

            IF (v_alg_verdieping_volgnr IS NOT NULL)
            THEN
               v_alg_verdieping_volgnr_n :=
                  ROUND (fac.safe_to_number (v_alg_verdieping_volgnr));

               IF v_alg_verdieping_volgnr_n NOT BETWEEN -999 AND 999
               THEN
                  v_ongeldig := 1;
                  fac.imp_writelog (p_import_key,
                                    'W',
                                    v_aanduiding || v_errormsg,
                                    'Regel wordt overgeslagen!');
               ELSE
                  v_alg_verdieping_volgnr_n :=
                     fac.safe_to_number (v_alg_verdieping_volgnr);
               END IF;
            END IF;

            --
            v_errormsg := 'Ruimtenummer ongeldig';
            v_alg_ruimte_nr := TRIM (v_alg_ruimte_nr);

            IF LENGTH (v_alg_ruimte_nr) > 10
            THEN
               v_alg_ruimte_nr := SUBSTR (v_alg_ruimte_nr, 1, 10);
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || v_errormsg,
                     'Ruimtenummer wordt afgebroken tot ['
                  || v_alg_ruimte_nr
                  || ']'
               );
            END IF;

            -- Verder geen foutdetectie; kan dus stricter?
            SELECT   DECODE (SUBSTR (TRIM (v_res_deel_alg_level), 1, 1),
                             'E', 0,
                             'D', 1,
                             'L', 2,
                             'G', 3,
                             'V', 4,
                             'R', 5,
                             -1)
              INTO   v_res_deel_alg_level_n
              FROM   DUAL;

            --
            v_errormsg := 'Catalogusnaam ongeldig';
            v_res_discipline_omschrijving :=
               TRIM (v_res_discipline_omschrijving);

            IF LENGTH (v_res_discipline_omschrijving) > 60
            THEN
               v_res_discipline_omschrijving :=
                  SUBSTR (TRIM (v_res_discipline_omschrijving), 1, 60);
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || v_errormsg,
                     'Catalogusnaam wordt afgebroken tot ['
                  || v_res_discipline_omschrijving
                  || ']'
               );
            END IF;

            --
            v_errormsg := 'Cataloguskostensoort ongeldig';
            v_res_discipline_kostensoort :=
               TRIM (v_res_discipline_kostensoort);

            IF LENGTH (v_res_discipline_kostensoort) > 60
            THEN
               v_res_discipline_kostensoort :=
                  SUBSTR (TRIM (v_res_discipline_kostensoort), 1, 60);
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || v_errormsg,
                     'Cataloguskostensoort wordt afgebroken tot ['
                  || v_res_discipline_kostensoort
                  || ']'
               );
            END IF;

            -- De rest alleen ff trimmen.
            v_prs_perslid_matchcode := TRIM (v_prs_perslid_matchcode);
            v_prs_perslid_matchwaarde := TRIM (v_prs_perslid_matchwaarde);
            v_ins_kenmerkwaarde1 := TRIM (v_ins_kenmerkwaarde1);
            v_ins_kenmerkwaarde2 := TRIM (v_ins_kenmerkwaarde2);
            v_ins_kenmerkwaarde3 := TRIM (v_ins_kenmerkwaarde3);
            v_ins_kenmerkwaarde4 := TRIM (v_ins_kenmerkwaarde4);
            v_ins_kenmerkwaarde5 := TRIM (v_ins_kenmerkwaarde5);
            v_ins_kenmerkwaarde6 := TRIM (v_ins_kenmerkwaarde6);
            v_ins_kenmerkwaarde7 := TRIM (v_ins_kenmerkwaarde7);
            v_ins_kenmerkwaarde8 := TRIM (v_ins_kenmerkwaarde8);
            v_ins_kenmerkwaarde9 := TRIM (v_ins_kenmerkwaarde9);
            v_ins_kenmerkwaarde10 := TRIM (v_ins_kenmerkwaarde10);
            v_ins_kenmerkwaarde11 := TRIM (v_ins_kenmerkwaarde11);
            v_ins_kenmerkwaarde12 := TRIM (v_ins_kenmerkwaarde12);
            v_ins_kenmerkwaarde13 := TRIM (v_ins_kenmerkwaarde13);
            v_ins_kenmerkwaarde14 := TRIM (v_ins_kenmerkwaarde14);
            v_ins_kenmerkwaarde15 := TRIM (v_ins_kenmerkwaarde15);
            v_ins_kenmerkwaarde16 := TRIM (v_ins_kenmerkwaarde16);
            v_ins_kenmerkwaarde17 := TRIM (v_ins_kenmerkwaarde17);
            v_ins_kenmerkwaarde18 := TRIM (v_ins_kenmerkwaarde18);
            v_ins_kenmerkwaarde19 := TRIM (v_ins_kenmerkwaarde19);
            v_ins_kenmerkwaarde20 := TRIM (v_ins_kenmerkwaarde20);

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

                  -- Als uit kenmerkheader een geldige kenmerksoort-key volgt,
                  -- dan is kenmerkwaarde<n> gevuld met <key>=<waarde>; zoniet,
                  -- dan is kenmerkwaarde<n> gevuld met <waarde>!
                  -- NB. Een NULL-waarde resulteert NIET in het wissen van een
                  --     kenmerkveld (bijwerken kan wel, maar wissen dus niet)!
                  INSERT INTO fac_imp_ins (
                                               ins_discipline_omschrijving,
                                               ins_discipline_kostensoort,
                                               ins_srtgroep_omschrijving,
                                               ins_srtdeel_code,
                                               ins_srtdeel_omschrijving,
                                               ins_deel_omschrijving,
                                               ins_deel_opmerking,
                                               reserveerbaar,
                                               res_deel_eenheid,
                                               res_deel_prijs,
                                               alg_locatie_code,
                                               alg_gebouw_code,
                                               alg_verdieping_volgnr,
                                               alg_ruimte_nr,
                                               res_deel_alg_level,
                                               res_discipline_omschrijving,
                                               res_discipline_kostensoort,
                                               prs_perslid_matchcode,
                                               prs_perslid_matchwaarde,
                                               ins_kenmerkwaarde1,
                                               ins_kenmerkwaarde2,
                                               ins_kenmerkwaarde3,
                                               ins_kenmerkwaarde4,
                                               ins_kenmerkwaarde5,
                                               ins_kenmerkwaarde6,
                                               ins_kenmerkwaarde7,
                                               ins_kenmerkwaarde8,
                                               ins_kenmerkwaarde9,
                                               ins_kenmerkwaarde10,
                                               ins_kenmerkwaarde11,
                                               ins_kenmerkwaarde12,
                                               ins_kenmerkwaarde13,
                                               ins_kenmerkwaarde14,
                                               ins_kenmerkwaarde15,
                                               ins_kenmerkwaarde16,
                                               ins_kenmerkwaarde17,
                                               ins_kenmerkwaarde18,
                                               ins_kenmerkwaarde19,
                                               ins_kenmerkwaarde20
                             )
                    VALUES   (
                                 v_ins_discipline_omschrijving,
                                 v_ins_discipline_kostensoort,
                                 v_ins_srtgroep_omschrijving,
                                 v_ins_srtdeel_code,
                                 v_ins_srtdeel_omschrijving,
                                 v_ins_deel_omschrijving,
                                 v_ins_deel_opmerking,
                                 v_reserveerbaar_n,
                                 v_res_deel_eenheid,
                                 v_res_deel_prijs_n,
                                 v_alg_locatie_code,
                                 v_alg_gebouw_code,
                                 v_alg_verdieping_volgnr_n,
                                 v_alg_ruimte_nr,
                                 v_res_deel_alg_level_n,
                                 v_res_discipline_omschrijving,
                                 v_res_discipline_kostensoort,
                                 v_prs_perslid_matchcode,
                                 v_prs_perslid_matchwaarde,
                                 DECODE (v_ins_srtkenmerk_key1,
                                    NULL, v_ins_kenmerkwaarde1,
                                    '9999|0', 
                                    (SELECT i.ins_srtkenmerk_key || '|0'
                                       FROM ins_v_aanwezigsrtkenmerk i, ins_v_srtdeel_kenmerk ik
                                      WHERE i.ins_srtkenmerk_key = ik.ins_srtkenmerk_key
                                        AND i.ins_srtkenmerk_upper LIKE '%MAAT%'
                                        AND ik.ins_srtdeel_upper = UPPER (v_ins_srtdeel_omschrijving))
                                    || '='
                                    || SUBSTR (v_ins_kenmerkwaarde1, 1, 3900),
                                       TO_CHAR (v_ins_srtkenmerk_key1)
                                    || '='
                                    || SUBSTR (v_ins_kenmerkwaarde1, 1, 3900)
                                 ),
                                 DECODE (
                                    v_ins_srtkenmerk_key2,
                                    NULL, v_ins_kenmerkwaarde2,
                                       TO_CHAR (v_ins_srtkenmerk_key2)
                                    || '='
                                    || SUBSTR (v_ins_kenmerkwaarde2, 1, 3900)
                                 ),
                                 DECODE (
                                    v_ins_srtkenmerk_key3,
                                    NULL, v_ins_kenmerkwaarde3,
                                       TO_CHAR (v_ins_srtkenmerk_key3)
                                    || '='
                                    || SUBSTR (v_ins_kenmerkwaarde3, 1, 3900)
                                 ),
                                 DECODE (
                                    v_ins_srtkenmerk_key4,
                                    NULL, v_ins_kenmerkwaarde4,
                                       TO_CHAR (v_ins_srtkenmerk_key4)
                                    || '='
                                    || SUBSTR (v_ins_kenmerkwaarde4, 1, 3900)
                                 ),
                                 DECODE (
                                    v_ins_srtkenmerk_key5,
                                    NULL, v_ins_kenmerkwaarde5,
                                       TO_CHAR (v_ins_srtkenmerk_key5)
                                    || '='
                                    || SUBSTR (v_ins_kenmerkwaarde5, 1, 3900)
                                 ),
                                 DECODE (
                                    v_ins_srtkenmerk_key6,
                                    NULL, v_ins_kenmerkwaarde6,
                                       TO_CHAR (v_ins_srtkenmerk_key6)
                                    || '='
                                    || SUBSTR (v_ins_kenmerkwaarde6, 1, 3900)
                                 ),
                                 DECODE (
                                    v_ins_srtkenmerk_key7,
                                    NULL, v_ins_kenmerkwaarde7,
                                       TO_CHAR (v_ins_srtkenmerk_key7)
                                    || '='
                                    || SUBSTR (v_ins_kenmerkwaarde7, 1, 3900)
                                 ),
                                 DECODE (
                                    v_ins_srtkenmerk_key8,
                                    NULL, v_ins_kenmerkwaarde8,
                                       TO_CHAR (v_ins_srtkenmerk_key8)
                                    || '='
                                    || SUBSTR (v_ins_kenmerkwaarde8, 1, 3900)
                                 ),
                                 DECODE (
                                    v_ins_srtkenmerk_key9,
                                    NULL, v_ins_kenmerkwaarde9,
                                       TO_CHAR (v_ins_srtkenmerk_key9)
                                    || '='
                                    || SUBSTR (v_ins_kenmerkwaarde9, 1, 3900)
                                 ),
                                 DECODE (
                                    v_ins_srtkenmerk_key10,
                                    NULL, v_ins_kenmerkwaarde10,
                                       TO_CHAR (v_ins_srtkenmerk_key10)
                                    || '='
                                    || SUBSTR (v_ins_kenmerkwaarde10, 1, 3900)
                                 ),
                                 DECODE (
                                    v_ins_srtkenmerk_key11,
                                    NULL, v_ins_kenmerkwaarde11,
                                       TO_CHAR (v_ins_srtkenmerk_key11)
                                    || '='
                                    || SUBSTR (v_ins_kenmerkwaarde11, 1, 3900)
                                 ),
                                 DECODE (
                                    v_ins_srtkenmerk_key12,
                                    NULL, v_ins_kenmerkwaarde12,
                                       TO_CHAR (v_ins_srtkenmerk_key12)
                                    || '='
                                    || SUBSTR (v_ins_kenmerkwaarde12, 1, 3900)
                                 ),
                                 DECODE (
                                    v_ins_srtkenmerk_key13,
                                    NULL, v_ins_kenmerkwaarde13,
                                       TO_CHAR (v_ins_srtkenmerk_key13)
                                    || '='
                                    || SUBSTR (v_ins_kenmerkwaarde13, 1, 3900)
                                 ),
                                 DECODE (
                                    v_ins_srtkenmerk_key14,
                                    NULL, v_ins_kenmerkwaarde14,
                                       TO_CHAR (v_ins_srtkenmerk_key14)
                                    || '='
                                    || SUBSTR (v_ins_kenmerkwaarde14, 1, 3900)
                                 ),
                                 DECODE (
                                    v_ins_srtkenmerk_key15,
                                    NULL, v_ins_kenmerkwaarde15,
                                       TO_CHAR (v_ins_srtkenmerk_key15)
                                    || '='
                                    || SUBSTR (v_ins_kenmerkwaarde15, 1, 3900)
                                 ),
                                 DECODE (
                                    v_ins_srtkenmerk_key16,
                                    NULL, v_ins_kenmerkwaarde16,
                                       TO_CHAR (v_ins_srtkenmerk_key16)
                                    || '='
                                    || SUBSTR (v_ins_kenmerkwaarde16, 1, 3900)
                                 ),
                                 DECODE (
                                    v_ins_srtkenmerk_key17,
                                    NULL, v_ins_kenmerkwaarde17,
                                       TO_CHAR (v_ins_srtkenmerk_key17)
                                    || '='
                                    || SUBSTR (v_ins_kenmerkwaarde17, 1, 3900)
                                 ),
                                 DECODE (
                                    v_ins_srtkenmerk_key18,
                                    NULL, v_ins_kenmerkwaarde18,
                                       TO_CHAR (v_ins_srtkenmerk_key18)
                                    || '='
                                    || SUBSTR (v_ins_kenmerkwaarde18, 1, 3900)
                                 ),
                                 DECODE (
                                    v_ins_srtkenmerk_key19,
                                    NULL, v_ins_kenmerkwaarde19,
                                       TO_CHAR (v_ins_srtkenmerk_key19)
                                    || '='
                                    || SUBSTR (v_ins_kenmerkwaarde19, 1, 3900)
                                 ),
                                 DECODE (
                                    v_ins_srtkenmerk_key20,
                                    NULL, v_ins_kenmerkwaarde20,
                                       TO_CHAR (v_ins_srtkenmerk_key20)
                                    || '='
                                    || SUBSTR (v_ins_kenmerkwaarde20, 1, 3900)
                                 )
                             );

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

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


CREATE OR REPLACE PROCEDURE dvon_update_extrains (p_import_key IN NUMBER)
AS
    v_errormsg       VARCHAR2 (1000) := '-';
    oracle_err_num   NUMBER;
    oracle_err_mes   VARCHAR2 (200);
    v_aanduiding     VARCHAR2 (200);

    -- SUBPROC
    -- Conversie naar bruikbare objectomschrijvingen
    PROCEDURE dvon_import_ins (p_import_key IN NUMBER)
    AS
    
    CURSOR c1
    IS
    SELECT DISTINCT
             objectomschrijving,
             disciplineomschrijving,
             disciplinekostensoort,
             groepsoortomschrijving,
             objectsoortcode,
             to_char (regexp_replace(substr (nummer, -7), '[^0-9]', '') +
             ROW_NUMBER() OVER (PARTITION BY objectsoortcode ORDER BY objectsoortcode)) calc
             FROM dvon_v_expbestelling_data;
    
    BEGIN
    FOR rec IN c1
      LOOP
         BEGIN
         v_errormsg :='Fout bij converteren objectomschrijving object [' || rec.objectsoortcode || ']';
         
           UPDATE fac_imp_ins
           SET ins_deel_omschrijving = to_char (rec.objectsoortcode) || to_char (LPAD(rec.calc, 3, '0'))
           WHERE ins_srtdeel_code = rec.objectsoortcode
             AND ins_deel_omschrijving = to_char (rec.objectomschrijving);
      END;
      END LOOP;
      COMMIT;
      END;
    
    -- SUBPROC
    PROCEDURE add_kostensoort (p_import_key IN NUMBER)
    AS
        CURSOR c1
        IS
              SELECT prs_kostensoort_upper,
                     MAX (prs_kostensoort_omschrijving) prs_kostensoort_omschrijving
                FROM (  SELECT UPPER (ins_discipline_kostensoort) prs_kostensoort_upper,
                               MAX (ins_discipline_kostensoort) prs_kostensoort_omschrijving
                          FROM fac_imp_ins
                         WHERE ins_discipline_kostensoort IS NOT NULL
                      GROUP BY UPPER (ins_discipline_kostensoort)
                      UNION ALL
                        SELECT UPPER (res_discipline_kostensoort) prs_kostensoort_upper,
                               MAX (res_discipline_kostensoort) prs_kostensoort_omschrijving
                          FROM fac_imp_ins
                         WHERE reserveerbaar = 1 AND res_discipline_kostensoort IS NOT NULL
                      GROUP BY UPPER (res_discipline_kostensoort))
            GROUP BY prs_kostensoort_upper;

        v_kostensoort_key   NUMBER (10);
        ccount              NUMBER (10);
        v_count_tot         NUMBER (10);
        v_count_update      NUMBER (10);
    BEGIN
        v_count_tot := 0;
        v_count_update := 0;

        FOR rec IN c1
        LOOP
            BEGIN
                v_count_tot := v_count_tot + 1;
                v_errormsg :=
                    'Fout bij toevoegen kostensoort [' || rec.prs_kostensoort_omschrijving || ']';

                SELECT COUNT ( * )
                  INTO ccount
                  FROM prs_kostensoort
                 WHERE TRIM (prs_kostensoort_upper) = rec.prs_kostensoort_upper;

                IF ccount = 0
                THEN
                    INSERT INTO prs_kostensoort (prs_kostensoort_oms)
                        VALUES (rec.prs_kostensoort_omschrijving);

                    v_count_update := v_count_update + 1;
                END IF;

                COMMIT;
            EXCEPTION
                WHEN OTHERS
                THEN
                    oracle_err_num := SQLCODE;
                    oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
                    v_errormsg :=
                           v_errormsg
                        || ' (error '
                        || oracle_err_num
                        || '/'
                        || oracle_err_mes
                        || ')';
                    fac.imp_writelog (p_import_key,
                                      'W',
                                      v_errormsg,
                                      '');
                    COMMIT;
            END;
        END LOOP;

        fac.imp_writelog (p_import_key,
                          'S',
                          'Kostensoorten/aantal ingelezen: ' || TO_CHAR (v_count_tot),
                          '');
        fac.imp_writelog (p_import_key,
                          'S',
                          'Kostensoorten/aantal toegevoegd: ' || TO_CHAR (v_count_update),
                          '');
        COMMIT;
    END;

    -- SUBPROC
    PROCEDURE add_insdiscipline (p_import_key IN NUMBER)
    AS
        CURSOR c1
        IS
              SELECT UPPER (ins_discipline_omschrijving) ins_discipline_upper,
                     UPPER (ins_discipline_kostensoort) ins_kostensoort_upper,
                     MAX (ins_discipline_omschrijving) ins_discipline_omschrijving
                FROM fac_imp_ins
            GROUP BY UPPER (ins_discipline_omschrijving), UPPER (ins_discipline_kostensoort);

        v_discipline_key    NUMBER (10);
        v_kostensoort_key   NUMBER (10);
        ccount              NUMBER (10);
        v_count_tot         NUMBER (10);
        v_count_update      NUMBER (10);
    BEGIN
        v_count_tot := 0;
        v_count_update := 0;

        FOR rec IN c1
        LOOP
            BEGIN
                v_count_tot := v_count_tot + 1;
                v_errormsg :=
                    'Fout bij toevoegen INS-discipline [' || rec.ins_discipline_omschrijving || ']';

                SELECT COUNT ( * )
                  INTO ccount
                  FROM ins_tab_discipline
                 WHERE     ins_discipline_verwijder IS NULL
                       AND ins_discipline_module = 'INS'
                       AND UPPER (TRIM (ins_discipline_omschrijving)) = rec.ins_discipline_upper;

                IF ccount = 0
                THEN
                    IF rec.ins_kostensoort_upper IS NULL
                    THEN
                        v_kostensoort_key := NULL;
                    ELSE
                        SELECT prs_kostensoort_key
                          INTO v_kostensoort_key
                          FROM prs_kostensoort
                         WHERE TRIM (prs_kostensoort_upper) = rec.ins_kostensoort_upper;
                    END IF;

                    INSERT INTO ins_tab_discipline (ins_discipline_module,
                                                    ins_discipline_omschrijving,
                                                    ins_discipline_min_level,
                                                    ins_discipline_kpnverplicht,
                                                    prs_kostensoort_key)
                        VALUES ('INS',
                                SUBSTR (rec.ins_discipline_omschrijving, 1, 60),
                                1,
                                0,
                                v_kostensoort_key)
                      RETURNING ins_discipline_key
                           INTO v_discipline_key;

                    INSERT INTO ins_disc_params (ins_discipline_key, ins_disc_params_type)
                        VALUES (v_discipline_key, 0);

                    v_count_update := v_count_update + 1;
                END IF;

                COMMIT;
            EXCEPTION
                WHEN OTHERS
                THEN
                    oracle_err_num := SQLCODE;
                    oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
                    v_errormsg :=
                           v_errormsg
                        || ' (error '
                        || oracle_err_num
                        || '/'
                        || oracle_err_mes
                        || ')';
                    fac.imp_writelog (p_import_key,
                                      'W',
                                      v_errormsg,
                                      '');
                    COMMIT;
            END;
        END LOOP;

        fac.imp_writelog (p_import_key,
                          'S',
                          'INS-Disciplines/aantal ingelezen: ' || TO_CHAR (v_count_tot),
                          '');
        fac.imp_writelog (p_import_key,
                          'S',
                          'INS-Disciplines/aantal toegevoegd: ' || TO_CHAR (v_count_update),
                          '');
        COMMIT;
    END;

    -- SUBPROC
    PROCEDURE add_resdiscipline (p_import_key IN NUMBER)
    AS
        CURSOR c1
        IS
              SELECT UPPER (res_discipline_omschrijving) res_discipline_upper,
                     UPPER (res_discipline_kostensoort) res_kostensoort_upper,
                     MAX (res_discipline_omschrijving) res_discipline_omschrijving
                FROM fac_imp_ins
               WHERE reserveerbaar = 1
            GROUP BY UPPER (res_discipline_omschrijving), UPPER (res_discipline_kostensoort);

        v_discipline_key    NUMBER (10);
        v_kostensoort_key   NUMBER (10);
        ccount              NUMBER (10);
        v_count_tot         NUMBER (10);
        v_count_update      NUMBER (10);
    BEGIN
        v_count_tot := 0;
        v_count_update := 0;

        FOR rec IN c1
        LOOP
            BEGIN
                v_count_tot := v_count_tot + 1;
                v_errormsg :=
                    'Fout bij toevoegen RES-discipline [' || rec.res_discipline_omschrijving || ']';

                SELECT COUNT ( * )
                  INTO ccount
                  FROM ins_tab_discipline
                 WHERE     ins_discipline_verwijder IS NULL
                       AND ins_discipline_module = 'RES'
                       AND UPPER (TRIM (ins_discipline_omschrijving)) = rec.res_discipline_upper;

                IF ccount = 0
                THEN
                    IF rec.res_kostensoort_upper IS NULL
                    THEN
                        v_kostensoort_key := NULL;
                    ELSE
                        SELECT prs_kostensoort_key
                          INTO v_kostensoort_key
                          FROM prs_kostensoort
                         WHERE TRIM (prs_kostensoort_upper) = rec.res_kostensoort_upper;
                    END IF;

                    INSERT INTO ins_tab_discipline (ins_discipline_module,
                                                    ins_discipline_omschrijving,
                                                    ins_discipline_min_level,
                                                    ins_discipline_kpnverplicht,
                                                    prs_kostensoort_key)
                        VALUES ('RES',
                                SUBSTR (rec.res_discipline_omschrijving, 1, 60),
                                1,
                                0,
                                v_kostensoort_key)
                    RETURNING ins_discipline_key
                         INTO v_discipline_key;

                    INSERT INTO res_disc_params (res_ins_discipline_key)
                        VALUES (v_discipline_key);

                    v_count_update := v_count_update + 1;
                END IF;

                COMMIT;
            EXCEPTION
                WHEN OTHERS
                THEN
                    oracle_err_num := SQLCODE;
                    oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
                    v_errormsg :=
                           v_errormsg
                        || ' (error '
                        || oracle_err_num
                        || '/'
                        || oracle_err_mes
                        || ')';
                    fac.imp_writelog (p_import_key,
                                      'W',
                                      v_errormsg,
                                      '');
                    COMMIT;
            END;
        END LOOP;

        fac.imp_writelog (p_import_key,
                          'S',
                          'RES-Disciplines/aantal ingelezen: ' || TO_CHAR (v_count_tot),
                          '');
        fac.imp_writelog (p_import_key,
                          'S',
                          'RES-Disciplines/aantal toegevoegd: ' || TO_CHAR (v_count_update),
                          '');
        COMMIT;
    END;

    -- SUBPROC
    PROCEDURE add_srtgroep (p_import_key IN NUMBER)
    AS
        CURSOR c1
        IS
              SELECT UPPER (ins_discipline_omschrijving) ins_discipline_upper,
                     UPPER (ins_srtgroep_omschrijving) ins_srtgroep_upper,
                     MAX (ins_discipline_omschrijving) ins_discipline_omschrijving,
                     MAX (ins_srtgroep_omschrijving) ins_srtgroep_omschrijving
                FROM fac_imp_ins
            GROUP BY UPPER (ins_discipline_omschrijving), UPPER (ins_srtgroep_omschrijving);

        v_discipline_key   NUMBER (10);
        ccount             NUMBER (10);
        v_count_tot        NUMBER (10);
        v_count_update     NUMBER (10);
    BEGIN
        v_count_tot := 0;
        v_count_update := 0;

        FOR rec IN c1
        LOOP
            BEGIN
                v_count_tot := v_count_tot + 1;
                v_errormsg := 'Fout bij bepalen discipline';

                SELECT ins_discipline_key
                  INTO v_discipline_key
                  FROM ins_tab_discipline
                 WHERE     ins_discipline_verwijder IS NULL
                       AND ins_discipline_module = 'INS'
                       AND UPPER (TRIM (ins_discipline_omschrijving)) = rec.ins_discipline_upper;

                v_errormsg :=
                    'Fout bij toevoegen groepsoort [' || rec.ins_srtgroep_omschrijving || '] ';

                SELECT COUNT ( * )
                  INTO ccount
                  FROM ins_srtgroep
                 WHERE     ins_srtgroep_verwijder IS NULL
                       AND ins_srtgroep_module = 'INS'
                       AND ins_discipline_key = v_discipline_key
                       AND TRIM (ins_srtgroep_upper) = rec.ins_srtgroep_upper;

                IF ccount = 0
                THEN
                    INSERT INTO ins_srtgroep (ins_discipline_key,
                                              ins_srtgroep_module,
                                              ins_srtgroep_omschrijving)
                        VALUES (v_discipline_key,
                                'INS',
                                SUBSTR (TRIM (rec.ins_srtgroep_omschrijving), 1, 60));

                    v_count_update := v_count_update + 1;
                END IF;

                COMMIT;
            EXCEPTION
                WHEN OTHERS
                THEN
                    oracle_err_num := SQLCODE;
                    oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
                    v_errormsg :=
                           v_errormsg
                        || ' (error '
                        || oracle_err_num
                        || '/'
                        || oracle_err_mes
                        || ')';
                    fac.imp_writelog (p_import_key,
                                      'W',
                                      v_errormsg,
                                      '');
                    COMMIT;
            END;
        END LOOP;

        fac.imp_writelog (p_import_key,
                          'S',
                          'Groepsoorten/aantal ingelezen: ' || TO_CHAR (v_count_tot),
                          '');
        fac.imp_writelog (p_import_key,
                          'S',
                          'Groepsoorten/aantal toegevoegd: ' || TO_CHAR (v_count_update),
                          '');
        COMMIT;
    END;

    -- SUBPROC
    PROCEDURE add_srtdeel (p_import_key IN NUMBER)
    AS
        CURSOR c1
        IS
              SELECT UPPER (ins_discipline_omschrijving) ins_discipline_upper,
                     UPPER (ins_srtgroep_omschrijving) ins_srtgroep_upper,
                     UPPER (ins_srtdeel_code) ins_srtdeel_code_upper,
                     UPPER (ins_srtdeel_omschrijving) ins_srtdeel_upper,
                     MAX (ins_discipline_omschrijving) ins_discipline_omschrijving,
                     MAX (ins_srtgroep_omschrijving) ins_srtgroep_omschrijving,
                     MAX (ins_srtdeel_code) ins_srtdeel_code,
                     MAX (ins_srtdeel_omschrijving) ins_srtdeel_omschrijving
                FROM fac_imp_ins
            GROUP BY UPPER (ins_discipline_omschrijving),
                     UPPER (ins_srtgroep_omschrijving),
                     UPPER (ins_srtdeel_code),
                     UPPER (ins_srtdeel_omschrijving);

        v_discipline_key   NUMBER (10);
        v_srtgroep_key     NUMBER (10);
        ccount             NUMBER (10);
        v_count_tot        NUMBER (10);
        v_count_update     NUMBER (10);
    BEGIN
        v_count_tot := 0;
        v_count_update := 0;

        FOR rec IN c1
        LOOP
            BEGIN
                v_count_tot := v_count_tot + 1;
                v_errormsg := 'Fout bij bepalen discipline';

                SELECT ins_discipline_key
                  INTO v_discipline_key
                  FROM ins_tab_discipline
                 WHERE     ins_discipline_verwijder IS NULL
                       AND ins_discipline_module = 'INS'
                       AND UPPER (TRIM (ins_discipline_omschrijving)) = rec.ins_discipline_upper;

                v_errormsg := 'Fout bij bepalen groepsoort';

                SELECT ins_srtgroep_key
                  INTO v_srtgroep_key
                  FROM ins_srtgroep
                 WHERE     ins_srtgroep_verwijder IS NULL
                       AND ins_srtgroep_module = 'INS'
                       AND ins_discipline_key = v_discipline_key
                       AND TRIM (ins_srtgroep_upper) = rec.ins_srtgroep_upper;

                v_errormsg :=
                    'Fout bij toevoegen objectsoort [' || rec.ins_srtdeel_omschrijving || ']';

                SELECT COUNT ( * )
                  INTO ccount
                  FROM ins_srtdeel
                 WHERE     ins_srtdeel_verwijder IS NULL
                       AND ins_srtdeel_module = 'INS'
                       AND ins_srtgroep_key = v_srtgroep_key
                       AND TRIM (ins_srtdeel_upper) = rec.ins_srtdeel_upper;

                IF ccount = 0
                THEN
                    -- binding 17 betekent ruimtegebonden of persoonsgebonden
                    INSERT INTO ins_srtdeel (ins_srtgroep_key,
                                             ins_srtdeel_module,
                                             ins_srtdeel_code,
                                             ins_srtdeel_omschrijving,
                                             ins_srtdeel_binding)
                        VALUES (v_srtgroep_key,
                                'INS',
                                rec.ins_srtdeel_code,
                                rec.ins_srtdeel_omschrijving,
                                17);

                    v_count_update := v_count_update + 1;
                END IF;

                COMMIT;
            EXCEPTION
                WHEN OTHERS
                THEN
                    oracle_err_num := SQLCODE;
                    oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
                    v_errormsg :=
                           v_errormsg
                        || ' (error '
                        || oracle_err_num
                        || '/'
                        || oracle_err_mes
                        || ')';
                    fac.imp_writelog (p_import_key,
                                      'W',
                                      v_errormsg,
                                      '');
                    COMMIT;
            END;
        END LOOP;

        fac.imp_writelog (p_import_key,
                          'S',
                          'Objectsoorten/aantal ingelezen: ' || TO_CHAR (v_count_tot),
                          '');
        fac.imp_writelog (p_import_key,
                          'S',
                          'Objectsoorten/aantal toegevoegd: ' || TO_CHAR (v_count_update),
                          '');
        COMMIT;
    END;

    -- SUBPROC
    -- p_srtkenmerkgroepwaarde = '234|1=37-ZB-DR'
    -- Ofwel: srtkenmerk_key|groep=waarde
    PROCEDURE upsert_inskenmerk (p_deel_key              IN NUMBER,
                                 p_srtkenmerkgroepwaarde IN VARCHAR2)
    AS
        v_kenmerk_key       NUMBER;
        v_srtkenmerk_key    NUMBER;
        v_groep             NUMBER;
        v_waarde            VARCHAR(255);
        v_srtkenmerk_type   VARCHAR2 (1);
        ccount              NUMBER;
        v_objectnaam        VARCHAR2 (30);
        v_kolomnaam         VARCHAR2 (30);
        v_kolomtxt          VARCHAR2 (30);
        sql_stmt            VARCHAR2 (1000);
        v_kenmerkdeel_key   NUMBER;
        l_cursor_1          INTEGER;
        l_rowsprocessed     NUMBER DEFAULT 0;
    BEGIN
        IF p_srtkenmerkgroepwaarde IS NOT NULL
        THEN
            v_errormsg := 'Fout bij bepalen kenmerk van soort [' || p_srtkenmerkgroepwaarde || ']';

            v_srtkenmerk_key := fac.safe_to_number (
                       SUBSTR (p_srtkenmerkgroepwaarde, 1, INSTR (p_srtkenmerkgroepwaarde, '|') - 1));
            v_groep := fac.safe_to_number (
                       SUBSTR (p_srtkenmerkgroepwaarde,
                                INSTR (p_srtkenmerkgroepwaarde, '|') + 1,
                                INSTR (p_srtkenmerkgroepwaarde, '=') - 1 - INSTR (p_srtkenmerkgroepwaarde, '|')));
            v_waarde := SUBSTR (p_srtkenmerkgroepwaarde, INSTR (p_srtkenmerkgroepwaarde, '=') + 1);

            SELECT k.ins_kenmerk_key, sk.ins_srtkenmerk_kenmerktype
              INTO v_kenmerk_key, v_srtkenmerk_type
              FROM ins_deel d,
                   ins_srtdeel sd,
                   ins_srtgroep sg,
                   ins_v_aanwezigkenmerk k,
                   ins_v_aanwezigsrtkenmerk sk
             WHERE     d.ins_deel_key = p_deel_key
                   AND d.ins_srtdeel_key = sd.ins_srtdeel_key
                   AND sd.ins_srtgroep_key = sg.ins_srtgroep_key
                   AND k.ins_srtkenmerk_key = v_srtkenmerk_key
                   AND k.ins_kenmerk_groep = v_groep
                   AND ( (k.ins_srtinstallatie_key = sd.ins_srtdeel_key
                          AND k.ins_kenmerk_niveau = 'S')
                        OR (k.ins_srtinstallatie_key = sg.ins_srtgroep_key
                            AND k.ins_kenmerk_niveau = 'G')
                        OR (k.ins_srtinstallatie_key = sg.ins_discipline_key
                            AND k.ins_kenmerk_niveau = 'D'))
                   AND k.ins_srtkenmerk_key = sk.ins_srtkenmerk_key;

            IF v_waarde IS NOT NULL
            THEN
                IF v_srtkenmerk_type IN ('R', 'S')
                THEN
                    v_errormsg := 'Fout bij bepalen eigen tabel';

                    SELECT COUNT ( * )
                      INTO ccount
                      FROM ins_srtkenmerk sk, fac_kenmerkdomein d
                     WHERE     sk.ins_srtkenmerk_key = v_srtkenmerk_key
                           AND sk.fac_kenmerkdomein_key = d.fac_kenmerkdomein_key
                           AND d.fac_usrtab_key IS NOT NULL;

                    v_errormsg := 'Fout bij bepalen nieuwe waarde [' || v_waarde || ']';

                    IF ccount = 1
                    THEN                                                                  -- Eigen tabel
                        SELECT TO_CHAR (ud.fac_usrdata_key)
                          INTO v_waarde
                          FROM ins_srtkenmerk sk, fac_kenmerkdomein d, fac_v_aanwezigusrdata ud
                         WHERE     sk.ins_srtkenmerk_key = v_srtkenmerk_key
                               AND sk.fac_kenmerkdomein_key = d.fac_kenmerkdomein_key
                               AND d.fac_usrtab_key = ud.fac_usrtab_key
                               AND UPPER (TRIM (ud.fac_usrdata_omschr)) = UPPER (v_waarde);
                    ELSE                                                         -- FACILITOR view/tabel
                        SELECT d.fac_kenmerkdomein_objectnaam,
                               d.fac_kenmerkdomein_kolomnaam,
                               d.fac_kenmerkdomein_kolomtxt
                          INTO v_objectnaam, v_kolomnaam, v_kolomtxt
                          FROM ins_srtkenmerk sk, fac_kenmerkdomein d
                         WHERE     sk.ins_srtkenmerk_key = v_srtkenmerk_key
                               AND sk.fac_kenmerkdomein_key = d.fac_kenmerkdomein_key
                               AND d.fac_usrtab_key IS NULL;

                        sql_stmt :=
                               'SELECT MAX ('
                            || v_kolomnaam
                            || ') FROM '
                            || v_objectnaam
                            || ' WHERE UPPER (TRIM ('
                            || v_kolomtxt
                            || ')) = UPPER (:pwaarde)';
                       l_cursor_1 := DBMS_SQL.open_cursor;
                       DBMS_SQL.parse (l_cursor_1, sql_stmt, DBMS_SQL.native);
                       DBMS_SQL.BIND_VARIABLE(l_cursor_1,':pwaarde', v_waarde);
                       DBMS_SQL.define_column(l_cursor_1, 1, v_waarde, 255);
                       l_rowsprocessed := DBMS_SQL.execute_and_fetch (l_cursor_1);
                       DBMS_SQL.column_value (l_cursor_1, 1, v_waarde);
                       DBMS_SQL.close_cursor(l_cursor_1);
                    END IF;
                ELSE                                 -- C(Karakter)/D(Datum)/N(Numeriek)/X(Bestandsnaam)
                    NULL; -- v_waarde := p_waarde;
                END IF;

                v_errormsg := 'Fout bij bepalen huidige waarde';

                SELECT COUNT ( * ), MAX (ins_kenmerkdeel_key)
                  INTO ccount, v_kenmerkdeel_key
                  FROM ins_v_aanwezigkenmerkdeel
                 WHERE ins_deel_key = p_deel_key AND ins_kenmerk_key = v_kenmerk_key;

                IF v_srtkenmerk_type = 'N'  -- Alleen voor numerieke waarden de decimale komma vervangen door punt.
                THEN
                    v_waarde := REPLACE (v_waarde, ',', '.');
                END IF;

                IF ccount = 0
                THEN
                    v_errormsg := 'Fout bij toevoegen waarde [' || v_waarde || ']';

                    INSERT INTO ins_kenmerkdeel (ins_deel_key, ins_kenmerk_key, ins_kenmerkdeel_waarde)
                        VALUES (p_deel_key, v_kenmerk_key, v_waarde);
                ELSE
                    v_errormsg := 'Fout bij bijwerken waarde [' || v_waarde || ']';

                    UPDATE ins_kenmerkdeel
                       SET ins_kenmerkdeel_waarde = v_waarde
                     WHERE ins_kenmerkdeel_key = v_kenmerkdeel_key;
                END IF;
            ELSE
                -- Verwijder kenmerken die als bestaan maar met de nieuwe import leeg zijn.
                DELETE ins_kenmerkdeel
                 WHERE ins_kenmerk_key = v_kenmerk_key
                   AND ins_deel_key = p_deel_key;
            END IF;
        END IF;
    EXCEPTION
        WHEN OTHERS
        THEN
            oracle_err_num := SQLCODE;
            oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
            v_errormsg :=
                v_errormsg || ' (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
            fac.imp_writelog (p_import_key,
                              'W',
                              v_aanduiding || v_errormsg,
                              'upsert_inskenmerk');
    END;

    -- SUBPROC
    PROCEDURE add_deel (p_import_key IN NUMBER)
    AS
        CURSOR c1
        IS
            SELECT ins_discipline_omschrijving,
                   ins_srtgroep_omschrijving,
                   ins_srtdeel_code,
                   ins_srtdeel_omschrijving,
                   ins_deel_omschrijving,
                   ins_deel_opmerking,
                   alg_locatie_code,
                   alg_gebouw_code,
                   alg_verdieping_volgnr,
                   alg_ruimte_nr,
                   reserveerbaar,
                   res_discipline_omschrijving,
                   res_deel_eenheid,
                   res_deel_prijs,
                   res_deel_alg_level,
                   prs_perslid_matchcode,
                   prs_perslid_matchwaarde,
                   ins_kenmerkwaarde1,
                   ins_kenmerkwaarde2,
                   ins_kenmerkwaarde3,
                   ins_kenmerkwaarde4,
                   ins_kenmerkwaarde5,
                   ins_kenmerkwaarde6,
                   ins_kenmerkwaarde7,
                   ins_kenmerkwaarde8,
                   ins_kenmerkwaarde9,
                   ins_kenmerkwaarde10,
                   ins_kenmerkwaarde11,
                   ins_kenmerkwaarde12,
                   ins_kenmerkwaarde13,
                   ins_kenmerkwaarde14,
                   ins_kenmerkwaarde15,
                   ins_kenmerkwaarde16,
                   ins_kenmerkwaarde17,
                   ins_kenmerkwaarde18,
                   ins_kenmerkwaarde19,
                   ins_kenmerkwaarde20
              FROM fac_imp_ins;

        v_discipline_key    NUMBER (10);
        v_rdiscipline_key   NUMBER (10);
        v_srtgroep_key      NUMBER (10);
        v_srtdeel_key       NUMBER (10);
        v_locatie_key       NUMBER (10);
        v_gebouw_key        NUMBER (10);
        v_verdieping_key    NUMBER (10);
        v_ruimte_key        NUMBER (10);
        v_matchkolom        VARCHAR2 (255);
        sql_stmt            VARCHAR2 (1000);
        v_ruimte_type       VARCHAR2 (10);
        v_deel_key          NUMBER (10);
        ccount              NUMBER (10);
        pcount              NUMBER (10);
        v_count_tot         NUMBER (10);
        v_count_insnew      NUMBER (10);
        v_count_insupd      NUMBER (10);
        v_count_resnew      NUMBER (10);
        v_srtnoti_code      VARCHAR2 (6);
        l_cursor_1          INTEGER;
        l_rowsprocessed     NUMBER DEFAULT 0;
    BEGIN
        v_count_tot := 0;
        v_count_insnew := 0;
        v_count_insupd := 0;
        v_count_resnew := 0;
        v_aanduiding := '';

        FOR rec IN c1
        LOOP
            BEGIN
                v_count_tot := v_count_tot + 1;
                v_aanduiding :=
                       '['
                    || rec.ins_discipline_omschrijving
                    || '|'
                    || rec.ins_srtgroep_omschrijving
                    || '|'
                    || rec.ins_srtdeel_code
                    || '|'
                    || rec.ins_srtdeel_omschrijving
                    || '|'
                    || rec.ins_deel_omschrijving
                    || '] ';
                v_errormsg := 'Fout bij bepalen discipline';

                SELECT ins_discipline_key
                  INTO v_discipline_key
                  FROM ins_tab_discipline
                 WHERE ins_discipline_verwijder IS NULL AND ins_discipline_module = 'INS'
                       AND UPPER (TRIM (ins_discipline_omschrijving)) =
                              UPPER (rec.ins_discipline_omschrijving);

                v_errormsg := 'Fout bij bepalen groepsoort';

                SELECT ins_srtgroep_key
                  INTO v_srtgroep_key
                  FROM ins_srtgroep
                 WHERE     ins_srtgroep_verwijder IS NULL
                       AND ins_srtgroep_module = 'INS'
                       AND ins_discipline_key = v_discipline_key
                       AND TRIM (ins_srtgroep_upper) = UPPER (rec.ins_srtgroep_omschrijving);

                v_errormsg := 'Fout bij bepalen objectsoort';

                SELECT ins_srtdeel_key
                  INTO v_srtdeel_key
                  FROM ins_srtdeel
                 WHERE     ins_srtdeel_verwijder IS NULL
                       AND ins_srtdeel_module = 'INS'
                       AND ins_srtgroep_key = v_srtgroep_key
                       AND TRIM (UPPER(ins_srtdeel_code)) = UPPER (rec.ins_srtdeel_code)
                       AND TRIM (ins_srtdeel_upper) = UPPER (rec.ins_srtdeel_omschrijving);

                v_locatie_key := NULL;

                IF rec.alg_locatie_code IS NOT NULL
                THEN                                                        -- ruimtegebonden object
                    v_errormsg := 'Fout bij bepalen locatie [' || rec.alg_locatie_code || ']';

                    SELECT alg_locatie_key
                      INTO v_locatie_key
                      FROM alg_v_aanweziglocatie
                     WHERE UPPER (TRIM (alg_locatie_code)) = UPPER (rec.alg_locatie_code);

                    v_errormsg := 'Fout bij bepalen gebouw [' || rec.alg_gebouw_code || ']';

                    SELECT alg_gebouw_key
                      INTO v_gebouw_key
                      FROM alg_v_aanweziggebouw
                     WHERE alg_locatie_key = v_locatie_key
                           AND UPPER (TRIM (alg_gebouw_code)) = UPPER (rec.alg_gebouw_code);

                    v_errormsg :=
                        'Fout bij bepalen verdieping [' || rec.alg_verdieping_volgnr || ']';

                    SELECT alg_verdieping_key
                      INTO v_verdieping_key
                      FROM alg_v_aanwezigverdieping
                     WHERE alg_gebouw_key = v_gebouw_key
                           AND alg_verdieping_volgnr = rec.alg_verdieping_volgnr;

                    v_errormsg := 'Fout bij bepalen ruimte [' || rec.alg_ruimte_nr || ']';

                    SELECT alg_ruimte_key
                      INTO v_ruimte_key
                      FROM alg_v_aanwezigruimte
                     WHERE alg_verdieping_key = v_verdieping_key
                           AND TRIM (alg_ruimte_upper_nr) = UPPER (rec.alg_ruimte_nr);

                    v_ruimte_type := 'R';

                    -- ruimtegebonden objecten hebben een unieke ID binnen locatie
                    SELECT COUNT ( * )
                      INTO ccount
                      FROM ins_v_aanwezigdeel
                     WHERE     ins_deel_module = 'INS'
                           AND ins_srtdeel_key = v_srtdeel_key
                           AND ins_alg_ruimte_type = v_ruimte_type                              -- R
                           AND ins_alg_locatie_key = v_locatie_key
                           AND TRIM (ins_deel_upper) = UPPER (rec.ins_deel_omschrijving);
                ELSE                                                      -- persoonsgebonden object
                    v_matchkolom := '';

                    CASE rec.prs_perslid_matchcode
                        WHEN '1'
                        THEN
                            v_matchkolom := 'PRS_PERSLID_EMAIL';
                        WHEN '2'
                        THEN
                            v_matchkolom := 'PRS_PERSLID_OSLOGIN';
                        WHEN '3'
                        THEN
                            v_matchkolom := 'PRS_PERSLID_KEY';
                        WHEN '4'
                        THEN
                            v_matchkolom := 'PRS_PERSLID_NR';
                        WHEN '5'
                        THEN
                            v_matchkolom := 'PRS_PERSLID_VOORNAAM || '' '' || PRS_PERSLID_NAAM';
                        ELSE
                            -- voor developers only: indien geen code wordt gebruikt,
                            -- kan als persoonmatchcode een kolom uit de perslid-tabel
                            -- worden ingevoerd, bijvoorbeeld: prs_perslid_oslogin2
                            v_matchkolom := rec.prs_perslid_matchcode;
                    END CASE;

                    v_errormsg := 'Fout bij bepalen persoon [' || rec.prs_perslid_matchwaarde || ']';
                    sql_stmt :=
                           'SELECT MIN (prs_perslid_key), COUNT (prs_perslid_key) '
                        || '  FROM prs_v_aanwezigperslid '
                        || ' WHERE UPPER ('
                        || v_matchkolom
                        || ') = UPPER (:pwaarde) '
                        || 'GROUP BY prs_perslid_key';
                    --dbms_output.put_line(rec.prs_perslid_matchwaarde);
                    l_cursor_1 := DBMS_SQL.open_cursor;
                    DBMS_SQL.parse (l_cursor_1, sql_stmt, DBMS_SQL.native);
                    DBMS_SQL.BIND_VARIABLE(l_cursor_1,':pwaarde', rec.prs_perslid_matchwaarde);
                    DBMS_SQL.define_column(l_cursor_1, 1, v_ruimte_key);
                    DBMS_SQL.define_column(l_cursor_1, 2, pcount);
                    l_rowsprocessed := DBMS_SQL.execute_and_fetch (l_cursor_1);
                    -- Bij no rows gaat-ie naar de exception. Moet daar dan nog een cursor dicht??
                    DBMS_SQL.column_value (l_cursor_1, 1, v_ruimte_key);
                    DBMS_SQL.column_value (l_cursor_1, 2, pcount);
                    DBMS_SQL.close_cursor(l_cursor_1);
                    --dbms_output.put_line(pcount);

                    IF pcount != 1
                    THEN
                        fac.imp_writelog (p_import_key,
                                          'W',
                                          v_aanduiding || v_errormsg,
                                          'Kan persoon niet 1-duidig bepalen');
                    END IF;

                    v_ruimte_type := 'P';

                    -- persoonsgebonden objecten hebben een unieke ID
                    SELECT COUNT ( * )
                      INTO ccount
                      FROM ins_v_aanwezigdeel
                     WHERE     ins_deel_module = 'INS'
                           AND ins_srtdeel_key = v_srtdeel_key
                           AND ins_alg_ruimte_type = v_ruimte_type                              -- P
                           AND ins_alg_locatie_key IS NULL
                           AND TRIM (ins_deel_upper) = UPPER (rec.ins_deel_omschrijving);
                END IF;

                IF ccount = 0
                THEN                                                            -- toevoegen object!
                    v_errormsg := 'Fout bij toevoegen INS-object';

                    INSERT INTO ins_deel (ins_discipline_key,
                                          ins_srtdeel_key,
                                          ins_deel_module,
                                          ins_deel_omschrijving,
                                          ins_deel_opmerking,
                                          ins_alg_ruimte_key,
                                          ins_alg_ruimte_type,
                                          ins_alg_locatie_key)
                        VALUES (v_discipline_key,
                                v_srtdeel_key,
                                'INS',
                                rec.ins_deel_omschrijving,
                                rec.ins_deel_opmerking,
                                v_ruimte_key,
                                v_ruimte_type,
                                v_locatie_key)
                     RETURNING ins_deel_key
                          INTO v_deel_key;

                    -- Overslaan als reserveerbaar en geen RES-discipline of andersom,
                    -- dus verder geen controle op eventuele inconsistentie!
                    IF (rec.reserveerbaar = 1 AND rec.res_discipline_omschrijving IS NOT NULL)
                    THEN
                        v_errormsg :=
                               'Fout bij bepalen RES-discipline ['
                            || rec.res_discipline_omschrijving
                            || ']';

                        SELECT ins_discipline_key
                          INTO v_rdiscipline_key
                          FROM res_discipline
                         WHERE ins_discipline_verwijder IS NULL AND ins_discipline_module = 'RES'
                               AND UPPER (TRIM (ins_discipline_omschrijving)) =
                                      UPPER (rec.res_discipline_omschrijving);

                        v_errormsg := 'Fout bij toevoegen RES-object';

                        INSERT INTO res_deel (res_ins_deel_key,
                                              res_deel_omschrijving,
                                              res_deel_opmerking,
                                              res_deel_eenheid,
                                              res_deel_prijs,
                                              res_discipline_key,
                                              res_deel_alg_level)
                            VALUES (v_deel_key,
                                    rec.ins_deel_omschrijving,
                                    rec.ins_deel_opmerking,
                                    rec.res_deel_eenheid,
                                    rec.res_deel_prijs,
                                    v_rdiscipline_key,
                                    rec.res_deel_alg_level);

                        v_count_resnew := v_count_resnew + 1;
                    END IF;

                    v_srtnoti_code := 'INSNEW';
                    v_count_insnew := v_count_insnew + 1;
                ELSE                                                            -- bijwerken object!
                    v_errormsg := 'Fout bij bepalen INS-object';

                    SELECT ins_deel_key
                      INTO v_deel_key
                      FROM ins_v_aanwezigdeel
                     WHERE     ins_deel_module = 'INS'
                           AND ins_srtdeel_key = v_srtdeel_key
                           AND ins_alg_ruimte_type = v_ruimte_type                            -- R/P
                           AND COALESCE (ins_alg_locatie_key, -1) = COALESCE (v_locatie_key, -1) -- gevuld/NULL
                           AND TRIM (ins_deel_upper) = UPPER (rec.ins_deel_omschrijving);

                    v_srtnoti_code := 'INSUPD';
                    v_count_insupd := v_count_insupd + 1;
                END IF;

                -- NULL-waarden resulteren NIET in het wissen van kenmerkvelden
                -- (bijwerken kan wel, maar wissen dus niet)! ins_kenmerkwaarde1
                upsert_inskenmerk (v_deel_key, rec.ins_kenmerkwaarde1);
                upsert_inskenmerk (v_deel_key, rec.ins_kenmerkwaarde2);
                upsert_inskenmerk (v_deel_key, rec.ins_kenmerkwaarde3);
                upsert_inskenmerk (v_deel_key, rec.ins_kenmerkwaarde4);
                upsert_inskenmerk (v_deel_key, rec.ins_kenmerkwaarde5);
                upsert_inskenmerk (v_deel_key, rec.ins_kenmerkwaarde6);
                upsert_inskenmerk (v_deel_key, rec.ins_kenmerkwaarde7);
                upsert_inskenmerk (v_deel_key, rec.ins_kenmerkwaarde8);
                upsert_inskenmerk (v_deel_key, rec.ins_kenmerkwaarde9);
                upsert_inskenmerk (v_deel_key, rec.ins_kenmerkwaarde10);
                upsert_inskenmerk (v_deel_key, rec.ins_kenmerkwaarde11);
                upsert_inskenmerk (v_deel_key, rec.ins_kenmerkwaarde12);
                upsert_inskenmerk (v_deel_key, rec.ins_kenmerkwaarde13);
                upsert_inskenmerk (v_deel_key, rec.ins_kenmerkwaarde14);
                upsert_inskenmerk (v_deel_key, rec.ins_kenmerkwaarde15);
                upsert_inskenmerk (v_deel_key, rec.ins_kenmerkwaarde16);
                upsert_inskenmerk (v_deel_key, rec.ins_kenmerkwaarde17);
                upsert_inskenmerk (v_deel_key, rec.ins_kenmerkwaarde18);
                upsert_inskenmerk (v_deel_key, rec.ins_kenmerkwaarde19);
                upsert_inskenmerk (v_deel_key, rec.ins_kenmerkwaarde20);

                fac.trackaction (v_srtnoti_code,
                                 v_deel_key,
                                 sys_context('USERENV', 'CLIENT_IDENTIFIER'),
                                 NULL,
                                 NULL);
                COMMIT;
            EXCEPTION
                WHEN OTHERS
                THEN
                    oracle_err_num := SQLCODE;
                    oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
                    v_errormsg :=
                           v_errormsg
                        || ' (error '
                        || oracle_err_num
                        || '/'
                        || oracle_err_mes
                        || ')';
                    fac.imp_writelog (p_import_key,
                                      'W',
                                      v_aanduiding || v_errormsg,
                                      '');
                    COMMIT;
            END;
        END LOOP;

        fac.imp_writelog (p_import_key,
                          'S',
                          'INS-objecten/aantal ingelezen: ' || TO_CHAR (v_count_tot),
                          '');
        fac.imp_writelog (p_import_key,
                          'S',
                          'INS-objecten/aantal toegevoegd: ' || TO_CHAR (v_count_insnew),
                          '');
        fac.imp_writelog (p_import_key,
                          'S',
                          'INS-objecten/aantal bijgewerkt: ' || TO_CHAR (v_count_insupd),
                          '');
        fac.imp_writelog (p_import_key,
                          'S',
                          'RES-objecten/aantal toegevoegd: ' || TO_CHAR (v_count_resnew),
                          '');
        COMMIT;
    END;
-- MAIN
BEGIN
    dvon_import_ins (p_import_key);
    add_kostensoort (p_import_key);
    add_insdiscipline (p_import_key);
    add_resdiscipline (p_import_key);
    add_srtgroep (p_import_key);
    add_srtdeel (p_import_key);
    add_deel (p_import_key);
EXCEPTION
    WHEN OTHERS
    THEN
        oracle_err_num := SQLCODE;
        oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
        v_errormsg :=
            v_errormsg || ' (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
        fac.imp_writelog (p_import_key,
                          'E',
                          v_errormsg,
                          'Importproces objecten afgebroken!');
END dvon_update_extrains;
/

-- Ingelezen objecten in bulk uitleenbaar maken via export
CREATE OR REPLACE PROCEDURE DVON_EXPORT_LEENMAARUIT (p_applname   IN VARCHAR2,
                                                     p_applrun    IN VARCHAR2,
                                                     p_filedir    IN VARCHAR2,
                                                     p_filename   IN VARCHAR2)
AS
BEGIN
   UPDATE ins_srtdeel
      SET ins_srtdeel_uitleenbaar = 1
    WHERE ins_srtdeel_verwijder IS NULL 
      AND ins_srtdeel_uitleenbaar != 1;

   UPDATE ins_deel
      SET ins_alg_ruimte_key_org = 201, 
          ins_alg_ruimte_type_org = 'R'
    WHERE ins_alg_ruimte_type = 'P' 
      AND ins_alg_ruimte_key_org IS NULL;
END;
/

-- Vanaf hier rapportages

CREATE OR REPLACE VIEW dvon_v_rap_voorraad
(
   srtdeel_key,
   object_groep,
   object_soort,
   maat,
   aantal,
   locatie,
   gebouw,
   verdiepingcode,
   ruimtenr
)
AS
     SELECT i.ins_srtdeel_key,
            ig.ins_srtgroep_omschrijving,
            srt.ins_srtdeel_omschrijving,
            maat.fac_usrdata_omschr,
            COALESCE (COUNT (maat.fac_usrdata_omschr), 0),
            al.alg_locatie_omschrijving,
            ag.alg_gebouw_omschrijving,
            av.alg_verdieping_volgnr,
            ar.alg_ruimte_nr
       FROM ins_deel i,
            ins_srtdeel srt,
            ins_srtgroep ig,
            alg_ruimte ar,
            alg_locatie al,
            alg_gebouw ag,
            alg_verdieping av,
            (SELECT f.fac_usrdata_omschr, iv.ins_deel_key
               FROM fac_usrdata f,
                    ins_v_srtdeel_kenmerkdeel iv,
                    ins_kenmerk ik,
                    ins_srtkenmerk isk
              WHERE     f.fac_usrdata_key = iv.ins_kenmerkdeel_waarde
                    AND ik.ins_srtkenmerk_key = isk.ins_srtkenmerk_key
                    AND iv.ins_kenmerk_key = ik.ins_kenmerk_key
                    AND isk.ins_srtkenmerk_upper LIKE '%MAAT%') maat
      WHERE     i.ins_srtdeel_key = srt.ins_srtdeel_key
            AND i.ins_alg_ruimte_key = ar.alg_ruimte_key
            AND srt.ins_srtgroep_key = ig.ins_srtgroep_key
            AND ar.alg_verdieping_key = av.alg_verdieping_key
            AND av.alg_gebouw_key = ag.alg_gebouw_key
            AND ag.alg_locatie_key = al.alg_locatie_key
            AND i.ins_deel_key = maat.ins_deel_key(+)
            AND maat.fac_usrdata_omschr IS NOT NULL
            AND i.ins_alg_ruimte_key_org IS NULL
   GROUP BY i.ins_srtdeel_key,
            ig.ins_srtgroep_omschrijving,
            srt.ins_srtdeel_omschrijving,
            maat.fac_usrdata_omschr,
            al.alg_locatie_omschrijving,
            ag.alg_gebouw_omschrijving,
            av.alg_verdieping_volgnr,
            ar.alg_ruimte_nr
   UNION ALL
     SELECT i.ins_srtdeel_key,
            ig.ins_srtgroep_omschrijving,
            srt.ins_srtdeel_omschrijving,
            'NVT',
            COUNT (i.ins_deel_key),
            al.alg_locatie_omschrijving,
            ag.alg_gebouw_omschrijving,
            av.alg_verdieping_volgnr,
            ar.alg_ruimte_nr
       FROM ins_deel i,
            ins_srtdeel srt,
            ins_srtgroep ig,
            alg_ruimte ar,
            alg_locatie al,
            alg_gebouw ag,
            alg_verdieping av
      WHERE NOT EXISTS
               (SELECT 1
                  FROM ins_kenmerk ik, ins_srtkenmerk isk
                 WHERE     i.ins_srtdeel_key = ik.ins_srtinstallatie_key
                       AND ik.ins_srtkenmerk_key = isk.ins_srtkenmerk_key
                       AND isk.ins_srtkenmerk_upper LIKE '%MAAT%')
            AND i.ins_srtdeel_key = srt.ins_srtdeel_key
            AND i.ins_alg_ruimte_key = ar.alg_ruimte_key
            AND srt.ins_srtgroep_key = ig.ins_srtgroep_key
            AND ar.alg_verdieping_key = av.alg_verdieping_key
            AND av.alg_gebouw_key = ag.alg_gebouw_key
            AND ag.alg_locatie_key = al.alg_locatie_key
            AND i.ins_alg_ruimte_key_org IS NULL
   GROUP BY i.ins_srtdeel_key,
            ig.ins_srtgroep_omschrijving,
            srt.ins_srtdeel_omschrijving,
            al.alg_locatie_omschrijving,
            ag.alg_gebouw_omschrijving,
            av.alg_verdieping_volgnr,
            ar.alg_ruimte_nr;

CREATE OR REPLACE VIEW dvon_v_rap_voorraad_auth
(
   fclt_3d_discipline_key,
   srtdeel_key,
   object_groep,
   object_soort,
   maat,
   aantal,
   locatie,
   gebouw,
   verdiepingcode,
   ruimtenr
)
AS
     SELECT i.ins_discipline_key,
            sub.ins_srtdeel_key,
            iv.groep,
            iv.soort,
            maat.fac_usrdata_omschr,
            COALESCE (COUNT (maat.fac_usrdata_omschr), 0),
            iv.locatie_omschrijving,
            iv.gebouw,
            iv.verdiepingcode,
            iv.ruimtenr
       FROM ins_v_udr_deel iv,
            ins_discipline i,
            (  SELECT ins_deel_key, ins_srtdeel_key FROM ins_deel) sub,
            (SELECT f.fac_usrdata_omschr, iv.ins_deel_key
               FROM fac_usrdata f,
                    ins_v_srtdeel_kenmerkdeel iv,
                    ins_kenmerk ik,
                    ins_srtkenmerk isk
              WHERE     f.fac_usrdata_key = iv.ins_kenmerkdeel_waarde
                    AND ik.ins_srtkenmerk_key = isk.ins_srtkenmerk_key
                    AND iv.ins_kenmerk_key = ik.ins_kenmerk_key
                    AND isk.ins_srtkenmerk_upper LIKE '%MAAT%') maat
      WHERE     iv.deel_key = maat.ins_deel_key(+)
            AND maat.fac_usrdata_omschr IS NOT NULL
            AND iv.uitgeleend NOT LIKE 'ja'
            AND sub.ins_deel_key = iv.deel_key
            AND i.ins_discipline_omschrijving = iv.discipline
            AND i.ins_discipline_verwijder IS NULL
   GROUP BY sub.ins_srtdeel_key,
            maat.fac_usrdata_omschr,
            iv.groep,
            iv.soort,
            iv.locatie_omschrijving,
            iv.gebouw,
            iv.verdiepingcode,
            iv.ruimtenr,
            i.ins_discipline_key
   UNION ALL
     SELECT i.ins_discipline_key,
            sub.ins_srtdeel_key,
            iv.groep,
            iv.soort,
            'NVT',
            COUNT (iv.deel_key),
            iv.locatie_omschrijving,
            iv.gebouw,
            iv.verdiepingcode,
            iv.ruimtenr
       FROM ins_v_udr_deel iv,
            ins_discipline i,
            (  SELECT ins_deel_key, ins_srtdeel_key FROM ins_deel) sub
      WHERE NOT EXISTS
               (SELECT 1
                  FROM ins_kenmerk ik,
                       ins_srtkenmerk isk
                 WHERE
                       sub.ins_srtdeel_key = ik.ins_srtinstallatie_key
                       AND ik.ins_srtkenmerk_key = isk.ins_srtkenmerk_key
                       AND isk.ins_srtkenmerk_upper LIKE '%MAAT%')
            AND iv.uitgeleend NOT LIKE 'ja'
            AND sub.ins_deel_key = iv.deel_key
            AND i.ins_discipline_omschrijving = iv.discipline
            AND i.ins_discipline_verwijder IS NULL
   GROUP BY sub.ins_srtdeel_key,
            iv.groep,
            iv.soort,
            iv.locatie_omschrijving,
            iv.gebouw,
            iv.verdiepingcode,
            iv.ruimtenr,
            i.ins_discipline_key;

CREATE OR REPLACE VIEW dvon_v_rap_bes_voorraad
(
   bestelopdrachtnummer,
   bestellingkey,
   bestelaanvraagnr,
   besteldatum,
   status,
   besteller,
   catalogus,
   groep,
   objectgroep,
   productomschrijving,
   productcode,
   maat,
   aantal,
   kleurbolletje,
   op_voorraad,
   voorraad_locatie,
   opmerking,
   besteld_voor,
   bestopdr_key
)
AS
SELECT bo.bes_bestelopdr_id,
         b.bes_bestelling_key,
         'A-' || b.bes_bestelling_key bestelaanvraagnr,
         b.bes_bestelling_datum besteldatum,
         (SELECT bes_bestellingstatuses_omschr
            FROM bes_bestellingstatuses bs
           WHERE bs.bes_bestellingstatuses_key = b.bes_bestelling_status)
            status,
         (SELECT prs_perslid_naam_full
            FROM prs_v_perslid_fullnames_all pf
           WHERE pf.prs_perslid_key = b.prs_perslid_key)
            besteller,
         d.ins_discipline_omschrijving catalogus,
         sg.bes_srtgroep_omschrijving bestelgroep,
         COALESCE (dv.object_groep, 'Niet beschikbaar') objectgroep,
         sd.bes_srtdeel_omschrijving productomschrijving,
         sd.bes_srtdeel_nr productcode,
         COALESCE (maat.fac_usrdata_omschr, 'NVT') maat,
         bi.bes_bestelling_item_aantal aantal,
         lcl.l ('lcl_bestelopdr_flag' || bo.bes_bestelopdr_flag),
         COALESCE (dv.aantal, 0) op_voorraad,
         COALESCE (dv.locatie, 'Niet beschikbaar') voorraad_locatie,
         bo.bes_bestelopdr_opmerking,
         (SELECT prs_perslid_naam_full
            FROM prs_v_perslid_fullnames_all pf
           WHERE pf.prs_perslid_key = b.prs_perslid_key_voor)
            besteld_voor,
         bo.bes_bestelopdr_key
    FROM bes_bestelling b,
         bes_bestelling_item bi,
         bes_bestelopdr_item boi,
         bes_bestelopdr bo,
         bes_kenmerkbesteli bki,
         bes_kenmerk bk,
         dvon_v_rap_voorraad dv,
         ins_tab_discipline d,
         bes_srtdeel sd,
         bes_srtgroep sg,
         (SELECT f.fac_usrdata_omschr,
                 f.fac_usrdata_key,
                 bsk.bes_srtkenmerk_key
            FROM fac_usrdata f, bes_srtkenmerk bsk
           WHERE bsk.bes_srtkenmerk_upper LIKE '%MAAT%') maat
   WHERE     b.bes_bestelling_key = bi.bes_bestelling_key
         AND bi.bes_bestelopdr_item_key = boi.bes_bestelopdr_item_key
         AND boi.bes_bestelopdr_key = bo.bes_bestelopdr_key
         AND bki.bes_bestelling_item_key(+) = bi.bes_bestelling_item_key
         AND bki.bes_kenmerk_key = bk.bes_kenmerk_key(+)
         AND bk.bes_srtkenmerk_key = maat.bes_srtkenmerk_key(+)
         AND bi.bes_srtdeel_key = sd.bes_srtdeel_key
         AND sd.bes_srtgroep_key = sg.bes_srtgroep_key
         AND sg.ins_discipline_key = d.ins_discipline_key
         AND maat.fac_usrdata_key(+) =
               fac.safe_to_number (bki.bes_kenmerkbesteli_waarde)
         AND dv.srtdeel_key(+) = sd.ins_srtdeel_key
         AND bo.bes_bestelopdr_key IS NOT NULL
         AND dv.maat(+) = maat.fac_usrdata_omschr
         AND maat.fac_usrdata_omschr NOT LIKE '%NVT%'
  UNION ALL
  SELECT bo.bes_bestelopdr_id,
         b.bes_bestelling_key,
         'A-' || b.bes_bestelling_key bestelaanvraagnr,
         b.bes_bestelling_datum besteldatum,
         (SELECT bes_bestellingstatuses_omschr
            FROM bes_bestellingstatuses bs
           WHERE bs.bes_bestellingstatuses_key = b.bes_bestelling_status)
            status,
         (SELECT prs_perslid_naam_full
            FROM prs_v_perslid_fullnames_all pf
           WHERE pf.prs_perslid_key = b.prs_perslid_key)
            besteller,
         d.ins_discipline_omschrijving catalogus,
         sg.bes_srtgroep_omschrijving bestelgroep,
         COALESCE (dv.object_groep, 'Niet beschikbaar') objectgroep,
         sd.bes_srtdeel_omschrijving productomschrijving,
         sd.bes_srtdeel_nr productcode,
         COALESCE (maat.fac_usrdata_omschr, 'NVT') maat,
         bi.bes_bestelling_item_aantal aantal,
         lcl.l ('lcl_bestelopdr_flag' || bo.bes_bestelopdr_flag),
         COALESCE (dv.aantal, 0) op_voorraad,
         COALESCE (dv.locatie, 'Niet beschikbaar') voorraad_locatie,
         bo.bes_bestelopdr_opmerking,
         (SELECT prs_perslid_naam_full
            FROM prs_v_perslid_fullnames_all pf
           WHERE pf.prs_perslid_key = b.prs_perslid_key_voor)
            besteld_voor,
         bo.bes_bestelopdr_key
    FROM bes_bestelling b,
         bes_bestelling_item bi,
         bes_bestelopdr_item boi,
         bes_bestelopdr bo,
         bes_kenmerkbesteli bki,
         bes_kenmerk bk,
         dvon_v_rap_voorraad dv,
         ins_tab_discipline d,
         bes_srtdeel sd,
         bes_srtgroep sg,
         (SELECT f.fac_usrdata_omschr,
                 f.fac_usrdata_key,
                 bsk.bes_srtkenmerk_key
            FROM fac_usrdata f, bes_srtkenmerk bsk
           WHERE bsk.bes_srtkenmerk_upper LIKE '%MAAT%') maat
   WHERE     b.bes_bestelling_key = bi.bes_bestelling_key
         AND bi.bes_bestelopdr_item_key = boi.bes_bestelopdr_item_key
         AND boi.bes_bestelopdr_key = bo.bes_bestelopdr_key
         AND bki.bes_bestelling_item_key(+) = bi.bes_bestelling_item_key
         AND bki.bes_kenmerk_key = bk.bes_kenmerk_key(+)
         AND bk.bes_srtkenmerk_key = maat.bes_srtkenmerk_key(+)
         AND bi.bes_srtdeel_key = sd.bes_srtdeel_key
         AND sd.bes_srtgroep_key = sg.bes_srtgroep_key
         AND sg.ins_discipline_key = d.ins_discipline_key
         AND maat.fac_usrdata_key(+) =
               fac.safe_to_number (bki.bes_kenmerkbesteli_waarde)
         AND dv.srtdeel_key(+) = sd.ins_srtdeel_key
         AND bo.bes_bestelopdr_key IS NOT NULL
         AND dv.maat = 'NVT';

CREATE OR REPLACE VIEW dvon_v_rap_bes_voorraad_auth
(
   fclt_3d_discipline_key,
   bestelopdrachtnummer,
   bestellingkey,
   bestelaanvraagnr,
   besteldatum,
   status,
   besteller,
   catalogus,
   groep,
   objectgroep,
   productomschrijving,
   productcode,
   maat,
   aantal,
   kleurbolletje,
   op_voorraad,
   voorraad_locatie,
   opmerking,
   besteld_voor,
   bestopdr_key
)
AS
   SELECT d.ins_discipline_key,
          bo.bes_bestelopdr_id,
          b.bes_bestelling_key,
          'A-' || b.bes_bestelling_key bestelaanvraagnr,
          b.bes_bestelling_datum besteldatum,
          (SELECT bes_bestellingstatuses_omschr
             FROM bes_bestellingstatuses bs
            WHERE bs.bes_bestellingstatuses_key = b.bes_bestelling_status)
             status,
          (SELECT prs_perslid_naam_full
             FROM prs_v_perslid_fullnames_all pf
            WHERE pf.prs_perslid_key = b.prs_perslid_key)
             besteller,
          d.ins_discipline_omschrijving catalogus,
          sg.bes_srtgroep_omschrijving bestelgroep,
          COALESCE (dv.object_groep, 'Niet beschikbaar') objectgroep,
          sd.bes_srtdeel_omschrijving productomschrijving,
          sd.bes_srtdeel_nr productcode,
          COALESCE (maat.fac_usrdata_omschr, 'NVT') maat,
          bi.bes_bestelling_item_aantal aantal,
          lcl.l ('lcl_bestelopdr_flag' || bo.bes_bestelopdr_flag),
          COALESCE (dv.aantal, 0) op_voorraad,
          COALESCE (dv.locatie, 'Niet beschikbaar') voorraad_locatie,
          bo.bes_bestelopdr_opmerking,
          (SELECT prs_perslid_naam_full
             FROM prs_v_perslid_fullnames_all pf
            WHERE pf.prs_perslid_key = b.prs_perslid_key_voor)
             besteld_voor,
          bo.bes_bestelopdr_key
     FROM bes_bestelling b,
          bes_bestelling_item bi,
          bes_bestelopdr_item boi,
          bes_bestelopdr bo,
          bes_kenmerkbesteli bki,
          bes_kenmerk bk,
          dvon_v_rap_voorraad dv,
          ins_tab_discipline d,
          bes_srtdeel sd,
          bes_srtgroep sg,
          (SELECT f.fac_usrdata_omschr,
                  f.fac_usrdata_key,
                  bsk.bes_srtkenmerk_key
             FROM fac_usrdata f, bes_srtkenmerk bsk
            WHERE bsk.bes_srtkenmerk_upper LIKE '%MAAT%') maat
    WHERE     b.bes_bestelling_key = bi.bes_bestelling_key
          AND bi.bes_bestelopdr_item_key = boi.bes_bestelopdr_item_key
          AND boi.bes_bestelopdr_key = bo.bes_bestelopdr_key
          AND bki.bes_bestelling_item_key(+) = bi.bes_bestelling_item_key
          AND bki.bes_kenmerk_key = bk.bes_kenmerk_key(+)
          AND bk.bes_srtkenmerk_key = maat.bes_srtkenmerk_key(+)
          AND bi.bes_srtdeel_key = sd.bes_srtdeel_key
          AND sd.bes_srtgroep_key = sg.bes_srtgroep_key
          AND sg.ins_discipline_key = d.ins_discipline_key
          AND maat.fac_usrdata_key(+) =
                fac.safe_to_number (bki.bes_kenmerkbesteli_waarde)
          AND dv.srtdeel_key(+) = sd.ins_srtdeel_key
          AND bo.bes_bestelopdr_key IS NOT NULL
          AND dv.maat(+) = maat.fac_usrdata_omschr
          AND maat.fac_usrdata_omschr NOT LIKE '%NVT%'
   UNION ALL
   SELECT d.ins_discipline_key,
          bo.bes_bestelopdr_id,
          b.bes_bestelling_key,
          'A-' || b.bes_bestelling_key bestelaanvraagnr,
          b.bes_bestelling_datum besteldatum,
          (SELECT bes_bestellingstatuses_omschr
             FROM bes_bestellingstatuses bs
            WHERE bs.bes_bestellingstatuses_key = b.bes_bestelling_status)
             status,
          (SELECT prs_perslid_naam_full
             FROM prs_v_perslid_fullnames_all pf
            WHERE pf.prs_perslid_key = b.prs_perslid_key)
             besteller,
          d.ins_discipline_omschrijving catalogus,
          sg.bes_srtgroep_omschrijving bestelgroep,
          COALESCE (dv.object_groep, 'Niet beschikbaar') objectgroep,
          sd.bes_srtdeel_omschrijving productomschrijving,
          sd.bes_srtdeel_nr productcode,
          COALESCE (maat.fac_usrdata_omschr, 'NVT') maat,
          bi.bes_bestelling_item_aantal aantal,
          lcl.l ('lcl_bestelopdr_flag' || bo.bes_bestelopdr_flag),
          COALESCE (dv.aantal, 0) op_voorraad,
          COALESCE (dv.locatie, 'Niet beschikbaar') voorraad_locatie,
          bo.bes_bestelopdr_opmerking,
          (SELECT prs_perslid_naam_full
             FROM prs_v_perslid_fullnames_all pf
            WHERE pf.prs_perslid_key = b.prs_perslid_key_voor)
             besteld_voor,
          bo.bes_bestelopdr_key
     FROM bes_bestelling b,
          bes_bestelling_item bi,
          bes_bestelopdr_item boi,
          bes_bestelopdr bo,
          bes_kenmerkbesteli bki,
          bes_kenmerk bk,
          dvon_v_rap_voorraad dv,
          ins_tab_discipline d,
          bes_srtdeel sd,
          bes_srtgroep sg,
          (SELECT f.fac_usrdata_omschr,
                  f.fac_usrdata_key,
                  bsk.bes_srtkenmerk_key
             FROM fac_usrdata f, bes_srtkenmerk bsk
            WHERE bsk.bes_srtkenmerk_upper LIKE '%MAAT%') maat
    WHERE     b.bes_bestelling_key = bi.bes_bestelling_key
          AND bi.bes_bestelopdr_item_key = boi.bes_bestelopdr_item_key
          AND boi.bes_bestelopdr_key = bo.bes_bestelopdr_key
          AND bki.bes_bestelling_item_key(+) = bi.bes_bestelling_item_key
          AND bki.bes_kenmerk_key = bk.bes_kenmerk_key(+)
          AND bk.bes_srtkenmerk_key = maat.bes_srtkenmerk_key(+)
          AND bi.bes_srtdeel_key = sd.bes_srtdeel_key
          AND sd.bes_srtgroep_key = sg.bes_srtgroep_key
          AND sg.ins_discipline_key = d.ins_discipline_key
          AND maat.fac_usrdata_key(+) =
                fac.safe_to_number (bki.bes_kenmerkbesteli_waarde)
          AND dv.srtdeel_key(+) = sd.ins_srtdeel_key
          AND bo.bes_bestelopdr_key IS NOT NULL
          AND dv.maat = 'NVT';
              
CREATE OR REPLACE VIEW dvon_v_rap_gelev_nbev
(
   bestelling_key,
   bestelaanvraagnr,
   besteld_voor,
   bestelling_status,
   kostenplaats,
   datum_laatste_lev,
   email_besteld_voor,
   fiatteur,
   email_fiatteur
)
AS
   SELECT DISTINCT
          b.bes_bestelling_key,
          'A-' || b.bes_bestelling_key bestelaanvraagnr,
          (SELECT prs_perslid_naam_full
             FROM prs_v_perslid_fullnames_all pf
            WHERE pf.prs_perslid_key = b.prs_perslid_key_voor)
             besteld_voor,
          (SELECT bes_bestellingstatuses_omschr
             FROM bes_bestellingstatuses bs
            WHERE bs.bes_bestellingstatuses_key = b.bes_bestelling_status)
             status,
          pk.prs_kostenplaats_omschrijving,
          b.bes_bestelling_leverdatum,
          (SELECT p.prs_perslid_email
             FROM prs_perslid p
            WHERE p.prs_perslid_key = b.prs_perslid_key_voor)
             email_voor,
          (SELECT prs_perslid_naam_full
             FROM prs_v_perslid_fullnames_all pf
            WHERE pf.prs_perslid_key = b.bes_bestelling_fiat_user)
             fiatteur,
          (SELECT p.prs_perslid_email
             FROM prs_perslid p
            WHERE p.prs_perslid_key = b.bes_bestelling_fiat_user)
             email_fiat
     FROM bes_bestelling b,
          prs_v_perslid_fullnames pf,
          prs_kostenplaats pk,
          prs_perslid p
    WHERE     b.prs_kostenplaats_key = pk.prs_kostenplaats_key
          AND b.bes_bestelling_leverdatum IS NOT NULL
          AND b.bes_bestelling_status = 6;

CREATE OR REPLACE VIEW dvon_v_rap_bezit_extra
(
   perslid_key,
   deel_key,
   fclt_3d_discipline_key,
   deel_soort,
   deel_oms,
   maat,
   uitgegeven,
   eigenaar,
   locatie
)
AS
   SELECT (SELECT pf.prs_perslid_key
             FROM prs_v_perslid_fullnames pf
            WHERE i.ins_alg_ruimte_key = pf.prs_perslid_key
                  AND i.ins_alg_ruimte_type = 'P')
             perslid_key,
          i.ins_deel_key,
          i.ins_discipline_key,
          isrt.ins_srtdeel_omschrijving,
          i.ins_deel_omschrijving,
          maat.fac_usrdata_omschr,
          DECODE (i.ins_alg_ruimte_key_org, NULL, 'Nee', 'Ja') uitgegeven,
          (SELECT pf.prs_perslid_naam_friendly
             FROM prs_v_perslid_fullnames pf
            WHERE i.ins_alg_ruimte_key = pf.prs_perslid_key
                  AND i.ins_alg_ruimte_type = 'P')
             persoon,
          (SELECT ar.alg_ruimte_upper_nr
             FROM alg_ruimte ar
            WHERE i.ins_alg_ruimte_key = ar.alg_ruimte_key
                  AND i.ins_alg_ruimte_type = 'R')
             locatie
     FROM ins_deel i,
          ins_srtdeel isrt,
          (SELECT f.fac_usrdata_omschr, iv.ins_deel_key
             FROM fac_usrdata f,
                  ins_v_srtdeel_kenmerkdeel iv,
                  ins_kenmerk ik,
                  ins_srtkenmerk isk
            WHERE     f.fac_usrdata_key = fac.safe_to_number (iv.ins_kenmerkdeel_waarde)
                  AND ik.ins_srtkenmerk_key = isk.ins_srtkenmerk_key
                  AND iv.ins_kenmerk_key = ik.ins_kenmerk_key
                  AND isk.ins_srtkenmerk_upper LIKE '%MAAT%') maat
    WHERE i.ins_deel_key = maat.ins_deel_key(+)
          AND i.ins_srtdeel_key = isrt.ins_srtdeel_key
          AND i.ins_deel_verwijder IS NULL;

CREATE OR REPLACE VIEW dvon_v_rap_bezit_extra_print
(
   perslid_key,
   deel_key,
   fclt_3d_discipline_key,
   discipline,
   deel_soort,
   deel_oms,
   maat,
   uitgegeven,
   eigenaar,
   locatie
)
AS
   SELECT (SELECT pf.prs_perslid_key
             FROM prs_v_perslid_fullnames pf
            WHERE i.ins_alg_ruimte_key = pf.prs_perslid_key
                  AND i.ins_alg_ruimte_type = 'P')
             perslid_key,
          i.ins_deel_key,
          i.ins_discipline_key,
          idc.ins_discipline_omschrijving,
          isrt.ins_srtdeel_omschrijving,
          i.ins_deel_omschrijving,
          maat.fac_usrdata_omschr,
          DECODE (i.ins_alg_ruimte_key_org, NULL, 'Nee', 'Ja') uitgegeven,
          (SELECT pf.prs_perslid_naam_friendly
             FROM prs_v_perslid_fullnames pf
            WHERE i.ins_alg_ruimte_key = pf.prs_perslid_key
                  AND i.ins_alg_ruimte_type = 'P')
             persoon,
          (SELECT ar.alg_ruimte_upper_nr
             FROM alg_ruimte ar
            WHERE i.ins_alg_ruimte_key = ar.alg_ruimte_key
                  AND i.ins_alg_ruimte_type = 'R')
             locatie
     FROM ins_deel i,
          ins_srtdeel isrt,
          ins_discipline idc,
          (SELECT f.fac_usrdata_omschr, iv.ins_deel_key
             FROM fac_usrdata f,
                  ins_v_srtdeel_kenmerkdeel iv,
                  ins_kenmerk ik,
                  ins_srtkenmerk isk
            WHERE     f.fac_usrdata_key = iv.ins_kenmerkdeel_waarde
                  AND ik.ins_srtkenmerk_key = isk.ins_srtkenmerk_key
                  AND iv.ins_kenmerk_key = ik.ins_kenmerk_key
                  AND isk.ins_srtkenmerk_upper LIKE '%MAAT%') maat
    WHERE i.ins_deel_key = maat.ins_deel_key(+)
          AND i.ins_srtdeel_key = isrt.ins_srtdeel_key
          AND i.ins_deel_verwijder IS NULL
          AND i.ins_discipline_key = idc.ins_discipline_key;

CREATE OR REPLACE VIEW dvon_v_rap_art_voorraad
(
  -- fclt_3d_discipline_key,
  -- catalogus,
  -- groep,
   productomschrijving,
   maat,
   aantal_besteld,
   op_voorraad,
   onvoldoende_voorraad
)
AS
     SELECT --fclt_3d_discipline_key,
            --catalogus,
            --groep,
            productomschrijving,
            maat,
            SUM (aantal) besteld,
            op_voorraad,
            CASE WHEN op_voorraad - SUM (aantal) < 0 THEN '!' ELSE 'V' END
       FROM dvon_v_rap_bes_voorraad_auth
   GROUP BY --fclt_3d_discipline_key,
            --catalogus,
            --groep,
            productomschrijving,
            maat,
            op_voorraad;
                     
CREATE OR REPLACE VIEW dvon_v_rap_impobjsrt
(
   objsrtkey,
   disciplineomschrijving,
   groepsoortomschrijving,
   objectsoortcode,
   objectsoortomschrijving,
   Uitleenbaar,
   Leverancier,
   Vervaldatum,
   Kenmerksoort,
   Bewerken_bij,
   Volgnummer,
   Verplicht,
   Groep
)
AS
   SELECT i.ins_srtdeel_key,
          itab.ins_discipline_omschrijving,
          ig.ins_srtgroep_omschrijving,
          i.ins_srtdeel_code,
          i.ins_srtdeel_omschrijving,
          DECODE (i.ins_srtdeel_uitleenbaar, 1, 'ja', 'nee'),
          sub.fac_usrdata_omschr,
          i.ins_srtdeel_vervaldatum,
          isk.ins_srtkenmerk_omschrijving,
          DECODE (ik.ins_kenmerk_bewerkniveau, 'D', 'deel', 'S', 'soort'),
          ik.ins_kenmerk_volgnummer,
          DECODE (ik.ins_kenmerk_verplicht, 1, 'ja', 'nee'),
          ik.ins_kenmerk_groep
     FROM ins_srtdeel i,
          ins_kenmerk ik,
          ins_srtkenmerk isk,
          ins_srtgroep ig,
          ins_tab_discipline itab,
          (SELECT f.fac_usrdata_omschr, i.ins_deel_key
          FROM fac_usrdata f, ins_kenmerkdeel i
          WHERE i.ins_kenmerkdeel_waarde = f.fac_usrdata_key
          AND i.ins_kenmerk_key = 241) sub
    WHERE  i.ins_srtgroep_key = ig.ins_srtgroep_key
          AND ig.ins_discipline_key = itab.ins_discipline_key
          AND ik.ins_srtkenmerk_key = isk.ins_srtkenmerk_key
          AND ik.ins_kenmerk_niveau = 'S'
          AND ik.ins_srtinstallatie_key = i.ins_srtdeel_key
          AND i.ins_srtdeel_key = sub.ins_deel_key(+)
          AND i.ins_srtdeel_verwijder IS NULL
          AND ik.ins_kenmerk_verwijder IS NULL;

CREATE OR REPLACE VIEW DVON_V_RAP_ORGKOST
(
   Bedrijfsnaam,
   Afdelingscodeparent,
   Afdelingscode,
   Afdelingsomschrijving,
   Kostenplaats,
   Kostenplaatsomschrijving,
   KostenplaatsType,
   Kostenplaatsbegin,
   Kostenplaatseind,
   Budgethouder,
   KostenplaatsBudget,
   KostenplaatsBudgetPeriode,
   KostenplaatsExtern,
   OpdrachtenFiatteren,
   Kostenplaatsgroep,
   Kostenplaatsgroepnummer,
   Fiatteur_1,
   Fiatteur_2,
   Fiatteur_3,
   Limiet,
   Limiet_periode
)
AS
   SELECT pb.prs_bedrijf_naam,
          par.prs_afdeling_naam,
          pa.prs_afdeling_naam,
          pa.prs_afdeling_omschrijving,
          pk.prs_kostenplaats_nr,
          pk.prs_kostenplaats_omschrijving,
          pk.prs_kostenplaats_module,
          TRUNC (pk.prs_kostenplaats_begin),
          TRUNC (pk.prs_kostenplaats_eind),
          (SELECT prs_perslid_oslogin
             FROM prs_perslid
            WHERE prs_perslid_key = pk.prs_perslid_key)
             budgethouder,
          prs_kostenplaats_limiet,
          DECODE (pk.prs_kostenplaats_limietperiode, 1, 'M', 2, 'J', 0),
          pk.prs_kostenplaats_extern,
          pk.prs_kostenplaats_fiat,
          pkg.prs_kostenplaatsgrp_oms,
          pkg.prs_kostenplaatsgrp_nr,
          (SELECT prs_perslid_oslogin
             FROM prs_perslid
            WHERE prs_perslid_key = pkg.prs_perslid_key)
             fiat1,
          (SELECT prs_perslid_oslogin
             FROM prs_perslid
            WHERE prs_perslid_key = pkg.prs_kostenplaatsgrp_fiat2_key)
             fiat2,
          (SELECT prs_perslid_oslogin
             FROM prs_perslid
            WHERE prs_perslid_key = pkg.prs_kostenplaatsgrp_fiat3_key)
             fiat3,
          pkg.prs_kostenplaatsgrp_limiet,
          DECODE (pkg.prs_kostenplaatsgrp_limperiode, 1, 'M', 2, 'J', 0)
     FROM prs_afdeling pa,
          prs_bedrijf pb,
          prs_kostenplaats pk,
          prs_kostenplaatsgrp pkg,
          (SELECT prs_afdeling_key, prs_afdeling_naam FROM prs_afdeling) par
    WHERE     pa.prs_bedrijf_key = pb.prs_bedrijf_key(+)
          AND pa.prs_afdeling_parentkey = par.prs_afdeling_key(+)
          AND pa.prs_kostenplaats_key = pk.prs_kostenplaats_key
          AND pk.prs_kostenplaatsgrp_key = pkg.prs_kostenplaatsgrp_key(+)
          AND pb.prs_bedrijf_verwijder IS NULL
          AND pk.prs_kostenplaats_verwijder IS NULL
          AND pa.prs_afdeling_verwijder IS NULL;

 -- t.b.v. de import CATARTIKEL, IN TESTFASE!!     
CREATE OR REPLACE VIEW dvon_v_rap_impcatartikel
(
   catalogusnaam,
   leverancier,
   artikelnr,
   groep,
   omschrijving,
   prijs,
   eenheid,
   picture,
   wijzigdagen,
   annuleerdagen,
   duedate,
   minimumvoorraad,
   maximumvoorraad,
   opmerking,
   objectsoortcode,
   kenmerksoort,
   volgnummer,
   verplicht,
   kenmerkgroep
)
AS
 SELECT DISTINCT
          i.ins_discipline_omschrijving,
          pb.prs_bedrijf_naam,
          b.bes_srtdeel_nr,
          bg.bes_srtgroep_omschrijving,
          b.bes_srtdeel_omschrijving,
          NULL ,--prijs is altijd leeg
          b.bes_srtdeel_eenheid,
          b.bes_srtdeel_image,
          b.bes_srtdeel_wijzigdagen,
          b.bes_srtdeel_annuleerdagen,
          b.bes_srtdeel_vervaldatum,
          b.bes_srtdeel_voorraadmin,
          b.bes_srtdeel_voorraadmax,
          b.bes_srtdeel_opmerking,
          sd.ins_srtdeel_code,
          bsk.bes_srtkenmerk_omschrijving,
          bk.bes_kenmerk_volgnummer,
          bk.bes_kenmerk_verplicht,
          bk.bes_kenmerk_groep
          FROM 
          bes_srtdeel b,
          bes_srtgroep bg,
          bes_kenmerk bk,
          bes_srtkenmerk bsk,
          prs_bedrijf pb,
          bes_discipline i,
          ins_srtdeel sd
          WHERE
          b.prs_bedrijf_key = pb.prs_bedrijf_key
          AND b.bes_srtgroep_key = bg.bes_srtgroep_key(+)
          AND bg.ins_discipline_key = i.ins_discipline_key(+)
          AND b.ins_srtdeel_key = sd.ins_srtdeel_key
          AND bk.bes_srtkenmerk_key = bsk.bes_srtkenmerk_key
          AND bk.bes_srtinstallatie_key = b.bes_srtdeel_key
          AND b.bes_srtdeel_verwijder IS NULL;

-- Voor het exporteren van bestelde artikelen om later in te lezen via de objectenimport          
CREATE OR REPLACE VIEW dvon_v_rap_expbestelling
(
   bestelling_key,
   disciplineomschrijving,
   disciplinekostensoort,
   groepsoortomschrijving,
   objectsoortcode,
   objectsoortomschrijving,
   objectidentificatie,
   objectopmerking,
   reserveerbaar,
   eenheid,
   prijs,
   locatiecode,
   gebouwcode,
   bouwlaagvolgnummer,
   ruimtenummer,
   reserveringscope,
   catalogusnaam,
   cataloguskostensoort,
   persoonmatchcode,
   persoonmatchwaarde,
   ingangsdatum,
   vervaldatum,
   aantal,
   maat,
   kenmerk2,
   kenmerk3,
   kenmerk4,
   kenmerk5,
   kenmerk6,
   kenmerk7,
   kenmerk8,
   kenmerk9,
   kenmerk10,
   kenmerk11,
   kenmerk12,
   kenmerk13,
   kenmerk14,
   kenmerk15,
   kenmerk16,
   kenmerk17,
   kenmerk18,
   kenmerk19,
   kenmerk20
)
AS
     SELECT sub.bes_bestelling_key,
            d.ins_discipline_omschrijving,
            NULL,
            sg.ins_srtgroep_omschrijving,
            sd.ins_srtdeel_code,
            sd.ins_srtdeel_omschrijving,
            MAX (I.INS_DEEL_OMSCHRIJVING),
            NULL,                                            -- geen opmerking
            NULL,                                      -- reserveerbaar is nvt
            NULL,                                            -- eenheid is nvt
            NULL,                                              -- prijs is nvt
            'DVO-ASSEN3',                                       -- locatiecode
            'DVO-ASS-MA',                                        -- gebouwcode
            '0',                                                   -- bouwlaag
            'MAGAZIJN',                                         --ruimtenummer
            NULL,                                          -- reserveringscope
            NULL,                                             -- catalogusnaam
            NULL,                                      -- cataloguskostensoort
            NULL,                                          -- persoonmatchcode
            NULL,                                        -- persoonmatchwaarde
            NULL,                                              -- ingangsdatum
            NULL,                                               -- vervaldatum
            sub.aantal,                   -- aantal, moet nog omgebogen worden
            sub.maat,                                             -- kenmerk 1
            -- en hieronder kenmerk 2 tm 20
            NULL,
            NULL,
            NULL,
            NULL,
            NULL,
            NULL,
            NULL,
            NULL,
            NULL,
            NULL,
            NULL,
            NULL,
            NULL,
            NULL,
            NULL,
            NULL,
            NULL,
            NULL,
            NULL
       FROM (  SELECT b.bes_bestelling_key,
                      sd.ins_srtdeel_key,
                      sd.bes_srtdeel_omschrijving productomschrijving,
                      maat.fac_usrdata_omschr maat,
                      SUM (bi.bes_bestelling_item_aantal) aantal
                 FROM bes_bestelling b,
                      bes_bestelling_item bi,
                      bes_bestelopdr_item boi,
                      bes_bestelopdr bo,
                      bes_kenmerkbesteli bki,
                      bes_kenmerk bk,
                      ins_tab_discipline d,
                      bes_srtdeel sd,
                      bes_srtgroep sg,
                      (SELECT f.fac_usrdata_omschr,
                              f.fac_usrdata_key,
                              bsk.bes_srtkenmerk_key
                         FROM fac_usrdata f, bes_srtkenmerk bsk
                        WHERE bsk.bes_srtkenmerk_upper LIKE '%MAAT%') maat
                WHERE b.bes_bestelling_key = bi.bes_bestelling_key
                      AND bi.bes_bestelopdr_item_key =
                            boi.bes_bestelopdr_item_key
                      AND boi.bes_bestelopdr_key = bo.bes_bestelopdr_key
                      AND bki.bes_bestelling_item_key(+) =
                            bi.bes_bestelling_item_key
                      AND bki.bes_kenmerk_key = bk.bes_kenmerk_key(+)
                      AND bk.bes_srtkenmerk_key = maat.bes_srtkenmerk_key(+)
                      AND bi.bes_srtdeel_key = sd.bes_srtdeel_key
                      AND sd.bes_srtgroep_key = sg.bes_srtgroep_key
                      AND sg.ins_discipline_key = d.ins_discipline_key
                      AND maat.fac_usrdata_key(+) =
                            fac.safe_to_number (bki.bes_kenmerkbesteli_waarde)
             GROUP BY (b.bes_bestelling_key,
                       sd.ins_srtdeel_key,
                       sd.bes_srtdeel_omschrijving,
                       --    bi.bes_bestelling_item_aantal,
                       maat.fac_usrdata_omschr)) sub,
            ins_tab_discipline d,
            ins_deel i,
            ins_srtdeel sd,
            ins_srtgroep sg
      WHERE     sub.ins_srtdeel_key = sd.ins_srtdeel_key
            AND sd.ins_srtdeel_key = i.ins_srtdeel_key
            AND sd.ins_srtgroep_key = sg.ins_srtgroep_key
            AND sg.ins_discipline_key = d.ins_discipline_key
            AND sub.ins_srtdeel_key IS NOT NULL
   GROUP BY (sub.bes_bestelling_key,
             d.ins_discipline_omschrijving,
             sg.ins_srtgroep_omschrijving,
             sd.ins_srtdeel_code,
             sd.ins_srtdeel_omschrijving,
             sub.aantal,
             sub.maat);

-- Bovenstaande view maar dan in formaat voor import EXTRAINS             
CREATE OR REPLACE VIEW dvon_v_expbestelling_data
 (
         bestelling_key,
         disciplineomschrijving,
         disciplinekostensoort,
         groepsoortomschrijving,
         objectsoortcode,
         objectsoortomschrijving,
         objectomschrijving,
         nummer,
         objectopmerking,
         reserveerbaar,
         eenheid,
         prijs,
         locatiecode,
         gebouwcode,
         bouwlaagvolgnummer,
         ruimtenummer,
         reserveringscope,
         catalogusnaam,
         cataloguskostensoort,
         persoonmatchcode,
         persoonmatchwaarde,
         maat,
         kenmerk2,
         kenmerk3,
         kenmerk4,
         kenmerk5,
         kenmerk6,
         kenmerk7,
         kenmerk8,
         kenmerk9,
         kenmerk10,
         kenmerk11,
         kenmerk12,
         kenmerk13,
         kenmerk14,
         kenmerk15,
         kenmerk16,
         kenmerk17,
         kenmerk18,
         kenmerk19,
         kenmerk20
 )
 AS
 SELECT bestelling_key,
         disciplineomschrijving,
         disciplinekostensoort,
         groepsoortomschrijving,
         objectsoortcode,
         objectsoortomschrijving,
         ROWNUM,
         objectidentificatie,
         objectopmerking,
         reserveerbaar,
         eenheid,
         prijs,
         locatiecode,
         gebouwcode,
         bouwlaagvolgnummer,
         ruimtenummer,
         reserveringscope,
         catalogusnaam,
         cataloguskostensoort,
         persoonmatchcode,
         persoonmatchwaarde,
         maat,
         kenmerk2,
         kenmerk3,
         kenmerk4,
         kenmerk5,
         kenmerk6,
         kenmerk7,
         kenmerk8,
         kenmerk9,
         kenmerk10,
         kenmerk11,
         kenmerk12,
         kenmerk13,
         kenmerk14,
         kenmerk15,
         kenmerk16,
         kenmerk17,
         kenmerk18,
         kenmerk19,
         kenmerk20
    FROM    dvon_v_rap_expbestelling d
         CROSS JOIN
            (    SELECT ROWNUM n
                   FROM DUAL
             CONNECT BY LEVEL <=
                           (SELECT MAX (aantal)
                              FROM dvon_v_rap_expbestelling))
   WHERE n <= aantal
ORDER BY objectsoortcode;

CREATE OR REPLACE VIEW dvon_v_noti_bes_deel
(
   code,
   sender,
   receiver,
   text,
   key,
   xkey
)
AS
   SELECT DISTINCT
          'CUST01',
          NULL,
          b.prs_perslid_key,
             'Deellevering voor bestelling met nummer '
          || b.bes_bestelling_key,
          b.bes_bestelling_key,
          NULL
     FROM bes_bestelling b,
             (SELECT 
             bes_bestelling_key,
             SUM (bes_bestelling_item_aantalontv) aantalontv,
             SUM (bes_bestelling_item_aantal) aantal
             FROM bes_bestelling_item
             GROUP BY bes_bestelling_key) bi,
             bes_bestelopdr bo,
             fac_tracking fa
     WHERE b.bes_bestelling_key = bi.bes_bestelling_key
     AND bi.aantalontv IS NOT NULL -- Er moeten artikelen ontvangen zijn voor een deellevering
     AND bi.aantalontv < bi.aantal -- Levering is nog niet compleet
     AND fa.fac_tracking_refkey = bo.bes_bestelopdr_key
     AND fa.fac_srtnotificatie_key = 25 -- BESUPD er is iets geleverd
     AND b.bes_bestelling_key = substr(bo.bes_bestelopdr_id, 1, instr(bo.bes_bestelopdr_id, '/')-1)
     AND fa.fac_tracking_datum BETWEEN (SELECT fac_notificatie_job_nextrun
                                                   - fac_notificatie_job_interval
                                                     / 24
                                              FROM fac_notificatie_job
                                             WHERE fac_notificatie_job_view =
                                                      'DVON_V_NOTI_BES_DEEL')
                                       AND  (SELECT fac_notificatie_job_nextrun
                                               FROM fac_notificatie_job
                                              WHERE fac_notificatie_job_view =
                                                       'DVON_V_NOTI_BES_DEEL');
                                                       
------ 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
