netgescon-day0/app/Http/Controllers/Admin/RubricaController.php

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'));
}
}