Consulta sobre algoritmo y queries SQL para consulta de pagina de turnos

652 views
Skip to first unread message

Harry Bouville

unread,
Jun 22, 2012, 12:25:43 AM6/22/12
to php...@googlegroups.com
Buenas, estoy implementando un sistema de turnos con PHP y MySQL.

No sé como resolver lo siguiente y apelo a vuestra experiencia para que me ayuden.

La situación que tengo que resolver es la siguiente :

- Los médicos atienden, cada uno, en dos turnos diarios ( mañana y tarde ). Y cada médico tiene una frecuencia de turnos diferente ( 10, 15, 20, 25, 30 minutos ).
Eso se guarda en una base de datos así :

- TABLA: profesionales

| profesional_id | nombre | apellido | frecuencia_turnos |

- TABLA: horarios_profesionales_mañana

| profesional_id | hora_inicio | hora_fin | 

- TABLA:  horarios_profesionales_tarde

| profesional_id | hora_inicio | hora_fin |

- TABLA:  turnos

|turno_id | fecha | nombre_dia | hora | profesional_id | paciente_id | observaciones

- Luego, en base a esa información se debe armar una página php/html con una tabla en donde los administrativos dan turnos para los médicos. A saber:

1) Primero, elijen de un select armado de la db al profesional.

2) Se muestran los horarios libres y ocupados para el profesional elegido para la semana actual. Pero también debe funcionar para la semana próxima o para cualquier fecha N.

La tabla que se le muestra al administrativo debe ser, masomenos  así:

Hora | Lunes 25-06-2012 | Martes 26-06-2012 | Miercoles 27-06-2012 | Jueves 28-06-2012 | Viernes 29-06-2012 |
8:00 | disponible             |   disponible             |   Turno dado.               |        disponible              | Turno dado.     |

Obviamente que esta información sale de la base de datos. Pero no sé como implementarlo.

Primero tengo que fijarme los turnos ocupados para la semana actual. Eso quiere decir que tengo que fijarme para cada día todos los horarios en sus dos turnos. Eso para los 5 dias de la semana.

Tengo que comparar los turnos dados con los turnos posibles. A su vez, debo conocer para cada fecha ( por ej 20-06-2012 ) el día de la semana que es, para ver los horarios en los que atiende.

Empecé a trabajarlo armando dos arrays, uno con turnos ocupados y otro con turnos disponibles. Y los comparaba. Usaba un formato tipo : 2012-06-15Viernes1530.

Entonces, si ya tenia un turno asignado el Viernes 16-06-2012 a las 15.30, lo ponia en el array de turnos asignados.

Ahi ya conocia los turnos ocupados. Luego podria compararlo con in_array de PHP con el otro array.

De todas maneras no tengo muy en claro cómo armar el array con los turnos disponibles. Yo conozco los datos de inicio y fin de atención para cada día.

Pero se me complica para armar el for con que va haciendo la tabla, por que si la tabla tiene el formato mecionado, tendria que ir iterando para una columna ( día lunes ) todos los horarios, luego otro for para el martes y así, dentro del for principal de la tabla.

En fin, me gustaría que me ayuden a ver cómo lo resolverian ustedes. Si lo harian comparando dos arrays, o lo resolverian todo directamente desde MySQL con consultas.

SIéntanse totalmente libres de sugerir otras opciones.

La verdad estoy bastante ofuscado con esto.

Cualquier ayuda es muy bienvenida.

Saludos.
Juan.

DEH

unread,
Jun 22, 2012, 12:08:15 PM6/22/12
to Grupo PHP Argentina
Hola,

¿El analisis lo hiciste vos?
Me parece raro la forma en que está hecha la base.

Supongamos un medico tiene turno mañana de 8 a 12, con frecuencia 30
minutos.
¿un paciente puede tomar turno de 8:28 a 8:58?
Según tu base de datos eso es posible, fijate que el medico va a tener
si o si 28 minutos en los que no puede atender a nadie.

Me parece mejor una estructura

profesional:
id, datos_etc, cantidad_turnos

asignacion:
id, fecha, profesional_id, numero_turno, paciente_id
indice (fecha, profesional_id, numero_turno) unico,

