create or replace PROCEDURE P_MIGRACION_CUATRO_NEW AS 

-- 25/01/2024: Quito del cursor todos los campos que no se usan
-- 29/01/2024: Usar indice en las select de la tabla de claves(creado por nombre tabla y campo de la tabla 87)
-- 29/01/2024: Cortar el campo de parentesco, porque falla al insertar en la 82.
-- 07/02/2024: Recoger una unica vez la fecha e incluirla en la insert con el nombre que tiene para reducir el tamaño del cursor a recuperar, y constantes puestas en insert.
-- CONSTANTES:
--C_TABLA_X87_03 VARCHAR2(10) := 'X8703T00';
--C_TABLA_X87_01 VARCHAR2(10) := 'X8701T00';
--C_TABLA_X87_00 VARCHAR2(10) := 'X8700T00';
--C_TABLA_X87_37 VARCHAR2(10) := 'X8737T00';

--C_TABLA_AD74A_02 VARCHAR2(10) := 'AD74A02T00';
--C_TABLA_AD74A_82 VARCHAR2(10) := 'AD74A82T00';


CURSOR  INF IS
	--AD74A16T00 - INFORMES	Y AD74A02T00 INFORMES SOCIALES					
	SELECT X00.IDSOLICITUD_000 IDSOLICITUD_000, (SELECT VALOR_AD74A FROM T_CLAVES_X00_E
                                                                      WHERE VALOR_X87B  =X00.IDSOLICITUD_000) AS IDEXPEDIENTE,
        X00.IDSOLICITANTE_001 IDSOLICITANTE_001, (SELECT VALOR_AD74A FROM T_CLAVES_X01
                                                                      WHERE VALOR_X87B  =X00.IDSOLICITANTE_001) AS IDSOLICITANTE,
		TRIM(EMAILTS_003) 	AS EMAIL_16,
		TRIM(FECHAINFORME_003) 	AS F_INFORME_003,
		TRIM(FECHAMODIF_003) 	AS F_ENVIO_ADMON_16,
		TRIM(FECHAMODIF_003) 	AS F_FIN_16,
		TRIM(FECHAMODIF_003) 	AS F_MODIF_16, 
		TRIM(TELEFONOTS_003) 	AS TELEFONO_16,
		NULL 					AS UNIDAD_BASE_16,
		TRIM(AYUNTAMIENTO_003)	AS AYUNTAMIENTO_16,
		TRIM(SSB_003)			AS SSB_16,
		TRIM(TRABAJADORSOCIAL_003) AS TRABAJADORSOCIAL_16,
		TRIM(APRECIANECESIDAD_003) 	AS APRECIACION_02,
		TRIM(SOLAMANIANA_003) 		AS ESTA_SOLA_MANANA_02,
		TRIM(SOLANOCHE_003)  		AS ESTA_SOLA_NOCHE_02,
		TRIM(SOLATARDE_003) 		AS ESTA_SOLA_TARDE_02,
		TRIM(FALLECFAMI_003)		AS FAMILIAR_FALLECIDO_02,
		DECODE (TRIM(FRECUSALIDAS_028),1,0,2,1,3,2,4,3,5,4) AS FRECUENCIA_SALIDAS_02,
		TRIM(X03.IDINFSOCIAL_003) 		AS IDINFSOCIAL_003,-- METER EN LA TABLA DE CLAVES
		TRIM(OBSERVPRESTATARIO_003) AS OBSERVACIONES_PS_02,
		TRIM(OBSERVACIONES_003) 	AS OBSERVACIONES_02,
		TRIM(TIEMPOSOLEDAD_003) 	AS PERIODO_SIN_VISITAS_02,
		TRIM(GRADORELENTORNO_003) 	AS RELACION_ENTORNO_02,
		TRIM(VIVESOLA_003) 			AS SOLA_02,
		TRIM(SOLEDADLARGA_003) 		AS TIEMPO_SIN_VISITAS_02,
		TRIM(VINCULO_003)			AS VINCULO_FALLECIDO_02,
		DECODE(TRIM(FRECUVISITAAMIST_028),1,0,2,1,3,2,4,3,5,4) AS VISITAS_AMIGOS_02,
		DECODE(TRIM(FRECUVISITAFAMILIA_028),1,0,2,1,3,2,4,3,5,4)AS VISITAS_FAMILIA_02
	FROM X87B.X8703T00@X87B_DBL0 X03, X87B.X8700T00@X87B_DBL0 X00
 WHERE X03.IDINFSOCIAL_003 = X00.IDINFSOCIAL_003(+)
 and TRIM(X03.IDINFSOCIAL_003) not IN (SELECT VALOR_X87B FROM T_CLAVES_X03);
 
		  
