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