-- Customer specific once-script CONN#22385.
--
-- (c) 2012 SG|facilitor bv 
-- $Revision: 1 $ 
-- $Modtime: 2-02-12 12:09 $
--
-- Support: +31 53 4800700
SET ECHO ON
SPOOL xconn#22385.lst
SET DEFINE OFF

CREATE OR REPLACE PACKAGE BODY perman
AS
   PROCEDURE verwerk (
      p_ind_toekomstmutatie     IN   VARCHAR2,
      p_dvb_personeelsnummer    IN   VARCHAR2,
      p_per_naam                IN   VARCHAR2,
      p_per_partnernaam         IN   VARCHAR2,
      p_per_indnaamsvoegen      IN   VARCHAR2,
      p_per_tussenvoegsels      IN   VARCHAR2,
      p_per_partussenvoegs      IN   VARCHAR2,
      p_per_voorletters         IN   VARCHAR2,
      p_per_roepnaam            IN   VARCHAR2,
      p_per_username            IN   VARCHAR2,
      p_per_titel               IN   VARCHAR2,
      p_per_achtervoegsel       IN   VARCHAR2,
      p_dvb_datum_in_dienst     IN   DATE,
      p_dvb_datum_uit_dienst    IN   DATE,
      p_fnc_omschrijving        IN   VARCHAR2,
      p_dvb_k_emailzake         IN   VARCHAR2,
      p_dvb_divisie             IN   VARCHAR2,
      p_dvb_divisie_label       IN   VARCHAR2,
      p_dvb_k_regio             IN   VARCHAR2,
      p_dvb_k_regio_label       IN   VARCHAR2,
      p_dvb_k_regiozoeknaam     IN   VARCHAR2,
      p_afd_code                IN   VARCHAR2,
      p_afd_omschrijving        IN   VARCHAR2,
      p_dvb_k_standplts_label   IN   VARCHAR2
   )
   IS
      v_prs_srtperslid_key            prs_srtperslid.prs_srtperslid_key%TYPE;
      v_prs_afdeling_key              prs_afdeling.prs_afdeling_key%TYPE;
      v_prs_afdeling_key_old          prs_afdeling.prs_afdeling_key%TYPE;
      v_prs_perslid_key               prs_perslid.prs_perslid_key%TYPE;
      v_fac_groep_key                 fac_groep.fac_groep_key%TYPE;
      v_prs_perslid_naam              prs_perslid.prs_perslid_naam%TYPE;
      v_prs_perslid_tussenvoegsels    prs_perslid.prs_perslid_tussenvoegsel%TYPE;
      v_prs_perslid_titel             prs_perslid.prs_perslid_titel%TYPE           := NULL;
      v_prs_perslid_einddatum         prs_perslid.prs_perslid_einddatum%TYPE;
      v_standplaats_kenmerk_key       prs_kenmerk.prs_kenmerk_key%TYPE;
      v_standplaats_kenmerklink_key   prs_kenmerklink.prs_kenmerklink_key%TYPE;
      v_count                         NUMBER (10);
   BEGIN
      v_prs_srtperslid_key := prs_srtperslid_key (p_fnc_omschrijving);
      v_prs_afdeling_key :=
         prs_afdeling_key (p_dvb_divisie,
                           p_dvb_divisie_label,
                           p_dvb_k_regiozoeknaam,
                           p_dvb_k_regio_label,
                           p_afd_code,
                           p_afd_omschrijving
                          );
      v_prs_perslid_key := prs_perslid_key (p_dvb_personeelsnummer);
      v_prs_afdeling_key_old := prs_afdeling_key_old (p_dvb_personeelsnummer);
      v_prs_perslid_naam := SUBSTR (p_per_naam, 1, 30);
      v_prs_perslid_tussenvoegsels := p_per_tussenvoegsels;

      IF    p_per_indnaamsvoegen = 'J'
         OR p_per_indnaamsvoegen = 'W'
         OR p_per_indnaamsvoegen = 'E'
         OR p_per_indnaamsvoegen = 'P'
      THEN
         v_prs_perslid_tussenvoegsels := p_per_partussenvoegs;

         IF p_per_tussenvoegsels IS NOT NULL
         THEN
            v_prs_perslid_naam := SUBSTR (p_per_partnernaam || '-' || p_per_tussenvoegsels || ' ' || p_per_naam, 1, 30);
         ELSE
            v_prs_perslid_naam := SUBSTR (p_per_partnernaam || '-' || p_per_naam, 1, 30);
         END IF;
      ELSIF p_per_indnaamsvoegen = 'A'
      THEN
         v_prs_perslid_tussenvoegsels := p_per_partussenvoegs;
         v_prs_perslid_naam := SUBSTR (p_per_partnernaam, 1, 30);
      ELSIF p_per_indnaamsvoegen = 'G'
      THEN
         IF p_per_partussenvoegs IS NOT NULL
         THEN
            v_prs_perslid_naam :=
                          SUBSTR (v_prs_perslid_naam || '-' || p_per_partussenvoegs || ' ' || p_per_partnernaam, 1, 30);
         ELSE
            v_prs_perslid_naam := SUBSTR (v_prs_perslid_naam || '-' || p_per_partnernaam, 1, 30);
         END IF;
      END IF;

      IF p_ind_toekomstmutatie = 'N'
      THEN   -- Toekomstmutaties niet meenemen
         IF p_per_titel IS NOT NULL OR p_per_achtervoegsel IS NOT NULL
         THEN
            v_prs_perslid_titel := SUBSTR (p_per_titel || '()' || p_per_achtervoegsel, 1, 15);
         END IF;

         -- controleren op onbepaald (dwz dvb_datum_uit_dienst=31 dec 2999)
         v_prs_perslid_einddatum := p_dvb_datum_uit_dienst;

         IF p_dvb_datum_uit_dienst IS NULL
         THEN
            v_prs_perslid_einddatum := TO_DATE ('31-12-2999', 'DD-MM-YYYY');
         END IF;

         IF v_prs_perslid_key = 0
         THEN   --nieuwe medewerker
            INSERT INTO prs_perslid
                        (prs_perslid_nr, prs_perslid_module, prs_perslid_naam,
                         prs_perslid_tussenvoegsel, prs_perslid_voorletters,
                         prs_perslid_voornaam
                                             --   ,   prs_perslid_oslogin
            ,            prs_perslid_titel, prs_perslid_ingangsdatum,
                         prs_perslid_einddatum, prs_afdeling_key, prs_srtperslid_key
                        )
                 VALUES (p_dvb_personeelsnummer, 'PRS', v_prs_perslid_naam,
                         SUBSTR (v_prs_perslid_tussenvoegsels, 1, 15), SUBSTR (p_per_voorletters, 1, 10),
                         SUBSTR (p_per_roepnaam, 1, 30)
                                                       --   ,   substr(p_per_username,1,30)
            ,            v_prs_perslid_titel, p_dvb_datum_in_dienst,
                         v_prs_perslid_einddatum, v_prs_afdeling_key, v_prs_srtperslid_key
                        );

            SELECT prs_perslid_key
              INTO v_prs_perslid_key
              FROM prs_perslid
             WHERE prs_perslid_nr = p_dvb_personeelsnummer;

            -- Default autorisatie toekennen aan deze nieuwe persoon
            BEGIN
               SELECT fac_groep_key
                 INTO v_fac_groep_key
                 FROM fac_groep
                WHERE fac_groep_upper = 'ALGEMEEN2808' AND fac_groep_verwijder IS NULL;
            EXCEPTION
               WHEN NO_DATA_FOUND
               THEN
                  INSERT INTO fac_groep
                              (fac_groep_omschrijving
                              )
                       VALUES ('Algemeen2808'
                              );

                  SELECT fac_groep_key
                    INTO v_fac_groep_key
                    FROM fac_groep
                   WHERE fac_groep_upper = 'ALGEMEEN2808' AND fac_groep_verwijder IS NULL;
            END;

            INSERT INTO fac_gebruikersgroep
                        (fac_groep_key, prs_perslid_key
                        )
                 VALUES (v_fac_groep_key, v_prs_perslid_key
                        );
         ELSE
            UPDATE prs_perslid
               SET prs_perslid_naam = v_prs_perslid_naam,
                   prs_perslid_tussenvoegsel = SUBSTR (v_prs_perslid_tussenvoegsels, 1, 15),
                   prs_perslid_voorletters = SUBSTR (p_per_voorletters, 1, 10),
                   prs_perslid_voornaam = SUBSTR (p_per_roepnaam, 1, 30)
                                                                        --   ,   prs_perslid_oslogin=substr(p_per_username,1,30)
            ,
                   prs_perslid_titel = v_prs_perslid_titel,
                   prs_perslid_ingangsdatum = p_dvb_datum_in_dienst,
                   prs_perslid_einddatum = v_prs_perslid_einddatum,
                   prs_afdeling_key = v_prs_afdeling_key,
                   prs_srtperslid_key = v_prs_srtperslid_key
             WHERE prs_perslid_key = v_prs_perslid_key;
         END IF;

         --standplaats-kenmerk!!!
         SELECT prs_kenmerk.prs_kenmerk_key
           INTO v_standplaats_kenmerk_key
           FROM prs_kenmerk
          WHERE prs_kenmerk_upper = 'STANDPLAATS';

         BEGIN
            SELECT prs_kenmerklink_key
              INTO v_standplaats_kenmerklink_key
              FROM prs_kenmerklink
             WHERE prs_link_key = v_prs_perslid_key AND prs_kenmerk_key = v_standplaats_kenmerk_key;

            IF p_dvb_k_standplts_label IS NULL
            THEN
               DELETE FROM prs_kenmerklink
                     WHERE prs_kenmerklink_key = v_standplaats_kenmerklink_key;
            ELSE
               UPDATE prs_kenmerklink
                  SET prs_kenmerklink_waarde = p_dvb_k_standplts_label
                WHERE prs_kenmerklink_key = v_standplaats_kenmerklink_key;
            END IF;
         EXCEPTION
            WHEN NO_DATA_FOUND
            THEN   -- nieuwe toevoegen indien niet leeg
               IF p_dvb_k_standplts_label IS NOT NULL
               THEN
                  INSERT INTO prs_kenmerklink
                              (prs_link_key, prs_kenmerklink_niveau, prs_kenmerk_key, prs_kenmerklink_waarde
                              )
                       VALUES (v_prs_perslid_key, 'P', v_standplaats_kenmerk_key, p_dvb_k_standplts_label
                              );
               END IF;
         END;
      END IF;

      v_count := prs_perslid_verwijder;   -- CONN#410
   END;

   FUNCTION prs_perslid_key (p_dvb_personeelsnummer IN VARCHAR2)
      RETURN NUMBER
   IS
      v_prs_perslid_key   prs_perslid.prs_perslid_key%TYPE;
   -- CONN#613 only search for active persons
   BEGIN
      SELECT prs_perslid_key
        INTO v_prs_perslid_key
        FROM prs_v_aanwezigperslid
       WHERE prs_perslid_nr = p_dvb_personeelsnummer;

      RETURN v_prs_perslid_key;
   EXCEPTION
      WHEN NO_DATA_FOUND
      THEN
         RETURN 0;
   END;

   FUNCTION prs_srtperslid_key (p_fnc_omschrijving IN VARCHAR2)
      RETURN NUMBER
   IS
      v_prs_srtperslid_key   prs_perslid.prs_srtperslid_key%TYPE;
   BEGIN
      SELECT prs_srtperslid_key
        INTO v_prs_srtperslid_key
        FROM prs_srtperslid
       WHERE prs_srtperslid_upper = UPPER (p_fnc_omschrijving);

      RETURN v_prs_srtperslid_key;
   EXCEPTION
      WHEN NO_DATA_FOUND
      THEN
         INSERT INTO prs_srtperslid
                     (prs_srtperslid_omschrijving
                     )
              VALUES (p_fnc_omschrijving
                     );

         SELECT prs_srtperslid_key
           INTO v_prs_srtperslid_key
           FROM prs_srtperslid
          WHERE prs_srtperslid_upper = UPPER (p_fnc_omschrijving);

         RETURN v_prs_srtperslid_key;
   END;

   -- CONN#410
   FUNCTION prs_perslid_verwijder
      RETURN NUMBER
   IS
      CURSOR c_prs_del
      IS
         SELECT DISTINCT p.prs_perslid_key
                    FROM prs_perslid p, prs_v_verplichting pv
                   WHERE p.prs_perslid_verwijder IS NULL
                     AND NOT (p.prs_perslid_einddatum IS NULL)
                     AND p.prs_perslid_einddatum <= SYSDATE
                     AND p.prs_perslid_key = pv.prs_perslid_key(+)
                     AND pv.prs_perslid_key IS NULL;

      rec_prs_del          c_prs_del%ROWTYPE;
      v_count_verwijderd   NUMBER (10);
      v_errmes             VARCHAR2 (512);
   BEGIN
      v_count_verwijderd := 0;

      FOR rec_prs_del IN c_prs_del
      LOOP
         BEGIN
            UPDATE prs_perslidwerkplek
               SET prs_perslidwerkplek_verwijder = SYSDATE
             WHERE prs_perslid_key = rec_prs_del.prs_perslid_key AND prs_perslidwerkplek_verwijder IS NULL;

            UPDATE prs_perslid
               SET prs_perslid_verwijder = SYSDATE
             WHERE prs_perslid_key = rec_prs_del.prs_perslid_key;
         EXCEPTION
            WHEN OTHERS
            THEN
               v_errmes := 'Error bij verwijderen persoon. Negeer fouten, verwerk de volgende persoon.';
         END;
      END LOOP;

      RETURN v_count_verwijderd;
   END;

   FUNCTION prs_afdeling_key (
      p_dvb_divisie           IN   VARCHAR2,
      p_dvb_divisie_label     IN   VARCHAR2,
      p_dvb_k_regiozoeknaam   IN   VARCHAR2,
      p_dvb_k_regio_label     IN   VARCHAR2,
      p_afd_code              IN   VARCHAR2,
      p_afd_omschrijving      IN   VARCHAR2
   )
      RETURN NUMBER
   IS
      v_mh_bedrijf_key          prs_afdeling.prs_afdeling_key%TYPE;
      v_mh_afdeling_parentkey   prs_afdeling.prs_afdeling_key%TYPE;
      v_afdeling_key            prs_afdeling.prs_afdeling_key%TYPE;
      v_divisie_key             prs_afdeling.prs_afdeling_key%TYPE;
   BEGIN
      BEGIN
         SELECT a.prs_afdeling_key
           INTO v_afdeling_key
           FROM prs_afdeling a
          WHERE TRIM(a.prs_afdeling_upper) = UPPER (TRIM(p_afd_code)) AND a.prs_afdeling_verwijder IS NULL;
      EXCEPTION
         WHEN NO_DATA_FOUND
         THEN
            v_afdeling_key := NULL;
      END;

      IF v_afdeling_key IS NULL
         THEN   -- afdeling bestaat niet zoek de divisie en maak de afdeling aan.
         BEGIN
            SELECT a.prs_afdeling_key
              INTO v_divisie_key
              FROM prs_v_afdeling a
             WHERE UPPER (TRIM(a.prs_afdeling_omschrijving)) = UPPER (TRIM(p_dvb_divisie)) AND a.prs_afdeling_verwijder IS NULL AND a.niveau = 1;
         EXCEPTION
            WHEN NO_DATA_FOUND
            THEN
               BEGIN
                  v_divisie_key := NULL;
                  -- als we geen afdeling en divisie kunnen vinden dan plaatsen we de persoon in de afdeling perman nieuw
                  -- bestaat afdeling "perman nieuw"
                  SELECT a.prs_afdeling_key
                    INTO v_afdeling_key
                    FROM prs_afdeling a
                   WHERE a.prs_afdeling_upper = UPPER ('Perman')
                     AND UPPER (a.prs_afdeling_omschrijving) = UPPER ('Perman nieuw')
                     AND a.prs_afdeling_verwijder IS NULL;
               EXCEPTION
                  WHEN NO_DATA_FOUND
                  THEN
                     v_afdeling_key := NULL;
               END;
         END;

         IF v_divisie_key IS NOT NULL
         THEN   -- nieuwe afdeling onder bekende divisie plaatsen
            -- maak de afdeling aan
            INSERT INTO prs_afdeling
                        (prs_afdeling_parentkey, prs_afdeling_naam, prs_afdeling_omschrijving, prs_bedrijf_key
                        )
                 VALUES (v_divisie_key, p_afd_code, p_afd_omschrijving, null
                        )
                 RETURNING prs_afdeling_key INTO v_afdeling_key;
         END IF;
      -- else  -- afdeling bestaat: return v-afdeling_key.
      END IF;

      RETURN v_afdeling_key;
   END;

   FUNCTION prs_afdeling_key_old (p_dvb_personeelsnummer IN VARCHAR2)
      RETURN NUMBER
   IS
      v_prs_afdeling_key   prs_perslid.prs_afdeling_key%TYPE;
   BEGIN
      SELECT prs_afdeling_key
        INTO v_prs_afdeling_key
        FROM prs_perslid
       WHERE prs_perslid_nr = p_dvb_personeelsnummer;

      RETURN v_prs_afdeling_key;
   EXCEPTION
      WHEN NO_DATA_FOUND
      THEN
         RETURN 0;
   END;
END perman;
/

BEGIN adm.systrackscript('$Workfile: conn#22385.sql $', '$Revision: 1 $', 1); END;
/

COMMIT;

SPOOL OFF
