--
-- $Id$
--
-- Script containing customer specific sql statements for the FACILITOR database

DEFINE thisfile = 'impu.SQL'
DEFINE dbuser   = 'IMPU'

SET ECHO ON
SET DEFINE ON
COLUMN fcltlogfile NEW_VALUE fcltlogfile NOPRINT;
COLUMN fcltcusttxt NEW_VALUE fcltcusttxt NOPRINT;
WHENEVER SQLERROR CONTINUE;
SELECT adm.getscriptspoolfile('&thisfile') AS fcltlogfile FROM DUAL;
SPOOL &fcltlogfile
WHENEVER SQLERROR EXIT;
SELECT adm.checkscriptcust('&dbuser') AS fcltcusttxt FROM DUAL;
WHENEVER SQLERROR CONTINUE;
---------------------------------------
PROMPT &fcltcusttxt
---------------------------------------
SET DEFINE OFF

------ payload begin ------

-------------------------------
--- DOMEIN-VIEWS --------------
-------------------------------

CREATE OR REPLACE VIEW impu_v_kostenplaatsen
(
    KEY,
    NR,
    OMSCHRIJVING
)
AS
    SELECT
       kp.prs_kostenplaats_key,
       kp.prs_kostenplaats_nr,
       kp.prs_kostenplaats_nr || ' ' || kp.prs_kostenplaats_omschrijving
         omschrijving
    FROM
    prs_kostenplaats    kp,
    prs_kostenplaatsgrp kpg
    WHERE
    kp.prs_kostenplaatsgrp_key = kpg.prs_kostenplaatsgrp_key
    AND kp.prs_kostenplaats_verwijder IS NULL
    AND (kp.prs_kostenplaats_eind IS NULL OR kp.prs_kostenplaats_eind > TRUNC(SYSDATE) )
    AND kp.prs_kostenplaats_module = 'ALG'
    ORDER BY kpg.prs_kostenplaatsgrp_oms || ' - ' || kp.prs_kostenplaats_nr || ' ' || kp.prs_kostenplaats_omschrijving
    ;

-- Voor keuzelijstjes (kenmerk domein)
CREATE OR REPLACE VIEW impu_v_personenlijst
(
    PRS_PERSLID_KEY,
    NAAM,
    PERSONEELSNUMMER,
    EMAIL
)
AS
    SELECT
       p.prs_perslid_key,
       CASE WHEN p.prs_perslid_tussenvoegsel IS NULL
            THEN p.prs_perslid_voornaam || ' ' || p.prs_perslid_naam
            ELSE p.prs_perslid_voornaam || ' ' || p.prs_perslid_tussenvoegsel || ' ' || p.prs_perslid_naam
            END
         naam,
       p.prs_perslid_nr,
       p.prs_perslid_email
    FROM
    prs_perslid    p,
    prs_srtperslid sp,
    prs_v_afdeling a,
    prs_bedrijf    b
    WHERE
    p.prs_afdeling_key = a.prs_afdeling_key
    AND a.prs_bedrijf_key = b.prs_bedrijf_key  
    AND b.prs_bedrijf_key = 21  --  bedrijfs_key IMPULS
    AND p.prs_srtperslid_key = sp.prs_srtperslid_key
    AND UPPER(sp.prs_srtperslid_omschrijving) NOT IN ('TEAMACCOUNT')
    AND p.prs_perslid_verwijder IS NULL
    ORDER BY p.prs_perslid_naam
    ;

-- Lijst van Locatiemanagers + Regiomanagers + Tijdelijke waarnemers (tbv domeinview)
CREATE OR REPLACE VIEW impu_v_personenlijst_loc
(
    PRS_PERSLID_KEY,
    NAAM,
    PERSONEELSNUMMER,
    EMAIL
)
AS
    SELECT
       p.prs_perslid_key,
       CASE WHEN p.prs_perslid_tussenvoegsel IS NULL
            THEN p.prs_perslid_voornaam || ' ' || p.prs_perslid_naam || ' (' || sp.prs_srtperslid_omschrijving || ')' 
            ELSE p.prs_perslid_voornaam || ' ' || p.prs_perslid_tussenvoegsel || ' ' || p.prs_perslid_naam || ' (' || sp.prs_srtperslid_omschrijving || ')'
            END
         naam,
       p.prs_perslid_nr,
       p.prs_perslid_email
    FROM
    prs_perslid    p,
    prs_srtperslid sp,
    prs_v_afdeling a,
    prs_bedrijf    b
    WHERE
    p.prs_afdeling_key = a.prs_afdeling_key
    AND a.prs_bedrijf_key = b.prs_bedrijf_key  
    AND b.prs_bedrijf_key = 21  --  bedrijfs_key IMPULS
    AND p.prs_srtperslid_key = sp.prs_srtperslid_key
    AND (INSTR(UPPER(sp.prs_srtperslid_omschrijving),'LOCATIEMANAGER') > 0 OR INSTR(UPPER(sp.prs_srtperslid_omschrijving),'REGIOMANAGER') > 0 OR INSTR(UPPER(sp.prs_srtperslid_omschrijving),'TEAMLEIDER') > 0)    -- Titels uit AFAS die meelopen in Locatiemanager-verhaal zijn: Locatiemanager + Locatiemanager IKC  + Regiomanager + Teamleider
    AND p.prs_perslid_verwijder IS NULL
   UNION
   SELECT 
       p.prs_perslid_key,
       CASE WHEN p.prs_perslid_tussenvoegsel IS NULL
            THEN p.prs_perslid_voornaam || ' ' || p.prs_perslid_naam || ' (Waarnemer - ' || sp.prs_srtperslid_omschrijving || ')' 
            ELSE p.prs_perslid_voornaam || ' ' || p.prs_perslid_tussenvoegsel || ' ' || p.prs_perslid_naam || ' (Waarnemer - ' || sp.prs_srtperslid_omschrijving || ')'
            END
         naam,
       p.prs_perslid_nr,
       p.prs_perslid_email
    FROM
    prs_perslid    p,
    prs_srtperslid sp,
    prs_v_afdeling a,
    prs_bedrijf    b,
    prs_kenmerklink kl
    WHERE
    p.prs_afdeling_key = a.prs_afdeling_key
    AND a.prs_bedrijf_key = b.prs_bedrijf_key
    AND p.prs_srtperslid_key = sp.prs_srtperslid_key
    AND p.prs_perslid_key = kl.prs_link_key
    AND kl.prs_kenmerk_key = 1021 -- kenmerk waarnemer (vinkbox)
    AND kl.prs_kenmerklink_waarde = '1' AND kl.prs_kenmerklink_verwijder IS NULL  
    AND p.prs_perslid_verwijder IS NULL ;
    
