Primer Commit
This commit is contained in:
57
DB/PACKAGE_BODIES/API_ENVX_OPER.sql
Normal file
57
DB/PACKAGE_BODIES/API_ENVX_OPER.sql
Normal file
@@ -0,0 +1,57 @@
|
||||
--------------------------------------------------------
|
||||
-- DDL for Package Body API_ENVX_OPER
|
||||
--------------------------------------------------------
|
||||
|
||||
CREATE OR REPLACE EDITIONABLE PACKAGE BODY "ENVX_OPER"."API_ENVX_OPER" AS
|
||||
|
||||
----------------------------------------------------
|
||||
-- Devuelve la lista de Repositorios Configurados --
|
||||
FUNCTION repository_config_list(
|
||||
js_parameters CLOB DEFAULT NULL
|
||||
) RETURN CLOB
|
||||
IS
|
||||
v_json CLOB;
|
||||
BEGIN
|
||||
|
||||
SELECT JSON_ARRAYAGG(
|
||||
JSON_OBJECT(
|
||||
'id' VALUE to_number(r.id_repository),
|
||||
'description' VALUE r.repository_description,
|
||||
'alias' VALUE r.repository_name,
|
||||
'host' VALUE r.repository_host,
|
||||
'user' VALUE r.user_repo,
|
||||
'password' VALUE r.pass_repo,
|
||||
'name' VALUE r.repository_def_path,
|
||||
'status' VALUE r.repository_status,
|
||||
'tech' VALUE t.tech,
|
||||
'port' VALUE TO_NUMBER(r.repository_port),
|
||||
'protocol' VALUE r.repository_protocol,
|
||||
'apiVersion' VALUE r.repository_api_version,
|
||||
'repositoryOwner' VALUE r.repository_owner
|
||||
)
|
||||
)
|
||||
INTO v_json
|
||||
FROM version_repository r, (
|
||||
SELECT j.tech, j.idtech
|
||||
FROM system_parameter sp,
|
||||
JSON_TABLE(JSON(sp.parameter_value),
|
||||
'$[*]' COLUMNS (idtech NUMBER PATH '$.idTech',
|
||||
tech VARCHAR(100) PATH '$.tech')
|
||||
) j
|
||||
WHERE parameter_name = 'REPOSITORY_TECH'
|
||||
) t
|
||||
WHERE t.idtech = r.repository_tech;
|
||||
|
||||
RETURN v_json;
|
||||
END;
|
||||
-- Devuelve la lista de Repositorios Configurados --
|
||||
----------------------------------------------------
|
||||
|
||||
END api_envx_oper;
|
||||
|
||||
/
|
||||
|
||||
GRANT EXECUTE ON "ENVX_OPER"."API_ENVX_OPER" TO "APEX_PUBLIC_USER";
|
||||
GRANT DEBUG ON "ENVX_OPER"."API_ENVX_OPER" TO "APEX_PUBLIC_USER";
|
||||
GRANT EXECUTE ON "ENVX_OPER"."API_ENVX_OPER" TO PUBLIC;
|
||||
GRANT DEBUG ON "ENVX_OPER"."API_ENVX_OPER" TO PUBLIC;
|
||||
13
DB/PACKAGE_BODIES/FILE_PKG_VERSION.sql
Normal file
13
DB/PACKAGE_BODIES/FILE_PKG_VERSION.sql
Normal file
@@ -0,0 +1,13 @@
|
||||
--------------------------------------------------------
|
||||
-- DDL for Package Body FILE_PKG_VERSION
|
||||
--------------------------------------------------------
|
||||
|
||||
CREATE OR REPLACE EDITIONABLE PACKAGE BODY "ENVX_OPER"."FILE_PKG_VERSION" is
|
||||
function get_version return varchar2 is
|
||||
begin
|
||||
return pkg_version;
|
||||
end get_version;
|
||||
end file_pkg_version;
|
||||
|
||||
|
||||
/
|
||||
3573
DB/PACKAGE_BODIES/PKG_DEPLOY_COORDINATOR.sql
Normal file
3573
DB/PACKAGE_BODIES/PKG_DEPLOY_COORDINATOR.sql
Normal file
File diff suppressed because it is too large
Load Diff
492
DB/PACKAGE_BODIES/PKG_REPOSITORY_ACTIONS.sql
Normal file
492
DB/PACKAGE_BODIES/PKG_REPOSITORY_ACTIONS.sql
Normal file
@@ -0,0 +1,492 @@
|
||||
--------------------------------------------------------
|
||||
-- DDL for Package Body PKG_REPOSITORY_ACTIONS
|
||||
--------------------------------------------------------
|
||||
|
||||
CREATE OR REPLACE EDITIONABLE PACKAGE BODY "ENVX_OPER"."PKG_REPOSITORY_ACTIONS" AS
|
||||
----------------------------------------------------
|
||||
--------------------- FUNCTIONS --------------------
|
||||
|
||||
----------------------------------------------
|
||||
FUNCTION f_get_branch (
|
||||
p_json_parameters IN CLOB,
|
||||
po_message OUT VARCHAR2
|
||||
) RETURN CLOB IS
|
||||
|
||||
v_rest_request_id VARCHAR2(500);
|
||||
v_id_repository NUMBER;
|
||||
-- Variables para realizar la llamada http
|
||||
v_url VARCHAR2(2000);
|
||||
v_http_method VARCHAR2(100);
|
||||
v_http_headers http_headers_tab;
|
||||
v_body CLOB;
|
||||
v_http_status_code NUMBER;
|
||||
v_response CLOB;
|
||||
v_response_code VARCHAR2(50);
|
||||
v_error_message VARCHAR2(400);
|
||||
v_count_reg NUMBER := 0;
|
||||
v_list_size VARCHAR2(100);
|
||||
v_page_number VARCHAR2(100);
|
||||
BEGIN
|
||||
|
||||
--------------------------------------------------------
|
||||
-- Se obtienen los valores de solicitud y repositorio --
|
||||
v_rest_request_id := JSON_VALUE(p_json_parameters,
|
||||
'$.rest_request_id');
|
||||
v_id_repository := JSON_VALUE(p_json_parameters,
|
||||
'$.repository_id');
|
||||
v_list_size := JSON_VALUE(p_json_parameters,
|
||||
'$.list_size');
|
||||
v_page_number := JSON_VALUE(p_json_parameters,
|
||||
'$.page_number');
|
||||
-- Se obtienen los valores de solicitud y repositorio --
|
||||
--------------------------------------------------------
|
||||
|
||||
-- Extraer URL de una tabla --
|
||||
v_url := 'https://api.dev.envx.io/repo/v1/action/branch?restRequestId='
|
||||
|| v_rest_request_id
|
||||
|| '&repositoryId='
|
||||
|| v_id_repository
|
||||
|| '&groupType=default&pageNumber='
|
||||
|| v_page_number
|
||||
|| '&listSize='
|
||||
|| v_list_size;
|
||||
|
||||
v_http_method := 'GET';
|
||||
|
||||
-------------------------------------
|
||||
-- Llamada REST a /action/branches --
|
||||
pkg_sicd_commons.p_rest_call_apim(
|
||||
v_url,
|
||||
v_http_method,
|
||||
v_body,
|
||||
v_http_status_code,
|
||||
v_http_headers,
|
||||
v_response,
|
||||
v_response_code,
|
||||
v_error_message
|
||||
);
|
||||
|
||||
-- Llamada REST a /action/branches --
|
||||
-------------------------------------
|
||||
|
||||
RETURN v_response;
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
po_message := 'Error: ' || sqlerrm;
|
||||
END;
|
||||
----------------------------------------------
|
||||
----------------------------------------------
|
||||
FUNCTION f_get_filesgroup (
|
||||
p_json_parameters IN CLOB,
|
||||
po_message OUT VARCHAR2
|
||||
) RETURN CLOB AS
|
||||
|
||||
v_json_aux json :=
|
||||
JSON(
|
||||
p_json_parameters
|
||||
);
|
||||
|
||||
-- Variables para la lectura de json de entrada --
|
||||
v_rest_request_id VARCHAR2(100);
|
||||
v_request_id NUMBER;
|
||||
v_repository_id NUMBER;
|
||||
v_branch_name VARCHAR2(50);
|
||||
v_type_group VARCHAR2(100);
|
||||
v_list_size VARCHAR2(100);
|
||||
v_page_number VARCHAR2(100);
|
||||
-- Variables para la lectura de json de entrada --
|
||||
|
||||
-- Variables para ejecutar p_rest_call --
|
||||
v_url VARCHAR2(2000);
|
||||
v_http_method VARCHAR2(100);
|
||||
v_http_headers http_headers_tab;
|
||||
v_body CLOB;
|
||||
v_http_status_code NUMBER;
|
||||
v_response CLOB;
|
||||
v_response_code VARCHAR2(50);
|
||||
v_error_message VARCHAR2(400);
|
||||
-- Variables para ejecutar p_rest_call --
|
||||
BEGIN
|
||||
---------------------------------------
|
||||
-- Obtencion de variables de trabajo --
|
||||
v_request_id := JSON_VALUE(v_json_aux,
|
||||
'$.request_id');
|
||||
v_rest_request_id := JSON_VALUE(v_json_aux,
|
||||
'$.rest_request_id');
|
||||
v_repository_id := JSON_VALUE(v_json_aux,
|
||||
'$.repository_id');
|
||||
v_branch_name := JSON_VALUE(v_json_aux,
|
||||
'$.branch_name');
|
||||
v_type_group := JSON_VALUE(v_json_aux,
|
||||
'$.type_group');
|
||||
v_list_size := JSON_VALUE(v_json_aux,
|
||||
'$.list_size');
|
||||
v_page_number := JSON_VALUE(v_json_aux,
|
||||
'$.page_number');
|
||||
-- v_files_group_id := JSON_VALUE(v_json_aux, '$.filesGroupId');
|
||||
-- Obtencion de variables de trabajo --
|
||||
---------------------------------------
|
||||
|
||||
IF v_repository_id IS NOT NULL THEN
|
||||
-- Extraer URL de una tabla --
|
||||
v_url := 'https://api.dev.envx.io/repo/v1/action/filesGroup?'
|
||||
|| 'restRequestId='
|
||||
|| v_rest_request_id
|
||||
|| '&repositoryId='
|
||||
|| v_repository_id
|
||||
|| '&branchName='
|
||||
|| v_branch_name
|
||||
|| '&groupType='
|
||||
|| v_type_group
|
||||
|| '&listSize='
|
||||
|| v_list_size
|
||||
|| '&pageNumber='
|
||||
|| v_page_number;
|
||||
-- || '&filesGroupId='
|
||||
-- || v_files_group_id;
|
||||
|
||||
v_http_method := 'GET';
|
||||
|
||||
-----------------------------------------------------
|
||||
-- Se realiza la llamada REST a /action/filesGroup --
|
||||
pkg_sicd_commons.p_rest_call_apim(
|
||||
v_url,
|
||||
v_http_method,
|
||||
v_body,
|
||||
v_http_status_code,
|
||||
v_http_headers,
|
||||
v_response,
|
||||
v_response_code,
|
||||
v_error_message
|
||||
);
|
||||
-- Se realiza la llamada REST a /action/filesGroup --
|
||||
-----------------------------------------------------
|
||||
|
||||
RETURN v_response;
|
||||
po_message := v_error_message;
|
||||
END IF;
|
||||
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
po_message := 'Error: ' || sqlerrm;
|
||||
END;
|
||||
----------------------------------------------
|
||||
----------------------------------------------
|
||||
FUNCTION f_get_file (
|
||||
p_json_parameters IN CLOB,
|
||||
po_message OUT VARCHAR2
|
||||
) RETURN CLOB AS
|
||||
|
||||
v_json_aux CLOB;
|
||||
|
||||
-- Variables para la lectura de parametros de entrada --
|
||||
v_rest_request_id VARCHAR2(100);
|
||||
v_request_id NUMBER;
|
||||
v_repository_id NUMBER;
|
||||
v_branch_name VARCHAR2(50);
|
||||
v_type_group VARCHAR2(100);
|
||||
v_group_id VARCHAR2(100);
|
||||
v_list_size VARCHAR2(100);
|
||||
v_page_number VARCHAR2(100);
|
||||
v_http_headers http_headers_tab;
|
||||
-- Variables para la lectura de parametros de entrada --
|
||||
|
||||
-- Variables para ejecutar la llamada http --
|
||||
v_url VARCHAR2(2000);
|
||||
v_http_method VARCHAR2(100);
|
||||
v_body CLOB;
|
||||
v_http_status_code NUMBER;
|
||||
v_response CLOB;
|
||||
v_response_code VARCHAR2(50);
|
||||
v_error_message VARCHAR2(400);
|
||||
-- Variables para ejecutar la llamada http --
|
||||
BEGIN
|
||||
--------------------------------------------------------
|
||||
-- Se obtienen los valores de solicitud y repositorio --
|
||||
v_request_id := JSON_VALUE(p_json_parameters,
|
||||
'$.request_id');
|
||||
v_rest_request_id := JSON_VALUE(p_json_parameters,
|
||||
'$.rest_request_id');
|
||||
v_repository_id := JSON_VALUE(p_json_parameters,
|
||||
'$.repository_id');
|
||||
v_branch_name := JSON_VALUE(p_json_parameters,
|
||||
'$.branch_name');
|
||||
v_type_group := JSON_VALUE(p_json_parameters,
|
||||
'$.type_group');
|
||||
v_group_id := JSON_VALUE(p_json_parameters,
|
||||
'$.group_id');
|
||||
v_list_size := JSON_VALUE(p_json_parameters,
|
||||
'$.list_size');
|
||||
v_page_number := JSON_VALUE(p_json_parameters,
|
||||
'$.page_number');
|
||||
-- Se obtienen los valores de solicitud y repositorio --
|
||||
--------------------------------------------------------
|
||||
|
||||
IF v_repository_id IS NOT NULL THEN
|
||||
-- Extraer URL de una tabla --
|
||||
v_url := 'https://api.dev.envx.io/repo/v1/action/files?'
|
||||
|| 'restRequestId='
|
||||
|| v_rest_request_id
|
||||
|| '&repositoryId='
|
||||
|| v_repository_id
|
||||
|| '&branchName='
|
||||
|| v_branch_name
|
||||
|| '&groupType='
|
||||
|| v_type_group
|
||||
|| '&filesGroupId='
|
||||
|| v_group_id
|
||||
|| '&listSize='
|
||||
|| v_list_size
|
||||
|| '&pageNumber='
|
||||
|| v_page_number;
|
||||
|
||||
v_http_method := 'GET';
|
||||
|
||||
------------------------------------------------
|
||||
-- Se realiza la llamada REST a file --
|
||||
pkg_sicd_commons.p_rest_call_apim(
|
||||
v_url,
|
||||
v_http_method,
|
||||
v_body,
|
||||
v_http_status_code,
|
||||
v_http_headers,
|
||||
v_response,
|
||||
v_response_code,
|
||||
v_error_message
|
||||
);
|
||||
-- Se realiza la llamada REST a file --
|
||||
------------------------------------------------
|
||||
|
||||
RETURN v_response;
|
||||
po_message := 'Mostrando la pagina ' || v_page_number;
|
||||
END IF;
|
||||
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
po_message := 'Error: ' || sqlerrm;
|
||||
END;
|
||||
----------------------------------------------
|
||||
----------------------------------------------
|
||||
FUNCTION f_filesgroup_query (
|
||||
pi_filegroup_type IN VARCHAR2,
|
||||
pi_filesgroup_jsonc IN VARCHAR2
|
||||
) RETURN CLOB AS
|
||||
v_query CLOB;
|
||||
v_select VARCHAR2(4000);
|
||||
BEGIN
|
||||
SELECT UNIQUE 'SELECT ' || list_representation
|
||||
INTO v_select
|
||||
FROM repository_type_search t
|
||||
WHERE t.alias = pi_filegroup_type;
|
||||
|
||||
v_query := v_select
|
||||
|| '
|
||||
FROM JSON_TABLE(json(:'
|
||||
|| upper(pi_filesgroup_jsonc)
|
||||
|| q'~), '$'
|
||||
COLUMNS (
|
||||
pageNumber NUMBER PATH '$.pageNumber',
|
||||
totalPage NUMBER PATH '$.totalPage',
|
||||
filesGroup JSON PATH '$.filesGroup[*]',
|
||||
NESTED PATH '$.filesGroup[*]' COLUMNS(
|
||||
c_date VARCHAR2(100) PATH '$.date',
|
||||
author VARCHAR2(100) PATH '$.author',
|
||||
email VARCHAR2(100) PATH '$.email',
|
||||
groupId VARCHAR2(100) PATH '$.groupId',
|
||||
message VARCHAR2(100) PATH '$.message',
|
||||
total NUMBER PATH '$.stats.total',
|
||||
additions NUMBER PATH '$.stats.additions',
|
||||
deletions NUMBER PATH '$.stats.deletions'
|
||||
)
|
||||
)
|
||||
)
|
||||
ORDER BY 1;~';
|
||||
RETURN v_query;
|
||||
END;
|
||||
----------------------------------------------
|
||||
----------------------------------------------
|
||||
FUNCTION f_files_query (
|
||||
pi_files_jsonc IN VARCHAR2
|
||||
) RETURN CLOB AS
|
||||
v_query CLOB;
|
||||
BEGIN
|
||||
v_query := q'~SELECT jt.files as file_name, APEX_UTIL.URL_ENCODE(jt.files) AS file_id
|
||||
FROM JSON_TABLE(nvl(:~'
|
||||
|| pi_files_jsonc
|
||||
|| q'~,'[ ]'), '$.files[*]'
|
||||
COLUMNS (files PATH '$.file')
|
||||
) jt
|
||||
UNION
|
||||
SELECT file_name as file_name, APEX_UTIL.URL_ENCODE(file_name) AS file_id
|
||||
FROM json_table(:P4_SELECTED_OBJ,'$[*]' COLUMNS (file_name PATH '$.object_name' )) q
|
||||
ORDER BY 1;~';
|
||||
RETURN v_query;
|
||||
END;
|
||||
----------------------------------------------
|
||||
----------------------------------------------
|
||||
FUNCTION f_branches_query (
|
||||
pi_branches_jsonc IN VARCHAR2
|
||||
) RETURN CLOB AS
|
||||
v_query CLOB;
|
||||
v_select VARCHAR2(4000);
|
||||
BEGIN
|
||||
v_query := q'~SELECT branch_name, branch_name as id_branch FROM JSON_TABLE(JSON(:~'
|
||||
|| pi_branches_jsonc
|
||||
|| q'~), '$.branch[*]'
|
||||
COLUMNS (
|
||||
branch_name VARCHAR2(4000) PATH '$.name'
|
||||
));~';
|
||||
RETURN v_query;
|
||||
END;
|
||||
----------------------------------------------
|
||||
----------------------------------------------
|
||||
PROCEDURE p_manage_object_form (
|
||||
pi_selector IN VARCHAR2,
|
||||
pi_groups IN VARCHAR2,
|
||||
p_selected_list IN OUT CLOB,
|
||||
p_selected_obj IN OUT CLOB
|
||||
) AS
|
||||
|
||||
v_json_array json_array_t := json_array_t();
|
||||
v_object VARCHAR2(4000);
|
||||
v_object_aux VARCHAR2(4000);
|
||||
v_array apex_application_global.vc_arr2;
|
||||
v_coincidence_flag NUMBER := 0;
|
||||
v_log_message CLOB;
|
||||
v_error VARCHAR2(500);
|
||||
BEGIN
|
||||
IF pi_selector IS NOT NULL THEN
|
||||
FOR i IN 1..regexp_count(
|
||||
pi_selector,
|
||||
':'
|
||||
) + 1 LOOP
|
||||
v_object := regexp_substr(
|
||||
pi_selector,
|
||||
'[^:]+',
|
||||
1,
|
||||
i
|
||||
);
|
||||
BEGIN
|
||||
SELECT object_json
|
||||
INTO v_object_aux
|
||||
FROM
|
||||
JSON_TABLE (
|
||||
JSON(
|
||||
p_selected_obj
|
||||
), '$[*]'
|
||||
COLUMNS
|
||||
object_name PATH '$.object_name',
|
||||
object_json JSON PATH '$'
|
||||
)
|
||||
q
|
||||
WHERE q.object_name = utl_url.unescape(v_object);
|
||||
|
||||
-- v_object_aux := UTL_URL.UNESCAPE(v_object_aux);
|
||||
|
||||
EXCEPTION
|
||||
WHEN no_data_found THEN
|
||||
v_object_aux := '{"object_id":"'
|
||||
|| pi_groups
|
||||
|| '","object_name":"'
|
||||
|| utl_url.unescape(v_object)
|
||||
|| '","object_order":"'
|
||||
|| i
|
||||
|| '"}';
|
||||
WHEN too_many_rows THEN
|
||||
v_error := sqlerrm;
|
||||
INSERT INTO internal_test VALUES (
|
||||
systimestamp,
|
||||
p_selected_obj,
|
||||
v_error,
|
||||
pi_selector
|
||||
);
|
||||
|
||||
COMMIT;
|
||||
END;
|
||||
|
||||
v_json_array.append(
|
||||
JSON(
|
||||
v_object_aux
|
||||
)
|
||||
);
|
||||
END LOOP;
|
||||
|
||||
p_selected_list := pi_selector;
|
||||
p_selected_obj := v_json_array.to_clob();
|
||||
END IF;
|
||||
END;
|
||||
----------------------------------------------
|
||||
PROCEDURE p_save_object_form(
|
||||
pi_selected_obj IN CLOB,
|
||||
pi_json_parameter IN CLOB,
|
||||
po_message OUT VARCHAR2
|
||||
) AS
|
||||
v_groups VARCHAR2(400);
|
||||
v_selected_list CLOB;
|
||||
v_selector CLOB; -- 'test1.txt:test2.txt:test3.txt:test4.txt'
|
||||
v_id_request NUMBER := 0;
|
||||
v_id_pattern NUMBER := 0;
|
||||
v_id_req_hgroup VARCHAR2(400);
|
||||
v_selected_obj CLOB;
|
||||
BEGIN
|
||||
|
||||
v_selector := JSON_VALUE(pi_json_parameter, '$.selector');
|
||||
v_groups := JSON_VALUE(pi_json_parameter, '$.groups');
|
||||
v_selected_list := JSON_VALUE(pi_json_parameter, '$.selected_list');
|
||||
v_id_request := JSON_VALUE(pi_json_parameter, '$.id_request');
|
||||
v_id_pattern := JSON_VALUE(pi_json_parameter, '$.id_pattern');
|
||||
v_id_req_hgroup := JSON_VALUE(pi_json_parameter, '$.id_req_hgroup');
|
||||
|
||||
v_selected_obj := pi_selected_obj;
|
||||
|
||||
DELETE deployment_req_object
|
||||
WHERE id_req_hgroup = v_id_req_hgroup;
|
||||
COMMIT;
|
||||
|
||||
IF v_selector IS NOT NULL THEN
|
||||
|
||||
INSERT INTO deployment_req_object (
|
||||
id_dep_req_object,
|
||||
id_request,
|
||||
id_pattern,
|
||||
id_req_hgroup,
|
||||
object_order,
|
||||
id_object_repo,
|
||||
id_reqdet_instance,
|
||||
object_dep_status,
|
||||
object_version,
|
||||
object_name,
|
||||
object_source_path
|
||||
)SELECT s_deployment_req_obj_id.NEXTVAL,
|
||||
v_id_request,
|
||||
v_id_pattern,
|
||||
v_id_req_hgroup,
|
||||
ROWNUM as object_order,
|
||||
object_id,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
UTL_URL.UNESCAPE(REGEXP_SUBSTR(object_name, '[^/]+$', 1, 1)) as object_name,
|
||||
UTL_URL.UNESCAPE(REGEXP_SUBSTR(object_name, '.*\/')) as object_path
|
||||
FROM
|
||||
JSON_TABLE(
|
||||
JSON(
|
||||
pi_selected_obj
|
||||
),
|
||||
'$[*]'
|
||||
COLUMNS (
|
||||
object_name VARCHAR2 ( 300 ) PATH '$.object_name',
|
||||
object_id VARCHAR2 ( 300 ) PATH '$.object_id'
|
||||
)
|
||||
);
|
||||
|
||||
COMMIT;
|
||||
END IF;
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
po_message := 'Error: ' || sqlerrm;
|
||||
END;
|
||||
----------------------------------------------
|
||||
END pkg_repository_actions;
|
||||
|
||||
/
|
||||
722
DB/PACKAGE_BODIES/PKG_SICD_COMMONS.sql
Normal file
722
DB/PACKAGE_BODIES/PKG_SICD_COMMONS.sql
Normal file
@@ -0,0 +1,722 @@
|
||||
--------------------------------------------------------
|
||||
-- DDL for Package Body PKG_SICD_COMMONS
|
||||
--------------------------------------------------------
|
||||
|
||||
CREATE OR REPLACE EDITIONABLE PACKAGE BODY "ENVX_OPER"."PKG_SICD_COMMONS" AS
|
||||
|
||||
/*--------------- FNC01-------------------*/
|
||||
|
||||
FUNCTION f_rest_call(
|
||||
p_body IN VARCHAR2,
|
||||
p_url IN VARCHAR2,
|
||||
p_http_verb IN VARCHAR2,
|
||||
p_http_version IN VARCHAR2,
|
||||
p_http_content_type IN VARCHAR2 DEFAULT NULL,
|
||||
p_http_accept IN VARCHAR2,
|
||||
p_one_way IN BOOLEAN DEFAULT false,
|
||||
p_response_text OUT CLOB,
|
||||
p_reason_phrase OUT VARCHAR2
|
||||
) RETURN NUMBER AS
|
||||
t_http_req utl_http.req;
|
||||
t_http_resp utl_http.resp;
|
||||
p_http_response_code NUMBER;
|
||||
v_url VARCHAR2(2000);
|
||||
log_program_name VARCHAR2(50) := 'pkg_sicd_commons.f_rest_call';
|
||||
BEGIN
|
||||
p_response_text := '';
|
||||
--Seteamos la URL, el verbo y la version de HTTP
|
||||
t_http_req := utl_http.begin_request(p_url, p_http_verb, p_http_version);
|
||||
utl_http.set_transfer_timeout(60);
|
||||
--Seteamos el tipo de contenido del request y del response
|
||||
utl_http.set_header(t_http_req, 'accept-encoding', 'gzip, deflate');
|
||||
utl_http.set_header(t_http_req, 'Accept', p_http_accept);
|
||||
|
||||
--Definimos el tama?o del contenido
|
||||
utl_http.set_header(t_http_req, 'Content-Length', length(p_body));
|
||||
|
||||
--Grabamos el body en el request
|
||||
utl_http.write_text(t_http_req, p_body);
|
||||
|
||||
--Invocamos el Web Service
|
||||
t_http_resp := utl_http.get_response(t_http_req);
|
||||
dbms_output.put_line('Codigo http retornado = ' || t_http_resp.status_code);
|
||||
IF (p_one_way = false) THEN
|
||||
utl_http.read_text(t_http_resp, p_response_text);
|
||||
--p_response_text := (CONVERT(p_response_text, 'WE8ISO8859P1', 'utf8'));
|
||||
END IF;
|
||||
|
||||
p_http_response_code := t_http_resp.status_code;
|
||||
p_reason_phrase := t_http_resp.reason_phrase;
|
||||
dbms_output.put_line('p_reason_phrase = ' || p_reason_phrase);
|
||||
-- Cerramos la comunicacion request/response
|
||||
utl_http.end_response(t_http_resp);
|
||||
|
||||
------------------------------------------------------------------
|
||||
log_collector(
|
||||
pi_program_name => log_program_name,
|
||||
pi_log_level => 4, --- DEBUG
|
||||
pi_log_message => 'VARIABLES p_http_response_code: ' || p_http_response_code
|
||||
);
|
||||
------------------------------------------------------------------
|
||||
RETURN p_http_response_code;
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
------------------------------------------------------------------
|
||||
log_collector(
|
||||
pi_program_name => log_program_name,
|
||||
pi_log_level => 2, --- WARNING
|
||||
pi_log_message => 'ERROR: ' || sqlerrm
|
||||
);
|
||||
------------------------------------------------------------------
|
||||
p_response_text := 'Error al ejecutar '
|
||||
|| p_url
|
||||
|| sqlerrm
|
||||
|| '-'
|
||||
|| dbms_utility.format_error_backtrace;
|
||||
|
||||
p_http_response_code := sqlcode;
|
||||
p_reason_phrase := 'error';
|
||||
RETURN p_http_response_code;
|
||||
END f_rest_call;
|
||||
|
||||
/*--------------- FNC02-------------------*/
|
||||
|
||||
FUNCTION f_system_message(
|
||||
pi_id_message NUMBER,
|
||||
pi_message_class VARCHAR2,
|
||||
pi_return_type NUMBER DEFAULT 1
|
||||
-- 0- SIMPLE / 1- COMPLETE / 2- ADDITIONAL INFO
|
||||
) RETURN VARCHAR2 AS
|
||||
v_message VARCHAR2(1000);
|
||||
v_additional_info VARCHAR2(1000);
|
||||
log_program_name VARCHAR2(50) := 'pkg_sicd_commons.f_system_message';
|
||||
BEGIN
|
||||
SELECT m.message_text,
|
||||
m.additional_info
|
||||
INTO v_message,
|
||||
v_additional_info
|
||||
FROM system_message m
|
||||
WHERE m.id_message = pi_id_message
|
||||
AND m.id_message_class = pi_message_class;
|
||||
|
||||
CASE pi_return_type
|
||||
WHEN 1 THEN
|
||||
RETURN v_message;
|
||||
WHEN 2 THEN
|
||||
RETURN pi_message_class
|
||||
|| '-'
|
||||
|| lpad(pi_id_message, 5, '0')
|
||||
|| ';'
|
||||
|| v_message;
|
||||
WHEN 3 THEN
|
||||
RETURN pi_message_class
|
||||
|| '-'
|
||||
|| lpad(pi_id_message, 5, '0')
|
||||
|| ';'
|
||||
|| v_additional_info;
|
||||
END CASE;
|
||||
------------------------------------------------------------------
|
||||
log_collector(
|
||||
pi_program_name => log_program_name,
|
||||
pi_log_level => 4, --- DEBUG
|
||||
pi_log_message => 'VARIABLES v_message,v_additional_info: '
|
||||
|| v_message
|
||||
|| ','
|
||||
|| v_additional_info
|
||||
);
|
||||
------------------------------------------------------------------
|
||||
|
||||
EXCEPTION
|
||||
WHEN no_data_found THEN
|
||||
--- WTF error ---
|
||||
------------------------------------------------------------------
|
||||
log_collector(
|
||||
pi_program_name => log_program_name,
|
||||
pi_log_level => 2, --- WARNING
|
||||
pi_log_message => 'ERROR: ' || sqlerrm
|
||||
);
|
||||
------------------------------------------------------------------
|
||||
RETURN 'WTF-0000: Error desconocido, contacte con el administrador del sistema';
|
||||
END;
|
||||
|
||||
/*--------------- FNC03-------------------*/
|
||||
|
||||
FUNCTION get_parameter_value(
|
||||
param_name VARCHAR2
|
||||
) RETURN VARCHAR2 AS
|
||||
p_value VARCHAR2(4000);
|
||||
log_program_name VARCHAR2(50) := 'pkg_sicd_commons.get_parameter_value';
|
||||
BEGIN
|
||||
SELECT parameter_value
|
||||
INTO p_value
|
||||
FROM system_parameter
|
||||
WHERE parameter_name = param_name
|
||||
AND unique_param_value = 1;
|
||||
apex_debug.info('pkg_sicd_commons.get_parameter_value - p_value: %s', p_value);
|
||||
------------------------------------------------------------------
|
||||
log_collector(
|
||||
pi_program_name => log_program_name,
|
||||
pi_log_level => 4, --- DEBUG
|
||||
pi_log_message => 'VARIABLES p_value: ' || p_value
|
||||
);
|
||||
------------------------------------------------------------------
|
||||
RETURN p_value;
|
||||
EXCEPTION
|
||||
WHEN no_data_found THEN
|
||||
------------------------------------------------------------------
|
||||
log_collector(
|
||||
pi_program_name => log_program_name,
|
||||
pi_log_level => 2, --- WARNING
|
||||
pi_log_message => 'ERROR: '
|
||||
|| sqlerrm
|
||||
|| ' - Parámetro consultado: '
|
||||
|| param_name
|
||||
);
|
||||
------------------------------------------------------------------
|
||||
RETURN NULL;
|
||||
END;
|
||||
|
||||
/*--------------- FNC04-------------------*/
|
||||
FUNCTION get_parameter_list(
|
||||
param_name VARCHAR2
|
||||
) RETURN SYS_REFCURSOR AS
|
||||
v_values SYS_REFCURSOR;
|
||||
v_list CLOB;
|
||||
v_query CLOB;
|
||||
log_program_name VARCHAR2(50) := 'pkg_sicd_commons.get_parameter_list';
|
||||
BEGIN
|
||||
|
||||
SELECT parameter_value
|
||||
INTO v_list
|
||||
FROM system_parameter sp
|
||||
WHERE parameter_name = param_name
|
||||
AND id_status_parameter = 1
|
||||
AND id_parameter_type = 4;
|
||||
|
||||
v_query := q'~SELECT regexp_substr(valores, '[^,]+', 1, level) AS valor
|
||||
FROM (select '~'||v_list||q'~' as valores from dual)
|
||||
CONNECT BY level <= regexp_count(valores, ',') + 1~';
|
||||
|
||||
OPEN v_values FOR v_query;
|
||||
|
||||
RETURN v_values;
|
||||
EXCEPTION
|
||||
WHEN no_data_found THEN
|
||||
------------------------------------------------------------------
|
||||
log_collector(
|
||||
pi_program_name => log_program_name,
|
||||
pi_log_level => 2, --- WARNING
|
||||
pi_log_message => 'ERROR: ' || sqlerrm
|
||||
);
|
||||
------------------------------------------------------------------
|
||||
RETURN NULL;
|
||||
END;
|
||||
|
||||
/*--------------- FNC05-------------------*/
|
||||
FUNCTION get_parameter_list_q(
|
||||
param_name VARCHAR2
|
||||
) RETURN VARCHAR2 AS
|
||||
v_list CLOB;
|
||||
v_query CLOB;
|
||||
log_program_name VARCHAR2(50) := 'pkg_sicd_commons.get_parameter_list_q';
|
||||
BEGIN
|
||||
|
||||
SELECT parameter_value
|
||||
INTO v_list
|
||||
FROM system_parameter sp
|
||||
WHERE parameter_name = param_name
|
||||
AND id_status_parameter = 1
|
||||
AND id_parameter_type = 4;
|
||||
|
||||
v_query := q'~SELECT regexp_substr(valores, '[^,]+', 1, level) AS valor
|
||||
FROM (select '~'||v_list||q'~' as valores from dual)
|
||||
CONNECT BY level <= regexp_count(valores, ',') + 1~';
|
||||
|
||||
apex_debug.info('pkg_sicd_commons.get_parameter_value - v_query: %s', v_query);
|
||||
------------------------------------------------------------------
|
||||
log_collector(
|
||||
pi_program_name => log_program_name,
|
||||
pi_log_level => 4, --- DEBUG
|
||||
pi_log_message => 'VARIABLES v_query: ' || v_query
|
||||
);
|
||||
------------------------------------------------------------------
|
||||
RETURN v_query;
|
||||
EXCEPTION
|
||||
WHEN no_data_found THEN
|
||||
------------------------------------------------------------------
|
||||
log_collector(
|
||||
pi_program_name => log_program_name,
|
||||
pi_log_level => 2, --- WARNING
|
||||
pi_log_message => 'ERROR: ' || sqlerrm
|
||||
);
|
||||
------------------------------------------------------------------
|
||||
RETURN NULL;
|
||||
END;
|
||||
|
||||
/*--------------- FNC06-------------------*/
|
||||
|
||||
FUNCTION fnc_ldap_auth(
|
||||
p_username IN VARCHAR2,
|
||||
p_password IN VARCHAR2
|
||||
) RETURN BOOLEAN IS
|
||||
|
||||
l_ldap_host VARCHAR2(250) := 'ldapsvr.caja.com';
|
||||
l_ldap_port VARCHAR2(250) := '389';
|
||||
l_ldap_base VARCHAR2(250) := 'o=Cas';
|
||||
l_dn_user VARCHAR2(250);
|
||||
l_retval PLS_INTEGER;
|
||||
l_session dbms_ldap.session;
|
||||
log_program_name VARCHAR2(50) := 'pkg_sicd_commons.fnc_ldap_auth';
|
||||
BEGIN
|
||||
IF p_username IS NULL OR p_password IS NULL THEN
|
||||
raise_application_error(-20000, 'Debe especificar sus credenciales.');
|
||||
END IF;
|
||||
|
||||
dbms_ldap.use_exception := true;
|
||||
|
||||
-- Selecciono de LDAP el DN del usuario que se intenta loguear y verifico que exista en el grupo GRP_SED
|
||||
|
||||
IF upper(p_username) = 'ADMIN' THEN
|
||||
RETURN true;
|
||||
ELSE
|
||||
SELECT dn
|
||||
INTO l_dn_user
|
||||
FROM TABLE (apex_ldap.search(
|
||||
p_username => 'cn=LdapSed,ou=CuentasdeServicio,o=Cas',
|
||||
p_pass => 'LDAPSEDsistemas20caracteres',
|
||||
p_host => 'ldapsvr.caja.com',
|
||||
p_search_base => 'o=Cas',
|
||||
p_search_filter => '&(objectClass=person)(uid='
|
||||
|| p_username
|
||||
|| ')(groupMembership=cn=GRP_SED,ou=Grupos,ou=Menu,ou=LOGICA,o=Cas)',
|
||||
p_attribute_names => 'cn'
|
||||
));
|
||||
|
||||
IF length(l_dn_user) > 1 THEN
|
||||
-- Conexion con el servidor de LDAP.
|
||||
l_session := dbms_ldap.init(
|
||||
hostname => l_ldap_host,
|
||||
portnum => l_ldap_port
|
||||
);
|
||||
l_retval := dbms_ldap.simple_bind_s(
|
||||
ld => l_session,
|
||||
dn => l_dn_user,
|
||||
passwd => p_password
|
||||
);
|
||||
l_retval := dbms_ldap.unbind_s(ld => l_session);
|
||||
apex_debug.warn('pkg_sicd_commons.fnc_ldap_auth %s usuario: %s clave %s', 'Ingreso correctamente', l_dn_user, p_password);
|
||||
RETURN true;
|
||||
END IF;
|
||||
RETURN false;
|
||||
END IF;
|
||||
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
apex_util.set_custom_auth_status(p_status => 'Usuario o Contraseña incorrectos');
|
||||
------------------------------------------------------------------
|
||||
log_collector(
|
||||
pi_program_name => log_program_name,
|
||||
pi_log_level => 2, --- WARNING
|
||||
pi_log_message => 'ERROR: ' || sqlerrm
|
||||
);
|
||||
------------------------------------------------------------------
|
||||
l_retval := dbms_ldap.unbind_s(ld => l_session);
|
||||
RETURN false;
|
||||
END;
|
||||
|
||||
/*--------------- FNC07-------------------*/
|
||||
|
||||
FUNCTION f_access_token_sicddb RETURN VARCHAR2 AS
|
||||
v_url VARCHAR2(500);
|
||||
v_credentials VARCHAR2(1000);
|
||||
v_http_method VARCHAR2(100) := 'POST';
|
||||
v_http_code NUMBER := 0;
|
||||
v_access_token CLOB := '0';
|
||||
v_body CLOB;
|
||||
log_program_name VARCHAR2(250) := 'f_access_token_sicddb';
|
||||
BEGIN
|
||||
-- Busco la URL y las credenciales para solicitar token
|
||||
v_url := pkg_sicd_commons.get_parameter_value('WSO2_APIM_URL');
|
||||
v_credentials := pkg_sicd_commons.get_parameter_value('SICD_DB_APP_CREDENTIALS');
|
||||
|
||||
-- Configuro los HTTP headers para invocar al APIM
|
||||
apex_web_service.g_request_headers.DELETE();
|
||||
apex_web_service.g_request_headers(1).name := 'Authorization';
|
||||
apex_web_service.g_request_headers(1).value := 'Basic ' || v_credentials;
|
||||
apex_web_service.g_request_headers(2).name := 'Content-Type';
|
||||
apex_web_service.g_request_headers(2).value := 'application/json';
|
||||
|
||||
-- Realizo la invocación al APIM para solicitar token
|
||||
v_body := apex_web_service.make_rest_request(
|
||||
p_url => v_url,
|
||||
p_http_method => v_http_method,
|
||||
p_body => '{"grant_type" : "client_credentials"}'
|
||||
);
|
||||
v_http_code := apex_web_service.g_status_code;
|
||||
|
||||
-- Analizo si fue exitoso el pedido de token o no
|
||||
IF v_http_code = 200 THEN
|
||||
-- Si fue exitoso, guardo el access_token recibido en la tabla de parámetros
|
||||
SELECT JSON_VALUE(v_body, '$.access_token' returning clob)
|
||||
INTO v_access_token
|
||||
FROM dual;
|
||||
|
||||
UPDATE system_parameter
|
||||
SET parameter_value = v_access_token
|
||||
WHERE parameter_name = 'SICD_DB_APP_ACCESS_TOKEN';
|
||||
|
||||
IF SQL%rowcount != 1 THEN
|
||||
INSERT INTO system_parameter (
|
||||
parameter_name,
|
||||
parameter_value,
|
||||
id_status_parameter,
|
||||
creation_date,
|
||||
unique_param_value,
|
||||
paramater_func_name
|
||||
)
|
||||
VALUES (
|
||||
'SICD_DB_APP_ACCESS_TOKEN',
|
||||
v_access_token,
|
||||
1,
|
||||
sysdate,
|
||||
1,
|
||||
'Access Token para peticiones en API Manager'
|
||||
);
|
||||
END IF;
|
||||
|
||||
log_collector(
|
||||
pi_program_name => log_program_name,
|
||||
pi_log_level => 4, --- DEBUG
|
||||
pi_log_message => substr(
|
||||
'Se obtuvo el token - HTTP code recibido: '
|
||||
|| v_http_code
|
||||
|| ' - response: '
|
||||
|| v_body,
|
||||
1,
|
||||
3900
|
||||
)
|
||||
);
|
||||
|
||||
ELSE
|
||||
-- Si no fue exitoso, escribo log
|
||||
log_collector(
|
||||
pi_program_name => log_program_name,
|
||||
pi_log_level => 1, --- ERROR
|
||||
pi_log_message => substr(
|
||||
'Error - Se obtuvo un HTTP code distinto de 200 - HTTP code recibido: '
|
||||
|| v_http_code
|
||||
|| ' - response: '
|
||||
|| v_body
|
||||
|| ' - Detalle del error: '
|
||||
|| sqlerrm,
|
||||
1,
|
||||
3900
|
||||
)
|
||||
);
|
||||
END IF;
|
||||
|
||||
-- Retorno el access_token obtenido o un '0' para indicar que hubo algún problema en la solicitud del token
|
||||
RETURN v_access_token;
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
-- En caso de algún error escribo log
|
||||
log_collector(
|
||||
pi_program_name => log_program_name,
|
||||
pi_log_level => 1, --- ERROR
|
||||
pi_log_message => substr(
|
||||
'Error EXCEPTION WHEN OTHERS - Detalle del error: '
|
||||
|| sqlerrm
|
||||
|| ' - Ubicación: '
|
||||
|| dbms_utility.format_error_backtrace,
|
||||
1,
|
||||
3900
|
||||
)
|
||||
);
|
||||
RETURN v_access_token;
|
||||
END;
|
||||
|
||||
/*--------------- FNC08-------------------*/
|
||||
FUNCTION fnc_ad_auth(
|
||||
p_username IN VARCHAR2,
|
||||
p_password IN VARCHAR2
|
||||
) RETURN BOOLEAN IS
|
||||
|
||||
l_ldap_host VARCHAR2(500) := 'ldaplc.lc.gc.local';
|
||||
l_ldap_port VARCHAR2(500) := '389';
|
||||
l_ldap_base VARCHAR2(500) := 'DC=lc,DC=gc,DC=local';
|
||||
l_dn_user VARCHAR2(500);
|
||||
l_retval PLS_INTEGER;
|
||||
l_session dbms_ldap.session;
|
||||
v_boolean BOOLEAN;
|
||||
log_program_name VARCHAR2(50) := 'pkg_sicd_commons.fnc_ad_auth';
|
||||
BEGIN
|
||||
IF p_username IS NULL OR p_password IS NULL THEN
|
||||
raise_application_error(-20000, 'Debe especificar sus credenciales.');
|
||||
END IF;
|
||||
|
||||
dbms_ldap.use_exception := true;
|
||||
SELECT dn
|
||||
INTO l_dn_user
|
||||
FROM TABLE (apex_ldap.search(
|
||||
p_username => 'CN=LCU SICD LDAP,OU=Usuarios de Servicios,DC=lc,DC=gc,DC=local',
|
||||
p_pass => 'martesSICDsegura10',
|
||||
p_host => 'ldaplc.lc.gc.local',
|
||||
p_search_base => 'DC=lc,DC=gc,DC=local',
|
||||
p_search_filter => '&(objectClass=person)(userPrincipalName='
|
||||
|| p_username
|
||||
|| '@lc.gc.local)(memberOf=CN=LCGU_SICD_Users,OU=Grupos,DC=lc,DC=gc,DC=local)',
|
||||
p_attribute_names => 'CN'
|
||||
));
|
||||
|
||||
IF length(l_dn_user) > 1 THEN
|
||||
l_session := dbms_ldap.init(l_ldap_host, l_ldap_port);
|
||||
l_retval := dbms_ldap.simple_bind_s(
|
||||
ld => l_session,
|
||||
dn => l_dn_user,
|
||||
passwd => p_password
|
||||
);
|
||||
l_retval := dbms_ldap.unbind_s(ld => l_session);
|
||||
v_boolean := true;
|
||||
RETURN v_boolean;
|
||||
END IF;
|
||||
|
||||
v_boolean := false;
|
||||
RETURN v_boolean;
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
apex_util.set_custom_auth_status(p_status => 'Usuario o Contraseña incorrectos');
|
||||
IF length(l_session) > 1 THEN
|
||||
l_retval := dbms_ldap.unbind_s(ld => l_session);
|
||||
END IF;
|
||||
|
||||
------------------------------------------------------------------
|
||||
log_collector(
|
||||
pi_program_name => log_program_name,
|
||||
pi_log_level => 2, --- WARNING
|
||||
pi_log_message => 'ERROR: ' || sqlerrm
|
||||
);
|
||||
------------------------------------------------------------------
|
||||
|
||||
v_boolean := false;
|
||||
RETURN v_boolean;
|
||||
END;
|
||||
|
||||
/*--------------- FNC09-------------------*/
|
||||
FUNCTION fnc_auth_groups(
|
||||
p_js_parameters json DEFAULT NULL
|
||||
) RETURN BOOLEAN IS
|
||||
BEGIN
|
||||
RETURN true;
|
||||
END;
|
||||
|
||||
/*--------------- FNC10-------------------*/
|
||||
FUNCTION fnc_parameter_validator(pi_value IN CLOB, pi_type IN NUMBER)
|
||||
RETURN BOOLEAN
|
||||
IS
|
||||
v_num NUMBER;
|
||||
v_date DATE;
|
||||
v_json json_object_t;
|
||||
v_format VARCHAR2(100);
|
||||
BEGIN
|
||||
|
||||
SELECT parameter_type_format
|
||||
INTO v_format
|
||||
FROM system_parameter_type spt
|
||||
WHERE id_parameter_type = pi_type;
|
||||
|
||||
-- Intenta convertir el valor a un número
|
||||
CASE pi_type
|
||||
WHEN 1 THEN
|
||||
--- NUMERO ---
|
||||
BEGIN
|
||||
v_num := TO_NUMBER(pi_value);
|
||||
RETURN true;
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
RETURN false;
|
||||
END;
|
||||
WHEN 2 THEN
|
||||
--- FECHA Y HORA ---
|
||||
BEGIN
|
||||
v_date := TO_DATE(pi_value, 'YYYY-MM-DD');
|
||||
RETURN true;
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
RETURN false;
|
||||
END;
|
||||
WHEN 3 THEN
|
||||
--- JSON ---
|
||||
BEGIN
|
||||
v_json := json_object_t.parse(pi_value);
|
||||
RETURN true;
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
RETURN false;
|
||||
END;
|
||||
WHEN 4 THEN
|
||||
--- LISTA DE VALORES ---
|
||||
IF regexp_like(pi_value, '^''[[:alnum:]]+''(,''[[:alnum:]]+'')*$') THEN
|
||||
RETURN true;
|
||||
ELSE
|
||||
RETURN false;
|
||||
END IF;
|
||||
|
||||
WHEN 0 THEN
|
||||
--- TEXTO SIN FORMATO ---
|
||||
RETURN true;
|
||||
END CASE;
|
||||
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
RETURN false;
|
||||
END;
|
||||
|
||||
/*--------------- PR01-------------------*/
|
||||
|
||||
PROCEDURE p_rest_call_apim(
|
||||
pi_url IN VARCHAR2,
|
||||
pi_http_method IN VARCHAR2 DEFAULT 'GET',
|
||||
pi_body IN CLOB DEFAULT empty_clob(),
|
||||
po_http_status OUT VARCHAR2,
|
||||
po_http_headers OUT http_headers_tab,
|
||||
po_response OUT CLOB,
|
||||
po_response_code OUT VARCHAR2,
|
||||
po_error_message OUT VARCHAR2
|
||||
) AS
|
||||
v_response CLOB;
|
||||
v_credentials CLOB;
|
||||
log_program_name VARCHAR2(250) := 'p_rest_call_apim';
|
||||
BEGIN
|
||||
po_response_code := 'OK';
|
||||
-- Busco el access_token para invocar al APIM
|
||||
--v_credentials := pkg_sicd_commons.get_parameter_value('SICD_DB_APP_ACCESS_TOKEN');
|
||||
v_credentials := pkg_sicd_commons.get_parameter_value('ENVX_APIKEY');
|
||||
|
||||
-- Configuro HTTP headers para invocar al APIM
|
||||
apex_web_service.g_request_headers.DELETE();
|
||||
-- apex_web_service.g_request_headers(1).name := 'Authorization'; -- OJO, Tener en cuenta para ejecutar la llamada al APIM de manera correcta
|
||||
-- apex_web_service.g_request_headers(1).value := 'Bearer ' || v_credentials; -- OJO, Tener en cuenta para ejecutar la llamada al APIM de manera correcta
|
||||
|
||||
apex_web_service.g_request_headers(1).name := 'apikey';
|
||||
apex_web_service.g_request_headers(1).value := v_credentials;
|
||||
|
||||
-- Realizo la invocación al APIM
|
||||
po_response := apex_web_service.make_rest_request(
|
||||
p_url => pi_url,
|
||||
p_http_method => pi_http_method,
|
||||
p_body => pi_body
|
||||
);
|
||||
|
||||
-- Obtengo el cófigo HTTP de respuesta y lo escribo en el log
|
||||
po_http_status := apex_web_service.g_status_code;
|
||||
log_collector(
|
||||
pi_program_name => log_program_name,
|
||||
pi_log_level => 4, --- DEBUG
|
||||
pi_log_message => substr(
|
||||
'Se ejecuta request hacia AM - HTTP code recibido: '
|
||||
|| po_http_status
|
||||
|| ' - response: '
|
||||
|| po_response,
|
||||
1,
|
||||
3900
|
||||
)
|
||||
);
|
||||
|
||||
-- Analizo si el access_token utilizado esta vencido o no
|
||||
IF po_http_status = 401 THEN
|
||||
-- El access_token utilizado esta vencido
|
||||
log_collector(
|
||||
pi_program_name => log_program_name,
|
||||
pi_log_level => 3, --- INFO
|
||||
pi_log_message => 'Error invalid_credentials - HTTP code recibido: ' || po_http_status
|
||||
);
|
||||
|
||||
-- Solicito un nuevo access_token
|
||||
v_credentials := f_access_token_sicddb();
|
||||
|
||||
-- Si NO se pudo obtener un nuevo access_token
|
||||
IF v_credentials = '0' THEN
|
||||
log_collector(
|
||||
pi_program_name => log_program_name,
|
||||
pi_log_level => 1, --- ERROR
|
||||
pi_log_message => 'Error al solicitar token mediante invocación de rutina f_access_token_sicddb()'
|
||||
);
|
||||
po_response_code := 'ERROR';
|
||||
po_error_message := 'Error al solicitar token - Consulte con el administrador del sistema.';
|
||||
ELSE
|
||||
-- Si obtuvimos un nuevo access_token, configuro HTTP headers y realizo la invocación del APIM de nuevo
|
||||
apex_web_service.g_request_headers.DELETE();
|
||||
--apex_web_service.g_request_headers(1).name := 'Authorization';
|
||||
--apex_web_service.g_request_headers(1).value := 'Bearer ' || v_credentials; -- OJO, Tener en cuenta para ejecutar la llamada al APIM de manera correcta
|
||||
--apex_web_service.g_request_headers(1).value := 'Basic dmF0cm94OjExYjczNDVjODYxYTQzMWIxNTM1ZjQxYWU2NzExY2FkZWY=';
|
||||
apex_web_service.g_request_headers(1).name := 'apikey';
|
||||
apex_web_service.g_request_headers(1).value := v_credentials;
|
||||
po_response := apex_web_service.make_rest_request(
|
||||
p_url => pi_url,
|
||||
p_http_method => pi_http_method,
|
||||
p_body => pi_body
|
||||
);
|
||||
po_http_status := apex_web_service.g_status_code;
|
||||
END IF;
|
||||
|
||||
END IF;
|
||||
|
||||
-- Capturo los headers HTTP retornados y los almaceno en la variable de salida po_http_headers
|
||||
po_http_headers := http_headers_tab();
|
||||
FOR i IN 1..apex_web_service.g_headers.count
|
||||
LOOP
|
||||
po_http_headers.extend(1);
|
||||
po_http_headers(po_http_headers.last) := http_headers_obj(apex_web_service.g_headers(i).name, apex_web_service.g_headers(i).value);
|
||||
log_collector(
|
||||
pi_program_name => log_program_name,
|
||||
pi_log_level => 4, --- DEBUG
|
||||
pi_log_message => substr(
|
||||
'HTTP header OUT - '
|
||||
|| po_http_headers(i).campo
|
||||
|| ': '
|
||||
|| po_http_headers(i).valor,
|
||||
1,
|
||||
3900
|
||||
)
|
||||
);
|
||||
END LOOP;
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
-- En caso de algún error, escribo log y cargo las variables de error de salida
|
||||
log_collector(
|
||||
pi_program_name => log_program_name,
|
||||
pi_log_level => 1, --- ERROR
|
||||
pi_log_message => substr(
|
||||
'Error EXCEPTION WHEN OTHERS - Detalle del error: '
|
||||
|| sqlerrm
|
||||
|| ' - Ubicación: '
|
||||
|| dbms_utility.format_error_backtrace
|
||||
|| ' - HTTP code recibido: '
|
||||
|| po_http_status
|
||||
|| ' - response: '
|
||||
|| po_response,
|
||||
1,
|
||||
3900
|
||||
)
|
||||
);
|
||||
po_response_code := 'ERROR';
|
||||
po_error_message := substr(
|
||||
'Error: '
|
||||
|| sqlerrm
|
||||
|| ' - HTTP code recibido: '
|
||||
|| po_http_status
|
||||
|| ' - response: '
|
||||
|| po_response,
|
||||
1,
|
||||
3900
|
||||
);
|
||||
END;
|
||||
|
||||
-------------------------------------------
|
||||
|
||||
END pkg_sicd_commons;
|
||||
|
||||
/
|
||||
|
||||
GRANT EXECUTE ON "ENVX_OPER"."PKG_SICD_COMMONS" TO "APEX_REST_PUBLIC_USER";
|
||||
GRANT DEBUG ON "ENVX_OPER"."PKG_SICD_COMMONS" TO "APEX_REST_PUBLIC_USER";
|
||||
172
DB/PACKAGE_BODIES/PKG_SICD_JIRA.sql
Normal file
172
DB/PACKAGE_BODIES/PKG_SICD_JIRA.sql
Normal file
@@ -0,0 +1,172 @@
|
||||
--------------------------------------------------------
|
||||
-- DDL for Package Body PKG_SICD_JIRA
|
||||
--------------------------------------------------------
|
||||
|
||||
CREATE OR REPLACE EDITIONABLE PACKAGE BODY "ENVX_OPER"."PKG_SICD_JIRA" AS
|
||||
|
||||
|
||||
/*--------------- PRC1-------------------*/
|
||||
PROCEDURE jira_search (
|
||||
username IN VARCHAR,
|
||||
pass IN VARCHAR,
|
||||
jql IN VARCHAR,
|
||||
resp OUT CLOB
|
||||
) AS
|
||||
--l_clob CLOB;
|
||||
--request_clob CLOB;
|
||||
BEGIN
|
||||
|
||||
---
|
||||
log_program_name := 'pkg_sicd_jira.jira_search(PRC1)';
|
||||
---
|
||||
|
||||
-- TODO: Implementation required for PROCEDURE PKG_SICD_JIRA.JIRA_SEARCH
|
||||
--request_clob := '{ "expand": ["names"],"jql": "project=ITDES AND assignee=vatrox04","startAt": 0,"maxResults": 20,"fields": ["id","key","summary","assignee","status"]}';
|
||||
|
||||
-- Es necesario fijar esto para que funcione
|
||||
apex_web_service.g_request_headers(1).name := 'Content-Type';
|
||||
apex_web_service.g_request_headers(1).value := 'application/json;charset=UTF-8';
|
||||
|
||||
-- Invocar al API de JIRA con los parametros suministrados.
|
||||
resp := apex_web_service.make_rest_request(
|
||||
p_url => 'http://jira.caja.com:20000/rest/api/2/search',
|
||||
p_http_method => 'POST',
|
||||
p_body => to_clob(jql),
|
||||
p_username => username,
|
||||
p_password => pass
|
||||
);
|
||||
-- Capturar excepciones
|
||||
/*
|
||||
l_clob := apex_web_service.make_rest_request(
|
||||
p_url => 'http://jira.caja.com:20000/rest/api/2/search',
|
||||
p_http_method => 'POST',
|
||||
p_body => request_clob,
|
||||
p_username => 'ldapsed',
|
||||
p_password => 'LDAPSEDsistemas20caracteres');*/
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
------------------------------------------------------------------
|
||||
log_collector(
|
||||
pi_program_name => log_program_name,
|
||||
pi_log_level => 2, --- WARNING
|
||||
pi_log_message => 'ERROR: ' || sqlerrm
|
||||
);
|
||||
------------------------------------------------------------------
|
||||
END jira_search;
|
||||
|
||||
/*--------------- PRC2-------------------*/
|
||||
PROCEDURE jira_search (
|
||||
username IN VARCHAR DEFAULT NULL,
|
||||
pass IN VARCHAR DEFAULT NULL,
|
||||
project_type IN VARCHAR,
|
||||
assignee IN VARCHAR,
|
||||
summary IN VARCHAR,
|
||||
ticket_key IN VARCHAR,
|
||||
ticket_status IN VARCHAR,
|
||||
files_returned IN NUMBER DEFAULT 20,
|
||||
p_mensaje OUT VARCHAR,
|
||||
p_error OUT VARCHAR
|
||||
) AS
|
||||
|
||||
criteriobusqueda VARCHAR2(4000);
|
||||
responseclob CLOB;
|
||||
p_username VARCHAR2(50);
|
||||
p_password VARCHAR2(200);
|
||||
BEGIN
|
||||
|
||||
---
|
||||
log_program_name := 'pkg_sicd_jira.jira_search(PRC2)';
|
||||
---
|
||||
|
||||
-- Control de parametros de autenticacion.
|
||||
IF username IS NULL OR pass IS NULL THEN
|
||||
p_username := pkg_sicd_commons.get_parameter_value('JIRA_USERNAME'); --
|
||||
p_password := pkg_sicd_commons.get_parameter_value('JIRA_PASSWORD');
|
||||
|
||||
--jira.user ldapsed
|
||||
--jira.password LDAPSEDsistemas20caracteres
|
||||
END IF;
|
||||
|
||||
-- Controlar el Tipo de Proyecto no sea Nulo
|
||||
|
||||
IF project_type IS NULL THEN
|
||||
raise_application_error(-20000, 'Tipo de Proyecto deben ser indicado');
|
||||
END IF;
|
||||
|
||||
|
||||
-- Armar el criterio de busqueda
|
||||
criteriobusqueda := '{ "expand": ["names"],"jql": "project='
|
||||
|| project_type
|
||||
||
|
||||
CASE
|
||||
WHEN
|
||||
length(assignee) > 0 THEN
|
||||
' AND assignee=' || assignee
|
||||
END
|
||||
||
|
||||
CASE
|
||||
WHEN
|
||||
length(ticket_key) > 0 THEN
|
||||
' AND key='
|
||||
|| project_type
|
||||
|| '-'
|
||||
|| ticket_key
|
||||
END
|
||||
||
|
||||
CASE
|
||||
WHEN
|
||||
length(ticket_status) > 0 THEN
|
||||
' AND status =' || ticket_status
|
||||
END
|
||||
||
|
||||
CASE
|
||||
WHEN
|
||||
length(summary) > 0 THEN
|
||||
' AND summary~'''
|
||||
|| summary
|
||||
|| ''''
|
||||
END
|
||||
|| '","startAt": 0,"maxResults":'
|
||||
|| files_returned
|
||||
|| ',"fields": ["id","key","summary","assignee","status"]}';
|
||||
|
||||
--dbms_output.put_line(criteriobusqueda);
|
||||
|
||||
jira_search(p_username, p_password, criteriobusqueda, responseclob);
|
||||
DELETE FROM tmp_reference_list;
|
||||
|
||||
INSERT INTO tmp_reference_list (
|
||||
id_reference,
|
||||
reference_description,
|
||||
reference_user,
|
||||
reference_status
|
||||
)
|
||||
SELECT e.*
|
||||
FROM
|
||||
JSON_TABLE ( responseclob, '$.issues[*]'
|
||||
COLUMNS (
|
||||
key VARCHAR2 ( 200 ) PATH '$.key',
|
||||
summary VARCHAR2 ( 200 ) PATH '$.fields.summary',
|
||||
displayname VARCHAR2 ( 200 ) PATH '$.fields.assignee.displayName',
|
||||
status VARCHAR2 ( 200 ) PATH '$.fields.status.name'
|
||||
)
|
||||
)
|
||||
e;
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
------------------------------------------------------------------
|
||||
log_collector(
|
||||
pi_program_name => log_program_name,
|
||||
pi_log_level => 2, --- WARNING
|
||||
pi_log_message => 'ERROR: ' || sqlerrm
|
||||
);
|
||||
------------------------------------------------------------------
|
||||
END jira_search;
|
||||
|
||||
END pkg_sicd_jira;
|
||||
|
||||
|
||||
/
|
||||
|
||||
GRANT EXECUTE ON "ENVX_OPER"."PKG_SICD_JIRA" TO "APEX_REST_PUBLIC_USER";
|
||||
GRANT DEBUG ON "ENVX_OPER"."PKG_SICD_JIRA" TO "APEX_REST_PUBLIC_USER";
|
||||
2615
DB/PACKAGE_BODIES/PKG_STANDARD_EXECUTORS.sql
Normal file
2615
DB/PACKAGE_BODIES/PKG_STANDARD_EXECUTORS.sql
Normal file
File diff suppressed because it is too large
Load Diff
906
DB/PACKAGE_BODIES/PKG_WORKFLOW_COORDINATOR.sql
Normal file
906
DB/PACKAGE_BODIES/PKG_WORKFLOW_COORDINATOR.sql
Normal file
@@ -0,0 +1,906 @@
|
||||
--------------------------------------------------------
|
||||
-- DDL for Package Body PKG_WORKFLOW_COORDINATOR
|
||||
--------------------------------------------------------
|
||||
|
||||
CREATE OR REPLACE EDITIONABLE PACKAGE BODY "ENVX_OPER"."PKG_WORKFLOW_COORDINATOR" AS
|
||||
|
||||
/*-------------------------------------------------------------------------*/
|
||||
/*---------------------------- FUNCTIONS ----------------------------------*/
|
||||
/*-------------------------------------------------------------------------*/
|
||||
FUNCTION chg_prof_h (
|
||||
pi_id_sys_profile IN NUMBER,
|
||||
pi_id_sup_sys_profile IN NUMBER,
|
||||
pi_id_role IN NUMBER
|
||||
) RETURN NUMBER AS
|
||||
v_aux_profile NUMBER := 0;
|
||||
BEGIN
|
||||
SELECT UNIQUE 0
|
||||
INTO v_aux_profile
|
||||
FROM (
|
||||
SELECT sp.id_sys_profile
|
||||
FROM system_profile sp
|
||||
WHERE sp.id_role = pi_id_role START WITH
|
||||
sp.id_sys_profile = pi_id_sys_profile
|
||||
CONNECT BY
|
||||
PRIOR sp.id_sys_profile = sp.id_sup_sys_profile
|
||||
) v
|
||||
WHERE v.id_sys_profile = pi_id_sup_sys_profile;
|
||||
|
||||
RETURN 0;
|
||||
EXCEPTION
|
||||
WHEN no_data_found THEN
|
||||
apex_debug.error('pkg_workflow_coordinator.chg_prof_h - %s', sqlerrm);
|
||||
RETURN 1;
|
||||
END;
|
||||
/*-------------------------------------------------------------------------*/
|
||||
FUNCTION chg_env_dir (
|
||||
pi_id_enviroment IN NUMBER,
|
||||
pi_id_parent_enviroment IN NUMBER,
|
||||
pi_id_enviroment_type IN NUMBER
|
||||
) RETURN NUMBER AS
|
||||
v_aux_enviroment NUMBER := 0;
|
||||
BEGIN
|
||||
SELECT UNIQUE 0
|
||||
INTO v_aux_enviroment
|
||||
FROM (
|
||||
SELECT e.id_enviroment
|
||||
FROM enviroment e
|
||||
WHERE e.id_enviroment = pi_id_enviroment START WITH
|
||||
e.id_enviroment = pi_id_enviroment
|
||||
CONNECT BY
|
||||
PRIOR e.id_enviroment = e.id_parent_enviroment
|
||||
) v
|
||||
WHERE v.id_enviroment = pi_id_parent_enviroment;
|
||||
|
||||
RETURN 0;
|
||||
EXCEPTION
|
||||
WHEN no_data_found THEN
|
||||
apex_debug.error('pkg_workflow_coordinator.chg_env_dir - %s', sqlerrm);
|
||||
RETURN 1;
|
||||
END;
|
||||
/*-------------------------------------------------------------------------*/
|
||||
FUNCTION next_step_flow (
|
||||
pi_id_action IN NUMBER,
|
||||
pi_id_step_flow IN NUMBER
|
||||
) RETURN NUMBER AS
|
||||
v_result INTEGER := 0;
|
||||
v_order INTEGER := 0;
|
||||
v_id_req_flow INTEGER := 0;
|
||||
v_id_action_category INTEGER := 0;
|
||||
v_step_deploy INTEGER := 0;
|
||||
BEGIN
|
||||
---------------------------------------------
|
||||
SELECT step_order,
|
||||
id_req_flow,
|
||||
(
|
||||
SELECT id_action_cat
|
||||
FROM request_action_flow ra
|
||||
WHERE ra.id_action = pi_id_action
|
||||
AND ra.id_step_flow = rf.id_step_flow
|
||||
) AS id_action_cat,
|
||||
rf.deploy_enable
|
||||
INTO v_order,
|
||||
v_id_req_flow,
|
||||
v_id_action_category,
|
||||
v_step_deploy
|
||||
FROM request_step_workflow rf
|
||||
WHERE rf.id_step_flow = pi_id_step_flow;
|
||||
|
||||
IF v_order = 1 AND nvl(v_id_action_category, 0) = 0 THEN
|
||||
v_id_action_category := 1;
|
||||
END IF;
|
||||
---------------------------------------------
|
||||
CASE v_id_action_category
|
||||
|
||||
/*- NEXT STEP ---*/
|
||||
WHEN 1 THEN
|
||||
SELECT MIN(id_step_flow)
|
||||
INTO v_result
|
||||
FROM request_step_workflow
|
||||
WHERE id_req_flow = v_id_req_flow
|
||||
AND step_order > v_order
|
||||
AND step_status = 1;
|
||||
|
||||
/*- PREVIUS STEP ---*/
|
||||
WHEN 2 THEN
|
||||
SELECT MAX(id_step_flow)
|
||||
INTO v_result
|
||||
FROM request_step_workflow
|
||||
WHERE id_req_flow = v_id_req_flow
|
||||
AND step_order < v_order
|
||||
AND step_status = 1;
|
||||
|
||||
/*- GO TO STEP ---*/
|
||||
WHEN 3 THEN
|
||||
SELECT id_step_go
|
||||
INTO v_result
|
||||
FROM request_action_flow ra
|
||||
WHERE ra.id_action = pi_id_action
|
||||
AND ra.id_step_flow = pi_id_step_flow;
|
||||
|
||||
/*- GO TO BEGIN ---*/
|
||||
WHEN 4 THEN
|
||||
SELECT MIN(id_step_flow)
|
||||
INTO v_result
|
||||
FROM request_step_workflow
|
||||
WHERE id_req_flow = v_id_req_flow
|
||||
AND step_status = 1;
|
||||
/*- PAUSE --- */
|
||||
WHEN 5 THEN
|
||||
v_result := pi_id_step_flow;
|
||||
|
||||
/*- ABORT ---*/
|
||||
WHEN 6 THEN
|
||||
v_result := -1;
|
||||
|
||||
/*- END ---*/
|
||||
WHEN 7 THEN
|
||||
v_result := 0;
|
||||
|
||||
/*- ERROR ---*/
|
||||
ELSE
|
||||
IF v_step_deploy = 1 THEN
|
||||
--- si es un paso de despliegue, finaliza el workflow
|
||||
v_result := 0;
|
||||
ELSE
|
||||
v_result := -2;
|
||||
END IF;
|
||||
END CASE;
|
||||
---------------------------------------------
|
||||
apex_debug.info('pkg_workflow_coordinator.next_step_flow - v_result: %s', v_result);
|
||||
RETURN v_result;
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
apex_debug.error('pkg_workflow_coordinator.next_step_flow - %s', sqlerrm);
|
||||
END;
|
||||
/*-------------------------------------------------------------------------*/
|
||||
/*-------------------------------------------------------------------------*/
|
||||
FUNCTION next_step_category_b (
|
||||
pi_id_action_category IN NUMBER
|
||||
) RETURN BOOLEAN AS
|
||||
v_result INTEGER := 0;
|
||||
v_order INTEGER := 0;
|
||||
v_id_req_flow INTEGER := 0;
|
||||
BEGIN
|
||||
---------------------------------------------
|
||||
CASE pi_id_action_category
|
||||
/*- NEXT STEP ---*/
|
||||
WHEN 1 THEN
|
||||
RETURN true;
|
||||
/*- PREVIUS STEP ---*/
|
||||
WHEN 2 THEN
|
||||
RETURN true;
|
||||
/*- GO TO STEP --- */
|
||||
WHEN 3 THEN
|
||||
RETURN true;
|
||||
/*- GO TO BEGIN --- */
|
||||
WHEN 4 THEN
|
||||
RETURN true;
|
||||
/*- PAUSE --- */
|
||||
WHEN 5 THEN
|
||||
RETURN true;
|
||||
/*- ABORT ---*/
|
||||
WHEN 6 THEN
|
||||
RETURN false;
|
||||
/*- END ---*/
|
||||
WHEN 7 THEN
|
||||
RETURN false;
|
||||
/*- ERROR ---*/
|
||||
ELSE
|
||||
RETURN false;
|
||||
END CASE;
|
||||
---------------------------------------------
|
||||
END;
|
||||
/*-------------------------------------------------------------------------*/
|
||||
/*--------------------------- PROCEDURES ----------------------------------*/
|
||||
/*-------------------------------------------------------------------------*/
|
||||
PROCEDURE change_step_order (
|
||||
pi_id_step_flow IN NUMBER,
|
||||
pi_new_position IN VARCHAR2,
|
||||
po_new_order OUT NUMBER,
|
||||
po_warning OUT NOCOPY VARCHAR2
|
||||
) IS
|
||||
v_id_req_flow INTEGER := 0;
|
||||
v_actual_order INTEGER := 0;
|
||||
v_auxid_step_flow INTEGER := 0;
|
||||
v_max_order INTEGER := 0;
|
||||
BEGIN
|
||||
---------------------------------------------
|
||||
SELECT r.id_req_flow,
|
||||
r.step_order
|
||||
INTO v_id_req_flow,
|
||||
v_actual_order
|
||||
FROM tmp_request_step_workflow r
|
||||
WHERE r.id_step_flow = pi_id_step_flow;
|
||||
|
||||
---------------------------------------------
|
||||
IF upper(v_actual_order) = 'UP' THEN
|
||||
---------------------------------------------
|
||||
IF v_actual_order = 1 THEN
|
||||
po_warning := 'Ya se encuentra en la primera posicion';
|
||||
ELSE
|
||||
po_new_order := v_actual_order + 1;
|
||||
/*
|
||||
--- sube una posicion ---
|
||||
UPDATE tmp_request_step_workflow rsf
|
||||
SET
|
||||
rsf.step_order = v_actual_order
|
||||
WHERE rsf.id_req_flow = v_id_req_flow
|
||||
AND rsf.step_order = v_actual_order - 1;
|
||||
---------------------------------------------
|
||||
UPDATE tmp_request_step_workflow rsf
|
||||
SET
|
||||
rsf.step_order = v_actual_order - 1
|
||||
WHERE rsf.id_step_flow = pi_id_step_flow;
|
||||
---------------------------------------------*/
|
||||
END IF;
|
||||
---------------------------------------------
|
||||
ELSIF upper(pi_new_position) = 'DOWN' THEN
|
||||
--- baja una posicion ---
|
||||
SELECT MAX(r.step_order)
|
||||
INTO v_max_order
|
||||
FROM tmp_request_step_workflow r
|
||||
WHERE r.id_step_flow = pi_id_step_flow;
|
||||
|
||||
po_new_order := v_actual_order - 1;
|
||||
/*IF v_actual_order = v_max_order THEN
|
||||
po_warning := 'Ya se encuentra en la ultima posicion';
|
||||
ELSE
|
||||
---------------------------------------------
|
||||
UPDATE tmp_request_step_workflow rsf
|
||||
SET
|
||||
rsf.step_order = v_actual_order
|
||||
WHERE rsf.id_req_flow = v_id_req_flow
|
||||
AND rsf.step_order = v_actual_order + 1;
|
||||
---------------------------------------------
|
||||
UPDATE tmp_request_step_workflow rsf
|
||||
SET
|
||||
rsf.step_order = v_actual_order + 1
|
||||
WHERE rsf.id_step_flow = pi_id_step_flow;
|
||||
---------------------------------------------
|
||||
END IF;*/
|
||||
ELSE
|
||||
NULL;
|
||||
END IF;
|
||||
---------------------------------------------
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
apex_debug.error('pkg_workflow_coordinator.change_step_order - %s', sqlerrm);
|
||||
END;
|
||||
|
||||
/*-------------------------------------------------------------------------*/
|
||||
PROCEDURE change_status_flow (
|
||||
pi_id_req_flow IN NUMBER,
|
||||
pi_new_status_flow IN NUMBER,
|
||||
po_result OUT NUMBER
|
||||
) AS
|
||||
v_id_deployment_type NUMBER := 0;
|
||||
v_id_enviroment_type NUMBER := 0;
|
||||
BEGIN
|
||||
--- permite que solo un flujo este activo por tipo de ambiente y tipo de despliegue ---
|
||||
IF pi_new_status_flow = 1 THEN
|
||||
-------------------------------------------------
|
||||
SELECT wfl.id_deployment_type,
|
||||
wfl.id_enviroment_type
|
||||
INTO v_id_deployment_type,
|
||||
v_id_enviroment_type
|
||||
FROM request_workflow wfl
|
||||
WHERE wfl.id_req_flow = pi_id_req_flow;
|
||||
-------------------------------------------------
|
||||
UPDATE request_workflow
|
||||
SET request_flow_status = 0
|
||||
WHERE id_deployment_type = v_id_deployment_type
|
||||
AND id_enviroment_type = v_id_enviroment_type
|
||||
AND id_req_flow != pi_id_req_flow;
|
||||
-------------------------------------------------
|
||||
COMMIT;
|
||||
po_result := 1;
|
||||
ELSE
|
||||
NULL;
|
||||
END IF;
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
apex_debug.error('pkg_workflow_coordinator.change_status_flow - %s', sqlerrm);
|
||||
po_result := -1;
|
||||
END;
|
||||
-----------------------------------------------------------------------*/
|
||||
PROCEDURE change_status_step (
|
||||
pi_id_step_flow IN NUMBER,
|
||||
pi_new_status_flow IN NUMBER,
|
||||
po_result OUT NUMBER
|
||||
) AS
|
||||
BEGIN
|
||||
IF pi_new_status_flow = 1 THEN
|
||||
NULL;
|
||||
ELSE
|
||||
--- si se desactiva un paso, se desactivan todas sus acciones asociadas ---
|
||||
UPDATE request_action_flow
|
||||
SET action_status = 0
|
||||
WHERE id_step_go = pi_id_step_flow;
|
||||
|
||||
END IF;
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
apex_debug.error('pkg_workflow_coordinator.change_status_step - %s', sqlerrm);
|
||||
END;
|
||||
-----------------------------------------------------------------------*/
|
||||
PROCEDURE change_status_act (
|
||||
pi_id_action IN NUMBER,
|
||||
pi_new_status_flow IN NUMBER
|
||||
) AS
|
||||
BEGIN
|
||||
NULL;
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
apex_debug.error('pkg_workflow_coordinator.change_status_act - %s', sqlerrm);
|
||||
END;
|
||||
-----------------------------------------------------------------------*/
|
||||
PROCEDURE manage_enviroment_group (
|
||||
pi_id_preset_group IN NUMBER,
|
||||
pi_id_enviroment IN NUMBER,
|
||||
po_warning OUT NOCOPY VARCHAR2
|
||||
) AS
|
||||
v_deploy_enable NUMBER := 0;
|
||||
v_enviroment_status NUMBER := 0;
|
||||
v_enviroment_alias VARCHAR2(100);
|
||||
v_enviroment_set NUMBER := 0;
|
||||
BEGIN
|
||||
SELECT e.deploy_enable,
|
||||
e.enviroment_status AS env_enable,
|
||||
e.enviroment_name
|
||||
|| ' ('
|
||||
|| e.enviroment_alias
|
||||
|| ') ',
|
||||
nvl((
|
||||
SELECT 1
|
||||
FROM preset_env_group_members m
|
||||
WHERE m.id_enviroment = e.id_enviroment
|
||||
AND m.id_preset_group = pi_id_preset_group
|
||||
), 0)
|
||||
INTO v_deploy_enable,
|
||||
v_enviroment_status,
|
||||
v_enviroment_alias,
|
||||
v_enviroment_set
|
||||
FROM enviroment e
|
||||
WHERE e.id_enviroment = pi_id_enviroment;
|
||||
|
||||
IF v_deploy_enable = 1 AND v_enviroment_status = 1 AND v_enviroment_set = 0 THEN
|
||||
BEGIN
|
||||
INSERT INTO tmp_members_group (
|
||||
id_preset_group,
|
||||
id_enviroment
|
||||
) VALUES (
|
||||
pi_id_preset_group,
|
||||
pi_id_enviroment
|
||||
);
|
||||
---
|
||||
po_warning := v_enviroment_alias
|
||||
|| pkg_sicd_commons.f_system_message(
|
||||
pi_id_message => 1,
|
||||
pi_message_class => 'WFC',
|
||||
pi_return_type => 1
|
||||
);
|
||||
---
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
DELETE tmp_members_group
|
||||
WHERE id_enviroment = pi_id_enviroment
|
||||
AND id_preset_group = pi_id_preset_group;
|
||||
---
|
||||
po_warning := v_enviroment_alias
|
||||
|| pkg_sicd_commons.f_system_message(
|
||||
pi_id_message => 2,
|
||||
pi_message_class => 'WFC',
|
||||
pi_return_type => 1
|
||||
);
|
||||
|
||||
END;
|
||||
|
||||
ELSIF v_deploy_enable = 0 THEN
|
||||
---
|
||||
po_warning := v_enviroment_alias
|
||||
|| pkg_sicd_commons.f_system_message(
|
||||
pi_id_message => 3,
|
||||
pi_message_class => 'WFC',
|
||||
pi_return_type => 1
|
||||
);
|
||||
ELSIF v_enviroment_status = 0 THEN
|
||||
---
|
||||
po_warning := v_enviroment_alias
|
||||
|| pkg_sicd_commons.f_system_message(
|
||||
pi_id_message => 4,
|
||||
pi_message_class => 'WFC',
|
||||
pi_return_type => 1
|
||||
);
|
||||
ELSIF v_enviroment_set = 1 THEN
|
||||
po_warning := v_enviroment_alias
|
||||
|| pkg_sicd_commons.f_system_message(
|
||||
pi_id_message => 7,
|
||||
pi_message_class => 'WFC',
|
||||
pi_return_type => 1
|
||||
);
|
||||
ELSE
|
||||
---
|
||||
po_warning := v_enviroment_alias
|
||||
|| pkg_sicd_commons.f_system_message(
|
||||
pi_id_message => 5,
|
||||
pi_message_class => 'WFC',
|
||||
pi_return_type => 1
|
||||
);
|
||||
END IF;
|
||||
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
---
|
||||
apex_debug.error('pkg_workflow_coordinator.manage_enviroment_group - %s', sqlerrm);
|
||||
po_warning := v_enviroment_alias
|
||||
|| pkg_sicd_commons.f_system_message(
|
||||
pi_id_message => 5,
|
||||
pi_message_class => 'WFC',
|
||||
pi_return_type => 1
|
||||
);
|
||||
|
||||
END;
|
||||
/*-------------------------------------------------------------------------*/
|
||||
PROCEDURE exec_action_workflow (
|
||||
pi_id_request IN NUMBER,
|
||||
pi_id_action IN NUMBER,
|
||||
pi_user_name IN VARCHAR2,
|
||||
pi_id_next_user IN NUMBER,
|
||||
pi_observations IN VARCHAR2,
|
||||
po_warning OUT NOCOPY VARCHAR2
|
||||
) IS
|
||||
|
||||
--- PRAGMA autonomous_transaction;
|
||||
v_actual_step NUMBER := 0;
|
||||
v_actual_seq NUMBER := 0;
|
||||
r_ref request_exec_flow%rowtype;
|
||||
r_reff request_exec_flow%rowtype;
|
||||
v_action_name VARCHAR2(100);
|
||||
v_action_category NUMBER := 0;
|
||||
v_next_step NUMBER := 0;
|
||||
v_action_status VARCHAR2(100);
|
||||
v_id_role NUMBER := 0;
|
||||
v_id_sys_profile NUMBER := 0;
|
||||
v_id_user NUMBER := 0;
|
||||
v_n_id_role NUMBER := 0;
|
||||
v_n_id_sys_profile NUMBER := 0;
|
||||
v_nn_id_sys_profile NUMBER := 0;
|
||||
v_deploy_step NUMBER := 0;
|
||||
v_notification CLOB;
|
||||
v_id_user_siguiente NUMBER(38, 0);
|
||||
v_subject VARCHAR2(4000);
|
||||
po_response_code VARCHAR2(4000);
|
||||
po_error_message VARCHAR2(4000);
|
||||
v_message_type NUMBER := 0;
|
||||
v_enviroment_type NUMBER := 0;
|
||||
v_deployment_type NUMBER := 0;
|
||||
v_action_cat NUMBER := 0;
|
||||
log_program_name VARCHAR2(100) := 'pkg_workflow_coordinator.exec_action_workflow';
|
||||
BEGIN
|
||||
---
|
||||
------------------------------------------------------------------
|
||||
log_collector(
|
||||
pi_program_name => log_program_name,
|
||||
pi_log_level => 4,
|
||||
--- DEBUG
|
||||
pi_log_message => 'INICIO - '
|
||||
|| log_program_name
|
||||
|| ': '
|
||||
|| sysdate
|
||||
|| ' ID_REQUEST: '
|
||||
|| pi_id_request
|
||||
|| ' ID_ACTION: '
|
||||
|| pi_id_action
|
||||
|| ' ID_USER: '
|
||||
|| pi_user_name
|
||||
);
|
||||
------------------------------------------------------------------
|
||||
|
||||
--- Verifica que solo un usuario pueda ejecutar el paso del flujo ---
|
||||
BEGIN
|
||||
----------------------------------------------------------------
|
||||
--- Busca el ultimo paso ejecutado en el flujo ---
|
||||
----------------------------------------------------------------
|
||||
SELECT exec.*
|
||||
INTO r_ref
|
||||
FROM request_exec_flow exec
|
||||
WHERE exec.id_request = pi_id_request
|
||||
AND exec.status_result IS NULL;
|
||||
|
||||
v_actual_seq := r_ref.id_seq_step;
|
||||
---
|
||||
EXCEPTION
|
||||
WHEN no_data_found THEN
|
||||
SELECT nvl(MAX(id_seq_step), 1)
|
||||
INTO v_actual_seq
|
||||
FROM request_exec_flow exec
|
||||
WHERE exec.id_request = pi_id_request
|
||||
AND exec.id_seq_step = 1;
|
||||
|
||||
END;
|
||||
|
||||
|
||||
log_collector(
|
||||
pi_program_name => log_program_name,
|
||||
pi_log_level => 4,
|
||||
--- DEBUG
|
||||
pi_log_message => 'valor de v_actual_seq: '
|
||||
|| v_actual_seq
|
||||
);
|
||||
---
|
||||
--- Describe el paso y accion ejecutado ---
|
||||
SELECT action_name,
|
||||
id_action_cat,
|
||||
id_step_flow,
|
||||
id_next_step,
|
||||
status_result,
|
||||
deploy_enable,
|
||||
id_role,
|
||||
id_sys_profile,
|
||||
id_user
|
||||
INTO v_action_name,
|
||||
v_action_category,
|
||||
v_actual_step,
|
||||
v_next_step,
|
||||
v_action_status,
|
||||
v_deploy_step,
|
||||
v_id_role,
|
||||
v_id_sys_profile,
|
||||
v_id_user
|
||||
FROM request_flow_action
|
||||
WHERE id_action = pi_id_action
|
||||
AND user_name = pi_user_name
|
||||
AND id_request = pi_id_request;
|
||||
|
||||
-------------------------------
|
||||
|
||||
----------------------------------------
|
||||
IF v_actual_seq != 1 THEN
|
||||
------------------------------------------------------------------
|
||||
log_collector(
|
||||
pi_program_name => log_program_name,
|
||||
pi_log_level => 4,
|
||||
--- DEBUG
|
||||
pi_log_message => 'SIGUIENTE SEQ - '
|
||||
|| log_program_name
|
||||
|| ': '
|
||||
|| sysdate
|
||||
);
|
||||
------------------------------------------------------------------
|
||||
---- No:
|
||||
-- actualiza el estado de ejecucion
|
||||
-- sin estado de ejecucion
|
||||
UPDATE request_exec_flow e
|
||||
SET e.id_user = v_id_user,
|
||||
e.user_name = pi_user_name,
|
||||
e.id_action = pi_id_action,
|
||||
e.action_name = v_action_name,
|
||||
e.id_action_cat = v_action_category,
|
||||
e.status_result = v_action_status,
|
||||
e.last_step_date = sysdate,
|
||||
e.observations = pi_observations
|
||||
WHERE e.id_request = pi_id_request
|
||||
AND e.id_step_flow = v_actual_step
|
||||
AND e.status_result IS NULL;
|
||||
|
||||
|
||||
ELSE
|
||||
|
||||
------------------------------------------------------------------
|
||||
log_collector(
|
||||
pi_program_name => log_program_name,
|
||||
pi_log_level => 4,
|
||||
--- DEBUG
|
||||
pi_log_message => 'PRIMERA SEQ - '
|
||||
|| log_program_name
|
||||
|| ': '
|
||||
|| sysdate
|
||||
);
|
||||
------------------------------------------------------------------
|
||||
---- Si:
|
||||
-- crear el primer paso en la ejecucion
|
||||
-- asigna el estado de ejecucion
|
||||
---
|
||||
INSERT INTO request_exec_flow (
|
||||
id_request,
|
||||
id_seq_step,
|
||||
action_name,
|
||||
id_action_cat,
|
||||
status_result,
|
||||
id_step_flow,
|
||||
id_role,
|
||||
id_sys_profile,
|
||||
id_user,
|
||||
id_action,
|
||||
observations,
|
||||
step_date,
|
||||
update_data,
|
||||
delete_data,
|
||||
last_step_date,
|
||||
user_name
|
||||
) VALUES (
|
||||
pi_id_request,
|
||||
v_actual_seq,
|
||||
v_action_name,
|
||||
v_action_category,
|
||||
v_action_status,
|
||||
v_actual_step,
|
||||
v_id_role,
|
||||
v_id_sys_profile,
|
||||
v_id_user,
|
||||
pi_id_action,
|
||||
pi_observations,
|
||||
sysdate,
|
||||
NULL,
|
||||
NULL,
|
||||
sysdate,
|
||||
pi_user_name
|
||||
);
|
||||
|
||||
END IF;
|
||||
---
|
||||
UPDATE deployment_request r
|
||||
SET r.id_last_seq_step = v_actual_seq,
|
||||
r.request_status = v_action_status
|
||||
WHERE r.id_request = pi_id_request;
|
||||
--- Si no es el Paso de Despliegue genera un nuevo registro de control
|
||||
|
||||
IF v_deploy_step != 1 OR v_action_category NOT IN (
|
||||
6, 7
|
||||
) THEN
|
||||
------------------------------------------------------------------
|
||||
log_collector(
|
||||
pi_program_name => log_program_name,
|
||||
pi_log_level => 4, --- DEBUG
|
||||
pi_log_message => 'ACCION REGULAR - '
|
||||
|| log_program_name
|
||||
|| ': '
|
||||
|| sysdate
|
||||
);
|
||||
------------------------------------------------------------------
|
||||
-- Busqueda del proximo perfil a realizar acciones ---
|
||||
SELECT step.id_sys_profile,
|
||||
(
|
||||
SELECT p.id_role
|
||||
FROM system_profile p
|
||||
WHERE p.id_sys_profile = step.id_sys_profile
|
||||
) AS id_role
|
||||
INTO v_n_id_sys_profile,
|
||||
v_n_id_role
|
||||
FROM request_step_workflow step,
|
||||
request_workflow flow
|
||||
WHERE flow.id_req_flow = step.id_req_flow
|
||||
AND step.id_step_flow = v_next_step;
|
||||
-- Busqueda del proximo perfil a realizar acciones ---
|
||||
----------------------------------------------------------------
|
||||
|
||||
|
||||
--- insertar el siguiente paso a ejecutar
|
||||
----------------------------------------------------------------
|
||||
v_actual_seq := v_actual_seq + 1;
|
||||
INSERT INTO request_exec_flow (
|
||||
id_request,
|
||||
id_seq_step,
|
||||
action_name,
|
||||
id_action_cat,
|
||||
status_result,
|
||||
id_step_flow,
|
||||
id_role,
|
||||
id_sys_profile,
|
||||
id_user,
|
||||
id_action,
|
||||
observations,
|
||||
step_date,
|
||||
update_data,
|
||||
delete_data,
|
||||
last_step_date,
|
||||
user_name
|
||||
) VALUES (
|
||||
pi_id_request,
|
||||
v_actual_seq,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
v_next_step,
|
||||
v_n_id_role,
|
||||
v_n_id_sys_profile,
|
||||
pi_id_next_user,
|
||||
NULL,
|
||||
NULL,
|
||||
sysdate,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL
|
||||
);
|
||||
|
||||
COMMIT;
|
||||
|
||||
------------------------------------------------------------------
|
||||
---Obtiene la el id de la categoria ejecutada
|
||||
SELECT id_action_cat
|
||||
INTO v_action_cat
|
||||
FROM request_exec_flow
|
||||
WHERE
|
||||
id_request = pi_id_request
|
||||
AND id_seq_step = (
|
||||
SELECT
|
||||
MAX(exec.id_seq_step)
|
||||
FROM
|
||||
request_exec_flow exec
|
||||
WHERE
|
||||
exec.id_request = pi_id_request
|
||||
AND exec.status_result IS NOT NULL
|
||||
);
|
||||
|
||||
CASE
|
||||
|
||||
when v_action_cat in(1,3) then
|
||||
---Si la accion elegida implica un paso hacia adelante en el proceso
|
||||
---envia notificacion al id_sys_profile del paso siguiente.
|
||||
|
||||
pkg_standard_executors.prc_send_action_message (
|
||||
pi_id_action => pi_id_action,
|
||||
pi_id_request => pi_id_request,
|
||||
pi_observation => pi_observations,
|
||||
pi_request_status => v_action_status,
|
||||
pi_request_flow_message =>'REQUEST_WORKFLOW', --/ REQUEST_DEPLOYMENT
|
||||
pi_id_sys_profile => v_n_id_sys_profile,
|
||||
pi_id_next_user => pi_id_next_user
|
||||
) ;
|
||||
|
||||
WHEN v_action_cat in(2,4,5) THEN
|
||||
---Si la accion elegida implica un paso hacia atras en el proceso
|
||||
---envia notificacion a todos los intervinientes activos de dicha solicitud
|
||||
|
||||
FOR c_user IN (
|
||||
SELECT DISTINCT ref.id_user
|
||||
FROM request_exec_flow ref
|
||||
INNER JOIN user_roles ur
|
||||
ON ref.id_user = ur.id_user
|
||||
WHERE ref.id_request = pi_id_request
|
||||
AND ref.status_result IS NOT NULL
|
||||
AND ur.user_status = 1
|
||||
UNION
|
||||
SELECT ur.id_user
|
||||
FROM user_roles ur
|
||||
WHERE UPPER(ur.user_name) = (SELECT UPPER(dr.user_create)
|
||||
FROM deployment_request dr
|
||||
WHERE dr.id_request = pi_id_request)
|
||||
) LOOP
|
||||
|
||||
pkg_standard_executors.prc_send_action_message (
|
||||
pi_id_action => pi_id_action,
|
||||
pi_id_request => pi_id_request,
|
||||
pi_observation => pi_observations,
|
||||
pi_request_status => v_action_status,
|
||||
pi_request_flow_message =>'REQUEST_WORKFLOW', --/ REQUEST_DEPLOYMENT
|
||||
pi_id_sys_profile => null,
|
||||
pi_id_next_user => c_user.id_user
|
||||
) ;
|
||||
|
||||
END LOOP;
|
||||
|
||||
ELSE
|
||||
---Para cualquier otro action_category
|
||||
---Si se indica id_user se envia al mismo
|
||||
-- Sino al id_sys_profile del paso siguiente
|
||||
pkg_standard_executors.prc_send_action_message (
|
||||
pi_id_action => pi_id_action,
|
||||
pi_id_request => pi_id_request,
|
||||
pi_observation => pi_observations,
|
||||
pi_request_status => v_action_status,
|
||||
pi_request_flow_message =>'REQUEST_WORKFLOW', --/ REQUEST_DEPLOYMENT
|
||||
pi_id_sys_profile => v_n_id_sys_profile,
|
||||
pi_id_next_user => pi_id_next_user
|
||||
) ;
|
||||
END CASE;
|
||||
|
||||
|
||||
|
||||
ELSIF v_next_step = 0 THEN
|
||||
------------------------------------------------------------------
|
||||
log_collector(
|
||||
pi_program_name => log_program_name,
|
||||
pi_log_level => 4,
|
||||
--- DEBUG
|
||||
pi_log_message => 'ACCION DESPLIEGUE - '
|
||||
|| log_program_name
|
||||
|| ': '
|
||||
|| sysdate
|
||||
);
|
||||
------------------------------------------------------------------
|
||||
--- Coloca la solicitud en la cola para despliegue
|
||||
pkg_deploy_coordinator.manage_dep_queue(pi_id_request => pi_id_request);
|
||||
|
||||
------------------------------------------------------------------
|
||||
--Busca el id_sys_profile del siguiente paso cuando la solicitud se encuentra para despliegue
|
||||
|
||||
SELECT UNIQUE
|
||||
id_sys_profile
|
||||
INTO v_nn_id_sys_profile
|
||||
FROM
|
||||
deployment_pattern dp,
|
||||
deployment_req_object dro
|
||||
WHERE
|
||||
dp.id_pattern = dro.id_pattern
|
||||
AND dro.id_request = pi_id_request;
|
||||
|
||||
---
|
||||
----------------------------------------------------------------
|
||||
--Ejecuta procedimeinto para configuracion y contenido del mensaje
|
||||
|
||||
|
||||
pkg_standard_executors.prc_send_action_message (
|
||||
pi_id_action => pi_id_action,
|
||||
pi_id_request => pi_id_request,
|
||||
pi_observation => pi_observations,
|
||||
pi_request_status => v_action_status,
|
||||
pi_request_flow_message =>'REQUEST_WORKFLOW', --/ REQUEST_DEPLOYMENT
|
||||
pi_id_sys_profile => v_nn_id_sys_profile,
|
||||
pi_id_next_user => null
|
||||
) ;
|
||||
|
||||
|
||||
---ejecuta procedimeinto para configuracion y contenido del mensaje
|
||||
------------------------------------------------------------------
|
||||
|
||||
ELSE
|
||||
--- termina el proceso aprobatorio, pero no hay paso de despliegue en el
|
||||
|
||||
------------------------------------------------------------------
|
||||
--ejecuta procedimeinto para configuracion y contenido del mensaje
|
||||
|
||||
|
||||
FOR c_user IN (
|
||||
SELECT DISTINCT ref.id_user
|
||||
FROM request_exec_flow ref
|
||||
INNER JOIN user_roles ur
|
||||
on ref.id_user = ur.id_user
|
||||
WHERE ref.id_request = pi_id_request
|
||||
AND ref.status_result IS NOT NULL
|
||||
AND ur.user_status =1
|
||||
) LOOP
|
||||
|
||||
pkg_standard_executors.prc_send_action_message(
|
||||
pi_id_action => pi_id_action,
|
||||
pi_id_request => pi_id_request,
|
||||
pi_observation => pi_observations,
|
||||
pi_request_status => v_action_status,
|
||||
pi_request_flow_message => 'REQUEST_WORKFLOW', --'REQUEST_WORKFLOW' / REQUEST_DEPLOYMENT
|
||||
pi_id_sys_profile => null,
|
||||
pi_id_next_user => c_user.id_user
|
||||
);
|
||||
|
||||
|
||||
END LOOP;
|
||||
|
||||
|
||||
END IF;
|
||||
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
---
|
||||
apex_debug.error('pkg_workflow_coordinator.exec_action_workflow - %s', sqlerrm);
|
||||
po_warning := pkg_sicd_commons.f_system_message(
|
||||
pi_id_message => - 1,
|
||||
pi_message_class => 'WFC',
|
||||
pi_return_type => 2
|
||||
);
|
||||
------------------------------------------------------------------
|
||||
log_collector(
|
||||
pi_program_name => log_program_name,
|
||||
pi_log_level => 2,
|
||||
--- ERROR
|
||||
pi_log_message => 'WFC ERROR - '
|
||||
|| log_program_name
|
||||
|| ': '
|
||||
|| sysdate
|
||||
);
|
||||
------------------------------------------------------------------
|
||||
END;
|
||||
/*-------------------------------------------------------------------------*/
|
||||
END pkg_workflow_coordinator;
|
||||
|
||||
/
|
||||
Reference in New Issue
Block a user