-- Script containing customer specific configuration sql statements for Provalu (voorheen De Maregroep)
-- $Revision$
-- $Id$

DEFINE thisfile = 'MARE.SQL'
DEFINE dbuser   = 'MARE'

SET ECHO ON
SET DEFINE ON
COLUMN fcltlogfile NEW_VALUE fcltlogfile NOPRINT;
COLUMN fcltcusttxt NEW_VALUE fcltcusttxt NOPRINT;
WHENEVER SQLERROR CONTINUE;
SELECT adm.getscriptspoolfile('&thisfile') AS fcltlogfile FROM DUAL;
SPOOL &fcltlogfile
WHENEVER SQLERROR EXIT;
SELECT adm.checkscriptcust('&dbuser') AS fcltcusttxt FROM DUAL;
WHENEVER SQLERROR CONTINUE;
---------------------------------------
PROMPT &fcltcusttxt
---------------------------------------
SET DEFINE OFF


------ payload begin ------

CREATE OR REPLACE PROCEDURE mare_import_perslid (p_import_key IN NUMBER)
AS
   oracle_err_num     NUMBER;
   oracle_err_mes     VARCHAR2 (200);
   v_errormsg         VARCHAR2 (400);
   v_errorhint        VARCHAR2 (400);
   v_aantal_in_fclt   NUMBER;
BEGIN
   -- Het aangeleverde bestand heeft de gegevens komma gescheiden ipv ;
   v_errorhint := 'Delimiter goed zetten';
   UPDATE fac_imp_file
      SET fac_imp_file_line = REPLACE (fac_imp_file_line, ',', ';')
    WHERE fac_import_key = p_import_key;

   v_errorhint := 'Generieke update';
   -- de sequence array staat beschreven in PRS_PAC.SRC bij de prs.import_perslid procedure
   -- Afdeling (nr7) tijdelijk gevuld met achternaam (wordt later altijd Provalu)
   -- Login (nr 22) wordt bij de import nog wel uit het bestand gehaald 3e kolom, maar later omgezet naar emailadres. 
   -- Let op, tov het daadwerkelijke bestand staat hieronder ; ipv ,
   prs.import_perslid (
      p_import_key,
         '0;0;0;0;0;0;2;2;0;1;'
      || '0;0;0;0;0;0;0;5;0;0;'
      || '2;3;0;0;0;0;0;0;0;4;'
      || '0;0;0;0;0;0;0;0;0;0;'
      || '0;0;0;0;0;0',
      ';;;;;"Firstname;LastName;Login;JobTitle;EmailAdress;"');

   -- Afdeling bepalen
   UPDATE fac_imp_perslid
      SET prs_afdeling_naam = 'Provalu';

   -- Loginnaam afleiden van emailadres
   UPDATE fac_imp_perslid
      SET prs_perslid_oslogin =
             (SUBSTR (prs_perslid_email,
                      0,
                      INSTR (prs_perslid_email, '@') - 1))
    WHERE UPPER (prs_perslid_email) LIKE '%PROVALU.NL%';
    
       -- Loginnaam afleiden van emailadres
   UPDATE fac_imp_perslid
      SET prs_perslid_oslogin =
             (SUBSTR (prs_perslid_email,
                      0,
                      INSTR (prs_perslid_email, '@') - 1))
    WHERE UPPER (prs_perslid_email) LIKE '%SERVICEPUNT-WERK.NL%';
	
   -- Functie is niet altijd gevuld, functie eerst gevuld met achternaam, nu vullen met kenmerk (of 'Onbekend').
   UPDATE fac_imp_perslid
      SET prs_srtperslid_omschrijving =
             DECODE (prs_kenmerk4, NULL, 'Onbekend', prs_kenmerk4);	

   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,
                        v_errorhint);
END mare_import_perslid;
/

CREATE OR REPLACE PROCEDURE mare_update_perslid (p_import_key IN NUMBER)
IS
   -- Alle personen verwijderen die niet meer in het import import bestand voorkomen
   -- Personen in de juiste autorisatiegroep zetten.
   -- Match bij Provalu is Email.
   -- Geen acties tenzij het aantal records in de importtabel meer dan 50 medewerkers betreft.

   CURSOR c_del
   IS
      SELECT p.prs_perslid_key, p.prs_perslid_nr, pf.prs_perslid_naam_full
        FROM prs_perslid p, prs_v_perslid_fullnames pf
       WHERE (UPPER (p.prs_perslid_email) LIKE '%PROVALU.NL%' OR UPPER (p.prs_perslid_email) LIKE '%SERVICEPUNT-WERK.NL%')
             AND UPPER (p.prs_perslid_email) NOT IN
                      (SELECT UPPER (prs_perslid_email) FROM fac_imp_perslid)
             AND pf.prs_perslid_key = p.prs_perslid_key;

   v_count          NUMBER;
   oracle_err_num   NUMBER;
   oracle_err_mes   VARCHAR2 (200);
   v_errormsg       VARCHAR2 (400);
   v_errorhint      VARCHAR2 (400);