-- Lijst van Locatiemanagers + Regiomanagers en de locaties waar men verantwoordelijk is (tbv personen-import)
CREATE OR REPLACE VIEW impu_v_locatiemanagers
(
    PRS_PERSLID_KEY,
    ALG_LOCATIE_KEY,
    LOCATIEMANAGER,
    LOCATIE,
    PRS_PERSLID_VERWIJDER
)
AS
   SELECT p.prs_perslid_key,
          l.alg_locatie_key,
          p.prs_perslid_naam || ' (' || p.prs_perslid_voornaam || ' ' || p.prs_perslid_tussenvoegsel || ') - ' || sp.prs_srtperslid_omschrijving  
           locatiemanager,
          l.alg_locatie_code || ' - ' || l.alg_locatie_omschrijving
           locatie,
          p.prs_perslid_verwijder
        FROM prs_perslid p, prs_srtperslid sp, alg_onrgoedkenmerk ok, alg_locatie l
       WHERE fac.safe_to_number(ok.alg_onrgoedkenmerk_waarde) = p.prs_perslid_key
             AND ok.alg_kenmerk_key IN (1016,1018) -- locatiemanagers en Regiomanagers
             AND ok.alg_onrgoedkenmerk_verwijder IS NULL
             AND ok.alg_onrgoed_niveau = 'L' AND ok.alg_onrgoed_key = l.alg_locatie_key
             AND (l.alg_locatie_verwijder IS NULL OR l.alg_locatie_vervaldatum > TRUNC(SYSDATE) )
             AND l.alg_locatie_verwijder IS NULL
             AND (TRUNC(l.alg_locatie_vervaldatum) > TRUNC(sysdate) OR l.alg_locatie_vervaldatum IS NULL ) 
             AND p.prs_srtperslid_key = sp.prs_srtperslid_key            
             GROUP BY p.prs_perslid_key, l.alg_locatie_key, 
                      p.prs_perslid_naam || ' (' || p.prs_perslid_voornaam || ' ' || p.prs_perslid_tussenvoegsel || ') - ' || sp.prs_srtperslid_omschrijving, 
                      l.alg_locatie_code || ' - ' || l.alg_locatie_omschrijving,
                      p.prs_perslid_verwijder   
       ; 


-- Lijst van Locatiemanagers + Regiomanagers en de Werkplekkoppeling die ze in hun persoonskaart hebben (tbv personen-import)
CREATE OR REPLACE VIEW impu_v_locatiemanagers_wp
(
    PRS_PERSLID_KEY,
    ALG_LOCATIE_KEY,
    NAAM,
    LOCATIE_WP,
    PRS_WERKPLEK_KEY
)
AS
    SELECT wp.prs_perslid_key,
           onr.alg_locatie_key,
           p.prs_perslid_naam_friendly,
           l.alg_locatie_code || ' - ' || l.alg_locatie_omschrijving
            locatie,
           w.prs_werkplek_key
        FROM (
             SELECT prs_perslid_key
               FROM impu_v_personenlijst_loc
               GROUP BY prs_perslid_key
               ) v, 
             prs_v_perslid_fullnames p, prs_perslidwerkplek wp, prs_werkplek w, alg_ruimte r, alg_v_onrgoed_boom onr, alg_locatie l
       WHERE v.prs_perslid_key = p.prs_perslid_key
         AND p.prs_perslid_key = wp.prs_perslid_key
         AND wp.prs_werkplek_key = w.prs_werkplek_key
         AND w.prs_alg_ruimte_key = r.alg_ruimte_key
         AND r.alg_ruimte_key = onr.alg_ruimte_key
         AND onr.alg_locatie_key = l.alg_locatie_key
         ORDER BY wp.prs_perslid_key ;

CREATE OR REPLACE VIEW impu_v_ict_nummers
(
    INS_DEEL_KEY,
    INS_DEEL_UPPER
)
AS
SELECT
    v.ins_deel_key,
    v.ins_deel_upper    
FROM ins_v_deel_gegevens v, ins_deel d 
WHERE v.ins_discipline_key = 62 -- ICT-Nummers
   AND v.ins_deel_key = d.ins_deel_key
   AND d.ins_deel_verwijder IS NULL
   AND (d.ins_deel_vervaldatum IS NULL OR TRUNC(d.ins_deel_vervaldatum) > TRUNC(sysdate) ) ;


