package net.conselldemallorca.helium.webapp.v3.controller;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.propertyeditors.CustomDateEditor;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.validation.Errors;
import org.springframework.validation.ValidationUtils;
import org.springframework.validation.Validator;
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;
import net.conselldemallorca.helium.v3.core.api.dto.AreaDto;
import net.conselldemallorca.helium.v3.core.api.dto.EntornDto;
import net.conselldemallorca.helium.v3.core.api.dto.ExecucioMassivaDto;
import net.conselldemallorca.helium.v3.core.api.dto.ExecucioMassivaDto.ExecucioMassivaTipusDto;
import net.conselldemallorca.helium.v3.core.api.dto.PersonaDto;
import net.conselldemallorca.helium.v3.core.api.service.AplicacioService;
import net.conselldemallorca.helium.v3.core.api.service.ExecucioMassivaService;
import net.conselldemallorca.helium.webapp.v3.command.ReassignacioTasquesCommand;
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.SessionHelper.SessionManager;
/**
* Controlador per reassignacio massiva de tasques
*
* @author Limit Tecnologies <limit@limit.es>
*/
@Controller
@RequestMapping("/v3/tasca")
public class MassivaTascaReassignacioController extends BaseExpedientController {
@Autowired
private AplicacioService aplicacioService;
@Resource(name="execucioMassivaServiceV3")
private ExecucioMassivaService execucioMassivaService;
@RequestMapping(value = "/massivaReassignacioTasca", method = RequestMethod.GET)
public String massivaTramitacio(
HttpServletRequest request,
@RequestParam(value = "inici", required = false) String inici,
@RequestParam(value = "correu", required = false) boolean correu,
@RequestParam(value = "massiva", required = true) boolean massiva,
Model model) {
SessionManager sessionManager = SessionHelper.getSessionManager(request);
Set<Long> seleccio = sessionManager.getSeleccioConsultaTasca();
if (seleccio == null || seleccio.isEmpty()) {
MissatgesHelper.error(request, getMessage(request, "error.no.tasc.selec"));
return modalUrlTancar(false);
}
if (massiva) {
model.addAttribute("inici", inici);
model.addAttribute("correu", correu);
}
model.addAttribute("massiva", massiva);
model.addAttribute("reassignacioTasquesCommand", new ReassignacioTasquesCommand());
return "v3/tasquesReassignacio";
}
@RequestMapping(value = "/persona/suggest/{text}", method = RequestMethod.GET, produces={"application/json; charset=UTF-8"})
@ResponseBody
public String personaSuggest(
@PathVariable String text,
Model model) {
List<PersonaDto> lista = aplicacioService.findPersonaLikeNomSencer(text);
String json = "[";
for (PersonaDto persona: lista) {
json += "{\"codi\":\"" + persona.getCodi() + "\", \"nom\":\"" + persona.getNomSencer() + "\"},";
}
if (json.length() > 1) json = json.substring(0, json.length() - 1);
json += "]";
return json;
}
@RequestMapping(value = "/persona/suggestInici/{text}", method = RequestMethod.GET, produces={"application/json; charset=UTF-8"})
@ResponseBody
public String personaSuggestInici(
@PathVariable String text,
Model model) {
PersonaDto persona = aplicacioService.findPersonaAmbCodi(text);
if (persona != null) {
return "{\"codi\":\"" + persona.getCodi() + "\", \"nom\":\"" + persona.getNomSencer() + "\"}";
}
return null;
}
@RequestMapping(value = "massivaReassignacioTasca", method = RequestMethod.POST)
public String accioReassignar(
HttpServletRequest request,
@RequestParam(value = "inici", required = false) String inici,
@RequestParam(value = "correu", required = false) boolean correu,
@RequestParam(value = "massiva", required = true) boolean massiva,
@ModelAttribute("reassignacioTasquesCommand") ReassignacioTasquesCommand reassignacioTasquesCommand,
BindingResult result,
SessionStatus status,
Model model) {
model.addAttribute("inici", inici);
model.addAttribute("correu", correu);
model.addAttribute("massiva", massiva);
SessionManager sessionManager = SessionHelper.getSessionManager(request);
Set<Long> ids = sessionManager.getSeleccioConsultaTasca();
if (ids == null || ids.isEmpty()) {
MissatgesHelper.error(request, getMessage(request, "error.no.tasc.selec"));
return modalUrlTancar();
}
String tipus = request.getParameter("tipusExpressio");
ReassignarValidator validator = new ReassignarValidator();
validator.setTipus(tipus);
validator.validate(reassignacioTasquesCommand, result);
if (result.hasErrors()) {
MissatgesHelper.error(request, getMessage(request, "error.executar.reassignacio"));
return "v3/tasquesReassignacio";
}
Date dInici = new Date();
if (inici != null) {
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm");
try {
dInici = sdf.parse(inici);
} catch (ParseException e) {}
}
String expression = reassignacioTasquesCommand.getExpression();
if ("user".equals(tipus)) {
expression = "user(" + reassignacioTasquesCommand.getUsuari() + ")";
} else if ("grup".equals(tipus)) {
AreaDto grup = dissenyService.findAreaById(reassignacioTasquesCommand.getGrup());
expression = "group(" + grup.getCodi() + ")";
}
try {
EntornDto entorn = SessionHelper.getSessionManager(request).getEntornActual();
// Authentication massiuAuthentication = SecurityContextHolder.getContext().getAuthentication();
ExecucioMassivaDto dto = new ExecucioMassivaDto();
dto.setDataInici(dInici);
dto.setEnviarCorreu(correu);
Set<String> idsAsString = new HashSet<String>();
for (Long id: ids) {
idsAsString.add(id.toString());
}
dto.setTascaIds(idsAsString.toArray(new String[idsAsString.size()]));
dto.setExpedientTipusId(ids.iterator().next());
dto.setTipus(ExecucioMassivaTipusDto.REASSIGNAR);
dto.setParam1(expression);
Object[] params = new Object[1];
params[0] = entorn.getId();
// params[1] = massiuAuthentication.getCredentials();
// List<String> rols = new ArrayList<String>();
// for (GrantedAuthority gauth : massiuAuthentication.getAuthorities()) {
// rols.add(gauth.getAuthority());
// }
// params[2] = rols;
dto.setParam2(execucioMassivaService.serialize(params));
execucioMassivaService.crearExecucioMassiva(dto);
MissatgesHelper.success(request, getMessage(request, "info.accio.massiu.reassignat", new Object[] {ids.size()}));
ids.clear();
} catch (Exception e) {
MissatgesHelper.error(request, getMessage(request, "error.no.massiu"));
logger.error("Error al programar les accions massives", e);
return "v3/tasquesReassignacio";
}
return modalUrlTancar(false);
}
private class ReassignarValidator implements Validator {
private String tipus;
@SuppressWarnings({ "unchecked", "rawtypes" })
public boolean supports(Class clazz) {
return clazz.isAssignableFrom(ReassignacioTasquesCommand.class);
}
public void validate(Object obj, Errors errors) {
if ("user".equals(tipus)) {
ValidationUtils.rejectIfEmpty(errors, "usuari", "not.blank");
} else if ("grup".equals(tipus)) {
ValidationUtils.rejectIfEmpty(errors, "grup", "not.blank");
} else if ("expr".equals(tipus)) {
ValidationUtils.rejectIfEmpty(errors, "expression", "not.blank");
}
}
public void setTipus(String tipus) {
this.tipus = tipus;
}
}
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.registerCustomEditor(
Date.class,
new CustomDateEditor(new SimpleDateFormat("dd/MM/yyyy"), true));
binder.registerCustomEditor(
Object.class,
new ObjectTypeEditorHelper());
}
private static final Log logger = LogFactory.getLog(MassivaTascaReassignacioController.class);
}