use crate::ids::{AccountId, MarketId, OrderId, TradableId};
use crate::models::shared::{date_iso8601, opt_arb_prec};
use rust_decimal::Decimal;
use serde::{Deserialize, Serialize};
pub use crate::models::shared::AmountWithCurrency as Amount;
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq)]
pub struct Account {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub accid: Option<AccountId>,
pub accno: i64,
pub alias: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub atyid: Option<i32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub blocked_reason: Option<String>,
pub default: bool,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub is_blocked: Option<bool>,
#[serde(rename = "type")]
pub r#type: String,
}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
pub struct Reserved {
pub corporate_actions: Amount,
pub fund_orders: Amount,
pub monthly_savings_exchange_traded: Amount,
pub other: Amount,
pub total: Amount,
}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
pub struct AccountInfo {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub accid: Option<AccountId>,
pub accno: i64,
pub account_credit: Amount,
pub account_currency: String,
pub account_sum: Amount,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub bonus_cash: Option<Amount>,
pub buy_orders_value: Amount,
pub collateral: Amount,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub credit_account_interest: Option<Amount>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub credit_account_sum: Option<Amount>,
pub equity: Amount,
pub forward_sum: Amount,
pub full_marketvalue: Amount,
pub future_sum: Amount,
pub interest: Amount,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub intraday_credit: Option<Amount>,
pub loan_limit: Amount,
pub own_capital: Amount,
pub own_capital_morning: Amount,
pub pawn_value: Amount,
#[serde(
default,
skip_serializing_if = "Option::is_none",
with = "date_iso8601::option"
)]
pub registration_date: Option<time::Date>,
pub reserved: Reserved,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub short_positions_margin: Option<Amount>,
pub trading_power: Amount,
pub unrealized_future_profit_loss: Amount,
}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
pub struct Ledger {
pub acc_int_cred: Amount,
pub acc_int_deb: Amount,
pub account_sum: Amount,
pub account_sum_acc: Amount,
pub currency: String,
pub exchange_rate: Amount,
}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
pub struct LedgerInformation {
pub ledgers: Vec<Ledger>,
pub total: Amount,
pub total_acc_int_cred: Amount,
pub total_acc_int_deb: Amount,
}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
pub struct AccountTransactionsToday {
pub transactions: Amount,
}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
pub struct PositionInstrument {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub asset_class: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub brochure_url: Option<String>,
pub currency: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub dividend_policy: Option<String>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
with = "date_iso8601::option"
)]
pub expiration_date: Option<time::Date>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub instrument_group_type: Option<String>,
pub instrument_id: i64,
pub instrument_type: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub isin_code: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub market_view: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub mifid2_category: Option<i32>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
with = "opt_arb_prec"
)]
pub multiplier: Option<Decimal>,
pub name: String,
#[serde(
default,
skip_serializing_if = "Option::is_none",
with = "opt_arb_prec"
)]
pub number_of_securities: Option<Decimal>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
with = "opt_arb_prec"
)]
pub pawn_percentage: Option<Decimal>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub price_type: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub sector: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub sector_group: Option<String>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
with = "opt_arb_prec"
)]
pub strike_price: Option<Decimal>,
pub symbol: String,
}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
pub struct Position {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub accid: Option<AccountId>,
pub accno: i64,
pub acq_price: Amount,
pub acq_price_acc: Amount,
pub instrument: PositionInstrument,
pub margin_percent: i32,
pub market_value: Amount,
pub market_value_acc: Amount,
pub morning_price: Amount,
pub pawn_percent: i32,
#[serde(with = "rust_decimal::serde::arbitrary_precision")]
pub qty: Decimal,
}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq, Hash)]
pub struct TradableRef {
pub identifier: TradableId,
pub market_id: MarketId,
}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
pub struct Trade {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub accid: Option<AccountId>,
pub accno: i64,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub counterparty: Option<String>,
pub order_id: OrderId,
pub price: Amount,
pub side: String,
pub tradable: TradableRef,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub trade_id: Option<String>,
pub tradetime: i64,
#[serde(with = "rust_decimal::serde::arbitrary_precision")]
pub volume: Decimal,
}