311 lines
14 KiB
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'));
|
|
}
|
|
}
|