kiteconnect_async_wasm/models/orders/
order_data.rs1use crate::models::common::{Exchange, OrderType, Product, TransactionType, Validity};
2use chrono::{DateTime, Utc};
3use serde::{Deserialize, Serialize};
4
5#[derive(Debug, Clone, Serialize, Deserialize)]
7pub struct Order {
8 pub account_id: String,
10
11 #[serde(rename = "order_id")]
13 pub order_id: String,
14
15 #[serde(rename = "exchange_order_id")]
17 pub exchange_order_id: Option<String>,
18
19 #[serde(rename = "parent_order_id")]
21 pub parent_order_id: Option<String>,
22
23 pub status: OrderStatus,
25
26 #[serde(rename = "status_message")]
28 pub status_message: Option<String>,
29
30 #[serde(rename = "status_message_raw")]
32 pub status_message_raw: Option<String>,
33
34 #[serde(rename = "order_timestamp")]
36 pub order_timestamp: DateTime<Utc>,
37
38 #[serde(rename = "exchange_timestamp")]
40 pub exchange_timestamp: Option<DateTime<Utc>>,
41
42 #[serde(rename = "exchange_update_timestamp")]
44 pub exchange_update_timestamp: Option<DateTime<Utc>>,
45
46 #[serde(rename = "tradingsymbol")]
48 pub trading_symbol: String,
49
50 pub exchange: Exchange,
52
53 #[serde(rename = "instrument_token")]
55 pub instrument_token: u32,
56
57 #[serde(rename = "order_type")]
59 pub order_type: OrderType,
60
61 #[serde(rename = "transaction_type")]
63 pub transaction_type: TransactionType,
64
65 pub validity: Validity,
67
68 pub product: Product,
70
71 pub quantity: u32,
73
74 #[serde(rename = "disclosed_quantity")]
76 pub disclosed_quantity: u32,
77
78 pub price: f64,
80
81 #[serde(rename = "trigger_price")]
83 pub trigger_price: f64,
84
85 #[serde(rename = "average_price")]
87 pub average_price: f64,
88
89 #[serde(rename = "filled_quantity")]
91 pub filled_quantity: u32,
92
93 #[serde(rename = "pending_quantity")]
95 pub pending_quantity: u32,
96
97 #[serde(rename = "cancelled_quantity")]
99 pub cancelled_quantity: u32,
100
101 #[serde(rename = "market_protection")]
103 pub market_protection: f64,
104
105 pub meta: Option<OrderMeta>,
107
108 pub tag: Option<String>,
110
111 pub guid: String,
113}
114
115#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
117#[serde(rename_all = "UPPERCASE")]
118pub enum OrderStatus {
119 Open,
121 Complete,
123 Cancelled,
125 Rejected,
127 Put,
129 Validated,
131 #[serde(rename = "MODIFY VALIDATION PENDING")]
133 ModifyValidationPending,
134 #[serde(rename = "MODIFY PENDING")]
136 ModifyPending,
137 #[serde(rename = "TRIGGER PENDING")]
139 TriggerPending,
140 #[serde(rename = "CANCEL PENDING")]
142 CancelPending,
143 #[serde(rename = "AMO REQ RECEIVED")]
145 AmoReqReceived,
146}
147
148#[derive(Debug, Clone, Serialize, Deserialize)]
150pub struct OrderMeta {
151 pub demat_consent: Option<String>,
153
154 pub iceberg_legs: Option<u32>,
156
157 pub iceberg_quantity: Option<u32>,
159}
160
161#[derive(Debug, Clone, Serialize, Deserialize)]
163pub struct OrderModification {
164 #[serde(rename = "order_id")]
166 pub order_id: String,
167
168 pub quantity: Option<u32>,
170
171 pub price: Option<f64>,
173
174 #[serde(rename = "trigger_price")]
176 pub trigger_price: Option<f64>,
177
178 #[serde(rename = "order_type")]
180 pub order_type: Option<OrderType>,
181
182 pub validity: Option<Validity>,
184
185 #[serde(rename = "disclosed_quantity")]
187 pub disclosed_quantity: Option<u32>,
188}
189
190#[derive(Debug, Clone, Serialize, Deserialize)]
192pub struct OrderCancellation {
193 #[serde(rename = "order_id")]
195 pub order_id: String,
196}
197
198#[derive(Debug, Clone, Serialize, Deserialize)]
200pub struct BracketOrderResponse {
201 pub order_id: String,
203
204 pub child_order_ids: Vec<String>,
206}
207
208#[derive(Debug, Clone, Serialize, Deserialize)]
210pub struct CoverOrderResponse {
211 pub order_id: String,
213}
214
215impl Order {
216 pub fn is_open(&self) -> bool {
218 matches!(
219 self.status,
220 OrderStatus::Open | OrderStatus::Put | OrderStatus::Validated
221 )
222 }
223
224 pub fn is_complete(&self) -> bool {
226 self.status == OrderStatus::Complete
227 }
228
229 pub fn is_cancelled(&self) -> bool {
231 self.status == OrderStatus::Cancelled
232 }
233
234 pub fn is_rejected(&self) -> bool {
236 self.status == OrderStatus::Rejected
237 }
238
239 pub fn remaining_quantity(&self) -> u32 {
241 self.quantity.saturating_sub(self.filled_quantity)
242 }
243
244 pub fn is_partially_filled(&self) -> bool {
246 self.filled_quantity > 0 && self.filled_quantity < self.quantity
247 }
248
249 pub fn fill_percentage(&self) -> f64 {
251 if self.quantity == 0 {
252 0.0
253 } else {
254 (self.filled_quantity as f64 / self.quantity as f64) * 100.0
255 }
256 }
257}
258
259impl OrderStatus {
260 pub fn is_active(&self) -> bool {
262 matches!(
263 self,
264 OrderStatus::Open
265 | OrderStatus::Put
266 | OrderStatus::Validated
267 | OrderStatus::ModifyValidationPending
268 | OrderStatus::ModifyPending
269 | OrderStatus::TriggerPending
270 | OrderStatus::CancelPending
271 | OrderStatus::AmoReqReceived
272 )
273 }
274
275 pub fn is_final(&self) -> bool {
277 matches!(
278 self,
279 OrderStatus::Complete | OrderStatus::Cancelled | OrderStatus::Rejected
280 )
281 }
282}