/* DB17TO18.SRC
 * Update script van Facilitor schema
 * $Revision$
 * $Id$
 */
#include "prologue.inc"

COMMIT;
/////////////////////////////////////////////////////////////////////////////////////////// UWVA#25509
/* Dit doen we eerst, voordat er door DDL zaken invaligd kunenn worden */
UPDATE bes_bestelling b
   SET bes_bestelling_status = 1
 WHERE b.bes_bestelling_status <> 1               /* bestelling niet afgewezen */
       AND EXISTS
             (SELECT *
                FROM bes_bestelling_item bi,
                     bes_bestelopdr_item boi,
                     bes_bestelopdr bo
               WHERE b.bes_bestelling_key = bi.bes_bestelling_key
                     AND bi.bes_bestelopdr_item_key =
                           boi.bes_bestelopdr_item_key
                     AND boi.bes_bestelopdr_key = bo.bes_bestelopdr_key
                     AND bo.bes_bestelopdr_status = 1); /*  opdracht wel afgewezen */

UPDATE bes_bestelling b
   SET bes_bestelling_status = 6
 WHERE b.bes_bestelling_status <> 6               /* bestelling niet geleverd */
       AND EXISTS
             (SELECT *
                FROM bes_bestelling_item bi,
                     bes_bestelopdr_item boi,
                     bes_bestelopdr bo
               WHERE b.bes_bestelling_key = bi.bes_bestelling_key
                     AND bi.bes_bestelopdr_item_key =
                           boi.bes_bestelopdr_item_key
                     AND boi.bes_bestelopdr_key = bo.bes_bestelopdr_key
                     AND bo.bes_bestelopdr_status = 6); /* opdracht wel geleverd */

/////////////////////////////////////////////////////////////////////////////////////////// PNBR#24995
ALTER TABLE mld_stdmelding ADD mld_stdmelding_directklaar NUMBER(1);

/////////////////////////////////////////////////////////////////////////////////////////// UWVA#25063
ALTER TABLE res_artikel ADD res_artikel_minimum NUMBER(3);

/////////////////////////////////////////////////////////////////////////////////////////// FSN#25320
// allerallerlaatste keer
UPDATE fac_setting SET fac_setting_name = LOWER(fac_setting_name);

/////////////////////////////////////////////////////////////////////////////////////////// FSN#25499
UPDATE fac_menuitems SET fac_menuitems_url='appl/ins/ins_srtdeel_search.asp'
 WHERE fac_menuitems_url='appl/ins/ins_srtdeel_search';

/////////////////////////////////////////////////////////////////////////////////////////// FSN#25818
DELETE
  FROM fac_locale_xref
 WHERE fac_locale_xref_filepath LIKE '/%'; // Canonieke naam is zonder / vooraan

/////////////////////////////////////////////////////////////////////////////////////////// AAEN#25223
ALTER TABLE prs_perslid ADD prs_perslid_apikey VARCHAR2(128);

-- Er is nu een bescheiden compatibiliteitsprobleem indien er meerder users waren
-- met verschillende API-keys. Hoe moeten we dat oplossen? Dat kan niet.
-- Signaleer als dat zo is
  SELECT 'OR'||'A-xx persoon heeft minstens 2 APIs, dit moet voor de upgrade worden opgelost; perslid_key='||prs_perslid_key,
         MAX (fac_api_apikey) api,
         COUNT ( * )
    FROM fac_api a
GROUP BY prs_perslid_key
  HAVING COUNT ( * ) > 1;

UPDATE prs_perslid p
   SET prs_perslid_apikey =
           (SELECT MAX (fac_api_apikey)
              FROM fac_api a
             WHERE a.prs_perslid_key = p.prs_perslid_key)
 WHERE prs_perslid_apikey IS NULL;

-- plus definities uit fac_ini TODO: als die definitiever zijn die hier opnemen
-- Ik ruim ze uit eerdere runs nog even op (@development)
alter table fac_api modify fac_api_apikey null;
DELETE FROM fac_api WHERE fac_api_name IN (SELECT fac_module_name FROM fac_module);
-- ALG
INSERT INTO fac_api (fac_api_name, fac_api_filepath, fac_api_loglevel, fac_api_viewmapping_json) VALUES
   ('ALG', 'appl/api/api_soap.asp', 0,
     '[{"req": "Regios",       "node": "regio",      "view": "alg_v_api_regios","filter":{"regioomschrijving":"regioomschrijving"},"limit":75},'
    ||'{"req": "Districten",   "node": "district",   "view": "alg_v_api_districten","filter":{"regioomschrijving":"regioomschrijving","districtomschrijving":"districtomschrijving"},"limit":75},'
    ||'{"req": "Locaties",     "node": "locatie",    "view": "alg_v_api_locaties","filter":{"regioomschrijving":"regioomschrijving","districtomschrijving":"districtomschrijving","locatiecode":"locatiecode","locatieomschrijving":"locatieomschrijving"},"limit":150},'
    ||'{"req": "Gebouwen",     "node": "gebouw",     "view": "alg_v_api_gebouwen","filter":{"locatiecode":"locatiecode","gebouwcode":"gebouwcode","gebouwnaam":"gebouwnaam","soortgebouw":"soortgebouw"},"limit":75},'
    ||'{"req": "Verdiepingen", "node": "verdieping", "view": "alg_v_api_verdiepingen","filter":{"locatiecode":"locatiecode","gebouwcode":"gebouwcode","verdiepingcode":"verdiepingcode"},"limit":75},'
    ||'{"req": "Ruimten",      "node": "ruimte",     "view": "alg_v_api_ruimten","filter":{"locatiecode":"locatiecode","gebouwcode":"gebouwcode","verdiepingcode":"verdiepingcode","ruimtecode":"ruimtecode","soortruimte":"soortruimte"},"limit":150}]'
   );

