defmodule Stripe.SubscriptionSchedule do use Stripe.Entity @moduledoc "A subscription schedule allows you to create and manage the lifecycle of a subscription by predefining expected changes.\n\nRelated guide: [Subscription schedules](https://stripe.com/docs/billing/subscriptions/subscription-schedules)" ( defstruct [ :application, :canceled_at, :completed_at, :created, :current_phase, :customer, :default_settings, :end_behavior, :id, :livemode, :metadata, :object, :phases, :released_at, :released_subscription, :status, :subscription, :test_clock ] @typedoc "The `subscription_schedule` type.\n\n * `application` ID of the Connect Application that created the schedule.\n * `canceled_at` Time at which the subscription schedule was canceled. Measured in seconds since the Unix epoch.\n * `completed_at` Time at which the subscription schedule was completed. Measured in seconds since the Unix epoch.\n * `created` Time at which the object was created. Measured in seconds since the Unix epoch.\n * `current_phase` Object representing the start and end dates for the current phase of the subscription schedule, if it is `active`.\n * `customer` ID of the customer who owns the subscription schedule.\n * `default_settings` \n * `end_behavior` Behavior of the subscription schedule and underlying subscription when it ends. Possible values are `release` or `cancel` with the default being `release`. `release` will end the subscription schedule and keep the underlying subscription running.`cancel` will end the subscription schedule and cancel the underlying subscription.\n * `id` Unique identifier for the object.\n * `livemode` Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\n * `metadata` Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format.\n * `object` String representing the object's type. Objects of the same type share the same value.\n * `phases` Configuration for the subscription schedule's phases.\n * `released_at` Time at which the subscription schedule was released. Measured in seconds since the Unix epoch.\n * `released_subscription` ID of the subscription once managed by the subscription schedule (if it is released).\n * `status` The present status of the subscription schedule. Possible values are `not_started`, `active`, `completed`, `released`, and `canceled`. You can read more about the different states in our [behavior guide](https://stripe.com/docs/billing/subscriptions/subscription-schedules).\n * `subscription` ID of the subscription managed by the subscription schedule.\n * `test_clock` ID of the test clock this subscription schedule belongs to.\n" @type t :: %__MODULE__{ application: (binary | term | term) | nil, canceled_at: integer | nil, completed_at: integer | nil, created: integer, current_phase: term | nil, customer: binary | Stripe.Customer.t() | Stripe.DeletedCustomer.t(), default_settings: term, end_behavior: binary, id: binary, livemode: boolean, metadata: term | nil, object: binary, phases: term, released_at: integer | nil, released_subscription: binary | nil, status: binary, subscription: (binary | Stripe.Subscription.t()) | nil, test_clock: (binary | Stripe.TestHelpers.TestClock.t()) | nil } ) ( @typedoc nil @type add_invoice_items :: %{ optional(:price) => binary, optional(:price_data) => price_data, optional(:quantity) => integer, optional(:tax_rates) => list(binary) | binary } ) ( @typedoc "Automatic tax settings for this phase." @type automatic_tax :: %{optional(:enabled) => boolean} ) ( @typedoc nil @type billing_thresholds :: %{ optional(:amount_gte) => integer, optional(:reset_billing_cycle_anchor) => boolean } ) ( @typedoc nil @type canceled_at :: %{ optional(:gt) => integer, optional(:gte) => integer, optional(:lt) => integer, optional(:lte) => integer } ) ( @typedoc nil @type completed_at :: %{ optional(:gt) => integer, optional(:gte) => integer, optional(:lt) => integer, optional(:lte) => integer } ) ( @typedoc nil @type created :: %{ optional(:gt) => integer, optional(:gte) => integer, optional(:lt) => integer, optional(:lte) => integer } ) ( @typedoc "Object representing the subscription schedule's default settings." @type default_settings :: %{ optional(:application_fee_percent) => number, optional(:automatic_tax) => automatic_tax, optional(:billing_cycle_anchor) => :automatic | :phase_start, optional(:billing_thresholds) => billing_thresholds | binary, optional(:collection_method) => :charge_automatically | :send_invoice, optional(:default_payment_method) => binary, optional(:description) => binary | binary, optional(:invoice_settings) => invoice_settings, optional(:on_behalf_of) => binary | binary, optional(:transfer_data) => transfer_data | binary } ) ( @typedoc "All invoices will be billed using the specified settings." @type invoice_settings :: %{optional(:days_until_due) => integer} ) ( @typedoc nil @type items :: %{ optional(:billing_thresholds) => billing_thresholds | binary, optional(:metadata) => %{optional(binary) => binary}, optional(:plan) => binary, optional(:price) => binary, optional(:price_data) => price_data, optional(:quantity) => integer, optional(:tax_rates) => list(binary) | binary } ) ( @typedoc nil @type phases :: %{ optional(:add_invoice_items) => list(add_invoice_items), optional(:application_fee_percent) => number, optional(:automatic_tax) => automatic_tax, optional(:billing_cycle_anchor) => :automatic | :phase_start, optional(:billing_thresholds) => billing_thresholds | binary, optional(:collection_method) => :charge_automatically | :send_invoice, optional(:coupon) => binary, optional(:currency) => binary, optional(:default_payment_method) => binary, optional(:default_tax_rates) => list(binary) | binary, optional(:description) => binary | binary, optional(:end_date) => integer, optional(:invoice_settings) => invoice_settings, optional(:items) => list(items), optional(:iterations) => integer, optional(:metadata) => %{optional(binary) => binary}, optional(:on_behalf_of) => binary, optional(:proration_behavior) => :always_invoice | :create_prorations | :none, optional(:transfer_data) => transfer_data, optional(:trial) => boolean, optional(:trial_end) => integer } ) ( @typedoc "Data used to generate a new [Price](https://stripe.com/docs/api/prices) object inline." @type price_data :: %{ optional(:currency) => binary, optional(:product) => binary, optional(:recurring) => recurring, optional(:tax_behavior) => :exclusive | :inclusive | :unspecified, optional(:unit_amount) => integer, optional(:unit_amount_decimal) => binary } ) ( @typedoc "The recurring components of a price such as `interval` and `interval_count`." @type recurring :: %{ optional(:interval) => :day | :month | :week | :year, optional(:interval_count) => integer } ) ( @typedoc nil @type released_at :: %{ optional(:gt) => integer, optional(:gte) => integer, optional(:lt) => integer, optional(:lte) => integer } ) ( @typedoc nil @type transfer_data :: %{ optional(:amount_percent) => number, optional(:destination) => binary } ) ( nil @doc "
Retrieves the list of your subscription schedules.
\n\n#### Details\n\n * Method: `get`\n * Path: `/v1/subscription_schedules`\n" ( @spec list( params :: %{ optional(:canceled_at) => canceled_at | integer, optional(:completed_at) => completed_at | integer, optional(:created) => created | integer, optional(:customer) => binary, optional(:ending_before) => binary, optional(:expand) => list(binary), optional(:limit) => integer, optional(:released_at) => released_at | integer, optional(:scheduled) => boolean, optional(:starting_after) => binary }, opts :: Keyword.t() ) :: {:ok, Stripe.List.t(Stripe.SubscriptionSchedule.t())} | {:error, Stripe.ApiErrors.t()} | {:error, term()} def list(params \\ %{}, opts \\ []) do path = Stripe.OpenApi.Path.replace_path_params("/v1/subscription_schedules", [], []) Stripe.Request.new_request(opts) |> Stripe.Request.put_endpoint(path) |> Stripe.Request.put_params(params) |> Stripe.Request.put_method(:get) |> Stripe.Request.make_request() end ) ) ( nil @doc "Creates a new subscription schedule object. Each customer can have up to 500 active or scheduled subscriptions.
\n\n#### Details\n\n * Method: `post`\n * Path: `/v1/subscription_schedules`\n" ( @spec create( params :: %{ optional(:customer) => binary, optional(:default_settings) => default_settings, optional(:end_behavior) => :cancel | :none | :release | :renew, optional(:expand) => list(binary), optional(:from_subscription) => binary, optional(:metadata) => %{optional(binary) => binary} | binary, optional(:phases) => list(phases), optional(:start_date) => integer | :now }, opts :: Keyword.t() ) :: {:ok, Stripe.SubscriptionSchedule.t()} | {:error, Stripe.ApiErrors.t()} | {:error, term()} def create(params \\ %{}, opts \\ []) do path = Stripe.OpenApi.Path.replace_path_params("/v1/subscription_schedules", [], []) Stripe.Request.new_request(opts) |> Stripe.Request.put_endpoint(path) |> Stripe.Request.put_params(params) |> Stripe.Request.put_method(:post) |> Stripe.Request.make_request() end ) ) ( nil @doc "Retrieves the details of an existing subscription schedule. You only need to supply the unique subscription schedule identifier that was returned upon subscription schedule creation.
\n\n#### Details\n\n * Method: `get`\n * Path: `/v1/subscription_schedules/{schedule}`\n" ( @spec retrieve( schedule :: binary(), params :: %{optional(:expand) => list(binary)}, opts :: Keyword.t() ) :: {:ok, Stripe.SubscriptionSchedule.t()} | {:error, Stripe.ApiErrors.t()} | {:error, term()} def retrieve(schedule, params \\ %{}, opts \\ []) do path = Stripe.OpenApi.Path.replace_path_params( "/v1/subscription_schedules/{schedule}", [ %OpenApiGen.Blueprint.Parameter{ in: "path", name: "schedule", required: true, schema: %OpenApiGen.Blueprint.Parameter.Schema{ name: "schedule", title: nil, type: "string", items: [], properties: [], any_of: [] } } ], [schedule] ) Stripe.Request.new_request(opts) |> Stripe.Request.put_endpoint(path) |> Stripe.Request.put_params(params) |> Stripe.Request.put_method(:get) |> Stripe.Request.make_request() end ) ) ( nil @doc "Updates an existing subscription schedule.
\n\n#### Details\n\n * Method: `post`\n * Path: `/v1/subscription_schedules/{schedule}`\n" ( @spec update( schedule :: binary(), params :: %{ optional(:default_settings) => default_settings, optional(:end_behavior) => :cancel | :none | :release | :renew, optional(:expand) => list(binary), optional(:metadata) => %{optional(binary) => binary} | binary, optional(:phases) => list(phases), optional(:proration_behavior) => :always_invoice | :create_prorations | :none }, opts :: Keyword.t() ) :: {:ok, Stripe.SubscriptionSchedule.t()} | {:error, Stripe.ApiErrors.t()} | {:error, term()} def update(schedule, params \\ %{}, opts \\ []) do path = Stripe.OpenApi.Path.replace_path_params( "/v1/subscription_schedules/{schedule}", [ %OpenApiGen.Blueprint.Parameter{ in: "path", name: "schedule", required: true, schema: %OpenApiGen.Blueprint.Parameter.Schema{ name: "schedule", title: nil, type: "string", items: [], properties: [], any_of: [] } } ], [schedule] ) Stripe.Request.new_request(opts) |> Stripe.Request.put_endpoint(path) |> Stripe.Request.put_params(params) |> Stripe.Request.put_method(:post) |> Stripe.Request.make_request() end ) ) ( nil @doc "Cancels a subscription schedule and its associated subscription immediately (if the subscription schedule has an active subscription). A subscription schedule can only be canceled if its status is not_started or active.
Releases the subscription schedule immediately, which will stop scheduling of its phases, but leave any existing subscription in place. A schedule can only be released if its status is not_started or active. If the subscription schedule is currently associated with a subscription, releasing it will remove its subscription property and set the subscription’s ID to the released_subscription property.