CREATE OR REPLACE PROCEDURE impu_import_afasonline (p_import_key IN NUMBER)
AS
    oracle_err_num            NUMBER;
    oracle_err_mes            VARCHAR2 (200);
    v_errormsg                VARCHAR2 (400);
    v_errorhint               VARCHAR2 (400);
    v_aantal_in_fclt          NUMBER;

    -- overige variabelen
    v_prs_afdeling_key        NUMBER (10);
    c_prs_afdeling_key        NUMBER (10) := 22; -- Fallback-afdeling 'OVERIG voor Medewerkers Impuls'
    c_prs_afdeling_key_leid   NUMBER (10) := 21; -- Afdeling waaronder Locatiemanagers en Regiomanagers komen te vallen
    v_alg_locatie_key         NUMBER (10);
    v_alg_locatie_code        VARCHAR2 (10);
    v_alg_gebouw_key          NUMBER (10);
    v_alg_gebouw_code         VARCHAR2 (12);
    v_alg_verdieping_key      NUMBER (10);
    v_alg_verdieping_volgnr   NUMBER (3);
    v_alg_ruimte_key          NUMBER (10);
    v_alg_ruimte_nr           VARCHAR2 (20);


    CURSOR c_afd
    IS
        SELECT fac_imp_file_index,
               prs_kenmerk1,
               prs_afdeling_naam,
               prs_srtperslid_omschrijving
          FROM fac_imp_perslid
         WHERE fac_import_key = p_import_key;

    CURSOR c_tel
    IS
        SELECT p.prs_perslid_email,
               pp.prs_perslid_telefoonnr,
               pp.prs_perslid_mobiel
          FROM fac_imp_perslid p, prs_perslid pp
         WHERE     p.prs_perslid_email = pp.prs_perslid_email
               AND (   pp.prs_perslid_telefoonnr IS NOT NULL
                    OR pp.prs_perslid_mobiel IS NOT NULL);

    CURSOR c_loc
    IS
        SELECT fac_imp_file_index, prs_kenmerk4
          FROM fac_imp_perslid
         WHERE fac_import_key = p_import_key;
