diff --git a/FUTURE.md b/FUTURE.md index 22c4f7d..ea79361 100644 --- a/FUTURE.md +++ b/FUTURE.md @@ -31,53 +31,6 @@ Items are grouped under their priority section heading (`## 🔴 CRITICAL`, `## ## Pending Recommendations -### 🔴 Import XLSX Dual-Column Layout Not Parsed — CRITICAL -**Priority:** CRITICAL -**Added:** 2026-05-11 by Ripley - -**Description:** -The real-world spreadsheet (`backups/monthly bills.xlsx`) uses a **dual-column layout** — each monthly sheet is split into two halves representing two payment periods: -- **Left half (columns A-E):** Bills due around the **1st** of the month -- **Right half (columns G-K):** Bills due around the **15th** of the month - -Each half has its own `Due Date | Bill | Amount | Paid Date | Date Cleared` headers. The current parser only detects headers in the first row and processes columns linearly, so it captures the 1st-of-month bills but completely misses all 15th-of-month bills (roughly half the data). - -Example from Apr 2026 sheet: -``` -Left (1st): auto | Roadrunner ATV | $225.64 | paid 2026-03-01 (due ~1st) -Right (15th): | Amazon chase card | $366 | paid 2026-04-20 (due ~15th) -``` - -**Rationale:** -- This is the actual production spreadsheet the app needs to import -- ~100 monthly sheets spanning 2017–2026, each with two payment periods -- The 15th-of-month bills (credit cards, loans, subscriptions) are completely lost during import -- Without dual-column support, the import feature is broken for real data -- The "1st vs 15th" split is semantically meaningful — it maps to `due_day` in the bill model - -**Additional Issues in This Spreadsheet:** -- Rows 1–2 contain paycheck/leftover summary data, not bills — parser must skip these -- Non-numeric amount values: "double pay", blank amounts, "past due" — need graceful handling -- Due date column contains non-date values: "auto" (autopay indicator), "24th" (day-of-month shorthand), account numbers like "9522104" -- Some sheets have slight column layout variations (extra column, merged cells) -- Sheet names have typos: "Januaru 2021", "Novevmber 2019", "Febuary 2023" — parser already handles these -- 3 non-month sheets ("2018 taxes", "debt totoals", "home ownership expenses") should be skipped — already handled by `NON_MONTH_SHEET_RE` -- "auto" in the Due Date column is an autopay flag, not a date — should be detected as a label, not parsed as a date - -**Implementation Notes:** -- Modify `spreadsheetImportService.js` to detect dual-column headers in a single sheet row -- When two sets of bill headers are found (A-E and G-K), process each half independently -- Left half rows should default `due_day` to ~1, right half rows should default `due_day` to ~15 -- Each half produces its own set of rows with the same sheet name/month context -- Handle non-numeric amount cells gracefully (null amount, "double pay" as a note/label) -- "auto" in Due Date column → set `autopay` label/detected label, don't try to parse as date -- "24th" in Due Date column → parse as day-of-month (24) -- Skip rows where the bill name cell is blank AND the amount cell is blank or non-numeric -- Filter out paycheck/summary rows (Row 1: Paycheck amounts, Row 2: Left Over calculations) -- The `backups/monthly bills.xlsx` file is in `backups/` (gitignored) for testing -- Files to modify: `services/spreadsheetImportService.js`, possibly `routes/import.js` -- Estimated effort: 4-6 hours - ### 🔴 No Confirmation Before Destructive Actions — CRITICAL **Priority:** CRITICAL **Added:** 2026-05-11 by Ripley diff --git a/HISTORY.md b/HISTORY.md index ca66bc7..5171e02 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -1,5 +1,19 @@ # Bill Tracker — Changelog +## v0.26.0 + +### Added +- **Dual-column XLSX import** — Spreadsheets with two side-by-side bill tables (bills due ~1st and ~15th) are now both imported. Left half defaults `due_day` to 1, right half defaults to 15. +- **Header row scanning** — Parser scans rows 0–4 for bill headers instead of assuming row 0, correctly skipping paycheck/summary rows. +- **Day pattern parsing** — Due date values like "1st", "15th", "24th" are now parsed as day-of-month numbers. +- **Non-numeric amount labels** — "auto", "double pay", "past due" in amount cells become detected labels instead of causing parse errors. + +### Changed +- **Cell type validation** — Allow `'s'` (shared formula) cell type in XLSX parsing, fixing import failures on some spreadsheet formats. + +### Security +- **Audit by Private_Hudson** — Bounds validation in `isBlankRowForHeaderSet`, anchored regex for day patterns, label sanitization verified. All checks PASS. + ## v0.25.0 ### Added