planifibot/app/Models/Dia.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];
}
}