--
-- $Id$
--
-- Script containing customer specific configuration sql statements for gvba: Gemeentelijk vervoersbedrijf Amsterdam

DEFINE thisfile = 'GVBA.SQL'
DEFINE dbuser   = '^GVBA'

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 PACKAGE gvba_p_import AS
    -- Hulpfuncties en procedures:
    --
    PROCEDURE   to_log (p_import_key IN NUMBER, p_do_log BOOLEAN, p_message VARCHAR2, p_proces VARCHAR2);

    --
    --
    /* SELECT gvba_p_ps.get_prs_kenmerk_key('P','LAATSTE PS IMPORT') FROM dual; */
    FUNCTION    get_prs_kenmerk_key( p_kenmerk_niveau IN VARCHAR2, p_kenmerk_omschrijving VARCHAR2) RETURN NUMBER;

    --
    --
    /* Opvragen prs_kostenplaats_key. Indien onbekend retourneer dan -1  */
    FUNCTION    get_prs_kostenplaats_key(p_kostenplaats_nr IN VARCHAR2) RETURN NUMBER;
    --
    /*
        BEGIN  gvba_p_import.set_prs_kostenplaats_key('testing'); END;
        SELECT gvba_p_import.get_prs_kostenplaats_key('tesTing') FROM dual;
    */
    /* Aanmaken p_kostenplaats_nr indien onbekend */
    PROCEDURE   set_prs_kostenplaats_key(p_kostenplaats_nr IN VARCHAR2);

    --
    --
    /* Opvragen prs_kostenplaats_key. Indien onbekend retourneer dan -1  */
    FUNCTION    get_prs_perslidkp_key(p_prs_perslid_key IN NUMBER, p_kostenplaats_key IN NUMBER) RETURN NUMBER;
    --
    /*
        BEGIN gvba_p_import.set_prs_perslidkp_key(4,21); END;
        SELECT gvba_p_import.get_prs_perslidkp_key(4,21) FROM dual;
    */
    /* Aanmaken p_kostenplaats_nr indien onbekend */
    PROCEDURE   set_prs_perslidkp_key(p_prs_perslid_key IN NUMBER, p_kostenplaats_key IN NUMBER);

    --
    --
    /* Opvragen functie. Indien onbekend retourneer dan -1  */
    FUNCTION    get_prs_srtperslid_key(p_prs_srtperslid_omschrijving IN VARCHAR2) RETURN NUMBER;
    --
    /*
        BEGIN gvba_p_import.set_prs_srtperslid_key('Onbekend'); END;
        SELECT gvba_p_import.get_prs_srtperslid_key('Onbekend') FROM dual;
    */
    /* Aanmaken p_prs_srtperslid_omschrijving indien onbekend */
    PROCEDURE   set_prs_srtperslid_key(p_prs_srtperslid_omschrijving IN VARCHAR2);

    --
    --
    /* Opvragen functie. Indien onbekend retourneer dan -1  */
    FUNCTION    get_prs_afdeling_key(p_prs_afdeling_naam IN VARCHAR2) RETURN NUMBER;
    --
    --
    /* Opvragen functie. Indien onbekend retourneer dan -1  */
    FUNCTION    get_prs_afdeling_parent_key(p_prs_afdeling_naam IN VARCHAR2) RETURN NUMBER;
    --
    --
    /* Opvragen functie. Indien onbekend retourneer dan -1  */
    FUNCTION    get_prs_afdeling_bedrijf_key(p_prs_afdeling_naam IN VARCHAR2) RETURN NUMBER;
    --
    --
    /* Opvragen functie. Indien onbekend retourneer dan -1  */
    FUNCTION    get_prs_afdeling_max_volgnr(p_prs_afdeling_naam IN VARCHAR2) RETURN NUMBER;

    --
    --
    /* Opvragen functie. Indien onbekend retourneer dan -1  */
    FUNCTION    get_prs_afdeling_key_volgnr(p_prs_afdeling_naam IN VARCHAR2, p_prs_kostenplaats_nr IN VARCHAR2) RETURN NUMBER;
    --
    --
    /* Aanmaken p_prs_srtperslid_omschrijving indien onbekend */
    PROCEDURE   set_prs_afdeling_key_volgnr(p_prs_afdeling_naam IN VARCHAR2, p_prs_kostenplaats_nr IN VARCHAR2);

    --
    --
    /* gvba_p_ps.set_prs_ckenmerk_waarde(10225,11982,'Onbekend'); */
    PROCEDURE   set_prs_ckenmerk_waarde( p_kenmerk_key NUMBER, p_link_key NUMBER, p_kenmerk_waarde VARCHAR2);
    --
    FUNCTION    get_prs_ckenmerk_waarde( p_kenmerk_key NUMBER, p_link_key NUMBER) RETURN VARCHAR2;
    --
    /* gvba_p_ps.set_prs_dkenmerk_waarde(1024,11982,SYSDATE+1); */
    PROCEDURE   set_prs_dkenmerk_waarde( p_kenmerk_key NUMBER, p_link_key NUMBER, p_kenmerk_waarde DATE);
    --
    --
    /* Opvragen functie. Indien onbekend retourneer dan -1  */
    FUNCTION    get_gvba_ruimte_key(p_ruimte IN VARCHAR2, p_locatie IN VARCHAR2) RETURN NUMBER;

    --
    --
    /* gvba_p_ps.set_prs_ckenmerk_waarde(10225,11982,'Onbekend'); */
    PROCEDURE   set_prs_werkplek_key( p_ruimte_key NUMBER, p_werkplek_virtueel NUMBER);
    --
    FUNCTION    get_prs_werkplek_key( p_ruimte_key NUMBER, p_werkplek_virtueel NUMBER) RETURN NUMBER;


END gvba_p_import;
/


