package net.conselldemallorca.helium.webapp.mvc;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import net.conselldemallorca.helium.core.model.hibernate.Reassignacio;
import net.conselldemallorca.helium.core.model.service.ReassignacioService;
import net.conselldemallorca.helium.webapp.mvc.util.BaseController;
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.ModelMap;
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.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.support.SessionStatus;
/**
* Controlador per la reassignació de tasques entre usuaris.
*
* @author Limit Tecnologies <limit@limit.es>
*/
@Controller
public class ReassignacioController extends BaseController {
private ReassignacioService reassignacioService;
private Validator additionalValidator;
@Autowired
public ReassignacioController(
ReassignacioService reassignacioService) {
this.reassignacioService = reassignacioService;
additionalValidator = new ReassignacioValidator(reassignacioService);
}
@ModelAttribute("command")
public ReassignacioCommand populateCommand(@RequestParam(value = "id", required = false) Long id) {
if (id != null) {
Reassignacio reassignacio = reassignacioService.findReassignacioById(id);
ReassignacioCommand command = new ReassignacioCommand();
command.setId(reassignacio.getId());
command.setUsuariOrigen(reassignacio.getUsuariOrigen());
command.setUsuariDesti(reassignacio.getUsuariDesti());
command.setDataInici(reassignacio.getDataInici());
command.setDataFi(reassignacio.getDataFi());
command.setDataCancelacio(reassignacio.getDataCancelacio());
return command;
}
return new ReassignacioCommand();
}
@RequestMapping(value = "/reassignar/llistat", method = RequestMethod.GET)
public String reassignarGet(
HttpServletRequest request,
ModelMap model) {
List<Reassignacio> reassignacions = reassignacioService.llistaReassignacions();
model.addAttribute("llistat", reassignacions);
return "reassignar/llistat";
}
@RequestMapping(value = "/reassignar/form", method = RequestMethod.GET)
public String formGet() {
return "reassignar/form";
}
@RequestMapping(value = "/reassignar/form", method = RequestMethod.POST)
public String formPost(
HttpServletRequest request,
@RequestParam(value = "submit", required = false) String submit,
@ModelAttribute("command") ReassignacioCommand command,
BindingResult result,
SessionStatus status) {
if ("submit".equals(submit) || submit.length() == 0) {
additionalValidator.validate(command, result);
if (result.hasErrors()) {
return "reassignar/form";
}
try {
if (command.getId() == null) {
reassignacioService.createReassignacio(
command.getUsuariOrigen(),
command.getUsuariDesti(),
command.getDataInici(),
command.getDataFi(),
command.getDataCancelacio(),
command.getTipusExpedientId());
} else {
reassignacioService.updateReassignacio(
command.getId(),
command.getUsuariOrigen(),
command.getUsuariDesti(),
command.getDataInici(),
command.getDataFi(),
command.getDataCancelacio(),
command.getTipusExpedientId());
}
missatgeInfo(request, getMessage("info.reassignacio.produit") );
status.setComplete();
} catch (Exception ex) {
missatgeError(request, getMessage("error.proces.peticio"), ex.getLocalizedMessage());
logger.error("No s'ha pogut guardar el registre", ex);
return "reassignar/form";
}
return "redirect:/reassignar/llistat.html";
} else {
return "redirect:/reassignar/llistat.html";
}
}
@RequestMapping(value = "/reassignar/cancelar")
public String deleteAction(
HttpServletRequest request,
@RequestParam(value = "id", required = true) Long id) {
reassignacioService.deleteReassignacio(id);
missatgeInfo(request, getMessage("info.reassignacio.cancelat") );
return "redirect:/reassignar/llistat.html";
}
@SuppressWarnings("unused")
private class ReassignacioValidator implements Validator {
private ReassignacioService reassignacioService;
public ReassignacioValidator(ReassignacioService reassignacioService) {
this.reassignacioService = reassignacioService;
}
@SuppressWarnings({ "unchecked", "rawtypes" })
public boolean supports(Class clazz) {
return clazz.isAssignableFrom(ReassignacioCommand.class);
}
public void validate(Object target, Errors errors) {
Calendar cal = Calendar.getInstance();
cal.setTime(new Date());
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
Date avui = cal.getTime();
ReassignacioCommand command = (ReassignacioCommand)target;
ValidationUtils.rejectIfEmpty(errors, "usuariOrigen", "not.blank");
ValidationUtils.rejectIfEmpty(errors, "usuariDesti", "not.blank");
ValidationUtils.rejectIfEmpty(errors, "dataInici", "not.blank");
ValidationUtils.rejectIfEmpty(errors, "dataFi", "not.blank");
if ((command.getDataInici() != null) && (avui.compareTo(command.getDataInici()) > 0)) {
errors.rejectValue("dataInici", "error.data.anterior");
}
if ((command.getDataFi() != null) && (avui.compareTo(command.getDataFi()) > 0)) {
errors.rejectValue("dataFi", "error.data.anterior");
}
if ((command.getDataInici() != null) && (command.getDataFi() != null) && ((command.getDataFi()).compareTo(command.getDataInici()) < 0)) {
errors.rejectValue("dataFi", "error.dataFi.anterior");
}
}
}
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.registerCustomEditor(
Date.class,
new CustomDateEditor(new SimpleDateFormat("dd/MM/yyyy"), true));
}
private static final Log logger = LogFactory.getLog(ReassignacioController.class);
}