#ifdef PRJ
/*  PRJ_PAC.SRC
 * $Revision$
 * $Id$
 */
/*
  CODE COMMENTS, CONSIDERATIONS

Voor een verdiepinging kan in 1 klap een scenario-omgeving worden aangemaakt: prj_initiate_scenario.
Dit scenario kan worden geannuleerd met prj_cancel_scenario.

In een scenario bevat elk item een link naar zijn bron in the real world. Omdat dingen ook toegevoegd kunnen
zijn, kan deze link ook leeg zijn. In dat geval moet de relatie met de buitenwereld bekend zijn, om het nieuwe
item later op de juiste plek in te kunnen vullen. Dat is:
prj_ruimte: alg_ruimte_key of alg_verdieping_key (alg_srtruimte_key verplicht)
prj_werkplek: prs_werkplek_key of prj_ruimte_key
prj_perslidwerkplek: prs_perslidwerkplek_key of prj_werkplek x prs_perslid/prs_afdeling.
prj_deel: ins_deel_key of prj_alg_ruimte_key/prj_alg_ruimte_type

Een scenarioruimte kan afwijkende soort en oppervlakte hebben.

Voor bron wordt zoveel mogelijk (altijd?) de originele keys gebruikt(alg_ruimte etc)
en voor bestemming de prj keys (prj_ruimte etc)

 */

CREATE OR REPLACE PACKAGE prj
AS
   PROCEDURE prj_initiate_scenario (pscenariokey IN NUMBER, pverdiepingkey IN NUMBER);
   PROCEDURE prj_copy_scenario (pscenariokey_from IN   NUMBER, pscenariokey_to IN NUMBER);
   PROCEDURE prj_reinitiate_scenario (pscenariokey IN NUMBER, pverdiepingkey IN NUMBER);
   PROCEDURE prj_cancel_scenario (pscenariokey IN NUMBER, pverdiepingkey IN NUMBER);
   PROCEDURE prj_commit_scenario (pscenariokey IN NUMBER);
   PROCEDURE prj_move_werkplek (pwerkplekkey IN NUMBER, pruimtekey IN NUMBER);
   PROCEDURE prj_move_perslidwerkplek (pperslidwerkplekkey IN NUMBER, pruimtekey IN NUMBER, pwerkplekkey IN NUMBER);
   PROCEDURE prj_move_perslid (pperslidkey IN NUMBER, pruimtekey IN NUMBER, pwerkplekkey IN NUMBER);
   PROCEDURE prj_move_perslid2 (pperslidkey IN NUMBER, pruimtekey IN NUMBER);
   FUNCTION forceuniqueness (element_type IN VARCHAR2 , parent_key IN NUMBER, element_omschrijving IN VARCHAR2, srtdeelkey IN NUMBER )
      RETURN VARCHAR2 ;
   FUNCTION find_or_create_free_werkplek (pruimtekey   IN   NUMBER,bezetting    IN   NUMBER )
      RETURN NUMBER ;
END prj;
/

CREATE OR REPLACE PACKAGE BODY prj
AS
----------------------------------------------
-- UTILITY PROCEDURES AND FUNCTIONS
----------------------------------------------
   PROCEDURE checkscenario (pscenariokey IN NUMBER)
   AS
      dummy   VARCHAR2 (1);
   BEGIN
      SELECT 'x'
        INTO dummy
        FROM prj_scenario s
       WHERE s.prj_scenario_key = pscenariokey;
   EXCEPTION
      WHEN NO_DATA_FOUND
      THEN
         raise_application_error
                         (-20001,
                          'prj package: invalid parameter _VAR(pscenariokey)'
                         );
         RETURN;
   END checkscenario;
   FUNCTION forceuniqueness (
      element_type           IN   VARCHAR2,
      parent_key             IN   NUMBER,
      element_omschrijving   IN   VARCHAR2,
	  srtdeelkey             IN   NUMBER
   )
      RETURN VARCHAR2
   IS
      omschrijving   VARCHAR2 (30);
      prefix         VARCHAR2 (30);
   BEGIN
      IF element_type = 'ALG_RUIMTE'
      THEN
         -- Zoek op de geselecteerde verdieping of het huidige ruimtenummer al voor komt.
         BEGIN
            SELECT    g.alg_gebouw_code
                   || '-'
                   || TO_CHAR (v.alg_verdieping_code)
                   || '-'
              INTO prefix
              FROM alg_gebouw g, alg_verdieping v, alg_ruimte r
             WHERE g.alg_gebouw_key = v.alg_gebouw_key
               AND v.alg_verdieping_key = r.alg_verdieping_key
               AND r.alg_verdieping_key = parent_key
               AND r.alg_ruimte_nr = element_omschrijving
               AND r.alg_ruimte_verwijder IS NULL;
            -- Gevonden, dus niet uniek. Probeer het met een sterretje ervoor, passen ze dat later maar zelf aan
            omschrijving :=
               forceuniqueness (element_type,
                                parent_key,
                                SUBSTR ('*' || element_omschrijving, 1, 10),
								NULL
                               );
         EXCEPTION
            WHEN NO_DATA_FOUND
            THEN
               omschrijving := element_omschrijving;
         END;
      END IF;
	  -- objecten
      IF element_type = 'INS_DEEL'
      THEN
         -- Zoek op de locatie of het huidige objectnummer al voor komt.
         BEGIN
            SELECT ins_deel_omschrijving
              INTO prefix
              FROM ins_deel
             WHERE ins_alg_locatie_key = parent_key
               AND ins_deel_upper = upper(element_omschrijving)
			   AND ins_srtdeel_key = srtdeelkey
               AND ins_deel_verwijder IS NULL;
            -- Gevonden, dus niet uniek. Probeer het met een sterretje ervoor, passen ze dat later maar zelf aan
			SELECT ins.get_description('LPN_INS_DEEL',parent_key , ins_srtdeel_code_upper)
				   INTO omschrijving
            	   FROM ins_srtdeel WHERE ins_srtdeel_key=srtdeelkey;
         EXCEPTION
            WHEN NO_DATA_FOUND
            THEN
               omschrijving := element_omschrijving;
         END;
      END IF;
      -- Voor werkplekken, die een unieke numerieke ID hebben wordt gecheckt of de huidige waarde ok is,
      -- en zoniet, dan wordt er doorgeteld tot de eersthogere wel unieke
      IF element_type = 'PRS_WERKPLEK'
      THEN
         -- Zoek in de geselecteerde ruimte of het huidige werkpleknummer al voor komt.
         BEGIN
            SELECT    g.alg_gebouw_code
                   || '-'
                   || TO_CHAR (v.alg_verdieping_code)
                   || '-'
                   || TO_CHAR (r.alg_ruimte_nr)
              INTO prefix
              FROM alg_gebouw g,
                   alg_verdieping v,
                   alg_ruimte r,
                   prs_werkplek w
             WHERE g.alg_gebouw_key = v.alg_gebouw_key
               AND v.alg_verdieping_key = r.alg_verdieping_key
               AND w.prs_alg_ruimte_key = r.alg_ruimte_key
               AND w.prs_alg_ruimte_key = parent_key
               AND w.prs_werkplek_volgnr = TO_NUMBER (element_omschrijving);
            -- Gevonden, dus niet uniek. Probeer het met een sterretje ervoor, passen ze dat later maar zelf aan
            IF TO_NUMBER (element_omschrijving) = 999
            THEN
               -- Ik kan met 3 cijfers niet hoger, begin opnieuw onderaan (to prevent infinite recursion)
               omschrijving :=
                            forceuniqueness (element_type, parent_key, '000', NULL);
            ELSE
               omschrijving :=
                  forceuniqueness (element_type,
                                   parent_key,
                                   TO_CHAR (  TO_NUMBER (element_omschrijving)
                                            + 1
                                           ),
								   NULL
                                  );
            END IF;
         EXCEPTION
            WHEN NO_DATA_FOUND
            THEN
               omschrijving := element_omschrijving;
         END;
      END IF;
      IF element_type = 'PRJ_WERKPLEK'
      THEN
         -- Zoek in de geselecteerde ruimte of het huidige werkpleknummer al voor komt.
         BEGIN
            SELECT 'x'
              INTO prefix
              FROM prj_werkplek w
             WHERE w.prj_ruimte_key = parent_key
               AND w.prj_werkplek_volgnr = element_omschrijving
               AND w.prj_werkplek_verwijder IS NULL;
            -- Gevonden, dus niet uniek. Probeer het met een sterretje ervoor, passen ze dat later maar zelf aan
            IF TO_NUMBER (element_omschrijving) = 999
            THEN
               -- Ik kan met 3 cijfers niet hoger, begin opnieuw onderaan (to prevent infinite recursion)
               omschrijving :=
                            forceuniqueness (element_type, parent_key, '000', NULL);
            ELSE
               omschrijving :=
                  forceuniqueness (element_type,
                                   parent_key,
                                   TO_CHAR (  TO_NUMBER (element_omschrijving)
                                            + 1
                                           ),
								   NULL
                                  );
            END IF;
         EXCEPTION
            WHEN NO_DATA_FOUND
            THEN
               omschrijving := element_omschrijving;
         END;
      END IF;
      RETURN omschrijving;
   END;
   FUNCTION defaultwpomschrijving (pruimtekey IN NUMBER, pwerkpleknr IN NUMBER)
      RETURN VARCHAR2
   IS
      omschrijving   VARCHAR2 (30);
   BEGIN
      SELECT SUBSTR (   prj_ruimte_nr
                     || '/'
                     || LPAD (TO_CHAR (pwerkpleknr), 3, '0'),
                     1,
                     30
                    )
        INTO omschrijving
        FROM prj_ruimte
       WHERE prj_ruimte_key = pruimtekey;
      RETURN omschrijving;
   END;
