/** * */ package net.conselldemallorca.helium.webapp.mvc; import java.text.SimpleDateFormat; import java.util.Date; import javax.servlet.http.HttpServletRequest; import net.conselldemallorca.helium.core.model.dto.ExpedientDto; import net.conselldemallorca.helium.core.model.dto.InstanciaProcesDto; import net.conselldemallorca.helium.core.model.hibernate.Entorn; import net.conselldemallorca.helium.core.model.hibernate.ExpedientTipus; import net.conselldemallorca.helium.core.model.hibernate.TerminiIniciat; import net.conselldemallorca.helium.core.model.service.DissenyService; import net.conselldemallorca.helium.core.model.service.ExpedientService; import net.conselldemallorca.helium.core.model.service.PermissionService; import net.conselldemallorca.helium.core.model.service.TerminiService; import net.conselldemallorca.helium.core.security.ExtendedPermission; import net.conselldemallorca.helium.webapp.mvc.ExpedientTerminiModificarCommand.TerminiModificacioTipus; import net.conselldemallorca.helium.webapp.mvc.util.BaseController; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.propertyeditors.CustomDateEditor; import org.springframework.security.acls.model.Permission; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.validation.BindingResult; import org.springframework.web.bind.WebDataBinder; import org.springframework.web.bind.annotation.InitBinder; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.support.SessionStatus; /** * Controlador per la gestió dels terminis als expedients * * @author Limit Tecnologies <limit@limit.es> */ @Controller public class ExpedientTerminiController extends BaseController { private TerminiService terminiService; private DissenyService dissenyService; private ExpedientService expedientService; private PermissionService permissionService; @Autowired public ExpedientTerminiController( TerminiService terminiService, DissenyService dissenyService, ExpedientService expedientService, PermissionService permissionService) { this.terminiService = terminiService; this.dissenyService = dissenyService; this.expedientService = expedientService; this.permissionService = permissionService; } @RequestMapping(value = "/expedient/terminis") public String terminis( HttpServletRequest request, @RequestParam(value = "id", required = true) String id, ModelMap model) { Entorn entorn = getEntornActiu(request); if (entorn != null) { ExpedientDto expedient = expedientService.findExpedientAmbProcessInstanceId(id); if (potConsultarExpedient(expedient)) { model.addAttribute( "expedient", expedient); model.addAttribute( "arbreProcessos", expedientService.getArbreInstanciesProces(id)); InstanciaProcesDto instanciaProces = expedientService.getInstanciaProcesById(id, false, false, false); model.addAttribute( "instanciaProces", instanciaProces); model.addAttribute( "terminis", dissenyService.findTerminisAmbDefinicioProces(instanciaProces.getDefinicioProces().getId())); model.addAttribute( "iniciats", terminiService.findIniciatsAmbProcessInstanceId(id)); return "expedient/terminis"; } else { missatgeError(request, getMessage("error.permisos.consultar.expedient")); return "redirect:/expedient/consulta.html"; } } else { missatgeError(request, getMessage("error.no.entorn.selec") ); return "redirect:/index.html"; } } @RequestMapping(value = "/expedient/terminiIniciar") public String terminiIniciar( HttpServletRequest request, @RequestParam(value = "id", required = true) String id, @RequestParam(value = "terminiId", required = true) Long terminiId, ModelMap model) { Entorn entorn = getEntornActiu(request); if (entorn != null) { try { terminiService.iniciar( terminiId, id, new Date(), true); missatgeInfo(request, getMessage("info.termini.iniciat") ); } catch (Exception ex) { missatgeError(request, getMessage("error.iniciar.termini"), ex.getLocalizedMessage()); logger.error("No s'ha pogut iniciar el termini", ex); } return "redirect:/expedient/terminis.html?id=" + id; } else { missatgeError(request, getMessage("error.no.entorn.selec") ); return "redirect:/index.html"; } } @RequestMapping(value = "/expedient/terminiPausar") public String terminiPausar( HttpServletRequest request, @RequestParam(value = "id", required = true) String id, @RequestParam(value = "terminiId", required = true) Long terminiId, ModelMap model) { Entorn entorn = getEntornActiu(request); if (entorn != null) { try { terminiService.pausar(terminiId, new Date()); missatgeInfo(request, getMessage("info.termini.aturat") ); } catch (Exception ex) { missatgeError(request, getMessage("error.aturar.termini"), ex.getLocalizedMessage()); logger.error("No s'ha pogut aturar el termini", ex); } return "redirect:/expedient/terminis.html?id=" + id; } else { missatgeError(request, getMessage("error.no.entorn.selec") ); return "redirect:/index.html"; } } @RequestMapping(value = "/expedient/terminiContinuar") public String terminiContinuar( HttpServletRequest request, @RequestParam(value = "id", required = true) String id, @RequestParam(value = "terminiId", required = true) Long terminiId, ModelMap model) { Entorn entorn = getEntornActiu(request); if (entorn != null) { try { terminiService.continuar(terminiId, new Date()); missatgeInfo(request, getMessage("info.termini.continuat") ); } catch (Exception ex) { missatgeError(request, getMessage("error.continuar.termini"), ex.getLocalizedMessage()); logger.error("No s'ha pogut continuar el termini", ex); } return "redirect:/expedient/terminis.html?id=" + id; } else { missatgeError(request, getMessage("error.no.entorn.selec") ); return "redirect:/index.html"; } } @RequestMapping(value = "/expedient/terminiCancelar") public String terminiCancelar( HttpServletRequest request, @RequestParam(value = "id", required = true) String id, @RequestParam(value = "terminiId", required = true) Long terminiId, ModelMap model) { Entorn entorn = getEntornActiu(request); if (entorn != null) { try { terminiService.cancelar(terminiId, new Date()); missatgeInfo(request, getMessage("info.termini.cancelat") ); } catch (Exception ex) { missatgeError(request, getMessage("error.cancelar.termini"), ex.getLocalizedMessage()); logger.error("No s'ha pogut cancel·lar el termini", ex); } return "redirect:/expedient/terminis.html?id=" + id; } else { missatgeError(request, getMessage("error.no.entorn.selec") ); return "redirect:/index.html"; } } @RequestMapping(value = "/expedient/terminiModificar", method = RequestMethod.GET) public String terminiModificar( HttpServletRequest request, @RequestParam(value = "id", required = true) String id, @RequestParam(value = "terminiId", required = true) Long terminiId, ModelMap model) { Entorn entorn = getEntornActiu(request); if (entorn != null) { TerminiIniciat terminiIniciat = getTerminiIniciat( id, terminiId); if (terminiIniciat != null) { ExpedientDto expedient = expedientService.findExpedientAmbProcessInstanceId(id); if (potModificarExpedient(expedient)) { model.addAttribute( "expedient", expedient); model.addAttribute( "arbreProcessos", expedientService.getArbreInstanciesProces(id)); InstanciaProcesDto instanciaProces = expedientService.getInstanciaProcesById(id, false, true, true); model.addAttribute( "instanciaProces", instanciaProces); ExpedientTerminiModificarCommand command = new ExpedientTerminiModificarCommand(); command.setTerminiId(terminiId); command.setAnys(terminiIniciat.getAnys()); command.setMesos(terminiIniciat.getMesos()); command.setDies(terminiIniciat.getDies()); command.setDataInici(terminiIniciat.getDataInici()); command.setDataFi(terminiIniciat.getDataFi()); model.addAttribute("termini", terminiIniciat.getTermini()); model.addAttribute("command", command); model.addAttribute("tipus", TerminiModificacioTipus.values()); return "expedient/terminiModificar"; } else { missatgeError(request, getMessage("error.permisos.modificar.expedient")); } } return "redirect:/expedient/terminis.html?id=" + id; } else { missatgeError(request, getMessage("error.no.entorn.selec") ); return "redirect:/index.html"; } } @RequestMapping(value = "/expedient/terminiModificar", method = RequestMethod.POST) public String terminiModificar( HttpServletRequest request, @RequestParam(value = "id", required = true) String id, @RequestParam(value = "submit", required = false) String submit, @ModelAttribute("command") ExpedientTerminiModificarCommand command, BindingResult result, SessionStatus status, ModelMap model) { Entorn entorn = getEntornActiu(request); if (entorn != null) { ExpedientDto expedient = expedientService.findExpedientAmbProcessInstanceId(id); if (potModificarExpedient(expedient)) { if ("submit".equals(submit) || submit.length() == 0) { try { TerminiIniciat terminiIniciat = getTerminiIniciat( id, command.getTerminiId()); if (TerminiModificacioTipus.DURADA.equals(command.getTipus())) { Date dataInici = terminiIniciat.getDataInici(); terminiService.cancelar(command.getTerminiId(), new Date()); terminiService.iniciar( terminiIniciat.getTermini().getId(), id, dataInici, command.getAnys(), command.getMesos(), command.getDies(), false); missatgeInfo(request, getMessage("info.termini.modificat")); } else if (TerminiModificacioTipus.DATA_INICI.equals(command.getTipus())) { int anys = terminiIniciat.getAnys(); int mesos = terminiIniciat.getMesos(); int dies = terminiIniciat.getDies(); terminiService.cancelar(command.getTerminiId(), new Date()); terminiService.iniciar( terminiIniciat.getTermini().getId(), id, command.getDataInici(), anys, mesos, dies, false); missatgeInfo(request, getMessage("info.termini.modificat")); } else if (TerminiModificacioTipus.DATA_FI.equals(command.getTipus())) { int anys = terminiIniciat.getAnys(); int mesos = terminiIniciat.getMesos(); int dies = terminiIniciat.getDies(); terminiService.cancelar(command.getTerminiId(), new Date()); terminiService.iniciar( terminiIniciat.getTermini().getId(), id, command.getDataFi(), anys, mesos, dies, true); missatgeInfo(request, getMessage("info.termini.modificat")); } } catch (Exception ex) { missatgeError(request, getMessage("error.modificar.termini"), ex.getLocalizedMessage()); logger.error("No s'ha pogut modificar el termini", ex); } } return "redirect:/expedient/terminis.html?id=" + id; } else { missatgeError(request, getMessage("error.permisos.modificar.expedient")); return "redirect:/expedient/terminis.html?id=" + id; } } else { missatgeError(request, getMessage("error.no.entorn.selec") ); return "redirect:/index.html"; } } @InitBinder public void initBinder(WebDataBinder binder) { binder.registerCustomEditor( Date.class, new CustomDateEditor(new SimpleDateFormat("dd/MM/yyyy"), true)); } private TerminiIniciat getTerminiIniciat(String id, Long terminiId) { for (TerminiIniciat iniciat: terminiService.findIniciatsAmbProcessInstanceId(id)) { if (iniciat.getId().longValue() == terminiId.longValue()) return iniciat; } return null; } private boolean potConsultarExpedient(ExpedientDto expedient) { return permissionService.filterAllowed( expedient.getTipus(), ExpedientTipus.class, new Permission[] { ExtendedPermission.ADMINISTRATION, ExtendedPermission.SUPERVISION, ExtendedPermission.READ}) != null; } private boolean potModificarExpedient(ExpedientDto expedient) { return permissionService.filterAllowed( expedient.getTipus(), ExpedientTipus.class, new Permission[] { ExtendedPermission.ADMINISTRATION, ExtendedPermission.WRITE}) != null; } private static final Log logger = LogFactory.getLog(ExpedientTerminiController.class); }