fix:재무 대시보드 계좌 잔액을 DB 저장된 최신 거래내역에서 조회

- latestBalances API 추가 (barobill_bank_transactions 테이블)
- 바로빌 GetBankAccountEx 대신 로컬 DB 최신 잔액 사용

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
김보곤
2026-02-06 06:23:28 +09:00
parent bde743c440
commit a7670c6ecf
3 changed files with 52 additions and 11 deletions

View File

@@ -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)
*/

View File

@@ -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) {

View File

@@ -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');