Programación Funcional - Lógica (Pseudo código) de tiempos de actividad

 
Vista:
Imágen de perfil de Munsen
Val: 3
Ha mantenido su posición en Programación Funcional (en relación al último mes)
Gráfica de Programación Funcional

Lógica (Pseudo código) de tiempos de actividad

Publicado por Munsen (2 intervenciones) el 31/01/2019 19:31:38
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

ejemplo-de-reporte

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
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Munsen
Val: 3
Ha mantenido su posición en Programación Funcional (en relación al último mes)
Gráfica de Programación Funcional

Lógica (Pseudo código) de tiempos de actividad

Publicado por Munsen (2 intervenciones) el 02/02/2019 18:03:24
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í.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
// 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);
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar