package com.ejie.ab61.service.serviciosWeb;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.StringWriter;
import java.math.BigDecimal;
import java.sql.SQLException;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Properties;

import javax.annotation.Resource;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.apache.commons.io.FilenameUtils;
import org.apache.commons.io.output.ByteArrayOutputStream;
import org.apache.poi.hssf.usermodel.HSSFDataFormat;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.FormulaEvaluator;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFFont;
import org.apache.poi.xssf.usermodel.XSSFFormulaEvaluator;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.NoSuchMessageException;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.SessionAttributes;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

import com.ejie.ab61.adaptadores.T65BDokusiAdaptadorService;
import com.ejie.ab61.adaptadores.X43CuentasInteresadosAdaptadorService;
import com.ejie.ab61.adaptadores.X43ProcedimientosAdaptadorService;
import com.ejie.ab61.adaptadores.X43SolicitudesYAportacionesAdaptadorService;
import com.ejie.ab61.adaptadores.X43TareasTramitacionAdaptadorService;
import com.ejie.ab61.clientesWS.X43CuentasInteresados.TCanalNotificacion;
import com.ejie.ab61.clientesWS.X43CuentasInteresados.TConsentimiento;
import com.ejie.ab61.clientesWS.X43CuentasInteresados.TCuenta;
import com.ejie.ab61.clientesWS.X43CuentasInteresados.TInteresado;
import com.ejie.ab61.clientesWS.X43CuentasInteresados.TInterestedSearch;
import com.ejie.ab61.clientesWS.X43CuentasInteresados.TNia;
import com.ejie.ab61.clientesWS.X43CuentasInteresados.TSexo;
import com.ejie.ab61.clientesWS.X43CuentasInteresados.TTipoContacto;
import com.ejie.ab61.clientesWS.X43Procedimientos.TConsultationContext;
import com.ejie.ab61.clientesWS.X43SolicitudesYAportaciones.TAccount;
import com.ejie.ab61.clientesWS.X43SolicitudesYAportaciones.TAdminInitRequest;
import com.ejie.ab61.clientesWS.X43SolicitudesYAportaciones.TAdminInitResponse;
import com.ejie.ab61.clientesWS.X43SolicitudesYAportaciones.TApplicantRRI;
import com.ejie.ab61.clientesWS.X43SolicitudesYAportaciones.TApplicantRRIList;
import com.ejie.ab61.clientesWS.X43SolicitudesYAportaciones.TContact;
import com.ejie.ab61.clientesWS.X43SolicitudesYAportaciones.TContactList;
import com.ejie.ab61.clientesWS.X43SolicitudesYAportaciones.TContactType;
import com.ejie.ab61.clientesWS.X43SolicitudesYAportaciones.TFolderOriginType;
import com.ejie.ab61.clientesWS.X43SolicitudesYAportaciones.TInterested;
import com.ejie.ab61.clientesWS.X43SolicitudesYAportaciones.TInterestedList;
import com.ejie.ab61.clientesWS.X43SolicitudesYAportaciones.TNiaType;
import com.ejie.ab61.clientesWS.X43SolicitudesYAportaciones.TNotificationType;
import com.ejie.ab61.clientesWS.X43SolicitudesYAportaciones.TNotifyChannel;
import com.ejie.ab61.clientesWS.X43SolicitudesYAportaciones.TParticipantTguneType;
import com.ejie.ab61.clientesWS.X43SolicitudesYAportaciones.TParticipantType;
import com.ejie.ab61.clientesWS.X43SolicitudesYAportaciones.TPostalAddress;
import com.ejie.ab61.clientesWS.X43SolicitudesYAportaciones.TSexType;
import com.ejie.ab61.clientesWS.X43SolicitudesYAportaciones.TSubmissionResponse;
import com.ejie.ab61.clientesWS.X43TareasTramitacion.AExtensionPoint;
import com.ejie.ab61.clientesWS.X43TareasTramitacion.ObjectFactory;
import com.ejie.ab61.clientesWS.X43TareasTramitacion.TBoolean;
import com.ejie.ab61.clientesWS.X43TareasTramitacion.TDocFormatType;
import com.ejie.ab61.clientesWS.X43TareasTramitacion.TDocNatureType;
import com.ejie.ab61.clientesWS.X43TareasTramitacion.TGatTaskFilter;
import com.ejie.ab61.clientesWS.X43TareasTramitacion.TKeyValue;
import com.ejie.ab61.clientesWS.X43TareasTramitacion.TLanguage;
import com.ejie.ab61.clientesWS.X43TareasTramitacion.TMessage;
import com.ejie.ab61.clientesWS.X43TareasTramitacion.TMessageFilter;
import com.ejie.ab61.clientesWS.X43TareasTramitacion.TMessageFilterValue;
import com.ejie.ab61.clientesWS.X43TareasTramitacion.TMessageFilterValueList;
import com.ejie.ab61.clientesWS.X43TareasTramitacion.TMessageList;
import com.ejie.ab61.clientesWS.X43TareasTramitacion.TMessageStatus;
import com.ejie.ab61.clientesWS.X43TareasTramitacion.TMessageStatusList;
import com.ejie.ab61.clientesWS.X43TareasTramitacion.TMessageTipology;
import com.ejie.ab61.clientesWS.X43TareasTramitacion.TMessageTipologyList;
import com.ejie.ab61.clientesWS.X43TareasTramitacion.TNotificationBody;
import com.ejie.ab61.clientesWS.X43TareasTramitacion.TPersonIDName;
import com.ejie.ab61.clientesWS.X43TareasTramitacion.TStringI18N;
import com.ejie.ab61.clientesWS.X43TareasTramitacion.TStringList;
import com.ejie.ab61.clientesWS.X43TareasTramitacion.TTask;
import com.ejie.ab61.clientesWS.X43TareasTramitacion.TTaskInfoDocument;
import com.ejie.ab61.clientesWS.X43TareasTramitacion.TTaskType;
import com.ejie.ab61.clientesWS.X43TareasTramitacion.TTextI18N;
import com.ejie.ab61.comun.CargarPropiedades;
import com.ejie.ab61.comun.Constantes;
import com.ejie.ab61.comun.utilidades.DateUtils;
import com.ejie.ab61.comun.utilidades.config.Config;
import com.ejie.ab61.comun.utilidades.toolkit.ToolkitParameterUtils;
import com.ejie.ab61.dao.busquedas.BusquedasDao;
import com.ejie.ab61.dao.expedientes.RelExpPlaDao;
import com.ejie.ab61.dao.expedientes.RelExpTerDao;
import com.ejie.ab61.dao.inicioOficioExp.RelExpOriDesDao;
import com.ejie.ab61.dao.listados.ListadosDao;
import com.ejie.ab61.dao.parametros.ParametrosDao;
import com.ejie.ab61.dao.plantillas.ParametrosConfigDao;
import com.ejie.ab61.dao.procedimientos.ProcedimientosDao;
import com.ejie.ab61.dao.serviciosWeb.ServiciosWebDao;
import com.ejie.ab61.dao.terceros.DatosDireccionesDao;
import com.ejie.ab61.exceptions.Ab61Exception;
import com.ejie.ab61.exceptions.PifException;
import com.ejie.ab61.exceptions.X43TareasTramitacionException;
import com.ejie.ab61.model.busquedas.Busquedas;
import com.ejie.ab61.model.documento.Documento;
import com.ejie.ab61.model.documento.Documento.Tipologia;
import com.ejie.ab61.model.documento.DocumentoAportado;
import com.ejie.ab61.model.documentosPid.DocumentosPid;
import com.ejie.ab61.model.documentosPid.IdentificadoresPid;
import com.ejie.ab61.model.expedientes.Expedientes;
import com.ejie.ab61.model.expedientes.RelExpPla;
import com.ejie.ab61.model.expedientes.RelExpTer;
import com.ejie.ab61.model.inicioOficioExp.RelExpOriDes;
import com.ejie.ab61.model.inspecciones.Inspecciones;
import com.ejie.ab61.model.listados.Listados;
import com.ejie.ab61.model.origen.Origen;
import com.ejie.ab61.model.parametros.Parametros;
import com.ejie.ab61.model.plantillas.CamposPlantilla;
import com.ejie.ab61.model.plantillas.ParametrosConfig;
import com.ejie.ab61.model.plantillas.Plantillas;
import com.ejie.ab61.model.plantillas.RelPlaCam;
import com.ejie.ab61.model.plantillas.TiposPlantilla;
import com.ejie.ab61.model.procedimientos.Procedimientos;
import com.ejie.ab61.model.serviciosWeb.BusquedasWS;
import com.ejie.ab61.model.serviciosWeb.DocumentoWS;
import com.ejie.ab61.model.serviciosWeb.ParametrosWS;
import com.ejie.ab61.model.serviciosWeb.inicioOficio.DatosInicioOficio;
import com.ejie.ab61.model.serviciosWeb.inicioOficio.InicioOficioTitularWS;
import com.ejie.ab61.model.serviciosWeb.inicioOficio.InicioOficioWS;
import com.ejie.ab61.model.serviciosWeb.inicioOficio.TipoDocumentoIdentidad;
import com.ejie.ab61.model.serviciosWeb.inicioOficio.TipoSexo;
import com.ejie.ab61.model.terceros.DatosDirecciones;
import com.ejie.ab61.model.terceros.DatosTerceros;
import com.ejie.ab61.model.terceros.TiposDireccion;
import com.ejie.ab61.model.toolkit.Parameters;
import com.ejie.ab61.model.toolkit.ValorBusquedas;
import com.ejie.ab61.model.toolkit.ValorComboToolkit;
import com.ejie.ab61.service.documentosPid.DocumentosPidService;
import com.ejie.ab61.service.expedientes.ExpedientesService;
import com.ejie.ab61.service.expedientes.RelExpPlaService;
import com.ejie.ab61.service.generarRtf.RtfService;
import com.ejie.ab61.service.inspecciones.InspeccionesService;
import com.ejie.ab61.service.plantillas.CamposPlantillaService;
import com.ejie.ab61.service.plantillas.PlantillasService;
import com.ejie.ab61.service.plantillas.RecuperarDatosCampoService;
import com.ejie.ab61.service.plantillas.RelPlaCamService;
import com.ejie.ab61.service.plantillas.TiposPlantillaService;
import com.ejie.ab61.service.terceros.DatosTercerosService;
import com.ejie.ab61.tramita.adapter.PidAdapterService;
import com.ejie.ab61.tramita.adapter.PifAdapterService;
import com.ejie.y31.exception.Y31JanoServiceFileNotFoundException;
import com.ejie.y31.vo.Y31AttachmentBean;

@Service(value = "ServiciosWebService")
@SessionAttributes("usuario")
public class ServiciosWebServiceImpl implements ServiciosWebService {

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

	@Resource
	ReloadableResourceBundleMessageSource appMessageSource;
	@Autowired
	public ServiciosWebDao serviciosWebDao;
	@Autowired
	public BusquedasDao busquedasDao;
	@Autowired
	public ParametrosDao parametrosDao;
	@Autowired
	public ListadosDao listadosDao;
	@Autowired
	private PifAdapterService pifAdapterService;
	@Autowired
	private PlantillasService plantillasService;
	@Autowired
	private RelPlaCamService relPlaCamService;
	@Autowired
	private CamposPlantillaService camposPlantillaService;
	@Autowired
	private ExpedientesService expedientesService;

	@Autowired
	private RelExpPlaService relExpPlaService;

	@Autowired
	private ProcedimientosDao procedimientosDao;
	@Autowired
	private RecuperarDatosCampoService recuperarDatosCampoService;

	@Autowired
	private RtfService rtfService;

	@Autowired()
	private X43TareasTramitacionAdaptadorService x43TareasTramitacionAdaptadorService;
	@Autowired
	private RelExpPlaDao relExpPlaDao;

	@Autowired()
	private X43SolicitudesYAportacionesAdaptadorService x43SolicitudesYAportacionesAdaptadorService;

	@Autowired()
	private X43ProcedimientosAdaptadorService x43ProcedimientosAdaptadorService;

	@Autowired()
	private X43CuentasInteresadosAdaptadorService x43CuentasInteresadosAdaptadorService;

	@Autowired
	private RelExpTerDao relExpTerDao;

	@Autowired
	private DatosTercerosService datosTercerosService;

	@Autowired
	private DatosDireccionesDao datosDireccionesDao;

	@Autowired
	private RelExpOriDesDao relExpOriDesDao;

	@Autowired
	private ParametrosConfigDao parametrosConfigDao;

	@Autowired
	private PidAdapterService pidAdapterService;

	@Autowired
	private TiposPlantillaService tiposPlantillaService;

	@Autowired
	private InspeccionesService inspeccionesService;

	@Autowired
	private DocumentosPidService documentosPidService;

	@Autowired
	private T65BDokusiAdaptadorService t65bDokusiAdaptadorService;

	public static final String TEMP_PATH = CargarPropiedades.getConfigAplicacion("TEMP.DIR");

	@Override
	public String obtenerDatosNegocio(String parametroEntrada, String nombreVista) {

		List<ValorComboToolkit> listaValorComboToolkit = new ArrayList<ValorComboToolkit>();
		ServiciosWebServiceImpl.logger
				.info("[GET - findDataForToolkit] : Obtener lista de datos para el parametroEntrada / vista: "
						+ parametroEntrada + "/" + nombreVista);
		listaValorComboToolkit = this.serviciosWebDao.findDataForToolkit(parametroEntrada, nombreVista);

		ServiciosWebServiceImpl.logger
				.info("tamayo de lista de datos para el folder_number: " + listaValorComboToolkit.size());
		Parameters parameters = ToolkitParameterUtils.getInstance()
				.construirParametersListaValorComboToolkit(listaValorComboToolkit);

		return ToolkitParameterUtils.getInstance().unparseParametersToString(parameters);

	}

	private String subirAPIF(Listados listado, Workbook workbook, String codAplic) throws IOException, PifException {
		ByteArrayOutputStream bos = new ByteArrayOutputStream();
		workbook.write(bos);
		byte[] barray = bos.toByteArray();
		InputStream is = new ByteArrayInputStream(barray);
		String nombre = listado.getNombre() + "_" + new Date().getTime() + ".xlsx";

		if (null != listado.getNombreFichero() && "" != listado.getNombreFichero()) {
			String ext = listado.getNombreFichero().substring(listado.getNombreFichero().lastIndexOf('.'),
					listado.getNombreFichero().length());
			String nombreFichero = listado.getNombreFichero().substring(0, listado.getNombreFichero().lastIndexOf('.'));
			nombre = nombreFichero + "_" + new Date().getTime() + ext;
			nombre = nombre.replace(' ', '_');
		}
		return pifAdapterService.putFile(is, nombre, "/" + codAplic + "/", true).getFilePath();
	}

	private CellStyle crearStiloParaCeldas(Workbook workbook) {
		CellStyle estilo = workbook.createCellStyle();
		/* cramos fuente */
		Font fuente = workbook.createFont();
		/* la ponemos en negrita */
		fuente.setBoldweight(XSSFFont.BOLDWEIGHT_BOLD);
		/* cramos un estilo */
		estilo.setFont(fuente);
		return estilo;
	}

