--
-- $Id$
--
-- Aanpassingen om DB38z (accept) naar de definitieve DB38 te brengen
-- Merk op dat de recreate er nog bij komt die de DB-version bijwerkt

DEFINE thisfile = 'DB38zto38.sql'
DEFINE dbuser   = '*'

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

--/////////////////////////////////////////////////////////////////////////////////////////// FCLT#59418
-- De autorisatie "WEB_FINUSE" hernoemen naar "WEB_EXTFIN".
-- Dit is in plaats van: DEF_FAC_FUNCTIE3('WEB_EXTFIN', 'FIN', 11, 0,    1);  //    1
-- Dan is er geen conversie nodig van "WEB_FINUSE" naar "WEB_EXTFIN".
-- De autorisatie "WEB_EXTFIN" nu eerst verwijderen op accept, want daar was die al aangemaakt.
DELETE
  FROM fac_functie
 WHERE fac_functie_code = 'WEB_EXTFIN';

UPDATE fac_functie
   SET fac_functie_min_level = 11,
       fac_functie_code = 'WEB_EXTFIN',
       fac_functie_omschrijving = 'lcl_WEB_EXTFIN',
       fac_functie_info = 'lcl_WEB_EXTFIN_info'
 WHERE fac_functie_code = 'WEB_FINUSE';

-- DEF_MENUITEM(1, 'lcl_menu_mld_bo_afm_opdr_ext'  , '', 'MLD', 'appl/mld/opdr_search.asp?urole=b2', 0, 0, 'WEB_EXTORD', 'R', '1', '');
INSERT INTO fac_menuitems(fac_menuitems_groep,
                          fac_menuitems_label,
                          fac_menuitems_oms,
                          fac_menuitems_module,
                          fac_menuitems_url,
                          fac_menuitems_srtdisc,
                          fac_menuitems_disc,
                          fac_functie_key,
                          fac_menuitems_rw,
                          fac_menuitems_default,
                          fac_menuitems_image)
    SELECT 1,
           'lcl_menu_mld_bo_afm_opdr_ext',
           '',
           'MLD',
           'appl/mld/opdr_search.asp?urole=b2',
           0,
           0,
           fac_functie_key,
           'R',
           '1',
           ''
      FROM fac_functie
     WHERE fac_functie_code = 'WEB_EXTORD';

-- MENU_INS_AFTER('lcl_menu_mld_bo_afm_opdr_ext', 'lcl_menu_mld_bo_afmeldenopdra', 2);
INSERT INTO fac_menu (fac_menuitems_key, fac_menu_volgnr)
    SELECT i.fac_menuitems_key, m.fac_menu_volgnr + 2
      FROM fac_menuitems i, fac_menu m
     WHERE i.fac_menuitems_key = (SELECT MAX(mmi.fac_menuitems_key)
                                    FROM fac_menuitems mmi WHERE mmi.fac_menuitems_label = 'lcl_menu_mld_bo_afm_opdr_ext')
                                     AND m.fac_menuitems_key =
                                     (SELECT MAX(mm.fac_menuitems_key)
                                        FROM fac_menu mm, fac_menuitems mmi
                                       WHERE mm.fac_menuitems_key = mmi.fac_menuitems_key
                                         AND mmi.fac_menuitems_label = 'lcl_menu_mld_bo_afmeldenopdra');

-- DEF_MENUITEM(3, 'lcl_mobile_opdrachten_ext'     , '', 'MLD', 'appl/pda/orders_list.asp', 0, 0, 'WEB_EXTORD', 'R', '1',            'fa-briefcase');
INSERT INTO fac_menuitems(fac_menuitems_groep,
                          fac_menuitems_label,
                          fac_menuitems_oms,
                          fac_menuitems_module,
                          fac_menuitems_url,
                          fac_menuitems_srtdisc,
                          fac_menuitems_disc,
                          fac_functie_key,
                          fac_menuitems_rw,
                          fac_menuitems_default,
                          fac_menuitems_image)
    SELECT 3,
           'lcl_mobile_opdrachten_ext',
           '',
           'MLD',
           'appl/pda/orders_list.asp',
           0,
           0,
           fac_functie_key,
           'R',
           '1',
           'fa-briefcase'
      FROM fac_functie
     WHERE fac_functie_code = 'WEB_EXTORD';

