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();