CREATE OR REPLACE PACKAGE BODY efnow093$ IS -- -- FUNCTION validate_array( p_item_name_array IN owa_util.vc_arr , p_item_value_array IN owa_util.vc_arr , p_message IN OUT VARCHAR2 ) RETURN BOOLEAN IS -- l_return BOOLEAN; -- BEGIN -- -- Have an optimisitc viewpoint -- l_return := TRUE; -- IF p_item_name_array.COUNT < 1 THEN -- l_return := FALSE; p_message := caco_utilities.get_module_text(2283); -- No paramaters passed -- END IF; -- IF l_return AND p_item_value_array.COUNT < 1 THEN -- l_return := FALSE; p_message := caco_utilities.get_module_text(2282); -- No paramater values passed -- END IF; -- IF l_return AND p_item_value_array.COUNT <> p_item_name_array.COUNT THEN -- l_return := FALSE; p_message := caco_utilities.get_module_text(2307); -- There is a mismatch in parameters and values -- END IF; -- RETURN l_return; -- END validate_array; -- -- FUNCTION scan_array( p_item_name_array IN owa_util.vc_arr , p_item_value_array IN owa_util.vc_arr , p_scan_name IN VARCHAR2 ) RETURN VARCHAR2 IS -- l_return VARCHAR2(4000) := NULL; -- BEGIN -- -- Loop around all items in the passed array -- FOR i IN p_item_name_array.FIRST .. p_item_name_array.LAST LOOP -- -- Search the array for the passed item -- IF p_item_name_array(i) = p_scan_name THEN -- l_return := p_item_value_array(i); -- END IF; -- END LOOP; -- -- Just return the value - should we distinguish between notfound and no value? -- RETURN l_return; -- END scan_array; -- FUNCTION dad_path RETURN VARCHAR2 IS BEGIN RETURN(lower(owa_util.get_cgi_env('REQUEST_PROTOCOL') || '://' || owa_util.get_cgi_env('HTTP_HOST') || owa_util.get_cgi_env('SCRIPT_NAME') || '/')); END dad_path; PROCEDURE autocomplete_js IS BEGIN htp.p('// =================================================================== // Author: Matt Kruse // WWW: http://www.mattkruse.com/ // // NOTICE: You may use this code for any purpose, commercial or // private, without any further permission from the author. You may // remove this notice from your final code if you wish, however it is // appreciated by the author if at least my web site address is kept. // =================================================================== // ------------------------------------------------------------------- // autoComplete (text_input, select_input, ["text"|"value"], [true|false]) // Use this function when you have a SELECT box of values and a text // input box with a fill-in value. Often, onChange of the SELECT box // will fill in the selected value into the text input (working like // a Windows combo box). Using this function, typing into the text // box will auto-select the best match in the SELECT box and do // auto-complete in supported browsers. // Arguments: // field = text input field object // select = select list object containing valid values // property = either "text" or "value". This chooses which of the // SELECT properties gets filled into the text box - // the ''value'' or ''text'' of the selected option // forcematch = true or false. Set to ''true'' to not allow any text // in the text box that does not match an option. Only // supported in IE (possible future Netscape). // ------------------------------------------------------------------- function autoComplete (field, select, property, forcematch) { var found = false; for (var i = 0; i < select.options.length; i++) { if (select.options[i][property].toUpperCase().indexOf(field.value.toUpperCase()) == 0) { found=true; break; } } if (found) { select.selectedIndex = i; } else { select.selectedIndex = -1; } if (field.createTextRange) { if (forcematch && !found) { field.value=field.value.substring(0,field.value.length-1); return; } var cursorKeys ="8;46;37;38;39;40;33;34;35;36;45;"; if (cursorKeys.indexOf(event.keyCode+";") == -1) { var r1 = field.createTextRange(); var oldValue = r1.text; var newValue = found ? select.options[i][property] : oldValue; if (newValue != field.value) { field.value = newValue; var rNew = field.createTextRange(); rNew.moveStart(''character'', oldValue.length) ; rNew.select(); } } } } '); END autocomplete_js; -- -- PROCEDURE rules_js IS BEGIN htp.p(' function addOperator(side, operator) { var idName = "p_" + side + "_side"; var elemId = document.getElementById(idName); elemId.focus(); elemId.value += operator + " "; } function addToken(side, tokenId) { var sideIdName = "p_" + side + "_side"; var elemId = document.getElementById(sideIdName); elemId.focus(); var itemId = document.getElementById(tokenId); if (itemId.selectedIndex >= 0) { var tokenValue = itemId.options[itemId.selectedIndex].value; elemId.value += "$<" + tokenValue + "> "; } } function ruleReset(side) { var elemId = document.getElementById("p_" + side + "_side"); elemId.focus(); elemId.value = ""; } function ruleResetAll() { ruleReset(''left''); ruleReset(''right''); } function clearItem(item) { document.getElementById(item).value = ""; } function stripSpace (inString) { var outString = ""; for (i = 0; i < inString.length; i++) { if (inString.charAt(i) != " " ) { outString += inString.charAt(i); } } return outString } function createTokenId( value ) { var newTokenString = value.toLowerCase(); newTokenString = stripSpace( newTokenString ); return newTokenString; } function changeContractLists() { var contract_id = document.getElementById(''p_contract_id'').value; var theRuleType = document.getElementById(''p_rule_type''); var selectedRuleType = theRuleType.options[theRuleType.selectedIndex].value; var currentURL = window.location.href; var newURL = currentURL.substr( 0, currentURL.indexOf("startup") + 7); newURL += "?p_item_name_array=P_CATEGORY&p_item_value_array=CONTRACT"; newURL += "&p_item_name_array=P_CONTRACT_ID&p_item_value_array=" + contract_id; newURL += "&p_item_name_array=P_RULE_TYPE&p_item_value_array=" + selectedRuleType; location.href = newURL; //location.reload(); } function confirmUpdate( theText ) { //check if they wish to proceed var confText = '''||caco_utilities.get_module_text(2229)||'''; if (confirm(confText)){ var theForm = document.getElementById(''ruleform''); theForm.submit(); } } '); END rules_js; PROCEDURE m_rules_css IS BEGIN htp.p(' #p_rule_name { width : 400px; } #p_rule_type { width : 80px; } .rule_err_message { width : 500px; } //#theRule { // background-color : #FEFFE8; //} #ruleLeftSide { float : left; } #ruleRelation { float : left; text-align : center; } .ruleText { font-size : 90%; } .ruleOp { width : 25px; height : 25px; font-weight : bold; } .ruleButtonReset { height : 25px; font-size : smaller; } * { -moz-box-sizing : border-box; } #ruleTokens { position : absolute; top : 460px; left : 80px; width : 640px; height : 50px; } #ruleSitesDiv { position : absolute; top : 515px; left : 80px; width : 640px; height : 87px; } '); END m_rules_css; PROCEDURE display_rule_category( p_category IN VARCHAR2 , p_contract_id IN NUMBER , p_template_id IN NUMBER , p_rule_id IN NUMBER , p_rule_type IN VARCHAR2 DEFAULT 'ROW' ) IS -- l_display_name VARCHAR2(50) := NULL; -- -- Cursor to get the Template Name CURSOR c_template IS SELECT name FROM contract_templates WHERE cote_id = p_template_id; -- -- -- Cursor to get the Contract Number CURSOR c_contract IS SELECT contract_number FROM contracts WHERE cont_id = p_contract_id; -- BEGIN IF UPPER(p_category) = 'TEMPLATE' THEN -- OPEN c_template; FETCH c_template INTO l_display_name; CLOSE c_template; -- -- Put hidden parameters -- htp.p(''); htp.p(''); htp.p(''); htp.p(''); -- -- Display Template Information htp.p(' '); -- Contract Template Name htp.p('
'||caco_utilities.get_module_text(2090)||'  '||l_display_name||'

'); -- ELSIF UPPER(p_category) = 'CONTRACT' THEN -- OPEN c_contract; FETCH c_contract INTO l_display_name; CLOSE c_contract; -- -- Put hidden parameters -- htp.p(''); htp.p(''); -- IF p_rule_type = 'ROW' THEN htp.p(''); htp.p(''); ELSE -- SHEET htp.p(''); htp.p(''); END IF; -- -- Display Contract Information htp.p(' '); -- Contract Number htp.p('
'||caco_utilities.get_module_text(2013)||'  '||l_display_name||'

'); -- ELSE -- This is a brand new ROW based rule (as it is not possible to create -- a SHEET based rule for anything other than a contract) -- So here we need to output just the empty hidden parameters -- htp.p(''); htp.p(''); htp.p(''); htp.p(''); -- END IF; END display_rule_category; PROCEDURE get_rule_details( p_category IN VARCHAR , p_rule_id IN NUMBER , p_rule_record OUT rule_record , p_rule_type IN VARCHAR2 DEFAULT 'ROW' ) IS -- Cursor to pull back existing Contract Rule information if contract rule id is supplied. CURSOR c_contract_rule IS SELECT rule_id , rule_name , left_side , right_side , rule_relation , error_message_hu , error_message_en FROM contract_rules WHERE coru_id = p_rule_id; -- -- Cursor to pull back ROW based rule info for a given rule_id -- Called AFTER c_contract_rule for contracts CURSOR c_rule IS SELECT rule_id , rule_name , left_side , right_side , rule_relation , error_message_hu , error_message_en FROM rules WHERE rule_id = p_rule_id; -- BEGIN IF p_category = 'TEMPLATE' THEN -- OPEN c_rule; FETCH c_rule INTO p_rule_record; CLOSE c_rule; -- ELSIF p_category = 'CONTRACT' THEN -- IF p_rule_type = 'ROW' THEN -- OPEN c_rule; FETCH c_rule INTO p_rule_record; CLOSE c_rule; -- ELSE -- OPEN c_contract_rule; FETCH c_contract_rule INTO p_rule_record; CLOSE c_contract_rule; -- END IF; -- ELSE -- Get a standalone rule OPEN c_rule; FETCH c_rule INTO p_rule_record; CLOSE c_rule; -- END IF; END get_rule_details; PROCEDURE get_contract_categories( p_contract_id IN NUMBER , p_rule_type IN VARCHAR2 , p_category_array OUT token_array ) IS -- Cursor to generate appropriate Category list for given contract information -- for ROW contract rules only -- Not to be used at all if the screen has been called from a contract -- and the rule is inherited from a contract template CURSOR c_contract_row_cat IS SELECT cate.name token_name , cate.code token_value -- Unique Category Code , coca.display_sequence display_sequence -- Used for ordering purposes only FROM contract_categories coca , categories cate WHERE coca.cate_id = cate.cate_id AND coca.cont_id = p_contract_id ORDER BY coca.display_sequence ASC , cate.name; -- -- -- Cursor to generate appropriate Category list for given contract information -- for SHEET contract rules only -- Not to be used at all if the screen has been called from a contract -- and the rule is inherited from a contract template CURSOR c_contract_sheet_cat IS SELECT nepo.name||'.'||cate.name||' ('||cate.units||')' token_name -- Will be seen in the select list , nepo.code||'.'||cate.code token_value -- Will be the select list value , coca.display_sequence coca_display -- Used for ordering , conp.display_sequence conp_display -- Used for ordering , nepo.name nepo_name -- Used for ordering , cate.name cate_name -- Used for ordering FROM network_points nepo , cont_network_points conp -- Yes. This is a Cartesian Product , contract_categories coca -- between the network points and categories , categories cate -- Deliberately done. WHERE coca.cate_id = cate.cate_id AND coca.cont_id = p_contract_id AND nepo.nepo_id = conp.nepo_id AND conp.cont_id = p_contract_id ORDER BY conp.display_sequence , nepo.name , coca.display_sequence , cate.name; -- -- -- Cursor to generate appropriate network point group Category list for given contract information -- for SHEET contract rules only -- CURSOR c_nepg_cat IS SELECT nepg.name||'.'||cate.name||' ('||cate.units||')' token_name -- Will be seen in the select list , nepg.code||'.'||cate.code token_value -- Will be the select list value FROM network_point_groups nepg , network_point_mappings nepm , network_points nepo , cont_network_points conp , contract_categories coca , categories cate WHERE coca.cate_id = cate.cate_id AND coca.cont_id = p_contract_id AND nepo.nepo_id = conp.nepo_id AND conp.cont_id = p_contract_id AND nepm.nepo_id = nepo.nepo_id AND nepm.nepg_id = nepg.nepg_id GROUP BY nepg.name||'.'||cate.name||' ('||cate.units||')' , nepg.code||'.'||cate.code ORDER BY 1; -- l_count NUMBER := 0; BEGIN -- IF p_rule_type = 'SHEET' THEN -- -- add the network point group categories to the array first FOR i IN c_nepg_cat LOOP -- l_count := l_count + 1; -- p_category_array(l_count).token_name := i.token_name; p_category_array(l_count).token_value := i.token_value; -- END LOOP; -- FOR r IN c_contract_sheet_cat LOOP -- l_count := l_count + 1; -- p_category_array(l_count).token_name := r.token_name; p_category_array(l_count).token_value := r.token_value; -- END LOOP; -- ELSE -- FOR r IN c_contract_row_cat LOOP -- l_count := l_count + 1; -- p_category_array(l_count).token_name := r.token_name; p_category_array(l_count).token_value := r.token_value; -- END LOOP; -- END IF; -- END get_contract_categories; PROCEDURE get_template_categories( p_template_id IN NUMBER , p_category_array OUT token_array ) IS -- -- Cursor to generate appropriate Category list for given contract TEMPLATE information -- Only ROW rules are available for contract templates (no references to network points) CURSOR c_template_cat IS SELECT cotc.display_sequence -- Used for ordering purposes only , cate.name||' ('||cate.units||')' token_name , cate.code token_value -- Unique Category Code FROM contract_template_categories cotc , categories cate WHERE cotc.cate_id = cate.cate_id AND cotc.cote_id = p_template_id ORDER BY cotc.display_sequence ASC , cate.name||' ('||cate.units||')' , cate.code; -- l_count NUMBER := 0; -- BEGIN -- FOR r IN c_template_cat LOOP -- l_count := l_count + 1; -- p_category_array(l_count).token_name := r.token_name; p_category_array(l_count).token_value := r.token_value; -- END LOOP; -- END get_template_categories; PROCEDURE get_all_categories( p_category_array OUT token_array ) IS CURSOR c_categories IS SELECT name||' ('||units||')' name , code FROM categories ORDER BY name||' ('||units||')'; -- l_count NUMBER := 0; -- BEGIN -- FOR r IN c_categories LOOP -- l_count := l_count + 1; -- p_category_array(l_count).token_name := r.name; p_category_array(l_count).token_value := r.code; -- END LOOP; -- END get_all_categories; PROCEDURE display_categories( p_category_array IN token_array ) IS BEGIN -- -- htp.p(' '); -- Category Filter htp.p('
'||caco_utilities.get_module_text(2134)||'
'); -- END display_categories; -- -- PROCEDURE get_standard_params( p_index IN OUT NUMBER , p_parameter_array IN OUT token_array ) IS BEGIN -- Add standard parameters p_index := p_index + 1; -- -- p_parameter_array(p_index).token_name := 'Hours In Gas Day'; p_parameter_array(p_index).token_value := 'hours_in_gas_day'; -- -- -- Add any new standard parameters below this comment -- END get_standard_params; -- PROCEDURE get_contract_parameters( p_contract_id IN NUMBER , p_rule_type IN VARCHAR2 , p_parameter_array OUT token_array ) IS -- -- Cursor to generate appropriate Parameter list for given contract information -- for ROW contract rules only -- Not to be used at all if the screen has been called from a contract -- and the rule is inherited from a contract template CURSOR c_contract_row_par IS SELECT token_name , token_value FROM ( SELECT pars.name token_name , pars.code token_value FROM contract_parameters copa , parameters pars WHERE copa.pars_id = pars.pars_id AND copa.cont_id = p_contract_id AND pars.cate_id IS NULL UNION ALL SELECT pars.name||' ('||cate.units||')' token_name , pars.code token_value FROM contract_parameters copa , parameters pars , categories cate WHERE copa.pars_id = pars.pars_id AND pars.cate_id = cate.cate_id AND copa.cont_id = p_contract_id ) ORDER BY token_name; -- -- -- Cursor to generate appropriate Parameter list for given contract information -- for SHEET contract rules only -- Not to be used at all if the screen has been called from a contract -- and the rule is inherited from a contract template CURSOR c_contract_sheet_par IS SELECT token_name , token_value FROM ( SELECT nepo.name||'.'||pars.name token_name -- Will be seen in the select list , nepo.code||'.'||pars.code token_value -- Will be the select list value FROM network_points nepo , cont_network_points conp -- Yes. This is a Cartesian Product , contract_parameters copa -- between the network points and parameters , parameters pars -- Deliberately done. WHERE copa.pars_id = pars.pars_id AND copa.cont_id = p_contract_id AND nepo.nepo_id = conp.nepo_id AND conp.cont_id = p_contract_id AND pars.cate_id IS NULL UNION ALL SELECT nepo.name||'.'||pars.name||' ('||cate.units||')' token_name -- Will be seen in the select list , nepo.code||'.'||pars.code token_value -- Will be the select list value FROM network_points nepo , cont_network_points conp -- Yes. This is a Cartesian Product , contract_parameters copa -- between the network points and parameters , parameters pars -- Deliberately done. , categories cate WHERE copa.pars_id = pars.pars_id AND copa.cont_id = p_contract_id AND cate.cate_id = pars.cate_id AND nepo.nepo_id = conp.nepo_id AND conp.cont_id = p_contract_id ) ORDER BY token_name; -- -- Cursor to generate appropriate network point group parameter list for a given contract -- for SHEET contract rules only -- CURSOR c_npgp IS SELECT nepg.name||'.'||npgp.name token_name -- Will be seen in the select list , nepg.code||'.'||npgp.code token_value -- Will be the select list value FROM network_point_groups nepg , network_point_gp_params npgp WHERE nepg.nepg_id = npgp.nepg_id AND npgp.cont_id = p_contract_id; -- l_count NUMBER := 0; -- BEGIN -- Add any standard Parameters -- get_standard_params( l_count, p_parameter_array ); -- -- IF p_rule_type = 'SHEET' THEN -- add network point group parameters to array first FOR i IN c_npgp LOOP -- l_count := l_count + 1; -- p_parameter_array(l_count).token_name := i.token_name; p_parameter_array(l_count).token_value := i.token_value; -- END LOOP; -- FOR r IN c_contract_sheet_par LOOP -- l_count := l_count + 1; -- p_parameter_array(l_count).token_name := r.token_name; p_parameter_array(l_count).token_value := r.token_value; -- END LOOP; -- ELSE -- FOR r IN c_contract_row_par LOOP -- l_count := l_count + 1; -- p_parameter_array(l_count).token_name := r.token_name; p_parameter_array(l_count).token_value := r.token_value; -- END LOOP; -- END IF; -- END get_contract_parameters; PROCEDURE get_template_parameters( p_template_id IN NUMBER , p_parameter_array OUT token_array ) IS -- -- Cursor to generate appropriate Parameter list for given contract TEMPLATE information -- Only ROW rules are available for contract templates (no references to network points) CURSOR c_template_par IS SELECT token_name , token_value FROM ( SELECT pars.name token_name , pars.code token_value FROM contract_template_params cotp , parameters pars WHERE cotp.pars_id = pars.pars_id AND cotp.cote_id = p_template_id AND pars.cate_id IS NULL UNION ALL SELECT pars.name||' ('||cate.units||')' token_name , pars.code token_value FROM contract_template_params cotp , parameters pars , categories cate WHERE cotp.pars_id = pars.pars_id AND pars.cate_id = cate.cate_id AND cotp.cote_id = p_template_id ) ORDER BY token_name; -- l_count NUMBER := 0; -- BEGIN -- Add any standard Parameters -- get_standard_params( l_count, p_parameter_array ); -- -- FOR r IN c_template_par LOOP -- l_count := l_count + 1; -- p_parameter_array(l_count).token_name := r.token_name; p_parameter_array(l_count).token_value := r.token_value; -- END LOOP; -- END get_template_parameters; PROCEDURE get_all_parameters( p_parameter_array OUT token_array ) IS CURSOR c_parameters IS SELECT name , code FROM ( SELECT pars.name name , pars.code code FROM parameters pars WHERE pars.cate_id IS NULL UNION ALL SELECT pars.name||' ('||cate.units||')' , pars.code FROM parameters pars , categories cate WHERE pars.cate_id = cate.cate_id ) ORDER BY name , code; -- l_count NUMBER := 0; -- BEGIN -- Add any standard Parameters -- get_standard_params( l_count, p_parameter_array ); -- -- FOR r IN c_parameters LOOP -- l_count := l_count + 1; -- p_parameter_array(l_count).token_name := r.name; p_parameter_array(l_count).token_value := r.code; -- END LOOP; -- END get_all_parameters; PROCEDURE display_parameters( p_parameter_array IN token_array ) IS BEGIN -- -- htp.p('
'||caco_utilities.get_module_text(2135)||'
'); -- END display_parameters; -- -- PROCEDURE display_buttons( p_ins_or_upd IN VARCHAR2 , p_screen_category IN VARCHAR2 , p_rule_id IN NUMBER DEFAULT 0 , p_contract_id IN NUMBER DEFAULT 0 , p_template_id IN NUMBER DEFAULT 0 ) IS -- Cursor to see if contracts or OTHER contract templates have this rule CURSOR c_coru IS SELECT 'X' FROM contract_rules coru , contracts cont WHERE coru.cont_id = cont.cont_id AND NVL(coru.rule_id,-1) = p_rule_id UNION ALL SELECT 'X' FROM contract_template_rules WHERE rule_id = p_rule_id AND cote_id != p_template_id; -- -- Cursor to find any contracts/contract templates that have this rule CURSOR c_cotr IS SELECT 'X' FROM contract_template_rules cotr , contracts cont WHERE cotr.cote_id = cont.cote_id AND cont.cont_id != p_contract_id AND cotr.rule_id = p_rule_id UNION ALL SELECT 'X' FROM contract_rules coru , contracts cont WHERE coru.cont_id = cont.cont_id AND coru.cont_id != p_contract_id AND NVL(coru.rule_id,-1) = p_rule_id; -- -- Cursor to see if ANY contracts or templates have this rule (if updating standalone) CURSOR c_rules IS SELECT 'X' FROM contract_rules WHERE NVL(rule_id,-1) = p_rule_id UNION ALL SELECT 'X' FROM contract_template_rules WHERE rule_id = p_rule_id; -- l_url VARCHAR2(255) := NULL; l_dummy VARCHAR2(1) := 'X'; -- BEGIN -- IF p_ins_or_upd = 'INSERT' THEN -- htp.p(''); -- Insert -- END IF; -- -- Set the cancel button to return to the calling page -- we can work this out from the passed parameters IF p_screen_category = 'TEMPLATE' THEN -- IF p_ins_or_upd = 'UPDATE' THEN -- check if any contracts not on this template have this rule OPEN c_coru; FETCH c_coru INTO l_dummy; IF c_coru%FOUND THEN htp.p(''); -- Update ELSE htp.p(''); -- Update END IF; CLOSE c_coru; -- END IF; -- l_url := dad_path||'efnow050$.template_rules?p_template_id='||p_template_id; -- ELSIF p_screen_category = 'CONTRACT' THEN -- IF p_ins_or_upd = 'UPDATE' THEN -- check if any other contracts or templates have this rule OPEN c_cotr; FETCH c_cotr INTO l_dummy; IF c_cotr%FOUND THEN htp.p(''); -- Update ELSE htp.p(''); -- Update END IF; CLOSE c_cotr; -- END IF; -- l_url := dad_path||'efnow050$.contract_rules?p_contract_id='||p_contract_id; -- ELSE IF p_ins_or_upd = 'UPDATE' THEN -- Check if the rule is used ANYwhere OPEN c_rules; FETCH c_rules INTO l_dummy; IF c_rules%FOUND THEN htp.p(''); -- Update ELSE htp.p(''); -- Update END IF; CLOSE c_rules; -- END IF; -- -- Rules screen called from main menu - just go home. l_url := dad_path||'efnow080$.startup'; -- END IF; -- htp.p(''); -- Cancel -- END display_buttons; -- -- PROCEDURE startup( p_item_name_array IN owa_util.vc_arr DEFAULT g_vc_arr , p_item_value_array IN owa_util.vc_arr DEFAULT g_vc_arr ) IS -- l_rule_record rule_record; -- l_error_message VARCHAR2(100); -- l_rule_category VARCHAR2(8) := NULL; l_template_id NUMBER := 0; l_contract_id NUMBER := 0; l_rule_id NUMBER := 0; l_button_rule_id NUMBER := 0; l_contract_rule_type VARCHAR2(5) := 'ROW'; -- l_ins_or_upd VARCHAR2(6) := 'INSERT'; -- category_array token_array; parameter_array token_array; -- l_success VARCHAR2(1) := NULL; -- -- Variables used when an error has occurred whilst trying to insert or update a rule -- _re_ - stands for rule_error (a shortening) -- l_rule_error VARCHAR2(1) := NULL; l_re_message VARCHAR2(250) := NULL; l_re_ins_or_upd VARCHAR2(6) := NULL; -- BEGIN -- -- Check we have permission to be using this module. IF NOT caco_security.security_check(g_package_name) THEN RETURN; END IF; -- caco_debug.putline('efnow093$.startup'); -- -- Ensure any passed parameres are correct -- IF validate_array( p_item_name_array => p_item_name_array , p_item_value_array => p_item_value_array , p_message => l_error_message ) THEN -- -- Look for what type of screen we have -- -- Find out if this was inserted or updated and had an error -- l_rule_error := scan_array( p_item_name_array => p_item_name_array , p_item_value_array => p_item_value_array , p_scan_name => 'P_ERROR' ); -- IF l_rule_error IS NOT NULL AND l_rule_error = 'Y' THEN -- -- Get the error message l_re_message := scan_array( p_item_name_array => p_item_name_array , p_item_value_array => p_item_value_array , p_scan_name => 'P_ERR_MSG' ); -- -- We need to build the page according to the returned error data -- This will be the originally submitted information -- -- Find insert or update l_re_ins_or_upd := scan_array( p_item_name_array => p_item_name_array , p_item_value_array => p_item_value_array , p_scan_name => 'P_INS_OR_UPD' ); -- IF l_re_ins_or_upd IS NOT NULL THEN l_ins_or_upd := l_re_ins_or_upd; END IF; -- -- Find the template id l_template_id := TO_NUMBER( scan_array( p_item_name_array => p_item_name_array , p_item_value_array => p_item_value_array , p_scan_name => 'P_TEMPLATE_ID' ) ); -- IF l_template_id IS NOT NULL AND l_template_id > 0 THEN l_rule_category := 'TEMPLATE'; END IF; -- -- Find the contract id l_contract_id := TO_NUMBER( scan_array( p_item_name_array => p_item_name_array , p_item_value_array => p_item_value_array , p_scan_name => 'P_CONTRACT_ID' ) ); -- IF l_contract_id IS NOT NULL AND l_contract_id > 0 THEN l_rule_category := 'CONTRACT'; END IF; -- -- Find the Rule id l_rule_id := TO_NUMBER( scan_array( p_item_name_array => p_item_name_array , p_item_value_array => p_item_value_array , p_scan_name => 'P_RULE_ID' ) ); -- IF l_rule_id IS NULL OR l_rule_id = 0 THEN -- Find the Contract Rule Id l_rule_id := TO_NUMBER( scan_array( p_item_name_array => p_item_name_array , p_item_value_array => p_item_value_array , p_scan_name => 'P_CORU_ID' ) ); END IF; -- -- Find the rule name l_rule_record.rule_name := scan_array( p_item_name_array => p_item_name_array , p_item_value_array => p_item_value_array , p_scan_name => 'P_RULE_NAME' ); -- -- Find the rule type l_contract_rule_type := scan_array( p_item_name_array => p_item_name_array , p_item_value_array => p_item_value_array , p_scan_name => 'P_RULE_TYPE' ); -- IF l_contract_rule_type IS NULL THEN l_contract_rule_type := 'ROW'; END IF; -- -- Find the Hungarian error message l_rule_record.err_message_hu := scan_array( p_item_name_array => p_item_name_array , p_item_value_array => p_item_value_array , p_scan_name => 'P_ERR_MESSAGE_HU' ); -- -- Find the English error message l_rule_record.err_message_en := scan_array( p_item_name_array => p_item_name_array , p_item_value_array => p_item_value_array , p_scan_name => 'P_ERR_MESSAGE_EN' ); -- -- Find the left side text l_rule_record.left_side := scan_array( p_item_name_array => p_item_name_array , p_item_value_array => p_item_value_array , p_scan_name => 'P_LEFT_SIDE' ); -- -- Find the Rule Relation l_rule_record.rule_relation := scan_array( p_item_name_array => p_item_name_array , p_item_value_array => p_item_value_array , p_scan_name => 'P_RULE_RELATION' ); -- -- Find the Right side text l_rule_record.right_side := scan_array( p_item_name_array => p_item_name_array , p_item_value_array => p_item_value_array , p_scan_name => 'P_RIGHT_SIDE' ); -- ELSE -- Not an error - check for non-error name value pairs -- -- Was this a successful Insert or Update? l_success := scan_array( p_item_name_array => p_item_name_array , p_item_value_array => p_item_value_array , p_scan_name => 'P_SUCCESS' ); -- -- l_rule_category := scan_array( p_item_name_array => p_item_name_array , p_item_value_array => p_item_value_array , p_scan_name => 'P_CATEGORY' ); -- IF l_rule_category = 'TEMPLATE' THEN -- -- Get the template id -- l_template_id := to_number( scan_array( p_item_name_array => p_item_name_array , p_item_value_array => p_item_value_array , p_scan_name => 'P_TEMPLATE_ID' ) ); -- IF l_template_id IS NOT NULL AND l_template_id > 0 THEN -- -- Get the Appropriate rule data -- l_rule_id := to_number( scan_array( p_item_name_array => p_item_name_array , p_item_value_array => p_item_value_array , p_scan_name => 'P_RULE_ID' ) ); -- IF l_rule_id IS NOT NULL AND l_rule_id > 0 THEN -- -- An existing Rule - we are Updating -- l_ins_or_upd := 'UPDATE'; -- -- need to go get all the rule details for showing later -- get_rule_details( 'TEMPLATE' , l_rule_id , l_rule_record ); -- ELSE -- -- No Rule supplied - must be creating a new one -- l_ins_or_upd := 'INSERT'; -- END IF; END IF; -- ELSIF l_rule_category = 'CONTRACT' THEN -- -- Get the contract id -- l_contract_id := to_number( scan_array( p_item_name_array => p_item_name_array , p_item_value_array => p_item_value_array , p_scan_name => 'P_CONTRACT_ID' ) ); -- IF l_contract_id IS NOT NULL AND l_contract_id > 0 THEN -- -- Get the Appropriate rule data -- l_rule_id := to_number( scan_array( p_item_name_array => p_item_name_array , p_item_value_array => p_item_value_array , p_scan_name => 'P_RULE_ID' ) ); -- IF l_rule_id IS NULL or l_rule_id = 0 THEN -- -- Rule will be a SHEET contract rule -- l_rule_id := to_number( scan_array( p_item_name_array => p_item_name_array , p_item_value_array => p_item_value_array , p_scan_name => 'P_CORU_ID' ) ); -- l_contract_rule_type := 'SHEET'; -- END IF; -- IF l_rule_id IS NOT NULL AND l_rule_id > 0 THEN -- -- An existing Rule - we are Updating -- l_ins_or_upd := 'UPDATE'; -- -- need to go get all the rule details for showing later -- get_rule_details( 'CONTRACT' , l_rule_id , l_rule_record , l_contract_rule_type ); -- ELSE -- -- No Rule supplied - must be creating a new one -- l_ins_or_upd := 'INSERT'; -- -- See if the rule type was passed (as this determines what categories and parameters are available l_contract_rule_type := scan_array( p_item_name_array => p_item_name_array , p_item_value_array => p_item_value_array , p_scan_name => 'P_RULE_TYPE' ); -- Entry Mandatory Offer Contracts can only create SHEET Rules IF efno_contracts.emo_contract(l_contract_id) = 'Y' THEN l_contract_rule_type := 'SHEET'; END IF; -- END IF; END IF; -- End of contract id not null or zero -- ELSE -- Not from template or contract - check if a standalone rule -- -- Get the Appropriate rule data -- l_rule_id := to_number( scan_array( p_item_name_array => p_item_name_array , p_item_value_array => p_item_value_array , p_scan_name => 'P_RULE_ID' ) ); -- IF l_rule_id IS NOT NULL AND l_rule_id > 0 THEN -- -- An existing Rule - we are Updating -- l_ins_or_upd := 'UPDATE'; -- -- need to go get all the rule details for showing later -- get_rule_details( NULL -- Standalone rule , l_rule_id , l_rule_record , l_contract_rule_type ); -- ELSE -- -- No Rule supplied - must be creating a new one -- l_ins_or_upd := 'INSERT'; -- END IF; END IF; --End of category check -- END IF; -- Error or not -- ELSE -- Duff parameters... l_rule_category := 'NONE'; -- END IF; -- -- -- htp.p(''); -- htp.p(chr(10)||''); -- wsgl.openpagehead(g_title); --wsgl.metatag; --htp.p(''); caco_system.content_type; htp.p(chr(10)||''); htp.p(chr(10)||''); htp.p(chr(10)||''); htp.p(chr(10)||''); -- -- wsgl.closepagehead; wsgl.openpagebody(FALSE); htp.p(caco_system.menu); -- -- -- Here comes the fun bit. Or should that be the 'slightly more complicated' bit? -- -- Put out the screen title in a bordered div htp.p('

'||caco_utilities.get_module_text(2125)||'

'); -- Maintain Rule -- -- Put out success or error messages from completed or failed insert/update -- IF l_success = 'Y' THEN htp.p(''||caco_utilities.get_module_text(876)||'

'); -- Success! ELSIF l_rule_error = 'Y' THEN htp.p(''); IF l_ins_or_upd = 'INSERT' THEN htp.p(caco_utilities.get_module_text(2334)); -- Insert failed ELSE htp.p(caco_utilities.get_module_text(2340)); -- Update failed END IF; htp.p('
'); htp.p(''||l_re_message||'

'); END IF; -- -- -- Put a hidden parameter out showing whether we are inserting or updating -- htp.p(''); -- -- Display the category and relevant info -- display_rule_category( l_rule_category , l_contract_id , l_template_id , l_rule_id , l_contract_rule_type ); -- -- -- Now display the Rule name -- htp.p(' '); -- Rule Name htp.p(' '); -- -- Error message inputs -- htp.p(' '); -- Error message (HU) htp.p(' '); -- Error Message (EN) htp.p(' '); -- -- Close the Rule specific heading table -- htp.p('
'||caco_utilities.get_module_text(2106)||' *
'||caco_utilities.get_module_text(2126)||' * '); -- Rule Type -- -- Put out the Rule Type IF l_rule_category = 'CONTRACT' THEN -- -- IF Inserting, then the User can choose - otherwise it's fixed as existing IF l_ins_or_upd = 'UPDATE' THEN -- -- Check the type to show EN or HU htp.p(''); IF NVL(l_contract_rule_type,'ROW') = 'ROW' THEN htp.p(''); -- Row ELSE htp.p(''); -- Sheet END IF; -- ELSE -- htp.p(''); -- END IF; -- ELSE -- The rule type becomes fixed to ROW htp.p(''); htp.p(''); -- Row -- END IF; -- htp.p('
'||caco_utilities.get_module_text(2127)||' * 
'||caco_utilities.get_module_text(2128)||' * 

'); -- -- -- Now move on to the left and right sides and rule relation layout. htp.p('
'||caco_utilities.get_module_text(2129)||' *
'); -- Left Side htp.p('



'||caco_utilities.get_module_text(2131)||'

'); -- Rule Relation htp.p('







'||caco_utilities.get_module_text(2130)||' *
'); -- Right Side htp.p('

'); -- -- -- Now lets go and get the options available for categories IF l_rule_category = 'CONTRACT' THEN -- get_contract_categories( l_contract_id , l_contract_rule_type , category_array ); -- ELSIF l_rule_category = 'TEMPLATE' THEN -- get_template_categories( l_template_id, category_array ); -- ELSE -- get_all_categories( category_array ); -- END IF; -- -- Display the resultant categories in a searchable select box. display_categories( category_array ); -- -- -- Now lets go and get the options available for parameters IF l_rule_category = 'CONTRACT' THEN -- get_contract_parameters( l_contract_id , l_contract_rule_type , parameter_array ); -- ELSIF l_rule_category = 'TEMPLATE' THEN -- get_template_parameters( l_template_id, parameter_array ); -- ELSE -- get_all_parameters( parameter_array ); -- END IF; -- -- Display the resultant categories in a searchable select box. display_parameters( parameter_array ); -- -- -- Finally, display either an Update/Insert button and Cancel Button -- For the future - on the rules screen allow a Delete button (with relevant checks) BEGIN SELECT DECODE( NVL(l_contract_rule_type,'ROW'), 'ROW', l_rule_id, 0 ) INTO l_button_rule_id FROM dual; EXCEPTION WHEN others THEN l_button_rule_id := 0; END; -- display_buttons( l_ins_or_upd , l_rule_category , l_button_rule_id , l_contract_id , l_template_id ); -- -- htp.p('

'); htp.p('''*'''||caco_utilities.get_module_text(2202)||''); -- '*' Denotes a mandatory field -- htp.p(chr(10)||'
'); -- Close of div just inside -- -- Close the Rule Form htp.p('
'); -- Close rule_border_div htp.p('
'); -- -- Close centrecontent div htp.p(''); -- -- Close outer div htp.p(''); -- wsgl.closepagebody; -- END startup; -- PROCEDURE showabout IS -- l_usr VARCHAR2(255) := NULL; -- BEGIN -- l_usr := caco_security.get_user; -- wsgl.registerurl(g_package_name || '.showabout'); -- IF wsgl.notlowercase THEN RETURN; END IF; -- wsgl.openpagehead(wsgl.msggettext( 107 , wsglm.dsp107_about) || ' ' ); wsgl.metatag; htp.linkrel( 'stylesheet' , 'caco_system.css?p_type=about' ); -- wsgl.closepagehead; wsgl.openpagebody( FALSE , p_attributes => '' ); -- htp.p(caco_system.menu); -- wsgl.defaultpagecaption(wsgl.msggettext( 107 , wsglm.dsp107_about) || ' ' ); -- htp.para; htp.p(g_revision); htp.para; -- htp.para; -- htp.p(wsgl.msggettext( 108 , wsglm.dsp108_generated_by , 'PL/SQL Web Generator' , '6.5.94.3.12') ); htp.para; -- wsgl.info( FALSE , 'EFT Framework' , g_package_name , l_usr ); -- wsgl.closepagebody; -- EXCEPTION WHEN OTHERS THEN wsgl.displaymessage( wsgl.mess_exception , SQLERRM , '' , '' , g_package_name || '.showabout' ); END showabout; -- BEGIN -- NULL; -- END efnow093$; /