--
-- $Id$
--
-- Script containing customer specific sql statements for the AADO database

DEFINE thisfile = 'AADO.SQL'
DEFINE dbuser   = '^AADO'
DEFINE custid   = 'AADO'

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 ------

-- script om dagelijks terugkerende scripts aan te roepen.
CREATE OR REPLACE PROCEDURE aado_select_daily_task (p_applname   IN   VARCHAR2, p_applrun    IN   VARCHAR2)
AS
BEGIN
   aaxx_daily_task (p_applname, p_applrun);
END;
/

-- budgettracker overrules
CREATE OR REPLACE VIEW aado_v_export_budget_tracker   (RESULT, result_order) AS SELECT RESULT, result_order FROM aaxx_v_export_budget_tracker;

-- export overrules
-- exact
CREATE OR REPLACE VIEW aado_v_export_exact            (RESULT, result_order) AS SELECT RESULT, result_order FROM aaxx_v_export_exact_xml;
CREATE OR REPLACE PROCEDURE aado_select_exact (
   p_applname   IN   VARCHAR2,
   p_applrun    IN   VARCHAR2
)
AS
BEGIN
  aaxx_select_exact_xml(p_applname, p_applrun);
END;
/

CREATE OR REPLACE PROCEDURE aado_export_exact (
   p_applname   IN   VARCHAR2,
   p_applrun    IN   VARCHAR2,
   p_filedir    IN   VARCHAR2,
   p_filename   IN   VARCHAR2
)
AS
BEGIN
  aaxx_export_exact(p_applname, p_applrun, p_filedir, p_filename);
END;
/

CREATE OR REPLACE VIEW aado_v_export_verwerk_exact    (RESULT, result_order) AS SELECT RESULT, result_order FROM aaxx_v_export_verwerk_exact;
CREATE OR REPLACE PROCEDURE aado_export_verwerk_exact (
   p_applname   IN   VARCHAR2,
   p_applrun    IN   VARCHAR2,
   p_filedir    IN   VARCHAR2,
   p_filename   IN   VARCHAR2
)
AS
BEGIN
  aaxx_export_verwerk_exact(p_applname, p_applrun, p_filedir, p_filename);
END;
/

-- bundel catering
CREATE OR REPLACE VIEW aado_v_export_bundel_catering    (RESULT, result_order) AS SELECT RESULT, result_order FROM aaxx_v_export_bundel_catering;


-- exact verkoop
CREATE OR REPLACE VIEW aado_v_export_exact_verkoop    (RESULT, result_order) AS SELECT RESULT, result_order FROM aaxx_v_export_exact_verkoop;
CREATE OR REPLACE PROCEDURE aado_select_exact_verkoop (
   p_applname   IN   VARCHAR2,
   p_applrun    IN   VARCHAR2
)
AS
BEGIN
  aaxx_select_exact_verkoop(p_applname, p_applrun, to_char(sysdate, 'yyyy'));
END;
/
CREATE OR REPLACE PROCEDURE aado_export_exact_verkoop (
   p_applname   IN   VARCHAR2,
   p_applrun    IN   VARCHAR2,
   p_filedir    IN   VARCHAR2,
   p_filename   IN   VARCHAR2
)
AS
BEGIN
  aaxx_export_exact_verkoop(p_applname, p_applrun, p_filedir, p_filename, to_char(sysdate, 'yyyy'));
END;
/

-- exact verkoop over het vorige jaar
CREATE OR REPLACE VIEW aado_v_export_exact_verkoop_vj    (RESULT, result_order) AS SELECT RESULT, result_order FROM aaxx_v_export_exact_verkoop;
CREATE OR REPLACE PROCEDURE aado_select_exact_verkoop_vj (
   p_applname   IN   VARCHAR2,
   p_applrun    IN   VARCHAR2
)
AS
BEGIN
  aaxx_select_exact_verkoop(p_applname, p_applrun, to_char(to_number(to_char(sysdate, 'yyyy'))-1));
END;
/
CREATE OR REPLACE PROCEDURE aado_export_exact_verkoop_vj (
   p_applname   IN   VARCHAR2,
   p_applrun    IN   VARCHAR2,
   p_filedir    IN   VARCHAR2,
   p_filename   IN   VARCHAR2
)
AS
BEGIN
  aaxx_export_exact_verkoop(p_applname, p_applrun, p_filedir, p_filename, to_char(to_number(to_char(sysdate, 'yyyy'))-1));
END;
/

