package com.ejie.m62fb.dao.registroVPP.plsql;

import java.math.BigDecimal;
import java.sql.Types;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import javax.sql.DataSource;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.jdbc.core.SqlOutParameter;
import org.springframework.jdbc.core.SqlParameter;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
import org.springframework.jdbc.core.simple.SimpleJdbcCall;

import com.ejie.m62fb.utils.constants.IberErrorsMsgConstants;
import com.ejie.m62fb.utils.error.UFException;
import com.ejie.m62fb.utils.exception.IberExceptionHandler;
import com.ejie.m62fb.dao.ComboP28Dao;
import com.ejie.m62fb.model.persona.Persona;
import com.ejie.m62fb.model.plsql.PlSqlOutputError;
import com.ejie.m62fb.model.tipos.TipoAcceso;
import com.ejie.m62fb.model.tipos.TipoPromotor;
import com.ejie.m62fb.model.tipos.TipoPropietarios;
import com.ejie.m62fb.model.tipos.TipoSexo;
import com.ejie.m62fb.util.UtilSeguridad;
import com.ejie.m62fb.utils.constants.AppConstantes;
import com.ejie.m62fb.utils.properties.UtilProperties;
import com.ejie.t17i.model.Pais;
/**
 * Clase que implementa las funciones que llaman al PLSQL relacionado con
 * INSPECCI&Oacute;N VPO
 * 
XXXX
 */
public class M62FuncionesPLSQL {
	@Autowired 
	ComboP28Dao comboP28Dao;
	private static final Logger logger = LoggerFactory
			.getLogger(M62FuncionesPLSQL.class);
	/*************************************************************/
	/********************* M62P0020k000 ***************************/
	/*************************************************************/

	private final static String M62_PACKAGE_PERSONA = "M62P0020K000S0";
	// Proceso para insertar una persona
	private final static String M62INSERTAR_TITULAR = "M62_INSERT_RVPP";
	// Proceso para actualizar una persona
	private final static String M62ACTUALIZAR_TITULAR = "M62_UPDATE_RVPP";
	//Proceso para insertar una petición de llamada al SVDI 
	private final static String M62INSERTAR_PETICION_SVDI = "P_INSERTAR_PETICION_SVDI";
	//Proceso para recuperar el resultado de una llamada al SVDI 
	private final static String M62RECUPERAR_PETICION_SVDI = "P_RECUPERAR_PETICION_SVDI";
	/*************************************************************/
	/********************* M62R0000k000 ***************************/
	/*************************************************************/
	private final static String M62_PACKAGE_REGISTRO = "M62R0000K000S0";
	//Función que obtiene del numero de tipo de regimen de acceso segun el codigo de regimen de acceso. 
	private final static String M62OBT_NUM_TIPO_REG_ACCESO = "FN_OBT_NUM_TIPO_REG_ACCESO";
	//Función que obtiene del numero de tipo de propietario segun el nif del titular 
	private final static String M62OBT_NUM_TIPO_PROPIETARIO = "FN_OBT_NUM_TIPO_PROPIETARIO";
	//Funcion que obtiene del numero de tipo de propietario segun el nif del titular
	/*************************************************************/
	/******************** M62RGVPPK000S0 ***************************/
	/*************************************************************/
	private final static String M62_PACKAGE_REGVPP = "M62RGVPPK000S0";
	// Proceso que nos valida si al visar el contrato de primera transmisión se
	// supera el importe máximo autorizado para la promoción
	private final static String M62VAL_IMPORTE_AUTORIZADO = "P_VAL_IMPORTE_AUTORIZADO";
	// Proceso que nos devuelve el valor de la Fecha de Fin de Prorroga de un
	// contrato de alquiler
	private final static String M62CALCULA_FEC_FIN_PRORROGA = "P_CALCULA_FEC_FIN_PRORROGA";
	// Proceso que elimina una vivienda del registro VPP
	private final static String M62BORRAR_VIV_VPP = "P_BORRAR_VIV_VPP";
	// Proceso que elimina un contrato de compra del registro VPP
	private final static String M62BORRAR_CONTR_COMPRAS = "P_BORRAR_CONTR_COMPRA_VPP";
	// Proceso que elimina un propietario de un contrato de una vivienda VPP
	private final static String M62BORRAR_PROPIETARIO_VIV_VPP = "P_BORRAR_PROPIETARIO_VIV_VPP";
	// Proceso que elimina un contrato de alquiler del registro VPP
	private final static String M62BORRAR_CONTR_ALQ_VPP = "P_BORRAR_CONTR_ALQ_VPP";
	// Proceso que elimina un inquilino de un contrato de alquiler de una
	// vivienda VPP
	private final static String M62BORRAR_INQ_VIV_VPP = "P_BORRAR_INQ_VIV_VPP";
	// Proceso que elimina eliminar un anejo del registro VPP
	private final static String M62BORRAR_ANEJO_VPP = "P_BORRAR_ANEJO_VPP";
	// Proceso que elimina un contrato de alquiler asociado a un anejo del
	// registro VPP
	private final static String M62BORRAR_CONTR_ALQ_ELEM_VPP = "P_BORRAR_CONTR_ALQ_ELEM_VPP";
	// Proceso que elimina un inquilino de un contrato de alquiler de un anejo.
	private final static String M62BORRAR_INQ_ELEM_VPP = "P_BORRAR_INQ_ELEM_VPP";
	// Proceso que elimina un titular de la tabla de personas
	private final static String M62BORRAR_TIT_P20 = "P_BORRAR_TIT_P20";
	// Proceso que elimina un alojamiento dotacional del registro VPP
	private final static String M62BORRAR_ALOJ_DOT_VPP = "P_BORRAR_ALOJ_DOT_VPP";
	// Proceso que elimina un contrato de alquiler asociado a un alojamiento
	// dotacional
	private final static String M62BORRAR_CONTR_ALQ_AD_VPP = "P_BORRAR_CONTR_ALQ_AD_VPP";
	// Proceso que elimina un inquilino de un contrato de alquiler asociado a un
	// alojamiento dotacional
	private final static String M62BORRAR_INQUILINO_AD_VPP = "P_BORRAR_INQUILINO_AD_VPP";
	// Proceso que elimina una vivienda reservada
	private final static String M62_BORRAR_VIV_RESERVA = "P_BORRAR_VIV_RESERVA";
	// Proceso que elimina un acuerdo
	private final static String M62_BORRAR_ACUERDO = "P_BORRAR_ACUERDO";

