File size: 2,241 Bytes
5a22efd | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | 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))
}
|