PKG Form Drop

You might also like

Download as txt, pdf, or txt
Download as txt, pdf, or txt
You are on page 1of 59

CREATE OR REPLACE PACKAGE BO_CORE.

pkg_form_drop IS
-- Author : DUCDV
-- Created : 5/25/2021 4:29:34 PM
-- Purpose : Luu to?n b? c?c function v? Procedure c?a nghi?p v? Form-Drop

/*
??y v?o form-drop d? job s? t? d?ng ph?n b? task theo fd_approve_matrix:
T?t c? c?c lu?ng nghi?p v? khi mu?n d?y sang form-drop th? th?c hi?n g?i th? t?
c n?y
*/

PROCEDURE put_to_fd(pv_customer_id VARCHAR2,


pv_customer_type VARCHAR2,
pv_channel_type VARCHAR2,
pv_created_by VARCHAR2,
pv_key_field_value VARCHAR2,
pv_menu_code VARCHAR2,
pv_mode VARCHAR2,
pv_application_date DATE,
pv_remark VARCHAR2);

/*APPROVE*/
/*VBA_EBANK_2019_THOP-22133*/
/*PROCEDURE approve_check(sessioninfo_username VARCHAR2,
pv_auto_id NUMBER,
pv_remark VARCHAR2,
cur OUT pkg_data.cursor);*/
/*PROCEDURE approve(sessioninfo_username VARCHAR2,
pv_auto_id NUMBER,
pv_remark VARCHAR2,
pv_last_approve OUT VARCHAR2);*/
PROCEDURE approve_check(sessioninfo_username VARCHAR2,
pv_auto_id NUMBER,
pv_remark VARCHAR2,
pv_ASSIGNED_TO varchar2,
cur OUT pkg_data.cursor);
PROCEDURE approve(sessioninfo_username VARCHAR2,
pv_auto_id NUMBER,
pv_remark VARCHAR2,
pv_last_approve OUT VARCHAR2,
pv_ASSIGNED_TO varchar2 default(NULL));
/*END*/

/*UPDATE WHEN LAST APPROVE = "Y"*/


PROCEDURE update_last_aprove(pv_auto_id NUMBER,
pv_remark VARCHAR2,
pv_esb_data VARCHAR2);

/*ACCEPT*/
PROCEDURE chk_status_accept(pv_approve_status VARCHAR2);

/*VBA_EBANK_2019_THOP-21678 */
/*PROCEDURE accept(sessioninfo_username VARCHAR2,pv_auto_id NUMBER);*/
PROCEDURE accept(sessioninfo_username VARCHAR2,
pv_auto_id NUMBER
,cur OUT pkg_data.cursor);
/*END*/

/*REJECT*/
PROCEDURE reject_check(pv_auto_id NUMBER,
pv_remark VARCHAR2, -- VBA_EBANK_2019_THOP-37036
BPM
cur OUT pkg_data.cursor);
--VBA_EBANK_2019_THOP-37036 BPM STRAT
PROCEDURE assignee_check (pv_auto_id NUMBER,
pv_assigned_to VARCHAR2,
pv_remark VARCHAR2,
cur OUT pkg_data.cursor);
--VBA_EBANK_2019_THOP-37036 BPM END
PROCEDURE accept_check(pv_auto_id NUMBER,
cur OUT pkg_data.cursor);
/*VBA_EBANK_2019_THOP-24005*/
/*PROCEDURE reject(pv_auto_id NUMBER,
pv_remark VARCHAR2);*/
PROCEDURE reject(pv_auto_id NUMBER,
pv_remark VARCHAR2,
sessioninfo_username VARCHAR2);
/*END VBA_EBANK_2019_THOP-24005*/
/*Ph?n b? task d?n ngu?i d?ng BO, th? t?c n?y du?c call t? job c?a db v?i t?n xu?
t 1 ph?t g?i m?t l?n*/
PROCEDURE auto_assign_task(pv_channel_type VARCHAR2,
pv_menu_code VARCHAR2,
pv_approve_status VARCHAR2 DEFAULT 'NEW',
pv_is_processing VARCHAR2 DEFAULT '0',
pv_customer_type VARCHAR2,
pv_branch_level VARCHAR2);
/*VBA_EBANK_2019_THOP-29462 DATND15 07112022*/
--PROCEDURE auto_assign_task_all;
PROCEDURE auto_assign_task_all(cur OUT pkg_data.cursor);
/*END VBA_EBANK_2019_THOP-29462 DATND15 07112022*/

/*Ph?n b? l?i task khi task h?t h?n, th? t?c n?y du?c call t? job c?a db v?i t?n
xu?t x?c d?nh*/
PROCEDURE re_assign_task(pv_channel_type VARCHAR2,
pv_menu_code VARCHAR2,
pv_customer_type VARCHAR2,
pv_branch_level VARCHAR2,
pv_user_type VARCHAR2);

PROCEDURE re_assign_task_maker(pv_channel_type VARCHAR2,


pv_menu_code VARCHAR2,
pv_customer_type VARCHAR2,
pv_branch_level VARCHAR2,
pv_user_type VARCHAR2);

PROCEDURE re_assign_task_checker(pv_channel_type VARCHAR2,


pv_menu_code VARCHAR2,
pv_customer_type VARCHAR2,
pv_branch_level VARCHAR2,
pv_user_type VARCHAR2);

PROCEDURE re_assign_task_branch_level(pv_channel_type VARCHAR2,


pv_menu_code VARCHAR2,
pv_customer_type VARCHAR2,
pv_user_type VARCHAR2);
/*VBA_EBANK_2019_THOP-29462 DATND15 07112022*/
--PROCEDURE re_assign_task_all;
PROCEDURE re_assign_task_all(cur OUT pkg_data.cursor);
/*END VBA_EBANK_2019_THOP-29462 DATND15 07112022*/
FUNCTION fnc_get_user(pv_group_list VARCHAR2) RETURN user_task_type;

FUNCTION fnc_get_user_ext(pv_group_list VARCHAR2,


pv_branch_id VARCHAR2,
pv_same_division CHAR DEFAULT 'Y')
RETURN user_task_type;

FUNCTION fnc_get_list_user(pv_group_list VARCHAR2,


pv_role VARCHAR2)
RETURN user_task_table_type;

FUNCTION fnc_fdr_setup(pv_menu_code IN gd_form_drop_setup.menu_code%TYPE,


pv_customer_type IN gd_form_drop_setup.customer_type%TYPE,
pv_channel_code IN gd_form_drop_setup.channel_code%TYPE)
RETURN fdr_param_type;

FUNCTION fn_split_string(i_str IN VARCHAR2,


i_delim IN VARCHAR2 DEFAULT '|')
RETURN SYS.odcivarchar2list DETERMINISTIC;

FUNCTION fn_split_value(i_str IN VARCHAR2,


i_char IN CHAR,
i_order IN NUMBER DEFAULT 1) RETURN VARCHAR2;

/*Get transaction ID */
FUNCTION fn_get_transid(table_name IN VARCHAR2,
key_field IN VARCHAR2) RETURN VARCHAR2;

FUNCTION fn_user_approve(auto_id VARCHAR2) RETURN VARCHAR2;

FUNCTION fn_check_busy(pv_user_name NVARCHAR2,


pv_date_time DATE) RETURN NUMBER;
/*VBA_EBANK_2019_THOP-22133*/
/*VBA_EBANK_2019_THOP-23949 20220624 datnd15*/
/*PROCEDURE PROC_LOADHANDLER(pv_MENU_CODE_D varchar2,
pv_CUSTOMER_TYPE_D varchar2,
cur OUT pkg_data.cursor);*/
PROCEDURE PROC_LOADHANDLER(
pv_AUTO_ID varchar2,
cur OUT pkg_data.cursor);
/*END - VBA_EBANK_2019_THOP-23949 20220624 datnd15*/
/*END*/
/*VBA_EBANK_2019_THOP-23447*/
PROCEDURE GET_VALID_PROC(pv_auto_id NUMBER,cur OUT
pkg_data.cursor);
/*END VBA_EBANK_2019_THOP-23447*/
/*VBA_EBANK_2019_THOP-24005*/
PROCEDURE PROC_VALIDATE_SESSION(pt_rec gd_form_drop_pending_tasks%rowtype,
session_username varchar2);
/*END - VBA_EBANK_2019_THOP-24005*/
/*VBA_EBANK_2019_THOP-23949 20220624 datnd15*/
FUNCTION FUNC_CHECK_LAST(pt_rec gd_form_drop_pending_tasks
%rowtype) return varchar2;
/*END VBA_EBANK_2019_THOP-23949 20220624 datnd15*/

--Start jira 25863


PROCEDURE PROC_LOADHANDLER_380RU
(
pv_AUTO_ID varchar2,
cur OUT pkg_data.CURSOR
);
--End jira 25863

--- VBA_EBANK_2019_THOP-37036 20230718 Datnd15 BPM on OFF


Function fn_get_flag_BPM return varchar2;
procedure get_time_sla(pv_auto_id NUMBER,
cur OUT PKG_DATA.cursor);
END;
/
CREATE OR REPLACE PACKAGE BODY BO_CORE.pkg_form_drop IS
v_role_maker VARCHAR(1) := 'M';
v_role_checker VARCHAR(1) := 'A';
v_pending_task_id NUMBER;
e_no_data_customer EXCEPTION;
e_too_many_customer EXCEPTION;
e_no_data_fdr_setup EXCEPTION;
e_too_many_fdr_setup EXCEPTION;
v_err_msg VARCHAR(1000);

-- dainv comment here

--------------------------------------------------- put_to_fd
------------------------------------------------
PROCEDURE put_to_fd(pv_customer_id VARCHAR2,
pv_customer_type VARCHAR2, --CU,RU
pv_channel_type VARCHAR2,
pv_created_by VARCHAR2,
pv_key_field_value VARCHAR2,
pv_menu_code VARCHAR2,
pv_mode VARCHAR2,
pv_application_date DATE,
pv_remark VARCHAR2) IS
v_branch_code VARCHAR2(100);
v_branch_level CHAR(2);
v_identifier_key VARCHAR2(100) := '';
v_corporate_id VARCHAR2(15);
v_customer_name VARCHAR2(200);
v_form_drop_type VARCHAR2(3);
v_ho_received VARCHAR2(100);
v_l1_received VARCHAR2(100);
v_l2_received VARCHAR2(100);
v_time_expire_waiting DATE;
v_minute NUMBER;

BEGIN
-- gd_customer
BEGIN
SELECT a.servicing_branch,
b.branch_level,
a.corporate_id,
a.customer_name
INTO v_branch_code,
v_branch_level,
v_corporate_id,
v_customer_name
FROM gd_customer a
INNER JOIN gd_branch b
ON a.servicing_branch = b.branch_code
WHERE a.user_id = pv_created_by
AND a.customer_id = pv_customer_id
AND a.deleted = 'N'
AND b.deleted = 'N';
EXCEPTION
WHEN NO_DATA_FOUND THEN
RAISE e_no_data_customer;
WHEN TOO_MANY_ROWS THEN
RAISE e_too_many_customer;
END;

-- gd_form_drop_setup
BEGIN
SELECT form_drop_type,
ho_received,
l1_received,
l2_received
INTO v_form_drop_type,
v_ho_received,
v_l1_received,
v_l2_received
FROM gd_form_drop_setup
WHERE menu_code = pv_menu_code
AND customer_type = pv_customer_type
/* AND channel_code = pv_channel_type VBA_EBANK_2019_THOP-21285 */
AND status = 'A';
EXCEPTION
WHEN NO_DATA_FOUND THEN
RAISE e_no_data_fdr_setup;
WHEN TOO_MANY_ROWS THEN
RAISE e_too_many_fdr_setup;
END;

--time_expire_waiting by v_branch_level
IF v_branch_level = 'HO'
THEN
v_minute := 180;
ELSIF v_branch_level = 'L1'
THEN
v_minute := 180;
ELSE
v_minute := 180;
END IF;

v_time_expire_waiting := SYSDATE + (1 / (60 * 24) * v_minute);

INSERT INTO gd_form_drop_pending_tasks


(auto_id,
channel_type,
action,
branch_code,
created_by,
created_date,
modified_by,
modified_date,
key_field_value,
menu_code,
menu_mode,
approve_status,
identifier_key,
remark,
user_assigned,
is_processing,
send_time,
time_expire_waiting,
receive_time,
time_expire_process,
branch_level,
corporate_id,
customer_id,
customer_name,
customer_type,
form_drop_type,
application_date)
VALUES
(seq_gd_form_drop_pending_tasks.NEXTVAL,
pv_channel_type,
'C',
v_branch_code,
pv_created_by,
SYSDATE,
NULL,
NULL,
pv_key_field_value,
pv_menu_code,
pv_mode,
'1',
v_identifier_key,
pv_remark,
NULL,
'1',
NULL,
NULL,
NULL,
NULL,
v_branch_level,
v_corporate_id,
pv_customer_id,
v_customer_name,
pv_customer_type,
v_form_drop_type,
pv_application_date);
EXCEPTION
WHEN e_no_data_customer THEN
sp_throw_exception(6000, NULL);

proc_log_error('pkg_form_drop.put_to_fd',
'no_data_found pv_customer_id = ' || pv_customer_id ||
', pv_created_by = ' || pv_created_by,
NULL,
NULL);

ROLLBACK;
WHEN e_too_many_customer THEN
sp_throw_exception(6000, NULL);
proc_log_error('pkg_form_drop.put_to_fd',
'too_many_rows_customer pv_customer_id = ' ||
pv_customer_id || ', pv_created_by = ' ||
pv_created_by,
NULL,
NULL);

ROLLBACK;
WHEN e_no_data_fdr_setup THEN
sp_throw_exception(6000, NULL);

proc_log_error('pkg_form_drop.put_to_fd',
'e_no_data_fdr_setup pv_menu_code = ' || pv_menu_code ||
', pv_customer_type = ' || pv_customer_type ||
', pv_channel_type = ' || pv_channel_type,
NULL,
NULL);

ROLLBACK;
WHEN e_too_many_fdr_setup THEN
sp_throw_exception(6000, NULL);

proc_log_error('pkg_form_drop.put_to_fd',
'e_too_many_fdr_setup pv_menu_code = ' || pv_menu_code ||
', pv_customer_type = ' || pv_customer_type ||
', pv_channel_type = ' || pv_channel_type,
NULL,
NULL);

ROLLBACK;
WHEN OTHERS THEN
sp_throw_exception(6000, NULL);
proc_log_error('pkg_form_drop.put_to_fd', SQLERRM, SQLCODE, NULL);

ROLLBACK;
END;

--------------------------------------------------- approve_check
------------------------------------------------
/*VBA_EBANK_2019_THOP-22133*/
/*PROCEDURE approve_check(sessioninfo_username VARCHAR2,
pv_auto_id NUMBER,
pv_remark VARCHAR2,
cur OUT pkg_data.cursor) IS*/
PROCEDURE approve_check(sessioninfo_username VARCHAR2,
pv_auto_id NUMBER,
pv_remark VARCHAR2,
pv_ASSIGNED_TO varchar2,
cur OUT pkg_data.cursor) IS
/*END*/
v_last_approve VARCHAR2(2);
v_proc_approve VARCHAR2(200);
is_BPM varchar2(2); --VBA_EBANK_2019_THOP-37036 datnd15 BPM
is_user_id_form varchar2(10);--VBA_EBANK_2019_THOP-37036 datnd15 BPM
is_user_id varchar2(10);--VBA_EBANK_2019_THOP-37036 datnd15 BPM
is_user_name varchar2(100);--VBA_EBANK_2019_THOP-37036 datnd15 BPM
BEGIN
BEGIN
--VBA_EBANK_2019_THOP-37036 datnd15 BPM strat
is_BPM := fn_get_flag_BPM();
if is_BPM = 'N' then

