252 lines
9.6 KiB
PHP
Executable File
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());
|
|
}
|
|
}
|
|
}
|