107 lines · 3.9 KB
import { all } from "../db";
import { METERS } from "~/lib/meters";
import type { MeterId } from "~/lib/meters";
import { billingSettings, hardCap } from "./quota";
import type { BillingSettings } from "./quota";
import { periodOf } from "./record";

export type MeterUsage = {
  meter: MeterId;
  label: string;
  category: string;
  unit: string;
  quantity: number;
  reserved: number;
  included: number | null;
  hardCap: number | null;
  overageCents: number;
};

export type UsageSummary = {
  accountId: string;
  period: string;
  plan: { id: string; label: string; billsOverage: boolean };
  spendingLimitCents: number | null;
  totalCents: number;
  meters: MeterUsage[];
  repos: { repoId: string; name: string | null; meter: string; quantity: number }[];
  days: { day: string; meter: string; quantity: number }[];
  alerts: { subject: string; threshold: number; createdAt: number }[];
};

export function overageCents(quantity: number, included: number | null, microCentsPerUnit: number): number {
  const billable = Math.max(0, quantity - (included ?? 0));
  return (billable * microCentsPerUnit) / 1e6;
}

export function meterUsages(
  settings: BillingSettings,
  counters: Map<string, { quantity: number; reserved: number }>,
  gauges: Map<string, number>,