Tengo una aplicación a la que se le carga el reporte de entradas y salidas de empleados. El campo donde guarda el dato de la hora de entrada y salida es un MySQL DateTime (AAAA-MM-DD HH:mm:ss) yo sin problemas hago un SELECT y traigo en una columna la FECHA y en otra la HORA. Pero necesito que a las horas de salida si es mayor a una determinada hora (18:15) este calcule las horas extras que se trabajaron y que al final del rango de fechas las sume todas. Hasta yo emito el reporte bien y la lógica que está dentro de un WHILE sigue así:
Código PHP:
while($row = mysql_fetch_assoc($que)) {
//Seteamos a cero las horas y min extras
$hora_extra = 0;
$minu_extra = 0;
for ($i=0;$i<$num_fecha;$i++) {
$sql_marca = "SELECT id_personal, TIME(horario) AS hora, DATE(horario) AS fecha FROM registro_horario
WHERE id_personal = ".$row['id']." AND DATE(horario) = '".$fullfecha[$i]."'";
//echo $sql_marca."<br />";
$que_marca = mysql_query($sql_marca);
$num_marca = mysql_num_rows($que_marca);
//echo $num_marca."<br />";
if ($num_marca > 0) {
while($row_marca = mysql_fetch_assoc($que_marca)) {
//Separamos las horas y minutos, segundos despreciables
$extra = explode(":", $row_marca['hora']);
$hora = $extra[0];
$minu = $extra[1];
$semana_day = diaSemana($row_marca['fecha']);
echo "<tr style='font-size:12px;'>";
echo "<td>".getNombre($row['id'])."</td>";
echo "<td><b>".$semana_day."</b> / ".date("d/m", strtotime($fullfecha[$i]))."</td>";
$check = checkFestDay($fullfecha[$i]);
if ($check[0] == 1) {
if ($check[1] == 0) { $color = "bgcolor='green'"; }
elseif($check[1] == 1) { $color = "bgcolor='orange'"; }
echo "<td ".$color.">".$hora.":".$minu."</td>";
echo "</tr>";
} else {
if (($row_marca['hora'] > '07:06' && $row_marca['hora'] < '18:00')
&& ($row_marca['hora'] > '07:06' && $row_marca['hora'] < '12:00'
&& $semana_day <> "Sab")) {
echo "<td bgcolor='red'>".$hora.":".$minu."</td>";
} else {
echo "<td>".$hora.":".$minu."</td>";
}
}
if ($hora >= 18 && $minu > 15 && $semana_day <> "Sab") {
$horaini = "18:15:00";
//Calulo de horas extras
//echo $hora.":".$minu."<br />";
if ($hora == 18 && $minu > 15) {
//Cuando son solo los minutos
$minuex = difHora($horaini,$row_marca['hora']);
} elseif ($hora >= 19) {
$horaex = difHora($horaini,$row_marca['hora']); //Se le restan las 18 horas
}
} elseif($hora >= 12 && $minu > 15 && $semana_day == "Sab") {
$horaini = "12:15:00";
if ($hora == 12 && $minu > 15) {
//Cuando son solo los minutos
$minuex = difHora($horaini,$row_marca['hora']);
} elseif($hora > 12) {
$horaex = difHora($horaini,$row_marca['hora']);
}
}
$minu_extra = $minu_extra + $minuex;
$hora_extra = $hora_extra + $horaex;
}
echo "</tr>";
//}
//} //Cierra While de la Marca
} elseif ($num_marca == 0 || !$num_marca) {
$semana_day = diaSemana($fullfecha[$i]);
//Primero vemos si es domingo
if ($semana_day == "Dom") {
echo "<tr style='font-size:12px;'>";
echo "<td>".getNombre($row['id'])."</td>";
echo "<td><b>".$semana_day."</b> / ".date("d/m", strtotime($fullfecha[$i]))."</td>";
echo "<td bgcolor='black'></td>";
echo "</tr>";
} else {
//Si no es Domingo vemos si es Feriado
$check = checkFestDay($fullfecha[$i]);
if ($check[0] == 1) {
echo "<tr style='font-size:12px;'>";
echo "<td>".getNombre($row['id'])."</td>";
echo "<td><b>".$semana_day."</b> / ".date("d/m", strtotime($fullfecha[$i]))."</td>";
echo "<td bgcolor='green'>FERIADO</td>";
echo "</tr>";
} else {
echo "<tr style='font-size:12px;'>";
echo "<td>".getNombre($row['id'])."</td>";
echo "<td><b>".$semana_day."</b> / ".date("d/m", strtotime($fullfecha[$i]))."</td>";
echo "<td bgcolor='red'>AUSENTE</td>";
echo "</tr>";
}
}
} //Cierra el ELSEIF
} //Cierra el For
echo "<tr>";
echo "<td colspan='2' align='right'><b>Horas Extras:</b></td>";
if ($minu_extra >= 60) {
$diff = $minu_extra/60;
$diff = round($diff, 2);
if (strstr($diff, ',')){
$sep = explode(',', $diff);
$hora_extra = $hora_extra + $sep[0];
$minu_extra = round($sep[1],0);
} else {
$hora_extra = $hora_extra + $sep[0];
}
}
echo "<td>".$hora_extra.":".$minu_extra."</td>";
echo "</tr>";
echo "<tr>";
echo "<td colspan='3'> </td>";
echo "</tr>";
} //Cierra el While del Grupo
Código PHP:
/*----------------------------------------------------*/
//Funcion para sacar diferencia de horas
/*----------------------------------------------------*/
function difHora($horaini,$horafin) {
$horai=substr($horaini,0,2);
$mini=substr($horaini,3,2);
$segi=substr($horaini,6,2);
$horaf=substr($horafin,0,2);
$minf=substr($horafin,3,2);
$segf=substr($horafin,6,2);
$ini=((($horai*60)*60)+($mini*60)+$segi);
$fin=((($horaf*60)*60)+($minf*60)+$segf);
$dif=$fin-$ini;
$difh=floor($dif/3600);
$difm=floor(($dif-($difh*3600))/60);
$difs=$dif-($difm*60)-($difh*3600);
return date("H-i-s",mktime($difh,$difm,$difs));
}
Saludos,
David