CREATE OR REPLACE PACKAGE BODY gvba_p_import AS
    --
    -- to_log
    PROCEDURE to_log (p_import_key IN NUMBER, p_do_log BOOLEAN, p_message VARCHAR2, p_proces VARCHAR2) IS
        v_dummy VARCHAR2(16);
    BEGIN
        IF p_do_log THEN
            fac.imp_writelog (p_import_key,
                              'I',
                              p_message,
                              ''
                             );
            COMMIT; -- to commit logging
        END IF;
    EXCEPTION
       WHEN OTHERS
       THEN v_dummy := 'Dummy opdracht';
    END to_log;
    --
    --
    FUNCTION get_prs_kenmerk_key( p_kenmerk_niveau IN VARCHAR2, p_kenmerk_omschrijving VARCHAR2) RETURN NUMBER
    IS
        -- variabelen
        v_dummy         VARCHAR2(16);
        v_count         NUMBER(10);
        v_kenmerk_key   NUMBER(10);
    BEGIN

        SELECT MAX(k.prs_kenmerk_key), COUNT(*)
        INTO   v_kenmerk_key, v_count
        FROM   PRS_KENMERK k
        WHERE  trim(k.prs_kenmerk_upper) = UPPER(trim(p_kenmerk_omschrijving))
        AND    k.prs_kenmerk_niveau = p_kenmerk_niveau
        AND    k.prs_kenmerk_verwijder IS NULL;

        IF (v_count <> 1) THEN

            v_kenmerk_key := -1;

        END IF;

        RETURN v_kenmerk_key;

    EXCEPTION
       WHEN OTHERS
       THEN RETURN -1;

    END get_prs_kenmerk_key;
    --
    --
    FUNCTION get_prs_kostenplaats_key(p_kostenplaats_nr IN VARCHAR2) RETURN NUMBER
    IS
        -- variabelen
        v_dummy         VARCHAR2(16);
        v_count         NUMBER(10);
        v_kostenplaats_key   NUMBER(10);
    BEGIN

        SELECT NVL(MAX(prs_kostenplaats_key),-1), COUNT(*)
        INTO   v_kostenplaats_key, v_count
        FROM   prs_kostenplaats
        WHERE  prs_kostenplaats_verwijder is null
        AND    prs_kostenplaats_upper = upper(substr(p_kostenplaats_nr,1,30));

        RETURN v_kostenplaats_key;

    EXCEPTION
       WHEN OTHERS
       THEN RETURN -1;

    END get_prs_kostenplaats_key;
    --
    --
    PROCEDURE set_prs_kostenplaats_key(p_kostenplaats_nr IN VARCHAR2)
    IS
        -- variabelen
        v_dummy         VARCHAR2(16);
        v_count         NUMBER(10);
        v_kostenplaats_key   NUMBER(10);
    BEGIN

        v_kostenplaats_key := get_prs_kostenplaats_key(p_kostenplaats_nr);

        IF (v_kostenplaats_key = -1) THEN

            SELECT prs_s_prs_kostenplaats_key.NEXTVAL INTO v_kostenplaats_key FROM DUAL;

            INSERT INTO PRS_KOSTENPLAATS
            (prs_kostenplaats_key
            ,prs_kostenplaats_nr
            ,prs_kostenplaats_omschrijving
            ,prs_kostenplaats_module
            )
            VALUES
            (v_kostenplaats_key
            ,SUBSTR(p_kostenplaats_nr,1,30)
            ,''
            ,'PRS'
            );

            COMMIT;

        END IF;

    EXCEPTION
       WHEN OTHERS
       THEN v_kostenplaats_key := -1;
    END set_prs_kostenplaats_key;
    --
    --
    FUNCTION get_prs_perslidkp_key(p_prs_perslid_key IN NUMBER, p_kostenplaats_key IN NUMBER) RETURN NUMBER
    IS
        -- variabelen
        v_dummy         VARCHAR2(16);
        v_count         NUMBER(10);
        v_perslidkostenplaats_key   NUMBER(10);
    BEGIN

        SELECT NVL(MAX(prs_perslidkostenplaats_key),-1), COUNT(*)
        INTO   v_perslidkostenplaats_key, v_count
        FROM   prs_perslidkostenplaats
        WHERE  prs_perslid_key = p_prs_perslid_key
        AND    prs_kostenplaats_key = p_kostenplaats_key;

        RETURN v_perslidkostenplaats_key;

    EXCEPTION
       WHEN OTHERS
       THEN RETURN -1;

    END get_prs_perslidkp_key;
    --
    --
    PROCEDURE set_prs_perslidkp_key(p_prs_perslid_key IN NUMBER, p_kostenplaats_key IN NUMBER)
    IS
        -- variabelen
        v_dummy         VARCHAR2(16);
        v_count         NUMBER(10);
        v_perslidkostenplaats_key   NUMBER(10);
    BEGIN

        v_perslidkostenplaats_key := get_prs_perslidkp_key(p_kostenplaats_key,p_prs_perslid_key);

        IF (v_perslidkostenplaats_key = -1) THEN

            -- 1 kostenplaatscombinatie
            DELETE FROM PRS_PERSLIDKOSTENPLAATS
            WHERE prs_perslid_key = p_prs_perslid_key;

            SELECT prs_s_prs_perslidkp_key.nextval INTO v_perslidkostenplaats_key FROM DUAL;

            INSERT INTO PRS_PERSLIDKOSTENPLAATS
            (prs_perslid_key
            ,prs_kostenplaats_key
            ,prs_perslidkostenplaats_boeken
            ,prs_perslidkostenplaats_inzage)
            VALUES
            (p_prs_perslid_key
            ,p_kostenplaats_key
            ,1
            ,1
            );

            COMMIT;

        END IF;

    EXCEPTION
       WHEN OTHERS
       THEN v_perslidkostenplaats_key := -1;
    END set_prs_perslidkp_key;
    --
    --
    FUNCTION get_prs_srtperslid_key(p_prs_srtperslid_omschrijving IN VARCHAR2) RETURN NUMBER
    IS
        -- variabelen
        v_dummy           VARCHAR2(16);
        v_count           NUMBER(10);
        v_srtperslid_key  NUMBER(10);
    BEGIN

        SELECT NVL(MAX(prs_srtperslid_key),-1), COUNT(*)
        INTO   v_srtperslid_key, v_count
        FROM   prs_srtperslid
        WHERE  prs_srtperslid_verwijder IS NULL
        AND    prs_srtperslid_upper = upper(p_prs_srtperslid_omschrijving);

        RETURN v_srtperslid_key;

    EXCEPTION
       WHEN OTHERS
       THEN RETURN -1;

    END get_prs_srtperslid_key;
    --
    --
    PROCEDURE set_prs_srtperslid_key(p_prs_srtperslid_omschrijving IN VARCHAR2)
    IS
        -- variabelen
        v_dummy         VARCHAR2(16);
        v_count         NUMBER(10);
        v_srtperslid_key   NUMBER(10);
    BEGIN

        v_srtperslid_key := get_prs_srtperslid_key(p_prs_srtperslid_omschrijving);

        IF (v_srtperslid_key = -1) THEN

            SELECT prs_s_prs_alluitvoerende_keys.nextval INTO v_srtperslid_key FROM DUAL;

            INSERT INTO PRS_SRTPERSLID
            (prs_srtperslid_omschrijving
            )
             VALUES
            (p_prs_srtperslid_omschrijving
            );

            COMMIT;

        END IF;

    EXCEPTION
       WHEN OTHERS
       THEN v_srtperslid_key := -1;
    END set_prs_srtperslid_key;
    --
    --
    FUNCTION get_prs_afdeling_key(p_prs_afdeling_naam IN VARCHAR2) RETURN NUMBER
    IS
        -- variabelen
        v_dummy           VARCHAR2(16);
        v_count           NUMBER(10);
        v_afdeling_key  NUMBER(10);
    BEGIN

        SELECT NVL(MAX(prs_afdeling_key),-1), COUNT(*)
        INTO   v_afdeling_key, v_count
        FROM   prs_afdeling
        WHERE  prs_afdeling_verwijder IS NULL
        AND    prs_afdeling_upper = upper(p_prs_afdeling_naam);

        RETURN v_afdeling_key;

    EXCEPTION
       WHEN OTHERS
       THEN RETURN -1;

    END get_prs_afdeling_key;
    --
    --
    FUNCTION get_prs_afdeling_parent_key(p_prs_afdeling_naam IN VARCHAR2) RETURN NUMBER
    IS
        -- variabelen
        v_dummy           VARCHAR2(16);
        v_count           NUMBER(10);
        v_afdeling_key  NUMBER(10);
    BEGIN

        SELECT NVL(MAX(prs_afdeling_parentkey),-1), COUNT(*)
        INTO   v_afdeling_key, v_count
        FROM   prs_afdeling
        WHERE  prs_afdeling_verwijder IS NULL
        AND    prs_afdeling_upper = upper(p_prs_afdeling_naam);

        IF (v_count = 0) THEN
          SELECT prs_afdeling_parentkey
          INTO   v_afdeling_key
          FROM   prs_afdeling
          WHERE  prs_afdeling_verwijder IS NULL
          AND    SUBSTR(prs_afdeling_upper,1,5) = upper(SUBSTR(p_prs_afdeling_naam,1,5));
        END IF;

        RETURN v_afdeling_key;

    EXCEPTION
       WHEN OTHERS
       THEN RETURN -1;

    END get_prs_afdeling_parent_key;
    --
    --
    FUNCTION get_prs_afdeling_bedrijf_key(p_prs_afdeling_naam IN VARCHAR2) RETURN NUMBER
    IS
        -- variabelen
        v_dummy           VARCHAR2(16);
        v_count           NUMBER(10);
        v_bedrijf_key  NUMBER(10);
    BEGIN

        SELECT NVL(MAX(prs_bedrijf_key),NULL), COUNT(*)
        INTO   v_bedrijf_key, v_count
        FROM   prs_afdeling
        WHERE  prs_afdeling_verwijder IS NULL
        AND    prs_afdeling_upper = upper(p_prs_afdeling_naam);

        RETURN v_bedrijf_key;

    EXCEPTION
       WHEN OTHERS
       THEN RETURN -1;

    END get_prs_afdeling_bedrijf_key;
    --
    --
    FUNCTION get_prs_afdeling_key_volgnr(p_prs_afdeling_naam IN VARCHAR2, p_prs_kostenplaats_nr IN VARCHAR2) RETURN NUMBER
    IS
        -- variabelen
        v_dummy           VARCHAR2(16);
        v_count           NUMBER(10);
        v_afdeling_key  NUMBER(10);
    BEGIN

        SELECT NVL(MAX(a.prs_afdeling_key),-1), COUNT(*)
        INTO   v_afdeling_key, v_count
        FROM   prs_afdeling a, prs_kostenplaats k
        WHERE  a.prs_afdeling_verwijder IS NULL
        AND    SUBSTR(a.prs_afdeling_upper, 1, INSTR(a.prs_afdeling_upper, '/')-1) = upper(p_prs_afdeling_naam)
        AND    INSTR(a.prs_afdeling_upper, '/') > 0
        AND    a.prs_kostenplaats_key = k.prs_kostenplaats_key
        AND    k.prs_kostenplaats_upper = upper(p_prs_kostenplaats_nr);

        RETURN v_afdeling_key;

    EXCEPTION
       WHEN OTHERS
       THEN RETURN -1;

    END get_prs_afdeling_key_volgnr;
    --
    --
    FUNCTION get_prs_afdeling_max_volgnr(p_prs_afdeling_naam IN VARCHAR2) RETURN NUMBER
    IS
        -- variabelen
        v_dummy           VARCHAR2(16);
        v_count           NUMBER(10);
        v_volgnr          NUMBER(4);
    BEGIN

        -- Bepaal het laagst beschikbare volgnummer.
        SELECT max(COALESCE(Fac.safe_to_number(SUBSTR(a.prs_afdeling_upper, INSTR(a.prs_afdeling_upper, '/')+1, 4))
                           ,1
                           )
                  )
        INTO   v_volgnr
        FROM   prs_afdeling a
        WHERE  a.prs_afdeling_verwijder IS NULL
        AND    SUBSTR(a.prs_afdeling_upper, 1, INSTR(a.prs_afdeling_upper, '/')-1) = upper(p_prs_afdeling_naam)
        AND    INSTR(a.prs_afdeling_upper, '/') > 0;

        RETURN NVL(v_volgnr,0);

    EXCEPTION
       WHEN OTHERS
       THEN RETURN 0; -- Bestaat nog niet dus

    END get_prs_afdeling_max_volgnr;
    --
    --
    PROCEDURE set_prs_afdeling_key_volgnr(p_prs_afdeling_naam IN VARCHAR2, p_prs_kostenplaats_nr IN VARCHAR2)
    IS
        -- variabelen
        v_dummy               VARCHAR2(16);
        v_count               NUMBER(10);
        v_afdeling_key        NUMBER(10);
        v_afdeling_parentkey  NUMBER(10);
        v_bedrijf_key         NUMBER(10);
        v_kostenplaats_key    NUMBER(10);
        v_volgnr              NUMBER(1);
        v_afdeling_naam       VARCHAR(10);
        v_afdeling_omschrijving VARCHAR(60);

    BEGIN

        v_afdeling_key := get_prs_afdeling_key_volgnr(p_prs_afdeling_naam, p_prs_kostenplaats_nr);

        IF (v_afdeling_key = -1) THEN
            -- Kijk of de combinatie afdeling/kostenplaats al bestaat
            -- SELECT get_prs_afdeling_key_volgnr(p_prs_afdeling_naam,p_prs_kostenplaats_nr) into v_afdeling_key from dual;
            IF (v_afdeling_key = -1) THEN

              -- Aanmaken kostenplaats indien deze nog niet zou bestaan
              set_prs_kostenplaats_key(p_prs_kostenplaats_nr);
              SELECT get_prs_kostenplaats_key(p_prs_kostenplaats_nr) into v_kostenplaats_key from dual;
              -- Wat is de parent van de gelijknamige afdeling, dwz de afdeling zonder volgnummer? Alleen aan
              -- afdelingen met volgnummer worden mensen gekoppeld. Afdelingen met volgnummer zijn geen parent
              -- van een afdeling.
              SELECT get_prs_afdeling_parent_key(p_prs_afdeling_naam)  into v_afdeling_parentkey from dual;
              SELECT get_prs_afdeling_bedrijf_key(p_prs_afdeling_naam) into v_bedrijf_key from dual;
              SELECT get_prs_afdeling_max_volgnr(p_prs_afdeling_naam) into v_volgnr from dual;
              SELECT prs_s_prs_afdeling_key.nextval INTO v_afdeling_key FROM DUAL;
              v_afdeling_naam := p_prs_afdeling_naam || '/' || TO_CHAR(v_volgnr+1);

              SELECT NVL(PRS_AFDELING_OMSCHRIJVING, v_afdeling_naam)
                INTO v_afdeling_omschrijving
                FROM PRS_AFDELING
               WHERE prs_afdeling_verwijder is null
                 AND prs_afdeling_naam = p_prs_afdeling_naam;

              -- Aanname: length(p_prs_afdeling_naam||'/'||volgnr) <= 10. Huidige afdelingen hebben
              --          max(length(p_prs_afdeling_naam) = 8
              INSERT INTO PRS_AFDELING
              (prs_afdeling_naam
              ,prs_afdeling_parentkey
              ,prs_afdeling_omschrijving
              ,prs_bedrijf_key
              ,prs_kostenplaats_key
              )
              VALUES
              (v_afdeling_naam
              ,DECODE(v_afdeling_parentkey,-1,NULL,v_afdeling_parentkey)
              ,v_afdeling_omschrijving
              ,DECODE(v_bedrijf_key,-1,NULL,v_bedrijf_key)
              ,v_kostenplaats_key
              );

              COMMIT;

            END IF;

        END IF;

    EXCEPTION
      WHEN OTHERS
      THEN v_afdeling_key := -1;
    END set_prs_afdeling_key_volgnr;
    --
    --
    FUNCTION get_prs_ckenmerk_waarde( p_kenmerk_key NUMBER, p_link_key NUMBER) RETURN VARCHAR2
    IS
        -- variabelen
        v_dummy         VARCHAR2(16);
        v_count         NUMBER(10);
        v_waarde        VARCHAR2(128);
        v_gebouw_key    NUMBER(10);
    BEGIN

        SELECT MAX(kl.prs_kenmerklink_waarde), COUNT(*)
        INTO   v_waarde, v_count
        FROM   PRS_KENMERKLINK kl
        WHERE  0=0
        AND    kl.prs_link_key = p_link_key
        AND    kl.prs_kenmerk_key = p_kenmerk_key
        AND    kl.prs_kenmerklink_verwijder IS NULL;

        IF (v_count <> 1) THEN

            v_waarde := '';

        END IF;

        RETURN v_waarde;

    EXCEPTION
       WHEN OTHERS
       THEN RETURN '';

    END get_prs_ckenmerk_waarde;
    --
    --
    PROCEDURE set_prs_ckenmerk_waarde( p_kenmerk_key NUMBER, p_link_key NUMBER, p_kenmerk_waarde VARCHAR2)
    IS
        -- variabelen
        v_dummy           VARCHAR2(16);
        v_count           NUMBER(10);
        v_locatie_key     NUMBER(10);
        v_gebouw_key      NUMBER(10);
        v_kenmerk_waarde  VARCHAR(1024);
        v_kenmerk_niveau  VARCHAR2(1);
    BEGIN

        v_kenmerk_waarde := NVL(get_prs_ckenmerk_waarde(p_kenmerk_key,p_link_key),'Er is nog geen waarde .....');

        IF v_kenmerk_waarde <> p_kenmerk_waarde THEN

          -- Waarde voor flexprop is gewijzigd

          DELETE
          FROM    PRS_KENMERKLINK
          WHERE   prs_kenmerk_key = p_kenmerk_key
          AND     prs_link_key    = p_link_key;

          IF p_kenmerk_waarde IS NOT NULL THEN

            BEGIN
 			  SELECT prs_kenmerk_niveau
			    INTO v_kenmerk_niveau
			    FROM PRS_KENMERK
			   WHERE prs_kenmerk_key = p_kenmerk_key;
			EXCEPTION WHEN NO_DATA_FOUND THEN
			  v_kenmerk_niveau := NULL;
			END;

              INSERT INTO PRS_KENMERKLINK
              (PRS_LINK_KEY
              ,PRS_KENMERKLINK_NIVEAU
              ,PRS_KENMERK_KEY
              ,PRS_KENMERKLINK_WAARDE
              ) VALUES
              (p_link_key
              ,v_kenmerk_niveau
              ,p_kenmerk_key
              ,p_kenmerk_waarde
              );

          END IF;

          COMMIT;

        END IF;

    EXCEPTION
       WHEN OTHERS
       THEN v_dummy := 'Dummy opdracht';

    END set_prs_ckenmerk_waarde;
    --
    --
    PROCEDURE   set_prs_dkenmerk_waarde( p_kenmerk_key NUMBER, p_link_key NUMBER, p_kenmerk_waarde DATE)
    IS
        -- variabelen
        v_dummy         VARCHAR2(16);
        v_count         NUMBER(10);
        v_locatie_key   NUMBER(10);
        v_gebouw_key    NUMBER(10);
        v_date          VARCHAR2(10);
        v_kenmerk_niveau VARCHAR2(1);
    BEGIN

        DELETE
        FROM    PRS_KENMERKLINK
        WHERE   prs_kenmerk_key = p_kenmerk_key
        AND     prs_link_key    = p_link_key;

        IF p_kenmerk_waarde IS NOT NULL THEN

            v_date := TO_CHAR(p_kenmerk_waarde,'DD-MM-YYYY');
            BEGIN
 			  SELECT prs_kenmerk_niveau
			    INTO v_kenmerk_niveau
			    FROM PRS_KENMERK
			   WHERE prs_kenmerk_key = p_kenmerk_key;
			EXCEPTION WHEN NO_DATA_FOUND THEN
			  v_kenmerk_niveau := NULL;
			END;

            INSERT INTO PRS_KENMERKLINK
            (PRS_LINK_KEY
            ,PRS_KENMERKLINK_NIVEAU
            ,PRS_KENMERK_KEY
            ,PRS_KENMERKLINK_WAARDE
            ) VALUES
            (p_link_key
            ,v_kenmerk_niveau
            ,p_kenmerk_key
            ,v_date
            );

        END IF;

        COMMIT;

    EXCEPTION
       WHEN OTHERS
       THEN v_dummy := 'Dummy opdracht';

    END set_prs_dkenmerk_waarde;
    --
    --
    FUNCTION get_gvba_ruimte_key(p_ruimte IN VARCHAR2, p_locatie IN VARCHAR2) RETURN NUMBER
    -- RETURN = -1 --> geen fout opgetreden, ruimte hoeft niet opgezocht te worden
    -- RETURN = 0 --> geen fout opgetreden, ruimte hoeft niet opgezocht te worden
    -- RETURN > 0 --> bestaande alg_ruimte_key
    IS
        -- variabelen
        v_dummy           VARCHAR2(16);
        v_count           NUMBER(10);
        v_ruimte_key      NUMBER(10);
    BEGIN

        v_ruimte_key := 0;

        IF trim(upper(p_locatie)) = 'ARLANDAWE' THEN

          SELECT NVL (MAX (r.alg_ruimte_key), -1), COUNT (*)
          INTO   v_ruimte_key, v_count
          FROM (SELECT  v.alg_verdieping_volgnr, r.alg_ruimte_key, r.alg_ruimte_nr
                FROM    ALG_RUIMTE r, ALG_VERDIEPING v
                WHERE   r.alg_ruimte_verwijder IS NULL
                AND     r.alg_verdieping_key = v.alg_verdieping_key
                AND     v.alg_gebouw_key = 7) r
           WHERE 1 = 1
             AND INSTR (TRIM(UPPER (p_ruimte)),
                        TRIM(UPPER (r.alg_verdieping_volgnr || '.' || r.alg_ruimte_nr)),
                        1
                       ) > 0;

          IF v_count <> 1 THEN
            v_ruimte_key := -1;
          END IF;

        END IF;

        /*
        IF trim(upper(p_locatie)) = 'x' THEN

          ... ruimte-vertaling voor anddere locaties ...

        END IF;
        */

        RETURN v_ruimte_key;

    EXCEPTION
       WHEN OTHERS
       THEN RETURN -1;

    END get_gvba_ruimte_key;
    --
    --

    --
    --
    FUNCTION get_prs_werkplek_key( p_ruimte_key NUMBER, p_werkplek_virtueel NUMBER) RETURN NUMBER
    IS
        -- variabelen
        v_count           NUMBER(10);
        v_werkplek_key    NUMBER(10);
    BEGIN

        SELECT MIN(prs_werkplek_key), COUNT(*)
        INTO   v_werkplek_key, v_count
        FROM   prs_werkplek
        WHERE  prs_alg_ruimte_key = p_ruimte_key
        AND    prs_werkplek_module = 'IMP'
        AND    prs_werkplek_virtueel = p_werkplek_virtueel;

        IF (v_count <= 0) THEN

            v_werkplek_key := -1;

        END IF;

        RETURN v_werkplek_key;
    EXCEPTION
       WHEN OTHERS
       THEN RETURN -1;

    END get_prs_werkplek_key;
    --
    --
    PROCEDURE set_prs_werkplek_key( p_ruimte_key NUMBER, p_werkplek_virtueel NUMBER)
    IS
        -- variabelen
        v_dummy             VARCHAR2(1024);
        v_count             NUMBER(10);
        v_werkplek_key      NUMBER(10);
        v_werkplek_volgnr   NUMBER(3);
        v_ruimte_nr         VARCHAR2(10);
    BEGIN

        v_werkplek_key := get_prs_werkplek_key(p_ruimte_key, p_werkplek_virtueel);

        IF v_werkplek_key = -1 THEN

          SELECT NVL(MAX(prs_werkplek_volgnr),0)+1, COUNT(*)
          INTO   v_werkplek_volgnr, v_count
          FROM   PRS_WERKPLEK
          WHERE  prs_alg_ruimte_key = p_ruimte_key;

          SELECT alg_ruimte_nr
          INTO   v_ruimte_nr
          FROM   alg_ruimte
          WHERE  alg_ruimte_verwijder IS NULL
          AND    alg_ruimte_key = p_ruimte_key;

          insert into PRS_WERKPLEK
          (PRS_WERKPLEK_MODULE
          ,PRS_WERKPLEK_VOLGNR
          ,PRS_WERKPLEK_OMSCHRIJVING
          ,PRS_ALG_RUIMTE_KEY
          ,PRS_WERKPLEK_VIRTUEEL
          )
           values
          ('IMP'
          ,v_werkplek_volgnr
          ,v_ruimte_nr||'/'||to_char(v_werkplek_volgnr)
          ,p_ruimte_key
          ,p_werkplek_virtueel
          );

          COMMIT;

        END IF;

    EXCEPTION
       WHEN OTHERS
       THEN v_dummy := 'Dummy opdracht';

    END set_prs_werkplek_key;
    --
    --
    --
    --
END gvba_p_import;
/



CREATE OR REPLACE VIEW gvba_v_imp_organisatie
AS
   SELECT orgb.nivo, org.code prs_afdeling_naam,
          omschrijving prs_afdeling_omschrijving,
          pcode prs_afdeling_naam_parent,
          DECODE((select count(*) from prs_afdeling af where af.prs_afdeling_verwijder is null and af.prs_afdeling_upper = upper(org.code)),0,'ADD','MOD') Aktie
     FROM gvba_imp_organisatie org,
          (SELECT 5 nivo, code prs_afdeling_naam
             FROM gvba_imp_organisatie
            WHERE ppppcode IS NOT NULL
           UNION ALL
           SELECT 4 nivos, code prs_afdeling_naam
             FROM gvba_imp_organisatie
            WHERE pppcode IS NOT NULL AND ppppcode IS NULL
           UNION ALL
           SELECT 3 nivos, code prs_afdeling_naam
             FROM gvba_imp_organisatie
            WHERE ppcode IS NOT NULL AND pppcode IS NULL
           UNION ALL
           SELECT 2 nivos, code prs_afdeling_naam
             FROM gvba_imp_organisatie
            WHERE pcode IS NOT NULL AND ppcode IS NULL
           UNION ALL
           SELECT 1 nivos, code prs_afdeling_naam
             FROM gvba_imp_organisatie
            WHERE pcode IS NULL) orgb
    WHERE org.code = orgb.prs_afdeling_naam
    AND   org.pppppcode IS NULL -- afdelingsnivo 6 wordt niet ondersteund
    AND   org.code = orgb.prs_afdeling_naam
    AND   NOT EXISTS (SELECT 'Dubbele afdelingen in importbestand uitsluiten'
                      FROM GVBA_IMP_ORGANISATIE org2
                      WHERE org2.code = org.code
                      GROUP BY code
                      HAVING COUNT(*) > 1
                      )
  UNION ALL
SELECT niveau nivo, prs_afdeling_naam, prs_afdeling_omschrijving, '', 'DEL'
  FROM GVBA_IMP_ORGANISATIE org, prs_v_afdeling af
 WHERE af.prs_afdeling_verwijder IS NULL
   AND UPPER (org.code(+)) = af.prs_afdeling_upper
/



CREATE OR REPLACE PROCEDURE gvba_import_organisatie (
   p_import_key IN NUMBER
)
AS

  CURSOR c1 IS
      SELECT *
        FROM fac_imp_file
       WHERE fac_import_key = p_import_key;

    rec1 c1%ROWTYPE;

   v_newline          fac_imp_file.fac_imp_file_line%TYPE;   -- Import line
   v_fielddelimitor            VARCHAR2 (1);      -- Field seperator
   v_errormsg                  VARCHAR (200);
   oracle_err_num              NUMBER;
   oracle_err_mes              VARCHAR2 (200);
   v_errmes                    VARCHAR(1024);

   -- De importvelden
   v_code                      VARCHAR2(100);
   v_omschrijving              VARCHAR2(100);
   v_pcode                     VARCHAR2(100);
   v_ppcode                    VARCHAR2(100);
   v_pppcode                   VARCHAR2(100);
   v_ppppcode                  VARCHAR2(100);
   v_pppppcode                 VARCHAR2(100);

   -- Overig
   header_is_valid             BOOLEAN;
   v_controle_res              VARCHAR2 (30);
   v_teller                    INTEGER;
BEGIN
    v_fielddelimitor := ';';
    header_is_valid := TRUE;  -- No header present

    DELETE FROM gvba_imp_organisatie;

    commit;

    BEGIN
      v_teller := 0;
      OPEN c1;
      IF c1%ISOPEN THEN

        v_teller := 1;

        LOOP
          BEGIN
            v_errmes := 'Fout FETCH te importeren rij';
            FETCH c1 INTO rec1;
            EXIT WHEN c1%NOTFOUND;

            v_errmes := 'Fout opvragen te importeren rij';

            v_newline := rec1.fac_imp_file_line;
            fac.imp_getfield (v_newline, v_fielddelimitor, v_code);
            fac.imp_getfield (v_newline, v_fielddelimitor, v_omschrijving);
            fac.imp_getfield (v_newline, v_fielddelimitor, v_pcode);
            fac.imp_getfield (v_newline, v_fielddelimitor, v_ppcode);
            fac.imp_getfield (v_newline, v_fielddelimitor, v_pppcode);
            fac.imp_getfield (v_newline, v_fielddelimitor, v_ppppcode);
            fac.imp_getfield (v_newline, v_fielddelimitor, v_pppppcode);

            v_errmes := 'Fout bij schrijven te importeren rij in Facilitor database';

            INSERT INTO gvba_imp_organisatie
                        (code
                        ,omschrijving
                        ,pcode
                        ,ppcode
                        ,pppcode
                        ,ppppcode
                        ,pppppcode
                        )
                 VALUES (SUBSTR (v_code, 1, 10),
                         SUBSTR (v_omschrijving, 1, 60),
                         SUBSTR (v_pcode, 1, 10),
                         SUBSTR (v_ppcode, 1, 10),
                         SUBSTR (v_pppcode, 1, 10),
                         SUBSTR (v_ppppcode, 1, 10),
                         SUBSTR (v_pppppcode, 1, 10)
                        );

            v_teller := v_teller + 1;
            COMMIT; --  alles is goed gegaan

            EXCEPTION WHEN OTHERS THEN
              ROLLBACK;

              oracle_err_num := SQLCODE;
              oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
              fac.imp_writelog (p_import_key,
                                'E',
                                v_errmes,
                                'Oracle foutmelding (' || oracle_err_num || '/' || oracle_err_mes || ')'
                               );

              COMMIT; -- Logging opslaan

          END;
        END LOOP;

      END IF;
      CLOSE c1;
      COMMIT;
    END;

END;
/

CREATE OR REPLACE PROCEDURE gvba_update_organisatie (
   p_import_key IN NUMBER
)
AS

  -- Constanten
  c_bedrijf_naam VARCHAR(30) := 'GVBA';

  CURSOR c1 IS
    SELECT *
    FROM   gvba_v_imp_organisatie
    WHERE  aktie = 'ADD'
    ORDER  BY nivo;

    rec1 c1%ROWTYPE;

  CURSOR c2 IS
    SELECT *
    FROM   gvba_v_imp_organisatie
    WHERE  aktie = 'MOD'
    ORDER  BY nivo DESC;

    rec2 c2%ROWTYPE;

    --
    afdeling_parent_key   NUMBER(10);
    v_bedrijf_key         NUMBER(10);
    v_teller              INTEGER;
    v_afdeling_key        NUMBER(10);
    oracle_err_num        NUMBER;
    oracle_err_mes        VARCHAR2 (200);
    v_errmes              VARCHAR(1024);


BEGIN

  v_errmes := 'Afdelingen toevoegen';
  -- Afdelingen toevoegen
  BEGIN
    v_teller := 0;
    OPEN c1;
    IF c1%ISOPEN THEN

      v_teller := 1;

      LOOP
        BEGIN
          v_errmes := 'Fout bij lezen nieuw toe te voegen afdeling';
          FETCH c1 INTO rec1;
          EXIT WHEN c1%NOTFOUND;

          v_bedrijf_key := TO_NUMBER(NULL);
          afdeling_parent_key := TO_NUMBER(NULL);

          IF (rec1.PRS_AFDELING_NAAM_PARENT IS NULL)
          THEN

            afdeling_parent_key := TO_NUMBER(NULL);

            v_errmes := 'Fout bij bepalen bedrijf';
            select prs_bedrijf_key
            into   v_bedrijf_key
            from   prs_bedrijf
            where  prs_bedrijf_verwijder is null
            and    prs_bedrijf_naam = c_bedrijf_naam;

          ELSE

            v_errmes := 'Fout bij bepalen afdeling';
            SELECT prs_afdeling_key
            INTO   afdeling_parent_key
            FROM   prs_afdeling
            WHERE  prs_afdeling_naam = UPPER(trim(rec1.prs_afdeling_naam_parent))
            AND    prs_afdeling_verwijder is null;

            v_bedrijf_key := TO_NUMBER(NULL);

          END IF;

          v_errmes := 'Fout bij toevoegen afdeling';

          INSERT INTO PRS_AFDELING
          (prs_afdeling_naam
          ,prs_afdeling_parentkey
          ,prs_afdeling_omschrijving
          ,prs_bedrijf_key
          )
          VALUES
          (rec1.prs_afdeling_naam
          ,afdeling_parent_key
          ,rec1.prs_afdeling_omschrijving
          ,v_bedrijf_key
          );

          v_teller := v_teller + 1;
          COMMIT; --  alles is goed gegaan

          EXCEPTION WHEN OTHERS THEN
            ROLLBACK;

            oracle_err_num := SQLCODE;
            oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
            fac.imp_writelog (p_import_key,
                              'E',
                              'Afdelingen toevoegen: ' || v_errmes,
                              'Oracle foutmelding (' || oracle_err_num || '/' || oracle_err_mes || ')'
                             );

            COMMIT; -- Logging opslaan

        END;
      END LOOP;

    END IF;
    CLOSE c1;
    COMMIT;
  END;

  v_errmes := 'Afdelingen wijzigen';
  -- Afdelingen wijzigen
  BEGIN
    v_teller := 0;
    OPEN c2;
    IF c2%ISOPEN THEN

      v_teller := 1;

      LOOP
        BEGIN
          v_errmes := 'Fout FETCH te importeren rij';
          FETCH c2 INTO rec2;
          EXIT WHEN c2%NOTFOUND;

          v_bedrijf_key := TO_NUMBER(NULL);
          afdeling_parent_key := TO_NUMBER(NULL);

          IF (rec2.PRS_AFDELING_NAAM_PARENT IS NULL)
          THEN

            afdeling_parent_key := TO_NUMBER(NULL);

            v_errmes := 'Fout bij bepalen bedrijf';
            select prs_bedrijf_key
            into   v_bedrijf_key
            from   prs_bedrijf
            where  prs_bedrijf_verwijder is null
            and    prs_bedrijf_naam = c_bedrijf_naam;

          ELSE

            v_errmes := 'Fout bij bepalen parent afdeling';
            SELECT prs_afdeling_key
            INTO   afdeling_parent_key
            FROM   prs_afdeling
            WHERE  prs_afdeling_naam = UPPER(trim(rec2.prs_afdeling_naam_parent))
            AND    prs_afdeling_verwijder is null;

            v_bedrijf_key := TO_NUMBER(NULL);

          END IF;

          v_errmes := 'Fout bij update afdeling met afdelingnaam <' || rec2.prs_afdeling_naam || '>';
          UPDATE PRS_AFDELING
          SET    prs_afdeling_omschrijving = rec2.prs_afdeling_omschrijving,
                 prs_afdeling_parentkey = afdeling_parent_key
          WHERE  ( prs_afdeling_naam = UPPER(trim(rec2.prs_afdeling_naam))
                   OR (      SUBSTR(prs_afdeling_upper, 1, INSTR(prs_afdeling_upper, '/')-1) = upper(trim(rec2.prs_afdeling_naam))
                      AND    INSTR(prs_afdeling_upper, '/') > 0
                      )
                 )
            AND  prs_afdeling_verwijder is null;

          v_teller := v_teller + 1;
          COMMIT; --  alles is goed gegaan

          EXCEPTION WHEN OTHERS THEN
            ROLLBACK;

            oracle_err_num := SQLCODE;
            oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
            fac.imp_writelog (p_import_key,
                              'E',
                              v_errmes,
                              'Oracle foutmelding (' || oracle_err_num || '/' || oracle_err_mes || ')'
                             );

            COMMIT; -- Logging opslaan

        END;
      END LOOP;

    END IF;
    CLOSE c2;
    COMMIT;
  END;

  -- Zet default kostenplaats_key
  update prs_afdeling
  set    prs_kostenplaats_key = (select prs_kostenplaats_key from prs_kostenplaats where prs_kostenplaats_nr ='00000')
  where  prs_kostenplaats_key IS NULL;

  commit;

END;
/


CREATE OR REPLACE VIEW gvba_v_imp_persoon
AS
SELECT
   DECODE(p.prs_perslid_key,NULL,'ADD','MOD') AKTIE
,   p.prs_perslid_key
,  SUBSTR(gp.personeelsnummer,1,10)    PRS_PERSLID_NR
,  SUBSTR(gp.achternaam,1,30)          PRS_PERSLID_NAAM
,  SUBSTR(gp.voornaam,1,30)            PRS_PERSLID_VOORNAAM
,  SUBSTR(gp.tussenvoegsels,1,15)      PRS_PERSLID_TUSSENVOEGSEL
,  SUBSTR(gp.voorletters,1,10)         PRS_PERSLID_VOORLETTERS
,  SUBSTR(gp.telefoon,1,15)            PRS_PERSLID_TELEFOONNR
,  SUBSTR(gp.mobiel,1,15)              PRS_PERSLID_MOBIEL
,  SUBSTR(gp.grip,1,15)                flex_grip
,  SUBSTR(gp.login,1,30)               PRS_PERSLID_OSLOGIN
,  SUBSTR(gp.email,1,200)              PRS_PERSLID_EMAIL
,  NVL(SUBSTR(gp.functie,1,30),'Onbekend')               PRS_SRTPERSLID_OMSCHRIJVING
,  NVL(SUBSTR(trim(gp.organisatiecode),1,10),'Onbekend') PRS_AFDELING_NAAM
,  SUBSTR(gp.kostenplaats,1,30)                          PRS_KOSTENPLAATS_NR
,  fac.safe_to_date(gp.datum_indienst,'YYYYMMDD')        PRS_PERSLID_INGANGSDATUM
,  fac.safe_to_date(gp.datum_uitdienst,'YYYYMMDD')       PRS_PERSLID_EINDDATUM
,  SUBSTR(gp.locatie_code,1,30)        flex_locatie
,  SUBSTR(gp.gebouw_code,1,30)         flex_gebouw
,  SUBSTR(gp.verdieping_code,1,30)     flex_verdieping
,  SUBSTR(gp.ruimte_nr,1,30)           flex_ruimte
FROM gvba_imp_persoon gp, prs_perslid p
WHERE gp.personeelsnummer = p.prs_perslid_nr(+);
/

CREATE OR REPLACE VIEW gvba_v_imp_persoon_del
AS
SELECT
   p.prs_perslid_key
  ,p.prs_perslid_nr
FROM   gvba_imp_persoon gp, prs_perslid p
WHERE  gp.personeelsnummer(+) = p.prs_perslid_nr
AND    p.prs_perslid_verwijder is null
AND    gp.personeelsnummer IS NULL
AND    p.prs_perslid_nr is not null;
/


CREATE OR REPLACE PROCEDURE gvba_import_persoon (
   p_import_key IN NUMBER
)
AS
  CURSOR c1 IS
    SELECT *
        FROM fac_imp_file
       WHERE fac_import_key = p_import_key;
    rec1 c1%ROWTYPE;
   v_newline          fac_imp_file.fac_imp_file_line%TYPE;   -- Import line
   v_fielddelimitor            VARCHAR2 (1);      -- Field seperator
   v_errormsg                  VARCHAR (200);
   oracle_err_num              NUMBER;
   oracle_err_mes              VARCHAR2 (200);
   v_errmes                    VARCHAR(1024);
   -- De importvelden
   v_personeelsnummer          VARCHAR2(100);
   v_achternaam                VARCHAR2(100);
   v_voornaam                  VARCHAR2(100);
   v_tussenvoegsel             VARCHAR2(100);
   v_voorletters               VARCHAR2(100);
   v_telefoon                  VARCHAR2(100);
   v_mobiel                    VARCHAR2(100);
   v_grip                      VARCHAR2(100);
   v_login                     VARCHAR2(100);
   v_email                     VARCHAR2(200);
   v_functie                   VARCHAR2(100);
   v_organisatie_code          VARCHAR2(100);
   v_kostenplaats              VARCHAR2(100);
   v_datum_indienst            VARCHAR2(100);
   v_datum_uitdienst           VARCHAR2(100);
   v_locatie                   VARCHAR2(100);
   v_gebouw                    VARCHAR2(100);
   v_verdieping                VARCHAR2(100);
   v_ruimte_nr                 VARCHAR2(100);
   -- Overig
   header_is_valid             BOOLEAN;
   v_controle_res              VARCHAR2 (30);
   v_teller                    INTEGER;
BEGIN
    v_fielddelimitor := ';';
    header_is_valid := TRUE;  -- No header present
    DELETE FROM GVBA_IMP_PERSOON;

    commit;

    BEGIN
      v_teller := 0;
      OPEN c1;
      IF c1%ISOPEN THEN
        v_teller := 1;
        LOOP
          BEGIN
            v_errmes := 'Fout FETCH te importeren rij';
            FETCH c1 INTO rec1;
            EXIT WHEN c1%NOTFOUND;
            v_errmes := 'Fout opvragen te importeren rij';
            v_newline := rec1.fac_imp_file_line;
            fac.imp_getfield (v_newline, v_fielddelimitor, v_personeelsnummer);
            fac.imp_getfield (v_newline, v_fielddelimitor, v_achternaam);
            fac.imp_getfield (v_newline, v_fielddelimitor, v_voornaam);
            fac.imp_getfield (v_newline, v_fielddelimitor, v_tussenvoegsel);
            fac.imp_getfield (v_newline, v_fielddelimitor, v_voorletters);
            fac.imp_getfield (v_newline, v_fielddelimitor, v_telefoon);
            fac.imp_getfield (v_newline, v_fielddelimitor, v_mobiel);
            fac.imp_getfield (v_newline, v_fielddelimitor, v_grip);
            fac.imp_getfield (v_newline, v_fielddelimitor, v_login);
            fac.imp_getfield (v_newline, v_fielddelimitor, v_email);
            fac.imp_getfield (v_newline, v_fielddelimitor, v_functie);
            fac.imp_getfield (v_newline, v_fielddelimitor, v_organisatie_code);
            fac.imp_getfield (v_newline, v_fielddelimitor, v_kostenplaats);
            fac.imp_getfield (v_newline, v_fielddelimitor, v_datum_indienst);
            fac.imp_getfield (v_newline, v_fielddelimitor, v_datum_uitdienst);
            fac.imp_getfield (v_newline, v_fielddelimitor, v_locatie);
            fac.imp_getfield (v_newline, v_fielddelimitor, v_gebouw);
            fac.imp_getfield (v_newline, v_fielddelimitor, v_verdieping);
            fac.imp_getfield (v_newline, v_fielddelimitor, v_ruimte_nr);
            v_errmes := 'Fout bij schrijven te importeren rij in Facilitor database';
            INSERT INTO GVBA_IMP_PERSOON
                        (personeelsnummer
                        ,achternaam
                        ,voornaam
                        ,tussenvoegsels
                        ,voorletters
                        ,telefoon
                        ,mobiel
                        ,grip
                        ,login
                        ,email
                        ,functie
                        ,organisatiecode
                        ,kostenplaats
                        ,datum_indienst
                        ,datum_uitdienst
                        ,locatie_code
                        ,gebouw_code
                        ,verdieping_code
                        ,ruimte_nr
                        )
                 VALUES (SUBSTR (v_personeelsnummer, 1, 16),
                         SUBSTR (v_achternaam, 1, 30),
                         SUBSTR (v_voornaam, 1, 30),
                         SUBSTR (v_tussenvoegsel, 1, 15),
                         SUBSTR (v_voorletters, 1, 10),
                         SUBSTR (v_telefoon, 1, 15),
                         SUBSTR (v_mobiel, 1, 15),
                         SUBSTR (v_grip, 1, 15),
                         SUBSTR (v_login, 1, 30),
                         SUBSTR (v_email, 1, 200),
                         SUBSTR (v_functie, 1, 30),
                         SUBSTR (v_organisatie_code, 1, 10),
                         SUBSTR (v_kostenplaats, 1, 30),
                         SUBSTR (v_datum_indienst, 1, 8),
                         SUBSTR (v_datum_uitdienst, 1, 8),
                         SUBSTR (v_locatie, 1, 10),
                         SUBSTR (v_gebouw, 1, 10),
                         SUBSTR (v_verdieping, 1, 10),
                         SUBSTR (v_ruimte_nr, 1, 10)
                        );
            v_teller := v_teller + 1;
            COMMIT; --  alles is goed gegaan
            EXCEPTION WHEN OTHERS THEN
              ROLLBACK;
              oracle_err_num := SQLCODE;
              oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
              fac.imp_writelog (p_import_key,
                                'E',
                                'Personen import: '|| v_errmes,
                                'Oracle foutmelding (' || oracle_err_num || '/' || oracle_err_mes || ')'
                               );
              COMMIT; -- Logging opslaan
          END;
        END LOOP;
      END IF;
      CLOSE c1;
      COMMIT;
    END;
END;
/


CREATE OR REPLACE VIEW gvba_v_afdeling_kpn_imp AS
SELECT UPPER(prs_afdeling_naam)||prs_kostenplaats_nr afdeling_kpn
FROM   gvba_v_imp_persoon;
/

CREATE OR REPLACE VIEW gvba_v_afdeling_kpn_fclt AS
SELECT a.prs_afdeling_key, SUBSTR(a.prs_afdeling_upper, 1, INSTR(a.prs_afdeling_upper, '/')-1)||k.prs_kostenplaats_nr afdeling_kpn, prs_afdeling_verwijder
FROM   PRS_AFDELING a, PRS_KOSTENPLAATS k
WHERE  a.prs_kostenplaats_key = k.prs_kostenplaats_key
AND    INSTR(a.prs_afdeling_upper, '/') > 0;
/

CREATE OR REPLACE VIEW gvba_v_afdeling_del AS
SELECT fclt.prs_afdeling_key
FROM gvba_v_afdeling_kpn_fclt fclt, gvba_v_afdeling_kpn_imp imp
WHERE imp.afdeling_kpn(+) = fclt.afdeling_kpn
AND  imp.afdeling_kpn IS NULL
AND fclt.prs_afdeling_key not in (select prs_afdeling_key from prs_v_aanwezigperslid)
AND fclt.prs_afdeling_verwijder is null;
/

CREATE OR REPLACE PROCEDURE gvba_update_persoon (
   p_import_key IN NUMBER
)
AS

  CURSOR c1 IS
    SELECT *
    FROM   gvba_v_imp_persoon
    WHERE  aktie in ('ADD','MOD');
    -- AND    prs_perslid_nr <=  '10009';

    rec1 c1%ROWTYPE;

  CURSOR c2 IS
    SELECT *
    FROM   gvba_v_imp_persoon_del
    WHERE  1=1;

    rec2 c2%ROWTYPE;

   v_teller                    INTEGER;
   v_count                     NUMBER(10);
   v_perslidkostenplaats_key   NUMBER(10);
   v_kostenplaats_key          NUMBER(10);
   v_perslid_key               NUMBER(10);
   v_afdeling_key              NUMBER(10);
   v_srtperslid_key            NUMBER(10);
   v_prs_kenmerk_key           NUMBER(10);
   v_ruimte_key                NUMBER(10);
   v_werkplek_key              NUMBER(10);

   v_newline                   VARCHAR2 (1000);   -- Import line
   v_fielddelimitor            VARCHAR2 (1);      -- Field seperator
   v_errormsg                  VARCHAR (200);
   oracle_err_num              NUMBER;
   oracle_err_mes              VARCHAR2 (200);
   v_errmes                    VARCHAR(1024);
   v_debug                     BOOLEAN;


BEGIN

    v_debug := FALSE;

    IF v_debug THEN
      fac.imp_writelog (p_import_key,
                        'I',
                        'Processing PROCEDURE gvba_update_persoon',
                        'SET v_debug = FALSE to skip this information'
                       );
      commit;
    END IF;


    -- Personen toevoegen/wijzigen
    BEGIN

      OPEN c1;
      IF c1%ISOPEN THEN

        LOOP

          BEGIN

            FETCH c1 INTO rec1;
            EXIT WHEN c1%NOTFOUND;

            v_afdeling_key := -1;

            IF ((rec1.prs_afdeling_naam <> 'Onbekend') AND (rec1.prs_kostenplaats_nr IS NOT NULL)) THEN
              v_errmes := 'Fout bij bepalen/aanmaken afdeling a.d.h.v. de afdelings-code <' || rec1.prs_afdeling_naam || '>';
              gvba_p_import.set_prs_afdeling_key_volgnr(rec1.prs_afdeling_naam, rec1.prs_kostenplaats_nr);
              select gvba_p_import.get_prs_afdeling_key_volgnr(rec1.prs_afdeling_naam, rec1.prs_kostenplaats_nr) into v_afdeling_key from dual;
            END IF;

            IF (v_afdeling_key = -1) THEN
              -- Kennelijk afdeling 'Onbekend' of geen kostenplaats, dan koppelen op de 'oude' manier
              SELECT gvba_p_import.get_prs_afdeling_key(rec1.prs_afdeling_naam)
              INTO   v_afdeling_key
              FROM   dual;
              IF (v_afdeling_key = -1) THEN
                -- Indine afdeling niet gevonden, zoek dan op 5 cijferige code
                SELECT NVL(MAX(prs_afdeling_key),NULL), COUNT(*)
                INTO   v_afdeling_key, v_count
                FROM   prs_afdeling
                WHERE  prs_afdeling_verwijder IS NULL
                AND    prs_afdeling_upper like upper(SUBSTR(rec1.prs_afdeling_naam,1,5))||'%';
              END IF;
            END IF;

            v_errmes := 'Fout bij bepalen/aanmaken functie a.d.h.v. de functie-omschrijving <' || rec1.prs_srtperslid_omschrijving || '>';
            gvba_p_import.set_prs_srtperslid_key(rec1.prs_srtperslid_omschrijving);
            SELECT gvba_p_import.get_prs_srtperslid_key(rec1.prs_srtperslid_omschrijving)
            INTO   v_srtperslid_key
            FROM   dual;
            IF (v_srtperslid_key = -1) THEN v_srtperslid_key := TO_NUMBER(NULL); END IF;

            -- Stel dat er dubbelen in het importbestand staan ...
            v_errmes := 'Fout bij bepalen persoon met personeelsnummer <' || rec1.PRS_PERSLID_NR || '>';
            SELECT NVL(MAX(prs_perslid_key),-1), COUNT(*)
            INTO   v_perslid_key, v_count
            FROM   prs_perslid
            WHERE  prs_perslid_verwijder is null
            AND    upper(prs_perslid_nr) = upper(rec1.PRS_PERSLID_NR);

            IF (v_perslid_key = -1) THEN

                v_errmes := 'Fout bij toevoegen persoon met persoonnr <' || rec1.prs_perslid_nr || '>';

              SELECT  prs_s_prs_alluitvoerende_keys.NEXTVAL
              INTO    v_perslid_key
              FROM    DUAL;

                INSERT INTO prs_perslid
                (prs_perslid_key
                ,prs_perslid_naam
                ,prs_perslid_nr
                ,prs_perslid_module
                ,prs_perslid_tussenvoegsel
                ,prs_perslid_voorletters
                ,prs_perslid_voornaam
                ,prs_perslid_ingangsdatum
                ,prs_perslid_einddatum
                ,prs_perslid_telefoonnr
                ,prs_perslid_mobiel
                ,prs_perslid_oslogin
                ,prs_srtperslid_key
                ,prs_afdeling_key
                ,prs_perslid_email)
                values
                (v_perslid_key
                ,rec1.prs_perslid_naam
                ,rec1.prs_perslid_nr
                ,'PRS'
                ,rec1.prs_perslid_tussenvoegsel
                ,rec1.prs_perslid_voorletters
                ,rec1.prs_perslid_voornaam
                ,rec1.prs_perslid_ingangsdatum
                ,rec1.prs_perslid_einddatum
                ,rec1.prs_perslid_telefoonnr
                ,rec1.prs_perslid_mobiel
                ,rec1.prs_perslid_oslogin
                ,v_srtperslid_key
                ,v_afdeling_key
                ,rec1.prs_perslid_email
                );

            ELSE

                v_errmes := 'Fout bij wijzigen persoon met persoonnr <' || rec1.prs_perslid_nr || '>' || ' (' || rec1.prs_afdeling_naam||','||rec1.prs_kostenplaats_nr||','||to_char(v_afdeling_key)||')';
              UPDATE prs_perslid
              SET    prs_perslid_naam          = rec1.prs_perslid_naam
                    ,prs_perslid_tussenvoegsel = rec1.prs_perslid_tussenvoegsel
                    ,prs_perslid_voorletters   = rec1.prs_perslid_voorletters
                    ,prs_perslid_voornaam      = rec1.prs_perslid_voornaam
                    ,prs_perslid_ingangsdatum  = rec1.prs_perslid_ingangsdatum
                    ,prs_perslid_einddatum     = rec1.prs_perslid_einddatum
                    ,prs_perslid_telefoonnr    = rec1.prs_perslid_telefoonnr
                    ,prs_perslid_mobiel        = rec1.prs_perslid_mobiel
                    ,prs_perslid_oslogin       = rec1.prs_perslid_oslogin
                    ,prs_perslid_email         = rec1.prs_perslid_email
                    ,prs_srtperslid_key        = v_srtperslid_key
                    ,prs_afdeling_key          = v_afdeling_key
                    ,prs_perslid_verwijder     = NULL
              WHERE prs_perslid_key = v_perslid_key;

            END IF;

            -- Virtuele werkplekken bijwerken indien mogelijk
            BEGIN

              IF rec1.flex_ruimte IS NULL THEN

                v_errmes := 'Verwijder eventueel aanwezige virtuele werkplek voor persoon. Dit voor persoon met persoonnr <' || rec1.prs_perslid_nr || '>';
                DELETE FROM prs_perslidwerkplek pw
                WHERE   1=1
                AND     pw.prs_perslid_key = v_perslid_key
                AND     EXISTS (SELECT  'x'
                                FROM    PRS_WERKPLEK w
                                WHERE   w.prs_werkplek_key = pw.prs_werkplek_key
                                AND     w.prs_werkplek_module = 'IMP'
                                AND     w.prs_werkplek_virtueel = 0
                                AND     rownum=1);

              ELSE

                v_errmes        := 'Vraag ruimte op in Facilitor? Dit voor persoon met persoonnr <' || rec1.prs_perslid_nr || '>';
                v_ruimte_key    := gvba_p_import.get_gvba_ruimte_key(rec1.flex_ruimte,rec1.flex_locatie);

                IF v_ruimte_key > 0 THEN -- Ruimte gevonden

                  v_errmes        := 'Maak virtuele werkplek aan indien niet aanwezig? Dit voor persoon met persoonnr <' || rec1.prs_perslid_nr || '>';
                  gvba_p_import.set_prs_werkplek_key(v_ruimte_key,0);
                  v_errmes        := 'Vraag virtuele werkplek op in Facilitor? Dit voor persoon met persoonnr <' || rec1.prs_perslid_nr || '>';
                  v_werkplek_key  := gvba_p_import.get_prs_werkplek_key(v_ruimte_key,0);

                  v_errmes := 'Is de virtuele werkplek gewijzigd? Dit voor persoon met persoonnr <' || rec1.prs_perslid_nr || '>';
                  select  count(*)
                  into    v_count
                  from    prs_perslidwerkplek pw, prs_werkplek w
                  where   pw.prs_perslid_key = v_perslid_key
                  and     pw.prs_werkplek_key = v_werkplek_key
                  and     pw.prs_werkplek_key = w.prs_werkplek_key
                  and     w.prs_werkplek_module = 'IMP'
                  and     w.prs_werkplek_virtueel = 0;

                  IF (v_count = 0) THEN

                    v_errmes := 'Verwijder eventueel aanwezige virtuele werkplek voor persoon. Dit voor persoon met persoonnr <' || rec1.prs_perslid_nr || '>';
                    DELETE FROM prs_perslidwerkplek pw
                    WHERE   1=1
                    AND     pw.prs_perslid_key = v_perslid_key
                    AND     EXISTS (SELECT  'x'
                                    FROM    PRS_WERKPLEK w
                                    WHERE   w.prs_werkplek_key = pw.prs_werkplek_key
                                    AND     w.prs_werkplek_module = 'IMP'
                                    AND     w.prs_werkplek_virtueel = 0
                                    AND     rownum=1);

                    v_errmes := 'Voeg werkplek toe voor persoon met persoonnr <' || rec1.prs_perslid_nr || '>';
                    insert into PRS_PERSLIDWERKPLEK
                    (prs_perslid_key
                    ,prs_werkplek_key)
                    values
                    (v_perslid_key
                    ,v_werkplek_key);

                  ELSE

                      v_errmes := 'Geen werkplekwijziging voor persoon met persoonnr <' || rec1.prs_perslid_nr || '>';

                  END IF;

                ELSE

                  IF v_ruimte_key = -1 THEN -- Fout bij zoeken ruimte
                    v_errmes := 'Geen werkplekwijziging voor persoon met persoonnr <' || rec1.prs_perslid_nr || '>';
                    fac.imp_writelog (p_import_key,
                                      'I',
                                      v_errmes,
                                      'Foutmelding (Koppeling persoon/werkplek niet gewijzigd omdat ruimte <'|| rec1.flex_ruimte || '> niet kan worden gevonden.)'
                                     );
                    commit;

                  ELSE -- v_ruimte_key = 0
                    v_errmes := 'Geen werkplek aanmaken!';
                  END IF;

                  COMMIT; -- Logging opslaan

                END IF;

              END IF;


            EXCEPTION WHEN OTHERS THEN
              oracle_err_num := SQLCODE;
              oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
              fac.imp_writelog (p_import_key,
                                'I',
                                'Koppeling persoon/werkplek: '|| v_errmes,
                                'Oracle foutmelding (' || oracle_err_num || '/' || oracle_err_mes || ')'
                               );
              COMMIT; -- Logging opslaan
              -- Ga door met het toevoegen wijzigen van de persoon!
            END;

            v_errmes := 'Fout bij toevoegen flexibele kenmerken voor persoon met persoonnr <' || rec1.prs_perslid_nr || '>';
            BEGIN -- FlexProps

              v_errmes := 'Fout bij toevoegen flexibele kenmerken Kostenplaats voor persoon met persoonnr <' || rec1.prs_perslid_nr || '>';
              SELECT  gvba_p_import.get_prs_kenmerk_key('P','Kostenplaats')
              INTO    v_prs_kenmerk_key
              FROM    dual;
              gvba_p_import.set_prs_ckenmerk_waarde(v_prs_kenmerk_key,v_perslid_key,rec1.prs_kostenplaats_nr);

              v_errmes := 'Fout bij toevoegen flexibele kenmerken Grip voor persoon met persoonnr <' || rec1.prs_perslid_nr || '>';
              SELECT  gvba_p_import.get_prs_kenmerk_key('P','Grip')
              INTO    v_prs_kenmerk_key
              FROM    dual;
              gvba_p_import.set_prs_ckenmerk_waarde(v_prs_kenmerk_key,v_perslid_key,rec1.FLEX_GRIP);

              v_errmes := 'Fout bij toevoegen flexibele kenmerken LocatieCode voor persoon met persoonnr <' || rec1.prs_perslid_nr || '>';
              SELECT  gvba_p_import.get_prs_kenmerk_key('P','LocatieCode')
              INTO    v_prs_kenmerk_key
              FROM    dual;
              gvba_p_import.set_prs_ckenmerk_waarde(v_prs_kenmerk_key,v_perslid_key,rec1.FLEX_LOCATIE);

              v_errmes := 'Fout bij toevoegen flexibele kenmerken GebouwCode voor persoon met persoonnr <' || rec1.prs_perslid_nr || '>';
              SELECT  gvba_p_import.get_prs_kenmerk_key('P','GebouwCode')
              INTO    v_prs_kenmerk_key
              FROM    dual;
              gvba_p_import.set_prs_ckenmerk_waarde(v_prs_kenmerk_key,v_perslid_key,rec1.FLEX_GEBOUW);

              v_errmes := 'Fout bij toevoegen flexibele kenmerken VerdiepingCode voor persoon met persoonnr <' || rec1.prs_perslid_nr || '>';
              SELECT  gvba_p_import.get_prs_kenmerk_key('P','VerdiepingCode')
              INTO    v_prs_kenmerk_key
              FROM    dual;
              gvba_p_import.set_prs_ckenmerk_waarde(v_prs_kenmerk_key,v_perslid_key,rec1.FLEX_VERDIEPING);

              v_errmes := 'Fout bij toevoegen flexibele kenmerken RuimteNr voor persoon met persoonnr <' || rec1.prs_perslid_nr || '>';
              SELECT  gvba_p_import.get_prs_kenmerk_key('P','RuimteNr')
              INTO    v_prs_kenmerk_key
              FROM    dual;
              gvba_p_import.set_prs_ckenmerk_waarde(v_prs_kenmerk_key,v_perslid_key,rec1.FLEX_RUIMTE);

            END;

            COMMIT; -- Er zijn geen fouten opgetreden

          EXCEPTION WHEN OTHERS THEN

            ROLLBACK;

            oracle_err_num := SQLCODE;
            oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
            fac.imp_writelog (p_import_key,
                              'E',
                              'Personen toevoegen/wijzigen: '|| v_errmes,
                              'Oracle foutmelding (' || oracle_err_num || '/' || oracle_err_mes || ')'
                             );

            COMMIT; -- Logging opslaan

          END;

        END LOOP;

        CLOSE c1;
        COMMIT;

      END IF; -- IF c1%ISOPEN THEN

    END; -- Personen toevoegen/wijzigen


    -- Personen verwijderen
    BEGIN
      v_teller := 0;
      OPEN c2;
      IF c2%ISOPEN THEN

        v_teller := 1;

        LOOP
          BEGIN
            v_errmes := 'Fout FETCH te importeren rij';
            FETCH c2 INTO rec2;
            EXIT WHEN c2%NOTFOUND;

            SELECT  count(*)
            INTO    v_count
            FROM    prs_v_verplichting
            WHERE   prs_perslid_key = rec2.prs_perslid_key;

            IF (v_count = 0) THEN

              update  prs_perslid
              set     prs_perslid_verwijder = sysdate
              where   prs_perslid_key = rec2.prs_perslid_key;

              -- Verwijder nu pas, als de persoon 'verwijderd' is, eventueel aanwezige kenmerken
              update  prs_kenmerklink
              set     prs_kenmerklink_verwijder = sysdate
              where   prs_link_key = rec2.prs_perslid_key;

              -- Verwijder nu pas de werkplekken, als koppeling prs_perslid met prs_werkplek
              -- Aanname/FSN#26947: GVBA-setting op EXPLICIETE werkplekken!
              DELETE FROM prs_perslidwerkplek WHERE prs_perslid_key = rec2.prs_perslid_key;

            ELSE

              fac.imp_writelog (p_import_key,
                                'E',
                                'Persoon met personeelsnummer ' || rec2.prs_perslid_nr || ' kan niet verwijderd worden.',
                                'Persoon heeft nog ' || to_char(v_count) || ' openstaande verplichting(en).'
                               );
              commit;

            END IF;

            v_teller := v_teller + 1;
            COMMIT; --  alles is goed gegaan

            EXCEPTION WHEN OTHERS THEN
              ROLLBACK;

              oracle_err_num := SQLCODE;
              oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
              fac.imp_writelog (p_import_key,
                                'E',
                                'Personen verwijderen: '|| v_errmes,
                                'Oracle foutmelding (' || oracle_err_num || '/' || oracle_err_mes || ')'
                               );

              COMMIT; -- Logging opslaan

          END;
        END LOOP;

      END IF;
      CLOSE c2;
      COMMIT;
    END;

    -- Afdelingen opruimen
    UPDATE PRS_AFDELING
    SET prs_afdeling_verwijder = SYSDATE
    WHERE prs_afdeling_key IN  (SELECT prs_afdeling_key FROM gvba_v_afdeling_del);


END;
/




-- toevoegen ruimtes
CREATE OR REPLACE PROCEDURE gvba_import_ruimte (
   p_import_key IN NUMBER
)
AS

  CURSOR c1 IS
    SELECT *
        FROM fac_imp_file
       WHERE fac_import_key = p_import_key;

    rec1 c1%ROWTYPE;

   v_newline          fac_imp_file.fac_imp_file_line%TYPE;   -- Import line
   v_fielddelimitor            VARCHAR2 (1);      -- Field seperator
   v_errormsg                  VARCHAR (200);
   oracle_err_num              NUMBER;
   oracle_err_mes              VARCHAR2 (200);
   v_errmes                    VARCHAR(1024);

   -- De importvelden
   v_locatie                   VARCHAR2(5);
   v_gebouw                    VARCHAR2(5);
   v_verdieping                NUMBER(3);
   v_ruimte                    VARCHAR2(10);
   v_omschrijving              VARCHAR2(30);

   -- Overig
   header_is_valid             BOOLEAN;
   v_controle_res              VARCHAR2 (30);
   v_teller                    INTEGER;
BEGIN
    v_fielddelimitor := ';';
    header_is_valid := TRUE;  -- No header present

    DELETE FROM gvba_imp_ruimte;

    BEGIN
      v_teller := 0;
      OPEN c1;
      IF c1%ISOPEN THEN

        v_teller := 1;

        LOOP
          BEGIN
            v_errmes := 'Fout FETCH te importeren rij';
            FETCH c1 INTO rec1;
            EXIT WHEN c1%NOTFOUND;

            v_errmes := 'Fout opvragen te importeren rij';

            v_newline := rec1.fac_imp_file_line;
            fac.imp_getfield (v_newline, v_fielddelimitor, v_locatie);
            fac.imp_getfield (v_newline, v_fielddelimitor, v_gebouw);
            fac.imp_getfield (v_newline, v_fielddelimitor, v_verdieping);
            fac.imp_getfield (v_newline, v_fielddelimitor, v_ruimte);
            fac.imp_getfield (v_newline, v_fielddelimitor, v_omschrijving);

            v_errmes := 'Fout bij schrijven te importeren rij in Facilitor database';

            INSERT INTO gvba_imp_ruimte
                        (locatie
                        ,gebouw
                        ,verdieping
                        ,ruimte
                        ,omschrijving
                        )
                 VALUES (SUBSTR (v_locatie, 1, 5),
                         SUBSTR (v_gebouw, 1, 5),
                         TO_NUMBER (v_verdieping),
                         SUBSTR (v_ruimte, 1, 10),
                         SUBSTR (v_omschrijving, 1, 30)
                        );

            v_teller := v_teller + 1;
            COMMIT; --  alles is goed gegaan

            EXCEPTION WHEN OTHERS THEN
              ROLLBACK;

              oracle_err_num := SQLCODE;
              oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
              fac.imp_writelog (p_import_key,
                                'E',
                                v_errmes || '(' || rec1.fac_imp_file_line || ')',
                                'Oracle foutmelding (' || oracle_err_num || '/' || oracle_err_mes || ')'
                               );

              COMMIT; -- Logging opslaan

          END;
        END LOOP;

      END IF;
      CLOSE c1;
      COMMIT;
    END;

END;
/

CREATE OR REPLACE PROCEDURE gvba_update_ruimte (
   p_import_key IN NUMBER
)
AS

  -- Constanten
  c_bedrijf_naam VARCHAR(30) := 'GVBA';

  CURSOR c1 IS
    SELECT locatie, gebouw, verdieping, ruimte, omschrijving
    FROM   gvba_imp_ruimte;

    rec1 c1%ROWTYPE;


    --
    v_locatie_key         NUMBER(10);
    v_gebouw_key          NUMBER(10);
    v_verdieping_key      NUMBER(10);
    v_count               INTEGER;
    v_teller              INTEGER;
    oracle_err_num        NUMBER;
    oracle_err_mes        VARCHAR2 (200);
    v_errmes              VARCHAR(1024);


BEGIN

  v_errmes := 'ruimte toevoegen';
  -- Afdelingen toevoegen
  BEGIN
    v_teller := 0;
    OPEN c1;
    IF c1%ISOPEN THEN

      v_teller := 1;

      LOOP
        BEGIN
          v_errmes := 'Fout bij lezen nieuw toe te voegen locatie';
          FETCH c1 INTO rec1;
          EXIT WHEN c1%NOTFOUND;

          SELECT count(*)
            INTO v_count
            FROM alg_v_aanweziglocatie
           WHERE alg_locatie_code = upper(rec1.locatie);

          IF v_count = 0 THEN
            INSERT INTO alg_locatie (
              alg_locatie_code,
              alg_locatie_omschrijving,
              alg_district_key)
            VALUES (
              rec1.locatie,
              rec1.locatie,
              1);
          END IF;

          SELECT alg_locatie_key
            INTO v_locatie_key
            FROM alg_v_aanweziglocatie
           WHERE alg_locatie_code = upper(rec1.locatie);

          v_errmes := 'Fout bij lezen nieuw toe te voegen gebouw';
          SELECT count(*)
            INTO v_count
            FROM alg_v_aanweziggebouw
           WHERE alg_locatie_key = v_locatie_key
             AND alg_gebouw_code = upper(rec1.gebouw);

          IF v_count = 0 THEN
            INSERT INTO alg_gebouw (
              alg_locatie_key,
              alg_gebouw_naam,
              alg_gebouw_code,
              alg_srtgebouw_key)
            VALUES (
              v_locatie_key,
              rec1.gebouw,
              rec1.gebouw,
              1);
          END IF;

          SELECT alg_gebouw_key
            INTO v_gebouw_key
            FROM alg_v_aanweziggebouw
           WHERE alg_locatie_key = v_locatie_key
             AND alg_gebouw_code = upper(rec1.gebouw);

          v_errmes := 'Fout bij lezen nieuw toe te voegen verdieping';
          SELECT count(*)
            INTO v_count
            FROM alg_v_aanwezigverdieping
           WHERE alg_gebouw_key = v_gebouw_key
             AND alg_verdieping_volgnr = rec1.verdieping;

          v_errmes := 'Fout bij lezen nieuw toe te voegen verdieping aantal='||v_count;
          IF v_count = 0 THEN
            INSERT INTO alg_verdieping (
              alg_gebouw_key,
              alg_verdieping_omschrijving,
              alg_verdieping_volgnr,
              alg_verdieping_code)
            VALUES (
              v_gebouw_key,
              DECODE (rec1.verdieping,
              -1, 'Kelder',
              0, 'Begane grond',
              1, 'Eerste verdieping',
              2, 'Tweede verdieping',
              3, 'Derde verdieping',
              4, 'Vierde verdieping',
              5, 'Vijfde verdieping',
              null),
              rec1.verdieping,
              DECODE (rec1.verdieping,
              -1, 'K',
              0, 'BG',
              1, '1',
              2, '2',
              3, '3',
              4, '4',
              5, '5',
              null)
              );
          END IF;

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

          v_errmes := 'Fout bij lezen nieuw toe te voegen ruimte';
          SELECT count(*)
            INTO v_count
            FROM alg_v_aanwezigruimte
           WHERE alg_verdieping_key = v_verdieping_key
             AND alg_ruimte_nr = rec1.ruimte;

          IF v_count = 0 THEN
            INSERT INTO alg_ruimte (
              alg_verdieping_key,
              alg_ruimte_omschrijving,
              alg_ruimte_nr,
              alg_srtruimte_key)
            VALUES (
              v_verdieping_key,
              rec1.omschrijving,
              rec1.ruimte,
              1
              );
          END IF;



          v_teller := v_teller + 1;
          COMMIT; --  alles is goed gegaan

          EXCEPTION WHEN OTHERS THEN
            ROLLBACK;

            oracle_err_num := SQLCODE;
            oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
            fac.imp_writelog (p_import_key,
                              'E',
                              'Ruimte toevoegen('|| rec1.locatie || ',' || rec1.gebouw ||',' || rec1.verdieping || ',' || rec1.ruimte || ',' || rec1.omschrijving || '): ' || v_errmes,
                              'Oracle foutmelding (' || oracle_err_num || '/' || oracle_err_mes || ')'
                             );

            COMMIT; -- Logging opslaan

        END;
      END LOOP;

    END IF;
    CLOSE c1;
    COMMIT;
  END;



END;
/

CREATE OR REPLACE PACKAGE GVBA_RAP AS
  -- PACKAGES voor de GVBA specifieke rapportages
  TYPE t_cursor IS REF CURSOR;
  PROCEDURE gvba_rap_kwismelding (user_key IN NUMBER, p_datum_van IN VARCHAR2, p_datum_tot IN VARCHAR2, p_cursor OUT t_cursor);
 END;
/

/* Formatted on 13-5-2013 11:45:15 (QP5 v5.115.810.9015) */
CREATE OR REPLACE PACKAGE BODY GVBA_RAP
AS
   --
   -- Algemene procedures en functies.
   --

   PROCEDURE gvba_rap_kwismelding (user_key      IN     NUMBER,
                                   p_datum_van   IN     VARCHAR2-- Let wel: formaat '13-05-2005'
                                   ,
                                   p_datum_tot   IN     VARCHAR2,
                                   p_cursor         OUT t_cursor)
   AS
      v_datum_van   DATE;
      v_datum_tot   DATE;
   BEGIN
      v_datum_van := fac.safe_to_date (p_datum_van, 'dd-mm-yyyy');
      v_datum_tot := fac.safe_to_date (p_datum_tot, 'dd-mm-yyyy');

      OPEN p_cursor FOR
           SELECT   DISTINCT
                    m.mld_melding_key nummer,
                    TO_CHAR (m.mld_melding_datum, 'DD-MM-YYYY HH24:MI') datum,
                    (SELECT   mld_statuses_omschrijving
                       FROM   mld_statuses s
                      WHERE   m.mld_melding_status = s.mld_statuses_key)
                       status,
                    TO_CHAR (
                       mld.getmeldingstatusdate (m.mld_melding_key,
                                                 m.mld_melding_status),
                       'YYYY-MM-DD HH24:MI'
                    )
                       laatste_actie,
                    (SELECT   sd.ins_srtdiscipline_omschrijving
                       FROM   ins_srtdiscipline sd
                      WHERE   sd.ins_srtdiscipline_key =
                                 md.ins_srtdiscipline_key)
                       kwis,
                    SUBSTR (md.ins_discipline_omschrijving, 3) vakgroep,
                    (SELECT   stdm.mld_stdmelding_omschrijving
                       FROM   mld_stdmelding stdm
                      WHERE   m.mld_stdmelding_key = stdm.mld_stdmelding_key)
                       melding,
                    m.mld_melding_omschrijving omschrijving,
                    m.mld_melding_opmerking actie,
                    (SELECT   d.prs_afdeling_naam6
                       FROM   prs_v_afdeling d
                      WHERE   p.prs_afdeling_key = d.prs_afdeling_key)
                       organisatie,
                    p.prs_perslid_naam
                    || DECODE (NVL (p.prs_perslid_voorletters, ''),
                               '', '',
                               ', ' || p.prs_perslid_voorletters)
                    || DECODE (NVL (p.prs_perslid_tussenvoegsel, ''),
                               '', '',
                               ' ' || p.prs_perslid_tussenvoegsel)
                    || DECODE (NVL (p.prs_perslid_voornaam, ''),
                               '', '',
                               ' (' || p.prs_perslid_voornaam || ')')
                       naam,
                    (SELECT      k.prs_kostenplaats_nr
                              || ' '
                              || k.prs_kostenplaats_omschrijving
                       FROM   prs_kostenplaats k
                      WHERE   k.prs_kostenplaats_key = m.prs_kostenplaats_key)
                       kostenplaats,
                    (SELECT   alg_locatie_code
                       FROM   alg_locatie l
                      WHERE   m.mld_alg_locatie_key = l.alg_locatie_key)
                    || (SELECT   DECODE (g.alg_gebouw_code,
                                         NULL, '',
                                         '-' || g.alg_gebouw_code)
                                 || DECODE (g.alg_verdieping_code,
                                            NULL, '',
                                            '-' || g.alg_verdieping_code)
                                 || DECODE (g.alg_ruimte_nr,
                                            NULL, '',
                                            '-' || g.alg_ruimte_nr)
                                 || DECODE (g.alg_terreinsector_code,
                                            NULL, '',
                                            '-' || g.alg_terreinsector_code)
                          FROM   alg_v_allonrgoed_gegevens g
                         WHERE   m.mld_alg_onroerendgoed_keys =
                                    g.alg_onroerendgoed_keys)
                       plaats
             FROM   mld_melding m,
                    mld_stdmelding std,
                    mld_discipline md,
                    alg_v_onroerendgoed_gegevens v,
                    alg_locatie l,
                    prs_perslid p
            WHERE   m.mld_alg_locatie_key = l.alg_locatie_key(+)
                    AND m.mld_alg_onroerendgoed_keys =
                          v.alg_onroerendgoed_keys(+)
                    AND m.prs_perslid_key = p.prs_perslid_key
                    AND m.mld_stdmelding_key = std.mld_stdmelding_key
                    AND std.mld_ins_discipline_key = md.ins_discipline_key
                    AND m.mld_melding_datum BETWEEN v_datum_van AND v_datum_tot
         ORDER BY   1, 2, 3 DESC;
   END;
END;
/

--GVBA#12148
CREATE OR REPLACE VIEW gvba_v_perslid_last_login (hide_f_datum, naam, login)
AS
   SELECT SYSDATE - prs_perslid_login, pf.prs_perslid_naam_full,
          TO_CHAR (prs_perslid_login, 'dd-mm-yyyy hh24:mi')
     FROM prs_perslid p, prs_v_perslid_fullnames pf
    WHERE p.prs_perslid_key = pf.prs_perslid_key
      AND prs_perslid_login IS NOT NULL;


CREATE OR REPLACE VIEW GVBA_V_RAP_ERRORLOG
(
   HIDE_F_IMP_LOG_DATUM,
   FCLT_F_APPLICATIE,
   FCLT_F_DATUM,
   TIJDSTIP,
   FCLT_F_NIVEAU,
   FCLT_F_OMSCHRIJVING
)
AS
   SELECT imp_log_datum hide_f_imp_log_datum,
          imp_log_applicatie,
          TO_CHAR (imp_log_datum, 'YYYYMMDD') fclt_f_datum,
          TO_CHAR (imp_log_datum, 'HH24:MI:SS') tijdstip,
          DECODE (imp_log_status,
                  'F', 'Fataal',
                  'E', 'Error',
                  'W', 'Waarschuwing',
                  'I', 'Informatief',
                  '-')
             fclt_f_niveau,
          imp_log_omschrijving fclt_f_omschrijving
     FROM imp_log;


-----------------------------------------
-- Koppeling met Strukton
-----------------------------------------

CREATE OR REPLACE PROCEDURE gvba_import_opdrstat_strukton (
   p_import_key IN NUMBER)
AS
   c_delim                VARCHAR2 (1) := ';';
   v_newline              VARCHAR2 (1000);                       -- Input line
   v_errormsg             VARCHAR2 (1000);
   oracle_err_num         NUMBER;
   oracle_err_mes         VARCHAR2 (200);
   v_aanduiding           VARCHAR2 (1200);
   v_dummy                VARCHAR2 (200);
   header_is_valid        NUMBER := 0;
   v_count                NUMBER;
   v_count_tot            NUMBER (10) := 0;
   v_count_import         NUMBER (10) := 0;
   v_ongeldig             NUMBER (1) := 0;
   -- De importvelden
   v_mld_opdr_opmerking   VARCHAR2 (4000);
   v_mld_opdr_key         NUMBER (10);
   v_mld_opdr_key_tekst   VARCHAR2 (100);
   v_extern_nummer        VARCHAR2 (100);
   v_status               NUMBER (10);
   v_status_tekst         VARCHAR2 (100);
   v_status_code          VARCHAR2 (100);
   v_datumtijd            DATE;
   v_datumtijd_tekst      VARCHAR2 (100);
   v_opmerking            VARCHAR2 (3000);
   v_totaal               NUMBER (8,2);
   v_totaal_str           VARCHAR2 (100);

   -- Overige velden:
   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 gvba_imp_opdrstat_strukton;

   COMMIT;

   FOR rec1 IN c1
   LOOP
      BEGIN
         v_newline := rec1.fac_imp_file_line;
         v_errormsg := 'Fout opvragen te importeren rij';
         v_aanduiding := '';
         v_ongeldig := 0;

         fac.imp_getfield (v_newline, c_delim, v_mld_opdr_key_tekst);
         fac.imp_getfield (v_newline, c_delim, v_extern_nummer);
         fac.imp_getfield (v_newline, c_delim, v_status_code);       -- typeID
         fac.imp_getfield (v_newline, c_delim, v_datumtijd_tekst);
         fac.imp_getfield (v_newline, c_delim, v_status_tekst);
         fac.imp_getfield (v_newline, c_delim, v_opmerking);
         fac.imp_getfield (v_newline, c_delim, v_totaal_str);
         v_totaal := fac.safe_to_number(v_totaal_str);

         fac.imp_writelog (p_import_key, 'I', 'v_totaal_str:' || v_totaal_str || ' v_totaal:' || v_totaal || ' fac.safe_to_number(v_totaal_str):' || fac.safe_to_number(v_totaal_str),'');

         v_opmerking := substr(v_opmerking, 1, 1000);
         -- verwijder de markering voor cr/lf die we zelf in de stylesheet toegevoegd hebben.
         v_opmerking := replace(v_opmerking, '@@',CHR (13) || CHR (10));
         v_aanduiding :=
               '['
            || v_extern_nummer
            || '|'
            || v_mld_opdr_key_tekst
            || '|'
            || v_status_tekst
            || '|'
            || v_opmerking
            || '] ';

         -- Ik controleer of ik een geldige header heb, dat is: in de juiste kolommen
         -- de juiste kolomkop. Ik controleer daarbij ALLE kolommen!
         -- Ik negeer alles totdat ik een geldige header ben gepasseerd.
         IF (header_is_valid = 0)
         THEN
            IF     UPPER (TRIM (v_mld_opdr_key_tekst)) = 'REFERENCEID'
               AND UPPER (TRIM (v_extern_nummer)) = 'SERVICEREQUESTID'
               AND UPPER (TRIM (v_status_code)) = 'TYPEID'
               AND UPPER (TRIM (v_datumtijd_tekst)) = 'DATETIME'
               AND UPPER (TRIM (v_opmerking)) = 'REMARKS'
               AND UPPER (TRIM (v_totaal_str)) = 'TOTAL'
            THEN
               header_is_valid := 1;
            END IF;
         ELSE
            v_count_tot := v_count_tot + 1;
            -- Controleer alle veldwaarden
            v_errormsg := 'Fout inlezen mld_opdr_key [' || v_aanduiding || ']';
            v_mld_opdr_key := TRIM (v_mld_opdr_key);

            BEGIN
               SELECT o.mld_opdr_key, o.mld_opdr_opmerking
                 INTO v_mld_opdr_key, v_mld_opdr_opmerking
                 FROM mld_opdr o, mld_melding m, ins_tab_discipline d, ins_srtdiscipline sd, mld_stdmelding std
                WHERE o.mld_melding_key = m.mld_melding_key
                  AND m.mld_stdmelding_key = std.mld_stdmelding_key
                  AND std.mld_ins_discipline_key = d.ins_discipline_key
                  AND d.ins_srtdiscipline_key = sd.ins_srtdiscipline_key
                  AND sd.ins_srtdiscipline_prefix || m.mld_melding_key || '/' || o.mld_opdr_bedrijfopdr_volgnr = v_mld_opdr_key_tekst;

            EXCEPTION WHEN NO_DATA_FOUND THEN
               BEGIN
                 fac.imp_writelog (p_import_key, 'W',  'Opdracht kan niet gevonden worden. [' || v_aanduiding || ']', '');

               -- kijk nu of de opdracht gevonden kan worden a.d.h.v het Struktonnummer
               SELECT o.mld_opdr_key, o.mld_opdr_opmerking
                 INTO v_mld_opdr_key, v_mld_opdr_opmerking
                 FROM mld_opdr o, mld_kenmerkopdr ko, mld_kenmerk k
                WHERE o.mld_opdr_key = ko.mld_opdr_key
                  AND ko.mld_kenmerk_key = k.mld_kenmerk_key
                  AND k.mld_srtkenmerk_key = 35
                  AND ko.mld_kenmerkopdr_waarde = v_extern_nummer;

               EXCEPTION WHEN OTHERS THEN
                  v_ongeldig := 1;
                  v_errormsg := 'Opdracht kan niet gevonden worden (intern/externnr).  [' || v_aanduiding || ']';
                  v_mld_opdr_key := NULL;
               END;
            END;

            IF v_ongeldig = 0
            THEN
               v_errormsg :=
                  'Fout bij bepalen status [' || v_aanduiding || ']';

               CASE
                  WHEN v_status_code = '5'
                  THEN
                     v_status := 5;                              -- uitgegeven
                  WHEN v_status_code = '10'
                  THEN
                     v_status := 8;                            -- geaccepteerd
                  WHEN v_status_code = '20'                  -- monteur gereed
                  THEN
                     v_status := 6;                                -- afgemeld
                  WHEN v_status_code = '25'               -- specialist gereed
                  THEN
                     v_status := 6;                                -- afgemeld
                  WHEN v_status_code = '30'                -- technisch gereed
                  THEN
                     v_status := 6;                                -- afgemeld                             -- afgerond
                  WHEN v_status_code = '70'
                  THEN
                     v_status := 1;                             -- geannuleerd
                  WHEN v_status_code = '80'
                  THEN
                     v_status := 1;                               -- afgewezen
                  ELSE
                     v_status := NULL;
                     v_ongeldig := 1;   -- nog te bezien.
               END CASE;
            END IF;

            -- Lees alle veldwaarden
            IF v_ongeldig = 0
            THEN
               v_errormsg :=
                  'Fout bij converteren datumtijd [' || v_aanduiding || ']';
               v_datumtijd :=
                  fac.safe_to_date (
                     REPLACE (
                        SUBSTR (v_datumtijd_tekst,
                                1,
                                INSTR (v_datumtijd_tekst, '.') - 1),
                        'T',
                        ' '),
                     'yyyy-mm-dd hh24:mi:ss');

               IF v_datumtijd = NULL
               THEN
                  v_ongeldig := 0;
               END IF;
            END IF;

            IF v_ongeldig = 0
            THEN
               v_errormsg :=
                  'Fout bij aanvullen opmerking [' || v_aanduiding || ']';

               -- controleer of de opmerking niet leeg is en of dezelfde opmerking al bij een eerdere statusovergang
               -- gemeld is.
               IF v_opmerking IS NOT NULL AND INSTR(COALESCE(v_mld_opdr_opmerking, 'QueQuLeQue'), v_opmerking) = 0
               THEN
                  v_opmerking :=
                        '['
                     || v_datumtijd_tekst
                     || '] - '
                     || v_status_tekst
                     || CHR (13)
                     || CHR (10)
                     || v_opmerking;
               ELSE
                  v_opmerking :=
                     '[' || v_datumtijd_tekst || '] - ' || v_status_tekst;
               END IF;
            END IF;

            -- Insert geformatteerde import record
            IF (v_ongeldig = 0)
            THEN
               BEGIN
                  v_errormsg :=
                        'Fout toevoegen opdracht status ['
                     || v_aanduiding
                     || ']';

                  INSERT INTO gvba_imp_opdrstat_strukton (mld_opdr_key,
                                                          extern_nummer,
                                                          status,
                                                          datumtijd,
                                                          opmerking,
                                                          totaal)
                      VALUES (v_mld_opdr_key,
                              v_extern_nummer,
                              v_status,
                              v_datumtijd,
                              v_opmerking,
                              v_totaal);

                  v_count_import := v_count_import + 1;
               EXCEPTION
                  WHEN OTHERS
                  THEN
                     oracle_err_num := SQLCODE;
                     oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
                     v_errormsg :=
                           v_errormsg
                        || ' ORACLE (error '
                        || oracle_err_num
                        || '/'
                        || oracle_err_mes
                        || ')';
                     fac.imp_writelog (
                        p_import_key,
                        'E',
                        v_aanduiding || v_errormsg,
                        'Fout bij toevoegen regel aan importtabel gvba_imp_opdr_status_strukton.');
               END;
            ELSE
               fac.imp_writelog (p_import_key,
                                 'E',
                                 v_errormsg,
                                 '');
            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!');
   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 opdrachtstatusberichten afgebroken!');
END;
/




CREATE OR REPLACE PROCEDURE gvba_update_opdrstat_strukton (
   p_import_key IN NUMBER)
AS
   -- Cursor loopt - in volgorde! - over alle ingelezen opdrachtstatusberichten.
   CURSOR c1
   IS
        SELECT mld_opdr_key,
               extern_nummer,
               datumtijd,
               status,
               opmerking,
               totaal
          FROM gvba_imp_opdrstat_strukton
      ORDER BY 1, 3;

   CURSOR cp (
      c_opdr_key IN NUMBER)
   IS
        SELECT pf.prs_perslid_key
          FROM fac_tracking tr,
               fac_srtnotificatie str,
               prs_v_perslid_fullnames_all pf
         WHERE tr.fac_srtnotificatie_key = str.fac_srtnotificatie_key
           AND tr.prs_perslid_key = pf.prs_perslid_key(+)
           AND (str.fac_srtnotificatie_code = 'ORDFOK'
            AND tr.fac_tracking_refkey = c_opdr_key
            AND str.fac_srtnotificatie_xmlnode IN ('opdracht'))
      ORDER BY fac_tracking_datum DESC, fac_tracking_key DESC;

   v_errormsg              VARCHAR2 (1000);
   oracle_err_num          NUMBER;
   oracle_err_mes          VARCHAR2 (200);
   v_aanduiding            VARCHAR2 (200);
   v_count_tot             NUMBER (10);
   v_count                 NUMBER (10);
   v_mld_key               NUMBER (10) := 0;
   v_opdr_key              NUMBER (10) := 0;
   v_opdr_status           NUMBER (10) := 0;
   v_user_key              NUMBER (10) := 0;
   v_melding_status        NUMBER (10);
   v_opdr_approved         mld_opdr.mld_opdr_approved%TYPE;
   v_approver_key          prs_perslid.prs_perslid_key%TYPE;
   v_mld_typeopdr_key      mld_typeopdr.mld_typeopdr_key%TYPE;
   v_mld_kenmerk_key       mld_kenmerk.mld_kenmerk_key%TYPE;
   v_mld_kenmerkopdr_key   mld_kenmerkopdr.mld_kenmerkopdr_key%TYPE;
   v_mld_srtkenmerk_key    mld_srtkenmerk.mld_srtkenmerk_key%TYPE;
   v_perslid_key           prs_perslid.prs_perslid_key%TYPE;
   v_opdr_kosten           mld_opdr.mld_opdr_kosten%TYPE;
   v_typeopdr_gvs          mld_typeopdr.mld_typeopdr_gvs%TYPE;
   v_mld_kk                mld_melding.mld_kosten_klant%TYPE;
   v_mld_kostenpl_key      mld_melding.prs_kostenplaats_key%TYPE;
   v_opdr_kostenpl_key     mld_opdr.prs_kostenplaats_key%TYPE;
   v_mld_perslid_key       mld_melding.prs_perslid_key%TYPE;
   v_mld_disc_key          ins_tab_discipline.ins_discipline_key%TYPE;
   v_refiat                NUMBER (1);
   v_reapprove             NUMBER (1);
BEGIN
   -- Loop door alle geimporteerde opdrachtstatusberichten en verwerk deze.
   v_count_tot := 0;

   -- Stel de key in van het srtkenmerk 'Ref. Nr. Leverancier'. Hier wordt
   -- het nummer dat Strukton aan de call gegeven heeft geregistreerd.
   v_mld_srtkenmerk_key := 81;
   v_user_key := 44554;                                          -- Strukton user

   FOR rec IN c1
   LOOP
      BEGIN
         v_aanduiding :=
               '['
            || rec.mld_opdr_key
            || '|'
            || SUBSTR (rec.opmerking, 1, 100)
            || '] ';
         v_count_tot := v_count_tot + 1;
         v_count := 0;

         -- Key van melding/opdracht bepalen en externnr bij opdracht opslaan.
         IF (rec.mld_opdr_key IS NOT NULL)
         THEN
            v_errormsg := 'Fout bij bepalen opdracht.';

            SELECT mld_melding_key,
                   mld_opdr_key,
                   mld_statusopdr_key,
                   mld_typeopdr_key
              INTO v_mld_key,
                   v_opdr_key,
                   v_opdr_status,
                   v_mld_typeopdr_key
              FROM mld_opdr
             WHERE mld_opdr_key = rec.mld_opdr_key;

            v_errormsg := 'Fout bij bepalen kenmerk extern nummer.';

            SELECT k.mld_kenmerk_key
              INTO v_mld_kenmerk_key
              FROM mld_kenmerk k
             WHERE k.mld_srtkenmerk_key = v_mld_srtkenmerk_key
               AND k.mld_typeopdr_key = v_mld_typeopdr_key;

            v_errormsg := 'Fout bij bepalen kenmerkopdracht extern nummer.';

            SELECT MAX (ko.mld_kenmerkopdr_key)
              INTO v_mld_kenmerkopdr_key
              FROM mld_kenmerkopdr ko
             WHERE ko.mld_opdr_key = v_opdr_key
               AND v_mld_kenmerk_key = ko.mld_kenmerk_key;

            v_errormsg := 'Fout bij aanpassen extern nummer.';

            IF v_mld_kenmerkopdr_key IS NULL
            THEN
               -- kenmerk toevoegen
               INSERT INTO mld_kenmerkopdr (mld_kenmerk_key,
                                            mld_opdr_key,
                                            mld_kenmerkopdr_waarde)
                   VALUES (v_mld_kenmerk_key, v_opdr_key, rec.extern_nummer);
            ELSE
               -- kenmerk aanpassen
               UPDATE mld_kenmerkopdr
                  SET mld_kenmerkopdr_waarde = rec.extern_nummer
                WHERE mld_kenmerkopdr_key = v_mld_kenmerkopdr_key;
            END IF;

            v_errormsg := 'Fout bij bijwerken opdracht-opmerking.';

            v_count := LENGTH (rec.opmerking) + 5; -- Beetje speling qua lengte!

            UPDATE mld_opdr
               SET mld_opdr_opmerking =
                      DECODE (
                         mld_opdr_opmerking,
                         NULL,
                         rec.opmerking,
                            rec.opmerking
                         || CHR (13)
                         || CHR (10)
                         || SUBSTR (mld_opdr_opmerking, 1, (4000 - v_count)))
             WHERE mld_opdr_key = v_opdr_key;

            IF v_opdr_status <> rec.status
            THEN
               IF rec.status = 8 AND v_opdr_status = 5
               THEN
                  -- Accepteer opdracht als de opdracht uitgegeven was
                  mld.setopdrachtstatus (v_opdr_key, 8, v_user_key); -- Facilitor
               ELSIF rec.status = 6 AND v_opdr_status = 5
               THEN
                  -- Meld de opdracht af als deze uitgegeven was
                  mld.setopdrachtstatus (v_opdr_key, 8, v_user_key); -- Facilitor, eerst accepteren
                  mld.setopdrachtstatus (v_opdr_key, 6, v_user_key); -- Facilitor
               ELSIF rec.status = 6 AND v_opdr_status = 8
               THEN
                  -- Meld de opdracht af als deze geaccepteerd was
                  mld.setopdrachtstatus (v_opdr_key, 6, v_user_key); -- Facilitor
               ELSIF rec.status = 1 AND v_opdr_status = 5
               THEN
                  -- Opdracht is afgewezen op het moment dat de opdracht nog niet geaccepteerd is.
                  mld.setopdrachtstatus (v_opdr_key, 1, v_user_key); -- Facilitor
                  mld.updatemeldingstatusav (v_mld_key,
                                             0,
                                             v_user_key,
                                             0);
               ELSIF rec.status = 1 AND v_opdr_status = 8
               THEN
                  -- Opdracht is afgewezen op het moment dat de opdracht al geaccepteerd is.
                  mld.setopdrachtstatus (v_opdr_key, 6, v_user_key); -- Facilitor
               --MLD.updatemeldingstatusAV (v_mld_key, 0, v_user_key, 0);
               ELSIF rec.status = 9 AND v_opdr_status = 6
               THEN
                  -- Opdracht is afgerond en opdrachtstatus was afgemeld.
                  mld.setopdrachtstatus (v_opdr_key, 9, v_user_key); -- Facilitor
               END IF;

               IF rec.status = 6 AND v_opdr_status <> 6
               THEN
                  -- Als er geen open opdrachten zijn wordt de melding afgemeld.
                  MLD.updatemeldingstatusAV (v_mld_key, 1, v_user_key, 0);

                  SELECT mld_melding_status
                    INTO v_melding_status
                    FROM mld_melding
                   WHERE mld_melding_key = v_mld_key;

                  IF v_melding_status = 5
                  THEN
                     UPDATE mld_melding
                        SET mld_melding_opmerking = rec.opmerking || CHR (10) || CHR (13) || mld_melding_opmerking
                      WHERE mld_melding_key = v_mld_key;
                  END IF;
               ELSE
                  IF rec.status = 9 AND v_opdr_status <> 9
                  THEN
                     -- Oorspronkelijke gegevens opdracht ophalen.
                     -- var opdr_info = mld.mld_opdr_info(opdr_key);
                     SELECT mld_opdr_kosten,
                            mld_typeopdr_gvs,
                            mld_kosten_klant,
                            m.prs_kostenplaats_key,
                            o.prs_kostenplaats_key,
                            m.prs_perslid_key,
                            std.mld_ins_discipline_key
                       INTO v_opdr_kosten,
                            v_typeopdr_gvs,
                            v_mld_kk,
                            v_mld_kostenpl_key,
                            v_opdr_kostenpl_key,
                            v_mld_perslid_key,
                            v_mld_disc_key
                       FROM mld_opdr o,
                            mld_melding m,
                            mld_typeopdr t,
                            mld_stdmelding std
                      WHERE o.mld_melding_key = m.mld_melding_key
                        AND m.mld_stdmelding_key = std.mld_stdmelding_key
                        AND o.mld_typeopdr_key = t.mld_typeopdr_key
                        AND o.mld_opdr_key = v_opdr_key;

                     -- Hergoedkeuring (Ter goedkeuring) wordt (pas) vereist als het opdrachtbedrag hoger is dan al is goedgekeurd en boven de GVS-grens uitkomt.
                     -- Herfiattering (Ter fiattering) wordt (pas) vereist indien het bedrag boven het mandaat van de oorspronkelijke (laatste) fiatteur uitkomt
                     -- en boven de GVS-grens uitkomt.
                     -- Hergoedkeuring en herfiattering kan alleen als het totaalbedrag van de opdracht is verhoogd en alleen in de statussen 5, 8, 6 en 9 (de uitvoeringsfase en de afhandelingsfase).
                     -- Hergoedkeuring en herfiattering kan leiden tot een tijdelijke terugkeer naar de voorfase status 3 of 10.
                     IF rec.totaal > v_opdr_kosten
                     THEN
                        fac.imp_writelog (p_import_key, 'I', 'rec.totaal > v_opdr_kosten: ' || rec.totaal || ' - ' || v_opdr_kosten, '');

                        -- Hergoedkeuring (Ter goedkeuring) wordt (pas) vereist als het opdrachtbedrag hoger is dan al is goedgekeurd en boven de GVS-grens uitkomt.
                        IF rec.totaal > COALESCE (v_opdr_approved, 0) AND rec.totaal > v_typeopdr_gvs
                        THEN
                           v_reapprove := 1;
                        ELSE
                           v_reapprove := 0;
                        END IF;

                        fac.imp_writelog (p_import_key, 'I', 'hergoedkeuring: ' || v_reapprove || ' - ' || v_opdr_approved || ' - ' || v_typeopdr_gvs, '');


                        -- Herfiattering (Ter fiattering) wordt (pas) vereist indien het bedrag boven het mandaat van de oorspronkelijke (laatste) fiatteur uitkomt
                        -- en boven de GVS-grens uitkomt.
                        -- Bepaal het mandaat van de oorspronkelijke (laatste) fiatteur.
                        -- Ook als er de vorige keer geen kosten waren dan moet pas worden geherfiatteerd als (tot_kosten > mandaat),
                        -- waarbij de mandaat van de Melder/aanvrager van melding of de user is.
                        v_perslid_key := NULL;

                        IF rec.totaal > v_opdr_kosten AND rec.totaal > 0 AND rec.totaal > v_typeopdr_gvs
                        THEN
                           fac.imp_writelog (p_import_key, 'I', 'F - rec.totaal > v_opdr_kosten: ' || rec.totaal || ' - ' || v_opdr_kosten || ' - ' || v_typeopdr_gvs, '');
                           -- De totale kosten zijn verhoogd en het bedrag zit boven de GVS-grens.
                           -- Bepaling oorspronkelijke (laatste) fiatteur, als die er was.
                           v_perslid_key := NULL;

                           FOR rec2 IN cp (v_opdr_key)
                           LOOP
                              BEGIN
                                 v_perslid_key := rec2.prs_perslid_key;
                              END;
                           END LOOP;

                           fac.imp_writelog (p_import_key, 'I', 'F - laatste fiatteur: ' || v_perslid_key, '');

                           IF v_perslid_key IS NULL
                           THEN
                              -- Dan waren de opdracht kosten onder het mandaat van mijzelf of de BO-medewerker.
                              -- Als de kostenplaats bij de opdracht overruled is dan wordt altijd tegen het profiel van de BO-medewerker getest.
                              IF v_mld_kk = 1
                             AND v_mld_kostenpl_key = v_opdr_kostenpl_key
                              THEN
                                 v_perslid_key := v_mld_perslid_key; -- Melder/aanvrager van melding
                              END IF;
                           END IF;

                           fac.imp_writelog (p_import_key, 'I', 'F - indien onbekend terugvallen op melder: ' || v_perslid_key, '');


                           IF    fac.getsetting ('mld_use_order_approval') = 1
                             AND (rec.totaal >
                                     fac.getsetting ('can_selfapprove')
                               OR rec.totaal >
                                     prs.getprofiellimiet (v_perslid_key, v_mld_disc_key))
                           THEN
                              -- Er moet (opnieuw) gefiatteerd worden. Is er wel iemand met voldoende mandaat? Indien er niemand gevonden kan worden mag de wijziging niet doorgaan.
                              -- Het mandaat is al te hoog voor de melder/aanvrager van de melding of mijzelf.

                              v_approver_key :=
                                 prs.getkpverantwoordelijke (
                                    v_opdr_kostenpl_key,
                                    fac.getsetting ('prs_approvemethod'),
                                    v_user_key);
                              v_refiat := 1;
                              -- er moet (her)fiattering plaatsvinden
                              fac.imp_writelog (p_import_key, 'I', 'F - (her)fiatteur: ' || v_approver_key, '');
                           END IF;
                        END IF;
                     END IF;

                     IF v_reapprove = 1 OR v_refiat = 1
                     THEN
                        -- Zet de refiat waarden. Het hergoedkeurings- en/of herfiatteringstraject wordt opnieuw ingegaan. // Tracking hiervan is niet nodig.
                        IF v_opdr_kosten > 0
                        THEN
                           UPDATE mld_opdr
                              SET mld_opdr_materiaal_refiat = mld_opdr_materiaal,
                                  mld_opdr_kosten_refiat = mld_opdr_kosten
                            WHERE mld_opdr_key = v_opdr_key;
                        END IF;

                        -- Ook voor status 5 wordt refiatstatus gezet zodat bekend is dat het om een herfiattering gaat. De fiatteringsvoorwaarde is dan iets anders.
                        UPDATE mld_opdr
                           SET mld_statusopdr_key_refiat = mld_statusopdr_key
                         WHERE mld_opdr_key = v_opdr_key;

                        -- Goedkeuring opnieuw ingaan kan alleen als het approved bedrag leeg is.
                        UPDATE mld_opdr
                           SET mld_opdr_approved_refiat = mld_opdr_approved
                         WHERE mld_opdr_key = v_opdr_key;

                        UPDATE mld_opdr
                           SET mld_opdr_approved = NULL,
                               mld_opdr_materiaal = rec.totaal,
                               mld_opdr_kosten = rec.totaal
                         WHERE mld_opdr_key = v_opdr_key;
                     ELSE
                        UPDATE mld_opdr
                           SET mld_opdr_materiaal = rec.totaal,
                               mld_opdr_kosten  = rec.totaal
                         WHERE mld_opdr_key = v_opdr_key;
                     END IF;

                     -- geef in de tracking aan dat de kosten via de interface aangepast zijn.
                     IF v_opdr_kosten <> rec.totaal
                     THEN
                        fac.trackaction ('ORDUPD', v_opdr_key, v_user_key, SYSDATE,
                              'Gewijzigd' || CHR (13) || CHR (10)
                           || 'Materiaal: ' || v_opdr_kosten || ' --> ' || rec.totaal || CHR (13) || CHR (10)
                           || 'Totaal: ' || v_opdr_kosten || ' --> ' || rec.totaal);
                     END IF;

                     IF v_reapprove = 1
                     THEN
                        -- Zetten van de status van de gewijzigde opdracht op "Ter goedkeuring" en afhandelen van de tracking (status + uitvoerende tracking) en daarmee notificatie.
                        -- status = 10;  Ter goedkeuring.
                        mld.setopdrachtstatus (v_opdr_key, 10, v_user_key);
                     ELSE
                        IF v_refiat = 1
                        THEN
                           -- Zetten van de status van de gewijzigde opdracht op "Ter fiattering" en afhandelen van de tracking (status + uitvoerende tracking) en daarmee notificatie.
                           -- status = 3; // Ter fiattering.
                           mld.setopdrachtstatus (v_opdr_key, 3, v_user_key);
                        END IF;
                     END IF;
                  END IF;
               END IF;
            END IF;
         END IF;

         COMMIT;
      EXCEPTION
         WHEN OTHERS
         THEN
            oracle_err_num := SQLCODE;
            oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
            v_errormsg :=
                  v_errormsg
               || ' ORACLE (error '
               || oracle_err_num
               || '/'
               || oracle_err_mes
               || ')';
            fac.imp_writelog (p_import_key,
                              'E',
                              v_aanduiding || v_errormsg,
                              'Fout bij verwerken opdrachtstatusbericht.');
      END;
   END LOOP;

   COMMIT;
END;
/

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