package com.ejie.ad74a.tareas.service;

import java.util.Date;
import java.util.List;

import org.apache.commons.collections4.CollectionUtils;
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.ad74a.dao.DocTemporalesDao;
import com.ejie.ad74a.dao.ExpedientesDao;
import com.ejie.ad74a.dao.MaestroTiposDocDao;
import com.ejie.ad74a.dao.comun.NoraDaoImpl;
import com.ejie.ad74a.exceptions.ManagerErrors;
import com.ejie.ad74a.jms.util.ModelApplicationParser;
import com.ejie.ad74a.model.Direcciones;
import com.ejie.ad74a.model.DocTemporales;
import com.ejie.ad74a.model.DocumentosTarea;
import com.ejie.ad74a.model.Expedientes;
import com.ejie.ad74a.model.MaestroTiposDoc;
import com.ejie.ad74a.model.NotifPostales;
import com.ejie.ad74a.model.TareasTramite;
import com.ejie.ad74a.model.comun.Localidad;
import com.ejie.ad74a.model.comun.Municipio;
import com.ejie.ad74a.model.comun.Pais;
import com.ejie.ad74a.model.comun.Portal;
import com.ejie.ad74a.model.comun.Provincia;
import com.ejie.ad74a.service.NotifPostalesService;
import com.ejie.ad74a.service.TareasTramiteService;
import com.ejie.ad74a.service.tramitacion.TramitacionService;
import com.ejie.ad74a.util.comun.UtilLiterales;
import com.ejie.ad74a.util.comun.Utilidades;
import com.ejie.ad74a.util.comun.UtilidadesFecha;
import com.ejie.ad74a.util.constantes.Constantes;
import com.ejie.ad74a.util.constantes.TareasEnum;
import com.ejie.ad74a.util.constantes.TipoNotificacionComunicacionEnum;
import com.ejie.ad74a.util.documentos.DocumentosPlateaUtils;
import com.ejie.ad74a.ws.client.platea.model.task.Notification;
import com.ejie.ad74a.ws.client.platea.model.task.Task;
import com.ejie.ad74a.ws.client.platea.service.PlateaService;
import com.ejie.ad74a.ws.client.platea.tareasTramitacion.TBoolean;
import com.ejie.ad74a.ws.client.platea.tareasTramitacion.TDocNatureType;
import com.ejie.ad74a.ws.client.platea.tareasTramitacion.TLanguage;
import com.ejie.ad74a.ws.client.platea.tareasTramitacion.TNotice;
import com.ejie.ad74a.ws.client.platea.tareasTramitacion.TNoticeChannel;
import com.ejie.ad74a.ws.client.platea.tareasTramitacion.TNoticeList;
import com.ejie.ad74a.ws.client.platea.tareasTramitacion.TNoticeType;
import com.ejie.ad74a.ws.client.platea.tareasTramitacion.TNotification;
import com.ejie.ad74a.ws.client.platea.tareasTramitacion.TNotificationList;
import com.ejie.ad74a.ws.client.platea.tareasTramitacion.TNotificationType;
import com.ejie.ad74a.ws.client.platea.tareasTramitacion.TNotify;
import com.ejie.ad74a.ws.client.platea.tareasTramitacion.TNotifyChannel;
import com.ejie.ad74a.ws.client.platea.tareasTramitacion.TParticipantType;
import com.ejie.ad74a.ws.client.platea.tareasTramitacion.TPersonIDName;
import com.ejie.ad74a.ws.client.platea.tareasTramitacion.TSignWhoType;
import com.ejie.ad74a.ws.client.platea.tareasTramitacion.TTask;
import com.ejie.ad74a.ws.client.platea.tareasTramitacion.TTaskInfoDocument;
import com.ejie.ad74a.ws.client.platea.tareasTramitacion.TTaskInfoDocumentList;
import com.ejie.ad74a.ws.client.platea.tareasTramitacion.TTaskNotification;
import com.ejie.ad74a.ws.client.platea.tareasTramitacion.TTaskType;
import com.ejie.x38.dto.TableRequestDto;

/**
 * Gestión de la Tarea solicitud informe intervencion
 * 
 * @author IBERMATICA
 */

@Service(value = "tareaComunicacionInformeService")
public class TareaComunicacionInformeServiceImpl implements TareaComunicacionInformeService {

	private static final String LITERAL_INFORME_INTERVENCION = "informe.intervencion";

