Files
mip/Data/BulkLoad/EFT/Nominations/Changes/Aug_2010/efno_confirmations.bdy

4270 lines
179 KiB
Plaintext

CREATE OR REPLACE PACKAGE BODY efno_confirmations IS
--
g_auto_gen BOOLEAN := FALSE;
--
PROCEDURE output_nnpcv_tab (p_nnpcv_tab IN nnpcv_tab) IS
BEGIN
caco_debug.putline('------SP_CONF: output_nnpcv_tab 001------');
FOR i IN 1..p_nnpcv_tab.COUNT LOOP
caco_debug.putline('nnpcv_tab '||i||' nnpcv_id = '||p_nnpcv_tab(i).nnpcv_id);
caco_debug.putline('nnpcv_tab '||i||' coca_id = '||p_nnpcv_tab(i).coca_id);
caco_debug.putline('nnpcv_tab '||i||' conp_id = '||p_nnpcv_tab(i).conp_id);
caco_debug.putline('nnpcv_tab '||i||' coru_id = '||p_nnpcv_tab(i).coru_id);
caco_debug.putline('nnpcv_tab '||i||' value = '||p_nnpcv_tab(i).value);
caco_debug.putline('nnpcv_tab '||i||' nomi_id = '||p_nnpcv_tab(i).nomi_id);
caco_debug.putline('nnpcv_tab '||i||' nomi_received = '||p_nnpcv_tab(i).nomi_received);
caco_debug.putline('nnpcv_tab '||i||' defaulted = '||p_nnpcv_tab(i).defaulted);
caco_debug.putline('nnpcv_tab '||i||' missing = '||p_nnpcv_tab(i).missing);
caco_debug.putline('nnpcv_tab '||i||' gas_day = '||p_nnpcv_tab(i).gas_day);
caco_debug.putline('nnpcv_tab '||i||' in_error = '||sys.diutil.bool_to_int(p_nnpcv_tab(i).in_error));
END LOOP;
caco_debug.putline('------SP_CONF: output_nnpcv_tab 999------');
END output_nnpcv_tab;
--
PROCEDURE output_nnpcv_rec (p_nnpcv_rec IN nnpcv_rec) IS
BEGIN
caco_debug.putline('------SP_CONF: output_nnpcv_rec 001------');
caco_debug.putline('nnpcv_rec nnpcv_id = '||p_nnpcv_rec.nnpcv_id);
caco_debug.putline('nnpcv_tab coca_id = '||p_nnpcv_rec.coca_id);
caco_debug.putline('nnpcv_tab conp_id = '||p_nnpcv_rec.conp_id);
caco_debug.putline('nnpcv_tab coru_id = '||p_nnpcv_rec.coru_id);
caco_debug.putline('nnpcv_tab value = '||p_nnpcv_rec.value);
caco_debug.putline('nnpcv_tab nomi_id = '||p_nnpcv_rec.nomi_id);
caco_debug.putline('nnpcv_tab nomi_received = '||p_nnpcv_rec.nomi_received);
caco_debug.putline('nnpcv_tab defaulted = '||p_nnpcv_rec.defaulted);
caco_debug.putline('nnpcv_tab missing = '||p_nnpcv_rec.missing);
caco_debug.putline('nnpcv_tab gas_day = '||p_nnpcv_rec.gas_day);
caco_debug.putline('nnpcv_tab in_error = '||sys.diutil.bool_to_int(p_nnpcv_rec.in_error));
caco_debug.putline('------SP_CONF: output_nnpcv_rec 999------');
END output_nnpcv_rec;
/**
-- PROCEDURE upd_conf_timestamp
-- Autonomous Transaction
-- Updates the confirmation timestamp with the given date
-- Used by the timestamping functions when a RETRY has been required
--
-- %param p_conf_id Unique Identifier of the confirmation to be updated
-- %param p_timestamp Successful timestamp information
--
*/
PROCEDURE upd_conf_timestamp( p_conf_id IN confirmations.conf_id%TYPE
, p_timestamp IN DATE
)
IS
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
--
--caco_debug.debug_on('Enter upd_conf_timestamp');
-- Check we have permission to be using this module.
IF NOT g_auto_gen THEN
--
IF NOT caco_security.security_check('efnow095$') THEN
RETURN;
END IF;
--
END IF;
--
BEGIN
--
UPDATE confirmations
SET confirmation_sent = p_timestamp
, approved = 'Y'
WHERE conf_id = p_conf_id;
--
COMMIT;
--
--caco_debug.debug_on('Exit upd_conf_timestamp');
--
EXCEPTION
WHEN others THEN
-- Need to log an error and email system support...
NULL;
END;
--
END upd_conf_timestamp;
--
--
FUNCTION get_interrupted_value (p_conp_id IN NUMBER,
p_coca_id IN NUMBER,
p_gas_day IN DATE)
RETURN NUMBER
IS
--
CURSOR c_int IS
SELECT icv.interrupted_value
FROM int_conp_coca_vals icv
WHERE icv.coca_id = p_coca_id
AND icv.conp_id = p_conp_id
AND icv.send_to_customer = 'Y'
AND EXISTS ( SELECT 'x'
FROM interruptions int
WHERE int.int_id = icv.int_id
AND p_gas_day >= int.gas_day_start
AND (p_gas_day <= int.gas_day_end OR int.gas_day_end IS NULL));
--
l_interrupted_value NUMBER := NULL;
--
BEGIN
--
OPEN c_int;
FETCH c_int
INTO l_interrupted_value;
IF c_int%NOTFOUND THEN
l_interrupted_value := NULL;
END IF;
CLOSE c_int;
--
RETURN l_interrupted_value;
--
END get_interrupted_value;
--
--
FUNCTION ins_lookback_cnpcv_vals( p_conf_id IN confirmations.conf_id%TYPE
, p_nnpcv_tab IN OUT nnpcv_tab
, p_nomi_id IN nominations.nomi_id%TYPE
, p_nomi_date IN nominations.created_on%TYPE
, p_return_error OUT VARCHAR2
)
RETURN BOOLEAN
IS
PRAGMA AUTONOMOUS_TRANSACTION;
--
-- Cursor to get the value for the given previous nomination and CONP COCA pair from the nnpcv_tab
CURSOR c_nnpcv( cp_conp_id IN NUMBER
, cp_coca_id IN NUMBER )
IS
SELECT nnpcv1.nnpcv_id nnpcv_id
, nnpcv1.value value
, nnpcv1.gas_day gas_day
, cnp2.nepo_id nepo_id
FROM nom_net_point_cat_vals nnpcv1
,cont_network_points cnp1
,cont_network_points cnp2
,contract_categories cc1
,contract_categories cc2
WHERE nnpcv1.nomi_id = p_nomi_id
AND cc1.cate_id = cc2.cate_id
AND cc1.coca_id = cp_coca_id
AND cc2.coca_id = nnpcv1.coca_id
AND cnp1.nepo_id = cnp2.nepo_id
AND cnp1.conp_id = cp_conp_id
AND cnp2.conp_id = nnpcv1.conp_id
AND nnpcv1.gas_day = ( SELECT MAX( nnpcv2.gas_day )
FROM nom_net_point_cat_vals nnpcv2
WHERE nnpcv2.nomi_id = p_nomi_id );
--
l_nnpcv_id nom_net_point_cat_vals.nnpcv_id%TYPE;
l_value nom_net_point_cat_vals.value%TYPE;
l_int_value nom_net_point_cat_vals.value%TYPE;
l_lb_value nom_net_point_cat_vals.value%TYPE;
l_gas_day nom_net_point_cat_vals.gas_day%TYPE;
l_success BOOLEAN := TRUE;
l_nepo_id network_points.nepo_id%TYPE;
l_interrupted conf_net_point_cat_vals.interrupted%TYPE;
--
BEGIN
caco_debug.putline('SP_CONF: ins_lookback_cnpcv_vals 001');
--
caco_debug.putline('Enter ins_lookback_cnpcv_vals with '||NVL(p_nnpcv_tab.COUNT,0)||' elements');
--
SAVEPOINT before_ins_cnpcv;
--
-- Loop through the nnpcv tab and update CNPCV with the nom values
IF NVL(p_nnpcv_tab.COUNT,0) > 0 THEN
--
<<cnpcv_insert_loop>>
FOR i IN 1..p_nnpcv_tab.COUNT LOOP
-- check if there is an interruption active
l_int_value := get_interrupted_value( p_nnpcv_tab(i).conp_id
, p_nnpcv_tab(i).coca_id
, p_nnpcv_tab(i).gas_day );
IF l_int_value IS NOT NULL THEN
caco_debug.putline('l_int_value: '||l_int_value);
END IF;
--
-- Get the value for the specific conp and coca for the given nomination
-- for the latest gas day in the valid nomination
--
OPEN c_nnpcv( p_nnpcv_tab(i).conp_id
, p_nnpcv_tab(i).coca_id );
FETCH c_nnpcv INTO l_nnpcv_id, l_lb_value, l_gas_day, l_nepo_id;
IF c_nnpcv%NOTFOUND THEN
l_success := FALSE;
END IF;
CLOSE c_nnpcv;
-- Compare the lookback value and the interrupted value and go with the lowest value
IF l_int_value IS NULL THEN
l_interrupted := 'N';
ELSE
l_interrupted := 'Y';
END IF;
--
l_value := l_lb_value;
--
IF l_success THEN
--
caco_debug.putline('Inserting values');
--
--output_nnpcv_rec(p_nnpcv_tab(i));
BEGIN
INSERT INTO conf_net_point_cat_vals
( nnpcv_id
, conf_id
, nomi_id
, value
, gas_day
, conp_id
, coca_id
, valid
, last_nomi_id
, last_nom_received
, last_gas_day
, defaulted
, interrupted )
VALUES
( l_nnpcv_id
, p_conf_id
, p_nomi_id
, l_value
, p_nnpcv_tab(i).gas_day
, p_nnpcv_tab(i).conp_id
, p_nnpcv_tab(i).coca_id
, 'Y'
, p_nomi_id
, p_nomi_date
, l_gas_day
, 'N'
, l_interrupted );
--
EXCEPTION
WHEN dup_val_on_index THEN
NULL;
WHEN others THEN
ROLLBACK TO SAVEPOINT before_ins_cnpcv;
l_success := FALSE;
p_return_error := caco_utilities.get_module_text(2311);
-- Unable to force confirm invalid nomination. Please contact support
caco_debug.putline('efno_confirmations.ins_lookback_cnpcv_vals:'
||' Failed to insert lookback confirmation value: '
||' CONP_ID : '||p_nnpcv_tab(i).conp_id||' and '
||' COCA_ID : '||p_nnpcv_tab(i).coca_id||' on '
||TO_CHAR(p_nnpcv_tab(i).gas_day,'DD-MON-YYYY')
||chr(10)||'SQLERRM : '||sqlerrm(sqlcode) );
--
-- Write an error and carry on
--
cout_err.report_and_go( p_exception_number => sqlcode
, p_exception_message => ' Failed to insert lookback confirmation value: '
||' CONP_ID : '||p_nnpcv_tab(i).conp_id||' and '
||' COCA_ID : '||p_nnpcv_tab(i).coca_id||' on '
||TO_CHAR(p_nnpcv_tab(i).gas_day,'DD-MON-YYYY')
||chr(10)||'SQLERRM : '||sqlerrm(sqlcode)
, p_source => 'efno_confirmations.ins_lookback_cnpcv_vals');
--
EXIT cnpcv_insert_loop;
END;
--
END IF;
--
END LOOP cnpcv_insert_loop;
--
COMMIT;
--
END IF;
--
caco_debug.putline('SP_CONF: ins_lookback_cnpcv_vals 999');
RETURN l_success;
--
END ins_lookback_cnpcv_vals;
--
--
FUNCTION default_lookback( p_conf_id IN confirmations.conf_id%TYPE
, p_nomi_id IN nominations.nomi_id%TYPE
, p_contract_id IN contracts.cont_id%TYPE
, p_lookback_date IN DATE
, p_lookback_action IN contracts.lookback_action%TYPE
, p_nnpcv_tab IN nnpcv_tab
, p_return_error OUT VARCHAR2 )
RETURN BOOLEAN
IS
-- Require a cursor to list all "tip" nominations for the contract
CURSOR c_nominations(cp_lookback_action IN VARCHAR2) IS
SELECT nomi.nomi_id
, nomi.created_on
, nomi.status
, cont1.cust_id
FROM nominations nomi
,contracts cont1
WHERE nomi.cont_id = cont1.cont_id
AND cont1.cont_id IN (SELECT cont2.cont_id
FROM contracts cont2
CONNECT BY PRIOR cont2.prev_cont_id = cont2.cont_id
START WITH cont2.cont_id = p_contract_id)
AND ( nomi.nomi_id < p_nomi_id
OR p_nomi_id IS NULL )
AND EXISTS ( SELECT NULL
FROM nom_net_point_cat_vals nnpcv
WHERE nnpcv.nomi_id = nomi.nomi_id
GROUP BY nnpcv.gas_day
HAVING MIN(nnpcv.gas_day) <= (SELECT gas_day FROM confirmations WHERE conf_id = p_conf_id)
AND MIN(nnpcv.gas_day) >= p_lookback_date )
-- AND ( ( nomi.status = 'A' -- 'A' will be the TIP each day
AND ( cp_lookback_action = 'T'
AND ( nomi_id IN ((SELECT nomi_id
FROM ( SELECT DISTINCT n.nomi_id, n.gas_day, no.created_on, RANK() OVER (partition by gas_day ORDER BY gas_day, no.created_on DESC) nom_rank
FROM nom_net_point_cat_vals n
,nominations no
,contracts c
WHERE n.nomi_id = no.nomi_id
AND no.cont_id = c.cont_id
AND no.status = 'A' -- SP 19/10/2009 moved here to improve performance
AND c.cont_id IN (SELECT c2.cont_id
FROM contracts c2
CONNECT BY PRIOR c2.prev_cont_id = c2.cont_id
START WITH c2.cont_id = p_contract_id)
)
WHERE nom_rank = 1))
)
-- )
OR ( cp_lookback_action = 'A'
)
)
ORDER BY ( SELECT MAX(nnpcv.gas_day)
FROM nom_net_point_cat_vals nnpcv
WHERE nnpcv.nomi_id = nomi.nomi_id
) DESC, nomi.created_on DESC;
/*
SELECT nomi.nomi_id
, nomi.created_on
, nomi.status
, cont1.cust_id
FROM nominations nomi
,contracts cont1
,contracts cont2
WHERE nomi.cont_id = cont1.cont_id
AND cont1.cust_id = cont2.cust_id
AND cont2.cont_id = p_contract_id
AND ( nomi.nomi_id < p_nomi_id
OR p_nomi_id IS NULL )
AND EXISTS ( SELECT NULL
FROM nom_net_point_cat_vals nnpcv
WHERE nnpcv.nomi_id = nomi.nomi_id
GROUP BY nnpcv.gas_day
HAVING MIN(nnpcv.gas_day) <= (SELECT gas_day FROM confirmations WHERE conf_id = p_conf_id)
AND MIN(nnpcv.gas_day) >= p_lookback_date )
-- AND ( ( nomi.status = 'A' -- 'A' will be the TIP each day
AND ( cp_lookback_action = 'T'
AND ( nomi_id IN ((SELECT nomi_id
FROM ( SELECT DISTINCT n.nomi_id, n.gas_day, no.created_on, RANK() OVER (partition by gas_day ORDER BY gas_day, no.created_on DESC) nom_rank
FROM nom_net_point_cat_vals n
,nominations no
,contracts c
,contracts c2
WHERE n.nomi_id = no.nomi_id
AND no.cont_id = c.cont_id
AND no.status = 'A' -- SP 19/10/2009 moved here to improve performance
AND c.cust_id = c2.cust_id
AND c2.cont_id = p_contract_id
)
WHERE nom_rank = 1))
)
-- )
OR ( cp_lookback_action = 'A'
)
)
ORDER BY ( SELECT MAX(nnpcv.gas_day)
FROM nom_net_point_cat_vals nnpcv
WHERE nnpcv.nomi_id = nomi.nomi_id
) DESC, nomi.created_on DESC;
*/
--
l_nnpcv_tab nnpcv_tab;
--
l_success BOOLEAN := FALSE;
--
BEGIN
--
caco_debug.putline('SP_CONF: default_lookback 001');
caco_debug.putline('p_conf_id: '||p_conf_id||
' p_nomi_id: '||p_nomi_id||
' p_contract_id: '||p_contract_id||
' p_lookback_date: '||p_lookback_date||
' p_lookback_action: '||p_lookback_action||
' p_return_error: '||p_return_error);
--
l_nnpcv_tab := p_nnpcv_tab;
--
<<nom_lookback_loop>>
FOR r IN c_nominations(NVL(p_lookback_action, 'A')) LOOP
--
l_success := TRUE;
caco_debug.putline('we have a nom to look back at: nomi_id = '||r.nomi_id);
--
--
caco_debug.putline('Update nominated values');
--
l_success := ins_lookback_cnpcv_vals( p_conf_id => p_conf_id
, p_nnpcv_tab => l_nnpcv_tab
, p_nomi_id => r.nomi_id
, p_nomi_date => r.created_on
, p_return_error => p_return_error
);
--
-- Exit the loop - we got values for the cnpcv_id's..
-- so there is no point looking back any further.
--
EXIT nom_lookback_loop;
--
END LOOP nom_lookback_loop;
--
caco_debug.putline('SP_CONF: default_lookback 999');
RETURN l_success;
--
EXCEPTION
WHEN others THEN
-- Write an error and carry on
cout_err.report_and_go( p_exception_number => sqlcode
, p_exception_message => ' Failed in default_lookback: '
||' Error : '||sqlerrm(sqlcode)
, p_source => 'efno_confirmations.default_lookback' );
--
caco_debug.putline('SP_CONF: error in default_lookback: '||sqlerrm);
l_success := FALSE;
-- An unexpected error has occurred while creating confirmation. Please contact support
p_return_error := caco_utilities.get_module_text(2212);
END default_lookback;
--
--
/**
-- FUNCTION remove_surplus_cnpcv RETURN BOOLEAN
-- Autonomous Transaction
-- Returns TRUE if successful
-- If the contract has been amended between nomination and confirmation this
-- Ensures that the confirmation contains only network points and categories
-- that are valid for the contract at point of confirmation
--
-- %param p_conf_id Unique Identifier of the confirmation to be updated
-- %param p_cont_id Unique identifier of the contract to which this confirmation relates
-- %param p_return_error OUT: Error message in the case of an unexpected error
--
*/
FUNCTION remove_surplus_cnpcv( p_conf_id IN confirmations.conf_id%TYPE
, p_cont_id IN contracts.cont_id%TYPE
, p_return_error OUT VARCHAR2 )
RETURN BOOLEAN
IS
PRAGMA AUTONOMOUS_TRANSACTION;
--
l_success BOOLEAN := TRUE;
l_tmpstr VARCHAR2(1000);
--
BEGIN
--
p_return_error := NULL;
--
SAVEPOINT before_delete;
-- Anonymous block to handle exceptions
BEGIN
--
-- Remove invalid network points
--
DELETE conf_net_point_cat_vals
WHERE conf_id = p_conf_id
AND conp_id NOT IN ( SELECT conp.conp_id
FROM cont_network_points conp
WHERE conp.cont_id = p_cont_id );
--
-- Remove invalid categories
--
DELETE conf_net_point_cat_vals
WHERE conf_id = p_conf_id
AND coca_id NOT IN ( SELECT coca.coca_id
FROM contract_categories coca
WHERE coca.cont_id = p_cont_id );
--
COMMIT;
--
EXCEPTION
WHEN others THEN
ROLLBACK TO SAVEPOINT before_delete;
-- Write an error and carry on
cout_err.report_and_go( p_exception_number => sqlcode
, p_exception_message => ' Failed to delete surplus cnppv: '
||' CONF_ID : '||p_conf_id||chr(10)
||' CONT_ID : '||p_cont_id||chr(10)
||' Error : '||sqlerrm(sqlcode)
, p_source => 'efno_confirmations.remove_surplus_cnpcv' );
--
l_success := FALSE;
-- An unexpected error has occurred while creating confirmation. Please contact support
p_return_error := caco_utilities.get_module_text(2212);
--
END;
--
RETURN l_success;
--
END remove_surplus_cnpcv;
--
-- Function to calculate the exception value based on the percentage split and virtual network point values
--
FUNCTION get_cnppv_emo_exp_value (p_conp_id IN NUMBER
, p_coca_id IN NUMBER
, p_exception IN VARCHAR2
, p_cont_id IN contracts.cont_id%TYPE
, p_success OUT BOOLEAN
, p_return_error OUT VARCHAR2 )
RETURN NUMBER
IS
--
-- Cursor to get the Percentage Split value of the virtual network point from cnppv table
CURSOR c_vnp_per_split IS
SELECT cnppv.value value
FROM parameters pars
, cont_network_points conp
, contract_parameters copa
, network_points nepo
, cont_net_point_param_vals cnppv
WHERE copa.pars_id = pars.pars_id
AND copa.copa_id = cnppv.copa_id
AND conp.conp_id = cnppv.conp_id
AND conp.cont_id = p_cont_id
AND conp.nepo_id = nepo.nepo_id
AND nepo.nepo_type = 'V'
AND pars.name IN (g_perc_split_en, g_perc_split_hu);
--
-- Cursor to get the Percentage Split values from cnppv table
CURSOR c_cnppv_per_split(cp_conp_id IN NUMBER) IS
SELECT cnppv.value value
FROM parameters pars
, cont_network_points conp
, contract_parameters copa
, cont_net_point_param_vals cnppv
WHERE copa.pars_id = pars.pars_id
AND copa.copa_id = cnppv.copa_id
AND conp.conp_id = cnppv.conp_id
AND conp.conp_id = cp_conp_id
AND conp.cont_id = p_cont_id
AND pars.name IN (g_perc_split_en, g_perc_split_hu);
--
-- Cursor to get the exception value for the virtual network point of a given
-- contract category
CURSOR c_cnppv_emo_exp(cp_coca_id IN NUMBER,
cp_exception IN VARCHAR2) IS
SELECT cnppv.value
FROM cont_net_point_param_vals cnppv
, contract_parameters copa
, parameters pars
, contract_categories coca
, cont_network_points conp
, network_points nepo
WHERE cnppv.copa_id = copa.copa_id
AND copa.pars_id = pars.pars_id
AND SUBSTR(UPPER(pars.code),-3) = cp_exception
AND pars.cate_id = coca.cate_id
AND coca.coca_id = cp_coca_id
AND conp.cont_id = p_cont_id
AND cnppv.conp_id = conp.conp_id
AND nepo.nepo_id = conp.nepo_id
AND nepo.nepo_type = 'V';
--
l_perc_split cont_net_point_param_vals.value%TYPE;
l_emo_exp_value cont_net_point_param_vals.value%TYPE;
l_tot_perc_split cont_net_point_param_vals.value%TYPE;
l_cont_value cont_net_point_param_vals.value%TYPE := 0;
l_success BOOLEAN := TRUE;
--
BEGIN
caco_debug.putline('SP_CONF: get_cnppv_emo_exp_value 001');
-- get the Percentage Split value of the virtual network point from cnppv table
OPEN c_vnp_per_split;
FETCH c_vnp_per_split INTO l_tot_perc_split;
CLOSE c_vnp_per_split;
--
-- get the percentage split value of the network point
OPEN c_cnppv_per_split(p_conp_id);
FETCH c_cnppv_per_split INTO l_perc_split;
IF c_cnppv_per_split%NOTFOUND THEN
CLOSE c_cnppv_per_split;
--
l_success := FALSE;
p_return_error := caco_utilities.get_module_text(2337);
-- Unable to find contracted value for invalid nomination. Please contact support
caco_debug.putline('efno_confirmations.create_missing_cnpcv: Unable to locate Percentage Split parameter for: '
||' CONP_ID : '||p_conp_id);
--
END IF;
CLOSE c_cnppv_per_split;
-- get the virtual network point validation exception value
IF l_success THEN
OPEN c_cnppv_emo_exp(p_coca_id,
p_exception);
FETCH c_cnppv_emo_exp INTO l_emo_exp_value;
IF c_cnppv_emo_exp%NOTFOUND THEN
CLOSE c_cnppv_emo_exp;
--
l_success := FALSE;
p_return_error := caco_utilities.get_module_text(2337);
-- Unable to find contracted value for invalid nomination. Please contact support
caco_debug.putline('efno_confirmations.create_missing_cnpcv: Unable to locate VNP CTR value for: '
||' COCA_ID : '||p_coca_id);
--
END IF;
CLOSE c_cnppv_emo_exp;
-- calculate the exception value based on the percentage split and virtual network point values
l_cont_value := ROUND((l_perc_split/l_tot_perc_split)*l_emo_exp_value);
--
END IF;
p_success := l_success;
caco_debug.putline('SP_CONF: get_cnppv_emo_exp_value 999');
RETURN l_cont_value;
--
END get_cnppv_emo_exp_value;
--
--
--
/**
-- FUNCTION create_missing_cnpcv RETURN BOOLEAN
-- Autonomous Transaction
-- Returns TRUE if successful
-- If the contract has been amended between nomination and confirmation this
-- Ensures that the confirmation contains any additional network points and categories
-- that have been added
--
-- %param p_conf_id Unique Identifier of the confirmation to be updated
-- %param p_nomi_id Unique identifier of the nomination to which this confirmation relates
-- %param p_nnpcv_tab
-- %param p_return_error OUT: Error message in the case of an unexpected error
--
*/
PROCEDURE create_missing_cnpcv( p_conf_id IN confirmations.conf_id%TYPE
, p_nomi_id IN nominations.nomi_id%TYPE
, p_nnpcv_tab IN OUT nnpcv_tab
, p_exception IN contracts.validation_exception%TYPE
, p_validation_action IN contracts.validation_action%TYPE
, p_success OUT BOOLEAN
, p_return_error OUT VARCHAR2
, p_defaulted IN VARCHAR2 DEFAULT 'Y'
, p_cont_id IN contracts.cont_id%TYPE
, p_lookback_date IN DATE
, p_lookback_action IN contracts.lookback_action%TYPE)
IS
PRAGMA AUTONOMOUS_TRANSACTION;
--
-- Cursor to get the minimum value for a given CONP and COCA pair
CURSOR c_cnppv_min( cp_conp_id IN NUMBER
, cp_coca_id IN NUMBER )
IS
SELECT cnppv.value
FROM cont_net_point_param_vals cnppv
, contract_parameters copa
, parameters pars
, contract_categories coca
WHERE cnppv.conp_id = cp_conp_id
AND cnppv.copa_id = copa.copa_id
AND copa.pars_id = pars.pars_id
AND SUBSTR(UPPER(pars.code),-3) = 'MIN' -- Need the MIN parameter
AND pars.cate_id = coca.cate_id
AND coca.coca_id = cp_coca_id;
--
-- Cursor to get the contracted value for a given CONP and COCA pair
CURSOR c_cnppv_ctr( cp_conp_id IN NUMBER
, cp_coca_id IN NUMBER )
IS
SELECT cnppv.value
FROM cont_net_point_param_vals cnppv
, contract_parameters copa
, parameters pars
, contract_categories coca
WHERE cnppv.conp_id = cp_conp_id
AND cnppv.copa_id = copa.copa_id
AND copa.pars_id = pars.pars_id
AND SUBSTR(UPPER(pars.code),-3) = 'CTR' -- Need the CTR parameter
AND pars.cate_id = coca.cate_id
AND coca.coca_id = cp_coca_id;
--
-- Cursor to get the maximum value for a given CONP and COCA pair
CURSOR c_cnppv_max( cp_conp_id IN NUMBER
, cp_coca_id IN NUMBER )
IS
SELECT cnppv.value
FROM cont_net_point_param_vals cnppv
, contract_parameters copa
, parameters pars
, contract_categories coca
WHERE cnppv.conp_id = cp_conp_id
AND cnppv.copa_id = copa.copa_id
AND copa.pars_id = pars.pars_id
AND SUBSTR(UPPER(pars.code),-3) = 'MAX' -- Need the MAX parameter
AND pars.cate_id = coca.cate_id
AND coca.coca_id = cp_coca_id;
--
l_value conf_net_point_cat_vals.value%TYPE;
l_int_value conf_net_point_cat_vals.value%TYPE;
l_cont_value conf_net_point_cat_vals.value%TYPE;
l_success BOOLEAN := TRUE;
l_interrupted conf_net_point_cat_vals.interrupted%TYPE;
--
BEGIN
caco_debug.putline('SP_CONF: create_missing_cnpcv 001');
SAVEPOINT before_create_missing;
p_success := TRUE;
p_return_error := NULL;
--
--output_nnpcv_tab(p_nnpcv_tab);
IF NVL(p_nnpcv_tab.COUNT,0) > 0 THEN
IF p_validation_action = 'B' THEN
l_success := default_lookback( p_conf_id
, p_nomi_id
, p_cont_id
, p_lookback_date
, p_lookback_action
, p_nnpcv_tab
, p_return_error );
END IF;
/*
if sub OR lookback failed
...existing code, remove +10
end if;
*/
IF NOT l_success OR p_validation_action = 'T' THEN
caco_debug.putline('SP_CONF: create_missing_cnpcv 555: using contract vals');
<<cnppv_loop>>
FOR i IN 1..p_nnpcv_tab.COUNT LOOP
IF NVL(p_nnpcv_tab(i).missing, 'N') = 'Y' THEN
--
-- Get the interrupted value if there is one
l_int_value := get_interrupted_value( p_nnpcv_tab(i).conp_id
, p_nnpcv_tab(i).coca_id
, p_nnpcv_tab(i).gas_day );
--
-- Get the contract value depending on the validation exception
IF p_exception = 'CO' THEN
--
IF efno_contracts.emo_contract(p_cont_id) = 'Y' THEN
--
-- calculate the exception value based on the percentage split and
-- virtual network point values
l_cont_value := get_cnppv_emo_exp_value(p_nnpcv_tab(i).conp_id
, p_nnpcv_tab(i).coca_id
, 'CTR'
, p_cont_id
, p_success
, p_return_error);
IF NOT p_success THEN
EXIT cnppv_loop;
END IF;
ELSE
OPEN c_cnppv_ctr( p_nnpcv_tab(i).conp_id
, p_nnpcv_tab(i).coca_id );
FETCH c_cnppv_ctr INTO l_cont_value;
IF c_cnppv_ctr%NOTFOUND THEN
CLOSE c_cnppv_ctr;
--
p_success := FALSE;
p_return_error := caco_utilities.get_module_text(2337);
-- Unable to find contracted value for invalid nomination. Please contact support
caco_debug.putline('efno_confirmations.create_missing_cnpcv: Unable to locate Contract parameter CTR for: '
||' CONP_ID : '||p_nnpcv_tab(i).conp_id||' and '
||' COCA_ID : '||p_nnpcv_tab(i).coca_id );
--
EXIT cnppv_loop;
END IF;
CLOSE c_cnppv_ctr;
END IF;
--
ELSIF p_exception = 'MI' THEN -- Minimum
--
IF efno_contracts.emo_contract(p_cont_id) = 'Y' THEN
--
-- calculate the exception value based on the percentage split and
-- virtual network point values
l_cont_value := get_cnppv_emo_exp_value(p_nnpcv_tab(i).conp_id
, p_nnpcv_tab(i).coca_id
, 'MIN'
, p_cont_id
, p_success
, p_return_error);
IF NOT p_success THEN
EXIT cnppv_loop;
END IF;
ELSE
OPEN c_cnppv_min( p_nnpcv_tab(i).conp_id
, p_nnpcv_tab(i).coca_id );
FETCH c_cnppv_min INTO l_cont_value;
IF c_cnppv_min%NOTFOUND THEN
CLOSE c_cnppv_min;
--
p_success := FALSE;
p_return_error := caco_utilities.get_module_text(2310);
-- Unable to find minimum value for invalid nomination. Please contact support
caco_debug.putline('efno_confirmations.create_missing_cnpcv: Unable to locate Contract parameter MIN for: '
||' CONP_ID : '||p_nnpcv_tab(i).conp_id||' and '
||' COCA_ID : '||p_nnpcv_tab(i).coca_id );
--
EXIT cnppv_loop;
END IF;
CLOSE c_cnppv_min;
END IF;
--
ELSIF p_exception IN ('MA', 'EX') THEN -- Maximum
--
IF efno_contracts.emo_contract(p_cont_id) = 'Y' THEN
--
-- calculate the exception value based on the percentage split and
-- virtual network point values
l_cont_value := get_cnppv_emo_exp_value(p_nnpcv_tab(i).conp_id
, p_nnpcv_tab(i).coca_id
, 'MAX'
, p_cont_id
, p_success
, p_return_error);
IF NOT p_success THEN
EXIT cnppv_loop;
END IF;
ELSE
OPEN c_cnppv_max( p_nnpcv_tab(i).conp_id
, p_nnpcv_tab(i).coca_id );
FETCH c_cnppv_max INTO l_cont_value;
IF c_cnppv_max%NOTFOUND THEN
CLOSE c_cnppv_max;
--
p_success := FALSE;
p_return_error := caco_utilities.get_module_text(2310);
-- Unable to find minimum value for invalid nomination. Please contact support
caco_debug.putline('efno_confirmations.create_missing_cnpcv: Unable to locate Contract parameter MAX for: '
||' CONP_ID : '||p_nnpcv_tab(i).conp_id||' and '
||' COCA_ID : '||p_nnpcv_tab(i).coca_id );
--
EXIT cnppv_loop;
END IF;
CLOSE c_cnppv_max;
END IF;
--
/* IF p_exception = 'EX' THEN
caco_debug.putline('SP_CONF: create_missing_cnpcv (adding + 10) 500');
l_value := l_value + 10;
END IF;*/
--
END IF;
-- Compare the contract value and the interrupted value and go with the lowest value
IF l_int_value IS NULL THEN
l_value := l_cont_value;
l_interrupted := 'N';
ELSE
IF l_int_value > l_cont_value THEN
l_value := l_cont_value;
ELSE
l_value := l_int_value;
END IF;
l_interrupted := 'Y';
END IF;
--
--output_nnpcv_rec(p_nnpcv_tab(i));
BEGIN
INSERT INTO conf_net_point_cat_vals
( conf_id
, nomi_id
, value
, gas_day
, conp_id
, coca_id
, valid
, defaulted
, interrupted
, last_gas_day )
VALUES
( p_conf_id
, p_nomi_id
, l_value
, p_nnpcv_tab(i).gas_day
, p_nnpcv_tab(i).conp_id
, p_nnpcv_tab(i).coca_id
, 'Y'
-- , p_defaulted --05/03/08 SP replaced with 'Y' to repress nom date on confirmation
, 'Y'
, l_interrupted
, NULL );
EXCEPTION
WHEN dup_val_on_index THEN
NULL;
WHEN others THEN
ROLLBACK TO SAVEPOINT before_create_missing;
p_success := FALSE;
p_return_error := caco_utilities.get_module_text(2311);
-- Unable to force confirm invalid nomination. Please contact support
caco_debug.putline('efno_confirmations.create_missing_cnpcv:'
||' Failed to insert default confirmation value: '
||' CONP_ID : '||p_nnpcv_tab(i).conp_id||' and '
||' COCA_ID : '||p_nnpcv_tab(i).coca_id||' on '
||TO_CHAR(p_nnpcv_tab(i).gas_day,'DD-MON-YYYY')
||chr(10)||'SQLERRM : '||sqlerrm(sqlcode) );
--
-- Write an error and carry on
cout_err.report_and_go( p_exception_number => sqlcode
, p_exception_message => ' Failed to insert default confirmation value: '
||' CONP_ID : '||p_nnpcv_tab(i).conp_id||' and '
||' COCA_ID : '||p_nnpcv_tab(i).coca_id||' on '
||TO_CHAR(p_nnpcv_tab(i).gas_day,'DD-MON-YYYY')
||chr(10)||'SQLERRM : '||sqlerrm(sqlcode)
, p_source => 'efno_confirmations.create_missing_cnpcv');
--
EXIT cnppv_loop;
END;
--
END IF;
--
END LOOP cnppv_loop;
END IF;
--
--
IF p_success THEN
COMMIT;
END IF;
--
END IF;
--
caco_debug.putline('SP_CONF: create_missing_cnpcv 999');
END create_missing_cnpcv;
--
--
FUNCTION add_missing_cnpcv( p_conf_id IN confirmations.conf_id%TYPE
, p_nomi_id IN nominations.nomi_id%TYPE
, p_contract_row IN contracts%ROWTYPE
, p_gas_day IN DATE
, p_return_error OUT VARCHAR2
, p_defaulted IN VARCHAR2 DEFAULT 'Y' )
RETURN BOOLEAN
IS
l_success BOOLEAN := TRUE;
--
l_cnpcv_tab nnpcv_tab;
l_counter NUMBER := 0;
l_lookback_date DATE;
--
l_only_short_day VARCHAR2(1) := 'N';
l_cont_long_day VARCHAR2(1) := 'N';
--
BEGIN
caco_debug.putline('SP_CONF: add_missing_cnpcv 001');
p_return_error := NULL;
l_lookback_date := p_gas_day - p_contract_row.validation_window;
-- Check to see if the gas day we are looking at is a long or short day
IF cout_dates.hours_in_gas_day(p_gas_day) = 25 THEN
l_cont_long_day := 'Y';
END IF;
IF cout_dates.hours_in_gas_day(p_gas_day) = 23 THEN
l_only_short_day := 'Y';
END IF;
--
-- Check if there are missing Network Points
caco_debug.putline('Enter add missing'||p_contract_row.cont_id||':'||p_conf_id);
FOR r IN ( SELECT DISTINCT conp.conp_id conp_id
FROM cont_network_points conp
WHERE conp.cont_id = p_contract_row.cont_id
AND NOT EXISTS ( SELECT 'x'
FROM conf_net_point_cat_vals cnpcv
WHERE cnpcv.conf_id = p_conf_id
AND cnpcv.conp_id = conp.conp_id )
)
LOOP
caco_debug.putline('In nepo: '||r.conp_id);
-- Add a missing entry for each network point for all categories
FOR r2 IN ( SELECT coca.coca_id coca_id
FROM contract_categories coca
,categories cate
WHERE coca.cont_id = p_contract_row.cont_id
AND cate.cate_id = coca.cate_id
AND ((cate.display_cond = 'LO' AND l_cont_long_day = 'Y') OR
(cate.display_cond = 'SH' AND l_only_short_day = 'N') OR
cate.display_cond = 'AL'))
LOOP
l_counter := l_counter + 1;
--
l_cnpcv_tab(l_counter).conp_id := r.conp_id;
l_cnpcv_tab(l_counter).coca_id := r2.coca_id;
l_cnpcv_tab(l_counter).gas_day := p_gas_day;
l_cnpcv_tab(l_counter).missing := 'Y';
--
END LOOP;
--
END LOOP;
--
IF l_counter > 0 THEN
-- create the missing entries
caco_debug.putline('SP_CONF: add_missing_cnpcv missing nepo 100');
create_missing_cnpcv( p_conf_id => p_conf_id
, p_nomi_id => p_nomi_id
, p_nnpcv_tab => l_cnpcv_tab
, p_exception => p_contract_row.validation_exception
, p_validation_action => p_contract_row.validation_action
, p_success => l_success
, p_return_error => p_return_error
, p_defaulted => p_defaulted
, p_cont_id => p_contract_row.cont_id
, p_lookback_date => l_lookback_date
, p_lookback_action => p_contract_row.lookback_action );
--
END IF;
--
IF l_success THEN
--
l_counter := 0;
l_cnpcv_tab.DELETE;
--
-- Now check for missing Categories
FOR r IN ( SELECT DISTINCT coca.coca_id coca_id
FROM contract_categories coca
,categories cate
WHERE coca.cont_id = p_contract_row.cont_id
AND cate.cate_id = coca.cate_id
AND ((cate.display_cond = 'LO' AND l_cont_long_day = 'Y') OR
(cate.display_cond = 'SH' AND l_only_short_day = 'N') OR
cate.display_cond = 'AL')
AND NOT EXISTS ( SELECT 'x'
FROM conf_net_point_cat_vals cnpcv
WHERE cnpcv.conf_id = p_conf_id
AND cnpcv.coca_id = coca.coca_id )
)
LOOP
caco_debug.putline('In coca: '||r.coca_id);
-- Add a missing entry for each category for all network point
FOR r2 IN ( SELECT conp.conp_id conp_id
FROM cont_network_points conp
WHERE conp.cont_id = p_contract_row.cont_id )
LOOP
l_counter := l_counter + 1;
--
l_cnpcv_tab(l_counter).conp_id := r2.conp_id;
l_cnpcv_tab(l_counter).coca_id := r.coca_id;
l_cnpcv_tab(l_counter).gas_day := p_gas_day;
l_cnpcv_tab(l_counter).missing := 'Y';
--
END LOOP;
--
END LOOP;
--
IF l_counter > 0 THEN
-- create the missing entries
caco_debug.putline('SP_CONF: add_missing_cnpcv missing cate 200');
create_missing_cnpcv( p_conf_id => p_conf_id
, p_nomi_id => p_nomi_id
, p_nnpcv_tab => l_cnpcv_tab
, p_exception => p_contract_row.validation_exception
, p_validation_action => p_contract_row.validation_action
, p_success => l_success
, p_return_error => p_return_error
, p_defaulted => p_defaulted
, p_cont_id => p_contract_row.cont_id
, p_lookback_date => l_lookback_date
, p_lookback_action => p_contract_row.lookback_action );
--
END IF;
--
END IF;
--
caco_debug.putline('SP_CONF: add_missing_cnpcv 999');
RETURN l_success;
--
END add_missing_cnpcv;
--
FUNCTION replace_cnpcv( p_conf_id IN confirmations.conf_id%TYPE
, p_nnpcv_tab IN nnpcv_tab
, p_exception IN contracts.validation_exception%TYPE
, p_return_error OUT VARCHAR2 )
RETURN BOOLEAN
IS
PRAGMA AUTONOMOUS_TRANSACTION;
-- Cursor to select the Contract Category Maximum
CURSOR c_contract_val( cp_conp_id IN NUMBER
, cp_coca_id IN NUMBER
, cp_type IN VARCHAR2 )
IS
SELECT cnppv.value
FROM cont_net_point_param_vals cnppv
, contract_parameters copa
, parameters pars
, contract_categories coca
, categories cate
, contracts cont
WHERE cnppv.conp_id = cp_conp_id
AND cnppv.copa_id = copa.copa_id
AND cont.cont_id = coca.cont_id
AND copa.pars_id = pars.pars_id
AND SUBSTR(UPPER(pars.code),-3) = NVL(DECODE(cont.validation_exception, 'CO','CTR','MI','MIN','MA','MAX'),'MAX')
AND pars.cate_id = cate.cate_id
AND coca.cate_id = cate.cate_id
AND coca.coca_id = cp_coca_id;
--
-- Cursor to get the correct row from CNPCV table
CURSOR c_cnpcv( cp_conp_id IN NUMBER
, cp_coca_id IN NUMBER
, cp_gas_day IN DATE )
IS
SELECT cnpcv.*
FROM conf_net_point_cat_vals cnpcv
WHERE conf_id = p_conf_id
AND conp_id = cp_conp_id
AND coca_id = cp_coca_id
AND gas_day = cp_gas_day
FOR UPDATE;
--
l_cnpcv_row c_cnpcv%ROWTYPE;
l_contract_value NUMBER := 0;
--
l_success BOOLEAN := TRUE;
--
BEGIN
caco_debug.putline('SP_CONF: replace_cnpcv 001');
--
SAVEPOINT before_replace;
--
IF NVL(p_nnpcv_tab.COUNT,0) > 0 THEN
--
<<replace_loop>>
FOR i IN 1..p_nnpcv_tab.COUNT LOOP
-- Reset temp variables
l_cnpcv_row := NULL;
l_contract_value := 0;
--
IF p_nnpcv_tab(i).in_error THEN
--
caco_debug.putline('REPLACE(conp|coca) '||p_exception||': '||p_nnpcv_tab(i).conp_id||':'||p_nnpcv_tab(i).coca_id||':-'||sys.diutil.bool_to_int(p_nnpcv_tab(i).in_error));
--
OPEN c_contract_val( p_nnpcv_tab(i).conp_id
, p_nnpcv_tab(i).coca_id
, p_exception
);
FETCH c_contract_val
INTO l_contract_value;
IF c_contract_val%NOTFOUND THEN
--
CLOSE c_contract_val;
-- bit of a problem - contract is messaed up somewhere...
-- don't know what to do here - no guidance.
ROLLBACK TO SAVEPOINT before_replace;
l_success := FALSE;
p_return_error := caco_utilities.get_module_text(2313);
-- Unable to locate contract parameter maximum. Please contact support
caco_debug.putline('efno_confirmations.replace_cnpcv: Unable to locate Contract parameter '||p_exception||' for: '
||' CONP_ID : '||p_nnpcv_tab(i).conp_id||' and '
||' COCA_ID : '||p_nnpcv_tab(i).coca_id );
EXIT replace_loop;
--
ELSE
CLOSE c_contract_val;
END IF;
--
OPEN c_cnpcv( p_nnpcv_tab(i).conp_id
, p_nnpcv_tab(i).coca_id --con_val.coca_id --p_nnpcv_tab(i).coca_id
, p_nnpcv_tab(i).gas_day );
FETCH c_cnpcv
INTO l_cnpcv_row;
IF c_cnpcv%FOUND THEN
--
caco_debug.putline('DEBUG1');
UPDATE conf_net_point_cat_vals cnpcv
SET cnpcv.value = l_contract_value
,cnpcv.defaulted = 'Y'
,cnpcv.last_nomi_id = NULL
,cnpcv.last_nom_received = NULL
WHERE CURRENT OF c_cnpcv;
--
caco_debug.putline('Updated conf_id: '||l_cnpcv_row.conf_id||' conp_id: '||l_cnpcv_row.conp_id||' coca_id: '||l_cnpcv_row.coca_id);
--
-- Now update the others that are for the same network point
--
caco_debug.putline('DEBUG2');
UPDATE conf_net_point_cat_vals cnpcvz
SET ( cnpcvz.value
, cnpcvz.defaulted
, cnpcvz.last_nomi_id
, cnpcvz.last_nom_received
) =
( SELECT cnppv.value
, 'Y'
, NULL
, NULL
FROM cont_net_point_param_vals cnppv
, contract_parameters copa
, parameters pars
, contract_categories coca
, categories cate
, contracts cont
WHERE cnppv.conp_id = p_nnpcv_tab(i).conp_id
AND cnppv.copa_id = copa.copa_id
AND cont.cont_id = coca.cont_id
AND copa.pars_id = pars.pars_id
AND SUBSTR(UPPER(pars.code),-3) = NVL(DECODE(cont.validation_exception, 'CO','CTR','MI','MIN','MA','MAX'),'MAX')
AND pars.cate_id = cate.cate_id
AND coca.cate_id = cate.cate_id
AND coca.coca_id = cnpcvz.coca_id
)
WHERE cnpcvz.conf_id = p_conf_id
AND cnpcvz.conp_id = p_nnpcv_tab(i).conp_id
AND cnpcvz.coca_id <> p_nnpcv_tab(i).coca_id;
--
CLOSE c_cnpcv;
ELSE
CLOSE c_cnpcv;
-- Problem - couldnt find the nnpcv_id in the CNPCV table
ROLLBACK TO SAVEPOINT before_replace;
--
l_success := FALSE;
p_return_error := caco_utilities.get_module_text(2314);
-- Unable to locate data. Please contact support
caco_debug.putline('efno_confirmations.replace_cnpcv: Unable to locate data in conf_net_point_cat_vals: '
||' CONF_ID : '||p_conf_id
||' CONP_ID : '||p_nnpcv_tab(i).conp_id
||' COCA_ID : '||p_nnpcv_tab(i).coca_id
||' GAS_DAY : '||TO_DATE(p_nnpcv_tab(i).gas_day,'DD-MON-YYYY') );
EXIT replace_loop;
--
END IF;
--
END IF;
--
END LOOP truncate_to_max_loop;
--
IF l_success THEN
--
COMMIT;
--
END IF;
--
END IF;
--
caco_debug.putline('SP_CONF: replace_cnpcv 999');
--
RETURN l_success;
--
EXCEPTION
WHEN OTHERS THEN
ROLLBACK TO SAVEPOINT before_replace;
caco_debug.putline('efno_confirmations.truncate_cnpcv_to_max: Unexpected Error '
||' CONF_ID : '||p_conf_id
||CHR(10)||' Error Msg : '||sqlerrm(sqlcode) );
-- Write an error and carry on
cout_err.report_and_go( p_exception_number => sqlcode
, p_exception_message => 'Unexpected Error '
||' CONF_ID : '||p_conf_id
||chr(10)||' Error Msg : '||sqlerrm(sqlcode)
, p_source => 'efno_confirmations.truncate_cnpcv_to_max');
--
RETURN FALSE;
--
END replace_cnpcv;
--
FUNCTION default_cnpcv_values( p_gas_day IN DATE
, p_conf_id IN confirmations.conf_id%TYPE
, p_nnpcv_tab IN nnpcv_tab
, p_exception IN contracts.validation_exception%TYPE
, p_return_error OUT VARCHAR2
, p_check IN BOOLEAN DEFAULT FALSE )
RETURN BOOLEAN
IS
PRAGMA AUTONOMOUS_TRANSACTION;
--
-- Cursor to get the minimum value for a given CONP and COCA pair
CURSOR c_cnppv_min( cp_conp_id IN NUMBER
, cp_coca_id IN NUMBER )
IS
SELECT cnppv.value
FROM cont_net_point_param_vals cnppv
, contract_parameters copa
, parameters pars
, contract_categories coca
WHERE cnppv.conp_id = cp_conp_id
AND cnppv.copa_id = copa.copa_id
AND copa.pars_id = pars.pars_id
AND SUBSTR(pars.code,-3) = 'MIN' -- Need the MIN parameter
AND pars.cate_id = coca.cate_id
AND coca.coca_id = cp_coca_id;
--
-- Cursor to get the contracted value for a given CONP and COCA pair
CURSOR c_cnppv_ctr( cp_conp_id IN NUMBER
, cp_coca_id IN NUMBER )
IS
SELECT cnppv.value
FROM cont_net_point_param_vals cnppv
, contract_parameters copa
, parameters pars
, contract_categories coca
WHERE cnppv.conp_id = cp_conp_id
AND cnppv.copa_id = copa.copa_id
AND copa.pars_id = pars.pars_id
AND SUBSTR(pars.code,-3) = 'CTR' -- Need the CTR parameter
AND pars.cate_id = coca.cate_id
AND coca.coca_id = cp_coca_id;
--
-- Cursor to get the contracted value for a given CONP and COCA pair
CURSOR c_cnppv_max( cp_conp_id IN NUMBER
, cp_coca_id IN NUMBER )
IS
SELECT cnppv.value
FROM cont_net_point_param_vals cnppv
, contract_parameters copa
, parameters pars
, contract_categories coca
WHERE cnppv.conp_id = cp_conp_id
AND cnppv.copa_id = copa.copa_id
AND copa.pars_id = pars.pars_id
AND SUBSTR(pars.code,-3) = 'MAX' -- Need the CTR parameter
AND pars.cate_id = coca.cate_id
AND coca.coca_id = cp_coca_id;
--
l_value cont_net_point_param_vals.value%TYPE;
l_int_value conf_net_point_cat_vals.value%TYPE;
l_cont_value conf_net_point_cat_vals.value%TYPE;
l_cont_id NUMBER;
--
l_success BOOLEAN := TRUE;
l_interrupted conf_net_point_cat_vals.interrupted%TYPE;
--
BEGIN
caco_debug.putline('SP_CONF: default_cnpcv_values 001');
SAVEPOINT before_default;
-- quite simply, we should loop through the table of given nnpcv and update the values
-- to the Minimum or Contracted values for the contract
--
IF NVL(p_nnpcv_tab.COUNT,0) > 0 THEN
--
-- get the contract id
SELECT conp.cont_id INTO l_cont_id
FROM cont_network_points conp
WHERE conp.conp_id = p_nnpcv_tab(1).conp_id;
--
caco_debug.putline('SP_CONF: default_cnpcv_values cont_id: '||l_cont_id);
--
<<cnppv_loop>>
FOR i IN 1..p_nnpcv_tab.COUNT LOOP
--
IF NOT p_check OR (p_check AND p_nnpcv_tab(i).in_error) THEN
--
l_value := 0;
-- Get the interrupted value if there is one
l_int_value := get_interrupted_value( p_nnpcv_tab(i).conp_id
, p_nnpcv_tab(i).coca_id
-- , p_nnpcv_tab(i).gas_day );
, p_gas_day );
--
--
IF p_exception = 'CO' THEN
--
IF efno_contracts.emo_contract(l_cont_id) = 'Y' THEN
--
-- calculate the exception value based on the percentage split and
-- virtual network point values
l_cont_value := get_cnppv_emo_exp_value(p_nnpcv_tab(i).conp_id
, p_nnpcv_tab(i).coca_id
, 'CTR'
, l_cont_id
, l_success
, p_return_error);
IF NOT l_success THEN
EXIT cnppv_loop;
END IF;
ELSE
OPEN c_cnppv_ctr( p_nnpcv_tab(i).conp_id
, p_nnpcv_tab(i).coca_id );
FETCH c_cnppv_ctr INTO l_cont_value;
IF c_cnppv_ctr%NOTFOUND THEN
CLOSE c_cnppv_ctr;
--
l_success := FALSE;
p_return_error := caco_utilities.get_module_text(2337);
-- Unable to find contracted value for invalid nomination. Please contact support
caco_debug.putline('efno_confirmations.default_gtcv_values: Unable to locate Contract parameter CTR for: '
||' CONP_ID : '||p_nnpcv_tab(i).conp_id||' and '
||' COCA_ID : '||p_nnpcv_tab(i).coca_id );
--
EXIT cnppv_loop;
END IF;
CLOSE c_cnppv_ctr;
END IF;
--
ELSIF p_exception = 'MI' THEN -- must be MI (minimum)
--
IF efno_contracts.emo_contract(l_cont_id) = 'Y' THEN
--
-- calculate the exception value based on the percentage split and
-- virtual network point values
l_cont_value := get_cnppv_emo_exp_value(p_nnpcv_tab(i).conp_id
, p_nnpcv_tab(i).coca_id
, 'MIN'
, l_cont_id
, l_success
, p_return_error);
IF NOT l_success THEN
EXIT cnppv_loop;
END IF;
ELSE
OPEN c_cnppv_min( p_nnpcv_tab(i).conp_id
, p_nnpcv_tab(i).coca_id );
FETCH c_cnppv_min INTO l_cont_value;
IF c_cnppv_min%NOTFOUND THEN
CLOSE c_cnppv_min;
--
l_success := FALSE;
p_return_error := caco_utilities.get_module_text(2310);
-- Unable to find minimum value for invalid nomination. Please contact support
caco_debug.putline('efno_confirmations.default_gtcv_values: Unable to locate Contract parameter MIN for: '
||' CONP_ID : '||p_nnpcv_tab(i).conp_id||' and '
||' COCA_ID : '||p_nnpcv_tab(i).coca_id );
--
EXIT cnppv_loop;
ELSE
CLOSE c_cnppv_min;
END IF;
END IF;
--
ELSIF p_exception = 'MA' THEN -- must be MA (Maximum)
--
IF efno_contracts.emo_contract(l_cont_id) = 'Y' THEN
--
-- calculate the exception value based on the percentage split and
-- virtual network point values
l_cont_value := get_cnppv_emo_exp_value(p_nnpcv_tab(i).conp_id
, p_nnpcv_tab(i).coca_id
, 'MIN'
, l_cont_id
, l_success
, p_return_error);
IF NOT l_success THEN
EXIT cnppv_loop;
END IF;
ELSE
OPEN c_cnppv_max( p_nnpcv_tab(i).conp_id
, p_nnpcv_tab(i).coca_id );
FETCH c_cnppv_max INTO l_cont_value;
IF c_cnppv_max%NOTFOUND THEN
CLOSE c_cnppv_max;
--
l_success := FALSE;
p_return_error := caco_utilities.get_module_text(2310);
-- Unable to find minimum value for invalid nomination. Please contact support
caco_debug.putline('efno_confirmations.default_gtcv_values: Unable to locate Contract parameter MAX for: '
||' CONP_ID : '||p_nnpcv_tab(i).conp_id||' and '
||' COCA_ID : '||p_nnpcv_tab(i).coca_id );
--
EXIT cnppv_loop;
ELSE
CLOSE c_cnppv_max;
END IF;
END IF;
--
END IF;
-- Compare the contract value and the interrupted value and go with the lowest value
caco_debug.putline('l_int_value: '||l_int_value);
caco_debug.putline('l_cont_value: '||l_cont_value);
IF l_int_value IS NULL THEN
l_value := l_cont_value;
l_interrupted := 'N';
ELSE
IF l_int_value > l_cont_value THEN
l_value := l_cont_value;
ELSE
l_value := l_int_value;
END IF;
l_interrupted := 'Y';
END IF;
caco_debug.putline('l_value: '||l_value);
caco_debug.putline('l_interrupted: '||l_interrupted);
--
BEGIN
-- So now update the value in conf_ and set the defaulted flag
caco_debug.putline('DEBUG3');
UPDATE conf_net_point_cat_vals
SET last_nom_received = NULL
, last_nomi_id = NULL
, last_gas_day = NULL
, last_coru_id = NULL
, defaulted = 'Y'
, valid = 'Y'
, value = l_value
, interrupted = l_interrupted
WHERE conf_id = p_conf_id
AND conp_id = p_nnpcv_tab(i).conp_id
AND coca_id = p_nnpcv_tab(i).coca_id;
--
caco_debug.putline('Valu: '||l_value||' : '||p_nnpcv_tab(i).coca_id);
-- SP 3/3/08 - commented update back in and now setting last_gas_day to null to stop
-- nomination date appearing on confirmation
UPDATE conf_net_point_cat_vals
SET defaulted = 'Y',
last_gas_day = NULL
WHERE conf_id = p_conf_id
AND conp_id = p_nnpcv_tab(i).conp_id;
--
EXCEPTION
WHEN others THEN
l_success := FALSE;
p_return_error := caco_utilities.get_module_text(2257);
-- Error defaulting invalid nomination values. Please contact support
caco_debug.putline('efno_confirmations.default_gtcv_values: Update failed : '
||' CONP_ID : '||p_nnpcv_tab(i).conp_id||' and '
||' COCA_ID : '||p_nnpcv_tab(i).coca_id
||chr(10)||' Error Msg : '||sqlerrm(sqlcode) );
-- Write an error and carry on
cout_err.report_and_go( p_exception_number => sqlcode
, p_exception_message => 'Update failed : '
||' CONP_ID : '||p_nnpcv_tab(i).conp_id||' and '
||' COCA_ID : '||p_nnpcv_tab(i).coca_id
||chr(10)||' Error Msg : '||sqlerrm(sqlcode)
, p_source => 'efno_confirmations.default_cnpcv_values');
--
END;
--
END IF;
--
END LOOP cnppv_loop;
--
END IF;
--
IF NOT l_success THEN
ROLLBACK TO SAVEPOINT before_default;
ELSE
COMMIT;
END IF;
--
caco_debug.putline('SP_CONF: default_cnpcv_values 999');
--
RETURN l_success;
--
END default_cnpcv_values;
--
FUNCTION upd_cnpcv_vals_with_nom( p_conf_id IN confirmations.conf_id%TYPE
, p_nnpcv_tab IN OUT nnpcv_tab
, p_coru_id IN contract_rules.coru_id%TYPE
, p_nomi_id IN nominations.nomi_id%TYPE
, p_nomi_date IN nominations.created_on%TYPE
, p_return_error OUT VARCHAR2
, p_nom_table IN efno_rules.nom_validation_table
)
RETURN BOOLEAN
IS
PRAGMA AUTONOMOUS_TRANSACTION;
--
-- Cursor to get the value for the given previous nomination and CONP COCA pair from the nnpcv_tab
CURSOR c_nnpcv( cp_conp_id IN NUMBER
, cp_coca_id IN NUMBER )
IS
SELECT nnpcv1.value value
, nnpcv1.gas_day gas_day
, cnp2.nepo_id nepo_id
FROM nom_net_point_cat_vals nnpcv1
,cont_network_points cnp1
,cont_network_points cnp2
,contract_categories cc1
,contract_categories cc2
WHERE nnpcv1.nomi_id = p_nomi_id
AND cc1.cate_id = cc2.cate_id
AND cc1.coca_id = cp_coca_id
AND cc2.coca_id = nnpcv1.coca_id
AND cnp1.nepo_id = cnp2.nepo_id
AND cnp1.conp_id = cp_conp_id
AND cnp2.conp_id = nnpcv1.conp_id
AND nnpcv1.gas_day = ( SELECT MAX( nnpcv2.gas_day )
FROM nom_net_point_cat_vals nnpcv2
WHERE nnpcv2.nomi_id = p_nomi_id );
--
l_value nom_net_point_cat_vals.value%TYPE;
l_gas_day nom_net_point_cat_vals.gas_day%TYPE;
l_success BOOLEAN := TRUE;
l_nepo_id network_points.nepo_id%TYPE;
--
BEGIN
--
caco_debug.putline('SP_CONF: upd_cnpcv_vals_with_nom 001');
--
SAVEPOINT before_upd_cnpcv;
--
-- Loop through the nnpcv tab and update CNPCV with the nom values
IF NVL(p_nnpcv_tab.COUNT,0) > 0 THEN
--
<<cnpcv_update_loop>>
FOR i IN 1..p_nnpcv_tab.COUNT LOOP
--
IF p_nnpcv_tab(i).in_error THEN
--
-- Only update if the row is in error
--
l_value := 0;
--
-- Get the value for the specific conp and coca for the given nomination
-- for the latest gas day in the valid nomination
--
OPEN c_nnpcv( p_nnpcv_tab(i).conp_id
, p_nnpcv_tab(i).coca_id );
FETCH c_nnpcv INTO l_value, l_gas_day, l_nepo_id;
IF c_nnpcv%NOTFOUND THEN
CLOSE c_nnpcv;
--
NULL;
--
ELSE
--
CLOSE c_nnpcv;
--
IF p_nom_table.COUNT > 0 THEN
--
<<nom_tab_loop>>
FOR n IN 1..p_nom_table.COUNT LOOP
--
IF p_nom_table(n).nr_nepo_id = l_nepo_id AND p_nom_table(n).nr_valid THEN
--
-- Update the conf_net_point_cat_vals table with the found and provided values
--
caco_debug.putline('Update confimation for: '||p_nnpcv_tab(i).conp_id);
--
caco_debug.putline('UPDATE!'||l_value);
--
caco_debug.putline('DEBUG4');
UPDATE conf_net_point_cat_vals
SET last_nom_received = p_nomi_date
, last_nomi_id = p_nomi_id
, last_coru_id = p_coru_id
, last_gas_day = l_gas_day
, value = l_value
WHERE conf_id = p_conf_id
AND conp_id = p_nnpcv_tab(i).conp_id
AND coca_id = p_nnpcv_tab(i).coca_id;
--
IF SQL%ROWCOUNT = 0 THEN
--
l_success := FALSE;
p_return_error := caco_utilities.get_module_text(2212);
-- An unexpected error has occurred while creating confirmation. Please contact support
caco_debug.putline('efno_confirmations.upd_cnpcv_vals_with_nom: Unable to UPDATE conf_net_point_cat_vals : '
||' CONF_ID : '||p_conf_id
||' CONP_ID : '||p_nnpcv_tab(i).conp_id
||' COCA_ID : '||p_nnpcv_tab(i).coca_id ||sqlerrm(sqlcode));
--
ROLLBACK TO SAVEPOINT before_upd_cnpcv;
EXIT cnpcv_update_loop;
--
ELSE
--
p_nnpcv_tab(i).in_error := FALSE;
--
END IF;
--
-- Update the rest of the values
--
caco_debug.putline('DEBUG5');
UPDATE conf_net_point_cat_vals c
SET ( last_nom_received
, last_nomi_id
, last_coru_id
, last_gas_day
, value
) = (
SELECT p_nomi_date
,p_nomi_id
,p_coru_id
,l_gas_day
,nn.value
FROM nominations n
,nom_net_point_cat_vals nn
,cont_network_points cnp1
,cont_network_points cnp2
,contract_categories cc1
,contract_categories cc2
WHERE nn.nomi_id = n.nomi_id
AND n.nomi_id = p_nomi_id
AND nn.coca_id = cc1.coca_id
AND nn.conp_id = cnp1.conp_id
AND c.coca_id = cc2.coca_id
AND c.conp_id = cnp2.conp_id
AND cnp1.nepo_id = cnp2.nepo_id
AND cc1.cate_id = cc2.cate_id
AND nn.gas_day = ( SELECT MAX( nnpcv2.gas_day )
FROM nom_net_point_cat_vals nnpcv2
WHERE nnpcv2.nomi_id = p_nomi_id )
) WHERE c.conf_id = p_conf_id
AND c.coca_id <> p_nnpcv_tab(i).coca_id
AND c.conp_id = p_nnpcv_tab(i).conp_id
AND EXISTS ( SELECT NULL
FROM nom_net_point_cat_vals nz1
,cont_network_points cnpz1
,cont_network_points cnpz2
,contract_categories ccz1
,contract_categories ccz2
WHERE nz1.nomi_id = p_nomi_id
AND nz1.coca_id = ccz1.coca_id
AND nz1.conp_id = cnpz1.conp_id
AND cnpz1.nepo_id = cnpz2.nepo_id
AND ccz1.cate_id = ccz2.cate_id
AND cnpz2.conp_id = c.conp_id
AND ccz2.coca_id = c.coca_id
AND nz1.value IS NOT NULL);
--
-- Now we need to update all other values to zero
--
caco_debug.putline('DEBUG7');
UPDATE conf_net_point_cat_vals
SET last_nom_received = p_nomi_date
, last_nomi_id = p_nomi_id
, last_coru_id = p_coru_id
, last_gas_day = l_gas_day
, value = 0
, defaulted = 'N'
WHERE conf_id = p_conf_id
AND conp_id = p_nnpcv_tab(i).conp_id
AND last_nom_received IS NULL;
--
END IF;
--
END LOOP;
--
END IF;
--
END IF;
--
END IF;
--
END LOOP cnpcv_update_loop;
--
--
END IF;
--
COMMIT;
caco_debug.putline('SP_CONF: upd_cnpcv_vals_with_nom 999');
RETURN l_success;
--
END upd_cnpcv_vals_with_nom;
--
--
--
--
/**
-- FUNCTION evaluate_rule
-- Validates a single EXISTING rule previously defined through the EFT Nominations Web interface
-- and optionally validates the data stored
--
-- Examples
-- To just parse an existing ROW rule (not assigned to a contract or contract template)
-- l_boolean := validate_rule( 12, 'ROW', TRUE, l_dummy_nom_data_table );
--
-- To parse a Rule for a specified contract template
-- l_boolean := validate_rule( 12, 'ROW', TRUE, l_dummy_nom_data_table, 1 );
--
-- To parse a Rule for a specified contract
-- l_boolean := validate_rule( 12, 'ROW', TRUE, l_dummy_nom_data_table, p_contract_id => 2 );
-- OR l_boolean := validate_rule( 12, 'ROW', TRUE, l_dummy_nom_data_table, NULL, 2 );
--
-- To parse a Rule for a contract AND validate the data for a nomination
-- l_boolean := validate_rule( 12, 'ROW', FALSE, l_nom_data_table, p_contract_id => 2, p_nomination_id => 3 );
-- OR l_boolean := validate_rule( 12, 'ROW', FALSE, l_nom_data_table, NULL, 2, 3 );
--
-- %param p_rule_id The Unique identifier of the ROW or SHEET rule
-- %param p_rule_type ROW or SHEET
-- %param p_parse_only TRUE indicates that only syntax checking is required
-- %param p_nom_table Table of resulting values passed out to the calling routine for evaluation
-- %param p_template_id Unique identifier of a contract template
-- %param p_contract_id Unique identifier of a contract
-- %param p_nomination_id Unique identifier of a Nomination - used if not parsing
--
-- %return BOOLEAN TRUE indicating that the rule is valid syntactically if parse only or that the data passed the test
-- and values have been returned for further checking
*/
FUNCTION evaluate_rule ( p_rule_id IN rules.rule_id%TYPE
, p_rule_type IN VARCHAR2
, p_conf_id IN confirmations.conf_id%TYPE
, p_gas_day IN DATE
, p_nnpcv_tab OUT nnpcv_tab
, p_contract_id IN contracts.cont_id%TYPE DEFAULT 0
, p_nomination_id IN nominations.nomi_id%TYPE DEFAULT 0
, p_return_error OUT VARCHAR2 )
RETURN BOOLEAN
IS
-- Cursor to grab the parts of the row rule required
CURSOR c_row_rule IS
SELECT left_side
, right_side
, rule_relation
, error_message_hu
, error_message_en
FROM rules
WHERE rule_id = p_rule_id;
--
-- Cursor to grab sheet based rule information
CURSOR c_sheet_rule IS
SELECT left_side
, right_side
, rule_relation
, error_message_hu
, error_message_en
FROM contract_rules
WHERE coru_id = p_rule_id;
--
-- Cursor to get the date from a SHEET based nomination (our Confirmation copy of it)
-- (sheet based rules can only work against a single day nomination)
CURSOR c_sheet_nom IS
SELECT gas_day
FROM conf_net_point_cat_vals
WHERE conf_id = p_conf_id
AND ROWNUM = 1;
--
-- Cursor to get the specific Network Points for the given nomination confirmation
-- 9/10/2009 SP for entry mandatory offer contracts we only need to
-- select the virtual network point for row based rules
CURSOR c_row_nom IS
SELECT DISTINCT conp.nepo_id network_point
, conp.display_sequence display_sequence
, conp.conp_id
FROM conf_net_point_cat_vals cnpcv
, cont_network_points conp
, network_points nepo
WHERE cnpcv.conf_id = p_conf_id
AND cnpcv.conp_id = conp.conp_id
AND nepo.nepo_id = conp.nepo_id
AND ((efno_contracts.emo_contract(p_contract_id) = 'Y' AND nepo.nepo_type = 'V')
OR efno_contracts.emo_contract(p_contract_id) = 'N')
ORDER BY conp.display_sequence ASC;
--
--
l_success BOOLEAN := TRUE;
--
l_rule_row c_row_rule%ROWTYPE;
left_is_valid BOOLEAN := FALSE;
right_is_valid BOOLEAN := FALSE;
--
--
l_left_sql VARCHAR2(32767) := NULL;
l_left_select VARCHAR2(32767) := NULL;
l_left_from VARCHAR2(32767) := NULL;
l_left_where VARCHAR2(32767) := NULL;
l_left_side_value NUMBER := 0;
l_left_error VARCHAR2(255) := NULL;
--
l_right_sql VARCHAR2(32767) := NULL;
l_right_select VARCHAR2(32767) := NULL;
l_right_from VARCHAR2(32767) := NULL;
l_right_where VARCHAR2(32767) := NULL;
l_right_side_value NUMBER := 0;
l_right_error VARCHAR2(255) := NULL;
--
--
l_gas_day DATE := NULL;
l_gas_day_char VARCHAR2(40) := NULL;
--
rule_found BOOLEAN := FALSE;
l_no_data BOOLEAN := FALSE;
invalid_row_rules BOOLEAN := FALSE;
--
l_element_count NUMBER := 0;
--
l_nom_sites_count NUMBER := 0;
--
BEGIN
--
-- Get the rule information
caco_debug.putline('SP_CONF: evaluate_rule 001');
--
l_element_count := NVL(p_nnpcv_tab.COUNT, 0);
--
IF UPPER(p_rule_type) = 'ROW' THEN
--
OPEN c_row_rule;
FETCH c_row_rule INTO l_rule_row;
IF c_row_rule%FOUND THEN
rule_found := TRUE;
END IF;
CLOSE c_row_rule;
--
ELSIF UPPER(p_rule_type) = 'SHEET' THEN
--
OPEN c_sheet_rule;
FETCH c_sheet_rule INTO l_rule_row;
IF c_sheet_rule%FOUND THEN
rule_found := TRUE;
END IF;
CLOSE c_sheet_rule;
--
-- Get the specific gas day for the SHEET rule
OPEN c_sheet_nom;
FETCH c_sheet_nom INTO l_gas_day;
--
IF c_sheet_nom%NOTFOUND THEN
l_success := FALSE;
p_return_error := caco_utilities.get_module_text(2267);
-- Invalid Nomination - Gas Day not found. Please contact support
END IF;
CLOSE c_sheet_nom;
--
END IF;
--
IF rule_found
AND l_success
THEN
--
-- Need to fully evaluate the rule against the nomination data as we are not just parsing
IF p_nomination_id IS NOT NULL AND p_nomination_id > 0
AND p_contract_id IS NOT NULL AND p_contract_id > 0
THEN
--
-- Find the specific gas day if the rule is a sheet based rule
IF UPPER(p_rule_type) = 'SHEET' THEN
-- Process/validate the left side - output used specifically for SHEET rules
left_is_valid := efno_rules.rule_text( p_text => l_rule_row.left_side
, p_rule_type => p_rule_type
, p_select => l_left_select
, p_from => l_left_from
, p_where => l_left_where
, p_nnpcv_tab => p_nnpcv_tab
, p_contract_id => p_contract_id
, p_nomination_id => p_nomination_id
, p_conf_id => p_conf_id
, p_force_conf => TRUE
, p_return_error => l_left_error );
--
-- Process/validate the Right side
right_is_valid := efno_rules.rule_text( p_text => l_rule_row.right_side
, p_rule_type => p_rule_type
, p_select => l_right_select
, p_from => l_right_from
, p_where => l_right_where
, p_nnpcv_tab => p_nnpcv_tab
, p_contract_id => p_contract_id
, p_nomination_id => p_nomination_id
, p_conf_id => p_conf_id
, p_force_conf => TRUE
, p_return_error => l_right_error );
--
IF l_left_error IS NOT NULL THEN
p_return_error := l_left_error;
ELSIF l_right_error IS NOT NULL THEN
p_return_error := l_right_error;
END IF;
--
IF left_is_valid
AND right_is_valid
AND p_return_error IS NULL
THEN
-- Ensure that the FROMs and the WHEREs are not null
IF l_left_from IS NULL THEN
l_left_from := 'dual';
END IF;
IF l_right_from IS NULL THEN
l_right_from := 'dual';
END IF;
IF l_left_where IS NOT NULL THEN
l_left_where := ' WHERE '||l_left_where;
END IF;
IF l_right_where IS NOT NULL THEN
l_right_where := ' WHERE '||l_right_where;
END IF;
--
-- We need to get the values - build the sql statements
l_left_sql := 'SELECT ('||l_left_select||') sql_value FROM '||l_left_from||l_left_where;
--
l_right_sql := 'SELECT ('||l_right_select||') sql_value FROM '||l_right_from||l_right_where;
--
-- We will have to replace any p_gas_day token with a TO_DATE conversion of the gas day
-- due to needing to submit a text SQL statement to DBMS_SQL
l_gas_day_char := 'TO_DATE('''||TO_CHAR(l_gas_day, 'DD-MON-YYYY')||''',''DD-MON-YYYY'')';
--
l_left_sql := REPLACE( l_left_sql, 'p_gas_day', l_gas_day_char );
--
l_right_sql := REPLACE( l_right_sql, 'p_gas_day', l_gas_day_char );
--
-- There should be only a single returned value from each side of the rule
efno_rules.evaluate_rule_sql( l_left_sql
, l_success
, l_no_data
, l_left_side_value );
--
IF l_success THEN
--
-- Not worth doing this unless the left side was a success!
efno_rules.evaluate_rule_sql( l_right_sql
, l_success
, l_no_data
, l_right_side_value );
--
END IF;
--
-- Success variable has already been set on result of evaluating each side of the SQL
-- So see if the values satisfy the relation
IF l_success THEN
--
IF NOT efno_rules.rule_test_passed( l_left_side_value
, l_right_side_value
, l_rule_row.rule_relation ) THEN
--
l_success := FALSE;
--
END IF;
--
END IF;
--
ELSE
-- Either the left side or the right side of the rule is invalid - how much should we report?
-- If p_return_error is NULL then we have missing nnpcv records (contract changed)
-- Need to check for this in the calling package.
--
-- Set the gas day in the nnpcv_tab for sheet nominations
-- (Row rules automatically have to do this)
IF NVL(p_nnpcv_tab.COUNT,0) > 0 THEN
FOR i IN 1..p_nnpcv_tab.COUNT LOOP
p_nnpcv_tab(i).gas_day := l_gas_day;
END LOOP;
END IF;
--
l_success := FALSE;
--
END IF;
--
ELSE -- Row Rules
-- We need to run the rule for each and every site of the nomination
-- So we need to construct an array of left side values and the result
-- of the comparsion with the rule relation
FOR r IN c_row_nom LOOP
caco_debug.putline('Row Nom Loop: '||r.network_point);
END LOOP;
<<row_nom_loop2>>
FOR r IN c_row_nom LOOP
--
caco_debug.putline('c_row_nom');
--
l_nom_sites_count := l_nom_sites_count + 1;
left_is_valid := FALSE;
right_is_valid := FALSE;
--
l_no_data := FALSE;
l_left_sql := NULL;
l_right_sql := NULL;
l_left_error := NULL;
l_right_error := NULL;
--
left_is_valid := efno_rules.rule_text( p_text => l_rule_row.left_side
, p_rule_type => p_rule_type
, p_select => l_left_select
, p_from => l_left_from
, p_where => l_left_where
, p_nnpcv_tab => p_nnpcv_tab
, p_contract_id => p_contract_id
, p_conf_id => p_conf_id
, p_nomination_id => p_nomination_id
, p_net_point_id => r.network_point
, p_gas_day => p_gas_day
, p_force_conf => TRUE
, p_return_error => l_left_error );
--
-- Process/validate the Right side
right_is_valid := efno_rules.rule_text( p_text => l_rule_row.right_side
, p_rule_type => p_rule_type
, p_select => l_right_select
, p_from => l_right_from
, p_where => l_right_where
, p_nnpcv_tab => p_nnpcv_tab
, p_contract_id => p_contract_id
, p_conf_id => p_conf_id
, p_nomination_id => p_nomination_id
, p_net_point_id => r.network_point
, p_gas_day => p_gas_day
, p_force_conf => TRUE
, p_return_error => l_right_error );
--
IF l_left_error IS NOT NULL THEN
p_return_error := l_left_error;
ELSIF l_right_error IS NOT NULL THEN
p_return_error := l_right_error;
END IF;
--
IF left_is_valid
AND right_is_valid
AND p_return_error IS NULL
THEN
--
-- Ensure that the FROMs and the WHEREs are not null
IF l_left_from IS NULL THEN
l_left_from := 'dual';
END IF;
IF l_right_from IS NULL THEN
l_right_from := 'dual';
END IF;
IF l_left_where IS NOT NULL THEN
l_left_where := ' WHERE '||l_left_where;
END IF;
IF l_right_where IS NOT NULL THEN
l_right_where := ' WHERE '||l_right_where;
END IF;
--
-- We need to get the values so lets build the sql statements
l_left_sql := 'SELECT ('||l_left_select||') sql_value FROM '||l_left_from||l_left_where;
--
l_right_sql := 'SELECT ('||l_right_select||') sql_value FROM '||l_right_from||l_right_where;
--
--
-- We will have to replace any p_gas_day token with a TO_DATE conversion of the gas day
-- due to needing to submit a text SQL statement to DBMS_SQL
l_gas_day_char := 'TO_DATE('''||TO_CHAR(p_gas_day, 'DD-MON-YYYY')||''',''DD-MON-YYYY'')';
--
l_left_sql := REPLACE( l_left_sql, 'p_gas_day', l_gas_day_char );
l_right_sql := REPLACE( l_right_sql, 'p_gas_day', l_gas_day_char );
--
-- Get the fully evaluated Numeric Value of each side of the rule
-- for the given information and this specific network point
efno_rules.evaluate_rule_sql( l_left_sql
, l_success
, l_no_data
, l_left_side_value );
--
-- IF l_success THEN
-- Not worth doing this unless the left side was a success!
efno_rules.evaluate_rule_sql( l_right_sql
, l_success
, l_no_data
, l_right_side_value );
-- END IF;
--
IF NOT l_success THEN
-- Exit Loop as the rule won't validate...
caco_debug.putline('EXIT 1');
-- EXIT row_nom_loop2;
END IF;
--
IF NOT efno_rules.rule_test_passed( l_left_side_value
, l_right_side_value
, l_rule_row.rule_relation ) THEN
--
l_success := FALSE;
--
FOR i IN l_element_count+1..p_nnpcv_tab.COUNT LOOP
--
IF p_nnpcv_tab(i).conp_id = r.conp_id THEN
p_nnpcv_tab(i).in_error := TRUE;
caco_debug.putline('Element '||i||' in error');
END IF;
--
IF p_nnpcv_tab(i).in_error IS NULL THEN
--
p_nnpcv_tab(i).in_error := FALSE;
--
END IF;
--
END LOOP;
--
END IF;
--
--
ELSIF p_return_error IS NULL THEN
-- Dont want to Exit Loop even though the rule won't validate...
-- we need to check for every network point before failing
invalid_row_rules := TRUE;
--
ELSE
-- Exit the loop - something went wrong that we havent dealt with
l_success := FALSE;
caco_debug.putline('EXIT 2');
EXIT row_nom_loop2;
--
END IF;
--
END LOOP row_nom_loop;
--
IF c_row_nom%ISOPEN THEN
CLOSE c_row_nom;
END IF;
--
END IF;
--
ELSE
--
-- To evaluate the rule - we need the nomination id and contract id so this fails
--
caco_debug.putline('Eval without nomination');
--
IF p_nomination_id IS NULL THEN
--
-- Find the specific gas day if the rule is a sheet based rule
IF UPPER(p_rule_type) = 'SHEET' THEN
-- Process/validate the left side - output used specifically for SHEET rules
left_is_valid := efno_rules.rule_text( p_text => l_rule_row.left_side
, p_rule_type => p_rule_type
, p_select => l_left_select
, p_from => l_left_from
, p_where => l_left_where
, p_nnpcv_tab => p_nnpcv_tab
, p_contract_id => p_contract_id
, p_nomination_id => p_nomination_id
, p_conf_id => p_conf_id
, p_force_conf => TRUE
, p_return_error => l_left_error );
--
-- Process/validate the Right side
right_is_valid := efno_rules.rule_text( p_text => l_rule_row.right_side
, p_rule_type => p_rule_type
, p_select => l_right_select
, p_from => l_right_from
, p_where => l_right_where
, p_nnpcv_tab => p_nnpcv_tab
, p_contract_id => p_contract_id
, p_nomination_id => p_nomination_id
, p_conf_id => p_conf_id
, p_force_conf => TRUE
, p_return_error => l_right_error );
--
IF l_left_error IS NOT NULL THEN
p_return_error := l_left_error;
ELSIF l_right_error IS NOT NULL THEN
p_return_error := l_right_error;
END IF;
--
IF left_is_valid
AND right_is_valid
AND p_return_error IS NULL
THEN
-- Ensure that the FROMs and the WHEREs are not null
IF l_left_from IS NULL THEN
l_left_from := 'dual';
END IF;
IF l_right_from IS NULL THEN
l_right_from := 'dual';
END IF;
IF l_left_where IS NOT NULL THEN
l_left_where := ' WHERE '||l_left_where;
END IF;
IF l_right_where IS NOT NULL THEN
l_right_where := ' WHERE '||l_right_where;
END IF;
--
-- We need to get the values - build the sql statements
l_left_sql := 'SELECT ('||l_left_select||') sql_value FROM '||l_left_from||l_left_where;
--
l_right_sql := 'SELECT ('||l_right_select||') sql_value FROM '||l_right_from||l_right_where;
--
-- We will have to replace any p_gas_day token with a TO_DATE conversion of the gas day
-- due to needing to submit a text SQL statement to DBMS_SQL
l_gas_day_char := 'TO_DATE('''||TO_CHAR(l_gas_day, 'DD-MON-YYYY')||''',''DD-MON-YYYY'')';
--
l_left_sql := REPLACE( l_left_sql, 'p_gas_day', l_gas_day_char );
--
l_right_sql := REPLACE( l_right_sql, 'p_gas_day', l_gas_day_char );
--
-- There should be only a single returned value from each side of the rule
efno_rules.evaluate_rule_sql( l_left_sql
, l_success
, l_no_data
, l_left_side_value );
--
IF l_success THEN
--
-- Not worth doing this unless the left side was a success!
efno_rules.evaluate_rule_sql( l_right_sql
, l_success
, l_no_data
, l_right_side_value );
--
END IF;
--
-- Success variable has already been set on result of evaluating each side of the SQL
-- So see if the values satisfy the relation
IF l_success THEN
--
IF NOT efno_rules.rule_test_passed( l_left_side_value
, l_right_side_value
, l_rule_row.rule_relation ) THEN
--
l_success := FALSE;
--
END IF;
--
END IF;
--
ELSE
-- Either the left side or the right side of the rule is invalid - how much should we report?
-- If p_return_error is NULL then we have missing nnpcv records (contract changed)
-- Need to check for this in the calling package.
--
-- Set the gas day in the nnpcv_tab for sheet nominations
-- (Row rules automatically have to do this)
IF NVL(p_nnpcv_tab.COUNT,0) > 0 THEN
FOR i IN 1..p_nnpcv_tab.COUNT LOOP
p_nnpcv_tab(i).gas_day := l_gas_day;
END LOOP;
END IF;
--
l_success := FALSE;
--
END IF;
--
ELSE -- Row Rules
-- We need to run the rule for each and every site of the nomination
-- So we need to construct an array of left side values and the result
-- of the comparsion with the rule relation
<<row_nom_loop>>
FOR r IN c_row_nom LOOP
--
caco_debug.putline('c_row_nom2 nepo:'||r.network_point);
--
l_nom_sites_count := l_nom_sites_count + 1;
left_is_valid := FALSE;
right_is_valid := FALSE;
--
l_no_data := FALSE;
l_left_sql := NULL;
l_right_sql := NULL;
l_left_error := NULL;
l_right_error := NULL;
--
left_is_valid := efno_rules.rule_text( p_text => l_rule_row.left_side
, p_rule_type => p_rule_type
, p_select => l_left_select
, p_from => l_left_from
, p_where => l_left_where
, p_nnpcv_tab => p_nnpcv_tab
, p_contract_id => p_contract_id
, p_conf_id => p_conf_id
, p_nomination_id => p_nomination_id
, p_net_point_id => r.network_point
, p_gas_day => p_gas_day
, p_force_conf => TRUE
, p_return_error => l_left_error );
--
-- Process/validate the Right side
right_is_valid := efno_rules.rule_text( p_text => l_rule_row.right_side
, p_rule_type => p_rule_type
, p_select => l_right_select
, p_from => l_right_from
, p_where => l_right_where
, p_nnpcv_tab => p_nnpcv_tab
, p_contract_id => p_contract_id
, p_conf_id => p_conf_id
, p_nomination_id => p_nomination_id
, p_net_point_id => r.network_point
, p_gas_day => p_gas_day
, p_force_conf => TRUE
, p_return_error => l_right_error );
--
IF l_left_error IS NOT NULL THEN
p_return_error := l_left_error;
ELSIF l_right_error IS NOT NULL THEN
p_return_error := l_right_error;
END IF;
--
IF left_is_valid
AND right_is_valid
AND p_return_error IS NULL
THEN
--
-- Ensure that the FROMs and the WHEREs are not null
IF l_left_from IS NULL THEN
l_left_from := 'dual';
END IF;
IF l_right_from IS NULL THEN
l_right_from := 'dual';
END IF;
IF l_left_where IS NOT NULL THEN
l_left_where := ' WHERE '||l_left_where;
END IF;
IF l_right_where IS NOT NULL THEN
l_right_where := ' WHERE '||l_right_where;
END IF;
--
-- We need to get the values so lets build the sql statements
l_left_sql := 'SELECT ('||l_left_select||') sql_value FROM '||l_left_from||l_left_where;
--
l_right_sql := 'SELECT ('||l_right_select||') sql_value FROM '||l_right_from||l_right_where;
--
--
-- We will have to replace any p_gas_day token with a TO_DATE conversion of the gas day
-- due to needing to submit a text SQL statement to DBMS_SQL
l_gas_day_char := 'TO_DATE('''||TO_CHAR(p_gas_day, 'DD-MON-YYYY')||''',''DD-MON-YYYY'')';
--
l_left_sql := REPLACE( l_left_sql, 'p_gas_day', l_gas_day_char );
l_right_sql := REPLACE( l_right_sql, 'p_gas_day', l_gas_day_char );
--caco_debug.putline('Right: '|| l_right_sql);
--caco_debug.putline('Left: '|| l_left_sql);
--
-- Get the fully evaluated Numeric Value of each side of the rule
-- for the given information and this specific network point
efno_rules.evaluate_rule_sql( l_left_sql
, l_success
, l_no_data
, l_left_side_value );
--
-- IF l_success THEN
-- Not worth doing this unless the left side was a success!
caco_debug.putline('Eval right');
efno_rules.evaluate_rule_sql( l_right_sql
, l_success
, l_no_data
, l_right_side_value );
-- END IF;
--
IF NOT l_success THEN
-- Exit Loop as the rule won't validate...
caco_debug.putline('Rule not valid - EXIT1');
-- EXIT row_nom_loop;
END IF;
--
caco_debug.putline(l_left_side_value||l_rule_row.rule_relation||l_right_side_value);
IF NOT efno_rules.rule_test_passed( l_left_side_value
, l_right_side_value
, l_rule_row.rule_relation ) THEN
--
-- Leave this in as it doesn't work without
--
l_success := FALSE;
--
FOR i IN l_element_count+1..p_nnpcv_tab.COUNT LOOP
--
IF p_nnpcv_tab(i).conp_id = r.conp_id THEN
p_nnpcv_tab(i).in_error := TRUE;
caco_debug.putline('Element '||i||' in error');
END IF;
--
END LOOP;
--
END IF;
--
ELSIF p_return_error IS NULL THEN
-- Dont want to Exit Loop even though the rule won't validate...
-- we need to check for every network point before failing
invalid_row_rules := TRUE;
caco_debug.putline('**INVALID ROW RULES**');
--
ELSE
-- Exit the loop - something went wrong that we havent dealt with
l_success := FALSE;
caco_debug.putline('EXIT2');
EXIT row_nom_loop;
--
END IF;
--
END LOOP row_nom_loop;
--
IF c_row_nom%ISOPEN THEN
CLOSE c_row_nom;
END IF;
--
END IF;
--
END IF;
END IF;
--
ELSIF NOT rule_found THEN
-- No rule found
l_success := FALSE;
p_return_error := caco_utilities.get_module_text(2433);
-- Rule not found. Please contact support
--
END IF;
--
IF invalid_row_rules THEN
l_success := FALSE;
END IF;
--
caco_debug.putline('SP_CONF: evaluate_rule 999');
RETURN l_success;
--
EXCEPTION
WHEN others THEN
l_success := FALSE;
p_return_error := caco_utilities.get_module_text(3581);
-- Error
caco_debug.putline('efno_confirmations.evaluate_rule - : Error : '||sqlerrm(sqlcode));
-- Write an error and carry on
cout_err.report_and_go( p_exception_number => sqlcode
, p_exception_message => 'Unexpected Error: '||sqlerrm(sqlcode)
||chr(10)||'NOMI_ID: '||p_nomination_id
||'Failed evaluating rules '
||'for gas day : '||TO_CHAR(p_gas_day,'DD-MON-YYYY')
, p_source => 'efno_confirmations.evaluate_rule');
--
END evaluate_rule;
--
--
--
--
FUNCTION fix_nom_with_lookback( p_conf_id IN confirmations.conf_id%TYPE
, p_gas_day IN DATE
, p_nomination_row IN nominations%ROWTYPE
, p_contract_id IN contracts.cont_id%TYPE
, p_rule_record IN efno_contracts.contract_rules_rec
, p_lookback_date IN DATE
, p_exception IN contracts.validation_exception%TYPE
, p_lookback_action IN contracts.lookback_action%TYPE
, p_nnpcv_tab IN nnpcv_tab
, p_return_error OUT VARCHAR2 )
RETURN BOOLEAN
IS
-- Require a cursor to list all "tip" nominations for the contract
CURSOR c_nominations( cp_last_nomi_date IN DATE
, cp_lookback_action IN VARCHAR2
) IS
SELECT nomi.nomi_id
, nomi.created_on
, nomi.status
, cont1.cust_id
FROM nominations nomi
,contracts cont1
WHERE nomi.cont_id = cont1.cont_id
AND cont1.cont_id IN (SELECT cont2.cont_id
FROM contracts cont2
CONNECT BY PRIOR cont2.prev_cont_id = cont2.cont_id
START WITH cont2.cont_id = p_contract_id)
AND ( nomi.nomi_id < p_nomination_row.nomi_id
OR p_nomination_row.nomi_id IS NULL )
AND EXISTS ( SELECT NULL
FROM nom_net_point_cat_vals nnpcv
WHERE nnpcv.nomi_id = nomi.nomi_id
GROUP BY nnpcv.gas_day
HAVING MIN(nnpcv.gas_day) <= (SELECT gas_day FROM confirmations WHERE conf_id = p_conf_id)
AND MIN(nnpcv.gas_day) >= p_lookback_date )
AND ( ( nomi.status = 'A' -- 'A' will be the TIP each day
AND cp_lookback_action = 'T'
AND ( nomi_id IN ((SELECT nomi_id
FROM ( SELECT DISTINCT n.nomi_id, n.gas_day, no.created_on, RANK() OVER (partition by gas_day ORDER BY gas_day, no.created_on DESC) nom_rank
FROM nom_net_point_cat_vals n
,nominations no
,contracts c
WHERE n.nomi_id = no.nomi_id
AND no.cont_id = c.cont_id
AND c.cont_id IN (SELECT c2.cont_id
FROM contracts c2
CONNECT BY PRIOR c2.prev_cont_id = c2.cont_id
START WITH c2.cont_id = p_contract_id)
)
WHERE nom_rank = 1))
)
)
OR ( cp_lookback_action = 'A'
)
)
ORDER BY ( SELECT MIN(nnpcv.gas_day)
FROM nom_net_point_cat_vals nnpcv
WHERE nnpcv.nomi_id = nomi.nomi_id
) DESC, nomi.created_on DESC;
/*
SELECT nomi.nomi_id
, nomi.created_on
, nomi.status
, cont1.cust_id
FROM nominations nomi
,contracts cont1
,contracts cont2
WHERE nomi.cont_id = cont1.cont_id
AND cont1.cust_id = cont2.cust_id
AND cont2.cont_id = p_contract_id
AND ( nomi.nomi_id < p_nomination_row.nomi_id
OR p_nomination_row.nomi_id IS NULL )
AND EXISTS ( SELECT NULL
FROM nom_net_point_cat_vals nnpcv
WHERE nnpcv.nomi_id = nomi.nomi_id
GROUP BY nnpcv.gas_day
HAVING MIN(nnpcv.gas_day) <= (SELECT gas_day FROM confirmations WHERE conf_id = p_conf_id)
AND MIN(nnpcv.gas_day) >= p_lookback_date )
AND ( ( nomi.status = 'A' -- 'A' will be the TIP each day
AND cp_lookback_action = 'T'
AND ( nomi_id IN ((SELECT nomi_id
FROM ( SELECT DISTINCT n.nomi_id, n.gas_day, no.created_on, RANK() OVER (partition by gas_day ORDER BY gas_day, no.created_on DESC) nom_rank
FROM nom_net_point_cat_vals n
,nominations no
,contracts c
,contracts c2
WHERE n.nomi_id = no.nomi_id
AND no.cont_id = c.cont_id
AND c.cust_id = c2.cust_id
AND c2.cont_id = p_contract_id
)
WHERE nom_rank = 1))
)
)
OR ( cp_lookback_action = 'A'
)
)
ORDER BY ( SELECT MIN(nnpcv.gas_day)
FROM nom_net_point_cat_vals nnpcv
WHERE nnpcv.nomi_id = nomi.nomi_id
) DESC, nomi.created_on DESC;
*/
--
-- Cursor to lookup the current status of the CNPCV value
CURSOR c_cnpcv_val( cp_conp_id IN NUMBER
, cp_coca_id IN NUMBER
, cp_gas_day IN DATE )
IS
SELECT cnpcv.*
FROM conf_net_point_cat_vals cnpcv
,cont_network_points t
,cont_network_points t2
,contract_categories c
,contract_categories c2
WHERE cnpcv.conf_id = p_conf_id
AND t2.conp_id = cnpcv.conp_id
AND t.conp_id = cp_conp_id
AND t.nepo_id = t2.nepo_id
AND c.cate_id = c2.cate_id
AND c2.coca_id = cnpcv.coca_id
AND c.coca_id = cp_coca_id
AND gas_day = cp_gas_day;
--
-- Cursor to get the days before figure that the nominations can be input
CURSOR c_days_before IS
SELECT receive_before_start
FROM contracts
WHERE cont_id = p_contract_id;
--
l_cnpcv_val_rec c_cnpcv_val%ROWTYPE;
--
l_temp_rule_id rules.rule_id%TYPE;
--
l_nom_table efno_rules.nom_validation_table;
l_dummy_nnpcv_tab nnpcv_tab;
l_nnpcv_tab nnpcv_tab;
l_days_before NUMBER := 0;
l_oldest_nom_date DATE;
--
values_defaulted BOOLEAN := FALSE;
found_valid_nom BOOLEAN := FALSE;
--
l_success BOOLEAN := TRUE;
--
BEGIN
--
-- Get local copy to allow valid/invalid to be updated
--
--caco_debug.debug_on;
caco_debug.putline('SP_CONF: fix_nom_with_lookback 001');
l_nnpcv_tab := p_nnpcv_tab;
--
FOR i IN 1..l_nnpcv_tab.COUNT LOOP
caco_debug.putline('*'||l_nnpcv_tab(i).conp_id||'-'||sys.diutil.bool_to_int(l_nnpcv_tab(i).in_error));
END LOOP;
--
caco_debug.putline('Enter fix with lookback');
--
-- Work out the temp_rule (to pass to "evaluate_rule"
--
IF p_rule_record.rule_type = 'SHEET' THEN
l_temp_rule_id := p_rule_record.coru_id;
ELSE
l_temp_rule_id := p_rule_record.rule_id;
END IF;
--
-- Get the Days before figure to add to sysdate to default the "oldest Nom date"
--
OPEN c_days_before;
FETCH c_days_before
INTO l_days_before;
CLOSE c_days_before;
--
l_oldest_nom_date := SYSDATE + l_days_before;
--
-- We know the current nomination is invalid - and that it affects the given
-- nomination categories values within the p_nnpcv_tab.
-- So we need to find a previous nomination that still satisfies the given rule
-- If we cant find a previous nomination within the lookback window that satisifies
-- the given rule then we need to default the category values to the validation_exception
-- type - which will be the contracted value or the minimum.
--
-- The values that satisfy the given rule should be placed onto the conf_net_point_cat_vals table
--
-- We need to check if we have already updated the nom values previously
-- Get the oldest nomination id and date created for each of the items
--
IF NVL(l_nnpcv_tab.COUNT,0) > 0 THEN
--
<<cnpcv_lookup_loop>>
FOR i IN 1..l_nnpcv_tab.COUNT LOOP
--
OPEN c_cnpcv_val( l_nnpcv_tab(i).conp_id
, l_nnpcv_tab(i).coca_id
, l_nnpcv_tab(i).gas_day );
FETCH c_cnpcv_val INTO l_cnpcv_val_rec;
IF c_cnpcv_val%NOTFOUND THEN
CLOSE c_cnpcv_val;
-- problem
-- cant fix the value if it isn't found - this should never happen.
l_success := FALSE;
p_return_error := caco_utilities.get_module_text(2315);
-- Unable to locate required data. Please contact support
caco_debug.putline('efno_confirmations.fix_nom_with_lookback: Unable to locate data in conf_net_point_cat_vals: '
||' CONF_ID : '||p_conf_id
||' CONP_ID : '||l_nnpcv_tab(i).conp_id
||' COCA_ID : '||l_nnpcv_tab(i).coca_id );
EXIT cnpcv_lookup_loop;
--
ELSE
CLOSE c_cnpcv_val;
--
-- Check to see if the CNPCV value has already been defaulted
IF l_cnpcv_val_rec.defaulted = 'Y' THEN
--
caco_debug.putline('values have been defaulted');
values_defaulted := TRUE;
--
ELSIF NVL(l_cnpcv_val_rec.last_nom_received, SYSDATE + l_days_before) < l_oldest_nom_date THEN
--
caco_debug.putline('oldest nom date : '||to_char(l_oldest_nom_date,'DD-MON-YYYY HH24:MI:SS')
||' : Last nom received : '
||to_char(l_cnpcv_val_rec.last_nom_received,'DD-MON-YYYY HH24:MI:SS'));
-- Set the oldest nom date to be the oldest date already used to set a value
l_oldest_nom_date := l_cnpcv_val_rec.last_nom_received;
--
END IF;
--
END IF;
END LOOP cnpcv_lookup_loop;
--
END IF;
--
IF l_success THEN
-- now we can loop through the previous tip nominations and see if any of them are valid
IF values_defaulted THEN
--
-- We should just default each of the categories in the list as at least one of them
-- has already been defaulted to either the MIN or CTR value
-- Call the routine to default the values for the categories in our table
l_success := default_cnpcv_values( p_gas_day
, p_conf_id
, l_nnpcv_tab
, p_exception
, p_return_error );
--
ELSE
caco_debug.putline('cp_last_nomi_date: '||l_oldest_nom_date||' lookback_date: '||p_lookback_date||' action: '||NVL(p_lookback_action, 'A'));
caco_debug.putline('Contract: '||p_contract_id||' Nomi : '||p_nomination_row.nomi_id||' conf: '||p_conf_id);
-- We should look back for a valid value from a previous nomination if there is one...
<<nom_lookback_loop>>
FOR r IN c_nominations( l_oldest_nom_date
, NVL(p_lookback_action, 'A')) LOOP
--
caco_debug.putline('we have a nom to look back at: nomi_id = '||r.nomi_id);
--
l_nom_table.DELETE;
--
-- We want to validate the nomination - not force the confirmation here.....
--
<<nom_lookback_gas_day_loop>>
FOR rec_nom_lookback_gas_day IN (SELECT gas_day
FROM (SELECT gas_day
FROM nom_net_point_cat_vals
WHERE nomi_id = r.nomi_id
GROUP BY gas_day)
ORDER BY gas_day DESC)
LOOP
found_valid_nom := efno_rules.validate_rule_conf( p_gas_day => rec_nom_lookback_gas_day.gas_day -- p_gas_day
, p_rule_id => l_temp_rule_id
, p_rule_type => p_rule_record.rule_type
, p_parse_only => FALSE
, p_nnpcv_tab => l_nnpcv_tab
, p_nom_table => l_nom_table
, p_contract_id => p_contract_id
, p_nomination_id => r.nomi_id);
--
IF found_valid_nom
THEN
EXIT nom_lookback_gas_day_loop;
END IF;
END LOOP;
--
--caco_debug.debug_on;
FOR i IN 1..l_nnpcv_tab.COUNT LOOP
caco_debug.putline('*'||l_nnpcv_tab(i).conp_id||'-'||sys.diutil.bool_to_int(l_nnpcv_tab(i).in_error));
END LOOP;
--
caco_debug.putline('RETURN FROM efno_rules.evaluate_rules:'||l_nom_table.COUNT||':'||l_nnpcv_tab.COUNT);
--
IF NVL(l_nom_table.COUNT,0) > 0 THEN
--
found_valid_nom := FALSE;
--
<<nom_loop>>
FOR i IN 1..l_nom_table.COUNT LOOP
--
caco_debug.putline('Value returned: '||l_nom_table(i).nr_nepo_id||':'||sys.diutil.bool_to_int(l_nom_table(i).nr_valid));
--
IF l_nom_table(i).nr_valid THEN
found_valid_nom := TRUE;
EXIT nom_loop;
END IF;
--
END LOOP nom_loop;
--
END IF;
--
IF found_valid_nom THEN
--
caco_debug.putline('Update nominated values');
--
-- Put the details of this nomination (l_lookback_nnpcv_tab) onto the p_nnpcv_tab entries
--
l_success := upd_cnpcv_vals_with_nom( p_conf_id => p_conf_id
, p_nnpcv_tab => l_nnpcv_tab
, p_coru_id => p_rule_record.coru_id
, p_nomi_id => r.nomi_id
, p_nomi_date => r.created_on
, p_return_error => p_return_error
, p_nom_table => l_nom_table
);
--
-- Exit the loop - we got good values for the cnpcv_id's..
-- so there is no point looking back any further.
--
-- EXIT nom_lookback_loop;
--
END IF;
--
END LOOP nom_lookback_loop;
--
-- Now look to see if we still have any invalid values left over
--
IF l_nnpcv_tab.COUNT > 0 THEN
--
<<l_nnpcv_loop>>
FOR j IN 1..l_nnpcv_tab.COUNT LOOP
--
IF l_nnpcv_tab(j).in_error THEN
--
found_valid_nom := FALSE;
--
EXIT l_nnpcv_loop;
--
END IF;
--
END LOOP;
--
END IF;
--
-- Did we find a valid nomination? If not, we need to default the values
--
IF NOT found_valid_nom THEN
--
caco_debug.putline('No valid nominations');
-- Call the routine to default the values for the categories in our table
l_success := default_cnpcv_values( p_gas_day
, p_conf_id
, l_nnpcv_tab
, p_exception
, p_return_error
, TRUE );
--
END IF;
--
END IF; -- values defaulted or not
--
END IF; --successful GTT lookups
--
caco_debug.putline('SP_CONF: fix_nom_with_lookback 999');
RETURN l_success;
--
END fix_nom_with_lookback;
--
FUNCTION fetch_contract_number( p_nomi_id IN nominations.nomi_id%TYPE )
RETURN VARCHAR2
IS
CURSOR c_cont IS
SELECT cont.contract_number
FROM contracts cont
, nominations nomi
WHERE nomi.cont_id = cont.cont_id
AND nomi.nomi_id = p_nomi_id;
--
l_contract_number contracts.contract_number%TYPE := NULL;
--
BEGIN
--
OPEN c_cont;
FETCH c_cont INTO l_contract_number;
CLOSE c_cont;
--
RETURN l_contract_number;
--
END fetch_contract_number;
--
FUNCTION fetch_nom_identifier( p_nomi_id IN nominations.nomi_id%TYPE )
RETURN VARCHAR2
IS
CURSOR c_nomi IS
SELECT identifier
FROM nominations
WHERE nomi_id = p_nomi_id;
--
l_identifier nominations.identifier%TYPE := NULL;
--
BEGIN
--
OPEN c_nomi;
FETCH c_nomi INTO l_identifier;
CLOSE c_nomi;
--
RETURN l_identifier;
--
END fetch_nom_identifier;
--
FUNCTION force_validate_cnpcv_nom( p_conf_id IN confirmations.conf_id%TYPE
, p_nomination_row IN nominations%ROWTYPE
, p_contract_id IN contracts.cont_id%TYPE
, p_gas_day IN DATE
, p_replace IN BOOLEAN DEFAULT FALSE
, p_ignore IN BOOLEAN DEFAULT FALSE
, p_window IN contracts.validation_window%TYPE DEFAULT 0
, p_exception IN contracts.validation_exception%TYPE DEFAULT NULL
, p_lookback_action IN contracts.lookback_action%TYPE DEFAULT NULL
, p_validation_action IN contracts.validation_action%TYPE DEFAULT NULL
, p_return_error OUT VARCHAR2 )
RETURN BOOLEAN
IS
--
l_lookback_date DATE;
l_rule_record efno_contracts.contract_rules_rec;
l_temp_rule rules.rule_id%TYPE;
l_nnpcv_tab nnpcv_tab;
rule_valid BOOLEAN := TRUE;
nom_invalid BOOLEAN := FALSE;
missing_nnpcv BOOLEAN := FALSE;
--
l_success BOOLEAN := TRUE;
--
l_count_rules NUMBER := 0;
--
BEGIN
caco_debug.putline('SP_CONF: force_validate_cnpcv_nom 001');
-- Check we have permission to be using this module.
/* IF NOT caco_security.security_check('efnow095$') THEN
p_return_error := caco_utilities.get_module_text(960); -- You do not have permission to use this application
RETURN FALSE;
END IF;
*/ --
-- The full lookback date is the confirmation gas day minus the lookback window
l_lookback_date := p_gas_day - p_window;
--
caco_debug.putline('Lookback window date is : '||to_char(l_lookback_date,'DD-MON-YYYY'));
--
-- Need to loop through the contract rules and validate the nomination held in the global temporary table
-- If a rule fails, we need to perform the appropriate action as depicted by the received parameters
-- If we are truncating values to Max then we complete all rules
-- If we are looking back for a validation window, we fix the failed rule and exit
--
OPEN efno_contracts.c_rules( p_contract_id );
FETCH efno_contracts.c_rules INTO l_rule_record;
--
<<contract_rules_loop>>
WHILE efno_contracts.c_rules%FOUND LOOP
--
l_count_rules := l_count_rules + 1;
l_temp_rule := 0;
l_nnpcv_tab.DELETE;
--
IF l_rule_record.rule_type = 'SHEET' THEN
l_temp_rule := l_rule_record.coru_id;
ELSE
l_temp_rule := l_rule_record.rule_id;
END IF;
--
rule_valid := evaluate_rule( l_temp_rule
, l_rule_record.rule_type
, p_conf_id
, p_gas_day
, l_nnpcv_tab
, p_contract_id
, p_nomination_row.nomi_id
, p_return_error );
--
caco_debug.putline('Z0 post evaluate rule: '||p_return_error||':bool:'||sys.diutil.bool_to_int(rule_valid));
--
IF NOT rule_valid
AND p_return_error IS NULL
THEN
-- Check to see if any of the nnpcv values were missing
IF NVL(l_nnpcv_tab.COUNT,0) > 0 THEN
<<missing_nnpcv_loop>>
FOR i IN 1..l_nnpcv_tab.COUNT LOOP
--
IF l_nnpcv_tab(i).missing = 'Y' THEN
missing_nnpcv := TRUE;
EXIT missing_nnpcv_loop;
END IF;
--
END LOOP missing_nnpcv_loop;
END IF;
--
IF missing_nnpcv THEN
--
caco_debug.putline('Have missing nnpcv so must create them : rule_type :'
||l_rule_record.rule_type||': rule/coru number : '||l_temp_rule);
--
create_missing_cnpcv( p_conf_id => p_conf_id
, p_nomi_id => p_nomination_row.nomi_id
, p_nnpcv_tab => l_nnpcv_tab
, p_exception => p_exception
, p_validation_action => p_validation_action
, p_success => l_success
, p_return_error => p_return_error
, p_cont_id => p_contract_id
, p_lookback_date => l_lookback_date
, p_lookback_action => p_lookback_action );
--
END IF;
--
caco_debug.putline('Pre-lookback');
--
IF l_success THEN
--
IF p_replace THEN
--
caco_debug.putline('about to replace');
--
l_success := replace_cnpcv( p_conf_id
, l_nnpcv_tab
, p_exception
, p_return_error );
--
IF NOT l_success THEN
EXIT contract_rules_loop;
END IF;
--
ELSIF p_ignore THEN
--
NULL;
--
ELSE
--
caco_debug.putline('about to fix nom with lookback');
--
l_success := fix_nom_with_lookback( p_conf_id
, p_gas_day
, p_nomination_row
, p_contract_id
, l_rule_record
, l_lookback_date
, p_exception
, p_lookback_action
, l_nnpcv_tab
, p_return_error );
--
IF NOT l_success THEN
EXIT contract_rules_loop;
END IF;
--
nom_invalid := TRUE;
-- EXIT contract_rules_loop; -- commented 05/06 AG, not sure if this should be here?
--
END IF;
--
ELSIF p_return_error IS NOT NULL THEN
-- Something went wrong in creating the missing cnpcv records
-- We have to abandon the attempt
nom_invalid := TRUE;
EXIT contract_rules_loop;
END IF;
--
ELSIF p_return_error IS NOT NULL THEN
-- Something went wrong in the force of the nomination
-- We have to abandon the attempt
nom_invalid := TRUE;
EXIT contract_rules_loop;
--
END IF;
--
-- Fetch the next rule record
FETCH efno_contracts.c_rules INTO l_rule_record;
--
END LOOP contract_rules_loop;
--
CLOSE efno_contracts.c_rules;
--
caco_debug.putline('SP_CONF: force_validate_cnpcv_nom 999');
RETURN nom_invalid;
--
END force_validate_cnpcv_nom;
--
--
FUNCTION insert_comm_conf( p_nomi_id IN nominations.nomi_id%TYPE
, p_cont_id IN contracts.cont_id%TYPE
, p_gas_day IN DATE
, p_conf_id OUT confirmations.conf_id%TYPE
, p_return_error OUT VARCHAR2 )
RETURN BOOLEAN
IS
PRAGMA AUTONOMOUS_TRANSACTION;
--
l_success BOOLEAN := TRUE;
--
BEGIN
--
caco_debug.putline('SP_CONF: insert_comm_conf 001');
--
SAVEPOINT before_insert;
--
BEGIN
INSERT INTO confirmations
( conf_id
, confirmation_type
, nomi_id
, approved
, cont_id
, gas_day )
VALUES
( conf_seq.NEXTVAL
, 'CO'
, p_nomi_id
, 'N'
, p_cont_id
, p_gas_day )
RETURNING conf_id INTO p_conf_id;
--
COMMIT;
--
EXCEPTION
WHEN others THEN
ROLLBACK TO SAVEPOINT before_insert;
l_success := FALSE;
p_return_error := caco_utilities.get_module_text(2330);
-- An unexpected error has occurred. Please contact support
caco_debug.putline('efno_confirmations.insert_comm_conf : NOMI_ID :'
||p_nomi_id||' : Error : '||sqlerrm(sqlcode));
-- Write an error and carry on
cout_err.report_and_go( p_exception_number => sqlcode
, p_exception_message => 'Insert failed : '
||'NOMI_ID :'||p_nomi_id
||' : Error : '||sqlerrm(sqlcode)
, p_source => 'efno_confirmations.insert_comm_conf');
--
END;
--
caco_debug.putline('SP_CONF: insert_comm_conf 999');
RETURN l_success;
--
END insert_comm_conf;
--
--
--
--
FUNCTION update_comm_conf( p_conf_id IN confirmations.conf_id%TYPE
, p_spreadsheet IN BLOB
, p_conf_text IN CLOB
, p_conf_type IN contract_options.conf_type%TYPE
, p_return_error OUT VARCHAR2 )
RETURN BOOLEAN
IS
PRAGMA AUTONOMOUS_TRANSACTION;
--
l_success BOOLEAN := TRUE;
--
BEGIN
SAVEPOINT before_update;
--
BEGIN
--
UPDATE confirmations conf
SET conf.confirmation = p_spreadsheet
, conf.confirmation_text = p_conf_text
, conf.conf_file_type = p_conf_type
WHERE conf_id = p_conf_id;
--
COMMIT;
--
EXCEPTION
WHEN others THEN
ROLLBACK TO SAVEPOINT before_update;
l_success := FALSE;
p_return_error := caco_utilities.get_module_text(2330);
-- An unexpected error has occurred. Please contact support
caco_debug.putline('efno_confirmations.update_comm_conf : CONF_ID :'||p_conf_id
||chr(10)||' : Error : '||sqlerrm(sqlcode));
-- Write an error and carry on
cout_err.report_and_go( p_exception_number => sqlcode
, p_exception_message => 'Update failed : '
||'CONF_ID :'||p_conf_id||chr(10)
||' : Error : '||sqlerrm(sqlcode)
, p_source => 'efno_confirmations.update_comm_conf');
--
END;
--
RETURN l_success;
--
END update_comm_conf;
--
--
--
--
PROCEDURE clearup_failed_comm_conf( p_conf_id IN confirmations.conf_id%TYPE )
IS
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
--
DELETE conf_net_point_cat_vals
WHERE conf_id = p_conf_id;
--
DELETE confirmations
WHERE conf_id = p_conf_id;
--
COMMIT;
--
EXCEPTION
WHEN others THEN
ROLLBACK;
caco_debug.putline('efno_confirmations.clearup_failed_comm_conf : CONF_ID :'||p_conf_id
||chr(10)||' : Error : '||sqlerrm(sqlcode));
-- Write an error and carry on
cout_err.report_and_go( p_exception_number => sqlcode
, p_exception_message => 'Failed to clear up commercial confirmation - this needs to be done manually : '
||chr(10)||'CONF_ID :'||p_conf_id
||chr(10)||': Error : '||sqlerrm(sqlcode)
, p_source => 'efno_confirmations.clearup_failed_comm_conf');
--
RAISE;
END clearup_failed_comm_conf;
--
--
--
--
--
--
FUNCTION copy_nom_to_cnpcv( p_conf_id IN confirmations.conf_id%TYPE
, p_nomi_id IN nominations.nomi_id%TYPE
, p_cont_id IN contracts.cont_id%TYPE
, p_gas_day IN DATE
, p_return_error OUT VARCHAR2 )
RETURN BOOLEAN
IS
PRAGMA AUTONOMOUS_TRANSACTION;
--
CURSOR c_cnpcv IS
SELECT p_conf_id conf_id
, nnpcv_id nnpcv_id
, value value
, gas_day gas_day
, c.coca_id coca_id
, nomi_id nomi_id
, t.conp_id conp_id
FROM nom_net_point_cat_vals n
,cont_network_points t
,cont_network_points t2
,contract_categories c
,contract_categories c2
WHERE n.nomi_id = p_nomi_id
AND t.cont_id = p_cont_id
AND t.nepo_id = t2.nepo_id
AND t2.conp_id = n.conp_id
AND c.cont_id = p_cont_id
AND c.cate_id = c2.cate_id
AND c2.coca_id = n.coca_id
AND gas_day = p_gas_day;
--
l_success BOOLEAN := TRUE;
l_dummy VARCHAR2(100);
l_value conf_net_point_cat_vals.value%TYPE;
l_interrupted conf_net_point_cat_vals.interrupted%TYPE;
--
BEGIN
caco_debug.putline('SP_CONF: copy_nom_to_cnpcv 001');
caco_debug.putline('p_conf_id: '||p_conf_id);
caco_debug.putline('p_nomi_id: '||p_nomi_id);
caco_debug.putline('p_cont_id: '||p_cont_id);
caco_debug.putline('p_gas_day: '||p_gas_day);
SAVEPOINT before_insert;
--
FOR r IN c_cnpcv LOOP
-- check for an active interruption
l_value := get_interrupted_value( r.conp_id
, r.coca_id
, r.gas_day );
--
/* IF l_value IS NULL THEN
l_value := r.value;
l_interrupted := 'N';
ELSE
IF l_value > r.value THEN
l_value := r.value;
END IF;
l_interrupted := 'Y';
END IF; */ -- removed 13/02 to stop interruptions taking priority
IF l_value IS NOT NULL THEN
l_interrupted := 'Y';
END IF;
--
l_value := r.value;
--
BEGIN
INSERT INTO conf_net_point_cat_vals
( conf_id
, nnpcv_id
, value
, gas_day
, coca_id
, nomi_id
, conp_id
, interrupted )
VALUES
( p_conf_id
, r.nnpcv_id
, l_value
, r.gas_day
, r.coca_id
, r.nomi_id
, r.conp_id
, l_interrupted );
EXCEPTION
WHEN others THEN
ROLLBACK TO SAVEPOINT before_insert;
l_success := FALSE;
p_return_error := caco_utilities.get_module_text(2266);
-- Internal error copying nomination detail records for confirmation. Please contact support
caco_debug.putline('efno_confirmations.copy_nom_to_cnpcv - : NOMI_ID :'||p_nomi_id
||' : Error : '||sqlerrm(sqlcode));
-- Write an error and carry on
cout_err.report_and_go( p_exception_number => sqlcode
, p_exception_message => 'Unexpected Error: '||sqlerrm(sqlcode)
||chr(10)||'NOMI_ID: '||p_nomi_id
||'Failed inserting into conf_net_point_cat_vals '
||'for gas day : '||TO_CHAR(p_gas_day,'DD-MON-YYYY')
, p_source => 'efno_confirmations.copy_nom_to_cnpcv');
--
END;
--
END LOOP;
COMMIT;
--
caco_debug.putline('SP_CONF: copy_nom_to_cnpcv 999');
RETURN l_success;
--
END copy_nom_to_cnpcv;
--
FUNCTION force_comm_conf( p_conf_id IN confirmations.conf_id%TYPE
, p_nomination_row IN nominations%ROWTYPE
, p_contract_row IN contracts%ROWTYPE
, p_gas_day IN DATE
, p_return_error OUT VARCHAR2 )
RETURN BOOLEAN IS
--
nom_invalid BOOLEAN := TRUE;
l_success BOOLEAN := TRUE;
l_tip_nomi_id nominations.nomi_id%TYPE;
l_cont_id_used contracts.cont_id%TYPE;
l_nnpcv_tab nnpcv_tab;
l_contract_row contracts%ROWTYPE;
--
BEGIN
caco_debug.putline('SP_CONF: force_comm_conf 001');
-- We know that the nomination didn't fully validate as we are having to force the confirmation
-- Copy the nomination category values to a global temporary table
IF p_nomination_row.nomi_id IS NOT NULL THEN
--
--
--
l_success := copy_nom_to_cnpcv( p_conf_id
, p_nomination_row.nomi_id
, p_contract_row.cont_id
, p_gas_day
, p_return_error );
--
l_success := remove_surplus_cnpcv ( p_conf_id => p_conf_id
, p_cont_id => p_contract_row.cont_id
, p_return_error => p_return_error
);
--
l_contract_row := p_contract_row;
-- l_contract_row.validation_exception := 'EX';
--
l_success := add_missing_cnpcv ( p_conf_id => p_conf_id
, p_nomi_id => p_nomination_row.nomi_id
, p_contract_row => l_contract_row
, p_gas_day => p_gas_day
, p_return_error => p_return_error
, p_defaulted => 'N'
);
--
ELSE
--
-- No nomination found, precreate the confirmation details (perhaps invalid?)
--
IF p_contract_row.validation_action = 'B' THEN
--
l_contract_row := p_contract_row;
--caco_debug.putline('SP_CONF: force_comm_conf(setting to EX) 500');
-- l_contract_row.validation_exception := 'EX';
l_success := add_missing_cnpcv ( p_conf_id => p_conf_id
, p_nomi_id => NULL
, p_contract_row => l_contract_row
, p_gas_day => p_gas_day
, p_return_error => p_return_error
, p_defaulted => 'N'
);
--
END IF;
--
END IF;
---
-- Look below, if didn't have a nomi_id nothing happened
-- as previously the condition above switches l_success to FALSE
-- now we should have a nomi_id so the remainder should handle all the
-- pitfalls of validating a nomination entered on one contract
-- against another contract!
---
--
-- Now we need to validate the nomination and mark the invalid category/ies
IF l_success THEN
--
-- So what here?
-- We need to know what fails.
--
-- IF l_contract_row.validation_action = 'I'
-- I - leave Invalid
-- Leave the nomination invalid - so nothing to do
-- otherwise....
IF p_contract_row.validation_action = 'T' THEN
-- T - Replace (with exception value)
-- nom_invalid is throwaway here as we wont try to make the nomination valid
-- we will just replace those values that are invalid to the specified value
IF p_nomination_row.nomi_id IS NULL THEN
--
-- If no nom, might as well do as we did before as there is nothing to look back at today
--
nom_invalid := force_validate_cnpcv_nom( p_conf_id => p_conf_id
, p_nomination_row => p_nomination_row
, p_contract_id => p_contract_row.cont_id
, p_gas_day => p_gas_day
, p_replace => TRUE
, p_return_error => p_return_error );
ELSE
--
-- Fix with lookback for today only
--
-- caco_debug.debug_on;
caco_debug.putline('Lookback 0 days');
nom_invalid := force_validate_cnpcv_nom( p_conf_id => p_conf_id
, p_nomination_row => p_nomination_row
, p_contract_id => p_contract_row.cont_id
, p_gas_day => p_gas_day
, p_window => 0
, p_exception => p_contract_row.validation_exception
, p_lookback_action => 'A'
, p_validation_action => p_contract_row.validation_action
, p_return_error => p_return_error );
--
END IF;
--
IF p_return_error IS NOT NULL THEN
-- Have been unable to force the nomination to validate (or unable to fix missing nnpcv)
-- Has to be a serious error!
l_success := FALSE;
--
END IF;
--
ELSIF p_contract_row.validation_action = 'B' THEN
-- B - lookBack
-- Look back - use a loop to keep recalling the validate routine
-- until we have either got a valid nomination or have used min or contracted values
-- <<lookback_loop>>
-- WHILE nom_invalid LOOP
--
nom_invalid := force_validate_cnpcv_nom( p_conf_id => p_conf_id
, p_nomination_row => p_nomination_row
, p_contract_id => p_contract_row.cont_id
, p_gas_day => p_gas_day
, p_window => p_contract_row.validation_window
, p_exception => p_contract_row.validation_exception
, p_lookback_action => p_contract_row.lookback_action
, p_validation_action => p_contract_row.validation_action
, p_return_error => p_return_error );
--
IF p_return_error IS NOT NULL THEN
-- Have been unable to force the nomination to validate
-- Has to be a serious error!
l_success := FALSE;
-- EXIT lookback_loop;
--
END IF;
--EXIT lookback_loop;
--
-- END LOOP lookback_loop;
--
ELSE
--
-- Ignore - replace with eith min, max or contracted, do not attempt lookback.
--
nom_invalid := force_validate_cnpcv_nom( p_conf_id => p_conf_id
, p_nomination_row => p_nomination_row
, p_contract_id => p_contract_row.cont_id
, p_gas_day => p_gas_day
, p_ignore => TRUE
, p_return_error => p_return_error );
--
IF p_return_error IS NOT NULL THEN
-- Have been unable to force the nomination to validate (or unable to fix missing nnpcv)
-- Has to be a serious error!
l_success := FALSE;
--
END IF;
--
END IF;
--
END IF;
--
caco_debug.putline('SP_CONF: force_comm_conf 999');
RETURN l_success;
--
END force_comm_conf;
--
--
--
--
--
FUNCTION create_comm_conf( p_nomi_id IN nominations.nomi_id%TYPE
, p_force IN VARCHAR2
, p_gas_day IN DATE
, p_cont_id IN contracts.cont_id%TYPE
, p_conf_id OUT confirmations.conf_id%TYPE
, p_return_error OUT VARCHAR2 ) RETURN BOOLEAN IS
--
CURSOR c_contract IS
SELECT *
FROM contracts
WHERE cont_id = p_cont_id;
--
CURSOR c_contract_options IS
SELECT *
FROM contract_options
WHERE cont_id = p_cont_id;
--
CURSOR c_customer( cp_cust_id IN NUMBER ) IS
SELECT *
FROM customers
WHERE cust_id = cp_cust_id;
--
CURSOR c_nomination IS
SELECT *
FROM nominations
WHERE nomi_id = p_nomi_id;
--
--
l_contract_row c_contract%ROWTYPE;
l_cont_opt_row c_contract_options%ROWTYPE;
l_nomination_row c_nomination%ROWTYPE;
l_customer_row c_customer%ROWTYPE;
--
l_confirmation_id confirmations.conf_id%TYPE;
l_spreadsheet BLOB;
l_conf_text_clob CLOB;
l_conf_text VARCHAR2(32767);
l_timestamp DATE;
--
l_success BOOLEAN := TRUE;
--
BEGIN
caco_debug.putline('SP_CONF: create_comm_conf 001: '||P_NOMI_ID);
-- Default the conf_id
p_conf_id := -1;
--
-- Get the required details
IF p_nomi_id IS NOT NULL THEN
--
OPEN c_nomination;
FETCH c_nomination
INTO l_nomination_row;
IF c_nomination%NOTFOUND THEN
--
l_success := FALSE;
p_return_error := caco_utilities.get_module_text(2261);
-- Failed to find Nomination Details
--
END IF;
CLOSE c_nomination;
--
END IF;
--
IF l_success THEN
--
OPEN c_contract;
FETCH c_contract
INTO l_contract_row;
IF c_contract%NOTFOUND THEN
--
l_success := FALSE;
p_return_error := caco_utilities.get_module_text(2260);
-- Failed to find Contract details for nomination
--
END IF;
CLOSE c_contract;
--
END IF;
--
IF l_success THEN
--
OPEN c_contract_options;
FETCH c_contract_options
INTO l_cont_opt_row;
IF c_contract_options%NOTFOUND THEN
--
l_success := FALSE;
p_return_error := caco_utilities.get_module_text(2260);
-- Failed to find Contract details for nomination
--
END IF;
CLOSE c_contract_options;
--
END IF;
--
IF l_success THEN
--
OPEN c_customer( l_contract_row.cust_id );
FETCH c_customer INTO l_customer_row;
IF c_customer%NOTFOUND THEN
--
l_success := FALSE;
p_return_error := caco_utilities.get_module_text(2239);
-- Customer not found
--
END IF;
CLOSE c_customer;
--
END IF;
--
-- If everything went well so far then we should create a "stub" of a confirmation
IF l_success THEN
--
l_success := insert_comm_conf( p_nomi_id
, p_cont_id
, p_gas_day
, l_confirmation_id
, p_return_error );
--
END IF;
--
--
IF l_success THEN
--
-- Create the confirmation text as a combination of various bits
l_conf_text := l_cont_opt_row.com_conf_subject;
l_conf_text := l_conf_text||chr(10)||chr(10);
l_conf_text := l_cont_opt_row.com_conf_content;
-- Replace any tokens within the text
l_conf_text := REPLACE(l_conf_text, '{NOMINATION_IDENTIFIER}', l_nomination_row.identifier);
l_conf_text := REPLACE(l_conf_text, '{GAS_DAY}', TO_CHAR(p_gas_day, cout_system_configuration.get_configuration_item('G_DATE_FORMAT')));
l_conf_text := REPLACE(l_conf_text, '{CONFIRMATION_IDENTIFIER}', l_confirmation_id );
--
-- Add this to the temporary CLOB
l_conf_text_clob := NVL(l_conf_text,' ');
--
IF p_force = 'N' THEN
-- Copy the nomination to the confirmation detail table
l_success := copy_nom_to_cnpcv( l_confirmation_id
, p_nomi_id
, p_cont_id
, p_gas_day
, p_return_error );
--
ELSIF p_force = 'Y' THEN
--
-- Need to create a temporary table of the nomination
l_success := force_comm_conf( l_confirmation_id
, l_nomination_row -- currently will be empty if no nomination found (e.g. contract closed)
, l_contract_row
, p_gas_day
, p_return_error );
--
ELSE
--
l_success := FALSE;
p_return_error := caco_utilities.get_module_text(2330);
-- An unexpected error has occurred. Please contact support
--
END IF;
--
-- If the contract has changed and removed a Network Point or Category
-- then we need to remove those nominated network points or categories
-- (it is theoretically possible that the rules wont check everything)
IF l_success THEN
--
l_success := remove_surplus_cnpcv( l_confirmation_id
, l_contract_row.cont_id
, p_return_error );
--
END IF;
--
-- Final check for the created Confirmation.
-- If the contract has changed and Added a Network Point or Category
-- then we need to add the default values for those nepo or cate
-- (it is theoretically possible that the rules wont check everything)
IF l_success THEN
--
l_success := add_missing_cnpcv( l_confirmation_id
, l_nomination_row.nomi_id
, l_contract_row
, p_gas_day
, p_return_error );
--
END IF;
--
IF l_success THEN
-- Create the spreadsheet from the confirmation (conf_net_point_cat_vals)
BEGIN
l_spreadsheet := amfr_excel.return_conf(p_conf_id => l_confirmation_id);
EXCEPTION
WHEN OTHERS THEN
l_success := FALSE;
p_return_error := caco_utilities.get_module_text(2212);
-- An unexpected error has occurred while creating confirmation. Please contact support
END;
END IF;
--
IF l_success THEN
--
-- Finally, Insert it all into the confirmations table
l_success := update_comm_conf( l_confirmation_id
, l_spreadsheet
, l_conf_text_clob
, l_customer_row.conf_type
, p_return_error );
--
IF l_success THEN
-- Set the return confirmation id
p_conf_id := l_confirmation_id;
END IF;
--
ELSE
-- clear up after a failure
clearup_failed_comm_conf( p_conf_id => l_confirmation_id );
--
END IF;
--
END IF;
--
caco_debug.putline('SP_CONF: create_comm_conf 999');
RETURN l_success;
--
EXCEPTION
WHEN OTHERS THEN
caco_debug.putline('efno_confirmations.create_comm_conf - Error : '||sqlerrm(sqlcode));
--
END create_comm_conf;
--
--
--
--
PROCEDURE send_comm_conf( p_gas_day IN VARCHAR2
, p_nomi_id IN owa_util.vc_arr DEFAULT g_vc_arr
, p_cont_id IN owa_util.vc_arr DEFAULT g_vc_arr
, p_accept IN owa_util.vc_arr DEFAULT g_vc_arr
, p_force IN owa_util.vc_arr DEFAULT g_vc_arr )
IS
--
l_s_conf_id owa_util.vc_arr;
l_f_nomi_id owa_util.vc_arr;
l_f_nom_identifier owa_util.vc_arr;
l_f_cont_num owa_util.vc_arr;
l_f_conf_error owa_util.vc_arr;
l_conf_id confirmations.conf_id%TYPE;
l_conf_error VARCHAR2(255);
--
l_gas_day DATE;
l_count_nom NUMBER := 0;
l_successful_nom NUMBER := 0;
l_failed_comm_con NUMBER := 0;
successful_comm_conf BOOLEAN := TRUE;
process_this_nom BOOLEAN := TRUE;
l_success BOOLEAN := TRUE;
--
BEGIN
--
-- caco_debug.debug_on;
--
caco_debug.putline('SP_CONF: send_comm_conf 001');
-- Check we have permission to be using this module.
IF NOT caco_security.security_check('efnow095$') THEN
RETURN;
END IF;
--
-- Check that we have had some data delivered
l_count_nom := NVL(p_nomi_id.COUNT,0);
--
IF l_count_nom = 0
OR NVL(p_accept.COUNT,0) != l_count_nom
OR NVL(p_force.COUNT,0) != l_count_nom
THEN
-- Either no data was passed to the routine or there is a mismatch in the number
-- of data items presented in the three arrays
-- Either way we shouldnt continue as something has gone wrong
l_success := FALSE;
--
END IF;
--
-- Ensure that the passed VARCHAR date converts to DATE
IF l_success THEN
--
BEGIN
SELECT TO_DATE(p_gas_day, cout_system_configuration.get_configuration_item('G_DATE_FORMAT'))
INTO l_gas_day
FROM dual;
EXCEPTION
WHEN others THEN
l_success := FALSE;
END;
--
END IF;
--
IF l_success THEN
--
FOR i IN 1..p_nomi_id.COUNT LOOP
--
-- Reset any variables
successful_comm_conf := TRUE;
process_this_nom := TRUE;
l_conf_error := NULL;
--
-- Lets deal with simplicity first.
IF p_accept(i) = 'Y' THEN
--
-- We just need to create the commercial confirmation spreadsheet directly from
-- the nomination as we know that the nomination was correct (can only 'accept' if it was valid)
-- this saves us from revalidating the entire nomination
successful_comm_conf := create_comm_conf( p_nomi_id(i)
, 'N'
, l_gas_day
, p_cont_id(i)
, l_conf_id
, l_conf_error );
--
ELSIF p_force(i) = 'Y' THEN
--
-- In this scenario, the nomination is not valid
-- We have to revalidate every nominated category against the contract
-- For those items that are invalid, we have to attempt to find valid values either
-- by traversing through all previous tip nominations until we find a valid value -
-- if one is not found then we have to take the contracted or minimum amount from the
-- contract parameter values - or we truncate the value to the contracted or minimum
--
-- If we cannot find a value due to missing nnpcv entries, we should create one based
-- upon the Validation Exception of the Contract - i.e. create a cnpcv entry specifically
-- for the confirmation (only stored in cnpcv - not in nnpcv).
--
caco_debug.putline('efno_confirmation point A10');
successful_comm_conf := create_comm_conf( p_nomi_id(i)
, 'Y'
, l_gas_day
, p_cont_id(i)
, l_conf_id
, l_conf_error
);
caco_debug.putline('efno_confirmation point A20');
--
ELSE
--
-- Dont want to process this one - not accepted and not forced.
--
process_this_nom := FALSE;
--
END IF;
--
--
IF NOT successful_comm_conf
AND process_this_nom
THEN
--
-- We need to record details to pass back to the user - use some arrays
l_failed_comm_con := l_failed_comm_con + 1;
--
-- Get the Nomination Identifier and Contract number
l_f_nomi_id(l_failed_comm_con) := p_nomi_id(i);
l_f_nom_identifier(l_failed_comm_con) := fetch_nom_identifier( p_nomi_id(i) );
l_f_cont_num(l_failed_comm_con) := p_cont_id(i);
l_f_conf_error(l_failed_comm_con) := l_conf_error;
--
ELSIF process_this_nom THEN
--
-- Successful - store info for showing as a mini report
l_successful_nom := l_successful_nom + 1;
--
l_s_conf_id(l_successful_nom) := l_conf_id;
--
END IF;
--
END LOOP;
--
-- need to call the send confirmation screen with appropriate success and failure report.
-- probably better to be a different screen within the efnow095$ package
--
efnow095$.approve_confirmations( 'CREATED'
, l_s_conf_id
, l_f_nomi_id
, l_f_nom_identifier
, l_f_cont_num
, l_f_conf_error );
--
ELSE
-- We should just report an error back to the Send Confirmation screen
efnow095$.startup( p_error => 'Y'
, p_error_text => caco_utilities.get_module_text(2330) );
-- An unexpected error has occurred. Please contact support
--
END IF;
--
caco_debug.putline('SP_CONF: send_comm_conf 999');
--
END send_comm_conf;
--
--
--
--
PROCEDURE app_or_del_comm_conf( p_conf_id IN owa_util.vc_arr DEFAULT g_vc_arr
, p_approve IN owa_util.vc_arr DEFAULT g_vc_arr
, p_delete IN owa_util.vc_arr DEFAULT g_vc_arr
)
IS
--
-- Cursor to get Commercial confirmation details
CURSOR c_conf( cp_conf_id IN NUMBER ) IS
SELECT conf.confirmation
, conf.confirmation_text
, nomi.identifier
, cont.cust_id
, coop.com_conf_subject
, conf.gas_day
, cust.code
, conf.conf_file_type
FROM confirmations conf
, nominations nomi
, contracts cont
, customers cust
, contract_options coop
WHERE conf.conf_id = cp_conf_id
AND conf.nomi_id = nomi.nomi_id (+)
AND conf.cont_id = cont.cont_id
AND cust.cust_id = cont.cust_id
AND coop.cont_id = cont.cont_id;
--
l_conf_rec c_conf%ROWTYPE;
l_timestamp DATE;
l_sms_msg_en VARCHAR2(160);
l_sms_msg_hu VARCHAR2(160);
--
l_document_name documents.name%TYPE;
--
BEGIN
--
-- Check we have permission to be using this module.
IF NOT g_auto_gen THEN
--
IF NOT caco_security.security_check('efnow095$') THEN
RETURN;
END IF;
--
END IF;
--
IF NVL(p_conf_id.COUNT,0) > 0
AND NVL(p_conf_id.COUNT,0) = NVL(p_approve.COUNT,0)
AND NVL(p_conf_id.COUNT,0) = NVL(p_delete.COUNT,0)
THEN
-- We have some data to deal with.
FOR i IN 1..p_conf_id.COUNT LOOP
--
l_conf_rec := NULL;
l_timestamp := NULL;
--
IF p_approve(i) = 'Y'
AND p_delete(i) = 'N'
THEN
--
OPEN c_conf( p_conf_id(i) );
FETCH c_conf INTO l_conf_rec;
IF c_conf%FOUND THEN
--
-- Timestamping
l_timestamp := amfr_timestamp.timestamp_document( p_identifier => p_conf_id(i)
, p_doctype => amfr_timestamp.c_confirmation
, p_file_for_hash => l_conf_rec.confirmation );
--
upd_conf_timestamp( p_conf_id(i)
, l_timestamp
);
--
-- Confirmation Acceptance for Nomination <p1> sent at <p2>
-- Define the English SMS content
l_sms_msg_en := caco_utilities.get_module_text( p_text_number => 2233
, p_language => 'EN' );
l_sms_msg_en := REPLACE( l_sms_msg_en, '<p1>', l_conf_rec.identifier );
l_sms_msg_en := REPLACE( l_sms_msg_en, '<p2>', TO_CHAR(l_timestamp, cout_system_configuration.get_configuration_item('G_DATE_FORMAT')||' HH24:MI:SS') );
--
-- Define the Hungarian SMS content
l_sms_msg_hu := caco_utilities.get_module_text( p_text_number => 2233
, p_language => 'HU' );
l_sms_msg_hu := REPLACE( l_sms_msg_hu, '<p1>', l_conf_rec.identifier );
l_sms_msg_hu := REPLACE( l_sms_msg_hu, '<p2>', TO_CHAR(l_timestamp, cout_system_configuration.get_configuration_item('G_DATE_FORMAT')||' HH24:MI:SS') );
--
-- Replace the tags in the SMS content
--
l_conf_rec.com_conf_subject := REPLACE(l_conf_rec.com_conf_subject, '{NOMINATION_IDENTIFIER}', l_conf_rec.identifier);
l_conf_rec.com_conf_subject := REPLACE(l_conf_rec.com_conf_subject, '{GAS_DAY}', TO_CHAR(l_conf_rec.gas_day, cout_system_configuration.get_configuration_item('G_DATE_FORMAT')));
l_conf_rec.com_conf_subject := REPLACE(l_conf_rec.com_conf_subject, '{CONFIRMATION_IDENTIFIER}', p_conf_id(i) );
--
l_document_name := REPLACE(l_conf_rec.code,' ','_')||'_'||TO_CHAR(l_conf_rec.gas_day, 'YYYYMMDD')||'_'||TO_CHAR(p_conf_id(i));
--
IF l_conf_rec.conf_file_type = 'E' THEN
--
l_document_name := l_document_name||'.xls';
--
ELSIF l_conf_rec.conf_file_type = 'X' THEN
--
l_document_name := l_document_name||'.xml';
--
END IF;
--
efno_msgsubs.send_messages( p_cust_id => l_conf_rec.cust_id
, p_suca_id => efno_msgsubs.get_suca_id( p_suca_group => 'CONFIRMATION'
, p_suca_name => 'ACCEPTANCE' )
, p_email_content_en => DBMS_LOB.SUBSTR(l_conf_rec.confirmation_text,32767,1)
, p_email_subject_en => l_conf_rec.com_conf_subject
, p_sms_content_en => l_sms_msg_en
, p_sms_content_hu => l_sms_msg_hu
, p_file => l_conf_rec.confirmation
, p_filename => l_document_name
, p_file_mime_type => 'application/vnd.ms-excel' );
--
END IF;
CLOSE c_conf;
--
ELSIF p_approve(i) = 'N'
AND p_delete(i) = 'Y'
THEN
--
clearup_failed_comm_conf( p_conf_id(i) );
--
END IF;
--
END LOOP;
--
END IF;
--
-- Finally just recall the approve confirmations screen with no values
-- (if nothing was passed - nothing will have happened)
-- Only call if proc was called from the screen and not through auto generation of confirmations
IF NOT g_auto_gen THEN
efnow095$.approve_confirmations;
END IF;
--
END app_or_del_comm_conf;
--
--
/**
-- PROCEDURE auto_gen_confirmations
-- Automatically generate confirmations for the given gas day.
-- and Customer type (if provided otherwaise all customers)
--
-- %param p_gas_day Gas Day that Commercial confirmations shuold be created for
-- %param p_cuty_id Customer Type ID. All customer if excluded
--
*/
PROCEDURE auto_gen_confirmations( p_gas_day IN DATE
, p_cuty_id IN customer_types.cuty_id%TYPE
, p_cnrt_id IN conf_run_times.cnrt_id%TYPE DEFAULT NULL ) IS
--
l_found_nomination BOOLEAN;
l_nomination_valid BOOLEAN;
l_nomi_id nominations.nomi_id%TYPE;
l_dummy VARCHAR2(255);
l_success BOOLEAN;
--
l_conf_id confirmations.conf_id%TYPE;
l_return_error VARCHAR2(255);
--
l_conf_id_arr owa_util.vc_arr;
l_conf_a_arr owa_util.vc_arr;
l_conf_d_arr owa_util.vc_arr;
--
l_cfrl_id conf_run_log.cfrl_id%TYPE;
--
l_cont_count NUMBER := 0;
l_nom_count NUMBER := 0;
l_force_count NUMBER := 0;
l_conf_sent NUMBER := 0;
l_log_details VARCHAR2(1000);
l_run_date DATE := SYSDATE;
--
BEGIN
--
-- Set global flag to indicate to other confirmation processes we are being called by a job
--
g_auto_gen := TRUE;
--
-- Loop around all active contracts for the cuty
--
caco_debug.putline('Entered efno_confirmation.auto_gen_confirmation with:');
caco_debug.putline('p_gas_day '||p_gas_day);
caco_debug.putline('p_cuty_id '||p_cuty_id);
caco_debug.putline('p_cnrt_id '||p_cnrt_id);
--
IF p_cnrt_id IS NOT NULL THEN
--
INSERT INTO conf_run_log ( cnrt_id
, start_time
)
VALUES ( p_cnrt_id
, SYSDATE
)
RETURNING cfrl_id INTO l_cfrl_id;
--
END IF;
--
FOR cont_rec IN ( SELECT cont.cont_id
,coop.auto_gen_conf
FROM contracts cont
,customers cust
,contract_options coop
WHERE cont.cust_id = cust.cust_id
AND cust.cuty_id = p_cuty_id
AND cont.cont_id = coop.cont_id
AND p_gas_day BETWEEN cont.valid_from AND cont.valid_until
AND cont.status = 'O' ) LOOP
--
l_found_nomination := FALSE;
l_nomination_valid := FALSE;
l_nomi_id := NULL;
l_cont_count := l_cont_count + 1;
--
-- Now look for an active nomination
--
FOR nomi_rec IN ( SELECT nomi.nomi_id
FROM nominations nomi
, nom_net_point_cat_vals nnpcv
WHERE nomi.cont_id = cont_rec.cont_id
AND nnpcv.nomi_id = nomi.nomi_id
AND nomi.status = 'A'
GROUP BY nomi.nomi_id
HAVING p_gas_day BETWEEN MIN(nnpcv.gas_day) AND MAX(nnpcv.gas_day)
) LOOP
--
l_found_nomination := TRUE;
l_nomi_id := nomi_rec.nomi_id;
--
EXIT;
--
END LOOP;
--
IF l_found_nomination THEN
--
-- We have a nomination, lets check that its valid
--
l_nomination_valid := efno_contracts.validate_nomination( cont_rec.cont_id
, l_nomi_id
, l_dummy
);
--
END IF;
--
-- If a nomination was found which is valid, no need to force, otherwise force the commercial confirmation
--
IF l_found_nomination AND l_nomination_valid THEN
--
l_nom_count := l_nom_count + 1;
--
l_success := create_comm_conf( l_nomi_id
, 'N'
, p_gas_day
, cont_rec.cont_id
, l_conf_id
, l_return_error
);
--
ELSE
--
l_force_count := l_force_count + 1;
--
l_success := create_comm_conf( NULL
, 'Y'
, p_gas_day
, cont_rec.cont_id
, l_conf_id
, l_return_error
);
--
END IF;
--
IF l_success AND cont_rec.auto_gen_conf = 'Y' THEN
--
l_conf_sent := l_conf_sent + 1;
--
l_conf_id_arr.DELETE;
l_conf_a_arr.DELETE;
l_conf_d_arr.DELETE;
--
l_conf_id_arr(1):= l_conf_id;
l_conf_a_arr(1) := 'Y';
l_conf_d_arr(1) := 'N';
--
app_or_del_comm_conf( p_conf_id => l_conf_id_arr
, p_approve => l_conf_a_arr
, p_delete => l_conf_d_arr
);
--
ELSIF NOT l_success THEN
--
cout_err.report_and_go( p_exception_number => 20001
, p_exception_message => 'Unable to create confirmation for : '
||' CONT_ID : '
||cont_rec.cont_id
||' : NOMI_ID : '
||l_nomi_id
||CHR(10)
||' Error Msg : '
||l_return_error
, p_source => 'efno_confirmations.auto_gen_confirmations'
);
--
END IF;
--
END LOOP;
--
l_log_details := TO_CHAR(l_cont_count)||' contracts processed, '||TO_CHAR(l_nom_count)||' valid nominations, '||TO_CHAR(l_force_count)||' confirmations forced and '||TO_CHAR(l_conf_sent)||' confirmations automatically sent.';
--
IF p_cnrt_id IS NOT NULL THEN
--
UPDATE conf_run_log
SET end_time = SYSDATE
,log_details = l_log_details
WHERE cfrl_id = l_cfrl_id;
--
END IF;
--
caco_debug.putline('End auto_gen_confirmations');
--
EXCEPTION
--
WHEN OTHERS THEN
--
-- Write an error and stop
--
cout_err.report_and_stop( p_exception_number => SQLCODE
, p_exception_message => 'Automatic Generation of confirmations failed : '
||' Gas Day : '
||TO_CHAR(p_gas_day,'DD-MON-YYYY')
||CHR(10)
||' Error Msg : '
||SQLERRM(SQLCODE)
, p_source => 'efno_confirmations.auto_gen_confirmations'
);
--
END auto_gen_confirmations;
--
--
--
--
/**
-- FUNCTION about
--
-- Returns the version number and VSS header for this package
--
-- %return The version number and VSS header for this package
*/
FUNCTION about RETURN VARCHAR2 IS
BEGIN
RETURN ( g_revision || CHR(10) || g_header );
END about;
--
--
BEGIN
-- Initialization
NULL;
--
END efno_confirmations;
/