PageRenderTime 70ms CodeModel.GetById 36ms app.highlight 28ms RepoModel.GetById 0ms app.codeStats 0ms

/fap/app/controllers/EditarResolucionController.java

https://github.com/FAP-Team/Fap-Module
Java | 843 lines | 683 code | 113 blank | 47 comment | 116 complexity | 8991e45f4cc0df64f6c7d50402741495 MD5 | raw file
  1package controllers;
  2
  3import java.util.ArrayList;
  4import java.util.Collection;
  5import java.util.HashMap;
  6import java.util.List;
  7import java.util.Map;
  8
  9import javax.persistence.EntityTransaction;
 10import javax.xml.ws.soap.SOAPFaultException;
 11
 12import messages.Messages;
 13import models.Agente;
 14import models.Documento;
 15import models.Firma;
 16import models.LineaResolucionFAP;
 17import models.Registro;
 18import models.ResolucionFAP;
 19import models.SolicitudFirmaPortafirma;
 20import models.SolicitudGenerica;
 21
 22import org.joda.time.DateTime;
 23
 24import com.google.inject.Inject;
 25
 26import platino.FirmaUtils;
 27import play.db.jpa.JPA;
 28import play.modules.guice.InjectSupport;
 29import play.mvc.Util;
 30import properties.FapProperties;
 31import registroresolucion.RegistroResolucion;
 32import reports.Report;
 33import resolucion.ResolucionBase;
 34import services.FirmaServiceException;
 35import services.GestorDocumentalService;
 36import services.GestorDocumentalServiceException;
 37import services.PortafirmaFapService;
 38import services.PortafirmaFapServiceException;
 39import services.RegistroLibroResolucionesService;
 40import services.RegistroLibroResolucionesServiceException;
 41import services.RegistroService;
 42import services.BDOrganizacion.PlatinoBDOrganizacionServiceImpl;
 43import services.platino.PlatinoGestorDocumentalService;
 44import services.responses.PortafirmaCrearSolicitudResponse;
 45import tags.ComboItem;
 46import utils.AedUtils;
 47import utils.ResolucionUtils;
 48import validation.CustomValidation;
 49import config.InjectorConfig;
 50import controllers.fap.AgenteController;
 51import controllers.fap.ResolucionControllerFAP;
 52import controllers.gen.EditarResolucionControllerGen;
 53import emails.Mails;
 54import enumerado.fap.gen.EstadoResolucionEnum;
 55import enumerado.fap.gen.EstadoResolucionPublicacionEnum;
 56import es.gobcan.aciisi.portafirma.ws.dominio.ObtenerEstadoSolicitudResponseType;
 57import es.gobcan.platino.servicios.organizacion.DBOrganizacionException_Exception;
 58
 59@InjectSupport
 60public class EditarResolucionController extends EditarResolucionControllerGen {
 61	
 62	@Util
 63	private static ResolucionBase getResolucionObject (Long idResolucionFAP) throws Throwable {
 64		return ResolucionControllerFAP.invoke(ResolucionControllerFAP.class, "getResolucionObject", idResolucionFAP);
 65	}
 66	
 67	public static void index(String accion, Long idResolucionFAP) {
 68		if (accion == null)
 69			accion = getAccion();
 70		if (!permiso(accion)) {
 71			Messages.fatal("No tiene permisos suficientes para realizar esta acción");
 72			renderTemplate("fap/EditarResolucion/EditarResolucion.html");
 73		}
 74
 75		ResolucionFAP resolucionFAP = null;
 76		if ("crear".equals(accion)) {
 77			resolucionFAP = EditarResolucionController.getResolucionFAP();
 78			if (properties.FapProperties.getBoolean("fap.entidades.guardar.antes")) {
 79
 80				resolucionFAP.save();
 81				idResolucionFAP = resolucionFAP.id;
 82
 83				accion = "editar";
 84			}
 85
 86		} else if (!"borrado".equals(accion))
 87			resolucionFAP = EditarResolucionController.getResolucionFAP(idResolucionFAP);
 88		
 89		//play.mvc.Router.ActionDefinition ad = play.mvc.Router.reverse("EditarResolucion.index");
 90		//ad.absolute();
 91		//System.out.println("url = " + ad.toString());
 92		
 93		log.info("Visitando página: " + "gen/EditarResolucion/EditarResolucion.html" + ", usuario: " + AgenteController.getAgente().name + " Resolución: " + idResolucionFAP);
 94		renderTemplate("fap/EditarResolucion/EditarResolucion.html", accion, idResolucionFAP, resolucionFAP);		
 95	}
 96	
 97	/**
 98	 * Expedientes que se muestran en la tabla para poder seleccionar
 99	 */
100	public static void tablatablaExpedientes(Long idResolucionFAP) {
101
102		java.util.List<SolicitudGenerica> rows = new ArrayList<SolicitudGenerica>();
103		
104		// Obtenemos el objeto "ResolucionBase"
105		ResolucionBase resolBase = null;
106		
107		Map<String, Long> ids = (Map<String, Long>) tags.TagMapStack.top("idParams");
108		
109		try {
110			resolBase = getResolucionObject(idResolucionFAP);
111			
112			java.util.List<SolicitudGenerica> allrows = null;
113			allrows = (List<SolicitudGenerica>) resolBase.getSolicitudesAResolver(idResolucionFAP);
114			
115			for (SolicitudGenerica solicitud : allrows) {
116				Map<String, Object> vars = new HashMap<String, Object>();
117				vars.put("solicitud", solicitud);
118				if (secure.checkAcceso("solicitudes", "leer", ids, vars)) {
119					rows.add(solicitud);
120				}
121			}
122			
123			List<SolicitudGenerica> rowsFiltered = rows; //Tabla sin permisos, no filtra
124			tables.TableRenderResponse<SolicitudGenerica> response = new tables.TableRenderResponse<SolicitudGenerica>(rowsFiltered, false, false, false, "", "", "", getAccion(), ids);
125
126			renderJSON(response.toJSON("id", "expedienteAed.idAed", "estadoValue", "estado", "estadoUsuario", "solicitante.id", "solicitante.nombreCompleto"));
127			
128		} catch (Throwable e) {
129			play.Logger.error("No se ha podido obtener el objeto resolución: "+idResolucionFAP);
130		}
131		
132	}
133
134
135	/**
136	 * Expedientes (Unico) que se muestran en la tabla para poder seleccionar.
137	 */
138	public static void tablatablaExpedientesUnico(Long idResolucionFAP) {
139		
140		java.util.List<SolicitudGenerica> rows = new ArrayList<SolicitudGenerica>();
141		
142		// Obtenemos el usuario conectado al sistema y el rol activo
143		Agente usuario = AgenteController.getAgente();
144		String rolActivo = usuario.getRolActivo();
145		// Obtenemos el objeto "ResolucionBase"
146		ResolucionBase resolBase = null;
147		
148		Map<String, Long> ids = (Map<String, Long>) tags.TagMapStack.top("idParams");
149		
150		try {
151			resolBase = getResolucionObject(idResolucionFAP);
152			java.util.List<SolicitudGenerica> allrows = null;
153			
154			// Listamos los expedientes segun la provincia a la que esta asignado el gestor o todos
155			if(rolActivo.equals("gestorTenerife")){
156				allrows = (List<SolicitudGenerica>) resolBase.getSolicitudesAResolverSC(ids.get("idResolucionFAP"));
157			} else if(rolActivo.equals("gestorLasPalmas")){
158				allrows = (List<SolicitudGenerica>) resolBase.getSolicitudesAResolverLP(ids.get("idResolucionFAP"));
159			}else {
160				allrows = (List<SolicitudGenerica>) resolBase.getSolicitudesAResolver(ids.get("idResolucionFAP"));
161			}
162			
163			for (SolicitudGenerica solicitud : allrows) {
164				Map<String, Object> vars = new HashMap<String, Object>();
165				vars.put("solicitud", solicitud);
166				if (secure.checkAcceso("solicitudes", "leer", ids, vars)) {
167					rows.add(solicitud);
168				}
169			}
170			
171			List<SolicitudGenerica> rowsFiltered = rows; //Tabla sin permisos, no filtra
172			tables.TableRenderResponse<SolicitudGenerica> response = new tables.TableRenderResponse<SolicitudGenerica>(rowsFiltered, false, false, false, "", "", "", getAccion(), ids);
173
174			renderJSON(response.toJSON("id", "expedienteAed.idAed", "estadoValue", "estado", "estadoUsuario", "solicitante.id", "solicitante.nombreCompleto"));
175			
176		} catch (Throwable e) {
177			play.Logger.error("No se ha podido obtener el objeto resolución: "+ idResolucionFAP);
178		}
179	}
180	
181	
182	@Util
183	// Este @Util es necesario porque en determinadas circunstancias crear(..) llama a editar(..).
184	public static void prepararResolucion(Long idResolucionFAP, String btnPrepararResolucion) {
185	
186		if (ResolucionBase.isGeneradoDocumentoResolucion()) {
187			checkAuthenticity();
188			if (!permisoPrepararResolucion("editar")) {
189				Messages.error("No tiene permisos suficientes para realizar la acción");
190			}
191
192		
193			if (!Messages.hasErrors()) {
194				
195				ResolucionBase resolBase = null;
196				try {
197					resolBase = ResolucionControllerFAP.invoke(ResolucionControllerFAP.class, "getResolucionObject", idResolucionFAP);
198					resolBase.prepararResolucion(idResolucionFAP);
199				} catch (Throwable e1) {
200					play.Logger.error("Error obteniendo tipo de resolución: " + e1.getMessage());
201				}
202			}
203
204			if (!Messages.hasErrors()) {
205				EditarResolucionController.prepararResolucionValidateRules();
206			}
207			if (!Messages.hasErrors()) {
208
209				log.info("Acción Editar de página: " + "gen/EditarResolucion/EditarResolucion.html" + " , intentada con éxito");
210			} else
211				log.info("Acción Editar de página: " + "gen/EditarResolucion/EditarResolucion.html" + " , intentada sin éxito (Problemas de Validación)");
212			EditarResolucionController.prepararResolucionRender(idResolucionFAP);
213		} else {
214			ResolucionFAP resolucionFAP = EditarResolucionController.getResolucionFAP(idResolucionFAP);
215			if (resolucionFAP.registro.oficial.uri == null) {
216				redirect("AportarDocumentoResolucionController.index", AportarDocumentoResolucionController.getAccion(), idResolucionFAP);
217			} else {
218				redirect("CambiarDocumentoResolucionController.index", CambiarDocumentoResolucionController.getAccion(), idResolucionFAP);
219			}
220		}
221	}
222	
223	@Util
224	// Este @Util es necesario porque en determinadas circunstancias crear(..) llama a editar(..).
225	public static void frmCrearResolucion(Long idResolucionFAP, String btnCrearResolucion) {
226		checkAuthenticity();
227		if (!permisoFrmCrearResolucion("editar")) {
228			Messages.error("No tiene permisos suficientes para realizar la acción");
229		}
230		
231		if (!Messages.hasErrors()) {
232			ResolucionFAP resolucion = EditarResolucionController.getResolucionFAP(idResolucionFAP);
233			ResolucionBase resolBase = null;
234			try {
235				resolBase = getResolucionObject (idResolucionFAP);
236				resolBase.prepararLineasResolucion(idResolucionFAP);
237			} catch (Throwable e) {
238				play.Logger.error("Error antes de obtener las líneas de resolución: " + e.getMessage());
239				Messages.error("Error antes de obtener las líneas de resolución");
240			}
241		}
242
243		if (!Messages.hasErrors()) {
244			ResolucionFAP resolucion = EditarResolucionController.getResolucionFAP(idResolucionFAP);
245			ResolucionBase resolBase = null;
246			try {
247				resolBase = getResolucionObject (idResolucionFAP);
248				resolBase.setLineasDeResolucion(idResolucionFAP);
249				resolBase.avanzarFase_Borrador(resolucion);
250			} catch (Throwable e) {
251				play.Logger.error("Error obteniendo tipo de resolución: " + e.getMessage());
252				Messages.error("Error obteniendo el tipo de resolución");
253			}
254		}
255
256		if (!Messages.hasErrors()) {
257			EditarResolucionController.frmCrearResolucionValidateRules();
258		}
259		if (!Messages.hasErrors()) {
260
261			log.info("Acción Editar de página: " + "gen/EditarResolucion/EditarResolucion.html" + " , intentada con éxito");
262		} else
263			log.info("Acción Editar de página: " + "gen/EditarResolucion/EditarResolucion.html" + " , intentada sin éxito (Problemas de Validación)");
264		EditarResolucionController.frmCrearResolucionRender(idResolucionFAP);
265	}
266	
267	/**
268	 * 
269	 * @param id				Identificador de la resolución actual (idResolucionFAP)
270	 * @param idsSeleccionados	Identificador del expediente seleccionado para su resolución
271	 */
272	public static void crearResolucion(Long id, List<Long> idsSeleccionados) {
273		if (idsSeleccionados == null) {
274			play.Logger.error("Se debe seleccionar un expediente");
275			Messages.error("Se debe seleccionar un expediente");
276			Messages.keep();
277		} else if (idsSeleccionados.size() > 1) {
278			play.Logger.error("Se debe seleccionar sólo un expediente");
279			Messages.error("Se debe seleccionar sólo un expediente");
280			Messages.keep();
281		} else {
282			ResolucionBase resolBase = null;
283			try {
284				resolBase = getResolucionObject(id);
285			} catch (Throwable e) {
286				new Exception ("No se ha podido obtener el objeto resolución", e);
287			}
288			resolBase.setLineasDeResolucion(id, idsSeleccionados);
289			ResolucionFAP resolucion = EditarResolucionController.getResolucionFAP(id);
290			resolBase.avanzarFase_Borrador(resolucion);
291		}
292		index("editar", id);
293	}
294	
295	public static List<ComboItem> selectJefeServicio() {
296		List<ComboItem> listaCombo = new ArrayList<ComboItem>();
297		try {
298			listaCombo = ResolucionControllerFAP.invoke(ResolucionControllerFAP.class, "getJefesServicio");
299		} catch (Throwable e) {
300			Messages.error("No se pudieron obtener los jefes de servicio");
301			play.Logger.error("No se pudieron obtener los jefes de servicio"+e.getMessage());
302		}
303		return listaCombo;
304	}
305	
306	public static List<ComboItem> selectPrioridadFirma() {
307		List<ComboItem> listaPrioridades = new ArrayList<ComboItem>();
308		try {
309			listaPrioridades = ResolucionControllerFAP.invoke(ResolucionControllerFAP.class, "getPrioridadesFirma");
310		} catch (Throwable e) {
311			Messages.error("No se pudieron obtener las prioridades de la firma");
312			play.Logger.error("No se pudieron obtener las prioridades posibles en la firma"+e.getMessage());
313		}
314		return listaPrioridades;
315	}
316	
317	@Util
318	public static void formSelectJefeServicio(Long idResolucionFAP, ResolucionFAP resolucionFAP, String enviarFirmaJSPortafirma) {
319		checkAuthenticity();
320		if (!permisoFormSelectJefeServicio("editar")) {
321			Messages.error("No tiene permisos suficientes para realizar la acción");
322		}
323		ResolucionFAP dbResolucionFAP = EditarResolucionController.getResolucionFAP(idResolucionFAP);
324		ResolucionUtils.actualizarSolicitudesFirmaPortafirmaAntiguasResolucion(dbResolucionFAP);
325		dbResolucionFAP.refresh();
326		
327		EditarResolucionController.formSelectJefeServicioBindReferences(resolucionFAP);
328		
329		Agente agenteActual = AgenteController.getAgente();
330		
331		EntityTransaction tx = JPA.em().getTransaction();
332		tx.commit();
333		
334		if (!Messages.hasErrors()) {
335			if (dbResolucionFAP.solicitudFirmaPortafirma.uriFuncionarioSolicitante == null) {
336				resolucionFAP.solicitudFirmaPortafirma.idSolicitante = agenteActual.usuarioldap;
337				EditarResolucionController.formSelectJefeServicioValidateCopy("editar", dbResolucionFAP, resolucionFAP);
338				
339				if (!Messages.hasErrors()) {
340					if (properties.FapProperties.getBoolean("fap.platino.portafirma")) {
341						PlatinoBDOrganizacionServiceImpl platinoDBOrgPort = InjectorConfig.getInjector().getInstance(PlatinoBDOrganizacionServiceImpl.class);
342						try {
343							tx.begin();
344							dbResolucionFAP.solicitudFirmaPortafirma.uriFuncionarioSolicitante = platinoDBOrgPort.recuperarURIPersona(dbResolucionFAP.solicitudFirmaPortafirma.idSolicitante);
345							dbResolucionFAP.save();
346							tx.commit();
347						} catch (DBOrganizacionException_Exception e) {
348							play.Logger.error("Error al obtener la uri del funcionario solicitante en la Base de Datos de Organización: " + e.getMessage());
349							Messages.error("Error al obtener la uri del funcionario solicitante en la Base de Datos de Organización.");
350						}
351						if ((dbResolucionFAP.solicitudFirmaPortafirma.uriFuncionarioSolicitante == null) || (dbResolucionFAP.solicitudFirmaPortafirma.uriFuncionarioSolicitante.isEmpty()))
352							Messages.error("El usuario "+dbResolucionFAP.solicitudFirmaPortafirma.idSolicitante+" especificado no se encuentra en la Base de Datos de Organización.");
353					}
354				}
355			}
356		}
357
358		if (!Messages.hasErrors()) {
359			EditarResolucionController.formSelectJefeServicioValidateRules(dbResolucionFAP, resolucionFAP);
360			try {
361				PortafirmaFapService portafirmaService = InjectorConfig.getInjector().getInstance(PortafirmaFapService.class);
362				PortafirmaCrearSolicitudResponse response = portafirmaService.crearSolicitudFirma(dbResolucionFAP);
363				portafirmaService.entregarSolicitudFirma(dbResolucionFAP.solicitudFirmaPortafirma.idSolicitante, response.getIdSolicitud(), response.getComentarios());
364				tx.begin();
365				if (dbResolucionFAP.solicitudFirmaPortafirma.agenteHaceSolicitud == null)
366					dbResolucionFAP.solicitudFirmaPortafirma.agenteHaceSolicitud = new Agente();
367				dbResolucionFAP.solicitudFirmaPortafirma.agenteHaceSolicitud = agenteActual;
368				dbResolucionFAP.solicitudFirmaPortafirma.uriSolicitud = response.getIdSolicitud();
369				dbResolucionFAP.solicitudFirmaPortafirma.solicitudEstadoComentario = response.getComentarios();
370				dbResolucionFAP.save();
371				tx.commit();
372			} catch (PortafirmaFapServiceException e) {
373				play.Logger.error("Error al crear la solicitud de firma: " + e);
374				Messages.error("Error al crear la solicitud de firma");
375			} catch (SOAPFaultException e) {
376				play.Logger.error("Error al crear la solicitud de firma: " + e);
377				Messages.error("Error al crear la solicitud de firma");
378			}
379		}
380		
381		if (!Messages.hasErrors()) {
382			ResolucionBase resolBase = null;
383			try {
384				tx.begin();
385				resolBase = getResolucionObject(dbResolucionFAP.id);
386				resolBase.avanzarFase_Preparada_Portafirma(dbResolucionFAP);
387				dbResolucionFAP.save();
388				tx.commit();
389				Messages.ok("Se ha enviado correctamente al portafirma la solicitud de la firma");
390			} catch (Throwable e) {
391				play.Logger.error("No se ha enviado correctamente al portafirma la solicitud de firma: "+e);
392				Messages.error("No se ha enviado correctamente al portafirma la solicitud de firma. ");
393			}
394			log.info("Acción Editar de página: " + "gen/EditarResolucion/EditarResolucion.html" + " , intentada con éxito");
395		} else
396			log.info("Acción Editar de página: " + "gen/EditarResolucion/EditarResolucion.html" + " , intentada sin éxito (Problemas de Validación)");
397		EditarResolucionController.formSelectJefeServicioRender(idResolucionFAP);
398	}
399
400	@Util
401	public static void formSelectJefeServicioValidateCopy(String accion, ResolucionFAP dbResolucionFAP, ResolucionFAP resolucionFAP) {
402		
403		EntityTransaction tx = JPA.em().getTransaction();
404		
405		CustomValidation.clearValidadas();
406		
407		CustomValidation.valid("resolucionFAP.solicitudFirmaPortafirma", resolucionFAP.solicitudFirmaPortafirma);
408		CustomValidation.valid("resolucionFAP", resolucionFAP);
409		CustomValidation.required("resolucionFAP.solicitudFirmaPortafirma.idDestinatario", resolucionFAP.solicitudFirmaPortafirma.idDestinatario);
410		CustomValidation.validValueFromTable("resolucionFAP.solicitudFirmaPortafirma.idDestinatario", resolucionFAP.solicitudFirmaPortafirma.idDestinatario);
411		dbResolucionFAP.solicitudFirmaPortafirma.idDestinatario = resolucionFAP.solicitudFirmaPortafirma.idDestinatario;
412		CustomValidation.required("resolucionFAP.solicitudFirmaPortafirma.prioridad", resolucionFAP.solicitudFirmaPortafirma.prioridad);
413		CustomValidation.validValueFromTable("resolucionFAP.solicitudFirmaPortafirma.prioridad", resolucionFAP.solicitudFirmaPortafirma.prioridad);
414		dbResolucionFAP.solicitudFirmaPortafirma.prioridad = resolucionFAP.solicitudFirmaPortafirma.prioridad;
415		CustomValidation.required("resolucionFAP.numero_folios", resolucionFAP.numero_folios);
416		dbResolucionFAP.numero_folios = resolucionFAP.numero_folios;
417		
418		if (properties.FapProperties.getBoolean("fap.platino.portafirma")) {
419			if (resolucionFAP.solicitudFirmaPortafirma.idSolicitante == null){
420				Messages.error("El usuario no tiene asociado un identificador único en el ldap del gobierno.");
421				play.Logger.error("El usuario no tiene asociado un identificador único en el ldap del gobierno.");
422			} else
423				dbResolucionFAP.solicitudFirmaPortafirma.idSolicitante = resolucionFAP.solicitudFirmaPortafirma.idSolicitante;
424		}
425		else {
426			dbResolucionFAP.solicitudFirmaPortafirma.idSolicitante = FapProperties.get("portafirma.usuario");
427		}
428		
429		if (dbResolucionFAP.solicitudFirmaPortafirma.plazoMaximo != null) {
430			DateTime today = new DateTime().withTimeAtStartOfDay();
431			if (dbResolucionFAP.solicitudFirmaPortafirma.plazoMaximo.isBefore(today)) {
432				play.Logger.error("La fecha tope de firma no puede ser anterior a hoy.");
433				CustomValidation.error("La fecha tope de firma no puede ser anterior a hoy.","resolucionFAP.solicitudFirmaPortafirma.plazoMaximo", resolucionFAP.solicitudFirmaPortafirma.plazoMaximo);
434			}
435			int dias = 0;
436			// Comprobar la fecha de tope de firma con el ResolucionBase
437			try {
438				dias = ResolucionControllerFAP.invoke(ResolucionControllerFAP.class, "getDiasLimiteFirma", dbResolucionFAP.id, false);
439				//Si hay un plazo límite, se calcula si la fecha seleccionada está dentro del rango 
440				if (dias != -1) {
441					//Es requerido sólo si existe la property y tiene valor
442					CustomValidation.required("resolucionFAP.solicitudFirmaPortafirma.plazoMaximo", resolucionFAP.solicitudFirmaPortafirma.plazoMaximo);
443					dbResolucionFAP.solicitudFirmaPortafirma.plazoMaximo = resolucionFAP.solicitudFirmaPortafirma.plazoMaximo;
444					
445					DateTime diaLimite = new DateTime();
446					diaLimite = diaLimite.plusDays(dias);
447					if (diaLimite.isBefore(dbResolucionFAP.solicitudFirmaPortafirma.plazoMaximo)) {
448						play.Logger.error("La fecha tope de firma no puede ser posterior a "+diaLimite+".");
449						CustomValidation.error("La fecha tope de firma no puede ser posterior a "+diaLimite+".", "resolucionFAP.solicitudFirmaPortafirma.plazoMaximo", resolucionFAP.solicitudFirmaPortafirma.plazoMaximo);					
450					}
451				} else
452					play.Logger.info("No hay fecha límite para la firma");
453			} catch (Throwable e) {
454				e.printStackTrace();
455				play.Logger.error("No se ha podido calcular el límite de fecha para la firma."+e);
456				CustomValidation.error("No se ha podido calcular el límite de fecha para la firma", "resolucionFAP.solicitudFirmaPortafirma.plazoMaximo", resolucionFAP.solicitudFirmaPortafirma.plazoMaximo);
457			}
458		}
459		tx.begin();
460		dbResolucionFAP.save();
461		tx.commit();
462		
463	}
464	
465	@Util
466	public static void firmaDirectorPortafirma(Long idResolucionFAP, String enviarFirmaDirectorPortafirma) {
467		checkAuthenticity();
468		if (!permisoFirmaDirectorPortafirma("editar")) {
469			Messages.error("No tiene permisos suficientes para realizar la acción");
470		}
471		ResolucionFAP dbResolucionFAP = EditarResolucionController.getResolucionFAP(idResolucionFAP);
472
473		if (!Messages.hasErrors()) {
474		}
475
476		if (!Messages.hasErrors()) {
477			EditarResolucionController.firmaDirectorPortafirmaValidateRules();
478		}
479		if (!Messages.hasErrors()) {
480			ResolucionBase resolBase = null;
481			try {
482				resolBase = getResolucionObject(idResolucionFAP);
483			} catch (Throwable e) {
484				new Exception ("No se ha podido obtener el objeto resolución", e);
485			}
486			resolBase.avanzarFase_FirmadaJefeServicio(dbResolucionFAP);
487			dbResolucionFAP.save();
488			Messages.ok("Se ha enviado correctamente al portafirma la solicitud de la firma del Director");
489			log.info("Acción Editar de página: " + "gen/EditarResolucion/EditarResolucion.html" + " , intentada con éxito");
490		} else
491			log.info("Acción Editar de página: " + "gen/EditarResolucion/EditarResolucion.html" + " , intentada sin éxito (Problemas de Validación)");
492		EditarResolucionController.firmaDirectorPortafirmaRender(idResolucionFAP);
493	}
494	
495	@Util
496	public static void firFirmarResolucionFrmFirmarJefeServicio(Long idResolucionFAP, String firma) {
497		ResolucionFAP resolucionFAP = EditarResolucionController.getResolucionFAP(idResolucionFAP);
498
499		play.Logger.info("Metodo: firFirmarResolucionFrmFirmarJefeServicio");
500		Map<String, Long> ids = (Map<String, Long>) tags.TagMapStack.top("idParams");
501		Map<String, Object> vars = new HashMap<String, Object>();
502		if (secure.checkAcceso("editarFirma", "editar", ids, vars)) {
503			if (resolucionFAP.registro.firmantes.todos == null || resolucionFAP.registro.firmantes.todos.size() == 0) {
504				resolucionFAP.registro.firmantes.todos = resolucionFAP.calcularFirmantes();
505				resolucionFAP.registro.firmantes.save();
506			}
507			FirmaUtils.firmar(resolucionFAP.registro.oficial, resolucionFAP.registro.firmantes.todos, firma, null);
508		} else {
509			//ERROR
510			Messages.error("No tiene permisos suficientes para realizar la acción++");
511		}
512		if (!Messages.hasErrors()) {
513
514			resolucionFAP.save();
515			ResolucionBase resolBase = null;
516			try {
517				resolBase = getResolucionObject(idResolucionFAP);
518			} catch (Throwable e) {
519				new Exception ("No se ha podido obtener el objeto resolución", e);
520			}
521			resolBase.avanzarFase_Preparada_FirmaJefeServicio(resolucionFAP);
522		}
523	}
524	
525	@Util
526	public static void frmComprobarFirmas(Long idResolucionFAP, String comprobarFirmado) {
527		checkAuthenticity();
528		if (!permisoFrmComprobarFirmas("editar")) {
529			Messages.error("No tiene permisos suficientes para realizar la acción");
530		}
531
532		if (!Messages.hasErrors()) {
533			ResolucionFAP dbResolucionFAP = EditarResolucionController.getResolucionFAP(idResolucionFAP);
534			ResolucionUtils.actualizarSolicitudesFirmaPortafirmaAntiguasResolucion(dbResolucionFAP);
535			try {
536				PortafirmaFapService portafirmaService = InjectorConfig.getInjector().getInstance(PortafirmaFapService.class);
537				if (portafirmaService.comprobarSiSolicitudFirmada(dbResolucionFAP.solicitudFirmaPortafirma)) {
538					ResolucionBase resolBase = null;
539					try {
540						resolBase = getResolucionObject(idResolucionFAP);
541					} catch (Throwable e) {
542						new Exception ("No se ha podido obtener el objeto resolución", e);
543					}
544					Messages.ok("La solicitud de firma asociada a la resolución se ha firmado y finalizado correctamente.");
545					resolBase.avanzarFase_PendienteFirmarDirector(dbResolucionFAP);
546					dbResolucionFAP.registro.fasesRegistro.firmada = true;
547					// TODO: ¿SE DEBE ELIMINAR?
548					//portafirmaService.eliminarSolicitudFirma(dbResolucionFAP.solicitudFirmaPortafirma);
549					dbResolucionFAP.save();
550				} else {
551					play.Logger.warn("La resolución ["+dbResolucionFAP.id+"] no ha sido firmada y finalizada ");
552					Messages.warning("El documento de resolución no ha sido firmado y finalizado");
553					String estado = portafirmaService.obtenerEstadoFirma(dbResolucionFAP.solicitudFirmaPortafirma);
554					if (estado == null) {
555						throw new PortafirmaFapServiceException("No se pudo obtener el estado de la firma: Response null. ");
556					}
557					play.Logger.info("El estado de la solicitud en el portafirma es: "+estado);
558					Messages.warning("El estado de la solicitud en el portafirma es: "+estado);
559					if (estado.equalsIgnoreCase("Rechazada")) {
560						//Volver a estado anterior
561						ResolucionBase resolBase = null;
562						try {
563							resolBase = getResolucionObject(idResolucionFAP);
564						} catch (Throwable e) {
565							new Exception ("No se ha podido obtener el objeto resolución", e);
566						}
567						resolBase.retrocederFase_Modificacion(dbResolucionFAP);
568						//portafirmaService.eliminarSolicitudFirma(dbResolucionFAP.solicitudFirmaPortafirma);
569						dbResolucionFAP.save();
570					} else {
571						play.Logger.warn("La Solicitud está en el estado: " + estado);
572						//TODO: Recuperar comentario del response (que ahora no existe)
573						//play.Logger.warn("La Solicitud está en el estado: "+estado+ ": "+response.getComentario());
574						Messages.warning("La Solicitud está en el estado: " + estado);
575					}
576				}
577			} catch (PortafirmaFapServiceException e) {
578				play.Logger.error("Error al comprobar si ya se ha firmado la resolución en el portafirma: " + e);
579				Messages.error("Error al comprobar si ya se ha firmado la resolución en el portafirma.");
580			} catch (SOAPFaultException e) {
581				play.Logger.error("Error al comprobar si ya se ha firmado la resolución en el portafirma: " + e);
582				Messages.error("Error al comprobar si ya se ha firmado la resolución en el portafirma.");
583			}
584		}
585
586		if (!Messages.hasErrors()) {
587			EditarResolucionController.frmComprobarFirmasValidateRules();
588		}
589		
590		if (!Messages.hasErrors()) {
591			log.info("Acción Editar de página: " + "gen/EditarResolucion/EditarResolucion.html" + " , intentada con éxito");
592		} else
593			log.info("Acción Editar de página: " + "gen/EditarResolucion/EditarResolucion.html" + " , intentada sin éxito (Problemas de Validación)");
594		EditarResolucionController.frmComprobarFirmasRender(idResolucionFAP);
595	}
596	
597	@Util
598	public static void enviarRegistrarResolucion(Long idResolucionFAP, ResolucionFAP resolucionFAP, String btnRegistrarResolucion) {
599		checkAuthenticity();
600		if (!permisoEnviarRegistrarResolucion("editar")) {
601			Messages.error("No tiene permisos suficientes para realizar la acción");
602		}
603		ResolucionFAP dbResolucionFAP = EditarResolucionController.getResolucionFAP(idResolucionFAP);
604		RegistroResolucion datosRegistro = null;
605		
606		EntityTransaction tx = JPA.em().getTransaction();
607		tx.commit();
608		
609		/// 1. Crear la resolución
610		if (!Messages.hasErrors()) {
611			if ((dbResolucionFAP.registro.fasesRegistro.firmada) && (!dbResolucionFAP.registro.fasesRegistro.registro)) {
612				tx.begin();
613				try {
614					RegistroLibroResolucionesService registroLibroResolucionesService = InjectorConfig.getInjector().getInstance(RegistroLibroResolucionesService.class);
615					datosRegistro = registroLibroResolucionesService.crearResolucion(dbResolucionFAP);
616					dbResolucionFAP.codigoResolucion = Integer.toString(datosRegistro.numero);
617					dbResolucionFAP.fechaRegistroResolucion = datosRegistro.fecha;
618					dbResolucionFAP.folio_inicio = datosRegistro.primerFolio;
619					dbResolucionFAP.folio_final = datosRegistro.ultimoFolio;
620					dbResolucionFAP.numero = datosRegistro.numero;
621					dbResolucionFAP.registro.fasesRegistro.registro = true;
622					dbResolucionFAP.save();
623				} catch (RegistroLibroResolucionesServiceException e) {
624					play.Logger.error("No se puede crear el registro de resolución. "+e);
625					Messages.error("No se puede crear el registro de resolución");
626				}
627				tx.commit();
628			}
629		}
630		
631		if (!Messages.hasErrors()) {
632			EditarResolucionController.enviarRegistrarResolucionValidateRules();
633		}
634
635		GestorDocumentalService gestorDocumentalService = InjectorConfig.getInjector().getInstance(GestorDocumentalService.class);
636		
637		/// 2. Crear el expediente de la convocatoria en el AED por si no existe
638		if (!Messages.hasErrors()) {
639			if ((dbResolucionFAP.registro.fasesRegistro.registro) && (!dbResolucionFAP.registro.fasesRegistro.expedienteAed)) {
640				// TODO: Crear expediente en el AED
641				tx.begin();
642				try {
643					gestorDocumentalService.crearExpedienteConvocatoria();
644					dbResolucionFAP.registro.fasesRegistro.expedienteAed = true;
645					dbResolucionFAP.save();
646				} catch (GestorDocumentalServiceException e) {
647					play.Logger.error("Error. No se ha podido crear el expediente de la resolución el el AED.", e);
648					Messages.error("Error. No se ha podido crear el expediente de la resolución el el AED.");
649				}
650				tx.commit();
651			}
652		}
653		
654		// 3. Clasificar el documento de resolución y de consultas
655		if (!Messages.hasErrors()) {
656			if ((dbResolucionFAP.registro.fasesRegistro.expedienteAed) && (!dbResolucionFAP.registro.fasesRegistro.clasificarAed)) {
657				tx.begin();
658				try {
659					gestorDocumentalService.clasificarDocumentoResolucion(dbResolucionFAP);
660					gestorDocumentalService.clasificarDocumentosConsulta(dbResolucionFAP);
661					dbResolucionFAP.registro.fasesRegistro.clasificarAed = true;
662					dbResolucionFAP.save();
663				} catch (GestorDocumentalServiceException e) {
664					play.Logger.error("Error al clasificar el documento de la resolución.", e);
665					Messages.error("Error al clasificar el documento de la resolución.");
666				}
667				tx.commit();
668			}
669		}
670		
671		//Agregar Firma Platino al documento de resolucion en el AED ACIISI
672		if (!Messages.hasErrors()) {
673			PlatinoGestorDocumentalService platinoaed = InjectorConfig.getInjector().getInstance(PlatinoGestorDocumentalService.class);
674			
675			tx.begin();
676			
677		    es.gobcan.platino.servicios.sgrde.Documento documentoPlatino = platinoaed.descargarFirmado(dbResolucionFAP.registro.oficial.uri);
678			if (documentoPlatino != null){
679				
680				try {
681					AedUtils.docPlatinotoDocumentoFirmantes(dbResolucionFAP.registro.oficial, documentoPlatino);
682					gestorDocumentalService.agregarFirma(dbResolucionFAP.registro.oficial, 
683							new Firma(documentoPlatino.getMetaInformacion().getFirmasElectronicas().getFirma(), dbResolucionFAP.registro.oficial.firmantes.todos));
684						
685				} catch (GestorDocumentalServiceException e) {
686					play.Logger.error("Error. No se ha podido agregar la firma al documento de resolución en el AED.", e);
687				}
688			}
689			
690			tx.commit();
691		}
692		
693		if (!Messages.hasErrors()) {
694			ResolucionBase resolBase = null;
695			tx.begin();
696			try {
697				resolBase = getResolucionObject(idResolucionFAP);
698			} catch (Throwable e) {
699				new Exception ("No se ha podido obtener el objeto resolución", e);
700			}
701			resolBase.avanzarFase_Firmada(dbResolucionFAP);
702			
703			// Enviar correo al Jefe de Servicio correspondiente
704			try {
705				Agente agente = dbResolucionFAP.solicitudFirmaPortafirma.agenteHaceSolicitud;
706				ResolucionFAP resolucionfap = dbResolucionFAP;
707				play.classloading.enhancers.LocalvariablesNamesEnhancer.LocalVariablesNamesTracer.addVariable("resolucionfap", resolucionfap);
708				play.classloading.enhancers.LocalvariablesNamesEnhancer.LocalVariablesNamesTracer.addVariable("agente", agente);
709				Mails.enviar("registrarResolucion", resolucionfap, agente);
710			} catch (Exception e) {
711				play.Logger.fatal("No se ha podido enviar el correo al Jefe de Servicio: "+dbResolucionFAP.solicitudFirmaPortafirma.idDestinatario+" de la resolución: "+dbResolucionFAP.id);
712				Messages.error("No se ha podido enviar el correo al Jefe de Servicio: "+dbResolucionFAP.solicitudFirmaPortafirma.idDestinatario+" de la resolución: "+dbResolucionFAP.id);
713			}
714			tx.commit();
715		}
716		
717		tx.begin();
718		
719		if (!Messages.hasErrors()) {
720			log.info("Acción Editar de página: " + "gen/EditarResolucion/EditarResolucion.html" + " , intentada con éxito");
721		} else
722			log.info("Acción Editar de página: " + "gen/EditarResolucion/EditarResolucion.html" + " , intentada sin éxito (Problemas de Validación)");
723		EditarResolucionController.enviarRegistrarResolucionRender(idResolucionFAP);
724	}
725
726	/**
727	 * 
728	 * @param id				Identificador de la resolución actual (idResolucionFAP)
729	 * @param idsSeleccionados	Identificadores de los expedientes seleccionados para su resolución
730	 */
731	public static void seleccionar(Long id, List<Long> idsSeleccionados) {
732		if (idsSeleccionados == null) {
733			play.Logger.error("Se debe seleccionar al menos un expediente");
734			Messages.error("Se debe seleccionar al menos un expediente");
735			Messages.keep();
736		} else {
737			ResolucionBase resolBase = null;
738			try {
739				resolBase = getResolucionObject(id);
740			} catch (Throwable e) {
741				new Exception ("No se ha podido obtener el objeto resolución", e);
742			}
743			resolBase.setLineasDeResolucion(id, idsSeleccionados);
744			ResolucionFAP resolucion = EditarResolucionController.getResolucionFAP(id);
745			resolBase.avanzarFase_Borrador(resolucion);
746		}
747		index("editar", id);
748	}
749
750	@Util
751	// Este @Util es necesario porque en determinadas circunstancias crear(..) llama a editar(..).
752	public static void copiaExpediente(Long idResolucionFAP, String btnCopiaExpediente) {
753		checkAuthenticity();
754		if (!permisoCopiaExpediente("editar")) {
755			Messages.error("No tiene permisos suficientes para realizar la acción");
756		}
757
758		if (!Messages.hasErrors()) {
759			EditarResolucionController.copiaExpedienteValidateRules();
760		}
761		ResolucionBase resolBase = null;
762		if (!Messages.hasErrors()) {
763			try {
764				resolBase = ResolucionControllerFAP.invoke(ResolucionControllerFAP.class, "getResolucionObject", idResolucionFAP);
765			} catch (Throwable e) {
766				new Exception ("No se ha podido obtener el objeto resolución", e);
767			}
768		}
769		if (!Messages.hasErrors()) {
770			resolBase.copiarEnExpedientes(idResolucionFAP);
771			//resolBase.resolucion.estadoPublicacion = EstadoResolucionPublicacionEnum.publicada.name();
772			resolBase.resolucion.save();
773		}
774		if (!Messages.hasErrors()) {
775
776			log.info("Acción Editar de página: " + "gen/PaginaPublicarResolucion/PaginaPublicarResolucion.html" + " , intentada con éxito");
777		} else
778			log.info("Acción Editar de página: " + "gen/PaginaPublicarResolucion/PaginaPublicarResolucion.html" + " , intentada sin éxito (Problemas de Validación)");
779		EditarResolucionController.copiaExpedienteRender(idResolucionFAP);
780	
781	}
782	
783	public static void tablalineasResolucion(Long idResolucionFAP) {
784		boolean flag = true;
785		java.util.List<LineaResolucionFAP> rows = LineaResolucionFAP.find("select lineaResolucionFAP from ResolucionFAP resolucionFAP join resolucionFAP.lineasResolucion lineaResolucionFAP where resolucionFAP.id=?", idResolucionFAP).fetch();
786
787		Map<String, Long> ids = (Map<String, Long>) tags.TagMapStack.top("idParams");
788		List<LineaResolucionFAP> rowsFiltered = rows; //Tabla sin permisos, no filtra
789		
790		tables.TableRenderResponse<LineaResolucionFAP> response = new tables.TableRenderResponse<LineaResolucionFAP>(rowsFiltered, false, false, false, "", "", "", getAccion(), ids);
791		
792		for (LineaResolucionFAP row:rows) {
793			if (row.registro == null) {
794				row.registro = new Registro();
795				row.save();
796			}
797			if ((row.registro.oficial.uri == null) || (row.registro.fasesRegistro.firmada == null) || (row.registro.fasesRegistro.firmada == false)){
798				flag = false;
799				break;
800			}
801		}
802		if (!flag) {
803			renderJSON(response.toJSON("id", "solicitud.expedienteAed.idAed", "solicitud.estado", "solicitud.solicitante.numeroId", "solicitud.solicitante.nombreCompleto", "estado"));
804		}
805		else {
806			renderJSON(response.toJSON("id", "solicitud.expedienteAed.idAed", "solicitud.estado", "solicitud.solicitante.numeroId", "solicitud.solicitante.nombreCompleto", "estado", "registro.oficial.enlaceDescargaFirmado", "registro.justificante.enlaceDescarga"));
807		}
808		
809	}
810	
811	
812	@Util
813	// Este @Util es necesario porque en determinadas circunstancias crear(..) llama a editar(..).
814	public static void volverExpedientes(Long idResolucionFAP, String btnVolverExpedientes) {
815		checkAuthenticity();
816		if (!permisoVolverExpedientes("editar")) {
817			Messages.error("No tiene permisos suficientes para realizar la acción");
818		}
819
820		if (!Messages.hasErrors()) {
821
822		}
823
824		if (!Messages.hasErrors()) {
825			EditarResolucionController.volverExpedientesValidateRules();
826		}
827		Agente logAgente = AgenteController.getAgente();
828		if (!Messages.hasErrors()) {
829			// Obtenemos la resolucion que estamos editando
830			ResolucionFAP resolucionFAP = getResolucionFAP(idResolucionFAP);
831			// Antes de volver cambiamos el estado de la resolucion a borrador 
832			resolucionFAP.estado = "borrador";
833			// Borramos las lineas de resolucion y guardamos la resolucion en la BBDD
834			resolucionFAP.lineasResolucion.clear();
835			resolucionFAP.save();
836			
837			log.info("Acción Editar de página: " + "gen/EditarResolucion/EditarResolucion.html" + " , intentada con éxito " + " Agente: " + logAgente);
838		} else
839			log.info("Acción Editar de página: " + "gen/EditarResolucion/EditarResolucion.html" + " , intentada sin éxito (Problemas de Validación)" + " Agente: " + logAgente);
840		EditarResolucionController.volverExpedientesRender(idResolucionFAP);
841	}
842	
843}