Foros del Web » Programando para Internet » PHP »

Inconveniente al listar semanas

Estas en el tema de Inconveniente al listar semanas en el foro de PHP en Foros del Web. Estimados primero que todo un saludo a toda la comunidad, hace mucho tiempo que no visitaba el portal. Resulta que estoy en un proyecto y ...
  #1 (permalink)  
Antiguo 06/08/2014, 14:44
 
Fecha de Ingreso: agosto-2009
Mensajes: 45
Antigüedad: 14 años, 8 meses
Puntos: 2
Inconveniente al listar semanas

Estimados primero que todo un saludo a toda la comunidad, hace mucho tiempo que no visitaba el portal.

Resulta que estoy en un proyecto y me he cabeceado bastante sin llegar a la solución aun.
Necesito en un reporte generar el listado de horas trabajadas del personal y para aquello requiero listar todas las semanas (con sus respectivos dias) de forma horizontal y el personal de forma horizontal.

Suponiendo que tengo el siguiente mes,



El reporte de horas trabajadas que necesitaría generar sería algo así (que considere la primera semana incluidos los dias del mes anterior desde el lunes).



Agradeceré si alguno conoce alguna una función (no requiero que me ayuden en todo sino solo indicar de que manera pueda abordarlo)

Gracias y saludos

Última edición por Rro237; 06/08/2014 a las 14:55
  #2 (permalink)  
Antiguo 07/08/2014, 06:50
 
Fecha de Ingreso: agosto-2009
Mensajes: 45
Antigüedad: 14 años, 8 meses
Puntos: 2
Respuesta: Inconveniente al listar semanas

Ups al parecer es medio complejo el temita este.
Veré como hacerlo por cuenta mia.
  #3 (permalink)  
Antiguo 07/08/2014, 10:26
 
Fecha de Ingreso: agosto-2009
Mensajes: 45
Antigüedad: 14 años, 8 meses
Puntos: 2
Respuesta: Inconveniente al listar semanas

Ya he dado con la solución xD

Código PHP:
function calcula_semanas_mes($fecha_desde$fecha_hasta){
    
    
$dividefecha explode("-"$fecha_desde);
    
$fecha_desde mktime(000$dividefecha[0], $dividefecha[1], $dividefecha[2]);
    
    
$dividefecha explode("-"$fecha_hasta);          
    
$fecha_hasta mktime(000$dividefecha[0], $dividefecha[1], $dividefecha[2]);
     
    
$segundos $fecha_desde $fecha_hasta;
    
$segundos abs($segundos);
    
$semanas floor($segundos 604800);
    return 
$semanas;
}

function 
numero_semana($anho$mes$dia){

    
$ns strftime("%W"mktime(0,0,0,$mes,$dia,$anho));
    
$ns += 0;
    
$primer_dia_anho getdate(mktime(0,0,0,1,1,$anho));
    if (
$primer_dia_anho["wday"] != 1)
    
$ns += 1;
    return (
$ns);
}

function 
dias_mes($anio$mes){

   if(((
fmod($anio,4)==0) and (fmod($anio,100)!=0)) or (fmod($anio,400)==0)) $dias_febrero=29; else $dias_febrero=28;
   switch(
$mes){
       case 
01$dm=31; break;
       case 
02$dm=$dias_febrero; break;
       case 
03$dm=31; break;
       case 
04$dm=30; break;
       case 
05$dm=31; break;
       case 
06$dm=30; break;
       case 
07$dm=31; break;
       case 
08$dm=31; break;
       case 
8$dm=31; break;
       case 
09$dm=30; break;
       case 
9$dm=30; break;
       case 
10$dm=31; break;
       case 
11$dm=30; break;
       case 
12$dm=31; break;
   }
   return 
$dm;
}

$periodo=$_GET[periodo];
$mes=(int)substr($periodo,0,2);
$anho=(int)substr($periodo,2,4);

$dm=dias_mes($anio$mes);
$fecha_desde=$anho."-".$mes."-01";
$fecha_hasta=$anho."-".$mes."-".$dm;
$fecha_desde2=$mes."-01-".$anho;
$fecha_hasta2=$mes."-".$dm."-".$anho;
$semanas_mes=calcula_semanas_mes($fecha_desde2$fecha_hasta2);
$sem_ini=numero_semana($anho$mes1);
$sem_fin=$sem_ini+$semanas_mes;


$f=$fecha_desde;

