package com.ejie.ad74a.ws.client.platea.service;

import java.io.ByteArrayInputStream;
import java.io.UnsupportedEncodingException;
import java.math.BigDecimal;
import java.rmi.UnmarshalException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Properties;
import java.util.StringTokenizer;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;

import org.apache.commons.lang.StringUtils;

import com.bea.core.repackaged.springframework.beans.factory.annotation.Autowired;
import com.ejie.ad74a.dao.comun.NoraDao;
import com.ejie.ad74a.exceptions.ManagerErrors;
import com.ejie.ad74a.model.Direcciones;
import com.ejie.ad74a.model.Documento;
import com.ejie.ad74a.model.Expedientes;
import com.ejie.ad74a.model.MaestroTiposDoc;
import com.ejie.ad74a.model.Solicitantes;
import com.ejie.ad74a.model.comun.Calle;
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.util.comun.ApplicationContextProvider;
import com.ejie.ad74a.util.comun.UtilSeguridad;
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.Constantes.CanalNotificacion;
import com.ejie.ad74a.util.constantes.Constantes.TipoNotificacion;
import com.ejie.ad74a.util.constantes.ProcedimientosEnum;
import com.ejie.ad74a.util.constantes.TelActionPapel0Enum;
import com.ejie.ad74a.util.constantes.TipoAportacionEnum;
import com.ejie.ad74a.util.constantes.TipoIdentificadorEnum;
import com.ejie.ad74a.util.constantes.TiposDocumentoRoleEnum;
import com.ejie.ad74a.utilProperties.config.Config;
import com.ejie.ad74a.ws.client.dokusi.model.signatureList.SignatureList;
import com.ejie.ad74a.ws.client.platea.expedienteElectronico.TLanguage;
import com.ejie.ad74a.ws.client.platea.expedienteElectronico.TNiaType;
import com.ejie.ad74a.ws.client.platea.expedienteElectronico.TSexType;
import com.ejie.ad74a.ws.client.platea.expedienteElectronico.TTextI18N;
import com.ejie.ad74a.ws.client.platea.procedimientos.TProcedure;
import com.ejie.ad74a.ws.client.platea.solAportacion.TAuthSvt;
import com.ejie.ad74a.ws.client.platea.solAportacion.TBoolean;
import com.ejie.ad74a.ws.client.platea.solAportacion.TDocFormatType;
import com.ejie.ad74a.ws.client.platea.solAportacion.TDocNatureType;
import com.ejie.ad74a.ws.client.platea.solAportacion.TDocumentList;
import com.ejie.ad74a.ws.client.platea.solAportacion.TDocumentType;
import com.ejie.ad74a.ws.client.platea.solAportacion.TKeyValue;
import com.ejie.ad74a.ws.client.platea.solAportacion.TKeyValueList;
import com.ejie.ad74a.ws.client.platea.solAportacion.TPersonIDName;
import com.ejie.ad74a.ws.client.platea.solAportacion.TRegistryDocument;
import com.ejie.ad74a.ws.client.platea.solAportacion.TRegistryDocumentList;
import com.ejie.ad74a.ws.client.platea.solAportacion.TStringI18N;
import com.ejie.ad74a.ws.client.platea.solAportacion.TSubmissionRequest;

/**
 * Agrupa utilidades para ficheros
 * 
 * @author
 * 
 */
public class PlateaUtils {

	/**
	 * Constructor privado
	 */
	private PlateaUtils() {
	}

	public static com.ejie.ad74a.ws.client.platea.solAportacion.TAdminInitRequest createRequestInicioOficio(
			Expedientes expediente, com.ejie.ad74a.ws.client.platea.procedimientos.TProcedure procedimiento,
			String folderTitle, List<Documento> documentos) throws Exception {

		com.ejie.ad74a.ws.client.platea.solAportacion.TAdminInitRequest request = new com.ejie.ad74a.ws.client.platea.solAportacion.TAdminInitRequest();

		request.setInitiationType(
				com.ejie.ad74a.ws.client.platea.solAportacion.TFolderOriginType.INICIATIVA_ADMINISTRATIVA);

		request.setSenderID(getSenderWSoficio());
		request.setStartDate(formatearFecha(new Date()));

		request.setMailboxID(ProcedimientosEnum.getMailBox(procedimiento.getProcedureID()));

		request.setProcedureID(procedimiento.getProcedureID());
		request.setProcedureName(PlateaUtils.getProcedureName(procedimiento.getProcedureID()));
		request.setDepartmentID(procedimiento.getManagingUnit().getDepartmentID());
		request.setManagingUnitID(procedimiento.getManagingUnit().getManagingUnitID());
		request.setManagingUnitName(getUnidadName());

		request.setProcedureMailboxID(Constantes.PLATEA_MAILBOX_ADMIN);
		request.setProcedureMailboxName(Constantes.PLATEA_MAILBOX_ADMIN);
		request.setEntityID(Constantes.PLATEA_ENTITY_ID);

		request.setFolderTitle(folderTitle);
		// TODO Folder number
		request.setFolderNumber(expediente.getNumExpediente00());

		com.ejie.ad74a.ws.client.platea.solAportacion.TApplicantRRI aplicant = getApplicantRRIOficio(expediente);

		String serieDP = procedimiento.getDaDocumentalSeries().getDaDocumentalSerie().getID();
		request.setDocumentalSerieID(serieDP);

		request.setProcedureFamilyID(procedimiento.getProcedureFamilyID());

		com.ejie.ad74a.ws.client.platea.solAportacion.TApplicantRRIList listaapplicant = new com.ejie.ad74a.ws.client.platea.solAportacion.TApplicantRRIList();
		request.setApplicantRRIList(listaapplicant);

		request.getApplicantRRIList().getApplicant().add(aplicant);

		request.setObservations(getObservaciones(expediente.getObservaciones00()));

		/** Trasnformamos los documentos **/

		if (null != documentos) {
			TRegistryDocumentList listDocuments = new TRegistryDocumentList();
			for (Documento documento : documentos) {
				if (TiposDocumentoRoleEnum.LIQUIDACION.getRoleID().equals(documento.getRoleID())
						&& expediente.getLiquidaciones() != null
						&& expediente.getLiquidaciones().getReferenciaLiq00() != null)
					documento.setNumLiquidacion(
							new BigDecimal(expediente.getLiquidaciones().getReferenciaLiq00()).longValue());
				listDocuments.getDocument().add(getDocument(documento));
			}

			request.setDocumentList(listDocuments);
		}

		return request;

	}

	private static TRegistryDocument getDocument(Documento documento) throws Exception {
		TRegistryDocument docReg = new TRegistryDocument();

		docReg.setDocumentRoleID(documento.getRoleID());
		docReg.setDocumentPath(documento.getRutaPif());
		// docReg.setDokusiID(documento.getOidDocumento());
		docReg.setSourceName(documento.getNombreDocumento());
		docReg.setFormat(TDocFormatType.ELECTRONICO);
		docReg.setNature(TDocNatureType.ELECTRONICO);
		TPersonIDName senderId = new TPersonIDName();
		senderId.setID(UtilSeguridad.getUsuarioConectado().getNif());
		senderId.setName(UtilSeguridad.getUsuarioConectado().getName());
		senderId.setSecondLastName(UtilSeguridad.getUsuarioConectado().getSurname());
		docReg.setSenderID(senderId);
		docReg.setTitle(documento.getTipoDocumentoDescEs());
		if (TiposDocumentoRoleEnum.LIQUIDACION.getRoleID().equals(documento.getRoleID())) {
			// Para el tipo documental de liquidacion , se requiere numLiquidacion
			TKeyValue tKey = new TKeyValue();
			tKey.setKey("ejgv_num_liquidacion");
			tKey.setValue(documento.getNumLiquidacion().toString());
			tKey.setType("string");
			try {
				// docReg.getMetadataList().getItem().add(tKey);
				TKeyValueList tKeys = new TKeyValueList();
				tKeys.getItem().add(tKey);
				docReg.setMetadataList(tKeys);
			} catch (Exception e) {
				System.out.println("error:" + e.getMessage());
			}
		}
		return docReg;
	}

