From fcebb5b219fa11d8b1be6a944aec5fdbf2ddb4e0 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 13:28:40 +0900 Subject: [PATCH] =?UTF-8?q?fix:=EA=B3=84=EC=A2=8C=EA=B4=80=EB=A6=AC=20?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=20HX-Redirect=20=EC=B6=94=EA=B0=80?= =?UTF-8?q?=20=EB=B0=8F=20=EC=9E=94=EC=95=A1=20=EA=B3=84=EC=82=B0=20?= =?UTF-8?q?=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - BankAccountController에 HX-Redirect 추가 (HTMX 네비게이션 시 스크립트 실행 보장) - latestBalances() 수동입력 거래 포함 정확한 잔액 계산으로 개선 - N+1 쿼리 제거: 전체 거래를 한번에 조회 후 계좌별 그룹화 처리 Co-Authored-By: Claude Opus 4.6 --- .../Barobill/EaccountController.php | 50 ++++++++++++------- .../Finance/BankAccountController.php | 9 +++- 2 files changed, 40 insertions(+), 19 deletions(-) diff --git a/app/Http/Controllers/Barobill/EaccountController.php b/app/Http/Controllers/Barobill/EaccountController.php index 7075fc72..266d5102 100644 --- a/app/Http/Controllers/Barobill/EaccountController.php +++ b/app/Http/Controllers/Barobill/EaccountController.php @@ -249,28 +249,42 @@ 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'); - }) + // 전체 거래를 한번에 조회 (계좌별 → 시간순) + $allTransactions = BankTransaction::where('tenant_id', $tenantId) + ->select('bank_account_num', 'bank_name', 'balance', 'deposit', 'withdraw', 'trans_date', 'trans_time', 'is_manual') + ->orderBy('bank_account_num') + ->orderBy('trans_date', 'asc') + ->orderBy('trans_time', 'asc') + ->orderBy('id', 'asc') ->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, - ]; + // 계좌별로 그룹화하여 최종 잔액 계산 + $accountBalances = []; + foreach ($allTransactions as $tx) { + $accNum = $tx->bank_account_num; + + if (!isset($accountBalances[$accNum])) { + $accountBalances[$accNum] = [ + 'bankAccountNum' => $accNum, + 'bankName' => $tx->bank_name, + 'balance' => 0, + 'lastTransDate' => '', + 'lastTransTime' => '', + ]; + } + + $prev = $accountBalances[$accNum]['balance']; + if (!$tx->is_manual && (float) $tx->balance != 0) { + $accountBalances[$accNum]['balance'] = (float) $tx->balance; + } else { + $accountBalances[$accNum]['balance'] = $prev + (float) $tx->deposit - (float) $tx->withdraw; + } + $accountBalances[$accNum]['lastTransDate'] = $tx->trans_date; + $accountBalances[$accNum]['lastTransTime'] = $tx->trans_time; } + $result = array_values($accountBalances); + return response()->json([ 'success' => true, 'balances' => $result, diff --git a/app/Http/Controllers/Finance/BankAccountController.php b/app/Http/Controllers/Finance/BankAccountController.php index 14d7f305..285f55e0 100644 --- a/app/Http/Controllers/Finance/BankAccountController.php +++ b/app/Http/Controllers/Finance/BankAccountController.php @@ -5,6 +5,8 @@ use App\Http\Controllers\Controller; use App\Services\BankAccountService; use Illuminate\Contracts\View\View; +use Illuminate\Http\Request; +use Illuminate\Http\Response; class BankAccountController extends Controller { @@ -15,8 +17,13 @@ public function __construct( /** * 계좌 목록 페이지 */ - public function index(): View + public function index(Request $request): View|Response { + // HTMX 부분 로드 시 전체 페이지 리로드 (스크립트 실행 보장) + if ($request->header('HX-Request')) { + return response('', 200)->header('HX-Redirect', route('finance.accounts.index')); + } + $summary = $this->bankAccountService->getSummary(); return view('finance.accounts.index', [