package usagebased import ( "fmt" "slices" "github.com/openmeterio/openmeter/openmeter/billing/charges/meta" "github.com/openmeterio/openmeter/pkg/models" ) type Status string const ( StatusCreated Status = Status(meta.ChargeStatusCreated) // Active status and substates StatusActive Status = Status(meta.ChargeStatusActive) StatusActiveRealizationStarted Status = "active.realization.started" StatusActiveRealizationWaitingForCollection Status = "active.realization.waiting_for_collection" StatusActiveRealizationProcessing Status = "active.realization.processing" StatusActiveRealizationIssuing Status = "active.realization.issuing" StatusActiveRealizationCompleted Status = "active.realization.completed" StatusActiveAwaitingPaymentSettlement Status = "active.awaiting_payment_settlement" StatusFinal Status = Status(meta.ChargeStatusFinal) StatusDeleted Status = Status(meta.ChargeStatusDeleted) ) // mutableRealizationStatuses are states where the current realization can still // be rebuilt by period changes instead of touching immutable invoice or ledger // records. var mutableRealizationStatuses = []Status{ StatusActiveRealizationStarted, StatusActiveRealizationWaitingForCollection, StatusActiveRealizationProcessing, } func IsMutableRealizationStatus(status Status) bool { return slices.Contains(mutableRealizationStatuses, status) } func (Status) Values() []string { return []string{ string(StatusCreated), string(StatusActive), string(StatusActiveRealizationStarted), string(StatusActiveRealizationWaitingForCollection), string(StatusActiveRealizationProcessing), string(StatusActiveRealizationIssuing), string(StatusActiveRealizationCompleted), string(StatusActiveAwaitingPaymentSettlement), string(StatusFinal), string(StatusDeleted), } } func (s Status) Validate() error { if !slices.Contains(s.Values(), string(s)) { return models.NewGenericValidationError(fmt.Errorf("invalid status: %s", s)) } return nil } func (s Status) ToMetaChargeStatus() (meta.ChargeStatus, error) { if err := s.Validate(); err != nil { return meta.ChargeStatusCreated, err } return meta.DetailedStatusToMetaStatus(string(s)) }