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