Probleme calcul plage horaire

Répondre
lynkis
le 26/06/2013 à 14:27
lynkis
Bonjours a tous,
Voila je suis en 1ère année de BTS Info Option SLAM et j'ai un stage de fin d'année.
Je suis actuellement dans une école (mon stage) .
Il m'ont donnés pour objectif de faire quelques script en PHP afin d'améliorer leur site de gestion d'emploi du temps des étudiants.
Le site etant déjà bien avancé bien sur mais il reste quelques "petits" soucis encore a corriger.
MON SOUCIS : Je doit faire en sorte que lorsque j'ajoute un cours dans mon emploi du temps (ex : De 8h00 à 9h00) celui ci s'affiche ( c'étais déjà de base) , petit bémol, c'est que lorsque je souhaite mettre cette fois ci un cours (ex : De 8h15 à 9h15) mais que le cours précédent est déjà créer, les deux cours sont chevaucher ( Pas cool ).
On m'a donc demander de faire en sorte que quand un cours est ajouté, on ne puisse pas en mettre un nouveau dans la même plage horaire.
Voici mon code que j'ai fait:
<?php                          $etdate = date("Y-m-d",date_offset(date_lundi($_SESSION['date']),$_POST['jour']-1));
$etdebut_new = "{$_POST['hh_deb']}:{$_POST['mm_deb']}:00";
$etduree = "{$_POST['hh_dur']}:{$_POST['mm_dur']}:00";
$etdebut_exist = $_SESSION['paperboard'][4]['et_debut'];
var_dump ($etdebut_new);
var_dump ($etduree);
var_dump ($etdebut_exist);

$sql = "SELECT id_et FROM emptps WHERE id_mat='{$_POST['mat']}' AND et_date='$etdate' ";
$sql.= "AND et_debut='".$etdebut_new."' AND id_gr='{$_POST['group']}' AND id_form={$_SESSION['form']}";
$result=mysql_query($sql) or $debug.=$sql;

// Le code que j'ai ajouter //
echo "<br>";
// 15 minutes en dec
$temps = 25*3600/100;
// Heure de durée en dec
$etduree = $etduree*3600;
// Heure de début en dec
$etdebut = $etdebut_new*3600;
// Heure de fin en dec
$etfin = $etduree + $etdebut;

for($i=$etdebut; $i!=$etfin; $i+=$temps){
$heure=date('H:i:s', $i);
echo'<option value="'.$heure.'">'.$heure.'</option>';
$sql2 = "SELECT et_debut FROM emptps WHERE et_date='$etdate' AND et_debut='".$etdebut_exist."' ";
$result2=mysql_query($sql2) or $debug.=$sql2;
$test = mysql_fetch_array($result2);
var_dump ($test);
if ($result&&mysql_num_rows($result)!=0&&){
$info ="Erreur(s) détectée(s):".$info;
$info.="--INSERTION NON EFFECTUEE--\\n La plage horaire a déjà été utilisée!";
}
}
// Le code que j'ai ajouter //

if ($result&&mysql_num_rows($result)!=0){
$info ="Erreur(s) détectée(s):".$info;
$info.="--INSERTION NON EFFECTUEE--\\n Cette intervention existe déja!";
}elseif ($_POST['hh_dur']==0 && $_POST['mm_dur']==0) {
$info ="Erreur(s) détectée(s):".$info;
$info.="--INSERTION NON EFFECTUEE--\\n La durée ne peut etre nulle!";
}else{
if ($_POST['attention']=='on') $es='S'; else $es='A';
if ($_POST['devoir']) $et=$_POST['devoir']; else $et='N';
if ($_POST['et_cpt']=='on') $ecpt='P'; else $ecpt='N';
if ($_POST['pause']=='on') $paus='Y'; else $paus='N';
if ($_POST['video']=='on') $video='Y'; else $video='N';

//Vérification
$chevauchement = "( ( et_debut < sec_to_time( time_to_sec('{$_POST['hh_deb']}:{$_POST['mm_deb']}:00')";
$chevauchement .= " +time_to_sec('{$_POST['hh_dur']}:{$_POST['mm_dur']}:00'))";
$chevauchement .= " AND sec_to_time(time_to_sec('{$_POST['hh_deb']}:{$_POST['mm_deb']}:00')";
$chevauchement .= " +time_to_sec('{$_POST['hh_dur']}:{$_POST['mm_dur']}:00'))";
$chevauchement .= " <= sec_to_time(time_to_sec(et_debut)+time_to_sec(et_duree)))"; // fin au milieu
$chevauchement .= " OR ( et_debut >= '{$_POST['hh_deb']}:{$_POST['mm_deb']}:00' ";
$chevauchement .= " AND sec_to_time( time_to_sec('{$_POST['hh_deb']}:{$_POST['mm_deb']}:00')";
$chevauchement .= " +time_to_sec('{$_POST['hh_dur']}:{$_POST['mm_dur']}:00')) ";
$chevauchement .= " >= sec_to_time(time_to_sec(et_debut)+time_to_sec(et_duree)))"; //debut avant et fin apr+¿s
$chevauchement .= " OR ( et_debut <= '{$_POST['hh_deb']}:{$_POST['mm_deb']}:00' ";
$chevauchement .= " AND '{$_POST['hh_deb']}:{$_POST['mm_deb']}:00' ";
$chevauchement .= " < (sec_to_time(time_to_sec(et_debut)+time_to_sec(et_duree))))) "; // debut au milieu

$info.=verif_salle(0,$_POST['salle'],$etdate,$chevauchement);
$info.=verif_ens(0,$_POST['prof'],$etdate,$chevauchement);
$info.=verif_gr(0,$_POST['group'],$etdate,$chevauchement);

// Il faut une pause a 10h et a 16h si pause = Y dans formation et TP ala modif on fera ce qu'on veut
if ($paus=='N'){
$sql="SELECT pause FROM formation WHERE id_form={$_SESSION['form']}";
$result=mysql_query($sql) or $debug.=$sql;
if ($result&&($row=mysql_fetch_array($result))&&($row['pause']=='Y')&&
($_POST['et_ens']=="TP")&&
(
(($_POST['hh_deb']*60+$_POST['mm_deb']<600)&&(($_POST['hh_deb']+$_POST['hh_dur'])*60+$_POST['mm_deb']+$_POST['mm_dur']>600))||
(($_POST['hh_deb']*60+$_POST['mm_deb']<960)&&(($_POST['hh_deb']+$_POST['hh_dur'])*60+$_POST['mm_deb']+$_POST['mm_dur']>960))
)
) $paus='Y';
}

if (!isset($_POST['et_ens'])) $_POST['et_ens']="TD";

//recup du id_form dans groupe pour mutualisation
$sql="SELECT id_form FROM groupe WHERE id_gr={$_POST['group']}";
$result=mysql_query($sql) or $debug.=$sql;
$row=mysql_fetch_array($result);
$form=$row['id_form'];

//INSERTION même si il y a des conflits
$champ = " (id_mat,id_sem,id_gr,id_prof,id_salle,et_type,et_ens,et_status,et_cpt,et_date,";
$champ.= "et_debut,et_duree,id_form,pause,divers,video,date_enreg ) ";
$table = " emptps ";
$value = "({$_POST['mat']},{$_SESSION['sem']},{$_POST['group']},{$_POST['prof']},{$_POST['salle']},'$et',";
$value.= "'{$_POST['et_ens']}','$es','$ecpt','$etdate','{$_POST['hh_deb']}:{$_POST['mm_deb']}:00',";
$value.= "'{$_POST['hh_dur']}:{$_POST['mm_dur']}:00',$form,'$paus','{$_POST['divers']}','$video',now())";
$sql = "INSERT INTO $table $champ VALUES $value ";

$result = mysql_query($sql) or $debug.=$sql;
$_SESSION['id_et']=mysql_insert_id();

if ($video=='Y') $info.=verif_video(0,$_POST['salle'],$etdate,$chevauchement);
if (!empty($info)) $info = "Anomalie(s) détectée(s):".$info;
}?>

Alors bien évidement c'est un code qui à déjà été fait avant que j'arrive.
Ma question : Est-il possible de pouvoir calculer une plage horaire d'un cours précédemment créer et que si la plage horaire est déjà occuper il m'affiche un message d'erreur ?

Merci d'avance pour vos réponses .
Lynkis
LupusMic
le 27/06/2013 à 10:29
LupusMic
Il n'y a que les crétins qui up.
Les plus atteins up après même pas une journée de publication.
Ceux qui sont à la limite des troubles mentaux le font sur un forum qui a une fréquentation disons, basse.

Le script est dégueulasse. J'espère qu'il n'est pas en production, car n'importe qui peut supprimer l'ensemble des données sans se casser le cul.

1. Le temps, c'est compliqué. Même sans se poser la question des années bissextiles ou les changements d'heure, c'est compliqué de calculer des différences de temps. Donc, tu vas me faire le plaisir de lire la documentation sur la gestion du temps en PHP et en MySQL (tu sauras trouver les manuels sur le Web, j'ose espérer).

