diff --git a/src/app/[lang]/(main)/first-nations/remuneration/[bcid]/page.tsx b/src/app/[lang]/(main)/first-nations/remuneration/[bcid]/page.tsx new file mode 100644 index 00000000..a4be1c57 --- /dev/null +++ b/src/app/[lang]/(main)/first-nations/remuneration/[bcid]/page.tsx @@ -0,0 +1,152 @@ +import { notFound } from "next/navigation"; +import { Trans, useLingui } from "@lingui/react/macro"; +import { initLingui } from "@/initLingui"; +import { + H1, + Intro, + Page, + PageContent, + Section, + InternalLink, +} from "@/components/Layout"; +import { RemunerationBreakdown } from "@/components/first-nations/RemunerationBreakdown"; +import { getFirstNationById, getAllFirstNations } from "@/lib/supabase"; +import { + getRemunerationEntriesByBand, + getBandRemunerationSummaryByBcid, +} from "@/lib/supabase/remuneration"; +import { locales } from "@/lib/constants"; +import { generateHreflangAlternates } from "@/lib/utils"; +import { Metadata } from "next"; + +export const revalidate = 3600; +export const dynamicParams = true; + +export async function generateStaticParams() { + try { + const firstNations = await getAllFirstNations(); + + return locales.flatMap((lang) => + firstNations.map((firstNation) => ({ + lang, + bcid: firstNation.bcid, + })), + ); + } catch { + return []; + } +} + +export async function generateMetadata({ + params, +}: { + params: Promise<{ lang: string; bcid: string }>; +}): Promise { + const { lang, bcid } = await params; + + const firstNation = await getFirstNationById(bcid); + + if (!firstNation) { + return {}; + } + + initLingui(lang); + + // eslint-disable-next-line react-hooks/rules-of-hooks + const { t } = useLingui(); + + const provinceSuffix = firstNation.province + ? `, ${firstNation.province}` + : ""; + + const title = `${firstNation.name} Remuneration Breakdown${provinceSuffix} | Canada Spends`; + const description = t`View all remuneration data for ${firstNation.name}${provinceSuffix} across all available years. Includes compensation and expenses for elected officials and staff from annual reports published under the FNFTA.`; + + return { + title, + description, + alternates: generateHreflangAlternates( + lang, + "/first-nations/remuneration/[bcid]", + { bcid }, + ), + openGraph: { + title, + description, + type: "website", + }, + }; +} + +export default async function FirstNationRemunerationPage({ + params, +}: { + params: Promise<{ lang: string; bcid: string }>; +}) { + const { lang, bcid } = await params; + initLingui(lang); + + const [firstNation, summaries, entries] = await Promise.all([ + getFirstNationById(bcid), + getBandRemunerationSummaryByBcid(bcid), + getRemunerationEntriesByBand(bcid), + ]); + + if (!firstNation) { + notFound(); + } + + if (summaries.length === 0 && entries.length === 0) { + notFound(); + } + + const provinceSuffix = firstNation.province + ? `, ${firstNation.province}` + : ""; + + return ( + + +
+
+ + First Nations + + {" / "} + + {firstNation.name} + + {" / "} + + Remuneration + +
+

+ + {firstNation.name} Remuneration{provinceSuffix} + +

+ + + All remuneration entries for {firstNation.name} across{" "} + {summaries.length} available fiscal year(s). Data is extracted + from remuneration schedules published under the First Nations + Financial Transparency Act (FNFTA). + + +
+
+ +
+
+
+ ); +} diff --git a/src/components/first-nations/RemunerationBreakdown.tsx b/src/components/first-nations/RemunerationBreakdown.tsx new file mode 100644 index 00000000..86f8e19f --- /dev/null +++ b/src/components/first-nations/RemunerationBreakdown.tsx @@ -0,0 +1,560 @@ +"use client"; + +import { useState, useMemo, useCallback, useEffect, useRef } from "react"; +import { Trans } from "@lingui/react/macro"; +import { + Search, + ChevronUp, + ChevronDown, + ChevronsUpDown, + FileText, + Loader2, +} from "lucide-react"; +import type { BandRemunerationSummary } from "@/lib/supabase/remuneration"; +import type { RemunerationEntryRow } from "@/lib/supabase/remuneration"; + +const CDN_BASE_URL = "https://cdn.canadaspends.com"; + +function formatCurrency(value: number | null | undefined): string { + if (value === undefined || value === null) return "-"; + return new Intl.NumberFormat("en-CA", { + style: "currency", + currency: "CAD", + minimumFractionDigits: 0, + maximumFractionDigits: 0, + }).format(value); +} + +function formatCurrencyCompact(value: number | null | undefined): string { + if (value === undefined || value === null) return "-"; + const absolute = Math.abs(value); + if (absolute >= 1_000_000) { + return `$${(value / 1_000_000).toFixed(2)}M`; + } + if (absolute >= 1_000) { + return `$${(value / 1_000).toFixed(0)}K`; + } + return new Intl.NumberFormat("en-CA", { + style: "currency", + currency: "CAD", + minimumFractionDigits: 0, + maximumFractionDigits: 0, + }).format(value); +} + +type SortKey = + | "fiscal_year_end" + | "official_name" + | "position" + | "compensation" + | "expenses" + | "row_total" + | "months_in_office"; + +type SortDirection = "asc" | "desc"; + +function getSortValue( + entry: RemunerationEntryRow, + key: SortKey, +): string | number { + switch (key) { + case "fiscal_year_end": + return entry.fiscal_year_end; + case "official_name": + return entry.official_name; + case "position": + return entry.position; + case "compensation": + return entry.compensation; + case "expenses": + return entry.expenses; + case "row_total": + return entry.row_total; + case "months_in_office": + return entry.months_in_office ?? 0; + } +} + +function SortIcon({ + columnKey, + activeKey, + direction, +}: { + columnKey: SortKey; + activeKey: SortKey; + direction: SortDirection; +}) { + if (columnKey !== activeKey) { + return ; + } + return direction === "asc" ? ( + + ) : ( + + ); +} + +interface RemunerationBreakdownProps { + summaries: BandRemunerationSummary[]; + entries: RemunerationEntryRow[]; +} + +export function RemunerationBreakdown({ + summaries, + entries, +}: RemunerationBreakdownProps) { + const [searchQuery, setSearchQuery] = useState(""); + const [debouncedSearch, setDebouncedSearch] = useState(""); + const [selectedYear, setSelectedYear] = useState(""); + const [sortKey, setSortKey] = useState("fiscal_year_end"); + const [sortDirection, setSortDirection] = useState("desc"); + + const debounceRef = useRef(null); + useEffect(() => { + if (debounceRef.current) { + clearTimeout(debounceRef.current); + } + debounceRef.current = setTimeout(() => { + setDebouncedSearch(searchQuery); + }, 300); + return () => { + if (debounceRef.current) { + clearTimeout(debounceRef.current); + } + }; + }, [searchQuery]); + + const isSearching = debouncedSearch !== searchQuery; + + const availableYears = useMemo(() => { + const yearsSet = new Set(); + for (const s of summaries) { + yearsSet.add(s.fiscal_year_end); + } + return Array.from(yearsSet).sort((a, b) => b - a); + }, [summaries]); + + const handleSort = useCallback( + (key: SortKey) => { + if (key === sortKey) { + setSortDirection((d) => (d === "asc" ? "desc" : "asc")); + } else { + setSortKey(key); + setSortDirection( + key === "official_name" || key === "position" ? "asc" : "desc", + ); + } + }, + [sortKey], + ); + + const filtered = useMemo(() => { + let result = entries; + + if (selectedYear) { + result = result.filter((e) => e.fiscal_year_end === Number(selectedYear)); + } + + if (debouncedSearch.trim()) { + const query = debouncedSearch.toLowerCase(); + result = result.filter( + (e) => + e.official_name.toLowerCase().includes(query) || + e.position.toLowerCase().includes(query), + ); + } + + const sorted = [...result].sort((a, b) => { + const aVal = getSortValue(a, sortKey); + const bVal = getSortValue(b, sortKey); + let cmp: number; + if (typeof aVal === "string" && typeof bVal === "string") { + cmp = aVal.localeCompare(bVal); + } else { + cmp = (aVal as number) - (bVal as number); + } + return sortDirection === "asc" ? cmp : -cmp; + }); + + return sorted; + }, [entries, selectedYear, debouncedSearch, sortKey, sortDirection]); + + // Build a lookup from year to summary for source PDFs + const summaryByYear = useMemo(() => { + const map = new Map(); + for (const s of summaries) { + map.set(s.fiscal_year_end, s); + } + return map; + }, [summaries]); + + // Compute totals for the filtered set + const totals = useMemo(() => { + return filtered.reduce( + (acc, e) => ({ + compensation: acc.compensation + e.compensation, + expenses: acc.expenses + e.expenses, + total: acc.total + e.row_total, + }), + { compensation: 0, expenses: 0, total: 0 }, + ); + }, [filtered]); + + const thClass = + "px-4 py-3 text-xs font-medium text-gray-500 uppercase tracking-wider cursor-pointer hover:text-gray-700 select-none whitespace-nowrap"; + + return ( +
+ {/* Year Summary Cards */} + {summaries.length > 1 && ( +
+ {summaries.map((s) => ( +
+
+ + FY {s.fiscal_year_end} + + {s.source_pdf_r2_path && ( + + + + )} +
+

+ {formatCurrencyCompact(s.total_remuneration)} +

+

+ {s.officials_count} officials + {s.chief_name && ( + <> + {" "} + · Chief: {s.chief_name} + + )} +

+
+ ))} +
+ )} + + {/* Filters */} +
+
+
+ +
+ setSearchQuery(e.target.value)} + placeholder="Search by name or position..." + className="block w-full pl-10 pr-3 py-3 border border-gray-300 shadow-sm placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-auburn-500 focus:border-auburn-500 text-base" + /> +
+ {availableYears.length > 1 && ( + + )} +
+ + {/* Results count */} +
+ {searchQuery || selectedYear ? ( + + Showing {filtered.length} of {entries.length} entries + + ) : ( + + {entries.length} remuneration entries across {availableYears.length}{" "} + year(s) + + )} + {isSearching && ( + + )} +
+ + {filtered.length === 0 ? ( +
+

+ No entries found matching your search. +

+
+ ) : ( + <> + {/* Mobile Card View */} +
+ {filtered.map((entry, i) => ( +
+
+
+

+ {entry.official_name} +

+

{entry.position}

+
+ + FY {entry.fiscal_year_end} + +
+
+
+ + Compensation + +

+ {formatCurrency(entry.compensation)} +

+
+
+ + Expenses + +

+ {formatCurrency(entry.expenses)} +

+
+
+ + Total + +

+ {formatCurrency(entry.row_total)} +

+
+
+
+ ))} +
+ + {/* Desktop Table View */} +
+ + + + + + + + + + + + + + + {filtered.map((entry, i) => { + const summary = summaryByYear.get(entry.fiscal_year_end); + return ( + + + + + + + + + + + ); + })} + + + + + + + + + + +
handleSort("fiscal_year_end")} + > + Year + + handleSort("official_name")} + > + Name + + handleSort("position")} + > + Position + + handleSort("compensation")} + > + Compensation + + handleSort("expenses")} + > + Expenses + + handleSort("row_total")} + > + Total + + handleSort("months_in_office")} + > + Months + + + Source +
+ {entry.fiscal_year_end} + + {entry.official_name} + + {entry.position} + + {formatCurrency(entry.compensation)} + + {formatCurrency(entry.expenses)} + + {formatCurrency(entry.row_total)} + + {entry.months_in_office !== null + ? entry.months_in_office + : "-"} + + {summary?.source_pdf_r2_path ? ( + + + + ) : ( + - + )} +
+ Total + {selectedYear || debouncedSearch ? ( + + ({filtered.length} entries) + + ) : null} + + {formatCurrency(totals.compensation)} + + {formatCurrency(totals.expenses)} + + {formatCurrency(totals.total)} +
+
+ + {/* Mobile totals */} +
+