-- BES
INSERT INTO fac_api (fac_api_name, fac_api_filepath, fac_api_loglevel, fac_api_viewmapping_json) VALUES
   ('BES', 'appl/api/api_soap.asp', 0,
    '[{"req": "Bestellingen",      "node": "bestelling",      "view": "bes_v_api_bestellingen","filter":{},"limit":75},'
    ||'{"req": "Bestelopdrachten", "node": "bestelopdracht",  "view": "bes_v_api_bestelopdrachten","filter":{},"limit":75}]'
   );

-- BEZ
INSERT INTO fac_api (fac_api_name, fac_api_filepath, fac_api_loglevel, fac_api_viewmapping_json) VALUES
   ('BEZ', 'appl/api/api_soap.asp', 0,
    '[{"req": "Afspraken", "node": "afspraak", "view": "bez_v_api_afspraken","filter":{},"limit":75}]'
   );

-- CNT
INSERT INTO fac_api (fac_api_name, fac_api_filepath, fac_api_loglevel, fac_api_viewmapping_json) VALUES
   ('CNT', 'appl/api/api_soap.asp', 0,
    '[{"req": "Contracten", "node": "contract", "view": "cnt_v_api_contracten","filter":{},"limit":75}]'
   );

-- FIN
INSERT INTO fac_api (fac_api_name, fac_api_filepath, fac_api_loglevel, fac_api_viewmapping_json) VALUES
   ('FIN', 'appl/api/api_soap.asp', 0,
    '[{"req": "Facturen", "node": "factuur", "view": "fin_v_api_facturen","filter":{},"limit":75}]'
   );

-- INS
INSERT INTO fac_api (fac_api_name, fac_api_filepath, fac_api_loglevel, fac_api_viewmapping_json) VALUES
   ('INS', 'appl/api/api_soap.asp', 0,
    '[{"req": "Delen", "node": "deel", "view": "ins_v_api_delen","filter":{},"limit":75}]'
   );

-- MLD
INSERT INTO fac_api (fac_api_name, fac_api_filepath, fac_api_loglevel, fac_api_viewmapping_json) VALUES
   ('MLD', 'appl/api/api_soap.asp', 0,
    '[{"req": "Meldingen",   "node": "melding",  "view": "mld_v_api_meldingen","filter":{},"limit":75},'
    ||'{"req": "Opdrachten", "node": "opdracht", "view": "mld_v_api_opdrachten","filter":{},"limit":75}]'
   );

-- PRS
INSERT INTO fac_api (fac_api_name, fac_api_filepath, fac_api_loglevel, fac_api_viewmapping_json) VALUES
   ('PRS', 'appl/api/api_soap.asp', 0,
    '[{"req": "Afdelingen", "node": "afdeling", "view": "prs_v_api_afdelingen","filter":{},"limit":75},'
    ||'{"req": "Personen",  "node": "persoon",  "view": "prs_v_api_personen","filter":{},"limit":75}]'
   );

-- RES
INSERT INTO fac_api (fac_api_name, fac_api_filepath, fac_api_loglevel, fac_api_viewmapping_json) VALUES
   ('RES', 'appl/api/api_soap.asp', 0,
    '[{"req": "Reserveringen",  "node": "reservering", "view": "res_v_api_reserveringen","filter":{"locatiecode":"locatiecode","gebouwcode":"gebouwcode","verdiepingcode":"verdiepingcode","ruimtecode":"ruimtecode", "catalogus": "catalogus", "begindatumtijd": {"colName": "van", "operand":"GT","datatype":"date"}, "einddatumtijd": {"colName": "tot", "operand":"LT", "datatype":"date"}},"limit":75},'
    ||'{"req": "Voorzieningen", "node": "voorziening", "view": "res_v_api_voorzieningen","filter":{"locatiecode":"locatiecode","gebouwcode":"gebouwcode","verdiepingcode":"verdiepingcode", "catalogus": "catalogus"},"limit":75}]'
   );

/////////////////////////////////////////////////////////////////////////////////////////// FSN#25100
DEF_MENUITEM(0, 'lcl_menu_fe_marktplaats'       , '', 'MRK', 'appl/mrk/mrk_search.asp?urole=fe', 0, 0, 'WEB_MRKUSE', 'R', '0');
DEF_MENUITEM(1, 'lcl_menu_mrk_bo_overview'      , '', 'MRK', 'appl/mrk/mrk_search.asp?urole=bo', 0, 0, 'WEB_MRKBOF', 'R', '0');

/////////////////////////////////////////////////////////////////////////////////////////// AAIT#25547
_FAC_MODULE('FAQ','Kennisbank')
UPDATE fac_functie SET fac_functie_module='FAQ' WHERE fac_functie_module='FAC' AND fac_functie_code LIKE 'WEB_FAQ%';
UPDATE fac_menuitems SET fac_menuitems_module='FAQ' WHERE fac_menuitems_module='FAC' AND fac_menuitems_label LIKE 'lcl_menu_faq_%';
UPDATE fac_menuitems SET fac_functie_key=(SELECT fac_functie_key FROM fac_functie WHERE fac_functie_code = 'WEB_FAQFOF') WHERE fac_menuitems_label='lcl_menu_faq_kennisbank_fo';

