PNBR#32184: reserveren voorzieningen bij evenement: object bij koppelzaal boekt niet lekker.

svn path=/Database/trunk/; revision=25216
This commit is contained in:
Maykel Geerdink
2015-05-19 08:05:14 +00:00
parent afb85c5f85
commit df12f57bcb

View File

@@ -25,9 +25,8 @@ CREATE OR REPLACE PACKAGE res AS
PROCEDURE follow_artikel (prsv_ruimte_key IN NUMBER, oldvan IN DATE, oldtot IN DATE);
PROCEDURE follow_deel (prsv_ruimte_key IN NUMBER, oldvan IN DATE, oldtot IN DATE);
PROCEDURE follow_afspraak (prsv_ruimte_key IN NUMBER, pres_copy_to_bez IN NUMBER);
FUNCTION res_deel_in_scope (pres_deel_key IN NUMBER, palg_ruimte_key IN NUMBER) RETURN BOOLEAN;
FUNCTION res_artikel_in_scope (pres_artikel_key IN NUMBER, palg_ruimte_key IN NUMBER) RETURN BOOLEAN;
FUNCTION getalg_ruimte_key (pres_rsv_ruimte_key IN NUMBER) RETURN NUMBER;
FUNCTION res_deel_in_scope (pres_deel_key IN NUMBER, pres_rsv_ruimte_key IN NUMBER) RETURN BOOLEAN;
FUNCTION res_artikel_in_scope (pres_artikel_key IN NUMBER, pres_rsv_ruimte_key IN NUMBER) RETURN BOOLEAN;
FUNCTION getruimteprijs (pres_rsv_ruimte_key IN NUMBER, ignoretotaal IN NUMBER DEFAULT NULL) RETURN NUMBER;
FUNCTION getdeelprijs (pres_rsv_deel_key IN NUMBER) RETURN NUMBER;
FUNCTION getartikelprijs (pres_rsv_artikel_key IN NUMBER) RETURN NUMBER;
@@ -579,8 +578,8 @@ AS
RETURN dirtlevel;
END;
-- Mag dit res_deel in deze alg_ruimte_key gereserveerd worden
FUNCTION res_deel_in_scope (pres_deel_key IN NUMBER, palg_ruimte_key IN NUMBER)
-- Mag dit res_deel in de (koppel)ruimte van de reservering gereserveerd worden
FUNCTION res_deel_in_scope (pres_deel_key IN NUMBER, pres_rsv_ruimte_key IN NUMBER)
RETURN BOOLEAN IS
result BOOLEAN;
n_inscope INTEGER;
@@ -589,18 +588,25 @@ AS
INTO n_inscope
FROM ins_deel d,
res_v_aanwezigdeel r,
(SELECT d.alg_regio_key,
l.alg_district_key,
l.alg_locatie_key,
g.alg_gebouw_key,
v.alg_verdieping_key,
r.alg_ruimte_key
FROM alg_district d, alg_locatie l, alg_gebouw g, alg_verdieping v, alg_ruimte r
WHERE r.alg_ruimte_key = palg_ruimte_key
AND r.alg_verdieping_key = v.alg_verdieping_key
AND v.alg_gebouw_key = g.alg_gebouw_key
AND g.alg_locatie_key = l.alg_locatie_key
AND l.alg_district_key = d.alg_district_key) scope,
(SELECT d.alg_regio_key,
l.alg_district_key,
l.alg_locatie_key,
g.alg_gebouw_key,
v.alg_verdieping_key,
r.alg_ruimte_key
FROM alg_district d, alg_locatie l, alg_gebouw g, alg_verdieping v, alg_ruimte r
WHERE r.alg_ruimte_key IN (SELECT COALESCE(rr.alg_ruimte_key, ra.alg_ruimte_key) alg_ruimte_key
FROM res_rsv_ruimte rr,
res_ruimte_opstelling ro,
res_alg_ruimte ra
WHERE rr.res_ruimte_opstel_key = ro.res_ruimte_opstel_key(+)
AND ro.res_ruimte_key = ra.res_ruimte_key(+)
AND rr.res_rsv_ruimte_key = pres_rsv_ruimte_key
AND ra.res_alg_ruimte_verwijder IS NULL) -- Het kan ook een koppelruimte zijn die uit meerdere ruimten bestaat
AND r.alg_verdieping_key = v.alg_verdieping_key
AND v.alg_gebouw_key = g.alg_gebouw_key
AND g.alg_locatie_key = l.alg_locatie_key
AND l.alg_district_key = d.alg_district_key) scope,
res_v_deelscope ds,
res_v_aanwezigdiscipline r_disc
WHERE r.res_discipline_key = r_disc.ins_discipline_key
@@ -616,7 +622,7 @@ AS
OR ds.alg_ruimte_key = scope.alg_ruimte_key
OR ds.res_deel_alg_level = -1)
AND r.res_deel_key = ds.res_deel_key;
DBMS_OUTPUT.put_line ('res_deel_in_scope(' || pres_deel_key || ',' || palg_ruimte_key || ') -->' || n_inscope);
DBMS_OUTPUT.put_line ('res_deel_in_scope(' || pres_deel_key || ',' || pres_rsv_ruimte_key || ') -->' || n_inscope);
RETURN n_inscope > 0;
END;
-- Moeten wijzelf misschien dirty worden
@@ -682,7 +688,7 @@ AS
THEN
newdirtlevel := 512; -- Overlap
END IF;
IF NOT res_deel_in_scope (lres_deel_key, getalg_ruimte_key (lrsv_ruimte_key))
IF NOT res_deel_in_scope (lres_deel_key, lrsv_ruimte_key)
THEN
newdirtlevel := newdirtlevel + 256; -- OutOfScope
END IF;
@@ -727,19 +733,26 @@ AS
-- TODO: Alle ruimtes met Dirty-bitje bekijken
end loop;
END;
-- Mag dit res_dartikel in deze alg_ruimte_key gereserveerd worden
FUNCTION res_artikel_in_scope (pres_artikel_key IN NUMBER, palg_ruimte_key IN NUMBER)
-- Mag dit res_dartikel in de (koppel)ruimte van de reservering gereserveerd worden
FUNCTION res_artikel_in_scope (pres_artikel_key IN NUMBER, pres_rsv_ruimte_key IN NUMBER)
RETURN BOOLEAN IS
result BOOLEAN;
n_inscope INTEGER;
BEGIN
DBMS_OUTPUT.put_line ('res_artikel_in_scope(' || pres_artikel_key || ',' || palg_ruimte_key || ')');
DBMS_OUTPUT.put_line ('res_artikel_in_scope(' || pres_artikel_key || ',' || pres_rsv_ruimte_key || ')');
SELECT COUNT ( * )
INTO n_inscope
FROM res_v_alg_ruimte_gegevens rg, res_v_aanwezigartikel a
WHERE rg.alg_ruimte_key IS NOT NULL
AND res_artikel_key = pres_artikel_key
AND rg.alg_ruimte_key = palg_ruimte_key
AND rg.alg_ruimte_key IN (SELECT COALESCE(rr.alg_ruimte_key, ra.alg_ruimte_key) alg_ruimte_key
FROM res_rsv_ruimte rr,
res_ruimte_opstelling ro,
res_alg_ruimte ra
WHERE rr.res_ruimte_opstel_key = ro.res_ruimte_opstel_key(+)
AND ro.res_ruimte_key = ra.res_ruimte_key(+)
AND rr.res_rsv_ruimte_key = pres_rsv_ruimte_key
AND ra.res_alg_ruimte_verwijder IS NULL) -- Het kan ook een koppelruimte zijn die uit meerdere ruimten bestaat
AND (rg.alg_locatie_key IN
(SELECT DISTINCT sao.alg_onrgoed_key
FROM res_srtartikel_onrgoed sao
@@ -779,7 +792,7 @@ AS
FETCH prsv_artikelcur INTO prsv_artikel;
newdirtlevel := 0; -- Begin 'Clean'
IF prsv_artikel.res_rsv_artikel_verwijder IS NULL
AND NOT res_artikel_in_scope (prsv_artikel.res_artikel_key, getalg_ruimte_key (prsv_artikel.res_rsv_ruimte_key))
AND NOT res_artikel_in_scope (prsv_artikel.res_artikel_key, prsv_artikel.res_rsv_ruimte_key)
THEN
newdirtlevel := newdirtlevel + 256; -- OutOfScope
END IF;
@@ -924,14 +937,20 @@ AS
FROM res_rsv_ruimte rr
WHERE rr.res_rsv_ruimte_key = prsv_ruimte_key;
ruimtekey := getalg_ruimte_key (prsv_ruimte_key);
SELECT g.alg_locatie_key
-- In geval van koppelruimten worden meerdere locatie keys opgeleverd. De locaties zullen echter toch hetzelfde zijn.
SELECT MIN(g.alg_locatie_key)
INTO locatiekey
FROM alg_ruimte r, alg_verdieping v, alg_gebouw g
WHERE g.alg_gebouw_key = v.alg_gebouw_key
AND v.alg_verdieping_key = r.alg_verdieping_key
AND r.alg_ruimte_key = ruimtekey;
AND r.alg_ruimte_key IN (SELECT COALESCE (rr.alg_ruimte_key, ra.alg_ruimte_key) alg_ruimte_key
FROM res_rsv_ruimte rr,
res_ruimte_opstelling ro,
res_alg_ruimte ra
WHERE rr.res_ruimte_opstel_key = ro.res_ruimte_opstel_key(+)
AND ro.res_ruimte_key = ra.res_ruimte_key(+)
AND rr.res_rsv_ruimte_key = prsv_ruimte_key
AND ra.res_alg_ruimte_verwijder IS NULL);
SELECT bez_afspraak_datum, bez_afspraak_eind, alg_locatie_key
INTO oldvan, oldtot, oldloc
@@ -1011,30 +1030,6 @@ AS
END IF;
END;
-- Levert de ALG_RUIMTE_KEY uit res_rsv_ruimte CV
-- of de ALG_RUIMTE_KEY van de eerste opstelling/ruimte
FUNCTION getalg_ruimte_key (pres_rsv_ruimte_key IN NUMBER)
RETURN NUMBER IS
alg_ruimte_key alg_ruimte.alg_ruimte_key%TYPE;
lres_ruimte_opstel_key res_ruimte_opstelling.res_ruimte_opstel_key%TYPE;
BEGIN
SELECT alg_ruimte_key, res_ruimte_opstel_key
INTO alg_ruimte_key, lres_ruimte_opstel_key
FROM res_rsv_ruimte
WHERE res_rsv_ruimte_key = pres_rsv_ruimte_key;
IF alg_ruimte_key IS NULL
THEN
SELECT MIN (ra.alg_ruimte_key)
INTO alg_ruimte_key
FROM res_ruimte_opstelling ro, res_alg_ruimte ra
WHERE ro.res_ruimte_opstel_key = lres_ruimte_opstel_key
AND ro.res_ruimte_key = ra.res_ruimte_key
AND ra.res_alg_ruimte_verwijder IS NULL;
END IF;
RETURN alg_ruimte_key;
END;
FUNCTION getruimteprijs (pres_rsv_ruimte_key IN NUMBER, ignoretotaal IN NUMBER DEFAULT NULL)
RETURN NUMBER IS
room_price res_ruimte.res_ruimte_prijs%TYPE;