	private static com.ejie.ad74a.ws.client.platea.solAportacion.TTextI18N getObservaciones(String observaciones) {
		com.ejie.ad74a.ws.client.platea.solAportacion.TTextI18N textI18N = new com.ejie.ad74a.ws.client.platea.solAportacion.TTextI18N();
		com.ejie.ad74a.ws.client.platea.solAportacion.TStringI18N stringI18N;

		stringI18N = new com.ejie.ad74a.ws.client.platea.solAportacion.TStringI18N();
		stringI18N.setLocale(com.ejie.ad74a.ws.client.platea.solAportacion.TLanguage.ES);
		stringI18N.setValue(TelActionPapel0Enum.getLabelDescEs(observaciones));
		textI18N.getText().add(stringI18N);

		stringI18N = new com.ejie.ad74a.ws.client.platea.solAportacion.TStringI18N();
		stringI18N.setLocale(com.ejie.ad74a.ws.client.platea.solAportacion.TLanguage.EU);
		stringI18N.setValue(TelActionPapel0Enum.getLabelDescEu(observaciones));
		textI18N.getText().add(stringI18N);

		return textI18N;
	}

	private static com.ejie.ad74a.ws.client.platea.solAportacion.TApplicantRRI getApplicantRRIOficio(
			Expedientes expediente) {
		com.ejie.ad74a.ws.client.platea.solAportacion.TPersonIDName person = new com.ejie.ad74a.ws.client.platea.solAportacion.TPersonIDName();
		com.ejie.ad74a.ws.client.platea.solAportacion.TApplicantRRI aplicant = new com.ejie.ad74a.ws.client.platea.solAportacion.TApplicantRRI();
		com.ejie.ad74a.ws.client.platea.solAportacion.TInterested interested = new com.ejie.ad74a.ws.client.platea.solAportacion.TInterested();

		Solicitantes titular = expediente.getSolicitantes();

		person.setType(com.ejie.ad74a.ws.client.platea.solAportacion.TNiaType.NIF);
		person.setID(titular.getIdentificador01());
		person.setName(titular.getNombre01());
		person.setFirstLastName(titular.getApellido101());
		person.setSecondLastName(titular.getApellido201());
		person.setSex(com.ejie.ad74a.ws.client.platea.solAportacion.TSexType.NA);
		interested.setLanguage(com.ejie.ad74a.ws.client.platea.solAportacion.TLanguage.ES);

		interested.setAccount(getAccount(expediente));

		interested.setPersonID(person);

		com.ejie.ad74a.ws.client.platea.solAportacion.TInterestedList listainterested = new com.ejie.ad74a.ws.client.platea.solAportacion.TInterestedList();
		aplicant.setInterestedList(listainterested);

		aplicant.getInterestedList().getInterested().add(interested);
		aplicant.setRole(com.ejie.ad74a.ws.client.platea.solAportacion.TParticipantType.AFECTADO);
		return aplicant;
	}

	private static com.ejie.ad74a.ws.client.platea.solAportacion.TAccount getAccount(Expedientes expediente) {
		com.ejie.ad74a.ws.client.platea.solAportacion.TAccount account = new com.ejie.ad74a.ws.client.platea.solAportacion.TAccount();
		com.ejie.ad74a.ws.client.platea.solAportacion.TContactList contactl = new com.ejie.ad74a.ws.client.platea.solAportacion.TContactList();
		com.ejie.ad74a.ws.client.platea.solAportacion.TContact contact = null;
		com.ejie.ad74a.ws.client.platea.solAportacion.TNotifyChannel notify = new com.ejie.ad74a.ws.client.platea.solAportacion.TNotifyChannel();
		/*- (idTipoNot00 guarda el canal de notificacion postal/electronico. canalNot00 guarda el canal de aviso SMS/EMAIL) */
		// Datos de aviso:
		if (CanalNotificacion.CANAL_NOTIF_MAIL.equalsIgnoreCase(expediente.getCanalNot00())
				|| CanalNotificacion.CANAL_NOTIF_ALL.equalsIgnoreCase(expediente.getCanalNot00())) {
			contact = new com.ejie.ad74a.ws.client.platea.solAportacion.TContact();
			contact.setChannelType(com.ejie.ad74a.ws.client.platea.solAportacion.TContactType.EMAIL);
			contact.setEmail(expediente.getEmailNot00());
			contactl.getContact().add(contact);
			account.setContactList(contactl);
		}
		if (CanalNotificacion.CANAL_NOTIF_SMS.equalsIgnoreCase(expediente.getCanalNot00())
				|| CanalNotificacion.CANAL_NOTIF_ALL.equalsIgnoreCase(expediente.getCanalNot00())) {
			contact = new com.ejie.ad74a.ws.client.platea.solAportacion.TContact();
			contact.setChannelType(com.ejie.ad74a.ws.client.platea.solAportacion.TContactType.SMS);
			contact.setSms(expediente.getTfnoNot00());
			contact.setPhone(expediente.getTfnoNot00());
			contactl.getContact().add(contact);
			account.setContactList(contactl);
		}

		// Datos de notificacion
		if (TipoNotificacion.POSTAL.equalsIgnoreCase(expediente.getIdTipoNot00())) {
			notify.setChannelType(com.ejie.ad74a.ws.client.platea.solAportacion.TNotificationType.POSTAL);
			notify.setPostal(getPostalAddress(expediente.getDireccionNotif()));
		} else
		/*- if (TipoNotificacion.TELEMATICA.equalsIgnoreCase(expediente.getIdTipoNot00())) */
		{
			// Si no es POSTAL, por defecto se pone como tipo de notificacion TELEMATICA
			notify.setChannelType(com.ejie.ad74a.ws.client.platea.solAportacion.TNotificationType.ELECTRONICA);
		}

		account.setNotify(notify);

		return account;
	}

	// Instancia noraDao para no tener que estar recuperandola siempre del contexto
	/*- ***************************** -*/
	private static NoraDao noraDao = null;
	/*- ***************************** -*/

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

		com.ejie.ad74a.ws.client.platea.solAportacion.TPostalAddress address = new com.ejie.ad74a.ws.client.platea.solAportacion.TPostalAddress();
		if (direccion == null) {
			return address;
		}

