package com.ejie.m62fb.service.registroVPP;

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.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
import org.springframework.stereotype.Service;
import com.ejie.m62fb.utils.constants.IberErrorsMsgConstants;
import com.ejie.m62fb.utils.error.UFException;
import com.ejie.m62fb.dao.PersonaDao;
import com.ejie.m62fb.dao.registroVPP.CargaFicherosDao;
import com.ejie.m62fb.dao.registroVPP.plsql.M62FuncionesPLSQL;
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.persona.Persona;
import com.ejie.m62fb.model.tipos.TipoClave;
import com.ejie.m62fb.util.ValidadorNIF;
import com.ejie.m62fb.utils.constants.AppConstantes;
import com.ejie.x38.util.DateTimeManager;

/**
 * CargaFicherosServiceImpl.
 * 
XXXX
 */
@Service(value = "cargaFicherosService")
public class CargaFicherosServiceImpl implements CargaFicherosService {
	private static final Logger logger = LoggerFactory
	.getLogger(CargaFicherosServiceImpl.class);
	//	@Autowired
//	private ExpedienteViviendaDao expedienteViviendaDao;
//	@Autowired
//	private PersonaDao personaDao;
	@Autowired
	private CargaFicherosDao cargaFicherosDao;
//	@Autowired
//	private ContratoViviendaDao contratoViviendaDao;
//	@Autowired
//	private ContratoAlquilerDao contratoAlquilerDao;
//	@Autowired 
//	private PropietarioDao propietarioDao;
//	@Autowired 
//	private InquilinoDao inquilinoDao;
	@Autowired
	ReloadableResourceBundleMessageSource  messageSource;
	@Autowired
	private PersonaDao personaDao;
//	public List<Feedback> cargarFicheroComunicacionAloDot(ComunicacionAlojamientosDotacionales comunicacionAlojamiento,String numExpediente, Date fechaEntrada) {
//		
//		return validarFicheroComunicacionAloDot(comunicacionAlojamiento);
//	}
//	public List<Feedback> cargarFicheroComunicacionVPPAyto(ComunicacionVPPAyuntamientos comunicacionVPPAyuntamientos,String numExpediente, Date fechaEntrada) {
//		
//		return validarFicheroComunicacionVPPAyto(comunicacionVPPAyuntamientos);
//	}
	
