INSERT INTO CREDITOPY.API_CEIBO_PROCEDURES
(ID_API_SP, CATEGORIA, DESCRIPCION, API_PATH_GROUP, API_PATH_VERSION, API_PATH_NAME, PROCEDURE_DATABASE, PROCEDURE_SCHEMA, PROCEDURE_NAME, SIMPLIFICAR_RESPONSE_S_N, FECHA_HORA_INS, USUARIO_INS, FECHA_HORA_UPD, USUARIO_UPD)
VALUES(97, 'DIMO SECURITY', 'Obetner datos del emisor y su afinidad', 'security', 'v1', 'consultaTC', 'BAPY', 'creditopy', 'PKG_DIMO_SECURITY.PR_SET_AFI_EMI', 'S', TIMESTAMP '2024-10-11 16:26:35.000000', 'MBAEZ', TIMESTAMP '2024-10-11 16:26:35.000000', 'MBAEZ');



INSERT INTO CREDITOPY.API_CEIBO_PROCEDURES_PRMS_IN
(ID_API_SP, NRO_ORDEN, PARAM_NAME, TIPO_DATO, REQUERIDO_API_S_N, NULABLE_S_N, DEFAULT_VALUE)
VALUES(97, 1, 'P_NUM_TARJ', 'NUMERO', 'S', 'N', NULL);

INSERT INTO CREDITOPY.API_CEIBO_PROCEDURES_PRMS_OUT
(ID_API_SP, NRO_ORDEN, PARAM_NAME, TIPO_DATO, RETORNAR_API_S_N)
VALUES(97, 1, 'P_AFINIDAD', 'NUMERO', 'S');
INSERT INTO CREDITOPY.API_CEIBO_PROCEDURES_PRMS_OUT
(ID_API_SP, NRO_ORDEN, PARAM_NAME, TIPO_DATO, RETORNAR_API_S_N)
VALUES(97, 2, 'P_EMISOR', 'NUMERO', 'S');
INSERT INTO CREDITOPY.API_CEIBO_PROCEDURES_PRMS_OUT
(ID_API_SP, NRO_ORDEN, PARAM_NAME, TIPO_DATO, RETORNAR_API_S_N)
VALUES(97, 3, 'P_DOCUMENTO', 'TEXTO', 'S');
CREATE OR REPLACE PACKAGE PKG_DIMO_SECURITY IS
	-- AUTOR: MANU BAEZ
	-- Fecha Creación: 07/10/2024
  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
  );

 	-- AUTOR: ARTURO SOSA
	-- Fecha Creación: 08/10/2024
  PROCEDURE PR_VALIDAR_PERMISO_DATOS (
    CP_documento IN VARCHAR2,
    CP_codigo IN VARCHAR2,
    NP_validado OUT NUMBER,
    CP_descripcion OUT VARCHAR2
  );
 
  	-- AUTOR: ARTURO SOSA
	-- Fecha Creación: 08/10/2024
  PROCEDURE PR_CERRAR_PERMISO_DATOS (
    CP_documento IN VARCHAR2,
    CP_codigo IN VARCHAR2,
    NP_validado OUT NUMBER,
    CP_descripcion OUT VARCHAR2
  );

  PROCEDURE LOG_VALIDACION(DOCUMENTO VARCHAR, CODIGO VARCHAR, VALIDACION NUMBER, DESCRIPCION VARCHAR, P_NAME_PR VARCHAR);
  
  PROCEDURE PR_SET_AFI_EMI (
    P_NUM_TARJ IN NUMBER,
    P_AFINIDAD OUT NUMBER,
    P_EMISOR OUT NUMBER,
    P_DOCUMENTO OUT VARCHAR2
  );
END PKG_DIMO_SECURITY;

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;