query($sql_delete); $sql = "SELECT * FROM check_parameters"; $result_parameters = mysqli_query($con, $sql); while ($parameters = mysqli_fetch_assoc($result_parameters)) { if ($parameters["name"] == "consecutive_work_days") { $consecutive_work_days = number_format($parameters["value"]); $consecutive_work_days_desc = $parameters["description"]; } else if ($parameters["name"] == "last_consecutive_day_max_time") { $last_consecutive_day_max_time = date("H:i:s", strtotime($parameters["value"])); $last_consecutive_day_max_time_desc = $parameters["description"]; } else if ($parameters["name"] == "max_day_work_time") { $max_day_work_time = number_format($parameters["value"]); $max_day_work_time_desc = $parameters["description"]; } else if ($parameters["name"] == "max_time_before_break") { $max_time_before_break = number_format($parameters["value"]); $max_time_before_break_desc = $parameters["description"]; } else if ($parameters["name"] == "min_break_time") { $min_break_time = number_format($parameters["value"]); $min_break_time_desc = $parameters["description"]; } else if ($parameters["name"] == "min_time_between_work_days") { $min_time_between_work_days = number_format($parameters["value"]); $min_time_between_work_days_desc = $parameters["description"]; } } $check_end_date = date("Y-m-d"); $check_start_date = date("Y-m-d", strtotime("-2 months")); echo "INIZIO: " . $check_start_date . "
"; echo "FINE: " . $check_end_date . "
"; $day_minutes = 480; $entry_time = ""; $exit_time = ""; $startDate = new \DateTime($check_start_date); $endDate = new \DateTime($check_end_date); $interval = \DateInterval::createFromDateString('1 day'); $period = new \DatePeriod($startDate, $interval, $endDate); //Ciclo gli utenti attivi $sql = "SELECT * FROM users WHERE role = 'Utente' AND enable = 1 AND attendance = 1 AND id = 29"; $result_users = mysqli_query($con, $sql); while ($users = mysqli_fetch_assoc($result_users)) { //Dichiaro/pulisco le variabili $consecutive_days = 0; $user_id = $users["id"]; //Ciclo i giorni del periodo foreach ($period as $dates) { //Dichiaro/pulisco le variabili $date = $dates->format('Y-m-d'); echo "
" . $date . "
"; $worked_minutes = 0; $index = 0; $entry_count = 0; $last_stamp_type = ""; //Determino il tipo di giorno $dt1 = strtotime($date); $dt2 = date("l", $dt1); $dt3 = strtolower($dt2); if ($dt3 == "saturday") { $day_type = "Festivo"; } else if ($dt3 == "sunday") { $day_type = "Festivo"; } else { $day_type = "Lavorativo"; } //Ciclo le timbrature dell'utente nel giorno $sql = "SELECT * FROM stamps WHERE date = '$date' AND user_id = " . $user_id . " ORDER BY time ASC"; $result_stamps = mysqli_query($con, $sql); if ($result_stamps->num_rows > 0) { $consecutive_days++; while ($stamp_row = mysqli_fetch_assoc($result_stamps)) { //Imposto le variabili $stamp_id = $stamp_row["id"]; $stamp_type = $stamp_row["type"]; $stamp_time = $stamp_row["time"]; $stamp_date = $stamp_row["date"]; $last_stamp_type = $stamp_type; //Modifico l'orario con la gestione a 15 minuti if ($stamp_type == "Entrata") { $entry_time = FormatEntryTimeBy15Minutes($stamp_time); $entry_count++; } else { $exit_time = FormatExitTimeBy15Minutes($stamp_time); } if (($index == 0) && ($stamp_type == "Uscita")) { //Se la prima timbratura del giorno è un'uscita $minutes = CalcMinutesBetweenTimes("00:00:00", $exit_time); $worked_minutes += $minutes; //Controllo il tempo massimo ti un turno lavorativo $yesterday = date('Y-m-d', strtotime($stamp_date . ' - 1 days')); $minutes = CalcMinutesBetweenTimes($yesterday . " " . $entry_time, $stamp_date . " " . $exit_time); if ($minutes > $max_time_before_break) { echo "Durata turno di lavoro: " . timeFromMinutes($minutes) . " - Massimo: " . timeFromMinutes($max_time_before_break) . "
"; $description = "Lavoro nel turno: " . timeFromMinutes($minutes) . " ore"; $suggestion = "" . $max_time_before_break_desc . ": " . timeFromMinutes($max_time_before_break) . ""; InsertProblem($user_id, "Timbratura", $stamp_id, $description, $suggestion, $date, 'day'); } } else if ($stamp_type == "Entrata") { //Se la timbratura è entrata //Se è la prima entrata della giornata if ($entry_count == 1) { //Controllo il tempo minimo tra un turno e un altro $yesterday = date('Y-m-d', strtotime($stamp_date . ' - 1 days')); $minutes = CalcMinutesBetweenTimes($stamp_date . " " . $stamp_time, $yesterday . " " . $exit_time); if ($minutes < $min_time_between_work_days) { echo "Tempo di riposo: " . timeFromMinutes($minutes) . " - Tempo minimo: " . timeFromMinutes($min_time_between_work_days) . "
"; $description = "Il tempo di riposo dal turno precedente è " . timeFromMinutes($minutes) . " ore"; $suggestion = "" . $min_time_between_work_days_desc . ": " . timeFromMinutes($min_time_between_work_days) . " ore"; InsertProblem($user_id, "Timbratura", $stamp_id, $description, $suggestion, $date, 'day'); } } else { //Controllo il tempo minimo di pausa $minutes = CalcMinutesBetweenTimes($stamp_time, $exit_time); if ($minutes < $min_break_time) { echo "Tempo di pausa: " . timeFromMinutes($minutes) . " - Tempo minimo: " . timeFromMinutes($min_break_time) . "
"; $description = "Pausa tra i turni: " . timeFromMinutes($minutes) . " ore"; $suggestion = "" . $min_break_time_desc . ": " . timeFromMinutes($min_break_time) . " ore"; InsertProblem($user_id, "Timbratura", $stamp_id, $description, $suggestion, $date, 'day'); } } } else if ($stamp_type == "Uscita") { //Se la timbratura è uscita $minutes = CalcMinutesBetweenTimes($entry_time, $exit_time); $worked_minutes += $minutes; //Controllo il tempo massimo ti un turno lavorativo if ($minutes > $max_time_before_break) { echo "Durata turno di lavoro: " . timeFromMinutes($minutes) . " - Massimo: " . timeFromMinutes($max_time_before_break) . "
"; $description = "Lavoro nel turno: " . timeFromMinutes($minutes) . " ore"; $suggestion = "" . $max_time_before_break_desc . ": " . timeFromMinutes($max_time_before_break) . ""; InsertProblem($user_id, "Timbratura", $stamp_id, $description, $suggestion, $date, 'day'); } } $index++; } } else { $consecutive_days = 0; } //Se l'ultima timbratura della giornata è entrata if ($last_stamp_type == "Entrata") { $minutes = CalcMinutesBetweenTimes($entry_time, "24:00:00"); $worked_minutes += $minutes; //Se è la prima entrata della giornata if ($entry_count == 1) { //Controllo il tempo minimo tra un turno e un altro $yesterday = date('Y-m-d', strtotime($stamp_date . ' - 1 days')); $minutes = CalcMinutesBetweenTimes($stamp_date . " " . $stamp_time, $yesterday . " " . $exit_time); if ($minutes < $min_time_between_work_days) { echo "Tempo di riposo: " . timeFromMinutes($minutes) . " - Tempo minimo: " . timeFromMinutes($min_time_between_work_days) . "
"; $description = "Il tempo di riposo dal turno precedente è " . timeFromMinutes($minutes) . " ore"; $suggestion = "" . $min_time_between_work_days_desc . ": " . timeFromMinutes($min_time_between_work_days) . " ore"; InsertProblem($user_id, "Timbratura", $stamp_id, $description, $suggestion, $date, 'day'); } } else { //Controllo il tempo minimo di pausa $minutes = CalcMinutesBetweenTimes($stamp_time, $exit_time); if ($minutes < $min_break_time) { echo "Tempo di pausa: " . timeFromMinutes($minutes) . " - Tempo minimo: " . timeFromMinutes($min_break_time) . "
"; $description = "Pausa tra i turni: " . timeFromMinutes($minutes) . " ore"; $suggestion = "" . $min_break_time_desc . ": " . timeFromMinutes($min_break_time) . " ore"; InsertProblem($user_id, "Timbratura", $stamp_id, $description, $suggestion, $date, 'day'); } } } //Controllo il massimo di ore di lavoro in una giornata if ($worked_minutes > $max_day_work_time) { echo "Ore lavorate " . timeFromMinutes($worked_minutes) . " - Massimo " . timeFromMinutes($max_day_work_time) . "
"; $description = "Totale ore lavorate nel giorno: " . timeFromMinutes($worked_minutes) . ""; $suggestion = "" . $max_day_work_time_desc . ": " . timeFromMinutes($max_day_work_time) . " ore"; InsertProblem($user_id, "Timbratura", 0, $description, $suggestion, $date, 'day'); } //Controllo se sono stati fatti 12 giorni lavorativi consecutivi e la timbratura d'uscita del 12° giorno è dopo le 13:00 oppure se sono stati fatti più di 12 giorni di lavoro consecutivi if ($consecutive_days == $consecutive_work_days && $stamp_time > $last_consecutive_day_max_time) { echo "Giorni di lavoro consecutivi: $consecutive_days giorni - Ora fine turno: " . timeFromMinutes($stamp_time) . "
"; $description = "Giorni di lavoro consecutivi: $consecutive_days giorni - Ora fine turno: " . timeFromMinutes($stamp_time) . ""; $suggestion = "" . $consecutive_work_days_desc . ": " . $consecutive_work_days . " giorni - " . $last_consecutive_day_max_time_desc . ": " . timeFromMinutes($last_consecutive_day_max_time) . " ore"; InsertProblem($user_id, "Timbratura", 0, $description, $suggestion, $date, 'week'); } else if ($consecutive_days > $consecutive_work_days) { echo "Giorni di lavoro consecutivi: $consecutive_days giorni
"; $description = "Giorni di lavoro consecutivi: $consecutive_days giorni"; $suggestion = "" . $consecutive_work_days_desc . ": " . $consecutive_work_days . " giorni"; InsertProblem($user_id, "Timbratura", 0, $description, $suggestion, $date, 'week'); } //Controlli sui permessi $permissions_day_minutes = 0; $sql = "SELECT * FROM permissions WHERE user_id = $user_id AND '$date' BETWEEN start_date AND end_date AND status_id = 2"; $result_permissions = mysqli_query($con, $sql); if (($result_permissions->num_rows > 0) && ($day_type == "Festivo")) { //Controllo permessi in giorni festivi echo "Non ci possono essere permessi in un giorno festivo"; $description = "Non ci possono essere permessi in un giorno festivo"; $suggestion = "Rimuovere i permessi dalla giornata"; InsertProblem($user_id, "Permesso", 0, $description, $suggestion, $date, 'day'); } else { while ($permissions = mysqli_fetch_assoc($result_permissions)) { if ($permissions["full_day"] == true) { //Se è giornata intera aggiungo 8 ore $permissions_day_minutes += $day_minutes; } else { if ($permissions["start_date"] == $date && $permissions["end_date"] != $date) { //Se la data inizio permesso è uguale alla data del ciclo e la fine è dopo faccio la differenza tra ora inizio e 23:59:59 $timeObject1 = date_create('24:00:00'); $timeObject2 = date_create($permissions["start_time"]); $interval = date_diff($timeObject1, $timeObject2); $permission_time = $interval->days * 24 * 60; $permission_time += $interval->h * 60; $permission_time += $interval->i; $remaining_minutes = $day_minutes - $worked_minutes; if ($remaining_minutes > 0) { if ($remaining_minutes > $permission_time) { $permissions_day_minutes += $permission_time; } else { $permissions_day_minutes += $remaining_minutes; } } else { $permissions_day_minutes += $permission_time; } } else if ($permissions["end_date"] == $date && $permissions["start_date"] != $date) { //Se la data fine permesso è uguale alla data del ciclo e l'inizio è prima faccio la differenza tra ora fine e 00:00:00 $timeObject1 = date_create($permissions["end_time"]); $timeObject2 = date_create('00:00:00'); $interval = date_diff($timeObject1, $timeObject2); $permission_time = $interval->days * 24 * 60; $permission_time += $interval->h * 60; $permission_time += $interval->i; $remaining_minutes = $day_minutes - $worked_minutes; if ($remaining_minutes > 0) { if ($remaining_minutes > $permission_time) { $permissions_day_minutes += $permission_time; } else { $permissions_day_minutes += $remaining_minutes; } } else { $permissions_day_minutes += $permission_time; } } else if ($permissions["end_date"] == $date && $permissions["start_date"] == $date) { //Se la data inizio e fine permesso sono la data del ciclo faccio la differenza tra inizio e fine permesso $timeObject1 = date_create($permissions["end_time"]); $timeObject2 = date_create($permissions["start_time"]); $interval = date_diff($timeObject1, $timeObject2); $permission_time = $interval->days * 24 * 60; $permission_time += $interval->h * 60; $permission_time += $interval->i; $permissions_day_minutes += $permission_time; } else { //Se la data del ciclo è compresa tra la data inizio e fine permesso $permissions_day_minutes += $day_minutes; } } } } if ($day_type == "Lavorativo") { //Controllo se le ore lavorate + le ore di permesso sono minori di 8 $total_day_minutes = $worked_minutes + $permissions_day_minutes; if ($total_day_minutes < $day_minutes) { if ($total_day_minutes == 0) { echo "Ore totali timbrature e permessi: 00:00 - Ore minime: 08:00"; $description = "Ore totali timbrature e permessi: 00:00"; } else { echo "Ore totali timbrature e permessi: " . timeFromMinutes($total_day_minutes) . " - Ore minime: 08:00"; $description = "Ore totali timbrature e permessi: " . timeFromMinutes($total_day_minutes) . ""; } $suggestion = "In un giorno lavorativo di devono essere almeno 8:00 ore tra timbrature e permessi"; InsertProblem($user_id, "Tutto", 0, $description, $suggestion, $date, 'day'); } if (($permissions_day_minutes > 0) && ($worked_minutes >= $day_minutes)) { echo "Non si possono richiedere permessi se si sono lavorate almeno 08:00 ore"; $description = "Non si possono richiedere permessi se si sono lavorate almeno 08:00 ore"; $suggestion = "Diminuire l'orario di lavoro o rimuovere i permessi dalla giornata"; InsertProblem($user_id, "Tutto", 0, $description, $suggestion, $date, 'day'); } } } } echo "ok"; $con->close();