schema

package
v0.0.11 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jan 3, 2026 License: Apache-2.0 Imports: 4 Imported by: 0

Documentation

Overview

Package schema defines the database models for the subscription plugin.

Package schema defines the database models for the subscription plugin.

Package schema defines the database models for the subscription plugin.

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type Feature

type Feature struct {
	mainschema.AuditableModel `bun:",inline"`
	bun.BaseModel             `bun:"table:subscription_features,alias:sf"`

	ID                xid.ID                 `json:"id" bun:"id,pk,type:varchar(20)"`
	AppID             xid.ID                 `json:"appId" bun:"app_id,notnull,type:varchar(20)"`
	Key               string                 `json:"key" bun:"key,notnull"`                         // Unique per app
	Name              string                 `json:"name" bun:"name,notnull"`                       // Display name
	Description       string                 `json:"description" bun:"description"`                 // Feature description
	Type              string                 `json:"type" bun:"type,notnull"`                       // boolean, limit, unlimited, metered, tiered
	Unit              string                 `json:"unit" bun:"unit"`                               // "seats", "GB", "API calls", etc.
	ResetPeriod       string                 `json:"resetPeriod" bun:"reset_period"`                // none, daily, weekly, monthly, yearly, billing_period
	IsPublic          bool                   `json:"isPublic" bun:"is_public,notnull,default:true"` // Show in pricing pages
	DisplayOrder      int                    `json:"displayOrder" bun:"display_order,notnull,default:0"`
	Icon              string                 `json:"icon" bun:"icon"`                             // Icon identifier for UI
	ProviderFeatureID string                 `json:"providerFeatureId" bun:"provider_feature_id"` // Provider sync ID
	LastSyncedAt      *time.Time             `json:"lastSyncedAt" bun:"last_synced_at"`           // Last provider sync time
	Metadata          map[string]interface{} `json:"metadata" bun:"metadata,type:jsonb"`

	// Relations
	App   *mainschema.App   `json:"app,omitempty" bun:"rel:belongs-to,join:app_id=id"`
	Tiers []FeatureTier     `json:"tiers,omitempty" bun:"rel:has-many,join:id=feature_id"`
	Plans []PlanFeatureLink `json:"plans,omitempty" bun:"rel:has-many,join:id=feature_id"`
}

Feature represents a standalone feature definition that can be linked to plans

type FeatureGrant

type FeatureGrant struct {
	mainschema.AuditableModel `bun:",inline"`
	bun.BaseModel             `bun:"table:subscription_feature_grants,alias:sfg"`

	ID             xid.ID                 `json:"id" bun:"id,pk,type:varchar(20)"`
	OrganizationID xid.ID                 `json:"organizationId" bun:"organization_id,notnull,type:varchar(20)"`
	FeatureID      xid.ID                 `json:"featureId" bun:"feature_id,notnull,type:varchar(20)"`
	GrantType      string                 `json:"grantType" bun:"grant_type,notnull"` // addon, override, promotion, trial, manual
	Value          int64                  `json:"value" bun:"value,notnull"`          // Additional quota
	ExpiresAt      *time.Time             `json:"expiresAt" bun:"expires_at"`
	SourceType     string                 `json:"sourceType" bun:"source_type"`              // addon, coupon, promotion, etc.
	SourceID       *xid.ID                `json:"sourceId" bun:"source_id,type:varchar(20)"` // AddOn ID, Promotion ID, etc.
	Reason         string                 `json:"reason" bun:"reason"`
	IsActive       bool                   `json:"isActive" bun:"is_active,notnull,default:true"`
	Metadata       map[string]interface{} `json:"metadata" bun:"metadata,type:jsonb"`

	// Relations
	Organization *mainschema.Organization `json:"organization,omitempty" bun:"rel:belongs-to,join:organization_id=id"`
	Feature      *Feature                 `json:"feature,omitempty" bun:"rel:belongs-to,join:feature_id=id"`
}

FeatureGrant provides additional feature access beyond the plan

type FeatureGrantType

type FeatureGrantType string

FeatureGrantType defines the type of feature grant

const (
	// FeatureGrantTypeAddon is a grant from an add-on purchase
	FeatureGrantTypeAddon FeatureGrantType = "addon"
	// FeatureGrantTypeOverride is a manual override
	FeatureGrantTypeOverride FeatureGrantType = "override"
	// FeatureGrantTypePromotion is a promotional grant
	FeatureGrantTypePromotion FeatureGrantType = "promotion"
	// FeatureGrantTypeTrial is a trial grant
	FeatureGrantTypeTrial FeatureGrantType = "trial"
	// FeatureGrantTypeManual is a manually added grant
	FeatureGrantTypeManual FeatureGrantType = "manual"
)

type FeatureTier

type FeatureTier struct {
	bun.BaseModel `bun:"table:subscription_feature_tiers,alias:sft"`

	ID        xid.ID    `json:"id" bun:"id,pk,type:varchar(20)"`
	FeatureID xid.ID    `json:"featureId" bun:"feature_id,notnull,type:varchar(20)"`
	TierOrder int       `json:"tierOrder" bun:"tier_order,notnull,default:0"`
	UpTo      int64     `json:"upTo" bun:"up_to,notnull"` // -1 for unlimited
	Value     string    `json:"value" bun:"value"`        // What's unlocked at this tier (JSON)
	Label     string    `json:"label" bun:"label"`        // Display label for this tier
	CreatedAt time.Time `json:"createdAt" bun:"created_at,nullzero,notnull,default:current_timestamp"`

	// Relations
	Feature *Feature `json:"feature,omitempty" bun:"rel:belongs-to,join:feature_id=id"`
}

FeatureTier represents a tier within a tiered feature type

type FeatureUsageAction

type FeatureUsageAction string

FeatureUsageAction defines the type of usage action

const (
	// FeatureUsageActionConsume decrements the available quota
	FeatureUsageActionConsume FeatureUsageAction = "consume"
	// FeatureUsageActionGrant adds to the quota
	FeatureUsageActionGrant FeatureUsageAction = "grant"
	// FeatureUsageActionReset resets the usage counter
	FeatureUsageActionReset FeatureUsageAction = "reset"
	// FeatureUsageActionAdjust manually adjusts the usage
	FeatureUsageActionAdjust FeatureUsageAction = "adjust"
)

type FeatureUsageLog