		if (noraDao == null) {
			noraDao = ApplicationContextProvider.getApplicationContext().getBean(NoraDao.class);
		}
		// Pais
		Pais pais = new Pais(StringUtils.defaultIfEmpty(direccion.getPais06(), Constantes.ESPANIA));
		pais = noraDao.findAllPaises(pais).get(0);
		// Provincia
		Provincia provincia = new Provincia();
		if (StringUtils.isNotBlank(direccion.getIdProvincia06())) {
			provincia.setCodProvincia(direccion.getIdProvincia06());
			provincia = noraDao.findAllProvincias(provincia).get(0);
		} else if (StringUtils.isNotBlank(direccion.getDESCProvincia())) {
			provincia = new Provincia(null, direccion.getDESCProvincia(), direccion.getDESCProvincia(), null);
		}
		// Municipio
		Municipio municipio = new Municipio();
		if (StringUtils.isNotBlank(direccion.getIdMunicipio06())
				&& StringUtils.isNotBlank(direccion.getIdProvincia06())) {
			municipio.setCodMunicipio(direccion.getIdMunicipio06());
			municipio.setCodProvincia(direccion.getIdProvincia06());
			municipio = noraDao.findMunicipio(municipio);
		} else if (StringUtils.isNotBlank(direccion.getDESCMunicipio())) {
			municipio.setDescripcion(direccion.getDESCMunicipio());
		}
		// Localidad
		Localidad localidad = new Localidad();
		if (direccion.getIdLocalidad06() != null) {
			localidad.setCodLocalidad(direccion.getIdLocalidad06());
			localidad = noraDao.findAllLocalidades(localidad).get(0);
		} else if (StringUtils.isNotBlank(direccion.getDESCLocalidad())) {
			localidad.setDescripcion(direccion.getDESCLocalidad());
		}
		// Calle
		Calle calle = new Calle();
		if (direccion.getIdCalle06() != null) {
			calle.setCodCalle(direccion.getIdCalle06());
			calle = noraDao.findAllCalles(calle).get(0);
		} else if (StringUtils.isNotBlank(direccion.getDESCCalle())) {
			calle.setDescripcion(direccion.getDESCCalle());
		}
		// Portal
		Portal portal = new Portal();
		if (direccion.getIdPortal06() != null) {
			portal.setCodPortal(direccion.getIdPortal06());
			portal = noraDao.findPortal(portal);
		} else {
			if (StringUtils.isNotBlank(direccion.getPortal06())) {
				portal.setNumeroString(direccion.getPortal06().trim());
			}
			if (StringUtils.isNotBlank(direccion.getCp06())) {
				portal.setCodPostal(direccion.getCp06().trim());
			}
		}
		String escaleraStr = StringUtils.defaultIfEmpty(direccion.getEscalera06(), "");
		String pisoStr = StringUtils.defaultIfEmpty(direccion.getPiso06(), "");
		String letraStr = StringUtils.defaultIfEmpty(direccion.getLetra06(), "");

		// Descripcion de provincia en campo TTextI18N:
		com.ejie.ad74a.ws.client.platea.solAportacion.TTextI18N provinciaI18N = new com.ejie.ad74a.ws.client.platea.solAportacion.TTextI18N();
		com.ejie.ad74a.ws.client.platea.solAportacion.TStringI18N stringI18N = new com.ejie.ad74a.ws.client.platea.solAportacion.TStringI18N();
		stringI18N.setLocale(com.ejie.ad74a.ws.client.platea.solAportacion.TLanguage.ES);
		stringI18N.setValue(provincia.getDescProvincia());
		provinciaI18N.getText().add(stringI18N);
		stringI18N = new com.ejie.ad74a.ws.client.platea.solAportacion.TStringI18N();
		stringI18N.setLocale(com.ejie.ad74a.ws.client.platea.solAportacion.TLanguage.EU);
		stringI18N.setValue(provincia.getDescProvincia());
		provinciaI18N.getText().add(stringI18N);

		address.setCodPais(pais.getCodPais().trim());
		address.setCodProvincia(provincia.getCodProvincia().trim());
		address.setCodMunicipio(municipio.getCodMunicipio().trim());
		address.setCodLocalidad(String.valueOf(localidad.getCodLocalidad()).trim());
		address.setCodDireccion(String.valueOf(calle.getIdCalle()).trim());
		address.setCodPortal(String.valueOf(portal.getCodPortal()).trim());
		address.setCp(portal.getCodPostal().trim());
		address.setPais(pais.getDescripcion());
		address.setProvincia(provinciaI18N);
		address.setMunicipio(municipio.getDescripcion());
		address.setLocalidad(localidad.getDescripcion());
		address.setDireccion(calle.getDescripcion());
		address.setPortal(portal.getPortal());
		address.setEscalera(escaleraStr);
		address.setPiso(pisoStr);
		address.setLetra(letraStr);

