diff --git a/.dagger/generate.go b/.dagger/generate.go index a8b60adb8..4c9e9c065 100644 --- a/.dagger/generate.go +++ b/.dagger/generate.go @@ -112,9 +112,11 @@ func (m *Generate) WebSdk() *dagger.Directory { func (m *Generate) Server() *dagger.Directory { openapi := m.Openapi() + cloud := m.Openapicloud() source := m.Source. - WithFile("api/openapi.yaml", openapi) + WithFile("api/openapi.yaml", openapi). + WithFile("api/openapi.cloud.yaml", cloud) return goModule(). WithSource(source). diff --git a/api/api.gen.go b/api/api.gen.go index 4a185e2d8..358d4c5fb 100644 --- a/api/api.gen.go +++ b/api/api.gen.go @@ -97,6 +97,31 @@ const ( DiscountPercentageTypePercentage DiscountPercentageType = "percentage" ) +// Defines values for EditSubscriptionAddItemOp. +const ( + EditSubscriptionAddItemOpAddItem EditSubscriptionAddItemOp = "add_item" +) + +// Defines values for EditSubscriptionAddPhaseOp. +const ( + EditSubscriptionAddPhaseOpAddPhase EditSubscriptionAddPhaseOp = "add_phase" +) + +// Defines values for EditSubscriptionRemoveItemOp. +const ( + EditSubscriptionRemoveItemOpRemoveItem EditSubscriptionRemoveItemOp = "remove_item" +) + +// Defines values for EditSubscriptionRemovePhaseOp. +const ( + EditSubscriptionRemovePhaseOpRemovePhase EditSubscriptionRemovePhaseOp = "remove_phase" +) + +// Defines values for EditSubscriptionStretchPhaseOp. +const ( + EditSubscriptionStretchPhaseOpStretchPhase EditSubscriptionStretchPhaseOp = "stretch_phase" +) + // Defines values for EntitlementBooleanCreateInputsType. const ( EntitlementBooleanCreateInputsTypeBoolean EntitlementBooleanCreateInputsType = "boolean" @@ -386,11 +411,6 @@ const ( RateCardFlatFeeTypeFlatFee RateCardFlatFeeType = "flat_fee" ) -// Defines values for RateCardFlatFeeUpdateItemType. -const ( - RateCardFlatFeeUpdateItemTypeFlatFee RateCardFlatFeeUpdateItemType = "flat_fee" -) - // Defines values for RateCardMeteredEntitlementType. const ( RateCardMeteredEntitlementTypeMetered RateCardMeteredEntitlementType = "metered" @@ -406,11 +426,6 @@ const ( RateCardUsageBasedTypeUsageBased RateCardUsageBasedType = "usage_based" ) -// Defines values for RateCardUsageBasedUpdateItemType. -const ( - RateCardUsageBasedUpdateItemTypeUsageBased RateCardUsageBasedUpdateItemType = "usage_based" -) - // Defines values for RecurringPeriodInterval. const ( RecurringPeriodIntervalDAY RecurringPeriodInterval = "DAY" @@ -421,8 +436,8 @@ const ( // Defines values for RemovePhaseShifting. const ( - RemovePhaseShiftingNext RemovePhaseShifting = "Next" - RemovePhaseShiftingPrev RemovePhaseShifting = "Prev" + RemovePhaseShiftingNext RemovePhaseShifting = "next" + RemovePhaseShiftingPrev RemovePhaseShifting = "prev" ) // Defines values for SandboxAppType. @@ -466,41 +481,6 @@ const ( StripePaymentIntentStatusSucceeded StripePaymentIntentStatus = "succeeded" ) -// Defines values for SubscriptionEditAddOp. -const ( - SubscriptionEditAddOpAdd SubscriptionEditAddOp = "add" -) - -// Defines values for SubscriptionEditAddItemOp. -const ( - SubscriptionEditAddItemOpAdd SubscriptionEditAddItemOp = "add" -) - -// Defines values for SubscriptionEditAddUpdateItemOp. -const ( - SubscriptionEditAddUpdateItemOpAdd SubscriptionEditAddUpdateItemOp = "add" -) - -// Defines values for SubscriptionEditRemoveItemOp. -const ( - SubscriptionEditRemoveItemOpRemove SubscriptionEditRemoveItemOp = "remove" -) - -// Defines values for SubscriptionEditRemoveUpdateItemOp. -const ( - SubscriptionEditRemoveUpdateItemOpRemove SubscriptionEditRemoveUpdateItemOp = "remove" -) - -// Defines values for SubscriptionEditRemoveWithValueOp. -const ( - SubscriptionEditRemoveWithValueOpRemove SubscriptionEditRemoveWithValueOp = "remove" -) - -// Defines values for SubscriptionEditStretchOp. -const ( - SubscriptionEditStretchOpExtend SubscriptionEditStretchOp = "extend" -) - // Defines values for SvixOperationalWebhookRequestType. const ( SvixOperationalWebhookRequestTypeEndpointCreated SvixOperationalWebhookRequestType = "endpoint.created" @@ -554,12 +534,6 @@ const ( VoidInvoiceLinePendingActionCreateItemTypePending VoidInvoiceLinePendingActionCreateItemType = "pending" ) -// Defines values for GetSubscriptionParamsExpand. -const ( - GetSubscriptionParamsExpandFalse GetSubscriptionParamsExpand = false - GetSubscriptionParamsExpandTrue GetSubscriptionParamsExpand = true -) - // Address Address type Address struct { City *string `json:"city,omitempty"` @@ -1091,22 +1065,6 @@ type ConflictProblemResponse = UnexpectedProblemResponse // Custom two-letter country codes are also supported for convenience. type CountryCode = string -// CreateCustomSubscriptionRequestBody Create a custom subscription. -type CreateCustomSubscriptionRequestBody struct { - // ActiveFrom [RFC3339](https://tools.ietf.org/html/rfc3339) formatted date-time string in UTC. - ActiveFrom time.Time `json:"activeFrom"` - - // Currency Three-letter [ISO4217](https://www.iso.org/iso-4217-currency-codes.html) currency code. - // Custom three-letter currency codes are also supported for convenience. - Currency CurrencyCode `json:"currency"` - - // CustomPlan Resource create operation model. - CustomPlan PlanCreate `json:"customPlan"` - - // CustomerId ULID (Universally Unique Lexicographically Sortable Identifier). - CustomerId string `json:"customerId"` -} - // CreateStripeCheckoutSessionRequest Create Stripe checkout session request. type CreateStripeCheckoutSessionRequest struct { // AppId If not provided, the default Stripe app is used if any. @@ -1197,12 +1155,20 @@ type CustomSubscriptionChange struct { // ActiveFrom [RFC3339](https://tools.ietf.org/html/rfc3339) formatted date-time string in UTC. ActiveFrom time.Time `json:"activeFrom"` - // Currency Three-letter [ISO4217](https://www.iso.org/iso-4217-currency-codes.html) currency code. - // Custom three-letter currency codes are also supported for convenience. - Currency CurrencyCode `json:"currency"` + // CustomPlan Resource create operation model. + CustomPlan PlanCreate `json:"customPlan"` +} + +// CustomSubscriptionCreate Create a custom subscription. +type CustomSubscriptionCreate struct { + // ActiveFrom [RFC3339](https://tools.ietf.org/html/rfc3339) formatted date-time string in UTC. + ActiveFrom time.Time `json:"activeFrom"` // CustomPlan Resource create operation model. CustomPlan PlanCreate `json:"customPlan"` + + // CustomerId ULID (Universally Unique Lexicographically Sortable Identifier). + CustomerId string `json:"customerId"` } // Customer A customer object. @@ -1377,18 +1343,60 @@ type DiscountPercentage struct { // DiscountPercentageType The type of the discount. type DiscountPercentageType string -// DiscountPercentageUpdateItem Percentage discount. -type DiscountPercentageUpdateItem struct { - // Percentage The percentage of the discount. - Percentage float32 `json:"percentage"` +// EditSubscriptionAddItem Add a new item to a phase. +type EditSubscriptionAddItem struct { + Op EditSubscriptionAddItemOp `json:"op"` + PhaseKey string `json:"phaseKey"` - // RateCards The rate cards that the discount applies to. - // When not specified, the discount applies to all rate cards. - RateCards *[]string `json:"rateCards,omitempty"` + // RateCard A rate card defines the pricing and entitlement of a feature or service. + RateCard RateCard `json:"rateCard"` +} + +// EditSubscriptionAddItemOp defines model for EditSubscriptionAddItem.Op. +type EditSubscriptionAddItemOp string + +// EditSubscriptionAddPhase Add a new phase +type EditSubscriptionAddPhase struct { + Op EditSubscriptionAddPhaseOp `json:"op"` + + // Phase Subscription phase create input. + Phase SubscriptionPhaseCreate `json:"phase"` } -// DiscountUpdateItem Percentage discount. -type DiscountUpdateItem = DiscountPercentageUpdateItem +// EditSubscriptionAddPhaseOp defines model for EditSubscriptionAddPhase.Op. +type EditSubscriptionAddPhaseOp string + +// EditSubscriptionRemoveItem Remove an item from a phase. +type EditSubscriptionRemoveItem struct { + ItemKey string `json:"itemKey"` + Op EditSubscriptionRemoveItemOp `json:"op"` + PhaseKey string `json:"phaseKey"` +} + +// EditSubscriptionRemoveItemOp defines model for EditSubscriptionRemoveItem.Op. +type EditSubscriptionRemoveItemOp string + +// EditSubscriptionRemovePhase Remove a phase +type EditSubscriptionRemovePhase struct { + Op EditSubscriptionRemovePhaseOp `json:"op"` + PhaseKey string `json:"phaseKey"` + + // Shift The direction of the phase shift when a phase is removed. + Shift RemovePhaseShifting `json:"shift"` +} + +// EditSubscriptionRemovePhaseOp defines model for EditSubscriptionRemovePhase.Op. +type EditSubscriptionRemovePhaseOp string + +// EditSubscriptionStretchPhase Stretch a phase +type EditSubscriptionStretchPhase struct { + ExtendBy string `json:"extendBy"` + Op EditSubscriptionStretchPhaseOp `json:"op"` + PhaseKey string `json:"phaseKey"` +} + +// EditSubscriptionStretchPhaseOp defines model for EditSubscriptionStretchPhase.Op. +type EditSubscriptionStretchPhaseOp string // Entitlement Entitlement templates are used to define the entitlements of a plan. // Features are omitted from the entitlement template, as they are defined in the rate card. @@ -3259,6 +3267,15 @@ type PlanReference struct { Version int `json:"version"` } +// PlanReferenceInput References an exact plan defaulting to the current active version. +type PlanReferenceInput struct { + // Key The plan key. + Key string `json:"key"` + + // Version The plan version. + Version *int `json:"version,omitempty"` +} + // PlanReplaceUpdate Resource update operation model. type PlanReplaceUpdate struct { // Description Optional description of the resource. Maximum 1024 characters. @@ -3281,29 +3298,16 @@ type PlanStatus string // PlanSubscriptionChange Change subscription based on plan. type PlanSubscriptionChange struct { // ActiveFrom [RFC3339](https://tools.ietf.org/html/rfc3339) formatted date-time string in UTC. - ActiveFrom time.Time `json:"activeFrom"` - - // Currency Three-letter [ISO4217](https://www.iso.org/iso-4217-currency-codes.html) currency code. - // Custom three-letter currency codes are also supported for convenience. - Currency CurrencyCode `json:"currency"` + ActiveFrom time.Time `json:"activeFrom"` + Description *string `json:"description,omitempty"` - // Customizations Batch processing commands for customizing the susbcription. - // The key format is `/phases/{phaseKey}/items/{itemKey}`. - // - // Add operations insert a new member based on the creation input without altering the existing members. - // - // Remove operations remove the member from the document. - Customizations []PlanSubscriptionChange_Customizations_Item `json:"customizations"` - Plan struct { - // Key A key is a unique string that is used to identify a resource. - Key string `json:"key"` - Version int `json:"version"` - } `json:"plan"` -} + // Metadata Set of key-value pairs. + // Metadata can be used to store additional information about a resource. + Metadata *Metadata `json:"metadata,omitempty"` + Name string `json:"name"` -// PlanSubscriptionChange_Customizations_Item defines model for PlanSubscriptionChange.customizations.Item. -type PlanSubscriptionChange_Customizations_Item struct { - union json.RawMessage + // Plan References an exact plan defaulting to the current active version. + Plan PlanReferenceInput `json:"plan"` } // PlanSubscriptionCreate Create subscription based on plan. @@ -3311,30 +3315,17 @@ type PlanSubscriptionCreate struct { // ActiveFrom [RFC3339](https://tools.ietf.org/html/rfc3339) formatted date-time string in UTC. ActiveFrom time.Time `json:"activeFrom"` - // Currency Three-letter [ISO4217](https://www.iso.org/iso-4217-currency-codes.html) currency code. - // Custom three-letter currency codes are also supported for convenience. - Currency CurrencyCode `json:"currency"` - // CustomerId ULID (Universally Unique Lexicographically Sortable Identifier). - CustomerId string `json:"customerId"` + CustomerId string `json:"customerId"` + Description *string `json:"description,omitempty"` - // Customizations Batch processing commands for customizing the susbcription. - // The key format is `/phases/{phaseKey}/items/{itemKey}`. - // - // Add operations insert a new member based on the creation input without altering the existing members. - // - // Remove operations remove the member from the document. - Customizations []PlanSubscriptionCreate_Customizations_Item `json:"customizations"` - Plan struct { - // Key A key is a unique string that is used to identify a resource. - Key string `json:"key"` - Version int `json:"version"` - } `json:"plan"` -} + // Metadata Set of key-value pairs. + // Metadata can be used to store additional information about a resource. + Metadata *Metadata `json:"metadata,omitempty"` + Name string `json:"name"` -// PlanSubscriptionCreate_Customizations_Item defines model for PlanSubscriptionCreate.customizations.Item. -type PlanSubscriptionCreate_Customizations_Item struct { - union json.RawMessage + // Plan References an exact plan defaulting to the current active version. + Plan PlanReferenceInput `json:"plan"` } // PortalToken A consumer portal token. @@ -3439,43 +3430,6 @@ type RateCardFlatFee struct { // RateCardFlatFeeType The type of the RateCard. type RateCardFlatFeeType string -// RateCardFlatFeeUpdateItem A flat fee rate card defines a one-time purchase or a recurring fee. -type RateCardFlatFeeUpdateItem struct { - // BillingCadence The billing cadence of the rate card. - // When null it means it is a one time fee. - BillingCadence *string `json:"billingCadence"` - - // Description Optional description of the resource. Maximum 1024 characters. - Description *string `json:"description,omitempty"` - - // EntitlementTemplate Entitlement templates are used to define the entitlements of a plan. - // Features are omitted from the entitlement template, as they are defined in the rate card. - EntitlementTemplate *RateCardEntitlement `json:"entitlementTemplate,omitempty"` - - // FeatureKey The feature the customer is entitled to use. - FeatureKey *string `json:"featureKey,omitempty"` - - // Metadata Additional metadata for the resource. - Metadata *Metadata `json:"metadata"` - - // Name Human-readable name for the resource. Between 1 and 256 characters. - Name string `json:"name"` - - // Price The price of the rate card. - // When null, the feature or service is free. - Price *FlatPriceWithPaymentTerm `json:"price"` - - // TaxConfig The tax config of the rate card. - // When undefined, the tax config of the feature or the default tax config of the plan is used. - TaxConfig *TaxConfig `json:"taxConfig,omitempty"` - - // Type The type of the RateCard. - Type RateCardFlatFeeUpdateItemType `json:"type"` -} - -// RateCardFlatFeeUpdateItemType The type of the RateCard. -type RateCardFlatFeeUpdateItemType string - // RateCardMeteredEntitlement The entitlement template with a metered entitlement. type RateCardMeteredEntitlement struct { // IsSoftLimit If softLimit=true the subject can use the feature even if the entitlement is exhausted, hasAccess will always be true. @@ -3518,11 +3472,6 @@ type RateCardStaticEntitlement struct { // RateCardStaticEntitlementType defines model for RateCardStaticEntitlement.Type. type RateCardStaticEntitlementType string -// RateCardUpdateItem A rate card defines the pricing and entitlement of a feature or service. -type RateCardUpdateItem struct { - union json.RawMessage -} - // RateCardUsageBased A usage-based rate card defines a price based on usage. type RateCardUsageBased struct { // BillingCadence The billing cadence of the rate card. @@ -3564,39 +3513,6 @@ type RateCardUsageBasedPrice struct { union json.RawMessage } -// RateCardUsageBasedUpdateItem A usage-based rate card defines a price based on usage. -type RateCardUsageBasedUpdateItem struct { - // BillingCadence The billing cadence of the rate card. - BillingCadence string `json:"billingCadence"` - - // Description Optional description of the resource. Maximum 1024 characters. - Description *string `json:"description,omitempty"` - - // EntitlementTemplate Entitlement templates are used to define the entitlements of a plan. - // Features are omitted from the entitlement template, as they are defined in the rate card. - EntitlementTemplate *RateCardEntitlement `json:"entitlementTemplate,omitempty"` - - // FeatureKey The feature the customer is entitled to use. - FeatureKey *string `json:"featureKey,omitempty"` - - // Metadata Additional metadata for the resource. - Metadata *Metadata `json:"metadata"` - - // Name Human-readable name for the resource. Between 1 and 256 characters. - Name string `json:"name"` - Price *RateCardUsageBasedPrice `json:"price"` - - // TaxConfig The tax config of the rate card. - // When undefined, the tax config of the feature or the default tax config of the plan is used. - TaxConfig *TaxConfig `json:"taxConfig,omitempty"` - - // Type The type of the RateCard. - Type RateCardUsageBasedUpdateItemType `json:"type"` -} - -// RateCardUsageBasedUpdateItemType The type of the RateCard. -type RateCardUsageBasedUpdateItemType string - // RecurringPeriod Recurring period with an interval and an anchor. type RecurringPeriod struct { // Anchor A date-time anchor to base the recurring period on. @@ -3854,7 +3770,10 @@ type Subject struct { // Subscription Subscription is an exact subscription instance. type Subscription struct { - // ActiveTo If the subscription is canceled or otherwise have to end activeTo denotes the end date. + // ActiveFrom The cadence start of the resource. + ActiveFrom time.Time `json:"activeFrom"` + + // ActiveTo The cadence end of the resource. ActiveTo *time.Time `json:"activeTo,omitempty"` // CreatedAt Timestamp of when the resource was created. @@ -3899,89 +3818,24 @@ type SubscriptionCreate struct { union json.RawMessage } -// SubscriptionEditAdd Subscription item add operation. -type SubscriptionEditAdd struct { - Op SubscriptionEditAddOp `json:"op"` - Path string `json:"path"` - - // Value Subscription phase create input. - Value SubscriptionPhaseCreate `json:"value"` -} - -// SubscriptionEditAddOp defines model for SubscriptionEditAdd.Op. -type SubscriptionEditAddOp string - -// SubscriptionEditAddItem Subscription item add operation. -type SubscriptionEditAddItem struct { - Op SubscriptionEditAddItemOp `json:"op"` - Path string `json:"path"` - - // Value A rate card defines the pricing and entitlement of a feature or service. - Value RateCard `json:"value"` -} - -// SubscriptionEditAddItemOp defines model for SubscriptionEditAddItem.Op. -type SubscriptionEditAddItemOp string - -// SubscriptionEditAddUpdateItem Subscription item add operation. -type SubscriptionEditAddUpdateItem struct { - Op SubscriptionEditAddUpdateItemOp `json:"op"` - Path string `json:"path"` - - // Value A rate card defines the pricing and entitlement of a feature or service. - Value RateCardUpdateItem `json:"value"` -} - -// SubscriptionEditAddUpdateItemOp defines model for SubscriptionEditAddUpdateItem.Op. -type SubscriptionEditAddUpdateItemOp string - -// SubscriptionEditRemoveItem Subscription phase remove operation. -type SubscriptionEditRemoveItem struct { - Op SubscriptionEditRemoveItemOp `json:"op"` - Path string `json:"path"` -} - -// SubscriptionEditRemoveItemOp defines model for SubscriptionEditRemoveItem.Op. -type SubscriptionEditRemoveItemOp string - -// SubscriptionEditRemoveUpdateItem Subscription phase remove operation. -type SubscriptionEditRemoveUpdateItem struct { - Op SubscriptionEditRemoveUpdateItemOp `json:"op"` - Path string `json:"path"` -} - -// SubscriptionEditRemoveUpdateItemOp defines model for SubscriptionEditRemoveUpdateItem.Op. -type SubscriptionEditRemoveUpdateItemOp string - -// SubscriptionEditRemoveWithValue Subscription item remove operation with a value. -type SubscriptionEditRemoveWithValue struct { - Op SubscriptionEditRemoveWithValueOp `json:"op"` - Path string `json:"path"` - Value struct { - // Shift The direction of the phase shift when a phase is removed. - Shift RemovePhaseShifting `json:"shift"` - } `json:"value"` +// SubscriptionEdit Subscription edit input. +type SubscriptionEdit struct { + // Customizations Batch processing commands for manipulating running subscriptions. + // The key format is `/phases/{phaseKey}` or `/phases/{phaseKey}/items/{itemKey}`. + Customizations []SubscriptionEditOperation `json:"customizations"` } -// SubscriptionEditRemoveWithValueOp defines model for SubscriptionEditRemoveWithValue.Op. -type SubscriptionEditRemoveWithValueOp string - -// SubscriptionEditStretch Subscription phase stretch operation. -type SubscriptionEditStretch struct { - Op SubscriptionEditStretchOp `json:"op"` - Path string `json:"path"` - Value struct { - // ExtendBy The signed duration to extend or shrink the phase by. - ExtendBy string `json:"extendBy"` - } `json:"value"` +// SubscriptionEditOperation defines model for SubscriptionEditOperation. +type SubscriptionEditOperation struct { + union json.RawMessage } -// SubscriptionEditStretchOp defines model for SubscriptionEditStretch.Op. -type SubscriptionEditStretchOp string - // SubscriptionExpanded Expanded subscription type SubscriptionExpanded struct { - // ActiveTo If the subscription is canceled or otherwise have to end activeTo denotes the end date. + // ActiveFrom The cadence start of the resource. + ActiveFrom time.Time `json:"activeFrom"` + + // ActiveTo The cadence end of the resource. ActiveTo *time.Time `json:"activeTo,omitempty"` // CreatedAt Timestamp of when the resource was created. @@ -4019,6 +3873,12 @@ type SubscriptionExpanded struct { // SubscriptionItem The actual contents of the Subscription, what the user gets, what they pay, etc... type SubscriptionItem struct { + // ActiveFrom The cadence start of the resource. + ActiveFrom time.Time `json:"activeFrom"` + + // ActiveTo The cadence end of the resource. + ActiveTo *time.Time `json:"activeTo,omitempty"` + // BillingCandence The billing cadence of the rate card. // When null, the rate card is a one-time purchase. BillingCandence *string `json:"billingCandence"` @@ -4036,14 +3896,7 @@ type SubscriptionItem struct { Id string `json:"id"` // Included Describes what access is gained via the SubscriptionItem - Included *struct { - // Entitlement Entitlement templates are used to define the entitlements of a plan. - // Features are omitted from the entitlement template, as they are defined in the rate card. - Entitlement *Entitlement `json:"entitlement,omitempty"` - - // Feature The feature the customer is entitled to use. - Feature Feature `json:"feature"` - } `json:"included,omitempty"` + Included *SubscriptionItemIncluded `json:"included,omitempty"` // Key The identifier of the RateCard. // SubscriptionItem/RateCard can be identified, it has a reference: @@ -4084,22 +3937,39 @@ type SubscriptionItemPrice1 = UnitPriceWithCommitments // SubscriptionItemPrice2 Tiered price with spend commitments. type SubscriptionItemPrice2 = TieredPriceWithCommitments -// SubscriptionItemPrice3 Flat price with payment term. -type SubscriptionItemPrice3 = FlatPriceWithPaymentTerm - // SubscriptionItem_Price The price of the rate card. // When null, the feature or service is free. type SubscriptionItem_Price struct { union json.RawMessage } +// SubscriptionItemIncluded Included contents like Entitlement, or the Feature. +type SubscriptionItemIncluded struct { + // Entitlement Entitlement templates are used to define the entitlements of a plan. + // Features are omitted from the entitlement template, as they are defined in the rate card. + Entitlement *Entitlement `json:"entitlement,omitempty"` + + // Feature The feature the customer is entitled to use. + Feature Feature `json:"feature"` +} + // SubscriptionPhaseCreate Subscription phase create input. type SubscriptionPhaseCreate struct { + // Description The description of the phase. + Description *string `json:"description,omitempty"` + // Discounts The discounts on the plan. - Discounts *[]DiscountUpdateItem `json:"discounts,omitempty"` + Discounts *[]Discount `json:"discounts,omitempty"` // Duration The intended duration of the new phase. - Duration string `json:"duration"` + // Duration is required when the phase will not be the last phase. + Duration *string `json:"duration,omitempty"` + + // Key A locally unique identifier for the phase. + Key string `json:"key"` + + // Name The name of the phase. + Name string `json:"name"` // StartAfter Interval after the subscription starts to transition to the phase. // When null, the phase starts immediately after the subscription starts. @@ -4111,6 +3981,9 @@ type SubscriptionPhaseExpanded struct { // ActiveFrom The time from which the phase is active. ActiveFrom time.Time `json:"activeFrom"` + // ActiveTo The until which the Phase is active. + ActiveTo *time.Time `json:"activeTo,omitempty"` + // CreatedAt Timestamp of when the resource was created. CreatedAt time.Time `json:"createdAt"` @@ -4123,9 +3996,6 @@ type SubscriptionPhaseExpanded struct { // Discounts The discounts on the plan. Discounts *[]Discount `json:"discounts,omitempty"` - // Duration The intended duration of the new phase. - Duration string `json:"duration"` - // Id A unique identifier for the resource. Id string `json:"id"` Items []SubscriptionItem `json:"items"` @@ -5230,23 +5100,10 @@ type GetEntitlementHistoryParams struct { // GetSubscriptionParams defines parameters for GetSubscription. type GetSubscriptionParams struct { - Expand *GetSubscriptionParamsExpand `form:"expand,omitempty" json:"expand,omitempty"` - // At The time at which the subscription should be queried. If not provided the current time is used. At *time.Time `form:"at,omitempty" json:"at,omitempty"` } -// GetSubscriptionParamsExpand defines parameters for GetSubscription. -type GetSubscriptionParamsExpand bool - -// EditSubscriptionJSONBody defines parameters for EditSubscription. -type EditSubscriptionJSONBody = []EditSubscriptionJSONBody_Item - -// EditSubscriptionJSONBody_Item defines parameters for EditSubscription. -type EditSubscriptionJSONBody_Item struct { - union json.RawMessage -} - // CancelSubscriptionJSONBody defines parameters for CancelSubscription. type CancelSubscriptionJSONBody struct { // EffectiveDate If not provided the subscription is canceled immediately. @@ -5355,7 +5212,7 @@ type ResetEntitlementUsageJSONRequestBody = ResetEntitlementUsageInput type CreateSubscriptionJSONRequestBody = SubscriptionCreate // EditSubscriptionJSONRequestBody defines body for EditSubscription for application/json ContentType. -type EditSubscriptionJSONRequestBody = EditSubscriptionJSONBody +type EditSubscriptionJSONRequestBody = SubscriptionEdit // CancelSubscriptionJSONRequestBody defines body for CancelSubscription for application/json ContentType. type CancelSubscriptionJSONRequestBody CancelSubscriptionJSONBody @@ -6483,22 +6340,24 @@ func (t *PaymentTerms) UnmarshalJSON(b []byte) error { return err } -// AsSubscriptionEditAddItem returns the union data inside the PlanSubscriptionChange_Customizations_Item as a SubscriptionEditAddItem -func (t PlanSubscriptionChange_Customizations_Item) AsSubscriptionEditAddItem() (SubscriptionEditAddItem, error) { - var body SubscriptionEditAddItem +// AsRateCardFlatFee returns the union data inside the RateCard as a RateCardFlatFee +func (t RateCard) AsRateCardFlatFee() (RateCardFlatFee, error) { + var body RateCardFlatFee err := json.Unmarshal(t.union, &body) return body, err } -// FromSubscriptionEditAddItem overwrites any union data inside the PlanSubscriptionChange_Customizations_Item as the provided SubscriptionEditAddItem -func (t *PlanSubscriptionChange_Customizations_Item) FromSubscriptionEditAddItem(v SubscriptionEditAddItem) error { +// FromRateCardFlatFee overwrites any union data inside the RateCard as the provided RateCardFlatFee +func (t *RateCard) FromRateCardFlatFee(v RateCardFlatFee) error { + v.Type = "flat_fee" b, err := json.Marshal(v) t.union = b return err } -// MergeSubscriptionEditAddItem performs a merge with any union data inside the PlanSubscriptionChange_Customizations_Item, using the provided SubscriptionEditAddItem -func (t *PlanSubscriptionChange_Customizations_Item) MergeSubscriptionEditAddItem(v SubscriptionEditAddItem) error { +// MergeRateCardFlatFee performs a merge with any union data inside the RateCard, using the provided RateCardFlatFee +func (t *RateCard) MergeRateCardFlatFee(v RateCardFlatFee) error { + v.Type = "flat_fee" b, err := json.Marshal(v) if err != nil { return err @@ -6509,150 +6368,24 @@ func (t *PlanSubscriptionChange_Customizations_Item) MergeSubscriptionEditAddIte return err } -// AsSubscriptionEditRemoveItem returns the union data inside the PlanSubscriptionChange_Customizations_Item as a SubscriptionEditRemoveItem -func (t PlanSubscriptionChange_Customizations_Item) AsSubscriptionEditRemoveItem() (SubscriptionEditRemoveItem, error) { - var body SubscriptionEditRemoveItem +// AsRateCardUsageBased returns the union data inside the RateCard as a RateCardUsageBased +func (t RateCard) AsRateCardUsageBased() (RateCardUsageBased, error) { + var body RateCardUsageBased err := json.Unmarshal(t.union, &body) return body, err } -// FromSubscriptionEditRemoveItem overwrites any union data inside the PlanSubscriptionChange_Customizations_Item as the provided SubscriptionEditRemoveItem -func (t *PlanSubscriptionChange_Customizations_Item) FromSubscriptionEditRemoveItem(v SubscriptionEditRemoveItem) error { +// FromRateCardUsageBased overwrites any union data inside the RateCard as the provided RateCardUsageBased +func (t *RateCard) FromRateCardUsageBased(v RateCardUsageBased) error { + v.Type = "usage_based" b, err := json.Marshal(v) t.union = b return err } -// MergeSubscriptionEditRemoveItem performs a merge with any union data inside the PlanSubscriptionChange_Customizations_Item, using the provided SubscriptionEditRemoveItem -func (t *PlanSubscriptionChange_Customizations_Item) MergeSubscriptionEditRemoveItem(v SubscriptionEditRemoveItem) error { - b, err := json.Marshal(v) - if err != nil { - return err - } - - merged, err := runtime.JSONMerge(t.union, b) - t.union = merged - return err -} - -func (t PlanSubscriptionChange_Customizations_Item) MarshalJSON() ([]byte, error) { - b, err := t.union.MarshalJSON() - return b, err -} - -func (t *PlanSubscriptionChange_Customizations_Item) UnmarshalJSON(b []byte) error { - err := t.union.UnmarshalJSON(b) - return err -} - -// AsSubscriptionEditAddItem returns the union data inside the PlanSubscriptionCreate_Customizations_Item as a SubscriptionEditAddItem -func (t PlanSubscriptionCreate_Customizations_Item) AsSubscriptionEditAddItem() (SubscriptionEditAddItem, error) { - var body SubscriptionEditAddItem - err := json.Unmarshal(t.union, &body) - return body, err -} - -// FromSubscriptionEditAddItem overwrites any union data inside the PlanSubscriptionCreate_Customizations_Item as the provided SubscriptionEditAddItem -func (t *PlanSubscriptionCreate_Customizations_Item) FromSubscriptionEditAddItem(v SubscriptionEditAddItem) error { - b, err := json.Marshal(v) - t.union = b - return err -} - -// MergeSubscriptionEditAddItem performs a merge with any union data inside the PlanSubscriptionCreate_Customizations_Item, using the provided SubscriptionEditAddItem -func (t *PlanSubscriptionCreate_Customizations_Item) MergeSubscriptionEditAddItem(v SubscriptionEditAddItem) error { - b, err := json.Marshal(v) - if err != nil { - return err - } - - merged, err := runtime.JSONMerge(t.union, b) - t.union = merged - return err -} - -// AsSubscriptionEditRemoveItem returns the union data inside the PlanSubscriptionCreate_Customizations_Item as a SubscriptionEditRemoveItem -func (t PlanSubscriptionCreate_Customizations_Item) AsSubscriptionEditRemoveItem() (SubscriptionEditRemoveItem, error) { - var body SubscriptionEditRemoveItem - err := json.Unmarshal(t.union, &body) - return body, err -} - -// FromSubscriptionEditRemoveItem overwrites any union data inside the PlanSubscriptionCreate_Customizations_Item as the provided SubscriptionEditRemoveItem -func (t *PlanSubscriptionCreate_Customizations_Item) FromSubscriptionEditRemoveItem(v SubscriptionEditRemoveItem) error { - b, err := json.Marshal(v) - t.union = b - return err -} - -// MergeSubscriptionEditRemoveItem performs a merge with any union data inside the PlanSubscriptionCreate_Customizations_Item, using the provided SubscriptionEditRemoveItem -func (t *PlanSubscriptionCreate_Customizations_Item) MergeSubscriptionEditRemoveItem(v SubscriptionEditRemoveItem) error { - b, err := json.Marshal(v) - if err != nil { - return err - } - - merged, err := runtime.JSONMerge(t.union, b) - t.union = merged - return err -} - -func (t PlanSubscriptionCreate_Customizations_Item) MarshalJSON() ([]byte, error) { - b, err := t.union.MarshalJSON() - return b, err -} - -func (t *PlanSubscriptionCreate_Customizations_Item) UnmarshalJSON(b []byte) error { - err := t.union.UnmarshalJSON(b) - return err -} - -// AsRateCardFlatFee returns the union data inside the RateCard as a RateCardFlatFee -func (t RateCard) AsRateCardFlatFee() (RateCardFlatFee, error) { - var body RateCardFlatFee - err := json.Unmarshal(t.union, &body) - return body, err -} - -// FromRateCardFlatFee overwrites any union data inside the RateCard as the provided RateCardFlatFee -func (t *RateCard) FromRateCardFlatFee(v RateCardFlatFee) error { - v.Type = "flat_fee" - b, err := json.Marshal(v) - t.union = b - return err -} - -// MergeRateCardFlatFee performs a merge with any union data inside the RateCard, using the provided RateCardFlatFee -func (t *RateCard) MergeRateCardFlatFee(v RateCardFlatFee) error { - v.Type = "flat_fee" - b, err := json.Marshal(v) - if err != nil { - return err - } - - merged, err := runtime.JSONMerge(t.union, b) - t.union = merged - return err -} - -// AsRateCardUsageBased returns the union data inside the RateCard as a RateCardUsageBased -func (t RateCard) AsRateCardUsageBased() (RateCardUsageBased, error) { - var body RateCardUsageBased - err := json.Unmarshal(t.union, &body) - return body, err -} - -// FromRateCardUsageBased overwrites any union data inside the RateCard as the provided RateCardUsageBased -func (t *RateCard) FromRateCardUsageBased(v RateCardUsageBased) error { - v.Type = "usage_based" - b, err := json.Marshal(v) - t.union = b - return err -} - -// MergeRateCardUsageBased performs a merge with any union data inside the RateCard, using the provided RateCardUsageBased -func (t *RateCard) MergeRateCardUsageBased(v RateCardUsageBased) error { - v.Type = "usage_based" +// MergeRateCardUsageBased performs a merge with any union data inside the RateCard, using the provided RateCardUsageBased +func (t *RateCard) MergeRateCardUsageBased(v RateCardUsageBased) error { + v.Type = "usage_based" b, err := json.Marshal(v) if err != nil { return err @@ -6815,95 +6548,6 @@ func (t *RateCardEntitlement) UnmarshalJSON(b []byte) error { return err } -// AsRateCardFlatFeeUpdateItem returns the union data inside the RateCardUpdateItem as a RateCardFlatFeeUpdateItem -func (t RateCardUpdateItem) AsRateCardFlatFeeUpdateItem() (RateCardFlatFeeUpdateItem, error) { - var body RateCardFlatFeeUpdateItem - err := json.Unmarshal(t.union, &body) - return body, err -} - -// FromRateCardFlatFeeUpdateItem overwrites any union data inside the RateCardUpdateItem as the provided RateCardFlatFeeUpdateItem -func (t *RateCardUpdateItem) FromRateCardFlatFeeUpdateItem(v RateCardFlatFeeUpdateItem) error { - v.Type = "flat_fee" - b, err := json.Marshal(v) - t.union = b - return err -} - -// MergeRateCardFlatFeeUpdateItem performs a merge with any union data inside the RateCardUpdateItem, using the provided RateCardFlatFeeUpdateItem -func (t *RateCardUpdateItem) MergeRateCardFlatFeeUpdateItem(v RateCardFlatFeeUpdateItem) error { - v.Type = "flat_fee" - b, err := json.Marshal(v) - if err != nil { - return err - } - - merged, err := runtime.JSONMerge(t.union, b) - t.union = merged - return err -} - -// AsRateCardUsageBasedUpdateItem returns the union data inside the RateCardUpdateItem as a RateCardUsageBasedUpdateItem -func (t RateCardUpdateItem) AsRateCardUsageBasedUpdateItem() (RateCardUsageBasedUpdateItem, error) { - var body RateCardUsageBasedUpdateItem - err := json.Unmarshal(t.union, &body) - return body, err -} - -// FromRateCardUsageBasedUpdateItem overwrites any union data inside the RateCardUpdateItem as the provided RateCardUsageBasedUpdateItem -func (t *RateCardUpdateItem) FromRateCardUsageBasedUpdateItem(v RateCardUsageBasedUpdateItem) error { - v.Type = "usage_based" - b, err := json.Marshal(v) - t.union = b - return err -} - -// MergeRateCardUsageBasedUpdateItem performs a merge with any union data inside the RateCardUpdateItem, using the provided RateCardUsageBasedUpdateItem -func (t *RateCardUpdateItem) MergeRateCardUsageBasedUpdateItem(v RateCardUsageBasedUpdateItem) error { - v.Type = "usage_based" - b, err := json.Marshal(v) - if err != nil { - return err - } - - merged, err := runtime.JSONMerge(t.union, b) - t.union = merged - return err -} - -func (t RateCardUpdateItem) Discriminator() (string, error) { - var discriminator struct { - Discriminator string `json:"type"` - } - err := json.Unmarshal(t.union, &discriminator) - return discriminator.Discriminator, err -} - -func (t RateCardUpdateItem) ValueByDiscriminator() (interface{}, error) { - discriminator, err := t.Discriminator() - if err != nil { - return nil, err - } - switch discriminator { - case "flat_fee": - return t.AsRateCardFlatFeeUpdateItem() - case "usage_based": - return t.AsRateCardUsageBasedUpdateItem() - default: - return nil, errors.New("unknown discriminator value: " + discriminator) - } -} - -func (t RateCardUpdateItem) MarshalJSON() ([]byte, error) { - b, err := t.union.MarshalJSON() - return b, err -} - -func (t *RateCardUpdateItem) UnmarshalJSON(b []byte) error { - err := t.union.UnmarshalJSON(b) - return err -} - // AsFlatPriceWithPaymentTerm returns the union data inside the RateCardUsageBasedPrice as a FlatPriceWithPaymentTerm func (t RateCardUsageBasedPrice) AsFlatPriceWithPaymentTerm() (FlatPriceWithPaymentTerm, error) { var body FlatPriceWithPaymentTerm @@ -7111,22 +6755,22 @@ func (t *SubscriptionCreate) MergePlanSubscriptionCreate(v PlanSubscriptionCreat return err } -// AsCreateCustomSubscriptionRequestBody returns the union data inside the SubscriptionCreate as a CreateCustomSubscriptionRequestBody -func (t SubscriptionCreate) AsCreateCustomSubscriptionRequestBody() (CreateCustomSubscriptionRequestBody, error) { - var body CreateCustomSubscriptionRequestBody +// AsCustomSubscriptionCreate returns the union data inside the SubscriptionCreate as a CustomSubscriptionCreate +func (t SubscriptionCreate) AsCustomSubscriptionCreate() (CustomSubscriptionCreate, error) { + var body CustomSubscriptionCreate err := json.Unmarshal(t.union, &body) return body, err } -// FromCreateCustomSubscriptionRequestBody overwrites any union data inside the SubscriptionCreate as the provided CreateCustomSubscriptionRequestBody -func (t *SubscriptionCreate) FromCreateCustomSubscriptionRequestBody(v CreateCustomSubscriptionRequestBody) error { +// FromCustomSubscriptionCreate overwrites any union data inside the SubscriptionCreate as the provided CustomSubscriptionCreate +func (t *SubscriptionCreate) FromCustomSubscriptionCreate(v CustomSubscriptionCreate) error { b, err := json.Marshal(v) t.union = b return err } -// MergeCreateCustomSubscriptionRequestBody performs a merge with any union data inside the SubscriptionCreate, using the provided CreateCustomSubscriptionRequestBody -func (t *SubscriptionCreate) MergeCreateCustomSubscriptionRequestBody(v CreateCustomSubscriptionRequestBody) error { +// MergeCustomSubscriptionCreate performs a merge with any union data inside the SubscriptionCreate, using the provided CustomSubscriptionCreate +func (t *SubscriptionCreate) MergeCustomSubscriptionCreate(v CustomSubscriptionCreate) error { b, err := json.Marshal(v) if err != nil { return err @@ -7147,6 +6791,185 @@ func (t *SubscriptionCreate) UnmarshalJSON(b []byte) error { return err } +// AsEditSubscriptionAddItem returns the union data inside the SubscriptionEditOperation as a EditSubscriptionAddItem +func (t SubscriptionEditOperation) AsEditSubscriptionAddItem() (EditSubscriptionAddItem, error) { + var body EditSubscriptionAddItem + err := json.Unmarshal(t.union, &body) + return body, err +} + +// FromEditSubscriptionAddItem overwrites any union data inside the SubscriptionEditOperation as the provided EditSubscriptionAddItem +func (t *SubscriptionEditOperation) FromEditSubscriptionAddItem(v EditSubscriptionAddItem) error { + v.Op = "add_item" + b, err := json.Marshal(v) + t.union = b + return err +} + +// MergeEditSubscriptionAddItem performs a merge with any union data inside the SubscriptionEditOperation, using the provided EditSubscriptionAddItem +func (t *SubscriptionEditOperation) MergeEditSubscriptionAddItem(v EditSubscriptionAddItem) error { + v.Op = "add_item" + b, err := json.Marshal(v) + if err != nil { + return err + } + + merged, err := runtime.JSONMerge(t.union, b) + t.union = merged + return err +} + +// AsEditSubscriptionRemoveItem returns the union data inside the SubscriptionEditOperation as a EditSubscriptionRemoveItem +func (t SubscriptionEditOperation) AsEditSubscriptionRemoveItem() (EditSubscriptionRemoveItem, error) { + var body EditSubscriptionRemoveItem + err := json.Unmarshal(t.union, &body) + return body, err +} + +// FromEditSubscriptionRemoveItem overwrites any union data inside the SubscriptionEditOperation as the provided EditSubscriptionRemoveItem +func (t *SubscriptionEditOperation) FromEditSubscriptionRemoveItem(v EditSubscriptionRemoveItem) error { + v.Op = "remove_item" + b, err := json.Marshal(v) + t.union = b + return err +} + +// MergeEditSubscriptionRemoveItem performs a merge with any union data inside the SubscriptionEditOperation, using the provided EditSubscriptionRemoveItem +func (t *SubscriptionEditOperation) MergeEditSubscriptionRemoveItem(v EditSubscriptionRemoveItem) error { + v.Op = "remove_item" + b, err := json.Marshal(v) + if err != nil { + return err + } + + merged, err := runtime.JSONMerge(t.union, b) + t.union = merged + return err +} + +// AsEditSubscriptionAddPhase returns the union data inside the SubscriptionEditOperation as a EditSubscriptionAddPhase +func (t SubscriptionEditOperation) AsEditSubscriptionAddPhase() (EditSubscriptionAddPhase, error) { + var body EditSubscriptionAddPhase + err := json.Unmarshal(t.union, &body) + return body, err +} + +// FromEditSubscriptionAddPhase overwrites any union data inside the SubscriptionEditOperation as the provided EditSubscriptionAddPhase +func (t *SubscriptionEditOperation) FromEditSubscriptionAddPhase(v EditSubscriptionAddPhase) error { + v.Op = "add_phase" + b, err := json.Marshal(v) + t.union = b + return err +} + +// MergeEditSubscriptionAddPhase performs a merge with any union data inside the SubscriptionEditOperation, using the provided EditSubscriptionAddPhase +func (t *SubscriptionEditOperation) MergeEditSubscriptionAddPhase(v EditSubscriptionAddPhase) error { + v.Op = "add_phase" + b, err := json.Marshal(v) + if err != nil { + return err + } + + merged, err := runtime.JSONMerge(t.union, b) + t.union = merged + return err +} + +// AsEditSubscriptionRemovePhase returns the union data inside the SubscriptionEditOperation as a EditSubscriptionRemovePhase +func (t SubscriptionEditOperation) AsEditSubscriptionRemovePhase() (EditSubscriptionRemovePhase, error) { + var body EditSubscriptionRemovePhase + err := json.Unmarshal(t.union, &body) + return body, err +} + +// FromEditSubscriptionRemovePhase overwrites any union data inside the SubscriptionEditOperation as the provided EditSubscriptionRemovePhase +func (t *SubscriptionEditOperation) FromEditSubscriptionRemovePhase(v EditSubscriptionRemovePhase) error { + v.Op = "remove_phase" + b, err := json.Marshal(v) + t.union = b + return err +} + +// MergeEditSubscriptionRemovePhase performs a merge with any union data inside the SubscriptionEditOperation, using the provided EditSubscriptionRemovePhase +func (t *SubscriptionEditOperation) MergeEditSubscriptionRemovePhase(v EditSubscriptionRemovePhase) error { + v.Op = "remove_phase" + b, err := json.Marshal(v) + if err != nil { + return err + } + + merged, err := runtime.JSONMerge(t.union, b) + t.union = merged + return err +} + +// AsEditSubscriptionStretchPhase returns the union data inside the SubscriptionEditOperation as a EditSubscriptionStretchPhase +func (t SubscriptionEditOperation) AsEditSubscriptionStretchPhase() (EditSubscriptionStretchPhase, error) { + var body EditSubscriptionStretchPhase + err := json.Unmarshal(t.union, &body) + return body, err +} + +// FromEditSubscriptionStretchPhase overwrites any union data inside the SubscriptionEditOperation as the provided EditSubscriptionStretchPhase +func (t *SubscriptionEditOperation) FromEditSubscriptionStretchPhase(v EditSubscriptionStretchPhase) error { + v.Op = "stretch_phase" + b, err := json.Marshal(v) + t.union = b + return err +} + +// MergeEditSubscriptionStretchPhase performs a merge with any union data inside the SubscriptionEditOperation, using the provided EditSubscriptionStretchPhase +func (t *SubscriptionEditOperation) MergeEditSubscriptionStretchPhase(v EditSubscriptionStretchPhase) error { + v.Op = "stretch_phase" + b, err := json.Marshal(v) + if err != nil { + return err + } + + merged, err := runtime.JSONMerge(t.union, b) + t.union = merged + return err +} + +func (t SubscriptionEditOperation) Discriminator() (string, error) { + var discriminator struct { + Discriminator string `json:"op"` + } + err := json.Unmarshal(t.union, &discriminator) + return discriminator.Discriminator, err +} + +func (t SubscriptionEditOperation) ValueByDiscriminator() (interface{}, error) { + discriminator, err := t.Discriminator() + if err != nil { + return nil, err + } + switch discriminator { + case "add_item": + return t.AsEditSubscriptionAddItem() + case "add_phase": + return t.AsEditSubscriptionAddPhase() + case "remove_item": + return t.AsEditSubscriptionRemoveItem() + case "remove_phase": + return t.AsEditSubscriptionRemovePhase() + case "stretch_phase": + return t.AsEditSubscriptionStretchPhase() + default: + return nil, errors.New("unknown discriminator value: " + discriminator) + } +} + +func (t SubscriptionEditOperation) MarshalJSON() ([]byte, error) { + b, err := t.union.MarshalJSON() + return b, err +} + +func (t *SubscriptionEditOperation) UnmarshalJSON(b []byte) error { + err := t.union.UnmarshalJSON(b) + return err +} + // AsSubscriptionItemPrice0 returns the union data inside the SubscriptionItem_Price as a SubscriptionItemPrice0 func (t SubscriptionItem_Price) AsSubscriptionItemPrice0() (SubscriptionItemPrice0, error) { var body SubscriptionItemPrice0 @@ -7225,32 +7048,6 @@ func (t *SubscriptionItem_Price) MergeSubscriptionItemPrice2(v SubscriptionItemP return err } -// AsSubscriptionItemPrice3 returns the union data inside the SubscriptionItem_Price as a SubscriptionItemPrice3 -func (t SubscriptionItem_Price) AsSubscriptionItemPrice3() (SubscriptionItemPrice3, error) { - var body SubscriptionItemPrice3 - err := json.Unmarshal(t.union, &body) - return body, err -} - -// FromSubscriptionItemPrice3 overwrites any union data inside the SubscriptionItem_Price as the provided SubscriptionItemPrice3 -func (t *SubscriptionItem_Price) FromSubscriptionItemPrice3(v SubscriptionItemPrice3) error { - b, err := json.Marshal(v) - t.union = b - return err -} - -// MergeSubscriptionItemPrice3 performs a merge with any union data inside the SubscriptionItem_Price, using the provided SubscriptionItemPrice3 -func (t *SubscriptionItem_Price) MergeSubscriptionItemPrice3(v SubscriptionItemPrice3) error { - b, err := json.Marshal(v) - if err != nil { - return err - } - - merged, err := runtime.JSONMerge(t.union, b) - t.union = merged - return err -} - func (t SubscriptionItem_Price) MarshalJSON() ([]byte, error) { b, err := t.union.MarshalJSON() return b, err @@ -7732,7 +7529,7 @@ type ServerInterface interface { // Create subscription // (POST /api/v1/subscriptions) CreateSubscription(w http.ResponseWriter, r *http.Request) - // Get subscription Get subscription + // Get subscription // (GET /api/v1/subscriptions/{subscriptionId}) GetSubscription(w http.ResponseWriter, r *http.Request, subscriptionId string, params GetSubscriptionParams) // Edit subscription @@ -8338,7 +8135,7 @@ func (_ Unimplemented) CreateSubscription(w http.ResponseWriter, r *http.Request w.WriteHeader(http.StatusNotImplemented) } -// Get subscription Get subscription +// Get subscription // (GET /api/v1/subscriptions/{subscriptionId}) func (_ Unimplemented) GetSubscription(w http.ResponseWriter, r *http.Request, subscriptionId string, params GetSubscriptionParams) { w.WriteHeader(http.StatusNotImplemented) @@ -12123,14 +11920,6 @@ func (siw *ServerInterfaceWrapper) GetSubscription(w http.ResponseWriter, r *htt // Parameter object where we will unmarshal all parameters from the context var params GetSubscriptionParams - // ------------- Optional query parameter "expand" ------------- - - err = runtime.BindQueryParameter("form", false, false, "expand", r.URL.Query(), ¶ms.Expand) - if err != nil { - siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "expand", Err: err}) - return - } - // ------------- Optional query parameter "at" ------------- err = runtime.BindQueryParameter("form", false, false, "at", r.URL.Query(), ¶ms.At) @@ -12704,724 +12493,721 @@ func HandlerWithOptions(si ServerInterface, options ChiServerOptions) http.Handl // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/api/client/go/client.gen.go b/api/client/go/client.gen.go index a2895e663..45639f197 100644 --- a/api/client/go/client.gen.go +++ b/api/client/go/client.gen.go @@ -51,246 +51,229 @@ const ( AppTypeStripe AppType = "stripe" ) -// Defines values for BillingCustomerOverrideOrderBy. +// Defines values for BillingProfileCustomerOverrideOrderBy. const ( - BillingCustomerOverrideOrderById BillingCustomerOverrideOrderBy = "id" + BillingProfileCustomerOverrideOrderById BillingProfileCustomerOverrideOrderBy = "id" ) -// Defines values for BillingDocumentRefType. +// Defines values for BillingProfileExpand. const ( - CreditNodeOriginalInvoice BillingDocumentRefType = "credit_node_original_invoice" + BillingProfileExpandAll BillingProfileExpand = "*" + BillingProfileExpandApps BillingProfileExpand = "apps" ) -// Defines values for BillingFlatFeeLineType. +// Defines values for BillingProfileOrderBy. const ( - BillingFlatFeeLineTypeFlatFee BillingFlatFeeLineType = "flat_fee" + BillingProfileOrderByCreatedAt BillingProfileOrderBy = "createdAt" + BillingProfileOrderByDefault BillingProfileOrderBy = "default" + BillingProfileOrderByName BillingProfileOrderBy = "name" + BillingProfileOrderByUpdatedAt BillingProfileOrderBy = "updatedAt" ) -// Defines values for BillingFlatFeeLineCreateType. +// Defines values for BillingWorkflowCollectionAlignmentSubscriptionType. const ( - BillingFlatFeeLineCreateTypeFlatFee BillingFlatFeeLineCreateType = "flat_fee" + BillingWorkflowCollectionAlignmentSubscriptionTypeSubscription BillingWorkflowCollectionAlignmentSubscriptionType = "subscription" ) -// Defines values for BillingFlatFeeLineCreateItemType. +// Defines values for CheckoutSessionUIMode. const ( - BillingFlatFeeLineCreateItemTypeFlatFee BillingFlatFeeLineCreateItemType = "flat_fee" + Embedded CheckoutSessionUIMode = "embedded" + Hosted CheckoutSessionUIMode = "hosted" ) -// Defines values for BillingInvoiceAction. +// Defines values for CollectionMethod. const ( - Advance BillingInvoiceAction = "advance" - Approve BillingInvoiceAction = "approve" - Delete BillingInvoiceAction = "delete" - Retry BillingInvoiceAction = "retry" - Void BillingInvoiceAction = "void" + ChargeAutomatically CollectionMethod = "charge_automatically" + SendInvoice CollectionMethod = "send_invoice" ) -// Defines values for BillingInvoiceExpand. +// Defines values for CustomerOrderBy. const ( - BillingInvoiceExpandAll BillingInvoiceExpand = "*" - BillingInvoiceExpandLines BillingInvoiceExpand = "lines" - BillingInvoiceExpandPreceding BillingInvoiceExpand = "preceding" - BillingInvoiceExpandWorkflow BillingInvoiceExpand = "workflow" - BillingInvoiceExpandWorkflowApps BillingInvoiceExpand = "workflow.apps" + CustomerOrderByCreatedAt CustomerOrderBy = "createdAt" + CustomerOrderById CustomerOrderBy = "id" + CustomerOrderByName CustomerOrderBy = "name" ) -// Defines values for BillingInvoiceExtendedStatus. +// Defines values for DiscountPercentageType. const ( - BillingInvoiceExtendedStatusDraft BillingInvoiceExtendedStatus = "draft" - BillingInvoiceExtendedStatusDraftCreated BillingInvoiceExtendedStatus = "draft_created" - BillingInvoiceExtendedStatusDraftInvalid BillingInvoiceExtendedStatus = "draft_invalid" - BillingInvoiceExtendedStatusDraftManualApprovalNeeded BillingInvoiceExtendedStatus = "draft_manual_approval_needed" - BillingInvoiceExtendedStatusDraftReadyToIssue BillingInvoiceExtendedStatus = "draft_ready_to_issue" - BillingInvoiceExtendedStatusDraftSyncFailed BillingInvoiceExtendedStatus = "draft_sync_failed" - BillingInvoiceExtendedStatusDraftSyncing BillingInvoiceExtendedStatus = "draft_syncing" - BillingInvoiceExtendedStatusDraftValidating BillingInvoiceExtendedStatus = "draft_validating" - BillingInvoiceExtendedStatusDraftWaitingAutoApproval BillingInvoiceExtendedStatus = "draft_waiting_auto_approval" - BillingInvoiceExtendedStatusGathering BillingInvoiceExtendedStatus = "gathering" - BillingInvoiceExtendedStatusIssued BillingInvoiceExtendedStatus = "issued" - BillingInvoiceExtendedStatusIssuing BillingInvoiceExtendedStatus = "issuing" - BillingInvoiceExtendedStatusIssuingSyncFailed BillingInvoiceExtendedStatus = "issuing_sync_failed" - BillingInvoiceExtendedStatusIssuingSyncing BillingInvoiceExtendedStatus = "issuing_syncing" + DiscountPercentageTypePercentage DiscountPercentageType = "percentage" ) -// Defines values for BillingInvoiceOrderBy. +// Defines values for EditSubscriptionAddItemOp. const ( - BillingInvoiceOrderByCreatedAt BillingInvoiceOrderBy = "createdAt" - BillingInvoiceOrderByCustomerName BillingInvoiceOrderBy = "customer.name" - BillingInvoiceOrderByIssuedAt BillingInvoiceOrderBy = "issuedAt" - BillingInvoiceOrderByStatus BillingInvoiceOrderBy = "status" - BillingInvoiceOrderByUpdatedAt BillingInvoiceOrderBy = "updatedAt" + AddItem EditSubscriptionAddItemOp = "add_item" ) -// Defines values for BillingInvoiceStatus. +// Defines values for EditSubscriptionAddPhaseOp. const ( - BillingInvoiceStatusDraft BillingInvoiceStatus = "draft" - BillingInvoiceStatusGathering BillingInvoiceStatus = "gathering" - BillingInvoiceStatusIssued BillingInvoiceStatus = "issued" - BillingInvoiceStatusIssuing BillingInvoiceStatus = "issuing" + AddPhase EditSubscriptionAddPhaseOp = "add_phase" ) -// Defines values for BillingInvoiceType. +// Defines values for EditSubscriptionRemoveItemOp. const ( - CreditNote BillingInvoiceType = "credit_note" - Standard BillingInvoiceType = "standard" + RemoveItem EditSubscriptionRemoveItemOp = "remove_item" ) -// Defines values for BillingLineStatus. +// Defines values for EditSubscriptionRemovePhaseOp. const ( - Deleted BillingLineStatus = "deleted" - Split BillingLineStatus = "split" - Valid BillingLineStatus = "valid" + RemovePhase EditSubscriptionRemovePhaseOp = "remove_phase" ) -// Defines values for BillingPaymentTermDueDateType. +// Defines values for EditSubscriptionStretchPhaseOp. const ( - DueDate BillingPaymentTermDueDateType = "due_date" + StretchPhase EditSubscriptionStretchPhaseOp = "stretch_phase" ) -// Defines values for BillingPaymentTermInstantType. +// Defines values for EntitlementBooleanCreateInputsType. const ( - Instant BillingPaymentTermInstantType = "instant" + EntitlementBooleanCreateInputsTypeBoolean EntitlementBooleanCreateInputsType = "boolean" ) -// Defines values for BillingProfileExpand. +// Defines values for EntitlementMeteredType. const ( - BillingProfileExpandAll BillingProfileExpand = "*" - BillingProfileExpandApps BillingProfileExpand = "apps" + EntitlementMeteredTypeMetered EntitlementMeteredType = "metered" ) -// Defines values for BillingProfileOrderBy. +// Defines values for EntitlementMeteredCreateInputsType. const ( - BillingProfileOrderByCreatedAt BillingProfileOrderBy = "createdAt" - BillingProfileOrderByDefault BillingProfileOrderBy = "default" - BillingProfileOrderByName BillingProfileOrderBy = "name" - BillingProfileOrderByUpdatedAt BillingProfileOrderBy = "updatedAt" + EntitlementMeteredCreateInputsTypeMetered EntitlementMeteredCreateInputsType = "metered" ) -// Defines values for BillingTaxBehavior. +// Defines values for EntitlementOrderBy. const ( - Exclusive BillingTaxBehavior = "exclusive" - Inclusive BillingTaxBehavior = "inclusive" + EntitlementOrderByCreatedAt EntitlementOrderBy = "createdAt" + EntitlementOrderByUpdatedAt EntitlementOrderBy = "updatedAt" ) -// Defines values for BillingUsageBasedLineType. +// Defines values for EntitlementStaticType. const ( - BillingUsageBasedLineTypeUsageBased BillingUsageBasedLineType = "usage_based" + EntitlementStaticTypeStatic EntitlementStaticType = "static" ) -// Defines values for BillingUsageBasedLineCreateType. +// Defines values for EntitlementStaticCreateInputsType. const ( - BillingUsageBasedLineCreateTypeUsageBased BillingUsageBasedLineCreateType = "usage_based" + EntitlementStaticCreateInputsTypeStatic EntitlementStaticCreateInputsType = "static" ) -// Defines values for BillingUsageBasedLineCreateItemType. +// Defines values for ExpirationDuration. const ( - BillingUsageBasedLineCreateItemTypeUsageBased BillingUsageBasedLineCreateItemType = "usage_based" + ExpirationDurationDAY ExpirationDuration = "DAY" + ExpirationDurationHOUR ExpirationDuration = "HOUR" + ExpirationDurationMONTH ExpirationDuration = "MONTH" + ExpirationDurationWEEK ExpirationDuration = "WEEK" + ExpirationDurationYEAR ExpirationDuration = "YEAR" ) -// Defines values for BillingValidationIssueSeverity. +// Defines values for FeatureOrderBy. const ( - Critical BillingValidationIssueSeverity = "critical" - Warning BillingValidationIssueSeverity = "warning" + FeatureOrderByCreatedAt FeatureOrderBy = "createdAt" + FeatureOrderById FeatureOrderBy = "id" + FeatureOrderByUpdatedAt FeatureOrderBy = "updatedAt" ) -// Defines values for BillingVoidInvoiceLineAction. +// Defines values for FlatPriceType. const ( - BillingVoidInvoiceLineActionDiscard BillingVoidInvoiceLineAction = "discard" - BillingVoidInvoiceLineActionPending BillingVoidInvoiceLineAction = "pending" - BillingVoidInvoiceLineActionPendingNextCycle BillingVoidInvoiceLineAction = "pending_next_cycle" + FlatPriceTypeFlat FlatPriceType = "flat" ) -// Defines values for BillingWorkflowCollectionAlignment. +// Defines values for FlatPriceWithPaymentTermType. const ( - BillingWorkflowCollectionAlignmentSubscription BillingWorkflowCollectionAlignment = "subscription" + FlatPriceWithPaymentTermTypeFlat FlatPriceWithPaymentTermType = "flat" ) -// Defines values for BillingWorkflowCollectionMethod. +// Defines values for GrantOrderBy. const ( - ChargeAutomatically BillingWorkflowCollectionMethod = "charge_automatically" - SendInvoice BillingWorkflowCollectionMethod = "send_invoice" + GrantOrderByCreatedAt GrantOrderBy = "createdAt" + GrantOrderById GrantOrderBy = "id" + GrantOrderByUpdatedAt GrantOrderBy = "updatedAt" ) -// Defines values for CheckoutSessionUIMode. +// Defines values for InvoiceAction. const ( - Embedded CheckoutSessionUIMode = "embedded" - Hosted CheckoutSessionUIMode = "hosted" + Advance InvoiceAction = "advance" + Approve InvoiceAction = "approve" + Delete InvoiceAction = "delete" + Retry InvoiceAction = "retry" + Void InvoiceAction = "void" ) -// Defines values for CustomerOrderBy. +// Defines values for InvoiceDocumentRefType. const ( - CustomerOrderByCreatedAt CustomerOrderBy = "createdAt" - CustomerOrderById CustomerOrderBy = "id" - CustomerOrderByName CustomerOrderBy = "name" + CreditNodeOriginalInvoice InvoiceDocumentRefType = "credit_node_original_invoice" ) -// Defines values for DiscountPercentageType. +// Defines values for InvoiceExpand. const ( - DiscountPercentageTypePercentage DiscountPercentageType = "percentage" + InvoiceExpandAll InvoiceExpand = "*" + InvoiceExpandLines InvoiceExpand = "lines" + InvoiceExpandPreceding InvoiceExpand = "preceding" + InvoiceExpandWorkflowApps InvoiceExpand = "workflow.apps" ) -// Defines values for EntitlementBooleanCreateInputsType. +// Defines values for InvoiceFlatFeeLineType. const ( - EntitlementBooleanCreateInputsTypeBoolean EntitlementBooleanCreateInputsType = "boolean" + InvoiceFlatFeeLineTypeFlatFee InvoiceFlatFeeLineType = "flat_fee" ) -// Defines values for EntitlementMeteredType. +// Defines values for InvoiceFlatFeeLineCreateType. const ( - EntitlementMeteredTypeMetered EntitlementMeteredType = "metered" + InvoiceFlatFeeLineCreateTypeFlatFee InvoiceFlatFeeLineCreateType = "flat_fee" ) -// Defines values for EntitlementMeteredCreateInputsType. +// Defines values for InvoiceFlatFeeLineReplaceUpdateType. const ( - EntitlementMeteredCreateInputsTypeMetered EntitlementMeteredCreateInputsType = "metered" + InvoiceFlatFeeLineReplaceUpdateTypeFlatFee InvoiceFlatFeeLineReplaceUpdateType = "flat_fee" ) -// Defines values for EntitlementOrderBy. +// Defines values for InvoiceLineStatus. const ( - EntitlementOrderByCreatedAt EntitlementOrderBy = "createdAt" - EntitlementOrderByUpdatedAt EntitlementOrderBy = "updatedAt" + Detail InvoiceLineStatus = "detail" + Split InvoiceLineStatus = "split" + Valid InvoiceLineStatus = "valid" ) -// Defines values for EntitlementStaticType. +// Defines values for InvoiceLineTaxBehavior. const ( - EntitlementStaticTypeStatic EntitlementStaticType = "static" + Exclusive InvoiceLineTaxBehavior = "exclusive" + Inclusive InvoiceLineTaxBehavior = "inclusive" ) -// Defines values for EntitlementStaticCreateInputsType. +// Defines values for InvoiceOrderBy. const ( - EntitlementStaticCreateInputsTypeStatic EntitlementStaticCreateInputsType = "static" + InvoiceOrderByCreatedAt InvoiceOrderBy = "createdAt" + InvoiceOrderByCustomerName InvoiceOrderBy = "customer.name" + InvoiceOrderByIssuedAt InvoiceOrderBy = "issuedAt" + InvoiceOrderByStatus InvoiceOrderBy = "status" + InvoiceOrderByUpdatedAt InvoiceOrderBy = "updatedAt" ) -// Defines values for ExpirationDuration. +// Defines values for InvoiceStatus. const ( - ExpirationDurationDAY ExpirationDuration = "DAY" - ExpirationDurationHOUR ExpirationDuration = "HOUR" - ExpirationDurationMONTH ExpirationDuration = "MONTH" - ExpirationDurationWEEK ExpirationDuration = "WEEK" - ExpirationDurationYEAR ExpirationDuration = "YEAR" + InvoiceStatusDraft InvoiceStatus = "draft" + InvoiceStatusGathering InvoiceStatus = "gathering" + InvoiceStatusIssued InvoiceStatus = "issued" + InvoiceStatusIssuing InvoiceStatus = "issuing" ) -// Defines values for FeatureOrderBy. +// Defines values for InvoiceType. const ( - FeatureOrderByCreatedAt FeatureOrderBy = "createdAt" - FeatureOrderById FeatureOrderBy = "id" - FeatureOrderByUpdatedAt FeatureOrderBy = "updatedAt" + CreditNote InvoiceType = "credit_note" + Standard InvoiceType = "standard" ) -// Defines values for FlatPriceType. +// Defines values for InvoiceUsageBasedLineType. const ( - FlatPriceTypeFlat FlatPriceType = "flat" + InvoiceUsageBasedLineTypeUsageBased InvoiceUsageBasedLineType = "usage_based" ) -// Defines values for FlatPriceWithPaymentTermType. +// Defines values for InvoiceUsageBasedLineCreateType. const ( - FlatPriceWithPaymentTermTypeFlat FlatPriceWithPaymentTermType = "flat" + InvoiceUsageBasedLineCreateTypeUsageBased InvoiceUsageBasedLineCreateType = "usage_based" ) -// Defines values for GrantOrderBy. +// Defines values for InvoiceUsageBasedLineReplaceUpdateType. const ( - GrantOrderByCreatedAt GrantOrderBy = "createdAt" - GrantOrderById GrantOrderBy = "id" - GrantOrderByUpdatedAt GrantOrderBy = "updatedAt" + InvoiceUsageBasedLineReplaceUpdateTypeUsageBased InvoiceUsageBasedLineReplaceUpdateType = "usage_based" ) // Defines values for MeasureUsageFromPreset. @@ -381,6 +364,16 @@ const ( UnsupportedResponseType OAuth2AuthorizationCodeGrantErrorType = "unsupported_response_type" ) +// Defines values for PaymentTermDueDateType. +const ( + DueDate PaymentTermDueDateType = "due_date" +) + +// Defines values for PaymentTermInstantType. +const ( + Instant PaymentTermInstantType = "instant" +) + // Defines values for PhasesOrderBy. const ( PhasesOrderByKey PhasesOrderBy = "key" @@ -398,10 +391,10 @@ const ( // Defines values for PlanStatus. const ( - Active PlanStatus = "active" - Archived PlanStatus = "archived" - Draft PlanStatus = "draft" - Scheduled PlanStatus = "scheduled" + PlanStatusActive PlanStatus = "active" + PlanStatusArchived PlanStatus = "archived" + PlanStatusDraft PlanStatus = "draft" + PlanStatusScheduled PlanStatus = "scheduled" ) // Defines values for PricePaymentTerm. @@ -420,11 +413,6 @@ const ( RateCardFlatFeeTypeFlatFee RateCardFlatFeeType = "flat_fee" ) -// Defines values for RateCardFlatFeeUpdateItemType. -const ( - FlatFee RateCardFlatFeeUpdateItemType = "flat_fee" -) - // Defines values for RateCardMeteredEntitlementType. const ( Metered RateCardMeteredEntitlementType = "metered" @@ -440,11 +428,6 @@ const ( RateCardUsageBasedTypeUsageBased RateCardUsageBasedType = "usage_based" ) -// Defines values for RateCardUsageBasedUpdateItemType. -const ( - UsageBased RateCardUsageBasedUpdateItemType = "usage_based" -) - // Defines values for RecurringPeriodInterval. const ( RecurringPeriodIntervalDAY RecurringPeriodInterval = "DAY" @@ -455,8 +438,8 @@ const ( // Defines values for RemovePhaseShifting. const ( - Next RemovePhaseShifting = "Next" - Prev RemovePhaseShifting = "Prev" + Next RemovePhaseShifting = "next" + Prev RemovePhaseShifting = "prev" ) // Defines values for SandboxAppType. @@ -500,41 +483,6 @@ const ( Succeeded StripePaymentIntentStatus = "succeeded" ) -// Defines values for SubscriptionEditAddOp. -const ( - SubscriptionEditAddOpAdd SubscriptionEditAddOp = "add" -) - -// Defines values for SubscriptionEditAddItemOp. -const ( - SubscriptionEditAddItemOpAdd SubscriptionEditAddItemOp = "add" -) - -// Defines values for SubscriptionEditAddUpdateItemOp. -const ( - Add SubscriptionEditAddUpdateItemOp = "add" -) - -// Defines values for SubscriptionEditRemoveItemOp. -const ( - SubscriptionEditRemoveItemOpRemove SubscriptionEditRemoveItemOp = "remove" -) - -// Defines values for SubscriptionEditRemoveUpdateItemOp. -const ( - SubscriptionEditRemoveUpdateItemOpRemove SubscriptionEditRemoveUpdateItemOp = "remove" -) - -// Defines values for SubscriptionEditRemoveWithValueOp. -const ( - Remove SubscriptionEditRemoveWithValueOp = "remove" -) - -// Defines values for SubscriptionEditStretchOp. -const ( - Extend SubscriptionEditStretchOp = "extend" -) - // Defines values for SvixOperationalWebhookRequestType. const ( EndpointCreated SvixOperationalWebhookRequestType = "endpoint.created" @@ -567,10 +515,25 @@ const ( UnitPriceWithCommitmentsTypeUnit UnitPriceWithCommitmentsType = "unit" ) -// Defines values for GetSubscriptionParamsExpand. +// Defines values for ValidationIssueSeverity. +const ( + Critical ValidationIssueSeverity = "critical" + Warning ValidationIssueSeverity = "warning" +) + +// Defines values for VoidInvoiceLineDiscardActionType. +const ( + Discard VoidInvoiceLineDiscardActionType = "discard" +) + +// Defines values for VoidInvoiceLinePendingActionCreateType. +const ( + VoidInvoiceLinePendingActionCreateTypePending VoidInvoiceLinePendingActionCreateType = "pending" +) + +// Defines values for VoidInvoiceLinePendingActionCreateItemType. const ( - False GetSubscriptionParamsExpand = false - True GetSubscriptionParamsExpand = true + Pending VoidInvoiceLinePendingActionCreateItemType = "pending" ) // Address Address @@ -694,18 +657,13 @@ type BalanceHistoryWindow struct { Usage *float64 `json:"usage,omitempty"` } -// BillingCreditNoteOriginalInvoiceRef Omitted fields: -// period: Tax period in which the referred document had an effect required by some tax regimes and formats. -// stamps: Seals of approval from other organisations that may need to be listed. -// ext: Extensions for additional codes that may be required. -type BillingCreditNoteOriginalInvoiceRef = BillingGenericDocumentRef +// BillingLineCharge InvoiceLineCharge represents an amount added to the line, and will be applied before taxes. +type BillingLineCharge struct { + // Amount Fixed discount amount to apply (calculated if percent present). + Amount Numeric `json:"amount"` -// BillingCustomerOverride Customer specific workflow overrides. -type BillingCustomerOverride struct { - // BillingProfile The billing profile this override is associated with. - // - // If not provided, the default billing profile is chosen if available. - BillingProfile *string `json:"billingProfile,omitempty"` + // Code Reason code. + Code *string `json:"code,omitempty"` // CreatedAt Timestamp of when the resource was created. CreatedAt *time.Time `json:"createdAt,omitempty"` @@ -713,1149 +671,1027 @@ type BillingCustomerOverride struct { // DeletedAt Timestamp of when the resource was permanently deleted. DeletedAt *time.Time `json:"deletedAt,omitempty"` - // UpdatedAt Timestamp of when the resource was last updated. - UpdatedAt *time.Time `json:"updatedAt,omitempty"` - - // Workflow Customer specific workflow overrides. - Workflow BillingCustomerWorkflowOverride `json:"workflow"` -} - -// BillingCustomerOverrideOrderBy Order by options for customers. -type BillingCustomerOverrideOrderBy string - -// BillingCustomerWorkflowOverride Customer specific workflow overrides. -type BillingCustomerWorkflowOverride struct { - Collection *BillingWorkflowCollectionSettings `json:"collection,omitempty"` - - // CreatedAt Timestamp of when the resource was created. - CreatedAt *time.Time `json:"createdAt,omitempty"` + // Description Text description as to why the discount was applied. + Description *string `json:"description,omitempty"` - // DeletedAt Timestamp of when the resource was permanently deleted. - DeletedAt *time.Time `json:"deletedAt,omitempty"` + // Id ID of the charge or discount. + Id *string `json:"id,omitempty"` - // Id A unique identifier for the resource. - Id *string `json:"id,omitempty"` - Invoicing *BillingWorkflowInvoicingSettings `json:"invoicing,omitempty"` - InvoicingApp *App `json:"invoicingApp,omitempty"` - Payment *BillingWorkflowPaymentSettings `json:"payment,omitempty"` - PaymentApp *App `json:"paymentApp,omitempty"` - TaxApp *App `json:"taxApp,omitempty"` + // Percent Percentage if fixed amount not applied + Percent *Percentage `json:"percent,omitempty"` // UpdatedAt Timestamp of when the resource was last updated. UpdatedAt *time.Time `json:"updatedAt,omitempty"` } -// BillingDocumentRef CreditNoteOriginalInvoiceRef is used to reference the original invoice that a credit note is based on. -type BillingDocumentRef = BillingCreditNoteOriginalInvoiceRef +// BillingParty Party represents a person or business entity. +type BillingParty struct { + // Addresses Regular post addresses for where information should be sent if needed. + Addresses *[]Address `json:"addresses,omitempty"` -// BillingDocumentRefType DocumentRefType defines the type of document that is being referenced. -type BillingDocumentRefType string + // Id Unique identifier for the party (if available) + Id *string `json:"id,omitempty"` -// BillingDueDate DueDate contains an amount that should be paid by the given date. -type BillingDueDate struct { - Amount Numeric `json:"amount"` - Currency *CurrencyCode `json:"currency,omitempty"` + // Name Legal name or representation of the organization. + Name *string `json:"name,omitempty"` - // DueAt [RFC3339](https://tools.ietf.org/html/rfc3339) formatted date-time string in UTC. - DueAt time.Time `json:"dueAt"` - Notes *string `json:"notes,omitempty"` - Percent *Percentage `json:"percent,omitempty"` + // TaxId The entity's legal ID code used for tax purposes. They may have + // other numbers, but we're only interested in those valid for tax purposes. + TaxId *BillingPartyTaxIdentity `json:"taxId,omitempty"` +} + +// BillingPartyTaxIdentity Identity stores the details required to identify an entity for tax purposes in a specific country. +type BillingPartyTaxIdentity struct { + // Code Normalized tax code shown on the original identity document. + Code *BillingTaxIdentificationCode `json:"code,omitempty"` } -// BillingFlatFeeLine BillingFlatFeeLine represents a line item that is sold to the customer as a manually added fee. -type BillingFlatFeeLine struct { - Charges *[]BillingLineCharge `json:"charges,omitempty"` - Children *[]BillingInvoiceLine `json:"children"` +// BillingProfile BillingProfile represents a billing profile +type BillingProfile struct { + // Apps The applications used by this billing profile. + // + // Expand settings govern if this includes the whole app object or just the ID references. + Apps *BillingProfileAppsOrReference `json:"apps,omitempty"` // CreatedAt Timestamp of when the resource was created. - CreatedAt *time.Time `json:"createdAt,omitempty"` - Currency CurrencyCode `json:"currency"` + CreatedAt *time.Time `json:"createdAt,omitempty"` + + // Default Is this the default profile? + Default bool `json:"default"` // DeletedAt Timestamp of when the resource was permanently deleted. DeletedAt *time.Time `json:"deletedAt,omitempty"` // Description Optional description of the resource. Maximum 1024 characters. - Description *string `json:"description,omitempty"` - Discounts *[]BillingLineDiscount `json:"discounts,omitempty"` - - // Id ULID (Universally Unique Lexicographically Sortable Identifier). - Id string `json:"id"` - Invoice *BillingInvoiceReference `json:"invoice,omitempty"` + Description *string `json:"description,omitempty"` - // InvoiceAt [RFC3339](https://tools.ietf.org/html/rfc3339) formatted date-time string in UTC. - InvoiceAt time.Time `json:"invoiceAt"` + // Id A unique identifier for the resource. + Id *string `json:"id,omitempty"` // Metadata Additional metadata for the resource. Metadata *Metadata `json:"metadata"` // Name Human-readable name for the resource. Between 1 and 256 characters. - Name string `json:"name"` - PaymentTerm *PricePaymentTerm `json:"paymentTerm,omitempty"` - PerUnitAmount Numeric `json:"perUnitAmount"` - Period BillingPeriod `json:"period"` - Quantity Numeric `json:"quantity"` - Status *BillingLineStatus `json:"status,omitempty"` - TaxConfig *TaxConfig `json:"taxConfig"` - Taxes *[]BillingTaxItem `json:"taxes,omitempty"` - Totals *BillingInvoiceTotals `json:"totals,omitempty"` - Type BillingFlatFeeLineType `json:"type"` + Name string `json:"name"` + + // Supplier The name and contact information for the supplier this billing profile represents + Supplier BillingParty `json:"supplier"` // UpdatedAt Timestamp of when the resource was last updated. UpdatedAt *time.Time `json:"updatedAt,omitempty"` + + // Workflow The billing workflow settings for this profile + Workflow *BillingWorkflow `json:"workflow,omitempty"` } -// BillingFlatFeeLineType defines model for BillingFlatFeeLine.Type. -type BillingFlatFeeLineType string +// BillingProfileAppReferences BillingProfileAppReferences represents the references (id, type) to the apps used by a billing profile +type BillingProfileAppReferences struct { + // Invoicing The invoicing app used for this workflow + Invoicing *AppReference `json:"invoicing,omitempty"` -// BillingFlatFeeLineCreate BillingFlatFeeLine represents a line item that is sold to the customer as a manually added fee. -type BillingFlatFeeLineCreate struct { - Currency CurrencyCode `json:"currency"` + // Payment The payment app used for this workflow + Payment *AppReference `json:"payment,omitempty"` - // Description Optional description of the resource. Maximum 1024 characters. - Description *string `json:"description,omitempty"` - Invoice *BillingInvoiceReference `json:"invoice,omitempty"` + // Tax The tax app used for this workflow + Tax *AppReference `json:"tax,omitempty"` +} - // InvoiceAt [RFC3339](https://tools.ietf.org/html/rfc3339) formatted date-time string in UTC. - InvoiceAt time.Time `json:"invoiceAt"` +// BillingProfileApps BillingProfileApps represents the applications used by a billing profile +type BillingProfileApps struct { + Invoicing *App `json:"invoicing,omitempty"` + Payment *App `json:"payment,omitempty"` + Tax *App `json:"tax,omitempty"` +} - // Metadata Additional metadata for the resource. - Metadata *Metadata `json:"metadata"` +// BillingProfileAppsCreate BillingProfileAppsCreate represents the input for creating a billing profile's apps +type BillingProfileAppsCreate struct { + // Invoicing The invoicing app used for this workflow + Invoicing string `json:"invoicing"` - // Name Human-readable name for the resource. Between 1 and 256 characters. - Name string `json:"name"` - PaymentTerm *PricePaymentTerm `json:"paymentTerm,omitempty"` - PerUnitAmount Numeric `json:"perUnitAmount"` - Period BillingPeriod `json:"period"` - Quantity Numeric `json:"quantity"` - TaxConfig *TaxConfig `json:"taxConfig"` - Type BillingFlatFeeLineCreateType `json:"type"` + // Payment The payment app used for this workflow + Payment string `json:"payment"` + + // Tax The tax app used for this workflow + Tax string `json:"tax"` +} + +// BillingProfileAppsOrReference ProfileAppsOrReference represents the union of ProfileApps and ProfileAppReferences +// for a billing profile. +type BillingProfileAppsOrReference struct { + union json.RawMessage } -// BillingFlatFeeLineCreateType defines model for BillingFlatFeeLineCreate.Type. -type BillingFlatFeeLineCreateType string +// BillingProfileCreate BillingProfileCreate represents the input for creating a billing profile +type BillingProfileCreate struct { + // Apps The apps used by this billing profile. + Apps BillingProfileAppsCreate `json:"apps"` -// BillingFlatFeeLineCreateItem BillingFlatFeeLine represents a line item that is sold to the customer as a manually added fee. -type BillingFlatFeeLineCreateItem struct { - Currency CurrencyCode `json:"currency"` + // Default Is this the default profile? + Default bool `json:"default"` // Description Optional description of the resource. Maximum 1024 characters. - Description *string `json:"description,omitempty"` - Invoice *BillingInvoiceReference `json:"invoice,omitempty"` - - // InvoiceAt [RFC3339](https://tools.ietf.org/html/rfc3339) formatted date-time string in UTC. - InvoiceAt time.Time `json:"invoiceAt"` + Description *string `json:"description,omitempty"` // Metadata Additional metadata for the resource. Metadata *Metadata `json:"metadata"` // Name Human-readable name for the resource. Between 1 and 256 characters. - Name string `json:"name"` - PaymentTerm *PricePaymentTerm `json:"paymentTerm,omitempty"` - PerUnitAmount Numeric `json:"perUnitAmount"` - Period BillingPeriod `json:"period"` - Quantity Numeric `json:"quantity"` - TaxConfig *TaxConfig `json:"taxConfig"` - Type BillingFlatFeeLineCreateItemType `json:"type"` -} + Name string `json:"name"` -// BillingFlatFeeLineCreateItemType defines model for BillingFlatFeeLineCreateItem.Type. -type BillingFlatFeeLineCreateItemType string + // Supplier The name and contact information for the supplier this billing profile represents + Supplier BillingParty `json:"supplier"` -// BillingGenericDocumentRef Omitted fields: -// period: Tax period in which the referred document had an effect required by some tax regimes and formats. -// stamps: Seals of approval from other organisations that may need to be listed. -// ext: Extensions for additional codes that may be required. -type BillingGenericDocumentRef struct { - Description *string `json:"description,omitempty"` - Reason *string `json:"reason,omitempty"` - Type *BillingDocumentRefType `json:"type,omitempty"` + // Workflow The billing workflow settings for this profile. + Workflow BillingWorkflowCreate `json:"workflow"` } -// BillingInvoice Invoice represents an invoice in the system. -type BillingInvoice struct { +// BillingProfileCustomerOverride Customer specific workflow overrides. +type BillingProfileCustomerOverride struct { + // BillingProfile The billing profile this override is associated with. + // + // If not provided, the default billing profile is chosen if available. + BillingProfile *string `json:"billingProfile,omitempty"` + // CreatedAt Timestamp of when the resource was created. - CreatedAt *time.Time `json:"createdAt,omitempty"` - Currency *CurrencyCode `json:"currency,omitempty"` - Customer BillingParty `json:"customer"` + CreatedAt *time.Time `json:"createdAt,omitempty"` // DeletedAt Timestamp of when the resource was permanently deleted. DeletedAt *time.Time `json:"deletedAt,omitempty"` - // Description Optional description of the resource. Maximum 1024 characters. - Description *string `json:"description,omitempty"` - Discounts *[]BillingInvoiceDiscount `json:"discounts,omitempty"` + // UpdatedAt Timestamp of when the resource was last updated. + UpdatedAt *time.Time `json:"updatedAt,omitempty"` - // DraftUntil The time until the invoice is in draft status. - // - // On draft invoice creation it is calculated from the workflow settings. + // Workflow Customer specific workflow overrides. + Workflow *BillingProfileCustomerWorkflowOverride `json:"workflow,omitempty"` +} + +// BillingProfileCustomerOverrideCreate Payload for creating a new or updating an existing customer override. +type BillingProfileCustomerOverrideCreate struct { + // BillingProfile The billing profile this override is associated with. // - // If manual approval is required, the draftUntil time is set. - DraftUntil *time.Time `json:"draftUntil,omitempty"` + // If not provided, the default billing profile is chosen if available. + BillingProfile *string `json:"billingProfile,omitempty"` - // DueAt [RFC3339](https://tools.ietf.org/html/rfc3339) formatted date-time string in UTC. - DueAt *time.Time `json:"dueAt,omitempty"` + // Workflow Resource create operation model. + Workflow *BillingProfileCustomerWorkflowOverrideCreate `json:"workflow,omitempty"` +} - // Id A unique identifier for the resource. - Id *string `json:"id,omitempty"` +// BillingProfileCustomerOverrideOrderBy Order by options for customers. +type BillingProfileCustomerOverrideOrderBy string - // IssuedAt The time the invoice was issued. - // - // Depending on the status of the invoice this can mean multiple things: - // - draft, gathering: The time the invoice will be issued based on the workflow settings. - // - issued: The time the invoice was issued. - IssuedAt *time.Time `json:"issuedAt,omitempty"` - Lines *[]BillingInvoiceLine `json:"lines,omitempty"` +// BillingProfileCustomerOverridePaginatedResponse Paginated response +type BillingProfileCustomerOverridePaginatedResponse struct { + // Items The items in the current page. + Items []BillingProfileCustomerOverride `json:"items"` - // Metadata Additional metadata for the resource. - Metadata *Metadata `json:"metadata"` + // Page The items in the current page. + Page int `json:"page"` - // Number Number specifies the human readable key used to reference this Invoice. - // - // The number only gets populated after the invoice had been issued. - // - // Please note that the number is (depending on the upstream settings) either unique for the - // whole organization or unique for the customer, or in multi (stripe) account setups unique for the - // account. - Number *BillingInvoiceNumber `json:"number,omitempty"` - Payment *BillingInvoicePayment `json:"payment,omitempty"` - Period *BillingPeriod `json:"period,omitempty"` - Preceding *[]BillingDocumentRef `json:"preceding,omitempty"` - Status *BillingInvoiceStatus `json:"status,omitempty"` - StatusDetails *BillingInvoiceStatusDetails `json:"statusDetails,omitempty"` - Supplier BillingParty `json:"supplier"` - Totals *BillingInvoiceTotals `json:"totals,omitempty"` - Type *BillingInvoiceType `json:"type,omitempty"` - - // UpdatedAt Timestamp of when the resource was last updated. - // - // For updates the updatedAt field is used to detect conflicts. - UpdatedAt time.Time `json:"updatedAt"` - ValidationIssues *[]BillingValidationIssue `json:"validationIssues,omitempty"` - - // VoidedAt The time the invoice was voided. - // - // If the invoice was voided, this field will be set to the time the invoice was voided. - VoidedAt *time.Time `json:"voidedAt,omitempty"` + // PageSize The items in the current page. + PageSize int `json:"pageSize"` - // Workflow The workflow associated with the invoice. - // - // It is always a snapshot of the workflow settings at the time of invoice creation. The - // field is optional as it should be explicitly requested with expand options. - Workflow *BillingInvoiceWorkflowSettings `json:"workflow,omitempty"` + // TotalCount The items in the current page. + TotalCount int `json:"totalCount"` } -// BillingInvoiceAction BillingInvoiceAction represents the actions that can be performed on an invoice. -type BillingInvoiceAction string +// BillingProfileCustomerWorkflowOverride Customer specific workflow overrides. +type BillingProfileCustomerWorkflowOverride struct { + // Collection The collection settings for this workflow + Collection *BillingWorkflowCollectionSettings `json:"collection,omitempty"` -// BillingInvoiceCreate BillingInvoiceCreate is the input for creating an invoice. -// -// Invoice creation is always based on already pending line items created by the billingCreateLineByCustomer -// operation. Empty invoices are not allowed. -type BillingInvoiceCreate struct { - // AsOf The time as of which the invoice is created. - // - // If not provided, the current time is used. - AsOf *time.Time `json:"asOf,omitempty"` + // CreatedAt Timestamp of when the resource was created. + CreatedAt *time.Time `json:"createdAt,omitempty"` - // IncludePendingLines The pending line items to include in the invoice, if not provided: - // - all line items that have invoice_at < asOf will be included - // - all usage based line items will be included up to asOf, new usage-based line items will be staged for the rest - // of the billing cycle - IncludePendingLines *[]string `json:"includePendingLines,omitempty"` -} + // DeletedAt Timestamp of when the resource was permanently deleted. + DeletedAt *time.Time `json:"deletedAt,omitempty"` -// BillingInvoiceDiscount Discount represents an allowance applied to the complete document independent from the individual lines. -type BillingInvoiceDiscount struct { - Amount Numeric `json:"amount"` - Base *Numeric `json:"base,omitempty"` - Percent *Percentage `json:"percent,omitempty"` - Reason *string `json:"reason,omitempty"` -} + // Id A unique identifier for the resource. + Id *string `json:"id,omitempty"` -// BillingInvoiceExpand InvoiceExpand specifies the parts of the invoice to expand in the list output. -type BillingInvoiceExpand string + // Invoicing The invoicing settings for this workflow + Invoicing *BillingWorkflowInvoicingSettings `json:"invoicing,omitempty"` + InvoicingApp *App `json:"invoicingApp,omitempty"` -// BillingInvoiceExtendedStatus InvoiceExtendedStatus describes the extended status of an invoice. -// -// This is used to provide more detailed information about the status of the invoice. Useful for -// troubelshooting invoice workflow issues. -type BillingInvoiceExtendedStatus string + // Payment The payment settings for this workflow + Payment *BillingWorkflowPaymentSettings `json:"payment,omitempty"` + PaymentApp *App `json:"paymentApp,omitempty"` + TaxApp *App `json:"taxApp,omitempty"` -// BillingInvoiceLine BillingInvoiceLine represents a line item that is sold to the customer based on a specific (unit) price. -type BillingInvoiceLine struct { - union json.RawMessage + // UpdatedAt Timestamp of when the resource was last updated. + UpdatedAt *time.Time `json:"updatedAt,omitempty"` } -// BillingInvoiceLineCreate BillingInvoiceLine represents a line item that is sold to the customer based on a specific (unit) price. -type BillingInvoiceLineCreate struct { - union json.RawMessage -} +// BillingProfileCustomerWorkflowOverrideCreate Resource create operation model. +type BillingProfileCustomerWorkflowOverrideCreate struct { + // Collection The collection settings for this workflow + Collection *BillingWorkflowCollectionSettings `json:"collection,omitempty"` -// BillingInvoiceLineCreateItem BillingInvoiceLine represents a line item that is sold to the customer based on a specific (unit) price. -type BillingInvoiceLineCreateItem struct { - union json.RawMessage -} + // Invoicing The invoicing settings for this workflow + Invoicing *BillingWorkflowInvoicingSettings `json:"invoicing,omitempty"` -// BillingInvoiceLines CreateLinesRequest is the request for creating manual line items. -type BillingInvoiceLines struct { - Lines []BillingInvoiceLine `json:"lines"` + // Payment The payment settings for this workflow + Payment *BillingWorkflowPaymentSettings `json:"payment,omitempty"` } -// BillingInvoiceNumber InvoiceNumber is a unique identifier for the invoice, generated by the -// invoicing app. -// -// The uniqueness depends on a lot of factors: -// - app setting (unique per app or unique per customer) -// - multiple app scenarios (multiple apps generating invoices with the same prefix) -type BillingInvoiceNumber = string - -// BillingInvoiceOrderBy InvoiceOrderBy specifies the ordering options for invoice listing. -type BillingInvoiceOrderBy string +// BillingProfileExpand BillingProfileExpand details what profile fields to expand +type BillingProfileExpand string -// BillingInvoicePayment Payment contains details as to how the invoice should be paid. -type BillingInvoicePayment struct { - // Terms PaymentTerms defines the terms for payment. - Terms *BillingPaymentTerms `json:"terms,omitempty"` -} +// BillingProfileOrderBy BillingProfileOrderBy specifies the ordering options for profiles +type BillingProfileOrderBy string -// BillingInvoiceReference Reference to an invoice. -type BillingInvoiceReference struct { - // Id ULID (Universally Unique Lexicographically Sortable Identifier). - Id string `json:"id"` - Number *BillingInvoiceNumber `json:"number,omitempty"` -} +// BillingProfilePaginatedResponse Paginated response +type BillingProfilePaginatedResponse struct { + // Items The items in the current page. + Items []BillingProfile `json:"items"` -// BillingInvoiceStatus InvoiceStatus describes the status of an invoice. -type BillingInvoiceStatus string + // Page The items in the current page. + Page int `json:"page"` -// BillingInvoiceStatusDetails InvoiceStatusDetails represents the details of the invoice status. -// -// API users are encouraged to rely on the immutable/failed/avaliableActions fields to determine -// the next steps of the invoice instead of the extendedStatus field. -type BillingInvoiceStatusDetails struct { - AvailableActions []BillingInvoiceAction `json:"availableActions"` - ExtendedStatus BillingInvoiceExtendedStatus `json:"extendedStatus"` - Failed bool `json:"failed"` - Immutable bool `json:"immutable"` -} + // PageSize The items in the current page. + PageSize int `json:"pageSize"` -// BillingInvoiceTotals Totals contains the summaries of all calculations for the invoice. -type BillingInvoiceTotals struct { - Amount Numeric `json:"amount"` - ChargesTotal Numeric `json:"chargesTotal"` - DiscountsTotal Numeric `json:"discountsTotal"` - TaxesExclusiveTotal Numeric `json:"taxesExclusiveTotal"` - TaxesInclusiveTotal Numeric `json:"taxesInclusiveTotal"` - TaxesTotal Numeric `json:"taxesTotal"` - Total Numeric `json:"total"` + // TotalCount The items in the current page. + TotalCount int `json:"totalCount"` } -// BillingInvoiceType InvoiceType represents the type of invoice. +// BillingProfileReplaceUpdateWithWorkflow BillingProfileReplaceUpdate represents the input for updating a billing profile // -// The type of invoice determines the purpose of the invoice and how it should be handled. -type BillingInvoiceType string +// The apps field cannot be updated directly, if an app change is desired a new +// profile should be created. +type BillingProfileReplaceUpdateWithWorkflow struct { + // Default Is this the default profile? + Default bool `json:"default"` -// BillingInvoiceWorkflowSettings InvoiceWorkflowSettings represents the workflow settings used by the invoice. -// -// This is a clone of the billing profile's workflow settings at the time of invoice creation -// with customer overrides considered. -type BillingInvoiceWorkflowSettings struct { - Apps *BillingProfileAppsOrReference `json:"apps,omitempty"` + // Description Optional description of the resource. Maximum 1024 characters. + Description *string `json:"description,omitempty"` - // SourceBillingProfileID sourceBillingProfileID is the billing profile on which the workflow was based on. - // - // The profile is snapshotted on invoice creation, after which it can be altered independently - // of the profile itself. - SourceBillingProfileID string `json:"sourceBillingProfileID"` - Timezone *string `json:"timezone,omitempty"` - Workflow BillingWorkflowSettings `json:"workflow"` + // Metadata Additional metadata for the resource. + Metadata *Metadata `json:"metadata"` + + // Name Human-readable name for the resource. Between 1 and 256 characters. + Name string `json:"name"` + + // Supplier The name and contact information for the supplier this billing profile represents + Supplier BillingParty `json:"supplier"` + + // Workflow The billing workflow settings for this profile. + Workflow BillingWorkflow `json:"workflow"` } -// BillingLineCharge LineCharge represents an amount added to the line, and will be applied before taxes. -type BillingLineCharge struct { - // Amount Fixed discount amount to apply (calculated if percent present). - Amount Numeric `json:"amount"` - Code *string `json:"code,omitempty"` +// BillingTaxIdentificationCode TaxIdentificationCode is a normalized tax code shown on the original identity document. +type BillingTaxIdentificationCode = string + +// BillingWorkflow BillingWorkflow represents a billing workflow +type BillingWorkflow struct { + // Collection The collection settings for this workflow + Collection *BillingWorkflowCollectionSettings `json:"collection,omitempty"` // CreatedAt Timestamp of when the resource was created. CreatedAt *time.Time `json:"createdAt,omitempty"` // DeletedAt Timestamp of when the resource was permanently deleted. - DeletedAt *time.Time `json:"deletedAt,omitempty"` - Description *string `json:"description,omitempty"` + DeletedAt *time.Time `json:"deletedAt,omitempty"` - // Id ULID (Universally Unique Lexicographically Sortable Identifier). + // Id A unique identifier for the resource. Id *string `json:"id,omitempty"` - // Percent Percentage if fixed amount not applied - Percent *Percentage `json:"percent,omitempty"` + // Invoicing The invoicing settings for this workflow + Invoicing *BillingWorkflowInvoicingSettings `json:"invoicing,omitempty"` + + // Payment The payment settings for this workflow + Payment *BillingWorkflowPaymentSettings `json:"payment,omitempty"` // UpdatedAt Timestamp of when the resource was last updated. UpdatedAt *time.Time `json:"updatedAt,omitempty"` } -// BillingLineDiscount LineDiscount represents an amount deducted from the line, and will be applied before taxes. -type BillingLineDiscount struct { - // Amount Fixed discount amount to apply (calculated if percent present). - Amount Numeric `json:"amount"` - Code *string `json:"code,omitempty"` - - // CreatedAt Timestamp of when the resource was created. - CreatedAt *time.Time `json:"createdAt,omitempty"` +// BillingWorkflowCollectionAlignment BillingWorkflowCollectionAlignmentSubscription specifies the alignment for collecting the pending line items +// into an invoice. +type BillingWorkflowCollectionAlignment = BillingWorkflowCollectionAlignmentSubscription - // DeletedAt Timestamp of when the resource was permanently deleted. - DeletedAt *time.Time `json:"deletedAt,omitempty"` - Description *string `json:"description,omitempty"` +// BillingWorkflowCollectionAlignmentSubscription BillingWorkflowCollectionAlignmentSubscription specifies the alignment for collecting the pending line items +// into an invoice. +type BillingWorkflowCollectionAlignmentSubscription struct { + Type BillingWorkflowCollectionAlignmentSubscriptionType `json:"type"` +} - // Id ULID (Universally Unique Lexicographically Sortable Identifier). - Id *string `json:"id,omitempty"` +// BillingWorkflowCollectionAlignmentSubscriptionType defines model for BillingWorkflowCollectionAlignmentSubscription.Type. +type BillingWorkflowCollectionAlignmentSubscriptionType string - // Percent Percentage if fixed amount not applied - Percent *Percentage `json:"percent,omitempty"` +// BillingWorkflowCollectionSettings Workflow collection specifies how to collect the pending line items for an invoice +type BillingWorkflowCollectionSettings struct { + Alignment *BillingWorkflowCollectionAlignment `json:"alignment,omitempty"` - // UpdatedAt Timestamp of when the resource was last updated. - UpdatedAt *time.Time `json:"updatedAt,omitempty"` + // Interval This grace period can be used to delay the collection of the pending line items specified in + // alignment. + // + // This is useful, in case of multiple subscriptions having slightly different billing periods. + Interval *string `json:"interval,omitempty"` } -// BillingLineStatus Line status specifies the status of the line. -type BillingLineStatus string +// BillingWorkflowCreate Resource create operation model. +type BillingWorkflowCreate struct { + // Collection The collection settings for this workflow + Collection *BillingWorkflowCollectionSettings `json:"collection,omitempty"` -// BillingParty Party represents a person or business entity. -type BillingParty struct { - Addresses *[]Address `json:"addresses,omitempty"` + // Invoicing The invoicing settings for this workflow + Invoicing *BillingWorkflowInvoicingSettings `json:"invoicing,omitempty"` - // Id ULID (Universally Unique Lexicographically Sortable Identifier). - Id *string `json:"id,omitempty"` - Name *string `json:"name,omitempty"` - TaxId *BillingTaxIdentity `json:"taxId,omitempty"` + // Payment The payment settings for this workflow + Payment *BillingWorkflowPaymentSettings `json:"payment,omitempty"` } -// BillingPartyCreate Party represents a person or business entity. -type BillingPartyCreate struct { - Addresses *[]Address `json:"addresses,omitempty"` - Name *string `json:"name,omitempty"` - TaxId *BillingTaxIdentity `json:"taxId,omitempty"` +// BillingWorkflowInvoicingSettings BillingWorkflowInvoicingSettings represents the invoice settings for a billing workflow +type BillingWorkflowInvoicingSettings struct { + // AutoAdvance Whether to automatically issue the invoice after the draftPeriod has passed. + AutoAdvance *bool `json:"autoAdvance,omitempty"` + + // DraftPeriod The period for the invoice to be kept in draft status for manual reviews. + DraftPeriod *string `json:"draftPeriod,omitempty"` + + // DueAfter The period after which the invoice is due. + DueAfter *string `json:"dueAfter,omitempty"` } -// BillingPaymentTermDueDate PaymentTermDueDate defines the terms for payment on a specific date. -type BillingPaymentTermDueDate struct { - Detail *string `json:"detail,omitempty"` - DueAt []BillingDueDate `json:"dueAt"` - Notes *string `json:"notes,omitempty"` - Type BillingPaymentTermDueDateType `json:"type"` +// BillingWorkflowPaymentSettings BillingWorkflowPaymentSettings represents the payment settings for a billing workflow +type BillingWorkflowPaymentSettings struct { + // CollectionMethod The payment method for the invoice. + CollectionMethod *CollectionMethod `json:"collectionMethod,omitempty"` } -// BillingPaymentTermDueDateType defines model for BillingPaymentTermDueDate.Type. -type BillingPaymentTermDueDateType string +// BillingWorkflowSettings BillingWorkflowSettings represents the settings for a billing workflow. +type BillingWorkflowSettings struct { + // Collection The collection settings for this workflow + Collection *BillingWorkflowCollectionSettings `json:"collection,omitempty"` -// BillingPaymentTermInstant PaymentTermInstant defines the terms for payment on receipt of invoice. -type BillingPaymentTermInstant struct { - Detail *string `json:"detail,omitempty"` - Notes *string `json:"notes,omitempty"` - Type BillingPaymentTermInstantType `json:"type"` -} + // Invoicing The invoicing settings for this workflow + Invoicing *BillingWorkflowInvoicingSettings `json:"invoicing,omitempty"` -// BillingPaymentTermInstantType defines model for BillingPaymentTermInstant.Type. -type BillingPaymentTermInstantType string + // Payment The payment settings for this workflow + Payment *BillingWorkflowPaymentSettings `json:"payment,omitempty"` +} -// BillingPaymentTerms PaymentTerms defines the terms for payment. -type BillingPaymentTerms struct { - union json.RawMessage +// CheckoutSessionCustomTextAfterSubmitParams Stripe CheckoutSession.custom_text +type CheckoutSessionCustomTextAfterSubmitParams struct { + AfterSubmit *struct { + Message *string `json:"message,omitempty"` + } `json:"afterSubmit,omitempty"` + ShippingAddress *struct { + Message *string `json:"message,omitempty"` + } `json:"shippingAddress,omitempty"` + Submit *struct { + Message *string `json:"message,omitempty"` + } `json:"submit,omitempty"` + TermsOfServiceAcceptance *struct { + Message *string `json:"message,omitempty"` + } `json:"termsOfServiceAcceptance,omitempty"` } -// BillingPeriod Period represents a time range. -// -// Billing always treats periods as start being inclusive and end being exclusive. -type BillingPeriod struct { - // End [RFC3339](https://tools.ietf.org/html/rfc3339) formatted date-time string in UTC. - End time.Time `json:"end"` +// CheckoutSessionUIMode Stripe CheckoutSession.ui_mode +type CheckoutSessionUIMode string - // Start [RFC3339](https://tools.ietf.org/html/rfc3339) formatted date-time string in UTC. - Start time.Time `json:"start"` +// ClientAppStartResponse Response from the client app (OpenMeter backend) to start the OAuth2 flow. +type ClientAppStartResponse struct { + // Url The URL to start the OAuth2 authorization code grant flow. + Url string `json:"url"` } -// BillingProfile Profile represents a billing profile -type BillingProfile struct { - Apps *BillingProfileAppsOrReference `json:"apps,omitempty"` - - // CreatedAt Timestamp of when the resource was created. - CreatedAt *time.Time `json:"createdAt,omitempty"` - Default bool `json:"default"` +// CollectionMethod CollectionMethod specifies how the invoice should be collected (automatic vs manual) +type CollectionMethod string - // DeletedAt Timestamp of when the resource was permanently deleted. - DeletedAt *time.Time `json:"deletedAt,omitempty"` +// ConflictProblemResponse A Problem Details object (RFC 7807). +// Additional properties specific to the problem type may be present. +type ConflictProblemResponse = UnexpectedProblemResponse - // Description Optional description of the resource. Maximum 1024 characters. - Description *string `json:"description,omitempty"` +// CountryCode [ISO 3166-1](https://www.iso.org/iso-3166-country-codes.html) alpha-2 country code. +// Custom two-letter country codes are also supported for convenience. +type CountryCode = string - // Id A unique identifier for the resource. - Id *string `json:"id,omitempty"` +// CreateStripeCheckoutSessionRequest Create Stripe checkout session request. +type CreateStripeCheckoutSessionRequest struct { + // AppId If not provided, the default Stripe app is used if any. + AppId *string `json:"appId,omitempty"` - // Metadata Additional metadata for the resource. - Metadata *Metadata `json:"metadata"` + // Customer Provide a customer ID to use an existing OpenMeter customer. + // or provide a customer object to create a new customer. + Customer CreateStripeCheckoutSessionRequest_Customer `json:"customer"` - // Name Human-readable name for the resource. Between 1 and 256 characters. - Name string `json:"name"` - Supplier BillingParty `json:"supplier"` + // Options Options passed to Stripe when creating the checkout session. + Options CreateStripeCheckoutSessionRequestOptions `json:"options"` - // UpdatedAt When the resource was last updated. - // - // For updates this field must be set to the last update time to detect conflicts. - UpdatedAt time.Time `json:"updatedAt"` - Workflow BillingWorkflow `json:"workflow"` + // StripeCustomerId Stripe customer ID. + // If not provided OpenMeter creates a new Stripe customer or + // uses the OpenMeter customer's default Stripe customer ID. + StripeCustomerId *string `json:"stripeCustomerId,omitempty"` } -// BillingProfileAppReferences ProfileAppsReference represents the references (id, type) to the apps used by a billing profile -type BillingProfileAppReferences struct { - Invoicing AppReference `json:"invoicing"` - Payment AppReference `json:"payment"` - Tax AppReference `json:"tax"` +// CreateStripeCheckoutSessionRequest_Customer Provide a customer ID to use an existing OpenMeter customer. +// or provide a customer object to create a new customer. +type CreateStripeCheckoutSessionRequest_Customer struct { + union json.RawMessage } -// BillingProfileApps ProfileApps represents the applications used by a billing profile -type BillingProfileApps struct { - // Invoicing App. - // One of: stripe - Invoicing App `json:"invoicing"` +// CreateStripeCheckoutSessionRequestOptions Create Stripe checkout session options +type CreateStripeCheckoutSessionRequestOptions struct { + CancelURL *string `json:"cancelURL,omitempty"` + ClientReferenceID *string `json:"clientReferenceID,omitempty"` - // Payment App. - // One of: stripe - Payment App `json:"payment"` + // Currency Three-letter [ISO4217](https://www.iso.org/iso-4217-currency-codes.html) currency code. + // Custom three-letter currency codes are also supported for convenience. + Currency *CurrencyCode `json:"currency,omitempty"` - // Tax App. - // One of: stripe - Tax App `json:"tax"` -} + // CustomText Stripe CheckoutSession.custom_text + CustomText *CheckoutSessionCustomTextAfterSubmitParams `json:"customText,omitempty"` + Metadata *map[string]string `json:"metadata,omitempty"` + PaymentMethodTypes *[]string `json:"paymentMethodTypes,omitempty"` + ReturnURL *string `json:"returnURL,omitempty"` + SuccessURL *string `json:"successURL,omitempty"` -// BillingProfileAppsOrReference ProfileAppsOrReference represents the union of ProfileApps and ProfileAppReferences -// for a billing profile. -type BillingProfileAppsOrReference struct { - union json.RawMessage + // UiMode Stripe CheckoutSession.ui_mode + UiMode *CheckoutSessionUIMode `json:"uiMode,omitempty"` } -// BillingProfileCreateAppsInput ProfileCreateAppsInput represents the input for creating a billing profile's apps -type BillingProfileCreateAppsInput struct { - Invoicing BillingWorkflowAppIdOrType `json:"invoicing"` - Payment BillingWorkflowAppIdOrType `json:"payment"` - Tax BillingWorkflowAppIdOrType `json:"tax"` -} +// CreateStripeCheckoutSessionResult Create Stripe Checkout Session response. +type CreateStripeCheckoutSessionResult struct { + // CancelURL Cancel URL. + CancelURL *string `json:"cancelURL,omitempty"` -// BillingProfileCreateInput ProfileCreateInput represents the input for creating a billing profile -type BillingProfileCreateInput struct { - // Apps ProfileCreateAppsInput represents the input for creating a billing profile's apps - Apps BillingProfileCreateAppsInput `json:"apps"` - Default bool `json:"default"` + // CustomerId The OpenMeter customer ID. + CustomerId string `json:"customerId"` - // Description Optional description of the resource. Maximum 1024 characters. - Description *string `json:"description,omitempty"` + // Mode Mode + // Always `setup` for now. + Mode StripeCheckoutSessionMode `json:"mode"` - // Metadata Additional metadata for the resource. - Metadata *Metadata `json:"metadata"` + // ReturnURL Return URL. + ReturnURL *string `json:"returnURL,omitempty"` - // Name Human-readable name for the resource. Between 1 and 256 characters. - Name string `json:"name"` - Supplier BillingPartyCreate `json:"supplier"` - Workflow BillingWorkflow `json:"workflow"` -} + // SessionId The checkout session ID. + SessionId string `json:"sessionId"` -// BillingProfileExpand ProfileExpand details what profile fields to expand -type BillingProfileExpand string + // SetupIntentId The checkout session setup intent ID. + SetupIntentId string `json:"setupIntentId"` -// BillingProfileOrderBy ProfileOrderBy specifies the ordering options for profiles -type BillingProfileOrderBy string + // StripeCustomerId The Stripe customer ID. + StripeCustomerId string `json:"stripeCustomerId"` -// BillingTaxBehavior TaxBehavior details how the tax item is applied to the base amount. -// -// Inclusive means the tax is included in the base amount. -// Exclusive means the tax is added to the base amount. -type BillingTaxBehavior string + // SuccessURL Success URL. + SuccessURL *string `json:"successURL,omitempty"` -// BillingTaxIdentificationCode defines model for BillingTaxIdentificationCode. -type BillingTaxIdentificationCode = string + // Url URL to show the checkout session. + Url string `json:"url"` +} -// BillingTaxIdentity Identity stores the details required to identify an entity for tax purposes in a specific country. -type BillingTaxIdentity struct { - Code *BillingTaxIdentificationCode `json:"code,omitempty"` +// CreditNoteOriginalInvoiceRef Omitted fields: +// period: Tax period in which the referred document had an effect required by some tax regimes and formats. +// stamps: Seals of approval from other organisations that may need to be listed. +// ext: Extensions for additional codes that may be required. +type CreditNoteOriginalInvoiceRef = InvoiceGenericDocumentRef + +// CurrencyCode Three-letter [ISO4217](https://www.iso.org/iso-4217-currency-codes.html) currency code. +// Custom three-letter currency codes are also supported for convenience. +type CurrencyCode = string + +// CustomSubscriptionChange Change a custom subscription. +type CustomSubscriptionChange struct { + // ActiveFrom [RFC3339](https://tools.ietf.org/html/rfc3339) formatted date-time string in UTC. + ActiveFrom time.Time `json:"activeFrom"` + + // CustomPlan Resource create operation model. + CustomPlan PlanCreate `json:"customPlan"` } -// BillingTaxItem TaxConfig stores the configuration for a tax line relative to an invoice line. -type BillingTaxItem struct { - Behavior *BillingTaxBehavior `json:"behavior,omitempty"` - Config *TaxConfig `json:"config,omitempty"` - Percent *Percentage `json:"percent,omitempty"` - Surcharge *Numeric `json:"surcharge,omitempty"` +// CustomSubscriptionCreate Create a custom subscription. +type CustomSubscriptionCreate struct { + // ActiveFrom [RFC3339](https://tools.ietf.org/html/rfc3339) formatted date-time string in UTC. + ActiveFrom time.Time `json:"activeFrom"` + + // CustomPlan Resource create operation model. + CustomPlan PlanCreate `json:"customPlan"` + + // CustomerId ULID (Universally Unique Lexicographically Sortable Identifier). + CustomerId string `json:"customerId"` } -// BillingUsageBasedLine UsageBasedLine represents a line item that is sold to the customer based on usage. -type BillingUsageBasedLine struct { - Charges *[]BillingLineCharge `json:"charges,omitempty"` - Children *[]BillingInvoiceLine `json:"children"` +// Customer A customer object. +type Customer struct { + // BillingAddress The billing address of the customer. + // Used for tax and invoicing. + BillingAddress *Address `json:"billingAddress,omitempty"` // CreatedAt Timestamp of when the resource was created. - CreatedAt *time.Time `json:"createdAt,omitempty"` - Currency CurrencyCode `json:"currency"` + CreatedAt *time.Time `json:"createdAt,omitempty"` + + // Currency Currency of the customer. + // Used for billing, tax and invoicing. + Currency *CurrencyCode `json:"currency,omitempty"` // DeletedAt Timestamp of when the resource was permanently deleted. DeletedAt *time.Time `json:"deletedAt,omitempty"` // Description Optional description of the resource. Maximum 1024 characters. - Description *string `json:"description,omitempty"` - Discounts *[]BillingLineDiscount `json:"discounts,omitempty"` - - // FeatureKey A key is a unique string that is used to identify a resource. - FeatureKey string `json:"featureKey"` - - // Id ULID (Universally Unique Lexicographically Sortable Identifier). - Id string `json:"id"` - Invoice *BillingInvoiceReference `json:"invoice,omitempty"` + Description *string `json:"description,omitempty"` - // InvoiceAt [RFC3339](https://tools.ietf.org/html/rfc3339) formatted date-time string in UTC. - InvoiceAt time.Time `json:"invoiceAt"` + // Id A unique identifier for the resource. + Id *string `json:"id,omitempty"` // Metadata Additional metadata for the resource. Metadata *Metadata `json:"metadata"` // Name Human-readable name for the resource. Between 1 and 256 characters. - Name string `json:"name"` - Period BillingPeriod `json:"period"` + Name string `json:"name"` - // Price The price of the usage based rate card. - Price RateCardUsageBasedPrice `json:"price"` - Quantity *Numeric `json:"quantity,omitempty"` - Status *BillingLineStatus `json:"status,omitempty"` - TaxConfig *TaxConfig `json:"taxConfig"` - Taxes *[]BillingTaxItem `json:"taxes,omitempty"` - Totals *BillingInvoiceTotals `json:"totals,omitempty"` - Type BillingUsageBasedLineType `json:"type"` + // PrimaryEmail The primary email address of the customer. + PrimaryEmail *string `json:"primaryEmail,omitempty"` + + // Timezone Timezone of the customer. + Timezone *string `json:"timezone,omitempty"` // UpdatedAt Timestamp of when the resource was last updated. UpdatedAt *time.Time `json:"updatedAt,omitempty"` -} - -// BillingUsageBasedLineType defines model for BillingUsageBasedLine.Type. -type BillingUsageBasedLineType string - -// BillingUsageBasedLineCreate UsageBasedLine represents a line item that is sold to the customer based on usage. -type BillingUsageBasedLineCreate struct { - Currency CurrencyCode `json:"currency"` - // Description Optional description of the resource. Maximum 1024 characters. - Description *string `json:"description,omitempty"` + // UsageAttribution Mapping to attribute metered usage to the customer + UsageAttribution CustomerUsageAttribution `json:"usageAttribution"` +} - // FeatureKey A key is a unique string that is used to identify a resource. - FeatureKey string `json:"featureKey"` - Invoice *BillingInvoiceReference `json:"invoice,omitempty"` +// CustomerAppData CustomerAppData +// Stores the app specific data for the customer. +// One of: stripe, sandbox +type CustomerAppData struct { + union json.RawMessage +} - // InvoiceAt [RFC3339](https://tools.ietf.org/html/rfc3339) formatted date-time string in UTC. - InvoiceAt time.Time `json:"invoiceAt"` +// CustomerAppDataPaginatedResponse Paginated response +type CustomerAppDataPaginatedResponse struct { + // Items The items in the current page. + Items []CustomerAppData `json:"items"` - // Metadata Additional metadata for the resource. - Metadata *Metadata `json:"metadata"` + // Page The items in the current page. + Page int `json:"page"` - // Name Human-readable name for the resource. Between 1 and 256 characters. - Name string `json:"name"` - Period BillingPeriod `json:"period"` + // PageSize The items in the current page. + PageSize int `json:"pageSize"` - // Price The price of the usage based rate card. - Price RateCardUsageBasedPrice `json:"price"` - TaxConfig *TaxConfig `json:"taxConfig"` - Type BillingUsageBasedLineCreateType `json:"type"` + // TotalCount The items in the current page. + TotalCount int `json:"totalCount"` } -// BillingUsageBasedLineCreateType defines model for BillingUsageBasedLineCreate.Type. -type BillingUsageBasedLineCreateType string +// CustomerCreate Resource create operation model. +type CustomerCreate struct { + // BillingAddress The billing address of the customer. + // Used for tax and invoicing. + BillingAddress *Address `json:"billingAddress,omitempty"` -// BillingUsageBasedLineCreateItem UsageBasedLine represents a line item that is sold to the customer based on usage. -type BillingUsageBasedLineCreateItem struct { - Currency CurrencyCode `json:"currency"` + // Currency Currency of the customer. + // Used for billing, tax and invoicing. + Currency *CurrencyCode `json:"currency,omitempty"` // Description Optional description of the resource. Maximum 1024 characters. Description *string `json:"description,omitempty"` - // FeatureKey A key is a unique string that is used to identify a resource. - FeatureKey string `json:"featureKey"` - Invoice *BillingInvoiceReference `json:"invoice,omitempty"` - - // InvoiceAt [RFC3339](https://tools.ietf.org/html/rfc3339) formatted date-time string in UTC. - InvoiceAt time.Time `json:"invoiceAt"` - // Metadata Additional metadata for the resource. Metadata *Metadata `json:"metadata"` // Name Human-readable name for the resource. Between 1 and 256 characters. - Name string `json:"name"` - Period BillingPeriod `json:"period"` + Name string `json:"name"` - // Price The price of the usage based rate card. - Price RateCardUsageBasedPrice `json:"price"` - TaxConfig *TaxConfig `json:"taxConfig"` - Type BillingUsageBasedLineCreateItemType `json:"type"` -} + // PrimaryEmail The primary email address of the customer. + PrimaryEmail *string `json:"primaryEmail,omitempty"` -// BillingUsageBasedLineCreateItemType defines model for BillingUsageBasedLineCreateItem.Type. -type BillingUsageBasedLineCreateItemType string + // Timezone Timezone of the customer. + Timezone *string `json:"timezone,omitempty"` -// BillingValidationIssue ValidationIssue captures any validation issues related to the invoice. -// -// Issues with severity "critical" will prevent the invoice from being issued. -type BillingValidationIssue struct { - Code *string `json:"code,omitempty"` - Component string `json:"component"` - Field *string `json:"field,omitempty"` - Message string `json:"message"` - Metadata *Metadata `json:"metadata,omitempty"` - Severity BillingValidationIssueSeverity `json:"severity"` + // UsageAttribution Mapping to attribute metered usage to the customer + UsageAttribution CustomerUsageAttribution `json:"usageAttribution"` } -// BillingValidationIssueSeverity ValidationIssueSeverity describes the severity of a validation issue. -// -// Issues with severity "critical" will prevent the invoice from being issued. -type BillingValidationIssueSeverity string - -// BillingVoidInvoiceAction InvoiceVoidAction describes how to handle the voided line items. -type BillingVoidInvoiceAction struct { - Action BillingVoidInvoiceLineAction `json:"action"` - Percentage Percentage `json:"percentage"` +// CustomerId Create Stripe checkout session customer ID. +type CustomerId struct { + // Id ULID (Universally Unique Lexicographically Sortable Identifier). + Id string `json:"id"` } -// BillingVoidInvoiceInput Request to void an invoice -type BillingVoidInvoiceInput struct { - // Action The action to take on the voided line items. - Action BillingVoidInvoiceAction `json:"action"` +// CustomerOrderBy Order by options for customers. +type CustomerOrderBy string - // Overrides Per line item overrides for the action. - // - // If not specified, the `action` will be applied to all line items. - Overrides *[]BillingVoidInvoiceLineOverride `json:"overrides"` +// CustomerPaginatedResponse Paginated response +type CustomerPaginatedResponse struct { + // Items The items in the current page. + Items []Customer `json:"items"` - // Reason The reason for voiding the invoice. - Reason string `json:"reason"` + // Page The items in the current page. + Page int `json:"page"` + + // PageSize The items in the current page. + PageSize int `json:"pageSize"` + + // TotalCount The items in the current page. + TotalCount int `json:"totalCount"` } -// BillingVoidInvoiceLineAction VoidInvoiceLineAction describes how to handle the voidied line item in the invoice. -type BillingVoidInvoiceLineAction string +// CustomerReplaceUpdate Resource update operation model. +type CustomerReplaceUpdate struct { + // BillingAddress The billing address of the customer. + // Used for tax and invoicing. + BillingAddress *Address `json:"billingAddress,omitempty"` -// BillingVoidInvoiceLineOverride VoidInvoiceLineOverride describes how to handle a specific line item in the invoice when voiding. -type BillingVoidInvoiceLineOverride struct { - Action BillingVoidInvoiceAction `json:"action"` + // Currency Currency of the customer. + // Used for billing, tax and invoicing. + Currency *CurrencyCode `json:"currency,omitempty"` - // LineId ULID (Universally Unique Lexicographically Sortable Identifier). - LineId string `json:"lineId"` -} + // Description Optional description of the resource. Maximum 1024 characters. + Description *string `json:"description,omitempty"` -// BillingWorkflow Workflow represents a billing workflow -type BillingWorkflow struct { - Collection *BillingWorkflowCollectionSettings `json:"collection,omitempty"` + // Metadata Additional metadata for the resource. + Metadata *Metadata `json:"metadata"` - // CreatedAt Timestamp of when the resource was created. - CreatedAt *time.Time `json:"createdAt,omitempty"` + // Name Human-readable name for the resource. Between 1 and 256 characters. + Name string `json:"name"` - // DeletedAt Timestamp of when the resource was permanently deleted. - DeletedAt *time.Time `json:"deletedAt,omitempty"` + // PrimaryEmail The primary email address of the customer. + PrimaryEmail *string `json:"primaryEmail,omitempty"` - // Id A unique identifier for the resource. - Id *string `json:"id,omitempty"` - Invoicing *BillingWorkflowInvoicingSettings `json:"invoicing,omitempty"` - Payment *BillingWorkflowPaymentSettings `json:"payment,omitempty"` + // Timezone Timezone of the customer. + Timezone *string `json:"timezone,omitempty"` - // UpdatedAt Timestamp of when the resource was last updated. - UpdatedAt *time.Time `json:"updatedAt,omitempty"` + // UsageAttribution Mapping to attribute metered usage to the customer + UsageAttribution CustomerUsageAttribution `json:"usageAttribution"` } -// BillingWorkflowAppIdOrType AppIdOrType can be used to reference an app during creation only. -// -// This can be either an AppType or the ULID of an app. -type BillingWorkflowAppIdOrType = string +// CustomerUsageAttribution Mapping to attribute metered usage to the customer. +// One customer can have multiple subjects, +// but one subject can only belong to one customer. +type CustomerUsageAttribution struct { + // SubjectKeys The subjects that are attributed to the customer. + SubjectKeys []string `json:"subjectKeys"` +} -// BillingWorkflowCollectionAlignment CollectionAlignment specifies when the pending line items should be collected into -// an invoice. -type BillingWorkflowCollectionAlignment string +// Discount Percentage discount. +type Discount = DiscountPercentage -// BillingWorkflowCollectionMethod CollectionMethod specifies how the invoice should be collected (automatic vs manual) -type BillingWorkflowCollectionMethod string +// DiscountPercentage Percentage discount. +type DiscountPercentage struct { + // Percentage The percentage of the discount. + Percentage float32 `json:"percentage"` -// BillingWorkflowCollectionSettings Workflow collection specifies how to collect the pending line items for an invoice -type BillingWorkflowCollectionSettings struct { - // Alignment When to collect the pending line items into an invoice. - Alignment *BillingWorkflowCollectionAlignment `json:"alignment,omitempty"` + // RateCards The rate cards that the discount applies to. + // When not specified, the discount applies to all rate cards. + RateCards *[]string `json:"rateCards,omitempty"` - // Interval The interval for collecting the pending line items into an invoice. - Interval *string `json:"interval,omitempty"` + // Type The type of the discount. + Type DiscountPercentageType `json:"type"` } -// BillingWorkflowInvoicingSettings WorkflowInvoice represents the invoice settings for a billing workflow -type BillingWorkflowInvoicingSettings struct { - // AutoAdvance Whether to automatically issue the invoice after the draftPeriod has passed. - AutoAdvance *bool `json:"autoAdvance,omitempty"` +// DiscountPercentageType The type of the discount. +type DiscountPercentageType string - // DraftPeriod The period for the invoice to be kept in draft status for manual reviews. - DraftPeriod *string `json:"draftPeriod,omitempty"` +// EditSubscriptionAddItem Add a new item to a phase. +type EditSubscriptionAddItem struct { + Op EditSubscriptionAddItemOp `json:"op"` + PhaseKey string `json:"phaseKey"` - // DueAfter The period after which the invoice is due. - DueAfter *string `json:"dueAfter,omitempty"` + // RateCard A rate card defines the pricing and entitlement of a feature or service. + RateCard RateCard `json:"rateCard"` } -// BillingWorkflowPaymentSettings WorkflowPaymentSettings represents the payment settings for a billing workflow -type BillingWorkflowPaymentSettings struct { - CollectionMethod *BillingWorkflowCollectionMethod `json:"collectionMethod,omitempty"` -} +// EditSubscriptionAddItemOp defines model for EditSubscriptionAddItem.Op. +type EditSubscriptionAddItemOp string -// BillingWorkflowSettings WorkflowSettings represents the settings for a billing workflow. -type BillingWorkflowSettings struct { - Collection *BillingWorkflowCollectionSettings `json:"collection,omitempty"` - Invoicing *BillingWorkflowInvoicingSettings `json:"invoicing,omitempty"` - Payment *BillingWorkflowPaymentSettings `json:"payment,omitempty"` -} +// EditSubscriptionAddPhase Add a new phase +type EditSubscriptionAddPhase struct { + Op EditSubscriptionAddPhaseOp `json:"op"` -// CheckoutSessionCustomTextAfterSubmitParams Stripe CheckoutSession.custom_text -type CheckoutSessionCustomTextAfterSubmitParams struct { - AfterSubmit *struct { - Message *string `json:"message,omitempty"` - } `json:"afterSubmit,omitempty"` - ShippingAddress *struct { - Message *string `json:"message,omitempty"` - } `json:"shippingAddress,omitempty"` - Submit *struct { - Message *string `json:"message,omitempty"` - } `json:"submit,omitempty"` - TermsOfServiceAcceptance *struct { - Message *string `json:"message,omitempty"` - } `json:"termsOfServiceAcceptance,omitempty"` + // Phase Subscription phase create input. + Phase SubscriptionPhaseCreate `json:"phase"` } -// CheckoutSessionUIMode Stripe CheckoutSession.ui_mode -type CheckoutSessionUIMode string +// EditSubscriptionAddPhaseOp defines model for EditSubscriptionAddPhase.Op. +type EditSubscriptionAddPhaseOp string -// ClientAppStartResponse Response from the client app (OpenMeter backend) to start the OAuth2 flow. -type ClientAppStartResponse struct { - // Url The URL to start the OAuth2 authorization code grant flow. - Url string `json:"url"` +// EditSubscriptionRemoveItem Remove an item from a phase. +type EditSubscriptionRemoveItem struct { + ItemKey string `json:"itemKey"` + Op EditSubscriptionRemoveItemOp `json:"op"` + PhaseKey string `json:"phaseKey"` } -// ConflictProblemResponse A Problem Details object (RFC 7807). -// Additional properties specific to the problem type may be present. -type ConflictProblemResponse = UnexpectedProblemResponse - -// CountryCode [ISO 3166-1](https://www.iso.org/iso-3166-country-codes.html) alpha-2 country code. -// Custom two-letter country codes are also supported for convenience. -type CountryCode = string +// EditSubscriptionRemoveItemOp defines model for EditSubscriptionRemoveItem.Op. +type EditSubscriptionRemoveItemOp string -// CreateCustomSubscriptionRequestBody Create a custom subscription. -type CreateCustomSubscriptionRequestBody struct { - // ActiveFrom [RFC3339](https://tools.ietf.org/html/rfc3339) formatted date-time string in UTC. - ActiveFrom time.Time `json:"activeFrom"` +// EditSubscriptionRemovePhase Remove a phase +type EditSubscriptionRemovePhase struct { + Op EditSubscriptionRemovePhaseOp `json:"op"` + PhaseKey string `json:"phaseKey"` - // Currency Three-letter [ISO4217](https://www.iso.org/iso-4217-currency-codes.html) currency code. - // Custom three-letter currency codes are also supported for convenience. - Currency CurrencyCode `json:"currency"` + // Shift The direction of the phase shift when a phase is removed. + Shift RemovePhaseShifting `json:"shift"` +} - // CustomPlan Resource create operation model. - CustomPlan PlanCreate `json:"customPlan"` +// EditSubscriptionRemovePhaseOp defines model for EditSubscriptionRemovePhase.Op. +type EditSubscriptionRemovePhaseOp string - // CustomerId ULID (Universally Unique Lexicographically Sortable Identifier). - CustomerId string `json:"customerId"` +// EditSubscriptionStretchPhase Stretch a phase +type EditSubscriptionStretchPhase struct { + ExtendBy string `json:"extendBy"` + Op EditSubscriptionStretchPhaseOp `json:"op"` + PhaseKey string `json:"phaseKey"` } -// CreateStripeCheckoutSessionRequest Create Stripe checkout session request. -type CreateStripeCheckoutSessionRequest struct { - // AppId If not provided, the default Stripe app is used if any. - AppId *string `json:"appId,omitempty"` - - // Customer Provide a customer ID to use an existing OpenMeter customer. - // or provide a customer object to create a new customer. - Customer CreateStripeCheckoutSessionRequest_Customer `json:"customer"` +// EditSubscriptionStretchPhaseOp defines model for EditSubscriptionStretchPhase.Op. +type EditSubscriptionStretchPhaseOp string - // Options Options passed to Stripe when creating the checkout session. - Options CreateStripeCheckoutSessionRequestOptions `json:"options"` - - // StripeCustomerId Stripe customer ID. - // If not provided OpenMeter creates a new Stripe customer or - // uses the OpenMeter customer's default Stripe customer ID. - StripeCustomerId *string `json:"stripeCustomerId,omitempty"` -} - -// CreateStripeCheckoutSessionRequest_Customer Provide a customer ID to use an existing OpenMeter customer. -// or provide a customer object to create a new customer. -type CreateStripeCheckoutSessionRequest_Customer struct { +// Entitlement Entitlement templates are used to define the entitlements of a plan. +// Features are omitted from the entitlement template, as they are defined in the rate card. +type Entitlement struct { union json.RawMessage } -// CreateStripeCheckoutSessionRequestOptions Create Stripe checkout session options -type CreateStripeCheckoutSessionRequestOptions struct { - CancelURL *string `json:"cancelURL,omitempty"` - ClientReferenceID *string `json:"clientReferenceID,omitempty"` +// EntitlementBaseTemplate Shared fields of the entitlement templates. +type EntitlementBaseTemplate struct { + // CreatedAt Timestamp of when the resource was created. + CreatedAt *time.Time `json:"createdAt,omitempty"` - // Currency Three-letter [ISO4217](https://www.iso.org/iso-4217-currency-codes.html) currency code. - // Custom three-letter currency codes are also supported for convenience. - Currency *CurrencyCode `json:"currency,omitempty"` + // CurrentUsagePeriod The current usage period. + CurrentUsagePeriod *Period `json:"currentUsagePeriod,omitempty"` - // CustomText Stripe CheckoutSession.custom_text - CustomText *CheckoutSessionCustomTextAfterSubmitParams `json:"customText,omitempty"` - Metadata *map[string]string `json:"metadata,omitempty"` - PaymentMethodTypes *[]string `json:"paymentMethodTypes,omitempty"` - ReturnURL *string `json:"returnURL,omitempty"` - SuccessURL *string `json:"successURL,omitempty"` + // DeletedAt Timestamp of when the resource was permanently deleted. + DeletedAt *time.Time `json:"deletedAt,omitempty"` - // UiMode Stripe CheckoutSession.ui_mode - UiMode *CheckoutSessionUIMode `json:"uiMode,omitempty"` -} + // FeatureId The feature the subject is entitled to use. + FeatureId string `json:"featureId"` -// CreateStripeCheckoutSessionResult Create Stripe Checkout Session response. -type CreateStripeCheckoutSessionResult struct { - // CancelURL Cancel URL. - CancelURL *string `json:"cancelURL,omitempty"` + // FeatureKey The feature the subject is entitled to use. + FeatureKey string `json:"featureKey"` - // CustomerId The OpenMeter customer ID. - CustomerId string `json:"customerId"` + // Id Readonly unique ULID identifier. + Id *string `json:"id,omitempty"` - // Mode Mode - // Always `setup` for now. - Mode StripeCheckoutSessionMode `json:"mode"` + // Metadata Additional metadata for the feature. + Metadata *Metadata `json:"metadata,omitempty"` - // ReturnURL Return URL. - ReturnURL *string `json:"returnURL,omitempty"` + // SubjectKey The identifier key unique to the subject + SubjectKey string `json:"subjectKey"` - // SessionId The checkout session ID. - SessionId string `json:"sessionId"` + // Type The type of the entitlement. + Type EntitlementType `json:"type"` - // SetupIntentId The checkout session setup intent ID. - SetupIntentId string `json:"setupIntentId"` + // UpdatedAt Timestamp of when the resource was last updated. + UpdatedAt *time.Time `json:"updatedAt,omitempty"` - // StripeCustomerId The Stripe customer ID. - StripeCustomerId string `json:"stripeCustomerId"` + // UsagePeriod The defined usage period of the entitlement + UsagePeriod *RecurringPeriod `json:"usagePeriod,omitempty"` +} - // SuccessURL Success URL. - SuccessURL *string `json:"successURL,omitempty"` +// EntitlementBoolean Shared fields of the entitlement templates. +type EntitlementBoolean = EntitlementBaseTemplate - // Url URL to show the checkout session. - Url string `json:"url"` -} +// EntitlementBooleanCreateInputs Create inputs for boolean entitlement +type EntitlementBooleanCreateInputs struct { + // FeatureId The feature the subject is entitled to use. + // Either featureKey or featureId is required. + FeatureId *string `json:"featureId,omitempty"` -// CurrencyCode Three-letter [ISO4217](https://www.iso.org/iso-4217-currency-codes.html) currency code. -// Custom three-letter currency codes are also supported for convenience. -type CurrencyCode = string + // FeatureKey The feature the subject is entitled to use. + // Either featureKey or featureId is required. + FeatureKey *string `json:"featureKey,omitempty"` -// CustomSubscriptionChange Change a custom subscription. -type CustomSubscriptionChange struct { - // ActiveFrom [RFC3339](https://tools.ietf.org/html/rfc3339) formatted date-time string in UTC. - ActiveFrom time.Time `json:"activeFrom"` + // Metadata Additional metadata for the feature. + Metadata *Metadata `json:"metadata,omitempty"` + Type EntitlementBooleanCreateInputsType `json:"type"` - // Currency Three-letter [ISO4217](https://www.iso.org/iso-4217-currency-codes.html) currency code. - // Custom three-letter currency codes are also supported for convenience. - Currency CurrencyCode `json:"currency"` + // UsagePeriod The usage period associated with the entitlement. + UsagePeriod *RecurringPeriodCreateInput `json:"usagePeriod,omitempty"` +} - // CustomPlan Resource create operation model. - CustomPlan PlanCreate `json:"customPlan"` +// EntitlementBooleanCreateInputsType defines model for EntitlementBooleanCreateInputs.Type. +type EntitlementBooleanCreateInputsType string + +// EntitlementCreateInputs Create inputs for entitlement +type EntitlementCreateInputs struct { + union json.RawMessage } -// Customer A customer object. -type Customer struct { - // BillingAddress The billing address of the customer. - // Used for tax and invoicing. - BillingAddress *Address `json:"billingAddress,omitempty"` +// EntitlementGrant The grant. +type EntitlementGrant struct { + // Amount The amount to grant. Should be a positive number. + Amount float64 `json:"amount"` // CreatedAt Timestamp of when the resource was created. CreatedAt *time.Time `json:"createdAt,omitempty"` - // Currency Currency of the customer. - // Used for billing, tax and invoicing. - Currency *CurrencyCode `json:"currency,omitempty"` - // DeletedAt Timestamp of when the resource was permanently deleted. DeletedAt *time.Time `json:"deletedAt,omitempty"` - // Description Optional description of the resource. Maximum 1024 characters. - Description *string `json:"description,omitempty"` + // EffectiveAt Effective date for grants and anchor for recurring grants. Provided value will be ceiled to metering windowSize (minute). + EffectiveAt time.Time `json:"effectiveAt"` - // Id A unique identifier for the resource. - Id *string `json:"id,omitempty"` + // EntitlementId The unique entitlement ULID that the grant is associated with. + EntitlementId *string `json:"entitlementId,omitempty"` - // Metadata Additional metadata for the resource. - Metadata *Metadata `json:"metadata"` + // Expiration The grant expiration definition + Expiration ExpirationPeriod `json:"expiration"` - // Name Human-readable name for the resource. Between 1 and 256 characters. - Name string `json:"name"` + // ExpiresAt The time the grant expires. + ExpiresAt *time.Time `json:"expiresAt,omitempty"` - // PrimaryEmail The primary email address of the customer. - PrimaryEmail *string `json:"primaryEmail,omitempty"` + // Id Readonly unique ULID identifier. + Id *string `json:"id,omitempty"` - // Timezone Timezone of the customer. - Timezone *string `json:"timezone,omitempty"` + // MaxRolloverAmount Grants are rolled over at reset, after which they can have a different balance compared to what they had before the reset. + // Balance after the reset is calculated as: Balance_After_Reset = MIN(MaxRolloverAmount, MAX(Balance_Before_Reset, MinRolloverAmount)) + MaxRolloverAmount *float64 `json:"maxRolloverAmount,omitempty"` - // UpdatedAt Timestamp of when the resource was last updated. - UpdatedAt *time.Time `json:"updatedAt,omitempty"` + // Metadata The grant metadata. + Metadata *Metadata `json:"metadata,omitempty"` - // UsageAttribution Mapping to attribute metered usage to the customer - UsageAttribution CustomerUsageAttribution `json:"usageAttribution"` -} + // MinRolloverAmount Grants are rolled over at reset, after which they can have a different balance compared to what they had before the reset. + // Balance after the reset is calculated as: Balance_After_Reset = MIN(MaxRolloverAmount, MAX(Balance_Before_Reset, MinRolloverAmount)) + MinRolloverAmount *float64 `json:"minRolloverAmount,omitempty"` -// CustomerAppData CustomerAppData -// Stores the app specific data for the customer. -// One of: stripe, sandbox -type CustomerAppData struct { - union json.RawMessage -} + // NextRecurrence The next time the grant will recurr. + NextRecurrence *time.Time `json:"nextRecurrence,omitempty"` -// CustomerAppDataPaginatedResponse Paginated response -type CustomerAppDataPaginatedResponse struct { - // Items The items in the current page. - Items []CustomerAppData `json:"items"` + // Priority The priority of the grant. Grants with higher priority are applied first. + // Priority is a positive decimal numbers. With lower numbers indicating higher importance. + // For example, a priority of 1 is more urgent than a priority of 2. + // When there are several grants available for the same subject, the system selects the grant with the highest priority. + // In cases where grants share the same priority level, the grant closest to its expiration will be used first. + // In the case of two grants have identical priorities and expiration dates, the system will use the grant that was created first. + Priority *uint8 `json:"priority,omitempty"` - // Page The items in the current page. - Page int `json:"page"` + // Recurrence The recurrence period of the grant. + Recurrence *RecurringPeriod `json:"recurrence,omitempty"` - // PageSize The items in the current page. - PageSize int `json:"pageSize"` + // UpdatedAt Timestamp of when the resource was last updated. + UpdatedAt *time.Time `json:"updatedAt,omitempty"` - // TotalCount The items in the current page. - TotalCount int `json:"totalCount"` + // VoidedAt The time the grant was voided. + VoidedAt *time.Time `json:"voidedAt,omitempty"` } -// CustomerCreate Resource create operation model. -type CustomerCreate struct { - // BillingAddress The billing address of the customer. - // Used for tax and invoicing. - BillingAddress *Address `json:"billingAddress,omitempty"` +// EntitlementGrantCreateInput The grant creation input. +type EntitlementGrantCreateInput struct { + // Amount The amount to grant. Should be a positive number. + Amount float64 `json:"amount"` - // Currency Currency of the customer. - // Used for billing, tax and invoicing. - Currency *CurrencyCode `json:"currency,omitempty"` + // EffectiveAt Effective date for grants and anchor for recurring grants. Provided value will be ceiled to metering windowSize (minute). + EffectiveAt time.Time `json:"effectiveAt"` - // Description Optional description of the resource. Maximum 1024 characters. - Description *string `json:"description,omitempty"` + // Expiration The grant expiration definition + Expiration ExpirationPeriod `json:"expiration"` - // Metadata Additional metadata for the resource. - Metadata *Metadata `json:"metadata"` + // MaxRolloverAmount Grants are rolled over at reset, after which they can have a different balance compared to what they had before the reset. + // Balance after the reset is calculated as: Balance_After_Reset = MIN(MaxRolloverAmount, MAX(Balance_Before_Reset, MinRolloverAmount)) + MaxRolloverAmount *float64 `json:"maxRolloverAmount,omitempty"` - // Name Human-readable name for the resource. Between 1 and 256 characters. - Name string `json:"name"` + // Metadata The grant metadata. + Metadata *Metadata `json:"metadata,omitempty"` - // PrimaryEmail The primary email address of the customer. - PrimaryEmail *string `json:"primaryEmail,omitempty"` + // MinRolloverAmount Grants are rolled over at reset, after which they can have a different balance compared to what they had before the reset. + // Balance after the reset is calculated as: Balance_After_Reset = MIN(MaxRolloverAmount, MAX(Balance_Before_Reset, MinRolloverAmount)) + MinRolloverAmount *float64 `json:"minRolloverAmount,omitempty"` - // Timezone Timezone of the customer. - Timezone *string `json:"timezone,omitempty"` + // Priority The priority of the grant. Grants with higher priority are applied first. + // Priority is a positive decimal numbers. With lower numbers indicating higher importance. + // For example, a priority of 1 is more urgent than a priority of 2. + // When there are several grants available for the same subject, the system selects the grant with the highest priority. + // In cases where grants share the same priority level, the grant closest to its expiration will be used first. + // In the case of two grants have identical priorities and expiration dates, the system will use the grant that was created first. + Priority *uint8 `json:"priority,omitempty"` - // UsageAttribution Mapping to attribute metered usage to the customer - UsageAttribution CustomerUsageAttribution `json:"usageAttribution"` + // Recurrence The subject of the grant. + Recurrence *RecurringPeriodCreateInput `json:"recurrence,omitempty"` } -// CustomerId Create Stripe checkout session customer ID. -type CustomerId struct { - // Id ULID (Universally Unique Lexicographically Sortable Identifier). - Id string `json:"id"` -} +// EntitlementMetered Metered entitlements are useful for many different use cases, from setting up usage based access to implementing complex credit systems. +// Access is determined based on feature usage using a balance calculation (the "usage allowance" provided by the issued grants is "burnt down" by the usage). +type EntitlementMetered struct { + // CreatedAt Timestamp of when the resource was created. + CreatedAt *time.Time `json:"createdAt,omitempty"` -// CustomerOrderBy Order by options for customers. -type CustomerOrderBy string + // CurrentUsagePeriod The current usage period. + CurrentUsagePeriod *Period `json:"currentUsagePeriod,omitempty"` -// CustomerOverridePaginatedResponse Paginated response -type CustomerOverridePaginatedResponse struct { - // Items The items in the current page. - Items []BillingCustomerOverride `json:"items"` + // DeletedAt Timestamp of when the resource was permanently deleted. + DeletedAt *time.Time `json:"deletedAt,omitempty"` - // Page The items in the current page. - Page int `json:"page"` + // FeatureId The feature the subject is entitled to use. + FeatureId string `json:"featureId"` - // PageSize The items in the current page. - PageSize int `json:"pageSize"` - - // TotalCount The items in the current page. - TotalCount int `json:"totalCount"` -} + // FeatureKey The feature the subject is entitled to use. + FeatureKey string `json:"featureKey"` -// CustomerPaginatedResponse Paginated response -type CustomerPaginatedResponse struct { - // Items The items in the current page. - Items []Customer `json:"items"` + // Id Readonly unique ULID identifier. + Id *string `json:"id,omitempty"` - // Page The items in the current page. - Page int `json:"page"` + // IsSoftLimit If softLimit=true the subject can use the feature even if the entitlement is exhausted, hasAccess will always be true. + IsSoftLimit *bool `json:"isSoftLimit,omitempty"` - // PageSize The items in the current page. - PageSize int `json:"pageSize"` + // IsUnlimited Deprecated, ignored by the backend. Please use isSoftLimit instead; this field will be removed in the future. + // Deprecated: + IsUnlimited *bool `json:"isUnlimited,omitempty"` - // TotalCount The items in the current page. - TotalCount int `json:"totalCount"` -} + // IssueAfterReset You can grant usage automatically alongside the entitlement, the example scenario would be creating a starting balance. + // If an amount is specified here, a grant will be created alongside the entitlement with the specified amount. + // That grant will have it's rollover settings configured in a way that after each reset operation, the balance will return the original amount specified here. + // Manually creating such a grant would mean having the "amount", "minRolloverAmount", and "maxRolloverAmount" fields all be the same. + IssueAfterReset *float64 `json:"issueAfterReset,omitempty"` -// CustomerReplaceUpdate Resource update operation model. -type CustomerReplaceUpdate struct { - // BillingAddress The billing address of the customer. - // Used for tax and invoicing. - BillingAddress *Address `json:"billingAddress,omitempty"` + // IssueAfterResetPriority Defines the grant priority for the default grant. + IssueAfterResetPriority *uint8 `json:"issueAfterResetPriority,omitempty"` - // Currency Currency of the customer. - // Used for billing, tax and invoicing. - Currency *CurrencyCode `json:"currency,omitempty"` + // LastReset The time the last reset happened. + LastReset *time.Time `json:"lastReset,omitempty"` - // Description Optional description of the resource. Maximum 1024 characters. - Description *string `json:"description,omitempty"` + // MeasureUsageFrom The time from which usage is measured. If not specified on creation, defaults to entitlement creation time. + MeasureUsageFrom *time.Time `json:"measureUsageFrom,omitempty"` - // Metadata Additional metadata for the resource. - Metadata *Metadata `json:"metadata"` + // Metadata Additional metadata for the feature. + Metadata *Metadata `json:"metadata,omitempty"` - // Name Human-readable name for the resource. Between 1 and 256 characters. - Name string `json:"name"` + // PreserveOverageAtReset If true, the overage is preserved at reset. If false, the usage is reset to 0. + PreserveOverageAtReset *bool `json:"preserveOverageAtReset,omitempty"` - // PrimaryEmail The primary email address of the customer. - PrimaryEmail *string `json:"primaryEmail,omitempty"` + // SubjectKey The identifier key unique to the subject + SubjectKey string `json:"subjectKey"` + Type EntitlementMeteredType `json:"type"` - // Timezone Timezone of the customer. - Timezone *string `json:"timezone,omitempty"` + // UpdatedAt Timestamp of when the resource was last updated. + UpdatedAt *time.Time `json:"updatedAt,omitempty"` - // UsageAttribution Mapping to attribute metered usage to the customer - UsageAttribution CustomerUsageAttribution `json:"usageAttribution"` + // UsagePeriod THe usage period of the entitlement. + UsagePeriod *RecurringPeriod `json:"usagePeriod,omitempty"` } -// CustomerUsageAttribution Mapping to attribute metered usage to the customer. -// One customer can have multiple subjects, -// but one subject can only belong to one customer. -type CustomerUsageAttribution struct { - // SubjectKeys The subjects that are attributed to the customer. - SubjectKeys []string `json:"subjectKeys"` -} +// EntitlementMeteredType defines model for EntitlementMetered.Type. +type EntitlementMeteredType string -// Discount Percentage discount. -type Discount = DiscountPercentage +// EntitlementMeteredCreateInputs Create inpurs for metered entitlement +type EntitlementMeteredCreateInputs struct { + // FeatureId The feature the subject is entitled to use. + // Either featureKey or featureId is required. + FeatureId *string `json:"featureId,omitempty"` -// DiscountPercentage Percentage discount. -type DiscountPercentage struct { - // Percentage The percentage of the discount. - Percentage float32 `json:"percentage"` + // FeatureKey The feature the subject is entitled to use. + // Either featureKey or featureId is required. + FeatureKey *string `json:"featureKey,omitempty"` - // RateCards The rate cards that the discount applies to. - // When not specified, the discount applies to all rate cards. - RateCards *[]string `json:"rateCards,omitempty"` + // IsSoftLimit If softLimit=true the subject can use the feature even if the entitlement is exhausted, hasAccess will always be true. + IsSoftLimit *bool `json:"isSoftLimit,omitempty"` - // Type The type of the discount. - Type DiscountPercentageType `json:"type"` -} + // IsUnlimited Deprecated, ignored by the backend. Please use isSoftLimit instead; this field will be removed in the future. + // Deprecated: + IsUnlimited *bool `json:"isUnlimited,omitempty"` -// DiscountPercentageType The type of the discount. -type DiscountPercentageType string + // IssueAfterReset You can grant usage automatically alongside the entitlement, the example scenario would be creating a starting balance. + // If an amount is specified here, a grant will be created alongside the entitlement with the specified amount. + // That grant will have it's rollover settings configured in a way that after each reset operation, the balance will return the original amount specified here. + // Manually creating such a grant would mean having the "amount", "minRolloverAmount", and "maxRolloverAmount" fields all be the same. + IssueAfterReset *float64 `json:"issueAfterReset,omitempty"` -// DiscountPercentageUpdateItem Percentage discount. -type DiscountPercentageUpdateItem struct { - // Percentage The percentage of the discount. - Percentage float32 `json:"percentage"` + // IssueAfterResetPriority Defines the grant priority for the default grant. + IssueAfterResetPriority *uint8 `json:"issueAfterResetPriority,omitempty"` - // RateCards The rate cards that the discount applies to. - // When not specified, the discount applies to all rate cards. - RateCards *[]string `json:"rateCards,omitempty"` + // MeasureUsageFrom Defines the time from which usage is measured. If not specified on creation, defaults to entitlement creation time. + MeasureUsageFrom *MeasureUsageFrom `json:"measureUsageFrom,omitempty"` + + // Metadata Additional metadata for the feature. + Metadata *Metadata `json:"metadata,omitempty"` + + // PreserveOverageAtReset If true, the overage is preserved at reset. If false, the usage is reset to 0. + PreserveOverageAtReset *bool `json:"preserveOverageAtReset,omitempty"` + Type EntitlementMeteredCreateInputsType `json:"type"` + + // UsagePeriod The usage period associated with the entitlement. + UsagePeriod RecurringPeriodCreateInput `json:"usagePeriod"` } -// DiscountUpdateItem Percentage discount. -type DiscountUpdateItem = DiscountPercentageUpdateItem +// EntitlementMeteredCreateInputsType defines model for EntitlementMeteredCreateInputs.Type. +type EntitlementMeteredCreateInputsType string -// Entitlement Entitlement templates are used to define the entitlements of a plan. -// Features are omitted from the entitlement template, as they are defined in the rate card. -type Entitlement struct { - union json.RawMessage +// EntitlementOrderBy Order by options for entitlements. +type EntitlementOrderBy string + +// EntitlementPaginatedResponse Paginated response +type EntitlementPaginatedResponse struct { + // Items The items in the current page. + Items []Entitlement `json:"items"` + + // Page The items in the current page. + Page int `json:"page"` + + // PageSize The items in the current page. + PageSize int `json:"pageSize"` + + // TotalCount The items in the current page. + TotalCount int `json:"totalCount"` } -// EntitlementBaseTemplate Shared fields of the entitlement templates. -type EntitlementBaseTemplate struct { +// EntitlementStatic A static entitlement. +type EntitlementStatic struct { + // Config The JSON parsable config of the entitlement. This value is also returned when checking entitlement access and it is useful for configuring fine-grained access settings to the feature, implemented in your own system. Has to be an object. + Config json.RawMessage `json:"config"` + // CreatedAt Timestamp of when the resource was created. CreatedAt *time.Time `json:"createdAt,omitempty"` @@ -1878,10 +1714,8 @@ type EntitlementBaseTemplate struct { Metadata *Metadata `json:"metadata,omitempty"` // SubjectKey The identifier key unique to the subject - SubjectKey string `json:"subjectKey"` - - // Type The type of the entitlement. - Type EntitlementType `json:"type"` + SubjectKey string `json:"subjectKey"` + Type EntitlementStaticType `json:"type"` // UpdatedAt Timestamp of when the resource was last updated. UpdatedAt *time.Time `json:"updatedAt,omitempty"` @@ -1890,11 +1724,14 @@ type EntitlementBaseTemplate struct { UsagePeriod *RecurringPeriod `json:"usagePeriod,omitempty"` } -// EntitlementBoolean Shared fields of the entitlement templates. -type EntitlementBoolean = EntitlementBaseTemplate +// EntitlementStaticType defines model for EntitlementStatic.Type. +type EntitlementStaticType string + +// EntitlementStaticCreateInputs Create inputs for static entitlement +type EntitlementStaticCreateInputs struct { + // Config The JSON parsable config of the entitlement. This value is also returned when checking entitlement access and it is useful for configuring fine-grained access settings to the feature, implemented in your own system. Has to be an object. + Config json.RawMessage `json:"config"` -// EntitlementBooleanCreateInputs Create inputs for boolean entitlement -type EntitlementBooleanCreateInputs struct { // FeatureId The feature the subject is entitled to use. // Either featureKey or featureId is required. FeatureId *string `json:"featureId,omitempty"` @@ -1904,226 +1741,198 @@ type EntitlementBooleanCreateInputs struct { FeatureKey *string `json:"featureKey,omitempty"` // Metadata Additional metadata for the feature. - Metadata *Metadata `json:"metadata,omitempty"` - Type EntitlementBooleanCreateInputsType `json:"type"` + Metadata *Metadata `json:"metadata,omitempty"` + Type EntitlementStaticCreateInputsType `json:"type"` // UsagePeriod The usage period associated with the entitlement. UsagePeriod *RecurringPeriodCreateInput `json:"usagePeriod,omitempty"` } -// EntitlementBooleanCreateInputsType defines model for EntitlementBooleanCreateInputs.Type. -type EntitlementBooleanCreateInputsType string +// EntitlementStaticCreateInputsType defines model for EntitlementStaticCreateInputs.Type. +type EntitlementStaticCreateInputsType string -// EntitlementCreateInputs Create inputs for entitlement -type EntitlementCreateInputs struct { - union json.RawMessage +// EntitlementType Type of the entitlement. +type EntitlementType = string + +// EntitlementValue Entitlements are the core of OpenMeter access management. They define access to features for subjects. Entitlements can be metered, boolean, or static. +type EntitlementValue struct { + // Balance Only available for metered entitlements. Metered entitlements are built around a balance calculation where feature usage is deducted from the issued grants. Balance represents the remaining balance of the entitlement, it's value never turns negative. + Balance *float64 `json:"balance,omitempty"` + + // Config Only available for static entitlements. The JSON parsable config of the entitlement. + Config *string `json:"config,omitempty"` + + // HasAccess Whether the subject has access to the feature. Shared accross all entitlement types. + HasAccess *bool `json:"hasAccess,omitempty"` + + // Overage Only available for metered entitlements. Overage represents the usage that wasn't covered by grants, e.g. if the subject had a total feature usage of 100 in the period but they were only granted 80, there would be 20 overage. + Overage *float64 `json:"overage,omitempty"` + + // Usage Only available for metered entitlements. Returns the total feature usage in the current period. + Usage *float64 `json:"usage,omitempty"` } -// EntitlementGrant The grant. -type EntitlementGrant struct { - // Amount The amount to grant. Should be a positive number. - Amount float64 `json:"amount"` +// Event CloudEvents Specification JSON Schema +// +// Optional properties are nullable according to the CloudEvents specification: +// OPTIONAL not omitted attributes MAY be represented as a null JSON value. +type Event = event.Event - // CreatedAt Timestamp of when the resource was created. - CreatedAt *time.Time `json:"createdAt,omitempty"` +// ExpirationDuration The expiration duration enum +type ExpirationDuration string - // DeletedAt Timestamp of when the resource was permanently deleted. - DeletedAt *time.Time `json:"deletedAt,omitempty"` +// ExpirationPeriod The grant expiration definition +type ExpirationPeriod struct { + // Count The number of time units in the expiration period. + Count int `json:"count"` - // EffectiveAt Effective date for grants and anchor for recurring grants. Provided value will be ceiled to metering windowSize (minute). - EffectiveAt time.Time `json:"effectiveAt"` + // Duration The unit of time for the expiration period. + Duration ExpirationDuration `json:"duration"` +} - // EntitlementId The unique entitlement ULID that the grant is associated with. - EntitlementId *string `json:"entitlementId,omitempty"` +// Feature Represents a feature that can be enabled or disabled for a plan. +// Used both for product catalog and entitlements. +type Feature struct { + // ArchivedAt Timestamp of when the resource was archived. + ArchivedAt *time.Time `json:"archivedAt,omitempty"` - // Expiration The grant expiration definition - Expiration ExpirationPeriod `json:"expiration"` + // CreatedAt Timestamp of when the resource was created. + CreatedAt *time.Time `json:"createdAt,omitempty"` - // ExpiresAt The time the grant expires. - ExpiresAt *time.Time `json:"expiresAt,omitempty"` + // DeletedAt Timestamp of when the resource was permanently deleted. + DeletedAt *time.Time `json:"deletedAt,omitempty"` // Id Readonly unique ULID identifier. Id *string `json:"id,omitempty"` - // MaxRolloverAmount Grants are rolled over at reset, after which they can have a different balance compared to what they had before the reset. - // Balance after the reset is calculated as: Balance_After_Reset = MIN(MaxRolloverAmount, MAX(Balance_Before_Reset, MinRolloverAmount)) - MaxRolloverAmount *float64 `json:"maxRolloverAmount,omitempty"` - - // Metadata The grant metadata. + // Key A key is a unique string that is used to identify a resource. + Key string `json:"key"` Metadata *Metadata `json:"metadata,omitempty"` - // MinRolloverAmount Grants are rolled over at reset, after which they can have a different balance compared to what they had before the reset. - // Balance after the reset is calculated as: Balance_After_Reset = MIN(MaxRolloverAmount, MAX(Balance_Before_Reset, MinRolloverAmount)) - MinRolloverAmount *float64 `json:"minRolloverAmount,omitempty"` - - // NextRecurrence The next time the grant will recurr. - NextRecurrence *time.Time `json:"nextRecurrence,omitempty"` - - // Priority The priority of the grant. Grants with higher priority are applied first. - // Priority is a positive decimal numbers. With lower numbers indicating higher importance. - // For example, a priority of 1 is more urgent than a priority of 2. - // When there are several grants available for the same subject, the system selects the grant with the highest priority. - // In cases where grants share the same priority level, the grant closest to its expiration will be used first. - // In the case of two grants have identical priorities and expiration dates, the system will use the grant that was created first. - Priority *uint8 `json:"priority,omitempty"` + // MeterGroupByFilters Optional meter group by filters. + // Useful if the meter scope is broader than what feature tracks. + // Example scenario would be a meter tracking all token use with groupBy fields for the model, + // then the feature could filter for model=gpt-4. + MeterGroupByFilters *map[string]string `json:"meterGroupByFilters,omitempty"` - // Recurrence The recurrence period of the grant. - Recurrence *RecurringPeriod `json:"recurrence,omitempty"` + // MeterSlug A key is a unique string that is used to identify a resource. + MeterSlug *string `json:"meterSlug,omitempty"` + Name string `json:"name"` // UpdatedAt Timestamp of when the resource was last updated. UpdatedAt *time.Time `json:"updatedAt,omitempty"` - - // VoidedAt The time the grant was voided. - VoidedAt *time.Time `json:"voidedAt,omitempty"` } -// EntitlementGrantCreateInput The grant creation input. -type EntitlementGrantCreateInput struct { - // Amount The amount to grant. Should be a positive number. - Amount float64 `json:"amount"` - - // EffectiveAt Effective date for grants and anchor for recurring grants. Provided value will be ceiled to metering windowSize (minute). - EffectiveAt time.Time `json:"effectiveAt"` - - // Expiration The grant expiration definition - Expiration ExpirationPeriod `json:"expiration"` - - // MaxRolloverAmount Grants are rolled over at reset, after which they can have a different balance compared to what they had before the reset. - // Balance after the reset is calculated as: Balance_After_Reset = MIN(MaxRolloverAmount, MAX(Balance_Before_Reset, MinRolloverAmount)) - MaxRolloverAmount *float64 `json:"maxRolloverAmount,omitempty"` - - // Metadata The grant metadata. +// FeatureCreateInputs Represents a feature that can be enabled or disabled for a plan. +// Used both for product catalog and entitlements. +type FeatureCreateInputs struct { + // Key A key is a unique string that is used to identify a resource. + Key string `json:"key"` Metadata *Metadata `json:"metadata,omitempty"` - // MinRolloverAmount Grants are rolled over at reset, after which they can have a different balance compared to what they had before the reset. - // Balance after the reset is calculated as: Balance_After_Reset = MIN(MaxRolloverAmount, MAX(Balance_Before_Reset, MinRolloverAmount)) - MinRolloverAmount *float64 `json:"minRolloverAmount,omitempty"` - - // Priority The priority of the grant. Grants with higher priority are applied first. - // Priority is a positive decimal numbers. With lower numbers indicating higher importance. - // For example, a priority of 1 is more urgent than a priority of 2. - // When there are several grants available for the same subject, the system selects the grant with the highest priority. - // In cases where grants share the same priority level, the grant closest to its expiration will be used first. - // In the case of two grants have identical priorities and expiration dates, the system will use the grant that was created first. - Priority *uint8 `json:"priority,omitempty"` + // MeterGroupByFilters Optional meter group by filters. + // Useful if the meter scope is broader than what feature tracks. + // Example scenario would be a meter tracking all token use with groupBy fields for the model, + // then the feature could filter for model=gpt-4. + MeterGroupByFilters *map[string]string `json:"meterGroupByFilters,omitempty"` - // Recurrence The subject of the grant. - Recurrence *RecurringPeriodCreateInput `json:"recurrence,omitempty"` + // MeterSlug A key is a unique string that is used to identify a resource. + MeterSlug *string `json:"meterSlug,omitempty"` + Name string `json:"name"` } -// EntitlementMetered Metered entitlements are useful for many different use cases, from setting up usage based access to implementing complex credit systems. -// Access is determined based on feature usage using a balance calculation (the "usage allowance" provided by the issued grants is "burnt down" by the usage). -type EntitlementMetered struct { - // CreatedAt Timestamp of when the resource was created. - CreatedAt *time.Time `json:"createdAt,omitempty"` - - // CurrentUsagePeriod The current usage period. - CurrentUsagePeriod *Period `json:"currentUsagePeriod,omitempty"` - - // DeletedAt Timestamp of when the resource was permanently deleted. - DeletedAt *time.Time `json:"deletedAt,omitempty"` - - // FeatureId The feature the subject is entitled to use. - FeatureId string `json:"featureId"` - - // FeatureKey The feature the subject is entitled to use. - FeatureKey string `json:"featureKey"` - - // Id Readonly unique ULID identifier. - Id *string `json:"id,omitempty"` - - // IsSoftLimit If softLimit=true the subject can use the feature even if the entitlement is exhausted, hasAccess will always be true. - IsSoftLimit *bool `json:"isSoftLimit,omitempty"` +// FeatureMeta Limited representation of a feature resource which includes only its unique identifiers (id, key). +type FeatureMeta struct { + // Id Unique identifier of a feature. + Id string `json:"id"` - // IsUnlimited Deprecated, ignored by the backend. Please use isSoftLimit instead; this field will be removed in the future. - // Deprecated: - IsUnlimited *bool `json:"isUnlimited,omitempty"` + // Key The key is an immutable unique identifier of the feature used throughout the API, + // for example when interacting with a subject's entitlements. + Key string `json:"key"` +} - // IssueAfterReset You can grant usage automatically alongside the entitlement, the example scenario would be creating a starting balance. - // If an amount is specified here, a grant will be created alongside the entitlement with the specified amount. - // That grant will have it's rollover settings configured in a way that after each reset operation, the balance will return the original amount specified here. - // Manually creating such a grant would mean having the "amount", "minRolloverAmount", and "maxRolloverAmount" fields all be the same. - IssueAfterReset *float64 `json:"issueAfterReset,omitempty"` +// FeatureOrderBy Order by options for features. +type FeatureOrderBy string - // IssueAfterResetPriority Defines the grant priority for the default grant. - IssueAfterResetPriority *uint8 `json:"issueAfterResetPriority,omitempty"` +// FeaturePaginatedResponse Paginated response +type FeaturePaginatedResponse struct { + // Items The items in the current page. + Items []Feature `json:"items"` - // LastReset The time the last reset happened. - LastReset *time.Time `json:"lastReset,omitempty"` + // Page The items in the current page. + Page int `json:"page"` - // MeasureUsageFrom The time from which usage is measured. If not specified on creation, defaults to entitlement creation time. - MeasureUsageFrom *time.Time `json:"measureUsageFrom,omitempty"` + // PageSize The items in the current page. + PageSize int `json:"pageSize"` - // Metadata Additional metadata for the feature. - Metadata *Metadata `json:"metadata,omitempty"` + // TotalCount The items in the current page. + TotalCount int `json:"totalCount"` +} - // PreserveOverageAtReset If true, the overage is preserved at reset. If false, the usage is reset to 0. - PreserveOverageAtReset *bool `json:"preserveOverageAtReset,omitempty"` +// FlatPrice Flat price. +type FlatPrice struct { + // Amount The amount of the flat price. + Amount Numeric `json:"amount"` + Type FlatPriceType `json:"type"` +} - // SubjectKey The identifier key unique to the subject - SubjectKey string `json:"subjectKey"` - Type EntitlementMeteredType `json:"type"` +// FlatPriceType defines model for FlatPrice.Type. +type FlatPriceType string - // UpdatedAt Timestamp of when the resource was last updated. - UpdatedAt *time.Time `json:"updatedAt,omitempty"` +// FlatPriceWithPaymentTerm Flat price with payment term. +type FlatPriceWithPaymentTerm struct { + // Amount The amount of the flat price. + Amount Numeric `json:"amount"` - // UsagePeriod THe usage period of the entitlement. - UsagePeriod *RecurringPeriod `json:"usagePeriod,omitempty"` + // PaymentTerm The payment term of the flat price. + // Defaults to in advance. + PaymentTerm *PricePaymentTerm `json:"paymentTerm,omitempty"` + Type FlatPriceWithPaymentTermType `json:"type"` } -// EntitlementMeteredType defines model for EntitlementMetered.Type. -type EntitlementMeteredType string - -// EntitlementMeteredCreateInputs Create inpurs for metered entitlement -type EntitlementMeteredCreateInputs struct { - // FeatureId The feature the subject is entitled to use. - // Either featureKey or featureId is required. - FeatureId *string `json:"featureId,omitempty"` +// FlatPriceWithPaymentTermType defines model for FlatPriceWithPaymentTerm.Type. +type FlatPriceWithPaymentTermType string - // FeatureKey The feature the subject is entitled to use. - // Either featureKey or featureId is required. - FeatureKey *string `json:"featureKey,omitempty"` +// ForbiddenProblemResponse A Problem Details object (RFC 7807). +// Additional properties specific to the problem type may be present. +type ForbiddenProblemResponse = UnexpectedProblemResponse - // IsSoftLimit If softLimit=true the subject can use the feature even if the entitlement is exhausted, hasAccess will always be true. - IsSoftLimit *bool `json:"isSoftLimit,omitempty"` +// GrantBurnDownHistorySegment A segment of the grant burn down history. +// +// A given segment represents the usage of a grant between events that changed either the grant burn down priority order or the usag period. +type GrantBurnDownHistorySegment struct { + // BalanceAtEnd The entitlement balance at the end of the period. + BalanceAtEnd *float64 `json:"balanceAtEnd,omitempty"` - // IsUnlimited Deprecated, ignored by the backend. Please use isSoftLimit instead; this field will be removed in the future. - // Deprecated: - IsUnlimited *bool `json:"isUnlimited,omitempty"` + // BalanceAtStart entitlement balance at the start of the period. + BalanceAtStart *float64 `json:"balanceAtStart,omitempty"` - // IssueAfterReset You can grant usage automatically alongside the entitlement, the example scenario would be creating a starting balance. - // If an amount is specified here, a grant will be created alongside the entitlement with the specified amount. - // That grant will have it's rollover settings configured in a way that after each reset operation, the balance will return the original amount specified here. - // Manually creating such a grant would mean having the "amount", "minRolloverAmount", and "maxRolloverAmount" fields all be the same. - IssueAfterReset *float64 `json:"issueAfterReset,omitempty"` + // GrantBalancesAtEnd The balance breakdown of each active grant at the end of the period: GrantID: Balance + GrantBalancesAtEnd *map[string]float64 `json:"grantBalancesAtEnd,omitempty"` - // IssueAfterResetPriority Defines the grant priority for the default grant. - IssueAfterResetPriority *uint8 `json:"issueAfterResetPriority,omitempty"` + // GrantBalancesAtStart The balance breakdown of each active grant at the start of the period: GrantID: Balance + GrantBalancesAtStart *map[string]float64 `json:"grantBalancesAtStart,omitempty"` - // MeasureUsageFrom Defines the time from which usage is measured. If not specified on creation, defaults to entitlement creation time. - MeasureUsageFrom *MeasureUsageFrom `json:"measureUsageFrom,omitempty"` + // GrantUsages Which grants were actually burnt down in the period and by what amount. + GrantUsages *[]GrantUsageRecord `json:"grantUsages,omitempty"` - // Metadata Additional metadata for the feature. - Metadata *Metadata `json:"metadata,omitempty"` + // Overage Overuse that wasn't covered by grants. + Overage *float64 `json:"overage,omitempty"` - // PreserveOverageAtReset If true, the overage is preserved at reset. If false, the usage is reset to 0. - PreserveOverageAtReset *bool `json:"preserveOverageAtReset,omitempty"` - Type EntitlementMeteredCreateInputsType `json:"type"` + // Period The period of the segment. + Period Period `json:"period"` - // UsagePeriod The usage period associated with the entitlement. - UsagePeriod RecurringPeriodCreateInput `json:"usagePeriod"` + // Usage The total usage of the grant in the period. + Usage *float64 `json:"usage,omitempty"` } -// EntitlementMeteredCreateInputsType defines model for EntitlementMeteredCreateInputs.Type. -type EntitlementMeteredCreateInputsType string - -// EntitlementOrderBy Order by options for entitlements. -type EntitlementOrderBy string +// GrantOrderBy Order by options for grants. +type GrantOrderBy string -// EntitlementPaginatedResponse Paginated response -type EntitlementPaginatedResponse struct { +// GrantPaginatedResponse Paginated response +type GrantPaginatedResponse struct { // Items The items in the current page. - Items []Entitlement `json:"items"` + Items []EntitlementGrant `json:"items"` // Page The items in the current page. Page int `json:"page"` @@ -2135,307 +1944,422 @@ type EntitlementPaginatedResponse struct { TotalCount int `json:"totalCount"` } -// EntitlementStatic A static entitlement. -type EntitlementStatic struct { - // Config The JSON parsable config of the entitlement. This value is also returned when checking entitlement access and it is useful for configuring fine-grained access settings to the feature, implemented in your own system. Has to be an object. - Config json.RawMessage `json:"config"` +// GrantUsageRecord Usage Record +type GrantUsageRecord struct { + // GrantId The id of the grant + GrantId string `json:"grantId"` - // CreatedAt Timestamp of when the resource was created. - CreatedAt *time.Time `json:"createdAt,omitempty"` + // Usage The usage in the period + Usage float64 `json:"usage"` +} - // CurrentUsagePeriod The current usage period. - CurrentUsagePeriod *Period `json:"currentUsagePeriod,omitempty"` +// IngestEventsBody The body of the events request. +// Either a single event or a batch of events. +type IngestEventsBody struct { + union json.RawMessage +} - // DeletedAt Timestamp of when the resource was permanently deleted. - DeletedAt *time.Time `json:"deletedAt,omitempty"` +// IngestEventsBody1 defines model for . +type IngestEventsBody1 = []Event - // FeatureId The feature the subject is entitled to use. - FeatureId string `json:"featureId"` +// IngestedEvent An ingested event with optional validation error. +type IngestedEvent struct { + // Event CloudEvents Specification JSON Schema + // + // Optional properties are nullable according to the CloudEvents specification: + // OPTIONAL not omitted attributes MAY be represented as a null JSON value. + Event Event `json:"event"` - // FeatureKey The feature the subject is entitled to use. - FeatureKey string `json:"featureKey"` + // IngestedAt The date and time the event was ingested. + IngestedAt time.Time `json:"ingestedAt"` - // Id Readonly unique ULID identifier. - Id *string `json:"id,omitempty"` + // StoredAt The date and time the event was stored. + StoredAt time.Time `json:"storedAt"` - // Metadata Additional metadata for the feature. - Metadata *Metadata `json:"metadata,omitempty"` + // ValidationError The validation error if the event failed validation. + ValidationError *string `json:"validationError,omitempty"` +} - // SubjectKey The identifier key unique to the subject - SubjectKey string `json:"subjectKey"` - Type EntitlementStaticType `json:"type"` +// InternalServerErrorProblemResponse A Problem Details object (RFC 7807). +// Additional properties specific to the problem type may be present. +type InternalServerErrorProblemResponse = UnexpectedProblemResponse - // UpdatedAt Timestamp of when the resource was last updated. - UpdatedAt *time.Time `json:"updatedAt,omitempty"` +// Invoice Invoice represents an invoice in the system. +type Invoice struct { + // CreatedAt Timestamp of when the resource was created. + CreatedAt *time.Time `json:"createdAt,omitempty"` - // UsagePeriod The defined usage period of the entitlement - UsagePeriod *RecurringPeriod `json:"usagePeriod,omitempty"` -} + // Currency Currency for all invoice line items. + // + // Multi currency invoices are not supported yet. + Currency CurrencyCode `json:"currency"` -// EntitlementStaticType defines model for EntitlementStatic.Type. -type EntitlementStaticType string + // Customer Legal entity receiving the goods or services. + Customer BillingParty `json:"customer"` -// EntitlementStaticCreateInputs Create inputs for static entitlement -type EntitlementStaticCreateInputs struct { - // Config The JSON parsable config of the entitlement. This value is also returned when checking entitlement access and it is useful for configuring fine-grained access settings to the feature, implemented in your own system. Has to be an object. - Config json.RawMessage `json:"config"` + // DeletedAt Timestamp of when the resource was permanently deleted. + DeletedAt *time.Time `json:"deletedAt,omitempty"` - // FeatureId The feature the subject is entitled to use. - // Either featureKey or featureId is required. - FeatureId *string `json:"featureId,omitempty"` + // Description Optional description of the resource. Maximum 1024 characters. + Description *string `json:"description,omitempty"` - // FeatureKey The feature the subject is entitled to use. - // Either featureKey or featureId is required. - FeatureKey *string `json:"featureKey,omitempty"` + // Discounts Discounts or allowances applied to the complete invoice. + Discounts *[]Discount `json:"discounts,omitempty"` - // Metadata Additional metadata for the feature. - Metadata *Metadata `json:"metadata,omitempty"` - Type EntitlementStaticCreateInputsType `json:"type"` + // DraftUntil The time until the invoice is in draft status. + // + // On draft invoice creation it is calculated from the workflow settings. + // + // If manual approval is required, the draftUntil time is set. + DraftUntil *time.Time `json:"draftUntil,omitempty"` - // UsagePeriod The usage period associated with the entitlement. - UsagePeriod *RecurringPeriodCreateInput `json:"usagePeriod,omitempty"` -} + // DueAt Due time of the fulfillment of the invoice (if available). + DueAt *time.Time `json:"dueAt,omitempty"` -// EntitlementStaticCreateInputsType defines model for EntitlementStaticCreateInputs.Type. -type EntitlementStaticCreateInputsType string + // Id A unique identifier for the resource. + Id *string `json:"id,omitempty"` -// EntitlementType Type of the entitlement. -type EntitlementType = string + // IssuedAt The time the invoice was issued. + // + // Depending on the status of the invoice this can mean multiple things: + // - draft, gathering: The time the invoice will be issued based on the workflow settings. + // - issued: The time the invoice was issued. + IssuedAt *time.Time `json:"issuedAt,omitempty"` -// EntitlementValue Entitlements are the core of OpenMeter access management. They define access to features for subjects. Entitlements can be metered, boolean, or static. -type EntitlementValue struct { - // Balance Only available for metered entitlements. Metered entitlements are built around a balance calculation where feature usage is deducted from the issued grants. Balance represents the remaining balance of the entitlement, it's value never turns negative. - Balance *float64 `json:"balance,omitempty"` + // Lines List of invoice lines representing each of the items sold to the customer. + Lines *[]InvoiceLine `json:"lines,omitempty"` - // Config Only available for static entitlements. The JSON parsable config of the entitlement. - Config *string `json:"config,omitempty"` + // Metadata Additional metadata for the resource. + Metadata *Metadata `json:"metadata"` - // HasAccess Whether the subject has access to the feature. Shared accross all entitlement types. - HasAccess *bool `json:"hasAccess,omitempty"` + // Number Number specifies the human readable key used to reference this Invoice. + // + // The number only gets populated after the invoice had been issued. + // + // Please note that the number is (depending on the upstream settings) either unique for the + // whole organization or unique for the customer, or in multi (stripe) account setups unique for the + // account. + Number *InvoiceNumber `json:"number,omitempty"` - // Overage Only available for metered entitlements. Overage represents the usage that wasn't covered by grants, e.g. if the subject had a total feature usage of 100 in the period but they were only granted 80, there would be 20 overage. - Overage *float64 `json:"overage,omitempty"` + // Payment Information on when, how, and to whom the invoice should be paid. + Payment *InvoicePaymentTerms `json:"payment,omitempty"` - // Usage Only available for metered entitlements. Returns the total feature usage in the current period. - Usage *float64 `json:"usage,omitempty"` -} + // Period The period the invoice covers. If the invoice has no line items, it's not set. + Period *Period `json:"period,omitempty"` -// Event CloudEvents Specification JSON Schema -// -// Optional properties are nullable according to the CloudEvents specification: -// OPTIONAL not omitted attributes MAY be represented as a null JSON value. -type Event = event.Event + // Preceding Key information regarding previous invoices and potentially details as to why they were corrected. + Preceding *[]InvoiceDocumentRef `json:"preceding,omitempty"` -// ExpirationDuration The expiration duration enum -type ExpirationDuration string + // Status The status of the invoice. + // + // This field only conatins a simplified status, for more detailed information use the statusDetails field. + Status *InvoiceStatus `json:"status,omitempty"` -// ExpirationPeriod The grant expiration definition -type ExpirationPeriod struct { - // Count The number of time units in the expiration period. - Count int `json:"count"` + // StatusDetails The details of the current invoice status. + StatusDetails *InvoiceStatusDetails `json:"statusDetails,omitempty"` - // Duration The unit of time for the expiration period. - Duration ExpirationDuration `json:"duration"` + // Supplier The taxable entity supplying the goods or services. + Supplier BillingParty `json:"supplier"` + + // Totals Summary of all the invoice totals, including taxes (calculated). + Totals *InvoiceTotals `json:"totals,omitempty"` + + // Type Type of the invoice. + // + // The type of invoice determines the purpose of the invoice and how it should be handled. + // + // Supported types: + // - standard: A regular commercial invoice document between a supplier and customer. + // - credit_note: Reflects a refund either partial or complete of the preceding document. A credit note effectively *extends* the previous document. + Type *InvoiceType `json:"type,omitempty"` + + // UpdatedAt Timestamp of when the resource was last updated. + UpdatedAt *time.Time `json:"updatedAt,omitempty"` + + // ValidationIssues Validation issues reported by the invoice workflow. + ValidationIssues *[]ValidationIssue `json:"validationIssues,omitempty"` + + // VoidedAt The time the invoice was voided. + // + // If the invoice was voided, this field will be set to the time the invoice was voided. + VoidedAt *time.Time `json:"voidedAt,omitempty"` + + // Workflow The workflow associated with the invoice. + // + // It is always a snapshot of the workflow settings at the time of invoice creation. The + // field is optional as it should be explicitly requested with expand options. + Workflow *InvoiceWorkflowSettings `json:"workflow,omitempty"` } -// Feature Represents a feature that can be enabled or disabled for a plan. -// Used both for product catalog and entitlements. -type Feature struct { - // ArchivedAt Timestamp of when the resource was archived. - ArchivedAt *time.Time `json:"archivedAt,omitempty"` +// InvoiceAction InvoiceAction represents the actions that can be performed on an invoice. +type InvoiceAction string + +// InvoiceDocumentRef CreditNoteOriginalInvoiceRef is used to reference the original invoice that a credit note is based on. +type InvoiceDocumentRef = CreditNoteOriginalInvoiceRef + +// InvoiceDocumentRefType InvoiceDocumentRefType defines the type of document that is being referenced. +type InvoiceDocumentRefType string + +// InvoiceExpand InvoiceExpand specifies the parts of the invoice to expand in the list output. +type InvoiceExpand string + +// InvoiceFlatFeeLine InvoiceFlatFeeLine represents a line item that is sold to the customer as a manually added fee. +type InvoiceFlatFeeLine struct { + // Charges Charges applied to this line. (like minimum spend) + // + // New charges can be added via the invoice's charges API, to facilitate + // charges that are affecting multiple lines. + Charges *[]BillingLineCharge `json:"charges,omitempty"` + + // Children The lines detailing the item or service sold. + Children *[]InvoiceLine `json:"children,omitempty"` // CreatedAt Timestamp of when the resource was created. CreatedAt *time.Time `json:"createdAt,omitempty"` + // Currency The currency of this line. + Currency CurrencyCode `json:"currency"` + // DeletedAt Timestamp of when the resource was permanently deleted. DeletedAt *time.Time `json:"deletedAt,omitempty"` - // Id Readonly unique ULID identifier. - Id *string `json:"id,omitempty"` + // Description Optional description of the resource. Maximum 1024 characters. + Description *string `json:"description,omitempty"` - // Key A key is a unique string that is used to identify a resource. - Key string `json:"key"` - Metadata *Metadata `json:"metadata,omitempty"` + // Discounts Discounts detailes applied to this line. + // + // New discounts can be added via the invoice's discounts API, to facilitate + // discounts that are affecting multiple lines. + Discounts *[]InvoiceLineDiscount `json:"discounts,omitempty"` - // MeterGroupByFilters Optional meter group by filters. - // Useful if the meter scope is broader than what feature tracks. - // Example scenario would be a meter tracking all token use with groupBy fields for the model, - // then the feature could filter for model=gpt-4. - MeterGroupByFilters *map[string]string `json:"meterGroupByFilters,omitempty"` + // Id ULID (Universally Unique Lexicographically Sortable Identifier). + Id string `json:"id"` - // MeterSlug A key is a unique string that is used to identify a resource. - MeterSlug *string `json:"meterSlug,omitempty"` - Name string `json:"name"` + // Invoice The invoice this item belongs to. + Invoice *InvoiceReference `json:"invoice,omitempty"` - // UpdatedAt Timestamp of when the resource was last updated. - UpdatedAt *time.Time `json:"updatedAt,omitempty"` -} + // InvoiceAt The time this line item should be invoiced. + InvoiceAt time.Time `json:"invoiceAt"` -// FeatureCreateInputs Represents a feature that can be enabled or disabled for a plan. -// Used both for product catalog and entitlements. -type FeatureCreateInputs struct { - // Key A key is a unique string that is used to identify a resource. - Key string `json:"key"` - Metadata *Metadata `json:"metadata,omitempty"` + // Metadata Additional metadata for the resource. + Metadata *Metadata `json:"metadata"` - // MeterGroupByFilters Optional meter group by filters. - // Useful if the meter scope is broader than what feature tracks. - // Example scenario would be a meter tracking all token use with groupBy fields for the model, - // then the feature could filter for model=gpt-4. - MeterGroupByFilters *map[string]string `json:"meterGroupByFilters,omitempty"` + // Name Human-readable name for the resource. Between 1 and 256 characters. + Name string `json:"name"` - // MeterSlug A key is a unique string that is used to identify a resource. - MeterSlug *string `json:"meterSlug,omitempty"` - Name string `json:"name"` -} + // PaymentTerm Payment term of the line. + PaymentTerm *PricePaymentTerm `json:"paymentTerm,omitempty"` -// FeatureMeta Limited representation of a feature resource which includes only its unique identifiers (id, key). -type FeatureMeta struct { - // Id Unique identifier of a feature. - Id string `json:"id"` + // PerUnitAmount Price of the item being sold. + PerUnitAmount Numeric `json:"perUnitAmount"` - // Key The key is an immutable unique identifier of the feature used throughout the API, - // for example when interacting with a subject's entitlements. - Key string `json:"key"` -} + // Period Period of the line item applies to for revenue recognition pruposes. + // + // Billing always treats periods as start being inclusive and end being exclusive. + Period Period `json:"period"` -// FeatureOrderBy Order by options for features. -type FeatureOrderBy string + // Quantity Quantity of the item being sold. + Quantity Numeric `json:"quantity"` -// FeaturePaginatedResponse Paginated response -type FeaturePaginatedResponse struct { - // Items The items in the current page. - Items []Feature `json:"items"` + // Status Status of the line. + // + // External calls always create valid lines, other line types are managed by the + // billing engine of OpenMeter. + Status *InvoiceLineStatus `json:"status,omitempty"` - // Page The items in the current page. - Page int `json:"page"` + // TaxConfig Tax config specify the tax configuration for this line. + TaxConfig *TaxConfig `json:"taxConfig,omitempty"` - // PageSize The items in the current page. - PageSize int `json:"pageSize"` + // Taxes Taxes applied to the invoice totals. + Taxes *[]InvoiceLineTaxItem `json:"taxes,omitempty"` - // TotalCount The items in the current page. - TotalCount int `json:"totalCount"` -} + // Totals Totals for this line. + Totals *InvoiceTotals `json:"totals,omitempty"` + Type InvoiceFlatFeeLineType `json:"type"` -// FlatPrice Flat price. -type FlatPrice struct { - // Amount The amount of the flat price. - Amount Numeric `json:"amount"` - Type FlatPriceType `json:"type"` + // UpdatedAt Timestamp of when the resource was last updated. + UpdatedAt *time.Time `json:"updatedAt,omitempty"` } -// FlatPriceType defines model for FlatPrice.Type. -type FlatPriceType string - -// FlatPriceWithPaymentTerm Flat price with payment term. -type FlatPriceWithPaymentTerm struct { - // Amount The amount of the flat price. - Amount Numeric `json:"amount"` - - // PaymentTerm The payment term of the flat price. - // Defaults to in advance. - PaymentTerm *PricePaymentTerm `json:"paymentTerm,omitempty"` - Type FlatPriceWithPaymentTermType `json:"type"` -} +// InvoiceFlatFeeLineType defines model for InvoiceFlatFeeLine.Type. +type InvoiceFlatFeeLineType string -// FlatPriceWithPaymentTermType defines model for FlatPriceWithPaymentTerm.Type. -type FlatPriceWithPaymentTermType string +// InvoiceFlatFeeLineCreate Resource create operation model. +type InvoiceFlatFeeLineCreate struct { + // Currency The currency of this line. + Currency CurrencyCode `json:"currency"` -// ForbiddenProblemResponse A Problem Details object (RFC 7807). -// Additional properties specific to the problem type may be present. -type ForbiddenProblemResponse = UnexpectedProblemResponse + // Description Optional description of the resource. Maximum 1024 characters. + Description *string `json:"description,omitempty"` -// GrantBurnDownHistorySegment A segment of the grant burn down history. -// -// A given segment represents the usage of a grant between events that changed either the grant burn down priority order or the usag period. -type GrantBurnDownHistorySegment struct { - // BalanceAtEnd The entitlement balance at the end of the period. - BalanceAtEnd *float64 `json:"balanceAtEnd,omitempty"` + // Invoice The invoice this item belongs to. + Invoice *InvoiceReference `json:"invoice,omitempty"` - // BalanceAtStart entitlement balance at the start of the period. - BalanceAtStart *float64 `json:"balanceAtStart,omitempty"` + // InvoiceAt The time this line item should be invoiced. + InvoiceAt time.Time `json:"invoiceAt"` - // GrantBalancesAtEnd The balance breakdown of each active grant at the end of the period: GrantID: Balance - GrantBalancesAtEnd *map[string]float64 `json:"grantBalancesAtEnd,omitempty"` + // Metadata Additional metadata for the resource. + Metadata *Metadata `json:"metadata"` - // GrantBalancesAtStart The balance breakdown of each active grant at the start of the period: GrantID: Balance - GrantBalancesAtStart *map[string]float64 `json:"grantBalancesAtStart,omitempty"` + // Name Human-readable name for the resource. Between 1 and 256 characters. + Name string `json:"name"` - // GrantUsages Which grants were actually burnt down in the period and by what amount. - GrantUsages *[]GrantUsageRecord `json:"grantUsages,omitempty"` + // PaymentTerm Payment term of the line. + PaymentTerm *PricePaymentTerm `json:"paymentTerm,omitempty"` - // Overage Overuse that wasn't covered by grants. - Overage *float64 `json:"overage,omitempty"` + // PerUnitAmount Price of the item being sold. + PerUnitAmount Numeric `json:"perUnitAmount"` - // Period The period of the segment. + // Period Period of the line item applies to for revenue recognition pruposes. + // + // Billing always treats periods as start being inclusive and end being exclusive. Period Period `json:"period"` - // Usage The total usage of the grant in the period. - Usage *float64 `json:"usage,omitempty"` + // Quantity Quantity of the item being sold. + Quantity Numeric `json:"quantity"` + + // TaxConfig Tax config specify the tax configuration for this line. + TaxConfig *TaxConfig `json:"taxConfig,omitempty"` + Type InvoiceFlatFeeLineCreateType `json:"type"` } -// GrantOrderBy Order by options for grants. -type GrantOrderBy string +// InvoiceFlatFeeLineCreateType defines model for InvoiceFlatFeeLineCreate.Type. +type InvoiceFlatFeeLineCreateType string -// GrantPaginatedResponse Paginated response -type GrantPaginatedResponse struct { - // Items The items in the current page. - Items []EntitlementGrant `json:"items"` +// InvoiceFlatFeeLineReplaceUpdate Resource update operation model. +type InvoiceFlatFeeLineReplaceUpdate struct { + // Description Optional description of the resource. Maximum 1024 characters. + Description *string `json:"description,omitempty"` - // Page The items in the current page. - Page int `json:"page"` + // InvoiceAt The time this line item should be invoiced. + InvoiceAt time.Time `json:"invoiceAt"` - // PageSize The items in the current page. - PageSize int `json:"pageSize"` + // Metadata Additional metadata for the resource. + Metadata *Metadata `json:"metadata"` - // TotalCount The items in the current page. - TotalCount int `json:"totalCount"` + // Name Human-readable name for the resource. Between 1 and 256 characters. + Name string `json:"name"` + + // PaymentTerm Payment term of the line. + PaymentTerm *PricePaymentTerm `json:"paymentTerm,omitempty"` + + // PerUnitAmount Price of the item being sold. + PerUnitAmount Numeric `json:"perUnitAmount"` + + // Period Period of the line item applies to for revenue recognition pruposes. + // + // Billing always treats periods as start being inclusive and end being exclusive. + Period Period `json:"period"` + + // Quantity Quantity of the item being sold. + Quantity Numeric `json:"quantity"` + + // TaxConfig Tax config specify the tax configuration for this line. + TaxConfig *TaxConfig `json:"taxConfig,omitempty"` + Type InvoiceFlatFeeLineReplaceUpdateType `json:"type"` } -// GrantUsageRecord Usage Record -type GrantUsageRecord struct { - // GrantId The id of the grant - GrantId string `json:"grantId"` +// InvoiceFlatFeeLineReplaceUpdateType defines model for InvoiceFlatFeeLineReplaceUpdate.Type. +type InvoiceFlatFeeLineReplaceUpdateType string - // Usage The usage in the period - Usage float64 `json:"usage"` +// InvoiceGenericDocumentRef Omitted fields: +// period: Tax period in which the referred document had an effect required by some tax regimes and formats. +// stamps: Seals of approval from other organisations that may need to be listed. +// ext: Extensions for additional codes that may be required. +type InvoiceGenericDocumentRef struct { + // Description Additional details about the document. + Description *string `json:"description,omitempty"` + + // Reason Human readable description on why this reference is here or needs to be used. + Reason *string `json:"reason,omitempty"` + + // Type Type of the document referenced. + Type *InvoiceDocumentRefType `json:"type,omitempty"` } -// IngestEventsBody The body of the events request. -// Either a single event or a batch of events. -type IngestEventsBody struct { +// InvoiceLine BillingInvoiceLine represents a line item that is sold to the customer based on a specific (unit) price. +type InvoiceLine struct { union json.RawMessage } -// IngestEventsBody1 defines model for . -type IngestEventsBody1 = []Event +// InvoiceLineCreate InvoiceLineCreate represents the create model for an invoice line. +type InvoiceLineCreate struct { + union json.RawMessage +} -// IngestedEvent An ingested event with optional validation error. -type IngestedEvent struct { - // Event CloudEvents Specification JSON Schema - // - // Optional properties are nullable according to the CloudEvents specification: - // OPTIONAL not omitted attributes MAY be represented as a null JSON value. - Event Event `json:"event"` +// InvoiceLineDiscount InvoiceLineDiscount represents an amount deducted from the line, and will be applied before taxes. +type InvoiceLineDiscount struct { + // Amount Fixed discount amount to apply (calculated if percent present). + Amount Numeric `json:"amount"` - // IngestedAt The date and time the event was ingested. - IngestedAt time.Time `json:"ingestedAt"` + // Code Reason code. + Code *string `json:"code,omitempty"` - // StoredAt The date and time the event was stored. - StoredAt time.Time `json:"storedAt"` + // CreatedAt Timestamp of when the resource was created. + CreatedAt *time.Time `json:"createdAt,omitempty"` - // ValidationError The validation error if the event failed validation. - ValidationError *string `json:"validationError,omitempty"` + // DeletedAt Timestamp of when the resource was permanently deleted. + DeletedAt *time.Time `json:"deletedAt,omitempty"` + + // Description Text description as to why the discount was applied. + Description *string `json:"description,omitempty"` + + // Id ID of the charge or discount. + Id *string `json:"id,omitempty"` + + // Percent Percentage if fixed amount not applied + Percent *Percentage `json:"percent,omitempty"` + + // UpdatedAt Timestamp of when the resource was last updated. + UpdatedAt *time.Time `json:"updatedAt,omitempty"` } -// InternalServerErrorProblemResponse A Problem Details object (RFC 7807). -// Additional properties specific to the problem type may be present. -type InternalServerErrorProblemResponse = UnexpectedProblemResponse +// InvoiceLineReplaceUpdate InvoiceLineReplaceUpdate represents the update model for an invoice line. +type InvoiceLineReplaceUpdate struct { + union json.RawMessage +} + +// InvoiceLineStatus Line status specifies the status of the line. +type InvoiceLineStatus string + +// InvoiceLineTaxBehavior InvoiceLineTaxBehavior details how the tax item is applied to the base amount. +// +// Inclusive means the tax is included in the base amount. +// Exclusive means the tax is added to the base amount. +type InvoiceLineTaxBehavior string + +// InvoiceLineTaxItem TaxConfig stores the configuration for a tax line relative to an invoice line. +type InvoiceLineTaxItem struct { + // Behavior Is the tax item inclusive or exclusive of the base amount. + Behavior *InvoiceLineTaxBehavior `json:"behavior,omitempty"` + + // Config Tax provider configuration. + Config *TaxConfig `json:"config,omitempty"` + + // Percent Percent defines the percentage set manually or determined from + // the rate key (calculated if rate present). A nil percent implies that + // this tax combo is **exempt** from tax.") + Percent *Percentage `json:"percent,omitempty"` + + // Surcharge Some countries require an additional surcharge (calculated if rate present). + Surcharge *Numeric `json:"surcharge,omitempty"` +} + +// InvoiceNumber InvoiceNumber is a unique identifier for the invoice, generated by the +// invoicing app. +// +// The uniqueness depends on a lot of factors: +// - app setting (unique per app or unique per customer) +// - multiple app scenarios (multiple apps generating invoices with the same prefix) +type InvoiceNumber = string + +// InvoiceOrderBy InvoiceOrderBy specifies the ordering options for invoice listing. +type InvoiceOrderBy string // InvoicePaginatedResponse Paginated response type InvoicePaginatedResponse struct { // Items The items in the current page. - Items []BillingInvoice `json:"items"` + Items []Invoice `json:"items"` // Page The items in the current page. Page int `json:"page"` @@ -2447,9 +2371,262 @@ type InvoicePaginatedResponse struct { TotalCount int `json:"totalCount"` } -// LinesUpdate Resource create or update operation model. -type LinesUpdate struct { - Lines *[]BillingInvoiceLineCreateItem `json:"lines,omitempty"` +// InvoicePaymentTerms Payment contains details as to how the invoice should be paid. +type InvoicePaymentTerms struct { + // Terms The terms of payment for the invoice. + Terms *PaymentTerms `json:"terms,omitempty"` +} + +// InvoicePendingLinesActionInput BillingInvoiceActionInput is the input for creating an invoice. +// +// Invoice creation is always based on already pending line items created by the billingCreateLineByCustomer +// operation. Empty invoices are not allowed. +type InvoicePendingLinesActionInput struct { + // AsOf The time as of which the invoice is created. + // + // If not provided, the current time is used. + AsOf *time.Time `json:"asOf,omitempty"` + + // IncludePendingLines The pending line items to include in the invoice, if not provided: + // - all line items that have invoice_at < asOf will be included + // - all usage based line items will be included up to asOf, new usage-based line items will be staged for the rest + // of the billing cycle + IncludePendingLines *[]string `json:"includePendingLines,omitempty"` +} + +// InvoiceReference Reference to an invoice. +type InvoiceReference struct { + // Id The ID of the invoice. + Id *string `json:"id,omitempty"` + + // Number The number of the invoice. + Number *InvoiceNumber `json:"number,omitempty"` +} + +// InvoiceStatus InvoiceStatus describes the status of an invoice. +type InvoiceStatus string + +// InvoiceStatusDetails InvoiceStatusDetails represents the details of the invoice status. +// +// API users are encouraged to rely on the immutable/failed/avaliableActions fields to determine +// the next steps of the invoice instead of the extendedStatus field. +type InvoiceStatusDetails struct { + // AvailableActions The actions that can be performed on the invoice. + AvailableActions []InvoiceAction `json:"availableActions"` + + // ExtendedStatus Extended status information for the invoice. + ExtendedStatus *string `json:"extendedStatus,omitempty"` + + // Failed Is the invoice in a failed state? + Failed *bool `json:"failed,omitempty"` + + // Immutable Is the invoice editable? + Immutable *bool `json:"immutable,omitempty"` +} + +// InvoiceTotals Totals contains the summaries of all calculations for the invoice. +type InvoiceTotals struct { + // Amount The total value of the line before taxes, discounts and commitments. + Amount *Numeric `json:"amount,omitempty"` + + // ChargesTotal The amount of value of the line that are due to additional charges. + ChargesTotal *Numeric `json:"chargesTotal,omitempty"` + + // DiscountsTotal The amount of value of the line that are due to discounts. + DiscountsTotal *Numeric `json:"discountsTotal,omitempty"` + + // TaxesExclusiveTotal The total amount of taxes that are added on top of amount from the line. + TaxesExclusiveTotal *Numeric `json:"taxesExclusiveTotal,omitempty"` + + // TaxesInclusiveTotal The total amount of taxes that are included in the line. + TaxesInclusiveTotal *Numeric `json:"taxesInclusiveTotal,omitempty"` + + // TaxesTotal The total amount of taxes for this line. + TaxesTotal *Numeric `json:"taxesTotal,omitempty"` + + // Total The total amount value of the line after taxes, discounts and commitments. + Total *Numeric `json:"total,omitempty"` +} + +// InvoiceType InvoiceType represents the type of invoice. +// +// The type of invoice determines the purpose of the invoice and how it should be handled. +type InvoiceType string + +// InvoiceUsageBasedLine InvoiceUsageBasedLine represents a line item that is sold to the customer based on usage. +type InvoiceUsageBasedLine struct { + // Charges Charges applied to this line. (like minimum spend) + // + // New charges can be added via the invoice's charges API, to facilitate + // charges that are affecting multiple lines. + Charges *[]BillingLineCharge `json:"charges,omitempty"` + + // Children The lines detailing the item or service sold. + Children *[]InvoiceLine `json:"children,omitempty"` + + // CreatedAt Timestamp of when the resource was created. + CreatedAt *time.Time `json:"createdAt,omitempty"` + + // Currency The currency of this line. + Currency CurrencyCode `json:"currency"` + + // DeletedAt Timestamp of when the resource was permanently deleted. + DeletedAt *time.Time `json:"deletedAt,omitempty"` + + // Description Optional description of the resource. Maximum 1024 characters. + Description *string `json:"description,omitempty"` + + // Discounts Discounts detailes applied to this line. + // + // New discounts can be added via the invoice's discounts API, to facilitate + // discounts that are affecting multiple lines. + Discounts *[]InvoiceLineDiscount `json:"discounts,omitempty"` + + // FeatureKey The feature that the usage is based on. + FeatureKey string `json:"featureKey"` + + // Id ULID (Universally Unique Lexicographically Sortable Identifier). + Id string `json:"id"` + + // Invoice The invoice this item belongs to. + Invoice *InvoiceReference `json:"invoice,omitempty"` + + // InvoiceAt The time this line item should be invoiced. + InvoiceAt time.Time `json:"invoiceAt"` + + // Metadata Additional metadata for the resource. + Metadata *Metadata `json:"metadata"` + + // Name Human-readable name for the resource. Between 1 and 256 characters. + Name string `json:"name"` + + // Period Period of the line item applies to for revenue recognition pruposes. + // + // Billing always treats periods as start being inclusive and end being exclusive. + Period Period `json:"period"` + + // PreLinePeriodQuantity The quantity of the item used in before this line's period. + // + // It is non-zero in case of progressive billing, when this shows how much of the usage was already billed. + PreLinePeriodQuantity *Numeric `json:"preLinePeriodQuantity,omitempty"` + + // Price The price of the usage based rate card. + Price RateCardUsageBasedPrice `json:"price"` + + // Quantity The quantity of the item being sold. + Quantity *Numeric `json:"quantity,omitempty"` + + // Status Status of the line. + // + // External calls always create valid lines, other line types are managed by the + // billing engine of OpenMeter. + Status *InvoiceLineStatus `json:"status,omitempty"` + + // TaxConfig Tax config specify the tax configuration for this line. + TaxConfig *TaxConfig `json:"taxConfig,omitempty"` + + // Taxes Taxes applied to the invoice totals. + Taxes *[]InvoiceLineTaxItem `json:"taxes,omitempty"` + + // Totals Totals for this line. + Totals *InvoiceTotals `json:"totals,omitempty"` + Type InvoiceUsageBasedLineType `json:"type"` + + // UpdatedAt Timestamp of when the resource was last updated. + UpdatedAt *time.Time `json:"updatedAt,omitempty"` +} + +// InvoiceUsageBasedLineType defines model for InvoiceUsageBasedLine.Type. +type InvoiceUsageBasedLineType string + +// InvoiceUsageBasedLineCreate Resource create operation model. +type InvoiceUsageBasedLineCreate struct { + // Currency The currency of this line. + Currency CurrencyCode `json:"currency"` + + // Description Optional description of the resource. Maximum 1024 characters. + Description *string `json:"description,omitempty"` + + // FeatureKey The feature that the usage is based on. + FeatureKey string `json:"featureKey"` + + // Invoice The invoice this item belongs to. + Invoice *InvoiceReference `json:"invoice,omitempty"` + + // InvoiceAt The time this line item should be invoiced. + InvoiceAt time.Time `json:"invoiceAt"` + + // Metadata Additional metadata for the resource. + Metadata *Metadata `json:"metadata"` + + // Name Human-readable name for the resource. Between 1 and 256 characters. + Name string `json:"name"` + + // Period Period of the line item applies to for revenue recognition pruposes. + // + // Billing always treats periods as start being inclusive and end being exclusive. + Period Period `json:"period"` + + // Price The price of the usage based rate card. + Price RateCardUsageBasedPrice `json:"price"` + + // TaxConfig Tax config specify the tax configuration for this line. + TaxConfig *TaxConfig `json:"taxConfig,omitempty"` + Type InvoiceUsageBasedLineCreateType `json:"type"` +} + +// InvoiceUsageBasedLineCreateType defines model for InvoiceUsageBasedLineCreate.Type. +type InvoiceUsageBasedLineCreateType string + +// InvoiceUsageBasedLineReplaceUpdate Resource update operation model. +type InvoiceUsageBasedLineReplaceUpdate struct { + // Description Optional description of the resource. Maximum 1024 characters. + Description *string `json:"description,omitempty"` + + // InvoiceAt The time this line item should be invoiced. + InvoiceAt time.Time `json:"invoiceAt"` + + // Metadata Additional metadata for the resource. + Metadata *Metadata `json:"metadata"` + + // Name Human-readable name for the resource. Between 1 and 256 characters. + Name string `json:"name"` + + // Period Period of the line item applies to for revenue recognition pruposes. + // + // Billing always treats periods as start being inclusive and end being exclusive. + Period Period `json:"period"` + + // Price The price of the usage based rate card. + Price RateCardUsageBasedPrice `json:"price"` + + // TaxConfig Tax config specify the tax configuration for this line. + TaxConfig *TaxConfig `json:"taxConfig,omitempty"` + Type InvoiceUsageBasedLineReplaceUpdateType `json:"type"` +} + +// InvoiceUsageBasedLineReplaceUpdateType defines model for InvoiceUsageBasedLineReplaceUpdate.Type. +type InvoiceUsageBasedLineReplaceUpdateType string + +// InvoiceWorkflowSettings InvoiceWorkflowSettings represents the workflow settings used by the invoice. +// +// This is a clone of the billing profile's workflow settings at the time of invoice creation +// with customer overrides considered. +type InvoiceWorkflowSettings struct { + // Apps The apps that will be used to orchestrate the invoice's workflow. + Apps *BillingProfileAppsOrReference `json:"apps,omitempty"` + + // SourceBillingProfileID sourceBillingProfileID is the billing profile on which the workflow was based on. + // + // The profile is snapshotted on invoice creation, after which it can be altered independently + // of the profile itself. + SourceBillingProfileID *string `json:"sourceBillingProfileID,omitempty"` + + // Timezone Timezone of the invoice's date fields. + Timezone *string `json:"timezone,omitempty"` + + // Workflow The workflow details used by this invoice. + Workflow *BillingWorkflowSettings `json:"workflow,omitempty"` } // ListEntitlementsResult List entitlements result @@ -2840,23 +3017,79 @@ type Numeric = string // OAuth2AuthorizationCodeGrantErrorType OAuth2 authorization code grant error types. type OAuth2AuthorizationCodeGrantErrorType string -// Percentage Numeric representation of a percentage -type Percentage = string +// PaymentDueDate PaymentDueDate contains an amount that should be paid by the given date. +type PaymentDueDate struct { + // Amount How much needs to be paid by the date. + Amount *Numeric `json:"amount,omitempty"` -// Period A period with a start and end time. -type Period struct { - // From Period start time. - From time.Time `json:"from"` + // Currency If different from the parent document's base currency. + Currency *CurrencyCode `json:"currency,omitempty"` - // To Period end time. - To time.Time `json:"to"` + // DueAt When the payment is due. + DueAt *time.Time `json:"dueAt,omitempty"` + + // Notes Other details to take into account for the due date. + Notes *string `json:"notes,omitempty"` + + // Percent Percentage of the total that should be paid by the date. + Percent *Percentage `json:"percent,omitempty"` } -// PhasesOrderBy Order by options for plan phases. -type PhasesOrderBy string +// PaymentTermDueDate PaymentTermDueDate defines the terms for payment on a specific date. +type PaymentTermDueDate struct { + // Detail Text detail of the chosen payment terms. + Detail *string `json:"detail,omitempty"` -// Plan Plans provide a template for subscriptions. -type Plan struct { + // DueAt When the payment is due. + DueAt *[]PaymentDueDate `json:"dueAt,omitempty"` + + // Notes Description of the conditions for payment. + Notes *string `json:"notes,omitempty"` + + // Type Type of terms to be applied. + Type PaymentTermDueDateType `json:"type"` +} + +// PaymentTermDueDateType Type of terms to be applied. +type PaymentTermDueDateType string + +// PaymentTermInstant PaymentTermInstant defines the terms for payment on receipt of invoice. +type PaymentTermInstant struct { + // Detail Text detail of the chosen payment terms. + Detail *string `json:"detail,omitempty"` + + // Notes Description of the conditions for payment. + Notes *string `json:"notes,omitempty"` + + // Type Type of terms to be applied. + Type PaymentTermInstantType `json:"type"` +} + +// PaymentTermInstantType Type of terms to be applied. +type PaymentTermInstantType string + +// PaymentTerms PaymentTerms defines the terms for payment. +type PaymentTerms struct { + union json.RawMessage +} + +// Percentage Numeric representation of a percentage +type Percentage = string + +// Period A period with a start and end time. +type Period struct { + // From Period start time. + From time.Time `json:"from"` + + // To Period end time. + To time.Time `json:"to"` +} + +// PhasesOrderBy Order by options for plan phases. +type PhasesOrderBy string + +// Plan Plans provide a template for subscriptions. +type Plan struct { // CreatedAt Timestamp of when the resource was created. CreatedAt *time.Time `json:"createdAt,omitempty"` @@ -3039,6 +3272,15 @@ type PlanReference struct { Version int `json:"version"` } +// PlanReferenceInput References an exact plan defaulting to the current active version. +type PlanReferenceInput struct { + // Key The plan key. + Key string `json:"key"` + + // Version The plan version. + Version *int `json:"version,omitempty"` +} + // PlanReplaceUpdate Resource update operation model. type PlanReplaceUpdate struct { // Description Optional description of the resource. Maximum 1024 characters. @@ -3061,29 +3303,16 @@ type PlanStatus string // PlanSubscriptionChange Change subscription based on plan. type PlanSubscriptionChange struct { // ActiveFrom [RFC3339](https://tools.ietf.org/html/rfc3339) formatted date-time string in UTC. - ActiveFrom time.Time `json:"activeFrom"` - - // Currency Three-letter [ISO4217](https://www.iso.org/iso-4217-currency-codes.html) currency code. - // Custom three-letter currency codes are also supported for convenience. - Currency CurrencyCode `json:"currency"` + ActiveFrom time.Time `json:"activeFrom"` + Description *string `json:"description,omitempty"` - // Customizations Batch processing commands for customizing the susbcription. - // The key format is `/phases/{phaseKey}/items/{itemKey}`. - // - // Add operations insert a new member based on the creation input without altering the existing members. - // - // Remove operations remove the member from the document. - Customizations []PlanSubscriptionChange_Customizations_Item `json:"customizations"` - Plan struct { - // Key A key is a unique string that is used to identify a resource. - Key string `json:"key"` - Version int `json:"version"` - } `json:"plan"` -} + // Metadata Set of key-value pairs. + // Metadata can be used to store additional information about a resource. + Metadata *Metadata `json:"metadata,omitempty"` + Name string `json:"name"` -// PlanSubscriptionChange_Customizations_Item defines model for PlanSubscriptionChange.customizations.Item. -type PlanSubscriptionChange_Customizations_Item struct { - union json.RawMessage + // Plan References an exact plan defaulting to the current active version. + Plan PlanReferenceInput `json:"plan"` } // PlanSubscriptionCreate Create subscription based on plan. @@ -3091,30 +3320,17 @@ type PlanSubscriptionCreate struct { // ActiveFrom [RFC3339](https://tools.ietf.org/html/rfc3339) formatted date-time string in UTC. ActiveFrom time.Time `json:"activeFrom"` - // Currency Three-letter [ISO4217](https://www.iso.org/iso-4217-currency-codes.html) currency code. - // Custom three-letter currency codes are also supported for convenience. - Currency CurrencyCode `json:"currency"` - // CustomerId ULID (Universally Unique Lexicographically Sortable Identifier). - CustomerId string `json:"customerId"` + CustomerId string `json:"customerId"` + Description *string `json:"description,omitempty"` - // Customizations Batch processing commands for customizing the susbcription. - // The key format is `/phases/{phaseKey}/items/{itemKey}`. - // - // Add operations insert a new member based on the creation input without altering the existing members. - // - // Remove operations remove the member from the document. - Customizations []PlanSubscriptionCreate_Customizations_Item `json:"customizations"` - Plan struct { - // Key A key is a unique string that is used to identify a resource. - Key string `json:"key"` - Version int `json:"version"` - } `json:"plan"` -} + // Metadata Set of key-value pairs. + // Metadata can be used to store additional information about a resource. + Metadata *Metadata `json:"metadata,omitempty"` + Name string `json:"name"` -// PlanSubscriptionCreate_Customizations_Item defines model for PlanSubscriptionCreate.customizations.Item. -type PlanSubscriptionCreate_Customizations_Item struct { - union json.RawMessage + // Plan References an exact plan defaulting to the current active version. + Plan PlanReferenceInput `json:"plan"` } // PortalToken A consumer portal token. @@ -3158,21 +3374,6 @@ type PriceTier struct { UpToAmount *float64 `json:"upToAmount"` } -// ProfilePaginatedResponse Paginated response -type ProfilePaginatedResponse struct { - // Items The items in the current page. - Items []BillingProfile `json:"items"` - - // Page The items in the current page. - Page int `json:"page"` - - // PageSize The items in the current page. - PageSize int `json:"pageSize"` - - // TotalCount The items in the current page. - TotalCount int `json:"totalCount"` -} - // RateCard A rate card defines the pricing and entitlement of a feature or service. type RateCard struct { union json.RawMessage @@ -3234,43 +3435,6 @@ type RateCardFlatFee struct { // RateCardFlatFeeType The type of the RateCard. type RateCardFlatFeeType string -// RateCardFlatFeeUpdateItem A flat fee rate card defines a one-time purchase or a recurring fee. -type RateCardFlatFeeUpdateItem struct { - // BillingCadence The billing cadence of the rate card. - // When null it means it is a one time fee. - BillingCadence *string `json:"billingCadence"` - - // Description Optional description of the resource. Maximum 1024 characters. - Description *string `json:"description,omitempty"` - - // EntitlementTemplate Entitlement templates are used to define the entitlements of a plan. - // Features are omitted from the entitlement template, as they are defined in the rate card. - EntitlementTemplate *RateCardEntitlement `json:"entitlementTemplate,omitempty"` - - // FeatureKey The feature the customer is entitled to use. - FeatureKey *string `json:"featureKey,omitempty"` - - // Metadata Additional metadata for the resource. - Metadata *Metadata `json:"metadata"` - - // Name Human-readable name for the resource. Between 1 and 256 characters. - Name string `json:"name"` - - // Price The price of the rate card. - // When null, the feature or service is free. - Price *FlatPriceWithPaymentTerm `json:"price"` - - // TaxConfig The tax config of the rate card. - // When undefined, the tax config of the feature or the default tax config of the plan is used. - TaxConfig *TaxConfig `json:"taxConfig,omitempty"` - - // Type The type of the RateCard. - Type RateCardFlatFeeUpdateItemType `json:"type"` -} - -// RateCardFlatFeeUpdateItemType The type of the RateCard. -type RateCardFlatFeeUpdateItemType string - // RateCardMeteredEntitlement The entitlement template with a metered entitlement. type RateCardMeteredEntitlement struct { // IsSoftLimit If softLimit=true the subject can use the feature even if the entitlement is exhausted, hasAccess will always be true. @@ -3313,11 +3477,6 @@ type RateCardStaticEntitlement struct { // RateCardStaticEntitlementType defines model for RateCardStaticEntitlement.Type. type RateCardStaticEntitlementType string -// RateCardUpdateItem A rate card defines the pricing and entitlement of a feature or service. -type RateCardUpdateItem struct { - union json.RawMessage -} - // RateCardUsageBased A usage-based rate card defines a price based on usage. type RateCardUsageBased struct { // BillingCadence The billing cadence of the rate card. @@ -3359,39 +3518,6 @@ type RateCardUsageBasedPrice struct { union json.RawMessage } -// RateCardUsageBasedUpdateItem A usage-based rate card defines a price based on usage. -type RateCardUsageBasedUpdateItem struct { - // BillingCadence The billing cadence of the rate card. - BillingCadence string `json:"billingCadence"` - - // Description Optional description of the resource. Maximum 1024 characters. - Description *string `json:"description,omitempty"` - - // EntitlementTemplate Entitlement templates are used to define the entitlements of a plan. - // Features are omitted from the entitlement template, as they are defined in the rate card. - EntitlementTemplate *RateCardEntitlement `json:"entitlementTemplate,omitempty"` - - // FeatureKey The feature the customer is entitled to use. - FeatureKey *string `json:"featureKey,omitempty"` - - // Metadata Additional metadata for the resource. - Metadata *Metadata `json:"metadata"` - - // Name Human-readable name for the resource. Between 1 and 256 characters. - Name string `json:"name"` - Price *RateCardUsageBasedPrice `json:"price"` - - // TaxConfig The tax config of the rate card. - // When undefined, the tax config of the feature or the default tax config of the plan is used. - TaxConfig *TaxConfig `json:"taxConfig,omitempty"` - - // Type The type of the RateCard. - Type RateCardUsageBasedUpdateItemType `json:"type"` -} - -// RateCardUsageBasedUpdateItemType The type of the RateCard. -type RateCardUsageBasedUpdateItemType string - // RecurringPeriod Recurring period with an interval and an anchor. type RecurringPeriod struct { // Anchor A date-time anchor to base the recurring period on. @@ -3666,7 +3792,10 @@ type SubjectUpsert struct { // Subscription Subscription is an exact subscription instance. type Subscription struct { - // ActiveTo If the subscription is canceled or otherwise have to end activeTo denotes the end date. + // ActiveFrom The cadence start of the resource. + ActiveFrom time.Time `json:"activeFrom"` + + // ActiveTo The cadence end of the resource. ActiveTo *time.Time `json:"activeTo,omitempty"` // CreatedAt Timestamp of when the resource was created. @@ -3711,89 +3840,24 @@ type SubscriptionCreate struct { union json.RawMessage } -// SubscriptionEditAdd Subscription item add operation. -type SubscriptionEditAdd struct { - Op SubscriptionEditAddOp `json:"op"` - Path string `json:"path"` - - // Value Subscription phase create input. - Value SubscriptionPhaseCreate `json:"value"` -} - -// SubscriptionEditAddOp defines model for SubscriptionEditAdd.Op. -type SubscriptionEditAddOp string - -// SubscriptionEditAddItem Subscription item add operation. -type SubscriptionEditAddItem struct { - Op SubscriptionEditAddItemOp `json:"op"` - Path string `json:"path"` - - // Value A rate card defines the pricing and entitlement of a feature or service. - Value RateCard `json:"value"` -} - -// SubscriptionEditAddItemOp defines model for SubscriptionEditAddItem.Op. -type SubscriptionEditAddItemOp string - -// SubscriptionEditAddUpdateItem Subscription item add operation. -type SubscriptionEditAddUpdateItem struct { - Op SubscriptionEditAddUpdateItemOp `json:"op"` - Path string `json:"path"` - - // Value A rate card defines the pricing and entitlement of a feature or service. - Value RateCardUpdateItem `json:"value"` -} - -// SubscriptionEditAddUpdateItemOp defines model for SubscriptionEditAddUpdateItem.Op. -type SubscriptionEditAddUpdateItemOp string - -// SubscriptionEditRemoveItem Subscription phase remove operation. -type SubscriptionEditRemoveItem struct { - Op SubscriptionEditRemoveItemOp `json:"op"` - Path string `json:"path"` -} - -// SubscriptionEditRemoveItemOp defines model for SubscriptionEditRemoveItem.Op. -type SubscriptionEditRemoveItemOp string - -// SubscriptionEditRemoveUpdateItem Subscription phase remove operation. -type SubscriptionEditRemoveUpdateItem struct { - Op SubscriptionEditRemoveUpdateItemOp `json:"op"` - Path string `json:"path"` -} - -// SubscriptionEditRemoveUpdateItemOp defines model for SubscriptionEditRemoveUpdateItem.Op. -type SubscriptionEditRemoveUpdateItemOp string - -// SubscriptionEditRemoveWithValue Subscription item remove operation with a value. -type SubscriptionEditRemoveWithValue struct { - Op SubscriptionEditRemoveWithValueOp `json:"op"` - Path string `json:"path"` - Value struct { - // Shift The direction of the phase shift when a phase is removed. - Shift RemovePhaseShifting `json:"shift"` - } `json:"value"` +// SubscriptionEdit Subscription edit input. +type SubscriptionEdit struct { + // Customizations Batch processing commands for manipulating running subscriptions. + // The key format is `/phases/{phaseKey}` or `/phases/{phaseKey}/items/{itemKey}`. + Customizations []SubscriptionEditOperation `json:"customizations"` } -// SubscriptionEditRemoveWithValueOp defines model for SubscriptionEditRemoveWithValue.Op. -type SubscriptionEditRemoveWithValueOp string - -// SubscriptionEditStretch Subscription phase stretch operation. -type SubscriptionEditStretch struct { - Op SubscriptionEditStretchOp `json:"op"` - Path string `json:"path"` - Value struct { - // ExtendBy The signed duration to extend or shrink the phase by. - ExtendBy string `json:"extendBy"` - } `json:"value"` +// SubscriptionEditOperation defines model for SubscriptionEditOperation. +type SubscriptionEditOperation struct { + union json.RawMessage } -// SubscriptionEditStretchOp defines model for SubscriptionEditStretch.Op. -type SubscriptionEditStretchOp string - // SubscriptionExpanded Expanded subscription type SubscriptionExpanded struct { - // ActiveTo If the subscription is canceled or otherwise have to end activeTo denotes the end date. + // ActiveFrom The cadence start of the resource. + ActiveFrom time.Time `json:"activeFrom"` + + // ActiveTo The cadence end of the resource. ActiveTo *time.Time `json:"activeTo,omitempty"` // CreatedAt Timestamp of when the resource was created. @@ -3831,6 +3895,12 @@ type SubscriptionExpanded struct { // SubscriptionItem The actual contents of the Subscription, what the user gets, what they pay, etc... type SubscriptionItem struct { + // ActiveFrom The cadence start of the resource. + ActiveFrom time.Time `json:"activeFrom"` + + // ActiveTo The cadence end of the resource. + ActiveTo *time.Time `json:"activeTo,omitempty"` + // BillingCandence The billing cadence of the rate card. // When null, the rate card is a one-time purchase. BillingCandence *string `json:"billingCandence"` @@ -3848,14 +3918,7 @@ type SubscriptionItem struct { Id *string `json:"id,omitempty"` // Included Describes what access is gained via the SubscriptionItem - Included *struct { - // Entitlement Entitlement templates are used to define the entitlements of a plan. - // Features are omitted from the entitlement template, as they are defined in the rate card. - Entitlement *Entitlement `json:"entitlement,omitempty"` - - // Feature The feature the customer is entitled to use. - Feature Feature `json:"feature"` - } `json:"included,omitempty"` + Included *SubscriptionItemIncluded `json:"included,omitempty"` // Key The identifier of the RateCard. // SubscriptionItem/RateCard can be identified, it has a reference: @@ -3896,22 +3959,39 @@ type SubscriptionItemPrice1 = UnitPriceWithCommitments // SubscriptionItemPrice2 Tiered price with spend commitments. type SubscriptionItemPrice2 = TieredPriceWithCommitments -// SubscriptionItemPrice3 Flat price with payment term. -type SubscriptionItemPrice3 = FlatPriceWithPaymentTerm - // SubscriptionItem_Price The price of the rate card. // When null, the feature or service is free. type SubscriptionItem_Price struct { union json.RawMessage } +// SubscriptionItemIncluded Included contents like Entitlement, or the Feature. +type SubscriptionItemIncluded struct { + // Entitlement Entitlement templates are used to define the entitlements of a plan. + // Features are omitted from the entitlement template, as they are defined in the rate card. + Entitlement *Entitlement `json:"entitlement,omitempty"` + + // Feature The feature the customer is entitled to use. + Feature Feature `json:"feature"` +} + // SubscriptionPhaseCreate Subscription phase create input. type SubscriptionPhaseCreate struct { + // Description The description of the phase. + Description *string `json:"description,omitempty"` + // Discounts The discounts on the plan. - Discounts *[]DiscountUpdateItem `json:"discounts,omitempty"` + Discounts *[]Discount `json:"discounts,omitempty"` // Duration The intended duration of the new phase. - Duration string `json:"duration"` + // Duration is required when the phase will not be the last phase. + Duration *string `json:"duration,omitempty"` + + // Key A locally unique identifier for the phase. + Key string `json:"key"` + + // Name The name of the phase. + Name string `json:"name"` // StartAfter Interval after the subscription starts to transition to the phase. // When null, the phase starts immediately after the subscription starts. @@ -3923,6 +4003,9 @@ type SubscriptionPhaseExpanded struct { // ActiveFrom The time from which the phase is active. ActiveFrom time.Time `json:"activeFrom"` + // ActiveTo The until which the Phase is active. + ActiveTo *time.Time `json:"activeTo,omitempty"` + // CreatedAt Timestamp of when the resource was created. CreatedAt *time.Time `json:"createdAt,omitempty"` @@ -3935,9 +4018,6 @@ type SubscriptionPhaseExpanded struct { // Discounts The discounts on the plan. Discounts *[]Discount `json:"discounts,omitempty"` - // Duration The intended duration of the new phase. - Duration string `json:"duration"` - // Id A unique identifier for the resource. Id *string `json:"id,omitempty"` Items []SubscriptionItem `json:"items"` @@ -4032,6 +4112,129 @@ type UnitPriceWithCommitments struct { // UnitPriceWithCommitmentsType defines model for UnitPriceWithCommitments.Type. type UnitPriceWithCommitmentsType string +// ValidationIssue ValidationIssue captures any validation issues related to the invoice. +// +// Issues with severity "critical" will prevent the invoice from being issued. +type ValidationIssue struct { + // Code Machine indentifiable code for the issue, if available. + Code *string `json:"code,omitempty"` + + // Component Component reporting the issue. + Component *string `json:"component,omitempty"` + + // CreatedAt Timestamp of when the resource was created. + CreatedAt *time.Time `json:"createdAt,omitempty"` + + // DeletedAt Timestamp of when the resource was permanently deleted. + DeletedAt *time.Time `json:"deletedAt,omitempty"` + + // Field The field that the issue is related to, if available in JSON path format. + Field *string `json:"field,omitempty"` + + // Id ID of the charge or discount. + Id *string `json:"id,omitempty"` + + // Message A human-readable description of the issue. + Message *string `json:"message,omitempty"` + + // Metadata Additional context for the issue. + Metadata *Metadata `json:"metadata,omitempty"` + + // Severity The severity of the issue. + Severity *ValidationIssueSeverity `json:"severity,omitempty"` + + // UpdatedAt Timestamp of when the resource was last updated. + UpdatedAt *time.Time `json:"updatedAt,omitempty"` +} + +// ValidationIssueSeverity ValidationIssueSeverity describes the severity of a validation issue. +// +// Issues with severity "critical" will prevent the invoice from being issued. +type ValidationIssueSeverity string + +// VoidInvoiceActionCreate InvoiceVoidAction describes how to handle the voided line items. +type VoidInvoiceActionCreate struct { + // Action VoidInvoiceLineAction describes how to handle a specific line item in the invoice when voiding. + Action VoidInvoiceLineActionCreate `json:"action"` + + // Percentage How much of the total line items to be voided? (e.g. 100% means all charges are voided) + Percentage Percentage `json:"percentage"` +} + +// VoidInvoiceActionCreateItem InvoiceVoidAction describes how to handle the voided line items. +type VoidInvoiceActionCreateItem struct { + // Action VoidInvoiceLineAction describes how to handle a specific line item in the invoice when voiding. + Action VoidInvoiceLineActionCreateItem `json:"action"` + + // Percentage How much of the total line items to be voided? (e.g. 100% means all charges are voided) + Percentage Percentage `json:"percentage"` +} + +// VoidInvoiceActionInput Request to void an invoice +type VoidInvoiceActionInput struct { + // Action The action to take on the voided line items. + Action VoidInvoiceActionCreate `json:"action"` + + // Overrides Per line item overrides for the action. + // + // If not specified, the `action` will be applied to all line items. + Overrides *[]VoidInvoiceActionLineOverride `json:"overrides"` + + // Reason The reason for voiding the invoice. + Reason string `json:"reason"` +} + +// VoidInvoiceActionLineOverride VoidInvoiceLineOverride describes how to handle a specific line item in the invoice when voiding. +type VoidInvoiceActionLineOverride struct { + // Action The action to take on the line item. + Action VoidInvoiceActionCreateItem `json:"action"` + + // LineId The line item ID to override. + LineId string `json:"lineId"` +} + +// VoidInvoiceLineActionCreate VoidInvoiceLineAction describes how to handle a specific line item in the invoice when voiding. +type VoidInvoiceLineActionCreate struct { + union json.RawMessage +} + +// VoidInvoiceLineActionCreateItem VoidInvoiceLineAction describes how to handle a specific line item in the invoice when voiding. +type VoidInvoiceLineActionCreateItem struct { + union json.RawMessage +} + +// VoidInvoiceLineDiscardAction VoidInvoiceLineDiscardAction describes how to handle the voidied line item in the invoice. +type VoidInvoiceLineDiscardAction struct { + Type VoidInvoiceLineDiscardActionType `json:"type"` +} + +// VoidInvoiceLineDiscardActionType defines model for VoidInvoiceLineDiscardAction.Type. +type VoidInvoiceLineDiscardActionType string + +// VoidInvoiceLinePendingActionCreate VoidInvoiceLinePendingAction describes how to handle the voidied line item in the invoice. +type VoidInvoiceLinePendingActionCreate struct { + // NextInvoiceAt The time at which the line item should be invoiced again. + // + // If not provided, the line item will be re-invoiced now. + NextInvoiceAt *time.Time `json:"nextInvoiceAt,omitempty"` + Type VoidInvoiceLinePendingActionCreateType `json:"type"` +} + +// VoidInvoiceLinePendingActionCreateType defines model for VoidInvoiceLinePendingActionCreate.Type. +type VoidInvoiceLinePendingActionCreateType string + +// VoidInvoiceLinePendingActionCreateItem VoidInvoiceLinePendingAction describes how to handle the voidied line item in the invoice. +type VoidInvoiceLinePendingActionCreateItem struct { + // NextInvoiceAt The time at which the line item should be invoiced again. + // + // If not provided, the line item will be re-invoiced now. + NextInvoiceAt *time.Time `json:"nextInvoiceAt,omitempty"` + Type VoidInvoiceLinePendingActionCreateItemType `json:"type"` +} + +// VoidInvoiceLinePendingActionCreateItemType defines model for VoidInvoiceLinePendingActionCreateItem.Type. +type VoidInvoiceLinePendingActionCreateItemType string + // WindowSize Aggregation window size. type WindowSize = models.WindowSize @@ -4047,20 +4250,17 @@ type WindowedBalanceHistory struct { WindowedHistory []BalanceHistoryWindow `json:"windowedHistory"` } -// BillingInvoiceListParamsExpand defines model for BillingInvoiceListParams.expand. -type BillingInvoiceListParamsExpand = []BillingInvoiceExpand - -// BillingInvoiceListParamsExtendedStatuses defines model for BillingInvoiceListParams.extendedStatuses. -type BillingInvoiceListParamsExtendedStatuses = []BillingInvoiceExtendedStatus +// BillingProfileCustomerOverrideOrderByOrderingOrder The order direction. +type BillingProfileCustomerOverrideOrderByOrderingOrder = SortOrder -// BillingInvoiceListParamsIssuedAfter defines model for BillingInvoiceListParams.issuedAfter. -type BillingInvoiceListParamsIssuedAfter = time.Time +// BillingProfileCustomerOverrideOrderByOrderingOrderBy Order by options for customers. +type BillingProfileCustomerOverrideOrderByOrderingOrderBy = BillingProfileCustomerOverrideOrderBy -// BillingInvoiceListParamsIssuedBefore defines model for BillingInvoiceListParams.issuedBefore. -type BillingInvoiceListParamsIssuedBefore = time.Time +// BillingProfileOrderByOrderingOrder The order direction. +type BillingProfileOrderByOrderingOrder = SortOrder -// BillingInvoiceListParamsStatuses defines model for BillingInvoiceListParams.statuses. -type BillingInvoiceListParamsStatuses = []BillingInvoiceStatus +// BillingProfileOrderByOrderingOrderBy BillingProfileOrderBy specifies the ordering options for profiles +type BillingProfileOrderByOrderingOrderBy = BillingProfileOrderBy // CustomerOrderByOrderingOrder The order direction. type CustomerOrderByOrderingOrder = SortOrder @@ -4068,12 +4268,6 @@ type CustomerOrderByOrderingOrder = SortOrder // CustomerOrderByOrderingOrderBy Order by options for customers. type CustomerOrderByOrderingOrderBy = CustomerOrderBy -// CustomerOverrideOrderByOrderingOrder The order direction. -type CustomerOverrideOrderByOrderingOrder = SortOrder - -// CustomerOverrideOrderByOrderingOrderBy Order by options for customers. -type CustomerOverrideOrderByOrderingOrderBy = BillingCustomerOverrideOrderBy - // EntitlementOrderByOrderingOrder The order direction. type EntitlementOrderByOrderingOrder = SortOrder @@ -4092,11 +4286,26 @@ type GrantOrderByOrderingOrder = SortOrder // GrantOrderByOrderingOrderBy Order by options for grants. type GrantOrderByOrderingOrderBy = GrantOrderBy +// InvoiceListParamsExpand defines model for InvoiceListParams.expand. +type InvoiceListParamsExpand = []InvoiceExpand + +// InvoiceListParamsExtendedStatuses defines model for InvoiceListParams.extendedStatuses. +type InvoiceListParamsExtendedStatuses = []string + +// InvoiceListParamsIssuedAfter defines model for InvoiceListParams.issuedAfter. +type InvoiceListParamsIssuedAfter = time.Time + +// InvoiceListParamsIssuedBefore defines model for InvoiceListParams.issuedBefore. +type InvoiceListParamsIssuedBefore = time.Time + +// InvoiceListParamsStatuses defines model for InvoiceListParams.statuses. +type InvoiceListParamsStatuses = []InvoiceStatus + // InvoiceOrderByOrderingOrder The order direction. type InvoiceOrderByOrderingOrder = SortOrder // InvoiceOrderByOrderingOrderBy InvoiceOrderBy specifies the ordering options for invoice listing. -type InvoiceOrderByOrderingOrderBy = BillingInvoiceOrderBy +type InvoiceOrderByOrderingOrderBy = InvoiceOrderBy // LimitOffsetLimit defines model for LimitOffset.limit. type LimitOffsetLimit = int @@ -4188,12 +4397,6 @@ type PlanOrderByOrderingOrder = SortOrder // PlanOrderByOrderingOrderBy Order by options for plans. type PlanOrderByOrderingOrderBy = PlanOrderBy -// ProfileOrderByOrderingOrder The order direction. -type ProfileOrderByOrderingOrder = SortOrder - -// ProfileOrderByOrderingOrderBy ProfileOrderBy specifies the ordering options for profiles -type ProfileOrderByOrderingOrderBy = BillingProfileOrderBy - // QueryCustomerListIncludeDeleted defines model for queryCustomerList.includeDeleted. type QueryCustomerListIncludeDeleted = bool @@ -4218,8 +4421,8 @@ type ListAppsParams struct { PageSize *PaginatedQueryPageSize `form:"pageSize,omitempty" json:"pageSize,omitempty"` } -// BillingListCustomerOverridesParams defines parameters for BillingListCustomerOverrides. -type BillingListCustomerOverridesParams struct { +// ListBillingProfileCustomerOverridesParams defines parameters for ListBillingProfileCustomerOverrides. +type ListBillingProfileCustomerOverridesParams struct { BillingProfile *[]string `form:"billingProfile,omitempty" json:"billingProfile,omitempty"` // Page Start date-time in RFC 3339 format. @@ -4243,20 +4446,30 @@ type BillingListCustomerOverridesParams struct { Limit *LimitOffsetLimit `form:"limit,omitempty" json:"limit,omitempty"` // Order The order direction. - Order *CustomerOverrideOrderByOrderingOrder `form:"order,omitempty" json:"order,omitempty"` + Order *BillingProfileCustomerOverrideOrderByOrderingOrder `form:"order,omitempty" json:"order,omitempty"` // OrderBy The order by field. - OrderBy *CustomerOverrideOrderByOrderingOrderBy `form:"orderBy,omitempty" json:"orderBy,omitempty"` + OrderBy *BillingProfileCustomerOverrideOrderByOrderingOrderBy `form:"orderBy,omitempty" json:"orderBy,omitempty"` } -// BillingListInvoicesParams defines parameters for BillingListInvoices. -type BillingListInvoicesParams struct { - Customers *[]string `form:"customers,omitempty" json:"customers,omitempty"` - Statuses *BillingInvoiceListParamsStatuses `form:"statuses,omitempty" json:"statuses,omitempty"` - ExtendedStatuses *BillingInvoiceListParamsExtendedStatuses `form:"extendedStatuses,omitempty" json:"extendedStatuses,omitempty"` - IssuedAfter *BillingInvoiceListParamsIssuedAfter `form:"issuedAfter,omitempty" json:"issuedAfter,omitempty"` - IssuedBefore *BillingInvoiceListParamsIssuedBefore `form:"issuedBefore,omitempty" json:"issuedBefore,omitempty"` - Expand *BillingInvoiceListParamsExpand `form:"expand,omitempty" json:"expand,omitempty"` +// ListInvoicesParams defines parameters for ListInvoices. +type ListInvoicesParams struct { + Customers *[]string `form:"customers,omitempty" json:"customers,omitempty"` + + // Statuses Filter by the invoice status. + Statuses *InvoiceListParamsStatuses `form:"statuses,omitempty" json:"statuses,omitempty"` + + // ExtendedStatuses Filter by invoice extended statuses + ExtendedStatuses *InvoiceListParamsExtendedStatuses `form:"extendedStatuses,omitempty" json:"extendedStatuses,omitempty"` + + // IssuedAfter Filter by invoice creation time + IssuedAfter *InvoiceListParamsIssuedAfter `form:"issuedAfter,omitempty" json:"issuedAfter,omitempty"` + + // IssuedBefore Filter by invoice creation time + IssuedBefore *InvoiceListParamsIssuedBefore `form:"issuedBefore,omitempty" json:"issuedBefore,omitempty"` + + // Expand What parts of the list output to expand in listings + Expand *InvoiceListParamsExpand `form:"expand,omitempty" json:"expand,omitempty"` // Page Start date-time in RFC 3339 format. // @@ -4285,13 +4498,22 @@ type BillingListInvoicesParams struct { OrderBy *InvoiceOrderByOrderingOrderBy `form:"orderBy,omitempty" json:"orderBy,omitempty"` } -// BillingListInvoicesByCustomerParams defines parameters for BillingListInvoicesByCustomer. -type BillingListInvoicesByCustomerParams struct { - Statuses *BillingInvoiceListParamsStatuses `form:"statuses,omitempty" json:"statuses,omitempty"` - ExtendedStatuses *BillingInvoiceListParamsExtendedStatuses `form:"extendedStatuses,omitempty" json:"extendedStatuses,omitempty"` - IssuedAfter *BillingInvoiceListParamsIssuedAfter `form:"issuedAfter,omitempty" json:"issuedAfter,omitempty"` - IssuedBefore *BillingInvoiceListParamsIssuedBefore `form:"issuedBefore,omitempty" json:"issuedBefore,omitempty"` - Expand *BillingInvoiceListParamsExpand `form:"expand,omitempty" json:"expand,omitempty"` +// ListInvoicesByCustomerParams defines parameters for ListInvoicesByCustomer. +type ListInvoicesByCustomerParams struct { + // Statuses Filter by the invoice status. + Statuses *InvoiceListParamsStatuses `form:"statuses,omitempty" json:"statuses,omitempty"` + + // ExtendedStatuses Filter by invoice extended statuses + ExtendedStatuses *InvoiceListParamsExtendedStatuses `form:"extendedStatuses,omitempty" json:"extendedStatuses,omitempty"` + + // IssuedAfter Filter by invoice creation time + IssuedAfter *InvoiceListParamsIssuedAfter `form:"issuedAfter,omitempty" json:"issuedAfter,omitempty"` + + // IssuedBefore Filter by invoice creation time + IssuedBefore *InvoiceListParamsIssuedBefore `form:"issuedBefore,omitempty" json:"issuedBefore,omitempty"` + + // Expand What parts of the list output to expand in listings + Expand *InvoiceListParamsExpand `form:"expand,omitempty" json:"expand,omitempty"` // Page Start date-time in RFC 3339 format. // @@ -4320,13 +4542,17 @@ type BillingListInvoicesByCustomerParams struct { OrderBy *InvoiceOrderByOrderingOrderBy `form:"orderBy,omitempty" json:"orderBy,omitempty"` } -// BillingGetInvoiceByCustomerInvoiceIdParams defines parameters for BillingGetInvoiceByCustomerInvoiceId. -type BillingGetInvoiceByCustomerInvoiceIdParams struct { - Expand []BillingInvoiceExpand `form:"expand" json:"expand"` +// GetInvoiceParams defines parameters for GetInvoice. +type GetInvoiceParams struct { + Expand []InvoiceExpand `form:"expand" json:"expand"` + IncludeDeletedLines bool `form:"includeDeletedLines" json:"includeDeletedLines"` } -// BillingListProfilesParams defines parameters for BillingListProfiles. -type BillingListProfilesParams struct { +// CreateInvoiceLineByCustomerJSONBody defines parameters for CreateInvoiceLineByCustomer. +type CreateInvoiceLineByCustomerJSONBody = []InvoiceLineCreate + +// ListBillingProfilesParams defines parameters for ListBillingProfiles. +type ListBillingProfilesParams struct { IncludeArchived *bool `form:"includeArchived,omitempty" json:"includeArchived,omitempty"` Expand *[]BillingProfileExpand `form:"expand,omitempty" json:"expand,omitempty"` @@ -4351,14 +4577,14 @@ type BillingListProfilesParams struct { Limit *LimitOffsetLimit `form:"limit,omitempty" json:"limit,omitempty"` // Order The order direction. - Order *ProfileOrderByOrderingOrder `form:"order,omitempty" json:"order,omitempty"` + Order *BillingProfileOrderByOrderingOrder `form:"order,omitempty" json:"order,omitempty"` // OrderBy The order by field. - OrderBy *ProfileOrderByOrderingOrderBy `form:"orderBy,omitempty" json:"orderBy,omitempty"` + OrderBy *BillingProfileOrderByOrderingOrderBy `form:"orderBy,omitempty" json:"orderBy,omitempty"` } -// BillingGetProfileParams defines parameters for BillingGetProfile. -type BillingGetProfileParams struct { +// GetBillingProfileParams defines parameters for GetBillingProfile. +type GetBillingProfileParams struct { Expand *[]BillingProfileExpand `form:"expand,omitempty" json:"expand,omitempty"` } @@ -4908,23 +5134,10 @@ type GetEntitlementHistoryParams struct { // GetSubscriptionParams defines parameters for GetSubscription. type GetSubscriptionParams struct { - Expand *GetSubscriptionParamsExpand `form:"expand,omitempty" json:"expand,omitempty"` - // At The time at which the subscription should be queried. If not provided the current time is used. At *time.Time `form:"at,omitempty" json:"at,omitempty"` } -// GetSubscriptionParamsExpand defines parameters for GetSubscription. -type GetSubscriptionParamsExpand bool - -// EditSubscriptionJSONBody defines parameters for EditSubscription. -type EditSubscriptionJSONBody = []EditSubscriptionJSONBody_Item - -// EditSubscriptionJSONBody_Item defines parameters for EditSubscription. -type EditSubscriptionJSONBody_Item struct { - union json.RawMessage -} - // CancelSubscriptionJSONBody defines parameters for CancelSubscription. type CancelSubscriptionJSONBody struct { // EffectiveDate If not provided the subscription is canceled immediately. @@ -4939,26 +5152,26 @@ type MigrateSubscriptionJSONBody struct { // AppStripeWebhookJSONRequestBody defines body for AppStripeWebhook for application/json ContentType. type AppStripeWebhookJSONRequestBody = StripeWebhookEvent -// BillingUpsertCustomerOverrideJSONRequestBody defines body for BillingUpsertCustomerOverride for application/json ContentType. -type BillingUpsertCustomerOverrideJSONRequestBody = BillingCustomerWorkflowOverride +// UpsertBillingProfileCustomerOverrideJSONRequestBody defines body for UpsertBillingProfileCustomerOverride for application/json ContentType. +type UpsertBillingProfileCustomerOverrideJSONRequestBody = BillingProfileCustomerOverrideCreate -// BillingCreateInvoiceJSONRequestBody defines body for BillingCreateInvoice for application/json ContentType. -type BillingCreateInvoiceJSONRequestBody = BillingInvoiceCreate +// InvoicePendingLinesActionJSONRequestBody defines body for InvoicePendingLinesAction for application/json ContentType. +type InvoicePendingLinesActionJSONRequestBody = InvoicePendingLinesActionInput -// BillingUpdateInvoiceLineJSONRequestBody defines body for BillingUpdateInvoiceLine for application/json ContentType. -type BillingUpdateInvoiceLineJSONRequestBody = BillingInvoiceLineCreate +// UpdateInvoiceLineJSONRequestBody defines body for UpdateInvoiceLine for application/json ContentType. +type UpdateInvoiceLineJSONRequestBody = InvoiceLineReplaceUpdate -// BillingVoidInvoiceJSONRequestBody defines body for BillingVoidInvoice for application/json ContentType. -type BillingVoidInvoiceJSONRequestBody = BillingVoidInvoiceInput +// VoidInvoiceActionJSONRequestBody defines body for VoidInvoiceAction for application/json ContentType. +type VoidInvoiceActionJSONRequestBody = VoidInvoiceActionInput -// BillingCreateLineByCustomerJSONRequestBody defines body for BillingCreateLineByCustomer for application/json ContentType. -type BillingCreateLineByCustomerJSONRequestBody = LinesUpdate +// CreateInvoiceLineByCustomerJSONRequestBody defines body for CreateInvoiceLineByCustomer for application/json ContentType. +type CreateInvoiceLineByCustomerJSONRequestBody = CreateInvoiceLineByCustomerJSONBody -// BillingCreateProfileJSONRequestBody defines body for BillingCreateProfile for application/json ContentType. -type BillingCreateProfileJSONRequestBody = BillingProfileCreateInput +// CreateBillingProfileJSONRequestBody defines body for CreateBillingProfile for application/json ContentType. +type CreateBillingProfileJSONRequestBody = BillingProfileCreate -// BillingUpdateProfileJSONRequestBody defines body for BillingUpdateProfile for application/json ContentType. -type BillingUpdateProfileJSONRequestBody = BillingProfile +// UpdateBillingProfileJSONRequestBody defines body for UpdateBillingProfile for application/json ContentType. +type UpdateBillingProfileJSONRequestBody = BillingProfileReplaceUpdateWithWorkflow // CreateCustomerJSONRequestBody defines body for CreateCustomer for application/json ContentType. type CreateCustomerJSONRequestBody = CustomerCreate @@ -5042,389 +5255,35 @@ type ResetEntitlementUsageJSONRequestBody = ResetEntitlementUsageInput type CreateSubscriptionJSONRequestBody = SubscriptionCreate // EditSubscriptionJSONRequestBody defines body for EditSubscription for application/json ContentType. -type EditSubscriptionJSONRequestBody = EditSubscriptionJSONBody +type EditSubscriptionJSONRequestBody = SubscriptionEdit // CancelSubscriptionJSONRequestBody defines body for CancelSubscription for application/json ContentType. type CancelSubscriptionJSONRequestBody CancelSubscriptionJSONBody // ChangeSubscriptionJSONRequestBody defines body for ChangeSubscription for application/json ContentType. -type ChangeSubscriptionJSONRequestBody = SubscriptionChange - -// MigrateSubscriptionJSONRequestBody defines body for MigrateSubscription for application/json ContentType. -type MigrateSubscriptionJSONRequestBody MigrateSubscriptionJSONBody - -// AsStripeApp returns the union data inside the App as a StripeApp -func (t App) AsStripeApp() (StripeApp, error) { - var body StripeApp - err := json.Unmarshal(t.union, &body) - return body, err -} - -// FromStripeApp overwrites any union data inside the App as the provided StripeApp -func (t *App) FromStripeApp(v StripeApp) error { - v.Type = "stripe" - b, err := json.Marshal(v) - t.union = b - return err -} - -// MergeStripeApp performs a merge with any union data inside the App, using the provided StripeApp -func (t *App) MergeStripeApp(v StripeApp) error { - v.Type = "stripe" - b, err := json.Marshal(v) - if err != nil { - return err - } - - merged, err := runtime.JSONMerge(t.union, b) - t.union = merged - return err -} - -// AsSandboxApp returns the union data inside the App as a SandboxApp -func (t App) AsSandboxApp() (SandboxApp, error) { - var body SandboxApp - err := json.Unmarshal(t.union, &body) - return body, err -} - -// FromSandboxApp overwrites any union data inside the App as the provided SandboxApp -func (t *App) FromSandboxApp(v SandboxApp) error { - v.Type = "sandbox" - b, err := json.Marshal(v) - t.union = b - return err -} - -// MergeSandboxApp performs a merge with any union data inside the App, using the provided SandboxApp -func (t *App) MergeSandboxApp(v SandboxApp) error { - v.Type = "sandbox" - b, err := json.Marshal(v) - if err != nil { - return err - } - - merged, err := runtime.JSONMerge(t.union, b) - t.union = merged - return err -} - -func (t App) Discriminator() (string, error) { - var discriminator struct { - Discriminator string `json:"type"` - } - err := json.Unmarshal(t.union, &discriminator) - return discriminator.Discriminator, err -} - -func (t App) ValueByDiscriminator() (interface{}, error) { - discriminator, err := t.Discriminator() - if err != nil { - return nil, err - } - switch discriminator { - case "sandbox": - return t.AsSandboxApp() - case "stripe": - return t.AsStripeApp() - default: - return nil, errors.New("unknown discriminator value: " + discriminator) - } -} - -func (t App) MarshalJSON() ([]byte, error) { - b, err := t.union.MarshalJSON() - return b, err -} - -func (t *App) UnmarshalJSON(b []byte) error { - err := t.union.UnmarshalJSON(b) - return err -} - -// AsBillingUsageBasedLine returns the union data inside the BillingInvoiceLine as a BillingUsageBasedLine -func (t BillingInvoiceLine) AsBillingUsageBasedLine() (BillingUsageBasedLine, error) { - var body BillingUsageBasedLine - err := json.Unmarshal(t.union, &body) - return body, err -} - -// FromBillingUsageBasedLine overwrites any union data inside the BillingInvoiceLine as the provided BillingUsageBasedLine -func (t *BillingInvoiceLine) FromBillingUsageBasedLine(v BillingUsageBasedLine) error { - v.Type = "usage_based" - b, err := json.Marshal(v) - t.union = b - return err -} - -// MergeBillingUsageBasedLine performs a merge with any union data inside the BillingInvoiceLine, using the provided BillingUsageBasedLine -func (t *BillingInvoiceLine) MergeBillingUsageBasedLine(v BillingUsageBasedLine) error { - v.Type = "usage_based" - b, err := json.Marshal(v) - if err != nil { - return err - } - - merged, err := runtime.JSONMerge(t.union, b) - t.union = merged - return err -} - -// AsBillingFlatFeeLine returns the union data inside the BillingInvoiceLine as a BillingFlatFeeLine -func (t BillingInvoiceLine) AsBillingFlatFeeLine() (BillingFlatFeeLine, error) { - var body BillingFlatFeeLine - err := json.Unmarshal(t.union, &body) - return body, err -} - -// FromBillingFlatFeeLine overwrites any union data inside the BillingInvoiceLine as the provided BillingFlatFeeLine -func (t *BillingInvoiceLine) FromBillingFlatFeeLine(v BillingFlatFeeLine) error { - v.Type = "flat_fee" - b, err := json.Marshal(v) - t.union = b - return err -} - -// MergeBillingFlatFeeLine performs a merge with any union data inside the BillingInvoiceLine, using the provided BillingFlatFeeLine -func (t *BillingInvoiceLine) MergeBillingFlatFeeLine(v BillingFlatFeeLine) error { - v.Type = "flat_fee" - b, err := json.Marshal(v) - if err != nil { - return err - } - - merged, err := runtime.JSONMerge(t.union, b) - t.union = merged - return err -} - -func (t BillingInvoiceLine) Discriminator() (string, error) { - var discriminator struct { - Discriminator string `json:"type"` - } - err := json.Unmarshal(t.union, &discriminator) - return discriminator.Discriminator, err -} - -func (t BillingInvoiceLine) ValueByDiscriminator() (interface{}, error) { - discriminator, err := t.Discriminator() - if err != nil { - return nil, err - } - switch discriminator { - case "flat_fee": - return t.AsBillingFlatFeeLine() - case "usage_based": - return t.AsBillingUsageBasedLine() - default: - return nil, errors.New("unknown discriminator value: " + discriminator) - } -} - -func (t BillingInvoiceLine) MarshalJSON() ([]byte, error) { - b, err := t.union.MarshalJSON() - return b, err -} - -func (t *BillingInvoiceLine) UnmarshalJSON(b []byte) error { - err := t.union.UnmarshalJSON(b) - return err -} - -// AsBillingUsageBasedLineCreate returns the union data inside the BillingInvoiceLineCreate as a BillingUsageBasedLineCreate -func (t BillingInvoiceLineCreate) AsBillingUsageBasedLineCreate() (BillingUsageBasedLineCreate, error) { - var body BillingUsageBasedLineCreate - err := json.Unmarshal(t.union, &body) - return body, err -} - -// FromBillingUsageBasedLineCreate overwrites any union data inside the BillingInvoiceLineCreate as the provided BillingUsageBasedLineCreate -func (t *BillingInvoiceLineCreate) FromBillingUsageBasedLineCreate(v BillingUsageBasedLineCreate) error { - v.Type = "usage_based" - b, err := json.Marshal(v) - t.union = b - return err -} - -// MergeBillingUsageBasedLineCreate performs a merge with any union data inside the BillingInvoiceLineCreate, using the provided BillingUsageBasedLineCreate -func (t *BillingInvoiceLineCreate) MergeBillingUsageBasedLineCreate(v BillingUsageBasedLineCreate) error { - v.Type = "usage_based" - b, err := json.Marshal(v) - if err != nil { - return err - } - - merged, err := runtime.JSONMerge(t.union, b) - t.union = merged - return err -} - -// AsBillingFlatFeeLineCreate returns the union data inside the BillingInvoiceLineCreate as a BillingFlatFeeLineCreate -func (t BillingInvoiceLineCreate) AsBillingFlatFeeLineCreate() (BillingFlatFeeLineCreate, error) { - var body BillingFlatFeeLineCreate - err := json.Unmarshal(t.union, &body) - return body, err -} - -// FromBillingFlatFeeLineCreate overwrites any union data inside the BillingInvoiceLineCreate as the provided BillingFlatFeeLineCreate -func (t *BillingInvoiceLineCreate) FromBillingFlatFeeLineCreate(v BillingFlatFeeLineCreate) error { - v.Type = "flat_fee" - b, err := json.Marshal(v) - t.union = b - return err -} - -// MergeBillingFlatFeeLineCreate performs a merge with any union data inside the BillingInvoiceLineCreate, using the provided BillingFlatFeeLineCreate -func (t *BillingInvoiceLineCreate) MergeBillingFlatFeeLineCreate(v BillingFlatFeeLineCreate) error { - v.Type = "flat_fee" - b, err := json.Marshal(v) - if err != nil { - return err - } - - merged, err := runtime.JSONMerge(t.union, b) - t.union = merged - return err -} - -func (t BillingInvoiceLineCreate) Discriminator() (string, error) { - var discriminator struct { - Discriminator string `json:"type"` - } - err := json.Unmarshal(t.union, &discriminator) - return discriminator.Discriminator, err -} - -func (t BillingInvoiceLineCreate) ValueByDiscriminator() (interface{}, error) { - discriminator, err := t.Discriminator() - if err != nil { - return nil, err - } - switch discriminator { - case "flat_fee": - return t.AsBillingFlatFeeLineCreate() - case "usage_based": - return t.AsBillingUsageBasedLineCreate() - default: - return nil, errors.New("unknown discriminator value: " + discriminator) - } -} - -func (t BillingInvoiceLineCreate) MarshalJSON() ([]byte, error) { - b, err := t.union.MarshalJSON() - return b, err -} - -func (t *BillingInvoiceLineCreate) UnmarshalJSON(b []byte) error { - err := t.union.UnmarshalJSON(b) - return err -} - -// AsBillingUsageBasedLineCreateItem returns the union data inside the BillingInvoiceLineCreateItem as a BillingUsageBasedLineCreateItem -func (t BillingInvoiceLineCreateItem) AsBillingUsageBasedLineCreateItem() (BillingUsageBasedLineCreateItem, error) { - var body BillingUsageBasedLineCreateItem - err := json.Unmarshal(t.union, &body) - return body, err -} - -// FromBillingUsageBasedLineCreateItem overwrites any union data inside the BillingInvoiceLineCreateItem as the provided BillingUsageBasedLineCreateItem -func (t *BillingInvoiceLineCreateItem) FromBillingUsageBasedLineCreateItem(v BillingUsageBasedLineCreateItem) error { - v.Type = "usage_based" - b, err := json.Marshal(v) - t.union = b - return err -} - -// MergeBillingUsageBasedLineCreateItem performs a merge with any union data inside the BillingInvoiceLineCreateItem, using the provided BillingUsageBasedLineCreateItem -func (t *BillingInvoiceLineCreateItem) MergeBillingUsageBasedLineCreateItem(v BillingUsageBasedLineCreateItem) error { - v.Type = "usage_based" - b, err := json.Marshal(v) - if err != nil { - return err - } - - merged, err := runtime.JSONMerge(t.union, b) - t.union = merged - return err -} - -// AsBillingFlatFeeLineCreateItem returns the union data inside the BillingInvoiceLineCreateItem as a BillingFlatFeeLineCreateItem -func (t BillingInvoiceLineCreateItem) AsBillingFlatFeeLineCreateItem() (BillingFlatFeeLineCreateItem, error) { - var body BillingFlatFeeLineCreateItem - err := json.Unmarshal(t.union, &body) - return body, err -} - -// FromBillingFlatFeeLineCreateItem overwrites any union data inside the BillingInvoiceLineCreateItem as the provided BillingFlatFeeLineCreateItem -func (t *BillingInvoiceLineCreateItem) FromBillingFlatFeeLineCreateItem(v BillingFlatFeeLineCreateItem) error { - v.Type = "flat_fee" - b, err := json.Marshal(v) - t.union = b - return err -} - -// MergeBillingFlatFeeLineCreateItem performs a merge with any union data inside the BillingInvoiceLineCreateItem, using the provided BillingFlatFeeLineCreateItem -func (t *BillingInvoiceLineCreateItem) MergeBillingFlatFeeLineCreateItem(v BillingFlatFeeLineCreateItem) error { - v.Type = "flat_fee" - b, err := json.Marshal(v) - if err != nil { - return err - } - - merged, err := runtime.JSONMerge(t.union, b) - t.union = merged - return err -} - -func (t BillingInvoiceLineCreateItem) Discriminator() (string, error) { - var discriminator struct { - Discriminator string `json:"type"` - } - err := json.Unmarshal(t.union, &discriminator) - return discriminator.Discriminator, err -} - -func (t BillingInvoiceLineCreateItem) ValueByDiscriminator() (interface{}, error) { - discriminator, err := t.Discriminator() - if err != nil { - return nil, err - } - switch discriminator { - case "flat_fee": - return t.AsBillingFlatFeeLineCreateItem() - case "usage_based": - return t.AsBillingUsageBasedLineCreateItem() - default: - return nil, errors.New("unknown discriminator value: " + discriminator) - } -} - -func (t BillingInvoiceLineCreateItem) MarshalJSON() ([]byte, error) { - b, err := t.union.MarshalJSON() - return b, err -} - -func (t *BillingInvoiceLineCreateItem) UnmarshalJSON(b []byte) error { - err := t.union.UnmarshalJSON(b) - return err -} +type ChangeSubscriptionJSONRequestBody = SubscriptionChange + +// MigrateSubscriptionJSONRequestBody defines body for MigrateSubscription for application/json ContentType. +type MigrateSubscriptionJSONRequestBody MigrateSubscriptionJSONBody -// AsBillingPaymentTermInstant returns the union data inside the BillingPaymentTerms as a BillingPaymentTermInstant -func (t BillingPaymentTerms) AsBillingPaymentTermInstant() (BillingPaymentTermInstant, error) { - var body BillingPaymentTermInstant +// AsStripeApp returns the union data inside the App as a StripeApp +func (t App) AsStripeApp() (StripeApp, error) { + var body StripeApp err := json.Unmarshal(t.union, &body) return body, err } -// FromBillingPaymentTermInstant overwrites any union data inside the BillingPaymentTerms as the provided BillingPaymentTermInstant -func (t *BillingPaymentTerms) FromBillingPaymentTermInstant(v BillingPaymentTermInstant) error { +// FromStripeApp overwrites any union data inside the App as the provided StripeApp +func (t *App) FromStripeApp(v StripeApp) error { + v.Type = "stripe" b, err := json.Marshal(v) t.union = b return err } -// MergeBillingPaymentTermInstant performs a merge with any union data inside the BillingPaymentTerms, using the provided BillingPaymentTermInstant -func (t *BillingPaymentTerms) MergeBillingPaymentTermInstant(v BillingPaymentTermInstant) error { +// MergeStripeApp performs a merge with any union data inside the App, using the provided StripeApp +func (t *App) MergeStripeApp(v StripeApp) error { + v.Type = "stripe" b, err := json.Marshal(v) if err != nil { return err @@ -5435,22 +5294,24 @@ func (t *BillingPaymentTerms) MergeBillingPaymentTermInstant(v BillingPaymentTer return err } -// AsBillingPaymentTermDueDate returns the union data inside the BillingPaymentTerms as a BillingPaymentTermDueDate -func (t BillingPaymentTerms) AsBillingPaymentTermDueDate() (BillingPaymentTermDueDate, error) { - var body BillingPaymentTermDueDate +// AsSandboxApp returns the union data inside the App as a SandboxApp +func (t App) AsSandboxApp() (SandboxApp, error) { + var body SandboxApp err := json.Unmarshal(t.union, &body) return body, err } -// FromBillingPaymentTermDueDate overwrites any union data inside the BillingPaymentTerms as the provided BillingPaymentTermDueDate -func (t *BillingPaymentTerms) FromBillingPaymentTermDueDate(v BillingPaymentTermDueDate) error { +// FromSandboxApp overwrites any union data inside the App as the provided SandboxApp +func (t *App) FromSandboxApp(v SandboxApp) error { + v.Type = "sandbox" b, err := json.Marshal(v) t.union = b return err } -// MergeBillingPaymentTermDueDate performs a merge with any union data inside the BillingPaymentTerms, using the provided BillingPaymentTermDueDate -func (t *BillingPaymentTerms) MergeBillingPaymentTermDueDate(v BillingPaymentTermDueDate) error { +// MergeSandboxApp performs a merge with any union data inside the App, using the provided SandboxApp +func (t *App) MergeSandboxApp(v SandboxApp) error { + v.Type = "sandbox" b, err := json.Marshal(v) if err != nil { return err @@ -5461,12 +5322,35 @@ func (t *BillingPaymentTerms) MergeBillingPaymentTermDueDate(v BillingPaymentTer return err } -func (t BillingPaymentTerms) MarshalJSON() ([]byte, error) { +func (t App) Discriminator() (string, error) { + var discriminator struct { + Discriminator string `json:"type"` + } + err := json.Unmarshal(t.union, &discriminator) + return discriminator.Discriminator, err +} + +func (t App) ValueByDiscriminator() (interface{}, error) { + discriminator, err := t.Discriminator() + if err != nil { + return nil, err + } + switch discriminator { + case "sandbox": + return t.AsSandboxApp() + case "stripe": + return t.AsStripeApp() + default: + return nil, errors.New("unknown discriminator value: " + discriminator) + } +} + +func (t App) MarshalJSON() ([]byte, error) { b, err := t.union.MarshalJSON() return b, err } -func (t *BillingPaymentTerms) UnmarshalJSON(b []byte) error { +func (t *App) UnmarshalJSON(b []byte) error { err := t.union.UnmarshalJSON(b) return err } @@ -5968,18 +5852,285 @@ func (t *IngestEventsBody) MergeIngestEventsBody1(v IngestEventsBody1) error { if err != nil { return err } - - merged, err := runtime.JSONMerge(t.union, b) - t.union = merged - return err + + merged, err := runtime.JSONMerge(t.union, b) + t.union = merged + return err +} + +func (t IngestEventsBody) MarshalJSON() ([]byte, error) { + b, err := t.union.MarshalJSON() + return b, err +} + +func (t *IngestEventsBody) UnmarshalJSON(b []byte) error { + err := t.union.UnmarshalJSON(b) + return err +} + +// AsInvoiceUsageBasedLine returns the union data inside the InvoiceLine as a InvoiceUsageBasedLine +func (t InvoiceLine) AsInvoiceUsageBasedLine() (InvoiceUsageBasedLine, error) { + var body InvoiceUsageBasedLine + err := json.Unmarshal(t.union, &body) + return body, err +} + +// FromInvoiceUsageBasedLine overwrites any union data inside the InvoiceLine as the provided InvoiceUsageBasedLine +func (t *InvoiceLine) FromInvoiceUsageBasedLine(v InvoiceUsageBasedLine) error { + v.Type = "usage_based" + b, err := json.Marshal(v) + t.union = b + return err +} + +// MergeInvoiceUsageBasedLine performs a merge with any union data inside the InvoiceLine, using the provided InvoiceUsageBasedLine +func (t *InvoiceLine) MergeInvoiceUsageBasedLine(v InvoiceUsageBasedLine) error { + v.Type = "usage_based" + b, err := json.Marshal(v) + if err != nil { + return err + } + + merged, err := runtime.JSONMerge(t.union, b) + t.union = merged + return err +} + +// AsInvoiceFlatFeeLine returns the union data inside the InvoiceLine as a InvoiceFlatFeeLine +func (t InvoiceLine) AsInvoiceFlatFeeLine() (InvoiceFlatFeeLine, error) { + var body InvoiceFlatFeeLine + err := json.Unmarshal(t.union, &body) + return body, err +} + +// FromInvoiceFlatFeeLine overwrites any union data inside the InvoiceLine as the provided InvoiceFlatFeeLine +func (t *InvoiceLine) FromInvoiceFlatFeeLine(v InvoiceFlatFeeLine) error { + v.Type = "flat_fee" + b, err := json.Marshal(v) + t.union = b + return err +} + +// MergeInvoiceFlatFeeLine performs a merge with any union data inside the InvoiceLine, using the provided InvoiceFlatFeeLine +func (t *InvoiceLine) MergeInvoiceFlatFeeLine(v InvoiceFlatFeeLine) error { + v.Type = "flat_fee" + b, err := json.Marshal(v) + if err != nil { + return err + } + + merged, err := runtime.JSONMerge(t.union, b) + t.union = merged + return err +} + +func (t InvoiceLine) Discriminator() (string, error) { + var discriminator struct { + Discriminator string `json:"type"` + } + err := json.Unmarshal(t.union, &discriminator) + return discriminator.Discriminator, err +} + +func (t InvoiceLine) ValueByDiscriminator() (interface{}, error) { + discriminator, err := t.Discriminator() + if err != nil { + return nil, err + } + switch discriminator { + case "flat_fee": + return t.AsInvoiceFlatFeeLine() + case "usage_based": + return t.AsInvoiceUsageBasedLine() + default: + return nil, errors.New("unknown discriminator value: " + discriminator) + } +} + +func (t InvoiceLine) MarshalJSON() ([]byte, error) { + b, err := t.union.MarshalJSON() + return b, err +} + +func (t *InvoiceLine) UnmarshalJSON(b []byte) error { + err := t.union.UnmarshalJSON(b) + return err +} + +// AsInvoiceUsageBasedLineCreate returns the union data inside the InvoiceLineCreate as a InvoiceUsageBasedLineCreate +func (t InvoiceLineCreate) AsInvoiceUsageBasedLineCreate() (InvoiceUsageBasedLineCreate, error) { + var body InvoiceUsageBasedLineCreate + err := json.Unmarshal(t.union, &body) + return body, err +} + +// FromInvoiceUsageBasedLineCreate overwrites any union data inside the InvoiceLineCreate as the provided InvoiceUsageBasedLineCreate +func (t *InvoiceLineCreate) FromInvoiceUsageBasedLineCreate(v InvoiceUsageBasedLineCreate) error { + v.Type = "usage_based" + b, err := json.Marshal(v) + t.union = b + return err +} + +// MergeInvoiceUsageBasedLineCreate performs a merge with any union data inside the InvoiceLineCreate, using the provided InvoiceUsageBasedLineCreate +func (t *InvoiceLineCreate) MergeInvoiceUsageBasedLineCreate(v InvoiceUsageBasedLineCreate) error { + v.Type = "usage_based" + b, err := json.Marshal(v) + if err != nil { + return err + } + + merged, err := runtime.JSONMerge(t.union, b) + t.union = merged + return err +} + +// AsInvoiceFlatFeeLineCreate returns the union data inside the InvoiceLineCreate as a InvoiceFlatFeeLineCreate +func (t InvoiceLineCreate) AsInvoiceFlatFeeLineCreate() (InvoiceFlatFeeLineCreate, error) { + var body InvoiceFlatFeeLineCreate + err := json.Unmarshal(t.union, &body) + return body, err +} + +// FromInvoiceFlatFeeLineCreate overwrites any union data inside the InvoiceLineCreate as the provided InvoiceFlatFeeLineCreate +func (t *InvoiceLineCreate) FromInvoiceFlatFeeLineCreate(v InvoiceFlatFeeLineCreate) error { + v.Type = "flat_fee" + b, err := json.Marshal(v) + t.union = b + return err +} + +// MergeInvoiceFlatFeeLineCreate performs a merge with any union data inside the InvoiceLineCreate, using the provided InvoiceFlatFeeLineCreate +func (t *InvoiceLineCreate) MergeInvoiceFlatFeeLineCreate(v InvoiceFlatFeeLineCreate) error { + v.Type = "flat_fee" + b, err := json.Marshal(v) + if err != nil { + return err + } + + merged, err := runtime.JSONMerge(t.union, b) + t.union = merged + return err +} + +func (t InvoiceLineCreate) Discriminator() (string, error) { + var discriminator struct { + Discriminator string `json:"type"` + } + err := json.Unmarshal(t.union, &discriminator) + return discriminator.Discriminator, err +} + +func (t InvoiceLineCreate) ValueByDiscriminator() (interface{}, error) { + discriminator, err := t.Discriminator() + if err != nil { + return nil, err + } + switch discriminator { + case "flat_fee": + return t.AsInvoiceFlatFeeLineCreate() + case "usage_based": + return t.AsInvoiceUsageBasedLineCreate() + default: + return nil, errors.New("unknown discriminator value: " + discriminator) + } +} + +func (t InvoiceLineCreate) MarshalJSON() ([]byte, error) { + b, err := t.union.MarshalJSON() + return b, err +} + +func (t *InvoiceLineCreate) UnmarshalJSON(b []byte) error { + err := t.union.UnmarshalJSON(b) + return err +} + +// AsInvoiceUsageBasedLineReplaceUpdate returns the union data inside the InvoiceLineReplaceUpdate as a InvoiceUsageBasedLineReplaceUpdate +func (t InvoiceLineReplaceUpdate) AsInvoiceUsageBasedLineReplaceUpdate() (InvoiceUsageBasedLineReplaceUpdate, error) { + var body InvoiceUsageBasedLineReplaceUpdate + err := json.Unmarshal(t.union, &body) + return body, err +} + +// FromInvoiceUsageBasedLineReplaceUpdate overwrites any union data inside the InvoiceLineReplaceUpdate as the provided InvoiceUsageBasedLineReplaceUpdate +func (t *InvoiceLineReplaceUpdate) FromInvoiceUsageBasedLineReplaceUpdate(v InvoiceUsageBasedLineReplaceUpdate) error { + v.Type = "usage_based" + b, err := json.Marshal(v) + t.union = b + return err +} + +// MergeInvoiceUsageBasedLineReplaceUpdate performs a merge with any union data inside the InvoiceLineReplaceUpdate, using the provided InvoiceUsageBasedLineReplaceUpdate +func (t *InvoiceLineReplaceUpdate) MergeInvoiceUsageBasedLineReplaceUpdate(v InvoiceUsageBasedLineReplaceUpdate) error { + v.Type = "usage_based" + b, err := json.Marshal(v) + if err != nil { + return err + } + + merged, err := runtime.JSONMerge(t.union, b) + t.union = merged + return err +} + +// AsInvoiceFlatFeeLineReplaceUpdate returns the union data inside the InvoiceLineReplaceUpdate as a InvoiceFlatFeeLineReplaceUpdate +func (t InvoiceLineReplaceUpdate) AsInvoiceFlatFeeLineReplaceUpdate() (InvoiceFlatFeeLineReplaceUpdate, error) { + var body InvoiceFlatFeeLineReplaceUpdate + err := json.Unmarshal(t.union, &body) + return body, err +} + +// FromInvoiceFlatFeeLineReplaceUpdate overwrites any union data inside the InvoiceLineReplaceUpdate as the provided InvoiceFlatFeeLineReplaceUpdate +func (t *InvoiceLineReplaceUpdate) FromInvoiceFlatFeeLineReplaceUpdate(v InvoiceFlatFeeLineReplaceUpdate) error { + v.Type = "flat_fee" + b, err := json.Marshal(v) + t.union = b + return err +} + +// MergeInvoiceFlatFeeLineReplaceUpdate performs a merge with any union data inside the InvoiceLineReplaceUpdate, using the provided InvoiceFlatFeeLineReplaceUpdate +func (t *InvoiceLineReplaceUpdate) MergeInvoiceFlatFeeLineReplaceUpdate(v InvoiceFlatFeeLineReplaceUpdate) error { + v.Type = "flat_fee" + b, err := json.Marshal(v) + if err != nil { + return err + } + + merged, err := runtime.JSONMerge(t.union, b) + t.union = merged + return err +} + +func (t InvoiceLineReplaceUpdate) Discriminator() (string, error) { + var discriminator struct { + Discriminator string `json:"type"` + } + err := json.Unmarshal(t.union, &discriminator) + return discriminator.Discriminator, err +} + +func (t InvoiceLineReplaceUpdate) ValueByDiscriminator() (interface{}, error) { + discriminator, err := t.Discriminator() + if err != nil { + return nil, err + } + switch discriminator { + case "flat_fee": + return t.AsInvoiceFlatFeeLineReplaceUpdate() + case "usage_based": + return t.AsInvoiceUsageBasedLineReplaceUpdate() + default: + return nil, errors.New("unknown discriminator value: " + discriminator) + } } -func (t IngestEventsBody) MarshalJSON() ([]byte, error) { +func (t InvoiceLineReplaceUpdate) MarshalJSON() ([]byte, error) { b, err := t.union.MarshalJSON() return b, err } -func (t *IngestEventsBody) UnmarshalJSON(b []byte) error { +func (t *InvoiceLineReplaceUpdate) UnmarshalJSON(b []byte) error { err := t.union.UnmarshalJSON(b) return err } @@ -6170,84 +6321,22 @@ func (t *MeasureUsageFrom) UnmarshalJSON(b []byte) error { return err } -// AsSubscriptionEditAddItem returns the union data inside the PlanSubscriptionChange_Customizations_Item as a SubscriptionEditAddItem -func (t PlanSubscriptionChange_Customizations_Item) AsSubscriptionEditAddItem() (SubscriptionEditAddItem, error) { - var body SubscriptionEditAddItem - err := json.Unmarshal(t.union, &body) - return body, err -} - -// FromSubscriptionEditAddItem overwrites any union data inside the PlanSubscriptionChange_Customizations_Item as the provided SubscriptionEditAddItem -func (t *PlanSubscriptionChange_Customizations_Item) FromSubscriptionEditAddItem(v SubscriptionEditAddItem) error { - b, err := json.Marshal(v) - t.union = b - return err -} - -// MergeSubscriptionEditAddItem performs a merge with any union data inside the PlanSubscriptionChange_Customizations_Item, using the provided SubscriptionEditAddItem -func (t *PlanSubscriptionChange_Customizations_Item) MergeSubscriptionEditAddItem(v SubscriptionEditAddItem) error { - b, err := json.Marshal(v) - if err != nil { - return err - } - - merged, err := runtime.JSONMerge(t.union, b) - t.union = merged - return err -} - -// AsSubscriptionEditRemoveItem returns the union data inside the PlanSubscriptionChange_Customizations_Item as a SubscriptionEditRemoveItem -func (t PlanSubscriptionChange_Customizations_Item) AsSubscriptionEditRemoveItem() (SubscriptionEditRemoveItem, error) { - var body SubscriptionEditRemoveItem - err := json.Unmarshal(t.union, &body) - return body, err -} - -// FromSubscriptionEditRemoveItem overwrites any union data inside the PlanSubscriptionChange_Customizations_Item as the provided SubscriptionEditRemoveItem -func (t *PlanSubscriptionChange_Customizations_Item) FromSubscriptionEditRemoveItem(v SubscriptionEditRemoveItem) error { - b, err := json.Marshal(v) - t.union = b - return err -} - -// MergeSubscriptionEditRemoveItem performs a merge with any union data inside the PlanSubscriptionChange_Customizations_Item, using the provided SubscriptionEditRemoveItem -func (t *PlanSubscriptionChange_Customizations_Item) MergeSubscriptionEditRemoveItem(v SubscriptionEditRemoveItem) error { - b, err := json.Marshal(v) - if err != nil { - return err - } - - merged, err := runtime.JSONMerge(t.union, b) - t.union = merged - return err -} - -func (t PlanSubscriptionChange_Customizations_Item) MarshalJSON() ([]byte, error) { - b, err := t.union.MarshalJSON() - return b, err -} - -func (t *PlanSubscriptionChange_Customizations_Item) UnmarshalJSON(b []byte) error { - err := t.union.UnmarshalJSON(b) - return err -} - -// AsSubscriptionEditAddItem returns the union data inside the PlanSubscriptionCreate_Customizations_Item as a SubscriptionEditAddItem -func (t PlanSubscriptionCreate_Customizations_Item) AsSubscriptionEditAddItem() (SubscriptionEditAddItem, error) { - var body SubscriptionEditAddItem +// AsPaymentTermInstant returns the union data inside the PaymentTerms as a PaymentTermInstant +func (t PaymentTerms) AsPaymentTermInstant() (PaymentTermInstant, error) { + var body PaymentTermInstant err := json.Unmarshal(t.union, &body) return body, err } -// FromSubscriptionEditAddItem overwrites any union data inside the PlanSubscriptionCreate_Customizations_Item as the provided SubscriptionEditAddItem -func (t *PlanSubscriptionCreate_Customizations_Item) FromSubscriptionEditAddItem(v SubscriptionEditAddItem) error { +// FromPaymentTermInstant overwrites any union data inside the PaymentTerms as the provided PaymentTermInstant +func (t *PaymentTerms) FromPaymentTermInstant(v PaymentTermInstant) error { b, err := json.Marshal(v) t.union = b return err } -// MergeSubscriptionEditAddItem performs a merge with any union data inside the PlanSubscriptionCreate_Customizations_Item, using the provided SubscriptionEditAddItem -func (t *PlanSubscriptionCreate_Customizations_Item) MergeSubscriptionEditAddItem(v SubscriptionEditAddItem) error { +// MergePaymentTermInstant performs a merge with any union data inside the PaymentTerms, using the provided PaymentTermInstant +func (t *PaymentTerms) MergePaymentTermInstant(v PaymentTermInstant) error { b, err := json.Marshal(v) if err != nil { return err @@ -6258,22 +6347,22 @@ func (t *PlanSubscriptionCreate_Customizations_Item) MergeSubscriptionEditAddIte return err } -// AsSubscriptionEditRemoveItem returns the union data inside the PlanSubscriptionCreate_Customizations_Item as a SubscriptionEditRemoveItem -func (t PlanSubscriptionCreate_Customizations_Item) AsSubscriptionEditRemoveItem() (SubscriptionEditRemoveItem, error) { - var body SubscriptionEditRemoveItem +// AsPaymentTermDueDate returns the union data inside the PaymentTerms as a PaymentTermDueDate +func (t PaymentTerms) AsPaymentTermDueDate() (PaymentTermDueDate, error) { + var body PaymentTermDueDate err := json.Unmarshal(t.union, &body) return body, err } -// FromSubscriptionEditRemoveItem overwrites any union data inside the PlanSubscriptionCreate_Customizations_Item as the provided SubscriptionEditRemoveItem -func (t *PlanSubscriptionCreate_Customizations_Item) FromSubscriptionEditRemoveItem(v SubscriptionEditRemoveItem) error { +// FromPaymentTermDueDate overwrites any union data inside the PaymentTerms as the provided PaymentTermDueDate +func (t *PaymentTerms) FromPaymentTermDueDate(v PaymentTermDueDate) error { b, err := json.Marshal(v) t.union = b return err } -// MergeSubscriptionEditRemoveItem performs a merge with any union data inside the PlanSubscriptionCreate_Customizations_Item, using the provided SubscriptionEditRemoveItem -func (t *PlanSubscriptionCreate_Customizations_Item) MergeSubscriptionEditRemoveItem(v SubscriptionEditRemoveItem) error { +// MergePaymentTermDueDate performs a merge with any union data inside the PaymentTerms, using the provided PaymentTermDueDate +func (t *PaymentTerms) MergePaymentTermDueDate(v PaymentTermDueDate) error { b, err := json.Marshal(v) if err != nil { return err @@ -6284,12 +6373,12 @@ func (t *PlanSubscriptionCreate_Customizations_Item) MergeSubscriptionEditRemove return err } -func (t PlanSubscriptionCreate_Customizations_Item) MarshalJSON() ([]byte, error) { +func (t PaymentTerms) MarshalJSON() ([]byte, error) { b, err := t.union.MarshalJSON() return b, err } -func (t *PlanSubscriptionCreate_Customizations_Item) UnmarshalJSON(b []byte) error { +func (t *PaymentTerms) UnmarshalJSON(b []byte) error { err := t.union.UnmarshalJSON(b) return err } @@ -6502,24 +6591,24 @@ func (t *RateCardEntitlement) UnmarshalJSON(b []byte) error { return err } -// AsRateCardFlatFeeUpdateItem returns the union data inside the RateCardUpdateItem as a RateCardFlatFeeUpdateItem -func (t RateCardUpdateItem) AsRateCardFlatFeeUpdateItem() (RateCardFlatFeeUpdateItem, error) { - var body RateCardFlatFeeUpdateItem +// AsFlatPriceWithPaymentTerm returns the union data inside the RateCardUsageBasedPrice as a FlatPriceWithPaymentTerm +func (t RateCardUsageBasedPrice) AsFlatPriceWithPaymentTerm() (FlatPriceWithPaymentTerm, error) { + var body FlatPriceWithPaymentTerm err := json.Unmarshal(t.union, &body) return body, err } -// FromRateCardFlatFeeUpdateItem overwrites any union data inside the RateCardUpdateItem as the provided RateCardFlatFeeUpdateItem -func (t *RateCardUpdateItem) FromRateCardFlatFeeUpdateItem(v RateCardFlatFeeUpdateItem) error { - v.Type = "flat_fee" +// FromFlatPriceWithPaymentTerm overwrites any union data inside the RateCardUsageBasedPrice as the provided FlatPriceWithPaymentTerm +func (t *RateCardUsageBasedPrice) FromFlatPriceWithPaymentTerm(v FlatPriceWithPaymentTerm) error { + v.Type = "flat" b, err := json.Marshal(v) t.union = b return err } -// MergeRateCardFlatFeeUpdateItem performs a merge with any union data inside the RateCardUpdateItem, using the provided RateCardFlatFeeUpdateItem -func (t *RateCardUpdateItem) MergeRateCardFlatFeeUpdateItem(v RateCardFlatFeeUpdateItem) error { - v.Type = "flat_fee" +// MergeFlatPriceWithPaymentTerm performs a merge with any union data inside the RateCardUsageBasedPrice, using the provided FlatPriceWithPaymentTerm +func (t *RateCardUsageBasedPrice) MergeFlatPriceWithPaymentTerm(v FlatPriceWithPaymentTerm) error { + v.Type = "flat" b, err := json.Marshal(v) if err != nil { return err @@ -6530,24 +6619,52 @@ func (t *RateCardUpdateItem) MergeRateCardFlatFeeUpdateItem(v RateCardFlatFeeUpd return err } -// AsRateCardUsageBasedUpdateItem returns the union data inside the RateCardUpdateItem as a RateCardUsageBasedUpdateItem -func (t RateCardUpdateItem) AsRateCardUsageBasedUpdateItem() (RateCardUsageBasedUpdateItem, error) { - var body RateCardUsageBasedUpdateItem +// AsUnitPriceWithCommitments returns the union data inside the RateCardUsageBasedPrice as a UnitPriceWithCommitments +func (t RateCardUsageBasedPrice) AsUnitPriceWithCommitments() (UnitPriceWithCommitments, error) { + var body UnitPriceWithCommitments err := json.Unmarshal(t.union, &body) return body, err } -// FromRateCardUsageBasedUpdateItem overwrites any union data inside the RateCardUpdateItem as the provided RateCardUsageBasedUpdateItem -func (t *RateCardUpdateItem) FromRateCardUsageBasedUpdateItem(v RateCardUsageBasedUpdateItem) error { - v.Type = "usage_based" +// FromUnitPriceWithCommitments overwrites any union data inside the RateCardUsageBasedPrice as the provided UnitPriceWithCommitments +func (t *RateCardUsageBasedPrice) FromUnitPriceWithCommitments(v UnitPriceWithCommitments) error { + v.Type = "unit" b, err := json.Marshal(v) t.union = b return err } -// MergeRateCardUsageBasedUpdateItem performs a merge with any union data inside the RateCardUpdateItem, using the provided RateCardUsageBasedUpdateItem -func (t *RateCardUpdateItem) MergeRateCardUsageBasedUpdateItem(v RateCardUsageBasedUpdateItem) error { - v.Type = "usage_based" +// MergeUnitPriceWithCommitments performs a merge with any union data inside the RateCardUsageBasedPrice, using the provided UnitPriceWithCommitments +func (t *RateCardUsageBasedPrice) MergeUnitPriceWithCommitments(v UnitPriceWithCommitments) error { + v.Type = "unit" + b, err := json.Marshal(v) + if err != nil { + return err + } + + merged, err := runtime.JSONMerge(t.union, b) + t.union = merged + return err +} + +// AsTieredPriceWithCommitments returns the union data inside the RateCardUsageBasedPrice as a TieredPriceWithCommitments +func (t RateCardUsageBasedPrice) AsTieredPriceWithCommitments() (TieredPriceWithCommitments, error) { + var body TieredPriceWithCommitments + err := json.Unmarshal(t.union, &body) + return body, err +} + +// FromTieredPriceWithCommitments overwrites any union data inside the RateCardUsageBasedPrice as the provided TieredPriceWithCommitments +func (t *RateCardUsageBasedPrice) FromTieredPriceWithCommitments(v TieredPriceWithCommitments) error { + v.Type = "tiered" + b, err := json.Marshal(v) + t.union = b + return err +} + +// MergeTieredPriceWithCommitments performs a merge with any union data inside the RateCardUsageBasedPrice, using the provided TieredPriceWithCommitments +func (t *RateCardUsageBasedPrice) MergeTieredPriceWithCommitments(v TieredPriceWithCommitments) error { + v.Type = "tiered" b, err := json.Marshal(v) if err != nil { return err @@ -6558,7 +6675,7 @@ func (t *RateCardUpdateItem) MergeRateCardUsageBasedUpdateItem(v RateCardUsageBa return err } -func (t RateCardUpdateItem) Discriminator() (string, error) { +func (t RateCardUsageBasedPrice) Discriminator() (string, error) { var discriminator struct { Discriminator string `json:"type"` } @@ -6566,49 +6683,231 @@ func (t RateCardUpdateItem) Discriminator() (string, error) { return discriminator.Discriminator, err } -func (t RateCardUpdateItem) ValueByDiscriminator() (interface{}, error) { +func (t RateCardUsageBasedPrice) ValueByDiscriminator() (interface{}, error) { discriminator, err := t.Discriminator() if err != nil { return nil, err } switch discriminator { - case "flat_fee": - return t.AsRateCardFlatFeeUpdateItem() - case "usage_based": - return t.AsRateCardUsageBasedUpdateItem() + case "flat": + return t.AsFlatPriceWithPaymentTerm() + case "tiered": + return t.AsTieredPriceWithCommitments() + case "unit": + return t.AsUnitPriceWithCommitments() default: return nil, errors.New("unknown discriminator value: " + discriminator) } } -func (t RateCardUpdateItem) MarshalJSON() ([]byte, error) { - b, err := t.union.MarshalJSON() - return b, err +func (t RateCardUsageBasedPrice) MarshalJSON() ([]byte, error) { + b, err := t.union.MarshalJSON() + return b, err +} + +func (t *RateCardUsageBasedPrice) UnmarshalJSON(b []byte) error { + err := t.union.UnmarshalJSON(b) + return err +} + +// AsPlanSubscriptionChange returns the union data inside the SubscriptionChange as a PlanSubscriptionChange +func (t SubscriptionChange) AsPlanSubscriptionChange() (PlanSubscriptionChange, error) { + var body PlanSubscriptionChange + err := json.Unmarshal(t.union, &body) + return body, err +} + +// FromPlanSubscriptionChange overwrites any union data inside the SubscriptionChange as the provided PlanSubscriptionChange +func (t *SubscriptionChange) FromPlanSubscriptionChange(v PlanSubscriptionChange) error { + b, err := json.Marshal(v) + t.union = b + return err +} + +// MergePlanSubscriptionChange performs a merge with any union data inside the SubscriptionChange, using the provided PlanSubscriptionChange +func (t *SubscriptionChange) MergePlanSubscriptionChange(v PlanSubscriptionChange) error { + b, err := json.Marshal(v) + if err != nil { + return err + } + + merged, err := runtime.JSONMerge(t.union, b) + t.union = merged + return err +} + +// AsCustomSubscriptionChange returns the union data inside the SubscriptionChange as a CustomSubscriptionChange +func (t SubscriptionChange) AsCustomSubscriptionChange() (CustomSubscriptionChange, error) { + var body CustomSubscriptionChange + err := json.Unmarshal(t.union, &body) + return body, err +} + +// FromCustomSubscriptionChange overwrites any union data inside the SubscriptionChange as the provided CustomSubscriptionChange +func (t *SubscriptionChange) FromCustomSubscriptionChange(v CustomSubscriptionChange) error { + b, err := json.Marshal(v) + t.union = b + return err +} + +// MergeCustomSubscriptionChange performs a merge with any union data inside the SubscriptionChange, using the provided CustomSubscriptionChange +func (t *SubscriptionChange) MergeCustomSubscriptionChange(v CustomSubscriptionChange) error { + b, err := json.Marshal(v) + if err != nil { + return err + } + + merged, err := runtime.JSONMerge(t.union, b) + t.union = merged + return err +} + +func (t SubscriptionChange) MarshalJSON() ([]byte, error) { + b, err := t.union.MarshalJSON() + return b, err +} + +func (t *SubscriptionChange) UnmarshalJSON(b []byte) error { + err := t.union.UnmarshalJSON(b) + return err +} + +// AsPlanSubscriptionCreate returns the union data inside the SubscriptionCreate as a PlanSubscriptionCreate +func (t SubscriptionCreate) AsPlanSubscriptionCreate() (PlanSubscriptionCreate, error) { + var body PlanSubscriptionCreate + err := json.Unmarshal(t.union, &body) + return body, err +} + +// FromPlanSubscriptionCreate overwrites any union data inside the SubscriptionCreate as the provided PlanSubscriptionCreate +func (t *SubscriptionCreate) FromPlanSubscriptionCreate(v PlanSubscriptionCreate) error { + b, err := json.Marshal(v) + t.union = b + return err +} + +// MergePlanSubscriptionCreate performs a merge with any union data inside the SubscriptionCreate, using the provided PlanSubscriptionCreate +func (t *SubscriptionCreate) MergePlanSubscriptionCreate(v PlanSubscriptionCreate) error { + b, err := json.Marshal(v) + if err != nil { + return err + } + + merged, err := runtime.JSONMerge(t.union, b) + t.union = merged + return err +} + +// AsCustomSubscriptionCreate returns the union data inside the SubscriptionCreate as a CustomSubscriptionCreate +func (t SubscriptionCreate) AsCustomSubscriptionCreate() (CustomSubscriptionCreate, error) { + var body CustomSubscriptionCreate + err := json.Unmarshal(t.union, &body) + return body, err +} + +// FromCustomSubscriptionCreate overwrites any union data inside the SubscriptionCreate as the provided CustomSubscriptionCreate +func (t *SubscriptionCreate) FromCustomSubscriptionCreate(v CustomSubscriptionCreate) error { + b, err := json.Marshal(v) + t.union = b + return err +} + +// MergeCustomSubscriptionCreate performs a merge with any union data inside the SubscriptionCreate, using the provided CustomSubscriptionCreate +func (t *SubscriptionCreate) MergeCustomSubscriptionCreate(v CustomSubscriptionCreate) error { + b, err := json.Marshal(v) + if err != nil { + return err + } + + merged, err := runtime.JSONMerge(t.union, b) + t.union = merged + return err +} + +func (t SubscriptionCreate) MarshalJSON() ([]byte, error) { + b, err := t.union.MarshalJSON() + return b, err +} + +func (t *SubscriptionCreate) UnmarshalJSON(b []byte) error { + err := t.union.UnmarshalJSON(b) + return err +} + +// AsEditSubscriptionAddItem returns the union data inside the SubscriptionEditOperation as a EditSubscriptionAddItem +func (t SubscriptionEditOperation) AsEditSubscriptionAddItem() (EditSubscriptionAddItem, error) { + var body EditSubscriptionAddItem + err := json.Unmarshal(t.union, &body) + return body, err +} + +// FromEditSubscriptionAddItem overwrites any union data inside the SubscriptionEditOperation as the provided EditSubscriptionAddItem +func (t *SubscriptionEditOperation) FromEditSubscriptionAddItem(v EditSubscriptionAddItem) error { + v.Op = "add_item" + b, err := json.Marshal(v) + t.union = b + return err +} + +// MergeEditSubscriptionAddItem performs a merge with any union data inside the SubscriptionEditOperation, using the provided EditSubscriptionAddItem +func (t *SubscriptionEditOperation) MergeEditSubscriptionAddItem(v EditSubscriptionAddItem) error { + v.Op = "add_item" + b, err := json.Marshal(v) + if err != nil { + return err + } + + merged, err := runtime.JSONMerge(t.union, b) + t.union = merged + return err +} + +// AsEditSubscriptionRemoveItem returns the union data inside the SubscriptionEditOperation as a EditSubscriptionRemoveItem +func (t SubscriptionEditOperation) AsEditSubscriptionRemoveItem() (EditSubscriptionRemoveItem, error) { + var body EditSubscriptionRemoveItem + err := json.Unmarshal(t.union, &body) + return body, err } -func (t *RateCardUpdateItem) UnmarshalJSON(b []byte) error { - err := t.union.UnmarshalJSON(b) +// FromEditSubscriptionRemoveItem overwrites any union data inside the SubscriptionEditOperation as the provided EditSubscriptionRemoveItem +func (t *SubscriptionEditOperation) FromEditSubscriptionRemoveItem(v EditSubscriptionRemoveItem) error { + v.Op = "remove_item" + b, err := json.Marshal(v) + t.union = b return err } -// AsFlatPriceWithPaymentTerm returns the union data inside the RateCardUsageBasedPrice as a FlatPriceWithPaymentTerm -func (t RateCardUsageBasedPrice) AsFlatPriceWithPaymentTerm() (FlatPriceWithPaymentTerm, error) { - var body FlatPriceWithPaymentTerm +// MergeEditSubscriptionRemoveItem performs a merge with any union data inside the SubscriptionEditOperation, using the provided EditSubscriptionRemoveItem +func (t *SubscriptionEditOperation) MergeEditSubscriptionRemoveItem(v EditSubscriptionRemoveItem) error { + v.Op = "remove_item" + b, err := json.Marshal(v) + if err != nil { + return err + } + + merged, err := runtime.JSONMerge(t.union, b) + t.union = merged + return err +} + +// AsEditSubscriptionAddPhase returns the union data inside the SubscriptionEditOperation as a EditSubscriptionAddPhase +func (t SubscriptionEditOperation) AsEditSubscriptionAddPhase() (EditSubscriptionAddPhase, error) { + var body EditSubscriptionAddPhase err := json.Unmarshal(t.union, &body) return body, err } -// FromFlatPriceWithPaymentTerm overwrites any union data inside the RateCardUsageBasedPrice as the provided FlatPriceWithPaymentTerm -func (t *RateCardUsageBasedPrice) FromFlatPriceWithPaymentTerm(v FlatPriceWithPaymentTerm) error { - v.Type = "flat" +// FromEditSubscriptionAddPhase overwrites any union data inside the SubscriptionEditOperation as the provided EditSubscriptionAddPhase +func (t *SubscriptionEditOperation) FromEditSubscriptionAddPhase(v EditSubscriptionAddPhase) error { + v.Op = "add_phase" b, err := json.Marshal(v) t.union = b return err } -// MergeFlatPriceWithPaymentTerm performs a merge with any union data inside the RateCardUsageBasedPrice, using the provided FlatPriceWithPaymentTerm -func (t *RateCardUsageBasedPrice) MergeFlatPriceWithPaymentTerm(v FlatPriceWithPaymentTerm) error { - v.Type = "flat" +// MergeEditSubscriptionAddPhase performs a merge with any union data inside the SubscriptionEditOperation, using the provided EditSubscriptionAddPhase +func (t *SubscriptionEditOperation) MergeEditSubscriptionAddPhase(v EditSubscriptionAddPhase) error { + v.Op = "add_phase" b, err := json.Marshal(v) if err != nil { return err @@ -6619,24 +6918,24 @@ func (t *RateCardUsageBasedPrice) MergeFlatPriceWithPaymentTerm(v FlatPriceWithP return err } -// AsUnitPriceWithCommitments returns the union data inside the RateCardUsageBasedPrice as a UnitPriceWithCommitments -func (t RateCardUsageBasedPrice) AsUnitPriceWithCommitments() (UnitPriceWithCommitments, error) { - var body UnitPriceWithCommitments +// AsEditSubscriptionRemovePhase returns the union data inside the SubscriptionEditOperation as a EditSubscriptionRemovePhase +func (t SubscriptionEditOperation) AsEditSubscriptionRemovePhase() (EditSubscriptionRemovePhase, error) { + var body EditSubscriptionRemovePhase err := json.Unmarshal(t.union, &body) return body, err } -// FromUnitPriceWithCommitments overwrites any union data inside the RateCardUsageBasedPrice as the provided UnitPriceWithCommitments -func (t *RateCardUsageBasedPrice) FromUnitPriceWithCommitments(v UnitPriceWithCommitments) error { - v.Type = "unit" +// FromEditSubscriptionRemovePhase overwrites any union data inside the SubscriptionEditOperation as the provided EditSubscriptionRemovePhase +func (t *SubscriptionEditOperation) FromEditSubscriptionRemovePhase(v EditSubscriptionRemovePhase) error { + v.Op = "remove_phase" b, err := json.Marshal(v) t.union = b return err } -// MergeUnitPriceWithCommitments performs a merge with any union data inside the RateCardUsageBasedPrice, using the provided UnitPriceWithCommitments -func (t *RateCardUsageBasedPrice) MergeUnitPriceWithCommitments(v UnitPriceWithCommitments) error { - v.Type = "unit" +// MergeEditSubscriptionRemovePhase performs a merge with any union data inside the SubscriptionEditOperation, using the provided EditSubscriptionRemovePhase +func (t *SubscriptionEditOperation) MergeEditSubscriptionRemovePhase(v EditSubscriptionRemovePhase) error { + v.Op = "remove_phase" b, err := json.Marshal(v) if err != nil { return err @@ -6647,24 +6946,24 @@ func (t *RateCardUsageBasedPrice) MergeUnitPriceWithCommitments(v UnitPriceWithC return err } -// AsTieredPriceWithCommitments returns the union data inside the RateCardUsageBasedPrice as a TieredPriceWithCommitments -func (t RateCardUsageBasedPrice) AsTieredPriceWithCommitments() (TieredPriceWithCommitments, error) { - var body TieredPriceWithCommitments +// AsEditSubscriptionStretchPhase returns the union data inside the SubscriptionEditOperation as a EditSubscriptionStretchPhase +func (t SubscriptionEditOperation) AsEditSubscriptionStretchPhase() (EditSubscriptionStretchPhase, error) { + var body EditSubscriptionStretchPhase err := json.Unmarshal(t.union, &body) return body, err } -// FromTieredPriceWithCommitments overwrites any union data inside the RateCardUsageBasedPrice as the provided TieredPriceWithCommitments -func (t *RateCardUsageBasedPrice) FromTieredPriceWithCommitments(v TieredPriceWithCommitments) error { - v.Type = "tiered" +// FromEditSubscriptionStretchPhase overwrites any union data inside the SubscriptionEditOperation as the provided EditSubscriptionStretchPhase +func (t *SubscriptionEditOperation) FromEditSubscriptionStretchPhase(v EditSubscriptionStretchPhase) error { + v.Op = "stretch_phase" b, err := json.Marshal(v) t.union = b return err } -// MergeTieredPriceWithCommitments performs a merge with any union data inside the RateCardUsageBasedPrice, using the provided TieredPriceWithCommitments -func (t *RateCardUsageBasedPrice) MergeTieredPriceWithCommitments(v TieredPriceWithCommitments) error { - v.Type = "tiered" +// MergeEditSubscriptionStretchPhase performs a merge with any union data inside the SubscriptionEditOperation, using the provided EditSubscriptionStretchPhase +func (t *SubscriptionEditOperation) MergeEditSubscriptionStretchPhase(v EditSubscriptionStretchPhase) error { + v.Op = "stretch_phase" b, err := json.Marshal(v) if err != nil { return err @@ -6675,83 +6974,61 @@ func (t *RateCardUsageBasedPrice) MergeTieredPriceWithCommitments(v TieredPriceW return err } -func (t RateCardUsageBasedPrice) Discriminator() (string, error) { +func (t SubscriptionEditOperation) Discriminator() (string, error) { var discriminator struct { - Discriminator string `json:"type"` + Discriminator string `json:"op"` } err := json.Unmarshal(t.union, &discriminator) return discriminator.Discriminator, err } -func (t RateCardUsageBasedPrice) ValueByDiscriminator() (interface{}, error) { +func (t SubscriptionEditOperation) ValueByDiscriminator() (interface{}, error) { discriminator, err := t.Discriminator() if err != nil { return nil, err } switch discriminator { - case "flat": - return t.AsFlatPriceWithPaymentTerm() - case "tiered": - return t.AsTieredPriceWithCommitments() - case "unit": - return t.AsUnitPriceWithCommitments() + case "add_item": + return t.AsEditSubscriptionAddItem() + case "add_phase": + return t.AsEditSubscriptionAddPhase() + case "remove_item": + return t.AsEditSubscriptionRemoveItem() + case "remove_phase": + return t.AsEditSubscriptionRemovePhase() + case "stretch_phase": + return t.AsEditSubscriptionStretchPhase() default: return nil, errors.New("unknown discriminator value: " + discriminator) } } -func (t RateCardUsageBasedPrice) MarshalJSON() ([]byte, error) { +func (t SubscriptionEditOperation) MarshalJSON() ([]byte, error) { b, err := t.union.MarshalJSON() return b, err } -func (t *RateCardUsageBasedPrice) UnmarshalJSON(b []byte) error { +func (t *SubscriptionEditOperation) UnmarshalJSON(b []byte) error { err := t.union.UnmarshalJSON(b) return err } -// AsPlanSubscriptionChange returns the union data inside the SubscriptionChange as a PlanSubscriptionChange -func (t SubscriptionChange) AsPlanSubscriptionChange() (PlanSubscriptionChange, error) { - var body PlanSubscriptionChange - err := json.Unmarshal(t.union, &body) - return body, err -} - -// FromPlanSubscriptionChange overwrites any union data inside the SubscriptionChange as the provided PlanSubscriptionChange -func (t *SubscriptionChange) FromPlanSubscriptionChange(v PlanSubscriptionChange) error { - b, err := json.Marshal(v) - t.union = b - return err -} - -// MergePlanSubscriptionChange performs a merge with any union data inside the SubscriptionChange, using the provided PlanSubscriptionChange -func (t *SubscriptionChange) MergePlanSubscriptionChange(v PlanSubscriptionChange) error { - b, err := json.Marshal(v) - if err != nil { - return err - } - - merged, err := runtime.JSONMerge(t.union, b) - t.union = merged - return err -} - -// AsCustomSubscriptionChange returns the union data inside the SubscriptionChange as a CustomSubscriptionChange -func (t SubscriptionChange) AsCustomSubscriptionChange() (CustomSubscriptionChange, error) { - var body CustomSubscriptionChange +// AsSubscriptionItemPrice0 returns the union data inside the SubscriptionItem_Price as a SubscriptionItemPrice0 +func (t SubscriptionItem_Price) AsSubscriptionItemPrice0() (SubscriptionItemPrice0, error) { + var body SubscriptionItemPrice0 err := json.Unmarshal(t.union, &body) return body, err } -// FromCustomSubscriptionChange overwrites any union data inside the SubscriptionChange as the provided CustomSubscriptionChange -func (t *SubscriptionChange) FromCustomSubscriptionChange(v CustomSubscriptionChange) error { +// FromSubscriptionItemPrice0 overwrites any union data inside the SubscriptionItem_Price as the provided SubscriptionItemPrice0 +func (t *SubscriptionItem_Price) FromSubscriptionItemPrice0(v SubscriptionItemPrice0) error { b, err := json.Marshal(v) t.union = b return err } -// MergeCustomSubscriptionChange performs a merge with any union data inside the SubscriptionChange, using the provided CustomSubscriptionChange -func (t *SubscriptionChange) MergeCustomSubscriptionChange(v CustomSubscriptionChange) error { +// MergeSubscriptionItemPrice0 performs a merge with any union data inside the SubscriptionItem_Price, using the provided SubscriptionItemPrice0 +func (t *SubscriptionItem_Price) MergeSubscriptionItemPrice0(v SubscriptionItemPrice0) error { b, err := json.Marshal(v) if err != nil { return err @@ -6762,32 +7039,22 @@ func (t *SubscriptionChange) MergeCustomSubscriptionChange(v CustomSubscriptionC return err } -func (t SubscriptionChange) MarshalJSON() ([]byte, error) { - b, err := t.union.MarshalJSON() - return b, err -} - -func (t *SubscriptionChange) UnmarshalJSON(b []byte) error { - err := t.union.UnmarshalJSON(b) - return err -} - -// AsPlanSubscriptionCreate returns the union data inside the SubscriptionCreate as a PlanSubscriptionCreate -func (t SubscriptionCreate) AsPlanSubscriptionCreate() (PlanSubscriptionCreate, error) { - var body PlanSubscriptionCreate +// AsSubscriptionItemPrice1 returns the union data inside the SubscriptionItem_Price as a SubscriptionItemPrice1 +func (t SubscriptionItem_Price) AsSubscriptionItemPrice1() (SubscriptionItemPrice1, error) { + var body SubscriptionItemPrice1 err := json.Unmarshal(t.union, &body) return body, err } -// FromPlanSubscriptionCreate overwrites any union data inside the SubscriptionCreate as the provided PlanSubscriptionCreate -func (t *SubscriptionCreate) FromPlanSubscriptionCreate(v PlanSubscriptionCreate) error { +// FromSubscriptionItemPrice1 overwrites any union data inside the SubscriptionItem_Price as the provided SubscriptionItemPrice1 +func (t *SubscriptionItem_Price) FromSubscriptionItemPrice1(v SubscriptionItemPrice1) error { b, err := json.Marshal(v) t.union = b return err } -// MergePlanSubscriptionCreate performs a merge with any union data inside the SubscriptionCreate, using the provided PlanSubscriptionCreate -func (t *SubscriptionCreate) MergePlanSubscriptionCreate(v PlanSubscriptionCreate) error { +// MergeSubscriptionItemPrice1 performs a merge with any union data inside the SubscriptionItem_Price, using the provided SubscriptionItemPrice1 +func (t *SubscriptionItem_Price) MergeSubscriptionItemPrice1(v SubscriptionItemPrice1) error { b, err := json.Marshal(v) if err != nil { return err @@ -6798,22 +7065,22 @@ func (t *SubscriptionCreate) MergePlanSubscriptionCreate(v PlanSubscriptionCreat return err } -// AsCreateCustomSubscriptionRequestBody returns the union data inside the SubscriptionCreate as a CreateCustomSubscriptionRequestBody -func (t SubscriptionCreate) AsCreateCustomSubscriptionRequestBody() (CreateCustomSubscriptionRequestBody, error) { - var body CreateCustomSubscriptionRequestBody +// AsSubscriptionItemPrice2 returns the union data inside the SubscriptionItem_Price as a SubscriptionItemPrice2 +func (t SubscriptionItem_Price) AsSubscriptionItemPrice2() (SubscriptionItemPrice2, error) { + var body SubscriptionItemPrice2 err := json.Unmarshal(t.union, &body) return body, err } -// FromCreateCustomSubscriptionRequestBody overwrites any union data inside the SubscriptionCreate as the provided CreateCustomSubscriptionRequestBody -func (t *SubscriptionCreate) FromCreateCustomSubscriptionRequestBody(v CreateCustomSubscriptionRequestBody) error { +// FromSubscriptionItemPrice2 overwrites any union data inside the SubscriptionItem_Price as the provided SubscriptionItemPrice2 +func (t *SubscriptionItem_Price) FromSubscriptionItemPrice2(v SubscriptionItemPrice2) error { b, err := json.Marshal(v) t.union = b return err } -// MergeCreateCustomSubscriptionRequestBody performs a merge with any union data inside the SubscriptionCreate, using the provided CreateCustomSubscriptionRequestBody -func (t *SubscriptionCreate) MergeCreateCustomSubscriptionRequestBody(v CreateCustomSubscriptionRequestBody) error { +// MergeSubscriptionItemPrice2 performs a merge with any union data inside the SubscriptionItem_Price, using the provided SubscriptionItemPrice2 +func (t *SubscriptionItem_Price) MergeSubscriptionItemPrice2(v SubscriptionItemPrice2) error { b, err := json.Marshal(v) if err != nil { return err @@ -6824,32 +7091,34 @@ func (t *SubscriptionCreate) MergeCreateCustomSubscriptionRequestBody(v CreateCu return err } -func (t SubscriptionCreate) MarshalJSON() ([]byte, error) { +func (t SubscriptionItem_Price) MarshalJSON() ([]byte, error) { b, err := t.union.MarshalJSON() return b, err } -func (t *SubscriptionCreate) UnmarshalJSON(b []byte) error { +func (t *SubscriptionItem_Price) UnmarshalJSON(b []byte) error { err := t.union.UnmarshalJSON(b) return err } -// AsSubscriptionItemPrice0 returns the union data inside the SubscriptionItem_Price as a SubscriptionItemPrice0 -func (t SubscriptionItem_Price) AsSubscriptionItemPrice0() (SubscriptionItemPrice0, error) { - var body SubscriptionItemPrice0 +// AsVoidInvoiceLineDiscardAction returns the union data inside the VoidInvoiceLineActionCreate as a VoidInvoiceLineDiscardAction +func (t VoidInvoiceLineActionCreate) AsVoidInvoiceLineDiscardAction() (VoidInvoiceLineDiscardAction, error) { + var body VoidInvoiceLineDiscardAction err := json.Unmarshal(t.union, &body) return body, err } -// FromSubscriptionItemPrice0 overwrites any union data inside the SubscriptionItem_Price as the provided SubscriptionItemPrice0 -func (t *SubscriptionItem_Price) FromSubscriptionItemPrice0(v SubscriptionItemPrice0) error { +// FromVoidInvoiceLineDiscardAction overwrites any union data inside the VoidInvoiceLineActionCreate as the provided VoidInvoiceLineDiscardAction +func (t *VoidInvoiceLineActionCreate) FromVoidInvoiceLineDiscardAction(v VoidInvoiceLineDiscardAction) error { + v.Type = "discard" b, err := json.Marshal(v) t.union = b return err } -// MergeSubscriptionItemPrice0 performs a merge with any union data inside the SubscriptionItem_Price, using the provided SubscriptionItemPrice0 -func (t *SubscriptionItem_Price) MergeSubscriptionItemPrice0(v SubscriptionItemPrice0) error { +// MergeVoidInvoiceLineDiscardAction performs a merge with any union data inside the VoidInvoiceLineActionCreate, using the provided VoidInvoiceLineDiscardAction +func (t *VoidInvoiceLineActionCreate) MergeVoidInvoiceLineDiscardAction(v VoidInvoiceLineDiscardAction) error { + v.Type = "discard" b, err := json.Marshal(v) if err != nil { return err @@ -6860,22 +7129,24 @@ func (t *SubscriptionItem_Price) MergeSubscriptionItemPrice0(v SubscriptionItemP return err } -// AsSubscriptionItemPrice1 returns the union data inside the SubscriptionItem_Price as a SubscriptionItemPrice1 -func (t SubscriptionItem_Price) AsSubscriptionItemPrice1() (SubscriptionItemPrice1, error) { - var body SubscriptionItemPrice1 +// AsVoidInvoiceLinePendingActionCreate returns the union data inside the VoidInvoiceLineActionCreate as a VoidInvoiceLinePendingActionCreate +func (t VoidInvoiceLineActionCreate) AsVoidInvoiceLinePendingActionCreate() (VoidInvoiceLinePendingActionCreate, error) { + var body VoidInvoiceLinePendingActionCreate err := json.Unmarshal(t.union, &body) return body, err } -// FromSubscriptionItemPrice1 overwrites any union data inside the SubscriptionItem_Price as the provided SubscriptionItemPrice1 -func (t *SubscriptionItem_Price) FromSubscriptionItemPrice1(v SubscriptionItemPrice1) error { +// FromVoidInvoiceLinePendingActionCreate overwrites any union data inside the VoidInvoiceLineActionCreate as the provided VoidInvoiceLinePendingActionCreate +func (t *VoidInvoiceLineActionCreate) FromVoidInvoiceLinePendingActionCreate(v VoidInvoiceLinePendingActionCreate) error { + v.Type = "pending" b, err := json.Marshal(v) t.union = b return err } -// MergeSubscriptionItemPrice1 performs a merge with any union data inside the SubscriptionItem_Price, using the provided SubscriptionItemPrice1 -func (t *SubscriptionItem_Price) MergeSubscriptionItemPrice1(v SubscriptionItemPrice1) error { +// MergeVoidInvoiceLinePendingActionCreate performs a merge with any union data inside the VoidInvoiceLineActionCreate, using the provided VoidInvoiceLinePendingActionCreate +func (t *VoidInvoiceLineActionCreate) MergeVoidInvoiceLinePendingActionCreate(v VoidInvoiceLinePendingActionCreate) error { + v.Type = "pending" b, err := json.Marshal(v) if err != nil { return err @@ -6886,22 +7157,57 @@ func (t *SubscriptionItem_Price) MergeSubscriptionItemPrice1(v SubscriptionItemP return err } -// AsSubscriptionItemPrice2 returns the union data inside the SubscriptionItem_Price as a SubscriptionItemPrice2 -func (t SubscriptionItem_Price) AsSubscriptionItemPrice2() (SubscriptionItemPrice2, error) { - var body SubscriptionItemPrice2 +func (t VoidInvoiceLineActionCreate) Discriminator() (string, error) { + var discriminator struct { + Discriminator string `json:"type"` + } + err := json.Unmarshal(t.union, &discriminator) + return discriminator.Discriminator, err +} + +func (t VoidInvoiceLineActionCreate) ValueByDiscriminator() (interface{}, error) { + discriminator, err := t.Discriminator() + if err != nil { + return nil, err + } + switch discriminator { + case "discard": + return t.AsVoidInvoiceLineDiscardAction() + case "pending": + return t.AsVoidInvoiceLinePendingActionCreate() + default: + return nil, errors.New("unknown discriminator value: " + discriminator) + } +} + +func (t VoidInvoiceLineActionCreate) MarshalJSON() ([]byte, error) { + b, err := t.union.MarshalJSON() + return b, err +} + +func (t *VoidInvoiceLineActionCreate) UnmarshalJSON(b []byte) error { + err := t.union.UnmarshalJSON(b) + return err +} + +// AsVoidInvoiceLineDiscardAction returns the union data inside the VoidInvoiceLineActionCreateItem as a VoidInvoiceLineDiscardAction +func (t VoidInvoiceLineActionCreateItem) AsVoidInvoiceLineDiscardAction() (VoidInvoiceLineDiscardAction, error) { + var body VoidInvoiceLineDiscardAction err := json.Unmarshal(t.union, &body) return body, err } -// FromSubscriptionItemPrice2 overwrites any union data inside the SubscriptionItem_Price as the provided SubscriptionItemPrice2 -func (t *SubscriptionItem_Price) FromSubscriptionItemPrice2(v SubscriptionItemPrice2) error { +// FromVoidInvoiceLineDiscardAction overwrites any union data inside the VoidInvoiceLineActionCreateItem as the provided VoidInvoiceLineDiscardAction +func (t *VoidInvoiceLineActionCreateItem) FromVoidInvoiceLineDiscardAction(v VoidInvoiceLineDiscardAction) error { + v.Type = "discard" b, err := json.Marshal(v) t.union = b return err } -// MergeSubscriptionItemPrice2 performs a merge with any union data inside the SubscriptionItem_Price, using the provided SubscriptionItemPrice2 -func (t *SubscriptionItem_Price) MergeSubscriptionItemPrice2(v SubscriptionItemPrice2) error { +// MergeVoidInvoiceLineDiscardAction performs a merge with any union data inside the VoidInvoiceLineActionCreateItem, using the provided VoidInvoiceLineDiscardAction +func (t *VoidInvoiceLineActionCreateItem) MergeVoidInvoiceLineDiscardAction(v VoidInvoiceLineDiscardAction) error { + v.Type = "discard" b, err := json.Marshal(v) if err != nil { return err @@ -6912,22 +7218,24 @@ func (t *SubscriptionItem_Price) MergeSubscriptionItemPrice2(v SubscriptionItemP return err } -// AsSubscriptionItemPrice3 returns the union data inside the SubscriptionItem_Price as a SubscriptionItemPrice3 -func (t SubscriptionItem_Price) AsSubscriptionItemPrice3() (SubscriptionItemPrice3, error) { - var body SubscriptionItemPrice3 +// AsVoidInvoiceLinePendingActionCreateItem returns the union data inside the VoidInvoiceLineActionCreateItem as a VoidInvoiceLinePendingActionCreateItem +func (t VoidInvoiceLineActionCreateItem) AsVoidInvoiceLinePendingActionCreateItem() (VoidInvoiceLinePendingActionCreateItem, error) { + var body VoidInvoiceLinePendingActionCreateItem err := json.Unmarshal(t.union, &body) return body, err } -// FromSubscriptionItemPrice3 overwrites any union data inside the SubscriptionItem_Price as the provided SubscriptionItemPrice3 -func (t *SubscriptionItem_Price) FromSubscriptionItemPrice3(v SubscriptionItemPrice3) error { +// FromVoidInvoiceLinePendingActionCreateItem overwrites any union data inside the VoidInvoiceLineActionCreateItem as the provided VoidInvoiceLinePendingActionCreateItem +func (t *VoidInvoiceLineActionCreateItem) FromVoidInvoiceLinePendingActionCreateItem(v VoidInvoiceLinePendingActionCreateItem) error { + v.Type = "pending" b, err := json.Marshal(v) t.union = b return err } -// MergeSubscriptionItemPrice3 performs a merge with any union data inside the SubscriptionItem_Price, using the provided SubscriptionItemPrice3 -func (t *SubscriptionItem_Price) MergeSubscriptionItemPrice3(v SubscriptionItemPrice3) error { +// MergeVoidInvoiceLinePendingActionCreateItem performs a merge with any union data inside the VoidInvoiceLineActionCreateItem, using the provided VoidInvoiceLinePendingActionCreateItem +func (t *VoidInvoiceLineActionCreateItem) MergeVoidInvoiceLinePendingActionCreateItem(v VoidInvoiceLinePendingActionCreateItem) error { + v.Type = "pending" b, err := json.Marshal(v) if err != nil { return err @@ -6938,12 +7246,35 @@ func (t *SubscriptionItem_Price) MergeSubscriptionItemPrice3(v SubscriptionItemP return err } -func (t SubscriptionItem_Price) MarshalJSON() ([]byte, error) { +func (t VoidInvoiceLineActionCreateItem) Discriminator() (string, error) { + var discriminator struct { + Discriminator string `json:"type"` + } + err := json.Unmarshal(t.union, &discriminator) + return discriminator.Discriminator, err +} + +func (t VoidInvoiceLineActionCreateItem) ValueByDiscriminator() (interface{}, error) { + discriminator, err := t.Discriminator() + if err != nil { + return nil, err + } + switch discriminator { + case "discard": + return t.AsVoidInvoiceLineDiscardAction() + case "pending": + return t.AsVoidInvoiceLinePendingActionCreateItem() + default: + return nil, errors.New("unknown discriminator value: " + discriminator) + } +} + +func (t VoidInvoiceLineActionCreateItem) MarshalJSON() ([]byte, error) { b, err := t.union.MarshalJSON() return b, err } -func (t *SubscriptionItem_Price) UnmarshalJSON(b []byte) error { +func (t *VoidInvoiceLineActionCreateItem) UnmarshalJSON(b []byte) error { err := t.union.UnmarshalJSON(b) return err } @@ -7035,88 +7366,88 @@ type ClientInterface interface { AppStripeWebhook(ctx context.Context, id string, body AppStripeWebhookJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) - // BillingListCustomerOverrides request - BillingListCustomerOverrides(ctx context.Context, params *BillingListCustomerOverridesParams, reqEditors ...RequestEditorFn) (*http.Response, error) + // ListBillingProfileCustomerOverrides request + ListBillingProfileCustomerOverrides(ctx context.Context, params *ListBillingProfileCustomerOverridesParams, reqEditors ...RequestEditorFn) (*http.Response, error) - // BillingDeleteCustomerOverride request - BillingDeleteCustomerOverride(ctx context.Context, customerId string, reqEditors ...RequestEditorFn) (*http.Response, error) + // DeleteBillingProfileCustomerOverride request + DeleteBillingProfileCustomerOverride(ctx context.Context, customerId string, reqEditors ...RequestEditorFn) (*http.Response, error) - // BillingGetCustomerOverrideById request - BillingGetCustomerOverrideById(ctx context.Context, customerId string, reqEditors ...RequestEditorFn) (*http.Response, error) + // GetBillingProfileCustomerOverride request + GetBillingProfileCustomerOverride(ctx context.Context, customerId string, reqEditors ...RequestEditorFn) (*http.Response, error) - // BillingUpsertCustomerOverrideWithBody request with any body - BillingUpsertCustomerOverrideWithBody(ctx context.Context, customerId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) + // UpsertBillingProfileCustomerOverrideWithBody request with any body + UpsertBillingProfileCustomerOverrideWithBody(ctx context.Context, customerId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) - BillingUpsertCustomerOverride(ctx context.Context, customerId string, body BillingUpsertCustomerOverrideJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) + UpsertBillingProfileCustomerOverride(ctx context.Context, customerId string, body UpsertBillingProfileCustomerOverrideJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) - // BillingListInvoices request - BillingListInvoices(ctx context.Context, params *BillingListInvoicesParams, reqEditors ...RequestEditorFn) (*http.Response, error) + // ListInvoices request + ListInvoices(ctx context.Context, params *ListInvoicesParams, reqEditors ...RequestEditorFn) (*http.Response, error) - // BillingListInvoicesByCustomer request - BillingListInvoicesByCustomer(ctx context.Context, customerId string, params *BillingListInvoicesByCustomerParams, reqEditors ...RequestEditorFn) (*http.Response, error) + // ListInvoicesByCustomer request + ListInvoicesByCustomer(ctx context.Context, customerId string, params *ListInvoicesByCustomerParams, reqEditors ...RequestEditorFn) (*http.Response, error) - // BillingCreateInvoiceWithBody request with any body - BillingCreateInvoiceWithBody(ctx context.Context, customerId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) + // InvoicePendingLinesActionWithBody request with any body + InvoicePendingLinesActionWithBody(ctx context.Context, customerId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) - BillingCreateInvoice(ctx context.Context, customerId string, body BillingCreateInvoiceJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) + InvoicePendingLinesAction(ctx context.Context, customerId string, body InvoicePendingLinesActionJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) - // BillingDeleteInvoiceByCustomerInvoiceId request - BillingDeleteInvoiceByCustomerInvoiceId(ctx context.Context, customerId string, invoiceId string, reqEditors ...RequestEditorFn) (*http.Response, error) + // DeleteInvoice request + DeleteInvoice(ctx context.Context, customerId string, invoiceId string, reqEditors ...RequestEditorFn) (*http.Response, error) - // BillingGetInvoiceByCustomerInvoiceId request - BillingGetInvoiceByCustomerInvoiceId(ctx context.Context, customerId string, invoiceId string, params *BillingGetInvoiceByCustomerInvoiceIdParams, reqEditors ...RequestEditorFn) (*http.Response, error) + // GetInvoice request + GetInvoice(ctx context.Context, customerId string, invoiceId string, params *GetInvoiceParams, reqEditors ...RequestEditorFn) (*http.Response, error) - // BillingInvoiceAdvance request - BillingInvoiceAdvance(ctx context.Context, customerId string, invoiceId string, reqEditors ...RequestEditorFn) (*http.Response, error) + // AdvanceInvoiceAction request + AdvanceInvoiceAction(ctx context.Context, customerId string, invoiceId string, reqEditors ...RequestEditorFn) (*http.Response, error) - // BillingApproveInvoice request - BillingApproveInvoice(ctx context.Context, customerId string, invoiceId string, reqEditors ...RequestEditorFn) (*http.Response, error) + // ApproveInvoiceAction request + ApproveInvoiceAction(ctx context.Context, customerId string, invoiceId string, reqEditors ...RequestEditorFn) (*http.Response, error) - // BillingDeleteInvoiceLine request - BillingDeleteInvoiceLine(ctx context.Context, customerId string, invoiceId string, lineId string, reqEditors ...RequestEditorFn) (*http.Response, error) + // DeleteInvoiceLine request + DeleteInvoiceLine(ctx context.Context, customerId string, invoiceId string, lineId string, reqEditors ...RequestEditorFn) (*http.Response, error) - // BillingGetInvoiceLine request - BillingGetInvoiceLine(ctx context.Context, customerId string, invoiceId string, lineId string, reqEditors ...RequestEditorFn) (*http.Response, error) + // GetInvoiceLine request + GetInvoiceLine(ctx context.Context, customerId string, invoiceId string, lineId string, reqEditors ...RequestEditorFn) (*http.Response, error) - // BillingUpdateInvoiceLineWithBody request with any body - BillingUpdateInvoiceLineWithBody(ctx context.Context, customerId string, invoiceId string, lineId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) + // UpdateInvoiceLineWithBody request with any body + UpdateInvoiceLineWithBody(ctx context.Context, customerId string, invoiceId string, lineId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) - BillingUpdateInvoiceLine(ctx context.Context, customerId string, invoiceId string, lineId string, body BillingUpdateInvoiceLineJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) + UpdateInvoiceLine(ctx context.Context, customerId string, invoiceId string, lineId string, body UpdateInvoiceLineJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) - // BillingInvoiceRetry request - BillingInvoiceRetry(ctx context.Context, customerId string, invoiceId string, reqEditors ...RequestEditorFn) (*http.Response, error) + // RetryInvoiceAction request + RetryInvoiceAction(ctx context.Context, customerId string, invoiceId string, reqEditors ...RequestEditorFn) (*http.Response, error) - // BillingRecalculateInvoiceTax request - BillingRecalculateInvoiceTax(ctx context.Context, customerId string, invoiceId string, reqEditors ...RequestEditorFn) (*http.Response, error) + // RecalculateInvoiceTaxAction request + RecalculateInvoiceTaxAction(ctx context.Context, customerId string, invoiceId string, reqEditors ...RequestEditorFn) (*http.Response, error) - // BillingVoidInvoiceWithBody request with any body - BillingVoidInvoiceWithBody(ctx context.Context, customerId string, invoiceId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) + // VoidInvoiceActionWithBody request with any body + VoidInvoiceActionWithBody(ctx context.Context, customerId string, invoiceId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) - BillingVoidInvoice(ctx context.Context, customerId string, invoiceId string, body BillingVoidInvoiceJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) + VoidInvoiceAction(ctx context.Context, customerId string, invoiceId string, body VoidInvoiceActionJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) - // BillingCreateLineByCustomerWithBody request with any body - BillingCreateLineByCustomerWithBody(ctx context.Context, customerId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) + // CreateInvoiceLineByCustomerWithBody request with any body + CreateInvoiceLineByCustomerWithBody(ctx context.Context, customerId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) - BillingCreateLineByCustomer(ctx context.Context, customerId string, body BillingCreateLineByCustomerJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) + CreateInvoiceLineByCustomer(ctx context.Context, customerId string, body CreateInvoiceLineByCustomerJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) - // BillingListProfiles request - BillingListProfiles(ctx context.Context, params *BillingListProfilesParams, reqEditors ...RequestEditorFn) (*http.Response, error) + // ListBillingProfiles request + ListBillingProfiles(ctx context.Context, params *ListBillingProfilesParams, reqEditors ...RequestEditorFn) (*http.Response, error) - // BillingCreateProfileWithBody request with any body - BillingCreateProfileWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) + // CreateBillingProfileWithBody request with any body + CreateBillingProfileWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) - BillingCreateProfile(ctx context.Context, body BillingCreateProfileJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) + CreateBillingProfile(ctx context.Context, body CreateBillingProfileJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) - // BillingArchiveProfile request - BillingArchiveProfile(ctx context.Context, id string, reqEditors ...RequestEditorFn) (*http.Response, error) + // DeleteBillingProfile request + DeleteBillingProfile(ctx context.Context, id string, reqEditors ...RequestEditorFn) (*http.Response, error) - // BillingGetProfile request - BillingGetProfile(ctx context.Context, id string, params *BillingGetProfileParams, reqEditors ...RequestEditorFn) (*http.Response, error) + // GetBillingProfile request + GetBillingProfile(ctx context.Context, id string, params *GetBillingProfileParams, reqEditors ...RequestEditorFn) (*http.Response, error) - // BillingUpdateProfileWithBody request with any body - BillingUpdateProfileWithBody(ctx context.Context, id string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) + // UpdateBillingProfileWithBody request with any body + UpdateBillingProfileWithBody(ctx context.Context, id string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) - BillingUpdateProfile(ctx context.Context, id string, body BillingUpdateProfileJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) + UpdateBillingProfile(ctx context.Context, id string, body UpdateBillingProfileJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) // ListCustomers request ListCustomers(ctx context.Context, params *ListCustomersParams, reqEditors ...RequestEditorFn) (*http.Response, error) @@ -7490,8 +7821,8 @@ func (c *Client) AppStripeWebhook(ctx context.Context, id string, body AppStripe return c.Client.Do(req) } -func (c *Client) BillingListCustomerOverrides(ctx context.Context, params *BillingListCustomerOverridesParams, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewBillingListCustomerOverridesRequest(c.Server, params) +func (c *Client) ListBillingProfileCustomerOverrides(ctx context.Context, params *ListBillingProfileCustomerOverridesParams, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewListBillingProfileCustomerOverridesRequest(c.Server, params) if err != nil { return nil, err } @@ -7502,8 +7833,8 @@ func (c *Client) BillingListCustomerOverrides(ctx context.Context, params *Billi return c.Client.Do(req) } -func (c *Client) BillingDeleteCustomerOverride(ctx context.Context, customerId string, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewBillingDeleteCustomerOverrideRequest(c.Server, customerId) +func (c *Client) DeleteBillingProfileCustomerOverride(ctx context.Context, customerId string, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewDeleteBillingProfileCustomerOverrideRequest(c.Server, customerId) if err != nil { return nil, err } @@ -7514,8 +7845,8 @@ func (c *Client) BillingDeleteCustomerOverride(ctx context.Context, customerId s return c.Client.Do(req) } -func (c *Client) BillingGetCustomerOverrideById(ctx context.Context, customerId string, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewBillingGetCustomerOverrideByIdRequest(c.Server, customerId) +func (c *Client) GetBillingProfileCustomerOverride(ctx context.Context, customerId string, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewGetBillingProfileCustomerOverrideRequest(c.Server, customerId) if err != nil { return nil, err } @@ -7526,8 +7857,8 @@ func (c *Client) BillingGetCustomerOverrideById(ctx context.Context, customerId return c.Client.Do(req) } -func (c *Client) BillingUpsertCustomerOverrideWithBody(ctx context.Context, customerId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewBillingUpsertCustomerOverrideRequestWithBody(c.Server, customerId, contentType, body) +func (c *Client) UpsertBillingProfileCustomerOverrideWithBody(ctx context.Context, customerId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewUpsertBillingProfileCustomerOverrideRequestWithBody(c.Server, customerId, contentType, body) if err != nil { return nil, err } @@ -7538,8 +7869,8 @@ func (c *Client) BillingUpsertCustomerOverrideWithBody(ctx context.Context, cust return c.Client.Do(req) } -func (c *Client) BillingUpsertCustomerOverride(ctx context.Context, customerId string, body BillingUpsertCustomerOverrideJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewBillingUpsertCustomerOverrideRequest(c.Server, customerId, body) +func (c *Client) UpsertBillingProfileCustomerOverride(ctx context.Context, customerId string, body UpsertBillingProfileCustomerOverrideJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewUpsertBillingProfileCustomerOverrideRequest(c.Server, customerId, body) if err != nil { return nil, err } @@ -7550,8 +7881,8 @@ func (c *Client) BillingUpsertCustomerOverride(ctx context.Context, customerId s return c.Client.Do(req) } -func (c *Client) BillingListInvoices(ctx context.Context, params *BillingListInvoicesParams, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewBillingListInvoicesRequest(c.Server, params) +func (c *Client) ListInvoices(ctx context.Context, params *ListInvoicesParams, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewListInvoicesRequest(c.Server, params) if err != nil { return nil, err } @@ -7562,8 +7893,8 @@ func (c *Client) BillingListInvoices(ctx context.Context, params *BillingListInv return c.Client.Do(req) } -func (c *Client) BillingListInvoicesByCustomer(ctx context.Context, customerId string, params *BillingListInvoicesByCustomerParams, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewBillingListInvoicesByCustomerRequest(c.Server, customerId, params) +func (c *Client) ListInvoicesByCustomer(ctx context.Context, customerId string, params *ListInvoicesByCustomerParams, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewListInvoicesByCustomerRequest(c.Server, customerId, params) if err != nil { return nil, err } @@ -7574,8 +7905,8 @@ func (c *Client) BillingListInvoicesByCustomer(ctx context.Context, customerId s return c.Client.Do(req) } -func (c *Client) BillingCreateInvoiceWithBody(ctx context.Context, customerId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewBillingCreateInvoiceRequestWithBody(c.Server, customerId, contentType, body) +func (c *Client) InvoicePendingLinesActionWithBody(ctx context.Context, customerId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewInvoicePendingLinesActionRequestWithBody(c.Server, customerId, contentType, body) if err != nil { return nil, err } @@ -7586,8 +7917,8 @@ func (c *Client) BillingCreateInvoiceWithBody(ctx context.Context, customerId st return c.Client.Do(req) } -func (c *Client) BillingCreateInvoice(ctx context.Context, customerId string, body BillingCreateInvoiceJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewBillingCreateInvoiceRequest(c.Server, customerId, body) +func (c *Client) InvoicePendingLinesAction(ctx context.Context, customerId string, body InvoicePendingLinesActionJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewInvoicePendingLinesActionRequest(c.Server, customerId, body) if err != nil { return nil, err } @@ -7598,8 +7929,8 @@ func (c *Client) BillingCreateInvoice(ctx context.Context, customerId string, bo return c.Client.Do(req) } -func (c *Client) BillingDeleteInvoiceByCustomerInvoiceId(ctx context.Context, customerId string, invoiceId string, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewBillingDeleteInvoiceByCustomerInvoiceIdRequest(c.Server, customerId, invoiceId) +func (c *Client) DeleteInvoice(ctx context.Context, customerId string, invoiceId string, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewDeleteInvoiceRequest(c.Server, customerId, invoiceId) if err != nil { return nil, err } @@ -7610,8 +7941,8 @@ func (c *Client) BillingDeleteInvoiceByCustomerInvoiceId(ctx context.Context, cu return c.Client.Do(req) } -func (c *Client) BillingGetInvoiceByCustomerInvoiceId(ctx context.Context, customerId string, invoiceId string, params *BillingGetInvoiceByCustomerInvoiceIdParams, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewBillingGetInvoiceByCustomerInvoiceIdRequest(c.Server, customerId, invoiceId, params) +func (c *Client) GetInvoice(ctx context.Context, customerId string, invoiceId string, params *GetInvoiceParams, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewGetInvoiceRequest(c.Server, customerId, invoiceId, params) if err != nil { return nil, err } @@ -7622,8 +7953,8 @@ func (c *Client) BillingGetInvoiceByCustomerInvoiceId(ctx context.Context, custo return c.Client.Do(req) } -func (c *Client) BillingInvoiceAdvance(ctx context.Context, customerId string, invoiceId string, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewBillingInvoiceAdvanceRequest(c.Server, customerId, invoiceId) +func (c *Client) AdvanceInvoiceAction(ctx context.Context, customerId string, invoiceId string, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewAdvanceInvoiceActionRequest(c.Server, customerId, invoiceId) if err != nil { return nil, err } @@ -7634,8 +7965,8 @@ func (c *Client) BillingInvoiceAdvance(ctx context.Context, customerId string, i return c.Client.Do(req) } -func (c *Client) BillingApproveInvoice(ctx context.Context, customerId string, invoiceId string, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewBillingApproveInvoiceRequest(c.Server, customerId, invoiceId) +func (c *Client) ApproveInvoiceAction(ctx context.Context, customerId string, invoiceId string, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewApproveInvoiceActionRequest(c.Server, customerId, invoiceId) if err != nil { return nil, err } @@ -7646,8 +7977,8 @@ func (c *Client) BillingApproveInvoice(ctx context.Context, customerId string, i return c.Client.Do(req) } -func (c *Client) BillingDeleteInvoiceLine(ctx context.Context, customerId string, invoiceId string, lineId string, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewBillingDeleteInvoiceLineRequest(c.Server, customerId, invoiceId, lineId) +func (c *Client) DeleteInvoiceLine(ctx context.Context, customerId string, invoiceId string, lineId string, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewDeleteInvoiceLineRequest(c.Server, customerId, invoiceId, lineId) if err != nil { return nil, err } @@ -7658,8 +7989,8 @@ func (c *Client) BillingDeleteInvoiceLine(ctx context.Context, customerId string return c.Client.Do(req) } -func (c *Client) BillingGetInvoiceLine(ctx context.Context, customerId string, invoiceId string, lineId string, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewBillingGetInvoiceLineRequest(c.Server, customerId, invoiceId, lineId) +func (c *Client) GetInvoiceLine(ctx context.Context, customerId string, invoiceId string, lineId string, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewGetInvoiceLineRequest(c.Server, customerId, invoiceId, lineId) if err != nil { return nil, err } @@ -7670,8 +8001,8 @@ func (c *Client) BillingGetInvoiceLine(ctx context.Context, customerId string, i return c.Client.Do(req) } -func (c *Client) BillingUpdateInvoiceLineWithBody(ctx context.Context, customerId string, invoiceId string, lineId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewBillingUpdateInvoiceLineRequestWithBody(c.Server, customerId, invoiceId, lineId, contentType, body) +func (c *Client) UpdateInvoiceLineWithBody(ctx context.Context, customerId string, invoiceId string, lineId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewUpdateInvoiceLineRequestWithBody(c.Server, customerId, invoiceId, lineId, contentType, body) if err != nil { return nil, err } @@ -7682,8 +8013,8 @@ func (c *Client) BillingUpdateInvoiceLineWithBody(ctx context.Context, customerI return c.Client.Do(req) } -func (c *Client) BillingUpdateInvoiceLine(ctx context.Context, customerId string, invoiceId string, lineId string, body BillingUpdateInvoiceLineJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewBillingUpdateInvoiceLineRequest(c.Server, customerId, invoiceId, lineId, body) +func (c *Client) UpdateInvoiceLine(ctx context.Context, customerId string, invoiceId string, lineId string, body UpdateInvoiceLineJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewUpdateInvoiceLineRequest(c.Server, customerId, invoiceId, lineId, body) if err != nil { return nil, err } @@ -7694,8 +8025,8 @@ func (c *Client) BillingUpdateInvoiceLine(ctx context.Context, customerId string return c.Client.Do(req) } -func (c *Client) BillingInvoiceRetry(ctx context.Context, customerId string, invoiceId string, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewBillingInvoiceRetryRequest(c.Server, customerId, invoiceId) +func (c *Client) RetryInvoiceAction(ctx context.Context, customerId string, invoiceId string, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewRetryInvoiceActionRequest(c.Server, customerId, invoiceId) if err != nil { return nil, err } @@ -7706,8 +8037,8 @@ func (c *Client) BillingInvoiceRetry(ctx context.Context, customerId string, inv return c.Client.Do(req) } -func (c *Client) BillingRecalculateInvoiceTax(ctx context.Context, customerId string, invoiceId string, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewBillingRecalculateInvoiceTaxRequest(c.Server, customerId, invoiceId) +func (c *Client) RecalculateInvoiceTaxAction(ctx context.Context, customerId string, invoiceId string, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewRecalculateInvoiceTaxActionRequest(c.Server, customerId, invoiceId) if err != nil { return nil, err } @@ -7718,8 +8049,8 @@ func (c *Client) BillingRecalculateInvoiceTax(ctx context.Context, customerId st return c.Client.Do(req) } -func (c *Client) BillingVoidInvoiceWithBody(ctx context.Context, customerId string, invoiceId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewBillingVoidInvoiceRequestWithBody(c.Server, customerId, invoiceId, contentType, body) +func (c *Client) VoidInvoiceActionWithBody(ctx context.Context, customerId string, invoiceId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewVoidInvoiceActionRequestWithBody(c.Server, customerId, invoiceId, contentType, body) if err != nil { return nil, err } @@ -7730,8 +8061,8 @@ func (c *Client) BillingVoidInvoiceWithBody(ctx context.Context, customerId stri return c.Client.Do(req) } -func (c *Client) BillingVoidInvoice(ctx context.Context, customerId string, invoiceId string, body BillingVoidInvoiceJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewBillingVoidInvoiceRequest(c.Server, customerId, invoiceId, body) +func (c *Client) VoidInvoiceAction(ctx context.Context, customerId string, invoiceId string, body VoidInvoiceActionJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewVoidInvoiceActionRequest(c.Server, customerId, invoiceId, body) if err != nil { return nil, err } @@ -7742,8 +8073,8 @@ func (c *Client) BillingVoidInvoice(ctx context.Context, customerId string, invo return c.Client.Do(req) } -func (c *Client) BillingCreateLineByCustomerWithBody(ctx context.Context, customerId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewBillingCreateLineByCustomerRequestWithBody(c.Server, customerId, contentType, body) +func (c *Client) CreateInvoiceLineByCustomerWithBody(ctx context.Context, customerId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewCreateInvoiceLineByCustomerRequestWithBody(c.Server, customerId, contentType, body) if err != nil { return nil, err } @@ -7754,8 +8085,8 @@ func (c *Client) BillingCreateLineByCustomerWithBody(ctx context.Context, custom return c.Client.Do(req) } -func (c *Client) BillingCreateLineByCustomer(ctx context.Context, customerId string, body BillingCreateLineByCustomerJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewBillingCreateLineByCustomerRequest(c.Server, customerId, body) +func (c *Client) CreateInvoiceLineByCustomer(ctx context.Context, customerId string, body CreateInvoiceLineByCustomerJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewCreateInvoiceLineByCustomerRequest(c.Server, customerId, body) if err != nil { return nil, err } @@ -7766,8 +8097,8 @@ func (c *Client) BillingCreateLineByCustomer(ctx context.Context, customerId str return c.Client.Do(req) } -func (c *Client) BillingListProfiles(ctx context.Context, params *BillingListProfilesParams, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewBillingListProfilesRequest(c.Server, params) +func (c *Client) ListBillingProfiles(ctx context.Context, params *ListBillingProfilesParams, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewListBillingProfilesRequest(c.Server, params) if err != nil { return nil, err } @@ -7778,8 +8109,8 @@ func (c *Client) BillingListProfiles(ctx context.Context, params *BillingListPro return c.Client.Do(req) } -func (c *Client) BillingCreateProfileWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewBillingCreateProfileRequestWithBody(c.Server, contentType, body) +func (c *Client) CreateBillingProfileWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewCreateBillingProfileRequestWithBody(c.Server, contentType, body) if err != nil { return nil, err } @@ -7790,8 +8121,8 @@ func (c *Client) BillingCreateProfileWithBody(ctx context.Context, contentType s return c.Client.Do(req) } -func (c *Client) BillingCreateProfile(ctx context.Context, body BillingCreateProfileJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewBillingCreateProfileRequest(c.Server, body) +func (c *Client) CreateBillingProfile(ctx context.Context, body CreateBillingProfileJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewCreateBillingProfileRequest(c.Server, body) if err != nil { return nil, err } @@ -7802,8 +8133,8 @@ func (c *Client) BillingCreateProfile(ctx context.Context, body BillingCreatePro return c.Client.Do(req) } -func (c *Client) BillingArchiveProfile(ctx context.Context, id string, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewBillingArchiveProfileRequest(c.Server, id) +func (c *Client) DeleteBillingProfile(ctx context.Context, id string, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewDeleteBillingProfileRequest(c.Server, id) if err != nil { return nil, err } @@ -7814,8 +8145,8 @@ func (c *Client) BillingArchiveProfile(ctx context.Context, id string, reqEditor return c.Client.Do(req) } -func (c *Client) BillingGetProfile(ctx context.Context, id string, params *BillingGetProfileParams, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewBillingGetProfileRequest(c.Server, id, params) +func (c *Client) GetBillingProfile(ctx context.Context, id string, params *GetBillingProfileParams, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewGetBillingProfileRequest(c.Server, id, params) if err != nil { return nil, err } @@ -7826,8 +8157,8 @@ func (c *Client) BillingGetProfile(ctx context.Context, id string, params *Billi return c.Client.Do(req) } -func (c *Client) BillingUpdateProfileWithBody(ctx context.Context, id string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewBillingUpdateProfileRequestWithBody(c.Server, id, contentType, body) +func (c *Client) UpdateBillingProfileWithBody(ctx context.Context, id string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewUpdateBillingProfileRequestWithBody(c.Server, id, contentType, body) if err != nil { return nil, err } @@ -7838,8 +8169,8 @@ func (c *Client) BillingUpdateProfileWithBody(ctx context.Context, id string, co return c.Client.Do(req) } -func (c *Client) BillingUpdateProfile(ctx context.Context, id string, body BillingUpdateProfileJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewBillingUpdateProfileRequest(c.Server, id, body) +func (c *Client) UpdateBillingProfile(ctx context.Context, id string, body UpdateBillingProfileJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewUpdateBillingProfileRequest(c.Server, id, body) if err != nil { return nil, err } @@ -9398,8 +9729,8 @@ func NewAppStripeWebhookRequestWithBody(server string, id string, contentType st return req, nil } -// NewBillingListCustomerOverridesRequest generates requests for BillingListCustomerOverrides -func NewBillingListCustomerOverridesRequest(server string, params *BillingListCustomerOverridesParams) (*http.Request, error) { +// NewListBillingProfileCustomerOverridesRequest generates requests for ListBillingProfileCustomerOverrides +func NewListBillingProfileCustomerOverridesRequest(server string, params *ListBillingProfileCustomerOverridesParams) (*http.Request, error) { var err error serverURL, err := url.Parse(server) @@ -9543,8 +9874,8 @@ func NewBillingListCustomerOverridesRequest(server string, params *BillingListCu return req, nil } -// NewBillingDeleteCustomerOverrideRequest generates requests for BillingDeleteCustomerOverride -func NewBillingDeleteCustomerOverrideRequest(server string, customerId string) (*http.Request, error) { +// NewDeleteBillingProfileCustomerOverrideRequest generates requests for DeleteBillingProfileCustomerOverride +func NewDeleteBillingProfileCustomerOverrideRequest(server string, customerId string) (*http.Request, error) { var err error var pathParam0 string @@ -9577,8 +9908,8 @@ func NewBillingDeleteCustomerOverrideRequest(server string, customerId string) ( return req, nil } -// NewBillingGetCustomerOverrideByIdRequest generates requests for BillingGetCustomerOverrideById -func NewBillingGetCustomerOverrideByIdRequest(server string, customerId string) (*http.Request, error) { +// NewGetBillingProfileCustomerOverrideRequest generates requests for GetBillingProfileCustomerOverride +func NewGetBillingProfileCustomerOverrideRequest(server string, customerId string) (*http.Request, error) { var err error var pathParam0 string @@ -9611,19 +9942,19 @@ func NewBillingGetCustomerOverrideByIdRequest(server string, customerId string) return req, nil } -// NewBillingUpsertCustomerOverrideRequest calls the generic BillingUpsertCustomerOverride builder with application/json body -func NewBillingUpsertCustomerOverrideRequest(server string, customerId string, body BillingUpsertCustomerOverrideJSONRequestBody) (*http.Request, error) { +// NewUpsertBillingProfileCustomerOverrideRequest calls the generic UpsertBillingProfileCustomerOverride builder with application/json body +func NewUpsertBillingProfileCustomerOverrideRequest(server string, customerId string, body UpsertBillingProfileCustomerOverrideJSONRequestBody) (*http.Request, error) { var bodyReader io.Reader buf, err := json.Marshal(body) if err != nil { return nil, err } bodyReader = bytes.NewReader(buf) - return NewBillingUpsertCustomerOverrideRequestWithBody(server, customerId, "application/json", bodyReader) + return NewUpsertBillingProfileCustomerOverrideRequestWithBody(server, customerId, "application/json", bodyReader) } -// NewBillingUpsertCustomerOverrideRequestWithBody generates requests for BillingUpsertCustomerOverride with any type of body -func NewBillingUpsertCustomerOverrideRequestWithBody(server string, customerId string, contentType string, body io.Reader) (*http.Request, error) { +// NewUpsertBillingProfileCustomerOverrideRequestWithBody generates requests for UpsertBillingProfileCustomerOverride with any type of body +func NewUpsertBillingProfileCustomerOverrideRequestWithBody(server string, customerId string, contentType string, body io.Reader) (*http.Request, error) { var err error var pathParam0 string @@ -9658,8 +9989,8 @@ func NewBillingUpsertCustomerOverrideRequestWithBody(server string, customerId s return req, nil } -// NewBillingListInvoicesRequest generates requests for BillingListInvoices -func NewBillingListInvoicesRequest(server string, params *BillingListInvoicesParams) (*http.Request, error) { +// NewListInvoicesRequest generates requests for ListInvoices +func NewListInvoicesRequest(server string, params *ListInvoicesParams) (*http.Request, error) { var err error serverURL, err := url.Parse(server) @@ -9883,8 +10214,8 @@ func NewBillingListInvoicesRequest(server string, params *BillingListInvoicesPar return req, nil } -// NewBillingListInvoicesByCustomerRequest generates requests for BillingListInvoicesByCustomer -func NewBillingListInvoicesByCustomerRequest(server string, customerId string, params *BillingListInvoicesByCustomerParams) (*http.Request, error) { +// NewListInvoicesByCustomerRequest generates requests for ListInvoicesByCustomer +func NewListInvoicesByCustomerRequest(server string, customerId string, params *ListInvoicesByCustomerParams) (*http.Request, error) { var err error var pathParam0 string @@ -10099,19 +10430,19 @@ func NewBillingListInvoicesByCustomerRequest(server string, customerId string, p return req, nil } -// NewBillingCreateInvoiceRequest calls the generic BillingCreateInvoice builder with application/json body -func NewBillingCreateInvoiceRequest(server string, customerId string, body BillingCreateInvoiceJSONRequestBody) (*http.Request, error) { +// NewInvoicePendingLinesActionRequest calls the generic InvoicePendingLinesAction builder with application/json body +func NewInvoicePendingLinesActionRequest(server string, customerId string, body InvoicePendingLinesActionJSONRequestBody) (*http.Request, error) { var bodyReader io.Reader buf, err := json.Marshal(body) if err != nil { return nil, err } bodyReader = bytes.NewReader(buf) - return NewBillingCreateInvoiceRequestWithBody(server, customerId, "application/json", bodyReader) + return NewInvoicePendingLinesActionRequestWithBody(server, customerId, "application/json", bodyReader) } -// NewBillingCreateInvoiceRequestWithBody generates requests for BillingCreateInvoice with any type of body -func NewBillingCreateInvoiceRequestWithBody(server string, customerId string, contentType string, body io.Reader) (*http.Request, error) { +// NewInvoicePendingLinesActionRequestWithBody generates requests for InvoicePendingLinesAction with any type of body +func NewInvoicePendingLinesActionRequestWithBody(server string, customerId string, contentType string, body io.Reader) (*http.Request, error) { var err error var pathParam0 string @@ -10126,7 +10457,7 @@ func NewBillingCreateInvoiceRequestWithBody(server string, customerId string, co return nil, err } - operationPath := fmt.Sprintf("/api/v1/billing/invoices/%s", pathParam0) + operationPath := fmt.Sprintf("/api/v1/billing/invoices/%s/invoice", pathParam0) if operationPath[0] == '/' { operationPath = "." + operationPath } @@ -10146,8 +10477,8 @@ func NewBillingCreateInvoiceRequestWithBody(server string, customerId string, co return req, nil } -// NewBillingDeleteInvoiceByCustomerInvoiceIdRequest generates requests for BillingDeleteInvoiceByCustomerInvoiceId -func NewBillingDeleteInvoiceByCustomerInvoiceIdRequest(server string, customerId string, invoiceId string) (*http.Request, error) { +// NewDeleteInvoiceRequest generates requests for DeleteInvoice +func NewDeleteInvoiceRequest(server string, customerId string, invoiceId string) (*http.Request, error) { var err error var pathParam0 string @@ -10187,8 +10518,8 @@ func NewBillingDeleteInvoiceByCustomerInvoiceIdRequest(server string, customerId return req, nil } -// NewBillingGetInvoiceByCustomerInvoiceIdRequest generates requests for BillingGetInvoiceByCustomerInvoiceId -func NewBillingGetInvoiceByCustomerInvoiceIdRequest(server string, customerId string, invoiceId string, params *BillingGetInvoiceByCustomerInvoiceIdParams) (*http.Request, error) { +// NewGetInvoiceRequest generates requests for GetInvoice +func NewGetInvoiceRequest(server string, customerId string, invoiceId string, params *GetInvoiceParams) (*http.Request, error) { var err error var pathParam0 string @@ -10235,6 +10566,18 @@ func NewBillingGetInvoiceByCustomerInvoiceIdRequest(server string, customerId st } } + if queryFrag, err := runtime.StyleParamWithLocation("form", false, "includeDeletedLines", runtime.ParamLocationQuery, params.IncludeDeletedLines); err != nil { + return nil, err + } else if parsed, err := url.ParseQuery(queryFrag); err != nil { + return nil, err + } else { + for k, v := range parsed { + for _, v2 := range v { + queryValues.Add(k, v2) + } + } + } + queryURL.RawQuery = queryValues.Encode() } @@ -10246,8 +10589,8 @@ func NewBillingGetInvoiceByCustomerInvoiceIdRequest(server string, customerId st return req, nil } -// NewBillingInvoiceAdvanceRequest generates requests for BillingInvoiceAdvance -func NewBillingInvoiceAdvanceRequest(server string, customerId string, invoiceId string) (*http.Request, error) { +// NewAdvanceInvoiceActionRequest generates requests for AdvanceInvoiceAction +func NewAdvanceInvoiceActionRequest(server string, customerId string, invoiceId string) (*http.Request, error) { var err error var pathParam0 string @@ -10287,8 +10630,8 @@ func NewBillingInvoiceAdvanceRequest(server string, customerId string, invoiceId return req, nil } -// NewBillingApproveInvoiceRequest generates requests for BillingApproveInvoice -func NewBillingApproveInvoiceRequest(server string, customerId string, invoiceId string) (*http.Request, error) { +// NewApproveInvoiceActionRequest generates requests for ApproveInvoiceAction +func NewApproveInvoiceActionRequest(server string, customerId string, invoiceId string) (*http.Request, error) { var err error var pathParam0 string @@ -10328,8 +10671,8 @@ func NewBillingApproveInvoiceRequest(server string, customerId string, invoiceId return req, nil } -// NewBillingDeleteInvoiceLineRequest generates requests for BillingDeleteInvoiceLine -func NewBillingDeleteInvoiceLineRequest(server string, customerId string, invoiceId string, lineId string) (*http.Request, error) { +// NewDeleteInvoiceLineRequest generates requests for DeleteInvoiceLine +func NewDeleteInvoiceLineRequest(server string, customerId string, invoiceId string, lineId string) (*http.Request, error) { var err error var pathParam0 string @@ -10376,8 +10719,8 @@ func NewBillingDeleteInvoiceLineRequest(server string, customerId string, invoic return req, nil } -// NewBillingGetInvoiceLineRequest generates requests for BillingGetInvoiceLine -func NewBillingGetInvoiceLineRequest(server string, customerId string, invoiceId string, lineId string) (*http.Request, error) { +// NewGetInvoiceLineRequest generates requests for GetInvoiceLine +func NewGetInvoiceLineRequest(server string, customerId string, invoiceId string, lineId string) (*http.Request, error) { var err error var pathParam0 string @@ -10424,19 +10767,19 @@ func NewBillingGetInvoiceLineRequest(server string, customerId string, invoiceId return req, nil } -// NewBillingUpdateInvoiceLineRequest calls the generic BillingUpdateInvoiceLine builder with application/json body -func NewBillingUpdateInvoiceLineRequest(server string, customerId string, invoiceId string, lineId string, body BillingUpdateInvoiceLineJSONRequestBody) (*http.Request, error) { +// NewUpdateInvoiceLineRequest calls the generic UpdateInvoiceLine builder with application/json body +func NewUpdateInvoiceLineRequest(server string, customerId string, invoiceId string, lineId string, body UpdateInvoiceLineJSONRequestBody) (*http.Request, error) { var bodyReader io.Reader buf, err := json.Marshal(body) if err != nil { return nil, err } bodyReader = bytes.NewReader(buf) - return NewBillingUpdateInvoiceLineRequestWithBody(server, customerId, invoiceId, lineId, "application/json", bodyReader) + return NewUpdateInvoiceLineRequestWithBody(server, customerId, invoiceId, lineId, "application/json", bodyReader) } -// NewBillingUpdateInvoiceLineRequestWithBody generates requests for BillingUpdateInvoiceLine with any type of body -func NewBillingUpdateInvoiceLineRequestWithBody(server string, customerId string, invoiceId string, lineId string, contentType string, body io.Reader) (*http.Request, error) { +// NewUpdateInvoiceLineRequestWithBody generates requests for UpdateInvoiceLine with any type of body +func NewUpdateInvoiceLineRequestWithBody(server string, customerId string, invoiceId string, lineId string, contentType string, body io.Reader) (*http.Request, error) { var err error var pathParam0 string @@ -10485,8 +10828,8 @@ func NewBillingUpdateInvoiceLineRequestWithBody(server string, customerId string return req, nil } -// NewBillingInvoiceRetryRequest generates requests for BillingInvoiceRetry -func NewBillingInvoiceRetryRequest(server string, customerId string, invoiceId string) (*http.Request, error) { +// NewRetryInvoiceActionRequest generates requests for RetryInvoiceAction +func NewRetryInvoiceActionRequest(server string, customerId string, invoiceId string) (*http.Request, error) { var err error var pathParam0 string @@ -10526,8 +10869,8 @@ func NewBillingInvoiceRetryRequest(server string, customerId string, invoiceId s return req, nil } -// NewBillingRecalculateInvoiceTaxRequest generates requests for BillingRecalculateInvoiceTax -func NewBillingRecalculateInvoiceTaxRequest(server string, customerId string, invoiceId string) (*http.Request, error) { +// NewRecalculateInvoiceTaxActionRequest generates requests for RecalculateInvoiceTaxAction +func NewRecalculateInvoiceTaxActionRequest(server string, customerId string, invoiceId string) (*http.Request, error) { var err error var pathParam0 string @@ -10567,19 +10910,19 @@ func NewBillingRecalculateInvoiceTaxRequest(server string, customerId string, in return req, nil } -// NewBillingVoidInvoiceRequest calls the generic BillingVoidInvoice builder with application/json body -func NewBillingVoidInvoiceRequest(server string, customerId string, invoiceId string, body BillingVoidInvoiceJSONRequestBody) (*http.Request, error) { +// NewVoidInvoiceActionRequest calls the generic VoidInvoiceAction builder with application/json body +func NewVoidInvoiceActionRequest(server string, customerId string, invoiceId string, body VoidInvoiceActionJSONRequestBody) (*http.Request, error) { var bodyReader io.Reader buf, err := json.Marshal(body) if err != nil { return nil, err } bodyReader = bytes.NewReader(buf) - return NewBillingVoidInvoiceRequestWithBody(server, customerId, invoiceId, "application/json", bodyReader) + return NewVoidInvoiceActionRequestWithBody(server, customerId, invoiceId, "application/json", bodyReader) } -// NewBillingVoidInvoiceRequestWithBody generates requests for BillingVoidInvoice with any type of body -func NewBillingVoidInvoiceRequestWithBody(server string, customerId string, invoiceId string, contentType string, body io.Reader) (*http.Request, error) { +// NewVoidInvoiceActionRequestWithBody generates requests for VoidInvoiceAction with any type of body +func NewVoidInvoiceActionRequestWithBody(server string, customerId string, invoiceId string, contentType string, body io.Reader) (*http.Request, error) { var err error var pathParam0 string @@ -10621,19 +10964,19 @@ func NewBillingVoidInvoiceRequestWithBody(server string, customerId string, invo return req, nil } -// NewBillingCreateLineByCustomerRequest calls the generic BillingCreateLineByCustomer builder with application/json body -func NewBillingCreateLineByCustomerRequest(server string, customerId string, body BillingCreateLineByCustomerJSONRequestBody) (*http.Request, error) { +// NewCreateInvoiceLineByCustomerRequest calls the generic CreateInvoiceLineByCustomer builder with application/json body +func NewCreateInvoiceLineByCustomerRequest(server string, customerId string, body CreateInvoiceLineByCustomerJSONRequestBody) (*http.Request, error) { var bodyReader io.Reader buf, err := json.Marshal(body) if err != nil { return nil, err } bodyReader = bytes.NewReader(buf) - return NewBillingCreateLineByCustomerRequestWithBody(server, customerId, "application/json", bodyReader) + return NewCreateInvoiceLineByCustomerRequestWithBody(server, customerId, "application/json", bodyReader) } -// NewBillingCreateLineByCustomerRequestWithBody generates requests for BillingCreateLineByCustomer with any type of body -func NewBillingCreateLineByCustomerRequestWithBody(server string, customerId string, contentType string, body io.Reader) (*http.Request, error) { +// NewCreateInvoiceLineByCustomerRequestWithBody generates requests for CreateInvoiceLineByCustomer with any type of body +func NewCreateInvoiceLineByCustomerRequestWithBody(server string, customerId string, contentType string, body io.Reader) (*http.Request, error) { var err error var pathParam0 string @@ -10668,8 +11011,8 @@ func NewBillingCreateLineByCustomerRequestWithBody(server string, customerId str return req, nil } -// NewBillingListProfilesRequest generates requests for BillingListProfiles -func NewBillingListProfilesRequest(server string, params *BillingListProfilesParams) (*http.Request, error) { +// NewListBillingProfilesRequest generates requests for ListBillingProfiles +func NewListBillingProfilesRequest(server string, params *ListBillingProfilesParams) (*http.Request, error) { var err error serverURL, err := url.Parse(server) @@ -10829,19 +11172,19 @@ func NewBillingListProfilesRequest(server string, params *BillingListProfilesPar return req, nil } -// NewBillingCreateProfileRequest calls the generic BillingCreateProfile builder with application/json body -func NewBillingCreateProfileRequest(server string, body BillingCreateProfileJSONRequestBody) (*http.Request, error) { +// NewCreateBillingProfileRequest calls the generic CreateBillingProfile builder with application/json body +func NewCreateBillingProfileRequest(server string, body CreateBillingProfileJSONRequestBody) (*http.Request, error) { var bodyReader io.Reader buf, err := json.Marshal(body) if err != nil { return nil, err } bodyReader = bytes.NewReader(buf) - return NewBillingCreateProfileRequestWithBody(server, "application/json", bodyReader) + return NewCreateBillingProfileRequestWithBody(server, "application/json", bodyReader) } -// NewBillingCreateProfileRequestWithBody generates requests for BillingCreateProfile with any type of body -func NewBillingCreateProfileRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { +// NewCreateBillingProfileRequestWithBody generates requests for CreateBillingProfile with any type of body +func NewCreateBillingProfileRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { var err error serverURL, err := url.Parse(server) @@ -10869,8 +11212,8 @@ func NewBillingCreateProfileRequestWithBody(server string, contentType string, b return req, nil } -// NewBillingArchiveProfileRequest generates requests for BillingArchiveProfile -func NewBillingArchiveProfileRequest(server string, id string) (*http.Request, error) { +// NewDeleteBillingProfileRequest generates requests for DeleteBillingProfile +func NewDeleteBillingProfileRequest(server string, id string) (*http.Request, error) { var err error var pathParam0 string @@ -10903,8 +11246,8 @@ func NewBillingArchiveProfileRequest(server string, id string) (*http.Request, e return req, nil } -// NewBillingGetProfileRequest generates requests for BillingGetProfile -func NewBillingGetProfileRequest(server string, id string, params *BillingGetProfileParams) (*http.Request, error) { +// NewGetBillingProfileRequest generates requests for GetBillingProfile +func NewGetBillingProfileRequest(server string, id string, params *GetBillingProfileParams) (*http.Request, error) { var err error var pathParam0 string @@ -10959,19 +11302,19 @@ func NewBillingGetProfileRequest(server string, id string, params *BillingGetPro return req, nil } -// NewBillingUpdateProfileRequest calls the generic BillingUpdateProfile builder with application/json body -func NewBillingUpdateProfileRequest(server string, id string, body BillingUpdateProfileJSONRequestBody) (*http.Request, error) { +// NewUpdateBillingProfileRequest calls the generic UpdateBillingProfile builder with application/json body +func NewUpdateBillingProfileRequest(server string, id string, body UpdateBillingProfileJSONRequestBody) (*http.Request, error) { var bodyReader io.Reader buf, err := json.Marshal(body) if err != nil { return nil, err } bodyReader = bytes.NewReader(buf) - return NewBillingUpdateProfileRequestWithBody(server, id, "application/json", bodyReader) + return NewUpdateBillingProfileRequestWithBody(server, id, "application/json", bodyReader) } -// NewBillingUpdateProfileRequestWithBody generates requests for BillingUpdateProfile with any type of body -func NewBillingUpdateProfileRequestWithBody(server string, id string, contentType string, body io.Reader) (*http.Request, error) { +// NewUpdateBillingProfileRequestWithBody generates requests for UpdateBillingProfile with any type of body +func NewUpdateBillingProfileRequestWithBody(server string, id string, contentType string, body io.Reader) (*http.Request, error) { var err error var pathParam0 string @@ -15809,22 +16152,6 @@ func NewGetSubscriptionRequest(server string, subscriptionId string, params *Get if params != nil { queryValues := queryURL.Query() - if params.Expand != nil { - - if queryFrag, err := runtime.StyleParamWithLocation("form", false, "expand", runtime.ParamLocationQuery, *params.Expand); err != nil { - return nil, err - } else if parsed, err := url.ParseQuery(queryFrag); err != nil { - return nil, err - } else { - for k, v := range parsed { - for _, v2 := range v { - queryValues.Add(k, v2) - } - } - } - - } - if params.At != nil { if queryFrag, err := runtime.StyleParamWithLocation("form", false, "at", runtime.ParamLocationQuery, *params.At); err != nil { @@ -16131,88 +16458,88 @@ type ClientWithResponsesInterface interface { AppStripeWebhookWithResponse(ctx context.Context, id string, body AppStripeWebhookJSONRequestBody, reqEditors ...RequestEditorFn) (*AppStripeWebhookResponse, error) - // BillingListCustomerOverridesWithResponse request - BillingListCustomerOverridesWithResponse(ctx context.Context, params *BillingListCustomerOverridesParams, reqEditors ...RequestEditorFn) (*BillingListCustomerOverridesResponse, error) + // ListBillingProfileCustomerOverridesWithResponse request + ListBillingProfileCustomerOverridesWithResponse(ctx context.Context, params *ListBillingProfileCustomerOverridesParams, reqEditors ...RequestEditorFn) (*ListBillingProfileCustomerOverridesResponse, error) - // BillingDeleteCustomerOverrideWithResponse request - BillingDeleteCustomerOverrideWithResponse(ctx context.Context, customerId string, reqEditors ...RequestEditorFn) (*BillingDeleteCustomerOverrideResponse, error) + // DeleteBillingProfileCustomerOverrideWithResponse request + DeleteBillingProfileCustomerOverrideWithResponse(ctx context.Context, customerId string, reqEditors ...RequestEditorFn) (*DeleteBillingProfileCustomerOverrideResponse, error) - // BillingGetCustomerOverrideByIdWithResponse request - BillingGetCustomerOverrideByIdWithResponse(ctx context.Context, customerId string, reqEditors ...RequestEditorFn) (*BillingGetCustomerOverrideByIdResponse, error) + // GetBillingProfileCustomerOverrideWithResponse request + GetBillingProfileCustomerOverrideWithResponse(ctx context.Context, customerId string, reqEditors ...RequestEditorFn) (*GetBillingProfileCustomerOverrideResponse, error) - // BillingUpsertCustomerOverrideWithBodyWithResponse request with any body - BillingUpsertCustomerOverrideWithBodyWithResponse(ctx context.Context, customerId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*BillingUpsertCustomerOverrideResponse, error) + // UpsertBillingProfileCustomerOverrideWithBodyWithResponse request with any body + UpsertBillingProfileCustomerOverrideWithBodyWithResponse(ctx context.Context, customerId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*UpsertBillingProfileCustomerOverrideResponse, error) - BillingUpsertCustomerOverrideWithResponse(ctx context.Context, customerId string, body BillingUpsertCustomerOverrideJSONRequestBody, reqEditors ...RequestEditorFn) (*BillingUpsertCustomerOverrideResponse, error) + UpsertBillingProfileCustomerOverrideWithResponse(ctx context.Context, customerId string, body UpsertBillingProfileCustomerOverrideJSONRequestBody, reqEditors ...RequestEditorFn) (*UpsertBillingProfileCustomerOverrideResponse, error) - // BillingListInvoicesWithResponse request - BillingListInvoicesWithResponse(ctx context.Context, params *BillingListInvoicesParams, reqEditors ...RequestEditorFn) (*BillingListInvoicesResponse, error) + // ListInvoicesWithResponse request + ListInvoicesWithResponse(ctx context.Context, params *ListInvoicesParams, reqEditors ...RequestEditorFn) (*ListInvoicesResponse, error) - // BillingListInvoicesByCustomerWithResponse request - BillingListInvoicesByCustomerWithResponse(ctx context.Context, customerId string, params *BillingListInvoicesByCustomerParams, reqEditors ...RequestEditorFn) (*BillingListInvoicesByCustomerResponse, error) + // ListInvoicesByCustomerWithResponse request + ListInvoicesByCustomerWithResponse(ctx context.Context, customerId string, params *ListInvoicesByCustomerParams, reqEditors ...RequestEditorFn) (*ListInvoicesByCustomerResponse, error) - // BillingCreateInvoiceWithBodyWithResponse request with any body - BillingCreateInvoiceWithBodyWithResponse(ctx context.Context, customerId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*BillingCreateInvoiceResponse, error) + // InvoicePendingLinesActionWithBodyWithResponse request with any body + InvoicePendingLinesActionWithBodyWithResponse(ctx context.Context, customerId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*InvoicePendingLinesActionResponse, error) - BillingCreateInvoiceWithResponse(ctx context.Context, customerId string, body BillingCreateInvoiceJSONRequestBody, reqEditors ...RequestEditorFn) (*BillingCreateInvoiceResponse, error) + InvoicePendingLinesActionWithResponse(ctx context.Context, customerId string, body InvoicePendingLinesActionJSONRequestBody, reqEditors ...RequestEditorFn) (*InvoicePendingLinesActionResponse, error) - // BillingDeleteInvoiceByCustomerInvoiceIdWithResponse request - BillingDeleteInvoiceByCustomerInvoiceIdWithResponse(ctx context.Context, customerId string, invoiceId string, reqEditors ...RequestEditorFn) (*BillingDeleteInvoiceByCustomerInvoiceIdResponse, error) + // DeleteInvoiceWithResponse request + DeleteInvoiceWithResponse(ctx context.Context, customerId string, invoiceId string, reqEditors ...RequestEditorFn) (*DeleteInvoiceResponse, error) - // BillingGetInvoiceByCustomerInvoiceIdWithResponse request - BillingGetInvoiceByCustomerInvoiceIdWithResponse(ctx context.Context, customerId string, invoiceId string, params *BillingGetInvoiceByCustomerInvoiceIdParams, reqEditors ...RequestEditorFn) (*BillingGetInvoiceByCustomerInvoiceIdResponse, error) + // GetInvoiceWithResponse request + GetInvoiceWithResponse(ctx context.Context, customerId string, invoiceId string, params *GetInvoiceParams, reqEditors ...RequestEditorFn) (*GetInvoiceResponse, error) - // BillingInvoiceAdvanceWithResponse request - BillingInvoiceAdvanceWithResponse(ctx context.Context, customerId string, invoiceId string, reqEditors ...RequestEditorFn) (*BillingInvoiceAdvanceResponse, error) + // AdvanceInvoiceActionWithResponse request + AdvanceInvoiceActionWithResponse(ctx context.Context, customerId string, invoiceId string, reqEditors ...RequestEditorFn) (*AdvanceInvoiceActionResponse, error) - // BillingApproveInvoiceWithResponse request - BillingApproveInvoiceWithResponse(ctx context.Context, customerId string, invoiceId string, reqEditors ...RequestEditorFn) (*BillingApproveInvoiceResponse, error) + // ApproveInvoiceActionWithResponse request + ApproveInvoiceActionWithResponse(ctx context.Context, customerId string, invoiceId string, reqEditors ...RequestEditorFn) (*ApproveInvoiceActionResponse, error) - // BillingDeleteInvoiceLineWithResponse request - BillingDeleteInvoiceLineWithResponse(ctx context.Context, customerId string, invoiceId string, lineId string, reqEditors ...RequestEditorFn) (*BillingDeleteInvoiceLineResponse, error) + // DeleteInvoiceLineWithResponse request + DeleteInvoiceLineWithResponse(ctx context.Context, customerId string, invoiceId string, lineId string, reqEditors ...RequestEditorFn) (*DeleteInvoiceLineResponse, error) - // BillingGetInvoiceLineWithResponse request - BillingGetInvoiceLineWithResponse(ctx context.Context, customerId string, invoiceId string, lineId string, reqEditors ...RequestEditorFn) (*BillingGetInvoiceLineResponse, error) + // GetInvoiceLineWithResponse request + GetInvoiceLineWithResponse(ctx context.Context, customerId string, invoiceId string, lineId string, reqEditors ...RequestEditorFn) (*GetInvoiceLineResponse, error) - // BillingUpdateInvoiceLineWithBodyWithResponse request with any body - BillingUpdateInvoiceLineWithBodyWithResponse(ctx context.Context, customerId string, invoiceId string, lineId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*BillingUpdateInvoiceLineResponse, error) + // UpdateInvoiceLineWithBodyWithResponse request with any body + UpdateInvoiceLineWithBodyWithResponse(ctx context.Context, customerId string, invoiceId string, lineId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*UpdateInvoiceLineResponse, error) - BillingUpdateInvoiceLineWithResponse(ctx context.Context, customerId string, invoiceId string, lineId string, body BillingUpdateInvoiceLineJSONRequestBody, reqEditors ...RequestEditorFn) (*BillingUpdateInvoiceLineResponse, error) + UpdateInvoiceLineWithResponse(ctx context.Context, customerId string, invoiceId string, lineId string, body UpdateInvoiceLineJSONRequestBody, reqEditors ...RequestEditorFn) (*UpdateInvoiceLineResponse, error) - // BillingInvoiceRetryWithResponse request - BillingInvoiceRetryWithResponse(ctx context.Context, customerId string, invoiceId string, reqEditors ...RequestEditorFn) (*BillingInvoiceRetryResponse, error) + // RetryInvoiceActionWithResponse request + RetryInvoiceActionWithResponse(ctx context.Context, customerId string, invoiceId string, reqEditors ...RequestEditorFn) (*RetryInvoiceActionResponse, error) - // BillingRecalculateInvoiceTaxWithResponse request - BillingRecalculateInvoiceTaxWithResponse(ctx context.Context, customerId string, invoiceId string, reqEditors ...RequestEditorFn) (*BillingRecalculateInvoiceTaxResponse, error) + // RecalculateInvoiceTaxActionWithResponse request + RecalculateInvoiceTaxActionWithResponse(ctx context.Context, customerId string, invoiceId string, reqEditors ...RequestEditorFn) (*RecalculateInvoiceTaxActionResponse, error) - // BillingVoidInvoiceWithBodyWithResponse request with any body - BillingVoidInvoiceWithBodyWithResponse(ctx context.Context, customerId string, invoiceId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*BillingVoidInvoiceResponse, error) + // VoidInvoiceActionWithBodyWithResponse request with any body + VoidInvoiceActionWithBodyWithResponse(ctx context.Context, customerId string, invoiceId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*VoidInvoiceActionResponse, error) - BillingVoidInvoiceWithResponse(ctx context.Context, customerId string, invoiceId string, body BillingVoidInvoiceJSONRequestBody, reqEditors ...RequestEditorFn) (*BillingVoidInvoiceResponse, error) + VoidInvoiceActionWithResponse(ctx context.Context, customerId string, invoiceId string, body VoidInvoiceActionJSONRequestBody, reqEditors ...RequestEditorFn) (*VoidInvoiceActionResponse, error) - // BillingCreateLineByCustomerWithBodyWithResponse request with any body - BillingCreateLineByCustomerWithBodyWithResponse(ctx context.Context, customerId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*BillingCreateLineByCustomerResponse, error) + // CreateInvoiceLineByCustomerWithBodyWithResponse request with any body + CreateInvoiceLineByCustomerWithBodyWithResponse(ctx context.Context, customerId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*CreateInvoiceLineByCustomerResponse, error) - BillingCreateLineByCustomerWithResponse(ctx context.Context, customerId string, body BillingCreateLineByCustomerJSONRequestBody, reqEditors ...RequestEditorFn) (*BillingCreateLineByCustomerResponse, error) + CreateInvoiceLineByCustomerWithResponse(ctx context.Context, customerId string, body CreateInvoiceLineByCustomerJSONRequestBody, reqEditors ...RequestEditorFn) (*CreateInvoiceLineByCustomerResponse, error) - // BillingListProfilesWithResponse request - BillingListProfilesWithResponse(ctx context.Context, params *BillingListProfilesParams, reqEditors ...RequestEditorFn) (*BillingListProfilesResponse, error) + // ListBillingProfilesWithResponse request + ListBillingProfilesWithResponse(ctx context.Context, params *ListBillingProfilesParams, reqEditors ...RequestEditorFn) (*ListBillingProfilesResponse, error) - // BillingCreateProfileWithBodyWithResponse request with any body - BillingCreateProfileWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*BillingCreateProfileResponse, error) + // CreateBillingProfileWithBodyWithResponse request with any body + CreateBillingProfileWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*CreateBillingProfileResponse, error) - BillingCreateProfileWithResponse(ctx context.Context, body BillingCreateProfileJSONRequestBody, reqEditors ...RequestEditorFn) (*BillingCreateProfileResponse, error) + CreateBillingProfileWithResponse(ctx context.Context, body CreateBillingProfileJSONRequestBody, reqEditors ...RequestEditorFn) (*CreateBillingProfileResponse, error) - // BillingArchiveProfileWithResponse request - BillingArchiveProfileWithResponse(ctx context.Context, id string, reqEditors ...RequestEditorFn) (*BillingArchiveProfileResponse, error) + // DeleteBillingProfileWithResponse request + DeleteBillingProfileWithResponse(ctx context.Context, id string, reqEditors ...RequestEditorFn) (*DeleteBillingProfileResponse, error) - // BillingGetProfileWithResponse request - BillingGetProfileWithResponse(ctx context.Context, id string, params *BillingGetProfileParams, reqEditors ...RequestEditorFn) (*BillingGetProfileResponse, error) + // GetBillingProfileWithResponse request + GetBillingProfileWithResponse(ctx context.Context, id string, params *GetBillingProfileParams, reqEditors ...RequestEditorFn) (*GetBillingProfileResponse, error) - // BillingUpdateProfileWithBodyWithResponse request with any body - BillingUpdateProfileWithBodyWithResponse(ctx context.Context, id string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*BillingUpdateProfileResponse, error) + // UpdateBillingProfileWithBodyWithResponse request with any body + UpdateBillingProfileWithBodyWithResponse(ctx context.Context, id string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*UpdateBillingProfileResponse, error) - BillingUpdateProfileWithResponse(ctx context.Context, id string, body BillingUpdateProfileJSONRequestBody, reqEditors ...RequestEditorFn) (*BillingUpdateProfileResponse, error) + UpdateBillingProfileWithResponse(ctx context.Context, id string, body UpdateBillingProfileJSONRequestBody, reqEditors ...RequestEditorFn) (*UpdateBillingProfileResponse, error) // ListCustomersWithResponse request ListCustomersWithResponse(ctx context.Context, params *ListCustomersParams, reqEditors ...RequestEditorFn) (*ListCustomersResponse, error) @@ -16640,10 +16967,10 @@ func (r AppStripeWebhookResponse) StatusCode() int { return 0 } -type BillingListCustomerOverridesResponse struct { +type ListBillingProfileCustomerOverridesResponse struct { Body []byte HTTPResponse *http.Response - JSON200 *CustomerOverridePaginatedResponse + JSON200 *BillingProfileCustomerOverridePaginatedResponse ApplicationproblemJSON400 *BadRequestProblemResponse ApplicationproblemJSON401 *UnauthorizedProblemResponse ApplicationproblemJSON403 *ForbiddenProblemResponse @@ -16653,7 +16980,7 @@ type BillingListCustomerOverridesResponse struct { } // Status returns HTTPResponse.Status -func (r BillingListCustomerOverridesResponse) Status() string { +func (r ListBillingProfileCustomerOverridesResponse) Status() string { if r.HTTPResponse != nil { return r.HTTPResponse.Status } @@ -16661,14 +16988,14 @@ func (r BillingListCustomerOverridesResponse) Status() string { } // StatusCode returns HTTPResponse.StatusCode -func (r BillingListCustomerOverridesResponse) StatusCode() int { +func (r ListBillingProfileCustomerOverridesResponse) StatusCode() int { if r.HTTPResponse != nil { return r.HTTPResponse.StatusCode } return 0 } -type BillingDeleteCustomerOverrideResponse struct { +type DeleteBillingProfileCustomerOverrideResponse struct { Body []byte HTTPResponse *http.Response ApplicationproblemJSON400 *BadRequestProblemResponse @@ -16681,7 +17008,7 @@ type BillingDeleteCustomerOverrideResponse struct { } // Status returns HTTPResponse.Status -func (r BillingDeleteCustomerOverrideResponse) Status() string { +func (r DeleteBillingProfileCustomerOverrideResponse) Status() string { if r.HTTPResponse != nil { return r.HTTPResponse.Status } @@ -16689,17 +17016,17 @@ func (r BillingDeleteCustomerOverrideResponse) Status() string { } // StatusCode returns HTTPResponse.StatusCode -func (r BillingDeleteCustomerOverrideResponse) StatusCode() int { +func (r DeleteBillingProfileCustomerOverrideResponse) StatusCode() int { if r.HTTPResponse != nil { return r.HTTPResponse.StatusCode } return 0 } -type BillingGetCustomerOverrideByIdResponse struct { +type GetBillingProfileCustomerOverrideResponse struct { Body []byte HTTPResponse *http.Response - JSON200 *BillingCustomerOverride + JSON200 *BillingProfileCustomerOverride ApplicationproblemJSON400 *BadRequestProblemResponse ApplicationproblemJSON401 *UnauthorizedProblemResponse ApplicationproblemJSON403 *ForbiddenProblemResponse @@ -16710,7 +17037,7 @@ type BillingGetCustomerOverrideByIdResponse struct { } // Status returns HTTPResponse.Status -func (r BillingGetCustomerOverrideByIdResponse) Status() string { +func (r GetBillingProfileCustomerOverrideResponse) Status() string { if r.HTTPResponse != nil { return r.HTTPResponse.Status } @@ -16718,18 +17045,20 @@ func (r BillingGetCustomerOverrideByIdResponse) Status() string { } // StatusCode returns HTTPResponse.StatusCode -func (r BillingGetCustomerOverrideByIdResponse) StatusCode() int { +func (r GetBillingProfileCustomerOverrideResponse) StatusCode() int { if r.HTTPResponse != nil { return r.HTTPResponse.StatusCode } return 0 } -type BillingUpsertCustomerOverrideResponse struct { - Body []byte - HTTPResponse *http.Response - JSON200 *BillingCustomerOverride - JSON201 *BillingCustomerOverride +type UpsertBillingProfileCustomerOverrideResponse struct { + Body []byte + HTTPResponse *http.Response + JSON200 *struct { + union json.RawMessage + } + JSON201 *BillingProfileCustomerOverride ApplicationproblemJSON400 *BadRequestProblemResponse ApplicationproblemJSON401 *UnauthorizedProblemResponse ApplicationproblemJSON403 *ForbiddenProblemResponse @@ -16740,7 +17069,7 @@ type BillingUpsertCustomerOverrideResponse struct { } // Status returns HTTPResponse.Status -func (r BillingUpsertCustomerOverrideResponse) Status() string { +func (r UpsertBillingProfileCustomerOverrideResponse) Status() string { if r.HTTPResponse != nil { return r.HTTPResponse.Status } @@ -16748,14 +17077,14 @@ func (r BillingUpsertCustomerOverrideResponse) Status() string { } // StatusCode returns HTTPResponse.StatusCode -func (r BillingUpsertCustomerOverrideResponse) StatusCode() int { +func (r UpsertBillingProfileCustomerOverrideResponse) StatusCode() int { if r.HTTPResponse != nil { return r.HTTPResponse.StatusCode } return 0 } -type BillingListInvoicesResponse struct { +type ListInvoicesResponse struct { Body []byte HTTPResponse *http.Response JSON200 *InvoicePaginatedResponse @@ -16768,7 +17097,7 @@ type BillingListInvoicesResponse struct { } // Status returns HTTPResponse.Status -func (r BillingListInvoicesResponse) Status() string { +func (r ListInvoicesResponse) Status() string { if r.HTTPResponse != nil { return r.HTTPResponse.Status } @@ -16776,14 +17105,14 @@ func (r BillingListInvoicesResponse) Status() string { } // StatusCode returns HTTPResponse.StatusCode -func (r BillingListInvoicesResponse) StatusCode() int { +func (r ListInvoicesResponse) StatusCode() int { if r.HTTPResponse != nil { return r.HTTPResponse.StatusCode } return 0 } -type BillingListInvoicesByCustomerResponse struct { +type ListInvoicesByCustomerResponse struct { Body []byte HTTPResponse *http.Response JSON200 *InvoicePaginatedResponse @@ -16796,7 +17125,7 @@ type BillingListInvoicesByCustomerResponse struct { } // Status returns HTTPResponse.Status -func (r BillingListInvoicesByCustomerResponse) Status() string { +func (r ListInvoicesByCustomerResponse) Status() string { if r.HTTPResponse != nil { return r.HTTPResponse.Status } @@ -16804,17 +17133,17 @@ func (r BillingListInvoicesByCustomerResponse) Status() string { } // StatusCode returns HTTPResponse.StatusCode -func (r BillingListInvoicesByCustomerResponse) StatusCode() int { +func (r ListInvoicesByCustomerResponse) StatusCode() int { if r.HTTPResponse != nil { return r.HTTPResponse.StatusCode } return 0 } -type BillingCreateInvoiceResponse struct { +type InvoicePendingLinesActionResponse struct { Body []byte HTTPResponse *http.Response - JSON201 *[]BillingInvoice + JSON201 *[]Invoice ApplicationproblemJSON400 *BadRequestProblemResponse ApplicationproblemJSON401 *UnauthorizedProblemResponse ApplicationproblemJSON403 *ForbiddenProblemResponse @@ -16824,7 +17153,7 @@ type BillingCreateInvoiceResponse struct { } // Status returns HTTPResponse.Status -func (r BillingCreateInvoiceResponse) Status() string { +func (r InvoicePendingLinesActionResponse) Status() string { if r.HTTPResponse != nil { return r.HTTPResponse.Status } @@ -16832,14 +17161,14 @@ func (r BillingCreateInvoiceResponse) Status() string { } // StatusCode returns HTTPResponse.StatusCode -func (r BillingCreateInvoiceResponse) StatusCode() int { +func (r InvoicePendingLinesActionResponse) StatusCode() int { if r.HTTPResponse != nil { return r.HTTPResponse.StatusCode } return 0 } -type BillingDeleteInvoiceByCustomerInvoiceIdResponse struct { +type DeleteInvoiceResponse struct { Body []byte HTTPResponse *http.Response ApplicationproblemJSON400 *BadRequestProblemResponse @@ -16852,7 +17181,7 @@ type BillingDeleteInvoiceByCustomerInvoiceIdResponse struct { } // Status returns HTTPResponse.Status -func (r BillingDeleteInvoiceByCustomerInvoiceIdResponse) Status() string { +func (r DeleteInvoiceResponse) Status() string { if r.HTTPResponse != nil { return r.HTTPResponse.Status } @@ -16860,17 +17189,17 @@ func (r BillingDeleteInvoiceByCustomerInvoiceIdResponse) Status() string { } // StatusCode returns HTTPResponse.StatusCode -func (r BillingDeleteInvoiceByCustomerInvoiceIdResponse) StatusCode() int { +func (r DeleteInvoiceResponse) StatusCode() int { if r.HTTPResponse != nil { return r.HTTPResponse.StatusCode } return 0 } -type BillingGetInvoiceByCustomerInvoiceIdResponse struct { +type GetInvoiceResponse struct { Body []byte HTTPResponse *http.Response - JSON200 *BillingInvoice + JSON200 *Invoice ApplicationproblemJSON400 *BadRequestProblemResponse ApplicationproblemJSON401 *UnauthorizedProblemResponse ApplicationproblemJSON403 *ForbiddenProblemResponse @@ -16881,7 +17210,7 @@ type BillingGetInvoiceByCustomerInvoiceIdResponse struct { } // Status returns HTTPResponse.Status -func (r BillingGetInvoiceByCustomerInvoiceIdResponse) Status() string { +func (r GetInvoiceResponse) Status() string { if r.HTTPResponse != nil { return r.HTTPResponse.Status } @@ -16889,17 +17218,17 @@ func (r BillingGetInvoiceByCustomerInvoiceIdResponse) Status() string { } // StatusCode returns HTTPResponse.StatusCode -func (r BillingGetInvoiceByCustomerInvoiceIdResponse) StatusCode() int { +func (r GetInvoiceResponse) StatusCode() int { if r.HTTPResponse != nil { return r.HTTPResponse.StatusCode } return 0 } -type BillingInvoiceAdvanceResponse struct { +type AdvanceInvoiceActionResponse struct { Body []byte HTTPResponse *http.Response - JSON200 *BillingInvoice + JSON200 *Invoice ApplicationproblemJSON400 *BadRequestProblemResponse ApplicationproblemJSON401 *UnauthorizedProblemResponse ApplicationproblemJSON403 *ForbiddenProblemResponse @@ -16910,7 +17239,7 @@ type BillingInvoiceAdvanceResponse struct { } // Status returns HTTPResponse.Status -func (r BillingInvoiceAdvanceResponse) Status() string { +func (r AdvanceInvoiceActionResponse) Status() string { if r.HTTPResponse != nil { return r.HTTPResponse.Status } @@ -16918,17 +17247,17 @@ func (r BillingInvoiceAdvanceResponse) Status() string { } // StatusCode returns HTTPResponse.StatusCode -func (r BillingInvoiceAdvanceResponse) StatusCode() int { +func (r AdvanceInvoiceActionResponse) StatusCode() int { if r.HTTPResponse != nil { return r.HTTPResponse.StatusCode } return 0 } -type BillingApproveInvoiceResponse struct { +type ApproveInvoiceActionResponse struct { Body []byte HTTPResponse *http.Response - JSON200 *BillingInvoice + JSON200 *Invoice ApplicationproblemJSON400 *BadRequestProblemResponse ApplicationproblemJSON401 *UnauthorizedProblemResponse ApplicationproblemJSON403 *ForbiddenProblemResponse @@ -16939,7 +17268,7 @@ type BillingApproveInvoiceResponse struct { } // Status returns HTTPResponse.Status -func (r BillingApproveInvoiceResponse) Status() string { +func (r ApproveInvoiceActionResponse) Status() string { if r.HTTPResponse != nil { return r.HTTPResponse.Status } @@ -16947,14 +17276,14 @@ func (r BillingApproveInvoiceResponse) Status() string { } // StatusCode returns HTTPResponse.StatusCode -func (r BillingApproveInvoiceResponse) StatusCode() int { +func (r ApproveInvoiceActionResponse) StatusCode() int { if r.HTTPResponse != nil { return r.HTTPResponse.StatusCode } return 0 } -type BillingDeleteInvoiceLineResponse struct { +type DeleteInvoiceLineResponse struct { Body []byte HTTPResponse *http.Response ApplicationproblemJSON400 *BadRequestProblemResponse @@ -16967,7 +17296,7 @@ type BillingDeleteInvoiceLineResponse struct { } // Status returns HTTPResponse.Status -func (r BillingDeleteInvoiceLineResponse) Status() string { +func (r DeleteInvoiceLineResponse) Status() string { if r.HTTPResponse != nil { return r.HTTPResponse.Status } @@ -16975,17 +17304,17 @@ func (r BillingDeleteInvoiceLineResponse) Status() string { } // StatusCode returns HTTPResponse.StatusCode -func (r BillingDeleteInvoiceLineResponse) StatusCode() int { +func (r DeleteInvoiceLineResponse) StatusCode() int { if r.HTTPResponse != nil { return r.HTTPResponse.StatusCode } return 0 } -type BillingGetInvoiceLineResponse struct { +type GetInvoiceLineResponse struct { Body []byte HTTPResponse *http.Response - JSON204 *BillingInvoiceLine + JSON200 *InvoiceLine ApplicationproblemJSON400 *BadRequestProblemResponse ApplicationproblemJSON401 *UnauthorizedProblemResponse ApplicationproblemJSON403 *ForbiddenProblemResponse @@ -16996,7 +17325,7 @@ type BillingGetInvoiceLineResponse struct { } // Status returns HTTPResponse.Status -func (r BillingGetInvoiceLineResponse) Status() string { +func (r GetInvoiceLineResponse) Status() string { if r.HTTPResponse != nil { return r.HTTPResponse.Status } @@ -17004,17 +17333,17 @@ func (r BillingGetInvoiceLineResponse) Status() string { } // StatusCode returns HTTPResponse.StatusCode -func (r BillingGetInvoiceLineResponse) StatusCode() int { +func (r GetInvoiceLineResponse) StatusCode() int { if r.HTTPResponse != nil { return r.HTTPResponse.StatusCode } return 0 } -type BillingUpdateInvoiceLineResponse struct { +type UpdateInvoiceLineResponse struct { Body []byte HTTPResponse *http.Response - JSON200 *BillingInvoiceLine + JSON200 *InvoiceLine ApplicationproblemJSON400 *BadRequestProblemResponse ApplicationproblemJSON401 *UnauthorizedProblemResponse ApplicationproblemJSON403 *ForbiddenProblemResponse @@ -17025,7 +17354,7 @@ type BillingUpdateInvoiceLineResponse struct { } // Status returns HTTPResponse.Status -func (r BillingUpdateInvoiceLineResponse) Status() string { +func (r UpdateInvoiceLineResponse) Status() string { if r.HTTPResponse != nil { return r.HTTPResponse.Status } @@ -17033,17 +17362,17 @@ func (r BillingUpdateInvoiceLineResponse) Status() string { } // StatusCode returns HTTPResponse.StatusCode -func (r BillingUpdateInvoiceLineResponse) StatusCode() int { +func (r UpdateInvoiceLineResponse) StatusCode() int { if r.HTTPResponse != nil { return r.HTTPResponse.StatusCode } return 0 } -type BillingInvoiceRetryResponse struct { +type RetryInvoiceActionResponse struct { Body []byte HTTPResponse *http.Response - JSON200 *BillingInvoice + JSON200 *Invoice ApplicationproblemJSON400 *BadRequestProblemResponse ApplicationproblemJSON401 *UnauthorizedProblemResponse ApplicationproblemJSON403 *ForbiddenProblemResponse @@ -17054,7 +17383,7 @@ type BillingInvoiceRetryResponse struct { } // Status returns HTTPResponse.Status -func (r BillingInvoiceRetryResponse) Status() string { +func (r RetryInvoiceActionResponse) Status() string { if r.HTTPResponse != nil { return r.HTTPResponse.Status } @@ -17062,17 +17391,17 @@ func (r BillingInvoiceRetryResponse) Status() string { } // StatusCode returns HTTPResponse.StatusCode -func (r BillingInvoiceRetryResponse) StatusCode() int { +func (r RetryInvoiceActionResponse) StatusCode() int { if r.HTTPResponse != nil { return r.HTTPResponse.StatusCode } return 0 } -type BillingRecalculateInvoiceTaxResponse struct { +type RecalculateInvoiceTaxActionResponse struct { Body []byte HTTPResponse *http.Response - JSON200 *BillingInvoice + JSON200 *Invoice ApplicationproblemJSON400 *BadRequestProblemResponse ApplicationproblemJSON401 *UnauthorizedProblemResponse ApplicationproblemJSON403 *ForbiddenProblemResponse @@ -17083,7 +17412,7 @@ type BillingRecalculateInvoiceTaxResponse struct { } // Status returns HTTPResponse.Status -func (r BillingRecalculateInvoiceTaxResponse) Status() string { +func (r RecalculateInvoiceTaxActionResponse) Status() string { if r.HTTPResponse != nil { return r.HTTPResponse.Status } @@ -17091,17 +17420,17 @@ func (r BillingRecalculateInvoiceTaxResponse) Status() string { } // StatusCode returns HTTPResponse.StatusCode -func (r BillingRecalculateInvoiceTaxResponse) StatusCode() int { +func (r RecalculateInvoiceTaxActionResponse) StatusCode() int { if r.HTTPResponse != nil { return r.HTTPResponse.StatusCode } return 0 } -type BillingVoidInvoiceResponse struct { +type VoidInvoiceActionResponse struct { Body []byte HTTPResponse *http.Response - JSON200 *BillingInvoice + JSON200 *Invoice ApplicationproblemJSON400 *BadRequestProblemResponse ApplicationproblemJSON401 *UnauthorizedProblemResponse ApplicationproblemJSON403 *ForbiddenProblemResponse @@ -17112,7 +17441,7 @@ type BillingVoidInvoiceResponse struct { } // Status returns HTTPResponse.Status -func (r BillingVoidInvoiceResponse) Status() string { +func (r VoidInvoiceActionResponse) Status() string { if r.HTTPResponse != nil { return r.HTTPResponse.Status } @@ -17120,17 +17449,17 @@ func (r BillingVoidInvoiceResponse) Status() string { } // StatusCode returns HTTPResponse.StatusCode -func (r BillingVoidInvoiceResponse) StatusCode() int { +func (r VoidInvoiceActionResponse) StatusCode() int { if r.HTTPResponse != nil { return r.HTTPResponse.StatusCode } return 0 } -type BillingCreateLineByCustomerResponse struct { +type CreateInvoiceLineByCustomerResponse struct { Body []byte HTTPResponse *http.Response - JSON201 *BillingInvoiceLines + JSON201 *[]InvoiceLine ApplicationproblemJSON400 *BadRequestProblemResponse ApplicationproblemJSON401 *UnauthorizedProblemResponse ApplicationproblemJSON403 *ForbiddenProblemResponse @@ -17140,7 +17469,7 @@ type BillingCreateLineByCustomerResponse struct { } // Status returns HTTPResponse.Status -func (r BillingCreateLineByCustomerResponse) Status() string { +func (r CreateInvoiceLineByCustomerResponse) Status() string { if r.HTTPResponse != nil { return r.HTTPResponse.Status } @@ -17148,17 +17477,17 @@ func (r BillingCreateLineByCustomerResponse) Status() string { } // StatusCode returns HTTPResponse.StatusCode -func (r BillingCreateLineByCustomerResponse) StatusCode() int { +func (r CreateInvoiceLineByCustomerResponse) StatusCode() int { if r.HTTPResponse != nil { return r.HTTPResponse.StatusCode } return 0 } -type BillingListProfilesResponse struct { +type ListBillingProfilesResponse struct { Body []byte HTTPResponse *http.Response - JSON200 *ProfilePaginatedResponse + JSON200 *BillingProfilePaginatedResponse ApplicationproblemJSON400 *BadRequestProblemResponse ApplicationproblemJSON401 *UnauthorizedProblemResponse ApplicationproblemJSON403 *ForbiddenProblemResponse @@ -17168,7 +17497,7 @@ type BillingListProfilesResponse struct { } // Status returns HTTPResponse.Status -func (r BillingListProfilesResponse) Status() string { +func (r ListBillingProfilesResponse) Status() string { if r.HTTPResponse != nil { return r.HTTPResponse.Status } @@ -17176,14 +17505,14 @@ func (r BillingListProfilesResponse) Status() string { } // StatusCode returns HTTPResponse.StatusCode -func (r BillingListProfilesResponse) StatusCode() int { +func (r ListBillingProfilesResponse) StatusCode() int { if r.HTTPResponse != nil { return r.HTTPResponse.StatusCode } return 0 } -type BillingCreateProfileResponse struct { +type CreateBillingProfileResponse struct { Body []byte HTTPResponse *http.Response JSON201 *BillingProfile @@ -17196,7 +17525,7 @@ type BillingCreateProfileResponse struct { } // Status returns HTTPResponse.Status -func (r BillingCreateProfileResponse) Status() string { +func (r CreateBillingProfileResponse) Status() string { if r.HTTPResponse != nil { return r.HTTPResponse.Status } @@ -17204,14 +17533,14 @@ func (r BillingCreateProfileResponse) Status() string { } // StatusCode returns HTTPResponse.StatusCode -func (r BillingCreateProfileResponse) StatusCode() int { +func (r CreateBillingProfileResponse) StatusCode() int { if r.HTTPResponse != nil { return r.HTTPResponse.StatusCode } return 0 } -type BillingArchiveProfileResponse struct { +type DeleteBillingProfileResponse struct { Body []byte HTTPResponse *http.Response ApplicationproblemJSON400 *BadRequestProblemResponse @@ -17224,7 +17553,7 @@ type BillingArchiveProfileResponse struct { } // Status returns HTTPResponse.Status -func (r BillingArchiveProfileResponse) Status() string { +func (r DeleteBillingProfileResponse) Status() string { if r.HTTPResponse != nil { return r.HTTPResponse.Status } @@ -17232,14 +17561,14 @@ func (r BillingArchiveProfileResponse) Status() string { } // StatusCode returns HTTPResponse.StatusCode -func (r BillingArchiveProfileResponse) StatusCode() int { +func (r DeleteBillingProfileResponse) StatusCode() int { if r.HTTPResponse != nil { return r.HTTPResponse.StatusCode } return 0 } -type BillingGetProfileResponse struct { +type GetBillingProfileResponse struct { Body []byte HTTPResponse *http.Response JSON200 *BillingProfile @@ -17253,7 +17582,7 @@ type BillingGetProfileResponse struct { } // Status returns HTTPResponse.Status -func (r BillingGetProfileResponse) Status() string { +func (r GetBillingProfileResponse) Status() string { if r.HTTPResponse != nil { return r.HTTPResponse.Status } @@ -17261,14 +17590,14 @@ func (r BillingGetProfileResponse) Status() string { } // StatusCode returns HTTPResponse.StatusCode -func (r BillingGetProfileResponse) StatusCode() int { +func (r GetBillingProfileResponse) StatusCode() int { if r.HTTPResponse != nil { return r.HTTPResponse.StatusCode } return 0 } -type BillingUpdateProfileResponse struct { +type UpdateBillingProfileResponse struct { Body []byte HTTPResponse *http.Response JSON200 *BillingProfile @@ -17282,7 +17611,7 @@ type BillingUpdateProfileResponse struct { } // Status returns HTTPResponse.Status -func (r BillingUpdateProfileResponse) Status() string { +func (r UpdateBillingProfileResponse) Status() string { if r.HTTPResponse != nil { return r.HTTPResponse.Status } @@ -17290,7 +17619,7 @@ func (r BillingUpdateProfileResponse) Status() string { } // StatusCode returns HTTPResponse.StatusCode -func (r BillingUpdateProfileResponse) StatusCode() int { +func (r UpdateBillingProfileResponse) StatusCode() int { if r.HTTPResponse != nil { return r.HTTPResponse.StatusCode } @@ -19456,7 +19785,7 @@ func (r ResetEntitlementUsageResponse) StatusCode() int { type CreateSubscriptionResponse struct { Body []byte HTTPResponse *http.Response - JSON200 *Subscription + JSON201 *Subscription ApplicationproblemJSON400 *BadRequestProblemResponse ApplicationproblemJSON401 *UnauthorizedProblemResponse ApplicationproblemJSON403 *ForbiddenProblemResponse @@ -19483,11 +19812,9 @@ func (r CreateSubscriptionResponse) StatusCode() int { } type GetSubscriptionResponse struct { - Body []byte - HTTPResponse *http.Response - JSON200 *struct { - union json.RawMessage - } + Body []byte + HTTPResponse *http.Response + JSON200 *SubscriptionExpanded ApplicationproblemJSON400 *BadRequestProblemResponse ApplicationproblemJSON401 *UnauthorizedProblemResponse ApplicationproblemJSON403 *ForbiddenProblemResponse @@ -19707,267 +20034,267 @@ func (c *ClientWithResponses) AppStripeWebhookWithResponse(ctx context.Context, return ParseAppStripeWebhookResponse(rsp) } -// BillingListCustomerOverridesWithResponse request returning *BillingListCustomerOverridesResponse -func (c *ClientWithResponses) BillingListCustomerOverridesWithResponse(ctx context.Context, params *BillingListCustomerOverridesParams, reqEditors ...RequestEditorFn) (*BillingListCustomerOverridesResponse, error) { - rsp, err := c.BillingListCustomerOverrides(ctx, params, reqEditors...) +// ListBillingProfileCustomerOverridesWithResponse request returning *ListBillingProfileCustomerOverridesResponse +func (c *ClientWithResponses) ListBillingProfileCustomerOverridesWithResponse(ctx context.Context, params *ListBillingProfileCustomerOverridesParams, reqEditors ...RequestEditorFn) (*ListBillingProfileCustomerOverridesResponse, error) { + rsp, err := c.ListBillingProfileCustomerOverrides(ctx, params, reqEditors...) if err != nil { return nil, err } - return ParseBillingListCustomerOverridesResponse(rsp) + return ParseListBillingProfileCustomerOverridesResponse(rsp) } -// BillingDeleteCustomerOverrideWithResponse request returning *BillingDeleteCustomerOverrideResponse -func (c *ClientWithResponses) BillingDeleteCustomerOverrideWithResponse(ctx context.Context, customerId string, reqEditors ...RequestEditorFn) (*BillingDeleteCustomerOverrideResponse, error) { - rsp, err := c.BillingDeleteCustomerOverride(ctx, customerId, reqEditors...) +// DeleteBillingProfileCustomerOverrideWithResponse request returning *DeleteBillingProfileCustomerOverrideResponse +func (c *ClientWithResponses) DeleteBillingProfileCustomerOverrideWithResponse(ctx context.Context, customerId string, reqEditors ...RequestEditorFn) (*DeleteBillingProfileCustomerOverrideResponse, error) { + rsp, err := c.DeleteBillingProfileCustomerOverride(ctx, customerId, reqEditors...) if err != nil { return nil, err } - return ParseBillingDeleteCustomerOverrideResponse(rsp) + return ParseDeleteBillingProfileCustomerOverrideResponse(rsp) } -// BillingGetCustomerOverrideByIdWithResponse request returning *BillingGetCustomerOverrideByIdResponse -func (c *ClientWithResponses) BillingGetCustomerOverrideByIdWithResponse(ctx context.Context, customerId string, reqEditors ...RequestEditorFn) (*BillingGetCustomerOverrideByIdResponse, error) { - rsp, err := c.BillingGetCustomerOverrideById(ctx, customerId, reqEditors...) +// GetBillingProfileCustomerOverrideWithResponse request returning *GetBillingProfileCustomerOverrideResponse +func (c *ClientWithResponses) GetBillingProfileCustomerOverrideWithResponse(ctx context.Context, customerId string, reqEditors ...RequestEditorFn) (*GetBillingProfileCustomerOverrideResponse, error) { + rsp, err := c.GetBillingProfileCustomerOverride(ctx, customerId, reqEditors...) if err != nil { return nil, err } - return ParseBillingGetCustomerOverrideByIdResponse(rsp) + return ParseGetBillingProfileCustomerOverrideResponse(rsp) } -// BillingUpsertCustomerOverrideWithBodyWithResponse request with arbitrary body returning *BillingUpsertCustomerOverrideResponse -func (c *ClientWithResponses) BillingUpsertCustomerOverrideWithBodyWithResponse(ctx context.Context, customerId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*BillingUpsertCustomerOverrideResponse, error) { - rsp, err := c.BillingUpsertCustomerOverrideWithBody(ctx, customerId, contentType, body, reqEditors...) +// UpsertBillingProfileCustomerOverrideWithBodyWithResponse request with arbitrary body returning *UpsertBillingProfileCustomerOverrideResponse +func (c *ClientWithResponses) UpsertBillingProfileCustomerOverrideWithBodyWithResponse(ctx context.Context, customerId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*UpsertBillingProfileCustomerOverrideResponse, error) { + rsp, err := c.UpsertBillingProfileCustomerOverrideWithBody(ctx, customerId, contentType, body, reqEditors...) if err != nil { return nil, err } - return ParseBillingUpsertCustomerOverrideResponse(rsp) + return ParseUpsertBillingProfileCustomerOverrideResponse(rsp) } -func (c *ClientWithResponses) BillingUpsertCustomerOverrideWithResponse(ctx context.Context, customerId string, body BillingUpsertCustomerOverrideJSONRequestBody, reqEditors ...RequestEditorFn) (*BillingUpsertCustomerOverrideResponse, error) { - rsp, err := c.BillingUpsertCustomerOverride(ctx, customerId, body, reqEditors...) +func (c *ClientWithResponses) UpsertBillingProfileCustomerOverrideWithResponse(ctx context.Context, customerId string, body UpsertBillingProfileCustomerOverrideJSONRequestBody, reqEditors ...RequestEditorFn) (*UpsertBillingProfileCustomerOverrideResponse, error) { + rsp, err := c.UpsertBillingProfileCustomerOverride(ctx, customerId, body, reqEditors...) if err != nil { return nil, err } - return ParseBillingUpsertCustomerOverrideResponse(rsp) + return ParseUpsertBillingProfileCustomerOverrideResponse(rsp) } -// BillingListInvoicesWithResponse request returning *BillingListInvoicesResponse -func (c *ClientWithResponses) BillingListInvoicesWithResponse(ctx context.Context, params *BillingListInvoicesParams, reqEditors ...RequestEditorFn) (*BillingListInvoicesResponse, error) { - rsp, err := c.BillingListInvoices(ctx, params, reqEditors...) +// ListInvoicesWithResponse request returning *ListInvoicesResponse +func (c *ClientWithResponses) ListInvoicesWithResponse(ctx context.Context, params *ListInvoicesParams, reqEditors ...RequestEditorFn) (*ListInvoicesResponse, error) { + rsp, err := c.ListInvoices(ctx, params, reqEditors...) if err != nil { return nil, err } - return ParseBillingListInvoicesResponse(rsp) + return ParseListInvoicesResponse(rsp) } -// BillingListInvoicesByCustomerWithResponse request returning *BillingListInvoicesByCustomerResponse -func (c *ClientWithResponses) BillingListInvoicesByCustomerWithResponse(ctx context.Context, customerId string, params *BillingListInvoicesByCustomerParams, reqEditors ...RequestEditorFn) (*BillingListInvoicesByCustomerResponse, error) { - rsp, err := c.BillingListInvoicesByCustomer(ctx, customerId, params, reqEditors...) +// ListInvoicesByCustomerWithResponse request returning *ListInvoicesByCustomerResponse +func (c *ClientWithResponses) ListInvoicesByCustomerWithResponse(ctx context.Context, customerId string, params *ListInvoicesByCustomerParams, reqEditors ...RequestEditorFn) (*ListInvoicesByCustomerResponse, error) { + rsp, err := c.ListInvoicesByCustomer(ctx, customerId, params, reqEditors...) if err != nil { return nil, err } - return ParseBillingListInvoicesByCustomerResponse(rsp) + return ParseListInvoicesByCustomerResponse(rsp) } -// BillingCreateInvoiceWithBodyWithResponse request with arbitrary body returning *BillingCreateInvoiceResponse -func (c *ClientWithResponses) BillingCreateInvoiceWithBodyWithResponse(ctx context.Context, customerId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*BillingCreateInvoiceResponse, error) { - rsp, err := c.BillingCreateInvoiceWithBody(ctx, customerId, contentType, body, reqEditors...) +// InvoicePendingLinesActionWithBodyWithResponse request with arbitrary body returning *InvoicePendingLinesActionResponse +func (c *ClientWithResponses) InvoicePendingLinesActionWithBodyWithResponse(ctx context.Context, customerId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*InvoicePendingLinesActionResponse, error) { + rsp, err := c.InvoicePendingLinesActionWithBody(ctx, customerId, contentType, body, reqEditors...) if err != nil { return nil, err } - return ParseBillingCreateInvoiceResponse(rsp) + return ParseInvoicePendingLinesActionResponse(rsp) } -func (c *ClientWithResponses) BillingCreateInvoiceWithResponse(ctx context.Context, customerId string, body BillingCreateInvoiceJSONRequestBody, reqEditors ...RequestEditorFn) (*BillingCreateInvoiceResponse, error) { - rsp, err := c.BillingCreateInvoice(ctx, customerId, body, reqEditors...) +func (c *ClientWithResponses) InvoicePendingLinesActionWithResponse(ctx context.Context, customerId string, body InvoicePendingLinesActionJSONRequestBody, reqEditors ...RequestEditorFn) (*InvoicePendingLinesActionResponse, error) { + rsp, err := c.InvoicePendingLinesAction(ctx, customerId, body, reqEditors...) if err != nil { return nil, err } - return ParseBillingCreateInvoiceResponse(rsp) + return ParseInvoicePendingLinesActionResponse(rsp) } -// BillingDeleteInvoiceByCustomerInvoiceIdWithResponse request returning *BillingDeleteInvoiceByCustomerInvoiceIdResponse -func (c *ClientWithResponses) BillingDeleteInvoiceByCustomerInvoiceIdWithResponse(ctx context.Context, customerId string, invoiceId string, reqEditors ...RequestEditorFn) (*BillingDeleteInvoiceByCustomerInvoiceIdResponse, error) { - rsp, err := c.BillingDeleteInvoiceByCustomerInvoiceId(ctx, customerId, invoiceId, reqEditors...) +// DeleteInvoiceWithResponse request returning *DeleteInvoiceResponse +func (c *ClientWithResponses) DeleteInvoiceWithResponse(ctx context.Context, customerId string, invoiceId string, reqEditors ...RequestEditorFn) (*DeleteInvoiceResponse, error) { + rsp, err := c.DeleteInvoice(ctx, customerId, invoiceId, reqEditors...) if err != nil { return nil, err } - return ParseBillingDeleteInvoiceByCustomerInvoiceIdResponse(rsp) + return ParseDeleteInvoiceResponse(rsp) } -// BillingGetInvoiceByCustomerInvoiceIdWithResponse request returning *BillingGetInvoiceByCustomerInvoiceIdResponse -func (c *ClientWithResponses) BillingGetInvoiceByCustomerInvoiceIdWithResponse(ctx context.Context, customerId string, invoiceId string, params *BillingGetInvoiceByCustomerInvoiceIdParams, reqEditors ...RequestEditorFn) (*BillingGetInvoiceByCustomerInvoiceIdResponse, error) { - rsp, err := c.BillingGetInvoiceByCustomerInvoiceId(ctx, customerId, invoiceId, params, reqEditors...) +// GetInvoiceWithResponse request returning *GetInvoiceResponse +func (c *ClientWithResponses) GetInvoiceWithResponse(ctx context.Context, customerId string, invoiceId string, params *GetInvoiceParams, reqEditors ...RequestEditorFn) (*GetInvoiceResponse, error) { + rsp, err := c.GetInvoice(ctx, customerId, invoiceId, params, reqEditors...) if err != nil { return nil, err } - return ParseBillingGetInvoiceByCustomerInvoiceIdResponse(rsp) + return ParseGetInvoiceResponse(rsp) } -// BillingInvoiceAdvanceWithResponse request returning *BillingInvoiceAdvanceResponse -func (c *ClientWithResponses) BillingInvoiceAdvanceWithResponse(ctx context.Context, customerId string, invoiceId string, reqEditors ...RequestEditorFn) (*BillingInvoiceAdvanceResponse, error) { - rsp, err := c.BillingInvoiceAdvance(ctx, customerId, invoiceId, reqEditors...) +// AdvanceInvoiceActionWithResponse request returning *AdvanceInvoiceActionResponse +func (c *ClientWithResponses) AdvanceInvoiceActionWithResponse(ctx context.Context, customerId string, invoiceId string, reqEditors ...RequestEditorFn) (*AdvanceInvoiceActionResponse, error) { + rsp, err := c.AdvanceInvoiceAction(ctx, customerId, invoiceId, reqEditors...) if err != nil { return nil, err } - return ParseBillingInvoiceAdvanceResponse(rsp) + return ParseAdvanceInvoiceActionResponse(rsp) } -// BillingApproveInvoiceWithResponse request returning *BillingApproveInvoiceResponse -func (c *ClientWithResponses) BillingApproveInvoiceWithResponse(ctx context.Context, customerId string, invoiceId string, reqEditors ...RequestEditorFn) (*BillingApproveInvoiceResponse, error) { - rsp, err := c.BillingApproveInvoice(ctx, customerId, invoiceId, reqEditors...) +// ApproveInvoiceActionWithResponse request returning *ApproveInvoiceActionResponse +func (c *ClientWithResponses) ApproveInvoiceActionWithResponse(ctx context.Context, customerId string, invoiceId string, reqEditors ...RequestEditorFn) (*ApproveInvoiceActionResponse, error) { + rsp, err := c.ApproveInvoiceAction(ctx, customerId, invoiceId, reqEditors...) if err != nil { return nil, err } - return ParseBillingApproveInvoiceResponse(rsp) + return ParseApproveInvoiceActionResponse(rsp) } -// BillingDeleteInvoiceLineWithResponse request returning *BillingDeleteInvoiceLineResponse -func (c *ClientWithResponses) BillingDeleteInvoiceLineWithResponse(ctx context.Context, customerId string, invoiceId string, lineId string, reqEditors ...RequestEditorFn) (*BillingDeleteInvoiceLineResponse, error) { - rsp, err := c.BillingDeleteInvoiceLine(ctx, customerId, invoiceId, lineId, reqEditors...) +// DeleteInvoiceLineWithResponse request returning *DeleteInvoiceLineResponse +func (c *ClientWithResponses) DeleteInvoiceLineWithResponse(ctx context.Context, customerId string, invoiceId string, lineId string, reqEditors ...RequestEditorFn) (*DeleteInvoiceLineResponse, error) { + rsp, err := c.DeleteInvoiceLine(ctx, customerId, invoiceId, lineId, reqEditors...) if err != nil { return nil, err } - return ParseBillingDeleteInvoiceLineResponse(rsp) + return ParseDeleteInvoiceLineResponse(rsp) } -// BillingGetInvoiceLineWithResponse request returning *BillingGetInvoiceLineResponse -func (c *ClientWithResponses) BillingGetInvoiceLineWithResponse(ctx context.Context, customerId string, invoiceId string, lineId string, reqEditors ...RequestEditorFn) (*BillingGetInvoiceLineResponse, error) { - rsp, err := c.BillingGetInvoiceLine(ctx, customerId, invoiceId, lineId, reqEditors...) +// GetInvoiceLineWithResponse request returning *GetInvoiceLineResponse +func (c *ClientWithResponses) GetInvoiceLineWithResponse(ctx context.Context, customerId string, invoiceId string, lineId string, reqEditors ...RequestEditorFn) (*GetInvoiceLineResponse, error) { + rsp, err := c.GetInvoiceLine(ctx, customerId, invoiceId, lineId, reqEditors...) if err != nil { return nil, err } - return ParseBillingGetInvoiceLineResponse(rsp) + return ParseGetInvoiceLineResponse(rsp) } -// BillingUpdateInvoiceLineWithBodyWithResponse request with arbitrary body returning *BillingUpdateInvoiceLineResponse -func (c *ClientWithResponses) BillingUpdateInvoiceLineWithBodyWithResponse(ctx context.Context, customerId string, invoiceId string, lineId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*BillingUpdateInvoiceLineResponse, error) { - rsp, err := c.BillingUpdateInvoiceLineWithBody(ctx, customerId, invoiceId, lineId, contentType, body, reqEditors...) +// UpdateInvoiceLineWithBodyWithResponse request with arbitrary body returning *UpdateInvoiceLineResponse +func (c *ClientWithResponses) UpdateInvoiceLineWithBodyWithResponse(ctx context.Context, customerId string, invoiceId string, lineId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*UpdateInvoiceLineResponse, error) { + rsp, err := c.UpdateInvoiceLineWithBody(ctx, customerId, invoiceId, lineId, contentType, body, reqEditors...) if err != nil { return nil, err } - return ParseBillingUpdateInvoiceLineResponse(rsp) + return ParseUpdateInvoiceLineResponse(rsp) } -func (c *ClientWithResponses) BillingUpdateInvoiceLineWithResponse(ctx context.Context, customerId string, invoiceId string, lineId string, body BillingUpdateInvoiceLineJSONRequestBody, reqEditors ...RequestEditorFn) (*BillingUpdateInvoiceLineResponse, error) { - rsp, err := c.BillingUpdateInvoiceLine(ctx, customerId, invoiceId, lineId, body, reqEditors...) +func (c *ClientWithResponses) UpdateInvoiceLineWithResponse(ctx context.Context, customerId string, invoiceId string, lineId string, body UpdateInvoiceLineJSONRequestBody, reqEditors ...RequestEditorFn) (*UpdateInvoiceLineResponse, error) { + rsp, err := c.UpdateInvoiceLine(ctx, customerId, invoiceId, lineId, body, reqEditors...) if err != nil { return nil, err } - return ParseBillingUpdateInvoiceLineResponse(rsp) + return ParseUpdateInvoiceLineResponse(rsp) } -// BillingInvoiceRetryWithResponse request returning *BillingInvoiceRetryResponse -func (c *ClientWithResponses) BillingInvoiceRetryWithResponse(ctx context.Context, customerId string, invoiceId string, reqEditors ...RequestEditorFn) (*BillingInvoiceRetryResponse, error) { - rsp, err := c.BillingInvoiceRetry(ctx, customerId, invoiceId, reqEditors...) +// RetryInvoiceActionWithResponse request returning *RetryInvoiceActionResponse +func (c *ClientWithResponses) RetryInvoiceActionWithResponse(ctx context.Context, customerId string, invoiceId string, reqEditors ...RequestEditorFn) (*RetryInvoiceActionResponse, error) { + rsp, err := c.RetryInvoiceAction(ctx, customerId, invoiceId, reqEditors...) if err != nil { return nil, err } - return ParseBillingInvoiceRetryResponse(rsp) + return ParseRetryInvoiceActionResponse(rsp) } -// BillingRecalculateInvoiceTaxWithResponse request returning *BillingRecalculateInvoiceTaxResponse -func (c *ClientWithResponses) BillingRecalculateInvoiceTaxWithResponse(ctx context.Context, customerId string, invoiceId string, reqEditors ...RequestEditorFn) (*BillingRecalculateInvoiceTaxResponse, error) { - rsp, err := c.BillingRecalculateInvoiceTax(ctx, customerId, invoiceId, reqEditors...) +// RecalculateInvoiceTaxActionWithResponse request returning *RecalculateInvoiceTaxActionResponse +func (c *ClientWithResponses) RecalculateInvoiceTaxActionWithResponse(ctx context.Context, customerId string, invoiceId string, reqEditors ...RequestEditorFn) (*RecalculateInvoiceTaxActionResponse, error) { + rsp, err := c.RecalculateInvoiceTaxAction(ctx, customerId, invoiceId, reqEditors...) if err != nil { return nil, err } - return ParseBillingRecalculateInvoiceTaxResponse(rsp) + return ParseRecalculateInvoiceTaxActionResponse(rsp) } -// BillingVoidInvoiceWithBodyWithResponse request with arbitrary body returning *BillingVoidInvoiceResponse -func (c *ClientWithResponses) BillingVoidInvoiceWithBodyWithResponse(ctx context.Context, customerId string, invoiceId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*BillingVoidInvoiceResponse, error) { - rsp, err := c.BillingVoidInvoiceWithBody(ctx, customerId, invoiceId, contentType, body, reqEditors...) +// VoidInvoiceActionWithBodyWithResponse request with arbitrary body returning *VoidInvoiceActionResponse +func (c *ClientWithResponses) VoidInvoiceActionWithBodyWithResponse(ctx context.Context, customerId string, invoiceId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*VoidInvoiceActionResponse, error) { + rsp, err := c.VoidInvoiceActionWithBody(ctx, customerId, invoiceId, contentType, body, reqEditors...) if err != nil { return nil, err } - return ParseBillingVoidInvoiceResponse(rsp) + return ParseVoidInvoiceActionResponse(rsp) } -func (c *ClientWithResponses) BillingVoidInvoiceWithResponse(ctx context.Context, customerId string, invoiceId string, body BillingVoidInvoiceJSONRequestBody, reqEditors ...RequestEditorFn) (*BillingVoidInvoiceResponse, error) { - rsp, err := c.BillingVoidInvoice(ctx, customerId, invoiceId, body, reqEditors...) +func (c *ClientWithResponses) VoidInvoiceActionWithResponse(ctx context.Context, customerId string, invoiceId string, body VoidInvoiceActionJSONRequestBody, reqEditors ...RequestEditorFn) (*VoidInvoiceActionResponse, error) { + rsp, err := c.VoidInvoiceAction(ctx, customerId, invoiceId, body, reqEditors...) if err != nil { return nil, err } - return ParseBillingVoidInvoiceResponse(rsp) + return ParseVoidInvoiceActionResponse(rsp) } -// BillingCreateLineByCustomerWithBodyWithResponse request with arbitrary body returning *BillingCreateLineByCustomerResponse -func (c *ClientWithResponses) BillingCreateLineByCustomerWithBodyWithResponse(ctx context.Context, customerId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*BillingCreateLineByCustomerResponse, error) { - rsp, err := c.BillingCreateLineByCustomerWithBody(ctx, customerId, contentType, body, reqEditors...) +// CreateInvoiceLineByCustomerWithBodyWithResponse request with arbitrary body returning *CreateInvoiceLineByCustomerResponse +func (c *ClientWithResponses) CreateInvoiceLineByCustomerWithBodyWithResponse(ctx context.Context, customerId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*CreateInvoiceLineByCustomerResponse, error) { + rsp, err := c.CreateInvoiceLineByCustomerWithBody(ctx, customerId, contentType, body, reqEditors...) if err != nil { return nil, err } - return ParseBillingCreateLineByCustomerResponse(rsp) + return ParseCreateInvoiceLineByCustomerResponse(rsp) } -func (c *ClientWithResponses) BillingCreateLineByCustomerWithResponse(ctx context.Context, customerId string, body BillingCreateLineByCustomerJSONRequestBody, reqEditors ...RequestEditorFn) (*BillingCreateLineByCustomerResponse, error) { - rsp, err := c.BillingCreateLineByCustomer(ctx, customerId, body, reqEditors...) +func (c *ClientWithResponses) CreateInvoiceLineByCustomerWithResponse(ctx context.Context, customerId string, body CreateInvoiceLineByCustomerJSONRequestBody, reqEditors ...RequestEditorFn) (*CreateInvoiceLineByCustomerResponse, error) { + rsp, err := c.CreateInvoiceLineByCustomer(ctx, customerId, body, reqEditors...) if err != nil { return nil, err } - return ParseBillingCreateLineByCustomerResponse(rsp) + return ParseCreateInvoiceLineByCustomerResponse(rsp) } -// BillingListProfilesWithResponse request returning *BillingListProfilesResponse -func (c *ClientWithResponses) BillingListProfilesWithResponse(ctx context.Context, params *BillingListProfilesParams, reqEditors ...RequestEditorFn) (*BillingListProfilesResponse, error) { - rsp, err := c.BillingListProfiles(ctx, params, reqEditors...) +// ListBillingProfilesWithResponse request returning *ListBillingProfilesResponse +func (c *ClientWithResponses) ListBillingProfilesWithResponse(ctx context.Context, params *ListBillingProfilesParams, reqEditors ...RequestEditorFn) (*ListBillingProfilesResponse, error) { + rsp, err := c.ListBillingProfiles(ctx, params, reqEditors...) if err != nil { return nil, err } - return ParseBillingListProfilesResponse(rsp) + return ParseListBillingProfilesResponse(rsp) } -// BillingCreateProfileWithBodyWithResponse request with arbitrary body returning *BillingCreateProfileResponse -func (c *ClientWithResponses) BillingCreateProfileWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*BillingCreateProfileResponse, error) { - rsp, err := c.BillingCreateProfileWithBody(ctx, contentType, body, reqEditors...) +// CreateBillingProfileWithBodyWithResponse request with arbitrary body returning *CreateBillingProfileResponse +func (c *ClientWithResponses) CreateBillingProfileWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*CreateBillingProfileResponse, error) { + rsp, err := c.CreateBillingProfileWithBody(ctx, contentType, body, reqEditors...) if err != nil { return nil, err } - return ParseBillingCreateProfileResponse(rsp) + return ParseCreateBillingProfileResponse(rsp) } -func (c *ClientWithResponses) BillingCreateProfileWithResponse(ctx context.Context, body BillingCreateProfileJSONRequestBody, reqEditors ...RequestEditorFn) (*BillingCreateProfileResponse, error) { - rsp, err := c.BillingCreateProfile(ctx, body, reqEditors...) +func (c *ClientWithResponses) CreateBillingProfileWithResponse(ctx context.Context, body CreateBillingProfileJSONRequestBody, reqEditors ...RequestEditorFn) (*CreateBillingProfileResponse, error) { + rsp, err := c.CreateBillingProfile(ctx, body, reqEditors...) if err != nil { return nil, err } - return ParseBillingCreateProfileResponse(rsp) + return ParseCreateBillingProfileResponse(rsp) } -// BillingArchiveProfileWithResponse request returning *BillingArchiveProfileResponse -func (c *ClientWithResponses) BillingArchiveProfileWithResponse(ctx context.Context, id string, reqEditors ...RequestEditorFn) (*BillingArchiveProfileResponse, error) { - rsp, err := c.BillingArchiveProfile(ctx, id, reqEditors...) +// DeleteBillingProfileWithResponse request returning *DeleteBillingProfileResponse +func (c *ClientWithResponses) DeleteBillingProfileWithResponse(ctx context.Context, id string, reqEditors ...RequestEditorFn) (*DeleteBillingProfileResponse, error) { + rsp, err := c.DeleteBillingProfile(ctx, id, reqEditors...) if err != nil { return nil, err } - return ParseBillingArchiveProfileResponse(rsp) + return ParseDeleteBillingProfileResponse(rsp) } -// BillingGetProfileWithResponse request returning *BillingGetProfileResponse -func (c *ClientWithResponses) BillingGetProfileWithResponse(ctx context.Context, id string, params *BillingGetProfileParams, reqEditors ...RequestEditorFn) (*BillingGetProfileResponse, error) { - rsp, err := c.BillingGetProfile(ctx, id, params, reqEditors...) +// GetBillingProfileWithResponse request returning *GetBillingProfileResponse +func (c *ClientWithResponses) GetBillingProfileWithResponse(ctx context.Context, id string, params *GetBillingProfileParams, reqEditors ...RequestEditorFn) (*GetBillingProfileResponse, error) { + rsp, err := c.GetBillingProfile(ctx, id, params, reqEditors...) if err != nil { return nil, err } - return ParseBillingGetProfileResponse(rsp) + return ParseGetBillingProfileResponse(rsp) } -// BillingUpdateProfileWithBodyWithResponse request with arbitrary body returning *BillingUpdateProfileResponse -func (c *ClientWithResponses) BillingUpdateProfileWithBodyWithResponse(ctx context.Context, id string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*BillingUpdateProfileResponse, error) { - rsp, err := c.BillingUpdateProfileWithBody(ctx, id, contentType, body, reqEditors...) +// UpdateBillingProfileWithBodyWithResponse request with arbitrary body returning *UpdateBillingProfileResponse +func (c *ClientWithResponses) UpdateBillingProfileWithBodyWithResponse(ctx context.Context, id string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*UpdateBillingProfileResponse, error) { + rsp, err := c.UpdateBillingProfileWithBody(ctx, id, contentType, body, reqEditors...) if err != nil { return nil, err } - return ParseBillingUpdateProfileResponse(rsp) + return ParseUpdateBillingProfileResponse(rsp) } -func (c *ClientWithResponses) BillingUpdateProfileWithResponse(ctx context.Context, id string, body BillingUpdateProfileJSONRequestBody, reqEditors ...RequestEditorFn) (*BillingUpdateProfileResponse, error) { - rsp, err := c.BillingUpdateProfile(ctx, id, body, reqEditors...) +func (c *ClientWithResponses) UpdateBillingProfileWithResponse(ctx context.Context, id string, body UpdateBillingProfileJSONRequestBody, reqEditors ...RequestEditorFn) (*UpdateBillingProfileResponse, error) { + rsp, err := c.UpdateBillingProfile(ctx, id, body, reqEditors...) if err != nil { return nil, err } - return ParseBillingUpdateProfileResponse(rsp) + return ParseUpdateBillingProfileResponse(rsp) } // ListCustomersWithResponse request returning *ListCustomersResponse @@ -21251,22 +21578,22 @@ func ParseAppStripeWebhookResponse(rsp *http.Response) (*AppStripeWebhookRespons return response, nil } -// ParseBillingListCustomerOverridesResponse parses an HTTP response from a BillingListCustomerOverridesWithResponse call -func ParseBillingListCustomerOverridesResponse(rsp *http.Response) (*BillingListCustomerOverridesResponse, error) { +// ParseListBillingProfileCustomerOverridesResponse parses an HTTP response from a ListBillingProfileCustomerOverridesWithResponse call +func ParseListBillingProfileCustomerOverridesResponse(rsp *http.Response) (*ListBillingProfileCustomerOverridesResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) defer func() { _ = rsp.Body.Close() }() if err != nil { return nil, err } - response := &BillingListCustomerOverridesResponse{ + response := &ListBillingProfileCustomerOverridesResponse{ Body: bodyBytes, HTTPResponse: rsp, } switch { case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: - var dest CustomerOverridePaginatedResponse + var dest BillingProfileCustomerOverridePaginatedResponse if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err } @@ -21319,15 +21646,15 @@ func ParseBillingListCustomerOverridesResponse(rsp *http.Response) (*BillingList return response, nil } -// ParseBillingDeleteCustomerOverrideResponse parses an HTTP response from a BillingDeleteCustomerOverrideWithResponse call -func ParseBillingDeleteCustomerOverrideResponse(rsp *http.Response) (*BillingDeleteCustomerOverrideResponse, error) { +// ParseDeleteBillingProfileCustomerOverrideResponse parses an HTTP response from a DeleteBillingProfileCustomerOverrideWithResponse call +func ParseDeleteBillingProfileCustomerOverrideResponse(rsp *http.Response) (*DeleteBillingProfileCustomerOverrideResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) defer func() { _ = rsp.Body.Close() }() if err != nil { return nil, err } - response := &BillingDeleteCustomerOverrideResponse{ + response := &DeleteBillingProfileCustomerOverrideResponse{ Body: bodyBytes, HTTPResponse: rsp, } @@ -21387,22 +21714,22 @@ func ParseBillingDeleteCustomerOverrideResponse(rsp *http.Response) (*BillingDel return response, nil } -// ParseBillingGetCustomerOverrideByIdResponse parses an HTTP response from a BillingGetCustomerOverrideByIdWithResponse call -func ParseBillingGetCustomerOverrideByIdResponse(rsp *http.Response) (*BillingGetCustomerOverrideByIdResponse, error) { +// ParseGetBillingProfileCustomerOverrideResponse parses an HTTP response from a GetBillingProfileCustomerOverrideWithResponse call +func ParseGetBillingProfileCustomerOverrideResponse(rsp *http.Response) (*GetBillingProfileCustomerOverrideResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) defer func() { _ = rsp.Body.Close() }() if err != nil { return nil, err } - response := &BillingGetCustomerOverrideByIdResponse{ + response := &GetBillingProfileCustomerOverrideResponse{ Body: bodyBytes, HTTPResponse: rsp, } switch { case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: - var dest BillingCustomerOverride + var dest BillingProfileCustomerOverride if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err } @@ -21462,29 +21789,31 @@ func ParseBillingGetCustomerOverrideByIdResponse(rsp *http.Response) (*BillingGe return response, nil } -// ParseBillingUpsertCustomerOverrideResponse parses an HTTP response from a BillingUpsertCustomerOverrideWithResponse call -func ParseBillingUpsertCustomerOverrideResponse(rsp *http.Response) (*BillingUpsertCustomerOverrideResponse, error) { +// ParseUpsertBillingProfileCustomerOverrideResponse parses an HTTP response from a UpsertBillingProfileCustomerOverrideWithResponse call +func ParseUpsertBillingProfileCustomerOverrideResponse(rsp *http.Response) (*UpsertBillingProfileCustomerOverrideResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) defer func() { _ = rsp.Body.Close() }() if err != nil { return nil, err } - response := &BillingUpsertCustomerOverrideResponse{ + response := &UpsertBillingProfileCustomerOverrideResponse{ Body: bodyBytes, HTTPResponse: rsp, } switch { case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: - var dest BillingCustomerOverride + var dest struct { + union json.RawMessage + } if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err } response.JSON200 = &dest case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 201: - var dest BillingCustomerOverride + var dest BillingProfileCustomerOverride if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err } @@ -21544,15 +21873,15 @@ func ParseBillingUpsertCustomerOverrideResponse(rsp *http.Response) (*BillingUps return response, nil } -// ParseBillingListInvoicesResponse parses an HTTP response from a BillingListInvoicesWithResponse call -func ParseBillingListInvoicesResponse(rsp *http.Response) (*BillingListInvoicesResponse, error) { +// ParseListInvoicesResponse parses an HTTP response from a ListInvoicesWithResponse call +func ParseListInvoicesResponse(rsp *http.Response) (*ListInvoicesResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) defer func() { _ = rsp.Body.Close() }() if err != nil { return nil, err } - response := &BillingListInvoicesResponse{ + response := &ListInvoicesResponse{ Body: bodyBytes, HTTPResponse: rsp, } @@ -21612,15 +21941,15 @@ func ParseBillingListInvoicesResponse(rsp *http.Response) (*BillingListInvoicesR return response, nil } -// ParseBillingListInvoicesByCustomerResponse parses an HTTP response from a BillingListInvoicesByCustomerWithResponse call -func ParseBillingListInvoicesByCustomerResponse(rsp *http.Response) (*BillingListInvoicesByCustomerResponse, error) { +// ParseListInvoicesByCustomerResponse parses an HTTP response from a ListInvoicesByCustomerWithResponse call +func ParseListInvoicesByCustomerResponse(rsp *http.Response) (*ListInvoicesByCustomerResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) defer func() { _ = rsp.Body.Close() }() if err != nil { return nil, err } - response := &BillingListInvoicesByCustomerResponse{ + response := &ListInvoicesByCustomerResponse{ Body: bodyBytes, HTTPResponse: rsp, } @@ -21680,22 +22009,22 @@ func ParseBillingListInvoicesByCustomerResponse(rsp *http.Response) (*BillingLis return response, nil } -// ParseBillingCreateInvoiceResponse parses an HTTP response from a BillingCreateInvoiceWithResponse call -func ParseBillingCreateInvoiceResponse(rsp *http.Response) (*BillingCreateInvoiceResponse, error) { +// ParseInvoicePendingLinesActionResponse parses an HTTP response from a InvoicePendingLinesActionWithResponse call +func ParseInvoicePendingLinesActionResponse(rsp *http.Response) (*InvoicePendingLinesActionResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) defer func() { _ = rsp.Body.Close() }() if err != nil { return nil, err } - response := &BillingCreateInvoiceResponse{ + response := &InvoicePendingLinesActionResponse{ Body: bodyBytes, HTTPResponse: rsp, } switch { case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 201: - var dest []BillingInvoice + var dest []Invoice if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err } @@ -21748,15 +22077,15 @@ func ParseBillingCreateInvoiceResponse(rsp *http.Response) (*BillingCreateInvoic return response, nil } -// ParseBillingDeleteInvoiceByCustomerInvoiceIdResponse parses an HTTP response from a BillingDeleteInvoiceByCustomerInvoiceIdWithResponse call -func ParseBillingDeleteInvoiceByCustomerInvoiceIdResponse(rsp *http.Response) (*BillingDeleteInvoiceByCustomerInvoiceIdResponse, error) { +// ParseDeleteInvoiceResponse parses an HTTP response from a DeleteInvoiceWithResponse call +func ParseDeleteInvoiceResponse(rsp *http.Response) (*DeleteInvoiceResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) defer func() { _ = rsp.Body.Close() }() if err != nil { return nil, err } - response := &BillingDeleteInvoiceByCustomerInvoiceIdResponse{ + response := &DeleteInvoiceResponse{ Body: bodyBytes, HTTPResponse: rsp, } @@ -21816,22 +22145,22 @@ func ParseBillingDeleteInvoiceByCustomerInvoiceIdResponse(rsp *http.Response) (* return response, nil } -// ParseBillingGetInvoiceByCustomerInvoiceIdResponse parses an HTTP response from a BillingGetInvoiceByCustomerInvoiceIdWithResponse call -func ParseBillingGetInvoiceByCustomerInvoiceIdResponse(rsp *http.Response) (*BillingGetInvoiceByCustomerInvoiceIdResponse, error) { +// ParseGetInvoiceResponse parses an HTTP response from a GetInvoiceWithResponse call +func ParseGetInvoiceResponse(rsp *http.Response) (*GetInvoiceResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) defer func() { _ = rsp.Body.Close() }() if err != nil { return nil, err } - response := &BillingGetInvoiceByCustomerInvoiceIdResponse{ + response := &GetInvoiceResponse{ Body: bodyBytes, HTTPResponse: rsp, } switch { case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: - var dest BillingInvoice + var dest Invoice if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err } @@ -21891,22 +22220,22 @@ func ParseBillingGetInvoiceByCustomerInvoiceIdResponse(rsp *http.Response) (*Bil return response, nil } -// ParseBillingInvoiceAdvanceResponse parses an HTTP response from a BillingInvoiceAdvanceWithResponse call -func ParseBillingInvoiceAdvanceResponse(rsp *http.Response) (*BillingInvoiceAdvanceResponse, error) { +// ParseAdvanceInvoiceActionResponse parses an HTTP response from a AdvanceInvoiceActionWithResponse call +func ParseAdvanceInvoiceActionResponse(rsp *http.Response) (*AdvanceInvoiceActionResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) defer func() { _ = rsp.Body.Close() }() if err != nil { return nil, err } - response := &BillingInvoiceAdvanceResponse{ + response := &AdvanceInvoiceActionResponse{ Body: bodyBytes, HTTPResponse: rsp, } switch { case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: - var dest BillingInvoice + var dest Invoice if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err } @@ -21966,22 +22295,22 @@ func ParseBillingInvoiceAdvanceResponse(rsp *http.Response) (*BillingInvoiceAdva return response, nil } -// ParseBillingApproveInvoiceResponse parses an HTTP response from a BillingApproveInvoiceWithResponse call -func ParseBillingApproveInvoiceResponse(rsp *http.Response) (*BillingApproveInvoiceResponse, error) { +// ParseApproveInvoiceActionResponse parses an HTTP response from a ApproveInvoiceActionWithResponse call +func ParseApproveInvoiceActionResponse(rsp *http.Response) (*ApproveInvoiceActionResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) defer func() { _ = rsp.Body.Close() }() if err != nil { return nil, err } - response := &BillingApproveInvoiceResponse{ + response := &ApproveInvoiceActionResponse{ Body: bodyBytes, HTTPResponse: rsp, } switch { case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: - var dest BillingInvoice + var dest Invoice if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err } @@ -22041,15 +22370,15 @@ func ParseBillingApproveInvoiceResponse(rsp *http.Response) (*BillingApproveInvo return response, nil } -// ParseBillingDeleteInvoiceLineResponse parses an HTTP response from a BillingDeleteInvoiceLineWithResponse call -func ParseBillingDeleteInvoiceLineResponse(rsp *http.Response) (*BillingDeleteInvoiceLineResponse, error) { +// ParseDeleteInvoiceLineResponse parses an HTTP response from a DeleteInvoiceLineWithResponse call +func ParseDeleteInvoiceLineResponse(rsp *http.Response) (*DeleteInvoiceLineResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) defer func() { _ = rsp.Body.Close() }() if err != nil { return nil, err } - response := &BillingDeleteInvoiceLineResponse{ + response := &DeleteInvoiceLineResponse{ Body: bodyBytes, HTTPResponse: rsp, } @@ -22109,26 +22438,26 @@ func ParseBillingDeleteInvoiceLineResponse(rsp *http.Response) (*BillingDeleteIn return response, nil } -// ParseBillingGetInvoiceLineResponse parses an HTTP response from a BillingGetInvoiceLineWithResponse call -func ParseBillingGetInvoiceLineResponse(rsp *http.Response) (*BillingGetInvoiceLineResponse, error) { +// ParseGetInvoiceLineResponse parses an HTTP response from a GetInvoiceLineWithResponse call +func ParseGetInvoiceLineResponse(rsp *http.Response) (*GetInvoiceLineResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) defer func() { _ = rsp.Body.Close() }() if err != nil { return nil, err } - response := &BillingGetInvoiceLineResponse{ + response := &GetInvoiceLineResponse{ Body: bodyBytes, HTTPResponse: rsp, } switch { - case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 204: - var dest BillingInvoiceLine + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: + var dest InvoiceLine if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err } - response.JSON204 = &dest + response.JSON200 = &dest case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 400: var dest BadRequestProblemResponse @@ -22184,22 +22513,22 @@ func ParseBillingGetInvoiceLineResponse(rsp *http.Response) (*BillingGetInvoiceL return response, nil } -// ParseBillingUpdateInvoiceLineResponse parses an HTTP response from a BillingUpdateInvoiceLineWithResponse call -func ParseBillingUpdateInvoiceLineResponse(rsp *http.Response) (*BillingUpdateInvoiceLineResponse, error) { +// ParseUpdateInvoiceLineResponse parses an HTTP response from a UpdateInvoiceLineWithResponse call +func ParseUpdateInvoiceLineResponse(rsp *http.Response) (*UpdateInvoiceLineResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) defer func() { _ = rsp.Body.Close() }() if err != nil { return nil, err } - response := &BillingUpdateInvoiceLineResponse{ + response := &UpdateInvoiceLineResponse{ Body: bodyBytes, HTTPResponse: rsp, } switch { case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: - var dest BillingInvoiceLine + var dest InvoiceLine if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err } @@ -22259,22 +22588,22 @@ func ParseBillingUpdateInvoiceLineResponse(rsp *http.Response) (*BillingUpdateIn return response, nil } -// ParseBillingInvoiceRetryResponse parses an HTTP response from a BillingInvoiceRetryWithResponse call -func ParseBillingInvoiceRetryResponse(rsp *http.Response) (*BillingInvoiceRetryResponse, error) { +// ParseRetryInvoiceActionResponse parses an HTTP response from a RetryInvoiceActionWithResponse call +func ParseRetryInvoiceActionResponse(rsp *http.Response) (*RetryInvoiceActionResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) defer func() { _ = rsp.Body.Close() }() if err != nil { return nil, err } - response := &BillingInvoiceRetryResponse{ + response := &RetryInvoiceActionResponse{ Body: bodyBytes, HTTPResponse: rsp, } switch { case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: - var dest BillingInvoice + var dest Invoice if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err } @@ -22334,22 +22663,22 @@ func ParseBillingInvoiceRetryResponse(rsp *http.Response) (*BillingInvoiceRetryR return response, nil } -// ParseBillingRecalculateInvoiceTaxResponse parses an HTTP response from a BillingRecalculateInvoiceTaxWithResponse call -func ParseBillingRecalculateInvoiceTaxResponse(rsp *http.Response) (*BillingRecalculateInvoiceTaxResponse, error) { +// ParseRecalculateInvoiceTaxActionResponse parses an HTTP response from a RecalculateInvoiceTaxActionWithResponse call +func ParseRecalculateInvoiceTaxActionResponse(rsp *http.Response) (*RecalculateInvoiceTaxActionResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) defer func() { _ = rsp.Body.Close() }() if err != nil { return nil, err } - response := &BillingRecalculateInvoiceTaxResponse{ + response := &RecalculateInvoiceTaxActionResponse{ Body: bodyBytes, HTTPResponse: rsp, } switch { case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: - var dest BillingInvoice + var dest Invoice if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err } @@ -22409,22 +22738,22 @@ func ParseBillingRecalculateInvoiceTaxResponse(rsp *http.Response) (*BillingReca return response, nil } -// ParseBillingVoidInvoiceResponse parses an HTTP response from a BillingVoidInvoiceWithResponse call -func ParseBillingVoidInvoiceResponse(rsp *http.Response) (*BillingVoidInvoiceResponse, error) { +// ParseVoidInvoiceActionResponse parses an HTTP response from a VoidInvoiceActionWithResponse call +func ParseVoidInvoiceActionResponse(rsp *http.Response) (*VoidInvoiceActionResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) defer func() { _ = rsp.Body.Close() }() if err != nil { return nil, err } - response := &BillingVoidInvoiceResponse{ + response := &VoidInvoiceActionResponse{ Body: bodyBytes, HTTPResponse: rsp, } switch { case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: - var dest BillingInvoice + var dest Invoice if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err } @@ -22484,22 +22813,22 @@ func ParseBillingVoidInvoiceResponse(rsp *http.Response) (*BillingVoidInvoiceRes return response, nil } -// ParseBillingCreateLineByCustomerResponse parses an HTTP response from a BillingCreateLineByCustomerWithResponse call -func ParseBillingCreateLineByCustomerResponse(rsp *http.Response) (*BillingCreateLineByCustomerResponse, error) { +// ParseCreateInvoiceLineByCustomerResponse parses an HTTP response from a CreateInvoiceLineByCustomerWithResponse call +func ParseCreateInvoiceLineByCustomerResponse(rsp *http.Response) (*CreateInvoiceLineByCustomerResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) defer func() { _ = rsp.Body.Close() }() if err != nil { return nil, err } - response := &BillingCreateLineByCustomerResponse{ + response := &CreateInvoiceLineByCustomerResponse{ Body: bodyBytes, HTTPResponse: rsp, } switch { case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 201: - var dest BillingInvoiceLines + var dest []InvoiceLine if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err } @@ -22552,22 +22881,22 @@ func ParseBillingCreateLineByCustomerResponse(rsp *http.Response) (*BillingCreat return response, nil } -// ParseBillingListProfilesResponse parses an HTTP response from a BillingListProfilesWithResponse call -func ParseBillingListProfilesResponse(rsp *http.Response) (*BillingListProfilesResponse, error) { +// ParseListBillingProfilesResponse parses an HTTP response from a ListBillingProfilesWithResponse call +func ParseListBillingProfilesResponse(rsp *http.Response) (*ListBillingProfilesResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) defer func() { _ = rsp.Body.Close() }() if err != nil { return nil, err } - response := &BillingListProfilesResponse{ + response := &ListBillingProfilesResponse{ Body: bodyBytes, HTTPResponse: rsp, } switch { case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: - var dest ProfilePaginatedResponse + var dest BillingProfilePaginatedResponse if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err } @@ -22620,15 +22949,15 @@ func ParseBillingListProfilesResponse(rsp *http.Response) (*BillingListProfilesR return response, nil } -// ParseBillingCreateProfileResponse parses an HTTP response from a BillingCreateProfileWithResponse call -func ParseBillingCreateProfileResponse(rsp *http.Response) (*BillingCreateProfileResponse, error) { +// ParseCreateBillingProfileResponse parses an HTTP response from a CreateBillingProfileWithResponse call +func ParseCreateBillingProfileResponse(rsp *http.Response) (*CreateBillingProfileResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) defer func() { _ = rsp.Body.Close() }() if err != nil { return nil, err } - response := &BillingCreateProfileResponse{ + response := &CreateBillingProfileResponse{ Body: bodyBytes, HTTPResponse: rsp, } @@ -22688,15 +23017,15 @@ func ParseBillingCreateProfileResponse(rsp *http.Response) (*BillingCreateProfil return response, nil } -// ParseBillingArchiveProfileResponse parses an HTTP response from a BillingArchiveProfileWithResponse call -func ParseBillingArchiveProfileResponse(rsp *http.Response) (*BillingArchiveProfileResponse, error) { +// ParseDeleteBillingProfileResponse parses an HTTP response from a DeleteBillingProfileWithResponse call +func ParseDeleteBillingProfileResponse(rsp *http.Response) (*DeleteBillingProfileResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) defer func() { _ = rsp.Body.Close() }() if err != nil { return nil, err } - response := &BillingArchiveProfileResponse{ + response := &DeleteBillingProfileResponse{ Body: bodyBytes, HTTPResponse: rsp, } @@ -22756,15 +23085,15 @@ func ParseBillingArchiveProfileResponse(rsp *http.Response) (*BillingArchiveProf return response, nil } -// ParseBillingGetProfileResponse parses an HTTP response from a BillingGetProfileWithResponse call -func ParseBillingGetProfileResponse(rsp *http.Response) (*BillingGetProfileResponse, error) { +// ParseGetBillingProfileResponse parses an HTTP response from a GetBillingProfileWithResponse call +func ParseGetBillingProfileResponse(rsp *http.Response) (*GetBillingProfileResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) defer func() { _ = rsp.Body.Close() }() if err != nil { return nil, err } - response := &BillingGetProfileResponse{ + response := &GetBillingProfileResponse{ Body: bodyBytes, HTTPResponse: rsp, } @@ -22831,15 +23160,15 @@ func ParseBillingGetProfileResponse(rsp *http.Response) (*BillingGetProfileRespo return response, nil } -// ParseBillingUpdateProfileResponse parses an HTTP response from a BillingUpdateProfileWithResponse call -func ParseBillingUpdateProfileResponse(rsp *http.Response) (*BillingUpdateProfileResponse, error) { +// ParseUpdateBillingProfileResponse parses an HTTP response from a UpdateBillingProfileWithResponse call +func ParseUpdateBillingProfileResponse(rsp *http.Response) (*UpdateBillingProfileResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) defer func() { _ = rsp.Body.Close() }() if err != nil { return nil, err } - response := &BillingUpdateProfileResponse{ + response := &UpdateBillingProfileResponse{ Body: bodyBytes, HTTPResponse: rsp, } @@ -28271,12 +28600,12 @@ func ParseCreateSubscriptionResponse(rsp *http.Response) (*CreateSubscriptionRes } switch { - case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 201: var dest Subscription if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err } - response.JSON200 = &dest + response.JSON201 = &dest case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 400: var dest BadRequestProblemResponse @@ -28347,9 +28676,7 @@ func ParseGetSubscriptionResponse(rsp *http.Response) (*GetSubscriptionResponse, switch { case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: - var dest struct { - union json.RawMessage - } + var dest SubscriptionExpanded if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err } @@ -28822,721 +29149,731 @@ func ParseUnscheduleCancelationResponse(rsp *http.Response) (*UnscheduleCancelat // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/api/openapi.cloud.yaml b/api/openapi.cloud.yaml index 179b4d762..f3b6ce76a 100644 --- a/api/openapi.cloud.yaml +++ b/api/openapi.cloud.yaml @@ -280,7 +280,7 @@ paths: x-internal: true /api/v1/billing/customer: get: - operationId: billingListCustomerOverrides + operationId: listBillingProfileCustomerOverrides summary: List customer overrides description: List customer overrides parameters: @@ -299,15 +299,15 @@ paths: - $ref: '#/components/parameters/Pagination.pageSize' - $ref: '#/components/parameters/LimitOffset.offset' - $ref: '#/components/parameters/LimitOffset.limit' - - $ref: '#/components/parameters/CustomerOverrideOrderByOrdering.order' - - $ref: '#/components/parameters/CustomerOverrideOrderByOrdering.orderBy' + - $ref: '#/components/parameters/BillingProfileCustomerOverrideOrderByOrdering.order' + - $ref: '#/components/parameters/BillingProfileCustomerOverrideOrderByOrdering.orderBy' responses: '200': description: The request has succeeded. content: application/json: schema: - $ref: '#/components/schemas/CustomerOverridePaginatedResponse' + $ref: '#/components/schemas/BillingProfileCustomerOverridePaginatedResponse' '400': description: The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing). content: @@ -349,9 +349,9 @@ paths: x-internal: true /api/v1/billing/customer/{customerId}: post: - operationId: billingUpsertCustomerOverride - summary: Create/update a customer override - description: Create/update a new customer override. + operationId: upsertBillingProfileCustomerOverride + summary: Create a new or update a customer override + description: Create a new or update an existing customer override. parameters: - name: customerId in: path @@ -366,13 +366,15 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/BillingCustomerOverride' + anyOf: + - $ref: '#/components/schemas/BillingProfileCustomerOverride' + - $ref: '#/components/schemas/BillingProfileCustomerOverride' '201': description: The request has succeeded and a new resource has been created as a result. content: application/json: schema: - $ref: '#/components/schemas/BillingCustomerOverride' + $ref: '#/components/schemas/BillingProfileCustomerOverride' '400': description: The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing). content: @@ -422,12 +424,12 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/BillingCustomerWorkflowOverride' + $ref: '#/components/schemas/BillingProfileCustomerOverrideCreate' x-internal: true get: - operationId: billingGetCustomerOverrideById + operationId: getBillingProfileCustomerOverride summary: Get a customer override - description: Get a customer override by id. + description: Get a customer override by customer id. parameters: - name: customerId in: path @@ -442,7 +444,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/BillingCustomerOverride' + $ref: '#/components/schemas/BillingProfileCustomerOverride' '400': description: The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing). content: @@ -489,9 +491,9 @@ paths: - Billing (Experimental) x-internal: true delete: - operationId: billingDeleteCustomerOverride + operationId: deleteBillingProfileCustomerOverride summary: Delete a customer override - description: Delete a customer override by id. + description: Delete a customer override by customer id. parameters: - name: customerId in: path @@ -550,7 +552,7 @@ paths: x-internal: true /api/v1/billing/invoices: get: - operationId: billingListInvoices + operationId: listInvoices summary: List invoices description: List invoices parameters: @@ -566,11 +568,11 @@ paths: description: ULID (Universally Unique Lexicographically Sortable Identifier). title: Filter by the customer ID or key explode: false - - $ref: '#/components/parameters/BillingInvoiceListParams.statuses' - - $ref: '#/components/parameters/BillingInvoiceListParams.extendedStatuses' - - $ref: '#/components/parameters/BillingInvoiceListParams.issuedAfter' - - $ref: '#/components/parameters/BillingInvoiceListParams.issuedBefore' - - $ref: '#/components/parameters/BillingInvoiceListParams.expand' + - $ref: '#/components/parameters/InvoiceListParams.statuses' + - $ref: '#/components/parameters/InvoiceListParams.extendedStatuses' + - $ref: '#/components/parameters/InvoiceListParams.issuedAfter' + - $ref: '#/components/parameters/InvoiceListParams.issuedBefore' + - $ref: '#/components/parameters/InvoiceListParams.expand' - $ref: '#/components/parameters/Pagination.page' - $ref: '#/components/parameters/Pagination.pageSize' - $ref: '#/components/parameters/LimitOffset.offset' @@ -624,19 +626,10 @@ paths: - Billing (Experimental) x-internal: true /api/v1/billing/invoices/{customerId}: - post: - operationId: billingCreateInvoice - summary: Create an invoice - description: |- - Create a new invoice from the pending line items. - - This should be only called if for some reason we need to invoice a customer outside of the normal billing cycle. - - When creating an invoice, the pending line items will be marked as invoiced and the invoice will be created with the total amount of the pending items. - - New pending line items will be created for the period between now() and the next billing cycle's begining date for any metered item. - - The call can return multiple invoices if the pending line items are in different currencies. + get: + operationId: listInvoicesByCustomer + summary: List invoices + description: List invoices for a specific customer parameters: - name: customerId in: path @@ -645,15 +638,24 @@ paths: type: string example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + - $ref: '#/components/parameters/InvoiceListParams.statuses' + - $ref: '#/components/parameters/InvoiceListParams.extendedStatuses' + - $ref: '#/components/parameters/InvoiceListParams.issuedAfter' + - $ref: '#/components/parameters/InvoiceListParams.issuedBefore' + - $ref: '#/components/parameters/InvoiceListParams.expand' + - $ref: '#/components/parameters/Pagination.page' + - $ref: '#/components/parameters/Pagination.pageSize' + - $ref: '#/components/parameters/LimitOffset.offset' + - $ref: '#/components/parameters/LimitOffset.limit' + - $ref: '#/components/parameters/InvoiceOrderByOrdering.order' + - $ref: '#/components/parameters/InvoiceOrderByOrdering.orderBy' responses: - '201': - description: The request has succeeded and a new resource has been created as a result. + '200': + description: The request has succeeded. content: application/json: schema: - type: array - items: - $ref: '#/components/schemas/BillingInvoice' + $ref: '#/components/schemas/InvoicePaginatedResponse' '400': description: The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing). content: @@ -692,17 +694,21 @@ paths: $ref: '#/components/schemas/UnexpectedProblemResponse' tags: - Billing (Experimental) - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/BillingInvoiceCreate' x-internal: true - get: - operationId: billingListInvoicesByCustomer - summary: List invoices - description: List invoices for a specific customer + /api/v1/billing/invoices/{customerId}/invoice: + post: + operationId: invoicePendingLinesAction + summary: Invoice a customer based on the pending line items + description: |- + Create a new invoice from the pending line items. + + This should be only called if for some reason we need to invoice a customer outside of the normal billing cycle. + + When creating an invoice, the pending line items will be marked as invoiced and the invoice will be created with the total amount of the pending items. + + New pending line items will be created for the period between now() and the next billing cycle's begining date for any metered item. + + The call can return multiple invoices if the pending line items are in different currencies. parameters: - name: customerId in: path @@ -711,24 +717,15 @@ paths: type: string example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ - - $ref: '#/components/parameters/BillingInvoiceListParams.statuses' - - $ref: '#/components/parameters/BillingInvoiceListParams.extendedStatuses' - - $ref: '#/components/parameters/BillingInvoiceListParams.issuedAfter' - - $ref: '#/components/parameters/BillingInvoiceListParams.issuedBefore' - - $ref: '#/components/parameters/BillingInvoiceListParams.expand' - - $ref: '#/components/parameters/Pagination.page' - - $ref: '#/components/parameters/Pagination.pageSize' - - $ref: '#/components/parameters/LimitOffset.offset' - - $ref: '#/components/parameters/LimitOffset.limit' - - $ref: '#/components/parameters/InvoiceOrderByOrdering.order' - - $ref: '#/components/parameters/InvoiceOrderByOrdering.orderBy' responses: - '200': - description: The request has succeeded. + '201': + description: The request has succeeded and a new resource has been created as a result. content: application/json: schema: - $ref: '#/components/schemas/InvoicePaginatedResponse' + type: array + items: + $ref: '#/components/schemas/Invoice' '400': description: The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing). content: @@ -767,10 +764,16 @@ paths: $ref: '#/components/schemas/UnexpectedProblemResponse' tags: - Billing (Experimental) + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/InvoicePendingLinesActionInput' x-internal: true /api/v1/billing/invoices/{customerId}/invoices/{invoiceId}: get: - operationId: billingGetInvoiceByCustomerInvoiceId + operationId: getInvoice summary: Get an invoice description: Get an invoice by ID. parameters: @@ -794,17 +797,24 @@ paths: schema: type: array items: - $ref: '#/components/schemas/BillingInvoiceExpand' + $ref: '#/components/schemas/InvoiceExpand' default: - lines explode: false + - name: includeDeletedLines + in: query + required: true + schema: + type: boolean + default: false + explode: false responses: '200': description: The request has succeeded. content: application/json: schema: - $ref: '#/components/schemas/BillingInvoice' + $ref: '#/components/schemas/Invoice' '400': description: The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing). content: @@ -851,7 +861,7 @@ paths: - Billing (Experimental) x-internal: true delete: - operationId: billingDeleteInvoiceByCustomerInvoiceId + operationId: deleteInvoice summary: Delete an invoice description: |- Delete an invoice @@ -922,7 +932,7 @@ paths: x-internal: true /api/v1/billing/invoices/{customerId}/invoices/{invoiceId}/advance: post: - operationId: billingInvoiceAdvance + operationId: advanceInvoiceAction summary: Advance the invoice's state to the next status description: |- Advance the invoice's state to the next status. @@ -951,7 +961,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/BillingInvoice' + $ref: '#/components/schemas/Invoice' '400': description: The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing). content: @@ -999,7 +1009,7 @@ paths: x-internal: true /api/v1/billing/invoices/{customerId}/invoices/{invoiceId}/approve: post: - operationId: billingApproveInvoice + operationId: approveInvoiceAction summary: Send the invoice to the customer description: |- Approve an invoice and start executing the payment workflow. @@ -1030,7 +1040,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/BillingInvoice' + $ref: '#/components/schemas/Invoice' '400': description: The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing). content: @@ -1078,7 +1088,7 @@ paths: x-internal: true /api/v1/billing/invoices/{customerId}/invoices/{invoiceId}/lines/{lineId}: get: - operationId: billingGetInvoiceLine + operationId: getInvoiceLine summary: Get an invoice line description: Get an invoice line parameters: @@ -1104,12 +1114,12 @@ paths: example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ responses: - '204': - description: 'There is no content to send for this request, but the headers may be useful. ' + '200': + description: The request has succeeded. content: application/json: schema: - $ref: '#/components/schemas/BillingInvoiceLine' + $ref: '#/components/schemas/InvoiceLine' '400': description: The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing). content: @@ -1156,7 +1166,7 @@ paths: - Billing (Experimental) x-internal: true delete: - operationId: billingDeleteInvoiceLine + operationId: deleteInvoiceLine summary: Delete an invoice line description: Delete an invoice line parameters: @@ -1230,7 +1240,7 @@ paths: - Billing (Experimental) x-internal: true post: - operationId: billingUpdateInvoiceLine + operationId: updateInvoiceLine summary: Update an invoice line description: Update an invoice line parameters: @@ -1261,7 +1271,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/BillingInvoiceLine' + $ref: '#/components/schemas/InvoiceLine' '400': description: The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing). content: @@ -1311,11 +1321,11 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/BillingInvoiceLineCreate' + $ref: '#/components/schemas/InvoiceLineReplaceUpdate' x-internal: true /api/v1/billing/invoices/{customerId}/invoices/{invoiceId}/retry: post: - operationId: billingInvoiceRetry + operationId: retryInvoiceAction summary: Retry advancing the invoice after a failed attempt. description: |- Retry advancing the invoice after a failed attempt. @@ -1342,7 +1352,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/BillingInvoice' + $ref: '#/components/schemas/Invoice' '400': description: The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing). content: @@ -1390,7 +1400,7 @@ paths: x-internal: true /api/v1/billing/invoices/{customerId}/invoices/{invoiceId}/tax/recalculate: post: - operationId: billingRecalculateInvoiceTax + operationId: recalculateInvoiceTaxAction summary: Recalculate an invoice's tax amounts description: |- Recalculate an invoice's tax amounts (using the app set in the customer's billing profile) @@ -1417,7 +1427,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/BillingInvoice' + $ref: '#/components/schemas/Invoice' '400': description: The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing). content: @@ -1465,7 +1475,7 @@ paths: x-internal: true /api/v1/billing/invoices/{customerId}/invoices/{invoiceId}/void: post: - operationId: billingVoidInvoice + operationId: voidInvoiceAction summary: Void an invoice description: |- Void an invoice @@ -1494,7 +1504,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/BillingInvoice' + $ref: '#/components/schemas/Invoice' '400': description: The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing). content: @@ -1544,11 +1554,11 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/BillingVoidInvoiceInput' + $ref: '#/components/schemas/VoidInvoiceActionInput' x-internal: true /api/v1/billing/invoices/{customerId}/lines: post: - operationId: billingCreateLineByCustomer + operationId: createInvoiceLineByCustomer summary: Create line items description: |- Create a new pending line item (charge). @@ -1576,7 +1586,9 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/BillingInvoiceLines' + type: array + items: + $ref: '#/components/schemas/InvoiceLine' '400': description: The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing). content: @@ -1620,11 +1632,13 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/LinesUpdate' + type: array + items: + $ref: '#/components/schemas/InvoiceLineCreate' x-internal: true /api/v1/billing/profile: get: - operationId: billingListProfiles + operationId: listBillingProfiles summary: List billing profiles description: List all billing profiles parameters: @@ -1647,15 +1661,15 @@ paths: - $ref: '#/components/parameters/Pagination.pageSize' - $ref: '#/components/parameters/LimitOffset.offset' - $ref: '#/components/parameters/LimitOffset.limit' - - $ref: '#/components/parameters/ProfileOrderByOrdering.order' - - $ref: '#/components/parameters/ProfileOrderByOrdering.orderBy' + - $ref: '#/components/parameters/BillingProfileOrderByOrdering.order' + - $ref: '#/components/parameters/BillingProfileOrderByOrdering.orderBy' responses: '200': description: The request has succeeded. content: application/json: schema: - $ref: '#/components/schemas/ProfilePaginatedResponse' + $ref: '#/components/schemas/BillingProfilePaginatedResponse' '400': description: The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing). content: @@ -1696,7 +1710,7 @@ paths: - Billing (Experimental) x-internal: true post: - operationId: billingCreateProfile + operationId: createBillingProfile summary: Create a new billing profile description: |- Create a new billing profile @@ -1754,19 +1768,21 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/BillingProfileCreateInput' + $ref: '#/components/schemas/BillingProfileCreate' x-internal: true /api/v1/billing/profile/{id}: delete: - operationId: billingArchiveProfile - summary: Archive a billing profile - description: Archive a billing profile + operationId: deleteBillingProfile + summary: Delete a billing profile + description: Delete a billing profile parameters: - name: id in: path required: true schema: type: string + example: 01G65Z755AFWAKHE12NY0CQ9FH + pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ responses: '204': description: 'There is no content to send for this request, but the headers may be useful. ' @@ -1816,8 +1832,8 @@ paths: - Billing (Experimental) x-internal: true get: - operationId: billingGetProfile - summary: Get a billing profile by ID + operationId: getBillingProfile + summary: Get a billing profile description: Get a billing profile by ID parameters: - name: id @@ -1825,6 +1841,8 @@ paths: required: true schema: type: string + example: 01G65Z755AFWAKHE12NY0CQ9FH + pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ - name: expand in: query required: false @@ -1886,7 +1904,7 @@ paths: - Billing (Experimental) x-internal: true put: - operationId: billingUpdateProfile + operationId: updateBillingProfile summary: Update a billing profile description: Update a billing profile parameters: @@ -1895,6 +1913,8 @@ paths: required: true schema: type: string + example: 01G65Z755AFWAKHE12NY0CQ9FH + pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ responses: '200': description: The request has succeeded. @@ -1951,7 +1971,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/BillingProfile' + $ref: '#/components/schemas/BillingProfileReplaceUpdateWithWorkflow' x-internal: true /api/v1/customers: post: @@ -7212,8 +7232,8 @@ paths: summary: Create subscription parameters: [] responses: - '200': - description: The request has succeeded. + '201': + description: The request has succeeded and a new resource has been created as a result. content: application/json: schema: @@ -7272,6 +7292,7 @@ paths: /api/v1/subscriptions/{subscriptionId}: get: operationId: getSubscription + summary: Get subscription parameters: - name: subscriptionId in: path @@ -7280,15 +7301,6 @@ paths: type: string example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ - - name: expand - in: query - required: false - schema: - type: boolean - enum: - - false - - true - explode: false - name: at in: query required: false @@ -7298,16 +7310,13 @@ paths: format: date-time example: 2023-01-01T01:01:01.001Z explode: false - summary: Get subscription Get subscription responses: '200': description: The request has succeeded. content: application/json: schema: - anyOf: - - $ref: '#/components/schemas/Subscription' - - $ref: '#/components/schemas/SubscriptionExpanded' + $ref: '#/components/schemas/SubscriptionExpanded' '400': description: The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing). content: @@ -7350,9 +7359,9 @@ paths: application/problem+json: schema: $ref: '#/components/schemas/UnexpectedProblemResponse' - x-internal: true tags: - Subscriptions + x-internal: true patch: operationId: editSubscription summary: Edit subscription @@ -7429,14 +7438,7 @@ paths: content: application/json: schema: - type: array - items: - anyOf: - - $ref: '#/components/schemas/SubscriptionEditAddUpdateItem' - - $ref: '#/components/schemas/SubscriptionEditRemoveUpdateItem' - - $ref: '#/components/schemas/SubscriptionEditAdd' - - $ref: '#/components/schemas/SubscriptionEditStretch' - - $ref: '#/components/schemas/SubscriptionEditRemoveWithValue' + $ref: '#/components/schemas/SubscriptionEdit' x-internal: true /api/v1/subscriptions/{subscriptionId}/cancel: post: @@ -7759,57 +7761,24 @@ security: - CloudCookieAuth: [] components: parameters: - BillingInvoiceListParams.expand: - name: expand - in: query - required: false - schema: - type: array - items: - $ref: '#/components/schemas/BillingInvoiceExpand' - title: What parts of the list output to expand in listings - explode: false - BillingInvoiceListParams.extendedStatuses: - name: extendedStatuses - in: query - required: false - schema: - type: array - items: - $ref: '#/components/schemas/BillingInvoiceExtendedStatus' - title: Filter by invoice extended statuses - explode: false - BillingInvoiceListParams.issuedAfter: - name: issuedAfter - in: query - required: false - schema: - type: string - format: date-time - example: 2023-01-01T01:01:01.001Z - title: Filter by invoice creation time - explode: false - BillingInvoiceListParams.issuedBefore: - name: issuedBefore + BillingProfileCustomerOverrideOrderByOrdering.order: + name: order in: query required: false + description: The order direction. schema: - type: string - format: date-time - example: 2023-01-01T01:01:01.001Z - title: Filter by invoice creation time + $ref: '#/components/schemas/SortOrder' + default: ASC explode: false - BillingInvoiceListParams.statuses: - name: statuses + BillingProfileCustomerOverrideOrderByOrdering.orderBy: + name: orderBy in: query required: false + description: The order by field. schema: - type: array - items: - $ref: '#/components/schemas/BillingInvoiceStatus' - title: Filter by the invoice status + $ref: '#/components/schemas/BillingProfileCustomerOverrideOrderBy' explode: false - CustomerOrderByOrdering.order: + BillingProfileOrderByOrdering.order: name: order in: query required: false @@ -7818,15 +7787,15 @@ components: $ref: '#/components/schemas/SortOrder' default: ASC explode: false - CustomerOrderByOrdering.orderBy: + BillingProfileOrderByOrdering.orderBy: name: orderBy in: query required: false description: The order by field. schema: - $ref: '#/components/schemas/CustomerOrderBy' + $ref: '#/components/schemas/BillingProfileOrderBy' explode: false - CustomerOverrideOrderByOrdering.order: + CustomerOrderByOrdering.order: name: order in: query required: false @@ -7835,13 +7804,13 @@ components: $ref: '#/components/schemas/SortOrder' default: ASC explode: false - CustomerOverrideOrderByOrdering.orderBy: + CustomerOrderByOrdering.orderBy: name: orderBy in: query required: false description: The order by field. schema: - $ref: '#/components/schemas/BillingCustomerOverrideOrderBy' + $ref: '#/components/schemas/CustomerOrderBy' explode: false EntitlementOrderByOrdering.order: name: order @@ -7894,6 +7863,56 @@ components: schema: $ref: '#/components/schemas/GrantOrderBy' explode: false + InvoiceListParams.expand: + name: expand + in: query + required: false + description: What parts of the list output to expand in listings + schema: + type: array + items: + $ref: '#/components/schemas/InvoiceExpand' + explode: false + InvoiceListParams.extendedStatuses: + name: extendedStatuses + in: query + required: false + description: Filter by invoice extended statuses + schema: + type: array + items: + type: string + explode: false + InvoiceListParams.issuedAfter: + name: issuedAfter + in: query + required: false + description: Filter by invoice creation time + schema: + type: string + format: date-time + example: 2023-01-01T01:01:01.001Z + explode: false + InvoiceListParams.issuedBefore: + name: issuedBefore + in: query + required: false + description: Filter by invoice creation time + schema: + type: string + format: date-time + example: 2023-01-01T01:01:01.001Z + explode: false + InvoiceListParams.statuses: + name: statuses + in: query + required: false + description: Filter by the invoice status. + schema: + type: array + items: + $ref: '#/components/schemas/InvoiceStatus' + explode: false InvoiceOrderByOrdering.order: name: order in: query @@ -7909,7 +7928,7 @@ components: required: false description: The order by field. schema: - $ref: '#/components/schemas/BillingInvoiceOrderBy' + $ref: '#/components/schemas/InvoiceOrderBy' explode: false LimitOffset.limit: name: limit @@ -8207,23 +8226,6 @@ components: schema: $ref: '#/components/schemas/PlanOrderBy' explode: false - ProfileOrderByOrdering.order: - name: order - in: query - required: false - description: The order direction. - schema: - $ref: '#/components/schemas/SortOrder' - default: ASC - explode: false - ProfileOrderByOrdering.orderBy: - name: orderBy - in: query - required: false - description: The order by field. - schema: - $ref: '#/components/schemas/BillingProfileOrderBy' - explode: false queryCustomerList.includeDeleted: name: includeDeleted in: query @@ -8500,40 +8502,13 @@ components: description: The entitlement balance at the start of the period. readOnly: true description: The balance history window. - BillingCreditNoteOriginalInvoiceRef: - type: object - required: - - type - - url - properties: - type: - type: string - enum: - - credit_node_original_invoice - issuedAt: - type: string - format: date-time - example: 2023-01-01T01:01:01.001Z - description: '[RFC3339](https://tools.ietf.org/html/rfc3339) formatted date-time string in UTC.' - title: IssueAt reflects the time the document was issued. - number: - allOf: - - $ref: '#/components/schemas/BillingInvoiceNumber' - title: (Serial) Number of the referenced document. - readOnly: true - url: - type: string - format: uri - title: Link to the source document. - allOf: - - $ref: '#/components/schemas/BillingGenericDocumentRef' - description: CreditNoteOriginalInvoiceRef is used to reference the original invoice that a credit note is based on. - BillingCustomerOverride: + BillingLineCharge: type: object required: - createdAt - updatedAt - - workflow + - id + - amount properties: createdAt: type: string @@ -8556,139 +8531,77 @@ components: description: Timestamp of when the resource was permanently deleted. title: Deletion Time readOnly: true - workflow: - $ref: '#/components/schemas/BillingCustomerWorkflowOverride' - billingProfile: + id: type: string example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ - description: |- - The billing profile this override is associated with. - - If not provided, the default billing profile is chosen if available. - description: Customer specific workflow overrides. - BillingCustomerOverrideOrderBy: - type: string - enum: - - id - description: Order by options for customers. - BillingCustomerWorkflowOverride: + description: ID of the charge or discount. + readOnly: true + percent: + allOf: + - $ref: '#/components/schemas/Percentage' + description: Percentage if fixed amount not applied + amount: + allOf: + - $ref: '#/components/schemas/Numeric' + description: Fixed discount amount to apply (calculated if percent present). + code: + type: string + description: Reason code. + description: + type: string + description: Text description as to why the discount was applied. + description: InvoiceLineCharge represents an amount added to the line, and will be applied before taxes. + BillingParty: type: object - required: - - createdAt - - updatedAt - - id - - taxApp - - invoicingApp - - paymentApp properties: - createdAt: - type: string - format: date-time - example: 2024-01-01T01:01:01.001Z - description: Timestamp of when the resource was created. - title: Creation Time - readOnly: true - updatedAt: - type: string - format: date-time - example: 2024-01-01T01:01:01.001Z - description: Timestamp of when the resource was last updated. - title: Last Update Time - readOnly: true - deletedAt: - type: string - format: date-time - example: 2024-01-01T01:01:01.001Z - description: Timestamp of when the resource was permanently deleted. - title: Deletion Time - readOnly: true - collection: - allOf: - - $ref: '#/components/schemas/BillingWorkflowCollectionSettings' - title: The collection settings for this workflow - invoicing: - allOf: - - $ref: '#/components/schemas/BillingWorkflowInvoicingSettings' - title: The invoicing settings for this workflow - payment: - allOf: - - $ref: '#/components/schemas/BillingWorkflowPaymentSettings' - title: The payment settings for this workflow id: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH - pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ - description: A unique identifier for the resource. - title: ID - readOnly: true - taxApp: - allOf: - - $ref: '#/components/schemas/App' - readOnly: true - invoicingApp: - allOf: - - $ref: '#/components/schemas/App' + description: Unique identifier for the party (if available) readOnly: true - paymentApp: + name: + type: string + description: Legal name or representation of the organization. + taxId: allOf: - - $ref: '#/components/schemas/App' - readOnly: true - description: Customer specific workflow overrides. - BillingDocumentRef: - type: object - allOf: - - $ref: '#/components/schemas/BillingCreditNoteOriginalInvoiceRef' - description: DocumentRef is used to describe a reference to an existing document (invoice). - BillingDocumentRefType: - type: string - enum: - - credit_node_original_invoice - description: DocumentRefType defines the type of document that is being referenced. - BillingDueDate: + - $ref: '#/components/schemas/BillingPartyTaxIdentity' + description: |- + The entity's legal ID code used for tax purposes. They may have + other numbers, but we're only interested in those valid for tax purposes. + addresses: + type: array + items: + $ref: '#/components/schemas/Address' + maxItems: 1 + description: Regular post addresses for where information should be sent if needed. + description: Party represents a person or business entity. + BillingPartyTaxIdentity: type: object - required: - - dueAt - - amount properties: - dueAt: - type: string - format: date-time - example: 2023-01-01T01:01:01.001Z - description: '[RFC3339](https://tools.ietf.org/html/rfc3339) formatted date-time string in UTC.' - title: When the payment is due. - notes: - type: string - title: Other details to take into account for the due date. - amount: - allOf: - - $ref: '#/components/schemas/Numeric' - title: How much needs to be paid by the date. - percent: - allOf: - - $ref: '#/components/schemas/Percentage' - title: Percentage of the total that should be paid by the date. - currency: + code: allOf: - - $ref: '#/components/schemas/CurrencyCode' - title: If different from the parent document's base currency. - description: DueDate contains an amount that should be paid by the given date. - BillingFlatFeeLine: + - $ref: '#/components/schemas/BillingTaxIdentificationCode' + description: Normalized tax code shown on the original identity document. + description: Identity stores the details required to identify an entity for tax purposes in a specific country. + BillingProfile: type: object required: + - id - name - createdAt - updatedAt - - id - - status - - currency - - totals - - period - - invoiceAt - - type - - perUnitAmount - - quantity + - supplier + - workflow + - apps + - default properties: + id: + type: string + example: 01G65Z755AFWAKHE12NY0CQ9FH + pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + description: A unique identifier for the resource. + title: ID + readOnly: true name: type: string minLength: 1 @@ -8728,97 +8641,120 @@ components: description: Timestamp of when the resource was permanently deleted. title: Deletion Time readOnly: true - id: - type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH - pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ - description: ULID (Universally Unique Lexicographically Sortable Identifier). - status: + supplier: allOf: - - $ref: '#/components/schemas/BillingLineStatus' - readOnly: true - discounts: - type: array - items: - $ref: '#/components/schemas/BillingLineDiscount' - title: Discounts applied to this line. - readOnly: true - charges: - type: array - items: - $ref: '#/components/schemas/BillingLineCharge' - title: Charges applied to this line. - readOnly: true - invoice: + - $ref: '#/components/schemas/BillingParty' + description: The name and contact information for the supplier this billing profile represents + workflow: allOf: - - $ref: '#/components/schemas/BillingInvoiceReference' - title: The invoice this item belongs to. - currency: + - $ref: '#/components/schemas/BillingWorkflow' + description: The billing workflow settings for this profile + readOnly: true + apps: allOf: - - $ref: '#/components/schemas/CurrencyCode' - title: The currency of this line - taxes: - type: array - items: - $ref: '#/components/schemas/BillingTaxItem' - title: Map of taxes to be applied and used in the invoice totals. + - $ref: '#/components/schemas/BillingProfileAppsOrReference' + description: |- + The applications used by this billing profile. + + Expand settings govern if this includes the whole app object or just the ID references. readOnly: true - taxConfig: - type: object + default: + type: boolean + description: Is this the default profile? + description: BillingProfile represents a billing profile + BillingProfileAppReferences: + type: object + required: + - tax + - invoicing + - payment + properties: + tax: allOf: - - $ref: '#/components/schemas/TaxConfig' - nullable: true - title: Tax config specify the tax configuration for this line. - children: - nullable: true - title: The lines detailing the item or service sold. + - $ref: '#/components/schemas/AppReference' + description: The tax app used for this workflow readOnly: true - type: array - items: - $ref: '#/components/schemas/BillingInvoiceLine' - totals: + invoicing: allOf: - - $ref: '#/components/schemas/BillingInvoiceTotals' - title: Totals for this line. + - $ref: '#/components/schemas/AppReference' + description: The invoicing app used for this workflow readOnly: true - period: + payment: allOf: - - $ref: '#/components/schemas/BillingPeriod' - title: Period of the line item applies to for revenue recognition pruposes. - invoiceAt: - type: string - format: date-time - example: 2023-01-01T01:01:01.001Z - description: '[RFC3339](https://tools.ietf.org/html/rfc3339) formatted date-time string in UTC.' - title: The time this line item should be invoiced. - type: - type: string - enum: - - flat_fee - perUnitAmount: + - $ref: '#/components/schemas/AppReference' + description: The payment app used for this workflow + readOnly: true + description: BillingProfileAppReferences represents the references (id, type) to the apps used by a billing profile + BillingProfileApps: + type: object + required: + - tax + - invoicing + - payment + properties: + tax: allOf: - - $ref: '#/components/schemas/Numeric' - title: Price of the item being sold. - paymentTerm: + - $ref: '#/components/schemas/App' + readOnly: true + invoicing: allOf: - - $ref: '#/components/schemas/PricePaymentTerm' - title: Payment term of the line. - default: in_advance - quantity: + - $ref: '#/components/schemas/App' + readOnly: true + payment: allOf: - - $ref: '#/components/schemas/Numeric' - title: Quantity of the item being sold. - description: BillingFlatFeeLine represents a line item that is sold to the customer as a manually added fee. - BillingFlatFeeLineCreate: + - $ref: '#/components/schemas/App' + readOnly: true + description: BillingProfileApps represents the applications used by a billing profile + BillingProfileAppsCreate: + type: object + required: + - tax + - invoicing + - payment + properties: + tax: + anyOf: + - type: string + example: 01G65Z755AFWAKHE12NY0CQ9FH + pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + description: ULID (Universally Unique Lexicographically Sortable Identifier). + - type: string + description: The tax app used for this workflow + x-go-type: string + invoicing: + anyOf: + - type: string + example: 01G65Z755AFWAKHE12NY0CQ9FH + pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + description: ULID (Universally Unique Lexicographically Sortable Identifier). + - type: string + description: The invoicing app used for this workflow + x-go-type: string + payment: + anyOf: + - type: string + example: 01G65Z755AFWAKHE12NY0CQ9FH + pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + description: ULID (Universally Unique Lexicographically Sortable Identifier). + - type: string + description: The payment app used for this workflow + x-go-type: string + description: BillingProfileAppsCreate represents the input for creating a billing profile's apps + BillingProfileAppsOrReference: + anyOf: + - $ref: '#/components/schemas/BillingProfileApps' + - $ref: '#/components/schemas/BillingProfileAppReferences' + description: |- + ProfileAppsOrReference represents the union of ProfileApps and ProfileAppReferences + for a billing profile. + BillingProfileCreate: type: object required: - name - - currency - - period - - invoiceAt - - type - - perUnitAmount - - quantity + - supplier + - default + - workflow + - apps properties: name: type: string @@ -8838,174 +8774,115 @@ components: nullable: true description: Additional metadata for the resource. title: Metadata - invoice: - allOf: - - $ref: '#/components/schemas/BillingInvoiceReference' - title: The invoice this item belongs to. - currency: + supplier: allOf: - - $ref: '#/components/schemas/CurrencyCode' - title: The currency of this line - taxConfig: - type: object + - $ref: '#/components/schemas/BillingParty' + description: The name and contact information for the supplier this billing profile represents + default: + type: boolean + description: Is this the default profile? + workflow: allOf: - - $ref: '#/components/schemas/TaxConfig' - nullable: true - title: Tax config specify the tax configuration for this line. - period: + - $ref: '#/components/schemas/BillingWorkflowCreate' + description: The billing workflow settings for this profile. + apps: allOf: - - $ref: '#/components/schemas/BillingPeriod' - title: Period of the line item applies to for revenue recognition pruposes. - invoiceAt: + - $ref: '#/components/schemas/BillingProfileAppsCreate' + description: The apps used by this billing profile. + description: BillingProfileCreate represents the input for creating a billing profile + BillingProfileCustomerOverride: + type: object + required: + - createdAt + - updatedAt + properties: + createdAt: type: string format: date-time - example: 2023-01-01T01:01:01.001Z - description: '[RFC3339](https://tools.ietf.org/html/rfc3339) formatted date-time string in UTC.' - title: The time this line item should be invoiced. - type: - type: string - enum: - - flat_fee - perUnitAmount: - allOf: - - $ref: '#/components/schemas/Numeric' - title: Price of the item being sold. - paymentTerm: - allOf: - - $ref: '#/components/schemas/PricePaymentTerm' - title: Payment term of the line. - default: in_advance - quantity: - allOf: - - $ref: '#/components/schemas/Numeric' - title: Quantity of the item being sold. - description: BillingFlatFeeLine represents a line item that is sold to the customer as a manually added fee. - BillingFlatFeeLineCreateItem: - type: object - required: - - name - - currency - - period - - invoiceAt - - type - - perUnitAmount - - quantity - properties: - name: - type: string - minLength: 1 - maxLength: 256 - description: Human-readable name for the resource. Between 1 and 256 characters. - title: Display name - description: + example: 2024-01-01T01:01:01.001Z + description: Timestamp of when the resource was created. + title: Creation Time + readOnly: true + updatedAt: type: string - maxLength: 1024 - description: Optional description of the resource. Maximum 1024 characters. - title: Description - metadata: - type: object - allOf: - - $ref: '#/components/schemas/Metadata' - nullable: true - description: Additional metadata for the resource. - title: Metadata - invoice: - allOf: - - $ref: '#/components/schemas/BillingInvoiceReference' - title: The invoice this item belongs to. - currency: - allOf: - - $ref: '#/components/schemas/CurrencyCode' - title: The currency of this line - taxConfig: - type: object - allOf: - - $ref: '#/components/schemas/TaxConfig' - nullable: true - title: Tax config specify the tax configuration for this line. - period: - allOf: - - $ref: '#/components/schemas/BillingPeriod' - title: Period of the line item applies to for revenue recognition pruposes. - invoiceAt: + format: date-time + example: 2024-01-01T01:01:01.001Z + description: Timestamp of when the resource was last updated. + title: Last Update Time + readOnly: true + deletedAt: type: string format: date-time - example: 2023-01-01T01:01:01.001Z - description: '[RFC3339](https://tools.ietf.org/html/rfc3339) formatted date-time string in UTC.' - title: The time this line item should be invoiced. - type: + example: 2024-01-01T01:01:01.001Z + description: Timestamp of when the resource was permanently deleted. + title: Deletion Time + readOnly: true + workflow: + $ref: '#/components/schemas/BillingProfileCustomerWorkflowOverride' + billingProfile: type: string - enum: - - flat_fee - perUnitAmount: - allOf: - - $ref: '#/components/schemas/Numeric' - title: Price of the item being sold. - paymentTerm: - allOf: - - $ref: '#/components/schemas/PricePaymentTerm' - title: Payment term of the line. - default: in_advance - quantity: - allOf: - - $ref: '#/components/schemas/Numeric' - title: Quantity of the item being sold. - description: BillingFlatFeeLine represents a line item that is sold to the customer as a manually added fee. - BillingGenericDocumentRef: + example: 01G65Z755AFWAKHE12NY0CQ9FH + pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + description: |- + The billing profile this override is associated with. + + If not provided, the default billing profile is chosen if available. + description: Customer specific workflow overrides. + BillingProfileCustomerOverrideCreate: type: object - required: - - type properties: - type: - allOf: - - $ref: '#/components/schemas/BillingDocumentRefType' - title: Type of the document referenced. - readOnly: true - reason: - type: string - title: Human readable description on why this reference is here or needs to be used. - description: + workflow: + $ref: '#/components/schemas/BillingProfileCustomerWorkflowOverrideCreate' + billingProfile: type: string - title: Additional details about the document. - description: |- - Omitted fields: - period: Tax period in which the referred document had an effect required by some tax regimes and formats. - stamps: Seals of approval from other organisations that may need to be listed. - ext: Extensions for additional codes that may be required. - title: DocumentRef is used to describe an existing document or a specific part of it's contents. - BillingInvoice: + example: 01G65Z755AFWAKHE12NY0CQ9FH + pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + description: |- + The billing profile this override is associated with. + + If not provided, the default billing profile is chosen if available. + description: Payload for creating a new or updating an existing customer override. + BillingProfileCustomerOverrideOrderBy: + type: string + enum: + - id + description: Order by options for customers. + BillingProfileCustomerOverridePaginatedResponse: + type: object + required: + - totalCount + - page + - pageSize + - items + properties: + totalCount: + type: integer + example: 500 + description: The items in the current page. + page: + type: integer + example: 1 + description: The items in the current page. + pageSize: + type: integer + example: 100 + description: The items in the current page. + items: + type: array + items: + $ref: '#/components/schemas/BillingProfileCustomerOverride' + description: The items in the current page. + description: Paginated response + BillingProfileCustomerWorkflowOverride: type: object required: - - id - createdAt - updatedAt - - type - - supplier - - customer - - currency - - totals - - status - - statusDetails + - id + - taxApp + - invoicingApp + - paymentApp properties: - id: - type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH - pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ - description: A unique identifier for the resource. - title: ID - readOnly: true - description: - type: string - maxLength: 1024 - description: Optional description of the resource. Maximum 1024 characters. - title: Description - metadata: - type: object - allOf: - - $ref: '#/components/schemas/Metadata' - nullable: true - description: Additional metadata for the resource. - title: Metadata createdAt: type: string format: date-time @@ -9013,681 +8890,546 @@ components: description: Timestamp of when the resource was created. title: Creation Time readOnly: true - deletedAt: + updatedAt: type: string format: date-time example: 2024-01-01T01:01:01.001Z - description: Timestamp of when the resource was permanently deleted. - title: Deletion Time + description: Timestamp of when the resource was last updated. + title: Last Update Time readOnly: true - updatedAt: + deletedAt: type: string format: date-time example: 2024-01-01T01:01:01.001Z - description: |- - Timestamp of when the resource was last updated. - - For updates the updatedAt field is used to detect conflicts. - title: Last Update Time - type: - allOf: - - $ref: '#/components/schemas/BillingInvoiceType' + description: Timestamp of when the resource was permanently deleted. + title: Deletion Time readOnly: true - supplier: + collection: allOf: - - $ref: '#/components/schemas/BillingParty' - title: The taxable entity supplying the goods or services. - customer: + - $ref: '#/components/schemas/BillingWorkflowCollectionSettings' + description: The collection settings for this workflow + invoicing: allOf: - - $ref: '#/components/schemas/BillingParty' - title: Legal entity receiving the goods or services. - number: + - $ref: '#/components/schemas/BillingWorkflowInvoicingSettings' + description: The invoicing settings for this workflow + payment: allOf: - - $ref: '#/components/schemas/BillingInvoiceNumber' - description: |- - Number specifies the human readable key used to reference this Invoice. - - The number only gets populated after the invoice had been issued. - - Please note that the number is (depending on the upstream settings) either unique for the - whole organization or unique for the customer, or in multi (stripe) account setups unique for the - account. - title: (Serial) Number of the invoice + - $ref: '#/components/schemas/BillingWorkflowPaymentSettings' + description: The payment settings for this workflow + id: + type: string + example: 01G65Z755AFWAKHE12NY0CQ9FH + pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + description: A unique identifier for the resource. readOnly: true - currency: + taxApp: allOf: - - $ref: '#/components/schemas/CurrencyCode' - title: Currency for all invoice totals. - readOnly: true - preceding: - type: array - items: - $ref: '#/components/schemas/BillingDocumentRef' - title: Key information regarding previous invoices and potentially details as to why they were corrected. + - $ref: '#/components/schemas/App' readOnly: true - totals: + invoicingApp: allOf: - - $ref: '#/components/schemas/BillingInvoiceTotals' - title: Summary of all the invoice totals, including taxes (calculated). + - $ref: '#/components/schemas/App' readOnly: true - status: + paymentApp: allOf: - - $ref: '#/components/schemas/BillingInvoiceStatus' - title: The status of the invoice. + - $ref: '#/components/schemas/App' readOnly: true - statusDetails: + description: Customer specific workflow overrides. + BillingProfileCustomerWorkflowOverrideCreate: + type: object + properties: + collection: allOf: - - $ref: '#/components/schemas/BillingInvoiceStatusDetails' - title: The details of the current invoice status - readOnly: true - issuedAt: - type: string - format: date-time - example: 2023-01-01T01:01:01.001Z - description: |- - The time the invoice was issued. - - Depending on the status of the invoice this can mean multiple things: - - draft, gathering: The time the invoice will be issued based on the workflow settings. - - issued: The time the invoice was issued. - title: The time the invoice was issued. - readOnly: true - draftUntil: - type: string - format: date-time - example: 2023-01-01T01:01:01.001Z - description: |- - The time until the invoice is in draft status. - - On draft invoice creation it is calculated from the workflow settings. - - If manual approval is required, the draftUntil time is set. - title: The time until the invoice is in draft status. - dueAt: - type: string - format: date-time - example: 2023-01-01T01:01:01.001Z - description: '[RFC3339](https://tools.ietf.org/html/rfc3339) formatted date-time string in UTC.' - title: Due time of the fulfillment of the invoice. - readOnly: true - period: - allOf: - - $ref: '#/components/schemas/BillingPeriod' - title: The period the invoice covers. If the invoice has no line items, it's not set. - voidedAt: - type: string - format: date-time - example: 2023-01-01T01:01:01.001Z - description: |- - The time the invoice was voided. - - If the invoice was voided, this field will be set to the time the invoice was voided. - title: The time the invoice was voided. - readOnly: true - workflow: + - $ref: '#/components/schemas/BillingWorkflowCollectionSettings' + description: The collection settings for this workflow + invoicing: allOf: - - $ref: '#/components/schemas/BillingInvoiceWorkflowSettings' - description: |- - The workflow associated with the invoice. - - It is always a snapshot of the workflow settings at the time of invoice creation. The - field is optional as it should be explicitly requested with expand options. - title: The workflow settings associated with this invoice - lines: - type: array - items: - $ref: '#/components/schemas/BillingInvoiceLine' - title: List of invoice lines representing each of the items sold to the customer. - readOnly: true - discounts: - type: array - items: - $ref: '#/components/schemas/BillingInvoiceDiscount' - title: Discounts or allowances applied to the complete invoice. - readOnly: true + - $ref: '#/components/schemas/BillingWorkflowInvoicingSettings' + description: The invoicing settings for this workflow payment: allOf: - - $ref: '#/components/schemas/BillingInvoicePayment' - title: Information on when, how, and to whom the invoice should be paid. - readOnly: true - validationIssues: - type: array - items: - $ref: '#/components/schemas/BillingValidationIssue' - title: Validation issues reported by the invoice workflow. - readOnly: true - description: Invoice represents an invoice in the system. - BillingInvoiceAction: + - $ref: '#/components/schemas/BillingWorkflowPaymentSettings' + description: The payment settings for this workflow + description: Resource create operation model. + BillingProfileExpand: type: string enum: - - advance - - approve - - delete - - retry - - void - description: BillingInvoiceAction represents the actions that can be performed on an invoice. - BillingInvoiceCreate: + - apps + - '*' + description: BillingProfileExpand details what profile fields to expand + x-enum-varnames: + - apps + - all + BillingProfileOrderBy: + type: string + enum: + - createdAt + - updatedAt + - default + - name + description: BillingProfileOrderBy specifies the ordering options for profiles + BillingProfilePaginatedResponse: type: object + required: + - totalCount + - page + - pageSize + - items properties: - includePendingLines: + totalCount: + type: integer + example: 500 + description: The items in the current page. + page: + type: integer + example: 1 + description: The items in the current page. + pageSize: + type: integer + example: 100 + description: The items in the current page. + items: type: array items: - type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH - pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ - description: ULID (Universally Unique Lexicographically Sortable Identifier). - description: |- - The pending line items to include in the invoice, if not provided: - - all line items that have invoice_at < asOf will be included - - all usage based line items will be included up to asOf, new usage-based line items will be staged for the rest - of the billing cycle - asOf: - type: string - format: date-time - example: 2023-01-01T01:01:01.001Z - description: |- - The time as of which the invoice is created. - - If not provided, the current time is used. - description: |- - BillingInvoiceCreate is the input for creating an invoice. - - Invoice creation is always based on already pending line items created by the billingCreateLineByCustomer - operation. Empty invoices are not allowed. - BillingInvoiceDiscount: + $ref: '#/components/schemas/BillingProfile' + description: The items in the current page. + description: Paginated response + BillingProfileReplaceUpdateWithWorkflow: type: object required: - - amount + - name + - supplier + - default + - workflow properties: - base: + name: + type: string + minLength: 1 + maxLength: 256 + description: Human-readable name for the resource. Between 1 and 256 characters. + title: Display name + description: + type: string + maxLength: 1024 + description: Optional description of the resource. Maximum 1024 characters. + title: Description + metadata: + type: object allOf: - - $ref: '#/components/schemas/Numeric' - title: Base represents the value used as a base for percent calculations instead of the invoice's sum of lines. - percent: + - $ref: '#/components/schemas/Metadata' + nullable: true + description: Additional metadata for the resource. + title: Metadata + supplier: allOf: - - $ref: '#/components/schemas/Percentage' - title: Percentage to apply to the base or invoice's sum. - amount: + - $ref: '#/components/schemas/BillingParty' + description: The name and contact information for the supplier this billing profile represents + default: + type: boolean + description: Is this the default profile? + workflow: allOf: - - $ref: '#/components/schemas/Numeric' - title: Amount to apply (calculated if percent present). - reason: - type: string - title: Text description as to why the discount was applied - description: Discount represents an allowance applied to the complete document independent from the individual lines. - BillingInvoiceExpand: - type: string - enum: - - '*' - - lines - - preceding - - workflow - - workflow.apps - description: InvoiceExpand specifies the parts of the invoice to expand in the list output. - x-enum-varnames: - - all - - lines - - preceding - - workflow - - workflowApps - BillingInvoiceExtendedStatus: - type: string - enum: - - gathering - - draft - - issuing - - issued - - draft_created - - draft_manual_approval_needed - - draft_validating - - draft_invalid - - draft_syncing - - draft_sync_failed - - draft_waiting_auto_approval - - draft_ready_to_issue - - issuing_syncing - - issuing_sync_failed + - $ref: '#/components/schemas/BillingWorkflow' + description: The billing workflow settings for this profile. description: |- - InvoiceExtendedStatus describes the extended status of an invoice. + BillingProfileReplaceUpdate represents the input for updating a billing profile - This is used to provide more detailed information about the status of the invoice. Useful for - troubelshooting invoice workflow issues. - BillingInvoiceLine: - anyOf: - - $ref: '#/components/schemas/BillingUsageBasedLine' - - $ref: '#/components/schemas/BillingFlatFeeLine' - discriminator: - propertyName: type - mapping: - usage_based: '#/components/schemas/BillingUsageBasedLine' - flat_fee: '#/components/schemas/BillingFlatFeeLine' - description: BillingInvoiceLine represents a line item that is sold to the customer based on a specific (unit) price. - BillingInvoiceLineCreate: - anyOf: - - $ref: '#/components/schemas/BillingUsageBasedLineCreate' - - $ref: '#/components/schemas/BillingFlatFeeLineCreate' - discriminator: - propertyName: type - mapping: - usage_based: '#/components/schemas/BillingUsageBasedLineCreate' - flat_fee: '#/components/schemas/BillingFlatFeeLineCreate' - description: BillingInvoiceLine represents a line item that is sold to the customer based on a specific (unit) price. - BillingInvoiceLineCreateItem: - anyOf: - - $ref: '#/components/schemas/BillingUsageBasedLineCreateItem' - - $ref: '#/components/schemas/BillingFlatFeeLineCreateItem' - discriminator: - propertyName: type - mapping: - usage_based: '#/components/schemas/BillingUsageBasedLineCreateItem' - flat_fee: '#/components/schemas/BillingFlatFeeLineCreateItem' - description: BillingInvoiceLine represents a line item that is sold to the customer based on a specific (unit) price. - BillingInvoiceLines: - type: object - required: - - lines - properties: - lines: - type: array - items: - $ref: '#/components/schemas/BillingInvoiceLine' - title: The line to create - description: CreateLinesRequest is the request for creating manual line items. - BillingInvoiceNumber: + The apps field cannot be updated directly, if an app change is desired a new + profile should be created. + BillingTaxIdentificationCode: type: string - example: INV-2024-01-01-01 minLength: 1 - maxLength: 256 - description: |- - InvoiceNumber is a unique identifier for the invoice, generated by the - invoicing app. - - The uniqueness depends on a lot of factors: - - app setting (unique per app or unique per customer) - - multiple app scenarios (multiple apps generating invoices with the same prefix) - BillingInvoiceOrderBy: - type: string - enum: - - customer.name - - issuedAt - - status - - createdAt - - updatedAt - description: InvoiceOrderBy specifies the ordering options for invoice listing. - BillingInvoicePayment: - type: object - properties: - terms: - $ref: '#/components/schemas/BillingPaymentTerms' - description: Payment contains details as to how the invoice should be paid. - BillingInvoiceReference: + maxLength: 32 + pattern: ^[A-Za-z0-9]+([\.\-\/ _]?[A-Za-z0-9]+)*$ + description: TaxIdentificationCode is a normalized tax code shown on the original identity document. + BillingWorkflow: type: object required: + - createdAt + - updatedAt - id properties: + createdAt: + type: string + format: date-time + example: 2024-01-01T01:01:01.001Z + description: Timestamp of when the resource was created. + title: Creation Time + readOnly: true + updatedAt: + type: string + format: date-time + example: 2024-01-01T01:01:01.001Z + description: Timestamp of when the resource was last updated. + title: Last Update Time + readOnly: true + deletedAt: + type: string + format: date-time + example: 2024-01-01T01:01:01.001Z + description: Timestamp of when the resource was permanently deleted. + title: Deletion Time + readOnly: true + collection: + allOf: + - $ref: '#/components/schemas/BillingWorkflowCollectionSettings' + description: The collection settings for this workflow + invoicing: + allOf: + - $ref: '#/components/schemas/BillingWorkflowInvoicingSettings' + description: The invoicing settings for this workflow + payment: + allOf: + - $ref: '#/components/schemas/BillingWorkflowPaymentSettings' + description: The payment settings for this workflow id: type: string example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ - description: ULID (Universally Unique Lexicographically Sortable Identifier). - title: The ID of the invoice. - number: - allOf: - - $ref: '#/components/schemas/BillingInvoiceNumber' - title: The number of the invoice. + description: A unique identifier for the resource. readOnly: true - description: Reference to an invoice. - BillingInvoiceStatus: - type: string - enum: - - gathering - - draft - - issuing - - issued - description: InvoiceStatus describes the status of an invoice. - BillingInvoiceStatusDetails: + description: BillingWorkflow represents a billing workflow + BillingWorkflowCollectionAlignment: + type: object + allOf: + - $ref: '#/components/schemas/BillingWorkflowCollectionAlignmentSubscription' + description: |- + The alignment for collecting the pending line items into an invoice. + + Defaults to subscription, which means that we are to create a new invoice every time the + a subscription period starts (for in advance items) or ends (for in arrears items). + BillingWorkflowCollectionAlignmentSubscription: type: object required: - - immutable - - failed - - extendedStatus - - availableActions + - type properties: - immutable: - type: boolean - title: Is the invoice editable? - failed: - type: boolean - title: Is the invoice in a failed state? - extendedStatus: - allOf: - - $ref: '#/components/schemas/BillingInvoiceExtendedStatus' - title: Extended status information for the invoice. - availableActions: - type: array - items: - $ref: '#/components/schemas/BillingInvoiceAction' - title: The actions that can be performed on the invoice. + type: + type: string + enum: + - subscription description: |- - InvoiceStatusDetails represents the details of the invoice status. + BillingWorkflowCollectionAlignmentSubscription specifies the alignment for collecting the pending line items + into an invoice. + BillingWorkflowCollectionSettings: + type: object + properties: + alignment: + allOf: + - $ref: '#/components/schemas/BillingWorkflowCollectionAlignment' + default: + type: subscription + interval: + type: string + format: ISO8601 + example: P1D + description: |- + This grace period can be used to delay the collection of the pending line items specified in + alignment. - API users are encouraged to rely on the immutable/failed/avaliableActions fields to determine - the next steps of the invoice instead of the extendedStatus field. - BillingInvoiceTotals: + This is useful, in case of multiple subscriptions having slightly different billing periods. + default: PT1H + description: Workflow collection specifies how to collect the pending line items for an invoice + BillingWorkflowCreate: type: object - required: - - amount - - chargesTotal - - discountsTotal - - taxesInclusiveTotal - - taxesExclusiveTotal - - taxesTotal - - total properties: - amount: + collection: allOf: - - $ref: '#/components/schemas/Numeric' - title: The total value of the line before taxes, discounts and commitments. - chargesTotal: + - $ref: '#/components/schemas/BillingWorkflowCollectionSettings' + description: The collection settings for this workflow + invoicing: allOf: - - $ref: '#/components/schemas/Numeric' - title: The amount of value of the line that are due to additional charges. - discountsTotal: + - $ref: '#/components/schemas/BillingWorkflowInvoicingSettings' + description: The invoicing settings for this workflow + payment: allOf: - - $ref: '#/components/schemas/Numeric' - title: The amount of value of the line that are due to discounts. - taxesInclusiveTotal: + - $ref: '#/components/schemas/BillingWorkflowPaymentSettings' + description: The payment settings for this workflow + description: Resource create operation model. + BillingWorkflowInvoicingSettings: + type: object + properties: + autoAdvance: + type: boolean + description: Whether to automatically issue the invoice after the draftPeriod has passed. + default: true + draftPeriod: + type: string + format: ISO8601 + example: P1D + description: The period for the invoice to be kept in draft status for manual reviews. + default: P1D + dueAfter: + type: string + format: ISO8601 + example: P1D + description: The period after which the invoice is due. + default: P7D + description: BillingWorkflowInvoicingSettings represents the invoice settings for a billing workflow + title: Workflow invoice settings + BillingWorkflowPaymentSettings: + type: object + properties: + collectionMethod: allOf: - - $ref: '#/components/schemas/Numeric' - title: The total amount of taxes that are included in the line. - taxesExclusiveTotal: + - $ref: '#/components/schemas/CollectionMethod' + description: The payment method for the invoice. + default: charge_automatically + description: BillingWorkflowPaymentSettings represents the payment settings for a billing workflow + title: Workflow payment settings + BillingWorkflowSettings: + type: object + properties: + collection: allOf: - - $ref: '#/components/schemas/Numeric' - title: The total amount of taxes that are added on top of amount from the line. - taxesTotal: + - $ref: '#/components/schemas/BillingWorkflowCollectionSettings' + description: The collection settings for this workflow + invoicing: allOf: - - $ref: '#/components/schemas/Numeric' - title: The total amount of taxes for this line. - total: + - $ref: '#/components/schemas/BillingWorkflowInvoicingSettings' + description: The invoicing settings for this workflow + payment: allOf: - - $ref: '#/components/schemas/Numeric' - title: The total amount value of the line after taxes, discounts and commitments. - description: Totals contains the summaries of all calculations for the invoice. - BillingInvoiceType: + - $ref: '#/components/schemas/BillingWorkflowPaymentSettings' + description: The payment settings for this workflow + description: BillingWorkflowSettings represents the settings for a billing workflow. + CheckoutSessionCustomTextAfterSubmitParams: + type: object + properties: + afterSubmit: + type: object + properties: + message: + type: string + shippingAddress: + type: object + properties: + message: + type: string + submit: + type: object + properties: + message: + type: string + termsOfServiceAcceptance: + type: object + properties: + message: + type: string + description: Stripe CheckoutSession.custom_text + CheckoutSessionUIMode: type: string enum: - - standard - - credit_note + - embedded + - hosted + description: Stripe CheckoutSession.ui_mode + ClientAppStartResponse: + type: object + required: + - url + properties: + url: + type: string + description: The URL to start the OAuth2 authorization code grant flow. + description: Response from the client app (OpenMeter backend) to start the OAuth2 flow. + CollectionMethod: + type: string + enum: + - charge_automatically + - send_invoice + description: CollectionMethod specifies how the invoice should be collected (automatic vs manual) + title: Collection method + ConflictProblemResponse: + type: object + allOf: + - $ref: '#/components/schemas/UnexpectedProblemResponse' + description: The request could not be completed due to a conflict with the current state of the target resource. + CountryCode: + type: string + example: US + minLength: 2 + maxLength: 2 + pattern: ^[A-Z]{2}$ description: |- - InvoiceType represents the type of invoice. - - The type of invoice determines the purpose of the invoice and how it should be handled. - BillingInvoiceWorkflowSettings: + [ISO 3166-1](https://www.iso.org/iso-3166-country-codes.html) alpha-2 country code. + Custom two-letter country codes are also supported for convenience. + CreateStripeCheckoutSessionRequest: type: object required: - - sourceBillingProfileID - - workflow - - timezone + - customer + - options properties: - apps: - allOf: - - $ref: '#/components/schemas/BillingProfileAppsOrReference' - title: The apps that will be used to orchestrate the invoice's workflow. - sourceBillingProfileID: + appId: type: string example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + description: If not provided, the default Stripe app is used if any. + customer: + anyOf: + - $ref: '#/components/schemas/CustomerId' + - $ref: '#/components/schemas/CustomerCreate' description: |- - sourceBillingProfileID is the billing profile on which the workflow was based on. - - The profile is snapshotted on invoice creation, after which it can be altered independently - of the profile itself. - title: The billing profile on which the workflow was based on. - workflow: - allOf: - - $ref: '#/components/schemas/BillingWorkflowSettings' - title: The workflow details used by this invoice. - timezone: + Provide a customer ID to use an existing OpenMeter customer. + or provide a customer object to create a new customer. + stripeCustomerId: type: string - title: Timezone of the invoice's date fields. - readOnly: true - description: |- - InvoiceWorkflowSettings represents the workflow settings used by the invoice. - - This is a clone of the billing profile's workflow settings at the time of invoice creation - with customer overrides considered. - BillingLineCharge: + description: |- + Stripe customer ID. + If not provided OpenMeter creates a new Stripe customer or + uses the OpenMeter customer's default Stripe customer ID. + options: + allOf: + - $ref: '#/components/schemas/CreateStripeCheckoutSessionRequestOptions' + description: Options passed to Stripe when creating the checkout session. + description: Create Stripe checkout session request. + CreateStripeCheckoutSessionRequestOptions: type: object - required: - - createdAt - - updatedAt - - id - - amount properties: - createdAt: + currency: + $ref: '#/components/schemas/CurrencyCode' + cancelURL: type: string - format: date-time - example: 2024-01-01T01:01:01.001Z - description: Timestamp of when the resource was created. - title: Creation Time - readOnly: true - updatedAt: + clientReferenceID: type: string - format: date-time - example: 2024-01-01T01:01:01.001Z - description: Timestamp of when the resource was last updated. - title: Last Update Time - readOnly: true - deletedAt: + customText: + $ref: '#/components/schemas/CheckoutSessionCustomTextAfterSubmitParams' + metadata: + type: object + additionalProperties: + type: string + returnURL: type: string - format: date-time - example: 2024-01-01T01:01:01.001Z - description: Timestamp of when the resource was permanently deleted. - title: Deletion Time - readOnly: true - id: + successURL: + type: string + uiMode: + $ref: '#/components/schemas/CheckoutSessionUIMode' + paymentMethodTypes: + type: array + items: + type: string + description: Create Stripe checkout session options + CreateStripeCheckoutSessionResult: + type: object + required: + - customerId + - stripeCustomerId + - sessionId + - setupIntentId + - url + - mode + properties: + customerId: type: string example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ - description: ULID (Universally Unique Lexicographically Sortable Identifier). - title: ID of the entity - readOnly: true - percent: - allOf: - - $ref: '#/components/schemas/Percentage' - description: Percentage if fixed amount not applied - title: Percent - amount: - allOf: - - $ref: '#/components/schemas/Numeric' - description: Fixed discount amount to apply (calculated if percent present). - title: Amount - code: - type: string - title: Reason code. - description: - type: string - title: Text description as to why the discount was applied. - description: LineCharge represents an amount added to the line, and will be applied before taxes. - BillingLineDiscount: - type: object - required: - - createdAt - - updatedAt - - id - - amount - properties: - createdAt: + description: The OpenMeter customer ID. + stripeCustomerId: type: string - format: date-time - example: 2024-01-01T01:01:01.001Z - description: Timestamp of when the resource was created. - title: Creation Time - readOnly: true - updatedAt: + description: The Stripe customer ID. + sessionId: type: string - format: date-time - example: 2024-01-01T01:01:01.001Z - description: Timestamp of when the resource was last updated. - title: Last Update Time - readOnly: true - deletedAt: + description: The checkout session ID. + setupIntentId: type: string - format: date-time - example: 2024-01-01T01:01:01.001Z - description: Timestamp of when the resource was permanently deleted. - title: Deletion Time - readOnly: true - id: + description: The checkout session setup intent ID. + url: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH - pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ - description: ULID (Universally Unique Lexicographically Sortable Identifier). - title: ID of the entity - readOnly: true - percent: - allOf: - - $ref: '#/components/schemas/Percentage' - description: Percentage if fixed amount not applied - title: Percent - amount: + description: URL to show the checkout session. + mode: allOf: - - $ref: '#/components/schemas/Numeric' - description: Fixed discount amount to apply (calculated if percent present). - title: Amount - code: - type: string - title: Reason code. - description: - type: string - title: Text description as to why the discount was applied. - description: LineDiscount represents an amount deducted from the line, and will be applied before taxes. - BillingLineStatus: - type: string - enum: - - valid - - deleted - - split - description: Line status specifies the status of the line. - BillingParty: - type: object - properties: - id: + - $ref: '#/components/schemas/StripeCheckoutSessionMode' + description: |- + Mode + Always `setup` for now. + cancelURL: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH - pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ - description: ULID (Universally Unique Lexicographically Sortable Identifier). - title: ID of the party. - name: + description: Cancel URL. + successURL: type: string - title: Legal name or representation of the organization. - taxId: - allOf: - - $ref: '#/components/schemas/BillingTaxIdentity' - title: The entity's legal ID code used for tax purposes. They may have other numbers, but we're only interested in those valid for tax purposes. - addresses: - type: array - items: - $ref: '#/components/schemas/Address' - maxItems: 1 - title: Regular post addresses for where information should be sent if needed. - description: Party represents a person or business entity. - BillingPartyCreate: - type: object - properties: - name: + description: Success URL. + returnURL: type: string - title: Legal name or representation of the organization. - taxId: - allOf: - - $ref: '#/components/schemas/BillingTaxIdentity' - title: The entity's legal ID code used for tax purposes. They may have other numbers, but we're only interested in those valid for tax purposes. - addresses: - type: array - items: - $ref: '#/components/schemas/Address' - maxItems: 1 - title: Regular post addresses for where information should be sent if needed. - description: Party represents a person or business entity. - BillingPaymentTermDueDate: + description: Return URL. + description: Create Stripe Checkout Session response. + CreditNoteOriginalInvoiceRef: type: object required: - type - - dueAt + - url properties: type: type: string enum: - - due_date - title: Type of terms to be applied. - detail: + - credit_node_original_invoice + issuedAt: type: string - title: Text detail of the chosen payment terms. - notes: + format: date-time + example: 2023-01-01T01:01:01.001Z + description: IssueAt reflects the time the document was issued. + readOnly: true + number: + allOf: + - $ref: '#/components/schemas/InvoiceNumber' + description: (Serial) Number of the referenced document. + readOnly: true + url: type: string - title: Description of the conditions for payment. - dueAt: - type: array - items: - $ref: '#/components/schemas/BillingDueDate' - minItems: 1 - title: When the payment is due. - description: PaymentTermDueDate defines the terms for payment on a specific date. - BillingPaymentTermInstant: + format: uri + description: Link to the source document. + readOnly: true + allOf: + - $ref: '#/components/schemas/InvoiceGenericDocumentRef' + description: CreditNoteOriginalInvoiceRef is used to reference the original invoice that a credit note is based on. + CurrencyCode: + type: string + example: USD + minLength: 3 + maxLength: 3 + pattern: ^[A-Z]{3}$ + description: |- + Three-letter [ISO4217](https://www.iso.org/iso-4217-currency-codes.html) currency code. + Custom three-letter currency codes are also supported for convenience. + CustomSubscriptionChange: type: object required: - - type + - activeFrom + - customPlan properties: - type: - type: string - enum: - - instant - title: Type of terms to be applied. - detail: - type: string - title: Text detail of the chosen payment terms. - notes: + activeFrom: type: string - title: Description of the conditions for payment. - description: PaymentTermInstant defines the terms for payment on receipt of invoice. - BillingPaymentTerms: - anyOf: - - $ref: '#/components/schemas/BillingPaymentTermInstant' - - $ref: '#/components/schemas/BillingPaymentTermDueDate' - description: PaymentTerms defines the terms for payment. - BillingPeriod: + format: date-time + example: 2023-01-01T01:01:01.001Z + description: '[RFC3339](https://tools.ietf.org/html/rfc3339) formatted date-time string in UTC.' + customPlan: + $ref: '#/components/schemas/PlanCreate' + description: Change a custom subscription. + CustomSubscriptionCreate: type: object required: - - start - - end + - activeFrom + - customPlan + - customerId properties: - start: + activeFrom: type: string format: date-time example: 2023-01-01T01:01:01.001Z description: '[RFC3339](https://tools.ietf.org/html/rfc3339) formatted date-time string in UTC.' - title: Start of the period. - end: + customPlan: + $ref: '#/components/schemas/PlanCreate' + customerId: type: string - format: date-time - example: 2023-01-01T01:01:01.001Z - description: '[RFC3339](https://tools.ietf.org/html/rfc3339) formatted date-time string in UTC.' - title: End of the period. - description: |- - Period represents a time range. - - Billing always treats periods as start being inclusive and end being exclusive. - BillingProfile: + example: 01G65Z755AFWAKHE12NY0CQ9FH + pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + description: ULID (Universally Unique Lexicographically Sortable Identifier). + description: Create a custom subscription. + Customer: type: object required: - id - name - createdAt - updatedAt - - supplier - - workflow - - apps - - default + - usageAttribution properties: id: type: string @@ -9721,6 +9463,13 @@ components: description: Timestamp of when the resource was created. title: Creation Time readOnly: true + updatedAt: + type: string + format: date-time + example: 2024-01-01T01:01:01.001Z + description: Timestamp of when the resource was last updated. + title: Last Update Time + readOnly: true deletedAt: type: string format: date-time @@ -9728,101 +9477,86 @@ components: description: Timestamp of when the resource was permanently deleted. title: Deletion Time readOnly: true - updatedAt: + timezone: type: string - format: date-time - example: 2023-01-01T01:01:01.001Z - description: |- - When the resource was last updated. - - For updates this field must be set to the last update time to detect conflicts. - title: Last update time of the resource - supplier: + description: Timezone of the customer. + title: Timezone + usageAttribution: allOf: - - $ref: '#/components/schemas/BillingParty' - title: The name and contact information for the supplier this billing profile represents - workflow: + - $ref: '#/components/schemas/CustomerUsageAttribution' + description: Mapping to attribute metered usage to the customer + title: Usage Attribution + primaryEmail: + type: string + description: The primary email address of the customer. + title: Primary Email + currency: allOf: - - $ref: '#/components/schemas/BillingWorkflow' - title: The billing workflow settings for this profile - apps: + - $ref: '#/components/schemas/CurrencyCode' + description: |- + Currency of the customer. + Used for billing, tax and invoicing. + title: Currency + billingAddress: allOf: - - $ref: '#/components/schemas/BillingProfileAppsOrReference' - title: The applications used by this billing profile - readOnly: true - default: - type: boolean - title: Is this the default profile? - description: Profile represents a billing profile - BillingProfileAppReferences: + - $ref: '#/components/schemas/Address' + description: |- + The billing address of the customer. + Used for tax and invoicing. + title: Billing Address + example: + id: 01G65Z755AFWAKHE12NY0CQ9FH + name: ACME Inc. + usageAttribution: + subjectKeys: + - my_subject_key + createdAt: 2024-01-01T01:01:01.001Z + updatedAt: 2024-01-01T01:01:01.001Z + description: A customer object. + CustomerAppData: + anyOf: + - $ref: '#/components/schemas/StripeCustomerAppData' + - $ref: '#/components/schemas/SandboxCustomerAppData' + discriminator: + propertyName: type + mapping: + stripe: '#/components/schemas/StripeCustomerAppData' + sandbox: '#/components/schemas/SandboxCustomerAppData' + description: |- + CustomerAppData + Stores the app specific data for the customer. + One of: stripe, sandbox + CustomerAppDataPaginatedResponse: type: object required: - - tax - - invoicing - - payment - properties: - tax: - allOf: - - $ref: '#/components/schemas/AppReference' - title: The tax app used for this workflow - invoicing: - allOf: - - $ref: '#/components/schemas/AppReference' - title: The invoicing app used for this workflow - payment: - allOf: - - $ref: '#/components/schemas/AppReference' - title: The payment app used for this workflow - description: ProfileAppsReference represents the references (id, type) to the apps used by a billing profile - BillingProfileApps: - type: object - required: - - tax - - invoicing - - payment - properties: - tax: - $ref: '#/components/schemas/App' - invoicing: - $ref: '#/components/schemas/App' - payment: - $ref: '#/components/schemas/App' - description: ProfileApps represents the applications used by a billing profile - BillingProfileAppsOrReference: - anyOf: - - $ref: '#/components/schemas/BillingProfileApps' - - $ref: '#/components/schemas/BillingProfileAppReferences' - description: |- - ProfileAppsOrReference represents the union of ProfileApps and ProfileAppReferences - for a billing profile. - BillingProfileCreateAppsInput: - type: object - required: - - tax - - invoicing - - payment + - totalCount + - page + - pageSize + - items properties: - tax: - allOf: - - $ref: '#/components/schemas/BillingWorkflowAppIdOrType' - title: The tax app used for this workflow - invoicing: - allOf: - - $ref: '#/components/schemas/BillingWorkflowAppIdOrType' - title: The invoicing app used for this workflow - payment: - allOf: - - $ref: '#/components/schemas/BillingWorkflowAppIdOrType' - title: The payment app used for this workflow - description: ProfileCreateAppsInput represents the input for creating a billing profile's apps - BillingProfileCreateInput: + totalCount: + type: integer + example: 500 + description: The items in the current page. + page: + type: integer + example: 1 + description: The items in the current page. + pageSize: + type: integer + example: 100 + description: The items in the current page. + items: + type: array + items: + $ref: '#/components/schemas/CustomerAppData' + description: The items in the current page. + description: Paginated response + CustomerCreate: type: object required: - name - - supplier - - workflow - - default - - apps + - usageAttribution properties: name: type: string @@ -9842,98 +9576,83 @@ components: nullable: true description: Additional metadata for the resource. title: Metadata - supplier: + timezone: + type: string + description: Timezone of the customer. + title: Timezone + usageAttribution: allOf: - - $ref: '#/components/schemas/BillingPartyCreate' - title: The name and contact information for the supplier this billing profile represents - workflow: + - $ref: '#/components/schemas/CustomerUsageAttribution' + description: Mapping to attribute metered usage to the customer + title: Usage Attribution + primaryEmail: + type: string + description: The primary email address of the customer. + title: Primary Email + currency: allOf: - - $ref: '#/components/schemas/BillingWorkflow' - title: The billing workflow settings for this profile - default: - type: boolean - title: Is this the default profile? - apps: - $ref: '#/components/schemas/BillingProfileCreateAppsInput' - description: ProfileCreateInput represents the input for creating a billing profile - BillingProfileExpand: - type: string - enum: - - apps - - '*' - description: ProfileExpand details what profile fields to expand - x-enum-varnames: - - apps - - all - BillingProfileOrderBy: + - $ref: '#/components/schemas/CurrencyCode' + description: |- + Currency of the customer. + Used for billing, tax and invoicing. + title: Currency + billingAddress: + allOf: + - $ref: '#/components/schemas/Address' + description: |- + The billing address of the customer. + Used for tax and invoicing. + title: Billing Address + description: Resource create operation model. + CustomerId: + type: object + required: + - id + properties: + id: + type: string + example: 01G65Z755AFWAKHE12NY0CQ9FH + pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + description: ULID (Universally Unique Lexicographically Sortable Identifier). + description: Create Stripe checkout session customer ID. + CustomerOrderBy: type: string enum: - - createdAt - - updatedAt - - default + - id - name - description: ProfileOrderBy specifies the ordering options for profiles - BillingTaxBehavior: - type: string - enum: - - inclusive - - exclusive - description: |- - TaxBehavior details how the tax item is applied to the base amount. - - Inclusive means the tax is included in the base amount. - Exclusive means the tax is added to the base amount. - BillingTaxIdentificationCode: - type: string - minLength: 1 - maxLength: 32 - pattern: ^[A-Za-z0-9]+([\.\-\/ _]?[A-Za-z0-9]+)*$ - BillingTaxIdentity: - type: object - properties: - code: - allOf: - - $ref: '#/components/schemas/BillingTaxIdentificationCode' - title: Normalized tax code shown on the original identity document. - description: Identity stores the details required to identify an entity for tax purposes in a specific country. - BillingTaxItem: + - createdAt + description: Order by options for customers. + CustomerPaginatedResponse: type: object + required: + - totalCount + - page + - pageSize + - items properties: - config: - allOf: - - $ref: '#/components/schemas/TaxConfig' - title: Tax provider configuration. - percent: - allOf: - - $ref: '#/components/schemas/Percentage' - title: |- - Percent defines the percentage set manually or determined from the rate - key (calculated if rate present). A nil percent implies that this tax combo - is **exempt** from tax. - surcharge: - allOf: - - $ref: '#/components/schemas/Numeric' - title: Some countries require an additional surcharge (calculated if rate present). - behavior: - allOf: - - $ref: '#/components/schemas/BillingTaxBehavior' - title: Is the tax item inclusive or exclusive of the base amount. - description: TaxConfig stores the configuration for a tax line relative to an invoice line. - BillingUsageBasedLine: + totalCount: + type: integer + example: 500 + description: The items in the current page. + page: + type: integer + example: 1 + description: The items in the current page. + pageSize: + type: integer + example: 100 + description: The items in the current page. + items: + type: array + items: + $ref: '#/components/schemas/Customer' + description: The items in the current page. + description: Paginated response + CustomerReplaceUpdate: type: object required: - name - - createdAt - - updatedAt - - id - - status - - currency - - totals - - period - - invoiceAt - - type - - price - - featureKey + - usageAttribution properties: name: type: string @@ -9953,354 +9672,388 @@ components: nullable: true description: Additional metadata for the resource. title: Metadata - createdAt: - type: string - format: date-time - example: 2024-01-01T01:01:01.001Z - description: Timestamp of when the resource was created. - title: Creation Time - readOnly: true - updatedAt: - type: string - format: date-time - example: 2024-01-01T01:01:01.001Z - description: Timestamp of when the resource was last updated. - title: Last Update Time - readOnly: true - deletedAt: - type: string - format: date-time - example: 2024-01-01T01:01:01.001Z - description: Timestamp of when the resource was permanently deleted. - title: Deletion Time - readOnly: true - id: + timezone: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH - pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ - description: ULID (Universally Unique Lexicographically Sortable Identifier). - status: - allOf: - - $ref: '#/components/schemas/BillingLineStatus' - readOnly: true - discounts: - type: array - items: - $ref: '#/components/schemas/BillingLineDiscount' - title: Discounts applied to this line. - readOnly: true - charges: - type: array - items: - $ref: '#/components/schemas/BillingLineCharge' - title: Charges applied to this line. - readOnly: true - invoice: + description: Timezone of the customer. + title: Timezone + usageAttribution: allOf: - - $ref: '#/components/schemas/BillingInvoiceReference' - title: The invoice this item belongs to. + - $ref: '#/components/schemas/CustomerUsageAttribution' + description: Mapping to attribute metered usage to the customer + title: Usage Attribution + primaryEmail: + type: string + description: The primary email address of the customer. + title: Primary Email currency: allOf: - $ref: '#/components/schemas/CurrencyCode' - title: The currency of this line - taxes: - type: array - items: - $ref: '#/components/schemas/BillingTaxItem' - title: Map of taxes to be applied and used in the invoice totals. - readOnly: true - taxConfig: - type: object + description: |- + Currency of the customer. + Used for billing, tax and invoicing. + title: Currency + billingAddress: allOf: - - $ref: '#/components/schemas/TaxConfig' - nullable: true - title: Tax config specify the tax configuration for this line. - children: - nullable: true - title: The lines detailing the item or service sold. - readOnly: true - type: array + - $ref: '#/components/schemas/Address' + description: |- + The billing address of the customer. + Used for tax and invoicing. + title: Billing Address + description: Resource update operation model. + CustomerUsageAttribution: + type: object + required: + - subjectKeys + properties: + subjectKeys: + type: array items: - $ref: '#/components/schemas/BillingInvoiceLine' - totals: - allOf: - - $ref: '#/components/schemas/BillingInvoiceTotals' - title: Totals for this line. - readOnly: true - period: - allOf: - - $ref: '#/components/schemas/BillingPeriod' - title: Period of the line item applies to for revenue recognition pruposes. - invoiceAt: - type: string - format: date-time - example: 2023-01-01T01:01:01.001Z - description: '[RFC3339](https://tools.ietf.org/html/rfc3339) formatted date-time string in UTC.' - title: The time this line item should be invoiced. + type: string + minItems: 1 + maxItems: 1 + description: The subjects that are attributed to the customer. + title: SubjectKeys + description: |- + Mapping to attribute metered usage to the customer. + One customer can have multiple subjects, + but one subject can only belong to one customer. + Discount: + type: object + allOf: + - $ref: '#/components/schemas/DiscountPercentage' + description: |- + A discount on a price. + One of: percentage, amount, or usage. + DiscountPercentage: + type: object + required: + - type + - percentage + properties: type: type: string enum: - - usage_based - price: - $ref: '#/components/schemas/RateCardUsageBasedPrice' - featureKey: + - percentage + description: The type of the discount. + title: Type + percentage: + type: number + minimum: 0 + maximum: 100 + description: The percentage of the discount. + title: Percentage + rateCards: + type: array + items: + type: string + minLength: 1 + maxLength: 64 + pattern: ^[a-z0-9]+(?:_[a-z0-9]+)*$ + description: A key is a unique string that is used to identify a resource. + description: |- + The rate cards that the discount applies to. + When not specified, the discount applies to all rate cards. + title: Discounted RateCards + description: Percentage discount. + EditSubscriptionAddItem: + type: object + required: + - op + - phaseKey + - rateCard + properties: + op: type: string - minLength: 1 - maxLength: 64 - pattern: ^[a-z0-9]+(?:_[a-z0-9]+)*$ - description: A key is a unique string that is used to identify a resource. - title: The feature that the usage is based on. - quantity: - allOf: - - $ref: '#/components/schemas/Numeric' - title: Quantity of the item being sold. - readOnly: true - description: UsageBasedLine represents a line item that is sold to the customer based on usage. - BillingUsageBasedLineCreate: + enum: + - add_item + phaseKey: + type: string + rateCard: + $ref: '#/components/schemas/RateCard' + description: Add a new item to a phase. + EditSubscriptionAddPhase: type: object required: - - name - - currency - - period - - invoiceAt - - type - - price - - featureKey + - op + - phase properties: - name: + op: type: string - minLength: 1 - maxLength: 256 - description: Human-readable name for the resource. Between 1 and 256 characters. - title: Display name - description: + enum: + - add_phase + phase: + $ref: '#/components/schemas/SubscriptionPhaseCreate' + description: Add a new phase + EditSubscriptionRemoveItem: + type: object + required: + - op + - phaseKey + - itemKey + properties: + op: type: string - maxLength: 1024 - description: Optional description of the resource. Maximum 1024 characters. - title: Description - metadata: - type: object - allOf: - - $ref: '#/components/schemas/Metadata' - nullable: true - description: Additional metadata for the resource. - title: Metadata - invoice: - allOf: - - $ref: '#/components/schemas/BillingInvoiceReference' - title: The invoice this item belongs to. - currency: - allOf: - - $ref: '#/components/schemas/CurrencyCode' - title: The currency of this line - taxConfig: - type: object - allOf: - - $ref: '#/components/schemas/TaxConfig' - nullable: true - title: Tax config specify the tax configuration for this line. - period: - allOf: - - $ref: '#/components/schemas/BillingPeriod' - title: Period of the line item applies to for revenue recognition pruposes. - invoiceAt: + enum: + - remove_item + phaseKey: type: string - format: date-time - example: 2023-01-01T01:01:01.001Z - description: '[RFC3339](https://tools.ietf.org/html/rfc3339) formatted date-time string in UTC.' - title: The time this line item should be invoiced. - type: + itemKey: + type: string + description: Remove an item from a phase. + EditSubscriptionRemovePhase: + type: object + required: + - op + - phaseKey + - shift + properties: + op: type: string enum: - - usage_based - price: - $ref: '#/components/schemas/RateCardUsageBasedPrice' - featureKey: + - remove_phase + phaseKey: type: string - minLength: 1 - maxLength: 64 - pattern: ^[a-z0-9]+(?:_[a-z0-9]+)*$ - description: A key is a unique string that is used to identify a resource. - title: The feature that the usage is based on. - description: UsageBasedLine represents a line item that is sold to the customer based on usage. - BillingUsageBasedLineCreateItem: + shift: + $ref: '#/components/schemas/RemovePhaseShifting' + description: Remove a phase + EditSubscriptionStretchPhase: type: object required: - - name - - currency - - period - - invoiceAt + - op + - phaseKey + - extendBy + properties: + op: + type: string + enum: + - stretch_phase + phaseKey: + type: string + extendBy: + type: string + format: duration + description: Stretch a phase + Entitlement: + anyOf: + - $ref: '#/components/schemas/EntitlementMetered' + - $ref: '#/components/schemas/EntitlementStatic' + - $ref: '#/components/schemas/EntitlementBoolean' + discriminator: + propertyName: type + mapping: + metered: '#/components/schemas/EntitlementMetered' + static: '#/components/schemas/EntitlementStatic' + boolean: '#/components/schemas/EntitlementBoolean' + description: |- + Entitlement templates are used to define the entitlements of a plan. + Features are omitted from the entitlement template, as they are defined in the rate card. + EntitlementBaseTemplate: + type: object + required: + - createdAt + - updatedAt + - id - type - - price + - subjectKey - featureKey + - featureId properties: - name: + createdAt: type: string - minLength: 1 - maxLength: 256 - description: Human-readable name for the resource. Between 1 and 256 characters. - title: Display name - description: + format: date-time + example: 2024-01-01T01:01:01.001Z + description: Timestamp of when the resource was created. + title: Creation Time + readOnly: true + updatedAt: type: string - maxLength: 1024 - description: Optional description of the resource. Maximum 1024 characters. - title: Description + format: date-time + example: 2024-01-01T01:01:01.001Z + description: Timestamp of when the resource was last updated. + title: Last Update Time + readOnly: true + deletedAt: + type: string + format: date-time + example: 2024-01-01T01:01:01.001Z + description: Timestamp of when the resource was permanently deleted. + title: Deletion Time + readOnly: true metadata: - type: object allOf: - $ref: '#/components/schemas/Metadata' - nullable: true - description: Additional metadata for the resource. - title: Metadata - invoice: - allOf: - - $ref: '#/components/schemas/BillingInvoiceReference' - title: The invoice this item belongs to. - currency: - allOf: - - $ref: '#/components/schemas/CurrencyCode' - title: The currency of this line - taxConfig: - type: object - allOf: - - $ref: '#/components/schemas/TaxConfig' - nullable: true - title: Tax config specify the tax configuration for this line. - period: - allOf: - - $ref: '#/components/schemas/BillingPeriod' - title: Period of the line item applies to for revenue recognition pruposes. - invoiceAt: + description: Additional metadata for the feature. + id: type: string - format: date-time - example: 2023-01-01T01:01:01.001Z - description: '[RFC3339](https://tools.ietf.org/html/rfc3339) formatted date-time string in UTC.' - title: The time this line item should be invoiced. + example: 01ARZ3NDEKTSV4RRFFQ69G5FAV + pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + description: Readonly unique ULID identifier. + readOnly: true type: + allOf: + - $ref: '#/components/schemas/EntitlementType' + description: The type of the entitlement. + title: Type + subjectKey: type: string - enum: - - usage_based - price: - $ref: '#/components/schemas/RateCardUsageBasedPrice' + minLength: 1 + maxLength: 64 + pattern: ^[a-z0-9]+(?:_[a-z0-9]+)*$ + description: The identifier key unique to the subject + example: customer-1 featureKey: type: string minLength: 1 maxLength: 64 pattern: ^[a-z0-9]+(?:_[a-z0-9]+)*$ - description: A key is a unique string that is used to identify a resource. - title: The feature that the usage is based on. - description: UsageBasedLine represents a line item that is sold to the customer based on usage. - BillingValidationIssue: - type: object + description: The feature the subject is entitled to use. + example: example-feature-key + featureId: + type: string + example: 01ARZ3NDEKTSV4RRFFQ69G5FAV + pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + description: The feature the subject is entitled to use. + currentUsagePeriod: + allOf: + - $ref: '#/components/schemas/Period' + description: The current usage period. + usagePeriod: + allOf: + - $ref: '#/components/schemas/RecurringPeriod' + description: The defined usage period of the entitlement + description: Shared fields of the entitlement templates. + EntitlementBoolean: + type: object required: - - severity - - component - - message + - type + - createdAt + - updatedAt + - id + - subjectKey + - featureKey + - featureId properties: - severity: - allOf: - - $ref: '#/components/schemas/BillingValidationIssueSeverity' - title: The severity of the issue. - field: + type: type: string - title: The field that the issue is related to, if available in JSON path format. - code: + enum: + - boolean + createdAt: type: string - title: Machine indentifiable code for the issue, if available. - component: + format: date-time + example: 2024-01-01T01:01:01.001Z + description: Timestamp of when the resource was created. + title: Creation Time + readOnly: true + updatedAt: type: string - title: Component reporting the issue. - message: + format: date-time + example: 2024-01-01T01:01:01.001Z + description: Timestamp of when the resource was last updated. + title: Last Update Time + readOnly: true + deletedAt: type: string - title: A human-readable description of the issue. + format: date-time + example: 2024-01-01T01:01:01.001Z + description: Timestamp of when the resource was permanently deleted. + title: Deletion Time + readOnly: true metadata: allOf: - $ref: '#/components/schemas/Metadata' - title: Metadata - description: |- - ValidationIssue captures any validation issues related to the invoice. - - Issues with severity "critical" will prevent the invoice from being issued. - BillingValidationIssueSeverity: - type: string - enum: - - critical - - warning - description: |- - ValidationIssueSeverity describes the severity of a validation issue. - - Issues with severity "critical" will prevent the invoice from being issued. - BillingVoidInvoiceAction: - type: object - required: - - percentage - - action - properties: - percentage: + description: Additional metadata for the feature. + id: + type: string + example: 01ARZ3NDEKTSV4RRFFQ69G5FAV + pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + description: Readonly unique ULID identifier. + readOnly: true + subjectKey: + type: string + minLength: 1 + maxLength: 64 + pattern: ^[a-z0-9]+(?:_[a-z0-9]+)*$ + description: The identifier key unique to the subject + example: customer-1 + featureKey: + type: string + minLength: 1 + maxLength: 64 + pattern: ^[a-z0-9]+(?:_[a-z0-9]+)*$ + description: The feature the subject is entitled to use. + example: example-feature-key + featureId: + type: string + example: 01ARZ3NDEKTSV4RRFFQ69G5FAV + pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + description: The feature the subject is entitled to use. + currentUsagePeriod: allOf: - - $ref: '#/components/schemas/Percentage' - title: How much of the total line items to be voided? (e.g. 100% means all charges are voided) - action: + - $ref: '#/components/schemas/Period' + description: The current usage period. + usagePeriod: allOf: - - $ref: '#/components/schemas/BillingVoidInvoiceLineAction' - title: 'How to handle the voided line items, default: pending' - description: InvoiceVoidAction describes how to handle the voided line items. - BillingVoidInvoiceInput: + - $ref: '#/components/schemas/RecurringPeriod' + description: The defined usage period of the entitlement + allOf: + - $ref: '#/components/schemas/EntitlementBaseTemplate' + description: Entitlement template of a boolean entitlement. + EntitlementBooleanCreateInputs: type: object required: - - action - - reason - - overrides + - type properties: - action: - allOf: - - $ref: '#/components/schemas/BillingVoidInvoiceAction' - description: The action to take on the voided line items. - title: The action to take on the voided lines. - reason: + featureKey: type: string - description: The reason for voiding the invoice. - title: The reason for voiding the invoice - overrides: - type: array - items: - $ref: '#/components/schemas/BillingVoidInvoiceLineOverride' - nullable: true + minLength: 1 + maxLength: 64 + pattern: ^[a-z0-9]+(?:_[a-z0-9]+)*$ description: |- - Per line item overrides for the action. - - If not specified, the `action` will be applied to all line items. - description: Request to void an invoice - BillingVoidInvoiceLineAction: - type: string - enum: - - discard - - pending - - pending_next_cycle - description: VoidInvoiceLineAction describes how to handle the voidied line item in the invoice. - BillingVoidInvoiceLineOverride: - type: object - required: - - lineId - - action - properties: - lineId: + The feature the subject is entitled to use. + Either featureKey or featureId is required. + example: example-feature-key + featureId: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH + example: 01ARZ3NDEKTSV4RRFFQ69G5FAV pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ - description: ULID (Universally Unique Lexicographically Sortable Identifier). - title: The line item ID to override - action: + description: |- + The feature the subject is entitled to use. + Either featureKey or featureId is required. + metadata: allOf: - - $ref: '#/components/schemas/BillingVoidInvoiceAction' - title: The action to take on the line item - description: VoidInvoiceLineOverride describes how to handle a specific line item in the invoice when voiding. - BillingWorkflow: + - $ref: '#/components/schemas/Metadata' + description: Additional metadata for the feature. + usagePeriod: + allOf: + - $ref: '#/components/schemas/RecurringPeriodCreateInput' + description: The usage period associated with the entitlement. + type: + type: string + enum: + - boolean + description: Create inputs for boolean entitlement + EntitlementCreateInputs: + anyOf: + - $ref: '#/components/schemas/EntitlementMeteredCreateInputs' + - $ref: '#/components/schemas/EntitlementStaticCreateInputs' + - $ref: '#/components/schemas/EntitlementBooleanCreateInputs' + discriminator: + propertyName: type + mapping: + metered: '#/components/schemas/EntitlementMeteredCreateInputs' + static: '#/components/schemas/EntitlementStaticCreateInputs' + boolean: '#/components/schemas/EntitlementBooleanCreateInputs' + description: Create inputs for entitlement + EntitlementGrant: type: object required: - createdAt - updatedAt + - amount + - effectiveAt + - expiration - id + - entitlementId properties: createdAt: type: string @@ -10323,723 +10076,202 @@ components: description: Timestamp of when the resource was permanently deleted. title: Deletion Time readOnly: true - collection: - allOf: - - $ref: '#/components/schemas/BillingWorkflowCollectionSettings' - title: The collection settings for this workflow - invoicing: + amount: + type: number + format: double + example: 100 + minimum: 0 + description: The amount to grant. Should be a positive number. + priority: + type: integer + format: uint8 + example: 1 + minimum: 1 + maximum: 255 + description: |- + The priority of the grant. Grants with higher priority are applied first. + Priority is a positive decimal numbers. With lower numbers indicating higher importance. + For example, a priority of 1 is more urgent than a priority of 2. + When there are several grants available for the same subject, the system selects the grant with the highest priority. + In cases where grants share the same priority level, the grant closest to its expiration will be used first. + In the case of two grants have identical priorities and expiration dates, the system will use the grant that was created first. + effectiveAt: + type: string + format: date-time + example: 2023-01-01T01:01:01.001Z + description: Effective date for grants and anchor for recurring grants. Provided value will be ceiled to metering windowSize (minute). + expiration: allOf: - - $ref: '#/components/schemas/BillingWorkflowInvoicingSettings' - title: The invoicing settings for this workflow - payment: + - $ref: '#/components/schemas/ExpirationPeriod' + description: The grant expiration definition + maxRolloverAmount: + type: number + format: double + example: 100 + description: |- + Grants are rolled over at reset, after which they can have a different balance compared to what they had before the reset. + Balance after the reset is calculated as: Balance_After_Reset = MIN(MaxRolloverAmount, MAX(Balance_Before_Reset, MinRolloverAmount)) + default: 0 + minRolloverAmount: + type: number + format: double + example: 100 + description: |- + Grants are rolled over at reset, after which they can have a different balance compared to what they had before the reset. + Balance after the reset is calculated as: Balance_After_Reset = MIN(MaxRolloverAmount, MAX(Balance_Before_Reset, MinRolloverAmount)) + default: 0 + metadata: allOf: - - $ref: '#/components/schemas/BillingWorkflowPaymentSettings' - title: The payment settings for this workflow + - $ref: '#/components/schemas/Metadata' + example: + stripePaymentId: pi_4OrAkhLvyihio9p51h9iiFnB + description: The grant metadata. id: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH + example: 01ARZ3NDEKTSV4RRFFQ69G5FAV pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ - description: A unique identifier for the resource. - title: ID + description: Readonly unique ULID identifier. readOnly: true - description: Workflow represents a billing workflow - BillingWorkflowAppIdOrType: - type: string - description: |- - AppIdOrType can be used to reference an app during creation only. - - This can be either an AppType or the ULID of an app. - BillingWorkflowCollectionAlignment: - type: string - enum: - - subscription - description: |- - CollectionAlignment specifies when the pending line items should be collected into - an invoice. - title: Collection alignment - BillingWorkflowCollectionMethod: - type: string - enum: - - charge_automatically - - send_invoice - description: CollectionMethod specifies how the invoice should be collected (automatic vs manual) - title: Collection method - BillingWorkflowCollectionSettings: - type: object - properties: - alignment: - allOf: - - $ref: '#/components/schemas/BillingWorkflowCollectionAlignment' - description: When to collect the pending line items into an invoice. - default: subscription - interval: - type: string - format: ISO8601 - example: P1D - description: The interval for collecting the pending line items into an invoice. - default: PT1H - description: Workflow collection specifies how to collect the pending line items for an invoice - BillingWorkflowInvoicingSettings: - type: object - properties: - autoAdvance: - type: boolean - description: Whether to automatically issue the invoice after the draftPeriod has passed. - default: true - draftPeriod: - type: string - format: ISO8601 - example: P1D - description: The period for the invoice to be kept in draft status for manual reviews. - default: P1D - dueAfter: - type: string - format: ISO8601 - example: P1D - description: The period after which the invoice is due. - default: P7D - description: WorkflowInvoice represents the invoice settings for a billing workflow - title: Workflow invoice settings - BillingWorkflowPaymentSettings: - type: object - properties: - collectionMethod: - allOf: - - $ref: '#/components/schemas/BillingWorkflowCollectionMethod' - default: charge_automatically - description: WorkflowPaymentSettings represents the payment settings for a billing workflow - title: Workflow payment settings - BillingWorkflowSettings: - type: object - properties: - collection: - allOf: - - $ref: '#/components/schemas/BillingWorkflowCollectionSettings' - title: The collection settings for this workflow - invoicing: - allOf: - - $ref: '#/components/schemas/BillingWorkflowInvoicingSettings' - title: The invoicing settings for this workflow - payment: - allOf: - - $ref: '#/components/schemas/BillingWorkflowPaymentSettings' - title: The payment settings for this workflow - description: WorkflowSettings represents the settings for a billing workflow. - CheckoutSessionCustomTextAfterSubmitParams: - type: object - properties: - afterSubmit: - type: object - properties: - message: - type: string - shippingAddress: - type: object - properties: - message: - type: string - submit: - type: object - properties: - message: - type: string - termsOfServiceAcceptance: - type: object - properties: - message: - type: string - description: Stripe CheckoutSession.custom_text - CheckoutSessionUIMode: - type: string - enum: - - embedded - - hosted - description: Stripe CheckoutSession.ui_mode - ClientAppStartResponse: - type: object - required: - - url - properties: - url: - type: string - description: The URL to start the OAuth2 authorization code grant flow. - description: Response from the client app (OpenMeter backend) to start the OAuth2 flow. - ConflictProblemResponse: - type: object - allOf: - - $ref: '#/components/schemas/UnexpectedProblemResponse' - description: The request could not be completed due to a conflict with the current state of the target resource. - CountryCode: - type: string - example: US - minLength: 2 - maxLength: 2 - pattern: ^[A-Z]{2}$ - description: |- - [ISO 3166-1](https://www.iso.org/iso-3166-country-codes.html) alpha-2 country code. - Custom two-letter country codes are also supported for convenience. - CreateCustomSubscriptionRequestBody: - type: object - required: - - currency - - activeFrom - - customPlan - - customerId - properties: - currency: - $ref: '#/components/schemas/CurrencyCode' - activeFrom: - type: string - format: date-time - example: 2023-01-01T01:01:01.001Z - description: '[RFC3339](https://tools.ietf.org/html/rfc3339) formatted date-time string in UTC.' - customPlan: - $ref: '#/components/schemas/PlanCreate' - customerId: - type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH - pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ - description: ULID (Universally Unique Lexicographically Sortable Identifier). - description: Create a custom subscription. - CreateStripeCheckoutSessionRequest: - type: object - required: - - customer - - options - properties: - appId: - type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH - pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ - description: If not provided, the default Stripe app is used if any. - customer: - anyOf: - - $ref: '#/components/schemas/CustomerId' - - $ref: '#/components/schemas/CustomerCreate' - description: |- - Provide a customer ID to use an existing OpenMeter customer. - or provide a customer object to create a new customer. - stripeCustomerId: - type: string - description: |- - Stripe customer ID. - If not provided OpenMeter creates a new Stripe customer or - uses the OpenMeter customer's default Stripe customer ID. - options: - allOf: - - $ref: '#/components/schemas/CreateStripeCheckoutSessionRequestOptions' - description: Options passed to Stripe when creating the checkout session. - description: Create Stripe checkout session request. - CreateStripeCheckoutSessionRequestOptions: - type: object - properties: - currency: - $ref: '#/components/schemas/CurrencyCode' - cancelURL: - type: string - clientReferenceID: - type: string - customText: - $ref: '#/components/schemas/CheckoutSessionCustomTextAfterSubmitParams' - metadata: - type: object - additionalProperties: - type: string - returnURL: - type: string - successURL: - type: string - uiMode: - $ref: '#/components/schemas/CheckoutSessionUIMode' - paymentMethodTypes: - type: array - items: - type: string - description: Create Stripe checkout session options - CreateStripeCheckoutSessionResult: - type: object - required: - - customerId - - stripeCustomerId - - sessionId - - setupIntentId - - url - - mode - properties: - customerId: - type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH - pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ - description: The OpenMeter customer ID. - stripeCustomerId: - type: string - description: The Stripe customer ID. - sessionId: - type: string - description: The checkout session ID. - setupIntentId: - type: string - description: The checkout session setup intent ID. - url: - type: string - description: URL to show the checkout session. - mode: - allOf: - - $ref: '#/components/schemas/StripeCheckoutSessionMode' - description: |- - Mode - Always `setup` for now. - cancelURL: - type: string - description: Cancel URL. - successURL: - type: string - description: Success URL. - returnURL: - type: string - description: Return URL. - description: Create Stripe Checkout Session response. - CurrencyCode: - type: string - example: USD - minLength: 3 - maxLength: 3 - pattern: ^[A-Z]{3}$ - description: |- - Three-letter [ISO4217](https://www.iso.org/iso-4217-currency-codes.html) currency code. - Custom three-letter currency codes are also supported for convenience. - CustomSubscriptionChange: - type: object - required: - - currency - - activeFrom - - customPlan - properties: - currency: - $ref: '#/components/schemas/CurrencyCode' - activeFrom: - type: string - format: date-time - example: 2023-01-01T01:01:01.001Z - description: '[RFC3339](https://tools.ietf.org/html/rfc3339) formatted date-time string in UTC.' - customPlan: - $ref: '#/components/schemas/PlanCreate' - description: Change a custom subscription. - Customer: - type: object - required: - - id - - name - - createdAt - - updatedAt - - usageAttribution - properties: - id: - type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH - pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ - description: A unique identifier for the resource. - title: ID - readOnly: true - name: - type: string - minLength: 1 - maxLength: 256 - description: Human-readable name for the resource. Between 1 and 256 characters. - title: Display name - description: - type: string - maxLength: 1024 - description: Optional description of the resource. Maximum 1024 characters. - title: Description - metadata: - type: object - allOf: - - $ref: '#/components/schemas/Metadata' - nullable: true - description: Additional metadata for the resource. - title: Metadata - createdAt: - type: string - format: date-time - example: 2024-01-01T01:01:01.001Z - description: Timestamp of when the resource was created. - title: Creation Time - readOnly: true - updatedAt: + entitlementId: type: string - format: date-time - example: 2024-01-01T01:01:01.001Z - description: Timestamp of when the resource was last updated. - title: Last Update Time + example: 01ARZ3NDEKTSV4RRFFQ69G5FAV + description: The unique entitlement ULID that the grant is associated with. readOnly: true - deletedAt: + nextRecurrence: type: string format: date-time - example: 2024-01-01T01:01:01.001Z - description: Timestamp of when the resource was permanently deleted. - title: Deletion Time - readOnly: true - timezone: - type: string - description: Timezone of the customer. - title: Timezone - usageAttribution: - allOf: - - $ref: '#/components/schemas/CustomerUsageAttribution' - description: Mapping to attribute metered usage to the customer - title: Usage Attribution - primaryEmail: - type: string - description: The primary email address of the customer. - title: Primary Email - currency: - allOf: - - $ref: '#/components/schemas/CurrencyCode' - description: |- - Currency of the customer. - Used for billing, tax and invoicing. - title: Currency - billingAddress: - allOf: - - $ref: '#/components/schemas/Address' - description: |- - The billing address of the customer. - Used for tax and invoicing. - title: Billing Address - example: - id: 01G65Z755AFWAKHE12NY0CQ9FH - name: ACME Inc. - usageAttribution: - subjectKeys: - - my_subject_key - createdAt: 2024-01-01T01:01:01.001Z - updatedAt: 2024-01-01T01:01:01.001Z - description: A customer object. - CustomerAppData: - anyOf: - - $ref: '#/components/schemas/StripeCustomerAppData' - - $ref: '#/components/schemas/SandboxCustomerAppData' - discriminator: - propertyName: type - mapping: - stripe: '#/components/schemas/StripeCustomerAppData' - sandbox: '#/components/schemas/SandboxCustomerAppData' - description: |- - CustomerAppData - Stores the app specific data for the customer. - One of: stripe, sandbox - CustomerAppDataPaginatedResponse: - type: object - required: - - totalCount - - page - - pageSize - - items - properties: - totalCount: - type: integer - example: 500 - description: The items in the current page. - page: - type: integer - example: 1 - description: The items in the current page. - pageSize: - type: integer - example: 100 - description: The items in the current page. - items: - type: array - items: - $ref: '#/components/schemas/CustomerAppData' - description: The items in the current page. - description: Paginated response - CustomerCreate: - type: object - required: - - name - - usageAttribution - properties: - name: - type: string - minLength: 1 - maxLength: 256 - description: Human-readable name for the resource. Between 1 and 256 characters. - title: Display name - description: - type: string - maxLength: 1024 - description: Optional description of the resource. Maximum 1024 characters. - title: Description - metadata: - type: object - allOf: - - $ref: '#/components/schemas/Metadata' - nullable: true - description: Additional metadata for the resource. - title: Metadata - timezone: - type: string - description: Timezone of the customer. - title: Timezone - usageAttribution: - allOf: - - $ref: '#/components/schemas/CustomerUsageAttribution' - description: Mapping to attribute metered usage to the customer - title: Usage Attribution - primaryEmail: - type: string - description: The primary email address of the customer. - title: Primary Email - currency: - allOf: - - $ref: '#/components/schemas/CurrencyCode' - description: |- - Currency of the customer. - Used for billing, tax and invoicing. - title: Currency - billingAddress: - allOf: - - $ref: '#/components/schemas/Address' - description: |- - The billing address of the customer. - Used for tax and invoicing. - title: Billing Address - description: Resource create operation model. - CustomerId: - type: object - required: - - id - properties: - id: - type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH - pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ - description: ULID (Universally Unique Lexicographically Sortable Identifier). - description: Create Stripe checkout session customer ID. - CustomerOrderBy: - type: string - enum: - - id - - name - - createdAt - description: Order by options for customers. - CustomerOverridePaginatedResponse: - type: object - required: - - totalCount - - page - - pageSize - - items - properties: - totalCount: - type: integer - example: 500 - description: The items in the current page. - page: - type: integer - example: 1 - description: The items in the current page. - pageSize: - type: integer - example: 100 - description: The items in the current page. - items: - type: array - items: - $ref: '#/components/schemas/BillingCustomerOverride' - description: The items in the current page. - description: Paginated response - CustomerPaginatedResponse: - type: object - required: - - totalCount - - page - - pageSize - - items - properties: - totalCount: - type: integer - example: 500 - description: The items in the current page. - page: - type: integer - example: 1 - description: The items in the current page. - pageSize: - type: integer - example: 100 - description: The items in the current page. - items: - type: array - items: - $ref: '#/components/schemas/Customer' - description: The items in the current page. - description: Paginated response - CustomerReplaceUpdate: - type: object - required: - - name - - usageAttribution - properties: - name: - type: string - minLength: 1 - maxLength: 256 - description: Human-readable name for the resource. Between 1 and 256 characters. - title: Display name - description: - type: string - maxLength: 1024 - description: Optional description of the resource. Maximum 1024 characters. - title: Description - metadata: - type: object - allOf: - - $ref: '#/components/schemas/Metadata' - nullable: true - description: Additional metadata for the resource. - title: Metadata - timezone: - type: string - description: Timezone of the customer. - title: Timezone - usageAttribution: - allOf: - - $ref: '#/components/schemas/CustomerUsageAttribution' - description: Mapping to attribute metered usage to the customer - title: Usage Attribution - primaryEmail: + example: 2023-01-01T01:01:01.001Z + description: The next time the grant will recurr. + expiresAt: type: string - description: The primary email address of the customer. - title: Primary Email - currency: - allOf: - - $ref: '#/components/schemas/CurrencyCode' - description: |- - Currency of the customer. - Used for billing, tax and invoicing. - title: Currency - billingAddress: + format: date-time + example: 2023-01-01T01:01:01.001Z + description: The time the grant expires. + readOnly: true + voidedAt: + type: string + format: date-time + example: 2023-01-01T01:01:01.001Z + description: The time the grant was voided. + recurrence: allOf: - - $ref: '#/components/schemas/Address' - description: |- - The billing address of the customer. - Used for tax and invoicing. - title: Billing Address - description: Resource update operation model. - CustomerUsageAttribution: - type: object - required: - - subjectKeys - properties: - subjectKeys: - type: array - items: - type: string - minItems: 1 - maxItems: 1 - description: The subjects that are attributed to the customer. - title: SubjectKeys - description: |- - Mapping to attribute metered usage to the customer. - One customer can have multiple subjects, - but one subject can only belong to one customer. - Discount: - type: object - allOf: - - $ref: '#/components/schemas/DiscountPercentage' - description: |- - A discount on a price. - One of: percentage, amount, or usage. - DiscountPercentage: + - $ref: '#/components/schemas/RecurringPeriod' + description: The recurrence period of the grant. + description: The grant. + EntitlementGrantCreateInput: type: object required: - - type - - percentage + - amount + - effectiveAt + - expiration properties: - type: - type: string - enum: - - percentage - description: The type of the discount. - title: Type - percentage: + amount: type: number + format: double + example: 100 minimum: 0 - maximum: 100 - description: The percentage of the discount. - title: Percentage - rateCards: - type: array - items: - type: string - minLength: 1 - maxLength: 64 - pattern: ^[a-z0-9]+(?:_[a-z0-9]+)*$ - description: A key is a unique string that is used to identify a resource. + description: The amount to grant. Should be a positive number. + priority: + type: integer + format: uint8 + example: 1 + minimum: 1 + maximum: 255 description: |- - The rate cards that the discount applies to. - When not specified, the discount applies to all rate cards. - title: Discounted RateCards - description: Percentage discount. - DiscountPercentageUpdateItem: - type: object - required: - - percentage - properties: - percentage: + The priority of the grant. Grants with higher priority are applied first. + Priority is a positive decimal numbers. With lower numbers indicating higher importance. + For example, a priority of 1 is more urgent than a priority of 2. + When there are several grants available for the same subject, the system selects the grant with the highest priority. + In cases where grants share the same priority level, the grant closest to its expiration will be used first. + In the case of two grants have identical priorities and expiration dates, the system will use the grant that was created first. + effectiveAt: + type: string + format: date-time + example: 2023-01-01T01:01:01.001Z + description: Effective date for grants and anchor for recurring grants. Provided value will be ceiled to metering windowSize (minute). + expiration: + allOf: + - $ref: '#/components/schemas/ExpirationPeriod' + description: The grant expiration definition + maxRolloverAmount: type: number - minimum: 0 - maximum: 100 - description: The percentage of the discount. - title: Percentage - rateCards: - type: array - items: - type: string - minLength: 1 - maxLength: 64 - pattern: ^[a-z0-9]+(?:_[a-z0-9]+)*$ - description: A key is a unique string that is used to identify a resource. + format: double + example: 100 description: |- - The rate cards that the discount applies to. - When not specified, the discount applies to all rate cards. - title: Discounted RateCards - description: Percentage discount. - DiscountUpdateItem: - type: object - allOf: - - $ref: '#/components/schemas/DiscountPercentageUpdateItem' - description: |- - A discount on a price. - One of: percentage, amount, or usage. - Entitlement: - anyOf: - - $ref: '#/components/schemas/EntitlementMetered' - - $ref: '#/components/schemas/EntitlementStatic' - - $ref: '#/components/schemas/EntitlementBoolean' - discriminator: - propertyName: type - mapping: - metered: '#/components/schemas/EntitlementMetered' - static: '#/components/schemas/EntitlementStatic' - boolean: '#/components/schemas/EntitlementBoolean' - description: |- - Entitlement templates are used to define the entitlements of a plan. - Features are omitted from the entitlement template, as they are defined in the rate card. - EntitlementBaseTemplate: + Grants are rolled over at reset, after which they can have a different balance compared to what they had before the reset. + Balance after the reset is calculated as: Balance_After_Reset = MIN(MaxRolloverAmount, MAX(Balance_Before_Reset, MinRolloverAmount)) + default: 0 + minRolloverAmount: + type: number + format: double + example: 100 + description: |- + Grants are rolled over at reset, after which they can have a different balance compared to what they had before the reset. + Balance after the reset is calculated as: Balance_After_Reset = MIN(MaxRolloverAmount, MAX(Balance_Before_Reset, MinRolloverAmount)) + default: 0 + metadata: + allOf: + - $ref: '#/components/schemas/Metadata' + example: + stripePaymentId: pi_4OrAkhLvyihio9p51h9iiFnB + description: The grant metadata. + recurrence: + allOf: + - $ref: '#/components/schemas/RecurringPeriodCreateInput' + description: The subject of the grant. + description: The grant creation input. + EntitlementMetered: type: object required: + - type - createdAt - updatedAt - id - - type - subjectKey - featureKey - featureId + - lastReset + - currentUsagePeriod + - measureUsageFrom + - usagePeriod properties: + type: + type: string + enum: + - metered + isSoftLimit: + type: boolean + description: If softLimit=true the subject can use the feature even if the entitlement is exhausted, hasAccess will always be true. + title: Soft limit + default: false + isUnlimited: + type: boolean + description: Deprecated, ignored by the backend. Please use isSoftLimit instead; this field will be removed in the future. + deprecated: true + default: false + issueAfterReset: + type: number + format: double + minimum: 0 + description: |- + You can grant usage automatically alongside the entitlement, the example scenario would be creating a starting balance. + If an amount is specified here, a grant will be created alongside the entitlement with the specified amount. + That grant will have it's rollover settings configured in a way that after each reset operation, the balance will return the original amount specified here. + Manually creating such a grant would mean having the "amount", "minRolloverAmount", and "maxRolloverAmount" fields all be the same. + title: Initial grant amount + issueAfterResetPriority: + type: integer + format: uint8 + minimum: 1 + maximum: 255 + description: Defines the grant priority for the default grant. + title: Issue grant after reset priority + default: 1 + preserveOverageAtReset: + type: boolean + description: If true, the overage is preserved at reset. If false, the usage is reset to 0. + title: Preserve overage at reset + default: false createdAt: type: string format: date-time @@ -11071,11 +10303,6 @@ components: pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: Readonly unique ULID identifier. readOnly: true - type: - allOf: - - $ref: '#/components/schemas/EntitlementType' - description: The type of the entitlement. - title: Type subjectKey: type: string minLength: 1 @@ -11088,26 +10315,147 @@ components: minLength: 1 maxLength: 64 pattern: ^[a-z0-9]+(?:_[a-z0-9]+)*$ - description: The feature the subject is entitled to use. + description: The feature the subject is entitled to use. + example: example-feature-key + featureId: + type: string + example: 01ARZ3NDEKTSV4RRFFQ69G5FAV + pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + description: The feature the subject is entitled to use. + lastReset: + type: string + format: date-time + example: 2023-01-01T01:01:01.001Z + description: The time the last reset happened. + readOnly: true + currentUsagePeriod: + allOf: + - $ref: '#/components/schemas/Period' + description: The current usage period. + readOnly: true + measureUsageFrom: + type: string + format: date-time + example: 2023-01-01T01:01:01.001Z + description: The time from which usage is measured. If not specified on creation, defaults to entitlement creation time. + readOnly: true + usagePeriod: + allOf: + - $ref: '#/components/schemas/RecurringPeriod' + description: THe usage period of the entitlement. + readOnly: true + description: |- + Metered entitlements are useful for many different use cases, from setting up usage based access to implementing complex credit systems. + Access is determined based on feature usage using a balance calculation (the "usage allowance" provided by the issued grants is "burnt down" by the usage). + EntitlementMeteredCreateInputs: + type: object + required: + - type + - usagePeriod + properties: + featureKey: + type: string + minLength: 1 + maxLength: 64 + pattern: ^[a-z0-9]+(?:_[a-z0-9]+)*$ + description: |- + The feature the subject is entitled to use. + Either featureKey or featureId is required. example: example-feature-key featureId: type: string example: 01ARZ3NDEKTSV4RRFFQ69G5FAV pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ - description: The feature the subject is entitled to use. - currentUsagePeriod: + description: |- + The feature the subject is entitled to use. + Either featureKey or featureId is required. + metadata: allOf: - - $ref: '#/components/schemas/Period' - description: The current usage period. + - $ref: '#/components/schemas/Metadata' + description: Additional metadata for the feature. + type: + type: string + enum: + - metered + isSoftLimit: + type: boolean + description: If softLimit=true the subject can use the feature even if the entitlement is exhausted, hasAccess will always be true. + title: Soft limit + default: false + isUnlimited: + type: boolean + description: Deprecated, ignored by the backend. Please use isSoftLimit instead; this field will be removed in the future. + deprecated: true + default: false usagePeriod: allOf: - - $ref: '#/components/schemas/RecurringPeriod' - description: The defined usage period of the entitlement - description: Shared fields of the entitlement templates. - EntitlementBoolean: + - $ref: '#/components/schemas/RecurringPeriodCreateInput' + description: The usage period associated with the entitlement. + measureUsageFrom: + allOf: + - $ref: '#/components/schemas/MeasureUsageFrom' + description: Defines the time from which usage is measured. If not specified on creation, defaults to entitlement creation time. + issueAfterReset: + type: number + format: double + minimum: 0 + description: |- + You can grant usage automatically alongside the entitlement, the example scenario would be creating a starting balance. + If an amount is specified here, a grant will be created alongside the entitlement with the specified amount. + That grant will have it's rollover settings configured in a way that after each reset operation, the balance will return the original amount specified here. + Manually creating such a grant would mean having the "amount", "minRolloverAmount", and "maxRolloverAmount" fields all be the same. + title: Initial grant amount + issueAfterResetPriority: + type: integer + format: uint8 + minimum: 1 + maximum: 255 + description: Defines the grant priority for the default grant. + title: Issue grant after reset priority + default: 1 + preserveOverageAtReset: + type: boolean + description: If true, the overage is preserved at reset. If false, the usage is reset to 0. + title: Preserve overage at reset + default: false + description: Create inpurs for metered entitlement + EntitlementOrderBy: + type: string + enum: + - createdAt + - updatedAt + description: Order by options for entitlements. + EntitlementPaginatedResponse: + type: object + required: + - totalCount + - page + - pageSize + - items + properties: + totalCount: + type: integer + example: 500 + description: The items in the current page. + page: + type: integer + example: 1 + description: The items in the current page. + pageSize: + type: integer + example: 100 + description: The items in the current page. + items: + type: array + items: + $ref: '#/components/schemas/Entitlement' + description: The items in the current page. + description: Paginated response + EntitlementStatic: type: object required: - type + - config - createdAt - updatedAt - id @@ -11118,7 +10466,12 @@ components: type: type: string enum: - - boolean + - static + config: + type: string + format: json + example: '{ "integrations": ["github"] }' + description: The JSON parsable config of the entitlement. This value is also returned when checking entitlement access and it is useful for configuring fine-grained access settings to the feature, implemented in your own system. Has to be an object. createdAt: type: string format: date-time @@ -11177,13 +10530,12 @@ components: allOf: - $ref: '#/components/schemas/RecurringPeriod' description: The defined usage period of the entitlement - allOf: - - $ref: '#/components/schemas/EntitlementBaseTemplate' - description: Entitlement template of a boolean entitlement. - EntitlementBooleanCreateInputs: + description: A static entitlement. + EntitlementStaticCreateInputs: type: object required: - type + - config properties: featureKey: type: string @@ -11212,248 +10564,165 @@ components: type: type: string enum: - - boolean - description: Create inputs for boolean entitlement - EntitlementCreateInputs: - anyOf: - - $ref: '#/components/schemas/EntitlementMeteredCreateInputs' - - $ref: '#/components/schemas/EntitlementStaticCreateInputs' - - $ref: '#/components/schemas/EntitlementBooleanCreateInputs' - discriminator: - propertyName: type - mapping: - metered: '#/components/schemas/EntitlementMeteredCreateInputs' - static: '#/components/schemas/EntitlementStaticCreateInputs' - boolean: '#/components/schemas/EntitlementBooleanCreateInputs' - description: Create inputs for entitlement - EntitlementGrant: - type: object - required: - - createdAt - - updatedAt - - amount - - effectiveAt - - expiration - - id - - entitlementId - properties: - createdAt: - type: string - format: date-time - example: 2024-01-01T01:01:01.001Z - description: Timestamp of when the resource was created. - title: Creation Time - readOnly: true - updatedAt: - type: string - format: date-time - example: 2024-01-01T01:01:01.001Z - description: Timestamp of when the resource was last updated. - title: Last Update Time - readOnly: true - deletedAt: - type: string - format: date-time - example: 2024-01-01T01:01:01.001Z - description: Timestamp of when the resource was permanently deleted. - title: Deletion Time - readOnly: true - amount: - type: number - format: double - example: 100 - minimum: 0 - description: The amount to grant. Should be a positive number. - priority: - type: integer - format: uint8 - example: 1 - minimum: 1 - maximum: 255 - description: |- - The priority of the grant. Grants with higher priority are applied first. - Priority is a positive decimal numbers. With lower numbers indicating higher importance. - For example, a priority of 1 is more urgent than a priority of 2. - When there are several grants available for the same subject, the system selects the grant with the highest priority. - In cases where grants share the same priority level, the grant closest to its expiration will be used first. - In the case of two grants have identical priorities and expiration dates, the system will use the grant that was created first. - effectiveAt: - type: string - format: date-time - example: 2023-01-01T01:01:01.001Z - description: Effective date for grants and anchor for recurring grants. Provided value will be ceiled to metering windowSize (minute). - expiration: - allOf: - - $ref: '#/components/schemas/ExpirationPeriod' - description: The grant expiration definition - maxRolloverAmount: - type: number - format: double - example: 100 - description: |- - Grants are rolled over at reset, after which they can have a different balance compared to what they had before the reset. - Balance after the reset is calculated as: Balance_After_Reset = MIN(MaxRolloverAmount, MAX(Balance_Before_Reset, MinRolloverAmount)) - default: 0 - minRolloverAmount: - type: number - format: double - example: 100 - description: |- - Grants are rolled over at reset, after which they can have a different balance compared to what they had before the reset. - Balance after the reset is calculated as: Balance_After_Reset = MIN(MaxRolloverAmount, MAX(Balance_Before_Reset, MinRolloverAmount)) - default: 0 - metadata: - allOf: - - $ref: '#/components/schemas/Metadata' - example: - stripePaymentId: pi_4OrAkhLvyihio9p51h9iiFnB - description: The grant metadata. - id: - type: string - example: 01ARZ3NDEKTSV4RRFFQ69G5FAV - pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ - description: Readonly unique ULID identifier. - readOnly: true - entitlementId: - type: string - example: 01ARZ3NDEKTSV4RRFFQ69G5FAV - description: The unique entitlement ULID that the grant is associated with. - readOnly: true - nextRecurrence: - type: string - format: date-time - example: 2023-01-01T01:01:01.001Z - description: The next time the grant will recurr. - expiresAt: - type: string - format: date-time - example: 2023-01-01T01:01:01.001Z - description: The time the grant expires. - readOnly: true - voidedAt: + - static + config: type: string - format: date-time - example: 2023-01-01T01:01:01.001Z - description: The time the grant was voided. - recurrence: - allOf: - - $ref: '#/components/schemas/RecurringPeriod' - description: The recurrence period of the grant. - description: The grant. - EntitlementGrantCreateInput: + format: json + example: '{ "integrations": ["github"] }' + description: The JSON parsable config of the entitlement. This value is also returned when checking entitlement access and it is useful for configuring fine-grained access settings to the feature, implemented in your own system. Has to be an object. + description: Create inputs for static entitlement + EntitlementType: + type: string + enum: + - metered + - boolean + - static + description: Type of the entitlement. + x-go-type: string + EntitlementValue: type: object required: - - amount - - effectiveAt - - expiration + - hasAccess properties: - amount: + hasAccess: + type: boolean + example: true + description: Whether the subject has access to the feature. Shared accross all entitlement types. + readOnly: true + balance: type: number format: double example: 100 - minimum: 0 - description: The amount to grant. Should be a positive number. - priority: - type: integer - format: uint8 - example: 1 - minimum: 1 - maximum: 255 - description: |- - The priority of the grant. Grants with higher priority are applied first. - Priority is a positive decimal numbers. With lower numbers indicating higher importance. - For example, a priority of 1 is more urgent than a priority of 2. - When there are several grants available for the same subject, the system selects the grant with the highest priority. - In cases where grants share the same priority level, the grant closest to its expiration will be used first. - In the case of two grants have identical priorities and expiration dates, the system will use the grant that was created first. - effectiveAt: - type: string - format: date-time - example: 2023-01-01T01:01:01.001Z - description: Effective date for grants and anchor for recurring grants. Provided value will be ceiled to metering windowSize (minute). - expiration: - allOf: - - $ref: '#/components/schemas/ExpirationPeriod' - description: The grant expiration definition - maxRolloverAmount: + description: Only available for metered entitlements. Metered entitlements are built around a balance calculation where feature usage is deducted from the issued grants. Balance represents the remaining balance of the entitlement, it's value never turns negative. + readOnly: true + usage: type: number format: double - example: 100 - description: |- - Grants are rolled over at reset, after which they can have a different balance compared to what they had before the reset. - Balance after the reset is calculated as: Balance_After_Reset = MIN(MaxRolloverAmount, MAX(Balance_Before_Reset, MinRolloverAmount)) - default: 0 - minRolloverAmount: + example: 50 + description: Only available for metered entitlements. Returns the total feature usage in the current period. + readOnly: true + overage: type: number format: double - example: 100 - description: |- - Grants are rolled over at reset, after which they can have a different balance compared to what they had before the reset. - Balance after the reset is calculated as: Balance_After_Reset = MIN(MaxRolloverAmount, MAX(Balance_Before_Reset, MinRolloverAmount)) - default: 0 - metadata: - allOf: - - $ref: '#/components/schemas/Metadata' - example: - stripePaymentId: pi_4OrAkhLvyihio9p51h9iiFnB - description: The grant metadata. - recurrence: - allOf: - - $ref: '#/components/schemas/RecurringPeriodCreateInput' - description: The subject of the grant. - description: The grant creation input. - EntitlementMetered: + example: 0 + description: Only available for metered entitlements. Overage represents the usage that wasn't covered by grants, e.g. if the subject had a total feature usage of 100 in the period but they were only granted 80, there would be 20 overage. + readOnly: true + config: + type: string + example: '{ key: "value" }' + description: Only available for static entitlements. The JSON parsable config of the entitlement. + readOnly: true + description: Entitlements are the core of OpenMeter access management. They define access to features for subjects. Entitlements can be metered, boolean, or static. + Event: type: object required: - - type - - createdAt - - updatedAt - id - - subjectKey - - featureKey - - featureId - - lastReset - - currentUsagePeriod - - measureUsageFrom - - usagePeriod + - source + - specversion + - type + - subject properties: + id: + type: string + example: 5c10fade-1c9e-4d6c-8275-c52c36731d3c + minLength: 1 + description: Identifies the event. + source: + type: string + example: service-name + minLength: 1 + format: uri-reference + description: Identifies the context in which an event happened. + specversion: + type: string + example: '1.0' + minLength: 1 + description: The version of the CloudEvents specification which the event uses. + default: '1.0' type: + type: string + example: com.example.someevent + minLength: 1 + description: Contains a value describing the type of event related to the originating occurrence. + datacontenttype: type: string enum: - - metered - isSoftLimit: - type: boolean - description: If softLimit=true the subject can use the feature even if the entitlement is exhausted, hasAccess will always be true. - title: Soft limit - default: false - isUnlimited: - type: boolean - description: Deprecated, ignored by the backend. Please use isSoftLimit instead; this field will be removed in the future. - deprecated: true - default: false - issueAfterReset: - type: number - format: double - minimum: 0 + - application/json + nullable: true + example: application/json + description: Content type of the CloudEvents data value. Only the value "application/json" is allowed over HTTP. + dataschema: + type: string + format: uri + nullable: true + minLength: 1 + description: Identifies the schema that data adheres to. + subject: + type: string + example: customer-id + minLength: 1 + description: Describes the subject of the event in the context of the event producer (identified by source). + time: + type: string + format: date-time + example: 2023-01-01T01:01:01.001Z + description: Timestamp of when the occurrence happened. Must adhere to RFC 3339. + nullable: true + data: + type: object + additionalProperties: {} + nullable: true description: |- - You can grant usage automatically alongside the entitlement, the example scenario would be creating a starting balance. - If an amount is specified here, a grant will be created alongside the entitlement with the specified amount. - That grant will have it's rollover settings configured in a way that after each reset operation, the balance will return the original amount specified here. - Manually creating such a grant would mean having the "amount", "minRolloverAmount", and "maxRolloverAmount" fields all be the same. - title: Initial grant amount - issueAfterResetPriority: + The event payload. + Optional, if present it must be a JSON object. + example: + id: 5c10fade-1c9e-4d6c-8275-c52c36731d3c + source: service-name + specversion: '1.0' + type: prompt + subject: customer-id + time: 2023-01-01T01:01:01.001Z + description: |- + CloudEvents Specification JSON Schema + + Optional properties are nullable according to the CloudEvents specification: + OPTIONAL not omitted attributes MAY be represented as a null JSON value. + x-go-type-import: + path: github.com/cloudevents/sdk-go/v2/event + x-go-type: event.Event + ExpirationDuration: + type: string + enum: + - HOUR + - DAY + - WEEK + - MONTH + - YEAR + description: The expiration duration enum + ExpirationPeriod: + type: object + required: + - duration + - count + properties: + duration: + allOf: + - $ref: '#/components/schemas/ExpirationDuration' + description: The unit of time for the expiration period. + count: type: integer - format: uint8 - minimum: 1 - maximum: 255 - description: Defines the grant priority for the default grant. - title: Issue grant after reset priority - default: 1 - preserveOverageAtReset: - type: boolean - description: If true, the overage is preserved at reset. If false, the usage is reset to 0. - title: Preserve overage at reset - default: false + example: 12 + description: The number of time units in the expiration period. + description: The grant expiration definition + Feature: + type: object + required: + - createdAt + - updatedAt + - key + - name + - id + properties: createdAt: type: string format: date-time @@ -11475,139 +10744,281 @@ components: description: Timestamp of when the resource was permanently deleted. title: Deletion Time readOnly: true + archivedAt: + type: string + format: date-time + example: 2023-01-01T01:01:01.001Z + description: Timestamp of when the resource was archived. + title: Archival Time + readOnly: true + key: + type: string + minLength: 1 + maxLength: 64 + pattern: ^[a-z0-9]+(?:_[a-z0-9]+)*$ + description: A key is a unique string that is used to identify a resource. + title: The unique key of the feature + name: + type: string + title: The human-readable name of the feature metadata: allOf: - $ref: '#/components/schemas/Metadata' - description: Additional metadata for the feature. + example: + key: value + title: Optional metadata + meterSlug: + type: string + minLength: 1 + maxLength: 64 + pattern: ^[a-z0-9]+(?:_[a-z0-9]+)*$ + description: A key is a unique string that is used to identify a resource. + example: tokens_total + title: Meter slug + meterGroupByFilters: + type: object + additionalProperties: + type: string + example: + model: gpt-4 + type: input + description: |- + Optional meter group by filters. + Useful if the meter scope is broader than what feature tracks. + Example scenario would be a meter tracking all token use with groupBy fields for the model, + then the feature could filter for model=gpt-4. + title: Meter group by filters id: type: string example: 01ARZ3NDEKTSV4RRFFQ69G5FAV pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: Readonly unique ULID identifier. readOnly: true - subjectKey: + description: |- + Represents a feature that can be enabled or disabled for a plan. + Used both for product catalog and entitlements. + FeatureCreateInputs: + type: object + required: + - key + - name + properties: + key: type: string minLength: 1 maxLength: 64 pattern: ^[a-z0-9]+(?:_[a-z0-9]+)*$ - description: The identifier key unique to the subject - example: customer-1 - featureKey: + description: A key is a unique string that is used to identify a resource. + title: The unique key of the feature + name: + type: string + title: The human-readable name of the feature + metadata: + allOf: + - $ref: '#/components/schemas/Metadata' + example: + key: value + title: Optional metadata + meterSlug: type: string minLength: 1 maxLength: 64 pattern: ^[a-z0-9]+(?:_[a-z0-9]+)*$ - description: The feature the subject is entitled to use. - example: example-feature-key - featureId: + description: A key is a unique string that is used to identify a resource. + example: tokens_total + title: Meter slug + meterGroupByFilters: + type: object + additionalProperties: + type: string + example: + model: gpt-4 + type: input + description: |- + Optional meter group by filters. + Useful if the meter scope is broader than what feature tracks. + Example scenario would be a meter tracking all token use with groupBy fields for the model, + then the feature could filter for model=gpt-4. + title: Meter group by filters + description: |- + Represents a feature that can be enabled or disabled for a plan. + Used both for product catalog and entitlements. + FeatureMeta: + type: object + required: + - id + - key + properties: + id: type: string example: 01ARZ3NDEKTSV4RRFFQ69G5FAV pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ - description: The feature the subject is entitled to use. - lastReset: - type: string - format: date-time - example: 2023-01-01T01:01:01.001Z - description: The time the last reset happened. - readOnly: true - currentUsagePeriod: - allOf: - - $ref: '#/components/schemas/Period' - description: The current usage period. - readOnly: true - measureUsageFrom: + description: Unique identifier of a feature. + title: Feature Unique Identifier + key: type: string - format: date-time - example: 2023-01-01T01:01:01.001Z - description: The time from which usage is measured. If not specified on creation, defaults to entitlement creation time. - readOnly: true - usagePeriod: - allOf: - - $ref: '#/components/schemas/RecurringPeriod' - description: THe usage period of the entitlement. - readOnly: true - description: |- - Metered entitlements are useful for many different use cases, from setting up usage based access to implementing complex credit systems. - Access is determined based on feature usage using a balance calculation (the "usage allowance" provided by the issued grants is "burnt down" by the usage). - EntitlementMeteredCreateInputs: + example: gpt4_tokens + description: |- + The key is an immutable unique identifier of the feature used throughout the API, + for example when interacting with a subject's entitlements. + title: Feature Key + description: Limited representation of a feature resource which includes only its unique identifiers (id, key). + FeatureOrderBy: + type: string + enum: + - id + - createdAt + - updatedAt + description: Order by options for features. + FeaturePaginatedResponse: + type: object + required: + - totalCount + - page + - pageSize + - items + properties: + totalCount: + type: integer + example: 500 + description: The items in the current page. + page: + type: integer + example: 1 + description: The items in the current page. + pageSize: + type: integer + example: 100 + description: The items in the current page. + items: + type: array + items: + $ref: '#/components/schemas/Feature' + description: The items in the current page. + description: Paginated response + FlatPrice: type: object required: - type - - usagePeriod + - amount properties: - featureKey: - type: string - minLength: 1 - maxLength: 64 - pattern: ^[a-z0-9]+(?:_[a-z0-9]+)*$ - description: |- - The feature the subject is entitled to use. - Either featureKey or featureId is required. - example: example-feature-key - featureId: + type: type: string - example: 01ARZ3NDEKTSV4RRFFQ69G5FAV - pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ - description: |- - The feature the subject is entitled to use. - Either featureKey or featureId is required. - metadata: + enum: + - flat + amount: allOf: - - $ref: '#/components/schemas/Metadata' - description: Additional metadata for the feature. + - $ref: '#/components/schemas/Numeric' + description: The amount of the flat price. + description: Flat price. + FlatPriceWithPaymentTerm: + type: object + required: + - type + - amount + properties: type: type: string enum: - - metered - isSoftLimit: - type: boolean - description: If softLimit=true the subject can use the feature even if the entitlement is exhausted, hasAccess will always be true. - title: Soft limit - default: false - isUnlimited: - type: boolean - description: Deprecated, ignored by the backend. Please use isSoftLimit instead; this field will be removed in the future. - deprecated: true - default: false - usagePeriod: + - flat + amount: allOf: - - $ref: '#/components/schemas/RecurringPeriodCreateInput' - description: The usage period associated with the entitlement. - measureUsageFrom: + - $ref: '#/components/schemas/Numeric' + description: The amount of the flat price. + paymentTerm: allOf: - - $ref: '#/components/schemas/MeasureUsageFrom' - description: Defines the time from which usage is measured. If not specified on creation, defaults to entitlement creation time. - issueAfterReset: + - $ref: '#/components/schemas/PricePaymentTerm' + description: |- + The payment term of the flat price. + Defaults to in advance. + default: in_advance + description: Flat price with payment term. + ForbiddenProblemResponse: + type: object + allOf: + - $ref: '#/components/schemas/UnexpectedProblemResponse' + description: The server understood the request but refuses to authorize it. + GatewayTimeoutProblemResponse: + type: object + allOf: + - $ref: '#/components/schemas/UnexpectedProblemResponse' + description: The server, while acting as a gateway or proxy, did not receive a timely response from an upstream server it needed to access in order to complete the request. + GrantBurnDownHistorySegment: + type: object + required: + - period + - usage + - overage + - balanceAtStart + - grantBalancesAtStart + - balanceAtEnd + - grantBalancesAtEnd + - grantUsages + properties: + period: + allOf: + - $ref: '#/components/schemas/Period' + description: The period of the segment. + usage: type: number format: double - minimum: 0 - description: |- - You can grant usage automatically alongside the entitlement, the example scenario would be creating a starting balance. - If an amount is specified here, a grant will be created alongside the entitlement with the specified amount. - That grant will have it's rollover settings configured in a way that after each reset operation, the balance will return the original amount specified here. - Manually creating such a grant would mean having the "amount", "minRolloverAmount", and "maxRolloverAmount" fields all be the same. - title: Initial grant amount - issueAfterResetPriority: - type: integer - format: uint8 - minimum: 1 - maximum: 255 - description: Defines the grant priority for the default grant. - title: Issue grant after reset priority - default: 1 - preserveOverageAtReset: - type: boolean - description: If true, the overage is preserved at reset. If false, the usage is reset to 0. - title: Preserve overage at reset - default: false - description: Create inpurs for metered entitlement - EntitlementOrderBy: + example: 100 + description: The total usage of the grant in the period. + readOnly: true + overage: + type: number + format: double + example: 100 + description: Overuse that wasn't covered by grants. + readOnly: true + balanceAtStart: + type: number + format: double + example: 100 + description: entitlement balance at the start of the period. + readOnly: true + grantBalancesAtStart: + type: object + additionalProperties: + type: number + format: double + example: + 01G65Z755AFWAKHE12NY0CQ9FH: 100 + description: 'The balance breakdown of each active grant at the start of the period: GrantID: Balance' + readOnly: true + balanceAtEnd: + type: number + format: double + example: 100 + description: The entitlement balance at the end of the period. + readOnly: true + grantBalancesAtEnd: + type: object + additionalProperties: + type: number + format: double + example: + 01G65Z755AFWAKHE12NY0CQ9FH: 100 + description: 'The balance breakdown of each active grant at the end of the period: GrantID: Balance' + readOnly: true + grantUsages: + type: array + items: + $ref: '#/components/schemas/GrantUsageRecord' + description: Which grants were actually burnt down in the period and by what amount. + readOnly: true + description: |- + A segment of the grant burn down history. + + A given segment represents the usage of a grant between events that changed either the grant burn down priority order or the usag period. + GrantOrderBy: type: string enum: + - id - createdAt - updatedAt - description: Order by options for entitlements. - EntitlementPaginatedResponse: + description: Order by options for grants. + GrantPaginatedResponse: type: object required: - totalCount @@ -11630,281 +11041,326 @@ components: items: type: array items: - $ref: '#/components/schemas/Entitlement' + $ref: '#/components/schemas/EntitlementGrant' description: The items in the current page. description: Paginated response - EntitlementStatic: + GrantUsageRecord: type: object required: - - type - - config - - createdAt - - updatedAt - - id - - subjectKey - - featureKey - - featureId + - grantId + - usage properties: - type: - type: string - enum: - - static - config: - type: string - format: json - example: '{ "integrations": ["github"] }' - description: The JSON parsable config of the entitlement. This value is also returned when checking entitlement access and it is useful for configuring fine-grained access settings to the feature, implemented in your own system. Has to be an object. - createdAt: - type: string - format: date-time - example: 2024-01-01T01:01:01.001Z - description: Timestamp of when the resource was created. - title: Creation Time - readOnly: true - updatedAt: - type: string - format: date-time - example: 2024-01-01T01:01:01.001Z - description: Timestamp of when the resource was last updated. - title: Last Update Time - readOnly: true - deletedAt: - type: string - format: date-time - example: 2024-01-01T01:01:01.001Z - description: Timestamp of when the resource was permanently deleted. - title: Deletion Time - readOnly: true - metadata: - allOf: - - $ref: '#/components/schemas/Metadata' - description: Additional metadata for the feature. - id: - type: string - example: 01ARZ3NDEKTSV4RRFFQ69G5FAV - pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ - description: Readonly unique ULID identifier. - readOnly: true - subjectKey: - type: string - minLength: 1 - maxLength: 64 - pattern: ^[a-z0-9]+(?:_[a-z0-9]+)*$ - description: The identifier key unique to the subject - example: customer-1 - featureKey: - type: string - minLength: 1 - maxLength: 64 - pattern: ^[a-z0-9]+(?:_[a-z0-9]+)*$ - description: The feature the subject is entitled to use. - example: example-feature-key - featureId: + grantId: type: string - example: 01ARZ3NDEKTSV4RRFFQ69G5FAV + example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ - description: The feature the subject is entitled to use. - currentUsagePeriod: - allOf: - - $ref: '#/components/schemas/Period' - description: The current usage period. - usagePeriod: - allOf: - - $ref: '#/components/schemas/RecurringPeriod' - description: The defined usage period of the entitlement - description: A static entitlement. - EntitlementStaticCreateInputs: + description: The id of the grant + usage: + type: number + format: double + example: 100 + description: The usage in the period + description: Usage Record + IngestEventsBody: + anyOf: + - $ref: '#/components/schemas/Event' + - type: array + items: + $ref: '#/components/schemas/Event' + description: |- + The body of the events request. + Either a single event or a batch of events. + IngestedEvent: type: object required: - - type - - config + - event + - ingestedAt + - storedAt properties: - featureKey: - type: string - minLength: 1 - maxLength: 64 - pattern: ^[a-z0-9]+(?:_[a-z0-9]+)*$ - description: |- - The feature the subject is entitled to use. - Either featureKey or featureId is required. - example: example-feature-key - featureId: + event: + $ref: '#/components/schemas/Event' + validationError: type: string - example: 01ARZ3NDEKTSV4RRFFQ69G5FAV - pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ - description: |- - The feature the subject is entitled to use. - Either featureKey or featureId is required. - metadata: - allOf: - - $ref: '#/components/schemas/Metadata' - description: Additional metadata for the feature. - usagePeriod: - allOf: - - $ref: '#/components/schemas/RecurringPeriodCreateInput' - description: The usage period associated with the entitlement. - type: + description: The validation error if the event failed validation. + ingestedAt: type: string - enum: - - static - config: + format: date-time + example: 2023-01-01T01:01:01.001Z + description: The date and time the event was ingested. + storedAt: type: string - format: json - example: '{ "integrations": ["github"] }' - description: The JSON parsable config of the entitlement. This value is also returned when checking entitlement access and it is useful for configuring fine-grained access settings to the feature, implemented in your own system. Has to be an object. - description: Create inputs for static entitlement - EntitlementType: - type: string - enum: - - metered - - boolean - - static - description: Type of the entitlement. - x-go-type: string - EntitlementValue: + format: date-time + example: 2023-01-01T01:01:01.001Z + description: The date and time the event was stored. + example: + event: + id: 5c10fade-1c9e-4d6c-8275-c52c36731d3c + source: service-name + specversion: '1.0' + type: prompt + subject: customer-id + time: 2023-01-01T01:01:01.001Z + ingestedAt: 2023-01-01T01:01:01.001Z + storedAt: 2023-01-01T01:01:02.001Z + description: An ingested event with optional validation error. + InternalServerErrorProblemResponse: type: object - required: - - hasAccess - properties: - hasAccess: - type: boolean - example: true - description: Whether the subject has access to the feature. Shared accross all entitlement types. - readOnly: true - balance: - type: number - format: double - example: 100 - description: Only available for metered entitlements. Metered entitlements are built around a balance calculation where feature usage is deducted from the issued grants. Balance represents the remaining balance of the entitlement, it's value never turns negative. - readOnly: true - usage: - type: number - format: double - example: 50 - description: Only available for metered entitlements. Returns the total feature usage in the current period. - readOnly: true - overage: - type: number - format: double - example: 0 - description: Only available for metered entitlements. Overage represents the usage that wasn't covered by grants, e.g. if the subject had a total feature usage of 100 in the period but they were only granted 80, there would be 20 overage. - readOnly: true - config: - type: string - example: '{ key: "value" }' - description: Only available for static entitlements. The JSON parsable config of the entitlement. - readOnly: true - description: Entitlements are the core of OpenMeter access management. They define access to features for subjects. Entitlements can be metered, boolean, or static. - Event: + allOf: + - $ref: '#/components/schemas/UnexpectedProblemResponse' + description: The server encountered an unexpected condition that prevented it from fulfilling the request. + Invoice: type: object required: - id - - source - - specversion + - createdAt + - updatedAt - type - - subject + - supplier + - customer + - currency + - totals + - status + - statusDetails properties: id: type: string - example: 5c10fade-1c9e-4d6c-8275-c52c36731d3c - minLength: 1 - description: Identifies the event. - source: + example: 01G65Z755AFWAKHE12NY0CQ9FH + pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + description: A unique identifier for the resource. + title: ID + readOnly: true + description: type: string - example: service-name - minLength: 1 - format: uri-reference - description: Identifies the context in which an event happened. - specversion: + maxLength: 1024 + description: Optional description of the resource. Maximum 1024 characters. + title: Description + metadata: + type: object + allOf: + - $ref: '#/components/schemas/Metadata' + nullable: true + description: Additional metadata for the resource. + title: Metadata + createdAt: type: string - example: '1.0' - minLength: 1 - description: The version of the CloudEvents specification which the event uses. - default: '1.0' - type: + format: date-time + example: 2024-01-01T01:01:01.001Z + description: Timestamp of when the resource was created. + title: Creation Time + readOnly: true + updatedAt: type: string - example: com.example.someevent - minLength: 1 - description: Contains a value describing the type of event related to the originating occurrence. - datacontenttype: + format: date-time + example: 2024-01-01T01:01:01.001Z + description: Timestamp of when the resource was last updated. + title: Last Update Time + readOnly: true + deletedAt: type: string - enum: - - application/json - nullable: true - example: application/json - description: Content type of the CloudEvents data value. Only the value "application/json" is allowed over HTTP. - dataschema: + format: date-time + example: 2024-01-01T01:01:01.001Z + description: Timestamp of when the resource was permanently deleted. + title: Deletion Time + readOnly: true + type: + allOf: + - $ref: '#/components/schemas/InvoiceType' + description: |- + Type of the invoice. + + The type of invoice determines the purpose of the invoice and how it should be handled. + + Supported types: + - standard: A regular commercial invoice document between a supplier and customer. + - credit_note: Reflects a refund either partial or complete of the preceding document. A credit note effectively *extends* the previous document. + readOnly: true + supplier: + allOf: + - $ref: '#/components/schemas/BillingParty' + description: The taxable entity supplying the goods or services. + customer: + allOf: + - $ref: '#/components/schemas/BillingParty' + description: Legal entity receiving the goods or services. + number: + allOf: + - $ref: '#/components/schemas/InvoiceNumber' + description: |- + Number specifies the human readable key used to reference this Invoice. + + The number only gets populated after the invoice had been issued. + + Please note that the number is (depending on the upstream settings) either unique for the + whole organization or unique for the customer, or in multi (stripe) account setups unique for the + account. + readOnly: true + currency: + allOf: + - $ref: '#/components/schemas/CurrencyCode' + description: |- + Currency for all invoice line items. + + Multi currency invoices are not supported yet. + preceding: + type: array + items: + $ref: '#/components/schemas/InvoiceDocumentRef' + description: Key information regarding previous invoices and potentially details as to why they were corrected. + readOnly: true + totals: + allOf: + - $ref: '#/components/schemas/InvoiceTotals' + description: Summary of all the invoice totals, including taxes (calculated). + readOnly: true + status: + allOf: + - $ref: '#/components/schemas/InvoiceStatus' + description: |- + The status of the invoice. + + This field only conatins a simplified status, for more detailed information use the statusDetails field. + readOnly: true + statusDetails: + allOf: + - $ref: '#/components/schemas/InvoiceStatusDetails' + description: The details of the current invoice status. + readOnly: true + issuedAt: type: string - format: uri - nullable: true - minLength: 1 - description: Identifies the schema that data adheres to. - subject: + format: date-time + example: 2023-01-01T01:01:01.001Z + description: |- + The time the invoice was issued. + + Depending on the status of the invoice this can mean multiple things: + - draft, gathering: The time the invoice will be issued based on the workflow settings. + - issued: The time the invoice was issued. + readOnly: true + draftUntil: type: string - example: customer-id - minLength: 1 - description: Describes the subject of the event in the context of the event producer (identified by source). - time: + format: date-time + example: 2023-01-01T01:01:01.001Z + description: |- + The time until the invoice is in draft status. + + On draft invoice creation it is calculated from the workflow settings. + + If manual approval is required, the draftUntil time is set. + dueAt: + type: string + format: date-time + example: 2023-01-01T01:01:01.001Z + description: Due time of the fulfillment of the invoice (if available). + readOnly: true + period: + allOf: + - $ref: '#/components/schemas/Period' + description: The period the invoice covers. If the invoice has no line items, it's not set. + voidedAt: type: string format: date-time example: 2023-01-01T01:01:01.001Z - description: Timestamp of when the occurrence happened. Must adhere to RFC 3339. - nullable: true - data: - type: object - additionalProperties: {} - nullable: true description: |- - The event payload. - Optional, if present it must be a JSON object. - example: - id: 5c10fade-1c9e-4d6c-8275-c52c36731d3c - source: service-name - specversion: '1.0' - type: prompt - subject: customer-id - time: 2023-01-01T01:01:01.001Z - description: |- - CloudEvents Specification JSON Schema + The time the invoice was voided. - Optional properties are nullable according to the CloudEvents specification: - OPTIONAL not omitted attributes MAY be represented as a null JSON value. - x-go-type-import: - path: github.com/cloudevents/sdk-go/v2/event - x-go-type: event.Event - ExpirationDuration: + If the invoice was voided, this field will be set to the time the invoice was voided. + readOnly: true + workflow: + allOf: + - $ref: '#/components/schemas/InvoiceWorkflowSettings' + description: |- + The workflow associated with the invoice. + + It is always a snapshot of the workflow settings at the time of invoice creation. The + field is optional as it should be explicitly requested with expand options. + lines: + type: array + items: + $ref: '#/components/schemas/InvoiceLine' + description: List of invoice lines representing each of the items sold to the customer. + readOnly: true + discounts: + type: array + items: + $ref: '#/components/schemas/Discount' + description: Discounts or allowances applied to the complete invoice. + payment: + allOf: + - $ref: '#/components/schemas/InvoicePaymentTerms' + description: Information on when, how, and to whom the invoice should be paid. + validationIssues: + type: array + items: + $ref: '#/components/schemas/ValidationIssue' + description: Validation issues reported by the invoice workflow. + readOnly: true + description: Invoice represents an invoice in the system. + InvoiceAction: type: string enum: - - HOUR - - DAY - - WEEK - - MONTH - - YEAR - description: The expiration duration enum - ExpirationPeriod: + - advance + - approve + - delete + - retry + - void + description: InvoiceAction represents the actions that can be performed on an invoice. + InvoiceDocumentRef: type: object - required: - - duration - - count - properties: - duration: - allOf: - - $ref: '#/components/schemas/ExpirationDuration' - description: The unit of time for the expiration period. - count: - type: integer - example: 12 - description: The number of time units in the expiration period. - description: The grant expiration definition - Feature: + allOf: + - $ref: '#/components/schemas/CreditNoteOriginalInvoiceRef' + description: InvoiceDocumentRef is used to describe a reference to an existing document (invoice). + InvoiceDocumentRefType: + type: string + enum: + - credit_node_original_invoice + description: InvoiceDocumentRefType defines the type of document that is being referenced. + InvoiceExpand: + type: string + enum: + - '*' + - lines + - preceding + - workflow.apps + description: InvoiceExpand specifies the parts of the invoice to expand in the list output. + x-enum-varnames: + - all + - lines + - preceding + - workflowApps + InvoiceFlatFeeLine: type: object required: + - name - createdAt - updatedAt - - key - - name - id + - status + - currency + - totals + - period + - invoiceAt + - type + - perUnitAmount + - quantity properties: + name: + type: string + minLength: 1 + maxLength: 256 + description: Human-readable name for the resource. Between 1 and 256 characters. + title: Display name + description: + type: string + maxLength: 1024 + description: Optional description of the resource. Maximum 1024 characters. + title: Description + metadata: + type: object + allOf: + - $ref: '#/components/schemas/Metadata' + nullable: true + description: Additional metadata for the resource. + title: Metadata createdAt: type: string format: date-time @@ -11926,133 +11382,402 @@ components: description: Timestamp of when the resource was permanently deleted. title: Deletion Time readOnly: true - archivedAt: + id: + type: string + example: 01G65Z755AFWAKHE12NY0CQ9FH + pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + description: ULID (Universally Unique Lexicographically Sortable Identifier). + status: + allOf: + - $ref: '#/components/schemas/InvoiceLineStatus' + description: |- + Status of the line. + + External calls always create valid lines, other line types are managed by the + billing engine of OpenMeter. + readOnly: true + discounts: + type: array + items: + $ref: '#/components/schemas/InvoiceLineDiscount' + description: |- + Discounts detailes applied to this line. + + New discounts can be added via the invoice's discounts API, to facilitate + discounts that are affecting multiple lines. + readOnly: true + charges: + type: array + items: + $ref: '#/components/schemas/BillingLineCharge' + description: |- + Charges applied to this line. (like minimum spend) + + New charges can be added via the invoice's charges API, to facilitate + charges that are affecting multiple lines. + readOnly: true + invoice: + allOf: + - $ref: '#/components/schemas/InvoiceReference' + description: The invoice this item belongs to. + currency: + allOf: + - $ref: '#/components/schemas/CurrencyCode' + description: The currency of this line. + taxes: + type: array + items: + $ref: '#/components/schemas/InvoiceLineTaxItem' + description: Taxes applied to the invoice totals. + readOnly: true + taxConfig: + allOf: + - $ref: '#/components/schemas/TaxConfig' + description: Tax config specify the tax configuration for this line. + children: + description: The lines detailing the item or service sold. + readOnly: true + type: array + items: + $ref: '#/components/schemas/InvoiceLine' + totals: + allOf: + - $ref: '#/components/schemas/InvoiceTotals' + description: Totals for this line. + readOnly: true + period: + allOf: + - $ref: '#/components/schemas/Period' + description: |- + Period of the line item applies to for revenue recognition pruposes. + + Billing always treats periods as start being inclusive and end being exclusive. + invoiceAt: type: string format: date-time example: 2023-01-01T01:01:01.001Z - description: Timestamp of when the resource was archived. - title: Archival Time - readOnly: true - key: + description: The time this line item should be invoiced. + type: type: string - minLength: 1 - maxLength: 64 - pattern: ^[a-z0-9]+(?:_[a-z0-9]+)*$ - description: A key is a unique string that is used to identify a resource. - title: The unique key of the feature + enum: + - flat_fee + perUnitAmount: + allOf: + - $ref: '#/components/schemas/Numeric' + description: Price of the item being sold. + paymentTerm: + allOf: + - $ref: '#/components/schemas/PricePaymentTerm' + description: Payment term of the line. + default: in_advance + quantity: + allOf: + - $ref: '#/components/schemas/Numeric' + description: Quantity of the item being sold. + description: InvoiceFlatFeeLine represents a line item that is sold to the customer as a manually added fee. + InvoiceFlatFeeLineCreate: + type: object + required: + - name + - currency + - period + - invoiceAt + - type + - perUnitAmount + - quantity + properties: name: type: string - title: The human-readable name of the feature + minLength: 1 + maxLength: 256 + description: Human-readable name for the resource. Between 1 and 256 characters. + title: Display name + description: + type: string + maxLength: 1024 + description: Optional description of the resource. Maximum 1024 characters. + title: Description metadata: + type: object allOf: - $ref: '#/components/schemas/Metadata' - example: - key: value - title: Optional metadata - meterSlug: - type: string - minLength: 1 - maxLength: 64 - pattern: ^[a-z0-9]+(?:_[a-z0-9]+)*$ - description: A key is a unique string that is used to identify a resource. - example: tokens_total - title: Meter slug - meterGroupByFilters: - type: object - additionalProperties: - type: string - example: - model: gpt-4 - type: input + nullable: true + description: Additional metadata for the resource. + title: Metadata + invoice: + allOf: + - $ref: '#/components/schemas/InvoiceReference' + description: The invoice this item belongs to. + currency: + allOf: + - $ref: '#/components/schemas/CurrencyCode' + description: The currency of this line. + taxConfig: + allOf: + - $ref: '#/components/schemas/TaxConfig' + description: Tax config specify the tax configuration for this line. + period: + allOf: + - $ref: '#/components/schemas/Period' description: |- - Optional meter group by filters. - Useful if the meter scope is broader than what feature tracks. - Example scenario would be a meter tracking all token use with groupBy fields for the model, - then the feature could filter for model=gpt-4. - title: Meter group by filters - id: + Period of the line item applies to for revenue recognition pruposes. + + Billing always treats periods as start being inclusive and end being exclusive. + invoiceAt: type: string - example: 01ARZ3NDEKTSV4RRFFQ69G5FAV - pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ - description: Readonly unique ULID identifier. - readOnly: true - description: |- - Represents a feature that can be enabled or disabled for a plan. - Used both for product catalog and entitlements. - FeatureCreateInputs: + format: date-time + example: 2023-01-01T01:01:01.001Z + description: The time this line item should be invoiced. + type: + type: string + enum: + - flat_fee + perUnitAmount: + allOf: + - $ref: '#/components/schemas/Numeric' + description: Price of the item being sold. + paymentTerm: + allOf: + - $ref: '#/components/schemas/PricePaymentTerm' + description: Payment term of the line. + default: in_advance + quantity: + allOf: + - $ref: '#/components/schemas/Numeric' + description: Quantity of the item being sold. + description: Resource create operation model. + InvoiceFlatFeeLineReplaceUpdate: type: object required: - - key - name + - period + - invoiceAt + - type + - perUnitAmount + - quantity properties: - key: + name: type: string minLength: 1 - maxLength: 64 - pattern: ^[a-z0-9]+(?:_[a-z0-9]+)*$ - description: A key is a unique string that is used to identify a resource. - title: The unique key of the feature - name: + maxLength: 256 + description: Human-readable name for the resource. Between 1 and 256 characters. + title: Display name + description: type: string - title: The human-readable name of the feature + maxLength: 1024 + description: Optional description of the resource. Maximum 1024 characters. + title: Description metadata: + type: object allOf: - $ref: '#/components/schemas/Metadata' - example: - key: value - title: Optional metadata - meterSlug: - type: string - minLength: 1 - maxLength: 64 - pattern: ^[a-z0-9]+(?:_[a-z0-9]+)*$ - description: A key is a unique string that is used to identify a resource. - example: tokens_total - title: Meter slug - meterGroupByFilters: - type: object - additionalProperties: - type: string - example: - model: gpt-4 - type: input + nullable: true + description: Additional metadata for the resource. + title: Metadata + taxConfig: + allOf: + - $ref: '#/components/schemas/TaxConfig' + description: Tax config specify the tax configuration for this line. + period: + allOf: + - $ref: '#/components/schemas/Period' description: |- - Optional meter group by filters. - Useful if the meter scope is broader than what feature tracks. - Example scenario would be a meter tracking all token use with groupBy fields for the model, - then the feature could filter for model=gpt-4. - title: Meter group by filters + Period of the line item applies to for revenue recognition pruposes. + + Billing always treats periods as start being inclusive and end being exclusive. + invoiceAt: + type: string + format: date-time + example: 2023-01-01T01:01:01.001Z + description: The time this line item should be invoiced. + type: + type: string + enum: + - flat_fee + perUnitAmount: + allOf: + - $ref: '#/components/schemas/Numeric' + description: Price of the item being sold. + paymentTerm: + allOf: + - $ref: '#/components/schemas/PricePaymentTerm' + description: Payment term of the line. + default: in_advance + quantity: + allOf: + - $ref: '#/components/schemas/Numeric' + description: Quantity of the item being sold. + description: Resource update operation model. + InvoiceGenericDocumentRef: + type: object + required: + - type + properties: + type: + allOf: + - $ref: '#/components/schemas/InvoiceDocumentRefType' + description: Type of the document referenced. + readOnly: true + reason: + type: string + description: Human readable description on why this reference is here or needs to be used. + readOnly: true + description: + type: string + description: Additional details about the document. + readOnly: true description: |- - Represents a feature that can be enabled or disabled for a plan. - Used both for product catalog and entitlements. - FeatureMeta: + Omitted fields: + period: Tax period in which the referred document had an effect required by some tax regimes and formats. + stamps: Seals of approval from other organisations that may need to be listed. + ext: Extensions for additional codes that may be required. + title: InvoiceGenericDocumentRef is used to describe an existing document or a specific part of it's contents. + InvoiceLine: + anyOf: + - $ref: '#/components/schemas/InvoiceUsageBasedLine' + - $ref: '#/components/schemas/InvoiceFlatFeeLine' + discriminator: + propertyName: type + mapping: + usage_based: '#/components/schemas/InvoiceUsageBasedLine' + flat_fee: '#/components/schemas/InvoiceFlatFeeLine' + description: BillingInvoiceLine represents a line item that is sold to the customer based on a specific (unit) price. + InvoiceLineCreate: + anyOf: + - $ref: '#/components/schemas/InvoiceUsageBasedLineCreate' + - $ref: '#/components/schemas/InvoiceFlatFeeLineCreate' + discriminator: + propertyName: type + mapping: + usage_based: '#/components/schemas/InvoiceUsageBasedLineCreate' + flat_fee: '#/components/schemas/InvoiceFlatFeeLineCreate' + description: InvoiceLineCreate represents the create model for an invoice line. + InvoiceLineDiscount: type: object required: + - createdAt + - updatedAt - id - - key + - amount properties: + createdAt: + type: string + format: date-time + example: 2024-01-01T01:01:01.001Z + description: Timestamp of when the resource was created. + title: Creation Time + readOnly: true + updatedAt: + type: string + format: date-time + example: 2024-01-01T01:01:01.001Z + description: Timestamp of when the resource was last updated. + title: Last Update Time + readOnly: true + deletedAt: + type: string + format: date-time + example: 2024-01-01T01:01:01.001Z + description: Timestamp of when the resource was permanently deleted. + title: Deletion Time + readOnly: true id: type: string - example: 01ARZ3NDEKTSV4RRFFQ69G5FAV + example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ - description: Unique identifier of a feature. - title: Feature Unique Identifier - key: + description: ID of the charge or discount. + readOnly: true + percent: + allOf: + - $ref: '#/components/schemas/Percentage' + description: Percentage if fixed amount not applied + amount: + allOf: + - $ref: '#/components/schemas/Numeric' + description: Fixed discount amount to apply (calculated if percent present). + code: type: string - example: gpt4_tokens + description: Reason code. + description: + type: string + description: Text description as to why the discount was applied. + description: InvoiceLineDiscount represents an amount deducted from the line, and will be applied before taxes. + InvoiceLineReplaceUpdate: + anyOf: + - $ref: '#/components/schemas/InvoiceUsageBasedLineReplaceUpdate' + - $ref: '#/components/schemas/InvoiceFlatFeeLineReplaceUpdate' + discriminator: + propertyName: type + mapping: + usage_based: '#/components/schemas/InvoiceUsageBasedLineReplaceUpdate' + flat_fee: '#/components/schemas/InvoiceFlatFeeLineReplaceUpdate' + description: InvoiceLineReplaceUpdate represents the update model for an invoice line. + InvoiceLineStatus: + type: string + enum: + - valid + - detail + - split + description: Line status specifies the status of the line. + InvoiceLineTaxBehavior: + type: string + enum: + - inclusive + - exclusive + description: |- + InvoiceLineTaxBehavior details how the tax item is applied to the base amount. + + Inclusive means the tax is included in the base amount. + Exclusive means the tax is added to the base amount. + InvoiceLineTaxItem: + type: object + properties: + config: + allOf: + - $ref: '#/components/schemas/TaxConfig' + description: Tax provider configuration. + readOnly: true + percent: + allOf: + - $ref: '#/components/schemas/Percentage' description: |- - The key is an immutable unique identifier of the feature used throughout the API, - for example when interacting with a subject's entitlements. - title: Feature Key - description: Limited representation of a feature resource which includes only its unique identifiers (id, key). - FeatureOrderBy: + Percent defines the percentage set manually or determined from + the rate key (calculated if rate present). A nil percent implies that + this tax combo is **exempt** from tax.") + readOnly: true + surcharge: + allOf: + - $ref: '#/components/schemas/Numeric' + description: Some countries require an additional surcharge (calculated if rate present). + readOnly: true + behavior: + allOf: + - $ref: '#/components/schemas/InvoiceLineTaxBehavior' + description: Is the tax item inclusive or exclusive of the base amount. + readOnly: true + description: TaxConfig stores the configuration for a tax line relative to an invoice line. + InvoiceNumber: + type: string + example: INV-2024-01-01-01 + minLength: 1 + maxLength: 256 + description: |- + InvoiceNumber is a unique identifier for the invoice, generated by the + invoicing app. + + The uniqueness depends on a lot of factors: + - app setting (unique per app or unique per customer) + - multiple app scenarios (multiple apps generating invoices with the same prefix) + InvoiceOrderBy: type: string enum: - - id + - customer.name + - issuedAt + - status - createdAt - updatedAt - description: Order by options for features. - FeaturePaginatedResponse: + description: InvoiceOrderBy specifies the ordering options for invoice listing. + InvoicePaginatedResponse: type: object required: - totalCount @@ -12075,256 +11800,464 @@ components: items: type: array items: - $ref: '#/components/schemas/Feature' + $ref: '#/components/schemas/Invoice' description: The items in the current page. description: Paginated response - FlatPrice: + InvoicePaymentTerms: + type: object + properties: + terms: + allOf: + - $ref: '#/components/schemas/PaymentTerms' + description: The terms of payment for the invoice. + description: Payment contains details as to how the invoice should be paid. + InvoicePendingLinesActionInput: + type: object + properties: + includePendingLines: + type: array + items: + type: string + example: 01G65Z755AFWAKHE12NY0CQ9FH + pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + description: ULID (Universally Unique Lexicographically Sortable Identifier). + description: |- + The pending line items to include in the invoice, if not provided: + - all line items that have invoice_at < asOf will be included + - all usage based line items will be included up to asOf, new usage-based line items will be staged for the rest + of the billing cycle + asOf: + type: string + format: date-time + example: 2023-01-01T01:01:01.001Z + description: |- + The time as of which the invoice is created. + + If not provided, the current time is used. + description: |- + BillingInvoiceActionInput is the input for creating an invoice. + + Invoice creation is always based on already pending line items created by the billingCreateLineByCustomer + operation. Empty invoices are not allowed. + InvoiceReference: type: object required: - - type - - amount + - id properties: - type: + id: type: string - enum: - - flat - amount: + example: 01G65Z755AFWAKHE12NY0CQ9FH + pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + description: The ID of the invoice. + readOnly: true + number: allOf: - - $ref: '#/components/schemas/Numeric' - description: The amount of the flat price. - description: Flat price. - FlatPriceWithPaymentTerm: + - $ref: '#/components/schemas/InvoiceNumber' + description: The number of the invoice. + readOnly: true + description: Reference to an invoice. + InvoiceStatus: + type: string + enum: + - gathering + - draft + - issuing + - issued + description: InvoiceStatus describes the status of an invoice. + InvoiceStatusDetails: type: object required: - - type - - amount + - immutable + - failed + - extendedStatus + - availableActions properties: - type: + immutable: + type: boolean + description: Is the invoice editable? + readOnly: true + failed: + type: boolean + description: Is the invoice in a failed state? + readOnly: true + extendedStatus: type: string - enum: - - flat + description: Extended status information for the invoice. + readOnly: true + availableActions: + type: array + items: + $ref: '#/components/schemas/InvoiceAction' + description: The actions that can be performed on the invoice. + description: |- + InvoiceStatusDetails represents the details of the invoice status. + + API users are encouraged to rely on the immutable/failed/avaliableActions fields to determine + the next steps of the invoice instead of the extendedStatus field. + InvoiceTotals: + type: object + required: + - amount + - chargesTotal + - discountsTotal + - taxesInclusiveTotal + - taxesExclusiveTotal + - taxesTotal + - total + properties: amount: allOf: - $ref: '#/components/schemas/Numeric' - description: The amount of the flat price. - paymentTerm: + description: The total value of the line before taxes, discounts and commitments. + readOnly: true + chargesTotal: allOf: - - $ref: '#/components/schemas/PricePaymentTerm' - description: |- - The payment term of the flat price. - Defaults to in advance. - default: in_advance - description: Flat price with payment term. - ForbiddenProblemResponse: - type: object - allOf: - - $ref: '#/components/schemas/UnexpectedProblemResponse' - description: The server understood the request but refuses to authorize it. - GatewayTimeoutProblemResponse: - type: object - allOf: - - $ref: '#/components/schemas/UnexpectedProblemResponse' - description: The server, while acting as a gateway or proxy, did not receive a timely response from an upstream server it needed to access in order to complete the request. - GrantBurnDownHistorySegment: + - $ref: '#/components/schemas/Numeric' + description: The amount of value of the line that are due to additional charges. + readOnly: true + discountsTotal: + allOf: + - $ref: '#/components/schemas/Numeric' + description: The amount of value of the line that are due to discounts. + readOnly: true + taxesInclusiveTotal: + allOf: + - $ref: '#/components/schemas/Numeric' + description: The total amount of taxes that are included in the line. + readOnly: true + taxesExclusiveTotal: + allOf: + - $ref: '#/components/schemas/Numeric' + description: The total amount of taxes that are added on top of amount from the line. + readOnly: true + taxesTotal: + allOf: + - $ref: '#/components/schemas/Numeric' + description: The total amount of taxes for this line. + readOnly: true + total: + allOf: + - $ref: '#/components/schemas/Numeric' + description: The total amount value of the line after taxes, discounts and commitments. + readOnly: true + description: Totals contains the summaries of all calculations for the invoice. + InvoiceType: + type: string + enum: + - standard + - credit_note + description: |- + InvoiceType represents the type of invoice. + + The type of invoice determines the purpose of the invoice and how it should be handled. + InvoiceUsageBasedLine: type: object required: + - name + - createdAt + - updatedAt + - id + - status + - currency + - totals - period - - usage - - overage - - balanceAtStart - - grantBalancesAtStart - - balanceAtEnd - - grantBalancesAtEnd - - grantUsages + - invoiceAt + - type + - price + - featureKey properties: - period: + name: + type: string + minLength: 1 + maxLength: 256 + description: Human-readable name for the resource. Between 1 and 256 characters. + title: Display name + description: + type: string + maxLength: 1024 + description: Optional description of the resource. Maximum 1024 characters. + title: Description + metadata: + type: object allOf: - - $ref: '#/components/schemas/Period' - description: The period of the segment. - usage: - type: number - format: double - example: 100 - description: The total usage of the grant in the period. + - $ref: '#/components/schemas/Metadata' + nullable: true + description: Additional metadata for the resource. + title: Metadata + createdAt: + type: string + format: date-time + example: 2024-01-01T01:01:01.001Z + description: Timestamp of when the resource was created. + title: Creation Time readOnly: true - overage: - type: number - format: double - example: 100 - description: Overuse that wasn't covered by grants. + updatedAt: + type: string + format: date-time + example: 2024-01-01T01:01:01.001Z + description: Timestamp of when the resource was last updated. + title: Last Update Time readOnly: true - balanceAtStart: - type: number - format: double - example: 100 - description: entitlement balance at the start of the period. + deletedAt: + type: string + format: date-time + example: 2024-01-01T01:01:01.001Z + description: Timestamp of when the resource was permanently deleted. + title: Deletion Time readOnly: true - grantBalancesAtStart: - type: object - additionalProperties: - type: number - format: double - example: - 01G65Z755AFWAKHE12NY0CQ9FH: 100 - description: 'The balance breakdown of each active grant at the start of the period: GrantID: Balance' + id: + type: string + example: 01G65Z755AFWAKHE12NY0CQ9FH + pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + description: ULID (Universally Unique Lexicographically Sortable Identifier). + status: + allOf: + - $ref: '#/components/schemas/InvoiceLineStatus' + description: |- + Status of the line. + + External calls always create valid lines, other line types are managed by the + billing engine of OpenMeter. readOnly: true - balanceAtEnd: - type: number - format: double - example: 100 - description: The entitlement balance at the end of the period. + discounts: + type: array + items: + $ref: '#/components/schemas/InvoiceLineDiscount' + description: |- + Discounts detailes applied to this line. + + New discounts can be added via the invoice's discounts API, to facilitate + discounts that are affecting multiple lines. readOnly: true - grantBalancesAtEnd: - type: object - additionalProperties: - type: number - format: double - example: - 01G65Z755AFWAKHE12NY0CQ9FH: 100 - description: 'The balance breakdown of each active grant at the end of the period: GrantID: Balance' + charges: + type: array + items: + $ref: '#/components/schemas/BillingLineCharge' + description: |- + Charges applied to this line. (like minimum spend) + + New charges can be added via the invoice's charges API, to facilitate + charges that are affecting multiple lines. readOnly: true - grantUsages: + invoice: + allOf: + - $ref: '#/components/schemas/InvoiceReference' + description: The invoice this item belongs to. + currency: + allOf: + - $ref: '#/components/schemas/CurrencyCode' + description: The currency of this line. + taxes: type: array items: - $ref: '#/components/schemas/GrantUsageRecord' - description: Which grants were actually burnt down in the period and by what amount. + $ref: '#/components/schemas/InvoiceLineTaxItem' + description: Taxes applied to the invoice totals. + readOnly: true + taxConfig: + allOf: + - $ref: '#/components/schemas/TaxConfig' + description: Tax config specify the tax configuration for this line. + children: + description: The lines detailing the item or service sold. readOnly: true - description: |- - A segment of the grant burn down history. - - A given segment represents the usage of a grant between events that changed either the grant burn down priority order or the usag period. - GrantOrderBy: - type: string - enum: - - id - - createdAt - - updatedAt - description: Order by options for grants. - GrantPaginatedResponse: - type: object - required: - - totalCount - - page - - pageSize - - items - properties: - totalCount: - type: integer - example: 500 - description: The items in the current page. - page: - type: integer - example: 1 - description: The items in the current page. - pageSize: - type: integer - example: 100 - description: The items in the current page. - items: type: array items: - $ref: '#/components/schemas/EntitlementGrant' - description: The items in the current page. - description: Paginated response - GrantUsageRecord: + $ref: '#/components/schemas/InvoiceLine' + totals: + allOf: + - $ref: '#/components/schemas/InvoiceTotals' + description: Totals for this line. + readOnly: true + period: + allOf: + - $ref: '#/components/schemas/Period' + description: |- + Period of the line item applies to for revenue recognition pruposes. + + Billing always treats periods as start being inclusive and end being exclusive. + invoiceAt: + type: string + format: date-time + example: 2023-01-01T01:01:01.001Z + description: The time this line item should be invoiced. + type: + type: string + enum: + - usage_based + price: + $ref: '#/components/schemas/RateCardUsageBasedPrice' + featureKey: + type: string + minLength: 1 + maxLength: 64 + pattern: ^[a-z0-9]+(?:_[a-z0-9]+)*$ + description: The feature that the usage is based on. + quantity: + allOf: + - $ref: '#/components/schemas/Numeric' + description: The quantity of the item being sold. + readOnly: true + preLinePeriodQuantity: + allOf: + - $ref: '#/components/schemas/Numeric' + description: |- + The quantity of the item used in before this line's period. + + It is non-zero in case of progressive billing, when this shows how much of the usage was already billed. + readOnly: true + description: InvoiceUsageBasedLine represents a line item that is sold to the customer based on usage. + InvoiceUsageBasedLineCreate: type: object required: - - grantId - - usage + - name + - currency + - period + - invoiceAt + - type + - price + - featureKey properties: - grantId: + name: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH - pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ - description: The id of the grant - usage: - type: number - format: double - example: 100 - description: The usage in the period - description: Usage Record - IngestEventsBody: - anyOf: - - $ref: '#/components/schemas/Event' - - type: array - items: - $ref: '#/components/schemas/Event' - description: |- - The body of the events request. - Either a single event or a batch of events. - IngestedEvent: + minLength: 1 + maxLength: 256 + description: Human-readable name for the resource. Between 1 and 256 characters. + title: Display name + description: + type: string + maxLength: 1024 + description: Optional description of the resource. Maximum 1024 characters. + title: Description + metadata: + type: object + allOf: + - $ref: '#/components/schemas/Metadata' + nullable: true + description: Additional metadata for the resource. + title: Metadata + invoice: + allOf: + - $ref: '#/components/schemas/InvoiceReference' + description: The invoice this item belongs to. + currency: + allOf: + - $ref: '#/components/schemas/CurrencyCode' + description: The currency of this line. + taxConfig: + allOf: + - $ref: '#/components/schemas/TaxConfig' + description: Tax config specify the tax configuration for this line. + period: + allOf: + - $ref: '#/components/schemas/Period' + description: |- + Period of the line item applies to for revenue recognition pruposes. + + Billing always treats periods as start being inclusive and end being exclusive. + invoiceAt: + type: string + format: date-time + example: 2023-01-01T01:01:01.001Z + description: The time this line item should be invoiced. + type: + type: string + enum: + - usage_based + price: + $ref: '#/components/schemas/RateCardUsageBasedPrice' + featureKey: + type: string + minLength: 1 + maxLength: 64 + pattern: ^[a-z0-9]+(?:_[a-z0-9]+)*$ + description: The feature that the usage is based on. + description: Resource create operation model. + InvoiceUsageBasedLineReplaceUpdate: type: object required: - - event - - ingestedAt - - storedAt + - name + - period + - invoiceAt + - type + - price properties: - event: - $ref: '#/components/schemas/Event' - validationError: + name: type: string - description: The validation error if the event failed validation. - ingestedAt: + minLength: 1 + maxLength: 256 + description: Human-readable name for the resource. Between 1 and 256 characters. + title: Display name + description: type: string - format: date-time - example: 2023-01-01T01:01:01.001Z - description: The date and time the event was ingested. - storedAt: + maxLength: 1024 + description: Optional description of the resource. Maximum 1024 characters. + title: Description + metadata: + type: object + allOf: + - $ref: '#/components/schemas/Metadata' + nullable: true + description: Additional metadata for the resource. + title: Metadata + taxConfig: + allOf: + - $ref: '#/components/schemas/TaxConfig' + description: Tax config specify the tax configuration for this line. + period: + allOf: + - $ref: '#/components/schemas/Period' + description: |- + Period of the line item applies to for revenue recognition pruposes. + + Billing always treats periods as start being inclusive and end being exclusive. + invoiceAt: type: string format: date-time example: 2023-01-01T01:01:01.001Z - description: The date and time the event was stored. - example: - event: - id: 5c10fade-1c9e-4d6c-8275-c52c36731d3c - source: service-name - specversion: '1.0' - type: prompt - subject: customer-id - time: 2023-01-01T01:01:01.001Z - ingestedAt: 2023-01-01T01:01:01.001Z - storedAt: 2023-01-01T01:01:02.001Z - description: An ingested event with optional validation error. - InternalServerErrorProblemResponse: - type: object - allOf: - - $ref: '#/components/schemas/UnexpectedProblemResponse' - description: The server encountered an unexpected condition that prevented it from fulfilling the request. - InvoicePaginatedResponse: + description: The time this line item should be invoiced. + type: + type: string + enum: + - usage_based + price: + $ref: '#/components/schemas/RateCardUsageBasedPrice' + description: Resource update operation model. + InvoiceWorkflowSettings: type: object required: - - totalCount - - page - - pageSize - - items - properties: - totalCount: - type: integer - example: 500 - description: The items in the current page. - page: - type: integer - example: 1 - description: The items in the current page. - pageSize: - type: integer - example: 100 - description: The items in the current page. - items: - type: array - items: - $ref: '#/components/schemas/BillingInvoice' - description: The items in the current page. - description: Paginated response - LinesUpdate: - type: object + - sourceBillingProfileID + - workflow + - timezone properties: - lines: - type: array - items: - $ref: '#/components/schemas/BillingInvoiceLineCreateItem' - title: The line to create - description: Resource create or update operation model. + apps: + allOf: + - $ref: '#/components/schemas/BillingProfileAppsOrReference' + description: The apps that will be used to orchestrate the invoice's workflow. + readOnly: true + sourceBillingProfileID: + type: string + example: 01G65Z755AFWAKHE12NY0CQ9FH + pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + description: |- + sourceBillingProfileID is the billing profile on which the workflow was based on. + + The profile is snapshotted on invoice creation, after which it can be altered independently + of the profile itself. + readOnly: true + workflow: + allOf: + - $ref: '#/components/schemas/BillingWorkflowSettings' + description: The workflow details used by this invoice. + readOnly: true + timezone: + type: string + description: Timezone of the invoice's date fields. + readOnly: true + description: |- + InvoiceWorkflowSettings represents the workflow settings used by the invoice. + + This is a clone of the billing profile's workflow settings at the time of invoice creation + with customer overrides considered. ListEntitlementsResult: oneOf: - type: array @@ -13317,6 +13250,89 @@ components: - server_error - temporarily_unavailable description: OAuth2 authorization code grant error types. + PaymentDueDate: + type: object + required: + - dueAt + - amount + properties: + dueAt: + type: string + format: date-time + example: 2023-01-01T01:01:01.001Z + description: When the payment is due. + readOnly: true + notes: + type: string + description: Other details to take into account for the due date. + readOnly: true + amount: + allOf: + - $ref: '#/components/schemas/Numeric' + description: How much needs to be paid by the date. + readOnly: true + percent: + allOf: + - $ref: '#/components/schemas/Percentage' + description: Percentage of the total that should be paid by the date. + readOnly: true + currency: + allOf: + - $ref: '#/components/schemas/CurrencyCode' + description: If different from the parent document's base currency. + readOnly: true + description: PaymentDueDate contains an amount that should be paid by the given date. + PaymentTermDueDate: + type: object + required: + - type + - dueAt + properties: + type: + type: string + enum: + - due_date + description: Type of terms to be applied. + detail: + type: string + description: Text detail of the chosen payment terms. + readOnly: true + notes: + type: string + description: Description of the conditions for payment. + readOnly: true + dueAt: + type: array + items: + $ref: '#/components/schemas/PaymentDueDate' + minItems: 1 + description: When the payment is due. + readOnly: true + description: PaymentTermDueDate defines the terms for payment on a specific date. + PaymentTermInstant: + type: object + required: + - type + properties: + type: + type: string + enum: + - instant + description: Type of terms to be applied. + detail: + type: string + description: Text detail of the chosen payment terms. + readOnly: true + notes: + type: string + description: Description of the conditions for payment. + readOnly: true + description: PaymentTermInstant defines the terms for payment on receipt of invoice. + PaymentTerms: + anyOf: + - $ref: '#/components/schemas/PaymentTermInstant' + - $ref: '#/components/schemas/PaymentTermDueDate' + description: PaymentTerms defines the terms for payment. Percentage: type: string pattern: ^\-?[0-9]+(\.[0-9]+)?%$ @@ -13732,6 +13748,21 @@ components: type: integer description: The plan version. description: References an exact plan. + PlanReferenceInput: + type: object + required: + - key + properties: + key: + type: string + minLength: 1 + maxLength: 64 + pattern: ^[a-z0-9]+(?:_[a-z0-9]+)*$ + description: The plan key. + version: + type: integer + description: The plan version. + description: References an exact plan defaulting to the current active version. PlanReplaceUpdate: type: object required: @@ -13778,90 +13809,44 @@ components: type: object required: - plan - - currency - activeFrom - - customizations + - name properties: + metadata: + $ref: '#/components/schemas/Metadata' plan: - type: object - properties: - key: - type: string - minLength: 1 - maxLength: 64 - pattern: ^[a-z0-9]+(?:_[a-z0-9]+)*$ - description: A key is a unique string that is used to identify a resource. - version: - type: integer - required: - - key - - version - currency: - $ref: '#/components/schemas/CurrencyCode' + $ref: '#/components/schemas/PlanReferenceInput' activeFrom: type: string format: date-time example: 2023-01-01T01:01:01.001Z description: '[RFC3339](https://tools.ietf.org/html/rfc3339) formatted date-time string in UTC.' - customizations: - type: array - items: - anyOf: - - $ref: '#/components/schemas/SubscriptionEditAddItem' - - $ref: '#/components/schemas/SubscriptionEditRemoveItem' - maxItems: 100 - description: |- - Batch processing commands for customizing the susbcription. - The key format is `/phases/{phaseKey}/items/{itemKey}`. - - Add operations insert a new member based on the creation input without altering the existing members. - - Remove operations remove the member from the document. + name: + type: string + description: + type: string description: Change subscription based on plan. PlanSubscriptionCreate: type: object required: - plan - - currency - activeFrom - - customizations + - name - customerId properties: - plan: - type: object - properties: - key: - type: string - minLength: 1 - maxLength: 64 - pattern: ^[a-z0-9]+(?:_[a-z0-9]+)*$ - description: A key is a unique string that is used to identify a resource. - version: - type: integer - required: - - key - - version - currency: - $ref: '#/components/schemas/CurrencyCode' + metadata: + $ref: '#/components/schemas/Metadata' + plan: + $ref: '#/components/schemas/PlanReferenceInput' activeFrom: type: string format: date-time example: 2023-01-01T01:01:01.001Z description: '[RFC3339](https://tools.ietf.org/html/rfc3339) formatted date-time string in UTC.' - customizations: - type: array - items: - anyOf: - - $ref: '#/components/schemas/SubscriptionEditAddItem' - - $ref: '#/components/schemas/SubscriptionEditRemoveItem' - maxItems: 100 - description: |- - Batch processing commands for customizing the susbcription. - The key format is `/phases/{phaseKey}/items/{itemKey}`. - - Add operations insert a new member based on the creation input without altering the existing members. - - Remove operations remove the member from the document. + name: + type: string + description: + type: string customerId: type: string example: 01G65Z755AFWAKHE12NY0CQ9FH @@ -13959,32 +13944,6 @@ components: description: |- A price tier. At least one price component is required in each tier. - ProfilePaginatedResponse: - type: object - required: - - totalCount - - page - - pageSize - - items - properties: - totalCount: - type: integer - example: 500 - description: The items in the current page. - page: - type: integer - example: 1 - description: The items in the current page. - pageSize: - type: integer - example: 100 - description: The items in the current page. - items: - type: array - items: - $ref: '#/components/schemas/BillingProfile' - description: The items in the current page. - description: Paginated response RateCard: oneOf: - $ref: '#/components/schemas/RateCardFlatFee' @@ -14098,73 +14057,6 @@ components: When null, the feature or service is free. title: Price description: A flat fee rate card defines a one-time purchase or a recurring fee. - RateCardFlatFeeUpdateItem: - type: object - required: - - type - - name - - billingCadence - - price - properties: - type: - type: string - enum: - - flat_fee - description: The type of the RateCard. - title: RateCard type - name: - type: string - minLength: 1 - maxLength: 256 - description: Human-readable name for the resource. Between 1 and 256 characters. - title: Display name - description: - type: string - maxLength: 1024 - description: Optional description of the resource. Maximum 1024 characters. - title: Description - metadata: - type: object - allOf: - - $ref: '#/components/schemas/Metadata' - nullable: true - description: Additional metadata for the resource. - title: Metadata - featureKey: - type: string - minLength: 1 - maxLength: 64 - pattern: ^[a-z0-9]+(?:_[a-z0-9]+)*$ - description: The feature the customer is entitled to use. - title: Feature key - entitlementTemplate: - $ref: '#/components/schemas/RateCardEntitlement' - taxConfig: - allOf: - - $ref: '#/components/schemas/TaxConfig' - description: |- - The tax config of the rate card. - When undefined, the tax config of the feature or the default tax config of the plan is used. - title: Tax config - billingCadence: - type: string - format: duration - nullable: true - description: |- - The billing cadence of the rate card. - When null it means it is a one time fee. - title: Billing cadence - price: - type: object - allOf: - - $ref: '#/components/schemas/FlatPriceWithPaymentTerm' - nullable: true - example: {} - description: |- - The price of the rate card. - When null, the feature or service is free. - title: Price - description: A flat fee rate card defines a one-time purchase or a recurring fee. RateCardMeteredEntitlement: type: object required: @@ -14234,16 +14126,6 @@ components: example: '{ "integrations": ["github"] }' description: The JSON parsable config of the entitlement. This value is also returned when checking entitlement access and it is useful for configuring fine-grained access settings to the feature, implemented in your own system. Has to be an object. description: Entitlement template of a static entitlement. - RateCardUpdateItem: - oneOf: - - $ref: '#/components/schemas/RateCardFlatFeeUpdateItem' - - $ref: '#/components/schemas/RateCardUsageBasedUpdateItem' - discriminator: - propertyName: type - mapping: - flat_fee: '#/components/schemas/RateCardFlatFeeUpdateItem' - usage_based: '#/components/schemas/RateCardUsageBasedUpdateItem' - description: A rate card defines the pricing and entitlement of a feature or service. RateCardUsageBased: type: object required: @@ -14322,64 +14204,6 @@ components: unit: '#/components/schemas/UnitPriceWithCommitments' tiered: '#/components/schemas/TieredPriceWithCommitments' description: The price of the usage based rate card. - RateCardUsageBasedUpdateItem: - type: object - required: - - type - - name - - billingCadence - - price - properties: - type: - type: string - enum: - - usage_based - description: The type of the RateCard. - title: RateCard type - name: - type: string - minLength: 1 - maxLength: 256 - description: Human-readable name for the resource. Between 1 and 256 characters. - title: Display name - description: - type: string - maxLength: 1024 - description: Optional description of the resource. Maximum 1024 characters. - title: Description - metadata: - type: object - allOf: - - $ref: '#/components/schemas/Metadata' - nullable: true - description: Additional metadata for the resource. - title: Metadata - featureKey: - type: string - minLength: 1 - maxLength: 64 - pattern: ^[a-z0-9]+(?:_[a-z0-9]+)*$ - description: The feature the customer is entitled to use. - title: Feature key - entitlementTemplate: - $ref: '#/components/schemas/RateCardEntitlement' - taxConfig: - allOf: - - $ref: '#/components/schemas/TaxConfig' - description: |- - The tax config of the rate card. - When undefined, the tax config of the feature or the default tax config of the plan is used. - title: Tax config - billingCadence: - type: string - format: duration - description: The billing cadence of the rate card. - title: Billing cadence - price: - allOf: - - $ref: '#/components/schemas/RateCardUsageBasedPrice' - nullable: true - description: A usage-based rate card defines a price based on usage. RecurringPeriod: type: object required: @@ -14434,8 +14258,8 @@ components: RemovePhaseShifting: type: string enum: - - Next - - Prev + - next + - prev description: The direction of the phase shift when a phase is removed. ResetEntitlementUsageInput: type: object @@ -14928,6 +14752,7 @@ components: - name - createdAt - updatedAt + - activeFrom - customerId - plan - currency @@ -14978,6 +14803,16 @@ components: description: Timestamp of when the resource was permanently deleted. title: Deletion Time readOnly: true + activeFrom: + type: string + format: date-time + example: 2023-01-01T01:01:01.001Z + description: The cadence start of the resource. + activeTo: + type: string + format: date-time + example: 2023-01-01T01:01:01.001Z + description: The cadence end of the resource. customerId: type: string example: 01G65Z755AFWAKHE12NY0CQ9FH @@ -14990,152 +14825,51 @@ components: currency: allOf: - $ref: '#/components/schemas/CurrencyCode' - description: |- - The currency code of the subscription. - Will be revised once we add multi currency support. - title: Currency - default: USD - activeTo: - type: string - format: date-time - example: 2023-01-01T01:01:01.001Z - description: If the subscription is canceled or otherwise have to end activeTo denotes the end date. - description: Subscription is an exact subscription instance. - SubscriptionChange: - oneOf: - - $ref: '#/components/schemas/PlanSubscriptionChange' - - $ref: '#/components/schemas/CustomSubscriptionChange' - description: Change a subscription. - SubscriptionCreate: - oneOf: - - $ref: '#/components/schemas/PlanSubscriptionCreate' - - $ref: '#/components/schemas/CreateCustomSubscriptionRequestBody' - description: Create a subscription. - SubscriptionEditAdd: - type: object - required: - - op - - path - - value - properties: - op: - type: string - enum: - - add - path: - type: string - pattern: ^\/phases\/[a-zA-Z0-9\-]+$ - value: - $ref: '#/components/schemas/SubscriptionPhaseCreate' - description: Subscription item add operation. - SubscriptionEditAddItem: - type: object - required: - - op - - path - - value - properties: - op: - type: string - enum: - - add - path: - type: string - pattern: ^\/phases\/[a-zA-Z0-9\-]+\/items\/[a-zA-Z0-9\-]+$ - value: - $ref: '#/components/schemas/RateCard' - description: Subscription item add operation. - SubscriptionEditAddUpdateItem: - type: object - required: - - op - - path - - value - properties: - op: - type: string - enum: - - add - path: - type: string - pattern: ^\/phases\/[a-zA-Z0-9\-]+\/items\/[a-zA-Z0-9\-]+$ - value: - $ref: '#/components/schemas/RateCardUpdateItem' - description: Subscription item add operation. - SubscriptionEditRemoveItem: - type: object - required: - - op - - path - properties: - op: - type: string - enum: - - remove - path: - type: string - pattern: ^\/phases\/[a-zA-Z0-9\-]+\/items\/[a-zA-Z0-9\-]+$ - description: Subscription phase remove operation. - SubscriptionEditRemoveUpdateItem: - type: object - required: - - op - - path - properties: - op: - type: string - enum: - - remove - path: - type: string - pattern: ^\/phases\/[a-zA-Z0-9\-]+\/items\/[a-zA-Z0-9\-]+$ - description: Subscription phase remove operation. - SubscriptionEditRemoveWithValue: - type: object - required: - - op - - path - - value - properties: - op: - type: string - enum: - - remove - path: - type: string - pattern: ^\/phases\/[a-zA-Z0-9\-]+$ - value: - type: object - properties: - shift: - $ref: '#/components/schemas/RemovePhaseShifting' - required: - - shift - description: Subscription item remove operation with a value. - SubscriptionEditStretch: + description: |- + The currency code of the subscription. + Will be revised once we add multi currency support. + title: Currency + default: USD + description: Subscription is an exact subscription instance. + SubscriptionChange: + oneOf: + - $ref: '#/components/schemas/PlanSubscriptionChange' + - $ref: '#/components/schemas/CustomSubscriptionChange' + description: Change a subscription. + SubscriptionCreate: + oneOf: + - $ref: '#/components/schemas/PlanSubscriptionCreate' + - $ref: '#/components/schemas/CustomSubscriptionCreate' + description: Create a subscription. + SubscriptionEdit: type: object required: - - op - - path - - value + - customizations properties: - op: - type: string - enum: - - extend - path: - type: string - pattern: ^\/phases\/[a-zA-Z0-9\-]+$ - value: - type: object - properties: - extendBy: - type: string - format: duration - description: The signed duration to extend or shrink the phase by. - required: - - extendBy - description: Subscription phase stretch operation. + customizations: + type: array + items: + $ref: '#/components/schemas/SubscriptionEditOperation' + maxItems: 100 + description: |- + Batch processing commands for manipulating running subscriptions. + The key format is `/phases/{phaseKey}` or `/phases/{phaseKey}/items/{itemKey}`. + description: Subscription edit input. + SubscriptionEditOperation: + oneOf: + - $ref: '#/components/schemas/EditSubscriptionAddItem' + - $ref: '#/components/schemas/EditSubscriptionRemoveItem' + - $ref: '#/components/schemas/EditSubscriptionAddPhase' + - $ref: '#/components/schemas/EditSubscriptionRemovePhase' + - $ref: '#/components/schemas/EditSubscriptionStretchPhase' + discriminator: + propertyName: op + mapping: + add_item: '#/components/schemas/EditSubscriptionAddItem' + remove_item: '#/components/schemas/EditSubscriptionRemoveItem' + add_phase: '#/components/schemas/EditSubscriptionAddPhase' + remove_phase: '#/components/schemas/EditSubscriptionRemovePhase' + stretch_phase: '#/components/schemas/EditSubscriptionStretchPhase' SubscriptionExpanded: type: object required: @@ -15143,6 +14877,7 @@ components: - name - createdAt - updatedAt + - activeFrom - customerId - plan - currency @@ -15194,6 +14929,16 @@ components: description: Timestamp of when the resource was permanently deleted. title: Deletion Time readOnly: true + activeFrom: + type: string + format: date-time + example: 2023-01-01T01:01:01.001Z + description: The cadence start of the resource. + activeTo: + type: string + format: date-time + example: 2023-01-01T01:01:01.001Z + description: The cadence end of the resource. customerId: type: string example: 01G65Z755AFWAKHE12NY0CQ9FH @@ -15211,11 +14956,6 @@ components: Will be revised once we add multi currency support. title: Currency default: USD - activeTo: - type: string - format: date-time - example: 2023-01-01T01:01:01.001Z - description: If the subscription is canceled or otherwise have to end activeTo denotes the end date. phases: type: array items: @@ -15228,6 +14968,7 @@ components: - name - createdAt - updatedAt + - activeFrom - key - billingCandence - price @@ -15278,6 +15019,16 @@ components: description: Timestamp of when the resource was permanently deleted. title: Deletion Time readOnly: true + activeFrom: + type: string + format: date-time + example: 2023-01-01T01:01:01.001Z + description: The cadence start of the resource. + activeTo: + type: string + format: date-time + example: 2023-01-01T01:01:01.001Z + description: The cadence end of the resource. key: type: string minLength: 1 @@ -15316,26 +15067,14 @@ components: allOf: - $ref: '#/components/schemas/TieredPriceWithCommitments' nullable: true - - type: object - allOf: - - $ref: '#/components/schemas/FlatPriceWithPaymentTerm' - nullable: true example: {} description: |- The price of the rate card. When null, the feature or service is free. title: Price included: - type: object - properties: - feature: - allOf: - - $ref: '#/components/schemas/Feature' - description: The feature the customer is entitled to use. - entitlement: - $ref: '#/components/schemas/Entitlement' - required: - - feature + allOf: + - $ref: '#/components/schemas/SubscriptionItemIncluded' description: Describes what access is gained via the SubscriptionItem taxConfig: allOf: @@ -15345,11 +15084,24 @@ components: When undefined, the tax config of the feature or the default tax config of the plan is used. title: Tax config description: The actual contents of the Subscription, what the user gets, what they pay, etc... + SubscriptionItemIncluded: + type: object + required: + - feature + properties: + feature: + allOf: + - $ref: '#/components/schemas/Feature' + description: The feature the customer is entitled to use. + entitlement: + $ref: '#/components/schemas/Entitlement' + description: Included contents like Entitlement, or the Feature. SubscriptionPhaseCreate: type: object required: - startAfter - - duration + - key + - name properties: startAfter: type: string @@ -15364,14 +15116,28 @@ components: type: string format: duration example: P1M - description: The intended duration of the new phase. + description: |- + The intended duration of the new phase. + Duration is required when the phase will not be the last phase. title: Duration discounts: type: array items: - $ref: '#/components/schemas/DiscountUpdateItem' + $ref: '#/components/schemas/Discount' description: The discounts on the plan. title: Discounts + key: + type: string + minLength: 1 + maxLength: 64 + pattern: ^[a-z0-9]+(?:_[a-z0-9]+)*$ + description: A locally unique identifier for the phase. + name: + type: string + description: The name of the phase. + description: + type: string + description: The description of the phase. description: Subscription phase create input. SubscriptionPhaseExpanded: type: object @@ -15381,7 +15147,6 @@ components: - createdAt - updatedAt - key - - duration - activeFrom - items properties: @@ -15437,12 +15202,6 @@ components: maxLength: 64 pattern: ^[a-z0-9]+(?:_[a-z0-9]+)*$ description: A locally unique identifier for the resource. - duration: - type: string - format: duration - example: P1M - description: The intended duration of the new phase. - title: Duration discounts: type: array items: @@ -15454,6 +15213,11 @@ components: format: date-time example: 2023-01-01T01:01:01.001Z description: The time from which the phase is active. + activeTo: + type: string + format: date-time + example: 2023-01-01T01:01:01.001Z + description: The until which the Phase is active. items: type: array items: @@ -15627,6 +15391,213 @@ components: description: The customer is limited to spend at most the amount. title: Maximum amount description: Unit price with spend commitments. + ValidationIssue: + type: object + required: + - createdAt + - updatedAt + - id + - severity + - component + - message + properties: + createdAt: + type: string + format: date-time + example: 2024-01-01T01:01:01.001Z + description: Timestamp of when the resource was created. + title: Creation Time + readOnly: true + updatedAt: + type: string + format: date-time + example: 2024-01-01T01:01:01.001Z + description: Timestamp of when the resource was last updated. + title: Last Update Time + readOnly: true + deletedAt: + type: string + format: date-time + example: 2024-01-01T01:01:01.001Z + description: Timestamp of when the resource was permanently deleted. + title: Deletion Time + readOnly: true + id: + type: string + example: 01G65Z755AFWAKHE12NY0CQ9FH + pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + description: ID of the charge or discount. + readOnly: true + severity: + allOf: + - $ref: '#/components/schemas/ValidationIssueSeverity' + description: The severity of the issue. + readOnly: true + field: + type: string + description: The field that the issue is related to, if available in JSON path format. + readOnly: true + code: + type: string + description: Machine indentifiable code for the issue, if available. + readOnly: true + component: + type: string + description: Component reporting the issue. + readOnly: true + message: + type: string + description: A human-readable description of the issue. + readOnly: true + metadata: + allOf: + - $ref: '#/components/schemas/Metadata' + description: Additional context for the issue. + readOnly: true + description: |- + ValidationIssue captures any validation issues related to the invoice. + + Issues with severity "critical" will prevent the invoice from being issued. + ValidationIssueSeverity: + type: string + enum: + - critical + - warning + description: |- + ValidationIssueSeverity describes the severity of a validation issue. + + Issues with severity "critical" will prevent the invoice from being issued. + VoidInvoiceActionCreate: + type: object + required: + - percentage + - action + properties: + percentage: + allOf: + - $ref: '#/components/schemas/Percentage' + description: How much of the total line items to be voided? (e.g. 100% means all charges are voided) + action: + $ref: '#/components/schemas/VoidInvoiceLineActionCreate' + description: InvoiceVoidAction describes how to handle the voided line items. + VoidInvoiceActionCreateItem: + type: object + required: + - percentage + - action + properties: + percentage: + allOf: + - $ref: '#/components/schemas/Percentage' + description: How much of the total line items to be voided? (e.g. 100% means all charges are voided) + action: + $ref: '#/components/schemas/VoidInvoiceLineActionCreateItem' + description: InvoiceVoidAction describes how to handle the voided line items. + VoidInvoiceActionInput: + type: object + required: + - action + - reason + properties: + action: + allOf: + - $ref: '#/components/schemas/VoidInvoiceActionCreate' + description: The action to take on the voided line items. + reason: + type: string + description: The reason for voiding the invoice. + overrides: + type: array + items: + $ref: '#/components/schemas/VoidInvoiceActionLineOverride' + nullable: true + description: |- + Per line item overrides for the action. + + If not specified, the `action` will be applied to all line items. + description: Request to void an invoice + VoidInvoiceActionLineOverride: + type: object + required: + - lineId + - action + properties: + lineId: + type: string + example: 01G65Z755AFWAKHE12NY0CQ9FH + pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + description: The line item ID to override. + action: + allOf: + - $ref: '#/components/schemas/VoidInvoiceActionCreateItem' + description: The action to take on the line item. + description: VoidInvoiceLineOverride describes how to handle a specific line item in the invoice when voiding. + VoidInvoiceLineActionCreate: + anyOf: + - $ref: '#/components/schemas/VoidInvoiceLineDiscardAction' + - $ref: '#/components/schemas/VoidInvoiceLinePendingActionCreate' + discriminator: + propertyName: type + mapping: + discard: '#/components/schemas/VoidInvoiceLineDiscardAction' + pending: '#/components/schemas/VoidInvoiceLinePendingActionCreate' + description: VoidInvoiceLineAction describes how to handle a specific line item in the invoice when voiding. + VoidInvoiceLineActionCreateItem: + anyOf: + - $ref: '#/components/schemas/VoidInvoiceLineDiscardAction' + - $ref: '#/components/schemas/VoidInvoiceLinePendingActionCreateItem' + discriminator: + propertyName: type + mapping: + discard: '#/components/schemas/VoidInvoiceLineDiscardAction' + pending: '#/components/schemas/VoidInvoiceLinePendingActionCreateItem' + description: VoidInvoiceLineAction describes how to handle a specific line item in the invoice when voiding. + VoidInvoiceLineDiscardAction: + type: object + required: + - type + properties: + type: + type: string + enum: + - discard + description: VoidInvoiceLineDiscardAction describes how to handle the voidied line item in the invoice. + VoidInvoiceLinePendingActionCreate: + type: object + required: + - type + properties: + type: + type: string + enum: + - pending + nextInvoiceAt: + type: string + format: date-time + example: 2023-01-01T01:01:01.001Z + description: |- + The time at which the line item should be invoiced again. + + If not provided, the line item will be re-invoiced now. + description: VoidInvoiceLinePendingAction describes how to handle the voidied line item in the invoice. + VoidInvoiceLinePendingActionCreateItem: + type: object + required: + - type + properties: + type: + type: string + enum: + - pending + nextInvoiceAt: + type: string + format: date-time + example: 2023-01-01T01:01:01.001Z + description: |- + The time at which the line item should be invoiced again. + + If not provided, the line item will be re-invoiced now. + description: VoidInvoiceLinePendingAction describes how to handle the voidied line item in the invoice. WindowSize: type: string enum: diff --git a/api/openapi.yaml b/api/openapi.yaml index 140478545..b7e0879f9 100644 --- a/api/openapi.yaml +++ b/api/openapi.yaml @@ -6832,8 +6832,8 @@ paths: summary: Create subscription parameters: [] responses: - '200': - description: The request has succeeded. + '201': + description: The request has succeeded and a new resource has been created as a result. content: application/json: schema: @@ -6892,6 +6892,7 @@ paths: /api/v1/subscriptions/{subscriptionId}: get: operationId: getSubscription + summary: Get subscription parameters: - name: subscriptionId in: path @@ -6900,15 +6901,6 @@ paths: type: string example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ - - name: expand - in: query - required: false - schema: - type: boolean - enum: - - false - - true - explode: false - name: at in: query required: false @@ -6918,16 +6910,13 @@ paths: format: date-time example: 2023-01-01T01:01:01.001Z explode: false - summary: Get subscription Get subscription responses: '200': description: The request has succeeded. content: application/json: schema: - anyOf: - - $ref: '#/components/schemas/Subscription' - - $ref: '#/components/schemas/SubscriptionExpanded' + $ref: '#/components/schemas/SubscriptionExpanded' '400': description: The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing). content: @@ -6970,9 +6959,9 @@ paths: application/problem+json: schema: $ref: '#/components/schemas/UnexpectedProblemResponse' - x-internal: true tags: - Subscriptions + x-internal: true patch: operationId: editSubscription summary: Edit subscription @@ -7049,14 +7038,7 @@ paths: content: application/json: schema: - type: array - items: - anyOf: - - $ref: '#/components/schemas/SubscriptionEditAddUpdateItem' - - $ref: '#/components/schemas/SubscriptionEditRemoveUpdateItem' - - $ref: '#/components/schemas/SubscriptionEditAdd' - - $ref: '#/components/schemas/SubscriptionEditStretch' - - $ref: '#/components/schemas/SubscriptionEditRemoveWithValue' + $ref: '#/components/schemas/SubscriptionEdit' x-internal: true /api/v1/subscriptions/{subscriptionId}/cancel: post: @@ -8888,29 +8870,6 @@ components: description: |- [ISO 3166-1](https://www.iso.org/iso-3166-country-codes.html) alpha-2 country code. Custom two-letter country codes are also supported for convenience. - CreateCustomSubscriptionRequestBody: - type: object - required: - - currency - - activeFrom - - customPlan - - customerId - properties: - currency: - $ref: '#/components/schemas/CurrencyCode' - activeFrom: - type: string - format: date-time - example: 2023-01-01T01:01:01.001Z - description: '[RFC3339](https://tools.ietf.org/html/rfc3339) formatted date-time string in UTC.' - customPlan: - $ref: '#/components/schemas/PlanCreate' - customerId: - type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH - pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ - description: ULID (Universally Unique Lexicographically Sortable Identifier). - description: Create a custom subscription. CreateStripeCheckoutSessionRequest: type: object required: @@ -9050,12 +9009,9 @@ components: CustomSubscriptionChange: type: object required: - - currency - activeFrom - customPlan properties: - currency: - $ref: '#/components/schemas/CurrencyCode' activeFrom: type: string format: date-time @@ -9064,6 +9020,26 @@ components: customPlan: $ref: '#/components/schemas/PlanCreate' description: Change a custom subscription. + CustomSubscriptionCreate: + type: object + required: + - activeFrom + - customPlan + - customerId + properties: + activeFrom: + type: string + format: date-time + example: 2023-01-01T01:01:01.001Z + description: '[RFC3339](https://tools.ietf.org/html/rfc3339) formatted date-time string in UTC.' + customPlan: + $ref: '#/components/schemas/PlanCreate' + customerId: + type: string + example: 01G65Z755AFWAKHE12NY0CQ9FH + pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + description: ULID (Universally Unique Lexicographically Sortable Identifier). + description: Create a custom subscription. Customer: type: object required: @@ -9397,42 +9373,97 @@ components: When not specified, the discount applies to all rate cards. title: Discounted RateCards description: Percentage discount. - DiscountPercentageUpdateItem: - type: object - required: - - percentage - properties: - percentage: - type: number - minimum: 0 - maximum: 100 - description: The percentage of the discount. - title: Percentage - rateCards: - type: array - items: - type: string - minLength: 1 - maxLength: 64 - pattern: ^[a-z0-9]+(?:_[a-z0-9]+)*$ - description: A key is a unique string that is used to identify a resource. - description: |- - The rate cards that the discount applies to. - When not specified, the discount applies to all rate cards. - title: Discounted RateCards - description: Percentage discount. DiscountType: type: string enum: - percentage description: The type of the discount. - DiscountUpdateItem: + EditOp: + type: string + enum: + - add_item + - remove_item + - add_phase + - remove_phase + - stretch_phase + EditSubscriptionAddItem: type: object - allOf: - - $ref: '#/components/schemas/DiscountPercentageUpdateItem' - description: |- - A discount on a price. - One of: percentage, amount, or usage. + required: + - op + - phaseKey + - rateCard + properties: + op: + type: string + enum: + - add_item + phaseKey: + type: string + rateCard: + $ref: '#/components/schemas/RateCard' + description: Add a new item to a phase. + EditSubscriptionAddPhase: + type: object + required: + - op + - phase + properties: + op: + type: string + enum: + - add_phase + phase: + $ref: '#/components/schemas/SubscriptionPhaseCreate' + description: Add a new phase + EditSubscriptionRemoveItem: + type: object + required: + - op + - phaseKey + - itemKey + properties: + op: + type: string + enum: + - remove_item + phaseKey: + type: string + itemKey: + type: string + description: Remove an item from a phase. + EditSubscriptionRemovePhase: + type: object + required: + - op + - phaseKey + - shift + properties: + op: + type: string + enum: + - remove_phase + phaseKey: + type: string + shift: + $ref: '#/components/schemas/RemovePhaseShifting' + description: Remove a phase + EditSubscriptionStretchPhase: + type: object + required: + - op + - phaseKey + - extendBy + properties: + op: + type: string + enum: + - stretch_phase + phaseKey: + type: string + extendBy: + type: string + format: duration + description: Stretch a phase Entitlement: anyOf: - $ref: '#/components/schemas/EntitlementMetered' @@ -13368,6 +13399,21 @@ components: type: integer description: The plan version. description: References an exact plan. + PlanReferenceInput: + type: object + required: + - key + properties: + key: + type: string + minLength: 1 + maxLength: 64 + pattern: ^[a-z0-9]+(?:_[a-z0-9]+)*$ + description: The plan key. + version: + type: integer + description: The plan version. + description: References an exact plan defaulting to the current active version. PlanReplaceUpdate: type: object required: @@ -13414,90 +13460,44 @@ components: type: object required: - plan - - currency - activeFrom - - customizations + - name properties: + metadata: + $ref: '#/components/schemas/Metadata' plan: - type: object - properties: - key: - type: string - minLength: 1 - maxLength: 64 - pattern: ^[a-z0-9]+(?:_[a-z0-9]+)*$ - description: A key is a unique string that is used to identify a resource. - version: - type: integer - required: - - key - - version - currency: - $ref: '#/components/schemas/CurrencyCode' + $ref: '#/components/schemas/PlanReferenceInput' activeFrom: type: string format: date-time example: 2023-01-01T01:01:01.001Z description: '[RFC3339](https://tools.ietf.org/html/rfc3339) formatted date-time string in UTC.' - customizations: - type: array - items: - anyOf: - - $ref: '#/components/schemas/SubscriptionEditAddItem' - - $ref: '#/components/schemas/SubscriptionEditRemoveItem' - maxItems: 100 - description: |- - Batch processing commands for customizing the susbcription. - The key format is `/phases/{phaseKey}/items/{itemKey}`. - - Add operations insert a new member based on the creation input without altering the existing members. - - Remove operations remove the member from the document. + name: + type: string + description: + type: string description: Change subscription based on plan. PlanSubscriptionCreate: type: object required: - plan - - currency - activeFrom - - customizations + - name - customerId properties: + metadata: + $ref: '#/components/schemas/Metadata' plan: - type: object - properties: - key: - type: string - minLength: 1 - maxLength: 64 - pattern: ^[a-z0-9]+(?:_[a-z0-9]+)*$ - description: A key is a unique string that is used to identify a resource. - version: - type: integer - required: - - key - - version - currency: - $ref: '#/components/schemas/CurrencyCode' + $ref: '#/components/schemas/PlanReferenceInput' activeFrom: type: string format: date-time example: 2023-01-01T01:01:01.001Z description: '[RFC3339](https://tools.ietf.org/html/rfc3339) formatted date-time string in UTC.' - customizations: - type: array - items: - anyOf: - - $ref: '#/components/schemas/SubscriptionEditAddItem' - - $ref: '#/components/schemas/SubscriptionEditRemoveItem' - maxItems: 100 - description: |- - Batch processing commands for customizing the susbcription. - The key format is `/phases/{phaseKey}/items/{itemKey}`. - - Add operations insert a new member based on the creation input without altering the existing members. - - Remove operations remove the member from the document. + name: + type: string + description: + type: string customerId: type: string example: 01G65Z755AFWAKHE12NY0CQ9FH @@ -13782,73 +13782,6 @@ components: When null, the feature or service is free. title: Price description: A flat fee rate card defines a one-time purchase or a recurring fee. - RateCardFlatFeeUpdateItem: - type: object - required: - - type - - name - - billingCadence - - price - properties: - type: - type: string - enum: - - flat_fee - description: The type of the RateCard. - title: RateCard type - name: - type: string - minLength: 1 - maxLength: 256 - description: Human-readable name for the resource. Between 1 and 256 characters. - title: Display name - description: - type: string - maxLength: 1024 - description: Optional description of the resource. Maximum 1024 characters. - title: Description - metadata: - type: object - allOf: - - $ref: '#/components/schemas/Metadata' - nullable: true - description: Additional metadata for the resource. - title: Metadata - featureKey: - type: string - minLength: 1 - maxLength: 64 - pattern: ^[a-z0-9]+(?:_[a-z0-9]+)*$ - description: The feature the customer is entitled to use. - title: Feature key - entitlementTemplate: - $ref: '#/components/schemas/RateCardEntitlement' - taxConfig: - allOf: - - $ref: '#/components/schemas/TaxConfig' - description: |- - The tax config of the rate card. - When undefined, the tax config of the feature or the default tax config of the plan is used. - title: Tax config - billingCadence: - type: string - format: duration - nullable: true - description: |- - The billing cadence of the rate card. - When null it means it is a one time fee. - title: Billing cadence - price: - type: object - allOf: - - $ref: '#/components/schemas/FlatPriceWithPaymentTerm' - nullable: true - example: {} - description: |- - The price of the rate card. - When null, the feature or service is free. - title: Price - description: A flat fee rate card defines a one-time purchase or a recurring fee. RateCardMeteredEntitlement: type: object required: @@ -13974,16 +13907,6 @@ components: - flat_fee - usage_based description: The type of the rate card. - RateCardUpdateItem: - oneOf: - - $ref: '#/components/schemas/RateCardFlatFeeUpdateItem' - - $ref: '#/components/schemas/RateCardUsageBasedUpdateItem' - discriminator: - propertyName: type - mapping: - flat_fee: '#/components/schemas/RateCardFlatFeeUpdateItem' - usage_based: '#/components/schemas/RateCardUsageBasedUpdateItem' - description: A rate card defines the pricing and entitlement of a feature or service. RateCardUsageBased: type: object required: @@ -14062,64 +13985,6 @@ components: unit: '#/components/schemas/UnitPriceWithCommitments' tiered: '#/components/schemas/TieredPriceWithCommitments' description: The price of the usage based rate card. - RateCardUsageBasedUpdateItem: - type: object - required: - - type - - name - - billingCadence - - price - properties: - type: - type: string - enum: - - usage_based - description: The type of the RateCard. - title: RateCard type - name: - type: string - minLength: 1 - maxLength: 256 - description: Human-readable name for the resource. Between 1 and 256 characters. - title: Display name - description: - type: string - maxLength: 1024 - description: Optional description of the resource. Maximum 1024 characters. - title: Description - metadata: - type: object - allOf: - - $ref: '#/components/schemas/Metadata' - nullable: true - description: Additional metadata for the resource. - title: Metadata - featureKey: - type: string - minLength: 1 - maxLength: 64 - pattern: ^[a-z0-9]+(?:_[a-z0-9]+)*$ - description: The feature the customer is entitled to use. - title: Feature key - entitlementTemplate: - $ref: '#/components/schemas/RateCardEntitlement' - taxConfig: - allOf: - - $ref: '#/components/schemas/TaxConfig' - description: |- - The tax config of the rate card. - When undefined, the tax config of the feature or the default tax config of the plan is used. - title: Tax config - billingCadence: - type: string - format: duration - description: The billing cadence of the rate card. - title: Billing cadence - price: - allOf: - - $ref: '#/components/schemas/RateCardUsageBasedPrice' - nullable: true - description: A usage-based rate card defines a price based on usage. RecurringPeriod: type: object required: @@ -14174,8 +14039,8 @@ components: RemovePhaseShifting: type: string enum: - - Next - - Prev + - next + - prev description: The direction of the phase shift when a phase is removed. ResetEntitlementUsageInput: type: object @@ -14642,6 +14507,7 @@ components: - name - createdAt - updatedAt + - activeFrom - customerId - plan - currency @@ -14692,6 +14558,16 @@ components: description: Timestamp of when the resource was permanently deleted. title: Deletion Time readOnly: true + activeFrom: + type: string + format: date-time + example: 2023-01-01T01:01:01.001Z + description: The cadence start of the resource. + activeTo: + type: string + format: date-time + example: 2023-01-01T01:01:01.001Z + description: The cadence end of the resource. customerId: type: string example: 01G65Z755AFWAKHE12NY0CQ9FH @@ -14709,11 +14585,6 @@ components: Will be revised once we add multi currency support. title: Currency default: USD - activeTo: - type: string - format: date-time - example: 2023-01-01T01:01:01.001Z - description: If the subscription is canceled or otherwise have to end activeTo denotes the end date. description: Subscription is an exact subscription instance. SubscriptionChange: oneOf: @@ -14723,133 +14594,37 @@ components: SubscriptionCreate: oneOf: - $ref: '#/components/schemas/PlanSubscriptionCreate' - - $ref: '#/components/schemas/CreateCustomSubscriptionRequestBody' + - $ref: '#/components/schemas/CustomSubscriptionCreate' description: Create a subscription. - SubscriptionEditAdd: - type: object - required: - - op - - path - - value - properties: - op: - type: string - enum: - - add - path: - type: string - pattern: ^\/phases\/[a-zA-Z0-9\-]+$ - value: - $ref: '#/components/schemas/SubscriptionPhaseCreate' - description: Subscription item add operation. - SubscriptionEditAddItem: - type: object - required: - - op - - path - - value - properties: - op: - type: string - enum: - - add - path: - type: string - pattern: ^\/phases\/[a-zA-Z0-9\-]+\/items\/[a-zA-Z0-9\-]+$ - value: - $ref: '#/components/schemas/RateCard' - description: Subscription item add operation. - SubscriptionEditAddUpdateItem: - type: object - required: - - op - - path - - value - properties: - op: - type: string - enum: - - add - path: - type: string - pattern: ^\/phases\/[a-zA-Z0-9\-]+\/items\/[a-zA-Z0-9\-]+$ - value: - $ref: '#/components/schemas/RateCardUpdateItem' - description: Subscription item add operation. - SubscriptionEditRemoveItem: + SubscriptionEdit: type: object required: - - op - - path - properties: - op: - type: string - enum: - - remove - path: - type: string - pattern: ^\/phases\/[a-zA-Z0-9\-]+\/items\/[a-zA-Z0-9\-]+$ - description: Subscription phase remove operation. - SubscriptionEditRemoveUpdateItem: - type: object - required: - - op - - path - properties: - op: - type: string - enum: - - remove - path: - type: string - pattern: ^\/phases\/[a-zA-Z0-9\-]+\/items\/[a-zA-Z0-9\-]+$ - description: Subscription phase remove operation. - SubscriptionEditRemoveWithValue: - type: object - required: - - op - - path - - value - properties: - op: - type: string - enum: - - remove - path: - type: string - pattern: ^\/phases\/[a-zA-Z0-9\-]+$ - value: - type: object - properties: - shift: - $ref: '#/components/schemas/RemovePhaseShifting' - required: - - shift - description: Subscription item remove operation with a value. - SubscriptionEditStretch: - type: object - required: - - op - - path - - value + - customizations properties: - op: - type: string - enum: - - extend - path: - type: string - pattern: ^\/phases\/[a-zA-Z0-9\-]+$ - value: - type: object - properties: - extendBy: - type: string - format: duration - description: The signed duration to extend or shrink the phase by. - required: - - extendBy - description: Subscription phase stretch operation. + customizations: + type: array + items: + $ref: '#/components/schemas/SubscriptionEditOperation' + maxItems: 100 + description: |- + Batch processing commands for manipulating running subscriptions. + The key format is `/phases/{phaseKey}` or `/phases/{phaseKey}/items/{itemKey}`. + description: Subscription edit input. + SubscriptionEditOperation: + oneOf: + - $ref: '#/components/schemas/EditSubscriptionAddItem' + - $ref: '#/components/schemas/EditSubscriptionRemoveItem' + - $ref: '#/components/schemas/EditSubscriptionAddPhase' + - $ref: '#/components/schemas/EditSubscriptionRemovePhase' + - $ref: '#/components/schemas/EditSubscriptionStretchPhase' + discriminator: + propertyName: op + mapping: + add_item: '#/components/schemas/EditSubscriptionAddItem' + remove_item: '#/components/schemas/EditSubscriptionRemoveItem' + add_phase: '#/components/schemas/EditSubscriptionAddPhase' + remove_phase: '#/components/schemas/EditSubscriptionRemovePhase' + stretch_phase: '#/components/schemas/EditSubscriptionStretchPhase' SubscriptionExpanded: type: object required: @@ -14857,6 +14632,7 @@ components: - name - createdAt - updatedAt + - activeFrom - customerId - plan - currency @@ -14908,6 +14684,16 @@ components: description: Timestamp of when the resource was permanently deleted. title: Deletion Time readOnly: true + activeFrom: + type: string + format: date-time + example: 2023-01-01T01:01:01.001Z + description: The cadence start of the resource. + activeTo: + type: string + format: date-time + example: 2023-01-01T01:01:01.001Z + description: The cadence end of the resource. customerId: type: string example: 01G65Z755AFWAKHE12NY0CQ9FH @@ -14925,11 +14711,6 @@ components: Will be revised once we add multi currency support. title: Currency default: USD - activeTo: - type: string - format: date-time - example: 2023-01-01T01:01:01.001Z - description: If the subscription is canceled or otherwise have to end activeTo denotes the end date. phases: type: array items: @@ -14942,6 +14723,7 @@ components: - name - createdAt - updatedAt + - activeFrom - key - billingCandence - price @@ -14992,6 +14774,16 @@ components: description: Timestamp of when the resource was permanently deleted. title: Deletion Time readOnly: true + activeFrom: + type: string + format: date-time + example: 2023-01-01T01:01:01.001Z + description: The cadence start of the resource. + activeTo: + type: string + format: date-time + example: 2023-01-01T01:01:01.001Z + description: The cadence end of the resource. key: type: string minLength: 1 @@ -15030,26 +14822,14 @@ components: allOf: - $ref: '#/components/schemas/TieredPriceWithCommitments' nullable: true - - type: object - allOf: - - $ref: '#/components/schemas/FlatPriceWithPaymentTerm' - nullable: true example: {} description: |- The price of the rate card. When null, the feature or service is free. title: Price included: - type: object - properties: - feature: - allOf: - - $ref: '#/components/schemas/Feature' - description: The feature the customer is entitled to use. - entitlement: - $ref: '#/components/schemas/Entitlement' - required: - - feature + allOf: + - $ref: '#/components/schemas/SubscriptionItemIncluded' description: Describes what access is gained via the SubscriptionItem taxConfig: allOf: @@ -15059,6 +14839,18 @@ components: When undefined, the tax config of the feature or the default tax config of the plan is used. title: Tax config description: The actual contents of the Subscription, what the user gets, what they pay, etc... + SubscriptionItemIncluded: + type: object + required: + - feature + properties: + feature: + allOf: + - $ref: '#/components/schemas/Feature' + description: The feature the customer is entitled to use. + entitlement: + $ref: '#/components/schemas/Entitlement' + description: Included contents like Entitlement, or the Feature. SubscriptionPhase: type: object required: @@ -15067,7 +14859,6 @@ components: - createdAt - updatedAt - key - - duration - activeFrom properties: id: @@ -15122,12 +14913,6 @@ components: maxLength: 64 pattern: ^[a-z0-9]+(?:_[a-z0-9]+)*$ description: A locally unique identifier for the resource. - duration: - type: string - format: duration - example: P1M - description: The intended duration of the new phase. - title: Duration discounts: type: array items: @@ -15139,12 +14924,18 @@ components: format: date-time example: 2023-01-01T01:01:01.001Z description: The time from which the phase is active. + activeTo: + type: string + format: date-time + example: 2023-01-01T01:01:01.001Z + description: The until which the Phase is active. description: Subscription phase, analogous to plan phases. SubscriptionPhaseCreate: type: object required: - startAfter - - duration + - key + - name properties: startAfter: type: string @@ -15159,14 +14950,28 @@ components: type: string format: duration example: P1M - description: The intended duration of the new phase. + description: |- + The intended duration of the new phase. + Duration is required when the phase will not be the last phase. title: Duration discounts: type: array items: - $ref: '#/components/schemas/DiscountUpdateItem' + $ref: '#/components/schemas/Discount' description: The discounts on the plan. title: Discounts + key: + type: string + minLength: 1 + maxLength: 64 + pattern: ^[a-z0-9]+(?:_[a-z0-9]+)*$ + description: A locally unique identifier for the phase. + name: + type: string + description: The name of the phase. + description: + type: string + description: The description of the phase. description: Subscription phase create input. SubscriptionPhaseExpanded: type: object @@ -15176,7 +14981,6 @@ components: - createdAt - updatedAt - key - - duration - activeFrom - items properties: @@ -15232,12 +15036,6 @@ components: maxLength: 64 pattern: ^[a-z0-9]+(?:_[a-z0-9]+)*$ description: A locally unique identifier for the resource. - duration: - type: string - format: duration - example: P1M - description: The intended duration of the new phase. - title: Duration discounts: type: array items: @@ -15249,6 +15047,11 @@ components: format: date-time example: 2023-01-01T01:01:01.001Z description: The time from which the phase is active. + activeTo: + type: string + format: date-time + example: 2023-01-01T01:01:01.001Z + description: The until which the Phase is active. items: type: array items: diff --git a/api/spec/src/productcatalog/plan.tsp b/api/spec/src/productcatalog/plan.tsp index dd256c61f..55034fb76 100644 --- a/api/spec/src/productcatalog/plan.tsp +++ b/api/spec/src/productcatalog/plan.tsp @@ -18,6 +18,22 @@ enum PlanStatus { scheduled: "scheduled", } +/** + * References an exact plan defaulting to the current active version. + */ +@friendlyName("PlanReferenceInput") +model PlanReferenceInput { + /** + * The plan key. + */ + key: Key; + + /** + * The plan version. + */ + version?: integer; +} + /** * References an exact plan. */ diff --git a/api/spec/src/productcatalog/routes.tsp b/api/spec/src/productcatalog/routes.tsp index 5d04ec6b1..bba8b75a9 100644 --- a/api/spec/src/productcatalog/routes.tsp +++ b/api/spec/src/productcatalog/routes.tsp @@ -233,21 +233,6 @@ interface PlanPhases { @route("/api/v1/subscriptions") @tag("Subscriptions") interface Subscriptions { - @get - @sharedRoute - @operationId("getSubscription") - @summary("Get subscription") - @extension("x-internal", true) - get( - @path subscriptionId: ULID, - @query expand?: false, - - /** - * The time at which the subscription should be queried. If not provided the current time is used. - */ - @query at?: DateTime, - ): Subscription | OpenMeter.NotFoundError | OpenMeter.CommonErrors; - @get @sharedRoute @operationId("getSubscription") @@ -255,7 +240,6 @@ interface Subscriptions { @extension("x-internal", true) getExpanded( @path subscriptionId: ULID, - @query expand: true, /** * The time at which the subscription should be queried. If not provided the current time is used. @@ -267,9 +251,10 @@ interface Subscriptions { @operationId("createSubscription") @summary("Create subscription") @extension("x-internal", true) - create( - @body body: SubscriptionCreate, - ): Subscription | OpenMeter.ConflictError | OpenMeter.CommonErrors; + create(@body body: SubscriptionCreate): { + @statusCode _: 201; + @body body: Subscription; + } | OpenMeter.ConflictError | OpenMeter.CommonErrors; /** * Batch processing commands for manipulating running subscriptions. @@ -279,13 +264,13 @@ interface Subscriptions { @operationId("editSubscription") @summary("Edit subscription") @route("/{subscriptionId}") + @parameterVisibility("create") @extension("x-internal", true) edit( @path subscriptionId: ULID, @body - @maxItems(100) - body: SubscriptionPatch[], + body: SubscriptionEdit, ): | Subscription | OpenMeter.ConflictError diff --git a/api/spec/src/productcatalog/subscription.tsp b/api/spec/src/productcatalog/subscription.tsp index 06ca26199..a45023358 100644 --- a/api/spec/src/productcatalog/subscription.tsp +++ b/api/spec/src/productcatalog/subscription.tsp @@ -33,6 +33,7 @@ model SubscriptionExpanded { @friendlyName("Subscription") model Subscription { ...global.Resource; + ...global.CadencedResource; /** * The customer ID of the subscription. @@ -50,11 +51,6 @@ model Subscription { */ @summary("Currency") currency: CurrencyCode = "USD"; - - /** - * If the subscription is canceled or otherwise have to end activeTo denotes the end date. - */ - activeTo?: DateTime; } /** @@ -73,12 +69,22 @@ model SubscriptionPhaseExpanded { model SubscriptionPhase { ...global.Resource; ...Keyed; - ...OmitProperties; + + // TODO: lets try this with visibility + ...OmitProperties< + SubscriptionPhaseCreate, + "startAfter" | "duration" | "key" | "name" | "description" + >; /** * The time from which the phase is active. */ activeFrom: DateTime; + + /** + * The until which the Phase is active. + */ + activeTo?: DateTime; } /** @@ -97,17 +103,33 @@ model SubscriptionPhaseCreate { /** * The intended duration of the new phase. + * Duration is required when the phase will not be the last phase. */ @summary("Duration") @encode(DurationKnownEncoding.ISO8601) @example(duration.fromISO("P1M")) - duration: duration; + duration?: duration; /** * The discounts on the plan. */ @summary("Discounts") discounts?: Discount[]; + + /** + * A locally unique identifier for the phase. + */ + key: Key; + + /** + * The name of the phase. + */ + name: string; + + /** + * The description of the phase. + */ + description?: string; } /** @@ -116,6 +138,7 @@ model SubscriptionPhaseCreate { @friendlyName("SubscriptionItem") model SubscriptionItem { ...global.Resource; + ...global.CadencedResource; /** * The identifier of the RateCard. @@ -149,23 +172,12 @@ model SubscriptionItem { | FlatPriceWithPaymentTerm | UnitPriceWithCommitments | TieredPriceWithCommitments - | FlatPriceWithPaymentTerm | null; /** * Describes what access is gained via the SubscriptionItem */ - included?: { - /** - * The feature the customer is entitled to use. - */ - feature: Entitlements.Feature; - - /* - * The entitlement of the Subscription Item. - */ - entitlement?: Entitlements.Entitlement; - }; + included?: SubscriptionItemIncluded; /** * The tax config of the Subscription Item. @@ -176,6 +188,35 @@ model SubscriptionItem { taxConfig?: TaxConfig; } +/** + * Included contents like Entitlement, or the Feature. + */ +@friendlyName("SubscriptionItemIncluded") +model SubscriptionItemIncluded { + /** + * The feature the customer is entitled to use. + */ + feature: Entitlements.Feature; + + /* + * The entitlement of the Subscription Item. + */ + entitlement?: Entitlements.Entitlement; +} + +/** + * Subscription edit input. + */ +@friendlyName("SubscriptionEdit") +model SubscriptionEdit { + /** + * Batch processing commands for manipulating running subscriptions. + * The key format is `/phases/{phaseKey}` or `/phases/{phaseKey}/items/{itemKey}`. + */ + @maxItems(100) + customizations: SubscriptionEditOperation[]; +} + /** * Create a subscription. */ @@ -199,7 +240,7 @@ union SubscriptionChange { /** * Create a custom subscription. */ -@friendlyName("CreateCustomSubscriptionRequestBody") +@friendlyName("CustomSubscriptionCreate") model CustomSubscriptionCreate { ...CustomSubscriptionChange; customerId: ULID; @@ -210,7 +251,6 @@ model CustomSubscriptionCreate { */ @friendlyName("CustomSubscriptionChange") model CustomSubscriptionChange { - currency: CurrencyCode; activeFrom: DateTime; customPlan: TypeSpec.Rest.Resource.ResourceCreateModel; } @@ -229,109 +269,94 @@ model PlanSubscriptionCreate { */ @friendlyName("PlanSubscriptionChange") model PlanSubscriptionChange { - plan: { - key: Key; - version: integer; - }; - currency: CurrencyCode; + metadata?: global.Metadata; + plan: PlanReferenceInput; activeFrom: DateTime; + name: string; + description?: string; +} - /** - * Batch processing commands for customizing the susbcription. - * The key format is `/phases/{phaseKey}/items/{itemKey}`. - * - * Add operations insert a new member based on the creation input without altering the existing members. - * - * Remove operations remove the member from the document. - * - */ - @maxItems(100) - customizations: SubscriptionItemPatch[]; +@friendlyName("SubscriptionEditOperation") +@oneOf +@discriminator("op") +union SubscriptionEditOperation { + EditSubscriptionAddItem, + EditSubscriptionRemoveItem, + EditSubscriptionAddPhase, + EditSubscriptionRemovePhase, + EditSubscriptionStretchPhase, } -@pattern("^\\/phases\\/[a-zA-Z0-9\\-]+$") -scalar SubscriptionPhasePatchKey extends string; +@friendlyName("EditOp") +enum EditOp { + AddItem: "add_item", + RemoveItem: "remove_item", + AddPhase: "add_phase", + RemovePhase: "remove_phase", + StretchPhase: "stretch_phase", +} /** - * The direction of the phase shift when a phase is removed. + * Add a new item to a phase. */ -@friendlyName("RemovePhaseShifting") -enum RemovePhaseShifting { - /** - * Shifts all subsequent phases to start sooner by the deleted phase's length - */ - Next, - - /** - * Extends the previous phase to end later by the deleted phase's length - */ - Prev, +@friendlyName("EditSubscriptionAddItem") +model EditSubscriptionAddItem { + `op`: EditOp.AddItem; + phaseKey: string; + rateCard: RateCard; } -alias SubscriptionPhasePatch = SubscriptionEditAdd< - SubscriptionPhaseCreate, - SubscriptionPhasePatchKey -> | SubscriptionPhaseStretch< - { - /** - * The signed duration to extend or shrink the phase by. - */ - @encode(DurationKnownEncoding.ISO8601) - extendBy: duration; - }, - SubscriptionPhasePatchKey -> | SubscriptionEditRemoveWithValue< - { - shift: RemovePhaseShifting; - }, - SubscriptionPhasePatchKey ->; - -@pattern("^\\/phases\\/[a-zA-Z0-9\\-]+\\/items\\/[a-zA-Z0-9\\-]+$") -scalar SubscriptionItemPatchKey extends string; - -alias SubscriptionPatch = SubscriptionItemPatch | SubscriptionPhasePatch; - -alias SubscriptionItemPatch = SubscriptionEditAdd< - RateCard, - SubscriptionItemPatchKey -> | SubscriptionEditRemove; +/** + * Remove an item from a phase. + */ +@friendlyName("EditSubscriptionRemoveItem") +model EditSubscriptionRemoveItem { + `op`: EditOp.RemoveItem; + phaseKey: string; + itemKey: string; +} /** - * Subscription item add operation. + * Add a new phase */ -@friendlyName("SubscriptionEditAdd") -model SubscriptionEditAdd { - `op`: "add"; - path: K; - value: T; +@friendlyName("EditSubscriptionAddPhase") +model EditSubscriptionAddPhase { + `op`: EditOp.AddPhase; + phase: SubscriptionPhaseCreate; } /** - * Subscription phase stretch operation. + * Remove a phase */ -@friendlyName("SubscriptionEditStretch") -model SubscriptionPhaseStretch { - `op`: "extend"; - path: K; - value: T; +@friendlyName("EditSubscriptionRemovePhase") +model EditSubscriptionRemovePhase { + `op`: EditOp.RemovePhase; + phaseKey: string; + shift: RemovePhaseShifting; } /** - * Subscription phase remove operation. + * Stretch a phase */ -@friendlyName("SubscriptionEditRemove") -model SubscriptionEditRemove { - `op`: "remove"; - path: K; +@friendlyName("EditSubscriptionStretchPhase") +model EditSubscriptionStretchPhase { + `op`: EditOp.StretchPhase; + phaseKey: string; + extendBy: duration; } /** - * Subscription item remove operation with a value. + * The direction of the phase shift when a phase is removed. */ -@friendlyName("SubscriptionEditRemoveWithValue") -model SubscriptionEditRemoveWithValue { - `op`: "remove"; - path: K; - value: T; +@friendlyName("RemovePhaseShifting") +enum RemovePhaseShifting { + /** + * Shifts all subsequent phases to start sooner by the deleted phase's length + */ + Next: "next", + + /** + * Extends the previous phase to end later by the deleted phase's length + */ + Prev: "prev", } diff --git a/cmd/server/main.go b/cmd/server/main.go index a2063a47c..690077e52 100644 --- a/cmd/server/main.go +++ b/cmd/server/main.go @@ -49,6 +49,11 @@ import ( "github.com/openmeterio/openmeter/openmeter/server" "github.com/openmeterio/openmeter/openmeter/server/authenticator" "github.com/openmeterio/openmeter/openmeter/server/router" + "github.com/openmeterio/openmeter/openmeter/subscription" + subscriptionentitlement "github.com/openmeterio/openmeter/openmeter/subscription/adapters/entitlement" + subscriptionplan "github.com/openmeterio/openmeter/openmeter/subscription/adapters/plan" + subscriptionrepo "github.com/openmeterio/openmeter/openmeter/subscription/repo" + subscriptionservice "github.com/openmeterio/openmeter/openmeter/subscription/service" "github.com/openmeterio/openmeter/pkg/errorsx" ) @@ -327,7 +332,7 @@ func main() { }() } - // Initialize plans + // Initialize plans & subscriptions var planService plan.Service if conf.ProductCatalog.Enabled { adapter, err := planadapter.New(planadapter.Config{ @@ -350,6 +355,42 @@ func main() { } } + // Initialize subscriptions + var subscriptionService subscription.Service + var subscriptionWorkflowService subscription.WorkflowService + if conf.ProductCatalog.Enabled { + subscriptionRepo := subscriptionrepo.NewSubscriptionRepo(app.EntClient) + subscriptionPhaseRepo := subscriptionrepo.NewSubscriptionPhaseRepo(app.EntClient) + subscriptionItemRepo := subscriptionrepo.NewSubscriptionItemRepo(app.EntClient) + + subscriptionEntitlementAdapter := subscriptionentitlement.NewSubscriptionEntitlementAdapter( + entitlementConnRegistry.Entitlement, + subscriptionItemRepo, + subscriptionItemRepo, + ) + + subscriptionPlanAdapter := subscriptionplan.NewSubscriptionPlanAdapter(subscriptionplan.PlanSubscriptionAdapterConfig{ + PlanService: planService, + Logger: logger.With("subsystem", "subscription.plan.adapter"), + }) + + subscriptionService = subscriptionservice.New(subscriptionservice.ServiceConfig{ + SubscriptionRepo: subscriptionRepo, + SubscriptionPhaseRepo: subscriptionPhaseRepo, + SubscriptionItemRepo: subscriptionItemRepo, + CustomerService: customerService, + EntitlementAdapter: subscriptionEntitlementAdapter, + TransactionManager: subscriptionRepo, + }) + + subscriptionWorkflowService = subscriptionservice.NewWorkflowService(subscriptionservice.WorkflowServiceConfig{ + Service: subscriptionService, + CustomerService: customerService, + PlanAdapter: subscriptionPlanAdapter, + TransactionManager: subscriptionRepo, + }) + } + // Initialize billing var billingService billing.Service if conf.Billing.Enabled { @@ -394,16 +435,20 @@ func main() { DebugConnector: debugConnector, EntitlementBalanceConnector: entitlementConnRegistry.MeteredEntitlement, EntitlementConnector: entitlementConnRegistry.Entitlement, + SubscriptionService: subscriptionService, + SubscriptionWorkflowService: subscriptionWorkflowService, + Logger: logger, FeatureConnector: entitlementConnRegistry.Feature, GrantConnector: entitlementConnRegistry.Grant, GrantRepo: entitlementConnRegistry.GrantRepo, Notification: notificationService, Plan: planService, // modules - EntitlementsEnabled: conf.Entitlements.Enabled, - NotificationEnabled: conf.Notification.Enabled, - AppsEnabled: conf.Apps.Enabled, - BillingEnabled: conf.Billing.Enabled, + EntitlementsEnabled: conf.Entitlements.Enabled, + NotificationEnabled: conf.Notification.Enabled, + ProductCatalogEnabled: conf.ProductCatalog.Enabled, + AppsEnabled: conf.Apps.Enabled, + BillingEnabled: conf.Billing.Enabled, }, RouterHook: app.RouterHook, }) diff --git a/e2e/config.yaml b/e2e/config.yaml index 84f71187c..bbcd6a6a5 100644 --- a/e2e/config.yaml +++ b/e2e/config.yaml @@ -29,9 +29,18 @@ sink: brokers: kafka:9092 brokerAddressFamily: v4 +apps: + enabled: true + entitlements: enabled: true +productcatalog: + enabled: true + +billing: + enabled: true + postgres: url: postgres://postgres:postgres@postgres:5432/postgres?sslmode=disable @@ -74,3 +83,8 @@ meters: aggregation: COUNT groupBy: model: $.model + - slug: plan_meter + description: Meter for testing plan metered feature + eventType: plan_meter + aggregation: SUM + valueProperty: $.value diff --git a/e2e/e2e_test.go b/e2e/e2e_test.go index e431297c8..041c194ce 100644 --- a/e2e/e2e_test.go +++ b/e2e/e2e_test.go @@ -23,20 +23,6 @@ import ( "github.com/openmeterio/openmeter/pkg/models" ) -func initClient(t *testing.T) *api.ClientWithResponses { - t.Helper() - - address := os.Getenv("OPENMETER_ADDRESS") - if address == "" { - t.Skip("OPENMETER_ADDRESS not set") - } - - client, err := api.NewClientWithResponses(address) - require.NoError(t, err) - - return client -} - func TestMain(m *testing.M) { wait := os.Getenv("TEST_WAIT_ON_START") @@ -655,41 +641,6 @@ func TestQuery(t *testing.T) { assert.Equal(t, expected, resp.JSON200) }, time.Minute, time.Second) }) - - // TODO: improve group by tests by adding more than one parameter - // - // Note: this test breaks if any of the randomization parameters are changed - // TODO: Fix query ordering first - // t.Run("GroupBy", func(t *testing.T) { - // t.Parallel() - // - // resp, err := client.QueryMeterWithResponse(context.Background(), "query", &api.QueryMeterParams{ - // GroupBy: &[]string{"method"}, - // }) - // require.NoError(t, err) - // require.Equal(t, http.StatusOK, resp.StatusCode()) - // - // expected := &api.MeterQueryResult{ - // Data: []models.MeterQueryRow{ - // { - // Value: 4 * 100, - // WindowStart: timestamp.Truncate(time.Minute), - // WindowEnd: timestamp.Truncate(time.Minute).Add(24*time.Hour + time.Minute), - // GroupBy: map[string]*string{}, - // }, - // { - // Value: 4 * 100, - // WindowStart: timestamp.Truncate(time.Minute), - // WindowEnd: timestamp.Truncate(time.Minute).Add(24*time.Hour + time.Minute), - // GroupBy: map[string]*string{}, - // }, - // }, - // } - // - // assert.Equal(t, expected, resp.JSON200) - // }) - - // TODO: add tests for group by and subject } func TestCredit(t *testing.T) { diff --git a/e2e/productcatalog_test.go b/e2e/productcatalog_test.go new file mode 100644 index 000000000..9ad269b09 --- /dev/null +++ b/e2e/productcatalog_test.go @@ -0,0 +1,295 @@ +package e2e + +import ( + "testing" + "time" + + "github.com/samber/lo" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "golang.org/x/net/context" + + api "github.com/openmeterio/openmeter/api/client/go" +) + +const ( + PlanFeatureKey = "plan_feature_1" + PlanMeteredFeatureKey = "plan_metered_feature_1" + PlanKey = "test_plan" +) + +func TestPlan(t *testing.T) { + client := initClient(t) + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + // Let's set up a customer + customerAPIRes, err := client.CreateCustomerWithResponse(ctx, api.CreateCustomerJSONRequestBody{ + Name: "Test Customer", + Currency: lo.ToPtr(api.CurrencyCode("USD")), + Description: lo.ToPtr("Test Customer Description"), + PrimaryEmail: lo.ToPtr("customer@mail.com"), + Timezone: lo.ToPtr(time.UTC.String()), + BillingAddress: &api.Address{ + City: lo.ToPtr("City"), + Country: lo.ToPtr("US"), + Line1: lo.ToPtr("Line 1"), + Line2: lo.ToPtr("Line 2"), + State: lo.ToPtr("State"), + PhoneNumber: lo.ToPtr("1234567890"), + PostalCode: lo.ToPtr("12345"), + }, + UsageAttribution: api.CustomerUsageAttribution{ + SubjectKeys: []string{"test_customer_subject"}, + }, + }) + require.Nil(t, err) + + customer := customerAPIRes.JSON201 + require.NotNil(t, customer) + + // Now, let's create dedicated features for the plan + featureAPIRes, err := client.CreateFeatureWithResponse(ctx, api.CreateFeatureJSONRequestBody{ + Key: PlanFeatureKey, + Name: "Test Plan Feature", + }) + require.Nil(t, err) + + feature := featureAPIRes.JSON201 + require.NotNil(t, feature) + + meteredFeatureAPIRes, err := client.CreateFeatureWithResponse(ctx, api.CreateFeatureJSONRequestBody{ + Key: PlanMeteredFeatureKey, + Name: "Test Plan Metered Feature", + MeterSlug: lo.ToPtr("plan_meter"), + }) + require.Nil(t, err) + + meteredFeature := meteredFeatureAPIRes.JSON201 + require.NotNil(t, meteredFeature) + + var planId string + + t.Run("Should create a plan on happy path", func(t *testing.T) { + p1RC1 := api.RateCard{} + err := p1RC1.FromRateCardFlatFee(api.RateCardFlatFee{ + Name: "Test Plan Phase 1 Rate Card 1", + Description: lo.ToPtr("Has a one time flat price like an installation fee"), + Key: "test_plan_phase_1_rate_card_1", + TaxConfig: &api.TaxConfig{ + Stripe: &api.StripeTaxConfig{ + Code: "txcd_10000000", + }, + }, + Price: &api.FlatPriceWithPaymentTerm{ + Amount: "1000", + PaymentTerm: lo.ToPtr(api.PricePaymentTerm("in_advance")), + Type: api.FlatPriceWithPaymentTermType("flat"), + }, + BillingCadence: nil, + Type: api.RateCardFlatFeeType("flat"), + }) + require.Nil(t, err) + + p1RC2 := api.RateCard{} + err = p1RC2.FromRateCardFlatFee(api.RateCardFlatFee{ + Name: "Test Plan Phase 1 Rate Card 2", + Description: lo.ToPtr("Has a monthly recurring price to grant access to a feature"), + Key: PlanFeatureKey, + FeatureKey: lo.ToPtr(PlanFeatureKey), + TaxConfig: &api.TaxConfig{ + Stripe: &api.StripeTaxConfig{ + Code: "txcd_10000000", + }, + }, + Price: &api.FlatPriceWithPaymentTerm{ + Amount: "1000", + PaymentTerm: lo.ToPtr(api.PricePaymentTerm("in_advance")), + Type: api.FlatPriceWithPaymentTermType("flat"), + }, + BillingCadence: lo.ToPtr("P1M"), + Type: api.RateCardFlatFeeType("flat"), + }) + require.Nil(t, err) + + p2RC1 := api.RateCard{} + err = p2RC1.FromRateCardFlatFee(api.RateCardFlatFee{ + Name: "Test Plan Phase 2 Rate Card 1", + Description: lo.ToPtr("Keeps access to the same feature as in phase 1"), + Key: PlanFeatureKey, + FeatureKey: lo.ToPtr(PlanFeatureKey), + TaxConfig: &api.TaxConfig{ + Stripe: &api.StripeTaxConfig{ + Code: "txcd_10000000", + }, + }, + Price: &api.FlatPriceWithPaymentTerm{ + Amount: "1000", + PaymentTerm: lo.ToPtr(api.PricePaymentTerm("in_advance")), + Type: api.FlatPriceWithPaymentTermType("flat"), + }, + BillingCadence: lo.ToPtr("P1M"), + Type: api.RateCardFlatFeeType("flat"), + }) + require.Nil(t, err) + + p2RC2P := api.RateCardUsageBasedPrice{} + err = p2RC2P.FromUnitPriceWithCommitments(api.UnitPriceWithCommitments{ + Amount: "0.1", + Type: api.UnitPriceWithCommitmentsType("unit"), + }) + require.Nil(t, err) + + p2RC2 := api.RateCard{} + err = p2RC2.FromRateCardUsageBased(api.RateCardUsageBased{ + Name: "Test Plan Phase 2 Rate Card 2", + Description: lo.ToPtr("Adds a usage based price for the metered feature"), + Key: PlanMeteredFeatureKey, + FeatureKey: lo.ToPtr(PlanMeteredFeatureKey), + TaxConfig: &api.TaxConfig{ + Stripe: &api.StripeTaxConfig{ + Code: "txcd_10000000", + }, + }, + BillingCadence: "P1M", + Price: &p2RC2P, + Type: api.RateCardUsageBasedType("usage_based"), + }) + require.Nil(t, err) + + planAPIRes, err := client.CreatePlanWithResponse(ctx, api.CreatePlanJSONRequestBody{ + Currency: api.CurrencyCode("USD"), + Name: "Test Plan", + Description: lo.ToPtr("Test Plan Description"), + Key: PlanKey, + Phases: []api.PlanPhase{ + { + Name: "Test Plan Phase 1", + Key: "test_plan_phase_1", + Description: lo.ToPtr("Test Plan Phase 1 Description"), + StartAfter: nil, // Ommittable for first phase + RateCards: []api.RateCard{p1RC1, p1RC2}, + }, + { + Name: "Test Plan Phase 2", + Key: "test_plan_phase_2", + Description: lo.ToPtr("Test Plan Phase 1 Description"), + StartAfter: lo.ToPtr("P2M"), + RateCards: []api.RateCard{p2RC1, p2RC2}, + }, + }, + }) + require.Nil(t, err) + require.Equal(t, 201, planAPIRes.StatusCode()) + + plan := planAPIRes.JSON201 + require.NotNil(t, plan, "received the following body: %s", planAPIRes.Body) + + assert.Equal(t, PlanKey, plan.Key) + require.NotNil(t, plan.Version) + assert.Equal(t, 1, *plan.Version) + + require.NotNil(t, plan.Id) + planId = *plan.Id + }) + + t.Run("Should publish the plan", func(t *testing.T) { + require.NotEmpty(t, planId) + apiRes, err := client.PublishPlanWithResponse(ctx, planId) + require.Nil(t, err) + + assert.Equal(t, 200, apiRes.StatusCode()) + + body := apiRes.JSON200 + require.NotNil(t, body) + }) + + startTime := time.Now() + + var subscriptionId string + + t.Run("Should create a subscription based on the plan", func(t *testing.T) { + require.NotNil(t, customer) + require.NotNil(t, customer.Id) + + create := api.SubscriptionCreate{} + err := create.FromPlanSubscriptionCreate(api.PlanSubscriptionCreate{ + ActiveFrom: startTime, + CustomerId: *customer.Id, + Name: "Test Subscription", + Description: lo.ToPtr("Test Subscription Description"), + Plan: api.PlanReferenceInput{ + Key: PlanKey, + Version: lo.ToPtr(1), + }, + }) + require.Nil(t, err) + + // FIXME: why is this the generated type CreateSubscriptionJSONRequestBody? + apiRes, err := client.CreateSubscriptionWithResponse(ctx, create) + require.Nil(t, err) + + assert.Equal(t, 201, apiRes.StatusCode(), "received the following body: %s", apiRes.Body) + + subscription := apiRes.JSON201 + require.NotNil(t, subscription) + require.NotNil(t, subscription.Id) + + subscriptionId = *subscription.Id + }) + + t.Run("Should retrieve the subscription", func(t *testing.T) { + require.NotEmpty(t, subscriptionId) + + apiRes, err := client.GetSubscriptionWithResponse(ctx, subscriptionId, nil) + require.Nil(t, err) + + assert.Equal(t, 200, apiRes.StatusCode(), "received the following body: %s", apiRes.Body) + + subscription := apiRes.JSON200 + require.NotNil(t, subscription) + require.NotNil(t, subscription.Id) + + assert.Equal(t, subscriptionId, *subscription.Id) + }) + + t.Run("Should edit the subscription", func(t *testing.T) { + require.NotEmpty(t, subscriptionId) + + o1 := api.SubscriptionEditOperation{} + err := o1.FromEditSubscriptionAddPhase(api.EditSubscriptionAddPhase{ + Op: "add_phase", + Phase: api.SubscriptionPhaseCreate{ + Key: "test_plan_phase_3", + Name: "Test Plan Phase 3", + StartAfter: lo.ToPtr("P5M"), + }, + }) + require.Nil(t, err) + + rc := api.RateCard{} + err = rc.FromRateCardFlatFee(api.RateCardFlatFee{ + Key: "test_plan_phase_3_rate_card_1", + Name: "Test Plan Phase 3 Rate Card 1", + }) + require.Nil(t, err) + + o2 := api.SubscriptionEditOperation{} + err = o2.FromEditSubscriptionAddItem(api.EditSubscriptionAddItem{ + Op: "add_item", + PhaseKey: "test_plan_phase_3", + RateCard: rc, + }) + require.Nil(t, err) + + // TODO: test all patches + + apiRes, err := client.EditSubscriptionWithResponse(ctx, subscriptionId, api.EditSubscriptionJSONRequestBody{ + Customizations: []api.SubscriptionEditOperation{o1, o2}, + }) + require.Nil(t, err) + + assert.Equal(t, 200, apiRes.StatusCode(), "received the following body: %s", apiRes.Body) + }) +} diff --git a/e2e/setup_test.go b/e2e/setup_test.go new file mode 100644 index 000000000..7518ad474 --- /dev/null +++ b/e2e/setup_test.go @@ -0,0 +1,24 @@ +package e2e + +import ( + "os" + "testing" + + "github.com/stretchr/testify/require" + + api "github.com/openmeterio/openmeter/api/client/go" +) + +func initClient(t *testing.T) *api.ClientWithResponses { + t.Helper() + + address := os.Getenv("OPENMETER_ADDRESS") + if address == "" { + t.Skip("OPENMETER_ADDRESS not set") + } + + client, err := api.NewClientWithResponses(address) + require.NoError(t, err) + + return client +} diff --git a/openmeter/ent/db/client.go b/openmeter/ent/db/client.go index 2cb726d41..dc5878f7a 100644 --- a/openmeter/ent/db/client.go +++ b/openmeter/ent/db/client.go @@ -3483,7 +3483,7 @@ func (c *EntitlementClient) QuerySubscriptionItem(e *Entitlement) *SubscriptionI step := sqlgraph.NewStep( sqlgraph.From(entitlement.Table, entitlement.FieldID, id), sqlgraph.To(subscriptionitem.Table, subscriptionitem.FieldID), - sqlgraph.Edge(sqlgraph.M2O, false, entitlement.SubscriptionItemTable, entitlement.SubscriptionItemColumn), + sqlgraph.Edge(sqlgraph.O2M, false, entitlement.SubscriptionItemTable, entitlement.SubscriptionItemColumn), ) fromV = sqlgraph.Neighbors(e.driver.Dialect(), step) return fromV, nil @@ -5250,7 +5250,7 @@ func (c *SubscriptionItemClient) QueryEntitlement(si *SubscriptionItem) *Entitle step := sqlgraph.NewStep( sqlgraph.From(subscriptionitem.Table, subscriptionitem.FieldID, id), sqlgraph.To(entitlement.Table, entitlement.FieldID), - sqlgraph.Edge(sqlgraph.M2O, false, subscriptionitem.EntitlementTable, subscriptionitem.EntitlementColumn), + sqlgraph.Edge(sqlgraph.M2O, true, subscriptionitem.EntitlementTable, subscriptionitem.EntitlementColumn), ) fromV = sqlgraph.Neighbors(si.driver.Dialect(), step) return fromV, nil diff --git a/openmeter/ent/db/entitlement.go b/openmeter/ent/db/entitlement.go index c1ddefa4d..75859cf90 100644 --- a/openmeter/ent/db/entitlement.go +++ b/openmeter/ent/db/entitlement.go @@ -12,7 +12,6 @@ import ( "entgo.io/ent/dialect/sql" "github.com/openmeterio/openmeter/openmeter/ent/db/entitlement" "github.com/openmeterio/openmeter/openmeter/ent/db/feature" - "github.com/openmeterio/openmeter/openmeter/ent/db/subscriptionitem" ) // Entitlement is the model entity for the Entitlement schema. @@ -66,9 +65,8 @@ type Entitlement struct { SubscriptionManaged bool `json:"subscription_managed,omitempty"` // Edges holds the relations/edges for other nodes in the graph. // The values are being populated by the EntitlementQuery when eager-loading is set. - Edges EntitlementEdges `json:"edges"` - entitlement_subscription_item *string - selectValues sql.SelectValues + Edges EntitlementEdges `json:"edges"` + selectValues sql.SelectValues } // EntitlementEdges holds the relations/edges for other nodes in the graph. @@ -80,7 +78,7 @@ type EntitlementEdges struct { // BalanceSnapshot holds the value of the balance_snapshot edge. BalanceSnapshot []*BalanceSnapshot `json:"balance_snapshot,omitempty"` // SubscriptionItem holds the value of the subscription_item edge. - SubscriptionItem *SubscriptionItem `json:"subscription_item,omitempty"` + SubscriptionItem []*SubscriptionItem `json:"subscription_item,omitempty"` // Feature holds the value of the feature edge. Feature *Feature `json:"feature,omitempty"` // loadedTypes holds the information for reporting if a @@ -116,12 +114,10 @@ func (e EntitlementEdges) BalanceSnapshotOrErr() ([]*BalanceSnapshot, error) { } // SubscriptionItemOrErr returns the SubscriptionItem value or an error if the edge -// was not loaded in eager-loading, or loaded but was not found. -func (e EntitlementEdges) SubscriptionItemOrErr() (*SubscriptionItem, error) { - if e.SubscriptionItem != nil { +// was not loaded in eager-loading. +func (e EntitlementEdges) SubscriptionItemOrErr() ([]*SubscriptionItem, error) { + if e.loadedTypes[3] { return e.SubscriptionItem, nil - } else if e.loadedTypes[3] { - return nil, &NotFoundError{label: subscriptionitem.Label} } return nil, &NotLoadedError{edge: "subscription_item"} } @@ -154,8 +150,6 @@ func (*Entitlement) scanValues(columns []string) ([]any, error) { values[i] = new(sql.NullString) case entitlement.FieldCreatedAt, entitlement.FieldUpdatedAt, entitlement.FieldDeletedAt, entitlement.FieldActiveFrom, entitlement.FieldActiveTo, entitlement.FieldMeasureUsageFrom, entitlement.FieldUsagePeriodAnchor, entitlement.FieldCurrentUsagePeriodStart, entitlement.FieldCurrentUsagePeriodEnd: values[i] = new(sql.NullTime) - case entitlement.ForeignKeys[0]: // entitlement_subscription_item - values[i] = new(sql.NullString) default: values[i] = new(sql.UnknownType) } @@ -325,13 +319,6 @@ func (e *Entitlement) assignValues(columns []string, values []any) error { } else if value.Valid { e.SubscriptionManaged = value.Bool } - case entitlement.ForeignKeys[0]: - if value, ok := values[i].(*sql.NullString); !ok { - return fmt.Errorf("unexpected type %T for field entitlement_subscription_item", values[i]) - } else if value.Valid { - e.entitlement_subscription_item = new(string) - *e.entitlement_subscription_item = value.String - } default: e.selectValues.Set(columns[i], values[i]) } diff --git a/openmeter/ent/db/entitlement/entitlement.go b/openmeter/ent/db/entitlement/entitlement.go index 1e4a679d4..6a63910d1 100644 --- a/openmeter/ent/db/entitlement/entitlement.go +++ b/openmeter/ent/db/entitlement/entitlement.go @@ -93,12 +93,12 @@ const ( // BalanceSnapshotColumn is the table column denoting the balance_snapshot relation/edge. BalanceSnapshotColumn = "owner_id" // SubscriptionItemTable is the table that holds the subscription_item relation/edge. - SubscriptionItemTable = "entitlements" + SubscriptionItemTable = "subscription_items" // SubscriptionItemInverseTable is the table name for the SubscriptionItem entity. // It exists in this package in order to avoid circular dependency with the "subscriptionitem" package. SubscriptionItemInverseTable = "subscription_items" // SubscriptionItemColumn is the table column denoting the subscription_item relation/edge. - SubscriptionItemColumn = "entitlement_subscription_item" + SubscriptionItemColumn = "entitlement_id" // FeatureTable is the table that holds the feature relation/edge. FeatureTable = "entitlements" // FeatureInverseTable is the table name for the Feature entity. @@ -135,12 +135,6 @@ var Columns = []string{ FieldSubscriptionManaged, } -// ForeignKeys holds the SQL foreign-keys that are owned by the "entitlements" -// table and are not defined as standalone fields in the schema. -var ForeignKeys = []string{ - "entitlement_subscription_item", -} - // ValidColumn reports if the column name is valid (part of the table columns). func ValidColumn(column string) bool { for i := range Columns { @@ -148,11 +142,6 @@ func ValidColumn(column string) bool { return true } } - for i := range ForeignKeys { - if column == ForeignKeys[i] { - return true - } - } return false } @@ -372,10 +361,17 @@ func ByBalanceSnapshot(term sql.OrderTerm, terms ...sql.OrderTerm) OrderOption { } } -// BySubscriptionItemField orders the results by subscription_item field. -func BySubscriptionItemField(field string, opts ...sql.OrderTermOption) OrderOption { +// BySubscriptionItemCount orders the results by subscription_item count. +func BySubscriptionItemCount(opts ...sql.OrderTermOption) OrderOption { + return func(s *sql.Selector) { + sqlgraph.OrderByNeighborsCount(s, newSubscriptionItemStep(), opts...) + } +} + +// BySubscriptionItem orders the results by subscription_item terms. +func BySubscriptionItem(term sql.OrderTerm, terms ...sql.OrderTerm) OrderOption { return func(s *sql.Selector) { - sqlgraph.OrderByNeighborTerms(s, newSubscriptionItemStep(), sql.OrderByField(field, opts...)) + sqlgraph.OrderByNeighborTerms(s, newSubscriptionItemStep(), append([]sql.OrderTerm{term}, terms...)...) } } @@ -410,7 +406,7 @@ func newSubscriptionItemStep() *sqlgraph.Step { return sqlgraph.NewStep( sqlgraph.From(Table, FieldID), sqlgraph.To(SubscriptionItemInverseTable, FieldID), - sqlgraph.Edge(sqlgraph.M2O, false, SubscriptionItemTable, SubscriptionItemColumn), + sqlgraph.Edge(sqlgraph.O2M, false, SubscriptionItemTable, SubscriptionItemColumn), ) } func newFeatureStep() *sqlgraph.Step { diff --git a/openmeter/ent/db/entitlement/where.go b/openmeter/ent/db/entitlement/where.go index febafe0ac..f380f03e5 100644 --- a/openmeter/ent/db/entitlement/where.go +++ b/openmeter/ent/db/entitlement/where.go @@ -1149,7 +1149,7 @@ func HasSubscriptionItem() predicate.Entitlement { return predicate.Entitlement(func(s *sql.Selector) { step := sqlgraph.NewStep( sqlgraph.From(Table, FieldID), - sqlgraph.Edge(sqlgraph.M2O, false, SubscriptionItemTable, SubscriptionItemColumn), + sqlgraph.Edge(sqlgraph.O2M, false, SubscriptionItemTable, SubscriptionItemColumn), ) sqlgraph.HasNeighbors(s, step) }) diff --git a/openmeter/ent/db/entitlement_create.go b/openmeter/ent/db/entitlement_create.go index c1e11bf6f..a5f7549c5 100644 --- a/openmeter/ent/db/entitlement_create.go +++ b/openmeter/ent/db/entitlement_create.go @@ -339,23 +339,19 @@ func (ec *EntitlementCreate) AddBalanceSnapshot(b ...*BalanceSnapshot) *Entitlem return ec.AddBalanceSnapshotIDs(ids...) } -// SetSubscriptionItemID sets the "subscription_item" edge to the SubscriptionItem entity by ID. -func (ec *EntitlementCreate) SetSubscriptionItemID(id string) *EntitlementCreate { - ec.mutation.SetSubscriptionItemID(id) +// AddSubscriptionItemIDs adds the "subscription_item" edge to the SubscriptionItem entity by IDs. +func (ec *EntitlementCreate) AddSubscriptionItemIDs(ids ...string) *EntitlementCreate { + ec.mutation.AddSubscriptionItemIDs(ids...) return ec } -// SetNillableSubscriptionItemID sets the "subscription_item" edge to the SubscriptionItem entity by ID if the given value is not nil. -func (ec *EntitlementCreate) SetNillableSubscriptionItemID(id *string) *EntitlementCreate { - if id != nil { - ec = ec.SetSubscriptionItemID(*id) +// AddSubscriptionItem adds the "subscription_item" edges to the SubscriptionItem entity. +func (ec *EntitlementCreate) AddSubscriptionItem(s ...*SubscriptionItem) *EntitlementCreate { + ids := make([]string, len(s)) + for i := range s { + ids[i] = s[i].ID } - return ec -} - -// SetSubscriptionItem sets the "subscription_item" edge to the SubscriptionItem entity. -func (ec *EntitlementCreate) SetSubscriptionItem(s *SubscriptionItem) *EntitlementCreate { - return ec.SetSubscriptionItemID(s.ID) + return ec.AddSubscriptionItemIDs(ids...) } // SetFeature sets the "feature" edge to the Feature entity. @@ -633,7 +629,7 @@ func (ec *EntitlementCreate) createSpec() (*Entitlement, *sqlgraph.CreateSpec) { } if nodes := ec.mutation.SubscriptionItemIDs(); len(nodes) > 0 { edge := &sqlgraph.EdgeSpec{ - Rel: sqlgraph.M2O, + Rel: sqlgraph.O2M, Inverse: false, Table: entitlement.SubscriptionItemTable, Columns: []string{entitlement.SubscriptionItemColumn}, @@ -645,7 +641,6 @@ func (ec *EntitlementCreate) createSpec() (*Entitlement, *sqlgraph.CreateSpec) { for _, k := range nodes { edge.Target.Nodes = append(edge.Target.Nodes, k) } - _node.entitlement_subscription_item = &nodes[0] _spec.Edges = append(_spec.Edges, edge) } if nodes := ec.mutation.FeatureIDs(); len(nodes) > 0 { diff --git a/openmeter/ent/db/entitlement_query.go b/openmeter/ent/db/entitlement_query.go index 6db5dc048..a491ed164 100644 --- a/openmeter/ent/db/entitlement_query.go +++ b/openmeter/ent/db/entitlement_query.go @@ -34,7 +34,6 @@ type EntitlementQuery struct { withBalanceSnapshot *BalanceSnapshotQuery withSubscriptionItem *SubscriptionItemQuery withFeature *FeatureQuery - withFKs bool modifiers []func(*sql.Selector) // intermediate query (i.e. traversal path). sql *sql.Selector @@ -152,7 +151,7 @@ func (eq *EntitlementQuery) QuerySubscriptionItem() *SubscriptionItemQuery { step := sqlgraph.NewStep( sqlgraph.From(entitlement.Table, entitlement.FieldID, selector), sqlgraph.To(subscriptionitem.Table, subscriptionitem.FieldID), - sqlgraph.Edge(sqlgraph.M2O, false, entitlement.SubscriptionItemTable, entitlement.SubscriptionItemColumn), + sqlgraph.Edge(sqlgraph.O2M, false, entitlement.SubscriptionItemTable, entitlement.SubscriptionItemColumn), ) fromU = sqlgraph.SetNeighbors(eq.driver.Dialect(), step) return fromU, nil @@ -517,7 +516,6 @@ func (eq *EntitlementQuery) prepareQuery(ctx context.Context) error { func (eq *EntitlementQuery) sqlAll(ctx context.Context, hooks ...queryHook) ([]*Entitlement, error) { var ( nodes = []*Entitlement{} - withFKs = eq.withFKs _spec = eq.querySpec() loadedTypes = [5]bool{ eq.withUsageReset != nil, @@ -527,12 +525,6 @@ func (eq *EntitlementQuery) sqlAll(ctx context.Context, hooks ...queryHook) ([]* eq.withFeature != nil, } ) - if eq.withSubscriptionItem != nil { - withFKs = true - } - if withFKs { - _spec.Node.Columns = append(_spec.Node.Columns, entitlement.ForeignKeys...) - } _spec.ScanValues = func(columns []string) ([]any, error) { return (*Entitlement).scanValues(nil, columns) } @@ -576,8 +568,11 @@ func (eq *EntitlementQuery) sqlAll(ctx context.Context, hooks ...queryHook) ([]* } } if query := eq.withSubscriptionItem; query != nil { - if err := eq.loadSubscriptionItem(ctx, query, nodes, nil, - func(n *Entitlement, e *SubscriptionItem) { n.Edges.SubscriptionItem = e }); err != nil { + if err := eq.loadSubscriptionItem(ctx, query, nodes, + func(n *Entitlement) { n.Edges.SubscriptionItem = []*SubscriptionItem{} }, + func(n *Entitlement, e *SubscriptionItem) { + n.Edges.SubscriptionItem = append(n.Edges.SubscriptionItem, e) + }); err != nil { return nil, err } } @@ -681,34 +676,35 @@ func (eq *EntitlementQuery) loadBalanceSnapshot(ctx context.Context, query *Bala return nil } func (eq *EntitlementQuery) loadSubscriptionItem(ctx context.Context, query *SubscriptionItemQuery, nodes []*Entitlement, init func(*Entitlement), assign func(*Entitlement, *SubscriptionItem)) error { - ids := make([]string, 0, len(nodes)) - nodeids := make(map[string][]*Entitlement) + fks := make([]driver.Value, 0, len(nodes)) + nodeids := make(map[string]*Entitlement) for i := range nodes { - if nodes[i].entitlement_subscription_item == nil { - continue - } - fk := *nodes[i].entitlement_subscription_item - if _, ok := nodeids[fk]; !ok { - ids = append(ids, fk) + fks = append(fks, nodes[i].ID) + nodeids[nodes[i].ID] = nodes[i] + if init != nil { + init(nodes[i]) } - nodeids[fk] = append(nodeids[fk], nodes[i]) } - if len(ids) == 0 { - return nil + if len(query.ctx.Fields) > 0 { + query.ctx.AppendFieldOnce(subscriptionitem.FieldEntitlementID) } - query.Where(subscriptionitem.IDIn(ids...)) + query.Where(predicate.SubscriptionItem(func(s *sql.Selector) { + s.Where(sql.InValues(s.C(entitlement.SubscriptionItemColumn), fks...)) + })) neighbors, err := query.All(ctx) if err != nil { return err } for _, n := range neighbors { - nodes, ok := nodeids[n.ID] - if !ok { - return fmt.Errorf(`unexpected foreign-key "entitlement_subscription_item" returned %v`, n.ID) + fk := n.EntitlementID + if fk == nil { + return fmt.Errorf(`foreign-key "entitlement_id" is nil for node %v`, n.ID) } - for i := range nodes { - assign(nodes[i], n) + node, ok := nodeids[*fk] + if !ok { + return fmt.Errorf(`unexpected referenced foreign-key "entitlement_id" returned %v for node %v`, *fk, n.ID) } + assign(node, n) } return nil } diff --git a/openmeter/ent/db/entitlement_update.go b/openmeter/ent/db/entitlement_update.go index c68fac101..d54c0024b 100644 --- a/openmeter/ent/db/entitlement_update.go +++ b/openmeter/ent/db/entitlement_update.go @@ -214,23 +214,19 @@ func (eu *EntitlementUpdate) AddBalanceSnapshot(b ...*BalanceSnapshot) *Entitlem return eu.AddBalanceSnapshotIDs(ids...) } -// SetSubscriptionItemID sets the "subscription_item" edge to the SubscriptionItem entity by ID. -func (eu *EntitlementUpdate) SetSubscriptionItemID(id string) *EntitlementUpdate { - eu.mutation.SetSubscriptionItemID(id) +// AddSubscriptionItemIDs adds the "subscription_item" edge to the SubscriptionItem entity by IDs. +func (eu *EntitlementUpdate) AddSubscriptionItemIDs(ids ...string) *EntitlementUpdate { + eu.mutation.AddSubscriptionItemIDs(ids...) return eu } -// SetNillableSubscriptionItemID sets the "subscription_item" edge to the SubscriptionItem entity by ID if the given value is not nil. -func (eu *EntitlementUpdate) SetNillableSubscriptionItemID(id *string) *EntitlementUpdate { - if id != nil { - eu = eu.SetSubscriptionItemID(*id) +// AddSubscriptionItem adds the "subscription_item" edges to the SubscriptionItem entity. +func (eu *EntitlementUpdate) AddSubscriptionItem(s ...*SubscriptionItem) *EntitlementUpdate { + ids := make([]string, len(s)) + for i := range s { + ids[i] = s[i].ID } - return eu -} - -// SetSubscriptionItem sets the "subscription_item" edge to the SubscriptionItem entity. -func (eu *EntitlementUpdate) SetSubscriptionItem(s *SubscriptionItem) *EntitlementUpdate { - return eu.SetSubscriptionItemID(s.ID) + return eu.AddSubscriptionItemIDs(ids...) } // Mutation returns the EntitlementMutation object of the builder. @@ -301,12 +297,27 @@ func (eu *EntitlementUpdate) RemoveBalanceSnapshot(b ...*BalanceSnapshot) *Entit return eu.RemoveBalanceSnapshotIDs(ids...) } -// ClearSubscriptionItem clears the "subscription_item" edge to the SubscriptionItem entity. +// ClearSubscriptionItem clears all "subscription_item" edges to the SubscriptionItem entity. func (eu *EntitlementUpdate) ClearSubscriptionItem() *EntitlementUpdate { eu.mutation.ClearSubscriptionItem() return eu } +// RemoveSubscriptionItemIDs removes the "subscription_item" edge to SubscriptionItem entities by IDs. +func (eu *EntitlementUpdate) RemoveSubscriptionItemIDs(ids ...string) *EntitlementUpdate { + eu.mutation.RemoveSubscriptionItemIDs(ids...) + return eu +} + +// RemoveSubscriptionItem removes "subscription_item" edges to SubscriptionItem entities. +func (eu *EntitlementUpdate) RemoveSubscriptionItem(s ...*SubscriptionItem) *EntitlementUpdate { + ids := make([]string, len(s)) + for i := range s { + ids[i] = s[i].ID + } + return eu.RemoveSubscriptionItemIDs(ids...) +} + // Save executes the query and returns the number of nodes affected by the update operation. func (eu *EntitlementUpdate) Save(ctx context.Context) (int, error) { eu.defaults() @@ -574,7 +585,20 @@ func (eu *EntitlementUpdate) sqlSave(ctx context.Context) (n int, err error) { } if eu.mutation.SubscriptionItemCleared() { edge := &sqlgraph.EdgeSpec{ - Rel: sqlgraph.M2O, + Rel: sqlgraph.O2M, + Inverse: false, + Table: entitlement.SubscriptionItemTable, + Columns: []string{entitlement.SubscriptionItemColumn}, + Bidi: false, + Target: &sqlgraph.EdgeTarget{ + IDSpec: sqlgraph.NewFieldSpec(subscriptionitem.FieldID, field.TypeString), + }, + } + _spec.Edges.Clear = append(_spec.Edges.Clear, edge) + } + if nodes := eu.mutation.RemovedSubscriptionItemIDs(); len(nodes) > 0 && !eu.mutation.SubscriptionItemCleared() { + edge := &sqlgraph.EdgeSpec{ + Rel: sqlgraph.O2M, Inverse: false, Table: entitlement.SubscriptionItemTable, Columns: []string{entitlement.SubscriptionItemColumn}, @@ -583,11 +607,14 @@ func (eu *EntitlementUpdate) sqlSave(ctx context.Context) (n int, err error) { IDSpec: sqlgraph.NewFieldSpec(subscriptionitem.FieldID, field.TypeString), }, } + for _, k := range nodes { + edge.Target.Nodes = append(edge.Target.Nodes, k) + } _spec.Edges.Clear = append(_spec.Edges.Clear, edge) } if nodes := eu.mutation.SubscriptionItemIDs(); len(nodes) > 0 { edge := &sqlgraph.EdgeSpec{ - Rel: sqlgraph.M2O, + Rel: sqlgraph.O2M, Inverse: false, Table: entitlement.SubscriptionItemTable, Columns: []string{entitlement.SubscriptionItemColumn}, @@ -802,23 +829,19 @@ func (euo *EntitlementUpdateOne) AddBalanceSnapshot(b ...*BalanceSnapshot) *Enti return euo.AddBalanceSnapshotIDs(ids...) } -// SetSubscriptionItemID sets the "subscription_item" edge to the SubscriptionItem entity by ID. -func (euo *EntitlementUpdateOne) SetSubscriptionItemID(id string) *EntitlementUpdateOne { - euo.mutation.SetSubscriptionItemID(id) +// AddSubscriptionItemIDs adds the "subscription_item" edge to the SubscriptionItem entity by IDs. +func (euo *EntitlementUpdateOne) AddSubscriptionItemIDs(ids ...string) *EntitlementUpdateOne { + euo.mutation.AddSubscriptionItemIDs(ids...) return euo } -// SetNillableSubscriptionItemID sets the "subscription_item" edge to the SubscriptionItem entity by ID if the given value is not nil. -func (euo *EntitlementUpdateOne) SetNillableSubscriptionItemID(id *string) *EntitlementUpdateOne { - if id != nil { - euo = euo.SetSubscriptionItemID(*id) +// AddSubscriptionItem adds the "subscription_item" edges to the SubscriptionItem entity. +func (euo *EntitlementUpdateOne) AddSubscriptionItem(s ...*SubscriptionItem) *EntitlementUpdateOne { + ids := make([]string, len(s)) + for i := range s { + ids[i] = s[i].ID } - return euo -} - -// SetSubscriptionItem sets the "subscription_item" edge to the SubscriptionItem entity. -func (euo *EntitlementUpdateOne) SetSubscriptionItem(s *SubscriptionItem) *EntitlementUpdateOne { - return euo.SetSubscriptionItemID(s.ID) + return euo.AddSubscriptionItemIDs(ids...) } // Mutation returns the EntitlementMutation object of the builder. @@ -889,12 +912,27 @@ func (euo *EntitlementUpdateOne) RemoveBalanceSnapshot(b ...*BalanceSnapshot) *E return euo.RemoveBalanceSnapshotIDs(ids...) } -// ClearSubscriptionItem clears the "subscription_item" edge to the SubscriptionItem entity. +// ClearSubscriptionItem clears all "subscription_item" edges to the SubscriptionItem entity. func (euo *EntitlementUpdateOne) ClearSubscriptionItem() *EntitlementUpdateOne { euo.mutation.ClearSubscriptionItem() return euo } +// RemoveSubscriptionItemIDs removes the "subscription_item" edge to SubscriptionItem entities by IDs. +func (euo *EntitlementUpdateOne) RemoveSubscriptionItemIDs(ids ...string) *EntitlementUpdateOne { + euo.mutation.RemoveSubscriptionItemIDs(ids...) + return euo +} + +// RemoveSubscriptionItem removes "subscription_item" edges to SubscriptionItem entities. +func (euo *EntitlementUpdateOne) RemoveSubscriptionItem(s ...*SubscriptionItem) *EntitlementUpdateOne { + ids := make([]string, len(s)) + for i := range s { + ids[i] = s[i].ID + } + return euo.RemoveSubscriptionItemIDs(ids...) +} + // Where appends a list predicates to the EntitlementUpdate builder. func (euo *EntitlementUpdateOne) Where(ps ...predicate.Entitlement) *EntitlementUpdateOne { euo.mutation.Where(ps...) @@ -1192,7 +1230,20 @@ func (euo *EntitlementUpdateOne) sqlSave(ctx context.Context) (_node *Entitlemen } if euo.mutation.SubscriptionItemCleared() { edge := &sqlgraph.EdgeSpec{ - Rel: sqlgraph.M2O, + Rel: sqlgraph.O2M, + Inverse: false, + Table: entitlement.SubscriptionItemTable, + Columns: []string{entitlement.SubscriptionItemColumn}, + Bidi: false, + Target: &sqlgraph.EdgeTarget{ + IDSpec: sqlgraph.NewFieldSpec(subscriptionitem.FieldID, field.TypeString), + }, + } + _spec.Edges.Clear = append(_spec.Edges.Clear, edge) + } + if nodes := euo.mutation.RemovedSubscriptionItemIDs(); len(nodes) > 0 && !euo.mutation.SubscriptionItemCleared() { + edge := &sqlgraph.EdgeSpec{ + Rel: sqlgraph.O2M, Inverse: false, Table: entitlement.SubscriptionItemTable, Columns: []string{entitlement.SubscriptionItemColumn}, @@ -1201,11 +1252,14 @@ func (euo *EntitlementUpdateOne) sqlSave(ctx context.Context) (_node *Entitlemen IDSpec: sqlgraph.NewFieldSpec(subscriptionitem.FieldID, field.TypeString), }, } + for _, k := range nodes { + edge.Target.Nodes = append(edge.Target.Nodes, k) + } _spec.Edges.Clear = append(_spec.Edges.Clear, edge) } if nodes := euo.mutation.SubscriptionItemIDs(); len(nodes) > 0 { edge := &sqlgraph.EdgeSpec{ - Rel: sqlgraph.M2O, + Rel: sqlgraph.O2M, Inverse: false, Table: entitlement.SubscriptionItemTable, Columns: []string{entitlement.SubscriptionItemColumn}, diff --git a/openmeter/ent/db/feature_query.go b/openmeter/ent/db/feature_query.go index eb5c6761f..b2d34e4fd 100644 --- a/openmeter/ent/db/feature_query.go +++ b/openmeter/ent/db/feature_query.go @@ -462,7 +462,6 @@ func (fq *FeatureQuery) loadEntitlement(ctx context.Context, query *EntitlementQ init(nodes[i]) } } - query.withFKs = true if len(query.ctx.Fields) > 0 { query.ctx.AppendFieldOnce(entitlement.FieldFeatureID) } diff --git a/openmeter/ent/db/migrate/schema.go b/openmeter/ent/db/migrate/schema.go index ed1f4f538..81e28dc48 100644 --- a/openmeter/ent/db/migrate/schema.go +++ b/openmeter/ent/db/migrate/schema.go @@ -912,7 +912,6 @@ var ( {Name: "current_usage_period_start", Type: field.TypeTime, Nullable: true}, {Name: "current_usage_period_end", Type: field.TypeTime, Nullable: true}, {Name: "subscription_managed", Type: field.TypeBool, Nullable: true}, - {Name: "entitlement_subscription_item", Type: field.TypeString, Nullable: true, SchemaType: map[string]string{"postgres": "char(26)"}}, {Name: "feature_id", Type: field.TypeString, SchemaType: map[string]string{"postgres": "char(26)"}}, } // EntitlementsTable holds the schema information for the "entitlements" table. @@ -921,15 +920,9 @@ var ( Columns: EntitlementsColumns, PrimaryKey: []*schema.Column{EntitlementsColumns[0]}, ForeignKeys: []*schema.ForeignKey{ - { - Symbol: "entitlements_subscription_items_subscription_item", - Columns: []*schema.Column{EntitlementsColumns[22]}, - RefColumns: []*schema.Column{SubscriptionItemsColumns[0]}, - OnDelete: schema.SetNull, - }, { Symbol: "entitlements_features_entitlement", - Columns: []*schema.Column{EntitlementsColumns[23]}, + Columns: []*schema.Column{EntitlementsColumns[22]}, RefColumns: []*schema.Column{FeaturesColumns[0]}, OnDelete: schema.NoAction, }, @@ -963,7 +956,7 @@ var ( { Name: "entitlement_namespace_feature_id_id", Unique: false, - Columns: []*schema.Column{EntitlementsColumns[1], EntitlementsColumns[23], EntitlementsColumns[0]}, + Columns: []*schema.Column{EntitlementsColumns[1], EntitlementsColumns[22], EntitlementsColumns[0]}, }, { Name: "entitlement_namespace_current_usage_period_end", @@ -1437,6 +1430,8 @@ var ( {Name: "metadata", Type: field.TypeJSON, Nullable: true, SchemaType: map[string]string{"postgres": "jsonb"}}, {Name: "active_from", Type: field.TypeTime}, {Name: "active_to", Type: field.TypeTime, Nullable: true}, + {Name: "name", Type: field.TypeString, Default: "Subscription"}, + {Name: "description", Type: field.TypeString, Nullable: true}, {Name: "plan_key", Type: field.TypeString}, {Name: "plan_version", Type: field.TypeInt}, {Name: "currency", Type: field.TypeString, Size: 3}, @@ -1450,7 +1445,7 @@ var ( ForeignKeys: []*schema.ForeignKey{ { Symbol: "subscriptions_customers_subscription", - Columns: []*schema.Column{SubscriptionsColumns[11]}, + Columns: []*schema.Column{SubscriptionsColumns[13]}, RefColumns: []*schema.Column{CustomersColumns[0]}, OnDelete: schema.NoAction, }, @@ -1474,7 +1469,7 @@ var ( { Name: "subscription_namespace_customer_id", Unique: false, - Columns: []*schema.Column{SubscriptionsColumns[1], SubscriptionsColumns[11]}, + Columns: []*schema.Column{SubscriptionsColumns[1], SubscriptionsColumns[13]}, }, }, } @@ -1508,7 +1503,7 @@ var ( PrimaryKey: []*schema.Column{SubscriptionItemsColumns[0]}, ForeignKeys: []*schema.ForeignKey{ { - Symbol: "subscription_items_entitlements_entitlement", + Symbol: "subscription_items_entitlements_subscription_item", Columns: []*schema.Column{SubscriptionItemsColumns[18]}, RefColumns: []*schema.Column{EntitlementsColumns[0]}, OnDelete: schema.SetNull, @@ -1757,8 +1752,7 @@ func init() { BillingProfilesTable.ForeignKeys[2].RefTable = AppsTable BillingProfilesTable.ForeignKeys[3].RefTable = BillingWorkflowConfigsTable CustomerSubjectsTable.ForeignKeys[0].RefTable = CustomersTable - EntitlementsTable.ForeignKeys[0].RefTable = SubscriptionItemsTable - EntitlementsTable.ForeignKeys[1].RefTable = FeaturesTable + EntitlementsTable.ForeignKeys[0].RefTable = FeaturesTable GrantsTable.ForeignKeys[0].RefTable = EntitlementsTable NotificationEventsTable.ForeignKeys[0].RefTable = NotificationRulesTable PlanPhasesTable.ForeignKeys[0].RefTable = PlansTable diff --git a/openmeter/ent/db/mutation.go b/openmeter/ent/db/mutation.go index b27a5dcba..0a2f0a8cb 100644 --- a/openmeter/ent/db/mutation.go +++ b/openmeter/ent/db/mutation.go @@ -20759,7 +20759,8 @@ type EntitlementMutation struct { balance_snapshot map[int]struct{} removedbalance_snapshot map[int]struct{} clearedbalance_snapshot bool - subscription_item *string + subscription_item map[string]struct{} + removedsubscription_item map[string]struct{} clearedsubscription_item bool feature *string clearedfeature bool @@ -22079,9 +22080,14 @@ func (m *EntitlementMutation) ResetBalanceSnapshot() { m.removedbalance_snapshot = nil } -// SetSubscriptionItemID sets the "subscription_item" edge to the SubscriptionItem entity by id. -func (m *EntitlementMutation) SetSubscriptionItemID(id string) { - m.subscription_item = &id +// AddSubscriptionItemIDs adds the "subscription_item" edge to the SubscriptionItem entity by ids. +func (m *EntitlementMutation) AddSubscriptionItemIDs(ids ...string) { + if m.subscription_item == nil { + m.subscription_item = make(map[string]struct{}) + } + for i := range ids { + m.subscription_item[ids[i]] = struct{}{} + } } // ClearSubscriptionItem clears the "subscription_item" edge to the SubscriptionItem entity. @@ -22094,20 +22100,29 @@ func (m *EntitlementMutation) SubscriptionItemCleared() bool { return m.clearedsubscription_item } -// SubscriptionItemID returns the "subscription_item" edge ID in the mutation. -func (m *EntitlementMutation) SubscriptionItemID() (id string, exists bool) { - if m.subscription_item != nil { - return *m.subscription_item, true +// RemoveSubscriptionItemIDs removes the "subscription_item" edge to the SubscriptionItem entity by IDs. +func (m *EntitlementMutation) RemoveSubscriptionItemIDs(ids ...string) { + if m.removedsubscription_item == nil { + m.removedsubscription_item = make(map[string]struct{}) + } + for i := range ids { + delete(m.subscription_item, ids[i]) + m.removedsubscription_item[ids[i]] = struct{}{} + } +} + +// RemovedSubscriptionItem returns the removed IDs of the "subscription_item" edge to the SubscriptionItem entity. +func (m *EntitlementMutation) RemovedSubscriptionItemIDs() (ids []string) { + for id := range m.removedsubscription_item { + ids = append(ids, id) } return } // SubscriptionItemIDs returns the "subscription_item" edge IDs in the mutation. -// Note that IDs always returns len(IDs) <= 1 for unique edges, and you should use -// SubscriptionItemID instead. It exists only for internal usage by the builders. func (m *EntitlementMutation) SubscriptionItemIDs() (ids []string) { - if id := m.subscription_item; id != nil { - ids = append(ids, *id) + for id := range m.subscription_item { + ids = append(ids, id) } return } @@ -22116,6 +22131,7 @@ func (m *EntitlementMutation) SubscriptionItemIDs() (ids []string) { func (m *EntitlementMutation) ResetSubscriptionItem() { m.subscription_item = nil m.clearedsubscription_item = false + m.removedsubscription_item = nil } // ClearFeature clears the "feature" edge to the Feature entity. @@ -22797,9 +22813,11 @@ func (m *EntitlementMutation) AddedIDs(name string) []ent.Value { } return ids case entitlement.EdgeSubscriptionItem: - if id := m.subscription_item; id != nil { - return []ent.Value{*id} + ids := make([]ent.Value, 0, len(m.subscription_item)) + for id := range m.subscription_item { + ids = append(ids, id) } + return ids case entitlement.EdgeFeature: if id := m.feature; id != nil { return []ent.Value{*id} @@ -22820,6 +22838,9 @@ func (m *EntitlementMutation) RemovedEdges() []string { if m.removedbalance_snapshot != nil { edges = append(edges, entitlement.EdgeBalanceSnapshot) } + if m.removedsubscription_item != nil { + edges = append(edges, entitlement.EdgeSubscriptionItem) + } return edges } @@ -22845,6 +22866,12 @@ func (m *EntitlementMutation) RemovedIDs(name string) []ent.Value { ids = append(ids, id) } return ids + case entitlement.EdgeSubscriptionItem: + ids := make([]ent.Value, 0, len(m.removedsubscription_item)) + for id := range m.removedsubscription_item { + ids = append(ids, id) + } + return ids } return nil } @@ -22892,9 +22919,6 @@ func (m *EntitlementMutation) EdgeCleared(name string) bool { // if that edge is not defined in the schema. func (m *EntitlementMutation) ClearEdge(name string) error { switch name { - case entitlement.EdgeSubscriptionItem: - m.ClearSubscriptionItem() - return nil case entitlement.EdgeFeature: m.ClearFeature() return nil @@ -32462,6 +32486,8 @@ type SubscriptionMutation struct { metadata *map[string]string active_from *time.Time active_to *time.Time + name *string + description *string plan_key *string plan_version *int addplan_version *int @@ -32872,6 +32898,91 @@ func (m *SubscriptionMutation) ResetActiveTo() { delete(m.clearedFields, subscription.FieldActiveTo) } +// SetName sets the "name" field. +func (m *SubscriptionMutation) SetName(s string) { + m.name = &s +} + +// Name returns the value of the "name" field in the mutation. +func (m *SubscriptionMutation) Name() (r string, exists bool) { + v := m.name + if v == nil { + return + } + return *v, true +} + +// OldName returns the old "name" field's value of the Subscription entity. +// If the Subscription object wasn't provided to the builder, the object is fetched from the database. +// An error is returned if the mutation operation is not UpdateOne, or the database query fails. +func (m *SubscriptionMutation) OldName(ctx context.Context) (v string, err error) { + if !m.op.Is(OpUpdateOne) { + return v, errors.New("OldName is only allowed on UpdateOne operations") + } + if m.id == nil || m.oldValue == nil { + return v, errors.New("OldName requires an ID field in the mutation") + } + oldValue, err := m.oldValue(ctx) + if err != nil { + return v, fmt.Errorf("querying old value for OldName: %w", err) + } + return oldValue.Name, nil +} + +// ResetName resets all changes to the "name" field. +func (m *SubscriptionMutation) ResetName() { + m.name = nil +} + +// SetDescription sets the "description" field. +func (m *SubscriptionMutation) SetDescription(s string) { + m.description = &s +} + +// Description returns the value of the "description" field in the mutation. +func (m *SubscriptionMutation) Description() (r string, exists bool) { + v := m.description + if v == nil { + return + } + return *v, true +} + +// OldDescription returns the old "description" field's value of the Subscription entity. +// If the Subscription object wasn't provided to the builder, the object is fetched from the database. +// An error is returned if the mutation operation is not UpdateOne, or the database query fails. +func (m *SubscriptionMutation) OldDescription(ctx context.Context) (v *string, err error) { + if !m.op.Is(OpUpdateOne) { + return v, errors.New("OldDescription is only allowed on UpdateOne operations") + } + if m.id == nil || m.oldValue == nil { + return v, errors.New("OldDescription requires an ID field in the mutation") + } + oldValue, err := m.oldValue(ctx) + if err != nil { + return v, fmt.Errorf("querying old value for OldDescription: %w", err) + } + return oldValue.Description, nil +} + +// ClearDescription clears the value of the "description" field. +func (m *SubscriptionMutation) ClearDescription() { + m.description = nil + m.clearedFields[subscription.FieldDescription] = struct{}{} +} + +// DescriptionCleared returns if the "description" field was cleared in this mutation. +func (m *SubscriptionMutation) DescriptionCleared() bool { + _, ok := m.clearedFields[subscription.FieldDescription] + return ok +} + +// ResetDescription resets all changes to the "description" field. +func (m *SubscriptionMutation) ResetDescription() { + m.description = nil + delete(m.clearedFields, subscription.FieldDescription) +} + // SetPlanKey sets the "plan_key" field. func (m *SubscriptionMutation) SetPlanKey(s string) { m.plan_key = &s @@ -33151,7 +33262,7 @@ func (m *SubscriptionMutation) Type() string { // order to get all numeric fields that were incremented/decremented, call // AddedFields(). func (m *SubscriptionMutation) Fields() []string { - fields := make([]string, 0, 11) + fields := make([]string, 0, 13) if m.namespace != nil { fields = append(fields, subscription.FieldNamespace) } @@ -33173,6 +33284,12 @@ func (m *SubscriptionMutation) Fields() []string { if m.active_to != nil { fields = append(fields, subscription.FieldActiveTo) } + if m.name != nil { + fields = append(fields, subscription.FieldName) + } + if m.description != nil { + fields = append(fields, subscription.FieldDescription) + } if m.plan_key != nil { fields = append(fields, subscription.FieldPlanKey) } @@ -33207,6 +33324,10 @@ func (m *SubscriptionMutation) Field(name string) (ent.Value, bool) { return m.ActiveFrom() case subscription.FieldActiveTo: return m.ActiveTo() + case subscription.FieldName: + return m.Name() + case subscription.FieldDescription: + return m.Description() case subscription.FieldPlanKey: return m.PlanKey() case subscription.FieldPlanVersion: @@ -33238,6 +33359,10 @@ func (m *SubscriptionMutation) OldField(ctx context.Context, name string) (ent.V return m.OldActiveFrom(ctx) case subscription.FieldActiveTo: return m.OldActiveTo(ctx) + case subscription.FieldName: + return m.OldName(ctx) + case subscription.FieldDescription: + return m.OldDescription(ctx) case subscription.FieldPlanKey: return m.OldPlanKey(ctx) case subscription.FieldPlanVersion: @@ -33304,6 +33429,20 @@ func (m *SubscriptionMutation) SetField(name string, value ent.Value) error { } m.SetActiveTo(v) return nil + case subscription.FieldName: + v, ok := value.(string) + if !ok { + return fmt.Errorf("unexpected type %T for field %s", value, name) + } + m.SetName(v) + return nil + case subscription.FieldDescription: + v, ok := value.(string) + if !ok { + return fmt.Errorf("unexpected type %T for field %s", value, name) + } + m.SetDescription(v) + return nil case subscription.FieldPlanKey: v, ok := value.(string) if !ok { @@ -33386,6 +33525,9 @@ func (m *SubscriptionMutation) ClearedFields() []string { if m.FieldCleared(subscription.FieldActiveTo) { fields = append(fields, subscription.FieldActiveTo) } + if m.FieldCleared(subscription.FieldDescription) { + fields = append(fields, subscription.FieldDescription) + } return fields } @@ -33409,6 +33551,9 @@ func (m *SubscriptionMutation) ClearField(name string) error { case subscription.FieldActiveTo: m.ClearActiveTo() return nil + case subscription.FieldDescription: + m.ClearDescription() + return nil } return fmt.Errorf("unknown Subscription nullable field %s", name) } @@ -33438,6 +33583,12 @@ func (m *SubscriptionMutation) ResetField(name string) error { case subscription.FieldActiveTo: m.ResetActiveTo() return nil + case subscription.FieldName: + m.ResetName() + return nil + case subscription.FieldDescription: + m.ResetDescription() + return nil case subscription.FieldPlanKey: m.ResetPlanKey() return nil diff --git a/openmeter/ent/db/runtime.go b/openmeter/ent/db/runtime.go index 407d1cfca..eea10ec7f 100644 --- a/openmeter/ent/db/runtime.go +++ b/openmeter/ent/db/runtime.go @@ -1004,20 +1004,26 @@ func init() { subscription.DefaultUpdatedAt = subscriptionDescUpdatedAt.Default.(func() time.Time) // subscription.UpdateDefaultUpdatedAt holds the default value on update for the updated_at field. subscription.UpdateDefaultUpdatedAt = subscriptionDescUpdatedAt.UpdateDefault.(func() time.Time) + // subscriptionDescName is the schema descriptor for name field. + subscriptionDescName := subscriptionFields[0].Descriptor() + // subscription.DefaultName holds the default value on creation for the name field. + subscription.DefaultName = subscriptionDescName.Default.(string) + // subscription.NameValidator is a validator for the "name" field. It is called by the builders before save. + subscription.NameValidator = subscriptionDescName.Validators[0].(func(string) error) // subscriptionDescPlanKey is the schema descriptor for plan_key field. - subscriptionDescPlanKey := subscriptionFields[0].Descriptor() + subscriptionDescPlanKey := subscriptionFields[2].Descriptor() // subscription.PlanKeyValidator is a validator for the "plan_key" field. It is called by the builders before save. subscription.PlanKeyValidator = subscriptionDescPlanKey.Validators[0].(func(string) error) // subscriptionDescPlanVersion is the schema descriptor for plan_version field. - subscriptionDescPlanVersion := subscriptionFields[1].Descriptor() + subscriptionDescPlanVersion := subscriptionFields[3].Descriptor() // subscription.PlanVersionValidator is a validator for the "plan_version" field. It is called by the builders before save. subscription.PlanVersionValidator = subscriptionDescPlanVersion.Validators[0].(func(int) error) // subscriptionDescCustomerID is the schema descriptor for customer_id field. - subscriptionDescCustomerID := subscriptionFields[2].Descriptor() + subscriptionDescCustomerID := subscriptionFields[4].Descriptor() // subscription.CustomerIDValidator is a validator for the "customer_id" field. It is called by the builders before save. subscription.CustomerIDValidator = subscriptionDescCustomerID.Validators[0].(func(string) error) // subscriptionDescCurrency is the schema descriptor for currency field. - subscriptionDescCurrency := subscriptionFields[3].Descriptor() + subscriptionDescCurrency := subscriptionFields[5].Descriptor() // subscription.CurrencyValidator is a validator for the "currency" field. It is called by the builders before save. subscription.CurrencyValidator = func() func(string) error { validators := subscriptionDescCurrency.Validators diff --git a/openmeter/ent/db/setorclear.go b/openmeter/ent/db/setorclear.go index 350a6db86..5e65d4d13 100644 --- a/openmeter/ent/db/setorclear.go +++ b/openmeter/ent/db/setorclear.go @@ -1778,6 +1778,20 @@ func (u *SubscriptionUpdateOne) SetOrClearActiveTo(value *time.Time) *Subscripti return u.SetActiveTo(*value) } +func (u *SubscriptionUpdate) SetOrClearDescription(value *string) *SubscriptionUpdate { + if value == nil { + return u.ClearDescription() + } + return u.SetDescription(*value) +} + +func (u *SubscriptionUpdateOne) SetOrClearDescription(value *string) *SubscriptionUpdateOne { + if value == nil { + return u.ClearDescription() + } + return u.SetDescription(*value) +} + func (u *SubscriptionItemUpdate) SetOrClearDeletedAt(value *time.Time) *SubscriptionItemUpdate { if value == nil { return u.ClearDeletedAt() diff --git a/openmeter/ent/db/subscription.go b/openmeter/ent/db/subscription.go index 5bfbc9826..0f6915a69 100644 --- a/openmeter/ent/db/subscription.go +++ b/openmeter/ent/db/subscription.go @@ -34,6 +34,10 @@ type Subscription struct { ActiveFrom time.Time `json:"active_from,omitempty"` // ActiveTo holds the value of the "active_to" field. ActiveTo *time.Time `json:"active_to,omitempty"` + // Name holds the value of the "name" field. + Name string `json:"name,omitempty"` + // Description holds the value of the "description" field. + Description *string `json:"description,omitempty"` // PlanKey holds the value of the "plan_key" field. PlanKey string `json:"plan_key,omitempty"` // PlanVersion holds the value of the "plan_version" field. @@ -88,7 +92,7 @@ func (*Subscription) scanValues(columns []string) ([]any, error) { values[i] = new([]byte) case subscription.FieldPlanVersion: values[i] = new(sql.NullInt64) - case subscription.FieldID, subscription.FieldNamespace, subscription.FieldPlanKey, subscription.FieldCustomerID, subscription.FieldCurrency: + case subscription.FieldID, subscription.FieldNamespace, subscription.FieldName, subscription.FieldDescription, subscription.FieldPlanKey, subscription.FieldCustomerID, subscription.FieldCurrency: values[i] = new(sql.NullString) case subscription.FieldCreatedAt, subscription.FieldUpdatedAt, subscription.FieldDeletedAt, subscription.FieldActiveFrom, subscription.FieldActiveTo: values[i] = new(sql.NullTime) @@ -159,6 +163,19 @@ func (s *Subscription) assignValues(columns []string, values []any) error { s.ActiveTo = new(time.Time) *s.ActiveTo = value.Time } + case subscription.FieldName: + if value, ok := values[i].(*sql.NullString); !ok { + return fmt.Errorf("unexpected type %T for field name", values[i]) + } else if value.Valid { + s.Name = value.String + } + case subscription.FieldDescription: + if value, ok := values[i].(*sql.NullString); !ok { + return fmt.Errorf("unexpected type %T for field description", values[i]) + } else if value.Valid { + s.Description = new(string) + *s.Description = value.String + } case subscription.FieldPlanKey: if value, ok := values[i].(*sql.NullString); !ok { return fmt.Errorf("unexpected type %T for field plan_key", values[i]) @@ -254,6 +271,14 @@ func (s *Subscription) String() string { builder.WriteString(v.Format(time.ANSIC)) } builder.WriteString(", ") + builder.WriteString("name=") + builder.WriteString(s.Name) + builder.WriteString(", ") + if v := s.Description; v != nil { + builder.WriteString("description=") + builder.WriteString(*v) + } + builder.WriteString(", ") builder.WriteString("plan_key=") builder.WriteString(s.PlanKey) builder.WriteString(", ") diff --git a/openmeter/ent/db/subscription/subscription.go b/openmeter/ent/db/subscription/subscription.go index 86bf3a6a6..709a51d8d 100644 --- a/openmeter/ent/db/subscription/subscription.go +++ b/openmeter/ent/db/subscription/subscription.go @@ -28,6 +28,10 @@ const ( FieldActiveFrom = "active_from" // FieldActiveTo holds the string denoting the active_to field in the database. FieldActiveTo = "active_to" + // FieldName holds the string denoting the name field in the database. + FieldName = "name" + // FieldDescription holds the string denoting the description field in the database. + FieldDescription = "description" // FieldPlanKey holds the string denoting the plan_key field in the database. FieldPlanKey = "plan_key" // FieldPlanVersion holds the string denoting the plan_version field in the database. @@ -68,6 +72,8 @@ var Columns = []string{ FieldMetadata, FieldActiveFrom, FieldActiveTo, + FieldName, + FieldDescription, FieldPlanKey, FieldPlanVersion, FieldCustomerID, @@ -93,6 +99,10 @@ var ( DefaultUpdatedAt func() time.Time // UpdateDefaultUpdatedAt holds the default value on update for the "updated_at" field. UpdateDefaultUpdatedAt func() time.Time + // DefaultName holds the default value on creation for the "name" field. + DefaultName string + // NameValidator is a validator for the "name" field. It is called by the builders before save. + NameValidator func(string) error // PlanKeyValidator is a validator for the "plan_key" field. It is called by the builders before save. PlanKeyValidator func(string) error // PlanVersionValidator is a validator for the "plan_version" field. It is called by the builders before save. @@ -143,6 +153,16 @@ func ByActiveTo(opts ...sql.OrderTermOption) OrderOption { return sql.OrderByField(FieldActiveTo, opts...).ToFunc() } +// ByName orders the results by the name field. +func ByName(opts ...sql.OrderTermOption) OrderOption { + return sql.OrderByField(FieldName, opts...).ToFunc() +} + +// ByDescription orders the results by the description field. +func ByDescription(opts ...sql.OrderTermOption) OrderOption { + return sql.OrderByField(FieldDescription, opts...).ToFunc() +} + // ByPlanKey orders the results by the plan_key field. func ByPlanKey(opts ...sql.OrderTermOption) OrderOption { return sql.OrderByField(FieldPlanKey, opts...).ToFunc() diff --git a/openmeter/ent/db/subscription/where.go b/openmeter/ent/db/subscription/where.go index c53ade73b..fed4d80c5 100644 --- a/openmeter/ent/db/subscription/where.go +++ b/openmeter/ent/db/subscription/where.go @@ -96,6 +96,16 @@ func ActiveTo(v time.Time) predicate.Subscription { return predicate.Subscription(sql.FieldEQ(FieldActiveTo, v)) } +// Name applies equality check predicate on the "name" field. It's identical to NameEQ. +func Name(v string) predicate.Subscription { + return predicate.Subscription(sql.FieldEQ(FieldName, v)) +} + +// Description applies equality check predicate on the "description" field. It's identical to DescriptionEQ. +func Description(v string) predicate.Subscription { + return predicate.Subscription(sql.FieldEQ(FieldDescription, v)) +} + // PlanKey applies equality check predicate on the "plan_key" field. It's identical to PlanKeyEQ. func PlanKey(v string) predicate.Subscription { return predicate.Subscription(sql.FieldEQ(FieldPlanKey, v)) @@ -412,6 +422,146 @@ func ActiveToNotNil() predicate.Subscription { return predicate.Subscription(sql.FieldNotNull(FieldActiveTo)) } +// NameEQ applies the EQ predicate on the "name" field. +func NameEQ(v string) predicate.Subscription { + return predicate.Subscription(sql.FieldEQ(FieldName, v)) +} + +// NameNEQ applies the NEQ predicate on the "name" field. +func NameNEQ(v string) predicate.Subscription { + return predicate.Subscription(sql.FieldNEQ(FieldName, v)) +} + +// NameIn applies the In predicate on the "name" field. +func NameIn(vs ...string) predicate.Subscription { + return predicate.Subscription(sql.FieldIn(FieldName, vs...)) +} + +// NameNotIn applies the NotIn predicate on the "name" field. +func NameNotIn(vs ...string) predicate.Subscription { + return predicate.Subscription(sql.FieldNotIn(FieldName, vs...)) +} + +// NameGT applies the GT predicate on the "name" field. +func NameGT(v string) predicate.Subscription { + return predicate.Subscription(sql.FieldGT(FieldName, v)) +} + +// NameGTE applies the GTE predicate on the "name" field. +func NameGTE(v string) predicate.Subscription { + return predicate.Subscription(sql.FieldGTE(FieldName, v)) +} + +// NameLT applies the LT predicate on the "name" field. +func NameLT(v string) predicate.Subscription { + return predicate.Subscription(sql.FieldLT(FieldName, v)) +} + +// NameLTE applies the LTE predicate on the "name" field. +func NameLTE(v string) predicate.Subscription { + return predicate.Subscription(sql.FieldLTE(FieldName, v)) +} + +// NameContains applies the Contains predicate on the "name" field. +func NameContains(v string) predicate.Subscription { + return predicate.Subscription(sql.FieldContains(FieldName, v)) +} + +// NameHasPrefix applies the HasPrefix predicate on the "name" field. +func NameHasPrefix(v string) predicate.Subscription { + return predicate.Subscription(sql.FieldHasPrefix(FieldName, v)) +} + +// NameHasSuffix applies the HasSuffix predicate on the "name" field. +func NameHasSuffix(v string) predicate.Subscription { + return predicate.Subscription(sql.FieldHasSuffix(FieldName, v)) +} + +// NameEqualFold applies the EqualFold predicate on the "name" field. +func NameEqualFold(v string) predicate.Subscription { + return predicate.Subscription(sql.FieldEqualFold(FieldName, v)) +} + +// NameContainsFold applies the ContainsFold predicate on the "name" field. +func NameContainsFold(v string) predicate.Subscription { + return predicate.Subscription(sql.FieldContainsFold(FieldName, v)) +} + +// DescriptionEQ applies the EQ predicate on the "description" field. +func DescriptionEQ(v string) predicate.Subscription { + return predicate.Subscription(sql.FieldEQ(FieldDescription, v)) +} + +// DescriptionNEQ applies the NEQ predicate on the "description" field. +func DescriptionNEQ(v string) predicate.Subscription { + return predicate.Subscription(sql.FieldNEQ(FieldDescription, v)) +} + +// DescriptionIn applies the In predicate on the "description" field. +func DescriptionIn(vs ...string) predicate.Subscription { + return predicate.Subscription(sql.FieldIn(FieldDescription, vs...)) +} + +// DescriptionNotIn applies the NotIn predicate on the "description" field. +func DescriptionNotIn(vs ...string) predicate.Subscription { + return predicate.Subscription(sql.FieldNotIn(FieldDescription, vs...)) +} + +// DescriptionGT applies the GT predicate on the "description" field. +func DescriptionGT(v string) predicate.Subscription { + return predicate.Subscription(sql.FieldGT(FieldDescription, v)) +} + +// DescriptionGTE applies the GTE predicate on the "description" field. +func DescriptionGTE(v string) predicate.Subscription { + return predicate.Subscription(sql.FieldGTE(FieldDescription, v)) +} + +// DescriptionLT applies the LT predicate on the "description" field. +func DescriptionLT(v string) predicate.Subscription { + return predicate.Subscription(sql.FieldLT(FieldDescription, v)) +} + +// DescriptionLTE applies the LTE predicate on the "description" field. +func DescriptionLTE(v string) predicate.Subscription { + return predicate.Subscription(sql.FieldLTE(FieldDescription, v)) +} + +// DescriptionContains applies the Contains predicate on the "description" field. +func DescriptionContains(v string) predicate.Subscription { + return predicate.Subscription(sql.FieldContains(FieldDescription, v)) +} + +// DescriptionHasPrefix applies the HasPrefix predicate on the "description" field. +func DescriptionHasPrefix(v string) predicate.Subscription { + return predicate.Subscription(sql.FieldHasPrefix(FieldDescription, v)) +} + +// DescriptionHasSuffix applies the HasSuffix predicate on the "description" field. +func DescriptionHasSuffix(v string) predicate.Subscription { + return predicate.Subscription(sql.FieldHasSuffix(FieldDescription, v)) +} + +// DescriptionIsNil applies the IsNil predicate on the "description" field. +func DescriptionIsNil() predicate.Subscription { + return predicate.Subscription(sql.FieldIsNull(FieldDescription)) +} + +// DescriptionNotNil applies the NotNil predicate on the "description" field. +func DescriptionNotNil() predicate.Subscription { + return predicate.Subscription(sql.FieldNotNull(FieldDescription)) +} + +// DescriptionEqualFold applies the EqualFold predicate on the "description" field. +func DescriptionEqualFold(v string) predicate.Subscription { + return predicate.Subscription(sql.FieldEqualFold(FieldDescription, v)) +} + +// DescriptionContainsFold applies the ContainsFold predicate on the "description" field. +func DescriptionContainsFold(v string) predicate.Subscription { + return predicate.Subscription(sql.FieldContainsFold(FieldDescription, v)) +} + // PlanKeyEQ applies the EQ predicate on the "plan_key" field. func PlanKeyEQ(v string) predicate.Subscription { return predicate.Subscription(sql.FieldEQ(FieldPlanKey, v)) diff --git a/openmeter/ent/db/subscription_create.go b/openmeter/ent/db/subscription_create.go index 273fd36b0..545f8324b 100644 --- a/openmeter/ent/db/subscription_create.go +++ b/openmeter/ent/db/subscription_create.go @@ -100,6 +100,34 @@ func (sc *SubscriptionCreate) SetNillableActiveTo(t *time.Time) *SubscriptionCre return sc } +// SetName sets the "name" field. +func (sc *SubscriptionCreate) SetName(s string) *SubscriptionCreate { + sc.mutation.SetName(s) + return sc +} + +// SetNillableName sets the "name" field if the given value is not nil. +func (sc *SubscriptionCreate) SetNillableName(s *string) *SubscriptionCreate { + if s != nil { + sc.SetName(*s) + } + return sc +} + +// SetDescription sets the "description" field. +func (sc *SubscriptionCreate) SetDescription(s string) *SubscriptionCreate { + sc.mutation.SetDescription(s) + return sc +} + +// SetNillableDescription sets the "description" field if the given value is not nil. +func (sc *SubscriptionCreate) SetNillableDescription(s *string) *SubscriptionCreate { + if s != nil { + sc.SetDescription(*s) + } + return sc +} + // SetPlanKey sets the "plan_key" field. func (sc *SubscriptionCreate) SetPlanKey(s string) *SubscriptionCreate { sc.mutation.SetPlanKey(s) @@ -201,6 +229,10 @@ func (sc *SubscriptionCreate) defaults() { v := subscription.DefaultUpdatedAt() sc.mutation.SetUpdatedAt(v) } + if _, ok := sc.mutation.Name(); !ok { + v := subscription.DefaultName + sc.mutation.SetName(v) + } if _, ok := sc.mutation.ID(); !ok { v := subscription.DefaultID() sc.mutation.SetID(v) @@ -226,6 +258,14 @@ func (sc *SubscriptionCreate) check() error { if _, ok := sc.mutation.ActiveFrom(); !ok { return &ValidationError{Name: "active_from", err: errors.New(`db: missing required field "Subscription.active_from"`)} } + if _, ok := sc.mutation.Name(); !ok { + return &ValidationError{Name: "name", err: errors.New(`db: missing required field "Subscription.name"`)} + } + if v, ok := sc.mutation.Name(); ok { + if err := subscription.NameValidator(v); err != nil { + return &ValidationError{Name: "name", err: fmt.Errorf(`db: validator failed for field "Subscription.name": %w`, err)} + } + } if _, ok := sc.mutation.PlanKey(); !ok { return &ValidationError{Name: "plan_key", err: errors.New(`db: missing required field "Subscription.plan_key"`)} } @@ -325,6 +365,14 @@ func (sc *SubscriptionCreate) createSpec() (*Subscription, *sqlgraph.CreateSpec) _spec.SetField(subscription.FieldActiveTo, field.TypeTime, value) _node.ActiveTo = &value } + if value, ok := sc.mutation.Name(); ok { + _spec.SetField(subscription.FieldName, field.TypeString, value) + _node.Name = value + } + if value, ok := sc.mutation.Description(); ok { + _spec.SetField(subscription.FieldDescription, field.TypeString, value) + _node.Description = &value + } if value, ok := sc.mutation.PlanKey(); ok { _spec.SetField(subscription.FieldPlanKey, field.TypeString, value) _node.PlanKey = value @@ -488,6 +536,36 @@ func (u *SubscriptionUpsert) ClearActiveTo() *SubscriptionUpsert { return u } +// SetName sets the "name" field. +func (u *SubscriptionUpsert) SetName(v string) *SubscriptionUpsert { + u.Set(subscription.FieldName, v) + return u +} + +// UpdateName sets the "name" field to the value that was provided on create. +func (u *SubscriptionUpsert) UpdateName() *SubscriptionUpsert { + u.SetExcluded(subscription.FieldName) + return u +} + +// SetDescription sets the "description" field. +func (u *SubscriptionUpsert) SetDescription(v string) *SubscriptionUpsert { + u.Set(subscription.FieldDescription, v) + return u +} + +// UpdateDescription sets the "description" field to the value that was provided on create. +func (u *SubscriptionUpsert) UpdateDescription() *SubscriptionUpsert { + u.SetExcluded(subscription.FieldDescription) + return u +} + +// ClearDescription clears the value of the "description" field. +func (u *SubscriptionUpsert) ClearDescription() *SubscriptionUpsert { + u.SetNull(subscription.FieldDescription) + return u +} + // UpdateNewValues updates the mutable fields using the new values that were set on create except the ID field. // Using this option is equivalent to using: // @@ -634,6 +712,41 @@ func (u *SubscriptionUpsertOne) ClearActiveTo() *SubscriptionUpsertOne { }) } +// SetName sets the "name" field. +func (u *SubscriptionUpsertOne) SetName(v string) *SubscriptionUpsertOne { + return u.Update(func(s *SubscriptionUpsert) { + s.SetName(v) + }) +} + +// UpdateName sets the "name" field to the value that was provided on create. +func (u *SubscriptionUpsertOne) UpdateName() *SubscriptionUpsertOne { + return u.Update(func(s *SubscriptionUpsert) { + s.UpdateName() + }) +} + +// SetDescription sets the "description" field. +func (u *SubscriptionUpsertOne) SetDescription(v string) *SubscriptionUpsertOne { + return u.Update(func(s *SubscriptionUpsert) { + s.SetDescription(v) + }) +} + +// UpdateDescription sets the "description" field to the value that was provided on create. +func (u *SubscriptionUpsertOne) UpdateDescription() *SubscriptionUpsertOne { + return u.Update(func(s *SubscriptionUpsert) { + s.UpdateDescription() + }) +} + +// ClearDescription clears the value of the "description" field. +func (u *SubscriptionUpsertOne) ClearDescription() *SubscriptionUpsertOne { + return u.Update(func(s *SubscriptionUpsert) { + s.ClearDescription() + }) +} + // Exec executes the query. func (u *SubscriptionUpsertOne) Exec(ctx context.Context) error { if len(u.create.conflict) == 0 { @@ -947,6 +1060,41 @@ func (u *SubscriptionUpsertBulk) ClearActiveTo() *SubscriptionUpsertBulk { }) } +// SetName sets the "name" field. +func (u *SubscriptionUpsertBulk) SetName(v string) *SubscriptionUpsertBulk { + return u.Update(func(s *SubscriptionUpsert) { + s.SetName(v) + }) +} + +// UpdateName sets the "name" field to the value that was provided on create. +func (u *SubscriptionUpsertBulk) UpdateName() *SubscriptionUpsertBulk { + return u.Update(func(s *SubscriptionUpsert) { + s.UpdateName() + }) +} + +// SetDescription sets the "description" field. +func (u *SubscriptionUpsertBulk) SetDescription(v string) *SubscriptionUpsertBulk { + return u.Update(func(s *SubscriptionUpsert) { + s.SetDescription(v) + }) +} + +// UpdateDescription sets the "description" field to the value that was provided on create. +func (u *SubscriptionUpsertBulk) UpdateDescription() *SubscriptionUpsertBulk { + return u.Update(func(s *SubscriptionUpsert) { + s.UpdateDescription() + }) +} + +// ClearDescription clears the value of the "description" field. +func (u *SubscriptionUpsertBulk) ClearDescription() *SubscriptionUpsertBulk { + return u.Update(func(s *SubscriptionUpsert) { + s.ClearDescription() + }) +} + // Exec executes the query. func (u *SubscriptionUpsertBulk) Exec(ctx context.Context) error { if u.create.err != nil { diff --git a/openmeter/ent/db/subscription_update.go b/openmeter/ent/db/subscription_update.go index 705da5b61..d771ef0bd 100644 --- a/openmeter/ent/db/subscription_update.go +++ b/openmeter/ent/db/subscription_update.go @@ -87,6 +87,40 @@ func (su *SubscriptionUpdate) ClearActiveTo() *SubscriptionUpdate { return su } +// SetName sets the "name" field. +func (su *SubscriptionUpdate) SetName(s string) *SubscriptionUpdate { + su.mutation.SetName(s) + return su +} + +// SetNillableName sets the "name" field if the given value is not nil. +func (su *SubscriptionUpdate) SetNillableName(s *string) *SubscriptionUpdate { + if s != nil { + su.SetName(*s) + } + return su +} + +// SetDescription sets the "description" field. +func (su *SubscriptionUpdate) SetDescription(s string) *SubscriptionUpdate { + su.mutation.SetDescription(s) + return su +} + +// SetNillableDescription sets the "description" field if the given value is not nil. +func (su *SubscriptionUpdate) SetNillableDescription(s *string) *SubscriptionUpdate { + if s != nil { + su.SetDescription(*s) + } + return su +} + +// ClearDescription clears the value of the "description" field. +func (su *SubscriptionUpdate) ClearDescription() *SubscriptionUpdate { + su.mutation.ClearDescription() + return su +} + // AddPhaseIDs adds the "phases" edge to the SubscriptionPhase entity by IDs. func (su *SubscriptionUpdate) AddPhaseIDs(ids ...string) *SubscriptionUpdate { su.mutation.AddPhaseIDs(ids...) @@ -166,6 +200,11 @@ func (su *SubscriptionUpdate) defaults() { // check runs all checks and user-defined validators on the builder. func (su *SubscriptionUpdate) check() error { + if v, ok := su.mutation.Name(); ok { + if err := subscription.NameValidator(v); err != nil { + return &ValidationError{Name: "name", err: fmt.Errorf(`db: validator failed for field "Subscription.name": %w`, err)} + } + } if su.mutation.CustomerCleared() && len(su.mutation.CustomerIDs()) > 0 { return errors.New(`db: clearing a required unique edge "Subscription.customer"`) } @@ -205,6 +244,15 @@ func (su *SubscriptionUpdate) sqlSave(ctx context.Context) (n int, err error) { if su.mutation.ActiveToCleared() { _spec.ClearField(subscription.FieldActiveTo, field.TypeTime) } + if value, ok := su.mutation.Name(); ok { + _spec.SetField(subscription.FieldName, field.TypeString, value) + } + if value, ok := su.mutation.Description(); ok { + _spec.SetField(subscription.FieldDescription, field.TypeString, value) + } + if su.mutation.DescriptionCleared() { + _spec.ClearField(subscription.FieldDescription, field.TypeString) + } if su.mutation.PhasesCleared() { edge := &sqlgraph.EdgeSpec{ Rel: sqlgraph.O2M, @@ -328,6 +376,40 @@ func (suo *SubscriptionUpdateOne) ClearActiveTo() *SubscriptionUpdateOne { return suo } +// SetName sets the "name" field. +func (suo *SubscriptionUpdateOne) SetName(s string) *SubscriptionUpdateOne { + suo.mutation.SetName(s) + return suo +} + +// SetNillableName sets the "name" field if the given value is not nil. +func (suo *SubscriptionUpdateOne) SetNillableName(s *string) *SubscriptionUpdateOne { + if s != nil { + suo.SetName(*s) + } + return suo +} + +// SetDescription sets the "description" field. +func (suo *SubscriptionUpdateOne) SetDescription(s string) *SubscriptionUpdateOne { + suo.mutation.SetDescription(s) + return suo +} + +// SetNillableDescription sets the "description" field if the given value is not nil. +func (suo *SubscriptionUpdateOne) SetNillableDescription(s *string) *SubscriptionUpdateOne { + if s != nil { + suo.SetDescription(*s) + } + return suo +} + +// ClearDescription clears the value of the "description" field. +func (suo *SubscriptionUpdateOne) ClearDescription() *SubscriptionUpdateOne { + suo.mutation.ClearDescription() + return suo +} + // AddPhaseIDs adds the "phases" edge to the SubscriptionPhase entity by IDs. func (suo *SubscriptionUpdateOne) AddPhaseIDs(ids ...string) *SubscriptionUpdateOne { suo.mutation.AddPhaseIDs(ids...) @@ -420,6 +502,11 @@ func (suo *SubscriptionUpdateOne) defaults() { // check runs all checks and user-defined validators on the builder. func (suo *SubscriptionUpdateOne) check() error { + if v, ok := suo.mutation.Name(); ok { + if err := subscription.NameValidator(v); err != nil { + return &ValidationError{Name: "name", err: fmt.Errorf(`db: validator failed for field "Subscription.name": %w`, err)} + } + } if suo.mutation.CustomerCleared() && len(suo.mutation.CustomerIDs()) > 0 { return errors.New(`db: clearing a required unique edge "Subscription.customer"`) } @@ -476,6 +563,15 @@ func (suo *SubscriptionUpdateOne) sqlSave(ctx context.Context) (_node *Subscript if suo.mutation.ActiveToCleared() { _spec.ClearField(subscription.FieldActiveTo, field.TypeTime) } + if value, ok := suo.mutation.Name(); ok { + _spec.SetField(subscription.FieldName, field.TypeString, value) + } + if value, ok := suo.mutation.Description(); ok { + _spec.SetField(subscription.FieldDescription, field.TypeString, value) + } + if suo.mutation.DescriptionCleared() { + _spec.ClearField(subscription.FieldDescription, field.TypeString) + } if suo.mutation.PhasesCleared() { edge := &sqlgraph.EdgeSpec{ Rel: sqlgraph.O2M, diff --git a/openmeter/ent/db/subscriptionitem/subscriptionitem.go b/openmeter/ent/db/subscriptionitem/subscriptionitem.go index 77f37ccd2..0290383a3 100644 --- a/openmeter/ent/db/subscriptionitem/subscriptionitem.go +++ b/openmeter/ent/db/subscriptionitem/subscriptionitem.go @@ -257,6 +257,6 @@ func newEntitlementStep() *sqlgraph.Step { return sqlgraph.NewStep( sqlgraph.From(Table, FieldID), sqlgraph.To(EntitlementInverseTable, FieldID), - sqlgraph.Edge(sqlgraph.M2O, false, EntitlementTable, EntitlementColumn), + sqlgraph.Edge(sqlgraph.M2O, true, EntitlementTable, EntitlementColumn), ) } diff --git a/openmeter/ent/db/subscriptionitem/where.go b/openmeter/ent/db/subscriptionitem/where.go index f746625cd..461ea8685 100644 --- a/openmeter/ent/db/subscriptionitem/where.go +++ b/openmeter/ent/db/subscriptionitem/where.go @@ -1199,7 +1199,7 @@ func HasEntitlement() predicate.SubscriptionItem { return predicate.SubscriptionItem(func(s *sql.Selector) { step := sqlgraph.NewStep( sqlgraph.From(Table, FieldID), - sqlgraph.Edge(sqlgraph.M2O, false, EntitlementTable, EntitlementColumn), + sqlgraph.Edge(sqlgraph.M2O, true, EntitlementTable, EntitlementColumn), ) sqlgraph.HasNeighbors(s, step) }) diff --git a/openmeter/ent/db/subscriptionitem_create.go b/openmeter/ent/db/subscriptionitem_create.go index b149f3163..5d2057d64 100644 --- a/openmeter/ent/db/subscriptionitem_create.go +++ b/openmeter/ent/db/subscriptionitem_create.go @@ -494,7 +494,7 @@ func (sic *SubscriptionItemCreate) createSpec() (*SubscriptionItem, *sqlgraph.Cr if nodes := sic.mutation.EntitlementIDs(); len(nodes) > 0 { edge := &sqlgraph.EdgeSpec{ Rel: sqlgraph.M2O, - Inverse: false, + Inverse: true, Table: subscriptionitem.EntitlementTable, Columns: []string{subscriptionitem.EntitlementColumn}, Bidi: false, diff --git a/openmeter/ent/db/subscriptionitem_query.go b/openmeter/ent/db/subscriptionitem_query.go index c9a866da6..5d77969f9 100644 --- a/openmeter/ent/db/subscriptionitem_query.go +++ b/openmeter/ent/db/subscriptionitem_query.go @@ -100,7 +100,7 @@ func (siq *SubscriptionItemQuery) QueryEntitlement() *EntitlementQuery { step := sqlgraph.NewStep( sqlgraph.From(subscriptionitem.Table, subscriptionitem.FieldID, selector), sqlgraph.To(entitlement.Table, entitlement.FieldID), - sqlgraph.Edge(sqlgraph.M2O, false, subscriptionitem.EntitlementTable, subscriptionitem.EntitlementColumn), + sqlgraph.Edge(sqlgraph.M2O, true, subscriptionitem.EntitlementTable, subscriptionitem.EntitlementColumn), ) fromU = sqlgraph.SetNeighbors(siq.driver.Dialect(), step) return fromU, nil diff --git a/openmeter/ent/db/subscriptionitem_update.go b/openmeter/ent/db/subscriptionitem_update.go index e6aa18f9d..4895a1036 100644 --- a/openmeter/ent/db/subscriptionitem_update.go +++ b/openmeter/ent/db/subscriptionitem_update.go @@ -455,7 +455,7 @@ func (siu *SubscriptionItemUpdate) sqlSave(ctx context.Context) (n int, err erro if siu.mutation.EntitlementCleared() { edge := &sqlgraph.EdgeSpec{ Rel: sqlgraph.M2O, - Inverse: false, + Inverse: true, Table: subscriptionitem.EntitlementTable, Columns: []string{subscriptionitem.EntitlementColumn}, Bidi: false, @@ -468,7 +468,7 @@ func (siu *SubscriptionItemUpdate) sqlSave(ctx context.Context) (n int, err erro if nodes := siu.mutation.EntitlementIDs(); len(nodes) > 0 { edge := &sqlgraph.EdgeSpec{ Rel: sqlgraph.M2O, - Inverse: false, + Inverse: true, Table: subscriptionitem.EntitlementTable, Columns: []string{subscriptionitem.EntitlementColumn}, Bidi: false, @@ -955,7 +955,7 @@ func (siuo *SubscriptionItemUpdateOne) sqlSave(ctx context.Context) (_node *Subs if siuo.mutation.EntitlementCleared() { edge := &sqlgraph.EdgeSpec{ Rel: sqlgraph.M2O, - Inverse: false, + Inverse: true, Table: subscriptionitem.EntitlementTable, Columns: []string{subscriptionitem.EntitlementColumn}, Bidi: false, @@ -968,7 +968,7 @@ func (siuo *SubscriptionItemUpdateOne) sqlSave(ctx context.Context) (_node *Subs if nodes := siuo.mutation.EntitlementIDs(); len(nodes) > 0 { edge := &sqlgraph.EdgeSpec{ Rel: sqlgraph.M2O, - Inverse: false, + Inverse: true, Table: subscriptionitem.EntitlementTable, Columns: []string{subscriptionitem.EntitlementColumn}, Bidi: false, diff --git a/openmeter/ent/schema/entitlement.go b/openmeter/ent/schema/entitlement.go index 6f0cc6a59..e1f701ac8 100644 --- a/openmeter/ent/schema/entitlement.go +++ b/openmeter/ent/schema/entitlement.go @@ -76,7 +76,7 @@ func (Entitlement) Edges() []ent.Edge { edge.To("usage_reset", UsageReset.Type), edge.To("grant", Grant.Type), edge.To("balance_snapshot", BalanceSnapshot.Type), - edge.To("subscription_item", SubscriptionItem.Type).Unique(), + edge.To("subscription_item", SubscriptionItem.Type), edge.From("feature", Feature.Type). Ref("entitlement"). Field("feature_id"). diff --git a/openmeter/ent/schema/subscription.go b/openmeter/ent/schema/subscription.go index ce0a2ec83..3eaf5c50a 100644 --- a/openmeter/ent/schema/subscription.go +++ b/openmeter/ent/schema/subscription.go @@ -29,6 +29,8 @@ func (Subscription) Mixin() []ent.Mixin { func (Subscription) Fields() []ent.Field { return []ent.Field{ + field.String("name").NotEmpty().Default("Subscription"), + field.String("description").Optional().Nillable(), field.String("plan_key").NotEmpty().Immutable(), field.Int("plan_version").Min(1).Immutable(), field.String("customer_id").NotEmpty().Immutable(), @@ -160,6 +162,6 @@ func (SubscriptionItem) Indexes() []ent.Index { func (SubscriptionItem) Edges() []ent.Edge { return []ent.Edge{ edge.From("phase", SubscriptionPhase.Type).Field("phase_id").Ref("items").Unique().Immutable().Required(), - edge.To("entitlement", Entitlement.Type).Field("entitlement_id").Unique(), + edge.From("entitlement", Entitlement.Type).Field("entitlement_id").Ref("subscription_item").Unique(), } } diff --git a/openmeter/productcatalog/plan/ratecard_test.go b/openmeter/productcatalog/plan/ratecard_test.go index 63aa7d71d..0e6f34484 100644 --- a/openmeter/productcatalog/plan/ratecard_test.go +++ b/openmeter/productcatalog/plan/ratecard_test.go @@ -39,7 +39,7 @@ func TestRateCard_JSON(t *testing.T) { }, FlatFeeRateCard: productcatalog.FlatFeeRateCard{ RateCardMeta: productcatalog.RateCardMeta{ - Key: "ratecard-1", + Key: "feature-1", Name: "RateCard 1", Description: lo.ToPtr("RateCard 1"), Metadata: map[string]string{ @@ -98,7 +98,7 @@ func TestRateCard_JSON(t *testing.T) { }, UsageBasedRateCard: productcatalog.UsageBasedRateCard{ RateCardMeta: productcatalog.RateCardMeta{ - Key: "ratecard-2", + Key: "feature-2", Name: "RateCard 2", Description: lo.ToPtr("RateCard 2"), Metadata: map[string]string{ @@ -187,7 +187,7 @@ func TestFlatFeeRateCard(t *testing.T) { }, FlatFeeRateCard: productcatalog.FlatFeeRateCard{ RateCardMeta: productcatalog.RateCardMeta{ - Key: "flat-1", + Key: "feat-1", Name: "Flat 1", Description: lo.ToPtr("Flat 1"), Metadata: map[string]string{ @@ -246,7 +246,7 @@ func TestFlatFeeRateCard(t *testing.T) { }, FlatFeeRateCard: productcatalog.FlatFeeRateCard{ RateCardMeta: productcatalog.RateCardMeta{ - Key: "flat-2", + Key: "feat-2", Name: "Flat 2", Description: lo.ToPtr("Flat 2"), Metadata: map[string]string{ @@ -329,7 +329,7 @@ func TestUsageBasedRateCard(t *testing.T) { }, UsageBasedRateCard: productcatalog.UsageBasedRateCard{ RateCardMeta: productcatalog.RateCardMeta{ - Key: "usage-1", + Key: "feat-1", Name: "Usage 1", Description: lo.ToPtr("Usage 1"), Metadata: map[string]string{ @@ -394,7 +394,7 @@ func TestUsageBasedRateCard(t *testing.T) { }, UsageBasedRateCard: productcatalog.UsageBasedRateCard{ RateCardMeta: productcatalog.RateCardMeta{ - Key: "usage-2", + Key: "feat-2", Name: "Usage 2", Description: lo.ToPtr("Usage 2"), Metadata: map[string]string{ diff --git a/openmeter/productcatalog/plan/service/service_test.go b/openmeter/productcatalog/plan/service/service_test.go index 92326c0a0..fa6a1f73f 100644 --- a/openmeter/productcatalog/plan/service/service_test.go +++ b/openmeter/productcatalog/plan/service/service_test.go @@ -120,7 +120,7 @@ func TestPlanService(t *testing.T) { RateCards: []productcatalog.RateCard{ &productcatalog.FlatFeeRateCard{ RateCardMeta: productcatalog.RateCardMeta{ - Key: "pro-2-ratecard-1", + Key: "api_requests_total", Name: "Pro-2 RateCard 1", Description: lo.ToPtr("Pro-2 RateCard 1"), Metadata: models.Metadata{"name": "pro-2-ratecard-1"}, @@ -653,7 +653,7 @@ func TestPlanService(t *testing.T) { }, UsageBasedRateCard: productcatalog.UsageBasedRateCard{ RateCardMeta: productcatalog.RateCardMeta{ - Key: "pro-2-ratecard-1", + Key: "api_requests_total", Name: "Pro-2 RateCard 1", Description: lo.ToPtr("Pro-2 RateCard 1"), Metadata: map[string]string{"name": "pro-2-ratecard-1"}, @@ -742,7 +742,7 @@ func TestPlanService(t *testing.T) { }, UsageBasedRateCard: productcatalog.UsageBasedRateCard{ RateCardMeta: productcatalog.RateCardMeta{ - Key: "pro-2-ratecard-1", + Key: "api_requests_total", Name: "Pro-2 RateCard 1", Description: lo.ToPtr("Pro-2 RateCard 1"), Metadata: models.Metadata{"name": "pro-2-ratecard-1"}, @@ -831,7 +831,7 @@ func TestPlanService(t *testing.T) { }, FlatFeeRateCard: productcatalog.FlatFeeRateCard{ RateCardMeta: productcatalog.RateCardMeta{ - Key: "pro-2-ratecard-1", + Key: "api_requests_total", Name: "Pro-2 RateCard 1", Description: lo.ToPtr("Pro-2 RateCard 1"), Metadata: models.Metadata{"name": "pro-2-ratecard-1"}, diff --git a/openmeter/productcatalog/ratecard.go b/openmeter/productcatalog/ratecard.go index 8b731a47e..7085afd4a 100644 --- a/openmeter/productcatalog/ratecard.go +++ b/openmeter/productcatalog/ratecard.go @@ -133,6 +133,12 @@ func (r RateCardMeta) Validate() error { } } + if r.Feature != nil { + if r.Key != r.Feature.Key { + errs = append(errs, errors.New("Feature key mismatch")) + } + } + if len(errs) > 0 { return errors.Join(errs...) } diff --git a/openmeter/productcatalog/ratecard_test.go b/openmeter/productcatalog/ratecard_test.go index 8a8f1615a..75a436b16 100644 --- a/openmeter/productcatalog/ratecard_test.go +++ b/openmeter/productcatalog/ratecard_test.go @@ -23,7 +23,7 @@ func TestFlatFeeRateCard(t *testing.T) { Name: "valid", RateCard: FlatFeeRateCard{ RateCardMeta: RateCardMeta{ - Key: "flat-1", + Key: "feat-1", Name: "Flat 1", Description: lo.ToPtr("Flat 1"), Metadata: map[string]string{ @@ -68,7 +68,7 @@ func TestFlatFeeRateCard(t *testing.T) { Name: "invalid", RateCard: FlatFeeRateCard{ RateCardMeta: RateCardMeta{ - Key: "flat-2", + Key: "feat-2", Name: "Flat 2", Description: lo.ToPtr("Flat 2"), Metadata: map[string]string{ @@ -137,7 +137,7 @@ func TestUsageBasedRateCard(t *testing.T) { Name: "valid", RateCard: UsageBasedRateCard{ RateCardMeta: RateCardMeta{ - Key: "usage-1", + Key: "feat-1", Name: "Usage 1", Description: lo.ToPtr("Usage 1"), Metadata: map[string]string{ @@ -188,7 +188,7 @@ func TestUsageBasedRateCard(t *testing.T) { Name: "invalid", RateCard: UsageBasedRateCard{ RateCardMeta: RateCardMeta{ - Key: "usage-2", + Key: "feat-2", Name: "Usage 2", Description: lo.ToPtr("Usage 2"), Metadata: map[string]string{ @@ -264,7 +264,7 @@ func TestRateCardsEqual(t *testing.T) { Left: []RateCard{ &UsageBasedRateCard{ RateCardMeta: RateCardMeta{ - Key: "usage-1", + Key: "feat-1", Name: "Usage 1", Description: lo.ToPtr("Usage 1"), Metadata: map[string]string{ @@ -313,7 +313,7 @@ func TestRateCardsEqual(t *testing.T) { Right: []RateCard{ &UsageBasedRateCard{ RateCardMeta: RateCardMeta{ - Key: "usage-1", + Key: "feat-1", Name: "Usage 1", Description: lo.ToPtr("Usage 1"), Metadata: map[string]string{ @@ -366,7 +366,7 @@ func TestRateCardsEqual(t *testing.T) { Left: []RateCard{ &UsageBasedRateCard{ RateCardMeta: RateCardMeta{ - Key: "usage-1", + Key: "feat-1", Name: "Usage 1", Description: lo.ToPtr("Usage 1"), Metadata: map[string]string{ @@ -415,7 +415,7 @@ func TestRateCardsEqual(t *testing.T) { Right: []RateCard{ &FlatFeeRateCard{ RateCardMeta: RateCardMeta{ - Key: "flat-1", + Key: "feat-1", Name: "Flat 1", Description: lo.ToPtr("Flat 1"), Metadata: map[string]string{ diff --git a/openmeter/server/router/plan.go b/openmeter/server/router/plan.go index be8f3818e..e3869e476 100644 --- a/openmeter/server/router/plan.go +++ b/openmeter/server/router/plan.go @@ -12,7 +12,7 @@ import ( // List plans // (GET /api/v1/plans) func (a *Router) ListPlans(w http.ResponseWriter, r *http.Request, params api.ListPlansParams) { - if a.config.Plan == nil { + if !a.config.ProductCatalogEnabled { unimplemented.ListPlans(w, r, params) return } @@ -23,7 +23,7 @@ func (a *Router) ListPlans(w http.ResponseWriter, r *http.Request, params api.Li // Create a plan // (POST /api/v1/plans) func (a *Router) CreatePlan(w http.ResponseWriter, r *http.Request) { - if a.config.Plan == nil { + if !a.config.ProductCatalogEnabled { unimplemented.CreatePlan(w, r) return } @@ -34,7 +34,7 @@ func (a *Router) CreatePlan(w http.ResponseWriter, r *http.Request) { // Delete plan // (DELETE /api/v1/plans/{planId}) func (a *Router) DeletePlan(w http.ResponseWriter, r *http.Request, planId string) { - if a.config.Plan == nil { + if !a.config.ProductCatalogEnabled { unimplemented.DeletePlan(w, r, planId) return } @@ -45,7 +45,7 @@ func (a *Router) DeletePlan(w http.ResponseWriter, r *http.Request, planId strin // Get plan // (GET /api/v1/plans/{planId}) func (a *Router) GetPlan(w http.ResponseWriter, r *http.Request, planIdOrKey string, params api.GetPlanParams) { - if a.config.Plan == nil { + if !a.config.ProductCatalogEnabled { unimplemented.GetPlan(w, r, planIdOrKey, params) return } @@ -59,7 +59,7 @@ func (a *Router) GetPlan(w http.ResponseWriter, r *http.Request, planIdOrKey str // Update a plan // (PUT /api/v1/plans/{planId}) func (a *Router) UpdatePlan(w http.ResponseWriter, r *http.Request, planId string) { - if a.config.Plan == nil { + if !a.config.ProductCatalogEnabled { unimplemented.UpdatePlan(w, r, planId) return } @@ -70,7 +70,7 @@ func (a *Router) UpdatePlan(w http.ResponseWriter, r *http.Request, planId strin // New draft plan // (POST /api/v1/plans/{planIdOrKey}/next) func (a *Router) NextPlan(w http.ResponseWriter, r *http.Request, planIdOrKey string) { - if a.config.Plan == nil { + if !a.config.ProductCatalogEnabled { unimplemented.NextPlan(w, r, planIdOrKey) return } @@ -82,7 +82,7 @@ func (a *Router) NextPlan(w http.ResponseWriter, r *http.Request, planIdOrKey st // List phases in plan // (GET /api/v1/plans/{planId}/phases) func (a *Router) ListPlanPhases(w http.ResponseWriter, r *http.Request, planId string, params api.ListPlanPhasesParams) { - if a.config.Plan == nil { + if !a.config.ProductCatalogEnabled { unimplemented.ListPlanPhases(w, r, planId, params) return } @@ -96,7 +96,7 @@ func (a *Router) ListPlanPhases(w http.ResponseWriter, r *http.Request, planId s // Create new phase in plan // (POST /api/v1/plans/{planId}/phases) func (a *Router) CreatePlanPhase(w http.ResponseWriter, r *http.Request, planId string) { - if a.config.Plan == nil { + if !a.config.ProductCatalogEnabled { unimplemented.CreatePlanPhase(w, r, planId) return } @@ -107,7 +107,7 @@ func (a *Router) CreatePlanPhase(w http.ResponseWriter, r *http.Request, planId // Delete phase for plan // (DELETE /api/v1/plans/{planId}/phases/{planPhaseKey}) func (a *Router) DeletePlanPhase(w http.ResponseWriter, r *http.Request, planId string, planPhaseKey string) { - if a.config.Plan == nil { + if !a.config.ProductCatalogEnabled { unimplemented.DeletePlanPhase(w, r, planId, planPhaseKey) return } @@ -121,7 +121,7 @@ func (a *Router) DeletePlanPhase(w http.ResponseWriter, r *http.Request, planId // Get phase for plan // (GET /api/v1/plans/{planId}/phases/{planPhaseKey}) func (a *Router) GetPlanPhase(w http.ResponseWriter, r *http.Request, planId string, planPhaseKey string) { - if a.config.Plan == nil { + if !a.config.ProductCatalogEnabled { unimplemented.GetPlanPhase(w, r, planId, planPhaseKey) return } @@ -135,7 +135,7 @@ func (a *Router) GetPlanPhase(w http.ResponseWriter, r *http.Request, planId str // Update phase in plan // (PUT /api/v1/plans/{planId}/phases/{planPhaseKey}) func (a *Router) UpdatePlanPhase(w http.ResponseWriter, r *http.Request, planId string, planPhaseKey string) { - if a.config.Plan == nil { + if !a.config.ProductCatalogEnabled { unimplemented.UpdatePlanPhase(w, r, planId, planPhaseKey) return } @@ -149,7 +149,7 @@ func (a *Router) UpdatePlanPhase(w http.ResponseWriter, r *http.Request, planId // Publish plan // (POST /api/v1/plans/{planId}/publish) func (a *Router) PublishPlan(w http.ResponseWriter, r *http.Request, planId string) { - if a.config.Plan == nil { + if !a.config.ProductCatalogEnabled { unimplemented.PublishPlan(w, r, planId) return } @@ -160,7 +160,7 @@ func (a *Router) PublishPlan(w http.ResponseWriter, r *http.Request, planId stri // Archive plan version // (POST /api/v1/plans/{planId}/archive) func (a *Router) ArchivePlan(w http.ResponseWriter, r *http.Request, planId string) { - if a.config.Plan == nil { + if !a.config.ProductCatalogEnabled { unimplemented.ArchivePlan(w, r, planId) return } diff --git a/openmeter/server/router/router.go b/openmeter/server/router/router.go index db361f6c3..262064f21 100644 --- a/openmeter/server/router/router.go +++ b/openmeter/server/router/router.go @@ -5,6 +5,7 @@ import ( "errors" "fmt" "io" + "log/slog" "net/http" "github.com/getkin/kin-openapi/openapi3" @@ -38,6 +39,8 @@ import ( planhttpdriver "github.com/openmeterio/openmeter/openmeter/productcatalog/plan/httpdriver" "github.com/openmeterio/openmeter/openmeter/server/authenticator" "github.com/openmeterio/openmeter/openmeter/streaming" + "github.com/openmeterio/openmeter/openmeter/subscription" + subscriptionhttpdriver "github.com/openmeterio/openmeter/openmeter/subscription/httpdriver" "github.com/openmeterio/openmeter/pkg/errorsx" "github.com/openmeterio/openmeter/pkg/framework/transport/httptransport" ) @@ -68,6 +71,7 @@ type Config struct { PortalCORSEnabled bool PortalTokenStrategy *authenticator.PortalTokenStrategy ErrorHandler errorsx.Handler + Logger *slog.Logger // deps App app.Service @@ -75,6 +79,8 @@ type Config struct { Customer customer.Service Billing billing.Service Plan plan.Service + SubscriptionService subscription.Service + SubscriptionWorkflowService subscription.WorkflowService DebugConnector debug.DebugConnector FeatureConnector feature.FeatureConnector EntitlementConnector entitlement.Connector @@ -84,10 +90,11 @@ type Config struct { Notification notification.Service // FIXME: implement generic module management, loading, etc... - EntitlementsEnabled bool - NotificationEnabled bool - BillingEnabled bool - AppsEnabled bool + EntitlementsEnabled bool + NotificationEnabled bool + BillingEnabled bool + ProductCatalogEnabled bool + AppsEnabled bool } func (c Config) Validate() error { @@ -172,6 +179,7 @@ type Router struct { billingHandler billinghttpdriver.Handler featureHandler productcatalog_httpdriver.FeatureHandler planHandler planhttpdriver.Handler + subscriptionHandler subscriptionhttpdriver.Handler creditHandler creditdriver.GrantHandler debugHandler debug_httpdriver.DebugHandler customerHandler customerhttpdriver.CustomerHandler @@ -265,12 +273,34 @@ func NewRouter(config Config) (*Router, error) { ) } - if config.Plan != nil { + if config.ProductCatalogEnabled { + if config.Plan == nil { + return nil, errors.New("plan service is required when productcatalog is enabled") + } + router.planHandler = planhttpdriver.New( staticNamespaceDecoder, config.Plan, httptransport.WithErrorHandler(config.ErrorHandler), ) + + if config.SubscriptionService == nil || config.SubscriptionWorkflowService == nil { + return nil, errors.New("subscription service and workflow service are required when productcatalog is enabled") + } + + if config.Logger == nil { + return nil, errors.New("logger is required when productcatalog is enabled") + } + + router.subscriptionHandler = subscriptionhttpdriver.NewHandler( + subscriptionhttpdriver.HandlerConfig{ + SubscriptionWorkflowService: config.SubscriptionWorkflowService, + SubscriptionService: config.SubscriptionService, + NamespaceDecoder: staticNamespaceDecoder, + Logger: config.Logger, + }, + httptransport.WithErrorHandler(config.ErrorHandler), + ) } return router, nil diff --git a/openmeter/server/router/subscription.go b/openmeter/server/router/subscription.go index 98ec3f05a..b3ebd680a 100644 --- a/openmeter/server/router/subscription.go +++ b/openmeter/server/router/subscription.go @@ -4,11 +4,16 @@ import ( "net/http" "github.com/openmeterio/openmeter/api" + subscriptionhttpdriver "github.com/openmeterio/openmeter/openmeter/subscription/httpdriver" ) // (POST /api/v1/subscriptions) func (a *Router) CreateSubscription(w http.ResponseWriter, r *http.Request) { - w.WriteHeader(http.StatusNotImplemented) + if !a.config.ProductCatalogEnabled { + w.WriteHeader(http.StatusNotImplemented) + return + } + a.subscriptionHandler.CreateSubscription().ServeHTTP(w, r) } func (a *Router) ChangeSubscription(w http.ResponseWriter, r *http.Request, subscriptionId string) { @@ -17,12 +22,25 @@ func (a *Router) ChangeSubscription(w http.ResponseWriter, r *http.Request, subs // (GET /api/v1/subscriptions/{subscriptionId}) func (a *Router) GetSubscription(w http.ResponseWriter, r *http.Request, subscriptionId string, params api.GetSubscriptionParams) { - w.WriteHeader(http.StatusNotImplemented) + if !a.config.ProductCatalogEnabled { + w.WriteHeader(http.StatusNotImplemented) + return + } + a.subscriptionHandler.GetSubscription().With(subscriptionhttpdriver.GetSubscriptionParams{ + Query: params, + ID: subscriptionId, + }).ServeHTTP(w, r) } // (PATCH /api/v1/subscriptions/{subscriptionId}) func (a *Router) EditSubscription(w http.ResponseWriter, r *http.Request, subscriptionId string) { - w.WriteHeader(http.StatusNotImplemented) + if !a.config.ProductCatalogEnabled { + w.WriteHeader(http.StatusNotImplemented) + return + } + a.subscriptionHandler.EditSubscription().With(subscriptionhttpdriver.EditSubscriptionParams{ + ID: subscriptionId, + }).ServeHTTP(w, r) } // (POST /api/v1/subscriptions/{subscriptionId}/cancel) diff --git a/openmeter/subscription/adapters/entitlement/adapter.go b/openmeter/subscription/adapters/entitlement/adapter.go index e1f57d93a..7ff88df78 100644 --- a/openmeter/subscription/adapters/entitlement/adapter.go +++ b/openmeter/subscription/adapters/entitlement/adapter.go @@ -23,7 +23,7 @@ type EntitlementSubscriptionAdapter struct { var _ subscription.EntitlementAdapter = &EntitlementSubscriptionAdapter{} -func NewEntitlementSubscriptionAdapter( +func NewSubscriptionEntitlementAdapter( entitlementConnector entitlement.Connector, itemRepo subscription.SubscriptionItemRepository, txCreator transaction.Creator, @@ -35,7 +35,7 @@ func NewEntitlementSubscriptionAdapter( } } -// FIXME: implement usageMigration as needed +// TODO: implement usageMigration as needed func (a *EntitlementSubscriptionAdapter) ScheduleEntitlement(ctx context.Context, input subscription.ScheduleSubscriptionEntitlementInput) (*subscription.SubscriptionEntitlement, error) { if err := input.Validate(); err != nil { return nil, fmt.Errorf("invalid input: %w", err) diff --git a/openmeter/subscription/adapters/plan/adapter.go b/openmeter/subscription/adapters/plan/adapter.go new file mode 100644 index 000000000..1dedfe19b --- /dev/null +++ b/openmeter/subscription/adapters/plan/adapter.go @@ -0,0 +1,61 @@ +package subscriptionplan + +import ( + "context" + "log/slog" + + "github.com/samber/lo" + + "github.com/openmeterio/openmeter/openmeter/productcatalog/plan" + "github.com/openmeterio/openmeter/openmeter/subscription" + "github.com/openmeterio/openmeter/pkg/defaultx" + "github.com/openmeterio/openmeter/pkg/models" +) + +type PlanSubscriptionAdapterConfig struct { + PlanService plan.Service + Logger *slog.Logger +} + +type PlanSubscriptionAdapter struct { + PlanSubscriptionAdapterConfig +} + +var _ subscription.PlanAdapter = &PlanSubscriptionAdapter{} + +func NewSubscriptionPlanAdapter(config PlanSubscriptionAdapterConfig) subscription.PlanAdapter { + return &PlanSubscriptionAdapter{config} +} + +func (a *PlanSubscriptionAdapter) GetVersion(ctx context.Context, namespace string, ref subscription.PlanRefInput) (subscription.Plan, error) { + planKey := ref.Key + version := defaultx.WithDefault(ref.Version, 0) // plan service treats 0 as special case + + p, err := a.PlanService.GetPlan(ctx, plan.GetPlanInput{ + NamespacedID: models.NamespacedID{ + Namespace: namespace, + }, + Key: planKey, + Version: version, + }) + + if _, ok := lo.ErrorsAs[*plan.NotFoundError](err); ok { + return nil, subscription.PlanNotFoundError{ + Key: planKey, + Version: version, + } + } else if err != nil { + return nil, err + } + + if p == nil { + return nil, subscription.PlanNotFoundError{ + Key: planKey, + Version: version, + } + } + + return &SubscriptionPlan{ + Plan: *p, + }, nil +} diff --git a/openmeter/subscription/adapters/plan/plan.go b/openmeter/subscription/adapters/plan/plan.go new file mode 100644 index 000000000..15284c69e --- /dev/null +++ b/openmeter/subscription/adapters/plan/plan.go @@ -0,0 +1,126 @@ +package subscriptionplan + +import ( + "github.com/openmeterio/openmeter/openmeter/productcatalog" + "github.com/openmeterio/openmeter/openmeter/productcatalog/plan" + "github.com/openmeterio/openmeter/openmeter/subscription" + "github.com/openmeterio/openmeter/pkg/currencyx" + "github.com/openmeterio/openmeter/pkg/datex" +) + +type SubscriptionPlan struct { + plan.Plan +} + +var _ subscription.Plan = &SubscriptionPlan{} + +func (p *SubscriptionPlan) GetKey() string { + return p.Key +} + +func (p *SubscriptionPlan) GetVersionNumber() int { + return p.Version +} + +func (p *SubscriptionPlan) ToCreateSubscriptionPlanInput() subscription.CreateSubscriptionPlanInput { + return subscription.CreateSubscriptionPlanInput{ + Plan: subscription.PlanRef{ + Key: p.Key, + Version: p.Version, + }, + } +} + +func (p *SubscriptionPlan) GetPhases() []subscription.PlanPhase { + ps := make([]subscription.PlanPhase, 0, len(p.Phases)) + for _, ph := range p.Phases { + ps = append(ps, &SubscriptionPlanPhase{ + Phase: ph, + }) + } + + return ps +} + +func (p *SubscriptionPlan) Currency() currencyx.Code { + return currencyx.Code(p.Plan.Currency) +} + +type SubscriptionPlanPhase struct { + plan.Phase +} + +var _ subscription.PlanPhase = &SubscriptionPlanPhase{} + +func (p *SubscriptionPlanPhase) ToCreateSubscriptionPhasePlanInput() subscription.CreateSubscriptionPhasePlanInput { + return subscription.CreateSubscriptionPhasePlanInput{ + PhaseKey: p.Key, + StartAfter: p.StartAfter, + Name: p.Name, + Description: p.Description, + } +} + +func (p *SubscriptionPlanPhase) GetRateCards() []subscription.PlanRateCard { + rcs := make([]subscription.PlanRateCard, 0, len(p.RateCards)) + for _, rc := range p.RateCards { + rcs = append(rcs, &SubscriptionPlanRateCard{ + PhaseKey: p.Key, + RateCard: rc, + }) + } + + return rcs +} + +func (p *SubscriptionPlanPhase) GetKey() string { + return p.Key +} + +type SubscriptionPlanRateCard struct { + PhaseKey string + productcatalog.RateCard +} + +var _ subscription.PlanRateCard = &SubscriptionPlanRateCard{} + +func (r *SubscriptionPlanRateCard) ToCreateSubscriptionItemPlanInput() subscription.CreateSubscriptionItemPlanInput { + m := r.RateCard.AsMeta() + + var fk *string + if m.Feature != nil { + fk = &m.Feature.Key + } + + var cadence *datex.Period + + // FIXME: BillingCadence could be a method on RateCard + switch r.RateCard.Type() { + case productcatalog.FlatFeeRateCardType: + if rc, ok := r.RateCard.(*productcatalog.FlatFeeRateCard); ok { + cadence = rc.BillingCadence + } + case productcatalog.UsageBasedRateCardType: + if rc, ok := r.RateCard.(*productcatalog.UsageBasedRateCard); ok { + cadence = &rc.BillingCadence + } + } + + return subscription.CreateSubscriptionItemPlanInput{ + PhaseKey: r.PhaseKey, + ItemKey: r.Key(), + RateCard: subscription.RateCard{ + Name: m.Name, + Description: m.Description, + FeatureKey: fk, + EntitlementTemplate: m.EntitlementTemplate, + TaxConfig: m.TaxConfig, + Price: m.Price, + BillingCadence: cadence, + }, + } +} + +func (r *SubscriptionPlanRateCard) GetKey() string { + return r.Key() +} diff --git a/openmeter/subscription/discount.go b/openmeter/subscription/discount.go deleted file mode 100644 index d37da517c..000000000 --- a/openmeter/subscription/discount.go +++ /dev/null @@ -1,36 +0,0 @@ -package subscription - -import ( - "context" - - "github.com/openmeterio/openmeter/openmeter/productcatalog" - "github.com/openmeterio/openmeter/pkg/models" -) - -type AppliedDiscount struct { - // Priority is the order in which the discount is applied. Lower values are applied first. - Priority int `json:"priority"` - // AppliesToKeys is a list of SubscriptionItem keys that this discount applies to. - AppliesToKeys []string `json:"appliesToKeys"` - - Discount productcatalog.Discount -} - -type SubscriptionPhaseDiscount struct { - models.NamespacedID - models.ManagedModel - - // SubscriptionPhaseId is the ID of the phase this Discount belongs to. - SubscriptionPhaseId string `json:"subscriptionPhaseId"` -} - -type AddSubscriptionPhaseDiscountInput struct { - SubscriptionPhaseId models.NamespacedID `json:"subscriptionPhaseId"` - AppliedDiscount -} - -type DiscountAdapter interface { - Add(ctx context.Context, input AddSubscriptionPhaseDiscountInput) (SubscriptionPhaseDiscount, error) - Remove(ctx context.Context, id models.NamespacedID) error - GetForPhase(ctx context.Context, phaseId models.NamespacedID) ([]SubscriptionPhaseDiscount, error) -} diff --git a/openmeter/subscription/httpdriver/create.go b/openmeter/subscription/httpdriver/create.go new file mode 100644 index 000000000..da6a4880f --- /dev/null +++ b/openmeter/subscription/httpdriver/create.go @@ -0,0 +1,81 @@ +package httpdriver + +import ( + "context" + "fmt" + "net/http" + + "github.com/openmeterio/openmeter/api" + "github.com/openmeterio/openmeter/openmeter/subscription" + "github.com/openmeterio/openmeter/pkg/convert" + "github.com/openmeterio/openmeter/pkg/framework/commonhttp" + "github.com/openmeterio/openmeter/pkg/framework/transport/httptransport" + "github.com/openmeterio/openmeter/pkg/models" +) + +type ( + // TODO: might need or not need a single interface for using the multiple workflow methods + CreateSubscriptionRequest = subscription.CreateFromPlanInput + CreateSubscriptionResponse = api.Subscription + // CreateSubscriptionParams = api.CreateSubscriptionParams + // CreateSubscriptionHandler httptransport.HandlerWithArgs[ListPlansRequest, ListPlansResponse, ListPlansParams] + CreateSubscriptionHandler = httptransport.Handler[CreateSubscriptionRequest, CreateSubscriptionResponse] +) + +func (h *handler) CreateSubscription() CreateSubscriptionHandler { + return httptransport.NewHandler( + func(ctx context.Context, r *http.Request) (CreateSubscriptionRequest, error) { + body := api.CreateSubscriptionJSONRequestBody{} + + if err := commonhttp.JSONRequestBodyDecoder(r, &body); err != nil { + return CreateSubscriptionRequest{}, err + } + + ns, err := h.resolveNamespace(ctx) + if err != nil { + return CreateSubscriptionRequest{}, fmt.Errorf("failed to resolve namespace: %w", err) + } + + planSubBody, errAsPlanSub := body.AsPlanSubscriptionCreate() + _, errAsCustSub := body.AsCustomSubscriptionCreate() + + // Custom subscription creation is not currently supported + if errAsPlanSub != nil && errAsCustSub == nil { + return CreateSubscriptionRequest{}, commonhttp.NewHTTPError(http.StatusNotImplemented, fmt.Errorf("custom subscription creation is not supported")) + } + + if errAsPlanSub != nil { + return CreateSubscriptionRequest{}, errAsPlanSub + } + + return CreateSubscriptionRequest{ + Namespace: ns, + ActiveFrom: planSubBody.ActiveFrom, + CustomerID: planSubBody.CustomerId, + Plan: subscription.PlanRefInput{ + Key: planSubBody.Plan.Key, + Version: planSubBody.Plan.Version, + }, + Name: planSubBody.Name, + Description: planSubBody.Description, + AnnotatedModel: models.AnnotatedModel{ + Metadata: convert.DerefHeaderPtr[string](planSubBody.Metadata), + }, + }, nil + }, + func(ctx context.Context, request CreateSubscriptionRequest) (CreateSubscriptionResponse, error) { + subView, err := h.SubscriptionWorkflowService.CreateFromPlan(ctx, request) + if err != nil { + return CreateSubscriptionResponse{}, err + } + + return MapSubscriptionToAPI(subView.Subscription), nil + }, + commonhttp.JSONResponseEncoderWithStatus[CreateSubscriptionResponse](http.StatusCreated), + httptransport.AppendOptions( + h.Options, + httptransport.WithOperationName("createSubscription"), + httptransport.WithErrorEncoder(errorEncoder()), + )..., + ) +} diff --git a/openmeter/subscription/httpdriver/edit.go b/openmeter/subscription/httpdriver/edit.go new file mode 100644 index 000000000..e4ca4e9c1 --- /dev/null +++ b/openmeter/subscription/httpdriver/edit.go @@ -0,0 +1,75 @@ +package httpdriver + +import ( + "context" + "fmt" + "net/http" + + "github.com/openmeterio/openmeter/api" + "github.com/openmeterio/openmeter/openmeter/subscription" + "github.com/openmeterio/openmeter/pkg/framework/commonhttp" + "github.com/openmeterio/openmeter/pkg/framework/transport/httptransport" + "github.com/openmeterio/openmeter/pkg/models" +) + +type ( + EditSubscriptionRequest = struct { + ID models.NamespacedID + Customizations []subscription.Patch + } + EditSubscriptionResponse = api.Subscription + EditSubscriptionParams = struct { + ID string + } + EditSubscriptionHandler = httptransport.HandlerWithArgs[EditSubscriptionRequest, EditSubscriptionResponse, EditSubscriptionParams] +) + +func (h *handler) EditSubscription() EditSubscriptionHandler { + return httptransport.NewHandlerWithArgs( + func(ctx context.Context, r *http.Request, params EditSubscriptionParams) (EditSubscriptionRequest, error) { + ns, err := h.resolveNamespace(ctx) + if err != nil { + return EditSubscriptionRequest{}, err + } + + var body api.EditSubscriptionJSONRequestBody + + if err := commonhttp.JSONRequestBodyDecoder(r, &body); err != nil { + return EditSubscriptionRequest{}, err + } + + if len(body.Customizations) == 0 { + return EditSubscriptionRequest{}, fmt.Errorf("missing customizations") + } + + patches := make([]subscription.Patch, 0, len(body.Customizations)) + for idx, patch := range body.Customizations { + p, err := MapAPISubscriptionEditOperationToPatch(patch) + if err != nil { + return EditSubscriptionRequest{}, fmt.Errorf("failed to map patch at idx %d to subscription.Patch: %w", idx, err) + } + + patches = append(patches, p) + } + + return EditSubscriptionRequest{ + ID: models.NamespacedID{Namespace: ns, ID: params.ID}, + Customizations: patches, + }, nil + }, + func(ctx context.Context, req EditSubscriptionRequest) (EditSubscriptionResponse, error) { + sub, err := h.SubscriptionWorkflowService.EditRunning(ctx, req.ID, req.Customizations) + if err != nil { + return EditSubscriptionResponse{}, err + } + + return MapSubscriptionToAPI(sub.Subscription), nil + }, + commonhttp.JSONResponseEncoderWithStatus[EditSubscriptionResponse](http.StatusOK), + httptransport.AppendOptions( + h.Options, + httptransport.WithOperationName("getSubscription"), + httptransport.WithErrorEncoder(errorEncoder()), + )..., + ) +} diff --git a/openmeter/subscription/httpdriver/errors.go b/openmeter/subscription/httpdriver/errors.go new file mode 100644 index 000000000..ec444c689 --- /dev/null +++ b/openmeter/subscription/httpdriver/errors.go @@ -0,0 +1,41 @@ +package httpdriver + +import ( + "context" + "net/http" + + customerentity "github.com/openmeterio/openmeter/openmeter/customer/entity" + "github.com/openmeterio/openmeter/openmeter/productcatalog/feature" + "github.com/openmeterio/openmeter/openmeter/productcatalog/plan" + "github.com/openmeterio/openmeter/openmeter/subscription" + "github.com/openmeterio/openmeter/pkg/framework/commonhttp" + "github.com/openmeterio/openmeter/pkg/framework/transport/httptransport" + "github.com/openmeterio/openmeter/pkg/models" +) + +func errorEncoder() httptransport.ErrorEncoder { + return func(ctx context.Context, err error, w http.ResponseWriter, r *http.Request) bool { + // Generic errors + return commonhttp.HandleErrorIfTypeMatches[*models.GenericUserError](ctx, http.StatusBadRequest, err, w) || + commonhttp.HandleErrorIfTypeMatches[*models.GenericForbiddenError](ctx, http.StatusForbidden, err, w) || + commonhttp.HandleErrorIfTypeMatches[*models.GenericConflictError](ctx, http.StatusConflict, err, w) || + // Subscription errors + commonhttp.HandleErrorIfTypeMatches[*subscription.ForbiddenError](ctx, http.StatusForbidden, err, w) || + commonhttp.HandleErrorIfTypeMatches[*subscription.ItemNotFoundError](ctx, http.StatusNotFound, err, w) || + commonhttp.HandleErrorIfTypeMatches[*subscription.NotFoundError](ctx, http.StatusNotFound, err, w) || + commonhttp.HandleErrorIfTypeMatches[*subscription.PatchConflictError](ctx, http.StatusConflict, err, w) || + commonhttp.HandleErrorIfTypeMatches[*subscription.PatchForbiddenError](ctx, http.StatusForbidden, err, w) || + commonhttp.HandleErrorIfTypeMatches[*subscription.PatchValidationError](ctx, http.StatusBadRequest, err, w) || + commonhttp.HandleErrorIfTypeMatches[*subscription.PhaseNotFoundError](ctx, http.StatusNotFound, err, w) || + commonhttp.HandleErrorIfTypeMatches[*subscription.PlanNotFoundError](ctx, http.StatusNotFound, err, w) || + // FIXME: dependency errors should not have to be matched everywhere + // dependency: plan + commonhttp.HandleErrorIfTypeMatches[*feature.FeatureNotFoundError](ctx, http.StatusBadRequest, err, w) || + commonhttp.HandleErrorIfTypeMatches[plan.ValidationError](ctx, http.StatusBadRequest, err, w) || + // dependency: customer + commonhttp.HandleErrorIfTypeMatches[customerentity.NotFoundError](ctx, http.StatusNotFound, err, w) || + commonhttp.HandleErrorIfTypeMatches[customerentity.ValidationError](ctx, http.StatusBadRequest, err, w) || + commonhttp.HandleErrorIfTypeMatches[customerentity.UpdateAfterDeleteError](ctx, http.StatusConflict, err, w) || + commonhttp.HandleErrorIfTypeMatches[customerentity.SubjectKeyConflictError](ctx, http.StatusConflict, err, w) + } +} diff --git a/openmeter/subscription/httpdriver/get.go b/openmeter/subscription/httpdriver/get.go new file mode 100644 index 000000000..4a642f811 --- /dev/null +++ b/openmeter/subscription/httpdriver/get.go @@ -0,0 +1,64 @@ +package httpdriver + +import ( + "context" + "fmt" + "net/http" + + "github.com/openmeterio/openmeter/api" + "github.com/openmeterio/openmeter/pkg/framework/commonhttp" + "github.com/openmeterio/openmeter/pkg/framework/transport/httptransport" + "github.com/openmeterio/openmeter/pkg/models" +) + +type ( + GetSubscriptionRequest = struct { + ID models.NamespacedID + Query api.GetSubscriptionParams + } + GetSubscriptionResponse = api.SubscriptionExpanded + GetSubscriptionParams = struct { + Query api.GetSubscriptionParams + ID string + } + GetSubscriptionHandler = httptransport.HandlerWithArgs[GetSubscriptionRequest, GetSubscriptionResponse, GetSubscriptionParams] +) + +func (h *handler) GetSubscription() GetSubscriptionHandler { + return httptransport.NewHandlerWithArgs( + func(ctx context.Context, r *http.Request, params GetSubscriptionParams) (GetSubscriptionRequest, error) { + ns, err := h.resolveNamespace(ctx) + if err != nil { + return GetSubscriptionRequest{}, fmt.Errorf("failed to resolve namespace: %w", err) + } + + return GetSubscriptionRequest{ + ID: models.NamespacedID{ + Namespace: ns, + ID: params.ID, + }, + Query: params.Query, + }, nil + }, + func(ctx context.Context, req GetSubscriptionRequest) (GetSubscriptionResponse, error) { + var def GetSubscriptionResponse + + if req.Query.At != nil { + return def, commonhttp.NewHTTPError(http.StatusNotImplemented, fmt.Errorf("historical queries are not supported")) + } + + view, err := h.SubscriptionService.GetView(ctx, req.ID) + if err != nil { + return def, err + } + + return MapSubscriptionViewToAPI(view) + }, + commonhttp.JSONResponseEncoderWithStatus[GetSubscriptionResponse](http.StatusOK), + httptransport.AppendOptions( + h.Options, + httptransport.WithOperationName("getSubscription"), + httptransport.WithErrorEncoder(errorEncoder()), + )..., + ) +} diff --git a/openmeter/subscription/httpdriver/handler.go b/openmeter/subscription/httpdriver/handler.go new file mode 100644 index 000000000..2b1fd80da --- /dev/null +++ b/openmeter/subscription/httpdriver/handler.go @@ -0,0 +1,47 @@ +package httpdriver + +import ( + "context" + "errors" + "log/slog" + "net/http" + + "github.com/openmeterio/openmeter/openmeter/namespace/namespacedriver" + "github.com/openmeterio/openmeter/openmeter/subscription" + "github.com/openmeterio/openmeter/pkg/framework/commonhttp" + "github.com/openmeterio/openmeter/pkg/framework/transport/httptransport" +) + +type Handler interface { + CreateSubscription() CreateSubscriptionHandler + GetSubscription() GetSubscriptionHandler + EditSubscription() EditSubscriptionHandler +} + +type HandlerConfig struct { + SubscriptionWorkflowService subscription.WorkflowService + SubscriptionService subscription.Service + NamespaceDecoder namespacedriver.NamespaceDecoder + Logger *slog.Logger +} + +type handler struct { + HandlerConfig + Options []httptransport.HandlerOption +} + +func (h *handler) resolveNamespace(ctx context.Context) (string, error) { + ns, ok := h.NamespaceDecoder.GetNamespace(ctx) + if !ok { + return "", commonhttp.NewHTTPError(http.StatusInternalServerError, errors.New("internal server error")) + } + + return ns, nil +} + +func NewHandler(config HandlerConfig, options ...httptransport.HandlerOption) Handler { + return &handler{ + HandlerConfig: config, + Options: options, + } +} diff --git a/openmeter/subscription/httpdriver/mapping.go b/openmeter/subscription/httpdriver/mapping.go new file mode 100644 index 000000000..d9b0dc01f --- /dev/null +++ b/openmeter/subscription/httpdriver/mapping.go @@ -0,0 +1,403 @@ +package httpdriver + +import ( + "fmt" + "time" + + "github.com/samber/lo" + + "github.com/openmeterio/openmeter/api" + entitlementdriver "github.com/openmeterio/openmeter/openmeter/entitlement/driver" + "github.com/openmeterio/openmeter/openmeter/productcatalog" + plandriver "github.com/openmeterio/openmeter/openmeter/productcatalog/plan/httpdriver" + planhttpdriver "github.com/openmeterio/openmeter/openmeter/productcatalog/plan/httpdriver" + "github.com/openmeterio/openmeter/openmeter/subscription" + subscriptionplan "github.com/openmeterio/openmeter/openmeter/subscription/adapters/plan" + "github.com/openmeterio/openmeter/openmeter/subscription/patch" + "github.com/openmeterio/openmeter/pkg/datex" +) + +func MapAPISubscriptionEditOperationToPatch(apiPatch api.SubscriptionEditOperation) (subscription.Patch, error) { + disc, err := apiPatch.Discriminator() + if err != nil { + return nil, fmt.Errorf("failed to get discriminator: %w", err) + } + + switch disc { + case string(api.EditSubscriptionAddItemOpAddItem): + apiP, err := apiPatch.AsEditSubscriptionAddItem() + if err != nil { + return nil, fmt.Errorf("failed to cast to EditSubscriptionAddItem: %w", err) + } + + // Let's parse and validate value. + // Fortunately TypeSpec to OpenAPI generation is utterly logical and consistent, so we have to work with a structurally identical but differently named type. + planRC, err := plandriver.AsRateCard(apiP.RateCard) + if err != nil { + return nil, fmt.Errorf("failed to cast to RateCard: %w", err) + } + + sPRC := &subscriptionplan.SubscriptionPlanRateCard{ + PhaseKey: apiP.PhaseKey, + RateCard: planRC, + } + + p := patch.PatchAddItem{ + PhaseKey: apiP.PhaseKey, + ItemKey: planRC.Key(), + CreateInput: subscription.SubscriptionItemSpec{ + CreateSubscriptionItemInput: subscription.CreateSubscriptionItemInput{ + CreateSubscriptionItemPlanInput: sPRC.ToCreateSubscriptionItemPlanInput(), + CreateSubscriptionItemCustomerInput: subscription.CreateSubscriptionItemCustomerInput{}, + }, + }, + } + + return p, nil + case string(api.EditSubscriptionRemoveItemOpRemoveItem): + apiP, err := apiPatch.AsEditSubscriptionRemoveItem() + if err != nil { + return nil, fmt.Errorf("failed to cast to EditSubscriptionRemoveItem: %w", err) + } + + p := patch.PatchRemoveItem{ + PhaseKey: apiP.PhaseKey, + ItemKey: apiP.ItemKey, + } + + return p, nil + case string(api.EditSubscriptionAddPhaseOpAddPhase): + apiP, err := apiPatch.AsEditSubscriptionAddPhase() + if err != nil { + return nil, fmt.Errorf("failed to cast to EditSubscriptionAddPhase: %w", err) + } + + var sa datex.Period + if apiP.Phase.StartAfter != nil { + saStr := datex.ISOString(*apiP.Phase.StartAfter) + sa, err = saStr.Parse() + if err != nil { + return nil, fmt.Errorf("failed to parse start after: %w", err) + } + } + + var dur *datex.Period + + if apiP.Phase.Duration != nil { + dS := datex.ISOString(*apiP.Phase.Duration) + d, err := dS.Parse() + if err != nil { + return nil, fmt.Errorf("failed to parse duration: %w", err) + } + + dur = &d + } + + p := patch.PatchAddPhase{ + PhaseKey: apiP.Phase.Key, + CreateInput: subscription.CreateSubscriptionPhaseInput{ + Duration: dur, + CreateSubscriptionPhasePlanInput: subscription.CreateSubscriptionPhasePlanInput{ + PhaseKey: apiP.Phase.Key, + StartAfter: sa, + Name: apiP.Phase.Name, + Description: apiP.Phase.Description, + }, + CreateSubscriptionPhaseCustomerInput: subscription.CreateSubscriptionPhaseCustomerInput{}, + }, + } + + return p, nil + case string(api.EditSubscriptionRemovePhaseOpRemovePhase): + apiP, err := apiPatch.AsEditSubscriptionRemovePhase() + if err != nil { + return nil, fmt.Errorf("failed to cast to EditSubscriptionRemovePhase: %w", err) + } + + var shift subscription.RemoveSubscriptionPhaseShifting + + if apiP.Shift == api.RemovePhaseShiftingNext { + shift = subscription.RemoveSubscriptionPhaseShiftNext + } else if apiP.Shift == api.RemovePhaseShiftingPrev { + shift = subscription.RemoveSubscriptionPhaseShiftPrev + } else { + return nil, fmt.Errorf("unknown shift value: %s", apiP.Shift) + } + + p := patch.PatchRemovePhase{ + PhaseKey: apiP.PhaseKey, + RemoveInput: subscription.RemoveSubscriptionPhaseInput{ + Shift: shift, + }, + } + + return p, nil + case string(api.EditSubscriptionStretchPhaseOpStretchPhase): + apiP, err := apiPatch.AsEditSubscriptionStretchPhase() + if err != nil { + return nil, fmt.Errorf("failed to cast to EditSubscriptionStretchPhase: %w", err) + } + + durStr := datex.ISOString(apiP.ExtendBy) + d, err := durStr.Parse() + if err != nil { + return nil, fmt.Errorf("failed to parse duration: %w", err) + } + + p := patch.PatchStretchPhase{ + PhaseKey: apiP.PhaseKey, + Duration: d, + } + + return p, nil + default: + return nil, fmt.Errorf("unknown discriminator: %s", disc) + } +} + +func MapSubscriptionToAPI(sub subscription.Subscription) api.Subscription { + return api.Subscription{ + Id: sub.ID, + ActiveFrom: sub.ActiveFrom, + ActiveTo: sub.ActiveTo, + CustomerId: sub.CustomerId, + Currency: string(sub.Currency), + Description: sub.Description, + Name: sub.Name, + Plan: api.PlanReference{ + Key: sub.Plan.Key, + Version: sub.Plan.Version, + }, + Metadata: &sub.Metadata, + CreatedAt: sub.CreatedAt, + UpdatedAt: sub.UpdatedAt, + DeletedAt: sub.DeletedAt, + } +} + +func MapSubscriptionItemToAPI(item subscription.SubscriptionItemView) (api.SubscriptionItem, error) { + var included *api.SubscriptionItemIncluded + + // TODO: add feature to view + + if item.Entitlement != nil { + apiEnt, err := entitlementdriver.Parser.ToAPIGeneric(&item.Entitlement.Entitlement) + if err != nil { + return api.SubscriptionItem{}, err + } + + included = &api.SubscriptionItemIncluded{ + Entitlement: apiEnt, + } + } + + var tx *api.TaxConfig + + if item.SubscriptionItem.RateCard.TaxConfig != nil { + txv := planhttpdriver.FromTaxConfig(*item.SubscriptionItem.RateCard.TaxConfig) + tx = &txv + } + + var pr api.SubscriptionItem_Price + + if item.SubscriptionItem.RateCard.Price != nil { + prc, err := MapPriceToAPI(*item.SubscriptionItem.RateCard.Price) + if err != nil { + return api.SubscriptionItem{}, err + } + + pr = prc + } + + return api.SubscriptionItem{ + ActiveFrom: item.SubscriptionItem.ActiveFrom, + ActiveTo: item.SubscriptionItem.ActiveTo, + BillingCandence: (*string)(item.SubscriptionItem.RateCard.BillingCadence.ISOStringPtrOrNil()), + CreatedAt: item.SubscriptionItem.CreatedAt, + DeletedAt: item.SubscriptionItem.DeletedAt, + Description: item.SubscriptionItem.Description, + Id: item.SubscriptionItem.ID, + Included: included, + Key: item.SubscriptionItem.Key, + Metadata: &item.SubscriptionItem.Metadata, + Name: item.SubscriptionItem.Name, + Price: pr, + TaxConfig: tx, + UpdatedAt: item.SubscriptionItem.UpdatedAt, + }, nil +} + +func MapPriceToAPI(price productcatalog.Price) (api.SubscriptionItem_Price, error) { + var res api.SubscriptionItem_Price + + switch price.Type() { + case productcatalog.FlatPriceType: + flatPrice, err := price.AsFlat() + if err != nil { + return res, fmt.Errorf("failed to cast FlatPrice: %w", err) + } + + err = res.FromSubscriptionItemPrice0(api.FlatPriceWithPaymentTerm{ + Amount: flatPrice.Amount.String(), + PaymentTerm: lo.ToPtr(planhttpdriver.FromPaymentTerm(flatPrice.PaymentTerm)), + Type: api.FlatPriceWithPaymentTermTypeFlat, + }) + if err != nil { + return res, fmt.Errorf("failed to cast FlatPrice: %w", err) + } + case productcatalog.UnitPriceType: + unitPrice, err := price.AsUnit() + if err != nil { + return res, fmt.Errorf("failed to cast UnitPrice: %w", err) + } + + var minimumAmount *string + if unitPrice.MinimumAmount != nil { + minimumAmount = lo.ToPtr(unitPrice.MinimumAmount.String()) + } + + var maximumAmount *string + if unitPrice.MaximumAmount != nil { + maximumAmount = lo.ToPtr(unitPrice.MaximumAmount.String()) + } + + err = res.FromSubscriptionItemPrice1(api.UnitPriceWithCommitments{ + Amount: unitPrice.Amount.String(), + MinimumAmount: minimumAmount, + MaximumAmount: maximumAmount, + Type: api.UnitPriceWithCommitmentsTypeUnit, + }) + if err != nil { + return res, fmt.Errorf("failed to cast UnitPrice: %w", err) + } + case productcatalog.TieredPriceType: + tieredPrice, err := price.AsTiered() + if err != nil { + return res, fmt.Errorf("failed to cast TieredPrice: %w", err) + } + + var minimumAmount *string + if tieredPrice.MinimumAmount != nil { + minimumAmount = lo.ToPtr(tieredPrice.MinimumAmount.String()) + } + + var maximumAmount *string + if tieredPrice.MaximumAmount != nil { + maximumAmount = lo.ToPtr(tieredPrice.MaximumAmount.String()) + } + + err = res.FromSubscriptionItemPrice2(api.TieredPriceWithCommitments{ + Type: api.TieredPriceWithCommitmentsTypeTiered, + Mode: api.TieredPriceMode(tieredPrice.Mode), + MinimumAmount: minimumAmount, + MaximumAmount: maximumAmount, + Tiers: lo.Map(tieredPrice.Tiers, func(t productcatalog.PriceTier, _ int) api.PriceTier { + var upToAmount *float64 + if t.UpToAmount != nil { + a, _ := t.UpToAmount.Float64() + upToAmount = lo.ToPtr(a) + } + + var unitPrice *api.UnitPrice + if t.UnitPrice != nil { + unitPrice = &api.UnitPrice{ + Type: api.UnitPriceTypeUnit, + Amount: t.UnitPrice.Amount.String(), + } + } + + var flatPrice *api.FlatPrice + if t.FlatPrice != nil { + flatPrice = &api.FlatPrice{ + Type: api.FlatPriceTypeFlat, + Amount: t.FlatPrice.Amount.String(), + } + } + + return api.PriceTier{ + UpToAmount: upToAmount, + UnitPrice: unitPrice, + FlatPrice: flatPrice, + } + }), + }) + if err != nil { + return res, fmt.Errorf("failed to cast TieredPrice: %w", err) + } + default: + return res, fmt.Errorf("unknown price type: %s", price.Type()) + } + + return res, nil +} + +func MapSubscriptionPhaseToAPI(phaseView subscription.SubscriptionPhaseView, endOfPhase *time.Time) (api.SubscriptionPhaseExpanded, error) { + flatItems := lo.Flatten(lo.Values(phaseView.ItemsByKey)) + items := make([]api.SubscriptionItem, 0, len(flatItems)) + + for _, item := range flatItems { + apiItem, err := MapSubscriptionItemToAPI(item) + if err != nil { + return api.SubscriptionPhaseExpanded{}, err + } + + items = append(items, apiItem) + } + + return api.SubscriptionPhaseExpanded{ + ActiveFrom: phaseView.SubscriptionPhase.ActiveFrom, + ActiveTo: endOfPhase, + CreatedAt: phaseView.SubscriptionPhase.CreatedAt, + UpdatedAt: phaseView.SubscriptionPhase.UpdatedAt, + DeletedAt: phaseView.SubscriptionPhase.DeletedAt, + Description: phaseView.SubscriptionPhase.Description, + Discounts: nil, // TODO: add discounts + Id: phaseView.SubscriptionPhase.ID, + // TODO: maybe API should also use ItemsByKey? + Items: items, + Key: phaseView.SubscriptionPhase.Key, + Metadata: &phaseView.SubscriptionPhase.Metadata, + Name: phaseView.SubscriptionPhase.Name, + }, nil +} + +func MapAPISubscriptionToAPIExpanded(sub api.Subscription) api.SubscriptionExpanded { + return api.SubscriptionExpanded{ + ActiveFrom: sub.ActiveFrom, + ActiveTo: sub.ActiveTo, + CreatedAt: sub.CreatedAt, + Currency: sub.Currency, + CustomerId: sub.CustomerId, + DeletedAt: sub.DeletedAt, + Description: sub.Description, + Id: sub.Id, + Metadata: sub.Metadata, + Name: sub.Name, + Phases: nil, + Plan: sub.Plan, + UpdatedAt: sub.UpdatedAt, + } +} + +func MapSubscriptionViewToAPI(view subscription.SubscriptionView) (api.SubscriptionExpanded, error) { + base := MapAPISubscriptionToAPIExpanded(MapSubscriptionToAPI(view.Subscription)) + + phases := make([]api.SubscriptionPhaseExpanded, 0, len(view.Phases)) + for _, phase := range view.Phases { + var endOfPhase *time.Time + if dur, err := view.Spec.GetPhaseCadence(phase.SubscriptionPhase.Key); err == nil { + endOfPhase = dur.ActiveTo + } + + phaseAPI, err := MapSubscriptionPhaseToAPI(phase, endOfPhase) + if err != nil { + return base, err + } + + phases = append(phases, phaseAPI) + } + + base.Phases = phases + + return base, nil +} diff --git a/openmeter/subscription/item.go b/openmeter/subscription/item.go index be570be9c..7b4e5195a 100644 --- a/openmeter/subscription/item.go +++ b/openmeter/subscription/item.go @@ -30,6 +30,11 @@ type SubscriptionItem struct { RateCard RateCard `json:"rateCard"` EntitlementID *string `json:"entitlementId,omitempty"` + // Name + Name string `json:"name"` + + // Description + Description *string `json:"description,omitempty"` } func (i SubscriptionItem) GetCadence(phaseCadence models.CadencedModel) models.CadencedModel { @@ -68,6 +73,8 @@ func (i SubscriptionItem) AsEntityInput() CreateSubscriptionItemEntityInput { Key: i.Key, RateCard: i.RateCard, EntitlementID: i.EntitlementID, + Name: i.Name, + Description: i.Description, } } diff --git a/openmeter/subscription/patch/serialization.go b/openmeter/subscription/patch/serialization.go index 1b13ae48a..6463c8591 100644 --- a/openmeter/subscription/patch/serialization.go +++ b/openmeter/subscription/patch/serialization.go @@ -10,7 +10,7 @@ import ( // wPatch is used to serialize patches type wPatch struct { - Op string `json:"operation"` + Op string `json:"op"` Path string `json:"path"` Value any `json:"value,omitempty"` } @@ -51,11 +51,15 @@ func (p PatchStretchPhase) MarshalJSON() ([]byte, error) { } type rPatch struct { - Op string `json:"operation"` + Op string `json:"op"` Path string `json:"path"` Value json.RawMessage `json:"value,omitempty"` } +// TODO: patch serialization currently is only ever needed for parsing API requests +// The internal patch types (these) don't properly match up with the API types so they're explicitly mapped in the httpdriver package +// In conclusion, this serialization is redundant + // Deserialization of patches func Deserialize(b []byte) (any, error) { p := &rPatch{} diff --git a/openmeter/subscription/phase.go b/openmeter/subscription/phase.go index 3eb997ba2..d10b178b5 100644 --- a/openmeter/subscription/phase.go +++ b/openmeter/subscription/phase.go @@ -9,6 +9,7 @@ import ( type SubscriptionPhase struct { models.NamespacedID models.ManagedModel + models.AnnotatedModel ActiveFrom time.Time `json:"activeFrom"` @@ -23,7 +24,4 @@ type SubscriptionPhase struct { // Description Description *string `json:"description,omitempty"` - - // Metadata - Metadata map[string]string `json:"metadata,omitempty"` } diff --git a/openmeter/subscription/plan.go b/openmeter/subscription/plan.go index 1a1638cdf..8afbf09a9 100644 --- a/openmeter/subscription/plan.go +++ b/openmeter/subscription/plan.go @@ -3,8 +3,15 @@ package subscription import ( "context" "fmt" + + "github.com/openmeterio/openmeter/pkg/currencyx" ) +type PlanRefInput struct { + Key string `json:"key"` + Version *int `json:"version,omitempty"` +} + type PlanRef struct { Key string `json:"key"` Version int `json:"version"` @@ -24,7 +31,7 @@ type PlanAdapter interface { // GetPlan returns the plan with the given key and version with all it's dependent resources. // // If the Plan is Not Found, it should return a PlanNotFoundError. - GetVersion(ctx context.Context, planKey string, version int) (Plan, error) + GetVersion(ctx context.Context, namespace string, ref PlanRefInput) (Plan, error) } // All methods are expected to return stable values. @@ -47,6 +54,9 @@ type Plan interface { GetPhases() []PlanPhase GetKey() string GetVersionNumber() int + + // Will not make sense on the long term + Currency() currencyx.Code } type PlanNotFoundError struct { diff --git a/openmeter/subscription/ratecard.go b/openmeter/subscription/ratecard.go index e58ab17ac..49a6caad0 100644 --- a/openmeter/subscription/ratecard.go +++ b/openmeter/subscription/ratecard.go @@ -62,10 +62,7 @@ func (r RateCard) Validate() error { // Let's validate that everything around the Price is configured correctly if r.Price != nil { - // If a Price is configured, so must be Billing Cadence and Tax Config - if r.BillingCadence == nil { - return fmt.Errorf("missing billing cadence") - } + // If a Price is configured, so must be the Tax Config if r.TaxConfig == nil { return fmt.Errorf("missing tax config") } diff --git a/openmeter/subscription/repo/mapping.go b/openmeter/subscription/repo/mapping.go index ee4ba51ce..e4016d42a 100644 --- a/openmeter/subscription/repo/mapping.go +++ b/openmeter/subscription/repo/mapping.go @@ -28,12 +28,17 @@ func MapDBSubscription(sub *db.Subscription) (subscription.Subscription, error) ActiveFrom: sub.ActiveFrom.UTC(), ActiveTo: convert.SafeToUTC(sub.ActiveTo), }, + AnnotatedModel: models.AnnotatedModel{ + Metadata: sub.Metadata, + }, Plan: subscription.PlanRef{ Key: sub.PlanKey, Version: sub.PlanVersion, }, - CustomerId: sub.CustomerID, - Currency: sub.Currency, + Name: sub.Name, + Description: sub.Description, + CustomerId: sub.CustomerID, + Currency: sub.Currency, }, nil } @@ -52,12 +57,14 @@ func MapDBSubscripitonPhase(phase *db.SubscriptionPhase) (subscription.Subscript UpdatedAt: phase.UpdatedAt.UTC(), DeletedAt: convert.SafeToUTC(phase.DeletedAt), }, + AnnotatedModel: models.AnnotatedModel{ + Metadata: phase.Metadata, + }, ActiveFrom: phase.ActiveFrom.UTC(), SubscriptionID: phase.SubscriptionID, Key: phase.Key, Name: phase.Name, Description: phase.Description, - Metadata: phase.Metadata, }, nil } @@ -107,6 +114,8 @@ func MapDBSubscriptionItem(item *db.SubscriptionItem) (subscription.Subscription AnnotatedModel: models.AnnotatedModel{ Metadata: item.Metadata, }, + Name: item.Name, + Description: item.Description, ActiveFromOverrideRelativeToPhaseStart: sa, ActiveToOverrideRelativeToPhaseStart: ea, SubscriptionId: phase.SubscriptionID, @@ -116,10 +125,10 @@ func MapDBSubscriptionItem(item *db.SubscriptionItem) (subscription.Subscription RateCard: subscription.RateCard{ Name: item.Name, Description: item.Description, - Price: item.Price, FeatureKey: item.FeatureKey, EntitlementTemplate: item.EntitlementTemplate, TaxConfig: item.TaxConfig, + Price: item.Price, BillingCadence: cadence, }, }, nil diff --git a/openmeter/subscription/repo/subscriptionitemrepo.go b/openmeter/subscription/repo/subscriptionitemrepo.go index df3f95732..c81d4c2c0 100644 --- a/openmeter/subscription/repo/subscriptionitemrepo.go +++ b/openmeter/subscription/repo/subscriptionitemrepo.go @@ -88,23 +88,36 @@ func (r *subscriptionItemRepo) Create(ctx context.Context, input subscription.Cr return entutils.TransactingRepo(ctx, r, func(ctx context.Context, repo *subscriptionItemRepo) (subscription.SubscriptionItem, error) { var def subscription.SubscriptionItem - i, err := repo.db.SubscriptionItem.Create(). + cmd := repo.db.SubscriptionItem.Create(). SetNillableActiveFromOverrideRelativeToPhaseStart(input.ActiveFromOverrideRelativeToPhaseStart.ISOStringPtrOrNil()). SetNillableActiveToOverrideRelativeToPhaseStart(input.ActiveToOverrideRelativeToPhaseStart.ISOStringPtrOrNil()). SetActiveFrom(input.ActiveFrom). SetNillableActiveTo(input.ActiveTo). SetNamespace(input.Namespace). + SetName(input.Name). + SetNillableDescription(input.Description). SetPhaseID(input.PhaseID). SetKey(input.Key). SetName(input.RateCard.Name). SetNillableDescription(input.RateCard.Description). SetNillableFeatureKey(input.RateCard.FeatureKey). - SetEntitlementTemplate(input.RateCard.EntitlementTemplate). - SetTaxConfig(input.RateCard.TaxConfig). - SetPrice(input.RateCard.Price). SetNillableEntitlementID(input.EntitlementID). - SetNillableBillingCadence(input.RateCard.BillingCadence.ISOStringPtrOrNil()). - Save(ctx) + SetNillableBillingCadence(input.RateCard.BillingCadence.ISOStringPtrOrNil()) + + // Due to the custom value scanner, these fields don't have Nillable setters generated, and the normal setters panic when trying to call .Validate() on nil + if input.RateCard.EntitlementTemplate != nil { + cmd.SetEntitlementTemplate(input.RateCard.EntitlementTemplate) + } + + if input.RateCard.TaxConfig != nil { + cmd.SetTaxConfig(input.RateCard.TaxConfig) + } + + if input.RateCard.Price != nil { + cmd.SetPrice(input.RateCard.Price) + } + + i, err := cmd.Save(ctx) if err != nil { return def, err } diff --git a/openmeter/subscription/repo/subscriptionrepo.go b/openmeter/subscription/repo/subscriptionrepo.go index 85a289223..ee5b0618d 100644 --- a/openmeter/subscription/repo/subscriptionrepo.go +++ b/openmeter/subscription/repo/subscriptionrepo.go @@ -101,7 +101,10 @@ func (r *subscriptionRepo) Create(ctx context.Context, sub subscription.CreateSu SetPlanVersion(sub.Plan.Version). SetCustomerID(sub.CustomerId). SetCurrency(sub.Currency). - SetActiveFrom(sub.ActiveFrom) + SetActiveFrom(sub.ActiveFrom). + SetName(sub.Name). + SetNillableDescription(sub.Description). + SetMetadata(sub.Metadata) if sub.ActiveTo != nil { command = command.SetActiveTo(*sub.ActiveTo) diff --git a/openmeter/subscription/repository.go b/openmeter/subscription/repository.go index b6b552c78..bcd86f933 100644 --- a/openmeter/subscription/repository.go +++ b/openmeter/subscription/repository.go @@ -2,6 +2,7 @@ package subscription import ( "context" + "maps" "reflect" "time" @@ -14,8 +15,11 @@ import ( type CreateSubscriptionEntityInput struct { models.CadencedModel models.NamespacedModel + models.AnnotatedModel - Plan PlanRef + Plan PlanRef + Name string `json:"name,omitempty"` + Description *string `json:"description,omitempty"` CustomerId string `json:"customerId,omitempty"` Currency currencyx.Code @@ -38,6 +42,7 @@ type SubscriptionRepository interface { type CreateSubscriptionPhaseEntityInput struct { models.NamespacedModel + models.AnnotatedModel // ActiveFrom is the time the phase becomes active. ActiveFrom time.Time @@ -54,9 +59,6 @@ type CreateSubscriptionPhaseEntityInput struct { // Description Description *string `json:"description,omitempty"` - // Metadata - Metadata map[string]string `json:"metadata,omitempty"` - // StartAfter StartAfter datex.Period `json:"interval"` } @@ -94,10 +96,17 @@ type CreateSubscriptionItemEntityInput struct { RateCard RateCard EntitlementID *string + Name string `json:"name,omitempty"` + Description *string `json:"description,omitempty"` } func (i CreateSubscriptionItemEntityInput) Equal(other CreateSubscriptionItemEntityInput) bool { - return reflect.DeepEqual(i, other) + a := i + a.AnnotatedModel = models.AnnotatedModel{} + b := other + b.AnnotatedModel = models.AnnotatedModel{} + + return reflect.DeepEqual(a, b) && maps.Equal(i.Metadata, other.Metadata) } type SubscriptionItemRepository interface { diff --git a/openmeter/subscription/service.go b/openmeter/subscription/service.go index 0359d79fe..f6e09bb4c 100644 --- a/openmeter/subscription/service.go +++ b/openmeter/subscription/service.go @@ -4,7 +4,6 @@ import ( "context" "time" - "github.com/openmeterio/openmeter/pkg/currencyx" "github.com/openmeterio/openmeter/pkg/models" ) @@ -29,13 +28,12 @@ type WorkflowService interface { } type CreateFromPlanInput struct { - Namespace string - ActiveFrom time.Time - CustomerID string - Currency currencyx.Code + Namespace string + ActiveFrom time.Time + CustomerID string + Name string + Description *string + models.AnnotatedModel - Plan PlanRef - - // Allowed customizations via Patches - Customization []Patch + Plan PlanRefInput } diff --git a/openmeter/subscription/service/service.go b/openmeter/subscription/service/service.go index 347126fec..18ebf6bc8 100644 --- a/openmeter/subscription/service/service.go +++ b/openmeter/subscription/service/service.go @@ -23,7 +23,6 @@ type ServiceConfig struct { CustomerService customer.Service // adapters EntitlementAdapter subscription.EntitlementAdapter - DiscountAdapter subscription.DiscountAdapter // framework TransactionManager transaction.Creator } diff --git a/openmeter/subscription/service/service_test.go b/openmeter/subscription/service/service_test.go index 5fd764fca..e98b7aa30 100644 --- a/openmeter/subscription/service/service_test.go +++ b/openmeter/subscription/service/service_test.go @@ -39,6 +39,7 @@ func TestCreation(t *testing.T) { CustomerId: cust.ID, Currency: "USD", ActiveFrom: currentTime, + Name: "Test Subscription", }) require.Nil(t, err) @@ -179,6 +180,7 @@ func TestCancellation(t *testing.T) { CustomerId: cust.ID, Currency: "USD", ActiveFrom: currentTime, + Name: "Test Subscription", }) require.Nil(t, err) @@ -291,6 +293,7 @@ func TestContinuing(t *testing.T) { CustomerId: cust.ID, Currency: "USD", ActiveFrom: currentTime, + Name: "Test Subscription", }) require.Nil(t, err) diff --git a/openmeter/subscription/service/workflowservice.go b/openmeter/subscription/service/workflowservice.go index 4ca5b2f26..2bb1ad1cd 100644 --- a/openmeter/subscription/service/workflowservice.go +++ b/openmeter/subscription/service/workflowservice.go @@ -53,37 +53,24 @@ func (s *workflowService) CreateFromPlan(ctx context.Context, inp subscription.C } // Let's validate the plan exists - plan, err := s.PlanAdapter.GetVersion(ctx, inp.Plan.Key, inp.Plan.Version) + plan, err := s.PlanAdapter.GetVersion(ctx, inp.Namespace, inp.Plan) if err != nil { return def, fmt.Errorf("failed to fetch plan: %w", err) } - // Let's validate the patches - for i, patch := range inp.Customization { - if err := patch.Validate(); err != nil { - return def, fmt.Errorf("invalid patch at index %d: %w", i, err) - } - } - // Let's create the new Spec spec, err := subscription.NewSpecFromPlan(plan, subscription.CreateSubscriptionCustomerInput{ - CustomerId: cust.ID, - Currency: inp.Currency, - ActiveFrom: inp.ActiveFrom, + CustomerId: cust.ID, + Currency: plan.Currency(), + ActiveFrom: inp.ActiveFrom, + AnnotatedModel: inp.AnnotatedModel, + Name: inp.Name, + Description: inp.Description, }) if err != nil { return def, fmt.Errorf("failed to create spec from plan: %w", err) } - // Let's apply the customizations - err = spec.ApplyPatches(lo.Map(inp.Customization, subscription.ToApplies), subscription.ApplyContext{ - Operation: subscription.SpecOperationCreate, - CurrentTime: clock.Now(), - }) - if err != nil { - return def, fmt.Errorf("failed to apply customizations: %w", err) - } - // Finally, let's create the subscription return transaction.Run(ctx, s.TransactionManager, func(ctx context.Context) (subscription.SubscriptionView, error) { sub, err := s.Service.Create(ctx, inp.Namespace, spec) @@ -105,7 +92,7 @@ func (s *workflowService) EditRunning(ctx context.Context, subscriptionID models // Let's validate the patches for i, patch := range customizations { if err := patch.Validate(); err != nil { - return subscription.SubscriptionView{}, fmt.Errorf("invalid patch at index %d: %w", i, err) + return subscription.SubscriptionView{}, &models.GenericUserError{Message: fmt.Sprintf("invalid patch at index %d: %s", i, err.Error())} } } @@ -116,7 +103,10 @@ func (s *workflowService) EditRunning(ctx context.Context, subscriptionID models Operation: subscription.SpecOperationEdit, CurrentTime: clock.Now(), }) - if err != nil { + if sErr, ok := lo.ErrorsAs[*subscription.SpecValidationError](err); ok { + // FIXME: error details are lost here + return subscription.SubscriptionView{}, &models.GenericUserError{Message: sErr.Error()} + } else if err != nil { return subscription.SubscriptionView{}, fmt.Errorf("failed to apply customizations: %w", err) } diff --git a/openmeter/subscription/service/workflowservice_test.go b/openmeter/subscription/service/workflowservice_test.go index 010838c9d..bf5cc1bef 100644 --- a/openmeter/subscription/service/workflowservice_test.go +++ b/openmeter/subscription/service/workflowservice_test.go @@ -42,8 +42,10 @@ func TestCreateFromPlan(t *testing.T) { CustomerID: fmt.Sprintf("nonexistent-customer-%s", deps.Customer.ID), Namespace: subscriptiontestutils.ExampleNamespace, ActiveFrom: deps.CurrentTime, - Currency: "USD", - Plan: subscriptiontestutils.ExamplePlanRef, + Plan: subscription.PlanRefInput{ + Key: subscriptiontestutils.ExamplePlanRef.Key, + Version: &subscriptiontestutils.ExamplePlanRef.Version, + }, }) assert.ErrorAs(t, err, &customerentity.NotFoundError{}, "expected customer not found error, got %T", err) @@ -59,8 +61,7 @@ func TestCreateFromPlan(t *testing.T) { CustomerID: deps.Customer.ID, Namespace: subscriptiontestutils.ExampleNamespace, ActiveFrom: deps.CurrentTime, - Currency: "USD", - Plan: subscription.PlanRef{Key: "nonexistent-plan", Version: 1}, + Plan: subscription.PlanRefInput{Key: "nonexistent-plan", Version: lo.ToPtr(1)}, }) // assert.ErrorAs does not recognize this error @@ -68,206 +69,207 @@ func TestCreateFromPlan(t *testing.T) { assert.True(t, isErr, "expected plan not found error, got %T", err) }, }, - { - Name: "Should error if a patch is invalid", - Handler: func(t *testing.T, deps testCaseDeps) { - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - errorMsg := "this is an invalid patch" - - invalidPatch := subscriptiontestutils.TestPatch{ - ValdiateFn: func() error { - return errors.New(errorMsg) - }, - } - - _, err := deps.WorkflowService.CreateFromPlan(ctx, subscription.CreateFromPlanInput{ - CustomerID: deps.Customer.ID, - Namespace: subscriptiontestutils.ExampleNamespace, - ActiveFrom: deps.CurrentTime, - Currency: "USD", - Plan: subscriptiontestutils.ExamplePlanRef, - Customization: []subscription.Patch{&invalidPatch}, - }) - - assert.ErrorContains(t, err, errorMsg, "expected error message to contain %q, got %v", errorMsg, err) - }, - }, - { - Name: "Should apply the patch to the specs based on the plan", - Handler: func(t *testing.T, deps testCaseDeps) { - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - // As we assert for the contextual time, we need to freeze the clock - clock.FreezeTime(deps.CurrentTime) - defer clock.UnFreeze() - - errMsg := "this custom patch apply failed" - - expectedPlanSpec, err := subscription.NewSpecFromPlan(subscriptiontestutils.GetExamplePlan(), subscription.CreateSubscriptionCustomerInput{ - CustomerId: deps.Customer.ID, - Currency: "USD", - ActiveFrom: deps.CurrentTime, - }) - require.Nil(t, err) - - patch1 := subscriptiontestutils.TestPatch{ - ApplyToFn: func(spec *subscription.SubscriptionSpec, c subscription.ApplyContext) error { - // Let's assert that the correct spec is passed to the patch - assert.Equal(t, &expectedPlanSpec, spec, "expected spec to be equal to the plan spec") - assert.Equal(t, subscription.ApplyContext{ - CurrentTime: deps.CurrentTime, - Operation: subscription.SpecOperationCreate, - }, c, "apply context is incorrect") - - // Lets modify the spec to see if its passed to the next - spec.Plan.Key = "modified-plan" - - return nil - }, - } - - patch2 := subscriptiontestutils.TestPatch{ - ApplyToFn: func(spec *subscription.SubscriptionSpec, c subscription.ApplyContext) error { - // Let's see if the modification is passed along - assert.Equal(t, "modified-plan", spec.Plan.Key, "expected plan key to be modified") - - return nil - }, - } - - patch3 := subscriptiontestutils.TestPatch{ - ApplyToFn: func(spec *subscription.SubscriptionSpec, c subscription.ApplyContext) error { - // And let's test if errors are passed correctly - return errors.New(errMsg) - }, - } - - _, err = deps.WorkflowService.CreateFromPlan(ctx, subscription.CreateFromPlanInput{ - CustomerID: deps.Customer.ID, - Namespace: subscriptiontestutils.ExampleNamespace, - ActiveFrom: deps.CurrentTime, - Currency: "USD", - Plan: subscriptiontestutils.ExamplePlanRef, - Customization: []subscription.Patch{ - &patch1, - &patch2, - &patch3, - }, - }) - - // Let's validate the error is surfaced - assert.ErrorContains(t, err, errMsg, "expected error message to contain %q, got %v", errMsg, err) - }, - }, - { - Name: "Should use the output of patches without modifications", - Handler: func(t *testing.T, deps testCaseDeps) { - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - returnedSpec := subscription.SubscriptionSpec{ - CreateSubscriptionPlanInput: subscription.CreateSubscriptionPlanInput{ - Plan: subscription.PlanRef{ - Key: "returned-plan", - Version: 1, - }, - }, - CreateSubscriptionCustomerInput: subscription.CreateSubscriptionCustomerInput{ - CustomerId: "new-customer-id", - }, - Phases: map[string]*subscription.SubscriptionPhaseSpec{ - "phase-1": { - CreateSubscriptionPhasePlanInput: subscription.CreateSubscriptionPhasePlanInput{ - PhaseKey: "phase-1", - StartAfter: testutils.GetISODuration(t, "P1D"), - Name: "Phase 1", - }, - ItemsByKey: map[string][]subscription.SubscriptionItemSpec{ - "item-1": { - { - CreateSubscriptionItemInput: subscription.CreateSubscriptionItemInput{ - CreateSubscriptionItemPlanInput: subscription.CreateSubscriptionItemPlanInput{ - ItemKey: "item-1", - PhaseKey: "phase-1", - RateCard: subscription.RateCard{ - Name: "rate-card-1", - }, - }, - }, - }, - }, - }, - }, - }, - } - - patch1 := subscriptiontestutils.TestPatch{ - ApplyToFn: func(spec *subscription.SubscriptionSpec, c subscription.ApplyContext) error { - // Let's set the new values - - spec.CreateSubscriptionPlanInput = returnedSpec.CreateSubscriptionPlanInput - spec.CreateSubscriptionCustomerInput = returnedSpec.CreateSubscriptionCustomerInput - spec.Phases = returnedSpec.Phases - - return nil - }, - } - - sID := models.NamespacedID{ - Namespace: subscriptiontestutils.ExampleNamespace, - ID: "new-subscription-id", - } - - rView := subscription.SubscriptionView{ - Subscription: subscription.Subscription{ - CustomerId: "bogus-id", - }, - } - - mSvc := subscriptiontestutils.MockService{ - CreateFn: func(ctx context.Context, namespace string, spec subscription.SubscriptionSpec) (subscription.Subscription, error) { - // Let's validate that the spec is passed as is - assert.Equal(t, returnedSpec, spec, "expected spec to be equal to the returned spec") - - return subscription.Subscription{ - NamespacedID: sID, - }, nil - }, - GetViewFn: func(ctx context.Context, id models.NamespacedID) (subscription.SubscriptionView, error) { - assert.Equal(t, sID, id, "expected id to be equal to the returned id") - - return rView, nil - }, - } - - _, tuDeps := subscriptiontestutils.NewService(t, deps.DBDeps) - tuDeps.PlanAdapter.AddPlan(t, subscriptiontestutils.GetExamplePlan()) - - workflowService := service.NewWorkflowService(service.WorkflowServiceConfig{ - Service: &mSvc, - CustomerService: tuDeps.CustomerService, - PlanAdapter: tuDeps.PlanAdapter, - TransactionManager: tuDeps.CustomerAdapter, - }) - - res, err := workflowService.CreateFromPlan(ctx, subscription.CreateFromPlanInput{ - CustomerID: deps.Customer.ID, - Namespace: subscriptiontestutils.ExampleNamespace, - ActiveFrom: deps.CurrentTime, - Currency: "USD", - Plan: subscriptiontestutils.ExamplePlanRef, - Customization: []subscription.Patch{ - &patch1, - }, - }) - - assert.Nil(t, err) - - assert.Equal(t, rView, res) - }, - }, + // TODO: validate patches separately + // { + // Name: "Should error if a patch is invalid", + // Handler: func(t *testing.T, deps testCaseDeps) { + // ctx, cancel := context.WithCancel(context.Background()) + // defer cancel() + // errorMsg := "this is an invalid patch" + + // invalidPatch := subscriptiontestutils.TestPatch{ + // ValdiateFn: func() error { + // return errors.New(errorMsg) + // }, + // } + + // _, err := deps.WorkflowService.CreateFromPlan(ctx, subscription.CreateFromPlanInput{ + // CustomerID: deps.Customer.ID, + // Namespace: subscriptiontestutils.ExampleNamespace, + // ActiveFrom: deps.CurrentTime, + // Currency: "USD", + // Plan: subscriptiontestutils.ExamplePlanRef, + // Customization: []subscription.Patch{&invalidPatch}, + // }) + + // assert.ErrorContains(t, err, errorMsg, "expected error message to contain %q, got %v", errorMsg, err) + // }, + // }, + // { + // Name: "Should apply the patch to the specs based on the plan", + // Handler: func(t *testing.T, deps testCaseDeps) { + // ctx, cancel := context.WithCancel(context.Background()) + // defer cancel() + + // // As we assert for the contextual time, we need to freeze the clock + // clock.FreezeTime(deps.CurrentTime) + // defer clock.UnFreeze() + + // errMsg := "this custom patch apply failed" + + // expectedPlanSpec, err := subscription.NewSpecFromPlan(subscriptiontestutils.GetExamplePlan(), subscription.CreateSubscriptionCustomerInput{ + // CustomerId: deps.Customer.ID, + // Currency: "USD", + // ActiveFrom: deps.CurrentTime, + // }) + // require.Nil(t, err) + + // patch1 := subscriptiontestutils.TestPatch{ + // ApplyToFn: func(spec *subscription.SubscriptionSpec, c subscription.ApplyContext) error { + // // Let's assert that the correct spec is passed to the patch + // assert.Equal(t, &expectedPlanSpec, spec, "expected spec to be equal to the plan spec") + // assert.Equal(t, subscription.ApplyContext{ + // CurrentTime: deps.CurrentTime, + // Operation: subscription.SpecOperationCreate, + // }, c, "apply context is incorrect") + + // // Lets modify the spec to see if its passed to the next + // spec.Plan.Key = "modified-plan" + + // return nil + // }, + // } + + // patch2 := subscriptiontestutils.TestPatch{ + // ApplyToFn: func(spec *subscription.SubscriptionSpec, c subscription.ApplyContext) error { + // // Let's see if the modification is passed along + // assert.Equal(t, "modified-plan", spec.Plan.Key, "expected plan key to be modified") + + // return nil + // }, + // } + + // patch3 := subscriptiontestutils.TestPatch{ + // ApplyToFn: func(spec *subscription.SubscriptionSpec, c subscription.ApplyContext) error { + // // And let's test if errors are passed correctly + // return errors.New(errMsg) + // }, + // } + + // _, err = deps.WorkflowService.CreateFromPlan(ctx, subscription.CreateFromPlanInput{ + // CustomerID: deps.Customer.ID, + // Namespace: subscriptiontestutils.ExampleNamespace, + // ActiveFrom: deps.CurrentTime, + // Currency: "USD", + // Plan: subscriptiontestutils.ExamplePlanRef, + // Customization: []subscription.Patch{ + // &patch1, + // &patch2, + // &patch3, + // }, + // }) + + // // Let's validate the error is surfaced + // assert.ErrorContains(t, err, errMsg, "expected error message to contain %q, got %v", errMsg, err) + // }, + // }, + // { + // Name: "Should use the output of patches without modifications", + // Handler: func(t *testing.T, deps testCaseDeps) { + // ctx, cancel := context.WithCancel(context.Background()) + // defer cancel() + + // returnedSpec := subscription.SubscriptionSpec{ + // CreateSubscriptionPlanInput: subscription.CreateSubscriptionPlanInput{ + // Plan: subscription.PlanRef{ + // Key: "returned-plan", + // Version: 1, + // }, + // }, + // CreateSubscriptionCustomerInput: subscription.CreateSubscriptionCustomerInput{ + // CustomerId: "new-customer-id", + // }, + // Phases: map[string]*subscription.SubscriptionPhaseSpec{ + // "phase-1": { + // CreateSubscriptionPhasePlanInput: subscription.CreateSubscriptionPhasePlanInput{ + // PhaseKey: "phase-1", + // StartAfter: testutils.GetISODuration(t, "P1D"), + // Name: "Phase 1", + // }, + // ItemsByKey: map[string][]subscription.SubscriptionItemSpec{ + // "item-1": { + // { + // CreateSubscriptionItemInput: subscription.CreateSubscriptionItemInput{ + // CreateSubscriptionItemPlanInput: subscription.CreateSubscriptionItemPlanInput{ + // ItemKey: "item-1", + // PhaseKey: "phase-1", + // RateCard: subscription.RateCard{ + // Name: "rate-card-1", + // }, + // }, + // }, + // }, + // }, + // }, + // }, + // }, + // } + + // patch1 := subscriptiontestutils.TestPatch{ + // ApplyToFn: func(spec *subscription.SubscriptionSpec, c subscription.ApplyContext) error { + // // Let's set the new values + + // spec.CreateSubscriptionPlanInput = returnedSpec.CreateSubscriptionPlanInput + // spec.CreateSubscriptionCustomerInput = returnedSpec.CreateSubscriptionCustomerInput + // spec.Phases = returnedSpec.Phases + + // return nil + // }, + // } + + // sID := models.NamespacedID{ + // Namespace: subscriptiontestutils.ExampleNamespace, + // ID: "new-subscription-id", + // } + + // rView := subscription.SubscriptionView{ + // Subscription: subscription.Subscription{ + // CustomerId: "bogus-id", + // }, + // } + + // mSvc := subscriptiontestutils.MockService{ + // CreateFn: func(ctx context.Context, namespace string, spec subscription.SubscriptionSpec) (subscription.Subscription, error) { + // // Let's validate that the spec is passed as is + // assert.Equal(t, returnedSpec, spec, "expected spec to be equal to the returned spec") + + // return subscription.Subscription{ + // NamespacedID: sID, + // }, nil + // }, + // GetViewFn: func(ctx context.Context, id models.NamespacedID) (subscription.SubscriptionView, error) { + // assert.Equal(t, sID, id, "expected id to be equal to the returned id") + + // return rView, nil + // }, + // } + + // _, tuDeps := subscriptiontestutils.NewService(t, deps.DBDeps) + // tuDeps.PlanAdapter.AddPlan(t, subscriptiontestutils.GetExamplePlan()) + + // workflowService := service.NewWorkflowService(service.WorkflowServiceConfig{ + // Service: &mSvc, + // CustomerService: tuDeps.CustomerService, + // PlanAdapter: tuDeps.PlanAdapter, + // TransactionManager: tuDeps.CustomerAdapter, + // }) + + // res, err := workflowService.CreateFromPlan(ctx, subscription.CreateFromPlanInput{ + // CustomerID: deps.Customer.ID, + // Namespace: subscriptiontestutils.ExampleNamespace, + // ActiveFrom: deps.CurrentTime, + // Currency: "USD", + // Plan: subscriptiontestutils.ExamplePlanRef, + // Customization: []subscription.Patch{ + // &patch1, + // }, + // }) + + // assert.Nil(t, err) + + // assert.Equal(t, rView, res) + // }, + // }, } for _, tc := range testCases { @@ -486,8 +488,11 @@ func TestEditRunning(t *testing.T) { CustomerID: cust.ID, Namespace: subscriptiontestutils.ExampleNamespace, ActiveFrom: tcDeps.CurrentTime, - Currency: "USD", - Plan: subscriptiontestutils.ExamplePlanRef, + Plan: subscription.PlanRefInput{ + Key: subscriptiontestutils.ExamplePlanRef.Key, + Version: &subscriptiontestutils.ExamplePlanRef.Version, + }, + Name: "Example Subscription", }) require.Nil(t, err) diff --git a/openmeter/subscription/subscription.go b/openmeter/subscription/subscription.go index 31a1e9d7b..a79843fa4 100644 --- a/openmeter/subscription/subscription.go +++ b/openmeter/subscription/subscription.go @@ -11,6 +11,10 @@ type Subscription struct { models.NamespacedID models.ManagedModel models.CadencedModel + models.AnnotatedModel + + Name string `json:"name,omitempty"` + Description *string `json:"description,omitempty"` Plan PlanRef diff --git a/openmeter/subscription/subscriptionspec.go b/openmeter/subscription/subscriptionspec.go index cc263127d..3f8caa5db 100644 --- a/openmeter/subscription/subscriptionspec.go +++ b/openmeter/subscription/subscriptionspec.go @@ -1,6 +1,7 @@ package subscription import ( + "errors" "fmt" "slices" "time" @@ -30,10 +31,13 @@ type CreateSubscriptionPlanInput struct { } type CreateSubscriptionCustomerInput struct { - CustomerId string `json:"customerId"` - Currency currencyx.Code `json:"currency"` - ActiveFrom time.Time `json:"activeFrom,omitempty"` - ActiveTo *time.Time `json:"activeTo,omitempty"` + models.AnnotatedModel + Name string `json:"name"` + Description *string `json:"description,omitempty"` + CustomerId string `json:"customerId"` + Currency currencyx.Code `json:"currency"` + ActiveFrom time.Time `json:"activeFrom,omitempty"` + ActiveTo *time.Time `json:"activeTo,omitempty"` } type SubscriptionSpec struct { @@ -44,18 +48,17 @@ type SubscriptionSpec struct { Phases map[string]*SubscriptionPhaseSpec } -func (s SubscriptionSpec) Self() SubscriptionSpec { - return s -} - func (s *SubscriptionSpec) ToCreateSubscriptionEntityInput(ns string) CreateSubscriptionEntityInput { return CreateSubscriptionEntityInput{ NamespacedModel: models.NamespacedModel{ Namespace: ns, }, - Plan: s.Plan, - CustomerId: s.CustomerId, - Currency: s.Currency, + Plan: s.Plan, + CustomerId: s.CustomerId, + Currency: s.Currency, + AnnotatedModel: s.AnnotatedModel, + Name: s.Name, + Description: s.Description, CadencedModel: models.CadencedModel{ ActiveFrom: s.ActiveFrom, ActiveTo: s.ActiveTo, @@ -147,16 +150,17 @@ func (s *SubscriptionSpec) GetCurrentPhaseAt(t time.Time) (*SubscriptionPhaseSpe func (s *SubscriptionSpec) Validate() error { // All consistency checks should happen here + var errs []error for _, phase := range s.Phases { if err := phase.Validate(); err != nil { - return fmt.Errorf("phase %s validation failed: %w", phase.PhaseKey, err) + errs = append(errs, fmt.Errorf("phase %s validation failed: %w", phase.PhaseKey, err)) } } - return nil + return errors.Join(errs...) } type CreateSubscriptionPhasePlanInput struct { - PhaseKey string `json:"phaseKey"` + PhaseKey string `json:"key"` StartAfter datex.Period `json:"startAfter"` Name string `json:"name"` Description *string `json:"description,omitempty"` @@ -173,7 +177,9 @@ func (i CreateSubscriptionPhasePlanInput) Validate() error { return nil } -type CreateSubscriptionPhaseCustomerInput struct{} +type CreateSubscriptionPhaseCustomerInput struct { + models.AnnotatedModel +} type RemoveSubscriptionPhaseShifting int @@ -226,6 +232,7 @@ func (s SubscriptionPhaseSpec) ToCreateSubscriptionPhaseEntityInput( NamespacedModel: models.NamespacedModel{ Namespace: subscription.Namespace, }, + AnnotatedModel: s.AnnotatedModel, SubscriptionID: subscription.ID, Key: s.PhaseKey, Name: s.Name, @@ -235,11 +242,29 @@ func (s SubscriptionPhaseSpec) ToCreateSubscriptionPhaseEntityInput( } func (s *SubscriptionPhaseSpec) Validate() error { + var errs []error + + // Let's validate that the phase is not empty + flat := lo.Flatten(lo.Values(s.ItemsByKey)) + if len(flat) == 0 { + errs = append(errs, &AllowedDuringApplyingPatchesError{ + Inner: &SpecValidationError{ + AffectedKeys: [][]string{ + { + "phaseKey", + s.PhaseKey, + }, + }, + Msg: "Phase must have at least one item", + }, + }) + } + for key, items := range s.ItemsByKey { for _, item := range items { // Let's validate key is correct if item.ItemKey != key { - return &SpecValidationError{ + errs = append(errs, &SpecValidationError{ AffectedKeys: [][]string{ { "phaseKey", @@ -249,12 +274,12 @@ func (s *SubscriptionPhaseSpec) Validate() error { }, }, Msg: "Items must be grouped correctly by key", - } + }) } // Let's validate the phase linking is correct if item.PhaseKey != s.PhaseKey { - return &SpecValidationError{ + errs = append(errs, &SpecValidationError{ AffectedKeys: [][]string{ { "phaseKey", @@ -269,12 +294,12 @@ func (s *SubscriptionPhaseSpec) Validate() error { }, }, Msg: "PhaseKey in Item must match Key in Phase", - } + }) } // Let's validate the item contents if err := item.Validate(); err != nil { - return fmt.Errorf("item %s validation failed: %w", item.ItemKey, err) + errs = append(errs, fmt.Errorf("item %s validation failed: %w", item.ItemKey, err)) } // TODO: Let's validate that BillingCadence aligns with phase length @@ -319,16 +344,17 @@ func (s *SubscriptionPhaseSpec) Validate() error { for i := range items { cadence, err := items[i].GetCadence(somePhaseCadence) if err != nil { - return fmt.Errorf("failed to get cadence for item %s: %w", items[i].ItemKey, err) + errs = append(errs, fmt.Errorf("failed to get cadence for item %s: %w", items[i].ItemKey, err)) } cadences = append(cadences, cadence) } if err := ValidateCadencesAreSortedAndNonOverlapping(cadences); err != nil { - return fmt.Errorf("items for key %s are not sorted or overlapping: %w", key, err) + errs = append(errs, fmt.Errorf("items for key %s are not sorted or overlapping: %w", key, err)) } } - return nil + + return errors.Join(errs...) } type CreateSubscriptionItemPlanInput struct { @@ -407,6 +433,8 @@ func (s SubscriptionItemSpec) ToCreateSubscriptionItemEntityInput( PhaseID: phase.ID, Key: s.ItemKey, RateCard: s.CreateSubscriptionItemPlanInput.RateCard, + Name: s.RateCard.Name, + Description: s.RateCard.Description, } if entitlement != nil { @@ -495,6 +523,7 @@ func (s SubscriptionItemSpec) GetRef(subId string) SubscriptionItemRef { } func (s *SubscriptionItemSpec) Validate() error { + var errs []error // TODO: if the price is usage based, we have to validate that that the feature is metered // TODO: if the entitlement is metered, we have to validate that the feature is metered @@ -507,7 +536,7 @@ func (s *SubscriptionItemSpec) Validate() error { // Let's validate nested models if err := s.RateCard.Validate(); err != nil { - return &SpecValidationError{ + errs = append(errs, &SpecValidationError{ AffectedKeys: [][]string{ { "phaseKey", @@ -518,10 +547,10 @@ func (s *SubscriptionItemSpec) Validate() error { }, }, Msg: fmt.Sprintf("RateCard validation failed: %s", err), - } + }) } - return nil + return errors.Join(errs...) } // NewSpecFromPlan creates a SubscriptionSpec from a Plan and a CreateSubscriptionCustomerInput. @@ -555,9 +584,11 @@ func NewSpecFromPlan(p Plan, c CreateSubscriptionCustomerInput) (SubscriptionSpe createSubscriptionPhasePlanInput := planPhase.ToCreateSubscriptionPhasePlanInput() phase := &SubscriptionPhaseSpec{ - CreateSubscriptionPhasePlanInput: createSubscriptionPhasePlanInput, - CreateSubscriptionPhaseCustomerInput: CreateSubscriptionPhaseCustomerInput{}, - ItemsByKey: make(map[string][]SubscriptionItemSpec), + CreateSubscriptionPhasePlanInput: createSubscriptionPhasePlanInput, + CreateSubscriptionPhaseCustomerInput: CreateSubscriptionPhaseCustomerInput{ + AnnotatedModel: models.AnnotatedModel{}, // TODO: where should we source this from? inherit from PlanPhase, or Subscription? + }, + ItemsByKey: make(map[string][]SubscriptionItemSpec), } if len(planPhase.GetRateCards()) == 0 { @@ -602,10 +633,13 @@ func NewSpecFromEntities(sub Subscription, phases []SubscriptionPhase, items []S spec := &SubscriptionSpec{ CreateSubscriptionPlanInput: CreateSubscriptionPlanInput{Plan: sub.Plan}, CreateSubscriptionCustomerInput: CreateSubscriptionCustomerInput{ - CustomerId: sub.CustomerId, - Currency: sub.Currency, - ActiveFrom: sub.ActiveFrom, - ActiveTo: sub.ActiveTo, + CustomerId: sub.CustomerId, + Currency: sub.Currency, + ActiveFrom: sub.ActiveFrom, + ActiveTo: sub.ActiveTo, + AnnotatedModel: sub.AnnotatedModel, + Name: sub.Name, + Description: sub.Description, }, Phases: make(map[string]*SubscriptionPhaseSpec), } @@ -636,8 +670,10 @@ func NewSpecFromEntities(sub Subscription, phases []SubscriptionPhase, items []S Name: phase.Name, Description: phase.Description, }, - CreateSubscriptionPhaseCustomerInput: CreateSubscriptionPhaseCustomerInput{}, - ItemsByKey: make(map[string][]SubscriptionItemSpec), + CreateSubscriptionPhaseCustomerInput: CreateSubscriptionPhaseCustomerInput{ + AnnotatedModel: phase.AnnotatedModel, + }, + ItemsByKey: make(map[string][]SubscriptionItemSpec), } spec.Phases[phase.Key] = phaseSpec @@ -745,12 +781,40 @@ func (s *SubscriptionSpec) ApplyPatches(patches []Applies, context ApplyContext) return fmt.Errorf("patch %d failed: %w", i, err) } if err = s.Validate(); err != nil { + if uw, ok := err.(interface{ Unwrap() []error }); ok { + // If all returned errors are allowed during applying patches, we can continue + if lo.EveryBy(uw.Unwrap(), func(e error) bool { + _, ok := lo.ErrorsAs[*AllowedDuringApplyingPatchesError](e) + return ok + }) { + continue + } + } + // Otherwise we return with the error return fmt.Errorf("patch %d failed during validation: %w", i, err) } } + + if err := s.Validate(); err != nil { + return fmt.Errorf("final validation failed when applying patches: %w", err) + } + return nil } +// Some errors are allowed during applying individual patches, but still mean the Spec as a whole is invalid +type AllowedDuringApplyingPatchesError struct { + Inner error +} + +func (e *AllowedDuringApplyingPatchesError) Error() string { + return fmt.Sprintf("allowed during incremental validation failed: %s", e.Inner) +} + +func (e *AllowedDuringApplyingPatchesError) Unwrap() error { + return e.Inner +} + type SpecValidationError struct { // TODO: This spec is broken and painful, lets improve it AffectedKeys [][]string diff --git a/openmeter/subscription/subscriptionview.go b/openmeter/subscription/subscriptionview.go index 09a5f34fd..ab78840d1 100644 --- a/openmeter/subscription/subscriptionview.go +++ b/openmeter/subscription/subscriptionview.go @@ -90,10 +90,6 @@ type SubscriptionItemView struct { Entitlement *SubscriptionEntitlement } -func (s *SubscriptionItemView) BillingCadenceOLD() time.Duration { - panic("implement me") -} - func (s *SubscriptionItemView) AsSpec() SubscriptionItemSpec { return s.Spec } @@ -140,7 +136,12 @@ func (s *SubscriptionItemView) Validate() error { return fmt.Errorf("entitlement template for Item %s is not static: %w", s.SubscriptionItem.Key, err) } - if !reflect.DeepEqual(e.Config, ent.Config) { + cfgBytes1, err := e.Config.MarshalJSON() + if err != nil { + return fmt.Errorf("failed to marshal entitlement template %s config: %w", s.Entitlement.Entitlement.ID, err) + } + + if string(cfgBytes1) != string(ent.Config) { return fmt.Errorf("entitlement %s config does not match template config", s.Entitlement.Entitlement.ID) } diff --git a/openmeter/subscription/testutils/plan.go b/openmeter/subscription/testutils/plan.go index f2c499558..54cdc9c69 100644 --- a/openmeter/subscription/testutils/plan.go +++ b/openmeter/subscription/testutils/plan.go @@ -7,7 +7,9 @@ import ( "github.com/samber/lo" "github.com/openmeterio/openmeter/openmeter/subscription" + "github.com/openmeterio/openmeter/pkg/currencyx" "github.com/openmeterio/openmeter/pkg/datex" + "github.com/openmeterio/openmeter/pkg/defaultx" ) var ExamplePlanRef subscription.PlanRef = subscription.PlanRef{ @@ -104,7 +106,10 @@ type planAdapter struct { var _ subscription.PlanAdapter = &planAdapter{} -func (a *planAdapter) GetVersion(ctx context.Context, k string, v int) (subscription.Plan, error) { +func (a *planAdapter) GetVersion(ctx context.Context, _ string, ref subscription.PlanRefInput) (subscription.Plan, error) { + k := ref.Key + v := defaultx.WithDefault(ref.Version, 1) // this defaulting is incorrect in princple + versions, ok := a.store[k] if !ok { return nil, &subscription.PlanNotFoundError{Key: k, Version: v} @@ -170,6 +175,10 @@ func (p *Plan) GetVersionNumber() int { return p.PlanInput.Plan.Version } +func (p *Plan) Currency() currencyx.Code { + return currencyx.Code("USD") +} + type PlanPhase struct { RateCards []*RateCard PhaseInput subscription.CreateSubscriptionPhasePlanInput diff --git a/openmeter/subscription/testutils/service.go b/openmeter/subscription/testutils/service.go index 193d38a67..61a0d74ce 100644 --- a/openmeter/subscription/testutils/service.go +++ b/openmeter/subscription/testutils/service.go @@ -52,7 +52,7 @@ func NewService(t *testing.T, dbDeps *DBDeps) (services, ExposedServiceDeps) { Publisher: eventbus.NewMock(t), }) - entitlementAdapter := subscriptionentitlement.NewEntitlementSubscriptionAdapter( + entitlementAdapter := subscriptionentitlement.NewSubscriptionEntitlementAdapter( entitlementRegistry.Entitlement, subItemRepo, subPhaseRepo, diff --git a/tools/migrate/migrations/20241209085334_subscription_fields.down.sql b/tools/migrate/migrations/20241209085334_subscription_fields.down.sql new file mode 100644 index 000000000..b6ff08886 --- /dev/null +++ b/tools/migrate/migrations/20241209085334_subscription_fields.down.sql @@ -0,0 +1,10 @@ +-- reverse: modify "subscription_items" table +ALTER TABLE "subscription_items" DROP CONSTRAINT "subscription_items_entitlements_subscription_item", ADD + CONSTRAINT "subscription_items_entitlements_entitlement" FOREIGN KEY ("entitlement_id") REFERENCES "entitlements" ("id") ON UPDATE NO ACTION ON DELETE SET NULL; +-- reverse: modify "subscriptions" table +ALTER TABLE "subscriptions" DROP COLUMN "description", DROP COLUMN "name"; +-- reverse: modify "entitlements" table +ALTER TABLE "entitlements" ADD COLUMN "entitlement_subscription_item" character(26) NULL; +-- reverse: custom +ALTER TABLE "entitlements" ADD + CONSTRAINT "entitlements_subscription_items_subscription_item" FOREIGN KEY ("entitlement_subscription_item") REFERENCES "subscription_items" ("id") ON UPDATE NO ACTION ON DELETE SET NULL; diff --git a/tools/migrate/migrations/20241209085334_subscription_fields.up.sql b/tools/migrate/migrations/20241209085334_subscription_fields.up.sql new file mode 100644 index 000000000..570a54e3c --- /dev/null +++ b/tools/migrate/migrations/20241209085334_subscription_fields.up.sql @@ -0,0 +1,7 @@ +-- modify "entitlements" table +ALTER TABLE "entitlements" DROP COLUMN "entitlement_subscription_item"; +-- modify "subscriptions" table +ALTER TABLE "subscriptions" ADD COLUMN "name" character varying NOT NULL DEFAULT 'Subscription', ADD COLUMN "description" character varying NULL; +-- modify "subscription_items" table +ALTER TABLE "subscription_items" DROP CONSTRAINT "subscription_items_entitlements_entitlement", ADD + CONSTRAINT "subscription_items_entitlements_subscription_item" FOREIGN KEY ("entitlement_id") REFERENCES "entitlements" ("id") ON UPDATE NO ACTION ON DELETE SET NULL; diff --git a/tools/migrate/migrations/atlas.sum b/tools/migrate/migrations/atlas.sum index 23d3ffd6e..33a949144 100644 --- a/tools/migrate/migrations/atlas.sum +++ b/tools/migrate/migrations/atlas.sum @@ -1,4 +1,4 @@ -h1:wkEHwH0lZy/F77DgpckLFu6+y0uFCp4EyxRLpJMyb2M= +h1:FDc9pyvuEB4iTn6WNpv4U2JUmCtmzptmKZMhFY0kD/A= 20240826120919_init.down.sql h1:AIbgwwngjkJEYa3yRZsIXQyBa2+qoZttwMXHxXEbHLI= 20240826120919_init.up.sql h1:/hYHWF3Z3dab8SMKnw99ixVktCuJe2bAw5wstCZIEN8= 20240903155435_entitlement-expired-index.down.sql h1:np2xgYs3KQ2z7qPBcobtGNhqWQ3V8NwEP9E5U3TmpSA= @@ -61,3 +61,5 @@ h1:wkEHwH0lZy/F77DgpckLFu6+y0uFCp4EyxRLpJMyb2M= 20241204162012_subscriptions.up.sql h1:ojW+LACIf3owoBC99tZIo21F0y1hWTehySdcyy6Kqn4= 20241207103019_billing-app-external-ids.down.sql h1:ZWBMKXXPGnf7PDtlY9UE0V2zQJ4Y6Id8t+/xrxv9rGM= 20241207103019_billing-app-external-ids.up.sql h1:GjOVHfuHkWpB3FJ0Rv+MCxD7YD0hoMPAMBacBr41rjk= +20241209085334_subscription_fields.down.sql h1:YPpXa04RpQ/rkMILK4RgP/OXmEZ3nRq4vgxSCAYw3VE= +20241209085334_subscription_fields.up.sql h1:ddtZpsd8Ze/pMmAbAATyIt6YGWemgaqoNvFt3yLeGPg=