SELECT t.USER_ID,t.USER_ASSIGNED
INTO is_user_id_form,is_user_name
FROM gd_form_drop_pending_tasks t
where t.auto_id=pv_auto_id;

if is_user_id_form is null then


SELECT t.USER_ID
INTO is_user_id
FROM users t where t.USERNAME = is_user_name;

update gd_form_drop_pending_tasks
set USER_ID=is_user_id
where auto_id = pv_auto_id;
end if;

-- VBA_EBANK_2019_THOP-37036 datnd15 BPM end


/*VBA_EBANK_2019_THOP-22133*/
--approve(sessioninfo_username, pv_auto_id, pv_remark,
v_last_approve);
approve(sessioninfo_username, pv_auto_id,
pv_remark,v_last_approve,pv_ASSIGNED_TO);
/*END*/
IF v_last_approve = 'Y'
THEN
SELECT t.proc_approve
INTO v_proc_approve
FROM gd_fd_setup_module t
WHERE t.menu_code = (SELECT t.menu_code
FROM gd_form_drop_pending_tasks t
WHERE t.auto_id = pv_auto_id)
AND
t.menu_mode = (SELECT t.menu_mode
FROM gd_form_drop_pending_tasks t
WHERE t.auto_id = pv_auto_id);
END IF;
OPEN cur FOR
SELECT v_last_approve last_approve,
v_proc_approve tf_proc_approve
, is_BPM is_BPM --VBA_EBANK_2019_THOP-37036 datnd15 BPM
FROM DUAL;
--VBA_EBANK_2019_THOP-37036 datnd15 BPM strat
else
SELECT t.proc_approve
INTO v_proc_approve
FROM gd_fd_setup_module t
WHERE t.menu_code = (SELECT t.menu_code
FROM gd_form_drop_pending_tasks t
WHERE t.auto_id = pv_auto_id)
AND t.menu_mode = (SELECT t.menu_mode
FROM gd_form_drop_pending_tasks t
WHERE t.auto_id = pv_auto_id);
OPEN cur FOR
SELECT ibm_process_id IBM_PROCESS_ID,
pv_remark remark,
is_latest_step last_approve,
v_proc_approve tf_proc_approve , is_BPM is_BPM
FROM gd_form_drop_pending_tasks
WHERE auto_id = pv_auto_id;
end if;
-- VBA_EBANK_2019_THOP-37036 datnd15 BPM end
EXCEPTION
WHEN OTHERS THEN
proc_log_error(p_target => 'FORM_DROP_BO',
p_message => 'approve_check - ERORR: ' ||
SQLCODE || ' - ' || SQLERRM || ' - ' ||
DBMS_UTILITY.format_error_backtrace,
p_sqlcode => SQLCODE,
p_msgid => NULL);
RAISE_APPLICATION_ERROR(SQLCODE, SQLCODE || ' - ' || SQLERRM);
END;
END;

-----------------------------------------------------Accept check
-------------------------------------------------------------------
PROCEDURE accept_check(pv_auto_id NUMBER,
cur OUT pkg_data.cursor) IS
v_proc_accept VARCHAR2(200);
is_BPM varchar2(2); --VBA_EBANK_2019_THOP-37036 BPM
BEGIN
--BEGIN
--VBA_EBANK_2019_THOP-37036 Datnd15 BPM strat
/* SELECT t.proc_accept
INTO v_proc_accept
FROM gd_fd_setup_module t
WHERE t.menu_code = (SELECT t.menu_code
FROM gd_form_drop_pending_tasks t
WHERE t.auto_id = pv_auto_id)
AND
t.menu_mode = (SELECT t.menu_mode
FROM gd_form_drop_pending_tasks t
WHERE t.auto_id = pv_auto_id);*/

--OPEN cur FOR


--SELECT v_proc_accept tf_proc_accept FROM DUAL;
is_BPM := fn_get_flag_BPM();
if is_BPM = 'N' then
SELECT t.proc_accept
INTO v_proc_accept
FROM gd_fd_setup_module t
WHERE t.menu_code = (SELECT t.menu_code
FROM gd_form_drop_pending_tasks t
WHERE t.auto_id = pv_auto_id)
AND
t.menu_mode = (SELECT t.menu_mode
FROM gd_form_drop_pending_tasks t
WHERE t.auto_id = pv_auto_id);
OPEN cur FOR SELECT v_proc_accept tf_proc_accept , is_BPM is_BPM FROM DUAL;
-- VBA_EBANK_2019_THOP-37036 BPM
else
OPEN cur FOR
SELECT ibm_process_id IBM_PROCESS_ID, v_proc_accept
tf_proc_accept , is_BPM is_BPM
FROM gd_form_drop_pending_tasks
WHERE auto_id = pv_auto_id;
end if;
-- VBA_EBANK_2019_THOP-37036 Datnd15 BPM end
/* EXCEPTION
WHEN OTHERS THEN
proc_log_error(p_target => 'FORM_DROP_BO',
p_message => 'accept_check - ERORR: ' ||
SQLCODE || ' - ' || SQLERRM || ' - ' ||
DBMS_UTILITY.format_error_backtrace,
p_sqlcode => SQLCODE,
p_msgid => NULL);
RAISE_APPLICATION_ERROR(SQLCODE, SQLCODE || ' - ' || SQLERRM);*/
--END;
END;

--------------------------------------------------- reject_check
------------------------------------------------
PROCEDURE reject_check(pv_auto_id NUMBER,
pv_remark VARCHAR2, -- VBA_EBANK_2019_THOP-37036
BPM
cur OUT pkg_data.cursor) IS
v_proc_reject VARCHAR2(200);
is_BPM varchar2(2); -- VBA_EBANK_2019_THOP-37036 BPM
BEGIN
BEGIN

-- VBA_EBANK_2019_THOP-37036 BPM STRAT


/*SELECT t.proc_reject
INTO v_proc_reject
FROM gd_fd_setup_module t
WHERE t.menu_code = (SELECT t.menu_code
FROM gd_form_drop_pending_tasks t
WHERE t.auto_id = pv_auto_id)
AND
t.menu_mode = (SELECT t.menu_mode
FROM gd_form_drop_pending_tasks t
WHERE t.auto_id = pv_auto_id);*/

--OPEN cur FOR


--SELECT v_proc_reject tf_proc_reject FROM DUAL;
is_BPM := fn_get_flag_BPM();
SELECT t.proc_reject
INTO v_proc_reject
FROM gd_fd_setup_module t
WHERE t.menu_code = (SELECT t.menu_code
FROM gd_form_drop_pending_tasks t
WHERE t.auto_id = pv_auto_id)
AND
t.menu_mode = (SELECT t.menu_mode
FROM gd_form_drop_pending_tasks t
WHERE t.auto_id = pv_auto_id);
if is_BPM = 'N' then

OPEN cur FOR SELECT v_proc_reject tf_proc_reject ,is_BPM is_BPM FROM


DUAL;
else
OPEN cur FOR
SELECT ibm_process_id IBM_PROCESS_ID, pv_remark AS remark ,is_BPM
is_BPM,v_proc_reject tf_proc_reject
FROM gd_form_drop_pending_tasks
WHERE auto_id = pv_auto_id;
end if;
--VBA_EBANK_2019_THOP-37036 BPM BPM end
EXCEPTION
WHEN OTHERS THEN
proc_log_error(p_target => 'FORM_DROP_BO',
p_message => 'reject_check - ERORR: ' ||
SQLCODE || ' - ' || SQLERRM || ' - ' ||
DBMS_UTILITY.format_error_backtrace,
p_sqlcode => SQLCODE,
p_msgid => NULL);
RAISE_APPLICATION_ERROR(SQLCODE, SQLCODE || ' - ' || SQLERRM);
END;
END;
-----------------------------------------------------Assignee check
-------------------------------------------------------------------
--VBA_EBANK_2019_THOP-37036 BPM
PROCEDURE assignee_check (pv_auto_id NUMBER,
pv_assigned_to VARCHAR2,
pv_remark VARCHAR2,
cur OUT pkg_data.cursor)
IS
v_proc_accept VARCHAR2 (200);
is_BPM varchar2(2);
BEGIN
BEGIN
is_BPM := fn_get_flag_BPM();
OPEN cur FOR
SELECT ibm_process_id IBM_PROCESS_ID,
pv_assigned_to assigned_to,
pv_remark remark,is_BPM is_BPM
FROM gd_form_drop_pending_tasks
WHERE auto_id = pv_auto_id;
EXCEPTION
WHEN OTHERS
THEN
proc_log_error (
p_target => 'FORM_DROP_BO',
p_message => 'accept_check - ERORR: '
|| SQLCODE
|| ' - '
|| SQLERRM
|| ' - '
|| DBMS_UTILITY.format_error_backtrace,
p_sqlcode => SQLCODE,
p_msgid => NULL);
raise_application_error (SQLCODE,
SQLCODE || ' - ' || SQLERRM);
END;
END;
--VBA_EBANK_2019_THOP-37036 BPM end

--------------------------------------------------- approve
------------------------------------------------
/*VBA_EBANK_2019_THOP-22133*/
/*PROCEDURE approve(sessioninfo_username VARCHAR2,
pv_auto_id NUMBER,
pv_remark VARCHAR2,
pv_last_approve OUT VARCHAR2) IS*/
PROCEDURE approve(sessioninfo_username VARCHAR2,
pv_auto_id NUMBER,
pv_remark VARCHAR2,
pv_last_approve OUT VARCHAR2,
pv_ASSIGNED_TO varchar2 default(NULL)) IS
/*END*/
v_count NUMBER;
v_fdr_param fdr_param_type;
v_user_task_tbl user_task_table_type := user_task_table_type();
v_username varchar2(100);
v_userid varchar2(100);
pt_rec gd_form_drop_pending_tasks%ROWTYPE;
tb_setup_rec gd_form_drop_setup%ROWTYPE;
tb_approve_rec gd_form_drop_approve%ROWTYPE;
v_number NUMBER;
v_status VARCHAR2(20);
v_check_maker NUMBER;
is_marker VARCHAR2(5);
v_to_email varchar2(50); --Lannq2_add jira:24416 20220718
/*VBA_EBANK_2019_THOP-26571 DATND15 20220817*/
v_target_branch varchar(5);
v_branch_code number;
/*VBA_EBANK_2019_THOP-26571 DATND15 20220817*/
BEGIN
BEGIN

/*
- Neu approve lan dau th? User n?y ph?i c? quy?n l? Maker ( chua c? b?n ghi
Approve trong pending_task)
- N?u d? Approve m?t l?n r?i th? User ph?i c? quy?n l? Checker
*/
SELECT COUNT(1)
INTO v_count
FROM gd_form_drop_pending_tasks_his
WHERE auto_id = pv_auto_id
AND approve_status IN ('4', '7');

--Chua duyet lan nao


is_marker := 'N';

IF v_count = 0
THEN
SELECT COUNT(1)
INTO v_check_maker
FROM users
WHERE INSTR(role, 'M') > 0
AND username = sessioninfo_username
AND status = 'A';

IF v_check_maker = 0
THEN
sp_throw_exception(1403430, NULL);
END IF;

is_marker := 'Y';
ELSE
/*VBA_EBANK_2019_THOP-23949 datnd15 20220624*/
SELECT *
INTO pt_rec
FROM gd_form_drop_pending_tasks
WHERE auto_id = pv_auto_id;
select count(1) into v_count from gd_parameter t where t.parameter_type =
'FORM_DROP' and t.parameter_code = pt_rec.menu_code and t.is_active = 'Y'
and (INSTR(t.channel_tenant_id, (pt_rec.channel_type||' - VN')) > 0);
IF v_count = 0 then
/*END VBA_EBANK_2019_THOP-23949 datnd15 20220624*/
SELECT COUNT(1)
INTO v_check_maker --1
FROM users
WHERE INSTR(role, 'A') > 0
AND username = sessioninfo_username
AND status = 'A';
IF v_check_maker = 0
THEN
sp_throw_exception(1503430, NULL);
END IF;
/*VBA_EBANK_2019_THOP-23949 datnd15 20220624*/
end if;
/*END VBA_EBANK_2019_THOP-23949 datnd15 20220624*/
END IF;

--get record in pending_task

BEGIN
SELECT *
INTO pt_rec
FROM gd_form_drop_pending_tasks
WHERE auto_id = pv_auto_id;
EXCEPTION
WHEN NO_DATA_FOUND THEN
pt_rec := NULL;
proc_log_error('pkg_form_drop.approve',
'no_data_found id = ' || pv_auto_id,
NULL,
NULL);
END;

PROC_VALIDATE_SESSION(pt_rec,sessioninfo_username);/*VBA_EBANK_2019_THOP-
24005*/

IF v_check_maker > 0
AND is_marker = 'Y'
THEN
v_status := '4';
pt_rec.number_of_approval := 0; -- 0
pt_rec.sequence := 0; -- 0
ELSE
v_status := '7';
END IF;

---------------------------------------
BEGIN
SELECT *
INTO tb_setup_rec
FROM gd_form_drop_setup
WHERE menu_code = pt_rec.menu_code
AND customer_type = pt_rec.customer_type
/* AND channel_code = pt_rec.channel_type VBA_EBANK_2019_THOP-21285 */
AND status = 'A';
EXCEPTION
WHEN NO_DATA_FOUND THEN
tb_setup_rec := NULL;
proc_log_error('pkg_form_drop.approve',
'no_data_found : gd_form_drop_setup: menu_code = ' ||
pt_rec.menu_code ||
',customer_type:' || pt_rec.customer_type ||
',channel_code:' || pt_rec.channel_type,
NULL,
NULL);
END;

------------------------------------------------- VALIDATE NULLABLE


tb_setup_rec-------------------------------------------------------
IF tb_setup_rec.auto_id IS NOT NULL
THEN
--get task_approve
BEGIN
SELECT *
INTO tb_approve_rec
FROM gd_form_drop_approve
WHERE branch_level = pt_rec.branch_level -- HO
AND form_drop_setup_id = tb_setup_rec.auto_id --1403
AND sequence = pt_rec.sequence;
EXCEPTION
WHEN NO_DATA_FOUND THEN
tb_approve_rec := NULL;
proc_log_error('pkg_form_drop.approve',
'no_data_found branch_level = ' ||
pt_rec.branch_level || ',auto_id setup:' ||
tb_setup_rec.auto_id || 'sequence:'||pt_rec.sequence ||
'IS_MARKER: '|| is_marker,
NULL,
NULL);
END;

------------------------------------------------- VALIDATE NULLABLE


tb_approve_rec----------------------------------------------------

IF tb_approve_rec.auto_id IS NOT NULL


OR is_marker = 'Y' /*ONLY MARKER*/
THEN
SELECT COUNT(1)
INTO v_count
FROM gd_form_drop_approve
WHERE branch_level = pt_rec.branch_level
AND sequence > pt_rec.sequence
AND form_drop_setup_id = tb_setup_rec.auto_id; --1403

IF (v_count > 0 OR
(v_count = 0 AND
pt_rec.number_of_approval < tb_approve_rec.number_of_approval) OR
is_marker = 'Y')
THEN
pt_rec.approve_status := v_status;
pt_rec.time_processing := SYSDATE;
v_number := seq_gd_form_drop_pending_tasks_hist.NEXTVAL();

INSERT INTO gd_form_drop_pending_tasks_his t


