@RequestMapping(method = RequestMethod.POST, value = "/projet/approve")
 public String approve(@Valid @ModelAttribute("projet") Projet projet, BindingResult result) {
   if (result.hasErrors()) {
     return "projets";
   }
   // projetService.approve(projet);
   projet.computeTotalBenef();
   projetService.update(projet);
   try {
     projet.setStatus("approved");
     projetService.update(projet);
     // tdrService.computeTdb(projet.getTdr());
     tdrService.computeTdb(tdrService.getById(projet.getTdr().getId()));
     tdrService.publish(projet.getTdr());
   } catch (Exception ex) {
     // TODO better error gestion
     ex.printStackTrace();
   }
   return "redirect:list?tdrId=" + projet.getTdr().getId();
 }
 /**
  * Save the details of a projet
  *
  * @param map
  * @param tdrId
  * @return
  */
 @RequestMapping(method = RequestMethod.POST, value = "/projet/save")
 public String save(@Valid @ModelAttribute("projet") Projet projet, BindingResult result) {
   if (result
       .hasErrors()) { // validation check, see
                       // http://www.mkyong.com/spring-mvc/spring-3-mvc-and-jsr303-valid-example/
     return "redirect:/projet/details/" + projet.getId();
   }
   projet.computeTotalBenef();
   projetService.update(projet);
   return "redirect:/projet/details/" + projet.getId();
 }
 // LATER put in a separate controller for only create & update requests
 @ModelAttribute("projet")
 public Projet initProjet(
     @RequestParam(value = "id", required = false) Long projetId,
     @RequestParam(value = "tdrId", required = false) Long tdrId) {
   if (projetId != null) {
     return projetService.getById(projetId);
   } else if (tdrId != null) {
     Projet projet = new Projet();
     projet.setStatus("created");
     Tdr tdr = tdrService.getById(tdrId);
     projet.setTdr(tdr);
     return projet;
   }
   return null;
 }
  @RequestMapping("projet/list")
  public String list(
      @RequestParam(value = "tdrId", required = false) Long tdrId, Map<String, Object> map) {
    List<Projet> projets;
    Tdr tdr = null;
    if (tdrId != null && tdrId != 0) {

      tdr = tdrService.getById(tdrId);
      if (tdr != null) {
        projets = projetService.listByTdr(tdrId);
        // projets = tdr.getProjets(); // NO no session
        // projets = tdrService.getProjets(tdr);
      } else {
        throw new RuntimeException("no tdr for tdrId " + tdrId); // TODO better
      }
    } else {
      projets = projetService.list();
    }
    map.put("projets", projets);
    // map.put("projet", new Projet()); // done by initProjet()
    map.put("tdr", tdr);
    map.put("tdrId", tdrId);
    return "projets";
  }
 @RequestMapping(method = RequestMethod.POST, value = "/projet/add")
 public String add(@Valid @ModelAttribute("projet") Projet projet, BindingResult result) {
   if (result.hasErrors()) {
     if (projet != null) {
       // result.getModel().put("projet", projet); // for form
       return "redirect:newProjet?tdrId=" + projet.getTdr().getId();
       // TODO should return "newProjet" but at next save then projet is null !?!
     }
     return "redirect:/tdr/list";
   }
   // Tdr tdr = tdrService.getById(projet.getTdr().getId());projet.setTdr(tdr); // done by
   // initProjet()
   projet.computeTotalBenef();
   projetService.create(projet);
   return "redirect:list?tdrId=" + projet.getTdr().getId();
 }
 @RequestMapping(method = RequestMethod.GET, value = "projet/details/{projetId}")
 public String details(Map<String, Object> map, @PathVariable("projetId") long projetId) {
   Projet projet = projetService.getById(projetId);
   map.put("projet", projet);
   return "projetDetails";
 }
 @RequestMapping(method = RequestMethod.GET, value = "projet/delete/{projetId}")
 public String delete(@PathVariable("projetId") long projetId) {
   projetService.delete(projetId);
   return "redirect:/projet/list";
 }