PageRenderTime 59ms CodeModel.GetById 29ms app.highlight 25ms RepoModel.GetById 1ms app.codeStats 0ms

/fap/app/controllers/PaginaNotificarResolucionController.java

https://github.com/FAP-Team/Fap-Module
Java | 485 lines | 408 code | 63 blank | 14 comment | 69 complexity | 43a9f79ac41634a3d529a6431c801c62 MD5 | raw file
  1package controllers;
  2
  3import java.io.InputStream;
  4import java.util.ArrayList;
  5import java.util.List;
  6import java.util.Map;
  7
  8import javax.persistence.EntityTransaction;
  9import javax.xml.ws.soap.SOAPFaultException;
 10
 11import messages.Messages;
 12import models.Agente;
 13import models.Documento;
 14import models.Firma;
 15import models.LineaResolucionFAP;
 16import models.ResolucionFAP;
 17import models.SolicitudGenerica;
 18import models.ResolucionFAP;
 19
 20
 21import org.joda.time.DateTime;
 22
 23import play.db.jpa.JPA;
 24import play.mvc.Util;
 25import properties.FapProperties;
 26import resolucion.ResolucionBase;
 27import services.GestorDocumentalService;
 28import services.GestorDocumentalServiceException;
 29import services.PortafirmaFapService;
 30import services.PortafirmaFapServiceException;
 31import services.RegistroService;
 32import services.BDOrganizacion.PlatinoBDOrganizacionServiceImpl;
 33import services.platino.PlatinoGestorDocumentalService;
 34import services.responses.PortafirmaCrearSolicitudResponse;
 35import tags.ComboItem;
 36import utils.AedUtils;
 37import utils.ComboUtils;
 38import utils.ResolucionUtils;
 39import validation.CustomValidation;
 40import config.InjectorConfig;
 41import controllers.fap.AgenteController;
 42import controllers.fap.ResolucionControllerFAP;
 43import controllers.gen.PaginaNotificarResolucionControllerGen;
 44import enumerado.fap.gen.EstadoResolucionNotificacionEnum;
 45import es.gobcan.aciisi.portafirma.ws.dominio.PrioridadEnumType;
 46import es.gobcan.aciisi.portafirma.ws.dominio.TipoSolicitudEnumType;
 47import es.gobcan.platino.servicios.organizacion.DBOrganizacionException_Exception;
 48
 49public class PaginaNotificarResolucionController extends PaginaNotificarResolucionControllerGen {
 50	
 51	public static void index(String accion, Long idResolucionFAP) {
 52		if (accion == null)
 53			accion = getAccion();
 54		if (!permiso(accion)) {
 55			Messages.fatal("No tiene permisos suficientes para realizar esta acción");
 56			renderTemplate("fap/PaginaNotificarResolucion/PaginaNotificarResolucion.html");
 57		}
 58
 59		ResolucionFAP resolucionFAP = null;
 60		if ("crear".equals(accion)) {
 61			resolucionFAP = PaginaNotificarResolucionController.getResolucionFAP();
 62			if (properties.FapProperties.getBoolean("fap.entidades.guardar.antes")) {
 63
 64				resolucionFAP.save();
 65				idResolucionFAP = resolucionFAP.id;
 66
 67				accion = "editar";
 68			}
 69
 70		} else if (!"borrado".equals(accion))
 71			resolucionFAP = PaginaNotificarResolucionController.getResolucionFAP(idResolucionFAP);
 72
 73		log.info("Visitando página: " + "fap/PaginaNotificarResolucion/PaginaNotificarResolucion.html" + ", usuario: " + AgenteController.getAgente().name + " Resolución: " + idResolucionFAP);
 74		renderTemplate("fap/PaginaNotificarResolucion/PaginaNotificarResolucion.html", accion, idResolucionFAP, resolucionFAP);
 75	}
 76
 77	
 78	@Util
 79	// Este @Util es necesario porque en determinadas circunstancias crear(..) llama a editar(..).
 80	public static void formGenerarOficioRemision(Long idResolucionFAP, ResolucionFAP resolucionFAP, String botonGenerarOficioRemision) {
 81		checkAuthenticity();
 82		if (!permisoFormGenerarOficioRemision("editar")) {
 83			Messages.error("No tiene permisos suficientes para realizar la acción");
 84		}
 85		ResolucionFAP dbResolucionFAP = PaginaNotificarResolucionController.getResolucionFAP(idResolucionFAP);
 86
 87		PaginaNotificarResolucionController.formGenerarOficioRemisionBindReferences(resolucionFAP);
 88
 89		if (!Messages.hasErrors()) {
 90			PaginaNotificarResolucionController.formGenerarOficioRemisionValidateCopy("editar", dbResolucionFAP, resolucionFAP);
 91		}
 92		ResolucionBase resolBase = null;
 93		
 94		if (!Messages.hasErrors()) {
 95			try {
 96				resolBase = ResolucionControllerFAP.invoke(ResolucionControllerFAP.class, "getResolucionObject", idResolucionFAP);
 97				resolBase.generarOficioRemision(idResolucionFAP);
 98			} catch (Throwable e) {
 99				Messages.error("Error generando los oficios de remisión");
100				play.Logger.error("Error generando los oficios de remisión: "+e.getMessage());
101				new Exception ("Error generando los de oficios de remisión", e);
102			}
103		} 
104
105		if (!Messages.hasErrors()) {
106			PaginaNotificarResolucionController.formGenerarOficioRemisionValidateRules(dbResolucionFAP, resolucionFAP);
107		}
108		if (!Messages.hasErrors()) {
109			dbResolucionFAP.save();
110			Messages.ok("Se ha generado el documento de oficios de remisón satisfactoriamente");
111			log.info("Acción Editar de página: " + "gen/PaginaNotificarResolucion/PaginaNotificarResolucion.html" + " , intentada con éxito");
112		} else
113			log.info("Acción Editar de página: " + "gen/PaginaNotificarResolucion/PaginaNotificarResolucion.html" + " , intentada sin éxito (Problemas de Validación)");
114		PaginaNotificarResolucionController.formGenerarOficioRemisionRender(idResolucionFAP);
115	}
116
117	@Util
118	// Este @Util es necesario porque en determinadas circunstancias crear(..) llama a editar(..).
119	public static boolean notificar(Long idResolucionFAP, int fapNotificacionPlazoacceso, int fapNotificacionFrecuenciarecordatorioacceso, int fapNotificacionPlazorespuesta, int fapNotificacionFrecuenciarecordatoriorespuesta) {
120
121		ResolucionBase resolBase = null;
122		boolean notificada = false;
123		try {
124			resolBase = ResolucionControllerFAP.invoke(ResolucionControllerFAP.class, "getResolucionObject", idResolucionFAP);
125			notificada = resolBase.notificarCopiarEnExpedientes(idResolucionFAP, fapNotificacionPlazoacceso, fapNotificacionFrecuenciarecordatorioacceso, fapNotificacionPlazorespuesta, fapNotificacionFrecuenciarecordatoriorespuesta);
126		} catch (Throwable e) {
127			Messages.error("Ha ocurrido un error en el proceso de notificación");
128			play.Logger.error("Ha ocurrido un error en el proceso de notificación: "+e.getMessage());
129			new Exception ("Ha ocurrido un error en el proceso de notificación", e);
130		}
131		
132		if (!Messages.hasErrors())
133			Messages.ok("El proceso de notificación se ha realizado satisfactoriamente");
134		Messages.keep();
135
136		return notificada;
137	}
138
139	
140	@Util
141	// Este @Util es necesario porque en determinadas circunstancias crear(..) llama a editar(..).
142	public static void formVolver(Long idResolucionFAP) {
143		checkAuthenticity();
144		if (!permisoFormVolver("editar")) {
145			Messages.error("No tiene permisos suficientes para realizar la acción");
146		}
147
148		if (!Messages.hasErrors()) {
149
150		}
151
152		if (!Messages.hasErrors()) {
153			PaginaNotificarResolucionController.formVolverValidateRules();
154		}
155		if (!Messages.hasErrors()) {
156
157			log.info("Acción Editar de página: " + "fap/PaginaNotificarResolucion/PaginaNotificarResolucion.html" + " , intentada con éxito" + ", usuario: " + AgenteController.getAgente().name + " Resolución: " + idResolucionFAP);
158		} else
159			log.info("Acción Editar de página: " + "fap/PaginaNotificarResolucion/PaginaNotificarResolucion.html" + " , intentada sin éxito (Problemas de Validación)");
160		PaginaNotificarResolucionController.formVolverRender(idResolucionFAP);
161	}
162	
163	@Util
164	// Este @Util es necesario porque en determinadas circunstancias crear(..) llama a editar(..).
165	public static void formEnviarOficiosRemisionPortaFirma(Long idResolucionFAP, ResolucionFAP resolucionFAP, String botonEnviarOficiosRemisionPortaFirma) {
166		checkAuthenticity();
167		if (!permisoFormEnviarOficiosRemisionPortaFirma("editar")) {
168			Messages.error("No tiene permisos suficientes para realizar la acción");
169		}
170		ResolucionFAP dbResolucionFAP = PaginaNotificarResolucionController.getResolucionFAP(idResolucionFAP);
171		ResolucionUtils.actualizarSolicitudesFirmaPortafirmaAntiguasResolucion(dbResolucionFAP);
172		
173		PaginaNotificarResolucionController.formEnviarOficiosRemisionPortaFirmaBindReferences(resolucionFAP);
174
175		Agente agenteActual = AgenteController.getAgente();
176		
177		if (!Messages.hasErrors()) {
178			resolucionFAP.solicitudFirmaPortafirmaOficioRemision.idSolicitante = agenteActual.usuarioldap;
179			PaginaNotificarResolucionController.formEnviarOficiosRemisionPortaFirmaValidateCopy("editar", dbResolucionFAP, resolucionFAP);
180
181			if (!Messages.hasErrors()) {
182				if (properties.FapProperties.getBoolean("fap.platino.portafirma")) {
183					PlatinoBDOrganizacionServiceImpl platinoDBOrgPort = InjectorConfig.getInjector().getInstance(PlatinoBDOrganizacionServiceImpl.class);
184					try {
185						dbResolucionFAP.solicitudFirmaPortafirmaOficioRemision.uriFuncionarioSolicitante = platinoDBOrgPort.recuperarURIPersona(dbResolucionFAP.solicitudFirmaPortafirmaOficioRemision.idSolicitante);
186					} catch (DBOrganizacionException_Exception e) {
187						play.Logger.error("Error al obtener la uri del funcionario solicitante en la Base de Datos de Organización: " + e.getMessage());
188						Messages.error("Error al obtener la uri del funcionario solicitante en la Base de Datos de Organización.");
189					}
190					if ((dbResolucionFAP.solicitudFirmaPortafirmaOficioRemision.uriFuncionarioSolicitante == null) || (dbResolucionFAP.solicitudFirmaPortafirmaOficioRemision.uriFuncionarioSolicitante.isEmpty()))
191						Messages.error("El usuario "+dbResolucionFAP.solicitudFirmaPortafirmaOficioRemision.idSolicitante+" especificado no se encuentra en la Base de Datos de Organización.");
192				}
193			}
194		}
195
196		if (!Messages.hasErrors()) {
197			PaginaNotificarResolucionController.formEnviarOficiosRemisionPortaFirmaValidateRules(dbResolucionFAP, resolucionFAP);
198		}
199		
200		if (!Messages.hasErrors()) {
201			
202			dbResolucionFAP.solicitudFirmaPortafirmaOficioRemision.tema = "Oficios de remisión";
203			dbResolucionFAP.solicitudFirmaPortafirmaOficioRemision.materia = "Se firmarán los oficios de remisión de la resolución "+idResolucionFAP;
204			dbResolucionFAP.solicitudFirmaPortafirmaOficioRemision.tipoSolicitud = TipoSolicitudEnumType.OTROS.value();
205			dbResolucionFAP.solicitudFirmaPortafirmaOficioRemision.prioridad = PrioridadEnumType.NORMAL.value();
206			dbResolucionFAP.solicitudFirmaPortafirmaOficioRemision.tipoDocumento = "SOL";
207			dbResolucionFAP.solicitudFirmaPortafirmaOficioRemision.emailNotificacion = agenteActual.email;
208			if (dbResolucionFAP.solicitudFirmaPortafirmaOficioRemision.agenteHaceSolicitud == null)
209				dbResolucionFAP.solicitudFirmaPortafirmaOficioRemision.agenteHaceSolicitud = new Agente();
210			dbResolucionFAP.solicitudFirmaPortafirmaOficioRemision.agenteHaceSolicitud = agenteActual;
211			for (LineaResolucionFAP linea: dbResolucionFAP.lineasResolucion) {
212				if (!linea.registro.fasesRegistro.firmada) {
213					Documento documento = new Documento();
214					documento.uri = linea.registro.oficial.uri;
215					documento.descripcion = linea.registro.oficial.descripcionVisible;
216					dbResolucionFAP.solicitudFirmaPortafirmaOficioRemision.documentosFirma.add(documento);
217				}
218			}
219			dbResolucionFAP.save();
220			try {
221				PortafirmaFapService portafirmaService = InjectorConfig.getInjector().getInstance(PortafirmaFapService.class);
222				PortafirmaCrearSolicitudResponse portafirmaCrearSolicitudResponse = portafirmaService.crearSolicitudFirma(dbResolucionFAP.solicitudFirmaPortafirmaOficioRemision);
223                portafirmaService.entregarSolicitudFirma(dbResolucionFAP.solicitudFirmaPortafirma.idSolicitante, portafirmaCrearSolicitudResponse.getIdSolicitud(), portafirmaCrearSolicitudResponse.getComentarios());
224				dbResolucionFAP.solicitudFirmaPortafirmaOficioRemision.uriSolicitud = portafirmaCrearSolicitudResponse.getIdSolicitud();
225				dbResolucionFAP.solicitudFirmaPortafirmaOficioRemision.solicitudEstadoComentario = portafirmaCrearSolicitudResponse.getComentarios();
226				dbResolucionFAP.estadoNotificacion = EstadoResolucionNotificacionEnum.oficiosRemisionPendientesPortafirma.name();
227				dbResolucionFAP.save();
228				Messages.ok("Se ha enviado correctamente al portafirma la solicitud de la firma");
229			} catch (PortafirmaFapServiceException e) {
230				play.Logger.error("Error al crear la solicitud de firma: " + e);
231				Messages.error("Error al crear la solicitud de firma");
232			} catch (SOAPFaultException e) {
233				play.Logger.error("Error al crear la solicitud de firma: " + e);
234				Messages.error("Error al crear la solicitud de firma");
235			}
236		}
237		
238		if (!Messages.hasErrors()) {
239			dbResolucionFAP.save();
240			log.info("Acción Editar de página: " + "gen/PaginaNotificarResolucion/PaginaNotificarResolucion.html" + " , intentada con éxito" + ", usuario: " + AgenteController.getAgente().name + " Resolución: " + idResolucionFAP);
241		} else
242			log.info("Acción Editar de página: " + "gen/PaginaNotificarResolucion/PaginaNotificarResolucion.html" + " , intentada sin éxito (Problemas de Validación)");
243		PaginaNotificarResolucionController.formEnviarOficiosRemisionPortaFirmaRender(idResolucionFAP);
244	}
245	
246	@Util
247	public static void formEnviarOficiosRemisionPortaFirmaValidateCopy(String accion, ResolucionFAP dbResolucionFAP, ResolucionFAP resolucionFAP) {
248		CustomValidation.clearValidadas();
249
250		if (secure.checkGrafico("permisoEnviarOficiosRemisionPortafirma", "editable", accion, (Map<String, Long>) tags.TagMapStack.top("idParams"), null)) {
251			CustomValidation.valid("resolucionFAP.solicitudFirmaPortafirmaOficioRemision", resolucionFAP.solicitudFirmaPortafirmaOficioRemision);
252			CustomValidation.valid("resolucionFAP", resolucionFAP);
253			CustomValidation.required("resolucionFAP.solicitudFirmaPortafirmaOficioRemision.idDestinatario", resolucionFAP.solicitudFirmaPortafirmaOficioRemision.idDestinatario);
254			CustomValidation.validValueFromTable("resolucionFAP.solicitudFirmaPortafirmaOficioRemision.idDestinatario", resolucionFAP.solicitudFirmaPortafirmaOficioRemision.idDestinatario);
255			dbResolucionFAP.solicitudFirmaPortafirmaOficioRemision = resolucionFAP.solicitudFirmaPortafirmaOficioRemision;
256			dbResolucionFAP.solicitudFirmaPortafirmaOficioRemision.idDestinatario = resolucionFAP.solicitudFirmaPortafirmaOficioRemision.idDestinatario;
257			
258			if (properties.FapProperties.getBoolean("fap.platino.portafirma")) {
259				if (resolucionFAP.solicitudFirmaPortafirmaOficioRemision.idSolicitante == null){
260					Messages.error("El usuario no tiene asociado un identificador único en el ldap del gobierno.");
261					play.Logger.error("El usuario no tiene asociado un identificador único en el ldap del gobierno.");
262				} else
263					dbResolucionFAP.solicitudFirmaPortafirmaOficioRemision.idSolicitante = resolucionFAP.solicitudFirmaPortafirmaOficioRemision.idSolicitante;
264			}
265			else {
266				dbResolucionFAP.solicitudFirmaPortafirmaOficioRemision.idSolicitante = FapProperties.get("portafirma.usuario");
267			}
268		}
269
270		if (dbResolucionFAP.solicitudFirmaPortafirmaOficioRemision.plazoMaximo != null) {
271			DateTime today = new DateTime().withTimeAtStartOfDay();
272			if (dbResolucionFAP.solicitudFirmaPortafirmaOficioRemision.plazoMaximo.isBefore(today)) {
273				play.Logger.error("La fecha tope de firma no puede ser anterior a hoy.");
274				CustomValidation.error("La fecha tope de firma no puede ser anterior a hoy.","resolucionFAP.solicitudFirmaPortafirmaOficioRemision.plazoMaximo", resolucionFAP.solicitudFirmaPortafirmaOficioRemision.plazoMaximo);
275			}
276			int dias = 0;
277			try {
278				dias = ResolucionControllerFAP.invoke(ResolucionControllerFAP.class, "getDiasLimiteFirma", dbResolucionFAP.id, true);
279				//Si hay un plazo límite, se calcula si la fecha seleccionada está dentro del rango 
280				if (dias != -1) {
281					//Es requerido sólo si existe la property y tiene valor
282					CustomValidation.required("resolucionFAP.solicitudFirmaPortafirmaOficioRemision.plazoMaximo", resolucionFAP.solicitudFirmaPortafirmaOficioRemision.plazoMaximo);
283					dbResolucionFAP.solicitudFirmaPortafirmaOficioRemision.plazoMaximo = resolucionFAP.solicitudFirmaPortafirmaOficioRemision.plazoMaximo;
284					
285					DateTime diaLimite = new DateTime();
286					diaLimite = diaLimite.plusDays(1);	// Por defecto, sólo se permite un día de plazo máximo
287					if (diaLimite.isBefore(dbResolucionFAP.solicitudFirmaPortafirmaOficioRemision.plazoMaximo)) {
288						play.Logger.error("La fecha tope de firma no puede ser posterior a "+diaLimite+".");
289						CustomValidation.error("La fecha tope de firma no puede ser posterior a "+diaLimite+".", "resolucionFAP.solicitudFirmaPortafirmaOficioRemision.plazoMaximo", resolucionFAP.solicitudFirmaPortafirmaOficioRemision.plazoMaximo);					
290					}
291				}
292			} catch (Throwable e) {
293				e.printStackTrace();
294				play.Logger.error("No se ha podido calcular el límite de fecha para la firma."+e);
295				CustomValidation.error("No se ha podido calcular el límite de fecha para la firma", "resolucionFAP.solicitudFirmaPortafirmaOficioRemision.plazoMaximo", resolucionFAP.solicitudFirmaPortafirmaOficioRemision.plazoMaximo);
296			}
297		}
298		
299		dbResolucionFAP.save();
300		
301	}
302	
303	@Util
304	// Este @Util es necesario porque en determinadas circunstancias crear(..) llama a editar(..).
305	public static void formComprobarFirmasOficiosRemisionPortaFirma(Long idResolucionFAP, String botonComprobarFirmasOficiosRemisionPortaFirma) {
306		checkAuthenticity();
307		if (!permisoFormComprobarFirmasOficiosRemisionPortaFirma("editar")) {
308			Messages.error("No tiene permisos suficientes para realizar la acción");
309		}
310
311		if (!Messages.hasErrors()) {
312			ResolucionFAP dbResolucionFAP = PaginaNotificarResolucionController.getResolucionFAP(idResolucionFAP);
313			ResolucionUtils.actualizarSolicitudesFirmaPortafirmaAntiguasResolucion(dbResolucionFAP);
314			try {
315				PortafirmaFapService portafirmaService = InjectorConfig.getInjector().getInstance(PortafirmaFapService.class);
316				if (portafirmaService.comprobarSiSolicitudFirmada(dbResolucionFAP.solicitudFirmaPortafirmaOficioRemision)) {
317					
318					//Se agrega la firma de los oficios de remisión del portafirma del gobierno al AED de la ACIISI
319					for (LineaResolucionFAP linea: dbResolucionFAP.lineasResolucion) {
320						if (!linea.registro.fasesRegistro.firmada) {
321							linea.registro.fasesRegistro.firmada = true;
322							AedUtils.agregarFirma(linea.registro.oficial);
323						}
324					}
325					dbResolucionFAP.estadoNotificacion = EstadoResolucionNotificacionEnum.oficiosRemisionFirmados.name();
326					dbResolucionFAP.save();
327					Messages.ok("Los oficios de remisión de la resolución asociados a la solicitud de firma se han firmado y finalizado correctamente.");
328					play.Logger.info("Los oficios de remisión de la resolución [" + idResolucionFAP + "] asociados a la solicitud de firma se han firmado y finalizado correctamente.");
329				} else {
330					play.Logger.warn("Los oficios de remisión de la resolución ["+dbResolucionFAP.id+"] asociados a la solicitud de firma no han sido firmados y finalizados.");
331					Messages.warning("Los oficios de remisión de la resolución asociados a la solicitud de firma no han sido firmados y finalizados.");
332					String response = portafirmaService.obtenerEstadoFirma(dbResolucionFAP.solicitudFirmaPortafirmaOficioRemision);
333					if (response == null) {
334						throw new PortafirmaFapServiceException("No se pudo obtener el estado de la firma: Response null.");
335					}
336					//TODO: Recuperar comentario del response (que ahora no existe)
337					//play.Logger.info("El estado de la solicitud de firma en el portafirma es: "+response+ ": "+response.getComentario());
338					play.Logger.info("El estado de la solicitud de firma en el portafirma es: "+response);
339					Messages.warning("El estado de la solicitud de firma en el portafirma es: "+response);
340					if (response.equalsIgnoreCase("Rechazada")) {
341						dbResolucionFAP.estadoNotificacion = EstadoResolucionNotificacionEnum.noNotificada.name();
342						dbResolucionFAP.save();
343					}
344				}
345			} catch (PortafirmaFapServiceException e) {
346				play.Logger.error("Error al comprobar si ya se han firmado los oficios de remisión en el portafirma: " + e);
347				Messages.error("Error al comprobar si ya se han firmado los oficios de remisión en el portafirma.");
348			} catch (SOAPFaultException e) {
349				play.Logger.error("Error al comprobar si ya se han firmado los oficios de remisión en el portafirma: " + e);
350				Messages.error("Error al comprobar si ya se han firmado los oficios de remisión en el portafirma.");
351			}
352		}
353
354		if (!Messages.hasErrors()) {
355			PaginaNotificarResolucionController.formComprobarFirmasOficiosRemisionPortaFirmaValidateRules();
356		}
357		if (!Messages.hasErrors()) {
358
359			log.info("Acción Editar de página: " + "gen/PaginaNotificarResolucion/PaginaNotificarResolucion.html" + " , intentada con éxito" + ", usuario: " + AgenteController.getAgente().name + " Resolución: " + idResolucionFAP);
360		} else
361			log.info("Acción Editar de página: " + "gen/PaginaNotificarResolucion/PaginaNotificarResolucion.html" + " , intentada sin éxito (Problemas de Validación)");
362		PaginaNotificarResolucionController.formComprobarFirmasOficiosRemisionPortaFirmaRender(idResolucionFAP);
363	}
364
365	@Util
366	// Este @Util es necesario porque en determinadas circunstancias crear(..) llama a editar(..).
367	public static void formRegistrarOficiosRemision(Long idResolucionFAP, String botonRegistrarOficiosRemision) {
368		checkAuthenticity();
369		if (!permisoFormRegistrarOficiosRemision("editar")) {
370			Messages.error("No tiene permisos suficientes para realizar la acción");
371		}
372
373		RegistroService registroService = InjectorConfig.getInjector().getInstance(RegistroService.class);
374		GestorDocumentalService gestorDocumentalService = InjectorConfig.getInjector().getInstance(GestorDocumentalService.class);
375		
376		try {
377			if (!registroService.isConfigured()){
378				Messages.error("No se tiene acceso al servicio web de registro");
379				play.Logger.info("No se tiene acceso al servicio web de registro, registrando oficios de remision");
380			}
381		} catch (Exception e) {
382			Messages.error("Se ha producido un error de acceso al servicio web de registro");
383			play.Logger.info("Se ha producido un error de acceso al servicio web de registro: " + e.getMessage());
384		}
385		
386		try {
387			if (!gestorDocumentalService.isConfigured()){
388				Messages.error("No se tiene acceso al servicio de archivo electrónico de documentos (AED)");
389				play.Logger.info("No se tiene acceso al servicio de archivo electrónico de documentos (AED)");
390			}
391		} catch (Exception e) {
392			Messages.error("Se ha producido un error de acceso al servico de archivo electrónico de documentos (AED)");
393			play.Logger.info("Se ha producido un error de acceso al servicio de archivo electrónico de documentos (AED): " + e.getMessage());
394		}
395
396		if (!Messages.hasErrors()) {
397			EntityTransaction tx = JPA.em().getTransaction();
398			try  {
399				if (tx.isActive())
400					tx.commit();
401				tx.begin();
402				ResolucionFAP dbResolucionFAP = PaginaNotificarResolucionController.getResolucionFAP(idResolucionFAP);
403				for (LineaResolucionFAP lineaResolucionFAP: dbResolucionFAP.lineasResolucion) {
404					SolicitudGenerica solicitud = SolicitudGenerica.findById(lineaResolucionFAP.solicitud.id);
405					if (!lineaResolucionFAP.registro.fasesRegistro.registro) {
406						play.Logger.info("Se inicia el proceso de registro de salida del oficio de remisión "+lineaResolucionFAP.registro.oficial.uri);
407						// Se obtiene el justificante de registro de salida del oficio de remisión
408						models.JustificanteRegistro justificanteSalida = registroService.registroDeSalida(solicitud.solicitante, lineaResolucionFAP.registro.oficial, solicitud.expedientePlatino, "Oficio de remisión");				
409						lineaResolucionFAP.registro.informacionRegistro.setDataFromJustificante(justificanteSalida);
410						Documento documento = lineaResolucionFAP.registro.justificante;
411						documento.tipo = FapProperties.get("fap.aed.tiposdocumentos.justificanteRegistroSalida");
412						documento.descripcion = "Justificante de registro de salida del oficio de remisión";
413						documento.save();
414						play.Logger.info("Creado el documento "+documento.descripcion+" en local, se procede a almacenar en el AED");
415						InputStream is = justificanteSalida.getDocumento().contenido.getInputStream();
416						gestorDocumentalService.saveDocumentoTemporal(documento, is, "JustificanteOficioRemision" + ".pdf");
417						play.Logger.info(documento.descripcion+" almacenado en el AED");
418						play.Logger.info(documento.uriPlatino);
419						lineaResolucionFAP.registro.fasesRegistro.registro = true;
420	
421						List<Documento> documentos = new ArrayList<Documento>();
422						documentos.add(lineaResolucionFAP.registro.oficial);
423						documentos.add(lineaResolucionFAP.registro.justificante);
424						
425						// Se pone la fecha de registro a los documentos
426						for (Documento doc: documentos) {
427							if (doc.fechaRegistro == null) {
428								doc.fechaRegistro = lineaResolucionFAP.registro.informacionRegistro.fechaRegistro;
429								doc.save();
430							}
431						}
432						play.Logger.info("Se realizó el registro de salida del oficio de remisión correctamente");
433					}
434					if (!lineaResolucionFAP.registro.fasesRegistro.clasificarAed) {
435						List<Documento> documentos = new ArrayList<Documento>();
436						documentos.add(lineaResolucionFAP.registro.oficial);
437						documentos.add(lineaResolucionFAP.registro.justificante);
438						play.Logger.info("Se procede a clasificar los documentos oficio de remisión y justificante de registro de salida del oficio de remisión de la línea: "+lineaResolucionFAP.id);
439						// Se clasifican los documentos
440						gestorDocumentalService.clasificarDocumentos(solicitud, documentos, false);
441						lineaResolucionFAP.registro.fasesRegistro.clasificarAed = true;
442						play.Logger.info("Documentos clasificados");
443						lineaResolucionFAP.save();
444						solicitud.save();
445						play.Logger.info("Se realizó la clasificación correctamente");
446					}
447				}
448				tx.commit();
449			} catch (Throwable e)   {
450				 if ( tx != null && tx.isActive() ) tx.rollback();
451				Messages.error("Se ha producido un error realizando el registro de los oficios de remisión");
452				play.Logger.info("Se ha producido un error realizando el registro de los oficios de remisión: " + e.getMessage());
453			}
454			tx.begin();
455		}
456		
457		if (!Messages.hasErrors()) {
458			PaginaNotificarResolucionController.formRegistrarOficiosRemisionValidateRules();
459		}
460		
461		if (!Messages.hasErrors()) {
462			Messages.ok("El registro de los oficios de remisión se ha realizado satisfactoriamente");
463			log.info("Acción Editar de página: " + "gen/PaginaNotificarResolucion/PaginaNotificarResolucion.html" + " , intentada con éxito" + ", usuario: " + AgenteController.getAgente().name + " Resolución: " + idResolucionFAP);
464		} else
465			log.info("Acción Editar de página: " + "gen/PaginaNotificarResolucion/PaginaNotificarResolucion.html" + " , intentada sin éxito (Problemas de Validación)");
466		PaginaNotificarResolucionController.formRegistrarOficiosRemisionRender(idResolucionFAP);
467	}
468	
469	public static List<ComboItem> selectJefeServicio() {
470		List<ComboItem> listaCombo = new ArrayList<ComboItem>();
471		try {
472			listaCombo = ResolucionControllerFAP.invoke(ResolucionControllerFAP.class, "getJefesServicio");
473		} catch (Throwable e) {
474			Messages.error("No se pudieron obtener los jefes de servicio");
475			play.Logger.error("No se pudieron obtener los jefes de servicio"+e.getMessage());
476		}
477		return listaCombo;
478	}
479
480
481    public static List<ComboItem> gestorAFirmar() {
482        return ComboUtils.gestorAFirmar();
483    }
484
485}