Skip to main content

qpay/
models.rs

1use serde::{Deserialize, Serialize};
2
3// --- Auth ---
4
5#[derive(Debug, Clone, Serialize, Deserialize)]
6pub struct TokenResponse {
7    pub token_type: String,
8    pub refresh_expires_in: i64,
9    pub refresh_token: String,
10    pub access_token: String,
11    pub expires_in: i64,
12    pub scope: String,
13    #[serde(rename = "not-before-policy")]
14    pub not_before_policy: String,
15    pub session_state: String,
16}
17
18// --- Common nested types ---
19
20#[derive(Debug, Clone, Serialize, Deserialize, Default)]
21pub struct Address {
22    #[serde(skip_serializing_if = "Option::is_none")]
23    pub city: Option<String>,
24    #[serde(skip_serializing_if = "Option::is_none")]
25    pub district: Option<String>,
26    #[serde(skip_serializing_if = "Option::is_none")]
27    pub street: Option<String>,
28    #[serde(skip_serializing_if = "Option::is_none")]
29    pub building: Option<String>,
30    #[serde(skip_serializing_if = "Option::is_none")]
31    pub address: Option<String>,
32    #[serde(skip_serializing_if = "Option::is_none")]
33    pub zipcode: Option<String>,
34    #[serde(skip_serializing_if = "Option::is_none")]
35    pub longitude: Option<String>,
36    #[serde(skip_serializing_if = "Option::is_none")]
37    pub latitude: Option<String>,
38}
39
40#[derive(Debug, Clone, Serialize, Deserialize, Default)]
41pub struct SenderBranchData {
42    #[serde(skip_serializing_if = "Option::is_none")]
43    pub register: Option<String>,
44    #[serde(skip_serializing_if = "Option::is_none")]
45    pub name: Option<String>,
46    #[serde(skip_serializing_if = "Option::is_none")]
47    pub email: Option<String>,
48    #[serde(skip_serializing_if = "Option::is_none")]
49    pub phone: Option<String>,
50    #[serde(skip_serializing_if = "Option::is_none")]
51    pub address: Option<Address>,
52}
53
54#[derive(Debug, Clone, Serialize, Deserialize, Default)]
55pub struct SenderStaffData {
56    #[serde(skip_serializing_if = "Option::is_none")]
57    pub name: Option<String>,
58    #[serde(skip_serializing_if = "Option::is_none")]
59    pub email: Option<String>,
60    #[serde(skip_serializing_if = "Option::is_none")]
61    pub phone: Option<String>,
62}
63
64#[derive(Debug, Clone, Serialize, Deserialize, Default)]
65pub struct InvoiceReceiverData {
66    #[serde(skip_serializing_if = "Option::is_none")]
67    pub register: Option<String>,
68    #[serde(skip_serializing_if = "Option::is_none")]
69    pub name: Option<String>,
70    #[serde(skip_serializing_if = "Option::is_none")]
71    pub email: Option<String>,
72    #[serde(skip_serializing_if = "Option::is_none")]
73    pub phone: Option<String>,
74    #[serde(skip_serializing_if = "Option::is_none")]
75    pub address: Option<Address>,
76}
77
78#[derive(Debug, Clone, Serialize, Deserialize)]
79pub struct Account {
80    pub account_bank_code: String,
81    pub account_number: String,
82    pub iban_number: String,
83    pub account_name: String,
84    pub account_currency: String,
85    pub is_default: bool,
86}
87
88#[derive(Debug, Clone, Serialize, Deserialize)]
89pub struct Transaction {
90    pub description: String,
91    pub amount: String,
92    #[serde(skip_serializing_if = "Option::is_none")]
93    pub accounts: Option<Vec<Account>>,
94}
95
96#[derive(Debug, Clone, Serialize, Deserialize)]
97pub struct InvoiceLine {
98    #[serde(skip_serializing_if = "Option::is_none")]
99    pub tax_product_code: Option<String>,
100    pub line_description: String,
101    pub line_quantity: String,
102    pub line_unit_price: String,
103    #[serde(skip_serializing_if = "Option::is_none")]
104    pub note: Option<String>,
105    #[serde(skip_serializing_if = "Option::is_none")]
106    pub discounts: Option<Vec<TaxEntry>>,
107    #[serde(skip_serializing_if = "Option::is_none")]
108    pub surcharges: Option<Vec<TaxEntry>>,
109    #[serde(skip_serializing_if = "Option::is_none")]
110    pub taxes: Option<Vec<TaxEntry>>,
111}
112
113#[derive(Debug, Clone, Serialize, Deserialize)]
114pub struct EbarimtInvoiceLine {
115    #[serde(skip_serializing_if = "Option::is_none")]
116    pub tax_product_code: Option<String>,
117    pub line_description: String,
118    #[serde(skip_serializing_if = "Option::is_none")]
119    pub barcode: Option<String>,
120    pub line_quantity: String,
121    pub line_unit_price: String,
122    #[serde(skip_serializing_if = "Option::is_none")]
123    pub note: Option<String>,
124    #[serde(skip_serializing_if = "Option::is_none")]
125    pub classification_code: Option<String>,
126    #[serde(skip_serializing_if = "Option::is_none")]
127    pub taxes: Option<Vec<TaxEntry>>,
128}
129
130#[derive(Debug, Clone, Serialize, Deserialize)]
131pub struct TaxEntry {
132    #[serde(skip_serializing_if = "Option::is_none")]
133    pub tax_code: Option<String>,
134    #[serde(skip_serializing_if = "Option::is_none")]
135    pub discount_code: Option<String>,
136    #[serde(skip_serializing_if = "Option::is_none")]
137    pub surcharge_code: Option<String>,
138    pub description: String,
139    pub amount: f64,
140    #[serde(skip_serializing_if = "Option::is_none")]
141    pub note: Option<String>,
142}
143
144#[derive(Debug, Clone, Serialize, Deserialize)]
145pub struct Deeplink {
146    pub name: String,
147    pub description: String,
148    pub logo: String,
149    pub link: String,
150}
151
152// --- Invoice ---
153
154#[derive(Debug, Clone, Serialize, Deserialize)]
155pub struct CreateInvoiceRequest {
156    pub invoice_code: String,
157    pub sender_invoice_no: String,
158    #[serde(skip_serializing_if = "Option::is_none")]
159    pub sender_branch_code: Option<String>,
160    #[serde(skip_serializing_if = "Option::is_none")]
161    pub sender_branch_data: Option<SenderBranchData>,
162    #[serde(skip_serializing_if = "Option::is_none")]
163    pub sender_staff_data: Option<SenderStaffData>,
164    #[serde(skip_serializing_if = "Option::is_none")]
165    pub sender_staff_code: Option<String>,
166    pub invoice_receiver_code: String,
167    #[serde(skip_serializing_if = "Option::is_none")]
168    pub invoice_receiver_data: Option<InvoiceReceiverData>,
169    pub invoice_description: String,
170    #[serde(skip_serializing_if = "Option::is_none")]
171    pub enable_expiry: Option<String>,
172    #[serde(skip_serializing_if = "Option::is_none")]
173    pub allow_partial: Option<bool>,
174    #[serde(skip_serializing_if = "Option::is_none")]
175    pub minimum_amount: Option<f64>,
176    #[serde(skip_serializing_if = "Option::is_none")]
177    pub allow_exceed: Option<bool>,
178    #[serde(skip_serializing_if = "Option::is_none")]
179    pub maximum_amount: Option<f64>,
180    pub amount: f64,
181    pub callback_url: String,
182    #[serde(skip_serializing_if = "Option::is_none")]
183    pub sender_terminal_code: Option<String>,
184    #[serde(skip_serializing_if = "Option::is_none")]
185    pub sender_terminal_data: Option<serde_json::Value>,
186    #[serde(skip_serializing_if = "Option::is_none")]
187    pub allow_subscribe: Option<bool>,
188    #[serde(skip_serializing_if = "Option::is_none")]
189    pub subscription_interval: Option<String>,
190    #[serde(skip_serializing_if = "Option::is_none")]
191    pub subscription_webhook: Option<String>,
192    #[serde(skip_serializing_if = "Option::is_none")]
193    pub note: Option<String>,
194    #[serde(skip_serializing_if = "Option::is_none")]
195    pub transactions: Option<Vec<Transaction>>,
196    #[serde(skip_serializing_if = "Option::is_none")]
197    pub lines: Option<Vec<InvoiceLine>>,
198}
199
200#[derive(Debug, Clone, Serialize, Deserialize)]
201pub struct CreateSimpleInvoiceRequest {
202    pub invoice_code: String,
203    pub sender_invoice_no: String,
204    pub invoice_receiver_code: String,
205    pub invoice_description: String,
206    #[serde(skip_serializing_if = "Option::is_none")]
207    pub sender_branch_code: Option<String>,
208    pub amount: f64,
209    pub callback_url: String,
210}
211
212#[derive(Debug, Clone, Serialize, Deserialize)]
213pub struct CreateEbarimtInvoiceRequest {
214    pub invoice_code: String,
215    pub sender_invoice_no: String,
216    #[serde(skip_serializing_if = "Option::is_none")]
217    pub sender_branch_code: Option<String>,
218    #[serde(skip_serializing_if = "Option::is_none")]
219    pub sender_staff_data: Option<SenderStaffData>,
220    #[serde(skip_serializing_if = "Option::is_none")]
221    pub sender_staff_code: Option<String>,
222    pub invoice_receiver_code: String,
223    #[serde(skip_serializing_if = "Option::is_none")]
224    pub invoice_receiver_data: Option<InvoiceReceiverData>,
225    pub invoice_description: String,
226    pub tax_type: String,
227    pub district_code: String,
228    pub callback_url: String,
229    pub lines: Vec<EbarimtInvoiceLine>,
230}
231
232#[derive(Debug, Clone, Serialize, Deserialize)]
233pub struct InvoiceResponse {
234    pub invoice_id: String,
235    pub qr_text: String,
236    pub qr_image: String,
237    #[serde(rename = "qPay_shortUrl")]
238    pub qpay_short_url: String,
239    pub urls: Vec<Deeplink>,
240}
241
242// --- Payment ---
243
244#[derive(Debug, Clone, Serialize, Deserialize)]
245pub struct Offset {
246    pub page_number: i32,
247    pub page_limit: i32,
248}
249
250#[derive(Debug, Clone, Serialize, Deserialize)]
251pub struct PaymentCheckRequest {
252    pub object_type: String,
253    pub object_id: String,
254    #[serde(skip_serializing_if = "Option::is_none")]
255    pub offset: Option<Offset>,
256}
257
258#[derive(Debug, Clone, Serialize, Deserialize)]
259pub struct PaymentCheckResponse {
260    pub count: i32,
261    #[serde(skip_serializing_if = "Option::is_none")]
262    pub paid_amount: Option<f64>,
263    pub rows: Vec<PaymentCheckRow>,
264}
265
266#[derive(Debug, Clone, Serialize, Deserialize)]
267pub struct PaymentCheckRow {
268    pub payment_id: String,
269    pub payment_status: String,
270    pub payment_amount: String,
271    pub trx_fee: String,
272    pub payment_currency: String,
273    pub payment_wallet: String,
274    pub payment_type: String,
275    pub next_payment_date: Option<String>,
276    pub next_payment_datetime: Option<String>,
277    #[serde(default)]
278    pub card_transactions: Vec<CardTransaction>,
279    #[serde(default)]
280    pub p2p_transactions: Vec<P2PTransaction>,
281}
282
283#[derive(Debug, Clone, Serialize, Deserialize)]
284pub struct PaymentDetail {
285    pub payment_id: String,
286    pub payment_status: String,
287    pub payment_fee: String,
288    pub payment_amount: String,
289    pub payment_currency: String,
290    pub payment_date: String,
291    pub payment_wallet: String,
292    pub transaction_type: String,
293    pub object_type: String,
294    pub object_id: String,
295    pub next_payment_date: Option<String>,
296    pub next_payment_datetime: Option<String>,
297    #[serde(default)]
298    pub card_transactions: Vec<CardTransaction>,
299    #[serde(default)]
300    pub p2p_transactions: Vec<P2PTransaction>,
301}
302
303#[derive(Debug, Clone, Serialize, Deserialize)]
304pub struct CardTransaction {
305    #[serde(skip_serializing_if = "Option::is_none")]
306    pub card_merchant_code: Option<String>,
307    #[serde(skip_serializing_if = "Option::is_none")]
308    pub card_terminal_code: Option<String>,
309    #[serde(skip_serializing_if = "Option::is_none")]
310    pub card_number: Option<String>,
311    pub card_type: String,
312    pub is_cross_border: bool,
313    #[serde(skip_serializing_if = "Option::is_none")]
314    pub amount: Option<String>,
315    #[serde(skip_serializing_if = "Option::is_none")]
316    pub transaction_amount: Option<String>,
317    #[serde(skip_serializing_if = "Option::is_none")]
318    pub currency: Option<String>,
319    #[serde(skip_serializing_if = "Option::is_none")]
320    pub transaction_currency: Option<String>,
321    #[serde(skip_serializing_if = "Option::is_none")]
322    pub date: Option<String>,
323    #[serde(skip_serializing_if = "Option::is_none")]
324    pub transaction_date: Option<String>,
325    #[serde(skip_serializing_if = "Option::is_none")]
326    pub status: Option<String>,
327    #[serde(skip_serializing_if = "Option::is_none")]
328    pub transaction_status: Option<String>,
329    pub settlement_status: String,
330    pub settlement_status_date: String,
331}
332
333#[derive(Debug, Clone, Serialize, Deserialize)]
334pub struct P2PTransaction {
335    pub transaction_bank_code: String,
336    pub account_bank_code: String,
337    pub account_bank_name: String,
338    pub account_number: String,
339    pub status: String,
340    pub amount: String,
341    pub currency: String,
342    pub settlement_status: String,
343}
344
345#[derive(Debug, Clone, Serialize, Deserialize)]
346pub struct PaymentListRequest {
347    pub object_type: String,
348    pub object_id: String,
349    pub start_date: String,
350    pub end_date: String,
351    pub offset: Offset,
352}
353
354#[derive(Debug, Clone, Serialize, Deserialize)]
355pub struct PaymentListResponse {
356    pub count: i32,
357    pub rows: Vec<PaymentListItem>,
358}
359
360#[derive(Debug, Clone, Serialize, Deserialize)]
361pub struct PaymentListItem {
362    pub payment_id: String,
363    pub payment_date: String,
364    pub payment_status: String,
365    pub payment_fee: String,
366    pub payment_amount: String,
367    pub payment_currency: String,
368    pub payment_wallet: String,
369    pub payment_name: String,
370    pub payment_description: String,
371    pub qr_code: String,
372    pub paid_by: String,
373    pub object_type: String,
374    pub object_id: String,
375}
376
377#[derive(Debug, Clone, Serialize, Deserialize, Default)]
378pub struct PaymentCancelRequest {
379    #[serde(skip_serializing_if = "Option::is_none")]
380    pub callback_url: Option<String>,
381    #[serde(skip_serializing_if = "Option::is_none")]
382    pub note: Option<String>,
383}
384
385#[derive(Debug, Clone, Serialize, Deserialize, Default)]
386pub struct PaymentRefundRequest {
387    #[serde(skip_serializing_if = "Option::is_none")]
388    pub callback_url: Option<String>,
389    #[serde(skip_serializing_if = "Option::is_none")]
390    pub note: Option<String>,
391}
392
393// --- Ebarimt ---
394
395#[derive(Debug, Clone, Serialize, Deserialize)]
396pub struct CreateEbarimtRequest {
397    pub payment_id: String,
398    pub ebarimt_receiver_type: String,
399    #[serde(skip_serializing_if = "Option::is_none")]
400    pub ebarimt_receiver: Option<String>,
401    #[serde(skip_serializing_if = "Option::is_none")]
402    pub district_code: Option<String>,
403    #[serde(skip_serializing_if = "Option::is_none")]
404    pub classification_code: Option<String>,
405}
406
407#[derive(Debug, Clone, Serialize, Deserialize)]
408pub struct EbarimtResponse {
409    pub id: String,
410    pub ebarimt_by: String,
411    pub g_wallet_id: String,
412    pub g_wallet_customer_id: String,
413    pub ebarimt_receiver_type: String,
414    pub ebarimt_receiver: String,
415    pub ebarimt_district_code: String,
416    pub ebarimt_bill_type: String,
417    pub g_merchant_id: String,
418    pub merchant_branch_code: String,
419    pub merchant_terminal_code: Option<String>,
420    pub merchant_staff_code: Option<String>,
421    pub merchant_register_no: String,
422    pub g_payment_id: String,
423    pub paid_by: String,
424    pub object_type: String,
425    pub object_id: String,
426    pub amount: String,
427    pub vat_amount: String,
428    pub city_tax_amount: String,
429    pub ebarimt_qr_data: String,
430    pub ebarimt_lottery: String,
431    pub note: Option<String>,
432    pub barimt_status: String,
433    pub barimt_status_date: String,
434    pub ebarimt_sent_email: Option<String>,
435    pub ebarimt_receiver_phone: String,
436    pub tax_type: String,
437    #[serde(skip_serializing_if = "Option::is_none")]
438    pub merchant_tin: Option<String>,
439    #[serde(skip_serializing_if = "Option::is_none")]
440    pub ebarimt_receipt_id: Option<String>,
441    pub created_by: String,
442    pub created_date: String,
443    pub updated_by: String,
444    pub updated_date: String,
445    pub status: bool,
446    #[serde(default)]
447    pub barimt_items: Vec<EbarimtItem>,
448    #[serde(default)]
449    pub barimt_transactions: Vec<serde_json::Value>,
450    #[serde(default)]
451    pub barimt_histories: Vec<EbarimtHistory>,
452}
453
454#[derive(Debug, Clone, Serialize, Deserialize)]
455pub struct EbarimtItem {
456    pub id: String,
457    pub barimt_id: String,
458    pub merchant_product_code: Option<String>,
459    pub tax_product_code: String,
460    pub bar_code: Option<String>,
461    pub name: String,
462    pub unit_price: String,
463    pub quantity: String,
464    pub amount: String,
465    pub city_tax_amount: String,
466    pub vat_amount: String,
467    pub note: Option<String>,
468    pub created_by: String,
469    pub created_date: String,
470    pub updated_by: String,
471    pub updated_date: String,
472    pub status: bool,
473}
474
475#[derive(Debug, Clone, Serialize, Deserialize)]
476pub struct EbarimtHistory {
477    pub id: String,
478    pub barimt_id: String,
479    pub ebarimt_receiver_type: String,
480    pub ebarimt_receiver: String,
481    pub ebarimt_register_no: Option<String>,
482    pub ebarimt_bill_id: String,
483    pub ebarimt_date: String,
484    pub ebarimt_mac_address: String,
485    pub ebarimt_internal_code: String,
486    pub ebarimt_bill_type: String,
487    pub ebarimt_qr_data: String,
488    pub ebarimt_lottery: String,
489    pub ebarimt_lottery_msg: Option<String>,
490    pub ebarimt_error_code: Option<String>,
491    pub ebarimt_error_msg: Option<String>,
492    pub ebarimt_response_code: Option<String>,
493    pub ebarimt_response_msg: Option<String>,
494    pub note: Option<String>,
495    pub barimt_status: String,
496    pub barimt_status_date: String,
497    pub ebarimt_sent_email: Option<String>,
498    pub ebarimt_receiver_phone: String,
499    pub tax_type: String,
500    pub created_by: String,
501    pub created_date: String,
502    pub updated_by: String,
503    pub updated_date: String,
504    pub status: bool,
505}