feat(PORTFOLIO-003): add premium and spread for physical gold positions
This commit is contained in:
@@ -400,6 +400,26 @@ def settings_page(workspace_id: str) -> None:
|
||||
label="Cost period",
|
||||
).classes("w-full")
|
||||
|
||||
ui.separator().classes("my-3")
|
||||
ui.label("Premium & Spread (optional)").classes("text-sm font-semibold text-slate-700 dark:text-slate-300")
|
||||
ui.label("For physical gold, accounts for dealer markup and bid/ask spread.").classes("text-xs text-slate-500 dark:text-slate-400 mb-2")
|
||||
|
||||
pos_purchase_premium = ui.number(
|
||||
"Purchase premium over spot (%)",
|
||||
value=0.0,
|
||||
min=0.0,
|
||||
max=100.0,
|
||||
step=0.1,
|
||||
).classes("w-full")
|
||||
|
||||
pos_bid_ask_spread = ui.number(
|
||||
"Bid/ask spread on exit (%)",
|
||||
value=0.0,
|
||||
min=0.0,
|
||||
max=100.0,
|
||||
step=0.1,
|
||||
).classes("w-full")
|
||||
|
||||
with ui.row().classes("w-full gap-3 mt-4"):
|
||||
ui.button("Cancel", on_click=lambda: add_position_dialog.close()).props("outline")
|
||||
ui.button("Add Position", on_click=lambda: add_position_from_form()).props("color=primary")
|
||||
@@ -411,6 +431,10 @@ def settings_page(workspace_id: str) -> None:
|
||||
storage_cost_basis_val = float(pos_storage_cost_basis.value)
|
||||
storage_cost_basis = Decimal(str(storage_cost_basis_val)) if storage_cost_basis_val > 0 else None
|
||||
storage_cost_period = str(pos_storage_cost_period.value) if storage_cost_basis else None
|
||||
purchase_premium_val = float(pos_purchase_premium.value)
|
||||
purchase_premium = Decimal(str(purchase_premium_val / 100)) if purchase_premium_val > 0 else None
|
||||
bid_ask_spread_val = float(pos_bid_ask_spread.value)
|
||||
bid_ask_spread = Decimal(str(bid_ask_spread_val / 100)) if bid_ask_spread_val > 0 else None
|
||||
|
||||
new_position = Position(
|
||||
id=uuid4(),
|
||||
@@ -420,6 +444,8 @@ def settings_page(workspace_id: str) -> None:
|
||||
entry_price=Decimal(str(pos_entry_price.value)),
|
||||
entry_date=date.fromisoformat(str(pos_entry_date.value)),
|
||||
entry_basis_mode="weight",
|
||||
purchase_premium=purchase_premium,
|
||||
bid_ask_spread=bid_ask_spread,
|
||||
notes=str(pos_notes.value or ""),
|
||||
storage_cost_basis=storage_cost_basis,
|
||||
storage_cost_period=storage_cost_period,
|
||||
|
||||
Reference in New Issue
Block a user