1use chrono::NaiveDate;
8use rust_decimal::Decimal;
9use serde::{Deserialize, Serialize};
10
11use super::common::{AssetCategory, OptionAction, TransferType};
12use crate::parsers::xml_utils::{
13 deserialize_flex_date, deserialize_optional_date, deserialize_optional_decimal,
14};
15
16#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
18pub struct AccountInformation {
19 #[serde(rename = "@accountId")]
21 pub account_id: String,
22
23 #[serde(rename = "@accountType", default)]
25 pub account_type: Option<String>,
26
27 #[serde(rename = "@acctAlias", default)]
29 pub acct_alias: Option<String>,
30
31 #[serde(rename = "@currency", default)]
33 pub currency: Option<String>,
34
35 #[serde(rename = "@name", default)]
37 pub name: Option<String>,
38
39 #[serde(rename = "@masterName", default)]
41 pub master_name: Option<String>,
42}
43
44#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
46pub struct ChangeInNAV {
47 #[serde(rename = "@accountId")]
49 pub account_id: String,
50
51 #[serde(rename = "@fromDate", deserialize_with = "deserialize_flex_date")]
53 pub from_date: NaiveDate,
54
55 #[serde(rename = "@toDate", deserialize_with = "deserialize_flex_date")]
57 pub to_date: NaiveDate,
58
59 #[serde(rename = "@startingValue")]
61 pub starting_value: Decimal,
62
63 #[serde(
65 rename = "@transfers",
66 default,
67 deserialize_with = "deserialize_optional_decimal"
68 )]
69 pub transfers: Option<Decimal>,
70
71 #[serde(
73 rename = "@mtmPlusRealizedPnl",
74 default,
75 deserialize_with = "deserialize_optional_decimal"
76 )]
77 pub mtm_plus_realized_pnl: Option<Decimal>,
78
79 #[serde(
81 rename = "@realizedPnl",
82 default,
83 deserialize_with = "deserialize_optional_decimal"
84 )]
85 pub realized_pnl: Option<Decimal>,
86
87 #[serde(
89 rename = "@unrealizedPnl",
90 default,
91 deserialize_with = "deserialize_optional_decimal"
92 )]
93 pub unrealized_pnl: Option<Decimal>,
94
95 #[serde(rename = "@endingValue")]
97 pub ending_value: Decimal,
98}
99
100#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
102pub struct EquitySummaryByReportDateInBase {
103 #[serde(rename = "@accountId")]
105 pub account_id: String,
106
107 #[serde(rename = "@reportDate", deserialize_with = "deserialize_flex_date")]
109 pub report_date: NaiveDate,
110
111 #[serde(
113 rename = "@cash",
114 default,
115 deserialize_with = "deserialize_optional_decimal"
116 )]
117 pub cash: Option<Decimal>,
118
119 #[serde(
121 rename = "@stock",
122 default,
123 deserialize_with = "deserialize_optional_decimal"
124 )]
125 pub stock: Option<Decimal>,
126
127 #[serde(
129 rename = "@options",
130 default,
131 deserialize_with = "deserialize_optional_decimal"
132 )]
133 pub options: Option<Decimal>,
134
135 #[serde(
137 rename = "@bonds",
138 default,
139 deserialize_with = "deserialize_optional_decimal"
140 )]
141 pub bonds: Option<Decimal>,
142
143 #[serde(rename = "@total")]
145 pub total: Decimal,
146}
147
148#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
150pub struct CashReportCurrency {
151 #[serde(rename = "@accountId")]
153 pub account_id: String,
154
155 #[serde(rename = "@currency")]
157 pub currency: String,
158
159 #[serde(rename = "@fromDate", deserialize_with = "deserialize_flex_date")]
161 pub from_date: NaiveDate,
162
163 #[serde(rename = "@toDate", deserialize_with = "deserialize_flex_date")]
165 pub to_date: NaiveDate,
166
167 #[serde(rename = "@startingCash")]
169 pub starting_cash: Decimal,
170
171 #[serde(
173 rename = "@commissions",
174 default,
175 deserialize_with = "deserialize_optional_decimal"
176 )]
177 pub commissions: Option<Decimal>,
178
179 #[serde(
181 rename = "@deposits",
182 default,
183 deserialize_with = "deserialize_optional_decimal"
184 )]
185 pub deposits: Option<Decimal>,
186
187 #[serde(
189 rename = "@withdrawals",
190 default,
191 deserialize_with = "deserialize_optional_decimal"
192 )]
193 pub withdrawals: Option<Decimal>,
194
195 #[serde(
197 rename = "@dividends",
198 default,
199 deserialize_with = "deserialize_optional_decimal"
200 )]
201 pub dividends: Option<Decimal>,
202
203 #[serde(rename = "@endingCash")]
205 pub ending_cash: Decimal,
206}
207
208#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
210pub struct TradeConfirm {
211 #[serde(rename = "@accountId")]
213 pub account_id: String,
214
215 #[serde(rename = "@execID")]
217 pub exec_id: String,
218
219 #[serde(rename = "@orderID", default)]
221 pub order_id: Option<String>,
222
223 #[serde(rename = "@tradeDate", deserialize_with = "deserialize_flex_date")]
225 pub trade_date: NaiveDate,
226
227 #[serde(rename = "@tradeTime", default)]
229 pub trade_time: Option<String>,
230
231 #[serde(rename = "@symbol")]
233 pub symbol: String,
234
235 #[serde(rename = "@assetCategory")]
237 pub asset_category: AssetCategory,
238
239 #[serde(rename = "@quantity")]
241 pub quantity: Decimal,
242
243 #[serde(rename = "@price")]
245 pub price: Decimal,
246}
247
248#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
250pub struct OptionEAE {
251 #[serde(rename = "@accountId")]
253 pub account_id: String,
254
255 #[serde(rename = "@transactionID", default)]
257 pub transaction_id: Option<String>,
258
259 #[serde(rename = "@type")]
261 pub action_type: OptionAction,
262
263 #[serde(rename = "@date", deserialize_with = "deserialize_flex_date")]
265 pub date: NaiveDate,
266
267 #[serde(rename = "@symbol")]
269 pub symbol: String,
270
271 #[serde(rename = "@quantity")]
273 pub quantity: Decimal,
274
275 #[serde(
277 rename = "@strike",
278 default,
279 deserialize_with = "deserialize_optional_decimal"
280 )]
281 pub strike: Option<Decimal>,
282
283 #[serde(rename = "@underlyingSymbol", default)]
285 pub underlying_symbol: Option<String>,
286}
287
288#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
290pub struct FxTransaction {
291 #[serde(rename = "@accountId")]
293 pub account_id: String,
294
295 #[serde(rename = "@transactionID", default)]
297 pub transaction_id: Option<String>,
298
299 #[serde(rename = "@dateTime", default)]
301 pub date_time: Option<String>,
302
303 #[serde(rename = "@fromCurrency")]
305 pub from_currency: String,
306
307 #[serde(rename = "@toCurrency")]
309 pub to_currency: String,
310
311 #[serde(rename = "@quantity")]
313 pub quantity: Decimal,
314
315 #[serde(rename = "@proceeds")]
317 pub proceeds: Decimal,
318
319 #[serde(
321 rename = "@fxRateToBase",
322 default,
323 deserialize_with = "deserialize_optional_decimal"
324 )]
325 pub fx_rate_to_base: Option<Decimal>,
326}
327
328#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
330pub struct ChangeInDividendAccrual {
331 #[serde(rename = "@accountId")]
333 pub account_id: String,
334
335 #[serde(rename = "@symbol")]
337 pub symbol: String,
338
339 #[serde(rename = "@exDate", deserialize_with = "deserialize_flex_date")]
341 pub ex_date: NaiveDate,
342
343 #[serde(
345 rename = "@payDate",
346 default,
347 deserialize_with = "deserialize_optional_date"
348 )]
349 pub pay_date: Option<NaiveDate>,
350
351 #[serde(rename = "@grossRate")]
353 pub gross_rate: Decimal,
354
355 #[serde(rename = "@netAmount")]
357 pub net_amount: Decimal,
358}
359
360#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
362pub struct OpenDividendAccrual {
363 #[serde(rename = "@accountId")]
365 pub account_id: String,
366
367 #[serde(rename = "@symbol")]
369 pub symbol: String,
370
371 #[serde(rename = "@exDate", deserialize_with = "deserialize_flex_date")]
373 pub ex_date: NaiveDate,
374
375 #[serde(
377 rename = "@payDate",
378 default,
379 deserialize_with = "deserialize_optional_date"
380 )]
381 pub pay_date: Option<NaiveDate>,
382
383 #[serde(rename = "@quantity")]
385 pub quantity: Decimal,
386
387 #[serde(rename = "@grossRate")]
389 pub gross_rate: Decimal,
390}
391
392#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
394pub struct InterestAccrualsCurrency {
395 #[serde(rename = "@accountId")]
397 pub account_id: String,
398
399 #[serde(rename = "@currency")]
401 pub currency: String,
402
403 #[serde(rename = "@fromDate", deserialize_with = "deserialize_flex_date")]
405 pub from_date: NaiveDate,
406
407 #[serde(rename = "@toDate", deserialize_with = "deserialize_flex_date")]
409 pub to_date: NaiveDate,
410
411 #[serde(rename = "@startingAccrualBalance")]
413 pub starting_balance: Decimal,
414
415 #[serde(rename = "@interestAccrued")]
417 pub interest_accrued: Decimal,
418
419 #[serde(rename = "@endingAccrualBalance")]
421 pub ending_balance: Decimal,
422}
423
424#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
426pub struct Transfer {
427 #[serde(rename = "@accountId")]
429 pub account_id: String,
430
431 #[serde(rename = "@type")]
433 pub transfer_type: TransferType,
434
435 #[serde(rename = "@symbol")]
437 pub symbol: String,
438
439 #[serde(rename = "@quantity")]
441 pub quantity: Decimal,
442
443 #[serde(rename = "@direction", default)]
445 pub direction: Option<String>,
446
447 #[serde(rename = "@date", deserialize_with = "deserialize_flex_date")]
449 pub date: NaiveDate,
450}