netgescon-day0/app/Http/Controllers/Admin/TabellaMillesimaleController.php

402 lines
14 KiB
PHP
Executable File

<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\TabellaMillesimale;
use App\Models\DettaglioTabellaMillesimale;
use App\Models\Stabile;
use App\Models\UnitaImmobiliare;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
class TabellaMillesimaleController extends Controller
{
/**
* Display a listing of the resource.
*/
public function index(Request $request)
{
$query = TabellaMillesimale::with(['stabile', 'dettagliTabelle']);
if ($request->has('stabile_id') && $request->stabile_id) {
$query->where('stabile_id', $request->stabile_id);
}
if ($request->has('tipo_tabella') && $request->tipo_tabella) {
$query->where('tipo_tabella', $request->tipo_tabella);
}
if ($request->has('solo_attive') && $request->solo_attive) {
$query->where('attiva', true);
}
// Applica ordinamento personalizzato (ordinamento, codice, nome)
$tabelle = $query->ordinato()->get();
$stabili = Stabile::orderBy('denominazione')->get();
return view('admin.tabelle-millesimali.index', compact('tabelle', 'stabili'));
}
/**
* Show the form for creating a new resource.
*/
public function create()
{
return view('admin.tabelle-millesimali.create', [
'title' => 'Nuova Tabella Millesimale',
'breadcrumb' => [
'Dashboard' => route('admin.dashboard'),
'Tabelle Millesimali' => route('admin.tabelle-millesimali.index'),
'Nuova Tabella' => ''
]
]);
}
/**
* Store a newly created resource in storage.
*/
public function store(Request $request)
{
$validated = $request->validate([
'stabile_id' => 'required|exists:stabili,id',
'nome_tabella' => 'required|string|max:255',
'codice_tabella' => 'nullable|string|max:255',
'tipo_tabella' => 'required|in:proprieta,riscaldamento,ascensore,scale,pulizie,antenna_tv,portineria,cortile,custom,temporanea',
'descrizione' => 'nullable|string',
'data_decorrenza' => 'nullable|date',
'totale_millesimi' => 'required|numeric|min:0',
'attiva' => 'boolean'
]);
$validated['attiva'] = $request->has('attiva');
$validated['stato_tabella'] = $validated['attiva'] ? 'attiva' : 'sospesa';
$validated['created_by'] = auth()->id();
$tabella = TabellaMillesimale::create($validated);
return response()->json([
'success' => true,
'message' => 'Tabella millesimale creata con successo',
'tabella_id' => $tabella->id
]);
}
/**
* Display the specified resource.
*/
public function show(TabellaMillesimale $tabellaMillesimale)
{
$tabellaMillesimale->load(['stabile', 'dettagliTabelle.unitaImmobiliare']);
// Calcola statistiche
$statistiche = [
'unita_configurate' => $tabellaMillesimale->dettagliTabelle->count(),
'unita_totali' => $tabellaMillesimale->stabile->unitaImmobiliari->count(),
'millesimi_assegnati' => $tabellaMillesimale->dettagliTabelle->sum('millesimi'),
'millesimi_residui' => $tabellaMillesimale->totale_millesimi - $tabellaMillesimale->dettagliTabelle->sum('millesimi')
];
return view('admin.tabelle-millesimali.show', compact('tabellaMillesimale', 'statistiche'));
}
/**
* Sospendi tabella
*/
public function sospendi(TabellaMillesimale $tabellaMillesimale)
{
$tabellaMillesimale->update([
'attiva' => false,
'stato_tabella' => 'sospesa'
]);
return response()->json([
'success' => true,
'message' => 'Tabella sospesa con successo'
]);
}
/**
* Riattiva tabella
*/
public function riattiva(TabellaMillesimale $tabellaMillesimale)
{
$tabellaMillesimale->update([
'attiva' => true,
'stato_tabella' => 'attiva'
]);
return response()->json([
'success' => true,
'message' => 'Tabella riattivata con successo'
]);
}
/**
* Configura millesimi per unità immobiliari
*/
public function configuraMillesimi(TabellaMillesimale $tabellaMillesimale)
{
$tabellaMillesimale->load(['stabile.unitaImmobiliari', 'dettagliTabelle']);
// Calcola statistiche
$statistiche = [
'unita_configurate' => $tabellaMillesimale->dettagliTabelle->count(),
'unita_totali' => $tabellaMillesimale->stabile->unitaImmobiliari->count(),
'millesimi_assegnati' => $tabellaMillesimale->dettagliTabelle->sum('millesimi'),
'millesimi_residui' => $tabellaMillesimale->totale_millesimi - $tabellaMillesimale->dettagliTabelle->sum('millesimi')
];
return view('admin.tabelle-millesimali.configura-millesimi', compact('tabellaMillesimale', 'statistiche'));
}
/**
* Show the form for editing the specified resource.
*/
public function edit(string $id)
{
return view('admin.tabelle-millesimali.edit', [
'title' => 'Modifica Tabella Millesimale',
'breadcrumb' => [
'Dashboard' => route('admin.dashboard'),
'Tabelle Millesimali' => route('admin.tabelle-millesimali.index'),
'Modifica' => ''
]
]);
}
/**
* Update the specified resource in storage.
*/
public function update(Request $request, string $id)
{
// TODO: Implement update logic
return redirect()->route('admin.tabelle-millesimali.index')
->with('success', 'Tabella millesimale aggiornata con successo.');
}
/**
* Remove the specified resource from storage.
*/
public function destroy(TabellaMillesimale $tabellaMillesimale)
{
try {
// Verifica se la tabella ha dettagli associati
if ($tabellaMillesimale->dettagliTabelle()->count() > 0) {
return response()->json([
'success' => false,
'message' => 'Impossibile eliminare la tabella: sono presenti millesimi configurati.'
], 422);
}
// Verifica se è utilizzata in ripartizioni spese
if ($tabellaMillesimale->ripartizioniSpese()->count() > 0) {
return response()->json([
'success' => false,
'message' => 'Impossibile eliminare la tabella: è utilizzata in ripartizioni spese.'
], 422);
}
$nome = $tabellaMillesimale->nome_tabella;
$tabellaMillesimale->delete();
return response()->json([
'success' => true,
'message' => "Tabella millesimale '{$nome}' eliminata con successo."
]);
} catch (\Exception $e) {
return response()->json([
'success' => false,
'message' => 'Errore durante l\'eliminazione della tabella: ' . $e->getMessage()
], 500);
}
}
/**
* Bilancia automaticamente la tabella millesimale
*/
public function bilancia(TabellaMillesimale $tabellaMillesimale)
{
try {
$dettagli = $tabellaMillesimale->dettagliTabelle;
if ($dettagli->count() == 0) {
return response()->json([
'success' => false,
'message' => 'Impossibile bilanciare una tabella senza millesimi assegnati.'
], 422);
}
$totaleCorrente = $dettagli->sum('millesimi');
if ($totaleCorrente == 0) {
return response()->json([
'success' => false,
'message' => 'Impossibile bilanciare una tabella con totale millesimi pari a zero.'
], 422);
}
$fattoreCorrezione = 1000 / $totaleCorrente;
foreach ($dettagli as $dettaglio) {
$nuoviMillesimi = round($dettaglio->millesimi * $fattoreCorrezione, 4);
$dettaglio->update(['millesimi' => $nuoviMillesimi]);
}
// Aggiorna il totale nella tabella
$nuovoTotale = $tabellaMillesimale->dettagliTabelle()->sum('millesimi');
$tabellaMillesimale->update(['totale_millesimi' => $nuovoTotale]);
return response()->json([
'success' => true,
'message' => 'Tabella bilanciata con successo.',
'nuovo_totale' => number_format($nuovoTotale, 4, '.', '')
]);
} catch (\Exception $e) {
return response()->json([
'success' => false,
'message' => 'Errore durante il bilanciamento: ' . $e->getMessage()
], 500);
}
}
/**
* Ottieni le voci di spesa associate a una tabella millesimale
*/
public function getVociSpesa(TabellaMillesimale $tabellaMillesimale)
{
$voci = $tabellaMillesimale->vociSpesa()
->orderBy('ordinamento', 'asc')
->orderBy('codice', 'asc')
->get();
return response()->json([
'tabella' => [
'id' => $tabellaMillesimale->id,
'nome_tabella' => $tabellaMillesimale->nome_tabella,
'codice_tabella' => $tabellaMillesimale->codice_tabella,
],
'voci' => $voci->map(function ($voce) {
return [
'id' => $voce->id,
'codice' => $voce->codice,
'descrizione' => $voce->descrizione,
'importo' => $voce->importo ?? 0,
'categoria' => $voce->categoria,
'attiva' => $voce->attiva
];
})
]);
}
/**
* Salva la configurazione dei millesimi
*/
public function storeMillesimi(Request $request, TabellaMillesimale $tabellaMillesimale)
{
$request->validate([
'millesimi' => 'required|array',
'millesimi.*' => 'numeric|min:0|max:1000'
]);
try {
DB::beginTransaction();
// Prima elimina tutti i dettagli esistenti
$tabellaMillesimale->dettagliTabelle()->delete();
$millesimiTotali = 0;
$dettagliCreati = 0;
// Crea i nuovi dettagli
foreach ($request->millesimi as $unitaId => $millesimi) {
if (is_numeric($millesimi) && $millesimi > 0) {
DettaglioTabellaMillesimale::create([
'tabella_millesimale_id' => $tabellaMillesimale->id,
'unita_immobiliare_id' => $unitaId,
'millesimi' => $millesimi
]);
$millesimiTotali += $millesimi;
$dettagliCreati++;
}
}
// Aggiorna il totale nella tabella millesimale
$tabellaMillesimale->update([
'totale_millesimi' => $millesimiTotali
]);
DB::commit();
return response()->json([
'success' => true,
'message' => "Configurazione salvata con successo! {$dettagliCreati} unità configurate con totale {$millesimiTotali} millesimi."
]);
} catch (\Exception $e) {
DB::rollBack();
Log::error('Errore salvataggio millesimi: ' . $e->getMessage());
return response()->json([
'success' => false,
'message' => 'Errore durante il salvataggio della configurazione.'
], 500);
}
}
/**
* Salva i millesimi via JSON (per interfaccia avanzata)
*/
public function salvaMillesimi(Request $request, TabellaMillesimale $tabellaMillesimale)
{
$request->validate([
'millesimi' => 'required|array',
'millesimi.*.unita_immobiliare_id' => 'required|exists:unita_immobiliari,id',
'millesimi.*.millesimi' => 'required|numeric|min:0|max:1000'
]);
try {
DB::beginTransaction();
// Elimina tutti i dettagli esistenti
$tabellaMillesimale->dettagliTabelle()->delete();
$millesimiTotali = 0;
$dettagliCreati = 0;
// Crea i nuovi dettagli
foreach ($request->millesimi as $dettaglio) {
DettaglioTabellaMillesimale::create([
'tabella_millesimale_id' => $tabellaMillesimale->id,
'unita_immobiliare_id' => $dettaglio['unita_immobiliare_id'],
'millesimi' => $dettaglio['millesimi']
]);
$millesimiTotali += $dettaglio['millesimi'];
$dettagliCreati++;
}
// Aggiorna il totale nella tabella millesimale
$tabellaMillesimale->update([
'totale_millesimi' => $millesimiTotali
]);
DB::commit();
return response()->json([
'success' => true,
'message' => "Millesimi salvati con successo! {$dettagliCreati} unità configurate per un totale di " . number_format($millesimiTotali, 4, ',', '.') . " millesimi."
]);
} catch (\Exception $e) {
DB::rollBack();
Log::error('Errore salvataggio millesimi JSON: ' . $e->getMessage());
return response()->json([
'success' => false,
'message' => 'Errore durante il salvataggio dei millesimi.'
], 500);
}
}
}