mirror of
https://github.com/renee-png/acmcc.git
synced 2026-06-21 09:50:01 +00:00
e302fb91f0
- 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>
50 lines
2.0 KiB
TypeScript
50 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 AccountingBudgetsPage from "@/pages/accounting/AccountingBudgetsPage";
|
|
|
|
/**
|
|
* Budget Management mirrors the Accounting → Budgeting experience, available to
|
|
* dashboard staff outside the admin-only Accounting area. The association
|
|
* selector drives the global selection that AccountingBudgetsPage scopes to;
|
|
* opening a budget routes to /dashboard/budget-management/:id (full editor).
|
|
*/
|
|
export default function BudgetManagementPage() {
|
|
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) => setSelectedAssociation(sorted.find((a) => a.id === id) ?? null)}
|
|
>
|
|
<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>
|
|
|
|
<AccountingBudgetsPage basePath="/dashboard/budget-management" />
|
|
</div>
|
|
);
|
|
}
|