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

283 lines
10 KiB
PHP

<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Models\Stabile;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class StabileController extends Controller
{
/**
* Display a listing of the resource.
*/
public function index()
{
// Per ora mostra tutti gli stabili dell'amministratore loggato
$amministratore_id = Auth::user()->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
]);
}
}