----------------------------------------------
-- SCENARIO MANAGEMENT PROCEDURES
----------------------------------------------
   PROCEDURE prj_initiate_scenario (
      pscenariokey     IN   NUMBER,
      pverdiepingkey   IN   NUMBER
   )
   AS
      dummy   VARCHAR2 (1);
   BEGIN
      checkscenario (pscenariokey);
      BEGIN
         SELECT 'x'
           INTO dummy
           FROM alg_verdieping v
          WHERE v.alg_verdieping_key = pverdiepingkey
            AND v.alg_verdieping_verwijder IS NULL;
      EXCEPTION
         WHEN NO_DATA_FOUND
         THEN
            raise_application_error
               (-20001,
                'prj_initiate_scenario: invalid parameter _VAR(pverdiepingkey)'
               );
            RETURN;
      END;
      BEGIN
         SELECT 'x'
           INTO dummy
           FROM prj_ruimte rx
          WHERE rx.alg_verdieping_key = pverdiepingkey
            AND rx.prj_scenario_key = pscenariokey;
      EXCEPTION
         WHEN NO_DATA_FOUND
         THEN
            NULL;
         WHEN OTHERS
         THEN
            -- Bestaat al; niks doen en gewoon terugkeren
            NULL;
            RETURN;
      END;
      -- ** Parameters are proven valid
      -- ?? Check of er al een kopie bestaat nodig ??
      -- Kopieer de ruimtes
      INSERT INTO prj_ruimte
                  (prj_ruimte_key, prj_scenario_key, alg_ruimte_key,
                   alg_verdieping_key, alg_srtruimte_key, prj_ruimte_nr,
                   prj_ruimte_omschrijving, prj_ruimte_bruto_vloeropp,
                   prj_ruimte_omtrek, prj_ruimte_inhoud)
         SELECT NULL, pscenariokey, alg_ruimte_key, alg_verdieping_key,
                alg_srtruimte_key, alg_ruimte_nr, alg_ruimte_omschrijving,
                alg_ruimte_bruto_vloeropp, alg_ruimte_omtrek,
                alg_ruimte_inhoud
           FROM alg_ruimte r
          WHERE r.alg_ruimte_verwijder IS NULL
            AND alg_verdieping_key = pverdiepingkey;
      -- Kopieer de werkplekken
      INSERT INTO prj_werkplek
                  (prj_werkplek_key, prs_werkplek_key, prj_werkplek_volgnr,
                   prj_werkplek_omschrijving, prj_werkplek_vastopp,
                   prj_werkplek_opp, prj_ruimte_key,
				   prj_werkplek_dwgx, prj_werkplek_dwgy,
				   prj_werkplek_dwgrotatie, prj_werkplek_dwgschaal)
         SELECT NULL, prs_werkplek_key, prs_werkplek_volgnr,
                prs_werkplek_omschrijving, prs_werkplek_vastopp,
                prs_werkplek_opp, prj_ruimte_key,
				   prs_werkplek_dwgx, prs_werkplek_dwgy,
				   prs_werkplek_dwgrotatie, prs_werkplek_dwgschaal
           FROM prs_werkplek w, prj_ruimte rx
          WHERE w.prs_alg_ruimte_key = rx.alg_ruimte_key
            AND w.prs_werkplek_virtueel = 0
            AND rx.prj_scenario_key = pscenariokey
            AND rx.alg_verdieping_key = pverdiepingkey;
      -- Kopieer de werkplekbezettingen
      INSERT INTO prj_perslidwerkplek
                  (prj_perslidwerkplek_key, prs_perslidwerkplek_key,
                   prs_perslid_key, prj_werkplek_key,
                   prj_perslidwerkplek_bezetting)
         SELECT NULL, pw.prs_perslidwerkplek_key, pw.prs_perslid_key,
                wx.prj_werkplek_key, pw.prs_perslidwerkplek_bezetting
           FROM prs_perslidwerkplek pw, prj_werkplek wx, prj_ruimte rx
          WHERE pw.prs_werkplek_key = wx.prs_werkplek_key
            AND rx.prj_scenario_key = pscenariokey
            AND pw.prs_perslid_key IS NOT NULL
            AND wx.prj_ruimte_key = rx.prj_ruimte_key
            AND rx.alg_verdieping_key = pverdiepingkey;
      -- Kopieer de ruimteafdelingen
      INSERT INTO prj_ruimteafdeling
                  (prj_ruimteafdeling_key, prs_ruimteafdeling_key,
                   prs_afdeling_key, prj_ruimte_key,
                   prj_ruimteafdeling_bezetting
                  )
         SELECT NULL,
                ra.prs_ruimteafdeling_key,
                ra.prs_afdeling_key,
                rx.prj_ruimte_key,
                ra.prs_ruimteafdeling_bezetting
           FROM prs_ruimteafdeling ra,
                prj_ruimte rx
          WHERE ra.alg_ruimte_key = rx.alg_ruimte_key
            AND ra.prs_ruimteafdeling_verwijder IS NULL
            AND rx.prj_scenario_key = pscenariokey
            AND rx.alg_verdieping_key = pverdiepingkey;
      -- Kopieer de objecten
      INSERT INTO prj_deel
                  (prj_deel_key, ins_deel_key, prj_ruimte_key,
                   prj_deel_omschrijving, ins_srtdeel_key,
				   prj_deel_dwgx, prj_deel_dwgy,
				   prj_deel_dwgrotatie, prj_deel_dwgschaal)
         SELECT NULL, ins_deel_key, rx.prj_ruimte_key, ins_deel_omschrijving,
                d.ins_srtdeel_key,
				   ins_deel_dwgx, ins_deel_dwgy,
				   ins_deel_dwgrotatie, ins_deel_dwgschaal
           FROM ins_deel d, alg_v_aanwezigruimte r, prj_ruimte rx
          WHERE d.ins_alg_ruimte_type = 'R'
            AND d.ins_alg_ruimte_key = r.alg_ruimte_key
            AND d.ins_deel_parent_key IS NULL
            AND d.ins_deel_verwijder IS NULL
            AND rx.prj_scenario_key = pscenariokey
            AND rx.alg_ruimte_key = r.alg_ruimte_key
            AND r.alg_verdieping_key = pverdiepingkey;
      INSERT INTO prj_deel
                  (prj_deel_key, ins_deel_key, prj_ruimte_key, prj_werkplek_key, prj_deel_omschrijving, ins_srtdeel_key,
				   prj_deel_dwgx, prj_deel_dwgy,
				   prj_deel_dwgrotatie, prj_deel_dwgschaal)
         SELECT NULL, ins_deel_key, rx.prj_ruimte_key, wx.prj_werkplek_key, ins_deel_omschrijving, d.ins_srtdeel_key,
				   ins_deel_dwgx, ins_deel_dwgy,
				   ins_deel_dwgrotatie, ins_deel_dwgschaal
           FROM ins_deel d, alg_v_aanwezigruimte r, prs_werkplek w, prj_ruimte rx, prj_werkplek wx
          WHERE d.ins_alg_ruimte_type = 'W'
            AND d.ins_alg_ruimte_key = w.prs_werkplek_key
            AND w.prs_alg_ruimte_key = r.alg_ruimte_key
            AND d.ins_deel_parent_key IS NULL
            AND d.ins_deel_verwijder IS NULL
            AND rx.prj_scenario_key = pscenariokey
            AND rx.alg_ruimte_key = r.alg_ruimte_key
            AND wx.prj_ruimte_key = rx.prj_ruimte_key
            AND r.alg_verdieping_key = pverdiepingkey
			AND wx.prs_werkplek_key = w.prs_werkplek_key;
      COMMIT;
   END prj_initiate_scenario;
   PROCEDURE prj_copy_scenario (
      pscenariokey_from   IN   NUMBER,
      pscenariokey_to     IN   NUMBER
   )
   AS
      dummy   VARCHAR2 (1);
   BEGIN
      checkscenario (pscenariokey_from);
      checkscenario (pscenariokey_to);
      BEGIN
         SELECT 'x'
           INTO dummy
           FROM prj_ruimte rx
          WHERE rx.prj_scenario_key = pscenariokey_to;
      EXCEPTION
         WHEN NO_DATA_FOUND
         THEN
            NULL;
         WHEN OTHERS
         THEN
            -- Bestaat al; niks doen en gewoon terugkeren
            NULL;
            RETURN;
      END;
      raise_application_error (-20002, 'prj package: copy not yet supported');
      RETURN;
      -- ** Parameters are proven valid
      -- Kopieer de ruimtes
      INSERT INTO prj_ruimte
                  (prj_ruimte_key, prj_scenario_key, alg_ruimte_key,
                   alg_verdieping_key, alg_srtruimte_key, prj_ruimte_nr,
                   prj_ruimte_omschrijving, prj_ruimte_bruto_vloeropp,
                   prj_ruimte_omtrek, prj_ruimte_inhoud)
         SELECT NULL, pscenariokey_to, alg_ruimte_key, alg_verdieping_key,
                alg_srtruimte_key, prj_ruimte_nr, prj_ruimte_omschrijving,
                prj_ruimte_bruto_vloeropp, prj_ruimte_omtrek,
                prj_ruimte_inhoud
           FROM prj_ruimte rx
          WHERE prj_scenario_key = pscenariokey_from;
