Coverage for view / web / routes / balance.py: 95%
32 statements
« prev ^ index » next coverage.py v7.13.5, created at 2026-04-04 15:08 +0000
« prev ^ index » next coverage.py v7.13.5, created at 2026-04-04 15:08 +0000
1"""
2계좌 잔고 관련 API 엔드포인트 (balance.html).
3"""
4from fastapi import APIRouter, Query
5from common.types import Exchange
6from view.web.api_common import _get_ctx, _serialize_response
8router = APIRouter()
11@router.get("/balance")
12async def get_balance(exchange: str = Query("KRX")):
13 """계좌 잔고 조회. exchange 파라미터로 KRX 또는 NXT 선택 가능."""
14 ctx = _get_ctx()
15 t_start = ctx.pm.start_timer()
16 try:
17 exchange_enum = Exchange(exchange.upper())
18 except ValueError:
19 exchange_enum = Exchange.KRX
20 resp = await ctx.stock_query_service.handle_get_account_balance(exchange=exchange_enum)
22 # 1. 기존 응답 직렬화
23 result = _serialize_response(resp)
25 # 2. [수정됨] 환경 설정(env) 찾기 우선순위 적용
26 env = None
28 # (1순위) 웹 앱 Context가 직접 가진 env 사용 (가장 확실)
29 if hasattr(ctx, 'env') and ctx.env:
30 env = ctx.env
31 # (2순위) Broker를 통해 env 접근 (1단계 적용 시 작동함)
32 elif hasattr(ctx, 'broker') and ctx.broker and hasattr(ctx.broker, 'env'):
33 env = ctx.broker.env
35 # 3. 계좌 정보 추출
36 if env:
37 # 설정값 가져오기 (active_config가 없으면 전체 설정 로드 시도)
38 config = getattr(env, 'active_config', None) or {}
39 if not config and hasattr(env, 'get_full_config'):
40 try:
41 config = env.get_full_config()
42 except:
43 config = {}
45 # 계좌번호 키 찾기 (설정 파일마다 키 이름이 다를 수 있음)
46 acc_no = (
47 config.get("stock_account_number") or
48 config.get("CANO") or
49 config.get("account_number") or
50 getattr(env, 'stock_account_number', None) or
51 getattr(env, 'paper_stock_account_number', None) or
52 "번호없음"
53 )
55 acc_type = "모의투자" if getattr(env, 'is_paper_trading', False) else "실전투자"
57 result['account_info'] = {
58 "number": acc_no,
59 "type": acc_type,
60 "exchange": exchange_enum.value,
61 }
62 else:
63 result['account_info'] = {
64 "number": "연동실패",
65 "type": "Env Not Found",
66 "exchange": exchange_enum.value,
67 }
69 ctx.pm.log_timer("get_balance", t_start)
70 return result