(t.auto_id,
t.channel_type,
t.action,
t.branch_code,
t.created_by,
t.created_date,
t.modified_by,
t.modified_date,
t.key_field_value,
t.menu_code,
t.menu_mode,
t.approve_status,
t.identifier_key,
t.remark,
t.user_assigned,
t.is_processing,
t.send_time,
t.time_expire_waiting,
t.receive_time,
t.time_expire_process,
t.branch_level,
t.application_date,
t.corporate_id,
t.customer_type,
t.form_drop_type,
t.customer_id,
t.customer_name,
t.number_of_approval,
t.sequence,
t.user_id,
t.time_processing,
t.sla_processing,
t.number_insert,
t.assign_from,
t.assign_by)
VALUES
(pt_rec.auto_id,
pt_rec.channel_type,
pt_rec.action,
pt_rec.branch_code,
pt_rec.created_by,
pt_rec.created_date,
pt_rec.modified_by,
pt_rec.modified_date,
pt_rec.key_field_value,
pt_rec.menu_code,
pt_rec.menu_mode,
pt_rec.approve_status,
pt_rec.identifier_key,
pv_remark,
pt_rec.user_assigned,
pt_rec.is_processing,
pt_rec.send_time,
pt_rec.time_expire_waiting,
pt_rec.receive_time,
pt_rec.time_expire_process,
pt_rec.branch_level,
pt_rec.application_date,
pt_rec.corporate_id,
pt_rec.customer_type,
pt_rec.form_drop_type,
pt_rec.customer_id,
pt_rec.customer_name,
pt_rec.number_of_approval,
pt_rec.sequence,
pt_rec.user_id,
pt_rec.time_processing,
pt_rec.sla_processing,
v_number,
NULL,
NULL);

IF is_marker = 'Y' /*ONLY MARKER*/


THEN
pt_rec.sequence := pt_rec.sequence + 1;
pt_rec.number_of_approval := pt_rec.number_of_approval + 1;
ELSE
IF pt_rec.number_of_approval =
tb_approve_rec.number_of_approval
THEN
pt_rec.number_of_approval := 0;
pt_rec.sequence := pt_rec.sequence + 1;
END IF;

IF pt_rec.number_of_approval <
tb_approve_rec.number_of_approval
THEN
pt_rec.number_of_approval := pt_rec.number_of_approval + 1;
END IF;
END IF;

v_fdr_param := fdr_param_type.fnc_get_fdr_param(pt_rec.menu_code,
pt_rec.customer_type,
pt_rec.channel_type,
pt_rec.branch_level,
pt_rec.branch_code,
v_role_checker,
pt_rec.sequence,

pt_rec.number_of_approval);

-----------------------------------------------------------------------------------
--------------------------------------------------
pt_rec.send_time := SYSDATE;
pt_rec.time_expire_waiting := SYSDATE +
(1 / (60 * 24) *
v_fdr_param.sla_waiting_apr);
/*VBA_EBANK_2019_THOP-18628 by DATND15*/
/*
IF v_fdr_param.user_task.user_id <> pt_rec.user_id
AND v_fdr_param.user_task.user_id IS NOT NULL
THEN
pt_rec.user_assigned := v_fdr_param.user_task.user_name;
pt_rec.user_id := v_fdr_param.user_task.user_id;
pt_rec.approve_status := '5';
pv_last_approve := 'N';

UPDATE gd_form_drop_pending_tasks e
SET row = pt_rec
WHERE e.auto_id = pt_rec.auto_id;
ELSE
sp_throw_exception(2308, '');
END IF;
*/
------------------------------------------------

/*begin VBA_EBANK_2019_THOP-22133*/
/*VBA_EBANK_2019_THOP-23949 20220624 datnd15*/
/*IF tb_setup_rec.handler_approve = 'Y' and pv_ASSIGNED_TO is not null THEN
v_userid := pv_ASSIGNED_TO;
select t.username into v_username from users t where t.user_id =
pv_ASSIGNED_TO;*/
select count(1) into v_count from gd_parameter t where t.parameter_type
= 'FORM_DROP' and t.parameter_code = pt_rec.menu_code and t.is_active = 'Y'
and (INSTR(t.channel_tenant_id, (pt_rec.channel_type||' - VN')) > 0);
IF v_count > 0 then
IF pv_ASSIGNED_TO IS NOT NULL then
v_userid := pv_ASSIGNED_TO;
select t.username into v_username from users t where t.user_id =
pv_ASSIGNED_TO;
else
sp_throw_exception(1403432,null);
end if;
/*END - VBA_EBANK_2019_THOP-23949*/
ELSE
/*end VBA_EBANK_2019_THOP-22133*/

IF v_fdr_param.user_task.user_id <> pt_rec.user_id


AND v_fdr_param.user_task.user_id IS NOT NULL
THEN
/*VBA_EBANK_2019_THOP-26571 DATND15 20220817*/
/*pt_rec.user_assigned := v_fdr_param.user_task.user_name;
pt_rec.user_id := v_fdr_param.user_task.user_id;*/
/*END VBA_EBANK_2019_THOP-26571 DATND15 20220817*/
v_username := v_fdr_param.user_task.user_name;
v_userid := v_fdr_param.user_task.user_id;

ELSE
BEGIN
v_user_task_tbl := v_fdr_param.tbl_user_task;
/*VBA_EBANK_2019_THOP-26571 DATND15 20220817*/
/*select f.user_name , f.user_id into v_username ,v_userid from
(select ROWNUM as rn,t.* from table(v_user_task_tbl) t
where t.user_id not in (select distinct e.user_id from
gd_form_drop_pending_tasks_his e where e.auto_id = pt_rec.auto_id) order by
t.total_task asc)
f where f.rn = 1;*/
select t.target_branch into v_target_branch from
gd_form_drop_approve t where t.form_drop_setup_id = tb_setup_rec.auto_id
and t.branch_level = pt_rec.branch_level and t.sequence =
pt_rec.sequence and t.deleted = 'N';
if v_target_branch = 'SB' then
v_branch_code := pt_rec.branch_code;
elsif v_target_branch = 'HO' then
select t.branch_code into v_branch_code from gd_branch t where
t.branch_level = 'HO' and t.deleted = 'N';
else
SELECT a.parent_code INTO v_branch_code FROM gd_branch a WHERE
a.branch_level = pt_rec.branch_level AND a.branch_code = pt_rec.branch_code AND
a.deleted = 'N';
end if;

select f.user_name , f.user_id into v_username ,v_userid from


(select ROWNUM as rn,t.* from table(v_user_task_tbl) t
where t.user_id not in
(select distinct e.user_id from gd_form_drop_pending_tasks_his e
where e.auto_id = pt_rec.auto_id)
and t.branch_id = v_branch_code
order by t.total_task asc)
f where f.rn = 1;
/*END VBA_EBANK_2019_THOP-26571 DATND15 20220817*/
EXCEPTION
WHEN OTHERS THEN
sp_throw_exception(2308, '');
END;
END IF;
/*begin VBA_EBANK_2019_THOP-22133*/
END IF;
/*END-22133*/
pt_rec.user_assigned := v_username;
pt_rec.user_id := v_userid;
pt_rec.approve_status := '5';
pv_last_approve := 'N';
pt_rec.is_processing := '0';/*VBA_EBANK_2019_THOP-28961 Datnd15
05102022*/
UPDATE gd_form_drop_pending_tasks e
SET row = pt_rec
WHERE e.auto_id = pt_rec.auto_id;
/*------- END -------*/
-- notice here

--START Lannq2_add jira:24416 20220718


BEGIN
Select nvl(email,'test@vba.fpt.vn') into v_to_email
From users
where user_id = v_userid
and deleted = 'N';
EXCEPTION WHEN NO_DATA_FOUND THEN
v_to_email := 'test@vba.fpt.vn';
END;

sp_ins_noti_form_drop (PV_SITE => 'BO', --


Lannq2_add jira:24416 20220725
PV_MENU_CODE => '03430',
PV_SUB_MENU_CODE => '03430.01',
PV_NOTICE_TYPE => 'T',
PV_KEY_VALUE => pt_rec.auto_id,
pv_NOTICE_USER => v_username,
pv_CORPORATE_ID => NULL,
PV_CREATE_USER => sessioninfo_username,
--Lannq2_sua jira:24416 20220726
PV_DEVICE_ID => NULL,
PV_EMAIL => v_to_email,
PV_CHANNEL_TYPE => pt_rec.channel_type
);
--END Lannq2_add jira:24416 20220718
ELSE
pv_last_approve := 'Y';
END IF;

ELSE
--ERROR 1
sp_throw_exception(2306, '');
END IF;

ELSE
--ERROR 2
sp_throw_exception(2307, '');
END IF;
EXCEPTION
WHEN OTHERS THEN
proc_log_error(p_target => 'FORM_DROP_BO',
p_message => 'approve - ERORR: ' ||
SQLCODE || ' - ' || SQLERRM || ' - ' ||
DBMS_UTILITY.format_error_backtrace,
p_sqlcode => SQLCODE,
p_msgid => NULL);
RAISE_APPLICATION_ERROR(SQLCODE, SQLCODE || ' - ' || SQLERRM);
END;
END;

--------------------------------------------------- UPDATE_LAST_APROVE
------------------------------------------
PROCEDURE update_last_aprove(pv_auto_id NUMBER,
pv_remark VARCHAR2,
pv_esb_data VARCHAR2) IS
v_number NUMBER;
v_count NUMBER;
v_check_maker NUMBER;
pt_rec gd_form_drop_pending_tasks%ROWTYPE;
tb_setup_rec gd_form_drop_setup%ROWTYPE;
tb_approve_rec gd_form_drop_approve%ROWTYPE;
v_to_email varchar2(50); --Lannq2_add jira:24416 20220707
BEGIN
BEGIN
BEGIN
SELECT *
INTO pt_rec
FROM gd_form_drop_pending_tasks
WHERE auto_id = pv_auto_id;
EXCEPTION
WHEN NO_DATA_FOUND THEN
pt_rec := NULL;
proc_log_error('pkg_form_drop.UPDATE_LAST_APROVE',
'no_data_found id = ' || pv_auto_id,
NULL,
NULL);
END;

----------------------------------------------------------------------
BEGIN
SELECT *
INTO tb_setup_rec
FROM gd_form_drop_setup
WHERE menu_code = pt_rec.menu_code
AND customer_type = pt_rec.customer_type
/* AND channel_code = pt_rec.channel_type VBA_EBANK_2019_THOP-21285 */
AND status = 'A';
EXCEPTION
WHEN NO_DATA_FOUND THEN
tb_setup_rec := NULL;
proc_log_error('pkg_form_drop.approve',
'no_data_found menu_code = ' || pt_rec.menu_code ||
',customer_type:' || pt_rec.customer_type ||
',channel_code:' || pt_rec.channel_type,
NULL,
NULL);
END;

------------------------------------------------------------------------
BEGIN
SELECT *
INTO tb_approve_rec
FROM gd_form_drop_approve
WHERE branch_level = pt_rec.branch_level -- HO
AND form_drop_setup_id = tb_setup_rec.auto_id --1403
AND sequence = pt_rec.sequence;
EXCEPTION
WHEN NO_DATA_FOUND THEN
tb_approve_rec := NULL;
proc_log_error('pkg_form_drop.approve',
'no_data_found branch_level = ' ||
pt_rec.branch_level || ',customer_type:' ||
tb_setup_rec.auto_id,
NULL,
NULL);
END;

------------------------------- Count history


------------------------------------------
SELECT COUNT(1)
INTO v_count
FROM gd_form_drop_pending_tasks_his
WHERE auto_id = pv_auto_id
AND approve_status IN ('4', '7');

IF v_count = 0
THEN
pt_rec.number_of_approval := 0; -- 0
pt_rec.sequence := 0; -- 0
END IF;

----- Insert his when last approve and susscessfully all roles approve
pt_rec.approve_status := '8';
pt_rec.is_processing := '2';
pt_rec.time_processing := SYSDATE;
v_number := seq_gd_form_drop_pending_tasks_hist.NEXTVAL();

INSERT INTO gd_form_drop_pending_tasks_his t


(t.auto_id,
t.channel_type,
t.action,
t.branch_code,
t.created_by,
t.created_date,
t.modified_by,
t.modified_date,
t.key_field_value,
t.menu_code,
t.menu_mode,
t.approve_status,
t.identifier_key,
t.remark,
t.user_assigned,
t.is_processing,
t.send_time,
t.time_expire_waiting,
t.receive_time,
t.time_expire_process,
t.branch_level,
t.application_date,
t.corporate_id,
t.customer_type,
t.form_drop_type,
t.customer_id,
t.customer_name,
t.number_of_approval,
t.sequence,
t.user_id,
t.time_processing,
t.sla_processing,
t.number_insert,
t.assign_from,
t.assign_by)
VALUES
(pt_rec.auto_id,
pt_rec.channel_type,
pt_rec.action,
pt_rec.branch_code,
pt_rec.created_by,
pt_rec.created_date,
pt_rec.modified_by,
pt_rec.modified_date,
pt_rec.key_field_value,
pt_rec.menu_code,
pt_rec.menu_mode,
pt_rec.approve_status,
pt_rec.identifier_key,
pv_remark,
pt_rec.user_assigned,
pt_rec.is_processing,
pt_rec.send_time,
pt_rec.time_expire_waiting,
pt_rec.receive_time,
pt_rec.time_expire_process,
pt_rec.branch_level,
pt_rec.application_date,
pt_rec.corporate_id,
pt_rec.customer_type,
pt_rec.form_drop_type,
pt_rec.customer_id,
pt_rec.customer_name,
pt_rec.number_of_approval,
pt_rec.sequence,
pt_rec.user_id,
pt_rec.time_processing,
pt_rec.sla_processing,
v_number,
NULL,
NULL);

---------------------------------------------------------------------- INSERT
WITH SUSSCESSFULL -------------------------------------------------------
pt_rec.sequence := 0;

UPDATE gd_form_drop_pending_tasks e
SET row = pt_rec
WHERE e.auto_id = pt_rec.auto_id;

-- Notice l?i cho ngu?i t?o task ? chi nh?nh bi?t kq ph? duy?t
--START Lannq2_sua jira:24416 20220714
BEGIN
Select nvl(email,'test@vba.fpt.vn') into v_to_email
From gd_users_maintenance
where user_id = pt_rec.created_by
and nvl(corporate_id,'1') = nvl(pt_rec.corporate_id,'1') --
Lannq2_sua jira:24416 20220718
and deleted = 'N';
EXCEPTION WHEN OTHERS THEN v_to_email := 'test@vba.fpt.vn';
END;

sp_ins_noti_form_drop (PV_SITE => pt_rec.CUSTOMER_TYPE, --


Lannq2_add jira:24416 20220725
PV_MENU_CODE => '03430',
PV_SUB_MENU_CODE => '03430.02',
PV_NOTICE_TYPE => 'O',
PV_KEY_VALUE => pt_rec.auto_id,
pv_NOTICE_USER => pt_rec.created_by,
pv_CORPORATE_ID => pt_rec.corporate_id,
PV_CREATE_USER => pt_rec.user_assigned, --
Lannq2_sua jira:24416 20220726
PV_DEVICE_ID => NULL,
PV_EMAIL => v_to_email,
PV_CHANNEL_TYPE => pt_rec.channel_type
);

--END Lannq2_s?a jira:24416 20220714