type FeatureUsageLog struct {
	bun.BaseModel `bun:"table:subscription_feature_usage_logs,alias:sful"`

	ID             xid.ID                 `json:"id" bun:"id,pk,type:varchar(20)"`
	OrganizationID xid.ID                 `json:"organizationId" bun:"organization_id,notnull,type:varchar(20)"`
	FeatureID      xid.ID                 `json:"featureId" bun:"feature_id,notnull,type:varchar(20)"`
	Action         string                 `json:"action" bun:"action,notnull"` // consume, grant, reset, adjust
	Quantity       int64                  `json:"quantity" bun:"quantity,notnull"`
	PreviousUsage  int64                  `json:"previousUsage" bun:"previous_usage,notnull,default:0"`
	NewUsage       int64                  `json:"newUsage" bun:"new_usage,notnull,default:0"`
	ActorID        *xid.ID                `json:"actorId" bun:"actor_id,type:varchar(20)"`
	Reason         string                 `json:"reason" bun:"reason"`
	IdempotencyKey string                 `json:"idempotencyKey" bun:"idempotency_key"`
	Metadata       map[string]interface{} `json:"metadata" bun:"metadata,type:jsonb"`
	CreatedAt      time.Time              `json:"createdAt" bun:"created_at,nullzero,notnull,default:current_timestamp"`

	// Relations
	Organization *mainschema.Organization `json:"organization,omitempty" bun:"rel:belongs-to,join:organization_id=id"`
	Feature      *Feature                 `json:"feature,omitempty" bun:"rel:belongs-to,join:feature_id=id"`
}

FeatureUsageLog provides an audit trail for feature usage changes

type OrganizationFeatureUsage

type OrganizationFeatureUsage struct {
	bun.BaseModel `bun:"table:subscription_org_feature_usage,alias:sofu"`

	ID             xid.ID                 `json:"id" bun:"id,pk,type:varchar(20)"`
	OrganizationID xid.ID                 `json:"organizationId" bun:"organization_id,notnull,type:varchar(20)"`
	FeatureID      xid.ID                 `json:"featureId" bun:"feature_id,notnull,type:varchar(20)"`
	CurrentUsage   int64                  `json:"currentUsage" bun:"current_usage,notnull,default:0"`
	PeriodStart    time.Time              `json:"periodStart" bun:"period_start,notnull"`
	PeriodEnd      time.Time              `json:"periodEnd" bun:"period_end,notnull"`
	LastReset      time.Time              `json:"lastReset" bun:"last_reset,notnull"`
	Metadata       map[string]interface{} `json:"metadata" bun:"metadata,type:jsonb"`
	CreatedAt      time.Time              `json:"createdAt" bun:"created_at,nullzero,notnull,default:current_timestamp"`
	UpdatedAt      time.Time              `json:"updatedAt" bun:"updated_at,nullzero,notnull,default:current_timestamp"`

	// Relations
	Organization *mainschema.Organization `json:"organization,omitempty" bun:"rel:belongs-to,join:organization_id=id"`
	Feature      *Feature                 `json:"feature,omitempty" bun:"rel:belongs-to,join:feature_id=id"`
}

OrganizationFeatureUsage tracks feature usage per organization

type PlanFeatureLink struct {
	bun.BaseModel `bun:"table:subscription_plan_feature_links,alias:spfl"`

	ID               xid.ID                 `json:"id" bun:"id,pk,type:varchar(20)"`
	PlanID           xid.ID                 `json:"planId" bun:"plan_id,notnull,type:varchar(20)"`
	FeatureID        xid.ID                 `json:"featureId" bun:"feature_id,notnull,type:varchar(20)"`
	Value            string                 `json:"value" bun:"value"`                                        // JSON: limit value, tier, boolean, etc.
	IsBlocked        bool                   `json:"isBlocked" bun:"is_blocked,notnull,default:false"`         // Explicitly blocked for this plan
	IsHighlighted    bool                   `json:"isHighlighted" bun:"is_highlighted,notnull,default:false"` // Highlight in pricing comparison
	OverrideSettings map[string]interface{} `json:"overrideSettings" bun:"override_settings,type:jsonb"`
	CreatedAt        time.Time              `json:"createdAt" bun:"created_at,nullzero,notnull,default:current_timestamp"`
	UpdatedAt        time.Time              `json:"updatedAt" bun:"updated_at,nullzero,notnull,default:current_timestamp"`

	// Relations
	Plan    *SubscriptionPlan `json:"plan,omitempty" bun:"rel:belongs-to,join:plan_id=id"`
	Feature *Feature          `json:"feature,omitempty" bun:"rel:belongs-to,join:feature_id=id"`
}

PlanFeatureLink connects features to plans with plan-specific configuration

type Subscription

type Subscription struct {
	mainschema.AuditableModel `bun:",inline"`
	bun.BaseModel             `bun:"table:subscriptions,alias:sub"`

	ID                 xid.ID                 `json:"id" bun:"id,pk,type:varchar(20)"`
	OrganizationID     xid.ID                 `json:"organizationId" bun:"organization_id,notnull,type:varchar(20)"`
	PlanID             xid.ID                 `json:"planId" bun:"plan_id,notnull,type:varchar(20)"`
	Status             string                 `json:"status" bun:"status,notnull"`
	Quantity           int                    `json:"quantity" bun:"quantity,notnull,default:1"`
	CurrentPeriodStart time.Time              `json:"currentPeriodStart" bun:"current_period_start,notnull"`
	CurrentPeriodEnd   time.Time              `json:"currentPeriodEnd" bun:"current_period_end,notnull"`
	TrialStart         *time.Time             `json:"trialStart" bun:"trial_start"`
	TrialEnd           *time.Time             `json:"trialEnd" bun:"trial_end"`
	CancelAt           *time.Time             `json:"cancelAt" bun:"cancel_at"`
	CanceledAt         *time.Time             `json:"canceledAt" bun:"canceled_at"`
	EndedAt            *time.Time             `json:"endedAt" bun:"ended_at"`
	PausedAt           *time.Time             `json:"pausedAt" bun:"paused_at"`
	ResumeAt           *time.Time             `json:"resumeAt" bun:"resume_at"`
	ProviderSubID      string                 `json:"providerSubId" bun:"provider_sub_id"`
	ProviderCustomerID string                 `json:"providerCustomerId" bun:"provider_customer_id"`
	Metadata           map[string]interface{} `json:"metadata" bun:"metadata,type:jsonb"`

	// Relations
	Organization *mainschema.Organization `json:"organization,omitempty" bun:"rel:belongs-to,join:organization_id=id"`
	Plan         *SubscriptionPlan        `json:"plan,omitempty" bun:"rel:belongs-to,join:plan_id=id"`
	AddOns       []SubscriptionAddOnItem  `json:"addOns,omitempty" bun:"rel:has-many,join:id=subscription_id"`
}

Subscription represents an organization's subscription

type SubscriptionAddOn

