--
-- $Id$
--
-- Script containing customer specific db-configuration for PLATO

DEFINE thisfile = 'PLAT.SQL'
DEFINE dbuser   = '^(PLAT|WO)'

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



----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-- ALG Onroerend Goed 1 import (locaties + gebouwen)
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

CREATE OR REPLACE PROCEDURE plat_post_import_onrgoed1 (p_import_key IN NUMBER)
AS
	v_errorhint               VARCHAR2 (400);
BEGIN
   v_errorhint := 'plat_post_import_onrgoed1';
END;
/


CREATE OR REPLACE PROCEDURE plat_import_onrgoed1 (p_import_key IN NUMBER)
AS
   oracle_err_num            NUMBER;
   oracle_err_mes            VARCHAR2 (200);
   v_errormsg                VARCHAR2 (400);
   v_errorhint               VARCHAR2 (400);
BEGIN


  v_errorhint := 'plat_import_onrgoed1';

	fac_import_onrgoed1(p_import_key);
	COMMIT;

	-- After import korrektie gebeurt nu...
	plat_post_import_onrgoed1(p_import_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);
END plat_import_onrgoed1;
/



CREATE OR REPLACE PROCEDURE plat_post_onrgoed1_exploitatie (p_import_key IN NUMBER, p_max_alg_gebouw_key IN NUMBER)
AS
	v_errorhint               VARCHAR2 (400);
	v_count_tot								NUMBER(10);
	v_errormsg                VARCHAR2 (400);
	oracle_err_num            NUMBER;
  oracle_err_mes            VARCHAR2 (200);


	-- locatiecode is uniek (over de hele DB heen), en gebouwcode is uniek binnen de locatiecode.
	-- Let op: locatiecode is in DB in UPPER, gebouwcode is in DB niet upper, die staat in de kolom alg_gebouw_upper.

	-- Alle locaties met hun gebouwen in de database die NIET in het importbestand staan, en die dus kunnen worden verwijderd.
	-- Als die de vorige keer niet verwijderd was, want dan blijven we verwijderen natuurlijk, 1x is genoeg.
	-- De vorige verwijderd betekent (tot nu toe gekozen) dat vervaldatum in het verleden ligt; zie TODO hieronder bij het zetten van de vervaldatum (ipv verwijderdatum).

	CURSOR c1
  IS
 		SELECT l.alg_locatie_key, l.alg_locatie_code, g.alg_gebouw_key, g.alg_gebouw_code, g.alg_gebouw_upper
    FROM alg_locatie l, alg_gebouw g
    WHERE g.alg_locatie_key = l.alg_locatie_key
    AND l.alg_locatie_verwijder IS NULL
    AND g.alg_gebouw_verwijder IS NULL
    AND COALESCE(g.alg_gebouw_vervaldatum,SYSDATE) >= SYSDATE
    AND NOT EXISTS (SELECT 'x' FROM fac_imp_onrgoed1 og
                                    WHERE UPPER(og.alg_locatie_code) = l.alg_locatie_code
                                    AND UPPER(og.alg_gebouw_code) = g.alg_gebouw_upper);
BEGIN
	-- Alle gebouwen krijgen een alg-gebouw_vervaldatum als deze is gevuld in kolom S (flexprop 'Eindjaar' met alg_kenmerk_key = 2).
 	v_errorhint := 'plat_post_onrgoed1_exploitatie';

 	-- Werk alle vervaldatums van de gebouwen bij die nog in de DB staan met de waarde uit kenmerk 'Einde exploitatie' (key 2) die bij de locatie  (van het gebouw) staat geregistreerd.
	-- In kenmerk 'Einde exploitatie' staat het jaartal van einde, die gaan we nog voorzien van de laatste dag in dat jaar, oftewel '31 dec'
	UPDATE alg_gebouw g
	SET g.alg_gebouw_vervaldatum = (SELECT fac.safe_to_date ('31-12-' || SUBSTR (og.alg_kenmerkwaarde2, INSTR (og.alg_kenmerkwaarde2, '=') + 1),'dd-mm-yyyy') waarde1
                                    FROM fac_imp_onrgoed1 og
                                    WHERE UPPER(og.alg_locatie_code) = (SELECT alg_locatie_code FROM alg_locatie l WHERE l.alg_locatie_key = g.alg_locatie_key)
                                    AND UPPER(og.alg_gebouw_code) = g.alg_gebouw_upper)
	WHERE g.alg_gebouw_verwijder IS NULL;

 	FOR rec IN c1
	LOOP

			 fac.imp_writelog (p_import_key,
      	               	'I',
                     		'Gebouw ' || rec.alg_gebouw_code || '(locatie ' || rec.alg_locatie_code || ') is verwijderd cq. vervaldatum op vorig jaar gezet: ' || 'gebouw key=[' || TO_CHAR(rec.alg_gebouw_key) || ']',
                     		'');
			 -- We gaan het gebouw niet verwijderen, wellicht komt dat nog (TODO),
			 -- want voor het verwijderen van gebouw moeten ALLE onderliggende zaken (controles, objecten, ruimten, verdiepingen) eerst worden verwijderd.
			 -- Iets too much voor dit moment, en eh..., je bent die historie ook direct kwijt.

			 -- Dus vooralsnog zetten we hier de einde exploitatietijd met de huidige jaartal MINUS 1, op 31 dec (dus vandaag = 10 aug 2016, dan vervaldatum = 31 dec 2015)
			 UPDATE alg_gebouw
			 -- SET alg_gebouw_verwijder = SYSDATE
			 SET alg_gebouw_vervaldatum = fac.safe_to_date('31-12-' || (TO_CHAR(SYSDATE,'YYYY') - 1), 'dd-mm-yyyy')
			 WHERE alg_gebouw_key = rec.alg_gebouw_key;
	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);
END plat_post_onrgoed1_exploitatie;
/


CREATE OR REPLACE PROCEDURE plat_post_onrgoed1_gebouw_kenm (p_import_key IN NUMBER, p_max_alg_gebouw_key IN NUMBER)
AS
  v_errorhint               VARCHAR2 (400);
  v_aanduiding              VARCHAR2 (1000);
  v_count_tot               NUMBER(10);
  v_errormsg                VARCHAR2 (400);
  oracle_err_num            NUMBER;
  oracle_err_mes            VARCHAR2 (200);

  v_alg_gebouw_key          NUMBER(10);
  v_alg_gebouw_naam					VARCHAR2(200);
  c_kenmerk_bouwjaar_G      NUMBER(10);
  c_kenmerk_aant_percelen_L NUMBER(10);
  c_kenmerk_aant_percelen_G NUMBER(10);

  c_kenmerk_gebouw_gewijzigd NUMBER(10);
  l_alg_gebouw_changed			 NUMBER(10);
  v_aantal_perc_G						NUMBER(10);
  v_aant_percelen           NUMBER(10);

  CURSOR c1
  IS
    SELECT alg_locatie_code, alg_gebouw_code, alg_gebouw_naam, SUBSTR (alg_kenmerkwaarde1, INSTR (alg_kenmerkwaarde1, '=') + 1) bouwjaar, SUBSTR (alg_kenmerkwaarde3, INSTR (alg_kenmerkwaarde3, '=') + 1) aant_percelen FROM fac_imp_onrgoed1;

  CURSOR c2
  IS
    SELECT alg_locatie_key FROM alg_locatie;

BEGIN

	-- Gebouw kenmerk 'Bouwjaar'
	c_kenmerk_bouwjaar_G := 5;


	-- Locatie kenmerk 'Aantal percelen'
	c_kenmerk_aant_percelen_L := 3;
	-- Gebouw kenmerk 'Aantal percelen'
	c_kenmerk_aant_percelen_G := 4;

	-- PLAT#51326: Signalering op gewijzigde clusters
	-- Gebouw kenmerk 'Gebouw is (recentelijk) gewijzigd'
	c_kenmerk_gebouw_gewijzigd := 6;
	l_alg_gebouw_changed := 0;

	-- Alle gebouwen krijgen voor 'aantal percelen' een nieuw record (als die nog niet bestond) of een bijgewerkt record (als die al wel bestond)
	-- Let op: b.v. een gebouw heeft 123 percelen, dan staat alg_kenmerkwaarde3 staat de waarde "3=123", waarbij de = het scheidingsteken is tussen key 3 en aantal percelen (123)
	--         key 3 refereert aan kenmerk 'aantal percelen' op locatie-nivo (dit doet de algemene import), we moeten dit aantal (123) inserten/updaten in het aantal percelen op gebouw nivo (key 4)!



	v_errorhint := '#1: Aantal Percelen / bouwjaar';

 	FOR rec IN c1
	LOOP
	    l_alg_gebouw_changed := 0;

	    v_aanduiding := 'Locatie:' ||rec.alg_locatie_code || ', gebouw: ' || rec.alg_gebouw_code || 'naam:' || rec.alg_gebouw_naam;
	    v_errorhint := '#2: SELECT MIN(alg_gebouw_key)';

	    SELECT MIN(alg_gebouw_key)
	    INTO v_alg_gebouw_key
	    FROM alg_gebouw g, alg_locatie l
	    WHERE g.alg_gebouw_upper = UPPER(rec.alg_gebouw_code)
	    AND l.alg_locatie_code = UPPER(rec.alg_locatie_code)
	    AND g.alg_locatie_key = l.alg_locatie_key
      AND l.alg_locatie_verwijder IS NULL
      AND g.alg_gebouw_verwijder IS NULL;

      IF v_alg_gebouw_key IS NOT NULL
      THEN

      	IF v_alg_gebouw_key <= p_max_alg_gebouw_key
      	THEN
      		-- Was al een bestaand gebouw, oftewel gebouw is niet zojuist toegevoegd via deze import.
      		-- We gaan wel checken of er enkele (cruciale) wijzigingen zijn sinds met deze nieuwe import tbv PLAT#51326: Signalering op gewijzigde clusters
					v_errorhint := '#3: SELECT alg_gebouw_naam';
	      	SELECT alg_gebouw_naam
	      	INTO v_alg_gebouw_naam
	      	FROM alg_gebouw
	      	WHERE alg_gebouw_key = v_alg_gebouw_key;

	      	IF (rec.alg_gebouw_naam IS NOT NULL) AND
	      		 (UPPER(rec.alg_gebouw_naam) <> UPPER(v_alg_gebouw_naam))
	      	THEN
						-- Er is een wijziging in de gebouwnaam
						l_alg_gebouw_changed := 1;
						v_errorhint := '#4: fac.trackaction #ALGGUP';
						fac.trackaction ('#ALGGUP', v_alg_gebouw_key, NULL, NULL, 'Clusternaam is gewijzigd van waarde ' || v_alg_gebouw_naam || ' in: ' || rec.alg_gebouw_naam);
					END IF;

	      	-- PLAT#51326: Signalering op gewijzigde clusters
	      	v_errorhint := '#5: v_aantal_perc_G';
	      	SELECT MAX(alg_onrgoedkenmerk_waarde)
	      	INTO v_aantal_perc_G
	      	FROM alg_onrgoedkenmerk
	        WHERE alg_kenmerk_key = c_kenmerk_aant_percelen_G
	        AND alg_onrgoed_key = v_alg_gebouw_key
	        AND alg_onrgoed_niveau = 'G'
	        AND alg_onrgoedkenmerk_verwijder IS NULL;

	        IF (v_aantal_perc_G IS NULL AND rec.aant_percelen IS NOT NULL) OR
	        	 (v_aantal_perc_G IS NOT NULL AND rec.aant_percelen IS NULL) OR
	        	 (fac.safe_to_number(v_aantal_perc_G) <> fac.safe_to_number(rec.aant_percelen))
					THEN
						-- Er is een wijziging in het aantal percelen.
						l_alg_gebouw_changed := 1;
						v_errorhint := '#6: fac.trackaction #ALGGUP';
						fac.trackaction ('#ALGGUP', v_alg_gebouw_key, NULL, NULL, 'Aantal percelen gewijzigd van waarde ' || COALESCE(TO_CHAR(v_aantal_perc_G), 'Geen') || ' in: ' || COALESCE(TO_CHAR(rec.aant_percelen), 'Geen'));
					END IF;
					IF (l_alg_gebouw_changed = 1)
					THEN
						fac.imp_writelog (p_import_key, 'I', 'Cluster gewijzigd', v_aanduiding);
					END IF;
				ELSE
					-- Is een nieuw toegevoegd gebouw zojuist via deze import
					l_alg_gebouw_changed := 1;
					v_errorhint := '#7: fac.trackaction #ALGGUP';
					fac.imp_writelog (p_import_key, 'I', 'Cluster toegevoegd', v_aanduiding);
					fac.trackaction ('#ALGGUP', v_alg_gebouw_key, NULL, NULL, 'Cluster is nieuw/toegevoegd');
				END IF;
				v_errorhint := '#8: Update gebouwnaam';
				UPDATE alg_gebouw
				SET alg_gebouw_naam = rec.alg_gebouw_naam
				WHERE alg_gebouw_key = v_alg_gebouw_key;

				v_errorhint := '#9: alg.upsertkenmerk (c_kenmerk_bouwjaar_G';
        alg.upsertkenmerk (c_kenmerk_bouwjaar_G, v_alg_gebouw_key, rec.bouwjaar);
        v_errorhint := '#10: alg.upsertkenmerk (c_kenmerk_aant_percelen_G';
        alg.upsertkenmerk (c_kenmerk_aant_percelen_G, v_alg_gebouw_key, rec.aant_percelen);

        IF (l_alg_gebouw_changed = 1)
        THEN
        	v_errorhint := '#11: alg.upsertkenmerk (c_kenmerk_gebouw_gewijzigd';
        	alg.upsertkenmerk (c_kenmerk_gebouw_gewijzigd, v_alg_gebouw_key, 1);
      	END IF;

      END IF;
  END LOOP;
  COMMIT;

  -- Ten slotte gaan we het aantal percelen op locatie-nivo nog bijwerken door een SUM te doen van de gebouwen te doen...
  FOR rec IN c2
	LOOP
    SELECT SUM (fac.safe_to_number(alg_onrgoedkenmerk_waarde))
    INTO v_aant_percelen
    FROM alg_onrgoedkenmerk
    WHERE alg_kenmerk_key = c_kenmerk_aant_percelen_G
    AND alg_onrgoed_key IN (SELECT g.alg_gebouw_key FROM alg_gebouw g WHERE g.alg_locatie_key = rec.alg_locatie_key);

    alg.upsertkenmerk (c_kenmerk_aant_percelen_L, rec.alg_locatie_key, v_aant_percelen);
  END LOOP;
  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 || ' - '|| v_aanduiding);
END plat_post_onrgoed1_gebouw_kenm;
/



CREATE OR REPLACE PROCEDURE plat_post_update_onrgoed1 (p_import_key IN NUMBER, p_max_alg_gebouw_key IN NUMBER)
AS
	v_errorhint               VARCHAR2 (400);
	v_errormsg                VARCHAR2 (400);
	v_count_tot								NUMBER(10);
	oracle_err_num            NUMBER;
  oracle_err_mes            VARCHAR2 (200);
BEGIN
    v_errorhint := 'plat_post_update_onrgoed1';

    -- Voor alle gebouwen willen we de einddatum / einde exploitatie (alg_gebouw_vervaldatum) updaten.
    -- Uitdaging is dat de import

		plat_post_onrgoed1_exploitatie (p_import_key, p_max_alg_gebouw_key);

		-- Verwerking van aantal percelen in gebouw, en optellen bij locatie (som van alle gebouwen).
		-- PLAT#41493: TB035 Cluster bevat niet het aantal percelen
		-- PLAT#41494: Verschuiving van kenmerken van complex naar cluster: bouwjaar en vervaljaar
		plat_post_onrgoed1_gebouw_kenm (p_import_key, p_max_alg_gebouw_key);


		-- Alleen voor de nieuwe gebouwen moeten we 1 (dummy) verdieping en 1 (dummy) ruimte toevoegen...

		-- Dus Dummy verdieping voor elk toegevoegd alg_gebouw (dus waar alg_gebouw_key > p_max_alg_gebouw_key)
    INSERT INTO alg_verdieping (alg_gebouw_key, alg_verdieping_omschrijving, alg_verdieping_code,  alg_verdieping_volgnr)
		SELECT alg_gebouw_key, '-', '_-', 0
		FROM alg_gebouw
		WHERE alg_gebouw_key > p_max_alg_gebouw_key;


		SELECT COUNT(*)
		INTO v_count_tot
		FROM alg_verdieping
		WHERE alg_gebouw_key > p_max_alg_gebouw_key;

		fac.imp_writelog (p_import_key,
                     'S',
                     'Verdieping/#toegevoegd: ' || TO_CHAR (v_count_tot),
                     '');

		-- Dummy ruimte voor elk toegevoegd dummy alg_verdieping (dus waar alg_gebouw_key > p_max_alg_gebouw_key)
		INSERT INTO alg_ruimte (alg_verdieping_key, alg_ruimte_nr)
		SELECT alg_verdieping_key, '_1' FROM alg_verdieping
		WHERE alg_gebouw_key > p_max_alg_gebouw_key;

		SELECT COUNT(*)
		INTO v_count_tot
		FROM alg_ruimte
		WHERE alg_verdieping_key IN	(SELECT	alg_verdieping_key
																	FROM alg_verdieping
																	WHERE alg_gebouw_key > p_max_alg_gebouw_key);

		fac.imp_writelog (p_import_key,
                   'S',
                   'Ruimte/#toegevoegd: ' || TO_CHAR (v_count_tot),
                   '');
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 plat_post_update_onrgoed1;
/


CREATE OR REPLACE PROCEDURE plat_update_onrgoed1 (
   p_import_key IN NUMBER
) IS

	v_count           			NUMBER;
	v_max_alg_gebouw_key		NUMBER(10);
BEGIN

  -- Even snel registreren wat de laatst toegevoegde alg_gebouw is, dan weten we dat er door deze import-procedure wordt toegevoegd (alles > dan deze max).
  SELECT coalesce(max(alg_gebouw_key),0)
  INTO v_max_alg_gebouw_key
  FROM alg_gebouw
  WHERE alg_gebouw_verwijder IS NULL;


  fac_update_onrgoed1(p_import_key);

	-- After update ...
	plat_post_update_onrgoed1(p_import_key, v_max_alg_gebouw_key);

END plat_update_onrgoed1;
/






----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-- Objecten import
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

CREATE OR REPLACE PROCEDURE plat_post_import_ins (p_import_key IN NUMBER)
AS
	v_errorhint               VARCHAR2 (400);
BEGIN
   v_errorhint := 'plat_post_import_ins';
END;
/


CREATE OR REPLACE PROCEDURE plat_import_ins (p_import_key IN NUMBER)
AS
   oracle_err_num            NUMBER;
   oracle_err_mes            VARCHAR2 (200);
   v_errormsg                VARCHAR2 (400);
   v_errorhint               VARCHAR2 (400);
BEGIN


  v_errorhint := 'plat_import_ins';
  -- de sequence array staat beschreven in PRS_PAC.SRC bij de prs.import_perslid proc

  fac_import_ins (p_import_key);
	COMMIT;

	-- After import korrektie gebeurt nu...
	plat_post_import_ins(p_import_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);
END plat_import_ins;
/


