--
-- $Id$
--
-- Alle bestellingen/bestelopdrachten met een afleverdatum t/m 28-02-2019 naar
-- Geleverd op 01-03-2019!
DEFINE thisfile = 'KFSG#51990.SQL'
DEFINE dbuser   = '^KFSG'

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

SET SERVEROUTPUT ON size 1000000;

DECLARE
   v_errormsg       VARCHAR2 (1000);
   oracle_err_num   NUMBER;
   oracle_err_mes   VARCHAR2 (200);
   v_count          NUMBER;
BEGIN
   v_count := 0;

   -- Cursor loopt over alle bestelopdracht-items met status 'In bestelling' en
   -- afleverdatum < 01-03-2019; deze worden verondersteld te zijn geleverd!
   FOR rc
      IN (SELECT DISTINCT bo.bes_bestelopdr_key
            FROM bes_bestelopdr bo,
                 bes_bestelopdr_item boi,
                 bes_bestelling_item bi,
                 bes_bestelling b,
                 bes_srtdeel sd,
                 bes_srtgroep sg
           WHERE bo.bes_bestelopdr_status = 4                 -- In bestelling
                 AND bo.bes_bestelopdr_key = boi.bes_bestelopdr_key
                 AND boi.bes_bestelopdr_item_key = bi.bes_bestelopdr_item_key
                 AND bi.bes_bestelling_key = b.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 = -1
                 AND b.bes_bestelling_leverdatum < TO_DATE ('01-03-2019', 'dd-mm-yyyy'))
   LOOP
      BEGIN
         v_errormsg := 'Leveren bestelopdr ' || TO_CHAR (rc.bes_bestelopdr_key);

         -- Zeg dat alles geleverd is wat besteld is.
         UPDATE bes_bestelopdr_item
            SET bes_bestelopdr_item_aantalontv = bes_bestelopdr_item_aantal
          WHERE bes_bestelopdr_key = rc.bes_bestelopdr_key;

         bes.updatebestelopdrstatus (rc.bes_bestelopdr_key, NULL);
         v_count := v_count + 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 || ')';
            DBMS_OUTPUT.PUT_LINE ('W: ' || v_errormsg);
            COMMIT;
      END;
   END LOOP;

   DBMS_OUTPUT.PUT_LINE ('S: ' || TO_CHAR (v_count) || ' bestelopdrachten geleverd');
   COMMIT;

   v_count := 0;

   -- Cursor loopt over alle bestelling-items met status 'Besteld' waarvan
   -- de bijbehorende bestelopdracht-items zijn geleverd; deze worden dan ook
   -- gesloten!
   FOR rc
      IN (SELECT DISTINCT b.bes_bestelling_key
            FROM bes_bestelling b,
                 bes_bestelling_item bi,
                 bes_bestelopdr_item boi
           WHERE b.bes_bestelling_status = 5                        -- Besteld
                 AND b.bes_bestelling_key = bi.bes_bestelling_key
                 --AND bi.bes_bestelling_item_aantal != COALESCE (bi.bes_bestelling_item_aantalontv, 0)
                 AND bi.bes_bestelopdr_item_key = boi.bes_bestelopdr_item_key
                 AND boi.bes_bestelopdr_item_aantal = boi.bes_bestelopdr_item_aantalontv)
   LOOP
      BEGIN
         v_errormsg := 'Leveren bestelling ' || TO_CHAR (rc.bes_bestelling_key);

         -- Sluit alle aanvraagregels af die nu geheel geleverd zijn.
         UPDATE bes_bestelling_item
            SET bes_bestelling_item_aantalontv = bes_bestelling_item_aantal
          WHERE bes_bestelling_key = rc.bes_bestelling_key;

         bes.updatebestellingstatus (rc.bes_bestelling_key, NULL);
         v_count := v_count + 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 || ')';
            DBMS_OUTPUT.PUT_LINE ('W: ' || v_errormsg);
            COMMIT;
      END;
   END LOOP;

   DBMS_OUTPUT.PUT_LINE ('S: ' || TO_CHAR (v_count) || ' bestellingen geleverd');
   COMMIT;
END;
/

UPDATE fac_tracking t
   SET t.fac_tracking_datum = TO_DATE ('01-03-2019' , 'dd-mm-yyyy')
 WHERE t.fac_tracking_datum > TRUNC (SYSDATE)
       AND EXISTS
             (SELECT 1
                FROM fac_srtnotificatie
               WHERE (fac_srtnotificatie_xmlnode = 'bestelling' OR fac_srtnotificatie_xmlnode = 'bestelopdr')
                     AND fac_srtnotificatie_key = t.fac_srtnotificatie_key);
COMMIT;

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