libstripe/resources/core/
refunds.rs1use 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}