#![allow(missing_docs)]
use rust_decimal::Decimal;
use serde::{Deserialize, Serialize};
use crate::{types::Market, utils::counter::deserialize_counter_id_as_symbol};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DcaList {
pub plans: Vec<DcaPlan>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DcaPlan {
pub plan_id: String,
#[serde(default)]
pub status: DCAStatus,
#[serde(
rename = "counter_id",
deserialize_with = "deserialize_counter_id_as_symbol"
)]
pub symbol: String,
#[serde(default)]
pub member_id: String,
#[serde(default)]
pub aaid: String,
#[serde(default)]
pub account_channel: String,
#[serde(default)]
pub display_account: String,
#[serde(default)]
pub market: Market,
#[serde(default, with = "crate::serde_utils::decimal_empty_is_0")]
pub per_invest_amount: Decimal,
#[serde(default)]
pub invest_frequency: DCAFrequency,
#[serde(default)]
pub invest_day_of_week: String,
#[serde(default)]
pub invest_day_of_month: String,
#[serde(default)]
pub allow_margin_finance: bool,
#[serde(
default,
deserialize_with = "crate::serde_utils::deserialize_string_or_int_as_string"
)]
pub alter_hours: String,
#[serde(default)]
pub created_at: String,
#[serde(default)]
pub updated_at: String,
#[serde(default)]
pub next_trd_date: String,
#[serde(default)]
pub stock_name: String,
#[serde(default, with = "crate::serde_utils::decimal_opt_str_is_none")]
pub cum_amount: Option<Decimal>,
#[serde(default)]
pub issue_number: i64,
#[serde(default, with = "crate::serde_utils::decimal_opt_str_is_none")]
pub average_cost: Option<Decimal>,
#[serde(default, with = "crate::serde_utils::decimal_opt_str_is_none")]
pub cum_profit: Option<Decimal>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct DcaStats {
#[serde(default)]
pub active_count: String,
#[serde(default)]
pub finished_count: String,
#[serde(default)]
pub suspended_count: String,
#[serde(default)]
pub nearest_plans: Vec<DcaPlan>,
#[serde(default)]
pub rest_days: String,
#[serde(default, with = "crate::serde_utils::decimal_opt_str_is_none")]
pub total_amount: Option<Decimal>,
#[serde(default, with = "crate::serde_utils::decimal_opt_str_is_none")]
pub total_profit: Option<Decimal>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DcaSupportList {
pub infos: Vec<DcaSupportInfo>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DcaSupportInfo {
#[serde(
rename = "counter_id",
deserialize_with = "deserialize_counter_id_as_symbol"
)]
pub symbol: String,
pub support_regular_saving: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DcaHistoryResponse {
pub records: Vec<DcaHistoryRecord>,
#[serde(default)]
pub has_more: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DcaHistoryRecord {
pub created_at: String,
pub order_id: String,
pub status: String,
pub action: String,
pub order_type: String,
#[serde(default, with = "crate::serde_utils::decimal_opt_str_is_none")]
pub executed_qty: Option<Decimal>,
#[serde(default, with = "crate::serde_utils::decimal_opt_str_is_none")]
pub executed_price: Option<Decimal>,
#[serde(default, with = "crate::serde_utils::decimal_opt_str_is_none")]
pub executed_amount: Option<Decimal>,
pub rejected_reason: String,
#[serde(
rename = "counter_id",
deserialize_with = "deserialize_counter_id_as_symbol"
)]
pub symbol: String,
}
#[derive(Debug, Copy, Clone, Eq, PartialEq, Serialize, Deserialize, Default)]
pub enum DCAFrequency {
#[serde(rename = "Daily")]
Daily,
#[serde(rename = "Weekly")]
Weekly,
#[serde(rename = "Fortnightly")]
Fortnightly,
#[default]
#[serde(rename = "Monthly")]
Monthly,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DcaCreateResult {
pub plan_id: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DcaCalcDateResult {
pub trade_date: String,
}
#[derive(Debug, Copy, Clone, Eq, PartialEq, Serialize, Deserialize, Default)]
pub enum DCAStatus {
#[default]
#[serde(rename = "Active")]
Active,
#[serde(rename = "Suspended")]
Suspended,
#[serde(rename = "Finished")]
Finished,
}