--
-- $Id$
--
-- PDKL#86262 Implementatie Polidirect Klinieken
-- Import voor bestelvoorraad
--
DEFINE thisfile = 'PDKL#86262_2.SQL'
DEFINE dbuser   = '^PDKL'

SET ECHO ON
SET DEFINE ON
COLUMN fcltlogfile NEW_VALUE fcltlogfile NOPRINT;
COLUMN fcltcusterr NEW_VALUE fcltcusterr NOPRINT;
WHENEVER SQLERROR CONTINUE;

SELECT adm.getscriptspoolfile ('&thisfile') AS fcltlogfile FROM DUAL;

SPOOL &fcltlogfile
WHENEVER SQLERROR EXIT;

SELECT adm.checkscriptcust ('&dbuser') AS fcltcusterr FROM DUAL;

WHENEVER SQLERROR CONTINUE;
PROMPT &fcltcusterr
SET DEFINE OFF

------ payload begin ------
CREATE TABLE pdkl_imp_catalogus
(
    fac_import_key                 NUMBER (10),
    ins_discipline_key             NUMBER (10),
    prs_bedrijf_key                NUMBER (10),
    fac_imp_catalogus_datum        DATE,
    ins_srtdeel_nr                 VARCHAR2 (32),
    ins_srtgroep_omschrijving      VARCHAR2 (60),
    ins_srtdeel_omschrijving       VARCHAR2 (100),
    ins_srtdeel_prijs              NUMBER (11, 5),
    ins_srtdeel_eenheid            VARCHAR2 (30),
    ins_srtdeel_image              VARCHAR2 (255),
    ins_srtdeel_veelvoud           NUMBER (6),
    ins_srtdeel_btw                NUMBER (3),
    ins_srtdeel_vervaldatum        DATE,
    ins_srtdeel_inkprijs           NUMBER (11, 5),
    ins_srtdeel_minimum            NUMBER (6),
    bes_staffeltabel_key           NUMBER (10),
    ins_srtdeel_wijzigdagen        NUMBER (3),
    ins_srtdeel_annuleerdagen      NUMBER (3),
    ins_srtdeel_opmerking          VARCHAR2 (2000),
    ins_srtdeel_sensortype         NUMBER (3),
    ins_srtdeel_acadsymbol_dwgx    NUMBER (16, 3),
    ins_srtdeel_acadsymbol_dwgy    NUMBER (16, 3),
    ins_srtdeel_externnr           VARCHAR2 (256),
    bes_srtdeel_maximum            NUMBER (6),
    bes_srtdeel_notitie            VARCHAR2 (50),                   --               magazijnlocatie
    bes_srtdeel_volgnr             NUMBER (3),
    bes_srtdeel_voorraadmin        NUMBER (3),
    bes_srtdeel_voorraadmax        NUMBER (3)
);


