| package engine |
|
|
| import ( |
| "fmt" |
| "slices" |
| "time" |
|
|
| "github.com/openmeterio/openmeter/openmeter/credit/balance" |
| "github.com/openmeterio/openmeter/openmeter/credit/grant" |
| ) |
|
|
| |
| |
| func (e *engine) reset(grants []grant.Grant, snap balance.Snapshot, behavior grant.ResetBehavior, at time.Time) (balance.Snapshot, error) { |
| |
| grantMap := make(map[string]grant.Grant) |
| for _, g := range grants { |
| grantMap[g.ID] = g |
| } |
|
|
| |
| rolledOver := snap.Balances.Clone() |
|
|
| for grantID, grantBalance := range rolledOver { |
| grant, ok := grantMap[grantID] |
| |
| if !ok { |
| return balance.Snapshot{}, fmt.Errorf("grant %s not found", grantID) |
| } |
|
|
| |
| if !grant.ActiveAt(at) { |
| continue |
| } |
|
|
| rolledOver[grantID] = grant.RolloverBalance(grantBalance) |
| } |
|
|
| |
| startingOverage := 0.0 |
| if behavior.PreserveOverage { |
| startingOverage = snap.Overage |
| } |
|
|
| prioritizedGrants := slices.Clone(grants) |
| if err := PrioritizeGrants(prioritizedGrants); err != nil { |
| return balance.Snapshot{}, fmt.Errorf("failed to prioritize grants: %w", err) |
| } |
|
|
| rolledOver, _, startingOverage = e.burnDownGrants(rolledOver, prioritizedGrants, startingOverage) |
|
|
| return balance.Snapshot{ |
| At: at, |
| Balances: rolledOver, |
| Overage: startingOverage, |
| }, nil |
| } |
|
|