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

217 lines
7.2 KiB
PHP
Executable File

<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\Persona;
use App\Models\UnitaImmobiliare;
use App\Models\PersonaUnitaRelazione;
use App\Models\TipoRelazionePersonaUnita;
class PersonaUnitaController extends Controller
{
/**
* Gestione Relazioni Persona-Unità
*/
public function index(Request $request)
{
$query = PersonaUnitaRelazione::with(['persona', 'unitaImmobiliare.stabile', 'tipoRelazioneDettagli']);
// Filtri
if ($request->has('search') && $request->search) {
$search = $request->search;
$query->whereHas('persona', function ($q) use ($search) {
$q->where('cognome', 'like', "%{$search}%")
->orWhere('nome', 'like', "%{$search}%")
->orWhere('codice_fiscale', 'like', "%{$search}%");
});
}
if ($request->has('tipo_relazione') && $request->tipo_relazione) {
$query->where('tipo_relazione', $request->tipo_relazione);
}
if ($request->has('stabile_id') && $request->stabile_id) {
$query->whereHas('unitaImmobiliare', function ($q) use ($request) {
$q->where('stabile_id', $request->stabile_id);
});
}
// Solo relazioni attive per default
if (!$request->has('include_inactive')) {
$query->where('attivo', true);
}
$relazioni = $query->orderBy('created_at', 'desc')->paginate(20);
// Dati per i filtri
$tipiRelazione = TipoRelazionePersonaUnita::attivi()->ordinati()->get();
$stabili = \App\Models\Stabile::orderBy('denominazione')->get();
return view('admin.persona-unita.index', compact('relazioni', 'tipiRelazione', 'stabili'));
}
/**
* Crea nuova relazione
*/
public function create(Request $request)
{
$persona_id = $request->get('persona_id');
$unita_id = $request->get('unita_id');
$persone = Persona::attive()->orderBy('cognome')->get();
$unitaImmobiliari = UnitaImmobiliare::with('stabile')->orderBy('codice_unita')->get();
$tipiRelazione = TipoRelazionePersonaUnita::attivi()->ordinati()->get();
return view('admin.persona-unita.create', compact(
'persone',
'unitaImmobiliari',
'tipiRelazione',
'persona_id',
'unita_id'
));
}
/**
* Salva nuova relazione
*/
public function store(Request $request)
{
$validated = $request->validate([
'persona_id' => 'required|exists:persone,id',
'unita_id' => 'required|exists:unita_immobiliari,id',
'tipo_relazione' => 'required|string|max:50',
'quota_relazione' => 'nullable|numeric|min:0|max:100',
'data_inizio' => 'required|date',
'data_fine' => 'nullable|date|after:data_inizio',
'riceve_comunicazioni' => 'boolean',
'riceve_convocazioni' => 'boolean',
'vota_assemblea' => 'boolean',
'note_relazione' => 'nullable|string|max:1000'
]);
// Verifica se esiste già una relazione attiva dello stesso tipo
$esistente = PersonaUnitaRelazione::where('persona_id', $validated['persona_id'])
->where('unita_id', $validated['unita_id'])
->where('tipo_relazione', $validated['tipo_relazione'])
->where('attivo', true)
->whereNull('data_fine')
->first();
if ($esistente) {
return back()->withErrors([
'tipo_relazione' => 'Esiste già una relazione attiva di questo tipo tra la persona e l\'unità immobiliare.'
])->withInput();
}
PersonaUnitaRelazione::create($validated + [
'attivo' => true,
'riceve_comunicazioni' => $request->has('riceve_comunicazioni'),
'riceve_convocazioni' => $request->has('riceve_convocazioni'),
'vota_assemblea' => $request->has('vota_assemblea')
]);
return redirect()
->route('admin.persona-unita.index')
->with('success', 'Relazione persona-unità creata con successo.');
}
/**
* Visualizza dettagli relazione
*/
public function show(PersonaUnitaRelazione $personaUnita)
{
$personaUnita->load(['persona', 'unitaImmobiliare.stabile', 'tipoRelazione']);
return view('admin.persona-unita.show', compact('personaUnita'));
}
/**
* Modifica relazione
*/
public function edit(PersonaUnitaRelazione $personaUnita)
{
$persone = Persona::attive()->orderBy('cognome')->get();
$unitaImmobiliari = UnitaImmobiliare::with('stabile')->orderBy('codice_unita')->get();
$tipiRelazione = TipoRelazionePersonaUnita::attivi()->ordinati()->get();
return view('admin.persona-unita.edit', compact(
'personaUnita',
'persone',
'unitaImmobiliari',
'tipiRelazione'
));
}
/**
* Aggiorna relazione
*/
public function update(Request $request, PersonaUnitaRelazione $personaUnita)
{
$validated = $request->validate([
'quota_relazione' => 'nullable|numeric|min:0|max:100',
'data_fine' => 'nullable|date|after:data_inizio',
'riceve_comunicazioni' => 'boolean',
'riceve_convocazioni' => 'boolean',
'vota_assemblea' => 'boolean',
'note_relazione' => 'nullable|string|max:1000',
'attivo' => 'boolean'
]);
$personaUnita->update($validated + [
'riceve_comunicazioni' => $request->has('riceve_comunicazioni'),
'riceve_convocazioni' => $request->has('riceve_convocazioni'),
'vota_assemblea' => $request->has('vota_assemblea'),
'attivo' => $request->has('attivo')
]);
return redirect()
->route('admin.persona-unita.show', $personaUnita)
->with('success', 'Relazione aggiornata con successo.');
}
/**
* Termina relazione (soft delete)
*/
public function destroy(PersonaUnitaRelazione $personaUnita)
{
$personaUnita->update([
'attivo' => false,
'data_fine' => now()->toDateString()
]);
return redirect()
->route('admin.persona-unita.index')
->with('success', 'Relazione terminata con successo.');
}
/**
* API: Ottieni unità per persona
*/
public function getUnitaByPersona(Persona $persona)
{
$unita = $persona->unitaImmobiliari()
->with(['stabile', 'relazioni' => function ($query) use ($persona) {
$query->where('persona_id', $persona->id)->where('attivo', true);
}])
->get();
return response()->json($unita);
}
/**
* API: Ottieni persone per unità
*/
public function getPersoneByUnita(UnitaImmobiliare $unita)
{
$persone = $unita->persone()
->with(['relazioni' => function ($query) use ($unita) {
$query->where('unita_id', $unita->id)->where('attivo', true);
}])
->get();
return response()->json($persone);
}
}