-- TODO: vergt nog wat uitwerking: de parent key van de zojuist aangemaakte ruimte etc gebruiken
      -- Kopieer de werkplekken
      INSERT INTO prj_werkplek
                  (prj_werkplek_key, prs_werkplek_key, prj_werkplek_volgnr,
                   prj_werkplek_omschrijving, prj_werkplek_vastopp,
                   prj_ruimte_key)
         SELECT NULL, wx.prs_werkplek_key, wx.prj_werkplek_volgnr,
                wx.prj_werkplek_omschrijving, wx.prj_werkplek_vastopp,
                wx.prj_ruimte_key
           FROM prj_werkplek wx, prj_ruimte rx, prj_ruimte rxx
          WHERE wx.prj_ruimte_key = rx.prj_ruimte_key
            AND rx.prj_ruimte_nr = rxx.prj_ruimte_nr
            AND rx.alg_verdieping_key = rxx.alg_verdieping_key
            AND rx.prj_scenario_key = pscenariokey_from;
      -- Kopieer de werkplekbezettingen
      INSERT INTO prj_perslidwerkplek
                  (prj_perslidwerkplek_key, prs_perslidwerkplek_key,
                   prs_perslid_key, prj_werkplek_key,
                   prj_perslidwerkplek_bezetting)
         SELECT NULL, pwx.prs_perslidwerkplek_key,
                pwx.prs_perslid_key, pwx.prj_werkplek_key,
                pwx.prj_perslidwerkplek_bezetting
           FROM prj_perslidwerkplek pwx, prj_werkplek wx, prj_ruimte rx
          WHERE pwx.prj_werkplek_key = wx.prj_werkplek_key
            AND rx.prj_scenario_key = pscenariokey_from
            AND wx.prj_ruimte_key = rx.prj_ruimte_key;
      -- Kopieer de objecten
      INSERT INTO prj_deel
                  (prj_deel_key, ins_deel_key, prj_ruimte_key, prj_werkplek_key,
                   prj_deel_omschrijving, ins_srtdeel_key,
				   prj_deel_dwgx, prj_deel_dwgy,
				   prj_deel_dwgrotatie, prj_deel_dwgschaal)
         SELECT NULL, dx.ins_deel_key, dx.prj_ruimte_key, prj_werkplek_key,
                dx.prj_deel_omschrijving, dx.ins_srtdeel_key,
				   prj_deel_dwgx, prj_deel_dwgy,
				   prj_deel_dwgrotatie, prj_deel_dwgschaal
           FROM prj_deel dx, prj_ruimte rx
          WHERE dx.prj_ruimte_key = rx.prj_ruimte_key
            AND rx.prj_scenario_key = pscenariokey_from;
      COMMIT;
   END prj_copy_scenario;
   PROCEDURE prj_reinitiate_scenario (
      pscenariokey     IN   NUMBER,
      pverdiepingkey   IN   NUMBER
   )
   AS
   BEGIN
      checkscenario (pscenariokey);
   -- Oogmerk van deze routine kan het opfrissen van het snapshot van dit scenario zijn met behoud van reeds gedane wijzigingen
   -- FUTURE EXTENSION
   END prj_reinitiate_scenario;
   -- Annuleer een scenario of een verdieping van een scenario
   -- Als pverdiepingkey NULL is, wordt ook het scenario verwijderd.
   PROCEDURE prj_cancel_scenario (
      pscenariokey     IN   NUMBER,
      pverdiepingkey   IN   NUMBER
   )
   AS
      dummy   VARCHAR2 (1);
   BEGIN
      checkscenario (pscenariokey);
      IF TRUE OR pverdiepingkey IS NULL
      THEN
         DELETE FROM prj_ruimte rx
               WHERE rx.prj_scenario_key = pscenariokey;
         -- Deze cascadeert door naar de onderliggende items
         DELETE FROM prj_scenario
               WHERE prj_scenario_key = pscenariokey;
      ELSE
         -- Zet nu alle werkplekken die van een andere verdieping naar deze
         -- te verwijderen verdieping gezet zijn terug naar waar ze vandaan kwamen
         UPDATE prj_werkplek wx
            SET wx.prj_ruimte_key =
                   (SELECT prj_ruimte_key
                      FROM prj_ruimte rx, alg_ruimte r, prs_werkplek w
                     WHERE wx.prs_werkplek_key = w.prs_werkplek_key
                       AND w.prs_alg_ruimte_key = r.alg_ruimte_key
                       AND rx.alg_ruimte_key = r.alg_ruimte_key
                       AND rx.prj_scenario_key = pscenariokey)
          WHERE wx.prj_ruimte_key IN (
                   SELECT prj_ruimte_key
                     FROM prj_ruimte
                    WHERE alg_verdieping_key = pverdiepingkey
                      AND prj_scenario_key = pscenariokey);
           -- De personen die van een andere verdieping op een werkplke zijn gezet die nu
         -- gaat vervallen, komen tussen de thuislozen terecht. Terugzetten op hun oude plek
         -- is nl. ook niet altijd triviaal. Het zou mooi zijn als ze nu vanuit dat reservoir
         -- een nieuwe plek kunnen gaat krijgen.
         -- Suggestie: dergelijke personen in de buffer gooien?
           -- Vervolgens worden nu de ruimtekopien van de gevraagde verdieping weer verwijderd.
         DELETE FROM prj_ruimte rx
               WHERE rx.prj_scenario_key = pscenariokey
                 AND rx.alg_verdieping_key = pverdiepingkey;
      END IF;
   END prj_cancel_scenario;