BEGIN
   v_errorhint := 'Niet genoeg personen in bestand, import afgebroken';

   SELECT COUNT ( * ) INTO v_count FROM fac_imp_perslid;

   IF v_count >= 50
   THEN
      v_errorhint := 'Verwerken persoonsgegevens';

      -- Geldig importbestand wat betreft aantal personen

      COMMIT;

      -- Eerst de functie omzetten.
      UPDATE fac_imp_perslid
         SET prs_srtperslid_omschrijving = COALESCE (prs_kenmerk4, 'Onbekend');

      -- generic update
      -- 'EMAIL' betekent dat op basis van Email wordt gematched.
      -- 'NULL' betekent altijd geen werkplekken verwijderen
      prs.update_perslid (p_import_key, 'EMAIL', NULL);

      v_errorhint := 'Verwijderen persoonsgegevens';

      -- Verwijder personen die niet meer in de import voorkomen.
      FOR rec IN c_del
      LOOP
         BEGIN
            prs.delete_perslid (p_import_key, rec.prs_perslid_key);
         END;
      END LOOP;
   ELSE
      fac.imp_writelog (p_import_key,
                        'E',
                        v_errormsg,
                        v_errorhint);
      COMMIT;
   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,
                        v_errorhint);
END mare_update_perslid;
/

CREATE OR REPLACE VIEW mare_v_objectnummers
(
   ins_deel_key,
   ins_deel_module,
   ins_srtdeel_key,
   ins_alg_ruimte_key,
   ins_alg_ruimte_type,
   ins_deel_aantal,
   ins_deel_omschrijving,
   ins_deel_opmerking,
   ins_deel_upper,
   ins_deel_aanmaak,
   ins_deel_vervaldatum,
   ins_deel_verwijder,
   ins_deel_getekend,
   ins_discipline_key,
   ins_alg_locatie_key,
   ins_deel_parent_key,
   ins_deel_omtrek,
   ins_deel_oppervlak,
   ins_deel_dwgx,
   ins_deel_dwgy,
   ins_deel_dwgz,
   ins_deel_dwgrotatie,
   ins_deel_dwgschaal,
   ins_deel_x,
   ins_deel_y,
   ins_alg_ruimte_key_org,
   ins_alg_ruimte_type_org,
   ins_deel_state,
   ins_deel_statedate,
   ins_deel_t_uitvoertijd,
   ins_deel_actief,
   ins_deel_image,
   ins_deel_mjb_score1,
   ins_deel_mjb_score2,
   prs_perslid_key_beh,
   res_rsv_deel_key,
   bes_bestelopdr_key,
   ultimonummer,
   uniek_nummer
)
AS
   SELECT ins_deel_key,
          ins_deel_module,
          ins_srtdeel_key,
          ins_alg_ruimte_key,
          ins_alg_ruimte_type,
          ins_deel_aantal,
          ins_deel_omschrijving,
          ins_deel_opmerking,
          ins_deel_upper,
          ins_deel_aanmaak,
          ins_deel_vervaldatum,
          ins_deel_verwijder,
          ins_deel_getekend,
          ins_discipline_key,
          ins_alg_locatie_key,
          ins_deel_parent_key,
          ins_deel_omtrek,
          ins_deel_oppervlak,
          ins_deel_dwgx,
          ins_deel_dwgy,
          ins_deel_dwgz,
          ins_deel_dwgrotatie,
          ins_deel_dwgschaal,
          ins_deel_x,
          ins_deel_y,
          ins_alg_ruimte_key_org,
          ins_alg_ruimte_type_org,
          ins_deel_state,
          ins_deel_statedate,
          ins_deel_t_uitvoertijd,
          ins_deel_actief,
          ins_deel_image,
          ins_deel_mjb_score1,
          ins_deel_mjb_score2,
          prs_perslid_key_beh,
          res_rsv_deel_key,
          bes_bestelopdr_key,
          (SELECT fac.safe_to_number (kmd.ins_kenmerkdeel_waarde)
             FROM ins_kenmerkdeel kmd, ins_kenmerk km, ins_srtkenmerk skm
            WHERE     kmd.ins_deel_key = d.ins_deel_key
                  AND kmd.ins_kenmerk_key = km.ins_kenmerk_key
                  AND km.ins_srtkenmerk_key = skm.ins_srtkenmerk_key
                  AND skm.ins_srtkenmerk_key = 9), -- Kenmerksoort Ultimonummer 
          COALESCE (
             (SELECT fac.safe_to_number (kmd.ins_kenmerkdeel_waarde)
                FROM ins_kenmerkdeel kmd, ins_kenmerk km, ins_srtkenmerk skm
               WHERE     kmd.ins_deel_key = d.ins_deel_key
                     AND kmd.ins_kenmerk_key = km.ins_kenmerk_key
                     AND km.ins_srtkenmerk_key = skm.ins_srtkenmerk_key
                     AND skm.ins_srtkenmerk_key = 9), -- Kenmerksoort Ultimonummer 
             d.ins_deel_key + 100000)
     FROM ins_v_aanwezigdeel d;