turno:
id, profesional_id, numero_turno, hora_inicio, hora_fin

Con esto ganas que tu grilla va a tener intervalos fijos para cada
profesional.

Así es muy facil tener una funcion que devuelva tres estados
(disponible, ocupado, no_trabaja)

public function disponible($fecha, $profesional_id, $numero_turno) {
if ($numero_turno > max_turno($profesional_id)) //max_turno es
simple
return NO_TRABAJA;
$sql = "SELECT id FROM asignacion WHERE profesional_id =
$profesional_id AND fecha = $fecha AND numero_turno =
$numero_turno"; //solo ejemplo, verificar las variables
if (result_query($sql) > 0) //esto es pseudo codigo
return OCUPADO;
return DISPONIBLE;
}

Para la girlla recorres por fecha y por numero de turno ejecutando la
funcion disponible.

Firma: yo

DEH

unread,
Jun 22, 2012, 11:04:42 AM6/22/12
to Grupo PHP Argentina

DEH

unread,
Jun 22, 2012, 11:05:26 AM6/22/12
to Grupo PHP Argentina

Harry Bouville

unread,
Jun 22, 2012, 3:15:55 PM6/22/12
to php...@googlegroups.com
El 22 de junio de 2012 13:08, DEH <deh...@gmail.com> escribió:
Hola,

¿El analisis lo hiciste vos?

No, no lo hice yo.
 
Me parece raro la forma en que está hecha la base.

Supongamos un medico tiene turno mañana de 8 a 12, con frecuencia 30
minutos.
¿un paciente puede tomar turno de 8:28 a 8:58?
Según tu base de datos eso es posible, fijate que el medico va a tener
si o si 28 minutos en los que no puede atender a nadie.

No, no es así.

Lo que la db te dice es el horario de inicio y horario de fin. Después en PHP se arma la tabla de turnos posibles, teniendo en cuenta la frecuencia.

Entonces te queda:

| hora | lunes | martes | miercoles | jueves | viernes |
| 8:00 |
| 8:30 |
| 9:00 |
| 9:30 |
| 10: 00 |
| 10: 30 |

y así hasta llegar a la hora de fin. Se calcula, en ese caso, para turnos de 30 minutos.

Ahora, lo que se hace dificil es armar la tabla teniendo en cuenta que :

- cada día el profesional atiende en franjas horarias diferentes.
- hay que considerar los turnos dados, armar los horarios posibles para cada dia, comparar horarios posibles con horarios asignados, y mostrar toda esa data.

Al menos, a mi se me complicaba con eso.

¿ Se entiende ?.

