feat: TRS Quote Tool — local-first desktop quote app (MVP) #1

Merged
owlburtoe merged 1 commit from feat/trs-quote-tool into main 2026-07-03 20:19:05 -04:00
Owner

Summary

  • Tauri 2 desktop app (trs-quote-tool/): React + Vite + TypeScript strict frontend, Rust command layer, bundled SQLite with versioned migrations
  • Excel pricebook import via calamine, tested against the real 03-TRS Write Up Tool.xlsx (260+ parts; Call/CAll/blank prices become call_vendor/unavailable, never zero)
  • Quote builder: pricebook search, manual lines, manual price override + reason, freight/tax, status workflow, duplicate
  • Customer-facing PDF (jsPDF): sale pricing only — whitelisted DTO + runtime guard + tests block any cost|margin|override|internal field leak; PDFs stored immutably as Quote-{number}-{customer}-{date}-v{n}.pdf
  • Money is integer cents end to end; margin math divide-by-zero safe
  • Prepare-email flow (mailto draft + reveal PDF, recorded), manual backup/restore (VACUUM INTO + PDF copy), full audit log
  • Customers, pricebook versions, audit log, settings pages

Test plan

  • cargo test — 7 pass (money parsing, migrations, real-workbook import)
  • npm test — 12 pass (calculations, DTO leak guard)
  • tsc --noEmit strict + cargo check clean
  • Manual E2E on macOS: new quote → line item → totals/margin → PDF generated, opened, verified no cost/list price present
  • Windows build (npm run tauri build on a Windows machine)
## Summary - Tauri 2 desktop app (`trs-quote-tool/`): React + Vite + TypeScript strict frontend, Rust command layer, bundled SQLite with versioned migrations - Excel pricebook import via calamine, tested against the real `03-TRS Write Up Tool.xlsx` (260+ parts; `Call`/`CAll`/blank prices become `call_vendor`/`unavailable`, never zero) - Quote builder: pricebook search, manual lines, manual price override + reason, freight/tax, status workflow, duplicate - Customer-facing PDF (jsPDF): sale pricing only — whitelisted DTO + runtime guard + tests block any `cost|margin|override|internal` field leak; PDFs stored immutably as `Quote-{number}-{customer}-{date}-v{n}.pdf` - Money is integer cents end to end; margin math divide-by-zero safe - Prepare-email flow (mailto draft + reveal PDF, recorded), manual backup/restore (VACUUM INTO + PDF copy), full audit log - Customers, pricebook versions, audit log, settings pages ## Test plan - [x] `cargo test` — 7 pass (money parsing, migrations, real-workbook import) - [x] `npm test` — 12 pass (calculations, DTO leak guard) - [x] `tsc --noEmit` strict + `cargo check` clean - [x] Manual E2E on macOS: new quote → line item → totals/margin → PDF generated, opened, verified no cost/list price present - [ ] Windows build (`npm run tauri build` on a Windows machine)
Tauri 2 + React/Vite/TS + Rust + SQLite MVP replacing the Excel write-up
workflow: versioned pricebook import (calamine), customer/quote CRUD,
integer-cent calculations, customer-facing PDF generation (jsPDF) with
cost/margin leak guards, immutable versioned PDF storage, mailto email
prep, backup/restore, audit log. Rust + vitest test suites included.
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
owlburtoe/TRS!1
No description provided.