Sistema De Turnos

Un saludo estoy trabajando en un sistema de turnos y quisiera saber como puedo darle solución a la siguiente situación ya que no tengo ni idea como se debe hacer:

Quisiera seleccionar una fecha y que el sistema automáticamente me muestre un listado de horas de las cuales solo se debe poder seleccionar únicamente las horas que estén disponibles es decir que no se hallan asignado anteriormente.

A continuación adjunto imagen de lo que quiero.

Muchas Gracias

Hola compañero! No tienes ni idea???

Si he entendido bien es un modelo de datos sencillo con dos propiedades: la fecha, donde guardas la fecha/hora del turno, y otro campo que puede llamarse ocupado, reservado… donde guardar el id del usuario que hace la reserva. Si esta propiedad es false o está vacía lógicamente el turno está libre.

Un saludo fher, gracias por responder buscando un poco en la web encontré algo similar a lo que quiero (A partir del 1:18 de este vídeo https://www.youtube.com/watch?v=MoCFzPIDG6M).

En mi base de datos tengo el campo Fecha y Hora y en mi formulario tengo lo siguiente para la fecha donde indico que me muestre el día actual y el día siguiente. (Aquí me surge una pregunta adicional como desactivar los días sábados y domingos).

<?php echo $form->field($model,‘fecha_turno’)->

widget(DatePicker::className(),[


    'dateFormat' =&gt; 'yyyy-MM-dd',


    'clientOptions' =&gt; [


        'changeMonth' =&gt; 'true', 


        'autoSize'=&gt;true,


        'dateFormat'=&gt;'yy-mm-dd',


        'timeFormat' =&gt; 'H:i:s', 


        'showAnim'=&gt;'slide',


        'showOtherMonths'=&gt;false, 


        'minDate'=&gt;'date(&quot;Y-m-d&quot;)', 


        'maxDate'=&gt; &quot;+1d&quot;,


    ],


    'options' =&gt; ['class' =&gt; 'form-control', 'style' =&gt; 'width:100%']


]) ?&gt; 

En el Paso 2 del vídeo seleccionan una fecha y automáticamente Paso 3 aparecen unas horas predeterminadas donde desactivan las que ya se encuentran agendadas y activan las que se pueden agendar. (Esto es lo que no se como se puede hacer), supongo que el orden seria:

  1. Mostrar las horas al seleccionar una fecha.

  2. Recorrer la bd para desactivar o activar horas según la fecha seleccionada.

  3. Colocar la hora en mi campo hora y Guardarla en bd.

Muchas Gracias

Hola compañero!

A ver, ¿los turnos los tienes todos de antemano ya programados en la base de datos? Así de primeras creo que sería lo mejor si la programación de turnos no cumple una regla fija, es decir si los turnos dependen de cada día, de cada médico y otras cosas.

Cada turno debe tener un campo con el id de usuario que hace la reserva, o vacío si está libre, así no solo sabes que el turno está ocupado, sino qué usuario ha hecho la reserva.

Y solo con esos dos campos de la tabla, fecha y reservado, ya conoces toda la información de la que hablas:

  • Cuando el usuario selecciona un día, haces una consulta condicional solo para ese día.

  • Los turnos libres tendrán el campo reserva vacío, los habilitas/deshabilitas en base a esto.

  • Evitar sábados, domingos y festivos: al tener los turnos programados de antemano, simplemente estos días no hay turnos programados. También deberías comprobar si cada día del calendario tiene turnos programados y libres, para habilitar o no ese día.

Tanto las funciones de fecha de Mysql como la función date de php te permiten trabajar con fechas.

Como los formatos de fecha son un rollo yo lo que hago es operar siempre con marcas de tiempo y formatearlas en la vista.

Esto es lo que se me ocurre así de primeras, estúdialo bien porque la clave está en modelar bien los datos.

Salu2.

Perdón que me meta en este post y se que es de hace unos meses. Pero estoy atravesando el mismo tema para una Obra Social.

Lo que me surge como análisis también es la concurrencia a la base de datos, en mi caso muchos usuarios pueden estar al mismo tiempo intentando reservar un turno, entonces lo que se puede dar es que un usuario "A", seleccione por ejemplo un día "X" disponible, pero mientras tanto se levanta y deja unos segundos la pantalla donde tiene el formulario, y va a atender el teléfono. Pero el turno todavía no se ha guardado en la base de datos.

Luego un usuario "B" intenta guardar el mismo turno ya que le aparece disponible, porque el usuario "A" no ha confirmado la transacción.

Entonces la duda es, qué sucede o qué debería suceder en cuanto a vuestra experiencia? Dejar que el usuario "B" pueda guardar dicho turno y luego anularle el formulario al usuario "A" cuando este regrese a la pantalla, o directamente agregar un campo tipo flag, donde se pueda setear en "uso" o en "proceso", o algún tipo y no mostrarlo al usuario "B" hasta que no se guarde o cancele el proceso?

Bueno, espero haber sido claro y que se desarrolle un poco este tema ya que es muy importante para muchos.

Saludos y gracias!!!

Hola Nicolás, estás perdonado! Esta es mi modesta opinión al problema que planteas:

Desde el lado del servidor la aplicación no puede hacer nada en esos casos: 1º) muestra la página con los turnos libres; 2º espera la respuesta del usuario; y 3º recibe los datos, que debe validar y guardar.

