Skip to main content

ib_flex/types/
extended.rs

1//! Extended FLEX statement types for v0.2.0+
2//!
3//! This module contains additional types beyond the core v0.1.0 types.
4//! These include account information, NAV changes, performance summaries,
5//! fee details, and more comprehensive trading data.
6
7use chrono::NaiveDate;
8use rust_decimal::Decimal;
9use serde::{Deserialize, Serialize};
10
11use super::common::{
12    AssetCategory, BuySell, DeliveredReceived, OpenClose, OptionAction, OrderType, PutCall,
13    TradeType, TransferType,
14};
15use crate::parsers::xml_utils::{
16    deserialize_optional_bool, deserialize_optional_date, deserialize_optional_decimal,
17    deserialize_optional_string,
18};
19
20/// Account information and metadata
21#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
22pub struct AccountInformation {
23    /// Account ID
24    #[serde(
25        rename = "@accountId",
26        default,
27        deserialize_with = "deserialize_optional_string"
28    )]
29    pub account_id: Option<String>,
30
31    /// Account type
32    #[serde(rename = "@accountType", default)]
33    pub account_type: Option<String>,
34
35    /// Account alias
36    #[serde(rename = "@acctAlias", default)]
37    pub acct_alias: Option<String>,
38
39    /// Currency
40    #[serde(rename = "@currency", default)]
41    pub currency: Option<String>,
42
43    /// Account name
44    #[serde(rename = "@name", default)]
45    pub name: Option<String>,
46
47    /// Master account
48    #[serde(rename = "@masterName", default)]
49    pub master_name: Option<String>,
50
51    /// Customer type
52    #[serde(rename = "@customerType", default)]
53    pub customer_type: Option<String>,
54
55    /// Date account opened
56    #[serde(
57        rename = "@dateOpened",
58        default,
59        deserialize_with = "deserialize_optional_date"
60    )]
61    pub date_opened: Option<NaiveDate>,
62
63    /// Date account funded
64    #[serde(
65        rename = "@dateFunded",
66        default,
67        deserialize_with = "deserialize_optional_date"
68    )]
69    pub date_funded: Option<NaiveDate>,
70
71    /// Date closed
72    #[serde(
73        rename = "@dateClosed",
74        default,
75        deserialize_with = "deserialize_optional_date"
76    )]
77    pub date_closed: Option<NaiveDate>,
78
79    /// Primary email
80    #[serde(rename = "@primaryEmail", default)]
81    pub primary_email: Option<String>,
82
83    /// Street address
84    #[serde(rename = "@streetAddress", default)]
85    pub street_address: Option<String>,
86
87    /// Street address 2
88    #[serde(rename = "@streetAddress2", default)]
89    pub street_address2: Option<String>,
90
91    /// City
92    #[serde(rename = "@city", default)]
93    pub city: Option<String>,
94
95    /// State
96    #[serde(rename = "@state", default)]
97    pub state: Option<String>,
98
99    /// Country
100    #[serde(rename = "@country", default)]
101    pub country: Option<String>,
102
103    /// Postal code
104    #[serde(rename = "@postalCode", default)]
105    pub postal_code: Option<String>,
106
107    /// Account capabilities
108    #[serde(rename = "@accountCapabilities", default)]
109    pub account_capabilities: Option<String>,
110
111    /// Trading permissions
112    #[serde(rename = "@tradingPermissions", default)]
113    pub trading_permissions: Option<String>,
114
115    /// Registered representative name
116    #[serde(rename = "@registeredRepName", default)]
117    pub registered_rep_name: Option<String>,
118
119    /// Registered representative phone
120    #[serde(rename = "@registeredRepPhone", default)]
121    pub registered_rep_phone: Option<String>,
122
123    /// IB entity
124    #[serde(rename = "@ibEntity", default)]
125    pub ib_entity: Option<String>,
126
127    /// Model
128    #[serde(rename = "@model", default)]
129    pub model: Option<String>,
130
131    /// `street` (added for full ibflex coverage)
132    #[serde(
133        rename = "@street",
134        default,
135        deserialize_with = "deserialize_optional_string"
136    )]
137    pub street: Option<String>,
138
139    /// `street2` (added for full ibflex coverage)
140    #[serde(
141        rename = "@street2",
142        default,
143        deserialize_with = "deserialize_optional_string"
144    )]
145    pub street2: Option<String>,
146
147    /// `streetResidentialAddress` (added for full ibflex coverage)
148    #[serde(
149        rename = "@streetResidentialAddress",
150        default,
151        deserialize_with = "deserialize_optional_string"
152    )]
153    pub street_residential_address: Option<String>,
154
155    /// `street2ResidentialAddress` (added for full ibflex coverage)
156    #[serde(
157        rename = "@street2ResidentialAddress",
158        default,
159        deserialize_with = "deserialize_optional_string"
160    )]
161    pub street2_residential_address: Option<String>,
162
163    /// `cityResidentialAddress` (added for full ibflex coverage)
164    #[serde(
165        rename = "@cityResidentialAddress",
166        default,
167        deserialize_with = "deserialize_optional_string"
168    )]
169    pub city_residential_address: Option<String>,
170
171    /// `stateResidentialAddress` (added for full ibflex coverage)
172    #[serde(
173        rename = "@stateResidentialAddress",
174        default,
175        deserialize_with = "deserialize_optional_string"
176    )]
177    pub state_residential_address: Option<String>,
178
179    /// `countryResidentialAddress` (added for full ibflex coverage)
180    #[serde(
181        rename = "@countryResidentialAddress",
182        default,
183        deserialize_with = "deserialize_optional_string"
184    )]
185    pub country_residential_address: Option<String>,
186
187    /// `postalCodeResidentialAddress` (added for full ibflex coverage)
188    #[serde(
189        rename = "@postalCodeResidentialAddress",
190        default,
191        deserialize_with = "deserialize_optional_string"
192    )]
193    pub postal_code_residential_address: Option<String>,
194
195    /// `accountRepName` (added for full ibflex coverage)
196    #[serde(
197        rename = "@accountRepName",
198        default,
199        deserialize_with = "deserialize_optional_string"
200    )]
201    pub account_rep_name: Option<String>,
202
203    /// `accountRepPhone` (added for full ibflex coverage)
204    #[serde(
205        rename = "@accountRepPhone",
206        default,
207        deserialize_with = "deserialize_optional_string"
208    )]
209    pub account_rep_phone: Option<String>,
210
211    /// `lastTradedDate` (added for full ibflex coverage)
212    #[serde(
213        rename = "@lastTradedDate",
214        default,
215        deserialize_with = "deserialize_optional_date"
216    )]
217    pub last_traded_date: Option<NaiveDate>,
218}
219
220/// Change in portfolio NAV (Net Asset Value)
221#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
222pub struct ChangeInNAV {
223    /// Account ID
224    #[serde(
225        rename = "@accountId",
226        default,
227        deserialize_with = "deserialize_optional_string"
228    )]
229    pub account_id: Option<String>,
230
231    /// Account alias
232    #[serde(rename = "@acctAlias", default)]
233    pub acct_alias: Option<String>,
234
235    /// Model
236    #[serde(rename = "@model", default)]
237    pub model: Option<String>,
238
239    /// Currency
240    #[serde(rename = "@currency", default)]
241    pub currency: Option<String>,
242
243    /// From date
244    #[serde(
245        rename = "@fromDate",
246        default,
247        deserialize_with = "deserialize_optional_date"
248    )]
249    pub from_date: Option<NaiveDate>,
250
251    /// To date
252    #[serde(
253        rename = "@toDate",
254        default,
255        deserialize_with = "deserialize_optional_date"
256    )]
257    pub to_date: Option<NaiveDate>,
258
259    /// Starting NAV value
260    #[serde(
261        rename = "@startingValue",
262        default,
263        deserialize_with = "deserialize_optional_decimal"
264    )]
265    pub starting_value: Option<Decimal>,
266
267    /// Ending NAV value
268    #[serde(
269        rename = "@endingValue",
270        default,
271        deserialize_with = "deserialize_optional_decimal"
272    )]
273    pub ending_value: Option<Decimal>,
274
275    /// Mark-to-market P&L
276    #[serde(
277        rename = "@mtm",
278        default,
279        deserialize_with = "deserialize_optional_decimal"
280    )]
281    pub mtm: Option<Decimal>,
282
283    /// Realized P&L
284    #[serde(
285        rename = "@realized",
286        default,
287        deserialize_with = "deserialize_optional_decimal"
288    )]
289    pub realized: Option<Decimal>,
290
291    /// Change in unrealized P&L
292    #[serde(
293        rename = "@changeInUnrealized",
294        default,
295        deserialize_with = "deserialize_optional_decimal"
296    )]
297    pub change_in_unrealized: Option<Decimal>,
298
299    /// Deposits and withdrawals
300    #[serde(
301        rename = "@depositsWithdrawals",
302        default,
303        deserialize_with = "deserialize_optional_decimal"
304    )]
305    pub deposits_withdrawals: Option<Decimal>,
306
307    /// Dividends received
308    #[serde(
309        rename = "@dividends",
310        default,
311        deserialize_with = "deserialize_optional_decimal"
312    )]
313    pub dividends: Option<Decimal>,
314
315    /// Withholding tax
316    #[serde(
317        rename = "@withholdingTax",
318        default,
319        deserialize_with = "deserialize_optional_decimal"
320    )]
321    pub withholding_tax: Option<Decimal>,
322
323    /// Change in dividend accruals
324    #[serde(
325        rename = "@changeInDividendAccruals",
326        default,
327        deserialize_with = "deserialize_optional_decimal"
328    )]
329    pub change_in_dividend_accruals: Option<Decimal>,
330
331    /// Interest income
332    #[serde(
333        rename = "@interest",
334        default,
335        deserialize_with = "deserialize_optional_decimal"
336    )]
337    pub interest: Option<Decimal>,
338
339    /// Change in interest accruals
340    #[serde(
341        rename = "@changeInInterestAccruals",
342        default,
343        deserialize_with = "deserialize_optional_decimal"
344    )]
345    pub change_in_interest_accruals: Option<Decimal>,
346
347    /// Advisor fees
348    #[serde(
349        rename = "@advisorFees",
350        default,
351        deserialize_with = "deserialize_optional_decimal"
352    )]
353    pub advisor_fees: Option<Decimal>,
354
355    /// Client fees
356    #[serde(
357        rename = "@clientFees",
358        default,
359        deserialize_with = "deserialize_optional_decimal"
360    )]
361    pub client_fees: Option<Decimal>,
362
363    /// Other fees
364    #[serde(
365        rename = "@otherFees",
366        default,
367        deserialize_with = "deserialize_optional_decimal"
368    )]
369    pub other_fees: Option<Decimal>,
370
371    /// Commissions
372    #[serde(
373        rename = "@commissions",
374        default,
375        deserialize_with = "deserialize_optional_decimal"
376    )]
377    pub commissions: Option<Decimal>,
378
379    /// FX translation P&L
380    #[serde(
381        rename = "@fxTranslation",
382        default,
383        deserialize_with = "deserialize_optional_decimal"
384    )]
385    pub fx_translation: Option<Decimal>,
386
387    /// Time-weighted return
388    #[serde(
389        rename = "@twr",
390        default,
391        deserialize_with = "deserialize_optional_decimal"
392    )]
393    pub twr: Option<Decimal>,
394
395    /// Corporate action proceeds
396    #[serde(
397        rename = "@corporateActionProceeds",
398        default,
399        deserialize_with = "deserialize_optional_decimal"
400    )]
401    pub corporate_action_proceeds: Option<Decimal>,
402
403    /// `costAdjustments` (added for full ibflex coverage)
404    #[serde(
405        rename = "@costAdjustments",
406        default,
407        deserialize_with = "deserialize_optional_decimal"
408    )]
409    pub cost_adjustments: Option<Decimal>,
410
411    /// `transferredPnlAdjustments` (added for full ibflex coverage)
412    #[serde(
413        rename = "@transferredPnlAdjustments",
414        default,
415        deserialize_with = "deserialize_optional_decimal"
416    )]
417    pub transferred_pnl_adjustments: Option<Decimal>,
418
419    /// `internalCashTransfers` (added for full ibflex coverage)
420    #[serde(
421        rename = "@internalCashTransfers",
422        default,
423        deserialize_with = "deserialize_optional_decimal"
424    )]
425    pub internal_cash_transfers: Option<Decimal>,
426
427    /// `assetTransfers` (added for full ibflex coverage)
428    #[serde(
429        rename = "@assetTransfers",
430        default,
431        deserialize_with = "deserialize_optional_decimal"
432    )]
433    pub asset_transfers: Option<Decimal>,
434
435    /// `debitCardActivity` (added for full ibflex coverage)
436    #[serde(
437        rename = "@debitCardActivity",
438        default,
439        deserialize_with = "deserialize_optional_decimal"
440    )]
441    pub debit_card_activity: Option<Decimal>,
442
443    /// `billPay` (added for full ibflex coverage)
444    #[serde(
445        rename = "@billPay",
446        default,
447        deserialize_with = "deserialize_optional_decimal"
448    )]
449    pub bill_pay: Option<Decimal>,
450
451    /// `withholding871m` (added for full ibflex coverage)
452    #[serde(
453        rename = "@withholding871m",
454        default,
455        deserialize_with = "deserialize_optional_decimal"
456    )]
457    pub withholding871m: Option<Decimal>,
458
459    /// `withholdingTaxCollected` (added for full ibflex coverage)
460    #[serde(
461        rename = "@withholdingTaxCollected",
462        default,
463        deserialize_with = "deserialize_optional_decimal"
464    )]
465    pub withholding_tax_collected: Option<Decimal>,
466
467    /// `brokerFees` (added for full ibflex coverage)
468    #[serde(
469        rename = "@brokerFees",
470        default,
471        deserialize_with = "deserialize_optional_decimal"
472    )]
473    pub broker_fees: Option<Decimal>,
474
475    /// `changeInBrokerFeeAccruals` (added for full ibflex coverage)
476    #[serde(
477        rename = "@changeInBrokerFeeAccruals",
478        default,
479        deserialize_with = "deserialize_optional_decimal"
480    )]
481    pub change_in_broker_fee_accruals: Option<Decimal>,
482
483    /// `feesReceivables` (added for full ibflex coverage)
484    #[serde(
485        rename = "@feesReceivables",
486        default,
487        deserialize_with = "deserialize_optional_decimal"
488    )]
489    pub fees_receivables: Option<Decimal>,
490
491    /// `commissionReceivables` (added for full ibflex coverage)
492    #[serde(
493        rename = "@commissionReceivables",
494        default,
495        deserialize_with = "deserialize_optional_decimal"
496    )]
497    pub commission_receivables: Option<Decimal>,
498
499    /// `forexCommissions` (added for full ibflex coverage)
500    #[serde(
501        rename = "@forexCommissions",
502        default,
503        deserialize_with = "deserialize_optional_decimal"
504    )]
505    pub forex_commissions: Option<Decimal>,
506
507    /// `transactionTax` (added for full ibflex coverage)
508    #[serde(
509        rename = "@transactionTax",
510        default,
511        deserialize_with = "deserialize_optional_decimal"
512    )]
513    pub transaction_tax: Option<Decimal>,
514
515    /// `taxReceivables` (added for full ibflex coverage)
516    #[serde(
517        rename = "@taxReceivables",
518        default,
519        deserialize_with = "deserialize_optional_decimal"
520    )]
521    pub tax_receivables: Option<Decimal>,
522
523    /// `salesTax` (added for full ibflex coverage)
524    #[serde(
525        rename = "@salesTax",
526        default,
527        deserialize_with = "deserialize_optional_decimal"
528    )]
529    pub sales_tax: Option<Decimal>,
530
531    /// `softDollars` (added for full ibflex coverage)
532    #[serde(
533        rename = "@softDollars",
534        default,
535        deserialize_with = "deserialize_optional_decimal"
536    )]
537    pub soft_dollars: Option<Decimal>,
538
539    /// `netFxTrading` (added for full ibflex coverage)
540    #[serde(
541        rename = "@netFxTrading",
542        default,
543        deserialize_with = "deserialize_optional_decimal"
544    )]
545    pub net_fx_trading: Option<Decimal>,
546
547    /// `linkingAdjustments` (added for full ibflex coverage)
548    #[serde(
549        rename = "@linkingAdjustments",
550        default,
551        deserialize_with = "deserialize_optional_decimal"
552    )]
553    pub linking_adjustments: Option<Decimal>,
554
555    /// `other` (added for full ibflex coverage)
556    #[serde(
557        rename = "@other",
558        default,
559        deserialize_with = "deserialize_optional_decimal"
560    )]
561    pub other: Option<Decimal>,
562
563    /// `commissionCreditsRedemption` (added for full ibflex coverage)
564    #[serde(
565        rename = "@commissionCreditsRedemption",
566        default,
567        deserialize_with = "deserialize_optional_decimal"
568    )]
569    pub commission_credits_redemption: Option<Decimal>,
570
571    /// `grantActivity` (added for full ibflex coverage)
572    #[serde(
573        rename = "@grantActivity",
574        default,
575        deserialize_with = "deserialize_optional_decimal"
576    )]
577    pub grant_activity: Option<Decimal>,
578
579    /// `excessFundSweep` (added for full ibflex coverage)
580    #[serde(
581        rename = "@excessFundSweep",
582        default,
583        deserialize_with = "deserialize_optional_decimal"
584    )]
585    pub excess_fund_sweep: Option<Decimal>,
586
587    /// `billableSalesTax` (added for full ibflex coverage)
588    #[serde(
589        rename = "@billableSalesTax",
590        default,
591        deserialize_with = "deserialize_optional_decimal"
592    )]
593    pub billable_sales_tax: Option<Decimal>,
594
595    /// `mtmAtPaxos` (added for full ibflex coverage)
596    #[serde(
597        rename = "@mtmAtPaxos",
598        default,
599        deserialize_with = "deserialize_optional_decimal"
600    )]
601    pub mtm_at_paxos: Option<Decimal>,
602
603    /// `carbonCredits` (added for full ibflex coverage)
604    #[serde(
605        rename = "@carbonCredits",
606        default,
607        deserialize_with = "deserialize_optional_decimal"
608    )]
609    pub carbon_credits: Option<Decimal>,
610
611    /// `donations` (added for full ibflex coverage)
612    #[serde(
613        rename = "@donations",
614        default,
615        deserialize_with = "deserialize_optional_decimal"
616    )]
617    pub donations: Option<Decimal>,
618
619    /// `paxosTransfers` (added for full ibflex coverage)
620    #[serde(
621        rename = "@paxosTransfers",
622        default,
623        deserialize_with = "deserialize_optional_decimal"
624    )]
625    pub paxos_transfers: Option<Decimal>,
626
627    /// `commissionsAtPaxos` (added for full ibflex coverage)
628    #[serde(
629        rename = "@commissionsAtPaxos",
630        default,
631        deserialize_with = "deserialize_optional_decimal"
632    )]
633    pub commissions_at_paxos: Option<Decimal>,
634
635    /// `referralFee` (added for full ibflex coverage)
636    #[serde(
637        rename = "@referralFee",
638        default,
639        deserialize_with = "deserialize_optional_decimal"
640    )]
641    pub referral_fee: Option<Decimal>,
642
643    /// `changeInIncentiveCouponAccruals` (added for full ibflex coverage)
644    #[serde(
645        rename = "@changeInIncentiveCouponAccruals",
646        default,
647        deserialize_with = "deserialize_optional_decimal"
648    )]
649    pub change_in_incentive_coupon_accruals: Option<Decimal>,
650
651    /// `otherIncome` (added for full ibflex coverage)
652    #[serde(
653        rename = "@otherIncome",
654        default,
655        deserialize_with = "deserialize_optional_decimal"
656    )]
657    pub other_income: Option<Decimal>,
658}
659
660/// Equity summary by report date in base currency
661#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
662pub struct EquitySummaryByReportDateInBase {
663    /// Account ID
664    #[serde(
665        rename = "@accountId",
666        default,
667        deserialize_with = "deserialize_optional_string"
668    )]
669    pub account_id: Option<String>,
670
671    /// Account alias
672    #[serde(rename = "@acctAlias", default)]
673    pub acct_alias: Option<String>,
674
675    /// Model
676    #[serde(rename = "@model", default)]
677    pub model: Option<String>,
678
679    /// Report date
680    #[serde(
681        rename = "@reportDate",
682        default,
683        deserialize_with = "deserialize_optional_date"
684    )]
685    pub report_date: Option<NaiveDate>,
686
687    /// Cash
688    #[serde(
689        rename = "@cash",
690        default,
691        deserialize_with = "deserialize_optional_decimal"
692    )]
693    pub cash: Option<Decimal>,
694
695    /// Cash long
696    #[serde(
697        rename = "@cashLong",
698        default,
699        deserialize_with = "deserialize_optional_decimal"
700    )]
701    pub cash_long: Option<Decimal>,
702
703    /// Cash short
704    #[serde(
705        rename = "@cashShort",
706        default,
707        deserialize_with = "deserialize_optional_decimal"
708    )]
709    pub cash_short: Option<Decimal>,
710
711    /// Settled cash
712    #[serde(
713        rename = "@settledCash",
714        default,
715        deserialize_with = "deserialize_optional_decimal"
716    )]
717    pub settled_cash: Option<Decimal>,
718
719    /// Slb cash collateral
720    #[serde(
721        rename = "@slbCashCollateral",
722        default,
723        deserialize_with = "deserialize_optional_decimal"
724    )]
725    pub slb_cash_collateral: Option<Decimal>,
726
727    /// Stock value
728    #[serde(
729        rename = "@stock",
730        default,
731        deserialize_with = "deserialize_optional_decimal"
732    )]
733    pub stock: Option<Decimal>,
734
735    /// Stock long
736    #[serde(
737        rename = "@stockLong",
738        default,
739        deserialize_with = "deserialize_optional_decimal"
740    )]
741    pub stock_long: Option<Decimal>,
742
743    /// Stock short
744    #[serde(
745        rename = "@stockShort",
746        default,
747        deserialize_with = "deserialize_optional_decimal"
748    )]
749    pub stock_short: Option<Decimal>,
750
751    /// Slb direct securities borrowed
752    #[serde(
753        rename = "@slbDirectSecuritiesBorrowed",
754        default,
755        deserialize_with = "deserialize_optional_decimal"
756    )]
757    pub slb_direct_securities_borrowed: Option<Decimal>,
758
759    /// Slb direct securities lent
760    #[serde(
761        rename = "@slbDirectSecuritiesLent",
762        default,
763        deserialize_with = "deserialize_optional_decimal"
764    )]
765    pub slb_direct_securities_lent: Option<Decimal>,
766
767    /// Options value
768    #[serde(
769        rename = "@options",
770        default,
771        deserialize_with = "deserialize_optional_decimal"
772    )]
773    pub options: Option<Decimal>,
774
775    /// Options long
776    #[serde(
777        rename = "@optionsLong",
778        default,
779        deserialize_with = "deserialize_optional_decimal"
780    )]
781    pub options_long: Option<Decimal>,
782
783    /// Options short
784    #[serde(
785        rename = "@optionsShort",
786        default,
787        deserialize_with = "deserialize_optional_decimal"
788    )]
789    pub options_short: Option<Decimal>,
790
791    /// Bonds value
792    #[serde(
793        rename = "@bonds",
794        default,
795        deserialize_with = "deserialize_optional_decimal"
796    )]
797    pub bonds: Option<Decimal>,
798
799    /// Bonds long
800    #[serde(
801        rename = "@bondsLong",
802        default,
803        deserialize_with = "deserialize_optional_decimal"
804    )]
805    pub bonds_long: Option<Decimal>,
806
807    /// Bonds short
808    #[serde(
809        rename = "@bondsShort",
810        default,
811        deserialize_with = "deserialize_optional_decimal"
812    )]
813    pub bonds_short: Option<Decimal>,
814
815    /// Notes value
816    #[serde(
817        rename = "@notes",
818        default,
819        deserialize_with = "deserialize_optional_decimal"
820    )]
821    pub notes: Option<Decimal>,
822
823    /// Funds value
824    #[serde(
825        rename = "@funds",
826        default,
827        deserialize_with = "deserialize_optional_decimal"
828    )]
829    pub funds: Option<Decimal>,
830
831    /// Futures value (unrealized P&L)
832    #[serde(
833        rename = "@futures",
834        default,
835        deserialize_with = "deserialize_optional_decimal"
836    )]
837    pub futures: Option<Decimal>,
838
839    /// Futures long
840    #[serde(
841        rename = "@futuresLong",
842        default,
843        deserialize_with = "deserialize_optional_decimal"
844    )]
845    pub futures_long: Option<Decimal>,
846
847    /// Futures short
848    #[serde(
849        rename = "@futuresShort",
850        default,
851        deserialize_with = "deserialize_optional_decimal"
852    )]
853    pub futures_short: Option<Decimal>,
854
855    /// Commodities value
856    #[serde(
857        rename = "@commodities",
858        default,
859        deserialize_with = "deserialize_optional_decimal"
860    )]
861    pub commodities: Option<Decimal>,
862
863    /// Total
864    #[serde(
865        rename = "@total",
866        default,
867        deserialize_with = "deserialize_optional_decimal"
868    )]
869    pub total: Option<Decimal>,
870
871    /// Total long
872    #[serde(
873        rename = "@totalLong",
874        default,
875        deserialize_with = "deserialize_optional_decimal"
876    )]
877    pub total_long: Option<Decimal>,
878
879    /// Total short
880    #[serde(
881        rename = "@totalShort",
882        default,
883        deserialize_with = "deserialize_optional_decimal"
884    )]
885    pub total_short: Option<Decimal>,
886
887    /// Interest accruals
888    #[serde(
889        rename = "@interestAccruals",
890        default,
891        deserialize_with = "deserialize_optional_decimal"
892    )]
893    pub interest_accruals: Option<Decimal>,
894
895    /// Dividend accruals
896    #[serde(
897        rename = "@dividendAccruals",
898        default,
899        deserialize_with = "deserialize_optional_decimal"
900    )]
901    pub dividend_accruals: Option<Decimal>,
902
903    /// Accrued interest
904    #[serde(
905        rename = "@accruedInterest",
906        default,
907        deserialize_with = "deserialize_optional_decimal"
908    )]
909    pub accrued_interest: Option<Decimal>,
910
911    /// Accrued dividend
912    #[serde(
913        rename = "@accruedDividend",
914        default,
915        deserialize_with = "deserialize_optional_decimal"
916    )]
917    pub accrued_dividend: Option<Decimal>,
918
919    /// Soft dollar value
920    #[serde(
921        rename = "@softDollars",
922        default,
923        deserialize_with = "deserialize_optional_decimal"
924    )]
925    pub soft_dollars: Option<Decimal>,
926
927    /// Forex CFD unrealized P&L
928    #[serde(
929        rename = "@forexCfdUnrealizedPl",
930        default,
931        deserialize_with = "deserialize_optional_decimal"
932    )]
933    pub forex_cfd_unrealized_pl: Option<Decimal>,
934
935    /// CFD unrealized P&L
936    #[serde(
937        rename = "@cfdUnrealizedPl",
938        default,
939        deserialize_with = "deserialize_optional_decimal"
940    )]
941    pub cfd_unrealized_pl: Option<Decimal>,
942
943    /// Broker cash component
944    #[serde(
945        rename = "@brokerCashComponent",
946        default,
947        deserialize_with = "deserialize_optional_decimal"
948    )]
949    pub broker_cash_component: Option<Decimal>,
950
951    /// Broker interest accruals component
952    #[serde(
953        rename = "@brokerInterestAccrualsComponent",
954        default,
955        deserialize_with = "deserialize_optional_decimal"
956    )]
957    pub broker_interest_accruals_component: Option<Decimal>,
958
959    /// Gross position value
960    #[serde(
961        rename = "@grossPositionValue",
962        default,
963        deserialize_with = "deserialize_optional_decimal"
964    )]
965    pub gross_position_value: Option<Decimal>,
966
967    /// Net liquidation value
968    #[serde(
969        rename = "@netLiquidation",
970        default,
971        deserialize_with = "deserialize_optional_decimal"
972    )]
973    pub net_liquidation: Option<Decimal>,
974
975    /// Net liquidation uncertainty
976    #[serde(
977        rename = "@netLiquidationUncertainty",
978        default,
979        deserialize_with = "deserialize_optional_decimal"
980    )]
981    pub net_liquidation_uncertainty: Option<Decimal>,
982
983    /// `currency` (added for full ibflex coverage)
984    #[serde(
985        rename = "@currency",
986        default,
987        deserialize_with = "deserialize_optional_string"
988    )]
989    pub currency: Option<String>,
990
991    /// `slbCashCollateralLong` (added for full ibflex coverage)
992    #[serde(
993        rename = "@slbCashCollateralLong",
994        default,
995        deserialize_with = "deserialize_optional_decimal"
996    )]
997    pub slb_cash_collateral_long: Option<Decimal>,
998
999    /// `slbCashCollateralShort` (added for full ibflex coverage)
1000    #[serde(
1001        rename = "@slbCashCollateralShort",
1002        default,
1003        deserialize_with = "deserialize_optional_decimal"
1004    )]
1005    pub slb_cash_collateral_short: Option<Decimal>,
1006
1007    /// `slbDirectSecuritiesBorrowedLong` (added for full ibflex coverage)
1008    #[serde(
1009        rename = "@slbDirectSecuritiesBorrowedLong",
1010        default,
1011        deserialize_with = "deserialize_optional_decimal"
1012    )]
1013    pub slb_direct_securities_borrowed_long: Option<Decimal>,
1014
1015    /// `slbDirectSecuritiesBorrowedShort` (added for full ibflex coverage)
1016    #[serde(
1017        rename = "@slbDirectSecuritiesBorrowedShort",
1018        default,
1019        deserialize_with = "deserialize_optional_decimal"
1020    )]
1021    pub slb_direct_securities_borrowed_short: Option<Decimal>,
1022
1023    /// `slbDirectSecuritiesLentLong` (added for full ibflex coverage)
1024    #[serde(
1025        rename = "@slbDirectSecuritiesLentLong",
1026        default,
1027        deserialize_with = "deserialize_optional_decimal"
1028    )]
1029    pub slb_direct_securities_lent_long: Option<Decimal>,
1030
1031    /// `slbDirectSecuritiesLentShort` (added for full ibflex coverage)
1032    #[serde(
1033        rename = "@slbDirectSecuritiesLentShort",
1034        default,
1035        deserialize_with = "deserialize_optional_decimal"
1036    )]
1037    pub slb_direct_securities_lent_short: Option<Decimal>,
1038
1039    /// `bondInterestAccrualsComponent` (added for full ibflex coverage)
1040    #[serde(
1041        rename = "@bondInterestAccrualsComponent",
1042        default,
1043        deserialize_with = "deserialize_optional_decimal"
1044    )]
1045    pub bond_interest_accruals_component: Option<Decimal>,
1046
1047    /// `bondInterestAccrualsComponentLong` (added for full ibflex coverage)
1048    #[serde(
1049        rename = "@bondInterestAccrualsComponentLong",
1050        default,
1051        deserialize_with = "deserialize_optional_decimal"
1052    )]
1053    pub bond_interest_accruals_component_long: Option<Decimal>,
1054
1055    /// `bondInterestAccrualsComponentShort` (added for full ibflex coverage)
1056    #[serde(
1057        rename = "@bondInterestAccrualsComponentShort",
1058        default,
1059        deserialize_with = "deserialize_optional_decimal"
1060    )]
1061    pub bond_interest_accruals_component_short: Option<Decimal>,
1062
1063    /// `notesLong` (added for full ibflex coverage)
1064    #[serde(
1065        rename = "@notesLong",
1066        default,
1067        deserialize_with = "deserialize_optional_decimal"
1068    )]
1069    pub notes_long: Option<Decimal>,
1070
1071    /// `notesShort` (added for full ibflex coverage)
1072    #[serde(
1073        rename = "@notesShort",
1074        default,
1075        deserialize_with = "deserialize_optional_decimal"
1076    )]
1077    pub notes_short: Option<Decimal>,
1078
1079    /// `incentiveCouponAccruals` (added for full ibflex coverage)
1080    #[serde(
1081        rename = "@incentiveCouponAccruals",
1082        default,
1083        deserialize_with = "deserialize_optional_decimal"
1084    )]
1085    pub incentive_coupon_accruals: Option<Decimal>,
1086
1087    /// `interestAccrualsLong` (added for full ibflex coverage)
1088    #[serde(
1089        rename = "@interestAccrualsLong",
1090        default,
1091        deserialize_with = "deserialize_optional_decimal"
1092    )]
1093    pub interest_accruals_long: Option<Decimal>,
1094
1095    /// `interestAccrualsShort` (added for full ibflex coverage)
1096    #[serde(
1097        rename = "@interestAccrualsShort",
1098        default,
1099        deserialize_with = "deserialize_optional_decimal"
1100    )]
1101    pub interest_accruals_short: Option<Decimal>,
1102
1103    /// `softDollarsLong` (added for full ibflex coverage)
1104    #[serde(
1105        rename = "@softDollarsLong",
1106        default,
1107        deserialize_with = "deserialize_optional_decimal"
1108    )]
1109    pub soft_dollars_long: Option<Decimal>,
1110
1111    /// `softDollarsShort` (added for full ibflex coverage)
1112    #[serde(
1113        rename = "@softDollarsShort",
1114        default,
1115        deserialize_with = "deserialize_optional_decimal"
1116    )]
1117    pub soft_dollars_short: Option<Decimal>,
1118
1119    /// `dividendAccrualsLong` (added for full ibflex coverage)
1120    #[serde(
1121        rename = "@dividendAccrualsLong",
1122        default,
1123        deserialize_with = "deserialize_optional_decimal"
1124    )]
1125    pub dividend_accruals_long: Option<Decimal>,
1126
1127    /// `dividendAccrualsShort` (added for full ibflex coverage)
1128    #[serde(
1129        rename = "@dividendAccrualsShort",
1130        default,
1131        deserialize_with = "deserialize_optional_decimal"
1132    )]
1133    pub dividend_accruals_short: Option<Decimal>,
1134
1135    /// `commoditiesLong` (added for full ibflex coverage)
1136    #[serde(
1137        rename = "@commoditiesLong",
1138        default,
1139        deserialize_with = "deserialize_optional_decimal"
1140    )]
1141    pub commodities_long: Option<Decimal>,
1142
1143    /// `commoditiesShort` (added for full ibflex coverage)
1144    #[serde(
1145        rename = "@commoditiesShort",
1146        default,
1147        deserialize_with = "deserialize_optional_decimal"
1148    )]
1149    pub commodities_short: Option<Decimal>,
1150
1151    /// `fundsLong` (added for full ibflex coverage)
1152    #[serde(
1153        rename = "@fundsLong",
1154        default,
1155        deserialize_with = "deserialize_optional_decimal"
1156    )]
1157    pub funds_long: Option<Decimal>,
1158
1159    /// `fundsShort` (added for full ibflex coverage)
1160    #[serde(
1161        rename = "@fundsShort",
1162        default,
1163        deserialize_with = "deserialize_optional_decimal"
1164    )]
1165    pub funds_short: Option<Decimal>,
1166
1167    /// `forexCfdUnrealizedPlLong` (added for full ibflex coverage)
1168    #[serde(
1169        rename = "@forexCfdUnrealizedPlLong",
1170        default,
1171        deserialize_with = "deserialize_optional_decimal"
1172    )]
1173    pub forex_cfd_unrealized_pl_long: Option<Decimal>,
1174
1175    /// `forexCfdUnrealizedPlShort` (added for full ibflex coverage)
1176    #[serde(
1177        rename = "@forexCfdUnrealizedPlShort",
1178        default,
1179        deserialize_with = "deserialize_optional_decimal"
1180    )]
1181    pub forex_cfd_unrealized_pl_short: Option<Decimal>,
1182
1183    /// `brokerFeesAccrualsComponent` (added for full ibflex coverage)
1184    #[serde(
1185        rename = "@brokerFeesAccrualsComponent",
1186        default,
1187        deserialize_with = "deserialize_optional_decimal"
1188    )]
1189    pub broker_fees_accruals_component: Option<Decimal>,
1190
1191    /// `brokerFeesAccrualsComponentLong` (added for full ibflex coverage)
1192    #[serde(
1193        rename = "@brokerFeesAccrualsComponentLong",
1194        default,
1195        deserialize_with = "deserialize_optional_decimal"
1196    )]
1197    pub broker_fees_accruals_component_long: Option<Decimal>,
1198
1199    /// `brokerFeesAccrualsComponentShort` (added for full ibflex coverage)
1200    #[serde(
1201        rename = "@brokerFeesAccrualsComponentShort",
1202        default,
1203        deserialize_with = "deserialize_optional_decimal"
1204    )]
1205    pub broker_fees_accruals_component_short: Option<Decimal>,
1206
1207    /// `eventContractInterestAccruals` (added for full ibflex coverage)
1208    #[serde(
1209        rename = "@eventContractInterestAccruals",
1210        default,
1211        deserialize_with = "deserialize_optional_decimal"
1212    )]
1213    pub event_contract_interest_accruals: Option<Decimal>,
1214
1215    /// `marginFinancingChargeAccruals` (added for full ibflex coverage)
1216    #[serde(
1217        rename = "@marginFinancingChargeAccruals",
1218        default,
1219        deserialize_with = "deserialize_optional_decimal"
1220    )]
1221    pub margin_financing_charge_accruals: Option<Decimal>,
1222
1223    /// `insuredBankDepositRedemptionCashComponent` (added for full ibflex coverage)
1224    #[serde(
1225        rename = "@insuredBankDepositRedemptionCashComponent",
1226        default,
1227        deserialize_with = "deserialize_optional_decimal"
1228    )]
1229    pub insured_bank_deposit_redemption_cash_component: Option<Decimal>,
1230
1231    /// `fdicInsuredBankSweepAccount` (added for full ibflex coverage)
1232    #[serde(
1233        rename = "@fdicInsuredBankSweepAccount",
1234        default,
1235        deserialize_with = "deserialize_optional_decimal"
1236    )]
1237    pub fdic_insured_bank_sweep_account: Option<Decimal>,
1238
1239    /// `fdicInsuredBankSweepAccountLong` (added for full ibflex coverage)
1240    #[serde(
1241        rename = "@fdicInsuredBankSweepAccountLong",
1242        default,
1243        deserialize_with = "deserialize_optional_decimal"
1244    )]
1245    pub fdic_insured_bank_sweep_account_long: Option<Decimal>,
1246
1247    /// `fdicInsuredBankSweepAccountShort` (added for full ibflex coverage)
1248    #[serde(
1249        rename = "@fdicInsuredBankSweepAccountShort",
1250        default,
1251        deserialize_with = "deserialize_optional_decimal"
1252    )]
1253    pub fdic_insured_bank_sweep_account_short: Option<Decimal>,
1254
1255    /// `fdicInsuredBankSweepAccountCashComponent` (added for full ibflex coverage)
1256    #[serde(
1257        rename = "@fdicInsuredBankSweepAccountCashComponent",
1258        default,
1259        deserialize_with = "deserialize_optional_decimal"
1260    )]
1261    pub fdic_insured_bank_sweep_account_cash_component: Option<Decimal>,
1262
1263    /// `fdicInsuredBankSweepAccountCashComponentLong` (added for full ibflex coverage)
1264    #[serde(
1265        rename = "@fdicInsuredBankSweepAccountCashComponentLong",
1266        default,
1267        deserialize_with = "deserialize_optional_decimal"
1268    )]
1269    pub fdic_insured_bank_sweep_account_cash_component_long: Option<Decimal>,
1270
1271    /// `fdicInsuredBankSweepAccountCashComponentShort` (added for full ibflex coverage)
1272    #[serde(
1273        rename = "@fdicInsuredBankSweepAccountCashComponentShort",
1274        default,
1275        deserialize_with = "deserialize_optional_decimal"
1276    )]
1277    pub fdic_insured_bank_sweep_account_cash_component_short: Option<Decimal>,
1278
1279    /// `fdicInsuredAccountInterestAccruals` (added for full ibflex coverage)
1280    #[serde(
1281        rename = "@fdicInsuredAccountInterestAccruals",
1282        default,
1283        deserialize_with = "deserialize_optional_decimal"
1284    )]
1285    pub fdic_insured_account_interest_accruals: Option<Decimal>,
1286
1287    /// `fdicInsuredAccountInterestAccrualsLong` (added for full ibflex coverage)
1288    #[serde(
1289        rename = "@fdicInsuredAccountInterestAccrualsLong",
1290        default,
1291        deserialize_with = "deserialize_optional_decimal"
1292    )]
1293    pub fdic_insured_account_interest_accruals_long: Option<Decimal>,
1294
1295    /// `fdicInsuredAccountInterestAccrualsShort` (added for full ibflex coverage)
1296    #[serde(
1297        rename = "@fdicInsuredAccountInterestAccrualsShort",
1298        default,
1299        deserialize_with = "deserialize_optional_decimal"
1300    )]
1301    pub fdic_insured_account_interest_accruals_short: Option<Decimal>,
1302
1303    /// `fdicInsuredAccountInterestAccrualsComponent` (added for full ibflex coverage)
1304    #[serde(
1305        rename = "@fdicInsuredAccountInterestAccrualsComponent",
1306        default,
1307        deserialize_with = "deserialize_optional_decimal"
1308    )]
1309    pub fdic_insured_account_interest_accruals_component: Option<Decimal>,
1310
1311    /// `fdicInsuredAccountInterestAccrualsComponentLong` (added for full ibflex coverage)
1312    #[serde(
1313        rename = "@fdicInsuredAccountInterestAccrualsComponentLong",
1314        default,
1315        deserialize_with = "deserialize_optional_decimal"
1316    )]
1317    pub fdic_insured_account_interest_accruals_component_long: Option<Decimal>,
1318
1319    /// `fdicInsuredAccountInterestAccrualsComponentShort` (added for full ibflex coverage)
1320    #[serde(
1321        rename = "@fdicInsuredAccountInterestAccrualsComponentShort",
1322        default,
1323        deserialize_with = "deserialize_optional_decimal"
1324    )]
1325    pub fdic_insured_account_interest_accruals_component_short: Option<Decimal>,
1326
1327    /// `brokerCashComponentLong` (added for full ibflex coverage)
1328    #[serde(
1329        rename = "@brokerCashComponentLong",
1330        default,
1331        deserialize_with = "deserialize_optional_decimal"
1332    )]
1333    pub broker_cash_component_long: Option<Decimal>,
1334
1335    /// `brokerCashComponentShort` (added for full ibflex coverage)
1336    #[serde(
1337        rename = "@brokerCashComponentShort",
1338        default,
1339        deserialize_with = "deserialize_optional_decimal"
1340    )]
1341    pub broker_cash_component_short: Option<Decimal>,
1342
1343    /// `brokerInterestAccrualsComponentLong` (added for full ibflex coverage)
1344    #[serde(
1345        rename = "@brokerInterestAccrualsComponentLong",
1346        default,
1347        deserialize_with = "deserialize_optional_decimal"
1348    )]
1349    pub broker_interest_accruals_component_long: Option<Decimal>,
1350
1351    /// `brokerInterestAccrualsComponentShort` (added for full ibflex coverage)
1352    #[serde(
1353        rename = "@brokerInterestAccrualsComponentShort",
1354        default,
1355        deserialize_with = "deserialize_optional_decimal"
1356    )]
1357    pub broker_interest_accruals_component_short: Option<Decimal>,
1358
1359    /// `cfdUnrealizedPlLong` (added for full ibflex coverage)
1360    #[serde(
1361        rename = "@cfdUnrealizedPlLong",
1362        default,
1363        deserialize_with = "deserialize_optional_decimal"
1364    )]
1365    pub cfd_unrealized_pl_long: Option<Decimal>,
1366
1367    /// `cfdUnrealizedPlShort` (added for full ibflex coverage)
1368    #[serde(
1369        rename = "@cfdUnrealizedPlShort",
1370        default,
1371        deserialize_with = "deserialize_optional_decimal"
1372    )]
1373    pub cfd_unrealized_pl_short: Option<Decimal>,
1374
1375    /// `ipoSubscription` (added for full ibflex coverage)
1376    #[serde(
1377        rename = "@ipoSubscription",
1378        default,
1379        deserialize_with = "deserialize_optional_decimal"
1380    )]
1381    pub ipo_subscription: Option<Decimal>,
1382
1383    /// `ipoSubscriptionLong` (added for full ibflex coverage)
1384    #[serde(
1385        rename = "@ipoSubscriptionLong",
1386        default,
1387        deserialize_with = "deserialize_optional_decimal"
1388    )]
1389    pub ipo_subscription_long: Option<Decimal>,
1390
1391    /// `ipoSubscriptionShort` (added for full ibflex coverage)
1392    #[serde(
1393        rename = "@ipoSubscriptionShort",
1394        default,
1395        deserialize_with = "deserialize_optional_decimal"
1396    )]
1397    pub ipo_subscription_short: Option<Decimal>,
1398
1399    /// `crypto` (added for full ibflex coverage)
1400    #[serde(
1401        rename = "@crypto",
1402        default,
1403        deserialize_with = "deserialize_optional_decimal"
1404    )]
1405    pub crypto: Option<Decimal>,
1406
1407    /// `physDel` (added for full ibflex coverage)
1408    #[serde(
1409        rename = "@physDel",
1410        default,
1411        deserialize_with = "deserialize_optional_decimal"
1412    )]
1413    pub phys_del: Option<Decimal>,
1414
1415    /// `physDelLong` (added for full ibflex coverage)
1416    #[serde(
1417        rename = "@physDelLong",
1418        default,
1419        deserialize_with = "deserialize_optional_decimal"
1420    )]
1421    pub phys_del_long: Option<Decimal>,
1422
1423    /// `physDelShort` (added for full ibflex coverage)
1424    #[serde(
1425        rename = "@physDelShort",
1426        default,
1427        deserialize_with = "deserialize_optional_decimal"
1428    )]
1429    pub phys_del_short: Option<Decimal>,
1430
1431    /// `insuredBankDepositRedemptionCashComponentLong` (added for full ibflex coverage)
1432    #[serde(
1433        rename = "@insuredBankDepositRedemptionCashComponentLong",
1434        default,
1435        deserialize_with = "deserialize_optional_decimal"
1436    )]
1437    pub insured_bank_deposit_redemption_cash_component_long: Option<Decimal>,
1438
1439    /// `insuredBankDepositRedemptionCashComponentShort` (added for full ibflex coverage)
1440    #[serde(
1441        rename = "@insuredBankDepositRedemptionCashComponentShort",
1442        default,
1443        deserialize_with = "deserialize_optional_decimal"
1444    )]
1445    pub insured_bank_deposit_redemption_cash_component_short: Option<Decimal>,
1446
1447    /// `incentiveCouponAccrualsLong` (added for full ibflex coverage)
1448    #[serde(
1449        rename = "@incentiveCouponAccrualsLong",
1450        default,
1451        deserialize_with = "deserialize_optional_decimal"
1452    )]
1453    pub incentive_coupon_accruals_long: Option<Decimal>,
1454
1455    /// `incentiveCouponAccrualsShort` (added for full ibflex coverage)
1456    #[serde(
1457        rename = "@incentiveCouponAccrualsShort",
1458        default,
1459        deserialize_with = "deserialize_optional_decimal"
1460    )]
1461    pub incentive_coupon_accruals_short: Option<Decimal>,
1462
1463    /// `eventContractInterestAccrualsLong` (added for full ibflex coverage)
1464    #[serde(
1465        rename = "@eventContractInterestAccrualsLong",
1466        default,
1467        deserialize_with = "deserialize_optional_decimal"
1468    )]
1469    pub event_contract_interest_accruals_long: Option<Decimal>,
1470
1471    /// `eventContractInterestAccrualsShort` (added for full ibflex coverage)
1472    #[serde(
1473        rename = "@eventContractInterestAccrualsShort",
1474        default,
1475        deserialize_with = "deserialize_optional_decimal"
1476    )]
1477    pub event_contract_interest_accruals_short: Option<Decimal>,
1478
1479    /// `marginFinancingChargeAccrualsLong` (added for full ibflex coverage)
1480    #[serde(
1481        rename = "@marginFinancingChargeAccrualsLong",
1482        default,
1483        deserialize_with = "deserialize_optional_decimal"
1484    )]
1485    pub margin_financing_charge_accruals_long: Option<Decimal>,
1486
1487    /// `marginFinancingChargeAccrualsShort` (added for full ibflex coverage)
1488    #[serde(
1489        rename = "@marginFinancingChargeAccrualsShort",
1490        default,
1491        deserialize_with = "deserialize_optional_decimal"
1492    )]
1493    pub margin_financing_charge_accruals_short: Option<Decimal>,
1494
1495    /// `cryptoLong` (added for full ibflex coverage)
1496    #[serde(
1497        rename = "@cryptoLong",
1498        default,
1499        deserialize_with = "deserialize_optional_decimal"
1500    )]
1501    pub crypto_long: Option<Decimal>,
1502
1503    /// `cryptoShort` (added for full ibflex coverage)
1504    #[serde(
1505        rename = "@cryptoShort",
1506        default,
1507        deserialize_with = "deserialize_optional_decimal"
1508    )]
1509    pub crypto_short: Option<Decimal>,
1510
1511    /// `liteSurchargeAccruals` (added for full ibflex coverage)
1512    #[serde(
1513        rename = "@liteSurchargeAccruals",
1514        default,
1515        deserialize_with = "deserialize_optional_decimal"
1516    )]
1517    pub lite_surcharge_accruals: Option<Decimal>,
1518}
1519
1520/// Cash report by currency
1521#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
1522pub struct CashReportCurrency {
1523    /// Account ID
1524    #[serde(
1525        rename = "@accountId",
1526        default,
1527        deserialize_with = "deserialize_optional_string"
1528    )]
1529    pub account_id: Option<String>,
1530
1531    /// Account alias
1532    #[serde(rename = "@acctAlias", default)]
1533    pub acct_alias: Option<String>,
1534
1535    /// Model
1536    #[serde(rename = "@model", default)]
1537    pub model: Option<String>,
1538
1539    /// Currency
1540    #[serde(
1541        rename = "@currency",
1542        default,
1543        deserialize_with = "deserialize_optional_string"
1544    )]
1545    pub currency: Option<String>,
1546
1547    /// From date
1548    #[serde(
1549        rename = "@fromDate",
1550        default,
1551        deserialize_with = "deserialize_optional_date"
1552    )]
1553    pub from_date: Option<NaiveDate>,
1554
1555    /// To date
1556    #[serde(
1557        rename = "@toDate",
1558        default,
1559        deserialize_with = "deserialize_optional_date"
1560    )]
1561    pub to_date: Option<NaiveDate>,
1562
1563    /// Starting cash
1564    #[serde(
1565        rename = "@startingCash",
1566        default,
1567        deserialize_with = "deserialize_optional_decimal"
1568    )]
1569    pub starting_cash: Option<Decimal>,
1570
1571    /// Starting cash (securities segment)
1572    #[serde(
1573        rename = "@startingCashSec",
1574        default,
1575        deserialize_with = "deserialize_optional_decimal"
1576    )]
1577    pub starting_cash_sec: Option<Decimal>,
1578
1579    /// Starting cash (commodities segment)
1580    #[serde(
1581        rename = "@startingCashCom",
1582        default,
1583        deserialize_with = "deserialize_optional_decimal"
1584    )]
1585    pub starting_cash_com: Option<Decimal>,
1586
1587    /// Commissions paid
1588    #[serde(
1589        rename = "@commissions",
1590        default,
1591        deserialize_with = "deserialize_optional_decimal"
1592    )]
1593    pub commissions: Option<Decimal>,
1594
1595    /// Commissions (securities segment)
1596    #[serde(
1597        rename = "@commissionsSec",
1598        default,
1599        deserialize_with = "deserialize_optional_decimal"
1600    )]
1601    pub commissions_sec: Option<Decimal>,
1602
1603    /// Commissions (commodities segment)
1604    #[serde(
1605        rename = "@commissionsCom",
1606        default,
1607        deserialize_with = "deserialize_optional_decimal"
1608    )]
1609    pub commissions_com: Option<Decimal>,
1610
1611    /// Deposits
1612    #[serde(
1613        rename = "@deposits",
1614        default,
1615        deserialize_with = "deserialize_optional_decimal"
1616    )]
1617    pub deposits: Option<Decimal>,
1618
1619    /// Withdrawals
1620    #[serde(
1621        rename = "@withdrawals",
1622        default,
1623        deserialize_with = "deserialize_optional_decimal"
1624    )]
1625    pub withdrawals: Option<Decimal>,
1626
1627    /// Dividends
1628    #[serde(
1629        rename = "@dividends",
1630        default,
1631        deserialize_with = "deserialize_optional_decimal"
1632    )]
1633    pub dividends: Option<Decimal>,
1634
1635    /// Broker interest received
1636    #[serde(
1637        rename = "@brokerInterest",
1638        default,
1639        deserialize_with = "deserialize_optional_decimal"
1640    )]
1641    pub broker_interest: Option<Decimal>,
1642
1643    /// Bond interest received
1644    #[serde(
1645        rename = "@bondInterest",
1646        default,
1647        deserialize_with = "deserialize_optional_decimal"
1648    )]
1649    pub bond_interest: Option<Decimal>,
1650
1651    /// Withholding tax
1652    #[serde(
1653        rename = "@withholdingTax",
1654        default,
1655        deserialize_with = "deserialize_optional_decimal"
1656    )]
1657    pub withholding_tax: Option<Decimal>,
1658
1659    /// Net trades sales
1660    #[serde(
1661        rename = "@netTradesSales",
1662        default,
1663        deserialize_with = "deserialize_optional_decimal"
1664    )]
1665    pub net_trades_sales: Option<Decimal>,
1666
1667    /// Net trades purchases
1668    #[serde(
1669        rename = "@netTradesPurchases",
1670        default,
1671        deserialize_with = "deserialize_optional_decimal"
1672    )]
1673    pub net_trades_purchases: Option<Decimal>,
1674
1675    /// Account transfers
1676    #[serde(
1677        rename = "@accountTransfers",
1678        default,
1679        deserialize_with = "deserialize_optional_decimal"
1680    )]
1681    pub account_transfers: Option<Decimal>,
1682
1683    /// Internal transfers
1684    #[serde(
1685        rename = "@internalTransfers",
1686        default,
1687        deserialize_with = "deserialize_optional_decimal"
1688    )]
1689    pub internal_transfers: Option<Decimal>,
1690
1691    /// External transfers
1692    #[serde(
1693        rename = "@externalTransfers",
1694        default,
1695        deserialize_with = "deserialize_optional_decimal"
1696    )]
1697    pub external_transfers: Option<Decimal>,
1698
1699    /// Link interest
1700    #[serde(
1701        rename = "@linkingAdjustments",
1702        default,
1703        deserialize_with = "deserialize_optional_decimal"
1704    )]
1705    pub linking_adjustments: Option<Decimal>,
1706
1707    /// Other fees
1708    #[serde(
1709        rename = "@otherFees",
1710        default,
1711        deserialize_with = "deserialize_optional_decimal"
1712    )]
1713    pub other_fees: Option<Decimal>,
1714
1715    /// FX translation P&L
1716    #[serde(
1717        rename = "@fxTranslationPnl",
1718        default,
1719        deserialize_with = "deserialize_optional_decimal"
1720    )]
1721    pub fx_translation_pnl: Option<Decimal>,
1722
1723    /// Billable sales tax
1724    #[serde(
1725        rename = "@billableSalesTax",
1726        default,
1727        deserialize_with = "deserialize_optional_decimal"
1728    )]
1729    pub billable_sales_tax: Option<Decimal>,
1730
1731    /// Realized forex P&L
1732    #[serde(
1733        rename = "@realizedForexPnl",
1734        default,
1735        deserialize_with = "deserialize_optional_decimal"
1736    )]
1737    pub realized_forex_pnl: Option<Decimal>,
1738
1739    /// Debit card activity
1740    #[serde(
1741        rename = "@debitCardActivity",
1742        default,
1743        deserialize_with = "deserialize_optional_decimal"
1744    )]
1745    pub debit_card_activity: Option<Decimal>,
1746
1747    /// Client fees
1748    #[serde(
1749        rename = "@clientFees",
1750        default,
1751        deserialize_with = "deserialize_optional_decimal"
1752    )]
1753    pub client_fees: Option<Decimal>,
1754
1755    /// Cash settling MTM
1756    #[serde(
1757        rename = "@cashSettlingMtm",
1758        default,
1759        deserialize_with = "deserialize_optional_decimal"
1760    )]
1761    pub cash_settling_mtm: Option<Decimal>,
1762
1763    /// Soft dollar fees
1764    #[serde(
1765        rename = "@softDollars",
1766        default,
1767        deserialize_with = "deserialize_optional_decimal"
1768    )]
1769    pub soft_dollars: Option<Decimal>,
1770
1771    /// Ending cash
1772    #[serde(
1773        rename = "@endingCash",
1774        default,
1775        deserialize_with = "deserialize_optional_decimal"
1776    )]
1777    pub ending_cash: Option<Decimal>,
1778
1779    /// Ending cash (securities segment)
1780    #[serde(
1781        rename = "@endingCashSec",
1782        default,
1783        deserialize_with = "deserialize_optional_decimal"
1784    )]
1785    pub ending_cash_sec: Option<Decimal>,
1786
1787    /// Ending cash (commodities segment)
1788    #[serde(
1789        rename = "@endingCashCom",
1790        default,
1791        deserialize_with = "deserialize_optional_decimal"
1792    )]
1793    pub ending_cash_com: Option<Decimal>,
1794
1795    /// Ending settled cash
1796    #[serde(
1797        rename = "@endingSettledCash",
1798        default,
1799        deserialize_with = "deserialize_optional_decimal"
1800    )]
1801    pub ending_settled_cash: Option<Decimal>,
1802
1803    /// Ending settled cash (securities segment)
1804    #[serde(
1805        rename = "@endingSettledCashSec",
1806        default,
1807        deserialize_with = "deserialize_optional_decimal"
1808    )]
1809    pub ending_settled_cash_sec: Option<Decimal>,
1810
1811    /// Ending settled cash (commodities segment)
1812    #[serde(
1813        rename = "@endingSettledCashCom",
1814        default,
1815        deserialize_with = "deserialize_optional_decimal"
1816    )]
1817    pub ending_settled_cash_com: Option<Decimal>,
1818
1819    /// `startingCashPaxos` (added for full ibflex coverage)
1820    #[serde(
1821        rename = "@startingCashPaxos",
1822        default,
1823        deserialize_with = "deserialize_optional_decimal"
1824    )]
1825    pub starting_cash_paxos: Option<Decimal>,
1826
1827    /// `clientFeesSec` (added for full ibflex coverage)
1828    #[serde(
1829        rename = "@clientFeesSec",
1830        default,
1831        deserialize_with = "deserialize_optional_decimal"
1832    )]
1833    pub client_fees_sec: Option<Decimal>,
1834
1835    /// `clientFeesCom` (added for full ibflex coverage)
1836    #[serde(
1837        rename = "@clientFeesCom",
1838        default,
1839        deserialize_with = "deserialize_optional_decimal"
1840    )]
1841    pub client_fees_com: Option<Decimal>,
1842
1843    /// `billableCommissions` (added for full ibflex coverage)
1844    #[serde(
1845        rename = "@billableCommissions",
1846        default,
1847        deserialize_with = "deserialize_optional_decimal"
1848    )]
1849    pub billable_commissions: Option<Decimal>,
1850
1851    /// `billableCommissionsSec` (added for full ibflex coverage)
1852    #[serde(
1853        rename = "@billableCommissionsSec",
1854        default,
1855        deserialize_with = "deserialize_optional_decimal"
1856    )]
1857    pub billable_commissions_sec: Option<Decimal>,
1858
1859    /// `billableCommissionsCom` (added for full ibflex coverage)
1860    #[serde(
1861        rename = "@billableCommissionsCom",
1862        default,
1863        deserialize_with = "deserialize_optional_decimal"
1864    )]
1865    pub billable_commissions_com: Option<Decimal>,
1866
1867    /// `billableSalesTaxIBUKL` (added for full ibflex coverage)
1868    #[serde(
1869        rename = "@billableSalesTaxIBUKL",
1870        default,
1871        deserialize_with = "deserialize_optional_decimal"
1872    )]
1873    pub billable_sales_tax_ibukl: Option<Decimal>,
1874
1875    /// `depositWithdrawals` (added for full ibflex coverage)
1876    #[serde(
1877        rename = "@depositWithdrawals",
1878        default,
1879        deserialize_with = "deserialize_optional_decimal"
1880    )]
1881    pub deposit_withdrawals: Option<Decimal>,
1882
1883    /// `depositWithdrawalsSec` (added for full ibflex coverage)
1884    #[serde(
1885        rename = "@depositWithdrawalsSec",
1886        default,
1887        deserialize_with = "deserialize_optional_decimal"
1888    )]
1889    pub deposit_withdrawals_sec: Option<Decimal>,
1890
1891    /// `depositWithdrawalsCom` (added for full ibflex coverage)
1892    #[serde(
1893        rename = "@depositWithdrawalsCom",
1894        default,
1895        deserialize_with = "deserialize_optional_decimal"
1896    )]
1897    pub deposit_withdrawals_com: Option<Decimal>,
1898
1899    /// `depositsSec` (added for full ibflex coverage)
1900    #[serde(
1901        rename = "@depositsSec",
1902        default,
1903        deserialize_with = "deserialize_optional_decimal"
1904    )]
1905    pub deposits_sec: Option<Decimal>,
1906
1907    /// `depositsCom` (added for full ibflex coverage)
1908    #[serde(
1909        rename = "@depositsCom",
1910        default,
1911        deserialize_with = "deserialize_optional_decimal"
1912    )]
1913    pub deposits_com: Option<Decimal>,
1914
1915    /// `withdrawalsSec` (added for full ibflex coverage)
1916    #[serde(
1917        rename = "@withdrawalsSec",
1918        default,
1919        deserialize_with = "deserialize_optional_decimal"
1920    )]
1921    pub withdrawals_sec: Option<Decimal>,
1922
1923    /// `withdrawalsCom` (added for full ibflex coverage)
1924    #[serde(
1925        rename = "@withdrawalsCom",
1926        default,
1927        deserialize_with = "deserialize_optional_decimal"
1928    )]
1929    pub withdrawals_com: Option<Decimal>,
1930
1931    /// `accountTransfersSec` (added for full ibflex coverage)
1932    #[serde(
1933        rename = "@accountTransfersSec",
1934        default,
1935        deserialize_with = "deserialize_optional_decimal"
1936    )]
1937    pub account_transfers_sec: Option<Decimal>,
1938
1939    /// `accountTransfersCom` (added for full ibflex coverage)
1940    #[serde(
1941        rename = "@accountTransfersCom",
1942        default,
1943        deserialize_with = "deserialize_optional_decimal"
1944    )]
1945    pub account_transfers_com: Option<Decimal>,
1946
1947    /// `internalTransfersSec` (added for full ibflex coverage)
1948    #[serde(
1949        rename = "@internalTransfersSec",
1950        default,
1951        deserialize_with = "deserialize_optional_decimal"
1952    )]
1953    pub internal_transfers_sec: Option<Decimal>,
1954
1955    /// `internalTransfersCom` (added for full ibflex coverage)
1956    #[serde(
1957        rename = "@internalTransfersCom",
1958        default,
1959        deserialize_with = "deserialize_optional_decimal"
1960    )]
1961    pub internal_transfers_com: Option<Decimal>,
1962
1963    /// `dividendsSec` (added for full ibflex coverage)
1964    #[serde(
1965        rename = "@dividendsSec",
1966        default,
1967        deserialize_with = "deserialize_optional_decimal"
1968    )]
1969    pub dividends_sec: Option<Decimal>,
1970
1971    /// `dividendsCom` (added for full ibflex coverage)
1972    #[serde(
1973        rename = "@dividendsCom",
1974        default,
1975        deserialize_with = "deserialize_optional_decimal"
1976    )]
1977    pub dividends_com: Option<Decimal>,
1978
1979    /// `brokerFees` (added for full ibflex coverage)
1980    #[serde(
1981        rename = "@brokerFees",
1982        default,
1983        deserialize_with = "deserialize_optional_decimal"
1984    )]
1985    pub broker_fees: Option<Decimal>,
1986
1987    /// `brokerFeesSec` (added for full ibflex coverage)
1988    #[serde(
1989        rename = "@brokerFeesSec",
1990        default,
1991        deserialize_with = "deserialize_optional_decimal"
1992    )]
1993    pub broker_fees_sec: Option<Decimal>,
1994
1995    /// `brokerFeesCom` (added for full ibflex coverage)
1996    #[serde(
1997        rename = "@brokerFeesCom",
1998        default,
1999        deserialize_with = "deserialize_optional_decimal"
2000    )]
2001    pub broker_fees_com: Option<Decimal>,
2002
2003    /// `brokerFeesMTD` (added for full ibflex coverage)
2004    #[serde(
2005        rename = "@brokerFeesMTD",
2006        default,
2007        deserialize_with = "deserialize_optional_decimal"
2008    )]
2009    pub broker_fees_mtd: Option<Decimal>,
2010
2011    /// `brokerFeesYTD` (added for full ibflex coverage)
2012    #[serde(
2013        rename = "@brokerFeesYTD",
2014        default,
2015        deserialize_with = "deserialize_optional_decimal"
2016    )]
2017    pub broker_fees_ytd: Option<Decimal>,
2018
2019    /// `brokerFeesPaxos` (added for full ibflex coverage)
2020    #[serde(
2021        rename = "@brokerFeesPaxos",
2022        default,
2023        deserialize_with = "deserialize_optional_decimal"
2024    )]
2025    pub broker_fees_paxos: Option<Decimal>,
2026
2027    /// `brokerInterestSec` (added for full ibflex coverage)
2028    #[serde(
2029        rename = "@brokerInterestSec",
2030        default,
2031        deserialize_with = "deserialize_optional_decimal"
2032    )]
2033    pub broker_interest_sec: Option<Decimal>,
2034
2035    /// `brokerInterestCom` (added for full ibflex coverage)
2036    #[serde(
2037        rename = "@brokerInterestCom",
2038        default,
2039        deserialize_with = "deserialize_optional_decimal"
2040    )]
2041    pub broker_interest_com: Option<Decimal>,
2042
2043    /// `bondInterestSec` (added for full ibflex coverage)
2044    #[serde(
2045        rename = "@bondInterestSec",
2046        default,
2047        deserialize_with = "deserialize_optional_decimal"
2048    )]
2049    pub bond_interest_sec: Option<Decimal>,
2050
2051    /// `bondInterestCom` (added for full ibflex coverage)
2052    #[serde(
2053        rename = "@bondInterestCom",
2054        default,
2055        deserialize_with = "deserialize_optional_decimal"
2056    )]
2057    pub bond_interest_com: Option<Decimal>,
2058
2059    /// `bondInterestPaxos` (added for full ibflex coverage)
2060    #[serde(
2061        rename = "@bondInterestPaxos",
2062        default,
2063        deserialize_with = "deserialize_optional_decimal"
2064    )]
2065    pub bond_interest_paxos: Option<Decimal>,
2066
2067    /// `cashSettlingMtmSec` (added for full ibflex coverage)
2068    #[serde(
2069        rename = "@cashSettlingMtmSec",
2070        default,
2071        deserialize_with = "deserialize_optional_decimal"
2072    )]
2073    pub cash_settling_mtm_sec: Option<Decimal>,
2074
2075    /// `cashSettlingMtmCom` (added for full ibflex coverage)
2076    #[serde(
2077        rename = "@cashSettlingMtmCom",
2078        default,
2079        deserialize_with = "deserialize_optional_decimal"
2080    )]
2081    pub cash_settling_mtm_com: Option<Decimal>,
2082
2083    /// `cfdCharges` (added for full ibflex coverage)
2084    #[serde(
2085        rename = "@cfdCharges",
2086        default,
2087        deserialize_with = "deserialize_optional_decimal"
2088    )]
2089    pub cfd_charges: Option<Decimal>,
2090
2091    /// `cfdChargesSec` (added for full ibflex coverage)
2092    #[serde(
2093        rename = "@cfdChargesSec",
2094        default,
2095        deserialize_with = "deserialize_optional_decimal"
2096    )]
2097    pub cfd_charges_sec: Option<Decimal>,
2098
2099    /// `cfdChargesCom` (added for full ibflex coverage)
2100    #[serde(
2101        rename = "@cfdChargesCom",
2102        default,
2103        deserialize_with = "deserialize_optional_decimal"
2104    )]
2105    pub cfd_charges_com: Option<Decimal>,
2106
2107    /// `netTradesSalesSec` (added for full ibflex coverage)
2108    #[serde(
2109        rename = "@netTradesSalesSec",
2110        default,
2111        deserialize_with = "deserialize_optional_decimal"
2112    )]
2113    pub net_trades_sales_sec: Option<Decimal>,
2114
2115    /// `netTradesSalesCom` (added for full ibflex coverage)
2116    #[serde(
2117        rename = "@netTradesSalesCom",
2118        default,
2119        deserialize_with = "deserialize_optional_decimal"
2120    )]
2121    pub net_trades_sales_com: Option<Decimal>,
2122
2123    /// `netTradesPurchasesSec` (added for full ibflex coverage)
2124    #[serde(
2125        rename = "@netTradesPurchasesSec",
2126        default,
2127        deserialize_with = "deserialize_optional_decimal"
2128    )]
2129    pub net_trades_purchases_sec: Option<Decimal>,
2130
2131    /// `netTradesPurchasesCom` (added for full ibflex coverage)
2132    #[serde(
2133        rename = "@netTradesPurchasesCom",
2134        default,
2135        deserialize_with = "deserialize_optional_decimal"
2136    )]
2137    pub net_trades_purchases_com: Option<Decimal>,
2138
2139    /// `feesReceivables` (added for full ibflex coverage)
2140    #[serde(
2141        rename = "@feesReceivables",
2142        default,
2143        deserialize_with = "deserialize_optional_decimal"
2144    )]
2145    pub fees_receivables: Option<Decimal>,
2146
2147    /// `feesReceivablesSec` (added for full ibflex coverage)
2148    #[serde(
2149        rename = "@feesReceivablesSec",
2150        default,
2151        deserialize_with = "deserialize_optional_decimal"
2152    )]
2153    pub fees_receivables_sec: Option<Decimal>,
2154
2155    /// `feesReceivablesCom` (added for full ibflex coverage)
2156    #[serde(
2157        rename = "@feesReceivablesCom",
2158        default,
2159        deserialize_with = "deserialize_optional_decimal"
2160    )]
2161    pub fees_receivables_com: Option<Decimal>,
2162
2163    /// `paymentInLieu` (added for full ibflex coverage)
2164    #[serde(
2165        rename = "@paymentInLieu",
2166        default,
2167        deserialize_with = "deserialize_optional_decimal"
2168    )]
2169    pub payment_in_lieu: Option<Decimal>,
2170
2171    /// `paymentInLieuSec` (added for full ibflex coverage)
2172    #[serde(
2173        rename = "@paymentInLieuSec",
2174        default,
2175        deserialize_with = "deserialize_optional_decimal"
2176    )]
2177    pub payment_in_lieu_sec: Option<Decimal>,
2178
2179    /// `paymentInLieuCom` (added for full ibflex coverage)
2180    #[serde(
2181        rename = "@paymentInLieuCom",
2182        default,
2183        deserialize_with = "deserialize_optional_decimal"
2184    )]
2185    pub payment_in_lieu_com: Option<Decimal>,
2186
2187    /// `paymentInLieuIBUKL` (added for full ibflex coverage)
2188    #[serde(
2189        rename = "@paymentInLieuIBUKL",
2190        default,
2191        deserialize_with = "deserialize_optional_decimal"
2192    )]
2193    pub payment_in_lieu_ibukl: Option<Decimal>,
2194
2195    /// `transactionTax` (added for full ibflex coverage)
2196    #[serde(
2197        rename = "@transactionTax",
2198        default,
2199        deserialize_with = "deserialize_optional_decimal"
2200    )]
2201    pub transaction_tax: Option<Decimal>,
2202
2203    /// `transactionTaxSec` (added for full ibflex coverage)
2204    #[serde(
2205        rename = "@transactionTaxSec",
2206        default,
2207        deserialize_with = "deserialize_optional_decimal"
2208    )]
2209    pub transaction_tax_sec: Option<Decimal>,
2210
2211    /// `transactionTaxCom` (added for full ibflex coverage)
2212    #[serde(
2213        rename = "@transactionTaxCom",
2214        default,
2215        deserialize_with = "deserialize_optional_decimal"
2216    )]
2217    pub transaction_tax_com: Option<Decimal>,
2218
2219    /// `withholdingTaxSec` (added for full ibflex coverage)
2220    #[serde(
2221        rename = "@withholdingTaxSec",
2222        default,
2223        deserialize_with = "deserialize_optional_decimal"
2224    )]
2225    pub withholding_tax_sec: Option<Decimal>,
2226
2227    /// `withholdingTaxCom` (added for full ibflex coverage)
2228    #[serde(
2229        rename = "@withholdingTaxCom",
2230        default,
2231        deserialize_with = "deserialize_optional_decimal"
2232    )]
2233    pub withholding_tax_com: Option<Decimal>,
2234
2235    /// `fxTranslationGainLoss` (added for full ibflex coverage)
2236    #[serde(
2237        rename = "@fxTranslationGainLoss",
2238        default,
2239        deserialize_with = "deserialize_optional_decimal"
2240    )]
2241    pub fx_translation_gain_loss: Option<Decimal>,
2242
2243    /// `fxTranslationGainLossSec` (added for full ibflex coverage)
2244    #[serde(
2245        rename = "@fxTranslationGainLossSec",
2246        default,
2247        deserialize_with = "deserialize_optional_decimal"
2248    )]
2249    pub fx_translation_gain_loss_sec: Option<Decimal>,
2250
2251    /// `fxTranslationGainLossCom` (added for full ibflex coverage)
2252    #[serde(
2253        rename = "@fxTranslationGainLossCom",
2254        default,
2255        deserialize_with = "deserialize_optional_decimal"
2256    )]
2257    pub fx_translation_gain_loss_com: Option<Decimal>,
2258
2259    /// `fxTranslationGainLossPaxos` (added for full ibflex coverage)
2260    #[serde(
2261        rename = "@fxTranslationGainLossPaxos",
2262        default,
2263        deserialize_with = "deserialize_optional_decimal"
2264    )]
2265    pub fx_translation_gain_loss_paxos: Option<Decimal>,
2266
2267    /// `otherFeesSec` (added for full ibflex coverage)
2268    #[serde(
2269        rename = "@otherFeesSec",
2270        default,
2271        deserialize_with = "deserialize_optional_decimal"
2272    )]
2273    pub other_fees_sec: Option<Decimal>,
2274
2275    /// `otherFeesCom` (added for full ibflex coverage)
2276    #[serde(
2277        rename = "@otherFeesCom",
2278        default,
2279        deserialize_with = "deserialize_optional_decimal"
2280    )]
2281    pub other_fees_com: Option<Decimal>,
2282
2283    /// `endingCashPaxos` (added for full ibflex coverage)
2284    #[serde(
2285        rename = "@endingCashPaxos",
2286        default,
2287        deserialize_with = "deserialize_optional_decimal"
2288    )]
2289    pub ending_cash_paxos: Option<Decimal>,
2290
2291    /// `endingSettledCashPaxos` (added for full ibflex coverage)
2292    #[serde(
2293        rename = "@endingSettledCashPaxos",
2294        default,
2295        deserialize_with = "deserialize_optional_decimal"
2296    )]
2297    pub ending_settled_cash_paxos: Option<Decimal>,
2298
2299    /// `endingCashIBUKL` (added for full ibflex coverage)
2300    #[serde(
2301        rename = "@endingCashIBUKL",
2302        default,
2303        deserialize_with = "deserialize_optional_decimal"
2304    )]
2305    pub ending_cash_ibukl: Option<Decimal>,
2306
2307    /// `clientFeesMTD` (added for full ibflex coverage)
2308    #[serde(
2309        rename = "@clientFeesMTD",
2310        default,
2311        deserialize_with = "deserialize_optional_decimal"
2312    )]
2313    pub client_fees_mtd: Option<Decimal>,
2314
2315    /// `clientFeesYTD` (added for full ibflex coverage)
2316    #[serde(
2317        rename = "@clientFeesYTD",
2318        default,
2319        deserialize_with = "deserialize_optional_decimal"
2320    )]
2321    pub client_fees_ytd: Option<Decimal>,
2322
2323    /// `clientFeesPaxos` (added for full ibflex coverage)
2324    #[serde(
2325        rename = "@clientFeesPaxos",
2326        default,
2327        deserialize_with = "deserialize_optional_decimal"
2328    )]
2329    pub client_fees_paxos: Option<Decimal>,
2330
2331    /// `commissionsMTD` (added for full ibflex coverage)
2332    #[serde(
2333        rename = "@commissionsMTD",
2334        default,
2335        deserialize_with = "deserialize_optional_decimal"
2336    )]
2337    pub commissions_mtd: Option<Decimal>,
2338
2339    /// `commissionsYTD` (added for full ibflex coverage)
2340    #[serde(
2341        rename = "@commissionsYTD",
2342        default,
2343        deserialize_with = "deserialize_optional_decimal"
2344    )]
2345    pub commissions_ytd: Option<Decimal>,
2346
2347    /// `commissionsPaxos` (added for full ibflex coverage)
2348    #[serde(
2349        rename = "@commissionsPaxos",
2350        default,
2351        deserialize_with = "deserialize_optional_decimal"
2352    )]
2353    pub commissions_paxos: Option<Decimal>,
2354
2355    /// `billableCommissionsMTD` (added for full ibflex coverage)
2356    #[serde(
2357        rename = "@billableCommissionsMTD",
2358        default,
2359        deserialize_with = "deserialize_optional_decimal"
2360    )]
2361    pub billable_commissions_mtd: Option<Decimal>,
2362
2363    /// `billableCommissionsYTD` (added for full ibflex coverage)
2364    #[serde(
2365        rename = "@billableCommissionsYTD",
2366        default,
2367        deserialize_with = "deserialize_optional_decimal"
2368    )]
2369    pub billable_commissions_ytd: Option<Decimal>,
2370
2371    /// `billableCommissionsPaxos` (added for full ibflex coverage)
2372    #[serde(
2373        rename = "@billableCommissionsPaxos",
2374        default,
2375        deserialize_with = "deserialize_optional_decimal"
2376    )]
2377    pub billable_commissions_paxos: Option<Decimal>,
2378
2379    /// `depositWithdrawalsMTD` (added for full ibflex coverage)
2380    #[serde(
2381        rename = "@depositWithdrawalsMTD",
2382        default,
2383        deserialize_with = "deserialize_optional_decimal"
2384    )]
2385    pub deposit_withdrawals_mtd: Option<Decimal>,
2386
2387    /// `depositWithdrawalsYTD` (added for full ibflex coverage)
2388    #[serde(
2389        rename = "@depositWithdrawalsYTD",
2390        default,
2391        deserialize_with = "deserialize_optional_decimal"
2392    )]
2393    pub deposit_withdrawals_ytd: Option<Decimal>,
2394
2395    /// `depositWithdrawalsPaxos` (added for full ibflex coverage)
2396    #[serde(
2397        rename = "@depositWithdrawalsPaxos",
2398        default,
2399        deserialize_with = "deserialize_optional_decimal"
2400    )]
2401    pub deposit_withdrawals_paxos: Option<Decimal>,
2402
2403    /// `depositsMTD` (added for full ibflex coverage)
2404    #[serde(
2405        rename = "@depositsMTD",
2406        default,
2407        deserialize_with = "deserialize_optional_decimal"
2408    )]
2409    pub deposits_mtd: Option<Decimal>,
2410
2411    /// `depositsYTD` (added for full ibflex coverage)
2412    #[serde(
2413        rename = "@depositsYTD",
2414        default,
2415        deserialize_with = "deserialize_optional_decimal"
2416    )]
2417    pub deposits_ytd: Option<Decimal>,
2418
2419    /// `depositsPaxos` (added for full ibflex coverage)
2420    #[serde(
2421        rename = "@depositsPaxos",
2422        default,
2423        deserialize_with = "deserialize_optional_decimal"
2424    )]
2425    pub deposits_paxos: Option<Decimal>,
2426
2427    /// `withdrawalsMTD` (added for full ibflex coverage)
2428    #[serde(
2429        rename = "@withdrawalsMTD",
2430        default,
2431        deserialize_with = "deserialize_optional_decimal"
2432    )]
2433    pub withdrawals_mtd: Option<Decimal>,
2434
2435    /// `withdrawalsYTD` (added for full ibflex coverage)
2436    #[serde(
2437        rename = "@withdrawalsYTD",
2438        default,
2439        deserialize_with = "deserialize_optional_decimal"
2440    )]
2441    pub withdrawals_ytd: Option<Decimal>,
2442
2443    /// `withdrawalsPaxos` (added for full ibflex coverage)
2444    #[serde(
2445        rename = "@withdrawalsPaxos",
2446        default,
2447        deserialize_with = "deserialize_optional_decimal"
2448    )]
2449    pub withdrawals_paxos: Option<Decimal>,
2450
2451    /// `accountTransfersMTD` (added for full ibflex coverage)
2452    #[serde(
2453        rename = "@accountTransfersMTD",
2454        default,
2455        deserialize_with = "deserialize_optional_decimal"
2456    )]
2457    pub account_transfers_mtd: Option<Decimal>,
2458
2459    /// `accountTransfersYTD` (added for full ibflex coverage)
2460    #[serde(
2461        rename = "@accountTransfersYTD",
2462        default,
2463        deserialize_with = "deserialize_optional_decimal"
2464    )]
2465    pub account_transfers_ytd: Option<Decimal>,
2466
2467    /// `accountTransfersPaxos` (added for full ibflex coverage)
2468    #[serde(
2469        rename = "@accountTransfersPaxos",
2470        default,
2471        deserialize_with = "deserialize_optional_decimal"
2472    )]
2473    pub account_transfers_paxos: Option<Decimal>,
2474
2475    /// `internalTransfersMTD` (added for full ibflex coverage)
2476    #[serde(
2477        rename = "@internalTransfersMTD",
2478        default,
2479        deserialize_with = "deserialize_optional_decimal"
2480    )]
2481    pub internal_transfers_mtd: Option<Decimal>,
2482
2483    /// `internalTransfersYTD` (added for full ibflex coverage)
2484    #[serde(
2485        rename = "@internalTransfersYTD",
2486        default,
2487        deserialize_with = "deserialize_optional_decimal"
2488    )]
2489    pub internal_transfers_ytd: Option<Decimal>,
2490
2491    /// `internalTransfersPaxos` (added for full ibflex coverage)
2492    #[serde(
2493        rename = "@internalTransfersPaxos",
2494        default,
2495        deserialize_with = "deserialize_optional_decimal"
2496    )]
2497    pub internal_transfers_paxos: Option<Decimal>,
2498
2499    /// `paxosTransfersPaxos` (added for full ibflex coverage)
2500    #[serde(
2501        rename = "@paxosTransfersPaxos",
2502        default,
2503        deserialize_with = "deserialize_optional_decimal"
2504    )]
2505    pub paxos_transfers_paxos: Option<Decimal>,
2506
2507    /// `excessFundSweep` (added for full ibflex coverage)
2508    #[serde(
2509        rename = "@excessFundSweep",
2510        default,
2511        deserialize_with = "deserialize_optional_decimal"
2512    )]
2513    pub excess_fund_sweep: Option<Decimal>,
2514
2515    /// `excessFundSweepSec` (added for full ibflex coverage)
2516    #[serde(
2517        rename = "@excessFundSweepSec",
2518        default,
2519        deserialize_with = "deserialize_optional_decimal"
2520    )]
2521    pub excess_fund_sweep_sec: Option<Decimal>,
2522
2523    /// `excessFundSweepCom` (added for full ibflex coverage)
2524    #[serde(
2525        rename = "@excessFundSweepCom",
2526        default,
2527        deserialize_with = "deserialize_optional_decimal"
2528    )]
2529    pub excess_fund_sweep_com: Option<Decimal>,
2530
2531    /// `excessFundSweepMTD` (added for full ibflex coverage)
2532    #[serde(
2533        rename = "@excessFundSweepMTD",
2534        default,
2535        deserialize_with = "deserialize_optional_decimal"
2536    )]
2537    pub excess_fund_sweep_mtd: Option<Decimal>,
2538
2539    /// `excessFundSweepYTD` (added for full ibflex coverage)
2540    #[serde(
2541        rename = "@excessFundSweepYTD",
2542        default,
2543        deserialize_with = "deserialize_optional_decimal"
2544    )]
2545    pub excess_fund_sweep_ytd: Option<Decimal>,
2546
2547    /// `excessFundSweepPaxos` (added for full ibflex coverage)
2548    #[serde(
2549        rename = "@excessFundSweepPaxos",
2550        default,
2551        deserialize_with = "deserialize_optional_decimal"
2552    )]
2553    pub excess_fund_sweep_paxos: Option<Decimal>,
2554
2555    /// `dividendsMTD` (added for full ibflex coverage)
2556    #[serde(
2557        rename = "@dividendsMTD",
2558        default,
2559        deserialize_with = "deserialize_optional_decimal"
2560    )]
2561    pub dividends_mtd: Option<Decimal>,
2562
2563    /// `dividendsYTD` (added for full ibflex coverage)
2564    #[serde(
2565        rename = "@dividendsYTD",
2566        default,
2567        deserialize_with = "deserialize_optional_decimal"
2568    )]
2569    pub dividends_ytd: Option<Decimal>,
2570
2571    /// `dividendsPaxos` (added for full ibflex coverage)
2572    #[serde(
2573        rename = "@dividendsPaxos",
2574        default,
2575        deserialize_with = "deserialize_optional_decimal"
2576    )]
2577    pub dividends_paxos: Option<Decimal>,
2578
2579    /// `insuredDepositInterestMTD` (added for full ibflex coverage)
2580    #[serde(
2581        rename = "@insuredDepositInterestMTD",
2582        default,
2583        deserialize_with = "deserialize_optional_decimal"
2584    )]
2585    pub insured_deposit_interest_mtd: Option<Decimal>,
2586
2587    /// `insuredDepositInterestYTD` (added for full ibflex coverage)
2588    #[serde(
2589        rename = "@insuredDepositInterestYTD",
2590        default,
2591        deserialize_with = "deserialize_optional_decimal"
2592    )]
2593    pub insured_deposit_interest_ytd: Option<Decimal>,
2594
2595    /// `insuredDepositInteresPaxos` (added for full ibflex coverage)
2596    #[serde(
2597        rename = "@insuredDepositInteresPaxos",
2598        default,
2599        deserialize_with = "deserialize_optional_decimal"
2600    )]
2601    pub insured_deposit_interes_paxos: Option<Decimal>,
2602
2603    /// `brokerInterestMTD` (added for full ibflex coverage)
2604    #[serde(
2605        rename = "@brokerInterestMTD",
2606        default,
2607        deserialize_with = "deserialize_optional_decimal"
2608    )]
2609    pub broker_interest_mtd: Option<Decimal>,
2610
2611    /// `brokerInterestYTD` (added for full ibflex coverage)
2612    #[serde(
2613        rename = "@brokerInterestYTD",
2614        default,
2615        deserialize_with = "deserialize_optional_decimal"
2616    )]
2617    pub broker_interest_ytd: Option<Decimal>,
2618
2619    /// `brokerInterestPaxos` (added for full ibflex coverage)
2620    #[serde(
2621        rename = "@brokerInterestPaxos",
2622        default,
2623        deserialize_with = "deserialize_optional_decimal"
2624    )]
2625    pub broker_interest_paxos: Option<Decimal>,
2626
2627    /// `bondInterestMTD` (added for full ibflex coverage)
2628    #[serde(
2629        rename = "@bondInterestMTD",
2630        default,
2631        deserialize_with = "deserialize_optional_decimal"
2632    )]
2633    pub bond_interest_mtd: Option<Decimal>,
2634
2635    /// `bondInterestYTD` (added for full ibflex coverage)
2636    #[serde(
2637        rename = "@bondInterestYTD",
2638        default,
2639        deserialize_with = "deserialize_optional_decimal"
2640    )]
2641    pub bond_interest_ytd: Option<Decimal>,
2642
2643    /// `cashSettlingMtmMTD` (added for full ibflex coverage)
2644    #[serde(
2645        rename = "@cashSettlingMtmMTD",
2646        default,
2647        deserialize_with = "deserialize_optional_decimal"
2648    )]
2649    pub cash_settling_mtm_mtd: Option<Decimal>,
2650
2651    /// `cashSettlingMtmYTD` (added for full ibflex coverage)
2652    #[serde(
2653        rename = "@cashSettlingMtmYTD",
2654        default,
2655        deserialize_with = "deserialize_optional_decimal"
2656    )]
2657    pub cash_settling_mtm_ytd: Option<Decimal>,
2658
2659    /// `cashSettlingMtmPaxos` (added for full ibflex coverage)
2660    #[serde(
2661        rename = "@cashSettlingMtmPaxos",
2662        default,
2663        deserialize_with = "deserialize_optional_decimal"
2664    )]
2665    pub cash_settling_mtm_paxos: Option<Decimal>,
2666
2667    /// `realizedVmMTD` (added for full ibflex coverage)
2668    #[serde(
2669        rename = "@realizedVmMTD",
2670        default,
2671        deserialize_with = "deserialize_optional_decimal"
2672    )]
2673    pub realized_vm_mtd: Option<Decimal>,
2674
2675    /// `realizedVmYTD` (added for full ibflex coverage)
2676    #[serde(
2677        rename = "@realizedVmYTD",
2678        default,
2679        deserialize_with = "deserialize_optional_decimal"
2680    )]
2681    pub realized_vm_ytd: Option<Decimal>,
2682
2683    /// `realizedVmPaxos` (added for full ibflex coverage)
2684    #[serde(
2685        rename = "@realizedVmPaxos",
2686        default,
2687        deserialize_with = "deserialize_optional_decimal"
2688    )]
2689    pub realized_vm_paxos: Option<Decimal>,
2690
2691    /// `cfdChargesMTD` (added for full ibflex coverage)
2692    #[serde(
2693        rename = "@cfdChargesMTD",
2694        default,
2695        deserialize_with = "deserialize_optional_decimal"
2696    )]
2697    pub cfd_charges_mtd: Option<Decimal>,
2698
2699    /// `cfdChargesYTD` (added for full ibflex coverage)
2700    #[serde(
2701        rename = "@cfdChargesYTD",
2702        default,
2703        deserialize_with = "deserialize_optional_decimal"
2704    )]
2705    pub cfd_charges_ytd: Option<Decimal>,
2706
2707    /// `cfdChargesPaxos` (added for full ibflex coverage)
2708    #[serde(
2709        rename = "@cfdChargesPaxos",
2710        default,
2711        deserialize_with = "deserialize_optional_decimal"
2712    )]
2713    pub cfd_charges_paxos: Option<Decimal>,
2714
2715    /// `netTradesSalesMTD` (added for full ibflex coverage)
2716    #[serde(
2717        rename = "@netTradesSalesMTD",
2718        default,
2719        deserialize_with = "deserialize_optional_decimal"
2720    )]
2721    pub net_trades_sales_mtd: Option<Decimal>,
2722
2723    /// `netTradesSalesYTD` (added for full ibflex coverage)
2724    #[serde(
2725        rename = "@netTradesSalesYTD",
2726        default,
2727        deserialize_with = "deserialize_optional_decimal"
2728    )]
2729    pub net_trades_sales_ytd: Option<Decimal>,
2730
2731    /// `netTradesSalesPaxos` (added for full ibflex coverage)
2732    #[serde(
2733        rename = "@netTradesSalesPaxos",
2734        default,
2735        deserialize_with = "deserialize_optional_decimal"
2736    )]
2737    pub net_trades_sales_paxos: Option<Decimal>,
2738
2739    /// `advisorFeesMTD` (added for full ibflex coverage)
2740    #[serde(
2741        rename = "@advisorFeesMTD",
2742        default,
2743        deserialize_with = "deserialize_optional_decimal"
2744    )]
2745    pub advisor_fees_mtd: Option<Decimal>,
2746
2747    /// `advisorFeesYTD` (added for full ibflex coverage)
2748    #[serde(
2749        rename = "@advisorFeesYTD",
2750        default,
2751        deserialize_with = "deserialize_optional_decimal"
2752    )]
2753    pub advisor_fees_ytd: Option<Decimal>,
2754
2755    /// `advisorFeePaxos` (added for full ibflex coverage)
2756    #[serde(
2757        rename = "@advisorFeePaxos",
2758        default,
2759        deserialize_with = "deserialize_optional_decimal"
2760    )]
2761    pub advisor_fee_paxos: Option<Decimal>,
2762
2763    /// `feesReceivablesMTD` (added for full ibflex coverage)
2764    #[serde(
2765        rename = "@feesReceivablesMTD",
2766        default,
2767        deserialize_with = "deserialize_optional_decimal"
2768    )]
2769    pub fees_receivables_mtd: Option<Decimal>,
2770
2771    /// `feesReceivablesYTD` (added for full ibflex coverage)
2772    #[serde(
2773        rename = "@feesReceivablesYTD",
2774        default,
2775        deserialize_with = "deserialize_optional_decimal"
2776    )]
2777    pub fees_receivables_ytd: Option<Decimal>,
2778
2779    /// `feesReceivablesPaxos` (added for full ibflex coverage)
2780    #[serde(
2781        rename = "@feesReceivablesPaxos",
2782        default,
2783        deserialize_with = "deserialize_optional_decimal"
2784    )]
2785    pub fees_receivables_paxos: Option<Decimal>,
2786
2787    /// `netTradesPurchasesMTD` (added for full ibflex coverage)
2788    #[serde(
2789        rename = "@netTradesPurchasesMTD",
2790        default,
2791        deserialize_with = "deserialize_optional_decimal"
2792    )]
2793    pub net_trades_purchases_mtd: Option<Decimal>,
2794
2795    /// `netTradesPurchasesYTD` (added for full ibflex coverage)
2796    #[serde(
2797        rename = "@netTradesPurchasesYTD",
2798        default,
2799        deserialize_with = "deserialize_optional_decimal"
2800    )]
2801    pub net_trades_purchases_ytd: Option<Decimal>,
2802
2803    /// `netTradesPurchasesPaxos` (added for full ibflex coverage)
2804    #[serde(
2805        rename = "@netTradesPurchasesPaxos",
2806        default,
2807        deserialize_with = "deserialize_optional_decimal"
2808    )]
2809    pub net_trades_purchases_paxos: Option<Decimal>,
2810
2811    /// `paymentInLieuMTD` (added for full ibflex coverage)
2812    #[serde(
2813        rename = "@paymentInLieuMTD",
2814        default,
2815        deserialize_with = "deserialize_optional_decimal"
2816    )]
2817    pub payment_in_lieu_mtd: Option<Decimal>,
2818
2819    /// `paymentInLieuYTD` (added for full ibflex coverage)
2820    #[serde(
2821        rename = "@paymentInLieuYTD",
2822        default,
2823        deserialize_with = "deserialize_optional_decimal"
2824    )]
2825    pub payment_in_lieu_ytd: Option<Decimal>,
2826
2827    /// `paymentInLieuPaxos` (added for full ibflex coverage)
2828    #[serde(
2829        rename = "@paymentInLieuPaxos",
2830        default,
2831        deserialize_with = "deserialize_optional_decimal"
2832    )]
2833    pub payment_in_lieu_paxos: Option<Decimal>,
2834
2835    /// `transactionTaxMTD` (added for full ibflex coverage)
2836    #[serde(
2837        rename = "@transactionTaxMTD",
2838        default,
2839        deserialize_with = "deserialize_optional_decimal"
2840    )]
2841    pub transaction_tax_mtd: Option<Decimal>,
2842
2843    /// `transactionTaxYTD` (added for full ibflex coverage)
2844    #[serde(
2845        rename = "@transactionTaxYTD",
2846        default,
2847        deserialize_with = "deserialize_optional_decimal"
2848    )]
2849    pub transaction_tax_ytd: Option<Decimal>,
2850
2851    /// `transactionTaxPaxos` (added for full ibflex coverage)
2852    #[serde(
2853        rename = "@transactionTaxPaxos",
2854        default,
2855        deserialize_with = "deserialize_optional_decimal"
2856    )]
2857    pub transaction_tax_paxos: Option<Decimal>,
2858
2859    /// `taxReceivablesMTD` (added for full ibflex coverage)
2860    #[serde(
2861        rename = "@taxReceivablesMTD",
2862        default,
2863        deserialize_with = "deserialize_optional_decimal"
2864    )]
2865    pub tax_receivables_mtd: Option<Decimal>,
2866
2867    /// `taxReceivablesYTD` (added for full ibflex coverage)
2868    #[serde(
2869        rename = "@taxReceivablesYTD",
2870        default,
2871        deserialize_with = "deserialize_optional_decimal"
2872    )]
2873    pub tax_receivables_ytd: Option<Decimal>,
2874
2875    /// `taxReceivablesPaxos` (added for full ibflex coverage)
2876    #[serde(
2877        rename = "@taxReceivablesPaxos",
2878        default,
2879        deserialize_with = "deserialize_optional_decimal"
2880    )]
2881    pub tax_receivables_paxos: Option<Decimal>,
2882
2883    /// `withholdingTaxMTD` (added for full ibflex coverage)
2884    #[serde(
2885        rename = "@withholdingTaxMTD",
2886        default,
2887        deserialize_with = "deserialize_optional_decimal"
2888    )]
2889    pub withholding_tax_mtd: Option<Decimal>,
2890
2891    /// `withholdingTaxYTD` (added for full ibflex coverage)
2892    #[serde(
2893        rename = "@withholdingTaxYTD",
2894        default,
2895        deserialize_with = "deserialize_optional_decimal"
2896    )]
2897    pub withholding_tax_ytd: Option<Decimal>,
2898
2899    /// `withholdingTaxPaxos` (added for full ibflex coverage)
2900    #[serde(
2901        rename = "@withholdingTaxPaxos",
2902        default,
2903        deserialize_with = "deserialize_optional_decimal"
2904    )]
2905    pub withholding_tax_paxos: Option<Decimal>,
2906
2907    /// `withholding871mMTD` (added for full ibflex coverage)
2908    #[serde(
2909        rename = "@withholding871mMTD",
2910        default,
2911        deserialize_with = "deserialize_optional_decimal"
2912    )]
2913    pub withholding871m_mtd: Option<Decimal>,
2914
2915    /// `withholding871mYTD` (added for full ibflex coverage)
2916    #[serde(
2917        rename = "@withholding871mYTD",
2918        default,
2919        deserialize_with = "deserialize_optional_decimal"
2920    )]
2921    pub withholding871m_ytd: Option<Decimal>,
2922
2923    /// `withholding871mPaxos` (added for full ibflex coverage)
2924    #[serde(
2925        rename = "@withholding871mPaxos",
2926        default,
2927        deserialize_with = "deserialize_optional_decimal"
2928    )]
2929    pub withholding871m_paxos: Option<Decimal>,
2930
2931    /// `withholdingCollectedTaxMTD` (added for full ibflex coverage)
2932    #[serde(
2933        rename = "@withholdingCollectedTaxMTD",
2934        default,
2935        deserialize_with = "deserialize_optional_decimal"
2936    )]
2937    pub withholding_collected_tax_mtd: Option<Decimal>,
2938
2939    /// `withholdingCollectedTaxYTD` (added for full ibflex coverage)
2940    #[serde(
2941        rename = "@withholdingCollectedTaxYTD",
2942        default,
2943        deserialize_with = "deserialize_optional_decimal"
2944    )]
2945    pub withholding_collected_tax_ytd: Option<Decimal>,
2946
2947    /// `withholdingCollectedTaxPaxos` (added for full ibflex coverage)
2948    #[serde(
2949        rename = "@withholdingCollectedTaxPaxos",
2950        default,
2951        deserialize_with = "deserialize_optional_decimal"
2952    )]
2953    pub withholding_collected_tax_paxos: Option<Decimal>,
2954
2955    /// `salesTaxMTD` (added for full ibflex coverage)
2956    #[serde(
2957        rename = "@salesTaxMTD",
2958        default,
2959        deserialize_with = "deserialize_optional_decimal"
2960    )]
2961    pub sales_tax_mtd: Option<Decimal>,
2962
2963    /// `salesTaxYTD` (added for full ibflex coverage)
2964    #[serde(
2965        rename = "@salesTaxYTD",
2966        default,
2967        deserialize_with = "deserialize_optional_decimal"
2968    )]
2969    pub sales_tax_ytd: Option<Decimal>,
2970
2971    /// `salesTaxPaxos` (added for full ibflex coverage)
2972    #[serde(
2973        rename = "@salesTaxPaxos",
2974        default,
2975        deserialize_with = "deserialize_optional_decimal"
2976    )]
2977    pub sales_tax_paxos: Option<Decimal>,
2978
2979    /// `otherIncome` (added for full ibflex coverage)
2980    #[serde(
2981        rename = "@otherIncome",
2982        default,
2983        deserialize_with = "deserialize_optional_decimal"
2984    )]
2985    pub other_income: Option<Decimal>,
2986
2987    /// `otherIncomeMTD` (added for full ibflex coverage)
2988    #[serde(
2989        rename = "@otherIncomeMTD",
2990        default,
2991        deserialize_with = "deserialize_optional_decimal"
2992    )]
2993    pub other_income_mtd: Option<Decimal>,
2994
2995    /// `otherIncomeYTD` (added for full ibflex coverage)
2996    #[serde(
2997        rename = "@otherIncomeYTD",
2998        default,
2999        deserialize_with = "deserialize_optional_decimal"
3000    )]
3001    pub other_income_ytd: Option<Decimal>,
3002
3003    /// `otherIncomeSec` (added for full ibflex coverage)
3004    #[serde(
3005        rename = "@otherIncomeSec",
3006        default,
3007        deserialize_with = "deserialize_optional_decimal"
3008    )]
3009    pub other_income_sec: Option<Decimal>,
3010
3011    /// `otherIncomeCom` (added for full ibflex coverage)
3012    #[serde(
3013        rename = "@otherIncomeCom",
3014        default,
3015        deserialize_with = "deserialize_optional_decimal"
3016    )]
3017    pub other_income_com: Option<Decimal>,
3018
3019    /// `otherFeesMTD` (added for full ibflex coverage)
3020    #[serde(
3021        rename = "@otherFeesMTD",
3022        default,
3023        deserialize_with = "deserialize_optional_decimal"
3024    )]
3025    pub other_fees_mtd: Option<Decimal>,
3026
3027    /// `otherFeesYTD` (added for full ibflex coverage)
3028    #[serde(
3029        rename = "@otherFeesYTD",
3030        default,
3031        deserialize_with = "deserialize_optional_decimal"
3032    )]
3033    pub other_fees_ytd: Option<Decimal>,
3034
3035    /// `otherFeesPaxos` (added for full ibflex coverage)
3036    #[serde(
3037        rename = "@otherFeesPaxos",
3038        default,
3039        deserialize_with = "deserialize_optional_decimal"
3040    )]
3041    pub other_fees_paxos: Option<Decimal>,
3042
3043    /// `avgCreditBalance` (added for full ibflex coverage)
3044    #[serde(
3045        rename = "@avgCreditBalance",
3046        default,
3047        deserialize_with = "deserialize_optional_decimal"
3048    )]
3049    pub avg_credit_balance: Option<Decimal>,
3050
3051    /// `avgCreditBalanceSec` (added for full ibflex coverage)
3052    #[serde(
3053        rename = "@avgCreditBalanceSec",
3054        default,
3055        deserialize_with = "deserialize_optional_decimal"
3056    )]
3057    pub avg_credit_balance_sec: Option<Decimal>,
3058
3059    /// `avgCreditBalanceCom` (added for full ibflex coverage)
3060    #[serde(
3061        rename = "@avgCreditBalanceCom",
3062        default,
3063        deserialize_with = "deserialize_optional_decimal"
3064    )]
3065    pub avg_credit_balance_com: Option<Decimal>,
3066
3067    /// `avgDebitBalance` (added for full ibflex coverage)
3068    #[serde(
3069        rename = "@avgDebitBalance",
3070        default,
3071        deserialize_with = "deserialize_optional_decimal"
3072    )]
3073    pub avg_debit_balance: Option<Decimal>,
3074
3075    /// `avgDebitBalanceSec` (added for full ibflex coverage)
3076    #[serde(
3077        rename = "@avgDebitBalanceSec",
3078        default,
3079        deserialize_with = "deserialize_optional_decimal"
3080    )]
3081    pub avg_debit_balance_sec: Option<Decimal>,
3082
3083    /// `avgDebitBalanceCom` (added for full ibflex coverage)
3084    #[serde(
3085        rename = "@avgDebitBalanceCom",
3086        default,
3087        deserialize_with = "deserialize_optional_decimal"
3088    )]
3089    pub avg_debit_balance_com: Option<Decimal>,
3090
3091    /// `linkingAdjustmentsSec` (added for full ibflex coverage)
3092    #[serde(
3093        rename = "@linkingAdjustmentsSec",
3094        default,
3095        deserialize_with = "deserialize_optional_decimal"
3096    )]
3097    pub linking_adjustments_sec: Option<Decimal>,
3098
3099    /// `linkingAdjustmentsCom` (added for full ibflex coverage)
3100    #[serde(
3101        rename = "@linkingAdjustmentsCom",
3102        default,
3103        deserialize_with = "deserialize_optional_decimal"
3104    )]
3105    pub linking_adjustments_com: Option<Decimal>,
3106
3107    /// `linkingAdjustmentsPaxos` (added for full ibflex coverage)
3108    #[serde(
3109        rename = "@linkingAdjustmentsPaxos",
3110        default,
3111        deserialize_with = "deserialize_optional_decimal"
3112    )]
3113    pub linking_adjustments_paxos: Option<Decimal>,
3114
3115    /// `insuredDepositInterest` (added for full ibflex coverage)
3116    #[serde(
3117        rename = "@insuredDepositInterest",
3118        default,
3119        deserialize_with = "deserialize_optional_decimal"
3120    )]
3121    pub insured_deposit_interest: Option<Decimal>,
3122
3123    /// `insuredDepositInterestSec` (added for full ibflex coverage)
3124    #[serde(
3125        rename = "@insuredDepositInterestSec",
3126        default,
3127        deserialize_with = "deserialize_optional_decimal"
3128    )]
3129    pub insured_deposit_interest_sec: Option<Decimal>,
3130
3131    /// `insuredDepositInterestCom` (added for full ibflex coverage)
3132    #[serde(
3133        rename = "@insuredDepositInterestCom",
3134        default,
3135        deserialize_with = "deserialize_optional_decimal"
3136    )]
3137    pub insured_deposit_interest_com: Option<Decimal>,
3138
3139    /// `insuredDepositInterestPaxos` (added for full ibflex coverage)
3140    #[serde(
3141        rename = "@insuredDepositInterestPaxos",
3142        default,
3143        deserialize_with = "deserialize_optional_decimal"
3144    )]
3145    pub insured_deposit_interest_paxos: Option<Decimal>,
3146
3147    /// `realizedVm` (added for full ibflex coverage)
3148    #[serde(
3149        rename = "@realizedVm",
3150        default,
3151        deserialize_with = "deserialize_optional_decimal"
3152    )]
3153    pub realized_vm: Option<Decimal>,
3154
3155    /// `realizedVmSec` (added for full ibflex coverage)
3156    #[serde(
3157        rename = "@realizedVmSec",
3158        default,
3159        deserialize_with = "deserialize_optional_decimal"
3160    )]
3161    pub realized_vm_sec: Option<Decimal>,
3162
3163    /// `realizedVmCom` (added for full ibflex coverage)
3164    #[serde(
3165        rename = "@realizedVmCom",
3166        default,
3167        deserialize_with = "deserialize_optional_decimal"
3168    )]
3169    pub realized_vm_com: Option<Decimal>,
3170
3171    /// `advisorFees` (added for full ibflex coverage)
3172    #[serde(
3173        rename = "@advisorFees",
3174        default,
3175        deserialize_with = "deserialize_optional_decimal"
3176    )]
3177    pub advisor_fees: Option<Decimal>,
3178
3179    /// `advisorFeesSec` (added for full ibflex coverage)
3180    #[serde(
3181        rename = "@advisorFeesSec",
3182        default,
3183        deserialize_with = "deserialize_optional_decimal"
3184    )]
3185    pub advisor_fees_sec: Option<Decimal>,
3186
3187    /// `advisorFeesCom` (added for full ibflex coverage)
3188    #[serde(
3189        rename = "@advisorFeesCom",
3190        default,
3191        deserialize_with = "deserialize_optional_decimal"
3192    )]
3193    pub advisor_fees_com: Option<Decimal>,
3194
3195    /// `advisorFeesPaxos` (added for full ibflex coverage)
3196    #[serde(
3197        rename = "@advisorFeesPaxos",
3198        default,
3199        deserialize_with = "deserialize_optional_decimal"
3200    )]
3201    pub advisor_fees_paxos: Option<Decimal>,
3202
3203    /// `taxReceivables` (added for full ibflex coverage)
3204    #[serde(
3205        rename = "@taxReceivables",
3206        default,
3207        deserialize_with = "deserialize_optional_decimal"
3208    )]
3209    pub tax_receivables: Option<Decimal>,
3210
3211    /// `taxReceivablesSec` (added for full ibflex coverage)
3212    #[serde(
3213        rename = "@taxReceivablesSec",
3214        default,
3215        deserialize_with = "deserialize_optional_decimal"
3216    )]
3217    pub tax_receivables_sec: Option<Decimal>,
3218
3219    /// `taxReceivablesCom` (added for full ibflex coverage)
3220    #[serde(
3221        rename = "@taxReceivablesCom",
3222        default,
3223        deserialize_with = "deserialize_optional_decimal"
3224    )]
3225    pub tax_receivables_com: Option<Decimal>,
3226
3227    /// `withholding871m` (added for full ibflex coverage)
3228    #[serde(
3229        rename = "@withholding871m",
3230        default,
3231        deserialize_with = "deserialize_optional_decimal"
3232    )]
3233    pub withholding871m: Option<Decimal>,
3234
3235    /// `withholding871mSec` (added for full ibflex coverage)
3236    #[serde(
3237        rename = "@withholding871mSec",
3238        default,
3239        deserialize_with = "deserialize_optional_decimal"
3240    )]
3241    pub withholding871m_sec: Option<Decimal>,
3242
3243    /// `withholding871mCom` (added for full ibflex coverage)
3244    #[serde(
3245        rename = "@withholding871mCom",
3246        default,
3247        deserialize_with = "deserialize_optional_decimal"
3248    )]
3249    pub withholding871m_com: Option<Decimal>,
3250
3251    /// `withholdingCollectedTax` (added for full ibflex coverage)
3252    #[serde(
3253        rename = "@withholdingCollectedTax",
3254        default,
3255        deserialize_with = "deserialize_optional_decimal"
3256    )]
3257    pub withholding_collected_tax: Option<Decimal>,
3258
3259    /// `withholdingCollectedTaxSec` (added for full ibflex coverage)
3260    #[serde(
3261        rename = "@withholdingCollectedTaxSec",
3262        default,
3263        deserialize_with = "deserialize_optional_decimal"
3264    )]
3265    pub withholding_collected_tax_sec: Option<Decimal>,
3266
3267    /// `withholdingCollectedTaxCom` (added for full ibflex coverage)
3268    #[serde(
3269        rename = "@withholdingCollectedTaxCom",
3270        default,
3271        deserialize_with = "deserialize_optional_decimal"
3272    )]
3273    pub withholding_collected_tax_com: Option<Decimal>,
3274
3275    /// `salesTax` (added for full ibflex coverage)
3276    #[serde(
3277        rename = "@salesTax",
3278        default,
3279        deserialize_with = "deserialize_optional_decimal"
3280    )]
3281    pub sales_tax: Option<Decimal>,
3282
3283    /// `salesTaxSec` (added for full ibflex coverage)
3284    #[serde(
3285        rename = "@salesTaxSec",
3286        default,
3287        deserialize_with = "deserialize_optional_decimal"
3288    )]
3289    pub sales_tax_sec: Option<Decimal>,
3290
3291    /// `salesTaxCom` (added for full ibflex coverage)
3292    #[serde(
3293        rename = "@salesTaxCom",
3294        default,
3295        deserialize_with = "deserialize_optional_decimal"
3296    )]
3297    pub sales_tax_com: Option<Decimal>,
3298
3299    /// `other` (added for full ibflex coverage)
3300    #[serde(
3301        rename = "@other",
3302        default,
3303        deserialize_with = "deserialize_optional_decimal"
3304    )]
3305    pub other: Option<Decimal>,
3306
3307    /// `otherSec` (added for full ibflex coverage)
3308    #[serde(
3309        rename = "@otherSec",
3310        default,
3311        deserialize_with = "deserialize_optional_decimal"
3312    )]
3313    pub other_sec: Option<Decimal>,
3314
3315    /// `otherCom` (added for full ibflex coverage)
3316    #[serde(
3317        rename = "@otherCom",
3318        default,
3319        deserialize_with = "deserialize_optional_decimal"
3320    )]
3321    pub other_com: Option<Decimal>,
3322
3323    /// `otherPaxos` (added for full ibflex coverage)
3324    #[serde(
3325        rename = "@otherPaxos",
3326        default,
3327        deserialize_with = "deserialize_optional_decimal"
3328    )]
3329    pub other_paxos: Option<Decimal>,
3330
3331    /// `levelOfDetail` (added for full ibflex coverage)
3332    #[serde(
3333        rename = "@levelOfDetail",
3334        default,
3335        deserialize_with = "deserialize_optional_string"
3336    )]
3337    pub level_of_detail: Option<String>,
3338
3339    /// `debitCardActivitySec` (added for full ibflex coverage)
3340    #[serde(
3341        rename = "@debitCardActivitySec",
3342        default,
3343        deserialize_with = "deserialize_optional_decimal"
3344    )]
3345    pub debit_card_activity_sec: Option<Decimal>,
3346
3347    /// `debitCardActivityCom` (added for full ibflex coverage)
3348    #[serde(
3349        rename = "@debitCardActivityCom",
3350        default,
3351        deserialize_with = "deserialize_optional_decimal"
3352    )]
3353    pub debit_card_activity_com: Option<Decimal>,
3354
3355    /// `debitCardActivityMTD` (added for full ibflex coverage)
3356    #[serde(
3357        rename = "@debitCardActivityMTD",
3358        default,
3359        deserialize_with = "deserialize_optional_decimal"
3360    )]
3361    pub debit_card_activity_mtd: Option<Decimal>,
3362
3363    /// `debitCardActivityYTD` (added for full ibflex coverage)
3364    #[serde(
3365        rename = "@debitCardActivityYTD",
3366        default,
3367        deserialize_with = "deserialize_optional_decimal"
3368    )]
3369    pub debit_card_activity_ytd: Option<Decimal>,
3370
3371    /// `debitCardActivityPaxos` (added for full ibflex coverage)
3372    #[serde(
3373        rename = "@debitCardActivityPaxos",
3374        default,
3375        deserialize_with = "deserialize_optional_decimal"
3376    )]
3377    pub debit_card_activity_paxos: Option<Decimal>,
3378
3379    /// `billPay` (added for full ibflex coverage)
3380    #[serde(
3381        rename = "@billPay",
3382        default,
3383        deserialize_with = "deserialize_optional_decimal"
3384    )]
3385    pub bill_pay: Option<Decimal>,
3386
3387    /// `billPaySec` (added for full ibflex coverage)
3388    #[serde(
3389        rename = "@billPaySec",
3390        default,
3391        deserialize_with = "deserialize_optional_decimal"
3392    )]
3393    pub bill_pay_sec: Option<Decimal>,
3394
3395    /// `billPayCom` (added for full ibflex coverage)
3396    #[serde(
3397        rename = "@billPayCom",
3398        default,
3399        deserialize_with = "deserialize_optional_decimal"
3400    )]
3401    pub bill_pay_com: Option<Decimal>,
3402
3403    /// `billPayMTD` (added for full ibflex coverage)
3404    #[serde(
3405        rename = "@billPayMTD",
3406        default,
3407        deserialize_with = "deserialize_optional_decimal"
3408    )]
3409    pub bill_pay_mtd: Option<Decimal>,
3410
3411    /// `billPayYTD` (added for full ibflex coverage)
3412    #[serde(
3413        rename = "@billPayYTD",
3414        default,
3415        deserialize_with = "deserialize_optional_decimal"
3416    )]
3417    pub bill_pay_ytd: Option<Decimal>,
3418
3419    /// `billPayPaxos` (added for full ibflex coverage)
3420    #[serde(
3421        rename = "@billPayPaxos",
3422        default,
3423        deserialize_with = "deserialize_optional_decimal"
3424    )]
3425    pub bill_pay_paxos: Option<Decimal>,
3426
3427    /// `realizedForexVm` (added for full ibflex coverage)
3428    #[serde(
3429        rename = "@realizedForexVm",
3430        default,
3431        deserialize_with = "deserialize_optional_decimal"
3432    )]
3433    pub realized_forex_vm: Option<Decimal>,
3434
3435    /// `realizedForexVmSec` (added for full ibflex coverage)
3436    #[serde(
3437        rename = "@realizedForexVmSec",
3438        default,
3439        deserialize_with = "deserialize_optional_decimal"
3440    )]
3441    pub realized_forex_vm_sec: Option<Decimal>,
3442
3443    /// `realizedForexVmCom` (added for full ibflex coverage)
3444    #[serde(
3445        rename = "@realizedForexVmCom",
3446        default,
3447        deserialize_with = "deserialize_optional_decimal"
3448    )]
3449    pub realized_forex_vm_com: Option<Decimal>,
3450
3451    /// `realizedForexVmMTD` (added for full ibflex coverage)
3452    #[serde(
3453        rename = "@realizedForexVmMTD",
3454        default,
3455        deserialize_with = "deserialize_optional_decimal"
3456    )]
3457    pub realized_forex_vm_mtd: Option<Decimal>,
3458
3459    /// `realizedForexVmYTD` (added for full ibflex coverage)
3460    #[serde(
3461        rename = "@realizedForexVmYTD",
3462        default,
3463        deserialize_with = "deserialize_optional_decimal"
3464    )]
3465    pub realized_forex_vm_ytd: Option<Decimal>,
3466
3467    /// `realizedForexVmPaxos` (added for full ibflex coverage)
3468    #[serde(
3469        rename = "@realizedForexVmPaxos",
3470        default,
3471        deserialize_with = "deserialize_optional_decimal"
3472    )]
3473    pub realized_forex_vm_paxos: Option<Decimal>,
3474
3475    /// `ipoSubscription` (added for full ibflex coverage)
3476    #[serde(
3477        rename = "@ipoSubscription",
3478        default,
3479        deserialize_with = "deserialize_optional_decimal"
3480    )]
3481    pub ipo_subscription: Option<Decimal>,
3482
3483    /// `ipoSubscriptionSec` (added for full ibflex coverage)
3484    #[serde(
3485        rename = "@ipoSubscriptionSec",
3486        default,
3487        deserialize_with = "deserialize_optional_decimal"
3488    )]
3489    pub ipo_subscription_sec: Option<Decimal>,
3490
3491    /// `ipoSubscriptionCom` (added for full ibflex coverage)
3492    #[serde(
3493        rename = "@ipoSubscriptionCom",
3494        default,
3495        deserialize_with = "deserialize_optional_decimal"
3496    )]
3497    pub ipo_subscription_com: Option<Decimal>,
3498
3499    /// `ipoSubscriptionMTD` (added for full ibflex coverage)
3500    #[serde(
3501        rename = "@ipoSubscriptionMTD",
3502        default,
3503        deserialize_with = "deserialize_optional_decimal"
3504    )]
3505    pub ipo_subscription_mtd: Option<Decimal>,
3506
3507    /// `ipoSubscriptionYTD` (added for full ibflex coverage)
3508    #[serde(
3509        rename = "@ipoSubscriptionYTD",
3510        default,
3511        deserialize_with = "deserialize_optional_decimal"
3512    )]
3513    pub ipo_subscription_ytd: Option<Decimal>,
3514
3515    /// `ipoSubscriptionPaxos` (added for full ibflex coverage)
3516    #[serde(
3517        rename = "@ipoSubscriptionPaxos",
3518        default,
3519        deserialize_with = "deserialize_optional_decimal"
3520    )]
3521    pub ipo_subscription_paxos: Option<Decimal>,
3522
3523    /// `billableSalesTaxSec` (added for full ibflex coverage)
3524    #[serde(
3525        rename = "@billableSalesTaxSec",
3526        default,
3527        deserialize_with = "deserialize_optional_decimal"
3528    )]
3529    pub billable_sales_tax_sec: Option<Decimal>,
3530
3531    /// `billableSalesTaxCom` (added for full ibflex coverage)
3532    #[serde(
3533        rename = "@billableSalesTaxCom",
3534        default,
3535        deserialize_with = "deserialize_optional_decimal"
3536    )]
3537    pub billable_sales_tax_com: Option<Decimal>,
3538
3539    /// `billableSalesTaxMTD` (added for full ibflex coverage)
3540    #[serde(
3541        rename = "@billableSalesTaxMTD",
3542        default,
3543        deserialize_with = "deserialize_optional_decimal"
3544    )]
3545    pub billable_sales_tax_mtd: Option<Decimal>,
3546
3547    /// `billableSalesTaxYTD` (added for full ibflex coverage)
3548    #[serde(
3549        rename = "@billableSalesTaxYTD",
3550        default,
3551        deserialize_with = "deserialize_optional_decimal"
3552    )]
3553    pub billable_sales_tax_ytd: Option<Decimal>,
3554
3555    /// `billableSalesTaxPaxos` (added for full ibflex coverage)
3556    #[serde(
3557        rename = "@billableSalesTaxPaxos",
3558        default,
3559        deserialize_with = "deserialize_optional_decimal"
3560    )]
3561    pub billable_sales_tax_paxos: Option<Decimal>,
3562
3563    /// `commissionCreditsRedemption` (added for full ibflex coverage)
3564    #[serde(
3565        rename = "@commissionCreditsRedemption",
3566        default,
3567        deserialize_with = "deserialize_optional_decimal"
3568    )]
3569    pub commission_credits_redemption: Option<Decimal>,
3570
3571    /// `commissionCreditsRedemptionSec` (added for full ibflex coverage)
3572    #[serde(
3573        rename = "@commissionCreditsRedemptionSec",
3574        default,
3575        deserialize_with = "deserialize_optional_decimal"
3576    )]
3577    pub commission_credits_redemption_sec: Option<Decimal>,
3578
3579    /// `commissionCreditsRedemptionCom` (added for full ibflex coverage)
3580    #[serde(
3581        rename = "@commissionCreditsRedemptionCom",
3582        default,
3583        deserialize_with = "deserialize_optional_decimal"
3584    )]
3585    pub commission_credits_redemption_com: Option<Decimal>,
3586
3587    /// `commissionCreditsRedemptionMTD` (added for full ibflex coverage)
3588    #[serde(
3589        rename = "@commissionCreditsRedemptionMTD",
3590        default,
3591        deserialize_with = "deserialize_optional_decimal"
3592    )]
3593    pub commission_credits_redemption_mtd: Option<Decimal>,
3594
3595    /// `commissionCreditsRedemptionYTD` (added for full ibflex coverage)
3596    #[serde(
3597        rename = "@commissionCreditsRedemptionYTD",
3598        default,
3599        deserialize_with = "deserialize_optional_decimal"
3600    )]
3601    pub commission_credits_redemption_ytd: Option<Decimal>,
3602
3603    /// `commissionCreditsRedemptionPaxos` (added for full ibflex coverage)
3604    #[serde(
3605        rename = "@commissionCreditsRedemptionPaxos",
3606        default,
3607        deserialize_with = "deserialize_optional_decimal"
3608    )]
3609    pub commission_credits_redemption_paxos: Option<Decimal>,
3610
3611    /// `referralFee` (added for full ibflex coverage)
3612    #[serde(
3613        rename = "@referralFee",
3614        default,
3615        deserialize_with = "deserialize_optional_decimal"
3616    )]
3617    pub referral_fee: Option<Decimal>,
3618
3619    /// `referralFeePaxos` (added for full ibflex coverage)
3620    #[serde(
3621        rename = "@referralFeePaxos",
3622        default,
3623        deserialize_with = "deserialize_optional_decimal"
3624    )]
3625    pub referral_fee_paxos: Option<Decimal>,
3626
3627    /// `referralFeeSec` (added for full ibflex coverage)
3628    #[serde(
3629        rename = "@referralFeeSec",
3630        default,
3631        deserialize_with = "deserialize_optional_decimal"
3632    )]
3633    pub referral_fee_sec: Option<Decimal>,
3634
3635    /// `referralFeeCom` (added for full ibflex coverage)
3636    #[serde(
3637        rename = "@referralFeeCom",
3638        default,
3639        deserialize_with = "deserialize_optional_decimal"
3640    )]
3641    pub referral_fee_com: Option<Decimal>,
3642
3643    /// `referralFeeMTD` (added for full ibflex coverage)
3644    #[serde(
3645        rename = "@referralFeeMTD",
3646        default,
3647        deserialize_with = "deserialize_optional_decimal"
3648    )]
3649    pub referral_fee_mtd: Option<Decimal>,
3650
3651    /// `referralFeeYTD` (added for full ibflex coverage)
3652    #[serde(
3653        rename = "@referralFeeYTD",
3654        default,
3655        deserialize_with = "deserialize_optional_decimal"
3656    )]
3657    pub referral_fee_ytd: Option<Decimal>,
3658
3659    /// `carbonCredits` (added for full ibflex coverage)
3660    #[serde(
3661        rename = "@carbonCredits",
3662        default,
3663        deserialize_with = "deserialize_optional_decimal"
3664    )]
3665    pub carbon_credits: Option<Decimal>,
3666
3667    /// `carbonCreditsSec` (added for full ibflex coverage)
3668    #[serde(
3669        rename = "@carbonCreditsSec",
3670        default,
3671        deserialize_with = "deserialize_optional_decimal"
3672    )]
3673    pub carbon_credits_sec: Option<Decimal>,
3674
3675    /// `carbonCreditsCom` (added for full ibflex coverage)
3676    #[serde(
3677        rename = "@carbonCreditsCom",
3678        default,
3679        deserialize_with = "deserialize_optional_decimal"
3680    )]
3681    pub carbon_credits_com: Option<Decimal>,
3682
3683    /// `carbonCreditsMTD` (added for full ibflex coverage)
3684    #[serde(
3685        rename = "@carbonCreditsMTD",
3686        default,
3687        deserialize_with = "deserialize_optional_decimal"
3688    )]
3689    pub carbon_credits_mtd: Option<Decimal>,
3690
3691    /// `carbonCreditsYTD` (added for full ibflex coverage)
3692    #[serde(
3693        rename = "@carbonCreditsYTD",
3694        default,
3695        deserialize_with = "deserialize_optional_decimal"
3696    )]
3697    pub carbon_credits_ytd: Option<Decimal>,
3698
3699    /// `carbonCreditsPaxos` (added for full ibflex coverage)
3700    #[serde(
3701        rename = "@carbonCreditsPaxos",
3702        default,
3703        deserialize_with = "deserialize_optional_decimal"
3704    )]
3705    pub carbon_credits_paxos: Option<Decimal>,
3706
3707    /// `donations` (added for full ibflex coverage)
3708    #[serde(
3709        rename = "@donations",
3710        default,
3711        deserialize_with = "deserialize_optional_decimal"
3712    )]
3713    pub donations: Option<Decimal>,
3714
3715    /// `donationsSec` (added for full ibflex coverage)
3716    #[serde(
3717        rename = "@donationsSec",
3718        default,
3719        deserialize_with = "deserialize_optional_decimal"
3720    )]
3721    pub donations_sec: Option<Decimal>,
3722
3723    /// `donationsCom` (added for full ibflex coverage)
3724    #[serde(
3725        rename = "@donationsCom",
3726        default,
3727        deserialize_with = "deserialize_optional_decimal"
3728    )]
3729    pub donations_com: Option<Decimal>,
3730
3731    /// `donationsMTD` (added for full ibflex coverage)
3732    #[serde(
3733        rename = "@donationsMTD",
3734        default,
3735        deserialize_with = "deserialize_optional_decimal"
3736    )]
3737    pub donations_mtd: Option<Decimal>,
3738
3739    /// `donationsYTD` (added for full ibflex coverage)
3740    #[serde(
3741        rename = "@donationsYTD",
3742        default,
3743        deserialize_with = "deserialize_optional_decimal"
3744    )]
3745    pub donations_ytd: Option<Decimal>,
3746
3747    /// `donationsPaxos` (added for full ibflex coverage)
3748    #[serde(
3749        rename = "@donationsPaxos",
3750        default,
3751        deserialize_with = "deserialize_optional_decimal"
3752    )]
3753    pub donations_paxos: Option<Decimal>,
3754
3755    /// `paxosTransfers` (added for full ibflex coverage)
3756    #[serde(
3757        rename = "@paxosTransfers",
3758        default,
3759        deserialize_with = "deserialize_optional_decimal"
3760    )]
3761    pub paxos_transfers: Option<Decimal>,
3762
3763    /// `paxosTransfersSec` (added for full ibflex coverage)
3764    #[serde(
3765        rename = "@paxosTransfersSec",
3766        default,
3767        deserialize_with = "deserialize_optional_decimal"
3768    )]
3769    pub paxos_transfers_sec: Option<Decimal>,
3770
3771    /// `paxosTransfersCom` (added for full ibflex coverage)
3772    #[serde(
3773        rename = "@paxosTransfersCom",
3774        default,
3775        deserialize_with = "deserialize_optional_decimal"
3776    )]
3777    pub paxos_transfers_com: Option<Decimal>,
3778
3779    /// `paxosTransfersMTD` (added for full ibflex coverage)
3780    #[serde(
3781        rename = "@paxosTransfersMTD",
3782        default,
3783        deserialize_with = "deserialize_optional_decimal"
3784    )]
3785    pub paxos_transfers_mtd: Option<Decimal>,
3786
3787    /// `paxosTransfersYTD` (added for full ibflex coverage)
3788    #[serde(
3789        rename = "@paxosTransfersYTD",
3790        default,
3791        deserialize_with = "deserialize_optional_decimal"
3792    )]
3793    pub paxos_transfers_ytd: Option<Decimal>,
3794
3795    /// `slbStartingCashCollateral` (added for full ibflex coverage)
3796    #[serde(
3797        rename = "@slbStartingCashCollateral",
3798        default,
3799        deserialize_with = "deserialize_optional_decimal"
3800    )]
3801    pub slb_starting_cash_collateral: Option<Decimal>,
3802
3803    /// `slbStartingCashCollateralSec` (added for full ibflex coverage)
3804    #[serde(
3805        rename = "@slbStartingCashCollateralSec",
3806        default,
3807        deserialize_with = "deserialize_optional_decimal"
3808    )]
3809    pub slb_starting_cash_collateral_sec: Option<Decimal>,
3810
3811    /// `slbStartingCashCollateralCom` (added for full ibflex coverage)
3812    #[serde(
3813        rename = "@slbStartingCashCollateralCom",
3814        default,
3815        deserialize_with = "deserialize_optional_decimal"
3816    )]
3817    pub slb_starting_cash_collateral_com: Option<Decimal>,
3818
3819    /// `slbStartingCashCollateralPaxos` (added for full ibflex coverage)
3820    #[serde(
3821        rename = "@slbStartingCashCollateralPaxos",
3822        default,
3823        deserialize_with = "deserialize_optional_decimal"
3824    )]
3825    pub slb_starting_cash_collateral_paxos: Option<Decimal>,
3826
3827    /// `slbNetSecuritiesLentActivity` (added for full ibflex coverage)
3828    #[serde(
3829        rename = "@slbNetSecuritiesLentActivity",
3830        default,
3831        deserialize_with = "deserialize_optional_decimal"
3832    )]
3833    pub slb_net_securities_lent_activity: Option<Decimal>,
3834
3835    /// `slbNetSecuritiesLentActivityCom` (added for full ibflex coverage)
3836    #[serde(
3837        rename = "@slbNetSecuritiesLentActivityCom",
3838        default,
3839        deserialize_with = "deserialize_optional_decimal"
3840    )]
3841    pub slb_net_securities_lent_activity_com: Option<Decimal>,
3842
3843    /// `slbNetSecuritiesLentActivitySec` (added for full ibflex coverage)
3844    #[serde(
3845        rename = "@slbNetSecuritiesLentActivitySec",
3846        default,
3847        deserialize_with = "deserialize_optional_decimal"
3848    )]
3849    pub slb_net_securities_lent_activity_sec: Option<Decimal>,
3850
3851    /// `slbNetSecuritiesLentActivityPaxos` (added for full ibflex coverage)
3852    #[serde(
3853        rename = "@slbNetSecuritiesLentActivityPaxos",
3854        default,
3855        deserialize_with = "deserialize_optional_decimal"
3856    )]
3857    pub slb_net_securities_lent_activity_paxos: Option<Decimal>,
3858
3859    /// `slbEndingCashCollateral` (added for full ibflex coverage)
3860    #[serde(
3861        rename = "@slbEndingCashCollateral",
3862        default,
3863        deserialize_with = "deserialize_optional_decimal"
3864    )]
3865    pub slb_ending_cash_collateral: Option<Decimal>,
3866
3867    /// `slbEndingCashCollateralSec` (added for full ibflex coverage)
3868    #[serde(
3869        rename = "@slbEndingCashCollateralSec",
3870        default,
3871        deserialize_with = "deserialize_optional_decimal"
3872    )]
3873    pub slb_ending_cash_collateral_sec: Option<Decimal>,
3874
3875    /// `slbEndingCashCollateralCom` (added for full ibflex coverage)
3876    #[serde(
3877        rename = "@slbEndingCashCollateralCom",
3878        default,
3879        deserialize_with = "deserialize_optional_decimal"
3880    )]
3881    pub slb_ending_cash_collateral_com: Option<Decimal>,
3882
3883    /// `slbEndingCashCollateralPaxos` (added for full ibflex coverage)
3884    #[serde(
3885        rename = "@slbEndingCashCollateralPaxos",
3886        default,
3887        deserialize_with = "deserialize_optional_decimal"
3888    )]
3889    pub slb_ending_cash_collateral_paxos: Option<Decimal>,
3890
3891    /// `slbNetCash` (added for full ibflex coverage)
3892    #[serde(
3893        rename = "@slbNetCash",
3894        default,
3895        deserialize_with = "deserialize_optional_decimal"
3896    )]
3897    pub slb_net_cash: Option<Decimal>,
3898
3899    /// `slbNetCashSec` (added for full ibflex coverage)
3900    #[serde(
3901        rename = "@slbNetCashSec",
3902        default,
3903        deserialize_with = "deserialize_optional_decimal"
3904    )]
3905    pub slb_net_cash_sec: Option<Decimal>,
3906
3907    /// `slbNetCashCom` (added for full ibflex coverage)
3908    #[serde(
3909        rename = "@slbNetCashCom",
3910        default,
3911        deserialize_with = "deserialize_optional_decimal"
3912    )]
3913    pub slb_net_cash_com: Option<Decimal>,
3914
3915    /// `slbNetCashPaxos` (added for full ibflex coverage)
3916    #[serde(
3917        rename = "@slbNetCashPaxos",
3918        default,
3919        deserialize_with = "deserialize_optional_decimal"
3920    )]
3921    pub slb_net_cash_paxos: Option<Decimal>,
3922
3923    /// `slbNetSettledCash` (added for full ibflex coverage)
3924    #[serde(
3925        rename = "@slbNetSettledCash",
3926        default,
3927        deserialize_with = "deserialize_optional_decimal"
3928    )]
3929    pub slb_net_settled_cash: Option<Decimal>,
3930
3931    /// `slbNetSettledCashSec` (added for full ibflex coverage)
3932    #[serde(
3933        rename = "@slbNetSettledCashSec",
3934        default,
3935        deserialize_with = "deserialize_optional_decimal"
3936    )]
3937    pub slb_net_settled_cash_sec: Option<Decimal>,
3938
3939    /// `slbNetSettledCashCom` (added for full ibflex coverage)
3940    #[serde(
3941        rename = "@slbNetSettledCashCom",
3942        default,
3943        deserialize_with = "deserialize_optional_decimal"
3944    )]
3945    pub slb_net_settled_cash_com: Option<Decimal>,
3946
3947    /// `slbNetSettledCashPaxos` (added for full ibflex coverage)
3948    #[serde(
3949        rename = "@slbNetSettledCashPaxos",
3950        default,
3951        deserialize_with = "deserialize_optional_decimal"
3952    )]
3953    pub slb_net_settled_cash_paxos: Option<Decimal>,
3954}
3955
3956/// Trade confirmation
3957#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
3958pub struct TradeConfirm {
3959    /// Account ID
3960    #[serde(
3961        rename = "@accountId",
3962        default,
3963        deserialize_with = "deserialize_optional_string"
3964    )]
3965    pub account_id: Option<String>,
3966
3967    /// Account alias
3968    #[serde(rename = "@acctAlias", default)]
3969    pub acct_alias: Option<String>,
3970
3971    /// Model
3972    #[serde(rename = "@model", default)]
3973    pub model: Option<String>,
3974
3975    /// Execution ID
3976    #[serde(
3977        rename = "@execID",
3978        default,
3979        deserialize_with = "deserialize_optional_string"
3980    )]
3981    pub exec_id: Option<String>,
3982
3983    /// Transaction ID
3984    #[serde(rename = "@transactionID", default)]
3985    pub transaction_id: Option<String>,
3986
3987    /// Trade ID
3988    #[serde(rename = "@tradeID", default)]
3989    pub trade_id: Option<String>,
3990
3991    /// Order ID
3992    #[serde(rename = "@orderID", default)]
3993    pub order_id: Option<String>,
3994
3995    /// Trade date
3996    #[serde(
3997        rename = "@tradeDate",
3998        default,
3999        deserialize_with = "deserialize_optional_date"
4000    )]
4001    pub trade_date: Option<NaiveDate>,
4002
4003    /// Trade time
4004    #[serde(rename = "@tradeTime", default)]
4005    pub trade_time: Option<String>,
4006
4007    /// Date time
4008    #[serde(rename = "@dateTime", default)]
4009    pub date_time: Option<String>,
4010
4011    /// Settlement date
4012    #[serde(
4013        rename = "@settleDate",
4014        default,
4015        deserialize_with = "deserialize_optional_date"
4016    )]
4017    pub settle_date: Option<NaiveDate>,
4018
4019    /// Symbol
4020    #[serde(
4021        rename = "@symbol",
4022        default,
4023        deserialize_with = "deserialize_optional_string"
4024    )]
4025    pub symbol: Option<String>,
4026
4027    /// Description
4028    #[serde(rename = "@description", default)]
4029    pub description: Option<String>,
4030
4031    /// Contract ID
4032    #[serde(rename = "@conid", default)]
4033    pub conid: Option<String>,
4034
4035    /// Asset category
4036    #[serde(rename = "@assetCategory", default)]
4037    pub asset_category: Option<AssetCategory>,
4038
4039    // Security identifiers
4040    /// CUSIP
4041    #[serde(rename = "@cusip", default)]
4042    pub cusip: Option<String>,
4043
4044    /// ISIN
4045    #[serde(rename = "@isin", default)]
4046    pub isin: Option<String>,
4047
4048    /// FIGI
4049    #[serde(rename = "@figi", default)]
4050    pub figi: Option<String>,
4051
4052    /// Listing exchange
4053    #[serde(rename = "@listingExchange", default)]
4054    pub listing_exchange: Option<String>,
4055
4056    // Options fields
4057    /// Strike
4058    #[serde(
4059        rename = "@strike",
4060        default,
4061        deserialize_with = "deserialize_optional_decimal"
4062    )]
4063    pub strike: Option<Decimal>,
4064
4065    /// Expiry
4066    #[serde(
4067        rename = "@expiry",
4068        default,
4069        deserialize_with = "deserialize_optional_date"
4070    )]
4071    pub expiry: Option<NaiveDate>,
4072
4073    /// Put/Call
4074    #[serde(rename = "@putCall", default)]
4075    pub put_call: Option<String>,
4076
4077    /// Multiplier
4078    #[serde(
4079        rename = "@multiplier",
4080        default,
4081        deserialize_with = "deserialize_optional_decimal"
4082    )]
4083    pub multiplier: Option<Decimal>,
4084
4085    // Underlying
4086    /// Underlying symbol
4087    #[serde(rename = "@underlyingSymbol", default)]
4088    pub underlying_symbol: Option<String>,
4089
4090    /// Underlying contract ID
4091    #[serde(rename = "@underlyingConid", default)]
4092    pub underlying_conid: Option<String>,
4093
4094    // Trade details
4095    /// Quantity
4096    #[serde(
4097        rename = "@quantity",
4098        default,
4099        deserialize_with = "deserialize_optional_decimal"
4100    )]
4101    pub quantity: Option<Decimal>,
4102
4103    /// Price
4104    #[serde(
4105        rename = "@price",
4106        default,
4107        deserialize_with = "deserialize_optional_decimal"
4108    )]
4109    pub price: Option<Decimal>,
4110
4111    /// Proceeds
4112    #[serde(
4113        rename = "@proceeds",
4114        default,
4115        deserialize_with = "deserialize_optional_decimal"
4116    )]
4117    pub proceeds: Option<Decimal>,
4118
4119    /// Commission
4120    #[serde(
4121        rename = "@commission",
4122        default,
4123        deserialize_with = "deserialize_optional_decimal"
4124    )]
4125    pub commission: Option<Decimal>,
4126
4127    /// Taxes
4128    #[serde(
4129        rename = "@tax",
4130        default,
4131        deserialize_with = "deserialize_optional_decimal"
4132    )]
4133    pub tax: Option<Decimal>,
4134
4135    /// Net cash
4136    #[serde(
4137        rename = "@netCash",
4138        default,
4139        deserialize_with = "deserialize_optional_decimal"
4140    )]
4141    pub net_cash: Option<Decimal>,
4142
4143    /// Currency
4144    #[serde(rename = "@currency", default)]
4145    pub currency: Option<String>,
4146
4147    /// FX rate to base
4148    #[serde(
4149        rename = "@fxRateToBase",
4150        default,
4151        deserialize_with = "deserialize_optional_decimal"
4152    )]
4153    pub fx_rate_to_base: Option<Decimal>,
4154
4155    /// Buy/Sell
4156    #[serde(rename = "@buySell", default)]
4157    pub buy_sell: Option<String>,
4158
4159    /// Order type
4160    #[serde(rename = "@orderType", default)]
4161    pub order_type: Option<String>,
4162
4163    /// Exchange
4164    #[serde(rename = "@exchange", default)]
4165    pub exchange: Option<String>,
4166
4167    /// Clearing ID
4168    #[serde(rename = "@clearingID", default)]
4169    pub clearing_id: Option<String>,
4170
4171    /// Away broker commission
4172    #[serde(
4173        rename = "@awayBrokerCommission",
4174        default,
4175        deserialize_with = "deserialize_optional_decimal"
4176    )]
4177    pub away_broker_commission: Option<Decimal>,
4178
4179    /// Regulatory fee
4180    #[serde(
4181        rename = "@regulatoryFee",
4182        default,
4183        deserialize_with = "deserialize_optional_decimal"
4184    )]
4185    pub regulatory_fee: Option<Decimal>,
4186
4187    /// Order reference
4188    #[serde(rename = "@orderReference", default)]
4189    pub order_reference: Option<String>,
4190
4191    /// Level of detail
4192    #[serde(rename = "@levelOfDetail", default)]
4193    pub level_of_detail: Option<String>,
4194
4195    /// `transactionType` (added for full ibflex coverage)
4196    #[serde(rename = "@transactionType", default)]
4197    pub transaction_type: Option<TradeType>,
4198
4199    /// `openCloseIndicator` (added for full ibflex coverage)
4200    #[serde(rename = "@openCloseIndicator", default)]
4201    pub open_close_indicator: Option<OpenClose>,
4202
4203    /// `securityID` (added for full ibflex coverage)
4204    #[serde(
4205        rename = "@securityID",
4206        default,
4207        deserialize_with = "deserialize_optional_string"
4208    )]
4209    pub security_id: Option<String>,
4210
4211    /// `rfqID` (added for full ibflex coverage)
4212    #[serde(
4213        rename = "@rfqID",
4214        default,
4215        deserialize_with = "deserialize_optional_string"
4216    )]
4217    pub rfq_id: Option<String>,
4218
4219    /// `securityIDType` (added for full ibflex coverage)
4220    #[serde(
4221        rename = "@securityIDType",
4222        default,
4223        deserialize_with = "deserialize_optional_string"
4224    )]
4225    pub security_id_type: Option<String>,
4226
4227    /// `issuer` (added for full ibflex coverage)
4228    #[serde(
4229        rename = "@issuer",
4230        default,
4231        deserialize_with = "deserialize_optional_string"
4232    )]
4233    pub issuer: Option<String>,
4234
4235    /// `principalAdjustFactor` (added for full ibflex coverage)
4236    #[serde(
4237        rename = "@principalAdjustFactor",
4238        default,
4239        deserialize_with = "deserialize_optional_decimal"
4240    )]
4241    pub principal_adjust_factor: Option<Decimal>,
4242
4243    /// `reportDate` (added for full ibflex coverage)
4244    #[serde(
4245        rename = "@reportDate",
4246        default,
4247        deserialize_with = "deserialize_optional_date"
4248    )]
4249    pub report_date: Option<NaiveDate>,
4250
4251    /// `settleDateTarget` (added for full ibflex coverage)
4252    #[serde(
4253        rename = "@settleDateTarget",
4254        default,
4255        deserialize_with = "deserialize_optional_date"
4256    )]
4257    pub settle_date_target: Option<NaiveDate>,
4258
4259    /// `tradePrice` (added for full ibflex coverage)
4260    #[serde(
4261        rename = "@tradePrice",
4262        default,
4263        deserialize_with = "deserialize_optional_decimal"
4264    )]
4265    pub trade_price: Option<Decimal>,
4266
4267    /// `tradeMoney` (added for full ibflex coverage)
4268    #[serde(
4269        rename = "@tradeMoney",
4270        default,
4271        deserialize_with = "deserialize_optional_decimal"
4272    )]
4273    pub trade_money: Option<Decimal>,
4274
4275    /// `taxes` (added for full ibflex coverage)
4276    #[serde(
4277        rename = "@taxes",
4278        default,
4279        deserialize_with = "deserialize_optional_decimal"
4280    )]
4281    pub taxes: Option<Decimal>,
4282
4283    /// `ibCommission` (added for full ibflex coverage)
4284    #[serde(
4285        rename = "@ibCommission",
4286        default,
4287        deserialize_with = "deserialize_optional_decimal"
4288    )]
4289    pub ib_commission: Option<Decimal>,
4290
4291    /// `ibCommissionCurrency` (added for full ibflex coverage)
4292    #[serde(
4293        rename = "@ibCommissionCurrency",
4294        default,
4295        deserialize_with = "deserialize_optional_string"
4296    )]
4297    pub ib_commission_currency: Option<String>,
4298
4299    /// `closePrice` (added for full ibflex coverage)
4300    #[serde(
4301        rename = "@closePrice",
4302        default,
4303        deserialize_with = "deserialize_optional_decimal"
4304    )]
4305    pub close_price: Option<Decimal>,
4306
4307    /// `notes` (added for full ibflex coverage)
4308    #[serde(
4309        rename = "@notes",
4310        default,
4311        deserialize_with = "deserialize_optional_string"
4312    )]
4313    pub notes: Option<String>,
4314
4315    /// `cost` (added for full ibflex coverage)
4316    #[serde(
4317        rename = "@cost",
4318        default,
4319        deserialize_with = "deserialize_optional_decimal"
4320    )]
4321    pub cost: Option<Decimal>,
4322
4323    /// `fifoPnlRealized` (added for full ibflex coverage)
4324    #[serde(
4325        rename = "@fifoPnlRealized",
4326        default,
4327        deserialize_with = "deserialize_optional_decimal"
4328    )]
4329    pub fifo_pnl_realized: Option<Decimal>,
4330
4331    /// `fxPnl` (added for full ibflex coverage)
4332    #[serde(
4333        rename = "@fxPnl",
4334        default,
4335        deserialize_with = "deserialize_optional_decimal"
4336    )]
4337    pub fx_pnl: Option<Decimal>,
4338
4339    /// `mtmPnl` (added for full ibflex coverage)
4340    #[serde(
4341        rename = "@mtmPnl",
4342        default,
4343        deserialize_with = "deserialize_optional_decimal"
4344    )]
4345    pub mtm_pnl: Option<Decimal>,
4346
4347    /// `origTradePrice` (added for full ibflex coverage)
4348    #[serde(
4349        rename = "@origTradePrice",
4350        default,
4351        deserialize_with = "deserialize_optional_decimal"
4352    )]
4353    pub orig_trade_price: Option<Decimal>,
4354
4355    /// `origTradeDate` (added for full ibflex coverage)
4356    #[serde(
4357        rename = "@origTradeDate",
4358        default,
4359        deserialize_with = "deserialize_optional_date"
4360    )]
4361    pub orig_trade_date: Option<NaiveDate>,
4362
4363    /// `origTradeID` (added for full ibflex coverage)
4364    #[serde(
4365        rename = "@origTradeID",
4366        default,
4367        deserialize_with = "deserialize_optional_string"
4368    )]
4369    pub orig_trade_id: Option<String>,
4370
4371    /// `origOrderID` (added for full ibflex coverage)
4372    #[serde(
4373        rename = "@origOrderID",
4374        default,
4375        deserialize_with = "deserialize_optional_string"
4376    )]
4377    pub orig_order_id: Option<String>,
4378
4379    /// `clearingFirmID` (added for full ibflex coverage)
4380    #[serde(
4381        rename = "@clearingFirmID",
4382        default,
4383        deserialize_with = "deserialize_optional_string"
4384    )]
4385    pub clearing_firm_id: Option<String>,
4386
4387    /// `openDateTime` (added for full ibflex coverage)
4388    #[serde(
4389        rename = "@openDateTime",
4390        default,
4391        deserialize_with = "deserialize_optional_string"
4392    )]
4393    pub open_date_time: Option<String>,
4394
4395    /// `holdingPeriodDateTime` (added for full ibflex coverage)
4396    #[serde(
4397        rename = "@holdingPeriodDateTime",
4398        default,
4399        deserialize_with = "deserialize_optional_string"
4400    )]
4401    pub holding_period_date_time: Option<String>,
4402
4403    /// `whenRealized` (added for full ibflex coverage)
4404    #[serde(
4405        rename = "@whenRealized",
4406        default,
4407        deserialize_with = "deserialize_optional_string"
4408    )]
4409    pub when_realized: Option<String>,
4410
4411    /// `whenReopened` (added for full ibflex coverage)
4412    #[serde(
4413        rename = "@whenReopened",
4414        default,
4415        deserialize_with = "deserialize_optional_string"
4416    )]
4417    pub when_reopened: Option<String>,
4418
4419    /// `commissionCurrency` (added for full ibflex coverage)
4420    #[serde(
4421        rename = "@commissionCurrency",
4422        default,
4423        deserialize_with = "deserialize_optional_string"
4424    )]
4425    pub commission_currency: Option<String>,
4426
4427    /// `thirdPartyClearingCommission` (added for full ibflex coverage)
4428    #[serde(
4429        rename = "@thirdPartyClearingCommission",
4430        default,
4431        deserialize_with = "deserialize_optional_decimal"
4432    )]
4433    pub third_party_clearing_commission: Option<Decimal>,
4434
4435    /// `allocatedTo` (added for full ibflex coverage)
4436    #[serde(
4437        rename = "@allocatedTo",
4438        default,
4439        deserialize_with = "deserialize_optional_string"
4440    )]
4441    pub allocated_to: Option<String>,
4442
4443    /// `thirdPartyRegulatoryCommission` (added for full ibflex coverage)
4444    #[serde(
4445        rename = "@thirdPartyRegulatoryCommission",
4446        default,
4447        deserialize_with = "deserialize_optional_decimal"
4448    )]
4449    pub third_party_regulatory_commission: Option<Decimal>,
4450
4451    /// `brokerExecutionCommission` (added for full ibflex coverage)
4452    #[serde(
4453        rename = "@brokerExecutionCommission",
4454        default,
4455        deserialize_with = "deserialize_optional_decimal"
4456    )]
4457    pub broker_execution_commission: Option<Decimal>,
4458
4459    /// `thirdPartyExecutionCommission` (added for full ibflex coverage)
4460    #[serde(
4461        rename = "@thirdPartyExecutionCommission",
4462        default,
4463        deserialize_with = "deserialize_optional_decimal"
4464    )]
4465    pub third_party_execution_commission: Option<Decimal>,
4466
4467    /// `amount` (added for full ibflex coverage)
4468    #[serde(
4469        rename = "@amount",
4470        default,
4471        deserialize_with = "deserialize_optional_decimal"
4472    )]
4473    pub amount: Option<Decimal>,
4474
4475    /// `otherCommission` (added for full ibflex coverage)
4476    #[serde(
4477        rename = "@otherCommission",
4478        default,
4479        deserialize_with = "deserialize_optional_decimal"
4480    )]
4481    pub other_commission: Option<Decimal>,
4482
4483    /// `brokerClearingCommission` (added for full ibflex coverage)
4484    #[serde(
4485        rename = "@brokerClearingCommission",
4486        default,
4487        deserialize_with = "deserialize_optional_decimal"
4488    )]
4489    pub broker_clearing_commission: Option<Decimal>,
4490
4491    /// `ibOrderID` (added for full ibflex coverage)
4492    #[serde(
4493        rename = "@ibOrderID",
4494        default,
4495        deserialize_with = "deserialize_optional_string"
4496    )]
4497    pub ib_order_id: Option<String>,
4498
4499    /// `ibExecID` (added for full ibflex coverage)
4500    #[serde(
4501        rename = "@ibExecID",
4502        default,
4503        deserialize_with = "deserialize_optional_string"
4504    )]
4505    pub ib_exec_id: Option<String>,
4506
4507    /// `brokerageOrderID` (added for full ibflex coverage)
4508    #[serde(
4509        rename = "@brokerageOrderID",
4510        default,
4511        deserialize_with = "deserialize_optional_string"
4512    )]
4513    pub brokerage_order_id: Option<String>,
4514
4515    /// `volatilityOrderLink` (added for full ibflex coverage)
4516    #[serde(
4517        rename = "@volatilityOrderLink",
4518        default,
4519        deserialize_with = "deserialize_optional_string"
4520    )]
4521    pub volatility_order_link: Option<String>,
4522
4523    /// `exchOrderId` (added for full ibflex coverage)
4524    #[serde(
4525        rename = "@exchOrderId",
4526        default,
4527        deserialize_with = "deserialize_optional_string"
4528    )]
4529    pub exch_order_id: Option<String>,
4530
4531    /// `extExecID` (added for full ibflex coverage)
4532    #[serde(
4533        rename = "@extExecID",
4534        default,
4535        deserialize_with = "deserialize_optional_string"
4536    )]
4537    pub ext_exec_id: Option<String>,
4538
4539    /// `orderTime` (added for full ibflex coverage)
4540    #[serde(
4541        rename = "@orderTime",
4542        default,
4543        deserialize_with = "deserialize_optional_string"
4544    )]
4545    pub order_time: Option<String>,
4546
4547    /// `changeInPrice` (added for full ibflex coverage)
4548    #[serde(
4549        rename = "@changeInPrice",
4550        default,
4551        deserialize_with = "deserialize_optional_decimal"
4552    )]
4553    pub change_in_price: Option<Decimal>,
4554
4555    /// `changeInQuantity` (added for full ibflex coverage)
4556    #[serde(
4557        rename = "@changeInQuantity",
4558        default,
4559        deserialize_with = "deserialize_optional_decimal"
4560    )]
4561    pub change_in_quantity: Option<Decimal>,
4562
4563    /// `traderID` (added for full ibflex coverage)
4564    #[serde(
4565        rename = "@traderID",
4566        default,
4567        deserialize_with = "deserialize_optional_string"
4568    )]
4569    pub trader_id: Option<String>,
4570
4571    /// `isAPIOrder` (added for full ibflex coverage)
4572    #[serde(
4573        rename = "@isAPIOrder",
4574        default,
4575        deserialize_with = "deserialize_optional_bool"
4576    )]
4577    pub is_api_order: Option<bool>,
4578
4579    /// `code` (added for full ibflex coverage)
4580    #[serde(
4581        rename = "@code",
4582        default,
4583        deserialize_with = "deserialize_optional_string"
4584    )]
4585    pub code: Option<String>,
4586
4587    /// `underlyingListingExchange` (added for full ibflex coverage)
4588    #[serde(
4589        rename = "@underlyingListingExchange",
4590        default,
4591        deserialize_with = "deserialize_optional_string"
4592    )]
4593    pub underlying_listing_exchange: Option<String>,
4594
4595    /// `underlyingSecurityID` (added for full ibflex coverage)
4596    #[serde(
4597        rename = "@underlyingSecurityID",
4598        default,
4599        deserialize_with = "deserialize_optional_string"
4600    )]
4601    pub underlying_security_id: Option<String>,
4602
4603    /// `accruedInt` (added for full ibflex coverage)
4604    #[serde(
4605        rename = "@accruedInt",
4606        default,
4607        deserialize_with = "deserialize_optional_decimal"
4608    )]
4609    pub accrued_int: Option<Decimal>,
4610
4611    /// `relatedTradeID` (added for full ibflex coverage)
4612    #[serde(
4613        rename = "@relatedTradeID",
4614        default,
4615        deserialize_with = "deserialize_optional_string"
4616    )]
4617    pub related_trade_id: Option<String>,
4618
4619    /// `relatedTransactionID` (added for full ibflex coverage)
4620    #[serde(
4621        rename = "@relatedTransactionID",
4622        default,
4623        deserialize_with = "deserialize_optional_string"
4624    )]
4625    pub related_transaction_id: Option<String>,
4626
4627    /// `blockID` (added for full ibflex coverage)
4628    #[serde(
4629        rename = "@blockID",
4630        default,
4631        deserialize_with = "deserialize_optional_string"
4632    )]
4633    pub block_id: Option<String>,
4634}
4635
4636/// Option exercise/assignment/expiration
4637#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
4638pub struct OptionEAE {
4639    /// Account ID
4640    #[serde(
4641        rename = "@accountId",
4642        default,
4643        deserialize_with = "deserialize_optional_string"
4644    )]
4645    pub account_id: Option<String>,
4646
4647    /// Account alias
4648    #[serde(rename = "@acctAlias", default)]
4649    pub acct_alias: Option<String>,
4650
4651    /// Model
4652    #[serde(rename = "@model", default)]
4653    pub model: Option<String>,
4654
4655    /// Transaction ID
4656    #[serde(rename = "@transactionID", default)]
4657    pub transaction_id: Option<String>,
4658
4659    /// Action ID
4660    #[serde(rename = "@actionID", default)]
4661    pub action_id: Option<String>,
4662
4663    /// Action type
4664    #[serde(rename = "@type", default)]
4665    pub action_type: Option<OptionAction>,
4666
4667    /// Date
4668    #[serde(
4669        rename = "@date",
4670        default,
4671        deserialize_with = "deserialize_optional_date"
4672    )]
4673    pub date: Option<NaiveDate>,
4674
4675    /// Date time
4676    #[serde(rename = "@dateTime", default)]
4677    pub date_time: Option<String>,
4678
4679    /// Contract ID
4680    #[serde(rename = "@conid", default)]
4681    pub conid: Option<String>,
4682
4683    /// Symbol
4684    #[serde(
4685        rename = "@symbol",
4686        default,
4687        deserialize_with = "deserialize_optional_string"
4688    )]
4689    pub symbol: Option<String>,
4690
4691    /// Description
4692    #[serde(rename = "@description", default)]
4693    pub description: Option<String>,
4694
4695    /// Asset category
4696    #[serde(rename = "@assetCategory", default)]
4697    pub asset_category: Option<AssetCategory>,
4698
4699    // Security identifiers
4700    /// CUSIP
4701    #[serde(rename = "@cusip", default)]
4702    pub cusip: Option<String>,
4703
4704    /// ISIN
4705    #[serde(rename = "@isin", default)]
4706    pub isin: Option<String>,
4707
4708    /// FIGI
4709    #[serde(rename = "@figi", default)]
4710    pub figi: Option<String>,
4711
4712    /// Listing exchange
4713    #[serde(rename = "@listingExchange", default)]
4714    pub listing_exchange: Option<String>,
4715
4716    /// Quantity
4717    #[serde(
4718        rename = "@quantity",
4719        default,
4720        deserialize_with = "deserialize_optional_decimal"
4721    )]
4722    pub quantity: Option<Decimal>,
4723
4724    /// Strike
4725    #[serde(
4726        rename = "@strike",
4727        default,
4728        deserialize_with = "deserialize_optional_decimal"
4729    )]
4730    pub strike: Option<Decimal>,
4731
4732    /// Expiry
4733    #[serde(
4734        rename = "@expiry",
4735        default,
4736        deserialize_with = "deserialize_optional_date"
4737    )]
4738    pub expiry: Option<NaiveDate>,
4739
4740    /// Put/Call
4741    #[serde(rename = "@putCall", default)]
4742    pub put_call: Option<String>,
4743
4744    /// Multiplier
4745    #[serde(
4746        rename = "@multiplier",
4747        default,
4748        deserialize_with = "deserialize_optional_decimal"
4749    )]
4750    pub multiplier: Option<Decimal>,
4751
4752    /// Underlying symbol
4753    #[serde(rename = "@underlyingSymbol", default)]
4754    pub underlying_symbol: Option<String>,
4755
4756    /// Underlying contract ID
4757    #[serde(rename = "@underlyingConid", default)]
4758    pub underlying_conid: Option<String>,
4759
4760    /// Trade price
4761    #[serde(
4762        rename = "@tradePrice",
4763        default,
4764        deserialize_with = "deserialize_optional_decimal"
4765    )]
4766    pub trade_price: Option<Decimal>,
4767
4768    /// Proceeds
4769    #[serde(
4770        rename = "@proceeds",
4771        default,
4772        deserialize_with = "deserialize_optional_decimal"
4773    )]
4774    pub proceeds: Option<Decimal>,
4775
4776    /// Commission
4777    #[serde(
4778        rename = "@commission",
4779        default,
4780        deserialize_with = "deserialize_optional_decimal"
4781    )]
4782    pub commission: Option<Decimal>,
4783
4784    /// Currency
4785    #[serde(rename = "@currency", default)]
4786    pub currency: Option<String>,
4787
4788    /// FX rate to base
4789    #[serde(
4790        rename = "@fxRateToBase",
4791        default,
4792        deserialize_with = "deserialize_optional_decimal"
4793    )]
4794    pub fx_rate_to_base: Option<Decimal>,
4795
4796    /// FIFO P&L realized
4797    #[serde(
4798        rename = "@fifoPnlRealized",
4799        default,
4800        deserialize_with = "deserialize_optional_decimal"
4801    )]
4802    pub fifo_pnl_realized: Option<Decimal>,
4803
4804    /// Notes/codes
4805    #[serde(rename = "@notes", default)]
4806    pub notes: Option<String>,
4807
4808    /// Level of detail
4809    #[serde(rename = "@levelOfDetail", default)]
4810    pub level_of_detail: Option<String>,
4811
4812    /// `transactionType` (added for full ibflex coverage)
4813    #[serde(rename = "@transactionType", default)]
4814    pub transaction_type: Option<OptionAction>,
4815
4816    /// `securityID` (added for full ibflex coverage)
4817    #[serde(
4818        rename = "@securityID",
4819        default,
4820        deserialize_with = "deserialize_optional_string"
4821    )]
4822    pub security_id: Option<String>,
4823
4824    /// `securityIDType` (added for full ibflex coverage)
4825    #[serde(
4826        rename = "@securityIDType",
4827        default,
4828        deserialize_with = "deserialize_optional_string"
4829    )]
4830    pub security_id_type: Option<String>,
4831
4832    /// `underlyingSecurityID` (added for full ibflex coverage)
4833    #[serde(
4834        rename = "@underlyingSecurityID",
4835        default,
4836        deserialize_with = "deserialize_optional_string"
4837    )]
4838    pub underlying_security_id: Option<String>,
4839
4840    /// `underlyingListingExchange` (added for full ibflex coverage)
4841    #[serde(
4842        rename = "@underlyingListingExchange",
4843        default,
4844        deserialize_with = "deserialize_optional_string"
4845    )]
4846    pub underlying_listing_exchange: Option<String>,
4847
4848    /// `issuer` (added for full ibflex coverage)
4849    #[serde(
4850        rename = "@issuer",
4851        default,
4852        deserialize_with = "deserialize_optional_string"
4853    )]
4854    pub issuer: Option<String>,
4855
4856    /// `principalAdjustFactor` (added for full ibflex coverage)
4857    #[serde(
4858        rename = "@principalAdjustFactor",
4859        default,
4860        deserialize_with = "deserialize_optional_decimal"
4861    )]
4862    pub principal_adjust_factor: Option<Decimal>,
4863
4864    /// `markPrice` (added for full ibflex coverage)
4865    #[serde(
4866        rename = "@markPrice",
4867        default,
4868        deserialize_with = "deserialize_optional_decimal"
4869    )]
4870    pub mark_price: Option<Decimal>,
4871
4872    /// `commisionsAndTax` (added for full ibflex coverage)
4873    #[serde(
4874        rename = "@commisionsAndTax",
4875        default,
4876        deserialize_with = "deserialize_optional_decimal"
4877    )]
4878    pub commisions_and_tax: Option<Decimal>,
4879
4880    /// `costBasis` (added for full ibflex coverage)
4881    #[serde(
4882        rename = "@costBasis",
4883        default,
4884        deserialize_with = "deserialize_optional_decimal"
4885    )]
4886    pub cost_basis: Option<Decimal>,
4887
4888    /// `realizedPnl` (added for full ibflex coverage)
4889    #[serde(
4890        rename = "@realizedPnl",
4891        default,
4892        deserialize_with = "deserialize_optional_decimal"
4893    )]
4894    pub realized_pnl: Option<Decimal>,
4895
4896    /// `capitalGainsPnl` (added for full ibflex coverage)
4897    #[serde(
4898        rename = "@capitalGainsPnl",
4899        default,
4900        deserialize_with = "deserialize_optional_decimal"
4901    )]
4902    pub capital_gains_pnl: Option<Decimal>,
4903
4904    /// `fxPnl` (added for full ibflex coverage)
4905    #[serde(
4906        rename = "@fxPnl",
4907        default,
4908        deserialize_with = "deserialize_optional_decimal"
4909    )]
4910    pub fx_pnl: Option<Decimal>,
4911
4912    /// `mtmPnl` (added for full ibflex coverage)
4913    #[serde(
4914        rename = "@mtmPnl",
4915        default,
4916        deserialize_with = "deserialize_optional_decimal"
4917    )]
4918    pub mtm_pnl: Option<Decimal>,
4919
4920    /// `tradeID` (added for full ibflex coverage)
4921    #[serde(
4922        rename = "@tradeID",
4923        default,
4924        deserialize_with = "deserialize_optional_string"
4925    )]
4926    pub trade_id: Option<String>,
4927
4928    /// `relatedTradeID` (added for full ibflex coverage)
4929    #[serde(
4930        rename = "@relatedTradeID",
4931        default,
4932        deserialize_with = "deserialize_optional_string"
4933    )]
4934    pub related_trade_id: Option<String>,
4935
4936    /// `subCategory` (added for full ibflex coverage)
4937    #[serde(
4938        rename = "@subCategory",
4939        default,
4940        deserialize_with = "deserialize_optional_string"
4941    )]
4942    pub sub_category: Option<String>,
4943
4944    /// `issuerCountryCode` (added for full ibflex coverage)
4945    #[serde(
4946        rename = "@issuerCountryCode",
4947        default,
4948        deserialize_with = "deserialize_optional_string"
4949    )]
4950    pub issuer_country_code: Option<String>,
4951
4952    /// `origTransactionID` (added for full ibflex coverage)
4953    #[serde(
4954        rename = "@origTransactionID",
4955        default,
4956        deserialize_with = "deserialize_optional_string"
4957    )]
4958    pub orig_transaction_id: Option<String>,
4959
4960    /// `relatedTransactionID` (added for full ibflex coverage)
4961    #[serde(
4962        rename = "@relatedTransactionID",
4963        default,
4964        deserialize_with = "deserialize_optional_string"
4965    )]
4966    pub related_transaction_id: Option<String>,
4967
4968    /// `rtn` (added for full ibflex coverage)
4969    #[serde(
4970        rename = "@rtn",
4971        default,
4972        deserialize_with = "deserialize_optional_string"
4973    )]
4974    pub rtn: Option<String>,
4975
4976    /// `initialInvestment` (added for full ibflex coverage)
4977    #[serde(
4978        rename = "@initialInvestment",
4979        default,
4980        deserialize_with = "deserialize_optional_bool"
4981    )]
4982    pub initial_investment: Option<bool>,
4983
4984    /// `serialNumber` (added for full ibflex coverage)
4985    #[serde(
4986        rename = "@serialNumber",
4987        default,
4988        deserialize_with = "deserialize_optional_string"
4989    )]
4990    pub serial_number: Option<String>,
4991
4992    /// `deliveryType` (added for full ibflex coverage)
4993    #[serde(
4994        rename = "@deliveryType",
4995        default,
4996        deserialize_with = "deserialize_optional_string"
4997    )]
4998    pub delivery_type: Option<String>,
4999
5000    /// `commodityType` (added for full ibflex coverage)
5001    #[serde(
5002        rename = "@commodityType",
5003        default,
5004        deserialize_with = "deserialize_optional_string"
5005    )]
5006    pub commodity_type: Option<String>,
5007
5008    /// `fineness` (added for full ibflex coverage)
5009    #[serde(
5010        rename = "@fineness",
5011        default,
5012        deserialize_with = "deserialize_optional_decimal"
5013    )]
5014    pub fineness: Option<Decimal>,
5015
5016    /// `weight` (added for full ibflex coverage)
5017    #[serde(
5018        rename = "@weight",
5019        default,
5020        deserialize_with = "deserialize_optional_string"
5021    )]
5022    pub weight: Option<String>,
5023}
5024
5025/// Foreign exchange transaction
5026#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
5027pub struct FxTransaction {
5028    /// Account ID
5029    #[serde(
5030        rename = "@accountId",
5031        default,
5032        deserialize_with = "deserialize_optional_string"
5033    )]
5034    pub account_id: Option<String>,
5035
5036    /// Account alias
5037    #[serde(rename = "@acctAlias", default)]
5038    pub acct_alias: Option<String>,
5039
5040    /// Model
5041    #[serde(rename = "@model", default)]
5042    pub model: Option<String>,
5043
5044    /// Transaction ID
5045    #[serde(rename = "@transactionID", default)]
5046    pub transaction_id: Option<String>,
5047
5048    /// Action ID
5049    #[serde(rename = "@actionID", default)]
5050    pub action_id: Option<String>,
5051
5052    /// Report date
5053    #[serde(
5054        rename = "@reportDate",
5055        default,
5056        deserialize_with = "deserialize_optional_date"
5057    )]
5058    pub report_date: Option<NaiveDate>,
5059
5060    /// Date/time
5061    #[serde(rename = "@dateTime", default)]
5062    pub date_time: Option<String>,
5063
5064    /// Description
5065    #[serde(rename = "@description", default)]
5066    pub description: Option<String>,
5067
5068    /// Functional currency
5069    #[serde(rename = "@functionalCurrency", default)]
5070    pub functional_currency: Option<String>,
5071
5072    /// From currency
5073    #[serde(
5074        rename = "@fromCurrency",
5075        default,
5076        deserialize_with = "deserialize_optional_string"
5077    )]
5078    pub from_currency: Option<String>,
5079
5080    /// To currency
5081    #[serde(
5082        rename = "@toCurrency",
5083        default,
5084        deserialize_with = "deserialize_optional_string"
5085    )]
5086    pub to_currency: Option<String>,
5087
5088    /// Quantity
5089    #[serde(
5090        rename = "@quantity",
5091        default,
5092        deserialize_with = "deserialize_optional_decimal"
5093    )]
5094    pub quantity: Option<Decimal>,
5095
5096    /// Proceeds
5097    #[serde(
5098        rename = "@proceeds",
5099        default,
5100        deserialize_with = "deserialize_optional_decimal"
5101    )]
5102    pub proceeds: Option<Decimal>,
5103
5104    /// Cost
5105    #[serde(
5106        rename = "@cost",
5107        default,
5108        deserialize_with = "deserialize_optional_decimal"
5109    )]
5110    pub cost: Option<Decimal>,
5111
5112    /// Realized P&L
5113    #[serde(
5114        rename = "@realizedPL",
5115        default,
5116        deserialize_with = "deserialize_optional_decimal"
5117    )]
5118    pub realized_pl: Option<Decimal>,
5119
5120    /// FX rate
5121    #[serde(
5122        rename = "@fxRateToBase",
5123        default,
5124        deserialize_with = "deserialize_optional_decimal"
5125    )]
5126    pub fx_rate_to_base: Option<Decimal>,
5127
5128    /// Level of detail
5129    #[serde(rename = "@levelOfDetail", default)]
5130    pub level_of_detail: Option<String>,
5131
5132    /// Asset category
5133    #[serde(rename = "@assetCategory", default)]
5134    pub asset_category: Option<String>,
5135
5136    /// `fxCurrency` (added for full ibflex coverage)
5137    #[serde(
5138        rename = "@fxCurrency",
5139        default,
5140        deserialize_with = "deserialize_optional_string"
5141    )]
5142    pub fx_currency: Option<String>,
5143
5144    /// `activityDescription` (added for full ibflex coverage)
5145    #[serde(
5146        rename = "@activityDescription",
5147        default,
5148        deserialize_with = "deserialize_optional_string"
5149    )]
5150    pub activity_description: Option<String>,
5151
5152    /// `code` (added for full ibflex coverage)
5153    #[serde(
5154        rename = "@code",
5155        default,
5156        deserialize_with = "deserialize_optional_string"
5157    )]
5158    pub code: Option<String>,
5159}
5160
5161/// Change in dividend accruals
5162#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
5163pub struct ChangeInDividendAccrual {
5164    /// Account ID
5165    #[serde(
5166        rename = "@accountId",
5167        default,
5168        deserialize_with = "deserialize_optional_string"
5169    )]
5170    pub account_id: Option<String>,
5171
5172    /// Account alias
5173    #[serde(rename = "@acctAlias", default)]
5174    pub acct_alias: Option<String>,
5175
5176    /// Model
5177    #[serde(rename = "@model", default)]
5178    pub model: Option<String>,
5179
5180    /// Currency
5181    #[serde(rename = "@currency", default)]
5182    pub currency: Option<String>,
5183
5184    /// FX rate to base
5185    #[serde(
5186        rename = "@fxRateToBase",
5187        default,
5188        deserialize_with = "deserialize_optional_decimal"
5189    )]
5190    pub fx_rate_to_base: Option<Decimal>,
5191
5192    /// Asset category
5193    #[serde(rename = "@assetCategory", default)]
5194    pub asset_category: Option<AssetCategory>,
5195
5196    /// Symbol
5197    #[serde(
5198        rename = "@symbol",
5199        default,
5200        deserialize_with = "deserialize_optional_string"
5201    )]
5202    pub symbol: Option<String>,
5203
5204    /// Description
5205    #[serde(rename = "@description", default)]
5206    pub description: Option<String>,
5207
5208    /// Contract ID
5209    #[serde(rename = "@conid", default)]
5210    pub conid: Option<String>,
5211
5212    /// Security ID
5213    #[serde(rename = "@securityID", default)]
5214    pub security_id: Option<String>,
5215
5216    /// Security ID type
5217    #[serde(rename = "@securityIDType", default)]
5218    pub security_id_type: Option<String>,
5219
5220    /// CUSIP
5221    #[serde(rename = "@cusip", default)]
5222    pub cusip: Option<String>,
5223
5224    /// ISIN
5225    #[serde(rename = "@isin", default)]
5226    pub isin: Option<String>,
5227
5228    /// FIGI
5229    #[serde(rename = "@figi", default)]
5230    pub figi: Option<String>,
5231
5232    /// Listing exchange
5233    #[serde(rename = "@listingExchange", default)]
5234    pub listing_exchange: Option<String>,
5235
5236    /// Ex date
5237    #[serde(
5238        rename = "@exDate",
5239        default,
5240        deserialize_with = "deserialize_optional_date"
5241    )]
5242    pub ex_date: Option<NaiveDate>,
5243
5244    /// Pay date
5245    #[serde(
5246        rename = "@payDate",
5247        default,
5248        deserialize_with = "deserialize_optional_date"
5249    )]
5250    pub pay_date: Option<NaiveDate>,
5251
5252    /// Date
5253    #[serde(
5254        rename = "@date",
5255        default,
5256        deserialize_with = "deserialize_optional_date"
5257    )]
5258    pub date: Option<NaiveDate>,
5259
5260    /// Quantity
5261    #[serde(
5262        rename = "@quantity",
5263        default,
5264        deserialize_with = "deserialize_optional_decimal"
5265    )]
5266    pub quantity: Option<Decimal>,
5267
5268    /// Tax
5269    #[serde(
5270        rename = "@tax",
5271        default,
5272        deserialize_with = "deserialize_optional_decimal"
5273    )]
5274    pub tax: Option<Decimal>,
5275
5276    /// Fee
5277    #[serde(
5278        rename = "@fee",
5279        default,
5280        deserialize_with = "deserialize_optional_decimal"
5281    )]
5282    pub fee: Option<Decimal>,
5283
5284    /// Gross rate
5285    #[serde(
5286        rename = "@grossRate",
5287        default,
5288        deserialize_with = "deserialize_optional_decimal"
5289    )]
5290    pub gross_rate: Option<Decimal>,
5291
5292    /// Gross amount
5293    #[serde(
5294        rename = "@grossAmount",
5295        default,
5296        deserialize_with = "deserialize_optional_decimal"
5297    )]
5298    pub gross_amount: Option<Decimal>,
5299
5300    /// Net amount
5301    #[serde(
5302        rename = "@netAmount",
5303        default,
5304        deserialize_with = "deserialize_optional_decimal"
5305    )]
5306    pub net_amount: Option<Decimal>,
5307
5308    /// From accrual (prior period)
5309    #[serde(
5310        rename = "@fromAccrual",
5311        default,
5312        deserialize_with = "deserialize_optional_decimal"
5313    )]
5314    pub from_accrual: Option<Decimal>,
5315
5316    /// To accrual (current period)
5317    #[serde(
5318        rename = "@toAccrual",
5319        default,
5320        deserialize_with = "deserialize_optional_decimal"
5321    )]
5322    pub to_accrual: Option<Decimal>,
5323
5324    /// Code
5325    #[serde(rename = "@code", default)]
5326    pub code: Option<String>,
5327
5328    /// `sedol` (added for full ibflex coverage)
5329    #[serde(
5330        rename = "@sedol",
5331        default,
5332        deserialize_with = "deserialize_optional_string"
5333    )]
5334    pub sedol: Option<String>,
5335
5336    /// `underlyingSecurityID` (added for full ibflex coverage)
5337    #[serde(
5338        rename = "@underlyingSecurityID",
5339        default,
5340        deserialize_with = "deserialize_optional_string"
5341    )]
5342    pub underlying_security_id: Option<String>,
5343
5344    /// `underlyingListingExchange` (added for full ibflex coverage)
5345    #[serde(
5346        rename = "@underlyingListingExchange",
5347        default,
5348        deserialize_with = "deserialize_optional_string"
5349    )]
5350    pub underlying_listing_exchange: Option<String>,
5351
5352    /// `reportDate` (added for full ibflex coverage)
5353    #[serde(
5354        rename = "@reportDate",
5355        default,
5356        deserialize_with = "deserialize_optional_date"
5357    )]
5358    pub report_date: Option<NaiveDate>,
5359
5360    /// `underlyingConid` (added for full ibflex coverage)
5361    #[serde(
5362        rename = "@underlyingConid",
5363        default,
5364        deserialize_with = "deserialize_optional_string"
5365    )]
5366    pub underlying_conid: Option<String>,
5367
5368    /// `underlyingSymbol` (added for full ibflex coverage)
5369    #[serde(
5370        rename = "@underlyingSymbol",
5371        default,
5372        deserialize_with = "deserialize_optional_string"
5373    )]
5374    pub underlying_symbol: Option<String>,
5375
5376    /// `issuer` (added for full ibflex coverage)
5377    #[serde(
5378        rename = "@issuer",
5379        default,
5380        deserialize_with = "deserialize_optional_string"
5381    )]
5382    pub issuer: Option<String>,
5383
5384    /// `multiplier` (added for full ibflex coverage)
5385    #[serde(
5386        rename = "@multiplier",
5387        default,
5388        deserialize_with = "deserialize_optional_decimal"
5389    )]
5390    pub multiplier: Option<Decimal>,
5391
5392    /// `strike` (added for full ibflex coverage)
5393    #[serde(
5394        rename = "@strike",
5395        default,
5396        deserialize_with = "deserialize_optional_decimal"
5397    )]
5398    pub strike: Option<Decimal>,
5399
5400    /// `expiry` (added for full ibflex coverage)
5401    #[serde(
5402        rename = "@expiry",
5403        default,
5404        deserialize_with = "deserialize_optional_date"
5405    )]
5406    pub expiry: Option<NaiveDate>,
5407
5408    /// `putCall` (added for full ibflex coverage)
5409    #[serde(rename = "@putCall", default)]
5410    pub put_call: Option<PutCall>,
5411
5412    /// `principalAdjustFactor` (added for full ibflex coverage)
5413    #[serde(
5414        rename = "@principalAdjustFactor",
5415        default,
5416        deserialize_with = "deserialize_optional_decimal"
5417    )]
5418    pub principal_adjust_factor: Option<Decimal>,
5419
5420    /// `fromAcct` (added for full ibflex coverage)
5421    #[serde(
5422        rename = "@fromAcct",
5423        default,
5424        deserialize_with = "deserialize_optional_string"
5425    )]
5426    pub from_acct: Option<String>,
5427
5428    /// `toAcct` (added for full ibflex coverage)
5429    #[serde(
5430        rename = "@toAcct",
5431        default,
5432        deserialize_with = "deserialize_optional_string"
5433    )]
5434    pub to_acct: Option<String>,
5435
5436    /// `subCategory` (added for full ibflex coverage)
5437    #[serde(
5438        rename = "@subCategory",
5439        default,
5440        deserialize_with = "deserialize_optional_string"
5441    )]
5442    pub sub_category: Option<String>,
5443
5444    /// `issuerCountryCode` (added for full ibflex coverage)
5445    #[serde(
5446        rename = "@issuerCountryCode",
5447        default,
5448        deserialize_with = "deserialize_optional_string"
5449    )]
5450    pub issuer_country_code: Option<String>,
5451
5452    /// `actionID` (added for full ibflex coverage)
5453    #[serde(
5454        rename = "@actionID",
5455        default,
5456        deserialize_with = "deserialize_optional_decimal"
5457    )]
5458    pub action_id: Option<Decimal>,
5459
5460    /// `levelOfDetail` (added for full ibflex coverage)
5461    #[serde(
5462        rename = "@levelOfDetail",
5463        default,
5464        deserialize_with = "deserialize_optional_string"
5465    )]
5466    pub level_of_detail: Option<String>,
5467
5468    /// `serialNumber` (added for full ibflex coverage)
5469    #[serde(
5470        rename = "@serialNumber",
5471        default,
5472        deserialize_with = "deserialize_optional_decimal"
5473    )]
5474    pub serial_number: Option<Decimal>,
5475
5476    /// `deliveryType` (added for full ibflex coverage)
5477    #[serde(
5478        rename = "@deliveryType",
5479        default,
5480        deserialize_with = "deserialize_optional_decimal"
5481    )]
5482    pub delivery_type: Option<Decimal>,
5483
5484    /// `commodityType` (added for full ibflex coverage)
5485    #[serde(
5486        rename = "@commodityType",
5487        default,
5488        deserialize_with = "deserialize_optional_string"
5489    )]
5490    pub commodity_type: Option<String>,
5491
5492    /// `fineness` (added for full ibflex coverage)
5493    #[serde(
5494        rename = "@fineness",
5495        default,
5496        deserialize_with = "deserialize_optional_decimal"
5497    )]
5498    pub fineness: Option<Decimal>,
5499
5500    /// `weight` (added for full ibflex coverage)
5501    #[serde(
5502        rename = "@weight",
5503        default,
5504        deserialize_with = "deserialize_optional_decimal"
5505    )]
5506    pub weight: Option<Decimal>,
5507}
5508
5509/// Open dividend accruals
5510#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
5511pub struct OpenDividendAccrual {
5512    /// Account ID
5513    #[serde(
5514        rename = "@accountId",
5515        default,
5516        deserialize_with = "deserialize_optional_string"
5517    )]
5518    pub account_id: Option<String>,
5519
5520    /// Account alias
5521    #[serde(rename = "@acctAlias", default)]
5522    pub acct_alias: Option<String>,
5523
5524    /// Model
5525    #[serde(rename = "@model", default)]
5526    pub model: Option<String>,
5527
5528    /// Currency
5529    #[serde(rename = "@currency", default)]
5530    pub currency: Option<String>,
5531
5532    /// FX rate to base
5533    #[serde(
5534        rename = "@fxRateToBase",
5535        default,
5536        deserialize_with = "deserialize_optional_decimal"
5537    )]
5538    pub fx_rate_to_base: Option<Decimal>,
5539
5540    /// Asset category
5541    #[serde(rename = "@assetCategory", default)]
5542    pub asset_category: Option<AssetCategory>,
5543
5544    /// Symbol
5545    #[serde(
5546        rename = "@symbol",
5547        default,
5548        deserialize_with = "deserialize_optional_string"
5549    )]
5550    pub symbol: Option<String>,
5551
5552    /// Description
5553    #[serde(rename = "@description", default)]
5554    pub description: Option<String>,
5555
5556    /// Contract ID
5557    #[serde(rename = "@conid", default)]
5558    pub conid: Option<String>,
5559
5560    /// Security ID
5561    #[serde(rename = "@securityID", default)]
5562    pub security_id: Option<String>,
5563
5564    /// Security ID type
5565    #[serde(rename = "@securityIDType", default)]
5566    pub security_id_type: Option<String>,
5567
5568    /// CUSIP
5569    #[serde(rename = "@cusip", default)]
5570    pub cusip: Option<String>,
5571
5572    /// ISIN
5573    #[serde(rename = "@isin", default)]
5574    pub isin: Option<String>,
5575
5576    /// FIGI
5577    #[serde(rename = "@figi", default)]
5578    pub figi: Option<String>,
5579
5580    /// Listing exchange
5581    #[serde(rename = "@listingExchange", default)]
5582    pub listing_exchange: Option<String>,
5583
5584    /// Ex date
5585    #[serde(
5586        rename = "@exDate",
5587        default,
5588        deserialize_with = "deserialize_optional_date"
5589    )]
5590    pub ex_date: Option<NaiveDate>,
5591
5592    /// Pay date
5593    #[serde(
5594        rename = "@payDate",
5595        default,
5596        deserialize_with = "deserialize_optional_date"
5597    )]
5598    pub pay_date: Option<NaiveDate>,
5599
5600    /// Quantity
5601    #[serde(
5602        rename = "@quantity",
5603        default,
5604        deserialize_with = "deserialize_optional_decimal"
5605    )]
5606    pub quantity: Option<Decimal>,
5607
5608    /// Tax
5609    #[serde(
5610        rename = "@tax",
5611        default,
5612        deserialize_with = "deserialize_optional_decimal"
5613    )]
5614    pub tax: Option<Decimal>,
5615
5616    /// Fee
5617    #[serde(
5618        rename = "@fee",
5619        default,
5620        deserialize_with = "deserialize_optional_decimal"
5621    )]
5622    pub fee: Option<Decimal>,
5623
5624    /// Gross rate
5625    #[serde(
5626        rename = "@grossRate",
5627        default,
5628        deserialize_with = "deserialize_optional_decimal"
5629    )]
5630    pub gross_rate: Option<Decimal>,
5631
5632    /// Gross amount
5633    #[serde(
5634        rename = "@grossAmount",
5635        default,
5636        deserialize_with = "deserialize_optional_decimal"
5637    )]
5638    pub gross_amount: Option<Decimal>,
5639
5640    /// Net amount
5641    #[serde(
5642        rename = "@netAmount",
5643        default,
5644        deserialize_with = "deserialize_optional_decimal"
5645    )]
5646    pub net_amount: Option<Decimal>,
5647
5648    /// Code
5649    #[serde(rename = "@code", default)]
5650    pub code: Option<String>,
5651
5652    /// `underlyingConid` (added for full ibflex coverage)
5653    #[serde(
5654        rename = "@underlyingConid",
5655        default,
5656        deserialize_with = "deserialize_optional_string"
5657    )]
5658    pub underlying_conid: Option<String>,
5659
5660    /// `underlyingSecurityID` (added for full ibflex coverage)
5661    #[serde(
5662        rename = "@underlyingSecurityID",
5663        default,
5664        deserialize_with = "deserialize_optional_string"
5665    )]
5666    pub underlying_security_id: Option<String>,
5667
5668    /// `underlyingListingExchange` (added for full ibflex coverage)
5669    #[serde(
5670        rename = "@underlyingListingExchange",
5671        default,
5672        deserialize_with = "deserialize_optional_string"
5673    )]
5674    pub underlying_listing_exchange: Option<String>,
5675
5676    /// `sedol` (added for full ibflex coverage)
5677    #[serde(
5678        rename = "@sedol",
5679        default,
5680        deserialize_with = "deserialize_optional_string"
5681    )]
5682    pub sedol: Option<String>,
5683
5684    /// `underlyingSymbol` (added for full ibflex coverage)
5685    #[serde(
5686        rename = "@underlyingSymbol",
5687        default,
5688        deserialize_with = "deserialize_optional_string"
5689    )]
5690    pub underlying_symbol: Option<String>,
5691
5692    /// `issuer` (added for full ibflex coverage)
5693    #[serde(
5694        rename = "@issuer",
5695        default,
5696        deserialize_with = "deserialize_optional_string"
5697    )]
5698    pub issuer: Option<String>,
5699
5700    /// `multiplier` (added for full ibflex coverage)
5701    #[serde(
5702        rename = "@multiplier",
5703        default,
5704        deserialize_with = "deserialize_optional_decimal"
5705    )]
5706    pub multiplier: Option<Decimal>,
5707
5708    /// `strike` (added for full ibflex coverage)
5709    #[serde(
5710        rename = "@strike",
5711        default,
5712        deserialize_with = "deserialize_optional_decimal"
5713    )]
5714    pub strike: Option<Decimal>,
5715
5716    /// `expiry` (added for full ibflex coverage)
5717    #[serde(
5718        rename = "@expiry",
5719        default,
5720        deserialize_with = "deserialize_optional_date"
5721    )]
5722    pub expiry: Option<NaiveDate>,
5723
5724    /// `putCall` (added for full ibflex coverage)
5725    #[serde(rename = "@putCall", default)]
5726    pub put_call: Option<PutCall>,
5727
5728    /// `principalAdjustFactor` (added for full ibflex coverage)
5729    #[serde(
5730        rename = "@principalAdjustFactor",
5731        default,
5732        deserialize_with = "deserialize_optional_decimal"
5733    )]
5734    pub principal_adjust_factor: Option<Decimal>,
5735
5736    /// `fromAcct` (added for full ibflex coverage)
5737    #[serde(
5738        rename = "@fromAcct",
5739        default,
5740        deserialize_with = "deserialize_optional_string"
5741    )]
5742    pub from_acct: Option<String>,
5743
5744    /// `toAcct` (added for full ibflex coverage)
5745    #[serde(
5746        rename = "@toAcct",
5747        default,
5748        deserialize_with = "deserialize_optional_string"
5749    )]
5750    pub to_acct: Option<String>,
5751
5752    /// `serialNumber` (added for full ibflex coverage)
5753    #[serde(
5754        rename = "@serialNumber",
5755        default,
5756        deserialize_with = "deserialize_optional_string"
5757    )]
5758    pub serial_number: Option<String>,
5759
5760    /// `deliveryType` (added for full ibflex coverage)
5761    #[serde(
5762        rename = "@deliveryType",
5763        default,
5764        deserialize_with = "deserialize_optional_string"
5765    )]
5766    pub delivery_type: Option<String>,
5767
5768    /// `commodityType` (added for full ibflex coverage)
5769    #[serde(
5770        rename = "@commodityType",
5771        default,
5772        deserialize_with = "deserialize_optional_string"
5773    )]
5774    pub commodity_type: Option<String>,
5775
5776    /// `fineness` (added for full ibflex coverage)
5777    #[serde(
5778        rename = "@fineness",
5779        default,
5780        deserialize_with = "deserialize_optional_decimal"
5781    )]
5782    pub fineness: Option<Decimal>,
5783
5784    /// `weight` (added for full ibflex coverage)
5785    #[serde(
5786        rename = "@weight",
5787        default,
5788        deserialize_with = "deserialize_optional_string"
5789    )]
5790    pub weight: Option<String>,
5791}
5792
5793/// Interest accruals by currency
5794#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
5795pub struct InterestAccrualsCurrency {
5796    /// Account ID
5797    #[serde(
5798        rename = "@accountId",
5799        default,
5800        deserialize_with = "deserialize_optional_string"
5801    )]
5802    pub account_id: Option<String>,
5803
5804    /// Currency
5805    #[serde(
5806        rename = "@currency",
5807        default,
5808        deserialize_with = "deserialize_optional_string"
5809    )]
5810    pub currency: Option<String>,
5811
5812    /// From date
5813    #[serde(
5814        rename = "@fromDate",
5815        default,
5816        deserialize_with = "deserialize_optional_date"
5817    )]
5818    pub from_date: Option<NaiveDate>,
5819
5820    /// To date
5821    #[serde(
5822        rename = "@toDate",
5823        default,
5824        deserialize_with = "deserialize_optional_date"
5825    )]
5826    pub to_date: Option<NaiveDate>,
5827
5828    /// Starting accrual balance
5829    #[serde(
5830        rename = "@startingAccrualBalance",
5831        default,
5832        deserialize_with = "deserialize_optional_decimal"
5833    )]
5834    pub starting_balance: Option<Decimal>,
5835
5836    /// Interest accrued
5837    #[serde(
5838        rename = "@interestAccrued",
5839        default,
5840        deserialize_with = "deserialize_optional_decimal"
5841    )]
5842    pub interest_accrued: Option<Decimal>,
5843
5844    /// Ending accrual balance
5845    #[serde(
5846        rename = "@endingAccrualBalance",
5847        default,
5848        deserialize_with = "deserialize_optional_decimal"
5849    )]
5850    pub ending_balance: Option<Decimal>,
5851
5852    /// `accrualReversal` (added for full ibflex coverage)
5853    #[serde(
5854        rename = "@accrualReversal",
5855        default,
5856        deserialize_with = "deserialize_optional_decimal"
5857    )]
5858    pub accrual_reversal: Option<Decimal>,
5859
5860    /// `acctAlias` (added for full ibflex coverage)
5861    #[serde(
5862        rename = "@acctAlias",
5863        default,
5864        deserialize_with = "deserialize_optional_string"
5865    )]
5866    pub acct_alias: Option<String>,
5867
5868    /// `model` (added for full ibflex coverage)
5869    #[serde(
5870        rename = "@model",
5871        default,
5872        deserialize_with = "deserialize_optional_string"
5873    )]
5874    pub model: Option<String>,
5875
5876    /// `fxTranslation` (added for full ibflex coverage)
5877    #[serde(
5878        rename = "@fxTranslation",
5879        default,
5880        deserialize_with = "deserialize_optional_decimal"
5881    )]
5882    pub fx_translation: Option<Decimal>,
5883}
5884
5885/// Security transfer
5886#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
5887pub struct Transfer {
5888    /// Account ID
5889    #[serde(
5890        rename = "@accountId",
5891        default,
5892        deserialize_with = "deserialize_optional_string"
5893    )]
5894    pub account_id: Option<String>,
5895
5896    /// Account alias
5897    #[serde(rename = "@acctAlias", default)]
5898    pub acct_alias: Option<String>,
5899
5900    /// Model
5901    #[serde(rename = "@model", default)]
5902    pub model: Option<String>,
5903
5904    /// Transaction ID
5905    #[serde(rename = "@transactionID", default)]
5906    pub transaction_id: Option<String>,
5907
5908    /// Transfer type
5909    #[serde(rename = "@type", default)]
5910    pub transfer_type: Option<TransferType>,
5911
5912    /// Contract ID
5913    #[serde(rename = "@conid", default)]
5914    pub conid: Option<String>,
5915
5916    /// Symbol
5917    #[serde(
5918        rename = "@symbol",
5919        default,
5920        deserialize_with = "deserialize_optional_string"
5921    )]
5922    pub symbol: Option<String>,
5923
5924    /// Description
5925    #[serde(rename = "@description", default)]
5926    pub description: Option<String>,
5927
5928    /// Asset category
5929    #[serde(rename = "@assetCategory", default)]
5930    pub asset_category: Option<AssetCategory>,
5931
5932    // Security identifiers
5933    /// CUSIP
5934    #[serde(rename = "@cusip", default)]
5935    pub cusip: Option<String>,
5936
5937    /// ISIN
5938    #[serde(rename = "@isin", default)]
5939    pub isin: Option<String>,
5940
5941    /// FIGI
5942    #[serde(rename = "@figi", default)]
5943    pub figi: Option<String>,
5944
5945    /// Listing exchange
5946    #[serde(rename = "@listingExchange", default)]
5947    pub listing_exchange: Option<String>,
5948
5949    /// Quantity
5950    #[serde(
5951        rename = "@quantity",
5952        default,
5953        deserialize_with = "deserialize_optional_decimal"
5954    )]
5955    pub quantity: Option<Decimal>,
5956
5957    /// Price
5958    #[serde(
5959        rename = "@transferPrice",
5960        default,
5961        deserialize_with = "deserialize_optional_decimal"
5962    )]
5963    pub transfer_price: Option<Decimal>,
5964
5965    /// Position amount
5966    #[serde(
5967        rename = "@positionAmount",
5968        default,
5969        deserialize_with = "deserialize_optional_decimal"
5970    )]
5971    pub position_amount: Option<Decimal>,
5972
5973    /// Position amount in base
5974    #[serde(
5975        rename = "@positionAmountInBase",
5976        default,
5977        deserialize_with = "deserialize_optional_decimal"
5978    )]
5979    pub position_amount_in_base: Option<Decimal>,
5980
5981    /// Cash transfer
5982    #[serde(
5983        rename = "@cashTransfer",
5984        default,
5985        deserialize_with = "deserialize_optional_decimal"
5986    )]
5987    pub cash_transfer: Option<Decimal>,
5988
5989    /// Currency
5990    #[serde(rename = "@currency", default)]
5991    pub currency: Option<String>,
5992
5993    /// FX rate to base
5994    #[serde(
5995        rename = "@fxRateToBase",
5996        default,
5997        deserialize_with = "deserialize_optional_decimal"
5998    )]
5999    pub fx_rate_to_base: Option<Decimal>,
6000
6001    /// Direction
6002    #[serde(rename = "@direction", default)]
6003    pub direction: Option<String>,
6004
6005    /// Date
6006    #[serde(
6007        rename = "@date",
6008        default,
6009        deserialize_with = "deserialize_optional_date"
6010    )]
6011    pub date: Option<NaiveDate>,
6012
6013    /// Payer/payee account
6014    #[serde(rename = "@ppiPayerPayeeAccount", default)]
6015    pub ppi_payer_payee_account: Option<String>,
6016
6017    /// Delivering/receiving broker
6018    #[serde(rename = "@deliveringReceivingBroker", default)]
6019    pub delivering_receiving_broker: Option<String>,
6020
6021    // Options fields
6022    /// Strike
6023    #[serde(
6024        rename = "@strike",
6025        default,
6026        deserialize_with = "deserialize_optional_decimal"
6027    )]
6028    pub strike: Option<Decimal>,
6029
6030    /// Expiry
6031    #[serde(
6032        rename = "@expiry",
6033        default,
6034        deserialize_with = "deserialize_optional_date"
6035    )]
6036    pub expiry: Option<NaiveDate>,
6037
6038    /// Put/Call
6039    #[serde(rename = "@putCall", default)]
6040    pub put_call: Option<String>,
6041
6042    /// Multiplier
6043    #[serde(
6044        rename = "@multiplier",
6045        default,
6046        deserialize_with = "deserialize_optional_decimal"
6047    )]
6048    pub multiplier: Option<Decimal>,
6049
6050    /// `subCategory` (added for full ibflex coverage)
6051    #[serde(
6052        rename = "@subCategory",
6053        default,
6054        deserialize_with = "deserialize_optional_string"
6055    )]
6056    pub sub_category: Option<String>,
6057
6058    /// `securityID` (added for full ibflex coverage)
6059    #[serde(
6060        rename = "@securityID",
6061        default,
6062        deserialize_with = "deserialize_optional_string"
6063    )]
6064    pub security_id: Option<String>,
6065
6066    /// `underlyingSecurityID` (added for full ibflex coverage)
6067    #[serde(
6068        rename = "@underlyingSecurityID",
6069        default,
6070        deserialize_with = "deserialize_optional_string"
6071    )]
6072    pub underlying_security_id: Option<String>,
6073
6074    /// `underlyingListingExchange` (added for full ibflex coverage)
6075    #[serde(
6076        rename = "@underlyingListingExchange",
6077        default,
6078        deserialize_with = "deserialize_optional_string"
6079    )]
6080    pub underlying_listing_exchange: Option<String>,
6081
6082    /// `reportDate` (added for full ibflex coverage)
6083    #[serde(
6084        rename = "@reportDate",
6085        default,
6086        deserialize_with = "deserialize_optional_date"
6087    )]
6088    pub report_date: Option<NaiveDate>,
6089
6090    /// `underlyingConid` (added for full ibflex coverage)
6091    #[serde(
6092        rename = "@underlyingConid",
6093        default,
6094        deserialize_with = "deserialize_optional_string"
6095    )]
6096    pub underlying_conid: Option<String>,
6097
6098    /// `dateTime` (added for full ibflex coverage)
6099    #[serde(
6100        rename = "@dateTime",
6101        default,
6102        deserialize_with = "deserialize_optional_string"
6103    )]
6104    pub date_time: Option<String>,
6105
6106    /// `account` (added for full ibflex coverage)
6107    #[serde(
6108        rename = "@account",
6109        default,
6110        deserialize_with = "deserialize_optional_string"
6111    )]
6112    pub account: Option<String>,
6113
6114    /// `deliveringBroker` (added for full ibflex coverage)
6115    #[serde(
6116        rename = "@deliveringBroker",
6117        default,
6118        deserialize_with = "deserialize_optional_string"
6119    )]
6120    pub delivering_broker: Option<String>,
6121
6122    /// `capitalGainsPnl` (added for full ibflex coverage)
6123    #[serde(
6124        rename = "@capitalGainsPnl",
6125        default,
6126        deserialize_with = "deserialize_optional_decimal"
6127    )]
6128    pub capital_gains_pnl: Option<Decimal>,
6129
6130    /// `code` (added for full ibflex coverage)
6131    #[serde(
6132        rename = "@code",
6133        default,
6134        deserialize_with = "deserialize_optional_string"
6135    )]
6136    pub code: Option<String>,
6137
6138    /// `clientReference` (added for full ibflex coverage)
6139    #[serde(
6140        rename = "@clientReference",
6141        default,
6142        deserialize_with = "deserialize_optional_string"
6143    )]
6144    pub client_reference: Option<String>,
6145
6146    /// `sedol` (added for full ibflex coverage)
6147    #[serde(
6148        rename = "@sedol",
6149        default,
6150        deserialize_with = "deserialize_optional_string"
6151    )]
6152    pub sedol: Option<String>,
6153
6154    /// `securityIDType` (added for full ibflex coverage)
6155    #[serde(
6156        rename = "@securityIDType",
6157        default,
6158        deserialize_with = "deserialize_optional_string"
6159    )]
6160    pub security_id_type: Option<String>,
6161
6162    /// `underlyingSymbol` (added for full ibflex coverage)
6163    #[serde(
6164        rename = "@underlyingSymbol",
6165        default,
6166        deserialize_with = "deserialize_optional_string"
6167    )]
6168    pub underlying_symbol: Option<String>,
6169
6170    /// `issuer` (added for full ibflex coverage)
6171    #[serde(
6172        rename = "@issuer",
6173        default,
6174        deserialize_with = "deserialize_optional_string"
6175    )]
6176    pub issuer: Option<String>,
6177
6178    /// `principalAdjustFactor` (added for full ibflex coverage)
6179    #[serde(
6180        rename = "@principalAdjustFactor",
6181        default,
6182        deserialize_with = "deserialize_optional_decimal"
6183    )]
6184    pub principal_adjust_factor: Option<Decimal>,
6185
6186    /// `company` (added for full ibflex coverage)
6187    #[serde(
6188        rename = "@company",
6189        default,
6190        deserialize_with = "deserialize_optional_string"
6191    )]
6192    pub company: Option<String>,
6193
6194    /// `accountName` (added for full ibflex coverage)
6195    #[serde(
6196        rename = "@accountName",
6197        default,
6198        deserialize_with = "deserialize_optional_string"
6199    )]
6200    pub account_name: Option<String>,
6201
6202    /// `pnlAmount` (added for full ibflex coverage)
6203    #[serde(
6204        rename = "@pnlAmount",
6205        default,
6206        deserialize_with = "deserialize_optional_decimal"
6207    )]
6208    pub pnl_amount: Option<Decimal>,
6209
6210    /// `pnlAmountInBase` (added for full ibflex coverage)
6211    #[serde(
6212        rename = "@pnlAmountInBase",
6213        default,
6214        deserialize_with = "deserialize_optional_decimal"
6215    )]
6216    pub pnl_amount_in_base: Option<Decimal>,
6217
6218    /// `fxPnl` (added for full ibflex coverage)
6219    #[serde(
6220        rename = "@fxPnl",
6221        default,
6222        deserialize_with = "deserialize_optional_decimal"
6223    )]
6224    pub fx_pnl: Option<Decimal>,
6225
6226    /// `serialNumber` (added for full ibflex coverage)
6227    #[serde(
6228        rename = "@serialNumber",
6229        default,
6230        deserialize_with = "deserialize_optional_string"
6231    )]
6232    pub serial_number: Option<String>,
6233
6234    /// `deliveryType` (added for full ibflex coverage)
6235    #[serde(
6236        rename = "@deliveryType",
6237        default,
6238        deserialize_with = "deserialize_optional_string"
6239    )]
6240    pub delivery_type: Option<String>,
6241
6242    /// `commodityType` (added for full ibflex coverage)
6243    #[serde(
6244        rename = "@commodityType",
6245        default,
6246        deserialize_with = "deserialize_optional_string"
6247    )]
6248    pub commodity_type: Option<String>,
6249
6250    /// `fineness` (added for full ibflex coverage)
6251    #[serde(
6252        rename = "@fineness",
6253        default,
6254        deserialize_with = "deserialize_optional_decimal"
6255    )]
6256    pub fineness: Option<Decimal>,
6257
6258    /// `weight` (added for full ibflex coverage)
6259    #[serde(
6260        rename = "@weight",
6261        default,
6262        deserialize_with = "deserialize_optional_string"
6263    )]
6264    pub weight: Option<String>,
6265
6266    /// `settleDate` (added for full ibflex coverage)
6267    #[serde(
6268        rename = "@settleDate",
6269        default,
6270        deserialize_with = "deserialize_optional_date"
6271    )]
6272    pub settle_date: Option<NaiveDate>,
6273
6274    /// `issuerCountryCode` (added for full ibflex coverage)
6275    #[serde(
6276        rename = "@issuerCountryCode",
6277        default,
6278        deserialize_with = "deserialize_optional_string"
6279    )]
6280    pub issuer_country_code: Option<String>,
6281
6282    /// `levelOfDetail` (added for full ibflex coverage)
6283    #[serde(
6284        rename = "@levelOfDetail",
6285        default,
6286        deserialize_with = "deserialize_optional_string"
6287    )]
6288    pub level_of_detail: Option<String>,
6289
6290    /// `positionInstructionID` (added for full ibflex coverage)
6291    #[serde(
6292        rename = "@positionInstructionID",
6293        default,
6294        deserialize_with = "deserialize_optional_string"
6295    )]
6296    pub position_instruction_id: Option<String>,
6297
6298    /// `positionInstructionSetID` (added for full ibflex coverage)
6299    #[serde(
6300        rename = "@positionInstructionSetID",
6301        default,
6302        deserialize_with = "deserialize_optional_string"
6303    )]
6304    pub position_instruction_set_id: Option<String>,
6305}
6306
6307// =============================================================================
6308// Performance Summary Types
6309// =============================================================================
6310
6311/// Mark-to-market performance summary by underlying security
6312///
6313/// Provides MTM performance metrics for each security in the portfolio,
6314/// including realized and unrealized P&L, commissions, and transaction MTM.
6315#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
6316pub struct MTMPerformanceSummaryUnderlying {
6317    /// Account ID
6318    #[serde(
6319        rename = "@accountId",
6320        default,
6321        deserialize_with = "deserialize_optional_string"
6322    )]
6323    pub account_id: Option<String>,
6324
6325    /// Account alias
6326    #[serde(rename = "@acctAlias", default)]
6327    pub acct_alias: Option<String>,
6328
6329    /// Model
6330    #[serde(rename = "@model", default)]
6331    pub model: Option<String>,
6332
6333    /// Report date
6334    #[serde(
6335        rename = "@reportDate",
6336        default,
6337        deserialize_with = "deserialize_optional_date"
6338    )]
6339    pub report_date: Option<NaiveDate>,
6340
6341    /// Symbol
6342    #[serde(rename = "@symbol", default)]
6343    pub symbol: Option<String>,
6344
6345    /// Description
6346    #[serde(rename = "@description", default)]
6347    pub description: Option<String>,
6348
6349    /// Contract ID
6350    #[serde(rename = "@conid", default)]
6351    pub conid: Option<String>,
6352
6353    /// Asset category
6354    #[serde(rename = "@assetCategory", default)]
6355    pub asset_category: Option<AssetCategory>,
6356
6357    // Security identifiers
6358    /// CUSIP
6359    #[serde(rename = "@cusip", default)]
6360    pub cusip: Option<String>,
6361
6362    /// ISIN
6363    #[serde(rename = "@isin", default)]
6364    pub isin: Option<String>,
6365
6366    /// Listing exchange
6367    #[serde(rename = "@listingExchange", default)]
6368    pub listing_exchange: Option<String>,
6369
6370    /// Underlying symbol
6371    #[serde(rename = "@underlyingSymbol", default)]
6372    pub underlying_symbol: Option<String>,
6373
6374    /// Underlying contract ID
6375    #[serde(rename = "@underlyingConid", default)]
6376    pub underlying_conid: Option<String>,
6377
6378    /// Underlying listing exchange
6379    #[serde(rename = "@underlyingListingExchange", default)]
6380    pub underlying_listing_exchange: Option<String>,
6381
6382    // P&L fields
6383    /// Cost adjustment
6384    #[serde(
6385        rename = "@costAdj",
6386        default,
6387        deserialize_with = "deserialize_optional_decimal"
6388    )]
6389    pub cost_adj: Option<Decimal>,
6390
6391    /// Realized short-term profit
6392    #[serde(
6393        rename = "@realizedSTProfit",
6394        default,
6395        deserialize_with = "deserialize_optional_decimal"
6396    )]
6397    pub realized_st_profit: Option<Decimal>,
6398
6399    /// Realized short-term loss
6400    #[serde(
6401        rename = "@realizedSTLoss",
6402        default,
6403        deserialize_with = "deserialize_optional_decimal"
6404    )]
6405    pub realized_st_loss: Option<Decimal>,
6406
6407    /// Realized long-term profit
6408    #[serde(
6409        rename = "@realizedLTProfit",
6410        default,
6411        deserialize_with = "deserialize_optional_decimal"
6412    )]
6413    pub realized_lt_profit: Option<Decimal>,
6414
6415    /// Realized long-term loss
6416    #[serde(
6417        rename = "@realizedLTLoss",
6418        default,
6419        deserialize_with = "deserialize_optional_decimal"
6420    )]
6421    pub realized_lt_loss: Option<Decimal>,
6422
6423    /// Unrealized short-term profit
6424    #[serde(
6425        rename = "@unrealizedSTProfit",
6426        default,
6427        deserialize_with = "deserialize_optional_decimal"
6428    )]
6429    pub unrealized_st_profit: Option<Decimal>,
6430
6431    /// Unrealized short-term loss
6432    #[serde(
6433        rename = "@unrealizedSTLoss",
6434        default,
6435        deserialize_with = "deserialize_optional_decimal"
6436    )]
6437    pub unrealized_st_loss: Option<Decimal>,
6438
6439    /// Unrealized long-term profit
6440    #[serde(
6441        rename = "@unrealizedLTProfit",
6442        default,
6443        deserialize_with = "deserialize_optional_decimal"
6444    )]
6445    pub unrealized_lt_profit: Option<Decimal>,
6446
6447    /// Unrealized long-term loss
6448    #[serde(
6449        rename = "@unrealizedLTLoss",
6450        default,
6451        deserialize_with = "deserialize_optional_decimal"
6452    )]
6453    pub unrealized_lt_loss: Option<Decimal>,
6454
6455    /// Transaction MTM
6456    #[serde(
6457        rename = "@transactionMtm",
6458        default,
6459        deserialize_with = "deserialize_optional_decimal"
6460    )]
6461    pub transaction_mtm: Option<Decimal>,
6462
6463    /// Commissions
6464    #[serde(
6465        rename = "@commissions",
6466        default,
6467        deserialize_with = "deserialize_optional_decimal"
6468    )]
6469    pub commissions: Option<Decimal>,
6470
6471    /// Other fees
6472    #[serde(
6473        rename = "@other",
6474        default,
6475        deserialize_with = "deserialize_optional_decimal"
6476    )]
6477    pub other: Option<Decimal>,
6478
6479    /// Level of detail
6480    #[serde(rename = "@levelOfDetail", default)]
6481    pub level_of_detail: Option<String>,
6482
6483    /// `securityID` (added for full ibflex coverage)
6484    #[serde(
6485        rename = "@securityID",
6486        default,
6487        deserialize_with = "deserialize_optional_string"
6488    )]
6489    pub security_id: Option<String>,
6490
6491    /// `securityIDType` (added for full ibflex coverage)
6492    #[serde(
6493        rename = "@securityIDType",
6494        default,
6495        deserialize_with = "deserialize_optional_string"
6496    )]
6497    pub security_id_type: Option<String>,
6498
6499    /// `sedol` (added for full ibflex coverage)
6500    #[serde(
6501        rename = "@sedol",
6502        default,
6503        deserialize_with = "deserialize_optional_string"
6504    )]
6505    pub sedol: Option<String>,
6506
6507    /// `underlyingSecurityID` (added for full ibflex coverage)
6508    #[serde(
6509        rename = "@underlyingSecurityID",
6510        default,
6511        deserialize_with = "deserialize_optional_string"
6512    )]
6513    pub underlying_security_id: Option<String>,
6514
6515    /// `issuer` (added for full ibflex coverage)
6516    #[serde(
6517        rename = "@issuer",
6518        default,
6519        deserialize_with = "deserialize_optional_string"
6520    )]
6521    pub issuer: Option<String>,
6522
6523    /// `multiplier` (added for full ibflex coverage)
6524    #[serde(
6525        rename = "@multiplier",
6526        default,
6527        deserialize_with = "deserialize_optional_decimal"
6528    )]
6529    pub multiplier: Option<Decimal>,
6530
6531    /// `strike` (added for full ibflex coverage)
6532    #[serde(
6533        rename = "@strike",
6534        default,
6535        deserialize_with = "deserialize_optional_decimal"
6536    )]
6537    pub strike: Option<Decimal>,
6538
6539    /// `expiry` (added for full ibflex coverage)
6540    #[serde(
6541        rename = "@expiry",
6542        default,
6543        deserialize_with = "deserialize_optional_date"
6544    )]
6545    pub expiry: Option<NaiveDate>,
6546
6547    /// `putCall` (added for full ibflex coverage)
6548    #[serde(rename = "@putCall", default)]
6549    pub put_call: Option<PutCall>,
6550
6551    /// `principalAdjustFactor` (added for full ibflex coverage)
6552    #[serde(
6553        rename = "@principalAdjustFactor",
6554        default,
6555        deserialize_with = "deserialize_optional_decimal"
6556    )]
6557    pub principal_adjust_factor: Option<Decimal>,
6558
6559    /// `prevCloseQuantity` (added for full ibflex coverage)
6560    #[serde(
6561        rename = "@prevCloseQuantity",
6562        default,
6563        deserialize_with = "deserialize_optional_decimal"
6564    )]
6565    pub prev_close_quantity: Option<Decimal>,
6566
6567    /// `prevClosePrice` (added for full ibflex coverage)
6568    #[serde(
6569        rename = "@prevClosePrice",
6570        default,
6571        deserialize_with = "deserialize_optional_decimal"
6572    )]
6573    pub prev_close_price: Option<Decimal>,
6574
6575    /// `closeQuantity` (added for full ibflex coverage)
6576    #[serde(
6577        rename = "@closeQuantity",
6578        default,
6579        deserialize_with = "deserialize_optional_decimal"
6580    )]
6581    pub close_quantity: Option<Decimal>,
6582
6583    /// `closePrice` (added for full ibflex coverage)
6584    #[serde(
6585        rename = "@closePrice",
6586        default,
6587        deserialize_with = "deserialize_optional_decimal"
6588    )]
6589    pub close_price: Option<Decimal>,
6590
6591    /// `priorOpenMtm` (added for full ibflex coverage)
6592    #[serde(
6593        rename = "@priorOpenMtm",
6594        default,
6595        deserialize_with = "deserialize_optional_decimal"
6596    )]
6597    pub prior_open_mtm: Option<Decimal>,
6598
6599    /// `total` (added for full ibflex coverage)
6600    #[serde(
6601        rename = "@total",
6602        default,
6603        deserialize_with = "deserialize_optional_decimal"
6604    )]
6605    pub total: Option<Decimal>,
6606
6607    /// `code` (added for full ibflex coverage)
6608    #[serde(
6609        rename = "@code",
6610        default,
6611        deserialize_with = "deserialize_optional_string"
6612    )]
6613    pub code: Option<String>,
6614
6615    /// `corpActionMtm` (added for full ibflex coverage)
6616    #[serde(
6617        rename = "@corpActionMtm",
6618        default,
6619        deserialize_with = "deserialize_optional_decimal"
6620    )]
6621    pub corp_action_mtm: Option<Decimal>,
6622
6623    /// `dividends` (added for full ibflex coverage)
6624    #[serde(
6625        rename = "@dividends",
6626        default,
6627        deserialize_with = "deserialize_optional_decimal"
6628    )]
6629    pub dividends: Option<Decimal>,
6630
6631    /// `serialNumber` (added for full ibflex coverage)
6632    #[serde(
6633        rename = "@serialNumber",
6634        default,
6635        deserialize_with = "deserialize_optional_string"
6636    )]
6637    pub serial_number: Option<String>,
6638
6639    /// `deliveryType` (added for full ibflex coverage)
6640    #[serde(
6641        rename = "@deliveryType",
6642        default,
6643        deserialize_with = "deserialize_optional_string"
6644    )]
6645    pub delivery_type: Option<String>,
6646
6647    /// `commodityType` (added for full ibflex coverage)
6648    #[serde(
6649        rename = "@commodityType",
6650        default,
6651        deserialize_with = "deserialize_optional_string"
6652    )]
6653    pub commodity_type: Option<String>,
6654
6655    /// `fineness` (added for full ibflex coverage)
6656    #[serde(
6657        rename = "@fineness",
6658        default,
6659        deserialize_with = "deserialize_optional_decimal"
6660    )]
6661    pub fineness: Option<Decimal>,
6662
6663    /// `weight` (added for full ibflex coverage)
6664    #[serde(
6665        rename = "@weight",
6666        default,
6667        deserialize_with = "deserialize_optional_string"
6668    )]
6669    pub weight: Option<String>,
6670
6671    /// `otherWithAccruals` (added for full ibflex coverage)
6672    #[serde(
6673        rename = "@otherWithAccruals",
6674        default,
6675        deserialize_with = "deserialize_optional_decimal"
6676    )]
6677    pub other_with_accruals: Option<Decimal>,
6678
6679    /// `totalWithAccruals` (added for full ibflex coverage)
6680    #[serde(
6681        rename = "@totalWithAccruals",
6682        default,
6683        deserialize_with = "deserialize_optional_decimal"
6684    )]
6685    pub total_with_accruals: Option<Decimal>,
6686
6687    /// `subCategory` (added for full ibflex coverage)
6688    #[serde(
6689        rename = "@subCategory",
6690        default,
6691        deserialize_with = "deserialize_optional_string"
6692    )]
6693    pub sub_category: Option<String>,
6694
6695    /// `figi` (added for full ibflex coverage)
6696    #[serde(
6697        rename = "@figi",
6698        default,
6699        deserialize_with = "deserialize_optional_string"
6700    )]
6701    pub figi: Option<String>,
6702
6703    /// `issuerCountryCode` (added for full ibflex coverage)
6704    #[serde(
6705        rename = "@issuerCountryCode",
6706        default,
6707        deserialize_with = "deserialize_optional_string"
6708    )]
6709    pub issuer_country_code: Option<String>,
6710}
6711
6712/// FIFO performance summary by underlying security
6713///
6714/// Provides FIFO-based performance metrics including realized and unrealized
6715/// P&L calculated using FIFO cost basis method.
6716#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
6717pub struct FIFOPerformanceSummaryUnderlying {
6718    /// Account ID
6719    #[serde(
6720        rename = "@accountId",
6721        default,
6722        deserialize_with = "deserialize_optional_string"
6723    )]
6724    pub account_id: Option<String>,
6725
6726    /// Account alias
6727    #[serde(rename = "@acctAlias", default)]
6728    pub acct_alias: Option<String>,
6729
6730    /// Model
6731    #[serde(rename = "@model", default)]
6732    pub model: Option<String>,
6733
6734    /// Report date
6735    #[serde(
6736        rename = "@reportDate",
6737        default,
6738        deserialize_with = "deserialize_optional_date"
6739    )]
6740    pub report_date: Option<NaiveDate>,
6741
6742    /// Symbol
6743    #[serde(rename = "@symbol", default)]
6744    pub symbol: Option<String>,
6745
6746    /// Description
6747    #[serde(rename = "@description", default)]
6748    pub description: Option<String>,
6749
6750    /// Contract ID
6751    #[serde(rename = "@conid", default)]
6752    pub conid: Option<String>,
6753
6754    /// Asset category
6755    #[serde(rename = "@assetCategory", default)]
6756    pub asset_category: Option<AssetCategory>,
6757
6758    // Security identifiers
6759    /// CUSIP
6760    #[serde(rename = "@cusip", default)]
6761    pub cusip: Option<String>,
6762
6763    /// ISIN
6764    #[serde(rename = "@isin", default)]
6765    pub isin: Option<String>,
6766
6767    /// Listing exchange
6768    #[serde(rename = "@listingExchange", default)]
6769    pub listing_exchange: Option<String>,
6770
6771    /// Underlying symbol
6772    #[serde(rename = "@underlyingSymbol", default)]
6773    pub underlying_symbol: Option<String>,
6774
6775    /// Underlying contract ID
6776    #[serde(rename = "@underlyingConid", default)]
6777    pub underlying_conid: Option<String>,
6778
6779    // P&L fields
6780    /// Realized short-term P&L
6781    #[serde(
6782        rename = "@realizedShortTermPnl",
6783        default,
6784        deserialize_with = "deserialize_optional_decimal"
6785    )]
6786    pub realized_short_term_pnl: Option<Decimal>,
6787
6788    /// Realized long-term P&L
6789    #[serde(
6790        rename = "@realizedLongTermPnl",
6791        default,
6792        deserialize_with = "deserialize_optional_decimal"
6793    )]
6794    pub realized_long_term_pnl: Option<Decimal>,
6795
6796    /// Realized total P&L
6797    #[serde(
6798        rename = "@realizedTotalPnl",
6799        default,
6800        deserialize_with = "deserialize_optional_decimal"
6801    )]
6802    pub realized_total_pnl: Option<Decimal>,
6803
6804    /// Unrealized short-term P&L
6805    #[serde(
6806        rename = "@unrealizedShortTermPnl",
6807        default,
6808        deserialize_with = "deserialize_optional_decimal"
6809    )]
6810    pub unrealized_short_term_pnl: Option<Decimal>,
6811
6812    /// Unrealized long-term P&L
6813    #[serde(
6814        rename = "@unrealizedLongTermPnl",
6815        default,
6816        deserialize_with = "deserialize_optional_decimal"
6817    )]
6818    pub unrealized_long_term_pnl: Option<Decimal>,
6819
6820    /// Unrealized total P&L
6821    #[serde(
6822        rename = "@unrealizedTotalPnl",
6823        default,
6824        deserialize_with = "deserialize_optional_decimal"
6825    )]
6826    pub unrealized_total_pnl: Option<Decimal>,
6827
6828    /// Total income
6829    #[serde(
6830        rename = "@totalIncome",
6831        default,
6832        deserialize_with = "deserialize_optional_decimal"
6833    )]
6834    pub total_income: Option<Decimal>,
6835
6836    /// Level of detail
6837    #[serde(rename = "@levelOfDetail", default)]
6838    pub level_of_detail: Option<String>,
6839
6840    /// `securityID` (added for full ibflex coverage)
6841    #[serde(
6842        rename = "@securityID",
6843        default,
6844        deserialize_with = "deserialize_optional_string"
6845    )]
6846    pub security_id: Option<String>,
6847
6848    /// `underlyingSecurityID` (added for full ibflex coverage)
6849    #[serde(
6850        rename = "@underlyingSecurityID",
6851        default,
6852        deserialize_with = "deserialize_optional_string"
6853    )]
6854    pub underlying_security_id: Option<String>,
6855
6856    /// `underlyingListingExchange` (added for full ibflex coverage)
6857    #[serde(
6858        rename = "@underlyingListingExchange",
6859        default,
6860        deserialize_with = "deserialize_optional_string"
6861    )]
6862    pub underlying_listing_exchange: Option<String>,
6863
6864    /// `realizedSTProfit` (added for full ibflex coverage)
6865    #[serde(
6866        rename = "@realizedSTProfit",
6867        default,
6868        deserialize_with = "deserialize_optional_decimal"
6869    )]
6870    pub realized_st_profit: Option<Decimal>,
6871
6872    /// `realizedSTLoss` (added for full ibflex coverage)
6873    #[serde(
6874        rename = "@realizedSTLoss",
6875        default,
6876        deserialize_with = "deserialize_optional_decimal"
6877    )]
6878    pub realized_st_loss: Option<Decimal>,
6879
6880    /// `realizedLTProfit` (added for full ibflex coverage)
6881    #[serde(
6882        rename = "@realizedLTProfit",
6883        default,
6884        deserialize_with = "deserialize_optional_decimal"
6885    )]
6886    pub realized_lt_profit: Option<Decimal>,
6887
6888    /// `realizedLTLoss` (added for full ibflex coverage)
6889    #[serde(
6890        rename = "@realizedLTLoss",
6891        default,
6892        deserialize_with = "deserialize_optional_decimal"
6893    )]
6894    pub realized_lt_loss: Option<Decimal>,
6895
6896    /// `totalRealizedPnl` (added for full ibflex coverage)
6897    #[serde(
6898        rename = "@totalRealizedPnl",
6899        default,
6900        deserialize_with = "deserialize_optional_decimal"
6901    )]
6902    pub total_realized_pnl: Option<Decimal>,
6903
6904    /// `unrealizedProfit` (added for full ibflex coverage)
6905    #[serde(
6906        rename = "@unrealizedProfit",
6907        default,
6908        deserialize_with = "deserialize_optional_decimal"
6909    )]
6910    pub unrealized_profit: Option<Decimal>,
6911
6912    /// `unrealizedLoss` (added for full ibflex coverage)
6913    #[serde(
6914        rename = "@unrealizedLoss",
6915        default,
6916        deserialize_with = "deserialize_optional_decimal"
6917    )]
6918    pub unrealized_loss: Option<Decimal>,
6919
6920    /// `totalUnrealizedPnl` (added for full ibflex coverage)
6921    #[serde(
6922        rename = "@totalUnrealizedPnl",
6923        default,
6924        deserialize_with = "deserialize_optional_decimal"
6925    )]
6926    pub total_unrealized_pnl: Option<Decimal>,
6927
6928    /// `totalFifoPnl` (added for full ibflex coverage)
6929    #[serde(
6930        rename = "@totalFifoPnl",
6931        default,
6932        deserialize_with = "deserialize_optional_decimal"
6933    )]
6934    pub total_fifo_pnl: Option<Decimal>,
6935
6936    /// `totalRealizedCapitalGainsPnl` (added for full ibflex coverage)
6937    #[serde(
6938        rename = "@totalRealizedCapitalGainsPnl",
6939        default,
6940        deserialize_with = "deserialize_optional_decimal"
6941    )]
6942    pub total_realized_capital_gains_pnl: Option<Decimal>,
6943
6944    /// `totalRealizedFxPnl` (added for full ibflex coverage)
6945    #[serde(
6946        rename = "@totalRealizedFxPnl",
6947        default,
6948        deserialize_with = "deserialize_optional_decimal"
6949    )]
6950    pub total_realized_fx_pnl: Option<Decimal>,
6951
6952    /// `totalUnrealizedCapitalGainsPnl` (added for full ibflex coverage)
6953    #[serde(
6954        rename = "@totalUnrealizedCapitalGainsPnl",
6955        default,
6956        deserialize_with = "deserialize_optional_decimal"
6957    )]
6958    pub total_unrealized_capital_gains_pnl: Option<Decimal>,
6959
6960    /// `totalUnrealizedFxPnl` (added for full ibflex coverage)
6961    #[serde(
6962        rename = "@totalUnrealizedFxPnl",
6963        default,
6964        deserialize_with = "deserialize_optional_decimal"
6965    )]
6966    pub total_unrealized_fx_pnl: Option<Decimal>,
6967
6968    /// `totalCapitalGainsPnl` (added for full ibflex coverage)
6969    #[serde(
6970        rename = "@totalCapitalGainsPnl",
6971        default,
6972        deserialize_with = "deserialize_optional_decimal"
6973    )]
6974    pub total_capital_gains_pnl: Option<Decimal>,
6975
6976    /// `totalFxPnl` (added for full ibflex coverage)
6977    #[serde(
6978        rename = "@totalFxPnl",
6979        default,
6980        deserialize_with = "deserialize_optional_decimal"
6981    )]
6982    pub total_fx_pnl: Option<Decimal>,
6983
6984    /// `transferredPnl` (added for full ibflex coverage)
6985    #[serde(
6986        rename = "@transferredPnl",
6987        default,
6988        deserialize_with = "deserialize_optional_decimal"
6989    )]
6990    pub transferred_pnl: Option<Decimal>,
6991
6992    /// `transferredCapitalGainsPnl` (added for full ibflex coverage)
6993    #[serde(
6994        rename = "@transferredCapitalGainsPnl",
6995        default,
6996        deserialize_with = "deserialize_optional_decimal"
6997    )]
6998    pub transferred_capital_gains_pnl: Option<Decimal>,
6999
7000    /// `transferredFxPnl` (added for full ibflex coverage)
7001    #[serde(
7002        rename = "@transferredFxPnl",
7003        default,
7004        deserialize_with = "deserialize_optional_decimal"
7005    )]
7006    pub transferred_fx_pnl: Option<Decimal>,
7007
7008    /// `sedol` (added for full ibflex coverage)
7009    #[serde(
7010        rename = "@sedol",
7011        default,
7012        deserialize_with = "deserialize_optional_string"
7013    )]
7014    pub sedol: Option<String>,
7015
7016    /// `securityIDType` (added for full ibflex coverage)
7017    #[serde(
7018        rename = "@securityIDType",
7019        default,
7020        deserialize_with = "deserialize_optional_string"
7021    )]
7022    pub security_id_type: Option<String>,
7023
7024    /// `issuer` (added for full ibflex coverage)
7025    #[serde(
7026        rename = "@issuer",
7027        default,
7028        deserialize_with = "deserialize_optional_string"
7029    )]
7030    pub issuer: Option<String>,
7031
7032    /// `multiplier` (added for full ibflex coverage)
7033    #[serde(
7034        rename = "@multiplier",
7035        default,
7036        deserialize_with = "deserialize_optional_decimal"
7037    )]
7038    pub multiplier: Option<Decimal>,
7039
7040    /// `strike` (added for full ibflex coverage)
7041    #[serde(
7042        rename = "@strike",
7043        default,
7044        deserialize_with = "deserialize_optional_decimal"
7045    )]
7046    pub strike: Option<Decimal>,
7047
7048    /// `expiry` (added for full ibflex coverage)
7049    #[serde(
7050        rename = "@expiry",
7051        default,
7052        deserialize_with = "deserialize_optional_date"
7053    )]
7054    pub expiry: Option<NaiveDate>,
7055
7056    /// `putCall` (added for full ibflex coverage)
7057    #[serde(rename = "@putCall", default)]
7058    pub put_call: Option<PutCall>,
7059
7060    /// `principalAdjustFactor` (added for full ibflex coverage)
7061    #[serde(
7062        rename = "@principalAdjustFactor",
7063        default,
7064        deserialize_with = "deserialize_optional_decimal"
7065    )]
7066    pub principal_adjust_factor: Option<Decimal>,
7067
7068    /// `unrealizedSTProfit` (added for full ibflex coverage)
7069    #[serde(
7070        rename = "@unrealizedSTProfit",
7071        default,
7072        deserialize_with = "deserialize_optional_decimal"
7073    )]
7074    pub unrealized_st_profit: Option<Decimal>,
7075
7076    /// `unrealizedSTLoss` (added for full ibflex coverage)
7077    #[serde(
7078        rename = "@unrealizedSTLoss",
7079        default,
7080        deserialize_with = "deserialize_optional_decimal"
7081    )]
7082    pub unrealized_st_loss: Option<Decimal>,
7083
7084    /// `unrealizedLTProfit` (added for full ibflex coverage)
7085    #[serde(
7086        rename = "@unrealizedLTProfit",
7087        default,
7088        deserialize_with = "deserialize_optional_decimal"
7089    )]
7090    pub unrealized_lt_profit: Option<Decimal>,
7091
7092    /// `unrealizedLTLoss` (added for full ibflex coverage)
7093    #[serde(
7094        rename = "@unrealizedLTLoss",
7095        default,
7096        deserialize_with = "deserialize_optional_decimal"
7097    )]
7098    pub unrealized_lt_loss: Option<Decimal>,
7099
7100    /// `costAdj` (added for full ibflex coverage)
7101    #[serde(
7102        rename = "@costAdj",
7103        default,
7104        deserialize_with = "deserialize_optional_decimal"
7105    )]
7106    pub cost_adj: Option<Decimal>,
7107
7108    /// `code` (added for full ibflex coverage)
7109    #[serde(
7110        rename = "@code",
7111        default,
7112        deserialize_with = "deserialize_optional_string"
7113    )]
7114    pub code: Option<String>,
7115
7116    /// `serialNumber` (added for full ibflex coverage)
7117    #[serde(
7118        rename = "@serialNumber",
7119        default,
7120        deserialize_with = "deserialize_optional_string"
7121    )]
7122    pub serial_number: Option<String>,
7123
7124    /// `deliveryType` (added for full ibflex coverage)
7125    #[serde(
7126        rename = "@deliveryType",
7127        default,
7128        deserialize_with = "deserialize_optional_string"
7129    )]
7130    pub delivery_type: Option<String>,
7131
7132    /// `commodityType` (added for full ibflex coverage)
7133    #[serde(
7134        rename = "@commodityType",
7135        default,
7136        deserialize_with = "deserialize_optional_string"
7137    )]
7138    pub commodity_type: Option<String>,
7139
7140    /// `fineness` (added for full ibflex coverage)
7141    #[serde(
7142        rename = "@fineness",
7143        default,
7144        deserialize_with = "deserialize_optional_decimal"
7145    )]
7146    pub fineness: Option<Decimal>,
7147
7148    /// `weight` (added for full ibflex coverage)
7149    #[serde(
7150        rename = "@weight",
7151        default,
7152        deserialize_with = "deserialize_optional_string"
7153    )]
7154    pub weight: Option<String>,
7155
7156    /// `subCategory` (added for full ibflex coverage)
7157    #[serde(
7158        rename = "@subCategory",
7159        default,
7160        deserialize_with = "deserialize_optional_string"
7161    )]
7162    pub sub_category: Option<String>,
7163
7164    /// `figi` (added for full ibflex coverage)
7165    #[serde(
7166        rename = "@figi",
7167        default,
7168        deserialize_with = "deserialize_optional_string"
7169    )]
7170    pub figi: Option<String>,
7171
7172    /// `issuerCountryCode` (added for full ibflex coverage)
7173    #[serde(
7174        rename = "@issuerCountryCode",
7175        default,
7176        deserialize_with = "deserialize_optional_string"
7177    )]
7178    pub issuer_country_code: Option<String>,
7179}
7180
7181/// Month-to-date/Year-to-date performance summary
7182#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
7183pub struct MTDYTDPerformanceSummary {
7184    /// Account ID
7185    #[serde(
7186        rename = "@accountId",
7187        default,
7188        deserialize_with = "deserialize_optional_string"
7189    )]
7190    pub account_id: Option<String>,
7191
7192    /// Account alias
7193    #[serde(rename = "@acctAlias", default)]
7194    pub acct_alias: Option<String>,
7195
7196    /// Model
7197    #[serde(rename = "@model", default)]
7198    pub model: Option<String>,
7199
7200    /// Symbol
7201    #[serde(rename = "@symbol", default)]
7202    pub symbol: Option<String>,
7203
7204    /// Contract ID
7205    #[serde(rename = "@conid", default)]
7206    pub conid: Option<String>,
7207
7208    /// Asset category
7209    #[serde(rename = "@assetCategory", default)]
7210    pub asset_category: Option<AssetCategory>,
7211
7212    // MTD fields
7213    /// MTD realized P&L
7214    #[serde(
7215        rename = "@mtdRealizedPnl",
7216        default,
7217        deserialize_with = "deserialize_optional_decimal"
7218    )]
7219    pub mtd_realized_pnl: Option<Decimal>,
7220
7221    /// MTD unrealized P&L
7222    #[serde(
7223        rename = "@mtdUnrealizedPnl",
7224        default,
7225        deserialize_with = "deserialize_optional_decimal"
7226    )]
7227    pub mtd_unrealized_pnl: Option<Decimal>,
7228
7229    /// MTD commissions
7230    #[serde(
7231        rename = "@mtdCommissions",
7232        default,
7233        deserialize_with = "deserialize_optional_decimal"
7234    )]
7235    pub mtd_commissions: Option<Decimal>,
7236
7237    /// MTD fees
7238    #[serde(
7239        rename = "@mtdFees",
7240        default,
7241        deserialize_with = "deserialize_optional_decimal"
7242    )]
7243    pub mtd_fees: Option<Decimal>,
7244
7245    // YTD fields
7246    /// YTD realized P&L
7247    #[serde(
7248        rename = "@ytdRealizedPnl",
7249        default,
7250        deserialize_with = "deserialize_optional_decimal"
7251    )]
7252    pub ytd_realized_pnl: Option<Decimal>,
7253
7254    /// YTD unrealized P&L
7255    #[serde(
7256        rename = "@ytdUnrealizedPnl",
7257        default,
7258        deserialize_with = "deserialize_optional_decimal"
7259    )]
7260    pub ytd_unrealized_pnl: Option<Decimal>,
7261
7262    /// YTD commissions
7263    #[serde(
7264        rename = "@ytdCommissions",
7265        default,
7266        deserialize_with = "deserialize_optional_decimal"
7267    )]
7268    pub ytd_commissions: Option<Decimal>,
7269
7270    /// YTD fees
7271    #[serde(
7272        rename = "@ytdFees",
7273        default,
7274        deserialize_with = "deserialize_optional_decimal"
7275    )]
7276    pub ytd_fees: Option<Decimal>,
7277
7278    /// Level of detail
7279    #[serde(rename = "@levelOfDetail", default)]
7280    pub level_of_detail: Option<String>,
7281
7282    /// `description` (added for full ibflex coverage)
7283    #[serde(
7284        rename = "@description",
7285        default,
7286        deserialize_with = "deserialize_optional_string"
7287    )]
7288    pub description: Option<String>,
7289
7290    /// `securityID` (added for full ibflex coverage)
7291    #[serde(
7292        rename = "@securityID",
7293        default,
7294        deserialize_with = "deserialize_optional_string"
7295    )]
7296    pub security_id: Option<String>,
7297
7298    /// `cusip` (added for full ibflex coverage)
7299    #[serde(
7300        rename = "@cusip",
7301        default,
7302        deserialize_with = "deserialize_optional_string"
7303    )]
7304    pub cusip: Option<String>,
7305
7306    /// `isin` (added for full ibflex coverage)
7307    #[serde(
7308        rename = "@isin",
7309        default,
7310        deserialize_with = "deserialize_optional_string"
7311    )]
7312    pub isin: Option<String>,
7313
7314    /// `listingExchange` (added for full ibflex coverage)
7315    #[serde(
7316        rename = "@listingExchange",
7317        default,
7318        deserialize_with = "deserialize_optional_string"
7319    )]
7320    pub listing_exchange: Option<String>,
7321
7322    /// `underlyingConid` (added for full ibflex coverage)
7323    #[serde(
7324        rename = "@underlyingConid",
7325        default,
7326        deserialize_with = "deserialize_optional_string"
7327    )]
7328    pub underlying_conid: Option<String>,
7329
7330    /// `underlyingSecurityID` (added for full ibflex coverage)
7331    #[serde(
7332        rename = "@underlyingSecurityID",
7333        default,
7334        deserialize_with = "deserialize_optional_string"
7335    )]
7336    pub underlying_security_id: Option<String>,
7337
7338    /// `underlyingListingExchange` (added for full ibflex coverage)
7339    #[serde(
7340        rename = "@underlyingListingExchange",
7341        default,
7342        deserialize_with = "deserialize_optional_string"
7343    )]
7344    pub underlying_listing_exchange: Option<String>,
7345
7346    /// `mtmMTD` (added for full ibflex coverage)
7347    #[serde(
7348        rename = "@mtmMTD",
7349        default,
7350        deserialize_with = "deserialize_optional_decimal"
7351    )]
7352    pub mtm_mtd: Option<Decimal>,
7353
7354    /// `mtmYTD` (added for full ibflex coverage)
7355    #[serde(
7356        rename = "@mtmYTD",
7357        default,
7358        deserialize_with = "deserialize_optional_decimal"
7359    )]
7360    pub mtm_ytd: Option<Decimal>,
7361
7362    /// `realSTMTD` (added for full ibflex coverage)
7363    #[serde(
7364        rename = "@realSTMTD",
7365        default,
7366        deserialize_with = "deserialize_optional_decimal"
7367    )]
7368    pub real_stmtd: Option<Decimal>,
7369
7370    /// `realSTYTD` (added for full ibflex coverage)
7371    #[serde(
7372        rename = "@realSTYTD",
7373        default,
7374        deserialize_with = "deserialize_optional_decimal"
7375    )]
7376    pub real_stytd: Option<Decimal>,
7377
7378    /// `realLTMTD` (added for full ibflex coverage)
7379    #[serde(
7380        rename = "@realLTMTD",
7381        default,
7382        deserialize_with = "deserialize_optional_decimal"
7383    )]
7384    pub real_ltmtd: Option<Decimal>,
7385
7386    /// `realLTYTD` (added for full ibflex coverage)
7387    #[serde(
7388        rename = "@realLTYTD",
7389        default,
7390        deserialize_with = "deserialize_optional_decimal"
7391    )]
7392    pub real_ltytd: Option<Decimal>,
7393
7394    /// `securityIDType` (added for full ibflex coverage)
7395    #[serde(
7396        rename = "@securityIDType",
7397        default,
7398        deserialize_with = "deserialize_optional_string"
7399    )]
7400    pub security_id_type: Option<String>,
7401
7402    /// `underlyingSymbol` (added for full ibflex coverage)
7403    #[serde(
7404        rename = "@underlyingSymbol",
7405        default,
7406        deserialize_with = "deserialize_optional_string"
7407    )]
7408    pub underlying_symbol: Option<String>,
7409
7410    /// `issuer` (added for full ibflex coverage)
7411    #[serde(
7412        rename = "@issuer",
7413        default,
7414        deserialize_with = "deserialize_optional_string"
7415    )]
7416    pub issuer: Option<String>,
7417
7418    /// `multiplier` (added for full ibflex coverage)
7419    #[serde(
7420        rename = "@multiplier",
7421        default,
7422        deserialize_with = "deserialize_optional_decimal"
7423    )]
7424    pub multiplier: Option<Decimal>,
7425
7426    /// `strike` (added for full ibflex coverage)
7427    #[serde(
7428        rename = "@strike",
7429        default,
7430        deserialize_with = "deserialize_optional_decimal"
7431    )]
7432    pub strike: Option<Decimal>,
7433
7434    /// `expiry` (added for full ibflex coverage)
7435    #[serde(
7436        rename = "@expiry",
7437        default,
7438        deserialize_with = "deserialize_optional_date"
7439    )]
7440    pub expiry: Option<NaiveDate>,
7441
7442    /// `putCall` (added for full ibflex coverage)
7443    #[serde(rename = "@putCall", default)]
7444    pub put_call: Option<PutCall>,
7445
7446    /// `principalAdjustFactor` (added for full ibflex coverage)
7447    #[serde(
7448        rename = "@principalAdjustFactor",
7449        default,
7450        deserialize_with = "deserialize_optional_decimal"
7451    )]
7452    pub principal_adjust_factor: Option<Decimal>,
7453
7454    /// `realizedPnlMTD` (added for full ibflex coverage)
7455    #[serde(
7456        rename = "@realizedPnlMTD",
7457        default,
7458        deserialize_with = "deserialize_optional_decimal"
7459    )]
7460    pub realized_pnl_mtd: Option<Decimal>,
7461
7462    /// `realizedCapitalGainsPnlMTD` (added for full ibflex coverage)
7463    #[serde(
7464        rename = "@realizedCapitalGainsPnlMTD",
7465        default,
7466        deserialize_with = "deserialize_optional_decimal"
7467    )]
7468    pub realized_capital_gains_pnl_mtd: Option<Decimal>,
7469
7470    /// `realizedFxPnlMTD` (added for full ibflex coverage)
7471    #[serde(
7472        rename = "@realizedFxPnlMTD",
7473        default,
7474        deserialize_with = "deserialize_optional_decimal"
7475    )]
7476    pub realized_fx_pnl_mtd: Option<Decimal>,
7477
7478    /// `realizedPnlYTD` (added for full ibflex coverage)
7479    #[serde(
7480        rename = "@realizedPnlYTD",
7481        default,
7482        deserialize_with = "deserialize_optional_decimal"
7483    )]
7484    pub realized_pnl_ytd: Option<Decimal>,
7485
7486    /// `realizedCapitalGainsPnlYTD` (added for full ibflex coverage)
7487    #[serde(
7488        rename = "@realizedCapitalGainsPnlYTD",
7489        default,
7490        deserialize_with = "deserialize_optional_decimal"
7491    )]
7492    pub realized_capital_gains_pnl_ytd: Option<Decimal>,
7493
7494    /// `realizedFxPnlYTD` (added for full ibflex coverage)
7495    #[serde(
7496        rename = "@realizedFxPnlYTD",
7497        default,
7498        deserialize_with = "deserialize_optional_decimal"
7499    )]
7500    pub realized_fx_pnl_ytd: Option<Decimal>,
7501
7502    /// `brokerFees` (added for full ibflex coverage)
7503    #[serde(
7504        rename = "@brokerFees",
7505        default,
7506        deserialize_with = "deserialize_optional_decimal"
7507    )]
7508    pub broker_fees: Option<Decimal>,
7509
7510    /// `brokerFeesSec` (added for full ibflex coverage)
7511    #[serde(
7512        rename = "@brokerFeesSec",
7513        default,
7514        deserialize_with = "deserialize_optional_decimal"
7515    )]
7516    pub broker_fees_sec: Option<Decimal>,
7517
7518    /// `brokerFeesCom` (added for full ibflex coverage)
7519    #[serde(
7520        rename = "@brokerFeesCom",
7521        default,
7522        deserialize_with = "deserialize_optional_decimal"
7523    )]
7524    pub broker_fees_com: Option<Decimal>,
7525
7526    /// `brokerFeesMTD` (added for full ibflex coverage)
7527    #[serde(
7528        rename = "@brokerFeesMTD",
7529        default,
7530        deserialize_with = "deserialize_optional_decimal"
7531    )]
7532    pub broker_fees_mtd: Option<Decimal>,
7533
7534    /// `brokerFeesYTD` (added for full ibflex coverage)
7535    #[serde(
7536        rename = "@brokerFeesYTD",
7537        default,
7538        deserialize_with = "deserialize_optional_decimal"
7539    )]
7540    pub broker_fees_ytd: Option<Decimal>,
7541
7542    /// `serialNumber` (added for full ibflex coverage)
7543    #[serde(
7544        rename = "@serialNumber",
7545        default,
7546        deserialize_with = "deserialize_optional_string"
7547    )]
7548    pub serial_number: Option<String>,
7549
7550    /// `deliveryType` (added for full ibflex coverage)
7551    #[serde(
7552        rename = "@deliveryType",
7553        default,
7554        deserialize_with = "deserialize_optional_string"
7555    )]
7556    pub delivery_type: Option<String>,
7557
7558    /// `commodityType` (added for full ibflex coverage)
7559    #[serde(
7560        rename = "@commodityType",
7561        default,
7562        deserialize_with = "deserialize_optional_string"
7563    )]
7564    pub commodity_type: Option<String>,
7565
7566    /// `fineness` (added for full ibflex coverage)
7567    #[serde(
7568        rename = "@fineness",
7569        default,
7570        deserialize_with = "deserialize_optional_decimal"
7571    )]
7572    pub fineness: Option<Decimal>,
7573
7574    /// `weight` (added for full ibflex coverage)
7575    #[serde(
7576        rename = "@weight",
7577        default,
7578        deserialize_with = "deserialize_optional_string"
7579    )]
7580    pub weight: Option<String>,
7581}
7582
7583// =============================================================================
7584// Statement of Funds Types
7585// =============================================================================
7586
7587/// Statement of funds line item
7588///
7589/// Represents a single cash flow entry in the statement of funds,
7590/// tracking debits and credits with running balance.
7591#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
7592pub struct StatementOfFundsLine {
7593    /// Account ID
7594    #[serde(
7595        rename = "@accountId",
7596        default,
7597        deserialize_with = "deserialize_optional_string"
7598    )]
7599    pub account_id: Option<String>,
7600
7601    /// Account alias
7602    #[serde(rename = "@acctAlias", default)]
7603    pub acct_alias: Option<String>,
7604
7605    /// Model
7606    #[serde(rename = "@model", default)]
7607    pub model: Option<String>,
7608
7609    /// Report date
7610    #[serde(
7611        rename = "@reportDate",
7612        default,
7613        deserialize_with = "deserialize_optional_date"
7614    )]
7615    pub report_date: Option<NaiveDate>,
7616
7617    /// Date
7618    #[serde(
7619        rename = "@date",
7620        default,
7621        deserialize_with = "deserialize_optional_date"
7622    )]
7623    pub date: Option<NaiveDate>,
7624
7625    /// Currency
7626    #[serde(rename = "@currency", default)]
7627    pub currency: Option<String>,
7628
7629    /// Activity code
7630    #[serde(rename = "@activityCode", default)]
7631    pub activity_code: Option<String>,
7632
7633    /// Activity description
7634    #[serde(rename = "@activityDescription", default)]
7635    pub activity_description: Option<String>,
7636
7637    /// Trade ID
7638    #[serde(rename = "@tradeID", default)]
7639    pub trade_id: Option<String>,
7640
7641    /// Symbol
7642    #[serde(rename = "@symbol", default)]
7643    pub symbol: Option<String>,
7644
7645    /// Contract ID
7646    #[serde(rename = "@conid", default)]
7647    pub conid: Option<String>,
7648
7649    /// Debit amount
7650    #[serde(
7651        rename = "@debit",
7652        default,
7653        deserialize_with = "deserialize_optional_decimal"
7654    )]
7655    pub debit: Option<Decimal>,
7656
7657    /// Credit amount
7658    #[serde(
7659        rename = "@credit",
7660        default,
7661        deserialize_with = "deserialize_optional_decimal"
7662    )]
7663    pub credit: Option<Decimal>,
7664
7665    /// Amount
7666    #[serde(
7667        rename = "@amount",
7668        default,
7669        deserialize_with = "deserialize_optional_decimal"
7670    )]
7671    pub amount: Option<Decimal>,
7672
7673    /// Balance
7674    #[serde(
7675        rename = "@balance",
7676        default,
7677        deserialize_with = "deserialize_optional_decimal"
7678    )]
7679    pub balance: Option<Decimal>,
7680
7681    /// FX rate to base
7682    #[serde(
7683        rename = "@fxRateToBase",
7684        default,
7685        deserialize_with = "deserialize_optional_decimal"
7686    )]
7687    pub fx_rate_to_base: Option<Decimal>,
7688
7689    /// Level of detail
7690    #[serde(rename = "@levelOfDetail", default)]
7691    pub level_of_detail: Option<String>,
7692
7693    /// `assetCategory` (added for full ibflex coverage)
7694    #[serde(rename = "@assetCategory", default)]
7695    pub asset_category: Option<AssetCategory>,
7696
7697    /// `buySell` (added for full ibflex coverage)
7698    #[serde(
7699        rename = "@buySell",
7700        default,
7701        deserialize_with = "deserialize_optional_string"
7702    )]
7703    pub buy_sell: Option<String>,
7704
7705    /// `description` (added for full ibflex coverage)
7706    #[serde(
7707        rename = "@description",
7708        default,
7709        deserialize_with = "deserialize_optional_string"
7710    )]
7711    pub description: Option<String>,
7712
7713    /// `securityID` (added for full ibflex coverage)
7714    #[serde(
7715        rename = "@securityID",
7716        default,
7717        deserialize_with = "deserialize_optional_string"
7718    )]
7719    pub security_id: Option<String>,
7720
7721    /// `securityIDType` (added for full ibflex coverage)
7722    #[serde(
7723        rename = "@securityIDType",
7724        default,
7725        deserialize_with = "deserialize_optional_string"
7726    )]
7727    pub security_id_type: Option<String>,
7728
7729    /// `cusip` (added for full ibflex coverage)
7730    #[serde(
7731        rename = "@cusip",
7732        default,
7733        deserialize_with = "deserialize_optional_string"
7734    )]
7735    pub cusip: Option<String>,
7736
7737    /// `isin` (added for full ibflex coverage)
7738    #[serde(
7739        rename = "@isin",
7740        default,
7741        deserialize_with = "deserialize_optional_string"
7742    )]
7743    pub isin: Option<String>,
7744
7745    /// `underlyingConid` (added for full ibflex coverage)
7746    #[serde(
7747        rename = "@underlyingConid",
7748        default,
7749        deserialize_with = "deserialize_optional_string"
7750    )]
7751    pub underlying_conid: Option<String>,
7752
7753    /// `underlyingSymbol` (added for full ibflex coverage)
7754    #[serde(
7755        rename = "@underlyingSymbol",
7756        default,
7757        deserialize_with = "deserialize_optional_string"
7758    )]
7759    pub underlying_symbol: Option<String>,
7760
7761    /// `issuer` (added for full ibflex coverage)
7762    #[serde(
7763        rename = "@issuer",
7764        default,
7765        deserialize_with = "deserialize_optional_string"
7766    )]
7767    pub issuer: Option<String>,
7768
7769    /// `multiplier` (added for full ibflex coverage)
7770    #[serde(
7771        rename = "@multiplier",
7772        default,
7773        deserialize_with = "deserialize_optional_decimal"
7774    )]
7775    pub multiplier: Option<Decimal>,
7776
7777    /// `strike` (added for full ibflex coverage)
7778    #[serde(
7779        rename = "@strike",
7780        default,
7781        deserialize_with = "deserialize_optional_decimal"
7782    )]
7783    pub strike: Option<Decimal>,
7784
7785    /// `expiry` (added for full ibflex coverage)
7786    #[serde(
7787        rename = "@expiry",
7788        default,
7789        deserialize_with = "deserialize_optional_date"
7790    )]
7791    pub expiry: Option<NaiveDate>,
7792
7793    /// `putCall` (added for full ibflex coverage)
7794    #[serde(rename = "@putCall", default)]
7795    pub put_call: Option<PutCall>,
7796
7797    /// `principalAdjustFactor` (added for full ibflex coverage)
7798    #[serde(
7799        rename = "@principalAdjustFactor",
7800        default,
7801        deserialize_with = "deserialize_optional_decimal"
7802    )]
7803    pub principal_adjust_factor: Option<Decimal>,
7804
7805    /// `listingExchange` (added for full ibflex coverage)
7806    #[serde(
7807        rename = "@listingExchange",
7808        default,
7809        deserialize_with = "deserialize_optional_string"
7810    )]
7811    pub listing_exchange: Option<String>,
7812
7813    /// `underlyingSecurityID` (added for full ibflex coverage)
7814    #[serde(
7815        rename = "@underlyingSecurityID",
7816        default,
7817        deserialize_with = "deserialize_optional_string"
7818    )]
7819    pub underlying_security_id: Option<String>,
7820
7821    /// `underlyingListingExchange` (added for full ibflex coverage)
7822    #[serde(
7823        rename = "@underlyingListingExchange",
7824        default,
7825        deserialize_with = "deserialize_optional_string"
7826    )]
7827    pub underlying_listing_exchange: Option<String>,
7828
7829    /// `settleDate` (added for full ibflex coverage)
7830    #[serde(
7831        rename = "@settleDate",
7832        default,
7833        deserialize_with = "deserialize_optional_date"
7834    )]
7835    pub settle_date: Option<NaiveDate>,
7836
7837    /// `orderID` (added for full ibflex coverage)
7838    #[serde(
7839        rename = "@orderID",
7840        default,
7841        deserialize_with = "deserialize_optional_string"
7842    )]
7843    pub order_id: Option<String>,
7844
7845    /// `tradeQuantity` (added for full ibflex coverage)
7846    #[serde(
7847        rename = "@tradeQuantity",
7848        default,
7849        deserialize_with = "deserialize_optional_decimal"
7850    )]
7851    pub trade_quantity: Option<Decimal>,
7852
7853    /// `tradePrice` (added for full ibflex coverage)
7854    #[serde(
7855        rename = "@tradePrice",
7856        default,
7857        deserialize_with = "deserialize_optional_decimal"
7858    )]
7859    pub trade_price: Option<Decimal>,
7860
7861    /// `tradeGross` (added for full ibflex coverage)
7862    #[serde(
7863        rename = "@tradeGross",
7864        default,
7865        deserialize_with = "deserialize_optional_decimal"
7866    )]
7867    pub trade_gross: Option<Decimal>,
7868
7869    /// `tradeCommission` (added for full ibflex coverage)
7870    #[serde(
7871        rename = "@tradeCommission",
7872        default,
7873        deserialize_with = "deserialize_optional_decimal"
7874    )]
7875    pub trade_commission: Option<Decimal>,
7876
7877    /// `tradeTax` (added for full ibflex coverage)
7878    #[serde(
7879        rename = "@tradeTax",
7880        default,
7881        deserialize_with = "deserialize_optional_decimal"
7882    )]
7883    pub trade_tax: Option<Decimal>,
7884
7885    /// `tradeCode` (added for full ibflex coverage)
7886    #[serde(
7887        rename = "@tradeCode",
7888        default,
7889        deserialize_with = "deserialize_optional_string"
7890    )]
7891    pub trade_code: Option<String>,
7892
7893    /// `transactionID` (added for full ibflex coverage)
7894    #[serde(
7895        rename = "@transactionID",
7896        default,
7897        deserialize_with = "deserialize_optional_string"
7898    )]
7899    pub transaction_id: Option<String>,
7900
7901    /// `serialNumber` (added for full ibflex coverage)
7902    #[serde(
7903        rename = "@serialNumber",
7904        default,
7905        deserialize_with = "deserialize_optional_string"
7906    )]
7907    pub serial_number: Option<String>,
7908
7909    /// `deliveryType` (added for full ibflex coverage)
7910    #[serde(
7911        rename = "@deliveryType",
7912        default,
7913        deserialize_with = "deserialize_optional_string"
7914    )]
7915    pub delivery_type: Option<String>,
7916
7917    /// `commodityType` (added for full ibflex coverage)
7918    #[serde(
7919        rename = "@commodityType",
7920        default,
7921        deserialize_with = "deserialize_optional_string"
7922    )]
7923    pub commodity_type: Option<String>,
7924
7925    /// `fineness` (added for full ibflex coverage)
7926    #[serde(
7927        rename = "@fineness",
7928        default,
7929        deserialize_with = "deserialize_optional_decimal"
7930    )]
7931    pub fineness: Option<Decimal>,
7932
7933    /// `weight` (added for full ibflex coverage)
7934    #[serde(
7935        rename = "@weight",
7936        default,
7937        deserialize_with = "deserialize_optional_string"
7938    )]
7939    pub weight: Option<String>,
7940
7941    /// `actionID` (added for full ibflex coverage)
7942    #[serde(
7943        rename = "@actionID",
7944        default,
7945        deserialize_with = "deserialize_optional_string"
7946    )]
7947    pub action_id: Option<String>,
7948
7949    /// `subCategory` (added for full ibflex coverage)
7950    #[serde(
7951        rename = "@subCategory",
7952        default,
7953        deserialize_with = "deserialize_optional_string"
7954    )]
7955    pub sub_category: Option<String>,
7956
7957    /// `figi` (added for full ibflex coverage)
7958    #[serde(
7959        rename = "@figi",
7960        default,
7961        deserialize_with = "deserialize_optional_string"
7962    )]
7963    pub figi: Option<String>,
7964
7965    /// `issuerCountryCode` (added for full ibflex coverage)
7966    #[serde(
7967        rename = "@issuerCountryCode",
7968        default,
7969        deserialize_with = "deserialize_optional_string"
7970    )]
7971    pub issuer_country_code: Option<String>,
7972
7973    /// `relatedTradeID` (added for full ibflex coverage)
7974    #[serde(
7975        rename = "@relatedTradeID",
7976        default,
7977        deserialize_with = "deserialize_optional_string"
7978    )]
7979    pub related_trade_id: Option<String>,
7980
7981    /// `origTransactionID` (added for full ibflex coverage)
7982    #[serde(
7983        rename = "@origTransactionID",
7984        default,
7985        deserialize_with = "deserialize_optional_string"
7986    )]
7987    pub orig_transaction_id: Option<String>,
7988
7989    /// `relatedTransactionID` (added for full ibflex coverage)
7990    #[serde(
7991        rename = "@relatedTransactionID",
7992        default,
7993        deserialize_with = "deserialize_optional_string"
7994    )]
7995    pub related_transaction_id: Option<String>,
7996}
7997
7998// =============================================================================
7999// Position Value Change Types
8000// =============================================================================
8001
8002/// Change in position value for reconciliation
8003///
8004/// Tracks how position values changed due to various factors like
8005/// transactions, MTM changes, corporate actions, and FX translation.
8006#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
8007pub struct ChangeInPositionValue {
8008    /// Account ID
8009    #[serde(
8010        rename = "@accountId",
8011        default,
8012        deserialize_with = "deserialize_optional_string"
8013    )]
8014    pub account_id: Option<String>,
8015
8016    /// Account alias
8017    #[serde(rename = "@acctAlias", default)]
8018    pub acct_alias: Option<String>,
8019
8020    /// Model
8021    #[serde(rename = "@model", default)]
8022    pub model: Option<String>,
8023
8024    /// Report date
8025    #[serde(
8026        rename = "@reportDate",
8027        default,
8028        deserialize_with = "deserialize_optional_date"
8029    )]
8030    pub report_date: Option<NaiveDate>,
8031
8032    /// Symbol
8033    #[serde(rename = "@symbol", default)]
8034    pub symbol: Option<String>,
8035
8036    /// Contract ID
8037    #[serde(rename = "@conid", default)]
8038    pub conid: Option<String>,
8039
8040    /// Asset category
8041    #[serde(rename = "@assetCategory", default)]
8042    pub asset_category: Option<AssetCategory>,
8043
8044    /// Currency
8045    #[serde(rename = "@currency", default)]
8046    pub currency: Option<String>,
8047
8048    /// Prior period value
8049    #[serde(
8050        rename = "@priorPeriodValue",
8051        default,
8052        deserialize_with = "deserialize_optional_decimal"
8053    )]
8054    pub prior_period_value: Option<Decimal>,
8055
8056    /// Transactions
8057    #[serde(
8058        rename = "@transactions",
8059        default,
8060        deserialize_with = "deserialize_optional_decimal"
8061    )]
8062    pub transactions: Option<Decimal>,
8063
8064    /// MTM prior period positions
8065    #[serde(
8066        rename = "@mtmPriorPeriodPositions",
8067        default,
8068        deserialize_with = "deserialize_optional_decimal"
8069    )]
8070    pub mtm_prior_period_positions: Option<Decimal>,
8071
8072    /// MTM transactions
8073    #[serde(
8074        rename = "@mtmTransactions",
8075        default,
8076        deserialize_with = "deserialize_optional_decimal"
8077    )]
8078    pub mtm_transactions: Option<Decimal>,
8079
8080    /// Corporate actions
8081    #[serde(
8082        rename = "@corporateActions",
8083        default,
8084        deserialize_with = "deserialize_optional_decimal"
8085    )]
8086    pub corporate_actions: Option<Decimal>,
8087
8088    /// FX translation
8089    #[serde(
8090        rename = "@fxTranslation",
8091        default,
8092        deserialize_with = "deserialize_optional_decimal"
8093    )]
8094    pub fx_translation: Option<Decimal>,
8095
8096    /// Other
8097    #[serde(
8098        rename = "@other",
8099        default,
8100        deserialize_with = "deserialize_optional_decimal"
8101    )]
8102    pub other: Option<Decimal>,
8103
8104    /// Ending value
8105    #[serde(
8106        rename = "@endingValue",
8107        default,
8108        deserialize_with = "deserialize_optional_decimal"
8109    )]
8110    pub ending_value: Option<Decimal>,
8111
8112    /// Level of detail
8113    #[serde(rename = "@levelOfDetail", default)]
8114    pub level_of_detail: Option<String>,
8115
8116    /// `accountTransfers` (added for full ibflex coverage)
8117    #[serde(
8118        rename = "@accountTransfers",
8119        default,
8120        deserialize_with = "deserialize_optional_decimal"
8121    )]
8122    pub account_transfers: Option<Decimal>,
8123
8124    /// `fxTranslationPnl` (added for full ibflex coverage)
8125    #[serde(
8126        rename = "@fxTranslationPnl",
8127        default,
8128        deserialize_with = "deserialize_optional_decimal"
8129    )]
8130    pub fx_translation_pnl: Option<Decimal>,
8131
8132    /// `futurePriceAdjustments` (added for full ibflex coverage)
8133    #[serde(
8134        rename = "@futurePriceAdjustments",
8135        default,
8136        deserialize_with = "deserialize_optional_decimal"
8137    )]
8138    pub future_price_adjustments: Option<Decimal>,
8139
8140    /// `settledCash` (added for full ibflex coverage)
8141    #[serde(
8142        rename = "@settledCash",
8143        default,
8144        deserialize_with = "deserialize_optional_decimal"
8145    )]
8146    pub settled_cash: Option<Decimal>,
8147
8148    /// `endOfPeriodValue` (added for full ibflex coverage)
8149    #[serde(
8150        rename = "@endOfPeriodValue",
8151        default,
8152        deserialize_with = "deserialize_optional_decimal"
8153    )]
8154    pub end_of_period_value: Option<Decimal>,
8155
8156    /// `linkingAdjustments` (added for full ibflex coverage)
8157    #[serde(
8158        rename = "@linkingAdjustments",
8159        default,
8160        deserialize_with = "deserialize_optional_decimal"
8161    )]
8162    pub linking_adjustments: Option<Decimal>,
8163}
8164
8165// =============================================================================
8166// Fee Detail Types
8167// =============================================================================
8168
8169/// Unbundled commission detail
8170///
8171/// Breaks down commission charges into components: execution, clearing,
8172/// regulatory, third-party, and exchange fees.
8173#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
8174pub struct UnbundledCommissionDetail {
8175    /// Account ID
8176    #[serde(
8177        rename = "@accountId",
8178        default,
8179        deserialize_with = "deserialize_optional_string"
8180    )]
8181    pub account_id: Option<String>,
8182
8183    /// Account alias
8184    #[serde(rename = "@acctAlias", default)]
8185    pub acct_alias: Option<String>,
8186
8187    /// Model
8188    #[serde(rename = "@model", default)]
8189    pub model: Option<String>,
8190
8191    /// Symbol
8192    #[serde(rename = "@symbol", default)]
8193    pub symbol: Option<String>,
8194
8195    /// Description
8196    #[serde(rename = "@description", default)]
8197    pub description: Option<String>,
8198
8199    /// Contract ID
8200    #[serde(rename = "@conid", default)]
8201    pub conid: Option<String>,
8202
8203    /// Asset category
8204    #[serde(rename = "@assetCategory", default)]
8205    pub asset_category: Option<AssetCategory>,
8206
8207    /// Execution ID
8208    #[serde(rename = "@execID", default)]
8209    pub exec_id: Option<String>,
8210
8211    /// Order ID
8212    #[serde(rename = "@orderID", default)]
8213    pub order_id: Option<String>,
8214
8215    /// Trade ID
8216    #[serde(rename = "@tradeID", default)]
8217    pub trade_id: Option<String>,
8218
8219    /// Trade date/time (format: YYYYMMDD;HHMMSS)
8220    #[serde(rename = "@dateTime", default)]
8221    pub date_time: Option<String>,
8222
8223    /// Exchange
8224    #[serde(rename = "@exchange", default)]
8225    pub exchange: Option<String>,
8226
8227    /// Quantity
8228    #[serde(
8229        rename = "@quantity",
8230        default,
8231        deserialize_with = "deserialize_optional_decimal"
8232    )]
8233    pub quantity: Option<Decimal>,
8234
8235    /// Price
8236    #[serde(
8237        rename = "@price",
8238        default,
8239        deserialize_with = "deserialize_optional_decimal"
8240    )]
8241    pub price: Option<Decimal>,
8242
8243    /// Execution commission
8244    #[serde(
8245        rename = "@executionCommission",
8246        default,
8247        deserialize_with = "deserialize_optional_decimal"
8248    )]
8249    pub execution_commission: Option<Decimal>,
8250
8251    /// Clearing commission
8252    #[serde(
8253        rename = "@clearingCommission",
8254        default,
8255        deserialize_with = "deserialize_optional_decimal"
8256    )]
8257    pub clearing_commission: Option<Decimal>,
8258
8259    /// Regulatory commission
8260    #[serde(
8261        rename = "@regulatoryCommission",
8262        default,
8263        deserialize_with = "deserialize_optional_decimal"
8264    )]
8265    pub regulatory_commission: Option<Decimal>,
8266
8267    /// Third party commission
8268    #[serde(
8269        rename = "@thirdPartyCommission",
8270        default,
8271        deserialize_with = "deserialize_optional_decimal"
8272    )]
8273    pub third_party_commission: Option<Decimal>,
8274
8275    /// Third party regulatory commission
8276    #[serde(
8277        rename = "@thirdPartyRegulatoryCommission",
8278        default,
8279        deserialize_with = "deserialize_optional_decimal"
8280    )]
8281    pub third_party_regulatory_commission: Option<Decimal>,
8282
8283    /// Total commission
8284    #[serde(
8285        rename = "@totalCommission",
8286        default,
8287        deserialize_with = "deserialize_optional_decimal"
8288    )]
8289    pub total_commission: Option<Decimal>,
8290
8291    /// Currency
8292    #[serde(rename = "@currency", default)]
8293    pub currency: Option<String>,
8294
8295    /// `buySell` (added for full ibflex coverage)
8296    #[serde(rename = "@buySell", default)]
8297    pub buy_sell: Option<BuySell>,
8298
8299    /// `fxRateToBase` (added for full ibflex coverage)
8300    #[serde(
8301        rename = "@fxRateToBase",
8302        default,
8303        deserialize_with = "deserialize_optional_decimal"
8304    )]
8305    pub fx_rate_to_base: Option<Decimal>,
8306
8307    /// `securityID` (added for full ibflex coverage)
8308    #[serde(
8309        rename = "@securityID",
8310        default,
8311        deserialize_with = "deserialize_optional_string"
8312    )]
8313    pub security_id: Option<String>,
8314
8315    /// `securityIDType` (added for full ibflex coverage)
8316    #[serde(
8317        rename = "@securityIDType",
8318        default,
8319        deserialize_with = "deserialize_optional_string"
8320    )]
8321    pub security_id_type: Option<String>,
8322
8323    /// `cusip` (added for full ibflex coverage)
8324    #[serde(
8325        rename = "@cusip",
8326        default,
8327        deserialize_with = "deserialize_optional_string"
8328    )]
8329    pub cusip: Option<String>,
8330
8331    /// `isin` (added for full ibflex coverage)
8332    #[serde(
8333        rename = "@isin",
8334        default,
8335        deserialize_with = "deserialize_optional_string"
8336    )]
8337    pub isin: Option<String>,
8338
8339    /// `sedol` (added for full ibflex coverage)
8340    #[serde(
8341        rename = "@sedol",
8342        default,
8343        deserialize_with = "deserialize_optional_string"
8344    )]
8345    pub sedol: Option<String>,
8346
8347    /// `listingExchange` (added for full ibflex coverage)
8348    #[serde(
8349        rename = "@listingExchange",
8350        default,
8351        deserialize_with = "deserialize_optional_string"
8352    )]
8353    pub listing_exchange: Option<String>,
8354
8355    /// `underlyingConid` (added for full ibflex coverage)
8356    #[serde(
8357        rename = "@underlyingConid",
8358        default,
8359        deserialize_with = "deserialize_optional_string"
8360    )]
8361    pub underlying_conid: Option<String>,
8362
8363    /// `underlyingSymbol` (added for full ibflex coverage)
8364    #[serde(
8365        rename = "@underlyingSymbol",
8366        default,
8367        deserialize_with = "deserialize_optional_string"
8368    )]
8369    pub underlying_symbol: Option<String>,
8370
8371    /// `underlyingSecurityID` (added for full ibflex coverage)
8372    #[serde(
8373        rename = "@underlyingSecurityID",
8374        default,
8375        deserialize_with = "deserialize_optional_string"
8376    )]
8377    pub underlying_security_id: Option<String>,
8378
8379    /// `underlyingListingExchange` (added for full ibflex coverage)
8380    #[serde(
8381        rename = "@underlyingListingExchange",
8382        default,
8383        deserialize_with = "deserialize_optional_string"
8384    )]
8385    pub underlying_listing_exchange: Option<String>,
8386
8387    /// `issuer` (added for full ibflex coverage)
8388    #[serde(
8389        rename = "@issuer",
8390        default,
8391        deserialize_with = "deserialize_optional_string"
8392    )]
8393    pub issuer: Option<String>,
8394
8395    /// `multiplier` (added for full ibflex coverage)
8396    #[serde(
8397        rename = "@multiplier",
8398        default,
8399        deserialize_with = "deserialize_optional_decimal"
8400    )]
8401    pub multiplier: Option<Decimal>,
8402
8403    /// `strike` (added for full ibflex coverage)
8404    #[serde(
8405        rename = "@strike",
8406        default,
8407        deserialize_with = "deserialize_optional_decimal"
8408    )]
8409    pub strike: Option<Decimal>,
8410
8411    /// `expiry` (added for full ibflex coverage)
8412    #[serde(
8413        rename = "@expiry",
8414        default,
8415        deserialize_with = "deserialize_optional_date"
8416    )]
8417    pub expiry: Option<NaiveDate>,
8418
8419    /// `putCall` (added for full ibflex coverage)
8420    #[serde(rename = "@putCall", default)]
8421    pub put_call: Option<PutCall>,
8422
8423    /// `principalAdjustFactor` (added for full ibflex coverage)
8424    #[serde(
8425        rename = "@principalAdjustFactor",
8426        default,
8427        deserialize_with = "deserialize_optional_decimal"
8428    )]
8429    pub principal_adjust_factor: Option<Decimal>,
8430
8431    /// `orderReference` (added for full ibflex coverage)
8432    #[serde(
8433        rename = "@orderReference",
8434        default,
8435        deserialize_with = "deserialize_optional_string"
8436    )]
8437    pub order_reference: Option<String>,
8438
8439    /// `brokerExecutionCharge` (added for full ibflex coverage)
8440    #[serde(
8441        rename = "@brokerExecutionCharge",
8442        default,
8443        deserialize_with = "deserialize_optional_decimal"
8444    )]
8445    pub broker_execution_charge: Option<Decimal>,
8446
8447    /// `brokerClearingCharge` (added for full ibflex coverage)
8448    #[serde(
8449        rename = "@brokerClearingCharge",
8450        default,
8451        deserialize_with = "deserialize_optional_decimal"
8452    )]
8453    pub broker_clearing_charge: Option<Decimal>,
8454
8455    /// `thirdPartyExecutionCharge` (added for full ibflex coverage)
8456    #[serde(
8457        rename = "@thirdPartyExecutionCharge",
8458        default,
8459        deserialize_with = "deserialize_optional_decimal"
8460    )]
8461    pub third_party_execution_charge: Option<Decimal>,
8462
8463    /// `thirdPartyClearingCharge` (added for full ibflex coverage)
8464    #[serde(
8465        rename = "@thirdPartyClearingCharge",
8466        default,
8467        deserialize_with = "deserialize_optional_decimal"
8468    )]
8469    pub third_party_clearing_charge: Option<Decimal>,
8470
8471    /// `thirdPartyRegulatoryCharge` (added for full ibflex coverage)
8472    #[serde(
8473        rename = "@thirdPartyRegulatoryCharge",
8474        default,
8475        deserialize_with = "deserialize_optional_decimal"
8476    )]
8477    pub third_party_regulatory_charge: Option<Decimal>,
8478
8479    /// `regFINRATradingActivityFee` (added for full ibflex coverage)
8480    #[serde(
8481        rename = "@regFINRATradingActivityFee",
8482        default,
8483        deserialize_with = "deserialize_optional_decimal"
8484    )]
8485    pub reg_finra_trading_activity_fee: Option<Decimal>,
8486
8487    /// `regSection31TransactionFee` (added for full ibflex coverage)
8488    #[serde(
8489        rename = "@regSection31TransactionFee",
8490        default,
8491        deserialize_with = "deserialize_optional_decimal"
8492    )]
8493    pub reg_section31_transaction_fee: Option<Decimal>,
8494
8495    /// `regOther` (added for full ibflex coverage)
8496    #[serde(
8497        rename = "@regOther",
8498        default,
8499        deserialize_with = "deserialize_optional_decimal"
8500    )]
8501    pub reg_other: Option<Decimal>,
8502
8503    /// `other` (added for full ibflex coverage)
8504    #[serde(
8505        rename = "@other",
8506        default,
8507        deserialize_with = "deserialize_optional_decimal"
8508    )]
8509    pub other: Option<Decimal>,
8510
8511    /// `subCategory` (added for full ibflex coverage)
8512    #[serde(
8513        rename = "@subCategory",
8514        default,
8515        deserialize_with = "deserialize_optional_string"
8516    )]
8517    pub sub_category: Option<String>,
8518
8519    /// `figi` (added for full ibflex coverage)
8520    #[serde(
8521        rename = "@figi",
8522        default,
8523        deserialize_with = "deserialize_optional_string"
8524    )]
8525    pub figi: Option<String>,
8526
8527    /// `issuerCountryCode` (added for full ibflex coverage)
8528    #[serde(
8529        rename = "@issuerCountryCode",
8530        default,
8531        deserialize_with = "deserialize_optional_string"
8532    )]
8533    pub issuer_country_code: Option<String>,
8534
8535    /// `serialNumber` (added for full ibflex coverage)
8536    #[serde(
8537        rename = "@serialNumber",
8538        default,
8539        deserialize_with = "deserialize_optional_decimal"
8540    )]
8541    pub serial_number: Option<Decimal>,
8542
8543    /// `deliveryType` (added for full ibflex coverage)
8544    #[serde(
8545        rename = "@deliveryType",
8546        default,
8547        deserialize_with = "deserialize_optional_decimal"
8548    )]
8549    pub delivery_type: Option<Decimal>,
8550
8551    /// `commodityType` (added for full ibflex coverage)
8552    #[serde(
8553        rename = "@commodityType",
8554        default,
8555        deserialize_with = "deserialize_optional_string"
8556    )]
8557    pub commodity_type: Option<String>,
8558
8559    /// `fineness` (added for full ibflex coverage)
8560    #[serde(
8561        rename = "@fineness",
8562        default,
8563        deserialize_with = "deserialize_optional_decimal"
8564    )]
8565    pub fineness: Option<Decimal>,
8566
8567    /// `weight` (added for full ibflex coverage)
8568    #[serde(
8569        rename = "@weight",
8570        default,
8571        deserialize_with = "deserialize_optional_decimal"
8572    )]
8573    pub weight: Option<Decimal>,
8574}
8575
8576/// Client fee (advisory/service fees)
8577#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
8578pub struct ClientFee {
8579    /// Account ID
8580    #[serde(
8581        rename = "@accountId",
8582        default,
8583        deserialize_with = "deserialize_optional_string"
8584    )]
8585    pub account_id: Option<String>,
8586
8587    /// Account alias
8588    #[serde(rename = "@acctAlias", default)]
8589    pub acct_alias: Option<String>,
8590
8591    /// Model
8592    #[serde(rename = "@model", default)]
8593    pub model: Option<String>,
8594
8595    /// Date
8596    #[serde(
8597        rename = "@date",
8598        default,
8599        deserialize_with = "deserialize_optional_date"
8600    )]
8601    pub date: Option<NaiveDate>,
8602
8603    /// Currency
8604    #[serde(rename = "@currency", default)]
8605    pub currency: Option<String>,
8606
8607    /// Revenue
8608    #[serde(
8609        rename = "@revenue",
8610        default,
8611        deserialize_with = "deserialize_optional_decimal"
8612    )]
8613    pub revenue: Option<Decimal>,
8614
8615    /// Expense
8616    #[serde(
8617        rename = "@expense",
8618        default,
8619        deserialize_with = "deserialize_optional_decimal"
8620    )]
8621    pub expense: Option<Decimal>,
8622
8623    /// Net
8624    #[serde(
8625        rename = "@net",
8626        default,
8627        deserialize_with = "deserialize_optional_decimal"
8628    )]
8629    pub net: Option<Decimal>,
8630
8631    /// Description
8632    #[serde(rename = "@description", default)]
8633    pub description: Option<String>,
8634
8635    /// `fxRateToBase` (added for full ibflex coverage)
8636    #[serde(
8637        rename = "@fxRateToBase",
8638        default,
8639        deserialize_with = "deserialize_optional_decimal"
8640    )]
8641    pub fx_rate_to_base: Option<Decimal>,
8642
8643    /// `feeType` (added for full ibflex coverage)
8644    #[serde(
8645        rename = "@feeType",
8646        default,
8647        deserialize_with = "deserialize_optional_string"
8648    )]
8649    pub fee_type: Option<String>,
8650
8651    /// `expenseIndicator` (added for full ibflex coverage)
8652    #[serde(
8653        rename = "@expenseIndicator",
8654        default,
8655        deserialize_with = "deserialize_optional_string"
8656    )]
8657    pub expense_indicator: Option<String>,
8658
8659    /// `revenueInBase` (added for full ibflex coverage)
8660    #[serde(
8661        rename = "@revenueInBase",
8662        default,
8663        deserialize_with = "deserialize_optional_decimal"
8664    )]
8665    pub revenue_in_base: Option<Decimal>,
8666
8667    /// `expenseInBase` (added for full ibflex coverage)
8668    #[serde(
8669        rename = "@expenseInBase",
8670        default,
8671        deserialize_with = "deserialize_optional_decimal"
8672    )]
8673    pub expense_in_base: Option<Decimal>,
8674
8675    /// `netInBase` (added for full ibflex coverage)
8676    #[serde(
8677        rename = "@netInBase",
8678        default,
8679        deserialize_with = "deserialize_optional_decimal"
8680    )]
8681    pub net_in_base: Option<Decimal>,
8682
8683    /// `tradeID` (added for full ibflex coverage)
8684    #[serde(
8685        rename = "@tradeID",
8686        default,
8687        deserialize_with = "deserialize_optional_string"
8688    )]
8689    pub trade_id: Option<String>,
8690
8691    /// `execID` (added for full ibflex coverage)
8692    #[serde(
8693        rename = "@execID",
8694        default,
8695        deserialize_with = "deserialize_optional_string"
8696    )]
8697    pub exec_id: Option<String>,
8698
8699    /// `levelOfDetail` (added for full ibflex coverage)
8700    #[serde(
8701        rename = "@levelOfDetail",
8702        default,
8703        deserialize_with = "deserialize_optional_string"
8704    )]
8705    pub level_of_detail: Option<String>,
8706
8707    /// `assetCategory` (added for full ibflex coverage)
8708    #[serde(
8709        rename = "@assetCategory",
8710        default,
8711        deserialize_with = "deserialize_optional_string"
8712    )]
8713    pub asset_category: Option<String>,
8714
8715    /// `settleDate` (added for full ibflex coverage)
8716    #[serde(
8717        rename = "@settleDate",
8718        default,
8719        deserialize_with = "deserialize_optional_string"
8720    )]
8721    pub settle_date: Option<String>,
8722
8723    /// `buySell` (added for full ibflex coverage)
8724    #[serde(
8725        rename = "@buySell",
8726        default,
8727        deserialize_with = "deserialize_optional_string"
8728    )]
8729    pub buy_sell: Option<String>,
8730
8731    /// `quantity` (added for full ibflex coverage)
8732    #[serde(
8733        rename = "@quantity",
8734        default,
8735        deserialize_with = "deserialize_optional_string"
8736    )]
8737    pub quantity: Option<String>,
8738
8739    /// `tradePrice` (added for full ibflex coverage)
8740    #[serde(
8741        rename = "@tradePrice",
8742        default,
8743        deserialize_with = "deserialize_optional_string"
8744    )]
8745    pub trade_price: Option<String>,
8746
8747    /// `proceeds` (added for full ibflex coverage)
8748    #[serde(
8749        rename = "@proceeds",
8750        default,
8751        deserialize_with = "deserialize_optional_string"
8752    )]
8753    pub proceeds: Option<String>,
8754
8755    /// `symbol` (added for full ibflex coverage)
8756    #[serde(
8757        rename = "@symbol",
8758        default,
8759        deserialize_with = "deserialize_optional_string"
8760    )]
8761    pub symbol: Option<String>,
8762
8763    /// `underlyingSymbol` (added for full ibflex coverage)
8764    #[serde(
8765        rename = "@underlyingSymbol",
8766        default,
8767        deserialize_with = "deserialize_optional_string"
8768    )]
8769    pub underlying_symbol: Option<String>,
8770
8771    /// `multiplier` (added for full ibflex coverage)
8772    #[serde(
8773        rename = "@multiplier",
8774        default,
8775        deserialize_with = "deserialize_optional_string"
8776    )]
8777    pub multiplier: Option<String>,
8778
8779    /// `underlyingSecurityID` (added for full ibflex coverage)
8780    #[serde(
8781        rename = "@underlyingSecurityID",
8782        default,
8783        deserialize_with = "deserialize_optional_string"
8784    )]
8785    pub underlying_security_id: Option<String>,
8786}
8787
8788/// Client fee detail
8789#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
8790pub struct ClientFeesDetail {
8791    /// Account ID
8792    #[serde(
8793        rename = "@accountId",
8794        default,
8795        deserialize_with = "deserialize_optional_string"
8796    )]
8797    pub account_id: Option<String>,
8798
8799    /// Account alias
8800    #[serde(rename = "@acctAlias", default)]
8801    pub acct_alias: Option<String>,
8802
8803    /// Model
8804    #[serde(rename = "@model", default)]
8805    pub model: Option<String>,
8806
8807    /// Date
8808    #[serde(
8809        rename = "@date",
8810        default,
8811        deserialize_with = "deserialize_optional_date"
8812    )]
8813    pub date: Option<NaiveDate>,
8814
8815    /// Currency
8816    #[serde(rename = "@currency", default)]
8817    pub currency: Option<String>,
8818
8819    /// Fee type
8820    #[serde(rename = "@feeType", default)]
8821    pub fee_type: Option<String>,
8822
8823    /// Revenue
8824    #[serde(
8825        rename = "@revenue",
8826        default,
8827        deserialize_with = "deserialize_optional_decimal"
8828    )]
8829    pub revenue: Option<Decimal>,
8830
8831    /// Expense
8832    #[serde(
8833        rename = "@expense",
8834        default,
8835        deserialize_with = "deserialize_optional_decimal"
8836    )]
8837    pub expense: Option<Decimal>,
8838
8839    /// Net
8840    #[serde(
8841        rename = "@net",
8842        default,
8843        deserialize_with = "deserialize_optional_decimal"
8844    )]
8845    pub net: Option<Decimal>,
8846
8847    /// Description
8848    #[serde(rename = "@description", default)]
8849    pub description: Option<String>,
8850
8851    /// FX rate to base
8852    #[serde(
8853        rename = "@fxRateToBase",
8854        default,
8855        deserialize_with = "deserialize_optional_decimal"
8856    )]
8857    pub fx_rate_to_base: Option<Decimal>,
8858
8859    /// `tradeID` (added for full ibflex coverage)
8860    #[serde(
8861        rename = "@tradeID",
8862        default,
8863        deserialize_with = "deserialize_optional_string"
8864    )]
8865    pub trade_id: Option<String>,
8866
8867    /// `execID` (added for full ibflex coverage)
8868    #[serde(
8869        rename = "@execID",
8870        default,
8871        deserialize_with = "deserialize_optional_string"
8872    )]
8873    pub exec_id: Option<String>,
8874
8875    /// `totalRevenue` (added for full ibflex coverage)
8876    #[serde(
8877        rename = "@totalRevenue",
8878        default,
8879        deserialize_with = "deserialize_optional_decimal"
8880    )]
8881    pub total_revenue: Option<Decimal>,
8882
8883    /// `totalCommission` (added for full ibflex coverage)
8884    #[serde(
8885        rename = "@totalCommission",
8886        default,
8887        deserialize_with = "deserialize_optional_decimal"
8888    )]
8889    pub total_commission: Option<Decimal>,
8890
8891    /// `brokerExecutionCharge` (added for full ibflex coverage)
8892    #[serde(
8893        rename = "@brokerExecutionCharge",
8894        default,
8895        deserialize_with = "deserialize_optional_decimal"
8896    )]
8897    pub broker_execution_charge: Option<Decimal>,
8898
8899    /// `clearingCharge` (added for full ibflex coverage)
8900    #[serde(
8901        rename = "@clearingCharge",
8902        default,
8903        deserialize_with = "deserialize_optional_decimal"
8904    )]
8905    pub clearing_charge: Option<Decimal>,
8906
8907    /// `thirdPartyExecutionCharge` (added for full ibflex coverage)
8908    #[serde(
8909        rename = "@thirdPartyExecutionCharge",
8910        default,
8911        deserialize_with = "deserialize_optional_decimal"
8912    )]
8913    pub third_party_execution_charge: Option<Decimal>,
8914
8915    /// `thirdPartyRegulatoryCharge` (added for full ibflex coverage)
8916    #[serde(
8917        rename = "@thirdPartyRegulatoryCharge",
8918        default,
8919        deserialize_with = "deserialize_optional_decimal"
8920    )]
8921    pub third_party_regulatory_charge: Option<Decimal>,
8922
8923    /// `regFINRATradingActivityFee` (added for full ibflex coverage)
8924    #[serde(
8925        rename = "@regFINRATradingActivityFee",
8926        default,
8927        deserialize_with = "deserialize_optional_decimal"
8928    )]
8929    pub reg_finra_trading_activity_fee: Option<Decimal>,
8930
8931    /// `regSection31TransactionFee` (added for full ibflex coverage)
8932    #[serde(
8933        rename = "@regSection31TransactionFee",
8934        default,
8935        deserialize_with = "deserialize_optional_decimal"
8936    )]
8937    pub reg_section31_transaction_fee: Option<Decimal>,
8938
8939    /// `regOther` (added for full ibflex coverage)
8940    #[serde(
8941        rename = "@regOther",
8942        default,
8943        deserialize_with = "deserialize_optional_decimal"
8944    )]
8945    pub reg_other: Option<Decimal>,
8946
8947    /// `totalNet` (added for full ibflex coverage)
8948    #[serde(
8949        rename = "@totalNet",
8950        default,
8951        deserialize_with = "deserialize_optional_decimal"
8952    )]
8953    pub total_net: Option<Decimal>,
8954
8955    /// `totalNetInBase` (added for full ibflex coverage)
8956    #[serde(
8957        rename = "@totalNetInBase",
8958        default,
8959        deserialize_with = "deserialize_optional_decimal"
8960    )]
8961    pub total_net_in_base: Option<Decimal>,
8962
8963    /// `levelOfDetail` (added for full ibflex coverage)
8964    #[serde(
8965        rename = "@levelOfDetail",
8966        default,
8967        deserialize_with = "deserialize_optional_string"
8968    )]
8969    pub level_of_detail: Option<String>,
8970
8971    /// `other` (added for full ibflex coverage)
8972    #[serde(
8973        rename = "@other",
8974        default,
8975        deserialize_with = "deserialize_optional_decimal"
8976    )]
8977    pub other: Option<Decimal>,
8978}
8979
8980// =============================================================================
8981// Securities Lending Types
8982// =============================================================================
8983
8984/// Securities lending/borrowing activity
8985#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
8986pub struct SLBActivity {
8987    /// Account ID
8988    #[serde(
8989        rename = "@accountId",
8990        default,
8991        deserialize_with = "deserialize_optional_string"
8992    )]
8993    pub account_id: Option<String>,
8994
8995    /// Account alias
8996    #[serde(rename = "@acctAlias", default)]
8997    pub acct_alias: Option<String>,
8998
8999    /// Model
9000    #[serde(rename = "@model", default)]
9001    pub model: Option<String>,
9002
9003    /// Symbol
9004    #[serde(rename = "@symbol", default)]
9005    pub symbol: Option<String>,
9006
9007    /// Description
9008    #[serde(rename = "@description", default)]
9009    pub description: Option<String>,
9010
9011    /// Contract ID
9012    #[serde(rename = "@conid", default)]
9013    pub conid: Option<String>,
9014
9015    /// Asset category
9016    #[serde(rename = "@assetCategory", default)]
9017    pub asset_category: Option<AssetCategory>,
9018
9019    /// Activity date
9020    #[serde(
9021        rename = "@date",
9022        default,
9023        deserialize_with = "deserialize_optional_date"
9024    )]
9025    pub date: Option<NaiveDate>,
9026
9027    /// Activity type
9028    #[serde(rename = "@type", default)]
9029    pub activity_type: Option<String>,
9030
9031    /// Quantity
9032    #[serde(
9033        rename = "@quantity",
9034        default,
9035        deserialize_with = "deserialize_optional_decimal"
9036    )]
9037    pub quantity: Option<Decimal>,
9038
9039    /// Collateral amount
9040    #[serde(
9041        rename = "@collateralAmount",
9042        default,
9043        deserialize_with = "deserialize_optional_decimal"
9044    )]
9045    pub collateral_amount: Option<Decimal>,
9046
9047    /// Fee/rate
9048    #[serde(
9049        rename = "@feeRate",
9050        default,
9051        deserialize_with = "deserialize_optional_decimal"
9052    )]
9053    pub fee_rate: Option<Decimal>,
9054
9055    /// Net lend fee
9056    #[serde(
9057        rename = "@netLendFee",
9058        default,
9059        deserialize_with = "deserialize_optional_decimal"
9060    )]
9061    pub net_lend_fee: Option<Decimal>,
9062
9063    /// Currency
9064    #[serde(rename = "@currency", default)]
9065    pub currency: Option<String>,
9066
9067    /// FX rate to base
9068    #[serde(
9069        rename = "@fxRateToBase",
9070        default,
9071        deserialize_with = "deserialize_optional_decimal"
9072    )]
9073    pub fx_rate_to_base: Option<Decimal>,
9074
9075    /// `securityID` (added for full ibflex coverage)
9076    #[serde(
9077        rename = "@securityID",
9078        default,
9079        deserialize_with = "deserialize_optional_string"
9080    )]
9081    pub security_id: Option<String>,
9082
9083    /// `securityIDType` (added for full ibflex coverage)
9084    #[serde(
9085        rename = "@securityIDType",
9086        default,
9087        deserialize_with = "deserialize_optional_string"
9088    )]
9089    pub security_id_type: Option<String>,
9090
9091    /// `cusip` (added for full ibflex coverage)
9092    #[serde(
9093        rename = "@cusip",
9094        default,
9095        deserialize_with = "deserialize_optional_string"
9096    )]
9097    pub cusip: Option<String>,
9098
9099    /// `isin` (added for full ibflex coverage)
9100    #[serde(
9101        rename = "@isin",
9102        default,
9103        deserialize_with = "deserialize_optional_string"
9104    )]
9105    pub isin: Option<String>,
9106
9107    /// `underlyingConid` (added for full ibflex coverage)
9108    #[serde(
9109        rename = "@underlyingConid",
9110        default,
9111        deserialize_with = "deserialize_optional_string"
9112    )]
9113    pub underlying_conid: Option<String>,
9114
9115    /// `underlyingSymbol` (added for full ibflex coverage)
9116    #[serde(
9117        rename = "@underlyingSymbol",
9118        default,
9119        deserialize_with = "deserialize_optional_string"
9120    )]
9121    pub underlying_symbol: Option<String>,
9122
9123    /// `issuer` (added for full ibflex coverage)
9124    #[serde(
9125        rename = "@issuer",
9126        default,
9127        deserialize_with = "deserialize_optional_string"
9128    )]
9129    pub issuer: Option<String>,
9130
9131    /// `multiplier` (added for full ibflex coverage)
9132    #[serde(
9133        rename = "@multiplier",
9134        default,
9135        deserialize_with = "deserialize_optional_decimal"
9136    )]
9137    pub multiplier: Option<Decimal>,
9138
9139    /// `strike` (added for full ibflex coverage)
9140    #[serde(
9141        rename = "@strike",
9142        default,
9143        deserialize_with = "deserialize_optional_decimal"
9144    )]
9145    pub strike: Option<Decimal>,
9146
9147    /// `expiry` (added for full ibflex coverage)
9148    #[serde(
9149        rename = "@expiry",
9150        default,
9151        deserialize_with = "deserialize_optional_date"
9152    )]
9153    pub expiry: Option<NaiveDate>,
9154
9155    /// `putCall` (added for full ibflex coverage)
9156    #[serde(rename = "@putCall", default)]
9157    pub put_call: Option<PutCall>,
9158
9159    /// `principalAdjustFactor` (added for full ibflex coverage)
9160    #[serde(
9161        rename = "@principalAdjustFactor",
9162        default,
9163        deserialize_with = "deserialize_optional_decimal"
9164    )]
9165    pub principal_adjust_factor: Option<Decimal>,
9166
9167    /// `slbTransactionId` (added for full ibflex coverage)
9168    #[serde(
9169        rename = "@slbTransactionId",
9170        default,
9171        deserialize_with = "deserialize_optional_string"
9172    )]
9173    pub slb_transaction_id: Option<String>,
9174
9175    /// `activityDescription` (added for full ibflex coverage)
9176    #[serde(
9177        rename = "@activityDescription",
9178        default,
9179        deserialize_with = "deserialize_optional_string"
9180    )]
9181    pub activity_description: Option<String>,
9182
9183    /// `exchange` (added for full ibflex coverage)
9184    #[serde(
9185        rename = "@exchange",
9186        default,
9187        deserialize_with = "deserialize_optional_string"
9188    )]
9189    pub exchange: Option<String>,
9190
9191    /// `markQuantity` (added for full ibflex coverage)
9192    #[serde(
9193        rename = "@markQuantity",
9194        default,
9195        deserialize_with = "deserialize_optional_decimal"
9196    )]
9197    pub mark_quantity: Option<Decimal>,
9198
9199    /// `markPriorPrice` (added for full ibflex coverage)
9200    #[serde(
9201        rename = "@markPriorPrice",
9202        default,
9203        deserialize_with = "deserialize_optional_decimal"
9204    )]
9205    pub mark_prior_price: Option<Decimal>,
9206
9207    /// `markCurrentPrice` (added for full ibflex coverage)
9208    #[serde(
9209        rename = "@markCurrentPrice",
9210        default,
9211        deserialize_with = "deserialize_optional_decimal"
9212    )]
9213    pub mark_current_price: Option<Decimal>,
9214
9215    /// `subCategory` (added for full ibflex coverage)
9216    #[serde(
9217        rename = "@subCategory",
9218        default,
9219        deserialize_with = "deserialize_optional_string"
9220    )]
9221    pub sub_category: Option<String>,
9222
9223    /// `figi` (added for full ibflex coverage)
9224    #[serde(
9225        rename = "@figi",
9226        default,
9227        deserialize_with = "deserialize_optional_string"
9228    )]
9229    pub figi: Option<String>,
9230
9231    /// `listingExchange` (added for full ibflex coverage)
9232    #[serde(
9233        rename = "@listingExchange",
9234        default,
9235        deserialize_with = "deserialize_optional_string"
9236    )]
9237    pub listing_exchange: Option<String>,
9238
9239    /// `underlyingSecurityID` (added for full ibflex coverage)
9240    #[serde(
9241        rename = "@underlyingSecurityID",
9242        default,
9243        deserialize_with = "deserialize_optional_string"
9244    )]
9245    pub underlying_security_id: Option<String>,
9246
9247    /// `underlyingListingExchange` (added for full ibflex coverage)
9248    #[serde(
9249        rename = "@underlyingListingExchange",
9250        default,
9251        deserialize_with = "deserialize_optional_string"
9252    )]
9253    pub underlying_listing_exchange: Option<String>,
9254
9255    /// `issuerCountryCode` (added for full ibflex coverage)
9256    #[serde(
9257        rename = "@issuerCountryCode",
9258        default,
9259        deserialize_with = "deserialize_optional_string"
9260    )]
9261    pub issuer_country_code: Option<String>,
9262
9263    /// `serialNumber` (added for full ibflex coverage)
9264    #[serde(
9265        rename = "@serialNumber",
9266        default,
9267        deserialize_with = "deserialize_optional_decimal"
9268    )]
9269    pub serial_number: Option<Decimal>,
9270
9271    /// `deliveryType` (added for full ibflex coverage)
9272    #[serde(
9273        rename = "@deliveryType",
9274        default,
9275        deserialize_with = "deserialize_optional_decimal"
9276    )]
9277    pub delivery_type: Option<Decimal>,
9278
9279    /// `commodityType` (added for full ibflex coverage)
9280    #[serde(
9281        rename = "@commodityType",
9282        default,
9283        deserialize_with = "deserialize_optional_string"
9284    )]
9285    pub commodity_type: Option<String>,
9286
9287    /// `fineness` (added for full ibflex coverage)
9288    #[serde(
9289        rename = "@fineness",
9290        default,
9291        deserialize_with = "deserialize_optional_decimal"
9292    )]
9293    pub fineness: Option<Decimal>,
9294
9295    /// `weight` (added for full ibflex coverage)
9296    #[serde(
9297        rename = "@weight",
9298        default,
9299        deserialize_with = "deserialize_optional_decimal"
9300    )]
9301    pub weight: Option<Decimal>,
9302}
9303
9304/// Securities lending fee
9305#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
9306pub struct SLBFee {
9307    /// Account ID
9308    #[serde(
9309        rename = "@accountId",
9310        default,
9311        deserialize_with = "deserialize_optional_string"
9312    )]
9313    pub account_id: Option<String>,
9314
9315    /// Account alias
9316    #[serde(rename = "@acctAlias", default)]
9317    pub acct_alias: Option<String>,
9318
9319    /// Model
9320    #[serde(rename = "@model", default)]
9321    pub model: Option<String>,
9322
9323    /// Symbol
9324    #[serde(rename = "@symbol", default)]
9325    pub symbol: Option<String>,
9326
9327    /// Description
9328    #[serde(rename = "@description", default)]
9329    pub description: Option<String>,
9330
9331    /// Contract ID
9332    #[serde(rename = "@conid", default)]
9333    pub conid: Option<String>,
9334
9335    /// Asset category
9336    #[serde(rename = "@assetCategory", default)]
9337    pub asset_category: Option<AssetCategory>,
9338
9339    /// Value date
9340    #[serde(
9341        rename = "@valueDate",
9342        default,
9343        deserialize_with = "deserialize_optional_date"
9344    )]
9345    pub value_date: Option<NaiveDate>,
9346
9347    /// Start date
9348    #[serde(
9349        rename = "@startDate",
9350        default,
9351        deserialize_with = "deserialize_optional_date"
9352    )]
9353    pub start_date: Option<NaiveDate>,
9354
9355    /// Quantity
9356    #[serde(
9357        rename = "@quantity",
9358        default,
9359        deserialize_with = "deserialize_optional_decimal"
9360    )]
9361    pub quantity: Option<Decimal>,
9362
9363    /// Collateral amount
9364    #[serde(
9365        rename = "@collateralAmount",
9366        default,
9367        deserialize_with = "deserialize_optional_decimal"
9368    )]
9369    pub collateral_amount: Option<Decimal>,
9370
9371    /// Fee rate
9372    #[serde(
9373        rename = "@feeRate",
9374        default,
9375        deserialize_with = "deserialize_optional_decimal"
9376    )]
9377    pub fee_rate: Option<Decimal>,
9378
9379    /// Fee
9380    #[serde(
9381        rename = "@fee",
9382        default,
9383        deserialize_with = "deserialize_optional_decimal"
9384    )]
9385    pub fee: Option<Decimal>,
9386
9387    /// Carry charge
9388    #[serde(
9389        rename = "@carryCharge",
9390        default,
9391        deserialize_with = "deserialize_optional_decimal"
9392    )]
9393    pub carry_charge: Option<Decimal>,
9394
9395    /// Currency
9396    #[serde(rename = "@currency", default)]
9397    pub currency: Option<String>,
9398
9399    /// FX rate to base
9400    #[serde(
9401        rename = "@fxRateToBase",
9402        default,
9403        deserialize_with = "deserialize_optional_decimal"
9404    )]
9405    pub fx_rate_to_base: Option<Decimal>,
9406}
9407
9408/// Hard to borrow stock details
9409#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
9410pub struct HardToBorrowDetail {
9411    /// Account ID
9412    #[serde(
9413        rename = "@accountId",
9414        default,
9415        deserialize_with = "deserialize_optional_string"
9416    )]
9417    pub account_id: Option<String>,
9418
9419    /// Account alias
9420    #[serde(rename = "@acctAlias", default)]
9421    pub acct_alias: Option<String>,
9422
9423    /// Model
9424    #[serde(rename = "@model", default)]
9425    pub model: Option<String>,
9426
9427    /// Symbol
9428    #[serde(rename = "@symbol", default)]
9429    pub symbol: Option<String>,
9430
9431    /// Description
9432    #[serde(rename = "@description", default)]
9433    pub description: Option<String>,
9434
9435    /// Contract ID
9436    #[serde(rename = "@conid", default)]
9437    pub conid: Option<String>,
9438
9439    /// Asset category
9440    #[serde(rename = "@assetCategory", default)]
9441    pub asset_category: Option<AssetCategory>,
9442
9443    /// Value date
9444    #[serde(
9445        rename = "@valueDate",
9446        default,
9447        deserialize_with = "deserialize_optional_date"
9448    )]
9449    pub value_date: Option<NaiveDate>,
9450
9451    /// Quantity
9452    #[serde(
9453        rename = "@quantity",
9454        default,
9455        deserialize_with = "deserialize_optional_decimal"
9456    )]
9457    pub quantity: Option<Decimal>,
9458
9459    /// Price
9460    #[serde(
9461        rename = "@price",
9462        default,
9463        deserialize_with = "deserialize_optional_decimal"
9464    )]
9465    pub price: Option<Decimal>,
9466
9467    /// Value
9468    #[serde(
9469        rename = "@value",
9470        default,
9471        deserialize_with = "deserialize_optional_decimal"
9472    )]
9473    pub value: Option<Decimal>,
9474
9475    /// Borrow fee rate
9476    #[serde(
9477        rename = "@borrowFeeRate",
9478        default,
9479        deserialize_with = "deserialize_optional_decimal"
9480    )]
9481    pub borrow_fee_rate: Option<Decimal>,
9482
9483    /// Borrow fee
9484    #[serde(
9485        rename = "@borrowFee",
9486        default,
9487        deserialize_with = "deserialize_optional_decimal"
9488    )]
9489    pub borrow_fee: Option<Decimal>,
9490
9491    /// Currency
9492    #[serde(rename = "@currency", default)]
9493    pub currency: Option<String>,
9494
9495    /// FX rate to base
9496    #[serde(
9497        rename = "@fxRateToBase",
9498        default,
9499        deserialize_with = "deserialize_optional_decimal"
9500    )]
9501    pub fx_rate_to_base: Option<Decimal>,
9502
9503    /// `securityID` (added for full ibflex coverage)
9504    #[serde(
9505        rename = "@securityID",
9506        default,
9507        deserialize_with = "deserialize_optional_string"
9508    )]
9509    pub security_id: Option<String>,
9510
9511    /// `securityIDType` (added for full ibflex coverage)
9512    #[serde(
9513        rename = "@securityIDType",
9514        default,
9515        deserialize_with = "deserialize_optional_string"
9516    )]
9517    pub security_id_type: Option<String>,
9518
9519    /// `cusip` (added for full ibflex coverage)
9520    #[serde(
9521        rename = "@cusip",
9522        default,
9523        deserialize_with = "deserialize_optional_string"
9524    )]
9525    pub cusip: Option<String>,
9526
9527    /// `isin` (added for full ibflex coverage)
9528    #[serde(
9529        rename = "@isin",
9530        default,
9531        deserialize_with = "deserialize_optional_string"
9532    )]
9533    pub isin: Option<String>,
9534
9535    /// `listingExchange` (added for full ibflex coverage)
9536    #[serde(
9537        rename = "@listingExchange",
9538        default,
9539        deserialize_with = "deserialize_optional_string"
9540    )]
9541    pub listing_exchange: Option<String>,
9542
9543    /// `underlyingConid` (added for full ibflex coverage)
9544    #[serde(
9545        rename = "@underlyingConid",
9546        default,
9547        deserialize_with = "deserialize_optional_string"
9548    )]
9549    pub underlying_conid: Option<String>,
9550
9551    /// `underlyingSymbol` (added for full ibflex coverage)
9552    #[serde(
9553        rename = "@underlyingSymbol",
9554        default,
9555        deserialize_with = "deserialize_optional_string"
9556    )]
9557    pub underlying_symbol: Option<String>,
9558
9559    /// `underlyingSecurityID` (added for full ibflex coverage)
9560    #[serde(
9561        rename = "@underlyingSecurityID",
9562        default,
9563        deserialize_with = "deserialize_optional_string"
9564    )]
9565    pub underlying_security_id: Option<String>,
9566
9567    /// `underlyingListingExchange` (added for full ibflex coverage)
9568    #[serde(
9569        rename = "@underlyingListingExchange",
9570        default,
9571        deserialize_with = "deserialize_optional_string"
9572    )]
9573    pub underlying_listing_exchange: Option<String>,
9574
9575    /// `issuer` (added for full ibflex coverage)
9576    #[serde(
9577        rename = "@issuer",
9578        default,
9579        deserialize_with = "deserialize_optional_string"
9580    )]
9581    pub issuer: Option<String>,
9582
9583    /// `multiplier` (added for full ibflex coverage)
9584    #[serde(
9585        rename = "@multiplier",
9586        default,
9587        deserialize_with = "deserialize_optional_decimal"
9588    )]
9589    pub multiplier: Option<Decimal>,
9590
9591    /// `strike` (added for full ibflex coverage)
9592    #[serde(
9593        rename = "@strike",
9594        default,
9595        deserialize_with = "deserialize_optional_decimal"
9596    )]
9597    pub strike: Option<Decimal>,
9598
9599    /// `expiry` (added for full ibflex coverage)
9600    #[serde(
9601        rename = "@expiry",
9602        default,
9603        deserialize_with = "deserialize_optional_date"
9604    )]
9605    pub expiry: Option<NaiveDate>,
9606
9607    /// `putCall` (added for full ibflex coverage)
9608    #[serde(rename = "@putCall", default)]
9609    pub put_call: Option<PutCall>,
9610
9611    /// `principalAdjustFactor` (added for full ibflex coverage)
9612    #[serde(
9613        rename = "@principalAdjustFactor",
9614        default,
9615        deserialize_with = "deserialize_optional_decimal"
9616    )]
9617    pub principal_adjust_factor: Option<Decimal>,
9618
9619    /// `code` (added for full ibflex coverage)
9620    #[serde(
9621        rename = "@code",
9622        default,
9623        deserialize_with = "deserialize_optional_string"
9624    )]
9625    pub code: Option<String>,
9626
9627    /// `fromAcct` (added for full ibflex coverage)
9628    #[serde(
9629        rename = "@fromAcct",
9630        default,
9631        deserialize_with = "deserialize_optional_string"
9632    )]
9633    pub from_acct: Option<String>,
9634
9635    /// `toAcct` (added for full ibflex coverage)
9636    #[serde(
9637        rename = "@toAcct",
9638        default,
9639        deserialize_with = "deserialize_optional_string"
9640    )]
9641    pub to_acct: Option<String>,
9642}
9643
9644// =============================================================================
9645// FX Lot Types
9646// =============================================================================
9647
9648/// FX position lot detail
9649#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
9650pub struct FxLot {
9651    /// Account ID
9652    #[serde(
9653        rename = "@accountId",
9654        default,
9655        deserialize_with = "deserialize_optional_string"
9656    )]
9657    pub account_id: Option<String>,
9658
9659    /// Account alias
9660    #[serde(rename = "@acctAlias", default)]
9661    pub acct_alias: Option<String>,
9662
9663    /// Model
9664    #[serde(rename = "@model", default)]
9665    pub model: Option<String>,
9666
9667    /// Asset category
9668    #[serde(rename = "@assetCategory", default)]
9669    pub asset_category: Option<String>,
9670
9671    /// Report date
9672    #[serde(
9673        rename = "@reportDate",
9674        default,
9675        deserialize_with = "deserialize_optional_date"
9676    )]
9677    pub report_date: Option<NaiveDate>,
9678
9679    /// Functional currency
9680    #[serde(rename = "@functionalCurrency", default)]
9681    pub functional_currency: Option<String>,
9682
9683    /// FX currency
9684    #[serde(rename = "@fxCurrency", default)]
9685    pub fx_currency: Option<String>,
9686
9687    /// Quantity
9688    #[serde(
9689        rename = "@quantity",
9690        default,
9691        deserialize_with = "deserialize_optional_decimal"
9692    )]
9693    pub quantity: Option<Decimal>,
9694
9695    /// Cost price
9696    #[serde(
9697        rename = "@costPrice",
9698        default,
9699        deserialize_with = "deserialize_optional_decimal"
9700    )]
9701    pub cost_price: Option<Decimal>,
9702
9703    /// Cost basis
9704    #[serde(
9705        rename = "@costBasis",
9706        default,
9707        deserialize_with = "deserialize_optional_decimal"
9708    )]
9709    pub cost_basis: Option<Decimal>,
9710
9711    /// Close price
9712    #[serde(
9713        rename = "@closePrice",
9714        default,
9715        deserialize_with = "deserialize_optional_decimal"
9716    )]
9717    pub close_price: Option<Decimal>,
9718
9719    /// Value
9720    #[serde(
9721        rename = "@value",
9722        default,
9723        deserialize_with = "deserialize_optional_decimal"
9724    )]
9725    pub value: Option<Decimal>,
9726
9727    /// Unrealized P&L
9728    #[serde(
9729        rename = "@unrealizedPL",
9730        default,
9731        deserialize_with = "deserialize_optional_decimal"
9732    )]
9733    pub unrealized_pl: Option<Decimal>,
9734
9735    /// Level of detail
9736    #[serde(rename = "@levelOfDetail", default)]
9737    pub level_of_detail: Option<String>,
9738
9739    /// `code` (added for full ibflex coverage)
9740    #[serde(
9741        rename = "@code",
9742        default,
9743        deserialize_with = "deserialize_optional_string"
9744    )]
9745    pub code: Option<String>,
9746
9747    /// `lotDescription` (added for full ibflex coverage)
9748    #[serde(
9749        rename = "@lotDescription",
9750        default,
9751        deserialize_with = "deserialize_optional_string"
9752    )]
9753    pub lot_description: Option<String>,
9754
9755    /// `lotOpenDateTime` (added for full ibflex coverage)
9756    #[serde(
9757        rename = "@lotOpenDateTime",
9758        default,
9759        deserialize_with = "deserialize_optional_string"
9760    )]
9761    pub lot_open_date_time: Option<String>,
9762}
9763
9764// =============================================================================
9765// Transfer Types
9766// =============================================================================
9767
9768/// Unsettled transfer
9769#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
9770pub struct UnsettledTransfer {
9771    /// Account ID
9772    #[serde(
9773        rename = "@accountId",
9774        default,
9775        deserialize_with = "deserialize_optional_string"
9776    )]
9777    pub account_id: Option<String>,
9778
9779    /// Account alias
9780    #[serde(rename = "@acctAlias", default)]
9781    pub acct_alias: Option<String>,
9782
9783    /// Model
9784    #[serde(rename = "@model", default)]
9785    pub model: Option<String>,
9786
9787    /// Symbol
9788    #[serde(rename = "@symbol", default)]
9789    pub symbol: Option<String>,
9790
9791    /// Description
9792    #[serde(rename = "@description", default)]
9793    pub description: Option<String>,
9794
9795    /// Contract ID
9796    #[serde(rename = "@conid", default)]
9797    pub conid: Option<String>,
9798
9799    /// Asset category
9800    #[serde(rename = "@assetCategory", default)]
9801    pub asset_category: Option<AssetCategory>,
9802
9803    /// Direction
9804    #[serde(rename = "@direction", default)]
9805    pub direction: Option<String>,
9806
9807    /// Date
9808    #[serde(
9809        rename = "@date",
9810        default,
9811        deserialize_with = "deserialize_optional_date"
9812    )]
9813    pub date: Option<NaiveDate>,
9814
9815    /// Expected date
9816    #[serde(
9817        rename = "@expectedDate",
9818        default,
9819        deserialize_with = "deserialize_optional_date"
9820    )]
9821    pub expected_date: Option<NaiveDate>,
9822
9823    /// Quantity
9824    #[serde(
9825        rename = "@quantity",
9826        default,
9827        deserialize_with = "deserialize_optional_decimal"
9828    )]
9829    pub quantity: Option<Decimal>,
9830
9831    /// Currency
9832    #[serde(rename = "@currency", default)]
9833    pub currency: Option<String>,
9834
9835    /// FX rate to base
9836    #[serde(
9837        rename = "@fxRateToBase",
9838        default,
9839        deserialize_with = "deserialize_optional_decimal"
9840    )]
9841    pub fx_rate_to_base: Option<Decimal>,
9842
9843    /// `securityID` (added for full ibflex coverage)
9844    #[serde(
9845        rename = "@securityID",
9846        default,
9847        deserialize_with = "deserialize_optional_string"
9848    )]
9849    pub security_id: Option<String>,
9850
9851    /// `cusip` (added for full ibflex coverage)
9852    #[serde(
9853        rename = "@cusip",
9854        default,
9855        deserialize_with = "deserialize_optional_string"
9856    )]
9857    pub cusip: Option<String>,
9858
9859    /// `isin` (added for full ibflex coverage)
9860    #[serde(
9861        rename = "@isin",
9862        default,
9863        deserialize_with = "deserialize_optional_string"
9864    )]
9865    pub isin: Option<String>,
9866
9867    /// `sedol` (added for full ibflex coverage)
9868    #[serde(
9869        rename = "@sedol",
9870        default,
9871        deserialize_with = "deserialize_optional_string"
9872    )]
9873    pub sedol: Option<String>,
9874
9875    /// `underlyingConid` (added for full ibflex coverage)
9876    #[serde(
9877        rename = "@underlyingConid",
9878        default,
9879        deserialize_with = "deserialize_optional_string"
9880    )]
9881    pub underlying_conid: Option<String>,
9882
9883    /// `stage` (added for full ibflex coverage)
9884    #[serde(
9885        rename = "@stage",
9886        default,
9887        deserialize_with = "deserialize_optional_string"
9888    )]
9889    pub stage: Option<String>,
9890
9891    /// `tradeDate` (added for full ibflex coverage)
9892    #[serde(
9893        rename = "@tradeDate",
9894        default,
9895        deserialize_with = "deserialize_optional_date"
9896    )]
9897    pub trade_date: Option<NaiveDate>,
9898
9899    /// `targetSettlement` (added for full ibflex coverage)
9900    #[serde(
9901        rename = "@targetSettlement",
9902        default,
9903        deserialize_with = "deserialize_optional_date"
9904    )]
9905    pub target_settlement: Option<NaiveDate>,
9906
9907    /// `contra` (added for full ibflex coverage)
9908    #[serde(
9909        rename = "@contra",
9910        default,
9911        deserialize_with = "deserialize_optional_string"
9912    )]
9913    pub contra: Option<String>,
9914
9915    /// `tradePrice` (added for full ibflex coverage)
9916    #[serde(
9917        rename = "@tradePrice",
9918        default,
9919        deserialize_with = "deserialize_optional_decimal"
9920    )]
9921    pub trade_price: Option<Decimal>,
9922
9923    /// `tradeAmount` (added for full ibflex coverage)
9924    #[serde(
9925        rename = "@tradeAmount",
9926        default,
9927        deserialize_with = "deserialize_optional_decimal"
9928    )]
9929    pub trade_amount: Option<Decimal>,
9930
9931    /// `tradeAmountInBase` (added for full ibflex coverage)
9932    #[serde(
9933        rename = "@tradeAmountInBase",
9934        default,
9935        deserialize_with = "deserialize_optional_decimal"
9936    )]
9937    pub trade_amount_in_base: Option<Decimal>,
9938
9939    /// `transactionID` (added for full ibflex coverage)
9940    #[serde(
9941        rename = "@transactionID",
9942        default,
9943        deserialize_with = "deserialize_optional_string"
9944    )]
9945    pub transaction_id: Option<String>,
9946}
9947
9948/// Trade transfer between accounts/brokers
9949#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
9950pub struct TradeTransfer {
9951    /// Account ID
9952    #[serde(
9953        rename = "@accountId",
9954        default,
9955        deserialize_with = "deserialize_optional_string"
9956    )]
9957    pub account_id: Option<String>,
9958
9959    /// Account alias
9960    #[serde(rename = "@acctAlias", default)]
9961    pub acct_alias: Option<String>,
9962
9963    /// Model
9964    #[serde(rename = "@model", default)]
9965    pub model: Option<String>,
9966
9967    /// Symbol
9968    #[serde(rename = "@symbol", default)]
9969    pub symbol: Option<String>,
9970
9971    /// Description
9972    #[serde(rename = "@description", default)]
9973    pub description: Option<String>,
9974
9975    /// Contract ID
9976    #[serde(rename = "@conid", default)]
9977    pub conid: Option<String>,
9978
9979    /// Asset category
9980    #[serde(rename = "@assetCategory", default)]
9981    pub asset_category: Option<AssetCategory>,
9982
9983    /// Transfer type
9984    #[serde(rename = "@transferType", default)]
9985    pub transfer_type: Option<String>,
9986
9987    /// Direction
9988    #[serde(rename = "@direction", default)]
9989    pub direction: Option<String>,
9990
9991    /// Delivery type
9992    #[serde(rename = "@deliveryType", default)]
9993    pub delivery_type: Option<String>,
9994
9995    /// Quantity
9996    #[serde(
9997        rename = "@quantity",
9998        default,
9999        deserialize_with = "deserialize_optional_decimal"
10000    )]
10001    pub quantity: Option<Decimal>,
10002
10003    /// Transfer price
10004    #[serde(
10005        rename = "@transferPrice",
10006        default,
10007        deserialize_with = "deserialize_optional_decimal"
10008    )]
10009    pub transfer_price: Option<Decimal>,
10010
10011    /// Date
10012    #[serde(
10013        rename = "@date",
10014        default,
10015        deserialize_with = "deserialize_optional_date"
10016    )]
10017    pub date: Option<NaiveDate>,
10018
10019    /// Executing broker
10020    #[serde(rename = "@executingBroker", default)]
10021    pub executing_broker: Option<String>,
10022
10023    /// Currency
10024    #[serde(rename = "@currency", default)]
10025    pub currency: Option<String>,
10026
10027    /// FX rate to base
10028    #[serde(
10029        rename = "@fxRateToBase",
10030        default,
10031        deserialize_with = "deserialize_optional_decimal"
10032    )]
10033    pub fx_rate_to_base: Option<Decimal>,
10034
10035    /// `transactionType` (added for full ibflex coverage)
10036    #[serde(rename = "@transactionType", default)]
10037    pub transaction_type: Option<TradeType>,
10038
10039    /// `openCloseIndicator` (added for full ibflex coverage)
10040    #[serde(rename = "@openCloseIndicator", default)]
10041    pub open_close_indicator: Option<OpenClose>,
10042
10043    /// `deliveredReceived` (added for full ibflex coverage)
10044    #[serde(rename = "@deliveredReceived", default)]
10045    pub delivered_received: Option<DeliveredReceived>,
10046
10047    /// `cusip` (added for full ibflex coverage)
10048    #[serde(
10049        rename = "@cusip",
10050        default,
10051        deserialize_with = "deserialize_optional_string"
10052    )]
10053    pub cusip: Option<String>,
10054
10055    /// `isin` (added for full ibflex coverage)
10056    #[serde(
10057        rename = "@isin",
10058        default,
10059        deserialize_with = "deserialize_optional_string"
10060    )]
10061    pub isin: Option<String>,
10062
10063    /// `underlyingConid` (added for full ibflex coverage)
10064    #[serde(
10065        rename = "@underlyingConid",
10066        default,
10067        deserialize_with = "deserialize_optional_string"
10068    )]
10069    pub underlying_conid: Option<String>,
10070
10071    /// `tradeID` (added for full ibflex coverage)
10072    #[serde(
10073        rename = "@tradeID",
10074        default,
10075        deserialize_with = "deserialize_optional_string"
10076    )]
10077    pub trade_id: Option<String>,
10078
10079    /// `reportDate` (added for full ibflex coverage)
10080    #[serde(
10081        rename = "@reportDate",
10082        default,
10083        deserialize_with = "deserialize_optional_date"
10084    )]
10085    pub report_date: Option<NaiveDate>,
10086
10087    /// `tradeDate` (added for full ibflex coverage)
10088    #[serde(
10089        rename = "@tradeDate",
10090        default,
10091        deserialize_with = "deserialize_optional_date"
10092    )]
10093    pub trade_date: Option<NaiveDate>,
10094
10095    /// `tradeTime` (added for full ibflex coverage)
10096    #[serde(
10097        rename = "@tradeTime",
10098        default,
10099        deserialize_with = "deserialize_optional_string"
10100    )]
10101    pub trade_time: Option<String>,
10102
10103    /// `settleDateTarget` (added for full ibflex coverage)
10104    #[serde(
10105        rename = "@settleDateTarget",
10106        default,
10107        deserialize_with = "deserialize_optional_date"
10108    )]
10109    pub settle_date_target: Option<NaiveDate>,
10110
10111    /// `exchange` (added for full ibflex coverage)
10112    #[serde(
10113        rename = "@exchange",
10114        default,
10115        deserialize_with = "deserialize_optional_string"
10116    )]
10117    pub exchange: Option<String>,
10118
10119    /// `tradePrice` (added for full ibflex coverage)
10120    #[serde(
10121        rename = "@tradePrice",
10122        default,
10123        deserialize_with = "deserialize_optional_decimal"
10124    )]
10125    pub trade_price: Option<Decimal>,
10126
10127    /// `tradeMoney` (added for full ibflex coverage)
10128    #[serde(
10129        rename = "@tradeMoney",
10130        default,
10131        deserialize_with = "deserialize_optional_decimal"
10132    )]
10133    pub trade_money: Option<Decimal>,
10134
10135    /// `taxes` (added for full ibflex coverage)
10136    #[serde(
10137        rename = "@taxes",
10138        default,
10139        deserialize_with = "deserialize_optional_decimal"
10140    )]
10141    pub taxes: Option<Decimal>,
10142
10143    /// `ibCommission` (added for full ibflex coverage)
10144    #[serde(
10145        rename = "@ibCommission",
10146        default,
10147        deserialize_with = "deserialize_optional_decimal"
10148    )]
10149    pub ib_commission: Option<Decimal>,
10150
10151    /// `ibCommissionCurrency` (added for full ibflex coverage)
10152    #[serde(
10153        rename = "@ibCommissionCurrency",
10154        default,
10155        deserialize_with = "deserialize_optional_string"
10156    )]
10157    pub ib_commission_currency: Option<String>,
10158
10159    /// `closePrice` (added for full ibflex coverage)
10160    #[serde(
10161        rename = "@closePrice",
10162        default,
10163        deserialize_with = "deserialize_optional_decimal"
10164    )]
10165    pub close_price: Option<Decimal>,
10166
10167    /// `notes` (added for full ibflex coverage)
10168    #[serde(
10169        rename = "@notes",
10170        default,
10171        deserialize_with = "deserialize_optional_string"
10172    )]
10173    pub notes: Option<String>,
10174
10175    /// `cost` (added for full ibflex coverage)
10176    #[serde(
10177        rename = "@cost",
10178        default,
10179        deserialize_with = "deserialize_optional_decimal"
10180    )]
10181    pub cost: Option<Decimal>,
10182
10183    /// `fifoPnlRealized` (added for full ibflex coverage)
10184    #[serde(
10185        rename = "@fifoPnlRealized",
10186        default,
10187        deserialize_with = "deserialize_optional_decimal"
10188    )]
10189    pub fifo_pnl_realized: Option<Decimal>,
10190
10191    /// `mtmPnl` (added for full ibflex coverage)
10192    #[serde(
10193        rename = "@mtmPnl",
10194        default,
10195        deserialize_with = "deserialize_optional_decimal"
10196    )]
10197    pub mtm_pnl: Option<Decimal>,
10198
10199    /// `brokerName` (added for full ibflex coverage)
10200    #[serde(
10201        rename = "@brokerName",
10202        default,
10203        deserialize_with = "deserialize_optional_string"
10204    )]
10205    pub broker_name: Option<String>,
10206
10207    /// `brokerAccount` (added for full ibflex coverage)
10208    #[serde(
10209        rename = "@brokerAccount",
10210        default,
10211        deserialize_with = "deserialize_optional_string"
10212    )]
10213    pub broker_account: Option<String>,
10214
10215    /// `awayBrokerCommission` (added for full ibflex coverage)
10216    #[serde(
10217        rename = "@awayBrokerCommission",
10218        default,
10219        deserialize_with = "deserialize_optional_decimal"
10220    )]
10221    pub away_broker_commission: Option<Decimal>,
10222
10223    /// `regulatoryFee` (added for full ibflex coverage)
10224    #[serde(
10225        rename = "@regulatoryFee",
10226        default,
10227        deserialize_with = "deserialize_optional_decimal"
10228    )]
10229    pub regulatory_fee: Option<Decimal>,
10230
10231    /// `netTradeMoney` (added for full ibflex coverage)
10232    #[serde(
10233        rename = "@netTradeMoney",
10234        default,
10235        deserialize_with = "deserialize_optional_decimal"
10236    )]
10237    pub net_trade_money: Option<Decimal>,
10238
10239    /// `netTradeMoneyInBase` (added for full ibflex coverage)
10240    #[serde(
10241        rename = "@netTradeMoneyInBase",
10242        default,
10243        deserialize_with = "deserialize_optional_decimal"
10244    )]
10245    pub net_trade_money_in_base: Option<Decimal>,
10246
10247    /// `netTradePrice` (added for full ibflex coverage)
10248    #[serde(
10249        rename = "@netTradePrice",
10250        default,
10251        deserialize_with = "deserialize_optional_decimal"
10252    )]
10253    pub net_trade_price: Option<Decimal>,
10254
10255    /// `multiplier` (added for full ibflex coverage)
10256    #[serde(
10257        rename = "@multiplier",
10258        default,
10259        deserialize_with = "deserialize_optional_decimal"
10260    )]
10261    pub multiplier: Option<Decimal>,
10262
10263    /// `sedol` (added for full ibflex coverage)
10264    #[serde(
10265        rename = "@sedol",
10266        default,
10267        deserialize_with = "deserialize_optional_string"
10268    )]
10269    pub sedol: Option<String>,
10270
10271    /// `securityID` (added for full ibflex coverage)
10272    #[serde(
10273        rename = "@securityID",
10274        default,
10275        deserialize_with = "deserialize_optional_string"
10276    )]
10277    pub security_id: Option<String>,
10278
10279    /// `underlyingSymbol` (added for full ibflex coverage)
10280    #[serde(
10281        rename = "@underlyingSymbol",
10282        default,
10283        deserialize_with = "deserialize_optional_string"
10284    )]
10285    pub underlying_symbol: Option<String>,
10286
10287    /// `issuer` (added for full ibflex coverage)
10288    #[serde(
10289        rename = "@issuer",
10290        default,
10291        deserialize_with = "deserialize_optional_string"
10292    )]
10293    pub issuer: Option<String>,
10294
10295    /// `strike` (added for full ibflex coverage)
10296    #[serde(
10297        rename = "@strike",
10298        default,
10299        deserialize_with = "deserialize_optional_decimal"
10300    )]
10301    pub strike: Option<Decimal>,
10302
10303    /// `expiry` (added for full ibflex coverage)
10304    #[serde(
10305        rename = "@expiry",
10306        default,
10307        deserialize_with = "deserialize_optional_date"
10308    )]
10309    pub expiry: Option<NaiveDate>,
10310
10311    /// `putCall` (added for full ibflex coverage)
10312    #[serde(rename = "@putCall", default)]
10313    pub put_call: Option<PutCall>,
10314
10315    /// `principalAdjustFactor` (added for full ibflex coverage)
10316    #[serde(
10317        rename = "@principalAdjustFactor",
10318        default,
10319        deserialize_with = "deserialize_optional_decimal"
10320    )]
10321    pub principal_adjust_factor: Option<Decimal>,
10322
10323    /// `proceeds` (added for full ibflex coverage)
10324    #[serde(
10325        rename = "@proceeds",
10326        default,
10327        deserialize_with = "deserialize_optional_decimal"
10328    )]
10329    pub proceeds: Option<Decimal>,
10330
10331    /// `fxPnl` (added for full ibflex coverage)
10332    #[serde(
10333        rename = "@fxPnl",
10334        default,
10335        deserialize_with = "deserialize_optional_decimal"
10336    )]
10337    pub fx_pnl: Option<Decimal>,
10338
10339    /// `netCash` (added for full ibflex coverage)
10340    #[serde(
10341        rename = "@netCash",
10342        default,
10343        deserialize_with = "deserialize_optional_decimal"
10344    )]
10345    pub net_cash: Option<Decimal>,
10346
10347    /// `origTradePrice` (added for full ibflex coverage)
10348    #[serde(
10349        rename = "@origTradePrice",
10350        default,
10351        deserialize_with = "deserialize_optional_decimal"
10352    )]
10353    pub orig_trade_price: Option<Decimal>,
10354
10355    /// `origTradeDate` (added for full ibflex coverage)
10356    #[serde(
10357        rename = "@origTradeDate",
10358        default,
10359        deserialize_with = "deserialize_optional_date"
10360    )]
10361    pub orig_trade_date: Option<NaiveDate>,
10362
10363    /// `origTradeID` (added for full ibflex coverage)
10364    #[serde(
10365        rename = "@origTradeID",
10366        default,
10367        deserialize_with = "deserialize_optional_string"
10368    )]
10369    pub orig_trade_id: Option<String>,
10370
10371    /// `origOrderID` (added for full ibflex coverage)
10372    #[serde(
10373        rename = "@origOrderID",
10374        default,
10375        deserialize_with = "deserialize_optional_string"
10376    )]
10377    pub orig_order_id: Option<String>,
10378
10379    /// `clearingFirmID` (added for full ibflex coverage)
10380    #[serde(
10381        rename = "@clearingFirmID",
10382        default,
10383        deserialize_with = "deserialize_optional_string"
10384    )]
10385    pub clearing_firm_id: Option<String>,
10386
10387    /// `transactionID` (added for full ibflex coverage)
10388    #[serde(
10389        rename = "@transactionID",
10390        default,
10391        deserialize_with = "deserialize_optional_string"
10392    )]
10393    pub transaction_id: Option<String>,
10394
10395    /// `openDateTime` (added for full ibflex coverage)
10396    #[serde(
10397        rename = "@openDateTime",
10398        default,
10399        deserialize_with = "deserialize_optional_string"
10400    )]
10401    pub open_date_time: Option<String>,
10402
10403    /// `holdingPeriodDateTime` (added for full ibflex coverage)
10404    #[serde(
10405        rename = "@holdingPeriodDateTime",
10406        default,
10407        deserialize_with = "deserialize_optional_string"
10408    )]
10409    pub holding_period_date_time: Option<String>,
10410
10411    /// `whenRealized` (added for full ibflex coverage)
10412    #[serde(
10413        rename = "@whenRealized",
10414        default,
10415        deserialize_with = "deserialize_optional_string"
10416    )]
10417    pub when_realized: Option<String>,
10418
10419    /// `whenReopened` (added for full ibflex coverage)
10420    #[serde(
10421        rename = "@whenReopened",
10422        default,
10423        deserialize_with = "deserialize_optional_string"
10424    )]
10425    pub when_reopened: Option<String>,
10426
10427    /// `levelOfDetail` (added for full ibflex coverage)
10428    #[serde(
10429        rename = "@levelOfDetail",
10430        default,
10431        deserialize_with = "deserialize_optional_string"
10432    )]
10433    pub level_of_detail: Option<String>,
10434
10435    /// `securityIDType` (added for full ibflex coverage)
10436    #[serde(
10437        rename = "@securityIDType",
10438        default,
10439        deserialize_with = "deserialize_optional_string"
10440    )]
10441    pub security_id_type: Option<String>,
10442}
10443
10444// =============================================================================
10445// Prior Period Types
10446// =============================================================================
10447
10448/// Prior period position
10449#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
10450pub struct PriorPeriodPosition {
10451    /// Account ID
10452    #[serde(
10453        rename = "@accountId",
10454        default,
10455        deserialize_with = "deserialize_optional_string"
10456    )]
10457    pub account_id: Option<String>,
10458
10459    /// Account alias
10460    #[serde(rename = "@acctAlias", default)]
10461    pub acct_alias: Option<String>,
10462
10463    /// Model
10464    #[serde(rename = "@model", default)]
10465    pub model: Option<String>,
10466
10467    /// Symbol
10468    #[serde(rename = "@symbol", default)]
10469    pub symbol: Option<String>,
10470
10471    /// Description
10472    #[serde(rename = "@description", default)]
10473    pub description: Option<String>,
10474
10475    /// Contract ID
10476    #[serde(rename = "@conid", default)]
10477    pub conid: Option<String>,
10478
10479    /// Asset category
10480    #[serde(rename = "@assetCategory", default)]
10481    pub asset_category: Option<AssetCategory>,
10482
10483    /// Prior MTM P&L
10484    #[serde(
10485        rename = "@priorMtmPnl",
10486        default,
10487        deserialize_with = "deserialize_optional_decimal"
10488    )]
10489    pub prior_mtm_pnl: Option<Decimal>,
10490
10491    /// Date
10492    #[serde(
10493        rename = "@date",
10494        default,
10495        deserialize_with = "deserialize_optional_date"
10496    )]
10497    pub date: Option<NaiveDate>,
10498
10499    /// Quantity
10500    #[serde(
10501        rename = "@quantity",
10502        default,
10503        deserialize_with = "deserialize_optional_decimal"
10504    )]
10505    pub quantity: Option<Decimal>,
10506
10507    /// Price
10508    #[serde(
10509        rename = "@price",
10510        default,
10511        deserialize_with = "deserialize_optional_decimal"
10512    )]
10513    pub price: Option<Decimal>,
10514
10515    /// Currency
10516    #[serde(rename = "@currency", default)]
10517    pub currency: Option<String>,
10518
10519    /// `fxRateToBase` (added for full ibflex coverage)
10520    #[serde(
10521        rename = "@fxRateToBase",
10522        default,
10523        deserialize_with = "deserialize_optional_decimal"
10524    )]
10525    pub fx_rate_to_base: Option<Decimal>,
10526
10527    /// `securityID` (added for full ibflex coverage)
10528    #[serde(
10529        rename = "@securityID",
10530        default,
10531        deserialize_with = "deserialize_optional_string"
10532    )]
10533    pub security_id: Option<String>,
10534
10535    /// `cusip` (added for full ibflex coverage)
10536    #[serde(
10537        rename = "@cusip",
10538        default,
10539        deserialize_with = "deserialize_optional_string"
10540    )]
10541    pub cusip: Option<String>,
10542
10543    /// `isin` (added for full ibflex coverage)
10544    #[serde(
10545        rename = "@isin",
10546        default,
10547        deserialize_with = "deserialize_optional_string"
10548    )]
10549    pub isin: Option<String>,
10550
10551    /// `listingExchange` (added for full ibflex coverage)
10552    #[serde(
10553        rename = "@listingExchange",
10554        default,
10555        deserialize_with = "deserialize_optional_string"
10556    )]
10557    pub listing_exchange: Option<String>,
10558
10559    /// `underlyingConid` (added for full ibflex coverage)
10560    #[serde(
10561        rename = "@underlyingConid",
10562        default,
10563        deserialize_with = "deserialize_optional_string"
10564    )]
10565    pub underlying_conid: Option<String>,
10566
10567    /// `underlyingSecurityID` (added for full ibflex coverage)
10568    #[serde(
10569        rename = "@underlyingSecurityID",
10570        default,
10571        deserialize_with = "deserialize_optional_string"
10572    )]
10573    pub underlying_security_id: Option<String>,
10574
10575    /// `underlyingListingExchange` (added for full ibflex coverage)
10576    #[serde(
10577        rename = "@underlyingListingExchange",
10578        default,
10579        deserialize_with = "deserialize_optional_string"
10580    )]
10581    pub underlying_listing_exchange: Option<String>,
10582
10583    /// `sedol` (added for full ibflex coverage)
10584    #[serde(
10585        rename = "@sedol",
10586        default,
10587        deserialize_with = "deserialize_optional_string"
10588    )]
10589    pub sedol: Option<String>,
10590
10591    /// `securityIDType` (added for full ibflex coverage)
10592    #[serde(
10593        rename = "@securityIDType",
10594        default,
10595        deserialize_with = "deserialize_optional_string"
10596    )]
10597    pub security_id_type: Option<String>,
10598
10599    /// `underlyingSymbol` (added for full ibflex coverage)
10600    #[serde(
10601        rename = "@underlyingSymbol",
10602        default,
10603        deserialize_with = "deserialize_optional_string"
10604    )]
10605    pub underlying_symbol: Option<String>,
10606
10607    /// `issuer` (added for full ibflex coverage)
10608    #[serde(
10609        rename = "@issuer",
10610        default,
10611        deserialize_with = "deserialize_optional_string"
10612    )]
10613    pub issuer: Option<String>,
10614
10615    /// `multiplier` (added for full ibflex coverage)
10616    #[serde(
10617        rename = "@multiplier",
10618        default,
10619        deserialize_with = "deserialize_optional_decimal"
10620    )]
10621    pub multiplier: Option<Decimal>,
10622
10623    /// `strike` (added for full ibflex coverage)
10624    #[serde(
10625        rename = "@strike",
10626        default,
10627        deserialize_with = "deserialize_optional_decimal"
10628    )]
10629    pub strike: Option<Decimal>,
10630
10631    /// `expiry` (added for full ibflex coverage)
10632    #[serde(
10633        rename = "@expiry",
10634        default,
10635        deserialize_with = "deserialize_optional_date"
10636    )]
10637    pub expiry: Option<NaiveDate>,
10638
10639    /// `putCall` (added for full ibflex coverage)
10640    #[serde(rename = "@putCall", default)]
10641    pub put_call: Option<PutCall>,
10642
10643    /// `principalAdjustFactor` (added for full ibflex coverage)
10644    #[serde(
10645        rename = "@principalAdjustFactor",
10646        default,
10647        deserialize_with = "deserialize_optional_decimal"
10648    )]
10649    pub principal_adjust_factor: Option<Decimal>,
10650
10651    /// `subCategory` (added for full ibflex coverage)
10652    #[serde(
10653        rename = "@subCategory",
10654        default,
10655        deserialize_with = "deserialize_optional_string"
10656    )]
10657    pub sub_category: Option<String>,
10658
10659    /// `figi` (added for full ibflex coverage)
10660    #[serde(
10661        rename = "@figi",
10662        default,
10663        deserialize_with = "deserialize_optional_string"
10664    )]
10665    pub figi: Option<String>,
10666
10667    /// `issuerCountryCode` (added for full ibflex coverage)
10668    #[serde(
10669        rename = "@issuerCountryCode",
10670        default,
10671        deserialize_with = "deserialize_optional_string"
10672    )]
10673    pub issuer_country_code: Option<String>,
10674
10675    /// `serialNumber` (added for full ibflex coverage)
10676    #[serde(
10677        rename = "@serialNumber",
10678        default,
10679        deserialize_with = "deserialize_optional_decimal"
10680    )]
10681    pub serial_number: Option<Decimal>,
10682
10683    /// `deliveryType` (added for full ibflex coverage)
10684    #[serde(
10685        rename = "@deliveryType",
10686        default,
10687        deserialize_with = "deserialize_optional_decimal"
10688    )]
10689    pub delivery_type: Option<Decimal>,
10690
10691    /// `commodityType` (added for full ibflex coverage)
10692    #[serde(
10693        rename = "@commodityType",
10694        default,
10695        deserialize_with = "deserialize_optional_string"
10696    )]
10697    pub commodity_type: Option<String>,
10698
10699    /// `fineness` (added for full ibflex coverage)
10700    #[serde(
10701        rename = "@fineness",
10702        default,
10703        deserialize_with = "deserialize_optional_decimal"
10704    )]
10705    pub fineness: Option<Decimal>,
10706
10707    /// `weight` (added for full ibflex coverage)
10708    #[serde(
10709        rename = "@weight",
10710        default,
10711        deserialize_with = "deserialize_optional_decimal"
10712    )]
10713    pub weight: Option<Decimal>,
10714}
10715
10716// =============================================================================
10717// Interest Detail Types
10718// =============================================================================
10719
10720/// Tier interest detail
10721#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
10722pub struct TierInterestDetail {
10723    /// Account ID
10724    #[serde(
10725        rename = "@accountId",
10726        default,
10727        deserialize_with = "deserialize_optional_string"
10728    )]
10729    pub account_id: Option<String>,
10730
10731    /// Account alias
10732    #[serde(rename = "@acctAlias", default)]
10733    pub acct_alias: Option<String>,
10734
10735    /// Model
10736    #[serde(rename = "@model", default)]
10737    pub model: Option<String>,
10738
10739    /// Currency
10740    #[serde(rename = "@currency", default)]
10741    pub currency: Option<String>,
10742
10743    /// FX rate to base currency
10744    #[serde(
10745        rename = "@fxRateToBase",
10746        default,
10747        deserialize_with = "deserialize_optional_decimal"
10748    )]
10749    pub fx_rate_to_base: Option<Decimal>,
10750
10751    /// Interest type (e.g., "Debit Interest", "Short Credit Interest")
10752    #[serde(rename = "@interestType", default)]
10753    pub interest_type: Option<String>,
10754
10755    /// Report date
10756    #[serde(
10757        rename = "@reportDate",
10758        default,
10759        deserialize_with = "deserialize_optional_date"
10760    )]
10761    pub report_date: Option<NaiveDate>,
10762
10763    /// Value date
10764    #[serde(
10765        rename = "@valueDate",
10766        default,
10767        deserialize_with = "deserialize_optional_date"
10768    )]
10769    pub value_date: Option<NaiveDate>,
10770
10771    /// Tier break (Roman numerals like "I", "II", etc.)
10772    #[serde(rename = "@tierBreak", default)]
10773    pub tier_break: Option<String>,
10774
10775    /// Balance threshold
10776    #[serde(
10777        rename = "@balanceThreshold",
10778        default,
10779        deserialize_with = "deserialize_optional_decimal"
10780    )]
10781    pub balance_threshold: Option<Decimal>,
10782
10783    /// Securities principal
10784    #[serde(
10785        rename = "@securitiesPrincipal",
10786        default,
10787        deserialize_with = "deserialize_optional_decimal"
10788    )]
10789    pub securities_principal: Option<Decimal>,
10790
10791    /// Commodities principal
10792    #[serde(
10793        rename = "@commoditiesPrincipal",
10794        default,
10795        deserialize_with = "deserialize_optional_decimal"
10796    )]
10797    pub commodities_principal: Option<Decimal>,
10798
10799    /// IBUKL principal
10800    #[serde(
10801        rename = "@ibuklPrincipal",
10802        default,
10803        deserialize_with = "deserialize_optional_decimal"
10804    )]
10805    pub ibukl_principal: Option<Decimal>,
10806
10807    /// Total principal
10808    #[serde(
10809        rename = "@totalPrincipal",
10810        default,
10811        deserialize_with = "deserialize_optional_decimal"
10812    )]
10813    pub total_principal: Option<Decimal>,
10814
10815    /// Interest rate
10816    #[serde(
10817        rename = "@rate",
10818        default,
10819        deserialize_with = "deserialize_optional_decimal"
10820    )]
10821    pub rate: Option<Decimal>,
10822
10823    /// Securities interest
10824    #[serde(
10825        rename = "@securitiesInterest",
10826        default,
10827        deserialize_with = "deserialize_optional_decimal"
10828    )]
10829    pub securities_interest: Option<Decimal>,
10830
10831    /// Commodities interest
10832    #[serde(
10833        rename = "@commoditiesInterest",
10834        default,
10835        deserialize_with = "deserialize_optional_decimal"
10836    )]
10837    pub commodities_interest: Option<Decimal>,
10838
10839    /// IBUKL interest
10840    #[serde(
10841        rename = "@ibuklInterest",
10842        default,
10843        deserialize_with = "deserialize_optional_decimal"
10844    )]
10845    pub ibukl_interest: Option<Decimal>,
10846
10847    /// Total interest
10848    #[serde(
10849        rename = "@totalInterest",
10850        default,
10851        deserialize_with = "deserialize_optional_decimal"
10852    )]
10853    pub total_interest: Option<Decimal>,
10854
10855    /// Code
10856    #[serde(rename = "@code", default)]
10857    pub code: Option<String>,
10858
10859    /// From account
10860    #[serde(rename = "@fromAcct", default)]
10861    pub from_acct: Option<String>,
10862
10863    /// To account
10864    #[serde(rename = "@toAcct", default)]
10865    pub to_acct: Option<String>,
10866
10867    /// Margin balance
10868    #[serde(rename = "@marginBalance", default)]
10869    pub margin_balance: Option<String>,
10870
10871    // Legacy fields (may appear in older reports)
10872    /// Date
10873    #[serde(
10874        rename = "@date",
10875        default,
10876        deserialize_with = "deserialize_optional_date"
10877    )]
10878    pub date: Option<NaiveDate>,
10879
10880    /// From date
10881    #[serde(
10882        rename = "@fromDate",
10883        default,
10884        deserialize_with = "deserialize_optional_date"
10885    )]
10886    pub from_date: Option<NaiveDate>,
10887
10888    /// To date
10889    #[serde(
10890        rename = "@toDate",
10891        default,
10892        deserialize_with = "deserialize_optional_date"
10893    )]
10894    pub to_date: Option<NaiveDate>,
10895
10896    /// Balance (legacy)
10897    #[serde(
10898        rename = "@balance",
10899        default,
10900        deserialize_with = "deserialize_optional_decimal"
10901    )]
10902    pub balance: Option<Decimal>,
10903
10904    /// Interest rate (legacy field name)
10905    #[serde(
10906        rename = "@interestRate",
10907        default,
10908        deserialize_with = "deserialize_optional_decimal"
10909    )]
10910    pub interest_rate: Option<Decimal>,
10911
10912    /// Interest (legacy)
10913    #[serde(
10914        rename = "@interest",
10915        default,
10916        deserialize_with = "deserialize_optional_decimal"
10917    )]
10918    pub interest: Option<Decimal>,
10919}
10920
10921// =============================================================================
10922// Miscellaneous Activity Types
10923// =============================================================================
10924
10925/// Debit card activity
10926#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
10927pub struct DebitCardActivity {
10928    /// Account ID
10929    #[serde(
10930        rename = "@accountId",
10931        default,
10932        deserialize_with = "deserialize_optional_string"
10933    )]
10934    pub account_id: Option<String>,
10935
10936    /// Account alias
10937    #[serde(rename = "@acctAlias", default)]
10938    pub acct_alias: Option<String>,
10939
10940    /// Model
10941    #[serde(rename = "@model", default)]
10942    pub model: Option<String>,
10943
10944    /// Date
10945    #[serde(
10946        rename = "@date",
10947        default,
10948        deserialize_with = "deserialize_optional_date"
10949    )]
10950    pub date: Option<NaiveDate>,
10951
10952    /// Merchant
10953    #[serde(rename = "@merchant", default)]
10954    pub merchant: Option<String>,
10955
10956    /// Category
10957    #[serde(rename = "@category", default)]
10958    pub category: Option<String>,
10959
10960    /// Status
10961    #[serde(rename = "@status", default)]
10962    pub status: Option<String>,
10963
10964    /// Transaction type
10965    #[serde(rename = "@transactionType", default)]
10966    pub transaction_type: Option<String>,
10967
10968    /// Amount
10969    #[serde(
10970        rename = "@amount",
10971        default,
10972        deserialize_with = "deserialize_optional_decimal"
10973    )]
10974    pub amount: Option<Decimal>,
10975
10976    /// Currency
10977    #[serde(rename = "@currency", default)]
10978    pub currency: Option<String>,
10979
10980    /// FX rate to base
10981    #[serde(
10982        rename = "@fxRateToBase",
10983        default,
10984        deserialize_with = "deserialize_optional_decimal"
10985    )]
10986    pub fx_rate_to_base: Option<Decimal>,
10987
10988    /// `assetCategory` (added for full ibflex coverage)
10989    #[serde(rename = "@assetCategory", default)]
10990    pub asset_category: Option<AssetCategory>,
10991
10992    /// `reportDate` (added for full ibflex coverage)
10993    #[serde(
10994        rename = "@reportDate",
10995        default,
10996        deserialize_with = "deserialize_optional_date"
10997    )]
10998    pub report_date: Option<NaiveDate>,
10999
11000    /// `postingDate` (added for full ibflex coverage)
11001    #[serde(
11002        rename = "@postingDate",
11003        default,
11004        deserialize_with = "deserialize_optional_date"
11005    )]
11006    pub posting_date: Option<NaiveDate>,
11007
11008    /// `transactionDateTime` (added for full ibflex coverage)
11009    #[serde(
11010        rename = "@transactionDateTime",
11011        default,
11012        deserialize_with = "deserialize_optional_string"
11013    )]
11014    pub transaction_date_time: Option<String>,
11015
11016    /// `merchantNameLocation` (added for full ibflex coverage)
11017    #[serde(
11018        rename = "@merchantNameLocation",
11019        default,
11020        deserialize_with = "deserialize_optional_string"
11021    )]
11022    pub merchant_name_location: Option<String>,
11023}
11024
11025/// Sales tax
11026#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
11027pub struct SalesTax {
11028    /// Account ID
11029    #[serde(
11030        rename = "@accountId",
11031        default,
11032        deserialize_with = "deserialize_optional_string"
11033    )]
11034    pub account_id: Option<String>,
11035
11036    /// Account alias
11037    #[serde(rename = "@acctAlias", default)]
11038    pub acct_alias: Option<String>,
11039
11040    /// Model
11041    #[serde(rename = "@model", default)]
11042    pub model: Option<String>,
11043
11044    /// Date
11045    #[serde(
11046        rename = "@date",
11047        default,
11048        deserialize_with = "deserialize_optional_date"
11049    )]
11050    pub date: Option<NaiveDate>,
11051
11052    /// Symbol
11053    #[serde(rename = "@symbol", default)]
11054    pub symbol: Option<String>,
11055
11056    /// Description
11057    #[serde(rename = "@description", default)]
11058    pub description: Option<String>,
11059
11060    /// Contract ID
11061    #[serde(rename = "@conid", default)]
11062    pub conid: Option<String>,
11063
11064    /// Tax type
11065    #[serde(rename = "@taxType", default)]
11066    pub tax_type: Option<String>,
11067
11068    /// Tax amount
11069    #[serde(
11070        rename = "@taxAmount",
11071        default,
11072        deserialize_with = "deserialize_optional_decimal"
11073    )]
11074    pub tax_amount: Option<Decimal>,
11075
11076    /// Proceeds
11077    #[serde(
11078        rename = "@proceeds",
11079        default,
11080        deserialize_with = "deserialize_optional_decimal"
11081    )]
11082    pub proceeds: Option<Decimal>,
11083
11084    /// Currency
11085    #[serde(rename = "@currency", default)]
11086    pub currency: Option<String>,
11087
11088    /// FX rate to base
11089    #[serde(
11090        rename = "@fxRateToBase",
11091        default,
11092        deserialize_with = "deserialize_optional_decimal"
11093    )]
11094    pub fx_rate_to_base: Option<Decimal>,
11095
11096    /// `assetCategory` (added for full ibflex coverage)
11097    #[serde(rename = "@assetCategory", default)]
11098    pub asset_category: Option<AssetCategory>,
11099
11100    /// `subCategory` (added for full ibflex coverage)
11101    #[serde(
11102        rename = "@subCategory",
11103        default,
11104        deserialize_with = "deserialize_optional_string"
11105    )]
11106    pub sub_category: Option<String>,
11107
11108    /// `securityID` (added for full ibflex coverage)
11109    #[serde(
11110        rename = "@securityID",
11111        default,
11112        deserialize_with = "deserialize_optional_string"
11113    )]
11114    pub security_id: Option<String>,
11115
11116    /// `securityIDType` (added for full ibflex coverage)
11117    #[serde(
11118        rename = "@securityIDType",
11119        default,
11120        deserialize_with = "deserialize_optional_string"
11121    )]
11122    pub security_id_type: Option<String>,
11123
11124    /// `cusip` (added for full ibflex coverage)
11125    #[serde(
11126        rename = "@cusip",
11127        default,
11128        deserialize_with = "deserialize_optional_string"
11129    )]
11130    pub cusip: Option<String>,
11131
11132    /// `isin` (added for full ibflex coverage)
11133    #[serde(
11134        rename = "@isin",
11135        default,
11136        deserialize_with = "deserialize_optional_string"
11137    )]
11138    pub isin: Option<String>,
11139
11140    /// `listingExchange` (added for full ibflex coverage)
11141    #[serde(
11142        rename = "@listingExchange",
11143        default,
11144        deserialize_with = "deserialize_optional_string"
11145    )]
11146    pub listing_exchange: Option<String>,
11147
11148    /// `underlyingConid` (added for full ibflex coverage)
11149    #[serde(
11150        rename = "@underlyingConid",
11151        default,
11152        deserialize_with = "deserialize_optional_string"
11153    )]
11154    pub underlying_conid: Option<String>,
11155
11156    /// `underlyingSecurityID` (added for full ibflex coverage)
11157    #[serde(
11158        rename = "@underlyingSecurityID",
11159        default,
11160        deserialize_with = "deserialize_optional_string"
11161    )]
11162    pub underlying_security_id: Option<String>,
11163
11164    /// `underlyingSymbol` (added for full ibflex coverage)
11165    #[serde(
11166        rename = "@underlyingSymbol",
11167        default,
11168        deserialize_with = "deserialize_optional_string"
11169    )]
11170    pub underlying_symbol: Option<String>,
11171
11172    /// `underlyingListingExchange` (added for full ibflex coverage)
11173    #[serde(
11174        rename = "@underlyingListingExchange",
11175        default,
11176        deserialize_with = "deserialize_optional_string"
11177    )]
11178    pub underlying_listing_exchange: Option<String>,
11179
11180    /// `issuer` (added for full ibflex coverage)
11181    #[serde(
11182        rename = "@issuer",
11183        default,
11184        deserialize_with = "deserialize_optional_string"
11185    )]
11186    pub issuer: Option<String>,
11187
11188    /// `multiplier` (added for full ibflex coverage)
11189    #[serde(
11190        rename = "@multiplier",
11191        default,
11192        deserialize_with = "deserialize_optional_decimal"
11193    )]
11194    pub multiplier: Option<Decimal>,
11195
11196    /// `strike` (added for full ibflex coverage)
11197    #[serde(
11198        rename = "@strike",
11199        default,
11200        deserialize_with = "deserialize_optional_decimal"
11201    )]
11202    pub strike: Option<Decimal>,
11203
11204    /// `expiry` (added for full ibflex coverage)
11205    #[serde(
11206        rename = "@expiry",
11207        default,
11208        deserialize_with = "deserialize_optional_date"
11209    )]
11210    pub expiry: Option<NaiveDate>,
11211
11212    /// `putCall` (added for full ibflex coverage)
11213    #[serde(rename = "@putCall", default)]
11214    pub put_call: Option<PutCall>,
11215
11216    /// `principalAdjustFactor` (added for full ibflex coverage)
11217    #[serde(
11218        rename = "@principalAdjustFactor",
11219        default,
11220        deserialize_with = "deserialize_optional_decimal"
11221    )]
11222    pub principal_adjust_factor: Option<Decimal>,
11223
11224    /// `country` (added for full ibflex coverage)
11225    #[serde(
11226        rename = "@country",
11227        default,
11228        deserialize_with = "deserialize_optional_string"
11229    )]
11230    pub country: Option<String>,
11231
11232    /// `payer` (added for full ibflex coverage)
11233    #[serde(
11234        rename = "@payer",
11235        default,
11236        deserialize_with = "deserialize_optional_string"
11237    )]
11238    pub payer: Option<String>,
11239
11240    /// `taxableDescription` (added for full ibflex coverage)
11241    #[serde(
11242        rename = "@taxableDescription",
11243        default,
11244        deserialize_with = "deserialize_optional_string"
11245    )]
11246    pub taxable_description: Option<String>,
11247
11248    /// `taxableAmount` (added for full ibflex coverage)
11249    #[serde(
11250        rename = "@taxableAmount",
11251        default,
11252        deserialize_with = "deserialize_optional_decimal"
11253    )]
11254    pub taxable_amount: Option<Decimal>,
11255
11256    /// `taxRate` (added for full ibflex coverage)
11257    #[serde(
11258        rename = "@taxRate",
11259        default,
11260        deserialize_with = "deserialize_optional_decimal"
11261    )]
11262    pub tax_rate: Option<Decimal>,
11263
11264    /// `salesTax` (added for full ibflex coverage)
11265    #[serde(
11266        rename = "@salesTax",
11267        default,
11268        deserialize_with = "deserialize_optional_decimal"
11269    )]
11270    pub sales_tax: Option<Decimal>,
11271
11272    /// `taxableTransactionID` (added for full ibflex coverage)
11273    #[serde(
11274        rename = "@taxableTransactionID",
11275        default,
11276        deserialize_with = "deserialize_optional_string"
11277    )]
11278    pub taxable_transaction_id: Option<String>,
11279
11280    /// `transactionID` (added for full ibflex coverage)
11281    #[serde(
11282        rename = "@transactionID",
11283        default,
11284        deserialize_with = "deserialize_optional_string"
11285    )]
11286    pub transaction_id: Option<String>,
11287
11288    /// `serialNumber` (added for full ibflex coverage)
11289    #[serde(
11290        rename = "@serialNumber",
11291        default,
11292        deserialize_with = "deserialize_optional_string"
11293    )]
11294    pub serial_number: Option<String>,
11295
11296    /// `deliveryType` (added for full ibflex coverage)
11297    #[serde(
11298        rename = "@deliveryType",
11299        default,
11300        deserialize_with = "deserialize_optional_string"
11301    )]
11302    pub delivery_type: Option<String>,
11303
11304    /// `commodityType` (added for full ibflex coverage)
11305    #[serde(
11306        rename = "@commodityType",
11307        default,
11308        deserialize_with = "deserialize_optional_string"
11309    )]
11310    pub commodity_type: Option<String>,
11311
11312    /// `fineness` (added for full ibflex coverage)
11313    #[serde(
11314        rename = "@fineness",
11315        default,
11316        deserialize_with = "deserialize_optional_decimal"
11317    )]
11318    pub fineness: Option<Decimal>,
11319
11320    /// `weight` (added for full ibflex coverage)
11321    #[serde(
11322        rename = "@weight",
11323        default,
11324        deserialize_with = "deserialize_optional_string"
11325    )]
11326    pub weight: Option<String>,
11327
11328    /// `code` (added for full ibflex coverage)
11329    #[serde(
11330        rename = "@code",
11331        default,
11332        deserialize_with = "deserialize_optional_string"
11333    )]
11334    pub code: Option<String>,
11335}
11336
11337// =============================================================================
11338// Summary Types
11339// =============================================================================
11340
11341/// Symbol summary (aggregated trading data by symbol)
11342#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
11343pub struct SymbolSummary {
11344    /// Account ID
11345    #[serde(
11346        rename = "@accountId",
11347        default,
11348        deserialize_with = "deserialize_optional_string"
11349    )]
11350    pub account_id: Option<String>,
11351
11352    /// Account alias
11353    #[serde(rename = "@acctAlias", default)]
11354    pub acct_alias: Option<String>,
11355
11356    /// Model
11357    #[serde(rename = "@model", default)]
11358    pub model: Option<String>,
11359
11360    /// Symbol
11361    #[serde(rename = "@symbol", default)]
11362    pub symbol: Option<String>,
11363
11364    /// Description
11365    #[serde(rename = "@description", default)]
11366    pub description: Option<String>,
11367
11368    /// Contract ID
11369    #[serde(rename = "@conid", default)]
11370    pub conid: Option<String>,
11371
11372    /// Asset category
11373    #[serde(rename = "@assetCategory", default)]
11374    pub asset_category: Option<AssetCategory>,
11375
11376    /// Total buy quantity
11377    #[serde(
11378        rename = "@totalBuyQuantity",
11379        default,
11380        deserialize_with = "deserialize_optional_decimal"
11381    )]
11382    pub total_buy_quantity: Option<Decimal>,
11383
11384    /// Total sell quantity
11385    #[serde(
11386        rename = "@totalSellQuantity",
11387        default,
11388        deserialize_with = "deserialize_optional_decimal"
11389    )]
11390    pub total_sell_quantity: Option<Decimal>,
11391
11392    /// Total buy value
11393    #[serde(
11394        rename = "@totalBuyValue",
11395        default,
11396        deserialize_with = "deserialize_optional_decimal"
11397    )]
11398    pub total_buy_value: Option<Decimal>,
11399
11400    /// Total sell value
11401    #[serde(
11402        rename = "@totalSellValue",
11403        default,
11404        deserialize_with = "deserialize_optional_decimal"
11405    )]
11406    pub total_sell_value: Option<Decimal>,
11407
11408    /// Total commission
11409    #[serde(
11410        rename = "@totalCommission",
11411        default,
11412        deserialize_with = "deserialize_optional_decimal"
11413    )]
11414    pub total_commission: Option<Decimal>,
11415
11416    /// Realized P&L
11417    #[serde(
11418        rename = "@realizedPnl",
11419        default,
11420        deserialize_with = "deserialize_optional_decimal"
11421    )]
11422    pub realized_pnl: Option<Decimal>,
11423
11424    /// Currency
11425    #[serde(rename = "@currency", default)]
11426    pub currency: Option<String>,
11427
11428    /// `securityID` (added for full ibflex coverage)
11429    #[serde(
11430        rename = "@securityID",
11431        default,
11432        deserialize_with = "deserialize_optional_string"
11433    )]
11434    pub security_id: Option<String>,
11435
11436    /// `securityIDType` (added for full ibflex coverage)
11437    #[serde(
11438        rename = "@securityIDType",
11439        default,
11440        deserialize_with = "deserialize_optional_string"
11441    )]
11442    pub security_id_type: Option<String>,
11443
11444    /// `cusip` (added for full ibflex coverage)
11445    #[serde(
11446        rename = "@cusip",
11447        default,
11448        deserialize_with = "deserialize_optional_string"
11449    )]
11450    pub cusip: Option<String>,
11451
11452    /// `isin` (added for full ibflex coverage)
11453    #[serde(
11454        rename = "@isin",
11455        default,
11456        deserialize_with = "deserialize_optional_string"
11457    )]
11458    pub isin: Option<String>,
11459
11460    /// `listingExchange` (added for full ibflex coverage)
11461    #[serde(
11462        rename = "@listingExchange",
11463        default,
11464        deserialize_with = "deserialize_optional_string"
11465    )]
11466    pub listing_exchange: Option<String>,
11467
11468    /// `underlyingConid` (added for full ibflex coverage)
11469    #[serde(
11470        rename = "@underlyingConid",
11471        default,
11472        deserialize_with = "deserialize_optional_string"
11473    )]
11474    pub underlying_conid: Option<String>,
11475
11476    /// `underlyingSymbol` (added for full ibflex coverage)
11477    #[serde(
11478        rename = "@underlyingSymbol",
11479        default,
11480        deserialize_with = "deserialize_optional_string"
11481    )]
11482    pub underlying_symbol: Option<String>,
11483
11484    /// `underlyingSecurityID` (added for full ibflex coverage)
11485    #[serde(
11486        rename = "@underlyingSecurityID",
11487        default,
11488        deserialize_with = "deserialize_optional_string"
11489    )]
11490    pub underlying_security_id: Option<String>,
11491
11492    /// `underlyingListingExchange` (added for full ibflex coverage)
11493    #[serde(
11494        rename = "@underlyingListingExchange",
11495        default,
11496        deserialize_with = "deserialize_optional_string"
11497    )]
11498    pub underlying_listing_exchange: Option<String>,
11499
11500    /// `issuer` (added for full ibflex coverage)
11501    #[serde(
11502        rename = "@issuer",
11503        default,
11504        deserialize_with = "deserialize_optional_string"
11505    )]
11506    pub issuer: Option<String>,
11507
11508    /// `multiplier` (added for full ibflex coverage)
11509    #[serde(
11510        rename = "@multiplier",
11511        default,
11512        deserialize_with = "deserialize_optional_decimal"
11513    )]
11514    pub multiplier: Option<Decimal>,
11515
11516    /// `strike` (added for full ibflex coverage)
11517    #[serde(
11518        rename = "@strike",
11519        default,
11520        deserialize_with = "deserialize_optional_decimal"
11521    )]
11522    pub strike: Option<Decimal>,
11523
11524    /// `expiry` (added for full ibflex coverage)
11525    #[serde(
11526        rename = "@expiry",
11527        default,
11528        deserialize_with = "deserialize_optional_date"
11529    )]
11530    pub expiry: Option<NaiveDate>,
11531
11532    /// `putCall` (added for full ibflex coverage)
11533    #[serde(rename = "@putCall", default)]
11534    pub put_call: Option<PutCall>,
11535
11536    /// `principalAdjustFactor` (added for full ibflex coverage)
11537    #[serde(
11538        rename = "@principalAdjustFactor",
11539        default,
11540        deserialize_with = "deserialize_optional_decimal"
11541    )]
11542    pub principal_adjust_factor: Option<Decimal>,
11543
11544    /// `transactionType` (added for full ibflex coverage)
11545    #[serde(rename = "@transactionType", default)]
11546    pub transaction_type: Option<TradeType>,
11547
11548    /// `tradeID` (added for full ibflex coverage)
11549    #[serde(
11550        rename = "@tradeID",
11551        default,
11552        deserialize_with = "deserialize_optional_string"
11553    )]
11554    pub trade_id: Option<String>,
11555
11556    /// `orderID` (added for full ibflex coverage)
11557    #[serde(
11558        rename = "@orderID",
11559        default,
11560        deserialize_with = "deserialize_optional_decimal"
11561    )]
11562    pub order_id: Option<Decimal>,
11563
11564    /// `execID` (added for full ibflex coverage)
11565    #[serde(
11566        rename = "@execID",
11567        default,
11568        deserialize_with = "deserialize_optional_string"
11569    )]
11570    pub exec_id: Option<String>,
11571
11572    /// `brokerageOrderID` (added for full ibflex coverage)
11573    #[serde(
11574        rename = "@brokerageOrderID",
11575        default,
11576        deserialize_with = "deserialize_optional_string"
11577    )]
11578    pub brokerage_order_id: Option<String>,
11579
11580    /// `orderReference` (added for full ibflex coverage)
11581    #[serde(
11582        rename = "@orderReference",
11583        default,
11584        deserialize_with = "deserialize_optional_string"
11585    )]
11586    pub order_reference: Option<String>,
11587
11588    /// `volatilityOrderLink` (added for full ibflex coverage)
11589    #[serde(
11590        rename = "@volatilityOrderLink",
11591        default,
11592        deserialize_with = "deserialize_optional_string"
11593    )]
11594    pub volatility_order_link: Option<String>,
11595
11596    /// `clearingFirmID` (added for full ibflex coverage)
11597    #[serde(
11598        rename = "@clearingFirmID",
11599        default,
11600        deserialize_with = "deserialize_optional_string"
11601    )]
11602    pub clearing_firm_id: Option<String>,
11603
11604    /// `origTradePrice` (added for full ibflex coverage)
11605    #[serde(
11606        rename = "@origTradePrice",
11607        default,
11608        deserialize_with = "deserialize_optional_decimal"
11609    )]
11610    pub orig_trade_price: Option<Decimal>,
11611
11612    /// `origTradeDate` (added for full ibflex coverage)
11613    #[serde(
11614        rename = "@origTradeDate",
11615        default,
11616        deserialize_with = "deserialize_optional_date"
11617    )]
11618    pub orig_trade_date: Option<NaiveDate>,
11619
11620    /// `origTradeID` (added for full ibflex coverage)
11621    #[serde(
11622        rename = "@origTradeID",
11623        default,
11624        deserialize_with = "deserialize_optional_string"
11625    )]
11626    pub orig_trade_id: Option<String>,
11627
11628    /// `orderTime` (added for full ibflex coverage)
11629    #[serde(
11630        rename = "@orderTime",
11631        default,
11632        deserialize_with = "deserialize_optional_string"
11633    )]
11634    pub order_time: Option<String>,
11635
11636    /// `dateTime` (added for full ibflex coverage)
11637    #[serde(
11638        rename = "@dateTime",
11639        default,
11640        deserialize_with = "deserialize_optional_string"
11641    )]
11642    pub date_time: Option<String>,
11643
11644    /// `reportDate` (added for full ibflex coverage)
11645    #[serde(
11646        rename = "@reportDate",
11647        default,
11648        deserialize_with = "deserialize_optional_date"
11649    )]
11650    pub report_date: Option<NaiveDate>,
11651
11652    /// `settleDate` (added for full ibflex coverage)
11653    #[serde(
11654        rename = "@settleDate",
11655        default,
11656        deserialize_with = "deserialize_optional_date"
11657    )]
11658    pub settle_date: Option<NaiveDate>,
11659
11660    /// `tradeDate` (added for full ibflex coverage)
11661    #[serde(
11662        rename = "@tradeDate",
11663        default,
11664        deserialize_with = "deserialize_optional_date"
11665    )]
11666    pub trade_date: Option<NaiveDate>,
11667
11668    /// `exchange` (added for full ibflex coverage)
11669    #[serde(
11670        rename = "@exchange",
11671        default,
11672        deserialize_with = "deserialize_optional_string"
11673    )]
11674    pub exchange: Option<String>,
11675
11676    /// `buySell` (added for full ibflex coverage)
11677    #[serde(rename = "@buySell", default)]
11678    pub buy_sell: Option<BuySell>,
11679
11680    /// `quantity` (added for full ibflex coverage)
11681    #[serde(
11682        rename = "@quantity",
11683        default,
11684        deserialize_with = "deserialize_optional_decimal"
11685    )]
11686    pub quantity: Option<Decimal>,
11687
11688    /// `price` (added for full ibflex coverage)
11689    #[serde(
11690        rename = "@price",
11691        default,
11692        deserialize_with = "deserialize_optional_decimal"
11693    )]
11694    pub price: Option<Decimal>,
11695
11696    /// `amount` (added for full ibflex coverage)
11697    #[serde(
11698        rename = "@amount",
11699        default,
11700        deserialize_with = "deserialize_optional_decimal"
11701    )]
11702    pub amount: Option<Decimal>,
11703
11704    /// `proceeds` (added for full ibflex coverage)
11705    #[serde(
11706        rename = "@proceeds",
11707        default,
11708        deserialize_with = "deserialize_optional_decimal"
11709    )]
11710    pub proceeds: Option<Decimal>,
11711
11712    /// `commission` (added for full ibflex coverage)
11713    #[serde(
11714        rename = "@commission",
11715        default,
11716        deserialize_with = "deserialize_optional_decimal"
11717    )]
11718    pub commission: Option<Decimal>,
11719
11720    /// `brokerExecutionCommission` (added for full ibflex coverage)
11721    #[serde(
11722        rename = "@brokerExecutionCommission",
11723        default,
11724        deserialize_with = "deserialize_optional_decimal"
11725    )]
11726    pub broker_execution_commission: Option<Decimal>,
11727
11728    /// `brokerClearingCommission` (added for full ibflex coverage)
11729    #[serde(
11730        rename = "@brokerClearingCommission",
11731        default,
11732        deserialize_with = "deserialize_optional_decimal"
11733    )]
11734    pub broker_clearing_commission: Option<Decimal>,
11735
11736    /// `thirdPartyExecutionCommission` (added for full ibflex coverage)
11737    #[serde(
11738        rename = "@thirdPartyExecutionCommission",
11739        default,
11740        deserialize_with = "deserialize_optional_decimal"
11741    )]
11742    pub third_party_execution_commission: Option<Decimal>,
11743
11744    /// `thirdPartyClearingCommission` (added for full ibflex coverage)
11745    #[serde(
11746        rename = "@thirdPartyClearingCommission",
11747        default,
11748        deserialize_with = "deserialize_optional_decimal"
11749    )]
11750    pub third_party_clearing_commission: Option<Decimal>,
11751
11752    /// `thirdPartyRegulatoryCommission` (added for full ibflex coverage)
11753    #[serde(
11754        rename = "@thirdPartyRegulatoryCommission",
11755        default,
11756        deserialize_with = "deserialize_optional_decimal"
11757    )]
11758    pub third_party_regulatory_commission: Option<Decimal>,
11759
11760    /// `otherCommission` (added for full ibflex coverage)
11761    #[serde(
11762        rename = "@otherCommission",
11763        default,
11764        deserialize_with = "deserialize_optional_decimal"
11765    )]
11766    pub other_commission: Option<Decimal>,
11767
11768    /// `commissionCurrency` (added for full ibflex coverage)
11769    #[serde(
11770        rename = "@commissionCurrency",
11771        default,
11772        deserialize_with = "deserialize_optional_string"
11773    )]
11774    pub commission_currency: Option<String>,
11775
11776    /// `tax` (added for full ibflex coverage)
11777    #[serde(
11778        rename = "@tax",
11779        default,
11780        deserialize_with = "deserialize_optional_decimal"
11781    )]
11782    pub tax: Option<Decimal>,
11783
11784    /// `code` (added for full ibflex coverage)
11785    #[serde(
11786        rename = "@code",
11787        default,
11788        deserialize_with = "deserialize_optional_string"
11789    )]
11790    pub code: Option<String>,
11791
11792    /// `orderType` (added for full ibflex coverage)
11793    #[serde(rename = "@orderType", default)]
11794    pub order_type: Option<OrderType>,
11795
11796    /// `levelOfDetail` (added for full ibflex coverage)
11797    #[serde(
11798        rename = "@levelOfDetail",
11799        default,
11800        deserialize_with = "deserialize_optional_string"
11801    )]
11802    pub level_of_detail: Option<String>,
11803
11804    /// `traderID` (added for full ibflex coverage)
11805    #[serde(
11806        rename = "@traderID",
11807        default,
11808        deserialize_with = "deserialize_optional_string"
11809    )]
11810    pub trader_id: Option<String>,
11811
11812    /// `isAPIOrder` (added for full ibflex coverage)
11813    #[serde(
11814        rename = "@isAPIOrder",
11815        default,
11816        deserialize_with = "deserialize_optional_bool"
11817    )]
11818    pub is_api_order: Option<bool>,
11819
11820    /// `allocatedTo` (added for full ibflex coverage)
11821    #[serde(
11822        rename = "@allocatedTo",
11823        default,
11824        deserialize_with = "deserialize_optional_string"
11825    )]
11826    pub allocated_to: Option<String>,
11827
11828    /// `accruedInt` (added for full ibflex coverage)
11829    #[serde(
11830        rename = "@accruedInt",
11831        default,
11832        deserialize_with = "deserialize_optional_decimal"
11833    )]
11834    pub accrued_int: Option<Decimal>,
11835
11836    /// `fxRateToBase` (added for full ibflex coverage)
11837    #[serde(
11838        rename = "@fxRateToBase",
11839        default,
11840        deserialize_with = "deserialize_optional_decimal"
11841    )]
11842    pub fx_rate_to_base: Option<Decimal>,
11843
11844    /// `subCategory` (added for full ibflex coverage)
11845    #[serde(
11846        rename = "@subCategory",
11847        default,
11848        deserialize_with = "deserialize_optional_string"
11849    )]
11850    pub sub_category: Option<String>,
11851
11852    /// `figi` (added for full ibflex coverage)
11853    #[serde(
11854        rename = "@figi",
11855        default,
11856        deserialize_with = "deserialize_optional_string"
11857    )]
11858    pub figi: Option<String>,
11859
11860    /// `issuerCountryCode` (added for full ibflex coverage)
11861    #[serde(
11862        rename = "@issuerCountryCode",
11863        default,
11864        deserialize_with = "deserialize_optional_string"
11865    )]
11866    pub issuer_country_code: Option<String>,
11867
11868    /// `relatedTradeID` (added for full ibflex coverage)
11869    #[serde(
11870        rename = "@relatedTradeID",
11871        default,
11872        deserialize_with = "deserialize_optional_string"
11873    )]
11874    pub related_trade_id: Option<String>,
11875
11876    /// `origTransactionID` (added for full ibflex coverage)
11877    #[serde(
11878        rename = "@origTransactionID",
11879        default,
11880        deserialize_with = "deserialize_optional_string"
11881    )]
11882    pub orig_transaction_id: Option<String>,
11883
11884    /// `relatedTransactionID` (added for full ibflex coverage)
11885    #[serde(
11886        rename = "@relatedTransactionID",
11887        default,
11888        deserialize_with = "deserialize_optional_string"
11889    )]
11890    pub related_transaction_id: Option<String>,
11891
11892    /// `positionActionID` (added for full ibflex coverage)
11893    #[serde(
11894        rename = "@positionActionID",
11895        default,
11896        deserialize_with = "deserialize_optional_string"
11897    )]
11898    pub position_action_id: Option<String>,
11899
11900    /// `ibExecID` (added for full ibflex coverage)
11901    #[serde(
11902        rename = "@ibExecID",
11903        default,
11904        deserialize_with = "deserialize_optional_string"
11905    )]
11906    pub ib_exec_id: Option<String>,
11907
11908    /// `extExecID` (added for full ibflex coverage)
11909    #[serde(
11910        rename = "@extExecID",
11911        default,
11912        deserialize_with = "deserialize_optional_string"
11913    )]
11914    pub ext_exec_id: Option<String>,
11915
11916    /// `exchOrderId` (added for full ibflex coverage)
11917    #[serde(
11918        rename = "@exchOrderId",
11919        default,
11920        deserialize_with = "deserialize_optional_string"
11921    )]
11922    pub exch_order_id: Option<String>,
11923
11924    /// `transactionID` (added for full ibflex coverage)
11925    #[serde(
11926        rename = "@transactionID",
11927        default,
11928        deserialize_with = "deserialize_optional_string"
11929    )]
11930    pub transaction_id: Option<String>,
11931
11932    /// `openDateTime` (added for full ibflex coverage)
11933    #[serde(
11934        rename = "@openDateTime",
11935        default,
11936        deserialize_with = "deserialize_optional_string"
11937    )]
11938    pub open_date_time: Option<String>,
11939
11940    /// `holdingPeriodDateTime` (added for full ibflex coverage)
11941    #[serde(
11942        rename = "@holdingPeriodDateTime",
11943        default,
11944        deserialize_with = "deserialize_optional_string"
11945    )]
11946    pub holding_period_date_time: Option<String>,
11947
11948    /// `settleDateTarget` (added for full ibflex coverage)
11949    #[serde(
11950        rename = "@settleDateTarget",
11951        default,
11952        deserialize_with = "deserialize_optional_date"
11953    )]
11954    pub settle_date_target: Option<NaiveDate>,
11955
11956    /// `taxes` (added for full ibflex coverage)
11957    #[serde(
11958        rename = "@taxes",
11959        default,
11960        deserialize_with = "deserialize_optional_decimal"
11961    )]
11962    pub taxes: Option<Decimal>,
11963
11964    /// `tradePrice` (added for full ibflex coverage)
11965    #[serde(
11966        rename = "@tradePrice",
11967        default,
11968        deserialize_with = "deserialize_optional_decimal"
11969    )]
11970    pub trade_price: Option<Decimal>,
11971
11972    /// `tradeMoney` (added for full ibflex coverage)
11973    #[serde(
11974        rename = "@tradeMoney",
11975        default,
11976        deserialize_with = "deserialize_optional_decimal"
11977    )]
11978    pub trade_money: Option<Decimal>,
11979
11980    /// `changeInPrice` (added for full ibflex coverage)
11981    #[serde(
11982        rename = "@changeInPrice",
11983        default,
11984        deserialize_with = "deserialize_optional_decimal"
11985    )]
11986    pub change_in_price: Option<Decimal>,
11987
11988    /// `changeInQuantity` (added for full ibflex coverage)
11989    #[serde(
11990        rename = "@changeInQuantity",
11991        default,
11992        deserialize_with = "deserialize_optional_decimal"
11993    )]
11994    pub change_in_quantity: Option<Decimal>,
11995
11996    /// `closePrice` (added for full ibflex coverage)
11997    #[serde(
11998        rename = "@closePrice",
11999        default,
12000        deserialize_with = "deserialize_optional_decimal"
12001    )]
12002    pub close_price: Option<Decimal>,
12003
12004    /// `commodityType` (added for full ibflex coverage)
12005    #[serde(
12006        rename = "@commodityType",
12007        default,
12008        deserialize_with = "deserialize_optional_string"
12009    )]
12010    pub commodity_type: Option<String>,
12011
12012    /// `cost` (added for full ibflex coverage)
12013    #[serde(
12014        rename = "@cost",
12015        default,
12016        deserialize_with = "deserialize_optional_decimal"
12017    )]
12018    pub cost: Option<Decimal>,
12019
12020    /// `deliveryType` (added for full ibflex coverage)
12021    #[serde(
12022        rename = "@deliveryType",
12023        default,
12024        deserialize_with = "deserialize_optional_string"
12025    )]
12026    pub delivery_type: Option<String>,
12027
12028    /// `fifoPnlRealized` (added for full ibflex coverage)
12029    #[serde(
12030        rename = "@fifoPnlRealized",
12031        default,
12032        deserialize_with = "deserialize_optional_decimal"
12033    )]
12034    pub fifo_pnl_realized: Option<Decimal>,
12035
12036    /// `fineness` (added for full ibflex coverage)
12037    #[serde(
12038        rename = "@fineness",
12039        default,
12040        deserialize_with = "deserialize_optional_decimal"
12041    )]
12042    pub fineness: Option<Decimal>,
12043
12044    /// `ibCommission` (added for full ibflex coverage)
12045    #[serde(
12046        rename = "@ibCommission",
12047        default,
12048        deserialize_with = "deserialize_optional_decimal"
12049    )]
12050    pub ib_commission: Option<Decimal>,
12051
12052    /// `ibCommissionCurrency` (added for full ibflex coverage)
12053    #[serde(
12054        rename = "@ibCommissionCurrency",
12055        default,
12056        deserialize_with = "deserialize_optional_string"
12057    )]
12058    pub ib_commission_currency: Option<String>,
12059
12060    /// `ibOrderID` (added for full ibflex coverage)
12061    #[serde(
12062        rename = "@ibOrderID",
12063        default,
12064        deserialize_with = "deserialize_optional_string"
12065    )]
12066    pub ib_order_id: Option<String>,
12067
12068    /// `initialInvestment` (added for full ibflex coverage)
12069    #[serde(
12070        rename = "@initialInvestment",
12071        default,
12072        deserialize_with = "deserialize_optional_bool"
12073    )]
12074    pub initial_investment: Option<bool>,
12075
12076    /// `mtmPnl` (added for full ibflex coverage)
12077    #[serde(
12078        rename = "@mtmPnl",
12079        default,
12080        deserialize_with = "deserialize_optional_decimal"
12081    )]
12082    pub mtm_pnl: Option<Decimal>,
12083
12084    /// `netCash` (added for full ibflex coverage)
12085    #[serde(
12086        rename = "@netCash",
12087        default,
12088        deserialize_with = "deserialize_optional_decimal"
12089    )]
12090    pub net_cash: Option<Decimal>,
12091
12092    /// `netCashInBase` (added for full ibflex coverage)
12093    #[serde(
12094        rename = "@netCashInBase",
12095        default,
12096        deserialize_with = "deserialize_optional_decimal"
12097    )]
12098    pub net_cash_in_base: Option<Decimal>,
12099
12100    /// `notes` (added for full ibflex coverage)
12101    #[serde(
12102        rename = "@notes",
12103        default,
12104        deserialize_with = "deserialize_optional_string"
12105    )]
12106    pub notes: Option<String>,
12107
12108    /// `openCloseIndicator` (added for full ibflex coverage)
12109    #[serde(rename = "@openCloseIndicator", default)]
12110    pub open_close_indicator: Option<OpenClose>,
12111
12112    /// `origOrderID` (added for full ibflex coverage)
12113    #[serde(
12114        rename = "@origOrderID",
12115        default,
12116        deserialize_with = "deserialize_optional_string"
12117    )]
12118    pub orig_order_id: Option<String>,
12119
12120    /// `rtn` (added for full ibflex coverage)
12121    #[serde(
12122        rename = "@rtn",
12123        default,
12124        deserialize_with = "deserialize_optional_string"
12125    )]
12126    pub rtn: Option<String>,
12127
12128    /// `serialNumber` (added for full ibflex coverage)
12129    #[serde(
12130        rename = "@serialNumber",
12131        default,
12132        deserialize_with = "deserialize_optional_string"
12133    )]
12134    pub serial_number: Option<String>,
12135
12136    /// `weight` (added for full ibflex coverage)
12137    #[serde(
12138        rename = "@weight",
12139        default,
12140        deserialize_with = "deserialize_optional_string"
12141    )]
12142    pub weight: Option<String>,
12143
12144    /// `whenRealized` (added for full ibflex coverage)
12145    #[serde(
12146        rename = "@whenRealized",
12147        default,
12148        deserialize_with = "deserialize_optional_string"
12149    )]
12150    pub when_realized: Option<String>,
12151
12152    /// `whenReopened` (added for full ibflex coverage)
12153    #[serde(
12154        rename = "@whenReopened",
12155        default,
12156        deserialize_with = "deserialize_optional_string"
12157    )]
12158    pub when_reopened: Option<String>,
12159}
12160
12161/// Asset summary (aggregated trading data by asset class)
12162#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
12163pub struct AssetSummary {
12164    /// Account ID
12165    #[serde(
12166        rename = "@accountId",
12167        default,
12168        deserialize_with = "deserialize_optional_string"
12169    )]
12170    pub account_id: Option<String>,
12171
12172    /// Account alias
12173    #[serde(rename = "@acctAlias", default)]
12174    pub acct_alias: Option<String>,
12175
12176    /// Model
12177    #[serde(rename = "@model", default)]
12178    pub model: Option<String>,
12179
12180    /// Asset category
12181    #[serde(rename = "@assetCategory", default)]
12182    pub asset_category: Option<AssetCategory>,
12183
12184    /// Total buy quantity
12185    #[serde(
12186        rename = "@totalBuyQuantity",
12187        default,
12188        deserialize_with = "deserialize_optional_decimal"
12189    )]
12190    pub total_buy_quantity: Option<Decimal>,
12191
12192    /// Total sell quantity
12193    #[serde(
12194        rename = "@totalSellQuantity",
12195        default,
12196        deserialize_with = "deserialize_optional_decimal"
12197    )]
12198    pub total_sell_quantity: Option<Decimal>,
12199
12200    /// Total buy value
12201    #[serde(
12202        rename = "@totalBuyValue",
12203        default,
12204        deserialize_with = "deserialize_optional_decimal"
12205    )]
12206    pub total_buy_value: Option<Decimal>,
12207
12208    /// Total sell value
12209    #[serde(
12210        rename = "@totalSellValue",
12211        default,
12212        deserialize_with = "deserialize_optional_decimal"
12213    )]
12214    pub total_sell_value: Option<Decimal>,
12215
12216    /// Total commission
12217    #[serde(
12218        rename = "@totalCommission",
12219        default,
12220        deserialize_with = "deserialize_optional_decimal"
12221    )]
12222    pub total_commission: Option<Decimal>,
12223
12224    /// Realized P&L
12225    #[serde(
12226        rename = "@realizedPnl",
12227        default,
12228        deserialize_with = "deserialize_optional_decimal"
12229    )]
12230    pub realized_pnl: Option<Decimal>,
12231
12232    /// Currency
12233    #[serde(rename = "@currency", default)]
12234    pub currency: Option<String>,
12235
12236    /// `symbol` (added for full ibflex coverage)
12237    #[serde(
12238        rename = "@symbol",
12239        default,
12240        deserialize_with = "deserialize_optional_string"
12241    )]
12242    pub symbol: Option<String>,
12243
12244    /// `description` (added for full ibflex coverage)
12245    #[serde(
12246        rename = "@description",
12247        default,
12248        deserialize_with = "deserialize_optional_string"
12249    )]
12250    pub description: Option<String>,
12251
12252    /// `conid` (added for full ibflex coverage)
12253    #[serde(
12254        rename = "@conid",
12255        default,
12256        deserialize_with = "deserialize_optional_string"
12257    )]
12258    pub conid: Option<String>,
12259
12260    /// `securityID` (added for full ibflex coverage)
12261    #[serde(
12262        rename = "@securityID",
12263        default,
12264        deserialize_with = "deserialize_optional_string"
12265    )]
12266    pub security_id: Option<String>,
12267
12268    /// `securityIDType` (added for full ibflex coverage)
12269    #[serde(
12270        rename = "@securityIDType",
12271        default,
12272        deserialize_with = "deserialize_optional_string"
12273    )]
12274    pub security_id_type: Option<String>,
12275
12276    /// `cusip` (added for full ibflex coverage)
12277    #[serde(
12278        rename = "@cusip",
12279        default,
12280        deserialize_with = "deserialize_optional_string"
12281    )]
12282    pub cusip: Option<String>,
12283
12284    /// `isin` (added for full ibflex coverage)
12285    #[serde(
12286        rename = "@isin",
12287        default,
12288        deserialize_with = "deserialize_optional_string"
12289    )]
12290    pub isin: Option<String>,
12291
12292    /// `listingExchange` (added for full ibflex coverage)
12293    #[serde(
12294        rename = "@listingExchange",
12295        default,
12296        deserialize_with = "deserialize_optional_string"
12297    )]
12298    pub listing_exchange: Option<String>,
12299
12300    /// `underlyingConid` (added for full ibflex coverage)
12301    #[serde(
12302        rename = "@underlyingConid",
12303        default,
12304        deserialize_with = "deserialize_optional_string"
12305    )]
12306    pub underlying_conid: Option<String>,
12307
12308    /// `underlyingSymbol` (added for full ibflex coverage)
12309    #[serde(
12310        rename = "@underlyingSymbol",
12311        default,
12312        deserialize_with = "deserialize_optional_string"
12313    )]
12314    pub underlying_symbol: Option<String>,
12315
12316    /// `underlyingSecurityID` (added for full ibflex coverage)
12317    #[serde(
12318        rename = "@underlyingSecurityID",
12319        default,
12320        deserialize_with = "deserialize_optional_string"
12321    )]
12322    pub underlying_security_id: Option<String>,
12323
12324    /// `underlyingListingExchange` (added for full ibflex coverage)
12325    #[serde(
12326        rename = "@underlyingListingExchange",
12327        default,
12328        deserialize_with = "deserialize_optional_string"
12329    )]
12330    pub underlying_listing_exchange: Option<String>,
12331
12332    /// `issuer` (added for full ibflex coverage)
12333    #[serde(
12334        rename = "@issuer",
12335        default,
12336        deserialize_with = "deserialize_optional_string"
12337    )]
12338    pub issuer: Option<String>,
12339
12340    /// `multiplier` (added for full ibflex coverage)
12341    #[serde(
12342        rename = "@multiplier",
12343        default,
12344        deserialize_with = "deserialize_optional_decimal"
12345    )]
12346    pub multiplier: Option<Decimal>,
12347
12348    /// `strike` (added for full ibflex coverage)
12349    #[serde(
12350        rename = "@strike",
12351        default,
12352        deserialize_with = "deserialize_optional_decimal"
12353    )]
12354    pub strike: Option<Decimal>,
12355
12356    /// `expiry` (added for full ibflex coverage)
12357    #[serde(
12358        rename = "@expiry",
12359        default,
12360        deserialize_with = "deserialize_optional_date"
12361    )]
12362    pub expiry: Option<NaiveDate>,
12363
12364    /// `putCall` (added for full ibflex coverage)
12365    #[serde(rename = "@putCall", default)]
12366    pub put_call: Option<PutCall>,
12367
12368    /// `principalAdjustFactor` (added for full ibflex coverage)
12369    #[serde(
12370        rename = "@principalAdjustFactor",
12371        default,
12372        deserialize_with = "deserialize_optional_decimal"
12373    )]
12374    pub principal_adjust_factor: Option<Decimal>,
12375
12376    /// `transactionType` (added for full ibflex coverage)
12377    #[serde(rename = "@transactionType", default)]
12378    pub transaction_type: Option<TradeType>,
12379
12380    /// `tradeID` (added for full ibflex coverage)
12381    #[serde(
12382        rename = "@tradeID",
12383        default,
12384        deserialize_with = "deserialize_optional_string"
12385    )]
12386    pub trade_id: Option<String>,
12387
12388    /// `orderID` (added for full ibflex coverage)
12389    #[serde(
12390        rename = "@orderID",
12391        default,
12392        deserialize_with = "deserialize_optional_decimal"
12393    )]
12394    pub order_id: Option<Decimal>,
12395
12396    /// `execID` (added for full ibflex coverage)
12397    #[serde(
12398        rename = "@execID",
12399        default,
12400        deserialize_with = "deserialize_optional_string"
12401    )]
12402    pub exec_id: Option<String>,
12403
12404    /// `brokerageOrderID` (added for full ibflex coverage)
12405    #[serde(
12406        rename = "@brokerageOrderID",
12407        default,
12408        deserialize_with = "deserialize_optional_string"
12409    )]
12410    pub brokerage_order_id: Option<String>,
12411
12412    /// `orderReference` (added for full ibflex coverage)
12413    #[serde(
12414        rename = "@orderReference",
12415        default,
12416        deserialize_with = "deserialize_optional_string"
12417    )]
12418    pub order_reference: Option<String>,
12419
12420    /// `volatilityOrderLink` (added for full ibflex coverage)
12421    #[serde(
12422        rename = "@volatilityOrderLink",
12423        default,
12424        deserialize_with = "deserialize_optional_string"
12425    )]
12426    pub volatility_order_link: Option<String>,
12427
12428    /// `clearingFirmID` (added for full ibflex coverage)
12429    #[serde(
12430        rename = "@clearingFirmID",
12431        default,
12432        deserialize_with = "deserialize_optional_string"
12433    )]
12434    pub clearing_firm_id: Option<String>,
12435
12436    /// `origTradePrice` (added for full ibflex coverage)
12437    #[serde(
12438        rename = "@origTradePrice",
12439        default,
12440        deserialize_with = "deserialize_optional_decimal"
12441    )]
12442    pub orig_trade_price: Option<Decimal>,
12443
12444    /// `TradePrice` (added for full ibflex coverage)
12445    #[serde(
12446        rename = "@TradePrice",
12447        default,
12448        deserialize_with = "deserialize_optional_decimal"
12449    )]
12450    pub trade_price: Option<Decimal>,
12451
12452    /// `tradeMoney` (added for full ibflex coverage)
12453    #[serde(
12454        rename = "@tradeMoney",
12455        default,
12456        deserialize_with = "deserialize_optional_decimal"
12457    )]
12458    pub trade_money: Option<Decimal>,
12459
12460    /// `taxes` (added for full ibflex coverage)
12461    #[serde(
12462        rename = "@taxes",
12463        default,
12464        deserialize_with = "deserialize_optional_decimal"
12465    )]
12466    pub taxes: Option<Decimal>,
12467
12468    /// `origTradeDate` (added for full ibflex coverage)
12469    #[serde(
12470        rename = "@origTradeDate",
12471        default,
12472        deserialize_with = "deserialize_optional_date"
12473    )]
12474    pub orig_trade_date: Option<NaiveDate>,
12475
12476    /// `origTradeID` (added for full ibflex coverage)
12477    #[serde(
12478        rename = "@origTradeID",
12479        default,
12480        deserialize_with = "deserialize_optional_string"
12481    )]
12482    pub orig_trade_id: Option<String>,
12483
12484    /// `tradePrice` (added for full ibflex coverage)
12485    #[serde(
12486        rename = "@tradePrice",
12487        default,
12488        deserialize_with = "deserialize_optional_decimal"
12489    )]
12490    pub trade_price_trad: Option<Decimal>,
12491
12492    /// `orderTime` (added for full ibflex coverage)
12493    #[serde(
12494        rename = "@orderTime",
12495        default,
12496        deserialize_with = "deserialize_optional_string"
12497    )]
12498    pub order_time: Option<String>,
12499
12500    /// `exchOrderId` (added for full ibflex coverage)
12501    #[serde(
12502        rename = "@exchOrderId",
12503        default,
12504        deserialize_with = "deserialize_optional_string"
12505    )]
12506    pub exch_order_id: Option<String>,
12507
12508    /// `dateTime` (added for full ibflex coverage)
12509    #[serde(
12510        rename = "@dateTime",
12511        default,
12512        deserialize_with = "deserialize_optional_string"
12513    )]
12514    pub date_time: Option<String>,
12515
12516    /// `fxRateToBase` (added for full ibflex coverage)
12517    #[serde(
12518        rename = "@fxRateToBase",
12519        default,
12520        deserialize_with = "deserialize_optional_decimal"
12521    )]
12522    pub fx_rate_to_base: Option<Decimal>,
12523
12524    /// `reportDate` (added for full ibflex coverage)
12525    #[serde(
12526        rename = "@reportDate",
12527        default,
12528        deserialize_with = "deserialize_optional_date"
12529    )]
12530    pub report_date: Option<NaiveDate>,
12531
12532    /// `ibExecID` (added for full ibflex coverage)
12533    #[serde(
12534        rename = "@ibExecID",
12535        default,
12536        deserialize_with = "deserialize_optional_string"
12537    )]
12538    pub ib_exec_id: Option<String>,
12539
12540    /// `settleDateTarget` (added for full ibflex coverage)
12541    #[serde(
12542        rename = "@settleDateTarget",
12543        default,
12544        deserialize_with = "deserialize_optional_date"
12545    )]
12546    pub settle_date_target: Option<NaiveDate>,
12547
12548    /// `cost` (added for full ibflex coverage)
12549    #[serde(
12550        rename = "@cost",
12551        default,
12552        deserialize_with = "deserialize_optional_decimal"
12553    )]
12554    pub cost: Option<Decimal>,
12555
12556    /// `extExecID` (added for full ibflex coverage)
12557    #[serde(
12558        rename = "@extExecID",
12559        default,
12560        deserialize_with = "deserialize_optional_string"
12561    )]
12562    pub ext_exec_id: Option<String>,
12563
12564    /// `openDateTime` (added for full ibflex coverage)
12565    #[serde(
12566        rename = "@openDateTime",
12567        default,
12568        deserialize_with = "deserialize_optional_string"
12569    )]
12570    pub open_date_time: Option<String>,
12571
12572    /// `holdingPeriodDateTime` (added for full ibflex coverage)
12573    #[serde(
12574        rename = "@holdingPeriodDateTime",
12575        default,
12576        deserialize_with = "deserialize_optional_string"
12577    )]
12578    pub holding_period_date_time: Option<String>,
12579
12580    /// `whenRealized` (added for full ibflex coverage)
12581    #[serde(
12582        rename = "@whenRealized",
12583        default,
12584        deserialize_with = "deserialize_optional_string"
12585    )]
12586    pub when_realized: Option<String>,
12587
12588    /// `whenReopened` (added for full ibflex coverage)
12589    #[serde(
12590        rename = "@whenReopened",
12591        default,
12592        deserialize_with = "deserialize_optional_string"
12593    )]
12594    pub when_reopened: Option<String>,
12595
12596    /// `changeInPrice` (added for full ibflex coverage)
12597    #[serde(
12598        rename = "@changeInPrice",
12599        default,
12600        deserialize_with = "deserialize_optional_decimal"
12601    )]
12602    pub change_in_price: Option<Decimal>,
12603
12604    /// `changeInQuantity` (added for full ibflex coverage)
12605    #[serde(
12606        rename = "@changeInQuantity",
12607        default,
12608        deserialize_with = "deserialize_optional_decimal"
12609    )]
12610    pub change_in_quantity: Option<Decimal>,
12611
12612    /// `ibOrderID` (added for full ibflex coverage)
12613    #[serde(
12614        rename = "@ibOrderID",
12615        default,
12616        deserialize_with = "deserialize_optional_string"
12617    )]
12618    pub ib_order_id: Option<String>,
12619
12620    /// `origOrderID` (added for full ibflex coverage)
12621    #[serde(
12622        rename = "@origOrderID",
12623        default,
12624        deserialize_with = "deserialize_optional_string"
12625    )]
12626    pub orig_order_id: Option<String>,
12627
12628    /// `transactionID` (added for full ibflex coverage)
12629    #[serde(
12630        rename = "@transactionID",
12631        default,
12632        deserialize_with = "deserialize_optional_string"
12633    )]
12634    pub transaction_id: Option<String>,
12635
12636    /// `tradeDate` (added for full ibflex coverage)
12637    #[serde(
12638        rename = "@tradeDate",
12639        default,
12640        deserialize_with = "deserialize_optional_date"
12641    )]
12642    pub trade_date: Option<NaiveDate>,
12643
12644    /// `openCloseIndicator` (added for full ibflex coverage)
12645    #[serde(rename = "@openCloseIndicator", default)]
12646    pub open_close_indicator: Option<OpenClose>,
12647
12648    /// `notes` (added for full ibflex coverage)
12649    #[serde(
12650        rename = "@notes",
12651        default,
12652        deserialize_with = "deserialize_optional_string"
12653    )]
12654    pub notes: Option<String>,
12655
12656    /// `fxPnl` (added for full ibflex coverage)
12657    #[serde(
12658        rename = "@fxPnl",
12659        default,
12660        deserialize_with = "deserialize_optional_decimal"
12661    )]
12662    pub fx_pnl: Option<Decimal>,
12663
12664    /// `mtmPnl` (added for full ibflex coverage)
12665    #[serde(
12666        rename = "@mtmPnl",
12667        default,
12668        deserialize_with = "deserialize_optional_decimal"
12669    )]
12670    pub mtm_pnl: Option<Decimal>,
12671
12672    /// `fifoPnlRealized` (added for full ibflex coverage)
12673    #[serde(
12674        rename = "@fifoPnlRealized",
12675        default,
12676        deserialize_with = "deserialize_optional_decimal"
12677    )]
12678    pub fifo_pnl_realized: Option<Decimal>,
12679
12680    /// `closePrice` (added for full ibflex coverage)
12681    #[serde(
12682        rename = "@closePrice",
12683        default,
12684        deserialize_with = "deserialize_optional_decimal"
12685    )]
12686    pub close_price: Option<Decimal>,
12687
12688    /// `exchange` (added for full ibflex coverage)
12689    #[serde(
12690        rename = "@exchange",
12691        default,
12692        deserialize_with = "deserialize_optional_string"
12693    )]
12694    pub exchange: Option<String>,
12695
12696    /// `ibCommission` (added for full ibflex coverage)
12697    #[serde(
12698        rename = "@ibCommission",
12699        default,
12700        deserialize_with = "deserialize_optional_decimal"
12701    )]
12702    pub ib_commission: Option<Decimal>,
12703
12704    /// `ibCommissionCurrency` (added for full ibflex coverage)
12705    #[serde(
12706        rename = "@ibCommissionCurrency",
12707        default,
12708        deserialize_with = "deserialize_optional_string"
12709    )]
12710    pub ib_commission_currency: Option<String>,
12711
12712    /// `netCash` (added for full ibflex coverage)
12713    #[serde(
12714        rename = "@netCash",
12715        default,
12716        deserialize_with = "deserialize_optional_decimal"
12717    )]
12718    pub net_cash: Option<Decimal>,
12719
12720    /// `netCashInBase` (added for full ibflex coverage)
12721    #[serde(
12722        rename = "@netCashInBase",
12723        default,
12724        deserialize_with = "deserialize_optional_decimal"
12725    )]
12726    pub net_cash_in_base: Option<Decimal>,
12727
12728    /// `buySell` (added for full ibflex coverage)
12729    #[serde(rename = "@buySell", default)]
12730    pub buy_sell: Option<BuySell>,
12731
12732    /// `quantity` (added for full ibflex coverage)
12733    #[serde(
12734        rename = "@quantity",
12735        default,
12736        deserialize_with = "deserialize_optional_decimal"
12737    )]
12738    pub quantity: Option<Decimal>,
12739
12740    /// `price` (added for full ibflex coverage)
12741    #[serde(
12742        rename = "@price",
12743        default,
12744        deserialize_with = "deserialize_optional_decimal"
12745    )]
12746    pub price: Option<Decimal>,
12747
12748    /// `amount` (added for full ibflex coverage)
12749    #[serde(
12750        rename = "@amount",
12751        default,
12752        deserialize_with = "deserialize_optional_decimal"
12753    )]
12754    pub amount: Option<Decimal>,
12755
12756    /// `proceeds` (added for full ibflex coverage)
12757    #[serde(
12758        rename = "@proceeds",
12759        default,
12760        deserialize_with = "deserialize_optional_decimal"
12761    )]
12762    pub proceeds: Option<Decimal>,
12763
12764    /// `commission` (added for full ibflex coverage)
12765    #[serde(
12766        rename = "@commission",
12767        default,
12768        deserialize_with = "deserialize_optional_decimal"
12769    )]
12770    pub commission: Option<Decimal>,
12771
12772    /// `brokerExecutionCommission` (added for full ibflex coverage)
12773    #[serde(
12774        rename = "@brokerExecutionCommission",
12775        default,
12776        deserialize_with = "deserialize_optional_decimal"
12777    )]
12778    pub broker_execution_commission: Option<Decimal>,
12779
12780    /// `brokerClearingCommission` (added for full ibflex coverage)
12781    #[serde(
12782        rename = "@brokerClearingCommission",
12783        default,
12784        deserialize_with = "deserialize_optional_decimal"
12785    )]
12786    pub broker_clearing_commission: Option<Decimal>,
12787
12788    /// `thirdPartyExecutionCommission` (added for full ibflex coverage)
12789    #[serde(
12790        rename = "@thirdPartyExecutionCommission",
12791        default,
12792        deserialize_with = "deserialize_optional_decimal"
12793    )]
12794    pub third_party_execution_commission: Option<Decimal>,
12795
12796    /// `thirdPartyClearingCommission` (added for full ibflex coverage)
12797    #[serde(
12798        rename = "@thirdPartyClearingCommission",
12799        default,
12800        deserialize_with = "deserialize_optional_decimal"
12801    )]
12802    pub third_party_clearing_commission: Option<Decimal>,
12803
12804    /// `thirdPartyRegulatoryCommission` (added for full ibflex coverage)
12805    #[serde(
12806        rename = "@thirdPartyRegulatoryCommission",
12807        default,
12808        deserialize_with = "deserialize_optional_decimal"
12809    )]
12810    pub third_party_regulatory_commission: Option<Decimal>,
12811
12812    /// `otherCommission` (added for full ibflex coverage)
12813    #[serde(
12814        rename = "@otherCommission",
12815        default,
12816        deserialize_with = "deserialize_optional_decimal"
12817    )]
12818    pub other_commission: Option<Decimal>,
12819
12820    /// `commissionCurrency` (added for full ibflex coverage)
12821    #[serde(
12822        rename = "@commissionCurrency",
12823        default,
12824        deserialize_with = "deserialize_optional_string"
12825    )]
12826    pub commission_currency: Option<String>,
12827
12828    /// `tax` (added for full ibflex coverage)
12829    #[serde(
12830        rename = "@tax",
12831        default,
12832        deserialize_with = "deserialize_optional_decimal"
12833    )]
12834    pub tax: Option<Decimal>,
12835
12836    /// `code` (added for full ibflex coverage)
12837    #[serde(
12838        rename = "@code",
12839        default,
12840        deserialize_with = "deserialize_optional_string"
12841    )]
12842    pub code: Option<String>,
12843
12844    /// `orderType` (added for full ibflex coverage)
12845    #[serde(rename = "@orderType", default)]
12846    pub order_type: Option<OrderType>,
12847
12848    /// `levelOfDetail` (added for full ibflex coverage)
12849    #[serde(
12850        rename = "@levelOfDetail",
12851        default,
12852        deserialize_with = "deserialize_optional_string"
12853    )]
12854    pub level_of_detail: Option<String>,
12855
12856    /// `traderID` (added for full ibflex coverage)
12857    #[serde(
12858        rename = "@traderID",
12859        default,
12860        deserialize_with = "deserialize_optional_string"
12861    )]
12862    pub trader_id: Option<String>,
12863
12864    /// `isAPIOrder` (added for full ibflex coverage)
12865    #[serde(
12866        rename = "@isAPIOrder",
12867        default,
12868        deserialize_with = "deserialize_optional_bool"
12869    )]
12870    pub is_api_order: Option<bool>,
12871
12872    /// `allocatedTo` (added for full ibflex coverage)
12873    #[serde(
12874        rename = "@allocatedTo",
12875        default,
12876        deserialize_with = "deserialize_optional_string"
12877    )]
12878    pub allocated_to: Option<String>,
12879
12880    /// `accruedInt` (added for full ibflex coverage)
12881    #[serde(
12882        rename = "@accruedInt",
12883        default,
12884        deserialize_with = "deserialize_optional_decimal"
12885    )]
12886    pub accrued_int: Option<Decimal>,
12887
12888    /// `deliveryType` (added for full ibflex coverage)
12889    #[serde(
12890        rename = "@deliveryType",
12891        default,
12892        deserialize_with = "deserialize_optional_string"
12893    )]
12894    pub delivery_type: Option<String>,
12895
12896    /// `serialNumber` (added for full ibflex coverage)
12897    #[serde(
12898        rename = "@serialNumber",
12899        default,
12900        deserialize_with = "deserialize_optional_string"
12901    )]
12902    pub serial_number: Option<String>,
12903
12904    /// `commodityType` (added for full ibflex coverage)
12905    #[serde(
12906        rename = "@commodityType",
12907        default,
12908        deserialize_with = "deserialize_optional_string"
12909    )]
12910    pub commodity_type: Option<String>,
12911
12912    /// `fineness` (added for full ibflex coverage)
12913    #[serde(
12914        rename = "@fineness",
12915        default,
12916        deserialize_with = "deserialize_optional_decimal"
12917    )]
12918    pub fineness: Option<Decimal>,
12919
12920    /// `weight` (added for full ibflex coverage)
12921    #[serde(
12922        rename = "@weight",
12923        default,
12924        deserialize_with = "deserialize_optional_string"
12925    )]
12926    pub weight: Option<String>,
12927
12928    /// `subCategory` (added for full ibflex coverage)
12929    #[serde(
12930        rename = "@subCategory",
12931        default,
12932        deserialize_with = "deserialize_optional_string"
12933    )]
12934    pub sub_category: Option<String>,
12935
12936    /// `figi` (added for full ibflex coverage)
12937    #[serde(
12938        rename = "@figi",
12939        default,
12940        deserialize_with = "deserialize_optional_string"
12941    )]
12942    pub figi: Option<String>,
12943
12944    /// `issuerCountryCode` (added for full ibflex coverage)
12945    #[serde(
12946        rename = "@issuerCountryCode",
12947        default,
12948        deserialize_with = "deserialize_optional_string"
12949    )]
12950    pub issuer_country_code: Option<String>,
12951
12952    /// `relatedTradeID` (added for full ibflex coverage)
12953    #[serde(
12954        rename = "@relatedTradeID",
12955        default,
12956        deserialize_with = "deserialize_optional_string"
12957    )]
12958    pub related_trade_id: Option<String>,
12959
12960    /// `origTransactionID` (added for full ibflex coverage)
12961    #[serde(
12962        rename = "@origTransactionID",
12963        default,
12964        deserialize_with = "deserialize_optional_string"
12965    )]
12966    pub orig_transaction_id: Option<String>,
12967
12968    /// `relatedTransactionID` (added for full ibflex coverage)
12969    #[serde(
12970        rename = "@relatedTransactionID",
12971        default,
12972        deserialize_with = "deserialize_optional_string"
12973    )]
12974    pub related_transaction_id: Option<String>,
12975
12976    /// `rtn` (added for full ibflex coverage)
12977    #[serde(
12978        rename = "@rtn",
12979        default,
12980        deserialize_with = "deserialize_optional_string"
12981    )]
12982    pub rtn: Option<String>,
12983
12984    /// `initialInvestment` (added for full ibflex coverage)
12985    #[serde(
12986        rename = "@initialInvestment",
12987        default,
12988        deserialize_with = "deserialize_optional_bool"
12989    )]
12990    pub initial_investment: Option<bool>,
12991
12992    /// `positionActionID` (added for full ibflex coverage)
12993    #[serde(
12994        rename = "@positionActionID",
12995        default,
12996        deserialize_with = "deserialize_optional_string"
12997    )]
12998    pub position_action_id: Option<String>,
12999}
13000
13001/// Order record
13002#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
13003pub struct Order {
13004    /// Account ID
13005    #[serde(
13006        rename = "@accountId",
13007        default,
13008        deserialize_with = "deserialize_optional_string"
13009    )]
13010    pub account_id: Option<String>,
13011
13012    /// Account alias
13013    #[serde(rename = "@acctAlias", default)]
13014    pub acct_alias: Option<String>,
13015
13016    /// Model
13017    #[serde(rename = "@model", default)]
13018    pub model: Option<String>,
13019
13020    /// Order ID
13021    #[serde(rename = "@orderID", default)]
13022    pub order_id: Option<String>,
13023
13024    /// Symbol
13025    #[serde(rename = "@symbol", default)]
13026    pub symbol: Option<String>,
13027
13028    /// Description
13029    #[serde(rename = "@description", default)]
13030    pub description: Option<String>,
13031
13032    /// Contract ID
13033    #[serde(rename = "@conid", default)]
13034    pub conid: Option<String>,
13035
13036    /// Asset category
13037    #[serde(rename = "@assetCategory", default)]
13038    pub asset_category: Option<AssetCategory>,
13039
13040    /// Order time
13041    #[serde(rename = "@orderTime", default)]
13042    pub order_time: Option<String>,
13043
13044    /// Order type
13045    #[serde(rename = "@orderType", default)]
13046    pub order_type: Option<String>,
13047
13048    /// Side (buy/sell)
13049    #[serde(rename = "@side", default)]
13050    pub side: Option<String>,
13051
13052    /// Time in force
13053    #[serde(rename = "@tif", default)]
13054    pub tif: Option<String>,
13055
13056    /// Order quantity
13057    #[serde(
13058        rename = "@orderQty",
13059        default,
13060        deserialize_with = "deserialize_optional_decimal"
13061    )]
13062    pub order_qty: Option<Decimal>,
13063
13064    /// Limit price
13065    #[serde(
13066        rename = "@limitPrice",
13067        default,
13068        deserialize_with = "deserialize_optional_decimal"
13069    )]
13070    pub limit_price: Option<Decimal>,
13071
13072    /// Stop price
13073    #[serde(
13074        rename = "@stopPrice",
13075        default,
13076        deserialize_with = "deserialize_optional_decimal"
13077    )]
13078    pub stop_price: Option<Decimal>,
13079
13080    /// Filled quantity
13081    #[serde(
13082        rename = "@filledQty",
13083        default,
13084        deserialize_with = "deserialize_optional_decimal"
13085    )]
13086    pub filled_qty: Option<Decimal>,
13087
13088    /// Average fill price
13089    #[serde(
13090        rename = "@avgPrice",
13091        default,
13092        deserialize_with = "deserialize_optional_decimal"
13093    )]
13094    pub avg_price: Option<Decimal>,
13095
13096    /// Remaining quantity
13097    #[serde(
13098        rename = "@remainingQty",
13099        default,
13100        deserialize_with = "deserialize_optional_decimal"
13101    )]
13102    pub remaining_qty: Option<Decimal>,
13103
13104    /// Order status
13105    #[serde(rename = "@status", default)]
13106    pub status: Option<String>,
13107
13108    /// Currency
13109    #[serde(rename = "@currency", default)]
13110    pub currency: Option<String>,
13111
13112    /// `securityID` (added for full ibflex coverage)
13113    #[serde(
13114        rename = "@securityID",
13115        default,
13116        deserialize_with = "deserialize_optional_string"
13117    )]
13118    pub security_id: Option<String>,
13119
13120    /// `securityIDType` (added for full ibflex coverage)
13121    #[serde(
13122        rename = "@securityIDType",
13123        default,
13124        deserialize_with = "deserialize_optional_string"
13125    )]
13126    pub security_id_type: Option<String>,
13127
13128    /// `cusip` (added for full ibflex coverage)
13129    #[serde(
13130        rename = "@cusip",
13131        default,
13132        deserialize_with = "deserialize_optional_string"
13133    )]
13134    pub cusip: Option<String>,
13135
13136    /// `isin` (added for full ibflex coverage)
13137    #[serde(
13138        rename = "@isin",
13139        default,
13140        deserialize_with = "deserialize_optional_string"
13141    )]
13142    pub isin: Option<String>,
13143
13144    /// `listingExchange` (added for full ibflex coverage)
13145    #[serde(
13146        rename = "@listingExchange",
13147        default,
13148        deserialize_with = "deserialize_optional_string"
13149    )]
13150    pub listing_exchange: Option<String>,
13151
13152    /// `underlyingConid` (added for full ibflex coverage)
13153    #[serde(
13154        rename = "@underlyingConid",
13155        default,
13156        deserialize_with = "deserialize_optional_string"
13157    )]
13158    pub underlying_conid: Option<String>,
13159
13160    /// `underlyingSymbol` (added for full ibflex coverage)
13161    #[serde(
13162        rename = "@underlyingSymbol",
13163        default,
13164        deserialize_with = "deserialize_optional_string"
13165    )]
13166    pub underlying_symbol: Option<String>,
13167
13168    /// `underlyingSecurityID` (added for full ibflex coverage)
13169    #[serde(
13170        rename = "@underlyingSecurityID",
13171        default,
13172        deserialize_with = "deserialize_optional_string"
13173    )]
13174    pub underlying_security_id: Option<String>,
13175
13176    /// `underlyingListingExchange` (added for full ibflex coverage)
13177    #[serde(
13178        rename = "@underlyingListingExchange",
13179        default,
13180        deserialize_with = "deserialize_optional_string"
13181    )]
13182    pub underlying_listing_exchange: Option<String>,
13183
13184    /// `issuer` (added for full ibflex coverage)
13185    #[serde(
13186        rename = "@issuer",
13187        default,
13188        deserialize_with = "deserialize_optional_string"
13189    )]
13190    pub issuer: Option<String>,
13191
13192    /// `multiplier` (added for full ibflex coverage)
13193    #[serde(
13194        rename = "@multiplier",
13195        default,
13196        deserialize_with = "deserialize_optional_decimal"
13197    )]
13198    pub multiplier: Option<Decimal>,
13199
13200    /// `strike` (added for full ibflex coverage)
13201    #[serde(
13202        rename = "@strike",
13203        default,
13204        deserialize_with = "deserialize_optional_decimal"
13205    )]
13206    pub strike: Option<Decimal>,
13207
13208    /// `expiry` (added for full ibflex coverage)
13209    #[serde(
13210        rename = "@expiry",
13211        default,
13212        deserialize_with = "deserialize_optional_date"
13213    )]
13214    pub expiry: Option<NaiveDate>,
13215
13216    /// `putCall` (added for full ibflex coverage)
13217    #[serde(rename = "@putCall", default)]
13218    pub put_call: Option<PutCall>,
13219
13220    /// `principalAdjustFactor` (added for full ibflex coverage)
13221    #[serde(
13222        rename = "@principalAdjustFactor",
13223        default,
13224        deserialize_with = "deserialize_optional_decimal"
13225    )]
13226    pub principal_adjust_factor: Option<Decimal>,
13227
13228    /// `transactionType` (added for full ibflex coverage)
13229    #[serde(rename = "@transactionType", default)]
13230    pub transaction_type: Option<TradeType>,
13231
13232    /// `tradeID` (added for full ibflex coverage)
13233    #[serde(
13234        rename = "@tradeID",
13235        default,
13236        deserialize_with = "deserialize_optional_string"
13237    )]
13238    pub trade_id: Option<String>,
13239
13240    /// `execID` (added for full ibflex coverage)
13241    #[serde(
13242        rename = "@execID",
13243        default,
13244        deserialize_with = "deserialize_optional_string"
13245    )]
13246    pub exec_id: Option<String>,
13247
13248    /// `brokerageOrderID` (added for full ibflex coverage)
13249    #[serde(
13250        rename = "@brokerageOrderID",
13251        default,
13252        deserialize_with = "deserialize_optional_string"
13253    )]
13254    pub brokerage_order_id: Option<String>,
13255
13256    /// `orderReference` (added for full ibflex coverage)
13257    #[serde(
13258        rename = "@orderReference",
13259        default,
13260        deserialize_with = "deserialize_optional_string"
13261    )]
13262    pub order_reference: Option<String>,
13263
13264    /// `volatilityOrderLink` (added for full ibflex coverage)
13265    #[serde(
13266        rename = "@volatilityOrderLink",
13267        default,
13268        deserialize_with = "deserialize_optional_string"
13269    )]
13270    pub volatility_order_link: Option<String>,
13271
13272    /// `clearingFirmID` (added for full ibflex coverage)
13273    #[serde(
13274        rename = "@clearingFirmID",
13275        default,
13276        deserialize_with = "deserialize_optional_string"
13277    )]
13278    pub clearing_firm_id: Option<String>,
13279
13280    /// `origTradePrice` (added for full ibflex coverage)
13281    #[serde(
13282        rename = "@origTradePrice",
13283        default,
13284        deserialize_with = "deserialize_optional_decimal"
13285    )]
13286    pub orig_trade_price: Option<Decimal>,
13287
13288    /// `origTradeDate` (added for full ibflex coverage)
13289    #[serde(
13290        rename = "@origTradeDate",
13291        default,
13292        deserialize_with = "deserialize_optional_date"
13293    )]
13294    pub orig_trade_date: Option<NaiveDate>,
13295
13296    /// `origTradeID` (added for full ibflex coverage)
13297    #[serde(
13298        rename = "@origTradeID",
13299        default,
13300        deserialize_with = "deserialize_optional_string"
13301    )]
13302    pub orig_trade_id: Option<String>,
13303
13304    /// `dateTime` (added for full ibflex coverage)
13305    #[serde(
13306        rename = "@dateTime",
13307        default,
13308        deserialize_with = "deserialize_optional_string"
13309    )]
13310    pub date_time: Option<String>,
13311
13312    /// `reportDate` (added for full ibflex coverage)
13313    #[serde(
13314        rename = "@reportDate",
13315        default,
13316        deserialize_with = "deserialize_optional_date"
13317    )]
13318    pub report_date: Option<NaiveDate>,
13319
13320    /// `settleDate` (added for full ibflex coverage)
13321    #[serde(
13322        rename = "@settleDate",
13323        default,
13324        deserialize_with = "deserialize_optional_date"
13325    )]
13326    pub settle_date: Option<NaiveDate>,
13327
13328    /// `tradeDate` (added for full ibflex coverage)
13329    #[serde(
13330        rename = "@tradeDate",
13331        default,
13332        deserialize_with = "deserialize_optional_date"
13333    )]
13334    pub trade_date: Option<NaiveDate>,
13335
13336    /// `exchange` (added for full ibflex coverage)
13337    #[serde(
13338        rename = "@exchange",
13339        default,
13340        deserialize_with = "deserialize_optional_string"
13341    )]
13342    pub exchange: Option<String>,
13343
13344    /// `buySell` (added for full ibflex coverage)
13345    #[serde(rename = "@buySell", default)]
13346    pub buy_sell: Option<BuySell>,
13347
13348    /// `quantity` (added for full ibflex coverage)
13349    #[serde(
13350        rename = "@quantity",
13351        default,
13352        deserialize_with = "deserialize_optional_decimal"
13353    )]
13354    pub quantity: Option<Decimal>,
13355
13356    /// `price` (added for full ibflex coverage)
13357    #[serde(
13358        rename = "@price",
13359        default,
13360        deserialize_with = "deserialize_optional_decimal"
13361    )]
13362    pub price: Option<Decimal>,
13363
13364    /// `amount` (added for full ibflex coverage)
13365    #[serde(
13366        rename = "@amount",
13367        default,
13368        deserialize_with = "deserialize_optional_decimal"
13369    )]
13370    pub amount: Option<Decimal>,
13371
13372    /// `proceeds` (added for full ibflex coverage)
13373    #[serde(
13374        rename = "@proceeds",
13375        default,
13376        deserialize_with = "deserialize_optional_decimal"
13377    )]
13378    pub proceeds: Option<Decimal>,
13379
13380    /// `commission` (added for full ibflex coverage)
13381    #[serde(
13382        rename = "@commission",
13383        default,
13384        deserialize_with = "deserialize_optional_decimal"
13385    )]
13386    pub commission: Option<Decimal>,
13387
13388    /// `brokerExecutionCommission` (added for full ibflex coverage)
13389    #[serde(
13390        rename = "@brokerExecutionCommission",
13391        default,
13392        deserialize_with = "deserialize_optional_decimal"
13393    )]
13394    pub broker_execution_commission: Option<Decimal>,
13395
13396    /// `brokerClearingCommission` (added for full ibflex coverage)
13397    #[serde(
13398        rename = "@brokerClearingCommission",
13399        default,
13400        deserialize_with = "deserialize_optional_decimal"
13401    )]
13402    pub broker_clearing_commission: Option<Decimal>,
13403
13404    /// `thirdPartyExecutionCommission` (added for full ibflex coverage)
13405    #[serde(
13406        rename = "@thirdPartyExecutionCommission",
13407        default,
13408        deserialize_with = "deserialize_optional_decimal"
13409    )]
13410    pub third_party_execution_commission: Option<Decimal>,
13411
13412    /// `thirdPartyClearingCommission` (added for full ibflex coverage)
13413    #[serde(
13414        rename = "@thirdPartyClearingCommission",
13415        default,
13416        deserialize_with = "deserialize_optional_decimal"
13417    )]
13418    pub third_party_clearing_commission: Option<Decimal>,
13419
13420    /// `thirdPartyRegulatoryCommission` (added for full ibflex coverage)
13421    #[serde(
13422        rename = "@thirdPartyRegulatoryCommission",
13423        default,
13424        deserialize_with = "deserialize_optional_decimal"
13425    )]
13426    pub third_party_regulatory_commission: Option<Decimal>,
13427
13428    /// `otherCommission` (added for full ibflex coverage)
13429    #[serde(
13430        rename = "@otherCommission",
13431        default,
13432        deserialize_with = "deserialize_optional_decimal"
13433    )]
13434    pub other_commission: Option<Decimal>,
13435
13436    /// `commissionCurrency` (added for full ibflex coverage)
13437    #[serde(
13438        rename = "@commissionCurrency",
13439        default,
13440        deserialize_with = "deserialize_optional_string"
13441    )]
13442    pub commission_currency: Option<String>,
13443
13444    /// `tax` (added for full ibflex coverage)
13445    #[serde(
13446        rename = "@tax",
13447        default,
13448        deserialize_with = "deserialize_optional_decimal"
13449    )]
13450    pub tax: Option<Decimal>,
13451
13452    /// `code` (added for full ibflex coverage)
13453    #[serde(
13454        rename = "@code",
13455        default,
13456        deserialize_with = "deserialize_optional_string"
13457    )]
13458    pub code: Option<String>,
13459
13460    /// `levelOfDetail` (added for full ibflex coverage)
13461    #[serde(
13462        rename = "@levelOfDetail",
13463        default,
13464        deserialize_with = "deserialize_optional_string"
13465    )]
13466    pub level_of_detail: Option<String>,
13467
13468    /// `traderID` (added for full ibflex coverage)
13469    #[serde(
13470        rename = "@traderID",
13471        default,
13472        deserialize_with = "deserialize_optional_string"
13473    )]
13474    pub trader_id: Option<String>,
13475
13476    /// `isAPIOrder` (added for full ibflex coverage)
13477    #[serde(
13478        rename = "@isAPIOrder",
13479        default,
13480        deserialize_with = "deserialize_optional_bool"
13481    )]
13482    pub is_api_order: Option<bool>,
13483
13484    /// `allocatedTo` (added for full ibflex coverage)
13485    #[serde(
13486        rename = "@allocatedTo",
13487        default,
13488        deserialize_with = "deserialize_optional_string"
13489    )]
13490    pub allocated_to: Option<String>,
13491
13492    /// `accruedInt` (added for full ibflex coverage)
13493    #[serde(
13494        rename = "@accruedInt",
13495        default,
13496        deserialize_with = "deserialize_optional_decimal"
13497    )]
13498    pub accrued_int: Option<Decimal>,
13499
13500    /// `netCash` (added for full ibflex coverage)
13501    #[serde(
13502        rename = "@netCash",
13503        default,
13504        deserialize_with = "deserialize_optional_decimal"
13505    )]
13506    pub net_cash: Option<Decimal>,
13507
13508    /// `tradePrice` (added for full ibflex coverage)
13509    #[serde(
13510        rename = "@tradePrice",
13511        default,
13512        deserialize_with = "deserialize_optional_decimal"
13513    )]
13514    pub trade_price: Option<Decimal>,
13515
13516    /// `ibCommission` (added for full ibflex coverage)
13517    #[serde(
13518        rename = "@ibCommission",
13519        default,
13520        deserialize_with = "deserialize_optional_decimal"
13521    )]
13522    pub ib_commission: Option<Decimal>,
13523
13524    /// `ibOrderID` (added for full ibflex coverage)
13525    #[serde(
13526        rename = "@ibOrderID",
13527        default,
13528        deserialize_with = "deserialize_optional_string"
13529    )]
13530    pub ib_order_id: Option<String>,
13531
13532    /// `fxRateToBase` (added for full ibflex coverage)
13533    #[serde(
13534        rename = "@fxRateToBase",
13535        default,
13536        deserialize_with = "deserialize_optional_decimal"
13537    )]
13538    pub fx_rate_to_base: Option<Decimal>,
13539
13540    /// `settleDateTarget` (added for full ibflex coverage)
13541    #[serde(
13542        rename = "@settleDateTarget",
13543        default,
13544        deserialize_with = "deserialize_optional_date"
13545    )]
13546    pub settle_date_target: Option<NaiveDate>,
13547
13548    /// `tradeMoney` (added for full ibflex coverage)
13549    #[serde(
13550        rename = "@tradeMoney",
13551        default,
13552        deserialize_with = "deserialize_optional_decimal"
13553    )]
13554    pub trade_money: Option<Decimal>,
13555
13556    /// `taxes` (added for full ibflex coverage)
13557    #[serde(
13558        rename = "@taxes",
13559        default,
13560        deserialize_with = "deserialize_optional_decimal"
13561    )]
13562    pub taxes: Option<Decimal>,
13563
13564    /// `ibCommissionCurrency` (added for full ibflex coverage)
13565    #[serde(
13566        rename = "@ibCommissionCurrency",
13567        default,
13568        deserialize_with = "deserialize_optional_string"
13569    )]
13570    pub ib_commission_currency: Option<String>,
13571
13572    /// `closePrice` (added for full ibflex coverage)
13573    #[serde(
13574        rename = "@closePrice",
13575        default,
13576        deserialize_with = "deserialize_optional_decimal"
13577    )]
13578    pub close_price: Option<Decimal>,
13579
13580    /// `openCloseIndicator` (added for full ibflex coverage)
13581    #[serde(rename = "@openCloseIndicator", default)]
13582    pub open_close_indicator: Option<OpenClose>,
13583
13584    /// `notes` (added for full ibflex coverage)
13585    #[serde(
13586        rename = "@notes",
13587        default,
13588        deserialize_with = "deserialize_optional_string"
13589    )]
13590    pub notes: Option<String>,
13591
13592    /// `cost` (added for full ibflex coverage)
13593    #[serde(
13594        rename = "@cost",
13595        default,
13596        deserialize_with = "deserialize_optional_decimal"
13597    )]
13598    pub cost: Option<Decimal>,
13599
13600    /// `fifoPnlRealized` (added for full ibflex coverage)
13601    #[serde(
13602        rename = "@fifoPnlRealized",
13603        default,
13604        deserialize_with = "deserialize_optional_decimal"
13605    )]
13606    pub fifo_pnl_realized: Option<Decimal>,
13607
13608    /// `fxPnl` (added for full ibflex coverage)
13609    #[serde(
13610        rename = "@fxPnl",
13611        default,
13612        deserialize_with = "deserialize_optional_decimal"
13613    )]
13614    pub fx_pnl: Option<Decimal>,
13615
13616    /// `mtmPnl` (added for full ibflex coverage)
13617    #[serde(
13618        rename = "@mtmPnl",
13619        default,
13620        deserialize_with = "deserialize_optional_decimal"
13621    )]
13622    pub mtm_pnl: Option<Decimal>,
13623
13624    /// `origOrderID` (added for full ibflex coverage)
13625    #[serde(
13626        rename = "@origOrderID",
13627        default,
13628        deserialize_with = "deserialize_optional_string"
13629    )]
13630    pub orig_order_id: Option<String>,
13631
13632    /// `transactionID` (added for full ibflex coverage)
13633    #[serde(
13634        rename = "@transactionID",
13635        default,
13636        deserialize_with = "deserialize_optional_string"
13637    )]
13638    pub transaction_id: Option<String>,
13639
13640    /// `ibExecID` (added for full ibflex coverage)
13641    #[serde(
13642        rename = "@ibExecID",
13643        default,
13644        deserialize_with = "deserialize_optional_string"
13645    )]
13646    pub ib_exec_id: Option<String>,
13647
13648    /// `exchOrderId` (added for full ibflex coverage)
13649    #[serde(
13650        rename = "@exchOrderId",
13651        default,
13652        deserialize_with = "deserialize_optional_string"
13653    )]
13654    pub exch_order_id: Option<String>,
13655
13656    /// `extExecID` (added for full ibflex coverage)
13657    #[serde(
13658        rename = "@extExecID",
13659        default,
13660        deserialize_with = "deserialize_optional_string"
13661    )]
13662    pub ext_exec_id: Option<String>,
13663
13664    /// `openDateTime` (added for full ibflex coverage)
13665    #[serde(
13666        rename = "@openDateTime",
13667        default,
13668        deserialize_with = "deserialize_optional_string"
13669    )]
13670    pub open_date_time: Option<String>,
13671
13672    /// `holdingPeriodDateTime` (added for full ibflex coverage)
13673    #[serde(
13674        rename = "@holdingPeriodDateTime",
13675        default,
13676        deserialize_with = "deserialize_optional_string"
13677    )]
13678    pub holding_period_date_time: Option<String>,
13679
13680    /// `whenRealized` (added for full ibflex coverage)
13681    #[serde(
13682        rename = "@whenRealized",
13683        default,
13684        deserialize_with = "deserialize_optional_string"
13685    )]
13686    pub when_realized: Option<String>,
13687
13688    /// `whenReopened` (added for full ibflex coverage)
13689    #[serde(
13690        rename = "@whenReopened",
13691        default,
13692        deserialize_with = "deserialize_optional_string"
13693    )]
13694    pub when_reopened: Option<String>,
13695
13696    /// `changeInPrice` (added for full ibflex coverage)
13697    #[serde(
13698        rename = "@changeInPrice",
13699        default,
13700        deserialize_with = "deserialize_optional_decimal"
13701    )]
13702    pub change_in_price: Option<Decimal>,
13703
13704    /// `changeInQuantity` (added for full ibflex coverage)
13705    #[serde(
13706        rename = "@changeInQuantity",
13707        default,
13708        deserialize_with = "deserialize_optional_decimal"
13709    )]
13710    pub change_in_quantity: Option<Decimal>,
13711
13712    /// `subCategory` (added for full ibflex coverage)
13713    #[serde(
13714        rename = "@subCategory",
13715        default,
13716        deserialize_with = "deserialize_optional_string"
13717    )]
13718    pub sub_category: Option<String>,
13719
13720    /// `figi` (added for full ibflex coverage)
13721    #[serde(
13722        rename = "@figi",
13723        default,
13724        deserialize_with = "deserialize_optional_string"
13725    )]
13726    pub figi: Option<String>,
13727
13728    /// `issuerCountryCode` (added for full ibflex coverage)
13729    #[serde(
13730        rename = "@issuerCountryCode",
13731        default,
13732        deserialize_with = "deserialize_optional_string"
13733    )]
13734    pub issuer_country_code: Option<String>,
13735
13736    /// `relatedTradeID` (added for full ibflex coverage)
13737    #[serde(
13738        rename = "@relatedTradeID",
13739        default,
13740        deserialize_with = "deserialize_optional_string"
13741    )]
13742    pub related_trade_id: Option<String>,
13743
13744    /// `origTransactionID` (added for full ibflex coverage)
13745    #[serde(
13746        rename = "@origTransactionID",
13747        default,
13748        deserialize_with = "deserialize_optional_string"
13749    )]
13750    pub orig_transaction_id: Option<String>,
13751
13752    /// `relatedTransactionID` (added for full ibflex coverage)
13753    #[serde(
13754        rename = "@relatedTransactionID",
13755        default,
13756        deserialize_with = "deserialize_optional_string"
13757    )]
13758    pub related_transaction_id: Option<String>,
13759
13760    /// `rtn` (added for full ibflex coverage)
13761    #[serde(
13762        rename = "@rtn",
13763        default,
13764        deserialize_with = "deserialize_optional_string"
13765    )]
13766    pub rtn: Option<String>,
13767
13768    /// `initialInvestment` (added for full ibflex coverage)
13769    #[serde(
13770        rename = "@initialInvestment",
13771        default,
13772        deserialize_with = "deserialize_optional_bool"
13773    )]
13774    pub initial_investment: Option<bool>,
13775
13776    /// `serialNumber` (added for full ibflex coverage)
13777    #[serde(
13778        rename = "@serialNumber",
13779        default,
13780        deserialize_with = "deserialize_optional_string"
13781    )]
13782    pub serial_number: Option<String>,
13783
13784    /// `deliveryType` (added for full ibflex coverage)
13785    #[serde(
13786        rename = "@deliveryType",
13787        default,
13788        deserialize_with = "deserialize_optional_string"
13789    )]
13790    pub delivery_type: Option<String>,
13791
13792    /// `commodityType` (added for full ibflex coverage)
13793    #[serde(
13794        rename = "@commodityType",
13795        default,
13796        deserialize_with = "deserialize_optional_string"
13797    )]
13798    pub commodity_type: Option<String>,
13799
13800    /// `fineness` (added for full ibflex coverage)
13801    #[serde(
13802        rename = "@fineness",
13803        default,
13804        deserialize_with = "deserialize_optional_decimal"
13805    )]
13806    pub fineness: Option<Decimal>,
13807
13808    /// `weight` (added for full ibflex coverage)
13809    #[serde(
13810        rename = "@weight",
13811        default,
13812        deserialize_with = "deserialize_optional_string"
13813    )]
13814    pub weight: Option<String>,
13815
13816    /// `positionActionID` (added for full ibflex coverage)
13817    #[serde(
13818        rename = "@positionActionID",
13819        default,
13820        deserialize_with = "deserialize_optional_string"
13821    )]
13822    pub position_action_id: Option<String>,
13823}
13824
13825/// Net stock position combining long stock and option-equivalent exposure.
13826///
13827/// Mirrors the ibflex `NetStockPosition` element; all attributes are optional as IB may
13828/// omit any of them.
13829#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
13830pub struct NetStockPosition {
13831    /// `assetCategory`
13832    #[serde(rename = "@assetCategory", default)]
13833    pub asset_category: Option<AssetCategory>,
13834
13835    /// `accountId`
13836    #[serde(
13837        rename = "@accountId",
13838        default,
13839        deserialize_with = "deserialize_optional_string"
13840    )]
13841    pub account_id: Option<String>,
13842
13843    /// `acctAlias`
13844    #[serde(
13845        rename = "@acctAlias",
13846        default,
13847        deserialize_with = "deserialize_optional_string"
13848    )]
13849    pub acct_alias: Option<String>,
13850
13851    /// `model`
13852    #[serde(
13853        rename = "@model",
13854        default,
13855        deserialize_with = "deserialize_optional_string"
13856    )]
13857    pub model: Option<String>,
13858
13859    /// `currency`
13860    #[serde(
13861        rename = "@currency",
13862        default,
13863        deserialize_with = "deserialize_optional_string"
13864    )]
13865    pub currency: Option<String>,
13866
13867    /// `symbol`
13868    #[serde(
13869        rename = "@symbol",
13870        default,
13871        deserialize_with = "deserialize_optional_string"
13872    )]
13873    pub symbol: Option<String>,
13874
13875    /// `description`
13876    #[serde(
13877        rename = "@description",
13878        default,
13879        deserialize_with = "deserialize_optional_string"
13880    )]
13881    pub description: Option<String>,
13882
13883    /// `conid`
13884    #[serde(
13885        rename = "@conid",
13886        default,
13887        deserialize_with = "deserialize_optional_string"
13888    )]
13889    pub conid: Option<String>,
13890
13891    /// `securityID`
13892    #[serde(
13893        rename = "@securityID",
13894        default,
13895        deserialize_with = "deserialize_optional_string"
13896    )]
13897    pub security_id: Option<String>,
13898
13899    /// `securityIDType`
13900    #[serde(
13901        rename = "@securityIDType",
13902        default,
13903        deserialize_with = "deserialize_optional_string"
13904    )]
13905    pub security_id_type: Option<String>,
13906
13907    /// `cusip`
13908    #[serde(
13909        rename = "@cusip",
13910        default,
13911        deserialize_with = "deserialize_optional_string"
13912    )]
13913    pub cusip: Option<String>,
13914
13915    /// `isin`
13916    #[serde(
13917        rename = "@isin",
13918        default,
13919        deserialize_with = "deserialize_optional_string"
13920    )]
13921    pub isin: Option<String>,
13922
13923    /// `sedol`
13924    #[serde(
13925        rename = "@sedol",
13926        default,
13927        deserialize_with = "deserialize_optional_string"
13928    )]
13929    pub sedol: Option<String>,
13930
13931    /// `listingExchange`
13932    #[serde(
13933        rename = "@listingExchange",
13934        default,
13935        deserialize_with = "deserialize_optional_string"
13936    )]
13937    pub listing_exchange: Option<String>,
13938
13939    /// `underlyingConid`
13940    #[serde(
13941        rename = "@underlyingConid",
13942        default,
13943        deserialize_with = "deserialize_optional_string"
13944    )]
13945    pub underlying_conid: Option<String>,
13946
13947    /// `underlyingSymbol`
13948    #[serde(
13949        rename = "@underlyingSymbol",
13950        default,
13951        deserialize_with = "deserialize_optional_string"
13952    )]
13953    pub underlying_symbol: Option<String>,
13954
13955    /// `underlyingSecurityID`
13956    #[serde(
13957        rename = "@underlyingSecurityID",
13958        default,
13959        deserialize_with = "deserialize_optional_string"
13960    )]
13961    pub underlying_security_id: Option<String>,
13962
13963    /// `underlyingListingExchange`
13964    #[serde(
13965        rename = "@underlyingListingExchange",
13966        default,
13967        deserialize_with = "deserialize_optional_string"
13968    )]
13969    pub underlying_listing_exchange: Option<String>,
13970
13971    /// `issuer`
13972    #[serde(
13973        rename = "@issuer",
13974        default,
13975        deserialize_with = "deserialize_optional_string"
13976    )]
13977    pub issuer: Option<String>,
13978
13979    /// `multiplier`
13980    #[serde(
13981        rename = "@multiplier",
13982        default,
13983        deserialize_with = "deserialize_optional_decimal"
13984    )]
13985    pub multiplier: Option<Decimal>,
13986
13987    /// `strike`
13988    #[serde(
13989        rename = "@strike",
13990        default,
13991        deserialize_with = "deserialize_optional_decimal"
13992    )]
13993    pub strike: Option<Decimal>,
13994
13995    /// `expiry`
13996    #[serde(
13997        rename = "@expiry",
13998        default,
13999        deserialize_with = "deserialize_optional_date"
14000    )]
14001    pub expiry: Option<NaiveDate>,
14002
14003    /// `putCall`
14004    #[serde(rename = "@putCall", default)]
14005    pub put_call: Option<PutCall>,
14006
14007    /// `principalAdjustFactor`
14008    #[serde(
14009        rename = "@principalAdjustFactor",
14010        default,
14011        deserialize_with = "deserialize_optional_decimal"
14012    )]
14013    pub principal_adjust_factor: Option<Decimal>,
14014
14015    /// `reportDate`
14016    #[serde(
14017        rename = "@reportDate",
14018        default,
14019        deserialize_with = "deserialize_optional_date"
14020    )]
14021    pub report_date: Option<NaiveDate>,
14022
14023    /// `sharesAtIb`
14024    #[serde(
14025        rename = "@sharesAtIb",
14026        default,
14027        deserialize_with = "deserialize_optional_decimal"
14028    )]
14029    pub shares_at_ib: Option<Decimal>,
14030
14031    /// `sharesBorrowed`
14032    #[serde(
14033        rename = "@sharesBorrowed",
14034        default,
14035        deserialize_with = "deserialize_optional_decimal"
14036    )]
14037    pub shares_borrowed: Option<Decimal>,
14038
14039    /// `sharesLent`
14040    #[serde(
14041        rename = "@sharesLent",
14042        default,
14043        deserialize_with = "deserialize_optional_decimal"
14044    )]
14045    pub shares_lent: Option<Decimal>,
14046
14047    /// `netShares`
14048    #[serde(
14049        rename = "@netShares",
14050        default,
14051        deserialize_with = "deserialize_optional_decimal"
14052    )]
14053    pub net_shares: Option<Decimal>,
14054
14055    /// `serialNumber`
14056    #[serde(
14057        rename = "@serialNumber",
14058        default,
14059        deserialize_with = "deserialize_optional_string"
14060    )]
14061    pub serial_number: Option<String>,
14062
14063    /// `deliveryType`
14064    #[serde(
14065        rename = "@deliveryType",
14066        default,
14067        deserialize_with = "deserialize_optional_string"
14068    )]
14069    pub delivery_type: Option<String>,
14070
14071    /// `commodityType`
14072    #[serde(
14073        rename = "@commodityType",
14074        default,
14075        deserialize_with = "deserialize_optional_string"
14076    )]
14077    pub commodity_type: Option<String>,
14078
14079    /// `fineness`
14080    #[serde(
14081        rename = "@fineness",
14082        default,
14083        deserialize_with = "deserialize_optional_decimal"
14084    )]
14085    pub fineness: Option<Decimal>,
14086
14087    /// `weight`
14088    #[serde(
14089        rename = "@weight",
14090        default,
14091        deserialize_with = "deserialize_optional_string"
14092    )]
14093    pub weight: Option<String>,
14094
14095    /// `subCategory`
14096    #[serde(
14097        rename = "@subCategory",
14098        default,
14099        deserialize_with = "deserialize_optional_string"
14100    )]
14101    pub sub_category: Option<String>,
14102
14103    /// `figi`
14104    #[serde(
14105        rename = "@figi",
14106        default,
14107        deserialize_with = "deserialize_optional_string"
14108    )]
14109    pub figi: Option<String>,
14110
14111    /// `issuerCountryCode`
14112    #[serde(
14113        rename = "@issuerCountryCode",
14114        default,
14115        deserialize_with = "deserialize_optional_string"
14116    )]
14117    pub issuer_country_code: Option<String>,
14118}
14119
14120/// Per-transaction tax detail (e.g. UK stamp duty, financial transaction taxes).
14121///
14122/// Mirrors the ibflex `TransactionTax` element; all attributes are optional as IB may
14123/// omit any of them.
14124#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
14125pub struct TransactionTax {
14126    /// `accountId`
14127    #[serde(
14128        rename = "@accountId",
14129        default,
14130        deserialize_with = "deserialize_optional_string"
14131    )]
14132    pub account_id: Option<String>,
14133
14134    /// `acctAlias`
14135    #[serde(
14136        rename = "@acctAlias",
14137        default,
14138        deserialize_with = "deserialize_optional_string"
14139    )]
14140    pub acct_alias: Option<String>,
14141
14142    /// `model`
14143    #[serde(
14144        rename = "@model",
14145        default,
14146        deserialize_with = "deserialize_optional_string"
14147    )]
14148    pub model: Option<String>,
14149
14150    /// `currency`
14151    #[serde(
14152        rename = "@currency",
14153        default,
14154        deserialize_with = "deserialize_optional_string"
14155    )]
14156    pub currency: Option<String>,
14157
14158    /// `fxRateToBase`
14159    #[serde(
14160        rename = "@fxRateToBase",
14161        default,
14162        deserialize_with = "deserialize_optional_decimal"
14163    )]
14164    pub fx_rate_to_base: Option<Decimal>,
14165
14166    /// `assetCategory`
14167    #[serde(rename = "@assetCategory", default)]
14168    pub asset_category: Option<AssetCategory>,
14169
14170    /// `symbol`
14171    #[serde(
14172        rename = "@symbol",
14173        default,
14174        deserialize_with = "deserialize_optional_string"
14175    )]
14176    pub symbol: Option<String>,
14177
14178    /// `description`
14179    #[serde(
14180        rename = "@description",
14181        default,
14182        deserialize_with = "deserialize_optional_string"
14183    )]
14184    pub description: Option<String>,
14185
14186    /// `conid`
14187    #[serde(
14188        rename = "@conid",
14189        default,
14190        deserialize_with = "deserialize_optional_string"
14191    )]
14192    pub conid: Option<String>,
14193
14194    /// `securityID`
14195    #[serde(
14196        rename = "@securityID",
14197        default,
14198        deserialize_with = "deserialize_optional_string"
14199    )]
14200    pub security_id: Option<String>,
14201
14202    /// `securityIDType`
14203    #[serde(
14204        rename = "@securityIDType",
14205        default,
14206        deserialize_with = "deserialize_optional_string"
14207    )]
14208    pub security_id_type: Option<String>,
14209
14210    /// `cusip`
14211    #[serde(
14212        rename = "@cusip",
14213        default,
14214        deserialize_with = "deserialize_optional_string"
14215    )]
14216    pub cusip: Option<String>,
14217
14218    /// `isin`
14219    #[serde(
14220        rename = "@isin",
14221        default,
14222        deserialize_with = "deserialize_optional_string"
14223    )]
14224    pub isin: Option<String>,
14225
14226    /// `listingExchange`
14227    #[serde(
14228        rename = "@listingExchange",
14229        default,
14230        deserialize_with = "deserialize_optional_string"
14231    )]
14232    pub listing_exchange: Option<String>,
14233
14234    /// `underlyingConid`
14235    #[serde(
14236        rename = "@underlyingConid",
14237        default,
14238        deserialize_with = "deserialize_optional_string"
14239    )]
14240    pub underlying_conid: Option<String>,
14241
14242    /// `underlyingSecurityID`
14243    #[serde(
14244        rename = "@underlyingSecurityID",
14245        default,
14246        deserialize_with = "deserialize_optional_string"
14247    )]
14248    pub underlying_security_id: Option<String>,
14249
14250    /// `underlyingSymbol`
14251    #[serde(
14252        rename = "@underlyingSymbol",
14253        default,
14254        deserialize_with = "deserialize_optional_string"
14255    )]
14256    pub underlying_symbol: Option<String>,
14257
14258    /// `underlyingListingExchange`
14259    #[serde(
14260        rename = "@underlyingListingExchange",
14261        default,
14262        deserialize_with = "deserialize_optional_string"
14263    )]
14264    pub underlying_listing_exchange: Option<String>,
14265
14266    /// `issuer`
14267    #[serde(
14268        rename = "@issuer",
14269        default,
14270        deserialize_with = "deserialize_optional_string"
14271    )]
14272    pub issuer: Option<String>,
14273
14274    /// `multiplier`
14275    #[serde(
14276        rename = "@multiplier",
14277        default,
14278        deserialize_with = "deserialize_optional_decimal"
14279    )]
14280    pub multiplier: Option<Decimal>,
14281
14282    /// `strike`
14283    #[serde(
14284        rename = "@strike",
14285        default,
14286        deserialize_with = "deserialize_optional_decimal"
14287    )]
14288    pub strike: Option<Decimal>,
14289
14290    /// `expiry`
14291    #[serde(
14292        rename = "@expiry",
14293        default,
14294        deserialize_with = "deserialize_optional_date"
14295    )]
14296    pub expiry: Option<NaiveDate>,
14297
14298    /// `putCall`
14299    #[serde(rename = "@putCall", default)]
14300    pub put_call: Option<PutCall>,
14301
14302    /// `principalAdjustFactor`
14303    #[serde(
14304        rename = "@principalAdjustFactor",
14305        default,
14306        deserialize_with = "deserialize_optional_decimal"
14307    )]
14308    pub principal_adjust_factor: Option<Decimal>,
14309
14310    /// `date`
14311    #[serde(
14312        rename = "@date",
14313        default,
14314        deserialize_with = "deserialize_optional_string"
14315    )]
14316    pub date: Option<String>,
14317
14318    /// `taxDescription`
14319    #[serde(
14320        rename = "@taxDescription",
14321        default,
14322        deserialize_with = "deserialize_optional_string"
14323    )]
14324    pub tax_description: Option<String>,
14325
14326    /// `quantity`
14327    #[serde(
14328        rename = "@quantity",
14329        default,
14330        deserialize_with = "deserialize_optional_decimal"
14331    )]
14332    pub quantity: Option<Decimal>,
14333
14334    /// `reportDate`
14335    #[serde(
14336        rename = "@reportDate",
14337        default,
14338        deserialize_with = "deserialize_optional_date"
14339    )]
14340    pub report_date: Option<NaiveDate>,
14341
14342    /// `taxAmount`
14343    #[serde(
14344        rename = "@taxAmount",
14345        default,
14346        deserialize_with = "deserialize_optional_decimal"
14347    )]
14348    pub tax_amount: Option<Decimal>,
14349
14350    /// `tradeId`
14351    #[serde(
14352        rename = "@tradeId",
14353        default,
14354        deserialize_with = "deserialize_optional_string"
14355    )]
14356    pub trade_id: Option<String>,
14357
14358    /// `tradePrice`
14359    #[serde(
14360        rename = "@tradePrice",
14361        default,
14362        deserialize_with = "deserialize_optional_decimal"
14363    )]
14364    pub trade_price: Option<Decimal>,
14365
14366    /// `source`
14367    #[serde(
14368        rename = "@source",
14369        default,
14370        deserialize_with = "deserialize_optional_string"
14371    )]
14372    pub source: Option<String>,
14373
14374    /// `code`
14375    #[serde(
14376        rename = "@code",
14377        default,
14378        deserialize_with = "deserialize_optional_string"
14379    )]
14380    pub code: Option<String>,
14381
14382    /// `levelOfDetail`
14383    #[serde(
14384        rename = "@levelOfDetail",
14385        default,
14386        deserialize_with = "deserialize_optional_string"
14387    )]
14388    pub level_of_detail: Option<String>,
14389}
14390
14391/// Contract-for-difference financing charge.
14392///
14393/// Mirrors the ibflex `CFDCharge` element; all attributes are optional as IB may
14394/// omit any of them.
14395#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
14396pub struct CFDCharge {
14397    /// `assetCategory`
14398    #[serde(rename = "@assetCategory", default)]
14399    pub asset_category: Option<AssetCategory>,
14400
14401    /// `accountId`
14402    #[serde(
14403        rename = "@accountId",
14404        default,
14405        deserialize_with = "deserialize_optional_string"
14406    )]
14407    pub account_id: Option<String>,
14408
14409    /// `currency`
14410    #[serde(
14411        rename = "@currency",
14412        default,
14413        deserialize_with = "deserialize_optional_string"
14414    )]
14415    pub currency: Option<String>,
14416
14417    /// `fxRateToBase`
14418    #[serde(
14419        rename = "@fxRateToBase",
14420        default,
14421        deserialize_with = "deserialize_optional_decimal"
14422    )]
14423    pub fx_rate_to_base: Option<Decimal>,
14424
14425    /// `description`
14426    #[serde(
14427        rename = "@description",
14428        default,
14429        deserialize_with = "deserialize_optional_string"
14430    )]
14431    pub description: Option<String>,
14432
14433    /// `conid`
14434    #[serde(
14435        rename = "@conid",
14436        default,
14437        deserialize_with = "deserialize_optional_string"
14438    )]
14439    pub conid: Option<String>,
14440
14441    /// `securityID`
14442    #[serde(
14443        rename = "@securityID",
14444        default,
14445        deserialize_with = "deserialize_optional_string"
14446    )]
14447    pub security_id: Option<String>,
14448
14449    /// `cusip`
14450    #[serde(
14451        rename = "@cusip",
14452        default,
14453        deserialize_with = "deserialize_optional_string"
14454    )]
14455    pub cusip: Option<String>,
14456
14457    /// `isin`
14458    #[serde(
14459        rename = "@isin",
14460        default,
14461        deserialize_with = "deserialize_optional_string"
14462    )]
14463    pub isin: Option<String>,
14464
14465    /// `listingExchange`
14466    #[serde(
14467        rename = "@listingExchange",
14468        default,
14469        deserialize_with = "deserialize_optional_string"
14470    )]
14471    pub listing_exchange: Option<String>,
14472
14473    /// `underlyingConid`
14474    #[serde(
14475        rename = "@underlyingConid",
14476        default,
14477        deserialize_with = "deserialize_optional_string"
14478    )]
14479    pub underlying_conid: Option<String>,
14480
14481    /// `underlyingSecurityID`
14482    #[serde(
14483        rename = "@underlyingSecurityID",
14484        default,
14485        deserialize_with = "deserialize_optional_string"
14486    )]
14487    pub underlying_security_id: Option<String>,
14488
14489    /// `underlyingListingExchange`
14490    #[serde(
14491        rename = "@underlyingListingExchange",
14492        default,
14493        deserialize_with = "deserialize_optional_string"
14494    )]
14495    pub underlying_listing_exchange: Option<String>,
14496
14497    /// `amount`
14498    #[serde(
14499        rename = "@amount",
14500        default,
14501        deserialize_with = "deserialize_optional_decimal"
14502    )]
14503    pub amount: Option<Decimal>,
14504
14505    /// `dateTime`
14506    #[serde(
14507        rename = "@dateTime",
14508        default,
14509        deserialize_with = "deserialize_optional_string"
14510    )]
14511    pub date_time: Option<String>,
14512
14513    /// `sedol`
14514    #[serde(
14515        rename = "@sedol",
14516        default,
14517        deserialize_with = "deserialize_optional_string"
14518    )]
14519    pub sedol: Option<String>,
14520
14521    /// `symbol`
14522    #[serde(
14523        rename = "@symbol",
14524        default,
14525        deserialize_with = "deserialize_optional_string"
14526    )]
14527    pub symbol: Option<String>,
14528
14529    /// `securityIDType`
14530    #[serde(
14531        rename = "@securityIDType",
14532        default,
14533        deserialize_with = "deserialize_optional_string"
14534    )]
14535    pub security_id_type: Option<String>,
14536
14537    /// `underlyingSymbol`
14538    #[serde(
14539        rename = "@underlyingSymbol",
14540        default,
14541        deserialize_with = "deserialize_optional_string"
14542    )]
14543    pub underlying_symbol: Option<String>,
14544
14545    /// `issuer`
14546    #[serde(
14547        rename = "@issuer",
14548        default,
14549        deserialize_with = "deserialize_optional_string"
14550    )]
14551    pub issuer: Option<String>,
14552
14553    /// `multiplier`
14554    #[serde(
14555        rename = "@multiplier",
14556        default,
14557        deserialize_with = "deserialize_optional_decimal"
14558    )]
14559    pub multiplier: Option<Decimal>,
14560
14561    /// `strike`
14562    #[serde(
14563        rename = "@strike",
14564        default,
14565        deserialize_with = "deserialize_optional_decimal"
14566    )]
14567    pub strike: Option<Decimal>,
14568
14569    /// `expiry`
14570    #[serde(
14571        rename = "@expiry",
14572        default,
14573        deserialize_with = "deserialize_optional_date"
14574    )]
14575    pub expiry: Option<NaiveDate>,
14576
14577    /// `putCall`
14578    #[serde(rename = "@putCall", default)]
14579    pub put_call: Option<PutCall>,
14580
14581    /// `principalAdjustFactor`
14582    #[serde(
14583        rename = "@principalAdjustFactor",
14584        default,
14585        deserialize_with = "deserialize_optional_decimal"
14586    )]
14587    pub principal_adjust_factor: Option<Decimal>,
14588
14589    /// `tradeID`
14590    #[serde(
14591        rename = "@tradeID",
14592        default,
14593        deserialize_with = "deserialize_optional_string"
14594    )]
14595    pub trade_id: Option<String>,
14596
14597    /// `code`
14598    #[serde(
14599        rename = "@code",
14600        default,
14601        deserialize_with = "deserialize_optional_string"
14602    )]
14603    pub code: Option<String>,
14604
14605    /// `transactionID`
14606    #[serde(
14607        rename = "@transactionID",
14608        default,
14609        deserialize_with = "deserialize_optional_string"
14610    )]
14611    pub transaction_id: Option<String>,
14612
14613    /// `reportDate`
14614    #[serde(
14615        rename = "@reportDate",
14616        default,
14617        deserialize_with = "deserialize_optional_date"
14618    )]
14619    pub report_date: Option<NaiveDate>,
14620
14621    /// `date`
14622    #[serde(
14623        rename = "@date",
14624        default,
14625        deserialize_with = "deserialize_optional_date"
14626    )]
14627    pub date: Option<NaiveDate>,
14628
14629    /// `received`
14630    #[serde(
14631        rename = "@received",
14632        default,
14633        deserialize_with = "deserialize_optional_decimal"
14634    )]
14635    pub received: Option<Decimal>,
14636
14637    /// `paid`
14638    #[serde(
14639        rename = "@paid",
14640        default,
14641        deserialize_with = "deserialize_optional_decimal"
14642    )]
14643    pub paid: Option<Decimal>,
14644
14645    /// `total`
14646    #[serde(
14647        rename = "@total",
14648        default,
14649        deserialize_with = "deserialize_optional_decimal"
14650    )]
14651    pub total: Option<Decimal>,
14652
14653    /// `transactionId`
14654    #[serde(
14655        rename = "@transactionId",
14656        default,
14657        deserialize_with = "deserialize_optional_string"
14658    )]
14659    pub transaction_id_lc: Option<String>,
14660
14661    /// `activityDescription`
14662    #[serde(
14663        rename = "@activityDescription",
14664        default,
14665        deserialize_with = "deserialize_optional_string"
14666    )]
14667    pub activity_description: Option<String>,
14668
14669    /// `clientReference`
14670    #[serde(
14671        rename = "@clientReference",
14672        default,
14673        deserialize_with = "deserialize_optional_string"
14674    )]
14675    pub client_reference: Option<String>,
14676
14677    /// `acctAlias`
14678    #[serde(
14679        rename = "@acctAlias",
14680        default,
14681        deserialize_with = "deserialize_optional_string"
14682    )]
14683    pub acct_alias: Option<String>,
14684
14685    /// `model`
14686    #[serde(
14687        rename = "@model",
14688        default,
14689        deserialize_with = "deserialize_optional_string"
14690    )]
14691    pub model: Option<String>,
14692
14693    /// `levelOfDetail`
14694    #[serde(
14695        rename = "@levelOfDetail",
14696        default,
14697        deserialize_with = "deserialize_optional_string"
14698    )]
14699    pub level_of_detail: Option<String>,
14700}
14701
14702/// Open stock-loan/borrow contract.
14703///
14704/// Mirrors the ibflex `SLBOpenContract` element; all attributes are optional as IB may
14705/// omit any of them.
14706#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
14707pub struct SLBOpenContract {
14708    /// `accountId`
14709    #[serde(
14710        rename = "@accountId",
14711        default,
14712        deserialize_with = "deserialize_optional_string"
14713    )]
14714    pub account_id: Option<String>,
14715
14716    /// `acctAlias`
14717    #[serde(
14718        rename = "@acctAlias",
14719        default,
14720        deserialize_with = "deserialize_optional_string"
14721    )]
14722    pub acct_alias: Option<String>,
14723
14724    /// `model`
14725    #[serde(
14726        rename = "@model",
14727        default,
14728        deserialize_with = "deserialize_optional_string"
14729    )]
14730    pub model: Option<String>,
14731
14732    /// `currency`
14733    #[serde(
14734        rename = "@currency",
14735        default,
14736        deserialize_with = "deserialize_optional_string"
14737    )]
14738    pub currency: Option<String>,
14739
14740    /// `fxRateToBase`
14741    #[serde(
14742        rename = "@fxRateToBase",
14743        default,
14744        deserialize_with = "deserialize_optional_decimal"
14745    )]
14746    pub fx_rate_to_base: Option<Decimal>,
14747
14748    /// `description`
14749    #[serde(
14750        rename = "@description",
14751        default,
14752        deserialize_with = "deserialize_optional_string"
14753    )]
14754    pub description: Option<String>,
14755
14756    /// `conid`
14757    #[serde(
14758        rename = "@conid",
14759        default,
14760        deserialize_with = "deserialize_optional_string"
14761    )]
14762    pub conid: Option<String>,
14763
14764    /// `securityID`
14765    #[serde(
14766        rename = "@securityID",
14767        default,
14768        deserialize_with = "deserialize_optional_string"
14769    )]
14770    pub security_id: Option<String>,
14771
14772    /// `cusip`
14773    #[serde(
14774        rename = "@cusip",
14775        default,
14776        deserialize_with = "deserialize_optional_string"
14777    )]
14778    pub cusip: Option<String>,
14779
14780    /// `isin`
14781    #[serde(
14782        rename = "@isin",
14783        default,
14784        deserialize_with = "deserialize_optional_string"
14785    )]
14786    pub isin: Option<String>,
14787
14788    /// `assetCategory`
14789    #[serde(
14790        rename = "@assetCategory",
14791        default,
14792        deserialize_with = "deserialize_optional_string"
14793    )]
14794    pub asset_category: Option<String>,
14795
14796    /// `subCategory`
14797    #[serde(
14798        rename = "@subCategory",
14799        default,
14800        deserialize_with = "deserialize_optional_string"
14801    )]
14802    pub sub_category: Option<String>,
14803
14804    /// `symbol`
14805    #[serde(
14806        rename = "@symbol",
14807        default,
14808        deserialize_with = "deserialize_optional_string"
14809    )]
14810    pub symbol: Option<String>,
14811
14812    /// `securityIDType`
14813    #[serde(
14814        rename = "@securityIDType",
14815        default,
14816        deserialize_with = "deserialize_optional_string"
14817    )]
14818    pub security_id_type: Option<String>,
14819
14820    /// `figi`
14821    #[serde(
14822        rename = "@figi",
14823        default,
14824        deserialize_with = "deserialize_optional_string"
14825    )]
14826    pub figi: Option<String>,
14827
14828    /// `listingExchange`
14829    #[serde(
14830        rename = "@listingExchange",
14831        default,
14832        deserialize_with = "deserialize_optional_string"
14833    )]
14834    pub listing_exchange: Option<String>,
14835
14836    /// `underlyingConid`
14837    #[serde(
14838        rename = "@underlyingConid",
14839        default,
14840        deserialize_with = "deserialize_optional_string"
14841    )]
14842    pub underlying_conid: Option<String>,
14843
14844    /// `underlyingSymbol`
14845    #[serde(
14846        rename = "@underlyingSymbol",
14847        default,
14848        deserialize_with = "deserialize_optional_string"
14849    )]
14850    pub underlying_symbol: Option<String>,
14851
14852    /// `underlyingSecurityID`
14853    #[serde(
14854        rename = "@underlyingSecurityID",
14855        default,
14856        deserialize_with = "deserialize_optional_string"
14857    )]
14858    pub underlying_security_id: Option<String>,
14859
14860    /// `underlyingListingExchange`
14861    #[serde(
14862        rename = "@underlyingListingExchange",
14863        default,
14864        deserialize_with = "deserialize_optional_string"
14865    )]
14866    pub underlying_listing_exchange: Option<String>,
14867
14868    /// `issuer`
14869    #[serde(
14870        rename = "@issuer",
14871        default,
14872        deserialize_with = "deserialize_optional_string"
14873    )]
14874    pub issuer: Option<String>,
14875
14876    /// `issuerCountryCode`
14877    #[serde(
14878        rename = "@issuerCountryCode",
14879        default,
14880        deserialize_with = "deserialize_optional_string"
14881    )]
14882    pub issuer_country_code: Option<String>,
14883
14884    /// `multiplier`
14885    #[serde(
14886        rename = "@multiplier",
14887        default,
14888        deserialize_with = "deserialize_optional_decimal"
14889    )]
14890    pub multiplier: Option<Decimal>,
14891
14892    /// `strike`
14893    #[serde(
14894        rename = "@strike",
14895        default,
14896        deserialize_with = "deserialize_optional_decimal"
14897    )]
14898    pub strike: Option<Decimal>,
14899
14900    /// `expiry`
14901    #[serde(
14902        rename = "@expiry",
14903        default,
14904        deserialize_with = "deserialize_optional_date"
14905    )]
14906    pub expiry: Option<NaiveDate>,
14907
14908    /// `putCall`
14909    #[serde(rename = "@putCall", default)]
14910    pub put_call: Option<PutCall>,
14911
14912    /// `principalAdjustFactor`
14913    #[serde(
14914        rename = "@principalAdjustFactor",
14915        default,
14916        deserialize_with = "deserialize_optional_decimal"
14917    )]
14918    pub principal_adjust_factor: Option<Decimal>,
14919
14920    /// `date`
14921    #[serde(
14922        rename = "@date",
14923        default,
14924        deserialize_with = "deserialize_optional_date"
14925    )]
14926    pub date: Option<NaiveDate>,
14927
14928    /// `type`
14929    #[serde(
14930        rename = "@type",
14931        default,
14932        deserialize_with = "deserialize_optional_string"
14933    )]
14934    pub r#type: Option<String>,
14935
14936    /// `slbTransactionId`
14937    #[serde(
14938        rename = "@slbTransactionId",
14939        default,
14940        deserialize_with = "deserialize_optional_string"
14941    )]
14942    pub slb_transaction_id: Option<String>,
14943
14944    /// `exchange`
14945    #[serde(
14946        rename = "@exchange",
14947        default,
14948        deserialize_with = "deserialize_optional_string"
14949    )]
14950    pub exchange: Option<String>,
14951
14952    /// `quantity`
14953    #[serde(
14954        rename = "@quantity",
14955        default,
14956        deserialize_with = "deserialize_optional_decimal"
14957    )]
14958    pub quantity: Option<Decimal>,
14959
14960    /// `excessQuantity`
14961    #[serde(
14962        rename = "@excessQuantity",
14963        default,
14964        deserialize_with = "deserialize_optional_decimal"
14965    )]
14966    pub excess_quantity: Option<Decimal>,
14967
14968    /// `feeRate`
14969    #[serde(
14970        rename = "@feeRate",
14971        default,
14972        deserialize_with = "deserialize_optional_decimal"
14973    )]
14974    pub fee_rate: Option<Decimal>,
14975
14976    /// `collateralAmount`
14977    #[serde(
14978        rename = "@collateralAmount",
14979        default,
14980        deserialize_with = "deserialize_optional_decimal"
14981    )]
14982    pub collateral_amount: Option<Decimal>,
14983
14984    /// `levelOfDetail`
14985    #[serde(
14986        rename = "@levelOfDetail",
14987        default,
14988        deserialize_with = "deserialize_optional_string"
14989    )]
14990    pub level_of_detail: Option<String>,
14991
14992    /// `serialNumber`
14993    #[serde(
14994        rename = "@serialNumber",
14995        default,
14996        deserialize_with = "deserialize_optional_decimal"
14997    )]
14998    pub serial_number: Option<Decimal>,
14999
15000    /// `deliveryType`
15001    #[serde(
15002        rename = "@deliveryType",
15003        default,
15004        deserialize_with = "deserialize_optional_decimal"
15005    )]
15006    pub delivery_type: Option<Decimal>,
15007
15008    /// `commodityType`
15009    #[serde(
15010        rename = "@commodityType",
15011        default,
15012        deserialize_with = "deserialize_optional_string"
15013    )]
15014    pub commodity_type: Option<String>,
15015
15016    /// `fineness`
15017    #[serde(
15018        rename = "@fineness",
15019        default,
15020        deserialize_with = "deserialize_optional_decimal"
15021    )]
15022    pub fineness: Option<Decimal>,
15023
15024    /// `weight`
15025    #[serde(
15026        rename = "@weight",
15027        default,
15028        deserialize_with = "deserialize_optional_decimal"
15029    )]
15030    pub weight: Option<Decimal>,
15031}
15032
15033/// Employee stock grant / vesting activity.
15034///
15035/// Mirrors the ibflex `StockGrantActivity` element; all attributes are optional as IB may
15036/// omit any of them.
15037#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
15038pub struct StockGrantActivity {
15039    /// `accountId`
15040    #[serde(
15041        rename = "@accountId",
15042        default,
15043        deserialize_with = "deserialize_optional_string"
15044    )]
15045    pub account_id: Option<String>,
15046
15047    /// `acctAlias`
15048    #[serde(
15049        rename = "@acctAlias",
15050        default,
15051        deserialize_with = "deserialize_optional_string"
15052    )]
15053    pub acct_alias: Option<String>,
15054
15055    /// `model`
15056    #[serde(
15057        rename = "@model",
15058        default,
15059        deserialize_with = "deserialize_optional_string"
15060    )]
15061    pub model: Option<String>,
15062
15063    /// `currency`
15064    #[serde(
15065        rename = "@currency",
15066        default,
15067        deserialize_with = "deserialize_optional_string"
15068    )]
15069    pub currency: Option<String>,
15070
15071    /// `fxRateToBase`
15072    #[serde(
15073        rename = "@fxRateToBase",
15074        default,
15075        deserialize_with = "deserialize_optional_decimal"
15076    )]
15077    pub fx_rate_to_base: Option<Decimal>,
15078
15079    /// `assetCategory`
15080    #[serde(rename = "@assetCategory", default)]
15081    pub asset_category: Option<AssetCategory>,
15082
15083    /// `subCategory`
15084    #[serde(
15085        rename = "@subCategory",
15086        default,
15087        deserialize_with = "deserialize_optional_string"
15088    )]
15089    pub sub_category: Option<String>,
15090
15091    /// `symbol`
15092    #[serde(
15093        rename = "@symbol",
15094        default,
15095        deserialize_with = "deserialize_optional_string"
15096    )]
15097    pub symbol: Option<String>,
15098
15099    /// `description`
15100    #[serde(
15101        rename = "@description",
15102        default,
15103        deserialize_with = "deserialize_optional_string"
15104    )]
15105    pub description: Option<String>,
15106
15107    /// `conid`
15108    #[serde(
15109        rename = "@conid",
15110        default,
15111        deserialize_with = "deserialize_optional_string"
15112    )]
15113    pub conid: Option<String>,
15114
15115    /// `securityID`
15116    #[serde(
15117        rename = "@securityID",
15118        default,
15119        deserialize_with = "deserialize_optional_string"
15120    )]
15121    pub security_id: Option<String>,
15122
15123    /// `securityIDType`
15124    #[serde(
15125        rename = "@securityIDType",
15126        default,
15127        deserialize_with = "deserialize_optional_string"
15128    )]
15129    pub security_id_type: Option<String>,
15130
15131    /// `cusip`
15132    #[serde(
15133        rename = "@cusip",
15134        default,
15135        deserialize_with = "deserialize_optional_string"
15136    )]
15137    pub cusip: Option<String>,
15138
15139    /// `isin`
15140    #[serde(
15141        rename = "@isin",
15142        default,
15143        deserialize_with = "deserialize_optional_string"
15144    )]
15145    pub isin: Option<String>,
15146
15147    /// `figi`
15148    #[serde(
15149        rename = "@figi",
15150        default,
15151        deserialize_with = "deserialize_optional_string"
15152    )]
15153    pub figi: Option<String>,
15154
15155    /// `listingExchange`
15156    #[serde(
15157        rename = "@listingExchange",
15158        default,
15159        deserialize_with = "deserialize_optional_string"
15160    )]
15161    pub listing_exchange: Option<String>,
15162
15163    /// `underlyingConid`
15164    #[serde(
15165        rename = "@underlyingConid",
15166        default,
15167        deserialize_with = "deserialize_optional_string"
15168    )]
15169    pub underlying_conid: Option<String>,
15170
15171    /// `underlyingSymbol`
15172    #[serde(
15173        rename = "@underlyingSymbol",
15174        default,
15175        deserialize_with = "deserialize_optional_string"
15176    )]
15177    pub underlying_symbol: Option<String>,
15178
15179    /// `underlyingSecurityID`
15180    #[serde(
15181        rename = "@underlyingSecurityID",
15182        default,
15183        deserialize_with = "deserialize_optional_string"
15184    )]
15185    pub underlying_security_id: Option<String>,
15186
15187    /// `underlyingListingExchange`
15188    #[serde(
15189        rename = "@underlyingListingExchange",
15190        default,
15191        deserialize_with = "deserialize_optional_string"
15192    )]
15193    pub underlying_listing_exchange: Option<String>,
15194
15195    /// `issuer`
15196    #[serde(
15197        rename = "@issuer",
15198        default,
15199        deserialize_with = "deserialize_optional_string"
15200    )]
15201    pub issuer: Option<String>,
15202
15203    /// `issuerCountryCode`
15204    #[serde(
15205        rename = "@issuerCountryCode",
15206        default,
15207        deserialize_with = "deserialize_optional_string"
15208    )]
15209    pub issuer_country_code: Option<String>,
15210
15211    /// `multiplier`
15212    #[serde(
15213        rename = "@multiplier",
15214        default,
15215        deserialize_with = "deserialize_optional_decimal"
15216    )]
15217    pub multiplier: Option<Decimal>,
15218
15219    /// `strike`
15220    #[serde(
15221        rename = "@strike",
15222        default,
15223        deserialize_with = "deserialize_optional_decimal"
15224    )]
15225    pub strike: Option<Decimal>,
15226
15227    /// `expiry`
15228    #[serde(
15229        rename = "@expiry",
15230        default,
15231        deserialize_with = "deserialize_optional_date"
15232    )]
15233    pub expiry: Option<NaiveDate>,
15234
15235    /// `putCall`
15236    #[serde(rename = "@putCall", default)]
15237    pub put_call: Option<PutCall>,
15238
15239    /// `principalAdjustFactor`
15240    #[serde(
15241        rename = "@principalAdjustFactor",
15242        default,
15243        deserialize_with = "deserialize_optional_decimal"
15244    )]
15245    pub principal_adjust_factor: Option<Decimal>,
15246
15247    /// `reportDate`
15248    #[serde(
15249        rename = "@reportDate",
15250        default,
15251        deserialize_with = "deserialize_optional_date"
15252    )]
15253    pub report_date: Option<NaiveDate>,
15254
15255    /// `activityDescription`
15256    #[serde(
15257        rename = "@activityDescription",
15258        default,
15259        deserialize_with = "deserialize_optional_string"
15260    )]
15261    pub activity_description: Option<String>,
15262
15263    /// `awardDate`
15264    #[serde(
15265        rename = "@awardDate",
15266        default,
15267        deserialize_with = "deserialize_optional_date"
15268    )]
15269    pub award_date: Option<NaiveDate>,
15270
15271    /// `vestingDate`
15272    #[serde(
15273        rename = "@vestingDate",
15274        default,
15275        deserialize_with = "deserialize_optional_date"
15276    )]
15277    pub vesting_date: Option<NaiveDate>,
15278
15279    /// `quantity`
15280    #[serde(
15281        rename = "@quantity",
15282        default,
15283        deserialize_with = "deserialize_optional_decimal"
15284    )]
15285    pub quantity: Option<Decimal>,
15286
15287    /// `price`
15288    #[serde(
15289        rename = "@price",
15290        default,
15291        deserialize_with = "deserialize_optional_decimal"
15292    )]
15293    pub price: Option<Decimal>,
15294
15295    /// `value`
15296    #[serde(
15297        rename = "@value",
15298        default,
15299        deserialize_with = "deserialize_optional_decimal"
15300    )]
15301    pub value: Option<Decimal>,
15302
15303    /// `serialNumber`
15304    #[serde(
15305        rename = "@serialNumber",
15306        default,
15307        deserialize_with = "deserialize_optional_string"
15308    )]
15309    pub serial_number: Option<String>,
15310
15311    /// `deliveryType`
15312    #[serde(
15313        rename = "@deliveryType",
15314        default,
15315        deserialize_with = "deserialize_optional_string"
15316    )]
15317    pub delivery_type: Option<String>,
15318
15319    /// `commodityType`
15320    #[serde(
15321        rename = "@commodityType",
15322        default,
15323        deserialize_with = "deserialize_optional_string"
15324    )]
15325    pub commodity_type: Option<String>,
15326
15327    /// `fineness`
15328    #[serde(
15329        rename = "@fineness",
15330        default,
15331        deserialize_with = "deserialize_optional_decimal"
15332    )]
15333    pub fineness: Option<Decimal>,
15334
15335    /// `weight`
15336    #[serde(
15337        rename = "@weight",
15338        default,
15339        deserialize_with = "deserialize_optional_decimal"
15340    )]
15341    pub weight: Option<Decimal>,
15342}