netgescon-master/app/Http/Controllers/Admin/PalazzineController.php

311 lines
14 KiB
PHP

<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Models\Palazzina;
use App\Models\Stabile;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
class PalazzineController extends Controller
{
/**
* Display a listing of the resource.
*/
public function index(Request $request)
{
$stabileId = $request->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'));
}
}