BEGIN
    -- Het aangeleverde bestand heeft de gegevens komma gescheiden ipv ;
    v_errorhint := 'Delimiter goed zetten';

    -- UPDATE fac_imp_file
    --   SET fac_imp_file_line = REPLACE (fac_imp_file_line, ',', ';')
    -- WHERE fac_import_key = p_import_key;

    -- Het aangeleverde bestand heeft aanhalingstekens om de invoervelden..
    UPDATE fac_imp_file
       SET fac_imp_file_line = REPLACE (fac_imp_file_line, '"', '')
     WHERE fac_import_key = p_import_key;


    v_errorhint := 'Generieke update';
    -- De sequence array staat beschreven in PRS_PAC.SRC bij de prs.import_perslid procedure
    -- Voor IMPULS geldt:
    ---
    prs.import_perslid (
        p_import_key,
           '0;0;0;0;0;0;1;2;3;5;'
        || '4;0;0;0;0;0;0;6;0;8;'
        || '7;0;0;0;0;0;9;10;11;12;'
        || '0;13;0;0;0;0;0;0;0;0;'
        || '0;0;0;0;0;0',
        'Kostenplaats;Achternaam;Voorvoegsel;Voorletters;Roepnaam;E-Mail_werk;Omschrijving_Functie;Medewerker;Organisatorische_eenheid_omschrijving;Kostenplaats_2;Datum_in_dienst;Datum_uit_dienst;Soort_medewerker');
    -- AFASONLINE:   "Kostenplaats";"Achternaam";"Voorvoegsel";"Voorletters";"Roepnaam";"E-Mail_werk";"Omschrijving_Functie";"Medewerker";"Organisatorische_eenheid_omschrijving";"Kostenplaats_2";"Datum_in_dienst";"Datum_uit_dienst";Soort_medewerker"
    --          1 (7)      2 (8)      3 (9)          4 (11)    5 (10)   6 (18)  7 (21)  8(20)          9 (27)                  10  (28)      11 (29)   12 (30)     13 (32)
    -- DEF: Kostenplaats;Achternaam;Voorvoegsel;Voorletters;Roepnaam;Mail werk;Functie;Medewerker;Organisatorische eenheid;Kostenplaats_oms;In dienst;Uit dienst;Soort medewerker


    v_errorhint := 'Login afleiden van emailadres';

    -- Loginnaam afleiden van emailadres
    UPDATE fac_imp_perslid
       SET prs_perslid_oslogin =
               UPPER (
                   (SUBSTR (prs_perslid_email,
                            0,
                            INSTR (prs_perslid_email, '@') - 1)))
     WHERE     UPPER (prs_perslid_email) LIKE '%IMPULS.NL'
           AND prs_perslid_email IS NOT NULL
           AND LENGTH (
                   (SUBSTR (prs_perslid_email,
                            0,
                            INSTR (prs_perslid_email, '@') - 1))) <=
               30;

    v_errorhint := 'Uitfilteren records'; -- in afasonline-bestand zitten aantal zaken die niet mee hoeven naar Facilitor

    ---- functie gevuld met PROFIT dan record delete
    ---- emailadres <leeg> en emailadres <> @impuls.nl dan record delete

    DELETE fac_imp_perslid
     WHERE UPPER (prs_srtperslid_omschrijving) IN ('PROFIT');

    DELETE fac_imp_perslid
     WHERE UPPER (prs_perslid_email) NOT LIKE '%@IMPULS.NL';

    v_errorhint := 'Afdeling bepalen en vullen';

    -- Afdeling bepalen waar persoon onder komt te vallen.
    -- Voor locatiemanagers en regiomanagers geldt dat deze altijd op organisatie 'OPVANG' moeten komen (onder dit organisatieonderdeel zitten op niveau 2 de team/afdelingen/kostenplaatsen)
    FOR rec IN c_afd
    LOOP
        BEGIN
            v_errorhint := 'Persoon aan Afdeling koppelen';

            -- Als locatie/regio-managerleider dan afdeling altijd LOCATIE (c_prs_afdeling_key_leid)
            IF    INSTR (UPPER (rec.prs_srtperslid_omschrijving),
                         'LOCATIEMANAGER') >
                  0
               OR INSTR (UPPER (rec.prs_srtperslid_omschrijving),
                         'REGIOMANAGER') >
                  0
               OR INSTR (UPPER (rec.prs_srtperslid_omschrijving),
                         'TEAMLEIDER') >
                  0
            THEN
                UPDATE fac_imp_perslid
                   SET prs_afdeling_naam =
                           (SELECT prs_afdeling_upper
                              FROM prs_afdeling
                             WHERE prs_afdeling_key = c_prs_afdeling_key_leid)
                 WHERE fac_imp_file_index = rec.fac_imp_file_index;
            ELSE
                SELECT MIN (a.prs_afdeling_key)
                  INTO v_prs_afdeling_key
                  FROM prs_v_afdeling a, prs_kostenplaats kp
                 WHERE     kp.prs_kostenplaats_upper =
                           UPPER (rec.prs_afdeling_naam)
                       AND a.prs_bedrijf_key = 21            -- bedrijf IMPULS
                       AND a.prs_afdeling_verwijder IS NULL
                       AND a.prs_kostenplaats_key = kp.prs_kostenplaats_key;

                -- Als afdeling uit AFAS (nog) WEL bekend is in Facilitor dan medewerker op die afdeling zetten
                IF v_prs_afdeling_key IS NOT NULL
                THEN
                    -- prs_kenmerk5 vullen zodat deze AFAS-kostenplaats-waarde wel in personenkaart kan landen
                    UPDATE fac_imp_perslid
                       SET prs_kenmerk5 = prs_afdeling_naam
                     WHERE fac_imp_file_index = rec.fac_imp_file_index;

                    -- op de Facilitor-afdeling zetten
                    UPDATE fac_imp_perslid
                       SET prs_afdeling_naam =
                               (SELECT prs_afdeling_upper
                                  FROM prs_afdeling
                                 WHERE prs_afdeling_key = v_prs_afdeling_key)
                     WHERE fac_imp_file_index = rec.fac_imp_file_index;
                END IF;

                -- Als afdeling uit AFAS (nog) niet bekend is in Facilitor dan medewerker op afdeling OVERIG zetten
                IF v_prs_afdeling_key IS NULL
                THEN
                    -- kenmerk5 vullen zodat deze AFAS-kostenplaats-waarde wel in personenkaart kan landen
                    UPDATE fac_imp_perslid
                       SET prs_kenmerk5 = prs_afdeling_naam
                     WHERE fac_imp_file_index = rec.fac_imp_file_index;

                    -- op afdeling OVERIG zetten
                    UPDATE fac_imp_perslid
                       SET prs_afdeling_naam =
                               (SELECT prs_afdeling_upper
                                  FROM prs_afdeling
                                 WHERE prs_afdeling_key = c_prs_afdeling_key)
                     WHERE fac_imp_file_index = rec.fac_imp_file_index;
                END IF;
            END IF;
        END;
    END LOOP;

    FOR rec IN c_tel
    LOOP
        -- Telefoonnummers voert men zelf in Facilitor handmatig in en zitten dus niet in importbestand.
        -- We vullen daarom deze aan in de fac_imp_perslid
        v_errorhint :=
               'Telefoonnummer toevoegen aan import-tabel'
            || '-'
            || rec.prs_perslid_email;

        IF rec.prs_perslid_telefoonnr IS NOT NULL
        THEN
            UPDATE fac_imp_perslid p
               SET p.prs_perslid_telefoonnr = rec.prs_perslid_telefoonnr
             WHERE p.prs_perslid_email = rec.prs_perslid_email;
        END IF;

        IF rec.prs_perslid_mobiel IS NOT NULL
        THEN
            UPDATE fac_imp_perslid p
               SET p.prs_perslid_mobiel = rec.prs_perslid_mobiel
             WHERE p.prs_perslid_email = rec.prs_perslid_email;
        END IF;
    END LOOP;

    v_errorhint := 'Locatie bepalen en vullen';
    -- Default Locatie / Standplaats bepalen voor persoon  => ACTIE - Indien gewenst dan kan dit voor IMPULS nog netjes via de kostenplaatsen in de Locatiekaart ingepast worden
    /*
     FOR rec IN c_loc
       LOOP
         BEGIN

         v_errorhint := 'Persoon aan Locatie-Ruimte koppelen';
         v_alg_locatie_key := NULL;
         v_alg_gebouw_key  := NULL;
         v_alg_verdieping_key := NULL;
         v_alg_ruimte_key := NULL;

         SELECT min(alg_locatie_key)
         INTO v_alg_locatie_key
         FROM alg_locatie
         WHERE UPPER(alg_locatie_omschrijving) = UPPER(rec.prs_kenmerk4)
           AND (TRUNC(alg_locatie_vervaldatum) > TRUNC(sysdate) OR alg_locatie_vervaldatum IS NULL )
           AND alg_locatie_verwijder IS NULL ;

         IF v_alg_locatie_key IS NOT NULL THEN

            -- Locatie_code ophalen
            SELECT alg_locatie_code
              INTO v_alg_locatie_code
              FROM alg_locatie
             WHERE alg_locatie_key = v_alg_locatie_key ;

            -- Gebouw_key ophalen
            SELECT min(alg_gebouw_key)
              INTO v_alg_gebouw_key
              FROM alg_gebouw
             WHERE alg_locatie_key = v_alg_locatie_key
               AND alg_gebouw_verwijder IS NULL
               AND (TRUNC(alg_gebouw_vervaldatum) > TRUNC(sysdate) OR alg_gebouw_vervaldatum IS NULL ) ;

            -- Om bij update dit kenmerkveld weg te kunnen schrijven naar kenmerkveld 'default standplaats'
            UPDATE fac_imp_perslid
               SET prs_kenmerk6 = (SELECT UPPER(alg_locatie_code) || alg_locatie_omschrijving FROM alg_locatie WHERE alg_locatie_key = v_alg_locatie_key)
             WHERE fac_imp_file_index = rec.fac_imp_file_index ;

             IF v_alg_gebouw_key IS NOT NULL THEN

                -- Gebouw_code ophalen
                SELECT alg_gebouw_code
                  INTO v_alg_gebouw_code
                  FROM alg_gebouw
                 WHERE alg_gebouw_key = v_alg_gebouw_key ;

                -- Verdiepings_key ophalen
                SELECT min(alg_verdieping_key)
                  INTO v_alg_verdieping_key
                  FROM alg_verdieping
                 WHERE alg_gebouw_key = v_alg_gebouw_key
                  AND alg_verdieping_verwijder IS NULL ;

              END IF;

                 IF v_alg_verdieping_key IS NOT NULL THEN

                 -- Verdieping_volgnr ophalen
                 SELECT alg_verdieping_volgnr
                   INTO v_alg_verdieping_volgnr
                   FROM alg_verdieping
                  WHERE alg_verdieping_key = v_alg_verdieping_key ;

                 -- Ruimte_key ophalen
                 SELECT min(alg_ruimte_key)
                   INTO v_alg_ruimte_key
                   FROM alg_ruimte
                  WHERE alg_verdieping_key = v_alg_verdieping_key
                    AND alg_ruimte_verwijder IS NULL ;

                 END IF;

                     IF v_alg_ruimte_key IS NOT NULL THEN

                     -- Ruimte_nr ophalen
                     SELECT alg_ruimte_nr
                       INTO v_alg_ruimte_nr
                       FROM alg_ruimte
                      WHERE alg_ruimte_key = v_alg_ruimte_key ;

                     -- Vullen vastgoed-keten in import-tabel
                     UPDATE fac_imp_perslid
                        SET alg_locatie_code = v_alg_locatie_code,
                            alg_gebouw_code = v_alg_gebouw_code,
                            alg_verdieping_volgnr = v_alg_verdieping_volgnr,
                            alg_ruimte_nr = v_alg_ruimte_nr
                      WHERE fac_imp_file_index = rec.fac_imp_file_index ;

                     END IF;

         ELSE
         -- Geen Locatie/Vastgoedketen kunnen vinden

            UPDATE fac_imp_perslid
               SET prs_kenmerk6 = 'LOCATIE ONBEKEND'
             WHERE fac_imp_file_index = rec.fac_imp_file_index ;

         END IF;

       END;
     END LOOP;
     */


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