EXCEPTION
WHEN OTHERS THEN
proc_log_error(p_target => 'FORM_DROP_BO',
p_message => 'update_lasr_approve - ERORR: ' ||
SQLCODE || ' - ' || SQLERRM || ' - ' ||
DBMS_UTILITY.format_error_backtrace,
p_sqlcode => SQLCODE,
p_msgid => NULL);
RAISE_APPLICATION_ERROR(SQLCODE, SQLCODE || ' - ' || SQLERRM);
END;
END;
--------------------------------------------------- chk_status_accept
----------------------------------------
PROCEDURE chk_status_accept(pv_approve_status VARCHAR2) IS
BEGIN
IF pv_approve_status IN ('3', '6')
THEN
sp_throw_exception(1203430, '');
END IF;
END;

--------------------------------------------------- accept
------------------------------------------------
/*VBA_EBANK_2019_THOP-21678 */
/*PROCEDURE accept(sessioninfo_username VARCHAR2,
pv_auto_id NUMBER) IS*/
PROCEDURE accept(sessioninfo_username VARCHAR2,
pv_auto_id NUMBER
,cur OUT pkg_data.cursor) IS
/*END*/
v_count NUMBER;
v_number NUMBER;
pt_rec gd_form_drop_pending_tasks%ROWTYPE;
v_fdr_total_tasks_rec gd_form_drop_total_tasks%ROWTYPE;
v_setup_object gd_form_drop_setup%rowtype;/*VBA_EBANK_2019_THOP-21678
20220609*/
v_approve_object gd_form_drop_approve%rowtype;/*VBA_EBANK_2019_THOP-21678
20220609*/
v_time_sla number;/*VBA_EBANK_2019_THOP-21678 */
v_to_email varchar2(50); --Lannq2_add jira:24416
20220707
v_check_gen_notice CHAR(1) DEFAULT 'N'; --Lannq2_add jira:24416
20220719

BEGIN
BEGIN

BEGIN
SELECT *
INTO pt_rec
FROM gd_form_drop_pending_tasks
WHERE auto_id = pv_auto_id;
EXCEPTION
WHEN NO_DATA_FOUND THEN
pt_rec := NULL;
END;

IF pt_rec.auto_id IS NOT NULL


THEN
PROC_VALIDATE_SESSION(pt_rec,sessioninfo_username);/*VBA_EBANK_2019_THOP-
24005*/
-- set value receive_time = SYSDATE, time_processing = receive_time + SLA
/*VBA_EBANK_2019_THOP-21678 20220609*/
/*pt_rec.receive_time := SYSDATE;
pt_rec.is_processing := '1';
pt_rec.time_expire_process := SYSDATE +
(1 / (60 * 24) * pt_rec.sla_processing);*/
/*END VBA_EBANK_2019_THOP-21678 20220609*/
/*VBA_EBANK_2019_THOP-23949 datnd15 20220624*/
SELECT *
INTO pt_rec
FROM gd_form_drop_pending_tasks
WHERE auto_id = pv_auto_id;
select count(1) into v_count from gd_parameter t where t.parameter_type =
'FORM_DROP' and t.parameter_code = pt_rec.menu_code and t.is_active = 'Y'
and (INSTR(t.channel_tenant_id, (pt_rec.channel_type||' - VN')) > 0);
IF v_count = 0 then
/*END VBA_EBANK_2019_THOP-23949 datnd15 20220624*/
SELECT COUNT(1)
INTO v_count
FROM users
WHERE INSTR(role, 'A') > 0
AND username = sessioninfo_username
AND status = 'A';
/*VBA_EBANK_2019_THOP-23949 datnd15 20220624*/
end if;
/*END VBA_EBANK_2019_THOP-23949 datnd15 20220624*/
IF v_count > 0
AND pt_rec.approve_status = '5'
THEN
pt_rec.approve_status := '6';
ELSE
pt_rec.approve_status := '3';
v_check_gen_notice := 'Y'; --Lannq2_add jira:24416 20220719
END IF;
/*VBA_EBANK_2019_THOP-21678 20220609*/
/*VBA_EBANK_2019_THOP-28270 20220920*/
--select * into v_setup_object from gd_form_drop_setup t where t.menu_code =
pt_rec.menu_code and t.channel_code = pt_rec.channel_type and t.customer_type =
pt_rec.customer_type and t.deleted = 'N';
select * into v_setup_object from gd_form_drop_setup t where t.menu_code =
pt_rec.menu_code and t.customer_type = pt_rec.customer_type and t.deleted = 'N';
/*END VBA_EBANK_2019_THOP-28270 20220920*/
IF pt_rec.approve_status = '3' then
IF pt_rec.branch_level = 'HO' then
select regexp_substr(v_setup_object.ho_received , '[^|]+',1,2) into
v_time_sla from dual;
ELSIF pt_rec.branch_level = 'L1' then
select regexp_substr(v_setup_object.l1_received, '[^|]+',1,2) into
v_time_sla from dual;
ELSE
select regexp_substr(v_setup_object.l2_received, '[^|]+',1,2) into
v_time_sla from dual;
END IF;
else
select t.sla_process into v_time_sla from gd_form_drop_approve t
where t.form_drop_setup_id = v_setup_object.auto_id and t.sequence =
pt_rec.sequence
/* VBA_EBANK_2019_THOP-23732 20220616 datnd15*/
--and t.number_of_approval = pt_rec.number_of_approval and t.branch_level =
pt_rec.branch_level;
and t.branch_level = pt_rec.branch_level;
/*END 23732*/
end if;
pt_rec.receive_time := SYSDATE;
pt_rec.is_processing := '1';
pt_rec.time_expire_process := SYSDATE +
(1 / (60 * 24) * v_time_sla);
/*END VBA_EBANK_2019_THOP-21678 20220609*/
BEGIN
SELECT *
INTO v_fdr_total_tasks_rec
FROM gd_form_drop_total_tasks a
WHERE a.user_id = pt_rec.user_id
AND TRUNC(a.created_date) = TRUNC(SYSDATE);
EXCEPTION
WHEN NO_DATA_FOUND THEN
v_fdr_total_tasks_rec := NULL;
END;

UPDATE gd_form_drop_pending_tasks e
SET row = pt_rec
WHERE e.auto_id = pt_rec.auto_id;

IF (v_fdr_total_tasks_rec.auto_id IS NOT NULL)


THEN
v_fdr_total_tasks_rec.total_task := v_fdr_total_tasks_rec.total_task + 1;

UPDATE gd_form_drop_total_tasks a
SET a.total_task = v_fdr_total_tasks_rec.total_task,
a.last_update = SYSDATE,
a.updated_by = sessioninfo_username
WHERE a.auto_id = v_fdr_total_tasks_rec.auto_id;
ELSE
INSERT INTO gd_form_drop_total_tasks
(auto_id,
user_id,
total_task,
created_date,
created_by,
last_update,
updated_by)
VALUES
(seq_gd_form_drop_total_tasks.NEXTVAL,
pt_rec.user_id,
1,
SYSDATE,
sessioninfo_username,
SYSDATE,
sessioninfo_username);
END IF;

v_number := seq_gd_form_drop_pending_tasks_hist.NEXTVAL();

INSERT INTO gd_form_drop_pending_tasks_his t


(t.auto_id,
t.channel_type,
t.action,
t.branch_code,
t.created_by,
t.created_date,
t.modified_by,
t.modified_date,
t.key_field_value,
t.menu_code,
t.menu_mode,
t.approve_status,
t.identifier_key,
t.remark,
t.user_assigned,
t.is_processing,
t.send_time,
t.time_expire_waiting,
t.receive_time,
t.time_expire_process,
t.branch_level,
t.application_date,
t.corporate_id,
t.customer_type,
t.form_drop_type,
t.customer_id,
t.customer_name,
t.number_of_approval,
t.sequence,
t.user_id,
t.time_processing,
t.sla_processing,
t.number_insert,
t.assign_from,
t.assign_by)
VALUES
(pt_rec.auto_id,
pt_rec.channel_type,
pt_rec.action,
pt_rec.branch_code,
pt_rec.created_by,
pt_rec.created_date,
pt_rec.modified_by,
pt_rec.modified_date,
pt_rec.key_field_value,
pt_rec.menu_code,
pt_rec.menu_mode,
pt_rec.approve_status,
pt_rec.identifier_key,
pt_rec.remark,
pt_rec.user_assigned,
pt_rec.is_processing,
pt_rec.send_time,
pt_rec.time_expire_waiting,
pt_rec.receive_time,
pt_rec.time_expire_process,
pt_rec.branch_level,
pt_rec.application_date,
pt_rec.corporate_id,
pt_rec.customer_type,
pt_rec.form_drop_type,
pt_rec.customer_id,
pt_rec.customer_name,
pt_rec.number_of_approval,
pt_rec.sequence,
pt_rec.user_id,
SYSDATE,
pt_rec.sla_processing,
v_number,
NULL,
NULL);
-- Notice l?i cho ngu?i t?o task bi?t task dc ti?p nh?n l?n d?u
--START Lannq2_s?a jira:24416 20220719
IF v_check_gen_notice = 'Y' THEN
BEGIN
Select nvl(email,'test@vba.fpt.vn') into v_to_email
From gd_users_maintenance
where user_id = pt_rec.created_by
and nvl(corporate_id,'1') = nvl(pt_rec.corporate_id,'1')
--Lannq2_sua jira:24416 20220718
and deleted = 'N';
EXCEPTION WHEN OTHERS THEN v_to_email:= 'test@vba.fpt.vn';
END;

sp_ins_noti_form_drop (PV_SITE => pt_rec.customer_type,


--Lannq2_sua jira:24416 20220725
PV_MENU_CODE => '03430',
PV_SUB_MENU_CODE => '03430.01',
PV_NOTICE_TYPE => 'O',
PV_KEY_VALUE => pt_rec.auto_id,
pv_NOTICE_USER => pt_rec.created_by,
pv_CORPORATE_ID => pt_rec.corporate_id,
PV_CREATE_USER => sessioninfo_username,
PV_DEVICE_ID => NULL,
PV_EMAIL => v_to_email,
PV_CHANNEL_TYPE => pt_rec.channel_type
);
END IF;
--END Lannq2_s?a jira:24416 20220719

END IF;
/*VBA_EBANK_2019_THOP-21678 */
OPEN CUR FOR
select TO_CHAR(v_time_sla) PARAM_VALUE from dual;
/*END*/
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
RAISE;
proc_log_error(p_target => 'FORM_DROP_BO',
p_message => 'accept - ERORR: ' ||
SQLCODE || ' - ' || SQLERRM || ' - ' ||
DBMS_UTILITY.format_error_backtrace,
p_sqlcode => SQLCODE,
p_msgid => NULL);
RAISE_APPLICATION_ERROR(SQLCODE, SQLCODE || ' - ' || SQLERRM);
END;
END;

--------------------------------------------------- reject
------------------------------------------------
/*VBA_EBANK_2019_THOP-24005*/
/*PROCEDURE reject(pv_auto_id NUMBER,
pv_remark VARCHAR2) IS*/
PROCEDURE reject(pv_auto_id NUMBER,
pv_remark VARCHAR2,
sessioninfo_username VARCHAR2) IS
/*END VBA_EBANK_2019_THOP-24005*/
v_count NUMBER;
v_number NUMBER;
is_marker VARCHAR2(5);
pt_rec gd_form_drop_pending_tasks%ROWTYPE;
tb_setup_rec gd_form_drop_setup%ROWTYPE;
tb_approve_rec gd_form_drop_approve%ROWTYPE;
--START Lannq2_s?a jira:24416 20220707
v_to_email varchar2(50);
--END Lannq2_s?a jira:24416 20220707
BEGIN
BEGIN
is_marker := 'N';

--get record in pending_task


SELECT *
INTO pt_rec
FROM gd_form_drop_pending_tasks
WHERE auto_id = pv_auto_id;
PROC_VALIDATE_SESSION(pt_rec,sessioninfo_username);/*VBA_EBANK_2019_THOP-
24005*/
SELECT COUNT(1)
INTO v_count
FROM gd_form_drop_pending_tasks_his t
WHERE t.auto_id = pv_auto_id
AND t.approve_status IN ('4', '7');

IF v_count = 0
THEN
pt_rec.number_of_approval := 0;
pt_rec.sequence := 0;
is_marker := 'Y';
END IF;

------------------------------------------------------------------
BEGIN
SELECT *
INTO tb_setup_rec
FROM gd_form_drop_setup
WHERE menu_code = pt_rec.menu_code
AND customer_type = pt_rec.customer_type
/* AND channel_code = pt_rec.channel_type VBA_EBANK_2019_THOP-21285*/
AND status = 'A';
EXCEPTION
WHEN NO_DATA_FOUND THEN
tb_setup_rec := NULL;
proc_log_error('pkg_form_drop.approve',
'no_data_found menu_code = ' || pt_rec.menu_code ||
',customer_type:' || pt_rec.customer_type ||
',channel_code:' || pt_rec.channel_type,
NULL,
NULL);
END;

IF tb_setup_rec.auto_id IS NOT NULL


OR is_marker = 'Y'
THEN
BEGIN
SELECT *
INTO tb_approve_rec
FROM gd_form_drop_approve
WHERE branch_level = pt_rec.branch_level -- HO
AND form_drop_setup_id = tb_setup_rec.auto_id --1403
AND sequence = pt_rec.sequence;
EXCEPTION
WHEN NO_DATA_FOUND THEN
tb_approve_rec := NULL;
proc_log_error('pkg_form_drop.approve',
'no_data_found branch_level = ' ||
pt_rec.branch_level || ',customer_type:' ||
tb_setup_rec.auto_id,
NULL,
NULL);
END;

IF tb_approve_rec.auto_id IS NOT NULL


OR is_marker = 'Y'
THEN
/*
IF v_count > 0
THEN
IF pt_rec.number_of_approval = tb_approve_rec.number_of_approval
THEN
pt_rec.number_of_approval := 0;
pt_rec.sequence := pt_rec.sequence + 1;
END IF;

IF pt_rec.number_of_approval < tb_approve_rec.number_of_approval


THEN
pt_rec.number_of_approval := pt_rec.number_of_approval + 1;
END IF;
END IF;
*/
pt_rec.time_processing := SYSDATE;
pt_rec.is_processing := '2';
pt_rec.approve_status := '9';
v_number := seq_gd_form_drop_pending_tasks_hist.NEXTVAL();

INSERT INTO gd_form_drop_pending_tasks_his t


(t.auto_id,
t.channel_type,
t.action,
t.branch_code,
t.created_by,
t.created_date,
t.modified_by,
t.modified_date,
t.key_field_value,
t.menu_code,
t.menu_mode,
t.approve_status,
t.identifier_key,
t.remark,
t.user_assigned,
t.is_processing,
t.send_time,
t.time_expire_waiting,
t.receive_time,
t.time_expire_process,
t.branch_level,
t.application_date,
t.corporate_id,
t.customer_type,
t.form_drop_type,
t.customer_id,
t.customer_name,
t.number_of_approval,
t.sequence,
t.user_id,
t.time_processing,
t.sla_processing,
t.number_insert,
t.assign_from,
t.assign_by)
VALUES
(pt_rec.auto_id,
pt_rec.channel_type,
pt_rec.action,
pt_rec.branch_code,
pt_rec.created_by,
pt_rec.created_date,
pt_rec.modified_by,
pt_rec.modified_date,
pt_rec.key_field_value,
pt_rec.menu_code,
pt_rec.menu_mode,
pt_rec.approve_status,
pt_rec.identifier_key,
pv_remark,
pt_rec.user_assigned,
pt_rec.is_processing,
pt_rec.send_time,
pt_rec.time_expire_waiting,
pt_rec.receive_time,
pt_rec.time_expire_process,
pt_rec.branch_level,
pt_rec.application_date,
pt_rec.corporate_id,
pt_rec.customer_type,
pt_rec.form_drop_type,
pt_rec.customer_id,
pt_rec.customer_name,
pt_rec.number_of_approval,
pt_rec.sequence,
pt_rec.user_id,
pt_rec.time_processing,
pt_rec.sla_processing,
v_number,
NULL,
NULL);

