amministratore->id_amministratore ?? Auth::user()->id; $stabili = Stabile::where('amministratore_id', $amministratore_id) ->paginate(10); return view('admin.stabili.index', compact('stabili')); } /** * Show the form for creating a new resource. */ public function create() { return view('admin.stabili.create'); } /** * Store a newly created resource in storage. */ public function store(Request $request) { $request->validate([ 'denominazione' => 'required|string|max:255', 'codice_fiscale' => 'nullable|string|max:20|unique:stabili,codice_fiscale', 'cod_fisc_amministratore' => 'nullable|string|max:20', 'indirizzo' => 'required|string|max:255', 'citta' => 'required|string|max:255', 'cap' => 'required|string|max:10', 'provincia' => 'nullable|string|max:2', 'stato' => 'required|in:attivo,inattivo', 'note' => 'nullable|string', 'old_id' => 'nullable|integer|unique:stabili,old_id', ]); $stabile = Stabile::create([ 'amministratore_id' => Auth::user()->amministratore->id_amministratore ?? null, 'denominazione' => $request->denominazione, 'codice_fiscale' => $request->codice_fiscale, 'cod_fisc_amministratore' => $request->cod_fisc_amministratore, 'indirizzo' => $request->indirizzo, 'citta' => $request->citta, 'cap' => $request->cap, 'provincia' => $request->provincia, 'stato' => $request->stato, 'note' => $request->note, 'old_id' => $request->old_id, ]); return redirect()->route('admin.stabili.index') ->with('success', 'Stabile creato con successo.'); } /** * Display the specified resource. */ public function show(Stabile $stabile) { // L'utente è già autenticato se arriva qui tramite il sistema return view('admin.stabili.show', compact('stabile')); } /** * Show the form for editing the specified resource. */ public function edit(Stabile $stabile) { // Verifica che l'utente possa modificare questo stabile $amministratore_id = Auth::user()->amministratore->id_amministratore ?? Auth::user()->id; if ($stabile->amministratore_id !== $amministratore_id) { abort(403, 'Non hai i permessi per modificare questo stabile'); } // Usa la stessa vista della creazione ma passa lo stabile per il pre-popolamento return view('admin.stabili.create', compact('stabile')); } /** * Update the specified resource in storage. */ public function update(Request $request, Stabile $stabile) { // Verifica che l'utente possa modificare questo stabile $amministratore_id = Auth::user()->amministratore->id_amministratore ?? Auth::user()->id; if ($stabile->amministratore_id !== $amministratore_id) { abort(403, 'Non hai i permessi per modificare questo stabile'); } $request->validate([ 'denominazione' => 'required|string|max:255', 'codice_fiscale' => 'nullable|string|max:20|unique:stabili,codice_fiscale,' . $stabile->id_stabile . ',id_stabile', 'cod_fisc_amministratore' => 'nullable|string|max:20', 'indirizzo' => 'required|string|max:255', 'citta' => 'required|string|max:255', 'cap' => 'required|string|max:10', 'provincia' => 'nullable|string|max:2', 'stato' => 'required|in:attivo,inattivo', 'note' => 'nullable|string', 'old_id' => 'nullable|integer|unique:stabili,old_id,' . $stabile->id_stabile . ',id_stabile', ]); $stabile->update($request->all()); return redirect()->route('admin.stabili.index') ->with('success', 'Stabile aggiornato con successo.'); } /** * Remove the specified resource from storage. */ public function destroy(Stabile $stabile) { // Verifica che l'utente possa eliminare questo stabile if ($stabile->amministratore_id !== Auth::user()->amministratore->id_amministratore ?? null) { abort(403); } $stabile->delete(); return redirect()->route('admin.stabili.index') ->with('success', 'Stabile eliminato con successo.'); } /** * Get tabella millesimali details for Excel-like view (API) */ public function getTabellaMillesimaliDettagli(Stabile $stabile, $tabellaId) { if ($stabile->amministratore_id !== Auth::user()->amministratore->id_amministratore ?? null) { return response()->json(['error' => 'Unauthorized'], 403); } $tabella = $stabile->tabelleMillesimali()->with('dettagli.unitaImmobiliare')->findOrFail($tabellaId); $dettagli = $tabella->dettagli->map(function ($dettaglio) { return [ 'id' => $dettaglio->id, 'scala' => $dettaglio->unitaImmobiliare->scala ?? 'N/A', 'interno' => $dettaglio->unitaImmobiliare->interno ?? 'N/A', 'descrizione' => $dettaglio->unitaImmobiliare->descrizione ?? $dettaglio->descrizione_unita, 'millesimi' => (float)$dettaglio->millesimi, 'proprietario' => $dettaglio->unitaImmobiliare->getNomeProprietarioAttribute() ?? 'N/A' ]; }); $totaleMillesimi = $dettagli->sum('millesimi'); $bilanciato = abs($totaleMillesimi - 1000) < 0.01; return response()->json([ 'success' => true, 'tabella' => [ 'id' => $tabella->id, 'codice' => $tabella->codice_tabella, 'denominazione' => $tabella->denominazione ?: $tabella->nome_tabella, 'tipo' => $tabella->tipo_tabella ?: $tabella->tipo, 'totale_millesimi' => $totaleMillesimi, 'bilanciata' => $bilanciato, 'differenza' => $totaleMillesimi - 1000 ], 'dettagli' => $dettagli, 'statistiche' => [ 'unita_count' => $dettagli->count(), 'millesimo_medio' => $dettagli->count() > 0 ? $dettagli->avg('millesimi') : 0, 'millesimo_max' => $dettagli->max('millesimi') ?? 0, 'millesimo_min' => $dettagli->min('millesimi') ?? 0 ] ]); } /** * Update a single millesimo value (API) */ public function aggiornaMillesimo(Request $request, Stabile $stabile, $tabellaId) { if ($stabile->amministratore_id !== Auth::user()->amministratore->id_amministratore ?? null) { return response()->json(['error' => 'Unauthorized'], 403); } $request->validate([ 'dettaglio_id' => 'required|integer', 'nuovo_valore' => 'required|numeric|min:0' ]); $tabella = $stabile->tabelleMillesimali()->findOrFail($tabellaId); $dettaglio = $tabella->dettagli()->findOrFail($request->dettaglio_id); $vecchioValore = $dettaglio->millesimi; $dettaglio->update([ 'millesimi' => $request->nuovo_valore, 'modificato_da' => Auth::id() ]); // Ricalcola il totale della tabella $nuovoTotale = $tabella->dettagli()->sum('millesimi'); $tabella->update([ 'totale_millesimi' => $nuovoTotale, 'modificato_da' => Auth::id() ]); return response()->json([ 'success' => true, 'message' => 'Millesimo aggiornato con successo', 'vecchio_valore' => $vecchioValore, 'nuovo_valore' => $request->nuovo_valore, 'nuovo_totale' => $nuovoTotale, 'bilanciata' => abs($nuovoTotale - 1000) < 0.01 ]); } /** * Verify tabella millesimali balance (API) */ public function verificaBilanciamento(Stabile $stabile, $tabellaId) { if ($stabile->amministratore_id !== Auth::user()->amministratore->id_amministratore ?? null) { return response()->json(['error' => 'Unauthorized'], 403); } $tabella = $stabile->tabelleMillesimali()->findOrFail($tabellaId); $totaleMillesimi = $tabella->dettagli()->sum('millesimi'); $differenza = $totaleMillesimi - 1000; $bilanciata = abs($differenza) < 0.01; // Aggiorna il totale nella tabella $tabella->update([ 'totale_millesimi' => $totaleMillesimi, 'modificato_da' => Auth::id() ]); return response()->json([ 'success' => true, 'bilanciata' => $bilanciata, 'totale_millesimi' => $totaleMillesimi, 'differenza' => $differenza, 'messaggio' => $bilanciata ? 'La tabella è correttamente bilanciata!' : "La tabella non è bilanciata. Differenza: " . ($differenza > 0 ? '+' : '') . number_format($differenza, 4) ]); } /** * Get Unità Immobiliari for AJAX tab loading */ public function getUnitaImmobiliari(Stabile $stabile) { // Verifica autorizzazione if ($stabile->amministratore_id !== Auth::user()->amministratore->id_amministratore ?? null) { return response()->json(['error' => 'Unauthorized'], 403); } // Carica le unità immobiliari dello stabile $unitaImmobiliari = $stabile->unitaImmobiliari() ->orderBy('codice_interno') ->orderBy('piano') ->orderBy('appartamento') ->get(); // Genera l'HTML della tabella $html = view('admin.stabili.partials.unita-immobiliari-tab', compact('unitaImmobiliari', 'stabile'))->render(); return response()->json([ 'success' => true, 'html' => $html ]); } }