This commit is contained in:
Edgar 2022-04-08 17:04:30 +02:00
parent b1f97b13da
commit aa5cdf3e01
No known key found for this signature in database
GPG key ID: 8731E6C0166EAA85
6 changed files with 307 additions and 248 deletions

View file

@ -6,195 +6,265 @@
//! //!
//! Reference: https://developer.paypal.com/docs/api/invoicing/v2/ //! Reference: https://developer.paypal.com/docs/api/invoicing/v2/
use std::borrow::Cow;
/* use derive_builder::Builder;
use serde::Serialize;
use crate::{
data::{
invoice::{Invoice, InvoiceList, InvoicePayload, CancelReason},
orders::InvoiceNumber,
},
endpoint::Endpoint,
Query,
};
/// Generates the next invoice number that is available to the merchant.
///
/// The next invoice number uses the prefix and suffix from the last invoice number and increments the number by one.
///
/// For example, the next invoice number after `INVOICE-1234` is `INVOICE-1235`.
#[derive(Debug, Default, Clone)]
pub struct GenerateInvoiceNumber {
pub invoice_number: Option<InvoiceNumber>,
}
impl GenerateInvoiceNumber {
pub fn new(invoice_number: Option<InvoiceNumber>) -> Self {
Self { invoice_number }
}
}
impl Endpoint for GenerateInvoiceNumber {
type Query = ();
type Body = Option<InvoiceNumber>;
type Response = InvoiceNumber;
fn relative_path(&self) -> Cow<str> {
Cow::Borrowed("/v2/invoicing/generate-next-invoice-number")
}
fn method(&self) -> reqwest::Method {
reqwest::Method::POST
}
fn body(&self) -> Option<&Self::Body> {
Some(&self.invoice_number)
}
}
/// Creates a draft invoice. To move the invoice from a draft to payable state, you must send the invoice.
/// Include invoice details including merchant information. The invoice object must include an items array.
#[derive(Debug, Clone)]
pub struct CreateDraftInvoice {
pub invoice: InvoicePayload,
}
impl CreateDraftInvoice {
pub fn new(invoice: InvoicePayload) -> Self {
Self { invoice }
}
}
impl Endpoint for CreateDraftInvoice {
type Query = ();
type Body = InvoicePayload;
type Response = Invoice;
fn relative_path(&self) -> Cow<str> {
Cow::Borrowed("/v2/invoicing/invoices")
}
fn method(&self) -> reqwest::Method {
reqwest::Method::POST
}
fn body(&self) -> Option<&Self::Body> {
Some(&self.invoice)
}
}
/// Get an invoice by ID.
#[derive(Debug, Clone)]
pub struct GetInvoice {
pub invoice_id: String,
}
impl GetInvoice {
pub fn new(invoice_id: String) -> Self {
Self { invoice_id }
}
}
impl Endpoint for GetInvoice {
type Query = ();
type Body = ();
type Response = Invoice;
fn relative_path(&self) -> Cow<str> {
Cow::Owned(format!("/v2/invoicing/invoices/{}", self.invoice_id))
}
fn method(&self) -> reqwest::Method {
reqwest::Method::GET
}
}
/// List invoices
/// Page size has the following limits: [1, 100].
#[derive(Debug, Clone)]
pub struct ListInvoices {
pub query: Query,
}
impl ListInvoices {
pub fn new(query: Query) -> Self {
Self { query }
}
}
impl Endpoint for ListInvoices {
type Query = Query;
type Body = ();
type Response = InvoiceList;
fn relative_path(&self) -> Cow<str> {
Cow::Borrowed("/v2/invoicing/invoices")
}
fn method(&self) -> reqwest::Method {
reqwest::Method::GET
}
fn query(&self) -> Option<&Self::Query> {
Some(&self.query)
}
}
/// Delete an invoice
#[derive(Debug, Clone)]
pub struct DeleteInvoice {
pub invoice_id: String,
}
impl DeleteInvoice {
pub fn new(invoice_id: String) -> Self {
Self { invoice_id }
}
}
impl Endpoint for DeleteInvoice {
type Query = Query;
type Body = ();
type Response = ();
fn relative_path(&self) -> Cow<str> {
Cow::Owned(format!("/v2/invoicing/invoices/{}", self.invoice_id))
}
fn method(&self) -> reqwest::Method {
reqwest::Method::DELETE
}
}
#[derive(Debug, Clone, Serialize, Builder)]
pub struct UpdateInvoiceQuery {
pub send_to_recipient: bool,
pub send_to_invoicer: bool,
}
/// Update an invoice.
///
/// Fully updates an invoice, by ID. In the JSON request body, include a complete invoice object. This call does not support partial updates.
#[derive(Debug, Clone)]
pub struct UpdateInvoice {
pub invoice: Invoice,
pub query: UpdateInvoiceQuery,
}
impl UpdateInvoice {
pub fn new(invoice: Invoice, query: UpdateInvoiceQuery) -> Self {
Self {
invoice,
query
}
}
}
impl Endpoint for UpdateInvoice {
type Query = UpdateInvoiceQuery;
type Body = Invoice;
type Response = Invoice;
fn relative_path(&self) -> Cow<str> {
Cow::Owned(format!("/v2/invoicing/invoices/{}", self.invoice.id))
}
fn method(&self) -> reqwest::Method {
reqwest::Method::PUT
}
fn body(&self) -> Option<&Self::Body> {
Some(&self.invoice)
}
fn query(&self) -> Option<&Self::Query> {
Some(&self.query)
}
}
/// Cancel an invoice.
#[derive(Debug, Clone)]
pub struct CancelInvoice {
pub invoice_id: String,
pub reason: CancelReason
}
impl CancelInvoice {
pub fn new(invoice_id: String, reason: CancelReason) -> Self {
Self {
invoice_id,
reason
}
}
}
impl Endpoint for CancelInvoice {
type Query = ();
type Body = CancelReason;
type Response = ();
fn relative_path(&self) -> Cow<str> {
Cow::Owned(format!("/v2/invoicing/invoices/{}/cancel", self.invoice_id))
}
fn method(&self) -> reqwest::Method {
reqwest::Method::POST
}
fn body(&self) -> Option<&Self::Body> {
Some(&self.reason)
}
}
/*
impl super::Client { impl super::Client {
/// Generates the next invoice number that is available to the merchant.
///
/// The next invoice number uses the prefix and suffix from the last invoice number and increments the number by one.
///
/// For example, the next invoice number after `INVOICE-1234` is `INVOICE-1235`.
pub async fn generate_invoice_number(
&mut self,
header_params: crate::HeaderParams,
) -> Result<String, ResponseError> {
let build = self
.setup_headers(
self.client
.post(format!("{}/v2/invoicing/generate-next-invoice-number", self.endpoint()).as_str()),
header_params,
)
.await;
let res = build.send().await?;
if res.status().is_success() {
let x = res.json::<HashMap<String, String>>().await?;
Ok(x.get("invoice_number").expect("to have a invoice number").clone())
} else {
Err(res.json::<PaypalError>().await?.into())
}
}
/// Creates a draft invoice. To move the invoice from a draft to payable state, you must send the invoice.
/// Include invoice details including merchant information. The invoice object must include an items array.
pub async fn create_draft_invoice(
&mut self,
invoice: InvoicePayload,
header_params: HeaderParams,
) -> Result<Invoice, ResponseError> {
let build = self
.setup_headers(
self.client
.post(format!("{}/v2/invoicing/invoices", self.endpoint()).as_str()),
header_params,
)
.await;
let res = build.json(&invoice).send().await?;
if res.status().is_success() {
//println!("{:#?}", res.text().await?);
let inv = res.json::<Invoice>().await?;
Ok(inv)
} else {
Err(res.json::<PaypalError>().await?.into())
}
}
/// Get an invoice by ID.
pub async fn get_invoice(
&mut self,
invoice_id: &str,
header_params: HeaderParams,
) -> Result<Invoice, ResponseError> {
let build = self
.setup_headers(
self.client
.post(format!("{}/v2/invoicing/invoices/{}", self.endpoint(), invoice_id).as_str()),
header_params,
)
.await;
let res = build.send().await?;
if res.status().is_success() {
let x = res.json::<Invoice>().await?;
Ok(x)
} else {
Err(res.json::<PaypalError>().await?.into())
}
}
/// List invoices
/// Page size has the following limits: [1, 100].
pub async fn list_invoices(
&mut self,
page: i32,
page_size: i32,
header_params: HeaderParams,
) -> Result<InvoiceList, ResponseError> {
let build = self
.setup_headers(
self.client.get(
format!(
"{}/v2/invoicing/invoices?page={}&page_size={}&total_required=true",
self.endpoint(),
page,
page_size
)
.as_str(),
),
header_params,
)
.await;
let res = build.send().await?;
if res.status().is_success() {
let x = res.json::<InvoiceList>().await?;
Ok(x)
} else {
Err(res.json::<PaypalError>().await?.into())
}
}
/// Delete a invoice
pub async fn delete_invoice(&mut self, invoice_id: &str, header_params: HeaderParams) -> Result<(), ResponseError> {
let build = self
.setup_headers(
self.client
.delete(format!("{}/v2/invoicing/invoices/{}", self.endpoint(), invoice_id).as_str()),
header_params,
)
.await;
let res = build.send().await?;
if res.status().is_success() {
Ok(())
} else {
Err(res.json::<PaypalError>().await?.into())
}
}
/// Update a invoice
pub async fn update_invoice(
&mut self,
invoice: Invoice,
send_to_recipient: bool,
send_to_invoicer: bool,
header_params: HeaderParams,
) -> Result<(), ResponseError> {
let build = self
.setup_headers(
self.client.put(
format!(
"{}/v2/invoicing/invoices/{}?send_to_recipient={}&send_to_invoicer={}",
self.endpoint(),
invoice.id,
send_to_recipient,
send_to_invoicer
)
.as_str(),
),
header_params,
)
.await;
let res = build.send().await?;
if res.status().is_success() {
Ok(())
} else {
Err(res.json::<PaypalError>().await?.into())
}
}
/// Cancel a invoice
pub async fn cancel_invoice(
&mut self,
invoice_id: &str,
reason: CancelReason,
header_params: HeaderParams,
) -> Result<(), ResponseError> {
let build = self
.setup_headers(
self.client
.post(format!("{}/v2/invoicing/invoices/{}/cancel", self.endpoint(), invoice_id,).as_str()),
header_params,
)
.await;
let res = build.json(&reason).send().await?;
if res.status().is_success() {
Ok(())
} else {
Err(res.json::<PaypalError>().await?.into())
}
}
/// Generate a QR code /// Generate a QR code
pub async fn generate_qr_code( pub async fn generate_qr_code(
@ -276,4 +346,4 @@ mod tests {
} }
} }
*/ */