	/**
	 * INICIO FUNCIONES
	 */
	/**
	 * Validar el tipo de fichero
	 */
	public boolean validarTipoFichero(int tipoFichero, String nombre) {
		boolean valido = true;
		String prefijo=nombre.substring(0,2);
		switch (tipoFichero) {
		case AppConstantes.COMUNICACION_VPP_AYUNTAMIENTOS:
			if(!prefijo.equalsIgnoreCase(AppConstantes.COMUNICACION_VPP_AYUNTAMIENTOS_PREFIJO)){
				valido=false;
			}
			break;
		case AppConstantes.CONTRATOS_COMUNICACION_ALOJAMIENTOS_DOTACIONALES:
			if(!prefijo.equalsIgnoreCase(AppConstantes.CONTRATOS_COMUNICACION_ALOJAMIENTOS_DOTACIONALES_PREFIJO)){
				valido=false;
			}
			break;
		case AppConstantes.CONTRATOS_SOLICITUD_CALIFICACION_PROVISIONAL_DEFINITIVA:
			if(!prefijo.equalsIgnoreCase(AppConstantes.CONTRATOS_SOLICITUD_CALIFICACION_PROVISIONAL_DEFINITIVA_PREFIJO)){
				valido=false;
			}
			break;
		default:
			valido=false;
			break;
		}
		
		if (!valido){
			logger.info(nombre + " -> NOMBRE XLS - "
					+ prefijo+ " -> PREFIJO XLS");
			throw new UFException(
					IberErrorsMsgConstants.TIPO_FICHERO_NO_VALIDO);
		}
		return true;
	}
	/**
	 * Validar versi&oacute;n del fichero
	 */
	public boolean validarVersionFichero(int tipoFichero, String version) {
		String versionActual=cargaFicherosDao.getVersionFichero(tipoFichero);
		try{
			version=version.split(" ")[1];
		}catch(Exception e){
			
		}
		
		if (!version.equalsIgnoreCase(versionActual)){
			List <Object> userFriendlyMessageParams = new ArrayList<Object>();
			userFriendlyMessageParams.add(version);
			userFriendlyMessageParams.add(versionActual);
			throw new UFException(
					IberErrorsMsgConstants.VERSION_FICHERO_NO_VALIDO,userFriendlyMessageParams);
		}
		return true;
	}
	/**
	 * Validar el tipo de expediente en funci&oacute;n del tipo de fichero
	 */
	public boolean validarTipoExpediente(int tipoFichero, String numExpediente) {
		
		String tiposDeExpedienteValidos = cargaFicherosDao.tiposDeExpedienteValidos(tipoFichero);
		if (tiposDeExpedienteValidos.indexOf(numExpediente.substring(12, 14))==-1){
			List <Object> userFriendlyMessageParams = new ArrayList<Object>();
			userFriendlyMessageParams.add(tiposDeExpedienteValidos);
			throw new UFException(
					IberErrorsMsgConstants.TIPO_EXPEDIENTE_NO_VALIDO,userFriendlyMessageParams);
		}
		return false;
	}
	/**
	 * Validaci&oacute;n gen&eacute;rica para un contrato de compra
	 * @param listaErroresAvisos
	 * @param numVivienda
	 * @param fecVenta
	 * @param locale
	 */
	public void validarContratoCompra(List<Feedback> listaErroresAvisos,
			String numVivienda,String fecVenta,Locale locale){
		//VALIDAR LA FECHA DE VENTA
		if(fecVenta.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[] {numVivienda}, locale));
			listaErroresAvisos.add(error);
		}else{
			//FORMATO
				SimpleDateFormat format = fecVenta.length()>10?
						DateTimeManager.getTimestampFormat(AppConstantes.ES_LOCALE):
					DateTimeManager.getDateTimeFormat(AppConstantes.ES_LOCALE);
						try {
							format.parse(fecVenta);
						} catch (ParseException e) {
							FeedbackError error = new FeedbackError();
							error.setHoja(AppConstantes.NOM_HOJA_CONTRATOS_COMPRA);
							error.setDato(fecVenta);
							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[] {numVivienda}, locale));
							listaErroresAvisos.add(error);
						}
		}
	}
	/**
	 * Validaci&oacute;n gen&eacute;rica para un contrato de alquiler
	 * @param listaErroresAvisos
	 * @param numVivienda
	 * @param fecIniAlquiler
	 * @param fecFinAlquiler
	 * @param locale
	 */
	public void validarContratoAlquiler(List<Feedback> listaErroresAvisos,
			String numVivienda,String fecIniAlquiler,String fecFinAlquiler,Locale locale){
		//VALIDAR LA FECHA DE INICIO DE ALQUILER
		Date fechaInicio=null;
		Date fechaFin=null;
		SimpleDateFormat format = fecIniAlquiler.length()>10?
				DateTimeManager.getTimestampFormat(AppConstantes.ES_LOCALE):
			DateTimeManager.getDateTimeFormat(AppConstantes.ES_LOCALE);
		if(fecIniAlquiler.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[] {numVivienda}, locale));
			listaErroresAvisos.add(error);
		}else{
			//FORMATO
						try {
							fechaInicio=format.parse(fecIniAlquiler);
						} catch (ParseException e) {
							listaErroresAvisos.add(generarErrorFormatoFecha(AppConstantes.NOM_HOJA_CONTRATOS_ALQUILER, 
									"error.importar.xls.contrato.alquiler.fechainicio",
									numVivienda, fecIniAlquiler,locale));
						}
		}
		//VALIDAR LA FECHA DE FIN DE ALQUILER 
		if(fecFinAlquiler.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[] {numVivienda}, locale));
			listaErroresAvisos.add(error);
		}else{
			//FORMATO
				
						try {
							fechaFin=format.parse(fecFinAlquiler);
						} catch (ParseException e) {
							listaErroresAvisos.add(generarErrorFormatoFecha(AppConstantes.NOM_HOJA_CONTRATOS_ALQUILER, 
									"error.importar.xls.contrato.alquiler.fechafin",
									numVivienda,fecFinAlquiler, 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[] {numVivienda,format.format(fechaFin),format.format(fechaInicio)}, locale));
				listaErroresAvisos.add(error);
			}
		} 
	}
	/**
	 * Validar Datos del titular de un contrato
	 * @param listaErroresAvisos
	 * @param titulares
	 * @param nomHoja
	 * @param numVivienda
	 * @param nif
	 * @param nombre
	 * @param ap1
	 * @param ap2
	 * @param locale
	 */
	public void validarDatosTitular(List<Feedback> listaErroresAvisos,List<String> titulares,String nomHoja,String numVivienda,
			String nif,String nombre,String ap1, String ap2,Locale locale){
		if(!ValidadorNIF.checkNif(nif)){
			FeedbackError error = new FeedbackError();
			error.setHoja(nomHoja);
			error.setElemento(messageSource.getMessage("error.importar.xls.titular.nif", new Object[] {numVivienda}, locale));
			error.setDato(nif);
			error.setDescripcion(messageSource.getMessage("error.importar.xls.titular.nif.no.valid", 
					new Object[] {nif,numVivienda}, locale));
			listaErroresAvisos.add(error);
			return;
		}else{ 
			//NOMBRE
			if(nombre.trim().length()==0){
				FeedbackError error = new FeedbackError();
				error.setHoja(nomHoja);
				error.setElemento(messageSource.getMessage("error.importar.xls.titular.nombre", new Object[] {nif,numVivienda}, locale));
				error.setDescripcion(messageSource.getMessage("error.importar.xls.titular.nombre.obligatorio", new Object[] {nif,numVivienda}, locale));
				listaErroresAvisos.add(error);
			}else{
				if (nombre.trim().length()>AppConstantes.SIZE_NOMBRE){
					listaErroresAvisos.add(generarAvisoTXTSize(
							nomHoja
							,"error.importar.xls.titular.nombre",new Object[] {nif,numVivienda},
							nombre,
							AppConstantes.SIZE_NOMBRE, locale));
				}
					
			}
			if(ValidadorNIF.getTipoNIF(nif)==TipoClave.DNI){
				if(ap1.trim().length()==0){
					FeedbackError error = new FeedbackError();
					error.setHoja(nomHoja);
					error.setElemento(messageSource.getMessage("error.importar.xls.titular.apel1", new Object[] {nif,numVivienda}, locale));
					error.setDescripcion(messageSource.getMessage("error.importar.xls.titular.apel1.obligatorio", new Object[] {nif,numVivienda}, locale));
					listaErroresAvisos.add(error);
				}else{
					if (ap1.trim().length()>AppConstantes.SIZE_AP1_AP2){
						listaErroresAvisos.add(generarAvisoTXTSize(
								nomHoja
								,"error.importar.xls.titular.apel1",new Object[] {nif,numVivienda},
								ap1,
								AppConstantes.SIZE_AP1_AP2, locale));
					}
						
				}
				if(ap2.trim().length()==0){
					FeedbackError error = new FeedbackError();
					error.setHoja(nomHoja);
					error.setElemento(messageSource.getMessage("error.importar.xls.titular.apel2", new Object[] {nif,numVivienda}, locale));
					error.setDescripcion(messageSource.getMessage("error.importar.xls.titular.apel2.obligatorio", new Object[] {nif,numVivienda}, locale));
					listaErroresAvisos.add(error);
				}else{
					if (ap2.trim().length()>AppConstantes.SIZE_AP1_AP2){
						listaErroresAvisos.add(generarAvisoTXTSize(
								nomHoja
								,"error.importar.xls.titular.apel2",new Object[] {nif,numVivienda},
								ap2,
								AppConstantes.SIZE_AP1_AP2, locale));
					}
						
				}
			}
			//validar nif repetido en contrato
			if (titulares.contains(nif)){
				FeedbackError error = new FeedbackError();
				error.setHoja(nomHoja);
				error.setElemento(messageSource.getMessage("error.importar.xls.titular.nif", new Object[] {numVivienda}, locale));
				error.setDescripcion(messageSource.getMessage("error.importar.xls.titular.repetido", new Object[] {nif,numVivienda}, locale));
				listaErroresAvisos.add(error);
			}else{
				titulares.add(nif);
			}
			//si el titular no existe dar un aviso
			if(personaDao.findByNIF(nif)==null) {
				listaErroresAvisos.add(generarAviso(
						nomHoja
						,"error.importar.xls.titular.nif", new Object[] {numVivienda},
						nif,
						"error.importar.xls.titular.no.existe",new Object[] {nif,numVivienda},
						locale));
			}
		}
	}
	//GENERACIÓN DE AVISOS
	/**
	 * 
	 * @param hoja
	 * @param i18nElemento
	 * @param dato
	 * @param maxLength
	 * @param locale
	 * @return
	 */
	public FeedbackAviso generarAviso(String hoja,
			String i18nElemento,Object[] i18nElementoArgs,
			String dato,
			String i18nDescripcion,Object[] i18nDescripcionArgs,
			Locale locale){
		FeedbackAviso aviso = new FeedbackAviso();
		aviso.setHoja(hoja);
		aviso.setElemento(messageSource.getMessage(i18nElemento, i18nElementoArgs, locale));
		aviso.setDato(dato==null?"":dato);
		aviso.setDescripcion(messageSource.getMessage(i18nDescripcion,i18nDescripcionArgs, locale));
		return aviso;
	}
	/**
	 * 
	 * @param hoja
	 * @param i18nElemento
	 * @param dato
	 * @param maxLength
	 * @param locale
	 * @return
	 */
	public FeedbackAviso generarAvisoTXTSize(String hoja,String i18nElemento,Object[] i18nElementoArgs,String dato,int maxLength,Locale locale){
		FeedbackAviso aviso = new FeedbackAviso();
		aviso.setHoja(hoja);
		aviso.setElemento(messageSource.getMessage(i18nElemento, i18nElementoArgs, locale));
		aviso.setDato(dato==null?"":dato);
		aviso.setDescripcion(messageSource.getMessage("error.importar.xls.generico.maxlength", 
				new Object[] {aviso.getElemento(),dato.substring(0,	maxLength)}, locale));
		return aviso;
	}
	//GENERACIÓN DE ERRORES
	/**
	 * 
	 * @param hoja
	 * @param i18nElemento
	 * @param numVivienda
	 * @param locale
	 * @return
	 */
	public FeedbackError generarErrorFormatoFecha(String hoja,String i18nElemento,String numVivienda,String fechaIncorrecta,Locale locale){
		FeedbackError error = new FeedbackError();
		error.setHoja(hoja);
		error.setElemento(messageSource.getMessage(i18nElemento, null, locale));
		error.setDato(fechaIncorrecta);
		error.setDescripcion(messageSource.getMessage("error.importar.xls.generico.formatofecha", 
				new Object[] {error.getElemento(),numVivienda}, locale));
		return error;
	}
	/**
	 * 
	 * @param hoja
	 * @param i18nElemento
	 * @param locale
	 * @return
	 */
	public FeedbackError generarError(String hoja,String i18nElemento,String dato
			,Object[] i18nElementoArgs,Object[] i18nDescripcionArgs,String i18nError,Locale locale){
		FeedbackError error = new FeedbackError();
		error.setHoja(hoja);
		error.setElemento(messageSource.getMessage(i18nElemento, i18nElementoArgs, locale));
		error.setDato(dato==null?"":dato);
		error.setDescripcion(messageSource.getMessage(i18nError,i18nDescripcionArgs, locale));
		return error;
	}
	/**
	 * 
	 * @param hoja
	 * @param i18nElemento
	 * @param locale
	 * @return
	 */
	public FeedbackError generarError(String hoja,String i18nElemento,String i18nError,Locale locale){
		FeedbackError error = new FeedbackError();
		error.setHoja(hoja);
		error.setElemento(messageSource.getMessage(i18nElemento, null, locale));
		error.setDato("");
		error.setDescripcion(messageSource.getMessage(i18nError,null, locale));
		return error;
	}
	/**
	 * 
	 * @param hoja
	 * @param i18nElemento
	 * @param locale
	 * @return
	 */
	public FeedbackError generarErrorObligatorio(String hoja,String i18nElemento,Locale locale){
		FeedbackError error = new FeedbackError();
		error.setHoja(hoja);
		error.setElemento(messageSource.getMessage(i18nElemento, null, locale));
		error.setDato("");
		error.setDescripcion(messageSource.getMessage("error.importar.xls.generico.obligatorio",null, locale));
		return error;
	}
	/**
	 * 
	 * @param hoja
	 * @param i18nElemento
	 * @param locale
	 * @return
	 */
	public FeedbackError generarErrorObligatorioViv(
			String hoja,String i18nElemento,Object[] i18nElementoArgs,String i18nDescripcion,Object[] i18nDescripcionArgs,Locale locale){
		FeedbackError error = new FeedbackError();
		error.setHoja(hoja);
		error.setElemento(messageSource.getMessage(i18nElemento, i18nElementoArgs, locale));
		error.setDato("");
		error.setDescripcion(messageSource.getMessage(i18nDescripcion,i18nDescripcionArgs, locale));
		return error;
	}
	public String getTXTWithSizeOk(String txt,int maxlength){
		if (maxlength<txt.length()){
			return txt.substring(0,maxlength);
		}
		return txt;
	}
	public Persona addPersonaIfNoExists(String dni,String nombre,String ap1,String ap2){
		Persona persona=personaDao.findByNIF(dni);
		//comprobar si exise el titular
		if(persona==null){
			persona=new Persona();
			persona.setTipoCodigoId(new TipoClave(ValidadorNIF.getTipoNIF(dni)));
			persona.setCodigoId(dni);
			persona.setNombre(getTXTWithSizeOk(nombre,AppConstantes.SIZE_NOMBRE));
			persona.setApellido1(getTXTWithSizeOk(ap1,AppConstantes.SIZE_AP1_AP2));
			persona.setApellido2(getTXTWithSizeOk(ap2,AppConstantes.SIZE_AP1_AP2));
			personaDao.add(persona);
			persona=personaDao.findByNIF(dni);
		}
		return persona;
	}