2. Fais gaffe à ton orthographe.

3. Quand on fait un commentaire pour décrire l'objectif d'un code, c'est souvent que se morceau de code devrait être une fonction.

4. Le français dans du code, c'est mal. Utilise de l'anglais pour les noms de variable, et commente en anglais.

5. Les abréviation, c'est le mal. « dec » c'est bien pour décembre ?

6. Éviter d'utiliser la concaténation pour construire une requête : ça la rend illisible.

7. Ne pas utiliser directement des valeurs dans la construction d'une requête SQL : il faut s'assurer que la chaîne introduite n'a pas d'effet de bords.
Par exemple :
<?php
$sql_fmt = 'select * from a_full_name_table where id = %s and name = \'%s\';
$sql = sprintf($sql_fmt, mysql_real_escape_string($id), mysql_real_escape_string($name));

Évidement, il y a moyen de faire en sorte que tu n'ais qu'à écrire un appel de fonction en définissant la fonction ad hoc.

8. La clause SQL « between » elle est sympa. Et SQL fournit un tas de fonction de manipulation du temps, qui évite les calculs foireux.

9. Les commentaires inutiles n'ont pas leur place dans du code. « Vérification » ne veut rien dire : vérification de quoi d'ailleurs, que l'âge du capitaine est entre 42 et 69 ?