type SubscriptionAddOn struct {
	mainschema.AuditableModel `bun:",inline"`
	bun.BaseModel             `bun:"table:subscription_addons,alias:sao"`

	ID              xid.ID                 `json:"id" bun:"id,pk,type:varchar(20)"`
	AppID           xid.ID                 `json:"appId" bun:"app_id,notnull,type:varchar(20)"`
	Name            string                 `json:"name" bun:"name,notnull"`
	Slug            string                 `json:"slug" bun:"slug,notnull"`
	Description     string                 `json:"description" bun:"description"`
	BillingPattern  string                 `json:"billingPattern" bun:"billing_pattern,notnull"`
	BillingInterval string                 `json:"billingInterval" bun:"billing_interval,notnull"`
	Price           int64                  `json:"price" bun:"price,notnull,default:0"`
	Currency        string                 `json:"currency" bun:"currency,notnull,default:'USD'"`
	TierMode        string                 `json:"tierMode" bun:"tier_mode,default:'graduated'"`
	Metadata        map[string]interface{} `json:"metadata" bun:"metadata,type:jsonb"`
	IsActive        bool                   `json:"isActive" bun:"is_active,notnull,default:true"`
	IsPublic        bool                   `json:"isPublic" bun:"is_public,notnull,default:true"`
	DisplayOrder    int                    `json:"displayOrder" bun:"display_order,notnull,default:0"`
	RequiresPlanIDs []string               `json:"requiresPlanIds" bun:"requires_plan_ids,array,type:varchar(20)[]"`
	ExcludesPlanIDs []string               `json:"excludesPlanIds" bun:"excludes_plan_ids,array,type:varchar(20)[]"`
	MaxQuantity     int                    `json:"maxQuantity" bun:"max_quantity,notnull,default:0"`
	ProviderPriceID string                 `json:"providerPriceId" bun:"provider_price_id"`

	// Relations
	App      *mainschema.App            `json:"app,omitempty" bun:"rel:belongs-to,join:app_id=id"`
	Features []SubscriptionAddOnFeature `json:"features,omitempty" bun:"rel:has-many,join:id=addon_id"`
	Tiers    []SubscriptionAddOnTier    `json:"tiers,omitempty" bun:"rel:has-many,join:id=addon_id"`
}

SubscriptionAddOn represents an add-on product

type SubscriptionAddOnFeature

type SubscriptionAddOnFeature struct {
	bun.BaseModel `bun:"table:subscription_addon_features,alias:saf"`

	ID          xid.ID    `json:"id" bun:"id,pk,type:varchar(20)"`
	AddOnID     xid.ID    `json:"addOnId" bun:"addon_id,notnull,type:varchar(20)"`
	Key         string    `json:"key" bun:"key,notnull"`
	Name        string    `json:"name" bun:"name,notnull"`
	Description string    `json:"description" bun:"description"`
	Type        string    `json:"type" bun:"type,notnull"`
	Value       string    `json:"value" bun:"value"`
	CreatedAt   time.Time `json:"createdAt" bun:"created_at,nullzero,notnull,default:current_timestamp"`

	// Relations
	AddOn *SubscriptionAddOn `json:"addOn,omitempty" bun:"rel:belongs-to,join:addon_id=id"`
}

SubscriptionAddOnFeature represents a feature on an add-on

type SubscriptionAddOnItem

type SubscriptionAddOnItem struct {
	bun.BaseModel `bun:"table:subscription_addon_items,alias:sai"`

	ID                xid.ID    `json:"id" bun:"id,pk,type:varchar(20)"`
	SubscriptionID    xid.ID    `json:"subscriptionId" bun:"subscription_id,notnull,type:varchar(20)"`
	AddOnID           xid.ID    `json:"addOnId" bun:"addon_id,notnull,type:varchar(20)"`
	Quantity          int       `json:"quantity" bun:"quantity,notnull,default:1"`
	ProviderSubItemID string    `json:"providerSubItemId" bun:"provider_sub_item_id"`
	CreatedAt         time.Time `json:"createdAt" bun:"created_at,nullzero,notnull,default:current_timestamp"`

	// Relations
	Subscription *Subscription      `json:"subscription,omitempty" bun:"rel:belongs-to,join:subscription_id=id"`
	AddOn        *SubscriptionAddOn `json:"addOn,omitempty" bun:"rel:belongs-to,join:addon_id=id"`
}

SubscriptionAddOnItem represents an add-on attached to a subscription

type SubscriptionAddOnTier

type SubscriptionAddOnTier struct {
	bun.BaseModel `bun:"table:subscription_addon_tiers,alias:sat"`

	ID         xid.ID    `json:"id" bun:"id,pk,type:varchar(20)"`
	AddOnID    xid.ID    `json:"addOnId" bun:"addon_id,notnull,type:varchar(20)"`
	TierOrder  int       `json:"tierOrder" bun:"tier_order,notnull"`
	UpTo       int64     `json:"upTo" bun:"up_to,notnull"`
	UnitAmount int64     `json:"unitAmount" bun:"unit_amount,notnull"`
	FlatAmount int64     `json:"flatAmount" bun:"flat_amount,notnull,default:0"`
	CreatedAt  time.Time `json:"createdAt" bun:"created_at,nullzero,notnull,default:current_timestamp"`

	// Relations
	AddOn *SubscriptionAddOn `json:"addOn,omitempty" bun:"rel:belongs-to,join:addon_id=id"`
}

SubscriptionAddOnTier represents a pricing tier for an add-on

type SubscriptionAlert

type SubscriptionAlert struct {
	bun.BaseModel `bun:"table:subscription_alerts,alias:sa"`

	ID             xid.ID     `bun:"id,pk,type:char(20)"`
	AppID          xid.ID     `bun:"app_id,notnull,type:char(20)"`
	OrganizationID xid.ID     `bun:"organization_id,notnull,type:char(20)"`
	ConfigID       *xid.ID    `bun:"config_id,type:char(20)"`
	Type           string     `bun:"type,notnull"`
	Severity       string     `bun:"severity,notnull,default:'info'"`
	Status         string     `bun:"status,notnull,default:'pending'"`
	Title          string     `bun:"title,notnull"`
	Message        string     `bun:"message,notnull"`
	MetricKey      string     `bun:"metric_key"`
	CurrentValue   float64    `bun:"current_value"`
	ThresholdValue float64    `bun:"threshold_value"`
	LimitValue     float64    `bun:"limit_value"`
	SubscriptionID *xid.ID    `bun:"subscription_id,type:char(20)"`
	InvoiceID      *xid.ID    `bun:"invoice_id,type:char(20)"`
	Channels       []string   `bun:"channels,array"`
	SentAt         *time.Time `bun:"sent_at"`
	DeliveryStatus string     `bun:"delivery_status,type:jsonb"`
	AcknowledgedAt *time.Time `bun:"acknowledged_at"`
	AcknowledgedBy string     `bun:"acknowledged_by"`
	ResolvedAt     *time.Time `bun:"resolved_at"`
	Resolution     string     `bun:"resolution"`
	Metadata       string     `bun:"metadata,type:jsonb"`
	CreatedAt      time.Time  `bun:"created_at,notnull,default:current_timestamp"`
	UpdatedAt      time.Time  `bun:"updated_at,notnull,default:current_timestamp"`
}