DEF_FAC_FUNCTIE2('WEB_FAQMGT', 'Modulebeheer:Kennisbank',                'FAQ', 0, 0, 2, 'Modulebeheer');
DEF_FAC_FUNCTIE2('WEB_FAQMSU', 'Supergebruiker:Kennisbank',              'FAQ', 0, 0, 2, 'Supergebruiker');
// Geef PRS rechten op deze nieuwe functie
INSERT INTO fac_groeprechten (fac_groep_key,
                              fac_gebruiker_prs_level_write,
                              fac_gebruiker_prs_level_read,
                              fac_gebruiker_alg_level_write,
                              fac_gebruiker_alg_level_read,
                              fac_functie_key)
    SELECT g.fac_groep_key,
           g.fac_gebruiker_prs_level_write,
           g.fac_gebruiker_prs_level_read,
           g.fac_gebruiker_alg_level_write,
           g.fac_gebruiker_alg_level_read,
           f.fac_functie_key
      FROM fac_groeprechten g, fac_functie f
     WHERE g.fac_functie_key = (SELECT fac_functie_key
                                  FROM fac_functie
                                 WHERE fac_functie_code = 'WEB_PRSSYS')
           AND f.fac_functie_code = 'WEB_FAQMGT'
           AND (g.fac_groep_key, f.fac_functie_key) NOT IN
                      (SELECT fac_groep_key, fac_functie_key FROM fac_groeprechten);

DEF_MENUITEM(2, 'lcl_menu_faq_kenmerk'          , '', 'FAQ', 'appl/facmgtVB/faq_kenmerkgrid.asp', 0, 0, 'WEB_FAQMGT', 'W', '1');
DEF_MENUITEM(2, 'lcl_menu_faq_kenmerkdomeinen'  , '', 'FAQ', 'appl/fac/fac_kenmerkdomein_search.asp?fkdmodule=FAQ', 0, 0, 'WEB_PRSSYS', 'W', '1');
DEF_MENUITEM(2, 'lcl_menu_faq_setting'          , '', 'FAQ', 'appl/fac/fac_setting_search.asp?module=FAQ', 0, 0, 'WEB_PRSSYS', 'W', '0');
MENU_INSKOP_AFTER('lcl_facmgt_faq', 'lcl_menu_bez_kenmerkdomeinen', 2, 4) ;
MENU_INS_AFTERKOP('lcl_menu_faq_kenmerk', 'lcl_facmgt_faq', 2) ;
MENU_INS_AFTER('lcl_menu_faq_kenmerkdomeinen', 'lcl_menu_faq_kenmerk', 2) ;

CREATE SEQUENCE faq_s_faq_kenmerk_key MINVALUE 1;
CREATE SEQUENCE faq_s_faq_kenmerkwaarde_key MINVALUE 1;
CREATE_TABLE(faq_kenmerk,0)
(
   faq_kenmerk_key          NUMBER(10)
                            CONSTRAINT faq_k_faq_kenmerk_key PRIMARY KEY,
   faq_kenmerk_volgnr       NUMBER(3),
   faq_kenmerk_omschrijving VARCHAR2(50),
   faq_kenmerk_upper        VARCHAR2(50),
   faq_kenmerk_hint         VARCHAR2(255),
   faq_kenmerk_default      VARCHAR2(4000),
   faq_kenmerk_dimensie     VARCHAR2(10),
   faq_kenmerk_kenmerktype  VARCHAR2(1)
                            CONSTRAINT faq_c_faq_kenmerk_type1
                                 CHECK(faq_kenmerk_kenmerktype IN ('C','N','D','R','X','L','Q','F','M','E','S', 'l')),
   faq_kenmerk_systeem      NUMBER(1),
   faq_kenmerk_toonbaar     NUMBER(1),
   faq_kenmerk_uniek        NUMBER(1),
   faq_kenmerk_regexp       VARCHAR2(255),
   faq_kenmerk_verplicht    NUMBER(1),
   faq_kenmerk_lengte       NUMBER(4),
   faq_kenmerk_dec          NUMBER(2),
   faq_kenmerk_nmin         NUMBER(10),
   faq_kenmerk_nmax         NUMBER(10),
   fac_kenmerkdomein_key    NUMBER(10)
                            CONSTRAINT faq_r_kenmerkdomein_key1 REFERENCES fac_kenmerkdomein(fac_kenmerkdomein_key),
   faq_kenmerk_aanmaak      DATE
                            DEFAULT SYSDATE
                            NOT_NULL(faq_kenmerk_aanmaak, faq_c_faq_kenmerk_aanmaak),
   faq_kenmerk_verwijder    DATE
                            DEFAULT NULLDATUM
);

CREATE_TABLE(faq_kenmerkwaarde,0)
(
   faq_kenmerkwaarde_key       NUMBER(10)
                               CONSTRAINT faq_k_faq_kenmerkwaarde_key PRIMARY KEY,
   fac_faq_key                 NUMBER(10)
                               CONSTRAINT faq_r_faq_key REFERENCES fac_faq(fac_faq_key),
   faq_kenmerk_key             NUMBER(10),
   faq_kenmerkwaarde_waarde    VARCHAR2(4000),
   faq_kenmerkwaarde_aanmaak   DATE
                               DEFAULT SYSDATE
                               NOT_NULL(faq_kenmerkwaarde_aanmaak, faq_c_faq_kenmerkwaarde_aanm),
   faq_kenmerkwaarde_verwijder DATE
                               DEFAULT NULLDATUM,
   CONSTRAINT faq_u_faq_kenmerkwaarde_key UNIQUE(fac_faq_key, faq_kenmerk_key, faq_kenmerkwaarde_verwijder)
);

