diff --git a/components/usage/pkg/apiv1/billing.go b/components/usage/pkg/apiv1/billing.go index d82699700d7055..828e87dd12ac3c 100644 --- a/components/usage/pkg/apiv1/billing.go +++ b/components/usage/pkg/apiv1/billing.go @@ -67,6 +67,37 @@ func (s *BillingService) UpdateInvoices(ctx context.Context, in *v1.UpdateInvoic return &v1.UpdateInvoicesResponse{}, nil } +func (s *BillingService) ReconcileInvoices(ctx context.Context, in *v1.ReconcileInvoicesRequest) (*v1.ReconcileInvoicesResponse, error) { + balances, err := db.ListBalance(ctx, s.conn) + if err != nil { + log.WithError(err).Errorf("Failed to reconcile invoices.") + return nil, status.Errorf(codes.Internal, "Failed to reconcile invoices.") + } + + creditSummaryForTeams := map[string]stripe.CreditSummary{} + for _, balance := range balances { + entity, id := balance.AttributionID.Values() + + // TODO: Support updating of user attribution IDs + if entity != db.AttributionEntity_Team { + continue + } + + creditSummaryForTeams[id] = stripe.CreditSummary{ + Credits: int64(math.Ceil(balance.CreditCents.ToCredits())), + ReportID: "no-report", + } + } + + err = s.stripeClient.UpdateUsage(ctx, creditSummaryForTeams) + if err != nil { + log.WithError(err).Errorf("Failed to udpate usage in stripe.") + return nil, status.Errorf(codes.Internal, "Failed to update usage in stripe") + } + + return &v1.ReconcileInvoicesResponse{}, nil +} + func (s *BillingService) FinalizeInvoice(ctx context.Context, in *v1.FinalizeInvoiceRequest) (*v1.FinalizeInvoiceResponse, error) { logger := log.WithField("invoice_id", in.GetInvoiceId()) diff --git a/components/usage/pkg/stripe/stripe.go b/components/usage/pkg/stripe/stripe.go index 8d69c826925c36..4664a45b3350fa 100644 --- a/components/usage/pkg/stripe/stripe.go +++ b/components/usage/pkg/stripe/stripe.go @@ -152,18 +152,6 @@ func (c *Client) updateUsageForCustomer(ctx context.Context, customer *stripe.Cu return nil, fmt.Errorf("failed to register usage for customer %q on subscription item %s", customer.Name, subscriptionItemId) } - invoice, err := c.GetUpcomingInvoice(ctx, customer.ID) - if err != nil { - return nil, fmt.Errorf("failed to find upcoming invoice for customer %s: %w", customer.ID, err) - } - - _, err = c.UpdateInvoiceMetadata(ctx, invoice.ID, map[string]string{ - ReportIDMetadataKey: summary.ReportID, - }) - if err != nil { - return nil, fmt.Errorf("failed to udpate invoice %s metadata with report ID: %w", invoice.ID, err) - } - return &UsageRecord{ SubscriptionItemID: subscriptionItemId, Quantity: summary.Credits,