	private DataSource dataSource;
	private SimpleJdbcCall jdbcCall;

	/**
	 * Constructor por defecto
	 */
	public M62FuncionesPLSQL() {
		super();
	}

	/**
	 * Construye el objeto <code>PersonaStrProc</code>
	 * 
	 * @param dataSource
	 *            Datasource
	 */
	public M62FuncionesPLSQL(final DataSource dataSource) {
		this.dataSource = dataSource;
	}
	public TipoAcceso getNumTipoRegAcceso(String codRegAcceso,String regTenencia){
		logger.info(M62OBT_NUM_TIPO_REG_ACCESO + " -> Inicio CONSULTA codRegAcceso:"+ codRegAcceso + ",RegTenencia"+regTenencia);

		this.jdbcCall =  new SimpleJdbcCall(dataSource).withCatalogName(M62_PACKAGE_REGISTRO).withFunctionName(M62OBT_NUM_TIPO_REG_ACCESO);
		jdbcCall.setAccessCallParameterMetaData(false);
		jdbcCall.declareParameters(
		        new SqlOutParameter("RETURN", Types.NUMERIC),
		        new SqlParameter("P_COD_REG_ACCESO", Types.VARCHAR),
				        new SqlParameter("P_COD_REG_TENENCIA", Types.VARCHAR));
		Map<String, Object> inParamMap = new HashMap<String, Object>();
		inParamMap.put("P_COD_REG_ACCESO",codRegAcceso);
		inParamMap.put("P_COD_REG_TENENCIA",regTenencia);
		SqlParameterSource in = new MapSqlParameterSource(inParamMap);
		BigDecimal out =jdbcCall.executeFunction(BigDecimal.class,in);

		logger.info(M62OBT_NUM_TIPO_REG_ACCESO + " -> Fin CONSULTA codRegAcceso:"+ codRegAcceso + ",RegTenencia"+regTenencia);

		return new TipoAcceso(out.toString());
	}
	public TipoPropietarios getNumTipoPropietarios(String nifSolicitante){
		logger.info(M62OBT_NUM_TIPO_PROPIETARIO + " -> Inicio CONSULTA nifSolicitante:"+ nifSolicitante);

		this.jdbcCall =  new SimpleJdbcCall(dataSource).withCatalogName(M62_PACKAGE_REGISTRO).withFunctionName(M62OBT_NUM_TIPO_PROPIETARIO);
		jdbcCall.setAccessCallParameterMetaData(false);
		jdbcCall.declareParameters(
		        new SqlOutParameter("RETURN", Types.NUMERIC),
		        new SqlParameter("P_NIF_TITULAR", Types.VARCHAR));
		Map<String, Object> inParamMap = new HashMap<String, Object>();
		inParamMap.put("P_NIF_TITULAR",nifSolicitante);
		SqlParameterSource in = new MapSqlParameterSource(inParamMap);
		BigDecimal out =jdbcCall.executeFunction(BigDecimal.class,in);

		
		logger.info(M62OBT_NUM_TIPO_PROPIETARIO + " -> Fin CONSULTA nifSolicitante:"+ nifSolicitante);

		return out==null?null:new TipoPropietarios(out.toString());
	}
	/**
	 * 
	 */
	public String insertPeticionSVDI(final String tipoCodigoId,final String codigoId,
			final String apellido1, final String fechaNacimiento){
		final String IND_TITULAR_TARJ_RESIDENTE ="R";
		final String IND_TITULAR_PASAPORTE ="P";
		final String IND_TITULAR_CIF ="C";
//		final String IND_TITULAR_DNI ="D";
		final String POLIC_DNI	="DNI";
		final String POLIC_CIF	="CIF";
		final String POLIC_TARJ_RESIDENTE 	="NIE";
		final String POLIC_PASAPORTE		="Pasaporte";
		
		String idPeticion=null;
		StringBuilder textParametros = new StringBuilder();
		//param 1 Organo Solicitante
		textParametros.append("@@");
		textParametros.append(UtilProperties.getProperty("x53js.svdi.param.organoSolicitante"));
		//param 2 Finalidad
		textParametros.append("@@");
		textParametros.append(UtilProperties.getProperty("x53js.svdi.param.finalidad"));
		//param 3 Tipo Tramite
		textParametros.append("@@");
		textParametros.append(UtilProperties.getProperty("x53js.svdi.param.tipoTramite.consulta"));
		//param 4 Tipo NIF
		textParametros.append("@@");
		if (tipoCodigoId.equalsIgnoreCase(IND_TITULAR_TARJ_RESIDENTE)){
			textParametros.append(POLIC_TARJ_RESIDENTE);
		}else if(tipoCodigoId.equalsIgnoreCase(IND_TITULAR_PASAPORTE)){
			textParametros.append(POLIC_PASAPORTE);
		}else if(tipoCodigoId.equalsIgnoreCase(IND_TITULAR_CIF)){
			textParametros.append(POLIC_CIF);
		}else {
			textParametros.append(POLIC_DNI);
		}
		//param 5 NIF
		textParametros.append("@@");
		textParametros.append(codigoId);
		//param 6 CodProceso T19B
		textParametros.append("@@");
		textParametros.append(UtilProperties.getProperty("x53js.svdi.param.codProceso"));
		//param 7 Expediente
		textParametros.append("@@");
		textParametros.append("-");
		//param 8 Apellido 1
		textParametros.append("@@");
		textParametros.append(apellido1);
		//param 9 Fecha Nacimiento
		textParametros.append("@@");
//		if(persona.getFecNacimiento()!=null){
//			String fecha = new SimpleDateFormat("yyyyddMM").format(persona.getFecNacimiento());
			textParametros.append(fechaNacimiento);
//		}
		textParametros.append("@@");
		
		this.jdbcCall = new SimpleJdbcCall(dataSource)
				.withCatalogName(M62_PACKAGE_PERSONA)
				.withProcedureName(M62INSERTAR_PETICION_SVDI)
				.withoutProcedureColumnMetaDataAccess()
				.declareParameters(	          
	            		  // ---- IN ----
	            		  new SqlParameter("P_TEX_PARAMETROS",Types.VARCHAR),
	            		  new SqlParameter("P_COD_USU_PET",Types.VARCHAR),
	            		  new SqlParameter("P_COD_APLICACION",Types.VARCHAR),
	            		  // ---- OUT ----
	            		  new SqlOutParameter("P_ID_T19G0T00", Types.INTEGER));
		
		MapSqlParameterSource in=new MapSqlParameterSource();
		// TEX_PARAMETROS
	    in.addValue("P_TEX_PARAMETROS", textParametros);
	    //USUARIO SEGURIDAD
	    in.addValue("P_COD_USU_PET", UtilSeguridad.getNombreUsuarioConectado());
	    // APLICACION
	    in.addValue("P_COD_APLICACION", AppConstantes.APLICACION);
	    
	    Map<String,Object> out =jdbcCall.execute(in);	    
	    
	    // ID_T19G0T00
		idPeticion=out.get("P_ID_T19G0T00").toString();
		
		logger.info(M62INSERTAR_PETICION_SVDI + " -> CONSULTA svdi:"+ codigoId);
		return idPeticion;
		
	}
	public Persona recuperarPeticionSVDI(String idPeticion){
		logger.info(M62RECUPERAR_PETICION_SVDI + " -> Inicio CONSULTA t19g0t20:"+ idPeticion);

		this.jdbcCall =  new SimpleJdbcCall(dataSource).withCatalogName(M62_PACKAGE_PERSONA).withProcedureName(M62RECUPERAR_PETICION_SVDI);
		Map<String, Object> inParamMap = new HashMap<String, Object>();
		inParamMap.put("P_ID_T19G0T00",idPeticion);
		SqlParameterSource in = new MapSqlParameterSource(inParamMap);
		Map<String,Object> out =jdbcCall.execute(in);

		String pCodError=out.get("P_COD_ERROR").toString();
		if(pCodError.equalsIgnoreCase("1")){
			throw new UFException(IberErrorsMsgConstants.SVDI_NO_RESULT);	
		}
		
		Persona persona = new Persona();

		//NOM_NOMBRE
		persona.setNombre(out.get("P_NOM_TITULAR").toString()); 
		//NOM_APELLIDO_1
		persona.setApellido1(out.get("P_APE1_TITULAR").toString()); 
		//NOM_APELLIDO_2
		persona.setApellido2(out.get("P_APE2_TITULAR").toString()); 
		//FEC_NACIMIENTO
		persona.setFecNacimiento((Date) out.get("P_FEC_NAC_TITULAR"));
		//IND_SEXO
		TipoSexo sexo= new TipoSexo(out.get("P_SEXO_TITULAR").toString().equalsIgnoreCase("")?TipoSexo.VARON:TipoSexo.MUJER);
		persona.setSexo(sexo.getCodTabla()!=null?sexo:null);
		//persona.setSexo(sexo.getCodTabla()!=null?(TipoSexo) comboP28Dao.find(sexo):null);
		//COD_NACIONALIDAD
		String nacionalidad=out.get("P_NAC_TITULAR").toString(); 
		if (nacionalidad != null && !nacionalidad.equalsIgnoreCase(AppConstantes.PAIS_ESPANYA_SVDI)){
			persona.setNacionalidad(new Pais(AppConstantes.PAIS_ESPANYA,AppConstantes.PAIS_ESPANYA_TXT));
		}
	
		logger.info(M62RECUPERAR_PETICION_SVDI + " -> Fin CONSULTA t19g0t20:"+ idPeticion);

		return persona;
	}
	/**
	 * <p>Proceso que inserta un titular</p> 
	 * @param numExpediente
	 * @param numVivienda
	 * @return
	 */
	public void addTitular(final Persona persona) {
		this.jdbcCall = new SimpleJdbcCall(dataSource).withCatalogName(
				M62_PACKAGE_PERSONA).withProcedureName(M62INSERTAR_TITULAR);
		Map<String, Object> inParamMap = new HashMap<String, Object>();
		inParamMap.put("PK80_NIF_TITULAR", persona.getCodigoId());
		inParamMap.put("PK80_NUM_CORREL_NIF", persona.getNumCorrelNif());
		inParamMap.put("PK80_COD_TIPO_CLAVE", persona.getTipoCodigoId() != null
				&& persona.getTipoCodigoId().getCodTabla() != null ? persona
				.getTipoCodigoId().getCodTabla() : null);
		inParamMap.put("PK80_NOM_APELLIDO_1", persona.getApellido1());
		inParamMap.put("PK80_NOM_APELLIDO_2", persona.getApellido2());
		inParamMap.put("PK80_NOM_NOMBRE", persona.getNombre());
		inParamMap.put("PK80_IND_SEXO", persona.getSexo() != null
				&& persona.getSexo().getCodTabla() != null ? persona.getSexo()
				.getCodTabla() : null);
		inParamMap
				.put("PK80_IND_ESTADO_CIVIL",
						persona.getEstadoCivil() != null
								&& persona.getEstadoCivil().getCodTabla() != null ? persona
								.getEstadoCivil().getCodTabla() : null);
		inParamMap.put(
				"PK80_ID_Pais",
				persona.getDireccion()!=null && persona.getDireccion().getPais() != null ? persona.getDireccion().getPais().getId()
						: AppConstantes.PAIS_ESPANYA);
		inParamMap.put("PK80_ID_Provincia",persona.getDireccion()!=null && persona.getDireccion().getProvincia() != null ?
				persona.getDireccion().getProvincia().getId():null);
		inParamMap.put("PK80_ID_Municipio",persona.getDireccion()!=null && persona.getDireccion().getMunicipio() != null ?
				persona.getDireccion().getMunicipio().getId():null);
		inParamMap.put("PK80_ID_Localidad", persona.getDireccion()!=null && persona.getDireccion()
				.getLocalidad() != null ? persona.getDireccion().getLocalidad()
				.getId() : null);
		inParamMap.put("PK80_ID_Calle",persona.getDireccion()!=null  && persona.getDireccion().getCalle() != null ?
				persona.getDireccion().getCalle().getId():null);
		inParamMap.put("PK80_BLOQUE",persona.getDireccion()!=null  &&
				persona.getDireccion().getPortal() != null ? persona
						.getDireccion().getPortal().getBloque() : null);
		inParamMap.put("PK80_NUMERO",persona.getDireccion()!=null  &&
				persona.getDireccion().getPortal() != null ? persona
						.getDireccion().getPortal().getNumero() : null);
		inParamMap.put("PK80_BIS",persona.getDireccion()!=null  &&
				persona.getDireccion().getPortal() != null ? persona
						.getDireccion().getPortal().getBis() : null);
		inParamMap.put("PK80_CODIGO_POSTAL",persona.getDireccion()!=null  &&
				persona.getDireccion().getPortal() != null ? persona
						.getDireccion().getPortal().getCodigoPostal() : null);
		inParamMap.put("PK80_ESCALERA",persona.getDireccion()!=null  &&
				persona.getDireccion().getPlanta() != null ? persona
						.getDireccion().getPlanta().getEscalera() : null);
		inParamMap.put("PK80_PISO",persona.getDireccion()!=null  &&
				persona.getDireccion().getPlanta() != null ? persona
						.getDireccion().getPlanta().getPiso() : null);
		inParamMap.put("PK80_MANO", persona.getDireccion()!=null  ? persona.getDireccion().getMano(): null);
		inParamMap.put("PK80_PUERTA",  persona.getDireccion()!=null  ? persona.getDireccion().getPuerta(): null);
		inParamMap.put("PK80_FEC_NACIMIENTO",
				persona.getFecNacimiento() != null ? new java.sql.Date(persona
						.getFecNacimiento().getTime()) : null);
		inParamMap.put("PK80_EMAIL", persona.getEmail());
		inParamMap.put("PK80_NTELEFNO", persona.getTelefno1()!=null && !persona.getTelefno1().isEmpty()?Long.parseLong(persona.getTelefno1()):null);
		inParamMap.put("PK80_NUM_TLFNO_2",  persona.getTelefno2()!=null && !persona.getTelefno2().isEmpty()?Long.parseLong(persona.getTelefno2()):null);
		inParamMap.put("PK80_COD_NACIONALIDAD",
				persona.getNacionalidad() != null
						&& persona.getNacionalidad().getId() != null ? persona
						.getNacionalidad().getId() : null);
		inParamMap.put("PK80_COD_USU_ULT_MODIF",
				persona.getCodUsuarioUltimaModif());
		inParamMap.put("PK80_COD_APLICACION", "M62");
		SqlParameterSource in = new MapSqlParameterSource(inParamMap);
		jdbcCall.execute(in);
		logger.info(M62INSERTAR_TITULAR + " -> insertar titular NIF:"
				+ persona.getCodigoId());
	}