	private static final Logger logger = LoggerFactory.getLogger(TareaComunicacionInformeServiceImpl.class);

	@Autowired
	private TramitacionService tramitacionService;

	@Autowired
	private PlateaService plateaService;

	@Autowired
	private ExpedientesDao expedientesDao;

	@Autowired
	private DocTemporalesDao docTemporalesDao;

	@Autowired
	private MaestroTiposDocDao maestroTiposDocDao;

	@Autowired
	private NotifPostalesService notifPostalesService;

	@Autowired
	private TareasTramiteService tareasTramiteService;

	@Autowired
	private ReloadableResourceBundleMessageSource appMessageSource;

	/**
	 * Método que gestiona el evento de Tarea Sugerida
	 * 
	 */
	public void tareaSugerida(Task task) throws Throwable {
		TareaComunicacionInformeServiceImpl.logger
				.info("tareaComunicacionInformeServiceImpl.tareaSugerida -" + task.getMailboxTaskID() + "- inicio ");

		String numRegistro = ModelApplicationParser.getNumRegistryFromTask(task);

		Expedientes expediente = new Expedientes();
		expediente.setFolderId00(task.getFolderID());
		List<Expedientes> listaExpedientes = expedientesDao.findAll(expediente, null);

		if (null != listaExpedientes && listaExpedientes.size() > 0) {
			expediente = listaExpedientes.get(0);
		} else {
			ManagerErrors.manageError(
					"Error al sugerir la tarea de paso a desistimiento: no se ha encontrado el expediente FolderId: "
							+ task.getFolderID());
		}

		// almacenamos el tramite y la tarea
		this.tramitacionService.tratamientoTramiteTareaSugerida(task, numRegistro, expediente);

		// ** Ejecutar de forma Automática **/
		this.ejecutarTareaAutomatica(task.getMailboxTaskID());

		TareaComunicacionInformeServiceImpl.logger
				.info("tareaComunicacionInformeServiceImpl.tareaSugerida -" + task.getMailboxTaskID() + "- fin ");
	}

	/**
	 * Método que gestiona el evento de Tarea Ejecutada
	 */
	public void tareaEjecutada(Task task) throws Throwable {
		TareaComunicacionInformeServiceImpl.logger
				.info("tareaComunicacionInformeServiceImpl.tareaEjecutada -" + task.getMailboxTaskID() + "- inicio ");

		// ** Actualizar trámite y tarea **/
		this.tramitacionService.tratamientoTramiteTareaEjecutada(task, false);

		/*
		 * Si la comunicación es postal, se requiere guardar registro aparte en el
		 * mantenimiento de comunicaciones/notificaciones postales
		 */
		comunicacionPostalEjecutada(task);

		// sugerir tramite de cierre
		this.tramitacionService.sugerirTarea(task, TareasEnum.CIERRE);

		TareaComunicacionInformeServiceImpl.logger
				.info("tareaComunicacionInformeServiceImpl.tareaEjecutada -" + task.getMailboxTaskID() + "- fin ");
	}

	/**
	 * Preparación de la tarea
	 */
	public TTask prepararTarea(String taskGUID) throws Throwable {
		TareaComunicacionInformeServiceImpl.logger
				.info("tareaComunicacionInformeServiceImpl.prepararTarea -" + taskGUID + "- inicio ");

		TTask task = plateaService.prepareTask(taskGUID, TTaskType.GENERICA);

		TareaComunicacionInformeServiceImpl.logger
				.info("tareaComunicacionInformeServiceImpl.prepararTarea -" + task.getTaskGUID() + "- fin ");

		return task;
	}

	/**
	 * Ejecución de la tarea
	 */
	public TTask ejecutarTarea(TTask tTask) throws Throwable {
		TareaComunicacionInformeServiceImpl.logger
				.info("tareaComunicacionInformeServiceImpl.prepararTarea -" + tTask.getTaskGUID() + "- inicio ");

		asignarDocumento(tTask);

		tTask = plateaService.doTask(TareasEnum.getTaskType(tTask.getTaskID()), tTask);

		TareaComunicacionInformeServiceImpl.logger
				.info("tareaComunicacionInformeServiceImpl.prepararTarea -" + tTask.getTaskGUID() + "- fin ");

		return tTask;
	}

