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

Contribuez / Téléchargez Sources et Outils PHP Discussion :

Elimination des doublons


Sujet :

Contribuez / Téléchargez Sources et Outils PHP

  1. #21
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 156
    Points : 95
    Points
    95
    Par défaut
    Bonjour,
    Je n'ai pas envoyé les bonnes informations hier.
    Je l'avais fait en fin de journée donc j'ai fait du n'importe quoi.
    Ci-joint la bonne table. La requête est la tienne à la lettre sauf que j'ai changé le 18 par 60.
    Merci beaucoup.
    Fichiers attachés Fichiers attachés

  2. #22
    Membre émérite
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Points : 2 522
    Points
    2 522
    Par défaut
    Il fallait trier les données des deux select reliés par le LEFT JOIN et de mettre un TIME_TO_SEC pour convertir les heures en secondes.

    A toi de contrôler.

    Code 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
     
    SELECT `nom`,`prenom`,`date`, `heure`, `heure2`, `delta`  FROM
    (
     SELECT T1.`nom`,T1.`prenom`,T1.`date`, T1.`heure`, 
     CASE WHEN T2.`heure` IS NULL THEN T1.`heure` ELSE T2.`heure` END AS `heure2`,
      TIME_TO_SEC(T1.`heure`) - (CASE WHEN T2.`heure` IS NULL THEN  TIME_TO_SEC(T1.`heure`) ELSE  TIME_TO_SEC(T2.`heure`) END ) AS `delta`
     FROM
     (
     SELECT `nom`,`prenom`,`date`, `heure`, @rank:=@rank+1 as rang
     FROM `horaires_tmp`
     inner join (SELECT @rank:=0) RANK
        ORDER BY 1, 2, 3, 4
     ) T1
     LEFT JOIN
     (
     SELECT `nom`,`prenom`,`date`, `heure`, @rank2:=@rank2+1 as rang
     FROM `horaires_tmp`
     inner join (SELECT @rank2:=0) RANK
        ORDER BY 1, 2, 3, 4
     ) T2
     ON T1.nom = T2.nom AND T1.prenom = T2.prenom AND T1.`date` = T2.`date` AND T1.`rang` = T2.`rang`+1
    ) AS RESULTAT
    WHERE `delta` NOT BETWEEN 1 AND 60
    ORDER BY `nom`,`prenom`,`date`, `heure`

    PS: tel que, ça ne devrait pas marcher s'il y a plus d'une journée dans les données temporaires. Mais bon est-ce important dans ton cas ?
    Cela ne sert à rien d'optimiser quelque chose qui ne fonctionne pas.

    Mon site : www.emmella.fr

    Je recherche le manuel de l'Olivetti Logos 80B.

  3. #23
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 156
    Points : 95
    Points
    95
    Par défaut
    Bonjour,
    Je viens de tester ta requête et ça marche très bien même en essayant le champs Date en Varchar.
    De toute façon le résultat de la requête, Je l'envoie vers une autre table et je vide après la table temporaire. Donc si ça ne marche pas pour 2 dates différentes ça pose pas de problème.
    Je te remercie beaucoup pour ta disponibilité.

  4. #24
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Quelques interrogations et suggestions:
    • Le fait qu'il n'y ait pas de numéro de badge, ou même un identifiant pour chaque personne, dans ta base de données, ce qui veut dire qu'il est impossible d'avoir des homonymes avec une telle base. Est-il possible de les obtenir du fichier Excel?
    • Est-il possible de savoir s'il s'agit d'une entrée ou d'une sortie? Là encore, peut-on le savoir et l'exporter via Excel? (Sinon le type pointe le matin, se barre 15 secondes après puis repasse son badge le soir vers 18h, et hop, il est payé à rien faire! Où encore plus fort, il peut arriver quand les autres partent et partir quand les autres arrivent, juste pour passer la nuit, comme ça pas de loyer à payer en plus du salaire).
    • Tu as tout mis dans une seule table, c'est n'est pas un bon design qui duplique l'information: chaque pointage t'oblige à stocker le nom et le prénom d'un même individu minimum deux fois par jour et ce, multiplié par le nombre de jours. Pour éviter ça, il faut par exemple trois tables: 1) une pour les employés (id, nom, prénom), 2) une pour les pointages (id, datetime), 3) une pour les lier (id_employe, id_pointage).
    • Tu devrais écrire un procédure stockée qui est en charge de l'import afin de pouvoir peupler correctement les trois tables.
    • En adoptant une bonne convention de nommage de tes tables et de tes colonnes, tu pourrais te passer complètement de ``. Par exemple T_EMPLOYE(EMP_ID, EMP_NOM, EMP_PRENOM) avec ça tu ne risques pas d'utiliser un mot réservé comme `date`.
    • Pour le dédoublonnage, pourquoi ne pas utiliser TIMESTAMPDIFF pour calculer le nombre de secondes entre deux dates?
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  5. #25
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 156
    Points : 95
    Points
    95
    Par défaut
    Bonjour,
    Sur le fichier Excel que je reçois, le seul moyen d'identifier la personne est son nom et prénom.
    Ce que je compte faire c'est de créer d'abord la table horaire éliminant les doublons et créer ensuite une table employés, sur laquelle j'insérerai les données nécessaires récupérées de la table horaire et voir ce que ça va donner.
    Merci

  6. #26
    Membre émérite
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Points : 2 522
    Points
    2 522
    Par défaut
    Je ne suis pas persuadé que la badgeuse (s'il y en a une) soit capable de savoir s'il s'agit d'une entrée ou d'une sortie.
    Je ne pointe pas mais quand je vois des gens pointer ils passent leur carte dans le lecteur et c'est tout.
    Cela ne sert à rien d'optimiser quelque chose qui ne fonctionne pas.

    Mon site : www.emmella.fr

    Je recherche le manuel de l'Olivetti Logos 80B.

  7. #27
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 156
    Points : 95
    Points
    95
    Par défaut
    Effectivement la badjeuse ne peut pas vérifier s'agit d'une entrée ou une sortie.
    C'est le plus dur dans l'application.
    Je compte le faire en vérifiant le nombre de pointages par personne et en fonction des heures.
    Et en fonction des résultats, calculer les heures supplémentaires, le cumul des retards par journée et ensuite par mois pour chaque personne.
    Compliqué tout cela

  8. #28
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 156
    Points : 95
    Points
    95
    Par défaut
    Bonjour,
    Je reviens vers vous par rapport à l'avancement du projet.
    J'ai créé une table employés ayant comme champs :
    nom, prenom, date, heure_entree1, heure_sortie1,heure_entree2, heure_sortie2,heure_entree2, heure_sortie2,
    heure_entree3, heure_sortie3,heure_entree4, heure_sortie4 en supposant qu'un employé peut pointer au maximum 8 fois, heure_supplémentaire, heure_retard, total_heure_supplementaire, total_heure_retard.
    Ce que je souhaiterais faire c'est d'insérer les résultats de la table précédente à cette nouvelle table à voir les heures d'entrée et de sortie et de pouvoir calculer ensuite les heures supplémentaires et du retard.
    Retrouver aussi les employés n'ayant pas pointé ( Absents ) et pouvoir préciser qu'ils ne l'ont pas fait.
    J'essaie de trouver la requête mais je n'arrive pas à le faire.
    Merci de votre aide.

  9. #29
    Membre émérite
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Points : 2 522
    Points
    2 522
    Par défaut
    Voici un exemple à adapter. Attention vois y plus un principe qu'une solution même s'il ne doit pas y avoir beaucoup de modifications à faire.
    Pour ma part je garderais une structure verticale plutôt qu'horizontale.

    Code php : 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
    <?php
    //---- DATABASE
    define('DB_HOST', '127.0.0.1');
    define('DB_NAME', 'tests');
    define('DB_USER', 'root');
    define('DB_PWD' , '');$bdd       = new PDO('mysql:host='.DB_HOST.'; dbname='.DB_NAME,DB_USER,DB_PWD, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
    $query     = "SELECT nom, prenom, `date`, heure from horaires order by nom, prenom, `date`, heure";
    $prepared  = $bdd->prepare($query);
    $prepared->execute();
    //------ Initialisation des variables pour test de changement de personne/date
    $savNom    = "";
    $savPrenom = "";
    $savDate   = "";
    $savHeure  = "";
    $row = $prepared->fetch(PDO::FETCH_ASSOC);
    while ($row)
    {
     $nom    = $row['nom'];
     $prenom = $row['prenom'];
     $date   = $row['date'];
     $heure  = $row['heure']; 
     
     // détecte le changement de personne et de jour
     if ($savNom != $nom || $savPrenom != $prenom || $savDate != $date)
     {
      $savNom    = $nom;
      $savPrenom = $prenom;
      $savDate   = $date;
      // init des champs heures
      $heures    = array();
     }
     // sauvegarde de l'heure pour chaque enregistrement
     $heures[] = $heure;
     
     $row = $prepared->fetch(PDO::FETCH_ASSOC);
     
     // détecte le changement de personne ou de jour ou la fin des données
     $nom2    = $row['nom'];
     $prenom2 = $row['prenom'];
     $date2   = $row['date'];
     $heure2  = $row['heure'];
     if ($savNom != $nom2 || $savPrenom != $prenom2 || $savDate != $date2 || !$row)
     {
      //---- Insertion des données dans la table
      $nomPourTable       = $savNom;
      $prenomPourTable    = $savPrenom;
      $datePourTable      = $savDate;
      $heureInPourTable1  = isset($heures[0]) ? $heures[0] : '00:00:00';
      $heureOutPourTable1 = isset($heures[1]) ? $heures[1] : '00:00:00';
     
      $heureInPourTable2  = isset($heures[2]) ? $heures[2] : '00:00:00';
      $heureOutPourTable2 = isset($heures[3]) ? $heures[3] : '00:00:00';
     
      $heureInPourTable3  = isset($heures[4]) ? $heures[4] : '00:00:00';
      $heureOutPourTable3 = isset($heures[5]) ? $heures[5] : '00:00:00';
      $heureInPourTable4  = isset($heures[6]) ? $heures[6] : '00:00:00';
      $heureOutPourTable4 = isset($heures[7]) ? $heures[7] : '00:00:00'; 
      print "$nomPourTable | $prenomPourTable | $datePourTable | $heureInPourTable1 | $heureOutPourTable1 | $heureInPourTable2 | $heureOutPourTable2 | $heureInPourTable3 | $heureOutPourTable3 | $heureInPourTable4 | $heureOutPourTable4<br/>";
     }
     
    }
    Cela ne sert à rien d'optimiser quelque chose qui ne fonctionne pas.

    Mon site : www.emmella.fr

    Je recherche le manuel de l'Olivetti Logos 80B.

  10. #30
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 156
    Points : 95
    Points
    95
    Par défaut
    Merci pour ton aide.
    C'est exactement ce que je voulais.
    Reste maintenant le calcul des retards et des heures supplémentaires.
    Pour ça je créé les variables retard et heure_supplémentaires et je fais des "if" pour les mettre dans le tableau.
    C'est bien ça ?

  11. #31
    Membre émérite
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Points : 2 522
    Points
    2 522
    Par défaut
    Je ne sais pas. Essaie selon ton idée et si ça ne marche pas poste le code.
    Cela ne sert à rien d'optimiser quelque chose qui ne fonctionne pas.

    Mon site : www.emmella.fr

    Je recherche le manuel de l'Olivetti Logos 80B.

  12. #32
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 156
    Points : 95
    Points
    95
    Par défaut
    Merci beaucoup

  13. #33
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 156
    Points : 95
    Points
    95
    Par défaut
    Bonjour,
    Je reviens vers toi par rapport au projet.
    J'ai essayé avec mes moyens de faire les calculs des retards et des heures supplémentaires en suivant quelques informations données par la DRH.
    Le principe c'est que un retard de 10 min n'est pas comptabilisé.
    15 min aprés 17h n'est pas considéré non plus comme un retard.
    Je n'ai pas encore reçu les consignes d'un pointage impair.
    Je poste le code qui a l'air de marcher selon les tests que j'ai effectués.

    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
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    <?php
     
    function add_heures($heure1,$heure2){ 
    $secondes1=heure_to_secondes($heure1); 
    $secondes2=heure_to_secondes($heure2); 
    $somme=$secondes1+$secondes2; 
    //transfo en h:i:s 
    $s=$somme % 60; //reste de la division en minutes => secondes 
    $m1=($somme-$s) / 60; //minutes totales 
    $m=$m1 % 60;//reste de la division en heures => minutes 
    $h=($m1-$m) / 60; //heures 
    if ($h <10 and $m <10 )
    $resultat='0'.$h.":0".$m."";
    else if ($h <10 and $m >10 )
    $resultat='0'.$h.":".$m."";
    else if ($h >10 and $m <10 )
    $resultat=$h.":0".$m.""; 
    else if ($h >10 and $m >10 )
    $resultat=$h.":".$m.""; 
    return $resultat; 
    } 
     
    function soustract_heures($heure1,$heure2){ 
    $secondes1=heure_to_secondes($heure1); 
    $secondes2=heure_to_secondes($heure2); 
    $diff=$secondes1-$secondes2; 
    //transfo en h:i:s 
    $s=$diff % 60; //reste de la division en minutes => secondes 
    $m1=($diff-$s) / 60; //minutes totales 
    $m=$m1 % 60;//reste de la division en heures => minutes 
    $h=($m1-$m) / 60; //heures 
    if ($h <10 and $m <10 )
    $resultat='0'.$h.":0".$m."";
    else if ($h <10 and $m >10 )
    $resultat='0'.$h.":".$m."";
    else if ($h >10 and $m <10 )
    $resultat=$h.":0".$m.""; 
    else if ($h >10 and $m >10 )
    $resultat=$h.":".$m."";
    return $resultat; 
    } 
    function heure_to_secondes($heure){ 
    $array_heure=explode(":",$heure); 
    $secondes=3600*$array_heure[0]+60*$array_heure[1]+$array_heure[2]; 
    return $secondes; 
    } 
     
    $retard= "00:00:00";
    $supp="00:00:00";
    /*
    
    Valeurs initailisés pour Test
    
    
    $heureIn1= "10:10:00";
    $heureOut1= "11:00:00";
    $heureIn2 = "12:30:00";
    $heureOut2 = "12:45:00";
    $heureIn3="13:00:00";
    $heureOut3="14:10:00";
    $heureIn4="15:10:00";
    $heureOut4="18:10:00";*/
     
     
    if ( $heureOut1 == "00:00:00")
    {
      if ( $heureIn1 > "08:10:00" )
      {
    	  $retard= soustract_heures($heureIn1,"08:10:00");
      }
      else $retard = "00:00";
      $supp="00:00";
    }  
     
    else if ( $heureIn2 == "00:00:00" )
    {
    	if ( $heureIn1 < "08:10:00" and $heureOut1 <"17:00:00" )
    	{
     
          $retard = soustract_heures("17:00:00",$heureOut1);
    	  $supp = "00:00";
    	}
    	else if ( $heureIn1 < "08:10:00" and $heureOut1 >"17:10:00" )
    	{
    	   $retard = "00:00";
    	   $supp= soustract_heures($heureOut1,"17:10:00");
    	}
    	else if ( $heureIn1 > "08:10:00" and $heureOut1 <"17:10:00" )
    	{
    		$resultat1 = soustract_heures($heureIn1,"08:10:00");
    		$resultat2 = soustract_heures("17:00:00",$heureOut1);
    		$retard = add_heures($resultat1,$resultat2);
    		$supp = "00:00";
    	}
    	else 
    	{
    		$retard = soustract_heures($heureIn1,"08:10:00");
    		$supp = soustract_heures($heureOut1,"17:10:00");
    	}	 
    }
    /* Pointage 3 fois
    else	if ( $heureOut2 == "00:00:00" )
    {
    	
    }
    */
    else if ( $heureIn3 == "00:00:00" )
    {
    	if ( $heureIn1 < "08:10:00" and $heureOut2 < "17:00:00" )
    	{
    		$res1 = soustract_heures($heureIn2,$heureOut1);
    		$res2 = soustract_heures("17:00:00",$heureOut2);
    		if ( $res1 > "00:30:00" )
    		{
    			$res3 = soustract_heures($res1,"00:30:00");
    			$retard = add_heures($res2,$res3);
    		}
    		else 
    		$retard = $res2;
    		$supp = "00:00";
    	}   
     
            else if ( $heureIn1 < "08:10:00" and $heureOut2 >"17:10:00" )
    	{
     
                  $res1 = soustract_heures($heureIn2,$heureOut1);
                  $res2 = soustract_heures($heureOut2,"17:10:00");
                  if ( $res1 > "00:30:00" )
    		{
    			$retard = soustract_heures($res1,"00:30:00");
    		}
                    else
                    $retard = "00:00";
                    $supp=$res2; 
            }
            else if ( $heureIn1 > "08:10:00" and $heureOut2 <"17:00:00" )
            {
                  $res1 = soustract_heures($heureIn2,$heureOut1);
                  $res2 = soustract_heures($heureIn1,"08:10:00");
                  $res3 = soustract_heures("17:00:00",$heureOut2);
                  if ( $res1 > "00:30:00" )
    		{
                    $tot = soustract_heures($res1,"00:30:00");
                    $tot2 = add_heures($res2,$res3);
                    $retard = add_heures($tot,$tot2);
                    }
                    else 
                    $retard = add_heures($res2,$res3);
                    $supp = "00:00";
            }
            else 
            {
                   $res1 = soustract_heures($heureIn2,$heureOut1);
                   $res2 = soustract_heures($heureIn1,"08:10:00");
                   $res3 = soustract_heures($heureOut2,"17:10:00");
                   if ( $res1 > "00:30:00" )
    		{
                    $tot = soustract_heures($res1,"00:30:00");
                    $retard = add_heures($res2,$tot);
                    }
                    else
                    $retard = $res2;
                    $supp = $res3;
            }
    }      
    /*Pointage 5 fois
    else	if ( $heureOut3 == "00:00:00" )
    */
    else if ( $heureIn4 == "00:00:00" )
    {
           if ( $heureIn1 < "08:10:00" and $heureOut3 < "17:00:00" )
    	{
     
                  $res1 = soustract_heures($heureIn2,$heureOut1);
                  $res2 = soustract_heures($heureIn3,$heureOut2);
                  $res3 = soustract_heures("17:00:00",$heureOut3);
                  $tot1 = add_heures($res1,$res2);
                  $tot2 = add_heures($tot1,$res3);
                  if ( $tot1 > "00:30:00" )
    		{ 
                    $retard = soustract_heures($tot2,"00:30:00");
                    }
                    else
                    $retard = $res3;
                    $supp = "00:00";
            }
            else if ( $heureIn1 < "08:10:00" and $heureOut3 > "17:10:00" )
    	{
                  $res1 = soustract_heures($heureIn2,$heureOut1);
                  $res2 = soustract_heures($heureIn3,$heureOut2); 
                  $res3 = soustract_heures($heureOut3,"17:10:00");
                  $tot1 = add_heures($res1,$res2);
                  if ( $tot1 > "00:30:00" )
    		{
                    $retard = soustract_heures($tot1,"00:30:00");
                    }
                  else
                  $retard = "00:00";
                  $supp = $res3;
            }
            else if ( $heureIn1 > "08:10:00" and $heureOut3 < "17:00:00" )
    	{
                  $res1 = soustract_heures($heureIn2,$heureOut1);
                  $res2 = soustract_heures($heureIn3,$heureOut2);
                  $res3 = soustract_heures($heureIn1,"08:10:00");
                  $res4 = soustract_heures("17:00:00",$heureOut3);
                  $tot1 = add_heures($res1,$res2);
                  $tot2 = add_heures($res3,$res4);
                  $total = add_heures($tot1,$tot2);
                  if ( $total > "00:30:00" )
    		{
                    $retard = soustract_heures($total,"00:30:00");
                    }
                  else
                  $retard = "00:00";
                  $supp = "00:00";
            }
            else 
            {
             $res1 = soustract_heures($heureIn2,$heureOut1);
             $res2 = soustract_heures($heureIn3,$heureOut2);     
             $res3 = soustract_heures($heureIn1,"08:10:00");
             $res4 = soustract_heures($heureOut3,"17:10:00");
             $tot1 = add_heures($res1,$res2);
             $tot2 = add_heures($tot1,$res3);
                  if ( $tot1 > "00:30:00" )
    		{
                     $retard = soustract_heures($tot2,"00:30:00");
                    }
                  else
                    $retard = $tot2;
                    $supp = $res4;
            }
     
    }
    /*Pointage 7 fois
    else	if ( $heureOut4 == "00:00:00" )
    */
    else 
    {
          if ( $heureIn1 < "08:10:00" and $heureOut4 < "17:00:00" )
    	{
             $res1 = soustract_heures($heureIn2,$heureOut1);
             $res2 = soustract_heures($heureIn3,$heureOut2);
             $res3 = soustract_heures($heureIn4,$heureOut3);
             $res4 = soustract_heures("17:00:00",$heureOut4);
             $tot1 = add_heures($res1,$res2);
             $tot2 = add_heures($res3,$tot1);
             $total = add_heures($tot2,$res4);
             if ( $tot2 > "00:30:00" )
    		{ 
                    $retard = soustract_heures($total,"00:30:00");
                    }
             else
                    $retard = $res4;
                    $supp = "00:00";
            }
     
           else if ( $heureIn1 < "08:10:00" and $heureOut4 > "17:10:00" )
    	{
             $res1 = soustract_heures($heureIn2,$heureOut1);
             $res2 = soustract_heures($heureIn3,$heureOut2);
             $res3 = soustract_heures($heureIn4,$heureOut3);
             $tot1 = add_heures($res1,$res2);
             $tot2 = add_heures($res3,$tot1); 
             if ( $tot2 > "00:30:00" )
    		{
                     $retard = soustract_heures($tot2,"00:30:00");
                    }
             else 
              $retard = "00:00";
              $supp = soustract_heures($heureOut4,"17:10:00");
            }
          else if ( $heureIn1 > "08:10:00" and $heureOut4 < "17:00:00" )
    	{
              $res1 = soustract_heures($heureIn2,$heureOut1);
              $res2 = soustract_heures($heureIn3,$heureOut2);
              $res3 = soustract_heures($heureIn4,$heureOut3);
              $res4 = soustract_heures($heureIn1,"08:10:00");
              $res5 = soustract_heures("17:00:00",$heureOut4);
              $tot1 = add_heures($res1,$res2);
              $tot2 = add_heures($res3,$tot1);
              $tot3 = add_heures($res4,$res5);
              $total = add_heures($tot2,$tot3);
              if ( $tot2 > "00:30:00" )
    		{ 
                    $retard = soustract_heures($total,"00:30:00");
                    }
              else
               $retard = "00:00";
               $supp = "00:00"; 
            }
         else 
            {
              $res1 = soustract_heures($heureIn2,$heureOut1);
              $res2 = soustract_heures($heureIn3,$heureOut2);
              $res3 = soustract_heures($heureIn4,$heureOut3);
              $res4 = soustract_heures($heureIn1,"08:10:00");
              $res5 = soustract_heures($heureOut4,"17:10:00");
              $tot1 = add_heures($res1,$res2);
              $tot2 = add_heures($res3,$tot1);
              $tot3 = add_heures($res4,$tot2);
              if ( $tot2 > "00:30:00" )
    		{
                     $retard = soustract_heures($tot3,"00:30:00");
                    }
                  else
                    $retard = $tot3;
                    $supp = $res5;
            }
    }
    echo $retard. "\n";
    echo $supp;
    Ce que je n'ai pas réussi à faire c'est d'intégrer ses valeurs sur le tableau, donc en gros
    Je souhaiterais rajouter à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print "$nomPourTable | $prenomPourTable | $datePourTable | $heureInPourTable1 | $heureOutPourTable1 | $heureInPourTable2 | $heureOutPourTable2 | $heureInPourTable3 | $heureOutPourTable3 | $heureInPourTable4 | $heureOutPourTable4
    les retards et les heures supplémentaires.

    Merci beaucoup pour ton aide

  14. #34
    Membre émérite
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Points : 2 522
    Points
    2 522
    Par défaut
    Oulà. Il y a beaucoup de code. J’ai pas tout lu car il y a de quoi faire. Cependant, ça me paraît très long pour ce que j’ai compris de ce que tu dois faire.
    Essaie de reformaliser le problème. Poste le et ensuite je suis quasiment sûr qu’on peut faire la même chose en beaucoup moins de place. L’informatique c’est aussi l’art de factoriser.
    Cela ne sert à rien d'optimiser quelque chose qui ne fonctionne pas.

    Mon site : www.emmella.fr

    Je recherche le manuel de l'Olivetti Logos 80B.

  15. #35
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Pour faire des comparaisons et des opérations sur des horaires, utilise plutôt les classes DateTime et DateInterval qui sont faites pour ça. Sinon: indente ton code, évite les constantes magiques, trouve une convention de nommage de tes variables.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  16. #36
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 156
    Points : 95
    Points
    95
    Par défaut
    Bonjour,
    Je vais essayer d'expliquer ce que j'essaie de faire :
    Le travail commence à 8h et finit à 17h avec une pause déjeuner pas obligatoire de 30 min qui se prend entre 12h et 14h. avec une tolérance de retard de 10 min le matin. Les heures supplémentaires sont prises en compte à partir de 17h10.
    -Si une personne commence à 08h et oublie de pointer la sortie on considère "par défaut" qu'elle a oublié de pointer sa sortie.
    Exemple Pierre pointe à 08:20:31 le 13/11/2018 on aura:
    heure entrée 08:20:31 heure sortie 17:00:00 heure
    dupont | pierre | 13/11/2018 | 08:20:31 | 17:00:00 | 00:00:00 | 00:00:00 | 00:00:00 | 00:00:00 | 00:00:00 | 00:00:00 | 00:10 "pour le retard " | 00:00 pour les heures supp.
    -Si une personne par contre pointe à 17h mais pas le matin on va supposer qu'il a oublier de pointer son entrée.
    -Si Pierre pointe à 08:20 et 17:30 on aura :
    dupont | pierre | 13/11/2018 | 08:20:31 | 17:30:22 | 00:00:00 | 00:00:00 | 00:00:00 | 00:00:00 | 00:00:00 | 00:00:00 | 00:10 | 00:20 car retard de 10min et heures supplémentaires de 20 min.
    -Pierre pointe 3 fois à 10h, 12h, 19h " Oubli de pointer une fois : On suppose qu'il a oublié de pointer l'entrée de la pause déjeuner et on aura:
    dupont | pierre | 13/11/2018 | 10:00:00 | 12:00:00 | 12:30:00 | 19:00:00 | 00:00:00 | 00:00:00 | 00:00:00 | 00:00:00 | 01:50 | 01:50
    -Pierre pointe 4 fois : 08h, 09h,10h,19h on aura
    upont | pierre | 13/11/2018 | 08:00:00 | 09:00:00 | 10:00:00 | 19:00:00 | 00:00:00 | 00:00:00 | 00:00:00 | 00:00:00 | 01:00 (de ratard car 9h-8h et ce n'est pas compris entre 12h et 14h) | 01:50 (19h-17h10)
    -Pierre pointe 4 fois : 08h, 12h,13h,19h on aura
    upont | pierre | 13/11/2018 | 08:00:00 | 12:00:00 | 13:00:00 | 19:00:00 | 00:00:00 | 00:00:00 | 00:00:00 | 00:00:00 | 00:30 (de ratard car c'est entre 12h et 14h et on soustrait les 30min autorisées pour la pause déjeuner) | 01:50 (19h-17h10).
    Et ensuite c'est le meme principe jusqu'aux 8 pointages.
    J'aimerais aussi par la suite avoir un bouton pour changer les informations afin de gérer les exceptions.
    J'espère que j'étais clair.
    Merci beaucoup

  17. #37
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    il me semble que le titre de la discussion n'est pas/plus en rapport avec ta demande.

    • soit tu changes le titres de cette discussion (en éditant ton 1er message)
    • soit tu ouvres une nouvelle discussion, avec le titre du nouveau sujet


    Citation Envoyé par badaze Voir le message
    Essaie de reformaliser le problème. Poste le et ensuite je suis quasiment sûr qu’on peut faire la même chose en beaucoup moins de place. L’informatique c’est aussi l’art de factoriser.
    +1

    Il faut que tu ailles jusqu'au bout de ton raisonnement, et que tu rédiges (par écrit) la liste exhaustive de tous les cas de figure possible.
    C'est ainsi que tu seras en mesure d'élaborer :
    • les règles de base
    • les conditions logiques
    • et les mettre en équation

    Pour ça, il te faut 4 choses essentielles :
    • du papier
    • un crayon
    • de la matière grise
    • et de l'huile de coude


    N'attends pas que ce soient les autres qui pensent/réfléchissent à ta place :
    • d'abord parce que c'est TA problématique
    • ensuite parce qu'on a ni le temps, ni l'implication pour ça


    Exemple de règle de base :
    ...Le travail commence à 8h et finit à 17h...
    Donc la "journée-type" (= référence) fait : 8h -> 17h
    ...avec une pause déjeuner qui se prend entre 12h et 14h...
    Pause obligatoire ? Combien dure-t-elle (par convention) ? (1h de pause ? 1h30 ?)

    Dans un 1er temps, l'objectif est de savoir comment déterminer et distinguer "heure d'entrée" et "heure de sortie".
    -> on doit bien être capable de définir des créneaux horaires correspondant à chacun.


    N.B. Tes exemples de ton message précédent me laissent dubitatif :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ... -Pierre pointe 4 fois : 08h, 09h,10h,19h...
    On pointe n'importe quand alors ???
    On rentre, on sort quand on veut ??

    S'il n'y a aucune règle... ça va sacrément compliquer...

    Citation Envoyé par hichamus13 Voir le message
    ...Sur le fichier Excel que je reçois, le seul moyen d'identifier la personne est son nom et prénom...

    Le nom et prénom ne suffisent pas à identifier formellement une personne (à cause des homonymes possibles, voire même simplement d'une faute de frappe dans le nom ou le prénom).
    Tout employé est forcément identifié, ne serait-ce que par son numéro de sécu (ou un numéro de badge, unique).
    Dernière modification par Invité ; 13/11/2018 à 10h23.

  18. #38
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 156
    Points : 95
    Points
    95
    Par défaut
    Si si j'ai élaboré un code que j'ai posté.
    Par rapport au fait qu'on peut pointer n'importe quand.
    L'exemple de -Pierre pointe 4 fois : 08h, 09h,10h,19h, ça fait partie des exceptions parce qu'il peut être parti en mission ou qu'il a simplement demandé une absence qui a été validée et qu'il ne soit pas parti en pause déjeuner car elle n'est pas obligatoire.
    La pointeuse reconnait la personne par le code barre de son badge donc il ne peut pas y avoir de faute de frappe.

  19. #39
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Tu dois te procurer les codes (numéros correspondants au code barre, ils sont bien quelque part) de ces badges associés aux personnes. Tant que tu n'as pas ça, ce n'est même pas la peine d'aller plus loin. Ensuite tu pourras modéliser une base de données correcte, mais pas avant. Se servir du nom/prénom pour identifier les gens n'est pas une solution acceptable.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  20. #40
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 156
    Points : 95
    Points
    95
    Par défaut
    Je vais continuer comme ça et modifier le programme si je réussis à récupérer ses codes.
    Merci

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 3 PremièrePremière 123 DernièreDernière

Discussions similaires

  1. Eliminer des doublons dans un fichier
    Par fennec62 dans le forum Général Python
    Réponses: 13
    Dernier message: 11/01/2009, 11h40
  2. Réponses: 8
    Dernier message: 22/03/2006, 17h16
  3. Elimination des doublons
    Par amika dans le forum Requêtes
    Réponses: 8
    Dernier message: 05/11/2005, 09h28
  4. Elimination des doublons
    Par bilalove dans le forum Oracle
    Réponses: 3
    Dernier message: 11/08/2005, 13h53
  5. Eliminer des Doublon dans une Table
    Par Soulama dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 03/02/2005, 14h27

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