CREATE OR REPLACE PACKAGE BODY EFT_NOM.role_access IS -- g_header CONSTANT VARCHAR2(160) := '$Header: /Isle Of Grain/database/PLSQL/role_access.pck 1 7/01/05 12:54 Gilberta $'; g_revision CONSTANT VARCHAR2(160) := '$Revision: 1 $'; -- FUNCTION lineage(p_syop_id system_options.syop_id%TYPE) RETURN VARCHAR2 IS v_parent_syop_id system_options.syop_id_the_parent_of%TYPE; v_name system_options.NAME%TYPE; BEGIN SELECT syop_id_the_parent_of ,NAME || p_syop_id INTO v_parent_syop_id ,v_name FROM system_options WHERE syop_id = p_syop_id; IF v_parent_syop_id IS NULL THEN RETURN(v_name); ELSE RETURN(lineage(v_parent_syop_id) || '-' || v_name); END IF; EXCEPTION WHEN no_data_found THEN RETURN(NULL); END lineage; -- FUNCTION f_get_syop_module(p_syop_id IN NUMBER) RETURN VARCHAR2 IS -- CURSOR cur_syop(p_syop_id IN NUMBER) IS SELECT syop.module_name FROM system_options syop WHERE syop.syop_id = p_syop_id; -- v_module VARCHAR2(100); v_dot_pos NUMBER; -- BEGIN -- caco_debug.putline('Looking for ' || p_syop_id); FOR v_syop_rec IN (SELECT module_name FROM system_options WHERE syop_id = p_syop_id) LOOP caco_debug.putline('Found ' || v_syop_rec.module_name); v_module := v_syop_rec.module_name; v_dot_pos := instr(v_module ,'.' ,1); caco_debug.putline('Dot found at ' || v_dot_pos); IF v_dot_pos > 0 THEN v_module := substr(v_module ,1 ,v_dot_pos - 1); END IF; END LOOP; -- caco_debug.putline('Module is ' || v_module); RETURN v_module; -- END f_get_syop_module; FUNCTION f_get_sypr_role(p_sypr_id IN NUMBER) RETURN VARCHAR2 IS -- CURSOR cur_sypr(p_sypr_id IN NUMBER) IS SELECT sypr.role_name FROM system_profiles sypr WHERE sypr.sypr_id = p_sypr_id; -- v_role VARCHAR2(100); -- BEGIN -- OPEN cur_sypr(p_sypr_id); FETCH cur_sypr INTO v_role; CLOSE cur_sypr; -- RETURN v_role; -- END f_get_sypr_role; PROCEDURE update_profile_options(p_add_option IN BOOLEAN DEFAULT TRUE ,p_syop_id IN system_options.syop_id%TYPE ,p_sypr_id IN system_profiles.sypr_id%TYPE) IS v_syop_module system_options.module_name%TYPE; v_sypr_role system_profiles.role_name%TYPE; v_grant_or_revoke VARCHAR2(6); BEGIN caco_debug.putline('Enter'); IF p_add_option THEN caco_debug.putline('add'); BEGIN INSERT INTO profile_options (syop_id ,sypr_id) VALUES (p_syop_id ,p_sypr_id); -- EXCEPTION WHEN dup_val_on_index THEN NULL; caco_debug.putline('Duplicate'); WHEN OTHERS THEN caco_debug.putline(SQLERRM); RAISE; END; ELSE caco_debug.putline('delete'); BEGIN DELETE profile_options WHERE syop_id = p_syop_id AND sypr_id = p_sypr_id; EXCEPTION WHEN OTHERS THEN caco_debug.putline(SQLERRM); RAISE; END; END IF; /* not required for lightweight users v_syop_module := upper(f_get_syop_module(p_syop_id)); v_sypr_role := upper(f_get_sypr_role(p_sypr_id)); caco_debug.putline('Module is ' || v_syop_module); IF v_syop_module IS NOT NULL THEN IF p_add_option THEN v_grant_or_revoke := 'GRANT'; ELSE v_grant_or_revoke := 'REVOKE'; END IF; caco_debug.putline(v_grant_or_revoke || ' execute on ' || v_syop_module || ' TO ' || v_sypr_role); EXECUTE IMMEDIATE v_grant_or_revoke || ' EXECUTE ON ' || v_syop_module || ' TO ' || v_sypr_role; FOR v_oppa_rec IN (SELECT oppa.package_name FROM option_packages oppa WHERE upper(package_name) LIKE v_syop_module || '%' AND upper(package_name) <> upper(v_syop_module)) LOOP caco_debug.putline(v_grant_or_revoke || ' execute on ' || v_oppa_rec.package_name || ' TO ' || v_sypr_role); EXECUTE IMMEDIATE v_grant_or_revoke || ' EXECUTE ON ' || v_oppa_rec.package_name || ' TO ' || v_sypr_role; -- END LOOP; END IF;*/ caco_debug.putline('Finished'); END update_profile_options; PROCEDURE startup(p_syop_id IN NUMBER DEFAULT NULL ,p_sypr_id IN NUMBER DEFAULT NULL ,p_function IN VARCHAR2 DEFAULT NULL ,p_readonly IN VARCHAR2 DEFAULT 'N') IS -- v_dummy VARCHAR2(1); v_prev_level NUMBER := 0; v_max_levels NUMBER := 0; v_number_columns NUMBER := 0; -- CURSOR cur_sypr IS SELECT sp.sypr_id ,sp.NAME FROM system_profiles sp WHERE role_name IS NOT NULL ORDER BY sp.sypr_id; -- CURSOR cur_prop(p_syop_id IN NUMBER, p_sypr_id IN NUMBER) IS SELECT NULL FROM profile_options po WHERE po.syop_id = p_syop_id AND po.sypr_id = p_sypr_id; -- -- -- BEGIN -- IF NOT caco_security.security_check('role_access.startup') THEN RETURN; END IF; -- IF p_function IS NOT NULL AND p_syop_id IS NOT NULL AND p_sypr_id IS NOT NULL THEN -- -- Modify the system profile -- IF p_function = 'N' THEN -- update_profile_options(p_add_option => TRUE ,p_syop_id => p_syop_id ,p_sypr_id => p_sypr_id); ELSIF p_function = 'Y' THEN update_profile_options(p_add_option => FALSE ,p_syop_id => p_syop_id ,p_sypr_id => p_sypr_id); END IF; -- startup; -- ELSE -- -- Set document type -- IF p_readonly = 'N' THEN htp.p(''); ELSE owa_util.mime_header(ccontent_type => 'application/vnd.ms-excel'); END IF; -- htp.print(caco_system.menu); -- htp.title(caco_utilities.GET_SYSTEM_NAME||' module security'); htp.p('

'||caco_utilities.GET_SYSTEM_NAME||' module security

'); -- IF p_readonly = 'N' THEN -- htp.p('

Click on the Y or N to grant or revoke access to roles.

'); -- END IF; -- htp.tableopen(cattributes => 'BORDER=1'); -- -- Set headings -- htp.tablerowopen; SELECT MAX(LEVEL) INTO v_max_levels FROM system_options t START WITH syop_id_the_parent_of IS NULL CONNECT BY PRIOR syop_id = syop_id_the_parent_of; FOR v_index IN 1 .. v_max_levels LOOP IF v_index != v_max_levels THEN htp.tabledata(cvalue => htf.bold('Menu Level ' || v_index)); ELSE htp.tabledata(cvalue => htf.bold('Screen')); END IF; END LOOP; v_number_columns := v_max_levels; -- -- Dynamic Headings -- FOR cur_sypr_rec IN cur_sypr LOOP -- htp.tabledata(cvalue => htf.bold(cur_sypr_rec.NAME)); v_number_columns := v_number_columns + 1; -- END LOOP; -- htp.tablerowclose; -- -- Print body details -- v_prev_level := 1; FOR v_syop_rec IN (SELECT LEVEL ,syop_id ,NAME ,module_name ,syop_id_the_parent_of AS syop_syop_id ,role_access.lineage(syop_id) ,rownum FROM system_options t START WITH syop_id_the_parent_of IS NULL CONNECT BY PRIOR syop_id = syop_id_the_parent_of ORDER BY role_access.lineage(syop_id)) LOOP -- htp.tablerowopen; -- IF v_syop_rec.LEVEL < v_prev_level THEN -- -- output a blank row -- htp.tabledata(cvalue => htf.hr ,ccolspan => v_number_columns); htp.tablerowclose; htp.COMMENT('Place a blank row'); htp.tablerowopen; ELSE v_prev_level := v_syop_rec.LEVEL; END IF; FOR v_index IN 1 .. v_max_levels LOOP IF v_index = v_syop_rec.LEVEL THEN htp.tabledata(cvalue => v_syop_rec.NAME); ELSE htp.tabledata(cvalue => NULL); END IF; END LOOP; -- FOR cur_sypr_rec IN cur_sypr LOOP -- OPEN cur_prop(v_syop_rec.syop_id ,cur_sypr_rec.sypr_id); FETCH cur_prop INTO v_dummy; -- IF cur_prop%FOUND THEN -- IF p_readonly = 'N' THEN -- htp.tabledata(cattributes => 'bgcolor="green"' ,calign => 'center' ,cvalue => htf.anchor2(curl => owa_util.get_cgi_env('SCRIPT_NAME') || owa_util.get_cgi_env('PATH_INFO') || '?p_syop_id=' || v_syop_rec.syop_id || '&p_sypr_id=' || cur_sypr_rec.sypr_id || ' &p_function=Y' ,ctarget => '_self' ,ctext => 'Y')); ELSE -- htp.tabledata(cvalue => htf.paragraph(calign => 'center') || htf.bold(wsgfl.green('X'))); -- END IF; -- ELSE -- IF p_readonly = 'N' THEN -- htp.tabledata(cattributes => 'bgcolor="red"' ,calign => 'center' ,cvalue => htf.anchor2(curl => owa_util.get_cgi_env('SCRIPT_NAME') || owa_util.get_cgi_env('PATH_INFO') || '?p_syop_id=' || v_syop_rec.syop_id || '&p_sypr_id=' || cur_sypr_rec.sypr_id || ' &p_function=N' ,ctarget => '_self' ,ctext => 'N')); -- ELSE -- htp.tabledata(cvalue => htf.paragraph(calign => 'center') || htf.bold(wsgfl.red(' '))); -- END IF; -- END IF; -- CLOSE cur_prop; -- END LOOP; -- htp.tablerowclose; -- END LOOP; -- htp.tableclose; -- htp.br; htp.p('Report Produced ' || to_char(SYSDATE ,'HH24:MI DD/MM/YYYY') || '.'); htp.br; htp.br; -- IF p_readonly = 'N' THEN -- htp.p('To view a read only version of this screen click here.'); -- ELSE -- htp.p('To view an updateable version of this screen click here.'); -- END IF; -- END IF; -- EXCEPTION -- WHEN OTHERS THEN -- htp.p('ERROR!: ' || SQLERRM); -- END startup; -- END role_access; /