--
-- $Id$
--
-- Script om importfunctie voor kostenplaatsen tijdelijk te configureren voor AADO.
-- Script AADS#38245_2.sql verwijdert de tabel en importfunctie voordat de upgrade plaatsvindt.

DEFINE thisfile = 'AADS#38245_1.SQL'
DEFINE dbuser   = '^AADO'

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

CREATE TABLE fac_imp_kpn
(
   prs_kostenplaats_nr              VARCHAR2 (30),
   prs_kostenplaats_omschrijving    VARCHAR2 (60),
   prs_kostenplaats_module          VARCHAR2 (3),
   prs_kostenplaats_begin           DATE,
   prs_kostenplaats_eind            DATE,
   prs_kostenplaatsgrp_key          NUMBER (10),
   prs_perslid_key                  NUMBER (10),
   prs_kostenplaats_limiet          NUMBER (8),
   prs_kostenplaats_limietperiode   NUMBER (1),
   prs_kostenplaats_extern          NUMBER (1),
   prs_kostenplaats_fiat            NUMBER (1)
);

INSERT INTO fac_import_app (fac_import_app_code, fac_import_app_oms, fac_functie_key)
  SELECT 'KPN', 'FIP: Aanmaken/bijwerken van kostenplaatsen', fac_functie_key
     FROM fac_functie
    WHERE fac_functie_code = 'WEB_PRSSYS';

CREATE OR REPLACE PROCEDURE fac_import_kpn (p_import_key IN NUMBER)
AS
   c_fielddelimitor               VARCHAR2 (1) := ';';
   v_newline                      VARCHAR2 (1000);                                     -- Input line
   v_errormsg                     VARCHAR2 (1000);
   oracle_err_num                 NUMBER;
   oracle_err_mes                 VARCHAR2 (200);
   header_is_valid                NUMBER;
   v_count                        NUMBER;
   v_ongeldig                     NUMBER (1);
   v_mode                         NUMBER (1);
   v_aanduiding                   VARCHAR2 (200);
   v_all_null                     BOOLEAN;
   v_count_error                  NUMBER (10);
   v_count_tot                    NUMBER (10);
   v_count_import                 NUMBER (10);
   -- De importvelden:
   v_kostenplaats_nr              VARCHAR2 (255);
   v_kostenplaats_omschrijving    VARCHAR2 (255);
   v_kostenplaats_module          VARCHAR2 (255);
   v_kostenplaats_begin           VARCHAR2 (255);
   v_kostenplaats_begin_d         DATE;
   v_kostenplaats_eind            VARCHAR2 (255);
   v_kostenplaats_eind_d          DATE;
   v_kostenplaatsgrp_oms          VARCHAR2 (255);
   v_kostenplaatsgrp_key          NUMBER;
   v_perslid                      VARCHAR2 (255);
   v_perslid_key                  NUMBER (10);
   v_kostenplaats_limiet          VARCHAR2 (255);
   v_kostenplaats_limietperiode   VARCHAR2 (255);
   v_kostenplaats_extern          VARCHAR2 (255);
   v_kostenplaats_fiat            VARCHAR2 (255);

   CURSOR c
   IS
        SELECT *
          FROM fac_imp_file
         WHERE fac_import_key = p_import_key
      ORDER BY fac_imp_file_index;
