package com.ejie.m62fb.service.registroVPP;

import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Locale;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
import org.springframework.stereotype.Service;

import com.ejie.m62fb.utils.format.FormatUtils;
import com.ejie.m62fb.dao.PersonaDao;
import com.ejie.m62fb.dao.registroVPP.CargaFicherosDao;
import com.ejie.m62fb.dao.registroVPP.ContratoAlquilerDao;
import com.ejie.m62fb.dao.registroVPP.ContratoViviendaDao;
import com.ejie.m62fb.dao.registroVPP.ElementosDao;
import com.ejie.m62fb.dao.registroVPP.ExpedienteViviendaDao;
import com.ejie.m62fb.dao.registroVPP.InquilinoDao;
import com.ejie.m62fb.dao.registroVPP.PropietarioDao;
import com.ejie.m62fb.dao.registroVPP.ViviendaDao;
import com.ejie.m62fb.model.ContratoVivienda;
import com.ejie.m62fb.model.Elemento;
import com.ejie.m62fb.model.ExpedienteVivienda;
import com.ejie.m62fb.model.Inquilino;
import com.ejie.m62fb.model.Propietario;
import com.ejie.m62fb.model.Vivienda;
import com.ejie.m62fb.model.direccion.Direccion;
import com.ejie.m62fb.model.importar.Feedback;
import com.ejie.m62fb.model.importar.FeedbackAviso;
import com.ejie.m62fb.model.importar.FeedbackError;
import com.ejie.m62fb.model.jaxb.comunicacionVPPAyto.ComunicacionVPPAyuntamientos;
import com.ejie.m62fb.model.jaxb.comunicacionVPPAyto.ComunicacionVPPAyuntamientos.ContratosAlquiler.ContratoAlquiler;
import com.ejie.m62fb.model.jaxb.comunicacionVPPAyto.ComunicacionVPPAyuntamientos.ContratosCompraVenta.ContratoCompraVenta;
import com.ejie.m62fb.model.jaxb.comunicacionVPPAyto.ComunicacionVPPAyuntamientos.ContratosCompraVenta.ContratoCompraVenta.Titular;
import com.ejie.m62fb.model.jaxb.comunicacionVPPAyto.ComunicacionVPPAyuntamientos.Viviendas;
import com.ejie.m62fb.model.persona.Persona;
import com.ejie.m62fb.model.tipos.RegimenAcceso;
import com.ejie.m62fb.model.tipos.RegimenTenencia;
import com.ejie.m62fb.model.tipos.TipoAdjudicacion;
import com.ejie.m62fb.model.tipos.TipoClave;
import com.ejie.m62fb.model.tipos.TipoComoAdjudicacion;
import com.ejie.m62fb.model.tipos.TipoElemento;
import com.ejie.m62fb.model.tipos.TipoIniciativa;
import com.ejie.m62fb.model.tipos.TipoQuienAdjudicacion;
import com.ejie.m62fb.model.tipos.TipoRegulacion;
import com.ejie.m62fb.model.tipos.TipoSiNo;
import com.ejie.m62fb.model.tipos.TipoTransmision;
import com.ejie.m62fb.model.tipos.TipoVinculacion;
import com.ejie.m62fb.util.ValidadorNIF;
import com.ejie.m62fb.utils.constants.AppConstantes;
import com.ejie.m62fb.utils.constants.BDConstantes;
import com.ejie.m62fb.utils.sql.BDUtils;
import com.ejie.t17i.dao.CalleDao;
import com.ejie.t17i.model.Calle;
import com.ejie.t17i.model.Municipio;
import com.ejie.t17i.model.Planta;
import com.ejie.t17i.model.Portal;
import com.ejie.t17i.model.Provincia;
import com.ejie.x38.util.DateTimeManager;

/**
 * CargaFicheroSolicCalifProvDefServiceImpl.
 * 
XXXX
 */
@Service(value = "cargaFicheroComunicacionVPPAytoService")
public class CargaFicheroComunicacionVPPAytoServiceImpl implements CargaFicheroComunicacionVPPAytoService {
	@Autowired
	private CargaFicherosService cargaFicherosService;
	@Autowired
	private CargaFicherosDao cargaFicherosDao;
	@Autowired
	private ExpedienteViviendaDao expedienteViviendaDao;
	@Autowired
	private ViviendaDao viviendaDao;
	@Autowired
	private PersonaDao personaDao;
	@Autowired
	private ContratoViviendaDao contratoViviendaDao;
	@Autowired
	private ContratoAlquilerDao contratoAlquilerDao;
	@Autowired 
	private PropietarioDao propietarioDao;
	@Autowired 
	private InquilinoDao inquilinoDao;
	@Autowired 
	private ElementosDao elementosDao;
	@Autowired 
	private CalleDao calleDao;
	
	@Autowired
	ReloadableResourceBundleMessageSource  messageSource;
	//1-CARGA FICHERO SOLICITUD DE CALIF PROVIS DEFINITIVA
	public List<Feedback> cargarFicheroComunicacionVPPAyto(ComunicacionVPPAyuntamientos comunicacionVPPAyuntamientos,
			String numExpediente, Date fechaEntrada) throws ParseException {
		List<Feedback> listaErroresAvisos = validarComunicacionVPPAyto(comunicacionVPPAyuntamientos,numExpediente);
		if (listaErroresAvisos.size()==0){
			insertarDatosComunicacionVPPAyto(comunicacionVPPAyuntamientos,numExpediente,fechaEntrada);
		}
		return listaErroresAvisos;
	}
	//1.0-VALIDAR DATOS DE HOJA VPP
	private void validarDatosVPP(List<Feedback> listaErroresAvisos,ComunicacionVPPAyuntamientos comunicacionVPPAyuntamientos,
			String numExpediente,Locale locale){
		//VALIDAR CIF DATOS DEL PROMOTOR
		String cif=comunicacionVPPAyuntamientos.getVPP().getPromotor().getCIF();
		if(!cif.trim().isEmpty() && (ValidadorNIF.getTipoNIF(cif)!=TipoClave.CIF || !ValidadorNIF.checkNif(cif))){
			FeedbackError error = new FeedbackError();
			error.setHoja(AppConstantes.NOM_HOJA_VPP);
			error.setDato(cif);
			error.setElemento(messageSource.getMessage("error.importar.xls.promotor", null, locale));
			error.setDescripcion(messageSource.getMessage("error.importar.xls.promotor.cif.no.valid", new Object[] {cif}, locale));
			listaErroresAvisos.add(error);
		}
		//VALIDAR DATOS DE LA PROMOCION
		//Territorio
		if(comunicacionVPPAyuntamientos.getVPP().getPromotor().getTerritorio().isEmpty()){
			//OBLIGATORIA
			FeedbackError error = new FeedbackError();
			error.setHoja(AppConstantes.NOM_HOJA_VPP);
			error.setElemento(messageSource.getMessage("error.importar.xls.promocion.territorio", null, locale));
			error.setDescripcion(messageSource.getMessage("error.importar.xls.promocion.territorio.obligatorio", null, locale));
			listaErroresAvisos.add(error);
		}
		boolean territorioErroneo=false;
		switch (Integer.parseInt(comunicacionVPPAyuntamientos.getVPP().getPromotor().getTerritorio())) {
		case 1:
			if(!numExpediente.substring(2, 3).equalsIgnoreCase("1")){
				territorioErroneo=true;
				
			}
			break;
		case 20:
			if(!numExpediente.substring(2, 3).equalsIgnoreCase("3")){
				territorioErroneo=true;
			}
			break;
		case 48:
			if(!numExpediente.substring(2, 3).equalsIgnoreCase("2")){
				territorioErroneo=true;
			}
			break;
		default:
			territorioErroneo=true;
			break;
		}
		if(territorioErroneo){
			listaErroresAvisos.add(cargaFicherosService.generarError(AppConstantes.NOM_HOJA_VPP,
					"error.importar.xls.promocion.territorio","error.importar.xls.promocion.territorio.no.valid",locale));
		}
		//Municipio
		if(comunicacionVPPAyuntamientos.getVPP().getPromotor().getMunicipio().isEmpty()){
			listaErroresAvisos.add(cargaFicherosService.generarErrorObligatorio(AppConstantes.NOM_HOJA_VPP,
					"error.importar.xls.promocion.municipio",locale));
		}
		//CP
		if(comunicacionVPPAyuntamientos.getVPP().getPromotor().getMunicipio().isEmpty()){
			listaErroresAvisos.add(cargaFicherosService.generarErrorObligatorio(AppConstantes.NOM_HOJA_VPP,
					"error.importar.xls.promocion.cp",locale));
		}
		//Régimen de acceso y uso
		if(comunicacionVPPAyuntamientos.getVPP().getPromocion().getRegAcceso().isEmpty()){
			listaErroresAvisos.add(cargaFicherosService.generarErrorObligatorio(AppConstantes.NOM_HOJA_VPP,
					"error.importar.xls.promocion.regacceso",locale));
		}
		if (comunicacionVPPAyuntamientos.getVPP().getPromocion().getRegAcceso().length()>AppConstantes.SIZE_INDICADOR){
			listaErroresAvisos.add(cargaFicherosService.generarAvisoTXTSize(
					AppConstantes.NOM_HOJA_VPP
					,"error.importar.xls.promocion.regacceso",null,
					comunicacionVPPAyuntamientos.getVPP().getPromocion().getRegAcceso(),
					AppConstantes.SIZE_INDICADOR, locale));
		}
		//Régimen de Tenencia
		if(comunicacionVPPAyuntamientos.getVPP().getPromocion().getRegTenencia().isEmpty()){
			listaErroresAvisos.add(cargaFicherosService.generarErrorObligatorio(AppConstantes.NOM_HOJA_VPP,
					"error.importar.xls.promocion.regtenencia",locale));
		}
		if (comunicacionVPPAyuntamientos.getVPP().getPromocion().getRegTenencia().length()>AppConstantes.SIZE_INDICADOR){
			listaErroresAvisos.add(cargaFicherosService.generarAvisoTXTSize(
					AppConstantes.NOM_HOJA_VPP
					,"error.importar.xls.promocion.regtenencia",null,
					comunicacionVPPAyuntamientos.getVPP().getPromocion().getRegTenencia(),
					AppConstantes.SIZE_INDICADOR, locale));
		}
		//Tipo de procedimiento de adjudicación
		if (comunicacionVPPAyuntamientos.getVPP().getPromocion().getTipoProcedimientoAdjudicacion().length()>AppConstantes.SIZE_TIPO_PROD_ADJ){
			listaErroresAvisos.add(cargaFicherosService.generarAvisoTXTSize(
					AppConstantes.NOM_HOJA_VPP
					,"error.importar.xls.promocion.tipoprocadj",null,
					comunicacionVPPAyuntamientos.getVPP().getPromocion().getTipoProcedimientoAdjudicacion(),
					AppConstantes.SIZE_TIPO_PROD_ADJ, locale));
		}
	}
	