	@Override
	public String generarExcelListados(int idListado, List<BusquedasWS> listaBusquedas, String codAplic,
			Integer idProcedimiento) throws Ab61Exception {
		ServiciosWebServiceImpl.logger.info("Entrada  generarExcelListados");
		ServiciosWebServiceImpl.logger.info("idListado " + idListado);
		ServiciosWebServiceImpl.logger.info("listaBusquedas size " + listaBusquedas.size());
		String oid = "";
		Listados listados = new Listados();
		listados.setIdListado(idListado);
		Listados listado = listadosDao.find(listados);
		boolean errorSQL = false;

		try {
			XSSFWorkbook workbook = null;
			int numeroHojas = 0;

			if (null != listado && null != listado.getFicheroArray()) {
				ServiciosWebServiceImpl.logger.info("El listado contiene un fichero excel ");
				InputStream targetStream = new ByteArrayInputStream(listado.getFicheroArray());
				workbook = new XSSFWorkbook(targetStream);
				numeroHojas = workbook.getNumberOfSheets();

			} else if (null != listado && null == listado.getFicheroArray()) {
				workbook = new XSSFWorkbook();
			}

			// creamos el estilo negrita para la cabecera de la tabla
			CellStyle estilo = crearStiloParaCeldas(workbook);
			CellStyle estiloNumero = workbook.createCellStyle();
			estiloNumero.setDataFormat(HSSFDataFormat.getBuiltinFormat("#"));
			CellStyle estiloNumeroDecimal = workbook.createCellStyle();
			estiloNumeroDecimal.setDataFormat(HSSFDataFormat.getBuiltinFormat("#,##0.00"));

			// para cada una de las busquedas recuperamos la busqueda de la bbdd
			for (int i = 0; i < listaBusquedas.size(); i++) {
				BusquedasWS busquedaWebService = listaBusquedas.get(i);
				ServiciosWebServiceImpl.logger.info("busquedaWebService " + busquedaWebService.getIdBusqueda());
				List<ParametrosWS> parametrosWebService = busquedaWebService.getParametros();

				// busqueda recuperada de la base de datos
				Busquedas busquedaBd = busquedasDao.find(new Busquedas(busquedaWebService.getIdBusqueda()));
				if (null != busquedaBd) {
					ServiciosWebServiceImpl.logger.info("busquedaBd " + busquedaBd.getIdBusqueda());
					Parametros parametroBusqueda = new Parametros();
					parametroBusqueda.setIdBusqueda(busquedaWebService.getIdBusqueda());
					// parametros base de datos
					List<Parametros> parametrosBd = parametrosDao.findAllLike(parametroBusqueda, null, false);

					// sustituimos en la query los parametros de la base de
					// datos,
					// por
					// el valor de los mismos en el webService
					String sql = busquedaBd.getSqlListado();
					for (Parametros parametroBd : parametrosBd) {
						ServiciosWebServiceImpl.logger.info("parametroBd " + parametroBd.getIdParametro());
						for (ParametrosWS parametroWebService : parametrosWebService) {
							ServiciosWebServiceImpl.logger
									.info("parametroWebService " + parametroWebService.getIdParametro());
							if (parametroBd.getIdParametro().equals(parametroWebService.getIdParametro())) {
								sql = sql.replaceAll(parametroBd.getNombre(), parametroWebService.getValor());
							}
						}
					}

					if (sql.contains(Constantes.ID_PROC)) {
						sql = sql.replace(Constantes.ID_PROC, idProcedimiento.toString());
					}

					ServiciosWebServiceImpl.logger.info("sql " + sql);
					List<ValorBusquedas> resultadoSqlBusqueda = new ArrayList<ValorBusquedas>();
					// ejecutamos la Select
					try {
						resultadoSqlBusqueda = serviciosWebDao.ejecutarSQLBusqueda(sql);
					} catch (Exception e) {

						errorSQL = true;
						String sCodigoError = "error.SQLBusqueda";
						throw new Ab61Exception(sCodigoError,
								appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
								appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));
					}
					if (!resultadoSqlBusqueda.isEmpty()) {
						// si en el mantenimiento se ha metido un excel en base
						// de
						// datos, se rellena ese excel
						if (null != listado && null != listado.getFicheroArray()) {
							ServiciosWebServiceImpl.logger
									.info("Workbook tiene " + workbook.getNumberOfSheets() + " hojas : ");
							// 1. iteramos las hojas del documento
							Boolean existeHoja = false;
							for (int j = 0; j < numeroHojas; j++) {

								Sheet sheet = workbook.getSheetAt(j);
								ServiciosWebServiceImpl.logger.info("SheetName " + sheet.getSheetName());
								// si el nombre de la hoja es el nombre de la
								// busqueda,
								// tendremos que pintar ahi el contenido de
								// resultadoSqlBusqueda
								if (sheet.getSheetName().equalsIgnoreCase(busquedaBd.getNombre())) {
									existeHoja = true;
									for (ValorBusquedas valorBusquedas : resultadoSqlBusqueda) {
										Row rowResultados = sheet.createRow(sheet.getLastRowNum() + 1);
										if (null != valorBusquedas && null != valorBusquedas.getValor()) {
											String[] valorBusquedasArray = valorBusquedas.getValor().split("#");
											for (int k = 0; k < valorBusquedasArray.length; k++) {

												try {
													String valor = valorBusquedasArray[k].replace(".", "");
													valor = valor.replace(",", ".");
													String letraDni = valor.substring(valor.length() - 1);
													if (letraDni.equalsIgnoreCase(Constantes.LETRA_LONG)
															|| letraDni.equalsIgnoreCase(Constantes.LETRA_FLOAT)
															|| letraDni.equalsIgnoreCase(Constantes.LETRA_DOUBLE)) {
														rowResultados.createCell(k)
																.setCellValue(valorBusquedasArray[k]);
													} else {
														double valorNumerico = Double.parseDouble(valor);
														Cell celdaNumero = rowResultados.createCell(k);
														celdaNumero.setCellValue(valorNumerico);

														if (valorBusquedasArray[k].indexOf(',') != -1) {
															celdaNumero.setCellStyle(estiloNumeroDecimal);
														} else {
															celdaNumero.setCellStyle(estiloNumero);
														}
													}

												} catch (Exception e) {
													rowResultados.createCell(k).setCellValue(valorBusquedasArray[k]);
												}

											}
										}
									}
									break;
								}
							}
							if (!existeHoja) {
								Sheet sheetNueva = workbook.createSheet();
								workbook.setSheetName(workbook.getSheetIndex(sheetNueva), busquedaBd.getNombre());
								String[] headersNueva = busquedaBd.getCampos().split(";");
								Row row = sheetNueva.createRow(sheetNueva.getLastRowNum() + 1);
								for (int k = 0; k < headersNueva.length; k++) {
									ServiciosWebServiceImpl.logger.info("headers" + headersNueva[k]);
									Cell cell = row.createCell(k);
									cell.setCellValue(headersNueva[k]);
									cell.setCellStyle(estilo);
								}
								for (ValorBusquedas valorBusquedas : resultadoSqlBusqueda) {
									Row rowResultadosNueva = sheetNueva.createRow(sheetNueva.getLastRowNum() + 1);
									if (null != valorBusquedas && null != valorBusquedas.getValor()) {
										String[] valorBusquedasArray = valorBusquedas.getValor().split("#");
										for (int k = 0; k < valorBusquedasArray.length; k++) {
											try {
												String valor = valorBusquedasArray[k].replace(".", "");
												valor = valor.replace(",", ".");
												String letraDni = valor.substring(valor.length() - 1);
												if (letraDni.equalsIgnoreCase(Constantes.LETRA_LONG)
														|| letraDni.equalsIgnoreCase(Constantes.LETRA_FLOAT)
														|| letraDni.equalsIgnoreCase(Constantes.LETRA_DOUBLE)) {
													rowResultadosNueva.createCell(k)
															.setCellValue(valorBusquedasArray[k]);
												} else {
													double valorNumerico = Double.parseDouble(valor);
													Cell celdaNumero = rowResultadosNueva.createCell(k);
													celdaNumero.setCellValue(valorNumerico);

													if (valorBusquedasArray[k].indexOf(',') != -1) {
														celdaNumero.setCellStyle(estiloNumeroDecimal);
													} else {
														celdaNumero.setCellStyle(estiloNumero);
													}
												}

											} catch (Exception e) {
												rowResultadosNueva.createCell(k).setCellValue(valorBusquedasArray[k]);
											}
										}
									}
								}
							}

							try {
								XSSFFormulaEvaluator.evaluateAllFormulaCells(workbook);
							} catch (Exception e) {
							}

						} else {
							ServiciosWebServiceImpl.logger.info("El listado no tiene fichero excel ");

							Sheet sheet = workbook.createSheet();
							workbook.setSheetName(i, busquedaBd.getNombre());
							String[] headers = busquedaBd.getCampos().split(";");
							Row row = sheet.createRow(0);
							for (int k = 0; k < headers.length; k++) {
								ServiciosWebServiceImpl.logger.info("headers " + headers[k]);
								Cell cell = row.createCell(k);
								cell.setCellValue(headers[k]);
								cell.setCellStyle(estilo);
							}
							for (ValorBusquedas valorBusquedas : resultadoSqlBusqueda) {
								Row rowResultados = sheet.createRow(sheet.getLastRowNum() + 1);
								if (null != valorBusquedas && null != valorBusquedas.getValor()) {
									String[] valorBusquedasArray = valorBusquedas.getValor().split("#");
									for (int k = 0; k < valorBusquedasArray.length; k++) {
										try {
											String valor = valorBusquedasArray[k].replace(".", "");
											valor = valor.replace(",", ".");
											String letraDni = valor.substring(valor.length() - 1);
											if (letraDni.equalsIgnoreCase(Constantes.LETRA_LONG)
													|| letraDni.equalsIgnoreCase(Constantes.LETRA_FLOAT)
													|| letraDni.equalsIgnoreCase(Constantes.LETRA_DOUBLE)) {
												rowResultados.createCell(k).setCellValue(valorBusquedasArray[k]);
											} else {
												double valorNumerico = Double.parseDouble(valor);
												Cell celdaNumero = rowResultados.createCell(k);
												celdaNumero.setCellValue(valorNumerico);

												if (valorBusquedasArray[k].indexOf(',') != -1) {
													celdaNumero.setCellStyle(estiloNumeroDecimal);
												} else {
													celdaNumero.setCellStyle(estiloNumero);
												}
											}

										} catch (Exception e) {
											rowResultados.createCell(k).setCellValue(valorBusquedasArray[k]);
										}
									}
								}
							}
						}
					} else {
						// Cuando no tenemos resultados de la búsqueda
						if (null != listado && null == listado.getFicheroArray()) {
							// Si no tenemos Excel generamos una pestaña vacía
							// con las cabeceras correspondientes

							Sheet sheet = workbook.createSheet();
							workbook.setSheetName(i, busquedaBd.getNombre());
							String[] headers = busquedaBd.getCampos().split(";");
							Row row = sheet.createRow(0);
							for (int k = 0; k < headers.length; k++) {
								ServiciosWebServiceImpl.logger.info("headers " + headers[k]);
								Cell cell = row.createCell(k);
								cell.setCellValue(headers[k]);
								cell.setCellStyle(estilo);
							}
						}

					}
				}
			}
			if (null != workbook) {
				oid = subirAPIF(listado, workbook, codAplic);
			}

		} catch (IOException e) {

			String sCodigoError = "error.IOException";

			ServiciosWebServiceImpl.logger.error(sCodigoError, e);

			throw new Ab61Exception(sCodigoError, appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
					appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));

		} catch (NumberFormatException e) {

			String sCodigoError = "error.NumberFormatException";

			ServiciosWebServiceImpl.logger.error(sCodigoError, e);

			throw new Ab61Exception(sCodigoError, appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
					appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));

		} catch (PifException e) {

			String sCodigoError = "error.PIF_Exception";

			ServiciosWebServiceImpl.logger.error(sCodigoError, e);

			throw new Ab61Exception(sCodigoError, appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
					appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));

		} catch (Exception e) {

			String sCodigoError = "error.No_controlado";

			if (errorSQL) {
				sCodigoError = "error.SQLBusqueda";
			}

			ServiciosWebServiceImpl.logger.error(sCodigoError, e);

			throw new Ab61Exception(sCodigoError, appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
					appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));
		}

		ServiciosWebServiceImpl.logger.info("oid " + oid);

		return oid;
	}

	@Override
	public String generarDocumento(Integer idPlantilla, String procedureId, String folderId,
			String identificadorInspeccion, String usuario) throws Ab61Exception {

		String path_Usuario = "";
		int idExpediente = 0;

		if ("".equals(idPlantilla) || null == idPlantilla) {
			String sCodigoError = "error.obligatorio.idPlantilla";

			ServiciosWebServiceImpl.logger.error("generarDocumento - " + sCodigoError);

			throw new Ab61Exception(sCodigoError, appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
					appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));
		} else if ("".equals(usuario) || null == usuario) {
			String sCodigoError = "error.obligatorio.usuario";

			ServiciosWebServiceImpl.logger.error("generarDocumento - " + sCodigoError);

			throw new Ab61Exception(sCodigoError, appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
					appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));
		}

		// Recuperamos la plantilla
		Plantillas plantilla = new Plantillas();
		plantilla.setIdPlantilla(idPlantilla);
		plantilla = this.plantillasService.find(plantilla);
		ServiciosWebServiceImpl.logger.info("Encontamos la platilla" + plantilla.toString());
		RelPlaCam camposPlantilla = new RelPlaCam();

		camposPlantilla.setIdDocumento(plantilla.getDocumento().getIdDocumento());
		List<RelPlaCam> listaRelacionCampos = this.relPlaCamService.findAll(camposPlantilla, null);
		ServiciosWebServiceImpl.logger.info("tamayo de la listaRelacionCampos" + listaRelacionCampos.size());
		List<CamposPlantilla> listaCampos = new ArrayList<CamposPlantilla>();

		Procedimientos procedimiento = this.procedimientosDao.findByProcedimento(procedureId);
		int origen = 0;
		String identificador = "";
		if (!"0".equals(folderId) && !"".equals(folderId) && null != folderId) {
			origen = Constantes.Plantillas.ORIGEN_EXPEDIENTE;
			// buscaremos el idExpediente
			Expedientes expediente = this.expedientesService.findByFolderId(folderId);
			if (null == expediente) {
				identificador = null;
			} else {
				identificador = expediente.getIdExpediente().toString();
				idExpediente = expediente.getIdExpediente();
			}

		} else if (!"".equals(identificadorInspeccion) && null != identificadorInspeccion) {
			origen = Constantes.Plantillas.ORIGEN_INSPECCION;
			// buscaremos el idInspeccion
			Inspecciones inspeccion = this.inspeccionesService.findByIdentificadorInspeccion(identificadorInspeccion);
			if (null == inspeccion) {
				identificador = null;
			} else {
				identificador = inspeccion.getIdInspeccion().toString();
			}
		} else {
			origen = Constantes.Plantillas.ORIGEN_PROCEDIMIENTO;
			// buscaremos el idprocedure
			if (null == procedimiento) {
				identificador = null;
			} else {
				identificador = procedimiento.getIdProcedimiento().toString();
			}

		}
		try {
			if (listaRelacionCampos != null && !listaRelacionCampos.isEmpty()) {
				for (int i = 0; i < listaRelacionCampos.size(); i++) {
					CamposPlantilla campo = new CamposPlantilla();
					campo.setIdCampo(listaRelacionCampos.get(i).getIdCampo());
					listaCampos.add(this.camposPlantillaService.find(campo));
				}
			}
			if (listaCampos != null && !listaCampos.isEmpty()) {
				// Creamos el xml
				DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
				DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
				// root elements
				Document documentoXML = docBuilder.newDocument();

				String nombreDocumento = plantilla.getDocumento().getNombreDocumento();

				nombreDocumento = nombreDocumento.replace(' ', '_');
				nombreDocumento = nombreDocumento.replaceAll("\\)", "");
				nombreDocumento = nombreDocumento.replaceAll("\\(", "");

				ServiciosWebServiceImpl.logger.info("Nombre del Documento: " + nombreDocumento);

				Element rootElement = documentoXML.createElement(nombreDocumento);
				documentoXML.appendChild(rootElement);

				ServiciosWebServiceImpl.logger
						.info("El identificador por el que gestionamos el objeto" + identificador);
				for (int contadorCampo = 0; contadorCampo < listaCampos.size(); contadorCampo++) {
					gestionObjetoXML(listaCampos.get(contadorCampo), documentoXML, rootElement, identificador);
				}

				path_Usuario = this.rtfService.generarRtf(plantilla, usuario, documentoXML, origen, idExpediente,
						procedimiento.getIdProcedimiento(), null);

			} else {
				path_Usuario = generarDocumentoSinObjetos(usuario, idExpediente, plantilla, procedimiento);

			}
		} catch (Ab61Exception e_Ab61Exception) {

			ServiciosWebServiceImpl.logger.error("Excepcion generacion rtf" + e_Ab61Exception);

			throw e_Ab61Exception;

		} catch (Exception e) {

			ServiciosWebServiceImpl.logger.error("Excepcion generacion rtf" + e);

			String sCodigoError = "error.No_controlado";

			ServiciosWebServiceImpl.logger.error("generarDoc - " + sCodigoError);

			throw new Ab61Exception(sCodigoError, appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
					appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));

		}

		return path_Usuario;
	}

	@Override
	public String generarDocumentoNegocio(Integer idPlantilla, String identificador, Origen origen, String usuario)
			throws Ab61Exception {

		ServiciosWebServiceImpl.logger.info("Parametros de entrada: ");
		ServiciosWebServiceImpl.logger.info("idPlantilla: " + idPlantilla);
		ServiciosWebServiceImpl.logger.info("identificador: " + identificador);
		ServiciosWebServiceImpl.logger.info("origen: " + origen.getNumVal());
		ServiciosWebServiceImpl.logger.info("usuario: " + usuario);

		String path_Usuario = "";
		int idExpediente = 0;

		if ("".equals(idPlantilla) || null == idPlantilla) {
			String sCodigoError = "error.obligatorio.idPlantilla";

			ServiciosWebServiceImpl.logger.error("generarDocumento - " + sCodigoError);

			throw new Ab61Exception(sCodigoError, appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
					appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));
		} else if ("".equals(usuario) || null == usuario) {
			String sCodigoError = "error.obligatorio.usuario";

			ServiciosWebServiceImpl.logger.error("generarDocumento - " + sCodigoError);

			throw new Ab61Exception(sCodigoError, appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
					appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));
		}

		// Recuperamos la plantilla
		Plantillas plantilla = new Plantillas();
		plantilla.setIdPlantilla(idPlantilla);
		plantilla = this.plantillasService.find(plantilla);
		ServiciosWebServiceImpl.logger.info("Encontamos la platilla" + plantilla.toString());
		RelPlaCam camposPlantilla = new RelPlaCam();

		camposPlantilla.setIdDocumento(plantilla.getDocumento().getIdDocumento());
		List<RelPlaCam> listaRelacionCampos = this.relPlaCamService.findAll(camposPlantilla, null);
		ServiciosWebServiceImpl.logger.info("tamayo de la listaRelacionCampos" + listaRelacionCampos.size());
		List<CamposPlantilla> listaCampos = new ArrayList<CamposPlantilla>();

		int origenInt = 0;
		String identificadorClave = null;
		Procedimientos procedimiento = new Procedimientos();
		procedimiento.setIdProcedimiento(0);

		switch (origen) {
		case EXPEDIENTE:
			origenInt = Constantes.Plantillas.ORIGEN_EXPEDIENTE;
			// buscaremos el idExpediente
			Expedientes expediente = this.expedientesService.findByFolderId(identificador);
			if (null == expediente) {
				identificadorClave = null;
			} else {
				identificadorClave = expediente.getIdExpediente().toString();
				idExpediente = expediente.getIdExpediente();
			}
			break;
		case INSPECCION:
			origenInt = Constantes.Plantillas.ORIGEN_INSPECCION;
			// buscaremos el idInspeccion
			Inspecciones inspeccion = this.inspeccionesService.findByIdentificadorInspeccion(identificador);
			if (null == inspeccion) {
				identificadorClave = null;
			} else {
				identificadorClave = inspeccion.getIdInspeccion().toString();
			}
			break;
		case ESTABLECIMIENTO:
			origenInt = Constantes.Plantillas.ORIGEN_ESTABLECIMIENTO;
			identificadorClave = identificador;
			break;
		case PROCEDIMIENTO:
			origenInt = Constantes.Plantillas.ORIGEN_PROCEDIMIENTO;
			procedimiento = this.procedimientosDao.findByProcedimento(identificador);
			// buscaremos el idprocedure
			if (null == procedimiento) {
				identificadorClave = null;
			} else {
				identificadorClave = procedimiento.getIdProcedimiento().toString();
			}
			break;

		default:
			break;
		}
		try {
			if (listaRelacionCampos != null && !listaRelacionCampos.isEmpty()) {
				for (int i = 0; i < listaRelacionCampos.size(); i++) {
					CamposPlantilla campo = new CamposPlantilla();
					campo.setIdCampo(listaRelacionCampos.get(i).getIdCampo());
					listaCampos.add(this.camposPlantillaService.find(campo));
				}
			}
			if (listaCampos != null && !listaCampos.isEmpty()) {
				// Creamos el xml
				DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
				DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
				// root elements
				Document documentoXML = docBuilder.newDocument();

				String nombreDocumento = plantilla.getDocumento().getNombreDocumento();

				nombreDocumento = nombreDocumento.replace(' ', '_');
				nombreDocumento = nombreDocumento.replaceAll("\\)", "");
				nombreDocumento = nombreDocumento.replaceAll("\\(", "");

				ServiciosWebServiceImpl.logger.info("Nombre del Documento: " + nombreDocumento);

				Element rootElement = documentoXML.createElement(nombreDocumento);
				documentoXML.appendChild(rootElement);

				ServiciosWebServiceImpl.logger
						.info("El identificador por el que gestionamos el objeto" + identificadorClave);
				for (int contadorCampo = 0; contadorCampo < listaCampos.size(); contadorCampo++) {
					gestionObjetoXML(listaCampos.get(contadorCampo), documentoXML, rootElement, identificadorClave);
				}

				path_Usuario = this.rtfService.generarRtf(plantilla, usuario, documentoXML, origenInt, idExpediente,
						procedimiento.getIdProcedimiento(), identificador);

			} else {
				path_Usuario = generarDocumentoSinObjetos(usuario, idExpediente, plantilla, procedimiento);

			}
		} catch (Ab61Exception e_Ab61Exception) {

			ServiciosWebServiceImpl.logger.error("Excepcion generacion rtf" + e_Ab61Exception);

			throw e_Ab61Exception;

		} catch (Exception e) {

			ServiciosWebServiceImpl.logger.error("Excepcion generacion rtf" + e);

			String sCodigoError = "error.No_controlado";

			ServiciosWebServiceImpl.logger.error("generarDoc - " + sCodigoError);

			throw new Ab61Exception(sCodigoError, appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
					appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));

		}

		return path_Usuario;
	}

	private String generarDocumentoSinObjetos(String usuario, int idExpediente, Plantillas plantilla,
			Procedimientos procedimiento)
			throws SQLException, PifException, Y31JanoServiceFileNotFoundException, Exception {

		String pathPiff = "";

		Y31AttachmentBean retornoPIF = null;

		try {
			if ((plantilla.getDocumento() != null) && (plantilla.getDocumento().getArchivo() != null)) {

				int blobLength = (int) plantilla.getDocumento().getArchivo().length();

				InputStream myInputStream = new ByteArrayInputStream(
						plantilla.getDocumento().getArchivo().getBytes(1, blobLength));

				retornoPIF = pifAdapterService.putFile(myInputStream,
						plantilla.getDocumento().getNombreDocumento() + ".rtf", "/ab61/apps/", true);

				pathPiff = "/user/" + usuario + Constantes.CARPETA_COPIA_BUZON_PIF + retornoPIF.getFileName();

				retornoPIF = pifAdapterService.copyFile(retornoPIF.getFilePath(), pathPiff, true);

				Date fecha = new Date();
				// Insertamos la ruta en la tabla AB6133T00
				RelExpPla relExpPla = new RelExpPla();
				relExpPla.setIdPlantilla(plantilla.getIdPlantilla());
				if (idExpediente == 0) {
					relExpPla.setIdExpediente(null);
				} else {
					relExpPla.setIdExpediente(idExpediente);
				}
				if (procedimiento.getIdProcedimiento() == 0) {
					relExpPla.setIdProcedimiento(null);
				} else {
					relExpPla.setIdProcedimiento(procedimiento.getIdProcedimiento());
				}

				relExpPla.setRuta("/ab61/apps/" + retornoPIF.getFileName());
				relExpPla.setFechaRegistro(fecha);
				relExpPla.setUsuarioRegistro(usuario);

				this.relExpPlaService.add(relExpPla);
			} else {
				String sCodigoError = "error.DocumentoNoExistente";
				ServiciosWebServiceImpl.logger.error("generarRtf - " + sCodigoError);
				throw new Ab61Exception(sCodigoError, appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
						appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));

			}
		} catch (Ab61Exception e_Ab61Exception) {
			throw e_Ab61Exception;
		} catch (PifException e) {

			String sCodigoError = "error.PIF_Exception";

			ServiciosWebServiceImpl.logger.error(sCodigoError, e);

			throw new Ab61Exception(sCodigoError, appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
					appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));

		} catch (Exception e) {
			ServiciosWebServiceImpl.logger.error("Fallo al generar la plantilla");
		}
		Properties prop = Config.loadProperties(Constantes.FICHERO_CONFIGURACION);

		return prop.getProperty("URL_SPIF") + retornoPIF.getFilePath();
	}

	public DatosInicioOficio generarInicioOficio(InicioOficioWS inicioOficio) throws Ab61Exception {

		ServiciosWebServiceImpl.logger.info("Comienzo WS generarInicioOficio");
		if (inicioOficio != null) {
			ServiciosWebServiceImpl.logger.info("Parametro WS inicioOficio: " + inicioOficio.toString());
		}

		TAdminInitRequest adminInitiation = new TAdminInitRequest();

		/** OBTENENOS LOS DATOS DEL EXPEDIENTE ORIGEN A PARTIR DEL FOLDERID **/
		Expedientes expedienteOrigen = new Expedientes();
		if (inicioOficio.getFolderId() != null && !inicioOficio.getFolderId().equals("")) {
			expedienteOrigen = expedientesService.findByFolderId(inicioOficio.getFolderId());

		} else {
			String sCodigoError = "error.addAdminApplication.FolderId";
			throw new Ab61Exception(sCodigoError, appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
					appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));
		}

		/** IDENTIFICADOR DEL PROCEDIMIENTO **/
		if (inicioOficio.getProcedureId() != null && !inicioOficio.getProcedureId().equals("")) {
			adminInitiation.setProcedureID(inicioOficio.getProcedureId());
		} else {
			String sCodigoError = "error.addAdminApplication.IdProcedimiento";
			throw new Ab61Exception(sCodigoError, appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
					appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));
		}

		/** TIPO DE INICIO DE OFICIO **/
		adminInitiation.setInitiationType(TFolderOriginType.INICIATIVA_ADMINISTRATIVA);

		/** EMISOR DEL INICIO DE OFICIO **/
		com.ejie.ab61.clientesWS.X43SolicitudesYAportaciones.TPersonIDName tPersonIDName = new com.ejie.ab61.clientesWS.X43SolicitudesYAportaciones.TPersonIDName();
		if (inicioOficio.getEmisorInicioficio() != null) {
			tPersonIDName.setID(inicioOficio.getEmisorInicioficio().getIdEmsisor());
			tPersonIDName.setName(inicioOficio.getEmisorInicioficio().getNombreEmisor());
			if (inicioOficio.getEmisorInicioficio().getTipoDocumentoIdentidad() != null) {
				if (inicioOficio.getEmisorInicioficio().getTipoDocumentoIdentidad()
						.equals(TipoDocumentoIdentidad.CIF)) {
					tPersonIDName.setType(TNiaType.CIF);
				} else if (inicioOficio.getEmisorInicioficio().getTipoDocumentoIdentidad()
						.equals(TipoDocumentoIdentidad.NIE)) {
					tPersonIDName.setType(TNiaType.NIE);
				} else if (inicioOficio.getEmisorInicioficio().getTipoDocumentoIdentidad()
						.equals(TipoDocumentoIdentidad.NIF)) {
					tPersonIDName.setType(TNiaType.NIF);
				} else if (inicioOficio.getEmisorInicioficio().getTipoDocumentoIdentidad()
						.equals(TipoDocumentoIdentidad.NO_ID)) {
					tPersonIDName.setType(TNiaType.NO_ID);
				} else if (inicioOficio.getEmisorInicioficio().getTipoDocumentoIdentidad()
						.equals(TipoDocumentoIdentidad.OTHER)) {
					tPersonIDName.setType(TNiaType.OTHER);
				} else if (inicioOficio.getEmisorInicioficio().getTipoDocumentoIdentidad()
						.equals(TipoDocumentoIdentidad.PASSPORT)) {
					tPersonIDName.setType(TNiaType.PASSPORT);
				} else {
					String sCodigoError = "error.addAdminApplication.TipoDocumentoIdentidad";

					throw new Ab61Exception(sCodigoError,
							appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
							appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));
				}

				tPersonIDName.setFirstLastName(inicioOficio.getEmisorInicioficio().getPrimerApellido());
				tPersonIDName.setSecondLastName(inicioOficio.getEmisorInicioficio().getSegundoApellido());

			}

			if (inicioOficio.getEmisorInicioficio().getSexo() != null) {
				if (inicioOficio.getEmisorInicioficio().getSexo().equals(TipoSexo.HOMBRE)) {
					tPersonIDName.setSex(TSexType.HOMBRE);
				} else if (inicioOficio.getEmisorInicioficio().getSexo().equals(TipoSexo.MUJER)) {
					tPersonIDName.setSex(TSexType.MUJER);
				} else if (inicioOficio.getEmisorInicioficio().getSexo().equals(TipoSexo.NA)) {
					tPersonIDName.setSex(TSexType.NA);
				} else if (inicioOficio.getEmisorInicioficio().getSexo().equals(TipoSexo.OTRA)) {
					tPersonIDName.setSex(TSexType.OTRA);
				} else {
					String sCodigoError = "error.addAdminApplication.TipoSexo";
					throw new Ab61Exception(sCodigoError,
							appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
							appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));
				}
			}

			adminInitiation.setSenderID(tPersonIDName);
		}

		/**
		 * TITULO DEL EXPEDIENTE. Se obtiene del la tabla AB6102T00 a partir del
		 * folderID de origen
		 **/
		if (expedienteOrigen != null) {

			if (expedienteOrigen.getTitulo() != null && !expedienteOrigen.getTitulo().equals("")) {
				adminInitiation.setFolderTitle(expedienteOrigen.getTitulo());
			} else {
				String sCodigoError = "error.addAdminApplication.TituloExpediente";
				throw new Ab61Exception(sCodigoError, appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
						appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));
			}

		} else {
			String sCodigoError = "error.addAdminApplication.NoExsiteExpediente";
			throw new Ab61Exception(sCodigoError, appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
					appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));
		}

		/** FECHA DE CREACION DEL INICIO DE OFICIO **/
		Date date = new Date();
		DateFormat hourdateFormat = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
		adminInitiation.setStartDate(hourdateFormat.format(date));

		/** OBTENEMOS INFORMACION DEL PROCEDIMIENTO NECESARIA **/
		com.ejie.ab61.clientesWS.X43Procedimientos.AExtensionPoint epProcedimientos = new com.ejie.ab61.clientesWS.X43Procedimientos.AExtensionPoint();
		try {
			TConsultationContext informacionProcedimiento = x43ProcedimientosAdaptadorService
					.getConsultationContext(inicioOficio.getProcedureId(), epProcedimientos);
			adminInitiation.setDepartmentID(informacionProcedimiento.getManagingUnit().getDepartmentID());
			adminInitiation.setManagingUnitID(informacionProcedimiento.getManagingUnit().getManagingUnitID());
			adminInitiation.setDocumentalSerieID(
					informacionProcedimiento.getDaDocumentalSeries().getDaDocumentalSerie().getID());
			adminInitiation.setProcedureFamilyID(informacionProcedimiento.getProcedureFamilyID());
		} catch (Exception e) {
			String sCodigoError = "error.GetConsultationContext";

			ServiciosWebServiceImpl.logger.error(sCodigoError, e);

			throw new Ab61Exception(sCodigoError, appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
					appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));
		}

		/** DATOS DE LA PARTICIPACION **/
		TApplicantRRIList tApplicantRRIList = new TApplicantRRIList();
		TApplicantRRI tApplicantRRI = new TApplicantRRI();
		TInterestedList tInterestedList = new TInterestedList();

		List<RelExpTer> listaParticipaciones = this.relExpTerDao
				.findParticipaciones(expedienteOrigen.getIdExpediente());

		if (listaParticipaciones != null) {

			String idParcipacion = "";
			/******* Interesados de la participacion ********/

			for (RelExpTer participante : listaParticipaciones) {

				/**** solo tenemos en cuenta la participacion SOLICITANTE ***/

				if (participante.getTiposTercero() != null && participante.getDatosTerceros() != null) {
					if (participante.getTiposTercero().getIdTipoTercero().equals(Constantes.PARTICIPACION_SOLICITANTE)
							&& participante.getDatosTerceros().getTipoParticipante()
									.equals(Constantes.PARTICIPANTE_TITULAR)) {

						TInterested tInterested = new TInterested();

						tApplicantRRI.setRole(TParticipantType.AFECTADO);
						/** Tipo de Participacion Tramitagune **/
						tApplicantRRI.setRoleTgune(TParticipantTguneType.OTRAS_PARTES);

						/**********************************************
						 * Interesado a efectos de ley
						 ***********************************************/
						tInterested
								.setInterestedInLaw(com.ejie.ab61.clientesWS.X43SolicitudesYAportaciones.TBoolean.TRUE);
						/*********
						 * Persona
						 **********/
						com.ejie.ab61.clientesWS.X43SolicitudesYAportaciones.TPersonIDName tPerson = new com.ejie.ab61.clientesWS.X43SolicitudesYAportaciones.TPersonIDName();
						TAccount tAccount = new TAccount();
						if (participante.getDatosTerceros() != null) {

							/**
							 * CONSULTAMOS LA TABLA AB6140T00 PARA SABER SI HAY
							 * QUE CONSULTAR LA CUENTA CON CONSENTIMIENTO O NO
							 **/

							DatosTerceros tercero = participante.getDatosTerceros();

							/**
							 * Enviamos al inicio de oficio de Platea todos los
							 * interesados excepto el Representante
							 */

							if (!tercero.getTipoParticipante().equals(Constantes.PARTICIPANTE_REPRESENTANTE)) {

								List<TInteresado> listaInteresados = new ArrayList<TInteresado>();
								boolean existeCuentaConsentimiento = false;
								TCuenta cuentaConConsentimiento = new TCuenta();
								TNotifyChannel tNotifyChannel = new TNotifyChannel();

								ParametrosConfig parametrosConfig = new ParametrosConfig();
								parametrosConfig.setDescripcion(Constantes.CONFIGURACION_CUENTA_CONSENTIMIENTO);
								parametrosConfig = this.parametrosConfigDao.findByDescripcion(parametrosConfig);

								if (parametrosConfig != null && parametrosConfig.getValor()
										.equalsIgnoreCase(Constantes.CONFIGURACION_CUENTA_CONSENTIMIENTO_SI)) {

									/**
									 * A partir del Id de la persona buscamos
									 * los datos en su cuenta, si no tiene
									 * cuenta cogemos la informacion de los
									 * datos que nos llegan
									 */
									/**
									 * OBTENEMOS INFORMACION DE LA CUENTA DE LOS
									 * INTERESADOS
									 **/

									listaInteresados = this.obtenerDatosCuenta(tercero.getDocumento());

									/********************************************
									 * buscamos la cuenta con consentimiento del
									 * interesado
									 * ******************************************
									 */

									if (listaInteresados.size() > 0
											&& listaInteresados.get(0).getCuentaList() != null) {
										if (listaInteresados.get(0).getCuentaList().getCuenta().size() > 0) {
											for (int numCuenta = 0; numCuenta < listaInteresados.get(0).getCuentaList()
													.getCuenta().size(); numCuenta++) {
												if (listaInteresados.get(0).getCuentaList().getCuenta().get(numCuenta)
														.getConsentimiento().equals(TConsentimiento.SI)) {
													cuentaConConsentimiento = listaInteresados.get(0).getCuentaList()
															.getCuenta().get(numCuenta);
													existeCuentaConsentimiento = true;
													break;

												}
											}
										}
									}
								} else {
									existeCuentaConsentimiento = false;
								}

								if (listaInteresados.size() > 0 && existeCuentaConsentimiento) {

									/**********************************************
									 * Lenguaje de comunicacion con la
									 * administracion
									 ***********************************************/
									if (listaInteresados.get(0)
											.getIdioma() == com.ejie.ab61.clientesWS.X43CuentasInteresados.TLanguage.ES) {
										tInterested.setLanguage(
												com.ejie.ab61.clientesWS.X43SolicitudesYAportaciones.TLanguage.ES);
									} else if (listaInteresados.get(0)
											.getIdioma() == com.ejie.ab61.clientesWS.X43CuentasInteresados.TLanguage.EU) {
										tInterested.setLanguage(
												com.ejie.ab61.clientesWS.X43SolicitudesYAportaciones.TLanguage.EU);
									} else {
										tInterested.setLanguage(
												com.ejie.ab61.clientesWS.X43SolicitudesYAportaciones.TLanguage.NA);
									}

									/** Datos basico interesado **/
									tPerson.setID(listaInteresados.get(0).getNumeroIdentificacion());
									tPerson.setName(listaInteresados.get(0).getNombre());
									tPerson.setFirstLastName(listaInteresados.get(0).getApellido1());
									tPerson.setSecondLastName(listaInteresados.get(0).getApellido2());
									if (listaInteresados.get(0).getTipoIdentificacion() != null) {
										if (listaInteresados.get(0).getTipoIdentificacion().equals(TNia.CIF)) {
											tPerson.setType(TNiaType.CIF);
										} else if (listaInteresados.get(0).getTipoIdentificacion().equals(TNia.NIE)) {
											tPerson.setType(TNiaType.NIE);
										} else if (listaInteresados.get(0).getTipoIdentificacion().equals(TNia.NIF)) {
											tPerson.setType(TNiaType.NIF);
										} else if (listaInteresados.get(0).getTipoIdentificacion().equals(TNia.N_I)) {
											tPerson.setType(TNiaType.NO_ID);
										} else if (listaInteresados.get(0).getTipoIdentificacion().equals(TNia.OTHER)) {
											tPerson.setType(TNiaType.OTHER);
										} else if (listaInteresados.get(0).getTipoIdentificacion()
												.equals(TNia.PASSPORT)) {
											tPerson.setType(TNiaType.PASSPORT);
										}
									}
									if (listaInteresados.get(0).getSexo() != null) {
										if (listaInteresados.get(0).getSexo().equals(TSexo.HOMBRE)) {
											tPerson.setSex(TSexType.HOMBRE);
										} else if (listaInteresados.get(0).getSexo().equals(TSexo.MUJER)) {
											tPerson.setSex(TSexType.MUJER);
										} else if (listaInteresados.get(0).getSexo().equals(TSexo.NA)) {
											tPerson.setSex(TSexType.NA);
										} else if (listaInteresados.get(0).getSexo().equals(TSexo.OTRA)) {
											tPerson.setSex(TSexType.OTRA);
										}
									}
									/** Datos del canal de comunicacion **/
									if (cuentaConConsentimiento.getCanalNotificacion() != null) {
										if (cuentaConConsentimiento.getCanalNotificacion()
												.equals(TCanalNotificacion.ELECTRONICO)) {
											tNotifyChannel.setChannelType(TNotificationType.ELECTRONICA);
											tAccount.setNotify(tNotifyChannel);
										} else if (cuentaConConsentimiento.getCanalNotificacion()
												.equals(TCanalNotificacion.POSTAL)) {
											tNotifyChannel.setChannelType(TNotificationType.POSTAL);
											TPostalAddress tPostalAddress = new TPostalAddress();
											tPostalAddress.setCodLocalidad(cuentaConConsentimiento.getCodLocalidad());
											tPostalAddress.setCodMunicipio(cuentaConConsentimiento.getCodMunicipio());
											tPostalAddress.setCodPais(cuentaConConsentimiento.getCodPais());
											tPostalAddress.setCodProvincia(cuentaConConsentimiento.getCodProvincia());
											tPostalAddress.setCp(cuentaConConsentimiento.getCodigoPostal());
											tPostalAddress.setDireccion(cuentaConConsentimiento.getDireccion());
											tPostalAddress.setPortal(cuentaConConsentimiento.getPortal());
											tPostalAddress.setEscalera(cuentaConConsentimiento.getEscalera());
											tPostalAddress.setPiso(cuentaConConsentimiento.getPiso());
											tPostalAddress.setLetra(cuentaConConsentimiento.getLetra());
											tPostalAddress.setLocalidad(cuentaConConsentimiento.getLocalidad());
											tPostalAddress.setMunicipio(cuentaConConsentimiento.getMunicipio());
											tPostalAddress.setPais(cuentaConConsentimiento.getPais());
											if (cuentaConConsentimiento.getProvincia() != null) {
												com.ejie.ab61.clientesWS.X43SolicitudesYAportaciones.TTextI18N provincia = new com.ejie.ab61.clientesWS.X43SolicitudesYAportaciones.TTextI18N();
												com.ejie.ab61.clientesWS.X43SolicitudesYAportaciones.TStringI18N rolCastellano = new com.ejie.ab61.clientesWS.X43SolicitudesYAportaciones.TStringI18N();
												rolCastellano.setLocale(
														com.ejie.ab61.clientesWS.X43SolicitudesYAportaciones.TLanguage.ES);
												rolCastellano.setValue(cuentaConConsentimiento.getProvincia());
												provincia.getText().add(0, rolCastellano);

												tPostalAddress.setProvincia(provincia);
											}

											tNotifyChannel.setPostal(tPostalAddress);
											tAccount.setNotify(tNotifyChannel);

										}

									}

									/** Datos de aviso **/
									TContactList tContactoList = new TContactList();
									if (cuentaConConsentimiento.getContactoList() != null
											&& cuentaConConsentimiento.getContactoList().getContacto() != null) {

										for (int numContacto = 0; numContacto < cuentaConConsentimiento
												.getContactoList().getContacto().size(); numContacto++) {
											TContact tContacto = new TContact();
											if (cuentaConConsentimiento.getContactoList().getContacto().get(numContacto)
													.getTipoContacto().equals(TTipoContacto.EMAIL)) {
												tContacto.setChannelType(TContactType.EMAIL);
												tContacto.setEmail(cuentaConConsentimiento.getContactoList()
														.getContacto().get(numContacto).getInformacionContacto());
											} else if (cuentaConConsentimiento.getContactoList().getContacto()
													.get(numContacto).getTipoContacto().equals(TTipoContacto.FAX)) {
												tContacto.setChannelType(TContactType.FAX);
												tContacto.setFax(cuentaConConsentimiento.getContactoList().getContacto()
														.get(numContacto).getInformacionContacto());
											} else if (cuentaConConsentimiento.getContactoList().getContacto()
													.get(numContacto).getTipoContacto().equals(TTipoContacto.SMS)) {
												tContacto.setChannelType(TContactType.SMS);
												tContacto.setSms(cuentaConConsentimiento.getContactoList().getContacto()
														.get(numContacto).getInformacionContacto());
											} else if (cuentaConConsentimiento.getContactoList().getContacto()
													.get(numContacto).getTipoContacto()
													.equals(TTipoContacto.TELEFONO)) {
												tContacto.setChannelType(TContactType.TELEFONO);
												tContacto.setPhone(cuentaConConsentimiento.getContactoList()
														.getContacto().get(numContacto).getInformacionContacto());
											}

											tContactoList.getContact().add(numContacto, tContacto);

										}
									}

									tAccount.setContactList(tContactoList);

									/**
									 * OBTENEMOS LOS DATOS DEL INTERESADO DE LA
									 * BD
									 */
								} else {

									/**********************************************
									 * Lenguaje de comunicacion con la
									 * administracion
									 ***********************************************/
									if (tercero.getIdioma() != null) {
										if (tercero.getIdioma() == Constantes.Idioma.CASTELLANO) {
											tInterested.setLanguage(
													com.ejie.ab61.clientesWS.X43SolicitudesYAportaciones.TLanguage.ES);
										} else if (tercero.getIdioma() == Constantes.Idioma.EUSKERA) {
											tInterested.setLanguage(
													com.ejie.ab61.clientesWS.X43SolicitudesYAportaciones.TLanguage.EU);
										} else {
											tInterested.setLanguage(
													com.ejie.ab61.clientesWS.X43SolicitudesYAportaciones.TLanguage.NA);
										}
									}
									/** Datos basico interesado **/
									tPerson.setID(tercero.getDocumento());
									tPerson.setName(tercero.getNombre());
									tPerson.setFirstLastName(tercero.getApellido1());
									tPerson.setSecondLastName(tercero.getApellido2());
									if (tercero.getIdTipoDocumento() != null
											&& !tercero.getIdTipoDocumento().equals("")) {
										if (tercero.getIdTipoDocumento() == Constantes.TiposDocumento.CIF) {
											tPerson.setType(TNiaType.CIF);
										} else if (tercero.getIdTipoDocumento() == Constantes.TiposDocumento.NIE) {
											tPerson.setType(TNiaType.NIE);
										} else if (tercero.getIdTipoDocumento() == Constantes.TiposDocumento.DNI) {
											tPerson.setType(TNiaType.NIF);
										} else if (tercero.getIdTipoDocumento() == Constantes.TiposDocumento.OTROS) {
											tPerson.setType(TNiaType.OTHER);
										} else if (tercero
												.getIdTipoDocumento() == Constantes.TiposDocumento.PASAPORTE) {
											tPerson.setType(TNiaType.PASSPORT);
										}
									}

									if (tercero.getIdSexo() != null && !tercero.getIdSexo().equals("")
											&& tercero.getIdSexo() != 0) {
										if (tercero.getIdSexo() == Constantes.TiposSexo.HOMBRE) {
											tPerson.setSex(TSexType.HOMBRE);
										} else if ((tercero.getIdSexo() == Constantes.TiposSexo.MUJER)) {
											tPerson.setSex(TSexType.MUJER);
										} else {
											String sCodigoError = "error.addAdminApplication.TipoSexo";
											throw new Ab61Exception(sCodigoError,
													appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
													appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));
										}
									}
									/** Datos del canal de comunicacion **/
									/**
									 * Si el tercero es un CIF el canal de
									 * notificación es obligatoriamente
									 * ELECTRONICO, cualquier otro tipo de
									 * indentificación es POSTAL. La dirección
									 * postal se obtiene de la tabla AB6136T00
									 **/
									if (tercero.getIdTipoDocumento() != null
											&& tercero.getIdTipoDocumento() == Constantes.TiposDocumento.CIF) {
										tNotifyChannel.setChannelType(TNotificationType.ELECTRONICA);
										tAccount.setNotify(tNotifyChannel);
									} else {

										DatosDirecciones datosDirecciones = new DatosDirecciones();
										DatosTerceros datosTerceros = new DatosTerceros();
										datosTerceros.setIdTercero(tercero.getIdTercero());
										datosDirecciones.setDatosTerceros(datosTerceros);
										TiposDireccion tipoDireccion = new TiposDireccion();
										tipoDireccion.setIdTipoDireccion(Constantes.TiposDirecciones.DIRECCION_POSTAL);
										datosDirecciones.setTiposDireccion(tipoDireccion);
										List<DatosDirecciones> listaDirecciones = datosDireccionesDao
												.findDatosDireccion(datosDirecciones, null);

										TPostalAddress tPostalAddress = new TPostalAddress();
										if (listaDirecciones != null && listaDirecciones.size() > 0) {

											DatosDirecciones direccionPostalTercero = listaDirecciones.get(0);

											if (direccionPostalTercero.getDireccion() != null
													&& !direccionPostalTercero.getDireccion().contentEquals("")
													&& direccionPostalTercero.getCodigoPostal() != null
													&& !direccionPostalTercero.getCodigoPostal().contentEquals("")) {

												tPostalAddress.setCodLocalidad(
														String.valueOf(direccionPostalTercero.getIdLocalidad()));
												tPostalAddress.setCodMunicipio(
														String.valueOf(direccionPostalTercero.getIdMunicipio()));
												tPostalAddress
														.setCodPais(String.valueOf(direccionPostalTercero.getIdPais()));
												tPostalAddress.setCodProvincia(
														String.valueOf(direccionPostalTercero.getIdProvincia()));
												tPostalAddress.setCp(direccionPostalTercero.getCodigoPostal());
												tPostalAddress.setDireccion(direccionPostalTercero.getDireccion());
												tPostalAddress.setEscalera(direccionPostalTercero.getEscalera());
												tPostalAddress.setPiso(direccionPostalTercero.getPiso());
												tPostalAddress.setLetra(direccionPostalTercero.getLetra());

												tNotifyChannel.setChannelType(TNotificationType.POSTAL);
												tNotifyChannel.setPostal(tPostalAddress);
												tAccount.setNotify(tNotifyChannel);

											} else {
												tNotifyChannel.setChannelType(TNotificationType.ELECTRONICA);
												tAccount.setNotify(tNotifyChannel);
											}

										} else {
											tNotifyChannel.setChannelType(TNotificationType.ELECTRONICA);
											tAccount.setNotify(tNotifyChannel);
										}

									}

									/** Datos de aviso **/

									DatosTerceros datosTerceros = this.datosTercerosService
											.findTercero(tercero.getIdTercero(), participante.getParticipantId());

									TContactList tContactoList = new TContactList();
									if (datosTerceros.getCanalesAvisos() != null
											&& datosTerceros.getCanalesAvisos().size() > 0) {

										for (int j = 0; j < datosTerceros.getCanalesAvisos().size(); j++) {
											TContact tContacto = new TContact();
											if (datosTerceros.getCanalesAvisos().get(j).getTiposCanalAviso()
													.equals(Constantes.TIPO_CANAL_AVISO_EMAIL)) {
												tContacto.setChannelType(TContactType.EMAIL);
												tContacto.setEmail(
														datosTerceros.getCanalesAvisos().get(j).getCanalAviso());
											} else if (datosTerceros.getCanalesAvisos().get(j).getTiposCanalAviso()
													.equals(Constantes.TIPO_CANAL_AVISO_SMS)) {
												tContacto.setChannelType(TContactType.SMS);
												tContacto.setSms(
														datosTerceros.getCanalesAvisos().get(j).getCanalAviso());
											}

											tContactoList.getContact().add(j, tContacto);

										}

									}

									tAccount.setContactList(tContactoList);

								}

								tInterested.setPersonID(tPerson);
								tInterested.setAccount(tAccount);
								tInterestedList.getInterested().add(tInterested);

							}
						}

						/** Metemos el ultimo interesado **/

					}
				}

			} // fin del for

			if (tInterestedList.getInterested().size() == 0) {

				String sCodigoError = "error.addAdminApplication.solicitanteTitularNoExiste";

				ServiciosWebServiceImpl.logger.error(sCodigoError);
				throw new Ab61Exception(sCodigoError, appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
						appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));
			}
			tApplicantRRI.setInterestedList(tInterestedList);
			tApplicantRRIList.getApplicant().add(tApplicantRRI);
			adminInitiation.setApplicantRRIList(tApplicantRRIList);

		}

		try {

			DatosInicioOficio datosInicioOficio = new DatosInicioOficio();
			TSubmissionResponse tSubmissionResponse = x43SolicitudesYAportacionesAdaptadorService
					.addAdminApplication(adminInitiation, null);
			if (tSubmissionResponse.getPropertyList() != null
					&& tSubmissionResponse.getPropertyList().getProperty().size() > 0) {
				TAdminInitResponse tAdminInitResponse = tSubmissionResponse.getPropertyList().getProperty().get(0)
						.getAdminInitInfo();
				datosInicioOficio.setInicioOficioXML(tAdminInitResponse.getAdminInitXML());
				datosInicioOficio.setIdSolicitud(tAdminInitResponse.getApplicationID());
				datosInicioOficio.setFolderID(tAdminInitResponse.getFolderID());
				datosInicioOficio.setFechaCreacion(tAdminInitResponse.getCreationDate());

				/**
				 * Guardarmos la relacion del expediente origen con el
				 * expediente de oficio destino
				 */
				Date fechaRegistro = new Date();
				RelExpOriDes relexporides = new RelExpOriDes();
				relexporides.setIdExpedienteOrigen(expedienteOrigen.getIdExpediente());
				relexporides.setFolderIdOrigen(expedienteOrigen.getFolderId());
				relexporides.setFolderIdDestino(datosInicioOficio.getFolderID());
				relexporides.setFechaRegistro(fechaRegistro);
				if (inicioOficio.getEmisorInicioficio() != null) {
					relexporides.setUsuarioRegistro(inicioOficio.getEmisorInicioficio().getIdEmsisor());
				}
				this.relExpOriDesDao.add(relexporides);

			}

			return datosInicioOficio;

		} catch (Exception e) {
			String sCodigoError = "error.AddAdminApplication";

			ServiciosWebServiceImpl.logger.error(sCodigoError, e);

			throw new Ab61Exception(sCodigoError, appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
					appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));
		}

	}

	public DatosInicioOficio generarInicioOficioTitular(InicioOficioTitularWS inicioOficio) throws Ab61Exception {

		ServiciosWebServiceImpl.logger.info("Comienzo WS generarInicioOficioTitular");
		if (inicioOficio != null) {
			ServiciosWebServiceImpl.logger.info("Parametro WS InicioOficioTitularWS: " + inicioOficio.toString());
		}

		TAdminInitRequest adminInitiation = new TAdminInitRequest();
		/** Tercero **/
		if (inicioOficio.getTerceroId() == null || inicioOficio.getTerceroId() == 0) {

			String sCodigoError = "error.addAdminApplication.TerceroId";
			throw new Ab61Exception(sCodigoError, appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
					appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));
		}

		/** IDENTIFICADOR DEL PROCEDIMIENTO **/
		if (inicioOficio.getProcedureId() != null && !inicioOficio.getProcedureId().equals("")) {
			adminInitiation.setProcedureID(inicioOficio.getProcedureId());
		} else {
			String sCodigoError = "error.addAdminApplication.IdProcedimiento";
			throw new Ab61Exception(sCodigoError, appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
					appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));
		}

		/** TITULO DEL EXPEDIENTE DE OFICIO **/
		if (inicioOficio.getTituloExpediente() != null && !inicioOficio.getTituloExpediente().equals("")) {
			adminInitiation.setFolderTitle(inicioOficio.getTituloExpediente());
		} else {
			String sCodigoError = "error.addAdminApplication.TituloExpediente";
			throw new Ab61Exception(sCodigoError, appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
					appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));
		}

		/** TIPO DE INICIO DE OFICIO **/
		adminInitiation.setInitiationType(TFolderOriginType.INICIATIVA_ADMINISTRATIVA);

		/** EMISOR DEL INICIO DE OFICIO **/
		com.ejie.ab61.clientesWS.X43SolicitudesYAportaciones.TPersonIDName tPersonIDName = new com.ejie.ab61.clientesWS.X43SolicitudesYAportaciones.TPersonIDName();
		if (inicioOficio.getEmisorInicioficio() != null) {
			tPersonIDName.setID(inicioOficio.getEmisorInicioficio().getIdEmsisor());
			tPersonIDName.setName(inicioOficio.getEmisorInicioficio().getNombreEmisor());
			if (inicioOficio.getEmisorInicioficio().getTipoDocumentoIdentidad() != null) {
				if (inicioOficio.getEmisorInicioficio().getTipoDocumentoIdentidad()
						.equals(TipoDocumentoIdentidad.CIF)) {
					tPersonIDName.setType(TNiaType.CIF);
				} else if (inicioOficio.getEmisorInicioficio().getTipoDocumentoIdentidad()
						.equals(TipoDocumentoIdentidad.NIE)) {
					tPersonIDName.setType(TNiaType.NIE);
				} else if (inicioOficio.getEmisorInicioficio().getTipoDocumentoIdentidad()
						.equals(TipoDocumentoIdentidad.NIF)) {
					tPersonIDName.setType(TNiaType.NIF);
				} else if (inicioOficio.getEmisorInicioficio().getTipoDocumentoIdentidad()
						.equals(TipoDocumentoIdentidad.NO_ID)) {
					tPersonIDName.setType(TNiaType.NO_ID);
				} else if (inicioOficio.getEmisorInicioficio().getTipoDocumentoIdentidad()
						.equals(TipoDocumentoIdentidad.OTHER)) {
					tPersonIDName.setType(TNiaType.OTHER);
				} else if (inicioOficio.getEmisorInicioficio().getTipoDocumentoIdentidad()
						.equals(TipoDocumentoIdentidad.PASSPORT)) {
					tPersonIDName.setType(TNiaType.PASSPORT);
				} else {
					String sCodigoError = "error.addAdminApplication.TipoDocumentoIdentidad";

					throw new Ab61Exception(sCodigoError,
							appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
							appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));
				}

				tPersonIDName.setFirstLastName(inicioOficio.getEmisorInicioficio().getPrimerApellido());
				tPersonIDName.setSecondLastName(inicioOficio.getEmisorInicioficio().getSegundoApellido());

			}

			if (inicioOficio.getEmisorInicioficio().getSexo() != null) {
				if (inicioOficio.getEmisorInicioficio().getSexo().equals(TipoSexo.HOMBRE)) {
					tPersonIDName.setSex(TSexType.HOMBRE);
				} else if (inicioOficio.getEmisorInicioficio().getSexo().equals(TipoSexo.MUJER)) {
					tPersonIDName.setSex(TSexType.MUJER);
				} else if (inicioOficio.getEmisorInicioficio().getSexo().equals(TipoSexo.NA)) {
					tPersonIDName.setSex(TSexType.NA);
				} else if (inicioOficio.getEmisorInicioficio().getSexo().equals(TipoSexo.OTRA)) {
					tPersonIDName.setSex(TSexType.OTRA);
				} else {
					String sCodigoError = "error.addAdminApplication.TipoSexo";
					throw new Ab61Exception(sCodigoError,
							appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
							appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));
				}
			}

			adminInitiation.setSenderID(tPersonIDName);
		}

		/** FECHA DE CREACION DEL INICIO DE OFICIO **/
		Date date = new Date();
		DateFormat hourdateFormat = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
		adminInitiation.setStartDate(hourdateFormat.format(date));

		/** OBTENEMOS INFORMACION DEL PROCEDIMIENTO NECESARIA **/
		com.ejie.ab61.clientesWS.X43Procedimientos.AExtensionPoint epProcedimientos = new com.ejie.ab61.clientesWS.X43Procedimientos.AExtensionPoint();
		try {
			TConsultationContext informacionProcedimiento = x43ProcedimientosAdaptadorService
					.getConsultationContext(inicioOficio.getProcedureId(), epProcedimientos);
			adminInitiation.setDepartmentID(informacionProcedimiento.getManagingUnit().getDepartmentID());
			adminInitiation.setManagingUnitID(informacionProcedimiento.getManagingUnit().getManagingUnitID());
			adminInitiation.setDocumentalSerieID(
					informacionProcedimiento.getDaDocumentalSeries().getDaDocumentalSerie().getID());
			adminInitiation.setProcedureFamilyID(informacionProcedimiento.getProcedureFamilyID());
		} catch (Exception e) {
			String sCodigoError = "error.GetConsultationContext";

			ServiciosWebServiceImpl.logger.error(sCodigoError, e);

			throw new Ab61Exception(sCodigoError, appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
					appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));
		}

		/** Obtenemos los datos del tercero de la tabla AB6135T00 */
		DatosTerceros datosTerceros = new DatosTerceros();
		datosTerceros.setIdTercero(inicioOficio.getTerceroId());
		DatosTerceros tercero = this.datosTercerosService.find(datosTerceros);
		if (tercero != null) {

			/** DATOS DE LA PARTICIPACION **/
			TApplicantRRIList tApplicantRRIList = new TApplicantRRIList();
			TApplicantRRI tApplicantRRI = new TApplicantRRI();
			TInterestedList tInterestedList = new TInterestedList();
			TInterested tInterested = new TInterested();
			com.ejie.ab61.clientesWS.X43SolicitudesYAportaciones.TPersonIDName tPerson = new com.ejie.ab61.clientesWS.X43SolicitudesYAportaciones.TPersonIDName();
			TAccount tAccount = new TAccount();

			/** Tipo de Participacion **/
			tApplicantRRI.setRole(TParticipantType.AFECTADO);
			/** Tipo de Participacion Tramitagune **/
			tApplicantRRI.setRoleTgune(TParticipantTguneType.OTRAS_PARTES);
			/** Interesado a efectos de ley **/
			tInterested.setInterestedInLaw(com.ejie.ab61.clientesWS.X43SolicitudesYAportaciones.TBoolean.TRUE);

			List<TInteresado> datosCuentaConsentimiento = new ArrayList<TInteresado>();
			boolean existeCuentaConsentimiento = false;
			TCuenta cuentaConConsentimiento = new TCuenta();
			TNotifyChannel tNotifyChannel = new TNotifyChannel();

			/**
			 * CONSULTAMOS LA TABLA AB6140T00 PARA SABER SI HAY QUE CONSULTAR LA
			 * CUENTA CON CONSENTIMIENTO O NO
			 **/
			ParametrosConfig parametrosConfig = new ParametrosConfig();
			parametrosConfig.setDescripcion(Constantes.CONFIGURACION_CUENTA_CONSENTIMIENTO);
			parametrosConfig = this.parametrosConfigDao.findByDescripcion(parametrosConfig);

			if (parametrosConfig != null && parametrosConfig.getValor()
					.equalsIgnoreCase(Constantes.CONFIGURACION_CUENTA_CONSENTIMIENTO_SI)) {

				/**
				 * A partir del numero de identificaión de la persona buscamos
				 * los datos en su cuenta, si no tiene cuenta cogemos la
				 * informacion de los datos que nos llegan
				 */

				datosCuentaConsentimiento = this.obtenerDatosCuenta(tercero.getDocumento());
				/********************************************
				 * buscamos la cuenta con consentimiento del interesado
				 * ******************************************
				 */

				if (datosCuentaConsentimiento.size() > 0 && datosCuentaConsentimiento.get(0).getCuentaList() != null) {
					if (datosCuentaConsentimiento.get(0).getCuentaList().getCuenta().size() > 0) {
						for (int numCuenta = 0; numCuenta < datosCuentaConsentimiento.get(0).getCuentaList().getCuenta()
								.size(); numCuenta++) {
							if (datosCuentaConsentimiento.get(0).getCuentaList().getCuenta().get(numCuenta)
									.getConsentimiento().equals(TConsentimiento.SI)) {
								cuentaConConsentimiento = datosCuentaConsentimiento.get(0).getCuentaList().getCuenta()
										.get(numCuenta);
								existeCuentaConsentimiento = true;
								break;

							}
						}
					}
				}
			} else {
				existeCuentaConsentimiento = false;
			}

			if (existeCuentaConsentimiento) {

				/**********************************************
				 * Lenguaje de comunicacion con la administracion
				 ***********************************************/
				if (datosCuentaConsentimiento.get(0)
						.getIdioma() == com.ejie.ab61.clientesWS.X43CuentasInteresados.TLanguage.ES) {
					tInterested.setLanguage(com.ejie.ab61.clientesWS.X43SolicitudesYAportaciones.TLanguage.ES);
				} else if (datosCuentaConsentimiento.get(0)
						.getIdioma() == com.ejie.ab61.clientesWS.X43CuentasInteresados.TLanguage.EU) {
					tInterested.setLanguage(com.ejie.ab61.clientesWS.X43SolicitudesYAportaciones.TLanguage.EU);
				} else {
					tInterested.setLanguage(com.ejie.ab61.clientesWS.X43SolicitudesYAportaciones.TLanguage.NA);
				}

				/** Datos basico interesado **/
				tPerson.setID(datosCuentaConsentimiento.get(0).getNumeroIdentificacion());
				tPerson.setName(datosCuentaConsentimiento.get(0).getNombre());
				tPerson.setFirstLastName(datosCuentaConsentimiento.get(0).getApellido1());
				tPerson.setSecondLastName(datosCuentaConsentimiento.get(0).getApellido2());
				if (datosCuentaConsentimiento.get(0).getTipoIdentificacion() != null) {
					if (datosCuentaConsentimiento.get(0).getTipoIdentificacion().equals(TNia.CIF)) {
						tPerson.setType(TNiaType.CIF);
					} else if (datosCuentaConsentimiento.get(0).getTipoIdentificacion().equals(TNia.NIE)) {
						tPerson.setType(TNiaType.NIE);
					} else if (datosCuentaConsentimiento.get(0).getTipoIdentificacion().equals(TNia.NIF)) {
						tPerson.setType(TNiaType.NIF);
					} else if (datosCuentaConsentimiento.get(0).getTipoIdentificacion().equals(TNia.N_I)) {
						tPerson.setType(TNiaType.NO_ID);
					} else if (datosCuentaConsentimiento.get(0).getTipoIdentificacion().equals(TNia.OTHER)) {
						tPerson.setType(TNiaType.OTHER);
					} else if (datosCuentaConsentimiento.get(0).getTipoIdentificacion().equals(TNia.PASSPORT)) {
						tPerson.setType(TNiaType.PASSPORT);
					}
				}
				if (datosCuentaConsentimiento.get(0).getSexo() != null) {
					if (datosCuentaConsentimiento.get(0).getSexo().equals(TSexo.HOMBRE)) {
						tPerson.setSex(TSexType.HOMBRE);
					} else if (datosCuentaConsentimiento.get(0).getSexo().equals(TSexo.MUJER)) {
						tPerson.setSex(TSexType.MUJER);
					} else if (datosCuentaConsentimiento.get(0).getSexo().equals(TSexo.NA)) {
						tPerson.setSex(TSexType.NA);
					} else if (datosCuentaConsentimiento.get(0).getSexo().equals(TSexo.OTRA)) {
						tPerson.setSex(TSexType.OTRA);
					}
				}
				/** Datos del canal de comunicacion **/
				if (cuentaConConsentimiento.getCanalNotificacion() != null) {
					if (cuentaConConsentimiento.getCanalNotificacion().equals(TCanalNotificacion.ELECTRONICO)) {
						tNotifyChannel.setChannelType(TNotificationType.ELECTRONICA);
						tAccount.setNotify(tNotifyChannel);
					} else if (cuentaConConsentimiento.getCanalNotificacion().equals(TCanalNotificacion.POSTAL)) {
						tNotifyChannel.setChannelType(TNotificationType.POSTAL);
						TPostalAddress tPostalAddress = new TPostalAddress();
						tPostalAddress.setCodLocalidad(cuentaConConsentimiento.getCodLocalidad());
						tPostalAddress.setCodMunicipio(cuentaConConsentimiento.getCodMunicipio());
						tPostalAddress.setCodPais(cuentaConConsentimiento.getCodPais());
						tPostalAddress.setCodProvincia(cuentaConConsentimiento.getCodProvincia());
						tPostalAddress.setCp(cuentaConConsentimiento.getCodigoPostal());
						tPostalAddress.setDireccion(cuentaConConsentimiento.getDireccion());
						tPostalAddress.setPortal(cuentaConConsentimiento.getPortal());
						tPostalAddress.setEscalera(cuentaConConsentimiento.getEscalera());
						tPostalAddress.setPiso(cuentaConConsentimiento.getPiso());
						tPostalAddress.setLetra(cuentaConConsentimiento.getLetra());
						tPostalAddress.setLocalidad(cuentaConConsentimiento.getLocalidad());
						tPostalAddress.setMunicipio(cuentaConConsentimiento.getMunicipio());
						tPostalAddress.setPais(cuentaConConsentimiento.getPais());
						if (cuentaConConsentimiento.getProvincia() != null) {
							com.ejie.ab61.clientesWS.X43SolicitudesYAportaciones.TTextI18N provincia = new com.ejie.ab61.clientesWS.X43SolicitudesYAportaciones.TTextI18N();
							com.ejie.ab61.clientesWS.X43SolicitudesYAportaciones.TStringI18N rolCastellano = new com.ejie.ab61.clientesWS.X43SolicitudesYAportaciones.TStringI18N();
							rolCastellano.setLocale(com.ejie.ab61.clientesWS.X43SolicitudesYAportaciones.TLanguage.ES);
							rolCastellano.setValue(cuentaConConsentimiento.getProvincia());
							provincia.getText().add(0, rolCastellano);

							tPostalAddress.setProvincia(provincia);
						}

						tNotifyChannel.setPostal(tPostalAddress);
						tAccount.setNotify(tNotifyChannel);

					}

				}

				/** Datos de aviso **/
				TContactList tContactoList = new TContactList();
				if (cuentaConConsentimiento.getContactoList() != null
						&& cuentaConConsentimiento.getContactoList().getContacto() != null) {

					for (int numContacto = 0; numContacto < cuentaConConsentimiento.getContactoList().getContacto()
							.size(); numContacto++) {
						TContact tContacto = new TContact();
						if (cuentaConConsentimiento.getContactoList().getContacto().get(numContacto).getTipoContacto()
								.equals(TTipoContacto.EMAIL)) {
							tContacto.setChannelType(TContactType.EMAIL);
							tContacto.setEmail(cuentaConConsentimiento.getContactoList().getContacto().get(numContacto)
									.getInformacionContacto());
						} else if (cuentaConConsentimiento.getContactoList().getContacto().get(numContacto)
								.getTipoContacto().equals(TTipoContacto.FAX)) {
							tContacto.setChannelType(TContactType.FAX);
							tContacto.setFax(cuentaConConsentimiento.getContactoList().getContacto().get(numContacto)
									.getInformacionContacto());
						} else if (cuentaConConsentimiento.getContactoList().getContacto().get(numContacto)
								.getTipoContacto().equals(TTipoContacto.SMS)) {
							tContacto.setChannelType(TContactType.SMS);
							tContacto.setSms(cuentaConConsentimiento.getContactoList().getContacto().get(numContacto)
									.getInformacionContacto());
						} else if (cuentaConConsentimiento.getContactoList().getContacto().get(numContacto)
								.getTipoContacto().equals(TTipoContacto.TELEFONO)) {
							tContacto.setChannelType(TContactType.TELEFONO);
							tContacto.setPhone(cuentaConConsentimiento.getContactoList().getContacto().get(numContacto)
									.getInformacionContacto());
						}

						tContactoList.getContact().add(numContacto, tContacto);

					}

				}
				tAccount.setContactList(tContactoList);

				/**
				 * Obtenemos la informacion del tercero de la tabla AB6135T00
				 */
			} else {

				/**********************************************
				 * Lenguaje de comunicacion con la administracion
				 ***********************************************/
				if (tercero.getIdioma() != null) {
					if (tercero.getIdioma() == Constantes.Idioma.CASTELLANO) {
						tInterested.setLanguage(com.ejie.ab61.clientesWS.X43SolicitudesYAportaciones.TLanguage.ES);
					} else if (tercero.getIdioma() == Constantes.Idioma.EUSKERA) {
						tInterested.setLanguage(com.ejie.ab61.clientesWS.X43SolicitudesYAportaciones.TLanguage.EU);
					} else {
						tInterested.setLanguage(com.ejie.ab61.clientesWS.X43SolicitudesYAportaciones.TLanguage.NA);
					}
				}
				/** Datos basico interesado **/
				tPerson.setID(tercero.getDocumento());
				tPerson.setName(tercero.getNombre());
				tPerson.setFirstLastName(tercero.getApellido1());
				tPerson.setSecondLastName(tercero.getApellido2());
				if (tercero.getIdTipoDocumento() != null && !tercero.getIdTipoDocumento().equals("")) {
					if (tercero.getIdTipoDocumento() == Constantes.TiposDocumento.CIF) {
						tPerson.setType(TNiaType.CIF);
					} else if (tercero.getIdTipoDocumento() == Constantes.TiposDocumento.NIE) {
						tPerson.setType(TNiaType.NIE);
					} else if (tercero.getIdTipoDocumento() == Constantes.TiposDocumento.DNI) {
						tPerson.setType(TNiaType.NIF);
					} else if (tercero.getIdTipoDocumento() == Constantes.TiposDocumento.OTROS) {
						tPerson.setType(TNiaType.OTHER);
					} else if (tercero.getIdTipoDocumento() == Constantes.TiposDocumento.PASAPORTE) {
						tPerson.setType(TNiaType.PASSPORT);
					}
				}

				if (tercero.getIdSexo() != null && !tercero.getIdSexo().equals("") && tercero.getIdSexo() != 0) {
					if (tercero.getIdSexo() == Constantes.TiposSexo.HOMBRE) {
						tPerson.setSex(TSexType.HOMBRE);
					} else if ((tercero.getIdSexo() == Constantes.TiposSexo.MUJER)) {
						tPerson.setSex(TSexType.MUJER);
					} else {
						String sCodigoError = "error.addAdminApplication.TipoSexo";
						throw new Ab61Exception(sCodigoError,
								appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
								appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));
					}
				}
				/** Datos del canal de comunicacion **/
				/**
				 * Si el tercero es un CIF el canal de notificación es
				 * obligatoriamente ELECTRONICO, cualquier otro tipo de
				 * indentificación es POSTAL. La dirección postal se obtiene de
				 * la tabla AB6136T00
				 **/
				if (tercero.getIdTipoDocumento() != null
						&& tercero.getIdTipoDocumento() == Constantes.TiposDocumento.CIF) {
					tNotifyChannel.setChannelType(TNotificationType.ELECTRONICA);
					tAccount.setNotify(tNotifyChannel);
				} else {

					DatosDirecciones datosDirecciones = new DatosDirecciones();
					DatosTerceros datosTercerosFiltro = new DatosTerceros();
					datosTercerosFiltro.setIdTercero(tercero.getIdTercero());
					datosDirecciones.setDatosTerceros(datosTerceros);
					TiposDireccion tipoDireccion = new TiposDireccion();
					tipoDireccion.setIdTipoDireccion(Constantes.TiposDirecciones.DIRECCION_POSTAL);
					datosDirecciones.setTiposDireccion(tipoDireccion);
					List<DatosDirecciones> listaDirecciones = datosDireccionesDao.findDatosDireccion(datosDirecciones,
							null);

					TPostalAddress tPostalAddress = new TPostalAddress();
					if (listaDirecciones != null && listaDirecciones.size() > 0) {

						DatosDirecciones direccionPostalTercero = listaDirecciones.get(0);

						if (direccionPostalTercero.getDireccion() != null
								&& !direccionPostalTercero.getDireccion().contentEquals("")
								&& direccionPostalTercero.getCodigoPostal() != null
								&& !direccionPostalTercero.getCodigoPostal().contentEquals("")) {
							tPostalAddress.setCodLocalidad(String.valueOf(direccionPostalTercero.getIdLocalidad()));
							tPostalAddress.setCodMunicipio(String.valueOf(direccionPostalTercero.getIdMunicipio()));
							tPostalAddress.setCodPais(String.valueOf(direccionPostalTercero.getIdPais()));
							tPostalAddress.setCodProvincia(String.valueOf(direccionPostalTercero.getIdProvincia()));
							tPostalAddress.setCp(direccionPostalTercero.getCodigoPostal());
							tPostalAddress.setDireccion(direccionPostalTercero.getDireccion());
							tPostalAddress.setEscalera(direccionPostalTercero.getEscalera());
							tPostalAddress.setPiso(direccionPostalTercero.getPiso());
							tPostalAddress.setLetra(direccionPostalTercero.getLetra());

							tNotifyChannel.setChannelType(TNotificationType.POSTAL);
							tNotifyChannel.setPostal(tPostalAddress);
							tAccount.setNotify(tNotifyChannel);
						} else {
							tNotifyChannel.setChannelType(TNotificationType.ELECTRONICA);
							tAccount.setNotify(tNotifyChannel);
						}

					} else {
						tNotifyChannel.setChannelType(TNotificationType.ELECTRONICA);
						tAccount.setNotify(tNotifyChannel);
					}

				}

				/** Datos de aviso **/

				TContactList tContactoList = new TContactList();
				if (tercero.getCanalesAvisos() != null && tercero.getCanalesAvisos().size() > 0) {

					for (int j = 0; j < tercero.getCanalesAvisos().size(); j++) {
						TContact tContacto = new TContact();
						if (tercero.getCanalesAvisos().get(j).getTiposCanalAviso()
								.equals(Constantes.TIPO_CANAL_AVISO_EMAIL)) {
							tContacto.setChannelType(TContactType.EMAIL);
							tContacto.setEmail(tercero.getCanalesAvisos().get(j).getCanalAviso());
						} else if (tercero.getCanalesAvisos().get(j).getTiposCanalAviso()
								.equals(Constantes.TIPO_CANAL_AVISO_SMS)) {
							tContacto.setChannelType(TContactType.SMS);
							tContacto.setSms(tercero.getCanalesAvisos().get(j).getCanalAviso());
						}

						tContactoList.getContact().add(j, tContacto);

					}

				}

				tAccount.setContactList(tContactoList);

			}

			tInterested.setPersonID(tPerson);
			tInterested.setAccount(tAccount);
			tInterestedList.getInterested().add(tInterested);
			tApplicantRRI.setInterestedList(tInterestedList);
			tApplicantRRIList.getApplicant().add(tApplicantRRI);
			adminInitiation.setApplicantRRIList(tApplicantRRIList);

			try {
				DatosInicioOficio datosInicioOficio = new DatosInicioOficio();
				TSubmissionResponse tSubmissionResponse = x43SolicitudesYAportacionesAdaptadorService
						.addAdminApplication(adminInitiation, null);
				if (tSubmissionResponse.getPropertyList() != null
						&& tSubmissionResponse.getPropertyList().getProperty().size() > 0) {
					TAdminInitResponse tAdminInitResponse = tSubmissionResponse.getPropertyList().getProperty().get(0)
							.getAdminInitInfo();
					datosInicioOficio.setInicioOficioXML(tAdminInitResponse.getAdminInitXML());
					datosInicioOficio.setIdSolicitud(tAdminInitResponse.getApplicationID());
					datosInicioOficio.setFolderID(tAdminInitResponse.getFolderID());
					datosInicioOficio.setFechaCreacion(tAdminInitResponse.getCreationDate());

				}

				return datosInicioOficio;
			} catch (Exception e) {
				String sCodigoError = "error.AddAdminApplication";

				ServiciosWebServiceImpl.logger.error(sCodigoError, e);

				throw new Ab61Exception(sCodigoError, appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
						appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));
			}

		} else {
			String sCodigoError = "error.addAdminApplication.TerceroNoExiste";
			throw new Ab61Exception(sCodigoError, appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
					appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));
		}

	}

	public String descargarDocumento(Integer idPlantilla, String procedureId, String folderId,
			String identificadorInspeccion, String aplicacion) throws Ab61Exception {

		String path_Usuario = "";

		if ("".equals(idPlantilla) || null == idPlantilla) {
			String sCodigoError = "error.obligatorio.idPlantilla";

			ServiciosWebServiceImpl.logger.error("descargarDocumento - " + sCodigoError);

			throw new Ab61Exception(sCodigoError, appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
					appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));
		} else if ("".equals(aplicacion) || null == aplicacion) {
			String sCodigoError = "error.obligatorio.aplicacion";

			ServiciosWebServiceImpl.logger.error("descargarDocumento - " + sCodigoError);

			throw new Ab61Exception(sCodigoError, appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
					appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));
		}

		// Recuperamos la plantilla
		Plantillas plantilla = new Plantillas();
		plantilla.setIdPlantilla(idPlantilla);
		plantilla = this.plantillasService.find(plantilla);
		ServiciosWebServiceImpl.logger.info("Encontamos la platilla" + plantilla.toString());
		RelPlaCam camposPlantilla = new RelPlaCam();
		camposPlantilla.setIdDocumento(plantilla.getDocumento().getIdDocumento());
		List<RelPlaCam> listaRelacionCampos = this.relPlaCamService.findAll(camposPlantilla, null);
		ServiciosWebServiceImpl.logger.info("tamayo de la listaRelacionCampos" + listaRelacionCampos.size());
		List<CamposPlantilla> listaCampos = new ArrayList<CamposPlantilla>();
		try {
			if (listaRelacionCampos != null && !listaRelacionCampos.isEmpty()) {
				for (int i = 0; i < listaRelacionCampos.size(); i++) {
					CamposPlantilla campo = new CamposPlantilla();
					campo.setIdCampo(listaRelacionCampos.get(i).getIdCampo());
					listaCampos.add(this.camposPlantillaService.find(campo));
				}
			}
			if (listaCampos != null && !listaCampos.isEmpty()) {
				// Creamos el xml
				DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
				DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
				// root elements
				Document documentoXML = docBuilder.newDocument();

				String nombreDocumento = plantilla.getDocumento().getNombreDocumento();

				nombreDocumento = nombreDocumento.replace(' ', '_');
				nombreDocumento = nombreDocumento.replaceAll("\\)", "");
				nombreDocumento = nombreDocumento.replaceAll("\\(", "");

				ServiciosWebServiceImpl.logger.info("Nombre del Documento: " + nombreDocumento);

				Element rootElement = documentoXML.createElement(nombreDocumento);

				documentoXML.appendChild(rootElement);

				int origen = 0;

				String identificador = "";
				if (!"0".equals(folderId) && !"".equals(folderId) && null != folderId) {
					origen = Constantes.Plantillas.ORIGEN_EXPEDIENTE;
					// buscaremos el idExpediente
					Expedientes expediente = this.expedientesService.findByFolderId(folderId);
					if (null == expediente) {
						identificador = null;
					} else {
						identificador = expediente.getIdExpediente().toString();

					}

				} else if (!"".equals(identificadorInspeccion) && null != identificadorInspeccion) {
					origen = Constantes.Plantillas.ORIGEN_INSPECCION;
					// buscamos el identificadorInspeccion
					Inspecciones inspeccion = this.inspeccionesService
							.findByIdentificadorInspeccion(identificadorInspeccion);
					if (null != inspeccion) {
						identificador = inspeccion.getIdInspeccion().toString();
					} else {
						identificador = null;
					}
				} else {
					origen = Constantes.Plantillas.ORIGEN_PROCEDIMIENTO;
					// buscaremos el idprocedure
					Procedimientos procedimiento = this.procedimientosDao.findByProcedimento(procedureId);
					if (null == procedimiento) {
						identificador = null;
					} else {
						identificador = procedimiento.getIdProcedimiento().toString();
					}

				}
				ServiciosWebServiceImpl.logger
						.info("El identificador por el que gestionamos el objeto" + identificador);
				for (int contadorCampo = 0; contadorCampo < listaCampos.size(); contadorCampo++) {
					gestionObjetoXML(listaCampos.get(contadorCampo), documentoXML, rootElement, identificador);
				}

				path_Usuario = this.rtfService.generarDocParaDescargar(plantilla, aplicacion, documentoXML, origen);

			} else {
				if ((plantilla.getDocumento() != null) && (plantilla.getDocumento().getArchivo() != null)) {
					int blobLength = (int) plantilla.getDocumento().getArchivo().length();
					InputStream myInputStream = new ByteArrayInputStream(
							plantilla.getDocumento().getArchivo().getBytes(1, blobLength));
					Y31AttachmentBean retornoPIF = pifAdapterService.putFile(myInputStream,
							plantilla.getDocumento().getNombreDocumento() + ".rtf", "/" + aplicacion + "/", true);
					path_Usuario = retornoPIF.getFileName();
				} else {
					String sCodigoError = "error.DocumentoNoExistente";

					ServiciosWebServiceImpl.logger.error("generarRtf - " + sCodigoError);

					throw new Ab61Exception(sCodigoError,
							appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
							appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));

				}

			}
		} catch (Ab61Exception e_Ab61Exception) {

			ServiciosWebServiceImpl.logger.error("Excepcion generacion doc" + e_Ab61Exception);
			throw e_Ab61Exception;

		} catch (Exception e) {

			ServiciosWebServiceImpl.logger.error("Excepcion generacion doc" + e);

			String sCodigoError = "error.No_controlado";

			ServiciosWebServiceImpl.logger.error("descargarDoc - " + sCodigoError);

			throw new Ab61Exception(sCodigoError, appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
					appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));

		}

		return path_Usuario;
	}

	@Override
	public String descargarDocumentoNegocio(Integer idPlantilla, String identificador, Origen origen, String aplicacion)
			throws Ab61Exception {

		ServiciosWebServiceImpl.logger.info("Parametros de entrada: ");
		ServiciosWebServiceImpl.logger.info("idPlantilla: " + idPlantilla);
		ServiciosWebServiceImpl.logger.info("identificador: " + identificador);
		ServiciosWebServiceImpl.logger.info("origen: " + origen.getNumVal());

		String path_Usuario = "";

		if ("".equals(idPlantilla) || null == idPlantilla) {
			String sCodigoError = "error.obligatorio.idPlantilla";

			ServiciosWebServiceImpl.logger.error("descargarDocumento - " + sCodigoError);

			throw new Ab61Exception(sCodigoError, appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
					appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));
		} else if ("".equals(aplicacion) || null == aplicacion) {
			String sCodigoError = "error.obligatorio.aplicacion";

			ServiciosWebServiceImpl.logger.error("descargarDocumento - " + sCodigoError);

			throw new Ab61Exception(sCodigoError, appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
					appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));
		}

		// Recuperamos la plantilla
		Plantillas plantilla = new Plantillas();
		plantilla.setIdPlantilla(idPlantilla);
		plantilla = this.plantillasService.find(plantilla);
		ServiciosWebServiceImpl.logger.info("Encontamos la platilla" + plantilla.toString());
		RelPlaCam camposPlantilla = new RelPlaCam();
		camposPlantilla.setIdDocumento(plantilla.getDocumento().getIdDocumento());
		List<RelPlaCam> listaRelacionCampos = this.relPlaCamService.findAll(camposPlantilla, null);
		ServiciosWebServiceImpl.logger.info("tamayo de la listaRelacionCampos" + listaRelacionCampos.size());
		List<CamposPlantilla> listaCampos = new ArrayList<CamposPlantilla>();
		try {
			if (listaRelacionCampos != null && !listaRelacionCampos.isEmpty()) {
				for (int i = 0; i < listaRelacionCampos.size(); i++) {
					CamposPlantilla campo = new CamposPlantilla();
					campo.setIdCampo(listaRelacionCampos.get(i).getIdCampo());
					listaCampos.add(this.camposPlantillaService.find(campo));
				}
			}
			if (listaCampos != null && !listaCampos.isEmpty()) {
				// Creamos el xml
				DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
				DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
				// root elements
				Document documentoXML = docBuilder.newDocument();

				String nombreDocumento = plantilla.getDocumento().getNombreDocumento();

				nombreDocumento = nombreDocumento.replace(' ', '_');
				nombreDocumento = nombreDocumento.replaceAll("\\)", "");
				nombreDocumento = nombreDocumento.replaceAll("\\(", "");

				ServiciosWebServiceImpl.logger.info("Nombre del Documento: " + nombreDocumento);

				Element rootElement = documentoXML.createElement(nombreDocumento);

				documentoXML.appendChild(rootElement);

				int origenInt = 0;
				String identificadorClave = "";

				switch (origen) {
				case EXPEDIENTE:
					origenInt = Constantes.Plantillas.ORIGEN_EXPEDIENTE;
					// buscaremos el idExpediente
					Expedientes expediente = this.expedientesService.findByFolderId(identificador);
					if (null == expediente) {
						identificadorClave = null;
					} else {
						identificadorClave = expediente.getIdExpediente().toString();

					}
					break;
				case INSPECCION:
					origenInt = Constantes.Plantillas.ORIGEN_INSPECCION;
					// buscamos el identificadorInspeccion
					Inspecciones inspeccion = this.inspeccionesService.findByIdentificadorInspeccion(identificador);
					if (null != inspeccion) {
						identificadorClave = inspeccion.getIdInspeccion().toString();
					} else {
						identificadorClave = null;
					}
					break;
				case ESTABLECIMIENTO:
					origenInt = Constantes.Plantillas.ORIGEN_ESTABLECIMIENTO;
					identificadorClave = identificador;
					break;
				case PROCEDIMIENTO:
					origenInt = Constantes.Plantillas.ORIGEN_PROCEDIMIENTO;
					// buscaremos el idprocedure
					Procedimientos procedimiento = this.procedimientosDao.findByProcedimento(identificador);
					if (null == procedimiento) {
						identificadorClave = null;
					} else {
						identificadorClave = procedimiento.getIdProcedimiento().toString();
					}
					break;

				default:
					break;
				}
				ServiciosWebServiceImpl.logger
						.info("El identificador por el que gestionamos el objeto" + identificadorClave);
				for (int contadorCampo = 0; contadorCampo < listaCampos.size(); contadorCampo++) {
					gestionObjetoXML(listaCampos.get(contadorCampo), documentoXML, rootElement, identificadorClave);
				}

				path_Usuario = this.rtfService.generarDocParaDescargar(plantilla, aplicacion, documentoXML, origenInt);

			} else {
				if ((plantilla.getDocumento() != null) && (plantilla.getDocumento().getArchivo() != null)) {
					int blobLength = (int) plantilla.getDocumento().getArchivo().length();
					InputStream myInputStream = new ByteArrayInputStream(
							plantilla.getDocumento().getArchivo().getBytes(1, blobLength));
					Y31AttachmentBean retornoPIF = pifAdapterService.putFile(myInputStream,
							plantilla.getDocumento().getNombreDocumento() + ".rtf", "/" + aplicacion + "/", true);
					path_Usuario = retornoPIF.getFileName();
				} else {
					String sCodigoError = "error.DocumentoNoExistente";

					ServiciosWebServiceImpl.logger.error("generarRtf - " + sCodigoError);

					throw new Ab61Exception(sCodigoError,
							appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
							appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));

				}

			}
		} catch (Ab61Exception e_Ab61Exception) {

			ServiciosWebServiceImpl.logger.error("Excepcion generacion doc" + e_Ab61Exception);
			throw e_Ab61Exception;

		} catch (Exception e) {

			ServiciosWebServiceImpl.logger.error("Excepcion generacion doc" + e);

			String sCodigoError = "error.No_controlado";

			ServiciosWebServiceImpl.logger.error("descargarDoc - " + sCodigoError);

			throw new Ab61Exception(sCodigoError, appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
					appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));

		}

		return path_Usuario;
	}

	private void gestionObjetoXML(CamposPlantilla objeto, Document documentoXML, Element rootElement,
			String identificador) throws ParseException {
		List<String> listaResultados;
		String sql = objeto.getSelectCampo();
		// Si el objeto que tenemos obtiene la información mediante SQL
		// (no es Servicio Web)
		if (objeto.getIdTipoCampo() != Constantes.TiposObjetoPlantilla.WEB_SERVICE) {
			// En primer lugar sustituimos las ? de la SELECT por el
			// Identificador de Expediente o el Identificador de
			// Procedimiento
			int contadorInterrogantes = 0;
			String[] parametros = null;
			if (sql != null) {
				contadorInterrogantes = contarCaracteres(sql, '?');
				if (contadorInterrogantes > 0) {
					parametros = new String[contadorInterrogantes];

					for (int contador = 0; contador < contadorInterrogantes; contador++) {
						parametros[contador] = identificador;
					}
				}
			}
			listaResultados = this.recuperarDatosCampoService.recuperar(objeto.getSelectCampo(), parametros);

			// Si sólo obtenemos UN REGISTRO y el Tipo de Objeto es
			// diferente de TABLA y FORMULARIO
			if (listaResultados != null && listaResultados.size() == 1
					&& objeto.getIdTipoCampo() != Constantes.TiposObjetoPlantilla.TABLA
					&& objeto.getIdTipoCampo() != Constantes.TiposObjetoPlantilla.FORMULARIO) {
				String resultado = listaResultados.get(0);

				if (resultado != null && !"".equalsIgnoreCase(resultado)) {

					boolean bVariosCampos = resultado.contains("#");

					// Si tenemos el caso de tener UN REGISTRO de UN
					// SOLO CAMPO
					if (!bVariosCampos) {
						Element tag = null;
						// Si el Tipo de Campo es una FECHA
						if (objeto.getIdTipoCampo() == Constantes.TiposObjetoPlantilla.FECHA && resultado != null
								&& !"".equalsIgnoreCase(resultado)) {
							SimpleDateFormat formatter = null;
							Date date = null;
							formatter = new SimpleDateFormat("yy-MM-dd");
							date = formatter.parse(resultado);

							// En primer lugar generamos la
							// Fecha en
							// Euskera
							Locale locale = new Locale("eu");
							tag = documentoXML.createElement(objeto.getNombreCampo() + "." + "EU");

							String valorEuskera = DateUtils.convertirFechaEnStringExt(date, locale);

							tag.appendChild(documentoXML.createTextNode(valorEuskera));
							rootElement.appendChild(tag);

							// Además generamos la Fecha en
							// Castellano
							locale = new Locale("es");

							tag = documentoXML.createElement(objeto.getNombreCampo() + "." + "ES");

							String valorCastellano = DateUtils.convertirFechaEnStringExt(date, locale);

							tag.appendChild(documentoXML.createTextNode(valorCastellano));
							rootElement.appendChild(tag);
						} else {

							tag = documentoXML.createElement(objeto.getNombreCampo());

							if (objeto.getIdTipoCampo() == Constantes.TiposObjetoPlantilla.NUMERICO && resultado != null
									&& !"".equalsIgnoreCase(resultado)) {

								try {
									BigDecimal decimal = new BigDecimal(resultado);
									resultado = DateUtils.formatearMiles(decimal);
								} catch (Exception ex) {
									resultado = listaResultados.get(0);
								}
							}
							tag.appendChild(documentoXML.createTextNode(resultado));
							rootElement.appendChild(tag);
						}

					}
					// Si tenemos el caso de tener UN REGISTRO de VARIOS
					// CAMPOS
					else {
						String[] datosResultado = resultado.split("#");
						String[] campos = objeto.getNombreXml().split(";");
						if (datosResultado != null && datosResultado.length > 0) {
							for (int contador = 0; contador < datosResultado.length; contador++) {
								if (!"".equals(datosResultado[contador])) {
									Element tag = documentoXML
											.createElement(objeto.getNombreCampo() + "." + campos[contador]);
									tag.appendChild(documentoXML.createTextNode(datosResultado[contador]));

									rootElement.appendChild(tag);
								}
							}
						}
					}
				}
			} // Si el Tipo de Objeto es una TABLA
			else if (listaResultados != null && objeto.getIdTipoCampo() == Constantes.TiposObjetoPlantilla.TABLA) {

				if (!listaResultados.isEmpty()) {

					Element elementoTabla = null;

					elementoTabla = documentoXML.createElement("tabla");

					Element tag = documentoXML.createElement(objeto.getNombreCampo());
					for (int contadorResultado = 0; contadorResultado < listaResultados.size(); contadorResultado++) {
						Element elemento = documentoXML.createElement("elemento");
						String[] datosResultado = listaResultados.get(contadorResultado).split("#");
						String[] campos = objeto.getNombreXml().split(";");
						if (datosResultado != null && datosResultado.length > 0) {
							for (int contador = 0; contador < datosResultado.length; contador++) {
								Element dato = documentoXML.createElement(campos[contador]);
								dato.appendChild(documentoXML.createTextNode(datosResultado[contador]));
								elemento.appendChild(dato);
							}
						}
						tag.appendChild(elemento);
					}

					elementoTabla.appendChild(tag);
					rootElement.appendChild(elementoTabla);

				}
			} // Si el Tipo de Objeto es una LISTA
			else if (listaResultados != null && objeto.getIdTipoCampo() == Constantes.TiposObjetoPlantilla.LISTA) {

				if (!listaResultados.isEmpty()) {

					Element elementoLista = null;

					elementoLista = documentoXML.createElement("lista");

					Element tag = documentoXML.createElement(objeto.getNombreCampo());
					for (int contadorResultado = 0; contadorResultado < listaResultados.size(); contadorResultado++) {
						Element elemento = documentoXML.createElement("elemento");

						Element dato = documentoXML.createElement(objeto.getNombreXml());
						dato.appendChild(documentoXML.createTextNode(listaResultados.get(contadorResultado)));
						elemento.appendChild(dato);
						tag.appendChild(elemento);
					}

					elementoLista.appendChild(tag);
					rootElement.appendChild(elementoLista);

				}
			} // Si el Tipo de Objeto es un FORMULARIO / SUBPLANTILLA
			else if (listaResultados != null && objeto.getIdTipoCampo() == Constantes.TiposObjetoPlantilla.FORMULARIO) {
				if (!listaResultados.isEmpty()) {

					RelPlaCam camposSubPlantilla = new RelPlaCam();
					camposSubPlantilla.setIdDocumento(objeto.getIdDocumento());
					List<RelPlaCam> listaRelacionCamposSubPlantilla = this.relPlaCamService.findAll(camposSubPlantilla,
							null);
					List<CamposPlantilla> listaCamposSubPlantilla = new ArrayList<CamposPlantilla>();
					if (listaRelacionCamposSubPlantilla != null && !listaRelacionCamposSubPlantilla.isEmpty()) {
						for (int i = 0; i < listaRelacionCamposSubPlantilla.size(); i++) {
							CamposPlantilla campo = new CamposPlantilla();
							campo.setIdCampo(listaRelacionCamposSubPlantilla.get(i).getIdCampo());
							listaCamposSubPlantilla.add(this.camposPlantillaService.find(campo));
						}
					}

					Element elementoFormulario = documentoXML.createElement("formulario");

					Element elementoNombreFormulario = documentoXML.createElement(objeto.getNombreCampo());

					Element dato = documentoXML.createElement("idFormulario");
					dato.appendChild(documentoXML.createTextNode(objeto.getIdDocumento().toString()));
					elementoNombreFormulario.appendChild(dato);

					for (String resultado : listaResultados) {

						Element elementoElemento = documentoXML.createElement("elemento");

						for (int contadorCampoSubPlantilla = 0; contadorCampoSubPlantilla < listaCamposSubPlantilla
								.size(); contadorCampoSubPlantilla++) {

							gestionObjetoXML(listaCamposSubPlantilla.get(contadorCampoSubPlantilla), documentoXML,
									elementoElemento, resultado);

						}
						elementoNombreFormulario.appendChild(elementoElemento);
					}
					elementoFormulario.appendChild(elementoNombreFormulario);
					rootElement.appendChild(elementoFormulario);
				}

			}

		} else {
			// cuando es de tipo 4 (webService) metemos en el xml el
			// adaptador y el folder id para que la ab61 sea capaz
			// de hacer la llamada al webService
			// y tenerlo centralizado en el nucleo
			Expedientes expediente = new Expedientes();
			expediente.setIdExpediente(Integer.parseInt(identificador));
			expediente = expedientesService.find(expediente);

			String[] paquetes = sql.split("#");
			String adaptadorWebService = paquetes[0];

			String[] nombreCampos = null;
			if (objeto.getNombreXml() != null) {
				nombreCampos = objeto.getNombreXml().split(";");
			}
			String camposWebService = "";
			for (int j = 0; j < nombreCampos.length; j++) {
				camposWebService += nombreCampos[j] + "#";
			}

			Element elementoWebService = documentoXML.createElement("WebService");

			Element folderIdElement = documentoXML.createElement("folderID");
			folderIdElement.appendChild(documentoXML.createTextNode(expediente.getFolderId()));
			elementoWebService.appendChild(folderIdElement);

			Element codProcedureIdElement = documentoXML.createElement("codProcedureId");
			codProcedureIdElement.appendChild(documentoXML.createTextNode(expediente.getIdProcedimiento().toString()));
			elementoWebService.appendChild(codProcedureIdElement);

			Element adaptadorWebServiceElement = documentoXML.createElement("adaptadorWebService");
			adaptadorWebServiceElement.appendChild(documentoXML.createTextNode(adaptadorWebService));
			elementoWebService.appendChild(adaptadorWebServiceElement);

			// pasamos los campos necesarios para rellenar la
			// informacion que obtendremos en el nucleo desde el
			// webService

			Element camposWebServiceElement = documentoXML.createElement("camposWebService");
			camposWebServiceElement.appendChild(documentoXML.createTextNode(camposWebService));
			elementoWebService.appendChild(camposWebServiceElement);

			rootElement.appendChild(elementoWebService);
		}
	}

	private static int contarCaracteres(String cadena, char caracter) {
		int posicion, contador = 0;
		// se busca la primera vez que aparece
		posicion = cadena.indexOf(caracter);
		while (posicion != -1) { // mientras se encuentre el caracter
			contador++; // se cuenta
			// se sigue buscando a partir de la posición siguiente a la
			// encontrada
			posicion = cadena.indexOf(caracter, posicion + 1);
		}
		return contador;
	}

	@Override
	public String modificarDocumento(Integer idPlantilla, String procedureId, String folderId,
			String identificadorInspeccion, String usuario) throws Ab61Exception {

		RelExpPla relexppla = new RelExpPla();
		String pathUsuario = null;
		String pathDocumento = null;

		try {
			if (!"0".equals(folderId) && !"".equals(folderId) && null != folderId) {
				Expedientes expediente = new Expedientes();
				expediente.setFolderId(folderId);
				relexppla.setExpediente(expediente);
			} else if (!"".equals(identificadorInspeccion) && null != identificadorInspeccion) {
				Inspecciones inspeccion = new Inspecciones();
				inspeccion.setIdentificadorInspeccion(identificadorInspeccion);
				relexppla.setInspeccion(inspeccion);
			}

			relexppla.setIdPlantilla(idPlantilla);

			Procedimientos procedimiento = new Procedimientos();
			procedimiento.setCodProcedureId(procedureId);

			relexppla.setProcedimiento(procedimiento);

			// Obtenemos la ruta del documento, Ruta de Aplicación
			String ruta = this.relExpPlaService.getRuta(relexppla);

			if (ruta != null) {
				String rutaTo = "/user/" + usuario.toLowerCase() + Constantes.CARPETA_COPIA_BUZON_PIF
						+ FilenameUtils.getName(ruta);

				pathUsuario = pifAdapterService.copyFile(ruta, rutaTo, true).getFilePath();

				ServiciosWebServiceImpl.logger.info("path_Usuario:" + pathUsuario);

				Properties prop = Config.loadProperties(Constantes.FICHERO_CONFIGURACION);
				pathDocumento = prop.getProperty("URL_SPIF") + pathUsuario;
			}

		} catch (PifException e) {
			ServiciosWebServiceImpl.logger
					.error("No se encontrado el fichero a la hora de realizar la mofificación de la plantilla");

			String sCodigoError = "error.noExisteFicheroPIF";

			throw new Ab61Exception(sCodigoError, appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
					appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));

		} catch (Exception e) {
			ServiciosWebServiceImpl.logger.error("error " + e);

			String sCodigoError = "error.No_controlado";

			throw new Ab61Exception(sCodigoError, appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
					appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));
		}

		return pathDocumento;

	}

	@Override
	public String modificarDocumentoNegocio(Integer idPlantilla, String identificador, String usuario)
			throws Ab61Exception {
		RelExpPla relexppla = new RelExpPla();
		String pathUsuario = null;
		String pathDocumento = null;

		try {

			relexppla.setIdentificador(identificador);
			relexppla.setIdPlantilla(idPlantilla);

			// Obtenemos la ruta del documento, Ruta de Aplicación
			String ruta = this.relExpPlaService.getRutaNegocio(relexppla);

			if (ruta != null) {
				String rutaTo = "/user/" + usuario.toLowerCase() + Constantes.CARPETA_COPIA_BUZON_PIF
						+ FilenameUtils.getName(ruta);

				pathUsuario = pifAdapterService.copyFile(ruta, rutaTo, true).getFilePath();

				ServiciosWebServiceImpl.logger.info("path_Usuario:" + pathUsuario);

				Properties prop = Config.loadProperties(Constantes.FICHERO_CONFIGURACION);
				pathDocumento = prop.getProperty("URL_SPIF") + pathUsuario;
			}

		} catch (PifException e) {
			ServiciosWebServiceImpl.logger
					.error("No se encontrado el fichero a la hora de realizar la mofificación de la plantilla");

			String sCodigoError = "error.noExisteFicheroPIF";

			throw new Ab61Exception(sCodigoError, appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
					appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));

		} catch (Exception e) {
			ServiciosWebServiceImpl.logger.error("error " + e);

			String sCodigoError = "error.No_controlado";

			throw new Ab61Exception(sCodigoError, appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
					appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));
		}

		return pathDocumento;
	}

	@Override
	public String aportarDocumento(Integer idPlantilla, String folderId, String procedureId, String n38Login,
			String usuario) throws Ab61Exception {
		ServiciosWebServiceImpl.logger.info("Entrada aportarDocumento");

		RelExpPla relexppla = new RelExpPla();

		if (!folderId.equals("0")) {
			Expedientes expediente = new Expedientes();
			expediente.setFolderId(folderId);
			relexppla.setExpediente(expediente);
		}
		relexppla.setIdPlantilla(idPlantilla);

		Procedimientos procedimiento = new Procedimientos();
		procedimiento.setCodProcedureId(procedureId);

		relexppla.setProcedimiento(procedimiento);

		try {
			if (null != relexppla && null == relexppla.getExpediente()) {
				relexppla = this.relExpPlaDao.obtenerDocumentoDesdeProcedimiento(relexppla);
			} else {
				relexppla = this.relExpPlaDao.obtenerDatosAportarDocumento(relexppla);
			}

		} catch (Exception e) {

			String sCodigoError = "error.SQLBusqueda";

			ServiciosWebServiceImpl.logger.error("aportarDocumento - " + sCodigoError, e);

			throw new Ab61Exception(sCodigoError, appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
					appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));
		}

		aportarDocumentosPlatea(relexppla, folderId, procedureId, n38Login, usuario, false);

		ServiciosWebServiceImpl.logger.info("[GET - SUBSANDOC] aportarDocumento iniciando fin");

		return "ok";
	}

	@Override
	public String aportarDocumentoNegocio(Integer idPlantilla, String folderId, String procedureId, String n38Login,
			String usuario) throws Ab61Exception {
		ServiciosWebServiceImpl.logger.info("Entrada aportarDocumentoNegocio");

		RelExpPla relexppla = new RelExpPla();

		if (!folderId.equals("0")) {
			Expedientes expediente = new Expedientes();
			expediente.setFolderId(folderId);
			relexppla.setExpediente(expediente);
		}
		relexppla.setIdPlantilla(idPlantilla);

		Procedimientos procedimiento = new Procedimientos();
		procedimiento.setCodProcedureId(procedureId);

		relexppla.setProcedimiento(procedimiento);

		try {

			relexppla = this.relExpPlaDao.obtenerDatosAportarDocumentoNegocio(relexppla);

		} catch (Exception e) {

			String sCodigoError = "error.SQLBusqueda";

			ServiciosWebServiceImpl.logger.error("aportarDocumento - " + sCodigoError, e);

			throw new Ab61Exception(sCodigoError, appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
					appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));
		}

		aportarDocumentosPlatea(relexppla, folderId, procedureId, n38Login, usuario, false);

		ServiciosWebServiceImpl.logger.info("[GET - SUBSANDOC] aportarDocumento iniciando fin");

		return "ok";
	}

	@Override
	public List<DocumentoAportado> aportarDocumentos(List<DocumentoWS> documentosWS, String folderId,
			String procedureId, String n38Login, String usuario) throws Ab61Exception {

		ServiciosWebServiceImpl.logger.info("Entrada aportarDocumentos");
		List<DocumentoAportado> listaDocumentosAportados = new ArrayList<DocumentoAportado>();
		boolean aportarDesdePid;

		for (DocumentoWS documentoWS : documentosWS) {
			RelExpPla relExpPla = new RelExpPla();
			DocumentoAportado documentoAportado = new DocumentoAportado();
			documentoAportado.setOidPid(documentoWS.getOidPid());

			if (!folderId.equals("0")) {
				Expedientes expediente = new Expedientes();
				expediente.setFolderId(folderId);
				relExpPla.setExpediente(expediente);
			}

			if (!"0".equals(documentoWS.getOidDokusi()) && !"".equals(documentoWS.getOidDokusi())
					&& null != documentoWS.getOidDokusi()) {
				String pifPath = "";
				aportarDesdePid = false;
				// Recogemos el documento de DOKUSI
				try {
					pifPath = this.t65bDokusiAdaptadorService.retrieveDocumentR02G(documentoWS.getOidDokusi());

				} catch (Exception e) {
					String sCodigoError = "error.retrieveDocumentR02G";

					ServiciosWebServiceImpl.logger.error("aportarDocumentos - " + sCodigoError, e);

					throw new Ab61Exception(sCodigoError,
							appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
							appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));
				}
				relExpPla.setRuta(pifPath);
			} else {
				// Recogemos el documento del PID
				aportarDesdePid = true;
				Documento documento = new Documento();
				Documento documentoResultado = new Documento();
				documento.setIdPID(documentoWS.getOidPid());
				documento.setPathPIF(
						"/" + Constantes.CODIGO_APLICACION_TAREAS_TRAMITACION + "/" + Constantes.CODIGO_APLICACION);
				documento.setTipologia(Tipologia.INICIATIVA_TURISMO);

				try {
					documentoResultado = this.pidAdapterService.recuperarDocumento(documento);
				} catch (Exception e) {
					String sCodigoError = "error.recuperarDocumentoPid";

					ServiciosWebServiceImpl.logger.error("aportarDocumentos - " + sCodigoError, e);

					throw new Ab61Exception(sCodigoError,
							appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
							appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));
				}
				relExpPla.setRuta(documentoResultado.getPathPIF());
			}

			TiposPlantilla tipoPlantilla = new TiposPlantilla();
			tipoPlantilla.setIdTipoPlantilla(Long.valueOf(documentoWS.getTipoDocumento()));
			tipoPlantilla = this.tiposPlantillaService.find(tipoPlantilla);

			Plantillas plantilla = new Plantillas();
			plantilla.setTiposPlantilla(tipoPlantilla);
			relExpPla.setPlantilla(plantilla);

			TTask tTask = aportarDocumentosPlatea(relExpPla, folderId, procedureId, n38Login, usuario, true);
			documentoAportado.setOidDokusi(
					tTask.getTaskAdjuntarDoc().getTaskDocument().getDocumentList().getDocument().get(0).getDokusiID());
			listaDocumentosAportados.add(documentoAportado);

			if (aportarDesdePid) {
				// Eliminamos el documento del PID
				this.pidAdapterService.eliminarDocumento(documentoAportado.getOidPid());

				// Actualizamos en AB6152T00
				DocumentosPid documentoPid = this.documentosPidService.findIdByOidPid(documentoAportado.getOidPid());
				documentoPid.setOidPid(null);
				documentoPid.setOidDokusi(documentoAportado.getOidDokusi());
				documentoPid.setAportadoExpediente(Constantes.APORTADO_EXPEDIENTE_SI);
				documentoPid.setUsuarioUltmodificacion(usuario);
				this.documentosPidService.update(documentoPid);

			}

		}

		ServiciosWebServiceImpl.logger.info("[GET - SUBSANADOC] aportatDocumentos iniciando fin");

		return listaDocumentosAportados;

	}

	@Override
	public String eliminarDocumento(Integer idPlantilla, String folderId, String procedureId,
			String identificadorInspeccion) throws Ab61Exception {

		ServiciosWebServiceImpl.logger.info("Entrada eliminarDocumento");

		RelExpPla relexppla = new RelExpPla();

		try {
			if (!"0".equals(folderId) && !"".equals(folderId) && null != folderId) {
				Expedientes expediente = new Expedientes();
				expediente.setFolderId(folderId);
				relexppla.setExpediente(expediente);
			} else if (!"0".equals(identificadorInspeccion) && !"".equals(identificadorInspeccion)
					&& null != identificadorInspeccion) {
				Inspecciones inspeccion = new Inspecciones();
				inspeccion.setIdentificadorInspeccion(identificadorInspeccion);
				relexppla.setInspeccion(inspeccion);
			}

			relexppla.setIdPlantilla(idPlantilla);
			Procedimientos procedimiento = new Procedimientos();
			procedimiento.setCodProcedureId(procedureId);
			relexppla.setProcedimiento(procedimiento);

			if (null != relexppla.getExpediente()) {
				relexppla = this.relExpPlaDao.obtenerDatosAportarDocumento(relexppla);

			} else if (null != relexppla.getInspeccion()) {
				relexppla = this.relExpPlaDao.obtenerDocumentoDesdeInspeccion(relexppla);

			} else {
				relexppla = this.relExpPlaDao.obtenerDocumentoDesdeProcedimiento(relexppla);
			}
			// borramos la ruta de la tabla AB6133T00
			ServiciosWebServiceImpl.logger.info("ruta del archivo:" + relexppla.getRuta());

			if (null != relexppla.getRuta()) {
				String ruta = relexppla.getRuta();
				relExpPlaDao.remove(relexppla);
				pifAdapterService.deleteFile(ruta);

			}

		} catch (PifException e) {
			ServiciosWebServiceImpl.logger
					.error("No se encontrado el fichero a la hora de realizar la eliminacion del docuemnto");

			String sCodigoError = "error.noExisteFicheroPIF";

			// en el caso de intentar eliminar del PIF , sino puede eliminar pq
			// el archivo no exite no lanzaremmos excepcion

		} catch (Exception e) {
			ServiciosWebServiceImpl.logger.error("error " + e);

			String sCodigoError = "error.No_controlado";

			throw new Ab61Exception(sCodigoError, appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
					appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));
		}

		return "ok";
	}

	@Override
	public String eliminarDocumentoNegocio(Integer idPlantilla, String identificador) throws Ab61Exception {
		ServiciosWebServiceImpl.logger.info("Entrada eliminarDocumento");

		RelExpPla relexppla = new RelExpPla();
		relexppla.setIdPlantilla(idPlantilla);
		relexppla.setIdentificador(identificador);

		try {

			relexppla = this.relExpPlaDao.obtenerRutaByIdentificador(relexppla);

			if (null != relexppla && null != relexppla.getRuta()) {
				// borramos la ruta de la tabla AB6133T00
				ServiciosWebServiceImpl.logger.info("ruta del archivo:" + relexppla.getRuta());
				String ruta = relexppla.getRuta();
				relExpPlaDao.remove(relexppla);
				pifAdapterService.deleteFile(ruta);

			}

		} catch (PifException e) {
			ServiciosWebServiceImpl.logger
					.error("No se encontrado el fichero a la hora de realizar la eliminacion del docuemnto");

			String sCodigoError = "error.noExisteFicheroPIF";

			// en el caso de intentar eliminar del PIF , sino puede eliminar pq
			// el archivo no exite no lanzaremmos excepcion

		} catch (Exception e) {
			ServiciosWebServiceImpl.logger.error("error " + e);

			String sCodigoError = "error.No_controlado";

			throw new Ab61Exception(sCodigoError, appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
					appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));
		}

		return "ok";
	}

	/**
	 * 
	 * @param folderId
	 *            String
	 * 
	 * @return String
	 */
	private String getXMLGetTasks(String folderId, String taskId) throws X43TareasTramitacionException, Exception {
		String strGUID = null;

		try {
			TStringList groupIDList = new TStringList();

			ObjectFactory objectFactory = new ObjectFactory();

			TMessageTipologyList messageTipologyList = new TMessageTipologyList();
			messageTipologyList.getMessageTipology().add(TMessageTipology.TRAMITACION);

			TMessageStatusList statusList = new TMessageStatusList();
			statusList.getMessageStatus().add(TMessageStatus.PENDING);

			TMessageFilterValue tMessageFilterValue = new TMessageFilterValue();
			tMessageFilterValue.setKey(TMessageFilter.FOLDERID);
			tMessageFilterValue.setValue(folderId);

			TMessageFilterValueList mapProperties = new TMessageFilterValueList();
			mapProperties.getItem().add(tMessageFilterValue);

			AExtensionPoint ep = objectFactory.createAExtensionPoint();

			TMessageList tMessageList = this.x43TareasTramitacionAdaptadorService.getGATTasks(groupIDList,
					messageTipologyList, statusList, mapProperties, null, null, TGatTaskFilter.MESSAGELIST, ep);

			if (tMessageList != null && tMessageList.getMessage() != null) {
				for (TMessage tmessage : tMessageList.getMessage()) {

					TNotificationBody tNotificationBody = tmessage.getMessage();

					if (tNotificationBody != null) {
						for (TKeyValue tKeyvalue : tNotificationBody.getParameter()) {

							if (tKeyvalue != null && "taskID".equals(tKeyvalue.getKey())
									&& taskId.equals(tKeyvalue.getValue())) {
								strGUID = tmessage.getTaskGUID();
								return strGUID;
							}

						}
					}
				}
			}

		} catch (X43TareasTramitacionException e) {
			ServiciosWebServiceImpl.logger.info("Error al obtener las tareas = " + e.getMessage());
			throw e;
		} catch (Exception e) {
			ServiciosWebServiceImpl.logger.info("Error al obtener las tareas = " + e.getMessage());
			throw e;
		}

		return strGUID;
	}

	private static void insertarXML(Document doc) {
		try {
			StringWriter sw = new StringWriter();
			TransformerFactory tf = TransformerFactory.newInstance();
			Transformer transformer = tf.newTransformer();
			transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no");
			transformer.setOutputProperty(OutputKeys.METHOD, "xml");
			transformer.setOutputProperty(OutputKeys.INDENT, "yes");
			transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");

			transformer.transform(new DOMSource(doc), new StreamResult(sw));
			ServiciosWebServiceImpl.logger.info("XML Generado:" + sw.toString());
		} catch (Exception ex) {
			throw new RuntimeException("Error converting to String", ex);
		}
	}

	/**
	 * A partir del numero de identificacion se obtiene los datos de la cuenta
	 * 
	 * @param indentificador
	 * @return List<TInteresado>
	 * @throws Ab61Exception
	 * @throws NoSuchMessageException
	 */
	private List<TInteresado> obtenerDatosCuenta(String indentificador) throws NoSuchMessageException, Ab61Exception {
		TInterestedSearch tInterestedSearch = new TInterestedSearch();
		List<TInteresado> listaInteresados = new ArrayList<TInteresado>();
		try {

			com.ejie.ab61.clientesWS.X43CuentasInteresados.TStringList tStringList = new com.ejie.ab61.clientesWS.X43CuentasInteresados.TStringList();
			tStringList.getValor().add(indentificador);
			tInterestedSearch.setNumerosIdentificacion(tStringList);
			listaInteresados = x43CuentasInteresadosAdaptadorService.getPersonsConsent(tInterestedSearch);
			return listaInteresados;

		} catch (Exception e) {
			String sCodigoError = "error.GetPersonsConsent";
			ServiciosWebServiceImpl.logger.error(sCodigoError, e);

			throw new Ab61Exception(sCodigoError, appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
					appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));
		}

	}

	private TTask aportarDocumentosPlatea(RelExpPla relexppla, String folderId, String procedureId, String n38Login,
			String usuario, boolean variosDocumentos) throws Ab61Exception {
		String taskId = "";

		taskId = relexppla.getPlantilla().getTiposPlantilla().getTaskId();

		try {
			String strGUID = this.getXMLGetTasks(folderId, taskId);

			ObjectFactory objectFactory = new ObjectFactory();
			AExtensionPoint ep = objectFactory.createAExtensionPoint();

			// Si no existe la tarea en Tramitagune, la intentamos generar.
			if (strGUID == null || "".equals(strGUID)) {
				ServiciosWebServiceImpl.logger.info("Tarea adjuntar_docu_subsana NO esta sugerida ");
				TPersonIDName senderId = new TPersonIDName();

				senderId.setID(usuario);
				senderId.setName(usuario);

				TBoolean correcto = TBoolean.FALSE;
				try {
					correcto = this.x43TareasTramitacionAdaptadorService.prepareNewTask(procedureId, folderId,
							relexppla.getPlantilla().getTiposPlantilla().getProceedingId(), taskId, senderId, ep);
				} catch (Exception e) {
					String sCodigoError = "error.PrepareNewTaskAporDocu";

					ServiciosWebServiceImpl.logger.error(sCodigoError, e);

					throw new Ab61Exception(sCodigoError,
							appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
							appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));
				}

				if (TBoolean.TRUE.equals(correcto)) {
					ServiciosWebServiceImpl.logger.info("INICIO de invocacion al servicio assignTasks");

					strGUID = this.getXMLGetTasks(folderId, taskId);

					TStringList taskList = new TStringList();
					taskList.getItem().add(strGUID);
					this.x43TareasTramitacionAdaptadorService.assignTasks(taskList, n38Login, ep);
					ServiciosWebServiceImpl.logger.info("FIN de la invocación al servicio assignTasks");
				} else {
					String sCodigoError = "error.AssignTasks";

					ServiciosWebServiceImpl.logger.error(sCodigoError);

					throw new Ab61Exception(sCodigoError,
							appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
							appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));
				}
			}

			// Poner el documento en el PIF en la ruta r02g/ab61/
			String rutaR02G = null;
			if (!variosDocumentos) {
				try {
					String rutaTo = "/" + Constantes.CODIGO_APLICACION_TAREAS_TRAMITACION + "/"
							+ Constantes.CODIGO_APLICACION + "/" + FilenameUtils.getName(relexppla.getRuta());
					rutaR02G = pifAdapterService.copyFile(relexppla.getRuta(), rutaTo, false).getFilePath();
				} catch (Exception e) {
					ServiciosWebServiceImpl.logger.info("No se ha ejecutado correctamente el método copyFile");
					this.relExpPlaDao.remove(relexppla);

					String sCodigoError = "error.noExisteFicheroPIF";

					throw new Ab61Exception(sCodigoError,
							appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
							appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));
				}
			} else {
				rutaR02G = relexppla.getRuta();
			}
			String timestampActual = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss").format(new Date());

			TTaskType tipoTarea = TTaskType.fromValue(relexppla.getPlantilla().getTiposPlantilla().getTaskType());
			TTask tarea = new TTask();
			try {
				ServiciosWebServiceImpl.logger.info("Incio del prepareTask");
				tarea = this.x43TareasTramitacionAdaptadorService.prepareTask(tipoTarea, strGUID, null);
				ServiciosWebServiceImpl.logger.info("Fin del prepareTask");
			} catch (Exception e) {
				ServiciosWebServiceImpl.logger.info("No se ha ejecutado correctamente la tarea prepareTask");

				String sCodigoError = "error.PrepareTaskAporDocu";

				throw new Ab61Exception(sCodigoError, appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
						appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));

			}

			// DOCUMENT
			ServiciosWebServiceImpl.logger.info("Añadiendo el documentos del subsanacion del PIF");
			TTaskInfoDocument document = new TTaskInfoDocument();
			document.setDocumentPath(rutaR02G);
			document.setTitle(relexppla.getPlantilla().getTiposPlantilla().getTitle());
			document.setLanguage(TLanguage.ES);
			document.setValidDate(timestampActual);
			document.setAuthor(usuario + " (" + Constantes.CODIGO_APLICACION + ")");
			document.setDocumentDate(timestampActual);
			document.setDocumentRoleID(relexppla.getPlantilla().getTiposPlantilla().getDocumentroleId());

			TTextI18N documentRoleName = new com.ejie.ab61.clientesWS.X43TareasTramitacion.TTextI18N();
			TStringI18N rolCastellano = new TStringI18N();
			rolCastellano.setLocale(com.ejie.ab61.clientesWS.X43TareasTramitacion.TLanguage.ES);
			rolCastellano.setValue(relexppla.getPlantilla().getTiposPlantilla().getDocumentroleNameCas());
			documentRoleName.getText().add(0, rolCastellano);
			TStringI18N rolEuskera = new TStringI18N();
			rolEuskera.setLocale(com.ejie.ab61.clientesWS.X43TareasTramitacion.TLanguage.EU);
			rolEuskera.setValue(relexppla.getPlantilla().getTiposPlantilla().getDocumentroleNameEus());

			documentRoleName.getText().add(0, rolEuskera);
			document.setDocumentRoleName(documentRoleName);
			document.setSourceName(FilenameUtils.getName(relexppla.getRuta()));
			document.setExtension(FilenameUtils.getExtension(relexppla.getRuta()));
			document.setNature(TDocNatureType.ELECTRONICO);
			document.setFormat(TDocFormatType.ELECTRONICO);
			TPersonIDName tPersonIDName = new TPersonIDName();
			tPersonIDName.setID(usuario);
			tPersonIDName.setName(usuario);
			document.setSenderID(tPersonIDName);

			tarea.getTaskAdjuntarDoc().getTaskDocument().getDocumentList().getDocument().add(document);
			tarea.setMailboxID(n38Login);
			tarea.setObservations(new TTextI18N());
			tarea.setNotes("");

			tarea.setSenderID(tPersonIDName);

			TTask tTaskRespuesta = new TTask();

			try {
				ServiciosWebServiceImpl.logger.info("Antes de invocar al servicio doTask");
				tTaskRespuesta = this.x43TareasTramitacionAdaptadorService.doTask(tipoTarea, tarea, ep);

				ServiciosWebServiceImpl.logger.info("Despues de invocar al servicio doTask");
			} catch (Exception e) {
				ServiciosWebServiceImpl.logger.info("No se ha ejecutado correctamente la tarea doTask");

				String sCodigoError = "error.DoTaskAporDocu";

				throw new Ab61Exception(sCodigoError, appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
						appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));

			}

			if (!variosDocumentos) {
				// Borramos el documento de la tabla AB6133T00
				try {
					this.relExpPlaDao.remove(relexppla);
				} catch (Exception e) {

					String sCodigoError = "error.SQLBorrado";

					ServiciosWebServiceImpl.logger.error(sCodigoError, e);

					throw new Ab61Exception(sCodigoError,
							appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
							appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));
				}
			}
			// Borramos del PIF
			try {
				pifAdapterService.deleteFile(relexppla.getRuta());
			} catch (Exception e) {
				ServiciosWebServiceImpl.logger
						.info("Error al borrar el documento del PIF - ruta:" + relexppla.getRuta());

				String sCodigoError = "error.DeleteFile";

				ServiciosWebServiceImpl.logger.error(sCodigoError, e);
			}

			// Borramos del buzon
			try {
				pifAdapterService.deleteFile("/user/" + usuario.toLowerCase() + Constantes.CARPETA_COPIA_BUZON_PIF
						+ FilenameUtils.getName(relexppla.getRuta()));

			} catch (Exception e) {
				ServiciosWebServiceImpl.logger
						.error("Error al borrar el documento del buzon - ruta:" + "/user/" + usuario.toLowerCase()
								+ Constantes.CARPETA_COPIA_BUZON_PIF + FilenameUtils.getName(relexppla.getRuta()));

				String sCodigoError = "error.DeleteFile";

				ServiciosWebServiceImpl.logger.error(sCodigoError, e);

			}

			return tTaskRespuesta;

		} catch (IOException e) {

			String sCodigoError = "error.IOException";

			ServiciosWebServiceImpl.logger.error("aportarDocumento - " + sCodigoError, e);

			throw new Ab61Exception(sCodigoError, appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
					appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));

		} catch (NumberFormatException e) {

			String sCodigoError = "error.NumberFormatException";

			ServiciosWebServiceImpl.logger.error("aportarDocumento - " + sCodigoError, e);

			throw new Ab61Exception(sCodigoError, appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
					appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));

		} catch (Ab61Exception e) {

			throw e;

		} catch (Exception e) {

			String sCodigoError = "error.No_controlado";

			ServiciosWebServiceImpl.logger.error("aportarDocumento - " + sCodigoError, e);

			throw new Ab61Exception(sCodigoError, appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
					appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));
		}

	}

	@Override
	public String descargarDocumentoDokusi(String oidDokusi, String aplicacion, Integer tipoUrl)
			throws Ab61Exception, PifException {

		String pathPif = "";

		try {
			pathPif = this.t65bDokusiAdaptadorService.retrieveDocumentAplicacion(oidDokusi, aplicacion);
		} catch (Exception e) {
			String sCodigoError = "error.No_controlado";

			ServiciosWebServiceImpl.logger.error("descargarDocumentoDokusi - " + sCodigoError, e);

			throw new Ab61Exception(sCodigoError, appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
					appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));
		}

		if (tipoUrl != null && tipoUrl == Constantes.TIPO_URL_COMPLETA) {
			return this.pifAdapterService.getCompleteUrl(pathPif, aplicacion.toUpperCase());
		} else {
			return pathPif;
		}

	}

	@Override
	public String descargarDocumentoPid(String oidPid, String aplicacion, Integer tipoUrl)
			throws Ab61Exception, PifException {

		Documento documentoResultado = new Documento();
		Documento documento = new Documento();
		documento.setIdPID(oidPid);
		documento.setPathPIF("/" + aplicacion);
		documento.setTipologia(Tipologia.INICIATIVA_TURISMO);

		try {
			documentoResultado = this.pidAdapterService.recuperarDocumento(documento);
		} catch (Exception e) {
			String sCodigoError = "error.No_controlado";

			ServiciosWebServiceImpl.logger.error("decargarDocumentoPid - " + sCodigoError, e);

			throw new Ab61Exception(sCodigoError, appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
					appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));
		}

		if (tipoUrl != null && tipoUrl == Constantes.TIPO_URL_COMPLETA) {
			return this.pifAdapterService.getCompleteUrl(documentoResultado.getPathPIF(), aplicacion.toUpperCase());
		} else {
			return documentoResultado.getPathPIF();
		}

	}

	@Override
	public void eliminarDocumentoPid(String oidPid) throws Ab61Exception {
		try {
			this.pidAdapterService.eliminarDocumento(oidPid);

			// Eliminamos el registro de AB6152T00
			this.documentosPidService.removeByOidPid(oidPid);
		} catch (Exception e) {
			String sCodigoError = "error.No_controlado";

			ServiciosWebServiceImpl.logger.error("eliminarDocumentoPid - " + sCodigoError, e);

			throw new Ab61Exception(sCodigoError, appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
					appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));
		}
	}

	@Override
	public IdentificadoresPid insertarDocumentoPid(String pathPif, String fileName, Integer idTipoPlantilla,
			String nombreDocumento, Integer aportadoExpediente, String aplicacion, String usuario)
			throws Ab61Exception {

		String oidPid = "";
		Documento documento = new Documento();
		IdentificadoresPid identificadoresPid = new IdentificadoresPid();

		try {
			documento.setTipologia(Tipologia.INICIATIVA_TURISMO);
			documento.setNombre(FilenameUtils.getName(fileName));
			documento.setPathPIF(pathPif);
			Map<String, ArrayList<String>> metadatos = new HashMap<String, ArrayList<String>>();
			ArrayList<String> valorAplicacion = new ArrayList<String>();
			valorAplicacion.add("Aplicacion: " + aplicacion);
			metadatos.put("keywords", valorAplicacion);
			documento.setMetadatos(metadatos);
			oidPid = this.pidAdapterService.insertarDocumento(documento);

			Date fechaAportadoPid = new Date();
			DocumentosPid documentoPid = new DocumentosPid();
			documentoPid.setIdTipoPlantilla(idTipoPlantilla);
			documentoPid.setNombreDocumento(nombreDocumento);
			documentoPid.setOidPid(oidPid);
			documentoPid.setFechaAportadoPid(fechaAportadoPid);
			documentoPid.setOidDokusi(null);
			if (Constantes.APORTADO_EXPEDIENTE_NO == aportadoExpediente) {
				documentoPid.setAportadoExpediente(Constantes.APORTADO_EXPEDIENTE_NO);
			} else if (Constantes.APORTADO_EXPEDIENTE_NO_APORTAR == aportadoExpediente) {
				documentoPid.setAportadoExpediente(Constantes.APORTADO_EXPEDIENTE_NO_APORTAR);
			}

			if (usuario != null && !"".equals(usuario)) {
				documentoPid.setUsuarioRegistro(usuario);
			} else {
				documentoPid.setUsuarioRegistro(aplicacion.toUpperCase());
			}

			DocumentosPid documentoPidAux = this.documentosPidService.add(documentoPid);

			identificadoresPid.setIdDocumentoPid(documentoPidAux.getIdDocumentoPid());
			identificadoresPid.setOidPid(oidPid);

		} catch (Exception e) {
			String sCodigoError = "error.No_controlado";

			ServiciosWebServiceImpl.logger.error("insertarDocumentoPid - " + sCodigoError, e);

			throw new Ab61Exception(sCodigoError, appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
					appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));
		}

		return identificadoresPid;
	}

	@Override
	public String calcularFechaVencimiento(String periodo, Integer cantidad, String fechaInicio) throws Ab61Exception {

		boolean errorParametros = false;
		Date fechaFinDate = new Date();
		String fechaFin = "";
		String sCodigoError = "";

		if (null == periodo || "".equals(periodo)) {
			sCodigoError = "calcularFechaVencimiento.obligatorio.periodo";
			errorParametros = true;
			throw new Ab61Exception(sCodigoError, appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
					appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));
		} else if (null == cantidad || "".equals(cantidad)) {
			sCodigoError = "calcularFechaVencimiento.obligatorio.cantidad";
			errorParametros = true;
			throw new Ab61Exception(sCodigoError, appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
					appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));
		} else if (null == fechaInicio || "".equals(fechaInicio)) {
			sCodigoError = "calcularFechaVencimiento.obligatorio.fechaInicio";
			errorParametros = true;
			throw new Ab61Exception(sCodigoError, appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
					appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));
		} else if (!Constantes.INICIAL_ANYO.equalsIgnoreCase(periodo)
				&& !Constantes.INICIAL_MES.equalsIgnoreCase(periodo)
				&& !Constantes.INICIAL_DIA.equalsIgnoreCase(periodo)) {
			sCodigoError = "calcularFechaVencimiento.periodoIncorrecto";
			errorParametros = true;
			throw new Ab61Exception(sCodigoError, appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
					appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));
		} else if (!fechaInicio.matches("([0-9]{2})/([0-9]{2})/([0-9]{4})")
				&& !fechaInicio.matches("([0-9]{4})/([0-9]{2})/([0-9]{2})")) {
			sCodigoError = "calcularFechaVencimiento.fechaInicioIncorrecta";
			errorParametros = true;
			throw new Ab61Exception(sCodigoError, appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
					appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));
		}

		try {

			if (fechaInicio.matches("([0-9]{2})/([0-9]{2})/([0-9]{4})")) {

				DateFormat sourceFormat = new SimpleDateFormat(Constantes.FORMATO_FECHA_ES);
				Date fechaInicioDate = sourceFormat.parse(fechaInicio);

				if (Constantes.INICIAL_DIA.equalsIgnoreCase(periodo)) {
					Calendar cal = Calendar.getInstance();
					cal.setTime(fechaInicioDate);
					cal.add(Calendar.DATE, cantidad);
					fechaFinDate = cal.getTime();
					fechaFin = sourceFormat.format(fechaFinDate);
				} else if (Constantes.INICIAL_MES.equalsIgnoreCase(periodo)) {
					Calendar cal = Calendar.getInstance();
					cal.setTime(fechaInicioDate);
					cal.add(Calendar.MONTH, cantidad);
					fechaFinDate = cal.getTime();
					fechaFin = sourceFormat.format(fechaFinDate);
				} else if (Constantes.INICIAL_ANYO.equalsIgnoreCase(periodo)) {
					Calendar cal = Calendar.getInstance();
					cal.setTime(fechaInicioDate);
					cal.add(Calendar.YEAR, cantidad);
					fechaFinDate = cal.getTime();
					fechaFin = sourceFormat.format(fechaFinDate);
				}
			} else {

				DateFormat sourceFormat = new SimpleDateFormat(Constantes.FORMATO_FECHA_EU);
				Date fechaInicioDate = sourceFormat.parse(fechaInicio);

				if (Constantes.INICIAL_DIA.equalsIgnoreCase(periodo)) {
					Calendar cal = Calendar.getInstance();
					cal.setTime(fechaInicioDate);
					cal.add(Calendar.DATE, cantidad);
					fechaFinDate = cal.getTime();
					fechaFin = sourceFormat.format(fechaFinDate);
				} else if (Constantes.INICIAL_MES.equalsIgnoreCase(periodo)) {
					Calendar cal = Calendar.getInstance();
					cal.setTime(fechaInicioDate);
					cal.add(Calendar.MONTH, cantidad);
					fechaFinDate = cal.getTime();
					fechaFin = sourceFormat.format(fechaFinDate);
				} else if (Constantes.INICIAL_ANYO.equalsIgnoreCase(periodo)) {
					Calendar cal = Calendar.getInstance();
					cal.setTime(fechaInicioDate);
					cal.add(Calendar.YEAR, cantidad);
					fechaFinDate = cal.getTime();
					fechaFin = sourceFormat.format(fechaFinDate);
				}
			}

		} catch (Exception e) {

			if (!errorParametros) {
				sCodigoError = "error.No_controlado";
			}

			ServiciosWebServiceImpl.logger.error("calcularFechaVencimiento - " + sCodigoError, e);

			throw new Ab61Exception(sCodigoError, appMessageSource.getMessage(sCodigoError, null, new Locale("es")),
					appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));
		}

		return fechaFin;

	}

}