Posta configurabile dall'app, contatti dei proclamatori, conferma email

- Server di posta in Impostazioni (password cifrata, email di prova): se
  compilato prende il posto del .env; non si esporta e l'import XML non lo
  cancella. MAIL_SCHEME=tls nel .env.example non era valido per Laravel 11.
- Proclamatori con email e telefono facoltativi, cifrati, nell'XML e
  cancellati dall'anonimizzazione; il numero apre WhatsApp.
- Dopo l'assegnazione un riquadro in evidenza con il link del PDF,
  "Invia su WhatsApp" con il messaggio pronto e la scelta "inviato /
  non ancora", che resta finché non si sceglie.
- Conferma dell'email obbligatoria per tutti gli utenti, anche esistenti:
  email in italiano, link valido senza login, nuova conferma a ogni cambio
  di indirizzo, "Reinvia conferma" in Utenti. Senza conferma restano
  raggiungibili profilo, cambio password e, per l'admin, il server di
  posta; comando utenti:conferma-email per l'emergenza.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-12 17:12:31 +02:00
parent e7148c7b32
commit fc8623f7db
35 changed files with 1737 additions and 14 deletions

View File

@@ -7,6 +7,8 @@ use App\Http\Controllers\Settings\XmlExchangeUploadController;
use App\Http\Controllers\AssignmentPdfController;
use App\Http\Controllers\ShortPdfLinkController;
use App\Http\Controllers\TerritorioFileController;
use App\Http\Controllers\Auth\VerificaEmailController;
use App\Livewire\Settings\PostaElettronica;
use App\Http\Controllers\Auth\LoginController;
use App\Http\Controllers\Auth\PasswordChangeController;
use App\Livewire\Home;
@@ -68,10 +70,17 @@ Route::get('assegnazioni/pdf/{assignment}/{code}/file', [AssignmentPdfController
| Authenticated Routes
|--------------------------------------------------------------------------
*/
Route::middleware('auth')->group(function () {
// Il link della mail di conferma: firmato e con scadenza, funziona anche
// senza essere entrati (lo si apre spesso dal telefono).
Route::get('conferma-email/{id}/{hash}', [VerificaEmailController::class, 'conferma'])
->middleware(['signed', 'throttle:6,1'])
->whereNumber('id')
->name('verification.verify');
// Home Dashboard
Route::get('/', Home::class)->name('dashboard');
// Raggiungibili da chi è entrato ma non ha ancora confermato l'email: senza
// queste non potrebbe confermarla, correggere un indirizzo sbagliato, o —
// se è l'amministratore — configurare la posta che deve mandargli il link.
Route::middleware('auth')->group(function () {
// Profilo personale (ogni utente loggato)
Route::get('profilo', Profile::class)->name('profile');
@@ -81,6 +90,21 @@ Route::middleware('auth')->group(function () {
Route::get('cambia-password', [PasswordChangeController::class, 'show'])->name('password.change');
Route::post('cambia-password', [PasswordChangeController::class, 'store'])->name('password.change.store');
Route::get('conferma-email', [VerificaEmailController::class, 'avviso'])->name('verification.notice');
Route::post('conferma-email', [VerificaEmailController::class, 'invia'])
->middleware('throttle:6,1')
->name('verification.send');
Route::get('impostazioni/posta', PostaElettronica::class)
->middleware('permission:settings.manage')
->name('posta.edit');
});
Route::middleware(['auth', 'verified'])->group(function () {
// Home Dashboard
Route::get('/', Home::class)->name('dashboard');
// Territori — visualizzazione (lista + dettaglio) per tutti gli utenti
// operativi, cioè chi può assegnare i territori.
Route::middleware('permission:territori.assign')->group(function () {