	/**
	 * <p>
	 * Proceso que actualiza un titular
	 * </p>
	 * 
	 * @param numExpediente
	 * @param numVivienda
	 * @return
	 */
	public void editTitular(final Persona persona) {
		this.jdbcCall = new SimpleJdbcCall(dataSource).withCatalogName(
				M62_PACKAGE_PERSONA).withProcedureName(M62ACTUALIZAR_TITULAR);
		Map<String, Object> inParamMap = new HashMap<String, Object>();
		inParamMap.put("PK80_ID_PERSONA", persona.getIdPersona());
		inParamMap.put("PK80_COD_TIPO_CLAVE", persona.getTipoCodigoId() != null
				&& persona.getTipoCodigoId().getCodTabla() != null ? persona
				.getTipoCodigoId().getCodTabla() : null);
		inParamMap.put("PK80_NOM_APELLIDO_1", persona.getApellido1());
		inParamMap.put("PK80_NOM_APELLIDO_2", persona.getApellido2());
		inParamMap.put("PK80_NOM_NOMBRE", persona.getNombre());
		inParamMap.put("PK80_IND_SEXO", persona.getSexo() != null
				&& persona.getSexo().getCodTabla() != null ? persona.getSexo()
				.getCodTabla() : null);
		inParamMap
				.put("PK80_IND_ESTADO_CIVIL",
						persona.getEstadoCivil() != null
								&& persona.getEstadoCivil().getCodTabla() != null ? persona
								.getEstadoCivil().getCodTabla() : null);
		inParamMap.put(
				"PK80_ID_Pais",
				persona.getDireccion().getPais() != null ? persona.getDireccion().getPais().getId()
						: AppConstantes.PAIS_ESPANYA);
		inParamMap.put("PK80_ID_Provincia",persona.getDireccion().getProvincia().getId());
		inParamMap.put("PK80_ID_Municipio",persona.getDireccion().getMunicipio().getId());
		inParamMap.put("PK80_ID_Localidad", persona.getDireccion()
				.getLocalidad() != null ? persona.getDireccion().getLocalidad()
				.getId() : null);
		inParamMap.put("PK80_ID_Calle", persona.getDireccion().getCalle()
				.getId());
		inParamMap.put("PK80_BLOQUE",
				persona.getDireccion().getPortal() != null ? persona
						.getDireccion().getPortal().getBloque() : null);
		inParamMap.put("PK80_NUMERO",
				persona.getDireccion().getPortal() != null ? persona
						.getDireccion().getPortal().getNumero() : null);
		inParamMap.put("PK80_BIS",
				persona.getDireccion().getPortal() != null ? persona
						.getDireccion().getPortal().getBis() : null);
		inParamMap.put("PK80_CODIGO_POSTAL",
				persona.getDireccion().getPortal() != null ? persona
						.getDireccion().getPortal().getCodigoPostal() : null);
		inParamMap.put("PK80_ESCALERA",
				persona.getDireccion().getPlanta() != null ? persona
						.getDireccion().getPlanta().getEscalera() : null);
		inParamMap.put("PK80_PISO",
				persona.getDireccion().getPlanta() != null ? persona
						.getDireccion().getPlanta().getPiso() : null);
		inParamMap.put("PK80_MANO", persona.getDireccion().getMano());
		inParamMap.put("PK80_PUERTA", persona.getDireccion().getPuerta());
		inParamMap.put("PK80_FEC_NACIMIENTO",
				persona.getFecNacimiento() != null ? new java.sql.Date(persona
						.getFecNacimiento().getTime()) : null);
		inParamMap.put("PK80_EMAIL", persona.getEmail());
		inParamMap.put(
				"PK80_NTELEFNO",
				persona.getTelefno1() != null
						&& !persona.getTelefno1().isEmpty() ? Long
						.parseLong(persona.getTelefno1()) : null);
		inParamMap.put(
				"PK80_NUM_TLFNO_2",
				persona.getTelefno2() != null
						&& !persona.getTelefno2().isEmpty() ? Long
						.parseLong(persona.getTelefno2()) : null);
		inParamMap.put("PK80_COD_NACIONALIDAD",
				persona.getNacionalidad() != null
						&& persona.getNacionalidad().getId() != null ? persona
						.getNacionalidad().getId() : null);
		inParamMap.put("PK80_COD_USU_ULT_MODIF",
				persona.getCodUsuarioUltimaModif());
		inParamMap.put("PK80_COD_APLICACION", "M62");
		SqlParameterSource in = new MapSqlParameterSource(inParamMap);
		jdbcCall.execute(in);
		logger.info(M62ACTUALIZAR_TITULAR + " -> actualizar titular NIF:"
				+ persona.getCodigoId());
	}

