Foros del Web » Programando para Internet » PHP »

Problema con fechas y sistema de reservaciones

Estas en el tema de Problema con fechas y sistema de reservaciones en el foro de PHP en Foros del Web. Hola a todos. Estoy haciendo un sistema de reservaciones para un pequeño hotel de 15 habitaciones, y básicamente lo que necesito resolver es lo siguiente: ...
  #1 (permalink)  
Antiguo 30/09/2007, 13:08
Avatar de Escoffie  
Fecha de Ingreso: abril-2003
Ubicación: Mérida, Yucatán
Mensajes: 242
Antigüedad: 21 años
Puntos: 9
Problema con fechas y sistema de reservaciones

Hola a todos.

Estoy haciendo un sistema de reservaciones para un pequeño hotel de 15 habitaciones, y básicamente lo que necesito resolver es lo siguiente:
  1. El usuario selecciona una fecha de entrada y una fecha de salida.
  2. El sistema compara dichas fechas con las fechas en que las habitaciones están reservadas.
  3. Si hay habitaciones libres en ese intervalo de fechas, puede continuar, de otro modo, muestra un mensaje.
El problema lo tengo al comparar las fechas. Es más un problema de lógica que otra cosa.

Más o menos lo que quiero lograr es lo siguiente

Dados los siguientes datos:

Fecha solicitada: del 9 al 12 de octubre

Cuarto a) Ocupado del 10 al 13 de octubre: FALSO
Cuarto b) Ocupado del 12 al 15 de octubre: VERDADERO
Cuarto c) Ocupado del 10 al 15 de octubre: FALSO
Cuarto d) Ocupado del 8 al 13 de octubre: FALSO
Cuarto e) Ocupado del 7 al 9 de octubre: VERDADERO

Es decir, si el intervalo de fechas solicitados se intersecta o está contenido en el intervalo de fechas que las habitaciones están ocupadas, devuelve FALSO, si no, devuelve VERDADERO.

Nótese en el cuarto b), que el día 12 de octubre está ocupado, pero el usuario se iría el mismo día, como un se va a las 12:00im y el otro entra a las 2:00pm, no hay problema.

Actualmente estoy tratando de resolverlo con puro PHP con arrays hechos a mano, pero finalmente pretendo usar una base de datos MySQL, así que si hubiera una consulta que haga el trabajo, sería útil también.

El sistema tiene que funcionar en PHP 4.3 y MySQL 4.1, así que no podría usar funciones más modernas.

De antemano, muchas gracias por la ayuda.

Pongo a continuación el código que llevo hecho.

Código PHP:
<?php
# Iniciar fechas en checkin y checkout
# Esto para iniciar los inputs con fechas 7 y 10 días en el futuro de anticipación
if(!isset($_POST['Submit_check'])){
    
$mas07dias date('Y-m-d'mktime(000date("m")  , date("d")+7date("Y")));
    
$mas10dias date('Y-m-d'mktime(000date("m")  , date("d")+10date("Y")));
} else {
    
# Si ya se envió el formulario, usa los datos posteados para los campos input
    
$mas07dias $_POST['checkin1'];
    
$mas10dias $_POST['checkout1'];
}

# Hardcoded: fechas "ocupadas" y cuartos "ocupados" para probar disponibilidad
# Reemplazar por recordset tomado de la base de datos
# ci = checkin, co = checkout, room= número de la habitación, cod_cliente = id del cliente que hizo la reservación en la base de datos
$res[] = array('ci'=>'2007-10-10','co'=>'2007-10-13''room'=>'01e','cod_cliente'=>1);
$res[] = array('ci'=>'2007-10-10','co'=>'2007-10-15''room'=>'04s','cod_cliente'=>1);
$res[] = array('ci'=>'2007-10-12','co'=>'2007-10-25''room'=>'02s','cod_cliente'=>2);

?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wdg="http://ns.adobe.com/addt">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Prueba con conjuntos de fechas</title>
</head>