CREATE OR REPLACE PROCEDURE plat_post_update_ins (p_import_key IN NUMBER, p_max_ins_srtdeel_key IN NUMBER, p_max_ins_deel_key IN NUMBER)
AS
	oracle_err_num            NUMBER;
  oracle_err_mes            VARCHAR2 (200);
  v_errormsg                VARCHAR2 (400);
  v_errorhint               VARCHAR2 (400);

	v_receptnr								VARCHAR2 (1000);
	v_kosten									VARCHAR2 (1000);
	v_periode 								VARCHAR2 (1000);
	v_perc_onderhoud					VARCHAR2 (1000);

	v_ctr_discipline_key      NUMBER(10);

	v_fin_btwtabelwaarde_key  fin_btwtabelwaarde.fin_btwtabelwaarde_key%TYPE;

	l_kosten									ins_srtcontrole.ins_srtcontrole_kosten2%TYPE;
	l_periode									ins_srtcontrole.ins_srtcontrole_periode%TYPE;
	l_perc_onderhoud					ins_srtcontrole.ins_srtcontrole_percentage%TYPE;

	v_mx_ins_srtcontroledl_xcp_key NUMBER(10);

	v_kpn_bestaat             NUMBER(10);


	-- Flexprops in de FIP-INS Excelsheet
  -- ins_kenmerkwaarde  Flexprop
  -- 1 									Receptnummer					} Srtcontrole
  -- 2									Receptomschrijving		}
  -- 3									Totaalbedr.
  -- 4        					StJr
  -- 5 									Duur
  -- 6									EiJr
  -- 7									ExJr
  -- 8									VvJr
  -- 9 									Aant. Aanw.          } Aantal geregistreerde objecten
  -- 10 								Perc. Onderh         } Percentage van dat aantal (vorige kolom) dat voor onderhoud cyclus in aanmerking komt, default 100%
  -- 11									Aantal niet
  -- 12									Aant.Overh.
  -- 13									Eh.										} Eenheid --> Stoppen we nu in standaard kolom Eenheid (kolom I)
  -- 14									Cycl
  -- 15									Fo
  -- 16									Fonds
  -- 17									Opmerking
  -- 18									kenmerk18
  -- 19									kenmerk19
  -- 20									kenmerk20

  -- LET OP: WE GAAN ERVAN UIT DAT bij een Receptnummer (1) altijd dezelfde Receptomschrijving(2) en Eenheid (13) horen. M.a.w. bij 2 regels Receptnr (1) zijn (2) en (13) ook gelijk.


 	CURSOR c1
  IS   -- receptnummer,      receptomschrijving,
	SELECT DISTINCT(ins_kenmerkwaarde1)
	FROM fac_imp_ins
	order by ins_kenmerkwaarde1;

  -- Alle geimporteerde regels (objecten met controles) die nog geen standaard srtcontrole hebben, en dus een uitzondering controle (xcp) moeten krijgen.
	CURSOR c2 (p_max_ins_deel_key NUMBER, p_receptnr VARCHAR2, p_kosten VARCHAR2, p_periode VARCHAR2, p_perc_onderhoud VARCHAR2)
	IS
			SELECT d.ins_deel_key, d.ins_deel_omschrijving, c.ins_srtcontrole_key, ins_kenmerkwaarde14 periode, 4,
			 			 fac.safe_to_number(replace(replace(ins_kenmerkwaarde3, '.'), ',','.')) kosten, fac.safe_to_number(replace(replace(ins_kenmerkwaarde10, '.'), ',','.')) perc_onderhoud,
			 			 fac.safe_to_date('01-01-' || ins_kenmerkwaarde8 ,'dd-mm-yyyy') verval_datum,
			 			 ins_kenmerkwaarde17 xcp_opmerk
 			FROM fac_imp_ins i, ins_deel d, ins_srtcontrole c, alg_ruimte r, alg_verdieping v, alg_gebouw g, alg_locatie l
 			WHERE i.ins_deel_omschrijving = d.ins_deel_omschrijving
 			AND i.alg_locatie_code = l.alg_locatie_code
      AND i.alg_gebouw_code = g.alg_gebouw_code
      AND i.alg_verdieping_volgnr =  v.alg_verdieping_volgnr
      AND i.alg_ruimte_nr =  r.alg_ruimte_nr
      AND d.ins_alg_ruimte_type = 'R'
      AND d.ins_alg_ruimte_key = r.alg_ruimte_key
      AND r.alg_verdieping_key = v.alg_verdieping_key
      AND v.alg_gebouw_key = g.alg_gebouw_key
      AND g.alg_locatie_key = l.alg_locatie_key
 			AND  d.ins_deel_key > p_max_ins_deel_key
 			AND  i.ins_kenmerkwaarde1 = p_receptnr
			AND  (i.ins_kenmerkwaarde3 <> p_kosten OR i.ins_kenmerkwaarde14 <> p_periode OR i.ins_kenmerkwaarde10 <> p_perc_onderhoud)
			AND  i.ins_kenmerkwaarde3 IS NOT NULL
			AND  i.ins_kenmerkwaarde14 IS NOT NULL
			AND  i.ins_kenmerkwaarde10 IS NOT NULL
			AND  i.ins_kenmerkwaarde1 = substr(c.ins_srtcontrole_omschrijving, 1, instr(c.ins_srtcontrole_omschrijving, '-')-1 );

	-- Alle geimporteerde regels (objecten met controles) die NA cursor C2 een standaard srtcontrole hebben gekregen,
	-- maar eigenlijk toch een uitzondering controle (xcp) moeten krijgen vanwege vervaljaar of opmerking uit oorspronkelijke systeem, willen we niet verloren laten gaan.
	-- Dus via cursor 6 alle records met een gevuld vervaljaar (ins_kenmerkwaarde8) of gevulde opmkering (ins_kenmerkwaarde17) krijgen ook een xcp.
	-- NB: Als die al een XCP obv cursor 2 had gekregen (afwijkende prijs, cyclus, %) hebben daar al dit eventuele vervaljaar en/of opmerking erbij gekregen, oftewel dit gaat om nieuwe gevallen.
  CURSOR c6 (p_max_ins_deel_key NUMBER, p_receptnr VARCHAR2, p_kosten VARCHAR2, p_periode VARCHAR2, p_perc_onderhoud VARCHAR2)
  IS
			SELECT d.ins_deel_key, d.ins_deel_omschrijving, c.ins_srtcontrole_key, ins_kenmerkwaarde14 periode, 4,
			            fac.safe_to_number(replace(replace(ins_kenmerkwaarde3, '.'), ',','.')) kosten, fac.safe_to_number(replace(replace(ins_kenmerkwaarde10, '.'), ',','.')) perc_onderhoud,
			            fac.safe_to_date('01-01-' || ins_kenmerkwaarde8 ,'dd-mm-yyyy') verval_datum,
			            ins_kenmerkwaarde17 xcp_opmerk
			FROM fac_imp_ins i, ins_deel d, ins_srtcontrole c, alg_ruimte r, alg_verdieping v, alg_gebouw g, alg_locatie l
			WHERE i.ins_deel_omschrijving = d.ins_deel_omschrijving
			AND i.alg_locatie_code = l.alg_locatie_code
      AND i.alg_gebouw_code = g.alg_gebouw_code
      AND i.alg_verdieping_volgnr =  v.alg_verdieping_volgnr
      AND i.alg_ruimte_nr =  r.alg_ruimte_nr
      AND d.ins_alg_ruimte_type = 'R'
      AND d.ins_alg_ruimte_key = r.alg_ruimte_key
      AND r.alg_verdieping_key = v.alg_verdieping_key
      AND v.alg_gebouw_key = g.alg_gebouw_key
      AND g.alg_locatie_key = l.alg_locatie_key
			AND  d.ins_deel_key > p_max_ins_deel_key
			AND  i.ins_kenmerkwaarde1 = p_receptnr
			AND  i.ins_kenmerkwaarde3 = p_kosten
			AND  i.ins_kenmerkwaarde14 = p_periode
			AND  i.ins_kenmerkwaarde10 = p_perc_onderhoud
			AND  i.ins_kenmerkwaarde3 IS NOT NULL
			AND  i.ins_kenmerkwaarde14 IS NOT NULL
			AND  i.ins_kenmerkwaarde10 IS NOT NULL
			AND  i.ins_kenmerkwaarde1 = substr(c.ins_srtcontrole_omschrijving, 1, instr(c.ins_srtcontrole_omschrijving, '-')-1 )
			AND  (i.ins_kenmerkwaarde8 IS NOT NULL OR i.ins_kenmerkwaarde17 IS NOT NULL);

	CURSOR c4 (p_max_ins_srtcontroledl_xcp NUMBER)
	IS
			SELECT ins_srtcontroledl_xcp_key, ins_deel_key, c.ins_srtcontrole_key, ins_srtcontrole_omschrijving,
				CASE
				WHEN ins_srtcontrole_kosten2 IS NOT NULL AND ins_srtcontroledl_xcp_kosten2 IS NOT NULL AND ins_srtcontrole_kosten2 = ins_srtcontroledl_xcp_kosten2
					THEN 1
					ELSE 0
				END set_kosten2_null,
				CASE
				WHEN ins_srtcontrole_periode IS NOT NULL AND ins_srtcontroledl_xcp_periode IS NOT NULL AND ins_srtcontrole_periode = ins_srtcontroledl_xcp_periode
					THEN 1
					ELSE 0
				END set_periode_null,
				CASE
				WHEN ins_srtcontrole_percentage IS NOT NULL AND ins_srtcontroledl_xcp_perc IS NOT NULL AND ins_srtcontrole_percentage = ins_srtcontroledl_xcp_perc
					THEN 1
					ELSE 0
				END set_perc_onderhoud_null
 			FROM ins_srtcontrole c, ins_srtcontroledl_xcp x
 			WHERE x.ins_srtcontroledl_xcp_key > p_max_ins_srtcontroledl_xcp
 			AND x.ins_srtcontrole_key = c.ins_srtcontrole_key;


	-- Let op: de eenheid kolom I wordt (itt hetgeen ik dacht) niet in ins_srtdeel_eenheid verwerkt, maar in res_deel_eenheid.
	-- Verder: ins_srtdeel_code is verder helemaal NIET uniek, niet over de DB, niet per discipline en/of groep.
	-- We kunnen daarom volstaan door hier verder ook niet te groeperen op discipline of iets dergelijks, we gaan gewoon op objectsoort-code groeperen, en ze krijgen allen dezelfde eenheid.
	CURSOR c3
	IS
	SELECT ins_srtdeel_code,  res_deel_eenheid
	FROM fac_imp_ins
	GROUP BY  ins_srtdeel_code,  res_deel_eenheid;

	-- Fondscodes/Projectgroepen gaan we als (gebouw)kostenplaatsen opvoeren
	CURSOR c5
	IS
	SELECT ins_kenmerkwaarde15,  ins_kenmerkwaarde16
	FROM fac_imp_ins
	GROUP BY  ins_kenmerkwaarde15,  ins_kenmerkwaarde16;

	-- Ten slotte hebben we ook nog de handmatige verschuivingen vanuit Tobias TMJ of StraVIS die komen overwaaien, die willen we niet verloren laten gaan.
	-- B.v. alle schilderwerk is naar jaar 2018 verschoven, die willen we niet verloren laten gaan, daarvoor maken we ins_deelsrtcontrole records aan met een plandatum [ins_deelsrtcontrole_plandatum] aan, te weten
	-- voor ieder record fac_imp_ins met een gevulde kolom ExJr (7e kolom uit de FIP sheet)

	CURSOR c7 (p_max_ins_deel_key NUMBER)
  IS
			SELECT d.ins_deel_key, d.ins_deel_omschrijving, c.ins_srtcontrole_key,  fac.safe_to_date('01-01-' || ins_kenmerkwaarde7 ,'dd-mm-yyyy') plan_datum
			FROM fac_imp_ins i, ins_deel d, ins_srtcontrole c, alg_ruimte r, alg_verdieping v, alg_gebouw g, alg_locatie l
			WHERE i.ins_deel_omschrijving = d.ins_deel_omschrijving
			AND i.alg_locatie_code = l.alg_locatie_code
      AND i.alg_gebouw_code = g.alg_gebouw_code
      AND i.alg_verdieping_volgnr =  v.alg_verdieping_volgnr
      AND i.alg_ruimte_nr =  r.alg_ruimte_nr
      AND d.ins_alg_ruimte_type = 'R'
      AND d.ins_alg_ruimte_key = r.alg_ruimte_key
      AND r.alg_verdieping_key = v.alg_verdieping_key
      AND v.alg_gebouw_key = g.alg_gebouw_key
      AND g.alg_locatie_key = l.alg_locatie_key
			AND  d.ins_deel_key > p_max_ins_deel_key
			AND  i.ins_kenmerkwaarde1 = substr(c.ins_srtcontrole_omschrijving, 1, instr(c.ins_srtcontrole_omschrijving, '-')-1 )
			AND  i.ins_kenmerkwaarde7 IS NOT NULL;


BEGIN
    v_errorhint := 'plat_post_update_ins - cursor c5';

   	-- Eerst maar eens beginnen met de verwerking van de kostenplaatsen cursor 5
   	FOR rec IN c5
   	LOOP
   		SELECT COUNT(*)
   		INTO v_kpn_bestaat
   		FROM prs_kostenplaats
   		WHERE prs_kostenplaats_upper = UPPER(rec.ins_kenmerkwaarde15)
   		AND prs_kostenplaats_verwijder IS NULL
   		AND prs_kostenplaats_module = 'ALG';

   		IF v_kpn_bestaat = 0
   		THEN
   		  v_errorhint := 'plat_post_update_ins - insert i0';
   		  v_errormsg := 'Kostenplaats gegevens: ' ||  ' prs_kostenplaats_nr=[' || rec.ins_kenmerkwaarde15 || '],' || ' prs_kostenplaats_omschrijving=[' || rec.ins_kenmerkwaarde16 || '],';
   			INSERT INTO prs_kostenplaats (prs_kostenplaats_nr, prs_kostenplaats_omschrijving, prs_kostenplaats_module, prs_kostenplaats_extern, prs_kostenplaats_limietperiode, prs_kostenplaats_fiat)
   			VALUES(rec.ins_kenmerkwaarde15, rec.ins_kenmerkwaarde16, 'ALG', 0, 0, 1);
			END IF;
   	END LOOP;

   	v_errorhint := 'plat_post_update_ins - cursor c3';
   	-- Eerst maar eens beginnen met de verwerking van ins_srtdeel_eenheid
   	FOR rec IN c3
   	LOOP
   	  v_errormsg := 'Deel gegevens: ' ||  ' ins_srtdeel_eenheid=[' || rec.res_deel_eenheid || '],' || ' ins_srtdeel_code=[' || rec.ins_srtdeel_code || '],';
   	  v_errorhint := 'plat_post_update_ins - update u0';
   		UPDATE ins_srtdeel
   		SET ins_srtdeel_eenheid = rec.res_deel_eenheid
   		WHERE ins_srtdeel_code = rec.ins_srtdeel_code
   		AND ins_srtdeel_key > p_max_ins_srtdeel_key
   		AND ins_srtdeel_verwijder IS NULL;
   	END LOOP;

   	v_errorhint := 'plat_post_update_ins - update u1';
   	-- Verder moet van alle ins_srtdeel die zijn toegevoegd de 'hoort bij persoon' eraf worden gehaald (sie in de standaard FIP erop is gezet), dus ins_srtdeel_binding van 17 -> 1
   	UPDATE ins_srtdeel
   	SET ins_srtdeel_binding = 1
   	WHERE ins_srtdeel_key > p_max_ins_srtdeel_key
   	AND ins_srtdeel_verwijder IS NULL;

   	v_errorhint := 'plat_post_update_ins - select s1';
   	-- Bepalen van de ctr discipline waaronder de terugkerende taken worden vastgelegd.
   	SELECT MIN(ins_discipline_key)
   	INTO v_ctr_discipline_key
    FROM ctr_discipline d, ctr_disc_params dp
    WHERE dp.ctr_ins_discipline_key = d.ins_discipline_key
    AND d.ins_discipline_verwijder IS NULL
    AND dp.ctr_disc_params_ismjob = 1;

   	v_errorhint := 'plat_post_update_ins - select s2';
   	IF v_ctr_discipline_key IS NULL
   	THEN
   			-- Als de ctr_discipline 'vervanging' niet gevonden is, dan maar de de laatste (max)
   			SELECT MAX(ins_discipline_key)
		   	INTO v_ctr_discipline_key
		   	FROM ctr_discipline
		   	WHERE ins_discipline_module = 'CTR'
		   	AND ins_discipline_verwijder IS NULL;
   	END IF;

   	v_errorhint := 'plat_post_update_ins - select s3';
   	-- Bepalen van de default BTW % 21...
   	SELECT MIN(fin_btwtabelwaarde_key)
   	INTO v_fin_btwtabelwaarde_key
   	FROM fin_btwtabelwaarde
	  WHERE fin_btwtabelwaarde_perc = 21
	  AND COALESCE(fin_btwtabelwaarde_verlegd,0) = 0
	  AND fin_btwtabelwaarde_verwijder IS NULL;


   	-- We gaan hier per receptnummer het MEEST UNIFORME (algemene) eruit vissen.
   	-- Dat doen we door te kijken waarvan de combinatie van dezelfde kosten (aant_K) met dezelfde periode het vaakst voorkomen (aant_P).


   	-- Voorbeeld hieronder: enkele regels bij 1 object A: recept R1 kost 100 euro per eenhied en wordt elke 2 jaar gepland, elke regel daarna heeft betrekking op ander object
   	-- recept(1)      kosten(3)     periode(14)
   	-- R1             100           2
   	-- R1             100           2
   	-- R1             150           2
   	-- R1             100           1
   	-- Hier is de meest algemene recept die met kosten 100 en om de 2 jaar (regel 1 en 2), de andere recepten (regel 3 en 4) zijn uitzonderingen (XCP) op de algemene regel.

   	-- We gaan (gebaseerd op de sheet van WaardWonen) hier ook nog eens rekening houden met Perc.Onderh, die default 100 staat.
   	-- Maar als de regel is 50%, dan is dat de norm, en elke afwijking van 50% is dus uitzondering, dus we gaan OOK op zoek naar de meeste regels met dezelfde Perc. Onderh.
   	-- Dus
   	-- recept(1)      kosten(3)     periode(14) %onderh (10)
   	-- R1             100           2           75
   	-- R1             100           2           50              <-- Hiervan zijn er 2, dit is de standaard taak (srtcontrole)
   	-- R1             150           2           100
   	-- R1             100           1           100
   	-- R1             100           2           50              <-- Hiervan zijn er 2, dit is de standaard taak (srtcontrole)



    v_errorhint := 'plat_post_update_ins - cursor c1';
		FOR rec IN c1
	  LOOP
	    v_errormsg := 'Cursor c1 gegevens: ' ||  ' ins_kenmerkwaarde1=[' || rec.ins_kenmerkwaarde1 || ']';
	  	v_errorhint := 'plat_post_update_ins - select s4';
	  	SELECT ins_kenmerkwaarde1, ins_kenmerkwaarde3, ins_kenmerkwaarde14, ins_kenmerkwaarde10
	  	INTO v_receptnr, v_kosten, v_periode, v_perc_onderhoud
	  	FROM (

						SELECT  a.ins_kenmerkwaarde1, a.ins_kenmerkwaarde3, a.ins_kenmerkwaarde14, ins_kenmerkwaarde10, count(*) aantal  FROM fac_imp_ins a
            WHERE   a.ins_kenmerkwaarde1 = rec.ins_kenmerkwaarde1
            HAVING count(*) = (SELECT MAX(COUNT(*)) FROM fac_imp_ins b
                                        WHERE b.ins_kenmerkwaarde1 = a.ins_kenmerkwaarde1
                                        GROUP by ins_kenmerkwaarde1, ins_kenmerkwaarde3, ins_kenmerkwaarde14, ins_kenmerkwaarde10
                                        )
            GROUP by ins_kenmerkwaarde1, ins_kenmerkwaarde3, a.ins_kenmerkwaarde14, ins_kenmerkwaarde10)
      WHERE rownum = 1;

      -- Algemene soort controles (terugkerende taken) toevoegen op alle soortdelen die zijn toegevoegd in deze import ( > p_max_ins_srtdeel_key)
      -- Daartoe bepalen we eerst van alle controles op een objectsoort de grootste gemene deler, de rest (= afwijkingen daarop) worden xcp-records.
      -- Definitie "Grootste gemene deler" = het meeste aantal records met dezelfde kosten, periode en onderhoudspercentage.

      -- Fondscode ook in (laatste, zojuist ingeschoten record) ins_srtcontrole verwerken...
			-- We gaan ervan uit, en dat is terecht, dat er 1 fondscode (en niet meer dan 1) bij een v_receptnr bestaat.
			-- Voor het geval dat er toch is (d.i. een fout in het importbestand) doen we veiligheidshalve MAX.

			-- FSN#38080:  kolom AA (VvJr = vervaljaar = kenmerk8) gaan we nu ook gebruiken bij de import (deden we tot nu toe nog niets mee, deze stond altijd ingevuld met een berekende waarde
      -- indien gevuld met een jaar, dan is dat het vervaljaar van die activiteit bij dat element.
      -- Let op: vervaljaar doet NIET! mee in de bepaling van de "grootste gemene deler" voor ins_srtcontrole.
			v_errormsg := 'ins_srtcontrole gegevens: ' ||  ' ctr_discipline_key=[' || v_ctr_discipline_key || '],' || ' v_receptnr=[' || v_receptnr || '],'
			              || ' v_kosten=[' || v_kosten || '],' || ' v_periode=[' || v_periode || '],' || ' v_perc_onderhoud=[' || v_perc_onderhoud || ']' ;
			v_errorhint := 'plat_post_update_ins - insert i1';
	  	INSERT INTO ins_srtcontrole (ctr_discipline_key, ins_srtinstallatie_key, ins_srtcontrole_niveau, ins_srtcontrole_omschrijving, ins_srtcontrole_groep,
                                   ins_srtcontrole_info, ins_srtcontrole_periode, ins_srtcontrole_eenheid, ins_srtcontrole_mode, ins_srtcontrole_options, ins_srtcontrole_kosten2, fin_btwtabelwaarde_key,
                                   ins_srtcontrole_percentage, prs_kostenplaats_key)
			SELECT v_ctr_discipline_key, ins_srtdeel_key, 'S', substr( ins_kenmerkwaarde1 || '-' || MAX(ins_kenmerkwaarde2), 1,60), v_receptnr,
						MAX(ins_kenmerkwaarde2) || ' [' || MAX(ins_kenmerkwaarde13) || ']' , v_periode, 4, 1, 11, fac.safe_to_number(replace(replace(v_kosten, '.'), ',','.')),
						v_fin_btwtabelwaarde_key,
						fac.safe_to_number(replace(replace(v_perc_onderhoud, '.'), ',','.')),
						(SELECT prs_kostenplaats_key
						FROM prs_kostenplaats
						WHERE prs_kostenplaats_verwijder IS NULL
						AND prs_kostenplaats_module = 'ALG'
						AND prs_kostenplaats_upper = (SELECT UPPER(MAX(ins_kenmerkwaarde15))
																					FROM fac_imp_ins
																					WHERE ins_kenmerkwaarde1 = v_receptnr))
			FROM 	ins_srtdeel sd, fac_imp_ins i, ins_srtgroep sg, ins_discipline d
			WHERE ins_srtdeel_key > p_max_ins_srtdeel_key
			AND   sd.ins_srtdeel_code = i.ins_srtdeel_code
			AND   sd.ins_srtgroep_key = sg.ins_srtgroep_key
      AND   sg.ins_discipline_key = d.ins_discipline_key
      AND   i.ins_discipline_omschrijving = d.ins_discipline_omschrijving
      AND   i.ins_srtgroep_omschrijving = sg.ins_srtgroep_omschrijving
			AND   i.ins_kenmerkwaarde1 = v_receptnr
			AND   i.ins_kenmerkwaarde3 = v_kosten
			AND   i.ins_kenmerkwaarde14 = v_periode
			AND   i.ins_kenmerkwaarde10 = v_perc_onderhoud
			AND NOT EXISTS (SELECT 'x' FROM ins_srtcontrole
											WHERE ins_srtinstallatie_key = ins_srtdeel_key
											AND   ins_srtcontrole_niveau = 'S'
											AND  	ins_srtcontrole_groep = v_receptnr)
			GROUP BY ins_srtdeel_key, ins_kenmerkwaarde1;




			-- Uitzonderingen op de algemene (reguliere) soort controle, die dus afwijken van kosten en/of periode, worden toegevoegd als XCP
			-- Let op: hier wordt aantal nog in GROEP gestopt, vraag is of we de eenheid moeten stoppen in ins_srtdeel_aantal of in ins_srtcontrole_aantal /  ins_srtcontroledl_xcp_aantal op dieper nivo.

			-- Check via onderstaande query op plato@labs levert op dat er een paar verschillen in aantal zitten:

			--  plato_waardwonen_verschil_aantal_andere_eenheid.xls: 15 objecten met meerdere activiteiten, verschillend aantal, andere eenheid.
			--	select  a.ins_deel_omschrijving, b.ins_kenmerkwaarde1, b.ins_kenmerkwaarde2, b.ins_kenmerkwaarde13, b.ins_kenmerkwaarde10, c.ins_kenmerkwaarde10,  c.ins_kenmerkwaarde13, c.ins_kenmerkwaarde1, c.ins_kenmerkwaarde2 from
			--	(select ins_deel_omschrijving, count(*) from fac_imp_ins
			--	having count(*) > 1
			--	group by ins_deel_omschrijving) a,
			--	fac_imp_ins b,
			--	fac_imp_ins c
			--	where a.ins_deel_omschrijving = b.ins_deel_omschrijving
			--	AND   b.ins_deel_omschrijving = c.ins_deel_omschrijving
			--	AND   b.ins_kenmerkwaarde1 <> c.ins_kenmerkwaarde1
			--	AND   b.ins_kenmerkwaarde10 <> c.ins_kenmerkwaarde10
			--	AND   b.ins_kenmerkwaarde13 <> c.ins_kenmerkwaarde13
			--	ORDER BY a.ins_deel_omschrijving;

			--  plato_waardwonen_verschil_aantal_dezelfde_eenheid.xls: 30 objecten met meerdere activiteiten, verschillend aantal, dezelfde eenheid
			--	select  a.ins_deel_omschrijving, b.ins_kenmerkwaarde1, b.ins_kenmerkwaarde2, b.ins_kenmerkwaarde13, b.ins_kenmerkwaarde10, c.ins_kenmerkwaarde10,  c.ins_kenmerkwaarde13, c.ins_kenmerkwaarde1, c.ins_kenmerkwaarde2 from
			--	(select ins_deel_omschrijving, count(*) from fac_imp_ins
			--	having count(*) > 1
			--	group by ins_deel_omschrijving) a,
			--	fac_imp_ins b,
			--	fac_imp_ins c
			--	where a.ins_deel_omschrijving = b.ins_deel_omschrijving
			--	AND   b.ins_deel_omschrijving = c.ins_deel_omschrijving
			--	AND   b.ins_kenmerkwaarde1 <> c.ins_kenmerkwaarde1
			--	AND   b.ins_kenmerkwaarde10 <> c.ins_kenmerkwaarde10
			--	AND   b.ins_kenmerkwaarde13 = c.ins_kenmerkwaarde13
			--	ORDER BY a.ins_deel_omschrijving;

			--  plato_waardwonen_meer_activiteiten_met_gelijk_aantal.xlsx: 354 objecten met meerdere activiteiten, gelijke aantal, (dezelfde of afwijkend eenheid).
			--select  a.ins_deel_omschrijving, b.ins_kenmerkwaarde1, b.ins_kenmerkwaarde2, b.ins_kenmerkwaarde13, b.ins_kenmerkwaarde10, c.ins_kenmerkwaarde10,  c.ins_kenmerkwaarde13, c.ins_kenmerkwaarde1, c.ins_kenmerkwaarde2 from
			--(select ins_deel_omschrijving, count(*) from fac_imp_ins
			--having count(*) > 1
			--group by ins_deel_omschrijving) a,
			--fac_imp_ins b,
			--fac_imp_ins c
			--where a.ins_deel_omschrijving = b.ins_deel_omschrijving
			--AND   b.ins_deel_omschrijving = c.ins_deel_omschrijving
			--AND   b.ins_kenmerkwaarde1 <> c.ins_kenmerkwaarde1
			--AND   b.ins_kenmerkwaarde10 = c.ins_kenmerkwaarde10
			---- AND   b.ins_kenmerkwaarde13 = c.ins_kenmerkwaarde13
			--ORDER BY a.ins_deel_omschrijving;
			--;

			--plato_waardwonen_objecten_met_1_activiteit.xlsx: 2940 objecten met 1 activiteit, aantal dont care, eenheid dont care.
			--select ins_deel_omschrijving, MAX(b.ins_kenmerkwaarde1), MAX(b.ins_kenmerkwaarde2), MAX(b.ins_kenmerkwaarde13), MAX(b.ins_kenmerkwaarde10) from fac_imp_ins b
			--having count(*) = 1
			--group by ins_deel_omschrijving;

			-- Aantal objecten ingelezen: 3344.
			-- select distinct (ins_deel_omschrijving) from fac_imp_ins;


			-- Uitzonderingen op de algemene (reguliere) soort controle die we zojuist hebben toegevoegd, die dus afwijken van kosten en/of periode, worden toegevoegd als XCP
			-- Let op: hier wordt aantal nog in GROEP gestopt, vraag is of we de eenheid moeten stoppen in ins_srtdeel_aantal of in ins_srtcontrole_aantal /  ins_srtcontroledl_xcp_aantal op dieper nivo.
			-- Let op 2: Dit zijn natuurlijk alleen de objecten die in deze import zijn toegevoegd (d.ins_deel_key > p_max_ins_deel_key) en afwijkende kosten en afwijkende periode hebben.
      --			     Verder moet de algemene ins_srtcontrole wel gevonden kunnen worden om een xcp daarop te kunnen maken (foreign-key)

			-- Waneer de kosten OF(!) de periode niet zijn ingevuld (NULL-value), dan gaan we ervan uit dat deze de default volgen, en wordt er geen XCP aangemaakt,
			-- Dus als een van beide ontbreekt, dan volgt die de standaard.

			-- Hier nog ff onthouden wat de laatste xcp record is, is straks nodig voor een nabewerking (cursor 4)
			v_errorhint := 'plat_post_update_ins - select s5';
			SELECT coalesce(max(ins_srtcontroledl_xcp_key),0)
  		INTO v_mx_ins_srtcontroledl_xcp_key
  		FROM ins_srtcontroledl_xcp;


			v_errormsg := 'Soort controle gegevens: ' ||  ' recept=[' || v_receptnr || '],' || ' kosten=[' || v_kosten || '],' ||
										 															  ' periode=[' || v_periode || '],' || ' percentage=[' || v_perc_onderhoud || '],';
      v_errorhint := 'plat_post_update_ins - cursor c2';
			FOR rec2 IN c2 (p_max_ins_deel_key, v_receptnr, v_kosten, v_periode, v_perc_onderhoud)
			LOOP
				BEGIN


					v_errormsg := 'C2: INSERT INTO ins_srtcontroledl_xcp: ' || 'ins_deel_key=['|| rec2.ins_deel_key || '],' || 'objectomschrijving=[' || rec2.ins_deel_omschrijving || '] ' ||
																																 'ins_srtcontrole_key=[' || rec2.ins_srtcontrole_key || '],' ||
																																 'recept=[' || v_receptnr || '],' || 'kosten=[' || rec2.kosten || '],' ||
										 																					   'periode=[' || rec2.periode || '],' || ' percentage=[' || v_perc_onderhoud || '],';

					fac.imp_writelog (p_import_key,
	                                 'I',
	                                 v_errormsg,
	                                 v_errorhint
	                                );
          v_errorhint := 'plat_post_update_ins - insert i2';
					INSERT INTO ins_srtcontroledl_xcp ( ins_deel_key, ins_srtcontrole_key,  ins_srtcontroledl_xcp_periode,
			  																			ins_srtcontroledl_xcp_kosten2, ins_srtcontroledl_xcp_perc, ins_srtcontroledl_xcp_eind, ins_srtcontroledl_xcp_opmerk)
			  	SELECT rec2.ins_deel_key, rec2.ins_srtcontrole_key, rec2.periode, rec2.kosten, rec2.perc_onderhoud, rec2.verval_datum, rec2.xcp_opmerk FROM dual;

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

	    v_errorhint := 'plat_post_update_ins - cursor c6';
	    FOR rec6 IN c6 (p_max_ins_deel_key, v_receptnr, v_kosten, v_periode, v_perc_onderhoud)
			LOOP
				BEGIN


					v_errormsg := 'C6: VERVALJAAR of OPMERKING -> ins_srtcontroledl_xcp: ' || 'ins_deel_key=['|| rec6.ins_deel_key || '],' || 'objectomschrijving=[' || rec6.ins_deel_omschrijving || '] ' ||
																																 'ins_srtcontrole_key=[' || rec6.ins_srtcontrole_key || '],' ||
																																 'recept=[' || v_receptnr || '],' || 'kosten=[' || rec6.kosten || '],' ||
										 																					   'periode=[' || rec6.periode || '],' || ' percentage=[' || v_perc_onderhoud || '],';

					fac.imp_writelog (p_import_key,
	                                 'I',
	                                 v_errormsg,
	                                 v_errorhint
	                                );
			    v_errorhint := 'plat_post_update_ins - insert i3';
					INSERT INTO ins_srtcontroledl_xcp ( ins_deel_key, ins_srtcontrole_key, ins_srtcontroledl_xcp_eind, ins_srtcontroledl_xcp_opmerk)
			  	SELECT rec6.ins_deel_key, rec6.ins_srtcontrole_key, rec6.verval_datum, rec6.xcp_opmerk FROM dual;

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



			-- "After" post-processing van de XCP records die zojuist - in voorgaande loop- zijn toegevoegd.
			-- De kolommen (kosten2 (=derden), periode, percentage) die dezelfde waarde hebben als de standaard ins_srtcontrole moeten op NULL worden gezet,
			-- Maw alleen de echte afwijkingen moeten een waarde (NOT NULL) hebben.
			-- In de cursor c2 worden de records opgehaald waarvan minimaal 1 afwijking is, dat betekent dat er dus ook mogelijk dezelfde waarde als de standaard bestaat.

			v_errormsg := 'NABEWERKING ins_srtcontroledl_xcp: ';
      v_errorhint := 'plat_post_update_ins - cursor c4';
			FOR rec4 IN c4 (v_mx_ins_srtcontroledl_xcp_key)
			LOOP
				BEGIN
					v_errormsg := 'NABEWERKING ins_srtcontroledl_xcp: ' || 'key=[' || rec4.ins_srtcontroledl_xcp_key || '], controle=[ ' || rec4.ins_srtcontrole_omschrijving || ']';
					v_errorhint := 'plat_post_update_ins - update u2';
					IF rec4.set_kosten2_null = 1
					THEN
						UPDATE ins_srtcontroledl_xcp SET ins_srtcontroledl_xcp_kosten2 = NULL WHERE ins_srtcontroledl_xcp_key = rec4.ins_srtcontroledl_xcp_key;
					END IF;
					v_errorhint := 'plat_post_update_ins - update u3';
					IF rec4.set_periode_null = 1
					THEN
						UPDATE ins_srtcontroledl_xcp SET ins_srtcontroledl_xcp_periode = NULL WHERE ins_srtcontroledl_xcp_key = rec4.ins_srtcontroledl_xcp_key;
					END IF;
					v_errorhint := 'plat_post_update_ins - update u4';
					IF rec4.set_perc_onderhoud_null = 1
					THEN
						UPDATE ins_srtcontroledl_xcp SET ins_srtcontroledl_xcp_perc = NULL WHERE ins_srtcontroledl_xcp_key = rec4.ins_srtcontroledl_xcp_key;
					END IF;

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


	  END LOOP;

   	v_errorhint := 'plat_post_update_ins - cursor c7';
   	FOR rec7 IN c7 (p_max_ins_deel_key)
		LOOP
			BEGIN


				v_errormsg := 'C7: INSPECTIE record -> ins_deelsrtcontrole: ' || 'ins_deel_key=['|| rec7.ins_deel_key || '],' || 'objectomschrijving=[' || rec7.ins_deel_omschrijving || '] ' ||
																															 'ins_srtcontrole_key=[' || rec7.ins_srtcontrole_key || '],';

				fac.imp_writelog (p_import_key,
                                 'I',
                                 v_errormsg,
                                 v_errorhint
                                );
		    v_errorhint := 'plat_post_update_ins - insert i4';
				INSERT INTO ins_deelsrtcontrole (ins_deel_key, ins_srtcontrole_key, ins_deelsrtcontrole_plandatum, ins_deelsrtcontrole_status)
		  	SELECT rec7.ins_deel_key, rec7.ins_srtcontrole_key, rec7.plan_datum, 0 FROM dual;

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


   	-- We gaan dan nog het aantal objecten (ins_deel_aantal) die standaard op 1 staat, bijwerken met kolom 9 (aantal geregistreerde objecten).
   	-- Hiervoor nemen we het hoogste aantal (het object kan voor meerdere activiteiten met verschillende aantal (icm eenheid) worden ingezet), b.v.:

   	-- object A (kozijnen) 10 m2  schilderen
   	-- object A (kozijnen) 2  st. vervangen
   	-- We registeren dan bij object A 10??? (of is 2 beter, omdat dit de preferred eenheid stuks is)?

   	v_errorhint := 'plat_post_update_ins - update u5';
   	UPDATE ins_deel d
   	SET ins_deel_aantal = (SELECT COALESCE(fac.safe_to_number(max(ins_kenmerkwaarde9)),1)
   												 FROM 	fac_imp_ins i, alg_ruimte r, alg_verdieping v, alg_gebouw g, alg_locatie l
   												 WHERE  i.ins_deel_omschrijving = d.ins_deel_omschrijving
   												 AND i.alg_locatie_code = l.alg_locatie_code
											     AND i.alg_gebouw_code = g.alg_gebouw_code
											     AND i.alg_verdieping_volgnr =  v.alg_verdieping_volgnr
											     AND i.alg_ruimte_nr =  r.alg_ruimte_nr
											     AND d.ins_alg_ruimte_key = r.alg_ruimte_key
											     AND r.alg_verdieping_key = v.alg_verdieping_key
											     AND v.alg_gebouw_key = g.alg_gebouw_key
											     AND g.alg_locatie_key = l.alg_locatie_key
   												 )
   	WHERE d.ins_deel_key > p_max_ins_deel_key
		AND d.ins_deel_verwijder IS NULL;


		-- De aanmaakdatums van de ins_delen die zijn toegevoegd ( > p_max_ins_deel_key) bepalen de volgende controle-momenten, dus dat komt natuurlijk wel wat nauw.
		-- Daarom wordt StJr (ins_kenmerkwaarde4) als startjaar bij alle objecten (ins_delen) van het betreffende pand gezet.
		v_errorhint := 'plat_post_update_ins - update u6';
		UPDATE ins_deel d
		SET ins_deel_aanmaak = (SELECT min( to_date (ins_kenmerkwaarde4, 'yyyy'))
														FROM fac_imp_ins i, alg_ruimte r, alg_verdieping v, alg_gebouw g, alg_locatie l
														WHERE i.ins_deel_omschrijving = d.ins_deel_omschrijving
														AND i.alg_locatie_code = l.alg_locatie_code
											      AND i.alg_gebouw_code = g.alg_gebouw_code
											      AND i.alg_verdieping_volgnr =  v.alg_verdieping_volgnr
											      AND i.alg_ruimte_nr =  r.alg_ruimte_nr
											      AND d.ins_alg_ruimte_key = r.alg_ruimte_key
											      AND r.alg_verdieping_key = v.alg_verdieping_key
											      AND v.alg_gebouw_key = g.alg_gebouw_key
											      AND g.alg_locatie_key = l.alg_locatie_key
														)
		WHERE d.ins_deel_key > p_max_ins_deel_key
		AND d.ins_deel_verwijder IS NULL;

		v_errorhint := 'plat_post_update_ins - insert i5';
		--- En tenslotte gaan we de 3 MJOB autorisatiegroepen MJOB-R, MJOB-W en MJOB-A de rechten op INSUSE, INSMAN en CTRUSE uitdelen....
		--  1. Eerst MJOB-R (Leesrechten): INSUSE READ en INSMAN READ op elke INS-discipline en CTRUSE READ op de MJOB-discipline (v_ctr_discipline_key)
        INSERT INTO fac_groeprechten (fac_groep_key, fac_functie_key, ins_discipline_key,
                      fac_gebruiker_prs_level_read, fac_gebruiker_prs_level_write, fac_gebruiker_alg_level_read, fac_gebruiker_alg_level_write)
        SELECT fac_groep_key, fac_functie_key, ins_discipline_key,  -1, 9, -1, 9
        FROM (SELECT (SELECT fac_groep_key FROM fac_groep WHERE fac_groep_upper = 'MJOB-R: LEESRECHTEN') fac_groep_key,
        fac_functie_key, d.ins_discipline_key, fac_functie_code
        FROM fac_functie, ins_discipline d
        WHERE fac_functie_code = 'WEB_INSUSE'
        AND d.ins_discipline_verwijder IS NULL) a
        WHERE NOT EXISTS
        (SELECT 1 FROM fac_groeprechten fg
        WHERE a.fac_groep_key = fg.fac_groep_key
        AND a.fac_functie_key = fg.fac_functie_key
        AND a.ins_discipline_key = fg.ins_discipline_key);
		v_errorhint := 'plat_post_update_ins - insert i6';
        INSERT INTO fac_groeprechten (fac_groep_key, fac_functie_key, ins_discipline_key,
                                 fac_gebruiker_prs_level_read, fac_gebruiker_prs_level_write, fac_gebruiker_alg_level_read, fac_gebruiker_alg_level_write)
        SELECT fac_groep_key, fac_functie_key, ins_discipline_key,  -1, 9, -1, 9
        FROM (SELECT (SELECT fac_groep_key FROM fac_groep WHERE fac_groep_upper = 'MJOB-R: LEESRECHTEN') fac_groep_key,
        fac_functie_key, d.ins_discipline_key, fac_functie_code
        FROM fac_functie, ins_discipline d
        WHERE fac_functie_code = 'WEB_INSMAN'
        AND d.ins_discipline_verwijder IS NULL) a
        WHERE NOT EXISTS
        (SELECT 1 FROM fac_groeprechten fg
        WHERE a.fac_groep_key = fg.fac_groep_key
        AND a.fac_functie_key = fg.fac_functie_key
        AND a.ins_discipline_key = fg.ins_discipline_key);
		v_errorhint := 'plat_post_update_ins - insert i7';
        INSERT INTO fac_groeprechten (fac_groep_key, fac_functie_key, ins_discipline_key,
                      fac_gebruiker_prs_level_read, fac_gebruiker_prs_level_write, fac_gebruiker_alg_level_read, fac_gebruiker_alg_level_write)
        SELECT fac_groep_key, fac_functie_key, ins_discipline_key, -1, 9, -1, 9 FROM
        (SELECT
        (SELECT fac_groep_key FROM fac_groep WHERE fac_groep_upper = 'MJOB-R: LEESRECHTEN') fac_groep_key,
        fac_functie_key,
        v_ctr_discipline_key ins_discipline_key
        FROM fac_functie
        WHERE fac_functie_code = 'WEB_CTRUSE') a
        WHERE NOT EXISTS
        (SELECT 1 FROM fac_groeprechten fg
        WHERE a.fac_groep_key = fg.fac_groep_key
        AND a.fac_functie_key = fg.fac_functie_key
        AND a.ins_discipline_key = fg.ins_discipline_key);

		--  2. Dan MJOB-W (Schrijfrechten): INSUSE WRITE en INSMAN WRITE op elke INS-discipline en CTRUSE WRITE op de MJOB-discipline (v_ctr_discipline_key)
        v_errorhint := 'plat_post_update_ins - insert i8';
        INSERT INTO fac_groeprechten (fac_groep_key, fac_functie_key, ins_discipline_key,
                                 fac_gebruiker_prs_level_read, fac_gebruiker_prs_level_write, fac_gebruiker_alg_level_read, fac_gebruiker_alg_level_write)
        SELECT fac_groep_key, fac_functie_key, ins_discipline_key,  -1, -1, -1, -1
        FROM (SELECT (SELECT fac_groep_key FROM fac_groep WHERE fac_groep_upper = 'MJOB-W: SCHRIJFRECHTEN') fac_groep_key,
        fac_functie_key, d.ins_discipline_key, fac_functie_code
        FROM fac_functie, ins_discipline d
        WHERE fac_functie_code = 'WEB_INSUSE'
        AND d.ins_discipline_verwijder IS NULL) a
        WHERE NOT EXISTS
        (SELECT 1 FROM fac_groeprechten fg
        WHERE a.fac_groep_key = fg.fac_groep_key
        AND a.fac_functie_key = fg.fac_functie_key
        AND a.ins_discipline_key = fg.ins_discipline_key);
		v_errorhint := 'plat_post_update_ins - insert i9';
        INSERT INTO fac_groeprechten (fac_groep_key, fac_functie_key, ins_discipline_key,
                                 fac_gebruiker_prs_level_read, fac_gebruiker_prs_level_write, fac_gebruiker_alg_level_read, fac_gebruiker_alg_level_write)
        SELECT fac_groep_key, fac_functie_key, ins_discipline_key,  -1, -1, -1, -1
        FROM (SELECT (SELECT fac_groep_key FROM fac_groep WHERE fac_groep_upper = 'MJOB-W: SCHRIJFRECHTEN') fac_groep_key,
        fac_functie_key, d.ins_discipline_key, fac_functie_code
        FROM fac_functie, ins_discipline d
        WHERE fac_functie_code = 'WEB_INSMAN'
        AND d.ins_discipline_verwijder IS NULL) a
        WHERE NOT EXISTS
        (SELECT 1 FROM fac_groeprechten fg
        WHERE a.fac_groep_key = fg.fac_groep_key
        AND a.fac_functie_key = fg.fac_functie_key
        AND a.ins_discipline_key = fg.ins_discipline_key);
		v_errorhint := 'plat_post_update_ins - insert i10';
        INSERT INTO fac_groeprechten (fac_groep_key, fac_functie_key, ins_discipline_key,
                      fac_gebruiker_prs_level_read, fac_gebruiker_prs_level_write, fac_gebruiker_alg_level_read, fac_gebruiker_alg_level_write)
        SELECT fac_groep_key, fac_functie_key, ins_discipline_key, -1, -1, -1, -1 FROM
        (SELECT
        (SELECT fac_groep_key FROM fac_groep WHERE fac_groep_upper = 'MJOB-W: SCHRIJFRECHTEN') fac_groep_key,
        fac_functie_key,
        v_ctr_discipline_key ins_discipline_key
        FROM fac_functie
        WHERE fac_functie_code = 'WEB_CTRUSE') a
        WHERE NOT EXISTS
        (SELECT 1 FROM fac_groeprechten fg
        WHERE a.fac_groep_key = fg.fac_groep_key
        AND a.fac_functie_key = fg.fac_functie_key
        AND a.ins_discipline_key = fg.ins_discipline_key);

		--  3. Tenslotte MJOB-A (Admin MJOB): INSMGT, ALG..? en nog wat.... TODO...



EXCEPTION
WHEN OTHERS
   THEN
   		fac.imp_writelog (p_import_key, 'E', v_errormsg, v_errorhint);
   		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;
/



CREATE OR REPLACE PROCEDURE plat_update_ins (
   p_import_key IN NUMBER
) IS

	v_count           			NUMBER;
	v_max_ins_srtdeel_key 	NUMBER(10);
  v_max_ins_deel_key 			NUMBER(10);
BEGIN

  -- Even snel registreren wat de laatst toegevoegde ins_srtdeel is, dan weten we dat er door deze import-procedure wordt toegevoegd (alles > dan deze max).
  SELECT coalesce(max(ins_srtdeel_key),0)
  INTO v_max_ins_srtdeel_key
  FROM ins_srtdeel
  WHERE ins_srtdeel_verwijder IS NULL;

  -- Idem voor laatst toegevoegde ins_deel is, dan weten we dat er door deze import-procedure wordt toegevoegd (alles > dan deze max).
  SELECT coalesce(max(ins_deel_key),0)
  INTO v_max_ins_deel_key
  FROM ins_deel
  WHERE ins_deel_verwijder IS NULL;

  fac_update_ins (p_import_key);

	-- After update ...
	plat_post_update_ins(p_import_key, v_max_ins_srtdeel_key, v_max_ins_deel_key);

END plat_update_ins;
/

-- PLAT#36309:  MJOP-Export vanuit PLATO, Import in Tobias AX.
-- Alle MJOB taken van de actuele situatie (=geen scenario, oftewel scenario_key =1) in het freezeyear (setting mjb_freeze_year) die gestart zijn (geaccordeerd/goedgekeurd, oftewel status 2)
CREATE OR REPLACE VIEW plat_v_exp_mjob_tobiasax_body
(result, result_order)
AS
SELECT 'Id;Bedrijf;Complexcode;Complexnaam;Clustercode;Clusternaam;Hoofdrecept;Groeprecept;Subreceptnummer;Subreceptomschrijving;Elementnummer;Element beschrijving;Hoeveelheid;Hoeveelheid Taak;Eenheid;Cyclus;Cyclus afwijkend;' ||
       'Loonbedrag;Derden;Materieel;Materiaal;Uren;Betreft(%);Taak;Projectgroep;BTW;'||  fac.getsetting('mjb_freeze_year'),0 FROM DUAL
UNION ALL
SELECT  x.ins_deelsrtcontrole_key || ';' ||
        x.alg_district_omschrijving || ';' ||
        x.alg_locatie_code || ';' ||
        x.alg_locatie_omschrijving || ';' ||
        x.alg_gebouw_code || ';' ||
        x.alg_gebouw_naam || ';' ||
        x.ins_discipline_omschrijving || ';' ||
        x.ins_srtgroep_upper || ';' ||
        x.ins_srtdeel_code_upper || ';' ||
        x.ins_srtdeel_omschrijving || ';' ||
        x.ins_deel_upper || ';' ||
        x.ins_deel_opmerking || ';' ||
        x.ins_deel_aantal || ';' ||
        xcp.ins_srtcontroledl_xcp_aantal || ';' ||
        x.ins_srtdeel_eenheid || ';' ||
        x.ins_srtcontrole_periode || ';' ||
        xcp.ins_srtcontroledl_xcp_periode || ';' ||
        COALESCE(xcp.ins_srtcontroledl_xcp_kosten, x.ins_srtcontrole_kosten) || ';' ||
        COALESCE(xcp.ins_srtcontroledl_xcp_kosten2, x.ins_srtcontrole_kosten2) || ';' ||
        COALESCE(xcp.ins_srtcontroledl_xcp_kosten3, x.ins_srtcontrole_kosten3) || ';' ||
        COALESCE(xcp.ins_srtcontroledl_xcp_materia, x.ins_srtcontrole_materiaal) || ';' ||
        COALESCE(xcp.ins_srtcontroledl_xcp_uren, x.ins_srtcontrole_uren) || ';' ||
        COALESCE(xcp.ins_srtcontroledl_xcp_perc, x.ins_srtcontrole_percentage) || ';' ||
        x.ins_srtcontrole_omschrijving || ';' ||
        x.prs_kostenplaats_upper || ';' ||
        x.fin_btwtabelwaarde_perc || ';' ||
        x.ins_deelsrtcontrole_freezecost
        ,x.ins_deelsrtcontrole_key
FROM
(SELECT d.ins_deel_key,
        disc.ins_discipline_omschrijving,
        sg.ins_srtgroep_upper,
        sd.ins_srtdeel_code_upper,
        sd.ins_srtdeel_omschrijving,
        d.ins_deel_upper,
        d.ins_deel_opmerking,
        d.ins_deel_aantal,
        sd.ins_srtdeel_eenheid,
        sc.ins_srtcontrole_periode,
        sc.ins_srtcontrole_omschrijving,
        sc.ins_srtcontrole_kosten,
        sc.ins_srtcontrole_kosten2,
        sc.ins_srtcontrole_kosten3,
        sc.ins_srtcontrole_materiaal,
        sc.ins_srtcontrole_uren,
        sc.ins_srtcontrole_percentage,
        dc.ins_deelsrtcontrole_freezecost,
        kp.prs_kostenplaats_upper,
        btw.fin_btwtabelwaarde_perc,
        dc.ins_srtcontrole_key,
        dc.ins_deelsrtcontrole_key,
        ds.alg_district_omschrijving,
        l.alg_locatie_code,
        l.alg_locatie_omschrijving,
        g.alg_gebouw_code,
        g.alg_gebouw_naam
FROM ins_deelsrtcontrole dc, ins_srtcontrole sc, ins_deel d, ins_srtdeel sd, ins_srtgroep sg, ins_discipline disc, prs_kostenplaats kp, fin_btwtabelwaarde btw,
     alg_ruimte r, alg_verdieping v, alg_gebouw g, alg_locatie l, alg_district ds
WHERE dc.ins_scenario_key = 1
AND to_char(dc.ins_deelsrtcontrole_freezedate, 'YYYY') = fac.getsetting('mjb_freeze_year')
AND dc.ins_deelsrtcontrole_status = 2
AND dc.ins_srtcontrole_key = sc.ins_srtcontrole_key
AND d.ins_alg_ruimte_key = r.alg_ruimte_key
AND d.ins_alg_ruimte_type = 'R'
AND v.alg_verdieping_key = r.alg_verdieping_key
AND g.alg_gebouw_key = v.alg_gebouw_key
AND l.alg_locatie_key = g.alg_locatie_key
AND ds.alg_district_key = l.alg_district_key
AND d.ins_deel_key = dc.ins_deel_key
AND sd.ins_srtdeel_key = d.ins_srtdeel_key
AND sg.ins_srtgroep_key = sd.ins_srtgroep_key
AND disc.ins_discipline_key = sg.ins_discipline_key
AND sc.prs_kostenplaats_key = kp.prs_kostenplaats_key(+)
AND sc.fin_btwtabelwaarde_key = btw.fin_btwtabelwaarde_key(+)) x
LEFT JOIN (select * FROM ins_srtcontroledl_xcp WHERE ins_scenario_key = 1) xcp
ON xcp.ins_deel_key = x.ins_deel_key  AND xcp.ins_srtcontrole_key = x.ins_srtcontrole_key;

