use crate::config::{Client, Response};
use crate::ids::{CustomerId, SubscriptionScheduleId};
use crate::params::{Expand, Expandable, List, Metadata, Object, RangeQuery, Timestamp};
use crate::resources::{
CollectionMethod, Coupon, Customer, PaymentMethod, Plan, PlanInterval, Scheduled, Subscription,
SubscriptionBillingThresholds, SubscriptionItemBillingThresholds, TaxRate,
};
use serde_derive::{Deserialize, Serialize};
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct SubscriptionSchedule {
pub id: SubscriptionScheduleId,
#[serde(skip_serializing_if = "Option::is_none")]
pub billing: Option<CollectionMethod>,
#[serde(skip_serializing_if = "Option::is_none")]
pub billing_thresholds: Option<SubscriptionBillingThresholds>,
#[serde(skip_serializing_if = "Option::is_none")]
pub canceled_at: Option<Timestamp>,
#[serde(skip_serializing_if = "Option::is_none")]
pub collection_method: Option<CollectionMethod>,
#[serde(skip_serializing_if = "Option::is_none")]
pub completed_at: Option<Timestamp>,
pub created: Timestamp,
#[serde(skip_serializing_if = "Option::is_none")]
pub current_phase: Option<SubscriptionScheduleCurrentPhase>,
pub customer: Expandable<Customer>,
#[serde(skip_serializing_if = "Option::is_none")]
pub default_payment_method: Option<Expandable<PaymentMethod>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub end_behavior: Option<SubscriptionScheduleEndBehavior>,
#[serde(skip_serializing_if = "Option::is_none")]
pub invoice_settings: Option<SubscriptionScheduleInvoiceSettings>,
pub livemode: bool,
#[serde(default)]
pub metadata: Metadata,
pub phases: Vec<SubscriptionSchedulePhaseConfiguration>,
#[serde(skip_serializing_if = "Option::is_none")]
pub released_at: Option<Timestamp>,
#[serde(skip_serializing_if = "Option::is_none")]
pub released_subscription: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub renewal_behavior: Option<SubscriptionScheduleRenewalBehavior>,
#[serde(skip_serializing_if = "Option::is_none")]
pub renewal_interval: Option<SubscriptionScheduleRenewalInterval>,
pub status: SubscriptionScheduleStatus,
#[serde(skip_serializing_if = "Option::is_none")]
pub subscription: Option<Expandable<Subscription>>,
}
impl SubscriptionSchedule {
pub fn list(
client: &Client,
params: ListSubscriptionSchedules<'_>,
) -> Response<List<SubscriptionSchedule>> {
client.get_query("/subscription_schedules", ¶ms)
}
pub fn create(
client: &Client,
params: CreateSubscriptionSchedule<'_>,
) -> Response<SubscriptionSchedule> {
client.post_form("/subscription_schedules", ¶ms)
}
pub fn retrieve(
client: &Client,
id: &SubscriptionScheduleId,
expand: &[&str],
) -> Response<SubscriptionSchedule> {
client.get_query(&format!("/subscription_schedules/{}", id), &Expand { expand })
}
pub fn update(
client: &Client,
id: &SubscriptionScheduleId,
params: UpdateSubscriptionSchedule<'_>,
) -> Response<SubscriptionSchedule> {
client.post_form(&format!("/subscription_schedules/{}", id), ¶ms)
}
}
impl Object for SubscriptionSchedule {
type Id = SubscriptionScheduleId;
fn id(&self) -> Self::Id {
self.id.clone()
}
fn object(&self) -> &'static str {
"subscription_schedule"
}
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct SubscriptionScheduleCurrentPhase {
pub end_date: Timestamp,
pub start_date: Timestamp,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct SubscriptionSchedulePhaseConfiguration {
#[serde(skip_serializing_if = "Option::is_none")]
pub application_fee_percent: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub billing_thresholds: Option<SubscriptionBillingThresholds>,
#[serde(skip_serializing_if = "Option::is_none")]
pub collection_method: Option<CollectionMethod>,
#[serde(skip_serializing_if = "Option::is_none")]
pub coupon: Option<Expandable<Coupon>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub default_payment_method: Option<Expandable<PaymentMethod>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub default_tax_rates: Option<Vec<TaxRate>>,
pub end_date: Timestamp,
#[serde(skip_serializing_if = "Option::is_none")]
pub invoice_settings: Option<SubscriptionScheduleInvoiceSettings>,
pub plans: Vec<SubscriptionScheduleConfigurationItem>,
pub start_date: Timestamp,
#[serde(skip_serializing_if = "Option::is_none")]
pub tax_percent: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub trial_end: Option<Timestamp>,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct SubscriptionScheduleConfigurationItem {
#[serde(skip_serializing_if = "Option::is_none")]
pub billing_thresholds: Option<SubscriptionItemBillingThresholds>,
pub plan: Expandable<Plan>,
#[serde(skip_serializing_if = "Option::is_none")]
pub quantity: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tax_rates: Option<Vec<TaxRate>>,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct SubscriptionScheduleRenewalInterval {
pub interval: PlanInterval,
pub length: i64,
}
#[derive(Clone, Debug, Serialize, Default)]
pub struct CreateSubscriptionSchedule<'a> {
#[serde(skip_serializing_if = "Option::is_none")]
pub billing: Option<CollectionMethod>,
#[serde(skip_serializing_if = "Option::is_none")]
pub billing_thresholds: Option<SubscriptionBillingThresholds>,
#[serde(skip_serializing_if = "Option::is_none")]
pub collection_method: Option<CollectionMethod>,
#[serde(skip_serializing_if = "Option::is_none")]
pub customer: Option<CustomerId>,
#[serde(skip_serializing_if = "Option::is_none")]
pub default_payment_method: Option<&'a str>,
#[serde(skip_serializing_if = "Option::is_none")]
pub default_source: Option<&'a str>,
#[serde(skip_serializing_if = "Option::is_none")]
pub end_behavior: Option<SubscriptionScheduleRenewalBehavior>,
#[serde(skip_serializing_if = "Expand::is_empty")]
pub expand: &'a [&'a str],
#[serde(skip_serializing_if = "Option::is_none")]
pub from_subscription: Option<&'a str>,
#[serde(skip_serializing_if = "Option::is_none")]
pub invoice_settings: Option<SubscriptionScheduleInvoiceSettings>,
#[serde(skip_serializing_if = "Option::is_none")]
pub metadata: Option<Metadata>,
#[serde(skip_serializing_if = "Option::is_none")]
pub phases: Option<Vec<CreateSubscriptionSchedulePhases>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub renewal_behavior: Option<SubscriptionScheduleRenewalBehavior>,
#[serde(skip_serializing_if = "Option::is_none")]
pub renewal_interval: Option<SubscriptionScheduleRenewalIntervalParams>,
#[serde(skip_serializing_if = "Option::is_none")]
pub start_date: Option<Scheduled>,
}
impl<'a> CreateSubscriptionSchedule<'a> {
pub fn new() -> Self {
CreateSubscriptionSchedule {
billing: Default::default(),
billing_thresholds: Default::default(),
collection_method: Default::default(),
customer: Default::default(),
default_payment_method: Default::default(),
default_source: Default::default(),
end_behavior: Default::default(),
expand: Default::default(),
from_subscription: Default::default(),
invoice_settings: Default::default(),
metadata: Default::default(),
phases: Default::default(),
renewal_behavior: Default::default(),
renewal_interval: Default::default(),
start_date: Default::default(),
}
}
}
#[derive(Clone, Debug, Serialize, Default)]
pub struct ListSubscriptionSchedules<'a> {
#[serde(skip_serializing_if = "Option::is_none")]
pub canceled_at: Option<RangeQuery<Timestamp>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub completed_at: Option<RangeQuery<Timestamp>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub created: Option<RangeQuery<Timestamp>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub customer: Option<CustomerId>,
#[serde(skip_serializing_if = "Option::is_none")]
pub ending_before: Option<SubscriptionScheduleId>,
#[serde(skip_serializing_if = "Expand::is_empty")]
pub expand: &'a [&'a str],
#[serde(skip_serializing_if = "Option::is_none")]
pub limit: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub released_at: Option<RangeQuery<Timestamp>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub scheduled: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub starting_after: Option<SubscriptionScheduleId>,
}
impl<'a> ListSubscriptionSchedules<'a> {
pub fn new() -> Self {
ListSubscriptionSchedules {
canceled_at: Default::default(),
completed_at: Default::default(),
created: Default::default(),
customer: Default::default(),
ending_before: Default::default(),
expand: Default::default(),
limit: Default::default(),
released_at: Default::default(),
scheduled: Default::default(),
starting_after: Default::default(),
}
}
}
#[derive(Clone, Debug, Serialize, Default)]
pub struct UpdateSubscriptionSchedule<'a> {
#[serde(skip_serializing_if = "Option::is_none")]
pub billing: Option<CollectionMethod>,
#[serde(skip_serializing_if = "Option::is_none")]
pub billing_thresholds: Option<SubscriptionBillingThresholds>,
#[serde(skip_serializing_if = "Option::is_none")]
pub collection_method: Option<CollectionMethod>,
#[serde(skip_serializing_if = "Option::is_none")]
pub default_payment_method: Option<&'a str>,
#[serde(skip_serializing_if = "Option::is_none")]
pub default_source: Option<&'a str>,
#[serde(skip_serializing_if = "Option::is_none")]
pub end_behavior: Option<SubscriptionScheduleRenewalBehavior>,
#[serde(skip_serializing_if = "Expand::is_empty")]
pub expand: &'a [&'a str],
#[serde(skip_serializing_if = "Option::is_none")]
pub invoice_settings: Option<SubscriptionScheduleInvoiceSettings>,
#[serde(skip_serializing_if = "Option::is_none")]
pub metadata: Option<Metadata>,
#[serde(skip_serializing_if = "Option::is_none")]
pub phases: Option<Vec<UpdateSubscriptionSchedulePhases>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub prorate: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub renewal_behavior: Option<SubscriptionScheduleRenewalBehavior>,
#[serde(skip_serializing_if = "Option::is_none")]
pub renewal_interval: Option<SubscriptionScheduleRenewalIntervalParams>,
}
impl<'a> UpdateSubscriptionSchedule<'a> {
pub fn new() -> Self {
UpdateSubscriptionSchedule {
billing: Default::default(),
billing_thresholds: Default::default(),
collection_method: Default::default(),
default_payment_method: Default::default(),
default_source: Default::default(),
end_behavior: Default::default(),
expand: Default::default(),
invoice_settings: Default::default(),
metadata: Default::default(),
phases: Default::default(),
prorate: Default::default(),
renewal_behavior: Default::default(),
renewal_interval: Default::default(),
}
}
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct CreateSubscriptionSchedulePhases {
#[serde(skip_serializing_if = "Option::is_none")]
pub application_fee_percent: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub billing_thresholds: Option<SubscriptionBillingThresholds>,
#[serde(skip_serializing_if = "Option::is_none")]
pub collection_method: Option<CollectionMethod>,
#[serde(skip_serializing_if = "Option::is_none")]
pub coupon: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub default_payment_method: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub default_tax_rates: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub end_date: Option<Scheduled>,
#[serde(skip_serializing_if = "Option::is_none")]
pub invoice_settings: Option<SubscriptionScheduleInvoiceSettings>,
#[serde(skip_serializing_if = "Option::is_none")]
pub iterations: Option<i64>,
pub plans: Vec<SubscriptionSchedulePhasesPlansParams>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tax_percent: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub trial: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub trial_end: Option<Scheduled>,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct SubscriptionScheduleInvoiceSettings {
#[serde(skip_serializing_if = "Option::is_none")]
pub days_until_due: Option<u32>,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct SubscriptionScheduleRenewalIntervalParams {
pub interval: PlanInterval,
pub length: i64,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct UpdateSubscriptionSchedulePhases {
#[serde(skip_serializing_if = "Option::is_none")]
pub application_fee_percent: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub billing_thresholds: Option<SubscriptionBillingThresholds>,
#[serde(skip_serializing_if = "Option::is_none")]
pub collection_method: Option<CollectionMethod>,
#[serde(skip_serializing_if = "Option::is_none")]
pub coupon: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub default_payment_method: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub default_tax_rates: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub end_date: Option<Scheduled>,
#[serde(skip_serializing_if = "Option::is_none")]
pub invoice_settings: Option<SubscriptionScheduleInvoiceSettings>,
#[serde(skip_serializing_if = "Option::is_none")]
pub iterations: Option<i64>,
pub plans: Vec<SubscriptionSchedulePhasesPlansParams>,
#[serde(skip_serializing_if = "Option::is_none")]
pub start_date: Option<Scheduled>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tax_percent: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub trial: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub trial_end: Option<Scheduled>,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct SubscriptionSchedulePhasesPlansParams {
#[serde(skip_serializing_if = "Option::is_none")]
pub billing_thresholds: Option<SubscriptionItemBillingThresholds>,
pub plan: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub quantity: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tax_rates: Option<Vec<String>>,
}
#[derive(Copy, Clone, Debug, Deserialize, Serialize, Eq, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum SubscriptionScheduleEndBehavior {
Cancel,
Release,
}
impl SubscriptionScheduleEndBehavior {
pub fn as_str(self) -> &'static str {
match self {
SubscriptionScheduleEndBehavior::Cancel => "cancel",
SubscriptionScheduleEndBehavior::Release => "release",
}
}
}
impl AsRef<str> for SubscriptionScheduleEndBehavior {
fn as_ref(&self) -> &str {
self.as_str()
}
}
impl std::fmt::Display for SubscriptionScheduleEndBehavior {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
self.as_str().fmt(f)
}
}
#[derive(Copy, Clone, Debug, Deserialize, Serialize, Eq, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum SubscriptionScheduleRenewalBehavior {
Cancel,
None,
Release,
Renew,
}
impl SubscriptionScheduleRenewalBehavior {
pub fn as_str(self) -> &'static str {
match self {
SubscriptionScheduleRenewalBehavior::Cancel => "cancel",
SubscriptionScheduleRenewalBehavior::None => "none",
SubscriptionScheduleRenewalBehavior::Release => "release",
SubscriptionScheduleRenewalBehavior::Renew => "renew",
}
}
}
impl AsRef<str> for SubscriptionScheduleRenewalBehavior {
fn as_ref(&self) -> &str {
self.as_str()
}
}
impl std::fmt::Display for SubscriptionScheduleRenewalBehavior {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
self.as_str().fmt(f)
}
}
#[derive(Copy, Clone, Debug, Deserialize, Serialize, Eq, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum SubscriptionScheduleStatus {
Active,
Canceled,
Completed,
NotStarted,
Released,
}
impl SubscriptionScheduleStatus {
pub fn as_str(self) -> &'static str {
match self {
SubscriptionScheduleStatus::Active => "active",
SubscriptionScheduleStatus::Canceled => "canceled",
SubscriptionScheduleStatus::Completed => "completed",
SubscriptionScheduleStatus::NotStarted => "not_started",
SubscriptionScheduleStatus::Released => "released",
}
}
}
impl AsRef<str> for SubscriptionScheduleStatus {
fn as_ref(&self) -> &str {
self.as_str()
}
}
impl std::fmt::Display for SubscriptionScheduleStatus {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
self.as_str().fmt(f)
}
}