10. Rigueur : il faut vérifier le retour de toute fonction. mysql_query est un bon exemple de fonction mal contrôlée dans ton code.

Bon, je t'ai donné quelques pistes de travail. En nettoyant ton code, tu le rendras plus lisible, ce qui devrait t'aider à avoir une meilleurs vision d'ensemble du projet.

N'hésite pas à demander de l'aide. Je ne suis pas si méchant que ça :)
Développeur récurrent, procédural et relationnel. Caustique soupe-au-lait.
lynkis
le 27/06/2013 à 21:13
lynkis
Alors merci de ta réponse malgré quelle soit légèrement ardente, mais si tu as bien lu mon post, le code n'est pas de moi, et je n'ai absolument pas le temps de le réécrire en 4 semaines (désolé), je fais du mieux que je peut avec ce que l'on me donne, les commentaires ne sont pas de moi mais de celui qui a écrit la page ( même moi j'ai du mal a comprendre certaines choses) c'est pour sa que je suis ici pour solliciter de l'aide car il ne me reste plus que 1 semaine et sa fait 1 semaine que je suis entrain de me "casser le cul" à chercher une solution (j'ai pas envie de me faire lynché par mon tuteur de stage parce-que j'ai rien foutu). Merci tout de même de ta réponse.
A bon entendeur.
Lynkis
lynkis
le 27/06/2013 à 21:16
lynkis
T’inquiète pas je t'en veux pas mais sa m'embête énormément car on m'a refiler du code extrêmement mal écrit (je l'admet car pour déchiffrer j'ai mis du temps). Je vais me penche sur ce que tu m'a dit mais en ce qui concerne la réécriture du code, c'est mort il se démerde car je vais pas commencer a tout leur refaire alors qu'au finale j'y gagnerais rien :)
Lynkis
LupusMic
le 28/06/2013 à 01:00
LupusMic
Certes, je suis parfois quelque peu intransigeant, mais c'est parce que sinon je suis trop gentil ;)