SubscriptionAlert represents an alert in the database

type SubscriptionAlertConfig

type SubscriptionAlertConfig struct {
	bun.BaseModel `bun:"table:subscription_alert_configs,alias:sac"`

	ID               xid.ID     `bun:"id,pk,type:char(20)"`
	AppID            xid.ID     `bun:"app_id,notnull,type:char(20)"`
	OrganizationID   xid.ID     `bun:"organization_id,notnull,type:char(20)"`
	AlertType        string     `bun:"alert_type,notnull"`
	IsEnabled        bool       `bun:"is_enabled,notnull,default:true"`
	ThresholdPercent float64    `bun:"threshold_percent"`
	MetricKey        string     `bun:"metric_key"`
	DaysBeforeEnd    int        `bun:"days_before_end"`
	Channels         []string   `bun:"channels,array"`
	Recipients       []string   `bun:"recipients,array"`
	WebhookURL       string     `bun:"webhook_url"`
	SlackChannel     string     `bun:"slack_channel"`
	MinInterval      int        `bun:"min_interval,notnull,default:60"`
	MaxAlertsPerDay  int        `bun:"max_alerts_per_day,notnull,default:5"`
	SnoozedUntil     *time.Time `bun:"snoozed_until"`
	CreatedAt        time.Time  `bun:"created_at,notnull,default:current_timestamp"`
	UpdatedAt        time.Time  `bun:"updated_at,notnull,default:current_timestamp"`
}

SubscriptionAlertConfig represents an alert configuration in the database

type SubscriptionAlertTemplate

type SubscriptionAlertTemplate struct {
	bun.BaseModel `bun:"table:subscription_alert_templates,alias:sat"`

	ID            xid.ID    `bun:"id,pk,type:char(20)"`
	AppID         xid.ID    `bun:"app_id,notnull,type:char(20)"`
	AlertType     string    `bun:"alert_type,notnull"`
	Channel       string    `bun:"channel,notnull"`
	Subject       string    `bun:"subject"`
	TitleTemplate string    `bun:"title_template,notnull"`
	BodyTemplate  string    `bun:"body_template,notnull"`
	IsDefault     bool      `bun:"is_default,notnull,default:false"`
	CreatedAt     time.Time `bun:"created_at,notnull,default:current_timestamp"`
	UpdatedAt     time.Time `bun:"updated_at,notnull,default:current_timestamp"`
}

SubscriptionAlertTemplate represents an alert template in the database

type SubscriptionBillingMetric

type SubscriptionBillingMetric struct {
	bun.BaseModel `bun:"table:subscription_billing_metrics,alias:sbm"`

	ID        xid.ID    `bun:"id,pk,type:char(20)"`
	AppID     xid.ID    `bun:"app_id,notnull,type:char(20)"`
	Type      string    `bun:"type,notnull"`   // mrr, arr, churn_rate, etc.
	Period    string    `bun:"period,notnull"` // daily, weekly, monthly, yearly
	Value     float64   `bun:"value,notnull"`
	Currency  string    `bun:"currency,notnull"`
	Date      time.Time `bun:"date,notnull"`
	CreatedAt time.Time `bun:"created_at,notnull,default:current_timestamp"`
}

SubscriptionBillingMetric represents a billing metric in the database

type SubscriptionCohort

type SubscriptionCohort struct {
	bun.BaseModel `bun:"table:subscription_cohorts,alias:sco"`

	ID              xid.ID    `bun:"id,pk,type:char(20)"`
	AppID           xid.ID    `bun:"app_id,notnull,type:char(20)"`
	CohortMonth     time.Time `bun:"cohort_month,notnull"`
	TotalCustomers  int       `bun:"total_customers,notnull"`
	MonthNumber     int       `bun:"month_number,notnull"` // 0 = signup month, 1 = first month after, etc.
	ActiveCustomers int       `bun:"active_customers,notnull"`
	RetentionRate   float64   `bun:"retention_rate,notnull"`
	Revenue         int64     `bun:"revenue,notnull"`
	Currency        string    `bun:"currency,notnull"`
	CreatedAt       time.Time `bun:"created_at,notnull,default:current_timestamp"`
	UpdatedAt       time.Time `bun:"updated_at,notnull,default:current_timestamp"`
}

SubscriptionCohort represents cohort data in the database

type SubscriptionCoupon

type SubscriptionCoupon struct {
	bun.BaseModel `bun:"table:subscription_coupons,alias:scp"`

	ID                   xid.ID     `bun:"id,pk,type:char(20)"`
	AppID                xid.ID     `bun:"app_id,notnull,type:char(20)"`
	Code                 string     `bun:"code,notnull,unique"`
	Name                 string     `bun:"name,notnull"`
	Description          string     `bun:"description"`
	Type                 string     `bun:"type,notnull"`     // percentage, fixed_amount, trial_extension, free_months
	Duration             string     `bun:"duration,notnull"` // once, repeating, forever
	Status               string     `bun:"status,notnull,default:'active'"`
	PercentOff           float64    `bun:"percent_off"`
	AmountOff            int64      `bun:"amount_off"`
	Currency             string     `bun:"currency"`
	TrialDays            int        `bun:"trial_days"`
	FreeMonths           int        `bun:"free_months"`
	DurationMonths       int        `bun:"duration_months"`
	MaxRedemptions       int        `bun:"max_redemptions"`
	MaxRedemptionsPerOrg int        `bun:"max_redemptions_per_org"`
	MinPurchaseAmount    int64      `bun:"min_purchase_amount"`
	ApplicablePlans      []string   `bun:"applicable_plans,array"`
	ApplicableAddOns     []string   `bun:"applicable_addons,array"`
	FirstPurchaseOnly    bool       `bun:"first_purchase_only,notnull,default:false"`
	ValidFrom            time.Time  `bun:"valid_from,notnull"`
	ValidUntil           *time.Time `bun:"valid_until"`
	TimesRedeemed        int        `bun:"times_redeemed,notnull,default:0"`
	ProviderCouponID     string     `bun:"provider_coupon_id"`
	Metadata             string     `bun:"metadata,type:jsonb"`
	CreatedAt            time.Time  `bun:"created_at,notnull,default:current_timestamp"`
	UpdatedAt            time.Time  `bun:"updated_at,notnull,default:current_timestamp"`
}