CREATE OR REPLACE PROCEDURE impu_update_afasonline (p_import_key IN NUMBER)
IS
   -- Alle personen verwijderen die niet meer in het import bestand voorkomen.
   -- Teamaccounts (functie 'Teamaccount' laten we ongemoeid)
   -- Personen in de juiste autorisatiegroep zetten.
   -- Match bij IMPULS KINDEROPVANG kan via Email of Personeelsnummer.
   -- Geen acties tenzij het aantal records in de importtabel meer dan 100 medewerkers betreft.

   CURSOR c_del
   IS
      SELECT p.prs_perslid_key, p.prs_perslid_naam, p.prs_perslid_email, p.prs_perslid_nr, sp.prs_srtperslid_omschrijving
        FROM prs_perslid p, prs_srtperslid sp, prs_v_afdeling_boom a 
       WHERE UPPER (p.prs_perslid_email) LIKE '%IMPULS.NL'
             AND p.prs_perslid_verwijder IS NULL
             AND p.prs_afdeling_key = a.prs_afdeling_key AND a.prs_bedrijf_key = 21  -- Impuls Kinderopvang
             AND p.prs_srtperslid_key = sp.prs_srtperslid_key AND sp.prs_srtperslid_upper NOT IN 'TEAMACCOUNT' 
             AND NOT EXISTS (SELECT 1 FROM fac_imp_perslid WHERE INSTR(UPPER (p.prs_perslid_email),UPPER (prs_perslid_email) ) > 0 )
       ORDER BY 1 ;        

   CURSOR c_flex -- Voor updaten van de algemene flex-kenmerkvelden op actuele medewerkers
   IS
        SELECT p.prs_perslid_key, i.prs_kenmerk1, i.prs_kenmerk2, i.prs_kenmerk3, i.prs_kenmerk4, i.prs_kenmerk5, i.prs_kenmerk6
          FROM prs_v_aanwezigperslid p, fac_imp_perslid i
         WHERE p.prs_perslid_key = i.prs_perslid_key
      ORDER BY 1;

   CURSOR c_loc -- Voor updaten van locatieleiders (in eigen autorisatiegroep)
   IS
        SELECT v.prs_perslid_key
          FROM impu_v_locatiemanagers v
      GROUP BY v.prs_perslid_key ;

   CURSOR c_loc_wp -- Voor updaten van locatieleiders (werkplek-koppelingen) 
   IS
   SELECT v.prs_perslid_key, v.alg_locatie_key, v.prs_werkplek_key, v.actie
     FROM
        (
         SELECT man.prs_perslid_key, man.alg_locatie_key, NULL prs_werkplek_key, 'toevoegen' actie
           FROM impu_v_locatiemanagers man
          WHERE NOT EXISTS
             (SELECT *
                FROM impu_v_locatiemanagers_wp wp
               WHERE     wp.alg_locatie_key = man.alg_locatie_key
                     AND wp.prs_perslid_key = man.prs_perslid_key)
         UNION
        SELECT wp.prs_perslid_key, wp.alg_locatie_key, wp.prs_werkplek_key, 'verwijderen' actie
          FROM impu_v_locatiemanagers_wp wp
         WHERE NOT EXISTS
             (SELECT *
                FROM impu_v_locatiemanagers man
               WHERE     man.alg_locatie_key = wp.alg_locatie_key
                     AND man.prs_perslid_key = wp.prs_perslid_key)
         UNION
        SELECT wp.prs_perslid_key, wp.alg_locatie_key, wp.prs_werkplek_key, 'ok' actie
          FROM impu_v_locatiemanagers_wp wp, impu_v_locatiemanagers man
         WHERE man.alg_locatie_key = wp.alg_locatie_key
               AND man.prs_perslid_key = wp.prs_perslid_key 
      ) v
   ORDER BY v.prs_perslid_key, v.alg_locatie_key
           ;

             
   v_count            NUMBER;
   oracle_err_num     NUMBER;
   oracle_err_mes     VARCHAR2 (200);
   v_errormsg         VARCHAR2 (400);
   v_errorhint        VARCHAR2 (400);

   v_fac_gebruikersgroep_key NUMBER(10);
   v_alg_ruimte_key   NUMBER;
   v_prs_werkplek_key NUMBER;
   

