feat: consolidate ledger trade writes into portfolio_ledger

- add ledger consolidation migration and remove ledger_trades usage
- return portfolio state after v1 ledger trade writes
- deprecate legacy buy/sell endpoints with deprecation headers
- add BAT-016, DCY-006, and REQ-036~038 documentation
- update repository models and tests for unified ledger entries
This commit is contained in:
2026-06-05 20:55:24 +09:00
parent 2470c0a00c
commit 44f2102d26
23 changed files with 1254 additions and 115 deletions
+19 -20
View File
@@ -126,18 +126,31 @@ class Portfolio:
@dataclass
class LedgerEntry:
portfolio_id: str
recorded_at: datetime
action: str
price: float
quantity: float
cash_balance_after: float
asset_quantity_after: float
total_value_after: float
price: float
ledger_entry_id: int = 0
order_id: str | None = None
execution_id: str | None = None
side: str | None = None
fee_amount: float = 0.0
tax_amount: float = 0.0
executed_at: datetime | None = None
recorded_at: datetime | None = None
cash_balance_after: float = 0.0
asset_quantity_after: float = 0.0
total_value_after: float = 0.0
profit_buffer_after: float = 0.0
strategy_set_id: str = "legacy"
note: str = ""
action: str | None = None
def __post_init__(self) -> None:
if self.side is None and self.action:
self.side = str(self.action).lower()
if self.action is None and self.side:
self.action = str(self.side).upper()
if self.executed_at is None:
self.executed_at = self.recorded_at
@dataclass
@@ -170,17 +183,3 @@ class BrokerCredential:
credential_version: int = 1
last_rotated_at: datetime | None = None
@dataclass
class LedgerTrade:
ledger_entry_id: int
portfolio_id: str
order_id: str
execution_id: str
side: str
quantity: float
price: float
fee_amount: float
tax_amount: float
executed_at: datetime
recorded_at: datetime | None = None