-- Customer specific once-script UWVA#27133.
--
-- (c) 2013 SG|facilitor bv
-- $Revision$
-- $Id$
--
-- Support: +31 53 4800700
SET ECHO ON
SPOOL xuwva#27133.lst
SET DEFINE OFF

CREATE OR REPLACE PROCEDURE fac_select_kto_kandidaten (
   p_applname IN VARCHAR2, p_applrun IN VARCHAR2
)
AS
   -- NIET via de koninklijke route fac.gettrackingdate vanwege enorme performance-killer!

   -- Alle reserveringscatalogi met hun percentage, drempel en het aantal afgemelde reserveringen van de afgelopen periode
   -- tot en met 'gisteren' (dus nog niet die van vandaag), of de afgelopen week als het de eerste keer is
   -- NOOT: Alleen ruimte-reserveringen vooralsnog!
   CURSOR c_cluster_r
   IS
        SELECT   d.ins_discipline_key,
                 d.ins_discipline_ktopercentage perc,
                 COALESCE (d.ins_discipline_ktodrempel, 0) drempel,
                 COUNT (res_rsv_ruimte_key) aantal
          FROM   res_rsv_ruimte rrr,
                 res_ruimte_opstelling ro,
                 res_ruimte rr,
                 ins_tab_discipline d
         WHERE   rrr.res_rsv_ruimte_verwijder IS NULL
         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 = d.ins_discipline_key
         AND     rrr.res_rsv_ruimte_tot > (SELECT COALESCE(MAX(res_rsv_ruimte_kto_verstuurd), SYSDATE-7)
                                            FROM  res_rsv_ruimte irrr,
                                                  res_ruimte_opstelling iro,
                                                  res_ruimte irr
                                            WHERE irrr.res_ruimte_opstel_key = iro.res_ruimte_opstel_key
                                              AND iro.res_ruimte_key = irr.res_ruimte_key
                                              AND irr.res_discipline_key = d.ins_discipline_key)
         AND     rrr.res_rsv_ruimte_tot < SYSDATE
         AND     res_rsv_ruimte_kto_verstuurd IS NULL
         AND     ins_discipline_ktopercentage > 0
      GROUP BY   d.ins_discipline_key,
                 d.ins_discipline_ktopercentage,
                 d.ins_discipline_ktodrempel;


   CURSOR c_lijst_r (
      p_ins_discipline_key NUMBER
   )
   IS
         SELECT  rrr.res_rsv_ruimte_key,
                 SYSDATE ts
         FROM    res_rsv_ruimte rrr,
                 res_ruimte_opstelling ro,
                 res_ruimte rr,
                 res_discipline d,
                 prs_perslid p
         WHERE   rrr.res_rsv_ruimte_verwijder IS NULL
         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 = d.ins_discipline_key
         AND     d.ins_discipline_key = p_ins_discipline_key
         -- Contactpersoon van reservering heeft mail-adres
         AND     rrr.res_rsv_ruimte_contact_key = p.prs_perslid_key
         AND     p.prs_perslid_email IS NOT NULL
         AND     rrr.res_rsv_ruimte_tot > (SELECT COALESCE(MAX(res_rsv_ruimte_kto_verstuurd), SYSDATE-7)
                                            FROM  res_rsv_ruimte irrr,
                                                  res_ruimte_opstelling iro,
                                                  res_ruimte irr
                                            WHERE irrr.res_ruimte_opstel_key = iro.res_ruimte_opstel_key
                                              AND iro.res_ruimte_key = irr.res_ruimte_key
                                              AND irr.res_discipline_key = d.ins_discipline_key)
         AND     rrr.res_rsv_ruimte_tot < SYSDATE
         AND     res_rsv_ruimte_kto_verstuurd IS NULL
         ORDER BY   DBMS_RANDOM.VALUE;

   -- NIET via de koninklijke route fac.gettrackingdate vanwege enorme performance-killer!
   -- Alle vakgroepen met hun percentage, drempel en het aantal afgemelde meldingen van de afgelopen periode
   CURSOR c_cluster_m
   IS
        SELECT   d.ins_discipline_key,
                 d.ins_discipline_ktopercentage perc,
                 COALESCE (d.ins_discipline_ktodrempel, 0) drempel,
                 COUNT (mld_melding_key) aantal
          FROM   mld_melding m,
                 mld_stdmelding std,
                 mld_discipline d,
                 fac_tracking t,
                 fac_srtnotificatie sn
         WHERE   m.mld_stdmelding_key = std.mld_stdmelding_key
           AND   std.mld_ins_discipline_key = d.ins_discipline_key
           -- Afgemelde meldingen van afgelopen periode
           AND   m.mld_melding_key = t.fac_tracking_refkey
                 AND t.fac_srtnotificatie_key = sn.fac_srtnotificatie_key
                 AND sn.fac_srtnotificatie_code = 'MLDAFM'
           AND   t.fac_tracking_datum > (SELECT COALESCE(MAX(mld_melding_kto_verstuurd), SYSDATE-7)
                                           FROM  mld_melding im,
                                                 mld_stdmelding istd
                                          WHERE  im.mld_stdmelding_key = istd.mld_stdmelding_key
                                            AND  istd.mld_ins_discipline_key = d.ins_discipline_key)
           AND   mld_melding_kto_verstuurd IS NULL
           AND   ins_discipline_ktopercentage > 0
      GROUP BY   d.ins_discipline_key,
                 d.ins_discipline_ktopercentage,
                 d.ins_discipline_ktodrempel;

   CURSOR c_lijst_m (
      p_ins_discipline_key                 NUMBER
   )
   IS
        SELECT   m.mld_melding_key,
                 SYSDATE ts
          FROM   mld_melding m,
                 mld_stdmelding std,
                 mld_discipline d,
                 prs_perslid p,
                 fac_tracking t,
                 fac_srtnotificatie sn
         WHERE   m.mld_stdmelding_key = std.mld_stdmelding_key
           AND   std.mld_ins_discipline_key = d.ins_discipline_key
           AND   d.ins_discipline_key = p_ins_discipline_key
           -- Persoon van melding heeft mail-adres
           AND   m.prs_perslid_key = p.prs_perslid_key
           AND   p.prs_perslid_email IS NOT NULL
           AND   m.mld_melding_kto = 1
           -- Afgemelde meldingen van afgelopen periode
           AND   m.mld_melding_key = t.fac_tracking_refkey
           AND   t.fac_srtnotificatie_key = sn.fac_srtnotificatie_key
           AND   sn.fac_srtnotificatie_code = 'MLDAFM'
           AND   t.fac_tracking_datum > (SELECT COALESCE(MAX(mld_melding_kto_verstuurd), SYSDATE-7)
                                           FROM  mld_melding im,
                                                 mld_stdmelding istd
                                          WHERE  im.mld_stdmelding_key = istd.mld_stdmelding_key
                                            AND  istd.mld_ins_discipline_key = d.ins_discipline_key)
           AND   mld_melding_kto_verstuurd IS NULL
      ORDER BY   DBMS_RANDOM.VALUE;

   -- NIET via de koninklijke route fac.gettrackingdate vanwege enorme performance-killer!
   -- Alle bestelcatalogi met hun percentage, drempel en het aantal afgemelde bestellingen van de afgelopen periode
   CURSOR c_cluster_b
   IS
        SELECT   d.ins_discipline_key,
                 d.ins_discipline_ktopercentage perc,
                 COALESCE (d.ins_discipline_ktodrempel, 0) drempel,
                 COUNT (b.bes_bestelling_key) aantal
          FROM   bes_bestelling b,
                 bes_bestelling_item bi,
                 bes_srtdeel sd,
                 bes_srtgroep sg,
                 bes_discipline d,
                 fac_tracking t,
                 fac_srtnotificatie sn
         WHERE   b.bes_bestelling_key = bi.bes_bestelling_key
           AND   bi.bes_srtdeel_key = sd.bes_srtdeel_key
           AND   sd.bes_srtgroep_key = sg.bes_srtgroep_key
           AND   sg.ins_discipline_key = d.ins_discipline_key
           -- Afgemelde bestellingen van afgelopen periode
           AND   b.bes_bestelling_key = t.fac_tracking_refkey
           AND   t.fac_srtnotificatie_key = sn.fac_srtnotificatie_key
           AND   sn.fac_srtnotificatie_code = 'BESOTV'
           AND   t.fac_tracking_datum > (SELECT COALESCE(MAX(bes_bestelling_kto_verstuurd), SYSDATE-7)
                                         FROM  bes_bestelling ib,
                                               bes_bestelling_item ibi,
                                               bes_srtdeel isd,
                                               bes_srtgroep isg
                                         WHERE ib.bes_bestelling_key = ibi.bes_bestelling_key
                                           AND ibi.bes_srtdeel_key = isd.bes_srtdeel_key
                                           AND isd.bes_srtgroep_key = isg.bes_srtgroep_key
                                           AND isg.ins_discipline_key = d.ins_discipline_key)
         AND     bes_bestelling_kto_verstuurd IS NULL
         AND     ins_discipline_ktopercentage > 0
      GROUP BY   d.ins_discipline_key,
                 d.ins_discipline_ktopercentage,
                 d.ins_discipline_ktodrempel;


   CURSOR c_lijst_b (
      p_ins_discipline_key                 NUMBER
   )
   IS
        SELECT   DISTINCT b.bes_bestelling_key,
                 SYSDATE ts
          FROM   bes_bestelling b,
                 bes_bestelling_item bi,
                 bes_srtdeel sd,
                 bes_srtgroep sg,
                 bes_discipline d,
                 prs_perslid p,
                 fac_tracking t,
                 fac_srtnotificatie sn
         WHERE   b.bes_bestelling_key = bi.bes_bestelling_key
           AND   bi.bes_srtdeel_key = sd.bes_srtdeel_key
           AND   sd.bes_srtgroep_key = sg.bes_srtgroep_key
           AND   sg.ins_discipline_key = d.ins_discipline_key
           AND   d.ins_discipline_key = p_ins_discipline_key
           -- Persoon van melding heeft mail-adres
           AND   b.prs_perslid_key = p.prs_perslid_key
           AND   p.prs_perslid_email IS NOT NULL
           -- Afgemelde bestellingen van afgelopen periode
           AND   b.bes_bestelling_key = t.fac_tracking_refkey
           AND   t.fac_srtnotificatie_key = sn.fac_srtnotificatie_key
           AND   sn.fac_srtnotificatie_code = 'BESOTV'
           AND   t.fac_tracking_datum > (SELECT COALESCE(MAX(bes_bestelling_kto_verstuurd), SYSDATE-7)
                                         FROM  bes_bestelling ib,
                                               bes_bestelling_item ibi,
                                               bes_srtdeel isd,
                                               bes_srtgroep isg
                                         WHERE ib.bes_bestelling_key = ibi.bes_bestelling_key
                                           AND ibi.bes_srtdeel_key = isd.bes_srtdeel_key
                                           AND isd.bes_srtgroep_key = isg.bes_srtgroep_key
                                           AND isg.ins_discipline_key = d.ins_discipline_key)
         AND     bes_bestelling_kto_verstuurd IS NULL
      ORDER BY   DBMS_RANDOM.VALUE;

   v_aantal_kto     NUMBER;
   v_count_upd      NUMBER;
   v_count          NUMBER;
   v_errorhint      VARCHAR2(200);
   v_omschrijving   VARCHAR2(4000);
   v_errormsg       VARCHAR (200);
   oracle_err_num   NUMBER;
   oracle_err_mes   VARCHAR2 (200);
