/** * */ package net.conselldemallorca.helium.webapp.v3.controller; import java.io.UnsupportedEncodingException; import java.math.BigDecimal; import java.net.URLDecoder; import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.Date; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.validation.Valid; import net.conselldemallorca.helium.core.model.dto.ParellaCodiValorDto; import net.conselldemallorca.helium.v3.core.api.dto.CampAgrupacioDto; import net.conselldemallorca.helium.v3.core.api.dto.CampDto; import net.conselldemallorca.helium.v3.core.api.dto.ExpedientDadaDto; import net.conselldemallorca.helium.v3.core.api.dto.ExpedientDto; import net.conselldemallorca.helium.v3.core.api.dto.InstanciaProcesDto; import net.conselldemallorca.helium.v3.core.api.dto.TascaDadaDto; import net.conselldemallorca.helium.v3.core.api.exception.PermisDenegatException; import net.conselldemallorca.helium.v3.core.api.service.ExpedientService; import net.conselldemallorca.helium.webapp.v3.helper.MissatgesHelper; import net.conselldemallorca.helium.webapp.v3.helper.NodecoHelper; import net.conselldemallorca.helium.webapp.v3.helper.ObjectTypeEditorHelper; import net.conselldemallorca.helium.webapp.v3.helper.TascaFormHelper; import net.conselldemallorca.helium.webapp.v3.helper.TascaFormValidatorHelper; import org.apache.commons.beanutils.PropertyUtils; 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.annotation.ResponseBody; import org.springframework.web.bind.support.SessionStatus; /** * Controlador per a la pipella de dades de l'expedient. * * @author Limit Tecnologies <limit@limit.es> */ @Controller @RequestMapping("/v3/expedient") public class ExpedientDadaController extends BaseExpedientController { @Autowired private ExpedientService expedientService; @RequestMapping(value = "/{expedientId}/dada") public String dades( HttpServletRequest request, @PathVariable Long expedientId, Model model) { if (!NodecoHelper.isNodeco(request)) { return mostrarInformacioExpedientPerPipella( request, expedientId, model, "dades"); } omplirModelPipellaDades( expedientId, false, model); return "v3/expedientDades"; } @RequestMapping(value = "/{expedientId}/dadaAmbOcults") public String dadesAmbOcults( HttpServletRequest request, @PathVariable Long expedientId, Model model) { if (!NodecoHelper.isNodeco(request)) { return mostrarInformacioExpedientPerPipella( request, expedientId, model, "dades"); } omplirModelPipellaDades( expedientId, true, model); return "v3/expedientDades"; } private void omplirModelPipellaDades( Long expedientId, boolean ambOcults, Model model) { ExpedientDto expedient = expedientService.findAmbId(expedientId); // Obtenim l'arbre de processos, per a poder mostrar la informació de tots els processos List<InstanciaProcesDto> arbreProcessos = expedientService.getArbreInstanciesProces(Long.parseLong(expedient.getProcessInstanceId())); Map<InstanciaProcesDto, Map<CampAgrupacioDto, List<ExpedientDadaDto>>> dades = new LinkedHashMap<InstanciaProcesDto, Map<CampAgrupacioDto,List<ExpedientDadaDto>>>(); Map<InstanciaProcesDto,Integer> totalsPerProces = new LinkedHashMap<InstanciaProcesDto, Integer>(); // Per a cada instància de procés ordenem les dades per agrupació // (si no tenen agrupació les primeres) i per ordre alfabètic de la etiqueta for (InstanciaProcesDto instanciaProces: arbreProcessos) { Map<CampAgrupacioDto, List<ExpedientDadaDto>> dadesInstancia = null; if (instanciaProces.getId().equals(expedient.getProcessInstanceId())) { dadesInstancia = getDadesInstanciaProces( expedientId, instanciaProces.getId(), ambOcults); } dades.put(instanciaProces, dadesInstancia); int contadorTotals = 0; if(dadesInstancia != null) for(List<ExpedientDadaDto> list: dadesInstancia.values()){ contadorTotals += list.size(); } totalsPerProces.put(instanciaProces, contadorTotals); } model.addAttribute("inicialProcesInstanceId", expedient.getProcessInstanceId()); model.addAttribute("expedient", expedient); model.addAttribute("arbreProcessos", arbreProcessos); model.addAttribute("dades", dades); model.addAttribute("ambOcults", !expedient.isPermisAdministration() ? false : ambOcults); model.addAttribute("totalsPerProces", totalsPerProces); } @RequestMapping(value = "/{expedientId}/dades/{procesId}") public String dadesProces( HttpServletRequest request, @PathVariable Long expedientId, @PathVariable String procesId, @RequestParam(value = "ambOcults", required = false) Boolean ambOcults, Model model) { ExpedientDto expedient = expedientService.findAmbId(expedientId); model.addAttribute("expedient", expedient); ambOcults = (ambOcults == null || !expedient.isPermisAdministration()) ? false : ambOcults; model.addAttribute("ambOcults", ambOcults); Map<CampAgrupacioDto, List<ExpedientDadaDto>> dades = getDadesInstanciaProces(expedientId,procesId,ambOcults); model.addAttribute("dades",dades); // Map<InstanciaProcesDto,Integer> totalsPerProces = new LinkedHashMap<InstanciaProcesDto, Integer>(); // InstanciaProcesDto proces = expedientService.getInstanciaProcesById(procesId); int contadorTotals = 0; if(dades != null) for(List<ExpedientDadaDto> list: dades.values()){ contadorTotals += list.size(); } // totalsPerProces.put(proces, contadorTotals); model.addAttribute("contadorTotals", contadorTotals); model.addAttribute("procesId",procesId); return "v3/procesDades"; } @RequestMapping(value = "/{expedientId}/dades/{procesId}/delete/{varCodi}", method = RequestMethod.GET) @ResponseBody public boolean dadaBorrar( HttpServletRequest request, @PathVariable Long expedientId, @PathVariable String procesId, @PathVariable String varCodi, Model model) { try { expedientService.deleteVariable(expedientId, procesId, URLDecoder.decode(varCodi,"UTF-8")); MissatgesHelper.success(request, getMessage(request, "info.dada.proces.esborrada") ); return true; } catch (PermisDenegatException ex) { MissatgesHelper.error(request, getMessage(request, "expedient.info.permis.no") ); } catch (Exception ex) { MissatgesHelper.error(request, getMessage(request, "expedient.dada.borrar.error")); logger.error("S'ha produit un error al intentar eliminar la variable '" + varCodi + "' de l'expedient amb id '" + expedientId + "' (proces: " + procesId + ")", ex); } return false; } @ModelAttribute("modificarVariableCommand") public Object populateCommand( HttpServletRequest request, String procesId, String varCodi, Model model) { if (procesId != null && !"".equals(procesId) && varCodi != null && !"".equals(varCodi)) { try { Map<String, Object> campsAddicionals = new HashMap<String, Object>(); Map<String, Class<?>> campsAddicionalsClasses = new HashMap<String, Class<?>>(); // CampDto camp = null; // for (CampDto c : expedientService.getCampsInstanciaProcesById(procesId)){ // if (!CampTipusDto.ACCIO.equals(c.getTipus()) && varCodi.equals(c.getCodi())) { // camp = c; // } // } List<TascaDadaDto> llistTasca = new ArrayList<TascaDadaDto>(); TascaDadaDto tascaDada = expedientService.getTascaDadaDtoFromExpedientDadaDto( expedientService.getDadaPerInstanciaProces(procesId, varCodi, true)); llistTasca.add(tascaDada); model.addAttribute("procesId", procesId); model.addAttribute("varCodi", varCodi); model.addAttribute("dada", tascaDada); return TascaFormHelper.getCommandForCamps( llistTasca, null, campsAddicionals, campsAddicionalsClasses, false); } catch (Exception ex) { MissatgesHelper.error(request, ex.getMessage()); logger.error("No s'ha pogut obtenir la informació de la dada " + varCodi + ": " + ex.getMessage(), ex); } //catch (Exception ignored) {} } return null; } @RequestMapping(value = "/{expedientId}/dades/{procesId}/edit/{varCodi}", method = RequestMethod.GET) public String modificarVariablesGet( HttpServletRequest request, @PathVariable Long expedientId, @PathVariable String procesId, @PathVariable String varCodi, Model model) { Object command; try { command = populateCommand(request, procesId, URLDecoder.decode(varCodi,"UTF-8"), model); model.addAttribute("modificarVariableCommand", command); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return "v3/expedientDadaModificar"; } @RequestMapping(value = "/{expedientId}/dades/{procesId}/edit/{varCodi}", method = RequestMethod.POST) public String dadaEditar( HttpServletRequest request, @PathVariable Long expedientId, @PathVariable String procesId, @PathVariable String varCodi, @Valid @ModelAttribute("modificarVariableCommand") Object command, BindingResult result, SessionStatus status, Model model) { try { List<TascaDadaDto> tascaDades = new ArrayList<TascaDadaDto>(); TascaDadaDto tascaDada = TascaFormHelper.toTascaDadaDto(expedientService.getDadaPerInstanciaProces(procesId, varCodi, true)); tascaDades.add(tascaDada); Map<String, Object> variables = TascaFormHelper.getValorsFromCommand(tascaDades, command, false); Object varValue = variables.get(varCodi); TascaFormValidatorHelper validator = new TascaFormValidatorHelper( expedientService, tascaDades); Map<String, Object> campsAddicionals = new HashMap<String, Object>(); Map<String, Class<?>> campsAddicionalsClasses = new HashMap<String, Class<?>>(); Object commandValidar = TascaFormHelper.getCommandForCamps( tascaDades, variables, campsAddicionals, campsAddicionalsClasses, false); validator.setValidarExpresions(false); validator.setValidarObligatoris(true); validator.validate(commandValidar, result); if (result.hasErrors()) { return "v3/expedientDadaModificar"; } expedientService.updateVariable(expedientId, procesId, varCodi, varValue); MissatgesHelper.success(request, getMessage(request, "info.dada.proces.modificada") ); } catch (PermisDenegatException ex) { MissatgesHelper.error(request, getMessage(request, "expedient.info.permis.no") ); } catch (Exception ex) { MissatgesHelper.error(request, getMessage(request, "expedient.dada.modificar.error")); logger.error("S'ha produit un error al intentar modificar la variable '" + varCodi + "' de l'expedient amb id '" + expedientId + "' (proces: " + procesId + ")", ex); } return modalUrlTancar(false); } @ModelAttribute("listTerminis") public List<ParellaCodiValorDto> valors12(HttpServletRequest request) { List<ParellaCodiValorDto> resposta = new ArrayList<ParellaCodiValorDto>(); for (int i=0; i <= 12 ; i++) resposta.add(new ParellaCodiValorDto(String.valueOf(i), i)); return resposta; } @ModelAttribute("addVariableCommand") public Object populateAddCommand( HttpServletRequest request, String procesId, String varCodi, String codi, String valor, Model model) { if (procesId != null && !"".equals(procesId)) { try { model.addAttribute("procesId", procesId); model.addAttribute("varCodi", varCodi); Map<String, Object> campsAddicionals = new HashMap<String, Object>(); campsAddicionals.put("codi", codi); campsAddicionals.put("valor", valor); campsAddicionals.put("varCodi", varCodi); Map<String, Class<?>> campsAddicionalsClasses = new HashMap<String, Class<?>>(); campsAddicionalsClasses.put("codi", String.class); campsAddicionalsClasses.put("valor", String.class); campsAddicionalsClasses.put("varCodi", String.class); // List<TascaDadaDto> llistTasca = expedientService.findDadesTascaPerInstanciaProces(procesId); List<TascaDadaDto> llistTasca = new ArrayList<TascaDadaDto>(); if (varCodi != null && !"".equals(varCodi)) { TascaDadaDto tascaDada = expedientService.getTascaDadaDtoFromExpedientDadaDto( expedientService.getDadaPerInstanciaProces(procesId, varCodi, true)); llistTasca.add(tascaDada); model.addAttribute("dada", tascaDada); } // Map<String, Object> registres = new HashMap<String, Object>(); // return TascaFormHelper.getCommandModelForCamps(llistTasca, campsAddicionalsClasses, registres, false); // return TascaFormHelper.getCommandForCamps(llistTasca, null, campsAddicionals, campsAddicionalsClasses, false); return TascaFormHelper.getCommandBuitForCamps( llistTasca, campsAddicionals, campsAddicionalsClasses, false); } catch (Exception ex) { MissatgesHelper.error(request, ex.getMessage()); logger.error("No s'ha pogut obtenir la informació de la dada " + varCodi + ": " + ex.getMessage(), ex); } //catch (Exception ignored) {} } return null; } @RequestMapping(value = "/{expedientId}/novaDada/{procesId}", method = RequestMethod.GET) public String novaDadaGet( HttpServletRequest request, @PathVariable Long expedientId, @PathVariable String procesId, Model model) { return novaDadaAmbCodiGet( request, expedientId, procesId, null, model); } @RequestMapping(value = "/{expedientId}/novaDada/{procesId}/{varCodi}", method = RequestMethod.GET) public String novaDadaAmbCodiGet( HttpServletRequest request, @PathVariable Long expedientId, @PathVariable String procesId, @PathVariable String varCodi, Model model) { model.addAttribute("camps", getCampsNoUtilitzats(expedientId, procesId)); model.addAttribute("addVariableCommand", populateAddCommand(request, procesId, varCodi, null, null, model)); if (varCodi == null) return "v3/expedientDadaNova"; return "v3/expedientDadaNova"; } @RequestMapping(value = "/{expedientId}/novaDada/{procesId}/{varCodi}", method = RequestMethod.POST) public String novaDadaDesar( HttpServletRequest request, @PathVariable Long expedientId, @PathVariable String procesId, @PathVariable String varCodi, @Valid @ModelAttribute("addVariableCommand") Object command, BindingResult result, SessionStatus status, Model model) { try { if ("Buit".equals(varCodi)) { result.rejectValue("varCodi", "expedient.nova.data.camp.variable.buit"); } // Variable nova tipus String else if ("String".equals(varCodi)) { String codi = (String)PropertyUtils.getSimpleProperty(command, "codi"); String valor = (String)PropertyUtils.getSimpleProperty(command, "valor"); // Validam que el nom de la variable no comenci per majúscula seguida de minúscula if (codi == null) { result.rejectValue("codi", "error.camp.codi.buit"); } else { if (codi.matches("^[A-Z]{1}[a-z]{1}.*")) { result.rejectValue("codi", "error.camp.codi.maymin"); } if (codi.contains(".")) { result.rejectValue("codi", "error.camp.codi.char.nok"); } if (codi.contains(" ")) { result.rejectValue("codi", "error.camp.codi.char.espai"); } if (!result.hasErrors()) { expedientService.createVariable(expedientId, procesId, codi, valor); } } } // Variable de la definició de procés else { List<TascaDadaDto> tascaDades = new ArrayList<TascaDadaDto>(); TascaDadaDto tascaDada = TascaFormHelper.toTascaDadaDto(expedientService.getDadaPerInstanciaProces(procesId, varCodi, true)); tascaDades.add(tascaDada); Map<String, Object> variables = TascaFormHelper.getValorsFromCommand(tascaDades, command, false); Map<String, Object> campsAddicionals = new HashMap<String, Object>(); Map<String, Class<?>> campsAddicionalsClasses = new HashMap<String, Class<?>>(); Object commandValidar = TascaFormHelper.getCommandForCamps( tascaDades, variables, campsAddicionals, campsAddicionalsClasses, false); TascaFormValidatorHelper validator = new TascaFormValidatorHelper( expedientService, tascaDades); validator.setValidarExpresions(false); validator.setValidarObligatoris(true); validator.validate(commandValidar, result); if (!result.hasErrors()) { Object varValue = variables.get(varCodi); expedientService.createVariable(expedientId, procesId, varCodi, varValue); } } if (result.hasErrors()) { model.addAttribute("camps", getCampsNoUtilitzats(expedientId, procesId)); return "v3/expedientDadaNova"; } MissatgesHelper.success(request, getMessage(request, "info.dada.nova.proces.creada") ); } catch (PermisDenegatException ex) { MissatgesHelper.error(request, getMessage(request, "expedient.info.permis.no") ); } catch (Exception ex) { MissatgesHelper.error(request, getMessage(request, "expedient.dada.modificar.error")); logger.error("S'ha produit un error al intentar modificar la variable '" + varCodi + "' de l'expedient amb id '" + expedientId + "' (proces: " + procesId + ")", ex); } return modalUrlTancar(false); } @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(true)); binder.registerCustomEditor( Date.class, new CustomDateEditor(new SimpleDateFormat("dd/MM/yyyy"), true)); binder.registerCustomEditor( Object.class, new ObjectTypeEditorHelper()); } private List<CampDto> getCampsNoUtilitzats(Long expedientId, String procesId) { InstanciaProcesDto instanciaProces = expedientService.getInstanciaProcesById(procesId); List<CampDto> campsNoUtilitzats = new ArrayList<CampDto>(); List<CampDto> camps = dissenyService.findCampsAmbDefinicioProcesOrdenatsPerCodi(instanciaProces.getDefinicioProces().getId()); List<ExpedientDadaDto> dadesInstancia = expedientService.findDadesPerInstanciaProces(expedientId, procesId); if (dadesInstancia != null) { Collections.sort( dadesInstancia, new Comparator<ExpedientDadaDto>() { public int compare(ExpedientDadaDto d1, ExpedientDadaDto d2) { return d1.getVarCodi().compareToIgnoreCase(d2.getVarCodi()); } } ); int i = 0; for(CampDto camp: camps) { while (i < (dadesInstancia.size() - 1) && camp.getCodi().compareToIgnoreCase(dadesInstancia.get(i).getVarCodi()) > 0) i++; if (dadesInstancia.isEmpty() || !camp.getCodi().equals(dadesInstancia.get(i).getVarCodi())) { campsNoUtilitzats.add(camp); } else if (i < (dadesInstancia.size() - 1)){ i++; } } return campsNoUtilitzats; } else { return camps; } } private Map<CampAgrupacioDto, List<ExpedientDadaDto>> getDadesInstanciaProces( Long expedientId, String instaciaProcesId, boolean ambOcults) { // definirem un mapa. La clau serà el nom de l'agrupació, i el valor el llistat de variables de l'agrupació Map<CampAgrupacioDto, List<ExpedientDadaDto>> dadesProces = new LinkedHashMap<CampAgrupacioDto, List<ExpedientDadaDto>>(); // Obtenim les dades de la definició de procés List<ExpedientDadaDto> dadesInstancia = expedientService.findDadesPerInstanciaProces(expedientId, instaciaProcesId); if (dadesInstancia == null || dadesInstancia.isEmpty()) return null; // Obtenim les agrupacions de la definició de procés // Les posam amb un map per a que obtenir el nom sigui directe List<CampAgrupacioDto> agrupacions = expedientService.findAgrupacionsDadesPerInstanciaProces(expedientId, instaciaProcesId); final Map<Long,CampAgrupacioDto> magrupacions = new HashMap<Long, CampAgrupacioDto>(); for (CampAgrupacioDto agrupacio : agrupacions) { magrupacions.put(agrupacio.getId(), agrupacio); } // Ordenem les dadesInstancia per ordre d'agrupació Collections.sort( dadesInstancia, new Comparator<ExpedientDadaDto>() { public int compare(ExpedientDadaDto d1, ExpedientDadaDto d2) { if (d1.getAgrupacioId() == null && d2.getAgrupacioId() == null) return 0; if (d1.getAgrupacioId() == null ^ d2.getAgrupacioId() == null) return (d1.getAgrupacioId() == null ? -1 : 1); int c = magrupacions.get(d1.getAgrupacioId()).getOrdre() - magrupacions.get(d2.getAgrupacioId()).getOrdre(); if (c != 0) return c; else return d1.getCampEtiqueta().compareToIgnoreCase(d2.getCampEtiqueta()); } } ); magrupacions.put(null, null); Long agrupacioId = null; List<ExpedientDadaDto> dadesAgrupacio = new ArrayList<ExpedientDadaDto>(); for (ExpedientDadaDto dada: dadesInstancia) { if (ambOcults || !dada.isCampOcult()) { if ((agrupacioId == null && dada.getAgrupacioId() == null) || dada.getAgrupacioId().equals(agrupacioId)) { dadesAgrupacio.add(dada); } else { if (!dadesAgrupacio.isEmpty()) { if (magrupacions.get(agrupacioId) != null) Collections.sort( dadesAgrupacio, new Comparator<ExpedientDadaDto>() { public int compare(ExpedientDadaDto d1, ExpedientDadaDto d2) { return d1.getOrdre() - d2.getOrdre(); } }); dadesProces.put(magrupacions.get(agrupacioId), dadesAgrupacio); dadesAgrupacio = new ArrayList<ExpedientDadaDto>(); } agrupacioId = dada.getAgrupacioId(); dadesAgrupacio.add(dada); } } } dadesProces.put(magrupacions.get(agrupacioId), dadesAgrupacio); return dadesProces; } private static final Log logger = LogFactory.getLog(ExpedientDadaController.class); }