defmodule Stripe.PromotionCode do use Stripe.Entity @moduledoc "A Promotion Code represents a customer-redeemable code for an underlying promotion.\nYou can create multiple codes for a single promotion.\n\nIf you enable promotion codes in your [customer portal configuration](https://stripe.com/docs/customer-management/configure-portal), then customers can redeem a code themselves when updating a subscription in the portal.\nCustomers can also view the currently active promotion codes and coupons on each of their subscriptions in the portal." ( defstruct [ :active, :code, :created, :customer, :expires_at, :id, :livemode, :max_redemptions, :metadata, :object, :promotion, :restrictions, :times_redeemed ] @typedoc "The `promotion_code` type.\n\n * `active` Whether the promotion code is currently active. A promotion code is only active if the coupon is also valid.\n * `code` The customer-facing code. Regardless of case, this code must be unique across all active promotion codes for each customer. Valid characters are lower case letters (a-z), upper case letters (A-Z), and digits (0-9).\n * `created` Time at which the object was created. Measured in seconds since the Unix epoch.\n * `customer` The customer that this promotion code can be used by.\n * `expires_at` Date at which the promotion code can no longer be redeemed.\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 * `max_redemptions` Maximum number of times this promotion code can be redeemed.\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 * `promotion` \n * `restrictions` \n * `times_redeemed` Number of times this promotion code has been used.\n" @type t :: %__MODULE__{ active: boolean, code: binary, created: integer, customer: (binary | Stripe.Customer.t() | Stripe.DeletedCustomer.t()) | nil, expires_at: integer | nil, id: binary, livemode: boolean, max_redemptions: integer | nil, metadata: term | nil, object: binary, promotion: term, restrictions: term, times_redeemed: integer } ) ( @typedoc nil @type created :: %{ optional(:gt) => integer, optional(:gte) => integer, optional(:lt) => integer, optional(:lte) => integer } ) ( @typedoc "The promotion referenced by this promotion code." @type promotion :: %{optional(:coupon) => binary, optional(:type) => :coupon} ) ( @typedoc "Settings that restrict the redemption of the promotion code." @type restrictions :: %{ optional(:currency_options) => map(), optional(:first_time_transaction) => boolean, optional(:minimum_amount) => integer, optional(:minimum_amount_currency) => binary } ) ( nil @doc "
Returns a list of your promotion codes.
\n\n#### Details\n\n * Method: `get`\n * Path: `/v1/promotion_codes`\n" ( @spec list( params :: %{ optional(:active) => boolean, optional(:code) => binary, optional(:coupon) => binary, optional(:created) => created | integer, optional(:customer) => binary, optional(:ending_before) => binary, optional(:expand) => list(binary), optional(:limit) => integer, optional(:starting_after) => binary }, opts :: Keyword.t() ) :: {:ok, Stripe.List.t(Stripe.PromotionCode.t())} | {:error, Stripe.ApiErrors.t()} | {:error, term()} def list(params \\ %{}, opts \\ []) do path = Stripe.OpenApi.Path.replace_path_params("/v1/promotion_codes", [], []) 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 "Retrieves the promotion code with the given ID. In order to retrieve a promotion code by the customer-facing code use list with the desired code.
A promotion code points to an underlying promotion. You can optionally restrict the code to a specific customer, redemption limit, and expiration date.
\n\n#### Details\n\n * Method: `post`\n * Path: `/v1/promotion_codes`\n" ( @spec create( params :: %{ optional(:active) => boolean, optional(:code) => binary, optional(:customer) => binary, optional(:expand) => list(binary), optional(:expires_at) => integer, optional(:max_redemptions) => integer, optional(:metadata) => %{optional(binary) => binary}, optional(:promotion) => promotion, optional(:restrictions) => restrictions }, opts :: Keyword.t() ) :: {:ok, Stripe.PromotionCode.t()} | {:error, Stripe.ApiErrors.t()} | {:error, term()} def create(params \\ %{}, opts \\ []) do path = Stripe.OpenApi.Path.replace_path_params("/v1/promotion_codes", [], []) 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 "Updates the specified promotion code by setting the values of the parameters passed. Most fields are, by design, not editable.
\n\n#### Details\n\n * Method: `post`\n * Path: `/v1/promotion_codes/{promotion_code}`\n" ( @spec update( promotion_code :: binary(), params :: %{ optional(:active) => boolean, optional(:expand) => list(binary), optional(:metadata) => %{optional(binary) => binary} | binary, optional(:restrictions) => restrictions }, opts :: Keyword.t() ) :: {:ok, Stripe.PromotionCode.t()} | {:error, Stripe.ApiErrors.t()} | {:error, term()} def update(promotion_code, params \\ %{}, opts \\ []) do path = Stripe.OpenApi.Path.replace_path_params( "/v1/promotion_codes/{promotion_code}", [ %{ __struct__: OpenApiGen.Blueprint.Parameter, in: "path", name: "promotion_code", required: true, schema: %{ __struct__: OpenApiGen.Blueprint.Parameter.Schema, any_of: [], items: [], name: "promotion_code", properties: [], title: nil, type: "string" } } ], [promotion_code] ) 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 ) ) end