ALTER TABLE fac_faq ADD fac_faq_hint VARCHAR2(1000);

CREATE_TABLE(fac_imp_faq, 0) (
   fac_faq_question             VARCHAR2 (4000),
   fac_faq_answer               VARCHAR2 (4000),
   fac_faq_level                VARCHAR2 (30),
   ins_discipline_key           NUMBER(10),
   mld_stdmelding_key           NUMBER(10),
   fac_faq_source               VARCHAR2 (60),
   fac_faq_url                  VARCHAR2 (250),
   fac_faq_datum                DATE,
   fac_faq_lang                 VARCHAR2 (3),
   fac_faq_hint                 VARCHAR2 (1000)
);

INSERT INTO fac_import_app
            (fac_import_app_code, fac_import_app_oms, fac_functie_key)
   SELECT 'FAQ', 'FIP: Kennisbank', fac_functie_key
     FROM fac_functie
    WHERE fac_functie_code = 'WEB_PRSSYS';

/////////////////////////////////////////////////////////////////////////////////////////// FSN#25688
DROP INDEX bez_i_bez_afspraak_bez1;
DROP INDEX bez_i_bez_afspraak_bez2;
CREATE INDEX bez_i_bez_afspraak_bez5 ON bez_afspraak(bez_afspraak_contact_key, bez_afspraak_datum);
CREATE INDEX bez_i_bez_afspraak_bez6 ON bez_afspraak(bez_afspraak_host_key, bez_afspraak_datum);

/////////////////////////////////////////////////////////////////////////////////////////// FSN#25689
ALTER TABLE fac_locale DROP CONSTRAINT fac_u_fac_locale;
ALTER TABLE fac_locale  ADD CONSTRAINT fac_u_fac_locale
     UNIQUE(fac_locale_dialect_key, fac_locale_lang, fac_localeitems_key, fac_locale_kolomnaam, fac_locale_kolomkeyval);
/////////////////////////////////////////////////////////////////////////////////////////// FSN#25479
CREATE INDEX fin_i_fin_factuurregel1 ON fin_factuurregel(fin_factuur_key);
CREATE INDEX fin_i_fin_factuurnote1 ON fin_factuur_note(fin_factuur_key);
/////////////////////////////////////////////////////////////////////////////////////////// FSN#25754
ALTER TABLE fac_imp_ins ADD ins_kenmerkwaarde6    VARCHAR2 (255);
ALTER TABLE fac_imp_ins ADD ins_kenmerkwaarde7    VARCHAR2 (255);
ALTER TABLE fac_imp_ins ADD ins_kenmerkwaarde8    VARCHAR2 (255);
ALTER TABLE fac_imp_ins ADD ins_kenmerkwaarde9    VARCHAR2 (255);
ALTER TABLE fac_imp_ins ADD ins_kenmerkwaarde10   VARCHAR2 (255);
ALTER TABLE fac_imp_ins ADD ins_kenmerkwaarde11   VARCHAR2 (255);
ALTER TABLE fac_imp_ins ADD ins_kenmerkwaarde12   VARCHAR2 (255);
ALTER TABLE fac_imp_ins ADD ins_kenmerkwaarde13   VARCHAR2 (255);
ALTER TABLE fac_imp_ins ADD ins_kenmerkwaarde14   VARCHAR2 (255);
ALTER TABLE fac_imp_ins ADD ins_kenmerkwaarde15   VARCHAR2 (255);
ALTER TABLE fac_imp_ins ADD ins_kenmerkwaarde16   VARCHAR2 (255);
ALTER TABLE fac_imp_ins ADD ins_kenmerkwaarde17   VARCHAR2 (255);
ALTER TABLE fac_imp_ins ADD ins_kenmerkwaarde18   VARCHAR2 (255);
ALTER TABLE fac_imp_ins ADD ins_kenmerkwaarde19   VARCHAR2 (255);
ALTER TABLE fac_imp_ins ADD ins_kenmerkwaarde20   VARCHAR2 (255);
/////////////////////////////////////////////////////////////////////////////////////////// UWVA#25755
ALTER TABLE mld_melding ADD mld_melding_accepttijd NUMBER(4,2);
-- Het blijkt dat fac geinvalideerd is geraakt door iets van bovenstaande. Helpt dit?
ALTER PACKAGE fac COMPILE;
-- Dilemma, definitiekwestie.
-- Het onbekende verleden bevriezen met de kennis van nu, of leeg laten?
-- De eerste optie doet recht aan de definitie van nu, en bevriest voor later.
ALTER TRIGGER mld_t_mld_melding_b_iu DISABLE;
UPDATE mld_melding m
   SET mld_melding_accepttijd = (SELECT mld_stdmelding_urgentie
                                   FROM mld_stdmelding s
                                  WHERE s.mld_stdmelding_key=m.mld_stdmelding_key)
 WHERE mld_melding_accepttijd IS NULL;
ALTER TRIGGER mld_t_mld_melding_B_IU ENABLE;
/////////////////////////////////////////////////////////////////////////////////////////// FSN#25791
DEF_MENUITEM(1, 'lcl_menu_prs_browser'          , '', 'ALG', 'appl/prs/prs_afdn_search.asp', 0, 0, 'WEB_PRSUSE', 'R', '1');
MENU_INS_AFTER( 'lcl_menu_prs_browser', 'lcl_menu_prs_bedrijf_intern', 2);
/////////////////////////////////////////////////////////////////////////////////////////// FSN#25849
ALTER TABLE prs_perslid ADD prs_perslid_options VARCHAR2(4000);

