public String getDefaultImageName() {
   if (defaultImageName == null) {
     Collection<Multimedio> multimedioCollection = producto.getMultimedioCollection();
     for (Multimedio m : multimedioCollection) {
       if (m.getMimeType().toLowerCase().startsWith("image/")) {
         defaultImageName = producto.getId() + "_0.jpg";
         break;
       }
     }
     if (defaultImageName == null) {
       defaultImageName = "DEFAULT.jpg";
     }
   }
   return defaultImageName;
 }
 public void buscarProductoConNombreDescripcion(ActionEvent e) {
   logger.debug(
       "################################ >> productoConNombreDescripcion: nombreDescripcion="
           + nombreDescripcion);
   productoConNombreDescripcion = new ArrayList<SelectItem>();
   if (nombreDescripcion.trim().length() >= 3) {
     List<Producto> listResultOriginal = productoJpaController.findProductoEntities();
     for (Producto productoOriginal : listResultOriginal) {
       String nombreDescripcionOriginal =
           productoOriginal.getNombre() + "/" + productoOriginal.getPresentacion();
       if (nombreDescripcionOriginal.toLowerCase().contains(nombreDescripcion.toLowerCase())) {
         SelectItem productoSI =
             new SelectItem(productoOriginal.getId(), nombreDescripcionOriginal);
         productoConNombreDescripcion.add(productoSI);
       }
     }
   }
 }
 public void nombreDescripcionChanged(ValueChangeEvent e) {
   String newValue = (String) e.getNewValue();
   logger.debug(
       "################################ >> nombreDescripcionChanged: newValue=" + newValue);
   productoConNombreDescripcion = new ArrayList<SelectItem>();
   if (newValue.trim().length() >= 3) {
     List<Producto> listResultOriginal = productoJpaController.findProductoEntities();
     for (Producto productoOriginal : listResultOriginal) {
       String nombreDescripcionOriginal =
           productoOriginal.getNombre() + "/" + productoOriginal.getPresentacion();
       if (nombreDescripcionOriginal.toLowerCase().contains(newValue.toLowerCase())) {
         SelectItem productoSI =
             new SelectItem(productoOriginal.getId(), nombreDescripcionOriginal);
         productoConNombreDescripcion.add(productoSI);
       }
     }
   }
 }
  public void agregarNProductoBuscado(ActionEvent e) {
    logger.debug(
        "## >> agregarNProductoBuscado : productoSelected="
            + productoCBSelected
            + ", cantidadAgregar="
            + cantidadAgregar);
    FacesMessage fm = null;
    int cantidadPrevia = 0;
    try {
      productoEncontrado = productoJPAController.findEntityByReadableProperty(productoCBSelected);

      cantidadPrevia = agregarProductoADetallePrevia(productoEncontrado.getId(), cantidadAgregar);

      fm =
          new FacesMessage(
              FacesMessage.SEVERITY_INFO,
              "Agregar Producto : ",
              "Se actualizó cantidad = "
                  + cantidadPrevia
                  + " + "
                  + cantidadAgregar
                  + " = "
                  + (cantidadPrevia + cantidadAgregar)
                  + ", del producto ["
                  + productoCBSelected
                  + "]");
    } catch (ValidatorException ex) {
      logger.error("## >> agregarNProductoBuscado : Exception", ex);
      fm = ex.getFacesMessage();
    } catch (Exception ex) {
      logger.error("## >> agregarNProductoBuscado : Exception", ex);
      fm =
          new FacesMessage(
              FacesMessage.SEVERITY_INFO,
              "Agregar Producto : ",
              "Error al gregar cantidad = "
                  + cantidadPrevia
                  + " + "
                  + cantidadAgregar
                  + " = "
                  + (cantidadPrevia + cantidadAgregar)
                  + ", del producto ["
                  + productoCBSelected
                  + "] :"
                  + ex.getMessage());
    } finally {
      cantidadAgregar = 1;
      cantidadCBAgregar = 1;
      productoEncontrado = null;
      productoConNombreDescripcion = new ArrayList<SelectItem>();
      nombreDescripcion = null;
      codigoBuscar = "";
      FacesContext.getCurrentInstance().addMessage(null, fm);
    }
  }
  public List<Producto> autocompletarProductoConNombreDescripcion(Object suggest) {
    List<Producto> listResult = null;
    nombreDescripcion = (String) suggest;
    logger.debug(
        "################################ >> autocompletarProductoConNombreDescripcion: nombreDescripcion="
            + nombreDescripcion);

    if (nombreDescripcion.trim().length() >= 3) {
      listResult = new ArrayList<Producto>();
      List<Producto> listResultOriginal = productoJpaController.findProductoEntities();
      for (Producto productoOriginal : listResultOriginal) {
        String nombreDescripcionOriginal =
            productoOriginal.getNombre() + "/" + productoOriginal.getPresentacion();
        if (nombreDescripcionOriginal.toLowerCase().contains(nombreDescripcion.toLowerCase())) {
          listResult.add(productoOriginal);
        }
      }
    }
    return listResult;
  }
  public void codigoBuscarChangedAction(ActionEvent e) {
    logger.debug(
        "## >> codigoBuscarChangedAction: codigoBuscar="
            + codigoBuscar
            + ", cantidadAgregar="
            + cantidadCBAgregar);
    FacesMessage fm = null;
    int cantidadPrevia = 0;
    try {

      if (!codigoBuscar.matches(REG_EXP_NUMBER_PATTERN)) {
        throw new ValidatorException(
            new FacesMessage(
                FacesMessage.SEVERITY_WARN,
                "Agregar Producto : ",
                "No es un Codigo de barras valido :" + codigoBuscar));
      }

      productoEncontrado = productoJPAController.findEntityByReadableProperty(codigoBuscar);

      cantidadPrevia = agregarProductoADetallePrevia(productoEncontrado.getId(), cantidadCBAgregar);

      fm =
          new FacesMessage(
              FacesMessage.SEVERITY_INFO,
              "Agregar Producto : ",
              "Se actualizó cantidad = "
                  + cantidadPrevia
                  + " + "
                  + cantidadCBAgregar
                  + " = "
                  + (cantidadPrevia + cantidadCBAgregar)
                  + ", del producto ["
                  + codigoBuscar
                  + "]");
    } catch (ValidatorException ex) {
      logger.error("## >> agergarNProductoPorCodigo: Exception", ex);
      fm = ex.getFacesMessage();
    } finally {
      cantidadAgregar = 1;
      cantidadCBAgregar = 1;
      productoEncontrado = null;
      productoConNombreDescripcion = new ArrayList<SelectItem>();
      nombreDescripcion = null;
      codigoBuscar = "";
      FacesContext.getCurrentInstance().addMessage(null, fm);
    }
  }
  private synchronized int agregarProductoADetallePrevia(Integer productoIdAgregar, int cantidad) {
    int cantidadPrevia = 0;
    PedidoVentaDetalleWrapper detalleVentaPedidoAgregar = null;
    logger.debug(
        "-->> agregarProductoADetallePrevia: productoIdAgregar="
            + productoIdAgregar
            + ", cantidad="
            + cantidad);
    for (PedidoVentaDetalleWrapper dvp : pedidoVentaDetalleList) {
      if (dvp.getProducto().getId().intValue() == productoIdAgregar.intValue()) {
        detalleVentaPedidoAgregar = dvp;
        break;
      }
    }
    if (detalleVentaPedidoAgregar != null) {
      if (detalleVentaPedidoAgregar.getCantidad() + cantidad
          > detalleVentaPedidoAgregar.getCantMax()) {
        throw new ValidatorException(
            new FacesMessage(
                FacesMessage.SEVERITY_ERROR,
                "Agregar Producto : ",
                "Producto ["
                    + detalleVentaPedidoAgregar.getProducto().getCodigoBarras()
                    + "] ya agregado, pero con esta cantidad (+"
                    + cantidad
                    + ") excede la existencia en Almacén de "
                    + detalleVentaPedidoAgregar.getCantMax()
                    + " unidades."));
      } else {
        cantidadPrevia = detalleVentaPedidoAgregar.getCantidad();
        detalleVentaPedidoAgregar.setCantidad(cantidadPrevia + cantidad);
        logger.debug("-->> agregarProductoADetallePrevia: Ok, actualizada");
      }
    } else {
      detalleVentaPedidoAgregar = new PedidoVentaDetalleWrapper(new PedidoVentaDetalle());
      detalleVentaPedidoAgregar.setCantidad(cantidad);

      Producto producto = productoJPAController.findById(productoIdAgregar);
      Collection<AlmacenProducto> almacenProductoCollection =
          producto.getAlmacenProductoCollection();
      int cantMaxAlmacen = 0;
      double precioObjetivo = 0.0;
      for (AlmacenProducto almacenProducto : almacenProductoCollection) {
        if (almacenProducto.getAlmacen().getId().intValue()
            == getAlmacenObjetivo().getId().intValue()) {
          precioObjetivo = almacenProducto.getPrecioVenta();
          cantMaxAlmacen = almacenProducto.getCantidadActual();
        }
      }

      if (cantidad > cantMaxAlmacen) {
        throw new ValidatorException(
            new FacesMessage(
                FacesMessage.SEVERITY_ERROR,
                "Agregar Producto : ",
                "Producto ["
                    + producto.getCodigoBarras()
                    + "] se hiba a agregar, pero con esta cantidad (+"
                    + cantidad
                    + ") excede la existencia en Almacén de "
                    + cantMaxAlmacen
                    + " unidades."));
      }
      if (listAlmacenProductoBuscar == null) {
        getListAlmacenProductoBuscar();
      }
      AlmacenProductoDemanda prodEnDemanda = productoDemandaHT.get(productoIdAgregar);
      if (prodEnDemanda != null) {
        detalleVentaPedidoAgregar.setCantDemanda(prodEnDemanda.getSumDemanda());
        detalleVentaPedidoAgregar.setOtrosPedidos(prodEnDemanda.getOtrosPedidos());
      }

      detalleVentaPedidoAgregar.setCantMax(cantMaxAlmacen);
      detalleVentaPedidoAgregar.setProducto(producto);
      detalleVentaPedidoAgregar.setDescuentoAplicado(0.0);
      detalleVentaPedidoAgregar.setPrecioVenta(precioObjetivo);

      pedidoVentaDetalleList.add(detalleVentaPedidoAgregar);
      // pedidoVentaDetalleList.add(0, detalleVentaPedidoAgregar);
      logger.debug("-->> agregarProductoADetallePrevia: Ok, Add new");
    }
    return cantidadPrevia;
  }
  private void agregarProductoADetalle(Integer productoIdAgregar) {
    PedidoVentaDetalleWrapper detalleVentaPedidoAgregar = null;
    logger.debug(
        "################################ >> agregarProductoADetalle: productoIdAgregar="
            + productoIdAgregar);
    for (PedidoVentaDetalleWrapper dvp : pedidoVentaDetalleList) {
      if (dvp.getProducto().getId() == productoIdAgregar) {
        detalleVentaPedidoAgregar = dvp;
        break;
      }
    }
    try {
      if (detalleVentaPedidoAgregar != null) {
        if (detalleVentaPedidoAgregar.getCantidad() >= detalleVentaPedidoAgregar.getCantMax()) {
          logger.warn(
              "################################ >> agregarProductoADetalle: Cantidad Exedida, no se agregara");

          throw new ValidatorException(
              new FacesMessage(
                  FacesMessage.SEVERITY_ERROR,
                  "Sobrepasa cantidad Maxima de existencia en Almacenes",
                  "Sobrepasa cantidad Maxima de existencia en Almacenes"));
        } else {
          detalleVentaPedidoAgregar.setCantidad(detalleVentaPedidoAgregar.getCantidad() + 1);
          logger.debug("################################ >> agregarProductoADetalle: \t Ok, edit");
        }
      } else {
        detalleVentaPedidoAgregar = new PedidoVentaDetalleWrapper(new PedidoVentaDetalle());
        detalleVentaPedidoAgregar.setCantidad(1);

        Producto producto = productoJpaController.findProducto(productoIdAgregar);
        Collection<AlmacenProducto> almacenProductoCollection =
            producto.getAlmacenProductoCollection();
        int cantMaxAlmacenes = 0;
        for (AlmacenProducto almacenProducto : almacenProductoCollection) {
          cantMaxAlmacenes += almacenProducto.getCantidadActual();
        }

        if (cantMaxAlmacenes <= 0) {
          logger.warn(
              "################################ >> agregarProductoADetalle: Cantidad Exedida, No hay existencia en Almacenes");

          throw new ValidatorException(
              new FacesMessage(
                  FacesMessage.SEVERITY_ERROR,
                  "No hay existencia en Almacenes",
                  "No hay existencia en Almacenes"));
        }

        detalleVentaPedidoAgregar.setCantMax(cantMaxAlmacenes);
        detalleVentaPedidoAgregar.setProducto(producto);
        detalleVentaPedidoAgregar.setDescuentoAplicado(0.0);

        detalleVentaPedidoAgregar.setPrecioVenta(
            detalleVentaPedidoAgregar.getProducto().getPrecioBase()
                * (1.0 + LogicaFinaciera.getImpuestoIVA()));

        pedidoVentaDetalleList.add(detalleVentaPedidoAgregar);
        logger.debug("################################ >> agregarProductoADetalle: \t Ok, Add new");
      }
    } catch (ValidatorException ve) {
      logger.debug("<<!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
      FacesContext.getCurrentInstance().addMessage(null, ve.getFacesMessage());
    }
  }