PCHX#82938 Alleen specifieker proberen te matchen wanneer nodig, en dan nog coulant (volgens onderstaand algoritme)

svn path=/Database/branches/DB49/; revision=66651
This commit is contained in:
2024-10-16 13:27:19 +00:00
parent 8dae0eb109
commit d23f54628c

View File

@@ -15847,24 +15847,69 @@ AS
IF (ASCII (c_prefix1) = 67 OR ASCII (c_prefix1) = 99)
THEN
BEGIN
-- haal prefix 'C' of 'c' eraf
-- Haal prefix 'C' of 'c' eraf
c_contract_nr := SUBSTR (p_broc_nr, 2);
IF INSTR(p_broc_nr, '.') = 0
THEN
-- Het laatste contract met de hoogste versie nummer opvragen.
-- Er kunnen meerdere contracten zijn met dezelfde contract_key, maar met verschillende versies.
-- Het contract met de hoogste versie is de laatste.
SELECT cnt_contract_key
INTO p_broc_key
FROM ( SELECT cnt_contract_key,
cnt_contract_versie
FROM cnt_contract
WHERE cnt_contract_verwijder IS NULL
AND cnt_contract_status = 0
AND cnt_contract_nummer_intern = c_contract_nr
AND p_factuur_datum BETWEEN cnt_contract_looptijd_van AND cnt_contract_looptijd_tot
ORDER BY cnt_contract_key DESC)
WHERE ROWNUM = 1;
BEGIN
-- Het laatste contract met de hoogste versie nummer opvragen.
-- Er kunnen meerdere contracten zijn met dezelfde contract_key, maar met verschillende versies.
-- Het contract met de hoogste versie is de laatste.
SELECT cnt_contract_key
INTO p_broc_key
FROM cnt_contract
WHERE cnt_contract_verwijder IS NULL
AND cnt_contract_status = 0
AND cnt_contract_nummer_intern = c_contract_nr;
EXCEPTION
WHEN TOO_MANY_ROWS
THEN
BEGIN
-- Meerdere versies gevonden; ga specifieker zoeken
-- Bij overlappende contracten; pak het oudste contract
SELECT cnt_contract_key
INTO p_broc_key
FROM (SELECT cnt_contract_key
FROM cnt_contract
WHERE cnt_contract_verwijder IS NULL
AND cnt_contract_status = 0
AND cnt_contract_nummer_intern = c_contract_nr
AND p_factuur_datum BETWEEN cnt_contract_looptijd_van AND cnt_contract_looptijd_tot
ORDER BY cnt_contract_looptijd_van ASC)
WHERE ROWNUM = 1;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
BEGIN
-- Geen contract gevonden waarbinnen deze factuurdatum valt
-- Zoek het contract wat het recentst (mbt de factuurdatum) is afgelopen
SELECT cnt_contract_key
INTO p_broc_key
FROM (SELECT cnt_contract_key
FROM cnt_contract
WHERE cnt_contract_verwijder IS NULL
AND cnt_contract_status = 0
AND cnt_contract_nummer_intern = c_contract_nr
AND cnt_contract_looptijd_tot <= p_factuur_datum
ORDER BY cnt_contract_looptijd_tot DESC)
WHERE ROWNUM = 1;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
-- Geen contract gevonden met een einddatum die ligt voor de factuurdatum
-- Dan ligt de factuurdatum dus voor de startdatum van de eerste contract-versie; pak het eerste contract
SELECT cnt_contract_key
INTO p_broc_key
FROM (SELECT cnt_contract_key
FROM cnt_contract
WHERE cnt_contract_verwijder IS NULL
AND cnt_contract_status = 0
AND cnt_contract_nummer_intern = c_contract_nr
ORDER BY cnt_contract_looptijd_van)
WHERE ROWNUM = 1;
END;
END;
END;
ELSE
-- Exact dit contract en versie.
SELECT cnt_contract_key
@@ -23304,7 +23349,7 @@ AS
v_materiaalkosten ins_srtcontroledl_xcp.ins_srtcontroledl_xcp_materia%TYPE;
v_aantal ins_srtcontroledl_xcp.ins_srtcontroledl_xcp_aantal%TYPE;
v_aantaleh ins_srtcontroledl_xcp.ins_srtcontroledl_xcp_aanteh%TYPE;
FUNCTION maakAanduiding_taak(p_deel_key IN NUMBER, p_disc_key IN NUMBER, p_oms IN VARCHAR2, o_srtdeel_key OUT NUMBER) RETURN VARCHAR2