orderBy('created_at', 'desc') ->paginate(15); return view('admin.dati-bancari.index', compact('datiBancari')); } /** * Display a listing of the resource for a specific stabile. */ public function indexByStabile(Stabile $stabile) { $datiBancari = $stabile->datiBancari() ->with('contatto') ->orderBy('created_at', 'desc') ->get(); $contattiRubrica = RubricaUniversale::categoria('banca') ->attivi() ->orderByRaw("COALESCE(ragione_sociale, CONCAT_WS(' ', cognome, nome)) ASC") ->get(); return response()->json([ 'success' => true, 'data' => $datiBancari, 'contatti' => $contattiRubrica ]); } /** * Show the form for creating a new resource. */ public function create() { $stabili = Stabile::orderBy('denominazione')->get(); $contattiBanca = RubricaUniversale::categoria('banca') ->attivi() ->orderByRaw("COALESCE(ragione_sociale, CONCAT_WS(' ', cognome, nome)) ASC") ->get(); return view('admin.dati-bancari.create', compact('stabili', 'contattiBanca')); } /** * Store a newly created resource in storage. */ public function store(Request $request) { $validated = $request->validate([ 'stabile_id' => 'required|exists:stabili,id', 'contatto_id' => 'nullable|exists:rubrica_universale,id', 'tipo_conto' => 'required|in:corrente,deposito,risparmio', 'denominazione_banca' => 'required|string|max:255', 'numero_conto' => 'nullable|string|max:50', 'iban' => 'required|string|max:34', 'abi' => 'nullable|string|max:5', 'cab' => 'nullable|string|max:5', 'cin' => 'nullable|string|max:1', 'bic_swift' => 'nullable|string|max:11', 'intestazione_conto' => 'required|string|max:255', 'data_saldo_iniziale' => 'required|date', 'saldo_iniziale' => 'required|numeric', 'valuta' => 'required|string|max:3', 'stato_conto' => 'required|in:attivo,chiuso,sospeso', 'note' => 'nullable|string' ]); $validated['creato_da'] = Auth::id(); $datoBancario = DatiBancari::create($validated); return redirect() ->route('admin.dati-bancari.show', $datoBancario) ->with('success', 'Dati bancari creati con successo.'); } /** * Store a newly created resource for a specific stabile. */ public function storeForStabile(Request $request, Stabile $stabile) { $validated = $request->validate([ 'contatto_id' => 'nullable|exists:rubrica_universale,id', 'tipo_conto' => 'required|in:corrente,deposito,risparmio', 'denominazione_banca' => 'required|string|max:255', 'numero_conto' => 'nullable|string|max:50', 'iban' => 'required|string|max:34', 'abi' => 'nullable|string|max:5', 'cab' => 'nullable|string|max:5', 'cin' => 'nullable|string|max:1', 'bic_swift' => 'nullable|string|max:11', 'intestazione_conto' => 'required|string|max:255', 'data_saldo_iniziale' => 'required|date', 'saldo_iniziale' => 'required|numeric', 'valuta' => 'required|string|max:3', 'stato_conto' => 'required|in:attivo,chiuso,sospeso', 'note' => 'nullable|string' ]); $validated['stabile_id'] = $stabile->id; $validated['creato_da'] = Auth::id(); $datoBancario = DatiBancari::create($validated); return response()->json([ 'success' => true, 'message' => 'Dati bancari creati con successo.', 'data' => $datoBancario->load('contatto') ]); } /** * Display the specified resource. */ public function show(DatiBancari $datiBancari) { $datiBancari->load(['stabile', 'contatto', 'createdBy', 'updatedBy']); return view('admin.dati-bancari.show', compact('datiBancari')); } /** * Show the form for editing the specified resource. */ public function edit(DatiBancari $datiBancari) { $stabili = Stabile::orderBy('denominazione')->get(); $contattiBanca = RubricaUniversale::categoria('banca') ->attivi() ->orderByRaw("COALESCE(ragione_sociale, CONCAT_WS(' ', cognome, nome)) ASC") ->get(); return view('admin.dati-bancari.edit', compact('datiBancari', 'stabili', 'contattiBanca')); } /** * Update the specified resource in storage. */ public function update(Request $request, DatiBancari $datiBancari) { $validated = $request->validate([ 'contatto_id' => 'nullable|exists:rubrica_universale,id', 'tipo_conto' => 'required|in:corrente,deposito,risparmio', 'denominazione_banca' => 'required|string|max:255', 'numero_conto' => 'nullable|string|max:50', 'iban' => 'required|string|max:34', 'abi' => 'nullable|string|max:5', 'cab' => 'nullable|string|max:5', 'cin' => 'nullable|string|max:1', 'bic_swift' => 'nullable|string|max:11', 'intestazione_conto' => 'required|string|max:255', 'data_saldo_iniziale' => 'required|date', 'saldo_iniziale' => 'required|numeric', 'valuta' => 'required|string|max:3', 'stato_conto' => 'required|in:attivo,chiuso,sospeso', 'note' => 'nullable|string' ]); $validated['modificato_da'] = Auth::id(); $datiBancari->update($validated); return redirect() ->route('admin.dati-bancari.show', $datiBancari) ->with('success', 'Dati bancari aggiornati con successo.'); } /** * Remove the specified resource from storage. */ public function destroy(DatiBancari $datiBancari) { $stabileId = $datiBancari->stabile_id; $datiBancari->delete(); return redirect() ->route('admin.stabili.show', $stabileId) ->with('success', 'Dati bancari eliminati con successo.'); } /** * Get current balance for a specific account (API). */ public function getSaldoAttuale(DatiBancari $conto) { // Qui implementeremmo il calcolo del saldo attuale // basato sui movimenti contabili - per ora restituiamo il saldo iniziale return response()->json([ 'success' => true, 'saldo_iniziale' => $conto->saldo_iniziale, 'saldo_attuale' => $conto->saldo_iniziale, // TODO: Calcolo movimenti 'ultimo_aggiornamento' => $conto->updated_at->format('d/m/Y H:i') ]); } /** * Diagnostica rapida per conti/casse di uno stabile: conteggi e flag utili per verificare import. */ public function diagnosticaByStabile(Stabile $stabile) { $q = DatiBancari::where('stabile_id', $stabile->id); $tot = (clone $q)->count(); $withIban = (clone $q)->whereNotNull('iban')->where('iban', '!=', '')->count(); $withSwift = (clone $q)->whereNotNull('bic_swift')->where('bic_swift', '!=', '')->count(); $nostro = (clone $q)->where('is_nostro_conto', true)->first(); $hasCassaCon = (clone $q)->whereRaw('UPPER(COALESCE(legacy_cod_cassa, numero_conto, "")) = ?', ['CON'])->exists(); $hasTipoCassa = (clone $q)->whereRaw('LOWER(COALESCE(tipo_conto, "")) = ?', ['cassa'])->exists(); $data = [ 'ok' => true, 'stabile_id' => $stabile->id, 'denominazione' => $stabile->denominazione, 'totali' => [ 'conti' => $tot, 'con_iban' => $withIban, 'con_swift' => $withSwift, ], 'flags' => [ 'has_main' => (bool) $nostro, 'has_cassa_con' => $hasCassaCon || $hasTipoCassa, ], 'main' => $nostro, 'elenco' => $q->orderBy('created_at', 'desc')->limit(20)->get(), ]; return response()->json($data); } }