--
-- $Id$
--
-- Toekennen profiel aan personen 913848 DSM Zwolle

DEFINE thisfile = 'AADS#51169.SQL'
DEFINE dbuser   = '^AADS'
DEFINE custid   = 'AADS'

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 VIEW aads_v_bundel_catering
(
   prs_kostenplaats_key,
   prs_bedrijf_key,
   alg_gebouw_key,
   alg_locatie_key,
   res_rsv_artikel_prijs,
   res_rsv_artikel_key,
   res_rsv_artikel_levering,
   res_status_bo_key,
   mld_stdmelding_key
)
AS
   SELECT rrr.prs_kostenplaats_key,
          prs_bedrijf_key,
          g.alg_gebouw_key,
          g.alg_locatie_key,
          res_rsv_artikel_prijs,
          rra.res_rsv_artikel_key,
          rra.res_rsv_artikel_levering,
          rra.res_status_bo_key,
          (SELECT FAC.safe_to_number(alg_onrgoedkenmerk_waarde)
             FROM alg_onrgoedkenmerk
            WHERE alg_kenmerk_key = 5 -- kenmerk voor catering stdmelding key
              AND alg_onrgoed_key = g.alg_locatie_key) mld_stdmelding_key
     FROM res_rsv_artikel rra,
          res_rsv_ruimte rrr,
          res_artikel ra,
          (SELECT ins_discipline_key,
                  DECODE (INSTR (ins_discipline_omschrijving, 'Sodexo'),
                          0, DECODE (INSTR (ins_discipline_omschrijving, 'Albron'),
                                     0,  DECODE (INSTR (ins_discipline_omschrijving, 'Hutten'),
                                                 0,  DECODE (INSTR (ins_discipline_omschrijving, 'Emmtec'), 0, -1, 12796) -- Emmtec
                                                 , 7064)                                                                  -- Hutten
                                     , 184)                                                                               -- Albron
                          ,  247)                                                                                         -- Sodexo
                     prs_bedrijf_key
             FROM ins_tab_discipline) rdb,
          alg_ruimte r,
          alg_verdieping v,
          alg_gebouw g
    WHERE rra.res_artikel_key = ra.res_artikel_key
      AND ra.res_discipline_key = rdb.ins_discipline_key
      AND rra.res_rsv_ruimte_key = rrr.res_rsv_ruimte_key
      AND rra.res_rsv_artikel_verwijder IS NULL
      AND rrr.alg_ruimte_key = r.alg_ruimte_key
      AND r.alg_verdieping_key = v.alg_verdieping_key
      AND v.alg_gebouw_key = g.alg_gebouw_key
      AND rdb.prs_bedrijf_key <> -1    -- als geen bedrijf gevonden kan worden
      AND rra.res_status_bo_key = 5
      AND res_rsv_artikel_prijs > 0;

CREATE OR REPLACE PROCEDURE AADS.aads_export_bundel_catering (
   p_applname   IN   VARCHAR2,
   p_applrun    IN   VARCHAR2,
   p_filedir    IN   VARCHAR2,
   p_filename   IN   VARCHAR2
)
AS

  CURSOR c(lev_date DATE) IS
  SELECT prs_kostenplaats_key,
         prs_bedrijf_key,
         alg_locatie_key,
         alg_gebouw_key,
         SUM (res_rsv_artikel_prijs) prijs,
         mld_stdmelding_key
    FROM aads_v_bundel_catering
   WHERE res_rsv_artikel_levering < lev_date
     AND res_status_bo_key = 5
GROUP BY prs_bedrijf_key, prs_kostenplaats_key, alg_locatie_key, alg_gebouw_key, mld_stdmelding_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_mld_opdr_key                NUMBER;
   v_prs_bedrijf_key             NUMBER;
   v_alg_locatie_key             NUMBER;
   v_prs_dienst_key              NUMBER;
   v_mld_opdr_bedrijfopdr_volgnr NUMBER;
   v_aanvrager                   NUMBER;
   v_mld_workorder_key           NUMBER;
   v_mld_stdmelding_key          NUMBER;
   v_date                        DATE;
   v_count                       NUMBER;
