CREATE OR REPLACE PACKAGE BODY PKG_DIMO_SECURITY IS
/* VALIDAR PERMISOS DEL USUARIO PARA CAMBIAR LOS DATOS DE SU CUENTA */
/*
AUTOR: MANUEL BAEZ
FECHA CREACION: 07/10/2024
DESCRIPCION:
FECHA MODIFICACION:
DESCRIPCION DE CAMBIOS:
*/
PROCEDURE PR_VALIDAR_TOKEN_TARJ (
P_NUM_TARJ IN NUMBER,
P_AFINIDAD OUT NUMBER,
P_EMISOR OUT NUMBER,
P_VINCULADO OUT NUMBER,
P_DOCUMENTO OUT VARCHAR2,
P_VINC_DESC OUT VARCHAR2
) IS
V_VALIDAR NUMBER;
P_TARJ_ENCRI VARCHAR2(100);
V_TARJETA VARCHAR(50);
BEGIN
V_TARJETA := P_NUM_TARJ;
SELECT CREDITOPY.FC_PAN2CRIPTO(P_NUM_TARJ)
INTO P_TARJ_ENCRI
FROM DUAL;
-- Consulta que nos devuelve EMISOR, DOCUEMNTOY AFINIDAD
SELECT T.EMISOR,
T.DOCUMENTO,
T.GRUPO_AFINIDAD
INTO P_EMISOR, P_DOCUMENTO, P_AFINIDAD
FROM CREDITOPY.TARJETAS T
WHERE T.TARJETA = P_TARJ_ENCRI;
-- QUITAMOS TODOS LOS NUMEROS QUE ESTEN ENFRENTE DEL NUMERO DE DOCUMENTO
P_DOCUMENTO := TO_CHAR(TO_NUMBER(SUBSTR(P_DOCUMENTO, 4)));
BEGIN
-- Consultamos el estado de la tarjeta de una persona
SELECT ESTADO
INTO V_VALIDAR
FROM (
SELECT dtvp.ESTADO
FROM CREDITOPY.DIMO_TC_VINC_PROCESO dtvp
WHERE dtvp.DOCUMENTO = P_DOCUMENTO
AND dtvp.TARJETA = P_TARJ_ENCRI
ORDER BY dtvp.fecha_hora_ins DESC
)
WHERE ROWNUM = 1;
EXCEPTION
WHEN NO_DATA_FOUND THEN
V_VALIDAR := 3; -- Si no se encuentra ninguna fila, asigna el valor 3
END;
-- Estructura condicional IF en lugar de CASE
CASE V_VALIDAR
WHEN 0 THEN
P_VINCULADO := 0;
P_VINC_DESC := 'EL USUARIO NO COMPLETO EL INTENTO';
WHEN 1 THEN
P_VINCULADO := 1;
P_VINC_DESC := 'EL USUARIO VINCULO CORRECTAMENTE';
WHEN 2 THEN
P_VINCULADO := 0;
P_VINC_DESC := 'EL USUARIO FALLO EN RESPONDER LAS PREGUNTAS DE SEGURIDAD';
ELSE
P_VINCULADO := 0;
P_VINC_DESC := 'EL USUARIO AUN NO INTENTO VINCULAR';
END CASE;
IF P_VINCULADO = 0 THEN
--- INSERTAMOS EN LA TABLA DIMO_SECURITY_LOG
LOG_VALIDACION(P_DOCUMENTO,V_TARJETA,P_VINCULADO,P_VINC_DESC, 'PR_VALIDAR_TOKEN_TARJ');
END IF;
END PR_VALIDAR_TOKEN_TARJ;
/* VALIDAR PERMISOS DEL USUARIO PARA CAMBIAR LOS DATOS DE SU CUENTA */
/*
AUTOR: ARTURO SOSA
FECHA CREACION: 08/10/2024
DESCRIPCION: Este procedimiento recibe el documento del usuario y debe controlar:
1. Que el documento pertenezca a un usario.
2. Si el usuario está validado por ATC (FLAG DIMO_SICOOP.D_CLIENTE@SICOOP => FLAG_VALIDADO_ATC).
3. Si tiene abierto la incidencia para cambio de ese dato ().
4. Si el usuario tiene permiso para cambiar ese dato (DIMO_SICOOP.D_FUNCIONALIDAD => ).
Solo si cumple esos requisitos, debe devolver validado = true
DEUDA TECNICA:El MACHEO DE CODIGO BACKEND e ID_TIPO_INCIDENCIA "está en duro" (no es critico, por que coinciden en ambos ambientes)
FECHA MODIFICACION:
DESCRIPCION DE CAMBIOS:
*/
PROCEDURE PR_VALIDAR_PERMISO_DATOS (
CP_documento IN VARCHAR2,
CP_codigo IN VARCHAR2,
NP_validado OUT NUMBER,
CP_descripcion OUT VARCHAR2
) IS
V_CLIENTE_ID NUMBER;
V_FLAG_VALIDADO_ATC NUMBER;
V_TIPO_INCIDENCIA_ID NUMBER;
V_CLIENTE_INCIDENCIA_ID NUMBER;
V_VALIDADO NUMBER;
BEGIN
--VALIDAR QUE EL DOCUMENTO SEA USUARIO Y ESTÉ VALIDADO POR ATC
BEGIN
SELECT dc.CLIENTE_ID, dc.FLAG_VALIDADO_ATC
INTO V_CLIENTE_ID, V_FLAG_VALIDADO_ATC
FROM DIMO_SICOOP.D_CLIENTE@SICOOP dc
WHERE dc.CI = CP_documento;
EXCEPTION
WHEN OTHERS THEN
V_CLIENTE_ID := 0;
CP_descripcion := 'Error inesperado: ' || SQLERRM;
END;
--SI ES USUARIO DIMO
IF V_CLIENTE_ID != 0 THEN
--SI ES USUARIO DIMO y SI ESTÄ HABILITADO POR ATC
IF V_FLAG_VALIDADO_ATC = 1 THEN
--VERIFICACION PARA OBTENER EL TIPO_INCIDENCIA_ID.
CASE CP_codigo
WHEN 'PERFILMOD_CELLPHONE' THEN
V_TIPO_INCIDENCIA_ID := 20;
WHEN 'PERFILMOD_EMAIL' THEN
V_TIPO_INCIDENCIA_ID := 19;
WHEN 'PERFILMOD_DATA' THEN
V_TIPO_INCIDENCIA_ID := 18;
ELSE
V_TIPO_INCIDENCIA_ID := 0;
END CASE;
--SI ES UN TIPO DE INCIDENCIA VALIDO
IF V_TIPO_INCIDENCIA_ID != 0 THEN
--OBTENER EL ID DE LA INCIDENICA Y EL ESTADO
BEGIN
SELECT dci.CLIENTE_INCIDENCIA_ID
INTO V_CLIENTE_INCIDENCIA_ID
FROM DIMO_SICOOP.D_CLIENTE_INCIDENCIA@SICOOP dci
WHERE dci.CLIENTE_ID = V_CLIENTE_ID AND dci.TIPO_INCIDENCIA_ID = V_TIPO_INCIDENCIA_ID AND dci.ESTADO = 1
AND ROWNUM = 1;
EXCEPTION
WHEN OTHERS THEN
V_CLIENTE_INCIDENCIA_ID := 0;
END;
--SI TIENE LA INCIDENCIA
IF V_CLIENTE_INCIDENCIA_ID != 0 THEN
--VERIFICAR SI TIENE EL PERMISO HABILITADO
BEGIN
SELECT dfd.ACTIVO INTO V_VALIDADO
FROM DIMO_SICOOP.D_FUNCIONALIDAD_DOC@SICOOP dfd
WHERE dfd.DOCUMENTO = CP_documento AND dfd.ACTIVO = 1
AND dfd.FUNCIONALIDAD_ID = (SELECT df.FUNCIONALIDAD_ID FROM DIMO_SICOOP.D_FUNCIONALIDAD@SICOOP df WHERE df.CODIGO = CP_codigo);
EXCEPTION
WHEN OTHERS THEN
V_VALIDADO := 0;
/*BEGIN
dbms_output.put_line('documento:'||CP_documento);
dbms_output.put_line('codigo:'||CP_codigo);
dbms_output.put_line(sqlerrm);
END;*/
END;
IF V_VALIDADO = 1 THEN
NP_validado := 1;
CP_descripcion := 'El usuario tiene los permisos para cambiar el dato';
ELSE
NP_validado := 0;
CP_descripcion := 'El usuario no tiene permiso de ATC para cambiar el dato';
END IF;
--EL DOCUMENTO NO TIENE LA INCIDENCIA
ELSE
NP_validado := 0;
CP_descripcion := 'No existe la incidencia valida para ese documento';
END IF;
ELSE
NP_validado := 0;
CP_descripcion := 'No corresponde el tipo de incidencia';
END IF;
--NO ESTÁ HABILITADO POR ATC
ELSE
NP_validado := 0;
CP_descripcion := 'El usuario no está habilitado por ATC';
END IF;
--NO ES USUARIO DIMO
ELSE
NP_validado := 0;
CP_descripcion := 'El documento ingresado no pertenece a ningún usuario';
END IF;
--- INSERTAMOS EN LA TABLA DIMO_SECURITY_LOG
LOG_VALIDACION(CP_documento,CP_codigo,NP_validado,CP_descripcion, 'PR_VALIDAR_PERMISO_DATOS');
END PR_VALIDAR_PERMISO_DATOS;
/* CERRAR LOS PERMISOS DEL USUARIO AL CAMBIAR LOS DATOS DE SU CUENTA */
/*
AUTOR: ARTURO SOSA
FECHA CREACION: 08/10/2024
DESCRIPCION: Este procedimiento debe:
1. Debe verificar que el usuario tenga habilitado ese permiso.
2. Sacarle el permiso al usuario de modificar sus datos.
3. Cerrar la incidencia.
4. Dejar el registro del detalle de la incidencia.
DEUDA TECNICA:El MACHEO DE CODIGO BACKEND e ID_TIPO_INCIDENCIA "está en duro" (no es critico, por que coinciden en ambos ambientes)
FECHA MODIFICACION:
DESCRIPCION DE CAMBIOS:
*/
PROCEDURE PR_CERRAR_PERMISO_DATOS (
CP_documento IN VARCHAR2,
CP_codigo IN VARCHAR2,
NP_validado OUT NUMBER,
CP_descripcion OUT VARCHAR2
) IS
V_VALIDADO NUMBER;
V_VALIDADO_DESC VARCHAR2(100);
V_TIPO_INCIDENCIA_ID NUMBER;
V_CLIENTE_INCIDENCIA_ID NUMBER;
V_ID_DETALLE NUMBER;
BEGIN
--VERIFICAR QUE EL USUARIO TENGA EL PERMISO PARA CAMBIAR EL DATO
BEGIN
V_VALIDADO_DESC := 'Sin validar';
CREDITOPY.PKG_DIMO_SECURITY.PR_VALIDAR_PERMISO_DATOS(CP_documento, CP_codigo, V_VALIDADO, V_VALIDADO_DESC);
END;
--USUARIO VALIDADO PARA CAMBIAR EL DATO
IF V_VALIDADO = 1 THEN
--SACARLE EL PERMISO AL USUARIO
UPDATE DIMO_SICOOP.D_FUNCIONALIDAD_DOC@SICOOP dfd
SET dfd.ACTIVO = 0
WHERE dfd.DOCUMENTO = CP_documento AND dfd.ACTIVO = 1
AND dfd.FUNCIONALIDAD_ID = (SELECT df.FUNCIONALIDAD_ID FROM DIMO_SICOOP.D_FUNCIONALIDAD@SICOOP df WHERE df.CODIGO = CP_codigo);
--CERRAR LA INCIDENCIA
CASE CP_codigo
WHEN 'PERFILMOD_CELLPHONE' THEN
V_TIPO_INCIDENCIA_ID := 20;
WHEN 'PERFILMOD_EMAIL' THEN
V_TIPO_INCIDENCIA_ID := 19;
WHEN 'PERFILMOD_DATA' THEN
V_TIPO_INCIDENCIA_ID := 18;
ELSE
V_TIPO_INCIDENCIA_ID := 0;
END CASE;
--RECUPERAR ID DE LA INCIDENCIA
BEGIN
SELECT dci.CLIENTE_INCIDENCIA_ID
INTO V_CLIENTE_INCIDENCIA_ID
FROM DIMO_SICOOP.D_CLIENTE_INCIDENCIA@SICOOP dci
WHERE dci.TIPO_INCIDENCIA_ID = V_TIPO_INCIDENCIA_ID AND dci.ESTADO = 1
AND dci.CLIENTE_ID = (SELECT dc.CLIENTE_ID FROM DIMO_SICOOP.D_CLIENTE@SICOOP dc WHERE dc.CI = CP_documento);
EXCEPTION
WHEN NO_DATA_FOUND THEN
V_CLIENTE_INCIDENCIA_ID := 0;
END;
IF V_CLIENTE_INCIDENCIA_ID != 0 THEN
--ACTUALIZAR CABECERA
UPDATE DIMO_SICOOP.D_CLIENTE_INCIDENCIA@SICOOP dci
SET dci.ESTADO = 2
WHERE dci.CLIENTE_INCIDENCIA_ID = V_CLIENTE_INCIDENCIA_ID;
SELECT DIMO_SICOOP.S_D_CLIENTE_INCIDENCIA_DETALLE.nextval@SICOOP INTO V_ID_DETALLE FROM dual;
--INSERTAR DETALLE
INSERT INTO DIMO_SICOOP.D_CLIENTE_INCIDENCIA_DETALLE@SICOOP
(CLIENTE_INCIDENCIA_DETALLE_ID, CLIENTE_INCIDENCIA_ID, USUARIO_CRM, FECHA, CAMBIO_ESTADO, DESCRIPCION)
VALUES(V_ID_DETALLE, V_CLIENTE_INCIDENCIA_ID, 'BACKEND', sysdate, '2', 'SE SACA EL PERMISO');
NP_validado := 1;
CP_descripcion := 'Se Cerraron las incidencias y se saco el permiso al usuario';
ELSE
NP_validado := 0;
CP_descripcion := 'No se encontró una incidencia válida para el usuario';
END IF;
--EL USUARIO NO PUEDE CAMBIAR EL DATO
ELSE
NP_validado := 0;
CP_descripcion := V_VALIDADO_DESC;
END IF;
--- INSERTAMOS EN LA TABLA DIMO_SECURITY_LOG
LOG_VALIDACION(CP_documento,CP_codigo,NP_validado,CP_descripcion, 'PR_CERRAR_PERMISO_DATOS');
END PR_CERRAR_PERMISO_DATOS;
/* REGISTRAMOS LAS ACCIONES POR DOCUMENTO Y LAS REPUESTAS */
/*
AUTOR: MANUEL BAEZ
FECHA CREACION: 11/10/2024
DESCRIPCION:
FECHA MODIFICACION:
DESCRIPCION DE CAMBIOS:
*/
PROCEDURE LOG_VALIDACION(DOCUMENTO VARCHAR, CODIGO VARCHAR, VALIDACION NUMBER, DESCRIPCION VARCHAR, P_NAME_PR VARCHAR)
IS
BEGIN
INSERT INTO DIMO_SECURITY_LOG (ID_LOG, DOCUMENTO, COD_RES, DESC_RES, CODIGO, FECHA_ALTA, NAME_PR)
VALUES (SEQ_DIMO_SECURITY_LOG.NEXTVAL, DOCUMENTO, VALIDACION,DESCRIPCION,CODIGO, SYSDATE, P_NAME_PR);
END LOG_VALIDACION;
/*
AUTOR: MANUEL BAEZ
FECHA CREACION: 11/10/2024
DESCRIPCION:
FECHA MODIFICACION:
DESCRIPCION DE CAMBIOS:
*/
PROCEDURE PR_SET_AFI_EMI (
P_NUM_TARJ IN NUMBER,
P_AFINIDAD OUT NUMBER,
P_EMISOR OUT NUMBER,
P_DOCUMENTO OUT VARCHAR2
) IS
P_TARJ_ENCRI VARCHAR2(100);
BEGIN
SELECT CREDITOPY.FC_PAN2CRIPTO(P_NUM_TARJ)
INTO P_TARJ_ENCRI
FROM DUAL;
-- Consulta que nos devuelve EMISOR, DOCUEMNTOY AFINIDAD
SELECT T.EMISOR,
T.DOCUMENTO,
T.GRUPO_AFINIDAD
INTO P_EMISOR, P_DOCUMENTO, P_AFINIDAD
FROM CREDITOPY.TARJETAS T
WHERE T.TARJETA = P_TARJ_ENCRI;
-- QUITAMOS TODOS LOS NUMEROS QUE ESTEN ENFRENTE DEL NUMERO DE DOCUMENTO
P_DOCUMENTO := TO_CHAR(TO_NUMBER(SUBSTR(P_DOCUMENTO, 4)));
END PR_SET_AFI_EMI;
END PKG_DIMO_SECURITY;
|