[ Foro de Pseudocódigo ]

Reporte de tiempos

31-Jan-2019 19:58
Armando Ballesteros
2 Respuestas

Hola.

Espero me ayuden a aterrizar el pseudo código de lo siguiente:
1. Tengo una lista con 4 etiquetas
2. Con cada proyecto voy generando una lista de pares con etiqueta y fecha larga (en milisegundos) que puede incluir medio día, un día o varios días.
3. Durante un proyecto siempre se está en alguna etiqueta. Es decir, se asume que una etiqueta dura hasta que se introduce la siguiente. De forma que si se introduce la etiqueta 1 y no se cambia en 3 días, la duración de esa etiqueta será de 3 días.

Ahora. Quiero hacer un reporte del proyecto. Separado por días con un resumen diario.
Algo cómo

http://tarea.sistemasov.com/ejemplo_de_reporte.jpg

Y termino llenando muchas variables y líneas y líneas de código y no me queda.
Espero que alguien ya haya hecho algo así y tenga clara la lógica.

Gracias


02-Feb-2019 18:04
Armando Ballesteros

Por si alguien más lo necesita ya lo resolví. Igual y dí muchas vueltas pero funciona.
Aunque va a ser para un móvil, una apk, lo estructuré para probar en php que se me facilita más.
Ahora sólo tengo que traducirlo para el teléfono.
En fin. Quedó así.

[code]
// Variables
$Salida = '';
$Dia_Anterior = '';
$Fecha_Anterior = '';
$Fecha = '';
$Inicio_Dia = '';
$Cierre_Dia = '';
$Gpo_1 = 0;
$Gpo_2 = 0;
$Gpo_3 = 0;
$Gpo_4 = 0;
$Gpo_Anterior = '';

// Base de datos
$conn = new mysqli($sn, $un, $pw, $db);
if ($conn->connect_error) {
   die("Connection failed: " . $conn->connect_error);
}

$sql = "SELECT etiqueta, fecha_larga, grupo … ORDER BY fecha_larga ASC";

$result = $conn->query($sql);
$rows=mysqli_fetch_assoc($result);

// Funciones
function dtDif($Minuendo, $Subtracting) {
$minutes = 0;
$M = date_create(date("Y-m-d H:i:s", strtotime($Minuendo)));
$S = date_create(date("Y-m-d H:i:s", strtotime($Subtracting)));
$Diference = $M->diff($S);
$minutes = $Diference->days * 24 * 60;
$minutes += $Diference->h * 60;
$minutes += $Diference->i;
   return $minutes;
}
function hm($Minutos) {
$hours = intval($Minutos/60);
$minutes = $Minutos%60;
if(strlen($minutes)<2){
$minutes = '0'.$minutes;
}

   return $hours.':'.$minutes;
}

// Inicia proceso
$Salida .= $row['Datos_Encabezado'];
$Salida .= date("Y-m-d", strtotime($rows['fecha_larga'])).'<br/>';
// Bucle
do{
$Fecha = $rows['fecha_larga'];
if($Dia_Anterior != date("Y-m-d", strtotime($Fecha))) {
if($Dia_Anterior != '') {
// Cerrando el día anterior
switch($Gpo_Anterior){
case 4: $Gpo_4 += dtDif($Cierre_Dia, $Fecha_Anterior); break;
case 3: $Gpo_3 += dtDif($Cierre_Dia, $Fecha_Anterior); break;
case 2: $Gpo_2 += dtDif($Cierre_Dia, $Fecha_Anterior); break;
default: $Gpo_1 += dtDif($Cierre_Dia, $Fecha_Anterior);
}
$Salida .= 'Resumen'.'<br/>';
$Salida .= 'Grupo 1 ' . hm($Gpo_1).'<br/>';
$Salida .= 'Grupo 2 ' . hm($Gpo_2).'<br/>';
$Salida .= 'Grupo 3 ' . hm($Gpo_3).'<br/>';
$Salida .= 'Grupo 4 ' . hm($Gpo_4).'<br/><br/>';
$Gpo_1 = 0;
$Gpo_2 = 0;
$Gpo_3 = 0;
$Gpo_4 = 0;
// Iniciando el nuevo día
$Salida .= $row['Datos_Encabezado'];
$Salida .= date("Y-m-d", strtotime($Fecha)).'<br/>';
$Inicio_Dia = substr_replace($Fecha, '00:00:00', 11);
$Salida .= $Gpo_Anterior .' - ' . date("H:i", strtotime($Inicio_Dia)); // 3 Acción queda del día anterior
switch($Gpo_Anterior){
case 4: $Gpo_4 += dtDif($Fecha, $Inicio_Dia); break;
case 3: $Gpo_3 += dtDif($Fecha, $Inicio_Dia); break;
case 2: $Gpo_2 += dtDif($Fecha, $Inicio_Dia); break;
default: $Gpo_1 += dtDif($Fecha, $Inicio_Dia);
}
$Salida .= $rows['grupo'] .' - ' . date("H:i", strtotime($Fecha)); // 1 Primera acción días siguientes
}else{
$Salida .= $rows['grupo'] .' - ' . date("H:i", strtotime($Fecha)); // 0 Primera acción primer día
}
$Dia_Anterior = date("Y-m-d", strtotime($Fecha));
$Cierre_Dia = substr_replace($Fecha, '23:59:59', 11);
}else{
$Salida .= $rows['grupo'] .' - ' . date("H:i", strtotime($Fecha)); // 2 Siguientes acciones del día
switch($Gpo_Anterior){
case 4: $Gpo_4 += dtDif($Fecha, $Fecha_Anterior); break;
case 3: $Gpo_3 += dtDif($Fecha, $Fecha_Anterior); break;
case 2: $Gpo_2 += dtDif($Fecha, $Fecha_Anterior); break;
default: $Gpo_1 += dtDif($Fecha, $Fecha_Anterior);
}
}
$Fecha_Anterior = $Fecha;
$Gpo_Anterior = $rows['grupo'];
} while ($rows = mysqli_fetch_assoc($result));
$Salida .= 'Resumen'.' fin<br/>';
$Salida .= 'Grupo 1 ' . hm($Gpo_1).'<br/>';
$Salida .= 'Grupo 2 ' . hm($Gpo_2).'<br/>';
$Salida .= 'Grupo 3 ' . hm($Gpo_3).'<br/>';
$Salida .= 'Grupo 4 ' . hm($Gpo_4).'<br/><br/>';
$Gpo_1 = 0;
$Gpo_2 = 0;
$Gpo_3 = 0;
$Gpo_4 = 0;
echo '<br/><br/>-- Resultados --<br/>'.$Salida;

// Limpia y cierra
mysqli_free_result($result);
mysqli_close($conn);
[/code]


05-Feb-2019 10:51
Nacho Cabanes (+74)

Por una parte, eso no es pseudocódigo, sino PHP ;-)

Por otra parte, efectivamente se puede hacer un poco más compacto, usando un array en vez de 4 variables.






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)