+ Totals +

+
+
+ + Compensation + +

+ {formatCurrencyCompact(totals.compensation)} +

+
+
+ + Expenses + +

+ {formatCurrencyCompact(totals.expenses)} +

+
+
+ + Total + +

+ {formatCurrencyCompact(totals.total)} +

+
+
+
+ + )} +
+ ); +} diff --git a/src/components/first-nations/RemunerationOverview.tsx b/src/components/first-nations/RemunerationOverview.tsx index 47ef4f15..21e0f585 100644 --- a/src/components/first-nations/RemunerationOverview.tsx +++ b/src/components/first-nations/RemunerationOverview.tsx @@ -535,7 +535,7 @@ const BandCard = memo(function BandCard({
{band.band_name} @@ -722,7 +722,7 @@ const ExpandableRow = memo(function ExpandableRow({ )} e.stopPropagation()} > diff --git a/src/components/first-nations/index.ts b/src/components/first-nations/index.ts index dfa71393..5a4ebda2 100644 --- a/src/components/first-nations/index.ts +++ b/src/components/first-nations/index.ts @@ -5,6 +5,7 @@ export { FirstNationsNotes } from "./FirstNationsNotes"; export { FirstNationsPageContent } from "./FirstNationsPageContent"; export { FirstNationsSearch } from "./FirstNationsSearch"; export { FirstNationsYearSelector } from "./FirstNationsYearSelector"; +export { RemunerationBreakdown } from "./RemunerationBreakdown"; export { RemunerationOverview } from "./RemunerationOverview"; export { RemunerationTable } from "./RemunerationTable"; export { diff --git a/src/lib/supabase/remuneration.ts b/src/lib/supabase/remuneration.ts index 9ec6c287..5ac03b8b 100644 --- a/src/lib/supabase/remuneration.ts +++ b/src/lib/supabase/remuneration.ts @@ -91,3 +91,25 @@ export async function getRemunerationEntries( `remuneration_entries?bcid=eq.${encodeURIComponent(bcid)}&fiscal_year_end=eq.${year}&order=entry_index.asc`, ); } + +/** + * Get all remuneration entries for a specific band across all years. + */ +export async function getRemunerationEntriesByBand( + bcid: string, +): Promise { + return supabaseFetch( + `remuneration_entries?bcid=eq.${encodeURIComponent(bcid)}&order=fiscal_year_end.desc,entry_index.asc`, + ); +} + +/** + * Get remuneration summary rows for a specific band across all years. + */ +export async function getBandRemunerationSummaryByBcid( + bcid: string, +): Promise { + return supabaseFetch( + `band_remuneration_summary?bcid=eq.${encodeURIComponent(bcid)}&order=fiscal_year_end.desc`, + ); +} diff --git a/src/locales/en.po b/src/locales/en.po index ca5a2fbd..2cf29949 100644 --- a/src/locales/en.po +++ b/src/locales/en.po @@ -76,6 +76,17 @@ msgstr "{0} is a First Nation{1}." msgid "{0} of federal income tax" msgstr "{0} of federal income tax" +#. placeholder {0}: entries.length +#. placeholder {1}: availableYears.length +#: src/components/first-nations/RemunerationBreakdown.tsx:286 +msgid "{0} remuneration entries across {1} year(s)" +msgstr "{0} remuneration entries across {1} year(s)" + +#. placeholder {0}: firstNation.name +#: src/app/[lang]/(main)/first-nations/remuneration/[bcid]/page.tsx:133 +msgid "{0} Remuneration{provinceSuffix}" +msgstr "{0} Remuneration{provinceSuffix}" + #. placeholder {0}: jurisdiction.name #. placeholder {1}: jurisdiction.financialYear #: src/components/JurisdictionPageContent.tsx:357 @@ -337,6 +348,12 @@ msgstr "All of the information we use comes from publicly available databases an msgid "All program and operating spending recorded for the fiscal year." msgstr "All program and operating spending recorded for the fiscal year." +#. placeholder {0}: firstNation.name +#. placeholder {1}: summaries.length +#: src/app/[lang]/(main)/first-nations/remuneration/[bcid]/page.tsx:138 +msgid "All remuneration entries for {0} across {1} available fiscal year(s). Data is extracted from remuneration schedules published under the First Nations Financial Transparency Act (FNFTA)." +msgstr "All remuneration entries for {0} across {1} available fiscal year(s). Data is extracted from remuneration schedules published under the First Nations Financial Transparency Act (FNFTA)." + #: src/components/JurisdictionPageContent.tsx:163 msgid "All revenue collected during the fiscal year, including taxes, transfers, and other sources." msgstr "All revenue collected during the fiscal year, including taxes, transfers, and other sources." @@ -598,6 +615,7 @@ msgstr "Carbon Taxes" msgid "Cash, investments, accounts receivable, and other assets that can be converted to cash." msgstr "Cash, investments, accounts receivable, and other assets that can be converted to cash." +#: src/components/first-nations/RemunerationBreakdown.tsx:240 #: src/components/first-nations/RemunerationOverview.tsx:401 msgid "Chief" msgstr "Chief" @@ -667,6 +685,9 @@ msgstr "Compare remuneration data across First Nations. View total compensation, msgid "Compare your total tax burden across all Canadian provinces and territories" msgstr "Compare your total tax burden across all Canadian provinces and territories" +#: src/components/first-nations/RemunerationBreakdown.tsx:325 +#: src/components/first-nations/RemunerationBreakdown.tsx:398 +#: src/components/first-nations/RemunerationBreakdown.tsx:532 #: src/components/first-nations/RemunerationOverview.tsx:425 #: src/components/first-nations/RemunerationOverview.tsx:570 #: src/components/first-nations/RemunerationOverview.tsx:647 @@ -1064,6 +1085,9 @@ msgstr "Executing Agency/Partner" msgid "Expected Results" msgstr "Expected Results" +#: src/components/first-nations/RemunerationBreakdown.tsx:333 +#: src/components/first-nations/RemunerationBreakdown.tsx:410 +#: src/components/first-nations/RemunerationBreakdown.tsx:540 #: src/components/first-nations/RemunerationOverview.tsx:437 #: src/components/first-nations/RemunerationOverview.tsx:578 #: src/components/first-nations/RemunerationOverview.tsx:651 @@ -1363,6 +1387,8 @@ msgid "First Nation" msgstr "First Nation" #: src/app/[lang]/(main)/first-nations/[bcid]/page.tsx:59 +#: src/app/[lang]/(main)/first-nations/remuneration/[bcid]/page.tsx:117 +#: src/components/MainLayout/_components/DesktopNav.tsx:186 #: src/components/MainLayout/_components/DesktopNav.tsx:188 #: src/components/MainLayout/_components/MobileMenu.tsx:147 msgid "First Nations" @@ -2158,6 +2184,7 @@ msgstr "Ministry" msgid "Miscellaneous revenues" msgstr "Miscellaneous revenues" +#: src/components/first-nations/RemunerationBreakdown.tsx:434 #: src/components/first-nations/RemunerationOverview.tsx:655 #: src/components/first-nations/RemunerationOverview.tsx:803 #: src/components/first-nations/RemunerationTable.tsx:122 @@ -2188,6 +2215,7 @@ msgstr "Most federal spending can be categorized as direct or indirect. Direct s msgid "Municipal" msgstr "Municipal" +#: src/components/first-nations/RemunerationBreakdown.tsx:374 #: src/components/first-nations/RemunerationOverview.tsx:788 #: src/components/first-nations/RemunerationTable.tsx:114 msgid "Name" @@ -2299,6 +2327,10 @@ msgstr "No articles available yet on Canada Spends. Check back soon!" msgid "No content available." msgstr "No content available." +#: src/components/first-nations/RemunerationBreakdown.tsx:299 +msgid "No entries found matching your search." +msgstr "No entries found matching your search." + #. placeholder {0}: firstNation.name #: src/app/[lang]/(main)/first-nations/[bcid]/page.tsx:117 msgid "No financial data is currently available for {0}." @@ -2502,6 +2534,10 @@ msgstr "Official Fall 2025 Federal Budget Released" msgid "Official Languages + Culture" msgstr "Official Languages + Culture" +#: src/components/first-nations/RemunerationBreakdown.tsx:236 +msgid "officials" +msgstr "officials" + #: src/components/first-nations/RemunerationOverview.tsx:413 msgid "Officials" msgstr "Officials" @@ -2759,6 +2795,7 @@ msgstr "Pollution pricing" msgid "Pollution pricing proceeds" msgstr "Pollution pricing proceeds" +#: src/components/first-nations/RemunerationBreakdown.tsx:386 #: src/components/first-nations/RemunerationOverview.tsx:791 #: src/components/first-nations/RemunerationTable.tsx:107 msgid "Position" @@ -3005,6 +3042,7 @@ msgstr "Recipient Class" msgid "Regions" msgstr "Regions" +#: src/app/[lang]/(main)/first-nations/remuneration/[bcid]/page.tsx:129 #: src/components/first-nations/RemunerationTable.tsx:233 #: src/components/MainLayout/_components/DesktopNav.tsx:210 #: src/components/MainLayout/_components/MobileMenu.tsx:166 @@ -3173,6 +3211,12 @@ msgstr "Show individual entries" msgid "Show more ({0} remaining)" msgstr "Show more ({0} remaining)" +#. placeholder {0}: filtered.length +#. placeholder {1}: entries.length +#: src/components/first-nations/RemunerationBreakdown.tsx:282 +msgid "Showing {0} of {1} entries" +msgstr "Showing {0} of {1} entries" + #. placeholder {0}: filteredFirstNations.length #. placeholder {1}: firstNations.length #: src/components/first-nations/FirstNationsSearch.tsx:217 @@ -3215,6 +3259,7 @@ msgstr "Social Security" msgid "Social Transfer to Provinces" msgstr "Social Transfer to Provinces" +#: src/components/first-nations/RemunerationBreakdown.tsx:445 #: src/components/first-nations/RemunerationOverview.tsx:460 #: src/components/JurisdictionPageContent.tsx:385 msgid "Source" @@ -3625,6 +3670,10 @@ msgstr "Tools" #: src/app/[lang]/(main)/tax-visualizer/page.tsx:398 #: src/app/[lang]/(main)/tax-visualizer/page.tsx:509 #: src/components/first-nations/ClaimsTable.tsx:300 +#: src/components/first-nations/RemunerationBreakdown.tsx:341 +#: src/components/first-nations/RemunerationBreakdown.tsx:422 +#: src/components/first-nations/RemunerationBreakdown.tsx:502 +#: src/components/first-nations/RemunerationBreakdown.tsx:548 #: src/components/first-nations/RemunerationOverview.tsx:800 #: src/components/first-nations/RemunerationTable.tsx:139 #: src/components/first-nations/RemunerationTable.tsx:208 @@ -3741,6 +3790,10 @@ msgstr "Total Tax" msgid "Total Wages" msgstr "Total Wages" +#: src/components/first-nations/RemunerationBreakdown.tsx:527 +msgid "Totals" +msgstr "Totals" + #: src/components/Sankey/index.tsx:692 msgid "Trade and Investment" msgstr "Trade and Investment" @@ -3885,6 +3938,11 @@ msgstr "Veterans Affairs Canada | Canada Spends" msgid "View {year} financial statements for {0}{provinceSuffix}. Includes statement of operations, financial position, and remuneration data from the First Nations Financial Transparency Act annual report." msgstr "View {year} financial statements for {0}{provinceSuffix}. Includes statement of operations, financial position, and remuneration data from the First Nations Financial Transparency Act annual report." +#. placeholder {0}: firstNation.name +#: src/app/[lang]/(main)/first-nations/remuneration/[bcid]/page.tsx:63 +msgid "View all remuneration data for {0}{provinceSuffix} across all available years. Includes compensation and expenses for elected officials and staff from annual reports published under the FNFTA." +msgstr "View all remuneration data for {0}{provinceSuffix} across all available years. Includes compensation and expenses for elected officials and staff from annual reports published under the FNFTA." + #: src/app/[lang]/(main)/tax-visualizer/page.tsx:744 #: src/components/TaxBreakdownAccordion.tsx:100 msgid "View detailed tax breakdown" @@ -4155,6 +4213,7 @@ msgid "Why Submit a Tip?" msgstr "Why Submit a Tip?" #: src/app/[lang]/(main)/federal/spending/SalaryDistributionChart.tsx:80 +#: src/components/first-nations/RemunerationBreakdown.tsx:362 #: src/components/first-nations/RemunerationOverview.tsx:365 msgid "Year" msgstr "Year" diff --git a/src/locales/fr.po b/src/locales/fr.po index 3911c8c8..07b51c6b 100644 --- a/src/locales/fr.po +++ b/src/locales/fr.po @@ -76,6 +76,17 @@ msgstr "{0} est une Première Nation{1}." msgid "{0} of federal income tax" msgstr "{0} de l'impôt fédéral sur le revenu" +#. placeholder {0}: entries.length +#. placeholder {1}: availableYears.length +#: src/components/first-nations/RemunerationBreakdown.tsx:286 +msgid "{0} remuneration entries across {1} year(s)" +msgstr "" + +#. placeholder {0}: firstNation.name +#: src/app/[lang]/(main)/first-nations/remuneration/[bcid]/page.tsx:133 +msgid "{0} Remuneration{provinceSuffix}" +msgstr "" + #. placeholder {0}: jurisdiction.name #. placeholder {1}: jurisdiction.financialYear #: src/components/JurisdictionPageContent.tsx:357 @@ -337,6 +348,12 @@ msgstr "Toutes les informations que nous utilisons proviennent des bases de donn msgid "All program and operating spending recorded for the fiscal year." msgstr "Toutes les dépenses de programmes et d'exploitation enregistrées pour l'exercice financier." +#. placeholder {0}: firstNation.name +#. placeholder {1}: summaries.length +#: src/app/[lang]/(main)/first-nations/remuneration/[bcid]/page.tsx:138 +msgid "All remuneration entries for {0} across {1} available fiscal year(s). Data is extracted from remuneration schedules published under the First Nations Financial Transparency Act (FNFTA)." +msgstr "" + #: src/components/JurisdictionPageContent.tsx:163 msgid "All revenue collected during the fiscal year, including taxes, transfers, and other sources." msgstr "Tous les revenus collectés pendant l'exercice financier, y compris les impôts, les transferts et d'autres sources." @@ -598,6 +615,7 @@ msgstr "Taxes sur le carbone" msgid "Cash, investments, accounts receivable, and other assets that can be converted to cash." msgstr "Encaisse, placements, comptes débiteurs et autres actifs pouvant être convertis en espèces." +#: src/components/first-nations/RemunerationBreakdown.tsx:240 #: src/components/first-nations/RemunerationOverview.tsx:401 msgid "Chief" msgstr "Chef" @@ -667,6 +685,9 @@ msgstr "Comparez les données de rémunération des Premières Nations. Consulte msgid "Compare your total tax burden across all Canadian provinces and territories" msgstr "Comparez votre fardeau fiscal total dans toutes les provinces et territoires canadiens" +#: src/components/first-nations/RemunerationBreakdown.tsx:325 +#: src/components/first-nations/RemunerationBreakdown.tsx:398 +#: src/components/first-nations/RemunerationBreakdown.tsx:532 #: src/components/first-nations/RemunerationOverview.tsx:425 #: src/components/first-nations/RemunerationOverview.tsx:570 #: src/components/first-nations/RemunerationOverview.tsx:647 @@ -1064,6 +1085,9 @@ msgstr "Agence/Partenaire d'exécution" msgid "Expected Results" msgstr "Résultats attendus" +#: src/components/first-nations/RemunerationBreakdown.tsx:333 +#: src/components/first-nations/RemunerationBreakdown.tsx:410 +#: src/components/first-nations/RemunerationBreakdown.tsx:540 #: src/components/first-nations/RemunerationOverview.tsx:437 #: src/components/first-nations/RemunerationOverview.tsx:578 #: src/components/first-nations/RemunerationOverview.tsx:651 @@ -1363,6 +1387,8 @@ msgid "First Nation" msgstr "Première Nation" #: src/app/[lang]/(main)/first-nations/[bcid]/page.tsx:59 +#: src/app/[lang]/(main)/first-nations/remuneration/[bcid]/page.tsx:117 +#: src/components/MainLayout/_components/DesktopNav.tsx:186 #: src/components/MainLayout/_components/DesktopNav.tsx:188 #: src/components/MainLayout/_components/MobileMenu.tsx:147 msgid "First Nations" @@ -2158,6 +2184,7 @@ msgstr "Ministère" msgid "Miscellaneous revenues" msgstr "Revenus divers" +#: src/components/first-nations/RemunerationBreakdown.tsx:434 #: src/components/first-nations/RemunerationOverview.tsx:655 #: src/components/first-nations/RemunerationOverview.tsx:803 #: src/components/first-nations/RemunerationTable.tsx:122 @@ -2188,6 +2215,7 @@ msgstr "La plupart des dépenses fédérales peuvent être classées comme direc msgid "Municipal" msgstr "Municipal" +#: src/components/first-nations/RemunerationBreakdown.tsx:374 #: src/components/first-nations/RemunerationOverview.tsx:788 #: src/components/first-nations/RemunerationTable.tsx:114 msgid "Name" @@ -2299,6 +2327,10 @@ msgstr "Aucun article disponible pour le moment sur Canada Spends. Revenez bient msgid "No content available." msgstr "Aucun contenu disponible." +#: src/components/first-nations/RemunerationBreakdown.tsx:299 +msgid "No entries found matching your search." +msgstr "" + #. placeholder {0}: firstNation.name #: src/app/[lang]/(main)/first-nations/[bcid]/page.tsx:117 msgid "No financial data is currently available for {0}." @@ -2502,6 +2534,10 @@ msgstr "Publication du budget fédéral officiel de l'automne 2025" msgid "Official Languages + Culture" msgstr "Langues officielles + Culture" +#: src/components/first-nations/RemunerationBreakdown.tsx:236 +msgid "officials" +msgstr "" + #: src/components/first-nations/RemunerationOverview.tsx:413 msgid "Officials" msgstr "Représentants" @@ -2759,6 +2795,7 @@ msgstr "Tarification de la pollution" msgid "Pollution pricing proceeds" msgstr "Produits de la tarification de la pollution" +#: src/components/first-nations/RemunerationBreakdown.tsx:386 #: src/components/first-nations/RemunerationOverview.tsx:791 #: src/components/first-nations/RemunerationTable.tsx:107 msgid "Position" @@ -3005,6 +3042,7 @@ msgstr "Classe de bénéficiaire" msgid "Regions" msgstr "Régions" +#: src/app/[lang]/(main)/first-nations/remuneration/[bcid]/page.tsx:129 #: src/components/first-nations/RemunerationTable.tsx:233 #: src/components/MainLayout/_components/DesktopNav.tsx:210 #: src/components/MainLayout/_components/MobileMenu.tsx:166 @@ -3173,6 +3211,12 @@ msgstr "Afficher les entrées individuelles" msgid "Show more ({0} remaining)" msgstr "Afficher plus ({0} restants)" +#. placeholder {0}: filtered.length +#. placeholder {1}: entries.length +#: src/components/first-nations/RemunerationBreakdown.tsx:282 +msgid "Showing {0} of {1} entries" +msgstr "" + #. placeholder {0}: filteredFirstNations.length #. placeholder {1}: firstNations.length #: src/components/first-nations/FirstNationsSearch.tsx:217 @@ -3215,6 +3259,7 @@ msgstr "Sécurité sociale" msgid "Social Transfer to Provinces" msgstr "Transfert social aux provinces" +#: src/components/first-nations/RemunerationBreakdown.tsx:445 #: src/components/first-nations/RemunerationOverview.tsx:460 #: src/components/JurisdictionPageContent.tsx:385 msgid "Source" @@ -3625,6 +3670,10 @@ msgstr "Outils" #: src/app/[lang]/(main)/tax-visualizer/page.tsx:398 #: src/app/[lang]/(main)/tax-visualizer/page.tsx:509 #: src/components/first-nations/ClaimsTable.tsx:300 +#: src/components/first-nations/RemunerationBreakdown.tsx:341 +#: src/components/first-nations/RemunerationBreakdown.tsx:422 +#: src/components/first-nations/RemunerationBreakdown.tsx:502 +#: src/components/first-nations/RemunerationBreakdown.tsx:548 #: src/components/first-nations/RemunerationOverview.tsx:800 #: src/components/first-nations/RemunerationTable.tsx:139 #: src/components/first-nations/RemunerationTable.tsx:208 @@ -3741,6 +3790,10 @@ msgstr "Impôt total" msgid "Total Wages" msgstr "Salaires totaux" +#: src/components/first-nations/RemunerationBreakdown.tsx:527 +msgid "Totals" +msgstr "" + #: src/components/Sankey/index.tsx:692 msgid "Trade and Investment" msgstr "Commerce et investissement" @@ -3885,6 +3938,11 @@ msgstr "Anciens Combattants Canada | Canada Dépense" msgid "View {year} financial statements for {0}{provinceSuffix}. Includes statement of operations, financial position, and remuneration data from the First Nations Financial Transparency Act annual report." msgstr "Consultez les états financiers {year} pour {0}{provinceSuffix}. Comprend l'état des résultats, la situation financière et les données de rémunération du rapport annuel de la Loi sur la transparence financière des Premières Nations." +#. placeholder {0}: firstNation.name +#: src/app/[lang]/(main)/first-nations/remuneration/[bcid]/page.tsx:63 +msgid "View all remuneration data for {0}{provinceSuffix} across all available years. Includes compensation and expenses for elected officials and staff from annual reports published under the FNFTA." +msgstr "" + #: src/app/[lang]/(main)/tax-visualizer/page.tsx:744 #: src/components/TaxBreakdownAccordion.tsx:100 msgid "View detailed tax breakdown" @@ -4155,6 +4213,7 @@ msgid "Why Submit a Tip?" msgstr "Pourquoi soumettre une information?" #: src/app/[lang]/(main)/federal/spending/SalaryDistributionChart.tsx:80 +#: src/components/first-nations/RemunerationBreakdown.tsx:362 #: src/components/first-nations/RemunerationOverview.tsx:365 msgid "Year" msgstr "Année"