[PHP / MYSQL] Script horaires de disponibilité

Petit nouveau ! | 2 Messages

22 déc. 2011, 02:05

Bonjour,

Je recherche un moyen de gérer le temps de disponibilité d'un utilisateur sur une semaine de 7 jours.
Par exemple un utilisateur doit pouvoir définir 7 jours à l'avance ses horaires de disponibilités en sachant qu'il peut effectuer autant de pauses qu'il le souhaite dans la journée, faire des journées complètes ou être indisponible pour toute une journée.

Côté Mysql, J'avais pensé à construire ma table avec les colonnes suivantes en donnant la possibilité à l'user d'affecter true ou false à chaque entrée via le script de gestion de son emploi du temps:

Code : Tout sélectionner

(vulgarisé) dispo { userId lundi lundi_01h lundi_02h ... lundi_23h lundi_24h mardi mardi_01h mardi_02h ... mardi_23h mardi_24h mercredi ... }


On arrive à 176 colonnes en suivant ce schéma. De plus on ne peut pas gérer les demi-heures et les quarts d'heures (ce qui n'est pas sine qua non à l'élaboration du script mais qui aurait été un plus).
Après avoir parcouru quelques forums sur le sujet il semble qu'il ne soit pas recommandé d'avoir une table avec autant de colonnes, c'est bien trop lourd.

Je n'arrive pas à réorganiser ma table de façon optimale. L'un de vous a-t-il déjà eu à gérer ce genre de problème ? Si quelqu'un a une idée pour organiser ça de façon plus intelligente je suis preneur.

Je vous remercie.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

22 déc. 2011, 11:48

salut,

effective tu a un très gros problème de modélisation (176 colonnes c'est même pas imaginable :) ).

il te faut voir la chose autrement avec plusieurs tables.
forcement une tables "personnels" avec les "gens" dedans :) (cette table doit avoir une clef primaire que je vais appeler idgens par la suite).
après deux possibilitées
- tu gère (impose) les périodes deux tables en plus
- tu ne les gères pas une seule tables en plus

1er cas
une tables periodes : idpreriode, debut fin attention tu ne peux pas gèrer simplement les heures il va falloir mettre des entiers ou des flottant (10h30 c'est 10.5 etc etc
une table pour faire la jointure entre les deux
resa : idresa, idgens, idperiode, date (champs de type date pour savoir le jour où cela s'applique :)

2ème cas
une table resa : idresa, idgens, date, debut (une entier ou flottant) , durée (entier ou flottant).

a partir de la toute période qui n'est pas dans la / les table(s) est considérée comme libre :)

je te conseil de regarder sur le net les type de champs SQL permettant de gérer les temps (sur sqlpro.developpez.com par exemple).

@+
Il en faut peu pour être heureux ......

ViPHP
ViPHP | 2577 Messages

22 déc. 2011, 12:01

Bonjour,

Une table avec date-heure début et fin me semble une bonne option.

Pour les fonctions attention à ne pas rendre l'utilisation trop chiante. Je vois bien une fonction "ajouter une pause" (éclater une période en 2) et "supprimer les périodes entre 2 dates".

Il serait pas mal de créer automatiquement des périodes de présence à l'avance avec éventuellement des heures propres à chaque personne et un planning de vacances.

Le danger de cette application est de faire perdre du temps aux utilisateurs.

Mammouth du PHP | 2278 Messages

22 déc. 2011, 15:57

une tables periodes : idpreriode, debut fin attention tu ne peux pas gèrer simplement les heures il va falloir mettre des entiers ou des flottant (10h30 c'est 10.5
Il serait peut-être bon de lire ça pour les heures:
http://dev.mysql.com/doc/refman/5.0/fr/time.html
et ça pour les dates:
http://dev.mysql.com/doc/refman/5.0/fr/datetime.html
qui combinées avec les fonctions php de date et de time sonta ssez commodes...
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Petit nouveau ! | 2 Messages

20 mars 2012, 17:13

Bonjour,

J'avais laissé ce script de côté depuis quelques temps mais j'y suis revenu récemment et grâce aux conseils fournis j'ai pu le réaliser en pouvant gérer les horaires jusqu'à une minute près et sans surcharger la bdd.

Merci.