-- MENU_INS_AFTER('lcl_mobile_opdrachten_ext', 'lcl_mobile_opdrachten1', 2);
INSERT INTO fac_menu (fac_menuitems_key, fac_menu_volgnr)
    SELECT i.fac_menuitems_key, m.fac_menu_volgnr + 2
      FROM fac_menuitems i, fac_menu m
     WHERE i.fac_menuitems_key = (SELECT MAX(mmi.fac_menuitems_key)
                                    FROM fac_menuitems mmi WHERE mmi.fac_menuitems_label = 'lcl_mobile_opdrachten_ext')
                                     AND m.fac_menuitems_key = (SELECT MAX(mm.fac_menuitems_key)
                                                                  FROM fac_menu mm, fac_menuitems mmi
                                                                 WHERE mm.fac_menuitems_key = mmi.fac_menuitems_key
                                                                   AND mmi.fac_menuitems_label = 'lcl_mobile_opdrachten1');

-- WEB_FINUSE is vervangen door WEBEXTFIN voor menuitem DEF_MENUITEM(1, 'lcl_menu_fin_fe'               , '', 'FIN', 'appl/fin/fin_factuur.asp?urole=fe', 0, 0, 'WEB_EXTFIN', 'W', '1', '');  /* fe = leverancier */
UPDATE fac_menuitems
   SET fac_functie_key = (SELECT fac_functie_key
                            FROM fac_functie
                           WHERE UPPER (fac_functie_code) = 'WEB_EXTFIN')
 WHERE fac_menuitems_label = 'lcl_menu_fin_fe';
-- WEB_FINUSE is vervangen door WEBEXTFIN voor menuitem DEF_MENUITEM(1, 'lcl_menu_fin_fe_overz'         , '', 'FIN', 'appl/fin/fin_search.asp', 0, 0, 'WEB_EXTFIN', 'R', '1', '');            /* fe = leverancier */
UPDATE fac_menuitems
   SET fac_functie_key = (SELECT fac_functie_key
                            FROM fac_functie
                           WHERE UPPER (fac_functie_code) = 'WEB_EXTFIN')
 WHERE fac_menuitems_label = 'lcl_menu_fin_fe_overz';