-- Procedures om catalogi in te lezen en te verwerken
CREATE OR REPLACE PROCEDURE pdkl_import_catalogus (p_import_key IN NUMBER)
IS
    p_discipline_key            NUMBER (10);
    p_bedrijf_key               NUMBER (10);

    c_delim                     VARCHAR2 (2) := fac.import_delimiter (p_import_key);
    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);
    v_bedrijf_naam              VARCHAR2 (255);
    v_catalogus_datum           VARCHAR2 (255);
    v_srtdeel_nr                VARCHAR2 (255);
    v_srtgroep_omschrijving     VARCHAR2 (255);
    v_srtdeel_omschrijving      VARCHAR2 (255);
    v_srtdeel_prijs             VARCHAR2 (255);
    v_srtdeel_eenheid           VARCHAR2 (255);
    v_srtdeel_image             VARCHAR2 (255);
    v_srtdeel_veelvoud          VARCHAR2 (255);
    v_srtdeel_btw               VARCHAR2 (255);
    v_srtdeel_vervaldatum       VARCHAR2 (255);
    v_srtdeel_inkprijs          VARCHAR2 (255);
    v_srtdeel_minimum           VARCHAR2 (255);
    v_bes_staffeltabel_naam     VARCHAR2 (255);
    v_srtdeel_wijzigdagen       VARCHAR2 (255);
    v_srtdeel_annuleerdagen     VARCHAR2 (255);
    v_srtdeel_opmerking         VARCHAR2 (4000);                          -- straks afgekapt op 2000
    v_srtdeel_maximum           VARCHAR2 (255);
    v_srtdeel_notitie           VARCHAR2 (255);
    v_srtdeel_volgnr            VARCHAR2 (255);
    v_srtdeel_voorraadmin       VARCHAR2 (255);
    v_srtdeel_voorraadmax       VARCHAR2 (255);

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


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

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

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

            -- Lees alle veldwaarden
            fac.imp_getfield (v_newline, c_delim, v_discipline_omschrijving);
            fac.imp_getfield (v_newline, c_delim, v_bedrijf_naam);
            fac.imp_getfield (v_newline, c_delim, v_catalogus_datum);
            fac.imp_getfield (v_newline, c_delim, v_srtdeel_nr);
            fac.imp_getfield (v_newline, c_delim, v_srtgroep_omschrijving);
            fac.imp_getfield (v_newline, c_delim, v_srtdeel_omschrijving);
            fac.imp_getfield (v_newline, c_delim, v_srtdeel_prijs);
            fac.imp_getfield (v_newline, c_delim, v_srtdeel_eenheid);
            fac.imp_getfield (v_newline, c_delim, v_srtdeel_image);
            fac.imp_getfield (v_newline, c_delim, v_srtdeel_veelvoud);
            fac.imp_getfield (v_newline, c_delim, v_srtdeel_btw);
            fac.imp_getfield (v_newline, c_delim, v_srtdeel_vervaldatum);
            fac.imp_getfield (v_newline, c_delim, v_srtdeel_inkprijs);
            fac.imp_getfield (v_newline, c_delim, v_srtdeel_minimum);
            fac.imp_getfield (v_newline, c_delim, v_bes_staffeltabel_naam);
            fac.imp_getfield (v_newline, c_delim, v_srtdeel_wijzigdagen);
            fac.imp_getfield (v_newline, c_delim, v_srtdeel_annuleerdagen);
            fac.imp_getfield (v_newline, c_delim, v_srtdeel_opmerking);
            fac.imp_getfield (v_newline, c_delim, v_srtdeel_maximum);
            fac.imp_getfield (v_newline, c_delim, v_srtdeel_notitie);
            fac.imp_getfield (v_newline, c_delim, v_srtdeel_volgnr);
            fac.imp_getfield (v_newline, c_delim, v_srtdeel_voorraadmin);
            fac.imp_getfield (v_newline, c_delim, v_srtdeel_voorraadmax);

            -- Ik controleer of ik een geldige header heb, dat is: in de juiste kolommen
            -- de juiste kolomkop. Ik controleer daarbij - sinds UWVA#21562 - bijna alle
            -- kolommen (spaties in kolomheaders zijn onhandig bij "round-trip syncen").
            -- Ik negeer alles totdat ik een geldige header ben gepasseerd.
            IF (header_is_valid = 0)
            THEN
                IF     UPPER (TRIM (v_discipline_omschrijving)) LIKE 'CATALOGUS%'
                   AND UPPER (TRIM (v_bedrijf_naam)) = 'LEVERANCIER'
                   --AND UPPER (TRIM (v_catalogus_datum)) = 'CAT DATUM' -- Laat maar!
                   AND UPPER (TRIM (v_srtdeel_nr)) = 'ARTIKELNR'
                   AND UPPER (TRIM (v_srtgroep_omschrijving)) = 'GROEP'
                   AND UPPER (TRIM (v_srtdeel_omschrijving)) = 'OMSCHRIJVING'
                   AND UPPER (TRIM (v_srtdeel_prijs)) = 'PRIJS'
                   AND UPPER (TRIM (v_srtdeel_eenheid)) = 'EENHEID'
                   AND UPPER (TRIM (v_srtdeel_image)) = 'PICTURE'
                   AND UPPER (TRIM (v_srtdeel_veelvoud)) = 'ORDERAANTAL'
                   AND UPPER (TRIM (v_srtdeel_btw)) = 'TAX'
                   AND UPPER (TRIM (v_srtdeel_vervaldatum)) = 'DUEDATE'
                   AND UPPER (TRIM (v_srtdeel_inkprijs)) = 'INKOOPPRIJS'
                   AND UPPER (TRIM (v_srtdeel_minimum)) = 'MINIMUM'
                   AND UPPER (TRIM (v_bes_staffeltabel_naam)) = 'STAFFELTABEL'
                   --AND UPPER (TRIM (v_srtdeel_wijzigdagen)) = 'WIJZIGDAGEN' -- Laat maar!
                   --AND UPPER (TRIM (v_srtdeel_annuleerdagen)) = 'ANNULEERDAGEN' -- Laat maar!
                   AND UPPER (TRIM (v_srtdeel_opmerking)) = 'OPMERKING'
                   AND UPPER (TRIM (v_srtdeel_maximum)) = 'MAXIMUM'
                   AND UPPER (TRIM (v_srtdeel_notitie)) = 'NOTITIE'
                   AND UPPER (TRIM (v_srtdeel_volgnr)) = 'VOLGNUMMER'
                   AND UPPER (TRIM (v_srtdeel_voorraadmin)) = 'MINIMUMVOORRAAD'
                   AND UPPER (TRIM (v_srtdeel_voorraadmax)) = 'MAXIMUMVOORRAAD'
                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 COALESCE (p_discipline_key, ins_discipline_key) = ins_discipline_key -- CONN#20934/Import bedoelt voor catalogus?
                       AND ins_discipline_module = 'BES'
                       AND ins_discipline_verwijder IS NULL;

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

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

                v_errorhint := 'Fout bij controleren importregel';

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

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

                v_srtdeel_nr := TRIM (v_srtdeel_nr);

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

                v_srtgroep_omschrijving := TRIM (v_srtgroep_omschrijving);

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

                v_srtdeel_omschrijving := TRIM (v_srtdeel_omschrijving);

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

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

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

                v_srtdeel_eenheid := TRIM (v_srtdeel_eenheid);

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

                v_srtdeel_image := TRIM (v_srtdeel_image);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

                v_srtdeel_opmerking := TRIM (v_srtdeel_opmerking);

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

                v_srtdeel_notitie := TRIM (v_srtdeel_notitie);

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

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

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

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

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

                -- Minimale voorraad mag niet negatief of meer zijn dan 3 posities lang.
                -- Indien leeg, dan blijft/wordt min voorraad=ongedefinieerd=NULL!
                v_srtdeel_voorraadmin := TRIM (v_srtdeel_voorraadmin);

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

                -- Maximale voorraad mag niet negatief of meer zijn dan 3 posities lang.
                -- Indien leeg, dan blijft/wordt max voorraad=ongedefinieerd=NULL!
                v_srtdeel_voorraadmax := TRIM (v_srtdeel_voorraadmax);

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

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

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

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

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

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