-- exact projecturen (XML)
CREATE OR REPLACE VIEW aado_v_export_exact_uren (result, result_order)
AS SELECT result, result_order FROM aaxx_v_export_exact_uren_xml;
CREATE OR REPLACE PROCEDURE aado_select_exact_uren (
   p_applname   IN   VARCHAR2,
   p_applrun    IN   VARCHAR2
)
AS
BEGIN
  aaxx_select_exact_uren_xml(p_applname, p_applrun, '');
END;
/

-- verwerk exact projecturen (XML)
CREATE OR REPLACE PROCEDURE aado_export_verwerk_exact_uren (
   p_applname   IN   VARCHAR2,
   p_applrun    IN   VARCHAR2,
   p_filedir    IN   VARCHAR2,
   p_filename   IN   VARCHAR2
)
AS
BEGIN
  aaxx_export_verwerk_exact_uren(p_applname, p_applrun, p_filedir, p_filename, '');
END;
/


CREATE OR REPLACE PROCEDURE aado_import_opdrstat_strukton (
   p_import_key IN NUMBER)
AS
BEGIN
   aaxx_import_opdrstat_strukton (p_import_key);
END;
/

CREATE OR REPLACE PROCEDURE aado_update_opdrstat_strukton (
   p_import_key IN NUMBER)
AS
BEGIN
   aaxx_update_opdrstat_strukton (p_import_key);
END;
/


-- prs_imports
CREATE OR REPLACE PROCEDURE aado_import_perslid (p_import_key IN NUMBER)
AS
   v_seq_of_columns          VARCHAR(255);

BEGIN
    v_seq_of_columns := '1;2;3;4;5;6;7;8;9;11;10;0;0;0;0;13;14;15;0;17;16;18;19;12;0;0;20;28;29;30;31;32;33;34;35;36;37;38;39;40;41;42;43;44;45;46';
    prs.import_perslid(p_import_key, v_seq_of_columns, 'Locatiecode;Gebouwcode;Bouwlaagvolgnummer;Ruimtenummer;Werkplekvolgnummer;Omschrijving;Afdelingscode;PersoonAchternaam;Tussenvoegsel;Voorletters;Voornaam;Titel/Aanhef;Telefoonnummer;Mobiel;Email;Functie;Personeelsnummer;Loginnaam;Password;Kostenplaats%');
END;
/

CREATE OR REPLACE PROCEDURE aado_update_perslid (
   p_import_key IN NUMBER
) IS
BEGIN
   prs.update_perslid (p_import_key, 'EMAIL', 'A');

   -- vul voor de update straks alvast de perslid_key in.
   UPDATE fac_imp_perslid i
      SET prs_kenmerk2 = (SELECT prs_perslid_key
                            FROM prs_perslid p
                           WHERE p.prs_perslid_verwijder IS NULL
                             AND LOWER(p.prs_perslid_email) = LOWER(i.prs_perslid_email));

   -- vul voor de update straks alvast de key van de kostenplaats in.
   UPDATE fac_imp_perslid i
      SET prs_kenmerk3 = (SELECT prs_kostenplaats_key
                            FROM prs_kostenplaats k
                           WHERE prs_kostenplaats_verwijder IS NULL
                             AND k.prs_kostenplaats_nr = prs_kenmerk1);

/* voor de toekomst wellicht: bestaande mandaten verwijderen als deze niet meer voorkomen
   DELETE prs_perslidkostenplaats pk
    WHERE pk.prs_perslid_key IN (SELECT fac.safe_to_number(prs_kenmerk2)
                                   FROM fac_imp_perslid
                                  WHERE prs_kenmerk1 IS NOT NULL)
     AND NOT EXISTS (SELECT prs_perslid_naam
                       FROM fac_imp_perslid p
                      WHERE p.prs_kenmerk2 = pk.prs_perslid_key
                        AND p.prs_kenmerk3 = pk.prs_kostenplaats_key);*/

   INSERT INTO prs_perslidkostenplaats (prs_perslid_key, prs_kostenplaats_key)
   ( SELECT prs_kenmerk2, prs_kenmerk3
       FROM fac_imp_perslid i
      WHERE prs_kenmerk2 IS NOT NULL
        AND prs_kenmerk3 IS NOT NULL
        AND NOT EXISTS (SELECT prs_perslidkostenplaats_key
                          FROM prs_perslidkostenplaats
                         WHERE prs_perslid_key = prs_kenmerk2
                           AND (    prs_kostenplaats_key = prs_kenmerk3
                                 OR prs_kostenplaats_key IS NULL)));

END aado_update_perslid;
/

-- import overrulles
-- import srtruimte
CREATE OR REPLACE PROCEDURE aado_import_contract (p_import_key IN NUMBER)
AS
BEGIN
  aaxx_import_contract(p_import_key);
