/**
*
*/
package net.conselldemallorca.helium.webapp.v3.controller;
import java.lang.reflect.InvocationTargetException;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
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.CampTipusDto;
import net.conselldemallorca.helium.v3.core.api.dto.ConsultaDto;
import net.conselldemallorca.helium.v3.core.api.dto.EstatDto;
import net.conselldemallorca.helium.v3.core.api.dto.ExpedientCamps;
import net.conselldemallorca.helium.v3.core.api.dto.ExpedientConsultaDissenyDto;
import net.conselldemallorca.helium.v3.core.api.dto.MostrarAnulatsDto;
import net.conselldemallorca.helium.v3.core.api.dto.PaginaDto;
import net.conselldemallorca.helium.v3.core.api.dto.TascaDadaDto;
import net.conselldemallorca.helium.webapp.v3.datatables.DatatablesPagina;
import net.conselldemallorca.helium.webapp.v3.helper.ObjectTypeEditorHelper;
import net.conselldemallorca.helium.webapp.v3.helper.PaginacioHelper;
import net.conselldemallorca.helium.webapp.v3.helper.SessionHelper;
import net.conselldemallorca.helium.webapp.v3.helper.SessionHelper.SessionManager;
import net.conselldemallorca.helium.webapp.v3.helper.TascaFormHelper;
import org.apache.commons.beanutils.PropertyUtils;
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;
/**
* Controlador per al llistat d'expedients.
*
* @author Limit Tecnologies <limit@limit.es>
*/
@Controller
@RequestMapping("/v3/expedient/consulta")
public class ExpedientConsultaLlistatController extends BaseExpedientController {
@ModelAttribute("expedientConsultaCommand")
public Object getFiltreCommand(
HttpServletRequest request,
Long consultaId) {
if (consultaId == null)
return null;
Object filtreCommand = SessionHelper.getAttribute(
request,
SessionHelper.VARIABLE_FILTRE_CONSULTA_TIPUS + consultaId);
if (filtreCommand != null) {
return filtreCommand;
}
Map<String, Object> campsAddicionals = new HashMap<String, Object>();
Map<String, Class<?>> campsAddicionalsClasses = new HashMap<String, Class<?>>();
campsAddicionals.put("consultaId", consultaId);
campsAddicionals.put("nomesMeves", false);
campsAddicionals.put("nomesAlertes", false);
campsAddicionals.put("mostrarAnulats", false);
campsAddicionals.put("nomesTasquesPersonals", false);
campsAddicionals.put("nomesTasquesGrup", false);
campsAddicionalsClasses.put("nomesMeves", Boolean.class);
campsAddicionalsClasses.put("nomesAlertes", Boolean.class);
campsAddicionalsClasses.put("mostrarAnulats", Boolean.class);
campsAddicionalsClasses.put("consultaId", Long.class);
campsAddicionalsClasses.put("nomesTasquesPersonals", Boolean.class);
campsAddicionalsClasses.put("nomesTasquesGrup", Boolean.class);
List<TascaDadaDto> campsFiltre = expedientService.findConsultaFiltre(consultaId);
return TascaFormHelper.getCommandBuitForCamps(
campsFiltre,
campsAddicionals,
campsAddicionalsClasses,
true);
}
@RequestMapping(value = "/{consultaId}", method = RequestMethod.GET)
public String get(
HttpServletRequest request,
@PathVariable Long consultaId,
Model model) {
ConsultaDto consulta = dissenyService.findConsulteById(consultaId);
model.addAttribute(
"consulta",
consulta);
model.addAttribute(
"campsFiltre",
expedientService.findConsultaFiltre(consultaId));
model.addAttribute(
"campsInforme",
expedientService.findConsultaInforme(consultaId));
model.addAttribute(
"campsInformeParams",
expedientService.findConsultaInformeParams(consultaId));
List<EstatDto> estats = dissenyService.findEstatByExpedientTipus(
consulta.getExpedientTipus().getId());
estats.add(
0,
new EstatDto(
0L,
"0",
getMessage(
request,
"expedient.consulta.iniciat")));
estats.add(
new EstatDto(
-1L,
"-1",
getMessage(
request,
"expedient.consulta.finalitzat")));
model.addAttribute(
"estats",
estats);
Object filtreCommand = getFiltreCommand(request, consultaId);
SessionHelper.setAttribute(
request,
SessionHelper.VARIABLE_FILTRE_CONSULTA_TIPUS + consultaId,
filtreCommand);
model.addAttribute("expedientConsultaCommand", filtreCommand);
return "v3/expedientConsultaLlistat";
}
@RequestMapping(value = "/{consultaId}", method = RequestMethod.POST)
public String post(
HttpServletRequest request,
@PathVariable Long consultaId,
@Valid @ModelAttribute("expedientConsultaCommand") Object filtreCommand,
BindingResult bindingResult,
@RequestParam(value = "accio", required = false) String accio,
Model model) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
if ("netejar".equals(accio)) {
SessionHelper.removeAttribute(request, SessionHelper.VARIABLE_FILTRE_CONSULTA_TIPUS + consultaId);
filtreCommand = getFiltreCommand(request, consultaId);
} else {
ConsultaDto consulta = dissenyService.findConsulteById(consultaId);
model.addAttribute(
"consulta",
consulta);
model.addAttribute(
"campsFiltre",
expedientService.findConsultaFiltre(consultaId));
model.addAttribute(
"campsInforme",
expedientService.findConsultaInforme(consultaId));
model.addAttribute(
"campsInformeParams",
expedientService.findConsultaInformeParams(consultaId));
List<EstatDto> estats = dissenyService.findEstatByExpedientTipus(
consulta.getExpedientTipus().getId());
estats.add(
0,
new EstatDto(
0L,
"0",
getMessage(
request,
"expedient.consulta.iniciat")));
estats.add(
new EstatDto(
-1L,
"-1",
getMessage(
request,
"expedient.consulta.finalitzat")));
model.addAttribute(
"estats",
estats);
}
SessionHelper.setAttribute(
request,
SessionHelper.VARIABLE_FILTRE_CONSULTA_TIPUS + consultaId,
filtreCommand);
model.addAttribute("expedientConsultaCommand", filtreCommand);
return "v3/expedientConsultaLlistat";
}
@RequestMapping(value = "/{consultaId}/datatable")
@ResponseBody
public DatatablesPagina<ExpedientConsultaDissenyDto> datatable(
HttpServletRequest request,
@PathVariable Long consultaId,
Model model) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
Object filtreCommand = SessionHelper.getAttribute(
request,
SessionHelper.VARIABLE_FILTRE_CONSULTA_TIPUS + consultaId);
List<TascaDadaDto> campsFiltre = expedientService.findConsultaFiltre(consultaId);
Map<String, Object> filtreValors = TascaFormHelper.getValorsFromCommand(
campsFiltre,
filtreCommand,
true);
PaginaDto<ExpedientConsultaDissenyDto> paginaExpedients = expedientService.consultaFindPaginat(
consultaId,
processarValorsFiltre(filtreCommand, campsFiltre, filtreValors),
null,
(Boolean)PropertyUtils.getSimpleProperty(filtreCommand, "nomesTasquesPersonals"),
(Boolean)PropertyUtils.getSimpleProperty(filtreCommand, "nomesTasquesGrup"),
(Boolean)PropertyUtils.getSimpleProperty(filtreCommand, "nomesMeves"),
(Boolean)PropertyUtils.getSimpleProperty(filtreCommand, "nomesAlertes"),
false, //nomesErrors
MostrarAnulatsDto.NO, //mostrarAnulats
PaginacioHelper.getPaginacioDtoFromDatatable(request));
SessionHelper.setAttribute(
request,
SessionHelper.VARIABLE_SESSIO_COMMAND_VALUES + consultaId,
filtreValors);
return PaginacioHelper.getPaginaPerDatatables(
request,
paginaExpedients);
}
@RequestMapping(value = "/{consultaId}/selection", method = RequestMethod.POST)
@ResponseBody
public Set<Long> selection(
HttpServletRequest request,
@PathVariable Long consultaId,
@RequestParam(value = "ids", required = false) String ids) {
SessionManager sessionManager = SessionHelper.getSessionManager(request);
Set<Long> seleccio = sessionManager.getSeleccioInforme(consultaId);
if (seleccio == null) {
seleccio = new HashSet<Long>();
sessionManager.setSeleccioInforme(seleccio, consultaId);
}
if (ids != null) {
String[] idsparts = (ids.contains(",")) ? ids.split(",") : new String[] {ids};
for (String id: idsparts) {
try {
long l = Long.parseLong(id.trim());
if (l >= 0) {
seleccio.add(l);
} else {
seleccio.remove(-l);
}
} catch (NumberFormatException ex) {}
}
}
return seleccio;
}
@RequestMapping(value = "/{consultaId}/selectionAll")
@ResponseBody
public Set<Long> selectionAll(
HttpServletRequest request,
@PathVariable Long consultaId) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
Object filtreCommand = getFiltreCommand(request, consultaId);
List<TascaDadaDto> dadesFiltre = expedientService.findConsultaFiltre(consultaId);
Map<String, Object> filtreValors = TascaFormHelper.getValorsFromCommand(
dadesFiltre,
filtreCommand,
true);
PaginaDto<Long> paginaIds = expedientService.consultaFindNomesIdsPaginat(
consultaId,
processarValorsFiltre(filtreCommand, dadesFiltre, filtreValors),
(Boolean)PropertyUtils.getSimpleProperty(filtreCommand, "nomesTasquesPersonals"),
(Boolean)PropertyUtils.getSimpleProperty(filtreCommand, "nomesTasquesGrup"),
(Boolean)PropertyUtils.getSimpleProperty(filtreCommand, "nomesMeves"),
(Boolean)PropertyUtils.getSimpleProperty(filtreCommand, "nomesAlertes"),
false, //nomesErrors
MostrarAnulatsDto.NO, //mostrarAnulats
PaginacioHelper.getPaginacioDtoTotsElsResultats());
List<Long> ids = paginaIds.getContingut();
SessionManager sessionManager = SessionHelper.getSessionManager(request);
Set<Long> seleccio = sessionManager.getSeleccioInforme(consultaId);
if (seleccio == null) {
seleccio = new HashSet<Long>();
sessionManager.setSeleccioInforme(seleccio, consultaId);
}
seleccio.clear();
seleccio.addAll(ids);
return seleccio;
}
@RequestMapping(value = "/{consultaId}/selectionNone")
@ResponseBody
public Set<Long> seleccioNetejar(
HttpServletRequest request,
@PathVariable Long consultaId) {
SessionManager sessionManager = SessionHelper.getSessionManager(request);
Set<Long> ids = sessionManager.getSeleccioInforme(consultaId);
ids.clear();
return ids;
}
@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("valorsBoolea")
public List<ParellaCodiValorDto> valorsBoolea(HttpServletRequest request) {
List<ParellaCodiValorDto> resposta = new ArrayList<ParellaCodiValorDto>();
resposta.add(new ParellaCodiValorDto("true", getMessage(request, "comuns.si")));
resposta.add(new ParellaCodiValorDto("false", getMessage(request, "comuns.no")));
return resposta;
}
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.setAutoGrowNestedPaths(false);
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 Map<String, Object> processarValorsFiltre(
Object filtreCommand,
List<TascaDadaDto> dadesFiltre,
Map<String, Object> valors) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
Map<String, Object> valorsPerService = new HashMap<String, Object>();
for (TascaDadaDto dada: dadesFiltre) {
String clau = (dada.getDefinicioProcesKey() == null) ? dada.getVarCodi() : dada.getDefinicioProcesKey() + "." + dada.getVarCodi();
clau = clau.replace(
ExpedientCamps.EXPEDIENT_PREFIX_JSP,
ExpedientCamps.EXPEDIENT_PREFIX);
if (CampTipusDto.BOOLEAN.equals(dada.getCampTipus()) && PropertyUtils.isReadable(filtreCommand, dada.getVarCodi())) {
Boolean valor = (Boolean) PropertyUtils.getSimpleProperty(
filtreCommand,
dada.getVarCodi());
valors.put(
dada.getVarCodi(),
valor);
}
valorsPerService.put(
clau,
valors.get(dada.getVarCodi()));
}
return valorsPerService;
}
}