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 deserialize_optional_string,
14};
15
16#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
50#[serde(rename = "FlexQueryResponse")]
51pub struct FlexQueryResponse {
52 #[serde(rename = "@queryName", default)]
54 pub query_name: Option<String>,
55
56 #[serde(rename = "@type", default)]
58 pub query_type: Option<String>,
59
60 #[serde(rename = "FlexStatements")]
62 pub statements: FlexStatementsWrapper,
63}
64
65#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
67pub struct FlexStatementsWrapper {
68 #[serde(rename = "@count", default)]
70 pub count: Option<String>,
71
72 #[serde(rename = "FlexStatement")]
74 pub statements: Vec<ActivityFlexStatement>,
75}
76
77#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
123#[serde(rename = "FlexStatement")]
124pub struct ActivityFlexStatement {
125 #[serde(
127 rename = "@accountId",
128 default,
129 deserialize_with = "deserialize_optional_string"
130 )]
131 pub account_id: Option<String>,
132
133 #[serde(
135 rename = "@fromDate",
136 default,
137 deserialize_with = "deserialize_optional_date"
138 )]
139 pub from_date: Option<NaiveDate>,
140
141 #[serde(
143 rename = "@toDate",
144 default,
145 deserialize_with = "deserialize_optional_date"
146 )]
147 pub to_date: Option<NaiveDate>,
148
149 #[serde(
151 rename = "@whenGenerated",
152 default,
153 deserialize_with = "deserialize_optional_string"
154 )]
155 pub when_generated: Option<String>, #[serde(rename = "Trades", default)]
159 pub trades: TradesWrapper,
160
161 #[serde(rename = "OpenPositions", default)]
163 pub positions: PositionsWrapper,
164
165 #[serde(rename = "CashTransactions", default)]
167 pub cash_transactions: CashTransactionsWrapper,
168
169 #[serde(rename = "CorporateActions", default)]
171 pub corporate_actions: CorporateActionsWrapper,
172
173 #[serde(rename = "SecuritiesInfo", default)]
175 pub securities_info: SecuritiesInfoWrapper,
176
177 #[serde(rename = "ConversionRates", default)]
179 pub conversion_rates: ConversionRatesWrapper,
180
181 #[serde(rename = "AccountInformation", default)]
184 pub account_information: Option<super::extended::AccountInformation>,
185
186 #[serde(rename = "ChangeInNAV", default)]
188 pub change_in_nav: Option<super::extended::ChangeInNAV>,
189
190 #[serde(rename = "EquitySummaryInBase", default)]
192 pub equity_summary: EquitySummaryWrapper,
193
194 #[serde(rename = "CashReport", default)]
196 pub cash_report: CashReportWrapper,
197
198 #[serde(rename = "TradeConfirms", default)]
200 pub trade_confirms: TradeConfirmsWrapper,
201
202 #[serde(rename = "OptionEAE", default)]
204 pub option_eae: OptionEAEWrapper,
205
206 #[serde(rename = "FxTransactions", default)]
208 pub fx_transactions: FxTransactionsWrapper,
209
210 #[serde(rename = "ChangeInDividendAccruals", default)]
212 pub change_in_dividend_accruals: ChangeInDividendAccrualsWrapper,
213
214 #[serde(rename = "OpenDividendAccruals", default)]
216 pub open_dividend_accruals: OpenDividendAccrualsWrapper,
217
218 #[serde(rename = "InterestAccruals", default)]
220 pub interest_accruals: InterestAccrualsWrapper,
221
222 #[serde(rename = "Transfers", default)]
224 pub transfers: TransfersWrapper,
225
226 #[serde(rename = "MTMPerformanceSummaryInBase", default)]
229 pub mtm_performance_summary: MTMPerformanceSummaryWrapper,
230
231 #[serde(rename = "FIFOPerformanceSummaryInBase", default)]
233 pub fifo_performance_summary: FIFOPerformanceSummaryWrapper,
234
235 #[serde(rename = "MTDYTDPerformanceSummary", default)]
237 pub mtd_ytd_performance_summary: MTDYTDPerformanceSummaryWrapper,
238
239 #[serde(rename = "StmtFunds", default)]
241 pub statement_of_funds: StatementOfFundsWrapper,
242
243 #[serde(rename = "ChangeInPositionValues", default)]
245 pub change_in_position_values: ChangeInPositionValueWrapper,
246
247 #[serde(rename = "UnbundledCommissionDetails", default)]
249 pub unbundled_commission_details: UnbundledCommissionDetailWrapper,
250
251 #[serde(rename = "ClientFees", default)]
253 pub client_fees: ClientFeesWrapper,
254
255 #[serde(rename = "ClientFeesDetails", default)]
257 pub client_fees_detail: ClientFeesDetailWrapper,
258
259 #[serde(rename = "SLBActivities", default)]
261 pub slb_activities: SLBActivitiesWrapper,
262
263 #[serde(rename = "SLBFees", default)]
265 pub slb_fees: SLBFeesWrapper,
266
267 #[serde(rename = "HardToBorrowDetails", default)]
269 pub hard_to_borrow_details: HardToBorrowDetailsWrapper,
270
271 #[serde(rename = "FxLots", default)]
273 pub fx_lots: FxLotsWrapper,
274
275 #[serde(rename = "UnsettledTransfers", default)]
277 pub unsettled_transfers: UnsettledTransfersWrapper,
278
279 #[serde(rename = "TradeTransfers", default)]
281 pub trade_transfers: TradeTransfersWrapper,
282
283 #[serde(rename = "PriorPeriodPositions", default)]
285 pub prior_period_positions: PriorPeriodPositionsWrapper,
286
287 #[serde(rename = "TierInterestDetails", default)]
289 pub tier_interest_details: TierInterestDetailsWrapper,
290
291 #[serde(rename = "DebitCardActivities", default)]
293 pub debit_card_activities: DebitCardActivitiesWrapper,
294
295 #[serde(rename = "SalesTaxes", default)]
297 pub sales_tax: SalesTaxWrapper,
298
299 #[serde(rename = "DepositsOnHold", default, skip_serializing)]
307 deposits_on_hold: IgnoredSection,
308 #[serde(rename = "FxPositions", default, skip_serializing)]
309 fx_positions: IgnoredSection,
310 #[serde(rename = "NetStockPositions", default)]
312 pub net_stock_positions: NetStockPositionsWrapper,
313 #[serde(rename = "ComplexPositions", default, skip_serializing)]
314 complex_positions: IgnoredSection,
315 #[serde(rename = "CFDCharges", default)]
317 pub cfd_charges: CFDChargesWrapper,
318 #[serde(rename = "CommissionCredits", default, skip_serializing)]
319 commission_credits: IgnoredSection,
320 #[serde(rename = "FdicInsuredDepositsByBank", default, skip_serializing)]
321 fdic_insured_deposits: IgnoredSection,
322 #[serde(rename = "HKIPOOpenSubscriptions", default, skip_serializing)]
323 hk_ipo_open_subscriptions: IgnoredSection,
324 #[serde(rename = "HKIPOSubscriptionActivity", default, skip_serializing)]
325 hk_ipo_subscription_activity: IgnoredSection,
326 #[serde(rename = "IBGNoteTransactions", default, skip_serializing)]
327 ibg_note_transactions: IgnoredSection,
328 #[serde(rename = "IncentiveCouponAccrualDetails", default, skip_serializing)]
329 incentive_coupon_accruals: IgnoredSection,
330 #[serde(rename = "MutualFundDividendDetails", default, skip_serializing)]
331 mutual_fund_dividends: IgnoredSection,
332 #[serde(rename = "NetStockPositionSummary", default, skip_serializing)]
333 net_stock_position_summary: IgnoredSection,
334 #[serde(rename = "PendingExcercises", default, skip_serializing)]
335 pending_exercises: IgnoredSection,
336 #[serde(rename = "RoutingCommissions", default, skip_serializing)]
337 routing_commissions: IgnoredSection,
338 #[serde(rename = "SLBCollaterals", default, skip_serializing)]
339 slb_collaterals: IgnoredSection,
340 #[serde(rename = "SLBOpenContracts", default)]
342 pub slb_open_contracts: SLBOpenContractsWrapper,
343 #[serde(rename = "SoftDollars", default, skip_serializing)]
344 soft_dollars: IgnoredSection,
345 #[serde(rename = "StockGrantActivities", default)]
347 pub stock_grant_activities: StockGrantActivitiesWrapper,
348 #[serde(rename = "TransactionTaxes", default)]
350 pub transaction_taxes: TransactionTaxesWrapper,
351 #[serde(rename = "UnbookedTrades", default, skip_serializing)]
352 unbooked_trades: IgnoredSection,
353 }
356
357#[derive(Debug, Clone, PartialEq, Default)]
359struct IgnoredSection;
360
361impl<'de> serde::Deserialize<'de> for IgnoredSection {
362 fn deserialize<D>(deserializer: D) -> std::result::Result<Self, D::Error>
363 where
364 D: serde::Deserializer<'de>,
365 {
366 serde::de::IgnoredAny::deserialize(deserializer)?;
368 Ok(IgnoredSection)
369 }
370}
371
372#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
377#[serde(rename_all = "PascalCase")]
378enum TradesItem {
379 Trade(Trade),
380 Order(Trade),
381 SymbolSummary(Trade),
382 AssetSummary(Trade),
383 WashSale(Trade),
384 Lot(Trade),
385}
386
387#[derive(Debug, Clone, PartialEq, Default, Serialize)]
397pub struct TradesWrapper {
398 pub items: Vec<Trade>,
400
401 pub wash_sales: Vec<Trade>,
403
404 pub lots: Vec<Trade>,
407
408 pub orders: Vec<Trade>,
410
411 pub symbol_summaries: Vec<Trade>,
413
414 pub asset_summaries: Vec<Trade>,
416}
417
418impl<'de> serde::Deserialize<'de> for TradesWrapper {
419 fn deserialize<D>(deserializer: D) -> std::result::Result<Self, D::Error>
420 where
421 D: serde::Deserializer<'de>,
422 {
423 #[derive(Deserialize)]
424 struct Raw {
425 #[serde(rename = "$value", default)]
426 items: Vec<TradesItem>,
427 }
428
429 let raw = Raw::deserialize(deserializer)?;
430
431 let mut trades = Vec::new();
432 let mut wash_sales = Vec::new();
433 let mut lots = Vec::new();
434 let mut orders = Vec::new();
435 let mut symbol_summaries = Vec::new();
436 let mut asset_summaries = Vec::new();
437
438 for item in raw.items {
439 match item {
440 TradesItem::Trade(t) => trades.push(t),
441 TradesItem::WashSale(t) => wash_sales.push(t),
442 TradesItem::Lot(t) => lots.push(t),
443 TradesItem::Order(t) => orders.push(t),
444 TradesItem::SymbolSummary(t) => symbol_summaries.push(t),
445 TradesItem::AssetSummary(t) => asset_summaries.push(t),
446 }
447 }
448
449 Ok(TradesWrapper {
450 items: trades,
451 wash_sales,
452 lots,
453 orders,
454 symbol_summaries,
455 asset_summaries,
456 })
457 }
458}
459
460#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
462pub struct PositionsWrapper {
463 #[serde(rename = "OpenPosition", default)]
465 pub items: Vec<Position>,
466}
467
468#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
470pub struct CashTransactionsWrapper {
471 #[serde(rename = "CashTransaction", default)]
473 pub items: Vec<CashTransaction>,
474}
475
476#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
478pub struct CorporateActionsWrapper {
479 #[serde(rename = "CorporateAction", default)]
481 pub items: Vec<CorporateAction>,
482}
483
484#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
486pub struct NetStockPositionsWrapper {
487 #[serde(rename = "NetStockPosition", default)]
489 pub items: Vec<super::extended::NetStockPosition>,
490}
491
492#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
494pub struct CFDChargesWrapper {
495 #[serde(rename = "CFDCharge", default)]
497 pub items: Vec<super::extended::CFDCharge>,
498}
499
500#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
502pub struct SLBOpenContractsWrapper {
503 #[serde(rename = "SLBOpenContract", default)]
505 pub items: Vec<super::extended::SLBOpenContract>,
506}
507
508#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
510pub struct StockGrantActivitiesWrapper {
511 #[serde(rename = "StockGrantActivity", default)]
513 pub items: Vec<super::extended::StockGrantActivity>,
514}
515
516#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
518pub struct TransactionTaxesWrapper {
519 #[serde(rename = "TransactionTax", default)]
521 pub items: Vec<super::extended::TransactionTax>,
522}
523
524#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
571pub struct Trade {
572 #[serde(
578 rename = "@accountId",
579 default,
580 deserialize_with = "deserialize_optional_string"
581 )]
582 pub account_id: Option<String>,
583
584 #[serde(rename = "@transactionID", default)]
586 pub transaction_id: Option<String>,
587
588 #[serde(
591 rename = "@conid",
592 default,
593 deserialize_with = "deserialize_optional_string"
594 )]
595 pub conid: Option<String>,
596
597 #[serde(
599 rename = "@symbol",
600 default,
601 deserialize_with = "deserialize_optional_string"
602 )]
603 pub symbol: Option<String>,
604
605 #[serde(rename = "@description", default)]
607 pub description: Option<String>,
608
609 #[serde(rename = "@assetCategory", default)]
611 pub asset_category: Option<AssetCategory>,
612
613 #[serde(rename = "@cusip", default)]
615 pub cusip: Option<String>,
616
617 #[serde(rename = "@isin", default)]
619 pub isin: Option<String>,
620
621 #[serde(rename = "@figi", default)]
623 pub figi: Option<String>,
624
625 #[serde(rename = "@securityID", default)]
627 pub security_id: Option<String>,
628
629 #[serde(rename = "@securityIDType", default)]
631 pub security_id_type: Option<SecurityIdType>,
632
633 #[serde(
636 rename = "@multiplier",
637 default,
638 deserialize_with = "deserialize_optional_decimal"
639 )]
640 pub multiplier: Option<Decimal>,
641
642 #[serde(
644 rename = "@strike",
645 default,
646 deserialize_with = "deserialize_optional_decimal"
647 )]
648 pub strike: Option<Decimal>,
649
650 #[serde(
652 rename = "@expiry",
653 default,
654 deserialize_with = "deserialize_optional_date"
655 )]
656 pub expiry: Option<NaiveDate>,
657
658 #[serde(rename = "@putCall", default)]
660 pub put_call: Option<PutCall>,
661
662 #[serde(rename = "@underlyingConid", default)]
664 pub underlying_conid: Option<String>,
665
666 #[serde(rename = "@underlyingSymbol", default)]
668 pub underlying_symbol: Option<String>,
669
670 #[serde(
673 rename = "@tradeDate",
674 default,
675 deserialize_with = "deserialize_optional_date"
676 )]
677 pub trade_date: Option<NaiveDate>,
678
679 #[serde(
681 rename = "@settleDateTarget",
682 default,
683 deserialize_with = "deserialize_optional_date"
684 )]
685 pub settle_date: Option<NaiveDate>,
686
687 #[serde(rename = "@buySell", default)]
689 pub buy_sell: Option<BuySell>,
690
691 #[serde(rename = "@openCloseIndicator", default)]
693 pub open_close: Option<OpenClose>,
694
695 #[serde(rename = "@transactionType", default)]
697 pub transaction_type: Option<TradeType>,
698
699 #[serde(
702 rename = "@quantity",
703 default,
704 deserialize_with = "deserialize_optional_decimal"
705 )]
706 pub quantity: Option<Decimal>,
707
708 #[serde(
714 rename = "@tradePrice",
715 alias = "@price",
716 default,
717 deserialize_with = "deserialize_optional_decimal"
718 )]
719 pub price: Option<Decimal>,
720
721 #[serde(
723 rename = "@proceeds",
724 default,
725 deserialize_with = "deserialize_optional_decimal"
726 )]
727 pub proceeds: Option<Decimal>,
728
729 #[serde(
731 rename = "@cost",
732 default,
733 deserialize_with = "deserialize_optional_decimal"
734 )]
735 pub cost: Option<Decimal>,
736
737 #[serde(
740 rename = "@ibCommission",
741 default,
742 deserialize_with = "deserialize_optional_decimal"
743 )]
744 pub commission: Option<Decimal>,
745
746 #[serde(
748 rename = "@taxes",
749 default,
750 deserialize_with = "deserialize_optional_decimal"
751 )]
752 pub taxes: Option<Decimal>,
753
754 #[serde(
756 rename = "@netCash",
757 default,
758 deserialize_with = "deserialize_optional_decimal"
759 )]
760 pub net_cash: Option<Decimal>,
761
762 #[serde(
765 rename = "@fifoPnlRealized",
766 default,
767 deserialize_with = "deserialize_optional_decimal"
768 )]
769 pub fifo_pnl_realized: Option<Decimal>,
770
771 #[serde(
773 rename = "@mtmPnl",
774 default,
775 deserialize_with = "deserialize_optional_decimal"
776 )]
777 pub mtm_pnl: Option<Decimal>,
778
779 #[serde(
781 rename = "@fxPnl",
782 default,
783 deserialize_with = "deserialize_optional_decimal"
784 )]
785 pub fx_pnl: Option<Decimal>,
786
787 #[serde(
790 rename = "@currency",
791 default,
792 deserialize_with = "deserialize_optional_string"
793 )]
794 pub currency: Option<String>,
795
796 #[serde(
798 rename = "@fxRateToBase",
799 default,
800 deserialize_with = "deserialize_optional_decimal"
801 )]
802 pub fx_rate_to_base: Option<Decimal>,
803
804 #[serde(
807 rename = "@origTradeDate",
808 default,
809 deserialize_with = "deserialize_optional_date"
810 )]
811 pub orig_trade_date: Option<NaiveDate>,
812
813 #[serde(
815 rename = "@origTradePrice",
816 default,
817 deserialize_with = "deserialize_optional_decimal"
818 )]
819 pub orig_trade_price: Option<Decimal>,
820
821 #[serde(rename = "@origTradeID", default)]
823 pub orig_trade_id: Option<String>,
824
825 #[serde(rename = "@holdingPeriodDateTime", default)]
827 pub holding_period_date_time: Option<String>,
828
829 #[serde(rename = "@openDateTime", default)]
831 pub open_date_time: Option<String>,
832
833 #[serde(rename = "@whenReopened", default)]
835 pub when_reopened: Option<String>,
836
837 #[serde(rename = "@notes", default)]
839 pub notes: Option<String>,
840
841 #[serde(rename = "@ibOrderID", alias = "@orderID", default)]
850 pub ib_order_id: Option<String>,
851
852 #[serde(rename = "@execID", default)]
858 pub exec_id: Option<String>,
859
860 #[serde(rename = "@tradeID", default)]
862 pub trade_id: Option<String>,
863
864 #[serde(rename = "@origTransactionID", default)]
866 pub orig_transaction_id: Option<String>,
867
868 #[serde(rename = "@origOrderID", default)]
870 pub orig_order_id: Option<String>,
871
872 #[serde(rename = "@dateTime", default)]
875 pub trade_time: Option<String>,
876
877 #[serde(rename = "@whenRealized", default)]
879 pub when_realized: Option<String>,
880
881 #[serde(rename = "@orderTime", default)]
883 pub order_time: Option<String>,
884
885 #[serde(rename = "@orderType", default)]
888 pub order_type: Option<OrderType>,
889
890 #[serde(rename = "@brokerageOrderID", default)]
892 pub brokerage_order_id: Option<String>,
893
894 #[serde(rename = "@orderReference", default)]
896 pub order_reference: Option<String>,
897
898 #[serde(rename = "@exchOrderId", default)]
900 pub exch_order_id: Option<String>,
901
902 #[serde(rename = "@extExecID", default)]
904 pub ext_exec_id: Option<String>,
905
906 #[serde(rename = "@ibExecID", default)]
908 pub ib_exec_id: Option<String>,
909
910 #[serde(rename = "@issuer", default)]
913 pub issuer: Option<String>,
914
915 #[serde(rename = "@issuerCountryCode", default)]
917 pub issuer_country_code: Option<String>,
918
919 #[serde(rename = "@subCategory", default)]
921 pub sub_category: Option<SubCategory>,
922
923 #[serde(rename = "@listingExchange", default)]
925 pub listing_exchange: Option<String>,
926
927 #[serde(rename = "@underlyingListingExchange", default)]
930 pub underlying_listing_exchange: Option<String>,
931
932 #[serde(rename = "@underlyingSecurityID", default)]
934 pub underlying_security_id: Option<String>,
935
936 #[serde(rename = "@traderID", default)]
939 pub trader_id: Option<String>,
940
941 #[serde(
943 rename = "@isAPIOrder",
944 default,
945 deserialize_with = "deserialize_optional_bool"
946 )]
947 pub is_api_order: Option<bool>,
948
949 #[serde(rename = "@volatilityOrderLink", default)]
951 pub volatility_order_link: Option<String>,
952
953 #[serde(rename = "@clearingFirmID", default)]
955 pub clearing_firm_id: Option<String>,
956
957 #[serde(rename = "@levelOfDetail", default)]
959 pub level_of_detail: Option<LevelOfDetail>,
960
961 #[serde(
964 rename = "@amount",
965 default,
966 deserialize_with = "deserialize_optional_decimal"
967 )]
968 pub amount: Option<Decimal>,
969
970 #[serde(
972 rename = "@tradeMoney",
973 default,
974 deserialize_with = "deserialize_optional_decimal"
975 )]
976 pub trade_money: Option<Decimal>,
977
978 #[serde(
980 rename = "@closePrice",
981 default,
982 deserialize_with = "deserialize_optional_decimal"
983 )]
984 pub close_price: Option<Decimal>,
985
986 #[serde(
988 rename = "@changeInPrice",
989 default,
990 deserialize_with = "deserialize_optional_decimal"
991 )]
992 pub change_in_price: Option<Decimal>,
993
994 #[serde(
996 rename = "@changeInQuantity",
997 default,
998 deserialize_with = "deserialize_optional_decimal"
999 )]
1000 pub change_in_quantity: Option<Decimal>,
1001
1002 #[serde(rename = "@ibCommissionCurrency", default)]
1004 pub commission_currency: Option<String>,
1005
1006 #[serde(rename = "@relatedTradeID", default)]
1009 pub related_trade_id: Option<String>,
1010
1011 #[serde(rename = "@relatedTransactionID", default)]
1013 pub related_transaction_id: Option<String>,
1014
1015 #[serde(
1018 rename = "@accruedInt",
1019 default,
1020 deserialize_with = "deserialize_optional_decimal"
1021 )]
1022 pub accrued_int: Option<Decimal>,
1023
1024 #[serde(
1026 rename = "@principalAdjustFactor",
1027 default,
1028 deserialize_with = "deserialize_optional_decimal"
1029 )]
1030 pub principal_adjust_factor: Option<Decimal>,
1031
1032 #[serde(rename = "@serialNumber", default)]
1035 pub serial_number: Option<String>,
1036
1037 #[serde(rename = "@deliveryType", default)]
1039 pub delivery_type: Option<String>,
1040
1041 #[serde(rename = "@commodityType", default)]
1043 pub commodity_type: Option<String>,
1044
1045 #[serde(
1047 rename = "@fineness",
1048 default,
1049 deserialize_with = "deserialize_optional_decimal"
1050 )]
1051 pub fineness: Option<Decimal>,
1052
1053 #[serde(rename = "@weight", default)]
1055 pub weight: Option<String>,
1056
1057 #[serde(
1060 rename = "@reportDate",
1061 default,
1062 deserialize_with = "deserialize_optional_date"
1063 )]
1064 pub report_date: Option<NaiveDate>,
1065
1066 #[serde(rename = "@exchange", default)]
1068 pub exchange: Option<String>,
1069
1070 #[serde(rename = "@model", default)]
1072 pub model: Option<String>,
1073
1074 #[serde(rename = "@acctAlias", default)]
1076 pub acct_alias: Option<String>,
1077
1078 #[serde(rename = "@rtn", default)]
1080 pub rtn: Option<String>,
1081
1082 #[serde(rename = "@positionActionID", default)]
1084 pub position_action_id: Option<String>,
1085
1086 #[serde(
1091 rename = "@initialInvestment",
1092 default,
1093 deserialize_with = "deserialize_optional_string"
1094 )]
1095 pub initial_investment: Option<String>,
1096
1097 #[serde(
1099 rename = "@netCashInBase",
1100 default,
1101 deserialize_with = "deserialize_optional_decimal"
1102 )]
1103 pub net_cash_in_base: Option<Decimal>,
1104
1105 #[serde(
1107 rename = "@capitalGainsPnl",
1108 default,
1109 deserialize_with = "deserialize_optional_decimal"
1110 )]
1111 pub capital_gains_pnl: Option<Decimal>,
1112
1113 #[serde(rename = "@sedol", default)]
1115 pub sedol: Option<String>,
1116
1117 #[serde(
1119 rename = "@tradeTime",
1120 default,
1121 deserialize_with = "deserialize_optional_string"
1122 )]
1123 pub trade_time_trad: Option<String>,
1124}
1125
1126impl Trade {
1127 pub fn derivative(&self) -> Option<DerivativeInfo> {
1160 match self.asset_category? {
1161 AssetCategory::Option => {
1162 let strike = self.strike?;
1164 let expiry = self.expiry?;
1165 let put_call = self.put_call?;
1166 let underlying_symbol = self.underlying_symbol.clone()?;
1167
1168 Some(DerivativeInfo::Option {
1169 strike,
1170 expiry,
1171 put_call,
1172 underlying_symbol,
1173 underlying_conid: self.underlying_conid.clone(),
1174 })
1175 }
1176 AssetCategory::Future => {
1177 let expiry = self.expiry?;
1179 let underlying_symbol = self.underlying_symbol.clone()?;
1180
1181 Some(DerivativeInfo::Future {
1182 expiry,
1183 underlying_symbol,
1184 underlying_conid: self.underlying_conid.clone(),
1185 })
1186 }
1187 AssetCategory::FutureOption => {
1188 let strike = self.strike?;
1190 let expiry = self.expiry?;
1191 let put_call = self.put_call?;
1192 let underlying_symbol = self.underlying_symbol.clone()?;
1193
1194 Some(DerivativeInfo::FutureOption {
1195 strike,
1196 expiry,
1197 put_call,
1198 underlying_symbol,
1199 underlying_conid: self.underlying_conid.clone(),
1200 })
1201 }
1202 AssetCategory::Warrant => {
1203 let underlying_symbol = self.underlying_symbol.clone()?;
1205
1206 Some(DerivativeInfo::Warrant {
1207 strike: self.strike,
1208 expiry: self.expiry,
1209 underlying_symbol: Some(underlying_symbol),
1210 })
1211 }
1212 _ => None,
1214 }
1215 }
1216}
1217
1218#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
1257pub struct Position {
1258 #[serde(
1264 rename = "@accountId",
1265 default,
1266 deserialize_with = "deserialize_optional_string"
1267 )]
1268 pub account_id: Option<String>,
1269
1270 #[serde(
1273 rename = "@conid",
1274 default,
1275 deserialize_with = "deserialize_optional_string"
1276 )]
1277 pub conid: Option<String>,
1278
1279 #[serde(
1281 rename = "@symbol",
1282 default,
1283 deserialize_with = "deserialize_optional_string"
1284 )]
1285 pub symbol: Option<String>,
1286
1287 #[serde(rename = "@description", default)]
1289 pub description: Option<String>,
1290
1291 #[serde(rename = "@assetCategory", default)]
1293 pub asset_category: Option<AssetCategory>,
1294
1295 #[serde(rename = "@cusip", default)]
1297 pub cusip: Option<String>,
1298
1299 #[serde(rename = "@isin", default)]
1301 pub isin: Option<String>,
1302
1303 #[serde(rename = "@figi", default)]
1305 pub figi: Option<String>,
1306
1307 #[serde(rename = "@securityID", default)]
1309 pub security_id: Option<String>,
1310
1311 #[serde(rename = "@securityIDType", default)]
1313 pub security_id_type: Option<SecurityIdType>,
1314
1315 #[serde(
1318 rename = "@multiplier",
1319 default,
1320 deserialize_with = "deserialize_optional_decimal"
1321 )]
1322 pub multiplier: Option<Decimal>,
1323
1324 #[serde(
1326 rename = "@strike",
1327 default,
1328 deserialize_with = "deserialize_optional_decimal"
1329 )]
1330 pub strike: Option<Decimal>,
1331
1332 #[serde(
1334 rename = "@expiry",
1335 default,
1336 deserialize_with = "deserialize_optional_date"
1337 )]
1338 pub expiry: Option<NaiveDate>,
1339
1340 #[serde(rename = "@putCall", default)]
1342 pub put_call: Option<PutCall>,
1343
1344 #[serde(rename = "@underlyingConid", default)]
1346 pub underlying_conid: Option<String>,
1347
1348 #[serde(rename = "@underlyingSymbol", default)]
1350 pub underlying_symbol: Option<String>,
1351
1352 #[serde(
1355 rename = "@position",
1356 default,
1357 deserialize_with = "deserialize_optional_decimal"
1358 )]
1359 pub quantity: Option<Decimal>,
1360
1361 #[serde(
1363 rename = "@markPrice",
1364 default,
1365 deserialize_with = "deserialize_optional_decimal"
1366 )]
1367 pub mark_price: Option<Decimal>,
1368
1369 #[serde(
1371 rename = "@positionValue",
1372 default,
1373 deserialize_with = "deserialize_optional_decimal"
1374 )]
1375 pub position_value: Option<Decimal>,
1376
1377 #[serde(rename = "@side", default)]
1379 pub side: Option<String>,
1380
1381 #[serde(
1384 rename = "@openPrice",
1385 default,
1386 deserialize_with = "deserialize_optional_decimal"
1387 )]
1388 pub open_price: Option<Decimal>,
1389
1390 #[serde(
1392 rename = "@costBasisPrice",
1393 default,
1394 deserialize_with = "deserialize_optional_decimal"
1395 )]
1396 pub cost_basis_price: Option<Decimal>,
1397
1398 #[serde(
1400 rename = "@costBasisMoney",
1401 default,
1402 deserialize_with = "deserialize_optional_decimal"
1403 )]
1404 pub cost_basis_money: Option<Decimal>,
1405
1406 #[serde(
1408 rename = "@fifoPnlUnrealized",
1409 default,
1410 deserialize_with = "deserialize_optional_decimal"
1411 )]
1412 pub fifo_pnl_unrealized: Option<Decimal>,
1413
1414 #[serde(
1416 rename = "@percentOfNAV",
1417 default,
1418 deserialize_with = "deserialize_optional_decimal"
1419 )]
1420 pub percent_of_nav: Option<Decimal>,
1421
1422 #[serde(
1425 rename = "@currency",
1426 default,
1427 deserialize_with = "deserialize_optional_string"
1428 )]
1429 pub currency: Option<String>,
1430
1431 #[serde(
1433 rename = "@fxRateToBase",
1434 default,
1435 deserialize_with = "deserialize_optional_decimal"
1436 )]
1437 pub fx_rate_to_base: Option<Decimal>,
1438
1439 #[serde(
1442 rename = "@reportDate",
1443 default,
1444 deserialize_with = "deserialize_optional_date"
1445 )]
1446 pub report_date: Option<NaiveDate>,
1447
1448 #[serde(rename = "@holdingPeriodDateTime", default)]
1451 pub holding_period_date_time: Option<String>,
1452
1453 #[serde(rename = "@openDateTime", default)]
1455 pub open_date_time: Option<String>,
1456
1457 #[serde(rename = "@originatingTransactionID", default)]
1459 pub originating_transaction_id: Option<String>,
1460
1461 #[serde(rename = "@code", default)]
1463 pub code: Option<String>,
1464
1465 #[serde(rename = "@originatingOrderID", default)]
1471 pub originating_order_id: Option<String>,
1472
1473 #[serde(rename = "@issuer", default)]
1476 pub issuer: Option<String>,
1477
1478 #[serde(rename = "@issuerCountryCode", default)]
1480 pub issuer_country_code: Option<String>,
1481
1482 #[serde(rename = "@subCategory", default)]
1484 pub sub_category: Option<SubCategory>,
1485
1486 #[serde(rename = "@listingExchange", default)]
1488 pub listing_exchange: Option<String>,
1489
1490 #[serde(rename = "@underlyingListingExchange", default)]
1493 pub underlying_listing_exchange: Option<String>,
1494
1495 #[serde(rename = "@underlyingSecurityID", default)]
1497 pub underlying_security_id: Option<String>,
1498
1499 #[serde(
1502 rename = "@accruedInt",
1503 default,
1504 deserialize_with = "deserialize_optional_decimal"
1505 )]
1506 pub accrued_int: Option<Decimal>,
1507
1508 #[serde(
1510 rename = "@principalAdjustFactor",
1511 default,
1512 deserialize_with = "deserialize_optional_decimal"
1513 )]
1514 pub principal_adjust_factor: Option<Decimal>,
1515
1516 #[serde(rename = "@serialNumber", default)]
1519 pub serial_number: Option<String>,
1520
1521 #[serde(rename = "@deliveryType", default)]
1523 pub delivery_type: Option<String>,
1524
1525 #[serde(rename = "@commodityType", default)]
1527 pub commodity_type: Option<String>,
1528
1529 #[serde(
1531 rename = "@fineness",
1532 default,
1533 deserialize_with = "deserialize_optional_decimal"
1534 )]
1535 pub fineness: Option<Decimal>,
1536
1537 #[serde(rename = "@weight", default)]
1539 pub weight: Option<String>,
1540
1541 #[serde(rename = "@levelOfDetail", default)]
1544 pub level_of_detail: Option<LevelOfDetail>,
1545
1546 #[serde(rename = "@model", default)]
1548 pub model: Option<String>,
1549
1550 #[serde(rename = "@acctAlias", default)]
1552 pub acct_alias: Option<String>,
1553
1554 #[serde(
1556 rename = "@vestingDate",
1557 default,
1558 deserialize_with = "deserialize_optional_date"
1559 )]
1560 pub vesting_date: Option<NaiveDate>,
1561
1562 #[serde(
1564 rename = "@sedol",
1565 default,
1566 deserialize_with = "deserialize_optional_string"
1567 )]
1568 pub sedol: Option<String>,
1569
1570 #[serde(
1572 rename = "@positionValueInBase",
1573 default,
1574 deserialize_with = "deserialize_optional_decimal"
1575 )]
1576 pub position_value_in_base: Option<Decimal>,
1577
1578 #[serde(
1580 rename = "@unrealizedCapitalGainsPnl",
1581 default,
1582 deserialize_with = "deserialize_optional_decimal"
1583 )]
1584 pub unrealized_capital_gains_pnl: Option<Decimal>,
1585
1586 #[serde(
1588 rename = "@unrealizedlFxPnl",
1589 default,
1590 deserialize_with = "deserialize_optional_decimal"
1591 )]
1592 pub unrealizedl_fx_pnl: Option<Decimal>,
1593}
1594
1595impl Position {
1596 pub fn derivative(&self) -> Option<DerivativeInfo> {
1673 match self.asset_category? {
1674 AssetCategory::Option => {
1675 let strike = self.strike?;
1677 let expiry = self.expiry?;
1678 let put_call = self.put_call?;
1679 let underlying_symbol = self.underlying_symbol.clone()?;
1680
1681 Some(DerivativeInfo::Option {
1682 strike,
1683 expiry,
1684 put_call,
1685 underlying_symbol,
1686 underlying_conid: self.underlying_conid.clone(),
1687 })
1688 }
1689 AssetCategory::Future => {
1690 let expiry = self.expiry?;
1692 let underlying_symbol = self.underlying_symbol.clone()?;
1693
1694 Some(DerivativeInfo::Future {
1695 expiry,
1696 underlying_symbol,
1697 underlying_conid: self.underlying_conid.clone(),
1698 })
1699 }
1700 AssetCategory::FutureOption => {
1701 let strike = self.strike?;
1703 let expiry = self.expiry?;
1704 let put_call = self.put_call?;
1705 let underlying_symbol = self.underlying_symbol.clone()?;
1706
1707 Some(DerivativeInfo::FutureOption {
1708 strike,
1709 expiry,
1710 put_call,
1711 underlying_symbol,
1712 underlying_conid: self.underlying_conid.clone(),
1713 })
1714 }
1715 AssetCategory::Warrant => {
1716 let underlying_symbol = self.underlying_symbol.clone()?;
1718
1719 Some(DerivativeInfo::Warrant {
1720 strike: self.strike,
1721 expiry: self.expiry,
1722 underlying_symbol: Some(underlying_symbol),
1723 })
1724 }
1725 _ => None,
1727 }
1728 }
1729}
1730
1731#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
1778pub struct CashTransaction {
1779 #[serde(
1785 rename = "@accountId",
1786 default,
1787 deserialize_with = "deserialize_optional_string"
1788 )]
1789 pub account_id: Option<String>,
1790
1791 #[serde(rename = "@transactionID", default)]
1793 pub transaction_id: Option<String>,
1794
1795 #[serde(rename = "@type", default)]
1798 pub transaction_type: Option<String>,
1799
1800 #[serde(rename = "@description", default)]
1802 pub description: Option<String>,
1803
1804 #[serde(
1806 rename = "@amount",
1807 default,
1808 deserialize_with = "deserialize_optional_decimal"
1809 )]
1810 pub amount: Option<Decimal>,
1811
1812 #[serde(
1814 rename = "@currency",
1815 default,
1816 deserialize_with = "deserialize_optional_string"
1817 )]
1818 pub currency: Option<String>,
1819
1820 #[serde(
1822 rename = "@fxRateToBase",
1823 default,
1824 deserialize_with = "deserialize_optional_decimal"
1825 )]
1826 pub fx_rate_to_base: Option<Decimal>,
1827
1828 #[serde(
1831 rename = "@date",
1832 default,
1833 deserialize_with = "deserialize_optional_date"
1834 )]
1835 pub date: Option<NaiveDate>,
1836
1837 #[serde(
1839 rename = "@settleDate",
1840 default,
1841 deserialize_with = "deserialize_optional_date"
1842 )]
1843 pub settle_date: Option<NaiveDate>,
1844
1845 #[serde(
1847 rename = "@exDate",
1848 default,
1849 deserialize_with = "deserialize_optional_date"
1850 )]
1851 pub ex_date: Option<NaiveDate>,
1852
1853 #[serde(rename = "@conid", default)]
1856 pub conid: Option<String>,
1857
1858 #[serde(rename = "@symbol", default)]
1860 pub symbol: Option<String>,
1861
1862 #[serde(rename = "@assetCategory", default)]
1864 pub asset_category: Option<AssetCategory>,
1865
1866 #[serde(rename = "@cusip", default)]
1868 pub cusip: Option<String>,
1869
1870 #[serde(rename = "@isin", default)]
1872 pub isin: Option<String>,
1873
1874 #[serde(rename = "@figi", default)]
1876 pub figi: Option<String>,
1877
1878 #[serde(rename = "@securityID", default)]
1880 pub security_id: Option<String>,
1881
1882 #[serde(rename = "@securityIDType", default)]
1884 pub security_id_type: Option<SecurityIdType>,
1885
1886 #[serde(
1889 rename = "@multiplier",
1890 default,
1891 deserialize_with = "deserialize_optional_decimal"
1892 )]
1893 pub multiplier: Option<Decimal>,
1894
1895 #[serde(
1897 rename = "@strike",
1898 default,
1899 deserialize_with = "deserialize_optional_decimal"
1900 )]
1901 pub strike: Option<Decimal>,
1902
1903 #[serde(
1905 rename = "@expiry",
1906 default,
1907 deserialize_with = "deserialize_optional_date"
1908 )]
1909 pub expiry: Option<NaiveDate>,
1910
1911 #[serde(rename = "@putCall", default)]
1913 pub put_call: Option<PutCall>,
1914
1915 #[serde(rename = "@underlyingConid", default)]
1917 pub underlying_conid: Option<String>,
1918
1919 #[serde(rename = "@underlyingSymbol", default)]
1921 pub underlying_symbol: Option<String>,
1922
1923 #[serde(rename = "@code", default)]
1925 pub code: Option<String>,
1926
1927 #[serde(rename = "@dateTime", default)]
1933 pub date_time: Option<String>,
1934
1935 #[serde(
1937 rename = "@reportDate",
1938 default,
1939 deserialize_with = "deserialize_optional_date"
1940 )]
1941 pub report_date: Option<NaiveDate>,
1942
1943 #[serde(
1945 rename = "@availableForTradingDate",
1946 default,
1947 deserialize_with = "deserialize_optional_date"
1948 )]
1949 pub available_for_trading_date: Option<NaiveDate>,
1950
1951 #[serde(rename = "@actionID", default)]
1954 pub action_id: Option<String>,
1955
1956 #[serde(rename = "@tradeID", default)]
1958 pub trade_id: Option<String>,
1959
1960 #[serde(rename = "@clientReference", default)]
1962 pub client_reference: Option<String>,
1963
1964 #[serde(rename = "@issuer", default)]
1967 pub issuer: Option<String>,
1968
1969 #[serde(rename = "@issuerCountryCode", default)]
1971 pub issuer_country_code: Option<String>,
1972
1973 #[serde(rename = "@subCategory", default)]
1975 pub sub_category: Option<SubCategory>,
1976
1977 #[serde(rename = "@listingExchange", default)]
1979 pub listing_exchange: Option<String>,
1980
1981 #[serde(rename = "@underlyingListingExchange", default)]
1984 pub underlying_listing_exchange: Option<String>,
1985
1986 #[serde(rename = "@underlyingSecurityID", default)]
1988 pub underlying_security_id: Option<String>,
1989
1990 #[serde(
1993 rename = "@principalAdjustFactor",
1994 default,
1995 deserialize_with = "deserialize_optional_decimal"
1996 )]
1997 pub principal_adjust_factor: Option<Decimal>,
1998
1999 #[serde(rename = "@serialNumber", default)]
2002 pub serial_number: Option<String>,
2003
2004 #[serde(rename = "@deliveryType", default)]
2006 pub delivery_type: Option<String>,
2007
2008 #[serde(rename = "@commodityType", default)]
2010 pub commodity_type: Option<String>,
2011
2012 #[serde(
2014 rename = "@fineness",
2015 default,
2016 deserialize_with = "deserialize_optional_decimal"
2017 )]
2018 pub fineness: Option<Decimal>,
2019
2020 #[serde(rename = "@weight", default)]
2022 pub weight: Option<String>,
2023
2024 #[serde(rename = "@levelOfDetail", default)]
2027 pub level_of_detail: Option<String>,
2028
2029 #[serde(rename = "@model", default)]
2031 pub model: Option<String>,
2032
2033 #[serde(rename = "@acctAlias", default)]
2035 pub acct_alias: Option<String>,
2036
2037 #[serde(
2039 rename = "@sedol",
2040 default,
2041 deserialize_with = "deserialize_optional_string"
2042 )]
2043 pub sedol: Option<String>,
2044}
2045
2046#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
2090pub struct CorporateAction {
2091 #[serde(
2097 rename = "@accountId",
2098 default,
2099 deserialize_with = "deserialize_optional_string"
2100 )]
2101 pub account_id: Option<String>,
2102
2103 #[serde(rename = "@transactionID", default)]
2105 pub transaction_id: Option<String>,
2106
2107 #[serde(rename = "@type", default)]
2110 pub action_type: Option<String>,
2111
2112 #[serde(rename = "@description", default)]
2114 pub description: Option<String>,
2115
2116 #[serde(
2119 rename = "@date",
2120 default,
2121 deserialize_with = "deserialize_optional_date"
2122 )]
2123 pub action_date: Option<NaiveDate>,
2124
2125 #[serde(
2127 rename = "@reportDate",
2128 default,
2129 deserialize_with = "deserialize_optional_date"
2130 )]
2131 pub report_date: Option<NaiveDate>,
2132
2133 #[serde(
2135 rename = "@exDate",
2136 default,
2137 deserialize_with = "deserialize_optional_date"
2138 )]
2139 pub ex_date: Option<NaiveDate>,
2140
2141 #[serde(
2143 rename = "@payDate",
2144 default,
2145 deserialize_with = "deserialize_optional_date"
2146 )]
2147 pub pay_date: Option<NaiveDate>,
2148
2149 #[serde(
2151 rename = "@recordDate",
2152 default,
2153 deserialize_with = "deserialize_optional_date"
2154 )]
2155 pub record_date: Option<NaiveDate>,
2156
2157 #[serde(
2160 rename = "@conid",
2161 default,
2162 deserialize_with = "deserialize_optional_string"
2163 )]
2164 pub conid: Option<String>,
2165
2166 #[serde(
2168 rename = "@symbol",
2169 default,
2170 deserialize_with = "deserialize_optional_string"
2171 )]
2172 pub symbol: Option<String>,
2173
2174 #[serde(rename = "@assetCategory", default)]
2176 pub asset_category: Option<AssetCategory>,
2177
2178 #[serde(rename = "@cusip", default)]
2180 pub cusip: Option<String>,
2181
2182 #[serde(rename = "@isin", default)]
2184 pub isin: Option<String>,
2185
2186 #[serde(rename = "@figi", default)]
2188 pub figi: Option<String>,
2189
2190 #[serde(rename = "@securityID", default)]
2192 pub security_id: Option<String>,
2193
2194 #[serde(rename = "@securityIDType", default)]
2196 pub security_id_type: Option<SecurityIdType>,
2197
2198 #[serde(
2201 rename = "@multiplier",
2202 default,
2203 deserialize_with = "deserialize_optional_decimal"
2204 )]
2205 pub multiplier: Option<Decimal>,
2206
2207 #[serde(
2209 rename = "@strike",
2210 default,
2211 deserialize_with = "deserialize_optional_decimal"
2212 )]
2213 pub strike: Option<Decimal>,
2214
2215 #[serde(
2217 rename = "@expiry",
2218 default,
2219 deserialize_with = "deserialize_optional_date"
2220 )]
2221 pub expiry: Option<NaiveDate>,
2222
2223 #[serde(rename = "@putCall", default)]
2225 pub put_call: Option<PutCall>,
2226
2227 #[serde(rename = "@underlyingConid", default)]
2229 pub underlying_conid: Option<String>,
2230
2231 #[serde(rename = "@underlyingSymbol", default)]
2233 pub underlying_symbol: Option<String>,
2234
2235 #[serde(
2238 rename = "@quantity",
2239 default,
2240 deserialize_with = "deserialize_optional_decimal"
2241 )]
2242 pub quantity: Option<Decimal>,
2243
2244 #[serde(
2246 rename = "@amount",
2247 default,
2248 deserialize_with = "deserialize_optional_decimal"
2249 )]
2250 pub amount: Option<Decimal>,
2251
2252 #[serde(
2254 rename = "@proceeds",
2255 default,
2256 deserialize_with = "deserialize_optional_decimal"
2257 )]
2258 pub proceeds: Option<Decimal>,
2259
2260 #[serde(
2262 rename = "@value",
2263 default,
2264 deserialize_with = "deserialize_optional_decimal"
2265 )]
2266 pub value: Option<Decimal>,
2267
2268 #[serde(
2270 rename = "@cost",
2271 default,
2272 deserialize_with = "deserialize_optional_decimal"
2273 )]
2274 pub cost: Option<Decimal>,
2275
2276 #[serde(
2279 rename = "@fifoPnlRealized",
2280 default,
2281 deserialize_with = "deserialize_optional_decimal"
2282 )]
2283 pub fifo_pnl_realized: Option<Decimal>,
2284
2285 #[serde(
2287 rename = "@mtmPnl",
2288 default,
2289 deserialize_with = "deserialize_optional_decimal"
2290 )]
2291 pub mtm_pnl: Option<Decimal>,
2292
2293 #[serde(rename = "@currency", default)]
2296 pub currency: Option<String>,
2297
2298 #[serde(
2300 rename = "@fxRateToBase",
2301 default,
2302 deserialize_with = "deserialize_optional_decimal"
2303 )]
2304 pub fx_rate_to_base: Option<Decimal>,
2305
2306 #[serde(rename = "@code", default)]
2308 pub code: Option<String>,
2309
2310 #[serde(rename = "@actionID", default)]
2316 pub action_id: Option<String>,
2317
2318 #[serde(rename = "@dateTime", default)]
2321 pub date_time: Option<String>,
2322
2323 #[serde(rename = "@issuer", default)]
2326 pub issuer: Option<String>,
2327
2328 #[serde(rename = "@issuerCountryCode", default)]
2330 pub issuer_country_code: Option<String>,
2331
2332 #[serde(rename = "@subCategory", default)]
2334 pub sub_category: Option<SubCategory>,
2335
2336 #[serde(rename = "@listingExchange", default)]
2338 pub listing_exchange: Option<String>,
2339
2340 #[serde(rename = "@underlyingListingExchange", default)]
2343 pub underlying_listing_exchange: Option<String>,
2344
2345 #[serde(rename = "@underlyingSecurityID", default)]
2347 pub underlying_security_id: Option<String>,
2348
2349 #[serde(
2352 rename = "@accruedInt",
2353 default,
2354 deserialize_with = "deserialize_optional_decimal"
2355 )]
2356 pub accrued_int: Option<Decimal>,
2357
2358 #[serde(
2360 rename = "@principalAdjustFactor",
2361 default,
2362 deserialize_with = "deserialize_optional_decimal"
2363 )]
2364 pub principal_adjust_factor: Option<Decimal>,
2365
2366 #[serde(rename = "@serialNumber", default)]
2369 pub serial_number: Option<String>,
2370
2371 #[serde(rename = "@deliveryType", default)]
2373 pub delivery_type: Option<String>,
2374
2375 #[serde(rename = "@commodityType", default)]
2377 pub commodity_type: Option<String>,
2378
2379 #[serde(
2381 rename = "@fineness",
2382 default,
2383 deserialize_with = "deserialize_optional_decimal"
2384 )]
2385 pub fineness: Option<Decimal>,
2386
2387 #[serde(rename = "@weight", default)]
2389 pub weight: Option<String>,
2390
2391 #[serde(rename = "@levelOfDetail", default)]
2394 pub level_of_detail: Option<String>,
2395
2396 #[serde(rename = "@model", default)]
2398 pub model: Option<String>,
2399
2400 #[serde(rename = "@acctAlias", default)]
2402 pub acct_alias: Option<String>,
2403
2404 #[serde(
2406 rename = "@actionDescription",
2407 default,
2408 deserialize_with = "deserialize_optional_string"
2409 )]
2410 pub action_description: Option<String>,
2411
2412 #[serde(
2414 rename = "@capitalGainsPnl",
2415 default,
2416 deserialize_with = "deserialize_optional_decimal"
2417 )]
2418 pub capital_gains_pnl: Option<Decimal>,
2419
2420 #[serde(
2422 rename = "@fxPnl",
2423 default,
2424 deserialize_with = "deserialize_optional_decimal"
2425 )]
2426 pub fx_pnl: Option<Decimal>,
2427
2428 #[serde(
2430 rename = "@sedol",
2431 default,
2432 deserialize_with = "deserialize_optional_string"
2433 )]
2434 pub sedol: Option<String>,
2435
2436 #[serde(
2438 rename = "@costBasis",
2439 default,
2440 deserialize_with = "deserialize_optional_decimal"
2441 )]
2442 pub cost_basis: Option<Decimal>,
2443}
2444
2445#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
2487pub struct SecurityInfo {
2488 #[serde(rename = "@assetCategory", default)]
2494 pub asset_category: Option<AssetCategory>,
2495
2496 #[serde(
2498 rename = "@symbol",
2499 default,
2500 deserialize_with = "deserialize_optional_string"
2501 )]
2502 pub symbol: Option<String>,
2503
2504 #[serde(rename = "@description", default)]
2506 pub description: Option<String>,
2507
2508 #[serde(
2510 rename = "@conid",
2511 default,
2512 deserialize_with = "deserialize_optional_string"
2513 )]
2514 pub conid: Option<String>,
2515
2516 #[serde(rename = "@securityID", default)]
2518 pub security_id: Option<String>,
2519
2520 #[serde(rename = "@securityIDType", default)]
2522 pub security_id_type: Option<SecurityIdType>,
2523
2524 #[serde(rename = "@cusip", default)]
2526 pub cusip: Option<String>,
2527
2528 #[serde(rename = "@isin", default)]
2530 pub isin: Option<String>,
2531
2532 #[serde(rename = "@figi", default)]
2534 pub figi: Option<String>,
2535
2536 #[serde(rename = "@sedol", default)]
2538 pub sedol: Option<String>,
2539
2540 #[serde(
2543 rename = "@multiplier",
2544 default,
2545 deserialize_with = "deserialize_optional_decimal"
2546 )]
2547 pub multiplier: Option<Decimal>,
2548
2549 #[serde(
2551 rename = "@strike",
2552 default,
2553 deserialize_with = "deserialize_optional_decimal"
2554 )]
2555 pub strike: Option<Decimal>,
2556
2557 #[serde(
2559 rename = "@expiry",
2560 default,
2561 deserialize_with = "deserialize_optional_date"
2562 )]
2563 pub expiry: Option<NaiveDate>,
2564
2565 #[serde(rename = "@putCall", default)]
2567 pub put_call: Option<PutCall>,
2568
2569 #[serde(rename = "@underlyingConid", default)]
2571 pub underlying_conid: Option<String>,
2572
2573 #[serde(rename = "@underlyingSymbol", default)]
2575 pub underlying_symbol: Option<String>,
2576
2577 #[serde(
2580 rename = "@maturity",
2581 default,
2582 deserialize_with = "deserialize_optional_date"
2583 )]
2584 pub maturity: Option<NaiveDate>,
2585
2586 #[serde(
2588 rename = "@principalAdjustFactor",
2589 default,
2590 deserialize_with = "deserialize_optional_decimal"
2591 )]
2592 pub principal_adjust_factor: Option<Decimal>,
2593
2594 #[serde(rename = "@currency", default)]
2597 pub currency: Option<String>,
2598
2599 #[serde(rename = "@listingExchange", default)]
2605 pub listing_exchange: Option<String>,
2606
2607 #[serde(rename = "@underlyingSecurityID", default)]
2609 pub underlying_security_id: Option<String>,
2610
2611 #[serde(rename = "@underlyingListingExchange", default)]
2613 pub underlying_listing_exchange: Option<String>,
2614
2615 #[serde(rename = "@issuer", default)]
2618 pub issuer: Option<String>,
2619
2620 #[serde(rename = "@issuerCountryCode", default)]
2622 pub issuer_country_code: Option<String>,
2623
2624 #[serde(rename = "@subCategory", default)]
2626 pub sub_category: Option<SubCategory>,
2627
2628 #[serde(rename = "@deliveryMonth", default)]
2631 pub delivery_month: Option<String>,
2632
2633 #[serde(rename = "@serialNumber", default)]
2636 pub serial_number: Option<String>,
2637
2638 #[serde(rename = "@deliveryType", default)]
2640 pub delivery_type: Option<String>,
2641
2642 #[serde(rename = "@commodityType", default)]
2644 pub commodity_type: Option<String>,
2645
2646 #[serde(
2648 rename = "@fineness",
2649 default,
2650 deserialize_with = "deserialize_optional_decimal"
2651 )]
2652 pub fineness: Option<Decimal>,
2653
2654 #[serde(rename = "@weight", default)]
2656 pub weight: Option<String>,
2657
2658 #[serde(rename = "@code", default)]
2661 pub code: Option<String>,
2662
2663 #[serde(
2665 rename = "@underlyingCategory",
2666 default,
2667 deserialize_with = "deserialize_optional_string"
2668 )]
2669 pub underlying_category: Option<String>,
2670
2671 #[serde(
2673 rename = "@issueDate",
2674 default,
2675 deserialize_with = "deserialize_optional_date"
2676 )]
2677 pub issue_date: Option<NaiveDate>,
2678
2679 #[serde(
2681 rename = "@type",
2682 default,
2683 deserialize_with = "deserialize_optional_string"
2684 )]
2685 pub r#type: Option<String>,
2686
2687 #[serde(
2689 rename = "@settlementPolicyMethod",
2690 default,
2691 deserialize_with = "deserialize_optional_string"
2692 )]
2693 pub settlement_policy_method: Option<String>,
2694
2695 #[serde(
2697 rename = "@relatedTradeID",
2698 default,
2699 deserialize_with = "deserialize_optional_string"
2700 )]
2701 pub related_trade_id: Option<String>,
2702
2703 #[serde(
2705 rename = "@origTransactionID",
2706 default,
2707 deserialize_with = "deserialize_optional_string"
2708 )]
2709 pub orig_transaction_id: Option<String>,
2710
2711 #[serde(
2713 rename = "@relatedTransactionID",
2714 default,
2715 deserialize_with = "deserialize_optional_string"
2716 )]
2717 pub related_transaction_id: Option<String>,
2718
2719 #[serde(
2721 rename = "@rtn",
2722 default,
2723 deserialize_with = "deserialize_optional_string"
2724 )]
2725 pub rtn: Option<String>,
2726
2727 #[serde(
2729 rename = "@initialInvestment",
2730 default,
2731 deserialize_with = "deserialize_optional_bool"
2732 )]
2733 pub initial_investment: Option<bool>,
2734}
2735
2736#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
2771pub struct ConversionRate {
2772 #[serde(
2774 rename = "@reportDate",
2775 default,
2776 deserialize_with = "deserialize_optional_date"
2777 )]
2778 pub report_date: Option<NaiveDate>,
2779
2780 #[serde(
2782 rename = "@fromCurrency",
2783 default,
2784 deserialize_with = "deserialize_optional_string"
2785 )]
2786 pub from_currency: Option<String>,
2787
2788 #[serde(
2790 rename = "@toCurrency",
2791 default,
2792 deserialize_with = "deserialize_optional_string"
2793 )]
2794 pub to_currency: Option<String>,
2795
2796 #[serde(
2798 rename = "@rate",
2799 default,
2800 deserialize_with = "deserialize_optional_decimal"
2801 )]
2802 pub rate: Option<Decimal>,
2803}
2804
2805#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
2807pub struct SecuritiesInfoWrapper {
2808 #[serde(rename = "SecurityInfo", default)]
2810 pub items: Vec<SecurityInfo>,
2811}
2812
2813#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
2815pub struct ConversionRatesWrapper {
2816 #[serde(rename = "ConversionRate", default)]
2818 pub items: Vec<ConversionRate>,
2819}
2820
2821#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
2825pub struct EquitySummaryWrapper {
2826 #[serde(rename = "EquitySummaryByReportDateInBase", default)]
2828 pub items: Vec<super::extended::EquitySummaryByReportDateInBase>,
2829}
2830
2831#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
2833pub struct CashReportWrapper {
2834 #[serde(rename = "CashReportCurrency", default)]
2836 pub items: Vec<super::extended::CashReportCurrency>,
2837}
2838
2839#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
2841pub struct TradeConfirmsWrapper {
2842 #[serde(rename = "TradeConfirm", default)]
2844 pub items: Vec<super::extended::TradeConfirm>,
2845}
2846
2847#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
2849pub struct OptionEAEWrapper {
2850 #[serde(rename = "OptionEAE", default)]
2852 pub items: Vec<super::extended::OptionEAE>,
2853}
2854
2855#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
2857pub struct FxTransactionsWrapper {
2858 #[serde(rename = "FxTransaction", default)]
2860 pub items: Vec<super::extended::FxTransaction>,
2861}
2862
2863#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
2865pub struct ChangeInDividendAccrualsWrapper {
2866 #[serde(rename = "ChangeInDividendAccrual", default)]
2868 pub items: Vec<super::extended::ChangeInDividendAccrual>,
2869}
2870
2871#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
2873pub struct OpenDividendAccrualsWrapper {
2874 #[serde(rename = "OpenDividendAccrual", default)]
2876 pub items: Vec<super::extended::OpenDividendAccrual>,
2877}
2878
2879#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
2881pub struct InterestAccrualsWrapper {
2882 #[serde(rename = "InterestAccrualsCurrency", default)]
2884 pub items: Vec<super::extended::InterestAccrualsCurrency>,
2885}
2886
2887#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
2889pub struct TransfersWrapper {
2890 #[serde(rename = "Transfer", default)]
2892 pub items: Vec<super::extended::Transfer>,
2893}
2894
2895#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
2899pub struct MTMPerformanceSummaryWrapper {
2900 #[serde(rename = "MTMPerformanceSummaryUnderlying", default)]
2902 pub items: Vec<super::extended::MTMPerformanceSummaryUnderlying>,
2903}
2904
2905#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
2907pub struct FIFOPerformanceSummaryWrapper {
2908 #[serde(rename = "FIFOPerformanceSummaryUnderlying", default)]
2910 pub items: Vec<super::extended::FIFOPerformanceSummaryUnderlying>,
2911}
2912
2913#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
2915pub struct MTDYTDPerformanceSummaryWrapper {
2916 #[serde(rename = "MTDYTDPerformanceSummaryUnderlying", default)]
2918 pub items: Vec<super::extended::MTDYTDPerformanceSummary>,
2919}
2920
2921#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
2923pub struct StatementOfFundsWrapper {
2924 #[serde(rename = "StatementOfFundsLine", default)]
2926 pub items: Vec<super::extended::StatementOfFundsLine>,
2927}
2928
2929#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
2931pub struct ChangeInPositionValueWrapper {
2932 #[serde(rename = "ChangeInPositionValue", default)]
2934 pub items: Vec<super::extended::ChangeInPositionValue>,
2935}
2936
2937#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
2939pub struct UnbundledCommissionDetailWrapper {
2940 #[serde(rename = "UnbundledCommissionDetail", default)]
2942 pub items: Vec<super::extended::UnbundledCommissionDetail>,
2943}
2944
2945#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
2947pub struct ClientFeesWrapper {
2948 #[serde(rename = "ClientFee", default)]
2950 pub items: Vec<super::extended::ClientFee>,
2951}
2952
2953#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
2955pub struct ClientFeesDetailWrapper {
2956 #[serde(rename = "ClientFeesDetail", default)]
2958 pub items: Vec<super::extended::ClientFeesDetail>,
2959}
2960
2961#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
2963pub struct SLBActivitiesWrapper {
2964 #[serde(rename = "SLBActivity", default)]
2966 pub items: Vec<super::extended::SLBActivity>,
2967}
2968
2969#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
2971pub struct SLBFeesWrapper {
2972 #[serde(rename = "SLBFee", default)]
2974 pub items: Vec<super::extended::SLBFee>,
2975}
2976
2977#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
2979pub struct HardToBorrowDetailsWrapper {
2980 #[serde(rename = "HardToBorrowDetail", default)]
2982 pub items: Vec<super::extended::HardToBorrowDetail>,
2983}
2984
2985#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
2987pub struct FxLotsWrapper {
2988 #[serde(rename = "FxLot", default)]
2990 pub items: Vec<super::extended::FxLot>,
2991}
2992
2993#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
2995pub struct UnsettledTransfersWrapper {
2996 #[serde(rename = "UnsettledTransfer", default)]
2998 pub items: Vec<super::extended::UnsettledTransfer>,
2999}
3000
3001#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
3003pub struct TradeTransfersWrapper {
3004 #[serde(rename = "TradeTransfer", default)]
3006 pub items: Vec<super::extended::TradeTransfer>,
3007}
3008
3009#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
3011pub struct PriorPeriodPositionsWrapper {
3012 #[serde(rename = "PriorPeriodPosition", default)]
3014 pub items: Vec<super::extended::PriorPeriodPosition>,
3015}
3016
3017#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
3019pub struct TierInterestDetailsWrapper {
3020 #[serde(rename = "TierInterestDetail", default)]
3022 pub items: Vec<super::extended::TierInterestDetail>,
3023}
3024
3025#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
3027pub struct DebitCardActivitiesWrapper {
3028 #[serde(rename = "DebitCardActivity", default)]
3030 pub items: Vec<super::extended::DebitCardActivity>,
3031}
3032
3033#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
3035pub struct SalesTaxWrapper {
3036 #[serde(rename = "SalesTax", default)]
3038 pub items: Vec<super::extended::SalesTax>,
3039}
3040
3041#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
3043pub struct SymbolSummaryWrapper {
3044 #[serde(rename = "SymbolSummary", default)]
3046 pub items: Vec<super::extended::SymbolSummary>,
3047}
3048
3049#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
3051pub struct AssetSummaryWrapper {
3052 #[serde(rename = "AssetSummary", default)]
3054 pub items: Vec<super::extended::AssetSummary>,
3055}
3056
3057#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
3059pub struct OrdersWrapper {
3060 #[serde(rename = "Order", default)]
3062 pub items: Vec<super::extended::Order>,
3063}