----------------------------------------------
-- SCENARIO TRANSACTION PROCEDURES
----------------------------------------------
---------------------------------------
--  Moves a werkplek to another ruimte
---------------------------------------
   PROCEDURE prj_move_werkplek (pwerkplekkey IN NUMBER, pruimtekey IN NUMBER)
   AS
      currentnr prj_werkplek.prj_werkplek_volgnr%TYPE;
      currentomschrijving prj_werkplek.prj_werkplek_omschrijving%TYPE;
      currentruimtenr prj_ruimte.prj_ruimte_nr%TYPE;
      werkpleknr prj_werkplek.prj_werkplek_volgnr%TYPE;
      werkplekomschrijving prj_werkplek.prj_werkplek_omschrijving%TYPE;
      scenariokey prj_ruimte.prj_scenario_key%TYPE;
   BEGIN
      SELECT   w.prj_werkplek_volgnr, w.prj_werkplek_omschrijving, r.prj_ruimte_nr
        INTO   currentnr, currentomschrijving, currentruimtenr
        FROM   prj_werkplek w, prj_ruimte r
       WHERE   w.prj_ruimte_key = r.prj_ruimte_key AND prj_werkplek_key = pwerkplekkey;

      werkpleknr := TO_NUMBER (forceuniqueness ('PRJ_WERKPLEK', pruimtekey, TO_CHAR (currentnr), NULL));

      -- verzin een nieuwe naam als de oude begon met het nummer van de oorspronkelijke ruimte
      IF INSTR (currentomschrijving, currentruimtenr || '/') = 1
      THEN
         werkplekomschrijving := defaultwpomschrijving (pruimtekey, werkpleknr);
      ELSE
         werkplekomschrijving := currentomschrijving;
      END IF;

      UPDATE prj_werkplek
         SET prj_ruimte_key = pruimtekey,
             prj_werkplek_volgnr = werkpleknr,
             prj_werkplek_omschrijving = werkplekomschrijving
       WHERE prj_werkplek_key = pwerkplekkey AND prj_ruimte_key <> pruimtekey;
      -- niet onnodig moven
      SELECT prj_scenario_key
        INTO scenariokey
        FROM prj_ruimte
       WHERE prj_ruimte_key = pruimtekey;
   END;
-------------------------------------
--  Find a sufficiently free werkplek in ruimte pruimtekey
--  If necessary create a new one
-------------------------------------
   FUNCTION find_or_create_free_werkplek (
      pruimtekey   IN   NUMBER,
      bezetting    IN   NUMBER
   )
      RETURN NUMBER
   IS
      omschrijving           VARCHAR2 (30);
      prefix                 VARCHAR2 (30);
      werkplekkey            prj_werkplek.prj_werkplek_key%TYPE;
      werkpleknr             prj_werkplek.prj_werkplek_volgnr%TYPE;
      werkplekomschrijving   prj_werkplek.prj_werkplek_omschrijving%TYPE;
   BEGIN
      BEGIN
         -- Wat is de eerste werkplek in de nieuwe ruimte waarin deze bezetting zou passen?
         SELECT prj_werkplek_key
           INTO werkplekkey
           FROM (SELECT   wx.prj_werkplek_key
                     FROM (SELECT *
                             FROM prj_werkplek
                            WHERE prj_werkplek_verwijder IS NULL) wx,
                          (SELECT *
                             FROM prj_perslidwerkplek
                            WHERE prj_perslidwerkplek_verwijder IS NULL) pwx
                    WHERE wx.prj_ruimte_key = pruimtekey
                      AND wx.prj_werkplek_key = pwx.prj_werkplek_key(+)
                 GROUP BY wx.prj_werkplek_key
                   HAVING   NVL (SUM (pwx.prj_perslidwerkplek_bezetting), 0)
                          + bezetting <= 100)
          WHERE ROWNUM = 1;
      EXCEPTION
         WHEN NO_DATA_FOUND
         THEN
            -- Zo nee: verzin er eentje (begin bij 1 te tellen)
            werkpleknr :=
               TO_NUMBER (forceuniqueness ('PRJ_WERKPLEK',
                                           pruimtekey,
                                           TO_CHAR (1),
										   NULL
                                          )
                         );
            werkplekomschrijving :=
                                defaultwpomschrijving (pruimtekey, werkpleknr);
            INSERT INTO prj_werkplek
                        (prj_werkplek_key, prs_werkplek_key,
                         prj_werkplek_volgnr, prj_werkplek_omschrijving,
                         prj_werkplek_vastopp, prj_ruimte_key
                        )
                 VALUES (NULL, NULL,
                         werkpleknr, werkplekomschrijving,
                         NULL, pruimtekey
                        );
            SELECT prj_werkplek_key
              INTO werkplekkey
              FROM prj_werkplek
             WHERE prj_ruimte_key = pruimtekey
               AND prj_werkplek_volgnr = werkpleknr
               AND prj_werkplek_verwijder IS NULL;
      --DBMS_OUTPUT.put_line ('inserted _VAR(werkplekkey):'   ||   TO_CHAR (werkplekkey));
      END;
      RETURN werkplekkey;
   END;                               -- Function find_or_create_free_werkplek
-------------------------------------
--  Moves a perslidwerkplek (bezetting) to another ruimte/werkplek. The old werkplek remains
--  pwerkplekkey is optional and acts like a preferred werkplek and will be used
--  even if it does not fit
-------------------------------------
   PROCEDURE prj_move_perslidwerkplek (
      pperslidwerkplekkey   IN   NUMBER,
      pruimtekey            IN   NUMBER,
      pwerkplekkey          IN   NUMBER
   )
   AS
      oldruimtekey       prj_werkplek.prj_ruimte_key%TYPE;
      oldwerkplekkey     prj_werkplek.prj_werkplek_key%TYPE;
      currentbezetting   prj_perslidwerkplek.prj_perslidwerkplek_bezetting%TYPE;
      reedsbezet         prj_perslidwerkplek.prj_perslidwerkplek_bezetting%TYPE;
      scenariokey        prj_ruimte.prj_scenario_key%TYPE;
      werkplekkey        prj_werkplek.prj_werkplek_key%TYPE;
   BEGIN
      -- Wat is eigenlijk de ruimte/werkplek van herkomst en de actuele bezetting van de te verplaatsen werkplek?
      SELECT wx.prj_ruimte_key, pwx.prj_perslidwerkplek_bezetting,
             wx.prj_werkplek_key
        INTO oldruimtekey, currentbezetting,
             oldwerkplekkey
        FROM prj_werkplek wx, prj_perslidwerkplek pwx
       WHERE wx.prj_werkplek_key = pwx.prj_werkplek_key
         AND pwx.prj_perslidwerkplek_key = pperslidwerkplekkey;
      --DBMS_OUTPUT.put_line ('_VAR(oldruimtekey):'    ||    TO_CHAR (oldruimtekey));
      --DBMS_OUTPUT.put_line ('_VAR(currentbezetting):'    ||    TO_CHAR (currentbezetting));
      IF pwerkplekkey IS NOT NULL AND pwerkplekkey = oldwerkplekkey
      THEN
         RETURN;
      END IF;
      IF pwerkplekkey IS NOT NULL
      THEN
         werkplekkey := pwerkplekkey;
      ELSE
         -- Is de bestemmingsruimte een andere dan de huidige?
         IF pruimtekey = oldruimtekey
         THEN
            RETURN;
         END IF;
         werkplekkey :=
                   find_or_create_free_werkplek (pruimtekey, currentbezetting);
      END IF;
      -- Er is nu een werkplekkey bepaald.
      UPDATE prj_perslidwerkplek
         SET prj_werkplek_key = werkplekkey
       WHERE prj_perslidwerkplek_key = pperslidwerkplekkey
         AND prj_werkplek_key <> werkplekkey;
      -- niet onnodig moven (dubbelcheck)
      COMMIT;
   END;