SubscriptionCoupon represents a coupon in the database

type SubscriptionCouponRedemption

type SubscriptionCouponRedemption struct {
	bun.BaseModel `bun:"table:subscription_coupon_redemptions,alias:scr"`

	ID             xid.ID     `bun:"id,pk,type:char(20)"`
	AppID          xid.ID     `bun:"app_id,notnull,type:char(20)"`
	CouponID       xid.ID     `bun:"coupon_id,notnull,type:char(20)"`
	OrganizationID xid.ID     `bun:"organization_id,notnull,type:char(20)"`
	SubscriptionID xid.ID     `bun:"subscription_id,notnull,type:char(20)"`
	DiscountType   string     `bun:"discount_type,notnull"`
	DiscountAmount int64      `bun:"discount_amount,notnull"`
	Currency       string     `bun:"currency,notnull"`
	RedeemedAt     time.Time  `bun:"redeemed_at,notnull,default:current_timestamp"`
	ExpiresAt      *time.Time `bun:"expires_at"`

	// Relations
	Coupon *SubscriptionCoupon `bun:"rel:belongs-to,join:coupon_id=id"`
}

SubscriptionCouponRedemption represents a coupon redemption in the database

type SubscriptionCurrency

type SubscriptionCurrency struct {
	bun.BaseModel `bun:"table:subscription_currencies,alias:sc"`

	ID            xid.ID    `bun:"id,pk,type:char(20)"`
	Code          string    `bun:"code,notnull,unique"`
	Name          string    `bun:"name,notnull"`
	Symbol        string    `bun:"symbol,notnull"`
	DecimalPlaces int       `bun:"decimal_places,notnull,default:2"`
	IsDefault     bool      `bun:"is_default,notnull,default:false"`
	IsActive      bool      `bun:"is_active,notnull,default:true"`
	CreatedAt     time.Time `bun:"created_at,notnull,default:current_timestamp"`
	UpdatedAt     time.Time `bun:"updated_at,notnull,default:current_timestamp"`
}

SubscriptionCurrency represents a supported currency in the database

type SubscriptionCustomer

type SubscriptionCustomer struct {
	mainschema.AuditableModel `bun:",inline"`
	bun.BaseModel             `bun:"table:subscription_customers,alias:sc"`

	ID                 xid.ID  `json:"id" bun:"id,pk,type:varchar(20)"`
	OrganizationID     xid.ID  `json:"organizationId" bun:"organization_id,notnull,unique,type:varchar(20)"`
	ProviderCustomerID string  `json:"providerCustomerId" bun:"provider_customer_id,notnull,unique"`
	Email              string  `json:"email" bun:"email,notnull"`
	Name               string  `json:"name" bun:"name"`
	Phone              string  `json:"phone" bun:"phone"`
	TaxID              string  `json:"taxId" bun:"tax_id"`
	TaxExempt          bool    `json:"taxExempt" bun:"tax_exempt,notnull,default:false"`
	Currency           string  `json:"currency" bun:"currency,notnull,default:'USD'"`
	Balance            int64   `json:"balance" bun:"balance,notnull,default:0"`
	DefaultPaymentID   *xid.ID `json:"defaultPaymentId" bun:"default_payment_id,type:varchar(20)"`

	// Billing address
	BillingAddressLine1 string `json:"billingAddressLine1" bun:"billing_address_line1"`
	BillingAddressLine2 string `json:"billingAddressLine2" bun:"billing_address_line2"`
	BillingCity         string `json:"billingCity" bun:"billing_city"`
	BillingState        string `json:"billingState" bun:"billing_state"`
	BillingPostalCode   string `json:"billingPostalCode" bun:"billing_postal_code"`
	BillingCountry      string `json:"billingCountry" bun:"billing_country"`

	Metadata map[string]interface{} `json:"metadata" bun:"metadata,type:jsonb"`

	// Relations
	Organization   *mainschema.Organization   `json:"organization,omitempty" bun:"rel:belongs-to,join:organization_id=id"`
	DefaultPayment *SubscriptionPaymentMethod `json:"defaultPayment,omitempty" bun:"rel:belongs-to,join:default_payment_id=id"`
}

SubscriptionCustomer represents the billing customer for an organization

type SubscriptionCustomerTaxID

type SubscriptionCustomerTaxID struct {
	bun.BaseModel `bun:"table:subscription_customer_tax_ids,alias:sctid"`

	ID             xid.ID     `bun:"id,pk,type:char(20)"`
	AppID          xid.ID     `bun:"app_id,notnull,type:char(20)"`
	OrganizationID xid.ID     `bun:"organization_id,notnull,type:char(20)"`
	Type           string     `bun:"type,notnull"` // eu_vat, in_gst, etc.
	Value          string     `bun:"value,notnull"`
	Country        string     `bun:"country,notnull"`
	VerifiedAt     *time.Time `bun:"verified_at"`
	IsValid        bool       `bun:"is_valid,notnull,default:false"`
	CreatedAt      time.Time  `bun:"created_at,notnull,default:current_timestamp"`
	UpdatedAt      time.Time  `bun:"updated_at,notnull,default:current_timestamp"`
}

SubscriptionCustomerTaxID represents a customer's tax ID in the database

type SubscriptionEvent

type SubscriptionEvent struct {
	bun.BaseModel `bun:"table:subscription_events,alias:se"`

	ID              xid.ID                 `json:"id" bun:"id,pk,type:varchar(20)"`
	SubscriptionID  *xid.ID                `json:"subscriptionId" bun:"subscription_id,type:varchar(20)"`
	OrganizationID  xid.ID                 `json:"organizationId" bun:"organization_id,notnull,type:varchar(20)"`
	EventType       string                 `json:"eventType" bun:"event_type,notnull"`
	EventData       map[string]interface{} `json:"eventData" bun:"event_data,type:jsonb"`
	ProviderEventID string                 `json:"providerEventId" bun:"provider_event_id"`
	IPAddress       string                 `json:"ipAddress" bun:"ip_address"`
	UserAgent       string                 `json:"userAgent" bun:"user_agent"`
	ActorID         *xid.ID                `json:"actorId" bun:"actor_id,type:varchar(20)"`
	CreatedAt       time.Time              `json:"createdAt" bun:"created_at,nullzero,notnull,default:current_timestamp"`

	// Relations
	Subscription *Subscription            `json:"subscription,omitempty" bun:"rel:belongs-to,join:subscription_id=id"`
	Organization *mainschema.Organization `json:"organization,omitempty" bun:"rel:belongs-to,join:organization_id=id"`
}