	/**
	 * <p>
	 * Proceso que nos valida si al visar el contrato de primera transmisión se
	 * supera el importe máximo autorizado para la promoción
	 * </p>
	 * 
	 * @param numExpediente
	 * @param numVivienda
	 * @return
	 */
	public PlSqlOutputError validarImporteAutorizado(
			final String numExpediente, final BigDecimal numVivienda) {
		this.jdbcCall = new SimpleJdbcCall(dataSource).withCatalogName(
				M62_PACKAGE_REGVPP)
				.withProcedureName(M62VAL_IMPORTE_AUTORIZADO);
		Map<String, Object> inParamMap = new HashMap<String, Object>();
		inParamMap.put("P_NUM_EXPEDIENTE", numExpediente.toUpperCase());
		inParamMap.put("P_NUM_VIVIENDA", numVivienda);
		inParamMap.put("P_IDIOMA", AppConstantes.ES_LOCALE
				.equals(LocaleContextHolder.getLocale()) ? AppConstantes.ES
				: AppConstantes.EU);
		SqlParameterSource in = new MapSqlParameterSource(inParamMap);
		Map<String, Object> out = jdbcCall.execute(in);
		PlSqlOutputError outputError = new PlSqlOutputError();
		outputError.setCodError((BigDecimal) out.get("P_COD_ERROR"));
		outputError.setTextError((String) out.get("P_TEXT_ERROR"));
		logger.info(M62VAL_IMPORTE_AUTORIZADO
				+ " -> validarImporteAutorizado numExpediente: "
				+ numExpediente.toUpperCase() + " numVivienda:" + numVivienda.toString()
				+ " Resultado:" + outputError.getCodError().toString() + "-"
				+ outputError.getTextError());
		return outputError;
	}

