package net.conselldemallorca.helium.webapp.v3.controller; import java.math.BigDecimal; import java.text.DecimalFormat; 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.Map; import javax.servlet.http.HttpServletRequest; import javax.validation.Valid; import net.conselldemallorca.helium.v3.core.api.dto.DefinicioProcesDto; import net.conselldemallorca.helium.v3.core.api.dto.EntornDto; import net.conselldemallorca.helium.v3.core.api.dto.ExpedientDto; import net.conselldemallorca.helium.v3.core.api.dto.ExpedientDto.IniciadorTipusDto; import net.conselldemallorca.helium.v3.core.api.dto.ExpedientTascaDto; import net.conselldemallorca.helium.v3.core.api.dto.ExpedientTipusDto; import net.conselldemallorca.helium.v3.core.api.dto.ParellaCodiValorDto; import net.conselldemallorca.helium.v3.core.api.dto.ReproDto; import net.conselldemallorca.helium.v3.core.api.dto.TascaDadaDto; import net.conselldemallorca.helium.v3.core.api.exception.NoTrobatException; import net.conselldemallorca.helium.v3.core.api.exception.TramitacioHandlerException; import net.conselldemallorca.helium.v3.core.api.exception.TramitacioValidacioException; import net.conselldemallorca.helium.v3.core.api.exception.ValidacioException; import net.conselldemallorca.helium.v3.core.api.service.ExpedientService; import net.conselldemallorca.helium.v3.core.api.service.ReproService; import net.conselldemallorca.helium.v3.core.api.service.TascaService; import net.conselldemallorca.helium.webapp.v3.command.ExpedientInicioPasTitolCommand; import net.conselldemallorca.helium.webapp.v3.helper.MissatgesHelper; import net.conselldemallorca.helium.webapp.v3.helper.ObjectTypeEditorHelper; import net.conselldemallorca.helium.webapp.v3.helper.SessionHelper; import net.conselldemallorca.helium.webapp.v3.helper.TascaFormHelper; import net.conselldemallorca.helium.webapp.v3.helper.TascaFormValidatorHelper; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.propertyeditors.CustomBooleanEditor; import org.springframework.beans.propertyeditors.CustomDateEditor; import org.springframework.beans.propertyeditors.CustomNumberEditor; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; 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.PathVariable; 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 pel pas de formulari de l'inici d'expedient * * @author Limit Tecnologies <limit@limit.es> */ @Controller @RequestMapping("/v3/expedient") public class ExpedientInicioPasFormController extends BaseExpedientController { @Autowired protected TascaService tascaService; @Autowired protected ExpedientService expedientService; @Autowired private ReproService reproService; @Autowired private net.conselldemallorca.helium.core.model.service.TascaService tascaInicialService; @SuppressWarnings("unchecked") @ModelAttribute("command") protected Object populateCommand( HttpServletRequest request, @PathVariable Long expedientTipusId, @PathVariable Long definicioProcesId, Model model, Map<String, Object> valorsRepro) { try { Map<String, Object> campsAddicionals = new HashMap<String, Object>(); Map<String, Class<?>> campsAddicionalsClasses = new HashMap<String, Class<?>>(); EntornDto entorn = SessionHelper.getSessionManager(request).getEntornActual(); ExpedientTascaDto tasca = obtenirTascaInicial( entorn.getId(), expedientTipusId, definicioProcesId, new HashMap<String, Object>(), request); campsAddicionals.put("id", tasca.getId()); campsAddicionals.put("entornId", entorn.getId()); campsAddicionals.put("expedientTipusId", expedientTipusId); campsAddicionals.put("definicioProcesId", definicioProcesId); campsAddicionalsClasses.put("id", String.class); campsAddicionalsClasses.put("entornId", Long.class); campsAddicionalsClasses.put("expedientTipusId", Long.class); campsAddicionalsClasses.put("definicioProcesId", Long.class); Map<String, Object> valorsFormulariExtern = null; if (tasca.isFormExtern()) { valorsFormulariExtern = tascaInicialService.obtenirValorsFormulariExternInicial(tasca.getId()); if (valorsFormulariExtern != null) { request.getSession().setAttribute( ExpedientIniciController.CLAU_SESSIO_FORM_VALORS, valorsFormulariExtern); } else { valorsFormulariExtern = (Map<String, Object>)request.getSession().getAttribute( ExpedientIniciController.CLAU_SESSIO_FORM_VALORS); } } if (valorsRepro == null || valorsRepro.isEmpty()) { return TascaFormHelper.getCommandForCamps( tascaService.findDadesPerTascaDto(tasca), valorsFormulariExtern, campsAddicionals, campsAddicionalsClasses, false); } else { return TascaFormHelper.getCommandForCamps( tascaService.findDadesPerTascaDto(tasca), valorsRepro, campsAddicionals, campsAddicionalsClasses, false); } } catch (NoTrobatException ex) { MissatgesHelper.error(request, ex.getMessage()); logger.error("No s'han pogut encontrar la tasca: " + ex.getMessage(), ex); } return null; } @RequestMapping(value = "/iniciarForm/{expedientTipusId}/{definicioProcesId}", method = RequestMethod.GET) public String iniciarFormGet( HttpServletRequest request, @PathVariable Long expedientTipusId, @PathVariable Long definicioProcesId, Model model) { definicioProcesToModel(expedientTipusId, definicioProcesId, model); EntornDto entorn = SessionHelper.getSessionManager(request).getEntornActual(); ExpedientTipusDto expedientTipus = dissenyService.getExpedientTipusById(expedientTipusId); if (!model.containsAttribute("command") || model.asMap().get("command") == null) model.addAttribute("command", populateCommand(request, expedientTipusId, definicioProcesId, model,null)); ExpedientTascaDto tasca = obtenirTascaInicial(entorn.getId(), expedientTipusId, definicioProcesId, new HashMap<String, Object>(), request); List<TascaDadaDto> dades = tascaService.findDadesPerTascaDto(tasca); List<ReproDto> repros = reproService.findReprosByUsuariTipusExpedient(expedientTipus.getId()); model.addAttribute("tasca", tasca); model.addAttribute("dades", dades); model.addAttribute("repros", repros); model.addAttribute("entornId", entorn.getId()); model.addAttribute("expedientTipus", expedientTipus); model.addAttribute("responsableCodi", expedientTipus.getResponsableDefecteCodi()); return "v3/expedient/iniciarPasForm"; } @RequestMapping(value = "/iniciarForm/{expedientTipusId}/{definicioProcesId}/fromRepro/{reproId}", method = RequestMethod.GET) public String getRepro( HttpServletRequest request, @PathVariable Long expedientTipusId, @PathVariable Long definicioProcesId, @PathVariable Long reproId, Model model) { try { Map<String,Object> valors = reproService.findValorsById(reproId); model.addAttribute("command", populateCommand(request, expedientTipusId, definicioProcesId, model, valors)); } catch (Exception e) { MissatgesHelper.error(request, getMessage(request, "repro.missatge.error.carregat")); } return iniciarFormGet(request, expedientTipusId, definicioProcesId, model); } @RequestMapping(value = "/iniciarForm/{expedientTipusId}/{definicioProcesId}", method = RequestMethod.POST) public String iniciarFormPost( HttpServletRequest request, @RequestParam(value = "id", required = false) String id, @PathVariable Long expedientTipusId, @PathVariable Long definicioProcesId, @Valid @ModelAttribute("command") Object command, BindingResult result, SessionStatus status, Model model) { EntornDto entorn = SessionHelper.getSessionManager(request).getEntornActual(); ExpedientTipusDto expedientTipus = dissenyService.getExpedientTipusById(expedientTipusId); ExpedientTascaDto tasca = obtenirTascaInicial(entorn.getId(), expedientTipusId, definicioProcesId, new HashMap<String, Object>(), request); List<TascaDadaDto> tascaDades = tascaService.findDadesPerTascaDto(tasca); List<ReproDto> repros = reproService.findReprosByUsuariTipusExpedient(expedientTipus.getId()); TascaFormValidatorHelper validator = new TascaFormValidatorHelper( tascaService, tascaDades); Map<String, Object> valors = TascaFormHelper.getValorsFromCommand( tascaDades, command, false, true); validator.setValidarObligatoris(true); validator.setValidarExpresions(true); validator.validate(command, result); DefinicioProcesDto definicioProces = null; if (definicioProcesId != null) { definicioProces = dissenyService.getById(definicioProcesId); } else { definicioProces = dissenyService.findDarreraDefinicioProcesForExpedientTipus(expedientTipusId); } model.addAttribute("definicioProces", definicioProces); if (result.hasErrors()) { MissatgesHelper.error(request, getMessage(request, "error.validacio")); model.addAttribute(command); model.addAttribute("tasca", tasca); model.addAttribute("dades", tascaDades); model.addAttribute("repros", repros); model.addAttribute("entornId", entorn.getId()); model.addAttribute("expedientTipus", expedientTipus); model.addAttribute("responsableCodi", expedientTipus.getResponsableDefecteCodi()); return "v3/expedient/iniciarPasForm"; } // Si l'expedient ha de demanar titol i/o nĂºmero redirigeix al pas per demanar aquestes dades if (expedientTipus.isDemanaNumero() || expedientTipus.isDemanaTitol() || expedientTipus.isSeleccionarAny()) { ExpedientInicioPasTitolCommand expedientInicioPasTitolCommand = new ExpedientInicioPasTitolCommand(); expedientInicioPasTitolCommand.setAny(Calendar.getInstance().get(Calendar.YEAR)); expedientInicioPasTitolCommand.setExpedientTipusId(expedientTipusId); expedientInicioPasTitolCommand.setNumero(expedientService.getNumeroExpedientActual(entorn.getId(), expedientTipusId, expedientInicioPasTitolCommand.getAny())); expedientInicioPasTitolCommand.setResponsableCodi(expedientTipus.getResponsableDefecteCodi()); expedientInicioPasTitolCommand.setEntornId(entorn.getId()); model.addAttribute(expedientInicioPasTitolCommand); model.addAttribute("anysSeleccionables", getAnysSeleccionables()); model.addAttribute("expedientTipus", expedientTipus); request.getSession().setAttribute( ExpedientIniciController.CLAU_SESSIO_FORM_VALORS, valors); return "v3/expedient/iniciarPasTitol"; } else { try { ExpedientDto iniciat = iniciarExpedient( entorn.getId(), expedientTipusId, definicioProcesId, (String)request.getSession().getAttribute(ExpedientIniciController.CLAU_SESSIO_NUMERO), (String)request.getSession().getAttribute(ExpedientIniciController.CLAU_SESSIO_TITOL), (Integer)request.getSession().getAttribute(ExpedientIniciController.CLAU_SESSIO_ANY), valors); MissatgesHelper.success(request, getMessage(request, "info.expedient.iniciat", new Object[] { iniciat.getIdentificador() })); ExpedientIniciController.netejarSessio(request); } catch (Exception ex) { if (ex instanceof ValidacioException) { MissatgesHelper.error( request, getMessage(request, "error.validacio.tasca") + " : " + ex.getMessage()); } else if (ex instanceof TramitacioValidacioException) { MissatgesHelper.error( request, getMessage(request, "error.validacio.tasca") + " : " + ex.getMessage()); } else if (ex instanceof TramitacioHandlerException) { MissatgesHelper.error( request, getMessage(request, "error.iniciar.expedient") + " : " + ((TramitacioHandlerException)ex).getPublicMessage()); } else { MissatgesHelper.error( request, getMessage(request, "error.iniciar.expedient") + ": " + (ex.getCause() != null ? ex.getCause().getMessage() : ex.getMessage())); } logger.error("No s'ha pogut iniciar l'expedient", ex); model.addAttribute(command); model.addAttribute("tasca", tasca); model.addAttribute("dades", tascaDades); model.addAttribute("repros", repros); model.addAttribute("entornId", entorn.getId()); model.addAttribute("expedientTipus", expedientTipus); model.addAttribute("responsableCodi", expedientTipus.getResponsableDefecteCodi()); return "v3/expedient/iniciarPasForm"; } } return modalUrlTancar(); } private synchronized ExpedientDto iniciarExpedient(Long entornId, Long expedientTipusId, Long definicioProcesId, String numero, String titol, Integer any, Map<String, Object> valors) { return expedientService.create(entornId, null, expedientTipusId, definicioProcesId, any, numero, titol, null, null, null, null, false, null, null, null, null, null, null, false, null, null, false, valors, null, IniciadorTipusDto.INTERN, null, null, null, null); } public List<ParellaCodiValorDto> getAnysSeleccionables() { List<ParellaCodiValorDto> anys = new ArrayList<ParellaCodiValorDto>(); int anyActual = Calendar.getInstance().get(Calendar.YEAR); for (int i = 0; i < 10; i++) { anys.add(new ParellaCodiValorDto(String.valueOf(anyActual - i), anyActual - i)); } return anys; } protected ExpedientTascaDto obtenirTascaInicial( Long entornId, Long expedientTipusId, Long definicioProcesId, Map<String, Object> valors, HttpServletRequest request) { ExpedientTascaDto tasca = expedientService.getStartTask(entornId, expedientTipusId, definicioProcesId, valors); tasca.setId((String) request.getSession().getAttribute(ExpedientIniciController.CLAU_SESSIO_TASKID)); Object validat = request.getSession().getAttribute(ExpedientIniciController.CLAU_SESSIO_FORM_VALIDAT); tasca.setValidada(validat != null); return tasca; } private void definicioProcesToModel(Long expedientTipusId, Long definicioProcesId, Model model){ // Si l'expedient requereix dades inicials redirigeix al pas per demanar aquestes dades DefinicioProcesDto definicioProces = null; if (definicioProcesId != null) { definicioProces = dissenyService.getById(definicioProcesId); } else { definicioProces = dissenyService.findDarreraDefinicioProcesForExpedientTipus(expedientTipusId); } model.addAttribute("definicioProces", definicioProces); } @InitBinder public void initBinder(WebDataBinder binder) { binder.registerCustomEditor( Long.class, new CustomNumberEditor(Long.class, true)); binder.registerCustomEditor( Double.class, new CustomNumberEditor(Double.class, true)); binder.registerCustomEditor( BigDecimal.class, new CustomNumberEditor( BigDecimal.class, new DecimalFormat("#,##0.00"), true)); binder.registerCustomEditor( Boolean.class, // new CustomBooleanEditor(false)); new CustomBooleanEditor(true)); binder.registerCustomEditor( Date.class, new CustomDateEditor(new SimpleDateFormat("dd/MM/yyyy"), true)); // binder.registerCustomEditor( // TerminiDto.class, // new TerminiTypeEditorHelper()); binder.registerCustomEditor( Object.class, new ObjectTypeEditorHelper()); } private static final Log logger = LogFactory.getLog(ExpedientIniciController.class); }