woodshop/tests
rob 30bfb3a9e0 Add project estimate: consumables, labor, and suggested selling price
The Cost tab now produces a full quote, not just material cost.

- estimate.py: project_estimate() = materials (incl HST) + consumables
  (screws per butt joint, glue per M&T connection / dado / rabbet, finish
  $/sq ft of finished surface) + labor (editable minutes per operation —
  setup, cut, butt joint, assembly, sanding, and per-feature tenon/mortise/
  hole/slot/dado/rabbet/chamfer — × counts from the scene/plan, × shop rate).
- Selling price = MARGIN on total cost: price = total_cost / (1 - margin),
  labor counted as cost. A target price overrides margin and back-solves the
  implied margin. EstimateRates persisted to estimate.json.
- Cost tab: live margin % spinbox + target $ field, "Edit rates…"
  (RatesEditDialog), existing "Edit prices…" / "Refresh from Kent…", Print.
- All counts are deterministic (count_ops off scene.joints / connections /
  features / finishes); nothing guessed.
- tests: op counts, screws/glue, labor scaling, margin formula, target
  back-solve, div-zero guard, rates roundtrip, format, and GUI cost-tab +
  margin/target controls. 163 passing.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-05-30 16:40:15 -03:00
..
test_bom_window.py Add project estimate: consumables, labor, and suggested selling price 2026-05-30 16:40:15 -03:00
test_cutlist.py Add plywood (sheet stock) 2026-05-30 12:33:49 -03:00
test_cutplan.py Fix lock-aware plywood reopt + honest Best-of-100 when locked 2026-05-30 15:46:39 -03:00
test_driver.py Carry conversation history so "yes" / "do that" resolve 2026-05-30 15:42:33 -03:00
test_estimate.py Add project estimate: consumables, labor, and suggested selling price 2026-05-30 16:40:15 -03:00
test_geometry.py Add auto-assembly (Make connection) + feature rotation 2026-05-29 17:15:51 -03:00
test_gui_controller.py Carry conversation history so "yes" / "do that" resolve 2026-05-30 15:42:33 -03:00
test_instructions.py Phase 2: structured build instructions (deterministic + optional AI polish) 2026-05-30 14:36:50 -03:00
test_jigs.py Address shop-packet review (consistency, determinism, validation, jigs) 2026-05-30 15:11:02 -03:00
test_layout.py BOM window: tabs + cut-layout nesting + print (phase 1 of shop output) 2026-05-30 13:07:49 -03:00
test_prices.py Add cost estimate (Cost tab) with editable Kent NB price book 2026-05-30 16:23:59 -03:00
test_scene.py Add plywood (sheet stock) 2026-05-30 12:33:49 -03:00