libstripe/resources/core/
refunds.rs

1use crate::resources::common::currency::Currency;
2use crate::resources::common::object::Object;
3
4use crate::resources::common::path::UrlPath;
5use crate::util::{List, Expandable};
6use crate::{Client};
7use std::collections::HashMap;
8use crate::resources::core::balance::BalanceTransaction;
9use crate::resources::core::charges::Charge;
10use crate::resources::connect::transfer_reversal::TransferReversal;
11
12#[derive(Serialize, Deserialize, Debug, PartialEq)]
13pub struct Refund {
14    pub id: String,
15    pub object: Object,
16    pub amount: i32,
17    pub balance_transaction: Expandable<BalanceTransaction>,
18    pub charge: Expandable<Charge>,
19    pub created: i64,
20    pub currency: Currency,
21    pub metadata: HashMap<String, String>,
22    pub reason: Option<RefundReason>,
23    pub failure_balance_transaction: Option<Expandable<BalanceTransaction>>,
24    pub failure_reason: Option<FailureReason>,
25    pub source_transfer_reversal: Option<Expandable<TransferReversal>>,
26    pub transfer_reversal: Option<Expandable<TransferReversal>>,
27    pub receipt_number: Option<String>,
28    pub status: RefundStatus,
29}
30
31#[derive(Serialize, Deserialize, Debug, PartialEq)]
32#[serde(rename_all = "snake_case")]
33pub enum RefundReason {
34    Duplicate,
35    Fraudulent,
36    RequestedByCustomer,
37}
38
39#[derive(Serialize, Deserialize, Debug, PartialEq)]
40#[serde(rename_all = "snake_case")]
41pub enum FailureReason {
42    LostOrStolenCard,
43    ExpiredOrCanceledCard,
44    Unknown,
45}
46
47#[derive(Serialize, Deserialize, Debug, PartialEq)]
48#[serde(rename_all = "lowercase")]
49pub enum RefundStatus {
50    Succeeded,
51    Pending,
52    Failed,
53    Cancelled,
54}
55
56#[derive(Default, Serialize, Debug, PartialEq)]
57pub struct RefundParam<'a> {
58    #[serde(skip_serializing_if = "Option::is_none")]
59    pub charge: Option<&'a str>,
60    #[serde(skip_serializing_if = "Option::is_none")]
61    pub amount: Option<i32>,
62    #[serde(skip_serializing_if = "Option::is_none")]
63    pub metadata: Option<HashMap<&'a str, &'a str>>,
64    #[serde(skip_serializing_if = "Option::is_none")]
65    pub reason: Option<RefundReason>,
66    #[serde(skip_serializing_if = "Option::is_none")]
67    pub refund_application_fee: Option<bool>,
68    #[serde(skip_serializing_if = "Option::is_none")]
69    pub reverse_transfer: Option<bool>,
70    #[serde(skip_serializing_if = "Option::is_none")]
71    pub expand: Option<Vec<&'a str>>,
72}
73
74impl Refund {
75    pub fn create<B: serde::Serialize>(client: &Client, param: B) -> crate::Result<Self> {
76        client.post(UrlPath::Refunds, vec![], param)
77    }
78
79    pub fn retrieve(client: &Client, id: &str) -> crate::Result<Self> {
80        client.get(UrlPath::Refunds, vec![id], serde_json::Map::new())
81    }
82
83    pub fn update<B: serde::Serialize>(client: &Client, id: &str, param: B) -> crate::Result<Self> {
84        client.post(UrlPath::Refunds, vec![id], param)
85    }
86
87    pub fn list<B: serde::Serialize>(client: &Client, param: B) -> crate::Result<List<Self>> {
88        client.get(UrlPath::Refunds, vec![], param)
89    }
90}