FSN#23620 Vreemde effecten doorlooptijden+UWVA#30138 soms geen noti-mails

svn path=/Database/trunk/; revision=22780
This commit is contained in:
Maarten van der Heide
2014-10-03 10:53:14 +00:00
parent 2aa655b819
commit 6ff065a738

View File

@@ -536,43 +536,47 @@ CREATE OR REPLACE PACKAGE BODY fac AS
-- Veronderstelt NLS_TERRITORY='AMERICA'. -- Veronderstelt NLS_TERRITORY='AMERICA'.
IF begindatum IS NOT NULL AND uitvoertijd IS NOT NULL IF begindatum IS NOT NULL
AND TRUNC (COALESCE (pBeginWerkUur, -1)) BETWEEN 0 AND 23 AND uitvoertijd IS NOT NULL
AND TRUNC (COALESCE (pEindWerkUur, -1)) BETWEEN 0 AND 23 AND pBeginWerkUur BETWEEN 0 AND 24
AND pEindWerkUur BETWEEN 0 AND 24
AND pEindWerkUur > pBeginWerkUur
THEN THEN
IF palleenWerkdagen = 0 IF palleenWerkdagen = 0
THEN THEN
-- Zo simpel kan het zijn (igv. 24/7)! -- Zo simpel kan het zijn (als alle dagen meetellen)!
-- Geen verschuiving als gereedtijd buiten de meegegeven uren valt, wat in
-- theorie kan igv. Openingstijden-regime!?
IF uitvoertijdtype IN ('D', 'DAGEN') IF uitvoertijdtype IN ('D', 'DAGEN')
THEN THEN
RETURN begindatum + uitvoertijd; returnval := begindatum + uitvoertijd;
ELSIF uitvoertijdtype IN ('U', 'UREN') ELSIF uitvoertijdtype IN ('U', 'UREN')
THEN THEN
RETURN begindatum + (uitvoertijd / 24); returnval := begindatum + (uitvoertijd / 24);
ELSE ELSE
returnval := NULL; returnval := NULL;
END IF; END IF;
ELSIF palleenWerkdagen = 1 ELSIF palleenWerkdagen = 1
THEN THEN
-- Verschuif begindatum als deze valt [a] buiten openingstijden, [b] op een -- Verschuif begindatum als deze valt [a] buiten de meegegeven uren, [b] op
-- vrijedag of [c] in het weekend! -- een vrije dag of [c] in het weekend!
-- LET OP: Volgorde hier van belang, want vrijdag na openingstijd wordt eerst -- LET OP: Volgorde hier van belang, want vrijdag na eindtijd wordt eerst
-- verschoven naar zaterdag-begintijd en vervolgens naar maandag-begintijd. -- verschoven naar zaterdag-begintijd en vervolgens naar maandag-begintijd.
SELECT COUNT ( * ) SELECT COUNT ( * )
INTO vrijedag INTO vrijedag
FROM mld_vrije_dagen FROM mld_vrije_dagen
WHERE mld_vrije_dagen_datum = TRUNC (begindatum); WHERE mld_vrije_dagen_datum = TRUNC (begindatum);
IF (begindatum < TRUNC (begindatum) + (pBeginWerkUur / 24)) IF (begindatum > TRUNC (begindatum) + (pEindWerkUur / 24) OR vrijedag = 1)
THEN
-- Als begintijd voor 'pBeginWerkUur', dan naar 'pBeginWerkUur' huidige dag.
datumbegin := TRUNC (begindatum) + (pBeginWerkUur / 24);
ELSIF (begindatum > TRUNC (begindatum) + (pEindWerkUur / 24) OR vrijedag = 1)
THEN THEN
-- Als begintijd na 'pEindWerkUur', dan naar 'pBeginWerkUur' volgende dag; -- Als begintijd na 'pEindWerkUur', dan naar 'pBeginWerkUur' volgende dag;
-- hetzelfde als begindag is een vrije dag. -- hetzelfde als begindag is een vrije dag.
-- En als deze volgende dag is een vrije dag, dan volgt vanzelf compensatie! -- En als deze volgende dag is een vrije dag, dan volgt vanzelf compensatie!
datumbegin := TRUNC (begindatum + 1) + (pBeginWerkUur / 24); datumbegin := TRUNC (begindatum + 1) + (pBeginWerkUur / 24);
ELSIF (begindatum < TRUNC (begindatum) + (pBeginWerkUur / 24))
THEN
-- Als begintijd voor 'pBeginWerkUur', dan naar 'pBeginWerkUur' huidige dag.
datumbegin := TRUNC (begindatum) + (pBeginWerkUur / 24);
ELSE ELSE
-- Anders 1-op-1 overnemen. -- Anders 1-op-1 overnemen.
datumbegin := begindatum; datumbegin := begindatum;
@@ -606,8 +610,8 @@ CREATE OR REPLACE PACKAGE BODY fac AS
-- Een werkweek van 5 dagen zorgt voor een doorlooptijd van 7 kalenderdagen. -- Een werkweek van 5 dagen zorgt voor een doorlooptijd van 7 kalenderdagen.
newdatumgereed := olddatumgereed + (aantalwerkweken * 7) + aantaldagenover; newdatumgereed := olddatumgereed + (aantalwerkweken * 7) + aantaldagenover;
-- Verschuif newdatumgereed als gereedtijd buiten openingstijden valt. -- Verschuif newdatumgereed als gereedtijd buiten de meegegeven uren valt.
-- LET OP: Komt alleen voor als uitvoertijd decimalen bevat! Mag dat? -- LET OP: Komt alleen voor als uitvoertijd decimalen bevat! Kan dat?
IF (newdatumgereed < TRUNC (newdatumgereed) + (pBeginWerkUur / 24)) IF (newdatumgereed < TRUNC (newdatumgereed) + (pBeginWerkUur / 24))
THEN THEN
-- Als gereedtijd voor 'pBeginWerkUur', dan naar 'pBeginWerkUur' huidige dag. -- Als gereedtijd voor 'pBeginWerkUur', dan naar 'pBeginWerkUur' huidige dag.
@@ -630,7 +634,7 @@ CREATE OR REPLACE PACKAGE BODY fac AS
SELECT COUNT ( * ) SELECT COUNT ( * )
INTO delta INTO delta
FROM mld_vrije_dagen FROM mld_vrije_dagen
WHERE fac.getweekdaynum (mld_vrije_dagen_datum) NOT IN (1, 7) -- nodig of altijd zo? WHERE fac.getweekdaynum (mld_vrije_dagen_datum) NOT IN (1, 7) -- nodig!
AND mld_vrije_dagen_datum BETWEEN TRUNC (olddatumgereed) AND newdatumgereed; AND mld_vrije_dagen_datum BETWEEN TRUNC (olddatumgereed) AND newdatumgereed;
EXIT WHEN delta = 0; EXIT WHEN delta = 0;
@@ -702,58 +706,64 @@ CREATE OR REPLACE PACKAGE BODY fac AS
laatstedag NUMBER (10, 3); laatstedag NUMBER (10, 3);
heledagen NUMBER (10); heledagen NUMBER (10);
BEGIN BEGIN
IF begindatum > einddatum IF begindatum IS NOT NULL
AND einddatum IS NOT NULL
AND pBeginWerkUur BETWEEN 0 AND 24
AND pEindWerkUur BETWEEN 0 AND 24
AND pEindWerkUur > pBeginWerkUur
THEN THEN
RETURN -datumtijdnaaruitvoertijd (einddatum, IF begindatum > einddatum
begindatum, THEN
uitvoertijdtype, RETURN -datumtijdnaaruitvoertijd (einddatum,
pBeginWerkUur, begindatum,
pEindWerkUur, uitvoertijdtype,
palleenWerkdagen); pBeginWerkUur,
END IF; pEindWerkUur,
palleenWerkdagen);
END IF;
IF uitvoertijdtype IN ('D', 'DAGEN') -- Logisch zo? urenperdag := pEindWerkUur - pBeginWerkUur;
THEN --Waarom niet gewoon? eerstedag := pEindWerkUur - ((begindatum - TRUNC (begindatum)) * 24);
RETURN fac.count_Work_Days_InclTime (begindatum, einddatum); eerstedag := pEindWerkUur - (TRUNC (begindatum, 'MI') - TRUNC (begindatum)) * 24;
END IF;
urenperdag := pEindWerkUur - pBeginWerkUur;
-- Oppassen als begin/eind in het weekend of zo valt.
-- dan moeten eerste/ laatste dag gewoon 0 uur zijn
IF palleenWerkdagen = 1 AND iswerkdag (begindatum) = 0
THEN
eerstedag := 0;
ELSE
eerstedag :=
pEindWerkUur - (TRUNC (begindatum, 'MI') - TRUNC (begindatum)) * 24;
eerstedag := LEAST (GREATEST (0, eerstedag), urenperdag); eerstedag := LEAST (GREATEST (0, eerstedag), urenperdag);
DBMS_OUTPUT.put_line ('Eerstedag ' || TO_CHAR (eerstedag)); --Waarom niet gewoon? laatstedag := ((einddatum - TRUNC (einddatum)) * 24) - pBeginWerkUur;
END IF; laatstedag := (TRUNC (einddatum, 'MI') - TRUNC (einddatum)) * 24 - pBeginWerkUur;
IF palleenWerkdagen = 1 AND iswerkdag (einddatum) = 0
THEN
laatstedag := 0;
ELSE
laatstedag :=
(TRUNC (einddatum, 'MI') - TRUNC (einddatum)) * 24 - pBeginWerkUur;
laatstedag := LEAST (GREATEST (0, laatstedag), urenperdag); laatstedag := LEAST (GREATEST (0, laatstedag), urenperdag);
END IF;
DBMS_OUTPUT.put_line ('laatstedag ' || TO_CHAR (laatstedag)); IF palleenWerkdagen = 0
THEN
heledagen := TRUNC (einddatum) - TRUNC (begindatum) - 1;
ELSE -- default/palleenWerkdagen = 1
-- Oppassen als begin/eind in het weekend of zo valt,
-- dan moeten eerste/laatste dag gewoon 0 uur zijn.
IF iswerkdag (begindatum) = 0
THEN
eerstedag := 0;
END IF;
IF palleenWerkdagen = 0 IF iswerkdag (einddatum) = 0
THEN THEN
heledagen := TRUNC (einddatum) - TRUNC (begindatum) - 1; laatstedag := 0;
heledagen := fac.count_Work_Days (TRUNC (begindatum), TRUNC (einddatum));
ELSE
heledagen := fac.count_Work_Days (TRUNC (begindatum), TRUNC (einddatum)) - 1;
END IF;
END IF;
DBMS_OUTPUT.put_line ('Eerstedag ' || TO_CHAR (eerstedag));
DBMS_OUTPUT.put_line ('Laatstedag ' || TO_CHAR (laatstedag));
DBMS_OUTPUT.put_line ('Heledagen ' || TO_CHAR (heledagen));
IF uitvoertijdtype IN ('D', 'DAGEN')
THEN
-- Per 5.4.3 kunnen hier gebroken dagen worden teruggegeven!
RETURN (eerstedag + laatstedag + heledagen * urenperdag) / urenperdag;
ELSE -- default/uitvoertijdtype IN ('U', 'UREN')
RETURN eerstedag + laatstedag + heledagen * urenperdag;
END IF;
ELSE ELSE
heledagen := RETURN NULL;
fac.count_Work_Days (TRUNC (begindatum), TRUNC (einddatum)) - 1;
END IF; END IF;
DBMS_OUTPUT.put_line ('heledagen ' || TO_CHAR (heledagen));
RETURN eerstedag + laatstedag + heledagen * urenperdag;
END datumtijdnaaruitvoertijd; END datumtijdnaaruitvoertijd;
FUNCTION getdatemillisec (i_date IN DATE) FUNCTION getdatemillisec (i_date IN DATE)
@@ -1874,6 +1884,8 @@ CREATE OR REPLACE PACKAGE BODY fac AS
AS AS
soms fac_srtnotificatie.fac_srtnotificatie_oms%TYPE; soms fac_srtnotificatie.fac_srtnotificatie_oms%TYPE;
smode fac_srtnotificatie.fac_srtnotificatie_mode%TYPE; smode fac_srtnotificatie.fac_srtnotificatie_mode%TYPE;
oldercode fac_srtnotificatie.fac_srtnotificatie_code%TYPE;
oldersoms fac_srtnotificatie.fac_srtnotificatie_oms%TYPE;
oldersmode fac_srtnotificatie.fac_srtnotificatie_mode%TYPE; oldersmode fac_srtnotificatie.fac_srtnotificatie_mode%TYPE;
susermode fac_srtnotificatie.fac_srtnotificatie_usermode%TYPE; susermode fac_srtnotificatie.fac_srtnotificatie_usermode%TYPE;
lmode fac_srtnotificatie.fac_srtnotificatie_mode%TYPE; lmode fac_srtnotificatie.fac_srtnotificatie_mode%TYPE;
@@ -2001,8 +2013,8 @@ CREATE OR REPLACE PACKAGE BODY fac AS
THEN THEN
-- Zoek de lmode van een al/nog aanwezige fac_notificatie die over hetzelfde gaat -- Zoek de lmode van een al/nog aanwezige fac_notificatie die over hetzelfde gaat
BEGIN BEGIN
SELECT fac_notificatie_status SELECT fac_srtnotificatie_code, fac_notificatie_status, fac_notificatie_oms
INTO oldersmode INTO oldercode, oldersmode, oldersoms
FROM fac_v_notifyqueue ander FROM fac_v_notifyqueue ander
WHERE (pcode = ander.fac_srtnotificatie_code WHERE (pcode = ander.fac_srtnotificatie_code
OR pcode = 'BESUPD' OR pcode = 'BESUPD'
@@ -2029,6 +2041,15 @@ CREATE OR REPLACE PACKAGE BODY fac AS
NULL; NULL;
END; END;
-- Identieke noti als reeds in de queue staat, dan zijn wij klaar; hoeft niet nog eens
-- en direct RETURN zodat bestaande noti niet ook nog eens wordt teruggetrokken (is in
-- dit geval, hoewel ouder, dus niet waardeloos)!
IF (pcode = oldercode AND smode = oldersmode AND soms = oldersoms)
THEN
-- Nothing to do
RETURN;
END IF;
IF BITAND (smode, 2) = 2 AND BITAND (oldersmode, 2) = 2 IF BITAND (smode, 2) = 2 AND BITAND (oldersmode, 2) = 2
THEN THEN
lmode := BITAND (lmode, 255 - 2); lmode := BITAND (lmode, 255 - 2);