-------------------------------------
--  Moves a perslid to a ruimte
-- Gebruikt als prs_werkplek_implicit==1
-- We negeren bezetting en maken altijd een nieuwe werkplek aan
-------------------------------------
   PROCEDURE prj_move_perslid2 (
      pperslidkey    IN   NUMBER,
      pruimtekey     IN   NUMBER
   )
   AS
      werkplekkey            prj_werkplek.prj_werkplek_key%TYPE;
      oudepwpkey             prj_perslidwerkplek.prj_perslidwerkplek_key%TYPE;
   BEGIN
      werkplekkey := find_or_create_free_werkplek (pruimtekey, 101); -- Door 101 krijgen we altijd een nieuwe
      -- Is er nog een tijdens *dit* scenario vervallen werkplekbezettingsrecord?
      -- Zo ja, dan willen we deze gebruiken om de binding tussen Van en Naar
      -- zo goed mogelijk te behouden. Alleen relevant als het om een oorspronkelijk
      -- bezettingsrecord gaat (met verwijzing naar de werkelijkheid)
      BEGIN
         SELECT prj_perslidwerkplek_key
           INTO oudepwpkey
           FROM prj_perslidwerkplek pwx,
                prj_werkplek wx,
                prj_ruimte rx,
                prj_ruimte rx2
          WHERE rx.prj_ruimte_key = wx.prj_ruimte_key
            AND rx.prj_scenario_key = rx2.prj_scenario_key
            AND rx2.prj_ruimte_key = pruimtekey
            AND wx.prj_werkplek_key = pwx.prj_werkplek_key
            AND pwx.prs_perslid_key = pperslidkey
            AND pwx.prs_perslidwerkplek_key IS NOT NULL
            AND pwx.prj_perslidwerkplek_verwijder IS NOT NULL;
         UPDATE prj_perslidwerkplek
            SET prj_perslidwerkplek_verwijder = NULL,
                prj_werkplek_key = werkplekkey
          WHERE prj_perslidwerkplek_key = oudepwpkey;
      EXCEPTION
         WHEN NO_DATA_FOUND
         THEN
            --DBMS_OUTPUT.put_line ('_VAR(werkplekkey):'    ||    TO_CHAR (werkplekkey));
            -- Er is nu een werkplekkey bepaald.
            INSERT INTO prj_perslidwerkplek
                        (prj_werkplek_key, prs_perslid_key)
                 VALUES (werkplekkey, pperslidkey);
      END;
      COMMIT;
   END;
-------------------------------------
--  Moves a perslidwerkplek (bezetting) to another ruimte/werkplek. The old werkplek remains
--  pwerkplekkey is optional and acts like a preferred werkplek and will be used
--  even if it does not fit
--  Zie ook variant prj_move_perslid2
-------------------------------------
   PROCEDURE prj_move_perslid (
      pperslidkey    IN   NUMBER,
      pruimtekey     IN   NUMBER,
      pwerkplekkey   IN   NUMBER
   )
   AS
      reedsbezet             prj_perslidwerkplek.prj_perslidwerkplek_bezetting%TYPE;
      doelbezetting          prj_perslidwerkplek.prj_perslidwerkplek_bezetting%TYPE;
      werkplekkey            prj_werkplek.prj_werkplek_key%TYPE;
      werkpleknr             prj_werkplek.prj_werkplek_volgnr%TYPE;
      werkplekomschrijving   prj_werkplek.prj_werkplek_omschrijving%TYPE;
      scenariokey            prj_ruimte.prj_scenario_key%TYPE;
      oudepwpkey             prj_perslidwerkplek.prj_perslidwerkplek_key%TYPE;
   BEGIN
      -- Wat is de te gebruiken bezetting van deze persoon (100 minus reeds op andere plekken aanwezig)?
      -- TODO: dienstverband verwerken
      -- TODO: persoon kan ook nog bezetting hebben op verdiepingen die niet bij het project betrokken zijn!!
      SELECT 100 - NVL (SUM (pwx.prj_perslidwerkplek_bezetting), 0)
        INTO doelbezetting
        FROM prj_perslidwerkplek pwx, prj_werkplek pw
       WHERE pwx.prs_perslid_key = pperslidkey
         --AND pw.prj_ruimte_key = pruimtekey
         AND pwx.prj_werkplek_key = pw.prj_werkplek_key
         AND prj_perslidwerkplek_verwijder IS NULL;
      IF pwerkplekkey IS NOT NULL
      THEN
         werkplekkey := pwerkplekkey;
      ELSE
         werkplekkey :=
                     find_or_create_free_werkplek (pruimtekey, doelbezetting);
      END IF;
      -- Is er nog een tijdens *dit* scenario vervallen werkplekbezettingsrecord?
      -- Zo ja, dan willen we deze gebruiken om de binding tussen Van en Naar
      -- zo goed mogelijk te behouden. Alleen relevant als het om een oorspronkelijk
      -- bezettingsrecord gaat (met verwijzing naar de werkelijkheid)
      BEGIN
         SELECT prj_perslidwerkplek_key
           INTO oudepwpkey
           FROM prj_perslidwerkplek pwx,
                prj_werkplek wx,
                prj_ruimte rx,
                prj_ruimte rx2
          WHERE rx.prj_ruimte_key = wx.prj_ruimte_key
            AND rx.prj_scenario_key = rx2.prj_scenario_key
            AND rx2.prj_ruimte_key = pruimtekey
            AND wx.prj_werkplek_key = pwx.prj_werkplek_key
            AND pwx.prs_perslid_key = pperslidkey
            AND pwx.prs_perslidwerkplek_key IS NOT NULL
            AND pwx.prj_perslidwerkplek_verwijder IS NOT NULL;
         UPDATE prj_perslidwerkplek
            SET prj_perslidwerkplek_verwijder = NULL,
                prj_perslidwerkplek_bezetting = doelbezetting,
                prj_werkplek_key = werkplekkey
          WHERE prj_perslidwerkplek_key = oudepwpkey;
      EXCEPTION
         WHEN NO_DATA_FOUND
         THEN
            --DBMS_OUTPUT.put_line ('_VAR(werkplekkey):'    ||    TO_CHAR (werkplekkey));
            -- Er is nu een werkplekkey bepaald.
            INSERT INTO prj_perslidwerkplek
                        (prj_werkplek_key, prs_perslid_key,
                         prj_perslidwerkplek_bezetting
                        )
                 VALUES (werkplekkey, pperslidkey,
                         doelbezetting
                        );
      END;
      COMMIT;
   END;
