netgescon-day0/resources/views/admin/gescon-import/tabs/soggetti.blade.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>