Skip to main content

tapsilat/types/
order.rs

1use serde::{Deserialize, Serialize};
2use std::collections::HashMap;
3
4/// An order as returned by the order detail endpoints.
5///
6/// Every field is optional because the server omits empty values.
7#[derive(Debug, Clone, Serialize, Deserialize, Default)]
8#[serde(default)]
9pub struct Order {
10    #[serde(skip_serializing_if = "Option::is_none")]
11    pub id: Option<String>,
12    #[serde(skip_serializing_if = "Option::is_none")]
13    pub reference_id: Option<String>,
14    #[serde(skip_serializing_if = "Option::is_none")]
15    pub locale: Option<String>,
16
17    // Amount fields are strings in JSON logs
18    #[serde(skip_serializing_if = "Option::is_none")]
19    pub amount: Option<String>,
20    #[serde(skip_serializing_if = "Option::is_none")]
21    pub total: Option<String>,
22    #[serde(skip_serializing_if = "Option::is_none")]
23    pub paid_amount: Option<String>,
24    #[serde(skip_serializing_if = "Option::is_none")]
25    pub refunded_amount: Option<String>,
26    #[serde(skip_serializing_if = "Option::is_none")]
27    pub customer_paid_amount: Option<f64>,
28
29    #[serde(skip_serializing_if = "Option::is_none")]
30    pub currency: Option<String>, // Relaxed from enum to avoid validation errors
31
32    #[serde(skip_serializing_if = "Option::is_none")]
33    pub status: Option<i32>, // Status is int in logs
34    #[serde(skip_serializing_if = "Option::is_none")]
35    pub status_enum: Option<String>,
36
37    #[serde(skip_serializing_if = "Option::is_none")]
38    pub description: Option<String>,
39    #[serde(skip_serializing_if = "Option::is_none")]
40    pub buyer: Option<Buyer>,
41    /// Deprecated: the API returns basket items in `basket_items`.
42    #[serde(skip_serializing_if = "Option::is_none")]
43    pub items: Option<Vec<OrderItem>>,
44
45    #[serde(skip_serializing_if = "Option::is_none")]
46    pub basket_items: Option<Vec<BasketItemDTO>>,
47    #[serde(skip_serializing_if = "Option::is_none")]
48    pub billing_address: Option<BillingAddressDTO>,
49    #[serde(skip_serializing_if = "Option::is_none")]
50    pub shipping_address: Option<ShippingAddressDTO>,
51    #[serde(skip_serializing_if = "Option::is_none")]
52    pub checkout_design: Option<CheckoutDesignDTO>,
53    #[serde(skip_serializing_if = "Option::is_none")]
54    pub payment_terms: Option<Vec<OrderPaymentTermDetail>>,
55    #[serde(skip_serializing_if = "Option::is_none")]
56    pub payment_requests: Option<Vec<OrderPaymentRequest>>,
57    #[serde(skip_serializing_if = "Option::is_none")]
58    pub refund_cancel_requests: Option<Vec<OrderRefundCancelRequest>>,
59
60    #[serde(skip_serializing_if = "Option::is_none")]
61    pub conversation_id: Option<String>,
62    #[serde(skip_serializing_if = "Option::is_none")]
63    pub external_reference_id: Option<String>,
64    #[serde(skip_serializing_if = "Option::is_none")]
65    pub payment_options: Option<Vec<String>>,
66    #[serde(skip_serializing_if = "Option::is_none")]
67    pub payment_success_url: Option<String>,
68    #[serde(skip_serializing_if = "Option::is_none")]
69    pub payment_failure_url: Option<String>,
70    #[serde(skip_serializing_if = "Option::is_none")]
71    pub redirect_success_url: Option<String>,
72    #[serde(skip_serializing_if = "Option::is_none")]
73    pub redirect_failure_url: Option<String>,
74
75    #[serde(skip_serializing_if = "Option::is_none")]
76    pub callback_url: Option<String>,
77    #[serde(skip_serializing_if = "Option::is_none")]
78    pub checkout_url: Option<String>,
79    #[serde(skip_serializing_if = "Option::is_none")]
80    pub created_at: Option<String>,
81    #[serde(skip_serializing_if = "Option::is_none")]
82    pub updated_at: Option<String>,
83    #[serde(skip_serializing_if = "Option::is_none")]
84    pub metadata: Option<Vec<MetadataDTO>>, // JSON metadata is array of key/value
85}
86
87/// The order detail returned by [`crate::TapsilatClient::get_order`] and
88/// [`crate::TapsilatClient::get_order_by_conversation_id`].
89pub type OrderDetail = Order;
90
91#[derive(Debug, Clone, Serialize, Deserialize)]
92pub struct OrderItem {
93    pub name: String,
94    pub price: f64,
95    pub quantity: i32,
96    #[serde(skip_serializing_if = "Option::is_none")]
97    pub description: Option<String>,
98}
99
100#[derive(Debug, Clone, Serialize, Deserialize)]
101pub enum OrderStatus {
102    #[serde(rename = "pending")]
103    Pending,
104    #[serde(rename = "processing")]
105    Processing,
106    #[serde(rename = "completed")]
107    Completed,
108    #[serde(rename = "failed")]
109    Failed,
110    #[serde(rename = "cancelled")]
111    Cancelled,
112    #[serde(rename = "refunded")]
113    Refunded,
114    #[serde(rename = "partially_refunded")]
115    PartiallyRefunded,
116}
117
118#[derive(Debug, Clone, Serialize, Deserialize)]
119pub enum Currency {
120    #[serde(rename = "TRY")]
121    TRY,
122    #[serde(rename = "USD")]
123    USD,
124    #[serde(rename = "EUR")]
125    EUR,
126    #[serde(rename = "GBP")]
127    GBP,
128}
129
130/// The order-create request. Required: `locale`, a non-zero `amount` and `currency`.
131#[derive(Debug, Clone, Serialize, Deserialize, Default)]
132pub struct CreateOrderRequest {
133    pub amount: f64,
134    pub currency: String,
135    pub locale: String,
136    pub buyer: CreateBuyerRequest,
137    #[serde(rename = "basket_items", skip_serializing_if = "Option::is_none")]
138    pub basket_items: Option<Vec<BasketItemDTO>>,
139    #[serde(rename = "billing_address", skip_serializing_if = "Option::is_none")]
140    pub billing_address: Option<BillingAddressDTO>,
141    #[serde(rename = "checkout_design", skip_serializing_if = "Option::is_none")]
142    pub checkout_design: Option<CheckoutDesignDTO>,
143    #[serde(rename = "conversation_id", skip_serializing_if = "Option::is_none")]
144    pub conversation_id: Option<String>,
145    #[serde(
146        rename = "enabled_installments",
147        skip_serializing_if = "Option::is_none"
148    )]
149    pub enabled_installments: Option<Vec<i32>>,
150    #[serde(
151        rename = "external_reference_id",
152        skip_serializing_if = "Option::is_none"
153    )]
154    pub external_reference_id: Option<String>,
155    #[serde(skip_serializing_if = "Option::is_none")]
156    pub metadata: Option<Vec<MetadataDTO>>,
157    /// Saved cards to charge for the order.
158    #[serde(rename = "order_cards", skip_serializing_if = "Option::is_none")]
159    pub order_cards: Option<Vec<OrderCardDTO>>,
160    /// The VPOS to process the order with.
161    #[serde(skip_serializing_if = "Option::is_none")]
162    pub order_vpos_id: Option<String>,
163    #[serde(rename = "paid_amount", skip_serializing_if = "Option::is_none")]
164    pub paid_amount: Option<f64>,
165    #[serde(rename = "partial_payment", skip_serializing_if = "Option::is_none")]
166    pub partial_payment: Option<bool>,
167    #[serde(
168        rename = "payment_failure_url",
169        skip_serializing_if = "Option::is_none"
170    )]
171    pub payment_failure_url: Option<String>,
172    #[serde(rename = "payment_methods", skip_serializing_if = "Option::is_none")]
173    pub payment_methods: Option<bool>,
174    /// "auth" (default) or "preauth".
175    #[serde(rename = "payment_mode", skip_serializing_if = "Option::is_none")]
176    pub payment_mode: Option<String>,
177    #[serde(rename = "payment_options", skip_serializing_if = "Option::is_none")]
178    pub payment_options: Option<Vec<String>>,
179    #[serde(
180        rename = "payment_success_url",
181        skip_serializing_if = "Option::is_none"
182    )]
183    pub payment_success_url: Option<String>,
184    #[serde(rename = "payment_terms", skip_serializing_if = "Option::is_none")]
185    pub payment_terms: Option<Vec<PaymentTermDTO>>,
186    #[serde(rename = "pf_sub_merchant", skip_serializing_if = "Option::is_none")]
187    pub pf_sub_merchant: Option<OrderPFSubMerchantDTO>,
188    #[serde(
189        rename = "redirect_failure_url",
190        skip_serializing_if = "Option::is_none"
191    )]
192    pub redirect_failure_url: Option<String>,
193    #[serde(
194        rename = "redirect_success_url",
195        skip_serializing_if = "Option::is_none"
196    )]
197    pub redirect_success_url: Option<String>,
198    #[serde(rename = "shipping_address", skip_serializing_if = "Option::is_none")]
199    pub shipping_address: Option<ShippingAddressDTO>,
200    #[serde(rename = "sub_organization", skip_serializing_if = "Option::is_none")]
201    pub sub_organization: Option<SubOrganizationDTO>,
202    #[serde(skip_serializing_if = "Option::is_none")]
203    pub submerchants: Option<Vec<SubmerchantDTO>>,
204    #[serde(rename = "tax_amount", skip_serializing_if = "Option::is_none")]
205    pub tax_amount: Option<f64>,
206    #[serde(rename = "three_d_force", skip_serializing_if = "Option::is_none")]
207    pub three_d_force: Option<bool>,
208    #[serde(skip_serializing_if = "Option::is_none")]
209    pub consents: Option<Vec<OrderConsent>>,
210}
211
212/// A consent text the buyer must accept on the checkout page.
213#[derive(Debug, Clone, Serialize, Deserialize, Default)]
214pub struct OrderConsent {
215    #[serde(skip_serializing_if = "Option::is_none")]
216    pub title: Option<String>,
217    #[serde(skip_serializing_if = "Option::is_none")]
218    pub url: Option<String>,
219}
220
221#[derive(Debug, Clone, Serialize, Deserialize)]
222pub struct CreateOrderItemRequest {
223    pub name: String,
224    pub price: f64,
225    pub quantity: i32,
226    #[serde(skip_serializing_if = "Option::is_none")]
227    pub description: Option<String>,
228}
229
230#[derive(Debug, Clone, Serialize, Deserialize, Default)]
231#[serde(default)]
232pub struct OrderResponse {
233    #[serde(skip_serializing_if = "Option::is_none")]
234    pub order_id: Option<String>,
235    #[serde(skip_serializing_if = "Option::is_none")]
236    pub reference_id: Option<String>,
237    #[serde(skip_serializing_if = "Option::is_none")]
238    pub checkout_url: Option<String>,
239}
240
241#[derive(Debug, Clone, Serialize, Deserialize, Default)]
242#[serde(default)]
243pub struct CreateOrderResponse {
244    #[serde(skip_serializing_if = "Option::is_none")]
245    pub order_id: Option<String>,
246    #[serde(skip_serializing_if = "Option::is_none")]
247    pub reference_id: Option<String>,
248    #[serde(skip_serializing_if = "Option::is_none")]
249    pub checkout_url: Option<String>,
250}
251
252/// Refunds an order. `order_item_id` and `order_item_payment_id` optionally limit the
253/// refund to one basket item or item payment.
254#[derive(Debug, Clone, Serialize, Deserialize, Default)]
255pub struct RefundOrderRequest {
256    pub amount: f64,
257    #[serde(rename = "reference_id")]
258    pub reference_id: String,
259    #[serde(rename = "order_item_id", skip_serializing_if = "Option::is_none")]
260    pub order_item_id: Option<String>,
261    #[serde(
262        rename = "order_item_payment_id",
263        skip_serializing_if = "Option::is_none"
264    )]
265    pub order_item_payment_id: Option<String>,
266}
267
268#[derive(Debug, Clone, Serialize, Deserialize)]
269pub struct RefundOrderResponse {
270    pub order: Order,
271    pub refund_amount: f64,
272    pub refund_id: String,
273}
274
275#[derive(Debug, Clone, Serialize, Deserialize, Default)]
276pub struct MetadataDTO {
277    pub key: String,
278    pub value: String,
279}
280
281/// A basket item. The response-only fields are filled when reading an order.
282#[derive(Debug, Clone, Serialize, Deserialize, Default)]
283pub struct BasketItemDTO {
284    #[serde(skip_serializing_if = "Option::is_none")]
285    pub category1: Option<String>,
286    #[serde(skip_serializing_if = "Option::is_none")]
287    pub category2: Option<String>,
288    #[serde(skip_serializing_if = "Option::is_none")]
289    pub commission_amount: Option<f64>,
290    #[serde(skip_serializing_if = "Option::is_none")]
291    pub coupon: Option<String>,
292    #[serde(skip_serializing_if = "Option::is_none")]
293    pub coupon_discount: Option<f64>,
294    #[serde(skip_serializing_if = "Option::is_none")]
295    pub data: Option<String>,
296    #[serde(skip_serializing_if = "Option::is_none")]
297    pub id: Option<String>,
298    #[serde(skip_serializing_if = "Option::is_none")]
299    pub item_type: Option<String>,
300    /// The item's merchant category code.
301    #[serde(skip_serializing_if = "Option::is_none")]
302    pub mcc: Option<String>,
303    #[serde(skip_serializing_if = "Option::is_none")]
304    pub name: Option<String>,
305    #[serde(skip_serializing_if = "Option::is_none")]
306    pub paid_amount: Option<f64>,
307    #[serde(skip_serializing_if = "Option::is_none")]
308    pub payer: Option<BasketItemPayerDTO>,
309    /// The earliest time the item's payout may be released (RFC3339).
310    #[serde(skip_serializing_if = "Option::is_none")]
311    pub payout_release_at: Option<String>,
312    #[serde(skip_serializing_if = "Option::is_none")]
313    pub price: Option<f64>,
314    #[serde(skip_serializing_if = "Option::is_none")]
315    pub quantity: Option<i32>,
316    #[serde(skip_serializing_if = "Option::is_none")]
317    pub quantity_float: Option<f64>,
318    #[serde(skip_serializing_if = "Option::is_none")]
319    pub quantity_unit: Option<String>,
320    #[serde(skip_serializing_if = "Option::is_none")]
321    pub sub_merchant_key: Option<String>,
322    #[serde(skip_serializing_if = "Option::is_none")]
323    pub sub_merchant_price: Option<String>,
324    /// Response only.
325    #[serde(skip_serializing_if = "Option::is_none")]
326    pub status: Option<u64>,
327    /// Response only.
328    #[serde(skip_serializing_if = "Option::is_none")]
329    pub refunded_amount: Option<f64>,
330    /// Response only.
331    #[serde(skip_serializing_if = "Option::is_none")]
332    pub refundable_amount: Option<f64>,
333    /// Response only.
334    #[serde(skip_serializing_if = "Option::is_none")]
335    pub paidable_amount: Option<f64>,
336    /// Response only.
337    #[serde(skip_serializing_if = "Option::is_none")]
338    pub item_payments: Option<Vec<OrderItemPayment>>,
339}
340
341/// A payment made against a basket item.
342#[derive(Debug, Clone, Serialize, Deserialize, Default)]
343#[serde(default)]
344pub struct OrderItemPayment {
345    #[serde(skip_serializing_if = "Option::is_none")]
346    pub id: Option<String>,
347    #[serde(skip_serializing_if = "Option::is_none")]
348    pub amount: Option<f64>,
349    #[serde(skip_serializing_if = "Option::is_none")]
350    pub paid_date: Option<String>,
351    #[serde(skip_serializing_if = "Option::is_none")]
352    pub masked_bin: Option<String>,
353    #[serde(skip_serializing_if = "Option::is_none")]
354    pub card_brand: Option<String>,
355    #[serde(skip_serializing_if = "Option::is_none")]
356    pub refunded_amount: Option<f64>,
357    #[serde(skip_serializing_if = "Option::is_none")]
358    pub refundable_amount: Option<f64>,
359    #[serde(skip_serializing_if = "Option::is_none")]
360    pub refunded_date: Option<String>,
361    #[serde(skip_serializing_if = "Option::is_none")]
362    pub refunded: Option<bool>,
363    #[serde(skip_serializing_if = "Option::is_none")]
364    pub status: Option<u64>,
365    #[serde(rename = "type", skip_serializing_if = "Option::is_none")]
366    pub type_: Option<String>,
367}
368
369#[derive(Debug, Clone, Serialize, Deserialize, Default)]
370pub struct BasketItemPayerDTO {
371    #[serde(skip_serializing_if = "Option::is_none")]
372    pub address: Option<String>,
373    #[serde(skip_serializing_if = "Option::is_none")]
374    pub reference_id: Option<String>,
375    #[serde(skip_serializing_if = "Option::is_none")]
376    pub tax_office: Option<String>,
377    #[serde(skip_serializing_if = "Option::is_none")]
378    pub title: Option<String>,
379    #[serde(rename = "type", skip_serializing_if = "Option::is_none")]
380    pub type_: Option<String>,
381    #[serde(skip_serializing_if = "Option::is_none")]
382    pub vat: Option<String>,
383    #[serde(skip_serializing_if = "Option::is_none")]
384    pub name: Option<String>,
385    #[serde(skip_serializing_if = "Option::is_none")]
386    pub surname: Option<String>,
387    #[serde(skip_serializing_if = "Option::is_none")]
388    pub identity_number: Option<String>,
389    #[serde(skip_serializing_if = "Option::is_none")]
390    pub email: Option<String>,
391    #[serde(skip_serializing_if = "Option::is_none")]
392    pub phone: Option<String>,
393}
394
395#[derive(Debug, Clone, Serialize, Deserialize, Default)]
396pub struct BillingAddressDTO {
397    #[serde(skip_serializing_if = "Option::is_none")]
398    pub address: Option<String>,
399    #[serde(skip_serializing_if = "Option::is_none")]
400    pub billing_type: Option<String>,
401    #[serde(skip_serializing_if = "Option::is_none")]
402    pub citizenship: Option<String>,
403    #[serde(skip_serializing_if = "Option::is_none")]
404    pub city: Option<String>,
405    #[serde(skip_serializing_if = "Option::is_none")]
406    pub contact_name: Option<String>,
407    #[serde(skip_serializing_if = "Option::is_none")]
408    pub contact_phone: Option<String>,
409    #[serde(skip_serializing_if = "Option::is_none")]
410    pub country: Option<String>,
411    #[serde(skip_serializing_if = "Option::is_none")]
412    pub district: Option<String>,
413    #[serde(skip_serializing_if = "Option::is_none")]
414    pub neighbourhood: Option<String>,
415    #[serde(skip_serializing_if = "Option::is_none")]
416    pub street1: Option<String>,
417    #[serde(skip_serializing_if = "Option::is_none")]
418    pub street2: Option<String>,
419    #[serde(skip_serializing_if = "Option::is_none")]
420    pub street3: Option<String>,
421    #[serde(skip_serializing_if = "Option::is_none")]
422    pub tax_office: Option<String>,
423    #[serde(skip_serializing_if = "Option::is_none")]
424    pub title: Option<String>,
425    #[serde(skip_serializing_if = "Option::is_none")]
426    pub vat_number: Option<String>,
427    #[serde(skip_serializing_if = "Option::is_none")]
428    pub zip_code: Option<String>,
429}
430
431/// Customizes the checkout page branding for one order.
432#[derive(Debug, Clone, Serialize, Deserialize, Default)]
433pub struct CheckoutDesignDTO {
434    #[serde(skip_serializing_if = "Option::is_none")]
435    pub input_background_color: Option<String>,
436    #[serde(skip_serializing_if = "Option::is_none")]
437    pub input_text_color: Option<String>,
438    #[serde(skip_serializing_if = "Option::is_none")]
439    pub label_text_color: Option<String>,
440    #[serde(skip_serializing_if = "Option::is_none")]
441    pub left_background_color: Option<String>,
442    #[serde(skip_serializing_if = "Option::is_none")]
443    pub logo: Option<String>,
444    /// Deprecated: checkout no longer renders custom order detail HTML; the value is ignored.
445    #[serde(skip_serializing_if = "Option::is_none")]
446    pub order_detail_html: Option<String>,
447    #[serde(skip_serializing_if = "Option::is_none")]
448    pub pay_button_color: Option<String>,
449    #[serde(skip_serializing_if = "Option::is_none")]
450    pub pay_button_text_color: Option<String>,
451    #[serde(skip_serializing_if = "Option::is_none")]
452    pub page_background_color: Option<String>,
453    #[serde(skip_serializing_if = "Option::is_none")]
454    pub border_color: Option<String>,
455    #[serde(skip_serializing_if = "Option::is_none")]
456    pub input_border_color: Option<String>,
457    #[serde(skip_serializing_if = "Option::is_none")]
458    pub accent_color: Option<String>,
459    #[serde(skip_serializing_if = "Option::is_none")]
460    pub text_muted_color: Option<String>,
461    #[serde(skip_serializing_if = "Option::is_none")]
462    pub surface_muted_color: Option<String>,
463    #[serde(skip_serializing_if = "Option::is_none")]
464    pub dark_mode_enabled: Option<bool>,
465    /// Colors used in dark mode, keyed by the light-mode field name.
466    #[serde(skip_serializing_if = "Option::is_none")]
467    pub dark_colors: Option<HashMap<String, String>>,
468    /// Deprecated: checkout design no longer carries a redirect URL; the value is ignored.
469    /// Use the order's `redirect_success_url` and `redirect_failure_url`.
470    #[serde(skip_serializing_if = "Option::is_none")]
471    pub redirect_url: Option<String>,
472    #[serde(skip_serializing_if = "Option::is_none")]
473    pub right_background_color: Option<String>,
474    #[serde(skip_serializing_if = "Option::is_none")]
475    pub text_color: Option<String>,
476}
477
478/// Selects a saved card for the order.
479#[derive(Debug, Clone, Serialize, Deserialize, Default)]
480pub struct OrderCardDTO {
481    pub card_id: String,
482    pub card_sequence: i32,
483}
484
485/// A payment term sent with the order. `due_date` is required and, like `paid_date`,
486/// must be an RFC3339 timestamp such as "2026-01-15T00:00:00Z".
487#[derive(Debug, Clone, Serialize, Deserialize, Default)]
488pub struct PaymentTermDTO {
489    #[serde(skip_serializing_if = "Option::is_none")]
490    pub amount: Option<f64>,
491    #[serde(skip_serializing_if = "Option::is_none")]
492    pub data: Option<String>,
493    #[serde(skip_serializing_if = "Option::is_none")]
494    pub due_date: Option<String>,
495    #[serde(skip_serializing_if = "Option::is_none")]
496    pub paid_date: Option<String>,
497    #[serde(skip_serializing_if = "Option::is_none")]
498    pub required: Option<bool>,
499    #[serde(skip_serializing_if = "Option::is_none")]
500    pub status: Option<String>,
501    #[serde(skip_serializing_if = "Option::is_none")]
502    pub term_reference_id: Option<String>,
503    #[serde(skip_serializing_if = "Option::is_none")]
504    pub term_sequence: Option<i32>,
505}
506
507/// A payment term as returned in the order detail.
508#[derive(Debug, Clone, Serialize, Deserialize, Default)]
509#[serde(default)]
510pub struct OrderPaymentTermDetail {
511    #[serde(skip_serializing_if = "Option::is_none")]
512    pub id: Option<String>,
513    #[serde(skip_serializing_if = "Option::is_none")]
514    pub hash_id: Option<String>,
515    #[serde(skip_serializing_if = "Option::is_none")]
516    pub term_sequence: Option<u64>,
517    #[serde(skip_serializing_if = "Option::is_none")]
518    pub required: Option<bool>,
519    #[serde(skip_serializing_if = "Option::is_none")]
520    pub due_date: Option<String>,
521    #[serde(skip_serializing_if = "Option::is_none")]
522    pub paid_date: Option<String>,
523    #[serde(skip_serializing_if = "Option::is_none")]
524    pub amount: Option<f64>,
525    #[serde(skip_serializing_if = "Option::is_none")]
526    pub term_reference_id: Option<String>,
527    #[serde(skip_serializing_if = "Option::is_none")]
528    pub status: Option<String>,
529    #[serde(skip_serializing_if = "Option::is_none")]
530    pub payments: Option<Vec<OrderItemPayment>>,
531    #[serde(skip_serializing_if = "Option::is_none")]
532    pub data: Option<String>,
533}
534
535/// A payment attempt recorded on an order.
536#[derive(Debug, Clone, Serialize, Deserialize, Default)]
537#[serde(default)]
538pub struct OrderPaymentRequest {
539    #[serde(skip_serializing_if = "Option::is_none")]
540    pub id: Option<String>,
541    #[serde(skip_serializing_if = "Option::is_none")]
542    pub date: Option<String>,
543    #[serde(skip_serializing_if = "Option::is_none")]
544    pub payment_mode: Option<String>,
545    #[serde(skip_serializing_if = "Option::is_none")]
546    pub amount: Option<String>,
547    #[serde(skip_serializing_if = "Option::is_none")]
548    pub card_hash: Option<String>,
549    #[serde(skip_serializing_if = "Option::is_none")]
550    pub masked_card: Option<String>,
551    #[serde(skip_serializing_if = "Option::is_none")]
552    pub paid: Option<bool>,
553    #[serde(rename = "type", skip_serializing_if = "Option::is_none")]
554    pub type_: Option<String>,
555}
556
557/// A refund or cancellation request recorded on an order.
558#[derive(Debug, Clone, Serialize, Deserialize, Default)]
559#[serde(default)]
560pub struct OrderRefundCancelRequest {
561    #[serde(skip_serializing_if = "Option::is_none")]
562    pub id: Option<String>,
563    #[serde(skip_serializing_if = "Option::is_none")]
564    pub amount: Option<String>,
565    #[serde(skip_serializing_if = "Option::is_none")]
566    pub status: Option<u64>,
567    #[serde(skip_serializing_if = "Option::is_none")]
568    pub reason: Option<String>,
569    #[serde(rename = "type", skip_serializing_if = "Option::is_none")]
570    pub type_: Option<u64>,
571    #[serde(skip_serializing_if = "Option::is_none")]
572    pub term_id: Option<String>,
573    #[serde(skip_serializing_if = "Option::is_none")]
574    pub item_id: Option<String>,
575    #[serde(skip_serializing_if = "Option::is_none")]
576    pub created_at: Option<String>,
577}
578
579#[derive(Debug, Clone, Serialize, Deserialize, Default)]
580pub struct OrderPFSubMerchantDTO {
581    #[serde(skip_serializing_if = "Option::is_none")]
582    pub address: Option<String>,
583    #[serde(skip_serializing_if = "Option::is_none")]
584    pub city: Option<String>,
585    #[serde(skip_serializing_if = "Option::is_none")]
586    pub country: Option<String>,
587    #[serde(skip_serializing_if = "Option::is_none")]
588    pub country_iso_code: Option<String>,
589    #[serde(skip_serializing_if = "Option::is_none")]
590    pub id: Option<String>,
591    #[serde(skip_serializing_if = "Option::is_none")]
592    pub mcc: Option<String>,
593    #[serde(skip_serializing_if = "Option::is_none")]
594    pub name: Option<String>,
595    #[serde(skip_serializing_if = "Option::is_none")]
596    pub national_id: Option<String>,
597    #[serde(skip_serializing_if = "Option::is_none")]
598    pub org_id: Option<String>,
599    #[serde(skip_serializing_if = "Option::is_none")]
600    pub postal_code: Option<String>,
601    #[serde(skip_serializing_if = "Option::is_none")]
602    pub submerchant_nin: Option<String>,
603    #[serde(skip_serializing_if = "Option::is_none")]
604    pub submerchant_url: Option<String>,
605    #[serde(skip_serializing_if = "Option::is_none")]
606    pub switch_id: Option<String>,
607    #[serde(skip_serializing_if = "Option::is_none")]
608    pub terminal_no: Option<String>,
609}
610
611#[derive(Debug, Clone, Serialize, Deserialize, Default)]
612pub struct ShippingAddressDTO {
613    #[serde(skip_serializing_if = "Option::is_none")]
614    pub address: Option<String>,
615    #[serde(skip_serializing_if = "Option::is_none")]
616    pub city: Option<String>,
617    #[serde(skip_serializing_if = "Option::is_none")]
618    pub contact_name: Option<String>,
619    #[serde(skip_serializing_if = "Option::is_none")]
620    pub country: Option<String>,
621    #[serde(skip_serializing_if = "Option::is_none")]
622    pub shipping_date: Option<String>,
623    #[serde(skip_serializing_if = "Option::is_none")]
624    pub tracking_code: Option<String>,
625    #[serde(skip_serializing_if = "Option::is_none")]
626    pub zip_code: Option<String>,
627}
628
629#[derive(Debug, Clone, Serialize, Deserialize, Default)]
630pub struct SubOrganizationDTO {
631    #[serde(skip_serializing_if = "Option::is_none")]
632    pub acquirer: Option<String>,
633    #[serde(skip_serializing_if = "Option::is_none")]
634    pub address: Option<String>,
635    #[serde(skip_serializing_if = "Option::is_none")]
636    pub contact_first_name: Option<String>,
637    #[serde(skip_serializing_if = "Option::is_none")]
638    pub contact_last_name: Option<String>,
639    #[serde(skip_serializing_if = "Option::is_none")]
640    pub currency: Option<String>,
641    #[serde(skip_serializing_if = "Option::is_none")]
642    pub email: Option<String>,
643    #[serde(skip_serializing_if = "Option::is_none")]
644    pub gsm_number: Option<String>,
645    #[serde(skip_serializing_if = "Option::is_none")]
646    pub iban: Option<String>,
647    #[serde(skip_serializing_if = "Option::is_none")]
648    pub identity_number: Option<String>,
649    #[serde(skip_serializing_if = "Option::is_none")]
650    pub legal_company_title: Option<String>,
651    #[serde(skip_serializing_if = "Option::is_none")]
652    pub organization_name: Option<String>,
653    #[serde(skip_serializing_if = "Option::is_none")]
654    pub sub_merchant_external_id: Option<String>,
655    #[serde(skip_serializing_if = "Option::is_none")]
656    pub sub_merchant_key: Option<String>,
657    #[serde(skip_serializing_if = "Option::is_none")]
658    pub sub_merchant_type: Option<String>,
659    #[serde(skip_serializing_if = "Option::is_none")]
660    pub tax_number: Option<String>,
661    #[serde(skip_serializing_if = "Option::is_none")]
662    pub tax_office: Option<String>,
663}
664
665#[derive(Debug, Clone, Serialize, Deserialize, Default)]
666pub struct SubmerchantDTO {
667    #[serde(skip_serializing_if = "Option::is_none")]
668    pub amount: Option<f64>,
669    #[serde(skip_serializing_if = "Option::is_none")]
670    pub merchant_reference_id: Option<String>,
671    #[serde(skip_serializing_if = "Option::is_none")]
672    pub order_basket_item_id: Option<String>,
673}
674
675#[derive(Debug, Clone, Serialize, Deserialize, Default)]
676pub struct OrderAccountingRequest {
677    #[serde(rename = "order_reference_id")]
678    pub order_reference_id: String,
679}
680
681#[derive(Debug, Clone, Serialize, Deserialize, Default)]
682pub struct OrderPostAuthRequest {
683    pub amount: f64,
684    #[serde(rename = "reference_id")]
685    pub reference_id: String,
686}
687
688/// Adds a payment term to an existing order. `due_date` and `paid_date` use the
689/// YYYY-MM-DD format.
690#[derive(Debug, Clone, Serialize, Deserialize, Default)]
691pub struct OrderPaymentTermCreateDTO {
692    /// The order's ID (`CreateOrderResponse::order_id`), not its reference ID.
693    pub order_id: String,
694    pub term_reference_id: String,
695    pub amount: f64,
696    pub due_date: String,
697    pub term_sequence: i32,
698    pub required: bool,
699    pub status: String,
700    #[serde(skip_serializing_if = "Option::is_none")]
701    pub data: Option<String>,
702    #[serde(skip_serializing_if = "Option::is_none")]
703    pub paid_date: Option<String>,
704}
705
706/// Replaces a payment term. The server stores every field as sent, so populate all of
707/// them, not only the ones that change. Dates use the YYYY-MM-DD format.
708#[derive(Debug, Clone, Serialize, Deserialize, Default)]
709pub struct OrderPaymentTermUpdateDTO {
710    pub term_reference_id: String,
711    #[serde(skip_serializing_if = "Option::is_none")]
712    pub amount: Option<f64>,
713    #[serde(skip_serializing_if = "Option::is_none")]
714    pub due_date: Option<String>,
715    #[serde(skip_serializing_if = "Option::is_none")]
716    pub paid_date: Option<String>,
717    #[serde(skip_serializing_if = "Option::is_none")]
718    pub required: Option<bool>,
719    #[serde(skip_serializing_if = "Option::is_none")]
720    pub status: Option<String>,
721    #[serde(skip_serializing_if = "Option::is_none")]
722    pub term_sequence: Option<i32>,
723}
724
725/// Refunds a payment made against a payment term.
726#[derive(Debug, Clone, Serialize, Deserialize, Default)]
727pub struct OrderTermRefundRequest {
728    /// The payment term's ID (`OrderPaymentTermDetail::id`).
729    pub term_id: String,
730    pub amount: f64,
731    /// The order's reference ID; the server requires it.
732    #[serde(skip_serializing_if = "Option::is_none")]
733    pub reference_id: Option<String>,
734    #[serde(skip_serializing_if = "Option::is_none")]
735    pub term_payment_id: Option<String>,
736}
737
738/// Selects orders for [`crate::TapsilatClient::get_order_list_with_filter`]. The server
739/// defaults `page` to 1 and `per_page` to 10 (at most 100) when they are zero.
740#[derive(Debug, Clone, Default)]
741pub struct OrderListFilter {
742    pub page: u32,
743    pub per_page: u32,
744    pub start_date: Option<String>,
745    pub end_date: Option<String>,
746    pub organization_id: Option<String>,
747    pub conversation_id: Option<String>,
748    pub related_reference_id: Option<String>,
749    pub buyer_id: Option<String>,
750    /// Numeric order status.
751    pub status: Option<i32>,
752}
753
754/// Selects the order whose payments to list; set at least one identifier.
755#[derive(Debug, Clone, Serialize, Deserialize, Default)]
756pub struct GetOrderPaymentsRequest {
757    #[serde(skip_serializing_if = "Option::is_none")]
758    pub order_id: Option<String>,
759    #[serde(skip_serializing_if = "Option::is_none")]
760    pub order_reference_id: Option<String>,
761    #[serde(skip_serializing_if = "Option::is_none")]
762    pub conversation_id: Option<String>,
763}
764
765/// A payment made against an order.
766#[derive(Debug, Clone, Serialize, Deserialize, Default)]
767#[serde(default)]
768pub struct OrderPayment {
769    pub id: String,
770    pub date: String,
771    pub payment_mode: String,
772    pub amount: f64,
773    pub card_id: String,
774    pub masked_card: String,
775    pub card_holder_name: String,
776    pub card_type: String,
777    pub card_brand: String,
778    pub card_bank: String,
779    pub card_network: String,
780    pub paid: bool,
781    #[serde(rename = "type")]
782    pub type_: String,
783    pub acquirer_response: String,
784    pub vpos_commission_amount: f64,
785    pub vpos_commission_rate: f64,
786    pub vpos_commission_fee_type: String,
787    pub organization_commission_amount: f64,
788    pub organization_commission_rate: f64,
789    pub organization_commission_fee_type: String,
790    pub total_amount: f64,
791    pub acquirer_commission_amount: f64,
792    pub acquirer_commission_rate: f64,
793    pub acquirer_commission_fee_type: String,
794    pub acquirer_name: String,
795    pub customer_paid_commission_amount: f64,
796    pub merchant_paid_commission_amount: f64,
797    pub merchant_net_amount: f64,
798}
799
800/// The payments made against an order, with totals.
801#[derive(Debug, Clone, Serialize, Deserialize, Default)]
802#[serde(default)]
803pub struct GetOrderPaymentsResponse {
804    pub payments: Vec<OrderPayment>,
805    pub total_amount: f64,
806    pub total_customer_paid_commission_amount: f64,
807    pub total_merchant_paid_commission_amount: f64,
808    pub total_merchant_net_amount: f64,
809    pub order_amount: f64,
810}
811
812/// A submerchant row returned by the order submerchant list.
813#[derive(Debug, Clone, Serialize, Deserialize, Default)]
814#[serde(default)]
815pub struct OrderSubmerchantListItem {
816    pub id: String,
817    pub name: String,
818    pub email: String,
819    pub submerchant_type: String,
820    pub submerchant_key: String,
821    pub labels: String,
822    pub status: String,
823    pub acquirer: String,
824}
825
826/// A page of order submerchants; the rows come in the `row` key.
827#[derive(Debug, Clone, Serialize, Deserialize, Default)]
828#[serde(default)]
829pub struct OrderSubmerchantListResponse {
830    pub page: i64,
831    pub per_page: i64,
832    pub total: i64,
833    pub total_pages: i64,
834    #[serde(rename = "row")]
835    pub rows: Vec<OrderSubmerchantListItem>,
836}
837
838/// Charges an order, for example with its saved card.
839#[derive(Debug, Clone, Serialize, Deserialize, Default)]
840pub struct OrderChargeRequest {
841    pub order_reference_id: String,
842    #[serde(skip_serializing_if = "std::ops::Not::not")]
843    pub retry: bool,
844}
845
846/// The charge result. The server sends these keys in camelCase, unlike most responses.
847#[derive(Debug, Clone, Serialize, Deserialize, Default)]
848#[serde(default, rename_all = "camelCase")]
849pub struct OrderChargeResponse {
850    pub is_success: bool,
851    pub message: String,
852    pub status_code: String,
853    pub error_code: String,
854}
855
856// Re-export Buyer from buyer.rs
857use crate::types::buyer::Buyer;
858pub use crate::types::buyer::CreateBuyerRequest;