	/**
	 * <p>
	 * Proceso que nos devuelve el valor de la Fecha de Fin de Prorroga de un
	 * contrato de alquiler
	 * </p>
	 * 
	 * @param fecInicio
	 * @param fecFin
	 * @param fecEntrada
	 * @return
	 */
	public Date calcularFecFinProrroga(final Date fecInicio, final Date fecFin,
			final Date fecEntrada) {
		this.jdbcCall = new SimpleJdbcCall(dataSource).withCatalogName(
				M62_PACKAGE_REGVPP).withProcedureName(
				M62CALCULA_FEC_FIN_PRORROGA);
		Map<String, Object> inParamMap = new HashMap<String, Object>();
		inParamMap.put("P_FEC_INICIO", fecInicio != null ? new java.sql.Date(
				fecInicio.getTime()) : null);
		inParamMap.put("P_FEC_FIN",
				fecFin != null ? new java.sql.Date(fecFin.getTime()) : null);
		inParamMap.put("P_FEC_ENTRADA", fecEntrada != null ? new java.sql.Date(
				fecEntrada.getTime()) : null);
		SqlParameterSource in = new MapSqlParameterSource(inParamMap);
		Map<String, Object> out = jdbcCall.execute(in);
		return (Date) out.get("P_FEC_FORZOSA");

	}