SubscriptionEvent represents an audit event for subscription changes

type SubscriptionExchangeRate

type SubscriptionExchangeRate struct {
	bun.BaseModel `bun:"table:subscription_exchange_rates,alias:ser"`

	ID           xid.ID     `bun:"id,pk,type:char(20)"`
	AppID        xid.ID     `bun:"app_id,notnull,type:char(20)"`
	FromCurrency string     `bun:"from_currency,notnull"`
	ToCurrency   string     `bun:"to_currency,notnull"`
	Rate         float64    `bun:"rate,notnull"`
	ValidFrom    time.Time  `bun:"valid_from,notnull"`
	ValidUntil   *time.Time `bun:"valid_until"`
	Source       string     `bun:"source,notnull,default:'manual'"`
	CreatedAt    time.Time  `bun:"created_at,notnull,default:current_timestamp"`
	UpdatedAt    time.Time  `bun:"updated_at,notnull,default:current_timestamp"`
}

SubscriptionExchangeRate represents an exchange rate in the database

type SubscriptionInvoice

type SubscriptionInvoice struct {
	mainschema.AuditableModel `bun:",inline"`
	bun.BaseModel             `bun:"table:subscription_invoices,alias:si"`

	ID                xid.ID                 `json:"id" bun:"id,pk,type:varchar(20)"`
	SubscriptionID    xid.ID                 `json:"subscriptionId" bun:"subscription_id,notnull,type:varchar(20)"`
	OrganizationID    xid.ID                 `json:"organizationId" bun:"organization_id,notnull,type:varchar(20)"`
	Number            string                 `json:"number" bun:"number,notnull,unique"`
	Status            string                 `json:"status" bun:"status,notnull"`
	Currency          string                 `json:"currency" bun:"currency,notnull,default:'USD'"`
	Subtotal          int64                  `json:"subtotal" bun:"subtotal,notnull,default:0"`
	Tax               int64                  `json:"tax" bun:"tax,notnull,default:0"`
	Total             int64                  `json:"total" bun:"total,notnull,default:0"`
	AmountPaid        int64                  `json:"amountPaid" bun:"amount_paid,notnull,default:0"`
	AmountDue         int64                  `json:"amountDue" bun:"amount_due,notnull,default:0"`
	Description       string                 `json:"description" bun:"description"`
	PeriodStart       time.Time              `json:"periodStart" bun:"period_start,notnull"`
	PeriodEnd         time.Time              `json:"periodEnd" bun:"period_end,notnull"`
	DueDate           time.Time              `json:"dueDate" bun:"due_date,notnull"`
	PaidAt            *time.Time             `json:"paidAt" bun:"paid_at"`
	VoidedAt          *time.Time             `json:"voidedAt" bun:"voided_at"`
	ProviderInvoiceID string                 `json:"providerInvoiceId" bun:"provider_invoice_id"`
	ProviderPDFURL    string                 `json:"providerPdfUrl" bun:"provider_pdf_url"`
	HostedInvoiceURL  string                 `json:"hostedInvoiceUrl" bun:"hosted_invoice_url"`
	Metadata          map[string]interface{} `json:"metadata" bun:"metadata,type:jsonb"`

	// Relations
	Subscription *Subscription             `json:"subscription,omitempty" bun:"rel:belongs-to,join:subscription_id=id"`
	Organization *mainschema.Organization  `json:"organization,omitempty" bun:"rel:belongs-to,join:organization_id=id"`
	Items        []SubscriptionInvoiceItem `json:"items,omitempty" bun:"rel:has-many,join:id=invoice_id"`
}

SubscriptionInvoice represents a billing invoice

type SubscriptionInvoiceItem

type SubscriptionInvoiceItem struct {
	bun.BaseModel `bun:"table:subscription_invoice_items,alias:sii"`

	ID             xid.ID                 `json:"id" bun:"id,pk,type:varchar(20)"`
	InvoiceID      xid.ID                 `json:"invoiceId" bun:"invoice_id,notnull,type:varchar(20)"`
	Description    string                 `json:"description" bun:"description,notnull"`
	Quantity       int64                  `json:"quantity" bun:"quantity,notnull,default:1"`
	UnitAmount     int64                  `json:"unitAmount" bun:"unit_amount,notnull"`
	Amount         int64                  `json:"amount" bun:"amount,notnull"`
	PlanID         *xid.ID                `json:"planId" bun:"plan_id,type:varchar(20)"`
	AddOnID        *xid.ID                `json:"addOnId" bun:"addon_id,type:varchar(20)"`
	PeriodStart    time.Time              `json:"periodStart" bun:"period_start,notnull"`
	PeriodEnd      time.Time              `json:"periodEnd" bun:"period_end,notnull"`
	Proration      bool                   `json:"proration" bun:"proration,notnull,default:false"`
	Metadata       map[string]interface{} `json:"metadata" bun:"metadata,type:jsonb"`
	ProviderItemID string                 `json:"providerItemId" bun:"provider_item_id"`
	CreatedAt      time.Time              `json:"createdAt" bun:"created_at,nullzero,notnull,default:current_timestamp"`

	// Relations
	Invoice *SubscriptionInvoice `json:"invoice,omitempty" bun:"rel:belongs-to,join:invoice_id=id"`
	Plan    *SubscriptionPlan    `json:"plan,omitempty" bun:"rel:belongs-to,join:plan_id=id"`
	AddOn   *SubscriptionAddOn   `json:"addOn,omitempty" bun:"rel:belongs-to,join:addon_id=id"`
}

SubscriptionInvoiceItem represents a line item on an invoice

type SubscriptionMovement

type SubscriptionMovement struct {
	bun.BaseModel `bun:"table:subscription_movements,alias:sm"`

	ID             xid.ID    `bun:"id,pk,type:char(20)"`
	AppID          xid.ID    `bun:"app_id,notnull,type:char(20)"`
	SubscriptionID xid.ID    `bun:"subscription_id,notnull,type:char(20)"`
	OrganizationID xid.ID    `bun:"organization_id,notnull,type:char(20)"`
	MovementType   string    `bun:"movement_type,notnull"` // new, upgrade, downgrade, churn, reactivation
	PreviousMRR    int64     `bun:"previous_mrr,notnull,default:0"`
	NewMRR         int64     `bun:"new_mrr,notnull,default:0"`
	MRRChange      int64     `bun:"mrr_change,notnull,default:0"`
	Currency       string    `bun:"currency,notnull"`
	PreviousPlanID *xid.ID   `bun:"previous_plan_id,type:char(20)"`
	NewPlanID      *xid.ID   `bun:"new_plan_id,type:char(20)"`
	Reason         string    `bun:"reason"`
	Notes          string    `bun:"notes"`
	OccurredAt     time.Time `bun:"occurred_at,notnull"`
	CreatedAt      time.Time `bun:"created_at,notnull,default:current_timestamp"`

	// Relations
	Subscription *Subscription     `bun:"rel:belongs-to,join:subscription_id=id"`
	PreviousPlan *SubscriptionPlan `bun:"rel:belongs-to,join:previous_plan_id=id"`
	NewPlan      *SubscriptionPlan `bun:"rel:belongs-to,join:new_plan_id=id"`
}

