From 8db917844d5fe7fa85aec8b1fe78b3f2f6ebbde1 Mon Sep 17 00:00:00 2001 From: Andrew McKnight Date: Tue, 26 May 2026 16:15:19 -0800 Subject: [PATCH 1/3] feat(admin): add Billing Platform page with invoice comparison (REVENG-86) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds a new "Billing Platform" sidebar entry hosting an Invoice Comparison tool that calls the new GET /api/0/_admin/cells//invoice-comparison/ endpoint (getsentry-side change in a paired PR). The page lets staff pick a region + datetime-local time window and renders per-org totals comparing legacy Invoice vs PlatformInvoice records generated in the window, plus summary counts/totals/delta. Rows are sorted by absolute $ delta desc. datetime-local inputs are converted to UTC ISO on submit so the wire format is unambiguous regardless of the operator's timezone. The Billing Platform page is the landing spot for future milestone-1 verification tooling — invoice comparison is the first section. Co-Authored-By: Claude Opus 4.7 (1M context) feat(admin): show % delta column in invoice comparison Pairs with the getsentry-side switch to percent-based sorting. Adds a "Δ %" column showing percent delta relative to legacy (or ∞ when there's no legacy baseline). Keeps the "Δ $" column so absolute-dollar context remains visible. Co-Authored-By: Claude Opus 4.7 (1M context) fix(admin): right-align Δ columns in invoice comparison table The Table descendant rule (`th, td { text-align: left }`) had specificity (0,1,1) which beat the single-class RightHeader/RightCell selectors at (0,1,0), so Legacy/Platform/Δ %/Δ $ columns silently rendered left-aligned. Wrap the right-align rule in `&&` to double the class selector and win specificity. Addresses Cursor Bugbot finding. Co-Authored-By: Claude Opus 4.7 (1M context) ref(admin): use scraps core components in Billing Platform page Replaces custom styled() helpers with scraps primitives per AGENTS.md frontend guidelines: - Raw

from @sentry/scraps/text - SummaryGrid (display: grid) → Grid columns="repeat(6, 1fr)" - SummaryCell, Field (flex column) → Flex direction="column" - SummaryLabel (font-size: sm + muted color) → Text size="sm" variant="muted" - SummaryValue (font-size: lg + bold) → Text size="lg" bold - SecondaryText, Count (small + muted color) → Text size="sm" variant="muted" Kept FieldLabel and TruncatedNote as thin wrappers since they layer small layout-only tweaks (color on a