SET ECHO ON
SPOOL zomertijd.lst
SET DEFINE OFF;

DECLARE
   v_errormsg       VARCHAR2 (1000);
   v_errorhint      VARCHAR2 (1000);
   oracle_err_num   NUMBER;
   oracle_err_mes   VARCHAR2 (200);
   v_logmsg         VARCHAR2 (50);

   CURSOR c
   IS
      SELECT res_rsv_ruimte_key,
             res_rsv_ruimte_van,
             van_new,
             res_rsv_ruimte_tot,
             tot_new
        FROM (SELECT res_rsv_ruimte_key,
                     res_rsv_ruimte_van,
                     CAST (
                        (FROM_TZ (
                            CAST (res_rsv_ruimte_van - 1 / 24 AS TIMESTAMP),
                            '+00:00') AT TIME ZONE 'Europe/Amsterdam') AS DATE)
                        van_new,
                     res_rsv_ruimte_tot,
                     CAST (
                        (FROM_TZ (
                            CAST (res_rsv_ruimte_tot - 1 / 24 AS TIMESTAMP),
                            '+00:00') AT TIME ZONE 'Europe/Amsterdam') AS DATE)
                        tot_new
                FROM res_rsv_ruimte
               WHERE res_rsv_ruimte_verwijder IS NULL
                     AND res_rsv_ruimte_externnr IS NOT NULL)
       WHERE van_new != res_rsv_ruimte_van;
BEGIN
   FOR rec IN c
   LOOP
      BEGIN
         v_logmsg :=
               'Tijd aangepast: '
            || TO_CHAR (rec.res_rsv_ruimte_van, 'HH24:MI')
            || '-'
            || TO_CHAR (rec.res_rsv_ruimte_tot, 'HH24:MI')
            || ' --> '
            || TO_CHAR (rec.van_new, 'HH24:MI')
            || '-'
            || TO_CHAR (rec.tot_new, 'HH24:MI');

         v_errorhint := 'res_rsv_ruimte';
         UPDATE res_rsv_ruimte
            SET res_rsv_ruimte_van = rec.van_new,
                res_rsv_ruimte_tot = rec.tot_new
          WHERE res_rsv_ruimte_key = rec.res_rsv_ruimte_key;

         -- Artikelen alleen aanpassen als levertijd = starttijd (anders is die tijd expliciet gekozen)
         v_errorhint := 'res_rsv_artikel';
         UPDATE res_rsv_artikel
            SET res_rsv_artikel_levering =
                   CASE
                      WHEN res_rsv_artikel_levering = rec.res_rsv_ruimte_van
                      THEN
                         rec.van_new
                      ELSE
                         res_rsv_artikel_levering
                   END
          WHERE res_rsv_ruimte_key = rec.res_rsv_ruimte_key;

         v_errorhint := 'res_rsv_deel';
         UPDATE res_rsv_deel
            SET res_rsv_deel_van =
                   CAST (
                      (FROM_TZ (
                          CAST (res_rsv_deel_van - 1 / 24 AS TIMESTAMP),
                          '+00:00') AT TIME ZONE 'Europe/Amsterdam') AS DATE),
                res_rsv_deel_tot =
                   CAST (
                      (FROM_TZ (
                          CAST (res_rsv_deel_tot - 1 / 24 AS TIMESTAMP),
                          '+00:00') AT TIME ZONE 'Europe/Amsterdam') AS DATE)
          WHERE res_rsv_ruimte_key = rec.res_rsv_ruimte_key;

         v_errorhint := 'bez_afspraak';
         UPDATE bez_afspraak
            SET bez_afspraak_datum =
                   CAST (
                      (FROM_TZ (
                          CAST (bez_afspraak_datum - 1 / 24 AS TIMESTAMP),
                          '+00:00') AT TIME ZONE 'Europe/Amsterdam') AS DATE),
                bez_afspraak_eind =
                   CAST (
                      (FROM_TZ (
                          CAST (bez_afspraak_eind - 1 / 24 AS TIMESTAMP),
                          '+00:00') AT TIME ZONE 'Europe/Amsterdam') AS DATE)
          WHERE res_rsv_ruimte_key = rec.res_rsv_ruimte_key;

         v_errorhint := 'tracking';
         fac.trackaction ('RESUPD',
                          rec.res_rsv_ruimte_key,
                          NULL,
                          SYSDATE,
                          v_logmsg);
      EXCEPTION
         WHEN OTHERS
         THEN
            oracle_err_num := SQLCODE;
            oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
            v_errormsg :=
                  'OTHERS (error '
               || oracle_err_num
               || '/'
               || oracle_err_mes
               || ')';

            fac.writelog ('ZOMERTIJD',
                          'E',
                          rec.res_rsv_ruimte_key || ': ' || v_errorhint,
                          v_errormsg);
      END;
   END LOOP;
END;
/

SELECT COUNT(*) FROM imp_log
 WHERE imp_log_applicatie = 'ZOMERTIJD';

BEGIN
   adm.systrackscriptId ('zomertijd.sql', 0);
END;
/

COMMIT;
SPOOL OFF