sumup_rs/models/
checkout.rs

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, // PENDING, FAILED, PAID
12    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>, // CHECKOUT, SETUP_RECURRING_PAYMENT
57    #[serde(skip_serializing_if = "Option::is_none")]
58    pub redirect_url: Option<String>,
59}
60
61/// Query parameters for listing checkouts
62#[derive(Debug, Clone, Serialize, Deserialize, Default)]
63pub struct CheckoutListQuery {
64    /// Unique ID of the payment checkout specified by the client application
65    #[serde(skip_serializing_if = "Option::is_none")]
66    pub checkout_reference: Option<String>,
67    /// Filter by checkout status (PENDING, FAILED, PAID)
68    #[serde(skip_serializing_if = "Option::is_none")]
69    pub status: Option<String>,
70    /// Filter by merchant code
71    #[serde(skip_serializing_if = "Option::is_none")]
72    pub merchant_code: Option<String>,
73    /// Filter by customer ID
74    #[serde(skip_serializing_if = "Option::is_none")]
75    pub customer_id: Option<String>,
76    /// Maximum number of checkouts to return
77    #[serde(skip_serializing_if = "Option::is_none")]
78    pub limit: Option<i32>,
79    /// Offset for pagination
80    #[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, // card, boleto, ideal, etc.
87    #[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, // EXPIRED
103    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/// Response for processing a checkout, which can be an immediate success or require 3DS authentication.
131#[derive(Debug, Clone, Serialize, Deserialize)]
132#[serde(untagged)]
133pub enum ProcessCheckoutResponse {
134    Success(Checkout),
135    Accepted(CheckoutAccepted),
136}
137
138/// Represents a 202 Accepted response, typically for 3DS authentication.
139#[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}