		return address;
	}

	public static com.ejie.ad74a.ws.client.platea.solAportacion.TTextI18N getTelActionName(String idTelAction) {
		com.ejie.ad74a.ws.client.platea.solAportacion.TTextI18N textI18N = new com.ejie.ad74a.ws.client.platea.solAportacion.TTextI18N();
		com.ejie.ad74a.ws.client.platea.solAportacion.TStringI18N stringI18N;

		stringI18N = new com.ejie.ad74a.ws.client.platea.solAportacion.TStringI18N();
		stringI18N.setLocale(com.ejie.ad74a.ws.client.platea.solAportacion.TLanguage.ES);
		stringI18N.setValue(TelActionPapel0Enum.getLabelDescEs(idTelAction));
		textI18N.getText().add(stringI18N);

		stringI18N = new com.ejie.ad74a.ws.client.platea.solAportacion.TStringI18N();
		stringI18N.setLocale(com.ejie.ad74a.ws.client.platea.solAportacion.TLanguage.EU);
		stringI18N.setValue(TelActionPapel0Enum.getLabelDescEu(idTelAction));
		textI18N.getText().add(stringI18N);

		return textI18N;
	}

	public static com.ejie.ad74a.ws.client.platea.solAportacion.TTextI18N getProcedureName(String procedureID) {
		com.ejie.ad74a.ws.client.platea.solAportacion.TTextI18N textI18N = new com.ejie.ad74a.ws.client.platea.solAportacion.TTextI18N();
		com.ejie.ad74a.ws.client.platea.solAportacion.TStringI18N stringI18N;

		stringI18N = new com.ejie.ad74a.ws.client.platea.solAportacion.TStringI18N();
		stringI18N.setLocale(com.ejie.ad74a.ws.client.platea.solAportacion.TLanguage.ES);
		stringI18N.setValue(ProcedimientosEnum.getLabelDescEs(procedureID));
		textI18N.getText().add(stringI18N);

		stringI18N = new com.ejie.ad74a.ws.client.platea.solAportacion.TStringI18N();
		stringI18N.setLocale(com.ejie.ad74a.ws.client.platea.solAportacion.TLanguage.EU);
		stringI18N.setValue(ProcedimientosEnum.getLabelDescEu(procedureID));
		textI18N.getText().add(stringI18N);

		return textI18N;
	}

	public static com.ejie.ad74a.ws.client.platea.solAportacion.TTextI18N getUnidadName() {
		com.ejie.ad74a.ws.client.platea.solAportacion.TTextI18N textI18N = new com.ejie.ad74a.ws.client.platea.solAportacion.TTextI18N();
		com.ejie.ad74a.ws.client.platea.solAportacion.TStringI18N stringI18N;

		stringI18N = new com.ejie.ad74a.ws.client.platea.solAportacion.TStringI18N();
		stringI18N.setLocale(com.ejie.ad74a.ws.client.platea.solAportacion.TLanguage.ES);
		stringI18N.setValue(Constantes.PLATEA_UNIDAD_ES);
		textI18N.getText().add(stringI18N);

		stringI18N = new com.ejie.ad74a.ws.client.platea.solAportacion.TStringI18N();
		stringI18N.setLocale(com.ejie.ad74a.ws.client.platea.solAportacion.TLanguage.EU);
		stringI18N.setValue(Constantes.PLATEA_UNIDAD_EU);
		textI18N.getText().add(stringI18N);

		return textI18N;
	}

	public static com.ejie.ad74a.ws.client.platea.solAportacion.TPersonIDName getSender(Expedientes expediente) {
		com.ejie.ad74a.ws.client.platea.solAportacion.TPersonIDName sender = new com.ejie.ad74a.ws.client.platea.solAportacion.TPersonIDName();
		sender.setID(expediente.getSolicitantes().getIdentificador01());

		if (expediente.getSolicitantes().getTipoIdentificador01().equalsIgnoreCase(TipoIdentificadorEnum.DNI.getId())) {
			sender.setType(com.ejie.ad74a.ws.client.platea.solAportacion.TNiaType.NIE);
		} else if (expediente.getSolicitantes().getTipoIdentificador01()
				.equalsIgnoreCase(TipoIdentificadorEnum.CIF.getId())) {
			sender.setType(com.ejie.ad74a.ws.client.platea.solAportacion.TNiaType.CIF);
		} else if (expediente.getSolicitantes().getTipoIdentificador01()
				.equalsIgnoreCase(TipoIdentificadorEnum.NIE.getId())) {
			sender.setType(com.ejie.ad74a.ws.client.platea.solAportacion.TNiaType.NIE);
		} else if (expediente.getSolicitantes().getTipoIdentificador01()
				.equalsIgnoreCase(TipoIdentificadorEnum.OTROS.getId())) {
			sender.setType(com.ejie.ad74a.ws.client.platea.solAportacion.TNiaType.OTHER);
		} else if (expediente.getSolicitantes().getTipoIdentificador01()
				.equalsIgnoreCase(TipoIdentificadorEnum.PASAPORTE.getId())) {
			sender.setType(com.ejie.ad74a.ws.client.platea.solAportacion.TNiaType.PASSPORT);
		}

		sender.setName(expediente.getSolicitantes().getNombre01());
		sender.setFirstLastName(expediente.getSolicitantes().getApellido101());
		sender.setSecondLastName(expediente.getSolicitantes().getApellido201());
		return sender;
	}

	public static com.ejie.ad74a.ws.client.platea.solAportacion.TPersonIDName getSenderWSoficio() {
		com.ejie.ad74a.ws.client.platea.solAportacion.TPersonIDName sender = new com.ejie.ad74a.ws.client.platea.solAportacion.TPersonIDName();
		Properties prop = Config.loadProperties(com.ejie.ad74a.constantes.Constantes.CONFIG_PATH);

		String gvCif = prop.getProperty("gv.cif");
		sender.setID(gvCif);
		sender.setName(gvCif);
		sender.setType(com.ejie.ad74a.ws.client.platea.solAportacion.TNiaType.CIF);
		return sender;
	}

	public static com.ejie.ad74a.ws.client.platea.solAportacion.TTextI18N getDepartmentName() {
		com.ejie.ad74a.ws.client.platea.solAportacion.TTextI18N textI18N = new com.ejie.ad74a.ws.client.platea.solAportacion.TTextI18N();
		com.ejie.ad74a.ws.client.platea.solAportacion.TStringI18N stringI18N;

		stringI18N = new com.ejie.ad74a.ws.client.platea.solAportacion.TStringI18N();
		stringI18N.setLocale(com.ejie.ad74a.ws.client.platea.solAportacion.TLanguage.ES);
		stringI18N.setValue(Constantes.PLATEA_DEPARTAMENT_NAME_ES);
		textI18N.getText().add(stringI18N);

		stringI18N = new com.ejie.ad74a.ws.client.platea.solAportacion.TStringI18N();
		stringI18N.setLocale(com.ejie.ad74a.ws.client.platea.solAportacion.TLanguage.EU);
		stringI18N.setValue(Constantes.PLATEA_DEPARTAMENT_NAME_EU);
		textI18N.getText().add(stringI18N);

		return textI18N;
	}

	public static com.ejie.ad74a.ws.client.platea.solAportacion.TTextI18N getOrganismName() {
		com.ejie.ad74a.ws.client.platea.solAportacion.TTextI18N textI18N = new com.ejie.ad74a.ws.client.platea.solAportacion.TTextI18N();
		com.ejie.ad74a.ws.client.platea.solAportacion.TStringI18N stringI18N;

		stringI18N = new com.ejie.ad74a.ws.client.platea.solAportacion.TStringI18N();
		stringI18N.setLocale(com.ejie.ad74a.ws.client.platea.solAportacion.TLanguage.ES);
		stringI18N.setValue(Constantes.PLATEA_ORGANISM_ES);
		textI18N.getText().add(stringI18N);

		stringI18N = new com.ejie.ad74a.ws.client.platea.solAportacion.TStringI18N();
		stringI18N.setLocale(com.ejie.ad74a.ws.client.platea.solAportacion.TLanguage.EU);
		stringI18N.setValue(Constantes.PLATEA_ORGANISM_EU);
		textI18N.getText().add(stringI18N);

		return textI18N;
	}

	public static String formatearFecha(Date fecha) {
		if (fecha != null) {
			return new SimpleDateFormat("dd-MM-yyyy HH:mm:ss").format(fecha);
		} else
			return null;
	}

	public static com.ejie.ad74a.ws.client.platea.expedienteElectronico.TPersonIDName getNewPerson(
			Solicitantes solicitante) {
		com.ejie.ad74a.ws.client.platea.expedienteElectronico.TPersonIDName person = new com.ejie.ad74a.ws.client.platea.expedienteElectronico.TPersonIDName();
		person.setID(solicitante.getIdentificador01());
		person.setName(solicitante.getNombre01());
		person.setFirstLastName(solicitante.getApellido101());
		person.setSecondLastName(solicitante.getApellido201());
		person.setSex(decodeSex(solicitante.getSexo01()));
		person.setType(decodeTipoIdentificador(solicitante.getTipoIdentificador01()));
		return person;
	}

	/**
	 * Decodifica el campo sexo que usamos en nuestra aplicacion H o M, por los
	 * valores de platea
	 * 
	 * @param sexo
	 * @return
	 */
	public static TSexType decodeSex(String sexo) {
		TSexType sexoPlatea = null;
		if (!Utilidades.isEmpty(sexo)) {
			if (sexo.equalsIgnoreCase(Constantes.SEXO_HOMBRE_BBDD)) {
				sexoPlatea = TSexType.HOMBRE;
			} else if (sexo.equalsIgnoreCase(Constantes.SEXO_MUJER_BBDD)) {
				sexoPlatea = TSexType.MUJER;
			} else {
				sexoPlatea = TSexType.OTRA;
			}
		}
		return sexoPlatea;
	}

	public static TNiaType decodeTipoIdentificador(String tipoIdentificador) {
		TNiaType tipo = null;
		if (!Utilidades.isEmpty(tipoIdentificador)) {
			if (tipoIdentificador.equalsIgnoreCase(TipoIdentificadorEnum.DNI.getId())) {
				tipo = TNiaType.NIF;
			} else if (tipoIdentificador.equalsIgnoreCase(TipoIdentificadorEnum.NIE.getId())) {
				tipo = TNiaType.NIE;
			} else if (tipoIdentificador.equalsIgnoreCase(TipoIdentificadorEnum.PASAPORTE.getId())) {
				tipo = TNiaType.PASSPORT;
			} else if (tipoIdentificador.equalsIgnoreCase(TipoIdentificadorEnum.CIF.getId())) {
				tipo = TNiaType.CIF;
			} else {
				tipo = TNiaType.OTHER;
			}
		}
		return tipo;
	}

	/**
	 * Prepara el objeto de la llamada al metodo addAttachment, con los servicios de
	 * interoperabilidad que se han indicado.
	 * 
	 * @param expediente
	 * @param listDocInterop
	 * @return
	 * @throws Exception
	 */
	public static TSubmissionRequest createAportacionInteroperabilidad(Expedientes expediente,
			List<MaestroTiposDoc> listDocInterop, TProcedure procedimiento, String participantID) throws Exception {

		com.ejie.ad74a.ws.client.platea.solAportacion.TSubmissionRequest aportacion = new com.ejie.ad74a.ws.client.platea.solAportacion.TSubmissionRequest();
		aportacion.setTelActionID(TipoAportacionEnum.APORTACION_DOCUMENTOS_CIUDADANO_PRESENCIAL.getTipo());
		aportacion.setTelActionName(
				PlateaUtils.getTelActionName(TipoAportacionEnum.APORTACION_DOCUMENTOS_CIUDADANO_PRESENCIAL.getTipo()));

		aportacion.setParticipantID(participantID);

		aportacion.setProcedureID(procedimiento.getProcedureID());
		aportacion.setProcedureName(PlateaUtils.getProcedureName(procedimiento.getProcedureID()));
		aportacion.setProcedureFamilyID(procedimiento.getProcedureFamilyID());
		// solicitud.setProcedureFamilyName(getProcedureFamilyName(expediente.getIdProcedimiento00()));

		aportacion.setProcedureMailboxID(Constantes.PLATEA_MAILBOX_ADMIN);
		aportacion.setProcedureMailboxName(Constantes.PLATEA_MAILBOX_ADMIN);
		aportacion.setDepartmentID(procedimiento.getManagingUnit().getDepartmentID());
		aportacion.setDepartmentName(PlateaUtils.getDepartmentName());
		aportacion.setEntityID(Constantes.PLATEA_ENTITY_ID);
		aportacion.setEntityName(getEntityName());

		aportacion.setManagingUnitID(procedimiento.getManagingUnit().getManagingUnitID());
		aportacion.setManagingUnitName(getUnidadName());
		aportacion.setMailboxID(ProcedimientosEnum.getMailBox(procedimiento.getProcedureID()));

		aportacion.setSenderID(getSenderWSoficio());
		aportacion.setRegistrySender(PlateaUtils.getSender(expediente));

		com.ejie.ad74a.ws.client.platea.solAportacion.TRegistryID registryID = new com.ejie.ad74a.ws.client.platea.solAportacion.TRegistryID();
		aportacion.setRegistrySubmissionID(registryID);
		aportacion.setMustRegistry(com.ejie.ad74a.ws.client.platea.solAportacion.TBoolean.TRUE);
		String serieDP = procedimiento.getDaDocumentalSeries().getDaDocumentalSerie().getID();
		aportacion.setDocumentalSerieID(serieDP);

		aportacion.setApplicantRRI(getApplicantRRIOficio(expediente));

		aportacion.setAuditUser(com.ejie.ad74a.constantes.Constantes.COD_APLICACION + "#"
				+ com.ejie.ad74a.constantes.Constantes.COD_APLICACION + "#"
				+ com.ejie.ad74a.constantes.Constantes.COD_APLICACION);

		aportacion.setIsProcedureTelematic(com.ejie.ad74a.ws.client.platea.solAportacion.TBoolean.TRUE);
		aportacion.setIsValidationSync(com.ejie.ad74a.ws.client.platea.solAportacion.TBoolean.FALSE);
		aportacion.setFolderNumber(expediente.getNumExpediente00());
		aportacion.setFolderID(expediente.getFolderId00());
		aportacion.setYear(UtilidadesFecha.getCurrentYear());
		aportacion.setManagerCalendar(com.ejie.ad74a.ws.client.platea.solAportacion.TCalendarType.CAPV);
		aportacion.setResolutionCalendar(com.ejie.ad74a.ws.client.platea.solAportacion.TCalendarType.CAPV);

		// Declaramos la lista de documentos pata meter tanto los documentos de sesion
		// como los de interoperabilidad

		com.ejie.ad74a.ws.client.platea.solAportacion.TDocumentList listDocuments = new com.ejie.ad74a.ws.client.platea.solAportacion.TDocumentList();

		/** Trasnformamos los documentos de interoperabilidad **/

		com.ejie.ad74a.ws.client.platea.solAportacion.TDocumentList tListDocInterop;
		try {
			tListDocInterop = setServiciosInterop(expediente, listDocInterop);
			if (null != listDocInterop) {
				for (com.ejie.ad74a.ws.client.platea.solAportacion.TDocument documento : tListDocInterop
						.getDocument()) {
					listDocuments.getDocument().add(documento);
				}
				aportacion.setDocumentList(listDocuments);
			}
		} catch (Exception e) {
			ManagerErrors.manageError("Error al crear los documentos de interoperabilidad para el inicio de oficio");
		}

		return aportacion;

		// Mirar como hace los metodos de Papel0Utils: createAportacionPapel0 y
		// setServiciosInterop, hay que hacer una mezcla y alguna modificacion.

//		return null;
	}

	private static com.ejie.ad74a.ws.client.platea.solAportacion.TDocumentList setServiciosInterop(
			Expedientes expediente, List<MaestroTiposDoc> listDocInterop) throws Exception {

		com.ejie.ad74a.ws.client.platea.solAportacion.TDocumentList lista = new TDocumentList();

		// Modificación de direccion(0087004): Padrón
		// Revisión de precio publico(0087005): Padrón ; Nivel de renta
		for (MaestroTiposDoc tipoDoc : listDocInterop) {
			if (expediente.getIdProcedimiento00().equalsIgnoreCase(ProcedimientosEnum.MODIFICACION.getId())) {
				if (tipoDoc.getRoleid36().equalsIgnoreCase(TiposDocumentoRoleEnum.PADRON_GENERICO.getRoleID())) {
					lista.getDocument().add(getDocPadronInterop(expediente, tipoDoc));
				}
			} else if (expediente.getIdProcedimiento00().equalsIgnoreCase(ProcedimientosEnum.REVISION_PRECIO.getId())) {
				if (tipoDoc.getRoleid36().equalsIgnoreCase(TiposDocumentoRoleEnum.CERT_IRPF_RENTA.getRoleID())) {
					if (null != expediente.getExencionSol00()
							&& expediente.getExencionSol00().compareTo(Constantes.VAL_NUM_SI) == 0) {
						lista.getDocument().add(getIrpfInterop(expediente, tipoDoc));
					}
					if (tipoDoc.getRoleid36().equalsIgnoreCase(TiposDocumentoRoleEnum.PADRON_GENERICO.getRoleID())) {
						lista.getDocument().add(getDocPadronInterop(expediente, tipoDoc));
					}
				}
			}
		}
		return lista;

	}

	private static com.ejie.ad74a.ws.client.platea.solAportacion.TDocument getDocPadronInterop(Expedientes expediente,
			MaestroTiposDoc tipoDoc) {

		com.ejie.ad74a.ws.client.platea.solAportacion.TDocument doc = new com.ejie.ad74a.ws.client.platea.solAportacion.TDocument();

		doc.setDocumentRoleID(tipoDoc.getRoleid36());
		doc.setDocumentRoleName(getRoleName(tipoDoc));
		doc.setDocumentType(TDocumentType.TRA);
		doc.setFormat(TDocFormatType.ELECTRONICO);

		TAuthSvt svt = new TAuthSvt();
		svt.setOsbServiceSOAP(Constantes.DatosConsultaInterop.OBS_SERVICE_SOAP);
		svt.setOperation(Constantes.DatosConsultaInterop.DatosPadronInterop.OPERATION);
		svt.setHeaderToken("true");
		svt.setTargetNameSpaceWS(Constantes.DatosConsultaInterop.TARGET_NAMESPACE);
		svt.setIsInteroperabilidad(TBoolean.TRUE);
		TKeyValueList keyList = new TKeyValueList();
		TKeyValue keyValue = new TKeyValue();
		keyValue.setKey(Constantes.DatosConsultaInterop.DatosPadronInterop.KEY_TERRITORIO);
		keyValue.setType(Constantes.SVT_TYPE_STRING);
		keyValue.setValue(expediente.getDirecciones().getIdProvincia06());
		keyList.getItem().add(keyValue);

		keyValue = new TKeyValue();
		keyValue.setKey(Constantes.DatosConsultaInterop.DatosPadronInterop.KEY_MUNICIPIO);
		keyValue.setType(Constantes.SVT_TYPE_STRING);
		keyValue.setValue(expediente.getDirecciones().getIdMunicipio06());
		keyList.getItem().add(keyValue);

		keyValue = new TKeyValue();
		keyValue.setKey(Constantes.DatosConsultaInterop.DatosPadronInterop.KEY_FECHA);
		keyValue.setType(Constantes.SVT_TYPE_STRING);
		keyValue.setValue(UtilidadesFecha.getFechaSistema(com.ejie.ad74a.constantes.Constantes.FORMATO_FECHA_YYYYMMDD));
		keyList.getItem().add(keyValue);

		keyValue = new TKeyValue();
		keyValue.setKey(Constantes.DatosConsultaInterop.KEY_TITULAR_TIPO_DOC);
		keyValue.setType(Constantes.SVT_TYPE_STRING);
		keyValue.setValue(TipoIdentificadorEnum.getDescEs(expediente.getSolicitantes().getTipoIdentificador01()));
		keyList.getItem().add(keyValue);

		keyValue = new TKeyValue();
		keyValue.setKey(Constantes.DatosConsultaInterop.KEY_TITULAR_DOCUMENTACION);
		keyValue.setType(Constantes.SVT_TYPE_STRING);
		keyValue.setValue(expediente.getSolicitantes().getIdentificador01());
		keyList.getItem().add(keyValue);

		keyValue = new TKeyValue();
		keyValue.setKey(Constantes.DatosConsultaInterop.KEY_TITULAR_NOMBRE);
		keyValue.setType(Constantes.SVT_TYPE_STRING);
		keyValue.setValue(expediente.getSolicitantes().getNombre01());
		keyList.getItem().add(keyValue);

		keyValue = new TKeyValue();
		keyValue.setKey(Constantes.DatosConsultaInterop.KEY_TITULAR_APE1);
		keyValue.setType(Constantes.SVT_TYPE_STRING);
		keyValue.setValue(expediente.getSolicitantes().getApellido101());
		keyList.getItem().add(keyValue);

		keyValue = new TKeyValue();
		keyValue.setKey(Constantes.DatosConsultaInterop.KEY_TITULAR_APE2);
		keyValue.setType(Constantes.SVT_TYPE_STRING);
		keyValue.setValue(expediente.getSolicitantes().getApellido201());
		keyList.getItem().add(keyValue);

		keyValue = new TKeyValue();
		keyValue.setKey(Constantes.DatosConsultaInterop.KEY_FINALIDAD);
		keyValue.setType(Constantes.SVT_TYPE_STRING);
		keyValue.setValue(ProcedimientosEnum.getLabelDescEs(expediente.getIdProcedimiento00()));
		keyList.getItem().add(keyValue);

		keyValue = new TKeyValue();
		keyValue.setKey(Constantes.DatosConsultaInterop.KEY_CONSENTIMIENTO);
		keyValue.setType(Constantes.SVT_TYPE_STRING);
		keyValue.setValue("Ley");
		keyList.getItem().add(keyValue);

		keyValue = new TKeyValue();
		keyValue.setKey(Constantes.DatosConsultaInterop.KEY_PROCEDIMIENTO);
		keyValue.setType(Constantes.SVT_TYPE_STRING);
		keyValue.setValue(Constantes.DatosConsultaInterop.PROCEDIMIENTO_DOCUMENTAL);
		keyList.getItem().add(keyValue);

		keyValue = new TKeyValue();
		keyValue.setKey(Constantes.DatosConsultaInterop.KEY_UNIDAD_TRAMITADORA);
		keyValue.setType(Constantes.SVT_TYPE_STRING);
		keyValue.setValue(Constantes.PLATEA_UNIDAD_ES + " - " + Constantes.PLATEA_UNIDAD_EU);
		keyList.getItem().add(keyValue);

		keyValue = new TKeyValue();
		keyValue.setKey(Constantes.DatosConsultaInterop.KEY_NOMBRE_COMPLETO_FUNCIONARIO);
		keyValue.setType(Constantes.SVT_TYPE_STRING);
		keyValue.setValue(UtilSeguridad.getUsuarioConectado().getFullName());
		keyList.getItem().add(keyValue);

		keyValue = new TKeyValue();
		keyValue.setKey(Constantes.DatosConsultaInterop.DatosPadronInterop.KEY_DNI_FUNCIONARIO);
		keyValue.setType(Constantes.SVT_TYPE_STRING);
		keyValue.setValue(UtilSeguridad.getUsuarioConectado().getNif());
		keyList.getItem().add(keyValue);

		keyValue = new TKeyValue();
		keyValue.setKey(Constantes.DatosConsultaInterop.DatosPadronInterop.KEY_DATOS_ENTRADA_TIPO_DOC);
		keyValue.setType(Constantes.SVT_TYPE_STRING);
		keyValue.setValue(TipoIdentificadorEnum.getDescEs(expediente.getSolicitantes().getTipoIdentificador01()));
		keyList.getItem().add(keyValue);

		keyValue = new TKeyValue();
		keyValue.setKey(Constantes.DatosConsultaInterop.DatosPadronInterop.KEY_DATOS_ENTRADA_NUM_DOC);
		keyValue.setType(Constantes.SVT_TYPE_STRING);
		keyValue.setValue(expediente.getSolicitantes().getIdentificador01());
		keyList.getItem().add(keyValue);

		keyValue = new TKeyValue();
		keyValue.setKey(Constantes.DatosConsultaInterop.DatosPadronInterop.KEY_DATOS_ENTRADA_NOMBRE);
		keyValue.setType(Constantes.SVT_TYPE_STRING);
		keyValue.setValue(expediente.getSolicitantes().getNombre01());
		keyList.getItem().add(keyValue);

		keyValue = new TKeyValue();
		keyValue.setKey(Constantes.DatosConsultaInterop.DatosPadronInterop.KEY_DATOS_ENTRADA_APE1);
		keyValue.setType(Constantes.SVT_TYPE_STRING);
		keyValue.setValue(expediente.getSolicitantes().getApellido101());
		keyList.getItem().add(keyValue);

		keyValue = new TKeyValue();
		keyValue.setKey(Constantes.DatosConsultaInterop.DatosPadronInterop.KEY_DATOS_ENTRADA_APE2);
		keyValue.setType(Constantes.SVT_TYPE_STRING);
		keyValue.setValue(expediente.getSolicitantes().getApellido201());
		keyList.getItem().add(keyValue);

		svt.setParameterList(keyList);

		svt.setProcedureID(expediente.getIdProcedimiento00());
		svt.setManagingUnitID(Constantes.PLATEA_MANAGIN_UNIT_ID);
		svt.setManagingUnitName(PlateaUtils.getUnidadName());
		svt.setDepartmentID(Constantes.PLATEA_DEPARTMENT_ID);
		svt.setDepartmentName(PlateaUtils.getDepartmentName());
		svt.setOrganismID(Constantes.PLATEA_ORGANISM_ID);
		svt.setOrganismName(PlateaUtils.getOrganismName());
		svt.setIsInteroperabilidad(TBoolean.TRUE);

		doc.setIsObligatoryCode(TBoolean.TRUE);

		doc.setSvt(svt);

		return doc;

	}

	private static com.ejie.ad74a.ws.client.platea.solAportacion.TDocument getIrpfInterop(Expedientes expediente,
			MaestroTiposDoc tipoDoc) {

		com.ejie.ad74a.ws.client.platea.solAportacion.TDocument doc = new com.ejie.ad74a.ws.client.platea.solAportacion.TDocument();

		doc.setDocumentRoleID(tipoDoc.getRoleid36());
		doc.setDocumentRoleName(getRoleName(tipoDoc));
		doc.setDocumentType(TDocumentType.TRA);
		doc.setFormat(TDocFormatType.ELECTRONICO);

		TAuthSvt svt = new TAuthSvt();
		svt.setOsbServiceSOAP(Constantes.DatosConsultaInterop.OBS_SERVICE_SOAP);
		svt.setOperation(Constantes.DatosConsultaInterop.DatosIrpfInterop.OPERATION);
		svt.setHeaderToken("true");
		svt.setTargetNameSpaceWS(Constantes.DatosConsultaInterop.TARGET_NAMESPACE);
		svt.setIsInteroperabilidad(TBoolean.TRUE);
		TKeyValueList keyList = new TKeyValueList();
		TKeyValue keyValue = new TKeyValue();

		keyValue = new TKeyValue();
		keyValue.setKey(Constantes.DatosConsultaInterop.KEY_TITULAR_TIPO_DOC);
		keyValue.setType(Constantes.SVT_TYPE_STRING);
		keyValue.setValue(TipoIdentificadorEnum.getDescEs(expediente.getSolicitantes().getTipoIdentificador01()));
		keyList.getItem().add(keyValue);

		keyValue = new TKeyValue();
		keyValue.setKey(Constantes.DatosConsultaInterop.KEY_TITULAR_DOCUMENTACION);
		keyValue.setType(Constantes.SVT_TYPE_STRING);
		keyValue.setValue(expediente.getSolicitantes().getIdentificador01());
		keyList.getItem().add(keyValue);

		keyValue = new TKeyValue();
		keyValue.setKey(Constantes.DatosConsultaInterop.KEY_TITULAR_NOMBRE);
		keyValue.setType(Constantes.SVT_TYPE_STRING);
		keyValue.setValue(expediente.getSolicitantes().getNombre01());
		keyList.getItem().add(keyValue);

		keyValue = new TKeyValue();
		keyValue.setKey(Constantes.DatosConsultaInterop.KEY_TITULAR_APE1);
		keyValue.setType(Constantes.SVT_TYPE_STRING);
		keyValue.setValue(expediente.getSolicitantes().getApellido101());
		keyList.getItem().add(keyValue);

		keyValue = new TKeyValue();
		keyValue.setKey(Constantes.DatosConsultaInterop.KEY_TITULAR_APE2);
		keyValue.setType(Constantes.SVT_TYPE_STRING);
		keyValue.setValue(expediente.getSolicitantes().getApellido201());
		keyList.getItem().add(keyValue);

		//
		keyValue = new TKeyValue();
		keyValue.setKey(Constantes.DatosConsultaInterop.DatosIrpfInterop.KEY_DATOS_ENTRADA_TERRITORIO);
		keyValue.setType(Constantes.SVT_TYPE_STRING);
		keyValue.setValue(expediente.getDirecciones().getIdProvincia06());
		keyList.getItem().add(keyValue);

		keyValue = new TKeyValue();
		keyValue.setKey(Papel0Utils.getIRPFYear());
		keyValue.setType(Constantes.SVT_TYPE_STRING);
		try {
			keyValue.setValue(UtilidadesFecha.getCurrentYear());
		} catch (Exception e) {

		}
		keyList.getItem().add(keyValue);
		//

		keyValue = new TKeyValue();
		keyValue.setKey(Constantes.DatosConsultaInterop.KEY_FINALIDAD);
		keyValue.setType(Constantes.SVT_TYPE_STRING);
		keyValue.setValue(ProcedimientosEnum.getLabelDescEs(expediente.getIdProcedimiento00()));
		keyList.getItem().add(keyValue);

		keyValue = new TKeyValue();
		keyValue.setKey(Constantes.DatosConsultaInterop.KEY_CONSENTIMIENTO);
		keyValue.setType(Constantes.SVT_TYPE_STRING);
		keyValue.setValue("Ley");
		keyList.getItem().add(keyValue);

		keyValue = new TKeyValue();
		keyValue.setKey(Constantes.DatosConsultaInterop.KEY_PROCEDIMIENTO);
		keyValue.setType(Constantes.SVT_TYPE_STRING);
		keyValue.setValue(Constantes.DatosConsultaInterop.PROCEDIMIENTO_DOCUMENTAL);
		keyList.getItem().add(keyValue);

		keyValue = new TKeyValue();
		keyValue.setKey(Constantes.DatosConsultaInterop.KEY_UNIDAD_TRAMITADORA);
		keyValue.setType(Constantes.SVT_TYPE_STRING);
		keyValue.setValue(Constantes.PLATEA_UNIDAD_ES + " - " + Constantes.PLATEA_UNIDAD_EU);
		keyList.getItem().add(keyValue);

		svt.setParameterList(keyList);

		svt.setProcedureID(expediente.getIdProcedimiento00());
		svt.setManagingUnitID(Constantes.PLATEA_MANAGIN_UNIT_ID);
		svt.setManagingUnitName(PlateaUtils.getUnidadName());
		svt.setDepartmentID(Constantes.PLATEA_DEPARTMENT_ID);
		svt.setDepartmentName(PlateaUtils.getDepartmentName());
		svt.setOrganismID(Constantes.PLATEA_ORGANISM_ID);
		svt.setOrganismName(PlateaUtils.getOrganismName());
		svt.setIsInteroperabilidad(TBoolean.TRUE);

		doc.setIsObligatoryCode(TBoolean.TRUE);

		doc.setSvt(svt);

		return doc;

	}

	private static com.ejie.ad74a.ws.client.platea.solAportacion.TTextI18N getRoleName(MaestroTiposDoc tipoDoc) {
		com.ejie.ad74a.ws.client.platea.solAportacion.TTextI18N textI18N = new com.ejie.ad74a.ws.client.platea.solAportacion.TTextI18N();
		com.ejie.ad74a.ws.client.platea.solAportacion.TStringI18N stringI18N;

		stringI18N = new com.ejie.ad74a.ws.client.platea.solAportacion.TStringI18N();
		stringI18N.setLocale(com.ejie.ad74a.ws.client.platea.solAportacion.TLanguage.ES);
		stringI18N.setValue(tipoDoc.getDescEs36());
		textI18N.getText().add(stringI18N);

		stringI18N = new com.ejie.ad74a.ws.client.platea.solAportacion.TStringI18N();
		stringI18N.setLocale(com.ejie.ad74a.ws.client.platea.solAportacion.TLanguage.EU);
		stringI18N.setValue(tipoDoc.getDescEu36());
		textI18N.getText().add(stringI18N);

		return textI18N;
	}

	private static com.ejie.ad74a.ws.client.platea.solAportacion.TTextI18N getEntityName() {
		com.ejie.ad74a.ws.client.platea.solAportacion.TTextI18N textI18N = new com.ejie.ad74a.ws.client.platea.solAportacion.TTextI18N();
		com.ejie.ad74a.ws.client.platea.solAportacion.TStringI18N stringI18N;

		stringI18N = new com.ejie.ad74a.ws.client.platea.solAportacion.TStringI18N();
		stringI18N.setLocale(com.ejie.ad74a.ws.client.platea.solAportacion.TLanguage.ES);
		stringI18N.setValue(Constantes.PLATEA_ENTITY_NAME_ES);
		textI18N.getText().add(stringI18N);

		stringI18N = new com.ejie.ad74a.ws.client.platea.solAportacion.TStringI18N();
		stringI18N.setLocale(com.ejie.ad74a.ws.client.platea.solAportacion.TLanguage.EU);
		stringI18N.setValue(Constantes.PLATEA_ENTITY_NAME_EU);
		textI18N.getText().add(stringI18N);

		return textI18N;
	}

	public static SignatureList unmarshalSignatureList(String xml) throws UnmarshalException {
		JAXBContext jaxbContext;
		try {

			xml = xml.replaceAll("<signatureList>", "<signatureList xmlns=\\\"com/ejie/dokusi/xml\\\">");
			jaxbContext = JAXBContext.newInstance(SignatureList.class);

			Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
			return (SignatureList) jaxbUnmarshaller.unmarshal(new ByteArrayInputStream(xml.getBytes("UTF-8")));

		} catch (JAXBException e) {
			throw new UnmarshalException("Error de JAXB al traducir el XML", e);
		} catch (UnsupportedEncodingException e) {
			throw new UnmarshalException("Error de codificacion al leer el XML", e);
		}
	}

	public static String extractDocumentalType(String roleID) {
		String rdo = roleID;
		// tokenizar roleId por "."
		StringTokenizer tokenizer = new StringTokenizer(roleID, ".");
		String[] roleIdTkn = new String[tokenizer.countTokens()];
		int i = 0;
		while (tokenizer.hasMoreTokens()) {
			roleIdTkn[i++] = tokenizer.nextToken();
		}
		// obtener tipo documental
		if (roleIdTkn.length > 1) {
			if (roleIdTkn[1].equals("0")) {
				// no tiene subtipo AD
				// devolvemos el tipoAD
				rdo = roleIdTkn[0];
			} else {
				// devolvemos el subtipoAD
				rdo = roleIdTkn[1];
			}
		}
		return rdo;
	}

	public static com.ejie.ad74a.ws.client.platea.expedienteElectronico.TAuthSvt castTAuthSvtsolToExpE(
			TAuthSvt tAuthSvtSol) {

		com.ejie.ad74a.ws.client.platea.expedienteElectronico.TAuthSvt tAuthSvtExpE = new com.ejie.ad74a.ws.client.platea.expedienteElectronico.TAuthSvt();

		// ParameterList
		com.ejie.ad74a.ws.client.platea.expedienteElectronico.TKeyValueList tKeyValueListExpE = new com.ejie.ad74a.ws.client.platea.expedienteElectronico.TKeyValueList();

		for (TKeyValue tKeyValueSol : tAuthSvtSol.getParameterList().getItem()) {
			com.ejie.ad74a.ws.client.platea.expedienteElectronico.TKeyValue tKeyValueExpE = new com.ejie.ad74a.ws.client.platea.expedienteElectronico.TKeyValue();
			tKeyValueExpE.setKey(tKeyValueSol.getKey());
			tKeyValueExpE.setValue(tKeyValueSol.getValue());

			tKeyValueListExpE.getItem().add(tKeyValueExpE);
		}
		tAuthSvtExpE.setParameterList(tKeyValueListExpE);

		tAuthSvtExpE.setTargetNameSpaceWS(tAuthSvtSol.getTargetNameSpaceWS());
		tAuthSvtExpE.setHeaderToken(tAuthSvtSol.getHeaderToken());
		tAuthSvtExpE.setOsbServiceSOAP(tAuthSvtSol.getOsbServiceSOAP());
		tAuthSvtExpE.setOperation(tAuthSvtSol.getOperation());

		tAuthSvtExpE.setProcedureID(tAuthSvtSol.getProcedureID());
		tAuthSvtExpE.setManagingUnitID(tAuthSvtSol.getManagingUnitID());

		TTextI18N managingUnitNameExpE = castTTextI18NSolToExpE(tAuthSvtSol.getManagingUnitName());
		tAuthSvtExpE.setManagingUnitName(managingUnitNameExpE);
//			<ns1:text locale="es">IGUALDAD, JUSTICIA Y POLÍTICAS SOCIALES-DIRECCIÓN DE SERVICIOS SOCIALES</ns1:text>
//			<ns1:text locale="eu">BERDINTASUNA, JUSTIZIA ETA GIZARTE POLITIKETAKO-GIZARTE ZERBITZUEN ZUZENDARITZA</ns1:text>

		tAuthSvtExpE.setDepartmentID(tAuthSvtSol.getDepartmentID());

		tAuthSvtExpE.setDepartmentName(castTTextI18NSolToExpE(tAuthSvtSol.getDepartmentName()));
		tAuthSvtExpE.setOrganismID(tAuthSvtSol.getOrganismID());
		tAuthSvtExpE.setOrganismName(castTTextI18NSolToExpE(tAuthSvtSol.getOrganismName()));

		if (TBoolean.TRUE.equals(tAuthSvtSol.getIsInteroperabilidad())) {
			tAuthSvtExpE.setIsInteroperabilidad(com.ejie.ad74a.ws.client.platea.expedienteElectronico.TBoolean.TRUE);
		} else if (TBoolean.FALSE.equals(tAuthSvtSol.getIsInteroperabilidad())) {
			tAuthSvtExpE.setIsInteroperabilidad(com.ejie.ad74a.ws.client.platea.expedienteElectronico.TBoolean.FALSE);
		}

		return tAuthSvtExpE;
	}

	private static TTextI18N castTTextI18NSolToExpE(com.ejie.ad74a.ws.client.platea.solAportacion.TTextI18N tTextI18N) {
		TTextI18N managingUnitNameExpE = new TTextI18N();
		for (TStringI18N tStringSol : tTextI18N.getText()) {
			com.ejie.ad74a.ws.client.platea.expedienteElectronico.TStringI18N tStringExpE = new com.ejie.ad74a.ws.client.platea.expedienteElectronico.TStringI18N();
			tStringExpE.setValue(tStringSol.getValue());
			if (com.ejie.ad74a.ws.client.platea.solAportacion.TLanguage.ES.equals(tStringSol.getLocale())) {
				tStringExpE.setLocale(TLanguage.ES);
			} else if (com.ejie.ad74a.ws.client.platea.solAportacion.TLanguage.EU.equals(tStringSol.getLocale())) {
				tStringExpE.setLocale(TLanguage.EU);
			}

			managingUnitNameExpE.getText().add(tStringExpE);
		}
		return managingUnitNameExpE;
	}
}