	private void asignarDocumento(TTask tTask) throws Exception {
		TareaComunicacionInformeServiceImpl.logger
				.info("tareaComunicacionInformeServiceImpl.asignarDocumento -  inicio ");
		if (tTask.getTaskNotification() == null) {
			tTask.setTaskNotification(new TTaskNotification());
		}
		if (tTask.getTaskNotification().getDocumentList() == null) {
			tTask.getTaskNotification().setDocumentList(new TTaskInfoDocumentList());
		}

		Expedientes expediente = new Expedientes();
		expediente.setFolderId00(tTask.getFolderID());
		List<Expedientes> listaExpedientes = expedientesDao.findAll(expediente, null);

		if (null != listaExpedientes && !listaExpedientes.isEmpty()) {
			expediente = listaExpedientes.get(0);
			expediente = expedientesDao.find(expediente);
		} else {
			ManagerErrors.manageError("No se ha encontrado en BBDD el expediente con el folderId: "
					+ tTask.getFolderID() + " a la hora de procesar la tarea de comunicacion.");
		}

		DocumentosTarea doc = this.recuperarDocTemporal(tTask.getFolderID());
		if (doc != null) {
			TareaComunicacionInformeServiceImpl.logger.info(
					"tareaComunicacionInformeServiceImpl.asignarDocumento -  doc encontrado: " + doc.getOiddokusi18());

			/* ### TTaskInfoDocument INICIO ### */
			TTaskInfoDocument docPlatea = new TTaskInfoDocument();
			docPlatea.setDokusiID(doc.getOiddokusi18());
			docPlatea.setDocumentRoleID(doc.getMaestroTiposDoc().getRoleid36());
			docPlatea.setDocumentRoleName(DocumentosPlateaUtils.setValueToText(doc.getMaestroTiposDoc().getDescEs36(),
					doc.getMaestroTiposDoc().getDescEu36()));
			String[] auxNomFic = doc.getNombreDoc18().split("\\.");
			docPlatea.setSourceName(doc.getNombreDoc18());
			docPlatea.setExtension(auxNomFic[auxNomFic.length - 1]);
			docPlatea.setFormatName(auxNomFic[auxNomFic.length - 1]);
			docPlatea.setNature(TDocNatureType.ELECTRONICO);
			docPlatea.setLanguage(TLanguage.BI);
			docPlatea.setIsNotifiDocument(TBoolean.TRUE);
			Date fechaDoc = null;
			if (null != doc.getfModif18()) {
				fechaDoc = doc.getfModif18();
			} else if (null != doc.getfModif18()) {
				fechaDoc = doc.getfAlta18();
			} else {
				fechaDoc = UtilidadesFecha.getFechaSistema();
			}

			docPlatea.setDocumentDate(UtilidadesFecha.formatearDateToStringMasc(fechaDoc,
					com.ejie.ad74a.constantes.Constantes.PLATEA_XML_EVENTS_DATE_FORMAT));
			docPlatea.setValidDate(UtilidadesFecha.formatearDateToStringMasc(fechaDoc,
					com.ejie.ad74a.constantes.Constantes.PLATEA_XML_EVENTS_DATE_FORMAT));

			/* ### TTaskInfoDocument FIN ### */

			/* ### TNotify INICIO ### */
			TNotify notify = new TNotify();

			if (expediente.getIdentificadorRep00() != null) {
				notify.setAddresseeID(expediente.getIdentificadorRep00());
				// personID.setID(expediente.getIdentificadorRep00());
				notify.setAddresseeName(expediente.getNombreCompletoRep());
				// personID.setName(expediente.getNombreCompletoRep());

			} else {
				notify.setAddresseeID(expediente.getSolicitantes().getIdentificador01());
				// personID.setID(expediente.getSolicitantes().getIdentificador01());
				notify.setAddresseeName(expediente.getSolicitantes().getNombreCompleto());
				// personID.setName(expediente.getSolicitantes().getNombreCompleto());
			}

			TNotifyChannel notChanel = new TNotifyChannel();
			if (expediente.getIdTipoNot00().equalsIgnoreCase(Constantes.TipoNotificacion.TELEMATICA)) {
				notChanel.setChannelType(TNotificationType.ELECTRONICA);
				notify.setChannel(notChanel);
			} else if (expediente.getIdTipoNot00().equalsIgnoreCase(Constantes.TipoNotificacion.POSTAL)) {
				notChanel.setChannelType(TNotificationType.POSTAL);
				notChanel.setPostal(getPostalAddress(expediente.getDireccionNotif()));
				notify.setChannel(notChanel);
			}
			/* ### TNotify FIN ### */

			/* ### NOTIFICATION INICIO ### */
			TNotification not = new TNotification();

			if (expediente.getIdentificadorRep00() != null) {
				not.setRoleName(TParticipantType.RECLAMANTE);

			} else {
				not.setRoleName(TParticipantType.SOLICITANTE);
			}

			not.setNotify(notify);
			if (expediente.getIdiomaNot00().equalsIgnoreCase(Constantes.EUSKARA)) {
				not.setLanguage(TLanguage.EU);
			} else if (expediente.getIdiomaNot00().equalsIgnoreCase(Constantes.CASTELLANO)) {
				not.setLanguage(TLanguage.ES);
			}

			TPersonIDName personID = new TPersonIDName();
			personID.setName(expediente.getSolicitantes().getNombreCompleto());
			personID.setID(expediente.getSolicitantes().getIdentificador01());
			not.setPersonID(personID);

			TNotificationList notList = new TNotificationList();
			notList.getNotification().add(not);
			tTask.getTaskNotification().setNotificationList(notList);
			/* ### NOTIFICATION FIN ### */

			/* ### TNoticeList INICIO ### */
			TNoticeList tNoticeList = new TNoticeList();
			if (Constantes.CanalNotificacion.CANAL_NOTIF_ALL.equals(expediente.getCanalNot00())
					|| Constantes.CanalNotificacion.CANAL_NOTIF_MAIL.equals(expediente.getCanalNot00())) {
				TNotice tNotice = new TNotice();
				TNoticeChannel tNoticeChannel = new TNoticeChannel();
				tNoticeChannel.setChannelType(TNoticeType.EMAIL);
				tNoticeChannel.setEmail(expediente.getEmailNot00());
				tNotice.setChannel(tNoticeChannel);
				tNotice.setAddresseeID(expediente.getSolicitantes().getIdentificador01());
				tNotice.setAddresseeName(expediente.getSolicitantes().getNombreCompleto());
				tNoticeList.getNotice().add(tNotice);

			}
			if (Constantes.CanalNotificacion.CANAL_NOTIF_ALL.equals(expediente.getCanalNot00())
					|| Constantes.CanalNotificacion.CANAL_NOTIF_SMS.equals(expediente.getCanalNot00())) {
				TNotice tNotice = new TNotice();
				tNotice.setAddresseeID(expediente.getSolicitantes().getIdentificador01());
				tNotice.setAddresseeName(expediente.getSolicitantes().getNombreCompleto());
				TNoticeChannel tNoticeChannel = new TNoticeChannel();
				tNoticeChannel.setChannelType(TNoticeType.SMS);
				tNoticeChannel.setSms(expediente.getTfnoNot00());
				tNotice.setChannel(tNoticeChannel);
				tNoticeList.getNotice().add(tNotice);
			}
			tTask.getTaskNotification().setNoticeList(tNoticeList);
			/* ### TNoticeList FIN ### */

			tTask.getTaskNotification().getDocumentList().getDocument().add(docPlatea);

			tTask.getTaskNotification().setDocumentOID(doc.getOiddokusi18());

			if (expediente.getIdTipoNot00().equalsIgnoreCase(Constantes.TipoNotificacion.TELEMATICA)) {
				tTask.getTaskNotification().setNotificationFormat(TNotificationType.ELECTRONICA);
			} else if (expediente.getIdTipoNot00().equalsIgnoreCase(Constantes.TipoNotificacion.POSTAL)) {
				tTask.getTaskNotification().setNotificationFormat(TNotificationType.POSTAL);
			}

			if (expediente.getIdiomaNot00().equalsIgnoreCase(Constantes.EUSKARA)) {
				tTask.getTaskNotification().setNotificationLanguage(TLanguage.EU);
			} else if (expediente.getIdiomaNot00().equalsIgnoreCase(Constantes.CASTELLANO)) {
				tTask.getTaskNotification().setNotificationLanguage(TLanguage.ES);
			}
			tTask.getTaskNotification().setNotifiedActID(Constantes.NOTIFIEDACT_ID_COMUNICATION);
			tTask.getTaskNotification()
					.setNotificationText(DocumentosPlateaUtils.setValueToText(
							UtilLiterales.getLiteralMessage(appMessageSource,
									com.ejie.ad74a.constantes.Constantes.LOCALE_ES, LITERAL_INFORME_INTERVENCION),
							UtilLiterales.getLiteralMessage(appMessageSource,
									com.ejie.ad74a.constantes.Constantes.LOCALE_EU, LITERAL_INFORME_INTERVENCION)));
			tTask.getTaskNotification().setOrganizationID(Constantes.PLATEA_ENTITY_ID);
			tTask.getTaskNotification().setOrganizationName(DocumentosPlateaUtils
					.setValueToText(Constantes.PLATEA_ENTITY_NAME_ES, Constantes.PLATEA_ENTITY_NAME_EU));
			tTask.getTaskNotification()
					.setNotifiedActName(DocumentosPlateaUtils.setValueToText(
							UtilLiterales.getLiteralMessage(appMessageSource,
									com.ejie.ad74a.constantes.Constantes.LOCALE_ES, LITERAL_INFORME_INTERVENCION),
							UtilLiterales.getLiteralMessage(appMessageSource,
									com.ejie.ad74a.constantes.Constantes.LOCALE_EU, LITERAL_INFORME_INTERVENCION)));
			tTask.getTaskNotification().setSignType(TSignWhoType.SERVIDOR);
			tTask.getTaskNotification().setCertificateID(Constantes.plateaCertificateID);
			tTask.getTaskNotification().setIsAllowAttachCitizenDocuments(TBoolean.FALSE);
			tTask.getTaskNotification().setAddresseeID(personID);
			this.borrarDocTemporal(tTask);

		}
		TareaComunicacionInformeServiceImpl.logger.info("tareaComunicacionInformeServiceImpl.asignarDocumento -  fin ");
	}