SubscriptionMovement represents a subscription movement event in the database

type SubscriptionPaymentMethod

type SubscriptionPaymentMethod struct {
	mainschema.AuditableModel `bun:",inline"`
	bun.BaseModel             `bun:"table:subscription_payment_methods,alias:spm"`

	ID                 xid.ID `json:"id" bun:"id,pk,type:varchar(20)"`
	OrganizationID     xid.ID `json:"organizationId" bun:"organization_id,notnull,type:varchar(20)"`
	Type               string `json:"type" bun:"type,notnull"` // card, bank_account, sepa_debit
	IsDefault          bool   `json:"isDefault" bun:"is_default,notnull,default:false"`
	ProviderMethodID   string `json:"providerMethodId" bun:"provider_method_id,notnull"`
	ProviderCustomerID string `json:"providerCustomerId" bun:"provider_customer_id,notnull"`

	// Card fields
	CardBrand    string `json:"cardBrand" bun:"card_brand"`
	CardLast4    string `json:"cardLast4" bun:"card_last4"`
	CardExpMonth int    `json:"cardExpMonth" bun:"card_exp_month"`
	CardExpYear  int    `json:"cardExpYear" bun:"card_exp_year"`
	CardFunding  string `json:"cardFunding" bun:"card_funding"`

	// Bank fields
	BankName          string `json:"bankName" bun:"bank_name"`
	BankLast4         string `json:"bankLast4" bun:"bank_last4"`
	BankRoutingNumber string `json:"bankRoutingNumber" bun:"bank_routing_number"`
	BankAccountType   string `json:"bankAccountType" bun:"bank_account_type"`

	// Billing details
	BillingName         string `json:"billingName" bun:"billing_name"`
	BillingEmail        string `json:"billingEmail" bun:"billing_email"`
	BillingPhone        string `json:"billingPhone" bun:"billing_phone"`
	BillingAddressLine1 string `json:"billingAddressLine1" bun:"billing_address_line1"`
	BillingAddressLine2 string `json:"billingAddressLine2" bun:"billing_address_line2"`
	BillingCity         string `json:"billingCity" bun:"billing_city"`
	BillingState        string `json:"billingState" bun:"billing_state"`
	BillingPostalCode   string `json:"billingPostalCode" bun:"billing_postal_code"`
	BillingCountry      string `json:"billingCountry" bun:"billing_country"`

	Metadata map[string]interface{} `json:"metadata" bun:"metadata,type:jsonb"`

	// Relations
	Organization *mainschema.Organization `json:"organization,omitempty" bun:"rel:belongs-to,join:organization_id=id"`
}

SubscriptionPaymentMethod represents a stored payment method

type SubscriptionPlan

type SubscriptionPlan struct {
	mainschema.AuditableModel `bun:",inline"`
	bun.BaseModel             `bun:"table:subscription_plans,alias:sp"`

	ID              xid.ID                 `json:"id" bun:"id,pk,type:varchar(20)"`
	AppID           xid.ID                 `json:"appId" bun:"app_id,notnull,type:varchar(20)"`
	Name            string                 `json:"name" bun:"name,notnull"`
	Slug            string                 `json:"slug" bun:"slug,notnull"` // Unique within app
	Description     string                 `json:"description" bun:"description"`
	BillingPattern  string                 `json:"billingPattern" bun:"billing_pattern,notnull"`
	BillingInterval string                 `json:"billingInterval" bun:"billing_interval,notnull"`
	BasePrice       int64                  `json:"basePrice" bun:"base_price,notnull,default:0"`
	Currency        string                 `json:"currency" bun:"currency,notnull,default:'USD'"`
	TrialDays       int                    `json:"trialDays" bun:"trial_days,notnull,default:0"`
	TierMode        string                 `json:"tierMode" bun:"tier_mode,default:'graduated'"`
	Metadata        map[string]interface{} `json:"metadata" bun:"metadata,type:jsonb"`
	IsActive        bool                   `json:"isActive" bun:"is_active,notnull,default:true"`
	IsPublic        bool                   `json:"isPublic" bun:"is_public,notnull,default:true"`
	DisplayOrder    int                    `json:"displayOrder" bun:"display_order,notnull,default:0"`
	ProviderPlanID  string                 `json:"providerPlanId" bun:"provider_plan_id"`
	ProviderPriceID string                 `json:"providerPriceId" bun:"provider_price_id"`

	// Relations
	App          *mainschema.App           `json:"app,omitempty" bun:"rel:belongs-to,join:app_id=id"`
	Features     []SubscriptionPlanFeature `json:"features,omitempty" bun:"rel:has-many,join:id=plan_id"`
	Tiers        []SubscriptionPlanTier    `json:"tiers,omitempty" bun:"rel:has-many,join:id=plan_id"`
	FeatureLinks []PlanFeatureLink         `json:"featureLinks,omitempty" bun:"rel:has-many,join:id=plan_id"`
}

SubscriptionPlan represents a subscription plan in the database

type SubscriptionPlanFeature

type SubscriptionPlanFeature struct {
	bun.BaseModel `bun:"table:subscription_plan_features,alias:spf"`

	ID          xid.ID    `json:"id" bun:"id,pk,type:varchar(20)"`
	PlanID      xid.ID    `json:"planId" bun:"plan_id,notnull,type:varchar(20)"`
	Key         string    `json:"key" bun:"key,notnull"`
	Name        string    `json:"name" bun:"name,notnull"`
	Description string    `json:"description" bun:"description"`
	Type        string    `json:"type" bun:"type,notnull"` // boolean, limit, unlimited
	Value       string    `json:"value" bun:"value"`       // JSON-encoded value
	CreatedAt   time.Time `json:"createdAt" bun:"created_at,nullzero,notnull,default:current_timestamp"`

	// Relations
	Plan *SubscriptionPlan `json:"plan,omitempty" bun:"rel:belongs-to,join:plan_id=id"`
}

SubscriptionPlanFeature represents a feature limit on a plan

type SubscriptionPlanTier

