/**
*
*/
package net.conselldemallorca.helium.webapp.mvc;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import net.conselldemallorca.helium.core.model.dto.PaginaLlistatDto;
import net.conselldemallorca.helium.core.model.dto.TascaLlistatDto;
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.PermissionService;
import net.conselldemallorca.helium.core.model.service.TascaService;
import net.conselldemallorca.helium.core.model.service.TerminiService;
import net.conselldemallorca.helium.core.security.ExtendedPermission;
import net.conselldemallorca.helium.webapp.mvc.util.BaseController;
import net.conselldemallorca.helium.webapp.mvc.util.PaginatedList;
import org.displaytag.properties.SortOrderEnum;
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.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;
/**
* Controlador per a mostrar els llistats de tasques pendents
*
* @author Limit Tecnologies <limit@limit.es>
*/
@Controller
public class TascaLlistatController extends BaseController {
private static final String SESSION_ATTRIBUTE_CURRENT_SORT_PERSONA = "TascaLlistatController.persona.current.sort";
private static final String SESSION_ATTRIBUTE_CURRENT_DIR_PERSONA = "TascaLlistatController.persona.current.dir";
private static final String SESSION_ATTRIBUTE_CURRENT_SORT_GRUP = "TascaLlistatController.grup.current.sort";
private static final String SESSION_ATTRIBUTE_CURRENT_DIR_GRUP = "TascaLlistatController.grup.current.dir";
private TascaService tascaService;
private TerminiService terminiService;
private DissenyService dissenyService;
private PermissionService permissionService;
@Autowired
public TascaLlistatController(
TascaService tascaService,
TerminiService terminiService,
DissenyService dissenyService,
PermissionService permissionService) {
this.tascaService = tascaService;
this.terminiService = terminiService;
this.dissenyService = dissenyService;
this.permissionService = permissionService;
}
@ModelAttribute("prioritats")
public List<HashMap<String, Object>> populateEstats(HttpServletRequest request) {
List<HashMap<String, Object>> resposta = new ArrayList<HashMap<String,Object>>();
HashMap<String, Object> moltAlta = new HashMap<String, Object>();
moltAlta.put("value", 2);
moltAlta.put("label", getMessage("txt.m_alta") );
resposta.add(moltAlta);
HashMap<String, Object> alta = new HashMap<String, Object>();
alta.put("value", 1);
alta.put("label", getMessage("txt.alta") );
resposta.add(alta);
HashMap<String, Object> normal = new HashMap<String, Object>();
normal.put("value", 0);
normal.put("label", getMessage("txt.normal") );
resposta.add(normal);
HashMap<String, Object> baixa = new HashMap<String, Object>();
baixa.put("value", -1);
baixa.put("label", getMessage("txt.baixa") );
resposta.add(baixa);
HashMap<String, Object> moltBaixa = new HashMap<String, Object>();
moltBaixa.put("value", -2);
moltBaixa.put("label", getMessage("txt.m_baixa") );
resposta.add(moltBaixa);
return resposta;
}
@ModelAttribute("commandPersonaFiltre")
public TascaFiltreCommand populateCommandPersonaFiltre(HttpServletRequest request) {
Object tascaPersonaFiltreCommand = request.getSession().getAttribute("commandTascaPersonaFiltre");
if (tascaPersonaFiltreCommand != null)
return (TascaFiltreCommand)tascaPersonaFiltreCommand;
else
return new TascaFiltreCommand();
}
@ModelAttribute("commandGrupFiltre")
public TascaFiltreCommand populateCommandGrupFiltre(HttpServletRequest request) {
Object tascaGrupFiltreCommand = request.getSession().getAttribute("commandTascaGrupFiltre");
if (tascaGrupFiltreCommand != null)
return (TascaFiltreCommand)tascaGrupFiltreCommand;
else
return new TascaFiltreCommand();
}
@SuppressWarnings("unchecked")
@RequestMapping(value = "/tasca/personaLlistat", method = RequestMethod.GET)
public String personaLlistatGet(
HttpServletRequest request,
@RequestParam(value = "page", required = false) String page,
@RequestParam(value = "sort", required = false) String sort,
@RequestParam(value = "dir", required = false) String dir,
@RequestParam(value = "objectsPerPage", required = false) String objectsPerPage,
ModelMap model) {
Entorn entorn = getEntornActiu(request);
if (entorn != null) {
String sortCalculat = sort;
if (sort != null && sort.length() > 0) {
request.getSession().setAttribute(
SESSION_ATTRIBUTE_CURRENT_SORT_PERSONA,
sort);
} else {
String sortSessio = (String)request.getSession().getAttribute(SESSION_ATTRIBUTE_CURRENT_SORT_PERSONA);
if (sortSessio != null)
sortCalculat = sortSessio;
}
String dirCalculat = dir;
if (dir != null && dir.length() > 0) {
request.getSession().setAttribute(
SESSION_ATTRIBUTE_CURRENT_DIR_PERSONA,
dir);
} else {
String dirSessio = (String)request.getSession().getAttribute(SESSION_ATTRIBUTE_CURRENT_DIR_PERSONA);
if (dirSessio != null)
dirCalculat = dirSessio;
}
TascaFiltreCommand tascaPersonaFiltreCommand = (TascaFiltreCommand)model.get("commandPersonaFiltre");
request.getSession().setAttribute("commandTascaPersonaFiltre", tascaPersonaFiltreCommand);
String expedient = request.getParameter("exp");
try{
byte[] exped = expedient.getBytes("ISO-8859-1");
String expeNT = new String(exped);
if (expedient != null) tascaPersonaFiltreCommand.setExpedient(expeNT);
}catch(Exception e){
e.getStackTrace();
}
PaginatedList pagina = getPaginaTasquesPersonals(
entorn,
tascaPersonaFiltreCommand,
page,
sortCalculat,
dirCalculat,
objectsPerPage);
model.addAttribute("personaLlistat", pagina);
model.addAttribute("personaLlistatCount", pagina.getFullListSize());
model.addAttribute(
"terminisIniciats",
findTerminisIniciatsPerTasques(
(List<TascaLlistatDto>)pagina.getList()));
model.addAttribute("command", tascaPersonaFiltreCommand);
model.addAttribute("tipusExp", llistatExpedientTipusAmbPermisos(entorn));
// Asignamos los valores del filtro a la pestaña de grup
model.addAttribute("grupLlistatCount", getPaginaTasquesCountGrup(entorn,tascaPersonaFiltreCommand,objectsPerPage));
request.getSession().setAttribute("commandTascaGrupFiltre", tascaPersonaFiltreCommand);
return "tasca/personaLlistat";
} else {
missatgeError(request, getMessage("error.no.entorn.selec") );
return "redirect:/index.html";
}
}
@RequestMapping(value = "/tasca/personaLlistat", method = RequestMethod.POST)
public String personaLlistatPost(
HttpServletRequest request,
@RequestParam(value = "submit", required = false) String submit,
@ModelAttribute("commandPersonaFiltre") TascaFiltreCommand command) {
if ("submit".equals(submit)) {
request.getSession().setAttribute("commandTascaPersonaFiltre", command);
} else if ("clean".equals(submit)) {
request.getSession().removeAttribute("commandTascaPersonaFiltre");
}
return "redirect:/tasca/personaLlistat.html";
}
@SuppressWarnings("unchecked")
@RequestMapping(value = "/tasca/grupLlistat", method = RequestMethod.GET)
public String grupLlistatGet(
HttpServletRequest request,
@RequestParam(value = "page", required = false) String page,
@RequestParam(value = "sort", required = false) String sort,
@RequestParam(value = "dir", required = false) String dir,
@RequestParam(value = "objectsPerPage", required = false) String objectsPerPage,
ModelMap model) {
Entorn entorn = getEntornActiu(request);
if (entorn != null) {
String sortCalculat = sort;
if (sort != null && sort.length() > 0) {
request.getSession().setAttribute(
SESSION_ATTRIBUTE_CURRENT_SORT_GRUP,
sort);
} else {
String sortSessio = (String)request.getSession().getAttribute(SESSION_ATTRIBUTE_CURRENT_SORT_GRUP);
if (sortSessio != null)
sortCalculat = sortSessio;
}
String dirCalculat = dir;
if (dir != null && dir.length() > 0) {
request.getSession().setAttribute(
SESSION_ATTRIBUTE_CURRENT_DIR_GRUP,
dir);
} else {
String dirSessio = (String)request.getSession().getAttribute(SESSION_ATTRIBUTE_CURRENT_DIR_GRUP);
if (dirSessio != null)
dirCalculat = dirSessio;
}
TascaFiltreCommand tascaGrupFiltreCommand = (TascaFiltreCommand)model.get("commandGrupFiltre");
request.getSession().setAttribute("commandTascaGrupFiltre", tascaGrupFiltreCommand);
PaginatedList pagina = getPaginaTasquesGrup(
entorn,
tascaGrupFiltreCommand,
page,
sortCalculat,
dirCalculat,
objectsPerPage);
model.addAttribute("grupLlistat", pagina);
model.addAttribute("grupLlistatCount", pagina.getFullListSize());
model.addAttribute(
"terminisIniciats",
findTerminisIniciatsPerTasques(
(List<TascaLlistatDto>)pagina.getList()));
model.addAttribute("command", tascaGrupFiltreCommand);
model.addAttribute("tipusExp", llistatExpedientTipusAmbPermisos(entorn));
// Asignamos los valores del filtro a la pestaña de personals
model.addAttribute("personaLlistatCount", getPaginaTasquesPersonalsCount(entorn,tascaGrupFiltreCommand,objectsPerPage));
request.getSession().setAttribute("commandTascaPersonaFiltre", tascaGrupFiltreCommand);
return "tasca/grupLlistat";
} else {
missatgeError(request, getMessage("error.no.entorn.selec") );
return "redirect:/index.html";
}
}
@RequestMapping(value = "/tasca/grupLlistat", method = RequestMethod.POST)
public String grupLlistatPost(
HttpServletRequest request,
@RequestParam(value = "submit", required = false) String submit,
@ModelAttribute("commandGrupFiltre") TascaFiltreCommand command) {
if ("submit".equals(submit)) {
request.getSession().setAttribute("commandTascaGrupFiltre", command);
} else if ("clean".equals(submit)) {
request.getSession().removeAttribute("commandTascaGrupFiltre");
}
return "redirect:/tasca/grupLlistat.html";
}
private List<ExpedientTipus> llistatExpedientTipusAmbPermisos(Entorn entorn) {
List<ExpedientTipus> llistat = dissenyService.findExpedientTipusAmbEntorn(entorn.getId());
permissionService.filterAllowed(
llistat,
ExpedientTipus.class,
new Permission[] {
ExtendedPermission.ADMINISTRATION,
ExtendedPermission.SUPERVISION,
ExtendedPermission.READ});
return llistat;
}
public class TascaFiltreCommand {
private String nom;
private String expedient;
private String numeroExpedient;
private Long tipusExpedient;
private Date dataCreacioInici;
private Date dataCreacioFi;
private Integer prioritat;
private Date dataLimitInici;
private Date dataLimitFi;
public TascaFiltreCommand() {}
public String getNom() {
return nom;
}
public void setNom(String nom) {
this.nom = nom;
}
public String getExpedient() {
return expedient;
}
public void setExpedient(String expedient) {
this.expedient = expedient;
}
public Long getTipusExpedient() {
return tipusExpedient;
}
public void setTipusExpedient(Long tipusExpedient) {
this.tipusExpedient = tipusExpedient;
}
public Date getDataCreacioInici() {
return dataCreacioInici;
}
public void setDataCreacioInici(Date dataCreacioInici) {
this.dataCreacioInici = dataCreacioInici;
}
public Date getDataCreacioFi() {
return dataCreacioFi;
}
public void setDataCreacioFi(Date dataCreacioFi) {
this.dataCreacioFi = dataCreacioFi;
}
public Integer getPrioritat() {
return prioritat;
}
public void setPrioritat(Integer prioritat) {
this.prioritat = prioritat;
}
public Date getDataLimitInici() {
return dataLimitInici;
}
public void setDataLimitInici(Date dataLimitInici) {
this.dataLimitInici = dataLimitInici;
}
public Date getDataLimitFi() {
return dataLimitFi;
}
public void setDataLimitFi(Date dataLimitFi) {
this.dataLimitFi = dataLimitFi;
}
public String getNumeroExpedient() {
return numeroExpedient;
}
public void setNumeroExpedient(String numeroExpedient) {
this.numeroExpedient = numeroExpedient;
}
}
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.registerCustomEditor(
Date.class,
new CustomDateEditor(new SimpleDateFormat("dd/MM/yyyy"), true));
}
private List<TerminiIniciat> findTerminisIniciatsPerTasques(List<TascaLlistatDto> tasques) {
List<TerminiIniciat> resposta = new ArrayList<TerminiIniciat>();
if (tasques != null) {
String[] taskInstanceIds = new String[tasques.size()];
int i = 0;
for (TascaLlistatDto tasca: tasques)
taskInstanceIds[i++] = tasca.getId();
List<TerminiIniciat> terminis = terminiService.findIniciatsAmbTaskInstanceIds(taskInstanceIds);
for (TascaLlistatDto tasca: tasques) {
boolean found = false;
for (TerminiIniciat termini: terminis) {
if (termini.getTaskInstanceId().equals(tasca.getId())) {
resposta.add(termini);
found = true;
break;
}
}
if (!found)
resposta.add(null);
}
}
return resposta;
}
private int getPaginaTasquesPersonalsCount(
Entorn entorn,
TascaFiltreCommand command,
String objectsPerPage) {
return tascaService.countTasquesPersonalsFiltre(
entorn.getId(),
null,
command.getNom(),
command.getExpedient(),
command.getNumeroExpedient(),
command.getTipusExpedient(),
command.getDataCreacioInici(),
command.getDataCreacioFi(),
command.getPrioritat(),
command.getDataLimitInici(),
command.getDataLimitFi(),
0,
-1,
null,
false);
}
private PaginatedList getPaginaTasquesPersonals(
Entorn entorn,
TascaFiltreCommand command,
String page,
String sort,
String dir,
String objectsPerPage) {
int maxResults = getObjectsPerPage(objectsPerPage);
int pagina = (page == null) ? 1: Integer.valueOf(page);
int firstRow = (pagina - 1) * maxResults;
boolean isAsc = (dir == null) || "asc".equals(dir);
// Ordenació per defecte
if (sort == null || sort.length() == 0) {
sort = "dataCreacio";
isAsc = false;
}
//
PaginatedList paginatedList = new PaginatedList();
paginatedList.setObjectsPerPage(maxResults);
paginatedList.setPageNumber(pagina);
paginatedList.setSortCriterion(sort);
paginatedList.setSortDirection((isAsc) ? SortOrderEnum.ASCENDING : SortOrderEnum.DESCENDING);
PaginaLlistatDto dadesLlistat = tascaService.findTasquesPersonalsFiltre(
entorn.getId(),
null,
command.getNom(),
command.getExpedient(),
command.getNumeroExpedient(),
command.getTipusExpedient(),
command.getDataCreacioInici(),
command.getDataCreacioFi(),
command.getPrioritat(),
command.getDataLimitInici(),
command.getDataLimitFi(),
firstRow,
maxResults,
sort,
isAsc);
paginatedList.setFullListSize(dadesLlistat.getCount());
paginatedList.setList(dadesLlistat.getLlistat());
return paginatedList;
}
private int getPaginaTasquesCountGrup(
Entorn entorn,
TascaFiltreCommand command,
String objectsPerPage) {
return tascaService.countTasquesGrupFiltre(
entorn.getId(),
null,
command.getNom(),
command.getExpedient(),
command.getNumeroExpedient(),
command.getTipusExpedient(),
command.getDataCreacioInici(),
command.getDataCreacioFi(),
command.getPrioritat(),
command.getDataLimitInici(),
command.getDataLimitFi(),
0,
-1,
null,
false);
}
private PaginatedList getPaginaTasquesGrup(
Entorn entorn,
TascaFiltreCommand command,
String page,
String sort,
String dir,
String objectsPerPage) {
int maxResults = getObjectsPerPage(objectsPerPage);
int pagina = (page == null) ? 1 : Integer.valueOf(page);
int firstRow = (pagina - 1) * maxResults;
boolean isAsc = (dir == null) || "asc".equals(dir);
// Ordenació per defecte
if (sort == null || sort.length() == 0) {
sort = "dataCreacio";
isAsc = false;
}
//
PaginatedList paginatedList = new PaginatedList();
paginatedList.setObjectsPerPage(maxResults);
paginatedList.setPageNumber(pagina);
paginatedList.setSortCriterion(sort);
paginatedList.setSortDirection((isAsc) ? SortOrderEnum.ASCENDING : SortOrderEnum.DESCENDING);
PaginaLlistatDto dadesLlistat = tascaService.findTasquesGrupFiltre(
entorn.getId(),
null,
command.getNom(),
command.getExpedient(),
command.getNumeroExpedient(),
command.getTipusExpedient(),
command.getDataCreacioInici(),
command.getDataCreacioFi(),
command.getPrioritat(),
command.getDataLimitInici(),
command.getDataLimitFi(),
firstRow,
maxResults,
sort,
isAsc);
paginatedList.setFullListSize(dadesLlistat.getCount());
paginatedList.setList(dadesLlistat.getLlistat());
return paginatedList;
}
}