217 lines
7.2 KiB
PHP
Executable File
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);
|
|
}
|
|
}
|