END;
/

CREATE OR REPLACE PROCEDURE aado_update_contract (p_import_key IN NUMBER)
AS
BEGIN
  aaxx_update_contract(p_import_key);
END;
/

CREATE OR REPLACE PROCEDURE aado_import_ruimte (p_import_key IN NUMBER)
AS
BEGIN
  aaxx_import_ruimte(p_import_key);
END;
/

CREATE OR REPLACE PROCEDURE aado_update_ruimte (p_import_key IN NUMBER)
AS
BEGIN
  aaxx_update_ruimte(p_import_key);
END;
/

CREATE OR REPLACE VIEW aado_v_exp_bundel_catering
AS
       SELECT pk.prs_kostenplaats_key,
               res_rsv_artikel_key,
               res_rsv_artikel_prijs,
               res_rsv_artikel_levering
          FROM prs_kostenplaats pk,
               prs_v_afdeling_boom pb,
               prs_afdeling pa,
               prs_afdeling p1,
               res_rsv_artikel rra,
               res_rsv_ruimte rrr
         WHERE     pk.prs_kostenplaats_key = p1.prs_kostenplaats_key
               AND pa.prs_afdeling_key = pb.prs_afdeling_key
               AND pb.prs_afdeling_key1 = p1.prs_afdeling_key
               AND rra.res_rsv_ruimte_key = rrr.res_rsv_ruimte_key
               AND rrr.prs_kostenplaats_key = pa.prs_kostenplaats_key
               AND pk.prs_kostenplaats_verwijder IS NULL
               AND pa.prs_afdeling_verwijder IS NULL
               AND p1.prs_afdeling_verwijder IS NULL
               AND rra.res_rsv_artikel_verwijder IS NULL
               AND rra.res_status_bo_key = 5;

CREATE OR REPLACE PROCEDURE aado_export_bundel_catering (
   p_applname   IN VARCHAR2,
   p_applrun    IN VARCHAR2,
   p_filedir    IN VARCHAR2,
   p_filename   IN VARCHAR2)
AS
   CURSOR c
   IS
      SELECT rrr.res_rsv_ruimte_key,
             rrr.res_rsv_artikel_levering,
             a.res_rsv_artikel_aantal,
             a.res_rsv_artikel_key,
             a.res_status_bo_key
        FROM (SELECT res_rsv_ruimte_key,
                     res_rsv_artikel_aantal,
                     res_rsv_artikel_key,
                     rra2.res_status_bo_key
                FROM res_rsv_artikel rra2
               WHERE res_artikel_key = 661
                     AND res_rsv_artikel_verwijder IS NULL) a,
             (  SELECT res_rsv_ruimte_key,
                       MIN (res_rsv_artikel_levering) res_rsv_artikel_levering
                  FROM res_rsv_artikel rra
                 WHERE     rra.res_rsv_artikel_verwijder IS NULL
                       AND rra.res_status_bo_key = 5              -- geleverd.
                       AND rra.res_rsv_artikel_levering < SYSDATE
              GROUP BY res_rsv_ruimte_key) rrr
       WHERE rrr.res_rsv_ruimte_key = a.res_rsv_ruimte_key(+);

   CURSOR p (c_date DATE)
   IS
        SELECT prs_kostenplaats_key,
               COALESCE (SUM (res_rsv_artikel_prijs), 0) bedrag
          FROM aado_v_exp_bundel_catering
         WHERE res_rsv_artikel_levering < c_date
      GROUP BY prs_kostenplaats_key;

   c_catmld_uitvoertijd mld_stdmelding.mld_stdmelding_t_uitvoertijd%TYPE
         := MLD_T_UITVOERTIJD (2, 'D');
   v_errormsg                      VARCHAR (200);
   oracle_err_num                  NUMBER;
   oracle_err_mes                  VARCHAR2 (200);
   v_laatste_export                DATE;
   v_mld_melding_key               NUMBER;
   v_prs_bedrijf_key               NUMBER;
   v_alg_locatie_key               NUMBER;
   v_alg_gebouw_key                NUMBER;
   v_prs_dienst_key                NUMBER;
   v_prs_kostenplaats_key          NUMBER;
   v_mld_opdr_bedrijfopdr_volgnr   NUMBER;
   v_aanvrager                     NUMBER;
   v_mld_workorder_key             NUMBER;
   v_mld_stdmelding_key            NUMBER;
   v_mld_opdr_key                  NUMBER;
   v_res_rsv_artikel_key           NUMBER;
   v_res_status_bo_key             NUMBER;
   v_date                          DATE;
   v_count                         NUMBER;
   v_total                         NUMBER (10, 2);
   v_res_rsv_artikel_prijs         NUMBER (10, 2);