---------------------------------------------------------
pt_rec.time_processing := SYSDATE;
pt_rec.sequence := '0';

UPDATE gd_form_drop_pending_tasks e
SET row = pt_rec
WHERE e.auto_id = pt_rec.auto_id;

-- Notice l?i cho ngu?i t?o task ? chi nh?nh bi?t kq b? t? ch?i
--START Lannq2_s?a jira:24416 20220714

BEGIN
Select nvl(email,'test@vba.fpt.vn') into v_to_email
From gd_users_maintenance
where user_id = pt_rec.created_by
and nvl(corporate_id,'1') = nvl(pt_rec.corporate_id,'1')
--Lannq2_sua jira:24416 20220718
and deleted = 'N';
EXCEPTION WHEN NO_DATA_FOUND THEN
v_to_email := 'test@vba.fpt.vn';
END;

sp_ins_noti_form_drop (PV_SITE => pt_rec.customer_type,


--Lannq2_add jira:24416 20220725
PV_MENU_CODE => '03430',
PV_SUB_MENU_CODE => '03430.02',
PV_NOTICE_TYPE => 'O',
PV_KEY_VALUE => pt_rec.auto_id,
pv_NOTICE_USER => pt_rec.created_by,
pv_CORPORATE_ID => pt_rec.corporate_id,
PV_CREATE_USER => sessioninfo_username,
PV_DEVICE_ID => NULL,
PV_EMAIL => v_to_email,
PV_CHANNEL_TYPE => pt_rec.channel_type
);
--END Lannq2_s?a jira:24416 20220714

ELSE
sp_throw_exception(2306, '');
END IF;
ELSE
sp_throw_exception(2307, '');
END IF;
EXCEPTION
WHEN OTHERS THEN
proc_log_error(p_target => 'FORM_DROP_BO',
p_message => 'accept - ERORR: ' ||
SQLCODE || ' - ' || SQLERRM || ' - ' ||
DBMS_UTILITY.format_error_backtrace,
p_sqlcode => SQLCODE,
p_msgid => NULL);
RAISE_APPLICATION_ERROR(SQLCODE, SQLCODE || ' - ' || SQLERRM);
END;
END;

--------------------------------------------------- auto_assign_task
----------------------------------
PROCEDURE auto_assign_task(pv_channel_type VARCHAR2,
pv_menu_code VARCHAR2,
pv_approve_status VARCHAR2 DEFAULT 'NEW',
pv_is_processing VARCHAR2 DEFAULT '0',
pv_customer_type VARCHAR2,
pv_branch_level VARCHAR2) IS
CURSOR c_pending_tasks IS
SELECT *
FROM gd_form_drop_pending_tasks a
WHERE a.approve_status = pv_approve_status
AND a.menu_code = pv_menu_code
/* AND a.channel_type = pv_channel_type VBA_EBANK_2019_THOP-21285*/
and a.customer_type = pv_customer_type -- VBA_EBANK_2019_THOP-30292
DATND15 28102022
AND a.branch_level = pv_branch_level
AND TRUNC(a.application_date) <= TRUNC(SYSDATE)
AND a.is_processing = pv_is_processing
AND a.send_time IS NULL
AND a.time_expire_waiting IS NULL
FOR UPDATE OF a.user_assigned, a.user_id, a.send_time,
a.time_expire_waiting, a.approve_status, a.sla_processing;

/* COMMENT BY DUCDV5*/

v_row_data gd_form_drop_pending_tasks%ROWTYPE;
v_fdr_param fdr_param_type;
v_user_task_tbl user_task_table_type := user_task_table_type();
l_idx INTEGER;
v_branch_id NUMBER;
v_user_name VARCHAR2(50);
v_fdr_param_exp EXCEPTION;
v_not_found_user_exp EXCEPTION;
v_count_user NUMBER;
v_flag_assign BOOLEAN;
v_flag_update BOOLEAN := FALSE;
v_to_email VARCHAR2 (50); --START Lannq2_s?a jira:24416 20220701

BEGIN

-- get param form drop

v_fdr_param := fdr_param_type.fnc_get_fdr_param(pv_menu_code,
pv_customer_type,
pv_channel_type,
pv_branch_level,
NULL,
'M',
NULL,
NULL);

IF (v_fdr_param IS NOT NULL)


THEN
proc_log_error('pkg_form_drop.auto_assign_task',
'//begin process pv_menu_code = ' || pv_menu_code ||
', pv_channel_type = ' || pv_channel_type ||
', pv_customer_type = ' || pv_customer_type ||
',pv_branch_level = ' || pv_branch_level,
NULL,
NULL);
/*
IF (pv_branch_level = 'HO' AND v_fdr_param.ho_group IS NOT NULL)
THEN
v_user_task_tbl :=
fnc_get_list_user (v_fdr_param.ho_group, v_role_maker);
ELSIF ( pv_branch_level = 'L1'
AND v_fdr_param.l1_group IS NOT NULL)
THEN
v_user_task_tbl :=
fnc_get_list_user (v_fdr_param.l1_group, v_role_maker);
ELSIF ( pv_branch_level = 'L2'
AND v_fdr_param.l2_group IS NOT NULL)
THEN
v_user_task_tbl :=
fnc_get_list_user (v_fdr_param.l2_group, v_role_maker);
ELSE
v_user_task_tbl := NULL;
END IF;
*/
v_user_task_tbl := v_fdr_param.tbl_user_task;

IF v_user_task_tbl IS NOT NULL


THEN

OPEN c_pending_tasks;

LOOP
FETCH c_pending_tasks
INTO v_row_data;

EXIT WHEN c_pending_tasks%NOTFOUND;


v_count_user := v_user_task_tbl.COUNT;
l_idx := v_user_task_tbl.FIRST;
v_branch_id := v_user_task_tbl(l_idx).branch_id;
v_user_name := v_user_task_tbl(l_idx).user_name;
v_flag_assign := FALSE;

/* begin 20220127 CANGND jira: VBA_EBANK_2019_THOP-19226 */


/* WHILE (v_flag_assign = FALSE AND l_idx < v_count_user) */
WHILE (v_flag_assign = FALSE AND l_idx <= v_count_user)
/* END 20220127 CANGND jira: VBA_EBANK_2019_THOP-19226 */
LOOP
IF (TO_NUMBER(v_branch_id) = TO_NUMBER(v_row_data.branch_code))
AND fn_check_busy(v_user_name, v_row_data.created_date) = 0
THEN
v_flag_assign := TRUE;
/* begin 20220127 CANGND jira: VBA_EBANK_2019_THOP-19226 */
/* ELSE */
ELSE
l_idx := l_idx + 1;
/*VBA_EBANK_2019_THOP-25485*/
--IF l_idx < v_count_user THEN
IF l_idx <= v_count_user THEN
/*END VBA_EBANK_2019_THOP-25485*/
v_branch_id := v_user_task_tbl(l_idx).branch_id;
v_user_name := v_user_task_tbl(l_idx).user_name;
END IF;

/* END 20220127 CANGND jira: VBA_EBANK_2019_THOP-19226 */


/* begin 20220127 CANGND jira: VBA_EBANK_2019_THOP-19226
l_idx := l_idx + 1;
v_branch_id := v_user_task_tbl(l_idx).branch_id;
v_user_name := v_user_task_tbl(l_idx).user_name;*/
END IF;
END LOOP;
DBMS_OUTPUT.put_line('begin update task for user ' ||
v_user_name);
IF (v_user_name IS NOT NULL AND v_flag_assign = TRUE)
THEN
v_pending_task_id := v_row_data.auto_id;

UPDATE gd_form_drop_pending_tasks a
SET a.user_assigned = v_user_task_tbl(l_idx).user_name,
a.user_id = v_user_task_tbl(l_idx).user_id,
a.send_time = SYSDATE,
a.time_expire_waiting = SYSDATE + v_fdr_param.sla_waiting_mkr /
(60 * 24),
a.approve_status = '2',
a.sla_processing = v_fdr_param.sla_process_mkr
WHERE a.auto_id = v_pending_task_id;

BEGIN
Select nvl(email,'test@vba.fpt.vn') into v_to_email
From users
where user_id = v_user_task_tbl(l_idx).user_id --Lannq2_s?a
jira:24416 20220714
and deleted = 'N'; --Lannq2_s?a
jira:24416 20220714
EXCEPTION WHEN NO_DATA_FOUND THEN
v_to_email := 'test@vba.fpt.vn';
END;
sp_ins_noti_form_drop (PV_SITE => 'BO', --
Lannq2_add jira:24416 20220725
PV_MENU_CODE => '03430',
PV_SUB_MENU_CODE => '03430.01',
PV_NOTICE_TYPE => 'T',
PV_KEY_VALUE => v_pending_task_id,
pv_NOTICE_USER =>
v_user_task_tbl(l_idx).user_name,
pv_CORPORATE_ID => NULL,
PV_CREATE_USER => v_row_data.created_by,
PV_DEVICE_ID => NULL,
PV_EMAIL => v_to_email,
PV_CHANNEL_TYPE => v_row_data.channel_type
);
INSERT INTO gd_form_drop_assign_task_log
(auto_id,
pending_task_id,
user_assigned,
remark,
created_date)
VALUES
(seq_fdr_assign_task_log.NEXTVAL,
v_pending_task_id,
v_user_task_tbl(l_idx).user_name,
'task ' || v_pending_task_id || ' assign to ' ||
v_user_task_tbl(l_idx)
.user_name,
SYSDATE);
DBMS_OUTPUT.put_line('end update task for user ' ||
v_user_task_tbl(l_idx)
.user_name || ', auto_id = ' ||
v_row_data.auto_id);

v_user_task_tbl(l_idx).total_task := v_user_task_tbl(l_idx)
.total_task + 1;
SELECT CAST(MULTISET (SELECT user_task_type(user_id,
user_name,
branch_id,
total_task,
total_task_process)
FROM TABLE(v_user_task_tbl)
ORDER BY total_task,
total_task_process -- note: here we have a very
simple sort-operation;
-- it could be much more complex obviously
) AS user_task_table_type)
INTO v_user_task_tbl
FROM DUAL;

DBMS_OUTPUT.put_line('result:');

LOOP
DBMS_OUTPUT.put_line('** ' || v_user_task_tbl(l_idx)
.user_name || ' branch ' ||
v_user_task_tbl(l_idx)
.branch_id || ' task: ' ||
v_user_task_tbl(l_idx)
.total_task || ' task process: ' ||
v_user_task_tbl(l_idx)
.total_task_process);
l_idx := v_user_task_tbl.NEXT(l_idx);
EXIT WHEN l_idx IS NULL;
END LOOP;

v_flag_update := TRUE;
END IF;
END LOOP;

CLOSE c_pending_tasks;

IF v_flag_update = TRUE
THEN
COMMIT;
END IF;
ELSE
/*VBA_EBANK_2019_THOP-25485 DATND15 20220729*/
--RAISE v_not_found_user_exp;
v_err_msg := 'v_user_task_tbl not found ' || 'menu_code:' ||
pv_menu_code || ',customer_type:' || pv_customer_type ||
',channel_type:' || pv_channel_type || ',branch_level:' ||
pv_branch_level;
proc_log_error('pkg_form_drop.auto_assign_task',
v_err_msg,
NULL,
NULL);
/*END VBA_EBANK_2019_THOP-25485 DATND15 20220729*/
/*VBA_EBANK_2019_THOP-25485 DATND15 20220802*/
COMMIT;
/*END VBA_EBANK_2019_THOP-25485 DATND15 20220802*/
END IF;
proc_log_error('pkg_form_drop.auto_assign_task',
'//end process pv_menu_code = ' || pv_menu_code ||
', pv_channel_type = ' || pv_channel_type ||
', pv_customer_type = ' || pv_customer_type ||
',pv_branch_level = ' || pv_branch_level,
NULL,
NULL);
ELSE
/*VBA_EBANK_2019_THOP-25485 DATND15 20220729*/
--RAISE v_fdr_param_exp;
v_err_msg := 'gd_form_drop_setup not config ' || 'menu_code:' ||
pv_menu_code || ',customer_type:' || pv_customer_type ||
',channel_type:' || pv_channel_type || ',branch_level:' ||
pv_branch_level;
proc_log_error('pkg_form_drop.auto_assign_task',
v_err_msg,
NULL,
NULL);
/*END VBA_EBANK_2019_THOP-25485 DATND15 20220729*/
/*VBA_EBANK_2019_THOP-25485 DATND15 20220802*/
COMMIT;
/*END VBA_EBANK_2019_THOP-25485 DATND15 20220802*/
END IF;
EXCEPTION
/*VBA_EBANK_2019_THOP-25485 DATND15 20220729*/
/*WHEN v_fdr_param_exp THEN
v_err_msg := 'gd_form_drop_setup not config ' || 'menu_code:' ||
pv_menu_code || ',customer_type:' || pv_customer_type ||
',channel_type:' || pv_channel_type || ',branch_level:' ||
pv_branch_level;
proc_log_error('pkg_form_drop.auto_assign_task',
v_err_msg,
NULL,
NULL);
ROLLBACK;
WHEN v_not_found_user_exp THEN
v_err_msg := 'v_user_task_tbl not found ' || 'menu_code:' ||
pv_menu_code || ',customer_type:' || pv_customer_type ||
',channel_type:' || pv_channel_type || ',branch_level:' ||
pv_branch_level;
proc_log_error('pkg_form_drop.auto_assign_task',
v_err_msg,
NULL,
NULL);
ROLLBACK;*/
/*END VBA_EBANK_2019_THOP-25485 DATND15 20220729*/
WHEN OTHERS THEN
proc_log_error('pkg_form_drop.auto_assign_task',
SQLERRM,
SQLCODE,
NULL);
ROLLBACK;
END;

PROCEDURE re_assign_task(pv_channel_type VARCHAR2,


pv_menu_code VARCHAR2,
pv_customer_type VARCHAR2,
pv_branch_level VARCHAR2,
pv_user_type VARCHAR2) IS
BEGIN
proc_log_error('pkg_form_drop.re_assign_task',
'//begin process pv_menu_code = ' || pv_menu_code ||
', pv_channel_type = ' || pv_channel_type ||
', pv_customer_type = ' || pv_customer_type ||
',pv_branch_level = ' || pv_branch_level,
NULL,
NULL);

IF pv_user_type = v_role_maker
THEN
re_assign_task_maker(pv_channel_type,
pv_menu_code,
pv_customer_type,
pv_branch_level,
pv_user_type);
ELSE
re_assign_task_checker(pv_channel_type,
pv_menu_code,
pv_customer_type,
pv_branch_level,
pv_user_type);
END IF;
END;

PROCEDURE re_assign_task_checker(pv_channel_type VARCHAR2,


pv_menu_code VARCHAR2,
pv_customer_type VARCHAR2,
pv_branch_level VARCHAR2,
pv_user_type VARCHAR2) IS
v_row_data gd_form_drop_pending_tasks%ROWTYPE;

CURSOR c_pending_tasks IS
SELECT *
FROM gd_form_drop_pending_tasks a
WHERE a.approve_status = '5'
AND a.menu_code = pv_menu_code
/* AND a.channel_type = pv_channel_type VBA_EBANK_2019_THOP-21285*/
and a.customer_type = pv_customer_type -- VBA_EBANK_2019_THOP-30292
DATND15 28102022
AND a.branch_level = pv_branch_level
AND a.is_processing = '0'
AND a.send_time IS NOT NULL
AND a.time_expire_waiting IS NOT NULL
AND a.time_expire_waiting < SYSDATE
FOR UPDATE OF a.user_assigned, a.user_id, a.send_time,
a.time_expire_waiting, a.time_expire_waiting, a.approve_status, a.sla_processing;

