1use serde::{Deserialize, Serialize};
2
3#[derive(Serialize, Deserialize, Debug)]
5pub struct PaymentRequest {
6 pub amount: f64,
8 pub email: Option<String>,
10 #[serde(rename = "redirectUrl")]
12 pub redirect_url: Option<String>,
13 #[serde(rename = "userId")]
15 pub user_id: Option<String>,
16 #[serde(rename = "ExternalId")]
17 pub external_id: Option<String>,
19 #[serde(rename = "message")]
21 pub message: String,
22 #[serde(rename = "CardOnly")]
24 pub card_only: Option<bool>,
25}
26
27#[derive(Serialize, Deserialize, Debug, Clone)]
28pub struct PaymentTransactionResponse {
29 #[serde(rename = "transId")]
30 pub transaction_id: String,
31}
32#[derive(Serialize, Deserialize, Debug, Clone)]
34pub struct PaymentResponse {
35 pub message: String,
36 #[serde(rename = "link")]
38 pub payment_link: String,
39 #[serde(rename = "transId")]
41 pub transaction_id: String,
42 #[serde(rename = "dateInitiated")]
43 pub date_initiated: String,
44}
45
46#[derive(Serialize, Deserialize, Debug, Clone)]
48pub struct TransactionStatus {
49 #[serde(rename = "transId")]
50 pub transaction_id: String,
51 pub status: Status,
52 #[serde(skip_serializing_if = "Option::is_none")]
53 pub medium: Option<String>,
54 #[serde(rename = "serviceName")]
55 pub service_name: String,
56 pub amount: f64,
57 #[serde(skip_serializing_if = "Option::is_none")]
58 pub revenue: Option<f64>,
59 #[serde(rename = "payerName")]
60 #[serde(skip_serializing_if = "Option::is_none")]
61 pub payer_name: Option<String>,
62 pub email: String,
63 #[serde(rename = "redirectUrl")]
64 pub redirect_url: String,
65 #[serde(rename = "externalId")]
66 #[serde(skip_serializing_if = "Option::is_none")]
67 pub external_id: Option<String>,
68 #[serde(rename = "userId")]
69 #[serde(skip_serializing_if = "Option::is_none")]
70 pub user_id: Option<String>,
71 #[serde(skip_serializing_if = "Option::is_none")]
72 pub webhook: Option<String>,
73 #[serde(rename = "financialTransId")]
74 #[serde(skip_serializing_if = "Option::is_none")]
75 pub financial_transaction_id: Option<String>,
76 #[serde(rename = "dateInitiated")]
77 pub date_initiated: String,
78 #[serde(rename = "dateConfirmed")]
79 pub date_confirmed: String,
80}
81#[derive(Debug, Serialize, Deserialize, Default, Clone, PartialEq, Eq)]
82pub enum Status {
83 #[default]
84 CREATED,
85 PENDING,
86 SUCCESSFUL,
87 FAILED,
88 EXPIRED,
89}
90
91impl From<String> for Status {
92 fn from(s: String) -> Self {
93 match s.to_lowercase().as_str() {
94 "created" => Status::CREATED,
95 "pending" => Status::PENDING,
96 "successful" => Status::SUCCESSFUL,
97 "failed" => Status::FAILED,
98 "expired" => Status::EXPIRED,
99 _ => Status::CREATED,
100 }
101 }
102}
103
104#[derive(Serialize, Deserialize, Debug, Clone)]
106pub struct ExpiredTransaction {
107 pub transaction_id: String,
109}
110
111#[derive(Serialize, Deserialize, Debug, Clone)]
112pub struct ExpiredTransactionResponse {
113 pub status: String,
115 pub transaction_id: String,
117 pub amount: f64,
119}
120
121#[derive(Serialize, Deserialize, Debug, Clone)]
123pub struct WebhookConfig {
124 pub url: String,
126 pub service_id: String,
128}
129
130#[derive(Serialize, Deserialize, Debug, Clone)]
132pub struct DirectPaymentRequest {
133 pub amount: f32, pub phone: String,
137 #[serde(skip_serializing_if = "Option::is_none")]
139 pub medium: Option<String>, #[serde(skip_serializing_if = "Option::is_none")]
142 pub name: Option<String>, #[serde(skip_serializing_if = "Option::is_none")]
145 pub email: Option<String>, #[serde(skip_serializing_if = "Option::is_none")]
148 pub user_id: Option<String>, #[serde(skip_serializing_if = "Option::is_none")]
151 pub external_id: Option<String>, #[serde(skip_serializing_if = "Option::is_none")]
154 pub message: Option<String>, }
156#[derive(Serialize, Deserialize, Debug, Clone)]
158pub struct DirectPaymentResponse {
159 #[serde(rename = "transId")]
161 pub transaction_id: String,
162 pub message: String,
164 #[serde(rename = "dateInitiated")]
166 pub date_initiated: String,
167}
168
169#[derive(Serialize, Deserialize, Debug, Default, Clone)]
171pub struct TransactionSearchQuery {
172 pub status: Status,
174 pub medium: String,
176 #[serde(skip_serializing_if = "Option::is_none")]
178 pub name: Option<String>,
179 pub start: String,
181 pub end: String,
183 pub amt: f64,
185 pub limit: u32,
187}
188
189#[derive(Serialize, Deserialize, Debug)]
191pub struct TransactionList {
192 #[serde(flatten)]
194 pub transactions: Vec<TransactionStatus>,
195}
196
197#[derive(Serialize, Deserialize, Debug, Clone)]
199pub struct ServiceBalance {
200 pub balance: f64,
202 pub currency: String,
204}
205
206#[derive(Serialize, Deserialize, Debug, Clone)]
207pub struct Payouts {
208 pub amount: f64,
210 pub phone_number: String,
212 pub medium: String,
214 pub name: Option<String>,
216 pub email: Option<String>,
218 pub message: Option<String>,
220}