SGGR#81078 Sensoren: geldigheid, tolerantie

svn path=/Database/trunk/; revision=70070
This commit is contained in:
Peter Feij
2025-08-21 10:42:12 +00:00
parent b0db6fab52
commit a6dcc98cdf
4 changed files with 263 additions and 209 deletions

View File

@@ -312,6 +312,10 @@ CREATE_TABLE(ins_srtdeel,0)
NOT NULL,
ins_srtdeel_statethreshold /* drempelwaarde waarboven een melding type mld_stdmelding_key aangemaakt moet worden */
VARCHAR2(128),
ins_srtdeel_statestepsize /* ondergrens (marge) voor verschil tussen meetwaarden om als verschil te erkennen, bv 0,5 */
NUMBER(6,3),
ins_srtdeel_stateanchor /* anker voor zgn kwantisatiegrid, bv 10. Werkt in combi met stepsize Q(x) = round((x - q_anchor)/q_step) * q_step + q_anchor */
NUMBER(6,3),
/* in mld_tab.src:
mld_stdmelding_key
NUMBER(10)
@@ -464,6 +468,8 @@ CREATE_TABLE(ins_deel_state_history, 0)
CONSTRAINT ins_r_ins_deel_key2 REFERENCES ins_deel(ins_deel_key),
ins_deel_state
VARCHAR2(128),
ins_deel_state_value
NUMBER(16,6),
ins_deel_statedate
DATE,
ins_deel_state_history_opmerk /* je weet het niet he */

View File