O sea que en ese caso al primero le saldrá un mensaje de reserva correcta, y al segundo le debe aparecer el error de reserva ya ocupada, resultado de la validación antes de guardarla, aunque viera el turno libre.

Para mantener la página actualizada puedes refrescarla en el navegador del usuario cada cierto tiempo, si es que se trata de un problema serio, pero información en tiempo real al 100% creo que no le puede mostrar. Quizás quien sepa más javascript/ajax que yo nos lo pueda aclarar.

En cualquier caso esas cosas pasan en todas las aplicaciones web y los datos se deben validar siempre del lado del servidor. Lo que pasa del lado del cliente no se puede controlar (y menos saber que el usuario habla por teléfono mientras tiene nuestra página abierta XD).

Saludos.

Muchísimas gracias por responder fher!

Bueno mira obviamente no vamos a saber qué hace detrás de la pantalla jajajjaja…pero creo que se puede realizar algún tipo de validación…para mi el tema está en mientras se esté reservando el turno, aún si no se ha guardado, ese turno debería quedar como en stand-by, como para no generar ese tipo de errores que pueden suceder.

Seguro alguien que ya haya pasado por esto puede aportar algún consejo. Para mi es más de diseño que otra cosa.

Bueno muchas gracias nuevamente. Y espero interactuar más seguido a partir de ahora en estos foros.

Saludos!

Hola Nicolás!

A ver, desmenuzando porque son dos temas distintos:

1.- Si quieres implementar eso necesariamente debes guardarlo en la base de datos, por ejemplo con un campo estado que indique "en proceso de reserva". Si la reserva consta de dos pasos, seleccionar y confirmar, en el primero la pones en proceso, y se mostraría deshabilitada para otros usuarios, y al confirmar la pones reservada, o bien si no se confirma debes restablecerla a su estado inicial (si el usuario te deja, porque si cierra la página la reserva se queda "en proceso" y tendrás que solucionar eso XD).

2.- Y por otra parte, si quieres que la información se muestre actualizada a otros usuarios, después de que carguen la página, el navegador necesariamente tiene que hacer peticiones al servidor, y el servidor a la BD para comprobar el estado de la reserva, y esto se puede hacer de dos maneras: refrescando toda la página o refrescando solo una parte con Ajax.

Hasta ahí lo que yo sé…

Se agradecen opiniones de expertos en Ajax.

Saludos.

Hola , saludos cordiales , interesante tema , yo te recomendaria que uses Meteor, Comet, HTTP REVERSE, HTML 5 Web Sockets:, Ajax Long Polling , Server Push … las tecnologias usadas por google (gtalk, hangout), microsoft (skype), faceboook (chat y mensajeria) y muchas otras por ejemplo . . . . cuando estas en facebook y se conecta un amigo, en ningún momento tu haces la peticion, el servidor "TE INFORMA" que se conecto un amigo , esto ocurre por que al conectarse cambia el status en tu base de datos de amigos de chat, el servidor lo detecta y "TE INFORMA" . . .

creo que algo así es lo que buscas para el sistema de tickets, de modo que se pueda "ALERTAR" al usuario de que el turno ya no se encuentra disponible en ese momento que el estaba pensando que horario seleccionaba . . .

https://www.meteor.com/showcase