CREATE OR REPLACE PROCEDURE mare_import_insp_metrel (p_import_key IN NUMBER)
IS
   c_delim                  VARCHAR2 (1) := ';';
   v_newline                VARCHAR2 (1000);                     -- Input line
   v_errormsg               VARCHAR2 (1000);
   oracle_err_num           NUMBER;
   oracle_err_mes           VARCHAR2 (200);
   v_errorhint              VARCHAR2 (400);
   header_is_valid          NUMBER;
   v_count_tot              NUMBER (10);
   v_count_import           NUMBER (10);
   v_ongeldig               NUMBER (1);
   v_aanduiding             VARCHAR (200);
   -- De importvelden:

   v_projekt                VARCHAR2 (60);
   v_ruimte                 VARCHAR2 (60);
   v_apparaat_nummer        VARCHAR2 (60);
   v_apparaat_naam          VARCHAR2 (60);
   v_status                 VARCHAR2 (60);
   v_gebruiker              VARCHAR2 (60);
   v_testdatum              VARCHAR2 (60);
   v_geldig_tot             VARCHAR2 (60);
   v_locatie                VARCHAR2 (60);
   v_activiteit             VARCHAR2 (60);
   v_commentaar             VARCHAR2 (60);
   v_reparatie_code         VARCHAR2 (60);
   v_visuele_test           VARCHAR2 (60);
   v_isolatie_sonde         VARCHAR2 (60);
   v_vermogen               VARCHAR2 (60);
   v_beschermingsleiding    VARCHAR2 (60);
   v_isolatie               VARCHAR2 (60);

   -- Overig:
   v_ins_controle_datum_d   DATE;                                      -- DATE

   CURSOR c1
   IS
        SELECT *
          FROM fac_imp_file
         WHERE fac_import_key = p_import_key
      ORDER BY fac_imp_file_index;
