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

PHP & Base de données Discussion :

Pointages des salariés, entrée un jour, sortie le jour suivant


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Chef de projet multimédia
    Inscrit en
    Juin 2014
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Chef de projet multimédia
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2014
    Messages : 35
    Par défaut Pointages des salariés, entrée un jour, sortie le jour suivant
    Bonjour à tous,

    Je met en place un script de pointage, mon soucis et de permettre le pointage de sortie un jour différent du pointage d'entrée ( pour les quelques personnes qui finissent à 1h du matin), actuellement lorsqu'ils pointent pour terminer leur journée, le script comptabilise comme le début d'une nouvelle journée.

    J'ai eu beau réfléchir à une solution mais aucune ne me vient à l'esprit, d’où ma demande.

    Voici les deux fichiers qui permettent respectivement le pointage et la lecture du pointage.

    Je m'en remet donc à votre esprit, peut-être plus débrouillard que le miens.

    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
    <?php
    try{
    $db = new PDO('mysql:host=localhost;dbname=personnel','login','psw');
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    }
    catch(PDOException $e){
    echo 'Erreur SQL';
    }
    $req = $db->prepare("SELECT * FROM pointage WHERE id='".$_POST['id']."' AND jour='".$_POST['jour']."'");
    //On recupère les pseudo de t'as base ou les pseudo son egal au pseudo passer par le formulaire
    $req->bindValue('id', $_POST['id'], PDO::PARAM_STR);
    $req->bindValue('jour', $_POST['jour'], PDO::PARAM_STR);
    $req->execute();
    //on exécute la requête
    $req2 = $db->prepare("SELECT * FROM salaries WHERE id='".$_POST['id']."'");
    //On recupère les pseudo de t'as base ou les pseudo son egal au pseudo passer par le formulaire
    $req2->bindValue('id', $_POST['id'], PDO::PARAM_STR);
    $req2->execute();
    //on exécute la requête
    $pseudoINbdd = $req->rowCount();
    $pseudoINbdd2 = $req2->rowCount();
    //Rowcount permet de sortir le nombre de valeur que t'as requête renvoi, que l'on rentre dans la variable pseudoINbdd (ou autre )
    if(isset($_POST['id'])&&($pseudoINbdd2)==true){
    //Si la requête renvoi 0, le pseudo n'existe pas dans la base, sinon le pseudo existe.
    	if($pseudoINbdd == 0){
    		  $arrive = "INSERT INTO pointage (arrive, jour, semaine, id, nom, prenom, service, entree_t, depart_dej_t, retour_dej_t, sortie_t) SELECT '".$_POST['heuri']."', '".$_POST['jour']."',WEEK('".$_POST['jour']."',1), id, nom, prenom, service, entree_t, depart_dej_t, retour_dej_t, sortie_t FROM salaries WHERE id='".$_POST['id']."'";
    		  $controle = $arrive;
    		  $controle = $db->query($controle);
    		  echo "<div class=\"validation\">Votre arrivee à bien été enregistré</div>";
    	   }
    	else if($d=$req->fetch()){
     
    		if((($d['depart_dejeuner'])=='0000-00-00 00:00:00')&&(($d['retour_dejeuner'])=='0000-00-00 00:00:00')&&(($d['sortie'])=='0000-00-00 00:00:00')){
    		$depart_dejeuner = "UPDATE pointage SET depart_dejeuner='".$_POST['heuri']."' WHERE id='".$_POST['id']."' AND jour='".$_POST['jour']."'";
    		$controle = $depart_dejeuner;
    		$controle = $db->query($controle);
    	echo "<div class=\"validation\">Votre départ pour le déjeuner à bien été enregistré</div>";
    	   }
    	else if((($d['retour_dejeuner'])=='0000-00-00 00:00:00')&&(($d['sortie'])=='0000-00-00 00:00:00')){
    		$retour_dejeuner = "UPDATE pointage SET retour_dejeuner='".$_POST['heuri']."' WHERE id='".$_POST['id']."' AND jour='".$_POST['jour']."'";
    		$controle = $retour_dejeuner;
    		$controle = $db->query($controle);
    	echo "<div class=\"validation\">Votre retour de déjeuner à bien été enregistré</div>";
    	   } 
    	else if(($d['sortie'])=='0000-00-00 00:00:00'){
    		$sortie = "UPDATE pointage SET sortie='".$_POST['heuri']."' WHERE id='".$_POST['id']."' AND jour='".$_POST['jour']."'";
    		$controle = $sortie;
    		$controle = $db->query($controle);
    		echo "<div class=\"validation\">Votre sortie à bien été enregistré</div>";
    		}
    	else echo  "<div class=\"erreur\">Tous vos pointages sont déjà enregistrés pour la journée</div>";
    }
     
    else echo  "<div class=\"erreur\">Erreur lors de la saisie, vérifiez que la touche MAJ soit bien activée</div>";
    }
    ?>
    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
    <?php
    function getTime($val) {
    				$nbHour = floor($val / 3600);
    				$nbMin = str_pad(round(($val - $nbHour * 3600) / 60),2,0, STR_PAD_LEFT);
    				return $nbHour.'h'.$nbMin.'min';
    			}
    $voirdate = "SELECT *,"
    . "TIMESTAMPDIFF(SECOND,arrive, depart_dejeuner)+TIMESTAMPDIFF(SECOND,retour_dejeuner,sortie) AS working_time, "
    . "TIMESTAMPDIFF(SECOND,entree_t, depart_dej_t)+TIMESTAMPDIFF(SECOND,retour_dej_t,sortie_t) AS working_time_t, "
    . "TIMESTAMPDIFF(SECOND,(TIMESTAMPDIFF(SECOND,arrive, depart_dejeuner)+TIMESTAMPDIFF(SECOND,retour_dejeuner,sortie)),(TIMESTAMPDIFF(SECOND,entree_t, depart_dej_t)+TIMESTAMPDIFF(SECOND,retour_dej_t,sortie_t))) AS working_time_diff "
    . "FROM pointage "
    . "WHERE jour='".$_POST['jour']."' AND nom = '".$_POST['nom']."' "
    . "ORDER BY service ASC";	
     
    if(isset($_POST['submit'])&&($_POST['jour'])&&($_POST['nom'])){
    $voirdate = $db->query($voirdate);
    while($rows = $voirdate->fetch(PDO::FETCH_ASSOC)){
    	echo	"<tr><td>".date("d/m/Y", strtotime($rows['jour']))."</td>".
    			"<td style=\"color:BLUE;\">".date("H:i", strtotime($rows['entree_t']))."</td>".
    			"<td style=\"background-color:#F7F7F7;color:#FF0000;\">".date("H:i", strtotime($rows['arrive']))."</td>".
    			"<td style=\"color:BLUE;\">".date("H:i", strtotime($rows['depart_dej_t']))."</td>".
    			"<td style=\"background-color:#F7F7F7;color:#FF0000;\">".date("H:i", strtotime($rows['depart_dejeuner']))."</td>".
    			"<td style=\"color:BLUE;\">".date("H:i", strtotime($rows['retour_dej_t']))."</td>".
    			"<td style=\"background-color:#F7F7F7;color:#FF0000;\">".date("H:i", strtotime($rows['retour_dejeuner']))."</td>".
    			"<td style=\"color:BLUE;\">".date("H:i", strtotime($rows['sortie_t']))."</td>".
    			"<td style=\"background-color:#F7F7F7;color:#FF0000;\">".date("H:i", strtotime($rows['sortie']))."</td>".
    			"<td>".$rows['id']."</td>".
    			"<td>".$rows['nom']."</td>".
    			"<td>".$rows['prenom']."</td>".
    			"<td>".$rows['service']."</td>".
    			"<td style=\"color:BLUE;\">".getTime($rows['working_time_t']). "</td>".
    			"<td style=\"background-color:#F7F7F7;color:#FF0000;\">".getTime($rows['working_time'])."</td></tr>";
    }
    }	
     
    $voirmois = "SELECT *,"
    . "TIMESTAMPDIFF(SECOND,arrive, depart_dejeuner)+TIMESTAMPDIFF(SECOND,retour_dejeuner,sortie) AS working_time, "
    . "TIMESTAMPDIFF(SECOND,entree_t, depart_dej_t)+TIMESTAMPDIFF(SECOND,retour_dej_t,sortie_t) AS working_time_t, "
    . "(TIMESTAMPDIFF(SECOND,arrive, depart_dejeuner)+TIMESTAMPDIFF(SECOND,retour_dejeuner,sortie))-(TIMESTAMPDIFF(SECOND,entree_t, depart_dej_t)+TIMESTAMPDIFF(SECOND,retour_dej_t,sortie_t)) AS working_time_diff "
    . "FROM pointage "
    . "WHERE MONTH(jour) = '".$_POST['mois']."' AND nom = '".$_POST['nom']."' "
    . "ORDER BY service ASC";
    if(isset($_POST['submit'])&&($_POST['mois'])&&($_POST['nom'])){
    $voirmois = $db->query($voirmois);								
    while($rows = $voirmois->fetch(PDO::FETCH_ASSOC)){
    	echo	"<tr><td>".date("d/m/Y", strtotime($rows['jour']))."</td>".
    			"<td style=\"color:BLUE;\">".date("H:i", strtotime($rows['entree_t']))."</td>".
    			"<td style=\"background-color:#F7F7F7;color:#FF0000;\">".date("H:i", strtotime($rows['arrive']))."</td>".
    			"<td style=\"color:BLUE;\">".date("H:i", strtotime($rows['depart_dej_t']))."</td>".
    			"<td style=\"background-color:#F7F7F7;color:#FF0000;\">".date("H:i", strtotime($rows['depart_dejeuner']))."</td>".
    			"<td style=\"color:BLUE;\">".date("H:i", strtotime($rows['retour_dej_t']))."</td>".
    			"<td style=\"background-color:#F7F7F7;color:#FF0000;\">".date("H:i", strtotime($rows['retour_dejeuner']))."</td>".
    			"<td style=\"color:BLUE;\">".date("H:i", strtotime($rows['sortie_t']))."</td>".
    			"<td style=\"background-color:#F7F7F7;color:#FF0000;\">".date("H:i", strtotime($rows['sortie']))."</td>".
    			"<td>".$rows['id']."</td>".
    			"<td>".$rows['nom']."</td>".
    			"<td>".$rows['prenom']."</td>".
    			"<td>".$rows['service']."</td>".
    			"<td style=\"color:BLUE;\">".getTime($rows['working_time_t']). "</td>".
    			"<td style=\"background-color:#F7F7F7;color:#FF0000;\">".getTime($rows['working_time'])."</td></tr>";
    }
    }	
    $voirweek = "SELECT *,"
    . "TIMESTAMPDIFF(SECOND,arrive, depart_dejeuner)+TIMESTAMPDIFF(SECOND,retour_dejeuner,sortie) AS working_time, "
    . "TIMESTAMPDIFF(SECOND,entree_t, depart_dej_t)+TIMESTAMPDIFF(SECOND,retour_dej_t,sortie_t) AS working_time_t, "
    . "(TIMESTAMPDIFF(SECOND,arrive, depart_dejeuner)+TIMESTAMPDIFF(SECOND,retour_dejeuner,sortie))-(TIMESTAMPDIFF(SECOND,entree_t, depart_dej_t)+TIMESTAMPDIFF(SECOND,retour_dej_t,sortie_t)) AS working_time_diff "
    . "FROM pointage "
    . "WHERE semaine = '".$_POST['week']."' AND nom = '".$_POST['nom']."' "
    . "ORDER BY nom";
    if(isset($_POST['submit'])&&($_POST['week'])&&($_POST['nom'])){
    $voirweek = $db->query($voirweek);	
    while($rows = $voirweek->fetch(PDO::FETCH_ASSOC)){
    	echo	"<tr><td>".date("d/m/Y", strtotime($rows['jour']))."</td>".
    			"<td style=\"color:BLUE;\">".date("H:i", strtotime($rows['entree_t']))."</td>".
    			"<td style=\"background-color:#F7F7F7;color:#FF0000;\">".date("H:i", strtotime($rows['arrive']))."</td>".
    			"<td style=\"color:BLUE;\">".date("H:i", strtotime($rows['depart_dej_t']))."</td>".
    			"<td style=\"background-color:#F7F7F7;color:#FF0000;\">".date("H:i", strtotime($rows['depart_dejeuner']))."</td>".
    			"<td style=\"color:BLUE;\">".date("H:i", strtotime($rows['retour_dej_t']))."</td>".
    			"<td style=\"background-color:#F7F7F7;color:#FF0000;\">".date("H:i", strtotime($rows['retour_dejeuner']))."</td>".
    			"<td style=\"color:BLUE;\">".date("H:i", strtotime($rows['sortie_t']))."</td>".
    			"<td style=\"background-color:#F7F7F7;color:#FF0000;\">".date("H:i", strtotime($rows['sortie']))."</td>".
    			"<td>".$rows['id']."</td>".
    			"<td>".$rows['nom']."</td>".
    			"<td>".$rows['prenom']."</td>".
    			"<td>".$rows['service']."</td>".
    			"<td style=\"color:BLUE;\">".getTime($rows['working_time_t']). "</td>".
    			"<td style=\"background-color:#F7F7F7;color:#FF0000;\">".getTime($rows['working_time'])."</td></tr>";
    }
    }
     
    ?>
    Merci à vous par avance.

  2. #2
    Membre Expert

    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Par défaut
    Hello !

    Comme promis, j'ai quelques suggestions à te soumettre :

    La question étant : comment savoir que c'est "la même journée de travail" ?

    - Avec le nombre de pointage : facile à mettre en place, on sait qu'une journée c'est 4 pointages, donc tant qu'on en a pas 4 c'est la même journée. Si c'est le 5ème, alors c'est que c'est le début d'une autre journée.
    Problème : si quelqu'un oublie de pointer (personne n'est infaillible), le système est marron !
    - En comparant avec un prévisionnel : si c'est ton cas, tu peux enregistrer le planning prévisionnel de la personne et si la personne pointe à +/- 1 heure de ce qui était prévu, c'est que c'est la même journée.
    - Par rapport au temps de travail (peut-être la meilleure par rapport à la complexité à mettre en place) : si le dernier pointage date de - de 10h (par ex), c'est la même journée !
    - Par rapport à l'heure qu'il est : si tu sais que personne n'embauche avant 7h du mat et qu'il est 1h du mat, c'est que c'est une débauche

    Il est également possible de rassembler plusieurs de ces méthodes pour obtenir le système le plus fiable possible.

    Dans tous les cas, tu n'échapperas pas au développement d'un système permettant de signaler et réparer les erreurs (en cas d'oubli pointage par exemple) ! Si tu as des journées de plus de 24h, ou un nombre de pointage impair, c'est sans doute qu'il y a un problème.

  3. #3
    Membre averti
    Homme Profil pro
    Chef de projet multimédia
    Inscrit en
    Juin 2014
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Chef de projet multimédia
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2014
    Messages : 35
    Par défaut
    Tout d'abord merci pour ta réponse.

    Je suis tout à fait d'accord avec ce que tu dis et figure toi que j'y avais plus ou moins pensé, mais la réalité ma vite rattraper puisqu'au niveau codage ce n'était pas aussi simple...

    Je n'ai aucune idée de comment mettre en œuvre ce que tu viens de m'annoncer.

    Le prévisionnel est effectivement entré en base de donnée, et est utilisé comme tu le vois dans les scripts (_t = théorique) donc tous les pointages théoriques.

    La solution de compter le nombre de pointage sur la journée à partir de la création de la ligne me parait être une très bonne solution et effectivement s'il y en a un cinquième c'est qu'en fait c'est le 1er.

    Comment coderais-tu ça nativement ?

  4. #4
    Membre averti
    Homme Profil pro
    Chef de projet multimédia
    Inscrit en
    Juin 2014
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Chef de projet multimédia
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2014
    Messages : 35
    Par défaut
    J'ai eu beau chercher, je pense être limiter dans le codage.

    Y aurait-il quelqu'un qui saurait compter le nombre de pointages d'une journée à l'autre ?

  5. #5
    Membre Expert

    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Par défaut
    Du coup, pour moi la solution de comparer avec le théorique me paraît être la meilleure solution.

    Cherche l'horaire la plus proche de l'heure actuelle (c'est du requêtage SQL). Tu peux afficher une alerte si le delta est supérieure à une heure par exemple.

    Autrement pour compter le nombre d'entrées, tu peux utiliser la fonction SQL COUNT

  6. #6
    Membre averti
    Homme Profil pro
    Chef de projet multimédia
    Inscrit en
    Juin 2014
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Chef de projet multimédia
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2014
    Messages : 35
    Par défaut
    Je comprend tout à fait ta logique, et je suis sûr qu'elle conviendrait parfaitement, mais je t'avoue que mon cerveau surchauffe, j'ai effectué une grosse recherche sur le net sans aucun résultat.

    Bien conscient qu'il est facile de faire coder nos scripts par d'autres, je me refuse à l'accepter même si cela m'arrangerait.

    Je suis persuadé que tu saurais le faire, et ce que je te demande, si tu l'accepte, c'est de m'orienter (par des liens ou autres) afin que je puisse trouver une solution avec le peu de connaissances que j'ai.

    Merci

Discussions similaires

  1. mise à jour des liens entre 2 classeurs
    Par pyrene dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 14/05/2008, 12h28
  2. mise a jour des donnèe entre DataGridView et MySQL
    Par TheBlackReverand dans le forum VB.NET
    Réponses: 1
    Dernier message: 18/06/2007, 20h47
  3. [VBA-E]Ajouter jours ouvrés -> NB.Jours.Ouvres, Serie.Jours.Ouvres
    Par ouskel'n'or dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 05/05/2007, 09h36
  4. Gestion des erreurs entre sorties sans la STL
    Par Djobird dans le forum SL & STL
    Réponses: 2
    Dernier message: 13/02/2007, 21h22
  5. mise à jour massive des tables entre 2 bases oracle
    Par rihojaniero dans le forum Oracle
    Réponses: 1
    Dernier message: 13/10/2006, 08h22

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