-- CWTD#18701: impliciete werkplekken
SET ECHO ON;
SPOOL xCWTD#18701_#18704.lst

SET SERVEROUTPUT ON;

-- Impliciete werkplekken, dus elke werkplek móét aan één persoon gekoppeld zijn.
-- D.w.z: precies één persoon per werkplek en dus geen lege werkplekken.  
DECLARE
   v_count             NUMBER (10);
   v_werkplek_volgnr   NUMBER (10);
   v_werkplek_oms      VARCHAR2 (20);
   v_werkplek_key      NUMBER (10);
   v_nwe_wp            VARCHAR2 (10);
   v_ruimte_oms        VARCHAR2 (50);
   v_errormsg          VARCHAR2 (200);

   -- Werkplekken met meer dan één persoon
   CURSOR c_wp
   IS
        SELECT w.prs_werkplek_key,
               w.prs_alg_ruimte_key alg_ruimte_key,
               COUNT (prs_perslidwerkplek_key)
          FROM prs_v_aanwezigwerkplek w, prs_v_aanwezigperslidwerkplek pwp
         WHERE w.prs_werkplek_key = pwp.prs_werkplek_key
      GROUP BY w.prs_werkplek_key, w.prs_alg_ruimte_key
        HAVING COUNT (prs_perslidwerkplek_key) > 1
      ORDER BY 2, 1;

   -- Alle perslidwerkplekken bij zo'n werkplek, BEHALVE DE EERSTE.
   -- (De 'eerste' persoon mag blijven zitten, de rest moet verkassen) 
   CURSOR c_pwp (in_wp_key NUMBER)
   IS
      SELECT prs_perslidwerkplek_key prs_pwp_key,
                  '[' || prs_perslid_nr || '/' || prs_perslid_naam || ']' prs_perslid_oms
        FROM prs_v_aanwezigperslidwerkplek pwp, prs_perslid pl
       WHERE prs_werkplek_key = in_wp_key
         AND pwp.prs_perslid_key = pl.prs_perslid_key
         AND pwp.prs_perslid_key != 
                (SELECT MIN(prs_perslid_key)
                   FROM prs_v_aanwezigperslidwerkplek
                  WHERE prs_werkplek_key = in_wp_key);

   -- Alle werkplekken met bezetting != 100%
   CURSOR c_bez
   IS
      SELECT prs_perslidwerkplek_key
        FROM prs_perslidwerkplek
       WHERE prs_perslidwerkplek_bezetting != 100;

   -- Alle lege werkplekken
   CURSOR c_no_pwp
   IS
      SELECT prs_werkplek_key FROM prs_werkplek
      MINUS
      SELECT prs_werkplek_key FROM prs_perslidwerkplek
      MINUS
      SELECT prs_werkplek_key FROM prj_werkplek;

