IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Trouvez des créneaux horaires disponibles


Sujet :

Langage PHP

  1. #1
    Candidat au Club
    Inscrit en
    Juillet 2010
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 6
    Points : 4
    Points
    4
    Par défaut Trouvez des créneaux horaires disponibles
    Bonjour @ all !
    J'ai besoin d'un peu d'aide sur un problème qui est le suivant:

    En gros, je tente de faire un script qui permet de réserver des plages horaires correspondantes à des RDV dans une journée pour des durées X en minutes.

    Je parviens à détecter si des dates se chevauchent, mais le problème est que je souhaite stocker dans un tableau les crénaux possibles avec par exemple ce cas d'utilisation:

    Début journée : 08:00:00
    Fin journée : 12:00:00

    Créneaux réservés :
    08:00:00 - 09:00:00
    11:00:00 - 11:30:00

    Je dois donc récupérer dans mon tableau les créneaux libres qui sont pour une durée de 45mn par exemple:
    09:00:00 - 09:45:00
    09:45:00 - 10:30:00

    Voici le code avec lequel j'ai efectué mes tests, mais qui sont non concluants, je pense que j'ai un problème de raisonnement ou bien qu'il y a une autre méthode qui me permettrait de réaliser tout ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    <?php
    $nb_prestataires=1;
    $from_hour='2012-08-09 08:00:00';
    $to_hour='2012-08-09 10:30:00';
     
    $duree_prestation=60;//mn
     
     
    $plages_query = mysql_query("select * from reservations");
    while ($row = mysql_fetch_object($plages_query)) {
     
       $plages_reservees[] =array(
                                 'from'=> new DateTime($row->debut),
                                 'to'=> new DateTime($row->fin)
                                );
     
     
     
    }
    mysql_free_result($plages_query);
     
     
    function count_same_plage($plage, $array_to_check){
     
        $items = 0;
     
        foreach($array_to_check as $item_to_check){
     
            if ($plage === $item_to_check) {
            //print_r($plage); print_r($item_to_check);
            $items++;
            }
     
     
     
        }
     
     
     
        return $items;
     
     
     
    }
     
     
     
     
     
    $plages_non_reservees=array();
     
     
     
     
     
    $plages_disponibles=array();
    try {
        $from_hour_date = new DateTime($from_hour);
        $to_hour_date = new DateTime($to_hour);
     
    } catch (Exception $e) {
        echo $e->getMessage();
        exit(1);
    }
     
     
     
    while($from_hour_date<$to_hour_date){
     
    $to_from=$from_hour_date->format('Y-m-d H:i:s');
     $plages_non_reservees[]=array(
                                 'from'=>new DateTime($to_from),
     
                                  'to'=>new DateTime(date_add($from_hour_date, date_interval_create_from_date_string($duree_prestation.' minutes'))->format('Y-m-d H:i:s'))
     
                             );
     
    }
     
     
     
     
     
    //Recherche des plages possibles pour la prestation
     
    foreach($plages_non_reservees as $key=>$plage){//Pour toutes les plages possibles
    //print_r($plage);
     
        foreach($plages_reservees as $plage_reservee){
     
        echo "<p>".$plage_reservee['from']->format('H:i:s')." | ". $plage_reservee['to']->format('H:i:s')." vs ".$plage['from']->format('H:i:s')." | ". $plage['to']->format('H:i:s');
     
     
    $startTime =strtotime($plage_reservee['from']->format('H:i:s'));
    $endTime = strtotime($plage_reservee['to']->format('H:i:s'));
     
     
    $chkStartTime = strtotime($plage['from']->format('H:i:s'));
    $chkEndTime = strtotime($plage['to']->format('H:i:s'));
     
    //echo $compare_to_hour_date->format('d/m/Y H:i:s');
     
    if( ($chkStartTime >= $startTime) && ($chkEndTime <= $endTime)){
    echo "yo";
    }
    if(($startTime <= $chkStartTime) ){
     
     
     
     if(  1){
     
    if($chkStartTime > $startTime && $chkEndTime < $endTime)
    {   
    echo "1 Time is in between start and end time";
     
    }elseif(($chkStartTime > $startTime && $chkStartTime < $endTime) || ($chkEndTime > $startTime && $chkEndTime < $endTime))
    {    
    echo "2 ChK start or end Time is in between start and end time";
     
    }elseif($chkStartTime==$startTime || $chkEndTime==$endTime)
    {    
    echo "3 ChK start or end Time is at the border of start and end time";
     
     
    }elseif($startTime > $chkStartTime && $endTime < $chkEndTime)
    {    
    echo "4 start and end Time is overlapping  chk start and end time";
     
    }else{
     
     
     
     
     
     
            if (!in_array($plage, $plages_disponibles) && !in_array($plage, $plages_reservees) ) {
            $plages_disponibles[]=$plage;
        echo "  <font color=red>".$plage['from']->format('H:i:s')." | ".$plage['to']->format('H:i:s')."</font>";
        }
        echo count_same_plage($plage,$plages_disponibles);
     
    }
     
     
        echo "</p>";
            }
     
        }
     
    }
     
    }
     
     
    ?>
     
    <div style="float:left;width:500px;border:1px solid red;">
    <b>Plages réservées</b>
    <?php
    echo "<pre>";
    print_r($plages_reservees);
    echo "</pre>";
    ?>
    </div>
    <div style="float:left;margin-left:20px;width:500px;border:1px solid green;">
    <b>Plages disponibles</b>
    <?php
     
    foreach($plages_disponibles as $key=>$plage_dispo){
     
    if(($key)<count($plages_disponibles)-1){
    if($plages_disponibles[$key]['from']->format('Y-m-d H:i:s') == $plages_disponibles[$key+1]['from']->format('Y-m-d H:i:s')){
     
     
    echo $key.$plages_disponibles[$key]['from']->format('Y-m-d H:i:s')." == ".$plages_disponibles[$key+1]['from']->format('Y-m-d H:i:s')."<br />";
    unset($plages_disponibles[$key]);
    }
     
    }
     
     
    }
     
     
     
     
     
     
     
     
    echo "<pre>";
    print_r(($plages_disponibles));
    echo "</pre>";
    ?>
    </div>

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Juin 2007
    Messages
    748
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 748
    Points : 1 022
    Points
    1 022
    Par défaut
    hello, alors pour ma part je serais par les timestamps, de toute façon des que c'est date, je crois que je passe par les timestamps

    J'ai monté un exemple, ( je n'ai pas commenté, et te laisse tester ...),

    le principe, on enregistre les dispos dans un calendrier, on test les dispos par plage horraire, on enregistre des réservations, on ré-affiche en rouge les plages existantes, mais qui ne convienne pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
     
     <?php
     
    function timestamp_date($d,$m,$y,$h,$mn,$s ){
    	return mktime($h,$mn, $s, $m,  $d, $y);
    }
     
    function getMinPlage($min){
    	return $min*60;
    }
    function calandarbydate($date, $start , $end ){
     
    	$dateTab = explode('-',$date);
    	$startTab = explode(':',$start);
    	$endTab = explode(':',$end);
     
    	return
      	array(
    	  'date'=>$date,
    	  'start'=>timestamp_date( $dateTab[0],$dateTab[1],$dateTab[2],$startTab[0],$startTab[1],$startTab[2]),
    	  'end'=> timestamp_date( $dateTab[0],$dateTab[1],$dateTab[2],$endTab[0],$endTab[1],$endTab[2]),
    	  'register' =>  array()
     
    );
    }
     
    function viewCalandar($calandar ,$plage ){
     
    	foreach ($calandar as $key => $values){
     
    		$nbdispoplage =   round(( $values['end'] - $values['start'] )/ $plage)  ;
    		$timestampDate  = $values['start'] +$nbdispoplage;
    		echo '<br/><u>'.$nbdispoplage. ' plages de '.($plage/60).'mn disponible pour le '.$values['date'].'</u><br/>'; 
    		for( $i=0;$i< $nbdispoplage ;$i++){
    			$style= "";
    			$timestampDate  = $values['start'] + ( $i*$plage );
    			if($timestampDate + $plage > $values['end'] ){
    			$style='style="color:red"';
    			}		
    				foreach ($values['register'] as $k => $v ){ 
    					if($timestampDate >= $v['start']  && $timestampDate < $v['end'] ){
     						$style='style="color:red"';
    					} 
    					else if($timestampDate + $plage >  $v['start']  && $timestampDate < $v['end'] ){
    	 					$style='style="color:red"';
    					} 
    				}
     			echo"<span $style >".date("H:i:s", $timestampDate).'</span> | ';
    		}
     
    	}
    }
    $calandar = array();
    echo '<br/>Enregistrement dans le calandrier disponibilités : "23-08-2012", "8:0:0" ,  "12:0:0" <br/>';
    echo '<br/>Enregistrement dans le calandrier disponibilités :"24-08-2012", "8:0:0" ,  "12:0:0"  <br/>';
    $calandar["23-08-2012"] = calandarbydate("23-08-2012", "8:0:0" ,  "12:0:0" );
    $calandar["24-08-2012"] = calandarbydate("24-08-2012", "8:0:0" ,  "12:0:0" );
     
    $min = 15;
    $plage= getMinPlage($min);
     
    echo "<br/><b>Voici les plages de $min mn </b><br/>";
    echo viewCalandar($calandar ,$plage );
     
     
    $min = 30;
    $plage= getMinPlage($min);
    echo "<br/><b>Voici les plages de $min mn </b><br/>";
    echo viewCalandar($calandar ,$plage );
     
    echo '<br/>Enregistrement réservation "23-08-2012", "8:30:0" ,  "9:30:0"<br/>';
    echo '<br/>Enregistrement réservation "23-08-2012", "10:30:0" ,  "11:0:0"<br/>';
    $calandar["23-08-2012"]['register'][] = calandarbydate("23-08-2012", "8:30:0" ,  "9:30:0" );
    $calandar["23-08-2012"]['register'][] = calandarbydate("23-08-2012", "10:30:0" ,  "11:0:0" ); 
     
     
    $min = 15;
    $plage= getMinPlage($min);
     
    echo "<br/><b>Voici les plages de $min mn </b><br/>";
    echo viewCalandar($calandar ,$plage );
     
     
    $min = 50;
    $plage= getMinPlage($min);
    echo "<br/><b>Voici les plages de $min mn </b><br/>";
    echo viewCalandar($calandar ,$plage ); 
     
    ?>

  3. #3
    Candidat au Club
    Inscrit en
    Juillet 2010
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    Merci beaucoup, je vais voir ce que je peux en faire, sachant que j'ai oublié une contrainte qui est, pour une journée, je peux dire qu'il y a 2 fois le même créneau possible...

    Par exemple, il peut y avoir N rdv pour le même créneau, ce qui me complique encore plus la tâche...

  4. #4
    Membre éprouvé

    Profil pro
    Inscrit en
    Juin 2007
    Messages
    748
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 748
    Points : 1 022
    Points
    1 022
    Par défaut
    ca marche aussi
    enregistrer une date avec pour deux utilisateurs ( en faite $calandar[$key] tu met ce que tu veux )

    par exemple en enregistement dispo
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $calandar["23-08-2012-1"] = calandarbydate("23-08-2012", "8:0:0" ,  "12:0:0" );
    $calandar["23-08-2012-2"] = calandarbydate("23-08-2012", "9:0:0" ,  "12:0:0" );
    et en loc

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $calandar["23-08-2012-1"]['register'][] = calandarbydate("23-08-2012", "8:30:0" ,  "9:30:0" );
    $calandar["23-08-2012-2"]['register'][] = calandarbydate("23-08-2012", "10:30:0" ,  "11:0:0" );

  5. #5
    Candidat au Club
    Inscrit en
    Juillet 2010
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    hm hm j'ai un peu de mal à comprendre ce petit outil que j'essaye de faire pour me simplifier la vie me fait un peu galérer en fait

    Le test ne fonctionnera plus, si ?
    Je ne vois pas comment implémenter cette contrainte en fait par rapport à ton exemple

  6. #6
    Membre éprouvé

    Profil pro
    Inscrit en
    Juin 2007
    Messages
    748
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 748
    Points : 1 022
    Points
    1 022
    Par défaut Avec poste 1 et poste 2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    <?php
     
    function timestamp_date($d,$m,$y,$h,$mn,$s ){
    	return mktime($h,$mn, $s, $m,  $d, $y);
    }
     
    function getMinPlage($min){
    	return $min*60;
    }
    function calandarbydate($date, $start , $end ){
     
    	$dateTab = explode('-',$date);
    	$startTab = explode(':',$start);
    	$endTab = explode(':',$end);
     
    	return
      	array(
    	  'date'=>$date,
    	  'start'=>timestamp_date( $dateTab[0],$dateTab[1],$dateTab[2],$startTab[0],$startTab[1],$startTab[2]),
    	  'end'=> timestamp_date( $dateTab[0],$dateTab[1],$dateTab[2],$endTab[0],$endTab[1],$endTab[2]),
    	  'register' =>  array()
     
    );
    }
     
    function viewCalandar($calandar ,$plage ){
     
    	foreach ($calandar as $key => $values){
     
    		$nbdispoplage =   round(( $values['end'] - $values['start'] )/ $plage)  ;
    		$timestampDate  = $values['start'] +$nbdispoplage;
    		echo '<br/><u>'.$nbdispoplage. ' plages de '.($plage/60).'mn disponible pour le '.$values['date'].'</u><br/>'; 
    		for( $i=0;$i< $nbdispoplage ;$i++){
    			$style= "";
    			$timestampDate  = $values['start'] + ( $i*$plage );
    			if($timestampDate + $plage > $values['end'] ){
    			$style='style="color:red"';
    			}		
    				foreach ($values['register'] as $k => $v ){ 
    					if($timestampDate >= $v['start']  && $timestampDate < $v['end'] ){
     						$style='style="color:red"';
    					} 
    					else if($timestampDate + $plage >  $v['start']  && $timestampDate < $v['end'] ){
    	 					$style='style="color:red"';
    					} 
    				}
     			echo"<span $style >".date("H:i:s", $timestampDate).'</span> | ';
    		}
     
    	}
    }
    $calandar = array();
    echo '<br/>Enregistrement dans le calandrier disponibilités POSTE 1: "23-08-2012", "8:0:0" ,  "12:0:0" <br/>';
    echo '<br/>Enregistrement dans le calandrier disponibilités POSTE 2: "23-08-2012", "9:0:0" ,  "12:0:0" <br/>';
    echo '<br/>Enregistrement dans le calandrier disponibilités POSTE 1:"24-08-2012", "8:0:0" ,  "12:0:0"  <br/>';
    $calandar["23-08-2012-1"] = calandarbydate("23-08-2012", "8:0:0" ,  "12:0:0" );
    $calandar["23-08-2012-2"] = calandarbydate("23-08-2012", "9:0:0" ,  "12:0:0" );
    $calandar["24-08-2012-1"] = calandarbydate("24-08-2012", "8:0:0" ,  "12:0:0" );
     
    $min = 15;
    $plage= getMinPlage($min);
     
    echo "<br/><b>Voici les plages de $min mn </b><br/>";
    echo viewCalandar($calandar ,$plage );
     
     
    $min = 30;
    $plage= getMinPlage($min);
    echo "<br/><b>Voici les plages de $min mn </b><br/>";
    echo viewCalandar($calandar ,$plage );
     
    echo '<br/>Enregistrement réservation "23-08-2012", "8:30:0" ,  "9:30:0" POSTE 1<br/>';
    echo '<br/>Enregistrement réservation "23-08-2012", "10:30:0" ,  "11:0:0" POSTE 2<br/>';
    $calandar["23-08-2012-1"]['register'][] = calandarbydate("23-08-2012", "8:30:0" ,  "9:30:0" );
    $calandar["23-08-2012-2"]['register'][] = calandarbydate("23-08-2012", "10:30:0" ,  "11:0:0" ); 
     
     
    $min = 15;
    $plage= getMinPlage($min);
     
    echo "<br/><b>Voici les plages de $min mn </b><br/>";
    echo viewCalandar($calandar ,$plage );
     
     
    $min = 50;
    $plage= getMinPlage($min);
    echo "<br/><b>Voici les plages de $min mn </b><br/>";
    echo viewCalandar($calandar ,$plage ); 
     
    ?>

  7. #7
    Candidat au Club
    Inscrit en
    Juillet 2010
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    Ok merci beaucoup, je crois que je commence un peu à y voir plus clair, il faut que je teste un peu tout ça pour vérifier que c'est bien ce qu'il me faut pour que j'ai les créneaux disponibles sous cette forme :

    Heure début - heure de fin

  8. #8
    Membre éprouvé

    Profil pro
    Inscrit en
    Juin 2007
    Messages
    748
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 748
    Points : 1 022
    Points
    1 022
    Par défaut
    Citation Envoyé par css4ever Voir le message
    Ok merci beaucoup, je crois que je commence un peu à y voir plus clair, il faut que je teste un peu tout ça pour vérifier que c'est bien ce qu'il me faut pour que j'ai les créneaux disponibles sous cette forme :

    Heure début - heure de fin

    tu remplace tout simplement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    echo"<span $style >".date("H:i:s", $timestampDate).'</span> | ';
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo"<span $style >".date("H:i:s", $timestampDate).' - '.date("H:i:s", $timestampDate+ $plage ).'</span> | ';

  9. #9
    Candidat au Club
    Inscrit en
    Juillet 2010
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    Exactement, c'est ce que j'ai fais, ça semble bon, un grand merci, maintenant j'ai encore des choses à modifier, mais je pense que j'ai à présent une solide base pour ça

  10. #10
    Membre éprouvé

    Profil pro
    Inscrit en
    Juin 2007
    Messages
    748
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 748
    Points : 1 022
    Points
    1 022
    Par défaut
    oubli pas le tag résolu , si c'est le cas

    bon courage pour la suite

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Gestion de taches dans des créneaux horaires.
    Par ThomasAU dans le forum Débuter avec Java
    Réponses: 1
    Dernier message: 10/02/2010, 13h01
  2. Réponses: 13
    Dernier message: 03/05/2007, 21h16
  3. Réponses: 2
    Dernier message: 03/10/2006, 18h55
  4. Gestion des fuseaux horaires :-/
    Par kalash_jako dans le forum Général Conception Web
    Réponses: 9
    Dernier message: 23/04/2006, 23h02
  5. Procédure stockée : liste des serveurs SQL disponibles
    Par AF_STjohn dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 15/06/2005, 20h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo