FSN#23620 Vreemde effecten doorlooptijden+UWVA#30138 soms geen noti-mails
svn path=/Database/trunk/; revision=22780
This commit is contained in:
147
FAC/FAC_PAC.SRC
147
FAC/FAC_PAC.SRC
@@ -536,43 +536,47 @@ CREATE OR REPLACE PACKAGE BODY fac AS
|
||||
|
||||
-- Veronderstelt NLS_TERRITORY='AMERICA'.
|
||||
|
||||
IF begindatum IS NOT NULL AND uitvoertijd IS NOT NULL
|
||||
AND TRUNC (COALESCE (pBeginWerkUur, -1)) BETWEEN 0 AND 23
|
||||
AND TRUNC (COALESCE (pEindWerkUur, -1)) BETWEEN 0 AND 23
|
||||
IF begindatum IS NOT NULL
|
||||
AND uitvoertijd IS NOT NULL
|
||||
AND pBeginWerkUur BETWEEN 0 AND 24
|
||||
AND pEindWerkUur BETWEEN 0 AND 24
|
||||
AND pEindWerkUur > pBeginWerkUur
|
||||
THEN
|
||||
IF palleenWerkdagen = 0
|
||||
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')
|
||||
THEN
|
||||
RETURN begindatum + uitvoertijd;
|
||||
returnval := begindatum + uitvoertijd;
|
||||
ELSIF uitvoertijdtype IN ('U', 'UREN')
|
||||
THEN
|
||||
RETURN begindatum + (uitvoertijd / 24);
|
||||
returnval := begindatum + (uitvoertijd / 24);
|
||||
ELSE
|
||||
returnval := NULL;
|
||||
END IF;
|
||||
ELSIF palleenWerkdagen = 1
|
||||
THEN
|
||||
-- Verschuif begindatum als deze valt [a] buiten openingstijden, [b] op een
|
||||
-- vrijedag of [c] in het weekend!
|
||||
-- LET OP: Volgorde hier van belang, want vrijdag na openingstijd wordt eerst
|
||||
-- Verschuif begindatum als deze valt [a] buiten de meegegeven uren, [b] op
|
||||
-- een vrije dag of [c] in het weekend!
|
||||
-- LET OP: Volgorde hier van belang, want vrijdag na eindtijd wordt eerst
|
||||
-- verschoven naar zaterdag-begintijd en vervolgens naar maandag-begintijd.
|
||||
SELECT COUNT ( * )
|
||||
INTO vrijedag
|
||||
FROM mld_vrije_dagen
|
||||
WHERE mld_vrije_dagen_datum = TRUNC (begindatum);
|
||||
|
||||
IF (begindatum < TRUNC (begindatum) + (pBeginWerkUur / 24))
|
||||
THEN
|
||||
-- Als begintijd voor 'pBeginWerkUur', dan naar 'pBeginWerkUur' huidige dag.
|
||||
datumbegin := TRUNC (begindatum) + (pBeginWerkUur / 24);
|
||||
ELSIF (begindatum > TRUNC (begindatum) + (pEindWerkUur / 24) OR vrijedag = 1)
|
||||
IF (begindatum > TRUNC (begindatum) + (pEindWerkUur / 24) OR vrijedag = 1)
|
||||
THEN
|
||||
-- Als begintijd na 'pEindWerkUur', dan naar 'pBeginWerkUur' volgende dag;
|
||||
-- hetzelfde als begindag is een vrije dag.
|
||||
-- En als deze volgende dag is een vrije dag, dan volgt vanzelf compensatie!
|
||||
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
|
||||
-- Anders 1-op-1 overnemen.
|
||||
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.
|
||||
newdatumgereed := olddatumgereed + (aantalwerkweken * 7) + aantaldagenover;
|
||||
|
||||
-- Verschuif newdatumgereed als gereedtijd buiten openingstijden valt.
|
||||
-- LET OP: Komt alleen voor als uitvoertijd decimalen bevat! Mag dat?
|
||||
-- Verschuif newdatumgereed als gereedtijd buiten de meegegeven uren valt.
|
||||
-- LET OP: Komt alleen voor als uitvoertijd decimalen bevat! Kan dat?
|
||||
IF (newdatumgereed < TRUNC (newdatumgereed) + (pBeginWerkUur / 24))
|
||||
THEN
|
||||
-- Als gereedtijd voor 'pBeginWerkUur', dan naar 'pBeginWerkUur' huidige dag.
|
||||
@@ -630,7 +634,7 @@ CREATE OR REPLACE PACKAGE BODY fac AS
|
||||
SELECT COUNT ( * )
|
||||
INTO delta
|
||||
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;
|
||||
|
||||
EXIT WHEN delta = 0;
|
||||
@@ -702,58 +706,64 @@ CREATE OR REPLACE PACKAGE BODY fac AS
|
||||
laatstedag NUMBER (10, 3);
|
||||
heledagen NUMBER (10);
|
||||
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
|
||||
RETURN -datumtijdnaaruitvoertijd (einddatum,
|
||||
begindatum,
|
||||
uitvoertijdtype,
|
||||
pBeginWerkUur,
|
||||
pEindWerkUur,
|
||||
palleenWerkdagen);
|
||||
END IF;
|
||||
IF begindatum > einddatum
|
||||
THEN
|
||||
RETURN -datumtijdnaaruitvoertijd (einddatum,
|
||||
begindatum,
|
||||
uitvoertijdtype,
|
||||
pBeginWerkUur,
|
||||
pEindWerkUur,
|
||||
palleenWerkdagen);
|
||||
END IF;
|
||||
|
||||
IF uitvoertijdtype IN ('D', 'DAGEN') -- Logisch zo?
|
||||
THEN
|
||||
RETURN fac.count_Work_Days_InclTime (begindatum, einddatum);
|
||||
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;
|
||||
urenperdag := pEindWerkUur - pBeginWerkUur;
|
||||
--Waarom niet gewoon? eerstedag := pEindWerkUur - ((begindatum - TRUNC (begindatum)) * 24);
|
||||
eerstedag := pEindWerkUur - (TRUNC (begindatum, 'MI') - TRUNC (begindatum)) * 24;
|
||||
eerstedag := LEAST (GREATEST (0, eerstedag), urenperdag);
|
||||
DBMS_OUTPUT.put_line ('Eerstedag ' || TO_CHAR (eerstedag));
|
||||
END IF;
|
||||
|
||||
IF palleenWerkdagen = 1 AND iswerkdag (einddatum) = 0
|
||||
THEN
|
||||
laatstedag := 0;
|
||||
ELSE
|
||||
laatstedag :=
|
||||
(TRUNC (einddatum, 'MI') - TRUNC (einddatum)) * 24 - pBeginWerkUur;
|
||||
--Waarom niet gewoon? laatstedag := ((einddatum - TRUNC (einddatum)) * 24) - pBeginWerkUur;
|
||||
laatstedag := (TRUNC (einddatum, 'MI') - TRUNC (einddatum)) * 24 - pBeginWerkUur;
|
||||
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
|
||||
THEN
|
||||
heledagen := TRUNC (einddatum) - TRUNC (begindatum) - 1;
|
||||
IF iswerkdag (einddatum) = 0
|
||||
THEN
|
||||
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
|
||||
heledagen :=
|
||||
fac.count_Work_Days (TRUNC (begindatum), TRUNC (einddatum)) - 1;
|
||||
RETURN NULL;
|
||||
END IF;
|
||||
|
||||
DBMS_OUTPUT.put_line ('heledagen ' || TO_CHAR (heledagen));
|
||||
|
||||
RETURN eerstedag + laatstedag + heledagen * urenperdag;
|
||||
END datumtijdnaaruitvoertijd;
|
||||
|
||||
FUNCTION getdatemillisec (i_date IN DATE)
|
||||
@@ -1874,6 +1884,8 @@ CREATE OR REPLACE PACKAGE BODY fac AS
|
||||
AS
|
||||
soms fac_srtnotificatie.fac_srtnotificatie_oms%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;
|
||||
susermode fac_srtnotificatie.fac_srtnotificatie_usermode%TYPE;
|
||||
lmode fac_srtnotificatie.fac_srtnotificatie_mode%TYPE;
|
||||
@@ -2001,8 +2013,8 @@ CREATE OR REPLACE PACKAGE BODY fac AS
|
||||
THEN
|
||||
-- Zoek de lmode van een al/nog aanwezige fac_notificatie die over hetzelfde gaat
|
||||
BEGIN
|
||||
SELECT fac_notificatie_status
|
||||
INTO oldersmode
|
||||
SELECT fac_srtnotificatie_code, fac_notificatie_status, fac_notificatie_oms
|
||||
INTO oldercode, oldersmode, oldersoms
|
||||
FROM fac_v_notifyqueue ander
|
||||
WHERE (pcode = ander.fac_srtnotificatie_code
|
||||
OR pcode = 'BESUPD'
|
||||
@@ -2029,6 +2041,15 @@ CREATE OR REPLACE PACKAGE BODY fac AS
|
||||
NULL;
|
||||
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
|
||||
THEN
|
||||
lmode := BITAND (lmode, 255 - 2);
|
||||
|
||||
Reference in New Issue
Block a user