- /richiesta: modulo pubblico (nuovo territorio o riconsegna) con campo trappola, tempo minimo e limite orario; nome e note cifrati, avviso per email a chi ha richieste.gestisci (amministratore, assistente) - Home: riquadro Richieste con i proclamatori dal nome simile; porta su Assegna/Rientra già esistenti, che chiudono la richiesta; Scarta - Cartaceo sull'assegnazione (Assegna e Il mio gruppo), etichetta nell'elenco degli assegnati, pagina Cartacei, passa per l'XML - registro:invia-s13 agli amministratori l'ultima domenica del mese; richieste:pulizia dopo 90 giorni dalla gestione - Privacy, README e HANDOFF aggiornati; test in RichiesteTest Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
113 lines
3.1 KiB
PHP
113 lines
3.1 KiB
PHP
<?php
|
|
|
|
namespace App\Models;
|
|
|
|
use Illuminate\Database\Eloquent\Model;
|
|
use Spatie\Activitylog\LogOptions;
|
|
use Spatie\Activitylog\Traits\LogsActivity;
|
|
|
|
/**
|
|
* Una richiesta dal modulo pubblico (/richiesta): un proclamatore chiede un
|
|
* territorio nuovo o ne annuncia la riconsegna. Non tocca niente da sola:
|
|
* compare nella Home a chi ha `richieste.gestisci` (amministratore e
|
|
* assistenti), che la porta sul modulo di assegnazione o di rientro già
|
|
* esistenti; fatta l'operazione la richiesta risulta evasa. Si può anche
|
|
* scartare. Logica in App\Services\RichiesteServizio.
|
|
*
|
|
* Nome e note li scrive chi compila, senza account: cifrati come i dati dei
|
|
* proclamatori, e fuori dal registro delle attività (che logga solo lo stato).
|
|
*/
|
|
class Richiesta extends Model
|
|
{
|
|
use LogsActivity;
|
|
|
|
public const NUOVO = 'nuovo';
|
|
public const RICONSEGNA = 'riconsegna';
|
|
|
|
public const APERTA = 'aperta';
|
|
public const EVASA = 'evasa';
|
|
public const SCARTATA = 'scartata';
|
|
|
|
protected $table = 'richieste';
|
|
|
|
// Appena creata è aperta anche nell'oggetto, non solo nel database.
|
|
protected $attributes = ['stato' => self::APERTA];
|
|
|
|
// L'arrivo lo registra RichiesteServizio (con il numero del territorio):
|
|
// qui solo i cambi di stato, con chi li ha fatti.
|
|
protected static $recordEvents = ['updated'];
|
|
|
|
protected $fillable = ['tipo', 'nome', 'numero_territorio', 'note', 'stato', 'assegnazione_id', 'gestita_da', 'gestita_at'];
|
|
|
|
protected function casts(): array
|
|
{
|
|
return [
|
|
'nome' => 'encrypted',
|
|
'note' => 'encrypted',
|
|
'gestita_at' => 'datetime',
|
|
'assegnazione_id' => 'integer',
|
|
];
|
|
}
|
|
|
|
public function getActivitylogOptions(): LogOptions
|
|
{
|
|
return LogOptions::defaults()
|
|
->logOnly(['tipo', 'stato', 'assegnazione_id'])
|
|
->logOnlyDirty()
|
|
->dontSubmitEmptyLogs();
|
|
}
|
|
|
|
public function assegnazione()
|
|
{
|
|
return $this->belongsTo(Assegnazione::class);
|
|
}
|
|
|
|
public function gestitaDa()
|
|
{
|
|
return $this->belongsTo(User::class, 'gestita_da');
|
|
}
|
|
|
|
public function scopeAperte($query)
|
|
{
|
|
return $query->where('stato', self::APERTA);
|
|
}
|
|
|
|
public function isAperta(): bool
|
|
{
|
|
return $this->stato === self::APERTA;
|
|
}
|
|
|
|
public function getTipoEtichettaAttribute(): string
|
|
{
|
|
return $this->tipo === self::RICONSEGNA ? 'Riconsegna' : 'Nuovo territorio';
|
|
}
|
|
|
|
/** Chiusa da un'assegnazione o da un rientro fatti a partire da lei. */
|
|
public function evadi(?Assegnazione $assegnazione, ?User $chi): void
|
|
{
|
|
if (! $this->isAperta()) {
|
|
return;
|
|
}
|
|
|
|
$this->update([
|
|
'stato' => self::EVASA,
|
|
'assegnazione_id' => $assegnazione?->id,
|
|
'gestita_da' => $chi?->id,
|
|
'gestita_at' => now(),
|
|
]);
|
|
}
|
|
|
|
public function scarta(?User $chi): void
|
|
{
|
|
if (! $this->isAperta()) {
|
|
return;
|
|
}
|
|
|
|
$this->update([
|
|
'stato' => self::SCARTATA,
|
|
'gestita_da' => $chi?->id,
|
|
'gestita_at' => now(),
|
|
]);
|
|
}
|
|
}
|