-- Omdat Tobias-AX geen CSV kan inlezen, maar (alleen/wel) Excel, doen we geen export, maar een rapport.
-- Vanuit dit rapport kan men dan een Excel-knop drukken, de xls openen en dan saven als xlsx.
CREATE OR REPLACE VIEW plat_v_rap_mjob_tobiasax
(Id,Bedrijf,Complexcode,Complexnaam,Clustercode,Clusternaam,Hoofdrecept,Groeprecept,Subreceptnummer,Subreceptomschrijving,Elementnummer,Elementbeschrijving,Hoeveelheid,Hoeveelheid_taak,Eenheid,Cyclus,Cyclus_afwijkend,
 Loonbedrag,Derden,Materieel,Materiaal,Uren,Betreft_percentage,Taak,Projectgroep,BTW,Opmerking,Begroting)
AS SELECT  x.ins_deelsrtcontrole_key,
        x.alg_district_omschrijving,
        x.alg_locatie_code,
        x.alg_locatie_omschrijving,
        x.alg_gebouw_code,
        x.alg_gebouw_naam,
        x.ins_discipline_omschrijving,
        x.ins_srtgroep_upper,
        x.ins_srtdeel_code_upper,
        x.ins_srtdeel_omschrijving,
        x.ins_deel_upper,
        x.ins_deel_opmerking,
        x.ins_deel_aantal,
        xcp.ins_srtcontroledl_xcp_aantal,
        x.ins_srtdeel_eenheid,
        x.ins_srtcontrole_periode,
        xcp.ins_srtcontroledl_xcp_periode,
        COALESCE(xcp.ins_srtcontroledl_xcp_kosten, x.ins_srtcontrole_kosten),
        COALESCE(xcp.ins_srtcontroledl_xcp_kosten2, x.ins_srtcontrole_kosten2),
        COALESCE(xcp.ins_srtcontroledl_xcp_kosten3, x.ins_srtcontrole_kosten3),
        COALESCE(xcp.ins_srtcontroledl_xcp_materia, x.ins_srtcontrole_materiaal),
        COALESCE(xcp.ins_srtcontroledl_xcp_uren, x.ins_srtcontrole_uren),
        COALESCE(xcp.ins_srtcontroledl_xcp_perc, x.ins_srtcontrole_percentage),
        x.ins_srtcontrole_omschrijving,
        x.prs_kostenplaats_upper,
        x.fin_btwtabelwaarde_perc,
        xcp.ins_srtcontroledl_xcp_opmerk,
        x.ins_deelsrtcontrole_freezecost
FROM
(SELECT d.ins_deel_key,
        disc.ins_discipline_omschrijving,
        sg.ins_srtgroep_upper,
        sd.ins_srtdeel_code_upper,
        sd.ins_srtdeel_omschrijving,
        d.ins_deel_upper,
        d.ins_deel_opmerking,
        d.ins_deel_aantal,
        sd.ins_srtdeel_eenheid,
        sc.ins_srtcontrole_periode,
        sc.ins_srtcontrole_omschrijving,
        sc.ins_srtcontrole_kosten,
        sc.ins_srtcontrole_kosten2,
        sc.ins_srtcontrole_kosten3,
        sc.ins_srtcontrole_materiaal,
        sc.ins_srtcontrole_uren,
        sc.ins_srtcontrole_percentage,
        dc.ins_deelsrtcontrole_freezecost,
        kp.prs_kostenplaats_upper,
        btw.fin_btwtabelwaarde_perc,
        dc.ins_srtcontrole_key,
        dc.ins_deelsrtcontrole_key,
        ds.alg_district_omschrijving,
        l.alg_locatie_code,
        l.alg_locatie_omschrijving,
        g.alg_gebouw_code,
        g.alg_gebouw_naam
FROM ins_deelsrtcontrole dc, ins_srtcontrole sc, ins_deel d, ins_srtdeel sd, ins_srtgroep sg, ins_discipline disc, prs_kostenplaats kp, fin_btwtabelwaarde btw,
     alg_ruimte r, alg_verdieping v, alg_gebouw g, alg_locatie l, alg_district ds
WHERE dc.ins_scenario_key = 1
AND to_char(dc.ins_deelsrtcontrole_freezedate, 'YYYY') = fac.getsetting('mjb_freeze_year')
AND dc.ins_deelsrtcontrole_status = 2
AND dc.ins_srtcontrole_key = sc.ins_srtcontrole_key
AND d.ins_alg_ruimte_key = r.alg_ruimte_key
AND d.ins_alg_ruimte_type = 'R'
AND v.alg_verdieping_key = r.alg_verdieping_key
AND g.alg_gebouw_key = v.alg_gebouw_key
AND l.alg_locatie_key = g.alg_locatie_key
AND ds.alg_district_key = l.alg_district_key
AND d.ins_deel_key = dc.ins_deel_key
AND sd.ins_srtdeel_key = d.ins_srtdeel_key
AND sg.ins_srtgroep_key = sd.ins_srtgroep_key
AND disc.ins_discipline_key = sg.ins_discipline_key
AND sc.prs_kostenplaats_key = kp.prs_kostenplaats_key(+)
AND sc.fin_btwtabelwaarde_key = btw.fin_btwtabelwaarde_key(+)) x
LEFT JOIN (select * FROM ins_srtcontroledl_xcp WHERE ins_scenario_key = 1) xcp
ON xcp.ins_deel_key = x.ins_deel_key  AND xcp.ins_srtcontrole_key = x.ins_srtcontrole_key;

-- PLAT#54229 Gebreken overzicht
CREATE OR REPLACE VIEW plat_v_rap_conditiemetingen
AS
   SELECT
          m.mld_melding_key,
          l.alg_locatie_omschrijving complexnummer,
          aog.alg_gebouw_code clusternummer,
          aog.alg_gebouw_naam clusternaam,
          id.ins_discipline_omschrijving hoofdrecept,
          isg.ins_srtgroep_omschrijving groeprecept,
          isd.ins_srtdeel_omschrijving || ' (' || isd.ins_srtdeel_code || ')'
             subrecept,
          m.mld_melding_key meldingnummer,
          m.mld_melding_datum datum_tijd,
          pf.prs_perslid_naam_full inspecteur,
          s.mld_statuses_omschrijving status,
          std.mld_stdmelding_omschrijving gebrek,
          m.mld_melding_omschrijving omschrijving,
          (SELECT fac_usrdata_omschr
             FROM mld_kenmerkmelding mk,
                  mld_kenmerk k,
                  mld_srtkenmerk sk,
                  fac_kenmerkdomein kd,
                  fac_usrtab ut,
                  fac_usrdata ud
            WHERE     k.mld_srtkenmerk_key = 1
                  AND sk.mld_srtkenmerk_key = k.mld_srtkenmerk_key
                  AND k.mld_kenmerk_key = mk.mld_kenmerk_key
                  AND sk.fac_kenmerkdomein_key = kd.fac_kenmerkdomein_key
                  AND ut.fac_usrtab_key = kd.fac_usrtab_key
                  AND ud.fac_usrtab_key = ut.fac_usrtab_key
                  AND TO_CHAR (fac_usrdata_key) = mld_kenmerkmelding_waarde
                  AND mk.mld_melding_key = m.mld_melding_key)
             ernst,
          (SELECT fac_usrdata_omschr
             FROM mld_kenmerkmelding mk,
                  mld_kenmerk k,
                  mld_srtkenmerk sk,
                  fac_kenmerkdomein kd,
                  fac_usrtab ut,
                  fac_usrdata ud
            WHERE     k.mld_srtkenmerk_key = 2
                  AND sk.mld_srtkenmerk_key = k.mld_srtkenmerk_key
                  AND k.mld_kenmerk_key = mk.mld_kenmerk_key
                  AND sk.fac_kenmerkdomein_key = kd.fac_kenmerkdomein_key
                  AND ut.fac_usrtab_key = kd.fac_usrtab_key
                  AND ud.fac_usrtab_key = ut.fac_usrtab_key
                  AND TO_CHAR (fac_usrdata_key) = mld_kenmerkmelding_waarde
                  AND mk.mld_melding_key = m.mld_melding_key)
             omvang,
          (SELECT fac_usrdata_omschr
             FROM mld_kenmerkmelding mk,
                  mld_kenmerk k,
                  mld_srtkenmerk sk,
                  fac_kenmerkdomein kd,
                  fac_usrtab ut,
                  fac_usrdata ud
            WHERE     k.mld_srtkenmerk_key = 3
                  AND sk.mld_srtkenmerk_key = k.mld_srtkenmerk_key
                  AND k.mld_kenmerk_key = mk.mld_kenmerk_key
                  AND sk.fac_kenmerkdomein_key = kd.fac_kenmerkdomein_key
                  AND ut.fac_usrtab_key = kd.fac_usrtab_key
                  AND ud.fac_usrtab_key = ut.fac_usrtab_key
                  AND TO_CHAR (fac_usrdata_key) = mld_kenmerkmelding_waarde
                  AND mk.mld_melding_key = m.mld_melding_key)
             intensiteit,
          (SELECT fac_usrdata_omschr
             FROM mld_kenmerkmelding mk,
                  mld_kenmerk k,
                  mld_srtkenmerk sk,
                  fac_kenmerkdomein kd,
                  fac_usrtab ut,
                  fac_usrdata ud
            WHERE     k.mld_srtkenmerk_key = 5
                  AND sk.mld_srtkenmerk_key = k.mld_srtkenmerk_key
                  AND k.mld_kenmerk_key = mk.mld_kenmerk_key
                  AND sk.fac_kenmerkdomein_key = kd.fac_kenmerkdomein_key
                  AND ut.fac_usrtab_key = kd.fac_usrtab_key
                  AND ud.fac_usrtab_key = ut.fac_usrtab_key
                  AND TO_CHAR (fac_usrdata_key) = mld_kenmerkmelding_waarde
                  AND mk.mld_melding_key = m.mld_melding_key)
             veiligheid_gezondheid,
          (SELECT fac_usrdata_omschr
             FROM mld_kenmerkmelding mk,
                  mld_kenmerk k,
                  mld_srtkenmerk sk,
                  fac_kenmerkdomein kd,
                  fac_usrtab ut,
                  fac_usrdata ud
            WHERE     k.mld_srtkenmerk_key = 6
                  AND sk.mld_srtkenmerk_key = k.mld_srtkenmerk_key
                  AND k.mld_kenmerk_key = mk.mld_kenmerk_key
                  AND sk.fac_kenmerkdomein_key = kd.fac_kenmerkdomein_key
                  AND ut.fac_usrtab_key = kd.fac_usrtab_key
                  AND ud.fac_usrtab_key = ut.fac_usrtab_key
                  AND TO_CHAR (fac_usrdata_key) = mld_kenmerkmelding_waarde
                  AND mk.mld_melding_key = m.mld_melding_key)
             cultuurhistorische_waarde,
          (SELECT fac_usrdata_omschr
             FROM mld_kenmerkmelding mk,
                  mld_kenmerk k,
                  mld_srtkenmerk sk,
                  fac_kenmerkdomein kd,
                  fac_usrtab ut,
                  fac_usrdata ud
            WHERE     k.mld_srtkenmerk_key = 7
                  AND sk.mld_srtkenmerk_key = k.mld_srtkenmerk_key
                  AND k.mld_kenmerk_key = mk.mld_kenmerk_key
                  AND sk.fac_kenmerkdomein_key = kd.fac_kenmerkdomein_key
                  AND ut.fac_usrtab_key = kd.fac_usrtab_key
                  AND ud.fac_usrtab_key = ut.fac_usrtab_key
                  AND TO_CHAR (fac_usrdata_key) = mld_kenmerkmelding_waarde
                  AND mk.mld_melding_key = m.mld_melding_key)
             gebruik_en_bedrijfsproces,
          (SELECT fac_usrdata_omschr
             FROM mld_kenmerkmelding mk,
                  mld_kenmerk k,
                  mld_srtkenmerk sk,
                  fac_kenmerkdomein kd,
                  fac_usrtab ut,
                  fac_usrdata ud
            WHERE     k.mld_srtkenmerk_key = 8
                  AND sk.mld_srtkenmerk_key = k.mld_srtkenmerk_key
                  AND k.mld_kenmerk_key = mk.mld_kenmerk_key
                  AND sk.fac_kenmerkdomein_key = kd.fac_kenmerkdomein_key
                  AND ut.fac_usrtab_key = kd.fac_usrtab_key
                  AND ud.fac_usrtab_key = ut.fac_usrtab_key
                  AND TO_CHAR (fac_usrdata_key) = mld_kenmerkmelding_waarde
                  AND mk.mld_melding_key = m.mld_melding_key)
             technische_vervolgschade,
          (SELECT fac_usrdata_omschr
             FROM mld_kenmerkmelding mk,
                  mld_kenmerk k,
                  mld_srtkenmerk sk,
                  fac_kenmerkdomein kd,
                  fac_usrtab ut,
                  fac_usrdata ud
            WHERE     k.mld_srtkenmerk_key = 9
                  AND sk.mld_srtkenmerk_key = k.mld_srtkenmerk_key
                  AND k.mld_kenmerk_key = mk.mld_kenmerk_key
                  AND sk.fac_kenmerkdomein_key = kd.fac_kenmerkdomein_key
                  AND ut.fac_usrtab_key = kd.fac_usrtab_key
                  AND ud.fac_usrtab_key = ut.fac_usrtab_key
                  AND TO_CHAR (fac_usrdata_key) = mld_kenmerkmelding_waarde
                  AND mk.mld_melding_key = m.mld_melding_key)
             toename_klachtenonderhoud,
          (SELECT fac_usrdata_omschr
             FROM mld_kenmerkmelding mk,
                  mld_kenmerk k,
                  mld_srtkenmerk sk,
                  fac_kenmerkdomein kd,
                  fac_usrtab ut,
                  fac_usrdata ud
            WHERE     k.mld_srtkenmerk_key = 10
                  AND sk.mld_srtkenmerk_key = k.mld_srtkenmerk_key
                  AND k.mld_kenmerk_key = mk.mld_kenmerk_key
                  AND sk.fac_kenmerkdomein_key = kd.fac_kenmerkdomein_key
                  AND ut.fac_usrtab_key = kd.fac_usrtab_key
                  AND ud.fac_usrtab_key = ut.fac_usrtab_key
                  AND TO_CHAR (fac_usrdata_key) = mld_kenmerkmelding_waarde
                  AND mk.mld_melding_key = m.mld_melding_key)
             beleving_esthetica
     FROM mld_melding m,
          mld_melding_object mo,
          ins_deel d,
          ins_srtdeel isd,
          ins_srtgroep isg,
          ins_discipline id,
          alg_v_allonrgoed_gegevens aog,
          alg_locatie l,
          mld_statuses s,
          prs_v_perslid_fullnames_all pf,
          mld_stdmelding std
    WHERE     m.mld_melding_key = mo.mld_melding_key
          AND d.ins_deel_key = mo.ins_deel_key
          AND d.ins_srtdeel_key = isd.ins_srtdeel_key
          AND isd.ins_srtgroep_key = isg.ins_srtgroep_key
          AND isg.ins_discipline_key = id.ins_discipline_key
          AND m.mld_alg_onroerendgoed_keys = aog.alg_onroerendgoed_keys
          AND l.alg_locatie_key = aog.alg_locatie_key
          AND s.mld_statuses_key = m.mld_melding_status
          AND m.prs_perslid_key = pf.prs_perslid_key
          AND m.mld_stdmelding_key = std.mld_stdmelding_key;

--SELECT 'ins_deel_key;Hoofdrecept;Groeprecept;Subreceptnummer;Subreceptomschrijving;Elementnummer;Element beschrijving;Hoeveelheid;Eenheid;ins_srtcontrole_key',0 FROM DUAL
--UNION ALL
--SELECT  d.ins_deel_key || ';' ||
--        disc.ins_discipline_omschrijving || ';' ||
--        sg.ins_srtgroep_upper || ';' ||
--        sd.ins_srtdeel_code_upper || ';' ||
--        sd.ins_srtdeel_omschrijving || ';' ||
--        d.ins_deel_upper || ';' ||
--        d.ins_deel_opmerking || ';' ||
--        d.ins_deel_aantal || ';' ||
--        sd.ins_srtdeel_eenheid || ';' ||
--        dc.ins_srtcontrole_key
--        , dc.ins_deelsrtcontrole_key
--FROM ins_deelsrtcontrole dc, ins_deel d, ins_srtdeel sd, ins_srtgroep sg, ins_discipline disc
--WHERE dc.ins_scenario_key = 1
--AND to_char(dc.ins_deelsrtcontrole_freezedate, 'YYYY') = fac.getsetting('mjb_freeze_year')
--AND dc.ins_deelsrtcontrole_status = 2
--AND d.ins_deel_key = dc.ins_deel_key
--AND sd.ins_srtdeel_key = d.ins_srtdeel_key
--AND sg.ins_srtgroep_key = sd.ins_srtgroep_key
--AND disc.ins_discipline_key = sg.ins_discipline_key;


CREATE OR REPLACE VIEW plat_v_export_MJOB_TOBIAS_AX (
   result,
   result_order
   )
AS
SELECT result, result_order FROM plat_v_exp_mjob_tobiasax_body;


-- NEN2767 Conditiemeting

-- 1. NEN2767-1. - Import StdMeldingKEY	Vakgroeptype	Vakgroep	Melding	Discipine	Groepsoort	Objectsoort

-- MBMB: TO DO: Import functie maken
-- PLAT#53170: Koppelen van soort gebrek (mld_stdmelding) aan elementen obv importsheet



-- 2. NEN2767-2. - Export functie (dummy) die de conditiescore berekend.
-- Eerst enkele mooie basis views die we goed kunnen gebruiken tbv de berekening,

CREATE OR REPLACE VIEW plat_v_system_nen2767
AS
	SELECT fac_usrdata_key, fac_usrdata_code, fac_usrdata_prijs
	FROM fac_usrdata
	WHERE fac_usrtab_key = 99
	AND fac_usrdata_verwijder IS NULL;

-- plat_v_nen2767_gebreken: hierin zitten alle objecten waarbij een melding (GEEN gebrek) is aangemaakt, en van alle meldingen "GEEN gebrek" geldt de laatste (op basis van datum).
-- Let op: dat wil niet zeggen dat er geen bevindingen op dat object na het laatste gebrek zijn geweest.

-- Kortom: registratie van wanneer de laatste keer op een object de melding "geen gebrek" werd geregistreerd.
-- mld_stdmelding_key = 9999 --> Standaard melding "Geen gebrek"
-- Resultaat: ins_deel_key, laatste datum geen gebrek (=meldingsdatum).
-- Hierin staan zowel bestaande (status = afgemeld 5/historie 6) als nieuwe (status = nieuw(2))
-- Een gebrek kan normaal gesproken alleen de status 2 (nieuw) of 5/6 (afgemeld 5/historie, oftewel afgehandeld) hebben.
CREATE OR REPLACE VIEW plat_v_nen2767_tmp_GEEN_gebrek
(ins_deel_key, mld_melding_key)
AS
	SELECT d.ins_deel_key, MAX(m.mld_melding_key)
	FROM mld_melding m, mld_melding_object mo, ins_deel d
	WHERE m.mld_stdmelding_key = 9999
	AND mo.mld_melding_key = m.mld_melding_key
	AND mo.mld_melding_object_verwijder IS NULL
	AND d.ins_deel_key = mo.ins_deel_key
	GROUP BY d.ins_deel_key;

CREATE OR REPLACE VIEW plat_v_nen2767_GEEN_gebrek
(ins_deel_key, mld_melding_key, mld_melding_status)
AS
	SELECT gg.ins_deel_key, gg.mld_melding_key, m.mld_melding_status
	FROM plat_v_nen2767_tmp_GEEN_gebrek gg, mld_melding m
	WHERE m.mld_melding_key = gg.mld_melding_key;


-- plat_v_nen2767_alle_gebreken: hierin zitten alle meldingen (gebreken) die relevant voor de berekening zijn, dus gebreken sinds de laatste melding "geen gebrek", waarbij van eventueel dubbele stdmeldingen alleen de laatste geldt!
-- Dit zijn alleen de gebreken NA(!) het laatste gebrek (daarvoor maken we dan handig gebruik van de view plat_v_nen2767_GEEN_gebrek), ongeacht de status!
-- We moeten de melding "GEEN GEBREK" (mld_stdmelding_key = 999) zelf wel uitsluiten, die doet uiteraard niet mee.
-- Merk op: alle 3 mld_kenmerkmelding zit geen outer join op, omdat ze overal verplicht zijn, zonder deze waarden is de conditiescore ook niet te berekenen overigens.
-- Details:
--  ins_srtdiscipline_key = 1 --> Meldingtype "NEN2767 - Conditiemeting"
--  mld_srtkenmerk_key = 1    --> Kenmerksoort "Ernst"        / conditiescore
--  mld_srtkenmerk_key = 3    --> Kenmerksoort "Intensiteit"  / conditiescore
--  mld_srtkenmerk_key = 2    --> Kenmerksoort "Omvang"       / conditiescore

CREATE OR REPLACE VIEW plat_v_nen2767_alle_gebreken
(ins_deel_key,
 mld_melding_key,
 mld_stdmelding_key,
 mld_melding_status,
 ernst,
 intensiteit,
 omvang
)
AS
	SELECT d.ins_deel_key, m.mld_melding_key, m.mld_stdmelding_key, m.mld_melding_status, km_ernst.mld_kenmerkmelding_waarde, km_intensiteit.mld_kenmerkmelding_waarde, ud_omvang.fac_usrdata_prijs
  FROM mld_melding m, mld_stdmelding sm, mld_discipline disc, mld_melding_object mo, ins_deel d,
  		 mld_kenmerkmelding km_ernst, mld_kenmerk k_ernst,
  		 mld_kenmerkmelding km_intensiteit, mld_kenmerk k_intensiteit,
  		 mld_kenmerkmelding km_omvang, mld_kenmerk k_omvang, fac_usrdata ud_omvang
  WHERE disc.ins_srtdiscipline_key = 1
  AND m.mld_stdmelding_key <> 9999
	AND disc.ins_discipline_verwijder IS NULL
	AND sm.mld_ins_discipline_key = disc.ins_discipline_key
	AND m.mld_stdmelding_key = sm.mld_stdmelding_key
	AND mo.mld_melding_key = m.mld_melding_key
	AND mo.mld_melding_object_verwijder IS NULL
	AND d.ins_deel_key = mo.ins_deel_key
	AND km_ernst.mld_melding_key = m.mld_melding_key
	AND k_ernst.mld_kenmerk_key = km_ernst.mld_kenmerk_key
	AND k_ernst.mld_srtkenmerk_key = 1
	AND km_intensiteit.mld_melding_key = m.mld_melding_key
	AND k_intensiteit.mld_kenmerk_key = km_intensiteit.mld_kenmerk_key
	AND k_intensiteit.mld_srtkenmerk_key = 3
	AND km_omvang.mld_melding_key = m.mld_melding_key
	AND k_omvang.mld_kenmerk_key = km_omvang.mld_kenmerk_key
	AND k_omvang.mld_srtkenmerk_key = 2
	AND ud_omvang.fac_usrdata_key = fac.safe_to_number(km_omvang.mld_kenmerkmelding_waarde)
	AND m.mld_melding_key >= COALESCE((SELECT MAX(gg.mld_melding_key) FROM plat_v_nen2767_GEEN_gebrek gg WHERE gg.ins_deel_key = d.ins_deel_key), m.mld_melding_key)
	AND m.mld_melding_datum >= SYSDATE - (SELECT COALESCE(s.fac_usrdata_prijs , 30) FROM plat_v_system_nen2767 s WHERE s.fac_usrdata_key = 999)	;