DECLARE
    lnew_groep                NUMBER (1);
    lfirst_prs                NUMBER (1);
    lfac_groep_key            fac_groep.fac_groep_key%TYPE;
    lnew_fac_groep_key        fac_groep.fac_groep_key%TYPE;
    lins_discipline_key       fac_groeprechten.ins_discipline_key%TYPE;
    lprs_perslid_key          prs_perslid.prs_perslid_key%TYPE;
    -- Interne personen die geen contactpersoon van een extern bedrijf zijn maar die wel 'WEB_ORDBO2' rechten hebben (Interne uitvoerders).
    CURSOR c_pers_intern_rechten IS
        -- Welke personen zijn geen contactpersoon van een extern bedrijf maar hebben wel 'WEB_ORDBO2' rechten (Interne uitvoerders).
        -- Deze moeten naar de nieuwe fac_groep worden gekopieerd.
        -- Welke fac_groeprechten zijn het die geen contactpersoon zijn van een extern bedrijf maar wel 'WEB_ORDBO2' rechten hebben.
        -- Voor elke groep kunnen verschillende disciplines zijn ingesteld.
        SELECT DISTINCT excl.fac_groeprechten_key,
               excl.ins_discipline_key,
               excl.fac_groep_key,
               excl.fac_functie_key,
               excl.fac_gebruiker_alg_level_read,
               excl.fac_gebruiker_alg_level_write,
               excl.fac_gebruiker_prs_level_read,
               excl.fac_gebruiker_prs_level_write,
               excl.prs_perslid_key,
               excl.fac_groep_omschrijving
          FROM (SELECT DISTINCT fgg.fac_groep_key,
                                fg.fac_groep_omschrijving,
                                f.fac_functie_key,
                                f.fac_functie_code,
                                fgr.fac_groeprechten_key,
                                fgr.ins_discipline_key,
                                fgr.fac_gebruiker_alg_level_read,
                                fgr.fac_gebruiker_alg_level_write,
                                fgr.fac_gebruiker_prs_level_read,
                                fgr.fac_gebruiker_prs_level_write,
                                fgg.prs_perslid_key
                  FROM fac_gebruikersgroep fgg,
                       fac_groep fg,
                       fac_groeprechten fgr,
                       fac_functie f
                 WHERE fg.fac_groep_key = fgg.fac_groep_key
                   AND fgr.fac_groep_key = fg.fac_groep_key
                   AND fgr.fac_functie_key = f.fac_functie_key
                   AND UPPER(fac_functie_code) = 'WEB_ORDBO2'
                   AND EXISTS
                           (SELECT 1
                              FROM prs_contactpersoon cp
                             WHERE cp.prs_perslid_key = fgg.prs_perslid_key)) inc,
               (SELECT DISTINCT fgg.fac_groep_key,
                                fg.fac_groep_omschrijving,
                                f.fac_functie_key,
                                f.fac_functie_code,
                                fgr.fac_groeprechten_key,
                                fgr.ins_discipline_key,
                                fgr.fac_gebruiker_alg_level_read,
                                fgr.fac_gebruiker_alg_level_write,
                                fgr.fac_gebruiker_prs_level_read,
                                fgr.fac_gebruiker_prs_level_write,
                                fgg.prs_perslid_key
                  FROM fac_gebruikersgroep fgg,
                       fac_groep fg,
                       fac_groeprechten fgr,
                       fac_functie f
                 WHERE fg.fac_groep_key = fgg.fac_groep_key
                   AND fgr.fac_groep_key = fg.fac_groep_key
                   AND fgr.fac_functie_key = f.fac_functie_key
                   AND UPPER(fac_functie_code) = 'WEB_ORDBO2'
                   AND NOT EXISTS
                           (SELECT 1
                              FROM prs_contactpersoon cp
                             WHERE fgg.prs_perslid_key = cp.prs_perslid_key)) excl
         WHERE inc.fac_groep_key = excl.fac_groep_key
        ORDER BY excl.fac_groep_key,
                 excl.prs_perslid_key,
                 excl.ins_discipline_key,
                 excl.fac_groeprechten_key;
