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