648 lines
44 KiB
PHP
648 lines
44 KiB
PHP
<x-filament::page>
|
|
<div class="space-y-6">
|
|
<div class="flex flex-wrap items-center gap-3">
|
|
<button type="button" class="px-3 py-2 text-xs rounded bg-emerald-50 text-emerald-700 border border-emerald-200" wire:click="createAffitto">Nuovo immobile</button>
|
|
<button type="button" class="px-3 py-2 text-xs rounded bg-blue-50 text-blue-700 border border-blue-200" wire:click="saveAffitto">Salva</button>
|
|
@if($selectedAffittoId)
|
|
@if($selectedAffittoObsoleto)
|
|
<button type="button" class="px-3 py-2 text-xs rounded bg-emerald-50 text-emerald-700 border border-emerald-200" wire:click="riattivaContratto">Riattiva contratto</button>
|
|
@else
|
|
<button type="button" class="px-3 py-2 text-xs rounded bg-amber-50 text-amber-700 border border-amber-200" wire:click="markContrattoObsoleto">Segna obsoleto</button>
|
|
@endif
|
|
@endif
|
|
<a class="px-3 py-2 text-xs rounded bg-slate-50 text-slate-700 border border-slate-200" href="{{ \App\Filament\Pages\Condomini\StabilePage::getUrl(panel: 'admin-filament') }}">Scheda Stabile</a>
|
|
</div>
|
|
|
|
<div class="border rounded-lg p-3 bg-gray-50">
|
|
<div class="grid grid-cols-1 lg:grid-cols-4 gap-2 items-end">
|
|
<div class="lg:col-span-3">
|
|
<label class="text-xs text-gray-500">Legacy MDB (parti_comuni.mdb)</label>
|
|
<input wire:model="legacyMdbPath" class="w-full rounded-md border-gray-300" />
|
|
</div>
|
|
<div>
|
|
<button type="button" wire:click="syncAffittiFromLegacy" class="w-full px-3 py-2 text-xs rounded bg-emerald-50 text-emerald-700 border border-emerald-200">Aggiorna dati affitti</button>
|
|
</div>
|
|
</div>
|
|
@if(!empty($legacyLastSyncMessage))
|
|
<pre class="mt-2 p-2 text-[11px] bg-white border rounded overflow-auto max-h-40">{{ $legacyLastSyncMessage }}</pre>
|
|
@endif
|
|
</div>
|
|
|
|
<div class="border-b">
|
|
<nav class="flex flex-wrap gap-4 text-sm">
|
|
@php $tabs = ['elenco' => 'Elenco immobili / beni / servizi', 'anagrafica' => 'Anagrafica & Catasto', 'banca' => 'Banca', 'scadenze' => 'Contratto', 'canoni' => 'Canoni', 'documenti' => 'Documenti']; @endphp
|
|
@foreach($tabs as $key => $label)
|
|
<button type="button" class="pb-2 border-b-2 {{ $tab === $key ? 'border-blue-600 text-blue-700' : 'border-transparent text-gray-600' }}" wire:click="setTab('{{ $key }}')">{{ $label }}</button>
|
|
@endforeach
|
|
</nav>
|
|
</div>
|
|
|
|
@if($tab === 'elenco')
|
|
@php
|
|
$rows = collect($affittiList);
|
|
if (!empty($stabileFilterId)) {
|
|
$rows = $rows->filter(fn($r) => (int)($r['stabile_id'] ?? 0) === (int)$stabileFilterId);
|
|
}
|
|
if (($elencoTipoFiltro ?? 'tutti') === 'ade') {
|
|
$rows = $rows->filter(function ($row) {
|
|
$tipoRiga = strtoupper((string)($row['tipo_riga'] ?? ''));
|
|
$isInternal = str_contains($tipoRiga, 'INT') || str_contains($tipoRiga, 'RIMB') || str_contains($tipoRiga, 'SERV');
|
|
if ($isInternal) {
|
|
return false;
|
|
}
|
|
return !empty($row['inizio_contratto']) || !empty($row['prossima_registrazione']);
|
|
});
|
|
}
|
|
if (($elencoTipoFiltro ?? 'tutti') === 'interni') {
|
|
$rows = $rows->reject(function ($row) {
|
|
$tipoRiga = strtoupper((string)($row['tipo_riga'] ?? ''));
|
|
$isInternal = str_contains($tipoRiga, 'INT') || str_contains($tipoRiga, 'RIMB') || str_contains($tipoRiga, 'SERV');
|
|
if ($isInternal) {
|
|
return false;
|
|
}
|
|
return !empty($row['inizio_contratto']) || !empty($row['prossima_registrazione']);
|
|
});
|
|
}
|
|
if (($elencoStatoContrattoFiltro ?? 'attivi') === 'attivi') {
|
|
$rows = $rows->reject(fn($row) => (bool)($row['obsoleto'] ?? false));
|
|
}
|
|
if (($elencoStatoContrattoFiltro ?? 'attivi') === 'obsoleti') {
|
|
$rows = $rows->filter(fn($row) => (bool)($row['obsoleto'] ?? false));
|
|
}
|
|
@endphp
|
|
|
|
<div class="border rounded-lg">
|
|
<div class="p-3 border-b bg-gray-50 grid grid-cols-1 md:grid-cols-3 gap-3 text-xs">
|
|
<div>
|
|
<label class="text-gray-500">Tipo locazione</label>
|
|
<select wire:model.live="elencoTipoFiltro" class="w-full rounded-md border-gray-300 mt-1">
|
|
<option value="tutti">Tutti</option>
|
|
<option value="ade">Registrati AdE</option>
|
|
<option value="interni">Addebiti interni</option>
|
|
</select>
|
|
</div>
|
|
@if($forceAll)
|
|
<div>
|
|
<label class="text-gray-500">Stabile</label>
|
|
<select wire:model.live="stabileFilterId" class="w-full rounded-md border-gray-300 mt-1">
|
|
<option value="">— Tutti gli stabili —</option>
|
|
@foreach($stabileOptions as $id => $label)
|
|
<option value="{{ $id }}">{{ $label }}</option>
|
|
@endforeach
|
|
</select>
|
|
</div>
|
|
@endif
|
|
<div>
|
|
<label class="text-gray-500">Stato contratto</label>
|
|
<select wire:model.live="elencoStatoContrattoFiltro" class="w-full rounded-md border-gray-300 mt-1">
|
|
<option value="attivi">Solo attivi</option>
|
|
<option value="obsoleti">Solo obsoleti</option>
|
|
<option value="tutti">Tutti</option>
|
|
</select>
|
|
</div>
|
|
<div class="flex items-end justify-end text-gray-600">Totale elementi: {{ $rows->count() }}</div>
|
|
</div>
|
|
|
|
<div class="overflow-x-auto">
|
|
<table class="min-w-full text-xs">
|
|
<thead class="bg-white">
|
|
<tr>
|
|
<th class="px-3 py-2 text-left">Codice</th>
|
|
<th class="px-3 py-2 text-left">Descrizione immobile</th>
|
|
<th class="px-3 py-2 text-left">Proprietario</th>
|
|
<th class="px-3 py-2 text-left">Inquilino</th>
|
|
<th class="px-3 py-2 text-left">Stabile</th>
|
|
<th class="px-3 py-2 text-right">Dovuti</th>
|
|
<th class="px-3 py-2 text-right">Pagati</th>
|
|
<th class="px-3 py-2 text-right">Saldo</th>
|
|
<th class="px-3 py-2 text-left">Avvisi</th>
|
|
<th class="px-3 py-2 text-left">Stato</th>
|
|
<th class="px-3 py-2 text-right">Azioni</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
@forelse($rows as $row)
|
|
<tr class="border-t">
|
|
<td class="px-3 py-2">{{ $row['codice_appartamento'] ?? '—' }}</td>
|
|
<td class="px-3 py-2">{{ $row['descrizione_immobile'] ?? '—' }}</td>
|
|
<td class="px-3 py-2">{{ $row['proprietario_nome'] ?? '—' }}</td>
|
|
<td class="px-3 py-2">{{ $row['nome_inquilino'] ?? '—' }}</td>
|
|
<td class="px-3 py-2">
|
|
<div class="text-xs font-medium">{{ $row['stabile'] ?? '—' }}</div>
|
|
<div class="text-[10px] text-gray-500">{{ $row['stabile_nome'] ?? '' }}</div>
|
|
</td>
|
|
<td class="px-3 py-2 text-right">€ {{ number_format((float)($row['dovuti_totale'] ?? 0), 2, ',', '.') }}</td>
|
|
<td class="px-3 py-2 text-right">€ {{ number_format((float)($row['pagati_totale'] ?? 0), 2, ',', '.') }}</td>
|
|
<td class="px-3 py-2 text-right">€ {{ number_format((float)($row['saldo_totale'] ?? 0), 2, ',', '.') }}</td>
|
|
<td class="px-3 py-2">
|
|
@if(!empty($row['warnings']))
|
|
@foreach($row['warnings'] as $warning)
|
|
<div class="text-[11px] text-amber-700">{{ $warning }}</div>
|
|
@endforeach
|
|
@else
|
|
<span class="text-[11px] text-gray-400">Nessun avviso</span>
|
|
@endif
|
|
</td>
|
|
<td class="px-3 py-2">
|
|
@if(!empty($row['obsoleto']))
|
|
<span class="px-2 py-0.5 rounded bg-amber-50 text-amber-700 border border-amber-200">Obsoleto</span>
|
|
@else
|
|
<span class="px-2 py-0.5 rounded bg-emerald-50 text-emerald-700 border border-emerald-200">Attivo</span>
|
|
@endif
|
|
</td>
|
|
<td class="px-3 py-2 text-right">
|
|
<button type="button" class="text-blue-600" wire:click="selectAffitto({{ $row['id'] }})">Apri</button>
|
|
</td>
|
|
</tr>
|
|
@empty
|
|
<tr><td colspan="11" class="px-3 py-2 text-gray-500">Nessun affitto trovato.</td></tr>
|
|
@endforelse
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
|
|
@elseif($tab === 'anagrafica')
|
|
<div class="space-y-4">
|
|
<div class="border-b">
|
|
<nav class="flex flex-wrap gap-4 text-sm">
|
|
@php $subTabs = ['anagrafica' => 'Anagrafica', 'catasto' => 'Catasto', 'inquilini' => 'Inquilini']; @endphp
|
|
@foreach($subTabs as $key => $label)
|
|
<button type="button" class="pb-2 border-b-2 {{ $anagraficaSection === $key ? 'border-blue-600 text-blue-700' : 'border-transparent text-gray-600' }}" wire:click="setAnagraficaSection('{{ $key }}')">{{ $label }}</button>
|
|
@endforeach
|
|
</nav>
|
|
</div>
|
|
|
|
@if($anagraficaSection === 'anagrafica')
|
|
<div class="grid grid-cols-1 lg:grid-cols-2 gap-6">
|
|
<div class="space-y-3">
|
|
<h3 class="text-sm font-semibold text-gray-700">Anagrafica immobile</h3>
|
|
<div class="grid grid-cols-1 md:grid-cols-2 gap-3">
|
|
<div class="md:col-span-2">
|
|
<label class="text-xs text-gray-500">Unità immobiliare collegata</label>
|
|
<select wire:model="form.unita_immobiliare_id" class="w-full rounded-md border-gray-300">
|
|
<option value="">— Seleziona unità —</option>
|
|
@foreach($unitaOptions as $id => $label)
|
|
<option value="{{ $id }}">{{ $label }}</option>
|
|
@endforeach
|
|
</select>
|
|
</div>
|
|
<div>
|
|
<label class="text-xs text-gray-500">Codice appartamento</label>
|
|
<input wire:model="form.codice_appartamento" class="w-full rounded-md border-gray-300" />
|
|
</div>
|
|
<div>
|
|
<label class="text-xs text-gray-500">Proprietario</label>
|
|
<input wire:model="form.proprietario_nome" class="w-full rounded-md border-gray-300" />
|
|
</div>
|
|
<div>
|
|
<label class="text-xs text-gray-500">Intestatario</label>
|
|
<input wire:model="form.proprietario_intesta" class="w-full rounded-md border-gray-300" />
|
|
</div>
|
|
<div class="md:col-span-2">
|
|
<label class="text-xs text-gray-500">Descrizione immobile</label>
|
|
<input wire:model="form.descrizione_immobile" class="w-full rounded-md border-gray-300" />
|
|
</div>
|
|
<div>
|
|
<label class="text-xs text-gray-500">Indirizzo</label>
|
|
<input wire:model="form.indirizzo_immobile" class="w-full rounded-md border-gray-300" />
|
|
</div>
|
|
<div>
|
|
<label class="text-xs text-gray-500">CAP</label>
|
|
<input wire:model="form.cap" class="w-full rounded-md border-gray-300" />
|
|
</div>
|
|
<div>
|
|
<label class="text-xs text-gray-500">Città</label>
|
|
<input wire:model="form.citta" class="w-full rounded-md border-gray-300" />
|
|
</div>
|
|
<div>
|
|
<label class="text-xs text-gray-500">Provincia</label>
|
|
<input wire:model="form.provincia" class="w-full rounded-md border-gray-300" />
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="space-y-3">
|
|
<h3 class="text-sm font-semibold text-gray-700">Stabile collegato</h3>
|
|
<div class="text-xs text-gray-700">
|
|
{{ $selectedStabileCode ?? '—' }}
|
|
@if($selectedStabileName)
|
|
<span class="text-gray-500">· {{ $selectedStabileName }}</span>
|
|
@endif
|
|
</div>
|
|
@if(!empty($selectedStabileRubricaId))
|
|
<a class="inline-flex px-2 py-1 text-xs rounded bg-blue-50 text-blue-700 border border-blue-200" target="_blank" href="{{ route('admin.rubrica-universale.show', $selectedStabileRubricaId) }}">Apri rubrica stabile</a>
|
|
@endif
|
|
</div>
|
|
</div>
|
|
@elseif($anagraficaSection === 'catasto')
|
|
<div class="space-y-3">
|
|
<div class="flex items-center gap-2">
|
|
<button type="button" wire:click="mergeCatastoFromUnita" class="px-3 py-2 text-xs rounded bg-blue-50 text-blue-700 border border-blue-200">Unisci dati da unità immobiliare</button>
|
|
<button type="button" wire:click="mergeCatastoFromUnita(true)" class="px-3 py-2 text-xs rounded bg-amber-50 text-amber-700 border border-amber-200">Sovrascrivi con dati unità</button>
|
|
</div>
|
|
<div class="grid grid-cols-1 md:grid-cols-2 gap-3">
|
|
<div>
|
|
<label class="text-xs text-gray-500">Codice Comune Catastale (es. H501)</label>
|
|
<input wire:model="form.comune_catastale_codice" class="w-full rounded-md border-gray-300" />
|
|
</div>
|
|
<div>
|
|
<label class="text-xs text-gray-500">Comune Catastale</label>
|
|
<input wire:model="form.comune_catastale_nome" class="w-full rounded-md border-gray-300" />
|
|
</div>
|
|
<div>
|
|
<label class="text-xs text-gray-500">Sezione Urbana</label>
|
|
<input wire:model="form.sezione_urbana" class="w-full rounded-md border-gray-300" />
|
|
</div>
|
|
<div>
|
|
<label class="text-xs text-gray-500">Rendita catastale</label>
|
|
<input wire:model="form.rendita_catastale" class="w-full rounded-md border-gray-300" />
|
|
</div>
|
|
<div>
|
|
<label class="text-xs text-gray-500">Foglio</label>
|
|
<input wire:model="form.foglio" class="w-full rounded-md border-gray-300" />
|
|
</div>
|
|
<div>
|
|
<label class="text-xs text-gray-500">Particella</label>
|
|
<input wire:model="form.particella" class="w-full rounded-md border-gray-300" />
|
|
</div>
|
|
<div>
|
|
<label class="text-xs text-gray-500">Subalterno</label>
|
|
<input wire:model="form.subalterno" class="w-full rounded-md border-gray-300" />
|
|
</div>
|
|
<div>
|
|
<label class="text-xs text-gray-500">Categoria Catastale</label>
|
|
<input wire:model="form.categoria_catastale" class="w-full rounded-md border-gray-300" />
|
|
</div>
|
|
<div>
|
|
<label class="text-xs text-gray-500">Classe Catastale</label>
|
|
<input wire:model="form.classe_catastale" class="w-full rounded-md border-gray-300" />
|
|
</div>
|
|
<div>
|
|
<label class="text-xs text-gray-500">Consistenza</label>
|
|
<input wire:model="form.consistenza_catastale" class="w-full rounded-md border-gray-300" />
|
|
</div>
|
|
<div>
|
|
<label class="text-xs text-gray-500">Superficie Catastale mq</label>
|
|
<input wire:model="form.superficie_catastale_mq" class="w-full rounded-md border-gray-300" />
|
|
</div>
|
|
<div>
|
|
<label class="text-xs text-gray-500">Interno Catastale</label>
|
|
<input wire:model="form.interno_catastale" class="w-full rounded-md border-gray-300" />
|
|
</div>
|
|
<div>
|
|
<label class="text-xs text-gray-500">Piano Catastale</label>
|
|
<input wire:model="form.piano_catastale" class="w-full rounded-md border-gray-300" />
|
|
</div>
|
|
<div>
|
|
<label class="text-xs text-gray-500">Destinazione d'uso</label>
|
|
<input wire:model="form.destinazione_uso" class="w-full rounded-md border-gray-300" />
|
|
</div>
|
|
<div>
|
|
<label class="text-xs text-gray-500">Importo fitto base annuo (EUR)</label>
|
|
<input wire:model="form.importo_fitto" class="w-full rounded-md border-gray-300" />
|
|
</div>
|
|
<div class="md:col-span-2">
|
|
<label class="text-xs text-gray-500">Note</label>
|
|
<textarea wire:model="form.note" class="w-full rounded-md border-gray-300" rows="3"></textarea>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
@else
|
|
<div class="space-y-3">
|
|
<div class="flex items-center justify-between">
|
|
<h3 class="text-sm font-semibold text-gray-700">Inquilini / Affittuari (uno-a-molti)</h3>
|
|
<button type="button" class="px-3 py-2 text-xs rounded bg-blue-50 text-blue-700 border border-blue-200" wire:click="addInquilino">Aggiungi inquilino</button>
|
|
</div>
|
|
<div class="space-y-2">
|
|
@forelse($inquilini as $i => $inq)
|
|
<div class="border rounded p-3 grid grid-cols-1 md:grid-cols-6 gap-2">
|
|
<div class="md:col-span-2">
|
|
<label class="text-xs text-gray-500">Anagrafica rubrica</label>
|
|
<select wire:model="inquilini.{{ $i }}.rubrica_inquilino_id" class="w-full rounded-md border-gray-300">
|
|
<option value="">— Seleziona —</option>
|
|
@foreach($rubricaOptions as $id => $label)
|
|
<option value="{{ $id }}">{{ $label }}</option>
|
|
@endforeach
|
|
</select>
|
|
</div>
|
|
<div class="md:col-span-2">
|
|
<label class="text-xs text-gray-500">Nome visualizzato</label>
|
|
<input wire:model="inquilini.{{ $i }}.nome_visualizzato" class="w-full rounded-md border-gray-300" />
|
|
</div>
|
|
<div>
|
|
<label class="text-xs text-gray-500">Telefono</label>
|
|
<input wire:model="inquilini.{{ $i }}.telefono" class="w-full rounded-md border-gray-300" />
|
|
</div>
|
|
<div>
|
|
<label class="text-xs text-gray-500">Email</label>
|
|
<input wire:model="inquilini.{{ $i }}.email" class="w-full rounded-md border-gray-300" />
|
|
</div>
|
|
<div class="md:col-span-5">
|
|
<label class="text-xs text-gray-500">Note documenti personali allegati al contratto</label>
|
|
<input wire:model="inquilini.{{ $i }}.documenti_note" class="w-full rounded-md border-gray-300" />
|
|
</div>
|
|
<div class="flex items-end justify-end">
|
|
<button type="button" class="text-red-600 text-xs" wire:click="removeInquilino({{ $i }})">Rimuovi</button>
|
|
</div>
|
|
</div>
|
|
@empty
|
|
<div class="text-xs text-gray-500">Nessun inquilino associato.</div>
|
|
@endforelse
|
|
</div>
|
|
</div>
|
|
@endif
|
|
</div>
|
|
|
|
@elseif($tab === 'banca')
|
|
<div class="grid grid-cols-1 lg:grid-cols-2 gap-6">
|
|
<div class="space-y-3">
|
|
<h3 class="text-sm font-semibold text-gray-700">Banca di riferimento</h3>
|
|
<div class="grid grid-cols-1 md:grid-cols-2 gap-3">
|
|
<div class="md:col-span-2">
|
|
<label class="text-xs text-gray-500">Conto collegato</label>
|
|
<div class="flex gap-2">
|
|
<select wire:model="form.conto_bancario_id" class="w-full rounded-md border-gray-300">
|
|
<option value="">— Seleziona conto —</option>
|
|
@foreach($contoOptions as $id => $label)
|
|
<option value="{{ $id }}">{{ $label }}</option>
|
|
@endforeach
|
|
</select>
|
|
@if(!empty($form['conto_bancario_id']))
|
|
<a class="px-3 py-2 text-xs rounded bg-slate-50 text-slate-700 border border-slate-200" target="_blank" href="{{ url('/admin-filament/contabilita/casse-banche/movimenti?conto_id=' . $form['conto_bancario_id']) }}">Movimenti</a>
|
|
@endif
|
|
</div>
|
|
</div>
|
|
<div class="md:col-span-2">
|
|
<label class="text-xs text-gray-500">Intestatario conto</label>
|
|
<input wire:model="form.inte_cc" class="w-full rounded-md border-gray-300" />
|
|
</div>
|
|
<div class="md:col-span-2">
|
|
<label class="text-xs text-gray-500">IBAN</label>
|
|
<input wire:model="form.iban" class="w-full rounded-md border-gray-300" />
|
|
</div>
|
|
<div>
|
|
<label class="text-xs text-gray-500">Num. CCP</label>
|
|
<input wire:model="form.num_ccp" class="w-full rounded-md border-gray-300" />
|
|
</div>
|
|
<div>
|
|
<label class="text-xs text-gray-500">Autorizz. 674</label>
|
|
<input wire:model="form.autorizz_674" class="w-full rounded-md border-gray-300" />
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="space-y-3">
|
|
<h3 class="text-sm font-semibold text-gray-700">Altri riferimenti</h3>
|
|
<div class="grid grid-cols-1 md:grid-cols-2 gap-3">
|
|
<div>
|
|
<label class="text-xs text-gray-500">Selez.</label>
|
|
<input wire:model="form.selez" class="w-full rounded-md border-gray-300" />
|
|
</div>
|
|
<div>
|
|
<label class="text-xs text-gray-500">Def. Ammin</label>
|
|
<input wire:model="form.def_ammin" class="w-full rounded-md border-gray-300" />
|
|
</div>
|
|
<div class="md:col-span-2">
|
|
<label class="text-xs text-gray-500">Descr. 1 voce</label>
|
|
<input wire:model="form.descr_1_voce" class="w-full rounded-md border-gray-300" />
|
|
</div>
|
|
<div>
|
|
<label class="text-xs text-gray-500">Tipo riga</label>
|
|
<input wire:model="form.tipo_riga" class="w-full rounded-md border-gray-300" />
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
@elseif($tab === 'scadenze')
|
|
<div class="grid grid-cols-1 lg:grid-cols-2 gap-6">
|
|
<div class="space-y-3">
|
|
<h3 class="text-sm font-semibold text-gray-700">Dati contratto</h3>
|
|
<div class="grid grid-cols-1 md:grid-cols-2 gap-3">
|
|
<div>
|
|
<label class="text-xs text-gray-500">Inizio contratto</label>
|
|
<input type="date" wire:model="form.inizio_contratto" class="w-full rounded-md border-gray-300" />
|
|
</div>
|
|
<div>
|
|
<label class="text-xs text-gray-500">Presa in carico operativa dal</label>
|
|
<input type="date" wire:model="form.presa_in_carico_operativa_dal" class="w-full rounded-md border-gray-300" />
|
|
<div class="mt-1 text-[11px] text-gray-500">I canoni precedenti restano fuori dal gestionale operativo e dalla riconciliazione bancaria.</div>
|
|
</div>
|
|
<div>
|
|
<label class="text-xs text-gray-500">Ultimo rinnovo</label>
|
|
<input type="date" wire:model="form.ultimo_rinnovo" class="w-full rounded-md border-gray-300" />
|
|
</div>
|
|
<div>
|
|
<label class="text-xs text-gray-500">Prossima scadenza</label>
|
|
<input type="date" wire:model="form.prossima_scadenza" class="w-full rounded-md border-gray-300" />
|
|
</div>
|
|
<div>
|
|
<label class="text-xs text-gray-500">Prossima registrazione</label>
|
|
<input type="date" wire:model="form.prossima_registrazione" class="w-full rounded-md border-gray-300" />
|
|
</div>
|
|
<div>
|
|
<label class="text-xs text-gray-500">Data fine contratto</label>
|
|
<input type="date" wire:model="form.data_fine_contratto" class="w-full rounded-md border-gray-300" />
|
|
</div>
|
|
<div>
|
|
<label class="text-xs text-gray-500">Giorno emissione rata</label>
|
|
<input type="number" min="1" max="28" wire:model="form.giorno_emissione_canone" class="w-full rounded-md border-gray-300" />
|
|
</div>
|
|
<div>
|
|
<label class="text-xs text-gray-500">Mese adempimenti annui (registro/bollo)</label>
|
|
<input type="number" min="1" max="12" wire:model="form.mese_adempimenti_annuali" class="w-full rounded-md border-gray-300" />
|
|
</div>
|
|
<div>
|
|
<label class="text-xs text-gray-500">Giorno adempimenti annui</label>
|
|
<input type="number" min="1" max="31" wire:model="form.giorno_adempimenti_annuali" class="w-full rounded-md border-gray-300" />
|
|
</div>
|
|
<div>
|
|
<label class="text-xs text-gray-500">Numero registrazione AdE / RLI</label>
|
|
<input wire:model="form.numero_registrazione_ade" class="w-full rounded-md border-gray-300" />
|
|
</div>
|
|
<div>
|
|
<label class="text-xs text-gray-500">Data registrazione AdE</label>
|
|
<input type="date" wire:model="form.data_registrazione_ade" class="w-full rounded-md border-gray-300" />
|
|
</div>
|
|
<div>
|
|
<label class="text-xs text-gray-500">Importo fitto base</label>
|
|
<input wire:model="form.importo_fitto" class="w-full rounded-md border-gray-300" />
|
|
</div>
|
|
<div>
|
|
<label class="text-xs text-gray-500">Imposta registro annua (totale)</label>
|
|
<input wire:model="form.imposta_registro_annuale" class="w-full rounded-md border-gray-300" />
|
|
</div>
|
|
<div>
|
|
<label class="text-xs text-gray-500">Quota imposta registro inquilino %</label>
|
|
<input type="number" min="0" max="100" step="0.01" wire:model="form.quota_imposta_inquilino_percent" class="w-full rounded-md border-gray-300" />
|
|
</div>
|
|
<div>
|
|
<label class="text-xs text-gray-500">Imposta bollo annua</label>
|
|
<input wire:model="form.imposta_bollo_annuale" class="w-full rounded-md border-gray-300" />
|
|
</div>
|
|
<div class="md:col-span-2">
|
|
<label class="text-xs text-gray-500">Motivo obsolescenza (se contratto chiuso)</label>
|
|
<input wire:model="form.motivo_obsolescenza" class="w-full rounded-md border-gray-300" />
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="space-y-3">
|
|
<div class="flex items-center justify-between">
|
|
<h3 class="text-sm font-semibold text-gray-700">Clausole e postille contratto</h3>
|
|
<button type="button" class="px-3 py-2 text-xs rounded bg-blue-50 text-blue-700 border border-blue-200" wire:click="addClausolaContratto">Aggiungi clausola</button>
|
|
</div>
|
|
<div class="border rounded p-3 bg-gray-50 space-y-2">
|
|
<div class="grid grid-cols-1 md:grid-cols-3 gap-2 items-end">
|
|
<div>
|
|
<label class="text-xs text-gray-500">Template contratto</label>
|
|
<select wire:model="selectedContractTemplate" class="w-full rounded-md border-gray-300">
|
|
@foreach($contractTemplates as $key => $label)
|
|
<option value="{{ $key }}">{{ $label }}</option>
|
|
@endforeach
|
|
</select>
|
|
</div>
|
|
<div class="md:col-span-2">
|
|
<button type="button" wire:click="generateContractDraft" class="px-3 py-2 text-xs rounded bg-emerald-50 text-emerald-700 border border-emerald-200">Genera bozza contratto</button>
|
|
</div>
|
|
</div>
|
|
<div>
|
|
<label class="text-xs text-gray-500">Bozza contratto generata</label>
|
|
<textarea readonly class="w-full rounded-md border-gray-300 bg-white" rows="10">{{ $contractDraftPreview }}</textarea>
|
|
</div>
|
|
</div>
|
|
<div class="space-y-2">
|
|
@forelse($clausoleContratto as $i => $c)
|
|
<div class="border rounded p-3 grid grid-cols-1 md:grid-cols-6 gap-2">
|
|
<div class="md:col-span-2">
|
|
<label class="text-xs text-gray-500">Template clausola</label>
|
|
<div class="flex gap-2">
|
|
<select wire:model="clausoleContratto.{{ $i }}.clausola_id" class="w-full rounded-md border-gray-300">
|
|
<option value="">— Nessuno —</option>
|
|
@foreach($clausoleCatalogo as $id => $label)
|
|
<option value="{{ $id }}">{{ $label }}</option>
|
|
@endforeach
|
|
</select>
|
|
<button type="button" class="px-2 py-1 text-xs rounded border" wire:click="useClausolaTemplate({{ $i }})">Usa</button>
|
|
</div>
|
|
</div>
|
|
<div class="md:col-span-2">
|
|
<label class="text-xs text-gray-500">Titolo</label>
|
|
<input wire:model="clausoleContratto.{{ $i }}.titolo" class="w-full rounded-md border-gray-300" />
|
|
</div>
|
|
<div>
|
|
<label class="text-xs text-gray-500">Periodicità</label>
|
|
<select wire:model="clausoleContratto.{{ $i }}.periodicita" class="w-full rounded-md border-gray-300">
|
|
<option value="">—</option>
|
|
<option value="mensile">Mensile</option>
|
|
<option value="annuale">Annuale</option>
|
|
<option value="una_tantum">Una tantum</option>
|
|
</select>
|
|
</div>
|
|
<div>
|
|
<label class="text-xs text-gray-500">Importo</label>
|
|
<input wire:model="clausoleContratto.{{ $i }}.importo" class="w-full rounded-md border-gray-300" />
|
|
</div>
|
|
<div class="md:col-span-5">
|
|
<label class="text-xs text-gray-500">Testo clausola / postilla</label>
|
|
<textarea wire:model="clausoleContratto.{{ $i }}.testo" class="w-full rounded-md border-gray-300" rows="3"></textarea>
|
|
</div>
|
|
<div class="flex items-end justify-end">
|
|
<button type="button" class="text-red-600 text-xs" wire:click="removeClausolaContratto({{ $i }})">Rimuovi</button>
|
|
</div>
|
|
</div>
|
|
@empty
|
|
<div class="text-xs text-gray-500">Nessuna clausola associata al contratto.</div>
|
|
@endforelse
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
@elseif($tab === 'canoni')
|
|
<div class="space-y-3">
|
|
<div class="flex items-center justify-between">
|
|
<h3 class="text-sm font-semibold text-gray-700">Canoni (dovuti / pagati)</h3>
|
|
<div class="flex items-center gap-2">
|
|
<span class="text-xs text-gray-500">Dovuti: € {{ number_format($totali['dovuti'] ?? 0, 2, ',', '.') }} · Pagati: € {{ number_format($totali['pagati'] ?? 0, 2, ',', '.') }}</span>
|
|
<button type="button" class="px-3 py-2 text-xs rounded bg-blue-50 text-blue-700 border border-blue-200" wire:click="emitCanoniAutomatici">Emetti rate automatiche</button>
|
|
<button type="button" class="px-3 py-2 text-xs rounded bg-amber-50 text-amber-700 border border-amber-200" wire:click="cleanCanoniDuplicates">Pulisci duplicati</button>
|
|
</div>
|
|
</div>
|
|
<div class="overflow-x-auto border rounded-lg">
|
|
<table class="min-w-full text-xs">
|
|
<thead class="bg-gray-50">
|
|
<tr>
|
|
<th class="px-3 py-2 text-left">Periodo</th>
|
|
<th class="px-3 py-2 text-left">Emissione / Scadenza</th>
|
|
<th class="px-3 py-2 text-left">Stato</th>
|
|
<th class="px-3 py-2 text-right">Dovuto</th>
|
|
<th class="px-3 py-2 text-right">Pagato</th>
|
|
<th class="px-3 py-2 text-right">Saldo progressivo</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
@forelse($canoniRighe as $r)
|
|
@php
|
|
$d = (float)($r['totale_dovuto'] ?? 0);
|
|
$p = (float)($r['totale_pagato'] ?? 0);
|
|
@endphp
|
|
<tr class="border-t">
|
|
<td class="px-3 py-2">{{ $r['mese_descrizione'] ?? ($r['mese'] ?? '') }} {{ $r['anno'] ?? '' }}</td>
|
|
<td class="px-3 py-2">
|
|
<div>{{ $r['data_emissione'] ?? '—' }}</div>
|
|
<div class="text-[10px] text-gray-500">scad: {{ $r['data_scadenza'] ?? '—' }}</div>
|
|
</td>
|
|
<td class="px-3 py-2">
|
|
@if(($r['stato'] ?? '') === 'scaduto')
|
|
<span class="px-2 py-0.5 rounded bg-red-50 text-red-700 border border-red-200">Scaduto</span>
|
|
@elseif(($r['stato'] ?? '') === 'da_pagare')
|
|
<span class="px-2 py-0.5 rounded bg-amber-50 text-amber-700 border border-amber-200">Da pagare</span>
|
|
@elseif(($r['stato'] ?? '') === 'non_emesso')
|
|
<span class="px-2 py-0.5 rounded bg-slate-50 text-slate-700 border border-slate-200">Non emesso</span>
|
|
@else
|
|
<span class="px-2 py-0.5 rounded bg-emerald-50 text-emerald-700 border border-emerald-200">In regola</span>
|
|
@endif
|
|
</td>
|
|
<td class="px-3 py-2 text-right">€ {{ number_format($d, 2, ',', '.') }}</td>
|
|
<td class="px-3 py-2 text-right">
|
|
<div>€ {{ number_format($p, 2, ',', '.') }}</div>
|
|
@if(!empty($r['data_pagamento']))
|
|
<div class="text-[10px] text-gray-500">{{ $r['data_pagamento'] }}</div>
|
|
@endif
|
|
</td>
|
|
<td class="px-3 py-2 text-right">€ {{ number_format((float)($r['saldo_progressivo'] ?? 0), 2, ',', '.') }}</td>
|
|
</tr>
|
|
@empty
|
|
<tr><td colspan="6" class="px-3 py-2 text-gray-500">Nessun canone disponibile.</td></tr>
|
|
@endforelse
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
<div class="flex items-center justify-end text-xs text-gray-700">
|
|
<span class="px-2 py-1 bg-slate-50 border rounded">Saldo totale: € {{ number_format($totali['saldo'] ?? 0, 2, ',', '.') }}</span>
|
|
</div>
|
|
</div>
|
|
@elseif($tab === 'documenti')
|
|
<div class="grid grid-cols-1 lg:grid-cols-2 gap-6">
|
|
<div class="space-y-3">
|
|
<h3 class="text-sm font-semibold text-gray-700">Documenti contratto e parti</h3>
|
|
<div class="space-y-2">
|
|
<input type="file" wire:model="documentFile" class="w-full rounded-md border-gray-300" />
|
|
<select wire:model="documentInquilinoRow" class="w-full rounded-md border-gray-300">
|
|
<option value="">— Documento generico contratto —</option>
|
|
@foreach($inquilini as $idx => $inq)
|
|
<option value="{{ $idx }}">Inquilino: {{ $inq['nome_visualizzato'] ?? ('#' . ($idx + 1)) }}</option>
|
|
@endforeach
|
|
</select>
|
|
<input wire:model="documentDescrizione" placeholder="Descrizione" class="w-full rounded-md border-gray-300" />
|
|
<input type="date" wire:model="documentDataScadenza" class="w-full rounded-md border-gray-300" />
|
|
<button type="button" wire:click="uploadDocumento" class="px-3 py-2 text-xs rounded bg-emerald-50 text-emerald-700 border border-emerald-200">Carica documento</button>
|
|
</div>
|
|
</div>
|
|
<div class="space-y-3">
|
|
<h3 class="text-sm font-semibold text-gray-700">Documenti collegati allo stabile</h3>
|
|
<p class="text-xs text-gray-500">I documenti caricati (contratto, documenti parti, comunicazioni fine locazione) restano disponibili anche in scheda stabile.</p>
|
|
<a class="inline-flex items-center px-3 py-2 text-xs rounded bg-blue-50 text-blue-700 border border-blue-200" href="{{ \App\Filament\Pages\Condomini\StabilePage::getUrl(['tab' => 'documenti-collegati'], panel: 'admin-filament') }}">Apri documenti collegati</a>
|
|
</div>
|
|
</div>
|
|
@endif
|
|
</div>
|
|
</x-filament::page>
|