-- Ontdubbel eventuele dezelfde gebreken die op hetzelfde object is gemaakt, dus wanneer kort achter elkaar hetzelfde gebrek (stdmelding) is ingelegd, dat geldt de laatste (=hoogste melding_key)
CREATE OR REPLACE VIEW plat_v_nen2767_per_srtgebrek
(ins_deel_key,
 mld_melding_key,
 mld_stdmelding_key,
 mld_melding_status,
 ernst,
 intensiteit,
 omvang
)
AS
	SELECT a.ins_deel_key, a.mld_melding_key, a.mld_stdmelding_key, a.mld_melding_status, a.ernst, a.intensiteit, a.omvang
	FROM plat_v_nen2767_alle_gebreken a,
			(SELECT a2.mld_stdmelding_key, a2.ins_deel_key, MAX(a2.mld_melding_key) as mld_melding_key
			FROM plat_v_nen2767_alle_gebreken a2
			GROUP BY a2.mld_stdmelding_key, a2.ins_deel_key) b
	WHERE a.mld_melding_key = b.mld_melding_key
	AND a.ins_deel_key = b.ins_deel_key;


--  mld_srtkenmerk_key = 5    --> Kenmerksoort "Veiligheid/gezondheid" 					/ prioriteitsscore
--  mld_srtkenmerk_key = 6    --> Kenmerksoort "Cultuurhistorische waarde" 			/ prioriteitsscore
--  mld_srtkenmerk_key = 7    --> Kenmerksoort "Gebruik en bedrijfsproces" 			/ prioriteitsscore
--  mld_srtkenmerk_key = 8    --> Kenmerksoort "Technische vervolgschade" 			/ prioriteitsscore
--  mld_srtkenmerk_key = 9    --> Kenmerksoort "Toename klachtenonderhoud" 			/ prioriteitsscore
--  mld_srtkenmerk_key =10    --> Kenmerksoort "Beleving, esthetica" 			/ prioriteitsscore
CREATE OR REPLACE VIEW plat_v_nen2767_prioriteit
(ins_deel_key,
 mld_melding_key,
 mld_stdmelding_key,
 mld_melding_status,
 veiligheid,
 cultuur,
 gebruik,
 vervolgschade,
 klachtenonderhoud,
 beleving
)
AS
	SELECT d.ins_deel_key, m.mld_melding_key, m.mld_stdmelding_key, m.mld_melding_status,
				 km_5.mld_kenmerkmelding_waarde, km_6.mld_kenmerkmelding_waarde, km_7.mld_kenmerkmelding_waarde, km_8.mld_kenmerkmelding_waarde, km_9.mld_kenmerkmelding_waarde, km_10.mld_kenmerkmelding_waarde
  FROM mld_melding m, mld_stdmelding sm, mld_discipline disc, mld_melding_object mo, ins_deel d,
  		 mld_kenmerkmelding km_5, mld_kenmerk k_5,
  		 mld_kenmerkmelding km_6, mld_kenmerk k_6,
  		 mld_kenmerkmelding km_7, mld_kenmerk k_7,
  		 mld_kenmerkmelding km_8, mld_kenmerk k_8,
  		 mld_kenmerkmelding km_9, mld_kenmerk k_9,
  		 mld_kenmerkmelding km_10, mld_kenmerk k_10
  WHERE disc.ins_srtdiscipline_key = 1
  AND m.mld_stdmelding_key <> 9999
	AND disc.ins_discipline_verwijder IS NULL
	AND sm.mld_ins_discipline_key = disc.ins_discipline_key
	AND m.mld_stdmelding_key = sm.mld_stdmelding_key
	AND mo.mld_melding_key = m.mld_melding_key
	AND mo.mld_melding_object_verwijder IS NULL
	AND d.ins_deel_key = mo.ins_deel_key
	AND km_5.mld_melding_key = m.mld_melding_key
	AND k_5.mld_kenmerk_key = km_5.mld_kenmerk_key
	AND k_5.mld_srtkenmerk_key = 5
	AND km_6.mld_melding_key = m.mld_melding_key
	AND k_6.mld_kenmerk_key = km_6.mld_kenmerk_key
	AND k_6.mld_srtkenmerk_key = 6
	AND km_7.mld_melding_key = m.mld_melding_key
	AND k_7.mld_kenmerk_key = km_7.mld_kenmerk_key
	AND k_7.mld_srtkenmerk_key = 7
	AND km_8.mld_melding_key = m.mld_melding_key
	AND k_8.mld_kenmerk_key = km_8.mld_kenmerk_key
	AND k_8.mld_srtkenmerk_key = 8
	AND km_9.mld_melding_key = m.mld_melding_key
	AND k_9.mld_kenmerk_key = km_9.mld_kenmerk_key
	AND k_9.mld_srtkenmerk_key = 9
	AND km_10.mld_melding_key = m.mld_melding_key
	AND k_10.mld_kenmerk_key = km_10.mld_kenmerk_key
	AND k_10.mld_srtkenmerk_key = 10
	AND m.mld_melding_key >= COALESCE((SELECT MAX(gg.mld_melding_key) FROM plat_v_nen2767_GEEN_gebrek gg WHERE gg.ins_deel_key = d.ins_deel_key), m.mld_melding_key)
	AND m.mld_melding_datum >= SYSDATE - (SELECT COALESCE(s.fac_usrdata_prijs , 30) FROM plat_v_system_nen2767 s WHERE s.fac_usrdata_key = 999)	;


-- Ontdubbel eventuele dezelfde gebreken die op hetzelfde object is gemaakt, dus wanneer kort achter elkaar hetzelfde gebrek (stdmelding) is ingelegd, dat geldt de laatste (=hoogste melding_key)
CREATE OR REPLACE VIEW plat_v_nen2767_prio_srtgebrek
(ins_deel_key,
 mld_melding_key,
 mld_stdmelding_key,
 mld_melding_status,
 veiligheid,
 cultuur,
 gebruik,
 vervolgschade,
 klachtenonderhoud,
 beleving
)
AS
	SELECT a.ins_deel_key, a.mld_melding_key, a.mld_stdmelding_key, a.mld_melding_status, a.veiligheid, a.cultuur, a.gebruik, a.vervolgschade, a.klachtenonderhoud, a.beleving
	FROM plat_v_nen2767_prioriteit a,
			(SELECT a2.mld_stdmelding_key, a2.ins_deel_key, MAX(a2.mld_melding_key) as mld_melding_key
			FROM plat_v_nen2767_prioriteit a2
			GROUP BY a2.mld_stdmelding_key, a2.ins_deel_key) b
	WHERE a.mld_melding_key = b.mld_melding_key
	AND a.ins_deel_key = b.ins_deel_key;


CREATE OR REPLACE FUNCTION plat_nen2767_meth12_cond_score (p_ernst IN NUMBER, p_intens IN NUMBER, p_omvang IN NUMBER) RETURN NUMBER
AS
  	v_result   NUMBER(10);
BEGIN
	BEGIN
		v_result := NULL;
		CASE
			-- E - Ernstig gebrek (key = 3), Intensiteit Beginstadium (key 20)'
			WHEN p_ernst = 3  AND p_intens = 20 AND p_omvang < 2		THEN v_result := 1;
			WHEN p_ernst = 3  AND p_intens = 20 AND p_omvang < 10		THEN v_result := 1;
			WHEN p_ernst = 3  AND p_intens = 20 AND p_omvang < 30		THEN v_result := 2;
			WHEN p_ernst = 3  AND p_intens = 20 AND p_omvang < 70		THEN v_result := 3;
			WHEN p_ernst = 3  AND p_intens = 20 AND p_omvang <= 100	THEN v_result := 4;
			-- E - Ernstig gebrek (key = 3), Intensiteit Gevorderd stadium (key 21)'
			WHEN p_ernst = 3  AND p_intens = 21 AND p_omvang < 2		THEN v_result := 1;
			WHEN p_ernst = 3  AND p_intens = 21 AND p_omvang < 10		THEN v_result := 2;
			WHEN p_ernst = 3  AND p_intens = 21 AND p_omvang < 30		THEN v_result := 3;
			WHEN p_ernst = 3  AND p_intens = 21 AND p_omvang < 70		THEN v_result := 4;
			WHEN p_ernst = 3  AND p_intens = 21 AND p_omvang <= 100	THEN v_result := 5;
			-- E - Ernstig gebrek (key = 3), Intensiteit Eindstadium (key 22)'
			WHEN p_ernst = 3  AND p_intens = 22 AND p_omvang < 2		THEN v_result := 2;
			WHEN p_ernst = 3  AND p_intens = 22 AND p_omvang < 10		THEN v_result := 3;
			WHEN p_ernst = 3  AND p_intens = 22 AND p_omvang < 30		THEN v_result := 4;
			WHEN p_ernst = 3  AND p_intens = 22 AND p_omvang < 70		THEN v_result := 5;
			WHEN p_ernst = 3  AND p_intens = 22 AND p_omvang <= 100	THEN v_result := 6;
			-- S - Serieus gebrek (key = 2), Intensiteit Beginstadium (key 20)'
			WHEN p_ernst = 2  AND p_intens = 20 AND p_omvang < 2		THEN v_result := 1;
			WHEN p_ernst = 2  AND p_intens = 20 AND p_omvang < 10		THEN v_result := 1;
			WHEN p_ernst = 2  AND p_intens = 20 AND p_omvang < 30		THEN v_result := 1;
			WHEN p_ernst = 2  AND p_intens = 20 AND p_omvang < 70		THEN v_result := 2;
			WHEN p_ernst = 2  AND p_intens = 20 AND p_omvang <= 100	THEN v_result := 3;
			-- S - Serieus gebrek (key = 2), Intensiteit Gevorderd stadium (key 21)'
			WHEN p_ernst = 2  AND p_intens = 21 AND p_omvang < 2		THEN v_result := 1;
			WHEN p_ernst = 2  AND p_intens = 21 AND p_omvang < 10		THEN v_result := 2;
			WHEN p_ernst = 2  AND p_intens = 21 AND p_omvang < 30		THEN v_result := 3;
			WHEN p_ernst = 2  AND p_intens = 21 AND p_omvang < 70		THEN v_result := 3;
			WHEN p_ernst = 2  AND p_intens = 21 AND p_omvang <= 100	THEN v_result := 4;
			-- S - Serieus gebrek (key = 2), Intensiteit Eindstadium (key 22)'
			WHEN p_ernst = 2  AND p_intens = 22 AND p_omvang < 2		THEN v_result := 1;
			WHEN p_ernst = 2  AND p_intens = 22 AND p_omvang < 10		THEN v_result := 2;
			WHEN p_ernst = 2  AND p_intens = 22 AND p_omvang < 30		THEN v_result := 3;
			WHEN p_ernst = 2  AND p_intens = 22 AND p_omvang < 70		THEN v_result := 4;
			WHEN p_ernst = 2  AND p_intens = 22 AND p_omvang <= 100	THEN v_result := 5;
			-- G - Gering gebrek (key = 1), Intensiteit Beginstadium (key 20)'
			WHEN p_ernst = 1  AND p_intens = 20 AND p_omvang < 2		THEN v_result := 1;
			WHEN p_ernst = 1  AND p_intens = 20 AND p_omvang < 10		THEN v_result := 1;
			WHEN p_ernst = 1  AND p_intens = 20 AND p_omvang < 30		THEN v_result := 1;
			WHEN p_ernst = 1  AND p_intens = 20 AND p_omvang < 70		THEN v_result := 1;
			WHEN p_ernst = 1  AND p_intens = 20 AND p_omvang <= 100	THEN v_result := 2;
			-- G - Gering gebrek (key = 1), Intensiteit Gevorderd stadium (key 21)'
			WHEN p_ernst = 1  AND p_intens = 21 AND p_omvang < 2		THEN v_result := 1;
			WHEN p_ernst = 1  AND p_intens = 21 AND p_omvang < 10		THEN v_result := 1;
			WHEN p_ernst = 1  AND p_intens = 21 AND p_omvang < 30		THEN v_result := 1;
			WHEN p_ernst = 1  AND p_intens = 21 AND p_omvang < 70		THEN v_result := 2;
			WHEN p_ernst = 1  AND p_intens = 21 AND p_omvang <= 100	THEN v_result := 3;
			-- G - Gering gebrek (key = 1), Intensiteit Eindstadium (key 22)'
			WHEN p_ernst = 1  AND p_intens = 22 AND p_omvang < 2		THEN v_result := 1;
			WHEN p_ernst = 1  AND p_intens = 22 AND p_omvang < 10		THEN v_result := 1;
			WHEN p_ernst = 1  AND p_intens = 22 AND p_omvang < 30		THEN v_result := 2;
			WHEN p_ernst = 1  AND p_intens = 22 AND p_omvang < 70		THEN v_result := 3;
			WHEN p_ernst = 1  AND p_intens = 22 AND p_omvang <= 100	THEN v_result := 4;
		END CASE;
  EXCEPTION
     WHEN OTHERS
     THEN
        v_result := NULL;
  END;

  RETURN v_result;
END;
/

CREATE OR REPLACE FUNCTION plat_nen2767_corr_cond_score (p_cond_score IN NUMBER) RETURN NUMBER
AS
  v_result   NUMBER(4,2);
BEGIN
		CASE
			WHEN p_cond_score = 1 THEN v_result := 1;
			WHEN p_cond_score = 2 THEN v_result := 1.02;
			WHEN p_cond_score = 3 THEN v_result := 1.1;
			WHEN p_cond_score = 4 THEN v_result := 1.3;
			WHEN p_cond_score = 5 THEN v_result := 1.7;
			WHEN p_cond_score = 6 THEN v_result := 2;
		END CASE;
  RETURN v_result;
END;
/

CREATE OR REPLACE FUNCTION plat_nen2767_cond_herleiding (p_cond_tussen_score IN NUMBER) RETURN NUMBER
AS
  v_result   NUMBER(10);
BEGIN
		CASE
			WHEN p_cond_tussen_score <= 1.01 THEN v_result := 1;
			WHEN p_cond_tussen_score <= 1.04 THEN v_result := 2;
			WHEN p_cond_tussen_score <= 1.15 THEN v_result := 3;
			WHEN p_cond_tussen_score <= 1.4 THEN v_result := 4;
			WHEN p_cond_tussen_score <= 1.78 THEN v_result := 5;
			ELSE v_result := 6;
		END CASE;
  RETURN v_result;
END;
/



-- 'Aspectenmatrix','NEN2767 Aspectenmatrix');
--  key omschrijving
--  30, 'NVT'
--  31, 'Gering'
--  32, 'Matig'
--  33, 'Sterk'
CREATE OR REPLACE FUNCTION plat_nen2767_prio_score (p_veiligheid IN NUMBER, p_cultuur IN NUMBER, p_gebruik IN NUMBER, p_vervolgschade IN NUMBER, p_klachtenonderhoud IN NUMBER, p_beleving IN NUMBER) RETURN NUMBER
AS
  	v_result   NUMBER(10);
BEGIN
	BEGIN
		v_result := NULL;
		CASE
			WHEN p_veiligheid = 33 THEN v_result := 1;
			WHEN p_veiligheid = 32 OR p_cultuur = 33 THEN v_result := 2;
			WHEN p_veiligheid = 31 OR p_cultuur = 32 OR p_gebruik = 33 THEN v_result := 3;
			WHEN p_cultuur = 31 OR p_gebruik = 32 THEN v_result := 4;
			WHEN p_gebruik = 31 OR p_vervolgschade = 33 OR p_klachtenonderhoud = 33 THEN v_result := 5;
			WHEN p_vervolgschade = 32 OR p_klachtenonderhoud = 32 THEN v_result := 6;
			WHEN p_vervolgschade = 31 OR p_klachtenonderhoud = 31 OR p_beleving = 33 THEN v_result := 7;
			WHEN p_beleving = 32 THEN v_result := 8;
			WHEN p_beleving = 31 THEN v_result := 9;
		END CASE;
  EXCEPTION
     WHEN OTHERS
     THEN
        v_result := NULL;
  END;
  RETURN v_result;
END;
/



-- 2. NEN2767-2. - Export functie (dummy) die de conditiescore berekend.

CREATE OR REPLACE FUNCTION plat_nen2767_meth3_cond_score (p_cond_score_corr_str IN VARCHAR2, p_omvang_str IN VARCHAR2) RETURN NUMBER
AS
  	v_result   							NUMBER(10,4);
  	v_cond_score_corr_str 	VARCHAR2(255);
  	v_omvang_str						VARCHAR2(255);
  	v_fielddelimitor  			VARCHAR2(1);
  	l_cond_score_corr				NUMBER(10,2);
  	l_omvang								NUMBER(10);
  	l_som_omvang						NUMBER(10);

BEGIN
	BEGIN
		v_result := 0;
		v_fielddelimitor := ';';
		l_som_omvang := 0;

		v_cond_score_corr_str := p_cond_score_corr_str;
		v_omvang_str := p_omvang_str;

		WHILE (v_cond_score_corr_str IS NOT NULL AND v_omvang_str IS NOT NULL)
		LOOP
    	BEGIN
    		fac.imp_getfield (v_cond_score_corr_str, v_fielddelimitor, l_cond_score_corr);
    		fac.imp_getfield (v_omvang_str, v_fielddelimitor, l_omvang);

    		v_result := v_result + (fac.safe_to_number(l_cond_score_corr) * fac.safe_to_number(l_omvang));
    		l_som_omvang := l_som_omvang + fac.safe_to_number(l_omvang);
    	END;
   	END LOOP;
   	v_result := ROUND(v_result / l_som_omvang , 4);
   	v_result := plat_nen2767_cond_herleiding(v_result);


	EXCEPTION
     WHEN OTHERS
     THEN
        v_result := NULL;
  END;

  RETURN v_result;
END;
/

-- Basis view om de conditie-score geaggregeerd op complex (alg_locatie) en cluster (alg_gebouw) te berekenen.
CREATE OR REPLACE VIEW plat_v_aggr_cond_score
(alg_locatie_key, alg_gebouw_key, ins_deel_key, ins_deel_aantal, ins_deel_mjb_score1, kosten, correctiefactor, totale_vervangingswaarde, correctie_vervangingswaarde)
AS
SELECT  l.alg_locatie_key, g.alg_gebouw_key, d.ins_deel_key, MAX(d.ins_deel_aantal), MAX(d.ins_deel_mjb_score1),
		        MAX(COALESCE(sc.INS_SRTCONTROLE_KOSTEN,0) + COALESCE(sc.INS_SRTCONTROLE_KOSTEN2,0) + COALESCE(sc.INS_SRTCONTROLE_KOSTEN3, 0) + COALESCE(sc.INS_SRTCONTROLE_MATERIAAL, 0)) kosten,
		        plat_nen2767_corr_cond_score(MAX(d.ins_deel_mjb_score1)) correctiefactor,
		        MAX(d.ins_deel_aantal) * MAX(COALESCE(sc.INS_SRTCONTROLE_KOSTEN,0) + COALESCE(sc.INS_SRTCONTROLE_KOSTEN2,0) + COALESCE(sc.INS_SRTCONTROLE_KOSTEN3, 0) + COALESCE(sc.INS_SRTCONTROLE_MATERIAAL, 0)) totale_vervangingswaarde,
		        MAX(d.ins_deel_aantal) * MAX(COALESCE(sc.INS_SRTCONTROLE_KOSTEN,0) + COALESCE(sc.INS_SRTCONTROLE_KOSTEN2,0) + COALESCE(sc.INS_SRTCONTROLE_KOSTEN3, 0) + COALESCE(sc.INS_SRTCONTROLE_MATERIAAL, 0)) * plat_nen2767_corr_cond_score(MAX(d.ins_deel_mjb_score1)) correctie_vervangingswaarde
        FROM ins_deel d, ins_srtcontrole sc, alg_ruimte r, alg_verdieping v, alg_gebouw g, alg_locatie l
				WHERE d.ins_deel_verwijder IS NULL
				AND ins_deel_mjb_score1 IS NOT NULL
				AND sc.ins_srtinstallatie_key = d.ins_srtdeel_key
				AND d.ins_alg_ruimte_type = 'R'
        AND d.ins_alg_ruimte_key = r.alg_ruimte_key
        AND r.alg_verdieping_key = v.alg_verdieping_key
        AND v.alg_gebouw_key = g.alg_gebouw_key
        AND g.alg_locatie_key = l.alg_locatie_key
				AND sc.ins_srtcontrole_niveau = 'S'
				AND ins_scenario_key = 1
				AND ctr_discipline_key IN (SELECT ins_discipline_key
                                            FROM ctr_discipline d, ctr_disc_params dp
                                            WHERE dp.ctr_ins_discipline_key = d.ins_discipline_key
                                            AND d.ins_discipline_verwijder IS NULL
                                            AND dp.ctr_disc_params_ismjob = 1)
			GROUP BY d.ins_deel_key, l.alg_locatie_key, g.alg_gebouw_key;


CREATE OR REPLACE PROCEDURE plat_export_nen2767_cond_score (
   p_applname   IN   VARCHAR2,
   p_applrun    IN   VARCHAR2,
   p_filedir    IN   VARCHAR2,
   p_filename   IN   VARCHAR2
)
AS
		-- Twee hoofdcursors: deze bevat nieuwe meldingen (status = nieuw), oftewel:
		-- 1. a) evt nieuwe "geen gebrek" melding, dit wordt 1e loop
		--    b) variant van vorig punt 1a): een groepering op mld_melding_key, tbv 2e loop

		-- 2. a) de nieuwe meldingsgebreken (na geen gebrek melding),dit wordt de 3e loop
		--    b) variant van vorig punt 2a): een groepering op mld_melding_key, tbv 4e loop

		-- Cursor 1a
		CURSOR c_nieuwe_GEEN_gebreken
		IS
			SELECT ins_deel_key, mld_melding_key FROM plat_v_nen2767_GEEN_gebrek
			WHERE mld_melding_status = 2;
		-- Cursor 1b
		CURSOR c_GRP_nieuwe_GEEN_gebreken
		IS
			SELECT mld_melding_key FROM plat_v_nen2767_GEEN_gebrek
			WHERE mld_melding_status = 2
			GROUP BY mld_melding_key;
		-- Cursor 2a
		CURSOR c_nieuwe_gebreken
		IS
			SELECT ins_deel_key FROM plat_v_nen2767_per_srtgebrek
			WHERE mld_melding_status = 2
			GROUP BY ins_deel_key;
		-- Cursor 2b
		CURSOR c_GRP_nieuwe_gebreken
		IS
			SELECT mld_melding_key FROM plat_v_nen2767_per_srtgebrek
			WHERE mld_melding_status = 2
			GROUP BY mld_melding_key;


    -- Bereken methode 1 en 2: de  gebreken op betreffende object hebben WEL dezelfde ernst en intensiteit;
    CURSOR c_gebreken_zelfde_ernst_intens (p_ins_deel_key NUMBER)
    IS
        SELECT ins_deel_key, ernst, intensiteit, LEAST(100, SUM(omvang)) AS omvang
				FROM plat_v_nen2767_per_srtgebrek
				WHERE ins_deel_key = p_ins_deel_key
				HAVING count(*) = (select count (*) from plat_v_nen2767_per_srtgebrek WHERE ins_deel_key = p_ins_deel_key)
				GROUP BY ins_deel_key, ernst, intensiteit;

    -- Bereken methode3: de gebreken op betreffende object hebben niet dezelfde ernst en intensiteit;
    -- Let op: deze methodiek écht pas activeren wanneer aan deze voorwaarden voldaan wordt (2 of meer gebreken en/of niet dezelfde ernst/intensiteit) want deze methodiek loslaten op 1 gebrek geeft niet altijd de goede uitkomst.
    CURSOR c_gebreken_delta_ernst_intens (p_ins_deel_key NUMBER)
    IS
        SELECT ins_deel_key, ernst, intensiteit, LEAST(100, SUM(omvang)) AS omvang
				FROM plat_v_nen2767_per_srtgebrek
				WHERE ins_deel_key = p_ins_deel_key
				HAVING count(*) <> (select count (*) from plat_v_nen2767_per_srtgebrek WHERE ins_deel_key = p_ins_deel_key)
				GROUP BY ins_deel_key, ernst, intensiteit;

		-- T.b.v. de prioriteitsscore een cursor die van alle meldingen op het object de maximale prio-score oplevert


		CURSOR c_prio_score (p_ins_deel_key NUMBER)
    IS
        SELECT ins_deel_key, MAX(veiligheid) AS veiligheid, MAX(cultuur) AS cultuur, MAX(gebruik) AS gebruik, MAX(vervolgschade) AS vervolgschade, MAX(klachtenonderhoud) AS klachtenonderhoud, MAX(beleving) AS beleving
				FROM plat_v_nen2767_prio_srtgebrek
				WHERE ins_deel_key = p_ins_deel_key
				GROUP BY ins_deel_key;


		l_gevonden 									NUMBER(10);
		l_facilitor_prs_perslid_key NUMBER(10);
		l_cond_score                NUMBER(10);
		l_cond_score_corr           NUMBER(10,2);
		l_som_omvang								NUMBER(10);

		l_cond_score_corr_str				VARCHAR2(255);
		l_cond_omvang_str						VARCHAR2(255);

		l_prio_score                NUMBER(10);

