create or replace PROCEDURE PRC_ASDK_MODIFICAR_ITEM (
i_codcaso IN NUMBER DEFAULT NULL,
i_action_id IN NUMBER DEFAULT NULL,
i_timestamp IN TIMESTAMP DEFAULT NULL
) AS
CURSOR cur_param_values IS
SELECT ASDK_RULES_PARAM.param_id,
ASDK_RULES_PARAM.param_value
FROM ASDK_RULES_PARAM
JOIN ASDK_RULES_ACTIONS ON ASDK_RULES_PARAM.action_id = ASDK_RULES_ACTIONS.action_id
WHERE ASDK_RULES_ACTIONS.action_id = i_action_id
ORDER BY ASDK_RULES_PARAM.param_id DESC;
v_value INTEGER;
v_value2 INTEGER;
v_value3 INTEGER;
v_value4 INTEGER;
v_value5 INTEGER;
v_value6 INTEGER;
v_value7 INTEGER;
v_value8 INTEGER;
v_value9 INTEGER;
v_cur_param_id NUMBER (10, 0);
v_row_type NUMBER (10, 0);
v_codcaso NUMBER;
v_profile_id NUMBER;
v_status_id NUMBER;
v_responsible_group_id NUMBER;
v_responsible_id NUMBER;
v_reason_id NUMBER;
v_page_size NUMBER;
v_cis_used NUMBER;
v_final_status NUMBER;
v_cur_value_param VARCHAR2 (8000);
v_codigo VARCHAR2 (8000);
v_mensaje VARCHAR2 (8000);
v_query VARCHAR2 (4000);
v_field VARCHAR2 (70);
v_table VARCHAR2 (70);
v_key VARCHAR2 (70);
--Variables para almacenar el valor de campos utilizados al calcular los tiempos SLA
v_slaservice NUMBER;
v_service NUMBER;
v_customer_id NUMBER;
v_ci_id NUMBER;
v_vendor_id NUMBER;
v_project_id NUMBER;
v_count NUMBER;
v_state_is_closed NUMBER;
v_tasks_pending NUMBER;
v_comment_failed VARCHAR2 (255);
v_comment_id NUMBER;
v_lang NUMBER;
v_rule_id NUMBER;
v_data_set PK_ASC_OBJECTS.asc_return_data;
ex_error_executing EXCEPTION;
BEGIN
SELECT fl_int_rule_id
INTO v_rule_id
FROM ASDK_RULES_MODIFY_ITEMS
WHERE fl_int_case_id = i_codcaso
AND fl_int_action_id = i_action_id
AND fl_exec_timestamp = i_timestamp;
v_codcaso := i_codcaso;
BEGIN
SELECT ASDK_RULES.table_id
INTO v_row_type
FROM ASDK_RULES_ACTIONS
JOIN ASDK_RULES ON ASDK_RULES_ACTIONS.rule_id = ASDK_RULES.rule_id
WHERE ASDK_RULES_ACTIONS.action_id = i_action_id;
EXCEPTION WHEN NO_DATA_FOUND THEN
NULL;
END;
v_value := NULL;
v_value2 := NULL;
v_value3 := NULL;
v_value4 := NULL;
v_value5 := NULL;
v_value6 := NULL;
v_value7 := NULL;
v_value8 := NULL;
v_value9 := NULL;
-- Se recorren los parametros de la regla -- Se utilizan para campos que pueden ser modificados mediante la regla
FOR ind_cur_param_values IN cur_param_values LOOP
IF ind_cur_param_values.param_id = 1 THEN -- Se arma la variable correspondiente al Asunto del Correo
v_value := TO_NUMBER (TRIM (ind_cur_param_values.param_value));
ELSIF ind_cur_param_values.param_id = 2 THEN -- Se arma la variable para el cuerpo del mensaje
v_value2 := TO_NUMBER (TRIM (ind_cur_param_values.param_value));
ELSIF ind_cur_param_values.param_id = 3 THEN -- Se arma la variable para el cuerpo del mensaje
v_value3 := TO_NUMBER (TRIM (ind_cur_param_values.param_value));
ELSIF ind_cur_param_values.param_id = 4 THEN -- Se arma la variable para el cuerpo del mensaje
v_value4 := TO_NUMBER (TRIM (ind_cur_param_values.param_value));
ELSIF ind_cur_param_values.param_id = 5 THEN -- Se arma la variable para el cuerpo del mensaje
v_value5 := TO_NUMBER (TRIM (ind_cur_param_values.param_value));
ELSIF ind_cur_param_values.param_id = 6 THEN -- Se arma la variable para el cuerpo del mensaje
v_value6 := TO_NUMBER (TRIM (ind_cur_param_values.param_value));
ELSIF ind_cur_param_values.param_id = 7 THEN -- Se arma la variable para el cuerpo del mensaje
v_value7 := TO_NUMBER (TRIM (ind_cur_param_values.param_value));
ELSIF ind_cur_param_values.param_id = 8 THEN -- Servicio
v_value8 := TO_NUMBER (TRIM (ind_cur_param_values.param_value));
ELSIF ind_cur_param_values.param_id = 9 THEN -- Sla's
v_value9 := TO_NUMBER (TRIM (ind_cur_param_values.param_value));
END IF;
END LOOP;
IF v_row_type = 1 THEN
-- Captura el servicio, sla,estado, responsable, compa?ia, ci y cliente del caso
SELECT inci_service_sla_id,
inci_service_id,
inci_status_id,
inci_responsible_group_id,
inci_responsible_id,
inci_customer_id,
inci_associated_ci,
inci_vendor_id,
inci_reason_id,
inci_fl_int_project_id,
inci_final_status
INTO v_slaservice,
v_service,
v_status_id,
v_responsible_group_id,
v_responsible_id,
v_customer_id,
v_ci_id, v_vendor_id,
v_reason_id,
v_project_id,
v_final_status
FROM ASDK_INCIDENT
WHERE inci_id = i_codcaso;
IF (v_value8 IS NOT NULL) THEN
IF ((v_value8 = v_service) AND (v_value9 <> v_slaservice)) THEN
v_value8 := v_service;
END IF;
ELSE
v_value8 := v_service;
v_value9 := v_slaservice;
END IF;
--Estado
IF v_value IS NULL THEN
v_value := v_status_id;
END IF;
--Razon
IF v_value7 IS NULL THEN
v_value7 := v_reason_id;
END IF;
--Grupo
IF v_value5 IS NULL THEN
v_value5 := v_responsible_group_id;
END IF;
--especialista
IF v_value6 IS NULL THEN
v_value6 := v_responsible_id;
--VERIFICAR SI EN EL GRUPO ESTA EL MISMO RESPONSABLE
SELECT COUNT (1)
INTO v_count
FROM GROUP_USERS
WHERE grp_id = v_value5
AND codusuario = v_value6;
IF v_count = 0 THEN
v_value6 := FUN_ASDK_GET_RESPONSABLE(v_value5, v_project_id, v_row_type);
END IF;
END IF;
--Asignar especialista si existe un periodo activo de inactividad
v_value6 := FUN_AFW_ROUT_RESPONSIBLE(v_value5, v_value6, 1, v_project_id);
-- Verifica si el estado es cerrado
v_state_is_closed := NVL (FUN_ASDK_STATUS_CHILD(v_value), 0);
--Verifica que no haya tareas pendientes
v_tasks_pending := NVL (FUN_ASDK_ACTIVE_TASK (v_codcaso, 1), 0);
v_value := CASE WHEN v_state_is_closed = 0 AND v_tasks_pending > 0 THEN NULL ELSE v_value END;
v_value7 := CASE WHEN v_state_is_closed = 0 AND v_tasks_pending > 0 THEN NULL ELSE v_value7 END;
BEGIN
IF v_final_status = 1 THEN
PRC_ASDK_INCIDENT (
i_operation => 'U',
io_inci_id => v_codcaso,
i_inci_user_id_modifier => 1,
i_inci_status_id => v_value,
i_inci_priority_id => v_value2,
i_inci_impact_id => v_value3,
i_inci_urgency_id => v_value4,
i_inci_responsible_group_id => v_value5,
i_inci_responsible_id => v_value6,
i_inci_reason_id => v_value7,
i_inci_service_id => v_value8,
i_inci_service_sla_id => v_value9,
i_inci_customer_id => v_customer_id,
i_inci_associated_ci => v_ci_id,
i_inci_vendor_id => v_vendor_id,
o_page_size => v_page_size,
o_err_cod => v_codigo,
o_err_msg => v_mensaje,
cur_out => v_data_set
);
IF v_state_is_closed = 0 AND v_tasks_pending > 0 THEN
SELECT CAST(SetValue AS INT)
INTO v_lang
FROM SETINGENERAL
WHERE SetId = 2113;
SELECT msg_text
INTO v_comment_failed
FROM ASC_MESSAGES
WHERE msg_id = 299
AND msg_lan_id = v_lang;
v_comment_failed := REPLACE (v_comment_failed, '%d', TO_CHAR (v_rule_id));
v_comment_failed := REPLACE (v_comment_failed, '%s', '{1}
{2}');
FOR cur IN (
SELECT
'{' || TO_CHAR (ROW_NUMBER () OVER (ORDER BY field_name)) || '}' pattern,
field_name
FROM ASDK_RULES_FIELDS_TRANSLATOR
WHERE field_id IN (1, 1735)
AND language = CASE v_lang WHEN 1 THEN 'ESP' WHEN 2 THEN 'ING' WHEN 3 THEN 'POR' END
) LOOP
v_comment_failed := REPLACE (v_comment_failed, cur.pattern, cur.field_name);
END LOOP;
BEGIN
SELECT hino_id,
v_comment_failed || '
' || REPLACE(msg_text, '%s', NVL(times, 1) + 1)
INTO v_comment_id,
v_comment_failed
FROM (
SELECT hino_id,
SUBSTR (
times_text,
INSTR(times_text, '(') + 1,
ABS(INSTR(times_text, ')') - INSTR(times_text, '(') - 1)
) times,
msg_text
FROM (
SELECT hino_id,
SUBSTR (
hino_description,
CASE WHEN REGEXP_INSTR(hino_description, REPLACE(msg_text, '%s', '[(]+[0-9][)]')) = 0
THEN NULL ELSE REGEXP_INSTR(hino_description, REPLACE(msg_text, '%s', '[(]+[0-9][)]')) END,
LENGTH(msg_text)
) times_text,
msg_text
FROM ASDK_HIST_NOTES
JOIN ASC_MESSAGES ON msg_id = 300
AND msg_lan_id = v_lang
WHERE hino_item_id = i_codcaso
AND hino_description LIKE v_comment_failed || '%'
) note
) times;
EXCEPTION WHEN NO_DATA_FOUND THEN
NULL;
END;
IF v_comment_id IS NULL THEN
-- Escribe en el historico que fallo
PRC_ASDK_HIST_NOTES (
i_operation => 'I',
i_option => NULL,
i_item_id => v_codcaso,
i_hino_row_type => 1,
i_hino_author => 1,
i_hino_description => v_comment_failed,
i_hino_description_nohtml => v_comment_failed,
i_hino_visible => '0',
i_language => NULL,
cur_out => v_data_set
);
ELSE
UPDATE ASDK_HIST_NOTES
SET hino_description = v_comment_failed,
hino_created = SYSDATE
WHERE hino_id = v_comment_id;
END IF;
DELETE FROM ASDK_RULES_EXECUTED
WHERE idcaso = v_codcaso
AND idregla = (
SELECT rule_id
FROM ASDK_RULES_ACTIONS
WHERE action_id = i_action_id
);
END IF;
END IF;
EXCEPTION WHEN OTHERS THEN
RAISE ex_error_executing;
END;
END IF;
IF v_row_type = 2 THEN
-- Captura el servicio, sla,estado, responsable y ci del caso
SELECT prob_service_id,
prob_service_sla_id,
prob_status_id,
prob_responsible_group_id,
prob_responsible_id,
prob_associated_ci,
prob_reason_id,
prob_fl_int_project_id,
prob_final_status
INTO v_service,
v_slaservice,
v_status_id,
v_responsible_group_id,
v_responsible_id,
v_ci_id,
v_reason_id,
v_project_id,
v_final_status
FROM ASDK_PROBLEM
WHERE prob_id = i_codcaso;
IF (v_value8 IS NOT NULL) THEN
IF ((v_value8 = v_service) AND (v_value9 <> v_slaservice)) THEN
v_value8 := v_service;
END IF;
ELSE
v_value8 := v_service;
v_value9 := v_slaservice;
END IF;
--Estado
IF v_value IS NULL THEN
v_value := v_status_id;
END IF;
--Razon
IF v_value7 IS NULL THEN
v_value7 := v_reason_id;
END IF;
--Grupo
IF v_value5 IS NULL THEN
v_value5 := v_responsible_group_id;
END IF;
--especialista
IF v_value6 IS NULL THEN
v_value6 := v_responsible_id;
--VERIFICAR SI EN EL GRUPO ESTA EL MISMO RESPONSABLE
SELECT COUNT (1)
INTO v_count
FROM GROUP_USERS
WHERE grp_id = v_value5
AND codusuario = v_value6;
IF (v_count = 0) THEN
v_value6 := FUN_ASDK_GET_RESPONSABLE(v_value5, v_project_id, v_row_type);
END IF;
END IF;
--Asignar especialista si existe un periodo activo de inactividad
v_value6 := FUN_AFW_ROUT_RESPONSIBLE (v_value5, v_value6, 2, v_project_id);
-- Verifica si el estado es cerrado
v_state_is_closed := NVL (FUN_ASDK_STATUS_CHILD (v_value), 0);
--Verifica que no haya tareas pendientes
v_tasks_pending := NVL (FUN_ASDK_ACTIVE_TASK (v_codcaso, 2), 0);
v_value := CASE WHEN v_state_is_closed = 0 AND v_tasks_pending > 0 THEN NULL ELSE v_value END;
v_value7 := CASE WHEN v_state_is_closed = 0 AND v_tasks_pending > 0 THEN NULL ELSE v_value7 END;
BEGIN
IF v_final_status = 1 THEN
PRC_ASDK_PROBLEM (
i_operation => 'U',
io_prob_id => v_codcaso,
i_prob_user_id_modifier => 1,
i_prob_status_id => v_value,
i_prob_priority_id => v_value2,
i_prob_impact_id => v_value3,
i_prob_urgency_id => v_value4,
i_prob_responsible_group_id => v_value5,
i_prob_responsible_id => v_value6,
i_prob_reason_id => v_value7,
i_prob_service_id => v_value8,
i_prob_service_sla_id => v_value9,
i_prob_associated_ci => v_ci_id,
o_page_size => v_page_size,
o_err_cod => v_codigo,
o_err_msg => v_mensaje,
cur_out => v_data_set
);
IF v_state_is_closed = 0 AND v_tasks_pending > 0 THEN
SELECT CAST(SetValue AS INT)
INTO v_lang
FROM SETINGENERAL
WHERE SetId = 2113;
SELECT msg_text
INTO v_comment_failed
FROM ASC_MESSAGES
WHERE msg_id = 299
AND msg_lan_id = v_lang;
v_comment_failed := REPLACE (v_comment_failed, '%d', TO_CHAR (v_rule_id));
v_comment_failed := REPLACE (v_comment_failed, '%s', '{1}
{2}');
FOR cur IN (
SELECT
'{' || TO_CHAR (ROW_NUMBER () OVER (ORDER BY field_name)) || '}' pattern,
field_name
FROM ASDK_RULES_FIELDS_TRANSLATOR
WHERE field_id IN (1, 1735)
AND language = CASE v_lang WHEN 1 THEN 'ESP' WHEN 2 THEN 'ING' WHEN 3 THEN 'POR' END
) LOOP
v_comment_failed := REPLACE (v_comment_failed, cur.pattern, cur.field_name);
END LOOP;
BEGIN
SELECT hino_id,
v_comment_failed || '
' || REPLACE(msg_text, '%s', NVL(times, 1) + 1)
INTO v_comment_id,
v_comment_failed
FROM (
SELECT hino_id,
SUBSTR (
times_text,
INSTR(times_text, '(') + 1,
ABS(INSTR(times_text, ')') - INSTR(times_text, '(') - 1)
) times,
msg_text
FROM (
SELECT hino_id,
SUBSTR (
hino_description,
CASE WHEN REGEXP_INSTR(hino_description, REPLACE(msg_text, '%s', '[(]+[0-9][)]')) = 0
THEN NULL ELSE REGEXP_INSTR(hino_description, REPLACE(msg_text, '%s', '[(]+[0-9][)]')) END,
LENGTH(msg_text)
) times_text,
msg_text
FROM ASDK_HIST_NOTES
JOIN ASC_MESSAGES ON msg_id = 300
AND msg_lan_id = v_lang
WHERE hino_item_id = i_codcaso
AND hino_description LIKE v_comment_failed || '%'
) note
) times;
EXCEPTION WHEN NO_DATA_FOUND THEN
NULL;
END;
IF v_comment_id IS NULL THEN
-- Escribe en el historico que fallo
PRC_ASDK_HIST_NOTES (
i_operation => 'I',
i_option => NULL,
i_item_id => v_codcaso,
i_hino_row_type => 2,
i_hino_author => 1,
i_hino_description => v_comment_failed,
i_hino_description_nohtml => v_comment_failed,
i_hino_visible => '0',
i_language => NULL,
cur_out => v_data_set
);
ELSE
UPDATE ASDK_HIST_NOTES
SET hino_description = v_comment_failed,
hino_created = SYSDATE
WHERE hino_id = v_comment_id;
END IF;
DELETE FROM ASDK_RULES_EXECUTED
WHERE idcaso = v_codcaso
AND idregla = (
SELECT rule_id
FROM ASDK_RULES_ACTIONS
WHERE action_id = i_action_id
);
END IF;
END IF;
EXCEPTION WHEN OTHERS THEN
RAISE ex_error_executing;
END;
END IF;
IF v_row_type = 3 THEN
-- Captura el servicio, sla,estado, responsable, compa?ia, ci y cliente del caso
SELECT chan_service_sla_id,
chan_service_id,
chan_status_id,
chan_responsible_group_id,
chan_responsible_id,
chan_customer_id,
chan_associated_ci,
chan_vendor_id,
chan_reason_id,
chan_fl_int_project_id,
chan_final_status
INTO v_slaservice,
v_service,
v_status_id,
v_responsible_group_id,
v_responsible_id,
v_customer_id,
v_ci_id,
v_vendor_id,
v_reason_id,
v_project_id,
v_final_status
FROM ASDK_CHANGE
WHERE chan_id = i_codcaso;
IF (v_value8 IS NOT NULL) THEN
IF ((v_value8 = v_service) AND (v_value9 <> v_slaservice)) THEN
v_value8 := v_service;
END IF;
ELSE
v_value8 := v_service;
v_value9 := v_slaservice;
END IF;
--Estado
IF v_value IS NULL THEN
v_value := v_status_id;
END IF;
--Razon
IF v_value7 IS NULL THEN
v_value7 := v_reason_id;
END IF;
--Grupo
IF v_value5 IS NULL THEN
v_value5 := v_responsible_group_id;
END IF;
--especialista
IF v_value6 IS NULL THEN
v_value6 := v_responsible_id;
--VERIFICAR SI EN EL GRUPO ESTA EL MISMO RESPONSABLE
SELECT COUNT (1)
INTO v_count
FROM GROUP_USERS
WHERE grp_id = v_value5
AND codusuario = v_value6;
IF (v_count = 0) THEN
v_value6 := FUN_ASDK_GET_RESPONSABLE(v_value5, v_project_id, v_row_type);
END IF;
END IF;
--Asignar especialista si existe un periodo activo de inactividad
v_value6 := FUN_AFW_ROUT_RESPONSIBLE (v_value5, v_value6, 3, v_project_id);
-- Verifica si el estado es cerrado
v_state_is_closed := NVL (FUN_ASDK_STATUS_CHILD (v_value), 0);
--Verifica que no haya tareas pendientes
v_tasks_pending := NVL (FUN_ASDK_ACTIVE_TASK (v_codcaso, 3), 0);
v_value := CASE WHEN v_state_is_closed = 0 AND v_tasks_pending > 0 THEN NULL ELSE v_value END;
v_value7 := CASE WHEN v_state_is_closed = 0 AND v_tasks_pending > 0 THEN NULL ELSE v_value7 END;
BEGIN
IF v_final_status = 1 THEN
PRC_ASDK_CHANGE (
i_operation => 'U',
io_chan_id => v_codcaso,
i_chan_user_id_modifier => 1,
i_chan_status_id => v_value,
i_chan_priority_id => v_value2,
i_chan_impact_id => v_value3,
i_chan_urgency_id => v_value4,
i_chan_responsible_group_id => v_value5,
i_chan_responsible_id => v_value6,
i_chan_reason_id => v_value7,
i_chan_service_id => v_value8,
i_chan_service_sla_id => v_value9,
i_chan_customer_id => v_customer_id,
i_chan_associated_ci => v_ci_id,
i_chan_vendor_id => v_vendor_id,
o_page_size => v_page_size,
o_err_cod => v_codigo,
o_err_msg => v_mensaje,
cur_out => v_data_set
);
IF v_state_is_closed = 0 AND v_tasks_pending > 0 THEN
SELECT CAST(SetValue AS INT)
INTO v_lang
FROM SETINGENERAL
WHERE SetId = 2113;
SELECT msg_text
INTO v_comment_failed
FROM ASC_MESSAGES
WHERE msg_id = 299
AND msg_lan_id = v_lang;
v_comment_failed := REPLACE (v_comment_failed, '%d', TO_CHAR (v_rule_id));
v_comment_failed := REPLACE (v_comment_failed, '%s', '{1}
{2}');
FOR cur IN (
SELECT
'{' || TO_CHAR (ROW_NUMBER () OVER (ORDER BY field_name)) || '}' pattern,
field_name
FROM ASDK_RULES_FIELDS_TRANSLATOR
WHERE field_id IN (1, 1735)
AND language = CASE v_lang WHEN 1 THEN 'ESP' WHEN 2 THEN 'ING' WHEN 3 THEN 'POR' END
) LOOP
v_comment_failed := REPLACE (v_comment_failed, cur.pattern, cur.field_name);
END LOOP;
BEGIN
SELECT hino_id,
v_comment_failed || '
' || REPLACE(msg_text, '%s', NVL(times, 1) + 1)
INTO v_comment_id,
v_comment_failed
FROM (
SELECT hino_id,
SUBSTR (
times_text,
INSTR(times_text, '(') + 1,
ABS(INSTR(times_text, ')') - INSTR(times_text, '(') - 1)
) times,
msg_text
FROM (
SELECT hino_id,
SUBSTR (
hino_description,
CASE WHEN REGEXP_INSTR(hino_description, REPLACE(msg_text, '%s', '[(]+[0-9][)]')) = 0
THEN NULL ELSE REGEXP_INSTR(hino_description, REPLACE(msg_text, '%s', '[(]+[0-9][)]')) END,
LENGTH(msg_text)
) times_text,
msg_text
FROM ASDK_HIST_NOTES
JOIN ASC_MESSAGES ON msg_id = 300
AND msg_lan_id = v_lang
WHERE hino_item_id = i_codcaso
AND hino_description LIKE v_comment_failed || '%'
) note
) times;
EXCEPTION WHEN NO_DATA_FOUND THEN
NULL;
END;
IF v_comment_id IS NULL THEN
-- Escribe en el historico que fallo
PRC_ASDK_HIST_NOTES (
i_operation => 'I',
i_option => NULL,
i_item_id => v_codcaso,
i_hino_row_type => 3,
i_hino_author => 1,
i_hino_description => v_comment_failed,
i_hino_description_nohtml => v_comment_failed,
i_hino_visible => '0',
i_language => NULL,
cur_out => v_data_set
);
ELSE
UPDATE ASDK_HIST_NOTES
SET hino_description = v_comment_failed,
hino_created = SYSDATE
WHERE hino_id = v_comment_id;
END IF;
DELETE FROM ASDK_RULES_EXECUTED
WHERE idcaso = v_codcaso
AND idregla = (
SELECT rule_id
FROM ASDK_RULES_ACTIONS
WHERE action_id = i_action_id
);
END IF;
END IF;
EXCEPTION WHEN OTHERS THEN
RAISE ex_error_executing;
END;
END IF;
IF v_row_type = 15 THEN
-- Captura el servicio, sla,estado, responsable, compa?ia, ci y cliente del caso
SELECT serv_service_sla_id,
serv_service_id,
serv_status_id,
serv_responsible_group_id,
serv_responsible_id,
serv_customer_id,
serv_associated_ci,
serv_vendor_id,
serv_reason_id,
serv_fl_int_project_id,
serv_final_status
INTO v_slaservice,
v_service,
v_status_id,
v_responsible_group_id,
v_responsible_id,
v_customer_id,
v_ci_id,
v_vendor_id,
v_reason_id,
v_project_id,
v_final_status
FROM ASDK_SERVICE_CALL
WHERE serv_id = i_codcaso;
IF (v_value8 IS NOT NULL) THEN
IF ((v_value8 = v_service) AND (v_value9 <> v_slaservice)) THEN
v_value8 := v_service;
END IF;
ELSE
v_value8 := v_service;
v_value9 := v_slaservice;
END IF;
--Estado
IF v_value IS NULL THEN
v_value := v_status_id;
END IF;
--Razon
IF v_value7 IS NULL THEN
v_value7 := v_reason_id;
END IF;
--Grupo
IF v_value5 IS NULL THEN
v_value5 := v_responsible_group_id;
END IF;
--especialista
IF v_value6 IS NULL THEN
v_value6 := v_responsible_id;
--VERIFICAR SI EN EL GRUPO ESTA EL MISMO RESPONSABLE
SELECT COUNT(1)
INTO v_count
FROM GROUP_USERS
WHERE grp_id = v_value5
AND codusuario = v_value6;
IF (v_count = 0) THEN
v_value6 := FUN_ASDK_GET_RESPONSABLE(v_value5, v_project_id, 4);
END IF;
END IF;
--Asignar especialista si existe un periodo activo de inactividad
v_value6 := FUN_AFW_ROUT_RESPONSIBLE(v_value5, v_value6, 4, v_project_id);
-- Verifica si el estado es cerrado
v_state_is_closed := NVL(FUN_ASDK_STATUS_CHILD(v_value), 0);
--Verifica que no haya tareas pendientes
v_tasks_pending := NVL (FUN_ASDK_ACTIVE_TASK (v_codcaso, 4), 0);
v_value := CASE WHEN v_state_is_closed = 0 AND v_tasks_pending > 0 THEN NULL ELSE v_value END;
v_value7 := CASE WHEN v_state_is_closed = 0 AND v_tasks_pending > 0 THEN NULL ELSE v_value7 END;
BEGIN
IF v_final_status = 1 THEN
PRC_ASDK_SERVICE_CALL (
i_operation => 'U',
io_serv_id => v_codcaso,
i_serv_user_id_modifier => 1,
i_serv_status_id => v_value,
i_serv_priority_id => v_value2,
i_serv_impact_id => v_value3,
i_serv_urgency_id => v_value4,
i_serv_responsible_group_id => v_value5,
i_serv_responsible_id => v_value6,
i_serv_reason_id => v_value7,
i_serv_service_id => v_value8,
i_serv_service_sla_id => v_value9,
i_serv_customer_id => v_customer_id,
i_serv_associated_ci => v_ci_id,
i_serv_vendor_id => v_vendor_id,
o_page_size => v_page_size,
o_err_cod => v_codigo,
o_err_msg => v_mensaje,
cur_out => v_data_set
);
IF v_state_is_closed = 0 AND v_tasks_pending > 0 THEN
SELECT CAST(SetValue AS INT)
INTO v_lang
FROM SETINGENERAL
WHERE SetId = 2113;
SELECT msg_text
INTO v_comment_failed
FROM ASC_MESSAGES
WHERE msg_id = 299
AND msg_lan_id = v_lang;
v_comment_failed := REPLACE (v_comment_failed, '%d', TO_CHAR (v_rule_id));
v_comment_failed := REPLACE (v_comment_failed, '%s', '{1}
{2}');
FOR cur IN (
SELECT
'{' || TO_CHAR (ROW_NUMBER () OVER (ORDER BY field_name)) || '}' pattern,
field_name
FROM ASDK_RULES_FIELDS_TRANSLATOR
WHERE field_id IN (1, 1735)
AND language = CASE v_lang WHEN 1 THEN 'ESP' WHEN 2 THEN 'ING' WHEN 3 THEN 'POR' END
) LOOP
v_comment_failed := REPLACE (v_comment_failed, cur.pattern, cur.field_name);
END LOOP;
BEGIN
SELECT hino_id,
v_comment_failed || '
' || REPLACE(msg_text, '%s', NVL(times, 1) + 1)
INTO v_comment_id,
v_comment_failed
FROM (
SELECT hino_id,
SUBSTR (
times_text,
INSTR(times_text, '(') + 1,
ABS(INSTR(times_text, ')') - INSTR(times_text, '(') - 1)
) times,
msg_text
FROM (
SELECT hino_id,
SUBSTR (
hino_description,
CASE WHEN REGEXP_INSTR(hino_description, REPLACE(msg_text, '%s', '[(]+[0-9][)]')) = 0
THEN NULL ELSE REGEXP_INSTR(hino_description, REPLACE(msg_text, '%s', '[(]+[0-9][)]')) END,
LENGTH(msg_text)
) times_text,
msg_text
FROM ASDK_HIST_NOTES
JOIN ASC_MESSAGES ON msg_id = 300
AND msg_lan_id = v_lang
WHERE hino_item_id = i_codcaso
AND hino_description LIKE v_comment_failed || '%'
) note
) times;
EXCEPTION WHEN NO_DATA_FOUND THEN
NULL;
END;
IF v_comment_id IS NULL THEN
-- Escribe en el historico que fallo
PRC_ASDK_HIST_NOTES (
i_operation => 'I',
i_option => NULL,
i_item_id => v_codcaso,
i_hino_row_type => 4,
i_hino_author => 1,
i_hino_description => v_comment_failed,
i_hino_description_nohtml => v_comment_failed,
i_hino_visible => '0',
i_language => NULL,
cur_out => v_data_set
);
ELSE
UPDATE ASDK_HIST_NOTES
SET hino_description = v_comment_failed,
hino_created = SYSDATE
WHERE hino_id = v_comment_id;
END IF;
DELETE FROM ASDK_RULES_EXECUTED
WHERE idcaso = v_codcaso
AND idregla = (
SELECT rule_id
FROM ASDK_RULES_ACTIONS
WHERE action_id = i_action_id
);
END IF;
END IF;
EXCEPTION WHEN OTHERS THEN
RAISE ex_error_executing;
END;
END IF;
IF v_row_type = 22 THEN
v_value := CASE v_value WHEN 0 THEN NULL ELSE v_value END;
v_value5 := CASE v_value5 WHEN 0 THEN NULL ELSE v_value5 END;
v_value6 := CASE v_value6 WHEN 0 THEN NULL ELSE v_value6 END;
v_value7 := CASE v_value7 WHEN 0 THEN NULL ELSE v_value7 END;
SELECT prar_project_id
INTO v_project_id
FROM ASS_ARTICLE
JOIN ASS_PROJECT_ARTICLE ON ASS_ARTICLE.fl_int_solution_id = ASS_PROJECT_ARTICLE.prar_solution_id
WHERE ASS_PROJECT_ARTICLE.prar_solution_id = v_codcaso;
--Asignar especialista si existe un periodo activo de inactividad
v_value3 := FUN_AFW_ROUT_RESPONSIBLE(v_value5, v_value6, 7, v_project_id);
BEGIN
PRC_ASS_ARTICLE (
i_operation => 'U',
i_option => 'A',
io_solution_id => v_codcaso,
i_solution_state => v_value,
i_group_responsible_id => v_value5,
i_responsible_id => v_value6,
i_arti_reason_id => v_value7,
i_arti_user_id_modifier => 1,
o_err_cod => v_codigo,
o_err_msg => v_mensaje,
cur_out => v_data_set
);
END;
END IF;
IF v_row_type = 37 THEN
v_value := CASE v_value WHEN 0 THEN NULL ELSE v_value END;
v_value2 := CASE v_value2 WHEN 0 THEN NULL ELSE v_value2 END;
v_value3 := CASE v_value3 WHEN 0 THEN NULL ELSE v_value3 END;
v_profile_id := NULL;
BEGIN
PRC_CONFIGURATION_ITEM (
i_operation => 'U',
i_option => 'A',
i_ci_id => v_codcaso,
i_actual_status => v_value,
i_impact => v_value2,
i_incharge_id => v_value3,
i_profile_id => v_profile_id,
o_page_size => v_page_size,
o_err_cod => v_codigo,
o_err_msg => v_mensaje,
o_cis_used => v_cis_used,
cur_out => v_data_set
);
END;
END IF;
-- ELIMINA EL CASO DE LA TABLA MODIFY_ITEMS DE LAS REGLAS
DELETE FROM ASDK_RULES_MODIFY_ITEMS
WHERE fl_int_case_id = i_codcaso
AND fl_int_action_id = i_action_id;
EXCEPTION WHEN ex_error_executing
THEN RAISE;
WHEN OTHERS THEN
v_codigo := SQLERRM;
v_mensaje := SQLCODE;
END PRC_ASDK_MODIFICAR_ITEM;