type SubscriptionPlanTier struct {
	bun.BaseModel `bun:"table:subscription_plan_tiers,alias:spt"`

	ID         xid.ID    `json:"id" bun:"id,pk,type:varchar(20)"`
	PlanID     xid.ID    `json:"planId" bun:"plan_id,notnull,type:varchar(20)"`
	TierOrder  int       `json:"tierOrder" bun:"tier_order,notnull"`
	UpTo       int64     `json:"upTo" bun:"up_to,notnull"` // -1 for infinite
	UnitAmount int64     `json:"unitAmount" bun:"unit_amount,notnull"`
	FlatAmount int64     `json:"flatAmount" bun:"flat_amount,notnull,default:0"`
	CreatedAt  time.Time `json:"createdAt" bun:"created_at,nullzero,notnull,default:current_timestamp"`

	// Relations
	Plan *SubscriptionPlan `json:"plan,omitempty" bun:"rel:belongs-to,join:plan_id=id"`
}

SubscriptionPlanTier represents a pricing tier for a plan

type SubscriptionPromotionCode

type SubscriptionPromotionCode struct {
	bun.BaseModel `bun:"table:subscription_promotion_codes,alias:spc"`

	ID              xid.ID     `bun:"id,pk,type:char(20)"`
	AppID           xid.ID     `bun:"app_id,notnull,type:char(20)"`
	CouponID        xid.ID     `bun:"coupon_id,notnull,type:char(20)"`
	Code            string     `bun:"code,notnull,unique"`
	IsActive        bool       `bun:"is_active,notnull,default:true"`
	MaxRedemptions  int        `bun:"max_redemptions"`
	ValidFrom       time.Time  `bun:"valid_from,notnull"`
	ValidUntil      *time.Time `bun:"valid_until"`
	RestrictToOrgs  []string   `bun:"restrict_to_orgs,array"`
	FirstTimeOnly   bool       `bun:"first_time_only,notnull,default:false"`
	TimesRedeemed   int        `bun:"times_redeemed,notnull,default:0"`
	ProviderPromoID string     `bun:"provider_promo_id"`
	CreatedAt       time.Time  `bun:"created_at,notnull,default:current_timestamp"`
	UpdatedAt       time.Time  `bun:"updated_at,notnull,default:current_timestamp"`

	// Relations
	Coupon *SubscriptionCoupon `bun:"rel:belongs-to,join:coupon_id=id"`
}

SubscriptionPromotionCode represents a promotion code in the database

type SubscriptionTaxExemption

type SubscriptionTaxExemption struct {
	bun.BaseModel `bun:"table:subscription_tax_exemptions,alias:ste"`

	ID             xid.ID     `bun:"id,pk,type:char(20)"`
	AppID          xid.ID     `bun:"app_id,notnull,type:char(20)"`
	OrganizationID xid.ID     `bun:"organization_id,notnull,type:char(20)"`
	Type           string     `bun:"type,notnull"` // nonprofit, government, resale
	Certificate    string     `bun:"certificate,notnull"`
	Country        string     `bun:"country,notnull"`
	State          string     `bun:"state"`
	VerifiedAt     *time.Time `bun:"verified_at"`
	ExpiresAt      *time.Time `bun:"expires_at"`
	IsActive       bool       `bun:"is_active,notnull,default:true"`
	CreatedAt      time.Time  `bun:"created_at,notnull,default:current_timestamp"`
	UpdatedAt      time.Time  `bun:"updated_at,notnull,default:current_timestamp"`
}

SubscriptionTaxExemption represents a tax exemption in the database

type SubscriptionTaxRate

type SubscriptionTaxRate struct {
	bun.BaseModel `bun:"table:subscription_tax_rates,alias:str"`

	ID                xid.ID     `bun:"id,pk,type:char(20)"`
	AppID             xid.ID     `bun:"app_id,notnull,type:char(20)"`
	Name              string     `bun:"name,notnull"`
	Description       string     `bun:"description"`
	Type              string     `bun:"type,notnull"` // vat, gst, sales_tax, etc.
	Percentage        float64    `bun:"percentage,notnull"`
	Country           string     `bun:"country,notnull"`
	State             string     `bun:"state"`
	City              string     `bun:"city"`
	PostalCode        string     `bun:"postal_code"`
	Behavior          string     `bun:"behavior,notnull,default:'exclusive'"` // exclusive, inclusive
	IsDefault         bool       `bun:"is_default,notnull,default:false"`
	IsActive          bool       `bun:"is_active,notnull,default:true"`
	ProviderTaxRateID string     `bun:"provider_tax_rate_id"`
	ValidFrom         time.Time  `bun:"valid_from,notnull"`
	ValidUntil        *time.Time `bun:"valid_until"`
	CreatedAt         time.Time  `bun:"created_at,notnull,default:current_timestamp"`
	UpdatedAt         time.Time  `bun:"updated_at,notnull,default:current_timestamp"`
}

SubscriptionTaxRate represents a tax rate in the database

type SubscriptionUsageRecord

type SubscriptionUsageRecord struct {
	bun.BaseModel `bun:"table:subscription_usage_records,alias:sur"`

	ID               xid.ID                 `json:"id" bun:"id,pk,type:varchar(20)"`
	SubscriptionID   xid.ID                 `json:"subscriptionId" bun:"subscription_id,notnull,type:varchar(20)"`
	OrganizationID   xid.ID                 `json:"organizationId" bun:"organization_id,notnull,type:varchar(20)"`
	MetricKey        string                 `json:"metricKey" bun:"metric_key,notnull"`
	Quantity         int64                  `json:"quantity" bun:"quantity,notnull"`
	Action           string                 `json:"action" bun:"action,notnull"` // set, increment, decrement
	Timestamp        time.Time              `json:"timestamp" bun:"timestamp,notnull"`
	IdempotencyKey   string                 `json:"idempotencyKey" bun:"idempotency_key"`
	Metadata         map[string]interface{} `json:"metadata" bun:"metadata,type:jsonb"`
	ProviderRecordID string                 `json:"providerRecordId" bun:"provider_record_id"`
	Reported         bool                   `json:"reported" bun:"reported,notnull,default:false"`
	ReportedAt       *time.Time             `json:"reportedAt" bun:"reported_at"`
	CreatedAt        time.Time              `json:"createdAt" bun:"created_at,nullzero,notnull,default:current_timestamp"`

	// Relations
	Subscription *Subscription            `json:"subscription,omitempty" bun:"rel:belongs-to,join:subscription_id=id"`
	Organization *mainschema.Organization `json:"organization,omitempty" bun:"rel:belongs-to,join:organization_id=id"`
}

SubscriptionUsageRecord represents a usage record for metered billing

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL