diff --git a/FAC/FAC_PAC.SRC b/FAC/FAC_PAC.SRC index 71cda601..b2ebd6d9 100644 --- a/FAC/FAC_PAC.SRC +++ b/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);