	//1.1 VALIDAR VIVIENDAS
	private void validarDatosRelViviendas(List<Feedback> listaErroresAvisos,ComunicacionVPPAyuntamientos comunicacionVPPAyuntamientos,
			String numExpediente,Locale locale,List <com.ejie.m62fb.model.jaxb.comunicacionVPPAyto.ComunicacionVPPAyuntamientos.Viviendas.Vivienda> 
	viviendasLeidas){
		for (com.ejie.m62fb.model.jaxb.comunicacionVPPAyto.ComunicacionVPPAyuntamientos.Viviendas.Vivienda 
				vivienda : comunicacionVPPAyuntamientos.getViviendas().getVivienda()) {
			//si está informada la vivienda
			if (!vivienda.getCalle().isEmpty()||
					!vivienda.getBanos().isEmpty()||
					!vivienda.getDormitorios().isEmpty()||
					!vivienda.getMano().isEmpty()||
					!vivienda.getPlanta().isEmpty()||
					!vivienda.getPortal().isEmpty()){
				//Calle
				if(vivienda.getCalle().isEmpty()){
					listaErroresAvisos.add(cargaFicherosService.generarErrorObligatorioViv(AppConstantes.NOM_HOJA_REL_VIVIENDAS,
							"error.importar.xls.direccion.calle",new Object[] {vivienda.getNumVivienda()},
							"error.importar.xls.vivienda.dato.obligatorio",
							new Object[] {vivienda.getNumVivienda()},locale));
				}
				if (vivienda.getCalle().length()>AppConstantes.SIZE_CALLE){
					listaErroresAvisos.add(cargaFicherosService.generarAvisoTXTSize(
							AppConstantes.NOM_HOJA_REL_VIVIENDAS
							,"error.importar.xls.direccion.calle",new Object[] {vivienda.getNumVivienda()},
							vivienda.getCalle(),
							AppConstantes.SIZE_CALLE, locale));
				}
				//Portal
				if(vivienda.getPortal().isEmpty()){
					listaErroresAvisos.add(cargaFicherosService.generarErrorObligatorioViv(AppConstantes.NOM_HOJA_REL_VIVIENDAS,
							"error.importar.xls.direccion.portal",new Object[] {vivienda.getNumVivienda()},
							"error.importar.xls.vivienda.dato.obligatorio",
							new Object[] {vivienda.getNumVivienda()},locale));
				}
				if (vivienda.getPortal().length()>AppConstantes.SIZE_PORTAL){
					listaErroresAvisos.add(cargaFicherosService.generarAvisoTXTSize(
							AppConstantes.NOM_HOJA_REL_VIVIENDAS
							,"error.importar.xls.direccion.portal",new Object[] {vivienda.getNumVivienda()},
							vivienda.getPortal(),
							AppConstantes.SIZE_PORTAL, locale));
				}
				//Planta
				if(vivienda.getPlanta().isEmpty()){
					listaErroresAvisos.add(cargaFicherosService.generarErrorObligatorioViv(AppConstantes.NOM_HOJA_REL_VIVIENDAS,
							"error.importar.xls.direccion.planta",new Object[] {vivienda.getNumVivienda()},
							"error.importar.xls.vivienda.dato.obligatorio",
							new Object[] {vivienda.getNumVivienda()},locale));
				}
				if (vivienda.getPlanta().length()>AppConstantes.SIZE_PLANTA){
					listaErroresAvisos.add(cargaFicherosService.generarAvisoTXTSize(
							AppConstantes.NOM_HOJA_REL_VIVIENDAS
							,"error.importar.xls.direccion.planta",new Object[] {vivienda.getNumVivienda()},
							vivienda.getPlanta(),
							AppConstantes.SIZE_PLANTA, locale));
				}
				//Mano
				if(vivienda.getMano().isEmpty()){
					listaErroresAvisos.add(cargaFicherosService.generarErrorObligatorioViv(AppConstantes.NOM_HOJA_REL_VIVIENDAS,
							"error.importar.xls.direccion.mano",new Object[] {vivienda.getNumVivienda()},
							"error.importar.xls.vivienda.dato.obligatorio",
							new Object[] {vivienda.getNumVivienda()},locale));
				}
				if (vivienda.getMano().length()>AppConstantes.SIZE_MANO){
					listaErroresAvisos.add(cargaFicherosService.generarAvisoTXTSize(
							AppConstantes.NOM_HOJA_REL_VIVIENDAS
							,"error.importar.xls.direccion.mano",new Object[] {vivienda.getNumVivienda()},
							vivienda.getMano(),
							AppConstantes.SIZE_MANO, locale));
				}
				//Num Dormitorios
				if (vivienda.getDormitorios().length()>AppConstantes.SIZE_NUM_DORMITORIOS){
					listaErroresAvisos.add(cargaFicherosService.generarAvisoTXTSize(
							AppConstantes.NOM_HOJA_REL_VIVIENDAS
							,"error.importar.xls.vivienda.numdormitorios",new Object[] {vivienda.getNumVivienda()},
							vivienda.getDormitorios(),
							AppConstantes.SIZE_NUM_DORMITORIOS, locale));
				}
				//Num Baños
				if (vivienda.getBanos().length()>AppConstantes.SIZE_NUM_BANOS){
					listaErroresAvisos.add(cargaFicherosService.generarAvisoTXTSize(
							AppConstantes.NOM_HOJA_REL_VIVIENDAS
							,"error.importar.xls.vivienda.banos",new Object[] {vivienda.getNumVivienda()},
							vivienda.getBanos(),
							AppConstantes.SIZE_NUM_BANOS, locale));
				}
				//Sup Util
				if(vivienda.getSupUtil().isEmpty()){
					listaErroresAvisos.add(cargaFicherosService.generarErrorObligatorioViv(AppConstantes.NOM_HOJA_REL_VIVIENDAS,
							"error.importar.xls.vivienda.suputil",new Object[] {vivienda.getNumVivienda()},
							"error.importar.xls.vivienda.dato.obligatorio",
							new Object[] {vivienda.getNumVivienda()},locale));
				}else{
					try{
						FormatUtils.convertirADecimal(cargaFicherosService.getTXTWithSizeOk(vivienda.getSupUtil(),AppConstantes.SIZE_SUP_UTIL));
					}catch (Exception e){
						listaErroresAvisos.add(cargaFicherosService.generarError(AppConstantes.NOM_HOJA_REL_VIVIENDAS,
								"error.importar.xls.vivienda.suputil",vivienda.getSupUtil(),new Object[] {vivienda.getNumVivienda()},
								null,"error.importar.fomato.incorrecto",locale));
					}
					
				}
				if (vivienda.getSupUtil().length()>AppConstantes.SIZE_SUP_UTIL){
					listaErroresAvisos.add(cargaFicherosService.generarAvisoTXTSize(
							AppConstantes.NOM_HOJA_REL_VIVIENDAS
							,"error.importar.xls.vivienda.suputil",new Object[] {vivienda.getNumVivienda()},
							vivienda.getSupUtil(),
							AppConstantes.SIZE_SUP_UTIL, locale));
				}
//				
				if (!vivienda.getCalle().isEmpty()){
					//validar que exista la calle
					Direccion direccion = new Direccion();
					direccion.setProvincia(new Provincia(comunicacionVPPAyuntamientos.getVPP().getPromocion().getTerritorio()));
					direccion.setMunicipio(new Municipio(comunicacionVPPAyuntamientos.getVPP().getPromocion().getMunicipio(), direccion.getProvincia()));
					Calle calleSearch=  new Calle();
					calleSearch.setMunicipio(direccion.getMunicipio());
					calleSearch.setNombreEs(vivienda.getCalle());
					calleSearch.setNombreEu(vivienda.getCalle());
					List<Calle> listaCalles = calleDao.findAll(calleSearch,null);
					if(listaCalles.size()==0){
						FeedbackAviso aviso = new FeedbackAviso();
						aviso.setHoja(AppConstantes.NOM_HOJA_REL_VIVIENDAS);
						aviso.setElemento(messageSource.getMessage("error.importar.xls.direccion.calle",new Object[] {vivienda.getNumVivienda()},locale));
						aviso.setDato(vivienda.getCalle()) ;
						aviso.setDescripcion(messageSource.getMessage("error.importar.xls.direccion.calle.noexiste",
								new Object[] {vivienda.getCalle()}, locale));
						listaErroresAvisos.add(aviso);
					}else if (listaCalles.size()>1){
						FeedbackAviso aviso = new FeedbackAviso();
						aviso.setHoja(AppConstantes.NOM_HOJA_REL_VIVIENDAS);
						aviso.setElemento(messageSource.getMessage("error.importar.xls.vivienda",null, locale)+ "-"+vivienda.getNumVivienda());
						aviso.setDato(vivienda.getCalle()) ;
						aviso.setDescripcion(messageSource.getMessage("error.importar.xls.direccion.calle.muchas",
								new Object[] {vivienda.getCalle()}, locale));
						listaErroresAvisos.add(aviso);
					}
	//				validar que no haya 2 viviendas en el mismo emplazamiento(bloque, portal, planta, mano) en la hoja Excel. 
					//En este caso daremos el siguiente mensaje de error:
	//					' Las viviendas XX y ZZ tienen el mismo emplazamiento'
					for (com.ejie.m62fb.model.jaxb.comunicacionVPPAyto.ComunicacionVPPAyuntamientos.Viviendas.Vivienda viviendaleida : viviendasLeidas) {
						if (vivienda.getCalle().equalsIgnoreCase(viviendaleida.getCalle())&&
								vivienda.getPortal().equalsIgnoreCase(viviendaleida.getPortal())&&
								vivienda.getPlanta().equalsIgnoreCase(viviendaleida.getPlanta())&&
								vivienda.getMano().equalsIgnoreCase(viviendaleida.getMano())){
							FeedbackError error = new FeedbackError();
							error.setHoja(AppConstantes.NOM_HOJA_REL_VIVIENDAS);
							error.setElemento(messageSource.getMessage("error.importar.xls.vivienda",null, locale)+ "-"+vivienda.getNumVivienda());
							error.setDato(vivienda.getCalle() + " " + vivienda.getPortal() + " " + vivienda.getPlanta() + " " + vivienda.getMano()) ;
							error.setDescripcion(messageSource.getMessage("error.importar.xls.direccion.error.duplicada",
									new Object[] {viviendaleida.getNumVivienda(),vivienda.getNumVivienda()}, locale));
							listaErroresAvisos.add(error);
						}
	
					}
						viviendasLeidas.add(vivienda);
				}
				//garaje
				if(!vivienda.getGaraje().getNumero().isEmpty()){
					if (vivienda.getGaraje().getNumero().length()>AppConstantes.SIZE_COD_ELEMENTO){
						listaErroresAvisos.add(cargaFicherosService.generarAvisoTXTSize(
								AppConstantes.NOM_HOJA_REL_VIVIENDAS
								,"error.importar.xls.garaje.codElemento",new Object[] {vivienda.getNumVivienda()},
								vivienda.getGaraje().getNumero(),
								AppConstantes.SIZE_COD_ELEMENTO, locale));
					}
					if (vivienda.getGaraje().getCalle().length()>AppConstantes.SIZE_CALLE){
						listaErroresAvisos.add(cargaFicherosService.generarAvisoTXTSize(
								AppConstantes.NOM_HOJA_REL_VIVIENDAS
								,"error.importar.xls.garaje.direccion.calle",new Object[] {vivienda.getNumVivienda()},
								vivienda.getGaraje().getCalle(),
								AppConstantes.SIZE_CALLE, locale));
					}
					if (vivienda.getGaraje().getPortal().length()>AppConstantes.SIZE_PORTAL){
						listaErroresAvisos.add(cargaFicherosService.generarAvisoTXTSize(
								AppConstantes.NOM_HOJA_REL_VIVIENDAS
								,"error.importar.xls.garaje.direccion.portal",new Object[] {vivienda.getNumVivienda()},
								vivienda.getGaraje().getPortal(),
								AppConstantes.SIZE_PORTAL, locale));
					}
					if(vivienda.getGaraje().getSituacion().isEmpty()){
						listaErroresAvisos.add(cargaFicherosService.generarErrorObligatorioViv(
								AppConstantes.NOM_HOJA_REL_VIVIENDAS,
								"error.importar.xls.garaje.direccion.situacion",new Object[] {vivienda.getNumVivienda()},
								"error.importar.xls.generico.obligatorio",
								new Object[] {vivienda.getNumVivienda()},locale));
					}
					
					if (vivienda.getGaraje().getSituacion().length()>AppConstantes.SIZE_PLANTA){
						listaErroresAvisos.add(cargaFicherosService.generarAvisoTXTSize(
								AppConstantes.NOM_HOJA_REL_VIVIENDAS
								,"error.importar.xls.garaje.direccion.situacion",new Object[] {vivienda.getNumVivienda()},
								vivienda.getGaraje().getSituacion(),
								AppConstantes.SIZE_PLANTA, locale));
					}
					//Sup Util
					if(vivienda.getGaraje().getSupUtil().isEmpty()){
						listaErroresAvisos.add(cargaFicherosService.generarErrorObligatorioViv(
								AppConstantes.NOM_HOJA_REL_VIVIENDAS,
								"error.importar.xls.garaje.suputil",new Object[] {vivienda.getNumVivienda()},
								"error.importar.xls.generico.obligatorio",
								new Object[] {vivienda.getNumVivienda()},locale));
					}else{
						try{
							FormatUtils.convertirADecimal(cargaFicherosService.getTXTWithSizeOk(vivienda.getGaraje().getSupUtil(),AppConstantes.SIZE_SUP_UTIL));
						}catch (Exception e){
							listaErroresAvisos.add(cargaFicherosService.generarError(AppConstantes.NOM_HOJA_REL_VIVIENDAS,
									"error.importar.xls.garaje.suputil",vivienda.getGaraje().getSupUtil(),new Object[] {vivienda.getNumVivienda()},
									null,"error.importar.fomato.incorrecto",locale));
						}
						if (vivienda.getGaraje().getSupUtil().length()>AppConstantes.SIZE_SUP_UTIL){
							listaErroresAvisos.add(cargaFicherosService.generarAvisoTXTSize(
									AppConstantes.NOM_HOJA_REL_VIVIENDAS
									,"error.importar.xls.garaje.suputil",new Object[] {vivienda.getNumVivienda()},
									vivienda.getGaraje().getSupUtil(),
									AppConstantes.SIZE_SUP_UTIL, locale));
						}
					}
					
					if (!vivienda.getGaraje().getCalle().isEmpty()){
						//validar que exista la calle
						Direccion direccion = new Direccion();
						direccion.setProvincia(new Provincia(comunicacionVPPAyuntamientos.getVPP().getPromocion().getTerritorio()));
						direccion.setMunicipio(new Municipio(comunicacionVPPAyuntamientos.getVPP().getPromocion().getMunicipio(), direccion.getProvincia()));
						Calle calleSearch=  new Calle();
						calleSearch.setMunicipio(direccion.getMunicipio());
						calleSearch.setNombreEs(vivienda.getGaraje().getCalle());
						calleSearch.setNombreEu(vivienda.getGaraje().getCalle());
						List<Calle> listaCalles = calleDao.findAll(calleSearch,null);
						if(listaCalles.size()==0){
							FeedbackAviso aviso = new FeedbackAviso();
							aviso.setHoja(AppConstantes.NOM_HOJA_REL_VIVIENDAS);
							aviso.setElemento(messageSource.getMessage("error.importar.xls.garaje.direccion.calle",new Object[] {vivienda.getNumVivienda()},locale));
							aviso.setDato(vivienda.getGaraje().getCalle()) ;
							aviso.setDescripcion(messageSource.getMessage("error.importar.xls.direccion.calle.noexiste",
									new Object[] {vivienda.getGaraje().getCalle()}, locale));
							listaErroresAvisos.add(aviso);
						}else if (listaCalles.size()>1){
							FeedbackAviso aviso = new FeedbackAviso();
							aviso.setHoja(AppConstantes.NOM_HOJA_REL_VIVIENDAS);
							aviso.setElemento(messageSource.getMessage("error.importar.xls.garaje.direccion.calle",new Object[] {vivienda.getNumVivienda()},locale));
							aviso.setDato(vivienda.getGaraje().getCalle()) ;
							aviso.setDescripcion(messageSource.getMessage("error.importar.xls.direccion.calle.muchas",
									new Object[] {vivienda.getGaraje().getCalle()}, locale));
							listaErroresAvisos.add(aviso);
						}
					}
				}
				//trastero
				if(!vivienda.getTrastero().getNumero().isEmpty()){
					if (vivienda.getTrastero().getNumero().length()>AppConstantes.SIZE_COD_ELEMENTO){
						listaErroresAvisos.add(cargaFicherosService.generarAvisoTXTSize(
								AppConstantes.NOM_HOJA_REL_VIVIENDAS
								,"error.importar.xls.trastero.codElemento",new Object[] {vivienda.getNumVivienda()},
								vivienda.getTrastero().getNumero(),
								AppConstantes.SIZE_COD_ELEMENTO, locale));
					}
					if (vivienda.getTrastero().getCalle().length()>AppConstantes.SIZE_CALLE){
						listaErroresAvisos.add(cargaFicherosService.generarAvisoTXTSize(
								AppConstantes.NOM_HOJA_REL_VIVIENDAS
								,"error.importar.xls.trastero.direccion.calle",new Object[] {vivienda.getNumVivienda()},
								vivienda.getTrastero().getCalle(),
								AppConstantes.SIZE_CALLE, locale));
					}
					if (vivienda.getTrastero().getPortal().length()>AppConstantes.SIZE_PORTAL){
						listaErroresAvisos.add(cargaFicherosService.generarAvisoTXTSize(
								AppConstantes.NOM_HOJA_REL_VIVIENDAS
								,"error.importar.xls.trastero.direccion.portal",new Object[] {vivienda.getNumVivienda()},
								vivienda.getTrastero().getPortal(),
								AppConstantes.SIZE_PORTAL, locale));
					}
					if(vivienda.getTrastero().getSituacion().isEmpty()){
						listaErroresAvisos.add(cargaFicherosService.generarErrorObligatorioViv(
								AppConstantes.NOM_HOJA_REL_VIVIENDAS,
								"error.importar.xls.trastero.direccion.situacion",new Object[] {vivienda.getNumVivienda()},
								"error.importar.xls.generico.obligatorio",
								new Object[] {vivienda.getNumVivienda()},locale));
					}
					if (vivienda.getTrastero().getSituacion().length()>AppConstantes.SIZE_PLANTA){
						listaErroresAvisos.add(cargaFicherosService.generarAvisoTXTSize(
								AppConstantes.NOM_HOJA_REL_VIVIENDAS
								,"error.importar.xls.trastero.direccion.situacion",new Object[] {vivienda.getNumVivienda()},
								vivienda.getTrastero().getSituacion(),
								AppConstantes.SIZE_PLANTA, locale));
					}
					//Sup Util
					if(vivienda.getTrastero().getSupUtil().isEmpty()){
						listaErroresAvisos.add(cargaFicherosService.generarErrorObligatorioViv(AppConstantes.NOM_HOJA_REL_VIVIENDAS,
								"error.importar.xls.trastero.suputil",new Object[] {vivienda.getNumVivienda()},
								"error.importar.xls.generico.obligatorio",
								new Object[] {vivienda.getNumVivienda()},locale));
					}else{
						try{
							FormatUtils.convertirADecimal(cargaFicherosService.getTXTWithSizeOk(vivienda.getTrastero().getSupUtil(),AppConstantes.SIZE_SUP_UTIL));
						}catch (Exception e){
							listaErroresAvisos.add(cargaFicherosService.generarError(AppConstantes.NOM_HOJA_REL_VIVIENDAS,
									"error.importar.xls.trastero.suputil",vivienda.getTrastero().getSupUtil(),new Object[] {vivienda.getNumVivienda()},
									null,"error.importar.fomato.incorrecto",locale));
						}
						if (vivienda.getTrastero().getSupUtil().length()>AppConstantes.SIZE_SUP_UTIL){
							
							listaErroresAvisos.add(cargaFicherosService.generarAvisoTXTSize(
									AppConstantes.NOM_HOJA_REL_VIVIENDAS
									,"error.importar.xls.trastero.suputil",new Object[] {vivienda.getNumVivienda()},
									vivienda.getTrastero().getSupUtil(),
									AppConstantes.SIZE_SUP_UTIL, locale));
						}
					}
					if (!vivienda.getTrastero().getCalle().isEmpty()){
						//validar que exista la calle
						Direccion direccion = new Direccion();
						direccion.setProvincia(new Provincia(comunicacionVPPAyuntamientos.getVPP().getPromocion().getTerritorio()));
						direccion.setMunicipio(new Municipio(comunicacionVPPAyuntamientos.getVPP().getPromocion().getMunicipio(), direccion.getProvincia()));
						Calle calleSearch=  new Calle();
						calleSearch.setMunicipio(direccion.getMunicipio());
						calleSearch.setNombreEs(vivienda.getTrastero().getCalle());
						calleSearch.setNombreEu(vivienda.getTrastero().getCalle());
						List<Calle> listaCalles = calleDao.findAll(calleSearch,null);
						if(listaCalles.size()==0){
							FeedbackAviso aviso = new FeedbackAviso();
							aviso.setHoja(AppConstantes.NOM_HOJA_REL_VIVIENDAS);
							aviso.setElemento(messageSource.getMessage("error.importar.xls.trastero.direccion.calle",new Object[] {vivienda.getNumVivienda()},locale));
							aviso.setDato(vivienda.getTrastero().getCalle()) ;
							aviso.setDescripcion(messageSource.getMessage("error.importar.xls.direccion.calle.noexiste",
									new Object[] {vivienda.getTrastero().getCalle()}, locale));
							listaErroresAvisos.add(aviso);
						}else if (listaCalles.size()>1){
							FeedbackAviso aviso = new FeedbackAviso();
							aviso.setHoja(AppConstantes.NOM_HOJA_REL_VIVIENDAS);
							aviso.setElemento(messageSource.getMessage("error.importar.xls.trastero.direccion.calle",new Object[] {vivienda.getNumVivienda()},locale));
							aviso.setDato(vivienda.getTrastero().getCalle()) ;
							aviso.setDescripcion(messageSource.getMessage("error.importar.xls.direccion.calle.muchas",
									new Object[] {vivienda.getTrastero().getCalle()}, locale));
							listaErroresAvisos.add(aviso);
						}
					}
					
				}
			}
		}
	}
	private boolean existeVivEnLista(List <com.ejie.m62fb.model.jaxb.comunicacionVPPAyto.ComunicacionVPPAyuntamientos.Viviendas.Vivienda> 
	viviendasLeidas,String numVivienda){
		for (com.ejie.m62fb.model.jaxb.comunicacionVPPAyto.ComunicacionVPPAyuntamientos.Viviendas.Vivienda vivienda : viviendasLeidas) {
			if (vivienda.getNumVivienda().equalsIgnoreCase(numVivienda)){
				return true;
			}
		}
		return false;
	}
	//1.3-VALIDAR CONTRATOS COMPRAVENTA SOLICITUD DE CALIF PROVIS DEFINITIVA
	private void validarContratoCompraVenta(List<Feedback> listaErroresAvisos,List<ContratoCompraVenta> contratos,String numExpediente,Locale locale,
			List <com.ejie.m62fb.model.jaxb.comunicacionVPPAyto.ComunicacionVPPAyuntamientos.Viviendas.Vivienda> 
	viviendasLeidas){
		for (ContratoCompraVenta contratoXML  : contratos) {
			//VALIDAR QUE LA VIVIENDA EXISTA
//			ExpedienteVivienda expedienteVivienda = new ExpedienteVivienda(numExpediente.substring(0,15)+
//					String.format("%03d", Integer.parseInt(contratoXML.getNumVivienda())));
//			if(expedienteViviendaDao.findIdVivienda(expedienteVivienda.getNumExpediente())==null){
			if(!existeVivEnLista(viviendasLeidas, contratoXML.getNumVivienda())){
				FeedbackError error = new FeedbackError();
				error.setHoja(AppConstantes.NOM_HOJA_CONTRATOS_COMPRA);
				error.setElemento(messageSource.getMessage("error.importar.xls.vivienda", null, locale));
				error.setDescripcion(messageSource.getMessage("error.importar.xls.vivienda.no.existe", 
						new Object[] {contratoXML.getNumVivienda(),numExpediente}, locale));
				listaErroresAvisos.add(error);
			}
			//VALIDAR CONTRATO COMPRAVENTA
			cargaFicherosService.validarContratoCompra(listaErroresAvisos, contratoXML.getNumVivienda(), contratoXML.getFecVenta(), locale);
			//VALIDAR TITULARES
			List<String> titulares=new ArrayList<String>();
			for (Titular titular : contratoXML.getTitular()) {
				cargaFicherosService.validarDatosTitular(listaErroresAvisos,titulares, AppConstantes.NOM_HOJA_CONTRATOS_COMPRA,
						contratoXML.getNumVivienda(), titular.getDNI(), titular.getNombre(), titular.getApellido1(), titular.getApellido2(), locale);
			}
//			//VALIDAR LA FECHA DE VENTA
//			if(contratoXML.getFecVenta().isEmpty()){
//				//OBLIGATORIA
//				FeedbackError error = new FeedbackError();
//				error.setHoja(AppConstantes.NOM_HOJA_CONTRATOS_COMPRA);
//				error.setElemento(messageSource.getMessage("error.importar.xls.contrato.compra.fechaventa", null, locale));
//				error.setDescripcion(messageSource.getMessage("error.importar.xls.contrato.compra.fechaventa.obligatorio", new Object[] {contratoXML.getNumVivienda()}, locale));
//				listaErroresAvisos.add(error);
//			}else{
//				//FORMATO
//					SimpleDateFormat format = contratoXML.getFecVenta().length()>10?
//							DateTimeManager.getTimestampFormat(AppConstantes.ES_LOCALE):
//						DateTimeManager.getDateTimeFormat(AppConstantes.ES_LOCALE);
//							try {
//								format.parse(contratoXML.getFecVenta());
//							} catch (ParseException e) {
//								FeedbackError error = new FeedbackError();
//								error.setHoja(AppConstantes.NOM_HOJA_CONTRATOS_COMPRA);
//								error.setDato(contratoXML.getFecVenta());
//								error.setElemento(messageSource.getMessage("error.importar.xls.contrato.compra.fechaventa", null, locale));
//								error.setDescripcion(messageSource.getMessage("error.importar.xls.contrato.compra.fechaventa.no.valid", new Object[] {contratoXML.getNumVivienda()}, locale));
//								listaErroresAvisos.add(error);
//							}
//			}
//			
//			//VALIDAR NIF
//			//es correcto
//			for (Titular titular : contratoXML.getTitular()) {
//				if(!ValidadorNIF.checkNif(titular.getDNI())){
//					FeedbackError error = new FeedbackError();
//					error.setHoja(AppConstantes.NOM_HOJA_CONTRATOS_COMPRA);
//					error.setDato(titular.getDNI());
//					error.setElemento(messageSource.getMessage("error.importar.xls.titular.nif", null, locale));
//					error.setDescripcion(messageSource.getMessage("error.importar.xls.titular.nif.no.valid", new Object[] {titular.getDNI(),contratoXML.getNumVivienda()}, locale));
//					listaErroresAvisos.add(error);
//				}else{ 
//					if(ValidadorNIF.getTipoNIF(titular.getDNI())==TipoClave.DNI){
//						if(titular.getApellido1().trim().length()==0){
//							FeedbackError error = new FeedbackError();
//							error.setHoja(AppConstantes.NOM_HOJA_CONTRATOS_COMPRA);
//							error.setElemento(messageSource.getMessage("error.importar.xls.titular.apel1", null, locale));
//							error.setDescripcion(messageSource.getMessage("error.importar.xls.titular.apel1.obligatorio", new Object[] {titular.getDNI(),contratoXML.getNumVivienda()}, locale));
//							listaErroresAvisos.add(error);
//						}
//						if(titular.getApellido2().trim().length()==0){
//							FeedbackError error = new FeedbackError();
//							error.setHoja(AppConstantes.NOM_HOJA_CONTRATOS_COMPRA);
//							error.setElemento(messageSource.getMessage("error.importar.xls.titular.apel2", null, locale));
//							error.setDescripcion(messageSource.getMessage("error.importar.xls.titular.apel2.obligatorio", new Object[] {titular.getDNI(),contratoXML.getNumVivienda()}, locale));
//							listaErroresAvisos.add(error);
//						}
//					}
//				}
//			}
			
				
		}
	}
	//1.4-VALIDAR CONTRATOS ALQUILER SOLICITUD DE CALIF PROVIS DEFINITIVA
	/**
	 * Validar Contrato de alquiler de 
	 * @param listaErroresAvisos
	 * @param contratos
	 * @param numExpediente
	 * @param locale
	 */
	private void validarContratoAlquiler(List<Feedback> listaErroresAvisos,List<ContratoAlquiler> contratos,String numExpediente,Locale locale,
			List <com.ejie.m62fb.model.jaxb.comunicacionVPPAyto.ComunicacionVPPAyuntamientos.Viviendas.Vivienda> 
	viviendasLeidas){
		for (ContratoAlquiler contratoXML  : contratos) {
			//VALIDAR QUE LA VIVIENDA EXISTA
//			ExpedienteVivienda expedienteVivienda = new ExpedienteVivienda(numExpediente.substring(0,15)+
//					String.format("%03d", Integer.parseInt(contratoXML.getNumVivienda())));
//			if(expedienteViviendaDao.findIdVivienda(expedienteVivienda.getNumExpediente())==null){
			if(!existeVivEnLista(viviendasLeidas, contratoXML.getNumVivienda())){
				FeedbackError error = new FeedbackError();
				error.setHoja(AppConstantes.NOM_HOJA_CONTRATOS_ALQUILER);
				error.setElemento(messageSource.getMessage("error.importar.xls.vivienda", null, locale));
				error.setDescripcion(messageSource.getMessage("error.importar.xls.vivienda.no.existe", 
						new Object[] {contratoXML.getNumVivienda(),numExpediente}, locale));
				listaErroresAvisos.add(error);
			}
			//VALIDAR CONTRATO ALQUILER
			cargaFicherosService.validarContratoAlquiler(listaErroresAvisos, contratoXML.getNumVivienda(), contratoXML.getFecInicioAlquiler(), contratoXML.getFecFinAlquiler(), locale);
			//VALIDAR TITULARES
			List<String> titulares=new ArrayList<String>();
			for (ComunicacionVPPAyuntamientos.ContratosAlquiler.ContratoAlquiler.Titular 
					titular : contratoXML.getTitular()) {
				cargaFicherosService.validarDatosTitular(listaErroresAvisos,titulares, AppConstantes.NOM_HOJA_CONTRATOS_ALQUILER,
						contratoXML.getNumVivienda(), titular.getDNI(), titular.getNombre(), titular.getApellido1(), titular.getApellido2(), locale);
			}
			//			//VALIDAR LA FECHA DE INICIO DE ALQUILER
//			Date fechaInicio=null;
//			Date fechaFin=null;
//			SimpleDateFormat format = contratoXML.getFecFinAlquiler().length()>10?
//					DateTimeManager.getTimestampFormat(AppConstantes.ES_LOCALE):
//				DateTimeManager.getDateTimeFormat(AppConstantes.ES_LOCALE);
//			if(contratoXML.getFecInicioAlquiler().isEmpty()){
//				//OBLIGATORIA
//				FeedbackError error = new FeedbackError();
//				error.setHoja(AppConstantes.NOM_HOJA_CONTRATOS_ALQUILER);
//				error.setElemento(messageSource.getMessage("error.importar.xls.contrato.alquiler.fechainicio", null, locale));
//				error.setDescripcion(messageSource.getMessage("error.importar.xls.contrato.alquiler.fechainicio.obligatorio", new Object[] {contratoXML.getNumVivienda()}, locale));
//				listaErroresAvisos.add(error);
//			}else{
//				//FORMATO
//							try {
//								fechaInicio=format.parse(contratoXML.getFecInicioAlquiler());
//							} catch (ParseException e) {
//								listaErroresAvisos.add(cargaFicherosService.generarErrorFormatoFecha(AppConstantes.NOM_HOJA_CONTRATOS_ALQUILER, 
//										"error.importar.xls.contrato.alquiler.fechainicio",
//										contratoXML.getNumVivienda(), locale));
//							}
//			}
//			//VALIDAR LA FECHA DE FIN DE ALQUILER 
//			if(contratoXML.getFecFinAlquiler().isEmpty()){
//				//OBLIGATORIA
//				FeedbackError error = new FeedbackError();
//				error.setHoja(AppConstantes.NOM_HOJA_CONTRATOS_ALQUILER);
//				error.setElemento(messageSource.getMessage("error.importar.xls.contrato.alquiler.fechafin", null, locale));
//				error.setDescripcion(messageSource.getMessage("error.importar.xls.contrato.alquiler.fechafin.obligatorio", new Object[] {contratoXML.getNumVivienda()}, locale));
//				listaErroresAvisos.add(error);
//			}else{
//				//FORMATO
//					
//							try {
//								fechaFin=format.parse(contratoXML.getFecFinAlquiler());
//							} catch (ParseException e) {
//								listaErroresAvisos.add(cargaFicherosService.generarErrorFormatoFecha(AppConstantes.NOM_HOJA_CONTRATOS_ALQUILER, 
//										"error.importar.xls.contrato.alquiler.fechafin",
//										contratoXML.getNumVivienda(), locale));
//							}
//			}
//			//VALIDAR QUE LA FECHA FIN SEA MAYOR QUE LA FECHA INICIO
//			if(fechaInicio!=null && fechaFin!=null){
//				if (fechaFin.compareTo(fechaInicio) < 0){
//					FeedbackError error = new FeedbackError();
//					error.setHoja(AppConstantes.NOM_HOJA_CONTRATOS_ALQUILER);
//					error.setDato(format.format(fechaFin) + " > " + format.format(fechaInicio));
//					error.setElemento(messageSource.getMessage("error.importar.xls.contrato.alquiler.fechainiciofin", null, locale));
//					error.setDescripcion(messageSource.getMessage("error.importar.xls.contrato.alquiler.fechainiciofin.no.valid",
//							new Object[] {contratoXML.getNumVivienda(),format.format(fechaFin),format.format(fechaInicio)}, locale));
//					listaErroresAvisos.add(error);
//				}
//			}
			//VALIDAR NIF
			//es correcto
//			for (ComunicacionVPPAyuntamientos.ContratosAlquiler.ContratoAlquiler.Titular 
//					titular : contratoXML.getTitular()) {
//				if(!ValidadorNIF.checkNif(titular.getDNI())){
//					FeedbackError error = new FeedbackError();
//					error.setHoja(AppConstantes.NOM_HOJA_CONTRATOS_ALQUILER);
//					error.setElemento(messageSource.getMessage("error.importar.xls.titular.nif", null, locale));
//					error.setDato(titular.getDNI());
//					error.setDescripcion(messageSource.getMessage("error.importar.xls.titular.nif.no.valid", new Object[] {titular.getDNI(),contratoXML.getNumVivienda()}, locale));
//					listaErroresAvisos.add(error);
//				}else{ 
//					if(ValidadorNIF.getTipoNIF(titular.getDNI())==TipoClave.DNI){
//						if(titular.getApellido1().trim().length()==0){
//							FeedbackError error = new FeedbackError();
//							error.setHoja(AppConstantes.NOM_HOJA_CONTRATOS_ALQUILER);
//							error.setElemento(messageSource.getMessage("error.importar.xls.titular.apel1", null, locale));
//							error.setDescripcion(messageSource.getMessage("error.importar.xls.titular.apel1.obligatorio", new Object[] {titular.getDNI(),contratoXML.getNumVivienda()}, locale));
//							listaErroresAvisos.add(error);
//						}else{
//							if (titular.getApellido1().trim().length()>AppConstantes.SIZE_AP1_AP2){
//								listaErroresAvisos.add(cargaFicherosService.generarAvisoTXTSize(
//										AppConstantes.NOM_HOJA_CONTRATOS_ALQUILER
//										,"error.importar.xls.titular.apel1",
//										titular.getApellido1(),
//										AppConstantes.SIZE_AP1_AP2, locale));
//							}
//								
//						}
//						if(titular.getApellido2().trim().length()==0){
//							FeedbackError error = new FeedbackError();
//							error.setHoja(AppConstantes.NOM_HOJA_CONTRATOS_ALQUILER);
//							error.setElemento(messageSource.getMessage("error.importar.xls.titular.apel2", null, locale));
//							error.setDescripcion(messageSource.getMessage("error.importar.xls.titular.apel2.obligatorio", new Object[] {titular.getDNI(),contratoXML.getNumVivienda()}, locale));
//							listaErroresAvisos.add(error);
//						}else{
//							if (titular.getApellido2().trim().length()>AppConstantes.SIZE_AP1_AP2){
//								listaErroresAvisos.add(cargaFicherosService.generarAvisoTXTSize(
//										AppConstantes.NOM_HOJA_CONTRATOS_ALQUILER
//										,"error.importar.xls.titular.apel2",
//										titular.getApellido2(),
//										AppConstantes.SIZE_AP1_AP2, locale));
//							}
//								
//						}
//					}
//				}
//			}
		}
	}
	private List<Feedback> validarComunicacionVPPAyto(ComunicacionVPPAyuntamientos comunicacionVPPAyuntamientos,String numExpediente){
		Locale locale = LocaleContextHolder.getLocale();
		List<Feedback> listaErroresAvisos=new ArrayList<Feedback>();
		//INICIO VPP
		validarDatosVPP(listaErroresAvisos, comunicacionVPPAyuntamientos, numExpediente, locale);
		//FIN VPP
		//INICIO VIVIENDAS
		List <com.ejie.m62fb.model.jaxb.comunicacionVPPAyto.ComunicacionVPPAyuntamientos.Viviendas.Vivienda> 
		viviendasLeidas=new ArrayList<com.ejie.m62fb.model.jaxb.comunicacionVPPAyto.ComunicacionVPPAyuntamientos.Viviendas.Vivienda>();
		validarDatosRelViviendas(listaErroresAvisos, comunicacionVPPAyuntamientos, numExpediente, locale,viviendasLeidas);
		//FIN VIVIENDAS
		//INICIO CONTRATO COMPRAVENTA
		validarContratoCompraVenta(listaErroresAvisos,comunicacionVPPAyuntamientos.getContratosCompraVenta().getContratoCompraVenta(),numExpediente,locale,viviendasLeidas);
		//FIN CONTRATO COMPRAVENTA
		//INICIO CONTRATO ALQUILER
		validarContratoAlquiler(listaErroresAvisos,comunicacionVPPAyuntamientos.getContratosAlquiler().getContratoAlquiler(),numExpediente,locale,viviendasLeidas);
		//FIN CONTRATO ALQUILER
		return listaErroresAvisos;
	}
	private TipoAdjudicacion getNumTipoAdjudicacion(int tipoAdjudicacion){
			switch (tipoAdjudicacion) {
			case 10:
				return new TipoAdjudicacion("46");
			case 23:
				return new TipoAdjudicacion("48");
			case 21:
				return new TipoAdjudicacion("50");
			case 22:
				return new TipoAdjudicacion("49");
			case 30:
				return new TipoAdjudicacion("51");
			case 40:
				return new TipoAdjudicacion("52");
			case 50:
				return new TipoAdjudicacion("72");
			case 60:
				return new TipoAdjudicacion("73");
			default:
				break;
			}
			return null;
	}
	private TipoQuienAdjudicacion getNumTipoQuienAdjudicacion(int tipoAdjudicacion){
		switch (tipoAdjudicacion) {
		case 10:
			return new TipoQuienAdjudicacion("53");
		case 23:
			return new TipoQuienAdjudicacion("54");
		case 30:
			return new TipoQuienAdjudicacion("56");
		case 40:
			return new TipoQuienAdjudicacion("57");
		case 60:
			return new TipoQuienAdjudicacion("74");
		default:
			break;
		}
		return null;
	}
	private TipoComoAdjudicacion getNumTipoComoAdjudicacion(int tipoAdjudicacion){
		switch (tipoAdjudicacion) {
		case 23:
			return new TipoComoAdjudicacion("58");
		case 21:
			return new TipoComoAdjudicacion("59");
		case 22:
			return new TipoComoAdjudicacion("60");
		default:
			break;
		}
		return null;
}
	