BEGIN
   v_errorhint := 'Niet genoeg personen in bestand, import afgebroken';

   SELECT COUNT ( * ) INTO v_count FROM fac_imp_perslid;

   IF v_count >= 100
   THEN
      v_errorhint := 'Verwerken persoonsgegevens';

      -- Geldig importbestand wat betreft aantal personen

      COMMIT;

      -- generic update
      -- 'EMAIL' betekent dat op basis van Email wordt gematched.
      -- 'NULL' betekent altijd geen werkplekken verwijderen
      prs.update_perslid (p_import_key, 'EMAIL', NULL);

      v_errorhint := 'Verwijderen persoonsgegevens';

      -- Verwijder personen die niet meer in de import voorkomen.
      FOR rec IN c_del
      LOOP
         BEGIN
            prs.delete_perslid (p_import_key, rec.prs_perslid_key);
         END;
      END LOOP;
      
      FOR rec IN c_flex
      LOOP
         BEGIN
            v_errorhint:='Fout bijwerken kenmerkveld1 - OE-Standplaats Afas';
            PRS.upsertkenmerk (1001, rec.prs_perslid_key, rec.prs_kenmerk1);

            v_errorhint:='Fout bijwerken kenmerkveld2 - Kostenplaats_oms';
            PRS.upsertkenmerk (1002, rec.prs_perslid_key, rec.prs_kenmerk2);

            v_errorhint:='Fout bijwerken kenmerkveld3 - DatumInDienst';
            PRS.upsertkenmerk (1004, rec.prs_perslid_key, rec.prs_kenmerk3);

            v_errorhint:='Fout bijwerken kenmerkveld4 - DatumUitDienst';
            PRS.upsertkenmerk (1005, rec.prs_perslid_key, rec.prs_kenmerk4);

            v_errorhint:='Fout bijwerken kenmerkveld5 - Kostenplaats';
            PRS.upsertkenmerk (1003, rec.prs_perslid_key, rec.prs_kenmerk5);

            v_errorhint:='Fout bijwerken kenmerkveld5 - Soort Medewerker';
            PRS.upsertkenmerk (1006, rec.prs_perslid_key, rec.prs_kenmerk6);
            

         END;
      END LOOP;

      FOR rec IN c_loc
      LOOP
         BEGIN
            -- Alle locatiemanagers toevoegen aan eigen autorisatiegroep'
            v_errorhint:='Fout bijwerken locatiemanagers in eigen autorisatiegroep';

            BEGIN
            
            SELECT fac_gebruikersgroep_key
              INTO v_fac_gebruikersgroep_key
              FROM fac_gebruikersgroep
             WHERE fac_groep_key = 22 -- Groep 'Locatie- en Regiomanagers'
                   AND prs_perslid_key = rec.prs_perslid_key ;              
            EXCEPTION
              WHEN NO_DATA_FOUND
              THEN 
              
                 INSERT INTO fac_gebruikersgroep (fac_groep_key,
                                               prs_perslid_key)
                        VALUES (22, rec.prs_perslid_key);
            
            END;

            
         END;
      END LOOP;

      FOR rec IN c_loc_wp
      LOOP
         BEGIN
            
            IF rec.actie = 'toevoegen'
            THEN
            v_errorhint:='Fout bij toevoegen werkplekken';
            
               BEGIN
            
                 SELECT MIN(r.alg_ruimte_key)
                   INTO v_alg_ruimte_key
                   FROM alg_ruimte r, alg_verdieping v, alg_gebouw g
                  WHERE r.alg_verdieping_key = v.alg_verdieping_key AND v.alg_gebouw_key = g.alg_gebouw_key
                    AND r.alg_ruimte_verwijder IS NULL AND v.alg_verdieping_verwijder IS NULL AND g.alg_gebouw_verwijder IS NULL
                    AND g.alg_locatie_key = rec.alg_locatie_key ;
               
                 IF v_alg_ruimte_key IS NOT NULL
                 THEN       

                    -- PROCEDURE movetoruimte (p_prs_key IN NUMBER, p_ruimte_key IN NUMBER, p_alg_type IN VARCHAR2, p_virtual IN NUMBER DEFAULT 0);                      
                    BEGIN
                    PRS.movetoruimte (rec.prs_perslid_key,
                                      v_alg_ruimte_key,
                                      'L',
                                      1);
                    END;
                    
                 END IF;
               END;
            
            END IF;
            
            IF rec.actie = 'verwijderen'
            THEN
            v_errorhint:='Fout bij verwijderen werkplekken';

               DELETE prs_werkplek WHERE prs_werkplek_key = rec.prs_werkplek_key;
            
            END IF;

         END;
      END LOOP;

      
   ELSE
      fac.imp_writelog (p_import_key,
                        'E',
                        v_errormsg,
                        v_errorhint);
      COMMIT;
   END IF;

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


-------------------------------
--- RAPPORTAGES ---------------
-------------------------------

-- ICT-nummer - beheer
CREATE OR REPLACE VIEW impu_v_ict_nummers_man
(
    ICT_NUMMER,
    PROVIDER,
    STATUS,
    ICT_OBJECT,
    GEKOPPELD_AAN_TYPE,
    GEKOPPELD_AAN,
    NR_INS_DEEL_KEY,
    OBJ_INS_DEEL_KEY
)
AS
SELECT
nr.ins_deel_upper,
flx.getdomeinwaarde(21,flx.getflex('INS', 42, nr.ins_deel_key)) provider,
CASE WHEN d.ins_deel_upper IS NOT NULL THEN 'Gekoppeld' ELSE 'Vrij' END
 status,