BEGIN
   v_errormsg := 'Verplaatsen';
   -- Vind werkplekken met >1 persoon
   FOR rec_wp IN c_wp
   LOOP
      -- Haal iedereen-behalve-één van die werkplek af
      FOR rec_pwp IN c_pwp (rec_wp.prs_werkplek_key)
      LOOP
         v_errormsg := 'Verplaatsen ' || rec_pwp.prs_perslid_oms;
         -- Is er in de ruimte nog een vrije werkplek?
         SELECT COUNT ( * )
           INTO v_count
           FROM prs_v_aanwezigwerkplek w
          WHERE w.prs_alg_ruimte_key = rec_wp.alg_ruimte_key
                AND NOT EXISTS
                      (SELECT 1
                         FROM prs_v_aanwezigperslidwerkplek pw
                        WHERE pw.prs_werkplek_key = w.prs_werkplek_key);

         -- Ja --> zet de persoon daarop
         IF (v_count > 0)
         THEN
            SELECT MIN (w.prs_werkplek_key)
              INTO v_werkplek_key
              FROM prs_v_aanwezigwerkplek w
             WHERE w.prs_alg_ruimte_key = rec_wp.alg_ruimte_key
                   AND NOT EXISTS
                         (SELECT 1
                            FROM prs_v_aanwezigperslidwerkplek pw
                           WHERE pw.prs_werkplek_key = w.prs_werkplek_key);

            SELECT prs_werkplek_omschrijving
              INTO v_werkplek_oms
              FROM prs_werkplek
             WHERE prs_werkplek_key = v_werkplek_key;

            v_nwe_wp := 'bestaande';
         -- Nee --> maak 'n nieuwe werkplek en zet 'm daarop
         ELSE
             SELECT COALESCE (MAX (w.prs_werkplek_volgnr), 0) + 1
              INTO v_werkplek_volgnr
              FROM prs_werkplek w
             WHERE w.prs_alg_ruimte_key = rec_wp.alg_ruimte_key;

            --v_werkplek_oms := '/' || TO_CHAR (v_werkplek_volgnr);
            v_werkplek_oms := '';

            INSERT INTO prs_werkplek (prs_werkplek_module,
                                      prs_werkplek_volgnr,
                                      prs_werkplek_omschrijving,
                                      prs_alg_ruimte_key)
                VALUES ('PRR',
                        v_werkplek_volgnr,
                        v_werkplek_oms,
                        rec_wp.alg_ruimte_key)
             RETURNING prs_werkplek_key
                  INTO v_werkplek_key;

            v_nwe_wp := 'nieuwe';
         END IF;

         -- Verplaats persoon naar vrije/nieuwe werkplek
         UPDATE prs_perslidwerkplek
            SET prs_werkplek_key = v_werkplek_key,
                prs_perslidwerkplek_bezetting = 100
          WHERE prs_perslidwerkplek_key = rec_pwp.prs_pwp_key;

        -- Rapporteer wie waarheen is verhuisd.
        SELECT alg_plaatsaanduiding
          INTO v_ruimte_oms
          FROM alg_v_plaatsaanduiding
         WHERE alg_onroerendgoed_keys = rec_wp.alg_ruimte_key
           AND alg_onroerendgoed_type = 'R';

         DBMS_OUTPUT.PUT_LINE(   'Persoon '||rec_pwp.prs_perslid_oms
                              ||' verplaatst naar '
                              || v_nwe_wp
                              || ' werkplek "'
                              || v_ruimte_oms || v_werkplek_oms
                              || '".');
      END LOOP;
   END LOOP;

   -- Bezetting werkplekken
   v_errormsg := 'Bezetting werkplek';
   UPDATE prs_perslidwerkplek
      SET prs_perslidwerkplek_bezetting = 100;
   
   -- Verwijderen lege werkplekken
   FOR rec_no_pwp IN c_no_pwp
   LOOP
      v_errormsg := 'Verwijderen werkplek #' || rec_no_pwp.prs_werkplek_key;
      DELETE FROM prs_werkplek
          WHERE prs_werkplek_key = rec_no_pwp.prs_werkplek_key;
   END LOOP;
EXCEPTION
   WHEN OTHERS
   THEN
      DBMS_OUTPUT.PUT_LINE (SQLCODE || '|' || SQLERRM || ' - ' || v_errormsg);
END;
/

SET SERVEROUTPUT OFF;

-- Verwijder menu-item 'Werkplekken' (menuitem-key 88)
DELETE FROM fac_menu WHERE fac_menuitems_key = 88;


-- CWTD#18704: vernieuwde personenimport
DROP TABLE CWTD_IMP_PERSOON;
CREATE TABLE CWTD_IMP_PERSOON
(
  prs_perslid_nr                VARCHAR2(16),   -- personeelsnummer
  prs_perslid_naam              VARCHAR2(30),   -- geboortenaam 
  prs_perslid_geslacht          VARCHAR2(1),    -- geslacht
  prs_perslid_partn_tussen      VARCHAR2(15),   -- voorvoegsel echtg./partner
  prs_perslid_partn_naam        VARCHAR2(30),   -- naam echtg./partner
  prs_perslid_voornaam          VARCHAR2(30),   -- roepnaam
  prs_perslid_tussenvoegsel     VARCHAR2(15),   -- voorvoegsel
  prs_perslid_voorletters       VARCHAR2(10),   -- voorletters
  prs_perslid_fullname          VARCHAR2(60),   -- volledige naam
  prs_perslid_telefoonnr        VARCHAR2(15),   -- telefoonnummer
  prs_perslid_mobiel            VARCHAR2(15),   -- mobielnummer
  prs_perslid_oslogin           VARCHAR2(30),   -- loginnaam
  prs_perslid_email             VARCHAR2(200),  -- email
  prs_srtperslid_omschrijving   VARCHAR2(30),   -- functie
  prs_afdeling_naam             VARCHAR2(10),   -- afdeling
  prs_afdeling_omschr           VARCHAR2(60),   -- afdeling omschrijving
  prs_perslid_ingangsdatum      DATE,           -- datum_indient
  prs_perslid_einddatum         DATE,           -- datum_uitdienst
  prs_locatie_omschrijving      VARCHAR(30),    -- locatienaam
  cwtd_imp_persoon_aanmaak      DATE
);


COMMIT;

BEGIN adm.systrackscript('$Workfile: CWTD#18701_#18704.sql $', '$Revision$', 1); END;
/

@cwtd.sql

SPOOL OFF;