Files
acmcc/src/pages/FinancialReportsPage.tsx
T
admin e302fb91f0 Accounting platform: remove Zoho, unify reports, board access, vendor sharing
- Remove the Zoho Books integration (edge functions, sync libs, settings,
  reports/overview, banking links, fees tab, import dialog); preserve fee
  rules as a standalone FeesTab and the COA accounting_system classification.
- Financial Overview/Reports (staff + board) render the Accounting dashboard
  and reports; board reports mirror the rich Accounting Reports.
- New Reserve Fund Schedule report + an is_reserve flag on accounts.
- Unify all report exports to a branded format (logo + centered header +
  footer): shared ReportSheet (on-screen) and reportHeader (PDF). Budget vs
  Actuals and Bank Reconciliation PDFs now match the reference layout.
- Render financial reports inline (no preview pop-up).
- Budget Management mirrors Accounting Budgeting (staff-accessible) with SPA
  navigation; editable bills in the Accounting Bills page.
- Negative opening balances flow through to the GL and reports (allow negative
  input; keep non-zero on save; signed CSV import).
- Upload a per-account trial balance via CSV on Opening Balances.
- Board members: read-only RLS access to their association's accounting ledger;
  editable board-members panel on the association page; share vendor contacts
  with the board (toggle + directory section).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-02 18:29:31 -04:00

53 lines
2.0 KiB
TypeScript

import { useMemo } from "react";
import { Building2 } from "lucide-react";
import { useAssociation } from "@/contexts/AssociationContext";
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select";
import AccountingReportsPage from "@/pages/accounting/AccountingReportsPage";
/**
* Financial Reports now renders the same reporting suite used inside the
* Accounting module, scoped to a single association. Staff pick the association
* from the selector below (synced with the global association picker); board
* members are routed through their own scoped wrapper.
*/
export default function FinancialReportsPage() {
const { associations, selectedAssociation, setSelectedAssociation, loadingAssociations } =
useAssociation() as {
associations: { id: string; name: string }[];
selectedAssociation: { id: string; name: string } | null;
setSelectedAssociation: (a: { id: string; name: string } | null) => void;
loadingAssociations: boolean;
};
const sorted = useMemo(
() => [...(associations ?? [])].sort((a, b) => a.name.localeCompare(b.name)),
[associations],
);
return (
<div className="space-y-4">
<div className="flex items-center justify-end">
<Select
value={selectedAssociation?.id ?? ""}
onValueChange={(id) => {
const next = sorted.find((a) => a.id === id) ?? null;
setSelectedAssociation(next);
}}
>
<SelectTrigger className="w-[240px]">
<Building2 className="h-4 w-4 mr-2 text-muted-foreground" />
<SelectValue placeholder={loadingAssociations ? "Loading…" : "Select association"} />
</SelectTrigger>
<SelectContent>
{sorted.map((a) => (
<SelectItem key={a.id} value={a.id}>{a.name}</SelectItem>
))}
</SelectContent>
</Select>
</div>
<AccountingReportsPage association={selectedAssociation} />
</div>
);
}