diff --git a/app/Http/Controllers/Barobill/EaccountController.php b/app/Http/Controllers/Barobill/EaccountController.php index 1edc6e93..26d0dcc4 100644 --- a/app/Http/Controllers/Barobill/EaccountController.php +++ b/app/Http/Controllers/Barobill/EaccountController.php @@ -240,6 +240,50 @@ public function accounts(Request $request): JsonResponse } } + /** + * 계좌별 최신 잔액 조회 (DB에서 조회 - 대시보드용) + */ + public function latestBalances(Request $request): JsonResponse + { + try { + $tenantId = session('selected_tenant_id', self::HEADQUARTERS_TENANT_ID); + + // 각 계좌의 가장 최근 거래에서 잔액 조회 + $balances = BankTransaction::where('tenant_id', $tenantId) + ->select('bank_account_num', 'bank_name', 'balance', 'trans_date', 'trans_time') + ->whereIn('id', function ($query) use ($tenantId) { + $query->select(DB::raw('MAX(id)')) + ->from('barobill_bank_transactions') + ->where('tenant_id', $tenantId) + ->groupBy('bank_account_num'); + }) + ->get(); + + $result = []; + foreach ($balances as $b) { + $result[] = [ + 'bankAccountNum' => $b->bank_account_num, + 'bankName' => $b->bank_name, + 'balance' => (float) $b->balance, + 'lastTransDate' => $b->trans_date, + 'lastTransTime' => $b->trans_time, + ]; + } + + return response()->json([ + 'success' => true, + 'balances' => $result, + 'count' => count($result) + ]); + } catch (\Throwable $e) { + Log::error('최신 잔액 조회 오류: ' . $e->getMessage()); + return response()->json([ + 'success' => false, + 'error' => $e->getMessage() + ]); + } + } + /** * 계좌 입출금내역 조회 (GetPeriodBankAccountTransLog) */ diff --git a/resources/views/finance/dashboard.blade.php b/resources/views/finance/dashboard.blade.php index b9713418..acc9bbbc 100644 --- a/resources/views/finance/dashboard.blade.php +++ b/resources/views/finance/dashboard.blade.php @@ -318,17 +318,16 @@ class="inline-flex items-center gap-2 px-4 py-2 bg-blue-600 hover:bg-blue-700 te text.textContent = '조회중...'; try { - const res = await fetch('{{ route("barobill.eaccount.accounts") }}'); + // DB에 저장된 최신 거래내역의 잔액 조회 + const res = await fetch('{{ route("barobill.eaccount.latest-balances") }}'); const data = await res.json(); - console.log('바로빌 계좌 조회 응답:', data); - if (data.success && data.accounts && data.accounts.length > 0) { + if (data.success && data.balances && data.balances.length > 0) { // 계좌번호 -> 잔액 맵 생성 const balanceMap = {}; - data.accounts.forEach(acc => { - const num = (acc.bankAccountNum || '').replace(/-/g, ''); - balanceMap[num] = acc.balance || 0; - console.log(`계좌 ${num}: ${acc.balance}원`); + data.balances.forEach(b => { + const num = (b.bankAccountNum || '').replace(/-/g, ''); + balanceMap[num] = b.balance || 0; }); // 각 계좌 잔액 업데이트 @@ -337,7 +336,6 @@ class="inline-flex items-center gap-2 px-4 py-2 bg-blue-600 hover:bg-blue-700 te document.querySelectorAll('#accountBalancesList [data-account-number]').forEach(row => { const accNum = row.dataset.accountNumber; const balanceEl = row.querySelector('.account-balance'); - console.log(`DB 계좌번호: ${accNum}, 바로빌에 존재: ${balanceMap.hasOwnProperty(accNum)}`); if (balanceEl && balanceMap.hasOwnProperty(accNum)) { const newBalance = balanceMap[accNum]; balanceEl.textContent = new Intl.NumberFormat('ko-KR').format(newBalance) + '원'; @@ -346,7 +344,6 @@ class="inline-flex items-center gap-2 px-4 py-2 bg-blue-600 hover:bg-blue-700 te totalBalance += newBalance; matchedCount++; } else if (balanceEl) { - // 바로빌에 없는 계좌는 DB 잔액 유지 totalBalance += parseFloat(balanceEl.dataset.original || 0); } }); @@ -360,8 +357,7 @@ class="inline-flex items-center gap-2 px-4 py-2 bg-blue-600 hover:bg-blue-700 te text.textContent = matchedCount > 0 ? '완료' : '매칭없음'; setTimeout(() => { text.textContent = '새로고침'; }, 2000); } else { - console.warn('바로빌 API 실패 또는 계좌 없음:', data.error || '계좌 데이터 없음'); - text.textContent = '실패'; + text.textContent = data.count === 0 ? '데이터없음' : '실패'; setTimeout(() => { text.textContent = '새로고침'; }, 2000); } } catch (e) { diff --git a/routes/web.php b/routes/web.php index e1bf729f..a42699cf 100644 --- a/routes/web.php +++ b/routes/web.php @@ -452,6 +452,7 @@ Route::prefix('eaccount')->name('eaccount.')->group(function () { Route::get('/', [\App\Http\Controllers\Barobill\EaccountController::class, 'index'])->name('index'); Route::get('/accounts', [\App\Http\Controllers\Barobill\EaccountController::class, 'accounts'])->name('accounts'); + Route::get('/latest-balances', [\App\Http\Controllers\Barobill\EaccountController::class, 'latestBalances'])->name('latest-balances'); Route::get('/transactions', [\App\Http\Controllers\Barobill\EaccountController::class, 'transactions'])->name('transactions'); Route::get('/account-codes', [\App\Http\Controllers\Barobill\EaccountController::class, 'accountCodes'])->name('account-codes'); Route::get('/account-codes/all', [\App\Http\Controllers\Barobill\EaccountController::class, 'accountCodesAll'])->name('account-codes.all');