471 lines
16 KiB
Plaintext
471 lines
16 KiB
Plaintext
#ifdef PRS
|
|
|
|
/* PRS_PAC.SRC
|
|
*
|
|
* Revisie:
|
|
*
|
|
* 21-10-2003 BIV Package Aut toegevoegd i.v.m. 3D autorisatiemodel
|
|
* 11-05-1999 PF Obsolete views verwijderd, omdat PRS211 en PRS212 nu gewoon FAC311 vullen,
|
|
* en er geen akelige views tbv PRS311/PRS312 meer nodig zijn.
|
|
* prs_v_werkplek_gegevens naar vie2 verplaats.
|
|
* 27-04-1999 EGR Aan view prs_v_werkplek_gegevens de PRS_NORMAAL_PRIVILEGE toegekend.
|
|
* 08-02-1999 EGR In prs_v_werkplek_gegevens kolom prs_werkplek_aanduiding toegevoegd.
|
|
* 17-12-1998 EGR Functie prs_f_prs_wpbezetting toegevoegd om delen door nul te voorkomen.
|
|
* 08-10-1998 PF Functies prs_f prs_* toegevoegd voor de
|
|
* rapporten prs311 en prs312
|
|
* --- 01.40 ---
|
|
* --- 01.39 ---
|
|
* --- 01.38 ---
|
|
* --- 01.37 ---
|
|
* --- 01.36 ---
|
|
* --- 01.35 ---
|
|
* --- 01.34 ---
|
|
* --- 01.33 ---
|
|
* --- 01.32 ---
|
|
* --- 01.31 ---
|
|
* --- 01.30 ---
|
|
* 14-07-97 AH Extra argument ArgEditMode toegevoegd.
|
|
* 10-07-97 AH Aangemaakt
|
|
*/
|
|
|
|
/* Bepaal de oppervlakte van een werkplek
|
|
* Argumenten:
|
|
* - ArgWerkplekKey : De PRS_WERKPLEK_KEY. Als deze NULL is dan wordt de
|
|
* variabele oppervlakte berekend.
|
|
* - ArgRuimteKey : De PRS_ALG_RUIMTE_KEY, als deze bekand is.
|
|
* Als deze -1 is, dan wordt de ruimte opgezocht in PRS_WERKPLEK.
|
|
* LET OP: ArgWerkplekKey OF ArgRuimteKey moet gegeven zijn.
|
|
* - ArgRuimteBrutoVloerOpp : De ALG_RUIMTE_BRUTO_VLOEROPP, als deze bekend is,
|
|
* Als deze -1 is, dan wordt de bruto vloeropp. opgezocht in ALG_RUIMTE.
|
|
* - ArgWerkplekVastOpp : De PRS_WERKPLEK_VASTOPP die aangeeft of de werkpplek een
|
|
* vaste oppervlakte heeft. Als deze -1 is dan wordt deze opgezocht in PRS_WERKPLEK
|
|
* - ArgWerkplekOpp: De PRS_WERKPLEK_OPP, Als deze -1 is, dan wordt deze opgezocht
|
|
* in PRS_WERKPLEK.
|
|
* - ArgEditMode: Als in een mutatiestand (PRS114) een oppervlakte bepaald moet worden.
|
|
* De waardes zijn NULL, 'ADD' of 'CHANGE'.
|
|
* De volgende zaken moeten dan meegegeven worden:
|
|
* Bij 'ADD': ArgWerkplekKey = NULL, ArgRuimteKey, ArgWerkplekVastOpp, ArgEditType = 'ADD'
|
|
* Als (WerkplekVastOpp = NULL) dan wordt het aantal variabele werkplekken
|
|
* met 1 verhoogd. Dus de oppervlakte van deze variabele werkplek houdt rekening
|
|
* met deze nieuw toe te voegen werkplek.
|
|
* Als (WerkplekVastOpp <> NULL) dan wordt NULL geretourneerd, immers, de vast oppervlakte
|
|
* van de nieuwe werkplek is leeg.
|
|
* Bij 'CHANGE': ArgWerkplekKey = de te wijzigen werkplek, ArgRuimteKey, ArgWerkplekVastOpp,
|
|
* ArgEditType = 'CHANGE'.
|
|
* Als (WerkplekVastOpp = NULL) dan wordt het aantal variabele werkplekken met 1
|
|
* verhoogd en de vaste oppervlakte van de te wijzigen werkplek wordt niet meegenomen
|
|
* in de WerkplekTotVastOpp.
|
|
* Als (WerkplekVastOpp <> NULL) dan wordt de vaste oppervlakte van de te wijzigen
|
|
* werkplek geretourneerd, als deze ingevuld was, anders NULL.
|
|
*/
|
|
CREATE OR REPLACE FUNCTION _MSSQL(web.)PRS_P_PRS_BepaalWerkplekOpp( ArgWerkplekKey IN NUMBER,
|
|
ArgRuimteKey IN NUMBER,
|
|
ArgRuimteBrutoVloerOpp IN NUMBER,
|
|
ArgWerkplekVastOpp IN NUMBER,
|
|
ArgWerkplekOpp IN NUMBER,
|
|
ArgEditMode IN CHAR ) RETURN NUMBER IS
|
|
|
|
NewWerkplekOpp NUMBER(12,4);
|
|
WerkplekTotVastOpp NUMBER(12,4);
|
|
AantalVariabel NUMBER(3);
|
|
RuimteKey NUMBER(10);
|
|
RuimteBrutoVloerOpp alg_ruimte.alg_ruimte_bruto_vloeropp%TYPE;
|
|
WerkplekVastOpp prs_werkplek.prs_werkplek_vastopp%TYPE;
|
|
WerkplekOpp prs_werkplek.prs_werkplek_opp%TYPE;
|
|
ChangeWerkplekVastOpp prs_werkplek.prs_werkplek_vastopp%TYPE;
|
|
ChangeWerkplekOpp prs_werkplek.prs_werkplek_opp%TYPE;
|
|
BEGIN
|
|
/* Bij toevoegen moet alleen de bruto vloeropp van de ruimte bepaald worden */
|
|
IF (NVL(ArgEditMode, 'LEEG/NULL') = 'ADD')
|
|
THEN
|
|
BEGIN
|
|
WerkplekVastOpp := ArgWerkplekVastOpp;
|
|
WerkplekOpp := NULL;
|
|
SELECT ALG_R.alg_ruimte_key,
|
|
ALG_R.alg_ruimte_bruto_vloeropp
|
|
INTO RuimteKey,
|
|
RuimteBrutoVloerOpp
|
|
FROM alg_ruimte ALG_R
|
|
WHERE ALG_R.alg_ruimte_key = ArgRuimteKey;
|
|
EXCEPTION
|
|
WHEN NO_DATA_FOUND THEN
|
|
RETURN NULL;
|
|
END;
|
|
/* Bij wijzigen moeten de gegevens van de werkplek even bewaard worden en de bruto vloeropp van de
|
|
* ruimte moet bepaald worden.
|
|
*/
|
|
ELSIF (NVL(ArgEditMode, 'LEEG/NULL') = 'CHANGE')
|
|
THEN
|
|
WerkplekVastOpp := ArgWerkplekVastOpp;
|
|
WerkplekOpp := ArgWerkplekOpp;
|
|
BEGIN
|
|
SELECT PRS_W.prs_alg_ruimte_key,
|
|
ALG_R.alg_ruimte_bruto_vloeropp,
|
|
PRS_W.prs_werkplek_vastopp,
|
|
PRS_W.prs_werkplek_opp
|
|
INTO RuimteKey,
|
|
RuimteBrutoVloerOpp,
|
|
ChangeWerkplekVastOpp,
|
|
ChangeWerkplekOpp
|
|
FROM prs_werkplek PRS_W, alg_ruimte ALG_R
|
|
WHERE PRS_W.prs_alg_ruimte_key = ALG_R.alg_ruimte_key
|
|
AND PRS_W.prs_werkplek_key = ArgWerkplekKey;
|
|
EXCEPTION
|
|
WHEN NO_DATA_FOUND THEN
|
|
RETURN NULL;
|
|
END;
|
|
ELSIF NVL(ArgRuimteKey, -1) = -1
|
|
OR NVL(ArgRuimteBrutoVloerOpp, -1) = -1
|
|
OR ArgWerkplekVastOpp = -1
|
|
OR NVL(ArgWerkplekOpp, -1) = -1
|
|
THEN
|
|
IF NVL(ArgWerkplekKey, 0) > 0
|
|
THEN
|
|
BEGIN
|
|
SELECT PRS_W.prs_alg_ruimte_key,
|
|
ALG_R.alg_ruimte_bruto_vloeropp,
|
|
PRS_W.prs_werkplek_vastopp,
|
|
PRS_W.prs_werkplek_opp
|
|
INTO RuimteKey,
|
|
RuimteBrutoVloerOpp,
|
|
WerkplekVastOpp,
|
|
WerkplekOpp
|
|
FROM prs_werkplek PRS_W, alg_ruimte ALG_R
|
|
WHERE PRS_W.prs_alg_ruimte_key = ALG_R.alg_ruimte_key
|
|
AND PRS_W.prs_werkplek_key = ArgWerkplekKey;
|
|
EXCEPTION
|
|
WHEN NO_DATA_FOUND THEN
|
|
RETURN NULL;
|
|
END;
|
|
ELSIF NVL(ArgRuimteKey, -1) > 0
|
|
THEN
|
|
BEGIN
|
|
WerkplekVastOpp := NULL;
|
|
WerkplekOpp := NULL;
|
|
SELECT ALG_R.alg_ruimte_key,
|
|
ALG_R.alg_ruimte_bruto_vloeropp
|
|
INTO RuimteKey,
|
|
RuimteBrutoVloerOpp
|
|
FROM alg_ruimte ALG_R
|
|
WHERE ALG_R.alg_ruimte_key = ArgRuimteKey;
|
|
EXCEPTION
|
|
WHEN NO_DATA_FOUND THEN
|
|
RETURN NULL;
|
|
END;
|
|
ELSE
|
|
RETURN NULL;
|
|
END IF;
|
|
ELSE
|
|
RuimteKey := ArgRuimteKey;
|
|
RuimteBrutoVloerOpp := ArgRuimteBrutoVloerOpp;
|
|
WerkplekVastOpp := ArgWerkplekVastOpp;
|
|
WerkplekOpp := ArgWerkplekOpp;
|
|
END IF;
|
|
// Retourneer de vaste oppervlakte van de te wijzigen werkplek.
|
|
IF NVL(ArgEditMode, 'LEEG/NULL') = 'CHANGE'
|
|
AND WerkplekVastOpp IS NOT NULL
|
|
THEN
|
|
NewWerkplekOpp := ChangeWerkplekOpp;
|
|
// Retourneer de pas bepaalde vaste oppervlakte van de werkplek.
|
|
ELSIF WerkplekVastOpp IS NOT NULL
|
|
THEN
|
|
NewWerkplekOpp := WerkplekOpp;
|
|
ELSE
|
|
// Neem de vaste werkplekoppervlakte van de te wijzigen werkplek niet mee.
|
|
IF NVL(ArgEditMode, 'LEEG/NULL') = 'CHANGE'
|
|
THEN
|
|
BEGIN
|
|
SELECT NVL(SUM(NVL(PRS_W.prs_werkplek_opp, 0)), 0)
|
|
INTO WerkplekTotVastOpp
|
|
FROM prs_v_aanwezigwerkplek PRS_W
|
|
WHERE PRS_W.prs_werkplek_vastopp IS NOT NULL
|
|
AND PRS_W.prs_werkplek_key <> ArgWerkplekKey
|
|
AND PRS_W.prs_alg_ruimte_key = RuimteKey;
|
|
EXCEPTION
|
|
WHEN NO_DATA_FOUND
|
|
THEN WerkplekTotVastOpp := 0;
|
|
END;
|
|
ELSE
|
|
BEGIN
|
|
SELECT NVL(SUM(NVL(PRS_W.prs_werkplek_opp, 0)), 0)
|
|
INTO WerkplekTotVastOpp
|
|
FROM prs_v_aanwezigwerkplek PRS_W
|
|
WHERE PRS_W.prs_werkplek_vastopp IS NOT NULL
|
|
AND PRS_W.prs_alg_ruimte_key = RuimteKey;
|
|
EXCEPTION
|
|
WHEN NO_DATA_FOUND
|
|
THEN WerkplekTotVastOpp := 0;
|
|
END;
|
|
END IF;
|
|
// Neem de te wijzigen werkplek niet mee in het aantal variabele werkplekken.
|
|
IF NVL(ArgEditMode, 'LEEG/NULL') = 'CHANGE'
|
|
THEN
|
|
BEGIN
|
|
SELECT COUNT(*)
|
|
INTO AantalVariabel
|
|
FROM prs_v_aanwezigwerkplek PRS_W
|
|
WHERE PRS_W.prs_werkplek_vastopp IS NULL
|
|
AND PRS_W.prs_werkplek_key <> ArgWerkplekKey
|
|
AND PRS_W.prs_alg_ruimte_key = RuimteKey;
|
|
EXCEPTION
|
|
WHEN NO_DATA_FOUND
|
|
THEN AantalVariabel := 0;
|
|
END;
|
|
ELSE
|
|
BEGIN
|
|
SELECT COUNT(*)
|
|
INTO AantalVariabel
|
|
FROM prs_v_aanwezigwerkplek PRS_W
|
|
WHERE PRS_W.prs_werkplek_vastopp IS NULL
|
|
AND PRS_W.prs_alg_ruimte_key = RuimteKey;
|
|
EXCEPTION
|
|
WHEN NO_DATA_FOUND
|
|
THEN AantalVariabel := 0;
|
|
END;
|
|
END IF;
|
|
// Bepaal de variabele oppervlakte van de werkplekken inclusief deze nieuwe variabele werkplek.
|
|
IF NVL(ArgEditMode, 'LEEG/NULL') = 'ADD'
|
|
OR NVL(ArgEditMode, 'LEEG/NULL') = 'CHANGE'
|
|
THEN
|
|
AantalVariabel := NVL(AantalVariabel, 0) + 1;
|
|
END IF;
|
|
IF AantalVariabel > 0
|
|
THEN
|
|
NewWerkplekOpp := (RuimteBrutoVloerOpp - WerkplekTotVastOpp) / AantalVariabel;
|
|
ELSE
|
|
NewWerkplekOpp := (RuimteBrutoVloerOpp - WerkplekTotVastOpp);
|
|
END IF;
|
|
IF NVL(NewWerkplekOpp, 0) < 0
|
|
THEN
|
|
NewWerkplekOpp := 0;
|
|
END IF;
|
|
END IF;
|
|
RETURN NewWerkplekOpp;
|
|
END;
|
|
/
|
|
|
|
CREATE OR REPLACE PACKAGE aut AS
|
|
|
|
FUNCTION fac_get_prs_level(perslidkey IN NUMBER, fcode IN VARCHAR2, RW IN NUMBER) RETURN NUMBER;
|
|
FUNCTION fac_get_alg_level(perslidkey IN NUMBER, fcode IN VARCHAR2, RW IN NUMBER) RETURN NUMBER;
|
|
FUNCTION fac_get_prs_same_level(userkey IN NUMBER, perslidkey IN NUMBER) RETURN NUMBER;
|
|
END aut;
|
|
/
|
|
|
|
CREATE OR REPLACE PACKAGE BODY aut AS
|
|
|
|
FUNCTION fac_get_prs_level(perslidkey IN NUMBER, fcode IN VARCHAR2, RW IN NUMBER) RETURN NUMBER IS
|
|
|
|
-- RW = 1
|
|
readlevel NUMBER(1);
|
|
-- RW = 2
|
|
writelevel NUMBER(1);
|
|
authlevel NUMBER(1);
|
|
|
|
BEGIN
|
|
authlevel := 9;
|
|
IF perslidkey IS NOT NULL
|
|
THEN
|
|
--
|
|
BEGIN
|
|
SELECT MIN(fac_gebruiker_prs_level_read), MIN(fac_gebruiker_prs_level_write)
|
|
INTO readlevel, writelevel
|
|
FROM fac_v_webgebruiker
|
|
WHERE prs_perslid_key = perslidkey
|
|
AND fac_functie_key =
|
|
(SELECT fac_functie_key
|
|
FROM fac_functie
|
|
WHERE fac_functie_code = fcode);
|
|
EXCEPTION
|
|
WHEN NO_DATA_FOUND THEN
|
|
authlevel := 9;
|
|
END;
|
|
ELSE
|
|
authlevel := 9;
|
|
END IF;
|
|
--
|
|
IF RW = 2 AND authlevel <> -1
|
|
THEN
|
|
authlevel := writelevel;
|
|
ELSIF RW = 1 AND authlevel <> -1
|
|
THEN
|
|
authlevel := readlevel;
|
|
ELSE
|
|
authlevel := 9;
|
|
END IF;
|
|
--
|
|
RETURN authlevel;
|
|
END;
|
|
--
|
|
--
|
|
--
|
|
FUNCTION fac_get_alg_level(perslidkey IN NUMBER, fcode IN VARCHAR2, RW IN NUMBER) RETURN NUMBER IS
|
|
|
|
-- RW = 1
|
|
readlevel NUMBER(1);
|
|
-- RW = 2
|
|
writelevel NUMBER(1);
|
|
authlevel NUMBER(1);
|
|
|
|
BEGIN
|
|
authlevel := 9;
|
|
IF perslidkey IS NOT NULL
|
|
THEN
|
|
--
|
|
BEGIN
|
|
SELECT MIN(fac_gebruiker_alg_level_read), MIN(fac_gebruiker_alg_level_write)
|
|
INTO readlevel, writelevel
|
|
FROM fac_v_webgebruiker
|
|
WHERE prs_perslid_key = perslidkey
|
|
AND fac_functie_key =
|
|
(SELECT fac_functie_key
|
|
FROM fac_functie
|
|
WHERE fac_functie_code = fcode);
|
|
EXCEPTION
|
|
WHEN NO_DATA_FOUND THEN
|
|
authlevel := 9;
|
|
END;
|
|
ELSE
|
|
authlevel := 9;
|
|
END IF;
|
|
--
|
|
IF RW = 2 AND authlevel <> -1
|
|
THEN
|
|
authlevel := writelevel;
|
|
ELSIF RW = 1 AND authlevel <> -1
|
|
THEN
|
|
authlevel := readlevel;
|
|
ELSE
|
|
authlevel := 9;
|
|
END IF;
|
|
--
|
|
RETURN authlevel;
|
|
END;
|
|
--
|
|
--
|
|
FUNCTION fac_get_prs_same_level(userkey IN NUMBER, perslidkey IN NUMBER) RETURN NUMBER IS
|
|
#ifdef MS_SQL
|
|
[skip]
|
|
BEGIN
|
|
DECLARE usr_deps CURSOR LOCAL FOR
|
|
SELECT prs_afdeling_key, prs_afdeling_elder_key, niveau
|
|
FROM prs_v_afdeling_familie
|
|
WHERE prs_afdeling_key =
|
|
(SELECT prs_afdeling_key
|
|
FROM prs_perslid
|
|
WHERE prs_perslid_key=@userkey)
|
|
ORDER BY niveau DESC;
|
|
DECLARE @c1_prs_afdeling_key DECIMAL(10);
|
|
DECLARE @c1_prs_afdeling_elder_key DECIMAL(10);
|
|
DECLARE @c1_niveau DECIMAL(10);
|
|
|
|
DECLARE pers_deps CURSOR LOCAL FOR
|
|
SELECT prs_afdeling_key, prs_afdeling_elder_key, niveau
|
|
FROM prs_v_afdeling_familie
|
|
WHERE prs_afdeling_key =
|
|
(SELECT prs_afdeling_key
|
|
FROM prs_perslid
|
|
WHERE prs_perslid_key=@perslidkey)
|
|
ORDER BY niveau DESC;
|
|
DECLARE @c2_prs_afdeling_key DECIMAL(10);
|
|
DECLARE @c2_prs_afdeling_elder_key DECIMAL(10);
|
|
DECLARE @c2_niveau DECIMAL(10);
|
|
|
|
DECLARE @usr_orglevel DECIMAL(1);
|
|
DECLARE @pers_orglevel DECIMAL(1);
|
|
DECLARE @samelevelFound int;
|
|
DECLARE @samelevel DECIMAL(1);
|
|
BEGIN
|
|
SET @samelevelFound = 0;
|
|
open usr_deps
|
|
FETCH NEXT FROM usr_deps INTO @c1_prs_afdeling_key, @c1_prs_afdeling_elder_key, @c1_niveau
|
|
WHILE (@@FETCH_STATUS = 0 )
|
|
begin
|
|
open pers_deps
|
|
FETCH NEXT FROM pers_deps INTO @c2_prs_afdeling_key, @c2_prs_afdeling_elder_key, @c2_niveau
|
|
WHILE (@@FETCH_STATUS = 0 )
|
|
begin
|
|
IF @c1_prs_afdeling_elder_key = @c2_prs_afdeling_elder_key
|
|
begin
|
|
SET @samelevelFound = 1;
|
|
SET @samelevel = @c2_niveau;
|
|
break;
|
|
end;
|
|
FETCH NEXT FROM pers_deps INTO @c2_prs_afdeling_key, @c2_prs_afdeling_elder_key, @c2_niveau
|
|
end;
|
|
IF @samelevelFound = 1
|
|
begin
|
|
break;
|
|
end;
|
|
close pers_deps;
|
|
FETCH NEXT FROM usr_deps INTO @c1_prs_afdeling_key, @c1_prs_afdeling_elder_key, @c1_niveau
|
|
end;
|
|
IF (@samelevelFound <> 1)
|
|
begin
|
|
SET @samelevel = 0; -- no same level found,then assume same company
|
|
end; -- multi_company will be detected in ASP so no problem here
|
|
end if 1=2 begin
|
|
SET @samelevel = 9;
|
|
END;
|
|
RETURN @samelevel;
|
|
END
|
|
[/skip]
|
|
#else
|
|
CURSOR usr_deps IS
|
|
SELECT prs_afdeling_key, prs_afdeling_elder_key, niveau
|
|
FROM prs_v_afdeling_familie
|
|
WHERE prs_afdeling_key =
|
|
(SELECT prs_afdeling_key
|
|
FROM prs_perslid
|
|
WHERE prs_perslid_key=userkey)
|
|
ORDER BY niveau DESC;
|
|
|
|
CURSOR pers_deps IS
|
|
SELECT prs_afdeling_key, prs_afdeling_elder_key, niveau
|
|
FROM prs_v_afdeling_familie
|
|
WHERE prs_afdeling_key =
|
|
(SELECT prs_afdeling_key
|
|
FROM prs_perslid
|
|
WHERE prs_perslid_key=perslidkey)
|
|
ORDER BY niveau DESC;
|
|
|
|
usr_orglevel NUMBER(1);
|
|
pers_orglevel NUMBER(1);
|
|
samelevelFound BOOLEAN;
|
|
samelevel NUMBER(1);
|
|
|
|
BEGIN
|
|
BEGIN
|
|
samelevelFound := FALSE;
|
|
FOR c1 IN usr_deps
|
|
LOOP
|
|
FOR c2 IN pers_deps
|
|
LOOP
|
|
IF c1.prs_afdeling_elder_key = c2.prs_afdeling_elder_key
|
|
THEN
|
|
samelevelFound := TRUE;
|
|
samelevel := c2.niveau;
|
|
EXIT;
|
|
END IF;
|
|
END LOOP;
|
|
IF samelevelFound
|
|
THEN
|
|
EXIT;
|
|
END IF;
|
|
END LOOP;
|
|
IF NOT samelevelFound
|
|
THEN
|
|
samelevel := 0; -- no same level found,then assume same company
|
|
END IF; -- multi_company will be detected in ASP so no problem here
|
|
EXCEPTION
|
|
WHEN OTHERS THEN
|
|
samelevel:= 9;
|
|
END;
|
|
RETURN samelevel;
|
|
END;
|
|
#endif
|
|
END aut;
|
|
/
|
|
|
|
#endif // PRS
|