netgescon-day0/resources/views/filament/pages/condomini/tabs/posta-ufficiale.blade.php

174 lines
14 KiB
PHP
Executable File

<div class="space-y-6">
<div class="rounded-xl border border-emerald-200 bg-emerald-50 p-4">
<div class="flex flex-wrap items-start justify-between gap-3">
<div>
<div class="text-sm font-semibold text-emerald-900">Posta ufficiale dello stabile</div>
<div class="mt-1 text-xs text-emerald-800">Qui agganciamo Gmail, PEC e account Google ufficiali del condominio per lavorare su dati reali, con documenti e comunicazioni sempre trasferibili in caso di cambio amministratore.</div>
</div>
<div class="flex flex-wrap gap-2">
<a href="{{ $this->getStableGoogleConnectUrl() }}" class="inline-flex items-center rounded-md bg-emerald-600 px-3 py-1.5 text-xs font-medium text-white hover:bg-emerald-500">Collega account Google dello stabile</a>
<a href="{{ $this->getGoogleSettingsUrl() }}" class="inline-flex items-center rounded-md bg-white px-3 py-1.5 text-xs font-medium text-slate-700 ring-1 ring-inset ring-slate-300 hover:bg-slate-50">Impostazioni Google</a>
<a href="{{ $this->getStabilePostaUrl() }}" class="inline-flex items-center rounded-md bg-white px-3 py-1.5 text-xs font-medium text-slate-700 ring-1 ring-inset ring-slate-300 hover:bg-slate-50">Vista completa posta</a>
</div>
</div>
</div>
<div class="grid gap-4 lg:grid-cols-[1.15fr,0.85fr]">
<div class="rounded-xl border bg-white p-4 space-y-4">
<div class="grid gap-4 md:grid-cols-2">
<label class="block text-sm">
<span class="mb-1 block font-medium text-slate-700">Email/PEC ufficiale del condominio</span>
<input type="email" wire:model.defer="officialPecCondominio" class="w-full rounded-lg border-slate-300" placeholder="pec o email ufficiale dello stabile" />
</label>
<label class="block text-sm">
<span class="mb-1 block font-medium text-slate-700">PEC o email studio per questo stabile</span>
<input type="email" wire:model.defer="officialPecStudio" class="w-full rounded-lg border-slate-300" placeholder="canale studio dedicato a questo stabile" />
</label>
</div>
<div class="flex flex-wrap items-end gap-3">
<label class="block text-sm w-40">
<span class="mb-1 block font-medium text-slate-700">Max email per import</span>
<input type="number" min="1" max="50" wire:model.defer="gmailImportMaxMessages" class="w-full rounded-lg border-slate-300" />
</label>
<x-filament::button type="button" color="gray" wire:click="saveOfficialMailSettings">Salva impostazioni</x-filament::button>
<x-filament::button type="button" color="primary" wire:click="importOfficialGmail">Importa Gmail ora</x-filament::button>
<x-filament::button type="button" color="success" wire:click="addOfficialMailbox">Aggiungi casella</x-filament::button>
</div>
<div class="space-y-4">
@forelse($officialMailboxes as $index => $mailbox)
@php
$tipo = strtolower($mailbox['tipo'] ?? 'imap');
@endphp
<div class="rounded-xl border border-slate-200 bg-white p-4 shadow-xs">
<div class="flex flex-wrap items-center justify-between gap-3 border-b border-slate-100 pb-3">
<div class="flex items-center gap-2">
<span class="text-sm font-bold text-slate-900">
{{ $tipo === 'pec' ? '🛡️ Casella PEC' : ($tipo === 'gmail' ? '🇬 Casella Gmail' : '✉️ Casella IMAP') }} #{{ $index + 1 }}:
</span>
<span class="text-xs font-semibold text-indigo-700 font-mono">{{ $mailbox['email'] ?: 'Non configurata' }}</span>
@if(!empty($mailbox['label']))
<span class="rounded bg-slate-100 px-2 py-0.5 text-[11px] text-slate-600 font-medium">({{ $mailbox['label'] }})</span>
@endif
</div>
<div class="flex flex-wrap items-center gap-2">
@if($tipo === 'imap' || $tipo === 'pec')
<x-filament::button type="button" size="xs" color="gray" wire:click="testOfficialImap({{ $index }})">🔍 Test IMAP</x-filament::button>
<x-filament::button type="button" size="xs" color="primary" wire:click="importOfficialImap({{ $index }})">📥 Scarica IMAP (.EML)</x-filament::button>
@else
<x-filament::button type="button" size="xs" color="primary" wire:click="importOfficialGmail({{ $index }})">📥 Importa Gmail</x-filament::button>
@endif
<x-filament::button type="button" size="xs" color="danger" wire:click="removeOfficialMailbox({{ $index }})">Rimuovi</x-filament::button>
</div>
</div>
<div class="mt-4 grid gap-3 md:grid-cols-2 xl:grid-cols-3">
<label class="flex items-center gap-2 text-sm text-slate-700">
<input type="checkbox" wire:model.defer="officialMailboxes.{{ $index }}.enabled" class="rounded border-slate-300 text-indigo-600" />
<span class="font-medium">Attiva casella</span>
</label>
<label class="block text-xs">
<span class="mb-1 block font-semibold text-slate-700">Tipo casella</span>
<select wire:model="officialMailboxes.{{ $index }}.tipo" class="w-full rounded-lg border-slate-300 text-xs">
<option value="imap">IMAP ordinaria</option>
<option value="pec">PEC via IMAP</option>
<option value="gmail">Gmail / Google Workspace</option>
</select>
</label>
<label class="block text-xs">
<span class="mb-1 block font-semibold text-slate-700">Etichetta</span>
<input type="text" wire:model.defer="officialMailboxes.{{ $index }}.label" class="w-full rounded-lg border-slate-300 text-xs" placeholder="es. PEC Condominio" />
</label>
<label class="block text-xs md:col-span-2 xl:col-span-1">
<span class="mb-1 block font-semibold text-slate-700">Indirizzo Email / PEC</span>
<input type="email" wire:model.defer="officialMailboxes.{{ $index }}.email" class="w-full rounded-lg border-slate-300 text-xs" placeholder="es. condominio@pec.it" />
</label>
@if($tipo === 'imap' || $tipo === 'pec')
<label class="block text-xs">
<span class="mb-1 block font-semibold text-slate-700">Host Server IMAP</span>
<input type="text" wire:model.defer="officialMailboxes.{{ $index }}.host" class="w-full rounded-lg border-slate-300 text-xs font-mono" placeholder="es. imaps.pec.aruba.it / mail.legalmail.it" />
</label>
<label class="block text-xs">
<span class="mb-1 block font-semibold text-slate-700">Porta & Cifratura</span>
<div class="grid grid-cols-2 gap-2">
<input type="number" wire:model.defer="officialMailboxes.{{ $index }}.port" class="w-full rounded-lg border-slate-300 text-xs font-mono" placeholder="993" />
<select wire:model.defer="officialMailboxes.{{ $index }}.encryption" class="w-full rounded-lg border-slate-300 text-xs">
<option value="ssl">SSL / TLS</option>
<option value="tls">STARTTLS</option>
<option value="none">Nessuna</option>
</select>
</div>
</label>
<label class="block text-xs">
<span class="mb-1 block font-semibold text-slate-700">Username IMAP</span>
<input type="text" wire:model.defer="officialMailboxes.{{ $index }}.username" class="w-full rounded-lg border-slate-300 text-xs font-mono" placeholder="nome utente o email" />
</label>
<label class="block text-xs">
<span class="mb-1 block font-semibold text-slate-700">Password IMAP</span>
<input type="password" wire:model.defer="officialMailboxes.{{ $index }}.password" class="w-full rounded-lg border-slate-300 text-xs font-mono" placeholder="••••••••" />
</label>
<label class="block text-xs">
<span class="mb-1 block font-semibold text-slate-700">Cartella IMAP</span>
<input type="text" wire:model.defer="officialMailboxes.{{ $index }}.folder" class="w-full rounded-lg border-slate-300 text-xs font-mono" placeholder="INBOX" />
</label>
@else
<label class="block text-xs md:col-span-2 xl:col-span-2">
<span class="mb-1 block font-semibold text-slate-700">Account Google collegato</span>
<select wire:model.defer="officialMailboxes.{{ $index }}.google_account_key" class="w-full rounded-lg border-slate-300 text-xs">
<option value="">Seleziona account collegato</option>
@foreach($stableGoogleAccountOptions as $key => $label)
<option value="{{ $key }}">{{ $label }}</option>
@endforeach
</select>
</label>
<label class="block text-xs md:col-span-2 xl:col-span-3">
<span class="mb-1 block font-semibold text-slate-700">Query Gmail</span>
<input type="text" wire:model.defer="officialMailboxes.{{ $index }}.gmail_query" class="w-full rounded-lg border-slate-300 text-xs" placeholder="es. in:inbox newer_than:30d" />
</label>
@endif
<div class="flex items-center gap-2 md:col-span-2 xl:col-span-3">
<label class="flex items-center gap-2 text-xs text-slate-700">
<input type="checkbox" wire:model.defer="officialMailboxes.{{ $index }}.crea_ticket_automatico" class="rounded border-slate-300 text-indigo-600" />
<span>Crea automaticamente un Ticket per ogni nuova email o PEC ricevuta</span>
</label>
</div>
<label class="block text-xs md:col-span-2 xl:col-span-3">
<span class="mb-1 block font-semibold text-slate-700">Mittenti autorizzati (opzionale)</span>
<input type="text" wire:model.defer="officialMailboxes.{{ $index }}.mittenti_autorizzati" class="w-full rounded-lg border-slate-300 text-xs" placeholder="email separate da virgola (es. assicurazioni, fornitori)" />
</label>
</div>
</div>
@empty
<div class="rounded-xl border border-dashed border-slate-300 p-8 text-center text-xs text-slate-500 bg-slate-50/50">
Nessuna casella Email o PEC configurata per questo stabile. Clicca su <strong>"Aggiungi casella"</strong> per iniziare.
</div>
@endforelse
</div>
</div>
<div class="space-y-4">
<div class="rounded-xl border bg-white p-4">
<div class="text-sm font-semibold text-slate-900">Riepilogo attivazione</div>
<div class="mt-3 space-y-2 text-sm">
<div><span class="font-medium">Stabile:</span> {{ $stabile->denominazione }}</div>
<div><span class="font-medium">Codice:</span> {{ $stabile->codice_stabile }}</div>
<div><span class="font-medium">Casella proposta:</span> {{ collect($officialMailboxes)->firstWhere('enabled', true)['email'] ?? 'Nessuna' }}</div>
<div><span class="font-medium">PEC condominio:</span> {{ $officialPecCondominio !== '' ? $officialPecCondominio : '-' }}</div>
<div><span class="font-medium">Account Google:</span> {{ $this->officialGoogleAccount['email'] ?? 'Da collegare' }}</div>
</div>
</div>
<div class="rounded-xl border bg-white p-4">
<div class="text-sm font-semibold text-slate-900">Note operative</div>
<div class="mt-2 text-xs leading-5 text-slate-500">
La chiave account prevista per questo stabile è <strong>stabile-{{ (int) ($stabile->id ?? 0) }}-pec</strong>.
Dopo il collegamento Google, la casella Gmail può essere usata per import ticket, archiviazione allegati e protocollo comunicazioni.
</div>
</div>
</div>
</div>
</div>