create or replace package fbors_projections is /* ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - Author : Brian G / Larry W Created : 7/25/2012 Purpose : To manage FBORS Salary (Salaried / Hourly) projections UC Riverside ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - */ TYPE tv_data IS TABLE OF VARCHAR2(1000) INDEX BY BINARY_INTEGER; FUNCTION audit_transaction( p_base_table IN VARCHAR2, p_base_seq_id IN VARCHAR2, p_audit_seq_id IN VARCHAR2, p_net_id IN VARCHAR2, p_operation IN VARCHAR2 ) RETURN VARCHAR2; PROCEDURE check_excessive_fte( p_employee_id IN VARCHAR2, p_result OUT VARCHAR2 ); PROCEDURE view_data( p_callback IN VARCHAR2 DEFAULT NULL, p_net_id IN VARCHAR2 DEFAULT NULL, p_report_type IN VARCHAR2 DEFAULT NULL, p_value IN VARCHAR2 DEFAULT NULL, p_proj_type IN VARCHAR2 DEFAULT 'se', p_closing IN NUMBER DEFAULT 0 --sort IN VARCHAR2 DEFAULT NULL ); PROCEDURE view_employee_proj( p_callback IN VARCHAR2 DEFAULT NULL, p_net_id IN VARCHAR2 DEFAULT NULL, p_report_type IN VARCHAR2 DEFAULT NULL, p_value IN VARCHAR2 DEFAULT NULL, p_proj_type IN VARCHAR2 DEFAULT 'se' ); PROCEDURE view_nonsal_proj( p_callback IN VARCHAR2 DEFAULT NULL, p_net_id IN VARCHAR2 DEFAULT NULL, p_report_type IN VARCHAR2 DEFAULT NULL, p_value IN VARCHAR2 DEFAULT NULL, p_proj_type IN VARCHAR2 DEFAULT NULL ); PROCEDURE view_budget_proj( p_callback IN VARCHAR2 DEFAULT NULL, p_net_id IN VARCHAR2 DEFAULT NULL, p_report_type IN VARCHAR2 DEFAULT NULL, p_value IN VARCHAR2 DEFAULT NULL, p_proj_type IN VARCHAR2 DEFAULT NULL ); PROCEDURE view_benefit_proj( p_callback IN VARCHAR2 DEFAULT NULL, p_net_id IN VARCHAR2 DEFAULT NULL, p_report_type IN VARCHAR2 DEFAULT NULL, p_value IN VARCHAR2 DEFAULT NULL, p_proj_type IN VARCHAR2 DEFAULT NULL ); PROCEDURE save_data( p_callback IN VARCHAR2 DEFAULT NULL, p_net_id IN VARCHAR2 DEFAULT NULL, p_employee_id IN VARCHAR2 DEFAULT NULL, p_proj_type IN VARCHAR2, p_grid_data IN VARCHAR2 ); PROCEDURE save_employee_proj( p_callback IN VARCHAR2 DEFAULT NULL, p_net_id IN VARCHAR2 DEFAULT NULL, p_employee_id IN VARCHAR2 DEFAULT NULL, p_proj_type IN VARCHAR2 DEFAULT 'se', p_grid_data IN VARCHAR2 ); PROCEDURE save_nonsal_proj( p_callback IN VARCHAR2 DEFAULT NULL, p_net_id IN VARCHAR2 DEFAULT NULL, p_employee_id IN VARCHAR2 DEFAULT NULL, p_proj_type IN VARCHAR2 DEFAULT 'ns', p_grid_data IN VARCHAR2 ); PROCEDURE save_budget_proj( p_callback IN VARCHAR2 DEFAULT NULL, p_net_id IN VARCHAR2 DEFAULT NULL, p_employee_id IN VARCHAR2 DEFAULT NULL, p_proj_type IN VARCHAR2 DEFAULT 'bud', p_grid_data IN VARCHAR2 ); PROCEDURE save_benefit_proj( p_callback IN VARCHAR2 DEFAULT NULL, p_net_id IN VARCHAR2 DEFAULT NULL, p_employee_id IN VARCHAR2 DEFAULT NULL, p_proj_type IN VARCHAR2 DEFAULT 'ben', p_grid_data IN VARCHAR2 ); PROCEDURE delete_data( p_callback IN VARCHAR2 DEFAULT NULL, p_net_id IN VARCHAR2 DEFAULT NULL, p_employee_id IN VARCHAR2 DEFAULT NULL, p_proj_type IN VARCHAR2, p_grid_data IN VARCHAR2 ); /*PROCEDURE delete_employee_proj( p_callback IN VARCHAR2 DEFAULT NULL, p_net_id IN VARCHAR2 DEFAULT NULL, p_employee_id IN VARCHAR2 DEFAULT NULL, p_proj_type IN VARCHAR2 DEFAULT 'se', p_grid_data IN VARCHAR2 );*/ PROCEDURE delete_budget_proj( p_callback IN VARCHAR2 DEFAULT NULL, p_net_id IN VARCHAR2 DEFAULT NULL, p_employee_id IN VARCHAR2 DEFAULT NULL, p_proj_type IN VARCHAR2 DEFAULT 'bud', p_grid_data IN VARCHAR2 ); END fbors_projections; / create or replace package body fbors_projections IS /* ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - Global Variables and constants ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - */ SUBTYPE st_maxvarchar2 IS VARCHAR2(32767); v_sql st_maxvarchar2 := NULL; v_sql_projs st_maxvarchar2 := NULL; v_result st_maxvarchar2 := NULL; v_return st_maxvarchar2 := NULL; v_grid_data st_maxvarchar2 := NULL; v_save_message st_maxvarchar2 := NULL; v_error_message st_maxvarchar2 := NULL; v_url st_maxvarchar2 := NULL; v_fiscal_year VARCHAR2(4) := ''; v_accounting_period VARCHAR2(2) := ''; v_current_year VARCHAR2(4) := to_char(SYSDATE, 'YYYY'); v_start_year VARCHAR2(4) := ''; v_end_year VARCHAR2(4) := ''; v_max_closed_date DATE := null; --VARCHAR2(100) := ''; v_start_month VARCHAR2(2) := ''; v_end_month VARCHAR2(2) := ''; v_last_closed_month INTEGER := 0; v_months_between INTEGER := 0; v_sql_rowcount INTEGER := 0; v_sql_count INTEGER := 0; v_seq_nextval INTEGER := 0; v_start_time NUMBER; v_run_time VARCHAR2(100) := ''; -- Activity golden tree information --v_org_code activity_denorm_tree_vw.org_code%TYPE; --v_div_code activity_denorm_tree_vw.div_code%TYPE; --v_dept_code activity_denorm_tree_vw.dept_code%TYPE; v_activity_denorm_tree_values activity_denorm_tree_vw%ROWTYPE; v_app_settings app_settings%ROWTYPE; v_items fbors_funclib.tv_data; -- Example: http:// gk_REQUEST_PROTOCOL CONSTANT st_maxvarchar2 := lower(owa_util.get_cgi_env(param_name => 'REQUEST_PROTOCOL')) || '://'; -- Example: iscotsdev.ucr.edu gk_HTTP_HOST CONSTANT st_maxvarchar2 := lower(owa_util.get_cgi_env(param_name => 'HTTP_HOST')); -- Example: /iscots_dev/ gk_SCRIPT_NAME CONSTANT st_maxvarchar2 := lower(owa_util.get_cgi_env(param_name => 'SCRIPT_NAME')) || '/'; -- Example: /totals_popup.accounting_period gv_PATH_INFO st_maxvarchar2 := lower(owa_util.get_cgi_env(param_name => 'PATH_INFO')); -- Example: http://iscotsdev.ucr.edu/iscots_dev/ gk_APPLICATION_URL CONSTANT st_maxvarchar2 := gk_REQUEST_PROTOCOL || gk_HTTP_HOST || gk_SCRIPT_NAME; FUNCTION audit_transaction( p_base_table IN VARCHAR2, p_base_seq_id IN VARCHAR2, p_audit_seq_id IN VARCHAR2, p_net_id IN VARCHAR2, p_operation IN VARCHAR2 ) RETURN VARCHAR2 IS /* ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - Function : audit_transaction Author : Larry W, Brian G Created : December 2012 Params : p_base_table = The base table to Audit p_base_seq_id = The base table's sequence to look up p_audit_seq_id = the Audit table's sequence to use p_net_id = who did the UPDATE/DELETE/INSERT p_operation = What the SQL operation was: UPDATE/DELETE/INSERT Purpose : To record changes to the data. The AUDIT table needs to be cloned from the BASE table with the additional fields: audit_id, audit_net_id, audit_datetime, audit_operation taked onto the beginning of the table's columns. Also, each AUDIT table has it's own SEQUENCE. Examples : v_return := audit_transaction('fbors_salary_projs_tbl', v_items(k_SEQ_ID), fbors_projs_audit_seq.nextval, p_net_id, 'UPDATE'); v_return := audit_transaction('fbors_salary_projs_tbl', v_items(k_SEQ_ID), fbors_projs_audit_seq.nextval, p_net_id, 'DELETE'); v_return := audit_transaction('fbors_salary_projs_tbl', v_seq_nextval, fbors_projs_audit_seq.nextval, p_net_id, 'INSERT'); UC Riverside 2012 ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - */ v_table_name VARCHAR2(100) := ''; v_audit_table VARCHAR2(100) := ''; v_audit_id INTEGER := 0; BEGIN dbms_application_info.set_action( 'Auditing the ' || p_base_table || ' table @line #' || $$PLSQL_LINE || ' in ' || $$PLSQL_UNIT); -- Get a comma separated list of the base table's columns SELECT LISTAGG(LOWER(c.column_name), ', ') WITHIN GROUP (ORDER BY c.column_id) INTO v_result FROM user_tab_cols c WHERE c.table_name = upper(p_base_table); -- DBMS_OUTPUT.PUT_LINE('v_result = ' || v_result); -- Get the AUDIT table name based on the base table's name v_audit_table := REGEXP_REPLACE( UPPER(p_base_table), '_TBL', '_AUDIT'); -- Record the information into the Audit table using the same fields as the base table, plus the additional Audit fields: audit_id, audit_net_id, audit_datetime, audit_operation v_sql := 'INSERT INTO ' || v_audit_table || '(audit_id, audit_net_id, audit_datetime, audit_operation, ' || v_result || ' ) SELECT :p_audit_seq_id, ''' || p_net_id || ''', SYSDATE, ''' || p_operation || ''', p.* FROM ' || p_base_table || ' p WHERE p.sequence_id = :p_base_seq_id '; -- DBMS_OUTPUT.PUT_LINE('v_sql = ' || v_sql); EXECUTE IMMEDIATE v_sql USING p_audit_seq_id, p_base_seq_id; COMMIT; RETURN 'SUCCESS'; EXCEPTION WHEN OTHERS THEN -- v_error_message := fbors_funclib.display_error_info(p_net_id, DBMS_UTILITY.FORMAT_ERROR_STACK, DBMS_UTILITY.FORMAT_ERROR_BACKTRACE, $$PLSQL_UNIT, USERENV('sessionid'), 'text'); RETURN SQLERRM; END audit_transaction; PROCEDURE check_excessive_fte( p_employee_id IN VARCHAR2, p_result OUT VARCHAR2 ) IS /* ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - Function : check_excessive_fte Author : Larry W, Brian G Created : Yesember 2012 Params : p_employee_id = the current counter p_result = the overall count Purpose : Loop through every month in FY and determine if the given employee's FTE exceeds 1.0 UC Riverside 2012 ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - */ v_month DATE := NULL; v_Sum_FTE NUMBER := 0; BEGIN p_result := '.'; v_month := TO_DATE('07/01/' || v_current_year, 'MM/DD/YYYY'); -- Looop through the year and add up the FTEs recorded in the Projections table per month for the latest projected accounting period FOR i IN 1..12 LOOP SELECT sum(p.mod_fte) INTO v_Sum_FTE FROM fbors_salary_projs_tbl p WHERE p.fiscal_year = v_fiscal_year AND p.employee_id = p_employee_id AND p.accounting_period IN (v_accounting_period, v_accounting_period+1) AND v_month BETWEEN p.mod_begin_date AND p.mod_end_date; IF v_Sum_FTE > 1 THEN p_result := '


Warning: Please note that during the month of ' || trim(to_char(v_month, 'Month')) || ', the total FTE for this employee exceeds 1.0. Please review the projection data for any possible inconsistencies.'; -- p_result := 'In the month of ' || v_month || ' the FTE is ' || v_Sum_FTE; EXIT; ELSE v_month := ADD_MONTHS(v_month, 1); END IF; END LOOP; EXCEPTION WHEN OTHERS THEN p_result := '.'; end check_excessive_fte; PROCEDURE check_activity_in_eacs( p_activity IN VARCHAR2, p_net_id IN VARCHAR2, p_result OUT VARCHAR2 ) IS /* ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - Function : check_activity_in_eacs Author : Larry W, Brian G Created : Yesember 2012 Params : p_net_id = the user p_activity = activity p_result = NULL means no match was found and therefore issue a WARNING Purpose : Determine if the activity is outside their EACS accountability structure UC Riverside 2012 ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - */ BEGIN WITH activity_denorm_tree_wvw AS ( SELECT a.org_code, a.div_code, a.dept_code FROM activity_denorm_tree_vw a WHERE a.activity = p_activity ) SELECT DISTINCT e.org_value INTO p_result FROM fbors_eacs_session_tbl e, activity_denorm_tree_wvw a WHERE e.net_id = p_net_id AND ( a.org_code IN e.org_value OR a.div_code IN e.org_value OR a.dept_code IN e.org_value); p_result := NULL; EXCEPTION WHEN OTHERS THEN p_result := '