	/**
	 * Ejecución de la tarea de forma automática
	 */
	@Override
	public TTask ejecutarTareaAutomatica(String taskGUID) throws Throwable {
		TareaComunicacionInformeServiceImpl.logger
				.info("tareaComunicacionInformeServiceImpl.ejecutarTareaAutomatica -" + taskGUID + "- inicio ");

		TTask tTask = this.prepararTarea(taskGUID);

		// Automática
		tTask.setSenderID(TareasUtils.getSenderIdAutomatico());

		tTask = this.ejecutarTarea(tTask);

		TareaComunicacionInformeServiceImpl.logger.info("tareaComunicacionInformeServiceImpl.ejecutarTareaAutomatica -"
				+ tTask.getMailboxTaskID() + "-" + taskGUID + "- fin ");

		return tTask;
	}

	/**
	 * Borrar el primer documento asociado al expediente de la tarea
	 * 
	 * @param task
	 */
	private void borrarDocTemporal(TTask task) {
		TareaComunicacionInformeServiceImpl.logger
				.info("TareaComunicacionInformeServiceImpl.borrarDocTemporal -" + task.getFolderID());
		DocTemporales docTemporal = new DocTemporales();
		docTemporal.setFolderId72(task.getFolderID());
		TableRequestDto tableRequestDto = new TableRequestDto();
		tableRequestDto.setSidx("IDDOCTEMPORAL72");
		tableRequestDto.setSord("asc");
		docTemporal = this.docTemporalesDao.findAll(docTemporal, tableRequestDto).get(0);
		this.docTemporalesDao.remove(docTemporal);
		TareaComunicacionInformeServiceImpl.logger.info("TareaComunicacionInformeServiceImpl.borrarDocTemporal FIN ");
	}

