283 lines
10 KiB
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
|
|
]);
|
|
}
|
|
}
|