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

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 

7 

8router = APIRouter() 

9 

10 

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) 

21 

22 # 1. 기존 응답 직렬화 

23 result = _serialize_response(resp) 

24 

25 # 2. [수정됨] 환경 설정(env) 찾기 우선순위 적용 

26 env = None 

27 

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 

34 

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 = {} 

44 

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 ) 

54 

55 acc_type = "모의투자" if getattr(env, 'is_paper_trading', False) else "실전투자" 

56 

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 } 

68 

69 ctx.pm.log_timer("get_balance", t_start) 

70 return result