--
-- $Id$
--
-- Script containing customer specific configuration sql statements for aads: Arcadis Aqumen Facility Management

DEFINE thisfile = 'YKPN.SQL'
DEFINE dbuser   = '^YKPN'

SET ECHO ON
SET DEFINE ON
COLUMN fcltlogfile NEW_VALUE fcltlogfile NOPRINT;
WHENEVER SQLERROR EXIT;
SELECT adm.scriptspoolfile('&dbuser', '&thisfile') AS fcltlogfile FROM DUAL;
WHENEVER SQLERROR CONTINUE;
SPOOL &fcltlogfile
SET DEFINE OFF

------ payload begin ------

CREATE OR REPLACE PACKAGE YKPN
AS
   PROCEDURE set_bez_pincode (p_bezoekers_key IN NUMBER);

   PROCEDURE update_bezoeker (p_bezoekers_key IN NUMBER);

   PROCEDURE set_kenmerk(p_module           IN VARCHAR2,
                         p_kenmerk_key      IN NUMBER,
                         p_link_key         IN NUMBER,
                         p_kenmerk_waarde   IN VARCHAR2,
                         p_history          IN NUMBER);

   PROCEDURE mld_after_insert (p_melding_key IN NUMBER);

   PROCEDURE set_nedap_status(p_bezoekers_key IN NUMBER,
                              p_type          IN VARCHAR2,
                              p_nedap_id      IN VARCHAR2);

   PROCEDURE fin_set_approver (p_factuur_key   IN NUMBER);

   PROCEDURE add_xml_row (p_bestand   IN VARCHAR2,
                          p_regel     IN VARCHAR2);

   PROCEDURE add_xml_element (p_bestand   IN VARCHAR2,
                              p_tag       IN VARCHAR2,
                              p_value     IN VARCHAR2);

   PROCEDURE refreshscore(pUserKey IN NUMBER);
    FUNCTION get_flex_value (
    pmodule               IN VARCHAR2,
    p_kenmerk_key         IN NUMBER,
    p_ref_key             IN NUMBER,
    p_kenmerkdomein_key   IN NUMBER,
    p_niveau              IN VARCHAR2 DEFAULT NULL)
    RETURN VARCHAR2;

END;
/

CREATE OR REPLACE PACKAGE BODY YKPN
AS

   PROCEDURE refreshscore(pUserKey IN NUMBER)
   AS
   BEGIN
     -- Waarden van de huidige periode(s) verwijderen.
     -- TODO: tricky met KPI's op basis van storingsmeldingen, klachten etc; daar kan voor een
     -- periode maar zo een extra melding afgemeld worden, waardoor de score opnieuw berekend wordt

     DELETE FROM kpi_score;

     -- Opnieuw genereren van KPI scores
      INSERT INTO kpi_score (
         kpi_definitie_key,
         kpi_score_datum,
         alg_locatie_key,
         kpi_score_xmlnode,
         kpi_score_refkey,
         kpi_score_score,
         kpi_score_norm_score,
         kpi_score_drempels)
      SELECT * FROM ykpn_v_kpi_all;

      COMMIT;
   END;
    FUNCTION get_flex_value (
    pmodule               IN VARCHAR2,
    p_kenmerk_key         IN NUMBER,
    p_ref_key             IN NUMBER,
    p_kenmerkdomein_key   IN NUMBER,
    p_niveau              IN VARCHAR2 DEFAULT NULL)
    RETURN VARCHAR2
AS
    v_value               VARCHAR2 (4000);
    v_kenmerkdomein_key   NUMBER (10);
BEGIN
    v_value :=
        flx.getflex (pmodule,
                     p_kenmerk_key,
                     p_ref_key,
                     p_niveau);

    IF p_kenmerkdomein_key IS NOT NULL
    THEN
        v_value := flx.getdomeinwaarde (p_kenmerkdomein_key, v_value);
    END IF;
    RETURN v_value;
END;


   PROCEDURE set_bez_pincode (p_bezoekers_key IN NUMBER)
   AS
      v_count               NUMBER;
      v_found               NUMBER;
      v_code                VARCHAR2 (5);
      v_exists              NUMBER;
      v_date                DATE;
      v_aanmaak             DATE;
      v_kenmerkwaarde_key   NUMBER;
      v_actie_key           NUMBER;

      oracle_err_num    NUMBER;
      oracle_err_mes    VARCHAR2 (200);
      v_errormsg        VARCHAR2 (200);
      v_aanduiding      VARCHAR2 (100);

   BEGIN
      v_count := 0;
      v_found := 0;

      v_aanduiding := 'Bezoeker_key: ' || p_bezoekers_key;

      SELECT TRUNC (bez_afspraak_datum), kw.bez_kenmerkwaarde_aanmaak, kw.bez_kenmerkwaarde_waarde, a.bez_actie_key
        INTO v_date, v_aanmaak, v_code, v_actie_key
        FROM bez_afspraak a,
             bez_bezoekers b,
             res_rsv_deel rrd,
             res_deel rd,
             ins_v_deel_gegevens d,
             (SELECT bez_kenmerkwaarde_waarde, bez_kenmerkwaarde_aanmaak, bez_kenmerkwaarde_key, bez_bezoekers_key
                FROM bez_kenmerkwaarde kw
               WHERE bez_kenmerk_key = 1020) kw
       WHERE a.bez_afspraak_key = b.bez_afspraak_key
         AND b.bez_bezoekers_key = p_bezoekers_key
         AND b.bez_bezoekers_key = kw.bez_bezoekers_key(+)
         AND b.bez_bezoekers_key = rrd.bez_bezoekers_key
         AND rrd.res_deel_key = rd.res_deel_key
         AND rd.res_ins_deel_key = d.ins_deel_key;

      WHILE v_found = 0 AND v_count < 1000
      LOOP
         --DBMS_OUTPUT.put_line (COALESCE (v_code, '-1'));

         SELECT COUNT ( * )
           INTO v_exists
           FROM bez_bezoekers b, bez_kenmerkwaarde kw, bez_afspraak a
          WHERE a.bez_afspraak_key = b.bez_afspraak_key
            AND kw.bez_bezoekers_key = b.bez_bezoekers_key
            AND b.bez_bezoekers_key <> p_bezoekers_key
            AND kw.bez_kenmerk_key = 1020                            -- Pincode
            AND kw.bez_kenmerkwaarde_waarde = COALESCE (v_code, '-1')
            AND bez_afspraak_datum BETWEEN v_date -1 AND v_date + 2;

         IF v_exists > 0 OR v_code IS NULL
         THEN
            v_code := TRUNC (DBMS_RANDOM.VALUE (9999, 100000));
            --DBMS_OUTPUT.put_line ('Nieuwe code:' || v_code);
         ELSE
            v_found := 1;

            ykpn.set_kenmerk('BEZ', 1020, p_bezoekers_key, v_code, 0);
         END IF;

         v_count := v_count + 1;
      END LOOP;

   COMMIT;
   EXCEPTION WHEN NO_DATA_FOUND
   THEN
      -- Verwijder de pincode
      ykpn.set_kenmerk('BEZ', 1020, p_bezoekers_key, NULL, 0);
      -- Bezoeker heeft geen parkeerplaats

      oracle_err_num := SQLCODE;
      oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
      v_errormsg := 'OTHERS (error '||oracle_err_num||'/'||oracle_err_mes||')';
      fac.writelog ('YKPN.set_bez_pincode',
                    'E',
                    v_aanduiding || ': ' || v_errormsg,
                    '');
   END;

   -- Deze procedure wordt aangeroepen via de hook functie.
   PROCEDURE update_bezoeker (p_bezoekers_key IN NUMBER)
   AS
      v_count               NUMBER;
      v_found               NUMBER;
      v_code                VARCHAR2 (5);
      v_exists              NUMBER;
      v_date                DATE;
      v_aanmaak             DATE;
      v_kenmerkwaarde_key   NUMBER;
      v_actie_key           NUMBER;
      v_afspraak_key        BEZ_AFSPRAAK.BEZ_AFSPRAAK_KEY%TYPE;
      v_locatie_omschrijving ALG_LOCATIE.ALG_LOCATIE_OMSCHRIJVING%TYPE;
      v_autorisator_key     NUMBER;
      v_count_pp            NUMBER;
      v_perslid_email       PRS_PERSLID.PRS_PERSLID_EMAIL%TYPE;

      oracle_err_num        NUMBER;
      oracle_err_mes        VARCHAR2 (200);
      v_errormsg            VARCHAR2 (200);
      v_aanduiding          VARCHAR2 (100);
   BEGIN
      v_count := 0;
      v_found := 0;

      v_aanduiding := 'Bezoekers_key: ' || p_bezoekers_key;
      SELECT a.bez_afspraak_key, bez_afspraak_datum, kw.bez_kenmerkwaarde_aanmaak, a.bez_actie_key, kp.bez_kenmerkwaarde_waarde, l.alg_locatie_omschrijving, FAC.SAFE_TO_NUMBER(ka.prs_perslid_key), ka.prs_perslid_email
        INTO v_afspraak_key, v_date, v_aanmaak, v_actie_key, v_code, v_locatie_omschrijving, v_autorisator_key, v_perslid_email
        FROM bez_afspraak a,
             bez_bezoekers b,
             alg_locatie l,
             (SELECT bez_kenmerkwaarde_waarde, bez_kenmerkwaarde_aanmaak, bez_kenmerkwaarde_key, bez_bezoekers_key
                FROM bez_kenmerkwaarde kw
               WHERE bez_kenmerk_key = 1002) kw,  -- Aanmaak, kenmerk wordt door hook functie bij iedere bezoeker gezet
             (SELECT bez_kenmerkwaarde_waarde, bez_kenmerkwaarde_aanmaak, bez_kenmerkwaarde_key, bez_bezoekers_key
                FROM bez_kenmerkwaarde kw
               WHERE bez_kenmerk_key = 1020) kp,  -- Pincode
             (SELECT p.prs_perslid_naam, prs_perslid_email, prs_perslid_key, bez_kenmerkwaarde_aanmaak, bez_kenmerkwaarde_key, bez_bezoekers_key
                FROM bez_kenmerkwaarde kw, prs_perslid p
               WHERE bez_kenmerk_key = 1003
                 AND FAC.SAFE_TO_NUMBER(bez_kenmerkwaarde_waarde) = p.prs_perslid_key) ka  -- Autorisator
       WHERE a.bez_afspraak_key = b.bez_afspraak_key
         AND a.alg_locatie_key = l.alg_locatie_key
         AND b.bez_bezoekers_key = p_bezoekers_key
         AND b.bez_bezoekers_key = kw.bez_bezoekers_key(+)
         AND b.bez_bezoekers_key = kp.bez_bezoekers_key(+)
         AND b.bez_bezoekers_key = ka.bez_bezoekers_key(+);

      --DBMS_OUTPUT.put_line ('Bestaande code:' || v_code);
      v_aanduiding := 'Zet initiele kenmerken, Bezoekers_key: ' || p_bezoekers_key;
      IF v_aanmaak IS NULL
      THEN
         ykpn.set_kenmerk('BEZ', 1002, p_bezoekers_key, TO_CHAR(SYSDATE, 'YYYYMMDDHH24MI'), 0);   -- Aanmaak
      ELSIF v_aanmaak > sysdate - 5/(24*60*60)     -- kenmerk is de afgelopen 5 seconden aangemaakt. Het betreft dan een herhaal actie.
      THEN
         ykpn.set_kenmerk('BEZ', 1002, p_bezoekers_key, TO_CHAR(SYSDATE, 'YYYYMMDDHH24MI'), 0);   -- Aanmaak
         ykpn.set_kenmerk('BEZ', 1004, p_bezoekers_key, NULL, 0);   -- Reden afwijzing
         ykpn.set_kenmerk('BEZ', 1020, p_bezoekers_key, NULL, 0);   -- Pincode
         ykpn.set_kenmerk('BEZ', 1120, p_bezoekers_key, NULL, 0);   -- Geldig ID
         ykpn.set_kenmerk('BEZ', 1060, p_bezoekers_key, NULL, 0);   -- Nedap ID
         ykpn.set_kenmerk('BEZ', 1042, p_bezoekers_key, NULL, 0);   -- Nedap Verzonden
         ykpn.set_kenmerk('BEZ', 1160, p_bezoekers_key, NULL, 0);   -- Kenteken respons
         ykpn.set_kenmerk('BEZ', 1161, p_bezoekers_key, NULL, 0);   -- Kenteken Verzonden
         ykpn.set_kenmerk('BEZ', 1043, p_bezoekers_key, NULL, 0);   -- SMS Verzonden
         v_code := NULL;
      END IF;

      v_aanduiding := 'Bewaar locatie omschrijving, Bezoekers_key: ' || p_bezoekers_key;
      ykpn.set_kenmerk('BEZ', 1200, p_bezoekers_key, v_locatie_omschrijving, 0);   -- Locatie omschrijving voor bezoekersnotificatie
      -- Als de parkeerplaats goedgekeurd was gaan we de pincode nog even checken
      -- Deze kan aangepast moeten worden als de afspraak in tijd verplaatst wordt en
      -- er een andere afspraak staat met dezelfde pincode
      -- Voor de historie kijken we ook naar records die al een pincode hebben.
      SELECT count(*)
        INTO v_count
        FROM fac_tracking t, fac_srtnotificatie sn
       WHERE fac_tracking_refkey = p_bezoekers_key
         AND t.fac_srtnotificatie_key = sn.fac_srtnotificatie_key
         AND sn.fac_srtnotificatie_code = 'CUST04';

       IF v_count > 1 OR v_code IS NOT NULL THEN
          set_bez_pincode (p_bezoekers_key);
       END IF;

       IF v_actie_key = 1 THEN
         ykpn.set_kenmerk('BEZ', 1140, p_bezoekers_key, 'Let op: Een parkeerplaats op eigen standplaats reserveren is niet toegestaan, dit i.v.m. het tekort aan bezoekersparkeerplaatsen wat dan ontstaat.', 0);
       END IF;

       -- Controleer of de autorisator ingevuld is.
       SELECT COUNT(*)
         INTO v_count_pp
         FROM res_rsv_deel
        WHERE bez_bezoekers_key = p_bezoekers_key;

       -- Hebben we al een notificatie van ongeldige aanvraag gestuurd?
       SELECT count(*)
         INTO v_count
         FROM fac_tracking t, fac_srtnotificatie sn
        WHERE fac_tracking_refkey = p_bezoekers_key
          AND t.fac_srtnotificatie_key = sn.fac_srtnotificatie_key
          AND sn.fac_srtnotificatie_code = 'CUST06';

       -- parkeerplaatsaanvraag zonder autorisator en nog geen notificatie gestuurd
       IF v_count_pp = 1 AND v_autorisator_key IS NULL AND v_count = 0
       THEN
          FAC.trackaction ('CUST06', v_afspraak_key, NULL, NULL, 'Ongeldige parkeerplaatsaanvraag: Geen autorisator ingevuld!');
       END IF;


       -- parkeerplaatsaanvraag met autorisator en nog geen notificatie naar goedkeurder gestuurd.
       IF v_count_pp = 1 AND v_autorisator_key IS NOT NULL
       THEN
          -- Hebben we al een notificatie naar de goedkeurder gestuurd?
          SELECT count(*)
            INTO v_count
            FROM fac_tracking t, fac_srtnotificatie sn
           WHERE fac_tracking_refkey = v_afspraak_key
             AND t.fac_srtnotificatie_key = sn.fac_srtnotificatie_key
             AND sn.fac_srtnotificatie_code = 'CUST07';

          IF v_count = 0
          THEN
             FAC.trackaction ('CUST07', v_afspraak_key, NULL, NULL, '#Mail naar autorisator gestuurd naar: ' || v_perslid_email);

             INSERT INTO fac_notificatie (fac_srtnotificatie_key,
                                          fac_notificatie_status,
                                          fac_notificatie_receiver_email,
                                          prs_perslid_key_receiver,
                                          fac_notificatie_oms,
                                          fac_notificatie_refkey,
                                          fac_notificatie_extrakey,
                                          fac_notificatie_prioriteit)
                 VALUES (281,     -- CUST07
                         2,                                                                         -- mail
                         v_perslid_email,                                                            -- email
                         v_autorisator_key,
                         'Goedkeuring verzocht voor parkeerplaatsaanvraag',
                         v_afspraak_key,
                         NULL,
                         2);

          END IF;
       END IF;
   COMMIT;
   EXCEPTION WHEN NO_DATA_FOUND
   THEN
      -- Verwijder de pincode
      ykpn.set_kenmerk('BEZ', 1020, p_bezoekers_key, NULL, 0);
      -- Bezoeker heeft geen parkeerplaats

      oracle_err_num := SQLCODE;
      oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
      v_errormsg := 'OTHERS (error '||oracle_err_num||'/'||oracle_err_mes||')';
      fac.writelog ('YKPN.update_bezoeker',
                    'E',
                    v_aanduiding || ': ' || v_errormsg,
                    '');

   END;

   PROCEDURE set_kenmerk(p_module           IN VARCHAR2,
                         p_kenmerk_key      IN NUMBER,
                         p_link_key         IN NUMBER,
                         p_kenmerk_waarde   IN VARCHAR2,
                         p_history          IN NUMBER)
   AS
      v_count          NUMBER;
      v_niveau         VARCHAR2 (1);
   BEGIN
      CASE p_module
      WHEN 'PRS'
      THEN
         -- niveau van prs_kenmerk ophalen, omdat deze ook in prs_kenmerklink wordt
         -- opgeslagen (da's dus redundant..?)
         SELECT prs_kenmerk_niveau
           INTO v_niveau
           FROM prs_kenmerk
          WHERE prs_kenmerk_key = p_kenmerk_key;

         SELECT COUNT ( * )
           INTO v_count
           FROM prs_kenmerklink
          WHERE     prs_link_key = p_link_key
                AND prs_kenmerk_key = p_kenmerk_key
                AND prs_kenmerklink_verwijder IS NULL;

         IF v_count = 1
         THEN
            IF p_kenmerk_waarde IS NULL
            THEN
               DELETE prs_kenmerklink
                WHERE     prs_link_key = p_link_key
                      AND prs_kenmerk_key = p_kenmerk_key
                      AND prs_kenmerklink_verwijder IS NULL;
            ELSE
               UPDATE prs_kenmerklink
                  SET prs_kenmerklink_waarde = p_kenmerk_waarde
                WHERE     prs_link_key = p_link_key
                      AND prs_kenmerk_key = p_kenmerk_key
                      AND prs_kenmerklink_verwijder IS NULL;
            END IF;
         ELSE
            IF p_kenmerk_key IS NOT NULL AND p_kenmerk_waarde IS NOT NULL
            THEN
               INSERT INTO prs_kenmerklink (prs_kenmerk_key,
                                            prs_link_key,
                                            prs_kenmerklink_niveau,
                                            prs_kenmerklink_waarde)
                   VALUES (p_kenmerk_key,
                           p_link_key,
                           v_niveau,
                           p_kenmerk_waarde);
            END IF;
         END IF;

      WHEN 'ALG'
      THEN
         -- niveau van prs_kenmerk ophalen, omdat deze ook in prs_kenmerklink wordt
         -- opgeslagen (da's dus redundant..?)
         SELECT alg_kenmerk_niveau
           INTO v_niveau
           FROM alg_kenmerk
          WHERE alg_kenmerk_key = p_kenmerk_key;

         SELECT COUNT ( * )
           INTO v_count
           FROM alg_onrgoedkenmerk
          WHERE     alg_onrgoed_key = p_link_key
                AND alg_kenmerk_key = p_kenmerk_key
                AND alg_onrgoedkenmerk_verwijder IS NULL;

         IF v_count = 1
         THEN
            IF p_kenmerk_waarde IS NULL
            THEN
               DELETE alg_onrgoedkenmerk
                WHERE     alg_onrgoed_key = p_link_key
                      AND alg_kenmerk_key = p_kenmerk_key
                      AND alg_onrgoedkenmerk_verwijder IS NULL;
            ELSE
               UPDATE alg_onrgoedkenmerk
                  SET alg_onrgoedkenmerk_waarde = p_kenmerk_waarde
                WHERE     alg_onrgoed_key = p_link_key
                      AND alg_kenmerk_key = p_kenmerk_key
                      AND alg_onrgoedkenmerk_verwijder IS NULL;
            END IF;
         ELSE
            IF p_kenmerk_key IS NOT NULL AND p_kenmerk_waarde IS NOT NULL
            THEN
               INSERT INTO alg_onrgoedkenmerk (alg_kenmerk_key,
                                               alg_onrgoed_key,
                                               alg_onrgoed_niveau,
                                               alg_onrgoedkenmerk_waarde)
                   VALUES (p_kenmerk_key,
                           p_link_key,
                           v_niveau,
                           p_kenmerk_waarde);
            END IF;
         END IF;

      WHEN 'BEZ'
      THEN

         SELECT COUNT ( * )
           INTO v_count
           FROM bez_kenmerkwaarde
          WHERE     bez_bezoekers_key = p_link_key
                AND bez_kenmerk_key = p_kenmerk_key
                AND bez_kenmerkwaarde_verwijder IS NULL;

         IF v_count = 1
         THEN
            IF p_kenmerk_waarde IS NULL
            THEN
               DELETE bez_kenmerkwaarde
                WHERE     bez_bezoekers_key = p_link_key
                      AND bez_kenmerk_key = p_kenmerk_key
                      AND bez_kenmerkwaarde_verwijder IS NULL;
            ELSE
               UPDATE bez_kenmerkwaarde
                  SET bez_kenmerkwaarde_waarde = p_kenmerk_waarde
                WHERE     bez_bezoekers_key = p_link_key
                      AND bez_kenmerk_key = p_kenmerk_key
                      AND bez_kenmerkwaarde_verwijder IS NULL;
            END IF;
         ELSE
            IF p_kenmerk_key IS NOT NULL AND p_kenmerk_waarde IS NOT NULL
            THEN
               INSERT INTO bez_kenmerkwaarde (bez_kenmerk_key,
                                            bez_bezoekers_key,
                                            bez_kenmerkwaarde_waarde)
                   VALUES (p_kenmerk_key,
                           p_link_key,
                           p_kenmerk_waarde);
            END IF;
         END IF;

      WHEN 'MLD'
      THEN
         -- melding- of opdrachtkenmerk?
         SELECT mld_kenmerk_niveau
           INTO v_niveau
           FROM mld_kenmerk
          WHERE mld_kenmerk_key = p_kenmerk_key;

         CASE v_niveau
         WHEN 'O'
         THEN
            SELECT COUNT ( * )
              INTO v_count
              FROM mld_kenmerkopdr
             WHERE     mld_opdr_key = p_link_key
                   AND mld_kenmerk_key = p_kenmerk_key
                   AND mld_kenmerkopdr_verwijder IS NULL;

            IF v_count = 1
            THEN
               IF p_kenmerk_waarde IS NULL
               THEN
                  DELETE mld_kenmerkopdr
                   WHERE     mld_opdr_key = p_link_key
                         AND mld_kenmerk_key = p_kenmerk_key
                         AND mld_kenmerkopdr_verwijder IS NULL;
               ELSE
                  UPDATE mld_kenmerkopdr
                     SET mld_kenmerkopdr_waarde = p_kenmerk_waarde
                   WHERE     mld_opdr_key = p_link_key
                         AND mld_kenmerk_key = p_kenmerk_key
                         AND mld_kenmerkopdr_verwijder IS NULL;
               END IF;
            ELSE
               IF p_kenmerk_key IS NOT NULL AND p_kenmerk_waarde IS NOT NULL
               THEN
                  INSERT INTO mld_kenmerkopdr (mld_kenmerk_key,
                                               mld_opdr_key,
                                               mld_kenmerkopdr_waarde)
                      VALUES (p_kenmerk_key,
                              p_link_key,
                              p_kenmerk_waarde);
               END IF;
            END IF;
         WHEN 'S'
         THEN
            SELECT COUNT ( * )
              INTO v_count
              FROM mld_kenmerkmelding
             WHERE     mld_melding_key = p_link_key
                   AND mld_kenmerk_key = p_kenmerk_key
                   AND mld_kenmerkmelding_verwijder IS NULL;

            IF v_count = 1
            THEN
               IF p_kenmerk_waarde IS NULL
               THEN
                  DELETE mld_kenmerkmelding
                   WHERE     mld_melding_key = p_link_key
                         AND mld_kenmerk_key = p_kenmerk_key
                         AND mld_kenmerkmelding_verwijder IS NULL;
               ELSE
                  UPDATE mld_kenmerkmelding
                     SET mld_kenmerkmelding_waarde = p_kenmerk_waarde
                   WHERE     mld_melding_key = p_link_key
                         AND mld_kenmerk_key = p_kenmerk_key
                         AND mld_kenmerkmelding_verwijder IS NULL;
               END IF;
            ELSE
               IF p_kenmerk_key IS NOT NULL AND p_kenmerk_waarde IS NOT NULL
               THEN
                  INSERT INTO mld_kenmerkmelding (mld_kenmerk_key,
                                                  mld_melding_key,
                                                  mld_kenmerkmelding_waarde)
                      VALUES (p_kenmerk_key,
                              p_link_key,
                              p_kenmerk_waarde);
               END IF;
            END IF;
         END CASE;

   WHEN 'FIN'
   THEN
      -- niveau van prs_kenmerk ophalen, omdat deze ook in prs_kenmerklink wordt
      -- opgeslagen (da's dus redundant..?)
      SELECT fin_kenmerk_type
        INTO v_niveau
        FROM fin_kenmerk
       WHERE fin_kenmerk_key = p_kenmerk_key;


      IF v_niveau = 'F'
      THEN
         SELECT COUNT ( * )
           INTO v_count
           FROM fin_kenmerkfactuur
          WHERE     fin_factuur_key = p_link_key
                AND fin_kenmerk_key = p_kenmerk_key
                AND fin_kenmerkfactuur_verwijder IS NULL;

         IF v_count = 1
         THEN
            IF p_kenmerk_waarde IS NULL
            THEN
               DELETE fin_kenmerkfactuur
                WHERE     fin_factuur_key = p_link_key
                      AND fin_kenmerk_key = p_kenmerk_key
                      AND fin_kenmerkfactuur_verwijder IS NULL;
            ELSE
               UPDATE fin_kenmerkfactuur
                  SET fin_kenmerkfactuur_waarde = p_kenmerk_waarde
                WHERE     fin_factuur_key = p_link_key
                      AND fin_kenmerk_key = p_kenmerk_key
                      AND fin_kenmerkfactuur_verwijder IS NULL;
            END IF;
         ELSE
            IF p_kenmerk_key IS NOT NULL AND p_kenmerk_waarde IS NOT NULL
            THEN
               INSERT INTO fin_kenmerkfactuur (fin_kenmerk_key,
                                               fin_factuur_key,
                                               fin_kenmerkfactuur_waarde)
                   VALUES (p_kenmerk_key,
                           p_link_key,
                           p_kenmerk_waarde);
            END IF;
         END IF;
      ELSE
         -- Kenmerk bij factuurregel
         SELECT COUNT ( * )
           INTO v_count
           FROM fin_kenmerkfactregel
          WHERE     fin_factuurregel_key = p_link_key
                AND fin_kenmerk_key = p_kenmerk_key
                AND fin_kenmerkfactregel_verwijder IS NULL;

         IF v_count = 1
         THEN
            IF p_kenmerk_waarde IS NULL
            THEN
               DELETE fin_kenmerkfactregel
                WHERE     fin_factuurregel_key = p_link_key
                      AND fin_kenmerk_key = p_kenmerk_key
                      AND fin_kenmerkfactregel_verwijder IS NULL;
            ELSE
               UPDATE fin_kenmerkfactregel
                  SET fin_kenmerkfactregel_waarde = p_kenmerk_waarde
                WHERE     fin_factuurregel_key = p_link_key
                      AND fin_kenmerk_key = p_kenmerk_key
                      AND fin_kenmerkfactregel_verwijder IS NULL;
            END IF;
         ELSE
            IF p_kenmerk_key IS NOT NULL AND p_kenmerk_waarde IS NOT NULL
            THEN
               INSERT INTO fin_kenmerkfactregel (fin_kenmerk_key,
                                                 fin_factuurregel_key,
                                                 fin_kenmerkfactregel_waarde)
                   VALUES (p_kenmerk_key,
                           p_link_key,
                           p_kenmerk_waarde);
            END IF;
         END IF;

      END IF;

      WHEN 'RES'
      THEN
         -- res_rsv_ruimte kenmerk
         SELECT COUNT ( * )
           INTO v_count
           FROM res_kenmerkwaarde
          WHERE     res_rsv_ruimte_key = p_link_key
                   AND res_kenmerk_key = p_kenmerk_key
                   AND res_kenmerkwaarde_verwijder IS NULL;

            IF v_count = 1
            THEN
               IF p_kenmerk_waarde IS NULL
               THEN
                  DELETE res_kenmerkwaarde
                   WHERE     res_rsv_ruimte_key = p_link_key
                         AND res_kenmerk_key = p_kenmerk_key
                         AND res_kenmerkwaarde_verwijder IS NULL;
               ELSE
                  UPDATE res_kenmerkwaarde
                     SET res_kenmerkreservering_waarde = p_kenmerk_waarde
                   WHERE     res_rsv_ruimte_key = p_link_key
                         AND res_kenmerk_key = p_kenmerk_key
                         AND res_kenmerkwaarde_verwijder IS NULL;
               END IF;
            ELSE
               IF p_kenmerk_key IS NOT NULL AND p_kenmerk_waarde IS NOT NULL
               THEN
                  INSERT INTO res_kenmerkwaarde (res_kenmerk_key,
                                                 res_rsv_ruimte_key,
                                                 res_kenmerkreservering_waarde)
                      VALUES (p_kenmerk_key,
                              p_link_key,
                              p_kenmerk_waarde);
               END IF;
            END IF;
         END CASE;
   END;

   PROCEDURE mld_after_insert (p_melding_key IN NUMBER)
   AS
      CURSOR c
      IS
         SELECT mk.mld_kenmerk_key, ogk.alg_onrgoedkenmerk_waarde
           FROM mld_melding          m,
                alg_v_onroerendgoed  og,
                alg_onrgoedkenmerk   ogk,
                alg_kenmerk          ak,
                mld_kenmerk          mk,
                mld_srtkenmerk       msk
          WHERE     mld_melding_key = p_melding_key
                AND m.mld_alg_onroerendgoed_keys = og.alg_onroerendgoed_keys
                AND mk.mld_srtkenmerk_key = msk.mld_srtkenmerk_key
                AND mk.mld_stdmelding_key = m.mld_stdmelding_key
                AND ak.alg_kenmerk_omschrijving = msk.mld_srtkenmerk_omschrijving
                AND mk.mld_kenmerk_groep = 1
                AND ak.alg_kenmerk_kenmerktype <> 'L'
                AND ak.alg_kenmerk_key = ogk.alg_kenmerk_key
                AND ogk.alg_onrgoed_key = og.alg_gebouw_key;

      v_count           NUMBER;
      v_stdmelding_key  NUMBER;

   BEGIN
      SELECT mld_stdmelding_key
        INTO v_stdmelding_key
        FROM mld_melding
       WHERE mld_melding_key = p_melding_key;

      IF v_stdmelding_key = 481 -- Parkeerplaattelling
      THEN
         -- Zijn er al kenmerken gevuld door de after_insert?
         -- Deze kenmerken zitten allemaal in groep 1 en worden door deze procedure bevroren vanuit het gebouw
         SELECT count(*)
           INTO v_count
           FROM mld_melding m, mld_kenmerkmelding km, mld_kenmerk k
          WHERE km.mld_kenmerk_key = k.mld_kenmerk_key
            AND km.mld_melding_key = m.mld_melding_key
            AND k.mld_stdmelding_key = m.mld_stdmelding_key
            AND m.mld_melding_key = p_melding_key
            AND k.mld_kenmerk_groep = 1;

         IF v_count = 0
         THEN
            FOR rec IN C LOOP
               YKPN.set_kenmerk('MLD', rec.mld_kenmerk_key, p_melding_key, rec.alg_onrgoedkenmerk_waarde, 0);
            END LOOP;
         END IF;
      END IF;
   END;

   PROCEDURE set_nedap_status(p_bezoekers_key IN NUMBER,
                              p_type          IN VARCHAR2,
                              p_nedap_id      IN VARCHAR2)
   AS
      v_kenmerkwaarde_key NUMBER;
   BEGIN
      IF p_type = 'PINCODE'
      THEN
         ykpn.set_kenmerk('BEZ', 1060, p_bezoekers_key, p_nedap_id, 0);   -- Nedap ID PINCODE
      ELSIF p_type = 'KENTEKEN'
      THEN
         ykpn.set_kenmerk('BEZ', 1160, p_bezoekers_key, p_nedap_id, 0);   -- Nedap ID KENTEKEN
      END IF;

      COMMIT;
   END;

   PROCEDURE fin_set_approver (p_factuur_key IN NUMBER)
   AS
       v_count                   NUMBER;
       v_perslid_key_beh         mld_opdr.prs_perslid_key%TYPE;
       v_perslid_key_goedkeur    fin_factuur.prs_perslid_key_goedkeur%TYPE;
       v_factuur_statuses_key    fin_factuur.fin_factuur_statuses_key%TYPE;
       v_factuur_totaal          fin_factuur.fin_factuur_totaal%TYPE;
       v_perslid_naam_goedkeur   VARCHAR2 (100);
   BEGIN
       -- controleer of de behandelaar van de opdracht rechten heeft om de factuur
       -- te mogen goedkeuren
       SELECT o.prs_perslid_key,
              prs_perslid_key_goedkeur,
              fin_factuur_statuses_key,
              pf.prs_perslid_naam_friendly,
              fin_factuur_totaal
         INTO v_perslid_key_beh,
              v_perslid_key_goedkeur,
              v_factuur_statuses_key,
              v_perslid_naam_goedkeur,
              v_factuur_totaal
         FROM mld_opdr o, fin_factuur f, prs_v_perslid_fullnames_all pf
        WHERE     o.mld_opdr_key = f.mld_opdr_key
              AND f.fin_factuur_key = p_factuur_key
              AND o.prs_perslid_key = pf.prs_perslid_key;

       IF v_factuur_statuses_key = 2                             -- ingevoerd
       THEN
           -- kijk of de behandelaar FINGOE rechten heeft
           SELECT COUNT (*)
             INTO v_count
             FROM fac_v_webgebruiker wg, fac_functie f
            WHERE     wg.fac_functie_key = f.fac_functie_key
                  AND f.fac_functie_code = 'WEB_FINGOE'
                  AND wg.prs_perslid_key = v_perslid_key_beh;

           -- Behandelaar heeft rechten en goedkeurder was nog niet gezet.
           IF v_count > 0 AND v_perslid_key_goedkeur IS NULL
           THEN
               -- Als status van de factuur nog ingevoerd is dan zetten we de status naar Ter goedkeuring (5)
               fac.trackaction (
                   'FINFOK',
                   p_factuur_key,
                   3,
                   NULL,
                      'Expliciete goedkeuring door aangewezen goedkeurder: '
                   || v_perslid_naam_goedkeur);

               UPDATE fin_factuur
                  SET fin_factuur_statuses_key = 5
                WHERE fin_factuur_key = p_factuur_key;

               UPDATE fin_factuur
                  SET prs_perslid_key_goedkeur = v_perslid_key_beh
                WHERE fin_factuur_key = p_factuur_key;
           END IF;
       ELSIF v_factuur_statuses_key = 5                    -- ter goedkeuring
       THEN
           NULL;
       ELSIF v_factuur_statuses_key = 6                            -- akkoord
       THEN
           v_perslid_key_goedkeur := NULL;

           IF v_factuur_totaal <= 15000
           THEN
               -- geen goedkeuring nodig
               NULL;
           ELSE
               -- Heeft katja 36756 de factuur al goedgekeurd?
               SELECT COUNT (*)
                 INTO v_count
                 FROM fac_tracking t, fac_srtnotificatie sn
                WHERE     t.fac_srtnotificatie_key =
                          sn.fac_srtnotificatie_key
                      AND sn.fac_srtnotificatie_code = 'FINGOE'
                      AND t.prs_perslid_key = 36756
                      AND t.fac_tracking_refkey = p_factuur_key;

               IF v_count = 0
               THEN
                   -- bedrag is groter dan 5000 en Katja heeft nog niet goedgekeurd
                   v_perslid_key_goedkeur := 36756;
               ELSIF v_factuur_totaal > 50000
               THEN
                   -- Katja heeft goedgekeurd maar het bedrag is hoger dan 15000, dus William Toma moet ook goedkeuren
                   -- Heeft william toma 44464 (voorloping sander nievergeld) de factuur al goedgekeurd?
                   SELECT COUNT (*)
                     INTO v_count
                     FROM fac_tracking t, fac_srtnotificatie sn
                    WHERE     t.fac_srtnotificatie_key =
                              sn.fac_srtnotificatie_key
                          AND sn.fac_srtnotificatie_code = 'FINGOE'
                          AND t.prs_perslid_key = 44464
                          AND t.fac_tracking_refkey = p_factuur_key;

                   IF v_count = 0
                   THEN
                       -- William heeft nog niet goedgekeurd
                       v_perslid_key_goedkeur := 44464;
                   END IF;
               END IF;
           END IF;

           IF v_perslid_key_goedkeur IS NOT NULL
           THEN
               UPDATE fin_factuur
                  SET fin_factuur_statuses_key = 5
                WHERE fin_factuur_key = p_factuur_key;

               UPDATE fin_factuur
                  SET prs_perslid_key_goedkeur = v_perslid_key_goedkeur
                WHERE fin_factuur_key = p_factuur_key;
           END IF;
       END IF;
   EXCEPTION
       WHEN NO_DATA_FOUND
       THEN
           -- niets aan de hand. Waarschijnlijk was het geen opdracht
           RETURN;
   END;

   PROCEDURE add_xml_row (
      p_bestand   IN VARCHAR2,
      p_regel     IN VARCHAR2)
   AS
      v_index  NUMBER;
   BEGIN
      SELECT COALESCE( MAX(fac_rapport_volgnr), 0) + 1
        INTO v_index
        FROM fac_rapport
       WHERE fac_rapport_node = p_bestand;

      INSERT INTO fac_rapport (
         fac_rapport_node,
         fac_rapport_volgnr,
         fac_rapport_regel)
      VALUES (p_bestand,
              v_index,
              p_regel);
   END;

   PROCEDURE add_xml_element (
      p_bestand   IN VARCHAR2,
      p_tag       IN VARCHAR2,
      p_value     IN VARCHAR2)
   AS
   BEGIN
      ykpn.add_xml_row(p_bestand,
                          '<' || p_tag || '>'
                       || xml.char_to_html(p_value)
                       || '</' || p_tag || '>');
   END;

END;
/


CREATE OR REPLACE PROCEDURE ykpn_select_daily_task (
   p_applname   IN   VARCHAR2,
   p_applrun    IN   VARCHAR2
)
AS
    CURSOR c
    IS
        SELECT a.bez_afspraak_key,
               prs_perslid_email,
               p.prs_perslid_key,
               aantal,
               bez_afspraak_datum,
               alg_locatie_omschrijving
          FROM (  SELECT af.bez_afspraak_key,
                         af.alg_locatie_key,
                         af.bez_afspraak_datum,
                         COUNT (af.bez_afspraak_key) aantal
                    FROM bez_afspraak af, bez_bezoekers b, res_rsv_deel rrd
                   WHERE     af.bez_afspraak_key = b.bez_afspraak_key
                         AND b.BEZ_BEZOEKERS_KEY = rrd.BEZ_BEZOEKERS_KEY
                GROUP BY af.bez_afspraak_key,
                         af.alg_locatie_key,
                         af.bez_afspraak_datum) a,
               prs_v_perslidwerkplek_gegevens  pwpg,
               alg_locatie                     l,
               prs_perslid                     p,
               fac_gebruikersgroep             gg
         WHERE     gg.fac_groep_key = 28                  -- locatiemanagement
               AND gg.prs_perslid_key = pwpg.prs_perslid_key
               AND a.alg_locatie_key = pwpg.alg_locatie_key
               AND pwpg.prs_perslid_key = p.prs_perslid_key
               AND a.alg_locatie_key = l.alg_locatie_key
               AND a.aantal > 5
               AND a.bez_afspraak_datum > SYSDATE
               AND NOT EXISTS
                       (SELECT fac_tracking_key
                          FROM fac_tracking t
                         WHERE     t.fac_srtnotificatie_key = 421  -- cust11
                               AND t.fac_tracking_refkey = a.bez_afspraak_key);

    v_oms            VARCHAR2 (200);
    v_tracking_key   NUMBER (10);

   CURSOR ykpn_bez_out_c
   IS
      SELECT b.bez_bezoekers_key, b.bez_afspraak_key, b.bez_bezoekers_done
        FROM BEZ_AFSPRAAK ba, BEZ_BEZOEKERS b
        WHERE     ba.bez_afspraak_key = b.bez_afspraak_key
           AND b.bez_bezoekers_done IS NOT NULL
           AND b.bez_bezoekers_out IS NULL
           AND TRUNC (ba.bez_afspraak_datum) = TRUNC (SYSDATE);


BEGIN
    -- bevriezen van contractgegevens
    IF TO_CHAR(SYSDATE, 'DD') = '01'
    THEN
       INSERT INTO ykpn_freeze_contract (freezedate,
                                         boekmaand,
                                         cnt_contract_key,
                                         cnt_contract_nummer,
                                         cnt_contract_versie,
                                         cnt_contract_nummer_intern,
                                         cnt_contract_omschrijving,
                                         cnt_contract_opmerking,
                                         cnt_contract_kosten,
                                         cnt_contract_termijnkosten,
                                         cnt_contract_termijntermijn,
                                         cnt_prs_bedrijf_key,
                                         ins_discipline_key,
                                         prs_kostenplaats_key,
                                         cnt_contract_status,
                                         cnt_contract_plaats_key,
                                         cnt_alg_plaats_key,
                                         cnt_alg_plaats_code,
                                         cnt_contract_plaats_gewicht,
                                         cnt_contract_plaats_aanmaak,
                                         cnt_contract_plaats_verwijder)
       (SELECT SYSDATE,
               TO_CHAR(SYSDATE-1, 'yyyy-mm'),
               c.cnt_contract_key,
               cnt_contract_nummer,
               cnt_contract_versie,
               cnt_contract_nummer_intern,
               cnt_contract_omschrijving,
               cnt_contract_opmerking,
               cnt_contract_kosten,
               cnt_contract_termijnkosten,
               cnt_contract_termijntermijn,
               cnt_prs_bedrijf_key,
               ins_discipline_key,
               prs_kostenplaats_key,
               cnt_contract_status,
               cnt_contract_plaats_key,
               cnt_alg_plaats_key,
               cnt_alg_plaats_code,
               cnt_contract_plaats_gewicht,
               cnt_contract_plaats_aanmaak,
               cnt_contract_plaats_verwijder
          FROM cnt_contract c, cnt_contract_plaats cp
         WHERE c.cnt_contract_key = cp.cnt_contract_key
           AND cnt_contract_plaats_verwijder IS NULL);
    END IF;

    -- Stuur locatiemanagement een mail als grote groepen komen parkeren.
    FOR rec IN c
    LOOP
        -- Controleer of de tracking al gezet is. Er kunnen namelijk meer mensen genotificeerd worden per afspraak
        BEGIN
            SELECT fac_tracking_key
              INTO v_tracking_key
              FROM fac_tracking t
             WHERE     t.fac_srtnotificatie_key = 421                -- CUST11
                   AND t.fac_tracking_refkey = rec.bez_afspraak_key;
        EXCEPTION
            WHEN NO_DATA_FOUND
            THEN
                FAC.trackaction (
                    'CUST11',
                    rec.bez_afspraak_key,
                    3,
                    NULL,
                    '#Notificatie grote groep parkeren uitgestuurd');
        END;

        v_oms :=
               'Grote groep ('
            || rec.aantal
            || ') parkeerplaatsen geboekt nr:'
            || rec.bez_afspraak_key
            || '  op '
            || TO_CHAR (rec.bez_afspraak_datum, 'dd-mm-yyyy hh24:mi')
            || ', locatie: '
            || rec.alg_locatie_omschrijving;

        INSERT INTO fac_notificatie (fac_srtnotificatie_key,
                                     fac_notificatie_status,
                                     fac_notificatie_receiver_email,
                                     prs_perslid_key_receiver,
                                     fac_notificatie_oms,
                                     fac_notificatie_refkey,
                                     fac_notificatie_extrakey,
                                     fac_notificatie_prioriteit)
             VALUES (421,                                            -- CUST11
                     2,                                                -- mail
                     rec.prs_perslid_email,                           -- email
                     rec.prs_perslid_key,
                     v_oms,
                     rec.bez_afspraak_key,
                     NULL,
                     2);
    END LOOP;

-- Automatisch buitenmelden bezoekers (moet gepland tussen 22:00 en 0:00 uur). Ticket 56012.
      FOR rec IN ykpn_bez_out_c
      LOOP
         BEGIN
            UPDATE bez_bezoekers
               SET bez_bezoekers_out = SYSDATE
             WHERE bez_bezoekers_key = rec.bez_bezoekers_key;

            fac.trackaction ('BEZOUT', rec.bez_bezoekers_key, NULL, NULL, NULL);
         END;
      END LOOP;

-- Van bezoekers die langer dan een maand geleden een afspraak hadden gaan we een aantal
-- niet belangrijke kenmerken verwijderden.
DELETE bez_kenmerkwaarde
 WHERE bez_kenmerkwaarde_key IN
           (SELECT bez_kenmerkwaarde_key
              FROM bez_bezoekers b, bez_kenmerkwaarde kw, bez_afspraak a
             WHERE     b.bez_bezoekers_key = kw.bez_bezoekers_key
                   AND b.bez_afspraak_key = a.bez_afspraak_key
                   AND kw.bez_kenmerk_key IN (1000,             -- Email adres
                                              1001,            -- Mobielnummer
                                              1002,                 -- Aanmaak
                                              --1003, -- Autorisator
                                              --1004, -- Reden afwijzing parkeerplaats
                                              1020,                 -- Pincode
                                              1042,         -- Nedap verzonden
                                              1043,           -- SMS verzonden
                                              1060,                -- Nedap id
                                              1080,                -- Kenteken
                                              --1120, -- Geldig ID
                                              1140,    -- Uitleg parkeerbeleid
                                              1160,    -- Kenteken response id
                                              1200)      -- Gebouwomschrijving
                   AND bez_afspraak_datum < SYSDATE - 30);
END;
/

CREATE OR REPLACE PROCEDURE ykpn_import_organisatie (p_import_key IN NUMBER)
AS
   c_fielddelimitor      VARCHAR2 (1) := ';';
   v_newline             VARCHAR2 (1000);                                              -- Input line
   v_errormsg            VARCHAR2 (1000);
   oracle_err_num        NUMBER;
   oracle_err_mes        VARCHAR2 (200);
   header_is_valid       NUMBER;
   v_count               NUMBER;
   v_ongeldig            NUMBER (1);
   v_mode                NUMBER (1);
   v_aanduiding          VARCHAR2 (200);
   v_all_null            BOOLEAN;
   v_count_error         NUMBER (10);
   v_count_tot           NUMBER (10);
   v_count_import        NUMBER (10);
   -- De importvelden:
   v_dpt_name            VARCHAR2 (100);
   v_dpt_parent_dep_id   VARCHAR2 (100);
   v_dpt_id              VARCHAR2 (100);
   v_dpt_tree            VARCHAR2 (100);
   v_dpt_name_long       VARCHAR2 (100);
   v_dpt_code            VARCHAR2 (100);

   CURSOR c
   IS
        SELECT *
          FROM fac_imp_file
         WHERE fac_import_key = p_import_key
      ORDER BY fac_imp_file_index;
BEGIN
   COMMIT;
   v_count_error := 0;
   header_is_valid := 0;
   v_count_tot := 0;
   v_count_import := 0;

   FOR rec IN c
   LOOP
      BEGIN
         v_errormsg := 'Fout FETCH te importeren rij';

         v_newline := rec.fac_imp_file_line;
         v_errormsg := 'Fout opvragen te importeren rij';
         v_aanduiding := '';

         -- Lees alle veldwaarden
         fac.imp_getfield (v_newline, c_fielddelimitor, v_dpt_name);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_dpt_parent_dep_id);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_dpt_id);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_dpt_tree);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_dpt_name_long);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_dpt_code);

         v_aanduiding := v_dpt_id || '|' || v_dpt_name_long || '|' || v_dpt_code || '| ';

         v_count_tot := v_count_tot + 1;


         -- Insert geformatteerde import record
         IF header_is_valid = 0
         THEN
            IF v_dpt_name = 'dpt_name'
           AND v_dpt_name_long = 'dpt_name_long'
           AND v_dpt_code = 'dpt_code'
            THEN
               header_is_valid := 1;

               DELETE FROM ykpn_imp_organisatie;
            ELSE
               IF rec.fac_imp_file_index = 1
               THEN
                  fac.imp_writelog (p_import_key,
                                    'E',
                                    'Geen geldige header aangetroffen',
                                    v_dpt_name || '-' || v_dpt_name_long || '-' || v_dpt_code);
               END IF;
            END IF;
         ELSE
            v_errormsg :=
               'Fout bij toevoegen te impoteren bedrijf/afdeling [' || v_aanduiding || ']';

            INSERT INTO ykpn_imp_organisatie (prs_bedrijf_naam,
                                              prs_afdeling_naam,
                                              prs_afdeling_naam_parent,
                                              prs_afdeling_omschrijving,
                                              prs_kostenplaats_nr,
                                              fac_imp_file_index)
                VALUES ('KPN',
                        v_dpt_id,
                        v_dpt_parent_dep_id,
                        v_dpt_name_long,
                        v_dpt_code,
                        rec.fac_imp_file_index);
         END IF;
      END;
   END LOOP;

   COMMIT;
EXCEPTION
   WHEN OTHERS
   THEN
      oracle_err_num := SQLCODE;
      oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
      v_errormsg := 'error ' || oracle_err_num || '/' || oracle_err_mes;
      fac.imp_writelog (p_import_key,
                        'E',
                        v_errormsg,
                        '');
END ykpn_import_organisatie;
/


CREATE OR REPLACE PROCEDURE ykpn_update_organisatie (p_import_key IN NUMBER)
AS
BEGIN
   NULL;
   -- update wordt door scheduled taak uitgevoerd.
END;
/

CREATE OR REPLACE PROCEDURE ykpn_import_organisatie_sched (p_import_key IN NUMBER)
AS
BEGIN
   NULL;
END;
/

CREATE OR REPLACE PROCEDURE ykpn_update_organisatie_sched (p_import_key IN NUMBER)
AS
   CURSOR c
   IS
      SELECT i.*, a.prs_afdeling_key
      FROM ykpn_imp_organisatie i, prs_afdeling a
      WHERE i.prs_afdeling_naam = a.prs_afdeling_naam(+)
      ORDER BY fac_imp_file_index;


   v_errormsg               VARCHAR (200);
   v_errorhint              VARCHAR (200);
   oracle_err_mes           VARCHAR2 (150);
   v_maxvariation           NUMBER;
   currentversion           fac_module.fac_module_version%TYPE;
   v_aanduiding             VARCHAR (100);
   v_prs_bedrijf_key        NUMBER;
   v_prs_afd_parent_key     NUMBER;
   v_prs_kostenplaats_key   NUMBER;
   v_prs_afdeling_key       NUMBER;
   v_prs_afd_niveau_parent  NUMBER;
   v_count                  NUMBER;
   v_newcount               NUMBER;
   v_oldcount               NUMBER;
   v_impcount               NUMBER;

BEGIN

   -- de topelementen mogen geen parent hebben.
   UPDATE ykpn_imp_organisatie
      SET prs_afdeling_naam_parent = NULL
    WHERE prs_afdeling_naam_parent = 62206;

   FOR rec IN c
   LOOP
      v_aanduiding   := rec.prs_afdeling_naam;
      v_errorhint    := 'Kijk of bedrijf al bestaat';

      -- Bestaat het bedrijf al?
      BEGIN
         SELECT prs_bedrijf_key
         INTO v_prs_bedrijf_key
         FROM prs_bedrijf
         WHERE UPPER (prs_bedrijf_naam) = UPPER (rec.prs_bedrijf_naam)
               AND prs_bedrijf_verwijder IS NULL;

         v_errorhint   := 'Kijk of kostenplaats al bestaat';
         IF rec.prs_kostenplaats_nr IS NOT NULL
         THEN
         BEGIN
            SELECT prs_kostenplaats_key
            INTO v_prs_kostenplaats_key
            FROM prs_kostenplaats
            WHERE prs_kostenplaats_verwijder IS NULL
                  AND prs_kostenplaats_nr = rec.prs_kostenplaats_nr;

            UPDATE prs_kostenplaats
            SET prs_kostenplaats_omschrijving   =
                   rec.prs_afdeling_omschrijving
            WHERE prs_kostenplaats_key = v_prs_kostenplaats_key;
         EXCEPTION
            WHEN NO_DATA_FOUND
            THEN
               v_errorhint   := 'Nieuwe kostenplaats toevoegen';

               INSERT INTO prs_kostenplaats
              (
                  prs_kostenplaats_nr,
                  prs_kostenplaats_omschrijving,
                  prs_kostenplaats_module
              )
               VALUES (
                         rec.prs_kostenplaats_nr,
                         rec.prs_afdeling_omschrijving,
                         'PRS'
                      )
               RETURNING prs_kostenplaats_key INTO v_prs_kostenplaats_key;
         END;
         ELSE
            v_prs_kostenplaats_key := NULL;
         END IF;

         v_errorhint   := 'Kijk of parent bestaat';

         IF rec.prs_afdeling_naam_parent IS NOT NULL
         THEN
            SELECT prs_afdeling_key
            INTO v_prs_afd_parent_key
            FROM prs_afdeling
            WHERE prs_afdeling_verwijder IS NULL
                  AND prs_afdeling_naam = rec.prs_afdeling_naam_parent;
         ELSE
            v_prs_afd_parent_key   := NULL;
         END IF;


         v_errorhint   := 'Zoek het niveau van de parent';
         IF v_prs_afd_parent_key IS NOT NULL
         THEN
            SELECT prs_kenmerklink_waarde
              INTO v_prs_afd_niveau_parent
              FROM prs_kenmerklink
             WHERE     prs_kenmerk_key = 2             -- afdelingsniveau
                   AND prs_link_key = v_prs_afd_parent_key;
         ELSE
            v_prs_afd_niveau_parent   := 0;
         END IF;
         v_prs_afd_niveau_parent := v_prs_afd_niveau_parent +1;

         IF rec.prs_afdeling_key IS NULL
         THEN
            -- toevoegen afdeling
            v_errorhint   := 'Toevoegen afdeling';

            INSERT INTO prs_afdeling
           (
               prs_bedrijf_key,
               prs_afdeling_parentkey,
               prs_afdeling_naam,
               prs_afdeling_omschrijving,
               prs_kostenplaats_key
           )
            VALUES (
                      v_prs_bedrijf_key,
                      NULL,
                      rec.prs_afdeling_naam,
                      rec.prs_afdeling_omschrijving,
                      v_prs_kostenplaats_key
                   )
            RETURNING prs_afdeling_key INTO v_prs_afdeling_key;
         ELSE
            -- aanpassen afdeling
            v_errorhint   := 'Aanpassen afdeling';

            UPDATE prs_afdeling
            SET prs_bedrijf_key             = v_prs_bedrijf_key,
                prs_afdeling_parentkey      = NULL,
                prs_afdeling_naam           = rec.prs_afdeling_naam,
                prs_afdeling_omschrijving   = rec.prs_afdeling_omschrijving,
                prs_kostenplaats_key        = v_prs_kostenplaats_key
            WHERE prs_afdeling_key = rec.prs_afdeling_key;
            v_prs_afdeling_key := rec.prs_afdeling_key;
         END IF;

         ykpn.set_kenmerk('PRS', 1, v_prs_afdeling_key, v_prs_afd_parent_key, 0);
         ykpn.set_kenmerk('PRS', 2, v_prs_afdeling_key, v_prs_afd_niveau_parent, 0);

      EXCEPTION
         WHEN OTHERS
         THEN
            oracle_err_mes   := SUBSTR (SQLERRM, 1, 100);
            v_errormsg       := 'error ' || SQLCODE || '/' || oracle_err_mes;
            fac.imp_writelog (p_import_key,
                              'E',
                              v_errormsg,
                              v_errorhint || '-' || v_aanduiding
            );
      END;
   END LOOP;

-- todo afdelingen verwijderen;

END ykpn_update_organisatie_sched;
/

CREATE OR REPLACE PROCEDURE ykpn_import_perslid (p_import_key IN NUMBER)
AS

   CURSOR c
   IS
        SELECT (SELECT prs_perslid_nr
                  FROM prs_perslid p
                 WHERE prs_perslid_verwijder IS NULL
                   AND p.prs_perslid_oslogin = UPPER (i.prs_perslid_oslogin))
                  prs_perslid_nr,
               prs_perslid_oslogin,
               COUNT ( * )
          FROM fac_imp_perslid i
      GROUP BY prs_perslid_oslogin
        HAVING COUNT (prs_perslid_oslogin) > 1;

    v_seq_of_columns VARCHAR(255);
BEGIN
    -- we plaaten de functie in kenmerkx
    -- de functie wordt tijdelijk gevuld met de key van het record. Puur om een waarde
    -- erin te hebben staan.
    UPDATE fac_imp_file SET fac_imp_file_line = REPLACE(fac_imp_file_line, 'NULL') WHERE fac_import_key = p_import_key;
    v_seq_of_columns := '14;14;0;0;0;0;8;6;5;24;4;17;16;20;0;11;0;9;0;2;1;3;0;0;0;0;1;0;23;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0';
    prs.import_perslid(p_import_key, v_seq_of_columns, 'emp_cbl_number;emp_number;emp_ruis_id;prs_name_initials;prs_name_prefix;prs_name_last;emp_sup_name;emp_dep_code;emp_email;emp_active;emp_phone;emp_mobile;emp_sms_authentication;emp_loc_code;emp_date_termination;prs_name_partner_prefix;prs_name_partner_last;prs_umra_name_prefix;prs_umra_name_last;prs_name_last_pref;emp_dep_name;emp_fnc_code;emp_fnc_name;prs_name_call%');

    -- Maak standaard verdieping aan voor de werkplek
    INSERT INTO alg_verdieping (alg_gebouw_key, alg_verdieping_code, alg_verdieping_volgnr, alg_verdieping_omschrijving)
    SELECT alg_gebouw_key, '_', 99, 'Dummy'
      FROM alg_gebouw g
     WHERE alg_gebouw_verwijder IS NULL
       AND NOT EXISTS (SELECT v.alg_gebouw_key
                         FROM alg_verdieping v
                        WHERE v.alg_gebouw_key = g.alg_gebouw_key
                          AND v.alg_verdieping_code = '_');

    -- Maak standaard ruimte aan voor de werkplek
    INSERT INTO alg_ruimte (alg_verdieping_key, alg_ruimte_nr, alg_srtruimte_key)
    SELECT v.alg_verdieping_key, '_', 1
      FROM alg_verdieping v
     WHERE alg_verdieping_verwijder IS NULL
       AND NOT EXISTS (SELECT r.alg_verdieping_key
                         FROM alg_ruimte r
                        WHERE r.alg_verdieping_key = v.alg_verdieping_key
                          AND r.alg_ruimte_nr = '_');

    UPDATE fac_imp_perslid SET alg_verdieping_volgnr = '99',
                                alg_ruimte_nr = '_'
     WHERE alg_locatie_code IS NOT NULL;

    UPDATE fac_imp_perslid i
       SET alg_locatie_code = ( SELECT alg_locatie_code
                                  FROM alg_v_aanweziglocatie l, alg_v_aanweziggebouw g
                                 WHERE l.alg_locatie_key = g.alg_locatie_key
                                   AND g.alg_gebouw_code = i.alg_gebouw_code);

    UPDATE fac_imp_perslid
       SET prs_perslid_nr = TO_CHAR (prs_perslid_nr, 'fm000000')
     WHERE fac.safe_to_number (prs_perslid_nr) IS NOT NULL;

    UPDATE fac_imp_perslid
       SET prs_srtperslid_omschrijving = COALESCE(prs_kenmerk3, 'Extern');

    -- Verwijder dubbele records (personen met één login en meerdere personeelsnummers
    -- Anders krijgen we allemaal onnodige logging
    FOR rec IN c
    LOOP
       DELETE fac_imp_perslid
        WHERE prs_perslid_oslogin = rec.prs_perslid_oslogin AND prs_perslid_nr <> rec.prs_perslid_nr;
    END LOOP;

    -- Mensen zonder werkplek zetten we onder een standaard locatie zodat hierop gezocht kan worden.
    UPDATE fac_imp_perslid
       SET alg_locatie_code = '00000',
           alg_gebouw_code = '00000',
           alg_verdieping_volgnr = '99',
           alg_ruimte_nr = '_'
     WHERE alg_locatie_code IS NULL;

    -- De afdelingscode uit het persoonsbestand komt overeen met de kostenplaats. Dus zoeken we a.d.h.v.
    -- de kostenplaats de juiste afdelingscode op.
    UPDATE fac_imp_perslid i
       SET prs_kenmerk2 = prs_afdeling_naam,
           prs_afdeling_naam =
              (SELECT a.prs_afdeling_naam
                 FROM prs_afdeling a, prs_kostenplaats k
                WHERE a.prs_kostenplaats_key = k.prs_kostenplaats_key
                  AND k.prs_kostenplaats_nr = i.prs_afdeling_naam);

    -- KPN gebruikt een andere codering voor het gebruik van de partnernaam daarom gaan we deze even omzetten
    -- KPN code 1	eigennaam wordt 0
    -- KPN code 2	partnernaam wordt	2
    -- KPN code 3	partner - eigen naam wordt	1
    -- KPN code 4	eigen - partner naam wordt	3
    UPDATE fac_imp_perslid i
       SET prs_perslid_naamgebruik_code = DECODE(prs_perslid_naamgebruik_code,1,0,2,2,3,1,4,3,0);

    --
    -- KPN retail (winkels) aanpassingen
    --

    -- Pas de werkplek van de winkel accounts aan naar de locatie waar de winkel staat.
    -- Voor PMF accounts en KPN accounts geldt dat de code op positie 4 t/m 6 in de login voor winkelaccounts overeenkomt met de locatiecode
    UPDATE fac_imp_perslid
       SET alg_locatie_code = SUBSTR(prs_perslid_oslogin, 4,3),
           alg_gebouw_code = '_',
           alg_verdieping_volgnr = '99',
           alg_ruimte_nr = '_'
     WHERE UPPER(prs_perslid_oslogin) LIKE 'PMF%' OR UPPER(prs_perslid_oslogin) LIKE 'KPN%';

    -- Voor andere locaies is bij de locatie een kenmerk 'Ruisnaamprefix' (key 1260) aangemaakt. Deze string bevat de prefix van de ruisnamen
    -- die aan deze locatie gekoppeld moeten worden.
    UPDATE fac_imp_perslid i
       SET alg_locatie_code = (SELECT l.alg_locatie_code
                                 FROM alg_locatie l, alg_onrgoedkenmerk aogk
                                WHERE aogk.alg_kenmerk_key = 1260
                                  AND aogk.alg_onrgoed_key = l.alg_locatie_key
                                  AND UPPER(i.prs_perslid_oslogin) LIKE UPPER(aogk.alg_onrgoedkenmerk_waarde) || '%'),
           alg_gebouw_code = '_',
           alg_verdieping_volgnr = '99',
           alg_ruimte_nr = '_'
     WHERE EXISTS ( SELECT ok.alg_onrgoedkenmerk_key
                      FROM alg_onrgoedkenmerk ok
                     WHERE ok.alg_kenmerk_key = 1260
                       AND UPPER(i.prs_perslid_oslogin) LIKE UPPER(ok.alg_onrgoedkenmerk_waarde) || '%');


    -- Zet voor de winkels de voornaam gelijk aan de ruisnaam en de achternaam op de omschrijving van de locatie
    UPDATE fac_imp_perslid i
       SET prs_perslid_naam = COALESCE( (SELECT l.alg_locatie_omschrijving
                                          FROM alg_locatie l
                                         WHERE i.alg_locatie_code = l.alg_locatie_code
                                           AND l.alg_locatie_verwijder IS NULL), prs_perslid_naam),
           prs_perslid_voornaam = LOWER(prs_perslid_oslogin)
     WHERE EXISTS ( SELECT l.alg_locatie_code
                      FROM alg_v_locatie_gegevens l
                     WHERE i.alg_locatie_code = l.alg_locatie_code
                       AND l.alg_regio_upper = 'RETAIL');

    -- Voeg voor alle retaillocaties een afleveradres toe.
    INSERT INTO mld_adres (mld_adres_naam, alg_locatie_key, mld_adres_afleveradres)
        SELECT alg_locatie_omschrijving, alg_locatie_key, 1
          FROM alg_v_locatie_gegevens lg
         WHERE     alg_regio_key = 21
               AND NOT EXISTS
                       (SELECT mld_adres_key
                          FROM mld_adres m
                         WHERE m.alg_locatie_key = lg.alg_locatie_key);

    UPDATE mld_adres m
       SET (mld_adres_naam, mld_adres_bezoek_adres, mld_adres_bezoek_postcode, mld_adres_bezoek_plaats) =
               (SELECT alg_locatie_omschrijving, alg_locatie_adres, alg_locatie_postcode, alg_locatie_plaats
                  FROM alg_locatie l
                 WHERE l.alg_locatie_key = m.alg_locatie_key)
     WHERE m.mld_adres_afleveradres = 1 AND m.alg_locatie_key IS NOT NULL;


END ykpn_import_perslid;
/

CREATE OR REPLACE PROCEDURE ykpn_update_perslid (p_import_key IN NUMBER)
AS
    v_seq_of_columns VARCHAR(255);
BEGIN
   NULL;
   -- de daadwerkelijke update wordt door een scheduled task (ykpn_update_perslid_sched) in de nacht uitgevoerd.
END ykpn_update_perslid;
/

CREATE OR REPLACE PROCEDURE ykpn_import_perslid_sched (p_import_key IN NUMBER)
AS
BEGIN
   NULL;
END;
/

CREATE OR REPLACE PROCEDURE ykpn_update_perslid_sched (p_import_key IN NUMBER)
AS
   CURSOR c_del IS
      SELECT p.prs_perslid_key, p.prs_perslid_nr, pf.prs_perslid_naam_full, p.prs_perslid_oslogin
        FROM fac_imp_perslid i, prs_perslid p, prs_v_perslid_fullnames_all pf
       WHERE p.prs_perslid_nr = i.prs_perslid_nr(+)
         AND pf.prs_perslid_key = p.prs_perslid_key
         AND p.prs_perslid_nr IS NOT NULL
         AND i.prs_perslid_nr IS NULL
         AND p.prs_perslid_verwijder IS NULL;

   v_perslid_nr     PRS_PERSLID.PRS_PERSLID_NR%TYPE;
   v_errormsg       VARCHAR2 (1000);
   v_hint           VARCHAR2 (1000);
   oracle_err_num   NUMBER;
   oracle_err_mes   VARCHAR2 (200);
   v_count          NUMBER;

BEGIN

    -- Controleer of er wel genoeg mensen in de database staan
    -- Veilige check is 10000 medewerkers
    SELECT COUNT(*)
      INTO v_count
      FROM fac_imp_perslid;

    IF v_count > 10000
    THEN
       -- Voordat we gaan importeren gaan we op zoek of we nog mensen moeten verwijderen die niet in de import voorkomen.
       -- Nu komt het ook regelmatig voor dat mensen een ander personeelsnummer krijgen terwijl ze de login behouden. Deze
       -- mensen proberen we om te hangen en het personeelsnummer aan te passen.

       FOR rec IN c_del LOOP
          BEGIN
             v_hint := 'Zoek naar bestaande logincode: ' || rec.prs_perslid_nr || '-' || rec.prs_perslid_oslogin;
             SELECT MIN(prs_perslid_nr)
               INTO v_perslid_nr
               FROM fac_imp_perslid i
              WHERE UPPER(i.prs_perslid_oslogin) = rec.prs_perslid_oslogin
                AND NOT EXISTS (SELECT prs_perslid_key FROM prs_perslid p WHERE p.prs_perslid_nr = i.prs_perslid_nr);

             IF v_perslid_nr IS NOT NULL
             THEN
                v_hint := 'Pas login van te verwijderen persoon aan: ' || rec.prs_perslid_nr || '->' || v_perslid_nr || '-' || rec.prs_perslid_oslogin;
                fac.imp_writelog (p_import_key, 'I', 'Te verwijderen persoon op login gevonden: ' || rec.prs_perslid_nr || '->' || v_perslid_nr || '-' || rec.prs_perslid_oslogin, '');
                UPDATE prs_perslid p SET prs_perslid_nr = v_perslid_nr WHERE p.prs_perslid_key = rec.prs_perslid_key;
             ELSE
                prs.delete_perslid (p_import_key, rec.prs_perslid_key);
             END IF;
          EXCEPTION WHEN OTHERS
          THEN
             oracle_err_num := SQLCODE;
             oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
             v_errormsg := 'error ' || oracle_err_num || '/' || oracle_err_mes;
             fac.imp_writelog (p_import_key, 'E', v_errormsg, v_hint);
          END;
       END LOOP;

       prs.update_perslid (p_import_key, 'NR', 'A');

       -- Iedereen mag op elke kostenplaats boeken.
       INSERT INTO prs_perslidkostenplaats (prs_perslid_key, prs_perslidkostenplaats_boeken)
       SELECT prs_perslid_key, 1
         FROM prs_perslid p
        WHERE prs_perslid_verwijder IS NULL
          AND NOT EXISTS (SELECT prs_perslidkostenplaats_key
                            FROM prs_perslidkostenplaats pk
                           WHERE pk.prs_perslid_key = p.prs_perslid_key);

       -- Vul het mobiele nummer in als mensen een telefoonnummer hebben dat begint met +316
       UPDATE prs_perslid
          SET prs_perslid_mobiel = prs_perslid_telefoonnr
        WHERE prs_perslid_telefoonnr LIKE '+316%';

    ELSE
       fac.imp_writelog (p_import_key, 'E', 'Te weinig personen in de database om te verwijderen: ' || v_count, '');
    END IF;

    --
    -- KPN Retail (winkels) aanpassingen
    --

    -- Verwijdere KPN Retail winkels uit de _Default groep
    DELETE fac_gebruikersgroep
     WHERE     prs_perslid_key IN (SELECT prs_perslid_key
                                     FROM prs_v_perslidwerkplek_gegevens wpg, alg_locatie l, alg_district d
                                    WHERE     wpg.alg_locatie_key = l.alg_locatie_key
                                      AND l.alg_district_key = d.alg_district_key
                                      AND d.alg_regio_key = 21  -- KPN Retail
                                      AND wpg.prs_werkplek_virtueel = 0)
           AND fac_groep_key = 1;

    -- Verwijder de externe retail gebruikers uit de _Default groep
    DELETE fac_gebruikersgroep
     WHERE     prs_perslid_key IN
                   (SELECT prs_perslid_key
                      FROM prs_perslid
                     WHERE REGEXP_SUBSTR (
                               prs_perslid_oslogin,
                               '[[:alpha:]]{2}[[:digit:]]{3}V[[:digit:]]{2}')
                               IS NOT NULL)
           AND fac_groep_key = 1;


    -- Voeg KPN retail medewerkers toe aan de autorisatiegroep: KPN Retail Winkel (Key = 301)
    INSERT INTO fac_gebruikersgroep (prs_perslid_key, fac_groep_key)
         SELECT prs_perslid_key, 301
           FROM prs_perslid p
          WHERE     p.prs_perslid_key IN (SELECT prs_perslid_key
                                            FROM prs_v_perslidwerkplek_gegevens wpg, alg_locatie l, alg_district d
                                           WHERE     wpg.alg_locatie_key = l.alg_locatie_key
                                                 AND l.alg_district_key = d.alg_district_key
                                                 AND d.alg_regio_key = 21  -- KPN Retail
                                                 AND wpg.prs_werkplek_virtueel = 0)
                AND NOT EXISTS
                        (SELECT fac_gebruikersgroep_key
                           FROM fac_gebruikersgroep gg
                          WHERE     gg.prs_perslid_key = p.prs_perslid_key
                                AND fac_groep_key = 301);

    -- Maak voor iedere winkel een autorisatiegroep aan zodat alle accounts per winkel vervangers van elkaar zijn.
    INSERT INTO fac_groep (fac_groep_omschrijving,
                           fac_groep_collega,
                           fac_groep_opmerking)
        SELECT DISTINCT
               '_Retail_' || alg_locatie_code,
               1,
                  'Retail vervangers voor de winkel '
               || alg_locatie_code
          FROM alg_locatie l, alg_district d
         WHERE l.alg_district_key = d.alg_district_key
               AND d.alg_regio_key = 21  -- KPN Retail
               AND NOT EXISTS
                       (SELECT fac_groep_key
                          FROM fac_groep
                         WHERE fac_groep_omschrijving =
                               '_Retail_' || alg_locatie_code);

    -- Koppel vervolgens de medewerkers aan deze vervangers groep
    INSERT INTO fac_gebruikersgroep (prs_perslid_key, fac_groep_key)
        SELECT wpg.prs_perslid_key,
               (SELECT fac_groep_key
                  FROM fac_groep g
                 WHERE fac_groep_omschrijving =
                       '_Retail_' || l.alg_locatie_code)
          FROM prs_v_perslidwerkplek_gegevens wpg, alg_locatie l, alg_district d
         WHERE     wpg.alg_locatie_key = l.alg_locatie_key
               AND l.alg_district_key = d.alg_district_key
               AND d.alg_regio_key = 21  -- KPN Retail
               AND wpg.prs_werkplek_virtueel = 0
               AND wpg.prs_perslid_key IS NOT NULL
               AND NOT EXISTS
                       (SELECT fac_gebruikersgroep_key
                          FROM fac_gebruikersgroep gg, fac_groep g
                         WHERE     g.fac_groep_key = gg.fac_groep_key
                               AND gg.prs_perslid_key = wpg.prs_perslid_key
                               AND fac_groep_omschrijving =
                                      '_Retail_'
                                   || l.alg_locatie_code);

    -- De gebruikers uit de winkels willen graag MLDUPD notificaties ontvangen via de mail
    -- De KPN Res (_default) gebruikers willen dat niet.
    -- MLDUPD is dus te overrullen en hier wordt de juiste instelling bij de personen gemaakt.
    UPDATE prs_perslid p
       SET prs_perslid_srtnoti_mode = 1                          -- noti in portal
     WHERE EXISTS
               (SELECT prs_perslid_key
                  FROM fac_gebruikersgroep gg
                 WHERE     fac_groep_key = 1                            -- default
                       AND gg.prs_perslid_key = p.prs_perslid_key);

    UPDATE prs_perslid p
       SET prs_perslid_srtnoti_mode = 3                          -- noti in portal + mail
     WHERE EXISTS
               (SELECT prs_perslid_key
                  FROM fac_gebruikersgroep gg
                 WHERE     fac_groep_key = 301                        -- KPN Retail winkel
                       AND gg.prs_perslid_key = p.prs_perslid_key);

    -- Voeg KPN retail backoffice medewerkers toe aan de autorisatiegroep: KPN Retail Winkel Backoffice (Key = 1461)
    -- Dit zijn medewerkers die op de backoffice PC achterin de winkel inloggen.
    INSERT INTO fac_gebruikersgroep (prs_perslid_key, fac_groep_key)
         SELECT prs_perslid_key, 1461
           FROM prs_perslid p
          WHERE
                -- De lengte van de digits in de loginnaam = 3
                LENGTH(REGEXP_SUBSTR (prs_perslid_oslogin, '[[:digit:]]{3}.*')) = 3
                -- En de prefix van de loginnaam is KPN of PMF, in dat geval zijn de drie digits account de bo medewerker
                -- Of de login eindigt op '600', dit wordt soms voor de XL winkels gebruikt.
                AND (SUBSTR(prs_perslid_oslogin,1,3) IN ('KPN', 'PMF')
                     OR REGEXP_SUBSTR (prs_perslid_oslogin, '[[:digit:]]{3}.*') = '600')
                -- We hebben een werkplek onder een Retail regio.
                AND p.prs_perslid_key IN (SELECT prs_perslid_key
                                            FROM prs_v_perslidwerkplek_gegevens wpg, alg_locatie l, alg_district d
                                           WHERE     wpg.alg_locatie_key = l.alg_locatie_key
                                                 AND l.alg_district_key = d.alg_district_key
                                                 AND d.alg_regio_key = 21  -- KPN Retail
                                                 AND wpg.prs_werkplek_virtueel = 0)
                AND NOT EXISTS
                        (SELECT fac_gebruikersgroep_key
                           FROM fac_gebruikersgroep gg
                          WHERE     gg.prs_perslid_key = p.prs_perslid_key
                                AND fac_groep_key = 1461);


END ykpn_update_perslid_sched;
/


CREATE OR REPLACE PROCEDURE ykpn_import_onrgoed2 (p_import_key IN NUMBER)
AS
   CURSOR c
   IS
        SELECT *
          FROM fac_imp_file
      ORDER BY fac_imp_file_index;



   header_found               BOOLEAN;
   v_newline                  VARCHAR2 (2000);
   v_aanduiding               VARCHAR2 (1000);                                        -- Import line
   v_field                    VARCHAR2 (1000);                                       -- Import field
   v_fielddelimitor           VARCHAR2 (1);                                       -- Field seperator
   v_errormsg                 VARCHAR (200);
   v_errorhint                VARCHAR (200);
   oracle_err_num             NUMBER;
   oracle_err_mes             VARCHAR2 (200);
   v_skipfield                VARCHAR2 (100);


   v_gebouw_code              alg_gebouw.alg_gebouw_code%TYPE;
   v_locatie_code             alg_locatie.alg_locatie_code%TYPE;
   v_verdieping_volgnr        alg_verdieping.alg_verdieping_volgnr%TYPE;
   v_ruimte_nr                alg_ruimte.alg_ruimte_nr%TYPE;
   v_srtruimte_omschrijving   alg_srtruimte.alg_srtruimte_omschrijving%TYPE;
   v_ruimte_toepassing        VARCHAR2 (100);
   v_ruimte_tarief            VARCHAR2 (100);
   v_ruimte_gebruik           VARCHAR2 (100);
   v_wo_txt                   VARCHAR2 (100);
   v_wo                       NUMBER (10, 2);
   v_factor_txt               VARCHAR2 (100);
   v_factor                   NUMBER (10, 2);
   v_vvo_txt                  VARCHAR2 (100);
   v_vvo                      NUMBER (10, 2);
   v_totaal_vvo               NUMBER (10, 2);

   -- topassing key 1023
   -- vvo key 1024
   -- factor key  1025
   -- tarief key 1026

   PROCEDURE imp_strip_cr (p_import_key IN NUMBER)
   AS
      CURSOR c_cr
      IS
         SELECT INSTR (fac_imp_file_line, CHR (10)), i.*
           FROM fac_imp_file i
          WHERE fac_import_key = p_import_key
            AND INSTR (fac_imp_file_line, CHR (10)) <> 0
            AND fac_imp_file_line LIKE '"Eta%';

      CURSOR c_upd
      IS
         SELECT fac_rapport_regel
           FROM fac_rapport
          WHERE fac_rapport_node LIKE 'IMPVG%';

      v_newline     VARCHAR2 (3000);
      v_field       VARCHAR2 (1000);
      v_field2      VARCHAR2 (1000);
      v_volgnr      NUMBER;
      v_count       NUMBER;
      v_delimitor   VARCHAR2 (1);
   BEGIN
      DELETE fac_rapport
       WHERE fac_rapport_node LIKE 'IMPVG%';

      FOR rec IN c_cr
      LOOP
         v_newline := rec.fac_imp_file_line;

         WHILE v_newline IS NOT NULL
         LOOP
            fac.imp_getfield (v_newline, ',', v_field);

            IF v_field IS NULL
            THEN
               -- comma toevoegen aan fac_rapport
               UPDATE fac_rapport
                  SET fac_rapport_regel = fac_rapport_regel || ',';
            ELSE
               IF INSTR (v_field, CHR (10)) <> 0
               THEN
                  v_delimitor := CHR (10);
               ELSE
                  v_delimitor := ' ';
               END IF;

               v_volgnr := 1;

               WHILE v_field IS NOT NULL
               LOOP
                  fac.imp_getfield (v_field, v_delimitor, v_field2);

                  SELECT COUNT ( * )
                    INTO v_count
                    FROM fac_rapport
                   WHERE fac_rapport_node = 'IMPVG-' || v_volgnr
                     AND fac_rapport_volgnr = rec.fac_imp_file_index;

                  IF v_count = 0
                  THEN
                     INSERT INTO fac_rapport (fac_rapport_node,
                                              fac_rapport_regel,
                                              fac_rapport_volgnr)
                         VALUES ('IMPVG-' || v_volgnr,
                                 '"' || v_field2 || '"',
                                 rec.fac_imp_file_index);
                  ELSE
                     UPDATE fac_rapport
                        SET fac_rapport_regel = fac_rapport_regel || ',"' || v_field2 || '"'
                      WHERE fac_rapport_node = 'IMPVG-' || v_volgnr
                        AND fac_rapport_volgnr = rec.fac_imp_file_index;
                  END IF;

                  v_volgnr := v_volgnr + 1;
               END LOOP;
            END IF;
         END LOOP;
      END LOOP;

      SELECT MAX (fac_imp_file_index)
        INTO v_volgnr
        FROM fac_imp_file
       WHERE fac_import_key = p_import_key;

      FOR rec IN c_upd
      LOOP
         v_volgnr := v_volgnr + 1;

         INSERT INTO fac_imp_file (fac_imp_file_line, fac_import_key, fac_imp_file_index)
             VALUES (rec.fac_rapport_regel, p_import_key, v_volgnr);
      END LOOP;


      DELETE fac_imp_file
       WHERE fac_imp_file_index IN (SELECT fac_rapport_volgnr
                                      FROM fac_rapport
                                     WHERE fac_rapport_node LIKE 'IMPVG%');
   END;

   PROCEDURE imp_get_filled_field (p_parseline        IN OUT VARCHAR2,
                                   p_fielddelimitor   IN     VARCHAR2,
                                   p_field               OUT VARCHAR2)
   AS
      v_count   NUMBER (10);
   BEGIN
      v_count := 0;

      p_field := NULL;

      WHILE p_field IS NULL AND v_count < 20
      LOOP
         fac.imp_getfield (p_parseline, p_fielddelimitor, p_field);
         v_count := v_count + 1;
      END LOOP;
   END;

   FUNCTION my_to_number (p_str IN VARCHAR2)
      RETURN NUMBER
   AS
   BEGIN
      RETURN TO_NUMBER (REPLACE (REPLACE (p_str, '.'), ',', '.'));
   END;
BEGIN
   header_found := FALSE;
   v_fielddelimitor := ',';
   v_errorhint := 'Strip de CR in de regels: ';
   imp_strip_cr (p_import_key);


   -- bepaal de gebouw code
   v_errorhint := 'Bepaal het gebouw: ';

   SELECT SUBSTR (fac_import_filenaam, 1, 5)
     INTO v_gebouw_code
     FROM fac_import
    WHERE fac_import_key = p_import_key;

   v_errorhint := 'Bepaal de locatie: ';

   SELECT alg_locatie_code
     INTO v_locatie_code
     FROM alg_locatie l, alg_gebouw g
    WHERE g.alg_locatie_key = l.alg_locatie_key AND g.alg_gebouw_code = v_gebouw_code;

   DELETE FROM fac_imp_onrgoed2;                        --  WHERE alg_gebouw_code = 'v_gebouw_code';

   FOR rec IN c
   LOOP
      BEGIN
         v_newline := rec.fac_imp_file_line;
         v_aanduiding := SUBSTR (v_newline, 1, 200);
         v_errorhint := 'Inlezen regel: ';

         IF SUBSTR (v_newline, 1, 3) = '?'
         THEN
            -- EF BB BF aangetroffen
            fac.imp_writelog (p_import_key,
                              'W',
                              'Byte Order Mark aangetroffen',
                              'Bestand heeft onbehandeld UTF-8 formaat.');
            v_newline := SUBSTR (v_newline, 4);
         END IF;

         v_errorhint := 'Inlezen Etage: ';
         imp_get_filled_field (v_newline, v_fielddelimitor, v_field);

         IF SUBSTR (v_field, 1, 7) = 'Etage: '
         THEN
            v_verdieping_volgnr :=
               fac.safe_to_number(REPLACE (
                                     REPLACE (REPLACE (SUBSTR (v_field, 8, 2), 'K', '9'), 'E', '8'),
                                     'A',
                                     '7'));

            v_errorhint := 'Inlezen ruimtenummer: ';
            imp_get_filled_field (v_newline, v_fielddelimitor, v_field);

            IF LENGTH (v_field) > 10
            THEN
               fac.imp_writelog (p_import_key,
                                 'W',
                                 'Veld is te lang',
                                 v_gebouw_code || '-' || v_errorhint || v_aanduiding);
            END IF;

            v_ruimte_nr := SUBSTR (v_field, 1, 10);


            -- Op zoek naar het ruimtesoort
            v_errorhint := 'Inlezen ruimtesoort: ';
            imp_get_filled_field (v_newline, v_fielddelimitor, v_field);

            IF v_field LIKE '%-->%'
            THEN
               fac.imp_writelog (p_import_key,
                                 'W',
                                 'Lege ruimtesoort',
                                 v_gebouw_code || '-' || v_errorhint || v_aanduiding);
               v_srtruimte_omschrijving := 'ONBEKEND!!!!';
            ELSE
               v_srtruimte_omschrijving := v_field;
            END IF;

            IF v_field LIKE '%-->%'
            THEN
               v_ruimte_toepassing := 'onbekend';
            ELSE
            -- Op zoek naar het ruimtetoepassing
            v_errorhint := 'Inlezen toepassing: ';
            imp_get_filled_field (v_newline, v_fielddelimitor, v_field);
            IF v_field LIKE '%-->%'
            THEN
               v_ruimte_toepassing := 'onbekend';
            ELSE
               v_ruimte_toepassing := REPLACE (v_field, ' ');
            END IF;
            END IF;

            -- Nu op zoek naar het volgende veld
            -- Dit is het tarief of het gebruik. Gebruik bevat altijd '-->'
            IF v_field NOT LIKE '%-->%'
            THEN
               imp_get_filled_field (v_newline, v_fielddelimitor, v_field);
            END IF;
            IF v_field LIKE '%-->%'
            THEN
               v_errorhint := 'Inlezen ruimtegebruik: ';
               v_ruimte_gebruik := SUBSTR (v_field, INSTR (v_field, '--> ') + 4, 100);
               v_ruimte_tarief := NULL;
            ELSE
               v_errorhint := 'Inlezen tarief: ';
               v_ruimte_tarief := v_field;
               v_errorhint := 'Inlezen ruimtegebruik2: ';
               imp_get_filled_field (v_newline, v_fielddelimitor, v_field);
               v_ruimte_gebruik := SUBSTR (v_field, INSTR (v_field, '--> ') + 4, 100);
            END IF;

            imp_get_filled_field (v_newline, v_fielddelimitor, v_field);

            v_errorhint := 'Inlezen wo: ';
            --v_wo_txt := REPLACE (SUBSTR (v_field, 1, INSTR (v_field, 'm') - 1), ',', '.');
            v_wo := my_to_number (SUBSTR (v_field, 1, INSTR (v_field, 'm') - 1));

            imp_get_filled_field (v_newline, v_fielddelimitor, v_field);

            IF v_field LIKE '%m%'
            THEN
               v_errorhint := 'Inlezen vvo: ';
               --v_vvo_txt := REPLACE (SUBSTR (v_field, 1, INSTR (v_field, 'm') - 1), ',', '.');
               --v_errorhint := 'Inlezen vvo [' || v_vvo_txt || ']: ';
               v_vvo := my_to_number (SUBSTR (v_field, 1, INSTR (v_field, 'm') - 1));
            ELSE
               v_errorhint := 'Inlezen factor: ';
               v_factor_txt := REPLACE (v_field, ',', '.');
               imp_get_filled_field (v_newline, v_fielddelimitor, v_field);
               v_errorhint := 'Inlezen vvo2: ';
               --v_vvo_txt := my_to_number (SUBSTR (v_field, 1, INSTR (v_field, 'm') - 1));
               v_vvo := my_to_number (SUBSTR (v_field, 1, INSTR (v_field, 'm') - 1));
            END IF;

            INSERT INTO fac_imp_onrgoed2 (alg_locatie_code,
                                          alg_gebouw_code,
                                          alg_verdieping_volgnr,
                                          alg_srtruimte_omschrijving,
                                          alg_ruimte_nr,
                                          alg_ruimte_omschrijving,
                                          alg_ruimte_bruto_vloeropp,
                                          prs_afdeling_naam,
                                          prs_ruimteafdeling_bezetting,
                                          alg_kenmerkwaarde1,
                                          alg_kenmerkwaarde2,
                                          alg_kenmerkwaarde3,
                                          alg_kenmerkwaarde4,
                                          alg_kenmerkwaarde5)
                VALUES (v_locatie_code,
                        v_gebouw_code,
                        v_verdieping_volgnr,
                        v_srtruimte_omschrijving,
                        v_ruimte_nr,
                        LOWER (REPLACE (v_ruimte_toepassing, '_', ' ')),
                        v_wo,
                        NULL,                                                   --prs_afdeling_naam,
                        NULL,          --                              prs_ruimteafdeling_bezetting,
                        '1043=' || v_ruimte_toepassing, --                              alg_kenmerkwaarde1,
                        '1044=' || v_vvo,        --                              alg_kenmerkwaarde2,
                        '1045=' || v_factor_txt,     --                              alg_kenmerkwaarde3,
                        '1046=' || v_ruimte_tarief, --                              alg_kenmerkwaarde4,
                        '1047=' || v_ruimte_gebruik --                              alg_kenmerkwaarde5
                                                   );
         END IF;
      EXCEPTION
         WHEN OTHERS
         THEN
            oracle_err_num := SQLCODE;
            oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
            v_errormsg := 'OTHERS (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
            fac.imp_writelog (p_import_key,
                              'E',
                              SUBSTR (v_errormsg, 1, 1000),
                              v_gebouw_code || '-' || v_errorhint || v_aanduiding);
      END;
   END LOOP;

   SELECT SUM (fac.safe_to_number (REPLACE (alg_kenmerkwaarde2, '1024=', '')))
     INTO v_totaal_vvo
     FROM fac_imp_onrgoed2;

   fac.imp_writelog (p_import_key,
                     'I',
                     'Totaal VVO: ' || v_totaal_vvo,
                     v_gebouw_code);
EXCEPTION
   WHEN OTHERS
   THEN
      oracle_err_num := SQLCODE;
      oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
      v_errormsg := 'OTHERS (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
      fac.imp_writelog (p_import_key,
                        'E',
                        SUBSTR (v_errormsg, 1, 1000),
                        v_gebouw_code || '-' || v_errorhint || v_aanduiding);
END;
/


CREATE OR REPLACE PROCEDURE ykpn_update_onrgoed2 (p_import_key IN NUMBER)
AS
BEGIN
   fac_update_onrgoed2 (p_import_key);
END;
/


CREATE OR REPLACE PROCEDURE ykpn_export_bezoekers_com (
   p_applname   IN   VARCHAR2,
   p_applrun    IN   VARCHAR2,
   p_filedir    IN   VARCHAR2,
   p_filename   IN   VARCHAR2)
AS
   CURSOR c
   IS
   SELECT DECODE (pp.res_rsv_deel_key,
                     NULL, 'De afspraak is geregistreerd',
                     'De parkeerplaats is geregistreerd')
                text,
             'CUST02' code,
             (SELECT fac_srtnotificatie_key
                FROM fac_srtnotificatie
               WHERE fac_srtnotificatie_code = 'CUST02')
                fac_srtnotificatie_key,
             b.bez_afspraak_key,
             b.bez_bezoekers_key,
             a.bez_afspraak_datum,
             pp.res_deel_key,
             kwe.bez_kenmerkwaarde_waarde xemail,
             COALESCE (d.alg_gebouw_key,
                       (SELECT alg_onrgoed_key
                          FROM alg_onrgoedkenmerk aogk
                         WHERE aogk.alg_onrgoedkenmerk_key = g.alg_onrgoedkenmerk_key))
                alg_gebouw_key,
             COALESCE (
                (SELECT alg_onrgoedkenmerk_waarde
                   FROM alg_onrgoedkenmerk aogk
                  WHERE aogk.alg_onrgoed_key = d.alg_gebouw_key AND alg_kenmerk_key = 1040),
                (SELECT alg_onrgoedkenmerk_waarde
                   FROM alg_onrgoedkenmerk aogk
                  WHERE aogk.alg_onrgoedkenmerk_key = g.alg_onrgoedkenmerk_key))
                bijlage
        FROM bez_afspraak a,
             bez_bezoekers b,
             bez_kenmerkwaarde kwe,
             bez_kenmerkwaarde kwp,
             res_rsv_deel pp,
             res_v_ins_deel d,
             (  SELECT g.alg_locatie_key, MAX (alg_onrgoedkenmerk_key) alg_onrgoedkenmerk_key
                  FROM alg_gebouw g, alg_onrgoedkenmerk aogk
                 WHERE alg_kenmerk_key = 1040
                   AND aogk.alg_onrgoed_key = g.alg_gebouw_key
                   AND aogk.alg_onrgoedkenmerk_verwijder IS NULL
              GROUP BY alg_locatie_key) g
       WHERE COALESCE (
                (SELECT bez_kenmerkwaarde_waarde
                   FROM bez_kenmerkwaarde kwlog
                  WHERE bez_kenmerk_key = 1042 AND kwlog.bez_bezoekers_key = b.bez_bezoekers_key),
                'QueQueleQue') <>
                   TO_CHAR (bez_afspraak_datum, 'yyyy-mm-dd hh24:mi:ss')
                || ';'
                || COALESCE (pp.res_deel_key, -1)
                || ';'
                || kwe.bez_kenmerkwaarde_waarde
         AND b.bez_afspraak_key = a.bez_afspraak_key
         AND b.bez_bezoekers_key = pp.bez_bezoekers_key(+)
         AND pp.res_deel_key = d.res_deel_key(+)
         AND b.bez_bezoekers_key = kwe.bez_bezoekers_key
         AND kwe.bez_kenmerk_key = 1000      -- email adres
         AND b.bez_bezoekers_key = kwp.bez_bezoekers_key
         AND kwp.bez_kenmerk_key = 1020      -- pincode
         AND pp.res_deel_key IS NOT NULL    -- voorlopig alleen parkeerplaatsen.
         AND a.alg_locatie_key = g.alg_locatie_key
         AND a.bez_afspraak_datum > SYSDATE + 2 / 24;

   CURSOR cs
   IS
      SELECT a.bez_afspraak_key,
             b.bez_bezoekers_key,
             kwm.bez_kenmerkwaarde_waarde mobiel,
             sn.fac_srtnotificatie_code,
             sn.fac_srtnotificatie_key,
             'De code voor uw parkeerplaats op ' || TO_CHAR (a.bez_afspraak_datum, 'dd-mm-yyyy hh24:mi') || '-' || TO_CHAR(a.bez_afspraak_eind, 'hh24:mi') || ' is ' ||
                kwp.bez_kenmerkwaarde_waarde || '#, ' || COALESCE(afw.afw_adres, g.alg_gebouw_naam) || '. Bij KPN geldt legitimatieplicht.' text
        FROM bez_afspraak a,
             bez_bezoekers b,
             bez_kenmerkwaarde kwm,                                                         -- mobiel 1001
             bez_kenmerkwaarde kwp,                                                         -- pincode 1020
             fac_srtnotificatie sn,
             res_rsv_deel rd,
             res_v_ins_deel d,
             alg_gebouw g,
             (SELECT alg_onrgoedkenmerk_waarde afw_adres, alg_onrgoed_key alg_gebouw_key
                FROM alg_onrgoedkenmerk afw
               WHERE alg_kenmerk_key = 1180) afw                                   -- afwijkend parkeeradres
       WHERE sn.fac_srtnotificatie_code = 'CUST03'
         AND b.bez_afspraak_key = a.bez_afspraak_key
         AND kwm.bez_bezoekers_key = b.bez_bezoekers_key
         AND kwm.bez_kenmerk_key = 1001
         AND kwp.bez_bezoekers_key = b.bez_bezoekers_key
         AND kwp.bez_kenmerk_key = 1020
         AND b.bez_bezoekers_key = rd.bez_bezoekers_key
         AND rd.res_deel_key = d.res_deel_key
         AND d.alg_gebouw_key = g.alg_gebouw_key
         AND g.alg_gebouw_key = afw.alg_gebouw_key(+)
         AND a.bez_afspraak_datum < SYSDATE + 2/24
         AND a.bez_afspraak_datum > SYSDATE
         AND NOT EXISTS (SELECT bez_kenmerkwaarde_waarde
                           FROM bez_kenmerkwaarde kws
                          WHERE bez_kenmerk_key = 1043                                    -- sms verzonden
                            AND kws.bez_bezoekers_key = b.bez_bezoekers_key);

   -- Verwijder kenmerken die gekopieerd zijn met de herhaal functie
   CURSOR ckd
   IS
     SELECT kw.bez_kenmerkwaarde_key, b.bez_bezoekers_key
       FROM bez_kenmerkwaarde kw, bez_bezoekers b, bez_afspraak a
      WHERE     TRUNC (bez_kenmerkwaarde_aanmaak) <> TRUNC (a.bez_afspraak_datum)
            AND bez_kenmerk_key = 1043             -- SMS verzonden op yyyy-mm-dd hh-mi-ss
            AND kw.bez_bezoekers_key = b.bez_bezoekers_key
            AND b.bez_afspraak_key = a.bez_afspraak_key
            AND a.bez_afspraak_datum > SYSDATE;

BEGIN
   FOR rec IN c
   LOOP

      -- hebben we meerdere wijzigingen dan is alleen de laatste interessant.
      DELETE fac_notificatie WHERE fac_srtnotificatie_key = rec.fac_srtnotificatie_key
                               AND fac_notificatie_extrakey = rec.bez_bezoekers_key;

      INSERT INTO fac_notificatie (fac_srtnotificatie_key,
                                   fac_notificatie_status,
                                   fac_notificatie_receiver_email,
                                   fac_notificatie_oms,
                                   fac_notificatie_refkey,
                                   fac_notificatie_extrakey,
                                   fac_notificatie_prioriteit,
                                   fac_notificatie_attachments)
          VALUES (rec.fac_srtnotificatie_key,
                  2,                                                                         -- mail
                  rec.xemail,                                                            -- email
                  rec.text,
                  rec.bez_afspraak_key,
                  rec.bez_bezoekers_key,
                  2,
                     '/ALG/A'
                  || SUBSTR (TO_CHAR (rec.alg_gebouw_key, 'fm0000000'), 1, 4)
                  || '___'
                  || '/A'
                  || rec.alg_gebouw_key
                  || '/1040/'
                  || rec.bijlage);



                  YKPN.set_kenmerk('BEZ', 1042, rec.bez_bezoekers_key, TO_CHAR (rec.bez_afspraak_datum, 'yyyy-mm-dd hh24:mi:ss')
                                                                                                  || ';' || COALESCE (rec.res_deel_key, -1) || ';' || rec.xemail, 0);

   END LOOP;

   -- Door bezoekers/afspraken te herhalen worden ook kenmerken gekopieerd. Dit heeft als gevolg dat er dan geen
   -- SMS meer verzonden wordt. Onderstaande verwijdert gekopieerde kenmerken met daarin het tijdstip dat de SMS verzonden
   -- is voor kenmerken waarvan de datum niet gelijk is aan de afspraakdatum.
   FOR rec IN ckd
   LOOP
      ykpn.set_kenmerk('BEZ', 1120, rec.bez_bezoekers_key, NULL, 0);   -- Geldig ID
      ykpn.set_kenmerk('BEZ', 1060, rec.bez_bezoekers_key, NULL, 0);   -- Nedap ID
      ykpn.set_kenmerk('BEZ', 1042, rec.bez_bezoekers_key, NULL, 0);   -- Nedap Verzonden
      ykpn.set_kenmerk('BEZ', 1160, rec.bez_bezoekers_key, NULL, 0);   -- Kenteken respons
      ykpn.set_kenmerk('BEZ', 1161, rec.bez_bezoekers_key, NULL, 0);   -- Kenteken Verzonden
      ykpn.set_kenmerk('BEZ', 1043, rec.bez_bezoekers_key, NULL, 0);   -- SMS Verzonden
   END LOOP;

   -- en nu de SMS berichten versturen
   FOR rec IN cs
   LOOP

      INSERT INTO fac_notificatie (fac_srtnotificatie_key,
                                   fac_notificatie_status,
                                   fac_notificatie_receiver_phone,
                                   fac_notificatie_oms,
                                   fac_notificatie_refkey,
                                   fac_notificatie_extrakey,
                                   fac_notificatie_prioriteit)
          VALUES (rec.fac_srtnotificatie_key,
                  4,                                                                          -- sms
                  rec.mobiel,                                                               -- email
                  rec.text,                                                                        -- text
                  rec.bez_afspraak_key,
                  rec.bez_bezoekers_key,
                  2);

                  YKPN.set_kenmerk('BEZ', 1043, rec.bez_bezoekers_key, TO_CHAR (SYSDATE, 'yyyy-mm-dd hh24:mi:ss'),0);
   END LOOP;
END;
/

-- meldt de parkeerplaats twee uur van te voren aan bij Nedap
CREATE OR REPLACE VIEW ykpn_v_parkeerplaats_nedap
(
   naam,
   pincode,
   v_van,
   v_tot,
   template,
   countergroup,
   bez_bezoekers_key
)
AS
   SELECT xml.char_to_html (bez_afspraak_naam),
          pincode,
          d_van,
          v_tot,
          template,
          countergroup,
          bez_bezoekers_key
     FROM (SELECT b.bez_afspraak_naam,
                  kw_p.bez_kenmerkwaarde_waarde pincode,
                  TO_CHAR (a.bez_afspraak_datum, 'yyyy-mm-dd hh:mi:ss') d_van,
                  TO_CHAR (a.bez_afspraak_eind, 'yyyy-mm-dd hh:mi:ss') v_tot,
                  (SELECT alg_onrgoedkenmerk_waarde
                     FROM alg_onrgoedkenmerk aogk
                    WHERE alg_kenmerk_key = 1041 AND aogk.alg_onrgoed_key = d.alg_gebouw_key)
                     template,
                  (SELECT alg_onrgoedkenmerk_waarde
                     FROM alg_onrgoedkenmerk aogk
                    WHERE alg_kenmerk_key = 1042 AND aogk.alg_onrgoed_key = d.alg_gebouw_key)
                     countergroup,
                  b.bez_bezoekers_key
             FROM bez_bezoekers b,
                  bez_afspraak a,
                  bez_kenmerkwaarde kw_p,
                  res_rsv_deel rrd,
                  res_deel rd,
                  ins_v_deel_gegevens d
            WHERE b.bez_afspraak_key = a.bez_afspraak_key
              AND b.bez_bezoekers_key = kw_p.bez_bezoekers_key
              AND kw_p.bez_kenmerk_key = 1020                                             -- pincode
              AND b.bez_bezoekers_key = rrd.bez_bezoekers_key
              AND rrd.res_deel_key = rd.res_deel_key
              AND rd.res_ins_deel_key = d.ins_deel_key
              AND NOT EXISTS
                     (SELECT bez_kenmerkwaarde_key
                        FROM bez_kenmerkwaarde kw
                       WHERE kw.bez_kenmerk_key = 1060                                   -- Nedap id
                         AND kw.bez_bezoekers_key = b.bez_bezoekers_key)
              AND bez_afspraak_datum BETWEEN SYSDATE AND SYSDATE + (2 / 24))
    WHERE template IS NOT NULL;

-- En vul de gegevens bij nedap aan met kenteken info
CREATE OR REPLACE VIEW ykpn_v_kenteken_nedap
(
    kenteken,
    pincode,
    bez_bezoekers_key
)
AS
    SELECT REGEXP_REPLACE (UPPER (kw_p.bez_kenmerkwaarde_waarde),
                           '[^A-Z0-9À-Ý]+',
                           '')
               kenteken,
           (SELECT kp.bez_kenmerkwaarde_waarde
              FROM bez_kenmerkwaarde kp
             WHERE     b.bez_bezoekers_key = kp.bez_bezoekers_key
                   AND kp.bez_kenmerk_key = 1020),                  -- Pincode
           b.bez_bezoekers_key
      FROM bez_bezoekers        b,
           bez_afspraak         a,
           bez_kenmerkwaarde    kw_p,
           res_rsv_deel         rrd,
           res_deel             rd,
           ins_v_deel_gegevens  d,
           alg_onrgoedkenmerk   aogkk
     WHERE     b.bez_afspraak_key = a.bez_afspraak_key
           AND b.bez_bezoekers_key = kw_p.bez_bezoekers_key
           AND kw_p.bez_kenmerk_key = 1080                         -- kenteken
           AND aogkk.alg_kenmerk_key = 1160     -- kentekenherkenning aanwezig
           AND aogkk.alg_onrgoed_key = d.alg_gebouw_key
           AND aogkk.alg_onrgoedkenmerk_waarde = '1'
           AND b.bez_bezoekers_key = rrd.bez_bezoekers_key
           AND rrd.res_deel_key = rd.res_deel_key
           AND rd.res_ins_deel_key = d.ins_deel_key
           -- We hebben nog geen kenteken gegevens verstuurd
           AND NOT EXISTS
                   (SELECT bez_kenmerkwaarde_key
                      FROM bez_kenmerkwaarde kw
                     WHERE     kw.bez_kenmerk_key = 1160  -- Kenteken response
                           AND kw.bez_bezoekers_key = b.bez_bezoekers_key)
           -- We hebben al wel een pincode id gestuurd zodat we nu een update met kenteken info kunnen doen.
           AND EXISTS
                   (SELECT bez_kenmerkwaarde_key
                      FROM bez_kenmerkwaarde kw
                     WHERE     kw.bez_kenmerk_key = 1060   -- Pincode response
                           AND kw.bez_bezoekers_key = b.bez_bezoekers_key)
           -- we sturen de pincode en kenteken informatie 2 uur van te voren.
           AND bez_afspraak_datum BETWEEN SYSDATE AND SYSDATE + (2 / 24);

-- Videoconferencing
CREATE OR REPLACE VIEW ykpn_v_vc_gegevens
(
   res_reservering_key,
   res_rsv_ruimte_key,
   res_rsv_ruimte_volgnr,
   t_van,
   t_tot,
   omschrijving,
   ruimte,
   contact_naam,
   contact_telefoon,
   contact_email,
   idnummertnf,
   aantal,
   vertrouwelijk,
   vc_id,
   externe_locatie,
   sip_ip,
   ipadres,
   last_upd,
   last_sync
)
AS
   SELECT rrr.res_reservering_key,
          rrr.res_rsv_ruimte_key,
          rrr.res_rsv_ruimte_volgnr,
             TO_CHAR (rrr.res_rsv_ruimte_van, 'yyyy-mm-dd')
          || 'T'
          || TO_CHAR (rrr.res_rsv_ruimte_van, 'hh24:mi:ss')
             t_van,
             TO_CHAR (rrr.res_rsv_ruimte_tot, 'yyyy-mm-dd')
          || 'T'
          || TO_CHAR (rrr.res_rsv_ruimte_tot, 'hh24:mi:ss')
             t_tot,
          xml.char_to_html (res_rsv_ruimte_omschrijving) omschrijving,
          rr.res_ruimte_nr ruimte,
          pf.prs_perslid_naam_friendly contact_naam,
          p.prs_perslid_telefoonnr contact_telefoon,
          p.prs_perslid_email contact_email,
          (SELECT alg_onrgoedkenmerk_waarde
             FROM alg_onrgoedkenmerk
            WHERE alg_onrgoedkenmerk_verwijder IS NULL
              AND alg_onrgoed_key = rar.alg_ruimte_key
              AND alg_kenmerk_key = 1003)
             idnummertnf,
          (SELECT COUNT ( * )
             FROM res_rsv_ruimte rrr2
            WHERE rrr.res_reservering_key = rrr2.res_reservering_key
              AND rrr2.res_rsv_ruimte_verwijder IS NULL
              AND rrr2.res_activiteit_key = 30)                                                -- VC
              +
          (SELECT count(*)
             FROM res_kenmerkwaarde rk, res_kenmerk k, res_rsv_ruimte rrrk
            WHERE rk.res_kenmerk_key = k.res_kenmerk_key AND k.res_srtkenmerk_key = 5
              AND rk.res_rsv_ruimte_key = rrrk.res_rsv_ruimte_key
              AND rrr.res_reservering_key = rrrk.res_reservering_key
              AND rrrk.res_rsv_ruimte_verwijder IS NULL)
             aantal,
          COALESCE (
             (SELECT fac.safe_to_number (res_kenmerkreservering_waarde)
                FROM res_kenmerkwaarde
               WHERE res_kenmerk_key = 31                                           -- vertrouwelijk
                 AND res_kenmerkwaarde_verwijder IS NULL
                 AND res_rsv_ruimte_key = rrr.res_rsv_ruimte_key),
             0)
             vertrouwelijk,
          COALESCE (
             (SELECT fac.safe_to_number (res_kenmerkreservering_waarde)
                FROM res_kenmerkwaarde
               WHERE res_kenmerk_key = 2                                                    -- vc id
                 AND res_kenmerkwaarde_verwijder IS NULL
                 AND res_rsv_ruimte_key = rrr.res_rsv_ruimte_key),
             0)
             vc_id,
          NULL externe_locatie,
          NULL sip_ip,
          NULL ipadres,
          COALESCE (
             (SELECT MAX (fac_tracking_datum)
                FROM fac_tracking t, fac_srtnotificatie sn
               WHERE t.fac_srtnotificatie_key = sn.fac_srtnotificatie_key
                 AND sn.fac_srtnotificatie_xmlnode = 'reservering'
                 AND fac_tracking_refkey = rrr.res_rsv_ruimte_key
                 AND fac_srtnotificatie_code <> 'CUST01'),
             SYSDATE - 100)
             last_upd,
          COALESCE (
             (SELECT MAX (fac_tracking_datum)
                FROM fac_tracking t, fac_srtnotificatie sn
               WHERE t.fac_srtnotificatie_key = sn.fac_srtnotificatie_key
                 AND sn.fac_srtnotificatie_xmlnode = 'reservering'
                 AND fac_tracking_refkey = rrr.res_rsv_ruimte_key
                 AND fac_srtnotificatie_code = 'CUST01'),
             SYSDATE - 100)
             last_sync
     FROM res_rsv_ruimte rrr,
          res_ruimte_opstelling ro,
          res_ruimte rr,
          prs_perslid p,
          (  SELECT res_ruimte_key, MIN (alg_ruimte_key) alg_ruimte_key
               FROM res_alg_ruimte
              WHERE res_alg_ruimte_verwijder IS NULL
           GROUP BY res_ruimte_key) rar,
          prs_v_perslid_fullnames pf
    WHERE rrr.res_rsv_ruimte_host_key = p.prs_perslid_key
      AND p.prs_perslid_key = pf.prs_perslid_key
      AND rrr.res_ruimte_opstel_key = ro.res_ruimte_opstel_key
      AND ro.res_ruimte_key = rr.res_ruimte_key
      AND rr.res_discipline_key = 73
      AND rrr.res_activiteit_key = 30
      AND rrr.res_rsv_ruimte_verwijder IS NULL
      AND rar.res_ruimte_key = rr.res_ruimte_key
      AND rrr.res_rsv_ruimte_van > SYSDATE
   UNION ALL
   SELECT rrr.res_reservering_key,
          rrr.res_rsv_ruimte_key,
          rrr.res_rsv_ruimte_volgnr,
             TO_CHAR (rrr.res_rsv_ruimte_van, 'yyyy-mm-dd')
          || 'T'
          || TO_CHAR (rrr.res_rsv_ruimte_van, 'hh24:mi:ss')
             t_van,
             TO_CHAR (rrr.res_rsv_ruimte_tot, 'yyyy-mm-dd')
          || 'T'
          || TO_CHAR (rrr.res_rsv_ruimte_tot, 'hh24:mi:ss')
             t_tot,
          xml.char_to_html (res_rsv_ruimte_omschrijving) omschrijving,
          rr.res_ruimte_nr ruimte,
          pf.prs_perslid_naam_friendly contact_naam,
          p.prs_perslid_telefoonnr contact_telefoon,
          p.prs_perslid_email contact_email,
          (SELECT alg_onrgoedkenmerk_waarde
             FROM alg_onrgoedkenmerk
            WHERE alg_onrgoedkenmerk_verwijder IS NULL
              AND alg_onrgoed_key = rar.alg_ruimte_key
              AND alg_kenmerk_key = 1003)
             idnummertnf,
          (SELECT COUNT ( * )
             FROM res_rsv_ruimte rrr2
            WHERE rrr.res_reservering_key = rrr2.res_reservering_key
              AND rrr2.res_rsv_ruimte_verwijder IS NULL
              AND rrr2.res_activiteit_key = 30)                                                -- VC
              +
          (SELECT count(*)
             FROM res_kenmerkwaarde rk, res_kenmerk k, res_rsv_ruimte rrrk
            WHERE rk.res_kenmerk_key = k.res_kenmerk_key AND k.res_srtkenmerk_key = 5
              AND rk.res_rsv_ruimte_key = rrrk.res_rsv_ruimte_key
              AND rrr.res_reservering_key = rrrk.res_reservering_key
              AND rrrk.res_rsv_ruimte_verwijder IS NULL)
             aantal,
          0,
          COALESCE (
             (SELECT fac.safe_to_number (res_kenmerkreservering_waarde)
                FROM res_kenmerkwaarde
               WHERE res_kenmerk_key = 2                                                    -- vc id
                 AND res_kenmerkwaarde_verwijder IS NULL
                 AND res_rsv_ruimte_key = rrr.res_rsv_ruimte_key),
             0)
             vc_id,
          locatie externe_locatie,
          sip_ip,
          ipadres,
          NULL,
          NULL
     FROM res_rsv_ruimte rrr,
          res_ruimte_opstelling ro,
          res_ruimte rr,
          prs_perslid p,
          (  SELECT res_ruimte_key, MIN (alg_ruimte_key) alg_ruimte_key
               FROM res_alg_ruimte
              WHERE res_alg_ruimte_verwijder IS NULL
           GROUP BY res_ruimte_key) rar,
          prs_v_perslid_fullnames pf,
          (SELECT locatie,
                  sip_ip,
                  ipadres,
                  kl.res_rsv_ruimte_key
             FROM (SELECT res_kenmerkreservering_waarde locatie,
                          res_rsv_ruimte_key,
                          res_kenmerk_groep groep
                     FROM res_kenmerkwaarde rk, res_kenmerk k
                    WHERE rk.res_kenmerk_key = k.res_kenmerk_key AND res_srtkenmerk_key = 6) kl,
                  (SELECT DECODE (res_kenmerkreservering_waarde, 81, 'IP', 82, 'SIP', NULL) sip_ip,
                          res_rsv_ruimte_key,
                          res_kenmerk_groep groep
                     FROM res_kenmerkwaarde rk, res_kenmerk k
                    WHERE rk.res_kenmerk_key = k.res_kenmerk_key AND res_srtkenmerk_key = 4) ks,
                  (SELECT res_kenmerkreservering_waarde ipadres,
                          res_rsv_ruimte_key,
                          res_kenmerk_groep groep
                     FROM res_kenmerkwaarde rk, res_kenmerk k
                    WHERE rk.res_kenmerk_key = k.res_kenmerk_key AND k.res_srtkenmerk_key = 5) ki
            WHERE kl.res_rsv_ruimte_key = ks.res_rsv_ruimte_key
              AND ks.res_rsv_ruimte_key = ki.res_rsv_ruimte_key
              AND kl.groep = ks.groep
              AND ks.groep = ki.groep) ext
    WHERE rrr.res_rsv_ruimte_host_key = p.prs_perslid_key
      AND p.prs_perslid_key = pf.prs_perslid_key
      AND rrr.res_ruimte_opstel_key = ro.res_ruimte_opstel_key
      AND ro.res_ruimte_key = rr.res_ruimte_key
      AND rr.res_discipline_key = 73
      AND rrr.res_activiteit_key = 30
      AND rrr.res_rsv_ruimte_verwijder IS NULL
      AND rar.res_ruimte_key = rr.res_ruimte_key
      AND rrr.res_rsv_ruimte_key = ext.res_rsv_ruimte_key
      AND rrr.res_rsv_ruimte_van > SYSDATE;

-- Verwijderde video conferenties.
CREATE OR REPLACE VIEW ykpn_v_cancel_vc
(
   res_reservering_key,
   vc_id
)
AS
     SELECT r.res_reservering_key, res_kenmerkreservering_waarde
       FROM res_reservering r, res_rsv_ruimte rrr, res_kenmerkwaarde kw
      WHERE res_reservering_verwijder IS NOT NULL
        AND r.res_reservering_key = rrr.res_reservering_key
        AND rrr.res_activiteit_key = 30                                         -- video conferentie
        AND kw.res_kenmerk_key = 2                                                          -- vc_id
        AND kw.res_rsv_ruimte_key = rrr.res_rsv_ruimte_key
        AND res_rsv_ruimte_van > SYSDATE
   GROUP BY r.res_reservering_key, res_kenmerkreservering_waarde;


-- HUUR / Doorbelasting
CREATE OR REPLACE VIEW ykpn_v_ruimtegebruik
(
   fac_usrdata_omschr,
   fac_usrdata_key,
   fac_usrdata_vervaldatum
)
AS
   SELECT fac_usrdata_code || ' (' || fac_usrdata_omschr || ')',
          fac_usrdata_key,
          COALESCE (fac_usrdata_verwijder, fac_usrdata_vervaldatum)
     FROM fac_usrdata
    WHERE fac_usrtab_key = 21;

CREATE OR REPLACE VIEW ykpn_v_huur_gegevens
(
   alg_gebouw_upper,
   alg_gebouw_omschrijving,
   alg_verdieping_code,
   alg_ruimte_nr,
   alg_ruimte_omschrijving,
   alg_srtruimte_omschrijving,
   alg_ruimte_bruto_vloeropp,
   huurder,
   vvo,
   factor
)
AS
   SELECT alg_gebouw_upper,
          alg_gebouw_omschrijving,
          alg_verdieping_code,
          alg_ruimte_nr,
          alg_ruimte_omschrijving,
          alg_srtruimte_omschrijving,
          alg_ruimte_bruto_vloeropp,
          (SELECT alg_onrgoedkenmerk_waarde
             FROM alg_onrgoedkenmerk
            WHERE alg_onrgoed_key = r.alg_ruimte_key AND alg_kenmerk_key = 1047)
             huurder,
          (SELECT fac.safe_to_number (alg_onrgoedkenmerk_waarde)
             FROM alg_onrgoedkenmerk
            WHERE alg_onrgoed_key = r.alg_ruimte_key AND alg_kenmerk_key = 1044)
             vvo,
          (SELECT fac.safe_to_number (alg_onrgoedkenmerk_waarde)
             FROM alg_onrgoedkenmerk
            WHERE alg_onrgoed_key = r.alg_ruimte_key AND alg_kenmerk_key = 1045)
             factor
     FROM alg_v_ruimte_gegevens r;


-- afdelingsboom views. KPN heeft te veel afdelingsniveaus. Daarom maar een platte structuur met een
-- view om de boom op te stellen.
CREATE OR REPLACE VIEW ykpn_v_afdeling
(
   prs_bedrijf_key,
   prs_afdeling_key,
   prs_afdeling_parentkey
)
AS
   SELECT a.prs_bedrijf_key, a.prs_afdeling_key, kl.prs_afdeling_parentkey
     FROM prs_afdeling a,
          (SELECT prs_link_key prs_afdeling_key,
                  prs_kenmerklink_waarde prs_afdeling_parentkey
             FROM prs_kenmerklink
            WHERE prs_kenmerk_key = 1) kl
    WHERE a.prs_afdeling_key = kl.prs_afdeling_key(+);

CREATE OR REPLACE VIEW ykpn_v_afdeling_boom
(
   niveau,
   prs_bedrijf_key,
   prs_afdeling_key,
   prs_afdeling_key1,
   prs_afdeling_key2,
   prs_afdeling_key3,
   prs_afdeling_key4,
   prs_afdeling_key5,
   prs_afdeling_key6,
   prs_afdeling_key7,
   prs_afdeling_key8,
   prs_afdeling_key9,
   prs_afdeling_key10,
   prs_afdeling_key11
)
AS
   SELECT '1' niveau,
          a1.prs_bedrijf_key,
          a1.prs_afdeling_key,
          a1.prs_afdeling_key,
          TO_NUMBER (NULL),
          TO_NUMBER (NULL),
          TO_NUMBER (NULL),
          TO_NUMBER (NULL),
          TO_NUMBER (NULL),
          TO_NUMBER (NULL),
          TO_NUMBER (NULL),
          TO_NUMBER (NULL),
          TO_NUMBER (NULL),
          TO_NUMBER (NULL)
     FROM ykpn_v_afdeling a1
    WHERE a1.prs_afdeling_parentkey IS NULL
   UNION
   SELECT '2' niveau,
          a1.prs_bedrijf_key,
          a2.prs_afdeling_key,
          a1.prs_afdeling_key,
          a2.prs_afdeling_key,
          TO_NUMBER (NULL),
          TO_NUMBER (NULL),
          TO_NUMBER (NULL),
          TO_NUMBER (NULL),
          TO_NUMBER (NULL),
          TO_NUMBER (NULL),
          TO_NUMBER (NULL),
          TO_NUMBER (NULL),
          TO_NUMBER (NULL)
     FROM ykpn_v_afdeling a1, ykpn_v_afdeling a2
    WHERE a2.prs_afdeling_parentkey = a1.prs_afdeling_key
      AND a1.prs_afdeling_parentkey IS NULL
   UNION
   SELECT '3' niveau,
          a1.prs_bedrijf_key,
          a3.prs_afdeling_key,
          a1.prs_afdeling_key,
          a2.prs_afdeling_key,
          a3.prs_afdeling_key,
          TO_NUMBER (NULL),
          TO_NUMBER (NULL),
          TO_NUMBER (NULL),
          TO_NUMBER (NULL),
          TO_NUMBER (NULL),
          TO_NUMBER (NULL),
          TO_NUMBER (NULL),
          TO_NUMBER (NULL)
     FROM ykpn_v_afdeling a1, ykpn_v_afdeling a2, ykpn_v_afdeling a3
    WHERE a2.prs_afdeling_parentkey = a1.prs_afdeling_key
      AND a3.prs_afdeling_parentkey = a2.prs_afdeling_key
      AND a1.prs_afdeling_parentkey IS NULL
   UNION
   SELECT '4' niveau,
          a1.prs_bedrijf_key,
          a4.prs_afdeling_key,
          a1.prs_afdeling_key,
          a2.prs_afdeling_key,
          a3.prs_afdeling_key,
          a4.prs_afdeling_key,
          TO_NUMBER (NULL),
          TO_NUMBER (NULL),
          TO_NUMBER (NULL),
          TO_NUMBER (NULL),
          TO_NUMBER (NULL),
          TO_NUMBER (NULL),
          TO_NUMBER (NULL)
     FROM ykpn_v_afdeling a1,
          ykpn_v_afdeling a2,
          ykpn_v_afdeling a3,
          ykpn_v_afdeling a4
    WHERE a2.prs_afdeling_parentkey = a1.prs_afdeling_key
      AND a3.prs_afdeling_parentkey = a2.prs_afdeling_key
      AND a4.prs_afdeling_parentkey = a3.prs_afdeling_key
      AND a1.prs_afdeling_parentkey IS NULL
   UNION
   SELECT '5' niveau,
          a1.prs_bedrijf_key,
          a5.prs_afdeling_key,
          a1.prs_afdeling_key,
          a2.prs_afdeling_key,
          a3.prs_afdeling_key,
          a4.prs_afdeling_key,
          a5.prs_afdeling_key,
          TO_NUMBER (NULL),
          TO_NUMBER (NULL),
          TO_NUMBER (NULL),
          TO_NUMBER (NULL),
          TO_NUMBER (NULL),
          TO_NUMBER (NULL)
     FROM ykpn_v_afdeling a1,
          ykpn_v_afdeling a2,
          ykpn_v_afdeling a3,
          ykpn_v_afdeling a4,
          ykpn_v_afdeling a5
    WHERE a2.prs_afdeling_parentkey = a1.prs_afdeling_key
      AND a3.prs_afdeling_parentkey = a2.prs_afdeling_key
      AND a4.prs_afdeling_parentkey = a3.prs_afdeling_key
      AND a5.prs_afdeling_parentkey = a4.prs_afdeling_key
      AND a1.prs_afdeling_parentkey IS NULL
   UNION
   SELECT '6' niveau,
          a1.prs_bedrijf_key,
          a6.prs_afdeling_key,
          a1.prs_afdeling_key,
          a2.prs_afdeling_key,
          a3.prs_afdeling_key,
          a4.prs_afdeling_key,
          a5.prs_afdeling_key,
          a6.prs_afdeling_key,
          TO_NUMBER (NULL),
          TO_NUMBER (NULL),
          TO_NUMBER (NULL),
          TO_NUMBER (NULL),
          TO_NUMBER (NULL)
     FROM ykpn_v_afdeling a1,
          ykpn_v_afdeling a2,
          ykpn_v_afdeling a3,
          ykpn_v_afdeling a4,
          ykpn_v_afdeling a5,
          ykpn_v_afdeling a6
    WHERE a2.prs_afdeling_parentkey = a1.prs_afdeling_key
      AND a3.prs_afdeling_parentkey = a2.prs_afdeling_key
      AND a4.prs_afdeling_parentkey = a3.prs_afdeling_key
      AND a5.prs_afdeling_parentkey = a4.prs_afdeling_key
      AND a6.prs_afdeling_parentkey = a5.prs_afdeling_key
      AND a1.prs_afdeling_parentkey IS NULL
   UNION
   SELECT '7' niveau,
          a1.prs_bedrijf_key,
          a7.prs_afdeling_key,
          a1.prs_afdeling_key,
          a2.prs_afdeling_key,
          a3.prs_afdeling_key,
          a4.prs_afdeling_key,
          a5.prs_afdeling_key,
          a6.prs_afdeling_key,
          a7.prs_afdeling_key,
          TO_NUMBER (NULL),
          TO_NUMBER (NULL),
          TO_NUMBER (NULL),
          TO_NUMBER (NULL)
     FROM ykpn_v_afdeling a1,
          ykpn_v_afdeling a2,
          ykpn_v_afdeling a3,
          ykpn_v_afdeling a4,
          ykpn_v_afdeling a5,
          ykpn_v_afdeling a6,
          ykpn_v_afdeling a7
    WHERE a2.prs_afdeling_parentkey = a1.prs_afdeling_key
      AND a3.prs_afdeling_parentkey = a2.prs_afdeling_key
      AND a4.prs_afdeling_parentkey = a3.prs_afdeling_key
      AND a5.prs_afdeling_parentkey = a4.prs_afdeling_key
      AND a6.prs_afdeling_parentkey = a5.prs_afdeling_key
      AND a7.prs_afdeling_parentkey = a6.prs_afdeling_key
      AND a1.prs_afdeling_parentkey IS NULL
   UNION
   SELECT '8' niveau,
          a1.prs_bedrijf_key,
          a8.prs_afdeling_key,
          a1.prs_afdeling_key,
          a2.prs_afdeling_key,
          a3.prs_afdeling_key,
          a4.prs_afdeling_key,
          a5.prs_afdeling_key,
          a6.prs_afdeling_key,
          a7.prs_afdeling_key,
          a8.prs_afdeling_key,
          TO_NUMBER (NULL),
          TO_NUMBER (NULL),
          TO_NUMBER (NULL)
     FROM ykpn_v_afdeling a1,
          ykpn_v_afdeling a2,
          ykpn_v_afdeling a3,
          ykpn_v_afdeling a4,
          ykpn_v_afdeling a5,
          ykpn_v_afdeling a6,
          ykpn_v_afdeling a7,
          ykpn_v_afdeling a8
    WHERE a2.prs_afdeling_parentkey = a1.prs_afdeling_key
      AND a3.prs_afdeling_parentkey = a2.prs_afdeling_key
      AND a4.prs_afdeling_parentkey = a3.prs_afdeling_key
      AND a5.prs_afdeling_parentkey = a4.prs_afdeling_key
      AND a6.prs_afdeling_parentkey = a5.prs_afdeling_key
      AND a7.prs_afdeling_parentkey = a6.prs_afdeling_key
      AND a8.prs_afdeling_parentkey = a7.prs_afdeling_key
      AND a1.prs_afdeling_parentkey IS NULL
   UNION
   SELECT '9' niveau,
          a1.prs_bedrijf_key,
          a9.prs_afdeling_key,
          a1.prs_afdeling_key,
          a2.prs_afdeling_key,
          a3.prs_afdeling_key,
          a4.prs_afdeling_key,
          a5.prs_afdeling_key,
          a6.prs_afdeling_key,
          a7.prs_afdeling_key,
          a8.prs_afdeling_key,
          a9.prs_afdeling_key,
          TO_NUMBER (NULL),
          TO_NUMBER (NULL)
     FROM ykpn_v_afdeling a1,
          ykpn_v_afdeling a2,
          ykpn_v_afdeling a3,
          ykpn_v_afdeling a4,
          ykpn_v_afdeling a5,
          ykpn_v_afdeling a6,
          ykpn_v_afdeling a7,
          ykpn_v_afdeling a8,
          ykpn_v_afdeling a9
    WHERE a2.prs_afdeling_parentkey = a1.prs_afdeling_key
      AND a3.prs_afdeling_parentkey = a2.prs_afdeling_key
      AND a4.prs_afdeling_parentkey = a3.prs_afdeling_key
      AND a5.prs_afdeling_parentkey = a4.prs_afdeling_key
      AND a6.prs_afdeling_parentkey = a5.prs_afdeling_key
      AND a7.prs_afdeling_parentkey = a6.prs_afdeling_key
      AND a8.prs_afdeling_parentkey = a7.prs_afdeling_key
      AND a9.prs_afdeling_parentkey = a8.prs_afdeling_key
      AND a1.prs_afdeling_parentkey IS NULL
   UNION
   SELECT '10' niveau,
          a1.prs_bedrijf_key,
          a10.prs_afdeling_key,
          a1.prs_afdeling_key,
          a2.prs_afdeling_key,
          a3.prs_afdeling_key,
          a4.prs_afdeling_key,
          a5.prs_afdeling_key,
          a6.prs_afdeling_key,
          a7.prs_afdeling_key,
          a8.prs_afdeling_key,
          a9.prs_afdeling_key,
          a10.prs_afdeling_key,
          TO_NUMBER (NULL)
     FROM ykpn_v_afdeling a1,
          ykpn_v_afdeling a2,
          ykpn_v_afdeling a3,
          ykpn_v_afdeling a4,
          ykpn_v_afdeling a5,
          ykpn_v_afdeling a6,
          ykpn_v_afdeling a7,
          ykpn_v_afdeling a8,
          ykpn_v_afdeling a9,
          ykpn_v_afdeling a10
    WHERE a2.prs_afdeling_parentkey = a1.prs_afdeling_key
      AND a3.prs_afdeling_parentkey = a2.prs_afdeling_key
      AND a4.prs_afdeling_parentkey = a3.prs_afdeling_key
      AND a5.prs_afdeling_parentkey = a4.prs_afdeling_key
      AND a6.prs_afdeling_parentkey = a5.prs_afdeling_key
      AND a7.prs_afdeling_parentkey = a6.prs_afdeling_key
      AND a8.prs_afdeling_parentkey = a7.prs_afdeling_key
      AND a9.prs_afdeling_parentkey = a8.prs_afdeling_key
      AND a10.prs_afdeling_parentkey = a9.prs_afdeling_key
      AND a1.prs_afdeling_parentkey IS NULL
  UNION
   SELECT '11' niveau,
          a1.prs_bedrijf_key,
          a10.prs_afdeling_key,
          a1.prs_afdeling_key,
          a2.prs_afdeling_key,
          a3.prs_afdeling_key,
          a4.prs_afdeling_key,
          a5.prs_afdeling_key,
          a6.prs_afdeling_key,
          a7.prs_afdeling_key,
          a8.prs_afdeling_key,
          a9.prs_afdeling_key,
          a10.prs_afdeling_key,
          a11.prs_afdeling_key
     FROM ykpn_v_afdeling a1,
          ykpn_v_afdeling a2,
          ykpn_v_afdeling a3,
          ykpn_v_afdeling a4,
          ykpn_v_afdeling a5,
          ykpn_v_afdeling a6,
          ykpn_v_afdeling a7,
          ykpn_v_afdeling a8,
          ykpn_v_afdeling a9,
          ykpn_v_afdeling a10,
          ykpn_v_afdeling a11
    WHERE a2.prs_afdeling_parentkey = a1.prs_afdeling_key
      AND a3.prs_afdeling_parentkey = a2.prs_afdeling_key
      AND a4.prs_afdeling_parentkey = a3.prs_afdeling_key
      AND a5.prs_afdeling_parentkey = a4.prs_afdeling_key
      AND a6.prs_afdeling_parentkey = a5.prs_afdeling_key
      AND a7.prs_afdeling_parentkey = a6.prs_afdeling_key
      AND a8.prs_afdeling_parentkey = a7.prs_afdeling_key
      AND a9.prs_afdeling_parentkey = a8.prs_afdeling_key
      AND a10.prs_afdeling_parentkey = a9.prs_afdeling_key
      AND a11.prs_afdeling_parentkey = a10.prs_afdeling_key
      AND a1.prs_afdeling_parentkey IS NULL;


-- rapport om communicatie met Nedap opgeslagen in kenmerken inzichtelijk te maken.
CREATE OR REPLACE VIEW ykpn_v_rap_bez_kenmerk
(
   bez_afspraak_key,
   bez_afspraak_naam,
   bez_kenmerkwaarde_waarde,
   bez_kenmerkwaarde_aanmaak,
   bez_kenmerk_omschrijving
)
AS
   SELECT bez_afspraak_key,
          bez_afspraak_naam,
          bez_kenmerkwaarde_waarde,
          bez_kenmerkwaarde_aanmaak,
          bez_kenmerk_omschrijving
     FROM bez_kenmerkwaarde kw, bez_kenmerk k, bez_bezoekers b
    WHERE k.bez_kenmerk_key = kw.bez_kenmerk_key
       AND kw.bez_bezoekers_key = b.bez_bezoekers_key;


-- fiatteringsoverzicht inclusief afdeling.
CREATE OR REPLACE VIEW ykpn_v_fiat_huisvesting
(
   mld_opdr_key,
   vervanger_key,
   aanvraagnummer,
   datum,
   prs_perslid_naam_full,
   afdeling,
   afdeling2,
   kostenplaats_nr,
   kostenplaats_oms,
   bedrag,
   module,
   TYPE,
   fiatstatus,
   request_key,
   statuskey,
   categorie,
   fiatteur,
   locatie,
   actie
)
AS
   SELECT op.mld_opdr_key,
          c.vervanger,
             sd.ins_srtdiscipline_prefix
          || op.mld_melding_key
          || '/'
          || op.mld_opdr_bedrijfopdr_volgnr
             aanvraagnummer,
          mld_opdr_datumbegin datum,
          pf.prs_perslid_naam_full,
          a.prs_afdeling_omschrijving,
          a2.prs_afdeling_omschrijving prs_afdeling_omschrijving2,
          km.prs_kostenplaats_nr,
          km.prs_kostenplaats_omschrijving,
          mld_opdr_kosten bedrag,
          'MLD' module,
          mld_typeopdr_omschrijving TYPE,
          'open' fiatstatus,
          op.mld_opdr_key request_key,
          op.mld_statusopdr_key statuskey,
          td.ins_discipline_omschrijving categorie,
          p2.prs_perslid_naam_full fiatteur,
          CASE
             WHEN l.alg_locatie_key IS NULL THEN NULL
             ELSE l.alg_locatie_omschrijving || ' (' || l.alg_locatie_code || ')'
          END
             locatie,
          (SELECT SUBSTR (
                     on1.mld_opdr_note_omschrijving,
                     2,
                     DECODE (INSTR (on1.mld_opdr_note_omschrijving, ' '),
                             0, 15,
                             INSTR (on1.mld_opdr_note_omschrijving, ' ') - 2))
             FROM mld_opdr_note on1
            WHERE SUBSTR (mld_opdr_note_omschrijving, 1, 1) = '#'
              AND on1.mld_opdr_key = op.mld_opdr_key
              AND NOT EXISTS
                     (SELECT mld_opdr_note_key
                        FROM mld_opdr_note on2
                       WHERE on1.mld_opdr_key = on2.mld_opdr_key
                         AND SUBSTR (on2.mld_opdr_note_omschrijving, 1, 1) = '#'
                         AND on2.mld_opdr_note_key > on1.mld_opdr_note_key))
             actie
     FROM mld_melding m,
          mld_stdmelding sm,
          mld_opdr op,
          mld_typeopdr ot,
          prs_v_perslid_fullnames_all pf,
          ykpn_v_afdeling_boom b,
          prs_afdeling a,
          prs_afdeling a2,
          prs_perslid p,
          prs_kostenplaats km,
          prs_kostenplaats k,
          ins_tab_discipline td,
          ins_srtdiscipline sd,
          fac_tracking ft,
          fac_srtnotificatie fno,
          (  SELECT kg.prs_perslid_key, k2.prs_kostenplaats_key
               FROM prs_kostenplaats k2, prs_kostenplaatsgrp kg
              WHERE kg.prs_kostenplaatsgrp_key = k2.prs_kostenplaatsgrp_key
                AND kg.prs_perslid_key IN (3)
           GROUP BY kg.prs_perslid_key, k2.prs_kostenplaats_key) ver,
          prs_v_perslid_fullnames_all p2,
          alg_locatie l,
          (SELECT prs_perslid_key fiatteur, prs_perslid_key vervanger FROM prs_perslid
           UNION ALL
           SELECT prs_perslid_key, prs_perslid_key_alt FROM prs_collega) c
    WHERE op.mld_melding_key = m.mld_melding_key
      AND m.prs_kostenplaats_key = km.prs_kostenplaats_key(+)
      AND op.mld_typeopdr_key = ot.mld_typeopdr_key
      AND COALESCE (op.prs_kostenplaats_key, m.prs_kostenplaats_key) = k.prs_kostenplaats_key
      AND k.prs_kostenplaats_key = ver.prs_kostenplaats_key(+)
      AND pf.prs_perslid_key = m.prs_perslid_key
      AND ft.fac_tracking_refkey = op.mld_opdr_key
      AND ft.fac_srtnotificatie_key = fno.fac_srtnotificatie_key
      AND op.mld_melding_key = m.mld_melding_key
      AND m.mld_stdmelding_key = sm.mld_stdmelding_key
      AND sm.mld_ins_discipline_key = td.ins_discipline_key
      AND sd.ins_srtdiscipline_key = td.ins_srtdiscipline_key
      AND m.mld_alg_locatie_key = l.alg_locatie_key(+)
      AND fno.fac_srtnotificatie_code = 'ORDFIA'
      AND op.mld_statusopdr_key = 3
      AND c.fiatteur = p2.prs_perslid_key
      AND p2.prs_perslid_key = p.prs_perslid_key
      AND p.prs_afdeling_key = b.prs_afdeling_key
      AND b.prs_afdeling_key = a.prs_afdeling_key
      AND b.prs_afdeling_key2 = a2.prs_afdeling_key
      AND p2.prs_perslid_key =
             CASE
                WHEN NOT EXISTS
                        (SELECT prs_perslid_key
                           FROM fac_tracking t, fac_srtnotificatie st
                          WHERE t.fac_srtnotificatie_key = st.fac_srtnotificatie_key
                            AND st.fac_srtnotificatie_code = 'ORDFOK'
                            AND fac_tracking_refkey = op.mld_opdr_key)
                THEN
                   prs.getkpverantwoordelijke (op.prs_kostenplaats_key, 1, -1)
                ELSE
                   ver.prs_perslid_key
             END;



-- Opdrachten op naam van intern bedrijf KPN boordeling Res (42702) worden goedgekeurd
-- door ASA (Anita, Ada en Suzanne)
CREATE OR REPLACE VIEW ykpn_v_beoord_huisvesting
(
   mld_opdr_key,
   aanvraagnummer,
   datum,
   prs_perslid_naam_full,
   afdeling,
   afdeling2,
   kostenplaats_nr,
   kostenplaats_oms,
   bedrag,
   TYPE,
   status,
   categorie,
   locatie,
   actie
)
AS
   SELECT op.mld_opdr_key,
             sd.ins_srtdiscipline_prefix
          || op.mld_melding_key
          || '/'
          || op.mld_opdr_bedrijfopdr_volgnr
             aanvraagnummer,
          mld_opdr_datumbegin datum,
          pf.prs_perslid_naam_full,
          a.prs_afdeling_omschrijving,
          a2.prs_afdeling_omschrijving prs_afdeling_omschrijving2,
          k.prs_kostenplaats_nr,
          k.prs_kostenplaats_omschrijving,
          mld_opdr_kosten bedrag,
          mld_typeopdr_omschrijving TYPE,
          so.mld_statusopdr_omschrijving,
          td.ins_discipline_omschrijving categorie,
          CASE
             WHEN l.alg_locatie_key IS NULL THEN NULL
             ELSE l.alg_locatie_omschrijving || ' (' || l.alg_locatie_code || ')'
          END
             locatie,
          (SELECT SUBSTR (
                     on1.mld_opdr_note_omschrijving,
                     2,
                     DECODE (INSTR (on1.mld_opdr_note_omschrijving, ' '),
                             0, 15,
                             INSTR (on1.mld_opdr_note_omschrijving, ' ') - 2))
             FROM mld_opdr_note on1
            WHERE SUBSTR (mld_opdr_note_omschrijving, 1, 1) = '#'
              AND on1.mld_opdr_key = op.mld_opdr_key
              AND NOT EXISTS
                     (SELECT mld_opdr_note_key
                        FROM mld_opdr_note on2
                       WHERE on1.mld_opdr_key = on2.mld_opdr_key
                         AND SUBSTR (on2.mld_opdr_note_omschrijving, 1, 1) = '#'
                         AND on2.mld_opdr_note_key > on1.mld_opdr_note_key))
             actie
     FROM mld_melding m,
          mld_stdmelding sm,
          mld_opdr op,
          mld_typeopdr ot,
          prs_v_perslid_fullnames_all pf,
          ykpn_v_afdeling_boom b,
          prs_perslid p,
          prs_afdeling a,
          prs_afdeling a2,
          prs_kostenplaats k,
          ins_tab_discipline td,
          ins_srtdiscipline sd,
          alg_locatie l,
          mld_statusopdr so
    WHERE op.mld_melding_key = m.mld_melding_key
      AND op.mld_typeopdr_key = ot.mld_typeopdr_key
      AND m.prs_kostenplaats_key = k.prs_kostenplaats_key(+)
      AND pf.prs_perslid_key = m.prs_perslid_key
      AND p.prs_perslid_key = m.prs_perslid_key
      AND op.mld_melding_key = m.mld_melding_key
      AND m.mld_stdmelding_key = sm.mld_stdmelding_key
      AND sm.mld_ins_discipline_key = td.ins_discipline_key
      AND sd.ins_srtdiscipline_key = td.ins_srtdiscipline_key
      AND m.mld_alg_locatie_key = l.alg_locatie_key(+)
      AND op.mld_statusopdr_key IN (5, 8)
      AND b.prs_afdeling_key = a.prs_afdeling_key
      AND b.prs_afdeling_key2 = a2.prs_afdeling_key
      AND p.prs_afdeling_key = b.prs_afdeling_key
      AND op.mld_statusopdr_key = so.mld_statusopdr_key
      AND op.mld_uitvoerende_keys = 42702;

CREATE OR REPLACE VIEW ykpn_v_gebouw_parkeer_info
AS
    SELECT alg_gebouw_code,
           alg_gebouw_naam,
           alg_gebouw_key,
           (SELECT alg_onrgoedkenmerk_waarde
              FROM alg_onrgoedkenmerk aogk
             WHERE     aogk.alg_kenmerk_key = 1140
                   AND aogk.alg_onrgoed_key = g.alg_gebouw_key)
               betaald,
           (SELECT alg_onrgoedkenmerk_waarde
              FROM alg_onrgoedkenmerk aogk
             WHERE     aogk.alg_kenmerk_key = 1141
                   AND aogk.alg_onrgoed_key = g.alg_gebouw_key)
               gratis,
           (SELECT alg_onrgoedkenmerk_waarde
              FROM alg_onrgoedkenmerk aogk
             WHERE     aogk.alg_kenmerk_key = 1142
                   AND aogk.alg_onrgoed_key = g.alg_gebouw_key)
               opmerking
      FROM alg_gebouw g
     WHERE     alg_gebouw_verwijder IS NULL
           AND EXISTS
                   (SELECT alg_onrgoedkenmerk_key
                      FROM alg_onrgoedkenmerk aogk
                     WHERE     aogk.alg_kenmerk_key IN (1140, 1141, 1142)
                           AND aogk.alg_onrgoed_key = g.alg_gebouw_key
                           AND aogk.alg_onrgoedkenmerk_verwijder IS NULL);

-- Rapport om misbruik van parkeerplaatsen op eigen locatie te rapporteren.
CREATE OR REPLACE VIEW ykpn_v_rap_pp_eigen_gebruik
(
   gebouw,
   actie,
   aangemeld_door,
   bezoeker,
   bedrijf,
   email_bezoeker,
   afspraak_datum
)
AS
   SELECT d.alg_gebouw_upper,
          ba.bez_actie_omschrijving,
          pf.prs_perslid_naam_full,
          bez_afspraak_naam,
          bez_afspraak_bedrijf,
          LOWER (prs_perslid_email),
          bez_afspraak_datum
     FROM bez_afspraak a,
          bez_actie ba,
          bez_bezoekers b,
          res_rsv_deel rrd,
          res_v_aanwezigdeel rd,
          ins_v_deel_gegevens d,
          bez_kenmerkwaarde em,
          prs_perslid p,
          prs_v_perslid_fullnames pf,
          prs_v_werkplekperslid_gegevens pwp
    WHERE a.bez_afspraak_key = b.bez_afspraak_key
      AND a.bez_actie_key = ba.bez_actie_key
      AND b.bez_bezoekers_key = rrd.bez_bezoekers_key
      AND rrd.res_deel_key = rd.res_deel_key
      AND rd.res_ins_deel_key = d.ins_deel_key
      AND em.bez_kenmerk_key = 1000
      AND em.bez_bezoekers_key = b.bez_bezoekers_key
      AND UPPER (em.bez_kenmerkwaarde_waarde) = UPPER (p.prs_perslid_email)
      AND p.prs_perslid_key = pwp.prs_perslid_key
      AND pwp.alg_locatie_key = d.alg_locatie_key
      AND TRUNC (bez_afspraak_datum, 'mm') = ADD_MONTHS (TRUNC (SYSDATE, 'mm'), -1)
      AND p.prs_perslid_key = pf.prs_perslid_key;


CREATE OR REPLACE VIEW ykpn_v_rap_parkeerpl_telling
AS
SELECT pg.*,
       ROUND((medewerkers / g_medewerkers) * 100) p_medewerkers,
       ROUND((bezoek / g_bezoek) * 100) p_bezoek,
       ROUND((miva / g_miva) * 100) p_miva,
       ROUND((leverancier / g_leverancier) * 100) p_leverancier,
       ROUND((oplaadpunt / g_oplaadpunt) * 100) p_oplaadpunt,
       ROUND((rvb / g_rvb) * 100) p_rvb,
       ROUND((slagboom / g_slagboom) * 100) p_slagboom,
       ROUND((rondom / g_rondom) * 100) p_rondom,
       ROUND((illegaal / g_illegaal) * 100) p_illegaal,
       ROUND((loods / g_loods) * 100) p_loods
  FROM ( SELECT mld_melding_key,
                og.alg_gebouw_code,
                og.alg_gebouw_naam,
                FAC.safe_to_date((SELECT km.mld_kenmerkmelding_waarde
                   FROM mld_kenmerkmelding km, mld_kenmerk k
                  WHERE     km.mld_kenmerk_key = k.mld_kenmerk_key
                        AND mld_kenmerk_groep = 0
                        AND mld_srtkenmerk_key = 581
                        AND km.mld_melding_key = m.mld_melding_key), 'dd-mm-yyyy')
                    datum,
                (SELECT ud.fac_usrdata_omschr
                   FROM mld_kenmerkmelding km, mld_kenmerk k, fac_usrdata ud
                  WHERE     km.mld_kenmerk_key = k.mld_kenmerk_key
                        AND mld_kenmerk_groep = 0
                        AND mld_srtkenmerk_key = 601
                        AND km.mld_melding_key = m.mld_melding_key
                        AND fac.safe_to_number (mld_kenmerkmelding_waarde) =
                            ud.fac_usrdata_key)
                    tijdstip,
                FAC.safe_to_number((SELECT DECODE(km.mld_kenmerkmelding_waarde, 0, NULL, km.mld_kenmerkmelding_waarde)
                   FROM mld_kenmerkmelding km, mld_kenmerk k
                  WHERE     km.mld_kenmerk_key = k.mld_kenmerk_key
                        AND mld_kenmerk_groep = 0
                        AND mld_srtkenmerk_key = 621
                        AND km.mld_melding_key = m.mld_melding_key))
                    medewerkers,
                FAC.safe_to_number((SELECT DECODE(km.mld_kenmerkmelding_waarde, 0, NULL, km.mld_kenmerkmelding_waarde)
                   FROM mld_kenmerkmelding km, mld_kenmerk k
                  WHERE     km.mld_kenmerk_key = k.mld_kenmerk_key
                        AND mld_kenmerk_groep = 0
                        AND mld_srtkenmerk_key = 622
                        AND km.mld_melding_key = m.mld_melding_key))
                    bezoek,
                FAC.safe_to_number((SELECT DECODE(km.mld_kenmerkmelding_waarde, 0, NULL, km.mld_kenmerkmelding_waarde)
                   FROM mld_kenmerkmelding km, mld_kenmerk k
                  WHERE     km.mld_kenmerk_key = k.mld_kenmerk_key
                        AND mld_kenmerk_groep = 0
                        AND mld_srtkenmerk_key = 623
                        AND km.mld_melding_key = m.mld_melding_key))
                    miva,
                FAC.safe_to_number((SELECT DECODE(km.mld_kenmerkmelding_waarde, 0, NULL, km.mld_kenmerkmelding_waarde)
                   FROM mld_kenmerkmelding km, mld_kenmerk k
                  WHERE     km.mld_kenmerk_key = k.mld_kenmerk_key
                        AND mld_kenmerk_groep = 0
                        AND mld_srtkenmerk_key = 624
                        AND km.mld_melding_key = m.mld_melding_key))
                    leverancier,
                FAC.safe_to_number((SELECT DECODE(km.mld_kenmerkmelding_waarde, 0, NULL, km.mld_kenmerkmelding_waarde)
                   FROM mld_kenmerkmelding km, mld_kenmerk k
                  WHERE     km.mld_kenmerk_key = k.mld_kenmerk_key
                        AND mld_kenmerk_groep = 0
                        AND mld_srtkenmerk_key = 626
                        AND km.mld_melding_key = m.mld_melding_key))
                    oplaadpunt,
                FAC.safe_to_number((SELECT DECODE(km.mld_kenmerkmelding_waarde, 0, NULL, km.mld_kenmerkmelding_waarde)
                   FROM mld_kenmerkmelding km, mld_kenmerk k
                  WHERE     km.mld_kenmerk_key = k.mld_kenmerk_key
                        AND mld_kenmerk_groep = 0
                        AND mld_srtkenmerk_key = 630
                        AND km.mld_melding_key = m.mld_melding_key))
                    rvb,
                FAC.safe_to_number((SELECT DECODE(km.mld_kenmerkmelding_waarde, 0, NULL, km.mld_kenmerkmelding_waarde)
                   FROM mld_kenmerkmelding km, mld_kenmerk k
                  WHERE     km.mld_kenmerk_key = k.mld_kenmerk_key
                        AND mld_kenmerk_groep = 0
                        AND mld_srtkenmerk_key = 627
                        AND km.mld_melding_key = m.mld_melding_key))
                    slagboom,
                FAC.safe_to_number((SELECT DECODE(km.mld_kenmerkmelding_waarde, 0, NULL, km.mld_kenmerkmelding_waarde)
                   FROM mld_kenmerkmelding km, mld_kenmerk k
                  WHERE     km.mld_kenmerk_key = k.mld_kenmerk_key
                        AND mld_kenmerk_groep = 0
                        AND mld_srtkenmerk_key = 628
                        AND km.mld_melding_key = m.mld_melding_key))
                    rondom,
                FAC.safe_to_number((SELECT DECODE(km.mld_kenmerkmelding_waarde, 0, NULL, km.mld_kenmerkmelding_waarde)
                   FROM mld_kenmerkmelding km, mld_kenmerk k
                  WHERE     km.mld_kenmerk_key = k.mld_kenmerk_key
                        AND mld_kenmerk_groep = 0
                        AND mld_srtkenmerk_key = 629
                        AND km.mld_melding_key = m.mld_melding_key))
                    illegaal,
                FAC.safe_to_number((SELECT DECODE(km.mld_kenmerkmelding_waarde, 0, NULL, km.mld_kenmerkmelding_waarde)
                   FROM mld_kenmerkmelding km, mld_kenmerk k
                  WHERE     km.mld_kenmerk_key = k.mld_kenmerk_key
                        AND mld_kenmerk_groep = 0
                        AND mld_srtkenmerk_key = 625
                        AND km.mld_melding_key = m.mld_melding_key))
                    loods,
                FAC.safe_to_number((SELECT DECODE(km.mld_kenmerkmelding_waarde, 0, NULL, km.mld_kenmerkmelding_waarde)
                   FROM mld_kenmerkmelding km, mld_kenmerk k
                  WHERE     km.mld_kenmerk_key = k.mld_kenmerk_key
                        AND mld_kenmerk_groep = 1
                        AND mld_srtkenmerk_key = 621
                        AND km.mld_melding_key = m.mld_melding_key))
                    g_medewerkers,
                FAC.safe_to_number((SELECT DECODE(km.mld_kenmerkmelding_waarde, 0, NULL, km.mld_kenmerkmelding_waarde)
                   FROM mld_kenmerkmelding km, mld_kenmerk k
                  WHERE     km.mld_kenmerk_key = k.mld_kenmerk_key
                        AND mld_kenmerk_groep = 1
                        AND mld_srtkenmerk_key = 622
                        AND km.mld_melding_key = m.mld_melding_key))
                    g_bezoek,
                FAC.safe_to_number((SELECT DECODE(km.mld_kenmerkmelding_waarde, 0, NULL, km.mld_kenmerkmelding_waarde)
                   FROM mld_kenmerkmelding km, mld_kenmerk k
                  WHERE     km.mld_kenmerk_key = k.mld_kenmerk_key
                        AND mld_kenmerk_groep = 1
                        AND mld_srtkenmerk_key = 623
                        AND km.mld_melding_key = m.mld_melding_key))
                    g_miva,
                FAC.safe_to_number((SELECT DECODE(km.mld_kenmerkmelding_waarde, 0, NULL, km.mld_kenmerkmelding_waarde)
                   FROM mld_kenmerkmelding km, mld_kenmerk k
                  WHERE     km.mld_kenmerk_key = k.mld_kenmerk_key
                        AND mld_kenmerk_groep = 1
                        AND mld_srtkenmerk_key = 624
                        AND km.mld_melding_key = m.mld_melding_key))
                    g_leverancier,
                FAC.safe_to_number((SELECT DECODE(km.mld_kenmerkmelding_waarde, 0, NULL, km.mld_kenmerkmelding_waarde)
                   FROM mld_kenmerkmelding km, mld_kenmerk k
                  WHERE     km.mld_kenmerk_key = k.mld_kenmerk_key
                        AND mld_kenmerk_groep = 1
                        AND mld_srtkenmerk_key = 626
                        AND km.mld_melding_key = m.mld_melding_key))
                    g_oplaadpunt,
                FAC.safe_to_number((SELECT DECODE(km.mld_kenmerkmelding_waarde, 0, NULL, km.mld_kenmerkmelding_waarde)
                   FROM mld_kenmerkmelding km, mld_kenmerk k
                  WHERE     km.mld_kenmerk_key = k.mld_kenmerk_key
                        AND mld_kenmerk_groep = 1
                        AND mld_srtkenmerk_key = 630
                        AND km.mld_melding_key = m.mld_melding_key))
                    g_rvb,
                FAC.safe_to_number((SELECT DECODE(km.mld_kenmerkmelding_waarde, 0, NULL, km.mld_kenmerkmelding_waarde)
                   FROM mld_kenmerkmelding km, mld_kenmerk k
                  WHERE     km.mld_kenmerk_key = k.mld_kenmerk_key
                        AND mld_kenmerk_groep = 1
                        AND mld_srtkenmerk_key = 627
                        AND km.mld_melding_key = m.mld_melding_key))
                    g_slagboom,
                FAC.safe_to_number((SELECT DECODE(km.mld_kenmerkmelding_waarde, 0, NULL, km.mld_kenmerkmelding_waarde)
                   FROM mld_kenmerkmelding km, mld_kenmerk k
                  WHERE     km.mld_kenmerk_key = k.mld_kenmerk_key
                        AND mld_kenmerk_groep = 1
                        AND mld_srtkenmerk_key = 628
                        AND km.mld_melding_key = m.mld_melding_key))
                    g_rondom,
                FAC.safe_to_number((SELECT DECODE(km.mld_kenmerkmelding_waarde, 0, NULL, km.mld_kenmerkmelding_waarde)
                   FROM mld_kenmerkmelding km, mld_kenmerk k
                  WHERE     km.mld_kenmerk_key = k.mld_kenmerk_key
                        AND mld_kenmerk_groep = 1
                        AND mld_srtkenmerk_key = 629
                        AND km.mld_melding_key = m.mld_melding_key))
                    g_illegaal,
                FAC.safe_to_number((SELECT DECODE(km.mld_kenmerkmelding_waarde, 0, NULL, km.mld_kenmerkmelding_waarde)
                   FROM mld_kenmerkmelding km, mld_kenmerk k
                  WHERE     km.mld_kenmerk_key = k.mld_kenmerk_key
                        AND mld_kenmerk_groep = 1
                        AND mld_srtkenmerk_key = 625
                        AND km.mld_melding_key = m.mld_melding_key))
                    g_loods
           FROM mld_melding m, alg_v_onroerendgoed_gegevens og
          WHERE     mld_stdmelding_key = 481                  -- parkeerplaatstellingen
                AND mld_alg_onroerendgoed_keys = og.alg_onroerendgoed_keys) pg;


-- Management info bezoekers
CREATE OR REPLACE VIEW ykpn_v_mi_bezoekers
AS
    SELECT a.bez_afspraak_datum,
           l.alg_locatie_omschrijving,
           ac.bez_actie_omschrijving,
           DECODE (b.prs_perslid_key, NULL, 'Extern', 'Intern')      InternExtern,
           DECODE (bez_bezoekers_done, NULL, 0,1) checkIn,
           DECODE (TO_CHAR (a.bez_afspraak_datum, 'HH24'), 7, 1, 0)  u7,
           DECODE (TO_CHAR (a.bez_afspraak_datum, 'HH24'), 8, 1, 0)  u8,
           DECODE (TO_CHAR (a.bez_afspraak_datum, 'HH24'), 9, 1, 0)  u9,
           DECODE (TO_CHAR (a.bez_afspraak_datum, 'HH24'), 10, 1, 0) u10,
           DECODE (TO_CHAR (a.bez_afspraak_datum, 'HH24'), 11, 1, 0) u11,
           DECODE (TO_CHAR (a.bez_afspraak_datum, 'HH24'), 12, 1, 0) u12,
           DECODE (TO_CHAR (a.bez_afspraak_datum, 'HH24'), 13, 1, 0) u13,
           DECODE (TO_CHAR (a.bez_afspraak_datum, 'HH24'), 14, 1, 0) u14,
           DECODE (TO_CHAR (a.bez_afspraak_datum, 'HH24'), 15, 1, 0) u15,
           DECODE (TO_CHAR (a.bez_afspraak_datum, 'HH24'), 16, 1, 0) u16,
           DECODE (TO_CHAR (a.bez_afspraak_datum, 'HH24'), 17, 1, 0) u17,
           DECODE (TO_CHAR (a.bez_afspraak_datum, 'HH24'), 18, 1, 0) u18
      FROM bez_bezoekers  b,
           bez_afspraak   a,
           bez_actie      ac,
           alg_locatie    l
     WHERE     a.bez_afspraak_key = b.bez_afspraak_key
           AND a.bez_actie_key = ac.bez_actie_key
           AND a.alg_locatie_key = l.alg_locatie_key;

-- Taak om goedgekeuurde aanvragen die toegewezen zijn aan Arnoud Pleij en bedrijf KPN RES services
-- na acceptatie af te melden.
CREATE OR REPLACE PROCEDURE ykpn_import_afmelden_opdracht (
   p_import_key IN NUMBER)
AS
   CURSOR c
   IS
      SELECT *
        FROM mld_opdr
        -- Arnoud Pleij en bedrijf KPN RES services
       WHERE mld_uitvoerende_keys IN (7676, 42702)
         -- status geaccepteerd
         AND mld_statusopdr_key = 8;
BEGIN
   FOR rec IN c
   LOOP
      mld.setopdrachtstatus (rec.mld_opdr_key, 6, 3);                     -- afgemeld door Facilitor
      mld.updatemeldingstatusav (rec.mld_melding_key, 0, NULL, 0);
   END LOOP;
END;
/

-----------------------------------------
-- Import toegangscontrole bestanden
-----------------------------------------
CREATE OR REPLACE VIEW ykpn_v_toegang
(
    alg_gebouw_code,
    alg_gebouw_naam,
    datum,
    soort_lezer,
    tijd, aantal
)
AS
              SELECT alg_gebouw_code, alg_gebouw_naam, datum, soort_lezer, '00', h00 FROM ykpn_imp_toegang
    UNION ALL SELECT alg_gebouw_code, alg_gebouw_naam, datum, soort_lezer, '01', h01 FROM ykpn_imp_toegang
    UNION ALL SELECT alg_gebouw_code, alg_gebouw_naam, datum, soort_lezer, '02', h02 FROM ykpn_imp_toegang
    UNION ALL SELECT alg_gebouw_code, alg_gebouw_naam, datum, soort_lezer, '03', h03 FROM ykpn_imp_toegang
    UNION ALL SELECT alg_gebouw_code, alg_gebouw_naam, datum, soort_lezer, '04', h04 FROM ykpn_imp_toegang
    UNION ALL SELECT alg_gebouw_code, alg_gebouw_naam, datum, soort_lezer, '05', h05 FROM ykpn_imp_toegang
    UNION ALL SELECT alg_gebouw_code, alg_gebouw_naam, datum, soort_lezer, '06', h06 FROM ykpn_imp_toegang
    UNION ALL SELECT alg_gebouw_code, alg_gebouw_naam, datum, soort_lezer, '07', h07 FROM ykpn_imp_toegang
    UNION ALL SELECT alg_gebouw_code, alg_gebouw_naam, datum, soort_lezer, '08', h08 FROM ykpn_imp_toegang
    UNION ALL SELECT alg_gebouw_code, alg_gebouw_naam, datum, soort_lezer, '09', h09 FROM ykpn_imp_toegang
    UNION ALL SELECT alg_gebouw_code, alg_gebouw_naam, datum, soort_lezer, '10', h10 FROM ykpn_imp_toegang
    UNION ALL SELECT alg_gebouw_code, alg_gebouw_naam, datum, soort_lezer, '11', h11 FROM ykpn_imp_toegang
    UNION ALL SELECT alg_gebouw_code, alg_gebouw_naam, datum, soort_lezer, '12', h12 FROM ykpn_imp_toegang
    UNION ALL SELECT alg_gebouw_code, alg_gebouw_naam, datum, soort_lezer, '13', h13 FROM ykpn_imp_toegang
    UNION ALL SELECT alg_gebouw_code, alg_gebouw_naam, datum, soort_lezer, '14', h14 FROM ykpn_imp_toegang
    UNION ALL SELECT alg_gebouw_code, alg_gebouw_naam, datum, soort_lezer, '15', h15 FROM ykpn_imp_toegang
    UNION ALL SELECT alg_gebouw_code, alg_gebouw_naam, datum, soort_lezer, '16', h16 FROM ykpn_imp_toegang
    UNION ALL SELECT alg_gebouw_code, alg_gebouw_naam, datum, soort_lezer, '17', h17 FROM ykpn_imp_toegang
    UNION ALL SELECT alg_gebouw_code, alg_gebouw_naam, datum, soort_lezer, '18', h18 FROM ykpn_imp_toegang
    UNION ALL SELECT alg_gebouw_code, alg_gebouw_naam, datum, soort_lezer, '19', h19 FROM ykpn_imp_toegang
    UNION ALL SELECT alg_gebouw_code, alg_gebouw_naam, datum, soort_lezer, '20', h20 FROM ykpn_imp_toegang
    UNION ALL SELECT alg_gebouw_code, alg_gebouw_naam, datum, soort_lezer, '21', h21 FROM ykpn_imp_toegang
    UNION ALL SELECT alg_gebouw_code, alg_gebouw_naam, datum, soort_lezer, '22', h22 FROM ykpn_imp_toegang
    UNION ALL SELECT alg_gebouw_code, alg_gebouw_naam, datum, soort_lezer, '23', h23 FROM ykpn_imp_toegang;

CREATE OR REPLACE VIEW ykpn_v_toegang_saldo
AS
SELECT t.*, DECODE(SUBSTR(dag, 1,2), 'wp', 'wp', NULL) aantalwpkol FROM ykpn_toegang_saldo t;

CREATE OR REPLACE PROCEDURE ykpn_import_toegang (p_import_key IN NUMBER)
AS
    CURSOR c
    IS
          SELECT *
            FROM fac_imp_file
           WHERE fac_import_key = p_import_key
        ORDER BY fac_imp_file_index;

    v_newline            VARCHAR2 (1000);
    v_aanduiding         VARCHAR2 (1000);                       -- Import line
    v_field              VARCHAR2 (100);                       -- Import field
    v_fielddelimitor     VARCHAR2 (1);                      -- Field seperator
    v_errormsg           VARCHAR (200);
    v_errorhint          VARCHAR (200);
    oracle_err_num       NUMBER;
    oracle_err_mes       VARCHAR2 (200);
    v_skipfield          VARCHAR2 (100);
    -- De importvelden
    header_found         BOOLEAN;
    v_alg_gebouw_code    VARCHAR2 (12);
    v_alg_gebouw_soort   VARCHAR2 (10);
    v_alg_gebouw_naam    VARCHAR2 (60);
    v_soort_lezer        VARCHAR2 (10);
    v_datum_txt          VARCHAR2 (10);
    v_lezer              VARCHAR2 (500);
    v_h00                NUMBER;
    v_h01                NUMBER;
    v_h02                NUMBER;
    v_h03                NUMBER;
    v_h04                NUMBER;
    v_h05                NUMBER;
    v_h06                NUMBER;
    v_h07                NUMBER;
    v_h08                NUMBER;
    v_h09                NUMBER;
    v_h10                NUMBER;
    v_h11                NUMBER;
    v_h12                NUMBER;
    v_h13                NUMBER;
    v_h14                NUMBER;
    v_h15                NUMBER;
    v_h16                NUMBER;
    v_h17                NUMBER;
    v_h18                NUMBER;
    v_h19                NUMBER;
    v_h20                NUMBER;
    v_h21                NUMBER;
    v_h22                NUMBER;
    v_h23                NUMBER;
    v_datum              DATE;
    v_first              NUMBER;
BEGIN
    -- Init
    header_found := FALSE;
    v_fielddelimitor := ';';

    -- Clear my previous imported rows
    DELETE FROM ykpn_imp_toegang;

    FOR rec IN c
    LOOP
        BEGIN
            v_newline := rec.fac_imp_file_line;
            v_aanduiding := v_newline;

            IF SUBSTR (v_newline, 1, 3) = '?'
            THEN
                -- EF BB BF aangetroffen
                fac.imp_writelog (p_import_key,
                                  'W',
                                  'Byte Order Mark aangetroffen',
                                  'Bestand heeft onbehandeld UTF-8 formaat.');
                v_newline := SUBSTR (v_newline, 4);
            END IF;

            -- Skip until a valid header is found
            IF UPPER (rec.fac_imp_file_line) LIKE
                   'GEBCODE;GEBSOORT;GEBOUWNAW;SOORTLEZER;YYYYMMDD;LEZER;H0;H1;H2;H3;H4;H5;H6;H7;H8;H9;H10;H11;H12;H13;H14;H15;H16;H17;H18;H19;H20;H21;H22;H23;TOTAAL%'
           THEN
                -- Sla de kopregel over.
                header_found := TRUE;
            ELSIF (header_found)
            THEN

                fac.imp_getfield (v_newline, v_fielddelimitor, v_alg_gebouw_code);
                fac.imp_getfield (v_newline, v_fielddelimitor, v_alg_gebouw_soort);
                fac.imp_getfield (v_newline, v_fielddelimitor, v_alg_gebouw_naam);
                fac.imp_getfield (v_newline, v_fielddelimitor, v_soort_lezer);
                fac.imp_getfield (v_newline, v_fielddelimitor, v_datum_txt);
                fac.imp_getfield (v_newline, v_fielddelimitor, v_lezer);
                fac.imp_getfield (v_newline, v_fielddelimitor, v_h00);
                fac.imp_getfield (v_newline, v_fielddelimitor, v_h01);
                fac.imp_getfield (v_newline, v_fielddelimitor, v_h02);
                fac.imp_getfield (v_newline, v_fielddelimitor, v_h03);
                fac.imp_getfield (v_newline, v_fielddelimitor, v_h04);
                fac.imp_getfield (v_newline, v_fielddelimitor, v_h05);
                fac.imp_getfield (v_newline, v_fielddelimitor, v_h06);
                fac.imp_getfield (v_newline, v_fielddelimitor, v_h07);
                fac.imp_getfield (v_newline, v_fielddelimitor, v_h08);
                fac.imp_getfield (v_newline, v_fielddelimitor, v_h09);
                fac.imp_getfield (v_newline, v_fielddelimitor, v_h10);
                fac.imp_getfield (v_newline, v_fielddelimitor, v_h11);
                fac.imp_getfield (v_newline, v_fielddelimitor, v_h12);
                fac.imp_getfield (v_newline, v_fielddelimitor, v_h13);
                fac.imp_getfield (v_newline, v_fielddelimitor, v_h14);
                fac.imp_getfield (v_newline, v_fielddelimitor, v_h15);
                fac.imp_getfield (v_newline, v_fielddelimitor, v_h16);
                fac.imp_getfield (v_newline, v_fielddelimitor, v_h17);
                fac.imp_getfield (v_newline, v_fielddelimitor, v_h18);
                fac.imp_getfield (v_newline, v_fielddelimitor, v_h19);
                fac.imp_getfield (v_newline, v_fielddelimitor, v_h20);
                fac.imp_getfield (v_newline, v_fielddelimitor, v_h21);
                fac.imp_getfield (v_newline, v_fielddelimitor, v_h22);
                fac.imp_getfield (v_newline, v_fielddelimitor, v_h23);
                v_datum := TO_DATE (v_datum_txt, 'yyyymmdd');

                IF LENGTH(v_alg_gebouw_code) = 4
                THEN
                   v_alg_gebouw_code := '0' || v_alg_gebouw_code;
                END IF;

                INSERT INTO ykpn_imp_toegang (alg_gebouw_code,
                                              alg_gebouw_soort,
                                              alg_gebouw_naam,
                                              soort_lezer,
                                              datum_txt,
                                              lezer,
                                              h00,
                                              h01,
                                              h02,
                                              h03,
                                              h04,
                                              h05,
                                              h06,
                                              h07,
                                              h08,
                                              h09,
                                              h10,
                                              h11,
                                              h12,
                                              h13,
                                              h14,
                                              h15,
                                              h16,
                                              h17,
                                              h18,
                                              h19,
                                              h20,
                                              h21,
                                              h22,
                                              h23,
                                              datum)
                     VALUES (v_alg_gebouw_code,
                             v_alg_gebouw_soort,
                             v_alg_gebouw_naam,
                             v_soort_lezer,
                             v_datum_txt,
                             SUBSTR(v_lezer,1,50),
                             v_h00,
                             v_h01,
                             v_h02,
                             v_h03,
                             v_h04,
                             v_h05,
                             v_h06,
                             v_h07,
                             v_h08,
                             v_h09,
                             v_h10,
                             v_h11,
                             v_h12,
                             v_h13,
                             v_h14,
                             v_h15,
                             v_h16,
                             v_h17,
                             v_h18,
                             v_h19,
                             v_h20,
                             v_h21,
                             v_h22,
                             v_h23,
                             v_datum);
            END IF;

            COMMIT;
        END;
    END LOOP;

    IF NOT header_found
    THEN
        fac.imp_writelog (p_import_key,
                          'E',
                          'Geen geldige header aangetroffen',
                          'Bestand is geen geldig toegang importbestand.');
    END IF;
EXCEPTION
    WHEN OTHERS
    THEN
        oracle_err_num := SQLCODE;
        oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
        v_errormsg :=
               'OTHERS (error '
            || oracle_err_num
            || '/'
            || oracle_err_mes
            || ')';
        fac.imp_writelog (p_import_key,
                          'E',
                          SUBSTR (v_errormsg, 1, 1000),
                          v_aanduiding);

        -- maak de importtabel leeg om te voorkomen dat er halve bestanden ingelezen worden.
        DELETE FROM ykpn_imp_toegang;
END;
/

CREATE OR REPLACE PROCEDURE ykpn_update_toegang (p_import_key IN NUMBER)
AS
v_datum DATE;

BEGIN

   -- haal de eerste dag van de ingelezen maand op.
   SELECT DISTINCT TRUNC(datum, 'MON')
     INTO v_datum
     FROM ykpn_imp_toegang;

   -- verwijder oude records als we deze maand al eerder ingelezen hebben.
   DELETE ykpn_toegang_saldo WHERE TRUNC(datum, 'MON') = v_datum;

   -- de data in de ykpn_imp_toegang tabel bevat delta's per uur voor een specifieke lezer
   -- deze data gaan we nu zo opslaan dat we per uur het aantal aanwezige persoonen kunnen rapporteren.
   INSERT INTO ykpn_toegang_saldo (alg_gebouw_code,
                                   alg_gebouw_naam,
                                   datum,
                                   tijd,
                                   saldo)
         SELECT t.alg_gebouw_code,
                t.alg_gebouw_naam,
                t.datum,
                t.tijd,
                (SELECT SUM (DECODE (soort_lezer, 'IN', 1, -1) * aantal)
                   FROM ykpn_v_toegang ts
                  WHERE     ts.alg_gebouw_code = t.alg_gebouw_code
                        AND ts.datum = t.datum
                        AND TO_NUMBER (ts.tijd) <= TO_NUMBER (t.tijd))
                    saldo
           FROM ykpn_v_toegang t
       GROUP BY alg_gebouw_code,
                alg_gebouw_naam,
                datum,
                tijd;

   -- voor de rapportages is het ook wenselijk om andere notaties van de datum erbij te hebben.
   -- verder voegen we ook het aantal werkplekken van het gebouw en de bezetting toe.

   UPDATE ykpn_toegang_saldo s
      SET dag = DECODE(to_char(datum, 'D'), 1, 'Zondag', 2, 'Maandag', 3, 'Dinsdag', 4, 'Woensdag', 5, 'Donderdag', 6, 'Vrijdag', 7, 'Zaterdag'),
          dag_nummer = to_char(datum, 'D'),
          weekend = DECODE(to_char(datum, 'D'), 1, 'Ja', 7, 'Ja', 'Nee'),
          (bezetting, aantal_wp) = ( SELECT ROUND( (saldo * 100) / fac.safe_to_number(alg_onrgoedkenmerk_waarde)),
                                            fac.safe_to_number(alg_onrgoedkenmerk_waarde)
                                       FROM alg_onrgoedkenmerk aogk, alg_gebouw g
                                      WHERE     alg_kenmerk_key = 1100
                                            AND aogk.alg_onrgoed_key = g.alg_gebouw_key
                                            AND g.alg_gebouw_code = s.alg_gebouw_code)
    WHERE TRUNC(datum, 'MON') = v_datum;

   -- Om in de grafiek ook het aantal beschikbare werkplekken te tonen wordt dit toegevoegd aan de tabel.
   INSERT INTO ykpn_toegang_saldo (alg_gebouw_code,
                                   alg_gebouw_naam,
                                   datum,
                                   dag,
                                   dag_nummer,
                                   weekend,
                                   tijd,
                                   aantal_wp,
                                   saldo,
                                   bezetting)
         SELECT g.alg_gebouw_code,
                s.alg_gebouw_naam,
                datum,
                'wp',
                dag_nummer,
                'Nee',
                tijd,
                NULL,
                aogk.alg_onrgoedkenmerk_waarde,
                NULL
           FROM ykpn_toegang_saldo s, alg_gebouw g, alg_onrgoedkenmerk aogk
          WHERE s.alg_gebouw_code = g.alg_gebouw_code
            AND g.alg_gebouw_key = aogk.alg_onrgoed_key
            AND aogk.alg_onrgoedkenmerk_verwijder IS NULL
            AND aogk.alg_kenmerk_key  = 1100  -- Aantal werkplekken in gebruik per gebouw
            AND TRUNC(datum, 'MON') = v_datum
       GROUP BY g.alg_gebouw_code,
                s.alg_gebouw_naam,
                aogk.alg_onrgoedkenmerk_waarde,
                datum,
                dag_nummer,
                tijd;

   -- Om in de grafiek ook het aantal beschikbare werkplekken (zonder leegstand) te tonen wordt dit toegevoegd aan de tabel.
   INSERT INTO ykpn_toegang_saldo (alg_gebouw_code,
                                   alg_gebouw_naam,
                                   datum,
                                   dag,
                                   dag_nummer,
                                   weekend,
                                   tijd,
                                   aantal_wp,
                                   saldo,
                                   bezetting)
         SELECT g.alg_gebouw_code,
                s.alg_gebouw_naam,
                datum,
                'wp z leeg',
                dag_nummer,
                'Nee',
                tijd,
                NULL,
                aogk.alg_onrgoedkenmerk_waarde,
                NULL
           FROM ykpn_toegang_saldo s, alg_gebouw g, alg_onrgoedkenmerk aogk
          WHERE s.alg_gebouw_code = g.alg_gebouw_code
            AND g.alg_gebouw_key = aogk.alg_onrgoed_key
            AND aogk.alg_onrgoedkenmerk_verwijder IS NULL
            AND aogk.alg_kenmerk_key  = 1280  -- Aantal werkplekken (zonder leegstand) per gebouw
            AND TRUNC(datum, 'MON') = v_datum
       GROUP BY g.alg_gebouw_code,
                s.alg_gebouw_naam,
                aogk.alg_onrgoedkenmerk_waarde,
                datum,
                dag_nummer,
                tijd;


END;
/



-----------------------------------------
-- Parkeerplaats goedkeuring
-----------------------------------------

-- view voor lijstje met mensen die WEB_USER09 rechten hebben
-- dit zijn de mensen die parkeerplaatsen goed mogen keuren.
CREATE OR REPLACE VIEW ykpn_v_pp_goedkeurders
(
    prs_perslid_key,
    prs_perslid_naam_full,
    prs_perslid_verwijder
)
AS
    SELECT DISTINCT
           pf.prs_perslid_key, prs_perslid_naam_full || '(' || kl.prs_kenmerklink_waarde || ')', prs_perslid_verwijder
      FROM prs_v_perslid_fullnames_all  pf,
           fac_groeprechten             gr,
           fac_gebruikersgroep          gg,
           prs_kenmerklink              kl
     WHERE     pf.prs_perslid_key = gg.prs_perslid_key
           AND gg.fac_groep_key = gr.fac_groep_key
           AND gr.fac_functie_key = 119           -- WEB_USER09
           AND kl.prs_link_key = pf.prs_perslid_key
           AND kl.prs_kenmerk_key = 1040;


-- view voor rapport pp goedkeurders
-- via de gebruikersgroep gaan we op zoek naar vervangers.
CREATE OR REPLACE VIEW ykpn_v_rap_goedkeuring_pp
AS
    SELECT gg2.prs_perslid_key FCLT_3D_USER_KEY,
           b.bez_bezoekers_key,
           bez_afspraak_datum,
           bez_afspraak_eind,
           bez_afspraak_gastheer,
           bez_afspraak_naam,
           bez_afspraak_bedrijf,
           alg_locatie_omschrijving,
           alg_gebouw_naam,
           prs_perslid_naam_full goedkeurder,
           (SELECT bez_kenmerkwaarde_waarde
              FROM bez_kenmerkwaarde kw
             WHERE bez_kenmerk_key = 1004
               AND kw.bez_bezoekers_key = b.bez_bezoekers_key) reden
      FROM bez_afspraak             a,
           bez_bezoekers            b,
           res_rsv_deel             rrd,
           res_v_ins_deel           rid,
           bez_kenmerkwaarde        kw,
           prs_v_perslid_fullnames  pg,
           alg_locatie              l,
           alg_gebouw               g,
           fac_groep                gr,
           fac_gebruikersgroep      gg1,
           fac_gebruikersgroep      gg2
     WHERE     b.bez_bezoekers_key = rrd.bez_bezoekers_key
           AND rrd.res_deel_key = rid.res_deel_key
           AND rid.alg_gebouw_key = g.alg_gebouw_key
           AND b.bez_bezoekers_key = kw.bez_bezoekers_key
           AND a.alg_locatie_key = l.alg_locatie_key
           AND kw.bez_kenmerk_key = 1003                     -- moet goedgekeurd worden door
           AND a.bez_afspraak_key = b.bez_afspraak_key
           AND fac.safe_to_number (kw.bez_kenmerkwaarde_waarde) =
               pg.prs_perslid_key
           AND pg.prs_perslid_key = gg1.prs_perslid_key
           AND gg1.fac_groep_key = gr.fac_groep_key
           AND gr.fac_groep_collega = 1
           AND gr.fac_groep_key = gg2.fac_groep_key
           AND NOT EXISTS (SELECT t.fac_tracking_key
                             FROM fac_tracking t, fac_srtnotificatie sn
                            WHERE fac_tracking_refkey = b.bez_bezoekers_key
                              AND t.fac_srtnotificatie_key = sn.fac_srtnotificatie_key
                              AND sn.fac_srtnotificatie_code = 'CUST04');

-- Rapport met goedgekeurde en afgewezen parkeerplaatsen
CREATE OR REPLACE VIEW ykpn_v_rap_tracking_pp
AS
    SELECT bez_afspraak_datum,
           fac_tracking_datum,
           DECODE (fac_srtnotificatie_code,
                   'CUST05', 'Afgekeurd',
                   'CUST04', 'Goedgekeurd')
               fac_srtnotificatie_oms,
           a.bez_afspraak_key,
           bez_afspraak_naam,
           bez_afspraak_bedrijf,
           l.alg_locatie_omschrijving,
           wpl.alg_locatie_omschrijving standplaats,
           pfg.prs_perslid_naam_full
               goedkeurder,
           pfh.prs_perslid_naam_full
               gastheer,
           (SELECT bez_kenmerkwaarde_waarde
              FROM bez_kenmerkwaarde kw
             WHERE     bez_kenmerk_key = 1004
                   AND kw.bez_bezoekers_key = b.bez_bezoekers_key)
               reden
      FROM fac_tracking             t,
           fac_srtnotificatie       sn,
           bez_bezoekers            b,
           bez_afspraak             a,
           alg_locatie              l,
           prs_v_perslid_fullnames  pfg,
           prs_v_perslid_fullnames  pfh,
           prs_v_perslidwerkplek_gegevens pwpg,
           alg_locatie              wpl
     WHERE     t.fac_srtnotificatie_key = sn.fac_srtnotificatie_key
           AND (   fac_srtnotificatie_code = 'CUST05'
                OR fac_srtnotificatie_code = 'CUST04')
           AND t.fac_tracking_refkey = b.bez_bezoekers_key
           AND b.bez_afspraak_key = a.bez_afspraak_key
           AND a.alg_locatie_key = l.alg_locatie_key
           AND t.prs_perslid_key = pfg.prs_perslid_key
           AND a.bez_afspraak_host_key = pfh.prs_perslid_key
           AND b.prs_perslid_key = pwpg.prs_perslid_key(+)
           AND pwpg.alg_locatie_key = wpl.alg_locatie_key(+);

-- Notificatie naar mensen die geen autorisator opgegeven hebben tijdens het boeken van een parkeerplaats.
CREATE OR REPLACE VIEW ykpn_v_noti_ongeldige_pp
(
    CODE,
    SENDER,
    RECEIVER,
    TEXT,
    KEY,
    XKEY
)
AS
    SELECT DISTINCT
           'CUST06',
           NULL,
           bez_afspraak_contact_key,
              'Ongeldige parkeerplaatsaanvraag bij bezoek '
           || a.bez_afspraak_key
           || ' op '
           || TO_CHAR (a.bez_afspraak_datum, 'dd-mm-yy hh24:mi'),
           a.bez_afspraak_key,
           NULL
      FROM bez_bezoekers b, bez_afspraak a, res_rsv_deel rrd
     WHERE     b.bez_afspraak_key = a.bez_afspraak_key
           AND rrd.bez_bezoekers_key = b.bez_bezoekers_key
           AND rrd.res_rsv_deel_verwijder IS NULL
           AND NOT EXISTS
                   (SELECT bez_kenmerkwaarde_key
                      FROM bez_kenmerkwaarde kw
                     WHERE     kw.bez_kenmerk_key = 1020
                           AND kw.bez_bezoekers_key = b.bez_bezoekers_key) -- pincode
           AND NOT EXISTS
                   (SELECT bez_kenmerkwaarde_key
                      FROM bez_kenmerkwaarde kw
                     WHERE     kw.bez_kenmerk_key = 1003
                           AND kw.bez_bezoekers_key = b.bez_bezoekers_key) -- autorisator
           AND rrd.res_rsv_deel_aanmaak BETWEEN (SELECT   fac_notificatie_job_nextrun
                                                        -   fac_notificatie_job_interval
                                                          / 24
                                                   FROM fac_notificatie_job
                                                  WHERE fac_notificatie_job_view =
                                                        'YKPN_V_NOTI_ONGELDIGE_PP')
                                            AND (SELECT fac_notificatie_job_nextrun
                                                   FROM fac_notificatie_job
                                                  WHERE fac_notificatie_job_view =
                                                        'YKPN_V_NOTI_ONGELDIGE_PP');

-----------------------------------------
-- Koppeling met Strukton
-----------------------------------------

CREATE OR REPLACE PROCEDURE ykpn_import_opdrstat_strukton (
   p_import_key IN NUMBER)
AS
   c_delim                VARCHAR2 (1) := ';';
   v_newline              VARCHAR2 (4000);                       -- Input line
   v_errormsg             VARCHAR2 (1000);
   oracle_err_num         NUMBER;
   oracle_err_mes         VARCHAR2 (200);
   v_aanduiding           VARCHAR2 (4000);
   v_dummy                VARCHAR2 (200);
   header_is_valid        NUMBER := 0;
   v_count                NUMBER;
   v_count_tot            NUMBER (10) := 0;
   v_count_import         NUMBER (10) := 0;
   v_ongeldig             NUMBER (1) := 0;
   -- De importvelden
   v_mld_opdr_opmerking   VARCHAR2 (4000);
   v_mld_opdr_key         NUMBER (10);
   v_mld_opdr_key_tekst   VARCHAR2 (100);
   v_extern_nummer        VARCHAR2 (100);
   v_status               NUMBER (10);
   v_status_tekst         VARCHAR2 (100);
   v_status_code          VARCHAR2 (100);
   v_datumtijd            DATE;
   v_datumtijd_tekst      VARCHAR2 (100);
   v_opmerking            VARCHAR2 (4000);
   v_totaal               NUMBER (8,2);
   v_totaal_str           VARCHAR2 (100);

   -- Overige velden:
   CURSOR c1
   IS
        SELECT *
          FROM fac_imp_file
         WHERE fac_import_key = p_import_key
      ORDER BY fac_imp_file_index;
BEGIN
   -- Eerst opruiming
   DELETE FROM ykpn_imp_opdrstat_strukton;

   COMMIT;

   FOR rec1 IN c1
   LOOP
      BEGIN
         v_newline := rec1.fac_imp_file_line;
         v_errormsg := 'Fout opvragen te importeren rij';
         v_aanduiding := '';
         v_ongeldig := 0;

         fac.imp_getfield (v_newline, c_delim, v_mld_opdr_key_tekst);
         fac.imp_getfield (v_newline, c_delim, v_extern_nummer);
         fac.imp_getfield (v_newline, c_delim, v_status_code);       -- typeID
         fac.imp_getfield (v_newline, c_delim, v_datumtijd_tekst);
         fac.imp_getfield (v_newline, c_delim, v_status_tekst);
         fac.imp_getfield (v_newline, c_delim, v_opmerking);
         fac.imp_getfield (v_newline, c_delim, v_totaal_str);
         v_totaal := fac.safe_to_number(v_totaal_str);

         fac.imp_writelog (p_import_key, 'I', 'v_totaal_str:' || v_totaal_str || ' v_totaal:' || v_totaal || ' fac.safe_to_number(v_totaal_str):' || fac.safe_to_number(v_totaal_str),'');

         --v_opmerking := substr(v_opmerking, 1, 1000);
         -- verwijder de markering voor cr/lf die we zelf in de stylesheet toegevoegd hebben.
         v_opmerking := replace(v_opmerking, '@@',CHR (13) || CHR (10));
         v_aanduiding :=
               '['
            || v_extern_nummer
            || '|'
            || v_mld_opdr_key_tekst
            || '|'
            || v_status_tekst
            || '|'
            || SUBSTR(v_opmerking,1,300)
            || '] ';

         -- Ik controleer of ik een geldige header heb, dat is: in de juiste kolommen
         -- de juiste kolomkop. Ik controleer daarbij ALLE kolommen!
         -- Ik negeer alles totdat ik een geldige header ben gepasseerd.
         IF (header_is_valid = 0)
         THEN
            IF     UPPER (TRIM (v_mld_opdr_key_tekst)) = 'REFERENCEID'
               AND UPPER (TRIM (v_extern_nummer)) = 'SERVICEREQUESTID'
               AND UPPER (TRIM (v_status_code)) = 'TYPEID'
               AND UPPER (TRIM (v_datumtijd_tekst)) = 'DATETIME'
               AND UPPER (TRIM (v_opmerking)) = 'REMARKS'
               AND UPPER (TRIM (v_totaal_str)) = 'TOTAL'
            THEN
               header_is_valid := 1;
            END IF;
         ELSE
            v_count_tot := v_count_tot + 1;
            -- Controleer alle veldwaarden
            v_errormsg := 'Fout inlezen mld_opdr_key [' || v_aanduiding || ']';
            v_mld_opdr_key := TRIM (v_mld_opdr_key);

            BEGIN
               SELECT o.mld_opdr_key, o.mld_opdr_opmerking
                 INTO v_mld_opdr_key, v_mld_opdr_opmerking
                 FROM mld_opdr o, mld_melding m, ins_tab_discipline d, ins_srtdiscipline sd, mld_stdmelding std
                WHERE o.mld_melding_key = m.mld_melding_key
                  AND m.mld_stdmelding_key = std.mld_stdmelding_key
                  AND std.mld_ins_discipline_key = d.ins_discipline_key
                  AND d.ins_srtdiscipline_key = sd.ins_srtdiscipline_key
                  AND sd.ins_srtdiscipline_prefix || m.mld_melding_key || '/' || o.mld_opdr_bedrijfopdr_volgnr = v_mld_opdr_key_tekst;

            EXCEPTION WHEN NO_DATA_FOUND THEN
               BEGIN
                 fac.imp_writelog (p_import_key, 'W',  'Opdracht kan niet gevonden worden. [' || v_aanduiding || ']', '');

               -- kijk nu of de opdracht gevonden kan worden a.d.h.v het Struktonnummer
               SELECT o.mld_opdr_key, o.mld_opdr_opmerking
                 INTO v_mld_opdr_key, v_mld_opdr_opmerking
                 FROM mld_opdr o, mld_kenmerkopdr ko, mld_kenmerk k
                WHERE o.mld_opdr_key = ko.mld_opdr_key
                  AND ko.mld_kenmerk_key = k.mld_kenmerk_key
                  AND k.mld_srtkenmerk_key = 35
                  AND ko.mld_kenmerkopdr_waarde = v_extern_nummer;

               EXCEPTION WHEN OTHERS THEN
                  v_ongeldig := 1;
                  v_errormsg := 'Opdracht kan niet gevonden worden (intern/externnr).  [' || v_aanduiding || ']';
                  v_mld_opdr_key := NULL;
               END;
            END;

            IF v_ongeldig = 0
            THEN
               v_errormsg :=
                  'Fout bij bepalen status [' || v_aanduiding || ']';

               CASE
                  WHEN v_status_code = '5'
                  THEN
                     v_status := 5;                              -- uitgegeven
                  WHEN v_status_code = '10'
                  THEN
                     v_status := 8;                            -- geaccepteerd
                  WHEN v_status_code = '20'                  -- monteur gereed
                  THEN
                     v_status := 6;                                -- afgemeld
                  WHEN v_status_code = '25'               -- specialist gereed
                  THEN
                     v_status := 6;                                -- afgemeld
                  WHEN v_status_code = '30'                -- technisch gereed
                  THEN
                     v_status := 6;                                -- afgemeld
             --   YKPN#32991
             --     WHEN v_status_code = '40'                     -- uitgeprijst
             --     THEN
             --        v_status := 9;                                -- afgerond
                  WHEN v_status_code = '70'
                  THEN
                     v_status := 1;                             -- geannuleerd
                  WHEN v_status_code = '80'
                  THEN
                     v_status := 1;                               -- afgewezen
                  ELSE
                     v_status := NULL;
                     v_ongeldig := 1;   -- nog te bezien.
               END CASE;
            END IF;

            -- Lees alle veldwaarden
            IF v_ongeldig = 0
            THEN
               v_errormsg :=
                  'Fout bij converteren datumtijd [' || v_aanduiding || ']';
               v_datumtijd :=
                  fac.safe_to_date (
                     REPLACE (
                        SUBSTR (v_datumtijd_tekst,
                                1,
                                INSTR (v_datumtijd_tekst, '.') - 1),
                        'T',
                        ' '),
                     'yyyy-mm-dd hh24:mi:ss');

               IF v_datumtijd = NULL
               THEN
                  v_ongeldig := 0;
               END IF;
            END IF;

            IF v_ongeldig = 0
            THEN
               v_errormsg :=
                  'Fout bij aanvullen opmerking [' || v_aanduiding || ']';

               -- controleer of de opmerking niet leeg is en of dezelfde opmerking al bij een eerdere statusovergang
               -- gemeld is.
               IF v_opmerking IS NOT NULL AND INSTR(COALESCE(v_mld_opdr_opmerking, 'QueQuLeQue'), v_opmerking) = 0
               THEN
                  v_opmerking := SUBSTR(
                        '['
                     || v_datumtijd_tekst
                     || '] - '
                     || v_status_tekst
                     || CHR (13)
                     || CHR (10)
                     || v_opmerking, 1, 3900);
               ELSE
                  v_opmerking :=
                     '[' || v_datumtijd_tekst || '] - ' || v_status_tekst;
               END IF;
            END IF;

            -- Insert geformatteerde import record
            IF (v_ongeldig = 0)
            THEN
               BEGIN
                  v_errormsg :=
                        'Fout toevoegen opdracht status ['
                     || v_aanduiding
                     || ']';

                  INSERT INTO ykpn_imp_opdrstat_strukton (mld_opdr_key,
                                                          extern_nummer,
                                                          status,
                                                          datumtijd,
                                                          opmerking,
                                                          totaal)
                      VALUES (v_mld_opdr_key,
                              v_extern_nummer,
                              v_status,
                              v_datumtijd,
                              v_opmerking,
                              v_totaal);

                  v_count_import := v_count_import + 1;
               EXCEPTION
                  WHEN OTHERS
                  THEN
                     oracle_err_num := SQLCODE;
                     oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
                     v_errormsg :=
                           v_errormsg
                        || ' ORACLE (error '
                        || oracle_err_num
                        || '/'
                        || oracle_err_mes
                        || ')';
                     fac.imp_writelog (
                        p_import_key,
                        'E',
                        v_aanduiding || v_errormsg,
                        'Fout bij toevoegen regel aan importtabel ykpn_imp_opdr_status_strukton.');
               END;
            ELSE
               fac.imp_writelog (p_import_key,
                                 'E',
                                 v_errormsg,
                                 '');
            END IF;
         END IF;
      END;
   END LOOP;

   IF (header_is_valid = 0)
   THEN
      fac.imp_writelog (p_import_key,
                        'E',
                        'Ongeldig importbestand',
                        'Geen header of header niet volgens specificatie!');
   END IF;

   COMMIT;
EXCEPTION
   WHEN OTHERS
   THEN
      oracle_err_num := SQLCODE;
      oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
      v_errormsg :=
            v_errormsg
         || 'ORACLE (error '
         || oracle_err_num
         || '/'
         || oracle_err_mes
         || ')';
      fac.imp_writelog (p_import_key,
                        'E',
                        SUBSTR(v_aanduiding || v_errormsg, 1, 1000),
                        'Inleesproces opdrachtstatusberichten afgebroken!');
END;
/




CREATE OR REPLACE PROCEDURE ykpn_update_opdrstat_strukton (
   p_import_key IN NUMBER)
AS
   -- Cursor loopt - in volgorde! - over alle ingelezen opdrachtstatusberichten.
   CURSOR c1
   IS
        SELECT mld_opdr_key,
               extern_nummer,
               datumtijd,
               status,
               opmerking,
               totaal
          FROM ykpn_imp_opdrstat_strukton
      ORDER BY 1, 3;

   CURSOR cp (
      c_opdr_key IN NUMBER)
   IS
        SELECT pf.prs_perslid_key
          FROM fac_tracking tr,
               fac_srtnotificatie str,
               prs_v_perslid_fullnames_all pf
         WHERE tr.fac_srtnotificatie_key = str.fac_srtnotificatie_key
           AND tr.prs_perslid_key = pf.prs_perslid_key(+)
           AND (str.fac_srtnotificatie_code = 'ORDFOK'
            AND tr.fac_tracking_refkey = c_opdr_key
            AND str.fac_srtnotificatie_xmlnode IN ('opdracht'))
      ORDER BY fac_tracking_datum DESC, fac_tracking_key DESC;

   v_errormsg              VARCHAR2 (1000);
   oracle_err_num          NUMBER;
   oracle_err_mes          VARCHAR2 (200);
   v_aanduiding            VARCHAR2 (200);
   v_count_tot             NUMBER (10);
   v_count                 NUMBER (10);
   v_mld_key               NUMBER (10) := 0;
   v_opdr_key              NUMBER (10) := 0;
   v_opdr_status           NUMBER (10) := 0;
   v_user_key              NUMBER (10) := 0;
   v_opdr_approved         mld_opdr.mld_opdr_approved%TYPE;
   v_approver_key          prs_perslid.prs_perslid_key%TYPE;
   v_mld_typeopdr_key      mld_typeopdr.mld_typeopdr_key%TYPE;
   v_mld_kenmerk_key       mld_kenmerk.mld_kenmerk_key%TYPE;
   v_mld_kenmerkopdr_key   mld_kenmerkopdr.mld_kenmerkopdr_key%TYPE;
   v_mld_srtkenmerk_key    mld_srtkenmerk.mld_srtkenmerk_key%TYPE;
   v_perslid_key           prs_perslid.prs_perslid_key%TYPE;
   v_opdr_kosten           mld_opdr.mld_opdr_kosten%TYPE;
   v_typeopdr_gvs          mld_typeopdr.mld_typeopdr_gvs%TYPE;
   v_mld_kk                mld_melding.mld_kosten_klant%TYPE;
   v_mld_kostenpl_key      mld_melding.prs_kostenplaats_key%TYPE;
   v_opdr_kostenpl_key     mld_opdr.prs_kostenplaats_key%TYPE;
   v_mld_perslid_key       mld_melding.prs_perslid_key%TYPE;
   v_mld_disc_key          ins_tab_discipline.ins_discipline_key%TYPE;
   v_refiat                NUMBER (1);
   v_reapprove             NUMBER (1);
BEGIN
   -- Loop door alle geimporteerde opdrachtstatusberichten en verwerk deze.
   v_count_tot := 0;

   -- Stel de key in van het srtkenmerk 'Ref. Nr. Leverancier'. Hier wordt
   -- het nummer dat Strukton aan de call gegeven heeft geregistreerd.
   v_mld_srtkenmerk_key := 18;
   v_user_key := 32652;                                          -- Strukton user

   FOR rec IN c1
   LOOP
      BEGIN
         v_aanduiding :=
               '['
            || rec.mld_opdr_key
            || '|'
            || SUBSTR (rec.opmerking, 1, 100)
            || '] ';
         v_count_tot := v_count_tot + 1;
         v_count := 0;

         -- Key van melding/opdracht bepalen en externnr bij opdracht opslaan.
         IF (rec.mld_opdr_key IS NOT NULL)
         THEN
            v_errormsg := 'Fout bij bepalen opdracht.';

            SELECT mld_melding_key,
                   mld_opdr_key,
                   mld_statusopdr_key,
                   mld_typeopdr_key
              INTO v_mld_key,
                   v_opdr_key,
                   v_opdr_status,
                   v_mld_typeopdr_key
              FROM mld_opdr
             WHERE mld_opdr_key = rec.mld_opdr_key;

            v_errormsg := 'Fout bij bepalen kenmerk extern nummer.';

            SELECT k.mld_kenmerk_key
              INTO v_mld_kenmerk_key
              FROM mld_kenmerk k
             WHERE k.mld_srtkenmerk_key = v_mld_srtkenmerk_key
               AND k.mld_typeopdr_key = v_mld_typeopdr_key;

            v_errormsg := 'Fout bij bepalen kenmerkopdracht extern nummer.';

            SELECT MAX (ko.mld_kenmerkopdr_key)
              INTO v_mld_kenmerkopdr_key
              FROM mld_kenmerkopdr ko
             WHERE ko.mld_opdr_key = v_opdr_key
               AND v_mld_kenmerk_key = ko.mld_kenmerk_key;

            v_errormsg := 'Fout bij aanpassen extern nummer.';

            IF v_mld_kenmerkopdr_key IS NULL
            THEN
               -- kenmerk toevoegen
               INSERT INTO mld_kenmerkopdr (mld_kenmerk_key,
                                            mld_opdr_key,
                                            mld_kenmerkopdr_waarde)
                   VALUES (v_mld_kenmerk_key, v_opdr_key, rec.extern_nummer);
            ELSE
               -- kenmerk aanpassen
               UPDATE mld_kenmerkopdr
                  SET mld_kenmerkopdr_waarde = rec.extern_nummer
                WHERE mld_kenmerkopdr_key = v_mld_kenmerkopdr_key;
            END IF;

            v_errormsg := 'Fout bij bijwerken opdracht-opmerking.';

            v_count := LENGTH (rec.opmerking) + 5; -- Beetje speling qua lengte!

            UPDATE mld_opdr
               SET mld_opdr_opmerking =
                      DECODE (
                         mld_opdr_opmerking,
                         NULL,
                         rec.opmerking,
                            rec.opmerking
                         || CHR (13)
                         || CHR (10)
                         || SUBSTR (mld_opdr_opmerking, 1, (4000 - v_count)))
             WHERE mld_opdr_key = v_opdr_key;

            IF v_opdr_status <> rec.status
            THEN
               IF rec.status = 8 AND v_opdr_status = 5
               THEN
                  -- Accepteer opdracht als de opdracht uitgegeven was
                  mld.setopdrachtstatus (v_opdr_key, 8, v_user_key); -- Facilitor
               ELSIF rec.status = 6 AND v_opdr_status = 5
               THEN
                  -- Meld de opdracht af als deze uitgegeven was
                  mld.setopdrachtstatus (v_opdr_key, 8, v_user_key); -- Facilitor, eerst accepteren
                  mld.setopdrachtstatus (v_opdr_key, 6, v_user_key); -- Facilitor
               ELSIF rec.status = 6 AND v_opdr_status = 8
               THEN
                  -- Meld de opdracht af als deze geaccepteerd was
                  mld.setopdrachtstatus (v_opdr_key, 6, v_user_key); -- Facilitor
               ELSIF rec.status = 1 AND v_opdr_status = 5
               THEN
                  -- Opdracht is afgewezen op het moment dat de opdracht nog niet geaccepteerd is.
                  mld.setopdrachtstatus (v_opdr_key, 1, v_user_key); -- Facilitor
                  mld.updatemeldingstatusav (v_mld_key,
                                             0,
                                             v_user_key,
                                             0);
               ELSIF rec.status = 1 AND v_opdr_status = 8
               THEN
                  -- Opdracht is afgewezen op het moment dat de opdracht al geaccepteerd is.
                  mld.setopdrachtstatus (v_opdr_key, 6, v_user_key); -- Facilitor
               --MLD.updatemeldingstatusAV (v_mld_key, 0, v_user_key, 0);
               ELSIF rec.status = 9 AND v_opdr_status = 6
               THEN
                  -- Opdracht is afgerond en opdrachtstatus was afgemeld.
                  mld.setopdrachtstatus (v_opdr_key, 9, v_user_key); -- Facilitor
               END IF;

               IF rec.status = 6 AND v_opdr_status <> 6
               THEN
                  -- Sinds AADO#30922 wordt de melding niet meer automatisch afgemeld.
                  MLD.updatemeldingstatusAV (v_mld_key, 0, v_user_key, 0);
               ELSE
                  IF rec.status = 9 AND v_opdr_status <> 9
                  THEN
                     -- Oorspronkelijke gegevens opdracht ophalen.
                     -- var opdr_info = mld.mld_opdr_info(opdr_key);
                     SELECT mld_opdr_kosten,
                            mld_typeopdr_gvs,
                            mld_kosten_klant,
                            m.prs_kostenplaats_key,
                            o.prs_kostenplaats_key,
                            m.prs_perslid_key,
                            std.mld_ins_discipline_key
                       INTO v_opdr_kosten,
                            v_typeopdr_gvs,
                            v_mld_kk,
                            v_mld_kostenpl_key,
                            v_opdr_kostenpl_key,
                            v_mld_perslid_key,
                            v_mld_disc_key
                       FROM mld_opdr o,
                            mld_melding m,
                            mld_typeopdr t,
                            mld_stdmelding std
                      WHERE o.mld_melding_key = m.mld_melding_key
                        AND m.mld_stdmelding_key = std.mld_stdmelding_key
                        AND o.mld_typeopdr_key = t.mld_typeopdr_key
                        AND o.mld_opdr_key = v_opdr_key;

                     -- Hergoedkeuring (Ter goedkeuring) wordt (pas) vereist als het opdrachtbedrag hoger is dan al is goedgekeurd en boven de GVS-grens uitkomt.
                     -- Herfiattering (Ter fiattering) wordt (pas) vereist indien het bedrag boven het mandaat van de oorspronkelijke (laatste) fiatteur uitkomt
                     -- en boven de GVS-grens uitkomt.
                     -- Hergoedkeuring en herfiattering kan alleen als het totaalbedrag van de opdracht is verhoogd en alleen in de statussen 5, 8, 6 en 9 (de uitvoeringsfase en de afhandelingsfase).
                     -- Hergoedkeuring en herfiattering kan leiden tot een tijdelijke terugkeer naar de voorfase status 3 of 10.
                     IF rec.totaal > v_opdr_kosten
                     THEN
                        fac.imp_writelog (p_import_key, 'I', 'rec.totaal > v_opdr_kosten: ' || rec.totaal || ' - ' || v_opdr_kosten, '');

                        -- Hergoedkeuring (Ter goedkeuring) wordt (pas) vereist als het opdrachtbedrag hoger is dan al is goedgekeurd en boven de GVS-grens uitkomt.
                        IF rec.totaal > COALESCE (v_opdr_approved, 0) AND rec.totaal > v_typeopdr_gvs
                        THEN
                           v_reapprove := 1;
                        ELSE
                           v_reapprove := 0;
                        END IF;

                        fac.imp_writelog (p_import_key, 'I', 'hergoedkeuring: ' || v_reapprove || ' - ' || v_opdr_approved || ' - ' || v_typeopdr_gvs, '');


                        -- Herfiattering (Ter fiattering) wordt (pas) vereist indien het bedrag boven het mandaat van de oorspronkelijke (laatste) fiatteur uitkomt
                        -- en boven de GVS-grens uitkomt.
                        -- Bepaal het mandaat van de oorspronkelijke (laatste) fiatteur.
                        -- Ook als er de vorige keer geen kosten waren dan moet pas worden geherfiatteerd als (tot_kosten > mandaat),
                        -- waarbij de mandaat van de Melder/aanvrager van melding of de user is.
                        v_perslid_key := NULL;

                        IF rec.totaal > v_opdr_kosten AND rec.totaal > 0 AND rec.totaal > v_typeopdr_gvs
                        THEN
                           fac.imp_writelog (p_import_key, 'I', 'F - rec.totaal > v_opdr_kosten: ' || rec.totaal || ' - ' || v_opdr_kosten || ' - ' || v_typeopdr_gvs, '');
                           -- De totale kosten zijn verhoogd en het bedrag zit boven de GVS-grens.
                           -- Bepaling oorspronkelijke (laatste) fiatteur, als die er was.
                           v_perslid_key := NULL;

                           FOR rec2 IN cp (v_opdr_key)
                           LOOP
                              BEGIN
                                 v_perslid_key := rec2.prs_perslid_key;
                              END;
                           END LOOP;

                           fac.imp_writelog (p_import_key, 'I', 'F - laatste fiatteur: ' || v_perslid_key, '');

                           IF v_perslid_key IS NULL
                           THEN
                              -- Dan waren de opdracht kosten onder het mandaat van mijzelf of de BO-medewerker.
                              -- Als de kostenplaats bij de opdracht overruled is dan wordt altijd tegen het profiel van de BO-medewerker getest.
                              IF v_mld_kk = 1
                             AND v_mld_kostenpl_key = v_opdr_kostenpl_key
                              THEN
                                 v_perslid_key := v_mld_perslid_key; -- Melder/aanvrager van melding
                              END IF;
                           END IF;

                           fac.imp_writelog (p_import_key, 'I', 'F - indien onbekend terugvallen op melder: ' || v_perslid_key, '');


                           IF    fac.getsetting ('mld_use_order_approval') = 1
                             AND (rec.totaal >
                                     fac.getsetting ('can_selfapprove')
                               OR rec.totaal >
                                     prs.getprofiellimiet (v_perslid_key, v_mld_disc_key))
                           THEN
                              -- Er moet (opnieuw) gefiatteerd worden. Is er wel iemand met voldoende mandaat? Indien er niemand gevonden kan worden mag de wijziging niet doorgaan.
                              -- Het mandaat is al te hoog voor de melder/aanvrager van de melding of mijzelf.

                              v_approver_key :=
                                 prs.getkpverantwoordelijke (
                                    v_opdr_kostenpl_key,
                                    fac.getsetting ('prs_approvemethod'),
                                    v_user_key);
                              v_refiat := 1;
                              -- er moet (her)fiattering plaatsvinden
                              fac.imp_writelog (p_import_key, 'I', 'F - (her)fiatteur: ' || v_approver_key, '');
                           END IF;
                        END IF;
                     END IF;

                     IF v_reapprove = 1 OR v_refiat = 1
                     THEN
                        -- Zet de refiat waarden. Het hergoedkeurings- en/of herfiatteringstraject wordt opnieuw ingegaan. // Tracking hiervan is niet nodig.
                        IF v_opdr_kosten > 0
                        THEN
                           UPDATE mld_opdr
                              SET mld_opdr_materiaal_refiat = mld_opdr_materiaal,
                                  mld_opdr_kosten_refiat = mld_opdr_kosten
                            WHERE mld_opdr_key = v_opdr_key;
                        END IF;

                        -- Ook voor status 5 wordt refiatstatus gezet zodat bekend is dat het om een herfiattering gaat. De fiatteringsvoorwaarde is dan iets anders.
                        UPDATE mld_opdr
                           SET mld_statusopdr_key_refiat = mld_statusopdr_key
                         WHERE mld_opdr_key = v_opdr_key;

                        -- Goedkeuring opnieuw ingaan kan alleen als het approved bedrag leeg is.
                        UPDATE mld_opdr
                           SET mld_opdr_approved_refiat = mld_opdr_approved
                         WHERE mld_opdr_key = v_opdr_key;

                        UPDATE mld_opdr
                           SET mld_opdr_approved = NULL,
                               mld_opdr_materiaal = rec.totaal,
                               mld_opdr_kosten = rec.totaal
                         WHERE mld_opdr_key = v_opdr_key;
                     ELSE
                        UPDATE mld_opdr
                           SET mld_opdr_materiaal = rec.totaal,
                               mld_opdr_kosten  = rec.totaal
                         WHERE mld_opdr_key = v_opdr_key;
                     END IF;

                     -- geef in de tracking aan dat de kosten via de interface aangepast zijn.
                     IF v_opdr_kosten <> rec.totaal
                     THEN
                        fac.trackaction ('ORDUPD', v_opdr_key, v_user_key, SYSDATE,
                              'Gewijzigd' || CHR (13) || CHR (10)
                           || 'Materiaal: ' || v_opdr_kosten || ' --> ' || rec.totaal || CHR (13) || CHR (10)
                           || 'Totaal: ' || v_opdr_kosten || ' --> ' || rec.totaal);
                     END IF;

                     IF v_reapprove = 1
                     THEN
                        -- Zetten van de status van de gewijzigde opdracht op "Ter goedkeuring" en afhandelen van de tracking (status + uitvoerende tracking) en daarmee notificatie.
                        -- status = 10;  Ter goedkeuring.
                        mld.setopdrachtstatus (v_opdr_key, 10, v_user_key);
                     ELSE
                        IF v_refiat = 1
                        THEN
                           -- Zetten van de status van de gewijzigde opdracht op "Ter fiattering" en afhandelen van de tracking (status + uitvoerende tracking) en daarmee notificatie.
                           -- status = 3; // Ter fiattering.
                           mld.setopdrachtstatus (v_opdr_key, 3, v_user_key);
                        END IF;
                     END IF;
                  END IF;
               END IF;
            END IF;
         END IF;

         COMMIT;
      EXCEPTION
         WHEN OTHERS
         THEN
            oracle_err_num := SQLCODE;
            oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
            v_errormsg :=
                  v_errormsg
               || ' ORACLE (error '
               || oracle_err_num
               || '/'
               || oracle_err_mes
               || ')';
            fac.imp_writelog (p_import_key,
                              'E',
                              v_aanduiding || v_errormsg,
                              'Fout bij verwerken opdrachtstatusbericht.');
      END;
   END LOOP;

   COMMIT;
END;
/

-- Importeren KPN Retail winkels
CREATE OR REPLACE PROCEDURE ykpn_import_loc_retail (p_import_key IN NUMBER)
AS
    c_fielddelimitor         VARCHAR2 (1) := ';';
    v_newline                VARCHAR2 (1000);                    -- Input line
    v_errormsg               VARCHAR2 (1000);
    v_error_hint             VARCHAR2 (1000);
    oracle_err_num           NUMBER;
    oracle_err_mes           VARCHAR2 (200);
    header_is_valid          NUMBER;
    v_count                  NUMBER;
    v_key                    NUMBER;
    v_dummy                  VARCHAR2 (100);
    v_ongeldig               NUMBER (1);
    v_aanduiding             VARCHAR2 (200);
    v_all_null               BOOLEAN;
    v_count_error            NUMBER (10);
    v_count_tot              NUMBER (10);
    v_count_import           NUMBER (10);
    -- De importvelden:
    v_locatie_code           VARCHAR2 (100);
    v_formule                VARCHAR2 (100);
    v_formule_aanduiding     VARCHAR2 (100);
    v_locatie_omschrijving   VARCHAR2 (100);
    v_locatie_adres          VARCHAR2 (100);
    v_locatie_postcode       VARCHAR2 (100);
    v_locatie_plaats         VARCHAR2 (100);
    v_email                  VARCHAR2 (100);
    v_manager_naam           VARCHAR2 (100);
    v_manager_mobiel         VARCHAR2 (100);
    v_regio                  VARCHAR2 (100);
    v_regio_manager          VARCHAR2 (100);
    v_centercode             VARCHAR2 (100);
    v_res_nummer             VARCHAR2 (100);
    v_x_coord                VARCHAR2 (100);
    v_y_coord                VARCHAR2 (100);

    CURSOR c
    IS
          SELECT *
            FROM fac_imp_file
           WHERE fac_import_key = p_import_key
        ORDER BY fac_imp_file_index;
BEGIN
    COMMIT;
    v_count_error := 0;
    header_is_valid := 0;
    v_count_tot := 0;
    v_count_import := 0;

    FOR rec IN c
    LOOP
        BEGIN
            v_error_hint := 'Fout FETCH te importeren rij';
            v_ongeldig := 0;
            v_newline := rec.fac_imp_file_line;
            v_error_hint := 'Fout opvragen te importeren rij';
            v_aanduiding := '';

            -- Lees alle veldwaarden
            fac.imp_getfield_nr (v_newline,
                                 c_fielddelimitor,
                                 1,
                                 v_locatie_code);
            fac.imp_getfield_nr (v_newline,
                                 c_fielddelimitor,
                                 2,
                                 v_formule);
            fac.imp_getfield_nr (v_newline,
                                 c_fielddelimitor,
                                 3,
                                 v_formule_aanduiding);
            fac.imp_getfield_nr (v_newline,
                                 c_fielddelimitor,
                                 4,
                                 v_locatie_omschrijving);
            fac.imp_getfield_nr (v_newline,
                                 c_fielddelimitor,
                                 5,
                                 v_locatie_adres);
            fac.imp_getfield_nr (v_newline,
                                 c_fielddelimitor,
                                 6,
                                 v_dummy);                       -- Huisnummer
            v_locatie_adres := v_locatie_adres || ' ' || TRIM (v_dummy);
            fac.imp_getfield_nr (v_newline,
                                 c_fielddelimitor,
                                 7,
                                 v_dummy);                       -- Toevoeging

            IF v_dummy IS NOT NULL
            THEN
                IF fac.safe_to_number (v_dummy) IS NULL
                THEN
                    v_locatie_adres := v_locatie_adres || v_dummy;
                ELSE
                    v_locatie_adres := v_locatie_adres || '-' || v_dummy;
                END IF;
            END IF;

            fac.imp_getfield_nr (v_newline,
                                 c_fielddelimitor,
                                 8,
                                 v_locatie_postcode);
            fac.imp_getfield_nr (v_newline,
                                 c_fielddelimitor,
                                 11,
                                 v_locatie_plaats);
            fac.imp_getfield_nr (v_newline,
                                 c_fielddelimitor,
                                 16,
                                 v_email);
            fac.imp_getfield_nr (v_newline,
                                 c_fielddelimitor,
                                 17,
                                 v_manager_naam);
            fac.imp_getfield_nr (v_newline,
                                 c_fielddelimitor,
                                 18,
                                 v_dummy);                   -- tussenvoegsels

            IF v_dummy IS NOT NULL
            THEN
                v_manager_naam := v_manager_naam || ' ' || v_dummy;
            END IF;

            fac.imp_getfield_nr (v_newline,
                                 c_fielddelimitor,
                                 19,
                                 v_dummy);                       -- achternaam
            v_manager_naam := v_manager_naam || ' ' || v_dummy;
            fac.imp_getfield_nr (v_newline,
                                 c_fielddelimitor,
                                 20,
                                 v_manager_mobiel);
            fac.imp_getfield_nr (v_newline,
                                 c_fielddelimitor,
                                 22,
                                 v_regio);
            fac.imp_getfield_nr (v_newline,
                                 c_fielddelimitor,
                                 24,
                                 v_regio_manager);
            fac.imp_getfield_nr (v_newline,
                                 c_fielddelimitor,
                                 26,
                                 v_centercode);
            fac.imp_getfield_nr (v_newline,
                                 c_fielddelimitor,
                                 50,
                                 v_x_coord);
            fac.imp_getfield_nr (v_newline,
                                 c_fielddelimitor,
                                 51,
                                 v_y_coord);

            v_aanduiding :=
                   v_locatie_code
                || '|'
                || v_locatie_omschrijving
                || '|'
                || v_locatie_plaats
                || '| ';

            v_count_tot := v_count_tot + 1;


            -- Insert geformatteerde import record
            IF header_is_valid = 0
            THEN
                IF     UPPER (v_locatie_code) = 'WINKELNUMMER'
                   AND UPPER (v_locatie_omschrijving) = 'LOCATIE'
                   AND UPPER (v_x_coord) = 'LATITUDE'
                THEN
                    header_is_valid := 1;

                    DELETE FROM ykpn_imp_loc_retail;
                ELSE
                    IF rec.fac_imp_file_index = 1
                    THEN
                        fac.imp_writelog (
                            p_import_key,
                            'E',
                            'Geen geldige header aangetroffen',
                               v_locatie_code
                            || '-'
                            || v_locatie_omschrijving
                            || '-'
                            || v_x_coord);
                    END IF;
                END IF;
            ELSE
                v_error_hint := 'Fout bij zoeken naar formule';

                BEGIN
                    SELECT fac_usrdata_key
                      INTO v_key
                      FROM fac_usrdata ud
                     WHERE     UPPER (v_formule) =
                               UPPER (ud.fac_usrdata_omschr)
                           AND ud.fac_usrtab_key = 241;

                    v_formule := v_key;
                EXCEPTION
                    WHEN NO_DATA_FOUND
                    THEN
                        fac.imp_writelog (
                            p_import_key,
                            'E',
                            'Formule niet gevonden:' || v_formule,
                            v_aanduiding);
                        v_ongeldig := 1;
                END;

                v_error_hint := 'Fout bij zoeken naar formule aanduiding';

                IF v_formule_aanduiding IS NOT NULL
                THEN
                    BEGIN
                        SELECT fac_usrdata_key
                          INTO v_key
                          FROM fac_usrdata ud
                         WHERE     UPPER (v_formule_aanduiding) =
                                   UPPER (ud.fac_usrdata_omschr)
                               AND ud.fac_usrtab_key = 242;

                        v_formule_aanduiding := v_key;
                    EXCEPTION
                        WHEN NO_DATA_FOUND
                        THEN
                            fac.imp_writelog (
                                p_import_key,
                                'E',
                                   'Formule aanduiding niet gevonden:'
                                || v_formule_aanduiding,
                                v_aanduiding);
                            v_ongeldig := 1;
                    END;
                END IF;

                v_error_hint := 'Fout bij zoeken naar regio';

                IF v_regio IS NOT NULL
                THEN
                    BEGIN
                        SELECT alg_district_key
                          INTO v_key
                          FROM alg_district
                         WHERE     UPPER (v_regio) =
                                   UPPER (alg_district_omschrijving)
                               AND alg_regio_key = 21;               -- Retail

                        v_regio := v_key;
                    EXCEPTION
                        WHEN NO_DATA_FOUND
                        THEN
                            fac.imp_writelog (
                                p_import_key,
                                'E',
                                   'Formule aanduiding niet gevonden:'
                                || v_formule_aanduiding,
                                v_aanduiding);
                            v_ongeldig := 1;
                    END;
                END IF;


                v_error_hint := 'Fout bij zoeken naar regio manager';

                BEGIN
                    -- We zoeken naar het gedeelte voor het @ teken. Managers hebben nog wel eens een @telfort of @kpn domein.
                    SELECT prs_perslid_key
                      INTO v_key
                      FROM prs_perslid
                     WHERE     UPPER (SUBSTR(prs_perslid_email, 1, INSTR(prs_perslid_email, '@'))) =
                               UPPER (SUBSTR(v_regio_manager, 1, INSTR(v_regio_manager, '@')))
                           AND prs_perslid_verwijder IS NULL;

                    v_regio_manager := v_key;
                EXCEPTION
                    WHEN NO_DATA_FOUND
                    THEN
                        fac.imp_writelog (
                            p_import_key,
                            'E',
                            'Regio manager niet gevonden:' || v_regio_manager,
                            v_aanduiding);
                     v_ongeldig := 1;
                END;

                IF v_ongeldig = 0
                THEN
                    v_error_hint := 'Fout bij toevoegen te impoteren locatie';

                    INSERT INTO ykpn_imp_loc_retail (
                                    alg_locatie_code,
                                    formule,
                                    formule_aanduiding,
                                    alg_locatie_omschrijving,
                                    alg_locatie_adres,
                                    alg_locatie_postcode,
                                    alg_locatie_plaats,
                                    email,
                                    manager_naam,
                                    manager_mobiel,
                                    regio,
                                    regio_manager,
                                    centercode,
                                    x_coord,
                                    y_coord)
                             VALUES (
                                        SUBSTR (v_locatie_code, 1, 10),
                                        FAC.safe_to_number (v_formule),
                                        FAC.safe_to_number (
                                            v_formule_aanduiding),
                                        SUBSTR (v_locatie_omschrijving,
                                                1,
                                                60),
                                        SUBSTR (v_locatie_adres, 1, 50),
                                        SUBSTR (v_locatie_postcode, 1, 12),
                                        SUBSTR (v_locatie_plaats, 1, 30),
                                        SUBSTR (v_email, 1, 100),
                                        SUBSTR (v_manager_naam, 1, 30),
                                        SUBSTR (v_manager_mobiel, 1, 15),
                                        FAC.safe_to_number (v_regio),
                                        FAC.safe_to_number (v_regio_manager),
                                        SUBSTR (v_centercode, 1, 5),
                                        FAC.safe_to_number (
                                            REPLACE (v_x_coord, ',', '.')),
                                        FAC.safe_to_number (
                                            REPLACE (v_y_coord, ',', '.')));
                END IF;
            END IF;
        END;
    END LOOP;

    COMMIT;
EXCEPTION
    WHEN OTHERS
    THEN
        oracle_err_num := SQLCODE;
        oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
        v_errormsg := 'error ' || oracle_err_num || '/' || oracle_err_mes;
        fac.imp_writelog (p_import_key,
                          'E',
                          v_errormsg,
                          v_error_hint || ' ' || v_aanduiding);
END ykpn_import_loc_retail;
/


CREATE OR REPLACE PROCEDURE ykpn_update_loc_retail (p_import_key IN NUMBER)
AS
    CURSOR c
    IS
        SELECT * FROM ykpn_imp_loc_retail;

    CURSOR c_del
    IS
        SELECT l.*
          FROM alg_locatie l, alg_district d
         WHERE     l.alg_district_key = d.alg_district_key
               AND d.alg_regio_key = 21                                      -- RETAIL
               AND l.alg_locatie_verwijder IS NULL
               AND l.alg_locatie_code <> '999'
               AND NOT EXISTS
                       (SELECT alg_locatie_code
                          FROM ykpn_imp_loc_retail i
                         WHERE FAC.safe_to_number (i.alg_locatie_code) =
                               FAC.safe_to_number (l.alg_locatie_code));

    v_errormsg                 VARCHAR2 (1000);
    oracle_err_num             NUMBER;
    oracle_err_mes             VARCHAR2 (200);
    v_count_error              NUMBER (10);
    v_count                    NUMBER (10);
    v_count_tot                NUMBER (10);
    v_count_import             NUMBER (10);
    v_aanduiding               VARCHAR2 (200);
    v_errorhint                VARCHAR2 (1000);
    v_locatie_key              NUMBER (10);
    v_locatie_omschrijving     VARCHAR2 (60);
    v_formule                  VARCHAR2 (100);
    v_formule_aanduiding       VARCHAR2 (100);

BEGIN
    FOR rec IN c
    LOOP
        v_errorhint := 'Opzoeken formule';
        BEGIN
            SELECT fac_usrdata_omschr
              INTO v_formule
              FROM fac_usrdata
             WHERE fac_usrdata_key = rec.formule;

             v_locatie_omschrijving := rec.alg_locatie_omschrijving || ' ' || v_formule;
        EXCEPTION WHEN NO_DATA_FOUND
        THEN
            v_formule := NULL;
        END;

        v_errorhint := 'Opzoeken formule aanduiding';
        BEGIN
            SELECT fac_usrdata_omschr
              INTO v_formule_aanduiding
              FROM fac_usrdata
             WHERE fac_usrdata_key = rec.formule_aanduiding;

             v_locatie_omschrijving := v_locatie_omschrijving || ' ' || v_formule_aanduiding;
        EXCEPTION WHEN NO_DATA_FOUND
        THEN
            v_formule_aanduiding := NULL;
        END;

        v_errorhint := 'Opzoeken locatie';
        v_aanduiding := rec.alg_locatie_code || '-' || rec.alg_locatie_omschrijving;

        BEGIN
            SELECT alg_locatie_key
              INTO v_locatie_key
              FROM alg_locatie l
             WHERE FAC.safe_to_number(rec.alg_locatie_code) = FAC.safe_to_number(l.alg_locatie_code)
               AND alg_locatie_verwijder IS NULL
               AND LENGTH(alg_locatie_code) = 3;

            UPDATE alg_locatie SET alg_locatie_omschrijving = v_locatie_omschrijving,
                                   alg_locatie_adres = rec.alg_locatie_adres,
                                   alg_locatie_postcode = rec.alg_locatie_postcode,
                                   alg_locatie_plaats = rec.alg_locatie_plaats,
                                   alg_locatie_verantw = rec.manager_naam,
                                   alg_locatie_verantw_tel = rec.manager_mobiel,
                                   alg_locatie_x = rec.x_coord,
                                   alg_locatie_y = rec.y_coord,
                                   mld_dienstniveau_key = 119
             WHERE alg_locatie_key = v_locatie_key;

        EXCEPTION WHEN NO_DATA_FOUND
        THEN
            v_errorhint := 'Toevoegen locatie';
            INSERT INTO alg_locatie (alg_district_key,
                                     alg_locatie_code,
                                     alg_locatie_omschrijving,
                                     alg_locatie_adres,
                                     alg_locatie_postcode,
                                     alg_locatie_plaats,
                                     alg_locatie_verantw,
                                     alg_locatie_verantw_tel,
                                     alg_locatie_x,
                                     alg_locatie_y,
                                     mld_dienstniveau_key)
                           VALUES ( rec.regio,
                                    TO_CHAR(rec.alg_locatie_code, 'FM009'),
                                    v_locatie_omschrijving,
                                    rec.alg_locatie_adres,
                                    rec.alg_locatie_postcode,
                                    rec.alg_locatie_plaats,
                                    rec.manager_naam,
                                    rec.manager_mobiel,
                                    rec.x_coord,
                                    rec.y_coord,
                                    119)
                          RETURNING alg_locatie_key INTO v_locatie_key;

            fac.imp_writelog (p_import_key, 'I', 'Locatie toegevoegd: ' || v_aanduiding, '');
        END;

        v_errorhint := 'Aanpassen locatie kenmerken';
        ALG.upsertkenmerk (1, v_locatie_key, rec.centercode);
        ALG.upsertkenmerk (3, v_locatie_key, rec.formule);
        ALG.upsertkenmerk (4, v_locatie_key, rec.formule_aanduiding);
        ALG.upsertkenmerk (5, v_locatie_key, rec.email);
        v_errorhint := 'Aanpassen district kenmerken';
        ALG.upsertkenmerk (1220, rec.regio, rec.regio_manager);
    END LOOP;

    FOR rec IN c_del
    LOOP
        fac.imp_writelog (p_import_key, 'W', 'Locatie komt niet voor in import: ' || rec.alg_locatie_code || ' ' || rec.alg_locatie_omschrijving, '');
    END LOOP;

    COMMIT;
EXCEPTION
    WHEN OTHERS
    THEN
        oracle_err_num := SQLCODE;
        oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
        v_errormsg := 'error ' || oracle_err_num || '/' || oracle_err_mes;
        fac.imp_writelog (p_import_key,
                          'E',
                          v_errormsg,
                          v_errorhint || ' ' || v_aanduiding);

END;
/



-- Nu de KPI import voor KPN

CREATE OR REPLACE PROCEDURE ykpn_import_kpi_definitie (p_import_key IN NUMBER)
IS
    c_delim                          VARCHAR2 (1) := ';';
    v_newline                        VARCHAR2 (1000);                                  -- Input line
    v_errormsg                       VARCHAR2 (1000);
    v_errorhint                      VARCHAR2 (1000);
    oracle_err_num                   NUMBER;
    oracle_err_mes                   VARCHAR2 (200);
    header_is_valid                  NUMBER;
    v_count_tot                      NUMBER (10);
    v_count_import                   NUMBER (10);
    v_ongeldig                       NUMBER (1);
    v_aanduiding                     VARCHAR2 (200);

    -- De importvelden
    v_kpi_definitie_code         VARCHAR2(255);    --15 BYTE),
    v_kpi_definitie_omschrijving VARCHAR2(255);    --60 BYTE),
    v_kpi_definitie_info         VARCHAR2(4000);   -- 4000 BYTE),
    v_kpi_definitie_categorie1   VARCHAR2(255);    -- 50 BYTE),
    v_kpi_definitie_categorie2   VARCHAR2(255);    -- 50 BYTE),
    v_kpi_definitie_categorie3   VARCHAR2(255);    -- 50 BYTE),
    v_kpi_definitie_drempels_0   VARCHAR2(255);    -- 20 BYTE),
    v_kpi_definitie_drempels_70  VARCHAR2(255);    -- 20 BYTE),
    v_kpi_definitie_drempels_90  VARCHAR2(255);    -- 20 BYTE),
    v_kpi_definitie_drempels_100 VARCHAR2(255);    -- 20 BYTE)
    v_kpi_definitie_drempels_tot VARCHAR2(255);    -- 20 BYTE),

    -- Overige velden:
    CURSOR c1
    IS
          SELECT *
            FROM fac_imp_file
           WHERE fac_import_key = p_import_key
        ORDER BY fac_imp_file_index;
BEGIN
    -- Eerst opruiming
    DELETE FROM YKPN_IMP_KPI_DEFINITIE;

    v_count_tot := 0;
    v_count_import := 0;
    header_is_valid := 0;
    COMMIT;

    FOR rec1 IN c1
    LOOP
        BEGIN
            v_newline := rec1.fac_imp_file_line;
            v_errormsg := 'Fout opvragen te importeren rij';
            v_aanduiding := '';
            v_ongeldig := 0;
            -- Lees alle veldwaarden
            fac.imp_getfield (v_newline, c_delim, v_kpi_definitie_categorie1);
            fac.imp_getfield (v_newline, c_delim, v_kpi_definitie_categorie2);
            fac.imp_getfield (v_newline, c_delim, v_kpi_definitie_code);
            fac.imp_getfield (v_newline, c_delim, v_kpi_definitie_omschrijving);
            fac.imp_getfield (v_newline, c_delim, v_kpi_definitie_info);
            fac.imp_getfield (v_newline, c_delim, v_kpi_definitie_drempels_0);
            fac.imp_getfield (v_newline, c_delim, v_kpi_definitie_drempels_70);
            fac.imp_getfield (v_newline, c_delim, v_kpi_definitie_drempels_90);
            fac.imp_getfield (v_newline, c_delim, v_kpi_definitie_drempels_100);

            v_aanduiding :=
                   '|'
                || v_kpi_definitie_categorie1
                || '|'
                || v_kpi_definitie_categorie2
                || '|'
                || v_kpi_definitie_code
                || '| ';

            -- Ik controleer of ik een geldige header heb, dat is: in de juiste kolommen
            -- de juiste kolomkop. Ik controleer daarbij ALLE kolommen!
            -- Ik negeer alles totdat ik een geldige header ben gepasseerd.
            IF (header_is_valid = 0)
            THEN
                IF     UPPER (v_kpi_definitie_categorie1) = 'KPI CATEGORIE 1'
                   AND UPPER (v_kpi_definitie_categorie2) = 'KPI CATEGORIE 2'
                   AND UPPER (v_kpi_definitie_code) = 'KPI CODE'
                   AND UPPER (v_kpi_definitie_omschrijving) = 'KPI OMSCHRIJVING'
                   AND UPPER (v_kpi_definitie_info) = 'KPI INFORMATIE'
                   AND UPPER (v_kpi_definitie_drempels_0) = 'KPI DREMPEL 0'
                   AND UPPER (v_kpi_definitie_drempels_70) = 'KPI DREMPEL 70'
                   AND UPPER (v_kpi_definitie_drempels_90) = 'KPI DREMPEL 90'
                   AND UPPER (v_kpi_definitie_drempels_100) = 'KPI DREMPEL 100'
                THEN
                    header_is_valid := 1;
                END IF;
            ELSE
                v_count_tot := v_count_tot + 1;
                -- Controleer alle veldwaarden

                IF v_kpi_definitie_categorie1 IS NOT NULL
                THEN
	                v_kpi_definitie_categorie1 := TRIM (v_kpi_definitie_categorie1);

	                IF LENGTH (v_kpi_definitie_categorie1) > 50
	                THEN
	                    v_kpi_definitie_categorie1 :=
	                        SUBSTR (TRIM (v_kpi_definitie_categorie1), 1, 50);
	                    fac.imp_writelog (
	                        p_import_key,
	                        'W',
	                        v_aanduiding,
	                           'Categorie 1 wordt afgebroken tot ['
	                        || v_kpi_definitie_categorie1
	                        || ']');
	                END IF;
                ELSE
                	v_ongeldig := 1;
                	fac.imp_writelog (p_import_key, 'W', v_aanduiding, 'Categorie 1 mag NIET leeg zijn: deze regel wordt overgeslagen');
                END IF;

                IF v_kpi_definitie_categorie2 IS NOT NULL
                THEN
	                v_kpi_definitie_categorie2 := TRIM (v_kpi_definitie_categorie2);
									IF LENGTH (v_kpi_definitie_categorie2) > 50
	                THEN
	                    v_kpi_definitie_categorie2 :=
	                        SUBSTR (TRIM (v_kpi_definitie_categorie2), 1, 50);
	                    fac.imp_writelog (
	                        p_import_key,
	                        'W',
	                        v_aanduiding,
	                           'Categorie 2 wordt afgebroken tot ['
	                        || v_kpi_definitie_categorie2
	                        || ']');
	                END IF;
								ELSE
									v_ongeldig := 1;
                	fac.imp_writelog (p_import_key, 'W', v_aanduiding, 'Categorie 2 mag NIET leeg zijn: deze regel wordt overgeslagen');
                END IF;

								IF v_kpi_definitie_code IS NOT NULL
                THEN
	                v_kpi_definitie_code := TRIM (v_kpi_definitie_code);
									IF LENGTH (v_kpi_definitie_code) > 15
	                THEN
	                    v_kpi_definitie_code :=
	                        SUBSTR (TRIM (v_kpi_definitie_code), 1, 15);
	                    fac.imp_writelog (
	                        p_import_key,
	                        'W',
	                        v_aanduiding,
	                           'Code wordt afgebroken tot ['
	                        || v_kpi_definitie_code
	                        || ']');
	                END IF;
								ELSE
									v_ongeldig := 1;
                	fac.imp_writelog (p_import_key, 'W', v_aanduiding, 'Code mag NIET leeg zijn: deze regel wordt overgeslagen');
                END IF;

                IF v_kpi_definitie_omschrijving IS NOT NULL
                THEN

									v_kpi_definitie_omschrijving := TRIM (v_kpi_definitie_omschrijving);
									IF LENGTH (v_kpi_definitie_omschrijving) > 60
	                THEN
	                    v_kpi_definitie_omschrijving :=
	                        SUBSTR (TRIM (v_kpi_definitie_omschrijving), 1, 60);
	                    fac.imp_writelog (
	                        p_import_key,
	                        'W',
	                        v_aanduiding,
	                           'Omschrijving wordt afgebroken tot ['
	                        || v_kpi_definitie_omschrijving
	                        || ']');
	                END IF;
								ELSE
									v_ongeldig := 1;
                	fac.imp_writelog (p_import_key, 'W', v_aanduiding, 'Omschrijving mag NIET leeg zijn: deze regel wordt overgeslagen');
                END IF;

								v_kpi_definitie_info := TRIM (v_kpi_definitie_info);
								IF LENGTH (v_kpi_definitie_info) > 4000
                THEN
                    v_kpi_definitie_info :=
                        SUBSTR (TRIM (v_kpi_definitie_info), 1, 4000);
                    fac.imp_writelog (
                        p_import_key,
                        'W',
                        v_aanduiding,
                           'Informatie wordt afgebroken tot ['
                        || v_kpi_definitie_info
                        || ']');
                END IF;

								IF v_kpi_definitie_drempels_0 IS NOT NULL AND v_kpi_definitie_drempels_70 IS NOT NULL AND v_kpi_definitie_drempels_90 IS NOT NULL AND v_kpi_definitie_drempels_100 IS NOT NULL
								THEN
									v_kpi_definitie_drempels_tot := TRIM (v_kpi_definitie_drempels_0 || '|' || v_kpi_definitie_drempels_70 || '|' || v_kpi_definitie_drempels_90 || '|' ||  v_kpi_definitie_drempels_100);
									IF LENGTH (v_kpi_definitie_drempels_tot) > 20
	                THEN
	                    v_kpi_definitie_drempels_tot :=
	                        SUBSTR (TRIM (v_kpi_definitie_drempels_tot), 1, 20);
	                    fac.imp_writelog (
	                        p_import_key,
	                        'W',
	                        v_aanduiding,
	                           'Dermpels wordt afgebroken tot ['
	                        || v_kpi_definitie_drempels_tot
	                        || ']');
	                END IF;
								ELSE
									v_ongeldig := 1;
                	fac.imp_writelog (p_import_key, 'W', v_aanduiding, 'Alle drempeles MOETEN gevuld zijn: deze regel wordt overgeslagen');
                END IF;


                -- Insert geformatteerde import record
                IF v_ongeldig = 0
                THEN
                    BEGIN
                        INSERT INTO YKPN_IMP_KPI_DEFINITIE (
									                        KPI_DEFINITIE_CODE,
									                        KPI_DEFINITIE_OMSCHRIJVING,
									                        KPI_DEFINITIE_INFO,
									                        KPI_DEFINITIE_CATEGORIE1,
									                        KPI_DEFINITIE_CATEGORIE2,
									                        KPI_DEFINITIE_DREMPELS)
                            VALUES (v_kpi_definitie_code,
                                    v_kpi_definitie_omschrijving,
                                    v_kpi_definitie_info,
                                    v_kpi_definitie_categorie1,
                                    v_kpi_definitie_categorie2,
                                    v_kpi_definitie_drempels_tot);

                        v_count_import := v_count_import + 1;
                    EXCEPTION
                        WHEN OTHERS
                        THEN
                            oracle_err_num := SQLCODE;
                            oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
                            v_errormsg :=
                                'ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
                            fac.imp_writelog (
                                p_import_key,
                                'E',
                                v_aanduiding || v_errormsg,
                                'Fout bij toevoegen regel aan importtabel YKPN_IMP_KPI_DEFINITIE.');
                    END;
                END IF;
            END IF;
        END;
    END LOOP;

    IF (header_is_valid = 0)
    THEN
        fac.imp_writelog (p_import_key,
                          'E',
                          'Ongeldig importbestand',
                          'Geen header of header niet volgens specificatie!');
    ELSE
        fac.imp_writelog (
            p_import_key,
            'S',
            'KPI Definitie: aantal ingelezen importregels: ' || TO_CHAR (v_count_tot),
            '');
        fac.imp_writelog (
            p_import_key,
            'S',
            'KPI Definitie: aantal ongeldige niet ingelezen importregels: '
            || TO_CHAR (v_count_tot - v_count_import),
            '');
    END IF;

    COMMIT;
EXCEPTION
    WHEN OTHERS
    THEN
        oracle_err_num := SQLCODE;
        oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
        v_errormsg := 'ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
        fac.imp_writelog (p_import_key,
                          'E',
                          v_errormsg,
                          'Inleesproces KPI Definitie afgebroken!');
END YKPN_IMPORT_KPI_DEFINITIE;
/

CREATE OR REPLACE PROCEDURE ykpn_update_kpi_definitie (p_import_key IN NUMBER)
AS
    v_errormsg                 VARCHAR2 (1000);
    oracle_err_num             NUMBER;
    oracle_err_mes             VARCHAR2 (200);
    header_is_valid            NUMBER;
    v_count_error              NUMBER (10);
    v_count                    NUMBER (10);
    v_count_tot                NUMBER (10);
    v_count_import             NUMBER (10);
    v_ongeldig                 NUMBER (1);
    v_aanduiding               VARCHAR2 (200);
    v_errorhint                VARCHAR2 (1000);


    CURSOR c_kpi_defs
    IS
        SELECT * FROM YKPN_IMP_KPI_DEFINITIE;
-- MAIN
BEGIN
    FOR rec_ins IN c_kpi_defs
    LOOP
        BEGIN
            v_count_tot := v_count_tot + 1;
            v_aanduiding :=
                   rec_ins.kpi_definitie_code
                || ' - '
                || rec_ins.kpi_definitie_categorie1
                || '-'
                || rec_ins.kpi_definitie_categorie2;

            v_errorhint := 'Fout bij insert van kpi definitie';

				    IF 				 rec_ins.kpi_definitie_code IS NOT NULL
                   AND rec_ins.kpi_definitie_categorie1 IS NOT NULL
                   AND rec_ins.kpi_definitie_categorie2 IS NOT NULL
                   AND rec_ins.kpi_definitie_omschrijving IS NOT NULL
                   AND rec_ins.kpi_definitie_drempels IS NOT NULL

            THEN
                INSERT INTO kpi_definitie (  KPI_DEFINITIE_CODE,
                                             KPI_DEFINITIE_OMSCHRIJVING,
                                             KPI_DEFINITIE_INFO,
                                             KPI_DEFINITIE_CATEGORIE1,
                                             KPI_DEFINITIE_CATEGORIE2,
                                             KPI_DEFINITIE_DREMPELS)
                    VALUES (rec_ins.kpi_definitie_code,
                            rec_ins.kpi_definitie_omschrijving,
                            rec_ins.kpi_definitie_info,
                            rec_ins.kpi_definitie_categorie1,
                            rec_ins.kpi_definitie_categorie2,
                            rec_ins.kpi_definitie_drempels
                            );
            ELSE
                fac.imp_writelog (
                    p_import_key,
                    'E',
                    v_aanduiding,
                    'Code, Omschrijving, Categorie1 en 2 en drempels mogen niet leeg zijn');
            END IF;
        EXCEPTION
            WHEN OTHERS
            THEN
                v_count_error := v_count_error + 1;
                oracle_err_num := SQLCODE;
                oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
                v_errormsg := 'OTHERS (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
                fac.imp_writelog (p_import_key,
                                  'E',
                                  v_aanduiding || v_errormsg,
                                  v_errorhint);
                COMMIT;
        END;
    END LOOP;
EXCEPTION
    WHEN OTHERS
    THEN
        oracle_err_num := SQLCODE;
        oracle_err_mes := SUBSTR (SQLERRM, 1, 150);
        v_errormsg :=
            v_errormsg || 'ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
        fac.imp_writelog (p_import_key,
                          'E',
                          'Importproces KPI Definitie afgebroken!',
                          v_errormsg);
END YKPN_UPDATE_KPI_DEFINITIE;
/

-- Hieronder alle KPI views

-- KPI Kwaliteit: Jaarplan
CREATE OR REPLACE VIEW ykpn_v_kpi1
AS
   WITH normen AS
        (SELECT kpi_definitie_key,
                kpi_definitie_code kpi_code,
                kpi_definitie_categorie1 kpi_cat1,
                kpi_definitie_categorie2 kpi_cat2,
                kpi_definitie_drempels normscores,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 1)) n000,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 2)) n070,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 3)) n090,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 4)) n100
           FROM kpi_definitie
          WHERE kpi_definitie_code = 'BK1'),
        scores_kpn AS
        (SELECT   m.mld_melding_key,
                  dloc.alg_locatie_key,
                  TRUNC(m.mld_melding_einddatum, 'MM') periode,
                  COALESCE(fac.safe_to_number(BK_1.mld_kenmerkmelding_waarde),0) BK1_score
             FROM mld_melding m,
                  (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 3424) BK_1,
                  alg_locatie dloc
            WHERE m.mld_stdmelding_key = 1841
                             AND m.mld_melding_status NOT IN (1)
              AND dloc.alg_locatie_key = m.mld_alg_locatie_key
              AND BK_1.mld_melding_key(+) = m.mld_melding_key
          )
   SELECT kpi_definitie_key, periode kpi_score_datum, alg_locatie_key,
          'melding' kpi_score_xmlnode, mld_melding_key kpi_score_refkey,
          n000, n070, n090, n100,
          kpi.getNormScore(score, n000, n070, n090, n100) kpi_score_score,
          normscores  kpi_score_norm_score,
          SUBSTR( TO_CHAR(score), 1, 20) kpi_score_drempels
     FROM (
         SELECT n.kpi_definitie_key, n.normscores,
                k.mld_melding_key,
                k.alg_locatie_key,
                k.periode,
                n.kpi_cat1 proces,
                n.kpi_cat2 onderdeel,
                BK1_score score,
                n.n000, n.n070, n.n090, n.n100
           FROM normen n, scores_kpn k) m;

-- KPI Kwaliteit: Jaarplan
CREATE OR REPLACE VIEW ykpn_v_kpi2
AS
   WITH normen AS
        (SELECT kpi_definitie_key,
                kpi_definitie_code kpi_code,
                kpi_definitie_categorie1 kpi_cat1,
                kpi_definitie_categorie2 kpi_cat2,
                kpi_definitie_drempels normscores,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 1)) n000,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 2)) n070,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 3)) n090,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 4)) n100
           FROM kpi_definitie
          WHERE kpi_definitie_code = 'JP'),
        scores_kpn AS
        (SELECT   m.mld_melding_key,
                  dloc.alg_locatie_key,
                  TRUNC(m.mld_melding_einddatum, 'MM') periode,
                  DECODE (COALESCE(fac.safe_to_number(JP_1.mld_kenmerkmelding_waarde),0), 1601, 1, 1602, 2, 1603, 3, 0) JP_score
             FROM mld_melding m,
                  (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 3447) JP_1,
                  alg_locatie dloc
            WHERE m.mld_stdmelding_key = 1841
                             AND m.mld_melding_status NOT IN (1)
              AND dloc.alg_locatie_key = m.mld_alg_locatie_key
              AND JP_1.mld_melding_key(+) = m.mld_melding_key
          )
   SELECT kpi_definitie_key, periode kpi_score_datum, alg_locatie_key,
          'melding' kpi_score_xmlnode, mld_melding_key kpi_score_refkey,
          n000, n070, n090, n100,
          kpi.getNormScore(score, n000, n070, n090, n100) kpi_score_score,
          normscores  kpi_score_norm_score,
          SUBSTR( TO_CHAR(score), 1, 20) kpi_score_drempels
     FROM (
         SELECT n.kpi_definitie_key, n.normscores,
                k.mld_melding_key,
                k.alg_locatie_key,
                k.periode,
                n.kpi_cat1 proces,
                n.kpi_cat2 onderdeel,
                JP_score score,
                n.n000, n.n070, n.n090, n.n100
           FROM normen n, scores_kpn k) m;

-- KPI Kwaliteit: samengevoegd
CREATE OR REPLACE VIEW ykpn_v_kpi_kwaliteit
(
   kpi_definitie_key,
   kpi_score_datum,
   alg_locatie_key,
   kpi_score_xmlnode,
   kpi_score_refkey,
   kpi_score_score,
   kpi_score_norm_score,
   kpi_score_drempels
)
AS
     SELECT kpi_definitie_key,
            kpi_score_datum,
            alg_locatie_key,
            'melding' kpi_score_xmlnode,
            NULL kpi_score_refkey,
            kpi.getNormScore (SUM (kpi_score_drempels),
                              n000,
                              n070,
                              n090,
                              n100),
            MIN (KPI_SCORE_NORM_SCORE),
            SUM (kpi_score_drempels)
       FROM (  SELECT * FROM ykpn_v_kpi1
             UNION
               SELECT * FROM ykpn_v_kpi2)
   GROUP BY kpi_definitie_key,
            kpi_score_datum,
            alg_locatie_key,
            n000,
            n070,
            n090,
            n100;

-- Verzamel alle KPI scores
CREATE OR REPLACE VIEW ykpn_v_kpi_all
AS
   SELECT * FROM ykpn_v_kpi_kwaliteit
--UNION ALL
	-- SELECT * FROM ykpn_v_kpi_etc
;

-- EINDE KPI

-- YKPN#55423 Rapport voor verwijderde afspraken
CREATE OR REPLACE VIEW ykpn_v_rap_bezdel
AS
     SELECT t.fac_tracking_key,
        t.fac_tracking_datum,
        t.fac_srtnotificatie_key,
        t.fac_tracking_refkey,
        t.fac_tracking_oms,
        t.prs_perslid_key,
        sn.fac_srtnotificatie_code,
        p.prs_perslid_naam_full as prs_perslid_naam
    FROM fac_tracking t, fac_srtnotificatie sn, prs_v_perslid_fullnames_all  p
    WHERE  p.prs_perslid_key = t.prs_perslid_key
        AND sn.fac_srtnotificatie_key = t.fac_srtnotificatie_key
        AND SUBSTR (sn.fac_srtnotificatie_code, 1, 3) = 'BEZ'
        AND SUBSTR (UPPER (t.fac_tracking_oms), 1, 22) =
                  'AFSPRAAK IS VERWIJDERD'
   ORDER BY
        t.fac_tracking_refkey,
        t.fac_tracking_datum DESC;

CREATE OR REPLACE VIEW ykpn_v_graph_servicedesk
(
   discipline,
   aantal
)
AS
     SELECT d.ins_discipline_omschrijving, COUNT ( * )
       FROM mld_melding m, mld_stdmelding std, ins_tab_discipline d
      WHERE m.mld_stdmelding_key = std.mld_stdmelding_key
        AND TRUNC (mld_melding_datum, 'MM') = ADD_MONTHS (TRUNC (SYSDATE, 'MM'), -1)
        AND std.mld_ins_discipline_key IN (34, 48, 38)                                 -- compliment
        AND std.mld_ins_discipline_key = d.ins_discipline_key
   GROUP BY ins_discipline_omschrijving
   UNION ALL
   SELECT 'Melding', COUNT ( * )
     FROM mld_melding m, mld_stdmelding std, ins_tab_discipline d
    WHERE m.mld_stdmelding_key = std.mld_stdmelding_key
      AND TRUNC (mld_melding_datum, 'MM') = ADD_MONTHS (TRUNC (SYSDATE, 'MM'), -1)
      AND std.mld_ins_discipline_key NOT IN (34, 48, 38)                               -- compliment
      AND std.mld_ins_discipline_key = d.ins_discipline_key
   UNION ALL
   SELECT 'Reservering', COUNT ( * )
     FROM res_rsv_ruimte
    WHERE TRUNC (res_rsv_ruimte_van, 'MM') = ADD_MONTHS (TRUNC (SYSDATE, 'MM'), -1)
      AND res_rsv_ruimte_verwijder IS NULL;

CREATE OR REPLACE VIEW ykpn_v_graph_meldingen
(
   discipline,
   aantal
)
AS
     SELECT d.ins_discipline_omschrijving, COUNT ( * )
       FROM mld_melding m, mld_stdmelding std, ins_tab_discipline d
      WHERE m.mld_stdmelding_key = std.mld_stdmelding_key
        AND TRUNC (mld_melding_datum, 'MM') = ADD_MONTHS (TRUNC (SYSDATE, 'MM'), -1)
        AND std.mld_ins_discipline_key NOT IN (34, 48, 38)                             -- compliment
        AND std.mld_ins_discipline_key = d.ins_discipline_key
   GROUP BY ins_discipline_omschrijving;

CREATE OR REPLACE VIEW ykpn_v_graph_bezoekers
(
   locatie,
   aantal
)
AS
     SELECT alg_locatie_omschrijving, COUNT ( * )
       FROM bez_bezoekers b, bez_afspraak a, alg_locatie l
      WHERE b.bez_afspraak_key = a.bez_afspraak_key
        AND a.alg_locatie_key = l.alg_locatie_key
        AND TRUNC (bez_afspraak_datum, 'MM') = ADD_MONTHS (TRUNC (SYSDATE, 'MM'), -1)
   GROUP BY alg_locatie_omschrijving;

CREATE OR REPLACE VIEW ykpn_v_graph_parkeerplaats
(
   locatie,
   aantal
)
AS
     SELECT alg_locatie_omschrijving, COUNT ( * )
       FROM bez_bezoekers b,
            bez_afspraak a,
            alg_locatie l,
            res_rsv_deel rrd
      WHERE b.bez_afspraak_key = a.bez_afspraak_key
        AND a.alg_locatie_key = l.alg_locatie_key
        AND b.bez_bezoekers_key = rrd.bez_bezoekers_key
        AND TRUNC (bez_afspraak_datum, 'MM') = ADD_MONTHS (TRUNC (SYSDATE, 'MM'), -1)
   GROUP BY alg_locatie_omschrijving;



CREATE OR REPLACE VIEW ykpn_v_rap_facturatie
AS
SELECT m.mld_melding_key,
       o.mld_opdr_bedrijfopdr_volgnr,
       ot.mld_typeopdr_omschrijving,
       m.mld_melding_datum,
       o.mld_opdr_datumbegin,
       d.alg_district_omschrijving,
       l.alg_locatie_code,
       l.alg_locatie_omschrijving,
       aog.alg_gebouw_code,
       aog.alg_gebouw_naam,
       ins_discipline_omschrijving,
       mld_stdmelding_omschrijving,
       mld_melding_omschrijving,
       ok.prs_kostenplaats_nr,
       op.prs_perslid_naam_full,
       uit.naam,
       mld_statuses_omschrijving,
       mld_statusopdr_omschrijving,
       m.mld_melding_einddatum,
       mld.getmeldingstatusdate(m.mld_melding_key, 5) mld_melding_afgemeld,
       o.mld_opdr_omschrijving,
       mld.getopdrachtstatusdate(o.mld_opdr_key, 6) mld_opdr_afgemeld,
       DECODE (o.mld_typeopdr_key, 101, mld_opdr_kosten) procuratiebedrag,
       mld_opdr_materiaal opdrachtbedrag,
       (select mld_kenmerkopdr_aanmaak from mld_kenmerkopdr ko, mld_kenmerk k where ko.mld_opdr_key = o.mld_opdr_key and ko.mld_kenmerk_key = k.mld_kenmerk_key and k.mld_srtkenmerk_key = 221) factuuraanmaak,
       (select fac.safe_to_number(mld_kenmerkopdr_waarde) from mld_kenmerkopdr ko, mld_kenmerk k where ko.mld_opdr_key = o.mld_opdr_key and ko.mld_kenmerk_key = k.mld_kenmerk_key and k.mld_srtkenmerk_key = 221) factuurbedrag,
       (select fac.safe_to_number(mld_kenmerkopdr_waarde) from mld_kenmerkopdr ko, mld_kenmerk k where ko.mld_opdr_key = o.mld_opdr_key and ko.mld_kenmerk_key = k.mld_kenmerk_key and k.mld_srtkenmerk_key = 381) po_nummer,
       (select fac.safe_to_number(mld_kenmerkopdr_waarde) from mld_kenmerkopdr ko, mld_kenmerk k where ko.mld_opdr_key = o.mld_opdr_key and ko.mld_kenmerk_key = k.mld_kenmerk_key and k.mld_srtkenmerk_key = 401) afdeling
  FROM mld_melding m, mld_opdr o, mld_typeopdr ot, alg_locatie l, alg_district d, mld_stdmelding std, ins_tab_discipline di, prs_kostenplaats ok, prs_v_perslid_fullnames op, mld_v_uitvoerende uit, alg_v_allonrgoed_gegevens aog,
  mld_statuses ms, mld_statusopdr os
 WHERE     m.mld_melding_key = o.mld_melding_key
       AND o.mld_typeopdr_key = ot.mld_typeopdr_key
       AND m.mld_alg_locatie_key = l.alg_locatie_key
       AND l.alg_district_key = d.alg_district_key
       AND m.mld_stdmelding_key = std.mld_stdmelding_key
       AND std.mld_ins_discipline_key = di.ins_discipline_key
       AND o.prs_kostenplaats_key = ok.prs_kostenplaats_key(+)
       AND o.prs_perslid_key = op.prs_perslid_key(+)
       AND o.mld_uitvoerende_keys = uit.mld_uitvoerende_key(+)
       AND m.mld_melding_status = ms.mld_statuses_key
       AND o.mld_statusopdr_key = os.mld_statusopdr_key(+)
       AND m.mld_alg_onroerendgoed_keys = aog.alg_onroerendgoed_keys
       AND NOT EXISTS (select mld_kenmerkopdr_key from mld_kenmerkopdr ko where ko.mld_opdr_key = o.mld_opdr_key and ko.mld_kenmerk_key = 301 and mld_kenmerkopdr_waarde = 1)
UNION ALL
SELECT m.mld_melding_key,
       0 mld_opdr_bedrijfopdr_volgnr,
       NULL mld_typeopdr_omschrijving,
       m.mld_melding_datum,
       NULL mld_opdr_datumbegin,
       d.alg_district_omschrijving,
       l.alg_locatie_code,
       l.alg_locatie_omschrijving,
       aog.alg_gebouw_code,
       aog.alg_gebouw_naam,
       ins_discipline_omschrijving,
       mld_stdmelding_omschrijving,
       mld_melding_omschrijving,
       NULL prs_kostenplaats_nr,
       NULL prs_perslid_naam_full,
       NULL naam,
       mld_statuses_omschrijving,
       NULL procuratiebedrag,
       m.mld_melding_einddatum,
       mld.getmeldingstatusdate(m.mld_melding_key, 5) mld_melding_afgemeld,
       NULL mld_opdr_omschrijving,
       NULL mld_opdr_afgemeld,
       NULL procuratiebedrag,
       NULL opdrachtbedrag,
       (select mld_kenmerkmelding_aanmaak from mld_kenmerkmelding km, mld_kenmerk k where km.mld_melding_key = m.mld_melding_key and km.mld_kenmerk_key = k.mld_kenmerk_key and k.mld_srtkenmerk_key = 221) factuurbedrag,
       (select fac.safe_to_number(mld_kenmerkmelding_waarde) from mld_kenmerkmelding km, mld_kenmerk k where km.mld_melding_key = m.mld_melding_key and km.mld_kenmerk_key = k.mld_kenmerk_key and k.mld_srtkenmerk_key = 221) factuurbedrag,
       NULL po_nummer,
       NULL afdeling
  FROM mld_melding m, alg_locatie l, alg_district d, mld_stdmelding std, ins_tab_discipline di, alg_v_allonrgoed_gegevens aog,
  mld_statuses ms
 WHERE     m.mld_alg_locatie_key = l.alg_locatie_key
       AND l.alg_district_key = d.alg_district_key
       AND m.mld_stdmelding_key = std.mld_stdmelding_key
       AND std.mld_ins_discipline_key = di.ins_discipline_key
       AND m.mld_melding_status = ms.mld_statuses_key
       AND m.mld_alg_onroerendgoed_keys = aog.alg_onroerendgoed_keys;


-- Rapportage 1:
-- Alle hoofdmeldingen of onderliggende opdrachten waar het veld ‘bedrag gefactureerd’ staat ingevuld.
-- Alle procuraties die zijn doorlopen (ongeacht de status open / afgemeld / etc)
CREATE OR REPLACE VIEW ykpn_v_rap_facturatie1
AS
    SELECT *
      FROM YKPN_V_RAP_FACTURATIE
     WHERE factuurbedrag IS NOT NULL OR procuratiebedrag IS NOT NULL
    UNION
    SELECT *
      FROM YKPN_V_RAP_FACTURATIE
     WHERE     mld_opdr_bedrijfopdr_volgnr = 0
           AND mld_melding_key IN
                   (SELECT mld_melding_key
                      FROM YKPN_V_RAP_FACTURATIE
                     WHERE    factuurbedrag IS NOT NULL
                           OR procuratiebedrag IS NOT NULL);

-- Rapportage 2:
-- Alle opdrachten met opdrachttypes ‘uitvoer opdracht’ en ‘bestelling’ waar het veld ‘bedrag gefactureerd’ niet is ingevuld
CREATE OR REPLACE VIEW ykpn_v_rap_facturatie2
AS
    SELECT *
      FROM YKPN_V_RAP_FACTURATIE
     WHERE    mld_typeopdr_omschrijving = 'Uitvoering opdracht'
           OR mld_typeopdr_omschrijving = 'Bestelling'
    UNION
    SELECT *
      FROM YKPN_V_RAP_FACTURATIE
     WHERE     mld_opdr_bedrijfopdr_volgnr = 0
           AND mld_melding_key IN
                   (SELECT mld_melding_key
                      FROM YKPN_V_RAP_FACTURATIE
                     WHERE    mld_typeopdr_omschrijving =
                              'Uitvoering opdracht'
                           OR mld_typeopdr_omschrijving = 'Bestelling');

-- Gewijzigde financiele rapportage gebasseerd op afgeronde procuraties.
CREATE OR REPLACE VIEW ykpn_v_rap_fin_facturatie_p
AS
    SELECT m.mld_melding_key,
           o.mld_opdr_bedrijfopdr_volgnr,
           ot.mld_typeopdr_omschrijving,
           m.mld_melding_datum,
           o.mld_opdr_datumbegin,
           d.alg_district_omschrijving,
           l.alg_locatie_code,
           l.alg_locatie_omschrijving,
           aog.alg_gebouw_code,
           aog.alg_gebouw_naam,
           ins_discipline_omschrijving,
           mld_stdmelding_omschrijving,
           mld_melding_omschrijving,
           ok.prs_kostenplaats_nr,
           op.prs_perslid_naam_full,
           uit.naam,
           mld_statuses_omschrijving,
           mld_statusopdr_omschrijving,
           m.mld_melding_einddatum,
           mld.getmeldingstatusdate (m.mld_melding_key, 5)
               mld_melding_afgemeld,
           o.mld_opdr_omschrijving,
           mld.getopdrachtstatusdate (o.mld_opdr_key, 6)
               mld_opdr_afgemeld,
           mld_opdr_materiaal
               opdrachtbedrag,
           NULL
               datum_goedkeuring,                                    -- fingoe
           fg.totaal,
           (SELECT fac.safe_to_number (mld_kenmerkopdr_waarde)
              FROM mld_kenmerkopdr ko, mld_kenmerk k
             WHERE     ko.mld_opdr_key = o.mld_opdr_key
                   AND ko.mld_kenmerk_key = k.mld_kenmerk_key
                   AND k.mld_srtkenmerk_key = 381)          -- PO Nummer
               po_nummer,
           (SELECT fac.safe_to_number (mld_kenmerkopdr_waarde)
              FROM mld_kenmerkopdr ko, mld_kenmerk k
             WHERE     ko.mld_opdr_key = o.mld_opdr_key
                   AND ko.mld_kenmerk_key = k.mld_kenmerk_key
                   AND k.mld_srtkenmerk_key = 401)   -- Bedrag wordt gefinancieerd door andere afdeling
               afdeling
      FROM mld_melding                m,
           mld_opdr                   o,
           mld_typeopdr               ot,
           alg_locatie                l,
           alg_district               d,
           mld_stdmelding             std,
           ins_tab_discipline         di,
           prs_kostenplaats           ok,
           prs_v_perslid_fullnames    op,
           mld_v_uitvoerende          uit,
           alg_v_allonrgoed_gegevens  aog,
           mld_statuses               ms,
           mld_statusopdr             os,
           ( SELECT o2.mld_melding_key,
                             SUM (fin_factuurregel_totaal) totaal
                        FROM fin_factuur f, fin_factuurregel fr, mld_opdr o2
                       WHERE f.fin_factuur_key = fr.fin_factuur_key
                         AND f.fin_factuur_verwijder IS NULL
                         AND f.mld_opdr_key = o2.mld_opdr_key
                    GROUP BY o2.mld_melding_key) fg
     WHERE     m.mld_melding_key = o.mld_melding_key
           AND m.mld_melding_key = fg.mld_melding_key(+)
           AND o.mld_typeopdr_key = ot.mld_typeopdr_key
           AND m.mld_alg_locatie_key = l.alg_locatie_key
           AND l.alg_district_key = d.alg_district_key
           AND m.mld_stdmelding_key = std.mld_stdmelding_key
           AND std.mld_ins_discipline_key = di.ins_discipline_key
           AND o.prs_kostenplaats_key = ok.prs_kostenplaats_key(+)
           AND o.prs_perslid_key = op.prs_perslid_key(+)
           AND o.mld_uitvoerende_keys = uit.mld_uitvoerende_key(+)
           AND m.mld_melding_status = ms.mld_statuses_key
           AND o.mld_statusopdr_key = os.mld_statusopdr_key(+)
           AND m.mld_alg_onroerendgoed_keys = aog.alg_onroerendgoed_keys
           AND ot.mld_typeopdr_key = 101 -- Procuratie
           AND NOT EXISTS
                   (SELECT mld_kenmerkopdr_key
                      FROM mld_kenmerkopdr ko
                     WHERE     ko.mld_opdr_key = o.mld_opdr_key
                           AND ko.mld_kenmerk_key = 301 -- ongeldige procuratie
                           AND mld_kenmerkopdr_waarde = 1);

-- Gewijzigde financiele rapportage gebasseerd op ingelegde facturen.
CREATE OR REPLACE VIEW ykpn_v_rap_fin_facturatie
AS
    SELECT m.mld_melding_key,
           o.mld_opdr_bedrijfopdr_volgnr,
           ot.mld_typeopdr_omschrijving,
           m.mld_melding_datum,
           o.mld_opdr_datumbegin,
           d.alg_district_omschrijving,
           l.alg_locatie_code,
           l.alg_locatie_omschrijving,
           aog.alg_gebouw_code,
           aog.alg_gebouw_naam,
           ins_discipline_omschrijving,
           mld_stdmelding_omschrijving,
           mld_melding_omschrijving,
           ok.prs_kostenplaats_nr,
           op.prs_perslid_naam_full,
           uit.naam,
           mld_statuses_omschrijving,
           mld_statusopdr_omschrijving,
           m.mld_melding_einddatum,
           mld.getmeldingstatusdate (m.mld_melding_key, 5)
               mld_melding_afgemeld,
           o.mld_opdr_omschrijving,
           mld.getopdrachtstatusdate (o.mld_opdr_key, 6)
               mld_opdr_afgemeld,
           mld_opdr_materiaal
               opdrachtbedrag,
           DECODE (fin_factuur_statuses_key,
                   6, COALESCE (datum_goedkeuring, datum_fiattering),
                   7, COALESCE (datum_goedkeuring, datum_fiattering))
               datum_goedkeuring,                                    -- fingoe
           fg.totaal,
           (SELECT fac.safe_to_number (mld_kenmerkopdr_waarde)
              FROM mld_kenmerkopdr ko, mld_kenmerk k
             WHERE     ko.mld_opdr_key = o.mld_opdr_key
                   AND ko.mld_kenmerk_key = k.mld_kenmerk_key
                   AND k.mld_srtkenmerk_key = 381)
               po_nummer,
           (SELECT fac.safe_to_number (mld_kenmerkopdr_waarde)
              FROM mld_kenmerkopdr ko, mld_kenmerk k
             WHERE     ko.mld_opdr_key = o.mld_opdr_key
                   AND ko.mld_kenmerk_key = k.mld_kenmerk_key
                   AND k.mld_srtkenmerk_key = 401)
               afdeling
      FROM mld_melding                m,
           mld_opdr                   o,
           mld_typeopdr               ot,
           alg_locatie                l,
           alg_district               d,
           mld_stdmelding             std,
           ins_tab_discipline         di,
           prs_kostenplaats           ok,
           prs_v_perslid_fullnames    op,
           mld_v_uitvoerende          uit,
           alg_v_allonrgoed_gegevens  aog,
           mld_statuses               ms,
           mld_statusopdr             os,
           (SELECT mld_opdr_key,
                   fin_factuur_key,
                   totaal,
                   fin_factuur_statuses_key,
                   (SELECT MIN (fac_tracking_datum)
                      FROM fac_tracking t
                     WHERE     t.fac_tracking_refkey = fgg.fin_factuur_key
                           AND t.fac_srtnotificatie_key = 132)
                       datum_goedkeuring,                            -- fingoe
                   (SELECT MIN (fac_tracking_datum)
                      FROM fac_tracking t
                     WHERE     t.fac_tracking_refkey = fgg.fin_factuur_key
                           AND t.fac_srtnotificatie_key = 131)
                       datum_fiattering                              -- finfia
              FROM (  SELECT f.mld_opdr_key,
                             f.fin_factuur_key,
                             SUM (fin_factuurregel_totaal) totaal,
                             fin_factuur_statuses_key
                        FROM fin_factuur f, fin_factuurregel fr
                       WHERE f.fin_factuur_key = fr.fin_factuur_key
                    GROUP BY mld_opdr_key,
                             f.fin_factuur_key,
                             fin_factuur_statuses_key) fgg) fg
     WHERE     m.mld_melding_key = o.mld_melding_key
           AND o.mld_typeopdr_key = ot.mld_typeopdr_key
           AND m.mld_alg_locatie_key = l.alg_locatie_key
           AND l.alg_district_key = d.alg_district_key
           AND m.mld_stdmelding_key = std.mld_stdmelding_key
           AND std.mld_ins_discipline_key = di.ins_discipline_key
           AND o.prs_kostenplaats_key = ok.prs_kostenplaats_key(+)
           AND o.prs_perslid_key = op.prs_perslid_key(+)
           AND o.mld_uitvoerende_keys = uit.mld_uitvoerende_key(+)
           AND m.mld_melding_status = ms.mld_statuses_key
           AND o.mld_statusopdr_key = os.mld_statusopdr_key(+)
           AND m.mld_alg_onroerendgoed_keys = aog.alg_onroerendgoed_keys
           AND o.mld_opdr_key = fg.mld_opdr_key
           AND NOT EXISTS
                   (SELECT o2.mld_opdr_key
                      FROM mld_opdr o2
                     WHERE     o2.mld_typeopdr_key = 101         -- procuratie
                           AND o2.mld_melding_key = o.mld_melding_key
                           AND o2.mld_statusopdr_key = 6           -- afgemeld
                           AND NOT EXISTS
                                   (SELECT mld_kenmerkopdr_key
                                      FROM mld_kenmerkopdr ko
                                     WHERE     ko.mld_opdr_key =
                                               o2.mld_opdr_key
                                           AND ko.mld_kenmerk_key = 301 -- ongeldige procuratie
                                           AND mld_kenmerkopdr_waarde = 1));

-- Facturatie tabblad F
CREATE OR REPLACE VIEW ykpn_v_rap_fin_facturatie_f
AS
    SELECT *
      FROM ykpn_v_rap_fin_facturatie f;


-- Overzicht van opdrachten zonder factuur.
CREATE OR REPLACE VIEW ykpn_v_opdr_zonder_factuur
AS
    SELECT m.mld_melding_key,
           mld_opdr_key,
           m.mld_melding_key || '/' || mld_opdr_bedrijfopdr_volgnr mld_opdr_id,
           mld_melding_datum,
           mld_opdr_datumbegin,
           d.ins_discipline_omschrijving,
           mld_stdmelding_omschrijving,
           mld_melding_onderwerp,
           b.prs_bedrijf_naam,
           mld_opdr_kosten,
           alg_locatie_code,
           alg_locatie_omschrijving,
           mld_statusopdr_omschrijving,
           mld_typeopdr_omschrijving
      FROM mld_opdr            o,
           mld_melding         m,
           alg_locatie         l,
           mld_stdmelding      std,
           ins_tab_discipline  d,
           prs_bedrijf         b,
           mld_statusopdr      so,
           mld_typeopdr        t
     WHERE     o.mld_melding_key = m.mld_melding_key
           AND m.mld_alg_locatie_key = l.alg_locatie_key
           AND m.mld_stdmelding_key = std.mld_stdmelding_key
           AND std.mld_ins_discipline_key = d.ins_discipline_key
           AND o.mld_uitvoerende_keys = b.prs_bedrijf_key
           AND o.mld_statusopdr_key = so.mld_statusopdr_key
           AND o.mld_typeopdr_key = t.mld_typeopdr_key
           AND o.mld_typeopdr_key IN (42,               -- Uitvoering_opdracht
                                      5,                -- Uitvoering melding
                                      143,              -- Uitvoering offerte
                                      142,              --  Bestelling
                                      381               -- Uitvoering uren intern
                                         )
           AND NOT EXISTS
                   (SELECT fin_factuur_key
                      FROM fin_factuur f
                     WHERE f.mld_opdr_key = o.mld_opdr_key);

-- Overzicht ontvangen facturen t.o.v. contractafspraken
CREATE OR REPLACE VIEW ykpn_v_cntfinalg_kosten
AS
    SELECT c.boekmaand,
           g.alg_gebouw_naam
               gebouw,
           cnt_contract_nummer_intern
               contractnummer,
           cnt_contract_omschrijving
               omschrijving,
           COALESCE((SELECT SUM (fin_factuurregel_totaal)
              FROM fin_factuur           f,
                   fin_factuurregel      fr,
                   fin_kenmerkfactregel  kfr
             WHERE     f.fin_factuur_key = fr.fin_factuur_key
                   AND f.cnt_contract_key = c.cnt_contract_key
                   AND fr.fin_factuurregel_key = kfr.fin_factuurregel_key
                   AND fac.safe_to_number (kfr.fin_kenmerkfactregel_waarde) =
                       g.alg_gebouw_key
                   AND f.fin_factuur_boekmaand = c.boekmaand),0)
               bedrag,
           COALESCE (ROUND ((cnt_contract_plaats_gewicht) / 12, 2), 0)
               contractwaarde,
             COALESCE (ROUND ((cnt_contract_plaats_gewicht) / 12, 2), 0)
           - COALESCE((SELECT SUM (fin_factuurregel_totaal)
                FROM fin_factuur           f,
                     fin_factuurregel      fr,
                     fin_kenmerkfactregel  kfr
               WHERE     f.fin_factuur_key = fr.fin_factuur_key
                     AND f.cnt_contract_key = c.cnt_contract_key
                     AND fr.fin_factuurregel_key = kfr.fin_factuurregel_key
                     AND fac.safe_to_number (kfr.fin_kenmerkfactregel_waarde) =
                         g.alg_gebouw_key
                     AND f.fin_factuur_boekmaand = c.boekmaand),0)
               delta
      FROM ykpn_freeze_contract c,
           alg_gebouw           g
     WHERE     c.cnt_alg_plaats_key = g.alg_gebouw_key
           AND ins_discipline_key = 421                              -- vast a
           AND c.freezedate > SYSDATE - 365;

-- En nu een variant die we vergelijken met de verkoop contracten (lees de contractafspraken met KPN)
CREATE OR REPLACE VIEW ykpn_v_cntfinalg_verk_kosten
AS
    SELECT c.boekmaand,
           g.alg_gebouw_naam
               gebouw,
           cnt_contract_nummer_intern
               contractnummer,
           cnt_contract_omschrijving
               omschrijving,
           COALESCE((SELECT SUM (fin_factuurregel_totaal)
                FROM fin_factuur           f,
                     fin_factuurregel      fr,
                     fin_kenmerkfactregel  kfr,
                     ykpn_freeze_contract  c_in
               WHERE     f.fin_factuur_key = fr.fin_factuur_key
                     AND f.cnt_contract_key = c_in.cnt_contract_key
                     AND fr.fin_factuurregel_key = kfr.fin_factuurregel_key
                     AND fac.safe_to_number (kfr.fin_kenmerkfactregel_waarde) =
                         g.alg_gebouw_key
                     AND c_in.cnt_contract_nummer_intern LIKE REPLACE(c.cnt_contract_nummer_intern, 'V', '%')
                     AND c_in.ins_discipline_key = 421  -- vast A
                     AND c_in.cnt_alg_plaats_key = c.cnt_alg_plaats_key
                     AND f.fin_factuur_boekmaand = c.boekmaand),0)
               bedrag,
           COALESCE (ROUND ((cnt_contract_plaats_gewicht) / 12, 2), 0)
               contractwaarde,
             COALESCE (ROUND ((cnt_contract_plaats_gewicht) / 12, 2), 0)
           - COALESCE((SELECT SUM (fin_factuurregel_totaal)
                FROM fin_factuur           f,
                     fin_factuurregel      fr,
                     fin_kenmerkfactregel  kfr,
                     ykpn_freeze_contract  c_in
               WHERE     f.fin_factuur_key = fr.fin_factuur_key
                     AND f.cnt_contract_key = c_in.cnt_contract_key
                     AND fr.fin_factuurregel_key = kfr.fin_factuurregel_key
                     AND fac.safe_to_number (kfr.fin_kenmerkfactregel_waarde) =
                         g.alg_gebouw_key
                     AND c_in.cnt_contract_nummer_intern LIKE REPLACE(c.cnt_contract_nummer_intern, 'V', '%')
                     AND c_in.ins_discipline_key = 421
                     AND c_in.cnt_alg_plaats_key = c.cnt_alg_plaats_key
                     AND f.fin_factuur_boekmaand = c.boekmaand),0)
               delta
      FROM ykpn_freeze_contract c,
           alg_gebouw           g
     WHERE     c.cnt_alg_plaats_key = g.alg_gebouw_key
           AND ins_discipline_key = 902                              -- vast a verkoop
           AND c.freezedate > SYSDATE - 365;

-- Notificatie naar de behandelaar als een procuratieopdracht afgemeld is.
CREATE OR REPLACE VIEW ykpn_v_noti_procuratie_afm
(
    CODE,
    SENDER,
    RECEIVER,
    TEXT,
    KEY,
    XKEY
)
AS
    SELECT DISTINCT
           'CUST08',
           NULL,
           o.prs_perslid_key,
              'Procuratieopdracht is afgemeld '
           || o.mld_melding_key || '/' || o.mld_opdr_bedrijfopdr_volgnr,
           o.mld_opdr_key,
           NULL
      FROM mld_opdr o, fac_tracking t
     WHERE     mld_typeopdr_key = 101    -- procuratie
           AND t.fac_tracking_refkey = o.mld_opdr_key
           AND t.fac_srtnotificatie_key = 60    -- ORDAFM
           AND t.fac_tracking_datum BETWEEN (SELECT   fac_notificatie_job_nextrun
                                                    -   fac_notificatie_job_interval
                                                      / 24
                                               FROM fac_notificatie_job
                                              WHERE fac_notificatie_job_view =
                                                    'YKPN_V_NOTI_PROCURATIE_AFM')
                                        AND (SELECT fac_notificatie_job_nextrun
                                               FROM fac_notificatie_job
                                              WHERE fac_notificatie_job_view =
                                                    'YKPN_V_NOTI_PROCURATIE_AFM');

-- Notificatie die per mail naar de behandelaar van een melding wordt gestuurd indien de hoofdmelding wordt afgemeld,
-- maar er onder de hoofdmelding een of meerdere procuraties hangen waar een het veld 'PO nummer' wel is voorzien van cijfers,
-- maar waar geen vinkje is gezet bij het veld 'PO bedrag doorbelasten?'. (YKPN#55218)
CREATE OR REPLACE VIEW ykpn_v_noti_procuratie_afm_po
(
    code,
    sender,
    receiver,
    text,
    key,
    xkey
)
AS
    SELECT DISTINCT
           'CUST09',
           NULL,
           m.mld_melding_behandelaar_key,
              'Melding '
           || m.mld_melding_key
           || ' is recent afgemeld. Bij de procuratie is nog niet aangevinkt of het PO bedrag doorbelast moet worden.',
           m.mld_melding_key,
           NULL
      FROM mld_melding m, fac_tracking t, fac_srtnotificatie sn
     WHERE     t.fac_tracking_refkey = m.mld_melding_key
           AND t.fac_srtnotificatie_key = sn.fac_srtnotificatie_key
           AND sn.fac_srtnotificatie_code = 'MLDAFM'
           AND EXISTS
                   (SELECT o.mld_opdr_key
                      FROM mld_opdr o, mld_kenmerkopdr koPO
                     WHERE     m.mld_melding_key = o.mld_melding_key
                           AND o.mld_typeopdr_key = 101          -- procuratie
                           AND o.mld_opdr_key = koPO.mld_opdr_key
                           AND koPO.mld_kenmerk_key = 561 --          -- PO Nummer
                           AND fac.safe_to_number (
                                   koPO.mld_kenmerkopdr_waarde)
                                   IS NOT NULL
                           AND NOT EXISTS
                                   (SELECT koBD.mld_kenmerkopdr_key
                                      FROM mld_kenmerkopdr koBD
                                     WHERE     koBD.mld_kenmerk_key = 3701   -- PO BEDRAG DOORBELASTEN?
                                           AND koBD.mld_opdr_key = o.mld_opdr_key
                                           AND koBD.mld_kenmerkopdr_waarde =
                                               '1'))
           AND t.fac_tracking_datum BETWEEN (SELECT   fac_notificatie_job_nextrun
                                                    -   fac_notificatie_job_interval
                                                      / 24
                                               FROM fac_notificatie_job
                                              WHERE fac_notificatie_job_view =
                                                    'YKPN_V_NOTI_PROCURATIE_AFM_PO')
                                        AND (SELECT fac_notificatie_job_nextrun
                                               FROM fac_notificatie_job
                                              WHERE fac_notificatie_job_view =
                                                    'YKPN_V_NOTI_PROCURATIE_AFM_PO');


-- YKPN#52215:
CREATE OR REPLACE view ykpn_v_standplts_aanvr_res
AS
   SELECT p.prs_perslid_naam_full AS aanvrager,
          pp.prs_perslid_email as email,
          wp.alg_locatie_code AS standplaats,
          a.bez_afspraak_key AS afspraaknr,
          a.bez_afspraak_datum AS afspraakdatum,
          a.bez_afspraak_gastheer AS gastheer,
          b.bez_afspraak_naam AS bezoeker,
          b.bez_afspraak_bedrijf AS bedrijf,
          ak.bez_actie_omschrijving AS actie,
          bkw.bez_kenmerkwaarde_waarde AS pincode,
          l.alg_locatie_code AS afspraakloc,
          l.alg_locatie_omschrijving AS afspraaklocatie,
          b.bez_bezoekers_done AS aangemeld,
          b.bez_bezoekers_out AS afgemeld
     FROM bez_bezoekers b,
          bez_kenmerkwaarde bkw,
          bez_afspraak a,
          bez_actie ak,
          prs_v_perslid_fullnames p,
          prs_perslid pp,
          alg_locatie l,
          prs_v_werkplek_gegevens wp,
          prs_v_werkplekperslid_gegevens wpp
    WHERE     a.prs_perslid_key = p.prs_perslid_key
          AND a.alg_locatie_key = l.alg_locatie_key
          AND ak.bez_actie_key = a.bez_actie_key
          AND b.bez_afspraak_key = a.bez_afspraak_key
          AND bkw.bez_bezoekers_key = b.bez_bezoekers_key
          AND wpp.prs_werkplek_key = wp.prs_werkplek_key
          AND p.prs_perslid_key = wpp.prs_perslid_key
          AND p.prs_perslid_key = pp.prs_perslid_key
          AND bkw.bez_kenmerk_key = '1020'
	  AND wp.alg_locatie_code = l.alg_locatie_code
	  AND l.alg_locatie_code = wp.alg_locatie_code
          --AND a.bez_afspraak_datum >= TO_DATE ('01-01-2018', 'DD-MM-YYYY')
          ;

CREATE OR REPLACE VIEW ykpn_v_opdrachturen
AS
    SELECT mld_melding_key || '/' || o.MLD_OPDR_BEDRIJFOPDR_VOLGNR opdrid,
           ou.MLD_OPDR_UREN_DATUM,
           ou.MLD_OPDR_UREN_BESTEED,
           pf.prs_perslid_naam_full
      FROM mld_opdr_uren ou, mld_opdr o, prs_v_perslid_fullnames pf
     WHERE     ou.mld_opdr_key = o.mld_opdr_key
           AND ou.prs_perslid_key = pf.prs_perslid_key;


--
-- Factuur import
--


CREATE OR REPLACE PROCEDURE ykpn_import_factuur (p_import_key IN NUMBER)
AS

    -- Standaard volgorde van de kolommen in het CSV-formaat, waarbij 3 velden VERPLICHT (minimaal door Facilitor vereist)
    -- Variabelelijst
    -- v_leveranciernr: 1
    -- v_factuurnr: 2            (VERPLICHT, anders zet Facilitor '-' in factuurnr, en is status van factuur "Incompleet")
    -- v_factuurdatum: 3
    -- v_ordernr: 4              (VERPLICHT, anders is status van factuur "Incompleet")
    -- v_locatie: 5
    -- v_afleverdatum: 6
    -- v_omschrijving: 7
    -- v_aantal: 8
    -- v_kostprijs: 9            (VERPLICHT, anders is status van factuur "Incompleet")
    -- v_btw_bedrag: 10          (VERPLICHT, of anders veld 11, anders is status van factuur "Incompleet")
    -- v_btw: 11                 (VERPLICHT, of anders veld 10, anders is status van factuur "Incompleet")
    -- v_docid: 12
    -- v_debiteur_nr: 13
    -- v_opmerking: 14
    -- v_btw_verlegd: 15         (VERPLICHT, Ja/Nee/<leeg> waarbij leeg gelijk is aan Nee. Andere waarden leidt tot "Incompleet")
    -- v_kenmerk1: 16
    -- v_kenmerk2: 17
    -- v_kenmerk3: 18
    -- v_kenmerk4: 19
    -- v_kenmerk5: 20
    -- v_boekmaand: 21           (GELDIG, Indien gevuld dan moet er een geldige jaar-maand combinatie staan. Andere waarden leidt tot "Incompleet")
    -- Eerst geprobeerd via nette array, geeft problemen met type buiten package, en in package lukt niet omdat
    -- de import in Facilitor package-loos is (en niet 1-2-3 zo kan worden gemaakt vanwege alle bestaande klanten)
    -- v_seq_of_columns ListOfInteger := (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21);

    -- Dus dan maar via een string, en ook op slimme wijze, nl alsof het een ingelezen factuur-record is met p_fielddelimitor
    v_seq_of_columns VARCHAR(100);


    -- Afwijkingen op deze volgorde zijn in eigen cust_import_factuur te regelen.

    -- Als leveranciersnr en factuurnr b.v. zijn omgedraaid in het CSV-formaat,
    -- dan factuurimport ListOfInteger := (2,1,3,4,5,6,7,8,9,10,11,12);
    -- v_seq_of_columns := '2;1;3;4;5;6;7;8;9;10;11;12';

    -- Als leveranciersnr NIET in CSV staat, dan factuurimport ListOfInteger := (0,2,3,4,5,6,7,8,9,10,11,12);
    -- v_seq_of_columns := '0;2;3;4;5;6;7;8;9;10;11;12';
    -- M.a.w. waar een 0 staat, wordt de variabele niet ingelezen en blift LEEG.

BEGIN
    v_seq_of_columns := '1;2;3;4;5;6;0;8;9;10;11;12;13;14;15;16;7;0;0;0;17';
    fac_import_factuur_body(p_import_key, v_seq_of_columns);

-- voeg een voorloopnul toe aan de boekmaanden op positie 6
-- 2017-9 wordt dan 2017-09

DELETE fac_imp_factuur WHERE factuurnr IS NULL AND factuurdatum IS NULL;

    UPDATE fac_imp_factuur
   SET boekmaand = SUBSTR (boekmaand, 1, 5) || 0 || SUBSTR (boekmaand, 6, 1)
 WHERE     SUBSTR (boekmaand, 1, 4) IS NOT NULL
       AND SUBSTR (boekmaand, 5, 1) = '-'
       AND SUBSTR (boekmaand, 6, 1) IS NOT NULL
       AND SUBSTR (boekmaand, 7, 1) IS NULL
       AND fac_import_key = p_import_key;

   COMMIT;

END;
/


CREATE OR REPLACE PROCEDURE ykpn_update_factuur (p_import_key IN NUMBER)
AS
   v_invoerder  NUMBER(10);
BEGIN

   fac_update_factuur (p_import_key);

   INSERT INTO fin_kenmerkfactregel (fin_factuurregel_key, fin_kenmerk_key, fin_kenmerkfactregel_waarde)
   SELECT DISTINCT fin_factuurregel_key, fin_kenmerk_key, alg_gebouw_key
     FROM fac_imp_factuur i,
          fin_kenmerk k,
          ykpn_v_fin_gebouw g
    WHERE k.fin_kenmerk_key = 41  -- gebouw bij contract
      AND i.fin_factuurregel_key IS NOT NULL
      AND SUBSTR(g.alg_gebouw_omschrijving, 1,2) = SUBSTR(i.kenmerk1, 1,2)
      AND NOT EXISTS
             (SELECT fin_kenmerkfactregel_key
                FROM fin_kenmerkfactregel kf
               WHERE kf.fin_kenmerk_key = 41
                 AND kf.fin_factuurregel_key = i.fin_factuurregel_key);

   INSERT INTO fin_kenmerkfactregel (fin_factuurregel_key, fin_kenmerk_key, fin_kenmerkfactregel_waarde)
   SELECT DISTINCT fin_factuurregel_key, fin_kenmerk_key, fac_usrdata_key
     FROM fac_imp_factuur i,
          fin_kenmerk k,
          fac_usrdata ud
    WHERE k.fin_kenmerk_key = 61  -- afw factuuroms
      AND i.fin_factuurregel_key IS NOT NULL
      AND UPPER(ud.fac_usrdata_omschr) = UPPER(TRIM(i.kenmerk2))
      AND NOT EXISTS
             (SELECT fin_kenmerkfactregel_key
                FROM fin_kenmerkfactregel kf
               WHERE kf.fin_kenmerk_key = 61
                 AND kf.fin_factuurregel_key = i.fin_factuurregel_key);

END;
/

--
-- Koppeling met Exact
--

-- View om gebouw bij factuurregels te tonen
CREATE OR REPLACE VIEW ykpn_v_fin_gebouw
(
    alg_gebouw_key,
    alg_gebouw_omschrijving
)
AS
    SELECT alg_gebouw_key,
              SUBSTR (alg_onrgoedkenmerk_waarde, 5, 2)
           || '-'
           || alg_gebouw_code
           || ' '
           || alg_gebouw_naam
      FROM alg_gebouw g, alg_onrgoedkenmerk aogk
     WHERE g.alg_gebouw_key = aogk.alg_onrgoed_key AND alg_kenmerk_key = 1200;

CREATE OR REPLACE VIEW ykpn_v_aanwezigfactuur
(
   FIN_FACTUUR_KEY,
   FIN_FACTUUR_NR,
   FIN_FACTUUR_TOTAAL,
   FIN_FACTUUR_TOTAAL_BTW,
   MLD_OPDR_KEY,
   CNT_CONTRACT_KEY,
   BES_BESTELOPDR_KEY,
   PRS_PERSLID_KEY_USER,
   FIN_FACTUUR_DATUM,
   FIN_FACTUUR_BOEKMAAND,
   FIN_FACTUUR_DEBITEUR_NR,
   PRS_KOSTENSOORT_KEY,
   FIN_FACTUUR_OPMERKING,
   FIN_FACTUUR_STATUSES_KEY,
   FIN_FACTUUR_VERWIJDER
)
AS
   SELECT FIN_FACTUUR_KEY,
          FIN_FACTUUR_NR,
          FIN_FACTUUR_TOTAAL,
          FIN_FACTUUR_TOTAAL_BTW,
          MLD_OPDR_KEY,
          CNT_CONTRACT_KEY,
          BES_BESTELOPDR_KEY,
          PRS_PERSLID_KEY_USER,
          FIN_FACTUUR_DATUM,
          FIN_FACTUUR_BOEKMAAND,
          FIN_FACTUUR_DEBITEUR_NR,
          PRS_KOSTENSOORT_KEY,
          FIN_FACTUUR_OPMERKING,
          FIN_FACTUUR_STATUSES_KEY,
          FIN_FACTUUR_VERWIJDER
     FROM fin_factuur
    WHERE fin_factuur_verwijder IS NULL AND fin_factuur_statuses_key > 1;


CREATE OR REPLACE VIEW ykpn_v_factuur_gegevens
(
    fin_factuur_key,
    opdracht_id,
    fin_factuur_datum,
    fin_factuur_nr,
    prs_bedrijf_key,
    dagboek,
    fin_factuurregel_totaal,
    fin_factuurregel_btw,
    fin_btwtabelwaarde_code,
    fin_btwtabelwaarde_key,
    fin_factuurregel_nr,
    fin_factuurregel_key,
    fin_factuur_debiteur_nr,
    fin_factuur_opmerking,
    fin_factuur_boekmaand,
    opdr_datum,
    project_nummer,
    prs_kostensoort_oms,
    prs_kostensoort_refcode,
    prs_kostensoort_opmerking,
    prs_kostensoort_key,
    prs_kostenplaats_nr,
    mld_opdr_key,
    cnt_contract_key,
    bes_bestelopdr_key,
    fin_factuur_statuses_key,
    lev_kpn
)
AS
    SELECT f.fin_factuur_key,
           DECODE (
               c.cnt_contract_key,
               NULL, DECODE (
                         bo.bes_bestelopdr_key,
                         NULL, (SELECT    sd.ins_srtdiscipline_prefix
                                       || m.mld_melding_key
                                       || '/'
                                       || o.mld_opdr_bedrijfopdr_volgnr
                                  FROM mld_melding         m,
                                       mld_stdmelding      std,
                                       ins_tab_discipline  d,
                                       ins_srtdiscipline   sd
                                 WHERE     m.mld_melding_key =
                                           o.mld_melding_key
                                       AND m.mld_stdmelding_key =
                                           std.mld_stdmelding_key
                                       AND std.mld_ins_discipline_key =
                                           d.ins_discipline_key
                                       AND d.ins_srtdiscipline_key =
                                           sd.ins_srtdiscipline_key),
                         bo.bes_bestelopdr_id),
                  'C'
               || TO_CHAR (cnt_contract_nummer_intern)
               || DECODE (cnt_contract_versie,
                          NULL, NULL,
                          '.' || cnt_contract_versie))
               opdracht_id,
           f.fin_factuur_datum,
           f.fin_factuur_nr,
           COALESCE (b_c.prs_bedrijf_key,
                     COALESCE (b_o.prs_bedrijf_key, b_b.prs_bedrijf_key))
               prs_bedrijf_key,
           DECODE (
               (SELECT prs_kenmerklink_waarde
                  FROM prs_kenmerklink kl
                 WHERE     kl.prs_kenmerk_key = 1020
                       AND kl.prs_link_key =
                           COALESCE (
                               b_c.prs_bedrijf_key,
                               COALESCE (b_o.prs_bedrijf_key,
                                         b_b.prs_bedrijf_key))),
               '1', 63,
               62)
               dagboek,
           fr.fin_factuurregel_totaal,
           ROUND (
                 fr.fin_factuurregel_totaal
               * DECODE (btw.fin_btwtabelwaarde_verlegd,
                         1, 0,
                         btw.fin_btwtabelwaarde_perc / 100),
               2)
               fin_factuurregel_btw,
           btw.fin_btwtabelwaarde_code,
           btw.fin_btwtabelwaarde_key,
           fr.fin_factuurregel_nr,
           fr.fin_factuurregel_key,
           f.fin_factuur_debiteur_nr,
           f.fin_factuur_opmerking,
           f.fin_factuur_boekmaand,
           COALESCE (
               o.mld_opdr_datumbegin,
               COALESCE (c.cnt_contract_looptijd_tot,
                         bo.bes_bestelopdr_datum)),
           (SELECT MAX (mld_kenmerkopdr_waarde)
              FROM mld_kenmerkopdr ko, mld_opdr po
             WHERE     ko.mld_opdr_key = po.mld_opdr_key
                   AND o.mld_melding_key = po.mld_melding_key
                   AND ko.mld_kenmerk_key = 561)                  -- PO nummer
               projectnummer,
           prs_kostensoort_oms,
           k.prs_kostensoort_refcode,
           k.prs_kostensoort_opmerking,
           k.prs_kostensoort_key,
           COALESCE (
               (SELECT alg_onrgoedkenmerk_waarde
                  FROM alg_onrgoedkenmerk            aogk,
                       alg_v_onroerendgoed_gegevens  aogg,
                       mld_melding                   m
                 WHERE     o.mld_melding_key = m.mld_melding_key
                       AND m.mld_alg_onroerendgoed_keys =
                           aogg.alg_onroerendgoed_keys
                       AND aogg.alg_gebouw_key = aogk.alg_onrgoed_key
                       AND aogk.alg_kenmerk_key = 1200
                UNION ALL
                SELECT alg_onrgoedkenmerk_waarde
                  FROM alg_onrgoedkenmerk aogk, fin_kenmerkfactregel kfr
                 WHERE     fr.fin_factuurregel_key = kfr.fin_factuurregel_key
                       AND kfr.fin_kenmerk_key = 41
                       AND c.cnt_contract_key IS NOT NULL
                       AND f.cnt_contract_plaats_key IS NULL
                       AND fac.safe_to_number (
                               kfr.fin_kenmerkfactregel_waarde) =
                           aogk.alg_onrgoed_key
                       AND aogk.alg_kenmerk_key = 1200
                UNION ALL
                SELECT alg_onrgoedkenmerk_waarde
                  FROM alg_onrgoedkenmerk aogk, cnt_contract_plaats cp
                 WHERE     f.cnt_contract_plaats_key = cp.cnt_contract_plaats_key
                       AND cp.cnt_alg_plaats_key = aogk.alg_onrgoed_key
                       AND c.cnt_contract_key IS NOT NULL
                       AND aogk.alg_kenmerk_key = 1200),
               'Onbekend')
               prs_kostenplaats_nr,
           o.mld_opdr_key,
           c.cnt_contract_key,
           bo.bes_bestelopdr_key,
           ( -- status van de factuur is ingevoerd als er facturen van dezelfde leverancier en nummer zijn
                              -- met status ingevoerd, afgewezen of incompleet
           SELECT DECODE (COUNT (*), 0, f.fin_factuur_statuses_key, 2)
             FROM fin_factuur     f_t,
                  cnt_contract    c_t,
                  bes_bestelopdr  b_t,
                  mld_opdr        o_t
            WHERE     f_t.fin_factuur_verwijder IS NULL
                  AND f_t.mld_opdr_key = o_t.mld_opdr_key(+)
                  AND f_t.cnt_contract_key = c_t.cnt_contract_key(+)
                  AND f_t.bes_bestelopdr_key = b_t.bes_bestelopdr_key(+)
                  AND COALESCE (
                          o_t.mld_uitvoerende_keys,
                          COALESCE (
                              b_t.prs_bedrijf_key,
                              COALESCE (
                                  c_t.cnt_prs_bedrijf_key,
                                  (SELECT a.prs_bedrijf_key
                                     FROM prs_v_afdeling a, prs_perslid p
                                    WHERE     o_t.mld_uitvoerende_keys =
                                              p.prs_perslid_key
                                          AND p.prs_afdeling_key =
                                              a.prs_afdeling_key)))) =
                      COALESCE (
                          o.mld_uitvoerende_keys,
                          COALESCE (
                              bo.prs_bedrijf_key,
                              COALESCE (
                                  c.cnt_prs_bedrijf_key,
                                  (SELECT a.prs_bedrijf_key
                                     FROM prs_v_afdeling a, prs_perslid p
                                    WHERE     o.mld_uitvoerende_keys =
                                              p.prs_perslid_key
                                          AND p.prs_afdeling_key =
                                              a.prs_afdeling_key))))
                  AND f.fin_factuur_nr = f_t.fin_factuur_nr
                  AND f_t.fin_factuur_statuses_key IN (1, 2, 3)
                  AND f.fin_factuur_statuses_key = 6)
               fin_factuur_statuses_key,
           lk.prs_kostenplaats_nr
               lev_kpn
      FROM fin_factuur         f,
           fin_factuurregel    fr,
           fin_btwtabelwaarde  btw,
           mld_opdr            o,
           mld_typeopdr        ot,
           cnt_contract        c,
           bes_bestelopdr      bo,
           (SELECT mld_uitvoerende_key,
                   DECODE (u.TYPE,
                           'B', mld_uitvoerende_key,
                           a.prs_bedrijf_key)
                       prs_bedrijf_key
              FROM mld_v_uitvoerende u, prs_v_afdeling a, prs_perslid p
             WHERE     u.mld_uitvoerende_key = prs_perslid_key(+)
                   AND p.prs_afdeling_key = a.prs_afdeling_key(+)) b_o,
           prs_bedrijf         b_c,
           prs_bedrijf         b_b,
           prs_kostensoort     k,
           prs_kostensoortgrp  kg,
           prs_kostenplaats    lk
     WHERE     f.fin_factuur_key = fr.fin_factuur_key
           AND fr.fin_btwtabelwaarde_key = btw.fin_btwtabelwaarde_key
           AND f.mld_opdr_key = o.mld_opdr_key(+)
           AND o.mld_typeopdr_key = ot.mld_typeopdr_key(+)
           AND f.cnt_contract_key = c.cnt_contract_key(+)
           AND f.bes_bestelopdr_key = bo.bes_bestelopdr_key(+)
           AND bo.prs_bedrijf_key = b_b.prs_bedrijf_key(+)
           AND o.mld_uitvoerende_keys = b_o.mld_uitvoerende_key(+)
           AND c.cnt_prs_bedrijf_key = b_c.prs_bedrijf_key(+)
           AND c.prs_kostensoort_key = k.prs_kostensoort_key(+)
           AND k.prs_kostenplaats_key = lk.prs_kostenplaats_key(+)
           AND k.prs_kostensoortgrp_key = kg.prs_kostensoortgrp_key(+)
           AND f.fin_factuur_verwijder IS NULL;



CREATE OR REPLACE VIEW ykpn_v_export_exact_xml (
   result,
   result_order
   )
AS
   SELECT fac_rapport_regel, fac_rapport_volgnr
   FROM fac_rapport
   WHERE fac_rapport_node = 'EXACT';


CREATE OR REPLACE VIEW ykpn_v_export_exact_62 (
   result,
   result_order
   )
AS
   SELECT result, result_order
   FROM ykpn_v_export_exact_xml;

CREATE OR REPLACE VIEW ykpn_v_export_exact_63 (
   result,
   result_order
   )
AS
   SELECT result, result_order
   FROM ykpn_v_export_exact_xml;


CREATE OR REPLACE VIEW ykpn_v_bron_export_exact_xml
(
    fin_factuur_key,
    opdracht_id,
    factuur_nr,                                     -- crediteur factuurnummer
    datum,                                                     -- factuurdatum
    crdnr,                                                  -- crediteurnummer
    project_nummer,                                               -- PO nummer
    bedrag_txt,
    bedrag,
    bedrag_incl,
    oms_regel,                              -- omschrijving in de detailregels
    reknr,                                              -- grootboekrekeningnr
    kstplcode,                              -- kostenplaats kenmerk bij gebouw
    kstdrcode,                               -- kostendrager afh van grootboek
    btw_code,
    dagboek,
    oms_kop,                                    -- omschrijving in de kopregel
    fin_factuur_debiteur_nr                        -- crediteur debiteurnummer
)
AS
  SELECT fin_factuur_key,
           opdracht_id,
           fin_factuur_nr,
           TO_CHAR (fin_factuur_datum, 'yyyy-mm-dd')
               datum,
           prs_leverancier_nr crdnr,
           project_nummer,
           REPLACE (TO_CHAR (bedrag), ',', '.')
               bedrag_txt,
           bedrag,
           bedrag_incl,
              SUBSTR (UPPER (DECODE(b.prs_leverancier_nr, '801176', 'YAS', b.prs_bedrijf_naam)), 1, 3)
           || ','
           || SUBSTR(fin_factuur_boekmaand, 6,2)
           || ','
           || opdracht_id
           || ','
           || DECODE(fg.cnt_contract_key, NULL, 'variabel',
                                                COALESCE (LOWER(afwfactoms), LOWER(prs_kostensoort_opmerking)))
               oms_regel,
           DECODE (fg.cnt_contract_key, NULL, DECODE(b.prs_leverancier_nr, '801176',
                                                                           DECODE (project_nummer, NULL, '64900', '65310'),  -- Yask
                                                                           DECODE (project_nummer, NULL, '74900', '75310')),
                                              prs_kostensoort_oms)
               reknr,
           prs_kostenplaats_nr
               kstplcode,
           DECODE (cnt_contract_key, NULL,
                                     DECODE (project_nummer, NULL, '10', '11'),
                                     DECODE ((SELECT ins_discipline_key
                                                FROM cnt_contract c
                                               WHERE c.cnt_contract_key = fg.cnt_contract_key ),
                                                 421, '00', -- Vast
                                                 461, '01', -- Variabel
                                                      '-'))
               kstdrcode,
           fin_btwtabelwaarde_code
               btw_code,
           fg.dagboek,
           SUBSTR(UPPER(DECODE(b.prs_leverancier_nr, '801176', 'YAS', b.prs_bedrijf_naam)),1,3) || ',' ||
           SUBSTR(fin_factuur_boekmaand,6,2) ||
           DECODE(fg.cnt_contract_key, NULL, ',variabel',
                                             ','|| LOWER(prs_kostensoort_opmerking)) oms_kop,
           fin_factuur_debiteur_nr
      FROM (  SELECT g.fin_factuur_key,
                     opdracht_id,
                     project_nummer,
                     fin_factuur_datum,
                     fin_factuur_nr,
                     prs_bedrijf_key,
                     fin_factuur_debiteur_nr,
                     fin_factuur_opmerking,
                     SUM (fin_factuurregel_totaal)
                         bedrag,
                     SUM (fin_factuurregel_totaal + fin_factuurregel_btw)
                         bedrag_incl,
                     fin_btwtabelwaarde_code,
                     prs_kostensoort_oms,
                     prs_kostensoort_refcode,
                     prs_kostensoort_opmerking,
                     mld_opdr_key,
                     cnt_contract_key,
                     prs_kostenplaats_nr,
                     fin_factuur_boekmaand,
                     g.dagboek,
                     afo.afwfactoms
                FROM ykpn_v_factuur_gegevens g,
                     ykpn_exp_factuur e,
                     (SELECT fin_factuurregel_key, fac_usrdata_omschr afwfactoms
                        FROM fin_kenmerkfactregel kfr, fac_usrdata ud
                       WHERE     fin_kenmerk_key = 61           -- Afwijkende factuuromschrijving
                             AND FAC.safe_to_number(fin_kenmerkfactregel_waarde) = ud.fac_usrdata_key
                     ) afo
               WHERE     fin_factuur_statuses_key = 6
                     AND g.fin_factuur_key = e.fin_factuur_key
                     AND g.dagboek = e.dagboek
                     AND g.fin_factuurregel_key = afo.fin_factuurregel_key(+)
            GROUP BY g.fin_factuur_key,
                     opdracht_id,
                     project_nummer,
                     fin_factuur_datum,
                     fin_factuur_nr,
                     prs_bedrijf_key,
                     fin_factuur_debiteur_nr,
                     fin_factuur_opmerking,
                     fin_btwtabelwaarde_code,
                     prs_kostensoort_oms,
                     prs_kostensoort_refcode,
                     prs_kostensoort_opmerking,
                     mld_opdr_key,
                     cnt_contract_key,
                     prs_kostenplaats_nr,
                     fin_factuur_boekmaand,
                     g.dagboek,
                     afo.afwfactoms) fg,
           prs_bedrijf  b
     WHERE fg.prs_bedrijf_key = b.prs_bedrijf_key
       AND b.prs_leverancier_nr IS NOT NULL;

-- rapport voor controle door de financiele afdeling voordat definitief geboekt wordt.
CREATE OR REPLACE VIEW ykpn_v_fin_factuur_controle
AS
  SELECT prs_leverancier_nr,
         boekstuknummer,
         dagboek,
         boekjaar,
         periode,
         gefiatteerd,
         onzeref,
         naamcrediteur,
         omschrijving,
         SUM (fin_factuurregel_totaal) bedrag,
         SUM (fin_factuurregel_totaal + fin_factuurregel_btw) bedragincl,
         uwref,
         invoerder,
         reknr
    FROM (SELECT prs_leverancier_nr,
                 bsn.boekstuknummer,
                 dagboek,
                 SUBSTR (fg.fin_factuur_boekmaand, 1, 4)
                     boekjaar,
                 SUBSTR (fg.fin_factuur_boekmaand, 6, 2)
                     periode,
                 (  SELECT LISTAGG (
                                  pf.prs_perslid_naam_full
                               || ' '
                               || TO_CHAR (t.fac_tracking_datum,
                                           'dd-mm-yyyy hh24:mi'),
                               CHR (10))
                               WITHIN GROUP (ORDER BY fac_tracking_datum)
                               AS fiatteur
                      FROM fac_tracking t, prs_v_perslid_fullnames_all pf
                     WHERE     t.fac_srtnotificatie_key IN (131, 132)  -- FINFOK, FINGOE
                           AND t.prs_perslid_key = pf.prs_perslid_key
                           AND t.fac_tracking_refkey = fg.fin_factuur_key
                  GROUP BY fac_tracking_refkey)
                     gefiatteerd,
                 fg.fin_factuur_key
                     OnzeRef,
                 prs_bedrijf_naam
                     NaamCrediteur,
                    SUBSTR (UPPER (b.prs_bedrijf_naam), 1, 3)
                 || ','
                 || SUBSTR (fin_factuur_boekmaand, 6, 2)
                 || ','
                 || opdracht_id
                 || ','
                 || DECODE (project_nummer,
                            NULL, fin_factuur_opmerking,
                            project_nummer)
                     omschrijving,
                 fin_factuurregel_totaal,
                 fin_factuurregel_btw,
                 DECODE(b.prs_leverancier_nr, '801176',
                                              DECODE (project_nummer, NULL, '64900', '65310'),  -- Yask
                                              DECODE (project_nummer, NULL, '74900', '75310'))
                     reknr,
                 fg.fin_factuur_nr || '  ' || fg.fin_factuur_debiteur_nr
                     uwref,
                 (SELECT pf.prs_perslid_naam_full
                    FROM fac_tracking t, prs_v_perslid_fullnames_all pf
                   WHERE     t.fac_srtnotificatie_key = 129          -- FINNEW
                         AND t.fac_tracking_refkey = fg.fin_factuur_key
                         AND t.prs_perslid_key = pf.prs_perslid_key)
                     invoerder
            FROM ykpn_v_factuur_gegevens fg,
                 prs_bedrijf            b,
                 (SELECT fin_factuur_key,
                         fin_kenmerkfactuur_waarde boekstuknummer
                    FROM fin_kenmerkfactuur kf
                   WHERE fin_kenmerk_key = 1) bsn
           WHERE     fg.prs_bedrijf_key = b.prs_bedrijf_key
                 AND fg.fin_factuur_key = bsn.fin_factuur_key(+))
GROUP BY prs_leverancier_nr,
         boekstuknummer,
         dagboek,
         boekjaar,
         periode,
         gefiatteerd,
         onzeref,
         naamcrediteur,
         omschrijving,
         reknr,
         uwref,
         invoerder;


-- Procedure om alle facturen te exporteren naar exact.
CREATE OR REPLACE PROCEDURE ykpn_select_exact_xml (p_applname IN VARCHAR2,
                                                   p_applrun IN VARCHAR2,
                                                   p_dagboek IN VARCHAR2
)
AS
   CURSOR c(c_dagboek VARCHAR2)
   IS
       SELECT crdnr, factuur_nr, MAX(datum) datum, MAX(oms_kop) oms_kop
         FROM ykpn_v_bron_export_exact_xml
        WHERE c_dagboek = dagboek
        GROUP BY crdnr, factuur_nr;

   CURSOR c_sub (c_crdnr VARCHAR2, c_factuur_nr VARCHAR2)
   IS
       SELECT *
         FROM ykpn_v_bron_export_exact_xml
        WHERE COALESCE(crdnr, 'CrdNr') = COALESCE(c_crdnr, 'CrdNr')
          AND factuur_nr = c_factuur_nr;

   v_order_count     NUMBER;
   v_amount_sum      NUMBER(10,2);
   v_amount_sum_incl NUMBER(10,2);
   v_count           NUMBER;
   v_sub_count       NUMBER;
   v_bestand         VARCHAR2(12);
   v_boekstuknummer  NUMBER;
   v_crdnr           PRS_BEDRIJF.PRS_LEVERANCIER_NR%TYPE;
   v_factuur_nr      FIN_FACTUUR.FIN_FACTUUR_NR%TYPE;

BEGIN

   v_order_count     := 0;
   v_amount_sum      := 0;
   v_amount_sum_incl := 0;
   v_count           := 0;
   v_bestand         := 'EXACT';
   v_crdnr           := 'Q';
   v_factuur_nr      := 'Q';

   -- Eerst opruiming
   DELETE FROM imp_log
    WHERE imp_log_applicatie = p_applname;

   DELETE fac_rapport
    WHERE fac_rapport_node = v_bestand;

   -- Verwijder het kenmerk boekstuknummer van de facturen die niet op verwerkt staan
   DELETE fin_kenmerkfactuur kf
    WHERE fin_kenmerk_key = 1
      AND SUBSTR(fin_kenmerkfactuur_waarde, 3,2) = p_dagboek
      AND fin_factuur_key IN (SELECT fin_factuur_key
                                FROM fin_factuur
                               WHERE fin_factuur_statuses_key <> 7);

   -- Bewaar de factuur keys in een tijdelijke tabel zodat bij het verwerken (nieuwe export)
   -- deze keys gebruikt kunnen worden.
   DELETE ykpn_exp_factuur
    WHERE dagboek = p_dagboek;

   INSERT INTO ykpn_exp_factuur (fin_factuur_key, dagboek)
   ( SELECT DISTINCT fg.fin_factuur_key, fg.dagboek
       FROM ykpn_v_factuur_gegevens fg,
            prs_bedrijf  b
      WHERE fg.prs_bedrijf_key = b.prs_bedrijf_key
        AND b.prs_leverancier_nr IS NOT NULL
        AND fg.fin_factuur_statuses_key = 6
        AND fg.fin_factuur_datum > SYSDATE - (5 * 365)  -- Check op geldige factuurdatum:
        AND fg.fin_factuur_datum < SYSDATE + 365        -- facturen mogen niet ouder zijn dan 5 jaar of meer dan één jaar in de toekomst.
   );

   -- Bepaal het boekstuknummer (key 3) met het hoogste nummer van dit jaar
   -- ## AAIT#36589

   SELECT MAX(fin_kenmerkfactuur_waarde)
     INTO v_boekstuknummer
     FROM fin_kenmerkfactuur
    WHERE fin_kenmerk_key = 1
      AND SUBSTR(fin_kenmerkfactuur_waarde,1,2) = TO_CHAR(SYSDATE, 'YY')
      AND SUBSTR(fin_kenmerkfactuur_waarde,3,2) = p_dagboek;

   IF v_boekstuknummer IS NULL
   THEN
      v_boekstuknummer := FAC.safe_to_number(TO_CHAR(SYSDATE, 'YY') || p_dagboek || '0000');
   END IF;

   -- header
   ykpn.add_xml_row (v_bestand, '<?xml version="1.0" encoding="windows-1252"?>');
   ykpn.add_xml_row (v_bestand, '<eExact>');
   ykpn.add_xml_row (v_bestand, '<GLEntries>');

   FOR rec IN c(p_dagboek)
   LOOP
      BEGIN
         -- Als we een nieuwe leverancier/factuurnummer tegenkomen gaan we het boekstuknummer ophogen.
         IF rec.crdnr <> v_crdnr OR rec.factuur_nr <> v_factuur_nr
         THEN
            v_boekstuknummer := v_boekstuknummer + 1;
            v_crdnr := rec.crdnr;
            v_factuur_nr := rec.factuur_nr;
         END IF;

         ykpn.add_xml_row (v_bestand, '<GLEntry status="E" entry="' || xml.char_to_html(v_boekstuknummer) || '">');
            ykpn.add_xml_element (v_bestand, 'Description', rec.oms_kop);
            ykpn.add_xml_element (v_bestand, 'Date', rec.datum);
            ykpn.add_xml_element (v_bestand, 'DocumentDate', TO_CHAR(SYSDATE, 'YYYY-MM-DD') );
            ykpn.add_xml_row (v_bestand, '<Journal type="I" code="' || p_dagboek || '"/>');
               v_sub_count := 1;
               FOR rec1 IN c_sub (v_crdnr, v_factuur_nr)
               LOOP
                  BEGIN
                     -- Eerst maar even een kenmerk voor het boestuknummer aanmaken
                     ykpn.set_kenmerk('FIN', 1, rec1.fin_factuur_key, v_boekstuknummer, 0);
                     ykpn.add_xml_row (v_bestand, '<FinEntryLine number="' || v_sub_count || '" subtype="T" type="N">');
                        ykpn.add_xml_element (v_bestand, 'Date', rec1.datum);
                        ykpn.add_xml_row (v_bestand, '<GLAccount code="' || xml.char_to_html(rec1.reknr) || '"/>');
                        ykpn.add_xml_element (v_bestand, 'Description', rec1.oms_regel);
                        ykpn.add_xml_row (v_bestand, '<Costcenter code="' || xml.char_to_html(rec1.kstplcode) || '"/>');
                        ykpn.add_xml_row (v_bestand, '<Costunit code="' || xml.char_to_html(rec1.kstdrcode) || '"/>');
                        ykpn.add_xml_row (v_bestand, '<Creditor number="' || xml.char_to_html(rec1.crdnr) || '"/>');
                        ykpn.add_xml_row (v_bestand, '<Item code=""/>');
                        ykpn.add_xml_row (v_bestand, '<Amount>');
                           ykpn.add_xml_element (v_bestand, 'Debit', rec1.bedrag_txt);
                           ykpn.add_xml_row (v_bestand, '<VAT code="' || xml.char_to_html(rec1.btw_code) || '"/>');
                        ykpn.add_xml_row (v_bestand, '</Amount>');
                        ykpn.add_xml_row (v_bestand, '<Payment>');
                           ykpn.add_xml_element (v_bestand, 'Reference', rec.factuur_nr || '  ' || rec1.fin_factuur_debiteur_nr );
                           ykpn.add_xml_element (v_bestand, 'InvoiceNumber', rec1.fin_factuur_key); -- of moet dit v_boekstuknummer worden????
                        ykpn.add_xml_row (v_bestand, '</Payment>');
                        ykpn.add_xml_row (v_bestand, '<FinReferences>');
                           ykpn.add_xml_element (v_bestand, 'YourRef', rec.factuur_nr || '  ' || rec1.fin_factuur_debiteur_nr);
                           ykpn.add_xml_element (v_bestand, 'DocumentDate', TO_CHAR(SYSDATE, 'YYYY-MM-DD') );
                        ykpn.add_xml_row (v_bestand, '</FinReferences>');
                        IF rec1.project_nummer IS NOT NULL
                        THEN
                        ykpn.add_xml_row (v_bestand, '<FreeFields>');
                           ykpn.add_xml_row (v_bestand, '<FreeTexts>');
                              ykpn.add_xml_row (v_bestand, '<FreeText number="1">PO' || rec1.project_nummer || '</FreeText>');
                           ykpn.add_xml_row (v_bestand, '</FreeTexts>');
                        ykpn.add_xml_row (v_bestand, '</FreeFields>');
                        END IF;
                     ykpn.add_xml_row (v_bestand, '</FinEntryLine>');
                     v_sub_count := v_sub_count + 1;
                     v_amount_sum   := v_amount_sum + rec1.bedrag;
                     v_amount_sum_incl   := v_amount_sum_incl + rec1.bedrag_incl;
                  END;
               END LOOP;
               IF v_sub_count = 1
               THEN
                  fac.writelog (p_applname, 'E', 'Fout tijdens Exact export. Factuurnummer: ' || v_factuur_nr || ' Crdnr: ' || v_crdnr,'');
               END IF;
         ykpn.add_xml_row (v_bestand, '</GLEntry>');
         v_order_count  := v_order_count + 1;
      END;
   END LOOP;

   ykpn.add_xml_row (v_bestand, '</GLEntries>');
   ykpn.add_xml_row (v_bestand, '</eExact>');
   fac.writelog (p_applname, 'S', 'Exact export uitgevoerd. Aantal regels: ' || v_order_count || ' Totaal bedrag: ' || v_amount_sum || ' Totaal bedrag (incl): ' || v_amount_sum_incl, '');

END;
/


CREATE OR REPLACE PROCEDURE ykpn_select_exact_62 (p_applname IN VARCHAR2,
                                                  p_applrun IN VARCHAR2
)
AS
BEGIN
   ykpn_select_exact_xml (p_applname, p_applrun, '62');
END;
/

CREATE OR REPLACE PROCEDURE ykpn_select_exact_63 (p_applname IN VARCHAR2,
                                                  p_applrun IN VARCHAR2
)
AS
BEGIN
   ykpn_select_exact_xml (p_applname, p_applrun, '63');
END;
/

-- Procedure om alle facturen te exporteren naar exact.
CREATE OR REPLACE PROCEDURE ykpn_export_exact_62 (
   p_applname   IN   VARCHAR2,
   p_applrun    IN   VARCHAR2,
   p_filedir    IN   VARCHAR2,
   p_filename   IN   VARCHAR2
)
AS
   v_errormsg       VARCHAR (200);
   oracle_err_num   NUMBER;
   oracle_err_mes   VARCHAR2 (200);
BEGIN
   -- Verwerk actie direct starten na de EXPORT_EXACT
   -- INSERT INTO imp_schedule (imp_schedule_name) VALUES ('VERWERK_EXACT_62');
   NULL;
END;
/

-- Procedure om alle facturen te exporteren naar exact.
CREATE OR REPLACE PROCEDURE ykpn_export_exact_63 (
   p_applname   IN   VARCHAR2,
   p_applrun    IN   VARCHAR2,
   p_filedir    IN   VARCHAR2,
   p_filename   IN   VARCHAR2
)
AS
   v_errormsg       VARCHAR (200);
   oracle_err_num   NUMBER;
   oracle_err_mes   VARCHAR2 (200);
BEGIN
   -- Verwerk actie direct starten na de EXPORT_EXACT
   -- INSERT INTO imp_schedule (imp_schedule_name) VALUES ('VERWERK_EXACT_63');
   NULL;
END;
/

CREATE OR REPLACE VIEW ykpn_v_export_verwerk_exact (
   result,
   result_order
   )
AS
   SELECT 'Lijst met bevroren facturen:' fac_rapport_regel, 0 fac_rapport_volgnr
     FROM DUAL
   UNION ALL
   SELECT fac_rapport_regel, fac_rapport_volgnr
   FROM fac_rapport
   WHERE fac_rapport_node = 'VW_EXACT';


CREATE OR REPLACE VIEW ykpn_v_export_verwerk_exact_62 (
   result,
   result_order
   )
AS
   SELECT result, result_order
   FROM ykpn_v_export_verwerk_exact;

CREATE OR REPLACE VIEW ykpn_v_export_verwerk_exact_63 (
   result,
   result_order
   )
AS
   SELECT result, result_order
   FROM ykpn_v_export_verwerk_exact;

CREATE OR REPLACE PROCEDURE ykpn_select_verwerk_exact (
   p_applname   IN   VARCHAR2,
   p_applrun    IN   VARCHAR2,
   p_dagboek    IN   VARCHAR2
)
AS
   CURSOR c_fact
   IS
     SELECT DISTINCT f.fin_factuur_key
       FROM ykpn_exp_factuur f
          , ykpn_v_factuur_gegevens fg
      WHERE f.fin_factuur_key = fg.fin_factuur_key
        AND fg.fin_factuur_statuses_key = 6
        AND f.dagboek = p_dagboek;

   v_errormsg       VARCHAR (200);
   oracle_err_num   NUMBER;
   oracle_err_mes   VARCHAR2 (200);
   v_aanvrager      NUMBER;
   v_bestelling_key NUMBER;
   v_bestand        VARCHAR2(12);
   v_logdate        DATE;
   v_volgnr         NUMBER;
BEGIN
   v_errormsg := 'Geen akties';
   v_aanvrager := 3; -- Facilitor
   v_logdate := SYSDATE;

   v_bestand         := 'VW_EXACT';
   v_volgnr          := 1;
   -- Eerst opruiming
   DELETE fac_rapport
    WHERE fac_rapport_node = v_bestand;

   FOR rec1 IN c_fact
   LOOP
      BEGIN
         UPDATE fin_factuur f
            SET fin_factuur_statuses_key = 7
          WHERE f.fin_factuur_key = rec1.fin_factuur_key;

         fac.trackaction ('FINVER', rec1.fin_factuur_key, v_aanvrager, NULL, NULL);

         INSERT INTO fac_rapport (fac_rapport_node,
                                  fac_rapport_volgnr,
                                  fac_rapport_regel)
                          VALUES (v_bestand,
                                  v_volgnr,
                                  rec1.fin_factuur_key);

         v_volgnr := v_volgnr + 1;
      END;
   END LOOP;
   -- verwijder de enties uit de tijdelijke tabel.
   DELETE ykpn_exp_factuur WHERE dagboek = p_dagboek;
END;
/


CREATE OR REPLACE PROCEDURE ykpn_select_verwerk_exact_62 (
   p_applname   IN   VARCHAR2,
   p_applrun    IN   VARCHAR2
)
AS
BEGIN
   ykpn_select_verwerk_exact (p_applname, p_applrun, '62');
END;
/

CREATE OR REPLACE PROCEDURE ykpn_select_verwerk_exact_63 (
   p_applname   IN   VARCHAR2,
   p_applrun    IN   VARCHAR2
)
AS
BEGIN
   ykpn_select_verwerk_exact (p_applname, p_applrun, '63');
END;
/

-- Importfunctie om objecten (mobiele telefoons) in Facilitor in te lezen
CREATE OR REPLACE PROCEDURE ykpn_import_ins_mob (p_import_key IN NUMBER)
AS
BEGIN
   fac_import_ins (p_import_key);
END;
/

CREATE OR REPLACE PROCEDURE ykpn_update_ins_mob (p_import_key IN NUMBER)
AS
   CURSOR c
   IS
      SELECT *
        FROM fac_imp_ins i;

   v_perslid_key NUMBER(10);
BEGIN
   -- als de locatiecode minder dan 3 posities heeft dan moeten we er een voorloopnul aan toevoegen.
   UPDATE fac_imp_ins
      SET alg_locatie_code = '0' || alg_locatie_code
    WHERE LENGTH (alg_locatie_code) = 2;

   -- Eerst de standaard import
   fac_update_ins (p_import_key);

   -- En vervolgens de ruisnaam koppelen als uitleen
   FOR rec IN c
   LOOP
      BEGIN
         SELECT prs_perslid_key
           INTO v_perslid_key
           FROM prs_perslid
          WHERE prs_perslid_verwijder IS NULL
            AND prs_perslid_oslogin = UPPER(SUBSTR(rec.ins_kenmerkwaarde1, INSTR(rec.ins_kenmerkwaarde1, '=')+1));

         UPDATE ins_deel
            SET ins_alg_ruimte_key_org = ins_alg_ruimte_key,
                ins_alg_ruimte_type_org = ins_alg_ruimte_type
          WHERE ins_deel_omschrijving = rec.ins_deel_omschrijving;

         UPDATE ins_deel
            SET ins_alg_ruimte_key = v_perslid_key,
                ins_alg_ruimte_type = 'P'
          WHERE ins_deel_omschrijving = rec.ins_deel_omschrijving;

      EXCEPTION WHEN NO_DATA_FOUND
      THEN
         fac.imp_writelog (
            p_import_key,
            'E',
            'Persoon kan niet gevonden worden en wordt niet gekoppeld: ' || rec.ins_deel_omschrijving || '-' || UPPER(SUBSTR(rec.ins_kenmerkwaarde1, INSTR(rec.ins_kenmerkwaarde1, '=')+1)),
            '');
      END;
   END LOOP;
END;
/

--
-- Importprocedure om mail berichten van de storelocator in Facilitor in te lezen
-- Andere imports zijn ook mogelijk zo is er een specifieke koppeling met Qyn
-- Daarnaast is er een algemene mail import. Hierbij wordt de standaardmelding_key uit
-- een kenmerk bij de persoon gelezen en bepaald de bezetting van deze persoon de locatie.
-- De persoon wordt gevonden door in de login op pto te zoeken.
CREATE OR REPLACE PROCEDURE ykpn_processemail (pfrom      IN VARCHAR2,
                                               pto        IN VARCHAR2,
                                               psubject   IN VARCHAR2,
                                               pbody      IN VARCHAR2,
                                               psessionid IN VARCHAR2,
                                               puserkey   IN NUMBER DEFAULT NULL)
AS
   v_errormsg           VARCHAR2 (1000);
   oracle_err_num       NUMBER;
   oracle_err_mes       VARCHAR2 (200);

   v_perslid_key        NUMBER (10);
   v_kostenplaats_key   NUMBER (10);
   v_stdmelding_key     NUMBER (10);
   v_stdmelding_uvt mld_stdmelding.mld_stdmelding_t_uitvoertijd%TYPE
         := MLD_T_UITVOERTIJD (NULL, NULL);       -- constructor initialisatie
   v_deel_key           NUMBER (10);
   v_locatie_key        NUMBER (10);
   v_locatie_code       VARCHAR2(100);
   v_melding_key        NUMBER (10);
   v_kenmerk_key        NUMBER (10);
   v_bedrijf_key        NUMBER (10);
   v_typeopdr_key       NUMBER (10);
   v_opdr_key           NUMBER (10);
   v_behandelaar_key    NUMBER (10);
   v_behandelaar2_key   NUMBER (10);
   v_regexp             VARCHAR2 (100);
   v_opdr_id            VARCHAR2 (100);
   v_mld_id             VARCHAR2 (100);
   v_notificatie_code   VARCHAR2 (10);

   -- Qyn koppeling
   v_naam         VARCHAR2(100);         -- Topdesk nummer
   v_externnummer VARCHAR2(100);         -- Facilitor nummer
   v_date_txt     VARCHAR2(100);         -- Datum in tekst formaat
   v_closed       VARCHAR2(100);         -- Indicatie true / false of de melding afgesloten is.
   v_oplossing    VARCHAR2(1000);        -- Oplostekst
   v_actie        VARCHAR2(1000);        -- Update afhandeling
   v_date         DATE;                  -- Datum in date formaat
   v_from_key     NUMBER(10);            -- Key van de afzender

   FUNCTION get_xml_tag (p_line IN VARCHAR2, p_tag IN VARCHAR2) RETURN VARCHAR2
   AS
      v_start NUMBER;
      v_einde NUMBER;
   BEGIN
      v_start := INSTR(p_line, '<' || p_tag || '>') + LENGTH('<' || p_tag || '>');
      v_einde := INSTR(p_line, '</' || p_tag || '>') - v_start;
      IF v_start = 0 OR v_einde < 1
      THEN
         RETURN NULL;
      ELSE
         RETURN substr(p_line, v_start, v_einde);
      END IF;
   END;

BEGIN
   CASE
      WHEN UPPER (pto) LIKE 'QYN@%'
      THEN
         DELETE fac_rapport
          WHERE fac_rapport_node = 'PROCESSEMAIL';

         INSERT INTO fac_rapport (fac_rapport_node,
                                  fac_rapport_volgnr,
                                  fac_rapport_regel)
              VALUES ('PROCESSEMAIL', 1, pbody);

         SELECT prs_perslid_key
           INTO v_from_key
           FROM prs_perslid
          WHERE UPPER(prs_perslid_email) = UPPER(pfrom);

         v_naam := get_xml_tag(pbody, 'naam');
         v_externnummer := get_xml_tag(pbody, 'externnummer');
         v_date_txt := get_xml_tag(pbody, 'date');
         v_date_txt := REPLACE(SUBSTR(v_date_txt, 1, INSTR(v_date_txt, '+')-1), 'T', ' ');
         v_closed := get_xml_tag(pbody, 'closed');
         v_oplossing := get_xml_tag(pbody, 'oplossing');
         v_actie := get_xml_tag(pbody, 'actie');
         v_date := FAC.safe_to_date(v_date_txt, 'yyyy-mm-dd hh24:mi:ss');

         INSERT INTO fac_rapport (fac_rapport_node, fac_rapport_volgnr, fac_rapport_regel) VALUES ('PROCESSEMAIL', 2, 'naam: '|| SUBSTR(v_naam, 1, 1900));
         INSERT INTO fac_rapport (fac_rapport_node, fac_rapport_volgnr, fac_rapport_regel) VALUES ('PROCESSEMAIL', 3, 'externnummer: '|| SUBSTR(v_externnummer, 1, 1900));
         INSERT INTO fac_rapport (fac_rapport_node, fac_rapport_volgnr, fac_rapport_regel) VALUES ('PROCESSEMAIL', 4, 'date_txt: '|| SUBSTR(v_date_txt, 1, 1900));
         INSERT INTO fac_rapport (fac_rapport_node, fac_rapport_volgnr, fac_rapport_regel) VALUES ('PROCESSEMAIL', 5, 'date: '|| SUBSTR(v_date, 1, 1900));
         INSERT INTO fac_rapport (fac_rapport_node, fac_rapport_volgnr, fac_rapport_regel) VALUES ('PROCESSEMAIL', 6, 'closed: '|| SUBSTR(v_closed, 1, 1900));
         INSERT INTO fac_rapport (fac_rapport_node, fac_rapport_volgnr, fac_rapport_regel) VALUES ('PROCESSEMAIL', 7, 'oplossing: ' || SUBSTR(v_oplossing, 1, 1900));
         INSERT INTO fac_rapport (fac_rapport_node, fac_rapport_volgnr, fac_rapport_regel) VALUES ('PROCESSEMAIL', 8, 'actie: '|| SUBSTR(v_actie, 1, 1900));

         v_errormsg := 'Opzoeken van de opdracht';
         SELECT mld_opdr_key, mld_melding_key
           INTO v_opdr_key, v_melding_key
           FROM mld_opdr o, prs_contactpersoon cp
          WHERE mld_melding_key || '/' || mld_opdr_bedrijfopdr_volgnr = REPLACE(v_externnummer, 'R')
            AND o.mld_uitvoerende_keys = cp.prs_bedrijf_key
            AND cp.prs_perslid_key = v_from_key;

          IF v_closed IS NULL OR v_closed = 'false'
          THEN
             INSERT INTO mld_opdr_note (mld_opdr_key, prs_perslid_key, mld_opdr_note_omschrijving)
               VALUES (v_opdr_key, v_from_key, v_actie);
          ELSE
             UPDATE mld_opdr SET mld_opdr_opmerking = v_oplossing || chr(13) || mld_opdr_opmerking
              WHERE mld_opdr_key = v_opdr_key;
             -- meld de opdracht af
             MLD.setopdrachtstatus (v_opdr_key, 6, v_from_key);
             MLD.updatemeldingstatus (v_melding_key, 0, v_from_key);
          END IF;
      WHEN UPPER (pto) LIKE 'NOREPLY@%'
      THEN
         IF UPPER (pfrom) = 'KLANTEN@OFFICEDEPOT.NL'
         THEN
            -- We scannen het onderwerp van de mail op het opdracht_id
            v_regexp := '[[:alpha:]]*[[:digit:]]{5,}/[[:digit:]]*';
            v_opdr_id := REGEXP_SUBSTR (psubject, v_regexp);
            -- Nu nog even de srtdisc prefix er af halen.
            v_regexp := '[[:digit:]]{5,}/[[:digit:]]*';
            v_opdr_id := REGEXP_SUBSTR (v_opdr_id, v_regexp);

            v_errormsg := 'Opzoeken van de opdracht: ' || v_opdr_id;
            SELECT mld_opdr_key
              INTO v_opdr_key
              FROM mld_opdr
             WHERE mld_melding_key || '/' || mld_opdr_bedrijfopdr_volgnr = v_opdr_id;

            -- API-user tbv. OfficeDepot-koppeling key=63741
            INSERT INTO mld_opdr_note (mld_opdr_key, prs_perslid_key, mld_opdr_note_omschrijving)
                 VALUES (v_opdr_key, 63741, pbody);

            FAC.trackaction('CUST10', v_opdr_key, 63741, NULL, NULL);

         ELSE
            DELETE fac_rapport
             WHERE fac_rapport_node = 'PROCESSEMAI2';

            INSERT INTO fac_rapport (fac_rapport_node,
                                     fac_rapport_volgnr,
                                     fac_rapport_regel)
                 VALUES ('PROCESSEMAI2', 1, SUBSTR(pbody, 1, 1900));

            BEGIN
               -- De afzender moet nu geregistreerd staan anders wordt de mail niet afgehandeld.
               v_errormsg := 'Opzoeken afzender/melder';
               SELECT prs_perslid_key
                 INTO v_from_key
                 FROM prs_perslid
                WHERE UPPER(prs_perslid_email) = UPPER(pfrom);

               v_naam := get_xml_tag(pbody, 'naam');
               v_externnummer := get_xml_tag(pbody, 'externnummer');
               v_date_txt := get_xml_tag(pbody, 'date');
               v_date_txt := REPLACE(SUBSTR(v_date_txt, 1, INSTR(v_date_txt, '+')-1), 'T', ' ');
               v_date := FAC.safe_to_date(v_date_txt, 'yyyy-mm-dd hh24:mi:ss');

               INSERT INTO fac_rapport (fac_rapport_node, fac_rapport_volgnr, fac_rapport_regel) VALUES ('PROCESSEMAI2', 2, 'naam: '|| SUBSTR(v_naam, 1, 1900));
               INSERT INTO fac_rapport (fac_rapport_node, fac_rapport_volgnr, fac_rapport_regel) VALUES ('PROCESSEMAI2', 3, 'externnummer: '|| SUBSTR(v_externnummer, 1, 1900));
               INSERT INTO fac_rapport (fac_rapport_node, fac_rapport_volgnr, fac_rapport_regel) VALUES ('PROCESSEMAI2', 4, 'date_txt: '|| SUBSTR(v_date_txt, 1, 1900));
               INSERT INTO fac_rapport (fac_rapport_node, fac_rapport_volgnr, fac_rapport_regel) VALUES ('PROCESSEMAI2', 5, 'date: '|| SUBSTR(v_date, 1, 1900));

               v_errormsg := 'Opzoeken van de opdracht';
               SELECT mld_opdr_key, mld_melding_key
                 INTO v_opdr_key, v_melding_key
                 FROM mld_opdr o, prs_contactpersoon cp
                WHERE mld_melding_key || '/' || mld_opdr_bedrijfopdr_volgnr = REPLACE(v_externnummer, 'R')
                  AND o.mld_uitvoerende_keys = cp.prs_bedrijf_key
                  AND cp.prs_perslid_key = v_from_key;

               -- vul de referentie bij van de leverancier in.
               YKPN.set_kenmerk('MLD', 3261,  v_opdr_key, v_naam, 0);
            EXCEPTION WHEN NO_DATA_FOUND
            THEN
               INSERT INTO fac_result (fac_result_sessionid,
                                       fac_result_naam,
                                       fac_result_waarde)
                               VALUES (psessionid,
                                       'maillog',
                                       'Ongeregistreerde afzender, mail wordt genegeerd: ' || pfrom);
            END;
         END IF;
      ELSE

         v_errormsg := 'Fout bij bepalen melder';
         -- Meldingen worden gekoppeld aan de persoon met het emailadres.
         SELECT p.prs_perslid_key, a.prs_kostenplaats_key
           INTO v_perslid_key, v_kostenplaats_key
           FROM prs_v_aanwezigperslid p, prs_afdeling a
          WHERE p.prs_perslid_oslogin = '_' || UPPER (SUBSTR(pto, 1, INSTR(pto, '@')-1))
                AND p.prs_afdeling_key = a.prs_afdeling_key;

         v_errormsg := 'Fout bij bepalen email-melding';
         SELECT sm.mld_stdmelding_key, sm.mld_stdmelding_t_uitvoertijd
           INTO v_stdmelding_key, v_stdmelding_uvt
           FROM mld_stdmelding sm, prs_kenmerklink kl
          WHERE     kl.prs_link_key = v_perslid_key
                AND kl.prs_kenmerk_key = 	1100   -- Stdmelding kenmerk tbv mail import
                AND FAC.safe_to_number(kl.prs_kenmerklink_waarde) = sm.mld_stdmelding_key
                AND sm.mld_stdmelding_verwijder IS NULL;

         -- Nu gaan we uit de bezetting van de persoon de locatie bepalen.
         BEGIN
            SELECT alg_locatie_key
              INTO v_locatie_key
              FROM prs_v_perslidwerkplek_gegevens
             WHERE prs_perslid_key = v_perslid_key;

         EXCEPTION WHEN NO_DATA_FOUND THEN
            v_locatie_key := 701;  -- Retail algemeen.
         END;

         -- Specifieke locatie string in bericht voor storelocator
         IF UPPER (pto) LIKE 'KPNRETAILMAILIMPORT@%'  -- Storelocator
         THEN
            BEGIN
               -- Nu gaan we uit de mail de locatie herleiden. Als dat niet lukt dan zetten we de locatie op onbekend.
               v_locatie_code := SUBSTR(pbody, INSTR(pbody, 'ShopNumber: ')+ 12, 3);

               SELECT l.alg_locatie_key
                 INTO v_locatie_key
                 FROM alg_locatie l
                WHERE l.alg_locatie_code = v_locatie_code
                  AND l.alg_locatie_verwijder IS NULL;

            EXCEPTION WHEN NO_DATA_FOUND THEN
               v_locatie_key := 501;  -- onbekend.

            END;
         END IF;

         -- Controleer of dit een reactie is op een eerdere mail.
         -- Vooralsnog alleen aanzetten voor vakgroep Financiën/Financedesk 406
         v_mld_id := REGEXP_SUBSTR (psubject, 'Melding [[:alpha:]][[:digit:]]{5,}', 1, 1);
         IF     v_mld_id IS NOT NULL
            AND (LOWER(SUBSTR(psubject, 1, 3)) = 're:' OR LOWER(SUBSTR(psubject, 1, 3)) = 'fw:')
         THEN
            BEGIN
               SELECT mld_melding_key, mld_melding_behandelaar_key, mld_melding_behandelaar2_key, m.mld_stdmelding_key
                 INTO v_melding_key, v_behandelaar_key, v_behandelaar2_key, v_stdmelding_key
                 FROM mld_melding m, mld_stdmelding std
                WHERE m.mld_stdmelding_key = std.mld_stdmelding_key
                  AND std.mld_ins_discipline_key = 406
                  AND mld_melding_key = REGEXP_SUBSTR (v_mld_id, '[[:digit:]]{5,}', 1, 1);
            EXCEPTION WHEN NO_DATA_FOUND
            THEN
              v_melding_key := NULL;
            END;
         END IF;

         IF v_melding_key IS NULL
         THEN
            v_errormsg := 'Fout bij toevoegen melding';

            INSERT INTO mld_melding (mld_melding_module,
                                     mld_meldbron_key,
                                     mld_alg_locatie_key,
                                     mld_alg_onroerendgoed_keys,
                                     mld_melding_datum,
                                     mld_melding_omschrijving,
                                     mld_melding_status,
                                     mld_melding_t_uitvoertijd,
                                     mld_stdmelding_key,
                                     prs_perslid_key,
                                     prs_perslid_key_voor,
                                     prs_kostenplaats_key,
                                     mld_melding_spoed)
                VALUES ('MLD',
                        4,                                               -- email
                        v_locatie_key,
                        NULL,
                        SYSDATE,
                        'Afzender: ' || pfrom || CHR (10) ||
                        psubject || CHR (10) || SUBSTR(pbody, 1, 3800),
                        NULL,
                        v_stdmelding_uvt,
                        v_stdmelding_key,
                        v_perslid_key,
                        v_perslid_key,
                        NULL,
                        3)                                        -- prio normaal
             RETURNING mld_melding_key
                  INTO v_melding_key;

            v_errormsg := 'Fout bij statuswijziging';
            mld.setmeldingstatus (v_melding_key, 2, v_perslid_key);



            -- We gaan nu kijken of we een opdracht kunnen koppelen aan de melding
            v_errormsg := 'Fout bij zoeken bedrijf in BDL';
            BEGIN
               SELECT MAX (bdl.prs_bedrijf_key) prs_bedrijf_key,
                      std.mld_typeopdr_key
                 INTO v_bedrijf_key, v_typeopdr_key
                 FROM mld_stdmelding std,
                      prs_bedrijfdienstlocatie bdl
                WHERE     std.mld_stdmelding_key = v_stdmelding_key
                      AND std.mld_stdmelding_autoorder = 1
                      AND std.prs_dienst_key = bdl.prs_dienst_key
                      AND std.mld_typeopdr_key IS NOT NULL
                      AND (     bdl.alg_locatie_key = v_locatie_key
                            OR (     bdl.alg_locatie_key IS NULL
                                 AND NOT EXISTS (SELECT bdl2.prs_bedrijfdienstlocatie_key
                                                   FROM prs_bedrijfdienstlocatie bdl2
                                                  WHERE bdl2.prs_dienst_key = bdl.prs_dienst_key
                                                    AND bdl2.alg_locatie_key = v_locatie_key)))
               GROUP BY mld_typeopdr_key;

               v_errormsg := 'Fout bij statuswijziging naar geaccepteerd';
               mld.setmeldingstatus (v_melding_key, 4, v_perslid_key);

               v_errormsg := 'Fout bij toevoegen opdracht';
               INSERT INTO mld_opdr (mld_melding_key
      		                         , prs_kostenplaats_key
      		                         , mld_typeopdr_key
      		                         , prs_perslid_key
      		                         , mld_uitvoerende_keys
      		                         , mld_opdr_datumbegin
      		                         , mld_opdr_einddatum
      		                         , mld_opdr_module
      		                         , mld_opdr_omschrijving
      		                         , mld_opdr_bedrijfopdr_volgnr
      		                         , mld_opdr_teverzenden)
       		   VALUES ( v_melding_key
      		          , NULL
                      , v_typeopdr_key
                      , v_perslid_key
                      , v_bedrijf_key
                      , SYSDATE
                      , SYSDATE + 7
                      , 'MLD'
                      , psubject || CHR (10) || SUBSTR(pbody, 1, 3900)
                      , MLD.BepaalOpdrMeldingVolgnr (v_melding_key)
                      , 1)
               RETURNING mld_opdr_key INTO v_opdr_key;

               v_errormsg := 'Fout bij aanpassen opdracht status';
               MLD.setopdrachtstatus(v_opdr_key , 5, v_perslid_key);  -- uitgegeven

               v_errormsg := 'Fout bij notificatieverzending';
               SELECT DECODE (u.type, 'P', 'ORDMLI', 'ORDMLE')
                 INTO v_notificatie_code
                 FROM mld_v_uitvoerende u
                WHERE u.mld_uitvoerende_key = v_bedrijf_key;

               FAC.trackaction(v_notificatie_code, v_opdr_key, v_perslid_key, NULL, NULL);

               -- update melding status
               v_errormsg := 'Fout bij bijwerken melding status';
               MLD.updatemeldingstatus (v_melding_key, 0, v_perslid_key);

            EXCEPTION WHEN NO_DATA_FOUND THEN
               NULL; -- er is geen bedrijf - dienst - locatie voor deze melding gedefinieerd. Dus wordt er ook geen opdracht aangemaakt.
            END;  -- toevoegen opdracht

            INSERT INTO fac_result (fac_result_sessionid,
                                    fac_result_naam,
                                    fac_result_waarde)
                            VALUES (psessionid,
                                    'maillog',
                                    'Geregistreerd onder melding ' || v_melding_key);
         ELSE
            -- we gaan nu een notitie toevoegen aan de melding
            INSERT INTO mld_melding_note (mld_melding_key,
                                          mld_melding_note_omschrijving,
                                          prs_perslid_key,
                                          mld_melding_note_flag)
                VALUES (v_melding_key,
                        SUBSTR (
                           psubject || CHR (13)
                           || REPLACE (
                                 SUBSTR (pbody,
                                         1,
                                         4000 - (LENGTH (psubject) + 2)),
                                 CHR (13) || CHR (10) || CHR (13) || CHR (10),
                                 CHR (10)),
                           1,
                           4000),              -- verwijder onnodige witregels
                        v_perslid_key,
                        0);          -- 0 is niet zichtbaar FE.

            -- Default tracking is even goed genoeg
            fac.trackaction ('MLDNOT',
                             v_melding_key,
                             v_perslid_key,
                             NULL,
                             '#Notitie toegevoegd vanuit e-mail'); -- # voorkomt notificatie
            --            DBMS_OUTPUT.PUT_LINE('Notitie toegevoegd.');

            -- Eerst naar de active behandelaar
            IF v_behandelaar2_key IS NOT NULL
            THEN
               fac.putnotificationsrtprio (NULL, v_behandelaar2_key, 'MLDNOB', v_melding_key,
                                           'Melding ' || v_melding_key || ' is door de klant aangepast.',
                                           2, NULL, NULL, NULL, 2, NULL);
            ELSIF v_behandelaar_key IS NOT NULL
            THEN
               fac.putnotificationsrtprio (NULL, v_behandelaar_key, 'MLDNOB', v_melding_key,
                                           'Melding ' || v_melding_key || ' is door de klant aangepast.',
                                           2, NULL, NULL, NULL, 2, NULL);
            END IF;
            -- Vlaggetjes zetten zoals mld_edit_note.asp dat doet
               UPDATE mld_melding
                  SET mld_melding_actiecode = 1+128 -- Backoffice + Attentie
                WHERE mld_melding_key = v_melding_key;

            INSERT INTO fac_result (fac_result_sessionid,
                                    fac_result_naam,
                                    fac_result_waarde)
                            VALUES (psessionid,
                                    'maillog',
                                    'Reactie toegevoegd aan melding ' || v_melding_key);
         END IF;

         -- Zoek het laagste bijlagen kenmerk om de bijlagen onder te stoppen
         v_errormsg := 'Fout bij zoeken naar kenmerkbijlage';
         SELECT MIN (mld_kenmerk_key)
           INTO v_kenmerk_key
           FROM mld_kenmerk k,
                mld_srtkenmerk sk,
                mld_stdmelding std,
                ins_tab_discipline d
          WHERE mld_srtkenmerk_kenmerktype = 'M'
            AND sk.mld_srtkenmerk_key = k.mld_srtkenmerk_key
            AND std.mld_stdmelding_key = v_stdmelding_key
            AND std.mld_ins_discipline_key = d.ins_discipline_key
            AND ( (k.mld_stdmelding_key = std.mld_stdmelding_key
               AND k.mld_kenmerk_niveau = 'S')
              OR (k.mld_stdmelding_key = d.ins_discipline_key
              AND k.mld_kenmerk_niveau = 'D')
              OR (k.mld_stdmelding_key = d.ins_srtdiscipline_key
              AND k.mld_kenmerk_niveau = 'T'))
            AND k.mld_kenmerk_verwijder IS NULL
            AND NOT EXISTS
                   (SELECT mld_kenmerk_volgnummer
                      FROM mld_kenmerk k1,
                           mld_srtkenmerk sk1,
                           mld_stdmelding std1,
                           ins_tab_discipline d1
                     WHERE sk1.mld_srtkenmerk_kenmerktype = 'M'
                       AND sk1.mld_srtkenmerk_key = k1.mld_srtkenmerk_key
                       AND std1.mld_stdmelding_key = v_stdmelding_key
                       AND std1.mld_ins_discipline_key =
                              d1.ins_discipline_key
                       AND ( (k1.mld_stdmelding_key =
                                 std1.mld_stdmelding_key
                          AND k1.mld_kenmerk_niveau = 'S')
                         OR (k1.mld_stdmelding_key = d1.ins_discipline_key
                         AND k1.mld_kenmerk_niveau = 'D')
                         OR (k1.mld_stdmelding_key =
                                d1.ins_srtdiscipline_key
                         AND k1.mld_kenmerk_niveau = 'T'))
                       AND k1.mld_kenmerk_verwijder IS NULL
                       AND k1.mld_kenmerk_volgnummer >
                              k.mld_kenmerk_volgnummer);

         IF v_kenmerk_key IS NOT NULL
         THEN
            INSERT INTO fac_result (fac_result_sessionid,
                                    fac_result_naam,
                                    fac_result_waarde)
                            VALUES (psessionid,
                                    'kenmerkpath',
                                    'MLD\M' || TO_CHAR (TRUNC (v_melding_key / 1000), 'FM0000') || '___\M' || v_melding_key || '\' || v_kenmerk_key || '\');
         END IF;
   END CASE;
EXCEPTION
   WHEN OTHERS
   THEN
      oracle_err_num := SQLCODE;
      oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
      v_errormsg :=
            v_errormsg
         || ' ORACLE (error '
         || oracle_err_num
         || '/'
         || oracle_err_mes
         || ')';
      fac.writelog ('PROCESSEMAIL',
                    'E',
                    'ykpn_processemail afgebroken!',
                    '[' || pfrom || '] ' || v_errormsg);

      INSERT INTO fac_result (fac_result_sessionid,
                              fac_result_naam,
                              fac_result_waarde)
          VALUES (psessionid,
                  'errormsg',
                  'Database fout - Neem contact op met uw systeembeheerder ');

      COMMIT;
END;
/

-- KPN Retail winkels
-- Notificatie wordt gestuurd als de melding aangepast wordt of als er een notitie toegevoegd is. We kunnen niet achterhalen
-- wanneer de atie bij de gebruiker is gezet. Dus in die gevallen komt de notificatie misschien 2 keer.
CREATE OR REPLACE VIEW ykpn_v_noti_retail_mldupd
(
    CODE,
    SENDER,
    RECEIVER,
    TEXT,
    KEY,
    XKEY
)
AS
SELECT DISTINCT
       'MLDUPD',
       NULL,
       m.prs_perslid_key,
          'Uw melding '
       || sd.ins_srtdiscipline_prefix
       || m.mld_melding_key
       || ' ('
       || d.ins_discipline_omschrijving
       || '/'
       || std.mld_stdmelding_omschrijving
       || ') is gewijzigd',
       m.mld_melding_key,
       NULL
  FROM mld_melding         m,
       mld_stdmelding      std,
       ins_tab_discipline  d,
       ins_srtdiscipline   sd
 WHERE     m.mld_stdmelding_key = std.mld_stdmelding_key
       AND std.mld_ins_discipline_key = d.ins_discipline_key
       AND d.ins_srtdiscipline_key = sd.ins_srtdiscipline_key
       AND sd.ins_srtdiscipline_key = 41                             -- Retail
       AND (   EXISTS
                   (SELECT t.fac_tracking_refkey
                      FROM fac_tracking t
                     WHERE     t.fac_tracking_refkey = m.mld_melding_key
                           AND t.fac_srtnotificatie_key = 46         -- MLDUPD
                           AND t.fac_tracking_datum BETWEEN (SELECT   fac_notificatie_job_nextrun
                                                                    -   fac_notificatie_job_interval
                                                                      / 24
                                                               FROM fac_notificatie_job
                                                              WHERE fac_notificatie_job_view =
                                                                    'YKPN_V_NOTI_RETAIL_MLDUPD')
                                                        AND (SELECT fac_notificatie_job_nextrun
                                                               FROM fac_notificatie_job
                                                              WHERE fac_notificatie_job_view =
                                                                    'YKPN_V_NOTI_RETAIL_MLDUPD'))
            OR (EXISTS
                    (SELECT mld_melding_note_key
                       FROM mld_melding_note mn
                      WHERE     mld_melding_note_flag = 1
                            AND mn.mld_melding_key = m.mld_melding_key
                            AND m.prs_perslid_key <> mn.prs_perslid_key
                            --
                            AND mld_melding_note_aanmaak BETWEEN (SELECT   fac_notificatie_job_nextrun
                                                                         -   fac_notificatie_job_interval
                                                                           / 24
                                                                    FROM fac_notificatie_job
                                                                   WHERE fac_notificatie_job_view =
                                                                         'YKPN_V_NOTI_RETAIL_MLDUPD')
                                                             AND (SELECT fac_notificatie_job_nextrun
                                                                    FROM fac_notificatie_job
                                                                   WHERE fac_notificatie_job_view =
                                                                         'YKPN_V_NOTI_RETAIL_MLDUPD'))));

-- view om de uitnutting voor de winkel bij nieuwe bestelling te tonen.
CREATE OR REPLACE VIEW ykpn_bes_budget_retail
(
    prs_perslid_key,
    bedrag
)
AS
      SELECT p.prs_perslid_key,
             SUM (bes_bestelling_item_aantal * bes_bestelling_item_brutoprijs)
                 bedrag
        FROM bes_bestelling                b,
             bes_bestelling_item           bi,
             mld_adres                     a,
             alg_locatie                   l,
             prs_perslid                   p,
             prs_v_perslidwerkplek_gegevens pwg
       WHERE     b.bes_bestelling_key = bi.bes_bestelling_key
             AND b.mld_adres_key_lev = a.mld_adres_key
             AND a.alg_locatie_key = l.alg_locatie_key
             AND prs_perslid_nr LIKE 'MX%'
             AND p.prs_perslid_key = pwg.prs_perslid_key
             AND pwg.alg_locatie_key = l.alg_locatie_key
             AND TRUNC (bes_bestelling_datum, 'Q') = TRUNC (SYSDATE, 'Q')
    GROUP BY p.prs_perslid_key;

-- eigen voorraad administratie omdat de standaard versie niet werkt doordat de SSO van kpn ingrijpt.
CREATE OR REPLACE VIEW ykpn_v_rap_voorraad
(
    hide_f_extern_diskey,
    hide_f_srtgroep_omschrijving,
    fclt_f_catalogus,
    artikel_nr,
    artikel_omschrijving,
    artikel_prijs,
    magazijn,
    min_voorraad,
    max_voorraad,
    inkoop_geleverd,
    intern_besteld,
    voorraad,
    inkoop_besteld,
    inkoop_leverdatum,
    inkoop_gewenst
)
AS
    SELECT extern.dkey,
           COALESCE (intern.bes_srtgroep_omschrijving,
                     extern.bes_srtgroep_omschrijving),
           COALESCE (intern.ins_discipline_omschrijving,
                     extern.ins_discipline_omschrijving),
           extern.bes_srtdeel_nr,
           COALESCE (intern.bes_srtdeel_omschrijving,
                     extern.bes_srtdeel_omschrijving),
           COALESCE (intern.srtdeel_prijs, extern.srtdeel_prijs),
           intern.magazijn,
           extern.vmin,
           extern.vmax,
           extern.geleverd,
           intern.besteld,
           extern.geleverd - COALESCE (intern.besteld, 0)
               voorraad,
           extern.besteld,
           TO_CHAR (extern.leverdatum, 'dd-mm-yyyy'),
           CASE
               WHEN (  (  COALESCE (extern.besteld, 0)
                        + COALESCE (extern.geleverd, 0))
                     - COALESCE (intern.besteld, 0)) <
                    extern.vmin
               THEN
                     extern.vmax
                   - (  (  COALESCE (extern.besteld, 0)
                         + COALESCE (extern.geleverd, 0))
                      - COALESCE (intern.besteld, 0))
               ELSE
                   NULL
           END
               extern_gewenst
      FROM (SELECT bd.ins_discipline_key
                       dkey,                                     -- INKOOP-key
                   g.bes_srtgroep_omschrijving,
                   sd.bes_srtdeel_nr,                        -- ext. artikelnr
                   sd.bes_srtdeel_omschrijving,
                   bes.getsrtdeelprijs (sd.bes_srtdeel_key, NULL)
                       srtdeel_prijs,
                   bd.ins_discipline_omschrijving,       -- ext. catalogusnaam
                   sd.bes_srtdeel_voorraadmin
                       vmin,                               -- ext. voorraadmin
                   sd.bes_srtdeel_voorraadmax
                       vmax,                               -- ext. voorraadmax
                   (SELECT SUM (
                                 COALESCE (boi.bes_bestelopdr_item_aantal,
                                           bi.bes_bestelling_item_aantal)
                               - COALESCE (
                                     boi.bes_bestelopdr_item_aantalontv,
                                     0))
                      FROM bes_bestelling       b,
                           bes_bestelling_item  bi,
                           bes_bestelopdr_item  boi
                     WHERE     boi.bes_bestelopdr_item_key(+) =
                               bi.bes_bestelopdr_item_key
                           AND bi.bes_bestelling_item_status IN (2,
                                                                 3,
                                                                 4,
                                                                 5)
                           AND b.bes_bestelling_key = bi.bes_bestelling_key
                           AND bi.bes_srtdeel_key = sd.bes_srtdeel_key)
                       besteld,
                   (SELECT MIN (b.bes_bestelling_leverdatum)
                      FROM bes_bestelling       b,
                           bes_bestelling_item  bi,
                           bes_bestelopdr_item  boi
                     WHERE     boi.bes_bestelopdr_item_key(+) =
                               bi.bes_bestelopdr_item_key
                           AND bi.bes_bestelling_item_status IN (2,
                                                                 3,
                                                                 4,
                                                                 5)
                           AND COALESCE (bes_bestelopdr_item_aantal,
                                         bi.bes_bestelling_item_aantal) <>
                               COALESCE (bes_bestelopdr_item_aantalontv, 0)
                           AND b.bes_bestelling_key = bi.bes_bestelling_key
                           AND bi.bes_srtdeel_key = sd.bes_srtdeel_key)
                       leverdatum,
                   (SELECT SUM (boi.bes_bestelopdr_item_aantalontv)
                      FROM bes_bestelling       b,
                           bes_bestelling_item  bi,
                           bes_bestelopdr_item  boi
                     WHERE    --   boi.bes_bestelopdr_item_status in (6,7) AND
                               b.bes_bestelling_key = bi.bes_bestelling_key
                           AND boi.bes_bestelopdr_item_key =
                               bi.bes_bestelopdr_item_key
                           AND bi.bes_srtdeel_key = sd.bes_srtdeel_key)
                       geleverd
              FROM bes_srtdeel      sd,
                   bes_srtgroep     g,
                   bes_discipline   bd,
                   bes_disc_params  dp
             WHERE     sd.bes_srtdeel_verwijder IS NULL
                   AND sd.bes_srtgroep_key = g.bes_srtgroep_key
                   AND g.ins_discipline_key = bd.ins_discipline_key
                   AND bd.ins_discipline_key = dp.bes_ins_discipline_key
                   AND dp.bes_ins_discipline_key_inkoop IS NULL
                   AND bd.ins_discipline_key IN
                           (SELECT bes_ins_discipline_key_inkoop
                              FROM bes_disc_params
                             WHERE bes_ins_discipline_key_inkoop IS NOT NULL))
           extern                   -- Inkoop artikelen uit externe catalogus!
           FULL JOIN
           (SELECT dp.bes_ins_discipline_key_inkoop
                       dkey,                                     -- INKOOP-key
                   g.bes_srtgroep_omschrijving,
                   sd.bes_srtdeel_nr,                        -- int. artikelnr
                   sd.bes_srtdeel_omschrijving,
                   sd.bes_srtdeel_notitie
                       magazijn,
                   bes.getsrtdeelprijs (sd.bes_srtdeel_key, NULL)
                       srtdeel_prijs,
                   bd.ins_discipline_omschrijving,       -- int. catalogusnaam
                   (SELECT SUM (
                               COALESCE (boi.bes_bestelopdr_item_aantal,
                                         bi.bes_bestelling_item_aantal))
                      FROM bes_bestelling       b,
                           bes_bestelling_item  bi,
                           bes_bestelopdr_item  boi
                     WHERE     boi.bes_bestelopdr_item_key(+) =
                               bi.bes_bestelopdr_item_key
                           AND b.bes_bestelling_key = bi.bes_bestelling_key
                           AND bi.bes_srtdeel_key = sd.bes_srtdeel_key)
                       besteld
              FROM bes_srtdeel      sd,
                   bes_srtgroep     g,
                   bes_discipline   bd,
                   bes_disc_params  dp
             WHERE     sd.bes_srtdeel_verwijder IS NULL
                   AND sd.bes_srtgroep_key = g.bes_srtgroep_key
                   AND g.ins_discipline_key = bd.ins_discipline_key
                   AND bd.ins_discipline_key = dp.bes_ins_discipline_key
                   AND dp.bes_ins_discipline_key_inkoop IS NOT NULL) intern -- Verkoop artikelen uit interne catalogus!
               ON     extern.dkey = intern.dkey
                  AND extern.bes_srtdeel_nr = intern.bes_srtdeel_nr;


CREATE OR REPLACE VIEW ykpn_v_udr_opdracht_kenm
(
   opdracht_key,
   opdracht_nummer,
   opdracht_regio,
   opdracht_district,
   opdracht_locatie_code,
   opdracht_locatie,
   opdracht_locatieplaats,
   fclt_3d_locatie_key,
   opdracht_gebouwcode,
   opdracht_gebouw,
   opdracht_verdieping,
   opdracht_ruimtenr,
   opdracht_ruimte,
   opdracht_kostenplaats,
   opdracht_kostenplaats_oms,
   melding_key,
   opdracht_type,
   opdracht_volgnummer,
   opdracht_status,
   opdracht_duur_gepland,
   opdracht_datum,
   opdracht_einddatum,
   opdracht_plandatum,
   opdracht_acceptdatum,
   opdracht_afgemeld,
   opdracht_doorlooptijd,
   opdracht_accepttijd,
   opdracht_omschrijving,
   opdracht_opmerking,
   opdracht_uitvoerende,
   opdracht_uitvoerende_contact,
   opdracht_behandelaar,
   opdracht_contract,
   opdracht_contract_versie,
   opdracht_contactpersoon,
   opdracht_uren,
   opdracht_correctie,
   opdracht_materiaal,
   opdracht_uurtarief,
   opdracht_kosten,
   melding_status,
   melding_afgemeld,
   ongeldige_procuratie,
   po_nummer,
   bedrag_gef_andere_afd,
   afw_po_bedr_doorbel,
   afgespr_toeslagperc,
   tevr_doorloop,
   tevr_oplossing,
   datum_contact,
   dienst_geleverd,
   opmerking,
   doorbel_afw_po_bedr,
   po_bedr_doorbel,
   progn_maand_gereed,
   kosten_per,
   kosten
)
AS
  SELECT mld_opdr_key,
             ins_srtdiscipline_prefix
          || TO_CHAR (mld_melding_key)
          || '/'
          || opdracht_volgnummer,
          alg_regio_omschrijving,
          alg_district_omschrijving,
          locatie,
          locatie_omschrijving,
          locatie_plaats,
          alg_locatie_key,
          gebouw,
          gebouw_naam,
          verdieping,
          ruimte,
          ruimte_omschrijving,
          kostenplaats,
          kostenplaats_oms,
          mld_melding_key,
          opdracht_type,
          opdracht_volgnummer,
          opdracht_status,
          opdracht_duur_gepland,
          opdracht_datum,
          opdracht_einddatum,
          opdracht_plandatum,
          opdracht_acceptdatum,
          opdracht_afgemeld,
          opdracht_doorlooptijd,
          opdracht_accepttijd,
          opdracht_omschrijving,
          opdracht_opmerking,
          opdracht_uitvoerende,
          opdracht_uitvoerende_contact,
          opdracht_behandelaar,
          opdracht_contract,
          opdracht_contract_versie,
          opdracht_contactpersoon,
          opdracht_uren,
          opdracht_correctie,
          opdracht_materiaal,
          opdracht_uurtarief,
          opdracht_kosten,
          melding_status,
          melding_afgemeld,
          ongeldige_procuratie,
          po_nummer,
          bedrag_gef_andere_afd,
          afw_po_bedr_doorbel,
          afgespr_toeslagperc,
          tevr_doorloop,
          tevr_oplossing,
          datum_contact,
          dienst_geleverd,
          opmerking,
          doorbel_afw_po_bedr,
          po_bedr_doorbel,
          progn_maand_gereed,
          kosten_per,
          kosten
     FROM (SELECT alg_regio_omschrijving,
                  alg_district_omschrijving,
                  alg_locatie_code locatie,
                  alg_locatie_omschrijving locatie_omschrijving,
                  alg_locatie_plaats locatie_plaats,
                  l.alg_locatie_key,
                  og.alg_gebouw_code gebouw,
                  og.alg_gebouw_naam gebouw_naam,
                  og.alg_verdieping_code verdieping,
                  og.alg_ruimte_nr ruimte,
                  og.alg_ruimte_omschrijving ruimte_omschrijving,
                  (SELECT k.prs_kostenplaats_nr
                     FROM prs_kostenplaats k
                    WHERE k.prs_kostenplaats_key = o.prs_kostenplaats_key)
                     kostenplaats,
                  (SELECT k.prs_kostenplaats_omschrijving
                     FROM prs_kostenplaats k
                    WHERE k.prs_kostenplaats_key = o.prs_kostenplaats_key)
                     kostenplaats_oms,
                  o.mld_opdr_key,
                  o.mld_melding_key,
                  top.mld_typeopdr_key,
                  top.mld_typeopdr_omschrijving opdracht_type,
                  o.mld_opdr_bedrijfopdr_volgnr opdracht_volgnummer,
                  (SELECT mld_statusopdr_omschrijving
                     FROM mld_statusopdr sta
                    WHERE sta.mld_statusopdr_key = o.mld_statusopdr_key)
                     opdracht_status,
                  fac.count_work_days (o.mld_opdr_datumbegin,
                                       o.mld_opdr_einddatum)
                     opdracht_duur_gepland,
                  o.mld_opdr_datumbegin opdracht_datum,
                  o.mld_opdr_einddatum opdracht_einddatum,
                  o.mld_opdr_plandatum opdracht_plandatum,
                  COALESCE (mld.getopdrachtstatusdate (o.mld_opdr_key, 8),
                            mld.getopdrachtstatusdate (o.mld_opdr_key, 1))
                     opdracht_acceptdatum,
                  mld.getopdrachtstatusdate (o.mld_opdr_key, 6)
                     opdracht_afgemeld,
                  fac.count_work_days (
                     o.mld_opdr_datumbegin,
                     mld.getopdrachtstatusdate (o.mld_opdr_key, 6))
                     opdracht_doorlooptijd,
                  COALESCE (
                     fac.count_work_days (
                        mld.getopdrachtstatusdate (o.mld_opdr_key, 5),
                        COALESCE (
                           mld.getopdrachtstatusdate (o.mld_opdr_key, 8),
                           mld.getopdrachtstatusdate (o.mld_opdr_key, 6))),
                     fac.count_work_days (
                        mld.getopdrachtstatusdate (o.mld_opdr_key, 5),
                        mld.getopdrachtstatusdate (o.mld_opdr_key, 1)))
                     opdracht_accepttijd,
                  o.mld_opdr_omschrijving opdracht_omschrijving,
                  o.mld_opdr_opmerking opdracht_opmerking,
                  (SELECT naam
                     FROM mld_v_uitvoerende u
                    WHERE u.mld_uitvoerende_key = o.mld_uitvoerende_keys)
                     opdracht_uitvoerende,
                  (SELECT contact_naam
                     FROM (SELECT cp.prs_contactpersoon_key,
                                  pf.prs_perslid_naam_full contact_naam
                             FROM prs_contactpersoon cp,
                                  prs_v_perslid_fullnames_all pf
                            WHERE cp.prs_perslid_key = pf.prs_perslid_key
                           UNION ALL
                           SELECT cp.prs_contactpersoon_key,
                                  cp.prs_contactpersoon_naam
                             FROM prs_contactpersoon cp,
                                  prs_v_perslid_fullnames_all pf
                            WHERE cp.prs_perslid_key = pf.prs_perslid_key
                                  AND cp.prs_perslid_key IS NULL) cpn
                    WHERE cpn.prs_contactpersoon_key =
                             o.prs_contactpersoon_key)
                     opdracht_uitvoerende_contact,
                  (SELECT prs_perslid_naam_full
                     FROM prs_v_perslid_fullnames_all pf
                    WHERE pf.prs_perslid_key = o.prs_perslid_key)
                     opdracht_behandelaar,
                  c.cnt_contract_nummer_intern opdracht_contract,
                  c.cnt_contract_versie opdracht_contract_versie,
                  o.mld_opdr_contactpersoon opdracht_contactpersoon,
                  o.mld_opdr_uren opdracht_uren,
                    o.mld_opdr_kosten
                  - o.mld_opdr_materiaal
                  - (o.mld_opdr_uren * o.mld_opdr_uurloon)
                     opdracht_correctie,
                  o.mld_opdr_materiaal opdracht_materiaal,
                  o.mld_opdr_uurloon opdracht_uurtarief,
                  o.mld_opdr_kosten opdracht_kosten,
                  sdi.ins_srtdiscipline_prefix,
                  (SELECT mld_statuses_omschrijving
                     FROM mld_statuses sta
                    WHERE sta.mld_statuses_key = m.mld_melding_status)
                     melding_status,
                  COALESCE (mld.getmeldingstatusdate (m.mld_melding_key, 5),
                            mld.getmeldingstatusdate (m.mld_melding_key, 1))
                     melding_afgemeld,
                  (SELECT DECODE (mld_kenmerkopdr_waarde, 1, 'Ja', 'Nee')
                     FROM mld_kenmerkopdr ko, mld_kenmerk k
                    WHERE     ko.mld_kenmerk_key = k.mld_kenmerk_key
                          AND mld_kenmerkopdr_verwijder IS NULL
                          AND k.mld_srtkenmerk_key = 181
                          AND ko.mld_opdr_key = o.mld_opdr_key)
                     ongeldige_procuratie,
                  (SELECT mld_kenmerkopdr_waarde
                     FROM mld_kenmerkopdr ko, mld_kenmerk k
                    WHERE     ko.mld_kenmerk_key = k.mld_kenmerk_key
                          AND mld_kenmerkopdr_verwijder IS NULL
                          AND k.mld_srtkenmerk_key = 381
                          AND ko.mld_opdr_key = o.mld_opdr_key)
                     po_nummer,
                  (SELECT DECODE (mld_kenmerkopdr_waarde, 1, 'Ja', 'Nee')
                     FROM mld_kenmerkopdr ko, mld_kenmerk k
                    WHERE     ko.mld_kenmerk_key = k.mld_kenmerk_key
                          AND mld_kenmerkopdr_verwijder IS NULL
                          AND k.mld_srtkenmerk_key = 401
                          AND ko.mld_opdr_key = o.mld_opdr_key)
                     bedrag_gef_door_andere_afd,
                  (SELECT DECODE (mld_kenmerkopdr_waarde, 1, 'Ja', 'Nee')
                     FROM mld_kenmerkopdr ko, mld_kenmerk k
                    WHERE     ko.mld_kenmerk_key = k.mld_kenmerk_key
                          AND mld_kenmerkopdr_verwijder IS NULL
                          AND k.mld_srtkenmerk_key = 401
                          AND ko.mld_opdr_key = o.mld_opdr_key)
                     bedrag_gef_andere_afd,
                  (SELECT DECODE (mld_kenmerkopdr_waarde, 1, 'Ja', 'Nee')
                     FROM mld_kenmerkopdr ko, mld_kenmerk k
                    WHERE     ko.mld_kenmerk_key = k.mld_kenmerk_key
                          AND mld_kenmerkopdr_verwijder IS NULL
                          AND k.mld_srtkenmerk_key = 2762
                          AND ko.mld_opdr_key = o.mld_opdr_key)
                     afw_po_bedr_doorbel,
                  (SELECT fac.safe_to_number (mld_kenmerkopdr_waarde)
                     FROM mld_kenmerkopdr ko, mld_kenmerk k
                    WHERE     ko.mld_kenmerk_key = k.mld_kenmerk_key
                          AND mld_kenmerkopdr_verwijder IS NULL
                          AND k.mld_srtkenmerk_key = 542
                          AND ko.mld_opdr_key = o.mld_opdr_key)
                     afgespr_toeslagperc,
                  (SELECT fac_usrdata_omschr
                     FROM mld_kenmerkopdr ko, mld_kenmerk k, fac_usrdata ud
                    WHERE     ko.mld_kenmerk_key = k.mld_kenmerk_key
                          AND mld_kenmerkopdr_verwijder IS NULL
                          AND fac_usrtab_key = 781
                          AND TO_CHAR (ud.fac_usrdata_key) =
                                mld_kenmerkopdr_waarde
                          AND k.mld_srtkenmerk_key = 1563
                          AND ko.mld_opdr_key = o.mld_opdr_key)
                     tevr_doorloop,
                  (SELECT fac_usrdata_omschr
                     FROM mld_kenmerkopdr ko, mld_kenmerk k, fac_usrdata ud
                    WHERE     ko.mld_kenmerk_key = k.mld_kenmerk_key
                          AND mld_kenmerkopdr_verwijder IS NULL
                          AND fac_usrtab_key = 781
                          AND TO_CHAR (ud.fac_usrdata_key) =
                                mld_kenmerkopdr_waarde
                          AND k.mld_srtkenmerk_key = 1581
                          AND ko.mld_opdr_key = o.mld_opdr_key)
                     tevr_oplossing,
                  (SELECT fac.safe_to_date (mld_kenmerkopdr_waarde,
                                            'dd-mm-yyyy')
                     FROM mld_kenmerkopdr ko, mld_kenmerk k
                    WHERE     ko.mld_kenmerk_key = k.mld_kenmerk_key
                          AND mld_kenmerkopdr_verwijder IS NULL
                          AND k.mld_srtkenmerk_key = 1562
                          AND ko.mld_opdr_key = o.mld_opdr_key)
                     datum_contact,
                  (SELECT fac_usrdata_omschr
                     FROM mld_kenmerkopdr ko, mld_kenmerk k, fac_usrdata ud
                    WHERE     ko.mld_kenmerk_key = k.mld_kenmerk_key
                          AND mld_kenmerkopdr_verwijder IS NULL
                          AND fac_usrtab_key = 201
                          AND TO_CHAR (ud.fac_usrdata_key) =
                                mld_kenmerkopdr_waarde
                          AND k.mld_srtkenmerk_key = 1601
                          AND ko.mld_opdr_key = o.mld_opdr_key)
                     dienst_geleverd,
                  (SELECT mld_kenmerkopdr_waarde
                     FROM mld_kenmerkopdr ko, mld_kenmerk k
                    WHERE     ko.mld_kenmerk_key = k.mld_kenmerk_key
                          AND mld_kenmerkopdr_verwijder IS NULL
                          AND k.mld_srtkenmerk_key = 2561
                          AND ko.mld_opdr_key = o.mld_opdr_key)
                     opmerking,
                  (SELECT fac.safe_to_number (mld_kenmerkopdr_waarde)
                     FROM mld_kenmerkopdr ko, mld_kenmerk k
                    WHERE     ko.mld_kenmerk_key = k.mld_kenmerk_key
                          AND mld_kenmerkopdr_verwijder IS NULL
                          AND k.mld_srtkenmerk_key = 2781
                          AND ko.mld_opdr_key = o.mld_opdr_key)
                     doorbel_afw_po_bedr,
                  (SELECT DECODE (mld_kenmerkopdr_waarde, 1, 'Ja', 'Nee')
                     FROM mld_kenmerkopdr ko, mld_kenmerk k
                    WHERE     ko.mld_kenmerk_key = k.mld_kenmerk_key
                          AND mld_kenmerkopdr_verwijder IS NULL
                          AND k.mld_srtkenmerk_key = 2761
                          AND ko.mld_opdr_key = o.mld_opdr_key)
                     po_bedr_doorbel,
                  (SELECT fac_usrdata_omschr
                     FROM mld_kenmerkopdr ko, mld_kenmerk k, fac_usrdata ud
                    WHERE     ko.mld_kenmerk_key = k.mld_kenmerk_key
                          AND mld_kenmerkopdr_verwijder IS NULL
                          AND fac_usrtab_key = 1181
                          AND TO_CHAR (ud.fac_usrdata_key) =
                                mld_kenmerkopdr_waarde
                          AND k.mld_srtkenmerk_key = 2861
                          AND ko.mld_opdr_key = o.mld_opdr_key)
                     progn_maand_gereed,
                  (SELECT fac_usrdata_omschr
                     FROM mld_kenmerkopdr ko, mld_kenmerk k, fac_usrdata ud
                    WHERE     ko.mld_kenmerk_key = k.mld_kenmerk_key
                          AND mld_kenmerkopdr_verwijder IS NULL
                          AND fac_usrtab_key = 1161
                          AND TO_CHAR (ud.fac_usrdata_key) =
                                mld_kenmerkopdr_waarde
                          AND k.mld_srtkenmerk_key = 2821
                          AND ko.mld_opdr_key = o.mld_opdr_key)
                     kosten_per,
                  (SELECT fac.safe_to_number (mld_kenmerkopdr_waarde)
                     FROM mld_kenmerkopdr ko, mld_kenmerk k
                    WHERE     ko.mld_kenmerk_key = k.mld_kenmerk_key
                          AND mld_kenmerkopdr_verwijder IS NULL
                          AND k.mld_srtkenmerk_key = 2841
                          AND ko.mld_opdr_key = o.mld_opdr_key)
                     kosten
             FROM alg_locatie l,
                  alg_district d,
                  alg_regio r,
                  alg_v_allonrgoed_gegevens og,
                  mld_opdr o,
                  mld_typeopdr top,
                  mld_melding m,
                  mld_stdmelding stdm,
                  ins_tab_discipline di,
                  ins_srtdiscipline sdi,
                  cnt_contract c
            WHERE     m.mld_alg_locatie_key = l.alg_locatie_key(+)
                  AND l.alg_district_key = d.alg_district_key(+)
                  AND d.alg_regio_key = r.alg_regio_key(+)
                  AND m.mld_alg_onroerendgoed_keys =
                        og.alg_onroerendgoed_keys(+)
                  AND o.cnt_contract_key = c.cnt_contract_key(+)
                  AND m.mld_stdmelding_key = stdm.mld_stdmelding_key
                  AND stdm.mld_ins_discipline_key = di.ins_discipline_key
                  AND di.ins_srtdiscipline_key = sdi.ins_srtdiscipline_key
                  AND o.mld_melding_key = m.mld_melding_key
                  AND o.mld_typeopdr_key = top.mld_typeopdr_key(+)
                  AND o.mld_opdr_datumbegin >=
                        TO_DATE ('01-01-2014', 'DD-MM-YYYY')) x;

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

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

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