Add management fee callbacks

This commit is contained in:
boris
2026-04-23 20:18:31 -07:00
parent 85feee6dac
commit c843de078f
9 changed files with 241 additions and 10 deletions

View File

@@ -311,6 +311,8 @@ pub struct PortfolioState {
units: f64,
cash: f64,
cash_liabilities: f64,
management_fee_rate: f64,
management_fees: f64,
positions: IndexMap<String, Position>,
cash_receivables: Vec<CashReceivable>,
pending_cash_flows: Vec<PendingCashFlow>,
@@ -341,6 +343,8 @@ impl PortfolioState {
units: initial_cash,
cash: initial_cash,
cash_liabilities: 0.0,
management_fee_rate: 0.0,
management_fees: 0.0,
positions: IndexMap::new(),
cash_receivables: Vec::new(),
pending_cash_flows: Vec::new(),
@@ -367,6 +371,14 @@ impl PortfolioState {
self.cash_liabilities
}
pub fn management_fee_rate(&self) -> f64 {
self.management_fee_rate
}
pub fn management_fees(&self) -> f64 {
self.management_fees
}
pub fn positions(&self) -> &IndexMap<String, Position> {
&self.positions
}
@@ -484,6 +496,27 @@ impl PortfolioState {
Ok(())
}
pub fn set_management_fee_rate(&mut self, rate: f64) -> Result<(), String> {
if !rate.is_finite() || rate < 0.0 {
return Err("management fee rate must be finite and non-negative".to_string());
}
self.management_fee_rate = rate;
Ok(())
}
pub fn default_management_fee(&self) -> f64 {
self.total_equity().max(0.0) * self.management_fee_rate
}
pub fn apply_management_fee(&mut self, fee: f64) -> Result<(), String> {
if !fee.is_finite() || fee < 0.0 {
return Err("management fee must be finite and non-negative".to_string());
}
self.cash -= fee;
self.management_fees += fee;
Ok(())
}
pub fn settle_cash_receivables(&mut self, date: NaiveDate) -> Vec<CashReceivable> {
let mut settled = Vec::new();
let mut pending = Vec::new();