# Release Notes — 2026-04-06 ## QuickBooks Desktop Migration Wizard — Import Quality & UX ### Bug Fixes **Customer Payments Import (607 skipped → 614 imported)** - Invoice import (Step 6) no longer creates Payment records. AmountPaid and Status are set correctly from the balance detail file, but Payment record creation is deferred to Step 7 so that customer payment history includes richer data (check numbers, bank account names, exact payment dates). - Step 7 now correctly creates payment records for pre-settled invoices without duplicating them. **Vendor Bills Import — App Crash** - Eliminated 1,000+ mid-loop database round trips during the bills import. Bills and their line items are now saved in a single batch, preventing request timeouts on large imports. **QuickBooks Online — QB Desktop Parity** - Verified QB Online migration does not share the payment matching bugs fixed on the Desktop side. --- ### UX Improvements **Import Result Reporting** - "Skipped" badge changed from yellow (warning) to gray — skips are not failures. - Added "Already Recorded" badge (gray) for records that were intentionally not re-imported because they already exist. No longer shown as "Skipped." - Vendor Bills & Payments step now shows **"X Bills Imported / Y Payments Applied"** as the primary result instead of a confusing combined Total/Imported count where Imported > Total. **False-Alarm Warnings Eliminated** The following QB structural row types and report artifacts now silently pass through all importers without generating warnings: | Step | Previously Warned | Now | |---|---|---| | Chart of Accounts | NONPOSTING accounts (Estimates, Purchase Orders) | Silent | | Catalog Items | Non-service types (DISC, GRP, PMT, OTHC), group markers | Silent | | Inventory | Category/group headers, Total/TOTAL subtotal rows | Silent | | Vendor Bills | Bill Pmt -Check, Item Receipt, Credits, and all other non-Bill rows | Silent | | Vendor Payments | Item Receipt, Credits, zero-amount payment rows, and all other non-Bill Pmt rows | Silent | **General Rule Applied** Each importer now silently ignores any row type it doesn't own, rather than maintaining a whitelist. This prevents unexpected warnings when customers have QB files containing row types not seen during testing (Credits, Journal Entries, Purchase Orders, etc.). --- ### Seed Data - `SeedDataService` is now re-runnable — each seeder runs in its own try/catch with `ChangeTracker.Clear()` on failure, so one failing seeder no longer aborts the rest. - Added `SeedBillsAsync` (4 bills: Paid, PartiallyPaid, 2× Open) and `SeedExpensesAsync` (5 expenses) for demo company. --- ### Subscription Plan Limits - Plan limit checks moved from POST (after form submission) to GET (when the "New" button is clicked). Users are now redirected with a clear message before filling out a form they can't submit. - Applies to: Quotes, Jobs, Customers, Company Users, Catalog Items. - Job Details photo upload button is disabled with a tooltip when the photo limit is reached, showing current usage (e.g. "3 / 5 photos used"). --- ### PDF / Quote - Rush charge now appears as a line item in the Quote PDF between Discount and Tax, styled in orange to match the on-screen display.