	// VIVIENDA
	/**
	 * <p>
	 * Proceso que elimina una vivienda del registro VPP
	 * </p>
	 * 
	 * @param numVivienda
	 */
	public void borrarVivienda(final BigDecimal numVivienda) {
		this.jdbcCall = new SimpleJdbcCall(dataSource).withCatalogName(
				M62_PACKAGE_REGVPP).withProcedureName(M62BORRAR_VIV_VPP);
		Map<String, Object> inParamMap = new HashMap<String, Object>();
		inParamMap.put("P_NUM_VIVIENDA", numVivienda);
		SqlParameterSource in = new MapSqlParameterSource(inParamMap);
		try{
			jdbcCall.execute(in);
		}catch (DataIntegrityViolationException e) {
			throw new UFException(
					IberErrorsMsgConstants.VIVIENDA_EN_PROMOCION);
		}
		logger.info(M62BORRAR_VIV_VPP + " -> borrar vivienda numVivienda:"
				+ numVivienda.toString());
	}

	/**
	 * <p>
	 * Proceso que elimina un contrato de compra del registro VPP
	 * </p>
	 * 
	 * @param idContrato
	 */
	public void borrarContratoCompra(final Integer idContrato) {
		this.jdbcCall = new SimpleJdbcCall(dataSource).withCatalogName(M62_PACKAGE_REGVPP).withProcedureName(M62BORRAR_CONTR_COMPRAS);
		Map<String, Object> inParamMap = new HashMap<String, Object>();
		inParamMap.put("P_ID_CONTRATO", idContrato);
		SqlParameterSource in = new MapSqlParameterSource(inParamMap);
		jdbcCall.execute(in);
		logger.info(M62BORRAR_CONTR_COMPRAS + " -> borrar contrato compra idContrato:" + idContrato.toString());
	}

	/**
	 * <p>
	 * Proceso que elimina un propietario de un contrato de una vivienda VPP
	 * </p>
	 * 
	 * @param idM62r04t0
	 * @param numPropietario
	 * @param idPersona
	 */
	public void borrarPropietarioContratoCompra(final Integer idM62r04t0) {
		this.jdbcCall = new SimpleJdbcCall(dataSource).withCatalogName(M62_PACKAGE_REGVPP).withProcedureName(M62BORRAR_PROPIETARIO_VIV_VPP);
		Map<String, Object> inParamMap = new HashMap<String, Object>();
		inParamMap.put("P_ID_M62R04T0", idM62r04t0);
		SqlParameterSource in = new MapSqlParameterSource(inParamMap);
		jdbcCall.execute(in);
		logger.info(M62BORRAR_PROPIETARIO_VIV_VPP+ " -> borrar contrato propietario idM62r04t0:" + idM62r04t0.toString());
	}