	/**
	 * REcupera el documento Temporal
	 * 
	 * @param tTask Task con los datos de la tarea
	 * @return DocumentoTarea a aportar
	 */
	private DocumentosTarea recuperarDocTemporal(String folderID) {
		TareaComunicacionInformeServiceImpl.logger
				.info("TareaComunicacionInformeServiceImpl.recuperarDocTemporal -" + folderID);
		DocumentosTarea documento = null;

		DocTemporales docTemporal = new DocTemporales();
		docTemporal.setFolderId72(folderID);

		List<DocTemporales> listaDocTemporales = this.docTemporalesDao.findAll(docTemporal, null);
		if (!listaDocTemporales.isEmpty()) {
			TareaComunicacionInformeServiceImpl.logger
					.info("TareaComunicacionInformeServiceImpl.recuperarDocTemporal - Hay documento temporal: "
							+ listaDocTemporales.get(0).getIdDocTemporal72());
			documento = new DocumentosTarea();
			documento.setRutapif18(listaDocTemporales.get(0).getRutapif72());
			// el oid realmente es de Pid
			documento.setOiddokusi18(listaDocTemporales.get(0).getOidDokusi72());
			documento.setNombreDoc18(listaDocTemporales.get(0).getNombreDoc72());

			// RoleId y RoleName
			MaestroTiposDoc tipoDoc = this.maestroTiposDocDao
					.find(new MaestroTiposDoc(listaDocTemporales.get(0).getIdTipoDoc72()));
			documento.setMaestroTiposDoc(tipoDoc);
			documento.setUsuAlta18(docTemporal.getUsuAportacion72());
			if (listaDocTemporales.get(0).getExterno72().compareTo(1) == 0) {
				TareaComunicacionInformeServiceImpl.logger
						.info("TareaComunicacionInformeServiceImpl.recuperarDocTemporal - Externo ");
				documento.setEsExterno(true);
			} else {
				TareaComunicacionInformeServiceImpl.logger
						.info("TareaComunicacionInformeServiceImpl.recuperarDocTemporal - Interno ");
				documento.setEsExterno(false);
			}
		}
		TareaComunicacionInformeServiceImpl.logger
				.info("TareaComunicacionInformeServiceImpl.recuperarDocTemporal FIN ");
		return documento;

	}

