diff --git a/TODO-Legacy.md b/TODO-Legacy.md new file mode 100644 index 0000000..97431d9 --- /dev/null +++ b/TODO-Legacy.md @@ -0,0 +1,189 @@ +## Legacy Porting TODOs + +Purpose: Track features and workflows from legacy Paradox (.SC) scripts to port into the modern app. Each item includes a clear example to guide implementation and testing. + +### Cross-cutting platform and data +- [ ] Data model: create relational tables and relations + - Example: Create tables `Rolodex`, `Phone`, `Files`, `Ledger`, `Deposits`, `Payments`, `Printers`, `Setup`, `Footers`, `FileStat`, `FileType`, `TrnsLkup`, `TrnsType`, `GrupLkup`, `PlanInfo`, `Pensions`, `Results`, `Output`, `Schedule`, `Separate`, `Death`, `Marriage`, `States`, `LifeTabl`, `NumberAl`. Foreign keys: `Phone.id -> Rolodex.id`, `Files.id -> Rolodex.id`, `Ledger.file_no -> Files.file_no`. + +- [ ] CSV import: one-time and repeatable import from legacy CSVs + - Example: Import `old-database/Office/FILES.csv` into `files` table; validate required fields and normalize dates; log row count and any rejects. + +- [ ] Answer table pattern for query results + - Example: After searching `Rolodex`, show a paginated results view with bulk actions (reports, document assembly, return to full dataset). + +- [ ] Field prompts/help (tooltips or side panel) + - Example: When focusing `Files.File_Type`, show: "F1 to select area of law" as inline help text. + +- [ ] Structured logging/audit trail + - Example: On `Ledger` create/update/delete, log user, action, record keys, and pre/post balance totals for the related file. + +- [ ] Reporting infrastructure (screen preview, PDF, CSV) + - Example: Provide a common reporting service to render a "Statements - Unbilled (Itemized)" report to PDF and preview in-browser. + +### Main navigation (legacy Main Menu) +- [ ] Dashboard linking modules + - Example: Home shows links to Rolodex, File Cabinet, Pensions, Plan Info, Deposits, Utilities, Printers/Customize, Tally Accounts. + +### Rolodex (names/addresses/phones) +- [ ] CRUD for `Rolodex` and child `Phone` entries + - Example: Add a phone number with `Location = Office` and format validation (e.g., `1-555-555-1234`). + +- [ ] Advanced search dialog joining `Phone` + - Example: Search by `Last = "Smith"` and `Phone contains "555-12"`; results include records linked by `Phone.Id -> Rolodex.Id`. + +- [ ] Reports: Envelope, Phone Book (2 variants), Rolodex Info + - Example: Generate "Phone Book - Address & Phone" PDF for current results set (min. 1 page output). + +- [ ] Document assembly hook from results + - Example: Select one or more contacts, choose a form, and produce a merged document with their address data. + +### File Cabinet (client files and billing) +- [ ] Master-detail UI for `Files` with `Ledger` detail + - Example: Selecting a file shows ledger entries inline; adding a ledger line updates file totals. + +- [ ] Ask/Search dialog over `Files` + - Example: Filter by `Status = SEND` and `Empl_Num = 101` and `Opened in 2024`; render answer-table results. + +- [ ] Close/Reopen account actions + - Example: Close account with `Amount_Owing = 250.00` auto-posts a `Ledger` payment entry (T_Code `PMT`, Billed `Y`) and sets `Files.Status = INACTIVE` and `Closed = today`. + +- [ ] Summarize Accounts view (billed/unbilled/total) + - Example: For a file, show three columns (Billed, Not Billed, Total) for Trust, Hours, Hourly Fees, Flat Fees, Disbursements, Credits, Balance Due, and Transferable. + +- [ ] Timekeeper ticker (optional v1) + - Example: Start timer; upon stop, prefill an hourly ledger `Quantity` from elapsed hours; allow edit before save. + +- [ ] Locate Record utility + - Example: Search by `Regarding contains "QDRO"` jumps to matching file in the master grid. + +- [ ] Reports from results (envelope, phone, file info, accounts, statements, credit/payment history) + - Example: From a filtered set, generate "Account Balances - Short" grouped by employee and file status. + +- [ ] Bulk mark billed and recompute + - Example: Mark all displayed unbilled `Ledger` entries as `Billed = Y`; recompute `Files` billed/unbilled totals. + +- [ ] SEND/HOLD status filtering semantics via `FileStat` + - Example: When selecting `Status = HOLD`, exclude from default statement print runs. + +### Ledger (file transactions) +- [ ] Validations and defaults + - Example: Require `Date`, `T_Code`, `Empl_Num`, `Amount`, `Billed`; if `T_Type = 2 (Hourly)`, default `Rate` from `Employee.Rate_Per_Hour` for the selected employee. + +- [ ] Auto-compute `Amount = Quantity * Rate` + - Example: Enter `Quantity = 2`, `Rate = 150.00` auto-sets `Amount = 300.00` when either field changes. + +- [ ] Unique posting for `Item_No` + - Example: On save, if `(File_No, Date, Item_No)` conflicts, increment `Item_No` until unique, then persist. + +- [ ] Recompute file totals (Tally_Ledger) on change + - Example: After delete of a credit, `Files.Amount_Owing` updates immediately and `Transferable` recalculates. + +- [ ] Quick toggles and date nudge + - Example: Keyboard toggle to set `Billed` Y/N; buttons to shift `Date` ±1 day. + +### Deposits / Payments +- [ ] Payments search (date range, File_No, Id, Regarding) + - Example: `From_Date=2025-01-01`, `To_Date=2025-03-31` shows all payments in Q1 2025 with optional filters for file or id. + +- [ ] Reports: Summary and Detailed payments + - Example: Generate a "Payments - Detailed" PDF grouped by deposit date. + +- [ ] Deposit `Total` = sum of linked payment amounts + - Example: On save of a deposit with three payments (50, 75, 25), set `Deposits.Total = 150.00`. + +### Plan Info +- [ ] CRUD for plan catalog + - Example: Add a plan with `Plan_Id = \"ABC-123\"`, `Plan_Type = DB`, and memo details; searchable in Pensions and QDRO. + +### Pensions (annuity evaluator) +- [ ] Life Expectancy Method (uses `LifeTabl`) + - Example: Given `Valu` (valuation date) and `Birth`, compute `Age`, `Start_Age`, `Payments = int(LE*12)`, `Mortality`, `PV`, `PV_AM`, `PV_AMT`, apply death benefit and marriage factor, then write results. + +- [ ] Actuarial Method (uses `NumberAl` monthly mortality) + - Example: Build monthly survival probabilities; apply COLA (capped by `Max_COLA`) annually after 12 months; discount pre/post; compute `TEP`, `PV_TEP`, `PV_TEP_NOW`, then marriage factor and results. + +- [ ] Save Results and Output + - Example: Copy computed result fields into `Results`; populate `Output` with human-readable fields (e.g., `Last's` possessive formatting) for document generation. + +- [ ] Ask for Output (document assembly) + - Example: Open current `Output` record for the selected pension and pass it to the Forms/assembly workflow. + +### Document assembly (Forms) +- [ ] Forms library management (list, descriptions, selection) + - Example: List files from a configured forms directory; show description from `Forms/Form_Lst` when a file is selected. + +- [ ] Save/Run merge configurations + - Example: Save selected forms set as a reusable config; run merge to produce DOCX/PDF via templating. + +- [ ] Forms search with index keywords + - Example: Search by `Status = Active` and keywords `["QDRO", "Envelope"]` to narrow the list. + +- [ ] Form List report + - Example: Print a report listing matching forms (name + memo/description). + +### Utilities / Setup / Printers +- [ ] CRUD for code tables (`FileType`, `Employee`, `TrnsType`, `TrnsLkup`, `Footers`, `GrupLkup`, `FileStat`, `States`, `PlanInfo`, `Printers`, `RVarLkup`, `FVarLkup`, `Inx_Lkup`) + - Example: Add `TrnsLkup` with `T_Code = PMT`, `T_Type = 5`, `T_Type_L = C`, `Description = Payment`. + +- [ ] Customize Setup (title and 10-line letterhead) + - Example: Update organization title and letterhead; persist in `Setup`; reflect in statement/report headers. + +- [ ] Printers / Output profiles + - Example: Define output profile (e.g., A4/PDF) that maps legacy "setup strings" to modern render options; set as default. + +- [ ] Tally Accounts (batch recompute) + - Example: Button runs recompute across all `Files` and shows confirmation of N updated. + +- [ ] Organize (archive rotation) + - Example: Move `Files` with `Status = ARCHIVE` and their `Ledger` entries to archive tables or mark `archived = true`. + +- [ ] Calendar maintenance (low priority) + - Example: Archive `Calndr`/`Apoint` entries older than 30 days into `*_x` tables (or mark archived). + +### Reporting (consolidated list) +- [ ] Implement reports used across modules + - Example: Provide templates/endpoints for: Payments (summary/detailed), Phone Book (2), Envelope, Rolodex Info, File Cabinet Info (detailed/short), Account Balances (detailed/short), Statements (all/unbilled/billed; total vs itemized), Credit/Payment History, Form List. + +### UX polish and accessibility +- [ ] Keyboard shortcuts for common actions + - Example: Map F2=Save, F8=Clear form, F9=Toggle edit, provide alternatives for accessibility. + +- [ ] Memo editor for long text fields + - Example: Open modal to edit `Files.Memo` with character count and autosave warning. + +### Data integrity and computations +- [ ] Rollups and derived fields on `Files` + - Example: Maintain `Hours`, `Hourly_Fees`, `Flat_Fees`, `Disbursements`, `Credit_Bal`, `Total_Charges`, `Amount_Owing`, `Transferable` in sync with `Ledger`. + +- [ ] Duplicate/uniqueness safeguards + - Example: Prevent duplicate `Pensions (File_No + Version)`; ensure `Ledger (File_No + Date + Item_No)` is unique; show friendly error. + +### Staging / Not included yet +- [ ] QDRO Screen and templates (scoped separately) + - Example: Define schema and UI for QDRO; integrate with Forms for drafting; out of this immediate milestone. + +- [ ] Timecard/Trust/Calendar (defer unless requested) + - Example: Keep placeholders; implement only if explicitly prioritized. + +### Decisions required (product/tech) +- [ ] Which reports are must-have for v1? + - Example: If only Statements and Phone Book are needed initially, defer other reports. + +- [ ] Output strategy: PDF-only vs printer integration + - Example: Prefer PDF preview + download; printer selection as future enhancement. + +- [ ] Document assembly target + - Example: Choose DOCX templating (Jinja-in-Docx) vs HTML-to-PDF for merge outputs. + +- [ ] Archival approach + - Example: Use `archived_at` flag and views instead of physical `*_x` tables. + +--- + +Notes +- Keep implementations modular with explicit config via environment variables. +- Add structured debug logging around imports, computes, and reports. +- Ensure Docker images and compose are updated if new dependencies are added. + +