BEGIN
    lfac_groep_key := 0;
    lprs_perslid_key := 0;
    lins_discipline_key := 0;
    lfirst_prs := 0;
    -- Eerst interne uitvoerders die GEEN contactpersoon zijn van een extern bedrijf in een nieuwe groep gooien.
    -- Anders hebben ze straks te weinig rechten.
    FOR f_pers_intern_rechten IN c_pers_intern_rechten
    LOOP
        lnew_groep := 0;
        IF lfac_groep_key != f_pers_intern_rechten.fac_groep_key
        THEN
            -- Nieuwe groep aanmaken (omschrijving + BO2)
            INSERT INTO fac_groep (fac_groep_omschrijving,
                                   fac_groep_opmerking)
                           VALUES (TRIM(SUBSTR(f_pers_intern_rechten.fac_groep_omschrijving, 1, 23)) || ' ORDBO2',
                                   'Interne personen die geen contactpersoon van een extern bedrijf zijn maar die wel WEB_ORDBO2 rechten hebben (Interne uitvoerders).')
            RETURNING fac_groep_key INTO lnew_fac_groep_key;
            lfac_groep_key := f_pers_intern_rechten.fac_groep_key;
            lnew_groep := 1;
        END IF;

        IF lnew_groep = 1 OR lprs_perslid_key != f_pers_intern_rechten.prs_perslid_key
        THEN
            -- Personen aan de gebruikersgroep toevoegen.
            INSERT INTO fac_gebruikersgroep (fac_groep_key,
                                             prs_perslid_key)
                                     VALUES (lnew_fac_groep_key,
                                             f_pers_intern_rechten.prs_perslid_key);
            lprs_perslid_key := f_pers_intern_rechten.prs_perslid_key;
            IF lnew_groep = 1
            THEN
                lfirst_prs := 1;
            ELSE
                lfirst_prs := 0;
            END IF;
        END IF;

        -- Voor de tweede prs_perslid niet opnieuw alle disciplines toevoegen anders krijg je ze dubbel erin.
        IF lfirst_prs = 1 AND (lnew_groep = 1 OR lins_discipline_key != f_pers_intern_rechten.ins_discipline_key)
        THEN
            -- Groepsrechten toevoegen.
            INSERT INTO fac_groeprechten (fac_groep_key,
                                          fac_functie_key,
                                          ins_discipline_key,
                                          fac_gebruiker_alg_level_read,
                                          fac_gebruiker_alg_level_write,
                                          fac_gebruiker_prs_level_read,
                                          fac_gebruiker_prs_level_write)
                                  VALUES (lnew_fac_groep_key,
                                          f_pers_intern_rechten.fac_functie_key,
                                          f_pers_intern_rechten.ins_discipline_key,
                                          f_pers_intern_rechten.fac_gebruiker_alg_level_read,
                                          f_pers_intern_rechten.fac_gebruiker_alg_level_write,
                                          f_pers_intern_rechten.fac_gebruiker_prs_level_read,
                                          f_pers_intern_rechten.fac_gebruiker_prs_level_write);
            lins_discipline_key := f_pers_intern_rechten.ins_discipline_key;
        END IF;

    END LOOP;

    -- Omgooien groepen van 'WEB_ORDBO2' naar 'WEB_EXTORD'
    -- De EXIST (contactpersoon) zorgt ervoor dat de net aangemaakte groep met de rechten NIET van 'WEB_ORDBO2' naar 'WEB_EXTORD' worden omgegooid.
    -- In de nieuwe groep zitten namelijk alleen interne uitvoerders die GEEN contactpersoon zijn van een extern bedrijf.
    UPDATE fac_groeprechten
       SET fac_functie_key =
               (SELECT fac_functie_key
                  FROM fac_functie
                 WHERE fac_functie_code LIKE 'WEB_EXTORD')
     WHERE fac_functie_key = (SELECT fac_functie_key
                                FROM fac_functie
                               WHERE fac_functie_code LIKE 'WEB_ORDBO2')
       AND fac_groep_key IN (SELECT DISTINCT fgg.fac_groep_key
                               FROM fac_gebruikersgroep fgg,
                                    fac_groep fg,
                                    fac_groeprechten fgr,
                                    fac_functie f
                              WHERE fg.fac_groep_key = fgg.fac_groep_key
                                AND fgr.fac_groep_key = fg.fac_groep_key
                                AND fgr.fac_functie_key = f.fac_functie_key
                                AND UPPER(fac_functie_code) = 'WEB_ORDBO2'
                                AND EXISTS
                                        (SELECT 1
                                           FROM prs_contactpersoon cp
                                          WHERE cp.prs_perslid_key = fgg.prs_perslid_key));
END;
/

-- /////////////////////////////////////////////////////////////////////////////////////////// FCLT#60353
UPDATE fac_setting
   SET fac_setting_pvalue = 1
 WHERE     fac_setting_name = 'puo_app2enabled'
       AND fac_setting_pvalue IS NULL
       AND EXISTS
               (SELECT ''
                  FROM fac_setting
                 WHERE     fac_setting_name = 'mobile_enabled'
                       AND fac_setting_pvalue = 1);

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

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

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