BEGIN

   -- KTO's op meldingen
   v_errorhint := 'Doorloop de vakgroepen';
   FOR rec1 IN c_cluster_m
   LOOP
      BEGIN
         IF (rec1.perc <> 0 OR rec1.drempel <> 0) AND rec1.aantal > 0
         THEN
            -- Vakgroep heeft afgemelde meldingen in de voorgaande periode,
            -- en het is een vakgroep waarop KTO van toepassing is (volgens ingesteld percentage en/of een drempel)
            v_aantal_kto := TRUNC ( (rec1.perc * rec1.aantal) / 100);
            IF v_aantal_kto < rec1.drempel
            THEN
               v_aantal_kto := rec1.drempel;
            END IF;

            v_count_upd := 1;

            FOR rec2 IN c_lijst_m (rec1.ins_discipline_key)
            LOOP
               BEGIN
                  IF v_count_upd <= v_aantal_kto
                  THEN
                     v_errorhint := 'Toevoegen meldingen kto-notificatie';
                     UPDATE mld_melding
                        SET mld_melding_kto_verstuurd = rec2.ts
                      WHERE mld_melding_key = rec2.mld_melding_key;
                     fac.trackaction('MLDKTO', rec2.mld_melding_key, NULL, rec2.ts, NULL);
                  END IF;
                  v_count_upd := v_count_upd + 1;
               EXCEPTION
                  WHEN OTHERS
                  THEN
                     oracle_err_num := SQLCODE;
                     oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
                     v_errormsg := 'Exception ' || oracle_err_mes;
                     fac.writelog (
                        p_applname,
                        'W',
                        v_errormsg,
                        'Aanmaken Melding KTO: ' || rec2.mld_melding_key
                     );
                     COMMIT;
               END;
            END LOOP;
         END IF;
      END;
   END LOOP;

   -- KTO's op reserveringen
   v_errorhint := 'Doorloop de reserveerbare ruimtecatalogi';
   FOR rec1 IN c_cluster_r
   LOOP
      BEGIN
         IF (rec1.perc <> 0 OR rec1.drempel <> 0) AND rec1.aantal > 0
         THEN
            -- Ruimtecatalogus heeft reserveringen die in de voorgaande periode zijn beeindigd
            -- en het is een catalogus waarop KTO van toepassing is (volgens ingesteld percentage en/of een drempel)
            v_aantal_kto := TRUNC ( (rec1.perc * rec1.aantal) / 100);
            IF v_aantal_kto < rec1.drempel
            THEN
               v_aantal_kto := rec1.drempel;
            END IF;

            v_count_upd := 1;

            FOR rec2 IN c_lijst_r (rec1.ins_discipline_key)
            LOOP
               BEGIN
                  IF v_count_upd <= v_aantal_kto
                  THEN
                     v_errorhint := 'Toevoegen reserveringen kto-notificatie';
                     UPDATE res_rsv_ruimte
                        SET res_rsv_ruimte_kto_verstuurd = rec2.ts
                      WHERE res_rsv_ruimte_key = rec2.res_rsv_ruimte_key;
                     fac.trackaction('RESKTO', rec2.res_rsv_ruimte_key, NULL, rec2.ts, NULL);
                  END IF;
                  v_count_upd := v_count_upd + 1;
               EXCEPTION
                  WHEN OTHERS
                  THEN
                     oracle_err_num := SQLCODE;
                     oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
                     v_errormsg := 'Exception ' || oracle_err_mes;
                     fac.writelog (
                        p_applname,
                        'W',
                        v_errormsg,
                        'Aanmaken Reservering KTO: ' || rec2.res_rsv_ruimte_key
                     );
                     COMMIT;
               END;
            END LOOP;
         END IF;
      END;
   END LOOP;

   -- KTO's op bestellingen
   v_errorhint := 'Doorloop de bestelcatalogi';
   FOR rec1 IN c_cluster_b
   LOOP
      BEGIN
         IF (rec1.perc <> 0 OR rec1.drempel <> 0) AND rec1.aantal > 0
         THEN
            -- Bestelcatalogus heeft geleverde bestellingen in de voorgaande periode,
            -- en het is een catalogus waarop KTO van toepassing is (volgens ingesteld percentage en/of een drempel)
            v_aantal_kto := TRUNC ( (rec1.perc * rec1.aantal) / 100);
            IF v_aantal_kto < rec1.drempel
            THEN
               v_aantal_kto := rec1.drempel;
            END IF;

            v_count_upd := 1;

            FOR rec2 IN c_lijst_b (rec1.ins_discipline_key)
            LOOP
               BEGIN
                  IF v_count_upd <= v_aantal_kto
                  THEN
                     v_errorhint := 'Toevoegen bestellingen kto-notificatie';
                     UPDATE bes_bestelling
                        SET bes_bestelling_kto_verstuurd = rec2.ts
                      WHERE bes_bestelling_key = rec2.bes_bestelling_key;
                     fac.trackaction('BESKTO', rec2.bes_bestelling_key, NULL, rec2.ts, NULL);
                  END IF;
                  v_count_upd := v_count_upd + 1;
               EXCEPTION
                  WHEN OTHERS
                  THEN
                     oracle_err_num := SQLCODE;
                     oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
                     v_errormsg := 'Exception ' || oracle_err_mes;
                     fac.writelog (
                        p_applname,
                        'W',
                        v_errormsg,
                        'Aanmaken Bestelling KTO: ' || rec2.bes_bestelling_key
                     );
                     COMMIT;
               END;
            END LOOP;
         END IF;
      END;
   END LOOP;
END;
/

COMMIT;

BEGIN adm.systrackscript('$Workfile: uwva#27133.sql $', '$Revision$', 1); END;
/
COMMIT;
SPOOL OFF
