feat(portfolio): add asset name field across API, DB, and CLI

This commit is contained in:
2026-04-03 14:51:36 +00:00
parent aeb4f10fd0
commit 0654b24d66
13 changed files with 115 additions and 19 deletions
+27 -16
View File
@@ -62,6 +62,7 @@ _SELECT_PORTFOLIO = """
portfolio_id,
broker,
status,
name,
symbol,
cash_balance,
asset_quantity,
@@ -214,6 +215,7 @@ class PostgresPortfolioRepository:
portfolio_id TEXT PRIMARY KEY,
broker TEXT NOT NULL DEFAULT 'kis',
status TEXT NOT NULL DEFAULT 'enabled',
name TEXT NOT NULL,
symbol TEXT NOT NULL,
cash_balance DOUBLE PRECISION NOT NULL,
asset_quantity DOUBLE PRECISION NOT NULL,
@@ -227,6 +229,9 @@ class PostgresPortfolioRepository:
)
"""
)
cur.execute("ALTER TABLE portfolios ADD COLUMN IF NOT EXISTS name TEXT")
cur.execute("UPDATE portfolios SET name = symbol WHERE name IS NULL OR name = ''")
cur.execute("ALTER TABLE portfolios ALTER COLUMN name SET NOT NULL")
cur.execute(
"""
CREATE TABLE IF NOT EXISTS portfolio_ledger (
@@ -321,7 +326,7 @@ class PostgresPortfolioRepository:
if row is None:
raise ValueError("포트폴리오를 찾을 수 없습니다")
raw_available = row[9] if len(row) > 9 else None
raw_available = row[10] if len(row) > 10 else None
if raw_available is None:
avabile_strategies = None
elif isinstance(raw_available, list):
@@ -333,16 +338,17 @@ class PostgresPortfolioRepository:
portfolio_id=row[0],
broker=row[1] or "kis",
status=row[2] or "enabled",
symbol=row[3],
cash_balance=float(row[4]),
asset_quantity=float(row[5]),
price=float(row[6]),
profit_buffer=float(row[7]),
active_strategy_id=row[8] if len(row) > 8 else None,
name=row[3],
symbol=row[4],
cash_balance=float(row[5]),
asset_quantity=float(row[6]),
price=float(row[7]),
profit_buffer=float(row[8]),
active_strategy_id=row[9] if len(row) > 9 else None,
avabile_strategies=avabile_strategies,
created_at=row[10] if len(row) > 10 else None,
updated_at=row[11] if len(row) > 11 else None,
last_trade_at=row[12] if len(row) > 12 else None,
created_at=row[11] if len(row) > 11 else None,
updated_at=row[12] if len(row) > 12 else None,
last_trade_at=row[13] if len(row) > 13 else None,
)
@staticmethod
@@ -698,6 +704,7 @@ class PostgresPortfolioRepository:
portfolio_id: str,
symbol: str,
*,
name: str | None = None,
broker: str = "kis",
status: str = "enabled",
active_strategy_id: str | None = None,
@@ -709,17 +716,18 @@ class PostgresPortfolioRepository:
cur.execute(
"""
INSERT INTO portfolios (
portfolio_id, broker, status, symbol,
portfolio_id, broker, status, name, symbol,
cash_balance, asset_quantity, asset_price, profit_buffer,
active_strategy_id, avabile_strategies
)
VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s)
VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)
ON CONFLICT (portfolio_id) DO NOTHING
""",
(
portfolio_id,
broker,
status,
name or symbol,
symbol,
float(initial_cash),
0.0,
@@ -739,6 +747,7 @@ class PostgresPortfolioRepository:
*,
broker: str,
status: str,
name: str,
symbol: str,
cash_balance: float,
asset_quantity: float,
@@ -755,12 +764,12 @@ class PostgresPortfolioRepository:
cur.execute(
"""
INSERT INTO portfolios (
portfolio_id, broker, status, symbol,
portfolio_id, broker, status, name, symbol,
cash_balance, asset_quantity, asset_price, profit_buffer,
active_strategy_id, avabile_strategies
) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s)
) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)
RETURNING
portfolio_id, broker, status, symbol,
portfolio_id, broker, status, name, symbol,
cash_balance, asset_quantity, asset_price, profit_buffer,
active_strategy_id, avabile_strategies, created_at, updated_at, last_trade_at
""",
@@ -768,6 +777,7 @@ class PostgresPortfolioRepository:
portfolio_id,
broker,
status,
name,
symbol,
float(cash_balance),
float(asset_quantity),
@@ -785,6 +795,7 @@ class PostgresPortfolioRepository:
allowed = {
"broker": "broker",
"status": "status",
"name": "name",
"symbol": "symbol",
"asset_price": "asset_price",
"active_strategy_id": "active_strategy_id",
@@ -812,7 +823,7 @@ class PostgresPortfolioRepository:
SET {', '.join(assignments)}
WHERE portfolio_id = %s
RETURNING
portfolio_id, broker, status, symbol,
portfolio_id, broker, status, name, symbol,
cash_balance, asset_quantity, asset_price, profit_buffer,
active_strategy_id, avabile_strategies, created_at, updated_at, last_trade_at
""",