Foros del Web » Programando para Internet » PHP »

Cálculo de Horas Extras

Estas en el tema de Cálculo de Horas Extras en el foro de PHP en Foros del Web. Saludos Foro: Tengo una aplicación a la que se le carga el reporte de entradas y salidas de empleados. El campo donde guarda el dato ...
  #1 (permalink)  
Antiguo 28/04/2014, 11:16
 
Fecha de Ingreso: diciembre-2010
Ubicación: Asunción
Mensajes: 41
Antigüedad: 13 años, 11 meses
Puntos: 1
Cálculo de Horas Extras

Saludos Foro:

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 == || !$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($diff2);
                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'>&nbsp;</td>";
            echo 
"</tr>";
        } 
//Cierra el While del Grupo 
La verdad es que no funciona bien. Mi función es está

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

Si alguien me puede iluminar al respecto...

Saludos,
David
  #2 (permalink)  
Antiguo 28/04/2014, 14:09
 
Fecha de Ingreso: diciembre-2010
Ubicación: Asunción
Mensajes: 41
Antigüedad: 13 años, 11 meses
Puntos: 1
Respuesta: Cálculo de Horas Extras

Alguna razón especial para decir que no funciona con tablas? Al final de cuenta las tablas son la manera que uso para mostrar el dato.

Etiquetas: fecha, horas, mysql, registro, select, sql
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:08.