/////////////////////////////////////////////////////////////////////////////////////////// UWVA#24389
DECLARE
  CURSOR c1 IS
    SELECT bes_srtdeel_nr,
           bes_srtgroep_key,
           prs_bedrijf_key,
           bes_srtdeel_verwijder,
           COUNT ( * )
      FROM bes_srtdeel
     GROUP BY bes_srtdeel_nr,
           bes_srtgroep_key,
           prs_bedrijf_key,
           bes_srtdeel_verwijder
    HAVING COUNT ( * ) > 1;
  r1 c1%ROWTYPE;

  CURSOR c2( srtdeel_nr   VARCHAR2
           , srtgroep_key NUMBER
           , bedrijf_key  NUMBER
           , vdatum       DATE
           ) IS
    SELECT S.bes_srtdeel_verwijder + NUMTODSINTERVAL(rownum-1,'SECOND') d1
      FROM bes_srtdeel S
     WHERE S.bes_srtdeel_nr        = srtdeel_nr
       AND S.bes_srtgroep_key      = srtgroep_key
       AND S.prs_bedrijf_key       = bedrijf_key
       AND S.bes_srtdeel_verwijder = vdatum
    FOR UPDATE;
  r2 c2%ROWTYPE;

  CURSOR c3( srtdeel_nr   VARCHAR2
           , srtgroep_key NUMBER
           , bedrijf_key  NUMBER
           ) IS
    SELECT S.bes_srtdeel_key
         , (SELECT NVL(MAX(1),0)
              FROM bes_bestelling_item B
             WHERE B.bes_srtdeel_key = S.bes_srtdeel_key
           ) besteld
      FROM bes_srtdeel S
     WHERE S.bes_srtdeel_nr        = srtdeel_nr
       AND S.bes_srtgroep_key      = srtgroep_key
       AND S.prs_bedrijf_key       = bedrijf_key
       AND S.bes_srtdeel_verwijder IS NULL
     ORDER BY besteld DESC, S.bes_srtdeel_aanmaak DESC;
  r3 c3%ROWTYPE;

  vdate1 date;
  vdate2 date;
  aantal number;
  prfkey number;

BEGIN

  /* Lege artikelnr met default vullen */
  DBMS_OUTPUT.put_line ('Artikelnr vullen:');
  UPDATE bes_srtdeel
     SET bes_srtdeel_nr = 'Artikel '||bes_srtdeel_key
   WHERE bes_srtdeel_nr IS NULL;

  /* Niet verwijderde artikelen naar 1 artikelnummer verplaatsen */
  OPEN c1;
  LOOP
    FETCH c1 INTO r1;
    EXIT WHEN c1%NOTFOUND;

    IF r1.bes_srtdeel_verwijder IS NULL
    THEN
      DBMS_OUTPUT.put_line ('>Artikelnr: ' || r1.bes_srtdeel_nr);
      aantal := 0;
      FOR r3 in c3( r1.bes_srtdeel_nr
                  , r1.bes_srtgroep_key
                  , r1.prs_bedrijf_key
                  )
      LOOP
        IF aantal = 0
        THEN
          prfkey := r3.bes_srtdeel_key;
          DBMS_OUTPUT.put_line (aantal||'# '||r3.bes_srtdeel_key);
        ELSE
          /* Omhangen van artikel in bestel-item */
          DBMS_OUTPUT.put_line (aantal||'# '||r3.bes_srtdeel_key ||'-->'||prfkey);
          UPDATE bes_bestelling_item
             SET bes_srtdeel_key = prfkey
           WHERE bes_srtdeel_key = r3.bes_srtdeel_key;
          /* Verwijder het niet meer gebruikte artikel */
          DBMS_OUTPUT.put_line ('Verwijder: '||r3.bes_srtdeel_key);
          UPDATE bes_srtdeel
             SET bes_srtdeel_verwijder = sysdate
           WHERE bes_srtdeel_key = r3.bes_srtdeel_key;
        END IF;
        aantal := aantal + 1;
      END LOOP;
    END IF;
  END LOOP;
  CLOSE c1;

  /* verwijderdatum artikelen uniek maken */
  OPEN c1;
  LOOP
    FETCH c1 INTO r1;
    EXIT WHEN c1%NOTFOUND;

    IF r1.bes_srtdeel_verwijder IS NOT NULL
    THEN
      FOR r2 IN c2( r1.bes_srtdeel_nr
                  , r1.bes_srtgroep_key
                  , r1.prs_bedrijf_key
                  , r1.bes_srtdeel_verwijder
                  )
      LOOP
        vdate1 := r2.d1;
        vdate2 := r1.bes_srtdeel_verwijder;
        DBMS_OUTPUT.put_line ('>Wijzig verwijderdatum: ' ||to_char(vdate2, 'dd-mm-yyyy hh24:mi:ss')
                                                 ||'-->' ||to_char(vdate1, 'dd-mm-yyyy hh24:mi:ss'));
        UPDATE bes_srtdeel
           SET bes_srtdeel_verwijder = vdate1
          WHERE CURRENT OF c2;
      END LOOP;
    END IF;

  END LOOP;
  CLOSE c1;
END;
/

ALTER TABLE bes_srtdeel MODIFY bes_srtdeel_nr NOT_NULL(bes_srtdeel_nr, bes_c_bes_srtdeel_nr);
CREATE UNIQUE INDEX bes_i_bes_srtdeel2 ON bes_srtdeel(bes_srtdeel_nr, prs_bedrijf_key, bes_srtgroep_key, bes_srtdeel_verwijder);

