Automate issuer overlay creation from ticker searches

This commit is contained in:
2026-03-19 20:44:58 -04:00
parent 17de3dd72d
commit 391d6d34ce
79 changed files with 4746 additions and 695 deletions

View File

@@ -43,7 +43,7 @@ import { Input } from "@/components/ui/input";
import { Panel } from "@/components/ui/panel";
import { useAuthGuard } from "@/hooks/use-auth-guard";
import { useLinkPrefetch } from "@/hooks/use-link-prefetch";
import { queueFilingSync } from "@/lib/api";
import { ensureTickerAutomation, queueFilingSync } from "@/lib/api";
import {
formatCurrencyByScale,
formatFinancialStatementValue,
@@ -104,6 +104,8 @@ const SURFACE_OPTIONS = [
{ value: "income_statement", label: "Income" },
{ value: "balance_sheet", label: "Balance" },
{ value: "cash_flow_statement", label: "Cash Flow" },
{ value: "equity_statement", label: "Stockholders' Equity" },
{ value: "disclosures", label: "Disclosures" },
{ value: "ratios", label: "Ratios" },
{ value: "segments_kpis", label: "KPIs" },
];
@@ -166,7 +168,9 @@ function isStatementSurfaceKind(surfaceKind: FinancialSurfaceKind) {
return (
surfaceKind === "income_statement" ||
surfaceKind === "balance_sheet" ||
surfaceKind === "cash_flow_statement"
surfaceKind === "cash_flow_statement" ||
surfaceKind === "equity_statement" ||
surfaceKind === "disclosures"
);
}
@@ -324,7 +328,11 @@ function buildStatementTreeDisplayValue(input: {
scale: NumberScaleUnit;
surfaceKind: Extract<
FinancialSurfaceKind,
"income_statement" | "balance_sheet" | "cash_flow_statement"
| "income_statement"
| "balance_sheet"
| "cash_flow_statement"
| "equity_statement"
| "disclosures"
>;
}) {
const current = statementRowValue(input.row, input.periodId);
@@ -535,7 +543,9 @@ function FinancialsPageContent() {
const statementSurface =
surfaceKind === "income_statement" ||
surfaceKind === "balance_sheet" ||
surfaceKind === "cash_flow_statement";
surfaceKind === "cash_flow_statement" ||
surfaceKind === "equity_statement" ||
surfaceKind === "disclosures";
if (!statementSurface && displayMode !== "standardized") {
setDisplayMode("standardized");
}
@@ -551,6 +561,12 @@ function FinancialsPageContent() {
}
}, [displayMode, surfaceKind]);
useEffect(() => {
if (!financials?.displayModes.includes(displayMode)) {
setDisplayMode(financials?.defaultDisplayMode ?? "standardized");
}
}, [displayMode, financials?.defaultDisplayMode, financials?.displayModes]);
const loadFinancials = useCallback(
async (symbol: string, options?: LoadOptions) => {
const normalizedTicker = symbol.trim().toUpperCase();
@@ -560,7 +576,9 @@ function FinancialsPageContent() {
(surfaceKind === "segments_kpis" ||
surfaceKind === "income_statement" ||
surfaceKind === "balance_sheet" ||
surfaceKind === "cash_flow_statement");
surfaceKind === "cash_flow_statement" ||
surfaceKind === "equity_statement" ||
surfaceKind === "disclosures");
if (!options?.append) {
setLoading(true);
@@ -672,6 +690,8 @@ function FinancialsPageContent() {
case "income_statement":
case "balance_sheet":
case "cash_flow_statement":
case "equity_statement":
case "disclosures":
return displayMode === "faithful"
? (financials.statementRows?.faithful ?? [])
: (financials.statementRows?.standardized ?? []);
@@ -808,6 +828,15 @@ function FinancialsPageContent() {
);
}
if (surfaceKind === "equity_statement") {
return (
standardizedRows.find((row) => row.key === "total_equity") ??
standardizedRows.find((row) => row.key === "retained_earnings") ??
standardizedRows.find((row) => row.key === "common_stock_and_apic") ??
null
);
}
return null;
}, [displayMode, financials?.statementRows, surfaceKind]);
@@ -829,6 +858,11 @@ function FinancialsPageContent() {
}, [trendSeries, visiblePeriods]);
const controlSections = useMemo<FinancialControlSection[]>(() => {
const availableDisplayModeOptions = DISPLAY_MODE_OPTIONS.filter((option) =>
financials?.displayModes
? financials.displayModes.includes(option.value as FinancialDisplayMode)
: option.value === "standardized" || surfaceKind !== "equity_statement",
);
const sections: FinancialControlSection[] = [
{
key: "surface",
@@ -869,12 +903,14 @@ function FinancialsPageContent() {
if (
surfaceKind === "income_statement" ||
surfaceKind === "balance_sheet" ||
surfaceKind === "cash_flow_statement"
surfaceKind === "cash_flow_statement" ||
surfaceKind === "equity_statement" ||
surfaceKind === "disclosures"
) {
sections.push({
key: "display",
label: "Display",
options: DISPLAY_MODE_OPTIONS,
options: availableDisplayModeOptions,
value: displayMode,
onChange: (value) => {
setDisplayMode(value as FinancialDisplayMode);
@@ -894,7 +930,7 @@ function FinancialsPageContent() {
});
return sections;
}, [cadence, displayMode, historyWindow, surfaceKind, valueScale]);
}, [cadence, displayMode, financials?.displayModes, historyWindow, surfaceKind, valueScale]);
const toggleExpandedRow = useCallback((key: string) => {
setExpandedRowKeys((current) => {
@@ -1006,6 +1042,10 @@ function FinancialsPageContent() {
if (!normalized) {
return;
}
void ensureTickerAutomation({
ticker: normalized,
source: "financials",
});
setSelectedFlatRowKey(null);
setSelectedRowRef(null);
setExpandedRowKeys(new Set());
@@ -1464,7 +1504,9 @@ function FinancialsPageContent() {
{(surfaceKind === "income_statement" ||
surfaceKind === "balance_sheet" ||
surfaceKind === "cash_flow_statement") && (
surfaceKind === "cash_flow_statement" ||
surfaceKind === "equity_statement" ||
surfaceKind === "disclosures") && (
<SummarySubsection title="Validation">
<div className="mb-3 flex items-center gap-2 text-sm text-[color:var(--terminal-muted)]">
<AlertTriangle className="size-4" />