	/**
	 * <p>
	 * Proceso que elimina un contrato de compra del registro VPP
	 * </p>
	 * 
	 * @param numVivienda
	 * @param numInquilino
	 */
	public void borrarContratoAlquiler(final Integer idContrato) {
		this.jdbcCall = new SimpleJdbcCall(dataSource).withCatalogName(M62_PACKAGE_REGVPP).withProcedureName(M62BORRAR_CONTR_ALQ_VPP);
		Map<String, Object> inParamMap = new HashMap<String, Object>();
		inParamMap.put("P_ID_CONTRATO", idContrato);
		SqlParameterSource in = new MapSqlParameterSource(inParamMap);
		jdbcCall.execute(in);
		logger.info(M62BORRAR_CONTR_ALQ_VPP + " -> borrar contrato alquiler idContrato:" + idContrato.toString());
	}

	/**
	 * <p>
	 * Proceso que elimina un inquilino de un contrato de alquiler de una
	 * vivienda VPP
	 * </p>
	 * 
	 * @param numVivienda
	 * @param numInquilino
	 * @param idPersona
	 */
	public void borrarPropietarioContratoAlquiler(final Integer idM62r06t0) {
		this.jdbcCall = new SimpleJdbcCall(dataSource).withCatalogName(M62_PACKAGE_REGVPP).withProcedureName(M62BORRAR_INQ_VIV_VPP);
		Map<String, Object> inParamMap = new HashMap<String, Object>();
		inParamMap.put("P_ID_M62R06T0", idM62r06t0);
		SqlParameterSource in = new MapSqlParameterSource(inParamMap);
		jdbcCall.execute(in);
		logger.info(M62BORRAR_INQ_VIV_VPP+ " -> borrar contrato propietario alquiler idM62r06t0:" + idM62r06t0.toString());
	}

	/**
	 * <p>
	 * Proceso que elimina eliminar un anejo del registro VPP
	 * </p>
	 * 
	 * @param ideElemento
	 */
	public void borrarElemento(final BigDecimal ideElemento) {
		this.jdbcCall = new SimpleJdbcCall(dataSource).withCatalogName(
				M62_PACKAGE_REGVPP).withProcedureName(M62BORRAR_ANEJO_VPP);
		Map<String, Object> inParamMap = new HashMap<String, Object>();
		inParamMap.put("P_IDE_ELEMENTO", ideElemento);
		SqlParameterSource in = new MapSqlParameterSource(inParamMap);
		try{
			jdbcCall.execute(in);
		}catch (DataIntegrityViolationException e) {
			throw new UFException(
					IberErrorsMsgConstants.ELEMENTO_EN_PROMOCION);
		}
		
		logger.info(M62BORRAR_ANEJO_VPP + " -> borrar elemento ideElemento:"
				+ ideElemento.toString());
	}

	/**
	 * <p>
	 * Proceso que elimina un contrato de alquiler asociado a un anejo del
	 * registro VPP
	 * </p>
	 * 
	 * @param idContrato
	 */
	public void borrarContratoElemento(final BigDecimal idContrato) {
		this.jdbcCall = new SimpleJdbcCall(dataSource).withCatalogName(
				M62_PACKAGE_REGVPP).withProcedureName(
				M62BORRAR_CONTR_ALQ_ELEM_VPP);
		Map<String, Object> inParamMap = new HashMap<String, Object>();
		inParamMap.put("P_ID_CONTRATO_ALQ", idContrato);
		SqlParameterSource in = new MapSqlParameterSource(inParamMap);
		jdbcCall.execute(in);
		logger.info(M62BORRAR_CONTR_ALQ_ELEM_VPP
				+ " -> borrar contrato compra idContrato:"
				+ idContrato.toString());
	}

	/**
	 * <p>
	 * Proceso que elimina un inquilino de un contrato de alquiler de un anejo.
	 * </p>
	 * 
	 * @param idInquilino
	 */
	public void borrarInquilinoContratoElemento(final BigDecimal idInquilino) {
		this.jdbcCall = new SimpleJdbcCall(dataSource).withCatalogName(
				M62_PACKAGE_REGVPP).withProcedureName(M62BORRAR_INQ_ELEM_VPP);
		Map<String, Object> inParamMap = new HashMap<String, Object>();
		inParamMap.put("P_ID_INQUILINO", idInquilino);
		SqlParameterSource in = new MapSqlParameterSource(inParamMap);
		jdbcCall.execute(in);
		logger.info(M62BORRAR_INQ_ELEM_VPP
				+ " -> borrar inquilino contrato elemento idInquilino:"
				+ idInquilino.toString());
	}

	/**
	 * <p>
	 * Proceso que elimina un alojamiento dotacional del registro VPP
	 * </p>
	 * 
	 * @param idAlojDotac
	 */
	public void borrarAlojDotacional(final Integer idAlojDotac) {
		this.jdbcCall = new SimpleJdbcCall(dataSource).withCatalogName(
				M62_PACKAGE_REGVPP).withProcedureName(M62BORRAR_ALOJ_DOT_VPP);
		Map<String, Object> inParamMap = new HashMap<String, Object>();
		inParamMap.put("P_ID_ALOJ_REG", idAlojDotac);
		SqlParameterSource in = new MapSqlParameterSource(inParamMap);
		jdbcCall.execute(in);
		logger.info(M62BORRAR_ALOJ_DOT_VPP
				+ " -> borrar aloj dotac idAlojDotac:" + idAlojDotac.toString());
	}

