1use super::common::EmptyObject;
2use super::common::{CardDetails, Mandate, PaymentInstrumentToken};
3use super::customer::PersonalDetails;
4use super::transaction::Transaction;
5use chrono::{DateTime, Utc};
6use serde::{Deserialize, Serialize};
7
8#[derive(Debug, Clone, Serialize, Deserialize)]
9pub struct Checkout {
10 pub id: String,
11 pub status: String, pub amount: f64,
13 pub currency: String,
14 pub date: DateTime<Utc>,
15 #[serde(default, skip_serializing_if = "Option::is_none")]
16 pub checkout_reference: Option<String>,
17 #[serde(default, skip_serializing_if = "Option::is_none")]
18 pub merchant_code: Option<String>,
19 #[serde(default, skip_serializing_if = "Option::is_none")]
20 pub description: Option<String>,
21 #[serde(default, skip_serializing_if = "Option::is_none")]
22 pub return_url: Option<String>,
23 #[serde(default, skip_serializing_if = "Option::is_none")]
24 pub valid_until: Option<DateTime<Utc>>,
25 #[serde(default, skip_serializing_if = "Option::is_none")]
26 pub customer_id: Option<String>,
27 #[serde(default, skip_serializing_if = "Option::is_none")]
28 pub mandate: Option<Mandate>,
29 #[serde(default, skip_serializing_if = "Vec::is_empty")]
30 pub transactions: Vec<Transaction>,
31 #[serde(default, skip_serializing_if = "Option::is_none")]
32 pub transaction_code: Option<String>,
33 #[serde(default, skip_serializing_if = "Option::is_none")]
34 pub transaction_id: Option<String>,
35 #[serde(default, skip_serializing_if = "Option::is_none")]
36 pub merchant_name: Option<String>,
37 #[serde(default, skip_serializing_if = "Option::is_none")]
38 pub redirect_url: Option<String>,
39 #[serde(default, skip_serializing_if = "Option::is_none")]
40 pub payment_instrument: Option<PaymentInstrumentToken>,
41}
42
43#[derive(Debug, Clone, Serialize, Deserialize)]
44pub struct CreateCheckoutRequest {
45 pub checkout_reference: String,
46 pub amount: f64,
47 pub currency: String,
48 pub merchant_code: String,
49 #[serde(skip_serializing_if = "Option::is_none")]
50 pub description: Option<String>,
51 #[serde(skip_serializing_if = "Option::is_none")]
52 pub return_url: Option<String>,
53 #[serde(skip_serializing_if = "Option::is_none")]
54 pub customer_id: Option<String>,
55 #[serde(skip_serializing_if = "Option::is_none")]
56 pub purpose: Option<String>, #[serde(skip_serializing_if = "Option::is_none")]
58 pub redirect_url: Option<String>,
59}
60
61#[derive(Debug, Clone, Serialize, Deserialize, Default)]
63pub struct CheckoutListQuery {
64 #[serde(skip_serializing_if = "Option::is_none")]
66 pub checkout_reference: Option<String>,
67 #[serde(skip_serializing_if = "Option::is_none")]
69 pub status: Option<String>,
70 #[serde(skip_serializing_if = "Option::is_none")]
72 pub merchant_code: Option<String>,
73 #[serde(skip_serializing_if = "Option::is_none")]
75 pub customer_id: Option<String>,
76 #[serde(skip_serializing_if = "Option::is_none")]
78 pub limit: Option<i32>,
79 #[serde(skip_serializing_if = "Option::is_none")]
81 pub offset: Option<i32>,
82}
83
84#[derive(Debug, Clone, Serialize, Deserialize)]
85pub struct ProcessCheckoutRequest {
86 pub payment_type: String, #[serde(skip_serializing_if = "Option::is_none")]
88 pub installments: Option<i32>,
89 #[serde(skip_serializing_if = "Option::is_none")]
90 pub card: Option<CardDetails>,
91 #[serde(skip_serializing_if = "Option::is_none")]
92 pub token: Option<String>,
93 #[serde(skip_serializing_if = "Option::is_none")]
94 pub customer_id: Option<String>,
95 #[serde(skip_serializing_if = "Option::is_none")]
96 pub personal_details: Option<PersonalDetails>,
97}
98
99#[derive(Debug, Clone, Serialize, Deserialize)]
100pub struct DeletedCheckout {
101 pub id: String,
102 pub status: String, pub amount: f64,
104 pub currency: String,
105 pub date: DateTime<Utc>,
106 #[serde(default, skip_serializing_if = "Option::is_none")]
107 pub checkout_reference: Option<String>,
108 #[serde(default, skip_serializing_if = "Option::is_none")]
109 pub merchant_code: Option<String>,
110 #[serde(default, skip_serializing_if = "Option::is_none")]
111 pub description: Option<String>,
112 #[serde(default, skip_serializing_if = "Option::is_none")]
113 pub purpose: Option<String>,
114 #[serde(default, skip_serializing_if = "Option::is_none")]
115 pub valid_until: Option<DateTime<Utc>>,
116 #[serde(default, skip_serializing_if = "Vec::is_empty")]
117 pub transactions: Vec<EmptyObject>,
118}
119
120#[derive(Debug, Clone, Serialize, Deserialize)]
121pub struct AvailablePaymentMethod {
122 pub id: String,
123}
124
125#[derive(Debug, Clone, Serialize, Deserialize)]
126pub struct AvailablePaymentMethodsResponse {
127 pub available_payment_methods: Vec<AvailablePaymentMethod>,
128}
129
130#[derive(Debug, Clone, Serialize, Deserialize)]
132#[serde(untagged)]
133pub enum ProcessCheckoutResponse {
134 Success(Checkout),
135 Accepted(CheckoutAccepted),
136}
137
138#[derive(Debug, Clone, Serialize, Deserialize)]
140pub struct CheckoutAccepted {
141 pub next_step: NextStep,
142}
143
144#[derive(Debug, Clone, Serialize, Deserialize)]
145pub struct NextStep {
146 pub url: String,
147 pub method: String,
148 #[serde(default, skip_serializing_if = "Option::is_none")]
149 pub redirect_url: Option<String>,
150 #[serde(default, skip_serializing_if = "Vec::is_empty")]
151 pub mechanism: Vec<String>,
152 #[serde(default, skip_serializing_if = "Option::is_none")]
153 pub payload: Option<serde_json::Value>,
154}