svsavgrgw/mssa-finance-dashboard-money-matters-simplified
add the data from this excel TOTAL ACCOUNTS (UOM+MMU) DATE SUBGROUP DESCRIPTION AMOUNT FROM / TO WHOM RECEIVED? TOTAL MSSA BANK ACCOUNT STATEMENT MSSA Life Drawing WOAH Photography CAG EDI Debate Union Nexus Zine (M+) iDesign CPG ASG MSAFC MMA BASKETBALL
Build a single-page “MSSA Finance Dashboard” that reads my Excel (.xlsx) wide ledger from Sheet1 with these headers: TOTAL ACCOUNTS (UOM+MMU) | DATE | SUBGROUP | DESCRIPTION | AMOUNT | FROM / TO WHOM | RECEIVED? | TOTAL MSSA BANK ACCOUNT STATEMENT | MSSA | Life Drawing | WOAH | Photography | CAG | EDI | Debate Union | Nexus | Zine (M+) | iDesign | CPG | ASG | MSAFC | MMA | BASKETBALL. Parse UK dates and GBP amounts (supports “£”, commas, negatives). Treat the row 17/09/2025, Group balance brought forward as the opening snapshot (balances per subgroup + total £4,199.52) and subsequent rows as transactions (e.g., Zine (M+), Rubber bands, -£35.83, Prajesa Urip, yes) that update running balances; if snapshot columns are present on those rows, use them to validate the computed running totals and flag mismatches. Convert to two tidy arrays: balances_tidy = {Subgroup, BalanceGBP, AsOfDate} using the latest snapshot (starting from 17 Sep 2025 opening, then applying transactions), and ledger_tidy = {Date, Subgroup, Description, AmountGBP, Counterparty, Received}. Implement hash-routed tabs so it works when published: #overview, #subgroups, #ledger, #reports, #governance; JS router shows/hides [data-section] on load and hashchange, defaults to #overview, toggles .active. Overview: KPI cards (Total Balance, # Subgroups with non-zero, Top Subgroup + amount, Median Balance), a sortable horizontal bar chart “Balance by Subgroup” from balances_tidy (latest AsOfDate), a donut “% Allocation”, and a small line chart “Total Over Time” from cumulative ledger. Subgroups: search + responsive cards; each card shows subgroup name, current balance (GBP, en-GB), last updated date, and a “View details” button opening a modal with (a) mini time-series for that subgroup, (b) last 5 transactions from ledger_tidy, and (c) copy/export button (CSV). Ledger: a full transactions table (searchable, sortable, paginated) with quick filters (Subgroup dropdown, Date range, Amount sign (in/out), Received (yes/no), Counterparty contains …); totals row shows sum of filtered amounts and warns if “computed total” ≠ “TOTAL MSSA BANK ACCOUNT STATEMENT” on the last row. Import/Export: “Upload Data” button (SheetJS) that accepts the exact wide format above; after load, rebuild both tidy tables, KPIs, charts, and sections; “Download CSV” for (1) balances_tidy and (2) ledger_tidy; show “Last refresh” time. Design: keep a sleek investment-platform look inspired by the referenced UI—subtle ink/navy gradient hero, glassy cards (20–24px radius, soft shadow), clean grid, serif display for headings + Inter/Roboto for body, micro-interactions on hover/focus, accessible focus rings; palette: deep navy/ink backgrounds, off-white surfaces, restrained blue accents. Tech: one self-contained HTML file (pure HTML/CSS/JS), Chart.js for charts, SheetJS for Excel parsing, all client-side; format currency as GBP (Intl en-GB) and dates as DD MMM YYYY; provide friendly inline errors for missing headers/invalid amounts and ignore completely blank rows. Seed with my actual two sample rows: opening snapshot on 17 Sep 2025 with totals £4,199.52 and per-subgroup balances MSSA £2,561.05; Life Drawing £312.12; WOAH £296.72; Photography −£10.00; CAG £16.95; EDI £22.00; Debate Union £0.00; Nexus £0.00; Zine (M+) £312.78; iDesign £0.00; CPG £0.00; ASG £0.00; MSAFC £69.55; MMA £241.27; BASKETBALL £377.08, then a transaction row for Zine (M+) “Rubber bands” −£35.83 from Prajesa Urip, Received = yes, updating Zine (M+) to £276.95 and the total to £4,163.69.
initial commit
