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("
Errore: {$e->getMessage()}
File: {$e->getFile()}:{$e->getLine()}
", 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()); } } }