-- Customer specific once-script.
--
-- (c) 2014 Facilitor bv
SET ECHO ON
SPOOL xuwva#31062.lst
SET DEFINE OFF

--UWVA#31062: MARKORDERASSENT moet vier parameters hebben
-- Als losse patch opgeleverd omdat uwva_misc ondertussen al te veel andere wijzigingen heeft

CREATE OR REPLACE PACKAGE uwva
AS
   FUNCTION bepaal_iss_doorlooptijd (van_date IN DATE, tot_date IN DATE)
      RETURN NUMBER;

   FUNCTION bepaal_uwv_doorlooptijd (van_date IN DATE, tot_date IN DATE)
      RETURN NUMBER;

   PROCEDURE markorderassent (pxmlnode VARCHAR2, pkey NUMBER, presult NUMBER, presulttext VARCHAR2);

   PROCEDURE format_telefoonnummers (p_import_key IN NUMBER);

   PROCEDURE abo_verhuisd (p_import_key   NUMBER,
                           p_perslid_key  NUMBER,
                           p_locatie_key  NUMBER);
END uwva;
/

CREATE OR REPLACE PACKAGE BODY uwva
AS
   FUNCTION bepaal_iss_doorlooptijd (van_date IN DATE, tot_date IN DATE)
      RETURN NUMBER
   IS
      c_kt_van      NUMBER := 8;
      c_kt_tot      NUMBER := 17;
      v_dl          NUMBER;
      lbackwards    BOOLEAN;
      v_van_date    DATE;
      v_van_uur     NUMBER;
      v_tot_date    DATE;
      v_tot_uur     NUMBER;
      v_loop_date   DATE;
      v_count       NUMBER;
   BEGIN
      v_dl := 0;

      IF (van_date > tot_date)
      THEN
         v_van_date := TO_DATE (TO_CHAR (tot_date, 'yyyymmddhh24mi'), 'yyyymmddhh24mi');
         v_tot_date := TO_DATE (TO_CHAR (van_date, 'yyyymmddhh24mi'), 'yyyymmddhh24mi');
         lbackwards := TRUE;
      ELSE
         v_van_date := TO_DATE (TO_CHAR (van_date, 'yyyymmddhh24mi'), 'yyyymmddhh24mi');
         v_tot_date := TO_DATE (TO_CHAR (tot_date, 'yyyymmddhh24mi'), 'yyyymmddhh24mi');
         lbackwards := FALSE;
      END IF;

      IF ( ( ( (v_van_date - TRUNC (v_van_date)) * 24) - c_kt_van) < 0)
      THEN
         v_van_uur := c_kt_van;
      ELSE
         IF ( ( ( (v_van_date - TRUNC (v_van_date)) * 24) - c_kt_tot) < 0)
         THEN
            v_van_uur := (v_van_date - TRUNC (v_van_date)) * 24;
         ELSE
            v_van_uur := c_kt_tot;
         END IF;
      END IF;

      IF ( ( ( (v_tot_date - TRUNC (v_tot_date)) * 24) - c_kt_van) < 0)
      THEN
         v_tot_uur := c_kt_van;
      ELSE
         IF ( ( ( (v_tot_date - TRUNC (v_tot_date)) * 24) - c_kt_tot) < 0)
         THEN
            v_tot_uur := (v_tot_date - TRUNC (v_tot_date)) * 24;
         ELSE
            v_tot_uur := c_kt_tot;
         END IF;
      END IF;

      v_loop_date := TRUNC (v_van_date);

      WHILE (v_loop_date <= v_tot_date)
      LOOP
         SELECT   COUNT ( * )
           INTO   v_count
           FROM   mld_vrije_dagen
          WHERE   mld_vrije_dagen_datum = v_loop_date;

         IF (v_count = 0 AND TO_CHAR (v_loop_date, 'd') NOT IN ('1', '7'))
         THEN
            CASE
               WHEN TRUNC (v_van_date) = TRUNC (v_tot_date)
               THEN
                  v_dl := v_dl + (v_tot_uur - v_van_uur);
               WHEN v_loop_date = TRUNC (v_van_date)
               THEN
                  v_dl := v_dl + (c_kt_tot - v_van_uur);
               WHEN v_loop_date = TRUNC (v_tot_date)
               THEN
                  v_dl := v_dl + (v_tot_uur - c_kt_van);
               ELSE
                  v_dl := v_dl + (c_kt_tot - c_kt_van);
            END CASE;
         END IF;

         v_loop_date := v_loop_date + 1;
      END LOOP;

      IF lbackwards
      THEN
         RETURN 0 - v_dl;
      ELSE
         RETURN v_dl;
      END IF;
   END;

   -- UWVA#25539: Nu nog klantspecifiek, maar zou in 5.3.1 standaard mogen
   --             worden.
   -- Toch niet (mmm), want UWV heeft een verschillende berekening voor en
   -- na 01-03-2013!
   -- En per UWVA#27868 nog een volgende grens, nl. voor en na 01-11-2013!
   FUNCTION bepaal_uwv_doorlooptijd (van_date IN DATE, tot_date IN DATE)
      RETURN NUMBER
   IS
      c_kt_van_v1311   NUMBER := 7;            -- De van-tijd voor 01-11-2013!
      c_kt_tot_v1311   NUMBER := 19;           -- De tot-tijd voor 01-11-2013!
      c_kt_van_v1303   NUMBER := 8;            -- De van-tijd voor 01-03-2013!
      c_kt_tot_v1303   NUMBER := 17;           -- De tot-tijd voor 01-03-2013!
      v_kt_van         NUMBER;
      v_kt_tot         NUMBER;
      v_dl             NUMBER;
      lbackwards       BOOLEAN;
      v_van_date       DATE;
      v_van_uur        NUMBER;
      v_tot_date       DATE;
      v_tot_uur        NUMBER;
      v_loop_date      DATE;
      v_count          NUMBER;
   BEGIN
      v_dl := 0;

      -- Bepaal 'Start time of working day' (21=fac_t_startofworkday)!
      v_kt_van := fac.safe_to_number (fac.getsetting ('fac_t_startofworkday'));

      -- Bepaal 'End time of working day' (22=fac_t_endofworkday)!
      v_kt_van := fac.safe_to_number (fac.getsetting ('fac_t_endofworkday'));

      IF (van_date > tot_date)
      THEN
         v_van_date :=
            TO_DATE (TO_CHAR (tot_date, 'yyyymmddhh24mi'), 'yyyymmddhh24mi');
         v_tot_date :=
            TO_DATE (TO_CHAR (van_date, 'yyyymmddhh24mi'), 'yyyymmddhh24mi');
         lbackwards := TRUE;
      ELSE
         v_van_date :=
            TO_DATE (TO_CHAR (van_date, 'yyyymmddhh24mi'), 'yyyymmddhh24mi');
         v_tot_date :=
            TO_DATE (TO_CHAR (tot_date, 'yyyymmddhh24mi'), 'yyyymmddhh24mi');
         lbackwards := FALSE;
      END IF;

      v_loop_date := TRUNC (v_van_date);

      WHILE (v_loop_date <= v_tot_date)
      LOOP
         SELECT   COUNT ( * )
           INTO   v_count
           FROM   mld_vrije_dagen
          WHERE   mld_vrije_dagen_datum = v_loop_date;

         IF (v_count = 0 AND TO_CHAR (v_loop_date, 'd') NOT IN ('1', '7'))
         THEN
            IF (v_loop_date >= TO_DATE ('01-11-2013', 'dd-mm-yyyy'))
            THEN                                    -- Settings-kantoortijden!
               IF ( ( ( (v_van_date - TRUNC (v_van_date)) * 24) - v_kt_van) <
                      0)
               THEN
                  v_van_uur := v_kt_van;
               ELSE
                  IF ( ( ( (v_van_date - TRUNC (v_van_date)) * 24) - v_kt_tot) <
                         0)
                  THEN
                     v_van_uur := (v_van_date - TRUNC (v_van_date)) * 24;
                  ELSE
                     v_van_uur := v_kt_tot;
                  END IF;
               END IF;

               IF ( ( ( (v_tot_date - TRUNC (v_tot_date)) * 24) - v_kt_van) <
                      0)
               THEN
                  v_tot_uur := v_kt_van;
               ELSE
                  IF ( ( ( (v_tot_date - TRUNC (v_tot_date)) * 24) - v_kt_tot) <
                         0)
                  THEN
                     v_tot_uur := (v_tot_date - TRUNC (v_tot_date)) * 24;
                  ELSE
                     v_tot_uur := v_kt_tot;
                  END IF;
               END IF;

               CASE
                  WHEN TRUNC (v_van_date) = TRUNC (v_tot_date)
                  THEN
                     v_dl := v_dl + (v_tot_uur - v_van_uur);
                  WHEN v_loop_date = TRUNC (v_van_date)
                  THEN
                     v_dl := v_dl + (v_kt_tot - v_van_uur);
                  WHEN v_loop_date = TRUNC (v_tot_date)
                  THEN
                     v_dl := v_dl + (v_tot_uur - v_kt_van);
                  ELSE
                     v_dl := v_dl + (v_kt_tot - v_kt_van);
               END CASE;
            ELSIF (v_loop_date >= TO_DATE ('01-03-2013', 'dd-mm-yyyy'))
            THEN                     --  Oude setings: 7-tot-19-kantoortijden!
               IF ( ( ( (v_van_date - TRUNC (v_van_date)) * 24)
                     - c_kt_van_v1311) < 0)
               THEN
                  v_van_uur := c_kt_van_v1311;
               ELSE
                  IF ( ( ( (v_van_date - TRUNC (v_van_date)) * 24)
                        - c_kt_tot_v1311) < 0)
                  THEN
                     v_van_uur := (v_van_date - TRUNC (v_van_date)) * 24;
                  ELSE
                     v_van_uur := c_kt_tot_v1311;
                  END IF;
               END IF;

               IF ( ( ( (v_tot_date - TRUNC (v_tot_date)) * 24)
                     - c_kt_van_v1311) < 0)
               THEN
                  v_tot_uur := c_kt_van_v1311;
               ELSE
                  IF ( ( ( (v_tot_date - TRUNC (v_tot_date)) * 24)
                        - c_kt_tot_v1311) < 0)
                  THEN
                     v_tot_uur := (v_tot_date - TRUNC (v_tot_date)) * 24;
                  ELSE
                     v_tot_uur := c_kt_tot_v1311;
                  END IF;
               END IF;

               CASE
                  WHEN TRUNC (v_van_date) = TRUNC (v_tot_date)
                  THEN
                     v_dl := v_dl + (v_tot_uur - v_van_uur);
                  WHEN v_loop_date = TRUNC (v_van_date)
                  THEN
                     v_dl := v_dl + (c_kt_tot_v1311 - v_van_uur);
                  WHEN v_loop_date = TRUNC (v_tot_date)
                  THEN
                     v_dl := v_dl + (v_tot_uur - c_kt_van_v1311);
                  ELSE
                     v_dl := v_dl + (c_kt_tot_v1311 - c_kt_van_v1311);
               END CASE;
            ELSE               --  Nog oudere setings: 8-tot-17-kantoortijden!
               IF ( ( ( (v_van_date - TRUNC (v_van_date)) * 24)
                     - c_kt_van_v1303) < 0)
               THEN
                  v_van_uur := c_kt_van_v1303;
               ELSE
                  IF ( ( ( (v_van_date - TRUNC (v_van_date)) * 24)
                        - c_kt_tot_v1303) < 0)
                  THEN
                     v_van_uur := (v_van_date - TRUNC (v_van_date)) * 24;
                  ELSE
                     v_van_uur := c_kt_tot_v1303;
                  END IF;
               END IF;

               IF ( ( ( (v_tot_date - TRUNC (v_tot_date)) * 24)
                     - c_kt_van_v1303) < 0)
               THEN
                  v_tot_uur := c_kt_van_v1303;
               ELSE
                  IF ( ( ( (v_tot_date - TRUNC (v_tot_date)) * 24)
                        - c_kt_tot_v1303) < 0)
                  THEN
                     v_tot_uur := (v_tot_date - TRUNC (v_tot_date)) * 24;
                  ELSE
                     v_tot_uur := c_kt_tot_v1303;
                  END IF;
               END IF;

               CASE
                  WHEN TRUNC (v_van_date) = TRUNC (v_tot_date)
                  THEN
                     v_dl := v_dl + (v_tot_uur - v_van_uur);
                  WHEN v_loop_date = TRUNC (v_van_date)
                  THEN
                     v_dl := v_dl + (c_kt_tot_v1303 - v_van_uur);
                  WHEN v_loop_date = TRUNC (v_tot_date)
                  THEN
                     v_dl := v_dl + (v_tot_uur - c_kt_van_v1303);
                  ELSE
                     v_dl := v_dl + (c_kt_tot_v1303 - c_kt_van_v1303);
               END CASE;
            END IF;
         END IF;

         v_loop_date := v_loop_date + 1;
      END LOOP;

      IF lbackwards
      THEN
         RETURN 0 - v_dl;
      ELSE
         RETURN v_dl;
      END IF;
   END;

   -- MarkOrderAsSent
   -- Markeert dat een opdracht is verzonden, zoals door PutOrders.exe.
   -- Hoe dat moet hangt af van het soort opdracht: contract, opdracht e.d.
   -- pxmlnode is (lowercase!) de xml-naam van de entiteit (contract, opdracht,
   --  bestelopdr of iets klantspecifieks zoals ooit 'folder').
   -- pkey is de key daarvan.
   -- presult geeft het succes van verzending aan: 0(/2)=succesvol, 1=geweigerd
   --  wat gebruikt *kan* worden bij het bepalen van een te zetten status.
   -- Voor customer-orderqueues dient overeenkomstige CUST.markorderassent() te
   -- worden gedefinieerd.
   PROCEDURE markorderassent (pxmlnode VARCHAR2, pkey NUMBER, presult NUMBER, presulttext VARCHAR2)
   AS
      v_count   NUMBER;
   BEGIN
      CASE pxmlnode
         WHEN 'contract'
         THEN
            IF presult = 0 or presult = 2
            THEN
               SELECT   COUNT ( * )
                 INTO   v_count
                 FROM   cnt_kenmerkcontract
                WHERE       cnt_contract_key = pkey
                        AND cnt_kenmerk_key = 700     -- 'Laatste cXML-update'
                        AND cnt_kenmerkcontract_verwijder IS NULL;

               IF (v_count = 0)
               THEN
                  INSERT INTO cnt_kenmerkcontract (
                                                      cnt_contract_key,
                                                      cnt_kenmerk_key,
                                                      cnt_kenmerkcontract_waarde
                             )
                    VALUES   (pkey,
                              700,                    -- 'Laatste cXML-update'
                              TO_CHAR (SYSDATE, 'dd-mm-yyyy'));
               ELSE
                  UPDATE   cnt_kenmerkcontract
                     SET   cnt_kenmerkcontract_waarde =
                              TO_CHAR (SYSDATE, 'dd-mm-yyyy'),
                           cnt_kenmerkcontract_wijzig = SYSDATE
                   WHERE       cnt_contract_key = pkey
                           AND cnt_kenmerk_key = 700  -- 'Laatste cXML-update'
                           AND cnt_kenmerkcontract_verwijder IS NULL;
               END IF;
            END IF;
      END CASE;
   END;

   -- UWVA#20205 en UWVA#20219: Procedure om telefoonnummers netjes op te maken.
   -- Wordt aangeroepen aan het einde van uwva_update_abs().
   --
   -- Voor een specificatie van de opmaak, zie UWVA#20205.
   -- FSN#23352: (sub)query's opschonen
   PROCEDURE format_telefoonnummers (p_import_key IN NUMBER)
   AS
     v_fac_usrtab_key  NUMBER;
     c_faxnr_key       NUMBER (10)        := 7;

   BEGIN
      -- Eigen Tabel met alle netnummers, om netnummers in telefoonnummers-zonder-opmaak
      -- te kunnen achterhalen.
      SELECT fac_usrtab_key
        INTO v_fac_usrtab_key
        FROM fac_usrtab
       WHERE fac_usrtab_naam = 'netnummers';

      -- UWVA#21779: Door een foutieve trigger (FSN#21781) bestaan er prs_kenmerklinks waarvan de
      --             prs_perslid verwijderd is. Deze prs_kenmerklinks mogen (moeten) verwijderd.
      DELETE FROM prs_kenmerklink
       WHERE prs_kenmerklink_niveau = 'P'
         AND NOT EXISTS (SELECT 1
                           FROM prs_perslid
                          WHERE prs_perslid_key = prs_link_key);

      --
      -- TELEFOONNUMMER --------------------------------------------------------------
      --
      -- Verwijder landinformatie (alleen van Nederlandse nummers; buitenlandse
      -- worden helaas verminkt!)
      UPDATE prs_perslid SET prs_perslid_telefoonnr = SUBSTR (prs_perslid_telefoonnr, 2) WHERE prs_perslid_telefoonnr LIKE '+%';
      UPDATE prs_perslid SET prs_perslid_telefoonnr = SUBSTR (prs_perslid_telefoonnr, 3) WHERE prs_perslid_telefoonnr LIKE '31%';
      UPDATE prs_perslid SET prs_perslid_telefoonnr = SUBSTR (prs_perslid_telefoonnr, 5) WHERE prs_perslid_telefoonnr LIKE '0031%';

      -- Verwijder non-digit tekens (leestekens en spaties)
      UPDATE prs_perslid
         SET prs_perslid_telefoonnr = REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(prs_perslid_telefoonnr,
                        '.', ''),
                        '(', ''),
                        ')', ''),
                        '-', ''),
                        ' ', '');
      UPDATE prs_perslid SET prs_perslid_telefoonnr = '20' || prs_perslid_telefoonnr     WHERE prs_perslid_telefoonnr LIKE '687____';
      UPDATE prs_perslid SET prs_perslid_telefoonnr = SUBSTR (prs_perslid_telefoonnr, 2) WHERE prs_perslid_telefoonnr LIKE '0%';

      -- 06-nummers bijwerken
      -- (NB: format "06 - xx xx xx xx" is 16 digits, dus gebruik ik
      --  "06-xx xx xx xx", om het binnen de 15 karakters te houden.)
      UPDATE prs_perslid
         SET prs_perslid_telefoonnr =    SUBSTR( TRIM( '0' || SUBSTR (prs_perslid_telefoonnr, 1, 1) || '-'
                     || SUBSTR (prs_perslid_telefoonnr, 2, 2)
                     || ' '
                     || SUBSTR (prs_perslid_telefoonnr, 4, 2)
                     || ' '
                     || SUBSTR (prs_perslid_telefoonnr, 6, 2)
                     || ' '
                     || SUBSTR (prs_perslid_telefoonnr, 8, 2) ), 1, 15)
       WHERE prs_perslid_telefoonnr LIKE '6%'
         AND prs_perslid_telefoonnr IS NOT NULL
         AND LENGTH(prs_perslid_telefoonnr) > 5;

      -- 0800- en 0900-nummers met een even aantal digits
      -- (NB: MOD(prs_perslid_telefoonnr, 2) = 1, omdat prs_perslid_telefoonnr begint met 900 ipv 0900!)
      UPDATE prs_perslid
         SET prs_perslid_telefoonnr =    SUBSTR( TRIM( '0' || SUBSTR (prs_perslid_telefoonnr, 1, 3) || ' - '
                     || SUBSTR (prs_perslid_telefoonnr, 4, 2)
                     || ' '
                     || SUBSTR (prs_perslid_telefoonnr, 6, 2)
                     || ' '
                     || SUBSTR (prs_perslid_telefoonnr, 8, 2) ), 1, 15)
       WHERE prs_perslid_telefoonnr IS NOT NULL
         AND LENGTH(prs_perslid_telefoonnr) > 5
         AND MOD( LENGTH(prs_perslid_telefoonnr), 2) = 1
         AND (   prs_perslid_telefoonnr LIKE '800%'
              OR prs_perslid_telefoonnr LIKE '900%');

      -- 0800- en 0900-nummers met een oneven aantal digits
      UPDATE prs_perslid
         SET prs_perslid_telefoonnr =    SUBSTR( TRIM('0' || SUBSTR (prs_perslid_telefoonnr, 1, 3) || '-'
                     || SUBSTR (prs_perslid_telefoonnr, 4, 3)
                     || ' '
                     || SUBSTR (prs_perslid_telefoonnr, 7, 2)
                     || ' '
                     || SUBSTR (prs_perslid_telefoonnr, 9, 2)) , 1, 15)
       WHERE prs_perslid_telefoonnr IS NOT NULL
         AND LENGTH(prs_perslid_telefoonnr) > 5
         AND MOD( LENGTH(prs_perslid_telefoonnr), 2) = 0
         AND (   prs_perslid_telefoonnr LIKE '800%'
              OR prs_perslid_telefoonnr LIKE '900%');

      -- 088-nummers met een even aantal digits
      UPDATE prs_perslid
         SET prs_perslid_telefoonnr =    SUBSTR( TRIM( '0' || SUBSTR (prs_perslid_telefoonnr, 1, 2) || ' - '
                     || SUBSTR (prs_perslid_telefoonnr, 3, 3)
                     || ' '
                     || SUBSTR (prs_perslid_telefoonnr, 6, 2)
                     || ' '
                     || SUBSTR (prs_perslid_telefoonnr, 8, 2) ), 1, 15)
       WHERE prs_perslid_telefoonnr IS NOT NULL
         AND LENGTH(prs_perslid_telefoonnr) > 5
         AND MOD( LENGTH(prs_perslid_telefoonnr), 2) = 1
         AND prs_perslid_telefoonnr LIKE '88%';

      -- 088-nummers met een oneven aantal digits
      UPDATE prs_perslid
         SET prs_perslid_telefoonnr =    SUBSTR( TRIM('0' || SUBSTR (prs_perslid_telefoonnr, 1, 2) || '-'
                     || SUBSTR (prs_perslid_telefoonnr, 3, 2)
                     || ' '
                     || SUBSTR (prs_perslid_telefoonnr, 5, 2)
                     || ' '
                     || SUBSTR (prs_perslid_telefoonnr, 7, 2)
                     || ' '
                     || SUBSTR (prs_perslid_telefoonnr, 9, 2)) , 1, 15)
       WHERE prs_perslid_telefoonnr IS NOT NULL
         AND LENGTH(prs_perslid_telefoonnr) > 5
         AND MOD( LENGTH(prs_perslid_telefoonnr), 2) = 0
         AND prs_perslid_telefoonnr LIKE '88%';

      -- netnummers met 2 digits na-de-nul (bijv "020")
      UPDATE prs_perslid
         SET prs_perslid_telefoonnr =    SUBSTR('(0' || SUBSTR (prs_perslid_telefoonnr, 1, 2) || ') '
                     || SUBSTR (prs_perslid_telefoonnr, 3, 3)
                     || ' '
                     || SUBSTR (prs_perslid_telefoonnr, 6, 2)
                     || ' '
                     || SUBSTR (prs_perslid_telefoonnr, 8, 2), 1, 15)
       WHERE prs_perslid_telefoonnr IS NOT NULL
         AND LENGTH(prs_perslid_telefoonnr) > 5
         AND EXISTS (SELECT 1
                       FROM fac_usrdata
                      WHERE fac_usrtab_key = v_fac_usrtab_key
                        AND fac_usrdata_verwijder IS NULL
                        AND prs_perslid_telefoonnr LIKE fac_usrdata_code || '%'
                        AND LENGTH (fac_usrdata_code) = 2);

      -- netnummers met 3 digits na-de-nul (bijv "0118")
      UPDATE prs_perslid
         SET prs_perslid_telefoonnr =    SUBSTR('(0' || SUBSTR (prs_perslid_telefoonnr, 1, 3) || ') '
                     || SUBSTR (prs_perslid_telefoonnr, 4, 2)
                     || ' '
                     || SUBSTR (prs_perslid_telefoonnr, 6, 2)
                     || ' '
                     || SUBSTR (prs_perslid_telefoonnr, 8, 2), 1, 15)
       WHERE prs_perslid_telefoonnr IS NOT NULL
         AND LENGTH(prs_perslid_telefoonnr) > 5
         AND EXISTS (SELECT 1
                       FROM fac_usrdata
                      WHERE fac_usrtab_key = v_fac_usrtab_key
                        AND fac_usrdata_verwijder IS NULL
                        AND prs_perslid_telefoonnr LIKE fac_usrdata_code || '%'
                        AND LENGTH (fac_usrdata_code) = 3);

      --
      -- MOBIELE NUMMER --------------------------------------------------------------
      --
      -- Verwijder landinformatie (alleen van Nederlandse nummers; buitenlandse
      -- worden helaas verminkt!)
      UPDATE prs_perslid SET prs_perslid_mobiel = SUBSTR (prs_perslid_mobiel, 2) WHERE prs_perslid_mobiel LIKE '+%';
      UPDATE prs_perslid SET prs_perslid_mobiel = SUBSTR (prs_perslid_mobiel, 3) WHERE prs_perslid_mobiel LIKE '31%';
      UPDATE prs_perslid SET prs_perslid_mobiel = SUBSTR (prs_perslid_mobiel, 5) WHERE prs_perslid_mobiel LIKE '0031%';

      -- Verwijder non-digit tekens (leestekens en spaties)
      UPDATE prs_perslid
         SET prs_perslid_mobiel = REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(prs_perslid_mobiel,
                        '.', ''),
                        '(', ''),
                        ')', ''),
                        '-', ''),
                        ' ', '');
      UPDATE prs_perslid SET prs_perslid_mobiel = '20' || prs_perslid_mobiel     WHERE prs_perslid_mobiel LIKE '687____';
      UPDATE prs_perslid SET prs_perslid_mobiel = SUBSTR (prs_perslid_mobiel, 2) WHERE prs_perslid_mobiel LIKE '0%';

      -- 06-nummers bijwerken
      -- (NB: format "06 - xx xx xx xx" is 16 digits, dus gebruik ik
      --  "06-xx xx xx xx", om het binnen de 15 karakters te houden.)
      UPDATE prs_perslid
         SET prs_perslid_mobiel =    SUBSTR( TRIM( '0' || SUBSTR (prs_perslid_mobiel, 1, 1) || '-'
                     || SUBSTR (prs_perslid_mobiel, 2, 2)
                     || ' '
                     || SUBSTR (prs_perslid_mobiel, 4, 2)
                     || ' '
                     || SUBSTR (prs_perslid_mobiel, 6, 2)
                     || ' '
                     || SUBSTR (prs_perslid_mobiel, 8, 2) ), 1, 15)
       WHERE prs_perslid_mobiel LIKE '6%'
         AND prs_perslid_mobiel IS NOT NULL
         AND LENGTH(prs_perslid_mobiel) > 5;

      -- 0800- en 0900-nummers met een even aantal digits
      -- (NB: MOD(prs_perslid_mobiel, 2) = 1, omdat prs_perslid_mobiel begint met 900 ipv 0900!)
      UPDATE prs_perslid
         SET prs_perslid_mobiel =    SUBSTR( TRIM( '0' || SUBSTR (prs_perslid_mobiel, 1, 3) || ' - '
                     || SUBSTR (prs_perslid_mobiel, 4, 2)
                     || ' '
                     || SUBSTR (prs_perslid_mobiel, 6, 2)
                     || ' '
                     || SUBSTR (prs_perslid_mobiel, 8, 2) ), 1, 15)
       WHERE prs_perslid_mobiel IS NOT NULL
         AND LENGTH(prs_perslid_mobiel) > 5
         AND MOD( LENGTH(prs_perslid_mobiel), 2) = 1
         AND (   prs_perslid_mobiel LIKE '800%'
              OR prs_perslid_mobiel LIKE '900%');

      -- 0800- en 0900-nummers met een oneven aantal digits
      UPDATE prs_perslid
         SET prs_perslid_mobiel =    SUBSTR( TRIM('0' || SUBSTR (prs_perslid_mobiel, 1, 3) || '-'
                     || SUBSTR (prs_perslid_mobiel, 4, 3)
                     || ' '
                     || SUBSTR (prs_perslid_mobiel, 7, 2)
                     || ' '
                     || SUBSTR (prs_perslid_mobiel, 9, 2)) , 1, 15)
       WHERE prs_perslid_mobiel IS NOT NULL
         AND LENGTH(prs_perslid_mobiel) > 5
         AND MOD( LENGTH(prs_perslid_mobiel), 2) = 0
         AND (   prs_perslid_mobiel LIKE '800%'
              OR prs_perslid_mobiel LIKE '900%');

      -- 088-nummers met een even aantal digits
      UPDATE prs_perslid
         SET prs_perslid_mobiel =    SUBSTR( TRIM( '0' || SUBSTR (prs_perslid_mobiel, 1, 2) || ' - '
                     || SUBSTR (prs_perslid_mobiel, 3, 3)
                     || ' '
                     || SUBSTR (prs_perslid_mobiel, 6, 2)
                     || ' '
                     || SUBSTR (prs_perslid_mobiel, 8, 2) ), 1, 15)
       WHERE prs_perslid_mobiel IS NOT NULL
         AND LENGTH(prs_perslid_mobiel) > 5
         AND MOD( LENGTH(prs_perslid_mobiel), 2) = 1
         AND prs_perslid_mobiel LIKE '88%';

      -- 088-nummers met een oneven aantal digits
      UPDATE prs_perslid
         SET prs_perslid_mobiel =    SUBSTR( TRIM('0' || SUBSTR (prs_perslid_mobiel, 1, 2) || '-'
                     || SUBSTR (prs_perslid_mobiel, 3, 2)
                     || ' '
                     || SUBSTR (prs_perslid_mobiel, 5, 2)
                     || ' '
                     || SUBSTR (prs_perslid_mobiel, 7, 2)
                     || ' '
                     || SUBSTR (prs_perslid_mobiel, 9, 2)) , 1, 15)
       WHERE prs_perslid_mobiel IS NOT NULL
         AND LENGTH(prs_perslid_mobiel) > 5
         AND MOD( LENGTH(prs_perslid_mobiel), 2) = 0
         AND prs_perslid_mobiel LIKE '88%';

      -- netnummers met 2 digits na-de-nul (bijv "020")
      UPDATE prs_perslid
         SET prs_perslid_mobiel =    SUBSTR('(0' || SUBSTR (prs_perslid_mobiel, 1, 2) || ') '
                     || SUBSTR (prs_perslid_mobiel, 3, 3)
                     || ' '
                     || SUBSTR (prs_perslid_mobiel, 6, 2)
                     || ' '
                     || SUBSTR (prs_perslid_mobiel, 8, 2), 1, 15)
       WHERE prs_perslid_mobiel IS NOT NULL
         AND LENGTH(prs_perslid_mobiel) > 5
         AND EXISTS (SELECT 1
                       FROM fac_usrdata
                      WHERE fac_usrtab_key = v_fac_usrtab_key
                        AND fac_usrdata_verwijder IS NULL
                        AND prs_perslid_mobiel LIKE fac_usrdata_code || '%'
                        AND LENGTH (fac_usrdata_code) = 2);

      -- netnummers met 3 digits na-de-nul (bijv "0118")
      UPDATE prs_perslid
         SET prs_perslid_mobiel =    SUBSTR('(0' || SUBSTR (prs_perslid_mobiel, 1, 3) || ') '
                     || SUBSTR (prs_perslid_mobiel, 4, 2)
                     || ' '
                     || SUBSTR (prs_perslid_mobiel, 6, 2)
                     || ' '
                     || SUBSTR (prs_perslid_mobiel, 8, 2), 1, 15)
       WHERE prs_perslid_mobiel IS NOT NULL
         AND LENGTH(prs_perslid_mobiel) > 5
         AND EXISTS (SELECT 1
                       FROM fac_usrdata
                      WHERE fac_usrtab_key = v_fac_usrtab_key
                        AND fac_usrdata_verwijder IS NULL
                        AND prs_perslid_mobiel LIKE fac_usrdata_code || '%'
                        AND LENGTH (fac_usrdata_code) = 3);

      --
      -- FAXNUMMER -------------------------------------------------------------------
      --
      -- Verwijder landinformatie (alleen van Nederlandse nummers; buitenlandse
      -- worden helaas verminkt!)
      UPDATE prs_kenmerklink SET prs_kenmerklink_waarde = SUBSTR (prs_kenmerklink_waarde, 2)
       WHERE prs_kenmerk_key = c_faxnr_key
         AND prs_kenmerklink_waarde LIKE '+%';
      UPDATE prs_kenmerklink SET prs_kenmerklink_waarde = SUBSTR (prs_kenmerklink_waarde, 3)
       WHERE prs_kenmerk_key = c_faxnr_key
         AND prs_kenmerklink_waarde LIKE '31%';
      UPDATE prs_kenmerklink SET prs_kenmerklink_waarde = SUBSTR (prs_kenmerklink_waarde, 5)
       WHERE prs_kenmerk_key = c_faxnr_key
         AND prs_kenmerklink_waarde LIKE '0031%';

      -- Verwijder non-digit tekens (leestekens en spaties)
      UPDATE prs_kenmerklink
         SET prs_kenmerklink_waarde = REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(prs_kenmerklink_waarde,
                     '.', ''),
                     '(', ''),
                     ')', ''),
                     '-', ''),
                     ' ', '')
       WHERE prs_kenmerk_key = c_faxnr_key;
      UPDATE prs_kenmerklink SET prs_kenmerklink_waarde = '20' || prs_kenmerklink_waarde
       WHERE prs_kenmerk_key = c_faxnr_key
         AND prs_kenmerklink_waarde LIKE '687____';
      UPDATE prs_kenmerklink SET prs_kenmerklink_waarde = SUBSTR (prs_kenmerklink_waarde, 2)
       WHERE prs_kenmerk_key = c_faxnr_key
         AND prs_kenmerklink_waarde LIKE '0%';

      -- 06-nummers bijwerken
      -- (NB: format "06 - xx xx xx xx" is 16 digits, dus gebruik ik
      --  "06-xx xx xx xx", om het binnen de 15 karakters te houden.)
      UPDATE prs_kenmerklink
         SET prs_kenmerklink_waarde =    SUBSTR( TRIM( '0' || SUBSTR (prs_kenmerklink_waarde, 1, 1) || '-'
                                      || SUBSTR (prs_kenmerklink_waarde, 2, 2)
                                      || ' '
                                      || SUBSTR (prs_kenmerklink_waarde, 4, 2)
                                      || ' '
                                      || SUBSTR (prs_kenmerklink_waarde, 6, 2)
                                      || ' '
                                      || SUBSTR (prs_kenmerklink_waarde, 8, 2) ), 1, 15)
       WHERE prs_kenmerk_key = c_faxnr_key
         AND prs_kenmerklink_waarde LIKE '6%'
         AND prs_kenmerklink_waarde IS NOT NULL
         AND LENGTH(prs_kenmerklink_waarde) > 5;

      -- 0800- en 0900-nummers met een even aantal digits
      -- (NB: MOD(prs_kenmerklink_waarde, 2) = 1, omdat prs_kenmerklink_waarde begint met 900 ipv 0900!)
      UPDATE prs_kenmerklink
         SET prs_kenmerklink_waarde =    SUBSTR( TRIM( '0' || SUBSTR (prs_kenmerklink_waarde, 1, 3) || ' - '
                                      || SUBSTR (prs_kenmerklink_waarde, 4, 2)
                                      || ' '
                                      || SUBSTR (prs_kenmerklink_waarde, 6, 2)
                                      || ' '
                                      || SUBSTR (prs_kenmerklink_waarde, 8, 2) ), 1, 15)
       WHERE prs_kenmerk_key = c_faxnr_key
         AND prs_kenmerklink_waarde IS NOT NULL
         AND LENGTH(prs_kenmerklink_waarde) > 5
         AND MOD( LENGTH(prs_kenmerklink_waarde), 2) = 1
         AND (   prs_kenmerklink_waarde LIKE '800%'
              OR prs_kenmerklink_waarde LIKE '900%');

      -- 0800- en 0900-nummers met een oneven aantal digits
      UPDATE prs_kenmerklink
         SET prs_kenmerklink_waarde =    SUBSTR( TRIM('0' || SUBSTR (prs_kenmerklink_waarde, 1, 3) || '-'
                                      || SUBSTR (prs_kenmerklink_waarde, 4, 3)
                                      || ' '
                                      || SUBSTR (prs_kenmerklink_waarde, 7, 2)
                                      || ' '
                                      || SUBSTR (prs_kenmerklink_waarde, 9, 2)) , 1, 15)
       WHERE prs_kenmerk_key = c_faxnr_key
         AND prs_kenmerklink_waarde IS NOT NULL
         AND LENGTH(prs_kenmerklink_waarde) > 5
         AND MOD( LENGTH(prs_kenmerklink_waarde), 2) = 0
         AND (   prs_kenmerklink_waarde LIKE '800%'
              OR prs_kenmerklink_waarde LIKE '900%');

      -- 088-nummers met een even aantal digits
      UPDATE prs_kenmerklink
         SET prs_kenmerklink_waarde =    SUBSTR( TRIM( '0' || SUBSTR (prs_kenmerklink_waarde, 1, 2) || ' - '
                                      || SUBSTR (prs_kenmerklink_waarde, 3, 3)
                                      || ' '
                                      || SUBSTR (prs_kenmerklink_waarde, 6, 2)
                                      || ' '
                                      || SUBSTR (prs_kenmerklink_waarde, 8, 2) ), 1, 15)
       WHERE prs_kenmerk_key = c_faxnr_key
         AND prs_kenmerklink_waarde IS NOT NULL
         AND LENGTH(prs_kenmerklink_waarde) > 5
         AND MOD( LENGTH(prs_kenmerklink_waarde), 2) = 1
         AND prs_kenmerklink_waarde LIKE '88%';

      -- 088-nummers met een oneven aantal digits
      UPDATE prs_kenmerklink
         SET prs_kenmerklink_waarde =    SUBSTR( TRIM('0' || SUBSTR (prs_kenmerklink_waarde, 1, 2) || '-'
                                      || SUBSTR (prs_kenmerklink_waarde, 3, 2)
                                      || ' '
                                      || SUBSTR (prs_kenmerklink_waarde, 5, 2)
                                      || ' '
                                      || SUBSTR (prs_kenmerklink_waarde, 7, 2)
                                      || ' '
                                      || SUBSTR (prs_kenmerklink_waarde, 9, 2)) , 1, 15)
       WHERE prs_kenmerk_key = c_faxnr_key
         AND prs_kenmerklink_waarde IS NOT NULL
         AND LENGTH(prs_kenmerklink_waarde) > 5
         AND MOD( LENGTH(prs_kenmerklink_waarde), 2) = 0
         AND prs_kenmerklink_waarde LIKE '88%';

      -- netnummers met 2 digits na-de-nul (bijv "020")
      UPDATE prs_kenmerklink
         SET prs_kenmerklink_waarde =    SUBSTR('(0' || SUBSTR (prs_kenmerklink_waarde, 1, 2) || ') '
                                      || SUBSTR (prs_kenmerklink_waarde, 3, 3)
                                      || ' '
                                      || SUBSTR (prs_kenmerklink_waarde, 6, 2)
                                      || ' '
                                      || SUBSTR (prs_kenmerklink_waarde, 8, 2), 1, 15)
       WHERE prs_kenmerk_key = c_faxnr_key
         AND prs_kenmerklink_waarde IS NOT NULL
         AND LENGTH(prs_kenmerklink_waarde) > 5
         AND EXISTS (SELECT 1
                       FROM fac_usrdata
                      WHERE fac_usrtab_key = v_fac_usrtab_key
                        AND fac_usrdata_verwijder IS NULL
                        AND prs_kenmerklink_waarde LIKE fac_usrdata_code || '%'
                        AND LENGTH (fac_usrdata_code) = 2);

      -- netnummers met 3 digits na-de-nul (bijv "0118")
      UPDATE prs_kenmerklink
         SET prs_kenmerklink_waarde =    SUBSTR('(0' || SUBSTR (prs_kenmerklink_waarde, 1, 3) || ') '
                                      || SUBSTR (prs_kenmerklink_waarde, 4, 2)
                                      || ' '
                                      || SUBSTR (prs_kenmerklink_waarde, 6, 2)
                                      || ' '
                                      || SUBSTR (prs_kenmerklink_waarde, 8, 2), 1, 15)
       WHERE prs_kenmerk_key = c_faxnr_key
         AND prs_kenmerklink_waarde IS NOT NULL
         AND LENGTH(prs_kenmerklink_waarde) > 5
         AND EXISTS (SELECT prs_kenmerklink_key
                       FROM fac_usrdata
                      WHERE fac_usrtab_key = v_fac_usrtab_key
                        AND fac_usrdata_verwijder IS NULL
                        AND prs_kenmerklink_waarde LIKE fac_usrdata_code || '%'
                        AND LENGTH (fac_usrdata_code) = 3);

   EXCEPTION
      WHEN OTHERS
      THEN
         fac.imp_writelog (p_import_key,
                           'W',
                           'Fout bij formatteren telefoonnummers',
                           SQLCODE||': '||SUBSTR(SQLERRM, 1, 200) );
   END format_telefoonnummers;

   PROCEDURE abo_verhuisd (p_import_key     NUMBER,
                           p_perslid_key    NUMBER,
                           p_locatie_key    NUMBER)
   AS
      oracle_err_num   VARCHAR (20);
      oracle_err_mes   VARCHAR (100);
      v_errorhint      VARCHAR (200);
      v_errormsg       VARCHAR (200);
      v_aanduiding     VARCHAR (200);
      v_count          NUMBER;

      -- Contract is een abonnement en deze persoon is contracteigenaar!
      CURSOR c_cnt
      IS
         SELECT   c.cnt_contract_key,
                  c.cnt_contract_nummer_intern,
                  pf.prs_perslid_naam_full,
                  l.alg_locatie_omschrijving,
                  l.alg_locatie_post_adres,
                  l.alg_locatie_post_postcode,
                  l.alg_locatie_post_plaats,
                  sn.fac_srtnotificatie_oms
           FROM   cnt_v_aanwezigcontract c,
                  prs_v_perslid_fullnames pf,
                  alg_locatie l,
                  fac_srtnotificatie sn
          WHERE   c.ins_discipline_key = 360                   -- Abonnementen
                  AND c.cnt_contract_status = 0              -- NIET Gesloten!
                  AND NOT EXISTS -- Beschouw alleen laatste versie van contracten
                        (SELECT   1
                           FROM   cnt_v_aanwezigcontract
                          WHERE   cnt_contract_nummer_intern =
                                     c.cnt_contract_nummer_intern
                                  AND cnt_contract_versie >
                                        c.cnt_contract_versie)
                  AND c.cnt_contract_looptijd_tot > SYSDATE
                  AND c.prs_perslid_key_eig = p_perslid_key
                  AND pf.prs_perslid_key = p_perslid_key
                  AND l.alg_locatie_key = p_locatie_key
                  AND sn.fac_srtnotificatie_code = 'CUST19';
   BEGIN
      FOR rec IN c_cnt
      LOOP
         BEGIN
            v_aanduiding :=
                  rec.prs_perslid_naam_full
               || '/'
               || rec.cnt_contract_nummer_intern;

            -- Op basis van CUST19-tracking wordt via PutOrders ook aansluitend
            -- een cXML - uit customer orderqueue! - naar leverancier gestuurd!
            fac.trackaction ('CUST19',
                             rec.cnt_contract_key,
                             NULL,
                             NULL,
                             rec.fac_srtnotificatie_oms);

            -- Ook nog maar even in ABS-logging noemen of niet?
            fac.imp_writelog (
               p_import_key,
               'I',
                  rec.cnt_contract_nummer_intern
               || ': abonnee '
               || rec.prs_perslid_naam_full
               || ' verhuisd.',
                  rec.alg_locatie_omschrijving
               || ', '
               || rec.alg_locatie_post_adres
               || ', '
               || rec.alg_locatie_post_postcode
               || ' '
               || rec.alg_locatie_post_plaats
            );
         EXCEPTION
            WHEN OTHERS
            THEN
               oracle_err_num := SQLCODE;
               oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
               v_errorhint := 'abo_verhuisd {' || v_errormsg || '}';
               v_errormsg :=
                     v_aanduiding
                  || '(ORACLE error '
                  || oracle_err_num
                  || '/'
                  || oracle_err_mes
                  || ')';
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_errormsg,
                                 v_errorhint);
         END;
      END LOOP;
   EXCEPTION
      WHEN OTHERS
      THEN
         oracle_err_num := SQLCODE;
         oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
         v_errorhint := 'abo_verhuisd {' || v_errormsg || '}';
         v_errormsg :=
               v_aanduiding
            || '(ORACLE error '
            || oracle_err_num
            || '/'
            || oracle_err_mes
            || ')';
         fac.imp_writelog (p_import_key,
                           'W',
                           v_errormsg,
                           v_errorhint);
   END;
END uwva;
/

COMMIT;

BEGIN adm.systrackscriptId('$Id$'); END;
/

SPOOL OFF;

COMMIT;