201 lines
14 KiB
PHP
201 lines
14 KiB
PHP
<div class="space-y-4">
|
|
<div class="rounded-xl border bg-white p-4">
|
|
<div class="flex flex-wrap items-start justify-between gap-3">
|
|
<div>
|
|
<div class="text-sm font-semibold">Modulo assicurazione stabile</div>
|
|
<div class="mt-1 text-xs text-gray-500">Storico polizze, clausole, PDF, firma immagine e collegamento dei sinistri ai ticket.</div>
|
|
</div>
|
|
<div class="flex flex-wrap gap-2">
|
|
<button type="button" wire:click="resetInsurancePolicyForm" class="inline-flex items-center rounded-md bg-slate-100 px-3 py-1.5 text-xs font-medium text-slate-700 hover:bg-slate-200">Nuova polizza</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="grid gap-4 xl:grid-cols-5">
|
|
<div class="rounded-xl border bg-white p-4 xl:col-span-2">
|
|
<div class="text-sm font-semibold">Elenco polizze</div>
|
|
<div class="mt-3 space-y-3">
|
|
@forelse($this->insurancePolicies as $policy)
|
|
<div class="rounded-lg border p-3 text-sm {{ (int) ($this->selectedInsurancePolicyId ?? 0) === (int) $policy->id ? 'border-primary-500 bg-primary-50' : 'border-slate-200 bg-white' }}">
|
|
<div class="flex flex-wrap items-start justify-between gap-2">
|
|
<div>
|
|
<div class="font-medium">{{ $policy->display_name }}</div>
|
|
<div class="mt-1 text-xs text-gray-500">{{ $policy->policy_reference ?: 'Riferimento non indicato' }}</div>
|
|
<div class="mt-1 text-xs text-gray-500">Scadenza {{ optional($policy->expires_at)->format('d/m/Y') ?: '-' }} · Rinnovo {{ optional($policy->renewal_at)->format('d/m/Y') ?: '-' }}</div>
|
|
</div>
|
|
<div class="flex gap-2">
|
|
<button type="button" wire:click="selectInsurancePolicy({{ (int) $policy->id }})" class="inline-flex items-center rounded-md bg-slate-800 px-2 py-1 text-[11px] font-medium text-white hover:bg-slate-700">Apri</button>
|
|
<button type="button" wire:click="deleteInsurancePolicy({{ (int) $policy->id }})" class="inline-flex items-center rounded-md bg-rose-600 px-2 py-1 text-[11px] font-medium text-white hover:bg-rose-500">Elimina</button>
|
|
</div>
|
|
</div>
|
|
<div class="mt-2 flex flex-wrap gap-2 text-[11px] text-gray-600">
|
|
<span>Stato: {{ $policy->status ?: '-' }}</span>
|
|
<span>Premio annuo: {{ $policy->annual_amount !== null ? number_format((float) $policy->annual_amount, 2, ',', '.') . ' EUR' : '-' }}</span>
|
|
</div>
|
|
</div>
|
|
@empty
|
|
<div class="rounded-lg border border-dashed p-4 text-sm text-gray-500">Nessuna polizza registrata per questo stabile.</div>
|
|
@endforelse
|
|
</div>
|
|
</div>
|
|
|
|
<div class="rounded-xl border bg-white p-4 xl:col-span-3">
|
|
<div class="text-sm font-semibold">Scheda polizza</div>
|
|
<div class="mt-4 grid gap-3 md:grid-cols-2">
|
|
<label class="block text-sm">
|
|
<span class="mb-1 block font-medium">Broker / referente polizza</span>
|
|
<select wire:model.defer="insurancePolicyForm.broker_rubrica_id" class="w-full rounded-lg border-gray-300">
|
|
<option value="">Seleziona contatto</option>
|
|
@foreach($this->insuranceRubricaOptions as $id => $label)
|
|
<option value="{{ $id }}">{{ $label }}</option>
|
|
@endforeach
|
|
</select>
|
|
</label>
|
|
<label class="block text-sm">
|
|
<span class="mb-1 block font-medium">Compagnia assicurativa</span>
|
|
<select wire:model.defer="insurancePolicyForm.company_rubrica_id" class="w-full rounded-lg border-gray-300">
|
|
<option value="">Seleziona compagnia</option>
|
|
@foreach($this->insuranceRubricaOptions as $id => $label)
|
|
<option value="{{ $id }}">{{ $label }}</option>
|
|
@endforeach
|
|
</select>
|
|
</label>
|
|
<label class="block text-sm">
|
|
<span class="mb-1 block font-medium">Nome polizza</span>
|
|
<input type="text" wire:model.defer="insurancePolicyForm.policy_name" class="w-full rounded-lg border-gray-300" placeholder="Fabbricato globale" />
|
|
</label>
|
|
<label class="block text-sm">
|
|
<span class="mb-1 block font-medium">Numero polizza</span>
|
|
<input type="text" wire:model.defer="insurancePolicyForm.policy_number" class="w-full rounded-lg border-gray-300" />
|
|
</label>
|
|
<label class="block text-sm md:col-span-2">
|
|
<span class="mb-1 block font-medium">Riferimento / riferimento di pagamento</span>
|
|
<input type="text" wire:model.defer="insurancePolicyForm.policy_reference" class="w-full rounded-lg border-gray-300" />
|
|
</label>
|
|
<label class="block text-sm">
|
|
<span class="mb-1 block font-medium">Stato</span>
|
|
<select wire:model.defer="insurancePolicyForm.status" class="w-full rounded-lg border-gray-300">
|
|
<option value="attiva">Attiva</option>
|
|
<option value="in_scadenza">In scadenza</option>
|
|
<option value="scaduta">Scaduta</option>
|
|
<option value="sostituita">Sostituita</option>
|
|
</select>
|
|
</label>
|
|
<label class="block text-sm">
|
|
<span class="mb-1 block font-medium">Premio annuo</span>
|
|
<input type="number" step="0.01" wire:model.defer="insurancePolicyForm.annual_amount" class="w-full rounded-lg border-gray-300" />
|
|
</label>
|
|
<label class="block text-sm">
|
|
<span class="mb-1 block font-medium">Decorrenza</span>
|
|
<input type="date" wire:model.defer="insurancePolicyForm.started_at" class="w-full rounded-lg border-gray-300" />
|
|
</label>
|
|
<label class="block text-sm">
|
|
<span class="mb-1 block font-medium">Scadenza</span>
|
|
<input type="date" wire:model.defer="insurancePolicyForm.expires_at" class="w-full rounded-lg border-gray-300" />
|
|
</label>
|
|
<label class="block text-sm">
|
|
<span class="mb-1 block font-medium">Rinnovo</span>
|
|
<input type="date" wire:model.defer="insurancePolicyForm.renewal_at" class="w-full rounded-lg border-gray-300" />
|
|
</label>
|
|
<label class="block text-sm">
|
|
<span class="mb-1 block font-medium">Come viene diviso il pagamento</span>
|
|
<input type="text" wire:model.defer="insurancePolicyForm.payment_split" class="w-full rounded-lg border-gray-300" placeholder="Annuale, semestrale, rateizzato" />
|
|
</label>
|
|
<label class="block text-sm md:col-span-2">
|
|
<span class="mb-1 block font-medium">Note pagamenti / quietanze</span>
|
|
<textarea wire:model.defer="insurancePolicyForm.payment_schedule_notes" rows="3" class="w-full rounded-lg border-gray-300" placeholder="Quietanze pagate, riferimenti contabili, scadenze rate"></textarea>
|
|
</label>
|
|
<label class="block text-sm md:col-span-2">
|
|
<span class="mb-1 block font-medium">Garanzie principali</span>
|
|
<textarea wire:model.defer="insurancePolicyForm.coverage_summary" rows="4" class="w-full rounded-lg border-gray-300" placeholder="Riassunto garanzie, massimali, franchigie"></textarea>
|
|
</label>
|
|
<label class="block text-sm md:col-span-2">
|
|
<span class="mb-1 block font-medium">Clausole e condizioni particolari</span>
|
|
<textarea wire:model.defer="insurancePolicyForm.special_conditions" rows="6" class="w-full rounded-lg border-gray-300" placeholder="Puoi incollare qui solo le clausole essenziali"></textarea>
|
|
</label>
|
|
<label class="block text-sm md:col-span-2">
|
|
<span class="mb-1 block font-medium">Template richiesta apertura sinistro</span>
|
|
<textarea wire:model.defer="insurancePolicyForm.claim_form_template" rows="5" class="w-full rounded-lg border-gray-300" placeholder="Base per il modulo di apertura sinistro con intestazione amministratore e riferimenti polizza"></textarea>
|
|
</label>
|
|
<label class="block text-sm md:col-span-2">
|
|
<span class="mb-1 block font-medium">Note operative</span>
|
|
<textarea wire:model.defer="insurancePolicyForm.notes" rows="4" class="w-full rounded-lg border-gray-300" placeholder="Perito, procedura, raccolta documenti, eventuale link protetto"></textarea>
|
|
</label>
|
|
<label class="block text-sm">
|
|
<span class="mb-1 block font-medium">PDF polizza</span>
|
|
<input type="file" wire:model="insurancePolicyDocumentUpload" accept="application/pdf,image/*" class="w-full rounded-lg border-gray-300 text-sm" />
|
|
</label>
|
|
<label class="block text-sm">
|
|
<span class="mb-1 block font-medium">Firma immagine</span>
|
|
<input type="file" wire:model="insuranceSignatureUpload" accept="image/*" class="w-full rounded-lg border-gray-300 text-sm" />
|
|
</label>
|
|
</div>
|
|
|
|
@if(($selectedPolicy = $this->insurancePolicies->firstWhere('id', (int) ($this->selectedInsurancePolicyId ?? 0))) instanceof \App\Models\InsurancePolicy)
|
|
<div class="mt-4 grid gap-3 md:grid-cols-2">
|
|
<div class="rounded-lg border bg-slate-50 p-3 text-xs text-slate-700">
|
|
<div class="font-medium">Documento polizza</div>
|
|
@if($this->getInsuranceDocumentUrl($selectedPolicy))
|
|
<a href="{{ $this->getInsuranceDocumentUrl($selectedPolicy) }}" target="_blank" class="mt-2 inline-flex text-primary-600 hover:underline">Apri PDF / allegato polizza</a>
|
|
@else
|
|
<div class="mt-2">Nessun documento caricato.</div>
|
|
@endif
|
|
</div>
|
|
<div class="rounded-lg border bg-slate-50 p-3 text-xs text-slate-700">
|
|
<div class="font-medium">Firma immagine</div>
|
|
@if($this->getInsuranceSignatureUrl($selectedPolicy))
|
|
<img src="{{ $this->getInsuranceSignatureUrl($selectedPolicy) }}" alt="Firma" class="mt-2 max-h-24 rounded border bg-white p-1" />
|
|
@else
|
|
<div class="mt-2">Nessuna firma immagine caricata.</div>
|
|
@endif
|
|
</div>
|
|
</div>
|
|
@endif
|
|
|
|
<div class="mt-4 flex flex-wrap gap-2">
|
|
<button type="button" wire:click="saveInsurancePolicy" class="inline-flex items-center rounded-md bg-primary-600 px-3 py-1.5 text-xs font-medium text-white hover:bg-primary-500">Salva polizza</button>
|
|
<button type="button" wire:click="resetInsurancePolicyForm" class="inline-flex items-center rounded-md bg-slate-100 px-3 py-1.5 text-xs font-medium text-slate-700 hover:bg-slate-200">Pulisci scheda</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="rounded-xl border bg-white p-4">
|
|
<div class="text-sm font-semibold">Sinistri collegati ai ticket</div>
|
|
<div class="mt-1 text-xs text-gray-500">Separati dalla sola scheda ticket: qui rimangono tracciati per polizza e per stabile.</div>
|
|
<div class="mt-3 overflow-x-auto">
|
|
<table class="min-w-full divide-y divide-gray-200 text-sm">
|
|
<thead class="bg-gray-50">
|
|
<tr>
|
|
<th class="px-3 py-2 text-left font-medium text-gray-600">Apertura</th>
|
|
<th class="px-3 py-2 text-left font-medium text-gray-600">Polizza</th>
|
|
<th class="px-3 py-2 text-left font-medium text-gray-600">Sinistro</th>
|
|
<th class="px-3 py-2 text-left font-medium text-gray-600">Ticket</th>
|
|
<th class="px-3 py-2 text-left font-medium text-gray-600">Note</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody class="divide-y divide-gray-100 bg-white">
|
|
@forelse($this->insuranceClaimsRows as $claim)
|
|
<tr>
|
|
<td class="px-3 py-2 align-top">{{ optional($claim->opened_at)->format('d/m/Y H:i') ?: '-' }}</td>
|
|
<td class="px-3 py-2 align-top">{{ $claim->insurancePolicy?->display_name ?: ($claim->policy_reference ?: '-') }}</td>
|
|
<td class="px-3 py-2 align-top">{{ $claim->claim_number ?: '-' }}<div class="text-xs text-gray-500">{{ $claim->status ?: 'aperta' }}</div></td>
|
|
<td class="px-3 py-2 align-top">
|
|
@if($claim->ticket)
|
|
<a href="{{ $this->getInsuranceTicketUrl($claim->ticket) }}" class="text-primary-600 hover:underline">Ticket #{{ (int) $claim->ticket->id }}</a>
|
|
<div class="text-xs text-gray-500">{{ $claim->ticket->titolo ?: '-' }}</div>
|
|
@else
|
|
-
|
|
@endif
|
|
</td>
|
|
<td class="px-3 py-2 align-top whitespace-pre-wrap text-xs text-gray-700">{{ $claim->notes ?: '-' }}</td>
|
|
</tr>
|
|
@empty
|
|
<tr>
|
|
<td colspan="5" class="px-3 py-6 text-center text-sm text-gray-500">Nessun sinistro registrato per questo stabile.</td>
|
|
</tr>
|
|
@endforelse
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
</div> |