d.ins_deel_upper,
d.gekoppeld_aan_type,
d.gekoppeld_aan,
nr.ins_deel_key,
d.ins_deel_key
FROM   (SELECT v.ins_deel_key,
               v.ins_deel_upper
          FROM ins_v_deel_gegevens v, ins_deel d 
         WHERE v.ins_discipline_key = 62 -- ICT-Nummers
           AND v.ins_deel_key = d.ins_deel_key
           AND d.ins_deel_verwijder IS NULL
           AND (d.ins_deel_vervaldatum IS NULL OR TRUNC(d.ins_deel_vervaldatum) > TRUNC(sysdate) )
           ) nr,
       (SELECT d.ins_deel_key,
               d.ins_deel_upper,
               kw.ins_kenmerkdeel_waarde,
               num.ins_deel_upper as nummer_gekoppeld,
               DECODE(d.ins_alg_ruimte_type, 'R', 'Locatie',
                                             'A', 'Afdeling',
                                             'P', 'Persoon/Teamaccount',
                                             '')
                gekoppeld_aan_type,
               v.alg_plaatsaanduiding,
               DECODE(d.ins_alg_ruimte_type, 'R', l.alg_locatie_omschrijving, v.alg_plaatsaanduiding)
                gekoppeld_aan
          FROM ins_deel         d,
               ins_kenmerkdeel  kw,
               ins_kenmerk      k,
               ins_deel         num,
               ins_v_deel_gegevens v,
               alg_locatie      l
         WHERE     d.ins_deel_key = kw.ins_deel_key
               AND kw.ins_kenmerk_key = k.ins_kenmerk_key
               AND k.ins_srtkenmerk_key = 6
               AND kw.ins_kenmerkdeel_verwijder IS NULL
               AND fac.safe_to_number (kw.ins_kenmerkdeel_waarde) =
                   num.ins_deel_key
               AND d.ins_deel_key = v.ins_deel_key
               AND d.ins_alg_locatie_key = l.alg_locatie_key(+)
               ) d
WHERE
   nr.ins_deel_upper = d.nummer_gekoppeld(+) ;


-- Rapportage Gebouwbeheer
CREATE OR REPLACE VIEW IMPU_V_ALG_ONROERENDGOED
(
    WIJK,
    LOCATIE,
    LOCATIE_CODE,
    LOCATIE_KEY,
    GEBOUW,
    -- gegevens uit locatiekaart
    LOCATIEMANAGER,
    REGIOMANAGER,
    CONTACT_TOELICHTING,
    GEBRUIKSRECHT,
    DIENST_AFVAL,
    DIENST_SCHOONMAAK,
    DIENST_TELEFONIE,
    EIGENAARSCHAP_TOELICHTING,
    KDV,
    VO,
    BSO,
    --
    VERDIEPING,
    RUIMTENR,
    RUIMTE_OMSCHRIJVING,
    RUIMTEFUNCTIE,
    BVO_M2,
    VLOERSOORT
    )
AS
      SELECT d.alg_district_omschrijving,
             l.alg_locatie_omschrijving,
             l.alg_locatie_code,
             l.alg_locatie_key,
             v.alg_gebouw_code || ' - ' || v.alg_gebouw_naam
              gebouw,
             km.locatiemanager,
             km.regiomanager,
             km.contact_toelichting,
             km.gebruiksrecht,
             km.dienst_afval,
             km.dienst_schoonmaak,
             km.dienst_telefonie,
             km.eigenaarschap_toelichting,
             km.kdv,
             km.vo,
             km.bso,
             v.alg_verdieping_omschrijving || ' - ' || v.alg_verdieping_code
              verdieping,
             v.alg_ruimte_nr,
             v.alg_ruimte_omschrijving,
             sr.alg_srtruimte_omschrijving,
             r.alg_ruimte_bruto_vloeropp,
             flx.getdomeinwaarde(25, flx.getflex('ALG', 1040, r.alg_ruimte_key, 'R')) vloersoort
      FROM alg_v_onroerendgoed_gegevens v,
           alg_locatie                  l,
           alg_district                 d,
          (SELECT l.alg_locatie_key,
                  flx.getdomeinwaarde(2, flx.getflex('ALG',1016, l.alg_locatie_key,'L')) locatiemanager,
                  flx.getdomeinwaarde(2, flx.getflex('ALG',1018, l.alg_locatie_key,'L')) regiomanager,
                  flx.getflex('ALG',1019, l.alg_locatie_key,'L') contact_toelichting,
                  flx.getdomeinwaarde(1,flx.getflex('ALG',1005, l.alg_locatie_key,'L')) gebruiksrecht,
                  flx.getflex('ALG',1007, l.alg_locatie_key,'L') dienst_afval,
                  flx.getflex('ALG',1008, l.alg_locatie_key,'L') dienst_schoonmaak,
                  flx.getflex('ALG',1009, l.alg_locatie_key,'L') dienst_telefonie,
                  flx.getflex('ALG',1011, l.alg_locatie_key,'L') eigenaarschap_toelichting,                  
                  flx.getflex('ALG',1001, l.alg_locatie_key,'L') KDV,
                  flx.getflex('ALG',1002, l.alg_locatie_key,'L') VO,
                  flx.getflex('ALG',1003, l.alg_locatie_key,'L') BSO
            FROM alg_locatie l )         km,
            alg_ruimte                  r,
            alg_srtruimte               sr
      WHERE     v.alg_locatie_key = l.alg_locatie_key
            AND l.alg_district_key = d.alg_district_key
            AND v.alg_type IN ('R')
            AND v.alg_locatie_key = km.alg_locatie_key
            AND v.alg_ruimte_key = r.alg_ruimte_key AND r.alg_ruimte_verwijder IS NULL
            AND r.alg_srtruimte_key = sr.alg_srtruimte_key (+) 
            ORDER BY d.alg_district_omschrijving, l.alg_locatie_code, v.alg_gebouw_code, v.alg_ruimte_nr