/////////////////////////////////////////////////////////////////////////////////////////// FSN#25766
CREATE_TABLE(fac_imp_inspectie, 0) (
   ins_discipline_omschrijving  VARCHAR2 (30),
   ins_srtgroep_omschrijving    VARCHAR2 (60),
   ins_srtdeel_code             VARCHAR2 (10),
   ins_srtcontrole_omschrijving VARCHAR2 (60),
   ins_srtcontrole_info         VARCHAR2 (320),
   ins_srtcontrole_periode      VARCHAR2 (4)
);
INSERT INTO fac_import_app
            (fac_import_app_code, fac_import_app_oms, fac_functie_key)
   SELECT 'INSPECTIE', 'FIP: 9-Aanvullen van inspectiedefinities', fac_functie_key
     FROM fac_functie
    WHERE fac_functie_code = 'WEB_PRSSYS';

/////////////////////////////////////////////////////////////////////////////////////////// FSN#25873
ALTER TABLE fac_usrgraph ADD fac_usrgraph_options VARCHAR2(4000);

/////////////////////////////////////////////////////////////////////////////////////////// UWVA#24148
CREATE_TABLE(mld_behandelgroep,0)
(
    mld_behandelgroep_key
        NUMBER(10)
        CONSTRAINT mld_k_behandelgroep_key PRIMARY KEY,
    mld_behandelgroep_naam
        VARCHAR2(30)
        NOT_NULL(mld_behandelgroep_naam, mld_c_behandelgroep_naam),
    mld_behandelgroep_oms
        VARCHAR2(1000),
  CONSTRAINT mld_u_behandelgroep_naam UNIQUE (mld_behandelgroep_naam)
);

ALTER TABLE mld_disc_params
  ADD mld_behandelgroep_key
  NUMBER(10) CONSTRAINT mld_r_behandelgroep_key1 REFERENCES mld_behandelgroep(mld_behandelgroep_key);
CREATE SEQUENCE mld_s_mld_behandelgroep_key MINVALUE 1;

DEF_MENUITEM(2, 'lcl_menu_mld_behandelgroep'  , '', 'MLD', 'appl/facmgtVB/mld_behandelgroepgrid.asp', 0, 0, 'WEB_MLDMGT', 'W', '1');
MENU_INS_AFTER( 'lcl_menu_mld_behandelgroep', 'lcl_menu_mld_stdmeldinggroep', 2);

/////////////////////////////////////////////////////////////////////////////////////////// FSN#25900
CREATE INDEX mld_i_mld_melding_object2 ON mld_melding_object(ins_deel_key, mld_melding_key);

///////////////////////////////////////////////////////////////////////////////////////////
UPDATE fac_import_app SET fac_import_app_oms = 'FIP: 6-Aanvullen objecten'
 WHERE fac_import_app_code = 'INS';

/////////////////////////////////////////////////////////////////////////////////////////// AANX#25939
ALTER TABLE mld_typeopdr ADD mld_typeopdr_contract NUMBER(1) DEFAULT (2)
 CONSTRAINT mld_c_mld_typeopdr_contract CHECK(mld_typeopdr_contract IN (0,2,3));

/////////////////////////////////////////////////////////////////////////////////////////// NYBU#25763
ALTER TABLE res_ruimte ADD res_ruimte_prijs_dag NUMBER(7,2);
ALTER TABLE res_ruimte ADD res_ruimte_prijsfactor_intern NUMBER(5,3);

ALTER TABLE res_rsv_ruimte ADD res_rsv_ruimte_korting NUMBER(9,2)
 CONSTRAINT res_c_res_rsv_ruimte_korting CHECK(res_rsv_ruimte_korting >= 0);

ALTER TABLE prs_kostenplaats ADD prs_kostenplaats_extern NUMBER(1) DEFAULT 0;

/////////////////////////////////////////////////////////////////////////////////////////// FSN#26014
CREATE INDEX bes_i_bes_bestelling13 ON bes_bestelling (bes_bestelling_retourvan_key);

/////////////////////////////////////////////////////////////////////////////////////////// SUTF#26060
CREATE_TABLE(prs_kostenplaatsdisc, 0) (
    prs_kostenplaatsdisc_key
        NUMBER(10) PRIMARY KEY,
    prs_kostenplaats_key
        NUMBER(10)
        CONSTRAINT prs_r_prs_kostenplaats_key4 REFERENCES prs_kostenplaats(prs_kostenplaats_key) ON DELETE CASCADE,
    ins_discipline_key
        NUMBER(10)
        REFERENCES ins_tab_discipline(ins_discipline_key) ON DELETE CASCADE,
    prs_kostenplaatsdisc_limiet
        NUMBER(8)
        NOT NULL
);
CREATE SEQUENCE prs_s_prs_kostenplaatsdisc_key MINVALUE 1;

CREATE_TRIGGER(prs_t_prs_kostenpltsdisc_B_IU)
BEFORE INSERT OR UPDATE ON prs_kostenplaatsdisc
FOR EACH ROW
BEGIN
    UPDATE_PRIMARY_KEY(prs_kostenplaatsdisc_key, prs_s_prs_kostenplaatsdisc_key);
END;
/

CREATE UNIQUE INDEX prs_i_prs_kostenplaatsdisc1 ON prs_kostenplaatsdisc (prs_kostenplaats_key, ins_discipline_key);