View file

@ -1,3 +1,7 @@
//! An order represents a payment between two or more parties. Use the Orders API to create, update, retrieve, authorize, and capture orders.
//!
//! https://developer.paypal.com/docs/api/orders/v2/
use std::borrow::Cow; use std::borrow::Cow;
use crate::{ use crate::{

View file

@ -6,7 +6,7 @@ use std::time::Instant;
use crate::{ use crate::{
endpoint::Endpoint, endpoint::Endpoint,
errors::{PaypalError, ResponseError}, errors::{PaypalError, ResponseError},
AuthAssertionClaims, HeaderParams, Prefer, LIVE_ENDPOINT, SANDBOX_ENDPOINT, AuthAssertionClaims, HeaderParams, LIVE_ENDPOINT, SANDBOX_ENDPOINT,
}; };
/// Represents the access token returned by the OAuth2 authentication. /// Represents the access token returned by the OAuth2 authentication.
@ -140,10 +140,7 @@ impl Client {
headers.append("PayPal-Request-Id", request_id.parse().unwrap()); headers.append("PayPal-Request-Id", request_id.parse().unwrap());
} }
match header_params.prefer { headers.append("Prefer", "return=representation".parse().unwrap());
Prefer::Minimal => headers.append("Prefer", "return=minimal".parse().unwrap()),
Prefer::Representation => headers.append("Prefer", "return=representation".parse().unwrap()),
};
if let Some(content_type) = header_params.content_type { if let Some(content_type) = header_params.content_type {
headers.append(header::CONTENT_TYPE, content_type.parse().unwrap()); headers.append(header::CONTENT_TYPE, content_type.parse().unwrap());

View file

@ -1,9 +1,10 @@
use crate::{data::common::*, data::common::LinkDescription}; use crate::{data::common::*, data::common::LinkDescription};
use derive_builder::Builder;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use serde_with::skip_serializing_none; use serde_with::skip_serializing_none;
/// Paypal File reference /// Paypal File reference
#[derive(Debug, Serialize, Deserialize)] #[derive(Debug, Serialize, Deserialize, Clone)]
pub struct FileReference { pub struct FileReference {
/// The ID of the referenced file. /// The ID of the referenced file.
pub id: String, pub id: String,
@ -17,7 +18,7 @@ pub struct FileReference {
pub size: String, pub size: String,
} }
#[derive(Debug, Serialize, Deserialize, Eq, PartialEq)] #[derive(Debug, Serialize, Deserialize, Eq, PartialEq, Clone)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")] #[serde(rename_all = "SCREAMING_SNAKE_CASE")]
/// The payment term type. /// The payment term type.
pub enum PaymentTermType { pub enum PaymentTermType {
@ -42,7 +43,7 @@ pub enum PaymentTermType {
} }
/// The payment due date for the invoice. /// The payment due date for the invoice.
#[derive(Debug, Serialize, Deserialize)] #[derive(Debug, Serialize, Deserialize, Clone)]
pub struct PaymentTerm { pub struct PaymentTerm {
/// The payment term. Payment can be due upon receipt, a specified date, or in a set number of days /// The payment term. Payment can be due upon receipt, a specified date, or in a set number of days
pub term_type: PaymentTermType, pub term_type: PaymentTermType,
@ -51,7 +52,7 @@ pub struct PaymentTerm {
} }
/// Flow type /// Flow type
#[derive(Debug, Serialize, Deserialize, Eq, PartialEq)] #[derive(Debug, Serialize, Deserialize, Eq, PartialEq, Clone)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")] #[serde(rename_all = "SCREAMING_SNAKE_CASE")]
/// The flow variation /// The flow variation
pub enum FlowType { pub enum FlowType {
@ -65,7 +66,7 @@ pub enum FlowType {
/// Metadata about a resource /// Metadata about a resource
#[skip_serializing_none] #[skip_serializing_none]
#[derive(Debug, Serialize, Deserialize, Default)] #[derive(Debug, Serialize, Deserialize, Default, Clone)]
pub struct Metadata { pub struct Metadata {
/// The date and time when the resource was created /// The date and time when the resource was created
pub create_time: Option<chrono::DateTime<chrono::Utc>>, pub create_time: Option<chrono::DateTime<chrono::Utc>>,
@ -95,7 +96,7 @@ pub struct Metadata {
/// The details of the invoice. Includes the invoice number, date, payment terms, and audit metadata. /// The details of the invoice. Includes the invoice number, date, payment terms, and audit metadata.
#[skip_serializing_none] #[skip_serializing_none]
#[derive(Debug, Serialize, Deserialize, Default)] #[derive(Debug, Serialize, Deserialize, Default, Clone)]
pub struct InvoiceDetail { pub struct InvoiceDetail {
/// The reference data. Includes a post office (PO) number. /// The reference data. Includes a post office (PO) number.
pub reference: Option<String>, pub reference: Option<String>,
@ -121,7 +122,7 @@ pub struct InvoiceDetail {
/// A name to be used as recipient, etc. /// A name to be used as recipient, etc.
#[skip_serializing_none] #[skip_serializing_none]
#[derive(Debug, Serialize, Deserialize, Default)] #[derive(Debug, Serialize, Deserialize, Default, Clone)]
pub struct Name { pub struct Name {
/// The prefix, or title, to the party's name. /// The prefix, or title, to the party's name.
pub prefix: Option<String>, pub prefix: Option<String>,
@ -144,7 +145,7 @@ pub struct Name {
/// Phone information /// Phone information
#[skip_serializing_none] #[skip_serializing_none]
#[derive(Debug, Serialize, Deserialize, Default)] #[derive(Debug, Serialize, Deserialize, Default, Clone)]
pub struct PhoneDetail { pub struct PhoneDetail {
/// The country calling code (CC), in its canonical international E.164 numbering plan format. /// The country calling code (CC), in its canonical international E.164 numbering plan format.
pub country_code: String, pub country_code: String,
@ -158,7 +159,7 @@ pub struct PhoneDetail {
/// The invoicer information. /// The invoicer information.
#[skip_serializing_none] #[skip_serializing_none]
#[derive(Debug, Serialize, Deserialize, Default)] #[derive(Debug, Serialize, Deserialize, Default, Clone)]
pub struct InvoicerInfo { pub struct InvoicerInfo {
/// Required. The business name of the party. /// Required. The business name of the party.
pub business_name: String, pub business_name: String,
@ -181,7 +182,7 @@ pub struct InvoicerInfo {
/// Billing information /// Billing information
#[skip_serializing_none] #[skip_serializing_none]
#[derive(Debug, Serialize, Deserialize, Default)] #[derive(Debug, Serialize, Deserialize, Default, Clone)]
pub struct BillingInfo { pub struct BillingInfo {
/// Required. The business name of the party. /// Required. The business name of the party.
pub business_name: String, pub business_name: String,
@ -201,7 +202,7 @@ pub struct BillingInfo {
/// Contact information /// Contact information
#[skip_serializing_none] #[skip_serializing_none]
#[derive(Debug, Serialize, Deserialize)] #[derive(Debug, Serialize, Deserialize, Clone)]
pub struct ContactInformation { pub struct ContactInformation {
/// Required. The business name of the party. /// Required. The business name of the party.
pub business_name: String, pub business_name: String,
@ -213,7 +214,7 @@ pub struct ContactInformation {
/// Recipient information /// Recipient information
#[skip_serializing_none] #[skip_serializing_none]
#[derive(Debug, Serialize, Deserialize, Default)] #[derive(Debug, Serialize, Deserialize, Default, Clone)]
pub struct RecipientInfo { pub struct RecipientInfo {
/// The billing information for the invoice recipient. Includes name, address, email, phone, and language. /// The billing information for the invoice recipient. Includes name, address, email, phone, and language.
pub billing_info: Option<BillingInfo>, pub billing_info: Option<BillingInfo>,
@ -223,7 +224,7 @@ pub struct RecipientInfo {
/// Tax information /// Tax information
#[skip_serializing_none] #[skip_serializing_none]
#[derive(Debug, Serialize, Deserialize)] #[derive(Debug, Serialize, Deserialize, Clone)]
pub struct Tax { pub struct Tax {
/// The name of the tax applied on the invoice items. /// The name of the tax applied on the invoice items.
pub name: String, pub name: String,
@ -234,7 +235,7 @@ pub struct Tax {
} }
/// Discount information /// Discount information
#[derive(Debug, Serialize, Deserialize)] #[derive(Debug, Serialize, Deserialize, Clone)]
pub struct Discount { pub struct Discount {
/// The discount as a percentage value. Value is from 0 to 100. Supports up to five decimal places. /// The discount as a percentage value. Value is from 0 to 100. Supports up to five decimal places.
pub percent: Option<String>, pub percent: Option<String>,
@ -243,7 +244,7 @@ pub struct Discount {
} }
/// The unit of measure for the invoiced item. /// The unit of measure for the invoiced item.
#[derive(Debug, Serialize, Deserialize, Eq, PartialEq)] #[derive(Debug, Serialize, Deserialize, Eq, PartialEq, Clone)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")] #[serde(rename_all = "SCREAMING_SNAKE_CASE")]
pub enum UnitOfMeasure { pub enum UnitOfMeasure {
/// The unit of measure is quantity. This invoice template is typically used for physical goods. /// The unit of measure is quantity. This invoice template is typically used for physical goods.
@ -256,7 +257,7 @@ pub enum UnitOfMeasure {
/// Item information /// Item information
#[skip_serializing_none] #[skip_serializing_none]
#[derive(Debug, Serialize, Deserialize)] #[derive(Debug, Serialize, Deserialize, Clone)]
pub struct Item { pub struct Item {
/// The ID of the invoice line item. /// The ID of the invoice line item.
/// Read only. /// Read only.
@ -281,7 +282,7 @@ pub struct Item {
/// The partial payment details. /// The partial payment details.
#[skip_serializing_none] #[skip_serializing_none]
#[derive(Debug, Serialize, Deserialize)] #[derive(Debug, Serialize, Deserialize, Clone)]
pub struct PartialPayment { pub struct PartialPayment {
/// Indicates whether the invoice allows a partial payment. If false, the invoice must be paid in full. If true, the invoice allows partial payments. /// Indicates whether the invoice allows a partial payment. If false, the invoice must be paid in full. If true, the invoice allows partial payments.
pub allow_partial_payment: Option<bool>, pub allow_partial_payment: Option<bool>,
@ -291,7 +292,7 @@ pub struct PartialPayment {
/// The invoice configuration details. Includes partial payment, tip, and tax calculated after discount. /// The invoice configuration details. Includes partial payment, tip, and tax calculated after discount.
#[skip_serializing_none] #[skip_serializing_none]
#[derive(Debug, Serialize, Deserialize)] #[derive(Debug, Serialize, Deserialize, Clone)]
pub struct Configuration { pub struct Configuration {
/// Indicates whether the tax is calculated before or after a discount. If false, the tax is calculated before a discount. If true, the tax is calculated after a discount. /// Indicates whether the tax is calculated before or after a discount. If false, the tax is calculated before a discount. If true, the tax is calculated after a discount.
pub tax_calculated_after_discount: Option<bool>, pub tax_calculated_after_discount: Option<bool>,
@ -308,7 +309,7 @@ pub struct Configuration {
/// The discount /// The discount
#[skip_serializing_none] #[skip_serializing_none]
#[derive(Debug, Default, Serialize, Deserialize)] #[derive(Debug, Default, Serialize, Deserialize, Clone)]
pub struct AggregatedDiscount { pub struct AggregatedDiscount {
/// The discount as a percent or amount at invoice level. The invoice discount amount is subtracted from the item total. /// The discount as a percent or amount at invoice level. The invoice discount amount is subtracted from the item total.
pub invoice_discount: Option<Discount>, pub invoice_discount: Option<Discount>,
@ -317,7 +318,7 @@ pub struct AggregatedDiscount {
} }
/// The shipping fee /// The shipping fee
#[derive(Debug, Default, Serialize, Deserialize)] #[derive(Debug, Default, Serialize, Deserialize, Clone)]
pub struct ShippingCost { pub struct ShippingCost {
/// The shipping amount. Value is from 0 to 1000000. Supports up to two decimal places. /// The shipping amount. Value is from 0 to 1000000. Supports up to two decimal places.
pub amount: Option<Money>, pub amount: Option<Money>,
@ -327,7 +328,7 @@ pub struct ShippingCost {
/// The custom amount to apply to an invoice /// The custom amount to apply to an invoice
#[skip_serializing_none] #[skip_serializing_none]
#[derive(Debug, Default, Serialize, Deserialize)] #[derive(Debug, Default, Serialize, Deserialize, Clone)]
pub struct CustomAmount { pub struct CustomAmount {
/// The label to the custom amount of the invoice. /// The label to the custom amount of the invoice.
pub label: String, pub label: String,
@ -337,7 +338,7 @@ pub struct CustomAmount {
/// The breakdown of the amount. Breakdown provides details such as total item amount, total tax amount, custom amount, shipping and discounts, if any. /// The breakdown of the amount. Breakdown provides details such as total item amount, total tax amount, custom amount, shipping and discounts, if any.
#[skip_serializing_none] #[skip_serializing_none]
#[derive(Debug, Default, Serialize, Deserialize)] #[derive(Debug, Default, Serialize, Deserialize, Clone)]
pub struct Breakdown { pub struct Breakdown {
/// The subtotal for all items. Must equal the sum of (items[].unit_amount * items[].quantity) for all items. /// The subtotal for all items. Must equal the sum of (items[].unit_amount * items[].quantity) for all items.
pub item_total: Option<Money>, pub item_total: Option<Money>,
@ -353,7 +354,7 @@ pub struct Breakdown {
/// Represents an amount of money. /// Represents an amount of money.
#[skip_serializing_none] #[skip_serializing_none]
#[derive(Debug, Default, Serialize, Deserialize)] #[derive(Debug, Default, Serialize, Deserialize, Clone)]
pub struct Amount { pub struct Amount {
/// The [three-character ISO-4217 currency code](https://developer.paypal.com/docs/integration/direct/rest/currency-codes/) that identifies the currency. /// The [three-character ISO-4217 currency code](https://developer.paypal.com/docs/integration/direct/rest/currency-codes/) that identifies the currency.
pub currency_code: Currency, pub currency_code: Currency,
@ -379,7 +380,7 @@ impl Amount {
} }
/// The payment type in an invoicing flow /// The payment type in an invoicing flow
#[derive(Debug, Serialize, Deserialize, Eq, PartialEq)] #[derive(Debug, Serialize, Deserialize, Eq, PartialEq, Copy, Clone)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")] #[serde(rename_all = "SCREAMING_SNAKE_CASE")]
pub enum PaymentType { pub enum PaymentType {
/// The payment type is PayPal. /// The payment type is PayPal.
@ -389,7 +390,7 @@ pub enum PaymentType {
} }
/// The payment mode or method through which the invoicer can accept the payment. /// The payment mode or method through which the invoicer can accept the payment.
#[derive(Debug, Serialize, Deserialize, Eq, PartialEq)] #[derive(Debug, Serialize, Deserialize, Eq, PartialEq, Copy, Clone)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")] #[serde(rename_all = "SCREAMING_SNAKE_CASE")]
pub enum PaymentMethod { pub enum PaymentMethod {
/// Payments can be received through bank transfers. /// Payments can be received through bank transfers.
@ -418,7 +419,7 @@ impl Default for PaymentMethod {
/// Payment detail /// Payment detail
#[skip_serializing_none] #[skip_serializing_none]
#[derive(Debug, Serialize, Deserialize)] #[derive(Debug, Serialize, Deserialize, Clone)]
pub struct PaymentDetail { pub struct PaymentDetail {
/// The payment type in an invoicing flow which can be PayPal or an external cash or check payment. /// The payment type in an invoicing flow which can be PayPal or an external cash or check payment.
pub r#type: Option<PaymentType>, pub r#type: Option<PaymentType>,
@ -438,7 +439,7 @@ pub struct PaymentDetail {
/// Payments registered against the invoice /// Payments registered against the invoice
#[skip_serializing_none] #[skip_serializing_none]
#[derive(Debug, Default, Serialize, Deserialize)] #[derive(Debug, Default, Serialize, Deserialize, Clone)]
pub struct Payments { pub struct Payments {
/// The aggregated payment amounts against this invoice. /// The aggregated payment amounts against this invoice.
/// Read only. /// Read only.
@ -450,7 +451,7 @@ pub struct Payments {
/// Refund details /// Refund details
#[skip_serializing_none] #[skip_serializing_none]
#[derive(Debug, Serialize, Deserialize)] #[derive(Debug, Serialize, Deserialize, Clone)]
pub struct RefundDetail { pub struct RefundDetail {
/// The PayPal refund type. Indicates whether the refund was paid through PayPal or externally in the invoicing flow. /// The PayPal refund type. Indicates whether the refund was paid through PayPal or externally in the invoicing flow.
pub r#type: Option<PaymentType>, pub r#type: Option<PaymentType>,
@ -466,7 +467,7 @@ pub struct RefundDetail {
/// List of refunds /// List of refunds
#[skip_serializing_none] #[skip_serializing_none]
#[derive(Debug, Serialize, Deserialize, Default)] #[derive(Debug, Serialize, Deserialize, Default, Clone)]
pub struct Refunds { pub struct Refunds {
/// The aggregated refund amounts. /// The aggregated refund amounts.
/// Read only. /// Read only.
@ -477,7 +478,7 @@ pub struct Refunds {
} }
/// The status of the invoice /// The status of the invoice
#[derive(Debug, Serialize, Deserialize, Eq, PartialEq)] #[derive(Debug, Serialize, Deserialize, Eq, PartialEq, Copy, Clone)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")] #[serde(rename_all = "SCREAMING_SNAKE_CASE")]
pub enum Status { pub enum Status {
/// The invoice is in draft state. It is not yet sent to the payer. /// The invoice is in draft state. It is not yet sent to the payer.
@ -508,7 +509,7 @@ pub enum Status {
/// An invoice payload /// An invoice payload
#[skip_serializing_none] #[skip_serializing_none]
#[derive(Debug, Serialize, Deserialize, Default)] #[derive(Debug, Serialize, Deserialize, Default, Clone)]
pub struct InvoicePayload { pub struct InvoicePayload {
/// The details of the invoice. Includes the invoice number, date, payment terms, and audit metadata. /// The details of the invoice. Includes the invoice number, date, payment terms, and audit metadata.
pub detail: InvoiceDetail, pub detail: InvoiceDetail,
@ -533,7 +534,7 @@ pub struct InvoicePayload {
/// Definition: https://developer.paypal.com/docs/api/invoicing/v2/#invoices_get /// Definition: https://developer.paypal.com/docs/api/invoicing/v2/#invoices_get
#[skip_serializing_none] #[skip_serializing_none]
#[derive(Debug, Serialize, Deserialize)] #[derive(Debug, Serialize, Deserialize, Clone)]
pub struct Invoice { pub struct Invoice {
/// The ID of the invoice. /// The ID of the invoice.
pub id: String, pub id: String,
@ -583,7 +584,7 @@ pub struct InvoiceList {
/// Cancel invoice reason /// Cancel invoice reason
#[skip_serializing_none] #[skip_serializing_none]
#[derive(Debug, Serialize, Deserialize, Default)] #[derive(Debug, Serialize, Deserialize, Default, Clone, Builder)]
pub struct CancelReason { pub struct CancelReason {
/// The subject of the email that is sent as a notification to the recipient. /// The subject of the email that is sent as a notification to the recipient.
pub subject: Option<String>, pub subject: Option<String>,

View file

@ -602,7 +602,7 @@ impl OrderPayload {
} }
/// The card brand or network. /// The card brand or network.
#[derive(Debug, Serialize, Deserialize, Eq, PartialEq)] #[derive(Debug, Serialize, Deserialize, Eq, PartialEq, Copy, Clone)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")] #[serde(rename_all = "SCREAMING_SNAKE_CASE")]
pub enum CardBrand { pub enum CardBrand {
/// Visa card. /// Visa card.
@ -639,7 +639,7 @@ pub enum CardBrand {
ChinaUnionPay, ChinaUnionPay,
} }
#[derive(Debug, Serialize, Deserialize, Eq, PartialEq)] #[derive(Debug, Serialize, Deserialize, Eq, PartialEq, Clone, Copy)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")] #[serde(rename_all = "SCREAMING_SNAKE_CASE")]
#[allow(missing_docs)] #[allow(missing_docs)]
pub enum CardType { pub enum CardType {
@ -650,7 +650,7 @@ pub enum CardType {
} }
/// The payment card to use to fund a payment. /// The payment card to use to fund a payment.
#[derive(Debug, Serialize, Deserialize)] #[derive(Debug, Serialize, Deserialize, Clone)]
pub struct CardResponse { pub struct CardResponse {
/// The last digits of the payment card. /// The last digits of the payment card.
pub last_digits: String, pub last_digits: String,
@ -662,7 +662,7 @@ pub struct CardResponse {
} }
/// The customer's wallet used to fund the transaction. /// The customer's wallet used to fund the transaction.
#[derive(Debug, Serialize, Deserialize)] #[derive(Debug, Serialize, Deserialize, Clone)]
pub struct WalletResponse { pub struct WalletResponse {
/// Apple Pay Wallet response information. /// Apple Pay Wallet response information.
pub apple_pay: CardResponse, pub apple_pay: CardResponse,
@ -717,4 +717,9 @@ pub struct Order {
pub status: OrderStatus, pub status: OrderStatus,
/// An array of request-related HATEOAS links. To complete payer approval, use the approve link to redirect the payer. /// An array of request-related HATEOAS links. To complete payer approval, use the approve link to redirect the payer.
pub links: Vec<LinkDescription>, pub links: Vec<LinkDescription>,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct InvoiceNumber {
pub invoice_number: String,
} }

View file

@ -102,7 +102,7 @@ pub const SANDBOX_ENDPOINT: &str = "https://api-m.sandbox.paypal.com";
/// let query = Query { count: Some(40), ..Default::default() }; /// let query = Query { count: Some(40), ..Default::default() };
/// ``` /// ```
#[skip_serializing_none] #[skip_serializing_none]
#[derive(Debug, Default, Serialize, Builder)] #[derive(Debug, Default, Serialize, Builder, Clone)]
pub struct Query { pub struct Query {
/// The number of items to list in the response. /// The number of items to list in the response.
pub count: Option<i32>, pub count: Option<i32>,
@ -131,22 +131,6 @@ pub struct Query {
// TODO: Use https://github.com/samscott89/serde_qs // TODO: Use https://github.com/samscott89/serde_qs
} }
/// The preferred server response upon successful completion of the request.
#[derive(Debug, Eq, PartialEq, Copy, Clone)]
pub enum Prefer {
/// The server returns a minimal response to optimize communication between the API caller and the server.
/// A minimal response includes the id, status and HATEOAS links.
Minimal,
/// The server returns a complete resource representation, including the current state of the resource.
Representation,
}
impl Default for Prefer {
fn default() -> Self {
Prefer::Representation
}
}
/// Represents the optional header values used on paypal requests. /// Represents the optional header values used on paypal requests.
/// ///
/// https://developer.paypal.com/docs/api/reference/api-requests/#paypal-auth-assertion /// https://developer.paypal.com/docs/api/reference/api-requests/#paypal-auth-assertion
@ -164,8 +148,6 @@ pub struct HeaderParams {
/// You can make these calls any number of times without concern that the server creates or completes an action on a resource more than once. /// You can make these calls any number of times without concern that the server creates or completes an action on a resource more than once.
/// You can retry calls that fail with network timeouts or the HTTP 500 status code. You can retry calls for as long as the server stores the ID. /// You can retry calls that fail with network timeouts or the HTTP 500 status code. You can retry calls for as long as the server stores the ID.
pub request_id: Option<String>, pub request_id: Option<String>,
/// The preferred server response upon successful completion of the request.
pub prefer: Prefer,
/// The media type. Required for operations with a request body. /// The media type. Required for operations with a request body.
pub content_type: Option<String>, pub content_type: Option<String>,
} }