----------------------------------------------
-- SCENARIO COMMIT PROCEDURES
----------------------------------------------
   PROCEDURE prj_commit_additions (pscenariokey IN NUMBER)
   AS
      CURSOR new_ruimte (sk IN NUMBER)
      IS
         SELECT alg_verdieping_key, prj_ruimte_nr, prj_ruimte_omschrijving,
                prj_ruimte_bruto_vloeropp, alg_srtruimte_key,
                prj_ruimte_omtrek, prj_ruimte_inhoud, prj_ruimte_opmerking,
                prj_ruimte_key
           FROM prj_ruimte rx
          WHERE rx.prj_ruimte_verwijder IS NULL
            AND rx.alg_ruimte_key IS NULL
            AND rx.prj_scenario_key = sk;
      CURSOR new_werkplek (sk IN NUMBER)
      IS
         SELECT prj_werkplek_volgnr, prj_werkplek_omschrijving,
                prj_werkplek_vastopp, prj_werkplek_opp, rx.alg_ruimte_key,
                prj_werkplek_key, prj_werkplek_dwgx,prj_werkplek_dwgy,
				prj_werkplek_dwgrotatie,prj_werkplek_dwgschaal
           FROM prj_werkplek wx, prj_ruimte rx
          WHERE wx.prj_werkplek_verwijder IS NULL
            AND wx.prs_werkplek_key IS NULL
            AND rx.prj_ruimte_key = wx.prj_ruimte_key
            AND rx.prj_scenario_key = sk;
      CURSOR new_perslidwerkplek (sk IN NUMBER)
      IS
         SELECT prs_perslid_key, prs_werkplek_key,
                prj_perslidwerkplek_bezetting, pwx.prj_perslidwerkplek_key
           FROM prj_perslidwerkplek pwx, prj_werkplek wx, prj_ruimte rx
          WHERE pwx.prj_perslidwerkplek_verwijder IS NULL
            AND pwx.prs_perslidwerkplek_key IS NULL
            AND wx.prj_werkplek_key = pwx.prj_werkplek_key
            AND rx.prj_ruimte_key = wx.prj_ruimte_key
            AND rx.prj_scenario_key = sk;
      CURSOR new_ruimteafdeling (sk IN NUMBER)
      IS
         SELECT rax.prs_afdeling_key,
                rx.alg_ruimte_key,
                prj_ruimteafdeling_bezetting,
                rax.prj_ruimteafdeling_key
           FROM prj_ruimteafdeling rax,
                prj_ruimte rx
          WHERE rx.prj_ruimte_key = rax.prj_ruimte_key
            AND rax.prj_ruimteafdeling_verwijder IS NULL
            AND rax.prs_ruimteafdeling_key IS NULL
            AND rx.prj_scenario_key = sk;
      CURSOR new_deel (sk IN NUMBER)
      IS
         SELECT dx.prj_deel_key, alg_locatie_key, prj_deel_omschrijving,
		        ins_discipline_key, dx.ins_srtdeel_key,
			    'R' ins_alg_ruimte_type, alg_ruimte_key ins_alg_ruimte_key,
				prj_deel_dwgx, prj_deel_dwgy, prj_deel_dwgschaal, prj_deel_dwgrotatie
           FROM prj_deel dx, prj_ruimte rx, alg_verdieping v, alg_gebouw g,
		   		ins_srtdeel isd, ins_srtgroep isg
          WHERE dx.prj_deel_verwijder IS NULL
            AND dx.ins_deel_key IS NULL
            AND dx.prj_werkplek_key IS NULL
			AND dx.prj_ruimte_key = rx.prj_ruimte_key
			AND rx.alg_verdieping_key = v.alg_verdieping_key
			AND v.alg_gebouw_key = g.alg_gebouw_key
			AND dx.ins_srtdeel_key = isd.ins_srtdeel_key
			AND isd.ins_srtgroep_key = isg.ins_srtgroep_key
            AND rx.prj_scenario_key = sk
         UNION ALL
         SELECT dx.prj_deel_key, alg_locatie_key, prj_deel_omschrijving,
		        ins_discipline_key, dx.ins_srtdeel_key,
				'W' ins_alg_ruimte_type, prs_werkplek_key ins_alg_ruimte_key,
				prj_deel_dwgx, prj_deel_dwgy, prj_deel_dwgschaal, prj_deel_dwgrotatie
           FROM prj_deel dx, prj_werkplek wx, prj_ruimte rx, alg_verdieping v, alg_gebouw g,
		   		ins_srtdeel isd, ins_srtgroep isg
          WHERE dx.prj_deel_verwijder IS NULL
            AND dx.ins_deel_key IS NULL
            AND wx.prj_werkplek_key = dx.prj_werkplek_key
            AND dx.prj_werkplek_key IS NOT NULL
            AND rx.prj_ruimte_key = wx.prj_ruimte_key
			AND rx.alg_verdieping_key = v.alg_verdieping_key
			AND v.alg_gebouw_key = g.alg_gebouw_key
			AND dx.ins_srtdeel_key = isd.ins_srtdeel_key
			AND isd.ins_srtgroep_key = isg.ins_srtgroep_key
            AND rx.prj_scenario_key = sk;
      aantal_r_toegevoegd    NUMBER;
      aantal_w_toegevoegd    NUMBER;
      aantal_pw_toegevoegd   NUMBER;
      aantal_ra_toegevoegd   NUMBER;
      aantal_d_toegevoegd    NUMBER;
      ruimte_nr              alg_ruimte.alg_ruimte_nr%TYPE;
      werkplek_nr            prs_werkplek.prs_werkplek_volgnr%TYPE;
      deel_nr                ins_deel.ins_deel_omschrijving%TYPE;
   BEGIN
      -- Nieuwe ruimtes toevoegen
      aantal_r_toegevoegd := 0;
      --
      -- RUIMTES
      --
      FOR v_ruimte IN new_ruimte (pscenariokey)
      LOOP
         ruimte_nr :=
            forceuniqueness ('ALG_RUIMTE',
                             v_ruimte.alg_verdieping_key,
                             v_ruimte.prj_ruimte_nr,
							 NULL
                            );
         INSERT INTO alg_ruimte r
                     (alg_verdieping_key, alg_ruimte_nr,
                      alg_ruimte_omschrijving,
                      alg_ruimte_bruto_vloeropp,
                      alg_srtruimte_key, alg_ruimte_omtrek,
                      alg_ruimte_inhoud,
                      alg_ruimte_opmerking
                     )
              VALUES (v_ruimte.alg_verdieping_key, ruimte_nr,
                      v_ruimte.prj_ruimte_omschrijving,
                      v_ruimte.prj_ruimte_bruto_vloeropp,
                      v_ruimte.alg_srtruimte_key, v_ruimte.prj_ruimte_omtrek,
                      v_ruimte.prj_ruimte_inhoud,
                      v_ruimte.prj_ruimte_opmerking
                     );
         aantal_r_toegevoegd := aantal_r_toegevoegd + 1;
         -- Registreer de zojuist verworven key; deze is nodig voor de volgende stappen
         UPDATE prj_ruimte rx
            SET alg_ruimte_key =
                   (SELECT alg_ruimte_key
                      FROM alg_v_aanwezigruimte r
                     WHERE r.alg_verdieping_key = v_ruimte.alg_verdieping_key
                       AND r.alg_ruimte_nr = ruimte_nr)
          WHERE prj_ruimte_key = v_ruimte.prj_ruimte_key;
      END LOOP;
      --
      -- WERKPLEKKEN
      --
      aantal_w_toegevoegd := 0;
      FOR v_werkplek IN new_werkplek (pscenariokey)
      LOOP
         werkplek_nr :=
            forceuniqueness ('PRS_WERKPLEK',
                             v_werkplek.alg_ruimte_key,
                             TO_CHAR (v_werkplek.prj_werkplek_volgnr),
							 NULL
                            );
         -- Note: de omschrijving is meestal ruimtenr+volgnr. Bij nieuwe of verplaatsing is het wenselijk deze aan te passen?
         INSERT INTO prs_werkplek w
                     (prs_werkplek_volgnr, prs_werkplek_omschrijving,
                      prs_werkplek_vastopp,
                      prs_werkplek_opp, prs_alg_ruimte_key,
				      prs_werkplek_dwgx, prs_werkplek_dwgy,
  				      prs_werkplek_dwgrotatie, prs_werkplek_dwgschaal
                     )
              VALUES (werkplek_nr, v_werkplek.prj_werkplek_omschrijving,
                      v_werkplek.prj_werkplek_vastopp,
                      v_werkplek.prj_werkplek_opp, v_werkplek.alg_ruimte_key,
				      v_werkplek.prj_werkplek_dwgx, v_werkplek.prj_werkplek_dwgy,
				      v_werkplek.prj_werkplek_dwgrotatie, v_werkplek.prj_werkplek_dwgschaal
                     );
         aantal_w_toegevoegd := aantal_w_toegevoegd + 1;
         -- Registreer de zojuist verworven keys; deze zijn nodig voor de volgende stappen
         UPDATE prj_werkplek wx
            SET prs_werkplek_key =
                   (SELECT prs_werkplek_key
                      FROM prs_werkplek w
                     WHERE w.prs_werkplek_volgnr = werkplek_nr
                       AND w.prs_alg_ruimte_key = v_werkplek.alg_ruimte_key)
          WHERE prj_werkplek_key = v_werkplek.prj_werkplek_key;
      END LOOP;
      --
      -- WERKPLEKBEZETTINGEN (anoniem)
      --
      aantal_pw_toegevoegd := 0;
      FOR v_perslidwerkplek IN new_perslidwerkplek (pscenariokey)
      LOOP
         INSERT INTO prs_perslidwerkplek pw
                     (prs_perslid_key,
                      prs_werkplek_key,
                      prs_perslidwerkplek_bezetting
                     )
              VALUES (v_perslidwerkplek.prs_perslid_key,
                      v_perslidwerkplek.prs_werkplek_key,
                      v_perslidwerkplek.prj_perslidwerkplek_bezetting
                     );
         -- Bijwerken van de nieuwe keys is niet nodig..
         aantal_pw_toegevoegd := aantal_pw_toegevoegd + 1;
      END LOOP;
      --
      -- RUIMTEAFDELINGBEZETTINGEN (anoniem)
      --
      aantal_ra_toegevoegd := 0;
      FOR v_ruimteafdeling IN new_ruimteafdeling (pscenariokey)
      LOOP
         INSERT INTO prs_ruimteafdeling pw
                     (prs_afdeling_key,
                      alg_ruimte_key,
                      prs_ruimteafdeling_bezetting
                     )
              VALUES (v_ruimteafdeling.prs_afdeling_key,
                      v_ruimteafdeling.alg_ruimte_key,
                      v_ruimteafdeling.prj_ruimteafdeling_bezetting
                     );
         -- Bijwerken van de nieuwe keys is niet nodig..
         aantal_ra_toegevoegd := aantal_ra_toegevoegd + 1;
      END LOOP;
      --
      -- OBJECTEN
      --
      aantal_d_toegevoegd := 0;
      FOR v_deel IN new_deel (pscenariokey)
      LOOP
         deel_nr :=   forceuniqueness ('INS_DEEL', v_deel.alg_locatie_key, v_deel.prj_deel_omschrijving, v_deel.ins_srtdeel_key);

         INSERT INTO ins_deel
                     (ins_srtdeel_key, ins_alg_ruimte_key, ins_alg_ruimte_type,
                      ins_alg_locatie_key, ins_discipline_key, ins_deel_omschrijving,
					  ins_deel_dwgx, ins_deel_dwgy, ins_deel_dwgschaal, ins_deel_dwgrotatie
                     )
              VALUES (v_deel.ins_srtdeel_key, v_deel.ins_alg_ruimte_key, v_deel.ins_alg_ruimte_type,
                      v_deel.alg_locatie_key, v_deel.ins_discipline_key, deel_nr,
					  v_deel.prj_deel_dwgx, v_deel.prj_deel_dwgy, v_deel.prj_deel_dwgschaal, v_deel.prj_deel_dwgrotatie
                     );
               -- Bijwerken van de nieuwe keys is niet nodig..
         aantal_d_toegevoegd :=   aantal_d_toegevoegd + 1;
      end loop;
   END prj_commit_additions;
   PROCEDURE prj_commit_changes (pscenariokey IN NUMBER)
   AS
      CURSOR ruimte_updates (sk IN NUMBER)
      IS
         SELECT prj_ruimte_nr, prj_ruimte_omschrijving,
                prj_ruimte_bruto_vloeropp, alg_srtruimte_key,
                prj_ruimte_omtrek, prj_ruimte_inhoud, prj_ruimte_opmerking,
                alg_ruimte_key
           FROM prj_ruimte rx
          WHERE rx.prj_ruimte_verwijder IS NULL
            AND rx.alg_ruimte_key IS NOT NULL
            AND rx.prj_scenario_key = sk;
      CURSOR werkplek_updates (sk IN NUMBER)
      IS
         SELECT prj_werkplek_volgnr, prj_werkplek_omschrijving,
                prj_werkplek_vastopp, prj_werkplek_opp, prs_werkplek_key,
                alg_ruimte_key,prj_werkplek_dwgx, prj_werkplek_dwgy,
		        prj_werkplek_dwgrotatie, prj_werkplek_dwgschaal
           FROM prj_werkplek wp, prj_ruimte rx
          WHERE wp.prj_ruimte_key = rx.prj_ruimte_key
            AND wp.prj_werkplek_verwijder IS NULL
            AND wp.prs_werkplek_key IS NOT NULL
            AND rx.prj_scenario_key = sk;
	  -- Ruimte gebonden prj_deel
      CURSOR RMdeel_updates (sk IN NUMBER)
      IS
         SELECT ins_deel_key,
                alg_ruimte_key,prj_deel_dwgx, prj_deel_dwgy,
		        prj_deel_dwgrotatie, prj_deel_dwgschaal,
				prj_deel_verwijder
           FROM prj_deel wp, prj_ruimte rx
          WHERE wp.prj_ruimte_key = rx.prj_ruimte_key
		    AND wp.prj_werkplek_key is null
            --AND wp.prj_deel_verwijder IS NULL
            AND wp.ins_deel_key IS NOT NULL
            AND rx.prj_scenario_key = sk;
	  -- Werkplek gebonden prj_deel
      CURSOR WPdeel_updates (sk IN NUMBER)
      IS
         SELECT ins_deel_key,
                prs_werkplek_key,prj_deel_dwgx, prj_deel_dwgy,
		        prj_deel_dwgrotatie, prj_deel_dwgschaal,
				prj_deel_verwijder
           FROM prj_deel pd, prj_werkplek pw, prj_ruimte pr
          WHERE pd.prj_werkplek_key = pw.prj_werkplek_key
		    AND pw.prj_ruimte_key = pr.prj_ruimte_key
            --AND pd.prj_deel_verwijder IS NOT NULL
            AND pd.ins_deel_key IS NOT NULL
            AND pr.prj_scenario_key = sk;
      CURSOR perslidwerkplek_updates (sk IN NUMBER)
      IS
         SELECT prs_perslid_key, prj_perslidwerkplek_bezetting,
                prs_perslidwerkplek_key, prs_werkplek_key
           FROM prj_perslidwerkplek pwp, prj_werkplek wp, prj_ruimte rx
          WHERE pwp.prj_werkplek_key = wp.prj_werkplek_key
            AND wp.prj_ruimte_key = rx.prj_ruimte_key
            AND wp.prj_werkplek_verwijder IS NULL
            AND wp.prs_werkplek_key IS NOT NULL
            AND rx.prj_scenario_key = sk;
      CURSOR ruimteafdeling_updates (sk IN NUMBER)
      IS
         SELECT rax.prs_afdeling_key,
                rx.alg_ruimte_key,
                prj_ruimteafdeling_bezetting,
                rax.prs_ruimteafdeling_key
           FROM prj_ruimteafdeling rax,
                prj_ruimte rx
          WHERE rx.prj_ruimte_key = rax.prj_ruimte_key
            AND rax.prj_ruimteafdeling_verwijder IS NULL
            AND rax.prj_ruimteafdeling_key IS NOT NULL
            AND rx.prj_scenario_key = sk;

      werkplek_nr PRJ_WERKPLEK.prj_werkplek_volgnr%TYPE;
   BEGIN
      BEGIN
         -- Bestaande ruimtes aanpassen
         FOR cr IN ruimte_updates (pscenariokey)
         LOOP
            UPDATE alg_ruimte r
               SET alg_ruimte_nr = cr.prj_ruimte_nr,
                   alg_ruimte_omschrijving = cr.prj_ruimte_omschrijving,
                   alg_ruimte_bruto_vloeropp = cr.prj_ruimte_bruto_vloeropp,
                   alg_srtruimte_key = cr.alg_srtruimte_key,
                   alg_ruimte_omtrek = cr.prj_ruimte_omtrek,
                   alg_ruimte_inhoud = cr.prj_ruimte_inhoud,
                   alg_ruimte_opmerking = cr.prj_ruimte_opmerking
             WHERE r.alg_ruimte_verwijder IS NULL
               AND r.alg_ruimte_key = cr.alg_ruimte_key;
         END LOOP;
         -- Bestaande ruimte delen aanpassen
         FOR cr IN RMdeel_updates (pscenariokey)
         LOOP
            UPDATE ins_deel r
               SET ins_alg_ruimte_key = cr.alg_ruimte_key,
                   ins_deel_dwgx = cr.prj_deel_dwgx,
				   ins_deel_dwgy = cr.prj_deel_dwgy,
				   ins_deel_dwgrotatie = cr.prj_deel_dwgrotatie,
				   ins_deel_dwgschaal = cr.prj_deel_dwgschaal,
				   ins_deel_verwijder = cr.prj_deel_verwijder
             WHERE r.ins_deel_verwijder IS NULL
               AND r.ins_deel_key = cr.ins_deel_key;
         END LOOP;
         -- Bestaande werkplek delen aanpassen
         FOR cr IN WPdeel_updates (pscenariokey)
         LOOP
            UPDATE ins_deel r
               SET ins_alg_ruimte_key = cr.prs_werkplek_key,
                   ins_deel_dwgx = cr.prj_deel_dwgx,
				   ins_deel_dwgy = cr.prj_deel_dwgy,
				   ins_deel_dwgrotatie = cr.prj_deel_dwgrotatie,
				   ins_deel_dwgschaal = cr.prj_deel_dwgschaal,
				   ins_deel_verwijder = cr.prj_deel_verwijder
             WHERE r.ins_deel_verwijder IS NULL
               AND r.ins_deel_key = cr.ins_deel_key;
         END LOOP;
         -- Bestaande werkplekken aanpassen
         FOR cr IN werkplek_updates (pscenariokey)
         LOOP
            werkplek_nr :=
                forceuniqueness ('PRS_WERKPLEK',
                                 cr.alg_ruimte_key,
                                 TO_CHAR (cr.prj_werkplek_volgnr),
    							 NULL
                                );
            UPDATE prs_werkplek r
               SET prs_alg_ruimte_key = cr.alg_ruimte_key,
                   prs_werkplek_volgnr = werkplek_nr,
                   prs_werkplek_omschrijving = cr.prj_werkplek_omschrijving,
                   prs_werkplek_vastopp = cr.prj_werkplek_vastopp,
                   prs_werkplek_opp = cr.prj_werkplek_opp,
				   prs_werkplek_dwgx = cr.prj_werkplek_dwgx,
				   prs_werkplek_dwgy = cr.prj_werkplek_dwgy,
				   prs_werkplek_dwgrotatie = cr.prj_werkplek_dwgrotatie,
				   prs_werkplek_dwgschaal = cr.prj_werkplek_dwgschaal
             WHERE r.prs_werkplek_key = cr.prs_werkplek_key;
         END LOOP;
         -- Bestaande perslidwerkplekken aanpassen
         FOR cr IN perslidwerkplek_updates (pscenariokey)
         LOOP
            UPDATE prs_perslidwerkplek r
               SET prs_werkplek_key = cr.prs_werkplek_key,
                   prs_perslid_key = cr.prs_perslid_key,
                   prs_perslidwerkplek_bezetting =
                                              cr.prj_perslidwerkplek_bezetting
             WHERE r.prs_perslidwerkplek_key = cr.prs_perslidwerkplek_key;
         END LOOP;
         -- Bestaande ruimteafdelingen aanpassen
         FOR cr IN ruimteafdeling_updates (pscenariokey)
         LOOP
            UPDATE prs_ruimteafdeling r
               SET prs_afdeling_key = cr.prs_afdeling_key,
                   alg_ruimte_key = cr.alg_ruimte_key,
                   prs_ruimteafdeling_bezetting = cr.prj_ruimteafdeling_bezetting
             WHERE r.prs_ruimteafdeling_verwijder IS NULL
               AND r.prs_ruimteafdeling_key = cr.prs_ruimteafdeling_key;
         END LOOP;
      END;
   END prj_commit_changes;
   PROCEDURE prj_commit_deletions (pscenariokey IN NUMBER)
   AS
   BEGIN
      -- PF: NIEMAND HEEFT HET ER OVER, MAAR ALS IK DIT ZO LEES DAN
      -- GAAT DIR VERSCHRIKKELIJK ANDERS DAN DAT ER BEOOGD WORDT.
      -- VOLGENS MIJ WORDT HIER ALLES-OF-NIKS WEGGEGOOID!!

      -- De Deletes hieronder lijkt me meer de richting

      -- Vervallen ruimtes laten vervallen
      UPDATE alg_ruimte r
         SET alg_ruimte_verwijder =
                (SELECT SYSDATE
                   FROM prj_ruimte rx
                  WHERE rx.alg_ruimte_key = r.alg_ruimte_key
                    AND rx.prj_ruimte_verwijder IS NOT NULL
                    AND rx.alg_ruimte_key IS NOT NULL
                    AND rx.prj_scenario_key = pscenariokey)
       WHERE r.alg_ruimte_verwijder IS NULL;
      -- Vervallen werkplekken laten vervallen
      DELETE FROM prs_werkplek p
       WHERE p.prs_werkplek_key IN
        (SELECT pw.prs_werkplek_key
           FROM prj_werkplek pw, prj_ruimte rx
          WHERE pw.prj_ruimte_key = rx.prj_ruimte_key
            AND pw.prj_werkplek_verwijder IS NOT NULL
            AND pw.prs_werkplek_key IS NOT NULL
            AND rx.prj_scenario_key = pscenariokey);
      -- Vervallen perslidwerkplekken verwijderen
      DELETE FROM prs_perslidwerkplek p
       WHERE p.prs_perslidwerkplek_key IN
                (SELECT ppw.prs_perslidwerkplek_key
                   FROM prj_perslidwerkplek ppw,
                        prj_werkplek pw,
                        prj_ruimte rx
                  WHERE ppw.prj_werkplek_key = pw.prj_werkplek_key
                    AND pw.prj_ruimte_key = rx.prj_ruimte_key
                    AND ppw.prj_perslidwerkplek_verwijder IS NOT NULL
                    AND ppw.prs_perslidwerkplek_key IS NOT NULL
                    AND rx.prj_scenario_key = pscenariokey);
      -- Vervallen ruimteafdelingen laten vervallen
      UPDATE prs_ruimteafdeling p
         SET prs_ruimteafdeling_verwijder =
                (SELECT SYSDATE
                   FROM prj_ruimteafdeling pra,
                        prj_ruimte rx
                  WHERE pra.prj_ruimte_key = rx.prj_ruimte_key
                    AND pra.prs_ruimteafdeling_key = p.prs_ruimteafdeling_key
                    AND pra.prj_ruimteafdeling_verwijder IS NOT NULL
                    AND pra.prs_ruimteafdeling_key IS NOT NULL
                    AND rx.prj_scenario_key = pscenariokey)
       WHERE p.prs_ruimteafdeling_verwijder IS NULL;
   END prj_commit_deletions;
   PROCEDURE prj_commit_cleanup (pscenariokey IN NUMBER)
   AS
      requestkey   prj_scenario.mld_melding_key%TYPE;
   BEGIN
      -- Voor welke aanvraag was dit scenario een oplossing?
      SELECT mld_melding_key
        INTO requestkey
        FROM prj_scenario
       WHERE prj_scenario_key = pscenariokey;
      IF requestkey IS NOT NULL
      THEN
         DELETE FROM prj_scenario
               WHERE mld_melding_key = requestkey;
      ELSE
         DELETE FROM prj_scenario
               WHERE prj_scenario_key = pscenariokey;
      END IF;
   END prj_commit_cleanup;
   PROCEDURE prj_commit_scenario (pscenariokey IN NUMBER)
   AS
      dummy   VARCHAR2 (1);
   BEGIN
      checkscenario (pscenariokey);
      prj_commit_deletions (pscenariokey);
      prj_commit_changes (pscenariokey);
      prj_commit_additions (pscenariokey); -- Als laatste om tijdelijke dubbelen te voorkomen
      prj_commit_cleanup (pscenariokey);
   END prj_commit_scenario;
END prj;
/

REGISTERRUN('$Id$')

#endif // PRJ
