Script para habilitar un intervalo de horas con minutos para tu sistema de Reserva de Citas.

Les comparto un script básico que tuve que desarrollar para un módulo de citas de un proyecto «x». La idea que tuve fue crear un pequeño núcleo que fuera reutilizable para otros módulos y/o componentes donde se requiera un mecanismo de horarios, bloqueo de horas, intervalos en minutos con respecto a las citas que los usuarios pueden reservar.

# Domingos
# Feriados.
# Cupos por Horario.
# Horarios y 
# Horarios con BLOQUEO.
  
/* __________  _   ____________________  ______  ___   ______________  _   __
  / ____/ __ \/ | / / ____/  _/ ____/ / / / __ \/   | / ____/  _/ __ \/ | / /
 / /   / / / /  |/ / /_   / // / __/ / / / /_/ / /| |/ /    / // / / /  |/ / 
/ /___/ /_/ / /|  / __/ _/ // /_/ / /_/ / _, _/ ___ / /____/ // /_/ / /|  /  
\____/\____/_/ |_/_/   /___/\____/\____/_/ |_/_/  |_\____/___/\____/_/ |_/   
*/
 define("MINUTOS",60);
 $h_apertura = 7;  	# 7 AM.
 $h_cierre   = 17; 	# 5 PM - 1hrs. Se maneja en 24hrs
 
 # Si exiten Horas con Bloqueos especificos como Horarios de Almuerzo u otras actividades se llena el siguiente arreglo.
 $bloqueos 	 = array("05:00","05:15","05:30","05:45");

 $intervalo_citas = 4; 	# Los intervalos pueden ser:
 					# 1 = Cada Hora.
					# 2 = Cada 30 minutos 
					# 4 = Cada 15 Minutos
					# 5 = Cada 12 Minutos
					# 6 = Cada 10 minutos
					# 10 = Cada 6 minutos					
					# 12 = Cada 5 minutos										
					# 20 = Cada 3 minutos

	
	

 # Estructura JSON de Respuesta
 $a_datos = array("horas_disponibles"=>array()); // Para Estructura JSON.

					


 // Confecciona un set de horarios con el formato 07:00,07:15,07:30,07:45 ...
 $set_horarios = array();
 # Mantiene la posicion del arreglo de horarios.
 $indice = 0;
 
 while ($h_apertura <= $h_cierre){
	 
	 $inter_minutos = MINUTOS / $intervalo_citas;
	 $i = 0;
	 
	 while ($i < MINUTOS){
		 
		# Estructura JSON de Respuesta
		 $a = array();// Para Estructura JSON.


		 $set_horarios[$indice]['horario'] 			= date('H:i',mktime(date($h_apertura),date($i),date('s'),date('m'),date('d'),date('Y')));
		 $set_horarios[$indice]['horario_etiqueta'] = date('h:i A',mktime(date($h_apertura),date($i),date('s'),date('m'),date('d'),date('Y')));
									  

		 # Si existen horas especificas con bloqueos.
		 # se revisa para que ese horario no sea agregado en el nuevo arreglo de horas.
		 if (!in_array($set_horarios[$indice]['horario'],$bloqueos)){
			 	
				 //unset($set_horarios[$indice]);

				 # Validar el tema de los CUPOS para ese horario.
				 # Se debe validar contra base de datos cuantas citas hay para la fecha seleccionada y Hora seleccionada.
				 # Si la cantidad retornada por el SQL es igual al tope/limite de cupos el horario se debe deshabilitar.
				 
				 // Seudocodigo.
				 // $SQL = debes realizar la consulta a la base con fecha y hora y verificar cuantos registros tiene.
				 // if (cantidad_de_citas = cupo_permitido){
						// unset($set_horarios[$indice]);
		
				 // }
				 
		
				# Estructura JSON de Respuesta
				$a['hora_value'] = $set_horarios[$indice]['horario'];
				$a['hora_label'] = $set_horarios[$indice]['horario_etiqueta'];
				$a_datos["horas_disponibles"][] = $a;	
				# Estructura JSON de Respuesta
				 
				 # Incrementa la posicion del arreglo de horarios
				 $indice++; 		
			  
		 }//if (!in_array($set_horarios[$indice]['horario'],$bloqueos))


		 
		 # Incrementa el contador de Minutos
		 $i = $i + $inter_minutos;	
	 }
	 # Incrementa el contador de Horas
 	 $h_apertura++;	
 }





$a_datos['error']				= "200";
$a_datos['msg_error']			= "OK";
header("Content-type: application/json; charset=utf-8");
echo json_encode($a_datos);	
exit();