netgescon-day0/app/Modules/Contabilita/Controllers/ContabilitaController.php

252 lines
9.6 KiB
PHP
Executable File

<?php
namespace App\Modules\Contabilita\Controllers;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Services\HookManager;
use Illuminate\Support\Facades\Log;
use App\Modules\Contabilita\Models\Registrazione;
use App\Modules\Contabilita\Models\PianoConti;
use App\Modules\Contabilita\Models\Movimento;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Validator;
class ContabilitaController extends Controller
{
protected $hookManager;
public function __construct()
{
$this->middleware('auth');
$this->middleware('permission:contabilita_view')->only(['index', 'show']);
$this->middleware('permission:contabilita_create')->only(['create', 'store']);
$this->middleware('permission:contabilita_edit')->only(['edit', 'update']);
$this->middleware('permission:contabilita_delete')->only(['destroy']);
$this->hookManager = app(HookManager::class);
}
public function index(Request $request)
{
try {
// Statistiche rapide usando le tabelle italiane senza accenti
$stats = [
'total_entries' => DB::table('contabilita_registrazioni')->count(),
'confirmed_entries' => DB::table('contabilita_registrazioni')->where('status', 'confirmed')->count(),
'this_month' => DB::table('contabilita_registrazioni')
->whereMonth('entry_date', now()->month)
->whereYear('entry_date', now()->year)
->count(),
'total_movements' => DB::table('contabilita_movimenti')->count()
];
// Query base con filtri sulle tabelle italiane senza accenti
$query = DB::table('contabilita_registrazioni as cr')
->leftJoin('gestioni as g', 'cr.gestione_id', '=', 'g.id_gestione')
->leftJoin('users as u', 'cr.user_id', '=', 'u.id')
->select([
'cr.*',
'g.anno_gestione',
'g.tipo_gestione',
'u.name as created_by_name'
])
->orderBy('cr.entry_date', 'desc');
// Filtro ricerca
if ($request->filled('search')) {
$search = '%' . $request->search . '%';
$query->where(function ($q) use ($search) {
$q->where('cr.description', 'like', $search)
->orWhere('cr.document_number', 'like', $search)
->orWhere('cr.protocol', 'like', $search);
});
}
// Filtro stato
if ($request->filled('status')) {
$query->where('cr.status', $request->status);
}
// Filtro gestione
if ($request->filled('gestione_id')) {
$query->where('cr.gestione_id', $request->gestione_id);
}
// Paginazione
$entries = $query->paginate(15)->withQueryString();
// Lista gestioni per filtro
$gestioni = DB::table('gestioni')
->select('id_gestione', 'anno_gestione', 'tipo_gestione')
->orderBy('anno_gestione', 'desc')
->get();
return view('modules.contabilita.index', compact('stats', 'entries', 'gestioni'));
} catch (\Exception $e) {
Log::error('Errore nel modulo Contabilità: ' . $e->getMessage());
// Fallback view per debug
return response("<h1>Errore Modulo Contabilità</h1><p>Errore: {$e->getMessage()}</p><p>File: {$e->getFile()}:{$e->getLine()}</p>", 500);
}
}
public function create()
{
try {
// Piano dei conti per i movimenti - colonne corrette
$pianoConti = DB::table('piano_conti')
->select('id', 'mastro', 'conto', 'sottoconto', 'descrizione', 'tipo')
->where('attivo', 1)
->orderBy('mastro')
->orderBy('conto')
->orderBy('sottoconto')
->get();
// Lista gestioni per il form
$gestioni = DB::table('gestioni')
->select('id_gestione', 'anno_gestione', 'tipo_gestione')
->orderBy('anno_gestione', 'desc')
->get();
return view('modules.contabilita.create', compact('pianoConti', 'gestioni'));
} catch (\Exception $e) {
Log::error('Errore nel create Contabilità: ' . $e->getMessage());
return back()->with('error', 'Errore durante il caricamento del form: ' . $e->getMessage());
}
}
public function store(Request $request)
{
$validator = Validator::make($request->all(), [
'data_registrazione' => 'required|date',
'descrizione' => 'required|string|max:255',
'movimenti' => 'required|array|min:2',
'movimenti.*.conto_id' => 'required|exists:contabilita_piano_conti,id',
'movimenti.*.importo' => 'required|numeric|min:0.01',
'movimenti.*.tipo' => 'required|in:dare,avere',
]);
if ($validator->fails()) {
return redirect()->route('contabilita.create')
->withErrors($validator)
->withInput();
}
// Check balance
$dare = collect($request->movimenti)->where('tipo', 'dare')->sum('importo');
$avere = collect($request->movimenti)->where('tipo', 'avere')->sum('importo');
if (round($dare, 2) !== round($avere, 2)) {
return redirect()->route('contabilita.create')
->withErrors(['balance' => 'La somma Dare e Avere non corrisponde.'])
->withInput();
}
DB::transaction(function () use ($request) {
$registrazione = Registrazione::create([
'data_registrazione' => $request->data_registrazione,
'descrizione' => $request->descrizione,
'created_by' => auth()->id(),
]);
foreach ($request->movimenti as $mov) {
$registrazione->movimenti()->create($mov);
}
$this->hookManager->execute('contabilita.after_create', [$registrazione]);
});
return redirect()->route('contabilita.index')->with('success', 'Registrazione creata con successo.');
}
public function show($id)
{
$registrazione = Registrazione::with('movimenti.conto')->findOrFail($id);
return view('modules.contabilita.show', compact('registrazione'));
}
public function edit($id)
{
$registrazione = Registrazione::with('movimenti')->findOrFail($id);
$conti = PianoConti::orderBy('codice')->get();
return view('modules.contabilita.edit', compact('registrazione', 'conti'));
}
public function update(Request $request, $id)
{
$validator = Validator::make($request->all(), [
'data_registrazione' => 'required|date',
'descrizione' => 'required|string|max:255',
'movimenti' => 'required|array|min:2',
'movimenti.*.conto_id' => 'required|exists:contabilita_piano_conti,id',
'movimenti.*.importo' => 'required|numeric|min:0.01',
'movimenti.*.tipo' => 'required|in:dare,avere',
]);
if ($validator->fails()) {
return redirect()->route('contabilita.edit', $id)
->withErrors($validator)
->withInput();
}
$dare = collect($request->movimenti)->where('tipo', 'dare')->sum('importo');
$avere = collect($request->movimenti)->where('tipo', 'avere')->sum('importo');
if (round($dare, 2) !== round($avere, 2)) {
return redirect()->route('contabilita.edit', $id)
->withErrors(['balance' => 'La somma Dare e Avere non corrisponde.'])
->withInput();
}
$registrazione = Registrazione::findOrFail($id);
DB::transaction(function () use ($request, $registrazione) {
$registrazione->update([
'data_registrazione' => $request->data_registrazione,
'descrizione' => $request->descrizione,
'updated_by' => auth()->id(),
]);
$registrazione->movimenti()->delete();
foreach ($request->movimenti as $mov) {
$registrazione->movimenti()->create($mov);
}
$this->hookManager->execute('contabilita.after_update', [$registrazione]);
});
return redirect()->route('contabilita.index')->with('success', 'Registrazione aggiornata con successo.');
}
public function destroy($id)
{
$registrazione = Registrazione::findOrFail($id);
$this->hookManager->execute('contabilita.before_delete', [$registrazione]);
$registrazione->delete();
$this->hookManager->execute('contabilita.after_delete', [$id]);
return redirect()->route('contabilita.index')->with('success', 'Registrazione eliminata con successo.');
}
/**
* Esporta i dati della contabilità
*/
public function export(Request $request)
{
try {
// Per ora restituiamo un messaggio di funzionalità in sviluppo
return back()->with('info', 'Funzionalità di esportazione in sviluppo.');
// TODO: Implementare export in CSV/Excel
// $entries = DB::table('contabilita_registrazioni')->get();
// return Excel::download(new ContabilitaExport($entries), 'contabilita_export.xlsx');
} catch (\Exception $e) {
Log::error('Errore nell\'export contabilità: ' . $e->getMessage());
return back()->with('error', 'Errore durante l\'esportazione: ' . $e->getMessage());
}
}
}