Warning: Please note that you have added an activity, ' || p_activity || ', that is outside your EACS accountability structure and will therefore not show up on this particular projection grid when you close this informational window. Please review the projection data for any possible inconsistencies.'; END check_activity_in_eacs; PROCEDURE get_actv_denorm_tree_values( p_activity IN VARCHAR2, p_activity_denorm_tree_row OUT activity_denorm_tree_vw%ROWTYPE, v_result OUT VARCHAR2 ) IS /* ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - Function : get_org_div_dept_by_activity Author : Larry W, Brian G Created : Rocktober 2012 Params : p_counter = the current counter p_count = the overall count Purpose : Get the Activity Golden Tree field values by Activity UC Riverside 2012 ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - */ -- Get the employees's activity denormalized information BEGIN SELECT DISTINCT a.* INTO p_activity_denorm_tree_row FROM activity_denorm_tree_vw a WHERE a.activity = upper(p_activity); EXCEPTION WHEN OTHERS THEN v_error_message := fbors_funclib.display_error_info('SYSTEM', DBMS_UTILITY.FORMAT_ERROR_STACK, DBMS_UTILITY.FORMAT_ERROR_BACKTRACE, $$PLSQL_UNIT, USERENV('sessionid'), 'json'); v_result := fbors_funclib.cleanup4json(v_error_message); RETURN; END get_actv_denorm_tree_values; PROCEDURE get_account_info( p_account IN VARCHAR2) IS /* ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - Function : get_org_div_dept_by_activity Author : Larry W, Brian G Created : Rocktober 2012 Params : p_counter = the current counter p_count = the overall count Purpose : Get the Account Golden Tree field values by account UC Riverside 2012 ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - */ BEGIN NULL; /* SELECT DISTINCT a.ucr_acct_sum, a.ucr_acct_sum_dsc, a.ucr_acct_bdgt, a.ucr_acct_bdgt_dsc INTO v_summary_account, v_summary_acct_descr, v_budget_category, v_budcategory_descr FROM ps_ucr_acct_lv_tbl a WHERE a.ucr_acct_bdgt = p_account; */ EXCEPTION WHEN OTHERS THEN v_error_message := fbors_funclib.display_error_info('SYSTEM', DBMS_UTILITY.FORMAT_ERROR_STACK, DBMS_UTILITY.FORMAT_ERROR_BACKTRACE, $$PLSQL_UNIT, USERENV('sessionid'), 'json'); v_result := fbors_funclib.cleanup4json(v_error_message); RETURN; END get_account_info; PROCEDURE view_data( p_callback IN VARCHAR2 DEFAULT NULL, p_net_id IN VARCHAR2 DEFAULT NULL, p_report_type IN VARCHAR2 DEFAULT NULL, p_value IN VARCHAR2 DEFAULT NULL, p_proj_type IN VARCHAR2 DEFAULT 'se', p_closing IN NUMBER DEFAULT 0 -- 0 = false, 1 = true --sort IN VARCHAR2 DEFAULT NULL -- why juan? why? No Worries I have removed it ) IS /* ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - Procedure : View Projection Data Author : Larry W, Brian G Created : July 2012 Purpose : To redirect and then view projections based on the Projection type Params : p_report_type = org / div / dept / actv p_fiscalyear = irrelevant, we only view current period projections p_accounting_period = irrelevant p_value = Org, Div Dept or Activity code p_proj_type = the type of projection to view UC Riverside 2012 ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - */ BEGIN -- Switch to the appropriate procedure to save the projection v_url := gk_APPLICATION_URL || CASE p_proj_type -- Salary employees --WHEN 'se' THEN 'fbors_projections.view_employee_proj' -- Hourly employees --WHEN 'he' THEN 'fbors_projections.view_employee_proj' -- Non salaried employees WHEN 'ns' THEN 'fbors_projections.view_nonsal_proj' -- Benefits WHEN 'ben' THEN 'fbors_projections.view_benefit_proj' -- Budgets WHEN 'bud' THEN 'fbors_projections.view_budget_proj' -- Wo0t! Infinite loop! <--- Your infinte loop has been terminated, dirt bag! ELSE -- Salary or Hourly Employees 'fbors_projections.view_employee_proj' END || '?p_callback=' || p_callback || '&p_report_type=' || p_report_type || '&p_net_id=' || p_net_id || '&p_value=' || p_value || '&p_proj_type=' || p_proj_type; owa_util.redirect_url(v_url, TRUE); EXCEPTION WHEN OTHERS THEN v_error_message := fbors_funclib.display_error_info(p_net_id, DBMS_UTILITY.FORMAT_ERROR_STACK, DBMS_UTILITY.FORMAT_ERROR_BACKTRACE, $$PLSQL_UNIT, USERENV('sessionid'), 'json'); htp.p(p_callback || '( { "success":false, "message":"' || fbors_funclib.cleanup4json(v_error_message) || ' ", "totalCount":0 } )') ; RETURN; END view_data; PROCEDURE view_employee_proj( p_callback IN VARCHAR2 DEFAULT NULL, p_net_id IN VARCHAR2 DEFAULT NULL, p_report_type IN VARCHAR2 DEFAULT NULL, p_value IN VARCHAR2 DEFAULT NULL, p_proj_type IN VARCHAR2 DEFAULT 'se' ) IS /* ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - Procedure : View Projection Data Author : Larry W, Brian G Created : July 2012 Purpose : To return projections based on the tree node selected. The projections are shown for the current period only (based on SYSDATE) and there is no switching between periods unlike the PIWRS. UC Riverside 2012 ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - */ --v_sql_activities st_maxvarchar2 := ''; TYPE tr_projections IS RECORD( sequence_id fbors_salary_projs_tbl.sequence_id%TYPE, manual_entry VARCHAR2(5), net_id fbors_salary_projs_tbl.net_id%TYPE, employee_id fbors_salary_projs_tbl.employee_id%TYPE, first_name fbors_salary_projs_tbl.first_name%TYPE, last_name fbors_salary_projs_tbl.last_name%TYPE, fiscal_year fbors_salary_projs_tbl.fiscal_year%TYPE, accounting_period fbors_salary_projs_tbl.accounting_period%TYPE, account fbors_salary_projs_tbl.account%TYPE, fund fbors_salary_projs_tbl.fund%TYPE, activity fbors_salary_projs_tbl.activity%TYPE, function fbors_salary_projs_tbl.function%TYPE, cost_center fbors_salary_projs_tbl.cost_center%TYPE, project_id fbors_salary_projs_tbl.project_id%TYPE, title_code fbors_salary_projs_tbl.title_code%TYPE, title_code_descr fbors_salary_projs_tbl.title_code_descr%TYPE, bargaining_unit fbors_salary_projs_tbl.bargaining_unit%TYPE, proj_begin_date VARCHAR2(10), -- fbors_salary_projs_tbl.pps_begin_date%TYPE, proj_end_date VARCHAR2(10), -- fbors_salary_projs_tbl.pps_end_date%TYPE, begin_period VARCHAR2(2), -- fbors_salary_projs_tbl.pps_begin_date%TYPE, end_period VARCHAR2(2), -- fbors_salary_projs_tbl.pps_end_date%TYPE, fte fbors_salary_projs_tbl.fte%TYPE, mod_fte fbors_salary_projs_tbl.fte%TYPE, payrate fbors_salary_projs_tbl.payrate%TYPE, mod_payrate fbors_salary_projs_tbl.mod_payrate%TYPE, comments fbors_salary_projs_tbl.comments%TYPE, deletable VARCHAR2(1), last_updated_by VARCHAR2(100) ); TYPE tt_projections IS TABLE OF tr_projections; vt_projections tt_projections ; --v_max_closed_date DATE := ''; BEGIN log_usage.record_data(p_net_id, DECLARATIONS.gk_IP_ADDRESS, DECLARATIONS.gk_BROWSER_TYPE, DECLARATIONS.gk_APPLICATION_URL, DECLARATIONS.gk_PATH_INFO, DECLARATIONS.gk_QUERY_STRING, ''); -- v_accounting_period := 1; /* -- Convert the current date into the relevant fiscal year and accounting period v_fiscal_year := fbors_funclib.current_fiscal_year; v_max_closed_date := to_date(fbors_funclib.max_closed_date, 'MM/DD/YYYY'); -- ie: 8/8/2012 for closing July v_last_closed_month := to_char(v_max_closed_date, 'MM') -1; -- ie: 8-1 so 7 for July -- v_last_closed_month := 9; -- debugging for other months IF v_last_closed_month > 6 THEN v_accounting_period := v_last_closed_month - 6; ELSE v_accounting_period := v_last_closed_month + 6; END IF; */ -- The main SQL v_sql_projs := ' SELECT DISTINCT sequence_id, decode(p.system_generated, ''N'', ''true'', ''Y'', ''false'' ) manual_entry, p.net_id, p.employee_id, p.first_name, p.last_name, p.fiscal_year, p.accounting_period, p.account, p.fund, p.activity, p.function, p.cost_center, p.project_id, p.title_code, p.title_code_descr, p.bargaining_unit, TO_CHAR(p.mod_begin_date, ''MM/DD/YYYY'') proj_begin_date, TO_CHAR(p.mod_end_date, ''MM/DD/YYYY'') proj_end_date, CASE WHEN p.mod_begin_date < TO_DATE(''07/01/' || v_current_year || ''', ''MM/DD/YYYY'') THEN 1 WHEN to_number(TO_CHAR(p.mod_begin_date, ''MM'')) > 6 THEN to_number(TO_CHAR(p.mod_begin_date, ''MM'')) - 6 ELSE to_number(TO_CHAR(p.mod_begin_date, ''MM'')) + 6 END proj_begin_period, CASE WHEN p.mod_end_date > TO_DATE(''06/30/' || v_fiscal_year || ''', ''MM/DD/YYYY'') THEN 12 WHEN to_number(TO_CHAR(p.mod_end_date, ''MM'')) > 6 THEN to_number(TO_CHAR(p.mod_end_date, ''MM'')) - 6 ELSE to_number(TO_CHAR(p.mod_end_date, ''MM'')) + 6 END proj_end_period, p.fte, p.mod_fte, p.payrate, p.mod_payrate, p.comments, DECODE(p.hrdw_download_date, NULL, ''Y'', ''N'') deletable, p.updated_by || '' '' || TO_CHAR(p.updated_on, ''MM/DD/YYYY HH:MI'') last_updated_by FROM fbors_salary_projs_tbl p WHERE p.fiscal_year = ' || v_fiscal_year || ' AND p.accounting_period = ' || v_accounting_period || ' AND p.rate_code = ''' || (CASE WHEN p_proj_type='se' THEN 'A' ELSE 'H' END) || ''' AND p.activity IN (SELECT DISTINCT activity FROM activity_denorm_tree_vw a WHERE a.org_code = ''' || p_value || ''' OR a.div_code = ''' || p_value || ''' OR a.dept_code = ''' || p_value || ''' OR a.activity = '''|| p_value || ''') '; dbms_output.put_line('-- SQL for Projections: ' || v_sql_projs || ' ;' ); --RETURN; dbms_application_info.set_module(module_name => gv_PATH_INFO, action_name => 'Generating and executing SQL '); BEGIN dbms_application_info.set_action( 'Executing the SQL @line #' || $$PLSQL_LINE ); EXECUTE IMMEDIATE v_sql_projs BULK COLLECT INTO vt_projections; EXCEPTION WHEN OTHERS THEN v_error_message := fbors_funclib.display_error_info(p_net_id, DBMS_UTILITY.FORMAT_ERROR_STACK, DBMS_UTILITY.FORMAT_ERROR_BACKTRACE, $$PLSQL_UNIT, USERENV('sessionid'), 'json'); htp.p(p_callback || '( { "success":false, "message":"' || fbors_funclib.cleanup4json(v_error_message) || ' ", "sql":"' || fbors_funclib.cleanup4json(v_sql_projs) || '" } )') ; RETURN; END; v_sql_count := SQL%ROWCOUNT; htp.p(p_callback || '( { "rows" : [ '); IF v_sql_count > 0 THEN FOR I IN 1 .. v_sql_count LOOP htp.p(' { "rownum" : ' || vt_projections(i).sequence_id || ', "rowname" : "", "line_type" : "blank", "manual_entry":' || vt_projections(i).manual_entry || ', "net_id" : "' || vt_projections(i).net_id || '", "employee_id" : "' || vt_projections(i).employee_id || '", "first_name" : "' || vt_projections(i).first_name || '", "last_name" : "' || vt_projections(i).last_name || '", "account" : "' || vt_projections(i).account || '", "activity" : "' || vt_projections(i).activity|| '", "fund" : "' || vt_projections(i).fund || '", "func" : "' || vt_projections(i).function || '", "title_code" : "' || vt_projections(i).title_code || '", "title_code_descr" : "' || vt_projections(i).title_code_descr || '", "bargaining_unit" : "' || vt_projections(i).bargaining_unit || '", "fte" : ' || vt_projections(i).fte || ', "mod_fte" : ' || vt_projections(i).mod_fte || ', "payrate" : ' || vt_projections(i).payrate || ', "mod_payrate" : ' || vt_projections(i).mod_payrate || ', "start_date" : "' || vt_projections(i).proj_begin_date || '", "end_date" : "' || vt_projections(i).proj_end_date || '", "start_period" : "' || vt_projections(i).begin_period || '", "end_period" : "' || vt_projections(i).end_period || '", "comments" : "' || utl_url.escape(vt_projections(i).comments) || '", "deletable" : "' || vt_projections(i).deletable || '", "last_updated_by" : "' || vt_projections(i).last_updated_by || '" }' || fbors_funclib.add_comma(i, v_sql_count) ); END LOOP; -- FOR I IN 1 .. V_SQL_ROWCOUNT LOOP END IF; -- IF SQL%ROWCOUNT > 0 THEN -- Get the run time of this procedure v_run_time := to_char((dbms_utility.get_time - v_start_time)/100,'000.00'); htp.p(' ], "success" : true, "text" : "Projections generated for this and that", "runTime": "' || v_run_time || '", "totalCount" : ' || v_sql_count || ' } )') ; -- Clean up and reset MODULE and ACTION as we exit. dbms_application_info.set_module( null,null ); EXCEPTION WHEN OTHERS THEN v_error_message := fbors_funclib.display_error_info(p_net_id, DBMS_UTILITY.FORMAT_ERROR_STACK, DBMS_UTILITY.FORMAT_ERROR_BACKTRACE, $$PLSQL_UNIT, USERENV('sessionid'), 'json'); htp.p(p_callback || '( { "success":false, "message":"' || fbors_funclib.cleanup4json(v_error_message) || ' ", "sql":"' || v_sql_projs || '" } )') ; RETURN; END view_employee_proj; PROCEDURE view_nonsal_proj( p_callback IN VARCHAR2 DEFAULT NULL, p_net_id IN VARCHAR2 DEFAULT NULL, p_report_type IN VARCHAR2 DEFAULT NULL, p_value IN VARCHAR2 DEFAULT NULL, p_proj_type IN VARCHAR2 DEFAULT NULL ) IS /* ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - Procedure : View Non Salary Projection Data Author : Larry W, Brian G Created : July 2012 Purpose : To return non salary projections based on the tree node selected. The projections are shown for the current period only (based on SYSDATE) and there is no switching between periods unlike the PIWRS. UC Riverside 2012 ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - */ --v_module_name VARCHAR2(1000) := ''; --v_action_name VARCHAR2(1000) := ''; --v_client_info VARCHAR2(1000) := ''; TYPE tr_projections IS RECORD( sequence_id fbors_nonsalary_projs_tbl.Sequence_Id%TYPE, manual_entry VARCHAR2(5), budget_category fbors_nonsalary_projs_tbl.budget_category%TYPE, budcategory_descr fbors_nonsalary_projs_tbl.budcategory_descr%TYPE, fund fbors_nonsalary_projs_tbl.fund%TYPE, org_code fbors_nonsalary_projs_tbl.org_code%TYPE, div_code fbors_nonsalary_projs_tbl.div_code%TYPE, dept_code fbors_nonsalary_projs_tbl.dept_code%TYPE, activity fbors_nonsalary_projs_tbl.activity%TYPE, FUNCTION fbors_nonsalary_projs_tbl.function%TYPE, calc_aggreg_amt fbors_nonsalary_projs_tbl.calc_aggreg_amt%TYPE, calc_orig_avg_amt fbors_nonsalary_projs_tbl.calc_orig_avg_amt%TYPE, calc_mod_avg_amt fbors_nonsalary_projs_tbl.calc_mod_avg_amt%TYPE, mod_aggreg_amt fbors_nonsalary_projs_tbl.mod_aggreg_amt%TYPE, mod_avg_pct fbors_nonsalary_projs_tbl.mod_avg_pct%TYPE, mod_pct_begin_per VARCHAR2(2), mod_pct_end_per VARCHAR2(2), mod_avg_amt fbors_nonsalary_projs_tbl.mod_avg_amt%TYPE, mod_amt_begin_per VARCHAR2(2), mod_amt_end_per VARCHAR2(2), comments fbors_nonsalary_projs_tbl.comments%TYPE, system_generated fbors_nonsalary_projs_tbl.system_generated%TYPE, last_updated_by VARCHAR2(100) ); TYPE tt_projections IS TABLE OF tr_projections; vt_projections tt_projections ; BEGIN log_usage.record_data(p_net_id, DECLARATIONS.gk_IP_ADDRESS, DECLARATIONS.gk_BROWSER_TYPE, DECLARATIONS.gk_APPLICATION_URL, DECLARATIONS.gk_PATH_INFO, DECLARATIONS.gk_QUERY_STRING, ''); -- v_accounting_period := 3; -- debugging /* -- Convert the current date into the relevant fiscal year and accounting period v_fiscal_year := fbors_funclib.current_fiscal_year; v_max_closed_date := to_date(fbors_funclib.max_closed_date, 'MM/DD/YYYY'); -- ie: 8/8/2012 for closing July v_last_closed_month := TO_CHAR(TO_DATE(v_max_closed_date, 'DD-MON-YYYY'), 'MM') -1; -- ie: 8-1 so 7 for July -- v_last_closed_month := 8; -- debugging for other months IF v_last_closed_month > 6 THEN v_accounting_period := v_last_closed_month - 6; ELSE v_accounting_period := v_last_closed_month + 6; END IF; */ v_sql_projs := ' SELECT sequence_id, decode(f.system_generated, ''N'', ''true'', ''Y'', ''false'' ) manual_entry, budget_category, budcategory_descr, fund, org_code, div_code,dept_code, activity, function, f.calc_aggreg_amt, f.calc_orig_avg_amt, f.calc_mod_avg_amt, f.mod_aggreg_amt, f.mod_avg_pct, CASE WHEN to_char(f.mod_pct_begin_date, ''MM'') >6 THEN (to_char(f.mod_pct_begin_date, ''MM'')-6) ELSE (to_char(f.mod_pct_begin_date, ''MM'')+6) END mod_pct_begin_per, CASE WHEN to_char(f.mod_pct_end_date, ''MM'') >6 THEN (to_char(f.mod_pct_end_date, ''MM'')-6) ELSE (to_char(f.mod_pct_end_date, ''MM'')+6) END mod_pct_end_per, f.mod_avg_amt, CASE WHEN to_char(f.mod_amt_begin_date, ''MM'') >6 THEN (to_char(f.mod_amt_begin_date, ''MM'')-6) ELSE (to_char(f.mod_amt_begin_date, ''MM'')+6) END mod_amt_begin_per, CASE WHEN to_char(f.mod_amt_end_date, ''MM'') >6 THEN (to_char(f.mod_amt_end_date, ''MM'')-6) ELSE (to_char(f.mod_amt_end_date, ''MM'')+6) END mod_amt_end_per, comments, system_generated, f.updated_by || '' '' || TO_CHAR(f.updated_on, ''MM/DD/YYYY HH:MI'') last_updated_by FROM fbors_nonsalary_projs_tbl f WHERE f.fiscal_year = ' || v_fiscal_year || ' AND f.accounting_period = ' || v_accounting_period || ' AND f.activity IN (SELECT DISTINCT activity FROM activity_denorm_tree_vw a WHERE a.org_code = ''' || p_value || ''' OR a.div_code = ''' || p_value || ''' OR a.dept_code = ''' || p_value || ''' OR a.activity = ''' || p_value || ''') ORDER BY fiscal_year, accounting_period, budget_category, activity, fund, function '; dbms_output.put_line(v_sql_projs); -- RETURN; dbms_application_info.set_module(module_name => gv_PATH_INFO, action_name => 'Generating and executing SQL '); BEGIN dbms_application_info.set_action( 'Executing the SQL @line #'|| $$PLSQL_LINE ); EXECUTE IMMEDIATE v_sql_projs BULK COLLECT INTO vt_projections; EXCEPTION WHEN OTHERS THEN dbms_output.put_line(v_sql_projs); v_error_message := fbors_funclib.display_error_info(p_net_id, DBMS_UTILITY.FORMAT_ERROR_STACK, DBMS_UTILITY.FORMAT_ERROR_BACKTRACE, $$PLSQL_UNIT, USERENV('sessionid'), 'json'); htp.p(p_callback || '( { "success":false, "message":"' || fbors_funclib.cleanup4json(v_error_message) || ' ", "sql":"' || fbors_funclib.cleanup4json(v_sql_projs) || '" } )') ; RETURN; END; v_sql_count := SQL%ROWCOUNT; htp.p(p_callback || '( { "rows" : [ '); IF v_sql_count > 0 THEN FOR I IN 1 .. v_sql_count LOOP htp.p(' { "rownum" : "'|| vt_projections(i).sequence_id || '", "rowname" : "", "line_type" : "blank", "manual_entry":' || vt_projections(i).manual_entry || ', "budget_category":"' || vt_projections(i).budget_category || '", "budcategory_descr" : "' || vt_projections(i).budcategory_descr || '", "fund" : "' || vt_projections(i).fund || '", "activity" : "' || vt_projections(i).activity || '", "func" : "' || vt_projections(i).function || '", "calc_aggreg_amt" : "' || vt_projections(i).calc_aggreg_amt || '", "calc_orig_avg_amt" : "' || vt_projections(i).calc_orig_avg_amt || '", "calc_mod_avg_amt" : "' || vt_projections(i).calc_mod_avg_amt || '", "mod_aggreg_amt" : "' || vt_projections(i).mod_aggreg_amt || '", "mod_avg_pct_real" : "' || vt_projections(i).mod_avg_pct || '", "mod_avg_pct" : "0", "mod_pct_begin_per" : "' || vt_projections(i).mod_pct_begin_per || '", "mod_pct_end_per": "' || vt_projections(i).mod_pct_end_per || '", "mod_avg_amt_real" : "' || vt_projections(i).mod_avg_amt || '", "mod_avg_amt" : "0", "mod_amt_begin_per":"' || vt_projections(i).mod_amt_begin_per || '", "mod_amt_end_per":"' || vt_projections(i).mod_amt_end_per || '", "comments" : "' || utl_url.escape(vt_projections(i).comments) || '", "deletable" : "N", "system_generated" : "' || vt_projections(i).system_generated || '", "last_updated_by" : "' || vt_projections(i).last_updated_by || '" }' || fbors_funclib.add_comma(i, v_sql_count) ); END LOOP; -- FOR I IN 1 .. V_SQL_ROWCOUNT LOOP END IF; -- IF SQL%ROWCOUNT > 0 THEN -- Get the run time of this procedure v_run_time := to_char((dbms_utility.get_time - v_start_time)/100,'000.00'); htp.p(' ], "success" : true, "text" : "Projections generated for this and that", "runTime": "' || v_run_time || '", "totalCount" : ' || v_sql_count || ' } )') ; -- Clean up and reset MODULE and ACTION as we exit. dbms_application_info.set_module( null,null ); EXCEPTION WHEN OTHERS THEN v_error_message := fbors_funclib.display_error_info(p_net_id, DBMS_UTILITY.FORMAT_ERROR_STACK, DBMS_UTILITY.FORMAT_ERROR_BACKTRACE, $$PLSQL_UNIT, USERENV('sessionid'), 'json'); htp.p(p_callback || '( { "success":false, "message":"' || fbors_funclib.cleanup4json(v_error_message) || ' ", "sql":"' || v_sql_projs || '" } )') ; RETURN; END view_nonsal_proj; PROCEDURE view_budget_proj( p_callback IN VARCHAR2 DEFAULT NULL, p_net_id IN VARCHAR2 DEFAULT NULL, p_report_type IN VARCHAR2 DEFAULT NULL, p_value IN VARCHAR2 DEFAULT NULL, p_proj_type IN VARCHAR2 DEFAULT NULL ) IS /* ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - Procedure : View Budget Projection Data Author : Larry W, Brian G Created : Sept 2012 Purpose : To return budget projections based on the tree node selected. The projections are shown for the current period only (based on SYSDATE) and there is no switching between periods unlike the PIWRS. UC Riverside 2012 ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - */ --v_module_name VARCHAR2(1000) := ''; --v_action_name VARCHAR2(1000) := ''; --v_client_info VARCHAR2(1000) := ''; /*v_fiscal_year INTEGER := 0; v_accounting_period INTEGER := 0;*/ /* TYPE tr_projections IS RECORD( budcategory fbors_budget_projs_tbl.budcategory%TYPE, budcategory_descr fbors_nonsalary_projs_tbl.budcategory_descr%TYPE, sum_amt fbors_nonsalary_projs_tbl.calc_sum_amt%TYPE, avg_amt fbors_nonsalary_projs_tbl.calc_avg_amt%TYPE ); TYPE tt_projections IS TABLE OF tr_projections; */ TYPE tt_projections IS TABLE OF fbors_budget_projs_tbl%ROWTYPE; vt_projections tt_projections ; BEGIN log_usage.record_data(p_net_id, DECLARATIONS.gk_IP_ADDRESS, DECLARATIONS.gk_BROWSER_TYPE, DECLARATIONS.gk_APPLICATION_URL, DECLARATIONS.gk_PATH_INFO, DECLARATIONS.gk_QUERY_STRING, ''); --v_accounting_period := 1; -- debugging v_sql_projs := ' SELECT sequence_id, fiscal_year, accounting_period, ledger, descr, budget_category, fund, org_code, div_code, dept_code, activity, function, amount, proj_begin_date, proj_end_date, comments, updated_by, updated_on FROM fbors_budget_projs_tbl f WHERE f.fiscal_year = ' || v_fiscal_year || ' AND f.accounting_period = ' || v_accounting_period || ' AND f.activity IN (SELECT DISTINCT activity FROM activity_denorm_tree_vw a WHERE a.org_code = ''' || p_value || ''' OR a.div_code = ''' || p_value || ''' OR a.dept_code = ''' || p_value || ''' OR a.activity = '''|| p_value || ''') ORDER BY f.budget_category '; dbms_output.put_line(v_sql_projs); --RETURN; dbms_application_info.set_module(module_name => gv_PATH_INFO, action_name => 'Generating and executing SQL '); BEGIN dbms_application_info.set_action( 'Executing the SQL @line #'|| $$PLSQL_LINE ); EXECUTE IMMEDIATE v_sql_projs BULK COLLECT INTO vt_projections; EXCEPTION WHEN OTHERS THEN dbms_output.put_line(v_sql_projs); v_error_message := fbors_funclib.display_error_info(p_net_id, DBMS_UTILITY.FORMAT_ERROR_STACK, DBMS_UTILITY.FORMAT_ERROR_BACKTRACE, $$PLSQL_UNIT, USERENV('sessionid'), 'json'); htp.p(p_callback || '( { "success":false, "message":"' || fbors_funclib.cleanup4json(v_error_message) || ' ", "sql":"' || fbors_funclib.cleanup4json(v_sql_projs) || '" } )') ; RETURN; END; v_sql_count := SQL%ROWCOUNT; htp.p(p_callback || '( { "rows" : [ '); IF v_sql_count > 0 THEN FOR I IN 1 .. v_sql_count LOOP htp.p(' { "rownum" : "'|| vt_projections(i).sequence_id || '", "rowname" : "", "line_type" : "blank", "type" : "' || vt_projections(i).ledger || '", "descr" : "' || vt_projections(i).descr || '", "budget_category":"' || vt_projections(i).budget_category || '", "activity":"' || vt_projections(i).activity || '", "fund":"' || vt_projections(i).fund || '", "function":"' || vt_projections(i).function || '", "amount" : "' || vt_projections(i).amount || '", "proj_begin_date" : "' || vt_projections(i).proj_begin_date || '", "proj_end_date" : "' || vt_projections(i).proj_end_date || '", "deletable" : "Y", "comments" : "' || utl_url.escape(vt_projections(i).comments) || '", "last_updated_by" : "' || vt_projections(i).updated_by || '" }' ||fbors_funclib.add_comma(i, v_sql_count) ); END LOOP; -- FOR I IN 1 .. V_SQL_ROWCOUNT LOOP END IF; -- IF SQL%ROWCOUNT > 0 THEN -- Get the run time of this procedure v_run_time := to_char((dbms_utility.get_time - v_start_time)/100,'000.00'); htp.p(' ], "success" : true, "text" : "Projections generated for this and that", "runTime": "' || v_run_time || '", "totalCount" : ' || v_sql_count || ' } )') ; -- Clean up and reset MODULE and ACTION as we exit. dbms_application_info.set_module( null,null ); EXCEPTION WHEN OTHERS THEN v_error_message := fbors_funclib.display_error_info(p_net_id, DBMS_UTILITY.FORMAT_ERROR_STACK, DBMS_UTILITY.FORMAT_ERROR_BACKTRACE, $$PLSQL_UNIT, USERENV('sessionid'), 'json'); htp.p(p_callback || '( { "success":false, "message":"' || fbors_funclib.cleanup4json(v_error_message) || ' ", "sql":"' || v_sql_projs || '" } )') ; RETURN; END view_budget_proj; PROCEDURE view_benefit_proj( p_callback IN VARCHAR2 DEFAULT NULL, p_net_id IN VARCHAR2 DEFAULT NULL, p_report_type IN VARCHAR2 DEFAULT NULL, p_value IN VARCHAR2 DEFAULT NULL, p_proj_type IN VARCHAR2 DEFAULT NULL ) IS /* ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - Procedure : View Benefit Projection Data Author : Larry W, Brian G Created : Sept 2012 Purpose : To return SDOPE benefit projections based on the tree node selected. The projections are shown for the current period only (based on SYSDATE) and there is no switching between periods unlike the PIWRS. UC Riverside 2012 ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - */ --v_module_name VARCHAR2(1000) := ''; --v_action_name VARCHAR2(1000) := ''; --v_client_info VARCHAR2(1000) := ''; /*v_fiscal_year INTEGER := 0; v_accounting_period INTEGER := 0;*/ TYPE tr_projections IS RECORD( sequence_id fbors_benefits_projs_tbl.sequence_id%TYPE, manual_entry VARCHAR2(5), account fbors_benefits_projs_tbl.account%TYPE, budget_category fbors_benefits_projs_tbl.budget_category%TYPE, budcategory_descr fbors_benefits_projs_tbl.budcategory_descr%TYPE, activity fbors_benefits_projs_tbl.activity%TYPE, fund fbors_benefits_projs_tbl.fund%TYPE, FUNCTION fbors_benefits_projs_tbl.function%TYPE, total_benefits_amt fbors_benefits_projs_tbl.total_benefits_amt%TYPE, mod_total_benefits_amt fbors_benefits_projs_tbl.total_benefits_amt%TYPE, mod_begin_date VARCHAR2(10), -- fbors_benefits_projs_tbl.begin_date%TYPE, mod_end_date VARCHAR2(10), -- fbors_benefits_projs_tbl.end_date%TYPE, comments fbors_benefits_projs_tbl.comments%TYPE, system_generated fbors_benefits_projs_tbl.system_generated%TYPE, last_updated_by VARCHAR2(100) ); TYPE tt_projections IS TABLE OF tr_projections; -- TYPE tt_projections IS TABLE OF fbors_benefits_projs_tbl%ROWTYPE; vt_projections tt_projections ; BEGIN log_usage.record_data(p_net_id, DECLARATIONS.gk_IP_ADDRESS, DECLARATIONS.gk_BROWSER_TYPE, DECLARATIONS.gk_APPLICATION_URL, DECLARATIONS.gk_PATH_INFO, DECLARATIONS.gk_QUERY_STRING, ''); --v_accounting_period := 1; -- debugging v_sql_projs := ' SELECT sequence_id, decode(f.system_generated, ''N'', ''true'', ''Y'', ''false'' ) manual_entry, account, budget_category, budcategory_descr, activity, fund, function, total_benefits_amt, --TO_CHAR(begin_date, ''MM/DD/YYYY'') begin_date, --TO_CHAR(end_date, ''MM/DD/YYYY'') end_date, mod_total_benefits_amt, TO_CHAR(mod_begin_date, ''MM/DD/YYYY'') mod_begin_date, TO_CHAR(mod_end_date, ''MM/DD/YYYY'') mod_end_date, comments, system_generated, f.updated_by || '' '' || TO_CHAR(f.updated_on, ''MM/DD/YYYY HH:MI'') last_updated_by FROM fbors_benefits_projs_tbl f WHERE f.fiscal_year = ' || v_fiscal_year || ' AND f.accounting_period = ' || v_accounting_period || ' AND f.activity IN (SELECT DISTINCT a.activity FROM activity_denorm_tree_vw a WHERE a.org_code = ''' || p_value || ''' OR a.div_code = ''' || p_value || ''' OR a.dept_code = ''' || p_value || ''' OR a.activity = ''' || p_value || ''') ORDER BY activity, fund, function, budget_category '; dbms_output.put_line(v_sql_projs); --RETURN; dbms_application_info.set_module(module_name => gv_PATH_INFO, action_name => 'Generating and executing SQL '); BEGIN dbms_application_info.set_action( 'Executing the SQL @line #'|| $$PLSQL_LINE ); EXECUTE IMMEDIATE v_sql_projs BULK COLLECT INTO vt_projections; EXCEPTION WHEN OTHERS THEN dbms_output.put_line(v_sql_projs); v_error_message := fbors_funclib.display_error_info(p_net_id, DBMS_UTILITY.FORMAT_ERROR_STACK, DBMS_UTILITY.FORMAT_ERROR_BACKTRACE, $$PLSQL_UNIT, USERENV('sessionid'), 'json'); htp.p(p_callback || '( { "success":false, "message":"' || fbors_funclib.cleanup4json(v_error_message) || ' ", "sql":"' || fbors_funclib.cleanup4json(v_sql_projs) || '" } )') ; RETURN; END; v_sql_count := SQL%ROWCOUNT; htp.p(p_callback || '( { "rows" : [ '); IF v_sql_count > 0 THEN FOR I IN 1 .. v_sql_count LOOP htp.p(' { "rownum" : "'|| vt_projections(i).sequence_id || '", "rowname" : "", "line_type" : "blank", "manual_entry":' || vt_projections(i).manual_entry || ', "budget_category" : "' || vt_projections(i).budget_category || '", "budcategory_descr" : "' || vt_projections(i).budcategory_descr || '", "account":"' || vt_projections(i).account || '", "activity":"' || vt_projections(i).activity || '", "fund":"' || vt_projections(i).fund || '", "func":"' || vt_projections(i).function || '", "amount" : "' || vt_projections(i).total_benefits_amt || '", "mod_amount" : "' || vt_projections(i).mod_total_benefits_amt || '", "mod_start_date" : "' || vt_projections(i).mod_begin_date || '", "mod_end_date" : "' || vt_projections(i).mod_end_date || '", "deletable" : "N", "comments" : "' || utl_url.escape(vt_projections(i).comments) || '", "last_updated_by" : "' || vt_projections(i).last_updated_by || '" }' || fbors_funclib.add_comma(i, v_sql_count) ); /* REMOVED since we are summarizing the SDOPE information by BC "start_date" : "' || vt_projections(i).begin_date || '", "end_date" : "' || vt_projections(i).end_date || '", */ END LOOP; -- FOR I IN 1 .. V_SQL_ROWCOUNT LOOP END IF; -- IF SQL%ROWCOUNT > 0 THEN -- Get the run time of this procedure v_run_time := to_char((dbms_utility.get_time - v_start_time)/100,'000.00'); htp.p(' ], "success" : true, "text" : "Projections generated for this and that", "runTime": "' || v_run_time || '", "totalCount" : ' || v_sql_count || ' } )') ; -- Clean up and reset MODULE and ACTION as we exit. dbms_application_info.set_module( null,null ); EXCEPTION WHEN OTHERS THEN v_error_message := fbors_funclib.display_error_info(p_net_id, DBMS_UTILITY.FORMAT_ERROR_STACK, DBMS_UTILITY.FORMAT_ERROR_BACKTRACE, $$PLSQL_UNIT, USERENV('sessionid'), 'json'); htp.p(p_callback || '( { "success":false, "message":"' || fbors_funclib.cleanup4json(v_error_message) || ' ", "sql":"' || v_sql_projs || '" } )') ; RETURN; END view_benefit_proj; PROCEDURE save_data( p_callback IN VARCHAR2 DEFAULT NULL, p_net_id IN VARCHAR2 DEFAULT NULL, p_employee_id IN VARCHAR2 DEFAULT NULL, p_proj_type IN VARCHAR2, p_grid_data IN VARCHAR2 ) IS /* ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - Procedure : Save Projection Data Author : Larry W, Brian G Created : July 2012 Purpose : To redirect and then save projections based on the Projection type Params : p_grid_data : M~2~alanr~856788673~ALAN~ROY~7277~0.25~1500~July~January~Updated projection for Alan July - January~500110~A01369~66095~72 p_employee_id : 850165183 p_proj_type : se, he, nse, ben, bud UC Riverside 2012 ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - */ BEGIN -- Switch to the appropriate procedure to save the projection -- TO DO: NEED TO UPDATE HOW WE CONSTRUCT THE URL: v_url := gk_APPLICATION_URL || 'fbors_projections.' || CASE p_proj_type -- Salary employees --WHEN 'se' THEN 'save_sal_emp_proj' -- Hourly employees --WHEN 'he' THEN 'save_hrly_emp_proj' -- Non salaried employees WHEN 'ns' THEN 'save_nonsal_proj' -- Benefits WHEN 'ben' THEN 'save_benefit_proj' -- Budgets WHEN 'bud' THEN 'save_budget_proj' -- Wo0t! Infinite loop! <--- Your infinte loop has been terminated, dirt bag! ELSE --'save_data' 'save_employee_proj' -- Salary and Hourly Employees END || '?p_callback=' || p_callback || '&p_net_id=' || p_net_id || '&p_employee_id=' || p_employee_id || '&p_grid_data=' || p_grid_data || '&p_proj_type=' || p_proj_type; owa_util.redirect_url(v_url, TRUE); EXCEPTION WHEN OTHERS THEN v_error_message := fbors_funclib.display_error_info(p_net_id, DBMS_UTILITY.FORMAT_ERROR_STACK, DBMS_UTILITY.FORMAT_ERROR_BACKTRACE, $$PLSQL_UNIT, USERENV('sessionid'), 'json'); htp.p(p_callback || '( { "success":false, "message":"' || fbors_funclib.cleanup4json(v_error_message) || ' ", "totalCount":0 } )') ; RETURN; END save_data; PROCEDURE save_employee_proj( p_callback IN VARCHAR2 DEFAULT NULL, p_net_id IN VARCHAR2 DEFAULT NULL, p_employee_id IN VARCHAR2 DEFAULT NULL, p_proj_type IN VARCHAR2 DEFAULT 'se', p_grid_data IN VARCHAR2 ) IS /* ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - Procedure : Save Salaried Employees Projection Data Author : Larry W, Brian G Created : July 2012 Purpose : To save projections to the FBORS_SALARY_PROJS_TBL table Params : p_grid_data : the list of FORM elements passed as a javasript array into a single parameter here M~2~alanr~856788673~ALAN~ROY~7277~0.25~1500~July~January~Updated projection for Alan July - January~500110~A01369~66095~72 A~-1~~BR~GR~3074~1~1500~September~September~Added by Brian~500110~A01375~19900~72 UC Riverside 2012 ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - */ -- Array positions to parse through p_grid_data k_ADD_MOD CONSTANT INTEGER := 1; k_SEQ_ID CONSTANT INTEGER := 2; k_NET_ID CONSTANT INTEGER := 3; k_EMPL_ID CONSTANT INTEGER := 4; k_FIRST_NAME CONSTANT INTEGER := 5; k_LAST_NAME CONSTANT INTEGER := 6; k_TITLE_CODE CONSTANT INTEGER := 7; K_ACCOUNT CONSTANT INTEGER := 8; K_ACTIVITY CONSTANT INTEGER := 9; K_FUND CONSTANT INTEGER := 10; K_FUNCTION CONSTANT INTEGER := 11; k_FTE CONSTANT INTEGER := 12; K_PAY_RATE CONSTANT INTEGER := 13; K_BEGIN_PER CONSTANT INTEGER := 14; K_END_PER CONSTANT INTEGER := 15; K_COMMENTS CONSTANT INTEGER := 16; -- Projection Start and End Dates --v_start_fiscal_year fbors_salary_projs_tbl.fiscal_year%TYPE; --v_start_accounting_period fbors_salary_projs_tbl.accounting_period%TYPE; v_summary_account fbors_salary_projs_tbl.summary_account%TYPE; v_summary_acct_descr fbors_salary_projs_tbl.summary_acct_descr%TYPE; v_budget_category fbors_salary_projs_tbl.budget_category%TYPE; v_budcategory_descr fbors_salary_projs_tbl.budcategory_descr%TYPE; v_title_code_descr vw_title_codes_appt.title_code_descr%TYPE; v_pay_begin_date fbors_salary_projs_tbl.pay_begin_date%TYPE; v_pay_end_date fbors_salary_projs_tbl.pay_end_date%TYPE; BEGIN -- v_accounting_period := 1; dbms_application_info.set_module(module_name => gv_PATH_INFO, action_name => 'STARTING'); v_grid_data := utl_url.unescape(p_grid_data); -- Parse through p_grid_data and determine whether to INSERT a new entry or UPDATE an exisiing one v_items := fbors_funclib.parse_string(p_in_string => v_grid_data, p_delim => '~'); --v_item_count := v_items.COUNT; /* -- Prevent the user from trying to create a projection in the past (should already be done on the front end) IF TO_DATE(to_char(v_items(K_BEGIN_PER) || '/01/' || v_current_year), 'MM/DD/YYYY') <= TO_DATE(fbors_funclib.max_closed_date, 'MM/DD/YYYY') THEN htp.p(p_callback || '( { "success":false, "message":"You may not start a projection in which the month has already been closed by Accounting.", "totalCount":0 } )') ; ROLLBACK; RETURN; END IF; */ -- Determine the projection's start / end year IF v_items(K_BEGIN_PER) >= 7 THEN v_start_year := v_fiscal_year; ELSE v_start_year := v_current_year; END IF; IF v_items(K_END_PER) >= 7 THEN v_end_year := v_fiscal_year; ELSE v_end_year := v_current_year; END IF; -- Prevent 0 amounts for new additions IF ( v_items(k_FTE) = 0 ) OR ( v_items(K_PAY_RATE) = 0 ) THEN v_save_message := v_save_message || '