//	//1-CARGA FICHERO SOLICITUD DE CALIF PROVIS DEFINITIVA
//	public List<Feedback> cargarFicheroContratosSolicCalifDef(SolicitudCalificacionProvisional solicitudCalificacionProvisional,
//			String numExpediente, Date fechaEntrada) throws ParseException {
//		List<Feedback> listaErroresAvisos = validarContratosSolicCalifDef(solicitudCalificacionProvisional,numExpediente);
//		if (listaErroresAvisos.size()==0){
//			insertarDatosContratosSolicCalifDef(solicitudCalificacionProvisional,numExpediente,fechaEntrada);
//		}
//		return listaErroresAvisos;
//	}
	
//	//1.1-VALIDAR CONTRATOS COMPRAVENTA SOLICITUD DE CALIF PROVIS DEFINITIVA
//	private void validarContratoCompraVenta(List<Feedback> listaErroresAvisos,List<ContratoCompraVenta> contratos,String numExpediente,Locale locale){
//		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){
//				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 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.2-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){
//		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){
//				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 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(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(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 (com.ejie.m62fb.model.jaxb.solicitudCalifProv.SolicitudCalificacionProvisional.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(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(generarAvisoTXTSize(
//										AppConstantes.NOM_HOJA_CONTRATOS_ALQUILER
//										,"error.importar.xls.titular.apel2",
//										titular.getApellido2(),
//										AppConstantes.SIZE_AP1_AP2, locale));
//							}
//								
//						}
//					}
//				}
//			}
//		}
//	}
//	private List<Feedback> validarContratosSolicCalifDef(SolicitudCalificacionProvisional solicitudCalificacionProvicional,String numExpediente){
//		Locale locale = LocaleContextHolder.getLocale();
//		List<Feedback> listaErroresAvisos=new ArrayList<Feedback>();
//		//INICIO CONTRATO COMPRAVENTA
//		validarContratoCompraVenta(listaErroresAvisos,solicitudCalificacionProvicional.getContratosCompraVenta().getContratoCompraVenta(),numExpediente,locale);
//		//FIN CONTRATO COMPRAVENTA
//		//INICIO CONTRATO ALQUILER
//		validarContratoAlquiler(listaErroresAvisos,solicitudCalificacionProvicional.getContratosAlquiler().getContratoAlquiler(),numExpediente,locale);
//		//FIN CONTRATO ALQUILER
//		return listaErroresAvisos;
//	}
//	private List<Feedback> validarFicheroComunicacionAloDot(ComunicacionAlojamientosDotacionales comunicacionAlojamientosDotacionales){
//		Locale locale = LocaleContextHolder.getLocale();
//		List<Feedback> listaErroresAvisos=new ArrayList<Feedback>();
//		
//		return listaErroresAvisos;
//	}
//	private List<Feedback> validarFicheroComunicacionVPPAyto(ComunicacionVPPAyuntamientos comunicacionVPPAyuntamientos){
//		Locale locale = LocaleContextHolder.getLocale();
//		List<Feedback> listaErroresAvisos=new ArrayList<Feedback>();
//		
//		return listaErroresAvisos;
//	}
//	
//	public void insertarDatosContratosSolicCalifDef(
//			SolicitudCalificacionProvisional solicitudCalificacionProvisional,
//			String numExpediente,Date fechaEntradaContrato) throws ParseException{
//		for (ContratoCompraVenta contratoXML  : solicitudCalificacionProvisional.getContratosCompraVenta().getContratoCompraVenta()) {
//			ContratoVivienda contratoVivienda=new ContratoVivienda();
//			//VIVIENDA + GARAJE + TRASTERO
//			Alojamiento alojamiento= getDatosAlojamiento(solicitudCalificacionProvisional,contratoXML.getNumVivienda());
//			//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
//			if(alojamiento!=null){
//				contratoVivienda.setIndVivAdaptada(new TipoSiNo(alojamiento.getAdaptado()));
//			}else{
//				contratoVivienda.setIndVivAdaptada(new TipoSiNo(BDUtils.FALSE));
//			}	
//			BigDecimal numPropieterio=contratoViviendaDao.findNumPropietarioMaxMasUno(vivienda.getNumVivienda());
//			contratoVivienda=contratoViviendaDao.add(contratoVivienda);
//			for (Titular titular : contratoXML.getTitular()) {
//				Propietario propietario=new Propietario(numPropieterio);
//				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(titular.getNombre());
//					persona.setApellido1(titular.getApellido1());
//					persona.setApellido2(titular.getApellido2());
//					personaDao.add(persona);
//					persona=personaDao.findByNIF(titular.getDNI());
//				}
//				propietario.setVivienda(vivienda);
//				propietario.setExpedienteVivienda(expedienteVivienda);
//				propietario.setPersona(persona);
//				propietario.setIndTitular(new TipoSiNo(BDUtils.TRUE));
//				propietario.setPorTitularidad(BigDecimal.valueOf(100/contratoXML.getTitular().size()));
//				propietarioDao.add(propietario);
//			}
//		}
//		for (ContratoAlquiler contratoXML  : solicitudCalificacionProvisional.getContratosAlquiler().getContratoAlquiler()) {
//			com.ejie.m62fb.model.ContratoAlquiler contratoAlquiler=new com.ejie.m62fb.model.ContratoAlquiler();
//			//VIVIENDA + GARAJE + TRASTERO
//			Alojamiento alojamiento= getDatosAlojamiento(solicitudCalificacionProvisional,contratoXML.getNumVivienda());
//			//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(vivienda);
//			//FEC_ENT_CONTRATO  -> Fecha entrada que se ha introducido al comienzo de la carga
//			contratoAlquiler.setFecEntContrato(fechaEntradaContrato);
//			//COD_TIPO_TRANS = 1 PRIMERA
//			//contratoVivienda.setTipoTransmision(new TipoTransmision(TipoTransmision.PRIMERA));
//			//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
//			if(alojamiento!=null){
//				contratoAlquiler.setIndVivAdaptada(new TipoSiNo(alojamiento.getAdaptado()));
//			}else{
//				contratoAlquiler.setIndVivAdaptada(new TipoSiNo(BDUtils.FALSE));
//			}	
//			BigDecimal numInquilino=contratoAlquilerDao.findNumInquilinoMaxMasUno(vivienda.getNumVivienda());
//			contratoAlquiler=contratoAlquilerDao.add(contratoAlquiler);
//			for (com.ejie.m62fb.model.jaxb.solicitudCalifProv.SolicitudCalificacionProvisional.ContratosAlquiler.ContratoAlquiler.Titular 
//					titular : contratoXML.getTitular()) {
//				Inquilino inquilino=new Inquilino(numInquilino);
//				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(titular.getNombre());
//					persona.setApellido1(titular.getApellido1());
//					persona.setApellido2(titular.getApellido2());
//					personaDao.add(persona);
//				}
//				inquilino.setVivienda(vivienda);
//				inquilino.setExpedienteVivienda(expedienteVivienda);
//				inquilino.setPersona(persona);
//				inquilinoDao.add(inquilino);
//			}
//		}
//	}
//	private Alojamiento getDatosAlojamiento(SolicitudCalificacionProvisional solicitudCalificacionProvisional, String numVivienda){
//		for (AlojamientoGeneral alojamiento : solicitudCalificacionProvisional.getViviendas().getAlojamientos().getAlojamientoGeneral()) {
//			if (alojamiento.getNumVivienda().equalsIgnoreCase(numVivienda)){
//				return alojamiento.getAlojamiento();
//			}
//		}
//		return null;
//	}
}

	