get('stabile_id'); if (!$stabileId) { return redirect()->route('admin.stabili.index') ->with('error', 'Seleziona prima uno stabile per gestire le palazzine'); } $stabile = Stabile::findOrFail($stabileId); $palazzine = Palazzina::where('stabile_id', $stabileId) ->with('unitaImmobiliari') ->orderBy('codice_palazzina') ->paginate(10); return view('admin.palazzine.index', compact('palazzine', 'stabile')); } /** * Show the form for creating a new resource. */ public function create(Request $request) { $stabileId = $request->get('stabile_id'); if (!$stabileId) { return redirect()->route('admin.stabili.index') ->with('error', 'Seleziona prima uno stabile'); } $stabile = Stabile::findOrFail($stabileId); return view('admin.palazzine.create', compact('stabile')); } /** * Store a newly created resource in storage. */ public function store(Request $request) { $request->validate([ 'stabile_id' => 'required|exists:stabili,id', 'codice_palazzina' => 'required|string|max:10', 'denominazione' => 'nullable|string|max:255', 'numero_scale' => 'required|integer|min:1', 'numero_piani_fuori_terra' => 'required|integer|min:0', 'numero_piani_interrati' => 'required|integer|min:0', 'ha_piano_terra' => 'boolean', 'appartamenti_per_piano' => 'required|integer|min:1', 'superficie_totale' => 'nullable|numeric|min:0', 'anno_costruzione' => 'nullable|integer|min:1800|max:' . date('Y'), 'stato_conservazione' => 'required|in:ottimo,buono,discreto,da_ristrutturare', ], [ 'codice_palazzina.required' => 'Il codice palazzina è obbligatorio', 'numero_scale.required' => 'Il numero di scale è obbligatorio', 'numero_piani_fuori_terra.required' => 'Il numero di piani è obbligatorio', 'appartamenti_per_piano.required' => 'Il numero di appartamenti per piano è obbligatorio', ]); // Verifica unicità del codice palazzina per questo stabile $exists = Palazzina::where('stabile_id', $request->stabile_id) ->where('codice_palazzina', $request->codice_palazzina) ->exists(); if ($exists) { return back()->withErrors([ 'codice_palazzina' => 'Questo codice palazzina esiste già per questo stabile' ])->withInput(); } DB::beginTransaction(); try { $palazzina = Palazzina::create([ 'stabile_id' => $request->stabile_id, 'codice_palazzina' => $request->codice_palazzina, 'denominazione' => $request->denominazione, 'descrizione' => $request->descrizione, 'numero_scale' => $request->numero_scale, 'numero_piani_fuori_terra' => $request->numero_piani_fuori_terra, 'numero_piani_interrati' => $request->numero_piani_interrati, 'ha_piano_terra' => $request->has('ha_piano_terra'), 'appartamenti_per_piano' => $request->appartamenti_per_piano, 'superficie_totale' => $request->superficie_totale, 'anno_costruzione' => $request->anno_costruzione, 'anno_ultima_ristrutturazione' => $request->anno_ultima_ristrutturazione, 'stato_conservazione' => $request->stato_conservazione, 'sezione_urbana' => $request->sezione_urbana, 'foglio' => $request->foglio, 'particella' => $request->particella, 'tipo_riscaldamento' => $request->tipo_riscaldamento ?? 'centralizzato', 'ha_ascensore' => $request->has('ha_ascensore'), 'numero_ascensori' => $request->has('ha_ascensore') ? ($request->numero_ascensori ?? 1) : 0, 'ha_montacarichi' => $request->has('ha_montacarichi'), 'ha_videocitofono' => $request->has('ha_videocitofono'), 'ha_impianto_allarme' => $request->has('ha_impianto_allarme'), 'accessibile_disabili' => $request->has('accessibile_disabili'), 'note_accessibilita' => $request->note_accessibilita, 'posti_auto_coperti' => $request->posti_auto_coperti ?? 0, 'posti_auto_scoperti' => $request->posti_auto_scoperti ?? 0, 'ha_giardino_comune' => $request->has('ha_giardino_comune'), 'mq_giardino_comune' => $request->has('ha_giardino_comune') ? $request->mq_giardino_comune : null, 'ha_terrazza_comune' => $request->has('ha_terrazza_comune'), 'mq_terrazza_comune' => $request->has('ha_terrazza_comune') ? $request->mq_terrazza_comune : null, 'ha_locale_caldaia' => $request->has('ha_locale_caldaia'), 'ha_locale_contatori' => $request->has('ha_locale_contatori'), 'ha_locale_bici' => $request->has('ha_locale_bici'), 'ha_lavanderia' => $request->has('ha_lavanderia'), 'altri_locali_comuni' => $request->altri_locali_comuni, 'note' => $request->note, 'created_by' => Auth::id(), ]); // Se richiesto, genera automaticamente le unità immobiliari if ($request->has('genera_unita_automaticamente')) { $numeroUnita = $palazzina->eseguiGenerazioneUnita(); DB::commit(); return redirect()->route('admin.palazzine.show', $palazzina) ->with('success', "Palazzina creata con successo! Generate automaticamente {$numeroUnita} unità immobiliari."); } DB::commit(); return redirect()->route('admin.palazzine.index', ['stabile_id' => $request->stabile_id]) ->with('success', 'Palazzina creata con successo!'); } catch (\Exception $e) { DB::rollback(); return back()->withErrors([ 'error' => 'Errore durante la creazione della palazzina: ' . $e->getMessage() ])->withInput(); } } /** * Display the specified resource. */ public function show(Palazzina $palazzina) { $palazzina->load(['stabile', 'unitaImmobiliari' => function ($query) { $query->orderBy('scala')->orderBy('piano')->orderBy('interno'); }]); $statistiche = [ 'totale_unita_teoriche' => $palazzina->numero_teorico_unita, 'totale_unita_effettive' => $palazzina->numero_effettivo_unita, 'unita_occupate' => $palazzina->unitaImmobiliari()->where('stato_occupazione', 'occupata_proprietario')->count(), 'unita_libere' => $palazzina->unitaImmobiliari()->where('stato_occupazione', 'libera')->count(), 'superficie_spazi_comuni' => $palazzina->superficie_spazi_comuni, ]; return view('admin.palazzine.show', compact('palazzina', 'statistiche')); } /** * Show the form for editing the specified resource. */ public function edit(Palazzina $palazzina) { return view('admin.palazzine.edit', compact('palazzina')); } /** * Update the specified resource in storage. */ public function update(Request $request, Palazzina $palazzina) { $request->validate([ 'codice_palazzina' => 'required|string|max:10', 'denominazione' => 'nullable|string|max:255', 'numero_scale' => 'required|integer|min:1', 'numero_piani_fuori_terra' => 'required|integer|min:0', 'numero_piani_interrati' => 'required|integer|min:0', 'ha_piano_terra' => 'boolean', 'appartamenti_per_piano' => 'required|integer|min:1', 'superficie_totale' => 'nullable|numeric|min:0', 'anno_costruzione' => 'nullable|integer|min:1800|max:' . date('Y'), 'stato_conservazione' => 'required|in:ottimo,buono,discreto,da_ristrutturare', ]); // Verifica unicità del codice palazzina per questo stabile (escludendo la palazzina corrente) $exists = Palazzina::where('stabile_id', $palazzina->stabile_id) ->where('codice_palazzina', $request->codice_palazzina) ->where('id', '!=', $palazzina->id) ->exists(); if ($exists) { return back()->withErrors([ 'codice_palazzina' => 'Questo codice palazzina esiste già per questo stabile' ])->withInput(); } try { $palazzina->update([ 'codice_palazzina' => $request->codice_palazzina, 'denominazione' => $request->denominazione, 'descrizione' => $request->descrizione, 'numero_scale' => $request->numero_scale, 'numero_piani_fuori_terra' => $request->numero_piani_fuori_terra, 'numero_piani_interrati' => $request->numero_piani_interrati, 'ha_piano_terra' => $request->has('ha_piano_terra'), 'appartamenti_per_piano' => $request->appartamenti_per_piano, 'superficie_totale' => $request->superficie_totale, 'anno_costruzione' => $request->anno_costruzione, 'anno_ultima_ristrutturazione' => $request->anno_ultima_ristrutturazione, 'stato_conservazione' => $request->stato_conservazione, 'sezione_urbana' => $request->sezione_urbana, 'foglio' => $request->foglio, 'particella' => $request->particella, 'tipo_riscaldamento' => $request->tipo_riscaldamento ?? 'centralizzato', 'ha_ascensore' => $request->has('ha_ascensore'), 'numero_ascensori' => $request->has('ha_ascensore') ? ($request->numero_ascensori ?? 1) : 0, 'ha_montacarichi' => $request->has('ha_montacarichi'), 'ha_videocitofono' => $request->has('ha_videocitofono'), 'ha_impianto_allarme' => $request->has('ha_impianto_allarme'), 'accessibile_disabili' => $request->has('accessibile_disabili'), 'note_accessibilita' => $request->note_accessibilita, 'posti_auto_coperti' => $request->posti_auto_coperti ?? 0, 'posti_auto_scoperti' => $request->posti_auto_scoperti ?? 0, 'ha_giardino_comune' => $request->has('ha_giardino_comune'), 'mq_giardino_comune' => $request->has('ha_giardino_comune') ? $request->mq_giardino_comune : null, 'ha_terrazza_comune' => $request->has('ha_terrazza_comune'), 'mq_terrazza_comune' => $request->has('ha_terrazza_comune') ? $request->mq_terrazza_comune : null, 'ha_locale_caldaia' => $request->has('ha_locale_caldaia'), 'ha_locale_contatori' => $request->has('ha_locale_contatori'), 'ha_locale_bici' => $request->has('ha_locale_bici'), 'ha_lavanderia' => $request->has('ha_lavanderia'), 'altri_locali_comuni' => $request->altri_locali_comuni, 'note' => $request->note, 'updated_by' => Auth::id(), ]); return redirect()->route('admin.palazzine.show', $palazzina) ->with('success', 'Palazzina aggiornata con successo!'); } catch (\Exception $e) { return back()->withErrors([ 'error' => 'Errore durante l\'aggiornamento della palazzina: ' . $e->getMessage() ])->withInput(); } } /** * Remove the specified resource from storage. */ public function destroy(Palazzina $palazzina) { try { $stabileId = $palazzina->stabile_id; $numeroUnita = $palazzina->unitaImmobiliari()->count(); if ($numeroUnita > 0) { return back()->with( 'error', "Impossibile eliminare la palazzina: contiene {$numeroUnita} unità immobiliari. Eliminale prima di procedere." ); } $palazzina->delete(); return redirect()->route('admin.palazzine.index', ['stabile_id' => $stabileId]) ->with('success', 'Palazzina eliminata con successo!'); } catch (\Exception $e) { return back()->with('error', 'Errore durante l\'eliminazione: ' . $e->getMessage()); } } /** * Genera automaticamente le unità immobiliari per una palazzina */ public function generaUnita(Palazzina $palazzina) { try { $numeroUnita = $palazzina->eseguiGenerazioneUnita(); return redirect()->route('admin.palazzine.show', $palazzina) ->with('success', "Generate automaticamente {$numeroUnita} unità immobiliari!"); } catch (\Exception $e) { return back()->with('error', 'Errore durante la generazione: ' . $e->getMessage()); } } /** * Mostra l'anteprima delle unità che verranno generate */ public function anteprimaGenerazione(Palazzina $palazzina) { $unitaDaGenerare = $palazzina->generaUnitaImmobiliari(); return view('admin.palazzine.anteprima-generazione', compact('palazzina', 'unitaDaGenerare')); } }