	public com.ejie.ad74a.ws.client.platea.tareasTramitacion.TPostalAddress getPostalAddress(Direcciones direccion) {

		com.ejie.ad74a.ws.client.platea.tareasTramitacion.TPostalAddress address = new com.ejie.ad74a.ws.client.platea.tareasTramitacion.TPostalAddress();

		try {
			// NoraService nora = NoraService.class.newInstance();
			// TODO: no sé cómo llamar al dao de nora desde un método static
			// Esto no funciona
			Class<NoraDaoImpl> nora = NoraDaoImpl.class;
			NoraDaoImpl noraDao = nora.newInstance();

			// TODO: revisar bien

			// Pais
			Pais pais = new Pais();
			if (!Utilidades.esBlancoNulo(direccion.getPais06())) {
				pais.setCodPais(direccion.getPais06());
			} else {
				pais.setCodPais(Constantes.ESPANIA);
			}
			pais = noraDao.findAllPaises(pais).get(0);
			address.setCodPais(pais.getCodPais());
			address.setPais(pais.getDescripcion());

			// Localidad
			if (null != direccion.getIdLocalidad06()) {
				Localidad localidad = new Localidad();
				localidad.setCodLocalidad(Long.valueOf(direccion.getIdLocalidad06()));
				localidad = noraDao.findAllLocalidades(localidad).get(0);
				address.setCodLocalidad(direccion.getIdLocalidad06().toString());
				address.setLocalidad(localidad.getDescripcion());
			} else {
				address.setLocalidad("");
			}

			// Municipio
			String descMunicipio = "";
			if (!Utilidades.esBlancoNulo(direccion.getMunicipio06())) {
				descMunicipio = direccion.getMunicipio06().trim();
			} else if (null != direccion.getIdMunicipio06()) {
				Municipio municipio = new Municipio();
				municipio.setCodMunicipio(direccion.getIdMunicipio06());
				municipio.setCodProvincia(direccion.getIdProvincia06());
				municipio = noraDao.findMunicipio(municipio);
				descMunicipio = municipio.getDescripcion();

				address.setCodMunicipio(direccion.getIdMunicipio06());
			}
			address.setMunicipio(descMunicipio);

			// Provincia
			String descProvinciaEs = "";
			String descProvinciaEu = "";
			if (!Utilidades.esBlancoNulo(direccion.getProvincia06())) {
				descProvinciaEs = direccion.getProvincia06().trim();
				descProvinciaEu = direccion.getProvincia06().trim();
			} else if (null != direccion.getIdProvincia06()) {
				Provincia provincia = new Provincia();
				provincia.setCodProvincia(direccion.getIdProvincia06());
				provincia = noraDao.findAllProvincias(provincia).get(0);
				descProvinciaEs = provincia.getDescProvincia();
				descProvinciaEu = provincia.getDescProvincia();
			}

			com.ejie.ad74a.ws.client.platea.tareasTramitacion.TTextI18N provinciaI18N = new com.ejie.ad74a.ws.client.platea.tareasTramitacion.TTextI18N();
			com.ejie.ad74a.ws.client.platea.tareasTramitacion.TStringI18N stringI18N;

			stringI18N = new com.ejie.ad74a.ws.client.platea.tareasTramitacion.TStringI18N();
			stringI18N.setLocale(com.ejie.ad74a.ws.client.platea.tareasTramitacion.TLanguage.ES);
			stringI18N.setValue(descProvinciaEs);
			provinciaI18N.getText().add(stringI18N);

			stringI18N = new com.ejie.ad74a.ws.client.platea.tareasTramitacion.TStringI18N();
			stringI18N.setLocale(com.ejie.ad74a.ws.client.platea.tareasTramitacion.TLanguage.EU);
			stringI18N.setValue(descProvinciaEu);
			provinciaI18N.getText().add(stringI18N);
			address.setProvincia(provinciaI18N);

			// Portal
			String descPortal = "";
			if (!Utilidades.esBlancoNulo(direccion.getPortal06())) {
				descPortal = direccion.getPortal06().trim();
			} else if (null != direccion.getIdPortal06()) {
				Portal portal = new Portal();
				portal.setCodPortal(direccion.getIdPortal06());
				portal = noraDao.findPortal(portal);
				descPortal = portal.getNumeroString();

				address.setCodPortal(direccion.getIdPortal06().toString());
			}
			address.setPortal(descPortal);

			// CP, piso letra
			address.setCp(direccion.getCp06() == null ? "" : direccion.getCp06());
			address.setPiso(direccion.getPiso06() == null ? "" : direccion.getPiso06());
			address.setLetra(direccion.getLetra06() == null ? "" : direccion.getLetra06());

		} catch (Exception e) {
			e.printStackTrace();
		}

		// Estos están sin generar. Revisar
		// @XmlElement(required = true)
		// protected String direccion;
		// protected String escalera;
		// @XmlElement(required = true)
		// protected String codDireccion;

		return address;
	}

