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 :

Calcul heure supplementaires


Sujet :

PHP & Base de données

  1. #1
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2022
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2022
    Messages : 15
    Par défaut Calcul heure supplementaires
    Bonjour à tous
    Je viens demander votre aide après plusieurs heures sans solution.
    J'essai de calculer des heures supplémentaires en fonction d'une plage de date et heure début et fin, ou une date simple avec date début et fin.
    En fonction de la date de début et les créneau horaires je souhaite avoir les heures normales de travail, les heures supplémentaires.
    Les heures de travail dues = 8h donc à partir de la 8è h ce sont des heures supp.
    Les heures peuvent être réalisées avec un chevauchement sur 2 jours (18/06/23 16h-6h soit du 18 a 16h au 19 à 6h).
    Si les heures supp sont réalisées entre 20h et 6h le lendemain elles sont considérées comme heure de nuit.
    Si les heures supp sont réalisées les week end on le note également.

    J'ai essayé avec le code ci dessous mais le résultat est inexact. Je ne sais pas ce qui coince

    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
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    public function analyseHours($datedebx,$heuredeb,$heurefin,$debnuit,$finuit,$jours_feries) {
    			$dates = explode(" to ", $datedebx);
    			$deb = trim($dates[0]);
    			$fin = trim($dates[1]);
     
    			$datedeb_obj = DateTime::createFromFormat("d-m-Y", $deb);
    			$datefin_obj = DateTime::createFromFormat('d-m-Y', $fin);
    			$heuredeb_obj = DateTime::createFromFormat('H:i', $heuredeb);
    			$heurefin_obj = DateTime::createFromFormat('H:i', $heurefin);
     
    			$date_debut = $datedeb_obj->format('d/m/Y');
    			$heure_debut = $heuredeb_obj->format('H:i');
    			$date_fin = $datefin_obj->format('d/m/Y');
    			$heure_fin = $heurefin_obj->format('H:i');
     
    			$heure_normales = new DateTime('00:00');
    			$heure_supplementaires = new DateTime('00:00');
     
    			if ($heurefin_obj < $heuredeb_obj) {
    				$heure_normales = $heure_normales->add($heuredeb_obj->diff(DateTime::createFromFormat('H:i', '23:59')));
     
    				if ($heure_normales->format('H') < 8) {
    					$heure_normales = $heure_normales->add($heuredeb_obj->diff(DateTime::createFromFormat('H:i', '08:00')));
    				}
     
    				if ($heuredeb_obj->format('H') >= 9) {
    					$heure_supplementaires = $heure_supplementaires->add($heuredeb_obj->diff(DateTime::createFromFormat('H:i', '09:00')));
    				}
     
    				$heure_supplementaires = $heure_supplementaires->add($heuredeb_obj->diff(DateTime::createFromFormat('H:i', '05:59')));
    				$heure_supplementaires = $heure_supplementaires->add(DateTime::createFromFormat('H:i', '00:01')->diff($heurefin_obj));
     
    				if ($heuredeb_obj->format('H') >= $debnuit || $heurefin_obj->format('H') <= $finuit) {
    					$type_heure = 'Nuit';
    				} else {
    					$type_heure = 'Jour';
    				}
    			} else {
    				$heure_normales = $heure_normales->add($heuredeb_obj->diff($heurefin_obj));
     
    				if ($heure_normales->format('H') < 8) {
    					$heure_supplementaires = $heure_supplementaires->add($heuredeb_obj->diff(DateTime::createFromFormat('H:i', '08:00')));
    				}
     
    				if ($heuredeb_obj->format('H') >= 9) {
    					$heure_supplementaires = $heure_supplementaires->add($heuredeb_obj->diff(DateTime::createFromFormat('H:i', '09:00')));
    				}
     
    				$heure_supplementaires = $heure_supplementaires->add($heuredeb_obj->diff($heurefin_obj));
     
    				if (($heuredeb_obj->format('H') >= $debnuit && $heuredeb_obj->format('H') <= 23) || ($heurefin_obj->format('H') >= 0 && $heurefin_obj->format('H') <= $finuit)) {
    					$type_heure = 'Nuit';
    				} else {
    					$type_heure = 'Jour';
    				}
    			}
     
    			$date_heures_supp = $datefin_obj->format('d-m-Y');
    			if (in_array($date_heures_supp, $jours_feries)) {
    				$type_jour = 'Férié';
    			} else {
    				$type_jour = 'Normal';
    			}
     
    			$jour_semaine = $datefin_obj->format('N');
    			$est_weekend = ($jour_semaine >= 6);
     
    			$resultat = [
    				'date_debut' => $date_debut,
    				'heure_debut' => $heure_debut,
    				'date_fin' => $date_fin,
    				'heure_fin' => $heure_fin,
    				'heure_normales' => $heure_normales->format('H:i'),
    				'heure_supplementaires' => $heure_supplementaires->format('H:i'),
    				'type_heure' => $type_heure,
    				'type_jour' => $type_jour,
    				'semaine' => ($est_weekend ? 'Weekend' : 'Normal')
    			];
     
    			return $resultat;
    		}

    Merci d'avance

  2. #2
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 619
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 619
    Par défaut
    montrez nous plusieurs appels de cette fonction qui ne donnent pas le bon résultat.

  3. #3
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2022
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2022
    Messages : 15
    Par défaut
    Merci pour l'interet.
    En essayant avec les param ci dessous :
    datedebx = 26/06/2023 to 28/06/2023
    heuredeb = 18:00
    heurefin] = 05:00

    le resultat obtenu est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Array
    (
        [date_debut] => 26/06/2023
        [heure_debut] => 18:00
        [date_fin] => 28/06/2023
        [heure_fin] => 05:00
        [heure_normales] => 19:59 //inexact! la bonne réponse est 08h
        [heure_supplementaires] => 07:58 //inexact! la bonne réponse est 03h car 11h travaillé donc 11-8 = 3
        [type_heure] => Nuit
        [type_jour] => Normal
        [semaine] => Normal
    )

  4. #4
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 315
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 315
    Billets dans le blog
    17
    Par défaut
    Faudrait faire un minimum d'efforts quand même si tu veux de l'aide.

    La 1re chose est de fournir du code exécutable

    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
    <?php
     
    function analyseHours($datedebx,$heuredeb,$heurefin,$debnuit,$finuit,$jours_feries)
    {
        $dates = explode(" to ", $datedebx);
        $deb = trim($dates[0]);
        $fin = trim($dates[1]);
     
        $datedeb_obj = DateTime::createFromFormat("d-m-Y", $deb);
        $datefin_obj = DateTime::createFromFormat('d-m-Y', $fin);
        $heuredeb_obj = DateTime::createFromFormat('H:i', $heuredeb);
        $heurefin_obj = DateTime::createFromFormat('H:i', $heurefin);
     
        $date_debut = $datedeb_obj->format('d/m/Y');
        $heure_debut = $heuredeb_obj->format('H:i');
        $date_fin = $datefin_obj->format('d/m/Y');
        $heure_fin = $heurefin_obj->format('H:i');
     
        $heure_normales = new DateTime('00:00');
        $heure_supplementaires = new DateTime('00:00');
     
        if ($heurefin_obj < $heuredeb_obj) {
            $heure_normales = $heure_normales->add($heuredeb_obj->diff(DateTime::createFromFormat('H:i', '23:59')));
     
            if ($heure_normales->format('H') < 8) {
                $heure_normales = $heure_normales->add($heuredeb_obj->diff(DateTime::createFromFormat('H:i', '08:00')));
            }
     
            if ($heuredeb_obj->format('H') >= 9) {
                $heure_supplementaires = $heure_supplementaires->add($heuredeb_obj->diff(DateTime::createFromFormat('H:i', '09:00')));
            }
     
            $heure_supplementaires = $heure_supplementaires->add($heuredeb_obj->diff(DateTime::createFromFormat('H:i', '05:59')));
            $heure_supplementaires = $heure_supplementaires->add(DateTime::createFromFormat('H:i', '00:01')->diff($heurefin_obj));
     
            if ($heuredeb_obj->format('H') >= $debnuit || $heurefin_obj->format('H') <= $finuit) {
                $type_heure = 'Nuit';
            } else {
                $type_heure = 'Jour';
            }
        } else {
            $heure_normales = $heure_normales->add($heuredeb_obj->diff($heurefin_obj));
     
            if ($heure_normales->format('H') < 8) {
                $heure_supplementaires = $heure_supplementaires->add($heuredeb_obj->diff(DateTime::createFromFormat('H:i', '08:00')));
            }
     
            if ($heuredeb_obj->format('H') >= 9) {
                $heure_supplementaires = $heure_supplementaires->add($heuredeb_obj->diff(DateTime::createFromFormat('H:i', '09:00')));
            }
     
            $heure_supplementaires = $heure_supplementaires->add($heuredeb_obj->diff($heurefin_obj));
     
            if (($heuredeb_obj->format('H') >= $debnuit && $heuredeb_obj->format('H') <= 23) || ($heurefin_obj->format('H') >= 0 && $heurefin_obj->format('H') <= $finuit)) {
                $type_heure = 'Nuit';
            } else {
                $type_heure = 'Jour';
            }
        }
     
        $date_heures_supp = $datefin_obj->format('d-m-Y');
        if (in_array($date_heures_supp, $jours_feries)) {
            $type_jour = 'Férié';
        } else {
            $type_jour = 'Normal';
        }
     
        $jour_semaine = $datefin_obj->format('N');
        $est_weekend = ($jour_semaine >= 6);
     
        $resultat = [
            'date_debut' => $date_debut,
            'heure_debut' => $heure_debut,
            'date_fin' => $date_fin,
            'heure_fin' => $heure_fin,
            'heure_normales' => $heure_normales->format('H:i'),
            'heure_supplementaires' => $heure_supplementaires->format('H:i'),
            'type_heure' => $type_heure,
            'type_jour' => $type_jour,
            'semaine' => ($est_weekend ? 'Weekend' : 'Normal')
        ];
     
        return $resultat;
    }
     
    $datedebx = '26/06/2023 to 28/06/2023';
    $heuredeb = '18:00';
    $heurefin = '05:00';
     
    $r = analyseHours($datedebx,$heuredeb,$heurefin);
     
    print_r($r);
    Résultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    PHP Fatal error:  Uncaught ArgumentCountError: Too few arguments to function analyseHours(), 3 passed in /home/tests/f443.php on line 90 and exactly 6 expected in /home/tests/f443.php:3
    Stack trace:
    #0 /home/tests/f443.php(90): analyseHours()
    #1 {main}
      thrown in /home/tests/f443.php on line 3

  5. #5
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2022
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2022
    Messages : 15
    Par défaut
    Désolé pour cet oubli.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $datedebx = "26/06/2023 to 28/06/2023";
    $heuredeb = "18:00";
    $heurefin = "05:00";
    $debnuit = "20:00";
    $finuit = "06:00";
    $jours_feries = ["12/02/2023","24/05/2023","27/07/2023"];
     
    $resultat = analyseHours($datedebx,$heuredeb,$heurefin,$debnuit,$finuit,$jours_feries)
    Merci

  6. #6
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 315
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 315
    Billets dans le blog
    17
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    datedebx = 26/06/2023 to 28/06/2023;
    heuredeb = 18:00;
    heurefin = 05:00;
    debnuit = 20:00;
    finuit = 06:00;
    jours_feries = ["12/02/2023","24/05/2023","27/07/2023"];
     
    analyseHours($datedebx,$heuredeb,$heurefin,$debnuit,$finuit,$jours_feries)
    Ceci n'est pas du PHP.

    0 effort de part = 0 effort de la mienne.

    Bon courage pour la suite,

  7. #7
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2022
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2022
    Messages : 15
    Par défaut
    Toute mes excuses Seb, c'etait pas volontaire mais due aux conditions dans lesquelles j'ai repondu mais je n'ai pas d'excuse.
    J'ai corrigé (je pense) mais je comprendrai si tu ne veux plus m'aider.
    Merci d'avoir regardé🙏

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 29/09/2016, 09h07
  2. calcul des heures supplementaires sur excel
    Par ndolive07 dans le forum Excel
    Réponses: 3
    Dernier message: 05/04/2011, 13h33
  3. Calcul Heure format "hh:mm"
    Par bnisaid dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 26/03/2007, 10h56
  4. heures supplementaire non payer
    Par john51basket dans le forum Paie
    Réponses: 18
    Dernier message: 15/02/2007, 19h23
  5. Calcul heure UCT par rapport à heure locale
    Par bobic dans le forum Oracle
    Réponses: 1
    Dernier message: 11/05/2006, 22h45

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