BEGIN
   DELETE FROM mare_imp_insp_metrel;

   COMMIT;

   -- Het aangeleverde bestand heeft de gegevens komma gescheiden ipv ;
   v_errorhint := 'Delimiter goed zetten';

   UPDATE fac_imp_file
      SET fac_imp_file_line = REPLACE (fac_imp_file_line, '","', ';')
    WHERE fac_import_key = p_import_key;

   -- Ook heeft het aangeleverde bestand "" om de string staan, na bovenstaand om de gehele string zelfs.
   v_errorhint := 'Delimiter goed zetten';

   UPDATE fac_imp_file
      SET fac_imp_file_line = REPLACE (fac_imp_file_line, '"', '')
    WHERE fac_import_key = p_import_key;

   v_count_tot := 0;
   v_count_import := 0;
   header_is_valid := 0;

   FOR rec1 IN c1
   LOOP
      BEGIN
         v_newline := rec1.fac_imp_file_line;
         v_errormsg := 'Fout bij opvragen importregel';
         v_aanduiding := '';
         v_ongeldig := 0;
         -- Lees alle veldwaarden
         fac.imp_getfield (v_newline, c_delim, v_projekt);
         fac.imp_getfield (v_newline, c_delim, v_ruimte);
         fac.imp_getfield (v_newline, c_delim, v_apparaat_nummer);
         fac.imp_getfield (v_newline, c_delim, v_apparaat_naam);
         fac.imp_getfield (v_newline, c_delim, v_status);
         fac.imp_getfield (v_newline, c_delim, v_gebruiker);
         fac.imp_getfield (v_newline, c_delim, v_testdatum);
         fac.imp_getfield (v_newline, c_delim, v_geldig_tot);
         fac.imp_getfield (v_newline, c_delim, v_locatie);
         fac.imp_getfield (v_newline, c_delim, v_activiteit);
         fac.imp_getfield (v_newline, c_delim, v_commentaar);
         fac.imp_getfield (v_newline, c_delim, v_reparatie_code);
         fac.imp_getfield (v_newline, c_delim, v_visuele_test);
         fac.imp_getfield (v_newline, c_delim, v_isolatie_sonde);
         fac.imp_getfield (v_newline, c_delim, v_vermogen);
         fac.imp_getfield (v_newline, c_delim, v_beschermingsleiding);
         fac.imp_getfield (v_newline, c_delim, v_isolatie);


         v_aanduiding :=
            '[' || v_apparaat_nummer || ' (' || v_apparaat_naam || ')] ';

         -- Ik controleer of ik een geldige header heb, dat is: in de juiste kolommen
         -- de juiste kolomkop. Ik controleer daarbij ALLE kolommen!
         -- Ik negeer alles totdat ik een geldige header ben gepasseerd.
         IF (header_is_valid = 0)
         THEN
            IF     UPPER (v_projekt) = 'PROJEKT'
               AND UPPER (v_ruimte) = 'RUIMTE'
               AND UPPER (v_apparaat_nummer) = 'APPARAAT/PROJECT' --Deze header is de enige die qua naam afwijkt van naam variabele
               AND UPPER (v_apparaat_naam) = 'APPARAAT NAAM'
               AND UPPER (v_status) = 'STATUS'
               AND UPPER (v_gebruiker) = 'GEBRUIKER'
               AND UPPER (v_testdatum) = 'TESTDATUM'
               AND UPPER (v_geldig_tot) = 'GELDIG TOT'
               AND UPPER (v_locatie) = 'LOCATIE'
               AND UPPER (v_activiteit) = 'ACTIVITEIT'
               AND UPPER (v_commentaar) = 'COMMENTAAR'
               AND UPPER (v_reparatie_code) = 'REPARATIE CODE'
               AND UPPER (v_visuele_test) = 'VISUELE TEST'
               AND UPPER (v_isolatie_sonde) = 'ISOLATIE SONDE'
               AND UPPER (v_vermogen) = 'VERMOGEN'
               AND UPPER (v_beschermingsleiding) = 'BESCHERMINGSLEIDING'
               AND UPPER (v_isolatie) = 'ISOLATIE'
            THEN
               header_is_valid := 1;
            END IF;
         ELSE
            v_count_tot := v_count_tot + 1;
            -- Controleer alle veldwaarden
            v_errormsg := 'Locatiecode ongeldig';

            v_projekt := TRIM (v_projekt);

            IF LENGTH (v_projekt) > 60
            THEN
               v_projekt := SUBSTR (v_projekt, 1, 60);
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || v_errormsg,
                  'Projekt wordt afgebroken tot [' || v_projekt || ']');
            END IF;


            v_ruimte := TRIM (v_ruimte);

            IF LENGTH (v_ruimte) > 60
            THEN
               v_ruimte := SUBSTR (v_ruimte, 1, 60);
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || v_errormsg,
                  'Ruimte wordt afgebroken tot [' || v_ruimte || ']');
            END IF;

            v_apparaat_nummer := TRIM (v_apparaat_nummer);

            IF LENGTH (v_apparaat_nummer) > 60
            THEN
               v_apparaat_nummer := SUBSTR (v_apparaat_nummer, 1, 60);
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || v_errormsg,
                     'Apparaat nummer wordt afgebroken tot ['
                  || v_apparaat_nummer
                  || ']');
            END IF;

            v_apparaat_naam := TRIM (v_apparaat_naam);

            IF LENGTH (v_apparaat_naam) > 60
            THEN
               v_apparaat_naam := SUBSTR (v_apparaat_naam, 1, 60);
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || v_errormsg,
                     'Apparaat naam wordt afgebroken tot ['
                  || v_apparaat_naam
                  || ']');
            END IF;

            v_status := TRIM (v_status);

            IF LENGTH (v_status) > 60
            THEN
               v_status := SUBSTR (v_status, 1, 60);
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || v_errormsg,
                  'Status wordt afgebroken tot [' || v_status || ']');
            END IF;

            v_gebruiker := TRIM (v_gebruiker);

            IF LENGTH (v_gebruiker) > 60
            THEN
               v_gebruiker := SUBSTR (v_gebruiker, 1, 60);
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || v_errormsg,
                  'Gebruiker wordt afgebroken tot [' || v_gebruiker || ']');
            END IF;

            v_testdatum := TRIM (v_testdatum);

            IF LENGTH (v_testdatum) > 60
            THEN
               v_testdatum := SUBSTR (v_testdatum, 1, 60);
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || v_errormsg,
                  'Testdatum wordt afgebroken tot [' || v_testdatum || ']');
            END IF;

            v_geldig_tot := TRIM (v_geldig_tot);

            IF LENGTH (v_geldig_tot) > 60
            THEN
               v_geldig_tot := SUBSTR (v_geldig_tot, 1, 60);
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || v_errormsg,
                  'Geldig tot wordt afgebroken tot [' || v_geldig_tot || ']');
            END IF;

            v_locatie := TRIM (v_locatie);

            IF LENGTH (v_locatie) > 60
            THEN
               v_locatie := SUBSTR (v_locatie, 1, 60);
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || v_errormsg,
                  'Locatie wordt afgebroken tot [' || v_locatie || ']');
            END IF;

            v_activiteit := TRIM (v_activiteit);

            IF LENGTH (v_activiteit) > 60
            THEN
               v_activiteit := SUBSTR (v_activiteit, 1, 60);
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || v_errormsg,
                  'Activiteit wordt afgebroken tot [' || v_activiteit || ']');
            END IF;

            v_commentaar := TRIM (v_commentaar);

            IF LENGTH (v_commentaar) > 60
            THEN
               v_commentaar := SUBSTR (v_commentaar, 1, 60);
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || v_errormsg,
                  'Commentaar wordt afgebroken tot [' || v_commentaar || ']');
            END IF;

            v_reparatie_code := TRIM (v_reparatie_code);

            IF LENGTH (v_reparatie_code) > 60
            THEN
               v_reparatie_code := SUBSTR (v_reparatie_code, 1, 60);
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || v_errormsg,
                     'Reparatiecode wordt afgebroken tot ['
                  || v_reparatie_code
                  || ']');
            END IF;

            v_visuele_test := TRIM (v_visuele_test);

            IF LENGTH (v_visuele_test) > 60
            THEN
               v_visuele_test := SUBSTR (v_visuele_test, 1, 60);
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || v_errormsg,
                     'Visuele test wordt afgebroken tot ['
                  || v_visuele_test
                  || ']');
            END IF;

            v_isolatie_sonde := TRIM (v_isolatie_sonde);

            IF LENGTH (v_isolatie_sonde) > 60
            THEN
               v_isolatie_sonde := SUBSTR (v_isolatie_sonde, 1, 60);
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || v_errormsg,
                     'Isolatie sonde wordt afgebroken tot ['
                  || v_isolatie_sonde
                  || ']');
            END IF;

            v_vermogen := TRIM (v_vermogen);

            IF LENGTH (v_vermogen) > 60
            THEN
               v_vermogen := SUBSTR (v_vermogen, 1, 60);
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || v_errormsg,
                  'Vermogen wordt afgebroken tot [' || v_vermogen || ']');
            END IF;

            v_beschermingsleiding := TRIM (v_beschermingsleiding);

            IF LENGTH (v_beschermingsleiding) > 60
            THEN
               v_beschermingsleiding := SUBSTR (v_beschermingsleiding, 1, 60);
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || v_errormsg,
                     'Beschermingsgeleiding wordt afgebroken tot ['
                  || v_beschermingsleiding
                  || ']');
            END IF;

            v_isolatie := TRIM (v_isolatie);

            IF LENGTH (v_isolatie) > 60
            THEN
               v_isolatie := SUBSTR (v_isolatie, 1, 60);
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || v_errormsg,
                  'Isolatie wordt afgebroken tot [' || v_isolatie || ']');
            END IF;

            -- Insert geformatteerde import record
            IF v_ongeldig = 0
            THEN
               BEGIN
                  v_errormsg := 'Fout bij wegschrijven importregel';

                  INSERT INTO mare_imp_insp_metrel (alg_locatie_code,
                                                    ins_deel_omschrijving,
                                                    ins_srtcontrole_omschrijving,
                                                    ins_deelsrtcontrole_datum,
                                                    ins_deelsrtcontrole_opmerking,
                                                    apparaatnummer,
                                                    gebruiker,
                                                    status,
                                                    visuele_test,
                                                    isolatie_sonde,
                                                    vermogen,
                                                    beschermingsleiding,
                                                    isolatie)
                      VALUES (v_locatie,
                              v_apparaat_naam,
                              'Metrel',
                              v_testdatum,
                              v_commentaar,
                              v_apparaat_nummer,
                              v_gebruiker,
                              v_status,
                              v_visuele_test,
                              v_isolatie_sonde,
                              v_vermogen,
                              v_beschermingsleiding,
                              v_isolatie);

                  COMMIT;
                  v_count_import := v_count_import + 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
                        || ')';
                     fac.imp_writelog (p_import_key,
                                       'W',
                                       v_aanduiding || v_errormsg,
                                       '');

                     COMMIT;
               END;
            END IF;
         END IF;
      END;
   END LOOP;

   IF (header_is_valid = 0)
   THEN
      fac.imp_writelog (p_import_key,
                        'E',
                        'Ongeldig importbestand',
                        'Geen header of header niet volgens specificatie!');
   ELSE
      fac.imp_writelog (
         p_import_key,
         'S',
         'Inspectieobjecten/aantal ingelezen importregels: '
         || TO_CHAR (v_count_tot),
         '');
      fac.imp_writelog (
         p_import_key,
         'S',
         'Inspectieobjecten/aantal ongeldige niet ingelezen 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, 200);
      v_errormsg :=
            v_errormsg
         || ' ORACLE (error '
         || oracle_err_num
         || '/'
         || oracle_err_mes
         || ')';
      fac.imp_writelog (
         p_import_key,
         'E',
         v_aanduiding || v_errormsg,
         'Inleesproces inspectieobjecten afgebroken!' || v_errorhint);
END mare_import_insp_metrel;
/

CREATE OR REPLACE PROCEDURE mare_update_insp_metrel (p_import_key IN NUMBER)
AS
   v_errormsg                  VARCHAR2 (1000);
   oracle_err_num              NUMBER;
   oracle_err_mes              VARCHAR2 (200);
   v_count                     NUMBER (10);
   v_count_tot                 NUMBER (10);
   v_count_cupdate             NUMBER (10);
   v_aanduiding                VARCHAR (200);

   CURSOR c1
   IS
      SELECT i.alg_locatie_code,
             i.ins_deel_omschrijving,
             i.ins_srtcontrole_omschrijving,
             i.ins_deelsrtcontrole_datum,
             i.ins_deelsrtcontrole_opmerking,
             i.apparaatnummer,
             i.gebruiker,
             i.status,
             i.visuele_test,
             i.isolatie_sonde,
             i.vermogen,
             i.beschermingsleiding,
             i.isolatie,
             ad.ins_srtdeel_key,
             g.ins_srtgroep_key,
             ad.ins_discipline_key,
             al.alg_locatie_key,
             sc.ins_srtcontrole_key,
             sc.ins_srtinstallatie_key,
             ad.ins_deel_key,
             u.ultimonummer,
             u.uniek_nummer
        FROM mare_imp_insp_metrel i,
             ins_srtcontrole sc,
             ins_v_aanwezigdeel ad,
             ins_srtdeel sd,
             ins_srtgroep g,
             alg_v_aanweziglocatie al,
             mare_v_objectnummers u
       WHERE     fac.safe_to_number (i.apparaatnummer) = u.uniek_nummer
             AND ad.ins_deel_key = u.ins_deel_key(+)
             AND sd.ins_srtdeel_key(+) = ad.ins_srtdeel_key
             AND g.ins_srtgroep_key(+) = sd.ins_srtgroep_key
             AND al.alg_locatie_key(+) = ad.ins_alg_locatie_key
             AND sd.ins_srtdeel_key = sc.ins_srtinstallatie_key
             AND sc.ins_srtcontrole_niveau = 'S'
             AND UPPER (sc.ins_srtcontrole_omschrijving) LIKE '%METREL%';

   v_deel_key                  NUMBER (10);
   v_kenmerk_key               NUMBER (10);
   v_kenmerkdeel_key           NUMBER (10);
   v_srtcontrole_id            VARCHAR2 (20);
   v_controlemode_succes_key   NUMBER (10);
   v_controlemode_afkeur_key   NUMBER (10);
   v_deelsrtcontrole_key       NUMBER (10);
BEGIN
   v_count := 0;
   v_count_tot := 0;
   v_count_cupdate := 0;
   v_aanduiding := '';

   --
   FOR rec IN c1
   LOOP
      BEGIN
         v_count_tot := v_count_tot + 1;
         v_aanduiding :=
               '['
            || rec.ins_deel_omschrijving
            || '|'
            || rec.alg_locatie_code
            || '|'
            || rec.ins_srtcontrole_omschrijving
            || '|'
            || rec.ins_deelsrtcontrole_datum
            || '] ';

         -- We kunnen alleen iets met objecten die we kennen!
         IF (rec.ins_deel_key IS NULL OR rec.alg_locatie_key IS NULL)
         THEN
            fac.imp_writelog (
               p_import_key,
               'E',
               'Objectcode onbekend (binnen locatie); regel wordt overgeslagen',
               v_aanduiding);
            CONTINUE;
         END IF;

         -- Zonder datum doen we niks
         IF (rec.ins_deelsrtcontrole_datum IS NULL)
         THEN
            fac.imp_writelog (
               p_import_key,
               'E',
               'Geen datum ingevuld; regel wordt overgeslagen',
               v_aanduiding);
            CONTINUE;
         END IF;

         -- Kennen we de srtcontrole uberhaupt?
         IF (rec.ins_srtcontrole_key IS NULL)
         THEN
            fac.imp_writelog (
               p_import_key,
               'E',
               'Soort taak onbekend; regel wordt overgeslagen',
               v_aanduiding);
            CONTINUE;
         END IF;

         -- En hoort die srtcontrole ook bij deze objectsoort/-groep/discipline?
         v_errormsg := 'srtcontrole bij objectsoort';

         SELECT COUNT ( * )
           INTO v_count
           FROM ins_srtcontrole sc
          WHERE sc.ins_srtcontrole_key = rec.ins_srtcontrole_key
                AND sc.ins_srtinstallatie_key =
                      DECODE (sc.ins_srtcontrole_niveau,
                              'S', rec.ins_srtdeel_key,
                              'G', rec.ins_srtgroep_key,
                              'D', rec.ins_discipline_key);

         -- Nee --> overslaan
         IF (v_count = 0)
         THEN
            fac.imp_writelog (
               p_import_key,
               'E',
               'Soort taak hoort niet bij object; regel wordt overgeslagen',
               v_aanduiding);
            CONTINUE;
         END IF;

         -- TODO: kan een srtcontrole meerdere malen aan een object gekoppeld zijn? Dan dat nog specifieker bepalen?

         IF (rec.ins_deelsrtcontrole_datum IS NULL)
         THEN
            fac.imp_writelog (
               p_import_key,
               'E',
               'Geen datum opgegeven; regel wordt overgeslagen',
               v_aanduiding);
            CONTINUE;
         END IF;

         v_errormsg := 'Fout bij bepalen controlemethode succes';

         SELECT MIN (cm.ins_controlemode_key)
           INTO v_controlemode_succes_key
           FROM ins_controlemode cm, ctr_disc_params dp, ins_srtcontrole sc
          WHERE cm.ins_controlemode_success = 1
                AND cm.ins_srtcontrole_type =
                      dp.ctr_disc_params_controle_type
                AND dp.ctr_ins_discipline_key = sc.ctr_discipline_key
                AND sc.ins_srtcontrole_key = rec.ins_srtcontrole_key;

         v_errormsg := 'Fout bij bepalen controlemethode afgekeurd';

         SELECT MIN (cm.ins_controlemode_key)
           INTO v_controlemode_afkeur_key
           FROM ins_controlemode cm, ctr_disc_params dp, ins_srtcontrole sc
          WHERE cm.ins_controlemode_success = 0
                AND cm.ins_srtcontrole_type =
                      dp.ctr_disc_params_controle_type
                AND dp.ctr_ins_discipline_key = sc.ctr_discipline_key
                AND sc.ins_srtcontrole_key = rec.ins_srtcontrole_key;

         -- TODO: ins_deelsrtcontrole_datum_org is de datum waarop de taak eigenlijk gedaan had
         -- moeten worden. Die staat bij taken met standaardperiode 0 in ins_srtcontroledl_xcp en
         -- zal doorgaans afwijken van de datum in het importbestand.
         v_errormsg := 'Fout bij toevoegen controle';

         INSERT INTO ins_deelsrtcontrole (ins_deel_key,
                                          ins_srtcontrole_key,
                                          ins_deelsrtcontrole_datum,
                                          ins_deelsrtcontrole_datum_org,
                                          ins_controlemode_key,
                                          ins_deelsrtcontrole_opmerking)
             VALUES (rec.ins_deel_key,
                     rec.ins_srtcontrole_key,
                     SYSDATE,
                     SYSDATE,
                     DECODE (NULL,                             --rec.afgekeurd
                             NULL, v_controlemode_succes_key,
                             v_controlemode_afkeur_key),
                     rec.ins_deelsrtcontrole_opmerking)
          RETURNING ins_deelsrtcontrole_key
               INTO v_deelsrtcontrole_key;

         IF (rec.status IS NOT NULL)
         THEN
            BEGIN
               v_errormsg := 'Fout bij bepalen kenmerk Status';

               SELECT MIN (ins_kenmerk_key)
                 INTO v_kenmerk_key
                 FROM ins_kenmerk k, ins_srtkenmerk sk, ins_srtcontrole sc
                WHERE     k.ins_kenmerk_niveau = 'C'
                      AND k.ins_srtinstallatie_key = sc.ins_srtcontrole_key
                      AND k.ins_kenmerk_verwijder IS NULL
                      AND k.ins_srtinstallatie_key = rec.ins_srtcontrole_key
                      AND k.ins_srtkenmerk_key = 41;    --Taakkenmerk 'Status'

               v_errormsg := 'Kenmerk Status vastleggen';

               INSERT INTO ins_kmdeelsrtcontr (ins_deelsrtcontrole_key,
                                               ins_kenmerk_key,
                                               ins_kmdeelsrtcontr_waarde)
                   VALUES (v_deelsrtcontrole_key, v_kenmerk_key, rec.status);
            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
                     || ')';
                  fac.imp_writelog (p_import_key,
                                    'E',
                                    v_errormsg,
                                    v_aanduiding);
            END;
         END IF;


         IF (rec.visuele_test IS NOT NULL)
         THEN
            BEGIN
               v_errormsg := 'Fout bij bepalen kenmerk Visuele test';

               SELECT MIN (ins_kenmerk_key)
                 INTO v_kenmerk_key
                 FROM ins_kenmerk k, ins_srtkenmerk sk, ins_srtcontrole sc
                WHERE     k.ins_kenmerk_niveau = 'C'
                      AND k.ins_srtinstallatie_key = sc.ins_srtcontrole_key
                      AND k.ins_kenmerk_verwijder IS NULL
                      AND k.ins_srtinstallatie_key = rec.ins_srtcontrole_key
                      AND k.ins_srtkenmerk_key = 42; --Taakkenmerk 'Visuele test'

               v_errormsg := 'Kenmerk Visuele test vastleggen';

               INSERT INTO ins_kmdeelsrtcontr (ins_deelsrtcontrole_key,
                                               ins_kenmerk_key,
                                               ins_kmdeelsrtcontr_waarde)
                   VALUES (v_deelsrtcontrole_key,
                           v_kenmerk_key,
                           rec.visuele_test);
            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
                     || ')';
                  fac.imp_writelog (p_import_key,
                                    'E',
                                    v_errormsg,
                                    v_aanduiding);
            END;
         END IF;

         IF (rec.isolatie_sonde IS NOT NULL)
         THEN
            BEGIN
               v_errormsg := 'Fout bij bepalen kenmerk Isolatie sonde';

               SELECT MIN (ins_kenmerk_key)
                 INTO v_kenmerk_key
                 FROM ins_kenmerk k, ins_srtkenmerk sk, ins_srtcontrole sc
                WHERE     k.ins_kenmerk_niveau = 'C'
                      AND k.ins_srtinstallatie_key = sc.ins_srtcontrole_key
                      AND k.ins_kenmerk_verwijder IS NULL
                      AND k.ins_srtinstallatie_key = rec.ins_srtcontrole_key
                      AND k.ins_srtkenmerk_key = 43; --Taakkenmerk 'Isolatie sonde'

               v_errormsg := 'Kenmerk Isolatie sonde vastleggen';

               INSERT INTO ins_kmdeelsrtcontr (ins_deelsrtcontrole_key,
                                               ins_kenmerk_key,
                                               ins_kmdeelsrtcontr_waarde)
                   VALUES (v_deelsrtcontrole_key,
                           v_kenmerk_key,
                           rec.isolatie_sonde);
            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
                     || ')';
                  fac.imp_writelog (p_import_key,
                                    'E',
                                    v_errormsg,
                                    v_aanduiding);
            END;
         END IF;

         IF (rec.vermogen IS NOT NULL)
         THEN
            BEGIN
               v_errormsg := 'Fout bij bepalen kenmerk Vermogen';

               SELECT MIN (ins_kenmerk_key)
                 INTO v_kenmerk_key
                 FROM ins_kenmerk k, ins_srtkenmerk sk, ins_srtcontrole sc
                WHERE     k.ins_kenmerk_niveau = 'C'
                      AND k.ins_srtinstallatie_key = sc.ins_srtcontrole_key
                      AND k.ins_kenmerk_verwijder IS NULL
                      AND k.ins_srtinstallatie_key = rec.ins_srtcontrole_key
                      AND k.ins_srtkenmerk_key = 44;  --Taakkenmerk 'Vermogen'

               v_errormsg := 'Kenmerk Vermogen vastleggen';

               INSERT INTO ins_kmdeelsrtcontr (ins_deelsrtcontrole_key,
                                               ins_kenmerk_key,
                                               ins_kmdeelsrtcontr_waarde)
                   VALUES (v_deelsrtcontrole_key, v_kenmerk_key, rec.vermogen);
            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
                     || ')';
                  fac.imp_writelog (p_import_key,
                                    'E',
                                    v_errormsg,
                                    v_aanduiding);
            END;
         END IF;

         IF (rec.beschermingsleiding IS NOT NULL)
         THEN
            BEGIN
               v_errormsg := 'Fout bij bepalen kenmerk Beschermingsleiding';

               SELECT MIN (ins_kenmerk_key)
                 INTO v_kenmerk_key
                 FROM ins_kenmerk k, ins_srtkenmerk sk, ins_srtcontrole sc
                WHERE     k.ins_kenmerk_niveau = 'C'
                      AND k.ins_srtinstallatie_key = sc.ins_srtcontrole_key
                      AND k.ins_kenmerk_verwijder IS NULL
                      AND k.ins_srtinstallatie_key = rec.ins_srtcontrole_key
                      AND k.ins_srtkenmerk_key = 45; --Taakkenmerk 'Beschermingsleiding'

               v_errormsg := 'Kenmerk Beschermingsleiding vastleggen';

               INSERT INTO ins_kmdeelsrtcontr (ins_deelsrtcontrole_key,
                                               ins_kenmerk_key,
                                               ins_kmdeelsrtcontr_waarde)
                   VALUES (v_deelsrtcontrole_key,
                           v_kenmerk_key,
                           rec.beschermingsleiding);
            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
                     || ')';
                  fac.imp_writelog (p_import_key,
                                    'E',
                                    v_errormsg,
                                    v_aanduiding);
            END;
         END IF;


         IF (rec.isolatie IS NOT NULL)
         THEN
            BEGIN
               v_errormsg := 'Fout bij bepalen kenmerk Isolatie';

               SELECT MIN (ins_kenmerk_key)
                 INTO v_kenmerk_key
                 FROM ins_kenmerk k, ins_srtkenmerk sk, ins_srtcontrole sc
                WHERE     k.ins_kenmerk_niveau = 'C'
                      AND k.ins_srtinstallatie_key = sc.ins_srtcontrole_key
                      AND k.ins_kenmerk_verwijder IS NULL
                      AND k.ins_srtinstallatie_key = rec.ins_srtcontrole_key
                      AND k.ins_srtkenmerk_key = 46;  --Taakkenmerk 'Isolatie'

               v_errormsg := 'Kenmerk Isolatie vastleggen';

               INSERT INTO ins_kmdeelsrtcontr (ins_deelsrtcontrole_key,
                                               ins_kenmerk_key,
                                               ins_kmdeelsrtcontr_waarde)
                   VALUES (v_deelsrtcontrole_key, v_kenmerk_key, rec.isolatie);
            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
                     || ')';
                  fac.imp_writelog (p_import_key,
                                    'E',
                                    v_errormsg,
                                    v_aanduiding);
            END;
         END IF;

         v_count_cupdate := v_count_cupdate + 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
               || ')';
            fac.imp_writelog (p_import_key,
                              'E',
                              v_errormsg,
                              v_aanduiding);
      END;
   END LOOP;

   fac.imp_writelog (p_import_key,
                     'S',
                     'Aantal ingelezen taken: ' || TO_CHAR (v_count_tot),
                     '');
   fac.imp_writelog (p_import_key,
                     'S',
                     'Aantal verwerkte taken: ' || TO_CHAR (v_count_cupdate),
                     '');
   COMMIT;
END mare_update_insp_metrel;
/

------ payload end   ------

SET DEFINE OFF
BEGIN adm.systrackscriptId ('$Id$', 0); END;
/

COMMIT;
SET ECHO OFF
SPOOL OFF
SET DEFINE ON
PROMPT Logfile of this upgrade is: &fcltlogfile