/////////////////////////////////////////////////////////////////////////////////////////// FSN#26123
UPDATE fac_functie SET fac_functie_groep = 0
 WHERE fac_functie_code IN ('WEB_CADALG', 'WEB_CADPRS', 'WEB_CADOBJ', 'WEB_CADMLD', 'WEB_CADCNT', 'WEB_CADSCH', 'WEB_CADSLE');

/////////////////////////////////////////////////////////////////////////////////////////// AAES#25942
ALTER TABLE fac_imp_onrgoed2 ADD prs_afdeling_naam            VARCHAR2(60 CHAR);
ALTER TABLE fac_imp_onrgoed2 ADD prs_ruimteafdeling_bezetting NUMBER(8,5);
ALTER TABLE fac_imp_onrgoed2 ADD alg_kenmerkwaarde1           VARCHAR2(255);
ALTER TABLE fac_imp_onrgoed2 ADD alg_kenmerkwaarde2           VARCHAR2(255);
ALTER TABLE fac_imp_onrgoed2 ADD alg_kenmerkwaarde3           VARCHAR2(255);
ALTER TABLE fac_imp_onrgoed2 ADD alg_kenmerkwaarde4           VARCHAR2(255);
ALTER TABLE fac_imp_onrgoed2 ADD alg_kenmerkwaarde5           VARCHAR2(255);