Warning: Please note that when either the FTE or Pay Rate is 0, this effectively `turns off` the projection. '; END IF; -- Check to see if the updated FTE now exceeds 1.0 for this employee starting with the Start Month of the projection check_excessive_fte(v_items(k_EMPL_ID), v_result); v_save_message := v_save_message || v_result; -- MODIFY: If this projection was modified... IF instr(v_items(k_ADD_MOD), 'M') > 0 THEN -- Determine the number of months between the start and end date for the annualized projection amount -- v_months_between := months_between(TO_DATE(v_items(K_BEGIN_PER) || v_start_year, 'Month YYYY'), LAST_DAY(TO_DATE(v_items(K_END_PER) || v_end_year, 'Month YYYY'))); v_months_between := v_items(K_END_PER) - v_items(K_BEGIN_PER); -- Audit this transaction before updating v_return := audit_transaction('fbors_salary_projs_tbl', v_items(k_SEQ_ID), fbors_projs_audit_seq.nextval, p_net_id, 'UPDATE'); IF v_return <> 'SUCCESS' THEN htp.p(p_callback || '( { "success":false, "message":"' || fbors_funclib.cleanup4json(v_return) || ' ", "totalCount":0 } )') ; ROLLBACK; RETURN; END IF; -- Update the data BEGIN dbms_application_info.set_action( 'Updating the Salary Projections table @line #' || $$PLSQL_LINE); UPDATE fbors_salary_projs_tbl p SET p.net_id = v_items(k_NET_ID), mod_fte = v_items(k_FTE), mod_payrate = v_items(K_PAY_RATE), calc_mod_payrate = ROUND(v_items(K_PAY_RATE)*v_items(k_FTE), 2), calc_mod_annual_payrate = ROUND(v_items(K_PAY_RATE)*v_items(k_FTE)*(v_months_between), 2), -- Need to convert the accounting period into a calendar month mod_begin_date = TO_DATE( CASE WHEN v_items(K_BEGIN_PER) <= 6 THEN v_items(K_BEGIN_PER) + 6 ELSE v_items(K_BEGIN_PER) - 6 END || ' ' || v_start_year, 'MM YYYY'), mod_end_date = LAST_DAY(TO_DATE( CASE WHEN v_items(K_END_PER) <= 6 THEN v_items(K_END_PER) + 6 ELSE v_items(K_END_PER) - 6 END || ' ' || v_end_year, 'MM YYYY')), comments = v_items(K_COMMENTS), system_generated = 'N', updated_by = p_net_id, updated_on = SYSDATE WHERE p.sequence_id = v_items(k_SEQ_ID); v_sql_rowcount := SQL%ROWCOUNT; EXCEPTION WHEN OTHERS THEN v_error_message := fbors_funclib.display_error_info(p_net_id, DBMS_UTILITY.FORMAT_ERROR_STACK, DBMS_UTILITY.FORMAT_ERROR_BACKTRACE, $$PLSQL_UNIT, USERENV('sessionid'), 'json'); htp.p(p_callback || '( { "success":false, "message":"' || fbors_funclib.cleanup4json(v_error_message) || ' ", "totalCount":0 } )') ; ROLLBACK; RETURN; END; -- ADD: Insert a new projection ELSIF instr(v_items(k_ADD_MOD), 'A') > 0 THEN -- Validate the FAU IF fbors_funclib.validate_fau(v_items(K_ACCOUNT), v_items(K_ACTIVITY), v_items(K_FUND), v_items(K_FUNCTION)) < 4 THEN htp.p(p_callback || '( { "success":false, "message":"The FAU provided is incorrect. Please review your input, ' || v_items(K_ACCOUNT) || ' / ' || v_items(K_ACTIVITY) || ' / ' || v_items(K_FUND) || ' / ' || v_items(K_FUNCTION) || ' and try again. ", "totalCount":0 } )') ; ROLLBACK; RETURN; END IF; -- Get the higher level Account values for easier querying on the Summary / Detail reports BEGIN SELECT DISTINCT a.ucr_acct_sum, a.ucr_acct_sum_dsc, a.ucr_acct_bdgt, a.ucr_acct_bdgt_dsc INTO v_summary_account, v_summary_acct_descr, v_budget_category, v_budcategory_descr FROM ps_ucr_acct_lv_tbl a WHERE a.ucr_acct = v_items(K_ACCOUNT); EXCEPTION WHEN OTHERS THEN htp.p(p_callback || '( { "success":false, "message":"An invalid Account was provided. Please select an Account from the list provided and try saving your projection again.", "totalCount":0 } )') ; ROLLBACK; RETURN; END; -- Get the Title Code description BEGIN SELECT DISTINCT tc.title_code_descr INTO v_title_code_descr FROM vw_title_codes_appt tc WHERE tc.title_code= v_items(k_TITLE_CODE); EXCEPTION WHEN OTHERS THEN htp.p(p_callback || '( { "success":false, "message":"An invalid Title Code was provided. Please select a Title Code from the list provided and try saving your projection again.", "totalCount":0 } )') ; ROLLBACK; RETURN; END; -- Get the employees's activity denormalized information -- get_actv_denorm_tree_values(v_items(K_ACTIVITY), v_org_code, v_div_code, v_dept_code, v_result); get_actv_denorm_tree_values(v_items(K_ACTIVITY), v_activity_denorm_tree_values, v_result); IF v_result IS NOT NULL THEN htp.p(p_callback || '( { "success":false, "message":"' || v_result || ' ", "totalCount":0 } )') ; ROLLBACK; RETURN; END IF; -- Check to see if the activity is within the user's EACS Accountability Structure check_activity_in_eacs(UPPER(v_items(K_ACTIVITY)), p_net_id, v_result); v_save_message := v_save_message || v_result; -- Convert the Begin/End periods into calendar dates -- For Projection Percentages, determine the projection's start / end year IF v_items(K_BEGIN_PER) < 7 THEN v_start_month := v_items(K_BEGIN_PER) + 6; v_start_year := v_current_year; ELSE v_start_month := v_items(K_BEGIN_PER) - 6; v_start_year := v_fiscal_year; END IF; IF v_items(K_END_PER) < 7 THEN v_end_month := v_items(K_END_PER) + 6; v_end_year := v_current_year; ELSE v_end_month := v_items(K_END_PER) - 6; v_end_year := v_fiscal_year; END IF; -- In case the Hourlt projection is for just a Title Code and no Employee ID or Name is given, the IF v_items(k_FIRST_NAME) IS NULL THEN v_items(k_FIRST_NAME) := 'None'; END IF; IF v_items(k_LAST_NAME) IS null THEN v_items(k_LAST_NAME) := 'None'; END IF; v_pay_begin_date := TO_DATE(v_start_month || '/01/' || v_start_year, 'MM/DD/YYYY'); v_pay_end_date := last_day(TO_DATE(v_end_month || '/01/' || v_end_year, 'MM/DD/YYYY')); v_seq_nextval := fbors_salary_projs_seq.nextval; -- The actual INSERT INTO BEGIN dbms_application_info.set_action( 'Inserting the Salary Projection data @line #'|| $$PLSQL_LINE ); INSERT INTO fbors_salary_projs_tbl (sequence_id, net_id, employee_id, first_name, last_name, fiscal_year, accounting_period, load_seq, account, summary_account, summary_acct_descr, budget_category, budcategory_descr, fund, org_code, div_code, dept_code, activity, FUNCTION, cost_center, project_id, title_code, title_code_descr, bargaining_unit, pay_begin_date, pay_end_date, mod_begin_date, mod_end_date, rate_code, fte, mod_fte, payrate, calc_payrate, mod_payrate, calc_mod_payrate, calc_annual_payrate, calc_mod_annual_payrate, comments, system_generated, hrdw_download_date, updated_by, updated_on) VALUES (v_seq_nextval, v_items(k_NET_ID), v_items(k_EMPL_ID), upper(v_items(k_FIRST_NAME)), upper(v_items(k_LAST_NAME)), v_fiscal_year, v_accounting_period, 0, --v_load_seq, v_items(K_ACCOUNT), v_summary_account, v_summary_acct_descr, v_budget_category, v_budcategory_descr, -- v_items(K_FUND), v_org_code, v_div_code, v_dept_code, v_items(K_ACTIVITY), v_items(K_FUND), v_activity_denorm_tree_values.org_code, v_activity_denorm_tree_values.div_code, v_activity_denorm_tree_values.dept_code, UPPER(v_items(K_ACTIVITY)), v_items(K_FUNCTION), '', '', -- v_cost_center, v_program_code, v_items(k_TITLE_CODE), v_title_code_descr, '99', null, null, -- pay_begin_date, pay_end_date v_pay_begin_date, v_pay_end_date, -- mod_begin_date, mod_end_date (CASE WHEN p_proj_type='se' THEN 'A' ELSE 'H' END), -- rate code 0, --fte v_items(k_FTE), -- mod_fte 0, 0, -- payrate, calc_payrate, v_items(K_PAY_RATE), round(v_items(k_FTE)*v_items(K_PAY_RATE), 2), -- mod_payrate, calc_mod_payrate, 0, -- calc_annual_payrate abs(round(v_items(K_PAY_RATE) * months_between(v_pay_begin_date, v_pay_end_date), 2)), -- calc_mod_annual_payrate v_items(K_COMMENTS), 'N', NULL, p_net_id, SYSDATE); v_sql_rowcount := SQL%ROWCOUNT; EXCEPTION WHEN OTHERS THEN -- v_error_message := fbors_funclib.display_error_info(p_net_id, DBMS_UTILITY.FORMAT_ERROR_STACK, DBMS_UTILITY.FORMAT_ERROR_BACKTRACE, $$PLSQL_UNIT, 'json'); v_error_message := fbors_funclib.display_error_info(p_net_id, DBMS_UTILITY.FORMAT_ERROR_STACK, DBMS_UTILITY.FORMAT_ERROR_BACKTRACE, $$PLSQL_UNIT, USERENV('sessionid'), 'json'); htp.p(p_callback || '( { "success":false, "message":"' || fbors_funclib.cleanup4json(v_error_message) || ' ", "totalCount":0 } )') ; ROLLBACK; RETURN; END; -- Audit this transaction after INSERTing v_return := audit_transaction('fbors_salary_projs_tbl', v_seq_nextval, fbors_projs_audit_seq.nextval, p_net_id, 'INSERT'); IF v_return <> 'SUCCESS' THEN htp.p(p_callback || '( { "success":false, "message":"' || fbors_funclib.cleanup4json(v_return) || ' ", "totalCount":0 } )') ; ROLLBACK; RETURN; END IF; /* -- Audit this transaction before updating BEGIN dbms_application_info.set_action( 'Auditing the Salary Projections table @line #' || $$PLSQL_LINE); INSERT INTO fbors_salary_projs_audit (audit_id, audit_net_id, audit_datetime, audit_operation, sequence_id, net_id, employee_id, first_name, last_name, fiscal_year, accounting_period, load_seq, account, summary_account, summary_acct_descr, budget_category, budcategory_descr, fund, org_code, div_code, dept_code, activity, FUNCTION, cost_center, project_id, title_code, title_code_descr, bargaining_unit, pay_begin_date, pay_end_date, rate_code, fte, payrate, calc_payrate, calc_annual_payrate, mod_fte, mod_payrate, calc_mod_payrate, calc_mod_annual_payrate, mod_begin_date, mod_end_date, comments, system_generated, updated_by, updated_on, hrdw_download_date) SELECT fbors_projs_audit_seq.nextval, p_net_id, SYSDATE, 'INSERT', p.* FROM fbors_salary_projs_tbl p WHERE p.sequence_id = v_seq_nextval; EXCEPTION WHEN OTHERS THEN v_error_message := fbors_funclib.display_error_info(p_net_id, DBMS_UTILITY.FORMAT_ERROR_STACK, DBMS_UTILITY.FORMAT_ERROR_BACKTRACE, $$PLSQL_UNIT, USERENV('sessionid'), 'json'); htp.p(p_callback || '( { "success":false, "message":"' || fbors_funclib.cleanup4json(v_error_message) || ' ", "totalCount":0 } )') ; ROLLBACK; RETURN; END;*/ -- DELETE an employee projection ELSIF instr(v_items(k_ADD_MOD), 'D') > 0 THEN /* -- Switch to the appropriate procedure to delete the projection v_url := gk_APPLICATION_URL || 'fbors_projections.delete_employee_proj' || '?p_callback=' || p_callback || '&p_net_id=' || p_net_id || '&p_employee_id=' || p_employee_id || '&p_grid_data=' || p_grid_data || '&p_proj_type=' || p_proj_type; owa_util.redirect_url(v_url, TRUE);*/ /* -- Audit this transaction before deleting BEGIN dbms_application_info.set_action( 'Auditing the Salary Projections table @line #' || $$PLSQL_LINE); INSERT INTO fbors_salary_projs_audit (audit_id, audit_net_id, audit_datetime, audit_operation, sequence_id, net_id, employee_id, first_name, last_name, fiscal_year, accounting_period, load_seq, account, summary_account, summary_acct_descr, budget_category, budcategory_descr, fund, org_code, div_code, dept_code, activity, FUNCTION, cost_center, project_id, title_code, title_code_descr, bargaining_unit, pay_begin_date, pay_end_date, rate_code, fte, payrate, calc_payrate, calc_annual_payrate, mod_fte, mod_payrate, calc_mod_payrate, calc_mod_annual_payrate, mod_begin_date, mod_end_date, comments, system_generated, updated_by, updated_on, hrdw_download_date) SELECT fbors_projs_audit_seq.nextval, p_net_id, SYSDATE, 'DELETE', p.* FROM fbors_salary_projs_tbl p WHERE p.sequence_id = v_items(k_SEQ_ID); EXCEPTION WHEN OTHERS THEN v_error_message := fbors_funclib.display_error_info(p_net_id, DBMS_UTILITY.FORMAT_ERROR_STACK, DBMS_UTILITY.FORMAT_ERROR_BACKTRACE, $$PLSQL_UNIT, USERENV('sessionid'), 'json'); htp.p(p_callback || '( { "success":false, "message":"' || fbors_funclib.cleanup4json(v_error_message) || ' ", "totalCount":0 } )') ; ROLLBACK; RETURN; END; */ -- Audit this transaction before DELETing v_return := audit_transaction('fbors_salary_projs_tbl', v_items(k_SEQ_ID), fbors_projs_audit_seq.nextval, p_net_id, 'DELETE'); IF v_return <> 'SUCCESS' THEN htp.p(p_callback || '( { "success":false, "message":"' || fbors_funclib.cleanup4json(v_return) || ' ", "totalCount":0 } )') ; ROLLBACK; RETURN; END IF; dbms_application_info.set_action( 'Deleting from the Salary Projections table @line #' || $$PLSQL_LINE); BEGIN DELETE FROM fbors_salary_projs_tbl p WHERE p.sequence_id = v_items(k_SEQ_ID); EXCEPTION WHEN OTHERS THEN v_error_message := fbors_funclib.display_error_info(p_net_id, DBMS_UTILITY.FORMAT_ERROR_STACK, DBMS_UTILITY.FORMAT_ERROR_BACKTRACE, $$PLSQL_UNIT, USERENV('sessionid'), 'json'); htp.p(p_callback || '( { "success":false, "message":"' || fbors_funclib.cleanup4json(v_error_message) || ' ", "totalCount":0 } )') ; ROLLBACK; RETURN; END; v_sql_rowcount := SQL%ROWCOUNT; COMMIT; /*htp.p(p_callback || '( { "success":true, "message":' || CASE WHEN v_sql_rowcount > 0 THEN ' "Your salaried employee projection has been deleted. ' ELSE ' "Your salaried employee projection was NOT deleted. ' END || ' ",' || '"totalCount": ' || v_sql_rowcount || ' } )') ;*/ END IF; -- IF instr(v_items(k_ADD_MOD), 'M') > 0 THEN COMMIT; -- Get the run time of this procedure v_run_time := to_char((dbms_utility.get_time - v_start_time)/100,'000.00'); htp.p(p_callback || '( { "success":true, "message":' || CASE WHEN v_sql_rowcount > 0 THEN ' "Your projection for salaried employee ' || v_items(k_FIRST_NAME) || ' ' || v_items(k_LAST_NAME) || ' has been saved for ' || fbors_funclib.accounting_period_month_name(v_accounting_period) || ' / ' || v_current_year || '.' ELSE ' "Your projection for salaried employee ' || v_items(k_FIRST_NAME) || ' ' || v_items(k_LAST_NAME) || ' was NOT saved. ' END || v_save_message || ' ",' || ' "totalCount": ' || v_sql_rowcount || ', "runTime": "' || v_run_time || '" } )') ; -- Clean up and reset MODULE and ACTION as we exit. dbms_application_info.set_module( null,null ); -- Not so good :( EXCEPTION WHEN OTHERS THEN v_error_message := fbors_funclib.display_error_info(p_net_id, DBMS_UTILITY.FORMAT_ERROR_STACK, DBMS_UTILITY.FORMAT_ERROR_BACKTRACE, $$PLSQL_UNIT, USERENV('sessionid'), 'json'); htp.p(p_callback || '( { "success":false, "message":"' || fbors_funclib.cleanup4json(v_error_message) || ' ", "totalCount":0 } )') ; ROLLBACK; RETURN; END save_employee_proj; PROCEDURE save_nonsal_proj ( p_callback IN VARCHAR2 DEFAULT NULL, p_net_id IN VARCHAR2 DEFAULT NULL, p_employee_id IN VARCHAR2 DEFAULT NULL, p_proj_type IN VARCHAR2 DEFAULT 'ns', p_grid_data IN VARCHAR2 ) IS /* ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - Procedure : Save NON Salaried Projection Data Author : Larry W, Brian G Created : Rocktober 2012 Purpose : To save projections to the FBORS_NONSALARY_PROJS_TBL table Params : p_grid_data : the list of FORM elements passed as a javasript array into a single parameter here Example : M~1~undefined~BC40~19900~A01369~72~806~806~false~0~268.67~false~5~6~0~false~5~12~System generated.~true~ UC Riverside 2012 ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - */ -- Array positions to parse through p_grid_data -- Example: M~1~undefined~BC40~19900~A01369~72~806~806~false~0~268.67~false~5~6~0~false~5~12~System generated.~true~ k_ADD_MOD CONSTANT INTEGER := 1; k_SEQ_ID CONSTANT INTEGER := 2; k_UNDEFINED CONSTANT INTEGER := 3; k_BUDGET_CATEGORY CONSTANT INTEGER := 4; k_FUND CONSTANT INTEGER := 5; k_ACTIVITY CONSTANT INTEGER := 6; k_FUNCTION CONSTANT INTEGER := 7; k_MOD_AGGREG_AMT CONSTANT INTEGER := 8; k_CALC_AGGREG_AMT CONSTANT INTEGER := 9; k_DIRTY_AGGREG_AMT CONSTANT INTEGER := 10; k_MOD_AVG_PCT CONSTANT INTEGER := 11; K_CALC_ORIG_AVG_AMT CONSTANT INTEGER := 12; k_DIRTY_AVG_PCT CONSTANT INTEGER := 13; k_MOD_PCT_BEGIN_PER CONSTANT INTEGER := 14; k_MOD_PCT_END_PER CONSTANT INTEGER := 15; k_MOD_AVG_AMT CONSTANT INTEGER := 16; k_DIRTY_AVG_AMT CONSTANT INTEGER := 17; k_MOD_AMT_BEGIN_PER CONSTANT INTEGER := 18; k_MOD_AMT_END_PER CONSTANT INTEGER := 19; k_COMMENTS CONSTANT INTEGER := 20; k_DIRTY_COMMENTS CONSTANT INTEGER := 21; v_selected_projection_model VARCHAR2(100) := ''; v_mod_aggreg_amt fbors_nonsalary_projs_tbl.mod_aggreg_amt%TYPE := 0; v_mod_avg_pct fbors_nonsalary_projs_tbl.mod_avg_pct%TYPE := 0; v_mod_avg_amt fbors_nonsalary_projs_tbl.mod_avg_amt%TYPE := 0; v_calc_mod_avg_amt fbors_nonsalary_projs_tbl.calc_mod_avg_amt%TYPE := 0; v_mod_pct_begin_date fbors_nonsalary_projs_tbl.mod_pct_begin_date%TYPE := NULL; v_mod_pct_end_date fbors_nonsalary_projs_tbl.mod_pct_end_date%TYPE := NULL; v_mod_amt_begin_date fbors_nonsalary_projs_tbl.mod_amt_begin_date%TYPE := NULL; v_mod_amt_end_date fbors_nonsalary_projs_tbl.mod_amt_end_date%TYPE := NULL; BEGIN --v_accounting_period := 1; -- debugging dbms_application_info.set_module(module_name => gv_PATH_INFO, action_name => 'STARTING'); v_grid_data := utl_url.unescape(p_grid_data); -- Parse through p_grid_data and determine whether to INSERT a new entry or UPDATE an exisiing one v_items := fbors_funclib.parse_string(p_in_string => v_grid_data, p_delim => '~'); -- Validate the FAU IF fbors_funclib.validate_fau(v_items(k_BUDGET_CATEGORY), v_items(K_ACTIVITY), v_items(K_FUND), v_items(K_FUNCTION)) < 4 THEN htp.p(p_callback || '( { "success":false, "message":"The FAU provided is incorrect. Please review your input, ' || v_items(k_BUDGET_CATEGORY) || ' / ' || v_items(K_ACTIVITY) || ' / ' || v_items(K_FUND) || ' / ' || v_items(K_FUNCTION) || ' and try again. ", "totalCount":0 } )') ; ROLLBACK; RETURN; END IF; -- MODIFY: If this projection was modified... IF instr(v_items(k_ADD_MOD), 'M') > 0 THEN -- Only allow one projection model to be used, if more than 1 was udpated (meaning t for true), then return IF nvl(LENGTH(REGEXP_REPLACE(v_items(k_DIRTY_AGGREG_AMT) || v_items(k_DIRTY_AVG_PCT) || v_items(k_DIRTY_AVG_AMT),'[^t]')), 0) > 1 THEN htp.p(p_callback || '( { "success":false, "message":"You may modify only one projection model at a time. Choose one of the three presented and then press [Save].", "totalCount":0 } )') ; ROLLBACK; RETURN; -- If somehow the periods are blank then return ELSIF v_items(k_MOD_AMT_BEGIN_PER) IS NULL OR v_items(k_MOD_AMT_END_PER) IS NULL OR v_items(k_MOD_PCT_END_PER) IS NULL OR v_items(k_MOD_PCT_END_PER) IS NULL THEN htp.p(p_callback || '( { "success":false, "message":"Neither the Start Month nor the End Month can be empty. Please review the selected months and save again.", "totalCount":0 } )') ; ROLLBACK; RETURN; -- If all three were not modified, (meaning f for false) then return ELSIF nvl(LENGTH(REGEXP_REPLACE(v_items(k_DIRTY_AGGREG_AMT) || v_items(k_DIRTY_AVG_PCT) || v_items(k_DIRTY_AVG_AMT),'[^f]')), 0) = 3 AND v_items(k_DIRTY_COMMENTS) = 'false' THEN htp.p(p_callback || '( { "success":true, "message":"No changes were saved.", "totalCount":0 } )') ; ROLLBACK; RETURN; -- Otherwise, determine which was changed and UPDATE accordingly ELSE /* -- Prevent the modified aggregate amount from exceeding the original amount IF v_items(k_MOD_AGGREG_AMT) > v_items(k_CALC_AGGREG_AMT) THEN htp.p(p_callback || '( { "success":false, "message":"The revised aggregate amount may not exceed the original aggregate amount. Please enter a value less than ' || to_char(v_items(k_CALC_AGGREG_AMT), '$999,999,999.99') || '", "totalCount":0 } )') ; ROLLBACK; RETURN; END if;*/ CASE -- If the aggreg amount was changed WHEN v_items(k_DIRTY_AGGREG_AMT) = 'true' THEN v_selected_projection_model := 'agg'; v_mod_aggreg_amt := v_items(k_MOD_AGGREG_AMT); v_mod_avg_pct := ROUND(v_items(k_MOD_AGGREG_AMT)/v_items(k_CALC_AGGREG_AMT)*100, 2); v_mod_avg_pct := ROUND((v_items(k_MOD_AGGREG_AMT) - v_items(k_CALC_AGGREG_AMT))/v_items(k_CALC_AGGREG_AMT)*100, 2); v_mod_avg_amt := ROUND(v_items(k_MOD_AGGREG_AMT)/v_accounting_period, 2); v_calc_mod_avg_amt := v_mod_avg_amt; -- ROUND(v_items(k_MOD_AGGREG_AMT)/v_accounting_period, 2); -- If the percentage was changed WHEN v_items(k_DIRTY_AVG_PCT) = 'true' THEN v_selected_projection_model := 'pct'; v_mod_avg_pct := v_items(k_MOD_AVG_PCT); -- Changing the percent or average does not change the aggregate, this is a one way change, so the following is commented out -- v_mod_aggreg_amt := ROUND(v_items(k_CALC_AGGREG_AMT)*v_items(k_MOD_AVG_PCT)/100, 2); v_mod_aggreg_amt := v_items(k_MOD_AGGREG_AMT); v_calc_mod_avg_amt := ROUND(v_items(K_CALC_ORIG_AVG_AMT)*v_items(k_MOD_AVG_PCT)/100 + v_items(K_CALC_ORIG_AVG_AMT), 2); v_mod_avg_amt := v_calc_mod_avg_amt; --ROUND(v_mod_aggreg_amt/v_accounting_period, 2); -- ROUND(v_items(k_CALC_AGGREG_AMT)*v_items(k_MOD_AVG_PCT)/v_accounting_period/100, 2); -- v_calc_mod_avg_amt := ROUND(v_items(K_CALC_ORIG_AVG_AMT) * v_items(k_MOD_AVG_PCT)/100, 2); -- If the lump sum amount was changed WHEN v_items(k_DIRTY_AVG_AMT) = 'true' THEN v_selected_projection_model := 'amt'; -- Changing the percent or average does not change the aggregate, this is a one way change, so the following is commented out -- v_mod_aggreg_amt := v_items(k_MOD_AVG_AMT)*v_accounting_period; v_mod_aggreg_amt := v_items(k_MOD_AGGREG_AMT); -- v_mod_avg_pct := ROUND(v_mod_aggreg_amt/v_items(k_CALC_AGGREG_AMT)*100, 2); -- Formula: (new ave value - orig ave value)/orig ave value*100 v_mod_avg_pct := ROUND((v_items(K_CALC_ORIG_AVG_AMT) - v_items(k_MOD_AVG_AMT))/v_items(K_CALC_ORIG_AVG_AMT)*100, 2); -- Take the original aggreg amount DIVIDED BY the current period and ADD the reivised amount v_mod_avg_amt := round(v_items(k_CALC_AGGREG_AMT)/v_accounting_period + v_items(k_MOD_AVG_AMT), 2); v_calc_mod_avg_amt := v_mod_avg_amt; -- If the comments alone were changed, then dont worry about it WHEN v_items(k_DIRTY_COMMENTS) = 'true' THEN NULL; -- What else could happen? ELSE htp.p(p_callback || '( { "success":false, "message":"An unexpected CASE WHEN ELSE was trapped @line #' || $$PLSQL_LINE || '", "totalCount":0 } )') ; ROLLBACK; RETURN; END CASE; END IF; -- IF nvl(LENGTH(REGEXP_REPLACE(v_items(k_DIRTY_AGGREG_AMT) || v_items(k_DIRTY_AVG_PCT) || v_items(k_DIRTY_AVG_AMT),'[^t]')), 0) > 1 THEN -- For Projection Percentages, determine the projection's start / end year IF v_items(k_MOD_PCT_BEGIN_PER) < 7 THEN v_start_month := v_items(k_MOD_PCT_BEGIN_PER) + 6; v_start_year := v_fiscal_year; ELSE v_start_month := v_items(k_MOD_PCT_BEGIN_PER) - 6; v_start_year := v_current_year; END IF; IF v_items(k_MOD_PCT_END_PER) < 7 THEN v_end_month := v_items(k_MOD_PCT_END_PER) + 6; v_end_year := v_fiscal_year; ELSE v_end_month := v_items(k_MOD_PCT_END_PER) - 6; v_end_year := v_current_year; END IF; -- Translate into calendar dates v_mod_pct_begin_date := TO_DATE(v_start_month || '/01/' || v_start_year, 'MM/DD/YYYY'); v_mod_pct_end_date := LAST_DAY(TO_DATE(v_end_month || '/01/' || v_end_year, 'MM/DD/YYYY')); -- For Projection Amounts, determine the projection's start / end year IF v_items(k_MOD_AMT_BEGIN_PER) < 7 THEN v_start_month := v_items(k_MOD_AMT_BEGIN_PER) + 6; v_start_year := v_fiscal_year; ELSE v_start_month := v_items(k_MOD_AMT_BEGIN_PER) - 6; v_start_year := v_current_year; END IF; IF v_items(k_MOD_AMT_END_PER) < 7 THEN v_end_month := v_items(k_MOD_AMT_END_PER) + 6; v_end_year := v_fiscal_year; ELSE v_end_month := v_items(k_MOD_AMT_END_PER) - 6; v_end_year := v_current_year; END IF; v_mod_amt_begin_date := TO_DATE(v_start_month || '/01/' || v_start_year, 'MM/DD/YYYY'); v_mod_amt_end_date := LAST_DAY(TO_DATE(v_end_month || '/01/' || v_end_year, 'MM/DD/YYYY')); BEGIN dbms_application_info.set_action( 'Updating the Non Salary Projections data @line #' || $$PLSQL_LINE ); -- Audit this transaction before updating v_return := audit_transaction('fbors_nonsalary_projs_tbl', v_items(k_SEQ_ID), fbors_projs_audit_seq.nextval, p_net_id, 'UPDATE'); IF v_return <> 'SUCCESS' THEN htp.p(p_callback || '( { "success":false, "message":"' || fbors_funclib.cleanup4json(v_return) || ' ", "totalCount":0 } )') ; ROLLBACK; RETURN; END IF; UPDATE fbors_nonsalary_projs_tbl f SET mod_aggreg_amt = v_mod_aggreg_amt, mod_avg_pct = v_mod_avg_pct, mod_avg_amt = v_mod_avg_amt, calc_mod_avg_amt = v_calc_mod_avg_amt, mod_pct_begin_date = v_mod_pct_begin_date, mod_pct_end_date = v_mod_pct_end_date, system_generated = 'N', updated_by = p_net_id, updated_on = SYSDATE, selected_projection_model = v_selected_projection_model, comments = v_items(k_COMMENTS) WHERE f.sequence_id = v_items(k_SEQ_ID); /*fiscal_year = v_fiscal_year AND accounting_period = v_accounting_period AND budget_category = v_items(k_BUDGET_CATEGORY) AND fund = v_items(k_FUND) AND activity = v_items(k_ACTIVITY) AND function = v_items(k_FUNCTION);*/ EXCEPTION WHEN OTHERS THEN v_error_message := fbors_funclib.display_error_info(p_net_id, DBMS_UTILITY.FORMAT_ERROR_STACK, DBMS_UTILITY.FORMAT_ERROR_BACKTRACE, $$PLSQL_UNIT, USERENV('sessionid'), 'json'); htp.p(p_callback || '( { "success":false, "message":"' || fbors_funclib.cleanup4json(v_error_message) || ' ", "totalCount":0 } )') ; ROLLBACK; RETURN; END ; -- UDPATE v_sql_rowcount := SQL%ROWCOUNT; ELSE htp.p(p_callback || '( { "success":false, "message":"You may not add a new non-salary projection. These are system generated only.", "totalCount":0 } )') ; ROLLBACK; RETURN; END IF; COMMIT; -- Get the run time of this procedure v_run_time := to_char((dbms_utility.get_time - v_start_time)/100,'000.00'); -- Result htp.p(p_callback || '( { "success":true, "message":"Your non-salaried projection for ' || v_items(k_BUDGET_CATEGORY) || ' / ' || v_items(k_ACTIVITY) || ' / ' || v_items(k_FUND) || ' / ' || v_items(k_FUNCTION) || CASE WHEN v_sql_rowcount > 0 THEN ' has been' ELSE ' was NOT' END || ' saved for ' || fbors_funclib.accounting_period_month_name(v_accounting_period) || ' / ' || v_current_year || '.", "runTime": "' || v_run_time || '", "totalCount": ' || v_sql_rowcount || ' } )') ; -- Clean up and reset MODULE and ACTION as we exit. dbms_application_info.set_module( null,null ); EXCEPTION WHEN OTHERS THEN v_error_message := fbors_funclib.display_error_info(p_net_id, DBMS_UTILITY.FORMAT_ERROR_STACK, DBMS_UTILITY.FORMAT_ERROR_BACKTRACE, $$PLSQL_UNIT, USERENV('sessionid'), 'json'); htp.p(p_callback || '( { "success":false, "message":"' || fbors_funclib.cleanup4json(v_error_message) || ' ", "totalCount":0 } )') ; ROLLBACK; RETURN; END save_nonsal_proj; PROCEDURE save_budget_proj( p_callback IN VARCHAR2 DEFAULT NULL, p_net_id IN VARCHAR2 DEFAULT NULL, p_employee_id IN VARCHAR2 DEFAULT NULL, p_proj_type IN VARCHAR2 DEFAULT 'bud', p_grid_data IN VARCHAR2 ) IS /* ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - Procedure : Save Salaried Employees Projection Data Author : Larry W, Brian G Created : July 2012 Purpose : To save projections to the FBORS_SALARY_PROJS_TBL table Params : p_grid_data : the list of FORM elements passed as a javasript array into a single parameter here M~2~undefined~BC25~A01369~19900~72~PERM~Brian's PERM for $10,000~10000~October~June~Brians PERM for $10,000...~ UC Riverside 2012 ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - */ -- Array positions to parse through p_grid_data k_ADD_MOD CONSTANT INTEGER := 1; k_SEQ_ID CONSTANT INTEGER := 2; k_NONE CONSTANT INTEGER := 3; k_BUDGET_CATEGORY CONSTANT INTEGER := 4; k_ACTIVITY CONSTANT INTEGER := 5; k_FUND CONSTANT INTEGER := 6; K_FUNCTION CONSTANT INTEGER := 7; k_LEDGER CONSTANT INTEGER := 8; k_PROJ_DESC CONSTANT INTEGER := 9; K_AMOUNT CONSTANT INTEGER := 10; K_PROJ_START CONSTANT INTEGER := 11; K_PROJ_END CONSTANT INTEGER := 12; K_COMMENTS CONSTANT INTEGER := 13; -- Projection Start and End Dates v_sequence_id fbors_budget_projs_tbl.sequence_id%TYPE; v_start_fiscal_year fbors_budget_projs_tbl.fiscal_year%TYPE; v_start_accounting_period fbors_budget_projs_tbl.accounting_period%TYPE; v_summary_account fbors_salary_projs_tbl.summary_account%TYPE; v_summary_acct_descr fbors_salary_projs_tbl.summary_acct_descr%TYPE; v_budget_category fbors_budget_projs_tbl.budget_category%TYPE; v_budcategory_descr fbors_salary_projs_tbl.budcategory_descr%TYPE; v_pay_begin_date fbors_budget_projs_tbl.proj_begin_date%TYPE; v_pay_end_date fbors_budget_projs_tbl.proj_end_date%TYPE; BEGIN --v_accounting_period := 1; -- debugging dbms_application_info.set_module(module_name => gv_PATH_INFO, action_name => 'STARTING'); v_grid_data := utl_url.unescape(p_grid_data); -- Parse through p_grid_data and determine whether to INSERT a new entry or UPDATE an exisiing one v_items := fbors_funclib.parse_string(p_in_string => v_grid_data, p_delim => '~'); --v_item_count := v_items.COUNT; /* -- Prevent the user from trying to create a projection in the past (should already be done on the front end) IF TO_DATE(v_items(K_PROJ_START)) <= TO_DATE(max_closed_date) THEN htp.p(p_callback || '( { "success":false, "message":"You may not start a projection in a month already closed by Accounting. ", "totalCount":0 } )') ; RETURN; -- Otherwise, get the FY/AP based on the Projection's start date ELSE convert_cal_date_2_fy_ap(TO_DATE(v_items(K_PROJ_START)), v_start_fiscal_year, v_start_accounting_period); END IF; */ -- fbors_funclib.convert_cal_date_2_fy_ap(TO_DATE(v_items(K_PROJ_START), 'Month'), v_start_fiscal_year, v_start_accounting_period); fbors_funclib.convert_cal_date_2_fy_ap(SYSDATE, v_start_fiscal_year, v_start_accounting_period); -- v_default_proj_amt := round(v_items(k_FTE)*v_items(K_PAY_RATE), 2); /* -- Convert the current date into the relevant fiscal year and accounting period v_fiscal_year := fbors_funclib.current_fiscal_year; v_max_closed_date := to_date(fbors_funclib.max_closed_date, 'MM/DD/YYYY'); -- ie: 8/8/2012 for closing July v_last_closed_month := TO_CHAR(TO_DATE(v_max_closed_date, 'DD-MON-YYYY'), 'MM') -1; -- ie: 8-1 so 7 for July v_last_closed_month := 8; -- debugging for other months IF v_last_closed_month > 6 THEN v_accounting_period := v_last_closed_month - 6; ELSE v_accounting_period := v_last_closed_month + 6; END IF; */ -- Determine the projection's start / end year IF EXTRACT(MONTH FROM TO_DATE(v_items(K_PROJ_START), 'MM')) < 7 THEN v_start_year := v_fiscal_year; ELSE v_start_year := v_current_year; END IF; IF EXTRACT(MONTH FROM TO_DATE(v_items(K_PROJ_END), 'MM')) < 7 THEN v_end_year := v_fiscal_year; ELSE v_end_year := v_current_year; END IF; -- Validate the FAU IF fbors_funclib.validate_fau(v_items(k_BUDGET_CATEGORY), v_items(K_ACTIVITY), v_items(K_FUND), v_items(K_FUNCTION)) < 4 THEN htp.p(p_callback || '( { "success":false, "message":"The FAU provided is incorrect. Please review your input, ' || v_items(k_BUDGET_CATEGORY) || ' / ' || v_items(K_ACTIVITY) || ' / ' || v_items(K_FUND) || ' / ' || v_items(K_FUNCTION) || ' and try again. ", "totalCount":0 } )') ; ROLLBACK; RETURN; END IF; -- MODIFY: If this projection was modified... IF instr(v_items(k_ADD_MOD), 'M') > 0 THEN -- Determine the number of months between the start and end date for the annualized projection amount v_months_between := months_between(TO_DATE(v_items(K_PROJ_START) || v_start_year, 'Month YYYY'), LAST_DAY(TO_DATE(v_items(K_PROJ_END) || v_end_year, 'Month YYYY'))); v_budget_category := get_budget_category_fast('UCR',v_items(k_BUDGET_CATEGORY)); BEGIN v_pay_begin_date := to_char( '' || to_char(to_date(v_items(K_PROJ_START),'Month'),'MM') || '/01/' || v_start_year || ''); v_pay_end_date := to_char( '' || to_char(to_date(v_items(K_PROJ_END),'Month'),'MM') || '/01/' || v_end_year || ''); dbms_application_info.set_action( 'Updating the table @line #' || $$PLSQL_LINE); -- Audit this transaction before updating v_return := audit_transaction('fbors_budget_projs_tbl', v_items(k_SEQ_ID), fbors_projs_audit_seq.nextval, p_net_id, 'UPDATE'); IF v_return <> 'SUCCESS' THEN htp.p(p_callback || '( { "success":false, "message":"' || fbors_funclib.cleanup4json(v_return) || ' ", "totalCount":0 } )') ; ROLLBACK; RETURN; END IF; UPDATE fbors_budget_projs_tbl p SET amount = v_items(K_AMOUNT), proj_begin_date = v_pay_begin_date, proj_end_date = to_char(last_day(to_date(v_pay_end_date,'MM/DD/YYYY')),'MM/DD/YYYY'), comments = v_items(K_COMMENTS), updated_by = p_net_id, updated_on = SYSDATE WHERE p.sequence_id = v_items(k_SEQ_ID) /*p.fiscal_year = v_fiscal_year AND p.accounting_period = v_accounting_period AND p.budget_category = v_budget_category AND p.activity = v_items(K_ACTIVITY) AND p.fund = v_items(K_FUND) AND p.function = v_items(K_FUNCTION)*/ ; v_sql_rowcount := SQL%ROWCOUNT; EXCEPTION WHEN OTHERS THEN v_error_message := fbors_funclib.display_error_info(p_net_id, DBMS_UTILITY.FORMAT_ERROR_STACK, DBMS_UTILITY.FORMAT_ERROR_BACKTRACE, $$PLSQL_UNIT, USERENV('sessionid'), 'json'); htp.p(p_callback || '( { "success":false, "message":"' || fbors_funclib.cleanup4json(v_error_message) || ' ", "totalCount":0 } )') ; ROLLBACK; RETURN; END; -- ADD: Insert a new projection ELSIF instr(v_items(k_ADD_MOD), 'A') > 0 THEN -- Validate the FAU IF fbors_funclib.validate_fau(v_items(k_BUDGET_CATEGORY), v_items(K_ACTIVITY), v_items(K_FUND), v_items(K_FUNCTION)) = 0 THEN htp.p(p_callback || '( { "success":false, "message":"The FAU provided is incorrect. ", "totalCount":0 } )') ; ROLLBACK; RETURN; END IF; -- Get the higher level Account values for easier querying on the Summary / Detail reports BEGIN SELECT DISTINCT a.ucr_acct_sum, a.ucr_acct_sum_dsc, a.ucr_acct_bdgt, a.ucr_acct_bdgt_dsc INTO v_summary_account, v_summary_acct_descr, v_budget_category, v_budcategory_descr FROM ps_ucr_acct_lv_tbl a WHERE a.ucr_acct_bdgt = upper(v_items(k_BUDGET_CATEGORY)); EXCEPTION WHEN OTHERS THEN htp.p(p_callback || '( { "success":false, "message":"An invalid Account was provided. Please select an Account from the list provided and try saving your projection again.", "totalCount":0 } )') ; ROLLBACK; RETURN; END; -- Get the employees's activity denormalized information -- get_actv_denorm_tree_values(v_items(K_ACTIVITY), v_activity_denorm_tree_row, v_result); get_actv_denorm_tree_values(v_items(K_ACTIVITY), v_activity_denorm_tree_values, v_result); IF v_result IS NOT NULL THEN htp.p(p_callback || '( { "success":false, "message":"' || v_result || ' ", "totalCount":0 } )') ; ROLLBACK; RETURN; END IF; v_pay_begin_date := to_char( '' || to_char(to_date(v_items(K_PROJ_START),'Month'),'MM') || '/01/' || v_start_year || ''); v_pay_end_date := to_char( '' || to_char(to_date(v_items(K_PROJ_END),'Month'),'MM') || '/01/' || v_end_year || ''); --v_pay_begin_date := TO_DATE(to_char(TO_DATE(v_items(K_PROJ_START), 'Month'), 'MM') || '01/' || v_current_year, 'MM/DD/YYYY'); --v_pay_end_date := last_day(TO_DATE(to_char(TO_DATE(v_items(K_PROJ_START), 'Month'), 'MM') || '01/' || v_current_year, 'MM/DD/YYYY')); -- The actual INSERT INTO BEGIN dbms_application_info.set_action( 'Inserting the data @line #'|| $$PLSQL_LINE ); v_seq_nextval := fbors_budget_projs_seq.nextval; INSERT INTO fbors_budget_projs_tbl (sequence_id, fiscal_year, accounting_period, ledger, descr, budget_category, fund, org_code, div_code, dept_code, activity, function, amount, proj_begin_date, proj_end_date, comments, updated_by, updated_on) VALUES (v_seq_nextval, v_fiscal_year, v_accounting_period, v_items(K_LEDGER), v_items(k_PROJ_DESC), v_budget_category, v_items(K_FUND), v_activity_denorm_tree_values.org_code, v_activity_denorm_tree_values.div_code, v_activity_denorm_tree_values.dept_code, upper(v_items(K_ACTIVITY)), v_items(K_FUNCTION), v_items(K_AMOUNT), v_pay_begin_date, to_char(last_day(to_date(v_pay_end_date,'MM/DD/YYYY')),'MM/DD/YYYY'), -- to_char(v_pay_begin_date,'MM/DD/YYYY'), to_char(v_pay_end_date,'MM/DD/YYYY'), v_items(K_COMMENTS), p_net_id, SYSDATE); v_sql_rowcount := SQL%ROWCOUNT; -- If there were any rows inserted, update their sequence ID IF v_sql_rowcount > 0 THEN -- Now update the sequence id. Is there a better to do this? UPDATE fbors_budget_projs_tbl p SET p.sequence_id = fbors_budget_projs_seq.nextval WHERE p.sequence_id = -1; END IF; -- IF v_sql_rowcount > 0 THEN EXCEPTION WHEN OTHERS THEN v_error_message := fbors_funclib.display_error_info(p_net_id, DBMS_UTILITY.FORMAT_ERROR_STACK, DBMS_UTILITY.FORMAT_ERROR_BACKTRACE, $$PLSQL_UNIT, USERENV('sessionid'), 'json'); htp.p(p_callback || '( { "success":false, "message":"' || fbors_funclib.cleanup4json(v_error_message) || ' ", "totalCount":0 } )') ; ROLLBACK; RETURN; END; -- Audit this transaction after INSERTing v_return := audit_transaction('fbors_budget_projs_tbl', v_seq_nextval, fbors_projs_audit_seq.nextval, p_net_id, 'INSERT'); IF v_return <> 'SUCCESS' THEN htp.p(p_callback || '( { "success":false, "message":"' || fbors_funclib.cleanup4json(v_return) || ' ", "totalCount":0 } )') ; ROLLBACK; RETURN; END IF; END IF; -- IF instr(v_items(k_ADD_MOD), 'M') > 0 THEN COMMIT; check_activity_in_eacs(UPPER(v_items(K_ACTIVITY)), p_net_id, v_result); v_save_message := v_save_message || v_result; -- Get the run time of this procedure v_run_time := to_char((dbms_utility.get_time - v_start_time)/100,'000.00'); -- Result htp.p(p_callback || '( { "success":true, "message":"Your budget projection for ' || v_items(k_BUDGET_CATEGORY) || ' / ' || v_items(k_ACTIVITY) || ' / ' || v_items(k_FUND) || ' / ' || v_items(k_FUNCTION) || CASE WHEN v_sql_rowcount > 0 THEN ' has been' ELSE ' was NOT' END || ' saved for ' || fbors_funclib.accounting_period_month_name(v_accounting_period) || ' / ' || v_current_year || '.' || v_save_message || '", "runTime": "' || v_run_time || '", "totalCount": ' || v_sql_rowcount || ' } )') ; -- Clean up and reset MODULE and ACTION as we exit. dbms_application_info.set_module( null,null ); -- Not so good :( EXCEPTION WHEN OTHERS THEN v_error_message := fbors_funclib.display_error_info(p_net_id, DBMS_UTILITY.FORMAT_ERROR_STACK, DBMS_UTILITY.FORMAT_ERROR_BACKTRACE, $$PLSQL_UNIT, USERENV('sessionid'), 'json'); htp.p(p_callback || '( { "success":false, "message":"' || fbors_funclib.cleanup4json(v_error_message) || ' ", "totalCount":0 } )') ; ROLLBACK; RETURN; END save_budget_proj; PROCEDURE save_benefit_proj( p_callback IN VARCHAR2 DEFAULT NULL, p_net_id IN VARCHAR2 DEFAULT NULL, p_employee_id IN VARCHAR2 DEFAULT NULL, p_proj_type IN VARCHAR2 DEFAULT 'ben', p_grid_data IN VARCHAR2 ) IS /* ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - Procedure : Save Salaried Employees Projection Data Author : Larry W, Brian G Created : July 2012 Purpose : To save projections to the FBORS_SALARY_PROJS_TBL table Params : p_grid_data : the list of FORM elements passed as a javasript array into a single parameter here M~2~alanr~856788673~ALAN~ROY~7277~0.25~1500~July~January~Updated projection for Alan July - January~500110~A01369~66095~72 A~-1~~BR~GR~3074~1~1500~September~September~Added by Brian~500110~A01375~19900~72 UC Riverside 2012 ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - */ -- M~1~undefined~BC25~555.91~July~June~System generated test~500110~18083~A01370~43 -- Array positions to parse through p_grid_data k_ADD_MOD CONSTANT INTEGER := 1; k_SEQ_ID CONSTANT INTEGER := 2; k_UNDEFINED CONSTANT INTEGER := 3; k_BUDGET_CATEGORY CONSTANT INTEGER := 4; K_AMOUNT CONSTANT INTEGER := 5; /*k_NET_ID CONSTANT INTEGER := 3; k_EMPL_ID CONSTANT INTEGER := 4; k_FIRST_NAME CONSTANT INTEGER := 5; k_LAST_NAME CONSTANT INTEGER := 6; k_TITLE_CODE CONSTANT INTEGER := 7; k_FTE CONSTANT INTEGER := 8; K_PAY_RATE CONSTANT INTEGER := 9;*/ K_PROJ_START CONSTANT INTEGER := 6; K_PROJ_END CONSTANT INTEGER := 7; K_COMMENTS CONSTANT INTEGER := 8; K_ACCOUNT CONSTANT INTEGER := 9; K_FUND CONSTANT INTEGER := 10; K_ACTIVITY CONSTANT INTEGER := 11; K_FUNCTION CONSTANT INTEGER := 12; -- Projection Start and End Dates v_start_fiscal_year fbors_salary_projs_tbl.fiscal_year%TYPE; v_start_accounting_period fbors_salary_projs_tbl.accounting_period%TYPE; --v_end_fiscal_year fbors_salary_projs_tbl.fiscal_year%TYPE; --v_end_accounting_period fbors_salary_projs_tbl.accounting_period%TYPE; v_summary_account fbors_salary_projs_tbl.summary_account%TYPE; v_summary_acct_descr fbors_salary_projs_tbl.summary_acct_descr%TYPE; v_budget_category fbors_salary_projs_tbl.budget_category%TYPE; v_budcategory_descr fbors_salary_projs_tbl.budcategory_descr%TYPE; --v_title_code_descr vw_title_codes_appt.title_code_descr%TYPE; v_pay_begin_date fbors_salary_projs_tbl.pay_begin_date%TYPE; v_pay_end_date fbors_salary_projs_tbl.pay_end_date%TYPE; -- v_sql VARCHAR2(32000); BEGIN --v_accounting_period := 1; -- debugging dbms_application_info.set_module(module_name => gv_PATH_INFO, action_name => 'STARTING'); v_grid_data := utl_url.unescape(p_grid_data); -- Parse through p_grid_data and determine whether to INSERT a new entry or UPDATE an exisiing one v_items := fbors_funclib.parse_string(p_in_string => v_grid_data, p_delim => '~'); --v_item_count := v_items.COUNT; /* -- Prevent the user from trying to create a projection in the past (should already be done on the front end) IF TO_DATE(v_items(K_PROJ_START)) <= TO_DATE(max_closed_date) THEN htp.p(p_callback || '( { "success":false, "message":"You may not start a projection in a month already closed by Accounting. ", "totalCount":0 } )') ; RETURN; -- Otherwise, get the FY/AP based on the Projection's start date ELSE convert_cal_date_2_fy_ap(TO_DATE(v_items(K_PROJ_START)), v_start_fiscal_year, v_start_accounting_period); END IF; */ -- fbors_funclib.convert_cal_date_2_fy_ap(TO_DATE(v_items(K_PROJ_START), 'Month'), v_start_fiscal_year, v_start_accounting_period); fbors_funclib.convert_cal_date_2_fy_ap(SYSDATE, v_start_fiscal_year, v_start_accounting_period); -- v_default_proj_amt := round(v_items(k_FTE)*v_items(K_PAY_RATE), 2); /* -- Convert the current date into the relevant fiscal year and accounting period v_fiscal_year := fbors_funclib.current_fiscal_year; v_max_closed_date := to_date(fbors_funclib.max_closed_date, 'MM/DD/YYYY'); -- ie: 8/8/2012 for closing July v_last_closed_month := TO_CHAR(TO_DATE(v_max_closed_date, 'DD-MON-YYYY'), 'MM') -1; -- ie: 8-1 so 7 for July v_last_closed_month := 8; -- debugging for other months IF v_last_closed_month > 6 THEN v_accounting_period := v_last_closed_month - 6; ELSE v_accounting_period := v_last_closed_month + 6; END IF; */ -- Determine the projection's start / end year IF EXTRACT(MONTH FROM TO_DATE(v_items(K_PROJ_START), 'MM')) < 7 THEN v_start_year := v_fiscal_year; ELSE v_start_year := v_current_year; END IF; IF EXTRACT(MONTH FROM TO_DATE(v_items(K_PROJ_END), 'MM')) < 7 THEN v_end_year := v_fiscal_year; ELSE v_end_year := v_current_year; END IF; -- Validate the FAU IF fbors_funclib.validate_fau(v_items(K_ACCOUNT), v_items(K_ACTIVITY), v_items(K_FUND), v_items(K_FUNCTION)) < 4 THEN htp.p(p_callback || '( { "success":false, "message":"The FAU provided is incorrect. Please review your input, ' || v_items(K_ACCOUNT) || ' / ' || v_items(K_ACTIVITY) || ' / ' || v_items(K_FUND) || ' / ' || v_items(K_FUNCTION) || ' and try again. ", "totalCount":0 } )') ; ROLLBACK; RETURN; END IF; -- MODIFY: If this projection was modified... IF instr(v_items(k_ADD_MOD), 'M') > 0 THEN -- Determine the number of months between the start and end date for the annualized projection amount --v_months_between := months_between(TO_DATE(v_items(K_PROJ_START) || v_start_year, 'Month YYYY'), LAST_DAY(TO_DATE(v_items(K_PROJ_END) || v_end_year, 'Month YYYY'))); BEGIN v_pay_begin_date := TO_DATE(v_items(K_PROJ_START) || '/' || '01/' || v_start_year, 'MM/DD/YYYY'); v_pay_end_date := last_day(TO_DATE(v_items(K_PROJ_END) || '/' || '01/' || v_end_year, 'MM/DD/YYYY')); --v_pay_begin_date := TO_DATE(to_char(TO_DATE(v_items(K_PROJ_START), 'Month'), 'MM') || '01/' || v_start_year, 'MM/DD/YYYY'); --v_pay_end_date := last_day(TO_DATE(to_char(TO_DATE(v_items(K_PROJ_END), 'Month'), 'MM') || '01/' || v_end_year, 'MM/DD/YYYY')); --v_pay_begin_date := to_char( '' || to_char(to_date(v_items(K_PROJ_START),'Month'),'MM') || '/01/' || v_start_year || ''); --v_pay_end_date := to_char( '' || to_char(to_date(v_items(K_PROJ_END),'Month'),'MM') || '/01/' || v_end_year || ''); dbms_output.put_line(v_pay_begin_date); dbms_output.put_line(v_pay_end_date); --RETURN; v_sql := 'UPDATE fbors_benefits_projs_tbl p SET mod_total_benefits_amt = ' || v_items(k_AMOUNT) || ', mod_begin_date = to_date(''' || v_pay_begin_date || ''',''MM/DD/YYYY''), mod_end_date = to_date(''' || v_pay_end_date || ''',''MM/DD/YYYY''), comments = ' || v_items(K_COMMENTS) || ', system_generated = ''N'', updated_by = ''' || p_net_id || ''', updated_on = SYSDATE WHERE p.sequence_id = ''' || v_items(k_SEQ_ID) || ''' --p.fiscal_year = ' || v_fiscal_year || ' --AND p.accounting_period = ' || v_accounting_period || ' --AND p.budget_category = ''' || v_items(K_ACCOUNT) || ''' --AND p.activity = ''' || v_items(K_ACTIVITY) || ''' --AND p.fund = ''' || v_items(K_FUND) || ''' --AND p.function = ''' || v_items(K_FUNCTION) || ''''; dbms_output.put_line(v_sql); -- RETURN; dbms_application_info.set_action( 'Updating the table @line #' || $$PLSQL_LINE); -- Audit this transaction before updating v_return := audit_transaction('fbors_benefits_projs_tbl', v_items(k_SEQ_ID), fbors_projs_audit_seq.nextval, p_net_id, 'UPDATE'); IF v_return <> 'SUCCESS' THEN htp.p(p_callback || '( { "success":false, "message":"' || fbors_funclib.cleanup4json(v_return) || ' ", "totalCount":0 } )') ; ROLLBACK; RETURN; END IF; UPDATE fbors_benefits_projs_tbl p SET mod_total_benefits_amt = v_items(k_AMOUNT), mod_begin_date = v_pay_begin_date, mod_end_date = v_pay_end_date, comments = v_items(K_COMMENTS), system_generated = 'N', updated_by = p_net_id, updated_on = SYSDATE WHERE p.sequence_id = v_items(k_SEQ_ID) /*p.fiscal_year = v_fiscal_year AND p.accounting_period = v_accounting_period AND p.budget_category = v_items(K_ACCOUNT) AND p.activity = v_items(K_ACTIVITY) AND p.fund = v_items(K_FUND) AND p.function = v_items(K_FUNCTION)*/ ; v_sql_rowcount := SQL%ROWCOUNT; EXCEPTION WHEN OTHERS THEN v_error_message := fbors_funclib.display_error_info(p_net_id, DBMS_UTILITY.FORMAT_ERROR_STACK, DBMS_UTILITY.FORMAT_ERROR_BACKTRACE, $$PLSQL_UNIT, USERENV('sessionid'), 'json'); htp.p(p_callback || '( { "success":false, "message":"' || fbors_funclib.cleanup4json(v_error_message) || ' ", "totalCount":0 } )') ; ROLLBACK; RETURN; END; -- ADD: Insert a new projection ELSIF instr(v_items(k_ADD_MOD), 'A') > 0 THEN -- Validate the FAU IF fbors_funclib.validate_fau(v_items(K_ACCOUNT), v_items(K_ACTIVITY), v_items(K_FUND), v_items(K_FUNCTION)) = 0 THEN htp.p(p_callback || '( { "success":false, "message":"The FAU provided is incorrect. ", "totalCount":0 } )') ; ROLLBACK; RETURN; END IF; /* -- Prevent 0 amounts for new additions IF ( v_items(k_FTE) = 0 ) OR ( v_items(K_PAY_RATE) = 0 ) THEN htp.p(p_callback || '( { "success":false, "message":"Neither the FTE nor the Pay Rate can be 0 for new projections. Please review the projection data before continuing. ", "totalCount":0 } )') ; ROLLBACK; RETURN; END IF;*/ -- Get the higher level Account values for easier querying on the Summary / Detail reports BEGIN SELECT DISTINCT a.ucr_acct_sum, a.ucr_acct_sum_dsc, a.ucr_acct_bdgt, a.ucr_acct_bdgt_dsc INTO v_summary_account, v_summary_acct_descr, v_budget_category, v_budcategory_descr FROM ps_ucr_acct_lv_tbl a WHERE a.ucr_acct_bdgt = v_items(k_BUDGET_CATEGORY); EXCEPTION WHEN OTHERS THEN htp.p(p_callback || '( { "success":false, "message":"An invalid Account was provided. Please select an Account from the list provided and try saving your projection again.", "totalCount":0 } )') ; ROLLBACK; RETURN; END; /* -- Get the Title Code description BEGIN SELECT DISTINCT tc.title_code_descr INTO v_title_code_descr FROM vw_title_codes_appt tc WHERE tc.title_code= v_items(k_TITLE_CODE); EXCEPTION WHEN OTHERS THEN htp.p(p_callback || '( { "success":false, "message":"An invalid Title Code was provided. Please select a Title Code from the list provided and try saving your projection again.", "totalCount":0 } )') ; ROLLBACK; RETURN; END; */ -- Get the employees's activity denormalized information -- get_actv_denorm_tree_values(v_items(K_ACTIVITY), v_org_code, v_div_code, v_dept_code, v_result); get_actv_denorm_tree_values(v_items(K_ACTIVITY), v_activity_denorm_tree_values, v_result); IF v_result IS NOT NULL THEN htp.p(p_callback || '( { "success":false, "message":"' || v_result || ' ", "totalCount":0 } )') ; ROLLBACK; RETURN; END IF; /* -- Get the employees's activity denormalized information BEGIN SELECT DISTINCT a.ucr_org, a.ucr_div, a.ucr_dept INTO v_org_code, v_div_code, v_dept_code FROM rpt_user.ps_ucr_actv_lv_tbl a WHERE a.ucr_actv = v_items(K_ACTIVITY); EXCEPTION WHEN OTHERS THEN v_error_message := fbors_funclib.display_error_info(p_net_id, DBMS_UTILITY.FORMAT_ERROR_STACK, DBMS_UTILITY.FORMAT_ERROR_BACKTRACE, $$PLSQL_UNIT, 'json'); htp.p(p_callback || '( { "success":false, "message":"' || fbors_funclib.cleanup4json(v_error_message) || ' ", "totalCount":0 } )') ; ROLLBACK; RETURN; END ;*/ dbms_output.put_line(v_start_year); -- dbms_output.put_line(TO_DATE(to_char(TO_DATE(v_items(K_PROJ_START), 'Month'), 'MM') || '01/' || v_start_year, 'MM/DD/YYYY')); -- dbms_output.put_line(last_day(TO_DATE(to_char(TO_DATE(v_items(K_PROJ_END), 'Month'), 'MM') || '01/' || v_end_year, 'MM/DD/YYYY'))); v_pay_begin_date := TO_DATE(to_char(TO_DATE(v_items(K_PROJ_START), 'Month'), 'MM') || '01/' || v_start_year, 'MM/DD/YYYY'); v_pay_end_date := last_day(TO_DATE(to_char(TO_DATE(v_items(K_PROJ_END), 'Month'), 'MM') || '01/' || v_end_year, 'MM/DD/YYYY')); --v_pay_begin_date := to_char( '' || to_char(to_date(v_items(K_PROJ_START),'Month'),'MM') || '/01/' || v_start_year || ''); --v_pay_end_date := to_char( '' || to_char(to_date(v_items(K_PROJ_END),'Month'),'MM') || '/01/' || v_end_year || ''); -- The actual INSERT INTO BEGIN dbms_application_info.set_action( 'Inserting the data @line #'|| $$PLSQL_LINE ); v_seq_nextval := fbors_benefits_projs_seq.nextval; INSERT INTO fbors_benefits_projs_tbl (sequence_id, fiscal_year, accounting_period, summary_account, summary_acct_descr, budget_category, budcategory_descr, account, account_descr, org_code, div_code, dept_code, activity, fund, function, total_benefits_amt, begin_date, end_date, mod_total_benefits_amt, mod_begin_date, mod_end_date, comments, system_generated, updated_by, updated_on, download_date) VALUES (v_seq_nextval, v_fiscal_year, v_accounting_period, v_summary_account, v_summary_acct_descr, v_items(k_BUDGET_CATEGORY), get_budget_category_fast('UCR',v_items(k_BUDGET_CATEGORY)), v_items(K_ACCOUNT), get_account_desc_fast(v_items(K_ACCOUNT)), v_activity_denorm_tree_values.org_code, v_activity_denorm_tree_values.div_code, v_activity_denorm_tree_values.dept_code, v_items(K_ACTIVITY),v_items(K_FUND), v_items(K_FUNCTION), v_items(K_AMOUNT), v_pay_begin_date, v_pay_end_date, v_items(K_AMOUNT), v_pay_begin_date, v_pay_end_date, v_items(k_COMMENTS), 'N', p_net_id, SYSDATE, NULL); v_sql_rowcount := SQL%ROWCOUNT; EXCEPTION WHEN OTHERS THEN v_error_message := fbors_funclib.display_error_info(p_net_id, DBMS_UTILITY.FORMAT_ERROR_STACK, DBMS_UTILITY.FORMAT_ERROR_BACKTRACE, $$PLSQL_UNIT, USERENV('sessionid'), 'json'); htp.p(p_callback || '( { "success":false, "message":"' || fbors_funclib.cleanup4json(v_error_message) || ' ", "totalCount":0 } )') ; ROLLBACK; RETURN; END; -- Audit this transaction after INSERTing v_return := audit_transaction('fbors_benefits_projs_tbl', v_seq_nextval, fbors_projs_audit_seq.nextval, p_net_id, 'INSERT'); IF v_return <> 'SUCCESS' THEN htp.p(p_callback || '( { "success":false, "message":"' || fbors_funclib.cleanup4json(v_return) || ' ", "totalCount":0 } )') ; ROLLBACK; RETURN; END IF; END IF; -- IF instr(v_items(k_ADD_MOD), 'M') > 0 THEN COMMIT; -- Get the run time of this procedure v_run_time := to_char((dbms_utility.get_time - v_start_time)/100,'000.00'); -- Result htp.p(p_callback || '( { "success":true, "message":"Your benefit projection for ' || v_items(K_ACCOUNT) || ' / ' || v_items(k_ACTIVITY) || ' / ' || v_items(k_FUND) || ' / ' || v_items(k_FUNCTION) || CASE WHEN v_sql_rowcount > 0 THEN ' has been' ELSE ' was NOT' END || ' saved for ' || fbors_funclib.accounting_period_month_name(v_accounting_period) || ' / ' || v_current_year || '.", "runTime": "' || v_run_time || '", "totalCount": ' || v_sql_rowcount || ' } )') ; -- Clean up and reset MODULE and ACTION as we exit. dbms_application_info.set_module( null,null ); -- Not so good :( EXCEPTION WHEN OTHERS THEN v_error_message := fbors_funclib.display_error_info(p_net_id, DBMS_UTILITY.FORMAT_ERROR_STACK, DBMS_UTILITY.FORMAT_ERROR_BACKTRACE, $$PLSQL_UNIT, USERENV('sessionid'), 'json'); htp.p(p_callback || '( { "success":false, "message":"' || fbors_funclib.cleanup4json(v_error_message) || ' ", "totalCount":0 } )') ; ROLLBACK; RETURN; END save_benefit_proj; PROCEDURE delete_data( p_callback IN VARCHAR2 DEFAULT NULL, p_net_id IN VARCHAR2 DEFAULT NULL, p_employee_id IN VARCHAR2 DEFAULT NULL, p_proj_type IN VARCHAR2, p_grid_data IN VARCHAR2 ) IS /* ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - Procedure : Delete Projection Data Author : Larry W, Brian G Created : Yesember 2012 Purpose : To redirect and then delete user-created projections based on the Projection type. This only applies to Salary / Hourly / Budget projections Params : p_grid_data : D~7350~~~~~~~~~~~~~~ p_employee_id : 850165183 p_proj_type : se, he, nse, ben, bud UC Riverside 2012 ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - */ BEGIN -- Switch to the appropriate procedure to delete the projection v_url := gk_APPLICATION_URL || 'fbors_projections.' || CASE p_proj_type -- Non salaried employees -- WHEN 'ns' THEN 'delete_nonsal_proj' -- Benefits -- WHEN 'ben' THEN 'delete_benefit_proj' -- Budgets WHEN 'bud' THEN 'delete_budget_proj' -- Salary employees / Hourly employees ELSE --'save_data' 'delete_employee_proj' END || '?p_callback=' || p_callback || '&p_net_id=' || p_net_id || '&p_employee_id=' || p_employee_id || '&p_grid_data=' || p_grid_data || '&p_proj_type=' || p_proj_type; owa_util.redirect_url(v_url, TRUE); EXCEPTION WHEN OTHERS THEN v_error_message := fbors_funclib.display_error_info(p_net_id, DBMS_UTILITY.FORMAT_ERROR_STACK, DBMS_UTILITY.FORMAT_ERROR_BACKTRACE, $$PLSQL_UNIT, USERENV('sessionid'), 'json'); htp.p(p_callback || '( { "success":false, "message":"' || fbors_funclib.cleanup4json(v_error_message) || ' ", "totalCount":0 } )') ; RETURN; END delete_data; /*PROCEDURE delete_employee_proj( p_callback IN VARCHAR2 DEFAULT NULL, p_net_id IN VARCHAR2 DEFAULT NULL, p_employee_id IN VARCHAR2 DEFAULT NULL, p_proj_type IN VARCHAR2 DEFAULT 'se', p_grid_data IN VARCHAR2 ) IS \* ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - Procedure : Delete Salaried Employees Projection row Author : Larry W, Brian G Created : July 2012 Purpose : To delete a projection from the FBORS_SALARY_PROJS_TBL table Params : UC Riverside 2012 ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - *\ v_items fbors_funclib.tv_data; -- Array positions to parse through p_grid_data k_DEL CONSTANT INTEGER := 1; k_SEQ_ID CONSTANT INTEGER := 2; BEGIN dbms_application_info.set_module(module_name => gv_PATH_INFO, action_name => 'STARTING'); v_grid_data := utl_url.unescape(p_grid_data); v_items := fbors_funclib.parse_string(p_in_string => v_grid_data, p_delim => '~'); -- DELETE: If this projection is to be deleted IF instr(v_items(k_DEL), 'D') > 0 THEN -- Audit this transaction before deleting BEGIN dbms_application_info.set_action( 'Auditing the Salary Projections table @line #' || $$PLSQL_LINE); INSERT INTO fbors_salary_projs_audit (audit_id, audit_net_id, audit_datetime, audit_operation, sequence_id, net_id, employee_id, first_name, last_name, fiscal_year, accounting_period, load_seq, account, summary_account, summary_acct_descr, budget_category, budcategory_descr, fund, org_code, div_code, dept_code, activity, FUNCTION, cost_center, project_id, title_code, title_code_descr, bargaining_unit, pay_begin_date, pay_end_date, rate_code, fte, payrate, calc_payrate, calc_annual_payrate, mod_fte, mod_payrate, calc_mod_payrate, calc_mod_annual_payrate, mod_begin_date, mod_end_date, comments, system_generated, updated_by, updated_on, hrdw_download_date) SELECT fbors_projs_audit_seq.nextval, p_net_id, SYSDATE, 'DELETE', p.* FROM fbors_salary_projs_tbl p WHERE p.sequence_id = v_items(k_SEQ_ID); EXCEPTION WHEN OTHERS THEN v_error_message := fbors_funclib.display_error_info(p_net_id, DBMS_UTILITY.FORMAT_ERROR_STACK, DBMS_UTILITY.FORMAT_ERROR_BACKTRACE, $$PLSQL_UNIT, USERENV('sessionid'), 'json'); htp.p(p_callback || '( { "success":false, "message":"' || fbors_funclib.cleanup4json(v_error_message) || ' ", "totalCount":0 } )') ; ROLLBACK; RETURN; END; dbms_application_info.set_action( 'Deleting from the Salary Projections table @line #' || $$PLSQL_LINE); DELETE FROM fbors_salary_projs_tbl p WHERE p.sequence_id = v_items(k_SEQ_ID); v_sql_rowcount := SQL%ROWCOUNT; COMMIT; htp.p(p_callback || '( { "success":true, "message":' || CASE WHEN v_sql_rowcount > 0 THEN ' "Your salaried employee projection has been deleted. ' ELSE ' "Your salaried employee projection was NOT deleted. ' END || ' ",' || '"totalCount": ' || v_sql_rowcount || ' } )') ; -- Clean up and reset MODULE and ACTION as we exit. dbms_application_info.set_module( null,null ); END IF; EXCEPTION WHEN OTHERS THEN v_error_message := fbors_funclib.display_error_info(p_net_id, DBMS_UTILITY.FORMAT_ERROR_STACK, DBMS_UTILITY.FORMAT_ERROR_BACKTRACE, $$PLSQL_UNIT, USERENV('sessionid'), 'json'); htp.p(p_callback || '( { "success":false, "message":"' || fbors_funclib.cleanup4json(v_error_message) || ' ", "totalCount":0 } )') ; ROLLBACK; RETURN; END delete_employee_proj;*/ PROCEDURE delete_budget_proj( p_callback IN VARCHAR2 DEFAULT NULL, p_net_id IN VARCHAR2 DEFAULT NULL, p_employee_id IN VARCHAR2 DEFAULT NULL, p_proj_type IN VARCHAR2 DEFAULT 'bud', p_grid_data IN VARCHAR2 ) IS /* ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - Procedure : Delete Non Salaried Projection row Author : Larry W, Brian G Created : July 2012 Purpose : To delete a projection from the FBORS_NONSALARY_PROJS_TBL table Params : UC Riverside 2012 ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - */ v_items fbors_funclib.tv_data; -- Array positions to parse through p_grid_data k_DEL CONSTANT INTEGER := 1; k_SEQ_ID CONSTANT INTEGER := 2; BEGIN dbms_application_info.set_module(module_name => gv_PATH_INFO, action_name => 'STARTING'); v_grid_data := utl_url.unescape(p_grid_data); v_items := fbors_funclib.parse_string(p_in_string => v_grid_data, p_delim => '~'); -- DELETE: If this projection is to be deleted IF instr(v_items(k_DEL), 'D') > 0 THEN dbms_application_info.set_action( 'Deleting from the Salary Projections table @line #' || $$PLSQL_LINE); DELETE FROM fbors_budget_projs_tbl p WHERE p.sequence_id = v_items(k_SEQ_ID); v_sql_rowcount := SQL%ROWCOUNT; COMMIT; htp.p(p_callback || '( { "success":true, "message":' || CASE WHEN v_sql_rowcount > 0 THEN ' "Your budget projection has been deleted. ' ELSE ' "Your budget projection was NOT deleted. ' END || ' ",' || '"totalCount": ' || v_sql_rowcount || ' } )') ; -- Clean up and reset MODULE and ACTION as we exit. dbms_application_info.set_module( null,null ); END IF; EXCEPTION WHEN OTHERS THEN v_error_message := fbors_funclib.display_error_info(p_net_id, DBMS_UTILITY.FORMAT_ERROR_STACK, DBMS_UTILITY.FORMAT_ERROR_BACKTRACE, $$PLSQL_UNIT, USERENV('sessionid'), 'json'); htp.p(p_callback || '( { "success":false, "message":"' || fbors_funclib.cleanup4json(v_error_message) || ' ", "totalCount":0 } )') ; ROLLBACK; RETURN; END delete_budget_proj; /* ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - Main ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - ~ - */ BEGIN -- Get the current time case you want to determine the run time v_start_time := dbms_utility.get_time; -- If we're running a Test of the package, then the path info would be NULL IF gv_PATH_INFO IS NULL THEN gv_PATH_INFO := 'via PLSQL Developer' ; END IF; -- Get the Closing window's number of days SELECT * INTO v_app_settings FROM app_settings a WHERE a.name = 'fbors'; -- Convert the current date into the relevant fiscal year and accounting period v_fiscal_year := fbors_funclib.current_fiscal_year; v_max_closed_date := to_date(fbors_funclib.max_closed_date, 'MM/DD/YYYY'); -- ie: 8/8/2012 for closing July -- If the current date is between the Closing date and Closing Date + 5 days IF trunc(SYSDATE) BETWEEN v_max_closed_date AND (v_max_closed_date + v_app_settings.closing_window) THEN v_last_closed_month := TO_CHAR(TO_DATE(v_max_closed_date, 'DD-MON-YYYY'), 'MM') -1; -- ie: 11-1 so 10 for October -- Otherwise go to the next month ELSE v_last_closed_month := TO_CHAR(TO_DATE(v_max_closed_date, 'DD-MON-YYYY'), 'MM') -1; -- ie: 11 for November END IF; -- v_last_closed_month := 8; -- debugging for other months IF v_last_closed_month > 6 THEN v_accounting_period := v_last_closed_month - 6; ELSE v_accounting_period := v_last_closed_month + 6; END IF; EXCEPTION WHEN OTHERS THEN v_error_message := 'There was a problem accessing the package.'; htp.p('( { "success":false, "message":"' || v_error_message || ' ", "totalCount":0 } )') ; ROLLBACK; RETURN; end fbors_projections; /