	/*
	 * [jbhg] Tratamiento en caso de que sea una comunicacion postal
	 */
	private void comunicacionPostalEjecutada(Task task) {
		if (task.getTaskInfo().getNotifyTaskData() != null && tieneCanalPostal(task)) {
			logger.debug("Es una comunicacion postal.");
			// Buscar la pk de la tarea correspondiente en bbdd
			TareasTramite tBuscar = new TareasTramite();
			tBuscar.setTaskguid11(task.getMailboxTaskID());
			List<TareasTramite> listTareas = tareasTramiteService.findAll(tBuscar, null);
			if (CollectionUtils.isEmpty(listTareas)) {
				logger.warn("No se ha encontrado la tarea de comunicacion postal '{}' en el sistema",
						task.getMailboxTaskID());
				return;
			}
			// Crear la notificacion postal
			NotifPostales notifPostales = new NotifPostales();
			notifPostales.setTareasTramite(listTareas.get(0));
			notifPostales.setTipoNot88(TipoNotificacionComunicacionEnum.COMUNICACION.getValor());
			notifPostales
					.setIdEnvioPostal88(Integer.valueOf(task.getTaskInfo().getNotifyTaskData().getIdEnvioPostal()));
			notifPostales.setIdColeccionPostal88(
					Integer.valueOf(task.getTaskInfo().getNotifyTaskData().getIdColeccionPostal()));
			notifPostales.setPostalInboxId88(task.getTaskInfo().getNotifyTaskData().getPostalInboxID());
			notifPostales.setFinalizada88(Constantes.VAL_NUM_NO);
			// Se registra la comunicacion postal para su gestion posterior por el
			// tramitador
			notifPostalesService.add(notifPostales);
		}
	}

	/*
	 * Comprueba si la tarea de comunicacion tiene canal postal
	 */
	private boolean tieneCanalPostal(Task task) {
		boolean resultado = false;
		if (task.getTaskInfo().getNotifyTaskData() == null
				|| task.getTaskInfo().getNotifyTaskData().getNotificationList() == null || CollectionUtils
						.isEmpty(task.getTaskInfo().getNotifyTaskData().getNotificationList().getNotification())) {
			return resultado;
		}
		for (Notification not : task.getTaskInfo().getNotifyTaskData().getNotificationList().getNotification()) {
			if (Constantes.TipoNotificacion.POSTAL.equalsIgnoreCase(not.getChanelType())) {
				resultado = true;
				break;
			}
		}
		return resultado;
	}
}
