434 lines
20 KiB
PHP
434 lines
20 KiB
PHP
<!-- FILTRI E RICERCA SOGGETTI (stile NetGescon) -->
|
|
<div class="netgescon-card mb-3">
|
|
<form class="grid md:grid-cols-12 gap-3 items-end">
|
|
<div class="col-span-12 md:col-span-4">
|
|
<label class="form-label" for="search_soggetti">Ricerca Soggetti</label>
|
|
<input type="text" class="netgescon-input" id="search_soggetti" placeholder="Nome, cognome, codice fiscale...">
|
|
</div>
|
|
<div class="col-span-6 md:col-span-2">
|
|
<label class="form-label" for="filter_tipo_soggetto">Tipo</label>
|
|
<select class="netgescon-input" id="filter_tipo_soggetto">
|
|
<option value="">Tutti</option>
|
|
<option value="proprietario">Proprietari</option>
|
|
<option value="inquilino">Inquilini</option>
|
|
</select>
|
|
</div>
|
|
<div class="col-span-12 md:col-span-3">
|
|
<label class="form-label" for="filter_stabile_soggetti">Stabile</label>
|
|
<select class="netgescon-input" id="filter_stabile_soggetti">
|
|
<option value="">Tutti gli stabili</option>
|
|
@foreach(($stabiliList ?? []) as $stabile)
|
|
<option value="{{ $stabile->id }}">{{ $stabile->denominazione }}</option>
|
|
@endforeach
|
|
</select>
|
|
</div>
|
|
<div class="col-span-6 md:col-span-1">
|
|
<label class="form-label" for="filter_stato_soggetto">Stato</label>
|
|
<select class="netgescon-input" id="filter_stato_soggetto">
|
|
<option value="">Tutti</option>
|
|
<option value="attivo">Attivi</option>
|
|
<option value="non_attivo">Non attivi</option>
|
|
</select>
|
|
</div>
|
|
<div class="col-span-6 md:col-span-2">
|
|
<button type="button" class="netgescon-btn netgescon-btn-primary" onclick="filterSoggetti()">
|
|
<i class="mdi mdi-magnify me-1"></i> Filtra
|
|
</button>
|
|
</div>
|
|
</form>
|
|
<div class="mt-2 flex gap-2">
|
|
<button type="button" class="netgescon-btn netgescon-btn-outline-primary netgescon-btn-sm" onclick="openStagingPanel_condomini()">
|
|
<i class="mdi mdi-database-import me-1"></i> Staging MDB
|
|
</button>
|
|
<button type="button" class="netgescon-btn netgescon-btn-outline-secondary netgescon-btn-sm" onclick="resetFiltersSoggetti()">
|
|
<i class="mdi mdi-refresh me-1"></i> Reset
|
|
</button>
|
|
<button type="button" class="netgescon-btn netgescon-btn-outline-success netgescon-btn-sm" onclick="exportSoggetti()">
|
|
<i class="mdi mdi-file-excel me-1"></i> Esporta Excel
|
|
</button>
|
|
</div>
|
|
</div>
|
|
|
|
@include('admin.gescon-import.partials.staging-panel', [
|
|
'context' => 'condomini',
|
|
'title' => 'Staging MDB Condomini → DB (gescon_import)'
|
|
])
|
|
|
|
<!-- STATISTICHE SOGGETTI -->
|
|
<div class="row mb-3">
|
|
<div class="col-md-3">
|
|
<div class="info-box bg-primary">
|
|
<span class="info-box-icon"><i class="mdi mdi-account-multiple"></i></span>
|
|
<div class="info-box-content">
|
|
<span class="info-box-text">Totale Soggetti</span>
|
|
<span class="info-box-number">{{ number_format($stats['soggetti']['totali']) }}</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="col-md-3">
|
|
<div class="info-box bg-success">
|
|
<span class="info-box-icon"><i class="mdi mdi-account-key"></i></span>
|
|
<div class="info-box-content">
|
|
<span class="info-box-text">Proprietari</span>
|
|
<span class="info-box-number">{{ number_format($stats['soggetti']['proprietari']) }}</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="col-md-3">
|
|
<div class="info-box bg-info">
|
|
<span class="info-box-icon"><i class="mdi mdi-account-clock"></i></span>
|
|
<div class="info-box-content">
|
|
<span class="info-box-text">Inquilini</span>
|
|
<span class="info-box-number">{{ number_format($stats['soggetti']['inquilini']) }}</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="col-md-3">
|
|
<div class="info-box bg-warning">
|
|
<span class="info-box-icon"><i class="mdi mdi-alert-circle"></i></span>
|
|
<div class="info-box-content">
|
|
<span class="info-box-text">Da Verificare</span>
|
|
<span class="info-box-number">{{ number_format($stats['soggetti']['da_verificare'] ?? 0) }}</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- TABELLA SOGGETTI -->
|
|
<div class="netgescon-card">
|
|
<div class="netgescon-card-header flex justify-between items-center">
|
|
<h3 class="card-title mb-0">
|
|
<i class="mdi mdi-account-group me-2"></i>
|
|
Lista Soggetti Importati
|
|
<span class="text-sm text-gray-500">({{ number_format($soggetti->total()) }})</span>
|
|
</h3>
|
|
<div class="flex gap-2">
|
|
<button type="button" class="netgescon-btn netgescon-btn-sm netgescon-btn-outline-success" onclick="exportSoggetti()">
|
|
<i class="mdi mdi-file-excel"></i> Esporta
|
|
</button>
|
|
<button type="button" class="netgescon-btn netgescon-btn-sm netgescon-btn-outline-primary" onclick="addSoggetto()">
|
|
<i class="mdi mdi-plus"></i> Nuovo
|
|
</button>
|
|
</div>
|
|
</div>
|
|
<div class="netgescon-card-body p-0">
|
|
<div class="table-responsive">
|
|
<table class="table table-striped table-hover">
|
|
<thead class="table-dark">
|
|
<tr>
|
|
<th>
|
|
<input type="checkbox" id="select_all_soggetti" onchange="toggleSelectAllSoggetti()">
|
|
</th>
|
|
<th>Anagrafica</th>
|
|
<th>Tipo</th>
|
|
<th>Contatti</th>
|
|
<th>Unità Associate</th>
|
|
<th>Millesimi</th>
|
|
<th>Data Import</th>
|
|
<th>Stato</th>
|
|
<th>Azioni</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody id="soggetti_tbody">
|
|
@forelse($soggetti as $soggetto)
|
|
<tr>
|
|
<td>
|
|
<input type="checkbox" class="soggetto_checkbox" value="{{ $soggetto->id }}">
|
|
</td>
|
|
<td>
|
|
<div>
|
|
<strong>{{ $soggetto->cognome }} {{ $soggetto->nome }}</strong>
|
|
@if($soggetto->codice_fiscale)
|
|
<br><small class="text-gray-500">CF: {{ strtoupper($soggetto->codice_fiscale) }}</small>
|
|
@endif
|
|
@if($soggetto->data_nascita)
|
|
<br><small class="text-gray-500">Nato il {{ $soggetto->data_nascita->format('d/m/Y') }}</small>
|
|
@endif
|
|
</div>
|
|
</td>
|
|
<td>
|
|
@if($soggetto->tipo == 'proprietario')
|
|
<span class="netgescon-badge netgescon-badge-success">
|
|
<i class="mdi mdi-account-key me-1"></i>Proprietario
|
|
</span>
|
|
@elseif($soggetto->tipo == 'inquilino')
|
|
<span class="netgescon-badge netgescon-badge-info">
|
|
<i class="mdi mdi-account-clock me-1"></i>Inquilino
|
|
</span>
|
|
@else
|
|
<span class="netgescon-badge netgescon-badge-secondary">
|
|
<i class="mdi mdi-account me-1"></i>{{ ucfirst($soggetto->tipo) }}
|
|
</span>
|
|
@endif
|
|
</td>
|
|
<td>
|
|
@if($soggetto->telefono || $soggetto->email)
|
|
@if($soggetto->telefono)
|
|
<div><i class="mdi mdi-phone me-1"></i>{{ $soggetto->telefono }}</div>
|
|
@endif
|
|
@if($soggetto->email)
|
|
<div><i class="mdi mdi-email me-1"></i>{{ $soggetto->email }}</div>
|
|
@endif
|
|
@else
|
|
<span class="text-gray-500">Nessun contatto</span>
|
|
@endif
|
|
</td>
|
|
<td>
|
|
@if($soggetto->unitaImmobiliari && $soggetto->unitaImmobiliari->count() > 0)
|
|
<div class="flex flex-col">
|
|
@foreach($soggetto->unitaImmobiliari->take(2) as $unita)
|
|
<small class="mb-1">
|
|
<span class="netgescon-badge">{{ $unita->codice_unita }}</span>
|
|
{{ $unita->stabile->denominazione ?? 'N/A' }}
|
|
</small>
|
|
@endforeach
|
|
@if($soggetto->unitaImmobiliari->count() > 2)
|
|
<small class="text-gray-500">
|
|
+{{ $soggetto->unitaImmobiliari->count() - 2 }} altre...
|
|
</small>
|
|
@endif
|
|
</div>
|
|
@else
|
|
<span class="text-gray-500">Nessuna unità</span>
|
|
@endif
|
|
</td>
|
|
<td class="text-center">
|
|
@php
|
|
$totalMillesimi = $soggetto->unitaImmobiliari->sum('millesimi_proprieta');
|
|
@endphp
|
|
@if($totalMillesimi > 0)
|
|
<span class="netgescon-badge netgescon-badge-primary">
|
|
{{ number_format($totalMillesimi, 0) }}‰
|
|
</span>
|
|
@else
|
|
<span class="netgescon-badge netgescon-badge-warning">N/D</span>
|
|
@endif
|
|
</td>
|
|
<td>
|
|
<small>{{ $soggetto->created_at->format('d/m/Y H:i') }}</small>
|
|
@if($soggetto->updated_at != $soggetto->created_at)
|
|
<br><small class="text-gray-500">Mod: {{ $soggetto->updated_at->format('d/m/Y') }}</small>
|
|
@endif
|
|
</td>
|
|
<td>
|
|
@if($soggetto->attivo)
|
|
<span class="netgescon-badge netgescon-badge-success">Attivo</span>
|
|
@else
|
|
<span class="netgescon-badge netgescon-badge-danger">Non attivo</span>
|
|
@endif
|
|
</td>
|
|
<td>
|
|
<div class="btn-group btn-group-sm">
|
|
<button type="button" class="netgescon-btn netgescon-btn-info" onclick="viewSoggetto({{ $soggetto->id }})" title="Visualizza dettagli">
|
|
<i class="mdi mdi-eye"></i>
|
|
</button>
|
|
<button type="button" class="netgescon-btn netgescon-btn-warning" onclick="editSoggetto({{ $soggetto->id }})" title="Modifica">
|
|
<i class="mdi mdi-pencil"></i>
|
|
</button>
|
|
<button type="button" class="netgescon-btn netgescon-btn-success" onclick="viewSoggettoUnita({{ $soggetto->id }})" title="Visualizza unità">
|
|
<i class="mdi mdi-home-variant"></i>
|
|
</button>
|
|
<div class="btn-group" role="group">
|
|
<button type="button" class="netgescon-btn netgescon-btn-secondary dropdown-toggle" data-bs-toggle="dropdown">
|
|
<i class="mdi mdi-dots-vertical"></i>
|
|
</button>
|
|
<ul class="dropdown-menu">
|
|
<li><a class="dropdown-item" href="#" onclick="duplicateSoggetto({{ $soggetto->id }})">
|
|
<i class="mdi mdi-content-copy me-1"></i> Duplica
|
|
</a></li>
|
|
<li><a class="dropdown-item" href="#" onclick="sendEmail({{ $soggetto->id }})">
|
|
<i class="mdi mdi-email-send me-1"></i> Invia Email
|
|
</a></li>
|
|
<li><a class="dropdown-item" href="#" onclick="exportSoggettoData({{ $soggetto->id }})">
|
|
<i class="mdi mdi-download me-1"></i> Esporta Dati
|
|
</a></li>
|
|
<li><hr class="dropdown-divider"></li>
|
|
<li><a class="dropdown-item text-danger" href="#" onclick="deleteSoggetto({{ $soggetto->id }})">
|
|
<i class="mdi mdi-delete me-1"></i> Elimina
|
|
</a></li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
</td>
|
|
</tr>
|
|
@empty
|
|
<tr>
|
|
<td colspan="9" class="text-center text-gray-500 py-4">
|
|
<i class="mdi mdi-information-outline"></i>
|
|
Nessun soggetto trovato
|
|
</td>
|
|
</tr>
|
|
@endforelse
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
@if($soggetti->hasPages())
|
|
<div class="netgescon-card-footer">
|
|
<div class="flex justify-between items-center">
|
|
<div>
|
|
Mostrando {{ $soggetti->firstItem() }} - {{ $soggetti->lastItem() }} di {{ number_format($soggetti->total()) }} risultati
|
|
</div>
|
|
<div>
|
|
{{ $soggetti->links() }}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
@endif
|
|
</div>
|
|
|
|
<!-- AZIONI BATCH SOGGETTI -->
|
|
<div class="row mt-3" id="batch_actions_soggetti" style="display: none;">
|
|
<div class="col-12">
|
|
<div class="netgescon-card bg-gray-100">
|
|
<div class="netgescon-card-body">
|
|
<h5>Azioni per <span id="selected_count_soggetti">0</span> soggetti selezionati:</h5>
|
|
<div class="btn-group">
|
|
<button type="button" class="netgescon-btn netgescon-btn-success" onclick="activateSelectedSoggetti()">
|
|
<i class="mdi mdi-check-circle"></i> Attiva Selezionati
|
|
</button>
|
|
<button type="button" class="netgescon-btn netgescon-btn-warning" onclick="deactivateSelectedSoggetti()">
|
|
<i class="mdi mdi-pause-circle"></i> Disattiva Selezionati
|
|
</button>
|
|
<button type="button" class="netgescon-btn netgescon-btn-info" onclick="exportSelectedSoggetti()">
|
|
<i class="mdi mdi-file-excel"></i> Esporta Selezionati
|
|
</button>
|
|
<button type="button" class="netgescon-btn netgescon-btn-primary" onclick="sendBulkEmail()">
|
|
<i class="mdi mdi-email-multiple"></i> Invia Email Multipla
|
|
</button>
|
|
<button type="button" class="netgescon-btn netgescon-btn-danger" onclick="deleteSelectedSoggetti()">
|
|
<i class="mdi mdi-delete"></i> Elimina Selezionati
|
|
</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- MODAL DETTAGLI SOGGETTO -->
|
|
<div class="modal fade" id="soggettoDetailModal" tabindex="-1">
|
|
<div class="modal-dialog modal-xl">
|
|
<div class="modal-content">
|
|
<div class="modal-header">
|
|
<h5 class="modal-title">
|
|
<i class="mdi mdi-account me-2"></i>
|
|
Dettagli Soggetto
|
|
</h5>
|
|
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
|
|
</div>
|
|
<div class="modal-body" id="soggettoDetailContent">
|
|
<!-- Content loaded via AJAX -->
|
|
</div>
|
|
<div class="modal-footer">
|
|
<button type="button" class="netgescon-btn netgescon-btn-secondary" data-bs-dismiss="modal">Chiudi</button>
|
|
<button type="button" class="netgescon-btn netgescon-btn-primary" onclick="editFromModalSoggetto()">Modifica</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<script>
|
|
// Funzioni JavaScript per gestione soggetti
|
|
function filterSoggetti() {
|
|
const search = document.getElementById('search_soggetti').value;
|
|
const tipo = document.getElementById('filter_tipo_soggetto').value;
|
|
const stabile = document.getElementById('filter_stabile_soggetti').value;
|
|
const stato = document.getElementById('filter_stato_soggetto').value;
|
|
|
|
// Implementare filtro AJAX
|
|
console.log('Filtering soggetti:', { search, tipo, stabile, stato });
|
|
}
|
|
|
|
function resetFiltersSoggetti() {
|
|
document.getElementById('search_soggetti').value = '';
|
|
document.getElementById('filter_tipo_soggetto').value = '';
|
|
document.getElementById('filter_stabile_soggetti').value = '';
|
|
document.getElementById('filter_stato_soggetto').value = '';
|
|
filterSoggetti();
|
|
}
|
|
|
|
function toggleSelectAllSoggetti() {
|
|
const masterCheckbox = document.getElementById('select_all_soggetti');
|
|
const checkboxes = document.querySelectorAll('.soggetto_checkbox');
|
|
|
|
checkboxes.forEach(checkbox => {
|
|
checkbox.checked = masterCheckbox.checked;
|
|
});
|
|
|
|
updateBatchActionsSoggetti();
|
|
}
|
|
|
|
function updateBatchActionsSoggetti() {
|
|
const selected = document.querySelectorAll('.soggetto_checkbox:checked').length;
|
|
const batchActions = document.getElementById('batch_actions_soggetti');
|
|
const selectedCount = document.getElementById('selected_count_soggetti');
|
|
|
|
if (selected > 0) {
|
|
batchActions.style.display = 'block';
|
|
selectedCount.textContent = selected;
|
|
} else {
|
|
batchActions.style.display = 'none';
|
|
}
|
|
}
|
|
|
|
function viewSoggetto(id) {
|
|
// Load soggetto details via AJAX
|
|
fetch(`/admin/soggetti/${id}`)
|
|
.then(response => response.json())
|
|
.then(data => {
|
|
document.getElementById('soggettoDetailContent').innerHTML = data.html;
|
|
new bootstrap.Modal(document.getElementById('soggettoDetailModal')).show();
|
|
});
|
|
}
|
|
|
|
function editSoggetto(id) {
|
|
window.location.href = `/admin/soggetti/${id}/edit`;
|
|
}
|
|
|
|
function viewSoggettoUnita(id) {
|
|
// Switch to unita tab with filter for this soggetto
|
|
const unitaTab = new bootstrap.Tab(document.querySelector('#unita-tab'));
|
|
unitaTab.show();
|
|
// Apply filter for this soggetto
|
|
setTimeout(() => {
|
|
if (window.filterUnitaBySoggetto) {
|
|
window.filterUnitaBySoggetto(id);
|
|
}
|
|
}, 100);
|
|
}
|
|
|
|
function addSoggetto() {
|
|
window.location.href = '/admin/soggetti/create';
|
|
}
|
|
|
|
function deleteSoggetto(id) {
|
|
if (confirm('Sei sicuro di voler eliminare questo soggetto? Verranno rimosse anche le associazioni con le unità immobiliari.')) {
|
|
// Implement delete via AJAX
|
|
console.log('Delete soggetto:', id);
|
|
}
|
|
}
|
|
|
|
function sendEmail(id) {
|
|
// Implement email sending
|
|
console.log('Send email to soggetto:', id);
|
|
}
|
|
|
|
function exportSoggetti() {
|
|
window.location.href = '/admin/gescon-import/export/soggetti';
|
|
}
|
|
|
|
// Event listeners per soggetti
|
|
document.addEventListener('DOMContentLoaded', function() {
|
|
// Add change listeners to checkboxes
|
|
document.querySelectorAll('.soggetto_checkbox').forEach(checkbox => {
|
|
checkbox.addEventListener('change', updateBatchActionsSoggetti);
|
|
});
|
|
});
|
|
|
|
// Global function for filtering by stabile (called from stabili tab)
|
|
window.filterSoggettiByStabile = function(stabileId) {
|
|
document.getElementById('filter_stabile_soggetti').value = stabileId;
|
|
filterSoggetti();
|
|
};
|
|
</script>
|