@@ -354,240 +354,282 @@ BEGIN
END;
/
CREATE OR REPLACE TRIGGER ins_t_ins_deel_A_U
AFTER UPDATE ON ins_deel
FOR EACH ROW
CREATE OR REPLACE TRIGGER ins_t_ins_deel_a_u
AFTER UPDATE
ON ins_deel
FOR EACH ROW
DECLARE
lmelder_oslogin CONSTANT VARCHAR2 (10) := '_SYSTEEM';
new_date DATE;
prev_state ins_deel_state_history.ins_deel_state%TYPE;
prev_historystate ins_deel_state_history.ins_deel_state%TYPE;
lsensortype ins_srtdeel.ins_srtdeel_sensortype%TYPE;
lstate_history_key ins_deel_state_history.ins_deel_state_history_key%TYPE;
ins_srtdeel_statethreshold ins_srtdeel.ins_srtdeel_statethreshold%TYPE;
anchorednewstateval NUMBER;
ldubbelcheck_key mld_melding.mld_melding_key%TYPE;
lstdmelding_key ins_srtdeel.mld_stdmelding_key%TYPE;
ldiscipline_key mld_stdmelding.mld_ins_discipline_key%TYPE;
lstatethreshold ins_srtdeel.ins_srtdeel_statethreshold%TYPE;
lstatestepsize ins_srtdeel.ins_srtdeel_statestepsize%TYPE;
lstateanchor ins_srtdeel.ins_srtdeel_stateanchor%TYPE;
lmelding_key mld_melding.mld_melding_key%TYPE;
lmelder_key mld_melding.prs_perslid_key%TYPE;
BEGIN
-- archiving chances in state_history
IF (:old.ins_deel_state IS NULL AND :new.ins_deel_state IS NOT NULL)
OR (:new.ins_deel_state <> :old.ins_deel_state)
THEN
BEGIN
new_date := COALESCE (:new.ins_deel_statedate, SYSDATE); -- voorkom dat de update *net* een seconde later kan zijn
BEGIN
-- archiving changes in state_history, satisfying parameters
-- note that archiving is more limited than recording any change
IF (:old.ins_deel_state IS NULL AND :new.ins_deel_state IS NOT NULL) OR (:new.ins_deel_state <> :old.ins_deel_state)
THEN
BEGIN
-- mutatie van state impliceert al dat het een sensortype is
-- toch checken we dat en halen ook de benodigde eigenschappen op
INSERT INTO ins_deel_state_history (ins_deel_key, ins_deel_state, ins_deel_statedate)
VALUES (:new.ins_deel_key,
:new.ins_deel_state,
COALESCE (:new.ins_deel_statedate, new_date))
RETURNING ins_deel_state_history_key
INTO lstate_history_key;
EXCEPTION
WHEN DUP_VAL_ON_INDEX
THEN
BEGIN
SELECT ins_deel_state
INTO prev_state
FROM ins_deel_state_history
WHERE ins_deel_state_history_key =
(SELECT MAX (ins_deel_state_history_key)
FROM ins_deel_state_history
WHERE ins_deel_key = :new.ins_deel_key
AND ins_deel_statedate < new_date);
EXCEPTION
WHEN NO_DATA_FOUND
THEN
NULL;
END;
SELECT ins_srtdeel_statethreshold
, mld_stdmelding_key
, ins_srtdeel_statestepsize
, ins_srtdeel_stateanchor
, ins_srtdeel_sensortype
INTO lstatethreshold
, lstdmelding_key
, lstatestepsize
, lstateanchor
, lsensortype
FROM ins_srtdeel
WHERE ins_srtdeel_key = :new.ins_srtdeel_key AND ins_srtdeel_sensortype > 0; -- een sensor; dwingt configuratie af.
IF (prev_state = :new.ins_deel_state)
-- voorkom dat de update *net* een seconde later kan zijn, een atomair tijdstip voor deze activiteit hier
new_date := COALESCE (:new.ins_deel_statedate, SYSDATE);
-- Voor continuwaarden gaan we de waarden 'snappen' op een 'grid' van meetwaarden
-- initieel/default de ongesnapte meetwaarde; voor tekstwaarden wordt dit NULL
anchorednewstateval := fac.safe_to_number (:new.ins_deel_state);
-- we bewaren alleen de history als de afwijking met de vorige waarde er is (discreet)
-- of groot genoeg is (continu) als dat geconfigureerd is. Merk op dat we hier de gesnapte
-- (dus eventueel afgeronde) waarden vergelijken
IF BITAND (lsensortype, 1) = 1 OR (lstatestepsize IS NOT NULL AND lstateanchor IS NOT NULL)
THEN
DELETE ins_deel_state_history
WHERE ins_deel_key = :new.ins_deel_key AND ins_deel_statedate = new_date;
ELSE -- kan alleen bij tri-stste statussen gebeuren
UPDATE ins_deel_state_history
SET ins_deel_state = :new.ins_deel_state
WHERE ins_deel_key = :new.ins_deel_key AND ins_deel_statedate = new_date;
END IF;
END;
END IF;
-- potentially trigger dependent actions
IF (:old.ins_deel_state IS NULL AND :new.ins_deel_state IS NOT NULL)
OR (:new.ins_deel_state <> :old.ins_deel_state)
THEN
BEGIN
SELECT ins_srtdeel_statethreshold, mld_stdmelding_key
INTO lstatethreshold, lstdmelding_key
FROM ins_srtdeel
WHERE ins_srtdeel_key = :new.ins_srtdeel_key;
IF lstatethreshold IS NOT NULL
AND lstdmelding_key IS NOT NULL
AND ins.state_compare (:new.ins_deel_state, lstatethreshold) > 0
AND ins.state_compare (:old.ins_deel_state, lstatethreshold) <= 0
THEN
-- Eerst controleren of er niet al een "heel recente" melding bestaat
-- waarmee deze zou kunnen gaan overlappen. We hebben geen behoefte aan veel meer
-- meldingen over hetzelfde, wellicht zou het iets over de urgentie zeggen..
--
BEGIN
SELECT prs_perslid_key
INTO lmelder_key
FROM prs_perslid
WHERE prs_perslid_oslogin = lmelder_oslogin AND prs_perslid_verwijder IS NULL;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
fac.putsystemnotification ('Invalid configuration: missing _SYSTEEM user',
1);
END;
IF lmelder_key IS NOT NULL
THEN
-- Ik denk dat het voorlopig voldoende is om te checken dat *wij* hier niet al eerder
-- een automatische melding hebben gegenereerd. Handmatige parallelle meldingen
-- beschouwen we niet. We willen primair voorkomen dat er in een paar minuten tientallen
-- meldingen ontstaan omdat de waarde rond de limiet flippert. Een daalmarge zou
-- een ander mechanisme hiertegen kunnen zijn, maar dit is intrinsieker.
-- Ik zoek de goedkoopst mogelijk check, ik weet hier al zeker dat we (weer)
-- de limiet overschrijden. We nemen de tijd niet in beschouwing, omdat voor de ene
-- toepassing 1 minuut recent is, en voor een andere misschien een maand.
BEGIN
SELECT m.mld_melding_key
INTO ldubbelcheck_key
FROM mld_melding m, mld_melding_object mo
WHERE m.mld_melding_key = mo.mld_melding_key
AND mo.ins_deel_key = :new.ins_deel_key
AND m.mld_stdmelding_key = lstdmelding_key
AND m.prs_perslid_key = lmelder_key
AND m.mld_melding_status IN (2,
0,
4,
7); -- lopend
SELECT ins_deel_state
INTO prev_historystate
FROM ins_deel_state_history
WHERE ins_deel_key = :new.ins_deel_key
ORDER BY ins_deel_statedate DESC, ins_deel_state_history_key DESC
FETCH FIRST 1 ROW ONLY;
IF ldubbelcheck_key IS NOT NULL -- puur voor de leesbaarheid, als er geen is gaan we nl in de exception verder
IF BITAND (lsensortype, 2) = 2
THEN
-- track this. This seems like an appropriate place.
UPDATE ins_deel_state_history
SET ins_deel_state_history_opmerk =
REPLACE (
REPLACE (lcl.l ('lcl_ins_sensorstate_already_mld'),
'{0}',
lmelding_key),
'{1}',
lstatethreshold)
WHERE ins_deel_state_history_key = lstate_history_key;
-- continuwaarden snappen op grid
anchorednewstateval :=
ROUND ((anchorednewstateval - TO_NUMBER (lstateanchor)) / TO_NUMBER (lstatestepsize)) * TO_NUMBER (lstatestepsize) + TO_NUMBER (lstateanchor);
END IF;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
BEGIN
-- dit zou de trigger van mld_melding wel mogen doen..
SELECT msm.mld_ins_discipline_key
INTO ldiscipline_key
FROM mld_stdmelding msm
WHERE msm.mld_stdmelding_key = lstdmelding_key;
INSERT INTO mld_melding (mld_melding_module,
mld_meldbron_key,
mld_alg_locatie_key,
mld_alg_onroerendgoed_keys,
mld_melding_datum,
mld_melding_onderwerp,
mld_melding_omschrijving,
mld_stdmelding_key,
mld_melding_status,
mld_kosten_klant,
prs_perslid_key,
mld_melding_spoed,
mld_ins_discipline_key)
VALUES (
'MLD',
11, -- sensor
:new.ins_alg_locatie_key,
:new.ins_alg_ruimte_key,
SYSDATE,
lcl.l ('lcl_mld_state_generated_onderwerp'),
REPLACE (
REPLACE (
lcl.l (
'lcl_mld_state_generated_omschrijving'),
'{0}',
:new.ins_deel_state),
'{1}',
lstatethreshold),
lstdmelding_key,
2, -- of afh mld_directklaar
NULL,
lmelder_key, --TODO!!!!!!! prs_perslid_key,
3,
ldiscipline_key)
RETURNING mld_melding_key
INTO lmelding_key;
--en het sensorobject erbij registreren
INSERT INTO mld_melding_object (ins_deel_key, mld_melding_key)
VALUES (:new.ins_deel_key, lmelding_key);
-- track this. This seems like an appropriate place.
UPDATE ins_deel_state_history
SET ins_deel_state_history_opmerk =
REPLACE (
REPLACE (lcl.l ('lcl_ins_sensorstate_caused_mld'),
'{0}',
lmelding_key),
'{1}',
lstatethreshold)
WHERE ins_deel_state_history_key = lstate_history_key;
-- If defined kick off the workflow
mld.mld_nextworkflowstep (lmelding_key, -1);
END;
DBMS_OUTPUT.put_line ('No history for deel_state, firstvalue=' || anchorednewstateval);
prev_historystate := NULL;
END;
END IF;
END IF;
END;
END IF;
DBMS_OUTPUT.put_line ('prev_historystate=' || prev_historystate);
DBMS_OUTPUT.put_line ('new.ins_deel_state=' || :new.ins_deel_state);
DBMS_OUTPUT.put_line ('ins.state_diff (prev_historystate, :new.ins_deel_state)=' || ins.state_diff (prev_historystate, :new.ins_deel_state));
-- we gaan er gewoon van uit dat de oude waarde al gealigned is op het grid.
-- round((x - q_anchor)/q_step) * q_step + q_anchor
DBMS_OUTPUT.put_line ('anchorednewstateval=' || anchorednewstateval);
-- Waarde opslaan: sowieso voor discrete waarden en
-- voor continuwaarden indien de afgeronde afwijking groot genoeg id
--
-- Note: we introduce the numeric value in ins_deel_state_value, this is for future use
-- since at this moment all existing code etc does not use it yet and altering that is out off scope
--
IF BITAND (lsensortype, 2) <> 2 OR prev_historystate IS NULL OR ABS (ins.state_diff (prev_historystate, :new.ins_deel_state)) >= lstatestepsize
THEN
BEGIN
INSERT INTO ins_deel_state_history (ins_deel_key
, ins_deel_state
, ins_deel_statedate
, ins_deel_state_value)
VALUES (:new.ins_deel_key
, COALESCE (TO_CHAR (anchorednewstateval), :new.ins_deel_state)
, COALESCE (:new.ins_deel_statedate, new_date)
, anchorednewstateval)
RETURNING ins_deel_state_history_key
INTO lstate_history_key;
EXCEPTION
WHEN DUP_VAL_ON_INDEX
THEN
-- Er blijkt op/voor/met precies dit tijdstip al een meetwaarde geregistreerd van deze sensor
-- Dan kiezen we maar voor: laatste update -dus deze- geldt, alsof het een correctie is.
IF (prev_historystate <> :new.ins_deel_state)
THEN
UPDATE ins_deel_state_history
SET ins_deel_state = COALESCE (TO_CHAR (anchorednewstateval), :new.ins_deel_state), ins_deel_state_value = anchorednewstateval
WHERE ins_deel_key = :new.ins_deel_key AND ins_deel_statedate = new_date;
END IF;
-- lstate_history_key blijft hier NULL, dus een dubbele kan nooit een melding triggeren
-- wie hier ooit uitkomt bij een probleem: gefeliciteerd
END;
END IF;
END;
END IF;
-- potentially trigger dependent actions; this is not dependant
-- to the snapping of the values, which are for archiving only.
IF (:old.ins_deel_state IS NULL AND :new.ins_deel_state IS NOT NULL) OR (:new.ins_deel_state <> :old.ins_deel_state)
THEN
BEGIN
IF lstatethreshold IS NOT NULL
AND lstdmelding_key IS NOT NULL
AND ins.state_compare (:new.ins_deel_state, lstatethreshold) > 0
AND ins.state_compare (:old.ins_deel_state, lstatethreshold) <= 0
THEN
-- Eerst controleren of er niet al een "heel recente" melding bestaat
-- waarmee deze zou kunnen gaan overlappen. We hebben geen behoefte aan veel meer
-- meldingen over hetzelfde, wellicht zou het iets over de urgentie zeggen..
--
BEGIN
SELECT prs_perslid_key
INTO lmelder_key
FROM prs_perslid
WHERE prs_perslid_oslogin = lmelder_oslogin AND prs_perslid_verwijder IS NULL;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
fac.putsystemnotification ('Invalid configuration: missing _SYSTEEM user', 1);
END;
IF lmelder_key IS NOT NULL
THEN
-- Ik denk dat het voorlopig voldoende is om te checken dat *wij* hier niet al eerder
-- een automatische melding hebben gegenereerd. Handmatige parallelle meldingen
-- beschouwen we niet. We willen primair voorkomen dat er in een paar minuten tientallen
-- meldingen ontstaan omdat de waarde rond de limiet flippert. Een daalmarge zou
-- een ander mechanisme hiertegen kunnen zijn, maar dit is intrinsieker.
-- Ik zoek de goedkoopst mogelijk check, ik weet hier al zeker dat we (weer)
-- de limiet overschrijden. We nemen de tijd niet in beschouwing, omdat voor de ene
-- toepassing 1 minuut recent is, en voor een andere misschien een maand.
BEGIN
SELECT m.mld_melding_key
INTO ldubbelcheck_key
FROM mld_melding m, mld_melding_object mo
WHERE m.mld_melding_key = mo.mld_melding_key
AND mo.ins_deel_key = :new.ins_deel_key
AND m.mld_stdmelding_key = lstdmelding_key
AND m.prs_perslid_key = lmelder_key
AND m.mld_melding_status IN (2
, 0
, 4
, 7); -- lopend
IF ldubbelcheck_key IS NOT NULL -- puur voor de leesbaarheid, als er geen is gaan we nl in de exception verder
THEN
-- track this. This seems like an appropriate place.
UPDATE ins_deel_state_history
SET ins_deel_state_history_opmerk = REPLACE (REPLACE (lcl.l ('lcl_ins_sensorstate_already_mld'), '{0}', lmelding_key), '{1}', lstatethreshold)
WHERE ins_deel_state_history_key = lstate_history_key;
END IF;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
BEGIN
-- dit zou de trigger van mld_melding wel mogen doen..
SELECT msm.mld_ins_discipline_key
INTO ldiscipline_key
FROM mld_stdmelding msm
WHERE msm.mld_stdmelding_key = lstdmelding_key;
INSERT INTO mld_melding (mld_melding_module
, mld_meldbron_key
, mld_alg_locatie_key
, mld_alg_onroerendgoed_keys
, mld_melding_datum
, mld_melding_onderwerp
, mld_melding_omschrijving
, mld_stdmelding_key
, mld_melding_status
, mld_kosten_klant
, prs_perslid_key
, mld_melding_spoed
, mld_ins_discipline_key)
VALUES ('MLD'
, 11
, -- sensor
:new.ins_alg_locatie_key
, :new.ins_alg_ruimte_key
, SYSDATE
, lcl.l ('lcl_mld_state_generated_onderwerp')
, REPLACE (REPLACE (lcl.l ('lcl_mld_state_generated_omschrijving'), '{0}', :new.ins_deel_state), '{1}', lstatethreshold)
, lstdmelding_key
, 2
, -- of afh mld_directklaar
NULL
, lmelder_key
, --TODO!!!!!!! prs_perslid_key,
3
, ldiscipline_key)
RETURNING mld_melding_key
INTO lmelding_key;
--en het sensorobject erbij registreren
INSERT INTO mld_melding_object (ins_deel_key, mld_melding_key)
VALUES (:new.ins_deel_key, lmelding_key);
-- track this. This seems like an appropriate place.
UPDATE ins_deel_state_history
SET ins_deel_state_history_opmerk =
REPLACE (REPLACE (lcl.l ('lcl_ins_sensorstate_caused_mld'), '{0}', lmelding_key), '{1}', lstatethreshold)
WHERE ins_deel_state_history_key = lstate_history_key;
-- If defined kick off the workflow
mld.mld_nextworkflowstep (lmelding_key, -1);
END;
END;
END IF;
END IF;
END;
END IF;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
DBMS_OUTPUT.put_line ('Statevalues set for non-sensor: ignored');
NULL;
END;
-- Uitlenen object: Uitgifte object toevoegen aan de uitgifte tabel.
IF (:old.ins_alg_ruimte_key_org IS NULL AND :new.ins_alg_ruimte_key_org IS NOT NULL)
AND (:old.ins_alg_ruimte_type_org IS NULL AND :new.ins_alg_ruimte_type_org IS NOT NULL)
AND (:new.ins_alg_ruimte_type = 'C' OR :new.ins_alg_ruimte_type = 'P')
IF (:old.ins_alg_ruimte_key_org IS NULL AND :new.ins_alg_ruimte_key_org IS NOT NULL)
AND (:old.ins_alg_ruimte_type_org IS NULL AND :new.ins_alg_ruimte_type_org IS NOT NULL)
AND (:new.ins_alg_ruimte_type = 'C' OR :new.ins_alg_ruimte_type = 'P')
THEN
BEGIN
INSERT INTO ins_deel_uitgifte (ins_deel_key
, ins_deel_uitgifte_begin
, ins_deel_uitgifte_eind_plan
, prs_perslid_key
, prs_contactpersoon_key)
VALUES (:new.ins_deel_key
, SYSDATE
, CASE
WHEN :new.res_rsv_deel_key IS NOT NULL
THEN (SELECT rrd.res_rsv_deel_tot
FROM res_rsv_deel rrd
WHERE res_rsv_deel_key = :new.res_rsv_deel_key)
ELSE NULL
END
, CASE
WHEN :new.ins_alg_ruimte_type = 'P'
THEN :new.ins_alg_ruimte_key
ELSE NULL
END
, CASE
WHEN :new.ins_alg_ruimte_type = 'C'
THEN :new.ins_alg_ruimte_key
ELSE NULL
END);
, ins_deel_uitgifte_begin
, ins_deel_uitgifte_eind_plan
, prs_perslid_key
, prs_contactpersoon_key)
VALUES (:new.ins_deel_key
, SYSDATE
, CASE
WHEN :new.res_rsv_deel_key IS NOT NULL
THEN
(SELECT rrd.res_rsv_deel_tot
FROM res_rsv_deel rrd
WHERE res_rsv_deel_key = :new.res_rsv_deel_key)
ELSE
NULL
END
, CASE WHEN :new.ins_alg_ruimte_type = 'P' THEN :new.ins_alg_ruimte_key ELSE NULL END
, CASE WHEN :new.ins_alg_ruimte_type = 'C' THEN :new.ins_alg_ruimte_key ELSE NULL END);
END;
END IF;
-- Innemen object: Inname object aanpassen in de uitgifte tabel.
IF (:old.ins_alg_ruimte_key_org IS NOT NULL AND :new.ins_alg_ruimte_key_org IS NULL)
AND (:old.ins_alg_ruimte_type_org IS NOT NULL AND :new.ins_alg_ruimte_type_org IS NULL)
AND (:old.ins_alg_ruimte_type = 'C' OR :old.ins_alg_ruimte_type = 'P')
IF (:old.ins_alg_ruimte_key_org IS NOT NULL AND :new.ins_alg_ruimte_key_org IS NULL)
AND (:old.ins_alg_ruimte_type_org IS NOT NULL AND :new.ins_alg_ruimte_type_org IS NULL)
AND (:old.ins_alg_ruimte_type = 'C' OR :old.ins_alg_ruimte_type = 'P')
THEN
BEGIN
UPDATE ins_deel_uitgifte

