59 lines
2.0 KiB
PHP
59 lines
2.0 KiB
PHP
<?php
|
|
|
|
namespace App\Models;
|
|
|
|
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
|
use Illuminate\Database\Eloquent\Model;
|
|
|
|
class Dia extends Model
|
|
{
|
|
use HasFactory;
|
|
|
|
/**
|
|
* The attributes that are mass assignable.
|
|
*
|
|
* @var array
|
|
*/
|
|
protected $fillable = ['nombre'];
|
|
|
|
public function evento() {
|
|
return $this->belongsTo(Evento::class);
|
|
}
|
|
|
|
public function horaFlags() {
|
|
return $this->hasMany(HoraFlag::class);
|
|
}
|
|
|
|
// ordena las horaFlags asociadas a día por minutoDelDía, de menor a mayor;
|
|
// las recorre sumando las flags asociadas a cada una y guardándo el número en cant_actual;
|
|
// cuando cant_actual supera a la cantidad guardada en best, se hace un nuevo best:
|
|
// se pone best["cantidad"] = cant_actual, en best["inicio"] el minutoDelDia de la hora actual
|
|
// y en best["fin"] el minutoDelDía de la hora siguiente (esta hora existe porque si cant_actual
|
|
// crece es porque llega a alguien, y por lo tanto hay una hora posterior en la que se va).
|
|
// finalmente se devuelve best, con la duración del horario devuelto.
|
|
public function marzullo() {
|
|
// INICIO
|
|
$cant_actual = 0;
|
|
$best = ["cantidad" => 0, "inicio" => 0, "fin" => 0];
|
|
// Ordenar horaFlags por minutoDelDia
|
|
$horas = $this->horaFlags()->orderBy('minutoDelDia')->get();
|
|
// var_dump($horas);
|
|
|
|
// ALGORITMO
|
|
foreach ($horas as $i => $hora) {
|
|
$cant_actual += $hora->flag;
|
|
if ($cant_actual > $best["cantidad"] &&
|
|
($horas[$i+1]->flag > 0 || $horas[$i+1]->minutoDelDia - $hora->minutoDelDia > 15)) {
|
|
$best["cantidad"] = $cant_actual;
|
|
$best["inicio"] = $hora->minutoDelDia;
|
|
$best["fin"] = $horas[$i+1]->minutoDelDia;
|
|
}
|
|
}
|
|
|
|
// RETURN
|
|
$duracion = $best["fin"] - $best["inicio"];
|
|
return [$best["cantidad"], $best["inicio"], $best["fin"], $duracion];
|
|
}
|
|
|
|
}
|