j'ai pas envie de me faire lynché par mon tuteur de stage parce-que j'ai rien foutu


Bien venu dans le développement, où tu peux passer une semaine à lire du code sans pouvoir l'améliorer et à devoir expliquer pourquoi.

Ce n'est pas grave si tu ne produit pas de code productif, l'important sera qu'il faudra que tu explique pourquoi et que tu proposes des pistes pour permettre la réécriture du code. Voire même, de proposer d'utiliser un outil éprouvé pour gérer ça. C'est aussi ça notre métier : utiliser l'existant ou l'intégrer.

En fait, parfois le secret c'est de réorganiser le code :
- améliorer le spacing
- remplacer des expressions obscures par des fonctions (avec un nom sémantiquement expressif).

Par exemple, rien qu'en formatant le code, on peut voir une horreur à la ligne 31.
Développeur récurrent, procédural et relationnel. Caustique soupe-au-lait.
LupusMic
le 28/06/2013 à 02:25
LupusMic
Je suis généreux aujourd'hui, je t'ai accordé une petite heure de mon temps. Oui, même pour un pro, ce genre de chose c'est long et assez pénible à faire. Voici donc une version un peu plus rationnelle :

<?php

/** Format and execute a SQL query
*/
function do_query($sql_fmt/*, args, ...*/)
{
$args = func_get_args();
array_shift($args);
$args = array_map($args, 'mysql_real_escape_string');
$sql = call_user_func_array('sprintf', $args);
$result = mysql_query($sql);

if(false === $result)
trigger_error(mysql_error());

return $result;
}

function sql_value_format($length)
{
return implode(', ', array_pad(array(), $length, '\'%s\''))
}

function do_query_insert($table_name, $value_fields, $expr_fields = array())
{
$fields = array_merge(array_keys($value_fields), array_keys($expr_fields));

$values_fmt = array();
$values_fmt[] = sql_value_format(count($value_fields));
$values_fmt[] = implode(', ', $expr_fields));
$values_fmt = implode(', ', $values_fmt);

$sql_fmt = sprintf('INSERT INTO %s (%s) values (%s)'
, $table_name
, implode(', ', $fields)
, $values_fmt
);

$result = do_query($sql_fmt, array_values($value_fields));

return mysql_insert_id();
}

//// TODO: put that wild code in a function

$infos = array();

$etdate = date('Y-m-d', date_offset(date_lundi($_SESSION['date']),$_POST['jour']-1));
$etdebut_new = "{$_POST['hh_deb']}:{$_POST['mm_deb']}:00";
$etduree = "{$_POST['hh_dur']}:{$_POST['mm_dur']}:00";
$etdebut_exist = $_SESSION['paperboard'][4]['et_debut'];

// result isn't a good var name, it should be renamed with semantic
$result = do_query('SELECT id_et FROM emptps
WHERE id_mat=\'%s\'
AND et_date=\'%s\'
AND et_debut=\'%s\'
AND id_gr=%s
AND id_form=%s
', $_POST['mat'], $etdate, $etdebut_new, $_POST['group'], $_SESSION['form']);

// Le code que j'ai ajouter //
echo "<br>";
// 15 minutes en dec
$temps = 25*3600/100;
// Heure de durée en dec
$etduree = $etduree*3600;
// Heure de début en dec
$etdebut = $etdebut_new*3600;
// Heure de fin en dec
$etfin = $etduree + $etdebut;

for($i = $etdebut; $i != $etfin; $i += $temps)
{
$heure = date('H:i:s', $i);
echo'<option value="'.$heure.'">'.$heure.'</option>';
$result2 = do_query('SELECT et_debut FROM emptps
WHERE et_date=\'%s\'
AND et_debut=\'%s\'
', $etdate, $etdebut_exist);
if($result && mysql_num_rows($result) != 0)
{
$infos[] = "--INSERTION NON EFFECTUEE--\\n La plage horaire a déjà été utilisée!";
}
}
// Le code que j'ai ajouter //

if($result && mysql_num_rows($result) != 0)
{
$infos[] = "--INSERTION NON EFFECTUEE--\\n Cette intervention existe déja!";
}
elseif($_POST['hh_dur'] == 0 && $_POST['mm_dur'] == 0)
{
$infos[] = "--INSERTION NON EFFECTUEE--\\n La durée ne peut etre nulle!";
}
else
{
$es = $_POST['attention'] == 'on' ? 'S' : 'A';
$et = $_POST['devoir'] ? $_POST['devoir'] : 'N';
$ecpt = $_POST['et_cpt'] == 'on' ? 'P' : 'N';
$paus = $_POST['pause'] == 'on' ? 'Y' : 'N';
$video = $_POST['video'] == 'on' ? 'Y' : 'N';

//Vérification (de quoi ?)
$chevauchement = "( ( et_debut < sec_to_time( time_to_sec('{$_POST['hh_deb']}:{$_POST['mm_deb']}:00')";
. "+time_to_sec('{$_POST['hh_dur']}:{$_POST['mm_dur']}:00'))";
. "AND sec_to_time(time_to_sec('{$_POST['hh_deb']}:{$_POST['mm_deb']}:00')";
. "+time_to_sec('{$_POST['hh_dur']}:{$_POST['mm_dur']}:00'))";
. " <= sec_to_time(time_to_sec(et_debut)+time_to_sec(et_duree)))"; // fin au milieu
. "OR ( et_debut >= '{$_POST['hh_deb']}:{$_POST['mm_deb']}:00'";
. "AND sec_to_time( time_to_sec('{$_POST['hh_deb']}:{$_POST['mm_deb']}:00')";
. "+time_to_sec('{$_POST['hh_dur']}:{$_POST['mm_dur']}:00'))";
. " >= sec_to_time(time_to_sec(et_debut)+time_to_sec(et_duree)))"; //debut avant et fin apres
. "OR ( et_debut <= '{$_POST['hh_deb']}:{$_POST['mm_deb']}:00'";
. "AND '{$_POST['hh_deb']}:{$_POST['mm_deb']}:00'";
. " < (sec_to_time(time_to_sec(et_debut)+time_to_sec(et_duree))))) "; // debut au milieu

$infos[] = verif_salle(0,$_POST['salle'],$etdate,$chevauchement);
$infos[] = verif_ens(0,$_POST['prof'],$etdate,$chevauchement);
$infos[] = verif_gr(0,$_POST['group'],$etdate,$chevauchement);

// Il faut une pause a 10h et a 16h si pause = Y dans formation et TP ala modif on fera ce qu'on veut
if ($paus=='N')
{
$sql="SELECT pause FROM formation WHERE id_form={$_SESSION['form']}";
$result=mysql_query($sql) or $debug.=$sql;
if($result&&($row=mysql_fetch_array($result))&&($row['pause']=='Y')&&
($_POST['et_ens']=="TP")&&
(
(($_POST['hh_deb']*60+$_POST['mm_deb']<600)&&(($_POST['hh_deb']+$_POST['hh_dur'])*60+$_POST['mm_deb']+$_POST['mm_dur']>600))||
(($_POST['hh_deb']*60+$_POST['mm_deb']<960)&&(($_POST['hh_deb']+$_POST['hh_dur'])*60+$_POST['mm_deb']+$_POST['mm_dur']>960))
)
)
$paus='Y';
}

if (!isset($_POST['et_ens']))
$_POST['et_ens'] = 'TD';

//recup du id_form dans groupe pour mutualisation
$result = do_query('SELECT id_form FROM groupe WHERE id_gr=%s'
, $_POST['group']);
$row = mysql_fetch_array($result);
$form = $row['id_form'];

//INSERTION même si il y a des conflits
$field_values = array
( 'id_mat' => $_POST['mat']
, 'id_sem' => $_SESSION['sem']
, 'id_gr' => $_POST['group']
, 'id_prof' => $_POST['prof']
, 'id_salle' => $_POST['salle']
, 'et_type' => $et
, 'et_ens' => $_POST['et_ens']
, 'et_status' => $es
, 'et_cpt' => $ecpt
, 'et_date' => $etdate
, 'et_debut' => sprintf('%s:%s:00', $_POST['hh_deb'], $_POST['mm_deb'])
, 'et_duree' => sprintf('%s:%s:00', $_POST['hh_dur'], $_POST['mm_dur'])
, 'id_form' => $form
, 'pause' => $paus
, 'divers' => $_POST['divers']
, 'video' => $video;
);

$expr_values = array
( 'date_enreg'
);

$_SESSION['id_et'] = do_query_insert('emptps', $field_values, $expr_fields);

if($video == 'Y')
$infos[] = verif_video(0, $_POST['salle'], $etdate, $chevauchement);

if(!empty($infos))
$infos = "Anomalie(s) détectée(s):<br>" . implode("<br>\n", $infos);
}
Développeur récurrent, procédural et relationnel. Caustique soupe-au-lait.
lynkis
le 28/06/2013 à 08:41
lynkis
Merci de ta réponse,
Même si je n'ai pas demandé de réécrire le code a ma place ( ce dont je te remercie plus que tout car c'est un peu plus compréhensible ) je suis vachement étonné de ta vitesse de réécriture de ce code qui passe de "l’incompréhensibilité" à la "compréhension" la plus totale.
Oui je sais que c'est dur mais j'aime bien le développement, mais mon stage n'étant pas de réécrire tout le code du site ( 110 pages sa fait un peu long ... ) et j'apprendrais pas en réécrivant tout sa de moi, le truc c'est qu'on ma rien expliqué du fonctionnement j'ai du chercher tout seul ... ( on ma dit " Ta le code, faut que tu fasse en sorte de pouvoir faire sa et sa ." ) Euh oui je veux bien mais ... (" ah oui tu as environ 3 jours pour comprendre le code comment il va et après tu t'attaque aux script ") ... EUH ... Ok ... Si je souhaite pouvoir renouveler mon stage l'année prochaine, je préfère rien dire et faire mon code sans rechigner ... car comme je l'ai dit, j'ai pas envie de me faire lynché durant la visite de ma prof pour le stage ... Bref, merci pour le code que tu m'a fourni je vais tenter de regarder et de trouver une solution :)
Cordialement

PS : Tu as raison d'être un peu dur envers les autres, mais si on viens avec les bons argument et une "bonne" page de code en expliquant le fonctionnement et se qui ne va pas faudrait lever un peu le pied =).
Lynkis
LupusMic
le 28/06/2013 à 11:32
LupusMic
Si tu avais demandé à ce que quelqu'un réécrive le code, tu aurais eu droit à un message que je qualifierais volontiers de véhément smiley

Je n'ai pas réécrit, je n'ai fait que reformater le code. Et encore, je n'ai pas utilisé d'outil automatique comment indent. Et puis j'ai mangé dans l'intervalle smiley

Bref, soit tu ne vas pas réécrire tout le code, mais au moins la portion par laquelle tu passe, histoire que tu puisse travailler dessus. De ma petite expérience, je dirais qu'un employeur sur deux prendra le temps de te former.

Un stage c'est fait pour apprendre. Si tu ne fais que serrer les fesses en attendant que personne ne voit que tu ne fous rien parce que tu ne comprends pas et que tu as peur de toucher au code, tu seras de toute façon mal noté. Ce n'est pas grave si tu ne renouvelle pas ton stage avec cette entreprise de bras cassés : il y a une méchante pénurie dans l'IT qui fait que tu trouveras forcément une société où faire un stage. Et pour éviter de te faire lyncher par ton prof, envoie lui des courriels expliquant ce que tu fais, les problèmes que tu rencontre et la qualité du tutora de ton maître de stage. S'il y a une convention de stage, il me semble qu'il devrait y avoir marqué que tu es stagiaire, et qu'il doit t'encadrer. C'est une obligation contractuelle.

Au fait, je n'ai pas testé le code, donc il doit y avoir quelques typo qui traînent.
Développeur récurrent, procédural et relationnel. Caustique soupe-au-lait.
harrathm
le 09/01/2014 à 17:25
harrathm
salut,
j’espère que tu as trouvé une solution, mais moi j'aime recevoir la partie de ton code qui me permet d'afficher un emploi du temps d'une classe ou d'un enseignant et merci infiniment
Répondre

Ecrire un message

Votre message vient d'être créé avec succès.
LoadingChargement en cours