@Transactional
  @RequestMapping(value = "/graba", method = RequestMethod.POST)
  public String graba(
      HttpServletRequest request,
      HttpServletResponse response,
      @Valid AlumnoPaquete alumnoPaquete,
      BindingResult bindingResult,
      Errors errors,
      Model modelo,
      RedirectAttributes redirectAttributes) {
    for (String matricula : request.getParameterMap().keySet()) {
      log.debug("Param: {} : {}", matricula, request.getParameterMap().get(matricula));
    }
    if (bindingResult.hasErrors()) {
      log.debug("Hubo algun error en la forma, regresando");
      Map<String, Object> params = new HashMap<>();
      params.put("empresa", request.getSession().getAttribute("empresaId"));
      return Constantes.PATH_ALUMNOPAQUETE_NUEVO;
    }

    try {
      AlumnoPaquete tmp = null;
      Usuario usuario = ambiente.obtieneUsuario();

      if (alumnoPaquete.getId() != null) {
        tmp = alumnoPaqueteManager.obtiene(alumnoPaquete.getId());
        tmp.setPaquete(paqueteDao.obtiene(alumnoPaquete.getPaquete().getId()));
        tmp.setMatricula(alumnoPaquete.getMatricula());
        tmp.setStatus(alumnoPaquete.getStatus());
        alumnoPaqueteManager.graba(tmp, usuario);
        redirectAttributes.addFlashAttribute(
            Constantes.CONTAINSKEY_MESSAGE, "alumnoPaquete.actualizado.message");
        redirectAttributes.addFlashAttribute(
            Constantes.CONTAINSKEY_MESSAGE_ATTRS, new String[] {alumnoPaquete.getMatricula()});
      } else {
        alumnoPaquete.setPaquete(paqueteDao.obtiene(alumnoPaquete.getPaquete().getId()));
        alumnoPaqueteManager.graba(alumnoPaquete, usuario);
        redirectAttributes.addFlashAttribute(
            Constantes.CONTAINSKEY_MESSAGE, "alumnoPaquete.creado.message");
        redirectAttributes.addFlashAttribute(
            Constantes.CONTAINSKEY_MESSAGE_ATTRS, new String[] {alumnoPaquete.getMatricula()});
      }

    } catch (ConstraintViolationException e) {
      log.error("No se pudo crear el tipo de Beca", e);
      return Constantes.PATH_ALUMNOPAQUETE_NUEVO;
    }

    return "redirect:/" + Constantes.PATH_ALUMNOPAQUETE_LISTA + "/";
  }
  @Transactional
  @RequestMapping(value = "/elimina", method = RequestMethod.POST)
  public String elimina(
      HttpServletRequest request,
      @RequestParam Long id,
      Model modelo,
      @ModelAttribute AlumnoPaquete alumnoPaquete,
      BindingResult bindingResult,
      RedirectAttributes redirectAttributes) {
    log.debug("Elimina cuenta de tipos de becas");
    try {
      alumnoPaqueteManager.elimina(id);

      redirectAttributes.addFlashAttribute(
          Constantes.CONTAINSKEY_MESSAGE, "alumnoPaquete.eliminado.message");
      redirectAttributes.addFlashAttribute(
          Constantes.CONTAINSKEY_MESSAGE_ATTRS, new String[] {alumnoPaquete.getMatricula()});
    } catch (Exception e) {
      log.error("No se pudo eliminar el tipo de alumnoPaquete " + id, e);
      bindingResult.addError(
          new ObjectError(
              Constantes.ADDATTRIBUTE_ALUMNOPAQUETE,
              new String[] {"alumnoPaquete.no.elimina.message"},
              null,
              null));
      return Constantes.PATH_ALUMNOPAQUETE_VER;
    }

    return "redirect:/" + Constantes.PATH_ALUMNOPAQUETE_LISTA;
  }
  @RequestMapping("/ver/{id}")
  public String ver(@PathVariable Long id, Model modelo) {
    log.debug("Mostrando alumnoPaquete {}", id);
    AlumnoPaquete alumnoPaquete = alumnoPaqueteManager.obtiene(id);

    modelo.addAttribute("alumnoPaquete", alumnoPaquete);

    return Constantes.PATH_ALUMNOPAQUETE_VER;
  }
 @RequestMapping("/edita/{id}")
 public String edita(@PathVariable Long id, Model modelo, HttpServletRequest request) {
   log.debug("Editar cuenta de tipos de becas {}", id);
   Map<String, Object> params = new HashMap<>();
   params.put("empresa", request.getSession().getAttribute("empresaId"));
   params.put("reporte", true);
   AlumnoPaquete alumnoPaquete = alumnoPaqueteManager.obtiene(id);
   modelo.addAttribute(Constantes.ADDATTRIBUTE_ALUMNOPAQUETE, alumnoPaquete);
   modelo.addAttribute(
       Constantes.CONTAINSKEY_PAQUETES,
       paqueteDao.lista(params).get(Constantes.CONTAINSKEY_PAQUETES));
   return Constantes.PATH_ALUMNOPAQUETE_EDITA;
 }
  @RequestMapping({"", "/lista"})
  public String lista(
      HttpServletRequest request,
      HttpServletResponse response,
      @RequestParam(required = false) String filtro,
      @RequestParam(required = false) Long pagina,
      @RequestParam(required = false) String tipo,
      @RequestParam(required = false) String correo,
      @RequestParam(required = false) String order,
      @RequestParam(required = false) String sort,
      Usuario usuario,
      Errors errors,
      Model modelo) {
    log.debug("Mostrando lista de tipos de Becas");
    Map<String, Object> params = new HashMap<>();
    Long empresaId = (Long) request.getSession().getAttribute("empresaId");
    params.put("empresa", empresaId);
    if (StringUtils.isNotBlank(filtro)) {
      params.put(Constantes.CONTAINSKEY_FILTRO, filtro);
    }
    if (pagina != null) {
      params.put(Constantes.CONTAINSKEY_PAGINA, pagina);
      modelo.addAttribute(Constantes.CONTAINSKEY_PAGINA, pagina);
    } else {
      pagina = 1L;
      modelo.addAttribute(Constantes.CONTAINSKEY_PAGINA, pagina);
    }
    if (StringUtils.isNotBlank(order)) {
      params.put(Constantes.CONTAINSKEY_ORDER, order);
      params.put(Constantes.CONTAINSKEY_SORT, sort);
    }

    if (StringUtils.isNotBlank(tipo)) {
      params.put(Constantes.CONTAINSKEY_REPORTE, true);
      params = alumnoPaqueteManager.lista(params);
      try {
        generaReporte(
            tipo,
            (List<AlumnoPaquete>) params.get(Constantes.CONTAINSKEY_ALUMNOPAQUETES),
            response);
        return null;
      } catch (JRException | IOException e) {
        log.error("No se pudo generar el reporte", e);
        params.remove(Constantes.CONTAINSKEY_REPORTE);
        // errors.reject("error.generar.reporte");
      }
    }

    if (StringUtils.isNotBlank(correo)) {
      params.put(Constantes.CONTAINSKEY_REPORTE, true);
      params = alumnoPaqueteManager.lista(params);

      params.remove(Constantes.CONTAINSKEY_REPORTE);
      try {
        enviaCorreo(
            correo,
            (List<AlumnoPaquete>) params.get(Constantes.CONTAINSKEY_ALUMNOPAQUETES),
            request);
        modelo.addAttribute(Constantes.CONTAINSKEY_MESSAGE, "lista.enviada.message");
        modelo.addAttribute(
            Constantes.CONTAINSKEY_MESSAGE_ATTRS,
            new String[] {
              messageSource.getMessage("alumnoPaquete.lista.label", null, request.getLocale()),
              ambiente.obtieneUsuario().getUsername()
            });
      } catch (JRException | MessagingException e) {
        log.error("No se pudo enviar el reporte por correo", e);
      }
    }
    params = alumnoPaqueteManager.lista(params);
    log.debug("params{}", params.get(Constantes.CONTAINSKEY_ALUMNOPAQUETES));
    modelo.addAttribute(
        Constantes.CONTAINSKEY_ALUMNOPAQUETES, params.get(Constantes.CONTAINSKEY_ALUMNOPAQUETES));

    // inicia paginado
    Long cantidad = (Long) params.get(Constantes.CONTAINSKEY_CANTIDAD);
    Integer max = (Integer) params.get(Constantes.CONTAINSKEY_MAX);
    Long cantidadDePaginas = cantidad / max;
    List<Long> paginas = new ArrayList<>();
    long i = 1;
    do {
      paginas.add(i);
    } while (i++ < cantidadDePaginas);
    List<AlumnoPaquete> alumnoPaquetes =
        (List<AlumnoPaquete>) params.get(Constantes.CONTAINSKEY_ALUMNOPAQUETES);
    Long primero = ((pagina - 1) * max) + 1;
    log.debug("primero {}", primero);
    Long ultimo = primero + (alumnoPaquetes.size() - 1);
    String[] paginacion = new String[] {primero.toString(), ultimo.toString(), cantidad.toString()};
    modelo.addAttribute(Constantes.CONTAINSKEY_PAGINACION, paginacion);
    log.debug("Paginacion{}", paginacion);
    modelo.addAttribute(Constantes.CONTAINSKEY_PAGINAS, paginas);
    log.debug("paginas{}", paginas);
    modelo.addAttribute(Constantes.CONTAINSKEY_PAGINA, pagina);
    log.debug("Pagina{}", pagina);
    // termina paginado

    return Constantes.PATH_ALUMNOPAQUETE_LISTA;
  }