-- -- $Id$ -- -- Script containing customer specific db-configuration for KFHT. DEFINE thisfile = 'KFHT.SQL' DEFINE dbuser = '^KFHT' SET ECHO ON SET DEFINE ON COLUMN fcltlogfile NEW_VALUE fcltlogfile NOPRINT; COLUMN fcltcusttxt NEW_VALUE fcltcusttxt NOPRINT; WHENEVER SQLERROR CONTINUE; SELECT adm.getscriptspoolfile('&thisfile') AS fcltlogfile FROM DUAL; SPOOL &fcltlogfile WHENEVER SQLERROR EXIT; SELECT adm.checkscriptcust('&dbuser') AS fcltcusttxt FROM DUAL; WHENEVER SQLERROR CONTINUE; --------------------------------------- PROMPT &fcltcusttxt --------------------------------------- SET DEFINE OFF ------ payload begin ------ CREATE OR REPLACE PACKAGE KFHT AS PROCEDURE email_asml (pfrom IN VARCHAR2, pto IN VARCHAR2, psubject IN VARCHAR2, pbody IN VARCHAR2, psessionid IN VARCHAR2, pemailkey IN NUMBER); END; / CREATE OR REPLACE PACKAGE BODY KFHT AS -- --Rapportages -- PROCEDURE email_asml (pfrom IN VARCHAR2, pto IN VARCHAR2, psubject IN VARCHAR2, pbody IN VARCHAR2, psessionid IN VARCHAR2, pemailkey IN NUMBER) AS sender prs_perslid.prs_perslid_key%TYPE; kostenplaats prs_afdeling.prs_kostenplaats_key%TYPE; newkey mld_melding.mld_melding_key%TYPE; defaultstdmelding fac_setting.fac_setting_default%TYPE; kkey_att mld_kenmerk.mld_kenmerk_key%TYPE; kkey_mail mld_kenmerk.mld_kenmerk_key%TYPE; errormsg fac_result.fac_result_waarde%TYPE; BEGIN CASE WHEN UPPER (pto) LIKE 'ASML@%' THEN sender := 45581; -- Koppeling Planon SELECT fac_setting_pvalue INTO defaultstdmelding FROM fac_setting WHERE fac_setting_name = 'defaultstdmelding'; --kkey_att := 1; kkey_mail := 2521; -- Kenmerk voor ontvangen mail -- suggested extensions: -- check for MLDUSE-write autorisations -- parse the subject to find an appropriate stdmelding, if uniquely possible -- append (as a note?) to an existing melding if #key is found in the subject BEGIN INSERT INTO mld_melding (mld_melding_module, mld_meldbron_key, mld_melding_datum, mld_melding_onderwerp, mld_melding_omschrijving, mld_melding_status, mld_alg_locatie_key, mld_stdmelding_key, prs_perslid_key, prs_perslid_key_voor, prs_kostenplaats_key, mld_melding_spoed) VALUES ('MLD', 4, -- email SYSDATE, SUBSTR (psubject, 1, 80), SUBSTR (REPLACE (REPLACE( SUBSTR (pbody, 1, 4000), CHR(13)), CHR (10) || CHR (10), CHR (10)), 1, 4000), -- verwijder onnodige witregels NULL, 1, defaultstdmelding, sender, sender, NULL, 3) RETURNING mld_melding_key INTO newkey; INSERT INTO fac_result (fac_result_sessionid, fac_result_naam, fac_result_waarde) VALUES (psessionid, 'kenmerkorgmailpath', 'MLD\M' || TO_CHAR (TRUNC (newkey / 1000), 'FM0000') || '___\M' || newkey || '\' || kkey_mail || '\'); mld.setmeldingstatus (newkey, 2, sender); END; ELSE NULL; END CASE; IF errormsg IS NOT NULL THEN INSERT INTO fac_result (fac_result_sessionid, fac_result_naam, fac_result_waarde) VALUES (psessionid, 'errormsg', errormsg); END IF; EXCEPTION WHEN OTHERS THEN fac.writelog ( 'PROCESSEMAIL', 'W', 'Mail kon niet verwerkt worden afzender: ' || pfrom || '[' || errormsg || ']', 'OTHERS (error ' || SQLCODE || '/' || SUBSTR (SQLERRM, 1, 100) || ')'); INSERT INTO fac_result (fac_result_sessionid, fac_result_naam, fac_result_waarde) VALUES (psessionid, 'errormsg', 'Database fout - Neem contact op met uw systeembeheerder'); END; END; / -- Import vanuit Strukton CREATE OR REPLACE PROCEDURE kfht_import_opdrstat_strukton (p_import_key IN NUMBER) AS c_delim VARCHAR2 (1) := ';'; v_newline VARCHAR2 (4000); -- Input line v_errormsg VARCHAR2 (1000); oracle_err_num NUMBER; oracle_err_mes VARCHAR2 (200); v_aanduiding VARCHAR2 (1000) := ''; header_is_valid NUMBER := 0; v_count_tot NUMBER (10) := 0; v_count_imp NUMBER (10) := 0; v_ongeldig NUMBER (1) := 0; -- De importvelden v_mld_opdr_key_tekst VARCHAR2 (100); v_extern_nummer VARCHAR2 (100); v_status_code VARCHAR2 (100); v_status NUMBER (10); v_datumtijd_tekst VARCHAR2 (100); v_datumtijd DATE; v_status_tekst VARCHAR2 (100); v_opmerking VARCHAR2 (4000); --v_totaal_tekst VARCHAR2 (100); --v_totaal NUMBER (8,2); --v_correctie_tekst VARCHAR2 (100); --v_correctie NUMBER (8,2); -- Overige velden v_mld_opdr_key NUMBER (10); v_mld_opdr_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 DELETE FROM kfht_imp_opdrstat_strukton; COMMIT; FOR rec1 IN c1 LOOP BEGIN v_newline := rec1.fac_imp_file_line; v_errormsg := 'Fout opvragen importregel'; v_aanduiding := ''; v_ongeldig := 0; -- Lees alle veldwaarden. fac.imp_getfield (v_newline, c_delim, v_mld_opdr_key_tekst); v_mld_opdr_key_tekst := TRIM (v_mld_opdr_key_tekst); fac.imp_getfield (v_newline, c_delim, v_extern_nummer); v_extern_nummer := TRIM (v_extern_nummer); fac.imp_getfield (v_newline, c_delim, v_status_code); -- typeID v_status_code := TRIM (v_status_code); fac.imp_getfield (v_newline, c_delim, v_datumtijd_tekst); v_datumtijd_tekst := TRIM (v_datumtijd_tekst); fac.imp_getfield (v_newline, c_delim, v_status_tekst); v_status_tekst := TRIM (v_status_tekst); fac.imp_getfield (v_newline, c_delim, v_opmerking); v_opmerking := SUBSTR (TRIM (v_opmerking), 1, 1000); --fac.imp_getfield (v_newline, c_delim, v_totaal_tekst); --v_totaal := fac.safe_to_number (v_totaal_tekst); --fac.imp_getfield (v_newline, c_delim, v_correctie_tekst); --v_correctie := fac.safe_to_number (v_correctie_tekst); -- Verwijder de markering voor cr/lf die in stylesheet is toegevoegd. v_opmerking := REPLACE (v_opmerking, '@@', CHR (13)); v_aanduiding := '[' || v_mld_opdr_key_tekst || '|' || v_extern_nummer || '|' || v_status_code || '|' || v_datumtijd_tekst || '|' || v_status_tekst || '] '; -- Ik controleer of ik een geldige header heb, dat is: in de juiste kolommen -- de juiste kolomkop. Ik controleer daarbij ALLE kolommen! -- Ik negeer alles totdat ik een geldige header ben gepasseerd. IF (header_is_valid = 0) THEN IF UPPER (TRIM (v_mld_opdr_key_tekst)) = 'REFERENCEID' AND UPPER (TRIM (v_extern_nummer)) = 'SERVICEREQUESTID' AND UPPER (TRIM (v_status_code)) = 'TYPEID' AND UPPER (TRIM (v_datumtijd_tekst)) = 'DATETIME' AND UPPER (TRIM (v_opmerking)) = 'REMARKS' --AND UPPER (TRIM (v_totaal_tekst)) = 'TOTAL' --AND UPPER (TRIM (v_correctie_tekst)) = 'CORRECTION' THEN header_is_valid := 1; END IF; ELSE v_count_tot := v_count_tot + 1; -- Controleer alle veldwaarden. v_errormsg := 'Fout bepalen opdracht'; BEGIN SELECT o.mld_opdr_key, o.mld_opdr_opmerking INTO v_mld_opdr_key, v_mld_opdr_opmerking FROM mld_opdr o, mld_melding m, mld_stdmelding sm, ins_tab_discipline td, ins_srtdiscipline sd WHERE o.mld_melding_key = m.mld_melding_key AND m.mld_stdmelding_key = sm.mld_stdmelding_key AND sm.mld_ins_discipline_key = td.ins_discipline_key AND td.ins_srtdiscipline_key = sd.ins_srtdiscipline_key AND sd.ins_srtdiscipline_prefix || m.mld_melding_key || '/' || o.mld_opdr_bedrijfopdr_volgnr = v_mld_opdr_key_tekst; EXCEPTION WHEN OTHERS THEN v_ongeldig := 1; oracle_err_num := SQLCODE; oracle_err_mes := SUBSTR (SQLERRM, 1, 200); v_errormsg := v_errormsg || ' ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ')'; fac.writelog (p_import_key, 'W', v_aanduiding || v_errormsg, 'Regel wordt overgeslagen!'); END; IF v_ongeldig = 0 THEN v_errormsg := 'Status ongedefinieerd'; CASE WHEN v_status_code = '5' THEN v_status := 5; -- uitgegeven WHEN v_status_code = '10' THEN v_status := 8; -- geaccepteerd WHEN v_status_code = '20' -- monteur gereed THEN v_status := 6; -- afgemeld WHEN v_status_code = '25' -- specialist gereed THEN v_status := 6; -- afgemeld WHEN v_status_code = '30' -- technisch gereed THEN v_status := 6; -- afgemeld -- KFNS#52066: Uitprijs/fiatteer-functionaliteit! --WHEN v_status_code = '40' -- uitgeprijst (fiattering aan FACILITOR-kant) --THEN -- v_status := 9; -- afgerond --WHEN v_status_code = '45' -- gefiatteerd (fiattering aan Strukton-kant) --THEN -- v_status := 9; -- afgerond WHEN v_status_code = '70' THEN v_status := 1; -- geannuleerd WHEN v_status_code = '80' THEN v_status := 1; -- afgewezen WHEN v_status_code = '200' -- onderbroken THEN --TODO: Notitie toevoegen (incl. reden?) v_status := NULL; -- ongewijzigd WHEN v_status_code = '210' -- herpland THEN --TODO: Notitie toevoegen v_status := NULL; -- ongewijzigd ELSE v_status := NULL; v_ongeldig := 1; -- nog te bezien END CASE; END IF; IF v_ongeldig = 0 THEN v_errormsg := 'Datumtijd ongeldig'; IF INSTR (v_datumtijd_tekst, '.') > 0 THEN v_datumtijd := fac.safe_to_date (REPLACE (SUBSTR (v_datumtijd_tekst, 1, INSTR (v_datumtijd_tekst, '.') - 1), 'T', ' '), 'yyyy-mm-dd hh24:mi:ss'); ELSE v_datumtijd := fac.safe_to_date (REPLACE (v_datumtijd_tekst, 'T', ' '), 'yyyy-mm-dd hh24:mi:ss'); END IF; END IF; IF v_ongeldig = 0 THEN v_errormsg := 'Opmerking ongeldig'; -- Controleer of de opmerking niet leeg is en of dezelfde opmerking al bij een eerdere statusovergang is gemeld. IF v_opmerking IS NOT NULL AND INSTR (v_mld_opdr_opmerking, v_opmerking) = 0 THEN v_opmerking := '[' || v_datumtijd_tekst || '] - ' || v_status_tekst || CHR (13) || CHR (10) || v_opmerking; ELSE v_opmerking := '[' || v_datumtijd_tekst || '] - ' || v_status_tekst; END IF; END IF; -- Insert geformatteerde import record. IF v_ongeldig = 0 THEN BEGIN v_errormsg := 'Fout wegschrijven statusbericht'; INSERT INTO kfht_imp_opdrstat_strukton (mld_opdr_key, extern_nummer, status, datumtijd, opmerking) -- Geen totaal/correctie! VALUES (v_mld_opdr_key, v_extern_nummer, v_status, v_datumtijd, v_opmerking); v_count_imp := v_count_imp + 1; EXCEPTION WHEN OTHERS THEN oracle_err_num := SQLCODE; oracle_err_mes := SUBSTR (SQLERRM, 1, 200); v_errormsg := v_errormsg || ' ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ')'; fac.imp_writelog (p_import_key, 'E', v_aanduiding || v_errormsg, ''); END; ELSE -- Foutmeldingen onderdrukken als uitprijzen/fiatteren niet is aangeschakeld. IF v_status_code <> '40' AND v_status_code <> '45' THEN fac.imp_writelog (p_import_key, 'E', v_aanduiding || v_errormsg, ''); END IF; END IF; END IF; END; END LOOP; IF header_is_valid = 0 THEN fac.imp_writelog (p_import_key, 'E', 'Ongeldig importbestand', 'Geen header of header niet volgens specificatie!'); ELSE fac.imp_writelog (p_import_key, 'S', 'Inleesproces/#ingelezen statusberichten: ' || TO_CHAR (v_count_tot), ''); fac.imp_writelog (p_import_key, 'S', 'Inleesproces/#ongeldige niet ingelezen statusberichten: ' || TO_CHAR (v_count_tot - v_count_imp), ''); END IF; COMMIT; EXCEPTION WHEN OTHERS THEN oracle_err_num := SQLCODE; oracle_err_mes := SUBSTR (SQLERRM, 1, 200); v_errormsg := v_errormsg || ' ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ')'; fac.imp_writelog (p_import_key, 'E', v_aanduiding || v_errormsg, 'Inleesproces statusberichten afgebroken!'); END; / CREATE OR REPLACE PROCEDURE kfht_update_opdrstat_strukton (p_import_key IN NUMBER) AS -- Cursor loopt - per opdracht in volgorde! - over alle ingelezen statusberichten. CURSOR c1 IS SELECT mld_opdr_key, extern_nummer, status, datumtijd, opmerking -- Geen totaal/correctie! FROM kfht_imp_opdrstat_strukton ORDER BY 1, 4; c_user_key NUMBER (10) := 264; -- _STRUKTON-user c_refnr_srtkkey NUMBER (10) := 6; -- Refnr. leverancier v_errormsg VARCHAR2 (1000); oracle_err_num NUMBER; oracle_err_mes VARCHAR2 (200); v_aanduiding VARCHAR2 (200); v_count_tot NUMBER (10) := 0; v_count NUMBER (10) := 0; v_mld_key NUMBER (10); v_opdr_key NUMBER (10); v_opdr_status NUMBER (10); v_mld_typeopdr_key NUMBER (10); v_mld_kenmerk_key NUMBER (10); v_mld_kenmerkopdr_key NUMBER (10); BEGIN -- Loop over alle ingelezen Strukton-statusberichten. FOR rec IN c1 LOOP BEGIN v_aanduiding := '[' || rec.mld_opdr_key || '|' || SUBSTR (rec.opmerking, 1, 100) || '] '; v_count_tot := v_count_tot + 1; -- Key van melding/opdracht bepalen en Refnr. bij opdracht opslaan. IF rec.mld_opdr_key IS NOT NULL THEN v_errormsg := 'Fout bepalen opdracht.'; SELECT mld_melding_key, mld_opdr_key, mld_statusopdr_key, mld_typeopdr_key INTO v_mld_key, v_opdr_key, v_opdr_status, v_mld_typeopdr_key FROM mld_opdr WHERE mld_opdr_key = rec.mld_opdr_key; v_errormsg := 'Fout bepalen Refnr-kenmerk.'; SELECT k.mld_kenmerk_key INTO v_mld_kenmerk_key FROM mld_kenmerk k WHERE k.mld_srtkenmerk_key = c_refnr_srtkkey AND k.mld_typeopdr_key = v_mld_typeopdr_key; v_errormsg := 'Fout bepalen Refnr-kenmerkopdracht.'; SELECT MAX (ko.mld_kenmerkopdr_key) INTO v_mld_kenmerkopdr_key FROM mld_kenmerkopdr ko WHERE ko.mld_opdr_key = v_opdr_key AND v_mld_kenmerk_key = ko.mld_kenmerk_key; IF v_mld_kenmerkopdr_key IS NULL THEN -- Kenmerk toevoegen v_errormsg := 'Fout toevoegen Refnr-kenmerkopdracht.'; INSERT INTO mld_kenmerkopdr (mld_kenmerk_key, mld_opdr_key, mld_kenmerkopdr_waarde) VALUES (v_mld_kenmerk_key, v_opdr_key, rec.extern_nummer); ELSE -- Kenmerk bijwerken v_errormsg := 'Fout bijwerken Refnr-kenmerkopdracht.'; UPDATE mld_kenmerkopdr SET mld_kenmerkopdr_waarde = rec.extern_nummer WHERE mld_kenmerkopdr_key = v_mld_kenmerkopdr_key; END IF; IF rec.status IS NOT NULL THEN v_errormsg := 'Fout bijwerken Opmerking (opdracht).'; v_count := LENGTH (rec.opmerking) + 5; -- Beetje speling qua lengte! UPDATE mld_opdr SET mld_opdr_opmerking = DECODE (mld_opdr_opmerking, NULL, rec.opmerking, rec.opmerking || CHR (13) || CHR (10) || SUBSTR (mld_opdr_opmerking, 1, (4000 - v_count))) WHERE mld_opdr_key = v_opdr_key; v_errormsg := 'Fout bijwerken Status.'; IF rec.status = 8 AND v_opdr_status = 5 THEN -- Accepteer de opdracht als deze uitgegeven was MLD.setopdrachtstatus (v_opdr_key, 8, c_user_key); -- Strukton ELSIF rec.status = 6 AND v_opdr_status = 5 THEN -- Meld de opdracht af als deze uitgegeven was (na eerst accepteren) MLD.setopdrachtstatus (v_opdr_key, 8, c_user_key); -- Strukton MLD.setopdrachtstatus (v_opdr_key, 6, c_user_key); -- Strukton ELSIF rec.status = 6 AND v_opdr_status = 8 THEN -- Meld de opdracht af als deze geaccepteerd was MLD.setopdrachtstatus (v_opdr_key, 6, c_user_key); -- Strukton ELSIF rec.status = 1 AND v_opdr_status IN (5, 8) THEN -- Wijs de opdracht af als deze niet/wel geaccepteerd was MLD.setopdrachtstatus (v_opdr_key, 1, c_user_key); -- Strukton MLD.updatemeldingstatusAV (v_mld_key, 0, c_user_key, 0); --ELSIF rec.status = 9 AND v_opdr_status = 6 -- Per KFNS#52066 --THEN -- Neem ontvangen kosten over zoals afgestemd met KFNS#59399! --UPDATE mld_opdr -- SET mld_opdr_materiaal = rec.totaal, -- mld_opdr_kosten = rec.totaal + rec.correctie -- WHERE mld_opdr_key = v_opdr_key; -- Rond de opdracht af als deze afgemeld was --MLD.setopdrachtstatus (v_opdr_key, 9, c_user_key); -- Strukton END IF; IF rec.status = 6 AND v_opdr_status <> 6 THEN -- AADO#30922: Melding niet meer automatisch afmelden. -- KFNS#37965: Opmerking-veld bij melding niet meer bijwerken. MLD.updatemeldingstatusAV (v_mld_key, 0, c_user_key, 0); END IF; ELSE -- rec.status IS NULL (= Onderbroken/Herpland), dan toevoegen Notitie! -- YAXX#59749: Toevoegen Notitie! v_errormsg := 'Fout toevoegen Notitie (opdracht).'; INSERT INTO mld_opdr_note (mld_opdr_key, mld_opdr_note_omschrijving, prs_perslid_key) VALUES (v_opdr_key, rec.opmerking, c_user_key); END IF; END IF; COMMIT; EXCEPTION WHEN OTHERS THEN oracle_err_num := SQLCODE; oracle_err_mes := SUBSTR (SQLERRM, 1, 200); v_errormsg := v_errormsg || ' ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ')'; fac.imp_writelog (p_import_key, 'E', v_aanduiding || v_errormsg, 'Statusbericht-loop'); END; END LOOP; END; / /* Formatted on 17-12-2015 12:58:02 (QP5 v5.136.908.31019) */ CREATE OR REPLACE VIEW kfht_v_export_exact (result, result_order) AS SELECT fac_rapport_regel, fac_rapport_volgnr FROM fac_rapport WHERE fac_rapport_node = SUBSTR ('EXACT', 1, 12); CREATE OR REPLACE PROCEDURE kfht_select_exact (p_applname IN VARCHAR2, p_applrun IN VARCHAR2) AS CURSOR c_opdr IS SELECT DISTINCT o.mld_melding_key, o.mld_opdr_bedrijfopdr_volgnr, sd.ins_srtdiscipline_prefix || TO_CHAR (o.mld_melding_key) || '/' || TO_CHAR (o.mld_opdr_bedrijfopdr_volgnr) ticketnumber, ot.mld_typeopdr_omschrijving ordertype, --a.prs_afdeling_omschrijving department, -- KFHT#60175: Verwijderen Department! b.prs_bedrijf_naam supplier, --SUBSTR (c.cnt_contract_nummer || DECODE (kl.jaarinkoopnr, NULL, '', '/' || kl.jaarinkoopnr), 1, 30) --DECODE (o.prs_kostenplaats_key, -- 38, SUBSTR (COALESCE (c.cnt_contract_nummer, ko.opdrinkoopnr), 1, 30), -- HTCE (300002) -- SUBSTR (c.cnt_contract_nummer || DECODE (COALESCE (ko.opdrinkoopnr, kl.jaarinkoopnr), NULL, '', '/' || COALESCE (ko.opdrinkoopnr, kl.jaarinkoopnr)), 1, 30)) DECODE (kl.jaarinkoopnr, NULL, SUBSTR (c.cnt_contract_nummer || '|' || ko.opdrinkoopnr, 1, 30), kl.jaarinkoopnr) contract, -- KFHT#60175: Anders gaan vullen Contract! td.ins_discipline_omschrijving || ' / ' || sm.mld_stdmelding_omschrijving reporttype, aog.alg_gebouw_code buildingcode, kp.prs_kostenplaats_nr costcenter, COALESCE (ksm.prs_kostensoort_oms, ksv.prs_kostensoort_oms) costunit, o.mld_opdr_kosten costs, b.prs_leverancier_nr supplierreference, --TO_CHAR (fac.gettrackingdate ('ORDNEW', o.mld_opdr_key), 'dd-mm-yyyy hh24:mi:ss') TO_CHAR (o.mld_opdr_datumbegin, 'dd-mm-yyyy') || 'T' || TO_CHAR (o.mld_opdr_datumbegin, 'hh24:mi:ss') issued, DECODE (fac.gettrackingdate ('ORDAFM', o.mld_opdr_key), NULL, NULL, TO_CHAR (fac.gettrackingdate ('ORDAFM', o.mld_opdr_key), 'dd-mm-yyyy') || 'T' || TO_CHAR (fac.gettrackingdate ('ORDAFM', o.mld_opdr_key), 'hh24:mi:ss')) closed, os.mld_statusopdr_omschrijving orderstatus -- KFHT#60175: Toevoegen Orderstatus! FROM fac_tracking t, fac_srtnotificatie sn, mld_opdr o, mld_typeopdr ot, prs_bedrijf b, cnt_contract c, prs_kostenplaats kp, mld_melding m, mld_stdmelding sm, ins_tab_discipline td, ins_srtdiscipline sd, prs_kostensoort ksm, prs_kostensoort ksv, alg_v_allonrgoed_gegevens aog, prs_perslid p, prs_afdeling a, (SELECT prs_link_key, prs_kenmerklink_waarde jaarinkoopnr FROM prs_v_aanwezigkenmerklink WHERE prs_kenmerk_key = 1060) kl, -- Inkoopordernummer (SELECT mld_opdr_key, mld_kenmerkopdr_waarde opdrinkoopnr FROM mld_v_aanwezigkenmerkopdr WHERE mld_kenmerk_key = 17) ko, -- Inkooporder mld_statusopdr os WHERE t.fac_tracking_datum > TRUNC (SYSDATE - 1) -- Export draait na middernacht! AND t.fac_srtnotificatie_key = sn.fac_srtnotificatie_key AND sn.fac_srtnotificatie_xmlnode = 'opdracht' AND t.fac_tracking_refkey = o.mld_opdr_key -- KFHT#60175: Geen restrictie meer op opdrachtstatus (daarmee bij elke wijziging van status)! AND o.mld_typeopdr_key = ot.mld_typeopdr_key --AND ot.mld_typeopdr_key != 8 -- KFHT#60175: Geen restrictie meer op opdrachttype (daarmee ook Offerteaanvraag)! AND o.mld_uitvoerende_keys = b.prs_bedrijf_key -- Geen Interne opdracht, tenzij --AND b.prs_leverancier_nr IS NOT NULL -- KFHT#60175: Geen restrictie meer op leveranciernummer (daarmee ook zonder leveranciernummer)! AND o.cnt_contract_key = c.cnt_contract_key(+) AND o.prs_kostenplaats_key = kp.prs_kostenplaats_key(+) -- KFHT#60175: Geen restrictie meer op kostenplaats (daarmee ook Contractopdracht, Garantieopdracht, Offerte aanvraag, Klacht en Interne opdracht)! AND o.mld_melding_key = m.mld_melding_key AND m.mld_stdmelding_key = sm.mld_stdmelding_key AND sm.mld_ins_discipline_key = td.ins_discipline_key AND td.ins_srtdiscipline_key = sd.ins_srtdiscipline_key AND sm.prs_kostensoort_key = ksm.prs_kostensoort_key(+) AND td.prs_kostensoort_key = ksv.prs_kostensoort_key(+) AND m.mld_alg_onroerendgoed_keys = aog.alg_onroerendgoed_keys AND m.prs_perslid_key = p.prs_perslid_key AND p.prs_afdeling_key = a.prs_afdeling_key AND a.prs_afdeling_key = kl.prs_link_key(+) AND o.mld_opdr_key = ko.mld_opdr_key(+) AND o.mld_statusopdr_key = os.mld_statusopdr_key(+) ORDER BY o.mld_melding_key, o.mld_opdr_bedrijfopdr_volgnr; v_count NUMBER; PROCEDURE add_row (p_regel IN VARCHAR2) AS BEGIN INSERT INTO fac_rapport (fac_rapport_node, fac_rapport_volgnr, fac_rapport_regel) VALUES (SUBSTR (p_applname, 1, 12), v_count, p_regel); v_count := v_count + 1; END; PROCEDURE add_element (p_tag IN VARCHAR2, p_value IN VARCHAR2) AS BEGIN add_row( '<' || p_tag || '>' || xml.char_to_html (p_value) || ''); END; BEGIN v_count := 0; DELETE fac_rapport WHERE fac_rapport_node = SUBSTR (p_applname, 1, 12); -- Header add_row (''); add_row (''); add_row (''); --add_row (''); FOR rec IN c_opdr LOOP BEGIN add_row (''); add_element ('TicketNumber', rec.ticketnumber); add_element ('OrderType', rec.ordertype); --add_element ('Department', rec.department); -- KFHT#60175: Verwijderen Department! add_element ('Supplier', rec.supplier); add_element ('Contract', rec.contract); -- KFHT#60175: Anders gaan vullen Contract! add_element ('ReportType', rec.reporttype); add_element ('BuildingCode', rec.buildingcode); add_element ('CostCenter', rec.costcenter); add_element ('CostUnit', rec.costunit); add_element ('Costs', rec.costs); add_element ('SupplierReference', rec.supplierreference); add_element ('Issued', rec.issued); add_element ('Closed', rec.closed); add_element ('Department', rec.orderstatus); -- KFHT#60175: Toevoegen Orderstatus (als Department, don't ask why)! add_row (''); -- Markeer als geexporteerd? END; END LOOP; --add_row (''); add_row (''); add_row (''); END; / -- Multi variant voor automatische import via gen_import van kosten uit Exact. /* Formatted on 25-1-2016 17:40:20 (QP5 v5.136.908.31019) */ CREATE OR REPLACE PROCEDURE kfht_import_exact (p_import_key IN NUMBER) AS c_delim VARCHAR2 (1) := ';'; v_newline VARCHAR2 (1000); -- Input line v_errormsg VARCHAR2 (1000); oracle_err_num NUMBER; oracle_err_mes VARCHAR2 (200); v_aanduiding VARCHAR2 (200); header_is_valid NUMBER := 0; v_count_tot NUMBER (10) := 0; v_count_import NUMBER (10) := 0; v_ongeldig NUMBER (1) := 0; -- De importvelden v_ticketnumber VARCHAR2 (255); -- C24 v_amount VARCHAR2 (255); -- N12,2 v_changedate VARCHAR2 (255); -- DATE -- Overige velden: CURSOR c1 IS SELECT * FROM fac_imp_file WHERE fac_import_key = p_import_key ORDER BY fac_imp_file_index; BEGIN DELETE FROM kfht_imp_exactmulti WHERE imp_log_run <> p_import_key; COMMIT; FOR rec1 IN c1 LOOP BEGIN v_newline := rec1.fac_imp_file_line; v_errormsg := 'Fout opvragen te importeren rij'; v_aanduiding := ''; v_ongeldig := 0; -- Lees alle veldwaarden fac.imp_getfield (v_newline, c_delim, v_ticketnumber); fac.imp_getfield (v_newline, c_delim, v_amount); fac.imp_getfield (v_newline, c_delim, v_changedate); v_aanduiding := '[' || v_ticketnumber || '|' || v_amount || '|' || v_changedate || '] '; -- Ik controleer of ik een geldige header heb, dat is: in de juiste kolommen -- de juiste kolomkop. Ik controleer daarbij ALLE kolommen! -- Ik negeer alles totdat ik een geldige header ben gepasseerd. IF (header_is_valid = 0) THEN IF UPPER (TRIM (v_ticketnumber)) = 'TICKETNUMBER' AND UPPER (TRIM (v_amount)) = 'AMOUNT' AND UPPER (TRIM (v_changedate)) = 'CHANGEDATE' THEN header_is_valid := 1; END IF; ELSE v_count_tot := v_count_tot + 1; -- Controleer alle veldwaarden v_errormsg := 'Fout inlezen ticketnumber'; v_ticketnumber := TRIM (v_ticketnumber); IF (v_ticketnumber IS NULL) THEN fac.imp_writelog (p_import_key, 'W', v_aanduiding || v_errormsg, 'Ticketnumber ongeldig; regel wordt overgeslagen!'); v_ongeldig := 1; END IF; -- v_errormsg := 'Fout inlezen amount'; v_amount := TRIM (REPLACE (v_amount, ',', '.')); IF (fac.safe_to_number (v_amount) IS NULL) THEN fac.imp_writelog (p_import_key, 'W', v_aanduiding || v_errormsg, 'Amount ongeldig; regel wordt overgeslagen!'); v_ongeldig := 1; END IF; -- v_errormsg := 'Fout inlezen changedate'; v_changedate := TRIM (v_changedate); IF (fac.safe_to_date (v_changedate, 'dd-mm-yyyy hh24:mi:ss') IS NULL) THEN fac.imp_writelog (p_import_key, 'W', v_aanduiding || v_errormsg, 'Changedate ongeldig; regel wordt overgeslagen!'); v_ongeldig := 1; END IF; -- Insert geformatteerde import record IF (v_ongeldig = 0) THEN BEGIN v_errormsg := 'Fout bij wegschrijven importregel'; INSERT INTO kfht_imp_exactmulti (imp_log_run, ticketnumber, amount, changedate) VALUES (p_import_key, v_ticketnumber, fac.safe_to_number (v_amount), fac.safe_to_date (v_changedate, 'dd-mm-yyyy hh24:mi:ss')); v_count_import := v_count_import + 1; EXCEPTION WHEN OTHERS THEN oracle_err_num := SQLCODE; oracle_err_mes := SUBSTR (SQLERRM, 1, 200); v_errormsg := v_errormsg || ' ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ')'; fac.imp_writelog (p_import_key, 'E', v_aanduiding || v_errormsg, ''); END; END IF; END IF; END; END LOOP; IF (header_is_valid = 0) THEN fac.imp_writelog (p_import_key, 'E', 'Ongeldig importbestand', 'Geen header of header niet volgens specificatie!'); ELSE fac.imp_writelog (p_import_key, 'S', 'Inleesproces/#ingelezen importregels: ' || TO_CHAR (v_count_tot), ''); fac.imp_writelog (p_import_key, 'S', 'Inleesproces/#ongeldige niet ingelezen importregels: ' || TO_CHAR (v_count_tot - v_count_import), ''); END IF; DELETE FROM fac_imp_file WHERE fac_import_key = p_import_key; COMMIT; EXCEPTION WHEN OTHERS THEN oracle_err_num := SQLCODE; oracle_err_mes := SUBSTR (SQLERRM, 1, 200); v_errormsg := v_errormsg || ' ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ')'; fac.imp_writelog (p_import_key, 'E', v_aanduiding || v_errormsg, 'Inleesproces kostenregels uit Exact afgebroken!'); END; / CREATE OR REPLACE PROCEDURE kfht_update_exact (p_import_key IN NUMBER) AS -- Cursor loopt over alle ingelezen kostenregels uit Exact. CURSOR c1 IS SELECT ticketnumber, -- Ticketnumber met of zonder prefix! DECODE (fac.safe_to_number (SUBSTR (ticketnumber, 1, 1)), NULL, TRIM (SUBSTR (ticketnumber, 2)), ticketnumber) opdr_id, -- Ticketnumber zonder prefix! amount, changedate FROM kfht_imp_exactmulti WHERE imp_log_run = p_import_key ORDER BY 4, 2; v_errormsg VARCHAR2 (1000); oracle_err_num NUMBER; oracle_err_mes VARCHAR2 (200); v_aanduiding VARCHAR2 (200); v_count_tot NUMBER (10); v_mld_key NUMBER (10); v_opdr_key NUMBER (10); v_opdr_status NUMBER (10); v_typeopdr_key NUMBER (10); BEGIN -- Loop door alle ingelezen kostenregels uit Exact en verwerk deze. v_count_tot := 0; FOR rec IN c1 LOOP BEGIN v_aanduiding := '[' || rec.ticketnumber || '|' || TO_CHAR (rec.amount) || '] '; v_count_tot := v_count_tot + 1; v_mld_key := -1; v_opdr_key := -1; v_errormsg := 'Fout bepalen melding/opdracht.'; BEGIN SELECT mld_melding_key, mld_opdr_key, mld_statusopdr_key, mld_typeopdr_key INTO v_mld_key, v_opdr_key, v_opdr_status, v_typeopdr_key FROM mld_opdr WHERE mld_melding_key || '/' || mld_opdr_bedrijfopdr_volgnr = rec.opdr_id; EXCEPTION WHEN OTHERS THEN oracle_err_num := SQLCODE; oracle_err_mes := SUBSTR (SQLERRM, 1, 100); v_errormsg := v_errormsg || ' ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ')'; -- KFHT#60175: Voortaan bij bepalen melding/opdracht foutmelding onderdrukken als amount=0! IF rec.amount != 0 THEN fac.imp_writelog (p_import_key, 'E', v_aanduiding || v_errormsg, 'Fout verwerken kostenregels uit Exact.'); END IF; END; -- Alleen iets doen als melding/opdracht succesvol is bepaald. IF (v_mld_key > 0 AND v_opdr_key > 0) THEN -- Bijwerken kosten met amount. v_errormsg := 'Fout bijwerken kosten.'; --UPDATE mld_opdr -- SET mld_opdr_kosten = rec.amount, -- mld_opdr_uren = 0, -- mld_opdr_uurloon = 0, -- mld_opdr_materiaal = 0 -- WHERE mld_opdr_key = v_opdr_key; UPDATE mld_opdr SET mld_opdr_kosten = rec.amount WHERE mld_opdr_key = v_opdr_key; -- Bijwerken ordernr met changedate. v_errormsg := 'Fout bijwerken ordernr.'; UPDATE mld_opdr SET mld_opdr_ordernr = TO_CHAR (rec.changedate, 'dd-mm-yyyy hh24:mi:ss') WHERE mld_opdr_key = v_opdr_key; -- Verwerken opdracht. IF (v_opdr_status = 6 OR v_opdr_status = 9) AND v_typeopdr_key != 8 THEN v_errormsg := 'Fout verwerken opdracht.'; MLD.setopdrachtstatus (v_opdr_key, 7, NULL); END IF; COMMIT; END IF; EXCEPTION WHEN OTHERS THEN oracle_err_num := SQLCODE; oracle_err_mes := SUBSTR (SQLERRM, 1, 100); v_errormsg := v_errormsg || ' ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ')'; fac.imp_writelog (p_import_key, 'E', v_aanduiding || v_errormsg, 'Fout verwerken kostenregels uit Exact.'); END; END LOOP; fac.imp_writelog (p_import_key, 'S', 'Proces: ' || TO_CHAR (v_count_tot) || ' kostenregels uit Exact afgehandeld.', ''); COMMIT; END; / -- Dummy export NACHTWERK! -- KFHT#56229: Verwijderen inactieve accounts (6 maanden niet ingelogd). CREATE OR REPLACE PROCEDURE kfht_select_nachtwerk (p_applname IN VARCHAR2, p_applrun IN VARCHAR2) AS v_errormsg VARCHAR2 (1000); oracle_err_num NUMBER; oracle_err_mes VARCHAR2 (200); v_count NUMBER; BEGIN v_count := 0; FOR rec IN ( SELECT p.prs_perslid_key, p.prs_perslid_oslogin, COUNT (vp.prs_perslid_key) aant FROM prs_v_aanwezigperslid p, prs_v_verplichting_keys vp WHERE TO_CHAR (SYSDATE, 'dd') = '01' -- Op 1e van de maand >180d niet ingelogd AND p.prs_perslid_login < TRUNC (ADD_MONTHS (SYSDATE, -6), 'mm') AND p.prs_perslid_key = vp.prs_perslid_key(+) -- Actuele verplichtingen? GROUP BY p.prs_perslid_key, p.prs_perslid_oslogin ORDER BY 1) LOOP BEGIN IF rec.aant = 0 THEN UPDATE prs_perslid SET prs_perslid_verwijder = SYSDATE WHERE prs_perslid_key = rec.prs_perslid_key; v_count := v_count + 1; ELSE fac.writelog (p_applname, 'I', '[' || rec.prs_perslid_oslogin || ']/#Verplichtingen: ' || TO_CHAR (rec.aant), 'Persoon niet geïnactiveerd'); END IF; EXCEPTION WHEN OTHERS THEN -- Kennelijk heeft persoon toch nog ernstige verplichtingen! oracle_err_num := SQLCODE; oracle_err_mes := SUBSTR (SQLERRM, 1, 200); v_errormsg := 'ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ')'; fac.writelog (p_applname, 'E', '[' || rec.prs_perslid_oslogin || ']/' || v_errormsg, 'Fout inactiveren persoon'); END; END LOOP; fac.writelog (p_applname, 'S', '#Personen geïnactiveerd:' || TO_CHAR (v_count), ''); COMMIT; EXCEPTION WHEN OTHERS THEN oracle_err_num := SQLCODE; oracle_err_mes := SUBSTR (SQLERRM, 1, 200); v_errormsg := 'ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ')'; fac.writelog (p_applname, 'E', v_errormsg, 'Proces NACHTWERK afgebroken!'); END kfht_select_nachtwerk; / CREATE OR REPLACE VIEW KFHT_V_NOTI_MLD_WVGREMINDER ( CODE, SENDER, RECEIVER, TEXT, KEY, PAR1, PAR2, XKEY ) AS SELECT 'CUST01', NULL, COALESCE (m.prs_perslid_key_voor, prs_perslid_key), 'Uw melding ' || sd.ins_srtdiscipline_prefix || m.mld_melding_key || ' staat nog open ter goedkeuring', m.mld_melding_key, NULL, NULL, NULL FROM mld_kenmerkmelding km, mld_kenmerk k, mld_melding m, mld_stdmelding sm, mld_discipline md, ins_srtdiscipline sd WHERE km.mld_kenmerk_key = k.mld_kenmerk_key AND k.mld_kenmerk_verwijder IS NULL AND k.mld_srtkenmerk_key = 122 -- Begindatum AND fac.safe_to_date (km.mld_kenmerkmelding_waarde, 'DD-MM-YYYY') = TRUNC (SYSDATE) + 2 AND km.mld_melding_key = m.mld_melding_key AND m.mld_stdmelding_key = sm.mld_stdmelding_key AND sm.mld_ins_discipline_key = md.ins_discipline_key AND md.ins_discipline_key = 208 -- Aanvraag werkvergunning AND md.ins_srtdiscipline_key = sd.ins_srtdiscipline_key AND m.mld_melding_status NOT IN (1, 5, 6) AND m.mld_melding_key = m.mld_melding_start_key; -- Notijob om ASML gebouwen te notificeren bij afronden WF rondom WVG. -- KFHT#66052: Toevoegen soortgelijke notificaties voor NXP gebouewen. CREATE OR REPLACE VIEW KFHT_V_NOTI_MLD_ASMLREMINDER ( CODE, SENDER, RECEIVER, TEXT, KEY, PAR1, PAR2, XKEY, XEMAIL, XMOBILE ) AS SELECT 'MLDMAI', NULL, NULL, 'Er zullen werkzaamheden plaatsvinden betreft ' || sd.ins_srtdiscipline_prefix || m.mld_melding_key || ' op locatie ' || aog.alg_gebouw_naam, m.mld_melding_key, NULL, NULL, NULL, 'operation_maintenance@asml.com', NULL FROM mld_melding m, mld_stdmelding sm, mld_discipline md, ins_srtdiscipline sd, alg_v_onroerendgoed_gegevens aog WHERE m.mld_stdmelding_key = sm.mld_stdmelding_key AND sm.mld_ins_discipline_key = md.ins_discipline_key AND md.ins_discipline_key = 208 -- Aanvraag werkvergunning AND md.ins_srtdiscipline_key = sd.ins_srtdiscipline_key AND m.mld_melding_key = m.mld_melding_start_key AND m.mld_alg_onroerendgoed_keys = aog.alg_onroerendgoed_keys AND aog.alg_gebouw_key IN (37, 39) AND EXISTS (SELECT 1 FROM fac_tracking WHERE fac_srtnotificatie_key = 38 -- MLDAFM AND fac_tracking_datum > TRUNC (SYSDATE - 1) AND fac_tracking_refkey = m.mld_melding_key) UNION ALL SELECT sn.fac_srtnotificatie_code, NULL, NULL, REPLACE ( REPLACE ( REPLACE ( sn.fac_srtnotificatie_oms, '##KEY##', sd.ins_srtdiscipline_prefix || TO_CHAR (m.mld_melding_key)), '##STDMLD##', sm.mld_stdmelding_omschrijving), '##GEBOUW##', aog.alg_gebouw_code || ' - ' || aog.alg_gebouw_naam), m.mld_melding_key, NULL, NULL, NULL, 'servicedesknxp@facilicom.nl', NULL FROM mld_melding m, mld_stdmelding sm, mld_discipline md, ins_srtdiscipline sd, alg_v_onroerendgoed_gegevens aog, fac_srtnotificatie sn WHERE m.mld_stdmelding_key = sm.mld_stdmelding_key AND sm.mld_ins_discipline_key = md.ins_discipline_key AND md.ins_discipline_key = 206 -- Beoordeling gebouwbeheerder AND md.ins_srtdiscipline_key = sd.ins_srtdiscipline_key --AND m.mld_melding_start_key IS NOT NULL AND m.mld_alg_onroerendgoed_keys = aog.alg_onroerendgoed_keys AND aog.alg_gebouw_key IN (41, 46) -- HTC 46/HTC 60 AND sn.fac_srtnotificatie_code = 'CUST02' AND EXISTS -- Gisteren aangemaakt altijd notificeren ongeacht status (SELECT 1 FROM fac_tracking WHERE fac_srtnotificatie_key = 43 -- MLDNEW AND TRUNC (fac_tracking_datum) = TRUNC (SYSDATE - 1) AND fac_tracking_refkey = m.mld_melding_key); -- KFHT#61132: Opdrachtkosten per object. -- KFHT#65899: Toevoegen Gebouw/Terrein-kolom(men). CREATE OR REPLACE VIEW kfht_v_rap_ins_opdr_kosten ( objectdiscipline, objectgroep, objectsoortcode, objectsoort, objectid, objectopm, vakgroeptype, vakgroep, meldingsoort, meldingnr, meldingstatus, mld_aanmaak, mld_gepland, mld_afgemeld, opdrachttype, opdrachtnr, opdrachtstatus, ord_aanmaak, ord_gepland, ord_afgemeld, --ord_afgerond, opdrachtkosten, ins_gebouw_terrein, mld_gebouw_terrein ) AS SELECT td.ins_discipline_omschrijving, sg.ins_srtgroep_omschrijving, sd.ins_srtdeel_code, sd.ins_srtdeel_omschrijving, d.ins_deel_omschrijving, d.ins_deel_opmerking, sd.ins_srtdiscipline_omschrijving, md.ins_discipline_omschrijving, sm.mld_stdmelding_omschrijving, COALESCE (sd.ins_srtdiscipline_prefix, '') || TO_CHAR (m.mld_melding_key) meldingnr, ms.mld_statuses_omschrijving, m.mld_melding_datum mld_aanmaak, m.mld_melding_einddatum mld_gepland, fac.gettrackingdate ('MLDAFM', m.mld_melding_key) afgemeld, ot.mld_typeopdr_omschrijving, TO_CHAR (o.mld_melding_key) || '/' || TO_CHAR (o.mld_opdr_bedrijfopdr_volgnr) opdrachtnr, os.mld_statusopdr_omschrijving, o.mld_opdr_datumbegin ord_aanmaak, o.mld_opdr_einddatum ord_gepland, fac.gettrackingdate ('ORDAFM', o.mld_opdr_key) ord_afgemeld, --fac.gettrackingdate ('ORDAFR', o.mld_opdr_key) ord_afgerond, o.mld_opdr_kosten, DECODE (d.ins_alg_ruimte_type, 'R', aog2.alg_gebouw_code || ' - ' || aog1.alg_gebouw_naam, 'T', aog1.alg_terreinsector_code || ' - ' || aog1.alg_terreinsector_code, NULL) gebouw_terrein1, DECODE (m.mld_alg_onroerendgoed_keys, NULL, NULL, DECODE (aog2.alg_terreinsector_key, NULL, aog2.alg_gebouw_code || ' - ' || aog2.alg_gebouw_naam, aog2.alg_terreinsector_code || ' - ' || aog2.alg_terreinsector_code)) gebouw_terrein2 FROM ins_deel d, ins_srtdeel sd, ins_srtgroep sg, ins_discipline td, mld_melding_object mo, mld_melding m, mld_statuses ms, mld_stdmelding sm, mld_discipline md, ins_srtdiscipline sd, mld_opdr o, mld_statusopdr os, mld_typeopdr ot, alg_v_onroerendgoed_gegevens aog1, -- Tbv. ins_gebouw_terrein alg_v_onroerendgoed_gegevens aog2 -- Tbv. ins_gebouw_terrein WHERE d.ins_deel_verwijder IS NULL AND d.ins_srtdeel_key = sd.ins_srtdeel_key AND sd.ins_srtgroep_key = sg.ins_srtgroep_key AND sg.ins_discipline_key = td.ins_discipline_key AND d.ins_deel_key = mo.ins_deel_key AND mo.mld_melding_key = m.mld_melding_key AND m.mld_melding_status = ms.mld_statuses_key(+) AND m.mld_stdmelding_key = sm.mld_stdmelding_key AND sm.mld_ins_discipline_key = md.ins_discipline_key AND md.ins_srtdiscipline_key = sd.ins_srtdiscipline_key AND m.mld_melding_key = o.mld_melding_key AND o.mld_statusopdr_key = os.mld_statusopdr_key(+) AND o.mld_typeopdr_key = ot.mld_typeopdr_key AND d.ins_alg_ruimte_key = aog1.alg_onroerendgoed_keys(+) AND m.mld_alg_onroerendgoed_keys = aog2.alg_onroerendgoed_keys(+); ------ 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