;

CREATE OR REPLACE VIEW impu_v_rap_opdrachten_intern
(
    TYPE,
    MLD_OPDR_KEY,
    MLD_UITVOERENDE_KEY,
    OPDRACHTNR,
    OPDRACHT_DATUM,
    STATUS,
    MELDING,
    BEHANDELAAR,
    LOCATIE_PLAATS,
    LOCATIE_OMSCHRIJVING,
    GEPLANDE_AANVANG,
    OMSCHRIJVING,
    PRS_PERSLID_KEY,
    NAAM_UITVOERDER,
    AFMELD_DATUM,
    OPDRACHT_TYPE,
    TD_NAAM,
    FILTERSTATUS,     -- Bolletje
    FILTERSTATUS_TD,
    FILTERSTATUS_BO
)
AS
    SELECT CASE
               WHEN mu.TYPE = 'B' THEN 'Poule-opdracht'
               WHEN mu.TYPE = 'P' THEN 'Klus-opdracht'
               ELSE '<?>'
           END
               TYPE,
           o.mld_opdr_key,
           CASE
               WHEN mu.TYPE = 'B' THEN o.prs_perslid_key
               WHEN mu.TYPE = 'P' THEN mu.mld_uitvoerende_key
               ELSE NULL
           END
               mld_uitvoerende_key,
              TO_CHAR (o.mld_melding_key)
           || '/'
           || o.mld_opdr_bedrijfopdr_volgnr
               opdrachtnummer,
           o.mld_opdr_datumbegin,
           DECODE (
               os.mld_statusopdr_key,
               8, DECODE (o.mld_opdr_halted,
                          1, 'Onderbroken',
                          os.mld_statusopdr_omschrijving),
               os.mld_statusopdr_omschrijving)
               status,
           std.mld_stdmelding_omschrijving,
           COALESCE (p.prs_perslid_naam_full, '<nog geen behandelaar>'), -- BEHANDELAAR
           l.alg_locatie_plaats,
           CASE WHEN m.mld_alg_onroerendgoed_keys IS NOT NULL
             THEN l.alg_locatie_omschrijving || ' - ' || COALESCE(onr.alg_gebouw_naam, onr.alg_terreinsector_naam)
             ELSE l.alg_locatie_omschrijving
             END
            locatie_omschrijving,
           COALESCE(o.mld_opdr_plandatum, o.mld_opdr_einddatum) 
             geplande_aanvang,
              TRIM (
                  REGEXP_REPLACE (
                      REGEXP_SUBSTR (o.mld_opdr_omschrijving,
                                     '(([^ ]*)( |$)*){10}'),
                      '[[:space:]]',
                      ' '))
           || '...',
           p.prs_perslid_key,
           mu.naam,
           (SELECT MAX (ft.fac_tracking_datum)
              FROM fac_tracking ft
             WHERE     ft.fac_tracking_refkey = o.mld_opdr_key
                   AND ft.fac_srtnotificatie_key = 78),              -- ORDAFM
           ot.mld_typeopdr_omschrijving,
           CASE
               WHEN mu.TYPE = 'B' THEN COALESCE (p.prs_perslid_naam_full, '<nog geen behandelaar>')
               WHEN mu.TYPE = 'P' THEN mu.naam
               ELSE '<?>'
               END TD_NAAM,
           CASE
                WHEN o.mld_opdr_flag>0 THEN Lcl.L('lcl_opdr_flag' || o.mld_opdr_flag)
                ELSE ''
                END filterstatus,
           (SELECT ud.fac_usrdata_omschr 
              FROM mld_kenmerkopdr ko, mld_kenmerk km, fac_usrdata ud
             WHERE     ko.mld_opdr_key = o.mld_opdr_key
                   AND ko.mld_kenmerk_key = km.mld_kenmerk_key
                   AND fac.safe_to_number(ko.mld_kenmerkopdr_waarde) = ud.fac_usrdata_key 
                   AND ud.fac_usrtab_key = 22          -- domeinview filterstatus
                   AND ko.mld_kenmerk_key = 11)       -- filterstatus TD
             filterstatus_td,
           (SELECT DECODE(mld_kenmerkopdr_waarde, '1', 'SPOED', NULL) 
              FROM mld_kenmerkopdr ko, mld_kenmerk km
             WHERE     ko.mld_opdr_key = o.mld_opdr_key
                   AND ko.mld_kenmerk_key = km.mld_kenmerk_key
                   AND km.mld_srtkenmerk_key = 101)       -- spoedindicatie door backoffice
             filterstatus_bo
      FROM mld_opdr                 o,
           mld_melding              m,
           mld_typeopdr             ot,
           prs_v_perslid_fullnames  p,
           ins_tab_discipline       d,
           mld_stdmelding           std,
           alg_locatie              l,
           alg_v_onroerendgoed_gegevens onr,
           mld_v_uitvoerende        mu,
           mld_statusopdr           os
     WHERE     o.mld_melding_key = m.mld_melding_key(+)
           AND o.prs_perslid_key = p.prs_perslid_key(+)
           AND o.mld_typeopdr_key = ot.mld_typeopdr_key
           AND ot.mld_typeopdr_isofferte = 0          -- Alleen werkopdrachten
           AND m.mld_stdmelding_key = std.mld_stdmelding_key(+)
           AND std.mld_ins_discipline_key = d.ins_discipline_key(+)
           AND m.mld_alg_locatie_key = l.alg_locatie_key -- alle std-meldingen hebben verplicht-niveau locatie
           AND o.mld_uitvoerende_keys = mu.mld_uitvoerende_key
           AND os.mld_statusopdr_key = o.mld_statusopdr_key
           AND m.mld_alg_onroerendgoed_keys = onr.alg_onroerendgoed_keys (+)    
           AND mu.intern = 1;             

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