v_fdr_param fdr_param_type;
v_user_task user_task_type;
v_param_setup_exp EXCEPTION;
v_not_found_user_exp EXCEPTION;
v_err_msg VARCHAR(1000);
v_user_name VARCHAR2(50);
--START Lannq2_s?a jira:24416 20220705
v_to_email varchar2(50);
--END Lannq2_s?a jira:24416 20220705
BEGIN

OPEN c_pending_tasks;

LOOP
FETCH c_pending_tasks
INTO v_row_data;

EXIT WHEN c_pending_tasks%NOTFOUND;

v_fdr_param := fdr_param_type.fnc_get_fdr_param(pv_menu_code,
pv_customer_type,
pv_channel_type,
pv_branch_level,
v_row_data.branch_code,
pv_user_type,
v_row_data.sequence,

v_row_data.number_of_approval);

IF (v_fdr_param IS NOT NULL)


THEN
v_user_task := v_fdr_param.user_task;
v_user_name := v_user_task.user_name;

IF v_user_name <> NVL(v_row_data.user_assigned, ' ')


THEN
v_pending_task_id := v_row_data.auto_id;

UPDATE gd_form_drop_pending_tasks a
SET a.user_assigned = v_user_name,
a.user_id = v_user_task.user_id,
a.send_time = SYSDATE,
a.time_expire_waiting = SYSDATE + v_fdr_param.sla_waiting_apr /
(60 * 24),
a.approve_status = '5',
a.sla_processing = v_fdr_param.sla_process_apr
WHERE a.auto_id = v_pending_task_id;

BEGIN
Select nvl(email,'test@vba.fpt.vn') into v_to_email
From users
where user_id = v_user_task.user_id --Lannq2_s?a jira:24416
20220714
and deleted = 'N'; --Lannq2_s?a jira:24416
20220714
EXCEPTION WHEN NO_DATA_FOUND THEN
v_to_email := 'test@vba.fpt.vn';
END;

sp_ins_noti_form_drop (PV_SITE => 'BO', --


Lannq2_add jira:24416 20220725
PV_MENU_CODE => '03430',
PV_SUB_MENU_CODE => '03430.01',
PV_NOTICE_TYPE => 'T',
PV_KEY_VALUE => v_pending_task_id,
pv_NOTICE_USER => v_user_name,
pv_CORPORATE_ID => NULL,
PV_CREATE_USER => v_row_data.created_by,
PV_DEVICE_ID => NULL,
PV_EMAIL => v_to_email,
PV_CHANNEL_TYPE => v_row_data.channel_type
);
/* insert history */

INSERT INTO gd_form_drop_assign_task_log


(auto_id,
pending_task_id,
remark,
created_date,
user_assigned,
forward_from)
VALUES
(seq_fdr_assign_task_log.NEXTVAL,
v_pending_task_id,
'task ' || v_pending_task_id || ' re assign from user ' ||
v_row_data.user_assigned || ' to user ' || v_user_name,
SYSDATE,
v_user_name,
v_row_data.user_assigned);
ELSE
/*VBA_EBANK_2019_THOP-25485 DATND15 20220729*/
--RAISE v_not_found_user_exp;
v_err_msg := 'gd_form_drop_setup not config ' || 'menu_code:' ||
pv_menu_code || ',customer_type:' || pv_customer_type ||
',channel_type:' || pv_channel_type || ',branch_level:' ||
pv_branch_level;
proc_log_error('pkg_form_drop.re_assign_task_checker',
v_err_msg,
NULL,
NULL);
/*END VBA_EBANK_2019_THOP-25485 DATND15 20220729*/
END IF;
ELSE
/*VBA_EBANK_2019_THOP-25485 DATND15 20220729*/
--RAISE v_param_setup_exp;
v_err_msg := 'gd_form_drop_setup not config ' || 'menu_code:' ||
pv_menu_code || ',customer_type:' || pv_customer_type ||
',channel_type:' || pv_channel_type || ',branch_level:' ||
pv_branch_level;
proc_log_error('pkg_form_drop.re_assign_task_checker',
v_err_msg,
NULL,
NULL);
/*END VBA_EBANK_2019_THOP-25485 DATND15 20220729*/
END IF;
END LOOP;

CLOSE c_pending_tasks;

COMMIT;
EXCEPTION
/*VBA_EBANK_2019_THOP-25485 DATND15 20220729*/
/*WHEN v_param_setup_exp THEN
v_err_msg := 'gd_form_drop_setup not config ' || 'menu_code:' ||
pv_menu_code || ',customer_type:' || pv_customer_type ||
',channel_type:' || pv_channel_type || ',branch_level:' ||
pv_branch_level;
proc_log_error('pkg_form_drop.re_assign_task_checker',
v_err_msg,
NULL,
NULL);
WHEN v_not_found_user_exp THEN
v_err_msg := 'gd_form_drop_setup not config ' || 'menu_code:' ||
pv_menu_code || ',customer_type:' || pv_customer_type ||
',channel_type:' || pv_channel_type || ',branch_level:' ||
pv_branch_level;
proc_log_error('pkg_form_drop.re_assign_task_checker',
v_err_msg,
NULL,
NULL);*/
/*END VBA_EBANK_2019_THOP-25485 DATND15 20220729*/
WHEN OTHERS THEN
ROLLBACK;
proc_log_error('pkg_form_drop.re_assign_task_checker',
SQLERRM,
SQLCODE,
NULL);
RAISE;
END;

--------------------------------------------------- re_assign_task
------------------------------------------------
PROCEDURE re_assign_task_maker(pv_channel_type VARCHAR2,
pv_menu_code VARCHAR2,
pv_customer_type VARCHAR2,
pv_branch_level VARCHAR2,
pv_user_type VARCHAR2) IS
v_row_data gd_form_drop_pending_tasks%ROWTYPE;

CURSOR c_pending_tasks IS
SELECT *
FROM gd_form_drop_pending_tasks a
WHERE a.approve_status = '2'
AND a.menu_code = pv_menu_code
/* AND a.channel_type = pv_channel_type VBA_EBANK_2019_THOP-21285*/
and a.customer_type = pv_customer_type -- VBA_EBANK_2019_THOP-30292
DATND15 28102022
AND a.branch_level = pv_branch_level
AND a.is_processing = '0'
AND a.send_time IS NOT NULL
AND a.time_expire_waiting IS NOT NULL
AND a.time_expire_waiting < SYSDATE
FOR UPDATE OF a.user_assigned, a.user_id, a.send_time,
a.time_expire_waiting, a.time_expire_waiting, a.approve_status, a.sla_processing;

v_fdr_param fdr_param_type;
v_user_task_tbl user_task_table_type := user_task_table_type();
l_idx INTEGER;
v_param_setup_exp EXCEPTION;
v_not_found_user_exp EXCEPTION;
v_err_msg VARCHAR(1000);
v_count_user NUMBER;
v_branch_id NUMBER;
v_user_name VARCHAR2(50);
v_flag_assign BOOLEAN;
--START Lannq2_s?a jira:24416 20220705
v_to_email varchar2(50);
--END Lannq2_s?a jira:24416 20220705
BEGIN
v_fdr_param := fdr_param_type.fnc_get_fdr_param(pv_menu_code,
pv_customer_type,
pv_channel_type,
pv_branch_level,
NULL,
pv_user_type,
NULL,
NULL);

IF (v_fdr_param IS NOT NULL)


THEN
proc_log_error('pkg_form_drop.re_assign_task_maker',
'//begin process pv_menu_code = ' || pv_menu_code ||
', pv_channel_type = ' || pv_channel_type ||
', pv_customer_type = ' || pv_customer_type ||
',pv_branch_level = ' || pv_branch_level,
NULL,
NULL);
/*
IF (pv_branch_level = 'HO' AND v_fdr_param.ho_group IS NOT NULL)
THEN
v_user_task_tbl :=
fnc_get_list_user (v_fdr_param.ho_group, pv_user_type);
ELSIF ( pv_branch_level = 'L1'
AND v_fdr_param.l1_group IS NOT NULL)
THEN
v_user_task_tbl :=
fnc_get_list_user (v_fdr_param.l1_group, pv_user_type);
ELSIF ( pv_branch_level = 'L2'
AND v_fdr_param.l2_group IS NOT NULL)
THEN
v_user_task_tbl :=
fnc_get_list_user (v_fdr_param.l2_group, pv_user_type);
ELSE
v_user_task_tbl := NULL;
END IF;
*/

v_user_task_tbl := v_fdr_param.tbl_user_task;

IF v_user_task_tbl IS NOT NULL


THEN
OPEN c_pending_tasks;

LOOP
FETCH c_pending_tasks
INTO v_row_data;

EXIT WHEN c_pending_tasks%NOTFOUND;

v_count_user := v_user_task_tbl.COUNT;
l_idx := v_user_task_tbl.FIRST;
v_branch_id := v_user_task_tbl(l_idx).branch_id;
v_user_name := v_user_task_tbl(l_idx).user_name;
v_flag_assign := FALSE;
/* begin 20220127 CANGND jira: VBA_EBANK_2019_THOP-19226 */
/* WHILE (v_flag_assign = FALSE AND
v_user_name <> NVL(v_row_data.user_assigned, '') AND
l_idx < v_count_user)*/
/*VBA_EBANK_2019_THOP-25485 CANGND 20220812*/
/*WHILE (v_flag_assign = FALSE AND
v_user_name <> NVL(v_row_data.user_assigned, '') AND
l_idx <= v_count_user)*/
WHILE (v_flag_assign = FALSE AND
l_idx <= v_count_user)
/*END VBA_EBANK_2019_THOP-25485 CANGND 20220812*/
/* END 20220127 CANGND jira: VBA_EBANK_2019_THOP-19226 */

LOOP
/*VBA_EBANK_2019_THOP-25485 CANGND 20220812*/
/*IF (TO_NUMBER(v_branch_id) = TO_NUMBER(v_row_data.branch_code))
AND fn_check_busy(v_user_name, v_row_data.created_date) = 0
THEN*/
IF (TO_NUMBER(v_branch_id) = TO_NUMBER(v_row_data.branch_code)) AND
v_user_name <> NVL(v_row_data.user_assigned, '')
AND fn_check_busy(v_user_name, v_row_data.created_date) = 0
THEN
/*END VBA_EBANK_2019_THOP-25485 CANGND 20220812*/
v_flag_assign := TRUE;
/* begin 20220127 CANGND jira: VBA_EBANK_2019_THOP-19226 */
/* ELSE */
ELSE
l_idx := l_idx + 1;
/*VBA_EBANK_2019_THOP-25485*/
--IF l_idx < v_count_user THEN
IF l_idx <= v_count_user THEN
/*END VBA_EBANK_2019_THOP-25485*/
v_branch_id := v_user_task_tbl(l_idx).branch_id;
v_user_name := v_user_task_tbl(l_idx).user_name;
END IF;

/* END 20220127 CANGND jira: VBA_EBANK_2019_THOP-19226 */

/* begin 20220127 CANGND jira: VBA_EBANK_2019_THOP-19226


l_idx := l_idx + 1;
v_branch_id := v_user_task_tbl(l_idx).branch_id;
v_user_name := v_user_task_tbl(l_idx).user_name;*/
END IF;
END LOOP;

/*
DBMS_OUTPUT.put_line('begin update task for user ' ||
v_user_task_tbl(l_idx)
.user_name);
*/
IF (v_user_name IS NOT NULL AND v_flag_assign = TRUE)
THEN
v_pending_task_id := v_row_data.auto_id;
DBMS_OUTPUT.put_line('update task for user ' || v_user_task_tbl(l_idx)
.user_name);

UPDATE gd_form_drop_pending_tasks a
SET a.user_assigned = v_user_task_tbl(l_idx).user_name,
a.user_id = v_user_task_tbl(l_idx).user_id,
a.send_time = SYSDATE,
a.time_expire_waiting = SYSDATE + v_fdr_param.sla_waiting_mkr /
(60 * 24),
a.approve_status = '2',
a.sla_processing = v_fdr_param.sla_process_mkr
WHERE a.auto_id = v_pending_task_id;

--START Lannq2_add jira:24416 20220714


BEGIN
Select nvl(email,'test@vba.fpt.vn') into v_to_email
From users
where user_id = v_user_task_tbl(l_idx).user_id
and deleted = 'N';
EXCEPTION WHEN NO_DATA_FOUND THEN
v_to_email := 'test@vba.fpt.vn';
END;

sp_ins_noti_form_drop (PV_SITE => 'BO', --


Lannq2_add jira:24416 20220725
PV_MENU_CODE => '03430',
PV_SUB_MENU_CODE => '03430.01',
PV_NOTICE_TYPE => 'T',
PV_KEY_VALUE => v_pending_task_id,
pv_NOTICE_USER =>
v_user_task_tbl(l_idx).user_name,
pv_CORPORATE_ID => NULL,
PV_CREATE_USER => v_row_data.created_by,
PV_DEVICE_ID => NULL,
PV_EMAIL => v_to_email,
PV_CHANNEL_TYPE => v_row_data.channel_type
);
--END Lannq2_add jira:24416 20220714

/* insert history */

INSERT INTO gd_form_drop_assign_task_log


(auto_id,
pending_task_id,
remark,
created_date,
user_assigned,
forward_from)
VALUES
(seq_fdr_assign_task_log.NEXTVAL,
v_pending_task_id,
'task ' || v_pending_task_id || ' re assign from user ' ||
v_row_data.user_assigned || ' to user ' || v_user_task_tbl(l_idx)
.user_name,
SYSDATE,
v_user_task_tbl(l_idx).user_name,
v_row_data.user_assigned);

v_user_task_tbl(l_idx).total_task := v_user_task_tbl(l_idx)
.total_task + 1;

SELECT CAST(MULTISET (SELECT user_task_type(user_id,


user_name,
branch_id,
total_task,
total_task_process)
FROM TABLE(v_user_task_tbl)
ORDER BY total_task,
total_task_process -- note: here we have a very
simple sort-operation;
-- it could be much more complex obviously
) AS user_task_table_type)
INTO v_user_task_tbl
FROM DUAL;

DBMS_OUTPUT.put_line('result:');

LOOP
DBMS_OUTPUT.put_line('** ' || v_user_task_tbl(l_idx)
.user_name || ' branch ' ||
v_user_task_tbl(l_idx)
.branch_id || ' task: ' ||
v_user_task_tbl(l_idx)
.total_task || ' task process: ' ||
v_user_task_tbl(l_idx)
.total_task_process);
l_idx := v_user_task_tbl.NEXT(l_idx);
EXIT WHEN l_idx IS NULL;
END LOOP;
END IF;
END LOOP;

CLOSE c_pending_tasks;

COMMIT;
ELSE
/*VBA_EBANK_2019_THOP-25485 DATND15 20220729*/
--RAISE v_not_found_user_exp;
v_err_msg := 'gd_form_drop_setup not config ' || 'menu_code:' ||
pv_menu_code || ',customer_type:' || pv_customer_type ||
',channel_type:' || pv_channel_type || ',branch_level:' ||
pv_branch_level;
proc_log_error('pkg_form_drop.re_assign_task_maker',
v_err_msg,
NULL,
NULL);
/*END VBA_EBANK_2019_THOP-25485 DATND15 20220729*/
/*VBA_EBANK_2019_THOP-25485 DATND15 20220802*/
COMMIT;
/*END VBA_EBANK_2019_THOP-25485 DATND15 20220802*/
END IF;

