1use chrono::NaiveDate;
4use rust_decimal::Decimal;
5use serde::{Deserialize, Serialize};
6
7use super::common::{
8 AssetCategory, BuySell, DerivativeInfo, LevelOfDetail, OpenClose, OrderType, PutCall,
9 SecurityIdType, SubCategory, TradeType,
10};
11use crate::parsers::xml_utils::{
12 deserialize_optional_bool, deserialize_optional_date, deserialize_optional_decimal,
13};
14
15#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
49#[serde(rename = "FlexQueryResponse")]
50pub struct FlexQueryResponse {
51 #[serde(rename = "@queryName", default)]
53 pub query_name: Option<String>,
54
55 #[serde(rename = "@type", default)]
57 pub query_type: Option<String>,
58
59 #[serde(rename = "FlexStatements")]
61 pub statements: FlexStatementsWrapper,
62}
63
64#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
66pub struct FlexStatementsWrapper {
67 #[serde(rename = "@count", default)]
69 pub count: Option<String>,
70
71 #[serde(rename = "FlexStatement")]
73 pub statements: Vec<ActivityFlexStatement>,
74}
75
76#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
122#[serde(rename = "FlexStatement")]
123pub struct ActivityFlexStatement {
124 #[serde(rename = "@accountId")]
126 pub account_id: String,
127
128 #[serde(
130 rename = "@fromDate",
131 deserialize_with = "crate::parsers::xml_utils::deserialize_flex_date"
132 )]
133 pub from_date: NaiveDate,
134
135 #[serde(
137 rename = "@toDate",
138 deserialize_with = "crate::parsers::xml_utils::deserialize_flex_date"
139 )]
140 pub to_date: NaiveDate,
141
142 #[serde(rename = "@whenGenerated")]
144 pub when_generated: String, #[serde(rename = "Trades", default)]
148 pub trades: TradesWrapper,
149
150 #[serde(rename = "OpenPositions", default)]
152 pub positions: PositionsWrapper,
153
154 #[serde(rename = "CashTransactions", default)]
156 pub cash_transactions: CashTransactionsWrapper,
157
158 #[serde(rename = "CorporateActions", default)]
160 pub corporate_actions: CorporateActionsWrapper,
161
162 #[serde(rename = "SecuritiesInfo", default)]
164 pub securities_info: SecuritiesInfoWrapper,
165
166 #[serde(rename = "ConversionRates", default)]
168 pub conversion_rates: ConversionRatesWrapper,
169
170 #[serde(rename = "AccountInformation", default)]
173 pub account_information: Option<super::extended::AccountInformation>,
174
175 #[serde(rename = "ChangeInNAV", default)]
177 pub change_in_nav: Option<super::extended::ChangeInNAV>,
178
179 #[serde(rename = "EquitySummaryInBase", default)]
181 pub equity_summary: EquitySummaryWrapper,
182
183 #[serde(rename = "CashReport", default)]
185 pub cash_report: CashReportWrapper,
186
187 #[serde(rename = "TradeConfirms", default)]
189 pub trade_confirms: TradeConfirmsWrapper,
190
191 #[serde(rename = "OptionEAE", default)]
193 pub option_eae: OptionEAEWrapper,
194
195 #[serde(rename = "FxTransactions", default)]
197 pub fx_transactions: FxTransactionsWrapper,
198
199 #[serde(rename = "ChangeInDividendAccruals", default)]
201 pub change_in_dividend_accruals: ChangeInDividendAccrualsWrapper,
202
203 #[serde(rename = "OpenDividendAccruals", default)]
205 pub open_dividend_accruals: OpenDividendAccrualsWrapper,
206
207 #[serde(rename = "InterestAccruals", default)]
209 pub interest_accruals: InterestAccrualsWrapper,
210
211 #[serde(rename = "Transfers", default)]
213 pub transfers: TransfersWrapper,
214
215 #[serde(rename = "MTMPerformanceSummaryInBase", default)]
218 pub mtm_performance_summary: MTMPerformanceSummaryWrapper,
219
220 #[serde(rename = "FIFOPerformanceSummaryInBase", default)]
222 pub fifo_performance_summary: FIFOPerformanceSummaryWrapper,
223
224 #[serde(rename = "MTDYTDPerformanceSummary", default)]
226 pub mtd_ytd_performance_summary: MTDYTDPerformanceSummaryWrapper,
227
228 #[serde(rename = "StmtFunds", default)]
230 pub statement_of_funds: StatementOfFundsWrapper,
231
232 #[serde(rename = "ChangeInPositionValues", default)]
234 pub change_in_position_values: ChangeInPositionValueWrapper,
235
236 #[serde(rename = "UnbundledCommissionDetails", default)]
238 pub unbundled_commission_details: UnbundledCommissionDetailWrapper,
239
240 #[serde(rename = "ClientFees", default)]
242 pub client_fees: ClientFeesWrapper,
243
244 #[serde(rename = "ClientFeesDetails", default)]
246 pub client_fees_detail: ClientFeesDetailWrapper,
247
248 #[serde(rename = "SLBActivities", default)]
250 pub slb_activities: SLBActivitiesWrapper,
251
252 #[serde(rename = "SLBFees", default)]
254 pub slb_fees: SLBFeesWrapper,
255
256 #[serde(rename = "HardToBorrowDetails", default)]
258 pub hard_to_borrow_details: HardToBorrowDetailsWrapper,
259
260 #[serde(rename = "FxLots", default)]
262 pub fx_lots: FxLotsWrapper,
263
264 #[serde(rename = "UnsettledTransfers", default)]
266 pub unsettled_transfers: UnsettledTransfersWrapper,
267
268 #[serde(rename = "TradeTransfers", default)]
270 pub trade_transfers: TradeTransfersWrapper,
271
272 #[serde(rename = "PriorPeriodPositions", default)]
274 pub prior_period_positions: PriorPeriodPositionsWrapper,
275
276 #[serde(rename = "TierInterestDetails", default)]
278 pub tier_interest_details: TierInterestDetailsWrapper,
279
280 #[serde(rename = "DebitCardActivities", default)]
282 pub debit_card_activities: DebitCardActivitiesWrapper,
283
284 #[serde(rename = "SalesTaxes", default)]
286 pub sales_tax: SalesTaxWrapper,
287
288 #[serde(rename = "DepositsOnHold", default, skip_serializing)]
296 deposits_on_hold: IgnoredSection,
297 #[serde(rename = "FxPositions", default, skip_serializing)]
298 fx_positions: IgnoredSection,
299 #[serde(rename = "NetStockPositions", default, skip_serializing)]
300 net_stock_positions: IgnoredSection,
301 #[serde(rename = "ComplexPositions", default, skip_serializing)]
302 complex_positions: IgnoredSection,
303 #[serde(rename = "CFDCharges", default, skip_serializing)]
304 cfd_charges: IgnoredSection,
305 #[serde(rename = "CommissionCredits", default, skip_serializing)]
306 commission_credits: IgnoredSection,
307 #[serde(rename = "FdicInsuredDepositsByBank", default, skip_serializing)]
308 fdic_insured_deposits: IgnoredSection,
309 #[serde(rename = "HKIPOOpenSubscriptions", default, skip_serializing)]
310 hk_ipo_open_subscriptions: IgnoredSection,
311 #[serde(rename = "HKIPOSubscriptionActivity", default, skip_serializing)]
312 hk_ipo_subscription_activity: IgnoredSection,
313 #[serde(rename = "IBGNoteTransactions", default, skip_serializing)]
314 ibg_note_transactions: IgnoredSection,
315 #[serde(rename = "IncentiveCouponAccrualDetails", default, skip_serializing)]
316 incentive_coupon_accruals: IgnoredSection,
317 #[serde(rename = "MutualFundDividendDetails", default, skip_serializing)]
318 mutual_fund_dividends: IgnoredSection,
319 #[serde(rename = "NetStockPositionSummary", default, skip_serializing)]
320 net_stock_position_summary: IgnoredSection,
321 #[serde(rename = "PendingExcercises", default, skip_serializing)]
322 pending_exercises: IgnoredSection,
323 #[serde(rename = "RoutingCommissions", default, skip_serializing)]
324 routing_commissions: IgnoredSection,
325 #[serde(rename = "SLBCollaterals", default, skip_serializing)]
326 slb_collaterals: IgnoredSection,
327 #[serde(rename = "SLBOpenContracts", default, skip_serializing)]
328 slb_open_contracts: IgnoredSection,
329 #[serde(rename = "SoftDollars", default, skip_serializing)]
330 soft_dollars: IgnoredSection,
331 #[serde(rename = "StockGrantActivities", default, skip_serializing)]
332 stock_grant_activities: IgnoredSection,
333 #[serde(rename = "TransactionTaxes", default, skip_serializing)]
334 transaction_taxes: IgnoredSection,
335 #[serde(rename = "UnbookedTrades", default, skip_serializing)]
336 unbooked_trades: IgnoredSection,
337 }
340
341#[derive(Debug, Clone, PartialEq, Default)]
343struct IgnoredSection;
344
345impl<'de> serde::Deserialize<'de> for IgnoredSection {
346 fn deserialize<D>(deserializer: D) -> std::result::Result<Self, D::Error>
347 where
348 D: serde::Deserializer<'de>,
349 {
350 serde::de::IgnoredAny::deserialize(deserializer)?;
352 Ok(IgnoredSection)
353 }
354}
355
356#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
361#[serde(rename_all = "PascalCase")]
362enum TradesItem {
363 Trade(Trade),
364 Order(Trade),
365 SymbolSummary(Trade),
366 AssetSummary(Trade),
367 WashSale(Trade),
368 Lot(Trade),
369}
370
371#[derive(Debug, Clone, PartialEq, Default, Serialize)]
381pub struct TradesWrapper {
382 pub items: Vec<Trade>,
384
385 pub wash_sales: Vec<Trade>,
387}
388
389impl<'de> serde::Deserialize<'de> for TradesWrapper {
390 fn deserialize<D>(deserializer: D) -> std::result::Result<Self, D::Error>
391 where
392 D: serde::Deserializer<'de>,
393 {
394 #[derive(Deserialize)]
395 struct Raw {
396 #[serde(rename = "$value", default)]
397 items: Vec<TradesItem>,
398 }
399
400 let raw = Raw::deserialize(deserializer)?;
401
402 let mut trades = Vec::new();
403 let mut wash_sales = Vec::new();
404
405 for item in raw.items {
406 match item {
407 TradesItem::Trade(t) => trades.push(t),
408 TradesItem::WashSale(t) => wash_sales.push(t),
409 _ => {}
411 }
412 }
413
414 Ok(TradesWrapper {
415 items: trades,
416 wash_sales,
417 })
418 }
419}
420
421#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
423pub struct PositionsWrapper {
424 #[serde(rename = "OpenPosition", default)]
426 pub items: Vec<Position>,
427}
428
429#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
431pub struct CashTransactionsWrapper {
432 #[serde(rename = "CashTransaction", default)]
434 pub items: Vec<CashTransaction>,
435}
436
437#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
439pub struct CorporateActionsWrapper {
440 #[serde(rename = "CorporateAction", default)]
442 pub items: Vec<CorporateAction>,
443}
444
445#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
492pub struct Trade {
493 #[serde(rename = "@accountId")]
499 pub account_id: String,
500
501 #[serde(rename = "@transactionID", default)]
503 pub transaction_id: Option<String>,
504
505 #[serde(rename = "@conid")]
508 pub conid: String,
509
510 #[serde(rename = "@symbol")]
512 pub symbol: String,
513
514 #[serde(rename = "@description", default)]
516 pub description: Option<String>,
517
518 #[serde(rename = "@assetCategory")]
520 pub asset_category: AssetCategory,
521
522 #[serde(rename = "@cusip", default)]
524 pub cusip: Option<String>,
525
526 #[serde(rename = "@isin", default)]
528 pub isin: Option<String>,
529
530 #[serde(rename = "@figi", default)]
532 pub figi: Option<String>,
533
534 #[serde(rename = "@securityID", default)]
536 pub security_id: Option<String>,
537
538 #[serde(rename = "@securityIDType", default)]
540 pub security_id_type: Option<SecurityIdType>,
541
542 #[serde(
545 rename = "@multiplier",
546 default,
547 deserialize_with = "deserialize_optional_decimal"
548 )]
549 pub multiplier: Option<Decimal>,
550
551 #[serde(
553 rename = "@strike",
554 default,
555 deserialize_with = "deserialize_optional_decimal"
556 )]
557 pub strike: Option<Decimal>,
558
559 #[serde(
561 rename = "@expiry",
562 default,
563 deserialize_with = "deserialize_optional_date"
564 )]
565 pub expiry: Option<NaiveDate>,
566
567 #[serde(rename = "@putCall", default)]
569 pub put_call: Option<PutCall>,
570
571 #[serde(rename = "@underlyingConid", default)]
573 pub underlying_conid: Option<String>,
574
575 #[serde(rename = "@underlyingSymbol", default)]
577 pub underlying_symbol: Option<String>,
578
579 #[serde(
582 rename = "@tradeDate",
583 default,
584 deserialize_with = "deserialize_optional_date"
585 )]
586 pub trade_date: Option<NaiveDate>,
587
588 #[serde(
590 rename = "@settleDateTarget",
591 default,
592 deserialize_with = "deserialize_optional_date"
593 )]
594 pub settle_date: Option<NaiveDate>,
595
596 #[serde(rename = "@buySell", default)]
598 pub buy_sell: Option<BuySell>,
599
600 #[serde(rename = "@openCloseIndicator", default)]
602 pub open_close: Option<OpenClose>,
603
604 #[serde(rename = "@transactionType", default)]
606 pub transaction_type: Option<TradeType>,
607
608 #[serde(
611 rename = "@quantity",
612 default,
613 deserialize_with = "deserialize_optional_decimal"
614 )]
615 pub quantity: Option<Decimal>,
616
617 #[serde(
619 rename = "@price",
620 default,
621 deserialize_with = "deserialize_optional_decimal"
622 )]
623 pub price: Option<Decimal>,
624
625 #[serde(
627 rename = "@proceeds",
628 default,
629 deserialize_with = "deserialize_optional_decimal"
630 )]
631 pub proceeds: Option<Decimal>,
632
633 #[serde(
635 rename = "@cost",
636 default,
637 deserialize_with = "deserialize_optional_decimal"
638 )]
639 pub cost: Option<Decimal>,
640
641 #[serde(
644 rename = "@ibCommission",
645 default,
646 deserialize_with = "deserialize_optional_decimal"
647 )]
648 pub commission: Option<Decimal>,
649
650 #[serde(
652 rename = "@taxes",
653 default,
654 deserialize_with = "deserialize_optional_decimal"
655 )]
656 pub taxes: Option<Decimal>,
657
658 #[serde(
660 rename = "@netCash",
661 default,
662 deserialize_with = "deserialize_optional_decimal"
663 )]
664 pub net_cash: Option<Decimal>,
665
666 #[serde(
669 rename = "@fifoPnlRealized",
670 default,
671 deserialize_with = "deserialize_optional_decimal"
672 )]
673 pub fifo_pnl_realized: Option<Decimal>,
674
675 #[serde(
677 rename = "@mtmPnl",
678 default,
679 deserialize_with = "deserialize_optional_decimal"
680 )]
681 pub mtm_pnl: Option<Decimal>,
682
683 #[serde(
685 rename = "@fxPnl",
686 default,
687 deserialize_with = "deserialize_optional_decimal"
688 )]
689 pub fx_pnl: Option<Decimal>,
690
691 #[serde(rename = "@currency")]
694 pub currency: String,
695
696 #[serde(
698 rename = "@fxRateToBase",
699 default,
700 deserialize_with = "deserialize_optional_decimal"
701 )]
702 pub fx_rate_to_base: Option<Decimal>,
703
704 #[serde(
707 rename = "@origTradeDate",
708 default,
709 deserialize_with = "deserialize_optional_date"
710 )]
711 pub orig_trade_date: Option<NaiveDate>,
712
713 #[serde(
715 rename = "@origTradePrice",
716 default,
717 deserialize_with = "deserialize_optional_decimal"
718 )]
719 pub orig_trade_price: Option<Decimal>,
720
721 #[serde(rename = "@origTradeID", default)]
723 pub orig_trade_id: Option<String>,
724
725 #[serde(rename = "@holdingPeriodDateTime", default)]
727 pub holding_period_date_time: Option<String>,
728
729 #[serde(rename = "@openDateTime", default)]
731 pub open_date_time: Option<String>,
732
733 #[serde(rename = "@whenReopened", default)]
735 pub when_reopened: Option<String>,
736
737 #[serde(rename = "@notes", default)]
739 pub notes: Option<String>,
740
741 #[serde(rename = "@orderID", default)]
747 pub ib_order_id: Option<String>,
748
749 #[serde(rename = "@execID", default)]
751 pub exec_id: Option<String>,
752
753 #[serde(rename = "@tradeID", default)]
755 pub trade_id: Option<String>,
756
757 #[serde(rename = "@origTransactionID", default)]
759 pub orig_transaction_id: Option<String>,
760
761 #[serde(rename = "@origOrderID", default)]
763 pub orig_order_id: Option<String>,
764
765 #[serde(rename = "@dateTime", default)]
768 pub trade_time: Option<String>,
769
770 #[serde(rename = "@whenRealized", default)]
772 pub when_realized: Option<String>,
773
774 #[serde(rename = "@orderTime", default)]
776 pub order_time: Option<String>,
777
778 #[serde(rename = "@orderType", default)]
781 pub order_type: Option<OrderType>,
782
783 #[serde(rename = "@brokerageOrderID", default)]
785 pub brokerage_order_id: Option<String>,
786
787 #[serde(rename = "@orderReference", default)]
789 pub order_reference: Option<String>,
790
791 #[serde(rename = "@exchOrderId", default)]
793 pub exch_order_id: Option<String>,
794
795 #[serde(rename = "@extExecID", default)]
797 pub ext_exec_id: Option<String>,
798
799 #[serde(rename = "@ibExecID", default)]
801 pub ib_exec_id: Option<String>,
802
803 #[serde(rename = "@issuer", default)]
806 pub issuer: Option<String>,
807
808 #[serde(rename = "@issuerCountryCode", default)]
810 pub issuer_country_code: Option<String>,
811
812 #[serde(rename = "@subCategory", default)]
814 pub sub_category: Option<SubCategory>,
815
816 #[serde(rename = "@listingExchange", default)]
818 pub listing_exchange: Option<String>,
819
820 #[serde(rename = "@underlyingListingExchange", default)]
823 pub underlying_listing_exchange: Option<String>,
824
825 #[serde(rename = "@underlyingSecurityID", default)]
827 pub underlying_security_id: Option<String>,
828
829 #[serde(rename = "@traderID", default)]
832 pub trader_id: Option<String>,
833
834 #[serde(
836 rename = "@isAPIOrder",
837 default,
838 deserialize_with = "deserialize_optional_bool"
839 )]
840 pub is_api_order: Option<bool>,
841
842 #[serde(rename = "@volatilityOrderLink", default)]
844 pub volatility_order_link: Option<String>,
845
846 #[serde(rename = "@clearingFirmID", default)]
848 pub clearing_firm_id: Option<String>,
849
850 #[serde(rename = "@levelOfDetail", default)]
852 pub level_of_detail: Option<LevelOfDetail>,
853
854 #[serde(
857 rename = "@amount",
858 default,
859 deserialize_with = "deserialize_optional_decimal"
860 )]
861 pub amount: Option<Decimal>,
862
863 #[serde(
865 rename = "@tradeMoney",
866 default,
867 deserialize_with = "deserialize_optional_decimal"
868 )]
869 pub trade_money: Option<Decimal>,
870
871 #[serde(
873 rename = "@closePrice",
874 default,
875 deserialize_with = "deserialize_optional_decimal"
876 )]
877 pub close_price: Option<Decimal>,
878
879 #[serde(
881 rename = "@changeInPrice",
882 default,
883 deserialize_with = "deserialize_optional_decimal"
884 )]
885 pub change_in_price: Option<Decimal>,
886
887 #[serde(
889 rename = "@changeInQuantity",
890 default,
891 deserialize_with = "deserialize_optional_decimal"
892 )]
893 pub change_in_quantity: Option<Decimal>,
894
895 #[serde(rename = "@ibCommissionCurrency", default)]
897 pub commission_currency: Option<String>,
898
899 #[serde(rename = "@relatedTradeID", default)]
902 pub related_trade_id: Option<String>,
903
904 #[serde(rename = "@relatedTransactionID", default)]
906 pub related_transaction_id: Option<String>,
907
908 #[serde(
911 rename = "@accruedInt",
912 default,
913 deserialize_with = "deserialize_optional_decimal"
914 )]
915 pub accrued_int: Option<Decimal>,
916
917 #[serde(
919 rename = "@principalAdjustFactor",
920 default,
921 deserialize_with = "deserialize_optional_decimal"
922 )]
923 pub principal_adjust_factor: Option<Decimal>,
924
925 #[serde(rename = "@serialNumber", default)]
928 pub serial_number: Option<String>,
929
930 #[serde(rename = "@deliveryType", default)]
932 pub delivery_type: Option<String>,
933
934 #[serde(rename = "@commodityType", default)]
936 pub commodity_type: Option<String>,
937
938 #[serde(
940 rename = "@fineness",
941 default,
942 deserialize_with = "deserialize_optional_decimal"
943 )]
944 pub fineness: Option<Decimal>,
945
946 #[serde(rename = "@weight", default)]
948 pub weight: Option<String>,
949
950 #[serde(
953 rename = "@reportDate",
954 default,
955 deserialize_with = "deserialize_optional_date"
956 )]
957 pub report_date: Option<NaiveDate>,
958
959 #[serde(rename = "@exchange", default)]
961 pub exchange: Option<String>,
962
963 #[serde(rename = "@model", default)]
965 pub model: Option<String>,
966
967 #[serde(rename = "@acctAlias", default)]
969 pub acct_alias: Option<String>,
970
971 #[serde(rename = "@rtn", default)]
973 pub rtn: Option<String>,
974
975 #[serde(rename = "@positionActionID", default)]
977 pub position_action_id: Option<String>,
978
979 #[serde(
981 rename = "@initialInvestment",
982 default,
983 deserialize_with = "deserialize_optional_decimal"
984 )]
985 pub initial_investment: Option<Decimal>,
986}
987
988impl Trade {
989 pub fn derivative(&self) -> Option<DerivativeInfo> {
1022 match self.asset_category {
1023 AssetCategory::Option => {
1024 let strike = self.strike?;
1026 let expiry = self.expiry?;
1027 let put_call = self.put_call?;
1028 let underlying_symbol = self.underlying_symbol.clone()?;
1029
1030 Some(DerivativeInfo::Option {
1031 strike,
1032 expiry,
1033 put_call,
1034 underlying_symbol,
1035 underlying_conid: self.underlying_conid.clone(),
1036 })
1037 }
1038 AssetCategory::Future => {
1039 let expiry = self.expiry?;
1041 let underlying_symbol = self.underlying_symbol.clone()?;
1042
1043 Some(DerivativeInfo::Future {
1044 expiry,
1045 underlying_symbol,
1046 underlying_conid: self.underlying_conid.clone(),
1047 })
1048 }
1049 AssetCategory::FutureOption => {
1050 let strike = self.strike?;
1052 let expiry = self.expiry?;
1053 let put_call = self.put_call?;
1054 let underlying_symbol = self.underlying_symbol.clone()?;
1055
1056 Some(DerivativeInfo::FutureOption {
1057 strike,
1058 expiry,
1059 put_call,
1060 underlying_symbol,
1061 underlying_conid: self.underlying_conid.clone(),
1062 })
1063 }
1064 AssetCategory::Warrant => {
1065 let underlying_symbol = self.underlying_symbol.clone()?;
1067
1068 Some(DerivativeInfo::Warrant {
1069 strike: self.strike,
1070 expiry: self.expiry,
1071 underlying_symbol: Some(underlying_symbol),
1072 })
1073 }
1074 _ => None,
1076 }
1077 }
1078}
1079
1080#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
1119pub struct Position {
1120 #[serde(rename = "@accountId")]
1126 pub account_id: String,
1127
1128 #[serde(rename = "@conid")]
1131 pub conid: String,
1132
1133 #[serde(rename = "@symbol")]
1135 pub symbol: String,
1136
1137 #[serde(rename = "@description", default)]
1139 pub description: Option<String>,
1140
1141 #[serde(rename = "@assetCategory")]
1143 pub asset_category: AssetCategory,
1144
1145 #[serde(rename = "@cusip", default)]
1147 pub cusip: Option<String>,
1148
1149 #[serde(rename = "@isin", default)]
1151 pub isin: Option<String>,
1152
1153 #[serde(rename = "@figi", default)]
1155 pub figi: Option<String>,
1156
1157 #[serde(rename = "@securityID", default)]
1159 pub security_id: Option<String>,
1160
1161 #[serde(rename = "@securityIDType", default)]
1163 pub security_id_type: Option<SecurityIdType>,
1164
1165 #[serde(
1168 rename = "@multiplier",
1169 default,
1170 deserialize_with = "deserialize_optional_decimal"
1171 )]
1172 pub multiplier: Option<Decimal>,
1173
1174 #[serde(
1176 rename = "@strike",
1177 default,
1178 deserialize_with = "deserialize_optional_decimal"
1179 )]
1180 pub strike: Option<Decimal>,
1181
1182 #[serde(
1184 rename = "@expiry",
1185 default,
1186 deserialize_with = "deserialize_optional_date"
1187 )]
1188 pub expiry: Option<NaiveDate>,
1189
1190 #[serde(rename = "@putCall", default)]
1192 pub put_call: Option<PutCall>,
1193
1194 #[serde(rename = "@underlyingConid", default)]
1196 pub underlying_conid: Option<String>,
1197
1198 #[serde(rename = "@underlyingSymbol", default)]
1200 pub underlying_symbol: Option<String>,
1201
1202 #[serde(rename = "@position")]
1205 pub quantity: Decimal,
1206
1207 #[serde(rename = "@markPrice")]
1209 pub mark_price: Decimal,
1210
1211 #[serde(rename = "@positionValue")]
1213 pub position_value: Decimal,
1214
1215 #[serde(rename = "@side", default)]
1217 pub side: Option<String>,
1218
1219 #[serde(
1222 rename = "@openPrice",
1223 default,
1224 deserialize_with = "deserialize_optional_decimal"
1225 )]
1226 pub open_price: Option<Decimal>,
1227
1228 #[serde(
1230 rename = "@costBasisPrice",
1231 default,
1232 deserialize_with = "deserialize_optional_decimal"
1233 )]
1234 pub cost_basis_price: Option<Decimal>,
1235
1236 #[serde(
1238 rename = "@costBasisMoney",
1239 default,
1240 deserialize_with = "deserialize_optional_decimal"
1241 )]
1242 pub cost_basis_money: Option<Decimal>,
1243
1244 #[serde(
1246 rename = "@fifoPnlUnrealized",
1247 default,
1248 deserialize_with = "deserialize_optional_decimal"
1249 )]
1250 pub fifo_pnl_unrealized: Option<Decimal>,
1251
1252 #[serde(
1254 rename = "@percentOfNAV",
1255 default,
1256 deserialize_with = "deserialize_optional_decimal"
1257 )]
1258 pub percent_of_nav: Option<Decimal>,
1259
1260 #[serde(rename = "@currency")]
1263 pub currency: String,
1264
1265 #[serde(
1267 rename = "@fxRateToBase",
1268 default,
1269 deserialize_with = "deserialize_optional_decimal"
1270 )]
1271 pub fx_rate_to_base: Option<Decimal>,
1272
1273 #[serde(
1276 rename = "@reportDate",
1277 deserialize_with = "crate::parsers::xml_utils::deserialize_flex_date"
1278 )]
1279 pub report_date: NaiveDate,
1280
1281 #[serde(rename = "@holdingPeriodDateTime", default)]
1284 pub holding_period_date_time: Option<String>,
1285
1286 #[serde(rename = "@openDateTime", default)]
1288 pub open_date_time: Option<String>,
1289
1290 #[serde(rename = "@originatingTransactionID", default)]
1292 pub originating_transaction_id: Option<String>,
1293
1294 #[serde(rename = "@code", default)]
1296 pub code: Option<String>,
1297
1298 #[serde(rename = "@originatingOrderID", default)]
1304 pub originating_order_id: Option<String>,
1305
1306 #[serde(rename = "@issuer", default)]
1309 pub issuer: Option<String>,
1310
1311 #[serde(rename = "@issuerCountryCode", default)]
1313 pub issuer_country_code: Option<String>,
1314
1315 #[serde(rename = "@subCategory", default)]
1317 pub sub_category: Option<SubCategory>,
1318
1319 #[serde(rename = "@listingExchange", default)]
1321 pub listing_exchange: Option<String>,
1322
1323 #[serde(rename = "@underlyingListingExchange", default)]
1326 pub underlying_listing_exchange: Option<String>,
1327
1328 #[serde(rename = "@underlyingSecurityID", default)]
1330 pub underlying_security_id: Option<String>,
1331
1332 #[serde(
1335 rename = "@accruedInt",
1336 default,
1337 deserialize_with = "deserialize_optional_decimal"
1338 )]
1339 pub accrued_int: Option<Decimal>,
1340
1341 #[serde(
1343 rename = "@principalAdjustFactor",
1344 default,
1345 deserialize_with = "deserialize_optional_decimal"
1346 )]
1347 pub principal_adjust_factor: Option<Decimal>,
1348
1349 #[serde(rename = "@serialNumber", default)]
1352 pub serial_number: Option<String>,
1353
1354 #[serde(rename = "@deliveryType", default)]
1356 pub delivery_type: Option<String>,
1357
1358 #[serde(rename = "@commodityType", default)]
1360 pub commodity_type: Option<String>,
1361
1362 #[serde(
1364 rename = "@fineness",
1365 default,
1366 deserialize_with = "deserialize_optional_decimal"
1367 )]
1368 pub fineness: Option<Decimal>,
1369
1370 #[serde(rename = "@weight", default)]
1372 pub weight: Option<String>,
1373
1374 #[serde(rename = "@levelOfDetail", default)]
1377 pub level_of_detail: Option<LevelOfDetail>,
1378
1379 #[serde(rename = "@model", default)]
1381 pub model: Option<String>,
1382
1383 #[serde(rename = "@acctAlias", default)]
1385 pub acct_alias: Option<String>,
1386
1387 #[serde(
1389 rename = "@vestingDate",
1390 default,
1391 deserialize_with = "deserialize_optional_date"
1392 )]
1393 pub vesting_date: Option<NaiveDate>,
1394}
1395
1396impl Position {
1397 pub fn derivative(&self) -> Option<DerivativeInfo> {
1470 match self.asset_category {
1471 AssetCategory::Option => {
1472 let strike = self.strike?;
1474 let expiry = self.expiry?;
1475 let put_call = self.put_call?;
1476 let underlying_symbol = self.underlying_symbol.clone()?;
1477
1478 Some(DerivativeInfo::Option {
1479 strike,
1480 expiry,
1481 put_call,
1482 underlying_symbol,
1483 underlying_conid: self.underlying_conid.clone(),
1484 })
1485 }
1486 AssetCategory::Future => {
1487 let expiry = self.expiry?;
1489 let underlying_symbol = self.underlying_symbol.clone()?;
1490
1491 Some(DerivativeInfo::Future {
1492 expiry,
1493 underlying_symbol,
1494 underlying_conid: self.underlying_conid.clone(),
1495 })
1496 }
1497 AssetCategory::FutureOption => {
1498 let strike = self.strike?;
1500 let expiry = self.expiry?;
1501 let put_call = self.put_call?;
1502 let underlying_symbol = self.underlying_symbol.clone()?;
1503
1504 Some(DerivativeInfo::FutureOption {
1505 strike,
1506 expiry,
1507 put_call,
1508 underlying_symbol,
1509 underlying_conid: self.underlying_conid.clone(),
1510 })
1511 }
1512 AssetCategory::Warrant => {
1513 let underlying_symbol = self.underlying_symbol.clone()?;
1515
1516 Some(DerivativeInfo::Warrant {
1517 strike: self.strike,
1518 expiry: self.expiry,
1519 underlying_symbol: Some(underlying_symbol),
1520 })
1521 }
1522 _ => None,
1524 }
1525 }
1526}
1527
1528#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
1575pub struct CashTransaction {
1576 #[serde(rename = "@accountId")]
1582 pub account_id: String,
1583
1584 #[serde(rename = "@transactionID", default)]
1586 pub transaction_id: Option<String>,
1587
1588 #[serde(rename = "@type", default)]
1591 pub transaction_type: Option<String>,
1592
1593 #[serde(rename = "@description", default)]
1595 pub description: Option<String>,
1596
1597 #[serde(rename = "@amount")]
1599 pub amount: Decimal,
1600
1601 #[serde(rename = "@currency")]
1603 pub currency: String,
1604
1605 #[serde(
1607 rename = "@fxRateToBase",
1608 default,
1609 deserialize_with = "deserialize_optional_decimal"
1610 )]
1611 pub fx_rate_to_base: Option<Decimal>,
1612
1613 #[serde(
1616 rename = "@date",
1617 default,
1618 deserialize_with = "deserialize_optional_date"
1619 )]
1620 pub date: Option<NaiveDate>,
1621
1622 #[serde(
1624 rename = "@settleDate",
1625 default,
1626 deserialize_with = "deserialize_optional_date"
1627 )]
1628 pub settle_date: Option<NaiveDate>,
1629
1630 #[serde(
1632 rename = "@exDate",
1633 default,
1634 deserialize_with = "deserialize_optional_date"
1635 )]
1636 pub ex_date: Option<NaiveDate>,
1637
1638 #[serde(rename = "@conid", default)]
1641 pub conid: Option<String>,
1642
1643 #[serde(rename = "@symbol", default)]
1645 pub symbol: Option<String>,
1646
1647 #[serde(rename = "@assetCategory", default)]
1649 pub asset_category: Option<AssetCategory>,
1650
1651 #[serde(rename = "@cusip", default)]
1653 pub cusip: Option<String>,
1654
1655 #[serde(rename = "@isin", default)]
1657 pub isin: Option<String>,
1658
1659 #[serde(rename = "@figi", default)]
1661 pub figi: Option<String>,
1662
1663 #[serde(rename = "@securityID", default)]
1665 pub security_id: Option<String>,
1666
1667 #[serde(rename = "@securityIDType", default)]
1669 pub security_id_type: Option<SecurityIdType>,
1670
1671 #[serde(
1674 rename = "@multiplier",
1675 default,
1676 deserialize_with = "deserialize_optional_decimal"
1677 )]
1678 pub multiplier: Option<Decimal>,
1679
1680 #[serde(
1682 rename = "@strike",
1683 default,
1684 deserialize_with = "deserialize_optional_decimal"
1685 )]
1686 pub strike: Option<Decimal>,
1687
1688 #[serde(
1690 rename = "@expiry",
1691 default,
1692 deserialize_with = "deserialize_optional_date"
1693 )]
1694 pub expiry: Option<NaiveDate>,
1695
1696 #[serde(rename = "@putCall", default)]
1698 pub put_call: Option<PutCall>,
1699
1700 #[serde(rename = "@underlyingConid", default)]
1702 pub underlying_conid: Option<String>,
1703
1704 #[serde(rename = "@underlyingSymbol", default)]
1706 pub underlying_symbol: Option<String>,
1707
1708 #[serde(rename = "@code", default)]
1710 pub code: Option<String>,
1711
1712 #[serde(rename = "@dateTime", default)]
1718 pub date_time: Option<String>,
1719
1720 #[serde(
1722 rename = "@reportDate",
1723 default,
1724 deserialize_with = "deserialize_optional_date"
1725 )]
1726 pub report_date: Option<NaiveDate>,
1727
1728 #[serde(
1730 rename = "@availableForTradingDate",
1731 default,
1732 deserialize_with = "deserialize_optional_date"
1733 )]
1734 pub available_for_trading_date: Option<NaiveDate>,
1735
1736 #[serde(rename = "@actionID", default)]
1739 pub action_id: Option<String>,
1740
1741 #[serde(rename = "@tradeID", default)]
1743 pub trade_id: Option<String>,
1744
1745 #[serde(rename = "@clientReference", default)]
1747 pub client_reference: Option<String>,
1748
1749 #[serde(rename = "@issuer", default)]
1752 pub issuer: Option<String>,
1753
1754 #[serde(rename = "@issuerCountryCode", default)]
1756 pub issuer_country_code: Option<String>,
1757
1758 #[serde(rename = "@subCategory", default)]
1760 pub sub_category: Option<SubCategory>,
1761
1762 #[serde(rename = "@listingExchange", default)]
1764 pub listing_exchange: Option<String>,
1765
1766 #[serde(rename = "@underlyingListingExchange", default)]
1769 pub underlying_listing_exchange: Option<String>,
1770
1771 #[serde(rename = "@underlyingSecurityID", default)]
1773 pub underlying_security_id: Option<String>,
1774
1775 #[serde(
1778 rename = "@principalAdjustFactor",
1779 default,
1780 deserialize_with = "deserialize_optional_decimal"
1781 )]
1782 pub principal_adjust_factor: Option<Decimal>,
1783
1784 #[serde(rename = "@serialNumber", default)]
1787 pub serial_number: Option<String>,
1788
1789 #[serde(rename = "@deliveryType", default)]
1791 pub delivery_type: Option<String>,
1792
1793 #[serde(rename = "@commodityType", default)]
1795 pub commodity_type: Option<String>,
1796
1797 #[serde(
1799 rename = "@fineness",
1800 default,
1801 deserialize_with = "deserialize_optional_decimal"
1802 )]
1803 pub fineness: Option<Decimal>,
1804
1805 #[serde(rename = "@weight", default)]
1807 pub weight: Option<String>,
1808
1809 #[serde(rename = "@levelOfDetail", default)]
1812 pub level_of_detail: Option<String>,
1813
1814 #[serde(rename = "@model", default)]
1816 pub model: Option<String>,
1817
1818 #[serde(rename = "@acctAlias", default)]
1820 pub acct_alias: Option<String>,
1821}
1822
1823#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
1867pub struct CorporateAction {
1868 #[serde(rename = "@accountId")]
1874 pub account_id: String,
1875
1876 #[serde(rename = "@transactionID", default)]
1878 pub transaction_id: Option<String>,
1879
1880 #[serde(rename = "@type", default)]
1883 pub action_type: Option<String>,
1884
1885 #[serde(rename = "@description", default)]
1887 pub description: Option<String>,
1888
1889 #[serde(
1892 rename = "@date",
1893 default,
1894 deserialize_with = "deserialize_optional_date"
1895 )]
1896 pub action_date: Option<NaiveDate>,
1897
1898 #[serde(
1900 rename = "@reportDate",
1901 deserialize_with = "crate::parsers::xml_utils::deserialize_flex_date"
1902 )]
1903 pub report_date: NaiveDate,
1904
1905 #[serde(
1907 rename = "@exDate",
1908 default,
1909 deserialize_with = "deserialize_optional_date"
1910 )]
1911 pub ex_date: Option<NaiveDate>,
1912
1913 #[serde(
1915 rename = "@payDate",
1916 default,
1917 deserialize_with = "deserialize_optional_date"
1918 )]
1919 pub pay_date: Option<NaiveDate>,
1920
1921 #[serde(
1923 rename = "@recordDate",
1924 default,
1925 deserialize_with = "deserialize_optional_date"
1926 )]
1927 pub record_date: Option<NaiveDate>,
1928
1929 #[serde(rename = "@conid")]
1932 pub conid: String,
1933
1934 #[serde(rename = "@symbol")]
1936 pub symbol: String,
1937
1938 #[serde(rename = "@assetCategory", default)]
1940 pub asset_category: Option<AssetCategory>,
1941
1942 #[serde(rename = "@cusip", default)]
1944 pub cusip: Option<String>,
1945
1946 #[serde(rename = "@isin", default)]
1948 pub isin: Option<String>,
1949
1950 #[serde(rename = "@figi", default)]
1952 pub figi: Option<String>,
1953
1954 #[serde(rename = "@securityID", default)]
1956 pub security_id: Option<String>,
1957
1958 #[serde(rename = "@securityIDType", default)]
1960 pub security_id_type: Option<SecurityIdType>,
1961
1962 #[serde(
1965 rename = "@multiplier",
1966 default,
1967 deserialize_with = "deserialize_optional_decimal"
1968 )]
1969 pub multiplier: Option<Decimal>,
1970
1971 #[serde(
1973 rename = "@strike",
1974 default,
1975 deserialize_with = "deserialize_optional_decimal"
1976 )]
1977 pub strike: Option<Decimal>,
1978
1979 #[serde(
1981 rename = "@expiry",
1982 default,
1983 deserialize_with = "deserialize_optional_date"
1984 )]
1985 pub expiry: Option<NaiveDate>,
1986
1987 #[serde(rename = "@putCall", default)]
1989 pub put_call: Option<PutCall>,
1990
1991 #[serde(rename = "@underlyingConid", default)]
1993 pub underlying_conid: Option<String>,
1994
1995 #[serde(rename = "@underlyingSymbol", default)]
1997 pub underlying_symbol: Option<String>,
1998
1999 #[serde(
2002 rename = "@quantity",
2003 default,
2004 deserialize_with = "deserialize_optional_decimal"
2005 )]
2006 pub quantity: Option<Decimal>,
2007
2008 #[serde(
2010 rename = "@amount",
2011 default,
2012 deserialize_with = "deserialize_optional_decimal"
2013 )]
2014 pub amount: Option<Decimal>,
2015
2016 #[serde(
2018 rename = "@proceeds",
2019 default,
2020 deserialize_with = "deserialize_optional_decimal"
2021 )]
2022 pub proceeds: Option<Decimal>,
2023
2024 #[serde(
2026 rename = "@value",
2027 default,
2028 deserialize_with = "deserialize_optional_decimal"
2029 )]
2030 pub value: Option<Decimal>,
2031
2032 #[serde(
2034 rename = "@cost",
2035 default,
2036 deserialize_with = "deserialize_optional_decimal"
2037 )]
2038 pub cost: Option<Decimal>,
2039
2040 #[serde(
2043 rename = "@fifoPnlRealized",
2044 default,
2045 deserialize_with = "deserialize_optional_decimal"
2046 )]
2047 pub fifo_pnl_realized: Option<Decimal>,
2048
2049 #[serde(
2051 rename = "@mtmPnl",
2052 default,
2053 deserialize_with = "deserialize_optional_decimal"
2054 )]
2055 pub mtm_pnl: Option<Decimal>,
2056
2057 #[serde(rename = "@currency", default)]
2060 pub currency: Option<String>,
2061
2062 #[serde(
2064 rename = "@fxRateToBase",
2065 default,
2066 deserialize_with = "deserialize_optional_decimal"
2067 )]
2068 pub fx_rate_to_base: Option<Decimal>,
2069
2070 #[serde(rename = "@code", default)]
2072 pub code: Option<String>,
2073
2074 #[serde(rename = "@actionID", default)]
2080 pub action_id: Option<String>,
2081
2082 #[serde(rename = "@dateTime", default)]
2085 pub date_time: Option<String>,
2086
2087 #[serde(rename = "@issuer", default)]
2090 pub issuer: Option<String>,
2091
2092 #[serde(rename = "@issuerCountryCode", default)]
2094 pub issuer_country_code: Option<String>,
2095
2096 #[serde(rename = "@subCategory", default)]
2098 pub sub_category: Option<SubCategory>,
2099
2100 #[serde(rename = "@listingExchange", default)]
2102 pub listing_exchange: Option<String>,
2103
2104 #[serde(rename = "@underlyingListingExchange", default)]
2107 pub underlying_listing_exchange: Option<String>,
2108
2109 #[serde(rename = "@underlyingSecurityID", default)]
2111 pub underlying_security_id: Option<String>,
2112
2113 #[serde(
2116 rename = "@accruedInt",
2117 default,
2118 deserialize_with = "deserialize_optional_decimal"
2119 )]
2120 pub accrued_int: Option<Decimal>,
2121
2122 #[serde(
2124 rename = "@principalAdjustFactor",
2125 default,
2126 deserialize_with = "deserialize_optional_decimal"
2127 )]
2128 pub principal_adjust_factor: Option<Decimal>,
2129
2130 #[serde(rename = "@serialNumber", default)]
2133 pub serial_number: Option<String>,
2134
2135 #[serde(rename = "@deliveryType", default)]
2137 pub delivery_type: Option<String>,
2138
2139 #[serde(rename = "@commodityType", default)]
2141 pub commodity_type: Option<String>,
2142
2143 #[serde(
2145 rename = "@fineness",
2146 default,
2147 deserialize_with = "deserialize_optional_decimal"
2148 )]
2149 pub fineness: Option<Decimal>,
2150
2151 #[serde(rename = "@weight", default)]
2153 pub weight: Option<String>,
2154
2155 #[serde(rename = "@levelOfDetail", default)]
2158 pub level_of_detail: Option<String>,
2159
2160 #[serde(rename = "@model", default)]
2162 pub model: Option<String>,
2163
2164 #[serde(rename = "@acctAlias", default)]
2166 pub acct_alias: Option<String>,
2167}
2168
2169#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
2211pub struct SecurityInfo {
2212 #[serde(rename = "@assetCategory")]
2218 pub asset_category: AssetCategory,
2219
2220 #[serde(rename = "@symbol")]
2222 pub symbol: String,
2223
2224 #[serde(rename = "@description", default)]
2226 pub description: Option<String>,
2227
2228 #[serde(rename = "@conid")]
2230 pub conid: String,
2231
2232 #[serde(rename = "@securityID", default)]
2234 pub security_id: Option<String>,
2235
2236 #[serde(rename = "@securityIDType", default)]
2238 pub security_id_type: Option<SecurityIdType>,
2239
2240 #[serde(rename = "@cusip", default)]
2242 pub cusip: Option<String>,
2243
2244 #[serde(rename = "@isin", default)]
2246 pub isin: Option<String>,
2247
2248 #[serde(rename = "@figi", default)]
2250 pub figi: Option<String>,
2251
2252 #[serde(rename = "@sedol", default)]
2254 pub sedol: Option<String>,
2255
2256 #[serde(
2259 rename = "@multiplier",
2260 default,
2261 deserialize_with = "deserialize_optional_decimal"
2262 )]
2263 pub multiplier: Option<Decimal>,
2264
2265 #[serde(
2267 rename = "@strike",
2268 default,
2269 deserialize_with = "deserialize_optional_decimal"
2270 )]
2271 pub strike: Option<Decimal>,
2272
2273 #[serde(
2275 rename = "@expiry",
2276 default,
2277 deserialize_with = "deserialize_optional_date"
2278 )]
2279 pub expiry: Option<NaiveDate>,
2280
2281 #[serde(rename = "@putCall", default)]
2283 pub put_call: Option<PutCall>,
2284
2285 #[serde(rename = "@underlyingConid", default)]
2287 pub underlying_conid: Option<String>,
2288
2289 #[serde(rename = "@underlyingSymbol", default)]
2291 pub underlying_symbol: Option<String>,
2292
2293 #[serde(
2296 rename = "@maturity",
2297 default,
2298 deserialize_with = "deserialize_optional_date"
2299 )]
2300 pub maturity: Option<NaiveDate>,
2301
2302 #[serde(
2304 rename = "@principalAdjustFactor",
2305 default,
2306 deserialize_with = "deserialize_optional_decimal"
2307 )]
2308 pub principal_adjust_factor: Option<Decimal>,
2309
2310 #[serde(rename = "@currency", default)]
2313 pub currency: Option<String>,
2314
2315 #[serde(rename = "@listingExchange", default)]
2321 pub listing_exchange: Option<String>,
2322
2323 #[serde(rename = "@underlyingSecurityID", default)]
2325 pub underlying_security_id: Option<String>,
2326
2327 #[serde(rename = "@underlyingListingExchange", default)]
2329 pub underlying_listing_exchange: Option<String>,
2330
2331 #[serde(rename = "@issuer", default)]
2334 pub issuer: Option<String>,
2335
2336 #[serde(rename = "@issuerCountryCode", default)]
2338 pub issuer_country_code: Option<String>,
2339
2340 #[serde(rename = "@subCategory", default)]
2342 pub sub_category: Option<SubCategory>,
2343
2344 #[serde(rename = "@deliveryMonth", default)]
2347 pub delivery_month: Option<String>,
2348
2349 #[serde(rename = "@serialNumber", default)]
2352 pub serial_number: Option<String>,
2353
2354 #[serde(rename = "@deliveryType", default)]
2356 pub delivery_type: Option<String>,
2357
2358 #[serde(rename = "@commodityType", default)]
2360 pub commodity_type: Option<String>,
2361
2362 #[serde(
2364 rename = "@fineness",
2365 default,
2366 deserialize_with = "deserialize_optional_decimal"
2367 )]
2368 pub fineness: Option<Decimal>,
2369
2370 #[serde(rename = "@weight", default)]
2372 pub weight: Option<String>,
2373
2374 #[serde(rename = "@code", default)]
2377 pub code: Option<String>,
2378}
2379
2380#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
2414pub struct ConversionRate {
2415 #[serde(
2417 rename = "@reportDate",
2418 deserialize_with = "crate::parsers::xml_utils::deserialize_flex_date"
2419 )]
2420 pub report_date: NaiveDate,
2421
2422 #[serde(rename = "@fromCurrency")]
2424 pub from_currency: String,
2425
2426 #[serde(rename = "@toCurrency")]
2428 pub to_currency: String,
2429
2430 #[serde(rename = "@rate")]
2432 pub rate: Decimal,
2433}
2434
2435#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
2437pub struct SecuritiesInfoWrapper {
2438 #[serde(rename = "SecurityInfo", default)]
2440 pub items: Vec<SecurityInfo>,
2441}
2442
2443#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
2445pub struct ConversionRatesWrapper {
2446 #[serde(rename = "ConversionRate", default)]
2448 pub items: Vec<ConversionRate>,
2449}
2450
2451#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
2455pub struct EquitySummaryWrapper {
2456 #[serde(rename = "EquitySummaryByReportDateInBase", default)]
2458 pub items: Vec<super::extended::EquitySummaryByReportDateInBase>,
2459}
2460
2461#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
2463pub struct CashReportWrapper {
2464 #[serde(rename = "CashReportCurrency", default)]
2466 pub items: Vec<super::extended::CashReportCurrency>,
2467}
2468
2469#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
2471pub struct TradeConfirmsWrapper {
2472 #[serde(rename = "TradeConfirm", default)]
2474 pub items: Vec<super::extended::TradeConfirm>,
2475}
2476
2477#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
2479pub struct OptionEAEWrapper {
2480 #[serde(rename = "OptionEAE", default)]
2482 pub items: Vec<super::extended::OptionEAE>,
2483}
2484
2485#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
2487pub struct FxTransactionsWrapper {
2488 #[serde(rename = "FxTransaction", default)]
2490 pub items: Vec<super::extended::FxTransaction>,
2491}
2492
2493#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
2495pub struct ChangeInDividendAccrualsWrapper {
2496 #[serde(rename = "ChangeInDividendAccrual", default)]
2498 pub items: Vec<super::extended::ChangeInDividendAccrual>,
2499}
2500
2501#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
2503pub struct OpenDividendAccrualsWrapper {
2504 #[serde(rename = "OpenDividendAccrual", default)]
2506 pub items: Vec<super::extended::OpenDividendAccrual>,
2507}
2508
2509#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
2511pub struct InterestAccrualsWrapper {
2512 #[serde(rename = "InterestAccrualsCurrency", default)]
2514 pub items: Vec<super::extended::InterestAccrualsCurrency>,
2515}
2516
2517#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
2519pub struct TransfersWrapper {
2520 #[serde(rename = "Transfer", default)]
2522 pub items: Vec<super::extended::Transfer>,
2523}
2524
2525#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
2529pub struct MTMPerformanceSummaryWrapper {
2530 #[serde(rename = "MTMPerformanceSummaryUnderlying", default)]
2532 pub items: Vec<super::extended::MTMPerformanceSummaryUnderlying>,
2533}
2534
2535#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
2537pub struct FIFOPerformanceSummaryWrapper {
2538 #[serde(rename = "FIFOPerformanceSummaryUnderlying", default)]
2540 pub items: Vec<super::extended::FIFOPerformanceSummaryUnderlying>,
2541}
2542
2543#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
2545pub struct MTDYTDPerformanceSummaryWrapper {
2546 #[serde(rename = "MTDYTDPerformanceSummaryUnderlying", default)]
2548 pub items: Vec<super::extended::MTDYTDPerformanceSummary>,
2549}
2550
2551#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
2553pub struct StatementOfFundsWrapper {
2554 #[serde(rename = "StatementOfFundsLine", default)]
2556 pub items: Vec<super::extended::StatementOfFundsLine>,
2557}
2558
2559#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
2561pub struct ChangeInPositionValueWrapper {
2562 #[serde(rename = "ChangeInPositionValue", default)]
2564 pub items: Vec<super::extended::ChangeInPositionValue>,
2565}
2566
2567#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
2569pub struct UnbundledCommissionDetailWrapper {
2570 #[serde(rename = "UnbundledCommissionDetail", default)]
2572 pub items: Vec<super::extended::UnbundledCommissionDetail>,
2573}
2574
2575#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
2577pub struct ClientFeesWrapper {
2578 #[serde(rename = "ClientFee", default)]
2580 pub items: Vec<super::extended::ClientFee>,
2581}
2582
2583#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
2585pub struct ClientFeesDetailWrapper {
2586 #[serde(rename = "ClientFeesDetail", default)]
2588 pub items: Vec<super::extended::ClientFeesDetail>,
2589}
2590
2591#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
2593pub struct SLBActivitiesWrapper {
2594 #[serde(rename = "SLBActivity", default)]
2596 pub items: Vec<super::extended::SLBActivity>,
2597}
2598
2599#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
2601pub struct SLBFeesWrapper {
2602 #[serde(rename = "SLBFee", default)]
2604 pub items: Vec<super::extended::SLBFee>,
2605}
2606
2607#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
2609pub struct HardToBorrowDetailsWrapper {
2610 #[serde(rename = "HardToBorrowDetail", default)]
2612 pub items: Vec<super::extended::HardToBorrowDetail>,
2613}
2614
2615#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
2617pub struct FxLotsWrapper {
2618 #[serde(rename = "FxLot", default)]
2620 pub items: Vec<super::extended::FxLot>,
2621}
2622
2623#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
2625pub struct UnsettledTransfersWrapper {
2626 #[serde(rename = "UnsettledTransfer", default)]
2628 pub items: Vec<super::extended::UnsettledTransfer>,
2629}
2630
2631#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
2633pub struct TradeTransfersWrapper {
2634 #[serde(rename = "TradeTransfer", default)]
2636 pub items: Vec<super::extended::TradeTransfer>,
2637}
2638
2639#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
2641pub struct PriorPeriodPositionsWrapper {
2642 #[serde(rename = "PriorPeriodPosition", default)]
2644 pub items: Vec<super::extended::PriorPeriodPosition>,
2645}
2646
2647#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
2649pub struct TierInterestDetailsWrapper {
2650 #[serde(rename = "TierInterestDetail", default)]
2652 pub items: Vec<super::extended::TierInterestDetail>,
2653}
2654
2655#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
2657pub struct DebitCardActivitiesWrapper {
2658 #[serde(rename = "DebitCardActivity", default)]
2660 pub items: Vec<super::extended::DebitCardActivity>,
2661}
2662
2663#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
2665pub struct SalesTaxWrapper {
2666 #[serde(rename = "SalesTax", default)]
2668 pub items: Vec<super::extended::SalesTax>,
2669}
2670
2671#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
2673pub struct SymbolSummaryWrapper {
2674 #[serde(rename = "SymbolSummary", default)]
2676 pub items: Vec<super::extended::SymbolSummary>,
2677}
2678
2679#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
2681pub struct AssetSummaryWrapper {
2682 #[serde(rename = "AssetSummary", default)]
2684 pub items: Vec<super::extended::AssetSummary>,
2685}
2686
2687#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
2689pub struct OrdersWrapper {
2690 #[serde(rename = "Order", default)]
2692 pub items: Vec<super::extended::Order>,
2693}