	/**
	 * <p>
	 * Proceso que elimina un contrato de alquiler asociado a un alojamiento
	 * dotacional
	 * </p>
	 * 
	 * @param idContrato
	 */
	public void borrarContratoAlojDotacional(final BigDecimal idContrato) {
		this.jdbcCall = new SimpleJdbcCall(dataSource).withCatalogName(
				M62_PACKAGE_REGVPP).withProcedureName(
				M62BORRAR_CONTR_ALQ_AD_VPP);
		Map<String, Object> inParamMap = new HashMap<String, Object>();
		inParamMap.put("P_ID_CONTRATO_ALQ", idContrato);
		SqlParameterSource in = new MapSqlParameterSource(inParamMap);
		jdbcCall.execute(in);
		logger.info(M62BORRAR_CONTR_ALQ_AD_VPP
				+ " -> borrar contrato alquiler aloj dotac idContrato:"
				+ idContrato.toString());
	}

	/**
	 * <p>
	 * Proceso que elimina un inquilino de un contrato de alquiler asociado a un
	 * alojamiento dotacional
	 * </p>
	 * 
	 * @param idContrato
	 * @param idPersona
	 */
	public void borrarInquilinoContratoAlojDotacional(final Integer idInquilino) {
		this.jdbcCall =  new SimpleJdbcCall(dataSource).withCatalogName(M62_PACKAGE_REGVPP).withProcedureName(M62BORRAR_INQUILINO_AD_VPP);
		Map<String, Object> inParamMap = new HashMap<String, Object>();
		inParamMap.put("P_ID_INQUILINO", idInquilino);
		SqlParameterSource in = new MapSqlParameterSource(inParamMap);
		jdbcCall.execute(in);
		logger.info(M62BORRAR_INQUILINO_AD_VPP +" -> borrar inquilino contrato alquiler aloj dotac idInquilino:" + idInquilino.toString() );
	}

	/**
	 * <p>
	 * Proceso que elimina un titular de la tabla de personas
	 * </p>
	 * 
	 * @param idPersona
	 * @return
	 */
	public PlSqlOutputError borrarPersona(final BigDecimal idPersona) {
		this.jdbcCall = new SimpleJdbcCall(dataSource).withCatalogName(
				M62_PACKAGE_REGVPP).withProcedureName(M62BORRAR_TIT_P20);
		Map<String, Object> inParamMap = new HashMap<String, Object>();
		inParamMap.put("P_ID_PERSONA", idPersona);
		inParamMap.put("P_IDIOMA", AppConstantes.ES_LOCALE
				.equals(LocaleContextHolder.getLocale()) ? AppConstantes.ES
				: AppConstantes.EU);
		SqlParameterSource in = new MapSqlParameterSource(inParamMap);
		Map<String, Object> out = jdbcCall.execute(in);
		PlSqlOutputError outputError = new PlSqlOutputError();
		outputError.setCodError((BigDecimal) out.get("P_COD_ERROR"));
		outputError.setTextError((String) out.get("P_TEXT_ERROR"));
		logger.info(M62BORRAR_TIT_P20 + " -> borrarPersona idPersona: "
				+ idPersona.toString() + " Resultado:"
				+ outputError.getCodError().toString() + "-"
				+ outputError.getTextError());
		return outputError;
	}

	/**
	 * <p>
	 * Proceso que elimina una vivienda reservada
	 * </p>
	 * 
	 * @param idM62R43T0
	 */
	public void borrarViviendaReservada(final BigDecimal idM62R43T0) {
		this.jdbcCall = new SimpleJdbcCall(dataSource).withCatalogName(
				M62_PACKAGE_REGVPP).withProcedureName(M62_BORRAR_VIV_RESERVA);
		Map<String, Object> inParamMap = new HashMap<String, Object>();
		inParamMap.put("P_ID_M62R43T0", idM62R43T0);
		SqlParameterSource in = new MapSqlParameterSource(inParamMap);
		jdbcCall.execute(in);
		logger.info(M62_BORRAR_VIV_RESERVA
				+ " -> borrar vivienda reservada idM62R43T0:"
				+ idM62R43T0.toString());
	}

	/**
	 * <p>
	 * Proceso que elimina una vivienda reservada
	 * </p>
	 * 
	 * @param idM62R43T0
	 */
	public void borrarAcuerdoReserva(final Integer idM62R41T0) {
		this.jdbcCall = new SimpleJdbcCall(dataSource).withCatalogName(
				M62_PACKAGE_REGVPP).withProcedureName(M62_BORRAR_ACUERDO);
		Map<String, Object> inParamMap = new HashMap<String, Object>();
		inParamMap.put("P_ID_M62R41T0", idM62R41T0);
		SqlParameterSource in = new MapSqlParameterSource(inParamMap);
		jdbcCall.execute(in);
		logger.info(M62_BORRAR_ACUERDO
				+ " -> borrar acuerdo vivienda idM62R41T0:"
				+ idM62R41T0.toString());
	}
}