BEGIN
   -- Eerst opruiming
   DELETE FROM fac_imp_kpn;

   COMMIT;
   v_count_error := 0;
   header_is_valid := 0;
   v_count_tot := 0;
   v_count_import := 0;

   FOR rec IN c
   LOOP
      BEGIN
         v_errormsg := 'Fout FETCH te importeren rij';

         v_newline := rec.fac_imp_file_line;
         v_errormsg := 'Fout opvragen te importeren rij';
         v_aanduiding := '';
         v_ongeldig := 0;

         -- Lees alle veldwaarden
         fac.imp_getfield (v_newline, c_fielddelimitor, v_kostenplaats_nr);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_kostenplaats_omschrijving);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_kostenplaats_module);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_kostenplaats_begin);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_kostenplaats_eind);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_kostenplaatsgrp_oms);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_perslid);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_kostenplaats_limiet);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_kostenplaats_limietperiode);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_kostenplaats_extern);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_kostenplaats_fiat);

         v_aanduiding := v_kostenplaats_nr || '|' || v_kostenplaats_omschrijving;

         IF v_kostenplaats_nr IS NOT NULL
         THEN
            IF (header_is_valid = 0)
            THEN
               IF UPPER (v_kostenplaats_nr) = 'KOSTENPLAATS'
              AND UPPER (v_perslid) = 'BUDGETHOUDER'
              AND UPPER (v_kostenplaats_fiat) = 'OPDRACHTENFIATTEREN'
               THEN
                  header_is_valid := 1;
               END IF;
            ELSE
               v_count_tot := v_count_tot + 1;
               --fac.imp_writelog (p_import_key, 'I', v_aanduiding, '');
               -- Controleer alle veldwaarde
               v_kostenplaats_nr := TRIM (v_kostenplaats_nr);

               IF LENGTH (v_kostenplaats_nr) > 30
               THEN
                  v_kostenplaats_nr := SUBSTR (v_kostenplaats_nr, 1, 30);
                  fac.imp_writelog (
                     p_import_key,
                     'W',
                     v_aanduiding || 'Kostenplaatsnummer is te lang',
                     'Kostenplaatsnummer wordt afgebroken tot [' || v_kostenplaats_nr || ']');
               END IF;

               --
               v_kostenplaats_omschrijving := TRIM (v_kostenplaats_omschrijving);

               IF LENGTH (v_kostenplaats_omschrijving) > 60
               THEN
                  v_kostenplaats_omschrijving := SUBSTR (v_kostenplaats_omschrijving, 1, 60);
                  fac.imp_writelog (
                     p_import_key,
                     'W',
                     v_aanduiding || 'Kostenpaatsomschrijving is te lang',
                        'Kostenpaatsomschrijving wordt afgebroken tot ['
                     || v_kostenplaats_omschrijving
                     || ']');
               END IF;

               --
               v_kostenplaats_module := UPPER (TRIM (v_kostenplaats_module));

               IF v_kostenplaats_module NOT IN ('ALG', 'PRS', 'PRJ')
               THEN
                  v_kostenplaats_module := 'PRS';
                  fac.imp_writelog (
                     p_import_key,
                     'E',
                     v_aanduiding || 'Ongelding kostenplaatstype',
                     'Kostenplaatstype wordt aangepast naar [' || v_kostenplaats_module || ']');
               END IF;

               --
               v_kostenplaats_begin := TRIM (v_kostenplaats_begin);
               v_kostenplaats_begin_d := fac.safe_to_date (v_kostenplaats_begin, 'dd-mm-yyyy');

               IF v_kostenplaats_begin IS NOT NULL AND v_kostenplaats_begin_d IS NULL
               THEN
                  fac.imp_writelog (p_import_key,
                                    'E',
                                    v_aanduiding || 'Kostenplaatsbegin is ongeldig',
                                    'Kostenplaatsbegin wordt leeg gemaakt');
               END IF;

               --
               v_kostenplaats_eind := TRIM (v_kostenplaats_eind);
               v_kostenplaats_eind_d := fac.safe_to_date (v_kostenplaats_eind, 'dd-mm-yyyy');

               IF v_kostenplaats_eind IS NOT NULL AND v_kostenplaats_eind_d IS NULL
               THEN
                  fac.imp_writelog (p_import_key,
                                    'E',
                                    v_aanduiding || 'Kostenplaatseind is ongeldig',
                                    'Kostenplaatseind wordt leeg gemaakt');
               END IF;

               --
               v_kostenplaatsgrp_oms := TRIM (v_kostenplaatsgrp_oms);

               IF v_kostenplaatsgrp_oms IS NOT NULL
               THEN
                  BEGIN
                     SELECT prs_kostenplaatsgrp_key
                       INTO v_kostenplaatsgrp_key
                       FROM prs_kostenplaatsgrp
                      WHERE UPPER (prs_kostenplaatsgrp_oms) = UPPER (v_kostenplaatsgrp_oms);
                  EXCEPTION
                     WHEN NO_DATA_FOUND
                     THEN
                        v_kostenplaatsgrp_key := NULL;

                        fac.imp_writelog (
                           p_import_key,
                           'E',
                           v_aanduiding || 'Kostenplaatsgroep-aanduiding kan niet gevonden worden',
                           'Kostenplaatsgroep wordt leeg gemaakt [' || v_kostenplaatsgrp_oms || ']');
                  END;
               ELSE
                  v_kostenplaatsgrp_key := NULL;
               END IF;

               --
               v_perslid := TRIM (v_perslid);

               IF v_perslid IS NOT NULL
               THEN
                  BEGIN
                     SELECT prs_perslid_key
                       INTO v_perslid_key
                       FROM prs_perslid
                      WHERE prs_perslid_oslogin = UPPER (v_perslid)
                         OR prs_perslid_oslogin = UPPER (v_perslid);
                  EXCEPTION
                     WHEN NO_DATA_FOUND
                     THEN
                        v_perslid_key := NULL;

                        fac.imp_writelog (
                           p_import_key,
                           'E',
                           v_aanduiding || 'Budgethouder-aanduiding kan niet gevonden worden',
                           'Budgethouder wordt leeg gemaakt [' || v_perslid || ']');
                  END;
               ELSE
                  v_perslid_key := NULL;
               END IF;

               v_kostenplaats_limiet := TRIM (v_kostenplaats_limiet);

               v_kostenplaats_limietperiode := UPPER (TRIM (v_kostenplaats_limietperiode));

               IF v_kostenplaats_limietperiode IS NOT NULL
              AND v_kostenplaats_limietperiode NOT IN ('J', 'M')
               THEN
                  fac.imp_writelog (
                     p_import_key,
                     'E',
                     v_aanduiding || 'Budgetperiode-aanduiding kan niet gevonden worden',
                     'Budgetperiode wordt leeg gemaakt [' || v_kostenplaats_limietperiode || ']');
               END IF;

               v_kostenplaats_extern := TRIM (v_kostenplaats_extern);

               IF v_kostenplaats_extern IS NOT NULL AND v_kostenplaats_extern NOT IN ('0', '1')
               THEN
                  v_kostenplaats_extern := NULL;
                  fac.imp_writelog (
                     p_import_key,
                     'E',
                     v_aanduiding || 'Kostenplaats extern-aanduiding kan niet gevonden worden',
                     'Kostenplaats_extern-aanduiding wordt leeg gemaakt');
               END IF;

               v_kostenplaats_fiat := TRIM (v_kostenplaats_fiat);

               IF v_kostenplaats_fiat IS NOT NULL AND v_kostenplaats_fiat NOT IN ('0', '1')
               THEN
                  v_kostenplaats_fiat := NULL;
                  fac.imp_writelog (
                     p_import_key,
                     'E',
                     v_aanduiding || 'Opdrachtfiatteren-aanduiding kan niet gevonden worden',
                     'Opdrachtfiatteren-aanduiding wordt leeg gemaakt');
               END IF;

               -- Insert geformatteerde import record
               IF v_ongeldig = 0
               THEN
                  v_errormsg :=
                     'Fout bij toevoegen te impoteren kostenplaats [' || v_aanduiding || ']';

                  INSERT INTO fac_imp_kpn (prs_kostenplaats_nr,
                                           prs_kostenplaats_omschrijving,
                                           prs_kostenplaats_module,
                                           prs_kostenplaats_begin,
                                           prs_kostenplaats_eind,
                                           prs_kostenplaatsgrp_key,
                                           prs_perslid_key,
                                           prs_kostenplaats_limiet,
                                           prs_kostenplaats_limietperiode,
                                           prs_kostenplaats_extern,
                                           prs_kostenplaats_fiat)
                      VALUES (v_kostenplaats_nr,
                              v_kostenplaats_omschrijving,
                              v_kostenplaats_module,
                              v_kostenplaats_begin_d,
                              v_kostenplaats_eind_d,
                              v_kostenplaatsgrp_key,
                              v_perslid_key,
                              fac.safe_to_number (v_kostenplaats_limiet),
                              DECODE (v_kostenplaats_limietperiode, 'M', 1, 'J', 2, 0),
                              fac.safe_to_number (v_kostenplaats_extern),
                              fac.safe_to_number (v_kostenplaats_fiat));

                  v_count_import := v_count_import + 1;
               END IF;
            END IF;
         END IF;
      END;
   END LOOP;

   IF (header_is_valid = 0)
   THEN
      fac.imp_writelog (p_import_key,
                        'E',
                        v_aanduiding || 'Ongeldig importbestand',
                        'Geen geldige headerregel aanwezig');
   ELSE
      fac.imp_writelog (p_import_key,
                        'S',
                        'Kostenplaats: aantal ingelezen regels: ' || TO_CHAR (v_count_tot),
                        '');
      fac.imp_writelog (
         p_import_key,
         'S',
         'Kostenplaats: aantal ongeldige importregels: ' || TO_CHAR (v_count_tot - v_count_import),
         '');
   END IF;

   COMMIT;
