Files
Database/PRS/PRS_PAC.SRC
Peter Feij 766af780de FSN#18275
svn path=/Database/trunk/; revision=10391
2010-09-06 13:11:52 +00:00

377 lines
13 KiB
Plaintext

#ifdef PRS
/*
* $Revision: 18 $
* $Modtime: 6-09-10 14:59 $
*/
/* 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 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
CURSOR usr_deps IS
SELECT paf.prs_afdeling_key, prs_afdeling_elder_key, niveau
FROM prs_v_afdeling_familie paf, prs_perslid pp
WHERE paf.prs_afdeling_key = pp.prs_afdeling_key
AND pp.prs_perslid_key=userkey
ORDER BY niveau DESC;
CURSOR pers_deps IS
SELECT paf.prs_afdeling_key, prs_afdeling_elder_key, niveau
FROM prs_v_afdeling_familie paf, prs_perslid pp
WHERE paf.prs_afdeling_key = pp.prs_afdeling_key
AND pp.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;
END aut;
/
REGISTERRUN('$Workfile: PRS_PAC.SRC $','$Revision: 18 $')
#endif // PRS