Files
Database/PRS/PRS_PAC.SRC
Peter Feij e4a4ba9750 syntax fix
svn path=/Database/trunk/; revision=8888
2005-01-18 15:30:02 +00:00

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