/**
*
*/
package net.conselldemallorca.helium.webapp.mvc;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import net.conselldemallorca.helium.core.model.dto.ExpedientDto;
import net.conselldemallorca.helium.core.model.dto.PortasignaturesPendentDto;
import net.conselldemallorca.helium.core.model.hibernate.Entorn;
import net.conselldemallorca.helium.core.model.hibernate.Estat;
import net.conselldemallorca.helium.core.model.hibernate.ExpedientTipus;
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.security.ExtendedPermission;
import net.conselldemallorca.helium.v3.core.api.service.ExpedientService.FiltreAnulat;
import net.conselldemallorca.helium.webapp.mvc.util.BaseController;
import net.conselldemallorca.helium.webapp.mvc.util.PaginatedList;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.displaytag.properties.SortOrderEnum;
import org.json.simple.JSONArray;
import org.json.simple.JSONValue;
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.annotation.ResponseBody;
import org.springframework.web.bind.support.SessionStatus;
/**
* Controlador per la gestiĆ³ d'expedients
*
* @author Limit Tecnologies <limit@limit.es>
*/
@Controller
public class ExpedientConsultaController extends BaseController {
public static final String VARIABLE_SESSIO_COMMAND = "consultaExpedientsCommand";
private DissenyService dissenyService;
private ExpedientService expedientService;
private PermissionService permissionService;
@Autowired
public ExpedientConsultaController(
DissenyService dissenyService,
ExpedientService expedientService,
PermissionService permissionService) {
this.dissenyService = dissenyService;
this.expedientService = expedientService;
this.permissionService = permissionService;
}
@ModelAttribute("expedientTipus")
public List<ExpedientTipus> populateExpedientTipus(
HttpServletRequest request) {
Entorn entorn = getEntornActiu(request);
if (entorn != null) {
List<ExpedientTipus> tipus = dissenyService.findExpedientTipusAmbEntornOrdenat(entorn.getId(), "nom");
permissionService.filterAllowed(
tipus,
ExpedientTipus.class,
new Permission[] {
ExtendedPermission.ADMINISTRATION,
ExtendedPermission.SUPERVISION,
ExtendedPermission.READ});
return tipus;
}
return null;
}
// @ModelAttribute("expedientTipusAdmin")
// public Map<Long, Boolean> populateExpedientTipusAdmin(
// HttpServletRequest request) {
// Entorn entorn = getEntornActiu(request);
// Map<Long, Boolean> mExpedientTipusAdmin = new HashMap<Long, Boolean>();
// if (entorn != null) {
// List<ExpedientTipus> tipus = dissenyService.findExpedientTipusAmbEntornOrdenat(entorn.getId(), "nom");
// for (ExpedientTipus expedientTipus: tipus) {
// if (potAdministratExpedientTipus(expedientTipus))
// mExpedientTipusAdmin.put(expedientTipus.getId(), true);
// else
// mExpedientTipusAdmin.put(expedientTipus.getId(), false);
// }
// return mExpedientTipusAdmin;
// }
// return null;
// }
@ModelAttribute("filtreAnulats")
public FiltreAnulat[] populateFiltreAnulats() {
return FiltreAnulat.values();
}
@SuppressWarnings({ "rawtypes", "unchecked" })
@RequestMapping(value = "/expedient/consultaPermis")
@ResponseBody
public String consultaPermis(
HttpServletRequest request,
@RequestParam(value = "id", required = false) Long id,
ModelMap model) {
Map mjson = new LinkedHashMap();
Entorn entorn = getEntornActiu(request);
if (entorn != null) {
if (permissionService.filterAllowed(
entorn,
Entorn.class,
new Permission[] {ExtendedPermission.ADMINISTRATION}) != null) {
mjson.put("permis", true);
return JSONValue.toJSONString(mjson);
}
if (id != null) {
ExpedientTipus expedientTipus = dissenyService.getExpedientTipusById(id);
if (potAdministratExpedientTipus(expedientTipus)) {
mjson.put("permis", true);
return JSONValue.toJSONString(mjson);
}
}
}
mjson.put("permis", false);
return JSONValue.toJSONString(mjson);
}
@SuppressWarnings("unchecked")
@RequestMapping(value = "/expedient/consulta", method = RequestMethod.GET)
public String consultaGet(
HttpServletRequest request,
@RequestParam(value = "page", required = false) String page,
@RequestParam(value = "sort", required = false) String sort,
@RequestParam(value = "dir", required = false) String dir,
HttpSession session,
ModelMap model) {
Entorn entorn = getEntornActiu(request);
if (entorn != null) {
ExpedientConsultaGeneralCommand command = (ExpedientConsultaGeneralCommand)session.getAttribute(VARIABLE_SESSIO_COMMAND);
if (command != null) {
PaginatedList pagina = getPaginaExpedients(
entorn,
command,
page,
sort,
dir);
List<String> piis = new ArrayList<String>();
for (ExpedientDto expedient: (List<ExpedientDto>)pagina.getList())
piis.add(expedient.getProcessInstanceId());
if (command.getExpedientTipus() != null) {
command.setMassivaActiu(true);
} else {
command.setMassivaActiu(false);
}
model.addAttribute("command", command);
model.addAttribute("llistat", pagina);
model.addAttribute("piis", piis);
} else {
command = new ExpedientConsultaGeneralCommand();
model.addAttribute("command", command);
}
List<Estat> estats;
if (command != null && command.getExpedientTipus() != null)
estats = dissenyService.findEstatAmbExpedientTipus(command.getExpedientTipus().getId());
else
estats = new ArrayList<Estat>();
afegirEstatsInicialIFinal(estats);
model.addAttribute("estats", estats);
return "expedient/consulta";
} else {
missatgeError(request, getMessage("error.no.entorn.selec") );
return "redirect:/index.html";
}
}
@RequestMapping(value = "/expedient/limpiarTrazaError.html", method = RequestMethod.POST)
public String limpiarTrazaError(
HttpServletRequest request,
@RequestParam(value = "objectsPerPage", required = false) String objectsPerPage,
@RequestParam(value = "processInstanceId", required = false) String id,
ModelMap model) {
expedientService.updateExpedientError(id, null, null);
return "redirect:/expedient/consulta.html?objectsPerPage=" + objectsPerPage;
}
@RequestMapping(value = "/expedient/consulta", method = RequestMethod.POST)
public String consultaPost(
HttpServletRequest request,
HttpSession session,
@RequestParam(value = "submit", required = false) String submit,
@RequestParam(value = "objectsPerPage", required = false) String objectsPerPage,
@ModelAttribute("command") ExpedientConsultaGeneralCommand command,
BindingResult result,
SessionStatus status,
ModelMap model) {
Entorn entorn = getEntornActiu(request);
if (entorn != null) {
// if ("massiva".equals(submit)) {
// command.setMassivaActiu(true);
// } else if ("nomassiva".equals(submit)) {
// command.setMassivaActiu(false);
// request.getSession().removeAttribute(ExpedientMassivaController.VARIABLE_SESSIO_IDS_MASSIUS);
// }
if (command.isMassivaActiu() && command.getExpedientTipus() == null) {
//command.setMassivaActiu(false);
missatgeError(request, getMessage("error.no.tiexep.selec"));
return "redirect:/expedient/consulta.html?objectsPerPage=" + objectsPerPage;
}
if ("submit".equals(submit)) { //|| "massiva".equals(submit) || "nomassiva".equals(submit)) {
session.setAttribute(VARIABLE_SESSIO_COMMAND, command);
return "redirect:/expedient/consulta.html?objectsPerPage=" + objectsPerPage;
} else if ("clean".equals(submit)) {
session.removeAttribute(VARIABLE_SESSIO_COMMAND);
request.getSession().removeAttribute(ExpedientMassivaController.VARIABLE_SESSIO_IDS_MASSIUS);
return "redirect:/expedient/consulta.html?objectsPerPage=" + objectsPerPage;
}
return "expedient/consulta";
} else {
missatgeError(request, getMessage("error.no.entorn.selec"));
return "redirect:/index.html";
}
}
@SuppressWarnings({ "rawtypes", "unchecked" })
@RequestMapping(value = "/expedient/consultaEstats")
public String consultaEstats(
HttpServletRequest request,
@RequestParam(value = "id", required = false) Long id,
ModelMap model) {
Entorn entorn = getEntornActiu(request);
if (entorn != null) {
List<Estat> estats;
JSONArray ljson = new JSONArray();
if (id != null)
estats = dissenyService.findEstatAmbExpedientTipus(id);
else
estats = new ArrayList<Estat>();
afegirEstatsInicialIFinal(estats);
try {
for (Estat estat : estats) {
Map mjson = new LinkedHashMap();
mjson.put("id", estat.getId());
mjson.put("nom", JSONValue.escape(estat.getNom()));
ljson.add(mjson);
}
} catch (Exception ex) {
logger.error("Error al parsear la lista de estados como JSON. ID: " + id, ex);
}
model.addAttribute("estats", ljson);
return "expedient/consultaEstats";
} else {
missatgeError(request, getMessage("error.no.entorn.selec") );
return "redirect:/index.html";
}
}
@RequestMapping(value = "/expedient/pendentPsigna")
public String consultaPendentPsigna(
HttpServletRequest request,
@RequestParam(value = "id", required = false) Long id,
ModelMap model) {
Entorn entorn = getEntornActiu(request);
if (entorn != null) {
List<PortasignaturesPendentDto> pendents = expedientService.findAmbEntornPendentPsigna(
entorn.getId());
model.addAttribute("llistat", pendents);
return "expedient/pendentPsigna";
} else {
missatgeError(request, getMessage("error.no.entorn.selec") );
return "redirect:/index.html";
}
}
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.registerCustomEditor(
ExpedientTipus.class,
new ExpedientTipusTypeEditor(dissenyService));
binder.registerCustomEditor(
Date.class,
new CustomDateEditor(new SimpleDateFormat("dd/MM/yyyy"), true));
}
public void afegirEstatsInicialIFinal(List<Estat> estats) {
Estat iniciat = new Estat();
iniciat.setId(new Long(0));
iniciat.setNom( getMessage("expedient.consulta.iniciat") );
estats.add(0, iniciat);
Estat finalitzat = new Estat();
finalitzat.setId(new Long(-1));
finalitzat.setNom( getMessage("expedient.consulta.finalitzat") );
estats.add(finalitzat);
}
private PaginatedList getPaginaExpedients(
Entorn entorn,
ExpedientConsultaGeneralCommand command,
String page,
String sort,
String dir) {
boolean iniciat = false;
boolean finalitzat = false;
Long estatId = null;
if (command.getEstat() != null) {
iniciat = (command.getEstat() == 0);
finalitzat = (command.getEstat() == -1);
estatId = (!iniciat && !finalitzat) ? command.getEstat() : null;
}
int maxResults = command.getObjectsPerPage();
int pagina = (page != null) ? new Integer(page).intValue() : 1;
int firstRow = (pagina - 1) * maxResults;
boolean isAsc = (dir == null) || "asc".equals(dir);
// Si no s'especifica columna per cercar ordena en sentit descendent
if (sort == null || sort.length() == 0)
isAsc = false;
//
PaginatedList paginatedList = new PaginatedList();
paginatedList.setFullListSize(expedientService.countAmbEntornConsultaGeneral(
entorn.getId(),
command.getTitol(),
command.getNumero(),
command.getDataInici1(),
command.getDataInici2(),
(command.getExpedientTipus() != null) ? command.getExpedientTipus().getId() : null,
estatId,
iniciat,
finalitzat,
command.getGeoPosX(),
command.getGeoPosY(),
command.getGeoReferencia(),
command.isMostrarAnulats()));
paginatedList.setObjectsPerPage(maxResults);
paginatedList.setPageNumber(pagina);
paginatedList.setSortCriterion(sort);
paginatedList.setSortDirection((isAsc) ? SortOrderEnum.ASCENDING : SortOrderEnum.DESCENDING);
List<ExpedientDto> expedients = expedientService.findAmbEntornConsultaGeneralPaginat(
entorn.getId(),
command.getTitol(),
command.getNumero(),
command.getDataInici1(),
command.getDataInici2(),
(command.getExpedientTipus() != null) ? command.getExpedientTipus().getId() : null,
estatId,
iniciat,
finalitzat,
command.getGeoPosX(),
command.getGeoPosY(),
command.getGeoReferencia(),
command.isMostrarAnulats(),
firstRow,
maxResults,
sort,
isAsc);
paginatedList.setList(expedients);
return paginatedList;
}
private boolean potAdministratExpedientTipus(ExpedientTipus expedientTipus) {
return permissionService.filterAllowed(
expedientTipus,
ExpedientTipus.class,
new Permission[] { ExtendedPermission.ADMINISTRATION,
ExtendedPermission.WRITE}) != null;
}
private static final Log logger = LogFactory.getLog(ExpedientConsultaController.class);
}