@RequestMapping(value = "/cambioEstadoCarroEnviado", method = RequestMethod.GET)
  public ModelAndView cambioEstadoCarroEnviado(@RequestParam(value = "idCarro") String idCarro)
      throws Exception {

    carro_b = carro_BService.findByCarro_BIdCarro_b(idCarro);
    if (carro_b.getEnviado()) carro_b.setEnviado(false);
    else {
      carro_b.setEnviado(true);
      String content =
          "apreciado usuario le informamos que el pago de su pedido numero "
              + idCarro
              + " ha sido enviado, en breve recibirá información de la agencia de transportes";
      String subject = "pedido: " + idCarro;
      mail.sendMail(
          carro_b.getCliente_b().getLogin_usuario_b(),
          content,
          carro_b.getCliente_b().getEmail_b(),
          subject);
    }
    carro_BService.update(carro_b);

    ModelAndView mav = new ModelAndView("redirect: verTodosLosPedidos");

    return mav;
  }
  @RequestMapping(value = "/borrarCarro", method = RequestMethod.GET)
  public ModelAndView borrarCarro(@RequestParam(value = "idCarro") String idCarro)
      throws Exception {

    carro_b = carro_BService.findByCarro_BIdCarro_b(idCarro);
    carro_BService.delete(carro_b);

    ModelAndView mav = new ModelAndView("redirect: verTodosLosPedidos");

    return mav;
  }
  @RequestMapping(value = "/cambioEstadoCarroPagado", method = RequestMethod.GET)
  public ModelAndView cambioEstadoCarroPagado(@RequestParam(value = "idCarro") String idCarro)
      throws Exception {

    carro_b = carro_BService.findByCarro_BIdCarro_b(idCarro);
    if (carro_b.getPagado()) carro_b.setPagado(false);
    else carro_b.setPagado(true);
    carro_BService.update(carro_b);

    ModelAndView mav = new ModelAndView("redirect: verTodosLosPedidos");

    return mav;
  }
  @RequestMapping(value = "/verTodosLosPedidos", method = RequestMethod.GET)
  public ModelAndView verTodosLosPedidos(HttpSession session) throws Exception {

    logger.info("en /carro/verTodos/LosPedidos");
    // Set<ListaPedidos> listaCarrosAMostrar=new HashSet<ListaPedidos>(0);
    // Set<ListaPedidos> listaCarrosAMostrar=new HashSet<ListaPedidos>();
    // SortedSet<ListaPedidos> listaCarrosAMostrar=new TreeSet<ListaPedidos>();
    // que sea una lista ordenada
    Set<ListaPedidos> listaCarrosAMostrar = new TreeSet<ListaPedidos>();

    List<Carro_B> listaCarros = carro_BService.findAll();

    logger.info("tamaño lista carro: " + listaCarros.size());

    Iterator<Carro_B> iterCarro = listaCarros.iterator();

    while (iterCarro.hasNext()) {
      ListaPedidos listaCarrosPedidos = new ListaPedidos();
      Carro_B elementoCarro = iterCarro.next();
      listaCarrosPedidos.setIdCliente(elementoCarro.getCliente_b().getIdusuarios_b());
      listaCarrosPedidos.setLoginCliente(elementoCarro.getCliente_b().getLogin_usuario_b());
      listaCarrosPedidos.setPagado(elementoCarro.getPagado());
      listaCarrosPedidos.setEnviado(elementoCarro.getEnviado());
      listaCarrosPedidos.setIdCarro(elementoCarro.getIdcarro_b());
      listaCarrosPedidos.setFechaPedido(elementoCarro.getFecha_b());
      logger.info(
          "iprimo el login del usuario desde listaCarrospedidos: "
              + listaCarrosPedidos.getLoginCliente());
      List<Producto_BSeleccionado> listaProductosCarro =
          producto_BSeleccionadoService.findByProducto_BSeleccionadoPorIdcarro_b(
              String.valueOf(elementoCarro.getIdcarro_b()));
      logger.info(
          "iprimo el tamaño de la lista de productos de cada carro: " + listaProductosCarro.size());
      Iterator<Producto_BSeleccionado> itr = listaProductosCarro.iterator();
      Set<ListaProductosSeleccionados> listaProductos = new HashSet<ListaProductosSeleccionados>(0);
      while (itr.hasNext()) {
        Producto_BSeleccionado element = itr.next();
        ListaProductosSeleccionados lista = new ListaProductosSeleccionados();
        lista.setCantidad(element.getCantidad());
        lista.setIdCarro(element.getCarro_b().getIdcarro_b());
        lista.setIdproducto_b(element.getProducto_b().getIdproductob());
        lista.setIdProductoSeleccionado(element.getIdproductoSeleccionado());
        lista.setNombreProducto(element.getProducto_b().getNombre_productoB());
        lista.setPrecio_b(element.getProducto_b().getPrecio_b());
        listaProductos.add(lista);
      }
      listaCarrosPedidos.setListaProductosSeleccionados(listaProductos);
      listaCarrosAMostrar.add(listaCarrosPedidos);
    }

    ModelAndView mav = new ModelAndView("carro_b/verPedidos");
    mav.addObject("TodosLosPedidos", listaCarrosAMostrar);
    return mav;
  }
  @RequestMapping(value = "/pagarCarro", method = RequestMethod.GET)
  public ModelAndView pagarCarro(
      @RequestParam(value = "idCarro") String idCarro, @RequestParam(value = "total") String total)
      throws Exception {

    carro_b = carro_BService.findByCarro_BIdCarro_b(idCarro);

    ModelAndView mav = new ModelAndView("carro_b/datosTarjeta");
    mav.addObject("tarjetaCredito", tarjetaCredito);
    mav.addObject("idCarro", carro_b);
    mav.addObject("total", total);
    return mav;
  }
  @RequestMapping(value = "/sumaProducto", method = RequestMethod.GET)
  public ModelAndView sumaProducto(
      @RequestParam(value = "cantidad") String cantidad,
      @RequestParam(value = "idProducto") String idProducto,
      HttpSession session)
      throws Exception {
    //	carro_BService.save(carro_b);

    logger.info("session.getAttribute('carro_b')-al entrar: " + session.getAttribute("carro_b"));

    /*
    result.addError(new ObjectError("loginInvalido", "Este usuario ya existe"));

    if(result.hasErrors()) {
    	logger.info("addCliente_B_form ------tiene errores----"+result.toString());
    	logger.info("errores: "+result.toString());
    	return new ModelAndView("redirect:../../productos/listado").addAllObjects(result.getModel());
    	// return new ModelAndView("cliente_b/edit", "cliente_b",new Cliente_B()).addAllObjects(result.getModel());

    	}*/

    if (session.getAttribute("carro_b") == null) {
      logger.info("if (carro_b.getIdcarro_b()==null)");
      Carro_B carro_b = new Carro_B();
      User user = (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
      logger.info("usuario user user.getUsername() : " + user.getUsername());
      Usuario_B usuario = new Usuario_B();
      usuario = cliente_BServiceImpl.findByCliente_B_login_usuario_b(user.getUsername());
      Cliente_B cliente = new Cliente_B();
      cliente = (Cliente_B) usuario;
      carro_b.setCliente_b(cliente);
      carro_b.setFecha_b(new Date());
      carro_b.setEnviado(false);
      carro_b.setPagado(false);
      logger.info("antes de salvar carroooooo ");
      carro_BService.save(carro_b);
      session.setAttribute("carro_b", carro_b);
      logger.info("if (carro_b.getIdcarro_b()==null) despues    :  " + carro_b.getIdcarro_b());
    }

    carro_b = (Carro_B) session.getAttribute("carro_b");
    logger.info("imprimo el id del carro: " + carro_b.getIdcarro_b());
    logger.info("imprimo la fecha del carro: " + carro_b.getFecha_b());
    // Carro_B carro_b=new Carro_B(new Date(),)
    logger.info("session.getAttributeNames().toString()" + session.getAttributeNames().toString());
    logger.info("session.getAttribute('carro_b'): " + session.getAttribute("carro_b"));
    logger.info("session Id:" + session.getId());
    logger.info("cantidad Recibida" + cantidad);

    logger.info("idproducto Recibido" + idProducto);
    logger.info("usuario de la sesion : " + session.getAttribute("user"));
    logger.info("carro de la sesion : " + session.getAttribute("carro"));

    logger.info("datos carro id" + carro_b.getIdcarro_b());

    Producto_B producto = new Producto_B();
    producto = productos_BServiceImpl.findByProducto_BIdProducto_b(idProducto);

    Producto_BSeleccionado producto_BSeleccionado = new Producto_BSeleccionado();

    producto_BSeleccionado.setProducto_b(producto);
    producto_BSeleccionado.setCarro_b(carro_b);
    producto_BSeleccionado.setCantidad(Integer.parseInt(cantidad));
    // producto_BSeleccionado.setIdproductob(producto.getIdproductob());

    /*
    producto.getProductos_b_seleccionados().add(producto_BSeleccionado);
    productos_BServiceImpl.update(producto);

    */

    logger.info("carro_b.getIdcarro_b():" + carro_b.getIdcarro_b());
    Producto_BSeleccionado producto_BSeleccionado_test = new Producto_BSeleccionado();
    logger.info("Producto_BSeleccionado producto_BSeleccionado_test=new Producto_BSeleccionado();");
    producto_BSeleccionado_test =
        producto_BSeleccionadoService.findByProducto_BSeleccionadoIdProducto_b_y_carro_b(
            String.valueOf(producto.getIdproductob()), String.valueOf(carro_b.getIdcarro_b()));

    logger.info(
        "producto_BSeleccionado_test=producto_BSeleccionadoService.findByProducto_BSeleccionadoIdProducto_b_y_carro_b.....");
    if (null != producto_BSeleccionado_test) {
      // controlamos que el pedido no exceda la cantidad de existencias. aqui se tiene en cuenta los
      // que se habian pedido antes
      if ((producto_BSeleccionado_test.getCantidad() + producto.getCantidad_existencias())
          < (Integer.parseInt(cantidad))) {
        List<Producto_B> lista = productos_BServiceImpl.getProductos_B();
        ModelAndView mav = new ModelAndView("producto_b/listaProductos");
        mav.addObject("productos", lista);
        mav.addObject("errordeCantidad", "no puede pedir mas cantidad que las existencias");
        mav.addObject("productoPedido", idProducto);
        return mav;
      }

      // logger.info("producto_BSeleccionado_test
      // idproducto="+producto_BSeleccionado_test.getIdproductob());
      logger.info(
          "producto_BSeleccionado_test idcarro="
              + producto_BSeleccionado_test.getCarro_b().getIdcarro_b());
      logger.info("producto_BSeleccionado cantidad" + producto_BSeleccionado.getCantidad());
      logger.info(
          "producto_BSeleccionado id producto"
              + producto_BSeleccionado.getProducto_b().getIdproductob());
      logger.info(
          "producto_BSeleccionado id " + producto_BSeleccionado.getIdproductoSeleccionado());
      logger.info(
          "producto_BSeleccionado id " + producto_BSeleccionado.getCarro_b().getIdcarro_b());
      logger.info(
          "producto_BSeleccionado_test id "
              + producto_BSeleccionado_test.getIdproductoSeleccionado());
      // actualizacomos el valor de existencia
      producto.setCantidad_existencias(
          producto.getCantidad_existencias()
              + producto_BSeleccionado_test.getCantidad()
              - Integer.parseInt(cantidad));
      productos_BServiceImpl.update(producto);
      // actualizacomos producto_BSeleccionado
      producto_BSeleccionado.setIdproductoSeleccionado(
          producto_BSeleccionado_test.getIdproductoSeleccionado());
      producto_BSeleccionadoService.update(producto_BSeleccionado);

    } else {
      // controlamos que el pedido no exceda la cantidad de existencias.

      logger.info("producto_cantidad de existencias::::::::" + producto.getCantidad_existencias());
      logger.info("producto_cantidad pedidas::::::::" + Integer.parseInt(cantidad));
      if (producto.getCantidad_existencias() < (Integer.parseInt(cantidad))) {
        List<Producto_B> lista = productos_BServiceImpl.getProductos_B();
        ModelAndView mav = new ModelAndView("producto_b/listaProductos");
        mav.addObject("productos", lista);
        mav.addObject("errordeCantidad", "no puede pedir mas cantidad que las existencias");
        mav.addObject("productoPedido", idProducto);
        return mav;
      }
      // actualizacomos el valor de existencia
      producto.setCantidad_existencias(
          producto.getCantidad_existencias() - Integer.parseInt(cantidad));
      productos_BServiceImpl.update(producto);
      // salvamos producto_BSeleccionado
      producto_BSeleccionadoService.save(producto_BSeleccionado);
      // producto_BSeleccionadoService.update(producto_BSeleccionado);

    }
    carro_b.getProducto_BSeleccionado().add(producto_BSeleccionado);
    // carro_BService.update(carro_b);
    logger.info(
        "carro_b.getProducto_BSeleccionado().size()=" + carro_b.getProducto_BSeleccionado().size());

    /*
    	Set<Producto_BSeleccionado> listaProductos = new HashSet<Producto_BSeleccionado>(0);
    	listaProductos.addAll(carro_b.getProducto_BSeleccionado());
    	logger.info("tamaño elemento de listaproductos"+listaProductos.size());

    */

    List<Producto_BSeleccionado> listaProductosRecibida =
        producto_BSeleccionadoService.findByProducto_BSeleccionadoPorIdcarro_b(
            String.valueOf(carro_b.getIdcarro_b()));
    logger.info("tamaño lista productosSeleccionados en esteCarro" + listaProductosRecibida.size());
    Set<ListaProductosSeleccionados> listaProductos = new HashSet<ListaProductosSeleccionados>(0);
    Iterator<Producto_BSeleccionado> itr = listaProductosRecibida.iterator();
    while (itr.hasNext()) {
      Producto_BSeleccionado element = itr.next();
      ListaProductosSeleccionados lista = new ListaProductosSeleccionados();
      lista.setCantidad(element.getCantidad());
      lista.setIdCarro(element.getCarro_b().getIdcarro_b());
      lista.setIdproducto_b(element.getProducto_b().getIdproductob());
      lista.setIdProductoSeleccionado(element.getIdproductoSeleccionado());
      lista.setNombreProducto(element.getProducto_b().getNombre_productoB());
      lista.setPrecio_b(element.getProducto_b().getPrecio_b());
      listaProductos.add(lista);
    }

    List<Producto_B> lista = productos_BServiceImpl.getProductos_B();
    ModelAndView mav = new ModelAndView("producto_b/listaProductos");
    mav.addObject("productos", lista);
    mav.addObject("productosSeleccionados", listaProductos);
    return mav;
    // return new ModelAndView("redirect:../../productos/listado");
  }