	/**
	 * 
	 * @param alojamiento
	 * @return
	 */
	private Vivienda rellenarDatosVivienda(ComunicacionVPPAyuntamientos comunicacionVPPAyuntamientos,
			com.ejie.m62fb.model.jaxb.comunicacionVPPAyto.ComunicacionVPPAyuntamientos.Viviendas.Vivienda 
			vivienda,String numExpediente){
		Vivienda nuevaVivienda=new Vivienda();
//		Direccion
		Direccion direccion = new Direccion();
		direccion.setProvincia(new Provincia(comunicacionVPPAyuntamientos.getVPP().getPromocion().getTerritorio()));
		direccion.setMunicipio(new Municipio(comunicacionVPPAyuntamientos.getVPP().getPromocion().getMunicipio(), direccion.getProvincia()));
		Calle calleSearch=  new Calle();
		calleSearch.setMunicipio(direccion.getMunicipio());
		calleSearch.setNombreEs(cargaFicherosService.getTXTWithSizeOk(vivienda.getCalle(),AppConstantes.SIZE_CALLE));
		calleSearch.setNombreEu(cargaFicherosService.getTXTWithSizeOk(vivienda.getCalle(),AppConstantes.SIZE_CALLE));
		List<Calle> listaCalles = calleDao.findAll(calleSearch,null);
		if(listaCalles.size()>0){
			direccion.setCalle(listaCalles.get(0));
		}else{
			direccion.setCalle(calleSearch);
		}	
		
		Portal portal= new Portal();
		portal.setCodigoPostal(cargaFicherosService.getTXTWithSizeOk(comunicacionVPPAyuntamientos.getVPP().getPromocion().getCodPostal(),AppConstantes.SIZE_CALLE));
		portal.setNumero(cargaFicherosService.getTXTWithSizeOk(vivienda.getPortal(),AppConstantes.SIZE_PORTAL));
		direccion.setPortal(portal);
		Planta planta=new Planta();
		planta.setPiso(cargaFicherosService.getTXTWithSizeOk(vivienda.getPlanta(),AppConstantes.SIZE_PLANTA));
		direccion.setPlanta(planta);
		direccion.setMano(cargaFicherosService.getTXTWithSizeOk(vivienda.getMano(),AppConstantes.SIZE_MANO));
		nuevaVivienda.setDireccion(direccion);
		//Superficie
		nuevaVivienda.setSuperficieUtil(FormatUtils.convertirADecimal(cargaFicherosService.getTXTWithSizeOk(vivienda.getSupUtil(),AppConstantes.SIZE_SUP_UTIL)));
		//Dormitorios
		nuevaVivienda.setNumDormitorios(Long.valueOf(cargaFicherosService.getTXTWithSizeOk(vivienda.getDormitorios().isEmpty()?"0":vivienda.getDormitorios(),AppConstantes.SIZE_NUM_DORMITORIOS)));
		//Baños
		nuevaVivienda.setNumBanyos(Long.valueOf(cargaFicherosService.getTXTWithSizeOk(vivienda.getBanos().isEmpty()?"0":vivienda.getBanos(),AppConstantes.SIZE_NUM_BANOS)));
		//Ind Viv Adaptada
		nuevaVivienda.setIndVivAdaptada(vivienda.getAdaptado().equalsIgnoreCase("0")?AppConstantes.FALSE:AppConstantes.TRUE);
		//NumTipoRegulacion
		if(numExpediente.indexOf("MG")>0){
			nuevaVivienda.setTipoRegulacion(new TipoRegulacion("6"));
		}else if(numExpediente.indexOf("ME")>0){
			nuevaVivienda.setTipoRegulacion(new TipoRegulacion("7"));
		}
		//NumTipoRegAcceso  M62R0000K000.FN_OBT_NUM_TIPO_REG_ACCESO(RegAcceso, RegTenencia)
		nuevaVivienda.setTipoAcceso(cargaFicherosDao.getNumTipoRegAcceso(comunicacionVPPAyuntamientos.getVPP().getPromocion().getRegAcceso(),
				comunicacionVPPAyuntamientos.getVPP().getPromocion().getRegTenencia()));
		//NumClaIniciativa
		nuevaVivienda.setTipoIniciativa(new TipoIniciativa("29"));
		//NumTipoPropietario M62R0000K000.FN_OBT_NUM_TIPO_PROPIETARIO(NifSolicitante)
		nuevaVivienda.setTipoPropietarios(cargaFicherosDao.getNumTipoPropietarios(comunicacionVPPAyuntamientos.getVPP().getPromotor().getCIF()));
		//NumAdjudicacion
		nuevaVivienda.setTipoAdjudicacion(getNumTipoAdjudicacion(Integer.parseInt(comunicacionVPPAyuntamientos.getVPP().getPromocion().getTipoProcedimientoAdjudicacion())));
		//NumAdjudicacionQuien
		nuevaVivienda.setTipoQuienAdjudicacion(getNumTipoQuienAdjudicacion(Integer.parseInt(comunicacionVPPAyuntamientos.getVPP().getPromocion().getTipoProcedimientoAdjudicacion())));
		//NumAdjudicacionComo
		nuevaVivienda.setTipoComoAdjudicacion(getNumTipoComoAdjudicacion(Integer.parseInt(comunicacionVPPAyuntamientos.getVPP().getPromocion().getTipoProcedimientoAdjudicacion())));
		//RegAcceso
		nuevaVivienda.setRegimenAcceso(new RegimenAcceso(comunicacionVPPAyuntamientos.getVPP().getPromocion().getRegAcceso()));
		//RegTenencia
		nuevaVivienda.setRegimenTenencia(new RegimenTenencia(comunicacionVPPAyuntamientos.getVPP().getPromocion().getRegTenencia()));
		return nuevaVivienda;
	} 
	public void insertarDatosComunicacionVPPAyto(
			ComunicacionVPPAyuntamientos comunicacionVPPAyuntamientos,
			String numExpediente,Date fechaEntradaContrato) throws ParseException{
		//1. Borramos las viviendas que existan de ese expediente en el registro VPP
		cargaFicherosDao.borrarViviendas(numExpediente);
		for (com.ejie.m62fb.model.jaxb.comunicacionVPPAyto.ComunicacionVPPAyuntamientos.Viviendas.Vivienda vivienda : comunicacionVPPAyuntamientos.getViviendas().getVivienda()) {
			//VIVIENDA + GARAJE + TRASTERO
//			com.ejie.m62fb.model.jaxb.comunicacionVPPAyto.ComunicacionVPPAyuntamientos.Viviendas.Vivienda 
//			vivienda= viviendas.getVivienda();
			
			//2. Por cada vivienda que nos hemos encontrado
			//2.1.Insertamos la vivienda en la tabla M62R01T0
			Vivienda nuevaVivienda=rellenarDatosVivienda(comunicacionVPPAyuntamientos, vivienda, numExpediente);
			nuevaVivienda=viviendaDao.add(nuevaVivienda);
//			if (nuevaVivienda.getDireccion().getCalle().getId()==null){
//				viviendaDao.updateDesCalle(nuevaVivienda.getNumVivienda(), nuevaVivienda.getDireccion().getCalle().getNombreEs());
//			}
			//2.2.Insertamos la relación entre expediente y vivienda
			ExpedienteVivienda expedienteVivienda = new ExpedienteVivienda(numExpediente.substring(0,15)+
					String.format("%03d", Integer.parseInt(vivienda.getNumVivienda())));
			expedienteViviendaDao.inserRelacExpedVivienda(nuevaVivienda.getNumVivienda(), 
					expedienteVivienda.getNumExpediente(), numExpediente.substring(13,14));
			//2.3.Insertamos los datos de los anejos vinculados a la vivienda si es que existen en la tabla M62R12T0.
			if (!vivienda.getGaraje().getNumero().isEmpty()){
				Elemento garaje = new Elemento();
				garaje.setTipoElemento(new TipoElemento(TipoElemento.GARAJE));
				garaje.setCodElemento(cargaFicherosService.getTXTWithSizeOk(vivienda.getGaraje().getNumero(),AppConstantes.SIZE_COD_ELEMENTO));
				garaje.setTipoVinculacion(new TipoVinculacion(TipoVinculacion.VINCULADO));
				garaje.setVivienda(nuevaVivienda);
				garaje.setNumExpediente(numExpediente);
				//Superficie
				garaje.setSuperficieUtil(FormatUtils.convertirADecimal(cargaFicherosService.getTXTWithSizeOk(vivienda.getGaraje().getSupUtil(),AppConstantes.SIZE_SUP_UTIL)));
				Direccion direccion =nuevaVivienda.getDireccion();
				if(!vivienda.getGaraje().getCalle().isEmpty()){
					Calle calleSearch=  new Calle();
					calleSearch.setMunicipio(direccion.getMunicipio());
					calleSearch.setNombreEs(cargaFicherosService.getTXTWithSizeOk(vivienda.getGaraje().getCalle(),AppConstantes.SIZE_CALLE));
					calleSearch.setNombreEu(cargaFicherosService.getTXTWithSizeOk(vivienda.getGaraje().getCalle(),AppConstantes.SIZE_CALLE));
					List<Calle> listaCalles = calleDao.findAll(calleSearch,null);
					if(listaCalles.size()>0){
						direccion.setCalle(listaCalles.get(0));
					}else{
						direccion.setCalle(calleSearch);
					}
				}
				if(!vivienda.getGaraje().getPortal().isEmpty()){
					direccion.getPortal().setNumero(cargaFicherosService.getTXTWithSizeOk(vivienda.getGaraje().getPortal(),AppConstantes.SIZE_PORTAL));
				}
				Planta planta=new Planta();
				planta.setPiso(cargaFicherosService.getTXTWithSizeOk(vivienda.getGaraje().getSituacion(),AppConstantes.SIZE_PLANTA));
				direccion.setPlanta(planta);
				direccion.setMano(null);
				garaje.setDireccion(direccion);
				elementosDao.add(garaje);
//				if (garaje.getDireccion().getCalle().getId()==null){
//					viviendaDao.updateDesCalle(nuevaVivienda.getNumVivienda(), nuevaVivienda.getDireccion().getCalle().getNombreEs());
//				}
			}
			if (!vivienda.getTrastero().getNumero().isEmpty()){
				Elemento trastero = new Elemento();
				trastero.setTipoElemento(new TipoElemento(TipoElemento.TRASTERO));
				trastero.setCodElemento(cargaFicherosService.getTXTWithSizeOk(vivienda.getTrastero().getNumero(),AppConstantes.SIZE_COD_ELEMENTO));
				trastero.setTipoVinculacion(new TipoVinculacion(TipoVinculacion.VINCULADO));
				trastero.setVivienda(nuevaVivienda);
				trastero.setNumExpediente(numExpediente);
				//Superficie
				trastero.setSuperficieUtil(FormatUtils.convertirADecimal(cargaFicherosService.getTXTWithSizeOk(vivienda.getTrastero().getSupUtil(),AppConstantes.SIZE_SUP_UTIL)));
				Direccion direccion =nuevaVivienda.getDireccion();
				if(!vivienda.getTrastero().getCalle().isEmpty()){
					Calle calleSearch=  new Calle();
					calleSearch.setMunicipio(direccion.getMunicipio());
					calleSearch.setNombreEs(cargaFicherosService.getTXTWithSizeOk(vivienda.getTrastero().getCalle(),AppConstantes.SIZE_CALLE));
					calleSearch.setNombreEu(cargaFicherosService.getTXTWithSizeOk(vivienda.getTrastero().getCalle(),AppConstantes.SIZE_CALLE));
					List<Calle> listaCalles = calleDao.findAll(calleSearch,null);
					if(listaCalles.size()>0){
						direccion.setCalle(listaCalles.get(0));
					}else{
						direccion.setCalle(calleSearch);
					}
				}
				if(!vivienda.getTrastero().getPortal().isEmpty()){
					direccion.getPortal().setNumero(cargaFicherosService.getTXTWithSizeOk(vivienda.getTrastero().getPortal(),AppConstantes.SIZE_PORTAL));
				}
				Planta planta=new Planta();
				planta.setPiso(cargaFicherosService.getTXTWithSizeOk(vivienda.getTrastero().getSituacion(),AppConstantes.SIZE_PLANTA));
				direccion.setPlanta(planta);
				direccion.setMano(null);
				trastero.setDireccion(direccion);
				elementosDao.add(trastero);
			}
				
		}
		for (ContratoCompraVenta contratoXML  : comunicacionVPPAyuntamientos.getContratosCompraVenta().getContratoCompraVenta()) {
			ContratoVivienda contratoVivienda=new ContratoVivienda();
			
			//ExpedienteVivienda
			ExpedienteVivienda expedienteVivienda = new ExpedienteVivienda(numExpediente.substring(0,15)+
					String.format("%03d", Integer.parseInt(contratoXML.getNumVivienda())));
			contratoVivienda.setExpedienteVivienda(expedienteVivienda);
			//Vivienda
			Vivienda vivienda = new Vivienda(expedienteViviendaDao.findIdVivienda(expedienteVivienda.getNumExpediente()));
			contratoVivienda.setVivienda(vivienda);
			//COD_TIPO_TRANS = 1 PRIMERA
			contratoVivienda.setTipoTransmision(new TipoTransmision(TipoTransmision.PRIMERA));
			//FECHA VENTA
			SimpleDateFormat format = contratoXML.getFecVenta().length()>10?DateTimeManager.getTimestampFormat(AppConstantes.ES_LOCALE):DateTimeManager.getDateTimeFormat(AppConstantes.ES_LOCALE);
			contratoVivienda.setFecTransmision(format.parse(contratoXML.getFecVenta()));
			//FEC_ENT_CONTRATO  -> Fecha entrada que se ha introducido al comienzo de la carga
			contratoVivienda.setFecEntContrato(fechaEntradaContrato);
			//IND_VIV_ADAPTADA
			contratoVivienda.setIndVivAdaptada(new TipoSiNo(contratoVivienda.getVivienda().getIndVivAdaptada()));
			
			BigDecimal numPropieterio=contratoViviendaDao.findNumPropietarioMaxMasUno(vivienda.getNumVivienda());
			contratoVivienda=contratoViviendaDao.add(contratoVivienda);
			for (Titular titular : contratoXML.getTitular()) {
				Propietario propietario=new Propietario(numPropieterio);
				Persona persona=cargaFicherosService.addPersonaIfNoExists(titular.getDNI(),titular.getNombre(),titular.getApellido1(),titular.getApellido2());
//					personaDao.findByNIF(titular.getDNI());
//				//comprobar si exise el titular
//				if(persona==null){
//					persona=new Persona();
//					persona.setTipoCodigoId(new TipoClave(ValidadorNIF.getTipoNIF(titular.getDNI())));
//					persona.setCodigoId(titular.getDNI());
//					persona.setNombre(cargaFicherosService.getTXTWithSizeOk(titular.getNombre(),AppConstantes.SIZE_NOMBRE));
//					persona.setApellido1(cargaFicherosService.getTXTWithSizeOk(titular.getApellido1(),AppConstantes.SIZE_AP1_AP2));
//					persona.setApellido2(cargaFicherosService.getTXTWithSizeOk(titular.getApellido2(),AppConstantes.SIZE_AP1_AP2));
//					personaDao.add(persona);
//					persona=personaDao.findByNIF(titular.getDNI());
//				}
				propietario.setVivienda(vivienda);
				propietario.setExpedienteVivienda(expedienteVivienda);
				propietario.setPersona(persona);
				propietario.setIndTitular(new TipoSiNo(BDUtils.TRUE));
				double porcentaje=100.00/contratoXML.getTitular().size();
				propietario.setPorTitularidad(BigDecimal.valueOf(porcentaje));
				propietarioDao.add(propietario);
			}
		}
		for (ContratoAlquiler contratoXML  : comunicacionVPPAyuntamientos.getContratosAlquiler().getContratoAlquiler()) {
			com.ejie.m62fb.model.ContratoAlquiler contratoAlquiler=new com.ejie.m62fb.model.ContratoAlquiler();
			//ExpedienteVivienda
			ExpedienteVivienda expedienteVivienda = new ExpedienteVivienda(numExpediente.substring(0,15)+
					String.format("%03d", Integer.parseInt(contratoXML.getNumVivienda())));
			contratoAlquiler.setExpedienteVivienda(expedienteVivienda);
			//Vivienda
			Vivienda vivienda = new Vivienda(expedienteViviendaDao.findIdVivienda(expedienteVivienda.getNumExpediente()));
			contratoAlquiler.setVivienda(viviendaDao.find(vivienda));
			//FEC_ENT_CONTRATO  -> Fecha entrada que se ha introducido al comienzo de la carga
			contratoAlquiler.setFecEntContrato(fechaEntradaContrato);
			//FEC_INICIO
			SimpleDateFormat format = contratoXML.getFecInicioAlquiler().length()>10?DateTimeManager.getTimestampFormat(AppConstantes.ES_LOCALE):DateTimeManager.getDateTimeFormat(AppConstantes.ES_LOCALE);
			contratoAlquiler.setFecInicio(format.parse(contratoXML.getFecInicioAlquiler()));
			//FEC_ALQUILER
			format = contratoXML.getFecFinAlquiler().length()>10?DateTimeManager.getTimestampFormat(AppConstantes.ES_LOCALE):DateTimeManager.getDateTimeFormat(AppConstantes.ES_LOCALE);
			contratoAlquiler.setFecFin(format.parse(contratoXML.getFecFinAlquiler()));
			//IND_VIV_ADAPTADA
			contratoAlquiler.setIndVivAdaptada(new TipoSiNo(contratoAlquiler.getVivienda().getIndVivAdaptada()));
			
			BigDecimal numInquilino=contratoAlquilerDao.findNumInquilinoMaxMasUno(vivienda.getNumVivienda());
			contratoAlquiler=contratoAlquilerDao.add(contratoAlquiler);
			for (ComunicacionVPPAyuntamientos.ContratosAlquiler.ContratoAlquiler.Titular 
					titular : contratoXML.getTitular()) {
				Inquilino inquilino=new Inquilino(numInquilino);
				Persona persona=cargaFicherosService.addPersonaIfNoExists(titular.getDNI(),titular.getNombre(),titular.getApellido1(),titular.getApellido2());
//				Persona persona=personaDao.findByNIF(titular.getDNI());
//				//comprobar si exise el titular
//				if(persona==null){
//					persona=new Persona();
//					persona.setTipoCodigoId(new TipoClave(ValidadorNIF.getTipoNIF(titular.getDNI())));
//					persona.setCodigoId(titular.getDNI());
//					persona.setNombre(cargaFicherosService.getTXTWithSizeOk(titular.getNombre(),AppConstantes.SIZE_NOMBRE));
//					persona.setApellido1(cargaFicherosService.getTXTWithSizeOk(titular.getApellido1(),AppConstantes.SIZE_AP1_AP2));
//					persona.setApellido2(cargaFicherosService.getTXTWithSizeOk(titular.getApellido2(),AppConstantes.SIZE_AP1_AP2));
//					personaDao.add(persona);
//					persona=personaDao.findByNIF(titular.getDNI());
//				}
				inquilino.setVivienda(vivienda);
				inquilino.setExpedienteVivienda(expedienteVivienda);
				inquilino.setPersona(persona);
				inquilinoDao.add(inquilino);
			}
		}
	}
//	private Alojamiento getDatosAlojamiento(ComunicacionVPPAyuntamientos comunicacionVPPAyuntamientos, String numVivienda){
//		for (AlojamientoGeneral alojamiento : comunicacionVPPAyuntamientos.getAlojamientos().getAlojamientoGeneral()) {
//			if (alojamiento.getNumAlojamiento().equalsIgnoreCase(numVivienda)){
//				return alojamiento.getAlojamiento();
//			}
//		}
//		return null;
//	}
}

	