'date', 'end_date' => 'date', ]; } public function getActivitylogOptions(): LogOptions { return LogOptions::defaults() ->logOnly(['start_date', 'end_date', 'descrizione']) ->logOnlyDirty() ->dontSubmitEmptyLogs(); } /** * Is this campaign currently active? */ public function getIsAttivaAttribute(): bool { $today = now()->toDateString(); return $this->start_date->toDateString() <= $today && $this->end_date->toDateString() >= $today; } /** * Find the currently active campaign (if any). */ public static function attiva(): ?static { return static::where('start_date', '<=', now()) ->where('end_date', '>=', now()) ->first(); } /** * Assignments counted for this campaign. */ public function assegnazioniConteggiate() { return $this->hasMany(Assegnazione::class, 'campaign_id') ->where('counted_in_campaign', true); } /** * All assignments with assigned_at in this campaign's range. */ public function assegnazioniNelRange() { return Assegnazione::where('assigned_at', '>=', $this->start_date) ->where('assigned_at', '<=', $this->end_date); } /** * Campaign coverage percentage. * Numerator: assignments counted for campaign * Denominator: total active territories */ public function getPercentualePercorrenzaAttribute(): float { $totaleAttivi = Territorio::where('attivo', true)->count(); if ($totaleAttivi === 0) { return 0.0; } $conteggiate = $this->assegnazioniConteggiate()->count(); return round(($conteggiate / $totaleAttivi) * 100, 1); } public function scopeCompletate($query) { return $query->where('end_date', '<', now())->orderByDesc('end_date'); } }