From a7670c6ecf1a8cc30eb34e40de5da72ffff64640 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=B3=B4=EA=B3=A4?= Date: Fri, 6 Feb 2026 06:23:28 +0900 Subject: [PATCH] =?UTF-8?q?fix:=EC=9E=AC=EB=AC=B4=20=EB=8C=80=EC=8B=9C?= =?UTF-8?q?=EB=B3=B4=EB=93=9C=20=EA=B3=84=EC=A2=8C=20=EC=9E=94=EC=95=A1?= =?UTF-8?q?=EC=9D=84=20DB=20=EC=A0=80=EC=9E=A5=EB=90=9C=20=EC=B5=9C?= =?UTF-8?q?=EC=8B=A0=20=EA=B1=B0=EB=9E=98=EB=82=B4=EC=97=AD=EC=97=90?= =?UTF-8?q?=EC=84=9C=20=EC=A1=B0=ED=9A=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - latestBalances API 추가 (barobill_bank_transactions 테이블) - 바로빌 GetBankAccountEx 대신 로컬 DB 최신 잔액 사용 Co-Authored-By: Claude Opus 4.5 --- .../Barobill/EaccountController.php | 44 +++++++++++++++++++ resources/views/finance/dashboard.blade.php | 18 +++----- routes/web.php | 1 + 3 files changed, 52 insertions(+), 11 deletions(-) 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');