BEGIN
  -- Facilitor
  v_aanvrager := 4;
  -- stdmelding key voor recharge
  v_mld_stdmelding_key := 941;
  -- key van opdrachttype workorder
  v_mld_workorder_key := 1;


  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');

  IF v_count > 0 AND 0=1 THEN
    fac.writelog (p_applname, 'E', 'Catering export is al eerder uitgevoerd.',
                                   'Controleer opdrachten met datum: ' || to_char(v_date, 'dd-mm-yyyy'));
  ELSE
    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;

    FOR rec IN c(v_date) LOOP
    -- maak een melding aan voor deze maand

  	   v_errormsg := 'Aanmaken catering melding';

      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,
   	  rec.prs_kostenplaats_key,
   	  COALESCE(rec.mld_stdmelding_key, v_mld_stdmelding_key),
   	  rec.alg_locatie_key,
   	  rec.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;

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

      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
             , rec.prs_bedrijf_key
             , v_date -1
             , FAC.DatumTijdPlusUitvoerTijd(sysdate, 1, 'DAGEN')
             , 'MLD'
             , 'Catering factuur tot: ' || to_char(v_date, 'dd-mm-yyyy')
             , round(rec.prijs,2)
             , round(rec.prijs,2)
             , v_mld_opdr_bedrijfopdr_volgnr) RETURNING mld_opdr_key INTO v_mld_opdr_key;

      MLD.setopdrachtstatus(v_mld_opdr_key, 6, v_aanvrager);             -- afgemeld, facilitor

       v_errormsg := 'Update melding/opdracht status';

       MLD.updatemeldingstatus (v_mld_melding_key, 0, v_aanvrager);       -- facilitor
       MLD.setmeldingstatus(v_mld_melding_key, 5, v_aanvrager);           -- afgemeld, facilitor
       MLD.mld_nextworkflowstep (v_mld_melding_key, 1);

    END LOOP;

    v_errormsg := 'Markeer alle verwerkte catering bestellingen';
    UPDATE res_rsv_artikel rra
       SET res_rsv_artikel_verwerkt = SYSDATE,
           res_status_bo_key = 6
     WHERE EXISTS (SELECT res_rsv_artikel_key
                     FROM aads_v_bundel_catering rbc
                     WHERE     rbc.res_rsv_artikel_key = rra.res_rsv_artikel_key
                           AND rbc.res_rsv_artikel_levering < v_date
                           AND res_status_bo_key = 5);

    COMMIT;

  END IF;
  EXCEPTION WHEN OTHERS THEN
      ROLLBACK;
	    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, '');
	    COMMIT;
END;
/


BEGIN aads_export_bundel_catering ('BUNDEL_CATERING', 'AADS#51169', NULL, NULL); END;
/


CREATE OR REPLACE PROCEDURE aads_export_bundel_catering (
   p_applname   IN   VARCHAR2,
   p_applrun    IN   VARCHAR2,
   p_filedir    IN   VARCHAR2,
   p_filename   IN   VARCHAR2
)
AS

  CURSOR c(lev_date DATE) IS
  SELECT prs_kostenplaats_key,
         prs_bedrijf_key,
         alg_locatie_key,
         alg_gebouw_key,
         SUM (res_rsv_artikel_prijs) prijs,
         mld_stdmelding_key
    FROM aads_v_bundel_catering
   WHERE res_rsv_artikel_levering < lev_date
     AND res_status_bo_key = 5
GROUP BY prs_bedrijf_key, prs_kostenplaats_key, alg_locatie_key, alg_gebouw_key, mld_stdmelding_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_mld_opdr_key                NUMBER;
   v_prs_bedrijf_key             NUMBER;
   v_alg_locatie_key             NUMBER;
   v_prs_dienst_key              NUMBER;
   v_mld_opdr_bedrijfopdr_volgnr NUMBER;
   v_aanvrager                   NUMBER;
   v_mld_workorder_key           NUMBER;
   v_mld_stdmelding_key          NUMBER;
   v_date                        DATE;
   v_count                       NUMBER;
BEGIN
  -- Facilitor
  v_aanvrager := 4;
  -- stdmelding key voor recharge
  v_mld_stdmelding_key := 941;
  -- key van opdrachttype workorder
  v_mld_workorder_key := 1;


  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');

  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'));
  ELSE
    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;

    FOR rec IN c(v_date) LOOP
    -- maak een melding aan voor deze maand

  	   v_errormsg := 'Aanmaken catering melding';

      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,
   	  rec.prs_kostenplaats_key,
   	  COALESCE(rec.mld_stdmelding_key, v_mld_stdmelding_key),
   	  rec.alg_locatie_key,
   	  rec.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;

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

      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
             , rec.prs_bedrijf_key
             , v_date -1
             , FAC.DatumTijdPlusUitvoerTijd(sysdate, 1, 'DAGEN')
             , 'MLD'
             , 'Catering factuur tot: ' || to_char(v_date, 'dd-mm-yyyy')
             , round(rec.prijs,2)
             , round(rec.prijs,2)
             , v_mld_opdr_bedrijfopdr_volgnr) RETURNING mld_opdr_key INTO v_mld_opdr_key;

      MLD.setopdrachtstatus(v_mld_opdr_key, 6, v_aanvrager);             -- afgemeld, facilitor

       v_errormsg := 'Update melding/opdracht status';

       MLD.updatemeldingstatus (v_mld_melding_key, 0, v_aanvrager);       -- facilitor
       MLD.setmeldingstatus(v_mld_melding_key, 5, v_aanvrager);           -- afgemeld, facilitor
       MLD.mld_nextworkflowstep (v_mld_melding_key, 1);

    END LOOP;

    v_errormsg := 'Markeer alle verwerkte catering bestellingen';
    UPDATE res_rsv_artikel rra
       SET res_rsv_artikel_verwerkt = SYSDATE,
           res_status_bo_key = 6
     WHERE EXISTS (SELECT res_rsv_artikel_key
                     FROM aads_v_bundel_catering rbc
                     WHERE     rbc.res_rsv_artikel_key = rra.res_rsv_artikel_key
                           AND rbc.res_rsv_artikel_levering < v_date
                           AND res_status_bo_key = 5);

    COMMIT;

  END IF;
  EXCEPTION WHEN OTHERS THEN
      ROLLBACK;
	    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, '');
	    COMMIT;
END;
/

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

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

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

-- @@ &custid