BEGIN
   -- Facilitor
   v_aanvrager := 4;
   -- DOW: Arcadis Aqumen kostenplaats key
   v_prs_kostenplaats_key := 1541;
   -- stdmelding key voor recharge
   v_mld_stdmelding_key := 181;
   -- key van opdrachttype workorder
   v_mld_workorder_key := 1;
   -- key voor de locatie van de melding
   v_alg_locatie_key := 1;
   v_alg_gebouw_key := 23;                                    -- plant canteen
   -- key van Appel
   v_prs_bedrijf_key := 2822;

   v_errormsg := 'Bepaal einddatum';

   -- wat is de eerste dag van de huidige maand
   v_date := TO_DATE (TO_CHAR (SYSDATE, 'yyyymm') || '01', 'yyyymmdd');

   SELECT COUNT (mld_opdr_key)
     INTO v_count
     FROM mld_opdr
    WHERE mld_opdr_omschrijving =
             'Catering factuur tot: ' || TO_CHAR (v_date, 'dd-mm-yyyy');

   SELECT COALESCE (SUM (res_rsv_artikel_prijs), 0)
     INTO v_total
     FROM res_rsv_artikel rra
    WHERE     rra.res_rsv_artikel_verwijder IS NULL
          AND rra.res_status_bo_key = 5                           -- geleverd.
          AND rra.res_rsv_artikel_levering < v_date;

   fac.writelog (
      p_applname,
      'I',
      'Te factureren catering bedrag voor toevoeging disposables:' || v_total,
      '');

   IF v_count > 0
   THEN
      fac.writelog (
         p_applname,
         'E',
         'Catering export is al eerder uitgevoerd.',
         'Controleer opdrachten met datum: '
         || TO_CHAR (v_date, 'dd-mm-yyyy'));
   ELSIF v_total = 0
   THEN
      fac.writelog (p_applname,
                    'W',
                    'Er is deze maand niets te factureren',
                    'Controleer of de catering wel afgemeld is');
   ELSE
      FOR rec IN c
      LOOP
         v_res_rsv_artikel_key := rec.res_rsv_artikel_key;
         v_res_status_bo_key := rec.res_status_bo_key;

         -- Verwijder artikelen waar meer dan 1 stuks is aangegeven.
         IF rec.res_rsv_artikel_aantal IS NOT NULL
            AND rec.res_rsv_artikel_aantal <> 1
         THEN
            UPDATE res_rsv_artikel
               SET res_rsv_artikel_verwijder = SYSDATE
             WHERE res_rsv_artikel_key = v_res_rsv_artikel_key
                   AND res_status_bo_key < 6;

            v_res_rsv_artikel_key := NULL;
         END IF;

         IF v_res_rsv_artikel_key IS NULL
         THEN
            -- Artikel disposables a 2,50 toevoegen voor kostendoorberekening
            INSERT INTO res_rsv_artikel (res_artikel_key,
                                         res_rsv_artikel_aantal,
                                         res_rsv_artikel_levering,
                                         res_status_bo_key,
                                         res_rsv_ruimte_key)
                VALUES (661,                                    -- disposables
                        1,
                        rec.res_rsv_artikel_levering,
                        2,
                        rec.res_rsv_ruimte_key)
                RETURN res_rsv_artikel_key
                  INTO v_res_rsv_artikel_key;

            v_res_status_bo_key := 2;
         END IF;

         IF v_res_status_bo_key = 2
         THEN
            v_res_rsv_artikel_prijs :=
               RES.getartikelprijs (v_res_rsv_artikel_key);

            UPDATE res_rsv_artikel
               SET res_status_bo_key = 5,
                   res_rsv_artikel_prijs = v_res_rsv_artikel_prijs
             WHERE res_rsv_artikel_key = v_res_rsv_artikel_key;
         END IF;
      END LOOP;

      v_errormsg := 'Aanpassen kostenplaatsen';

      -- vul de kostenplaats van reserveringen die per abuis geen kostenplaats hebben.
      UPDATE res_rsv_ruimte rrr
         SET prs_kostenplaats_key =
                (SELECT prs_kostenplaats_key
                   FROM prs_perslid p, prs_afdeling a
                  WHERE rrr.res_rsv_ruimte_host_key = p.prs_perslid_key
                        AND p.prs_afdeling_key = a.prs_afdeling_key)
       WHERE rrr.prs_kostenplaats_key IS NULL;

      -- maak een melding aan voor deze maand

      v_errormsg := 'Aanmaken catering melding';

      BEGIN
         INSERT INTO mld_melding (mld_melding_omschrijving,
                                  prs_perslid_key,
                                  prs_kostenplaats_key,
                                  mld_stdmelding_key,
                                  mld_alg_locatie_key,
                                  mld_alg_onroerendgoed_keys,
                                  mld_melding_einddatum,
                                  mld_melding_datum,
                                  mld_melding_t_uitvoertijd,
                                  mld_meldbron_key,
                                  mld_melding_module,
                                  mld_melding_spoed)
             VALUES ('Catering factuur boekingen tot '
                     || TO_CHAR (v_date, 'dd-mm-yyyy'),
                     v_aanvrager,
                     v_prs_kostenplaats_key,
                     v_mld_stdmelding_key,
                     v_alg_locatie_key,
                     v_alg_gebouw_key,
                     v_date - 1,
                     ADD_MONTHS (v_date, -1),
                     c_catmld_uitvoertijd,
                     5,
                     'MLD',
                     3)
          RETURNING mld_melding_key
               INTO v_mld_melding_key;

         BEGIN
            mld.setmeldingstatus (v_mld_melding_key, 2, v_aanvrager);
         END;

         BEGIN
            mld.setmeldingstatus (v_mld_melding_key, 4, v_aanvrager);
         END;

         UPDATE mld_melding
            SET mld_melding_behandelaar_key = v_aanvrager
          WHERE mld_melding_key = v_mld_melding_key;
      END;

      -- aanmaken opdracht

      FOR rec IN p (v_date)
      LOOP
         BEGIN
            v_mld_opdr_bedrijfopdr_volgnr :=
               mld.BepaalOpdrMeldingVolgnr (v_mld_melding_key);

            v_errormsg :=
               'Maak opdracht aan om factuur van cateraar te matchen';

            -- maak opdracht aan om cateringfactuur van leverancier te matchen
            INSERT INTO mld_opdr (mld_melding_key,
                                  prs_kostenplaats_key,
                                  mld_statusopdr_key,
                                  mld_typeopdr_key,
                                  prs_perslid_key,
                                  mld_uitvoerende_keys,
                                  mld_opdr_datumbegin,
                                  mld_opdr_einddatum,
                                  mld_opdr_module,
                                  mld_opdr_omschrijving,
                                  mld_opdr_materiaal,
                                  mld_opdr_kosten,
                                  mld_opdr_bedrijfopdr_volgnr)
                VALUES (v_mld_melding_key,
                        rec.prs_kostenplaats_key,
                        5                                        -- uitgegeven
                         ,
                        v_mld_workorder_key,
                        v_aanvrager,
                        v_prs_bedrijf_key,
                        v_date - 1,
                        FAC.DatumTijdPlusUitvoerTijd (SYSDATE, 1, 'DAGEN'),
                        'MLD',
                        'Catering factuur tot: '
                        || TO_CHAR (v_date, 'dd-mm-yyyy'),
                        rec.bedrag,
                        rec.bedrag,
                        v_mld_opdr_bedrijfopdr_volgnr)
                RETURNING mld_opdr_key INTO v_mld_opdr_key;

                  INSERT INTO aaxx_bundel_catering_ref (mld_opdr_key, res_rsv_artikel_key, res_rsv_artikel_prijs, res_rsv_artikel_verwerkt)
                        SELECT v_mld_opdr_key, res_rsv_artikel_key, res_rsv_artikel_prijs, v_date
                            FROM aado_v_exp_bundel_catering bc
                           WHERE coalesce(prs_kostenplaats_key, -1) = coalesce (rec.prs_kostenplaats_key, -1)
                             AND res_rsv_artikel_levering < v_date;

                  UPDATE res_rsv_artikel rra
                     SET res_rsv_artikel_verwerkt = SYSDATE,
                         res_status_bo_key = 6
                   WHERE EXISTS
                            (SELECT mld_opdr_key
                               FROM aaxx_bundel_catering_ref bc
                              WHERE bc.mld_opdr_key  = v_mld_opdr_key
                                AND bc.res_rsv_artikel_key = rra.res_rsv_artikel_key);

         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.writelog (p_applname,
                             'E',
                             v_errormsg,
                             '');
         END;
      END LOOP;

      v_errormsg := 'Update melding status';
      MLD.updatemeldingstatus (v_mld_melding_key, 0, v_aanvrager); -- Facilitor
   END IF;
   COMMIT;
END;
/

------ 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


