1#![allow(missing_docs)]
2
3use rust_decimal::Decimal;
4use serde::{Deserialize, Serialize};
5
6use crate::{types::Market, utils::counter::deserialize_counter_id_as_symbol};
7
8#[derive(Debug, Clone, Serialize, Deserialize)]
10pub struct DcaList {
11 pub plans: Vec<DcaPlan>,
13}
14
15#[derive(Debug, Clone, Serialize, Deserialize)]
17pub struct DcaPlan {
18 pub plan_id: String,
20 #[serde(default)]
22 pub status: DCAStatus,
23 #[serde(
25 rename = "counter_id",
26 deserialize_with = "deserialize_counter_id_as_symbol"
27 )]
28 pub symbol: String,
29 #[serde(default)]
31 pub member_id: String,
32 #[serde(default)]
34 pub aaid: String,
35 #[serde(default)]
37 pub account_channel: String,
38 #[serde(default)]
40 pub display_account: String,
41 #[serde(default)]
43 pub market: Market,
44 #[serde(default, with = "crate::serde_utils::decimal_empty_is_0")]
46 pub per_invest_amount: Decimal,
47 #[serde(default)]
49 pub invest_frequency: DCAFrequency,
50 #[serde(default)]
52 pub invest_day_of_week: String,
53 #[serde(default)]
55 pub invest_day_of_month: String,
56 #[serde(default)]
58 pub allow_margin_finance: bool,
59 #[serde(
62 default,
63 deserialize_with = "crate::serde_utils::deserialize_string_or_int_as_string"
64 )]
65 pub alter_hours: String,
66 #[serde(default)]
68 pub created_at: String,
69 #[serde(default)]
71 pub updated_at: String,
72 #[serde(default)]
74 pub next_trd_date: String,
75 #[serde(default)]
77 pub stock_name: String,
78 #[serde(default, with = "crate::serde_utils::decimal_opt_str_is_none")]
80 pub cum_amount: Option<Decimal>,
81 #[serde(default)]
83 pub issue_number: i64,
84 #[serde(default, with = "crate::serde_utils::decimal_opt_str_is_none")]
86 pub average_cost: Option<Decimal>,
87 #[serde(default, with = "crate::serde_utils::decimal_opt_str_is_none")]
89 pub cum_profit: Option<Decimal>,
90}
91
92#[derive(Debug, Clone, Default, Serialize, Deserialize)]
94pub struct DcaStats {
95 #[serde(default)]
97 pub active_count: String,
98 #[serde(default)]
100 pub finished_count: String,
101 #[serde(default)]
103 pub suspended_count: String,
104 #[serde(default)]
106 pub nearest_plans: Vec<DcaPlan>,
107 #[serde(default)]
109 pub rest_days: String,
110 #[serde(default, with = "crate::serde_utils::decimal_opt_str_is_none")]
112 pub total_amount: Option<Decimal>,
113 #[serde(default, with = "crate::serde_utils::decimal_opt_str_is_none")]
115 pub total_profit: Option<Decimal>,
116}
117
118#[derive(Debug, Clone, Serialize, Deserialize)]
120pub struct DcaSupportList {
121 pub infos: Vec<DcaSupportInfo>,
123}
124
125#[derive(Debug, Clone, Serialize, Deserialize)]
127pub struct DcaSupportInfo {
128 #[serde(
130 rename = "counter_id",
131 deserialize_with = "deserialize_counter_id_as_symbol"
132 )]
133 pub symbol: String,
134 pub support_regular_saving: bool,
136}
137
138#[derive(Debug, Clone, Serialize, Deserialize)]
140pub struct DcaHistoryResponse {
141 pub records: Vec<DcaHistoryRecord>,
143 #[serde(default)]
145 pub has_more: bool,
146}
147
148#[derive(Debug, Clone, Serialize, Deserialize)]
150pub struct DcaHistoryRecord {
151 pub created_at: String,
153 pub order_id: String,
155 pub status: String,
157 pub action: String,
159 pub order_type: String,
161 #[serde(default, with = "crate::serde_utils::decimal_opt_str_is_none")]
163 pub executed_qty: Option<Decimal>,
164 #[serde(default, with = "crate::serde_utils::decimal_opt_str_is_none")]
166 pub executed_price: Option<Decimal>,
167 #[serde(default, with = "crate::serde_utils::decimal_opt_str_is_none")]
169 pub executed_amount: Option<Decimal>,
170 pub rejected_reason: String,
172 #[serde(
174 rename = "counter_id",
175 deserialize_with = "deserialize_counter_id_as_symbol"
176 )]
177 pub symbol: String,
178}
179
180#[derive(Debug, Copy, Clone, Eq, PartialEq, Serialize, Deserialize, Default)]
182pub enum DCAFrequency {
183 #[serde(rename = "Daily")]
185 Daily,
186 #[serde(rename = "Weekly")]
188 Weekly,
189 #[serde(rename = "Fortnightly")]
191 Fortnightly,
192 #[default]
194 #[serde(rename = "Monthly")]
195 Monthly,
196}
197
198#[derive(Debug, Clone, Serialize, Deserialize)]
200pub struct DcaCreateResult {
201 pub plan_id: String,
203}
204
205#[derive(Debug, Clone, Serialize, Deserialize)]
207pub struct DcaCalcDateResult {
208 pub trade_date: String,
210}
211
212#[derive(Debug, Copy, Clone, Eq, PartialEq, Serialize, Deserialize, Default)]
214pub enum DCAStatus {
215 #[default]
217 #[serde(rename = "Active")]
218 Active,
219 #[serde(rename = "Suspended")]
221 Suspended,
222 #[serde(rename = "Finished")]
224 Finished,
225}