qvopenapi/models/query/
c8201.rs

1use std::ffi::c_char;
2use std::mem::size_of;
3use std::sync::Arc;
4
5use serde::{Deserialize, Serialize};
6use serde_json::{json, Value};
7
8use crate::utils::{parse_number, parse_ratio, parse_ratio_str, parse_string};
9use crate::{error::*, models::*};
10use qvopenapi_bindings::{Tc8201InBlock, Tc8201OutBlock, Tc8201OutBlock1};
11
12pub const TR_CODE_C8201: &str = "c8201";
13
14#[derive(Debug, Clone, Deserialize)]
15pub struct C8201Request {
16    pub account_index: i32,
17    pub balance_type: char,
18}
19
20impl C8201Request {
21    pub fn new(account_index: i32, balance_type: char) -> C8201Request {
22        C8201Request {
23            account_index,
24            balance_type,
25        }
26    }
27
28    pub fn into_raw(&self) -> Arc<RawQueryRequest<Tc8201InBlock>> {
29        Arc::new(RawQueryRequest::new(
30            TR_CODE_C8201,
31            self.account_index,
32            Box::new(Tc8201InBlock {
33                pswd_noz44: [' ' as c_char; 44],
34                _pswd_noz44: ' ' as c_char,
35                bnc_bse_cdz1: [self.balance_type as c_char],
36                _bnc_bse_cdz1: ' ' as c_char,
37            }),
38        ))
39    }
40}
41
42pub fn parse_c8201_response(
43    block_data: *const c_char,
44    _block_len: i32,
45) -> Result<Value, QvOpenApiError> {
46    unsafe {
47        let res = &(*(block_data as *const Tc8201OutBlock));
48        Ok(json!(C8201Response {
49            dpsit_amtz16: parse_number(&res.dpsit_amtz16)?,
50            mrgn_amtz16: parse_number(&res.dpsit_amtz16)?,
51            mgint_npaid_amtz16: parse_number(&res.mgint_npaid_amtz16)?,
52            chgm_pos_amtz16: parse_number(&res.chgm_pos_amtz16)?,
53            cash_mrgn_amtz16: parse_number(&res.cash_mrgn_amtz16)?,
54            subst_mgamt_amtz16: parse_number(&res.subst_mgamt_amtz16)?,
55            coltr_ratez6: parse_string(&res.coltr_ratez6)?,
56            rcble_amtz16: parse_number(&res.rcble_amtz16)?,
57            order_pos_csamtz16: parse_number(&res.order_pos_csamtz16)?,
58            ecn_pos_csamtz16: parse_number(&res.ecn_pos_csamtz16)?,
59            nordm_loan_amtz16: parse_number(&res.nordm_loan_amtz16)?,
60            etc_lend_amtz16: parse_number(&res.etc_lend_amtz16)?,
61            subst_amtz16: parse_number(&res.subst_amtz16)?,
62            sln_sale_amtz16: parse_number(&res.sln_sale_amtz16)?,
63            bal_buy_ttamtz16: parse_number(&res.bal_buy_ttamtz16)?,
64            bal_ass_ttamtz16: parse_number(&res.bal_ass_ttamtz16)?,
65            asset_tot_amtz16: parse_number(&res.asset_tot_amtz16)?,
66            actvt_type10: parse_string(&res.actvt_type10)?,
67            lend_amtz16: parse_number(&res.lend_amtz16)?,
68            accnt_mgamt_ratez6: parse_string(&res.accnt_mgamt_ratez6)?,
69            sl_mrgn_amtz16: parse_number(&res.sl_mrgn_amtz16)?,
70            pos_csamt1z16: parse_number(&res.pos_csamt1z16)?,
71            pos_csamt2z16: parse_number(&res.pos_csamt2z16)?,
72            pos_csamt3z16: parse_number(&res.pos_csamt3z16)?,
73            pos_csamt4z16: parse_number(&res.pos_csamt4z16)?,
74            dpsit_amtz_d1_16: parse_number(&res.dpsit_amtz_d1_16)?,
75            dpsit_amtz_d2_16: parse_number(&res.dpsit_amtz_d2_16)?,
76            noticez30: parse_string(&res.noticez30)?,
77            tot_eal_plsz18: parse_string(&res.tot_eal_plsz18)?,
78            pft_rtz15: parse_ratio(&res.pft_rtz15)?,
79        }))
80    }
81}
82
83pub fn parse_c8201_response1_array(
84    block_data: *const c_char,
85    block_len: i32,
86) -> Result<Value, QvOpenApiError> {
87    unsafe {
88        let block_count = block_len as usize / size_of::<Tc8201OutBlock1>();
89        let res: &[Tc8201OutBlock1] =
90            core::slice::from_raw_parts(block_data as *const Tc8201OutBlock1, block_count);
91
92        let ret: Result<Vec<C8201Response1>, QvOpenApiError> =
93            res.iter().map(parse_c8201_response1).collect();
94        Ok(json!(ret?))
95    }
96}
97
98fn parse_c8201_response1(res: &Tc8201OutBlock1) -> Result<C8201Response1, QvOpenApiError> {
99    Ok(C8201Response1 {
100        issue_codez6: parse_string(&res.issue_codez6)?,
101        issue_namez40: parse_string(&res.issue_namez40)?,
102        bal_typez6: parse_string(&res.bal_typez6)?,
103        loan_datez10: parse_string(&res.loan_datez10)?,
104        bal_qtyz16: parse_number(&res.bal_qtyz16)?,
105        unstl_qtyz16: parse_number(&res.unstl_qtyz16)?,
106        slby_amtz16: parse_number(&res.slby_amtz16)?,
107        prsnt_pricez16: parse_number(&res.prsnt_pricez16)?,
108        lsnpf_amtz16: parse_number(&res.lsnpf_amtz16)?,
109        earn_ratez9: parse_ratio(&res.earn_ratez9)?,
110        mrgn_codez4: parse_string(&res.mrgn_codez4)?,
111        jan_qtyz16: parse_number(&res.jan_qtyz16)?,
112        expr_datez10: parse_string(&res.expr_datez10)?,
113        ass_amtz16: parse_number(&res.ass_amtz16)?,
114        issue_mgamt_ratez6: parse_ratio_str(&res.issue_mgamt_ratez6)?,
115        medo_slby_amtz16: parse_number(&res.medo_slby_amtz16)?,
116        post_lsnpf_amtz16: parse_number(&res.post_lsnpf_amtz16)?,
117    })
118}
119
120#[derive(Debug, Clone, Serialize)]
121struct C8201Response {
122    pub dpsit_amtz16: Option<i64>,       //예수금
123    pub mrgn_amtz16: Option<i64>,        //신용융자금
124    pub mgint_npaid_amtz16: Option<i64>, //이자미납금
125    pub chgm_pos_amtz16: Option<i64>,    //출금가능금액
126    pub cash_mrgn_amtz16: Option<i64>,   //현금증거금
127    pub subst_mgamt_amtz16: Option<i64>, //대용증거금
128    pub coltr_ratez6: String,            //담보비율
129    pub rcble_amtz16: Option<i64>,       //현금미수금
130    pub order_pos_csamtz16: Option<i64>, //주문가능액
131    pub ecn_pos_csamtz16: Option<i64>,   //ECN주문가능액
132    pub nordm_loan_amtz16: Option<i64>,  //미상환금
133    pub etc_lend_amtz16: Option<i64>,    //기타대여금
134    pub subst_amtz16: Option<i64>,       //대용금액
135    pub sln_sale_amtz16: Option<i64>,    //대주담보금
136    pub bal_buy_ttamtz16: Option<i64>,   //매입원가(계좌합산)
137    pub bal_ass_ttamtz16: Option<i64>,   //평가금액(계좌합산)
138    pub asset_tot_amtz16: Option<i64>,   //순자산액(계좌합산)
139    pub actvt_type10: String,            //활동유형
140    pub lend_amtz16: Option<i64>,        //대출금
141    pub accnt_mgamt_ratez6: String,      //계좌증거금율
142    pub sl_mrgn_amtz16: Option<i64>,     //매도증거금
143    pub pos_csamt1z16: Option<i64>,      //20%주문가능금액
144    pub pos_csamt2z16: Option<i64>,      //30%주문가능금액
145    pub pos_csamt3z16: Option<i64>,      //40%주문가능금액
146    pub pos_csamt4z16: Option<i64>,      //100%주문가능금액
147    pub dpsit_amtz_d1_16: Option<i64>,   //D1예수금
148    pub dpsit_amtz_d2_16: Option<i64>,   //D2예수금
149    pub noticez30: String,               //공지사항             /*To-be에없음*/
150    pub tot_eal_plsz18: String,          //총평가손익
151    pub pft_rtz15: Option<f64>,          //수익율
152}
153
154#[derive(Debug, Clone, Serialize)]
155struct C8201Response1 {
156    pub issue_codez6: String,            //종목번호
157    pub issue_namez40: String,           //종목명
158    pub bal_typez6: String,              //잔고유형
159    pub loan_datez10: String,            //대출일
160    pub bal_qtyz16: Option<i64>,         //잔고수량
161    pub unstl_qtyz16: Option<i64>,       //미결제량
162    pub slby_amtz16: Option<i64>,        //평균매입가
163    pub prsnt_pricez16: Option<i64>,     //현재가
164    pub lsnpf_amtz16: Option<i64>,       //손익(천원)
165    pub earn_ratez9: Option<f64>,        //손익율
166    pub mrgn_codez4: String,             //신용유형
167    pub jan_qtyz16: Option<i64>,         //잔량
168    pub expr_datez10: String,            //만기일
169    pub ass_amtz16: Option<i64>,         //평가금액
170    pub issue_mgamt_ratez6: Option<f64>, //종목증거금율         /*float->char*/
171    pub medo_slby_amtz16: Option<i64>,   //평균매도가
172    pub post_lsnpf_amtz16: Option<i64>,  //매도손익
173}
174
175pub const BLOCK_NAME_C8201_OUT: &str = "c8201OutBlock";
176pub const BLOCK_NAME_C8201_OUT1_ARRAY: &str = "c8201OutBlock1";