BEGIN

  SELECT COUNT(*)
  INTO l_gevonden
  FROM prs_perslid
  WHERE prs_perslid_oslogin = '_FACILITOR'
  AND prs_perslid_verwijder IS NULL;

  IF l_gevonden = 1
  THEN
	  SELECT prs_perslid_key
	  INTO l_facilitor_prs_perslid_key
	  FROM prs_perslid
	  WHERE prs_perslid_oslogin = '_FACILITOR'
	  AND prs_perslid_verwijder IS NULL;
  END IF;

  -- Hier de verzameling aan geen gebreken, elk object gaat conditiescore 1 krijgen.
  -- Mochten er toch nog gebreken na (dus op een tijdstip later) de melding "Geen gebrek" zijn ingevoerd, dan komen die in de volgende cursor/loop 2a (c_nieuwe_gebreken) aan de orde, en wordt de conditiescore dan alsnog bijgewerkt.
  -- LOOP 1A
  FOR rec_geen_gebrek IN c_nieuwe_GEEN_gebreken
  LOOP
  	  UPDATE ins_deel
  	  SET ins_deel_mjb_score1 = 1, ins_deel_mjb_score2 = NULL
  	  WHERE ins_deel_key =  rec_geen_gebrek.ins_deel_key;

  	  IF l_facilitor_prs_perslid_key IS NOT NULL
  	  THEN
  	  	fac.trackaction ('#INSUPD', rec_geen_gebrek.ins_deel_key, l_facilitor_prs_perslid_key, NULL, 'A.g.v. geen gebrek (nr. ' ||  rec_geen_gebrek.mld_melding_key || ') is conditiescore op 1 gezet');
  	  	fac.trackaction ('#INSUPD', rec_geen_gebrek.ins_deel_key, l_facilitor_prs_perslid_key, NULL, 'A.g.v. geen gebrek (nr. ' ||  rec_geen_gebrek.mld_melding_key || ') is prioriteitsscore geleegd (NVT)');
  	  END IF;

  	  -- Omdat 1 melding (geen gebrek) meerdere objecten kan bevatten, kunnen we nog geen update van melding status doen, eerst moeten alle objecten ervan worden verwerkt.
  	  -- Mogelijk ook anders kan op foutmelding Mutating triggers oid.
  	  -- Dus update status in een loop hieronder...
  END LOOP;
  -- LOOP 1B
  FOR rec_geen_gebrek IN c_GRP_nieuwe_GEEN_gebreken
  LOOP
  	  UPDATE mld_melding
  	  SET mld_melding_status = 5
  	  WHERE mld_melding_key = rec_geen_gebrek.mld_melding_key;

  	  IF l_facilitor_prs_perslid_key IS NOT NULL
  	  THEN
  	  		fac.trackaction ('#MLDAFM', rec_geen_gebrek.mld_melding_key, l_facilitor_prs_perslid_key, NULL, 'Gebrek verwerkt in de conditiescore van het object');
  	 	END IF;
  END LOOP;

  -- Nu de 'Geen gebrek' meldingen zijn verwerkt, gaan we nu over op de gebreken (sinds de laatste geen gebrek en rekening houdende met de instelling '$AantalDagenConditieScore').
  -- In deze loop staan alle ins_delen waarvan een nieuw gebrek is geregistreerd, en per ins_deel wordt de conditiescore bepaald.
  -- LOOP 2A
  FOR rec_gebrek IN c_nieuwe_gebreken
  LOOP
  	  l_cond_score := NULL;
  		-- Object heeft hetzij alleen maar gebreken met zelfde_ernst_intens (hetzij gebreken met verschillende ernst en intensiteit, dat wordt hierna in een volgende lus afgewerkt)
  		FOR rec_zelfde IN c_gebreken_zelfde_ernst_intens(rec_gebrek.ins_deel_key)
  		LOOP
	  			-- Deze loop wordt feiltelijk 1x doorlopen...
	  			l_cond_score := plat_nen2767_meth12_cond_score(rec_zelfde.ernst, rec_zelfde.intensiteit,rec_zelfde.omvang);
  	  END LOOP;

  	  IF l_cond_score IS NULL
  	  THEN
	  	  	l_som_omvang := 0;
	  	  	l_cond_score_corr_str := '';
	  	  	l_cond_omvang_str := '';
		  	  -- Het object heeft gebreken met verschillende (delta) ernst_intens, in de 1e lus hierboven is die niet langsgekomen.
		  		FOR rec_delta IN c_gebreken_delta_ernst_intens(rec_gebrek.ins_deel_key)
		  		LOOP
			  			-- Deze loop wordt minimaal 2 keer doorlopen...
			  			l_cond_score := plat_nen2767_meth12_cond_score(rec_delta.ernst, rec_delta.intensiteit, 100); -- Doorrekenen op 100%, zie par 4.3, pagina 12 van document 'Conditiemeting 1.0'
			  			l_cond_score_corr := plat_nen2767_corr_cond_score(l_cond_score); -- Uitrekenen van daarvan de gecorrigeerde score is...
			  			l_cond_score_corr_str := l_cond_score_corr_str || ';' || l_cond_score_corr ; -- Een array voor de gecorrigeerde score
			  			l_cond_omvang_str := l_cond_omvang_str || ';' || rec_delta.omvang ;-- En eveneens een 'array' voor de echte omvang ipv 100 van hierboven, die hebben we straks weer nodig
			  			l_som_omvang := l_som_omvang + rec_delta.omvang ;-- En we gaan de omvang van alle gebreken bij elkaar optellen, om te kijken of de som < 100 is, want dan is er ook een gedeelte (100 - som) die geen gebreken heeft, dat doet namelijk ook mee in de berekening...
			  	END LOOP;

			  	IF l_som_omvang < 100
			  	THEN
				  		-- Er is nog een rest-gedeelte (omvang) die geen gebreken heeft, die doet met score 1 mee in de berekening.
				  		l_cond_score_corr_str := l_cond_score_corr_str || ';' || '1' ;
				  		l_cond_omvang_str := l_cond_omvang_str || ';' || (100 - l_som_omvang);
			  	END IF;
			  	l_cond_score_corr_str := SUBSTR(l_cond_score_corr_str,2); -- eerste ; eraf strippen
			  	l_cond_omvang_str := SUBSTR(l_cond_omvang_str,2); -- eerste ; eraf strippen

			  	l_cond_score := plat_nen2767_meth3_cond_score(l_cond_score_corr_str, l_cond_omvang_str);
		  END IF;


			UPDATE ins_deel
  	  SET ins_deel_mjb_score1 = l_cond_score
  	  WHERE ins_deel_key =  rec_gebrek.ins_deel_key;

  	  IF l_facilitor_prs_perslid_key IS NOT NULL
  	  THEN
  	  	fac.trackaction ('#INSUPD', rec_gebrek.ins_deel_key, l_facilitor_prs_perslid_key, NULL, 'Conditiescore is op ' ||  COALESCE(l_cond_score, 'leeg') || ' gezet');
  	  END IF;

	  	-- Nu nog de prioriteitsscore per object instellen
	  	FOR rec_prio IN c_prio_score(rec_gebrek.ins_deel_key)
		  LOOP
	  		l_prio_score := plat_nen2767_prio_score (rec_prio.veiligheid, rec_prio.cultuur, rec_prio.gebruik, rec_prio.vervolgschade, rec_prio.klachtenonderhoud, rec_prio.beleving);
	  		UPDATE ins_deel
  	  	SET ins_deel_mjb_score2 = l_prio_score
  	  	WHERE ins_deel_key =  rec_prio.ins_deel_key;

	  		IF l_facilitor_prs_perslid_key IS NOT NULL
	  	  THEN
	  	  	IF l_prio_score IS NULL
          THEN
            fac.trackaction ('#INSUPD', rec_prio.ins_deel_key, l_facilitor_prs_perslid_key, NULL, 'Prioriteitscore is op leeg gezet');
          ELSE
	  	  		fac.trackaction ('#INSUPD', rec_prio.ins_deel_key, l_facilitor_prs_perslid_key, NULL, 'Prioriteitscore is op ' ||  l_prio_score || ' gezet');
          END IF;
	  	  END IF;

	  	END LOOP;

  	  -- Omdat 1 melding meerdere objecten kan bevatten, kunnen we nog geen update van melding status doen, eerst moeten alle objecten van zo'n melding worden verwerkt.
  	  -- Mogelijk ook anders kans op foutmelding Mutating triggers oid.
  		-- Dus update status in een nieuwe loop hieronder, nadat deze loop klaar is.
  END LOOP;

  -- LOOP 2B
  FOR rec_gebrek IN c_GRP_nieuwe_gebreken
  LOOP
  	  UPDATE mld_melding
  	  SET mld_melding_status = 5
  	  WHERE mld_melding_key = rec_gebrek.mld_melding_key;

  	  IF l_facilitor_prs_perslid_key IS NOT NULL
  	  THEN
  	  		fac.trackaction ('#MLDAFM', rec_gebrek.mld_melding_key, l_facilitor_prs_perslid_key, NULL, 'Gebrek verwerkt in de conditiescore van het object');
  	 	END IF;
  END LOOP;
	commit;
END;
/


CREATE OR REPLACE PROCEDURE plat_export_nen2767_aggr_score (
   p_applname   IN   VARCHAR2,
   p_applrun    IN   VARCHAR2,
   p_filedir    IN   VARCHAR2,
   p_filename   IN   VARCHAR2
)
AS
		-- mbmb TODO: aggregate functie op locatie (complex) en gebouw (cluster)

		-- Gebruik hiervoor als basis: zie pagina 14 uit Word document....

		CURSOR c_complex
		IS
			SELECT alg_locatie_key, SUM(totale_vervangingswaarde) totale_vervangingswaarde, SUM(correctie_vervangingswaarde) correctie_vervangingswaarde, ROUND(SUM(correctie_vervangingswaarde) / SUM(totale_vervangingswaarde),4) factor
			FROM plat_v_aggr_cond_score
			GROUP BY alg_locatie_key;

		CURSOR c_cluster
		IS
			SELECT alg_gebouw_key, SUM(totale_vervangingswaarde) totale_vervangingswaarde, SUM(correctie_vervangingswaarde) correctie_vervangingswaarde, ROUND(SUM(correctie_vervangingswaarde) / SUM(totale_vervangingswaarde),4) factor
			FROM plat_v_aggr_cond_score
			GROUP BY alg_gebouw_key;


		l_gevonden 									NUMBER(10);
		l_facilitor_prs_perslid_key NUMBER(10);
		l_cond_score_old            NUMBER(10);
		l_cond_score_new            NUMBER(10);


BEGIN

  SELECT COUNT(*)
  INTO l_gevonden
  FROM prs_perslid
  WHERE prs_perslid_oslogin = '_FACILITOR'
  AND prs_perslid_verwijder IS NULL;

  IF l_gevonden = 1
  THEN
	  SELECT prs_perslid_key
	  INTO l_facilitor_prs_perslid_key
	  FROM prs_perslid
	  WHERE prs_perslid_oslogin = '_FACILITOR'
	  AND prs_perslid_verwijder IS NULL;
  END IF;


  FOR complex IN c_complex
  LOOP

  	  SELECT alg_locatie_mjb_score1
  	  INTO l_cond_score_old
  	  FROM alg_locatie
  	  WHERE alg_locatie_key =  complex.alg_locatie_key;

  	  l_cond_score_new := plat_nen2767_cond_herleiding(complex.factor);

  	  IF l_cond_score_old IS NULL or l_cond_score_old <> l_cond_score_new
  	  THEN
	  	  UPDATE alg_locatie
	  	  SET alg_locatie_mjb_score1 = l_cond_score_new
	  	  WHERE alg_locatie_key =  complex.alg_locatie_key;

	  	  IF l_facilitor_prs_perslid_key IS NOT NULL
	  	  THEN
	  	  	fac.trackaction ('#ALGLUP', complex.alg_locatie_key, l_facilitor_prs_perslid_key, NULL, 'A.g.v. herberekening is de nieuwe conditiescore: ' || l_cond_score_new);
	  	  END IF;
  	  END IF;

  END LOOP;

  FOR gebouw IN c_cluster
  LOOP

  	  SELECT alg_gebouw_mjb_score1
  	  INTO l_cond_score_old
  	  FROM alg_gebouw
  	  WHERE alg_gebouw_key =  gebouw.alg_gebouw_key;

  	  l_cond_score_new := plat_nen2767_cond_herleiding(gebouw.factor);

  	  IF l_cond_score_old IS NULL or l_cond_score_old <> l_cond_score_new
  	  THEN
	  	  UPDATE alg_gebouw
	  	  SET alg_gebouw_mjb_score1 = l_cond_score_new
	  	  WHERE alg_gebouw_key =  gebouw.alg_gebouw_key;

	  	  IF l_facilitor_prs_perslid_key IS NOT NULL
	  	  THEN
	  	  	fac.trackaction ('#ALGGUP', gebouw.alg_gebouw_key, l_facilitor_prs_perslid_key, NULL, 'A.g.v. herberekening is de nieuwe conditiescore: ' || l_cond_score_new);
	  	  END IF;
  	  END IF;
  END LOOP;

commit;
END;
/


----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-- PLAT#53170: Koppelen van soort gebrek (mld_stdmelding) aan elementen obv importsheet
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


