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