proc_log_error('pkg_form_drop.re_assign_task_maker',
'//end process pv_menu_code = ' || pv_menu_code ||
', pv_channel_type = ' || pv_channel_type ||
', pv_customer_type = ' || pv_customer_type ||
',pv_branch_level = ' || pv_branch_level,
NULL,
NULL);
ELSE
/*VBA_EBANK_2019_THOP-25485 DATND15 20220729*/
--RAISE v_param_setup_exp;
v_err_msg := 'gd_form_drop_setup not config ' || 'menu_code:' ||
pv_menu_code || ',customer_type:' || pv_customer_type ||
',channel_type:' || pv_channel_type || ',branch_level:' ||
pv_branch_level;
proc_log_error('pkg_form_drop.re_assign_task_maker',
v_err_msg,
NULL,
NULL);
/*END VBA_EBANK_2019_THOP-25485 DATND15 20220729*/
/*VBA_EBANK_2019_THOP-25485 DATND15 20220802*/
COMMIT;
/*END VBA_EBANK_2019_THOP-25485 DATND15 20220802*/
END IF;
EXCEPTION
/*VBA_EBANK_2019_THOP-25485 DATND15 20220729*/
/* WHEN v_param_setup_exp THEN
v_err_msg := 'gd_form_drop_setup not config ' || 'menu_code:' ||
pv_menu_code || ',customer_type:' || pv_customer_type ||
',channel_type:' || pv_channel_type || ',branch_level:' ||
pv_branch_level;
proc_log_error('pkg_form_drop.re_assign_task_maker',
v_err_msg,
NULL,
NULL);
WHEN v_not_found_user_exp THEN
v_err_msg := 'gd_form_drop_setup not config ' || 'menu_code:' ||
pv_menu_code || ',customer_type:' || pv_customer_type ||
',channel_type:' || pv_channel_type || ',branch_level:' ||
pv_branch_level;
proc_log_error('pkg_form_drop.re_assign_task_maker',
v_err_msg,
NULL,
NULL);*/
/*END VBA_EBANK_2019_THOP-25485 DATND15 20220729*/
WHEN OTHERS THEN
ROLLBACK;
proc_log_error('pkg_form_drop.re_assign_task_maker',
SQLERRM,
SQLCODE,
NULL);
RAISE;
END;

--------------------------------------------------- fnc_get_user
------------------------------------------------
FUNCTION fnc_get_user(pv_group_list VARCHAR2) RETURN user_task_type IS
user_tbl user_task_table_type := user_task_table_type();
v_user_rec user_task_type;

CURSOR c_user_task IS
SELECT a.user_id,
a.username user_name,
a.branch_id,
COUNT(b.auto_id) total_task
FROM users a
LEFT JOIN gd_form_drop_pending_tasks b
ON a.user_id = b.user_id
WHERE pkg_fdr_string_util.fn_match_string(a.group_code,
pv_group_list) > 0
AND (a.status = 'A')
AND INSTR(a.role, 'M') > 0
GROUP BY a.user_id,
a.username,
a.branch_id
ORDER BY total_task ASC;
BEGIN
FOR r_user_task IN c_user_task
LOOP
user_tbl.EXTEND;
user_tbl(user_tbl.LAST) := user_task_type(r_user_task.user_id,
r_user_task.user_name,
r_user_task.branch_id,
r_user_task.total_task,
0);
END LOOP;

IF user_tbl.COUNT > 0
THEN
SELECT CAST(MULTISET (SELECT user_task_type(user_id,
user_name,
branch_id,
total_task,
total_task_process)
FROM TABLE(user_tbl)
ORDER BY total_task,
total_task_process) AS user_task_table_type)
INTO user_tbl
FROM DUAL;

SELECT user_task_type(user_tbl(user_tbl.FIRST).user_id,
user_tbl(user_tbl.FIRST).user_name,
user_tbl(user_tbl.FIRST).branch_id,
user_tbl(user_tbl.FIRST).total_task,
user_tbl(user_tbl.FIRST).total_task_process)
INTO v_user_rec
FROM DUAL;

RETURN v_user_rec;
ELSE
RETURN NULL;
END IF;
EXCEPTION
WHEN OTHERS THEN
proc_log_error('pkg_form_drop.fnc_get_user', SQLERRM, SQLCODE, NULL);
RETURN NULL;
END;

--------------------------------------------------- fnc_get_user_ext
------------------------------------------------
FUNCTION fnc_get_user_ext(pv_group_list VARCHAR2,
pv_branch_id VARCHAR2,
pv_same_division CHAR DEFAULT 'Y')
RETURN user_task_type IS
user_tbl user_task_table_type := user_task_table_type();
v_user_rec user_task_type;

CURSOR c_user_task IS
SELECT a.user_id,
a.username user_name,
a.branch_id,
COUNT(b.auto_id) total_task
FROM users a
LEFT JOIN gd_form_drop_pending_tasks b
ON a.user_id = b.user_id
WHERE a.branch_id = pv_branch_id
AND pkg_fdr_string_util.fn_match_string(a.group_code,
pv_group_list) > 0
AND (a.status = 'A')
--AND TRUNC(c.created_date) = TRUNC(SYSDATE)
AND INSTR(a.role, 'A') > 0
GROUP BY a.user_id,
a.username,
a.branch_id
ORDER BY total_task ASC;
BEGIN
FOR r_user_task IN c_user_task
LOOP
user_tbl.EXTEND;
user_tbl(user_tbl.LAST) := user_task_type(r_user_task.user_id,
r_user_task.user_name,
r_user_task.branch_id,
r_user_task.total_task,
0);
END LOOP;

SELECT CAST(MULTISET (SELECT user_task_type(user_id,


user_name,
branch_id,
total_task,
total_task_process)
FROM TABLE(user_tbl)
ORDER BY total_task,
total_task_process) AS user_task_table_type)
INTO user_tbl
FROM DUAL;

IF user_tbl.COUNT > 0
THEN
SELECT user_task_type(user_tbl(user_tbl.FIRST).user_id,
user_tbl(user_tbl.FIRST).user_name,
user_tbl(user_tbl.FIRST).branch_id,
user_tbl(user_tbl.FIRST).total_task,
user_tbl(user_tbl.FIRST).total_task_process)
INTO v_user_rec
FROM DUAL;
END IF;

RETURN v_user_rec;
EXCEPTION
WHEN OTHERS THEN
proc_log_error('pkg_form_drop.fnc_get_list_user_ext',
SQLERRM,
SQLCODE,
NULL);
RETURN NULL;
END;

--------------------------------------------------- fnc_get_list_user
------------------------------------------------
FUNCTION fnc_get_list_user(pv_group_list VARCHAR2,
pv_role VARCHAR2)
RETURN user_task_table_type IS
user_tbl user_task_table_type := user_task_table_type();
l_idx INTEGER;

CURSOR c_user_task IS
SELECT a.user_id,
a.username user_name,
a.branch_id,
COUNT(b.auto_id) total_task
FROM users a
LEFT JOIN gd_form_drop_pending_tasks b
ON a.user_id = b.user_id
WHERE pkg_fdr_string_util.fn_match_string(a.group_code,
pv_group_list) > 0
AND (a.status = 'A')
/*VBA_EBANK_2019_THOP-23949*/
--AND INSTR(a.role, pv_role) > 0
AND ((INSTR(a.role, pv_role) > 0 AND pv_role <> ('M,A'))
OR
((INSTR(a.role, 'M') > 0 OR INSTR(a.role, 'A') > 0) AND pv_role =
('M,A')))
/*END VBA_EBANK_2019_THOP-23949*/
-- AND (TRUNC (c.created_date) = TRUNC (SYSDATE))
GROUP BY a.user_id,
a.username,
a.branch_id
ORDER BY total_task ASC;
BEGIN
FOR r_user_task IN c_user_task
LOOP
user_tbl.EXTEND;
user_tbl(user_tbl.LAST) := user_task_type(r_user_task.user_id,
r_user_task.user_name,
r_user_task.branch_id,
r_user_task.total_task,
0);
END LOOP;

IF user_tbl.COUNT > 0
THEN
SELECT CAST(MULTISET (SELECT user_task_type(user_id,
user_name,
branch_id,
total_task,
total_task_process)
FROM TABLE(user_tbl)
ORDER BY total_task,
total_task_process -- note: here we have a very simple
sort-operation;
-- it could be much more complex obviously
) AS user_task_table_type)
INTO user_tbl
FROM DUAL;
/*VBA_EBANK_2019_THOP-23949*/
/*
l_idx := user_tbl.FIRST;

LOOP
proc_log_error('pkg_form_drop.fnc_get_list_user',
SQLERRM,
SQLCODE,
NULL);

DBMS_OUTPUT.put_line('** ' || user_tbl(l_idx).user_name ||


' branch ' || user_tbl(l_idx).branch_id ||
' task: ' || user_tbl(l_idx).total_task ||
' task process: ' || user_tbl(l_idx)
.total_task_process);
l_idx := user_tbl.NEXT(l_idx);
EXIT WHEN l_idx IS NULL;
END LOOP;
*/
/*END - VBA_EBANK_2019_THOP-23949*/
RETURN user_tbl;
ELSE
proc_log_error('pkg_form_drop.fnc_get_list_user',
'not found user with pv_group_list = ' ||
pv_group_list,
NULL,
NULL);

RETURN NULL;
END IF;
EXCEPTION
WHEN OTHERS THEN
proc_log_error('pkg_form_drop.fnc_get_list_user',
SQLERRM,
SQLCODE,
NULL);

RETURN NULL;
END;

--------------------------------------------------- fnc_fdr_setup
------------------------------------------------
FUNCTION fnc_fdr_setup(pv_menu_code IN gd_form_drop_setup.menu_code%TYPE,
pv_customer_type IN gd_form_drop_setup.customer_type%TYPE,
pv_channel_code IN gd_form_drop_setup.channel_code%TYPE)
RETURN fdr_param_type AS
v_fdr_setup_row gd_form_drop_setup%ROWTYPE;
v_param fdr_param_type;
v_ho_received VARCHAR2(2000);
v_l1_received VARCHAR2(2000);
v_l2_received VARCHAR2(2000);
BEGIN
BEGIN
SELECT *
INTO v_fdr_setup_row
FROM gd_form_drop_setup a
WHERE a.menu_code = pv_menu_code
AND a.customer_type = pv_customer_type;
/* AND a.channel_code = pv_channel_code; VBA_EBANK_2019_THOP-21285*/
EXCEPTION
WHEN NO_DATA_FOUND THEN
v_fdr_setup_row := NULL;
END;

IF v_fdr_setup_row.auto_id IS NOT NULL


THEN
v_ho_received := v_fdr_setup_row.ho_received;
/*
v_param.ho_group := fn_split_value (v_ho_received, '|', 1);
v_param.ho_time_w :=
TO_NUMBER (fn_split_value (v_ho_received, '|', 2));
v_param.ho_time_p :=
TO_NUMBER (fn_split_value (v_ho_received, '|', 3));
*/
v_l1_received := v_fdr_setup_row.l1_received;
/*
v_param.l1_group := fn_split_value (v_l1_received, 1);
v_param.l1_time_w :=
TO_NUMBER (fn_split_value (v_l1_received, '|', 2));
v_param.l1_time_p :=
TO_NUMBER (fn_split_value (v_l1_received, '|', 3));
*/
v_l2_received := v_fdr_setup_row.l2_received;
/*
v_param.l2_group := fn_split_value (v_l2_received, '|', 1);
v_param.l2_time_w :=
TO_NUMBER (fn_split_value (v_l2_received, '|', 2));
v_param.l2_time_p :=
TO_NUMBER (fn_split_value (v_l1_received, '|', 3));
*/
RETURN v_param;
ELSE
RAISE e_no_data_fdr_setup;
END IF;
EXCEPTION
WHEN e_no_data_fdr_setup THEN
proc_log_error('pkg_form_drop.fnc_fdr_setup',
'e_no_data_fdr_setup pv_menu_code = ' || pv_menu_code ||
', pv_customer_type = ' || pv_customer_type ||
', pv_channel_type = ' || pv_channel_code,
NULL,
NULL);
RETURN NULL;
WHEN OTHERS THEN
proc_log_error('pkg_form_drop.fnc_get_list_user',
SQLERRM,
SQLCODE,
NULL);
RETURN NULL;
END;

--------------------------------------------------- reject_check
------------------------------------------------
FUNCTION fn_split_string(i_str IN VARCHAR2,
i_delim IN VARCHAR2 DEFAULT '|')
RETURN SYS.odcivarchar2list DETERMINISTIC AS
p_result SYS.odcivarchar2list := sys.odcivarchar2list();
p_start NUMBER(5) := 1;
p_end NUMBER(5);
c_len CONSTANT NUMBER(5) := LENGTH(i_str);
c_ld CONSTANT NUMBER(5) := LENGTH(i_delim);
BEGIN
IF c_len > 0
THEN
p_end := INSTR(i_str, i_delim, p_start);

WHILE p_end > 0


LOOP
p_result.EXTEND;
p_result(p_result.COUNT) := SUBSTR(i_str, p_start, p_end - p_start);
p_start := p_end + c_ld;
p_end := INSTR(i_str, i_delim, p_start);
END LOOP;

IF p_start <= c_len + 1


THEN
p_result.EXTEND;
p_result(p_result.COUNT) := SUBSTR(i_str,
p_start,
c_len - p_start + 1);
END IF;
END IF;

RETURN p_result;
END;

--------------------------------------------------- fn_split_value
------------------------------------------------
FUNCTION fn_split_value(i_str IN VARCHAR2,
i_char IN CHAR,
i_order IN NUMBER DEFAULT 1) RETURN VARCHAR2 AS
p_result VARCHAR2(2000);
BEGIN
SELECT REGEXP_SUBSTR(i_str, '[^' || i_char || ']+', 1, i_order)
INTO p_result
FROM DUAL;

RETURN p_result;
END;

--------------------------------------------------- fn_get_transid
------------------------------------------------
FUNCTION fn_get_transid(table_name IN VARCHAR2,
key_field IN VARCHAR2) RETURN VARCHAR2 AS
p_result VARCHAR2(2000);
exc VARCHAR2(500);
--jira:22195 vietq6 20220606
tran_id VARCHAR2(100);
BEGIN

IF table_name = 'FX_TRANSACTION' THEN


tran_id :='TRANSACTION_ID';

--start fix for jira number : 22934 dieptt5


ELSIF table_name in ('FT_TRANSFER','FT_REFUND_NEW') THEN --jira:37028 vietlq6
20230717
tran_id :='referencenumber';

--End fix for jira number : 22934 dieptt5


ELSE
tran_id :='TRANSACTION_REF_NO';
END IF;
exc := 'SELECT '||tran_id||' FROM ' || table_name ||
' WHERE auto_ID = ' || key_field;
--end jira:22195 vietq6 20220606

BEGIN
EXECUTE IMMEDIATE (exc)
INTO p_result;
EXCEPTION
WHEN OTHERS THEN
exc := 'SELECT TRANS_ID TRANSACTION_REF_NO FROM ' || table_name ||
' WHERE auto_ID = ' || key_field;

BEGIN
EXECUTE IMMEDIATE (exc)
INTO p_result;
EXCEPTION
WHEN OTHERS THEN
p_result := NULL;
END;
END;

RETURN p_result;
END;