Está buena tu propuesta, pero no puedo modificar la estructura de la DB :-(

Slds..

DEH

unread,
Jun 22, 2012, 8:06:38 PM6/22/12
to Grupo PHP Argentina
Uh, mi mensaje salió 3 veces, perdón por el spam.

>Ahora, lo que se hace dificil es armar la tabla teniendo en cuenta que :
>- cada día el profesional atiende en franjas horarias diferentes.

mmm. con tu estructura de base de datos solo podés tener una franja
horaria por profesional.
en todo caso:
-la función que te pase antes (con ligeras modificaciones) también
te sirve. Con hora_inicio, hora_fin y frecuencia podes calcular la
cantidad de turnos y el comienzo y fin de cada uno de ellos. Una vez
calculados los turnos manejalos siempre por nro de turno.
-dado que tenés franjas horarias distintas para cada día, no uses
una sola tabla (html) para mostrar toda la grilla semanal, usá al
menos un div por día, y adentro podes usar una tabla (o divs) para
hacer la grilla x día.

Firma: yo

On 22 jun, 16:15, Harry Bouville <harrybouvi...@gmail.com> wrote:

Juan Rodríguez Monti

unread,
Jun 25, 2012, 1:18:09 AM6/25/12
to php...@googlegroups.com
El 22 de junio de 2012 21:06, DEH <deh...@gmail.com> escribió:
Uh, mi mensaje salió 3 veces, perdón por el spam.

>Ahora, lo que se hace dificil es armar la tabla teniendo en cuenta que :
>- cada día el profesional atiende en franjas horarias diferentes.

mmm. con tu estructura de base de datos solo podés tener una franja
horaria por profesional.
 en todo caso:

Me parece que a lo que se refiere es a que con su estructura hay más de una entrada en la DB para cada profesional. Una entrada para cada día. No escala mucho, pero es lo que se refiere.

Habria que buscar una solución pensando en eso.

Slds.

Harry Bouville

unread,
Jun 25, 2012, 1:22:35 AM6/25/12
to php...@googlegroups.com
El 22 de junio de 2012 13:08, DEH <deh...@gmail.com> escribió:
Hola,

¿El analisis lo hiciste vos?
Me parece raro la forma en que está hecha la base.

Supongamos un medico tiene turno mañana de 8 a 12, con frecuencia 30
minutos.
¿un paciente puede tomar turno de 8:28 a 8:58?
Según tu base de datos eso es posible, fijate que el medico va a tener
si o si 28 minutos en los que no puede atender a nadie.

Me parece mejor una estructura

profesional:
id, datos_etc, cantidad_turnos

asignacion:
id, fecha, profesional_id, numero_turno, paciente_id
 indice (fecha, profesional_id, numero_turno) unico,

turno:
id, profesional_id, numero_turno, hora_inicio, hora_fin

La verdad que no entendí bien la estructura que proponés. ¿ Podrias explicar mejor cómo es esto del número de turno ?.

¿ Que pasa si un profesional atiende martes en un horario, y miercoles en otro y jueves en otro ?. ¿ Se entendió esa parte ?.

Agradezco tu ayuda, pero me gustaría me expliques esa parte para que termine de serme útil.

Convencí a mi jefe de poder modificar la estrucutra, por lo que tu explicación podria ayudarme.

Saludos,
Juan

Jadull Edgardo

unread,
Jun 26, 2012, 10:14:14 AM6/26/12
to php...@googlegroups.com
Hola

Capaz llegue tarde, pero deberias pensarlo  implementando  una Agenda de turnos.  A cada profesional tendra asignada una agenda con turnos para cualquier dia/hora 
Vas a tener abm para profesionales, abm para las configuraciones de los profesionales ( horarios de atencion, especialidad, centro  y esas cosas), turnos y agendas

Seguro es un poco engorroso pero creo que mediante sql parece que va a ser mejor para  comprobar los profesionales disponibles para una atencion de cierto dia/hora, o sea encontrar el proximo turno disponible para un profesional



-- 
Saludos 

Edgardo A. Jadull



--
Has recibido este mensaje porque estás suscrito al grupo "Grupo PHP Argentina" de Grupos de Google.
Para publicar una entrada en este grupo, envía un correo electrónico a php...@googlegroups.com.
Para anular tu suscripción a este grupo, envía un correo electrónico a php-arg+u...@googlegroups.com
Para tener acceso a más opciones, visita el grupo en http://groups.google.com/group/php-arg?hl=es.



Harry Bouville

unread,
Jun 26, 2012, 8:51:29 PM6/26/12
to php...@googlegroups.com
El 26 de junio de 2012 11:14, Jadull Edgardo <jadu...@gmail.com> escribió:
Hola

Capaz llegue tarde, pero deberias pensarlo  implementando  una Agenda de turnos.  A cada profesional tendra asignada una agenda con turnos para cualquier dia/hora 
Vas a tener abm para profesionales, abm para las configuraciones de los profesionales ( horarios de atencion, especialidad, centro  y esas cosas), turnos y agendas

Hola, no no es tarde.

Pero, ¿ cómo armarías las tablas ?.

¿ Escribirias un listado de todos los horarios posibles de lunes a viernes para cada profesional ?.
 

Seguro es un poco engorroso pero creo que mediante sql parece que va a ser mejor para  comprobar los profesionales disponibles para una atencion de cierto dia/hora, o sea encontrar el proximo turno disponible para un profesional

Y si armás una tabla con los horarios hardcoded, ¿ después como armarias el query para mostrar como resultado los libres y los ocupados ?.

Slds.
Reply all
Reply to author
Forward
0 new messages