++ gruppi di servizio: sorvegliante con utenza limitata, pacchetto di territori, assegnazione ai membri
Il gruppo ha un sorvegliante (proclamatore con utenza: email e password temporanea, senza conferma dell'email) e dei membri; l'amministratore mette in blocco dei territori nel pacchetto del gruppo. Il pacchetto non e' un'assegnazione e non tocca le statistiche; quando il sorvegliante da' un territorio a un membro nasce un'assegnazione normale con gruppo_servizio_id. Al rientro il territorio torna in reparto. Sciogliere il gruppo libera pacchetto e membri e disattiva l'utenza. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
78
README.md
78
README.md
@@ -736,6 +736,30 @@ docker compose --profile dev up -d --build
|
||||
- **Dopo una conferma o un annulla si torna alla pagina di partenza**, con i
|
||||
suoi filtri, ricerca, ordinamento e pagina (aperta dal menu: come prima)
|
||||
|
||||
### Gruppi di servizio
|
||||
- Li gestisce solo l'amministratore (menu *Gruppi di servizio*): nome,
|
||||
**sorvegliante** (un proclamatore attivo), **membri** e **pacchetto** di
|
||||
territori. Un proclamatore sta in un solo gruppo; il sorvegliante ne è
|
||||
anche membro
|
||||
- Creando il gruppo il sorvegliante riceve un'**utenza**: l'email indicata e
|
||||
una password temporanea, mostrata una volta sola e da cambiare al primo
|
||||
accesso. **Nessuna conferma dell'email**. Se la perde, l'amministratore ne
|
||||
genera un'altra dalla pagina del gruppo
|
||||
- I territori del pacchetto si aggiungono in blocco tra quelli in reparto.
|
||||
Restano **"In gruppo …"**: non sono un'assegnazione (statistiche e medie non
|
||||
cambiano), escono da "Da assegnare" e dalla pagina *Assegna*
|
||||
- Il sorvegliante entra e vede **solo "Il mio gruppo"** e il proprio profilo
|
||||
(ogni altra pagina risponde 403): dà i territori ai membri — o a sé — e ne
|
||||
nasce un'**assegnazione normale**, che conta come le altre ed è segnata
|
||||
"via gruppo …"; poi manda il link (copia o condividi), registra i rientri,
|
||||
apre la piantina e rimanda in reparto quelli non ancora dati
|
||||
- Al **rientro** il territorio torna in reparto ed esce dal pacchetto
|
||||
- **Sciogliere il gruppo** toglie il ruolo al sorvegliante: i territori non
|
||||
ancora dati tornano in reparto, i membri si liberano, l'utenza viene
|
||||
disattivata (anche una sessione aperta si chiude) e il gruppo resta nello
|
||||
storico. I territori già dati restano ai membri. Per ripartire si crea un
|
||||
gruppo nuovo
|
||||
|
||||
### Campagne
|
||||
- CRUD con date di inizio e fine
|
||||
- Stato automatico: attiva, futura o conclusa
|
||||
@@ -771,24 +795,31 @@ docker compose --profile dev up -d --build
|
||||
|
||||
## Ruoli e permessi
|
||||
|
||||
Tre ruoli con permessi granulari (spatie/laravel-permission):
|
||||
Quattro ruoli con permessi granulari (spatie/laravel-permission):
|
||||
|
||||
| Permesso | Amministratore | Assistente | Operatore |
|
||||
|-----------------------|:--------------:|:----------:|:---------:|
|
||||
| `settings.manage` | ✅ | | |
|
||||
| `territori.manage` | ✅ | | |
|
||||
| `proclamatori.manage` | ✅ | ✅ | |
|
||||
| `campagne.manage` | ✅ | ✅ | |
|
||||
| `registro.view` | ✅ | ✅ | |
|
||||
| `registro.export` | ✅ | | |
|
||||
| `territori.assign` | ✅ | ✅ | ✅ |
|
||||
| `territori.return` | ✅ | ✅ | ✅ |
|
||||
| `audit.view` | ✅ | | |
|
||||
| `audit.export` | ✅ | | |
|
||||
| Permesso | Amministratore | Assistente | Operatore | Sorvegliante |
|
||||
|-----------------------|:--------------:|:----------:|:---------:|:------------:|
|
||||
| `settings.manage` | ✅ | | | |
|
||||
| `territori.manage` | ✅ | | | |
|
||||
| `proclamatori.manage` | ✅ | ✅ | | |
|
||||
| `campagne.manage` | ✅ | ✅ | | |
|
||||
| `registro.view` | ✅ | ✅ | | |
|
||||
| `registro.export` | ✅ | | | |
|
||||
| `territori.assign` | ✅ | ✅ | ✅ | |
|
||||
| `territori.return` | ✅ | ✅ | ✅ | |
|
||||
| `audit.view` | ✅ | | | |
|
||||
| `audit.export` | ✅ | | | |
|
||||
| `gruppo.gestisci` | | | | ✅ |
|
||||
|
||||
L'amministratore ha un bypass completo (`Gate::before` in `AppServiceProvider`).
|
||||
Il menu laterale mostra solo le voci per cui l'utente ha i permessi.
|
||||
|
||||
Il ruolo **sorvegliante** non si assegna dalla pagina *Utenti*: nasce creando
|
||||
un gruppo di servizio e sparisce sciogliendolo. Chi ha solo quel ruolo è
|
||||
confinato da `LimitaSorvegliante` alla pagina del proprio gruppo, al rientro
|
||||
dei territori del gruppo e al profilo; le sue azioni ricontrollano che
|
||||
territorio e assegnazione siano del suo gruppo.
|
||||
|
||||
I permessi sono verificati sia sulle rotte sia sulle richieste Livewire, quindi
|
||||
una revoca ha effetto immediato senza bisogno di ricaricare la pagina.
|
||||
|
||||
@@ -838,15 +869,16 @@ una revoca ha effetto immediato senza bisogno di ricaricare la pagina.
|
||||
|
||||
| Tabella | Descrizione |
|
||||
|-------------------|--------------------------------------------------------------|
|
||||
| `users` | Utenti; `password_change_required` blocca l'accesso finché non si sceglie una password nuova |
|
||||
| `users` | Utenti; `password_change_required` blocca l'accesso finché non si sceglie una password nuova; `proclamatore_id` lega l'utenza del sorvegliante al suo proclamatore, `disattivato_at` la chiude allo scioglimento del gruppo |
|
||||
| `settings` | Configurazione singleton |
|
||||
| `zone` | Zone territoriali |
|
||||
| `tipologie` | Tipologie di territorio |
|
||||
| `proclamatori` | Assegnatari, con nome/cognome cifrati e soft delete (niente contatti) |
|
||||
| `territori` | Cartoline con zona, tipologia, PDF, miniatura, soft delete |
|
||||
| `proclamatori` | Assegnatari, con nome/cognome cifrati e soft delete (niente contatti); `gruppo_servizio_id` è il gruppo di cui fanno parte |
|
||||
| `gruppi_servizio` | Gruppi di servizio: nome, sorvegliante, `sciolto_at` (sciolti restano per lo storico) |
|
||||
| `territori` | Cartoline con zona, tipologia, PDF, miniatura, soft delete; `gruppo_servizio_id` se sono nel pacchetto di un gruppo |
|
||||
| `anni_teocratici` | Periodi settembre → agosto |
|
||||
| `campagne` | Periodi speciali con date e descrizione |
|
||||
| `assegnazioni` | Territorio ↔ proclamatore, con date, anno e campagna; stato dell'invio del link (`link_sent`, `link_da_inviare`, `link_canale`) |
|
||||
| `assegnazioni` | Territorio ↔ proclamatore, con date, anno e campagna; stato dell'invio del link (`link_sent`, `link_da_inviare`, `link_canale`); `gruppo_servizio_id` se data dal sorvegliante di un gruppo |
|
||||
| `activity_log` | Audit trail |
|
||||
|
||||
**Vincoli e indici principali**
|
||||
@@ -873,7 +905,8 @@ Calcolato dinamicamente, non memorizzato:
|
||||
|
||||
| Stato | Condizione |
|
||||
|----------------|-----------------------------------------------------|
|
||||
| `in_reparto` | Attivo, nessuna assegnazione aperta |
|
||||
| `in_reparto` | Attivo, nessuna assegnazione aperta, fuori dai pacchetti dei gruppi |
|
||||
| `in_gruppo` | Nel pacchetto di un gruppo di servizio, non ancora dato a un membro |
|
||||
| `assegnato` | Ha un'assegnazione con `returned_at` nullo |
|
||||
| `da_rientrare` | Assegnato da più giorni della soglia configurata |
|
||||
| `inattivo` | Contrassegnato come non attivo |
|
||||
@@ -897,6 +930,15 @@ lo decide l'operatore con la spunta. Se più campagne corrispondono viene
|
||||
proposta la più recente. I territori assegnati durante la campagna e non
|
||||
ancora rientrati compaiono nel dettaglio come "in corso".
|
||||
|
||||
### Gruppi di servizio e statistiche
|
||||
Mettere un territorio nel pacchetto di un gruppo **non** è un'assegnazione:
|
||||
non crea righe in `assegnazioni`, quindi non tocca medie, durate, percorrenza
|
||||
delle campagne né il registro. Conta solo quando il sorvegliante lo dà a un
|
||||
membro: da lì è un'assegnazione come le altre (con `gruppo_servizio_id` per
|
||||
sapere da dove viene). Il tempo passato nel pacchetto prima di essere dato non
|
||||
viene contato. La priorità automatica guarda l'ultima assegnazione, come
|
||||
sempre.
|
||||
|
||||
---
|
||||
|
||||
## Architettura
|
||||
|
||||
Reference in New Issue
Block a user