-- Script containing customer specific configuration sql statements for GDFS: Gaz de France Suez
-- (c) 2011 SG facilitor
-- $Revision$
-- $Id$
--
-- Support: +31 53 4800700


SPOOL xGDFS.LST
SET ECHO ON

CREATE OR REPLACE PACKAGE gdfs
AS
   FUNCTION find_str (p_string IN VARCHAR2, p_search IN VARCHAR2)
      RETURN VARCHAR2;

   FUNCTION find_oud (p_string IN VARCHAR2, p_default IN VARCHAR2)
      RETURN VARCHAR2;

   FUNCTION find_nieuw (p_string IN VARCHAR2, p_default IN VARCHAR2)
      RETURN VARCHAR2;
END;
/

CREATE OR REPLACE PACKAGE BODY gdfs
AS
   FUNCTION find_str (p_string IN VARCHAR2, p_search IN VARCHAR2)
      RETURN VARCHAR2
   AS
      v_index   NUMBER;
      v_van     NUMBER;
      v_tot     NUMBER;
   BEGIN
      v_index := INSTR (p_string, p_search);

      IF v_index > 0
      THEN
         v_van := v_index + LENGTH (p_search);
         v_tot := INSTR (p_string, CHR (10), v_index + LENGTH (p_search));
         --  dbms_output.put_line ('van:' || to_char(v_van));
         --  dbms_output.put_line ('tot:' || to_char(v_tot));

         -- als v_tot gelijk is aan 0 dan zitten we op het einde van de string. Geef
         -- dan alles maar terug tot het einde van de string (maar even op 1000 gezet.
         IF v_tot = 0 
         THEN 
            v_tot := 1000; 
         END IF;
          
         RETURN SUBSTR (p_string, v_van + 1, v_tot - v_van - 1);
      ELSE
         RETURN NULL;
      END IF;
   END;

   FUNCTION find_oud (p_string IN VARCHAR2, p_default IN VARCHAR2)
      RETURN VARCHAR2
   AS
      v_dummy    NUMBER;
      v_result   VARCHAR2 (100);
   BEGIN
      IF p_string IS NOT NULL
      THEN
         v_result := TRIM (SUBSTR (p_string, 1, INSTR (p_string, ' --> ')));

         IF v_result = '(leeg)'
         THEN
            v_result := NULL;
         END IF;

         RETURN v_result;
      ELSE
         RETURN p_default;
      END IF;
   END;

   FUNCTION find_nieuw (p_string IN VARCHAR2, p_default IN VARCHAR2)
      RETURN VARCHAR2
   AS
      v_dummy    NUMBER;
      v_van      NUMBER;
      v_tot      NUMBER;
      v_token    VARCHAR (10);
      v_result   VARCHAR (100);
   BEGIN
      v_token := ' --> ';
      v_van := INSTR (p_string, v_token) + LENGTH (v_token);

      IF v_van > 0
      THEN
         v_result := TRIM (SUBSTR (p_string, v_van));

         IF v_result = '(gewist)' OR v_result = '(Leeg)'
         THEN
            v_result := NULL;
         END IF;

         RETURN v_result;
      ELSE
         RETURN p_default;
      END IF;
   END;
END;
/

CREATE OR REPLACE VIEW gdfs_v_rap_bezoekers
(
   fclt_d_datum_in,
   tijd_in,
   datum_uit,
   tijd_uit,
   naam,
   bedrijf,
   fclt_f_gebouw,
   gastheer,
   duur
)
AS
   SELECT TO_CHAR (COALESCE (bez_bezoekers_done, TRUNC (bez_afspraak_datum)),
                   'dd-mm-yyyy')
             datum_in,
          TO_CHAR (COALESCE (bez_bezoekers_done, TRUNC (bez_afspraak_datum)),
                   'hh24:mi:ss')
             tijd_in,
          TO_CHAR (
             COALESCE (bez_bezoekers_out, TRUNC (bez_afspraak_eind + 1)),
             'dd-mm-yyyy')
             datum_uit,
          TO_CHAR (
             COALESCE (bez_bezoekers_out, TRUNC (bez_afspraak_eind + 1)),
             'hh24:mi:ss')
             tijd_uit,
          b.bez_afspraak_naam,
          b.bez_afspraak_bedrijf,
          aog.alg_gebouw_naam,
          a.bez_afspraak_gastheer,
          TO_CHAR (
             TRUNC( (COALESCE (bez_bezoekers_out,
                               TRUNC (bez_afspraak_eind + 1))
                     - COALESCE (bez_bezoekers_done,
                                 TRUNC (bez_afspraak_datum)))
                   * 24),
             'FM00')
          || ':'
          || TO_CHAR (
                MOD (
                   ( (COALESCE (bez_bezoekers_out,
                                TRUNC (bez_afspraak_eind + 1))
                      - COALESCE (bez_bezoekers_done,
                                  TRUNC (bez_afspraak_datum)))
                    * 24),
                   1)
                * 60,
                'FM00')
             duur
     FROM bez_bezoekers b, bez_afspraak a, alg_v_onroerendgoed_gegevens aog
    WHERE a.bez_afspraak_key = b.bez_afspraak_key
          AND A.ALG_ONRGOED_KEYS = AOG.ALG_ONROERENDGOED_KEYS
          AND (bez_bezoekers_out IS NOT NULL
               OR bez_bezoekers_done IS NOT NULL);


CREATE OR REPLACE VIEW gdfs_v_contactpersoon_perslid
(
   code,
   omschrijving
)
AS
   SELECT 90000000 + prs_contactpersoon_key,
          cp.prs_contactpersoon_naam
          || NVL2 (cp.prs_contactpersoon_voorletters,
                   ', ' || cp.prs_contactpersoon_voorletters,
                   '')
          || NVL2 (cp.prs_contactpersoon_tussenv,
                   ' ' || cp.prs_contactpersoon_tussenv,
                   '')
          || NVL2 (cp.prs_contactpersoon_voornaam,
                   ' (' || cp.prs_contactpersoon_voornaam || ')',
                   '')
          || ' ['
          || prs_bedrijf_naam
          || ']'
     FROM prs_contactpersoon cp, prs_bedrijf b
    WHERE cp.prs_bedrijf_key = b.prs_bedrijf_key
          AND cp.prs_contactpersoon_verwijder IS NULL
   UNION ALL
   SELECT prs_perslid_key,
          p.prs_perslid_naam
          || NVL2 (p.prs_perslid_voorletters,
                   ', ' || p.prs_perslid_voorletters,
                   '')
          || NVL2 (p.prs_perslid_tussenvoegsel,
                   ' ' || p.prs_perslid_tussenvoegsel,
                   '')
          || NVL2 (p.prs_perslid_voornaam,
                   ' (' || p.prs_perslid_voornaam || ')',
                   '')
          || ' [Intern]'
     FROM prs_perslid p
    WHERE prs_perslid_verwijder IS NULL;

CREATE OR REPLACE VIEW gdfs_v_rap_ins_uitgifte
(
   fclt_d_datum,
   fclt_f_object,
   uitgegevenaan,
   uitleendatum,
   innamedatum,
   ingeleverddoor
)
AS
   SELECT TO_CHAR (uitleen.fac_tracking_datum, 'dd-mm-yyyy') fclt_f_datum,
          ins_deel_omschrijving,
          SUBSTR (
             uitleen.fac_tracking_oms,
             INSTR (uitleen.fac_tracking_oms, 'is uitgegeven aan') + 18,
             DECODE (
                INSTR (uitleen.fac_tracking_oms, CHR (10)),
                0,
                50,
                INSTR (uitleen.fac_tracking_oms, CHR (10))
                - (INSTR (uitleen.fac_tracking_oms, 'is uitgegeven aan') + 18))),
          TO_CHAR (uitleen.fac_tracking_datum, 'dd-mm-yyyy hh24:mi:ss')
             uitleendatum,
          TO_CHAR (inname.fac_tracking_datum, 'dd-mm-yyyy hh24:mi:ss')
             innamedatum,
          (SELECT omschrijving
             FROM gdfs_v_contactpersoon_perslid
            WHERE code =
                     fac.safe_to_number(SUBSTR (
                                           inname.fac_tracking_oms,
                                           INSTR (inname.fac_tracking_oms,
                                                  'Ingel')
                                           + 28)))
             ingeleverddoor
     FROM fac_tracking uitleen,
          fac_tracking inname,
          (SELECT t.fac_tracking_key uitleen,
                  (SELECT MIN (fac_tracking_key)
                     FROM fac_tracking inname
                    WHERE inname.fac_tracking_key > t.fac_tracking_key
                      AND inname.fac_srtnotificatie_key = 63
                      AND inname.fac_tracking_refkey = t.fac_tracking_refkey)
                     inname,
                  d.ins_deel_omschrijving
             FROM fac_tracking t, ins_deel d
            WHERE fac_srtnotificatie_key = 62
              AND fac_tracking_refkey = d.ins_deel_key) uitlening
    WHERE uitlening.uitleen = uitleen.fac_tracking_key
      AND uitlening.inname = inname.fac_tracking_key(+)
   UNION ALL
   SELECT TO_CHAR (inname.fac_tracking_datum, 'dd-mm-yyyy') fclt_f_datum,
          ins_deel_omschrijving,
          SUBSTR (
             uitleen.fac_tracking_oms,
             INSTR (uitleen.fac_tracking_oms, 'is uitgegeven aan') + 18,
             DECODE (
                INSTR (uitleen.fac_tracking_oms, CHR (10)),
                0,
                50,
                INSTR (uitleen.fac_tracking_oms, CHR (10))
                - (INSTR (uitleen.fac_tracking_oms, 'is uitgegeven aan') + 18))),
          TO_CHAR (uitleen.fac_tracking_datum, 'dd-mm-yyyy hh24:mi:ss')
             uitleendatum,
          TO_CHAR (inname.fac_tracking_datum, 'dd-mm-yyyy hh24:mi:ss')
             innamedatum,
          (SELECT omschrijving
             FROM gdfs_v_contactpersoon_perslid
            WHERE code =
                     fac.safe_to_number(SUBSTR (
                                           inname.fac_tracking_oms,
                                           INSTR (inname.fac_tracking_oms,
                                                  'Ingel')
                                           + 28)))
             ingeleverddoor
     FROM fac_tracking uitleen,
          fac_tracking inname,
          (SELECT t.fac_tracking_key uitleen,
                  (SELECT MIN (fac_tracking_key)
                     FROM fac_tracking inname
                    WHERE inname.fac_tracking_key > t.fac_tracking_key
                      AND inname.fac_srtnotificatie_key = 63
                      AND inname.fac_tracking_refkey = t.fac_tracking_refkey)
                     inname,
                  d.ins_deel_omschrijving
             FROM fac_tracking t, ins_deel d
            WHERE fac_srtnotificatie_key = 62
              AND fac_tracking_refkey = d.ins_deel_key) uitlening
    WHERE uitlening.uitleen = uitleen.fac_tracking_key
      AND uitlening.inname = inname.fac_tracking_key
      AND TRUNC (uitleen.fac_tracking_datum) <>
             TRUNC (inname.fac_tracking_datum);

-- voorbeeld rapport voor als we de kilometers ook bij gaan houden.
-- blijkt nu echter erg traag te worden.
CREATE OR REPLACE VIEW gdfs_v_rap_uitgifte_basis
(
   objectx,
   uitgegevenaan,
   uitleendatum,
   innamedatum,
   ingeleverddoor,
   km_begin,
   km_eind
)
AS
   SELECT ins_deel_omschrijving objectx,
          SUBSTR (
             uitleen.fac_tracking_oms,
             INSTR (uitleen.fac_tracking_oms, 'is uitgegeven aan') + 18,
             DECODE (
                INSTR (uitleen.fac_tracking_oms, CHR (10)),
                0,
                50,
                INSTR (uitleen.fac_tracking_oms, CHR (10))
                - (INSTR (uitleen.fac_tracking_oms, 'is uitgegeven aan') + 18))),
          uitleen.fac_tracking_datum uitleendatum,
          inname.fac_tracking_datum innamedatum,
          (SELECT omschrijving
             FROM gdfs_v_contactpersoon_perslid
            WHERE code =
                     fac.safe_to_number(SUBSTR (
                                           inname.fac_tracking_oms,
                                           INSTR (inname.fac_tracking_oms,
                                                  'Ingel')
                                           + 28)))
             ingeleverddoor,
          fac.safe_to_number(SUBSTR (inname.kilometers,
                                     0,
                                     INSTR (inname.kilometers, ' --> ') - 1))
             km_begin,
          fac.safe_to_number(SUBSTR (
                                inname.kilometers,
                                INSTR (inname.kilometers, ' --> ') + 5,
                                INSTR (inname.kilometers, CHR (10))
                                - (INSTR (inname.kilometers, ' --> ') + 5)))
             km_eind
     FROM fac_tracking uitleen,
          (SELECT fac_tracking_key,
                  fac_tracking_datum,
                  fac_tracking_oms,
                  SUBSTR (
                     fac_tracking_oms,
                     INSTR (fac_tracking_oms, 'Kilometerstand: ') + 16,
                     DECODE (INSTR (fac_tracking_oms, 'Kilometerstand: '),
                             0, 0,
                             100))
                     kilometers
             FROM fac_tracking) inname,
          (SELECT t.fac_tracking_key uitleen,
                  (SELECT MIN (fac_tracking_key)
                     FROM fac_tracking inname
                    WHERE inname.fac_tracking_key > t.fac_tracking_key
                      AND inname.fac_srtnotificatie_key = 63
                      AND inname.fac_tracking_refkey = t.fac_tracking_refkey)
                     inname,
                  d.ins_deel_omschrijving
             FROM fac_tracking t, ins_deel d
            WHERE fac_srtnotificatie_key = 62
              AND fac_tracking_refkey = d.ins_deel_key) uitlening
    WHERE uitlening.uitleen = uitleen.fac_tracking_key
      AND uitlening.inname = inname.fac_tracking_key(+);

CREATE OR REPLACE VIEW gdfs_v_rap_ins_tracking
(
   hide_f_datum,
   fclt_d_datum,
   tijdstip,
   fclt_f_type,
   fclt_f_object,
   actie,
   omschrijving
)
AS
   SELECT TO_CHAR (fac_tracking_datum, 'yyyymmdd hh24mi'),
          TO_CHAR (fac_tracking_datum, 'dd-mm-yyyy'),
          TO_CHAR (fac_tracking_datum, 'hh24:mi'),
          ins_srtdeel_omschrijving,
          ins_deel_omschrijving,
          DECODE (fac_srtnotificatie_key, 62, 'Uitgifte', 'Inname') actie,
          fac_tracking_oms
     FROM ins_deel d, ins_srtdeel sd, fac_tracking t
    WHERE d.ins_deel_key = t.fac_tracking_refkey
      AND d.ins_srtdeel_key = sd.ins_srtdeel_key
      AND t.fac_srtnotificatie_key IN (62, 63);


CREATE OR REPLACE VIEW GDFS_V_RAP_DIENSTRAPPORT
(
   HIDE_F_DATUM,
   FCLT_D_DATUM,
   DIENSTRAPPORT,
   PERSOON
)
AS
   SELECT to_char(mld_melding_datum, 'yyyymmddhh24'),
     to_char(m.mld_melding_datum, 'dd-mm-yyyy'),
          m.mld_melding_key,
          (SELECT prs_perslid_naam_full
             FROM prs_v_perslid_fullnames pf
            WHERE pf.prs_perslid_key = m.prs_perslid_key)
     FROM mld_melding m
    WHERE     mld_stdmelding_key = 2;

CREATE OR REPLACE VIEW gdfs_v_export_kenteken
(
   prs_contactpersoon_key,
   kenteken_nieuw,
   kenteken_oud,
   prs_kenmerklink_key,
   result,
   result_order
)
AS
   SELECT b.prs_contactpersoon_key,
          k.bez_kenmerkwaarde_waarde,
          kl.prs_kenmerklink_waarde,
          kl.prs_kenmerklink_key,
          b.prs_contactpersoon_key || ';' || k.bez_kenmerkwaarde_waarde || ';' || kl.prs_kenmerklink_waarde || ';' || kl.prs_kenmerklink_key,
          NULL
     FROM bez_bezoekers b,
          bez_afspraak a,
          bez_kenmerkwaarde k,
          (SELECT prs_kenmerklink_key, prs_kenmerklink_waarde, prs_link_key
             FROM prs_kenmerklink
            WHERE prs_kenmerklink_niveau = 'C' AND prs_kenmerk_key = 1002) kl
    WHERE     b.bez_afspraak_key = a.bez_afspraak_key
          AND TRUNC (a.bez_afspraak_datum) = TRUNC (SYSDATE)
          AND k.bez_kenmerk_key = 1000
          AND k.bez_bezoekers_key = b.bez_bezoekers_key
          AND b.prs_contactpersoon_key = kl.prs_link_key(+);

CREATE OR REPLACE PROCEDURE gdfs_export_kenteken (p_applname   IN VARCHAR2,
                                                  p_applrun    IN VARCHAR2,
                                                  p_filedir    IN VARCHAR2,
                                                  p_filename   IN VARCHAR2)
AS
BEGIN
   UPDATE prs_kenmerklink kl
      SET prs_kenmerklink_waarde =
             (SELECT MAX(kenteken_nieuw)
                FROM gdfs_v_export_kenteken gk
               WHERE gk.prs_kenmerklink_key = kl.prs_kenmerklink_key)
    WHERE EXISTS (SELECT kenteken_nieuw
                    FROM gdfs_v_export_kenteken gk
                   WHERE gk.prs_kenmerklink_key = kl.prs_kenmerklink_key);

   INSERT INTO prs_kenmerklink (prs_link_key,
                                prs_kenmerklink_niveau,
                                prs_kenmerklink_waarde,
                                prs_kenmerk_key)
      SELECT prs_contactpersoon_key,
             'C',
             MAX(kenteken_nieuw),
             1002
        FROM gdfs_v_export_kenteken
       WHERE prs_kenmerklink_key IS NULL
       GROUP BY prs_contactpersoon_key;
END;
/

CREATE OR REPLACE PROCEDURE gdfs_export_daily_task (
   p_applname   IN   VARCHAR2,
   p_applrun    IN   VARCHAR2,
   p_filedir    IN   VARCHAR2,
   p_filename   IN   VARCHAR2
)
AS
   CURSOR c
   IS
        SELECT *
          FROM fac_tracking t, ins_deel d
         WHERE fac_tracking_refkey = d.ins_deel_key
           AND d.ins_srtdeel_key = 7    -- autos
           AND fac_srtnotificatie_key IN (62, 63)   -- uitgifte en inname
      ORDER BY ins_deel_key, fac_tracking_datum;

   v_bestuurder                  VARCHAR2 (60);
   v_uitgifte                    DATE;
   v_inname                      DATE;
   v_reden                       VARCHAR2 (100);
   v_van                         VARCHAR2 (100);
   v_naar                        VARCHAR2 (100);
   v_km_uitgifte                 NUMBER (10);
   v_km_inname                   NUMBER (10);
   v_fac_tracking_uitgifte_key   NUMBER (10);
   v_fac_tracking_inname_key     NUMBER (10);
   v_dummy                       VARCHAR2 (1000);
   v_search                      VARCHAR2 (1000);
BEGIN
   DELETE gdfs_autorit_registratie;

   FOR rec IN c
   LOOP
      BEGIN
         v_search := 'Reden van gebruik:';
         v_dummy := gdfs.find_str (rec.fac_tracking_oms, v_search);
         v_reden := gdfs.find_nieuw (v_dummy, v_reden);
         v_search := 'Van:';
         v_dummy := gdfs.find_str (rec.fac_tracking_oms, v_search);
         v_van := gdfs.find_nieuw (v_dummy, v_van);
         v_search := 'Naar:';
         v_dummy := gdfs.find_str (rec.fac_tracking_oms, v_search);
         v_naar := gdfs.find_nieuw (v_dummy, v_naar);
         v_search := 'Kilometerstand:';
         v_dummy := gdfs.find_str (rec.fac_tracking_oms, v_search);
         IF v_dummy IS NULL
         THEN
            v_km_uitgifte := v_km_inname;
         ELSE
            v_km_uitgifte := gdfs.find_oud (v_dummy, v_km_uitgifte);
            v_km_inname := gdfs.find_nieuw (v_dummy, v_km_inname);
         END IF;
         v_search := 'is uitgegeven aan';
         v_dummy := gdfs.find_str (rec.fac_tracking_oms, v_search);
         v_bestuurder := v_dummy;


         IF rec.fac_srtnotificatie_key = 62
         THEN
            -- Uitgifte
            v_uitgifte := rec.fac_tracking_datum;

            INSERT INTO gdfs_autorit_registratie (ins_deel_key,
                                                  bestuurder,
                                                  uitgifte,
                                                  reden,
                                                  van,
                                                  naar,
                                                  km_uitgifte,
                                                  fac_tracking_uitgifte_key)
                VALUES (rec.fac_tracking_refkey,
                        v_bestuurder,
                        v_uitgifte,
                        v_reden,
                        v_van,
                        v_naar,
                        v_km_uitgifte,
                        rec.fac_tracking_key);

            v_fac_tracking_uitgifte_key := rec.fac_tracking_key;
         ELSE
            v_inname := rec.fac_tracking_datum;

            UPDATE gdfs_autorit_registratie
               SET inname = v_inname,
                   reden = COALESCE (v_reden, reden),
                   van = COALESCE (v_van, van),
                   naar = COALESCE (v_naar, naar),
                   km_uitgifte = COALESCE (v_km_uitgifte, km_uitgifte),
                   km_inname = v_km_inname,
                   fac_tracking_inname_key = rec.fac_tracking_key
             WHERE fac_tracking_uitgifte_key = v_fac_tracking_uitgifte_key;
         END IF;
      END;
   END LOOP;
END;
/


CREATE OR REPLACE VIEW gdfs_v_rap_auto_registratie
(
   timestamp,
   maand,
   auto,
   bestuurder,
   fclt_d_datum,
   uitgifte_datum,
   uitgifte_tijd,
   inname_datum,
   inname_tijd,
   reden,
   van,
   naar,
   km_uitgifte,
   km_inname,
   km_verschil
)
AS
   SELECT TO_CHAR (uitgifte, 'yyyymmddhh24mi') timestamp,
          TO_CHAR (uitgifte, 'Month') maand,
          ins_deel_omschrijving auto,
          bestuurder,
          TO_CHAR (uitgifte, 'dd-mm-yyyy') filter,
          TO_CHAR (uitgifte, 'dd-mm-yyyy') uitgifte_datum,
          TO_CHAR (uitgifte, 'hh24:mi') uitgifte_tijd,
          TO_CHAR (inname, 'dd-mm-yyyy') inname_datum,
          TO_CHAR (inname, 'hh24:mi') inname_tijd,
          reden,
          van,
          naar,
          km_uitgifte,
          km_inname,
          km_inname - km_uitgifte km_verschil
     FROM gdfs_autorit_registratie a, ins_deel d
    WHERE a.ins_deel_key = d.ins_deel_key;

BEGIN fac.registercustversion('GDFS', 7); END;
/
BEGIN adm.systrackscriptId('$Id$', 0); END;
/
COMMIT;

SPOOL OFF