for(
$i=$sem_ini$i<=$sem_fin$i++){
    
    if(
$i==$sem_ini){
        
$fecha=date("Y-m-d"strtotime($f));
    }else{
        
$f=date("Y-m-j"strtotime('+1 week',strtotime($f)));
        
$fecha=$f;
    }
    
    
$fecha explode("-",$fecha);
    
$queDiaRepresenta date('w'mktime(0,0,0,$fecha[1],$fecha[2],$fecha[0]));
    
$diaSeleccionar = array('Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday');
    
$diaRemplazar = array('Lun','Mar','Mie','Jue','Vie','Sab','Dom');
    
$mesSeleccionar = array('January','February','March','April','May','June','July','August','September','October','November','December');
    
$mesRemplazar = array('Ene','Feb','Mar','Abr','May','Jun','Jul','Ago','Sep','Oct','Nov','Dic');
    
    
$n 1;
    
$semana = array();
    while(
$n <= 5){ 
        
$dia = ($fecha[2]-$queDiaRepresenta+$n++);
        
$semana[] = date('l-Y-F-d'mktime(0,0,0,$fecha[1],$dia,$fecha[0]));
    }
    
    foreach(
$semana as $k => $v){
        
$fechaFinal explode("-",$v);
        
$fechaFinal[0] = str_ireplace($diaSeleccionar,$diaRemplazar,$fechaFinal[0]);
        
$fechaFinal[2] = str_ireplace($mesSeleccionar,$mesRemplazar,$fechaFinal[2]);
        
$fechaFinal[3] = (int)$fechaFinal[3];
        echo 
$fechaFinal[0].", ".$fechaFinal[3]." de ".$fechaFinal[2]."<br />";
    }

  #4 (permalink)  
Antiguo 07/08/2014, 13:15
Avatar de Perr0  
Fecha de Ingreso: mayo-2005
Ubicación: Santiago de Chile, Chile
Mensajes: 676
Antigüedad: 18 años, 10 meses
Puntos: 79
Respuesta: Inconveniente al listar semanas

Se ve entretenida la propuesta, ve si te sirve:



el código:
Código PHP:
<style>
*{font-family:Tahoma;font-size:10px;}
table{border-collapse:collapse;border:1px solid #ccc;margin-top:10px}
td, th{padding:4px;border:1px solid #ccc;}
.sem{background-color:blue;color:white;}
</style>
<?
$nSemana_ini 
29# semana inicial
$nSemana_fin 32# semana final
$year 2014# año en 4 digitos

$dias_semana = array("Do""Lu""Ma""Mi""Ju""Vi""Sa");
$inicio_semana $nSemana_ini 8;
$termino_semana $nSemana_fin 2;

$trabajadores = array("trabajador 1""trabajador 2""trabajador 3""trabajador 4");
$pr .= "Inicio: ".date("d-m-Y"mktime(0,0,0,1,$inicio_semana,$year));
$pr .= "<br>Término: ".date("d-m-Y"mktime(0,0,0,1,$termino_semana,$year));
$contador_dias 0;

$pr .= "<table><tr><td>&nbsp;</td>";
for(
$i=0;$i<=$termino_semana-$inicio_semana;$i++){
    
$f mktime(0,0,0,1,$inicio_semana $i+($contador_dias*7),$year);
    
$hd_dia_semana $dias_semana[date("w"$f)]."<br>".date("d"$f);
    
# condicion para Lunes a Viernes diferentes de Sábado y Domingo
    
$dia_laborar = ($i%7<5) ? "class=sem" "";
    
$pr .= "<th width=28 align=center nowrap ".$dia_laborar.">".$hd_dia_semana."</th>";
}
$pr .= "</tr>";

foreach(
$trabajadores as $trabajador){
    
$pr .= "<tr><td nowrap>".$trabajador."</td>";
    for(
$i=0;$i<=$termino_semana-$inicio_semana;$i++){
        
# Aquí debe ir el valor que extraigas, en el ejemplo es aleatorio
        # condicion para Lunes a Viernes diferentes de Sábado y Domingo
        
$valor = ($i%7<5) ? rand(1999) : "-";
        
$pr .= "<td align=center nowrap>".$valor."</td>";
    }
    
$pr .= "</tr>";
}
$pr .= "</table>";
echo 
$pr;
?>

salu2
__________________
Numerador Mp3 en Access =)
http://www.mediafire.com/download/r9...pdw/mp3(2).zip
  #5 (permalink)  
Antiguo 07/08/2014, 13:26
Avatar de Perr0  
Fecha de Ingreso: mayo-2005
Ubicación: Santiago de Chile, Chile
Mensajes: 676
Antigüedad: 18 años, 10 meses
Puntos: 79
Respuesta: Inconveniente al listar semanas

le corregí algunos detalles, tiene como 2 líneas menos

Código PHP:
<style>
*{font-family:Tahoma;font-size:10px;}
table{border-collapse:collapse;border:1px solid #ccc;margin-top:10px}
td, th{padding:4px;border:1px solid #ccc;}
.sem{background-color:blue;color:white;}
</style>
<?
$nSemana_ini 
29# semana inicial
$nSemana_fin 32# semana final
$year 2014# año en 4 digitos

$dias_semana = array("Do""Lu""Ma""Mi""Ju""Vi""Sa");
$inicio_semana $nSemana_ini 8;
$termino_semana $nSemana_fin 2;

$trabajadores = array("trabajador 1""trabajador 2""trabajador 3""trabajador 4");
$pr .= "Inicio: ".date("d-m-Y"mktime(0,0,0,1,$inicio_semana,$year));
$pr .= "<br>Término: ".date("d-m-Y"mktime(0,0,0,1,$termino_semana,$year));

$pr .= "<table><tr><td>&nbsp;</td>";
for(
$i=0;$i<=$termino_semana-$inicio_semana;$i++){
    
$f mktime(0,0,0,1,$inicio_semana $i,$year);
    
$hd_dia_semana $dias_semana[date("w"$f)]."<br>".date("d"$f);
    
# condicion para Lunes a Viernes diferentes de Sábado y Domingo
    
$dia_laboral = ($i%7<5) ? "class=sem" "";
    
$pr .= "<th width=28 align=center nowrap ".$dia_laboral.">".$hd_dia_semana."</th>";
}
$pr .= "</tr>";

foreach(
$trabajadores as $trabajador){
    
$pr .= "<tr><td nowrap>".$trabajador."</td>";
    for(
$i=0;$i<=$termino_semana-$inicio_semana;$i++){
        
# Aquí debe ir el valor que extraigas, en el ejemplo es aleatorio
        # condicion para Lunes a Viernes diferentes de Sábado y Domingo
        
$valor = ($i%7<5) ? rand(1999) : "-";
        
$pr .= "<td align=center nowrap>".$valor."</td>";
    }
    
$pr .= "</tr>";
}
$pr .= "</table>";
echo 
$pr;
?>
__________________
Numerador Mp3 en Access =)
http://www.mediafire.com/download/r9...pdw/mp3(2).zip

Etiquetas: inconveniente, semanas
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 17:56.