public void validateVehiculo(FacesContext context, UIComponent component, Object value) {
    String patente = value.toString();
    if (patente != null) {
      vehiculo = getVehiculoService().findByPatenteVehiculo(patente.toUpperCase());
      if (vehiculo != null) {
        usuario = vehiculo.getCliente().getUsuario();
        TipoEstadia tipoEstadia = getTipoEstadiaService().findByNombreTipoEstadia("Por Mes");
        CategoriaVehiculo categoriaVehiculo = vehiculo.getModeloVehiculo().getCategoriaVehiculo();
        tarifa =
            getTarifaService()
                .findTarifaVigenteByPlayaAndCategoriaAndTipoEstadia(
                    playaLoggeada, categoriaVehiculo, tipoEstadia);
        if (tarifa == null) {
          FacesMessage message =
              new FacesMessage(
                  FacesMessage.SEVERITY_WARN,
                  "No existe tarifa mensual " + "para la categoría " + tipoEstadia,
                  "");
          throw new ValidatorException(message);
        } else {
          promocionesDisponibles =
              getPromocionService().findByPlayaAndTarifa(playaLoggeada, tarifa);
        }

      } else {
        FacesMessage message =
            new FacesMessage(
                FacesMessage.SEVERITY_WARN, "No existe el vehiculo con patente: " + patente, "");
        throw new ValidatorException(message);
      }
    }
  }
 @Override
 public List<String[]> findEstadiasByVehiculoByPeriodo(
     Vehiculo vehiculo, Date fechaDesde, Date fechaHasta) {
   List<String[]> resultQuery = new ArrayList<String[]>(3);
   String query =
       "SELECT CAST(MONTH(DATE(fechaHoraEgreso)) AS CHAR(50)) AS 'MES'"
           + ", CAST(YEAR(DATE(fechaHoraEgreso)) AS CHAR(50)) AS 'AÑO'"
           + ", CAST(SUM(importeTotal) AS CHAR(50)) AS 'TOTAL CONSUMIDO'"
           + "FROM detalle_estadia "
           + "WHERE vehiculoID = ? AND fechaHoraEgreso is not null "
           + "AND DATE(fechaHoraEgreso) >= CONVERT(?, DATE) "
           + "AND DATE(fechaHoraEgreso) <= CONVERT(?, DATE) "
           + "GROUP BY MONTH(DATE(fechaHoraEgreso)), YEAR(DATE(fechaHoraEgreso)) "
           + "ORDER BY 2, 1";
   SimpleDateFormat formato = new SimpleDateFormat("yyyy/MM/dd");
   List<?> list =
       getSessionFactory()
           .getCurrentSession()
           .createSQLQuery(query)
           .setParameter(0, vehiculo.getId())
           .setParameter(1, formato.format(fechaDesde))
           .setParameter(2, formato.format(fechaHasta))
           .list();
   if (!list.isEmpty()) {
     String[] vConsumo;
     for (Object obj : list) {
       vConsumo = new String[3];
       Object[] vObject = new Object[3];
       vObject = ((Object[]) obj);
       vConsumo[0] = (String) vObject[0];
       vConsumo[1] = (String) vObject[1];
       vConsumo[2] = (String) vObject[2];
       resultQuery.add(vConsumo);
     }
   }
   return resultQuery;
 }
  public String abonoAddFromPlayaGerente() {
    Abono abono;
    try {

      if (getAbonoService().existeAbonoVehiculo(vehiculo, playaLoggeada) == false) {

        abono = new Abono(getFechaDesde(), getFechaHasta(), getTarifa(), playaLoggeada);
        abono.setVehiculo(getVehiculo());
        abono.setPromocion(getPromocion());

        CuentaCliente cuentaCliente = new CuentaCliente();
        cuentaCliente = vehiculo.getCliente().getCuentaCliente();

        float nuevoSaldo;

        if (cuentaCliente.getSaldo() >= getTarifa().getImporte()) {

          if (getPromocion() != null) {
            nuevoSaldo =
                cuentaCliente.getSaldo()
                    - (getTarifa().getImporte() * ((getPromocion().getDescuento()) / 100 + 1));
          } else {
            nuevoSaldo = cuentaCliente.getSaldo() - (getTarifa().getImporte());
          }

          // Grabo el abono
          getAbonoService().save(abono);

          // Actualizo la cuenta de cliente.
          cuentaCliente.setSaldo(nuevoSaldo);
          getCuentaClienteService().update(cuentaCliente);

          // Creo la transacción de la playa
          TransaccionPlaya txPlaya = new TransaccionPlaya();
          CuentaPlaya cuentaPlaya = getCuentaPlayaService().findByPlaya(playaLoggeada);
          txPlaya.setCuentaPlaya(cuentaPlaya);
          txPlaya.setFecha(new Date());

          float importe;
          if (getPromocion() != null) {
            importe = getTarifa().getImporte() * ((getPromocion().getDescuento()) / 100 + 1);
          } else {
            importe = getTarifa().getImporte();
          }
          txPlaya.setImporte(importe);

          TipoPago tipoPagoCuenta = getTipoPagoService().findByNombreTipoPago("Cuenta");
          txPlaya.setTipoPago(tipoPagoCuenta);

          getTransaccionPlayaService().save(txPlaya);

          // Creo la transacción cliente
          TransaccionCliente transaccionCliente = new TransaccionCliente();
          transaccionCliente.setCuentaCliente(cuentaCliente);
          transaccionCliente.setFecha(new Date());
          transaccionCliente.setImporte(-importe);
          transaccionCliente.setTipoPago(tipoPagoCuenta);

          getTransaccionClienteService().save(transaccionCliente);

          FacesMessage message =
              new FacesMessage(
                  FacesMessage.SEVERITY_INFO, "Se registró exitosamente el abono mensual", "");
          FacesContext.getCurrentInstance().addMessage(null, message);

          return "abonoaddendgerente";
        } else {
          FacesMessage message =
              new FacesMessage(
                  FacesMessage.SEVERITY_WARN,
                  "No posee saldo suficiente para efectuar el abono mensual.",
                  "");
          FacesContext.getCurrentInstance().addMessage(null, message);
        }

      } else {
        FacesMessage message =
            new FacesMessage(
                FacesMessage.SEVERITY_WARN,
                "Ya existe un abonado en el período indicado. ¡Verifique las fechas!",
                "");
        FacesContext.getCurrentInstance().addMessage(null, message);
      }

    } catch (Exception ex) {
      FacesMessage message =
          new FacesMessage(
              FacesMessage.SEVERITY_ERROR,
              "Error, no se pudo registrar el abono mensual, Disculpe las molestias ocacionadas.",
              "");
      FacesContext.getCurrentInstance().addMessage(null, message);
      ex.printStackTrace();
    }
    return null;
  }