CREATE OR REPLACE PROCEDURE plat_import_srtdeel_mlddisc (p_import_key IN NUMBER)
AS
   c_fielddelimitor                VARCHAR2 (1)    := ';';
   v_newline                       VARCHAR2 (1000);             -- Input line
   v_aanduiding                    VARCHAR2 (200);
   v_errorhint                     VARCHAR2 (1000);
   v_errormsg                      VARCHAR2 (1000);
   oracle_err_num                  NUMBER;
   oracle_err_mes                  VARCHAR2 (200);
   header_is_valid                 NUMBER := 0;
   v_ongeldig                      NUMBER (1);
   v_count_tot                     NUMBER (10);
   v_count_import                  NUMBER (10);
   v_count                         NUMBER;

   -- De importvelden:
	 v_ins_srtdeel_code        				VARCHAR2(1000);
   v_ins_srtgroep_omschrijving      VARCHAR2(1000);
   v_ins_discipline_omschrijving    VARCHAR2(1000);
   v_mld_discipline_omschrijving    VARCHAR2(1000);

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

  v_errorhint := 'plat_import_srtdeel_mlddisc';

  v_count_tot := 0;
 v_count_import := 0;

   FOR rec1 IN c1
   LOOP
      BEGIN
         v_newline := rec1.fac_imp_file_line;
         v_aanduiding := '';
         v_errorhint := 'Fout bij opvragen te importeren rij';
         v_ongeldig := 0;
         -- Lees alle veldwaarden

         -- 01 - v_ins_srtdeel_code
         v_aanduiding := 'Probleem bij v_ins_srtdeel_code: ';
         fac.imp_getfield_nr (v_newline, c_fielddelimitor, 1, v_ins_srtdeel_code);
         v_ins_srtdeel_code := TRIM(v_ins_srtdeel_code);

   			 -- 03 - v_ins_discipline_omschrijving
   			 v_aanduiding := 'Probleem bij v_ins_discipline_omschrijving: ';
         fac.imp_getfield_nr (v_newline, c_fielddelimitor, 3, v_ins_discipline_omschrijving);
         v_ins_discipline_omschrijving := TRIM(v_ins_discipline_omschrijving);

   			 -- 04 - v_ins_srtgroep_omschrijving
   			 v_aanduiding := 'Probleem bij v_ins_srtgroep_omschrijving: ';
         fac.imp_getfield_nr (v_newline, c_fielddelimitor, 4, v_ins_srtgroep_omschrijving);
         v_ins_srtgroep_omschrijving := TRIM(v_ins_srtgroep_omschrijving);

         -- 07 - v_mld_discipline_omschrijving
   			 v_aanduiding := 'Probleem bij v_mld_discipline_omschrijving: ';
         fac.imp_getfield_nr (v_newline, c_fielddelimitor, 7, v_mld_discipline_omschrijving);
   			 v_mld_discipline_omschrijving := TRIM(v_mld_discipline_omschrijving);

         --
         v_aanduiding :=
               '['
            || v_ins_srtdeel_code
            || '-'
            || v_ins_discipline_omschrijving
            || '-'
            || v_ins_srtgroep_omschrijving
            || '-'
            || v_mld_discipline_omschrijving
            || '] ';

         -- Ik controleer of ik een geldige header heb, dat is: in de juiste kolommen
         -- de juiste kolomkop. Ik controleer daarbij de volgende kolommen:
         -- 1. Subrecept nummer
         -- 3. Hoofdrecept
         -- 4. Groep
         -- 7. Vakgroep
         -- Ik negeer alles totdat ik een geldige header ben gepasseerd.
     		IF (header_is_valid = 0)
				THEN
				  IF  UPPER (v_ins_srtdeel_code) = 'SUBRECEPT NUMMER' AND
				  		UPPER (v_ins_discipline_omschrijving) = 'HOOFDRECEPT' AND
				  		UPPER (v_ins_srtgroep_omschrijving) = 'GROEP' AND
				  		UPPER (v_mld_discipline_omschrijving) = 'VAKGROEP'
				  THEN
				     header_is_valid := 1;
				  END IF;
				ELSE
				      v_count_tot := v_count_tot + 1;

				  		v_errorhint := 'Ongeldig Subreceptnummer';
            	IF (v_ins_srtdeel_code IS NOT NULL)
	            THEN
	                IF LENGTH (v_ins_srtdeel_code) > 10
	                THEN
	                    v_ins_srtdeel_code := SUBSTR (v_ins_srtdeel_code, 1, 10);
	                    fac.imp_writelog (p_import_key, 'W', v_aanduiding || 'Subreceptnummer te lang', 'Afgebroken tot [' || v_ins_srtdeel_code || ']' );
	                END IF;
	            ELSE
	            		fac.imp_writelog (p_import_key, 'W', v_aanduiding,  v_errorhint || ' - Regel wordt overgeslagen');
	                v_ongeldig := 1;
	            END IF;
				      --
				      v_errorhint := 'Ongeldig hoofdrecept';
            	IF (v_ins_discipline_omschrijving IS NOT NULL)
	            THEN
	                IF LENGTH (v_ins_discipline_omschrijving) > 60
	                THEN
	                    v_ins_discipline_omschrijving := SUBSTR (v_ins_discipline_omschrijving, 1, 60);
	                    fac.imp_writelog (p_import_key, 'W', v_aanduiding || 'Hoofdrecept te lang', 'Afgebroken tot [' || v_ins_discipline_omschrijving || ']' );
	                END IF;
	            ELSE
	            		fac.imp_writelog (p_import_key, 'W', v_aanduiding,  v_errorhint || ' - Regel wordt overgeslagen');
	                v_ongeldig := 1;
	            END IF;
				      --
				      v_errorhint := 'Ongeldige groep';
            	IF (v_ins_srtgroep_omschrijving IS NOT NULL)
	            THEN
	                IF LENGTH (v_ins_srtgroep_omschrijving) > 60
	                THEN
	                    v_ins_srtgroep_omschrijving := SUBSTR (v_ins_srtgroep_omschrijving, 1, 60);
	                    fac.imp_writelog (p_import_key, 'W', v_aanduiding || 'Groep te lang', 'Afgebroken tot [' || v_ins_srtgroep_omschrijving || ']' );
	                END IF;
	            ELSE
	            		fac.imp_writelog (p_import_key, 'W', v_aanduiding,  v_errorhint || ' - Regel wordt overgeslagen');
	                v_ongeldig := 1;
	            END IF;
	            --
				      v_errorhint := 'Ongeldige vakgroep';
            	IF (v_mld_discipline_omschrijving IS NOT NULL)
	            THEN
	                IF LENGTH (v_mld_discipline_omschrijving) > 60
	                THEN
	                    v_mld_discipline_omschrijving := SUBSTR (v_mld_discipline_omschrijving, 1, 60);
	                    fac.imp_writelog (p_import_key, 'W', v_aanduiding || 'Vakgroep te lang', 'Afgebroken tot [' || v_mld_discipline_omschrijving || ']' );
	                END IF;
	            ELSE
	            		fac.imp_writelog (p_import_key, 'W', v_aanduiding,  v_errorhint || ' - Regel wordt overgeslagen');
	                v_ongeldig := 1;
	            END IF;

	            IF (v_ongeldig = 0)
	            THEN
  	             BEGIN
                  v_errorhint :=
                      'Fout bij toevoegen regel aan importtabel plat_imp_srtdeel_mlddiscipline';

						 			INSERT INTO plat_imp_srtdeel_mlddiscipline
									(
									   fac_import_key,
									   ins_srtdeel_code,
									   ins_discipline_omschrijving,
									   ins_srtgroep_omschrijving,
									   mld_discipline_omschrijving
									)
									VALUES (p_import_key, v_ins_srtdeel_code, v_ins_discipline_omschrijving, v_ins_srtgroep_omschrijving, v_mld_discipline_omschrijving);

                  v_count_import := v_count_import + 1;
                  COMMIT;

               EXCEPTION
                  WHEN OTHERS
                  THEN
                     oracle_err_num := SQLCODE;
                     oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
                     v_errormsg :=
                           v_errorhint
                        || ' ORACLE (error '
                        || oracle_err_num
                        || '/'
                        || oracle_err_mes
                        || ')';
                     fac.imp_writelog
                             (p_import_key,
                              'E',
                              v_aanduiding || v_errormsg,
                              'Ingelezen regel kan niet worden weggeschreven!'
                             );
                     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! Header kolommen: 1. Subrecept nummer, 3. Hoofdrecept, 4. Groep en 7. Vakgroep'
                       );
   ELSE
      fac.imp_writelog (p_import_key,
                        'S',
                           'IMPORT SRTDEEL_MLDDISC: aantal ingelezen regels: '
                        || TO_CHAR (v_count_tot)
                        || ' / aantal geldige regels: '
                        || TO_CHAR (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, v_errorhint);
END plat_import_srtdeel_mlddisc;
/



CREATE OR REPLACE PROCEDURE plat_update_srtdeel_mlddisc (
   p_import_key IN NUMBER
)
IS

	-- Alle ingelezen AX opdrachten
	CURSOR c1
	IS
	    SELECT *
	    FROM plat_imp_srtdeel_mlddiscipline
	    WHERE fac_import_key = p_import_key;



	v_aanduiding                    VARCHAR2 (200);
	v_errorhint                     VARCHAR2 (1000);
	v_errormsg                      VARCHAR2 (1000);
	oracle_err_num                  NUMBER;
	oracle_err_mes                  VARCHAR2 (200);
	v_count_tot                     NUMBER (10);
  v_count_import                  NUMBER (10);

	v_ins_srtdeel_key								NUMBER(10);
	v_mld_discipline_key						NUMBER(10);

BEGIN

  v_count_tot := 0;
  v_count_import := 0;



	FOR rec IN c1
  LOOP
  	BEGIN


	 					 v_aanduiding :=
               '['
            || rec.ins_srtdeel_code
            || '-'
            || rec.ins_srtgroep_omschrijving
            || '-'
            || rec.ins_srtgroep_omschrijving
            || '-'
            || rec.ins_srtgroep_omschrijving
            || '] ';

            v_errorhint := 'MAX(sd.ins_srtdeel_key) levert NULL op';

	 					SELECT MAX(sd.ins_srtdeel_key)
	 					INTO v_ins_srtdeel_key
	 					FROM ins_srtdeel sd, ins_srtgroep g, ins_discipline d
	 					WHERE sd.ins_srtgroep_key = g.ins_srtgroep_key
	 					AND g.ins_discipline_key = d.ins_discipline_key
	 					AND sd.ins_srtdeel_code_upper = UPPER(rec.ins_srtdeel_code)
	 					AND g.ins_srtgroep_upper = UPPER(ins_srtgroep_omschrijving)
	 					AND d.ins_discipline_omschrijving = rec.ins_discipline_omschrijving
	 					AND d.ins_discipline_verwijder IS NULL
	 					AND g.ins_srtgroep_verwijder IS NULL
	 					AND sd.ins_srtdeel_verwijder IS NULL;

	 					v_errorhint := 'MAX(d.ins_discipline_key) levert NULL op';
	 					SELECT MAX(d.ins_discipline_key)
	 					INTO v_mld_discipline_key
	 					FROM mld_discipline d
	 					WHERE d.ins_discipline_omschrijving = rec.mld_discipline_omschrijving
	 					AND d.ins_discipline_verwijder IS NULL;

	 					IF v_ins_srtdeel_key IS NULL
	 					THEN
	 						fac.imp_writelog (p_import_key,
                        'E',
                        v_aanduiding || ' - Subreceptnummer niet gevonden',
                        v_errorhint);
	 					END IF;
	 					IF v_mld_discipline_key IS NULL
	 					THEN
	 						fac.imp_writelog (p_import_key,
                        'E',
                        v_aanduiding || ' - Vakgroep niet gevonden',
                        v_errorhint);
	 					END IF;

	 					IF v_ins_srtdeel_key IS NOT NULL AND v_mld_discipline_key IS NOT NULL
	 					THEN
	 						v_errorhint := 'INSERT INTO mld_stdmelding_srtinst faalt...';

	 						INSERT INTO mld_stdmelding_srtinst (mld_stdmelding_key, ins_srtinstallatie_key, ins_srtinstallatie_niveau)
	 						SELECT sm.mld_stdmelding_key, v_ins_srtdeel_key, 'S'
	 						FROM mld_stdmelding sm
	 						WHERE sm.mld_ins_discipline_key = v_mld_discipline_key
	 						AND sm.mld_stdmelding_verwijder IS NULL
	 						AND NOT EXISTS (SELECT 'x' FROM mld_stdmelding_srtinst smsi
	 														WHERE smsi.mld_stdmelding_key = sm.mld_stdmelding_key
	 														AND smsi.ins_srtinstallatie_key = v_ins_srtdeel_key
	 														AND smsi.ins_srtinstallatie_niveau = 'S');
	 					END IF;

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





----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-- PLAT#52406: MJOB: Import van operationele resultaten (door MJOB-er zelf te doen?)
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


CREATE OR REPLACE PROCEDURE plat_import_mjob_results (p_import_key IN NUMBER)
AS
   c_fielddelimitor                VARCHAR2 (1)    := ';';
   v_newline                       VARCHAR2 (1000);             -- Input line
   v_aanduiding                    VARCHAR2 (200);
   v_errorhint                     VARCHAR2 (1000);
   v_errormsg                      VARCHAR2 (1000);
   oracle_err_num                  NUMBER;
   oracle_err_mes                  VARCHAR2 (200);
   header_is_valid                 NUMBER := 0;
   v_ongeldig                      NUMBER (1);
   v_count_tot                     NUMBER (10);
   v_count_import                  NUMBER (10);
   v_count                         NUMBER;

   -- De importvelden:
	 v_ins_deelsrtcontrole_key       	VARCHAR2(1000);
   v_uitgevoerd									    VARCHAR2(1000);
   v_opmerking											VARCHAR2(4000);

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

  v_errorhint := 'plat_import_mjob_results';

  v_count_tot := 0;
 	v_count_import := 0;


   FOR rec1 IN c1
   LOOP
      BEGIN
         v_newline := rec1.fac_imp_file_line;
         v_aanduiding := '';
         v_errorhint := 'Fout bij opvragen te importeren rij';
         v_ongeldig := 0;
         -- Lees alle veldwaarden

         -- 01 - v_ins_deelsrtcontrole_key
         v_aanduiding := 'Probleem bij v_ins_deelsrtcontrole_key: ';
         fac.imp_getfield_nr (v_newline, c_fielddelimitor, 1, v_ins_deelsrtcontrole_key);
         v_ins_deelsrtcontrole_key := TRIM(v_ins_deelsrtcontrole_key);

         -- 02 - v_uitgevoerd
         v_aanduiding := 'Probleem bij v_uitgevoerd: ';
         fac.imp_getfield_nr (v_newline, c_fielddelimitor, 2, v_uitgevoerd);
         v_uitgevoerd := TRIM(v_uitgevoerd);

				 -- 03 - v_opmerking
         v_aanduiding := 'Probleem bij v_opmerking: ';
         fac.imp_getfield_nr (v_newline, c_fielddelimitor, 3, v_opmerking);
         v_opmerking := TRIM(v_opmerking);


					v_aanduiding :=
               '['
            || v_ins_deelsrtcontrole_key
            || '-'
            || v_uitgevoerd
            || '-'
            || v_opmerking
            || '] ';

         -- Ik controleer of ik een geldige header heb, dat is: in de juiste kolommen
         -- de juiste kolomkop. Ik controleer daarbij de volgende kolommen:
         -- 1. Id
         -- 2. Uitgevoerd
         -- 3. Opmerking
         -- Ik negeer alles totdat ik een geldige header ben gepasseerd.
     		IF (header_is_valid = 0)
				THEN
				  IF  UPPER (v_ins_deelsrtcontrole_key) = 'ID' AND
				  		UPPER (v_uitgevoerd) = 'UITGEVOERD' AND
				  		UPPER (v_opmerking) = 'OPMERKING'
				  THEN
				     header_is_valid := 1;
				  END IF;
				ELSE
					v_count_tot := v_count_tot + 1;

					v_errorhint := 'Ongeldige ID (moet getal van maximaal 10 cijfers zijn)';
					-- ID moet vul gevuld zijn, en ook een number (getal) zijn, van maximaal 10 cijfers
					IF (v_ins_deelsrtcontrole_key IS NULL) OR (fac.safe_to_number(v_ins_deelsrtcontrole_key) IS NULL) OR (LENGTH (v_ins_deelsrtcontrole_key) > 10)
					THEN
							fac.imp_writelog (p_import_key, 'W', v_aanduiding,  v_errorhint || ' - Regel wordt overgeslagen');
					    v_ongeldig := 1;
					END IF;
					--
					v_errorhint := 'Ongeldige kolom Uitgevoerd (moet J (=Ja) of N (=Nee) zijn)';
					-- Uitgevoerd moet J of N zijn (Leeg betekent onbekend, regel wordt dan overgeslagen)
					IF (v_uitgevoerd IS NULL) OR (UPPER(v_uitgevoerd) <> 'J') AND (UPPER(v_uitgevoerd) <> 'N')
					THEN
							fac.imp_writelog (p_import_key, 'W', v_aanduiding,  v_errorhint || ' - Regel wordt overgeslagen');
					    v_ongeldig := 1;
					END IF;
					--
					v_errorhint := 'Ongeldige kolom Opmerking (maximaal 1000 tekens';
					IF (v_opmerking IS NOT NULL) AND (LENGTH (v_opmerking) > 1000)
					THEN
							fac.imp_writelog (p_import_key, 'W', v_aanduiding,  v_errorhint || ' - Opmerking wordt afgekort op 1000 tekens');
					    v_opmerking := SUBSTR(v_opmerking,1,1000);
					END IF;
					--

					IF (v_ongeldig = 0)
	            THEN
  	             BEGIN
                  v_errorhint :=
                      'Fout bij toevoegen regel aan importtabel plat_imp_mjob_results';
									INSERT INTO plat_imp_mjob_results
									(
									   fac_import_key,
									   ins_deelsrtcontrole_key,
									   uitgevoerd,
									   opmerking
									)
									SELECT p_import_key, v_ins_deelsrtcontrole_key, DECODE(UPPER(v_uitgevoerd),'J',1,'N',0,0), v_opmerking FROM DUAL;

                  v_count_import := v_count_import + 1;
                  COMMIT;

               EXCEPTION
                  WHEN OTHERS
                  THEN
                     oracle_err_num := SQLCODE;
                     oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
                     v_errormsg :=
                           v_errorhint
                        || ' ORACLE (error '
                        || oracle_err_num
                        || '/'
                        || oracle_err_mes
                        || ')';
                     fac.imp_writelog
                             (p_import_key,
                              'E',
                              v_aanduiding || v_errormsg,
                              'Ingelezen regel kan niet worden weggeschreven!'
                             );
                     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! Header kolommen: 1. Id, 2. Uitgevoerd, 3. Opmerking'
                       );
   ELSE
      fac.imp_writelog (p_import_key,
                        'S',
                           'IMPORT MJOB_RESULTS: aantal ingelezen regels: '
                        || TO_CHAR (v_count_tot)
                        || ' / aantal geldige regels: '
                        || TO_CHAR (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, v_errorhint);
END plat_import_mjob_results;
/



CREATE OR REPLACE PROCEDURE plat_update_mjob_results (
   p_import_key IN NUMBER
)
IS

	CURSOR c1
	IS
	    SELECT *
	    FROM plat_imp_mjob_results
	    WHERE fac_import_key = p_import_key;



	v_aanduiding                    VARCHAR2 (200);
	v_errorhint                     VARCHAR2 (1000);
	v_errormsg                      VARCHAR2 (1000);
	oracle_err_num                  NUMBER;
	oracle_err_mes                  VARCHAR2 (200);
	v_count_tot                     NUMBER (10);
  v_count_import                  NUMBER (10);

	v_prs_perslid_key									NUMBER(10);

	v_ins_deelsrtcontrole_key       	NUMBER(10);
  v_uitgevoerd									    NUMBER(10);
  v_opmerking												VARCHAR2(1000);

  l_ins_controlemode_key						NUMBER(10);

BEGIN

  v_count_tot := 0;
  v_count_import := 0;

  v_errorhint := 'Importeur niet gevonden / fout bij de import';
  SELECT prs_perslid_key
	INTO v_prs_perslid_key
	FROM fac_import
	WHERE fac_import_key = p_import_key;


	FOR rec IN c1
  LOOP
  	BEGIN
  			v_count_tot := v_count_tot + 1;
				v_aanduiding :=
				 '['
				|| rec.ins_deelsrtcontrole_key
				|| '-'
				|| rec.uitgevoerd
				|| '] ';

				v_errorhint := 'ID ins_deelsrtcontrole_key niet gevonden in ins_deelsrtcontrole (is ongeldig), regel wordt overgeslagen';

				SELECT ins_deelsrtcontrole_key
				INTO v_ins_deelsrtcontrole_key
				FROM ins_deelsrtcontrole
				WHERE ins_deelsrtcontrole_key = rec.ins_deelsrtcontrole_key
				AND ins_scenario_key = 1;
				v_errorhint := 'ID ins_deelsrtcontrole_key is niet geaccordeerd cq. opgenomen in de begroting, regel wordt overgeslagen';
				SELECT ins_deelsrtcontrole_key
				INTO v_ins_deelsrtcontrole_key
				FROM ins_deelsrtcontrole
				WHERE ins_deelsrtcontrole_key = rec.ins_deelsrtcontrole_key
				AND ins_scenario_key = 1
				AND ins_deelsrtcontrole_status = 2;

				IF rec.uitgevoerd = 1
				THEN
						-- ins_controlemode_key = 1 (Gereed): plat_ini.sql
						l_ins_controlemode_key := 1;
				ELSE
						-- ins_controlemode_key = 2 (Niet uitgevoerd): zie plat_ini.sql
						l_ins_controlemode_key := 2;
				END IF;

				v_errorhint := 'Update ins_deelsrtcontrole niet gelukt, regel wordt overgeslagen';
				ins.setinspectstatus (rec.ins_deelsrtcontrole_key, 6, v_prs_perslid_key);
				UPDATE ins_deelsrtcontrole
				SET ins_deelsrtcontrole_datum = trunc(sysdate,'yyyy'),
						ins_controlemode_key = l_ins_controlemode_key,
						ins_deelsrtcontrole_opmerking = rec.opmerking
				WHERE ins_deelsrtcontrole_key = rec.ins_deelsrtcontrole_key;
				-- Netjes uitgevoerd volgens begroting, volgende cyclus wordt vanzelf berekend obv ins_deelsrtcontrole_datum...

				v_count_import := v_count_import + 1;
				COMMIT;

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

  fac.imp_writelog (p_import_key,
                    'S',
                       'UPDATE MJOB_RESULTS: aantal ingelezen regels: '
                    || TO_CHAR (v_count_tot)
                    || ' / aantal geldige regels: '
                    || TO_CHAR (v_count_import)
                    ,
                    ''
                   );


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






----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--PLAT#53608: NEN2767 inspectie/gebreken import
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


CREATE OR REPLACE PROCEDURE plat_import_nen2767_results (p_import_key IN NUMBER)
AS
   c_fielddelimitor                VARCHAR2 (1)    := ';';
   v_newline                       VARCHAR2 (1000);             -- Input line
   v_aanduiding                    VARCHAR2 (200);
   v_errorhint                     VARCHAR2 (1000);
   v_errormsg                      VARCHAR2 (1000);
   oracle_err_num                  NUMBER;
   oracle_err_mes                  VARCHAR2 (200);
   header_is_valid                 NUMBER := 0;
   v_ongeldig                      NUMBER (1);
   v_count_tot                     NUMBER (10);
   v_count_import                  NUMBER (10);
   v_count                         NUMBER;


		v_alg_gebouw_code								VARCHAR2(1000);
		v_ins_deel_omschrijving					VARCHAR2(1000);
		v_mld_melding_datum							VARCHAR2(1000);
		v_mld_melding_omschrijving			VARCHAR2(1000);
		v_prs_perslid_email							VARCHAR2(1000);
		v_gebrekode											VARCHAR2(1000);
		v_ernst													VARCHAR2(1000);
		v_omvang												VARCHAR2(1000);
		v_intensiteit										VARCHAR2(1000);
		v_vg														VARCHAR2(1000);
		v_ch														VARCHAR2(1000);
		v_gb														VARCHAR2(1000);
		v_tv														VARCHAR2(1000);
		v_tk														VARCHAR2(1000);
		v_be														VARCHAR2(1000);
		v_foto													VARCHAR2(1000);
		v_condscore									VARCHAR2(1000);
		v_prioscore											VARCHAR2(1000);

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

  v_errorhint := 'plat_import_nen2767_results';

  v_count_tot := 0;
 	v_count_import := 0;


   FOR rec1 IN c1
   LOOP
      BEGIN
         v_newline := rec1.fac_imp_file_line;
         v_aanduiding := '';
         v_errorhint := 'Fout bij opvragen te importeren rij';
         v_ongeldig := 0;
         -- Lees alle veldwaarden

         -- 01
         v_aanduiding := 'Probleem bij v_alg_gebouw_code: ';
         fac.imp_getfield_nr (v_newline, c_fielddelimitor, 1, v_alg_gebouw_code);
         v_alg_gebouw_code := TRIM(v_alg_gebouw_code);

         -- 02
         v_aanduiding := 'Probleem bij v_ins_deel_omschrijving: ';
         fac.imp_getfield_nr (v_newline, c_fielddelimitor, 2, v_ins_deel_omschrijving);
         v_ins_deel_omschrijving := TRIM(v_ins_deel_omschrijving);

				 -- 04
         v_aanduiding := 'Probleem bij v_mld_melding_datum: ';
         fac.imp_getfield_nr (v_newline, c_fielddelimitor, 4, v_mld_melding_datum);
         v_mld_melding_datum := TRIM(v_mld_melding_datum);


				 -- 06
         v_aanduiding := 'Probleem bij v_gebrekode: ';
         fac.imp_getfield_nr (v_newline, c_fielddelimitor, 6, v_gebrekode);
         v_gebrekode := TRIM(v_gebrekode);

         -- 08
         v_aanduiding := 'Probleem bij v_ernst: ';
         fac.imp_getfield_nr (v_newline, c_fielddelimitor, 8, v_ernst);
         v_ernst := TRIM(v_ernst);

         -- 09
         v_aanduiding := 'Probleem bij v_omvang: ';
         fac.imp_getfield_nr (v_newline, c_fielddelimitor, 9, v_omvang);
         v_omvang := TRIM(v_omvang);

         -- 10
         v_aanduiding := 'Probleem bij v_intensiteit: ';
         fac.imp_getfield_nr (v_newline, c_fielddelimitor, 10, v_intensiteit);
         v_intensiteit := TRIM(v_intensiteit);

         -- 11
         v_aanduiding := 'Probleem bij v_vg: ';
         fac.imp_getfield_nr (v_newline, c_fielddelimitor, 11, v_vg);
         v_vg := TRIM(v_vg);

         -- 12
         v_aanduiding := 'Probleem bij v_ch: ';
         fac.imp_getfield_nr (v_newline, c_fielddelimitor, 12, v_ch);
         v_ch := TRIM(v_ch);

         -- 13
         v_aanduiding := 'Probleem bij v_gb: ';
         fac.imp_getfield_nr (v_newline, c_fielddelimitor, 13, v_gb);
         v_gb := TRIM(v_gb);

         -- 14
         v_aanduiding := 'Probleem bij v_tv: ';
         fac.imp_getfield_nr (v_newline, c_fielddelimitor, 14, v_tv);
         v_tv := TRIM(v_tv);

				 -- 15
         v_aanduiding := 'Probleem bij v_tk: ';
         fac.imp_getfield_nr (v_newline, c_fielddelimitor, 15, v_tk);
         v_tk := TRIM(v_tk);

         -- 16
         v_aanduiding := 'Probleem bij v_be: ';
         fac.imp_getfield_nr (v_newline, c_fielddelimitor, 16, v_be);
         v_be := TRIM(v_be);

         -- 17
         v_aanduiding := 'Probleem bij v_mld_melding_omschrijving: ';
         fac.imp_getfield_nr (v_newline, c_fielddelimitor, 17, v_mld_melding_omschrijving);
         v_mld_melding_omschrijving := TRIM(v_mld_melding_omschrijving);

				 -- 18
         v_aanduiding := 'Probleem bij v_condscore: ';
         fac.imp_getfield_nr (v_newline, c_fielddelimitor, 18, v_condscore);
         v_condscore := TRIM(v_condscore);

         -- 19
         v_aanduiding := 'Probleem bij v_prioscore: ';
         fac.imp_getfield_nr (v_newline, c_fielddelimitor, 19, v_prioscore);
         v_prioscore := TRIM(v_prioscore);

				 -- 20
         v_aanduiding := 'Probleem bij v_prs_perslid_email: ';
         fac.imp_getfield_nr (v_newline, c_fielddelimitor, 20, v_prs_perslid_email);
         v_prs_perslid_email := TRIM(v_prs_perslid_email);

         -- 21
         v_aanduiding := 'Probleem bij v_foto: ';
         fac.imp_getfield_nr (v_newline, c_fielddelimitor, 21, v_foto);
         v_foto := TRIM(v_foto);



					v_aanduiding :=
               '['
            || v_alg_gebouw_code
            || '-'
            || v_ins_deel_omschrijving
            || '-'
            || v_gebrekode
            || '] ';

         -- Ik controleer of ik een geldige header heb, dat is: in de juiste kolommen
         -- de juiste kolomkop. Ik controleer daarbij de volgende kolommen:

					-- 1. Cluster Plato
					-- 2. Elementcode
					-- 4. Datum
					-- 6. Gebrekcode
					-- 8. Ernst
					-- 9. Omvang
					-- 10. Intensiteit
					-- 11. AspectwaardeVG
					-- 12. AspectwaardeCH
					-- 13. AspectwaardeGB
					-- 14. AspectwaardeTV
					-- 15. AspectwaardeTK
					-- 16. AspectwaardeBE
					-- 17. Opmerking
					-- 20. Inspecteur
					-- 21. Foto


         -- Ik negeer alles totdat ik een geldige header ben gepasseerd.
     		IF (header_is_valid = 0)
				THEN
				  IF  UPPER (v_alg_gebouw_code) = 'CLUSTER PLATO' AND
				  		UPPER (v_ins_deel_omschrijving) = 'ELEMENTCODE' AND
				  		UPPER (v_gebrekode) = 'GEBREKCODE' AND
				  		UPPER (v_ernst) = 'ERNST' AND
				  		UPPER (v_omvang) = 'OMVANG' AND
				  		UPPER (v_intensiteit) = 'INTENSITEIT' AND
				  		UPPER (v_mld_melding_omschrijving) = 'OPMERKING' AND
				  		UPPER (v_prs_perslid_email) = 'INSPECTEUR' AND
				  		UPPER (v_foto) = 'FOTO?'
				  THEN
				     header_is_valid := 1;
				  END IF;
				ELSE
					v_count_tot := v_count_tot + 1;

					v_errorhint := 'Ongeldig kolom CLUSTER (moet gevuld en maximaal 12 tekens zijn)';
					IF (v_alg_gebouw_code IS NULL) OR (LENGTH (v_alg_gebouw_code) > 12)
					THEN
							fac.imp_writelog (p_import_key, 'W', v_aanduiding,  v_errorhint || ' - Regel wordt overgeslagen');
					    v_ongeldig := 1;
					END IF;
					--
					v_errorhint := 'Ongeldige kolom ELEMENTCODE (moet gevuld en maximaal 60 tekens zijn)';
					IF (v_ins_deel_omschrijving IS NULL) OR (LENGTH (v_ins_deel_omschrijving) > 60)
					THEN
							fac.imp_writelog (p_import_key, 'W', v_aanduiding,  v_errorhint || ' - Regel wordt overgeslagen');
					    v_ongeldig := 1;
					END IF;
					--
					v_errorhint := 'Ongeldige kolom DATUM (moet leeg of geldige datum in formaat dd-mm-jjjj zijn)';
					IF (v_mld_melding_datum IS NOT NULL) AND (fac.safe_to_date(v_mld_melding_datum, 'dd-mm-yyyy') IS NULL)
					THEN
							fac.imp_writelog (p_import_key, 'W', v_aanduiding,  v_errorhint || ' - Regel wordt overgeslagen');
					    v_ongeldig := 1;
					END IF;
					--
					v_errorhint := 'Ongeldig kolom GEBREKCODE (moet gevuld en maximaal 20 tekens zijn)';
					IF (v_gebrekode IS NULL) OR (LENGTH (v_gebrekode) > 20)
					THEN
							fac.imp_writelog (p_import_key, 'W', v_aanduiding,  v_errorhint || ' - Regel wordt overgeslagen');
					    v_ongeldig := 1;
					END IF;
					--
					v_errorhint := 'Ongeldig kolom ERNST (moet gevuld en maximaal 50 tekens zijn)';
					IF (v_ernst IS NULL) OR (LENGTH (v_ernst) > 50)
					THEN
							fac.imp_writelog (p_import_key, 'W', v_aanduiding,  v_errorhint || ' - Regel wordt overgeslagen');
					    v_ongeldig := 1;
					END IF;
					--
					v_errorhint := 'Ongeldig kolom OMVANG (moet gevuld en maximaal 50 tekens zijn)';
					IF (v_omvang IS NULL) OR (LENGTH (v_omvang) > 50)
					THEN
							fac.imp_writelog (p_import_key, 'W', v_aanduiding,  v_errorhint || ' - Regel wordt overgeslagen');
					    v_ongeldig := 1;
					END IF;
					--
					v_errorhint := 'Ongeldig kolom INTENSITEIT (moet gevuld en maximaal 50 tekens zijn)';
					IF (v_intensiteit IS NULL) OR (LENGTH (v_intensiteit) > 50)
					THEN
							fac.imp_writelog (p_import_key, 'W', v_aanduiding,  v_errorhint || ' - Regel wordt overgeslagen');
					    v_ongeldig := 1;
					END IF;
					--
					v_errorhint := 'Ongeldig kolom VG (moet gevuld en maximaal 20 tekens zijn)';
					IF (v_vg IS NULL) OR (LENGTH (v_vg) > 20)
					THEN
							fac.imp_writelog (p_import_key, 'W', v_aanduiding,  v_errorhint || ' - Regel wordt overgeslagen');
					    v_ongeldig := 1;
					END IF;
					--
					v_errorhint := 'Ongeldig kolom CH (moet gevuld en maximaal 20 tekens zijn)';
					IF (v_ch IS NULL) OR (LENGTH (v_ch) > 20)
					THEN
							fac.imp_writelog (p_import_key, 'W', v_aanduiding,  v_errorhint || ' - Regel wordt overgeslagen');
					    v_ongeldig := 1;
					END IF;
					--
					v_errorhint := 'Ongeldig kolom GB (moet gevuld en maximaal 20 tekens zijn)';
					IF (v_gb IS NULL) OR (LENGTH (v_gb) > 20)
					THEN
							fac.imp_writelog (p_import_key, 'W', v_aanduiding,  v_errorhint || ' - Regel wordt overgeslagen');
					    v_ongeldig := 1;
					END IF;
					--
					v_errorhint := 'Ongeldig kolom TV (moet gevuld en maximaal 20 tekens zijn)';
					IF (v_tv IS NULL) OR (LENGTH (v_tv) > 20)
					THEN
							fac.imp_writelog (p_import_key, 'W', v_aanduiding,  v_errorhint || ' - Regel wordt overgeslagen');
					    v_ongeldig := 1;
					END IF;
					--
					v_errorhint := 'Ongeldig kolom VG (moet gevuld en maximaal 20 tekens zijn)';
					IF (v_tk IS NULL) OR (LENGTH (v_tk) > 20)
					THEN
							fac.imp_writelog (p_import_key, 'W', v_aanduiding,  v_errorhint || ' - Regel wordt overgeslagen');
					    v_ongeldig := 1;
					END IF;
					--
					v_errorhint := 'Ongeldig kolom BE (moet gevuld en maximaal 20 tekens zijn)';
					IF (v_be IS NULL) OR (LENGTH (v_be) > 20)
					THEN
							fac.imp_writelog (p_import_key, 'W', v_aanduiding,  v_errorhint || ' - Regel wordt overgeslagen');
					    v_ongeldig := 1;
					END IF;
					--
					v_errorhint := 'Ongeldig kolom OPMERKING (mag maximaal 2000 tekens zijn)';
					IF (LENGTH (v_mld_melding_omschrijving) > 2000)
					THEN
							fac.imp_writelog (p_import_key, 'W', v_aanduiding,  v_errorhint || ' - Opmerking wordt afgekapt op 2000 tekens');
							v_mld_melding_omschrijving := SUBSTR(v_mld_melding_omschrijving,1,2000);
					END IF;
					--
					v_errorhint := 'Ongeldig kolom INSPECTEUR (moet ingevuld en mag maximaal 200 tekens zijn)';
					IF (v_prs_perslid_email IS NULL) OR (LENGTH (v_prs_perslid_email) > 200)
					THEN
							fac.imp_writelog (p_import_key, 'W', v_aanduiding,  v_errorhint || ' - Regel wordt overgeslagen');
					    v_ongeldig := 1;
					END IF;
					--
					v_errorhint := 'Ongeldig kolom FOTO (mag maximaal 50 tekens zijn)';
					IF (LENGTH (v_foto) > 50)
					THEN
							fac.imp_writelog (p_import_key, 'W', v_aanduiding,  v_errorhint || ' - Regel wordt overgeslagen');
					    v_ongeldig := 1;
					END IF;
					--
					v_errorhint := 'Ongeldig kolom CONDITIESCORE (indien gevuld dan een cijfer van 1 t/m 6)';
					IF (v_condscore IS NOT NULL) AND ((fac.safe_to_number(v_condscore) < 0) OR (fac.safe_to_number(v_condscore) > 6))
					THEN
							fac.imp_writelog (p_import_key, 'W', v_aanduiding,  v_errorhint || ' - Regel wordt overgeslagen');
					    v_ongeldig := 1;
					END IF;
					--
					v_errorhint := 'Ongeldig kolom PRIORITEITSSCORE (indien gevuld dan een cijfer van 1 t/m 9)';
					IF (v_prioscore IS NOT NULL) AND ((fac.safe_to_number(v_prioscore) < 0) OR (fac.safe_to_number(v_prioscore) > 9))
					THEN
							fac.imp_writelog (p_import_key, 'W', v_aanduiding,  v_errorhint || ' - Regel wordt overgeslagen');
					    v_ongeldig := 1;
					END IF;


					IF (v_ongeldig = 0)
	            THEN
  	             BEGIN
                  v_errorhint :=
                      'Fout bij toevoegen regel aan importtabel plat_imp_nen2767_results';

									INSERT INTO plat_imp_nen2767_results
									(
									fac_import_key,
									alg_gebouw_code,
									ins_deel_omschrijving,
									mld_melding_datum,
									mld_melding_omschrijving,
									prs_perslid_email,
									gebrekode,
									ernst,
									omvang,
									intensiteit,
									vg,
									ch,
									gb,
									tv,
									tk,
									be,
									foto,
									condscore,
									prioscore
									)
									SELECT p_import_key,
									v_alg_gebouw_code,
									v_ins_deel_omschrijving,
									v_mld_melding_datum,
									v_mld_melding_omschrijving,
									v_prs_perslid_email,
									v_gebrekode,
									v_ernst,
									v_omvang,
									v_intensiteit,
									v_vg,
									v_ch,
									v_gb,
									v_tv,
									v_tk,
									v_be,
									v_foto,
									v_condscore,
									v_prioscore FROM DUAL;

                  v_count_import := v_count_import + 1;
                  COMMIT;

               EXCEPTION
                  WHEN OTHERS
                  THEN
                     oracle_err_num := SQLCODE;
                     oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
                     v_errormsg :=
                           v_errorhint
                        || ' ORACLE (error '
                        || oracle_err_num
                        || '/'
                        || oracle_err_mes
                        || ')';
                     fac.imp_writelog
                             (p_import_key,
                              'E',
                              v_aanduiding || v_errormsg,
                              'Ingelezen regel kan niet worden weggeschreven!'
                             );
                     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: A. CLUSTER PLATO, B. ELEMENTCODE, F. GEBREKCODE, H.ERNST, I. OMVANG, J. INTENSITEIT, Q. OPMERKING, T. INSPECTEUR, U. FOTO?'
                       );
   ELSE
      fac.imp_writelog (p_import_key,
                        'S',
                           'IMPORT NEN2767 RESULTS: aantal ingelezen regels: '
                        || TO_CHAR (v_count_tot)
                        || ' / aantal geldige regels: '
                        || TO_CHAR (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, v_errorhint);
END plat_import_nen2767_results;
/


CREATE OR REPLACE PROCEDURE plat_update_nen2767_results (
   p_import_key IN NUMBER
)
IS

	CURSOR c1
	IS
	    SELECT *
	    FROM plat_imp_nen2767_results
	    WHERE fac_import_key = p_import_key;



	v_aanduiding                    VARCHAR2 (200);
	v_errorhint                     VARCHAR2 (1000);
	v_errormsg                      VARCHAR2 (1000);
	oracle_err_num                  NUMBER;
	oracle_err_mes                  VARCHAR2 (200);
	v_count_tot                     NUMBER (10);
  v_count_import                  NUMBER (10);

	v_mld_melding_key								NUMBER(10);

	v_alg_gebouw_key								NUMBER(10);
	v_ins_deel_key									NUMBER(10);
	v_alg_ruimte_key								NUMBER(10);
	v_prs_perslid_key								NUMBER(10);
	v_mld_stdmelding_key						NUMBER(10);

	v_ernst_kenmerk_key							NUMBER(10);
	v_ernst_key											NUMBER(10);
	v_omvang_kenmerk_key						NUMBER(10);
	v_omvang_key										NUMBER(10);
	v_intensiteit_kenmerk_key				NUMBER(10);
	v_intensiteit_key								NUMBER(10);

	v_vg_kenmerk_key				NUMBER(10);
	v_vg_key								NUMBER(10);
	v_ch_kenmerk_key				NUMBER(10);
	v_ch_key								NUMBER(10);
	v_gb_kenmerk_key				NUMBER(10);
	v_gb_key								NUMBER(10);
	v_tv_kenmerk_key				NUMBER(10);
	v_tv_key								NUMBER(10);
	v_tk_kenmerk_key				NUMBER(10);
	v_tk_key								NUMBER(10);
  v_be_kenmerk_key				NUMBER(10);
	v_be_key								NUMBER(10);

	v_foto_kenmerk_key			NUMBER(10);

BEGIN

  v_count_tot := 0;
  v_count_import := 0;

  v_errorhint := 'Foto kenmerk bij gebreken niet gevonden (bestaat niet), import wordt niet uitgevoerd';
  SELECT mld_kenmerk_key
  INTO v_foto_kenmerk_key
  FROM mld_kenmerk
  WHERE mld_srtkenmerk_key = 11
  AND mld_stdmelding_key = 1
  AND mld_kenmerk_niveau = 'T';

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

				v_errorhint := 'Gebouwcode niet gevonden (bestaat niet), regel wordt overgeslagen';

				SELECT alg_gebouw_key
				INTO v_alg_gebouw_key
				FROM alg_v_aanweziggebouw
				WHERE alg_gebouw_upper = UPPER(rec.alg_gebouw_code);

				v_errorhint := 'Element (object) niet gevonden (bestaat niet), regel wordt overgeslagen';
				-- Uitgangspunt hierbij is dat objectnaam uniek is per gebouw, op zich mag in Facilitor de objectnaam per objectsoort per locatie uniek zijn.
				SELECT ins_deel_key, r.alg_ruimte_key
				INTO v_ins_deel_key, v_alg_ruimte_key
				FROM ins_v_aanwezigdeel, alg_ruimte r, alg_verdieping v
				WHERE ins_deel_upper = UPPER(rec.ins_deel_omschrijving)
				AND ins_alg_ruimte_key = r.alg_ruimte_key
				AND r.alg_verdieping_key = v.alg_verdieping_key
				AND v.alg_gebouw_key = v_alg_gebouw_key
				AND ins_alg_ruimte_type = 'R';

				v_errorhint := 'Mailadres van inspecteur (persoon) niet gevonden (bestaat niet), regel wordt overgeslagen';
				SELECT prs_perslid_key
				INTO v_prs_perslid_key
				FROM prs_v_aanwezigperslid
				WHERE UPPER(prs_perslid_email) = UPPER(rec.prs_perslid_email);


				v_errorhint := 'Gebrek (melding) niet gevonden (bestaat niet), regel wordt overgeslagen';
				SELECT sm.mld_stdmelding_key
				INTO v_mld_stdmelding_key
			  FROM mld_stdmelding sm, mld_discipline disc
			  WHERE disc.ins_srtdiscipline_key = 1
			  AND disc.ins_discipline_verwijder IS NULL
			  AND sm.mld_ins_discipline_key = disc.ins_discipline_key
			  AND UPPER(TRIM(SUBSTR(mld_stdmelding_omschrijving, 1, INSTR(mld_stdmelding_omschrijving,' ')))) = UPPER(rec.gebrekode);


				v_errorhint := 'Ernst (eigen tabel) niet gevonden (bestaat niet), regel wordt overgeslagen';
				SELECT ud.fac_usrdata_key, k.mld_kenmerk_key
				INTO v_ernst_key, v_ernst_kenmerk_key
				FROM mld_srtkenmerk sk, fac_kenmerkdomein kd, fac_usrtab ut, fac_usrdata ud, mld_kenmerk k
				WHERE sk.mld_srtkenmerk_key = 1
				AND kd.fac_kenmerkdomein_key = sk.fac_kenmerkdomein_key
				AND ut.fac_usrtab_key = kd.fac_usrtab_key
				AND ud.fac_usrtab_key = kd.fac_usrtab_key
				AND ud.fac_usrdata_upper = UPPER(rec.ernst)
				AND k.mld_srtkenmerk_key = sk.mld_srtkenmerk_key
				AND k.mld_stdmelding_key = v_mld_stdmelding_key
				AND k.mld_kenmerk_niveau = 'S';

				v_errorhint := 'Omvang (eigen tabel) niet gevonden (bestaat niet), regel wordt overgeslagen';
				SELECT ud.fac_usrdata_key, k.mld_kenmerk_key
				INTO v_omvang_key, v_omvang_kenmerk_key
				FROM mld_srtkenmerk sk, fac_kenmerkdomein kd, fac_usrtab ut, fac_usrdata ud, mld_kenmerk k
				WHERE sk.mld_srtkenmerk_key = 2
				AND kd.fac_kenmerkdomein_key = sk.fac_kenmerkdomein_key
				AND ut.fac_usrtab_key = kd.fac_usrtab_key
				AND ud.fac_usrtab_key = kd.fac_usrtab_key
				AND ud.fac_usrdata_upper = UPPER(rec.omvang)
				AND k.mld_srtkenmerk_key = sk.mld_srtkenmerk_key
				AND k.mld_stdmelding_key = v_mld_stdmelding_key
				AND k.mld_kenmerk_niveau = 'S';

				v_errorhint := 'Intensiteit (eigen tabel) niet gevonden (bestaat niet), regel wordt overgeslagen';
				SELECT ud.fac_usrdata_key, k.mld_kenmerk_key
				INTO v_intensiteit_key, v_intensiteit_kenmerk_key
				FROM mld_srtkenmerk sk, fac_kenmerkdomein kd, fac_usrtab ut, fac_usrdata ud, mld_kenmerk k
				WHERE sk.mld_srtkenmerk_key = 3
				AND kd.fac_kenmerkdomein_key = sk.fac_kenmerkdomein_key
				AND ut.fac_usrtab_key = kd.fac_usrtab_key
				AND ud.fac_usrtab_key = kd.fac_usrtab_key
				AND ud.fac_usrdata_upper = UPPER(rec.intensiteit)
				AND k.mld_srtkenmerk_key = sk.mld_srtkenmerk_key
				AND k.mld_stdmelding_key = v_mld_stdmelding_key
				AND k.mld_kenmerk_niveau = 'S';

				v_errorhint := 'Aspect VG (eigen tabel) niet gevonden (bestaat niet), regel wordt overgeslagen';
				SELECT ud.fac_usrdata_key, k.mld_kenmerk_key
				INTO v_vg_key, v_vg_kenmerk_key
				FROM mld_srtkenmerk sk, fac_kenmerkdomein kd, fac_usrtab ut, fac_usrdata ud, mld_kenmerk k
				WHERE sk.mld_srtkenmerk_key = 5
				AND kd.fac_kenmerkdomein_key = sk.fac_kenmerkdomein_key
				AND ut.fac_usrtab_key = kd.fac_usrtab_key
				AND ud.fac_usrtab_key = kd.fac_usrtab_key
				AND ud.fac_usrdata_upper = UPPER(rec.vg)
				AND k.mld_srtkenmerk_key = sk.mld_srtkenmerk_key
				AND k.mld_stdmelding_key = 1
				AND k.mld_kenmerk_niveau = 'T';

				v_errorhint := 'Aspect CH (eigen tabel) niet gevonden (bestaat niet), regel wordt overgeslagen';
				SELECT ud.fac_usrdata_key, k.mld_kenmerk_key
				INTO v_ch_key, v_ch_kenmerk_key
				FROM mld_srtkenmerk sk, fac_kenmerkdomein kd, fac_usrtab ut, fac_usrdata ud, mld_kenmerk k
				WHERE sk.mld_srtkenmerk_key = 6
				AND kd.fac_kenmerkdomein_key = sk.fac_kenmerkdomein_key
				AND ut.fac_usrtab_key = kd.fac_usrtab_key
				AND ud.fac_usrtab_key = kd.fac_usrtab_key
				AND ud.fac_usrdata_upper = UPPER(rec.ch)
				AND k.mld_srtkenmerk_key = sk.mld_srtkenmerk_key
				AND k.mld_stdmelding_key = 1
				AND k.mld_kenmerk_niveau = 'T';

				v_errorhint := 'Aspect GB (eigen tabel) niet gevonden (bestaat niet), regel wordt overgeslagen';
				SELECT ud.fac_usrdata_key, k.mld_kenmerk_key
				INTO v_gb_key, v_gb_kenmerk_key
				FROM mld_srtkenmerk sk, fac_kenmerkdomein kd, fac_usrtab ut, fac_usrdata ud, mld_kenmerk k
				WHERE sk.mld_srtkenmerk_key = 7
				AND kd.fac_kenmerkdomein_key = sk.fac_kenmerkdomein_key
				AND ut.fac_usrtab_key = kd.fac_usrtab_key
				AND ud.fac_usrtab_key = kd.fac_usrtab_key
				AND ud.fac_usrdata_upper = UPPER(rec.gb)
				AND k.mld_srtkenmerk_key = sk.mld_srtkenmerk_key
				AND k.mld_stdmelding_key = 1
				AND k.mld_kenmerk_niveau = 'T';

				v_errorhint := 'Aspect TV (eigen tabel) niet gevonden (bestaat niet), regel wordt overgeslagen';
				SELECT ud.fac_usrdata_key, k.mld_kenmerk_key
				INTO v_tv_key, v_tv_kenmerk_key
				FROM mld_srtkenmerk sk, fac_kenmerkdomein kd, fac_usrtab ut, fac_usrdata ud, mld_kenmerk k
				WHERE sk.mld_srtkenmerk_key = 8
				AND kd.fac_kenmerkdomein_key = sk.fac_kenmerkdomein_key
				AND ut.fac_usrtab_key = kd.fac_usrtab_key
				AND ud.fac_usrtab_key = kd.fac_usrtab_key
				AND ud.fac_usrdata_upper = UPPER(rec.tv)
				AND k.mld_srtkenmerk_key = sk.mld_srtkenmerk_key
				AND k.mld_stdmelding_key = 1
				AND k.mld_kenmerk_niveau = 'T';

				v_errorhint := 'Aspect TK (eigen tabel) niet gevonden (bestaat niet), regel wordt overgeslagen';
				SELECT ud.fac_usrdata_key, k.mld_kenmerk_key
				INTO v_tk_key, v_tk_kenmerk_key
				FROM mld_srtkenmerk sk, fac_kenmerkdomein kd, fac_usrtab ut, fac_usrdata ud, mld_kenmerk k
				WHERE sk.mld_srtkenmerk_key = 9
				AND kd.fac_kenmerkdomein_key = sk.fac_kenmerkdomein_key
				AND ut.fac_usrtab_key = kd.fac_usrtab_key
				AND ud.fac_usrtab_key = kd.fac_usrtab_key
				AND ud.fac_usrdata_upper = UPPER(rec.tk)
				AND k.mld_srtkenmerk_key = sk.mld_srtkenmerk_key
				AND k.mld_stdmelding_key = 1
				AND k.mld_kenmerk_niveau = 'T';

				v_errorhint := 'Aspect BE (eigen tabel) niet gevonden (bestaat niet), regel wordt overgeslagen';
				SELECT ud.fac_usrdata_key, k.mld_kenmerk_key
				INTO v_be_key, v_be_kenmerk_key
				FROM mld_srtkenmerk sk, fac_kenmerkdomein kd, fac_usrtab ut, fac_usrdata ud, mld_kenmerk k
				WHERE sk.mld_srtkenmerk_key = 10
				AND kd.fac_kenmerkdomein_key = sk.fac_kenmerkdomein_key
				AND ut.fac_usrtab_key = kd.fac_usrtab_key
				AND ud.fac_usrtab_key = kd.fac_usrtab_key
				AND ud.fac_usrdata_upper = UPPER(rec.be)
				AND k.mld_srtkenmerk_key = sk.mld_srtkenmerk_key
				AND k.mld_stdmelding_key = 1
				AND k.mld_kenmerk_niveau = 'T';


				INSERT INTO mld_melding (mld_melding_module,
                                 mld_meldbron_key,
                                 mld_melding_datum,
                                 mld_melding_omschrijving,
                                 mld_stdmelding_key,
                                 mld_alg_onroerendgoed_keys,
                                 mld_melding_einddatum,
                                 prs_perslid_key, prs_perslid_key_voor,
                                 mld_melding_status,
                                 mld_melding_spoed)
        VALUES(	'MLD', 6,
				        fac.safe_to_date(rec.mld_melding_datum, 'dd-mm-yyyy'),
				        rec.mld_melding_omschrijving,
				        v_mld_stdmelding_key,
				        v_alg_ruimte_key,
				        fac.safe_to_date(rec.mld_melding_datum, 'dd-mm-yyyy'),
				        v_prs_perslid_key,v_prs_perslid_key,
				        2,
				        3) RETURNING mld_melding_key INTO v_mld_melding_key;

				INSERT INTO mld_melding_object(mld_melding_key, ins_deel_key)
				VALUES (v_mld_melding_key, v_ins_deel_key);

				mld.upsertmeldingkenmerk (v_ernst_kenmerk_key, v_mld_melding_key, v_ernst_key);
				mld.upsertmeldingkenmerk (v_omvang_kenmerk_key, v_mld_melding_key, v_omvang_key);
				mld.upsertmeldingkenmerk (v_intensiteit_kenmerk_key, v_mld_melding_key, v_intensiteit_key);
				mld.upsertmeldingkenmerk (v_vg_kenmerk_key, v_mld_melding_key, v_vg_key);
				mld.upsertmeldingkenmerk (v_ch_kenmerk_key, v_mld_melding_key, v_ch_key);
				mld.upsertmeldingkenmerk (v_gb_kenmerk_key, v_mld_melding_key, v_gb_key);
				mld.upsertmeldingkenmerk (v_tv_kenmerk_key, v_mld_melding_key, v_tv_key);
				mld.upsertmeldingkenmerk (v_tk_kenmerk_key, v_mld_melding_key, v_tk_key);
				mld.upsertmeldingkenmerk (v_be_kenmerk_key, v_mld_melding_key, v_be_key);
				IF rec.foto IS NOT NULL
				THEN
					mld.upsertmeldingkenmerk (v_foto_kenmerk_key, v_mld_melding_key, rec.foto);
				END IF;


				v_count_import := v_count_import + 1;
				COMMIT;

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

  fac.imp_writelog (p_import_key,
                    'S',
                       'UPDATE NEN2767_RESULTS: aantal ingelezen regels: '
                    || TO_CHAR (v_count_tot)
                    || ' / aantal geldige regels: '
                    || TO_CHAR (v_count_import)
                    ,
                    ''
                   );


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


CREATE OR REPLACE VIEW plat_v_export_nen2767_foto (
   result,
   result_order
   )
AS
SELECT 'mkdir \MLD\M' || SUBSTR (LPAD (km.mld_melding_key, 7, '0'), 1, 4)  || '___'  || '\M'  || km.mld_melding_key  || '\' || k.mld_kenmerk_key, km.mld_melding_key || '0'
FROM mld_kenmerkmelding km, mld_kenmerk k
WHERE k.mld_srtkenmerk_key = 11
AND k.mld_stdmelding_key = 1
AND k.mld_kenmerk_niveau = 'T'
AND km.mld_kenmerk_key = k.mld_kenmerk_key
AND km.mld_kenmerkmelding_waarde IS NOT NULL
UNION
SELECT  'copy '|| km.mld_kenmerkmelding_waarde || ' ' || '\MLD\M' || SUBSTR (LPAD (km.mld_melding_key, 7, '0'), 1, 4)  || '___'  || '\M'  || km.mld_melding_key  || '\' || k.mld_kenmerk_key, km.mld_melding_key || '1'
FROM mld_kenmerkmelding km, mld_kenmerk k
WHERE k.mld_srtkenmerk_key = 11
AND k.mld_stdmelding_key = 1
AND k.mld_kenmerk_niveau = 'T'
AND km.mld_kenmerk_key = k.mld_kenmerk_key
AND km.mld_kenmerkmelding_waarde IS NOT NULL;



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