-- Identificador unico de la tabla 16 y de la 02: 
W_ID_INFORME_16       NUMBER; -- calculo AD74A16T00_SEQ.NEXTVAL
W_ID_INF_SOCIAL_02    NUMBER; -- CALCULO AD74A02T00_SEQ.NEXTVAL


 

CURSOR CONV (W_INF_SOCIAL VARCHAR2)--CONVIVIENTES
IS
	SELECT  FECHANACIMIENTO_037 AS  F_NACIMIENTO_82,
			IDPERSONACONV_037 AS ID_CONVIVIENTE_82,
			IDINFSOCIAL_003,
			NOMBREAPELLIDOS_037 AS NOMBRE_APELLIDOS_82,
			VINCULO_037 AS PARENTESCO_82
	FROM X87B.X8737T00@X87B_DBL0
	WHERE IDINFSOCIAL_003=(W_INF_SOCIAL);


-- Identificador unico de la tabla 82:
W_ID_CONVIVIENTE_82 NUMBER; -- calculo AD74A82T00_SEQ.NEXTVAL


BEGIN
    FOR R IN INF LOOP  --CURSOR PARA INFORMES E INFORMES SOCIALES
	
		/*CARGA DE INFORMES SOCIALES*/
		SELECT AD74A02T00_SEQ.NEXTVAL INTO W_ID_INF_SOCIAL_02 FROM DUAL; --ESTO VA AL CAMPO ID_INF_SOCIAL_02

		BEGIN 
			INSERT INTO T_CLAVES_X03 (VALOR_X87B, VALOR_AD74A, FECHA_MIG, MIGRADO )
			VALUES ( R.IDINFSOCIAL_003, W_ID_INF_SOCIAL_02, sysdate, 'S');
		EXCEPTION
			WHEN others THEN
				insert into t_errores_mig(PROCESO,ERROR,DESC_ERROR,FECHA_ERROR)
						values('CUATRO', 'insert T_CLAVES_X03','ERROR  T_CLAVES_X03 inf003, inf02:'||R.IDINFSOCIAL_003||','||W_ID_INF_SOCIAL_02, sysdate);
		END;
		
		IF (R.IDEXPEDIENTE IS NOT NULL AND R.IDSOLICITANTE IS NOT NULL) THEN
			SELECT AD74A16T00_SEQ.NEXTVAL INTO W_ID_INFORME_16 FROM DUAL;
					
			BEGIN
				-- ESTADO_16: '7'
				-- OBSERVACIONES_16: 'MIGRADO DESDE LA X87'
				-- OCULTO_16: 1
				-- ORIGEN_16: 2
				-- TIPO_INFORME_16: '1'
				-- URGENTE_16: 0
				INSERT INTO AD74A.AD74A16T00 ( 	AYUNTAMIENTO_16, EMAIL_16, ESTADO_16, F_ALTA_16, F_ENVIO_ADMON_16,
												F_FIN_16, F_INICIO_16, F_MODIF_16, ID_BENEFICIARIO_16, ID_EXPEDIENTE_16,
												ID_INFORME_16, OBSERVACIONES_16, OCULTO_16, ORIGEN_16, SSB_16,
												TELEFONO_16, TIPO_INFORME_16, TRABAJADORSOCIAL_16, UNIDAD_BASE_16, URGENTE_16,USU_ALTA_16 )
				VALUES (R.AYUNTAMIENTO_16, R.EMAIL_16, '7',  R.F_INFORME_003, R.F_ENVIO_ADMON_16,
						R.F_FIN_16, R.F_INFORME_003, R.F_MODIF_16, R.IDSOLICITANTE, R.IDEXPEDIENTE,
						W_ID_INFORME_16, 'MIGRADO DESDE LA X87', 1,	2, R.SSB_16,
						R.TELEFONO_16, '1', R.TRABAJADORSOCIAL_16,R.UNIDAD_BASE_16,0, 'MIGRADO');
			EXCEPTION
				WHEN OTHERS THEN
					DBMS_OUTPUT.PUT_LINE('ERROR INSERT AD74A16T00.  '||R.IDEXPEDIENTE||' '||R.IDSOLICITANTE||' '||W_ID_INFORME_16||' '||SQLCODE||SQLERRM);
					insert into t_errores_mig(PROCESO,ERROR,DESC_ERROR,FECHA_ERROR)
							values('CUATRO', 'insert INFORMES','ERROR  AD74A16T00 EXP, SOL01, INF00:'||R.IDEXPEDIENTE||'  '||R.IDSOLICITANTE||' '||W_ID_INFORME_16, sysdate);
			END;
		END IF;

    
		BEGIN --informe Social
			INSERT INTO AD74A.AD74A02T00 ( 	APRECIACION_02, ESTA_SOLA_MANANA_02, ESTA_SOLA_NOCHE_02,	ESTA_SOLA_TARDE_02, F_ALTA_02,
											FAMILIAR_FALLECIDO_02, F_INFORME_02, FRECUENCIA_SALIDAS_02, ID_INFORME_02, ID_INF_SOCIAL_02,
											OBSERVACIONES_PS_02, OBSERVACIONES_02, PERIODO_SIN_VISITAS_02, RELACION_ENTORNO_02, SOLA_02,
											TIEMPO_SIN_VISITAS_02, VINCULO_FALLECIDO_02, VISITAS_AMIGOS_02,	VISITAS_FAMILIA_02 )
			VALUES (R.APRECIACION_02, R.ESTA_SOLA_MANANA_02, R.ESTA_SOLA_NOCHE_02, R.ESTA_SOLA_TARDE_02, R.F_INFORME_003,
					R.FAMILIAR_FALLECIDO_02, R.F_INFORME_003,R.FRECUENCIA_SALIDAS_02, W_ID_INFORME_16, W_ID_INF_SOCIAL_02,
					R.OBSERVACIONES_PS_02, R.OBSERVACIONES_02, R.PERIODO_SIN_VISITAS_02, R.RELACION_ENTORNO_02, R.SOLA_02,
					R.TIEMPO_SIN_VISITAS_02, R.VINCULO_FALLECIDO_02, R.VISITAS_AMIGOS_02,R.VISITAS_FAMILIA_02);
					
					/*CARGA PARA CONVIVIENTES*/
			FOR T IN CONV (R.IDINFSOCIAL_003) LOOP
				SELECT AD74A82T00_SEQ.NEXTVAL INTO W_ID_CONVIVIENTE_82 FROM DUAL;
				
				BEGIN 
					INSERT INTO  T_CLAVES_X37  ( VALOR_X87B, VALOR_AD74A, FECHA_MIG,MIGRADO )
					values ( T.ID_CONVIVIENTE_82, W_ID_CONVIVIENTE_82,SYSDATE, 'S');
				exception 
					when dup_val_on_index then
						NULL;
					WHEN OTHERS THEN
						DBMS_OUTPUT.PUT_LINE('error al INSERTAR EN T_CLAVESX87B_AD74A. ID_CONVIVIENTE_82  '||SQLCODE||SQLERRM);
				END;

				BEGIN --CONVIVIENTES
					INSERT	INTO AD74A.AD74A82T00 ( F_NACIMIENTO_82, ID_CONVIVIENTE_82, ID_INF_SOCIAL_82, 
													NOMBRE_APELLIDOS_82, PARENTESCO_82 )
					VALUES (T.F_NACIMIENTO_82, W_ID_CONVIVIENTE_82, W_ID_INF_SOCIAL_02,--FK a la tabla 02 de INFORMES_SOCIALES
							T.NOMBRE_APELLIDOS_82, T.PARENTESCO_82 );
				EXCEPTION
					WHEN OTHERS THEN
						DBMS_OUTPUT.PUT_LINE('ERROR INSERT EN CONVIVIENTES AD74A82T00.  '||W_ID_CONVIVIENTE_82||' '||T.NOMBRE_APELLIDOS_82||' '||W_ID_INF_SOCIAL_02||' '||SQLCODE||SQLERRM);
						insert into t_errores_mig(PROCESO,ERROR,DESC_ERROR,FECHA_ERROR)
							values('CUATRO', 'insert CONVIVIENTES','ERROR  AD74A82T00 CONV: INF02:'||W_ID_CONVIVIENTE_82||','||W_ID_INF_SOCIAL_02, sysdate);
						
				END;
			END LOOP;--FIN LOOP CONVIVIENTES
		COMMIT;		
		EXCEPTION
			WHEN OTHERS THEN
				DBMS_OUTPUT.PUT_LINE('ERROR INSERT EN INFORMES SOCIALES AD74A02T00.  '||R.IDINFSOCIAL_003||' '||SQLCODE||SQLERRM);
				insert into t_errores_mig(PROCESO,ERROR,DESC_ERROR,FECHA_ERROR)
						values('CUATRO', 'insert INFORMES02','ERROR  AD74A02T00 INF02, INF16:'||W_ID_INF_SOCIAL_02||','||W_ID_INFORME_16, sysdate);
		END;

		
	END LOOP;--FIN LOOP INFORMES SOCIALES


END P_MIGRACION_CUATRO_NEW;
/