fix:재무 대시보드 계좌 잔액을 DB 저장된 최신 거래내역에서 조회
- latestBalances API 추가 (barobill_bank_transactions 테이블) - 바로빌 GetBankAccountEx 대신 로컬 DB 최신 잔액 사용 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -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)
|
||||
*/
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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');
|
||||
|
||||
Reference in New Issue
Block a user