/*** auto_assign_task_all***/
/*VBA_EBANK_2019_THOP-29462 DATND15 07112022*/
--PROCEDURE auto_assign_task_all IS
PROCEDURE auto_assign_task_all(cur OUT pkg_data.cursor) IS
/*END VBA_EBANK_2019_THOP-29462 DATND15 07112022*/
CURSOR cur_form_drop_setup IS
SELECT a.menu_code,
a.menu_group_code,
a.channel_code,
a.customer_type,
a.time_start,
a.time_end
FROM gd_form_drop_setup a
WHERE a.status = 'A'
AND a.deleted = 'N';

v_time_current VARCHAR(20) := TO_CHAR(SYSDATE, 'HH24:MI:SS');


IS_BPM varchar2(2);--VBA_EBANK_2019_THOP-37036 BPM
BEGIN
BEGIN/*VBA_EBANK_2019_THOP-29462 DATND15 07112022*/
--VBA_EBANK_2019_THOP-37036 BPM start
IS_BPM := fn_get_flag_BPM();
IF IS_BPM = 'N' THEN
--VBA_EBANK_2019_THOP-37036 BPM end
FOR row_form_drop_setup IN cur_form_drop_setup
LOOP
IF (row_form_drop_setup.time_start IS NOT NULL AND
row_form_drop_setup.time_end IS NOT NULL)
THEN
IF (row_form_drop_setup.time_start <= v_time_current AND
row_form_drop_setup.time_end >= v_time_current)
AND
(row_form_drop_setup.time_start < row_form_drop_setup.time_end)
THEN
auto_assign_task(pv_channel_type => row_form_drop_setup.channel_code,
pv_menu_code => row_form_drop_setup.menu_code,
pv_approve_status => 'NEW',
pv_is_processing => '0',
pv_customer_type => row_form_drop_setup.customer_type,
pv_branch_level => 'L1');

auto_assign_task(pv_channel_type => row_form_drop_setup.channel_code,


pv_menu_code => row_form_drop_setup.menu_code,
pv_approve_status => 'NEW',
pv_is_processing => '0',
pv_customer_type => row_form_drop_setup.customer_type,
pv_branch_level => 'HO');

auto_assign_task(pv_channel_type => row_form_drop_setup.channel_code,


pv_menu_code => row_form_drop_setup.menu_code,
pv_approve_status => 'NEW',
pv_is_processing => '0',
pv_customer_type => row_form_drop_setup.customer_type,
pv_branch_level => 'L2');
END IF;
ELSE
auto_assign_task(pv_channel_type => row_form_drop_setup.channel_code,
pv_menu_code => row_form_drop_setup.menu_code,
pv_approve_status => 'NEW',
pv_is_processing => '0',
pv_customer_type => row_form_drop_setup.customer_type,
pv_branch_level => 'L1');

auto_assign_task(pv_channel_type => row_form_drop_setup.channel_code,


pv_menu_code => row_form_drop_setup.menu_code,
pv_approve_status => 'NEW',
pv_is_processing => '0',
pv_customer_type => row_form_drop_setup.customer_type,
pv_branch_level => 'HO');

auto_assign_task(pv_channel_type => row_form_drop_setup.channel_code,


pv_menu_code => row_form_drop_setup.menu_code,
pv_approve_status => 'NEW',
pv_is_processing => '0',
pv_customer_type => row_form_drop_setup.customer_type,
pv_branch_level => 'L2');
END IF;
END LOOP;
END IF; --VBA_EBANK_2019_THOP-37036 BPM
/*VBA_EBANK_2019_THOP-29462 DATND15 07112022*/
open cur for
SELECT 'a' A from dual;
EXCEPTION
WHEN OTHERS THEN
proc_log_error(p_target => 'FORM_DROP',
p_message => 'auto_assign_task_all- ERORR: ' ||
SQLCODE || ' - ' || SQLERRM || ' - ' ||
DBMS_UTILITY.format_error_backtrace,
p_sqlcode => SQLCODE,
p_msgid => NULL);
RAISE_APPLICATION_ERROR(SQLCODE, SQLCODE || ' - ' || SQLERRM);
END;
/*END VBA_EBANK_2019_THOP-29462 DATND15 07112022*/
END;
/*** re_assign_task_all ***/
/*VBA_EBANK_2019_THOP-29462 DATND15 07112022*/
--PROCEDURE re_assign_task_all IS
PROCEDURE re_assign_task_all(cur OUT pkg_data.cursor) IS
/*END VBA_EBANK_2019_THOP-29462 DATND15 07112022*/
CURSOR cur_form_drop_setup IS
SELECT a.menu_code,
a.menu_group_code,
a.channel_code,
a.customer_type,
a.time_start,
a.time_end
FROM gd_form_drop_setup a
WHERE a.status = 'A'
AND a.deleted = 'N';

v_time_current VARCHAR(20) := TO_CHAR(SYSDATE, 'HH24:MI:SS');


IS_BPM varchar2(2);--VBA_EBANK_2019_THOP-37036 BPM
BEGIN
BEGIN /*VBA_EBANK_2019_THOP-29462 DATND15 07112022*/
--VBA_EBANK_2019_THOP-37036 BPM start
IS_BPM := fn_get_flag_BPM();
IF IS_BPM = 'N' THEN
--VBA_EBANK_2019_THOP-37036 BPM end
FOR row_form_drop_setup IN cur_form_drop_setup
LOOP
IF (row_form_drop_setup.time_start IS NOT NULL AND
row_form_drop_setup.time_end IS NOT NULL)
THEN
IF (row_form_drop_setup.time_start <= v_time_current AND
row_form_drop_setup.time_end >= v_time_current)
AND
(row_form_drop_setup.time_start < row_form_drop_setup.time_end)
THEN
re_assign_task_branch_level(row_form_drop_setup.channel_code,
row_form_drop_setup.menu_code,
row_form_drop_setup.customer_type,
'M');

re_assign_task_branch_level(row_form_drop_setup.channel_code,
row_form_drop_setup.menu_code,
row_form_drop_setup.customer_type,
'A');
END IF;
ELSE
re_assign_task_branch_level(row_form_drop_setup.channel_code,
row_form_drop_setup.menu_code,
row_form_drop_setup.customer_type,
'M');

re_assign_task_branch_level(row_form_drop_setup.channel_code,
row_form_drop_setup.menu_code,
row_form_drop_setup.customer_type,
'A');
END IF;
END LOOP;
--VBA_EBANK_2019_THOP-37036 BPM start
END IF;
--VBA_EBANK_2019_THOP-37036 BPM end
/*VBA_EBANK_2019_THOP-29462 DATND15 07112022*/
open cur for
SELECT 'a' A from dual;
EXCEPTION
WHEN OTHERS THEN
proc_log_error(p_target => 'FORM_DROP',
p_message => 're_assign_task_all- ERORR: ' ||
SQLCODE || ' - ' || SQLERRM || ' - ' ||
DBMS_UTILITY.format_error_backtrace,
p_sqlcode => SQLCODE,
p_msgid => NULL);
RAISE_APPLICATION_ERROR(SQLCODE, SQLCODE || ' - ' || SQLERRM);
END;
/*END VBA_EBANK_2019_THOP-29462 DATND15 07112022*/
END;

PROCEDURE re_assign_task_branch_level(pv_channel_type VARCHAR2,


pv_menu_code VARCHAR2,
pv_customer_type VARCHAR2,
pv_user_type VARCHAR2) IS
BEGIN
re_assign_task(pv_channel_type => pv_channel_type,
pv_menu_code => pv_menu_code,
pv_customer_type => pv_customer_type,
pv_branch_level => 'HO',
pv_user_type => pv_user_type);

re_assign_task(pv_channel_type => pv_channel_type,


pv_menu_code => pv_menu_code,
pv_customer_type => pv_customer_type,
pv_branch_level => 'L1',
pv_user_type => pv_user_type);

re_assign_task(pv_channel_type => pv_channel_type,


pv_menu_code => pv_menu_code,
pv_customer_type => pv_customer_type,
pv_branch_level => 'L2',
pv_user_type => pv_user_type);
END;

-----------USER_APPROVE

FUNCTION fn_user_approve(auto_id VARCHAR2) RETURN VARCHAR2 AS


p_result VARCHAR2(100);
vcount NUMBER;
auto_id_x NUMBER;
BEGIN
auto_id_x := auto_id;

SELECT COUNT(1)
INTO vcount
FROM gd_form_drop_pending_tasks_his t
WHERE t.auto_id = auto_id_x;

IF vcount > 0
THEN
SELECT a.user_assigned
INTO p_result
FROM gd_form_drop_pending_tasks_his a
WHERE a.number_insert =
(SELECT MAX(f.number_insert)
FROM gd_form_drop_pending_tasks_his f
WHERE f.auto_id = auto_id_x);
END IF;

RETURN p_result;
END;

FUNCTION fn_check_busy(pv_user_name NVARCHAR2,


pv_date_time DATE) RETURN NUMBER AS
v_count NUMBER := 0;
BEGIN
SELECT COUNT(auto_id)
INTO v_count
FROM gd_form_drop_busy a
WHERE user_name = pv_user_name
AND pv_date_time BETWEEN
TO_DATE(TO_CHAR(from_date, 'DD/MM/YYYY') || ' ' || from_time,
'dd/MM/yyyy HH24:MI') AND
TO_DATE(TO_CHAR(TO_DATE, 'DD/MM/YYYY') || ' ' || to_time,
'dd/MM/yyyy HH24:MI');

RETURN v_count;
END;
/*VBA_EBANK_2019_THOP-22133*/
/*VBA_EBANK_2019_THOP-23949 20220624 datnd15*/
/*PROCEDURE PROC_LOADHANDLER(pv_MENU_CODE_D varchar2,
pv_CUSTOMER_TYPE_D varchar2,
cur OUT pkg_data.cursor)*/
PROCEDURE PROC_LOADHANDLER(pv_AUTO_ID varchar2,
cur OUT pkg_data.cursor)
/*END - VBA_EBANK_2019_THOP-23949 20220624 datnd15*/
IS
is_value varchar2(5);
v_count number;/*VBA_EBANK_2019_THOP-23949*/
pt_rec gd_form_drop_pending_tasks%rowtype;
/*VBA_EBANK_2019_THOP-23949 20220624 datnd15*/
BEGIN
--sp_throw_exception(101,pv_AUTO_ID);
/*VBA_EBANK_2019_THOP-23949 20220624 datnd15*/
--select t.handler_approve into is_value from gd_form_drop_setup t where
t.menu_code = pv_MENU_CODE_D and t.customer_type = pv_CUSTOMER_TYPE_D and t.deleted
= 'N';
select * into pt_rec from gd_form_drop_pending_tasks t where t.auto_id =
pv_AUTO_ID;
select count(1) into v_count from gd_parameter t where t.parameter_type =
'FORM_DROP' and t.parameter_code = pt_rec.menu_code and t.is_active = 'Y'
and (INSTR(t.channel_tenant_id, (pt_rec.channel_type||' - VN')) > 0);
IF v_count >0 and FUNC_CHECK_LAST(pt_rec) = 'Y' then
is_value := 'Y';
else
is_value := 'N';
end if;
/*END - VBA_EBANK_2019_THOP-23949 20220624 datnd15*/
OPEN CUR FOR
--Start jira 25863
--select is_value "ASSIGNED_TO.VISIBLE" from dual;
select is_value "ASSIGNED_TO.VISIBLE",'' REMARK from dual;
--End jira 25863
END;
/*END*/
/*VBA_EBANK_2019_THOP-23447*/
PROCEDURE GET_VALID_PROC(pv_auto_id NUMBER,cur OUT
pkg_data.cursor) IS
v_proc_valid VARCHAR2(200);
BEGIN
SELECT t.proc_valid
INTO v_proc_valid
FROM gd_fd_setup_module t
WHERE t.menu_code = (SELECT t.menu_code
FROM gd_form_drop_pending_tasks t
WHERE t.auto_id = pv_auto_id)
AND
t.menu_mode = (SELECT t.menu_mode
FROM gd_form_drop_pending_tasks t
WHERE t.auto_id = pv_auto_id);
OPEN cur FOR
SELECT v_proc_valid proc_valid FROM DUAL;
END;
/*END - VBA_EBANK_2019_THOP-23447*/
/*VBA_EBANK_2019_THOP-24005*/
PROCEDURE PROC_VALIDATE_SESSION(pt_rec gd_form_drop_pending_tasks%rowtype,
session_username varchar2)
IS
user_acces number;
BEGIN
IF pt_rec.auto_id is not null then
select t.user_id into user_acces from users t where t.username =
session_username;
IF pt_rec.user_id <> user_acces then
sp_throw_exception(1403431,null);
end if;
end if;
END;
/*END - VBA_EBANK_2019_THOP-24005*/
/*VBA_EBANK_2019_THOP-23949 20220627 datnd15*/
FUNCTION FUNC_CHECK_LAST(pt_rec gd_form_drop_pending_tasks
%rowtype) return varchar2 as
tb_setup_rec gd_form_drop_setup%ROWTYPE;
tb_approve_rec gd_form_drop_approve
%ROWTYPE;
visiable varchar2(2) default('Y');
v_count number;
sequence_rec number;
number_approve number;
begin
IF pt_rec.approve_status = 3 then
sequence_rec := 1;
number_approve := 1;
else
sequence_rec := pt_rec.sequence;
number_approve := pt_rec.number_of_approval;
end if;
SELECT *
INTO tb_setup_rec
FROM gd_form_drop_setup
WHERE menu_code = pt_rec.menu_code
AND customer_type = pt_rec.customer_type
AND status = 'A';
SELECT COUNT(1)
INTO v_count
FROM gd_form_drop_approve
WHERE branch_level = pt_rec.branch_level
AND sequence = sequence_rec
AND form_drop_setup_id = tb_setup_rec.auto_id;
IF v_count > 0 then
IF pt_rec.approve_status <> 3 then
SELECT *
INTO tb_approve_rec
FROM gd_form_drop_approve
WHERE branch_level = pt_rec.branch_level
AND form_drop_setup_id = tb_setup_rec.auto_id
AND sequence = sequence_rec;
SELECT COUNT(1)
INTO v_count
FROM gd_form_drop_approve
WHERE branch_level = pt_rec.branch_level
AND sequence > sequence_rec
AND form_drop_setup_id = tb_setup_rec.auto_id;
IF (v_count = 0 AND number_approve = tb_approve_rec.number_of_approval) then
visiable := 'N';
end if;
END IF;
else
visiable := 'N';
end if;
return visiable;
end;

/*END VBA_EBANK_2019_THOP-23949 20220627 datnd15*/

--Start jira 25863


PROCEDURE PROC_LOADHANDLER_380RU
(
pv_AUTO_ID varchar2,
cur OUT pkg_data.CURSOR
)
IS
BEGIN
OPEN CUR FOR
select '' REMARK from dual;

END;
--End jira 25863

--- VBA_EBANK_2019_THOP-37036 20230718 Datnd15 BPM on OFF


Function fn_get_flag_BPM return varchar2 as
is_bpm varchar2(2) default('N');
v_count number;
begin
select count(1) into v_count from sysvar t where t.grname = 'SYSTEM' and
t.varname = 'IS_BPM';
if v_count >0 then
select t.varvalue into is_bpm from sysvar t where t.grname = 'SYSTEM' and
t.varname = 'IS_BPM';
return is_bpm;
else
return is_bpm;
end if;
end;

procedure get_time_sla(pv_auto_id NUMBER,


cur OUT PKG_DATA.cursor)
is
sla_process number;
begin
select t.sla_processing into sla_process from gd_form_drop_pending_tasks t
where t.auto_id = pv_auto_id;
OPEN CUR FOR
select TO_CHAR(sla_process) PARAM_VALUE from dual;
end;
END;
/

You might also like