GDZW#30880: Ook 5e dag van de maand mogelijk maken bij herhalen reserveren.

svn path=/Database/trunk/; revision=23347
This commit is contained in:
Maykel Geerdink
2014-11-17 10:32:39 +00:00
parent 47d236887b
commit ce33935874

View File

@@ -3991,17 +3991,21 @@ CREATE OR REPLACE PACKAGE BODY fac AS
p_bits IN NUMBER)
RETURN DATE
IS
fromdate DATE;
fromdow NUMBER;
fromdom NUMBER;
todaydow NUMBER;
inspdate DATE;
nextday NUMBER;
lastday DATE;
w_bits NUMBER;
m_bits NUMBER;
w_day_n NUMBER;
w_day_v VARCHAR2(10);
fromdate DATE;
fromdateplusperiode DATE;
fromdow NUMBER;
fromdom NUMBER;
todaydow NUMBER;
inspdate DATE;
nextday NUMBER;
lastday DATE;
w_bits NUMBER;
m_bits NUMBER;
w_day_n NUMBER;
w_day_v VARCHAR2(10);
gevonden BOOLEAN;
month1 NUMBER;
month2 NUMBER;
BEGIN
IF p_periode = 0
THEN
@@ -4122,7 +4126,7 @@ CREATE OR REPLACE PACKAGE BODY fac AS
-- 2 = tweede xxxdag van de maand (2^10 = 512)
-- 3 = derde xxxdag van de maand (2^9 + 2^10 = 256 + 512 = 768)
-- 4 = vierde xxxdag van de maand (2^11 = 1024)
-- 5 = NOT IN USE
-- 5 = vijfde xxxdag van de maand (2^9 + 2^11 = 256 + 1024 = 1280)
-- 6 = <20><>n na laatste xxxdag van de maand (2^10 + 2^11 = 512 + 1024 = 1536)
-- 7 = laatste dag van de maand (2^9 + 2^10 + 2^11 = 256 + 512 + 1024 = 1792)
@@ -4161,7 +4165,7 @@ CREATE OR REPLACE PACKAGE BODY fac AS
THEN
-- Exact eenheid maanden verder.
inspdate := ADD_MONTHS (fromdate, p_periode);
ELSIF m_bits > 4
ELSIF m_bits > 5
THEN
CASE
WHEN m_bits = 6 OR m_bits = 7
@@ -4184,29 +4188,52 @@ CREATE OR REPLACE PACKAGE BODY fac AS
-- Exact eenheid maanden verder.
inspdate := ADD_MONTHS (fromdate, p_periode);
END CASE;
ELSE -- 0 < m_bits <= 4
-- Eerste bits dag.
-- Bepaal de eerste bits dag deze maand de y-ste xxxdag van de maand.
inspdate := NEXT_DAY (TRUNC(fromdate, 'MONTH') - 1 + ((m_bits - 1) * 7), w_day_v);
-- Als de inspdate later is dan de meegegeven datum dan zijn we klaar.
-- Als de inspdate vandaag of in het verleden ligt dan
-- kijken we niet of er nog andere inspectiedatums in dezelfde week zijn die wel in de toekomst liggen (BEPERKING / VERSIMPELING in eerste instantie)
-- Daarom zorgen dat er in de invoer maar 1 dag in de week gekozen kan worden.
-- Als inspectie datum niet in de toekomst ligt dan de eerste inspectie datum bepalen in de volgende periode maanden verder.
IF (inspdate <= fromdate)
ELSE -- 0 < m_bits <= 5
gevonden := FALSE;
IF (p_periode = 1)
THEN
inspdate := NEXT_DAY (TRUNC(ADD_MONTHS (inspdate, p_periode), 'MONTH') - 1 + ((m_bits - 1) * 7), w_day_v);
ELSIF p_periode > 1 -- (inspdate > fromdate) geldt automatisch.
THEN
inspdate := NEXT_DAY (TRUNC(ADD_MONTHS (inspdate, p_periode - 1), 'MONTH') - 1 + ((m_bits - 1) * 7), w_day_v);
-- Eerste bits dag.
-- Bepaal de eerste bits dag deze maand de y-ste xxxdag van de maand. Misschien is er deze maand nog een dag te vinden.
inspdate := NEXT_DAY (TRUNC(fromdate, 'MONTH') - 1 + ((m_bits - 1) * 7), w_day_v);
-- Als de nieuwe dag in de toekomst is en in dezelfde maand (i.v.m. 5de dag) dan heb je de volgende datum gevonden.
-- Maar dan mag de datum niet een feestdag zijn als de checkbox "Niet op feestdagen" is aangevinkt.
month1 := TO_NUMBER(TO_CHAR (fromdate, 'MM'));
month2 := TO_NUMBER(TO_CHAR (inspdate, 'MM'));
IF (inspdate > fromdate AND month1 = month2) AND NOT ((BITAND(p_bits, 128) = 128) AND isdatefeestdag(inspdate))
THEN
gevonden := TRUE;
END IF;
END IF;
IF NOT gevonden
THEN
-- Voor (p_periode = 1) niets gevonden of (p_periode > 1).
inspdate := NEXT_DAY (TRUNC(ADD_MONTHS (fromdate, p_periode), 'MONTH') - 1 + ((m_bits - 1) * 7), w_day_v);
IF (m_bits = 5)
THEN
-- Is er wel een vijfde dag in de maand. Is de fromdate + periode in dezelfde maand als de nieuw berekende inspdate?
fromdateplusperiode := ADD_MONTHS (fromdate, p_periode);
month1 := TO_NUMBER(TO_CHAR (fromdateplusperiode, 'MM'));
month2 := TO_NUMBER(TO_CHAR (inspdate, 'MM'));
IF (month1 <> month2)
THEN
-- Er is geen vijfde dag in de maand. De volgende bepalen.
inspdate := calcnextcyclusdate (fromdateplusperiode, p_mode, p_eenheid, p_periode, p_bits);
ELSIF (BITAND(p_bits, 128) = 128) AND isdatefeestdag(inspdate)
THEN
-- De datum is een feestdag en de checkbox "Niet op feestdagen" is aangevinkt. De datum overslaan en bepaal de volgende inspectiedatum.
inspdate := calcnextcyclusdate (inspdate, p_mode, p_eenheid, p_periode, p_bits);
END IF;
ELSE
IF (BITAND(p_bits, 128) = 128) AND isdatefeestdag(inspdate)
THEN
-- De datum is een feestdag en de checkbox "Niet op feestdagen" is aangevinkt. De datum overslaan en bepaal de volgende inspectiedatum.
inspdate := calcnextcyclusdate (inspdate, p_mode, p_eenheid, p_periode, p_bits);
END IF;
END IF;
END IF;
END IF;
IF (BITAND(p_bits, 128) = 128) AND isdatefeestdag(inspdate)
THEN
-- Checkbox "Niet op feestdagen" is aangevinkt en de datum is een feestdag. De datum overslaan en bepaal de volgende inspectiedatum.
inspdate := calcnextcyclusdate (inspdate, p_mode, p_eenheid, p_periode, p_bits);
END IF;
END;
WHEN 4
@@ -4214,18 +4241,18 @@ CREATE OR REPLACE PACKAGE BODY fac AS
BEGIN
-- jaarlijks
inspdate := ADD_MONTHS (fromdate, p_periode * 12);
IF p_bits > 0
THEN
lastday := LAST_DAY(ADD_MONTHS (TRUNC(inspdate, 'YEAR'), 11));
inspdate := ADD_MONTHS (TRUNC(inspdate, 'YEAR'), p_bits - 1);
IF inspdate > lastday -- was p_bits groter dan het aantal maanden in het jaar? Dan de laatste dag van de laatste maand van het jaar nemen.
THEN
inspdate := lastday;
ELSE
fromdom := fromdate - TRUNC(fromdate, 'MONTH');
inspdate := inspdate + fromdom;
END IF;
END IF;
IF p_bits > 0
THEN
lastday := LAST_DAY(ADD_MONTHS (TRUNC(inspdate, 'YEAR'), 11));
inspdate := ADD_MONTHS (TRUNC(inspdate, 'YEAR'), p_bits - 1);
IF inspdate > lastday -- was p_bits groter dan het aantal maanden in het jaar? Dan de laatste dag van de laatste maand van het jaar nemen.
THEN
inspdate := lastday;
ELSE
fromdom := fromdate - TRUNC(fromdate, 'MONTH');
inspdate := inspdate + fromdom;
END IF;
END IF;
-- werking van cyclus_bits tbd
END;
END CASE;