#!/bin/bash
# Cambiar el valor de estas varibles dependiendo de la necesidad
# del programa
TIEMPO_MINIMO_RESERVA=1
TIEMPO_MAXIMO_RESERVA=6
HORA_INICIO_RESERVA='08:00' # AM
HORA_FIN_RESERVA='02:00' # AM
FILE='reservas.txt' # Archivo para almacenar los datos de las reservas
# Expresiones regulares utilizadas para las validaciones de fecha y hora
REGX_FECHA="^[0-9]{4}-[0-9]{2}-[0-9]{2}$"
REGX_HORA="^(0[0-9]|1[0-9]|2[0-3]):([0-5][0-9])$"
function hora_a_segundos() {
local hora=$(echo "$1"|cut -d: -f1|bc)
local minutos=$(echo "$1"|cut -d: -f2|bc)
hora=$((hora*3600))
minutos=$((minutos*60))
local segundos=$((hora+minutos))
echo $segundos
}
################################################################
# NOTA
# Aquí deberian pedirse también los datos personales
################################################################
while [[ true ]]; do
read -p "Ingrese la fecha: [AAAA-MM-DD]: " fecha
if [[ "$fecha" =~ $REGX_FECHA ]] && date -d "$fecha" >/dev/null ; then
break
else
echo "La fecha ingresada no es valida"
fi
done
while [ true ]; do
read -p "Ingrese la hora de inicio: [HH:MM]: " hora_inicio
if [[ "$hora_inicio" =~ $REGX_HORA ]]; then
break
else
echo "La fecha ingresada no es valida"
fi
done
while [ true ]; do
read -p "Ingrese la hora de fin: [HH:MM]: " hora_fin
if [[ "$hora_fin" =~ $REGX_HORA ]]; then
break
else
echo "La hora no es valida"
fi
done
segundos_hora_inicio=$(hora_a_segundos $hora_inicio)
segundos_hora_fin=$(hora_a_segundos $hora_fin)
# Compruebo que la hora de inicio se encuentre dentro de la franja permitida
if [[ $segundos_hora_inicio -ge 7200 && $segundos_hora_inicio -lt 28800 ]]; then
echo "La hora inicio debe estar entre las 08:00 AM y 01:00 AM"
elif [[ $segundos_hora_inicio > $segundos_hora_fin ]];
then
echo "La hora de inicio debe ser menor a la hora de fin"
else
# Chequeo que la duración sea >= 1 y <= que 6
duracion=$(((segundos_hora_fin - segundos_hora_inicio)/3600))
if [[ $duracion -lt $TIEMPO_MINIMO_RESERVA || $duracion -gt $TIEMPO_MAXIMO_RESERVA ]]; then
echo "La reserva debe ser entre $TIEMPO_MINIMO_RESERVA y $TIEMPO_MAXIMO_RESERVA horas."
else
# Busco si hay reservas en la fecha ingresada
disponible=true
$(grep $fecha $FILE > tmp.txt)
if [[ $? -eq 0 ]]; then
# Hay reservas para la fecha, por lo tanto evaluo horarios disponibles
for line in $(cat tmp.txt)
do
fecha_reserva=$(echo $line | cut -d'|' -f5)
hora_inicio_reserva=$(echo $line | cut -d'|' -f6)
hora_fin_reserva=$(echo $line | cut -d'|' -f7)
# Convierto segundos
hora_inicio_reserva=$(hora_a_segundos $hora_inicio_reserva)
# Como esta es la hora de fin le sumo la hora de limpieza requerida entre un evento y otro
# 3600 segundos -> 1 hora
hora_fin_reserva=$(($(hora_a_segundos $hora_fin_reserva) + 3600))
# Esta es la parte clave:
# Existen 3 opciones
# 1) Que la hora de inicio ingresada por el usuario, sea mayor o igual que la hora de inicio y a su vez
# menor que la hora de fin, es decir que este entre la hora de inicio/fin de una reserva
# Ejemplo: 15:30 - 16:30 y el usuario ingrese como hora de inicio 16:00
# 2) Igual que el anterior pero con la hora de fin
# 3) Por ultimo, es que la hora de inicio ingresada sea menor que la hora de una reserva y que la hora de
# fin sea mayor que la hora de fin de la misma reserva:
# Ejemplo: 10:00 - 12:00 y el usuario ingresa 09:00 - 13:00 es decir, la hora de reserva abarca otro horario
# previamente ocupado.
if [[ ($segundos_hora_inicio -ge $hora_inicio_reserva && $segundos_hora_inicio -lt $hora_fin_reserva) ||
($segundos_hora_fin -ge $hora_inicio_reserva && $segundos_hora_fin -lt $hora_fin_reserva) ||
($segundos_hora_inicio -le $hora_inicio_reserva && $segundos_hora_fin -lt $hora_fin_reserva) ]]
then
echo "Ya heciste una reserva en este horario"
disponible=false
break;
fi
done
# Elimino el archivo temporal
rm -f "tmp.txt"
fi
if [[ $disponible = true ]]
then
echo "Reserva realizada con éxito"
################################################################
# NOTA:
# Debes cambiar esta linea con los datos personales ingresados por el usuario.
# El separador de campos utilizados entre cada datos es el pipe |
################################################################
echo -e "abzer0x|abzer0x|12345678|12345678|$fecha|$hora_inicio|$hora_fin\n" >> $FILE;
fi
fi
fi