<body>
<?php
# Si se selecciona una fecha de menos de 7 días en el futuro, muestra un error
if(strtotime($_POST['checkin1']) < mktime(000date("m")  , date("d")+7date("Y"))){
    echo 
"<h3>No puede seleccionar fechas con menos de 7 días de anticipación</h3>";
}
# Si la fecha de entrada es mayor o igual a la fecha de salida, muestra un error
if(strtotime($_POST['checkin1'])>=strtotime($_POST['checkout1'])) {
    echo 
"<h3>La fecha de salida no puede ser igual o menor a la fecha de entrada</h3>";
}

# Muestra si las fechas enviadas chocan con las fechas ocupadas
if(isset($_POST['Submit_check'])){
    foreach(
$res as $a){
        
$entradaPost strtotime($_POST['checkin1']);
        
$salidaPost strtotime($_POST['checkout1']);
        
$entradaHuesped  strtotime($a['ci']);
        
$salidaHuesped  strtotime($a['co']);
        
#
        # AQUÍ ES DONDE SEGÚN YO ESTÁ EL PROBLEMA, EN ESTE IF...
        #
        
if(($entradaPost>=$salidaHuesped) or ($salidaPost<=$salidaHuesped)) $disponibilidad " ::: Cuarto $a[room] disponible ::: "; else $disponibilidad " Ocupado";
        echo 
"<p>Cuarto $a[room]: <br />
                Fecha posteada Checkin "
.($_POST['checkin1'])." / fecha guardada checkin ". ($a['ci'])."<br />
                Fecha posteada Checkout "
.($_POST['checkout1'])." / fecha guardada checkout ".($a['co'])."<br />
                $disponibilidad</p>"
;
    }
}
?>
<form id="form1" name="form1" method="post" action="">
  <label>Check in
  <input name="checkin1" id="checkin1" value="<?php echo $mas07dias;?>"  />
  </label>
  <label>Check out
  <input name="checkout1" type="text" id="checkout1" value="<?php echo$mas10dias;?>" />
  </label>
  <label>
  <input type="submit" name="Submit_check" id="Submit_check" value="Verificar disponibilidad" />
  </label>
</form>
<p><a href="test01.php">Reset</a></p>

</body>
</html>

Última edición por Escoffie; 30/09/2007 a las 13:25
  #2 (permalink)  
Antiguo 01/10/2007, 11:56
 
Fecha de Ingreso: septiembre-2007
Mensajes: 52
Antigüedad: 16 años, 7 meses
Puntos: 2
Re: Problema con fechas y sistema de reservaciones

Todo tu análisis del problema es correcto, y tu código parece estar muy cerca de lo que buscas. A primera vista, mi sugerencia apunta a la misma condición que diagnosticas como el problema :)

Código PHP:
if(($entradaPost>=$salidaHuesped) or ($salidaPost<=$salidaHuesped)) 
La lógica como yo la entiendo en palabras sería algo como: La habitación está libre si el cliente va a entrar después de que la reserva anterior haya terminado, o si el cliente va a salir antes de que la reserva anterior haya empezado.

En ese caso, la condición luciría así:

Código PHP:
if(($entradaPost>=$salidaHuesped) or ($salidaPost<=$entradaHuesped)) 
A propósito, gracias por publicar el código, eso facilita mucho el estudio del problema :). Cuéntanos cómo te va y si hay que hacer más ajustes los miramos.
  #3 (permalink)  
Antiguo 08/10/2007, 13:45
Avatar de Escoffie  
Fecha de Ingreso: abril-2003
Ubicación: Mérida, Yucatán
Mensajes: 242
Antigüedad: 21 años
Puntos: 9
Re: Problema con fechas y sistema de reservaciones

Hola Mhatter:

Mil gracias por tu respuesta.
De hecho la revisé casi de inmediato a cuando respondiste, y funcionó a la primera.
Ando con algunos problemillas que surgieron adicionales al problema aquí tratado. Si llegara a tener dificultades, te tomaré la palabra para que me ayudes con los ajustes.
Saluds, y gracias de nuevo.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:50.