CREATE OR REPLACE PROCEDURE pdkl_update_catalogus (p_import_key IN NUMBER)
AS
    v_errormsg       VARCHAR2 (1000);
    oracle_err_num   NUMBER;
    oracle_err_mes   VARCHAR2 (200);
    v_aanduiding     VARCHAR2 (200);
    v_disc_oms       ins_tab_discipline.ins_discipline_omschrijving%TYPE;
    v_bedr_naam      prs_bedrijf.prs_bedrijf_naam%TYPE;

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

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

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

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

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

        ccount              NUMBER (10);
        l_srtgroep_key      NUMBER (10);
        l_bes_srtdeel_key   bes_srtdeel.bes_srtdeel_key%TYPE;
        l_omschrijving      bes_srtdeel.bes_srtdeel_omschrijving%TYPE;
        l_prijs             bes_srtdeel_prijs.bes_srtdeel_prijs_prijs%TYPE;
        l_inkprijs          bes_srtdeel_prijs.bes_srtdeel_prijs_inkprijs%TYPE;
        l_veelvoud          bes_srtdeel.bes_srtdeel_veelvoud%TYPE;
        l_minimum           bes_srtdeel.bes_srtdeel_minimum%TYPE;
        l_wijzigdagen       bes_srtdeel.bes_srtdeel_wijzigdagen%TYPE;
        l_annuleerdagen     bes_srtdeel.bes_srtdeel_annuleerdagen%TYPE;
        l_opmerking         bes_srtdeel.bes_srtdeel_opmerking%TYPE;
        l_maximum           bes_srtdeel.bes_srtdeel_maximum%TYPE;
        l_notitie           bes_srtdeel.bes_srtdeel_notitie%TYPE;
        l_volgnr            bes_srtdeel.bes_srtdeel_volgnr%TYPE;
        l_voorraadmin       bes_srtdeel.bes_srtdeel_voorraadmin%TYPE;
        l_voorraadmax       bes_srtdeel.bes_srtdeel_voorraadmax%TYPE;
    BEGIN
        -- DELETE SRTDEEL
        ccount := 0;

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

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

            v_errormsg := 'Fout bij verwijderen artikelkenmerken ' || rec.bes_srtdeel_nr;

            UPDATE bes_kenmerk
               SET bes_kenmerk_verwijder = SYSDATE
             WHERE bes_kenmerk_niveau = 'S' AND bes_srtinstallatie_key = rec.bes_srtdeel_key;

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

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

        COMMIT;

        -- DELETE SRTGROEP
        ccount := 0;

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

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

            v_errormsg := 'Fout bij verwijderen groepskenmerken ' || rec.bes_srtgroep_omschrijving;

            UPDATE bes_kenmerk
               SET bes_kenmerk_verwijder = SYSDATE
             WHERE bes_kenmerk_niveau = 'G' AND bes_srtinstallatie_key = rec.bes_srtgroep_key;

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

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

        COMMIT;

        -- INSERT SRTGROEP
        ccount := 0;

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

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

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

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

        COMMIT;

        -- UPDATE SRTDEEL
        ccount := 0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



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

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

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

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

        COMMIT;

        -- INSERT SRTDEEL
        ccount := 0;

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

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

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

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

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

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

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

        COMMIT;
    END;
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 pdkl_imp_catalogus
                 WHERE fac_import_key = p_import_key)
    LOOP
        BEGIN
            -- Puur voor logging toch even catalogus- en bedrijfsnaam bepalen!
            v_aanduiding := '[' || TO_CHAR (rec.ins_discipline_key) || '] ';
            v_errormsg := 'Fout bepalen catalogus';

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

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

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

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

            COMMIT;

            v_aanduiding := '[' || v_disc_oms || '|' || v_bedr_naam || '] ';
            l_update_catalogus (rec.ins_discipline_key, rec.prs_bedrijf_key);
        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 pdkl_update_catalogus;
/

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

SET DEFINE OFF

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

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