/////////////////////////////////////////////////////////////////////////////////////////// FSN#26109
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)
  SELECT 0, 'lcl_menu_res_fe_1', '', 'RES', 'appl/res/res_reservering.asp?urole=fe', 1, 0, fac_functie_key, 'W', '0'
    FROM fac_functie
   WHERE fac_functie_code='WEB_RESUSE'
   AND NOT EXISTS (SELECT fac_menuitems_key FROM fac_menuitems WHERE fac_menuitems_label = 'lcl_menu_res_fe_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)
  SELECT 1, 'lcl_menu_res_fo_1', '', 'RES', 'appl/res/res_reservering.asp?urole=fo', 1, 0, fac_functie_key, 'W', '0'
    FROM fac_functie
   WHERE fac_functie_code='WEB_RESFOF'
   AND NOT EXISTS (SELECT fac_menuitems_key FROM fac_menuitems WHERE fac_menuitems_label = 'lcl_menu_res_fo_1');

/////////////////////////////////////////////////////////////////////////////////////////// FSN#25952
CREATE TABLE fac_imp_cnt
(
   nummer_intern      VARCHAR2 (30),
   nummer_extern      VARCHAR2 (30),
   cnt_soort          VARCHAR2 (30),
   beschrijving       VARCHAR2 (50),
   mantel_nr          VARCHAR2 (30),
   omschrijving       VARCHAR2 (1000),
   afdeling           VARCHAR2 (10),
   perslid_eig        VARCHAR2 (30),
   perslid_beh        VARCHAR2 (30),
   opmerking          VARCHAR2 (1000),
   datum_ingang       DATE,
   datum_eind         DATE,
   datum_opzeg        DATE,
   datum_rappel       DATE,
   bedrijf_naam       VARCHAR2 (60),
   contact_naam       VARCHAR2 (30),
   kpn_code           VARCHAR2 (30),
   bedrag             NUMBER (11,2),
   bedrag_termijn     NUMBER (11,2),
   uurtarief          NUMBER (6,2),
   korting            NUMBER (4,2),
   gebouwcode         VARCHAR2 (12),
   verlengen          VARCHAR2 (1),
   flex1              VARCHAR2 (1000),
   flex2              VARCHAR2 (1000),
   flex3              VARCHAR2 (1000),
   flex4              VARCHAR2 (1000),
   flex5              VARCHAR2 (1000)
);

INSERT INTO fac_import_app
            (fac_import_app_code, fac_import_app_oms, fac_functie_key)
   SELECT 'CNT', 'FIP: Contracten', fac_functie_key
     FROM fac_functie
    WHERE fac_functie_code = 'WEB_PRSSYS';


/////////////////////////////////////////////////////////////////////////////////////////// FSN#25697
-- Setting mld_close_mld_auto moet op 1 staan. Dan pas mld_typeopdr_sluitmelding aanpassen van 1 naar 2.
UPDATE mld_typeopdr
   SET mld_typeopdr_sluitmelding = 2
 WHERE mld_typeopdr_sluitmelding = 1
   AND (SELECT COALESCE (fs.fac_setting_pvalue, fs.fac_setting_default)
          FROM fac_setting fs
         WHERE fs.fac_setting_name LIKE 'mld_close_mld_auto') = 1;

/////////////////////////////////////////////////////////////////////////////////////////// FSN#25708
CREATE_TABLE(fac_qvw_ticket, 0)
(
    fac_qvw_ticket_userid VARCHAR(32),
    fac_qvw_ticket_flags NUMBER(3) DEFAULT 0  NOT NULL,
    fac_qvw_ticket_aanmaak DATE DEFAULT SYSDATE,
    fac_qvw_ticket_uitgifte DATE DEFAULT SYSDATE,
    prs_perslid_key NUMBER(10) CONSTRAINT fac_r_qvw_perslid_key REFERENCES prs_perslid(prs_perslid_key) ON DELETE CASCADE
);

UPDATE fac_functie SET fac_functie_min_level = 3
 WHERE fac_functie_code = 'WEB_MGTRAP' AND fac_functie_min_level = 0;

UPDATE fac_groeprechten
   SET fac_gebruiker_prs_level_write = 9, fac_gebruiker_alg_level_write = 9
 WHERE     fac_functie_key = (SELECT fac_functie_key
                                FROM fac_functie
                               WHERE fac_functie_code = 'WEB_MGTRAP')
       AND fac_gebruiker_prs_level_write = -1
       AND fac_gebruiker_alg_level_write = -1;

UPDATE fac_setting
   SET fac_setting_pvalue = 2
 WHERE fac_setting_name = 'qvw_enabled' AND fac_setting_pvalue = 1;
/////////////////////////////////////////////////////////////////////////////////////////// FSN#24771
DEF_BOOKMARK('bestelopdr',      'appl/bes/bes_opdr.asp',        'ordernr=');

/////////////////////////////////////////////////////////////////////////////////////////// FSN#26422
UPDATE fac_setting
   SET fac_setting_default = '9999999'
     , fac_setting_description = 'I can approve myself below or equal this limit or someone else must approve always above this limit'
     , fac_setting_pvalue = (CASE fac_setting_pvalue
                             WHEN '1'
                             THEN '9999999'
                             ELSE fac_setting_pvalue
                             END)
 WHERE fac_setting_name LIKE 'can_selfapprove';

/////////////////////////////////////////////////////////////////////////////////////////// QA
-- detected using TOAD schema differences not all relevant, however the first are
ALTER TABLE fin_kenmerk DROP CONSTRAINT fin_c_fin_kenmerk_type1;
ALTER TABLE fin_kenmerk ADD CONSTRAINT fin_c_fin_kenmerk_type1 CHECK(fin_kenmerk_kenmerktype IN ('C','N','D','R','X','L','Q','F','M','E','S', 'l'));
ALTER TABLE ins_srtkenmerk DROP CONSTRAINT ins_c_ins_srtkenmerk_kenmtype;
ALTER TABLE ins_srtkenmerk ADD CONSTRAINT ins_c_ins_srtkenmerk_kenmtype CHECK(ins_srtkenmerk_kenmerktype IN ('C','N','D','R','X','L','Q','F','M','E','S', 'l'));

ALTER TABLE fac_locale DROP CONSTRAINT fac_u_fac_locale DROP INDEX;
ALTER TABLE fac_locale ADD CONSTRAINT fac_u_fac_locale UNIQUE(fac_locale_dialect_key, fac_locale_lang, fac_localeitems_key, fac_locale_kolomnaam, fac_locale_kolomkeyval);
ALTER TABLE fac_locale DROP CONSTRAINT fac_c_fac_locale1;
ALTER TABLE fac_locale ADD CONSTRAINT fac_c_fac_locale1
      CHECK((fac_localeitems_key IS NOT NULL AND fac_locale_dialect_key IS NOT NULL AND fac_locale_kolomnaam IS NULL AND fac_locale_kolomkeyval IS NULL)
         OR (fac_localeitems_key IS NULL AND fac_locale_dialect_key IS NULL AND fac_locale_kolomnaam IS NOT NULL AND fac_locale_kolomkeyval IS NOT NULL));
BEGIN
 adm.trydrop('INDEX res_i_res_rsv_artikel2');
END;
/
// res_u_res_activiteit_upper is vaker *afwezig* dan aanwezig
// ALTER TABLE res_activiteit DROP CONSTRAINT res_u_res_activiteit_upper DROP INDEX;
ALTER TABLE res_activiteit ADD CONSTRAINT res_u_res_activiteit_upper UNIQUE(res_activiteit_upper, res_activiteit_verwijder, res_srtactiviteit_key);
PROMPT Hierboven mag een foutmelding komen: ORA02261: Dergelijke unieke of primaire sleutel bestaat al in de tabel
ALTER TABLE alg_srtruimte DROP CONSTRAINT alg_c_prs_werkplek_verhuurbaar;
ALTER TABLE alg_srtruimte ADD CONSTRAINT alg_c_prs_werkplek_verhuurbaar CHECK(NOT(prs_bevat_werkplek = 1 AND prs_verhuurbaar IS NULL));

/////////////////////////////////////////////////////////////////////////////////////////// GENERAL


/////////////////////////////////////////////////////////////////////////////////////////// CLEANUP
ALTER TABLE fac_api DROP COLUMN fac_api_apikey;
ALTER TABLE fac_api DROP COLUMN prs_perslid_key;
ALTER TABLE fac_api DROP COLUMN fac_api_no_session;
--FSN#25590
BEGIN
 adm.trydrop('TABLE sys_tracking PURGE');
 adm.trydrop('FUNCTION PRS_P_PRS_BepaalWerkplekOpp');
 adm.trydrop('PACKAGE fac_p_fac_save_restore');
END;
/
--FSN#17879
ALTER TABLE bes_bestelling DROP COLUMN bes_bestelling_item_cnt;
ALTER TABLE bes_bestelling DROP COLUMN bes_bestelling_item_cnt_lev;
ALTER TABLE bes_bestelling DROP COLUMN bes_bestelling_item_cnt_acpt;

ALTER TABLE bes_bestelopdr DROP COLUMN bes_bestelopdr_item_cnt;
ALTER TABLE bes_bestelopdr DROP COLUMN bes_bestelopdr_item_cnt_lev;

ALTER TABLE fac_usrtab DROP COLUMN fac_usrtab_viewdef;
ALTER TABLE fac_usrtab DROP COLUMN fac_usrtab_view;
-- Later wellicht in de epiloog;
DELETE FROM fac_selectie;
///////////////////////////////////////////////////////////////////////////////////////////
REGISTERONCE('$Workfile: DB17to18.src $','$Revision$')
#include "epilogue.inc"
