240 lines
8.4 KiB
PHP
Executable File
240 lines
8.4 KiB
PHP
Executable File
<?php
|
|
|
|
namespace App\Http\Controllers\Admin;
|
|
|
|
use App\Http\Controllers\Controller;
|
|
use App\Models\Soggetto;
|
|
use App\Models\UnitaImmobiliare;
|
|
use App\Models\Proprieta;
|
|
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\Auth;
|
|
|
|
class RubricaController extends Controller
|
|
{
|
|
public function __construct()
|
|
{
|
|
$this->middleware('permission:view-rubrica');
|
|
}
|
|
|
|
public function index(Request $request)
|
|
{
|
|
// Per la rubrica globale, l'amministratore dovrebbe vedere tutte le anagrafiche
|
|
// a cui ha accesso tramite i suoi condomini.
|
|
// Per semplicità iniziale, mostriamo tutte le anagrafiche.
|
|
// In futuro, si potrebbe filtrare per anagrafiche associate a unità immobiliari
|
|
// dei condomini gestiti dall'amministratore corrente.
|
|
|
|
$query = Soggetto::query(); // La relazione con unità e stabili può essere caricata se necessario
|
|
|
|
if ($request->filled('search')) {
|
|
$search = $request->input('search');
|
|
$query->where(function ($q) use ($search) {
|
|
$q->where('nome', 'like', "%{$search}%")
|
|
->orWhere('cognome', 'like', "%{$search}%")
|
|
->orWhere('ragione_sociale', 'like', "%{$search}%")
|
|
->orWhere('email', 'like', "%{$search}%");
|
|
});
|
|
}
|
|
|
|
// Calcolo statistiche per l'integrazione con unità immobiliari
|
|
$totale_persone = Soggetto::count();
|
|
$persone_fisiche = Soggetto::where('tipo', 'F')->count();
|
|
$persone_giuridiche = Soggetto::where('tipo', 'G')->count();
|
|
|
|
// Persone con relazioni attive (collegate a unità immobiliari)
|
|
$con_relazioni_attive = Soggetto::whereHas('unitaImmobiliari')->count();
|
|
$senza_relazioni = $totale_persone - $con_relazioni_attive;
|
|
|
|
$statistiche = [
|
|
'totale_persone' => $totale_persone,
|
|
'persone_fisiche' => $persone_fisiche,
|
|
'persone_giuridiche' => $persone_giuridiche,
|
|
'con_relazioni_attive' => $con_relazioni_attive,
|
|
'senza_relazioni' => $senza_relazioni
|
|
];
|
|
|
|
$soggetti = $query->with('unitaImmobiliari.stabile')->orderBy('ragione_sociale')->orderBy('cognome')->orderBy('nome')->paginate(20);
|
|
return view('admin.rubrica.index', compact('soggetti', 'statistiche'));
|
|
}
|
|
|
|
/**
|
|
* Collega un soggetto ad un'unità immobiliare
|
|
*/
|
|
public function linkToUnit(Request $request, Soggetto $soggetto)
|
|
{
|
|
$request->validate([
|
|
'unita_immobiliare_id' => 'required|exists:unita_immobiliari,id_unita_immobiliare',
|
|
'tipo_diritto' => 'required|string',
|
|
'quota_numeratore' => 'nullable|integer|min:1',
|
|
'quota_denominatore' => 'nullable|integer|min:1',
|
|
'data_inizio' => 'nullable|date'
|
|
]);
|
|
|
|
// Verifica se il collegamento esiste già
|
|
$existing = Proprieta::where('soggetto_id', $soggetto->id)
|
|
->where('unita_immobiliare_id', $request->unita_immobiliare_id)
|
|
->where('tipo_diritto', $request->tipo_diritto)
|
|
->whereNull('data_fine')
|
|
->first();
|
|
|
|
if ($existing) {
|
|
return redirect()->back()->with('error', 'Collegamento già esistente per questo soggetto e unità immobiliare.');
|
|
}
|
|
|
|
// Crea il nuovo collegamento
|
|
Proprieta::create([
|
|
'soggetto_id' => $soggetto->id,
|
|
'unita_immobiliare_id' => $request->unita_immobiliare_id,
|
|
'tipo_diritto' => $request->tipo_diritto,
|
|
'quota_numeratore' => $request->quota_numeratore ?? 1000,
|
|
'quota_denominatore' => $request->quota_denominatore ?? 1000,
|
|
'data_inizio' => $request->data_inizio ?? now()->format('Y-m-d'),
|
|
]);
|
|
|
|
return redirect()->back()->with('success', 'Soggetto collegato con successo all\'unità immobiliare.');
|
|
}
|
|
|
|
/**
|
|
* API per ottenere le unità immobiliari
|
|
*/
|
|
public function getUnitaImmobiliari()
|
|
{
|
|
$unita = UnitaImmobiliare::with('stabile')
|
|
->select('id_unita_immobiliare', 'id_stabile', 'scala', 'interno', 'fabbricato')
|
|
->get()
|
|
->map(function ($u) {
|
|
return [
|
|
'id_unita_immobiliare' => $u->id_unita_immobiliare,
|
|
'stabile_nome' => $u->stabile->denominazione ?? 'N/A',
|
|
'scala' => $u->scala,
|
|
'interno' => $u->interno,
|
|
'fabbricato' => $u->fabbricato
|
|
];
|
|
});
|
|
|
|
return response()->json($unita);
|
|
}
|
|
|
|
/**
|
|
* Collega un soggetto a un'unità immobiliare
|
|
*/
|
|
public function collegaUnita(Request $request, $soggettoId)
|
|
{
|
|
$request->validate([
|
|
'unita_immobiliare_id' => 'required|exists:unita_immobiliari,id',
|
|
'tipo_diritto' => 'required|string',
|
|
'percentuale_possesso' => 'nullable|numeric|min:0|max:100',
|
|
'data_inizio' => 'nullable|date',
|
|
'data_fine' => 'nullable|date|after:data_inizio',
|
|
'note' => 'nullable|string'
|
|
]);
|
|
|
|
// Verifica se il collegamento esiste già
|
|
$existing = Proprieta::where('soggetto_id', $soggettoId)
|
|
->where('unita_immobiliare_id', $request->unita_immobiliare_id)
|
|
->whereNull('data_fine')
|
|
->first();
|
|
|
|
if ($existing) {
|
|
return response()->json([
|
|
'success' => false,
|
|
'message' => 'Collegamento già esistente tra questo soggetto e unità immobiliare.'
|
|
]);
|
|
}
|
|
|
|
// Crea il nuovo collegamento
|
|
Proprieta::create([
|
|
'soggetto_id' => $soggettoId,
|
|
'unita_immobiliare_id' => $request->unita_immobiliare_id,
|
|
'tipo_diritto' => $request->tipo_diritto,
|
|
'percentuale_possesso' => $request->percentuale_possesso,
|
|
'data_inizio' => $request->data_inizio ?: now(),
|
|
'data_fine' => $request->data_fine,
|
|
'note' => $request->note
|
|
]);
|
|
|
|
return response()->json([
|
|
'success' => true,
|
|
'message' => 'Soggetto collegato con successo all\'unità immobiliare.'
|
|
]);
|
|
}
|
|
|
|
/**
|
|
* Ottieni le unità immobiliari disponibili per il collegamento
|
|
*/
|
|
public function getUnitaDisponibili()
|
|
{
|
|
$unita = UnitaImmobiliare::with('stabile')
|
|
->select('id', 'id_stabile', 'scala', 'interno', 'fabbricato')
|
|
->get()
|
|
->map(function ($u) {
|
|
return [
|
|
'id' => $u->id,
|
|
'stabile_nome' => $u->stabile->denominazione ?? 'N/A',
|
|
'scala' => $u->scala,
|
|
'interno' => $u->interno,
|
|
'fabbricato' => $u->fabbricato
|
|
];
|
|
});
|
|
|
|
return response()->json($unita);
|
|
}
|
|
|
|
/**
|
|
* Mostra il form di modifica per un soggetto
|
|
*/
|
|
public function edit(Soggetto $soggetto)
|
|
{
|
|
return view('admin.rubrica.edit', compact('soggetto'));
|
|
}
|
|
|
|
/**
|
|
* Aggiorna i dati di un soggetto
|
|
*/
|
|
public function update(Request $request, Soggetto $soggetto)
|
|
{
|
|
$request->validate([
|
|
'nome' => 'nullable|string|max:255',
|
|
'cognome' => 'nullable|string|max:255',
|
|
'ragione_sociale' => 'nullable|string|max:255',
|
|
'codice_fiscale' => 'nullable|string|max:16',
|
|
'partita_iva' => 'nullable|string|max:11',
|
|
'email' => 'nullable|email|max:255',
|
|
'telefono' => 'nullable|string|max:20',
|
|
'indirizzo' => 'nullable|string|max:255',
|
|
'cap' => 'nullable|string|max:5',
|
|
'citta' => 'nullable|string|max:100',
|
|
'provincia' => 'nullable|string|max:2',
|
|
'tipo' => 'required|in:F,G'
|
|
]);
|
|
|
|
$soggetto->update($request->only([
|
|
'nome',
|
|
'cognome',
|
|
'ragione_sociale',
|
|
'codice_fiscale',
|
|
'partita_iva',
|
|
'email',
|
|
'telefono',
|
|
'indirizzo',
|
|
'cap',
|
|
'citta',
|
|
'provincia',
|
|
'tipo'
|
|
]));
|
|
|
|
return redirect()->route('admin.rubrica.index')
|
|
->with('success', 'Soggetto aggiornato con successo!');
|
|
}
|
|
|
|
/**
|
|
* Mostra i dettagli di un soggetto
|
|
*/
|
|
public function show(Soggetto $soggetto)
|
|
{
|
|
$soggetto->load('unitaImmobiliari.stabile');
|
|
return view('admin.rubrica.show', compact('soggetto'));
|
|
}
|
|
}
|