--
-- $Id$
--
-- Customer specific once-script DJIN#88086.sql.
DEFINE thisfile = 'DJIN#88086.sql'
DEFINE dbuser   = '^FMD'

SET ECHO ON
SET DEFINE ON
COLUMN fcltlogfile NEW_VALUE fcltlogfile NOPRINT;
COLUMN fcltcusterr NEW_VALUE fcltcusterr NOPRINT;
WHENEVER SQLERROR CONTINUE;
SELECT adm.getscriptspoolfile('&thisfile') AS fcltlogfile FROM DUAL;
SPOOL &fcltlogfile
WHENEVER SQLERROR EXIT;
SELECT adm.checkscriptcust('&dbuser') AS fcltcusterr FROM DUAL;
WHENEVER SQLERROR CONTINUE;
PROMPT &fcltcusterr
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 over alle open bestelopdracht-items aangemaakt voor 01-01-2024
   -- en gemarkeerd als 'Wachten op leverancier'; deze worden op 0 gesteld (of
   -- naar zover deelgeleverd) en op geleverd gezet!
   FOR rc
      IN (SELECT DISTINCT bo.bes_bestelopdr_key
            FROM bes_bestelopdr bo,
                 bes_bestelopdr_item boi,
                 bes_bestelling_item bi,
                 bes_bestelling b
           WHERE bo.bes_bestelopdr_status = 4                 -- In bestelling
                 AND bo.bes_bestelopdr_flag = 3      -- Wachten op leverancier
                 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 b.bes_bestelling_datum < TO_DATE ('01-01-2024', 'dd-mm-yyyy'))
   LOOP
      BEGIN
         v_errormsg := 'Leveren bestelopdr ' || TO_CHAR (rc.bes_bestelopdr_key);

         -- Verlaag wat besteld is naar wat deelgeleverd is (als er niets is
         -- deelgeleverd, dan wordt de bestelopdracht dus op 0 gesteld).
         UPDATE bes_bestelopdr_item
            SET bes_bestelopdr_item_aantal = COALESCE (bes_bestelopdr_item_aantalontv, 0)
          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 (besteld=ontvangen)');
   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
           WHERE b.bes_bestelling_status = 5                        -- Besteld
                 AND NOT EXISTS -- Geen onderliggende bestelopdracht(en) niet op Geleverd, dus alles Geleverd (aantalontv = aantal)!
                        (SELECT 1
                           FROM bes_bestelling_item  bi,
                                bes_bestelopdr_item  boi,
                                bes_bestelopdr bo
                          WHERE bi.bes_bestelopdr_item_key = boi.bes_bestelopdr_item_key
                                AND boi.bes_bestelopdr_key = bo.bes_bestelopdr_key
                                AND bo.bes_bestelopdr_status != 6  -- Geleverd
                                AND bi.bes_bestelling_key = b.bes_bestelling_key))
   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 (aantallen ongewijzigd)');
   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
