Files
Customer/FLEX/flex.sql
Arthur Egberink ea3df0dbe5 YFTH#62991 -- Werkplekreserveringen (mobile)
svn path=/Customer/trunk/; revision=48365
2020-10-01 17:44:43 +00:00

572 lines
25 KiB
MySQL

--
-- $Id$
--
-- Script containing FLEX specific sql statements for the FACILITOR database
DEFINE thisfile = 'FLEX.SQL'
DEFINE dbuser = 'FLEX'
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 FLEX
AS
FUNCTION res_presave (p_user_key IN NUMBER,
p_rsv_ruimte_key IN NUMBER,
p_activiteit_key IN NUMBER,
p_res_deel_key IN NUMBER,
p_datum_van IN DATE,
p_datum_tot IN DATE,
p_volgnr IN NUMBER)
RETURN VARCHAR2;
END;
/
CREATE OR REPLACE PACKAGE BODY FLEX
AS
FUNCTION res_presave (p_user_key IN NUMBER,
p_rsv_ruimte_key IN NUMBER,
p_activiteit_key IN NUMBER,
p_res_deel_key IN NUMBER,
p_datum_van IN DATE,
p_datum_tot IN DATE,
p_volgnr IN NUMBER)
RETURN VARCHAR2
AS
v_result VARCHAR2 (300);
v_date DATE;
v_count NUMBER;
oracle_err_num NUMBER;
oracle_err_mes VARCHAR2 (200);
v_errormsg VARCHAR2 (200);
v_errorhint VARCHAR2 (200);
BEGIN
v_result := 'OK';
-- op dit moment nog niet in gebruik
RETURN v_result;
IF p_activiteit_key IN (21, 61, 81) -- werkplek, restaurantplek, vergaderplek
THEN
SELECT count(*)
INTO v_count
FROM res_rsv_ruimte rrr
WHERE rrr.res_rsv_ruimte_verwijder IS NULL
AND rrr.res_activiteit_key = p_activiteit_key
AND rrr.res_rsv_ruimte_host_key = p_user_key
AND rrr.res_rsv_ruimte_key <> p_rsv_ruimte_key
AND res_rsv_ruimte_van = TRUNC (p_datum_tot);
-- AND p_datum_tot > rrr.res_rsv_ruimte_van
-- AND p_datum_van < rrr.res_rsv_ruimte_tot
IF v_count > 0
THEN
v_result := 'Beste collega,' || CHR(10) ||
'We hebben deze dag al een reserveringen van je gevonden. Je mag geen overlappende reserveringen boeken.';
ELSE
v_errorhint := 'Kijk of de reservering te ver in de toekomst ligt';
IF p_datum_van > TRUNC(SYSDATE + 28)
THEN
v_result := 'Beste collega,' || CHR(10) ||
'Je mag maximaal 28 dagen in de toekomst boeken.';
END IF;
END IF;
END IF;
RETURN v_result;
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 || ')';
RETURN v_result;
END;
END;
/
-- Import functie voor het importeren van vastgoed en werkplekgegevens.
CREATE OR REPLACE PROCEDURE flex_import_wp (p_import_key IN NUMBER)
AS
c_fielddelimitor VARCHAR2 (1) := ';';
v_newline VARCHAR2 (1000); -- Input line
v_errormsg VARCHAR2 (1000);
v_errorhint VARCHAR2 (1000);
oracle_err_num NUMBER;
oracle_err_mes VARCHAR2 (200);
header_is_valid NUMBER;
v_count NUMBER;
v_ongeldig NUMBER (1);
v_aanduiding VARCHAR2 (200);
-- De importvelden:
v_klantcode VARCHAR2(255);
v_locatie_code VARCHAR2(255);
v_locatie_omschrijving VARCHAR2(255);
v_gebouw_code VARCHAR2(255);
v_gebouw_omschrijving VARCHAR2(255);
v_verdieping_volgnr VARCHAR2(255);
v_ruimte_nr VARCHAR2(255);
v_ruimte_omschrijving VARCHAR2(255);
v_kenmerkwaarde1 VARCHAR2(255);
v_kenmerkwaarde2 VARCHAR2(255);
v_kenmerkwaarde3 VARCHAR2(255);
v_kenmerkwaarde4 VARCHAR2(255);
v_kenmerkwaarde5 VARCHAR2(255);
v_deel_omschrijving VARCHAR2(255);
v_deel_reserveerbaar VARCHAR2(255);
CURSOR c IS
SELECT *
FROM fac_imp_file
WHERE fac_import_key = p_import_key
ORDER BY fac_imp_file_index;
BEGIN
-- Vorige inlees eerst verwijderen
DELETE FROM flex_imp_wp;
COMMIT;
header_is_valid := 0;
v_ongeldig := 0;
v_count := 0;
header_is_valid := 0;
FOR rec IN c
LOOP
BEGIN
v_newline := rec.fac_imp_file_line;
v_errormsg := 'Fout opvragen te importeren rij';
v_aanduiding := '';
-- Lees alle veldwaarden: Klantcode Locatiecode Locatieomschrijving Gebouwcode Gebouwomschrijving Bouwlaagvolgnummer Ruimtenummer Ruimteomschrijving WPidentificatie reserveerbaar
v_errormsg := 'Fout opvragen te importeren rij (Klantcode)';
fac.imp_getfield (v_newline, c_fielddelimitor, v_klantcode);
v_errormsg := 'Fout opvragen te importeren rij (Locatiecode)';
fac.imp_getfield (v_newline, c_fielddelimitor, v_locatie_code);
v_errormsg := 'Fout opvragen te importeren rij (Locatieomschrijving)';
fac.imp_getfield (v_newline, c_fielddelimitor, v_locatie_omschrijving);
v_errormsg := 'Fout opvragen te importeren rij (Gebouwcode)';
fac.imp_getfield (v_newline, c_fielddelimitor, v_gebouw_code);
v_errormsg := 'Fout opvragen te importeren rij (Gebouwomschrijving)';
fac.imp_getfield (v_newline, c_fielddelimitor, v_gebouw_omschrijving);
v_errormsg := 'Fout opvragen te importeren rij (Bouwlaagvolgnummer)';
fac.imp_getfield (v_newline, c_fielddelimitor, v_verdieping_volgnr);
v_errormsg := 'Fout opvragen te importeren rij (Ruimtenummer)';
fac.imp_getfield (v_newline, c_fielddelimitor, v_ruimte_nr);
v_errormsg := 'Fout opvragen te importeren rij (Ruimteomschrijving)';
fac.imp_getfield (v_newline, c_fielddelimitor, v_ruimte_omschrijving);
v_errormsg := 'Fout opvragen te importeren rij (WPidentificatie)';
fac.imp_getfield (v_newline, c_fielddelimitor, v_deel_omschrijving);
v_errormsg := 'Fout opvragen te importeren rij (WPreserveerbaar)';
fac.imp_getfield (v_newline, c_fielddelimitor, v_deel_reserveerbaar);
v_errormsg := 'Fout opvragen te importeren rij (Kenmerk1)';
fac.imp_getfield (v_newline, c_fielddelimitor, v_kenmerkwaarde1);
v_errormsg := 'Fout opvragen te importeren rij (Kenmerk2)';
fac.imp_getfield (v_newline, c_fielddelimitor, v_kenmerkwaarde2);
v_errormsg := 'Fout opvragen te importeren rij (Kenmerk3)';
fac.imp_getfield (v_newline, c_fielddelimitor, v_kenmerkwaarde3);
v_errormsg := 'Fout opvragen te importeren rij (Kenmerk4)';
fac.imp_getfield (v_newline, c_fielddelimitor, v_kenmerkwaarde4);
v_errormsg := 'Fout opvragen te importeren rij (Kenmerk5)';
fac.imp_getfield (v_newline, c_fielddelimitor, v_kenmerkwaarde5);
v_aanduiding :=
v_locatie_code
|| '|'
|| v_gebouw_code
|| '|'
|| v_verdieping_volgnr
|| '|'
|| v_ruimte_nr
|| '|'
|| v_deel_omschrijving;
-- Skip until the header is found
IF header_is_valid = 0 OR SUBSTR(rec.fac_imp_file_line,1,4) = ';;;;'
THEN
IF UPPER(v_klantcode) = 'KLANTCODE'
AND UPPER(v_locatie_code) = 'LOCATIECODE'
AND UPPER(v_locatie_omschrijving) = 'LOCATIEOMSCHRIJVING'
AND UPPER(v_gebouw_code) = 'GEBOUWCODE'
AND UPPER(v_gebouw_omschrijving) = 'GEBOUWOMSCHRIJVING'
AND UPPER(v_verdieping_volgnr) = 'BOUWLAAGVOLGNUMMER'
AND UPPER(v_ruimte_nr) = 'RUIMTENUMMER'
AND UPPER(v_ruimte_omschrijving) = 'RUIMTEOMSCHRIJVING'
AND UPPER(v_deel_omschrijving) = 'WPIDENTIFICATIE'
AND UPPER(v_deel_reserveerbaar) = 'RESERVEERBAAR'
THEN
header_is_valid := 1;
END IF;
ELSE -- Header OK. V
BEGIN
v_ongeldig := 0;
v_klantcode := TRIM(v_klantcode);
v_errormsg := 'Controleer klantcode ' || v_klantcode;
IF LENGTH(v_klantcode) > 4 OR v_klantcode IS NULL
THEN
fac.imp_writelog (p_import_key, 'W', 'Klantcode mag NIET leeg zijn of groter dan 4 posities: ' || v_aanduiding, v_errormsg);
v_klantcode := SUBSTR(v_klantcode, 1, 4);
END IF;
v_locatie_code := TRIM(v_locatie_code);
v_errormsg := 'Controleer locatiecode ' || v_locatie_code;
IF LENGTH(v_locatie_code) > 10 OR v_locatie_code IS NULL
THEN
fac.imp_writelog (p_import_key, 'W', 'Locatiecode mag NIET leeg zijn of groter dan 10 posities: ' || v_aanduiding, v_errormsg);
v_locatie_code := SUBSTR(v_locatie_code, 1, 10);
END IF;
v_locatie_omschrijving := TRIM(v_locatie_omschrijving);
v_errormsg := 'Controleer locatieomschrijving ' || v_locatie_omschrijving;
IF LENGTH(v_locatie_omschrijving) > 60 OR v_locatie_omschrijving IS NULL
THEN
fac.imp_writelog (p_import_key, 'W', 'Locatieomschrijving mag NIET leeg zijn of groter dan 60 posities: ' || v_aanduiding, v_errormsg);
v_locatie_omschrijving := SUBSTR(v_locatie_omschrijving, 1, 60);
END IF;
v_gebouw_code := TRIM(v_gebouw_code);
v_errormsg := 'Controleer gebouwcode ' || v_gebouw_code;
IF LENGTH(v_gebouw_code) > 10 OR v_gebouw_code IS NULL
THEN
fac.imp_writelog (p_import_key, 'W', 'Gebouwcode mag NIET leeg zijn of groter dan 12 posities: ' || v_aanduiding, v_errormsg);
v_gebouw_code := SUBSTR(v_gebouw_code, 1, 12);
END IF;
v_gebouw_omschrijving := TRIM(v_gebouw_omschrijving);
v_errormsg := 'Controleer gebouwomschrijving ' || v_gebouw_omschrijving;
IF LENGTH(v_gebouw_omschrijving) > 30 OR v_gebouw_omschrijving IS NULL
THEN
fac.imp_writelog (p_import_key, 'W', 'Gebouwomschrijving mag NIET leeg zijn of groter dan 30 posities: ' || v_aanduiding, v_errormsg);
v_gebouw_omschrijving := SUBSTR(v_gebouw_omschrijving, 1, 30);
END IF;
v_verdieping_volgnr := TRIM(v_verdieping_volgnr);
v_errormsg := 'Controleer bouwlaagvolgnummer ' || v_verdieping_volgnr;
IF FAC.safe_to_number(v_verdieping_volgnr) IS NULL
THEN
fac.imp_writelog (p_import_key, 'E', 'Bouwlaagvolgnummer is geen getal: ' || v_aanduiding, v_errormsg);
v_ongeldig := 1;
END IF;
v_ruimte_nr := TRIM(v_ruimte_nr);
v_errormsg := 'Controleer ruimtenummer ' || v_ruimte_nr;
IF LENGTH(v_ruimte_nr) > 10 OR v_ruimte_nr IS NULL
THEN
fac.imp_writelog (p_import_key, 'W', 'Ruimtenummer mag NIET leeg zijn of groter dan 10 posities: ' || v_aanduiding, v_errormsg);
v_ruimte_nr := SUBSTR(v_ruimte_nr, 1, 10);
END IF;
v_ruimte_omschrijving := TRIM(v_ruimte_omschrijving);
v_errormsg := 'Controleer ruimteomschrijving ' || v_ruimte_omschrijving;
IF LENGTH(v_ruimte_omschrijving) > 30 OR v_ruimte_omschrijving IS NULL
THEN
fac.imp_writelog (p_import_key, 'W', 'Ruimteomschrijving mag NIET leeg zijn of groter dan 30 posities: ' || v_aanduiding, v_errormsg);
v_ruimte_omschrijving := SUBSTR(v_ruimte_omschrijving, 1, 30);
END IF;
v_deel_omschrijving := TRIM(v_deel_omschrijving);
v_errormsg := 'Controleer werkplekidentificatie ' || v_deel_omschrijving;
IF LENGTH(v_deel_omschrijving) > 30 OR v_deel_omschrijving IS NULL
THEN
fac.imp_writelog (p_import_key, 'W', 'Werkplekidentificatie mag NIET leeg zijn of groter dan 30 posities: ' || v_aanduiding, v_errormsg);
v_deel_omschrijving := SUBSTR(v_deel_omschrijving, 1, 30);
END IF;
v_deel_reserveerbaar := TRIM (v_deel_reserveerbaar);
v_errormsg := 'Controleer reserveerbaar ' || v_deel_reserveerbaar;
IF NOT (UPPER(v_deel_reserveerbaar) = 'J' OR UPPER(v_deel_reserveerbaar) = 'N' OR v_deel_reserveerbaar IS NULL)
THEN
fac.imp_writelog (p_import_key, 'W', 'Reserveerbaar is ongeldig: ' || v_aanduiding, v_errormsg);
END IF;
IF v_ongeldig = 0
THEN
INSERT INTO flex_imp_wp (klantcode,
alg_locatie_code,
alg_locatie_omschrijving,
alg_gebouw_code,
alg_gebouw_omschrijving,
alg_verdieping_volgnr,
alg_ruimte_nr,
alg_ruimte_omschrijving,
alg_kenmerkwaarde1,
alg_kenmerkwaarde2,
alg_kenmerkwaarde3,
alg_kenmerkwaarde4,
alg_kenmerkwaarde5,
ins_deel_omschrijving,
ins_deel_reserveerbaar)
VALUES (v_klantcode,
v_locatie_code,
v_locatie_omschrijving,
v_gebouw_code,
v_gebouw_omschrijving,
v_verdieping_volgnr,
v_ruimte_nr,
v_ruimte_omschrijving,
v_kenmerkwaarde1,
v_kenmerkwaarde2,
v_kenmerkwaarde3,
v_kenmerkwaarde4,
v_kenmerkwaarde5,
v_deel_omschrijving,
v_deel_reserveerbaar);
v_count := v_count + 1;
END IF;
END;
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!');
END IF;
fac.imp_writelog (p_import_key,
'S',
'Aantal ingelezen regels: ' || TO_CHAR (v_count),
'');
EXCEPTION
WHEN OTHERS
THEN
v_errorhint := v_errormsg;
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_errormsg || ' - ' || v_aanduiding,
v_errorhint);
END flex_import_wp;
/
CREATE OR REPLACE PROCEDURE flex_update_wp (
p_import_key IN NUMBER)
AS
v_errormsg VARCHAR (200);
v_errorhint VARCHAR (200);
oracle_err_num NUMBER;
oracle_err_mes VARCHAR2 (150);
currentversion fac_module.fac_module_version%TYPE;
v_aanduiding VARCHAR (100);
BEGIN
v_errorhint := 'Vullen van de locatie en gebouwgegevens';
DELETE fac_imp_onrgoed1;
INSERT INTO fac_imp_onrgoed1 (alg_regio_omschrijving,
alg_district_omschrijving,
alg_locatie_code,
alg_locatie_omschrijving,
alg_gebouw_code,
alg_gebouw_naam,
alg_srtgebouw_omschrijving)
SELECT klantcode,
klantcode,
alg_locatie_code,
alg_locatie_omschrijving,
alg_gebouw_code,
alg_gebouw_omschrijving,
'Algemeen'
FROM flex_imp_wp
GROUP BY klantcode,
alg_locatie_code,
alg_locatie_omschrijving,
alg_gebouw_code,
alg_gebouw_omschrijving;
fac_update_onrgoed1(p_import_key);
v_errorhint := 'Vullen van de verdieping en ruimtegegevens';
DELETE fac_imp_onrgoed2;
INSERT INTO fac_imp_onrgoed2 (alg_locatie_code,
alg_gebouw_code,
alg_verdieping_volgnr,
alg_ruimte_nr,
alg_ruimte_omschrijving,
alg_srtruimte_omschrijving
)
SELECT alg_locatie_code,
alg_gebouw_code,
alg_verdieping_volgnr,
alg_ruimte_nr,
alg_ruimte_omschrijving,
'Algemeen'
FROM flex_imp_wp
GROUP BY alg_locatie_code,
alg_gebouw_code,
alg_verdieping_volgnr,
alg_ruimte_nr,
alg_ruimte_omschrijving;
fac_update_onrgoed2(p_import_key);
v_errorhint := 'Vullen van de werkplekgegevens';
DELETE fac_imp_ins;
INSERT INTO fac_imp_ins (ins_discipline_omschrijving,
ins_srtgroep_omschrijving,
ins_srtdeel_code,
ins_srtdeel_omschrijving,
ins_deel_omschrijving,
reserveerbaar,
alg_locatie_code,
alg_gebouw_code,
alg_verdieping_volgnr,
alg_ruimte_nr,
ins_deel_aantal,
res_deel_alg_level,
res_discipline_omschrijving)
SELECT 'Interieur',
'Werkplekken',
'WP',
'Werkplek',
ins_deel_omschrijving,
DECODE(UPPER(ins_deel_reserveerbaar), 'J', 1, 0),
alg_locatie_code,
alg_gebouw_code,
alg_verdieping_volgnr,
alg_ruimte_nr,
1,
2, -- Locatie
klantcode || '-' || 'Werkplekken'
FROM flex_imp_wp;
fac_update_ins (p_import_key);
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_errormsg || v_aanduiding,
v_errorhint);
END flex_update_wp;
/
-- Om overzicht op mobiel met mijn gereserveerde werkplekken te laten zien.
CREATE OR REPLACE VIEW flex_v_rap_mijn_wp_reservering
AS
SELECT rrr.res_rsv_ruimte_host_key,
rrr.res_rsv_ruimte_van,
rrr.res_rsv_ruimte_tot,
rg.alg_locatie_omschrijving,
rg.alg_gebouw_omschrijving,
rg.alg_verdieping_omschrijving,
rg.alg_ruimte_nr,
rd.res_deel_omschrijving,
rg.alg_ruimte_aanduiding,
rrr.res_rsv_ruimte_key
FROM res_rsv_ruimte rrr,
res_rsv_deel rrd,
res_deel rd,
alg_v_ruimte_gegevens rg
WHERE rrr.res_rsv_ruimte_key = rrd.res_rsv_ruimte_key
AND rrd.res_deel_key = rd.res_deel_key
AND rrr.alg_ruimte_key = rg.alg_ruimte_key
AND rrr.res_rsv_ruimte_verwijder IS NULL
AND rrd.res_rsv_deel_verwijder IS NULL
AND rrr.res_rsv_ruimte_van > SYSDATE;
CREATE OR REPLACE VIEW flex_v_thema_deel_res_d_1230
(
fclt_f_datum,
ins_deel_key,
min_van,
max_tot,
waarde1,
waarde,
waarde3
)
AS
WITH
datums
AS
( SELECT TRUNC (SYSDATE) + LEVEL - 1 datum
FROM DUAL
CONNECT BY LEVEL <= 31)
SELECT datum
fclt_f_datum,
ins_deel_key,
MIN (res_rsv_deel_van)
min_van,
MAX (res_rsv_deel_tot)
max_tot,
CASE WHEN MAX (res_rsv_deel_tot) IS NULL THEN 0 ELSE 3 -- hele dag
END
waarde1,
CASE
WHEN MAX (res_rsv_deel_tot) IS NULL THEN 0
WHEN TO_CHAR (MAX (res_rsv_deel_tot), 'HH24MI') <= '1230' THEN 1 -- ochtend
WHEN TO_CHAR (MIN (res_rsv_deel_van), 'HH24MI') >= '1230' THEN 2 -- middag
ELSE 3 -- hele dag
END
waarde,
COUNT (res_rsv_deel_tot) -- aantal reservering deze dag
waarde3
FROM (SELECT datums.datum,
res_ins_deel_key ins_deel_key,
res_rsv_deel_van,
res_rsv_deel_tot
FROM res_v_aanwezigdeel r,
ins_deel d,
datums,
(SELECT datum,
res_deel_key,
res_rsv_deel_van,
res_rsv_deel_tot
FROM datums, res_v_aanwezigrsv_deel rrd
WHERE res_rsv_deel_van > TRUNC(SYSDATE) - 1 -- negeer alle irrelevante historie sowieso
AND datum >= TRUNC (res_rsv_deel_van)
AND datum < TRUNC (res_rsv_deel_tot) + 1) blokkerend -- vandaag en nog niet afgelopen
WHERE r.res_deel_key = blokkerend.res_deel_key(+)
AND datums.datum = blokkerend.datum(+)
AND (r.res_deel_vervaldatum IS NULL or r.res_deel_vervaldatum > datums.datum)
AND d.ins_deel_key = r.res_ins_deel_key)
GROUP BY datum, ins_deel_key
ORDER BY datum, ins_deel_key;
------ 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