EXCEPTION
   WHEN OTHERS
   THEN
      oracle_err_num := SQLCODE;
      oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
      v_errormsg := 'error ' || oracle_err_num || '/' || oracle_err_mes;
      fac.imp_writelog (p_import_key,
                        'E',
                        v_errormsg,
                        '');
END fac_import_kpn;
/

CREATE OR REPLACE PROCEDURE fac_update_kpn (p_import_key IN NUMBER)
AS
   CURSOR c
   IS
      SELECT * FROM fac_imp_kpn;

   v_errormsg           VARCHAR2 (1000);
   v_errorhint          VARCHAR2 (1000);
   oracle_err_num       NUMBER;
   oracle_err_mes       VARCHAR2 (200);
   v_count              NUMBER;
   v_ongeldig           NUMBER (1);
   v_aanduiding         VARCHAR2 (200);

   v_kostenplaats_key   prs_kostenplaats.prs_kostenplaats_key%TYPE;
BEGIN
   FOR rec IN c
   LOOP
      BEGIN
         BEGIN
            v_aanduiding := rec.prs_kostenplaats_nr || '|' || rec.prs_kostenplaats_omschrijving;

            v_errorhint := 'Opzoeken kostenplaats';

            SELECT prs_kostenplaats_key
              INTO v_kostenplaats_key
              FROM prs_kostenplaats
             WHERE prs_kostenplaats_verwijder IS NULL
               AND prs_kostenplaats_upper = UPPER (rec.prs_kostenplaats_nr);
         EXCEPTION
            WHEN NO_DATA_FOUND
            THEN
               v_errorhint := 'Toevoegen kostenplaats';

               INSERT INTO prs_kostenplaats (prs_kostenplaats_nr,
                                             prs_kostenplaats_module,
                                             prs_kostenplaats_omschrijving)
                   VALUES (rec.prs_kostenplaats_nr,
                           rec.prs_kostenplaats_module,
                           rec.prs_kostenplaats_omschrijving)
                RETURNING prs_kostenplaats_key
                     INTO v_kostenplaats_key;
         END;

         -- We hebben nu een kostenplaats record aangemaakt of gevonden.
         -- Dan gaan we deze nu updaten.
         v_errorhint := 'Aanpassen kostenplaats';

         UPDATE prs_kostenplaats k
            SET prs_kostenplaats_omschrijving = rec.prs_kostenplaats_omschrijving,
                prs_kostenplaats_module = rec.prs_kostenplaats_module,
                prs_kostenplaats_begin = rec.prs_kostenplaats_begin,
                prs_kostenplaats_eind = rec.prs_kostenplaats_eind,
                prs_kostenplaatsgrp_key = rec.prs_kostenplaatsgrp_key,
                prs_perslid_key = rec.prs_perslid_key,
                prs_kostenplaats_limiet = rec.prs_kostenplaats_limiet,
                prs_kostenplaats_limietperiode = rec.prs_kostenplaats_limietperiode,
                prs_kostenplaats_extern =
                   COALESCE (rec.prs_kostenplaats_extern, prs_kostenplaats_extern),
                prs_kostenplaats_fiat = COALESCE (rec.prs_kostenplaats_fiat, prs_kostenplaats_fiat)
          WHERE k.prs_kostenplaats_key = v_kostenplaats_key;
      EXCEPTION
         WHEN OTHERS
         THEN
            oracle_err_num := SQLCODE;
            oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
            v_errormsg := 'error ' || oracle_err_num || '/' || oracle_err_mes;
            fac.imp_writelog (p_import_key,
                              'E',
                              v_errormsg,
                              v_errorhint || ' | ' || v_aanduiding);
      END;
   END LOOP;
EXCEPTION
   WHEN OTHERS
   THEN
      oracle_err_num := SQLCODE;
      oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
      v_errormsg := 'error ' || oracle_err_num || '/' || oracle_err_mes;
      fac.imp_writelog (p_import_key,
                        'E',
                        v_errormsg,
                        v_errorhint || ' | ' || v_aanduiding);
END fac_update_kpn;
/


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

