use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use crate::{
KiteConnect,
constants::Endpoints,
models::{KiteConnectError, time},
};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MFHolding {
pub folio: String,
pub fund: String,
pub tradingsymbol: String,
pub average_price: f64,
pub last_price: f64,
pub last_price_date: String,
pub pnl: f64,
pub quantity: f64,
pub pledged_quantity: Option<f64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MFTrade {
pub fund: String,
pub tradingsymbol: String,
pub average_price: f64,
pub variety: String,
#[serde(default)]
pub exchange_timestamp: time::Time,
pub amount: f64,
pub folio: String,
pub quantity: f64,
}
pub type MFHoldingBreakdown = Vec<MFTrade>;
pub type MFHoldings = Vec<MFHolding>;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MFOrder {
pub order_id: String,
pub exchange_order_id: Option<String>,
pub tradingsymbol: String,
pub status: String,
pub status_message: Option<String>,
pub folio: Option<String>,
pub fund: String,
#[serde(default)]
pub order_timestamp: time::Time,
#[serde(default)]
pub exchange_timestamp: Option<time::Time>,
pub settlement_id: Option<String>,
pub transaction_type: String,
pub variety: String,
pub purchase_type: Option<String>,
pub quantity: f64,
pub amount: f64,
pub last_price: f64,
pub last_price_date: Option<String>,
pub average_price: f64,
pub placed_by: String,
pub tag: Option<String>,
}
pub type MFOrders = Vec<MFOrder>;
pub type MFAllottedISINs = Vec<String>;
pub type MFSIPStepUp = HashMap<String, i32>;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MFSIP {
pub sip_id: String,
pub tradingsymbol: String,
pub fund: String,
pub dividend_type: String,
pub transaction_type: String,
pub status: String,
pub sip_type: String,
#[serde(default)]
pub created: time::Time,
pub frequency: String,
pub instalment_amount: f64,
pub instalments: i32,
#[serde(default)]
pub last_instalment: time::Time,
pub pending_instalments: i32,
pub instalment_day: i32,
pub completed_instalments: i32,
pub next_instalment: String,
pub trigger_price: f64,
pub step_up: MFSIPStepUp,
pub tag: Option<String>,
pub sip_reg_num: Option<String>,
}
pub type MFSIPs = Vec<MFSIP>;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MFOrderResponse {
pub order_id: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MFSIPResponse {
pub order_id: Option<String>,
pub sip_id: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MFOrderParams {
pub tradingsymbol: Option<String>,
pub transaction_type: Option<String>,
pub quantity: Option<f64>,
pub amount: Option<f64>,
pub tag: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MFSIPParams {
pub tradingsymbol: Option<String>,
pub amount: Option<f64>,
pub instalments: Option<i32>,
pub frequency: Option<String>,
pub instalment_day: Option<i32>,
pub initial_amount: Option<f64>,
pub trigger_price: Option<f64>,
pub step_up: Option<String>,
pub sip_type: Option<String>,
pub tag: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MFSIPModifyParams {
pub amount: Option<f64>,
pub frequency: Option<String>,
pub instalment_day: Option<i32>,
pub instalments: Option<i32>,
pub step_up: Option<String>,
pub status: Option<String>,
}
impl KiteConnect {
pub async fn get_mf_orders(&self) -> Result<MFOrders, KiteConnectError> {
self.get(Endpoints::GET_MF_ORDERS).await
}
pub async fn get_mf_orders_by_date(
&self,
from_date: &str,
to_date: &str,
) -> Result<MFOrders, KiteConnectError> {
let mut params = HashMap::new();
params.insert("from".to_string(), from_date.to_string());
params.insert("to".to_string(), to_date.to_string());
self.get_with_query(Endpoints::GET_MF_ORDERS, params).await
}
pub async fn get_mf_order_info(&self, order_id: &str) -> Result<MFOrder, KiteConnectError> {
let endpoint = &Endpoints::GET_MF_ORDER_INFO.replace("{order_id}", order_id);
self.get(endpoint).await
}
pub async fn get_mf_holdings(&self) -> Result<MFHoldings, KiteConnectError> {
self.get(Endpoints::GET_MF_HOLDINGS).await
}
pub async fn get_mf_sips(&self) -> Result<MFSIPs, KiteConnectError> {
self.get(Endpoints::GET_MF_SIPS).await
}
pub async fn get_mf_sip_info(&self, sip_id: &str) -> Result<MFSIP, KiteConnectError> {
let endpoint = &Endpoints::GET_MF_SIP_INFO.replace("{sip_id}", sip_id);
self.get(endpoint).await
}
pub async fn get_mf_allotted_isins(&self) -> Result<MFAllottedISINs, KiteConnectError> {
self.get(Endpoints::GET_MF_ALLOTTED_ISINS).await
}
}