View File

@@ -2708,7 +2708,7 @@ AS
og.alg_terreinsector_code terreinsectorcode,
og.alg_terreinsector_naam terreinsector,
h.ins_deel_state status,
fac.safe_to_number (REPLACE (h.ins_deel_state, ',', '.')) status_numeriek,
h.ins_deel_state_value status_numeriek,
h.ins_deel_state_history_opmerk opmerking,
og.alg_locatie_key fclt_3d_locatie_key,
d.ins_discipline_key fclt_3d_discipline_key
@@ -2776,26 +2776,26 @@ ORDER BY du.ins_deel_key,
du.ins_deel_uitgifte_begin;
/*
-- room_occupancy_buckets:
-- ins_v_room_occupancy_buckets:
-- Verzamelt 30-min buckets van de afgelopen 90 dagen per ruimte en bezettingssensor.
-- Filtert op werkdagen (ma<6D>vr) en sluit feestdagen uit.
-- Output-kolommen:
-- alg_ruimte_key, bucket_start, sensor_id, state ('true'/'false').
--
-- room_occupancy_stats:
-- ins_v_room_occupancy_stats:
-- Agregeert per ruimte en bucket het aantal bezette werkplekken (occupied_desks)
-- en het totaal aantal werkpleksensoren (total_desks).
-- Output-kolommen:
-- room_key, bucket_start, occupied_desks, total_desks.
--
-- room_occupancy_kpis:
-- ins_v_room_occupancy_kpis:
-- Berekent per ruimte drie KPI's:
-- total_person_hours (som occupied_desks <20> 0.5u)
-- avg_utilization_pct (gem. benutting % op 1 decimaal)
-- peak_occupied_desks (max gelijktijdige bezetting in <20><>n bucket)
*/
CREATE_VIEW(room_occupancy_buckets, 0)
CREATE_VIEW(ins_v_room_occupancy_buckets, 0)
AS
WITH
intervals
@@ -2841,7 +2841,7 @@ AS
, state
FROM bucket_values;
CREATE_VIEW(room_occupancy_stats, 0)
CREATE_VIEW(ins_v_room_occupancy_stats, 0)
AS
SELECT rob.alg_ruimte_key
AS alg_ruimte_key
@@ -2877,10 +2877,10 @@ AS
0
END)
AS total_desks
FROM room_occupancy_buckets rob
FROM ins_v_room_occupancy_buckets rob
GROUP BY rob.alg_ruimte_key, rob.bucket_start;
CREATE_VIEW(room_occupancy_kpis, 0)
CREATE_VIEW(ins_v_room_occupancy_kpis, 0)
AS
SELECT alg_ruimte_key
, -- 1) Totaal persoon-uren over de afgelopen 90 dagen tijdens kantoortijden
@@ -2889,7 +2889,7 @@ AS
ROUND (AVG (occupied_desks / NULLIF (total_desks, 0)) * 100, 1) AS avg_utilization_pct
, -- 3) Piek aantal gelijktijdig bezette werkplekken in <20><>n bucket
MAX (occupied_desks) AS peak_occupied_desks
FROM room_occupancy_stats
FROM ins_v_room_occupancy_stats
GROUP BY alg_ruimte_key;

View File

@@ -71,6 +71,12 @@ UPDATE mld_melding
WHERE mld_melding_status = 5
AND BITAND(mld_melding_actiecode, 128) = 128;
/////////////////////////////////////////////////////////////////////////////////////////// SGGR#81078
ALTER TABLE ins_srtdeel ADD ins_srtdeel_statestepsize NUMBER (6, 3);
ALTER TABLE ins_srtdeel ADD ins_srtdeel_stateanchor NUMBER (6, 3);
ALTER TABLE ins_deel_state_history ADD ins_deel_state_value NUMBER(16,6);
/////////////////////////////////////////////////////////////////////////////////////////// FCLT#00000