Three small leftovers from Task 7 / the inventory-quantity-tracking
removal that a final review caught:
- Edit.razor's custom-stock quantity input still had min="1" even
though its own helper text says "Use -1 for unlimited", validation
already accepts -1, and the add-form defaults Quantity to -1 - so
the field rendered pre-populated with a value the browser's native
min validation flagged as invalid. Matches the min="-1" fix already
applied to the catalog-stock input in Task 7.
- optimize_job's MCP tool description still claimed the optimizer
falls back to "available inventory" when no stock is configured -
that auto-discovery fallback was removed in Task 3. An LLM reads
this description as ground truth, so stale wording here actively
misleads tool use. Also tightened add_job_stock's stockItemId/
isCustomLength wording, which still said "inventory" for what is
now just the stock catalog.
- CLAUDE.md's CutListPackingService summary said InStockBins comes
"from inventory", nudging future readers back toward the
auto-discovery mental model this plan removed.
Task 7 extended JobStock.Quantity = -1 (unlimited) to catalog-sourced
rows, but the post-pack classification step in CutListPackingService
only ever treated a catalog-sourced bin as "in stock" when its tracked
quantity was a positive finite number. An unlimited catalog row fell
through to "to be purchased" even though IsInStock=true just means the
bin is catalog-sourced, not a quantity check.
This made the classification effectively unreachable for the most
common path users take to stock a job: the "Import from Inventory"
modal defaults every candidate's quantity to -1, so every resulting
bin was mislabeled "to be purchased" on the Results tab, and the
"everything is available in stock" message could never appear for
jobs stocked that way.
Track unlimited catalog-sourced lengths in a separate set and check it
first; finite catalog quantities keep the existing decrementing-counter
behavior, and custom-length stock (any quantity) is unaffected.
Custom-length job stock already supported -1 (unlimited); catalog-
sourced stock only allowed >= 1. Closes that inconsistency per
docs/superpowers/specs/2026-08-01-remove-inventory-quantity-tracking-design.md.
Also updates the Results tab's unplaced-items message now that
insufficient configured quantity is a normal cause, not an edge case.
Final step of removing inventory quantity tracking - see
docs/superpowers/specs/2026-08-01-remove-inventory-quantity-tracking-design.md.
Destructive to any existing on-hand/transaction data; confirmed
acceptable since nothing read it automatically.
The fallback silently pulled from StockItem.QuantityOnHand and always
added an extra unlimited bin on top when a job had no stock configured
- i.e. it assumed unlimited purchasing. Per
docs/superpowers/specs/2026-08-01-remove-inventory-quantity-tracking-design.md,
a job's available stock must now be exactly what's explicitly entered.
No job workflow ever called these (receive/use/adjust/scrap/recalculate)
- inventory quantity tracking is being removed per
docs/superpowers/specs/2026-08-01-remove-inventory-quantity-tracking-design.md.
First step of removing inventory quantity tracking (see
docs/superpowers/specs/2026-08-01-remove-inventory-quantity-tracking-design.md).
UI no longer shows on-hand counts or offers transaction entry; the
underlying field/service methods are removed in follow-up commits.
Adds a Dockerfile and Gitea Actions workflow to build/push the
CutList.Web image to the registry on push to master, enabling
containerized deployment to forge. Also updates CLAUDE.md to reflect
the CutList.Mcp project, REST API surface, and CatalogService, and
tweaks the cut-length badge styling in the job editor.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Drop the Stock/Purchase source badge column from the results cut list
table (purchase list card remains). Bump cut length badges to fs-6 for
better readability.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Display raw inches in parentheses next to the architectural format
in both Parts and Stock tables for easier reference.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Wrap job editor initialization in try/catch to display errors instead of
crashing the circuit. Make LoadSavedResults async. Add a simple Error
page for the production exception handler.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace AddDbContext with AddDbContextFactory for Blazor Server circuit
safety — each service method now creates a short-lived DbContext via the
factory. Configure Windows Service hosting with ContentRootPath and
remove HSTS/HTTPS redirect for reverse-proxy deployment.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Update all project TFMs to net10.0, EF Core to 10.0.4, add
Microsoft.Extensions.Hosting.WindowsServices, and suppress WFO1000
warning for WinForms project.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace the single CatalogMaterialDto + CatalogDimensionsDto (bag of nullable
fields) with per-shape DTOs that have strongly-typed dimension properties.
Catalog JSON now groups materials by shape key instead of a flat array.
Delete the old SeedController/SeedDataDtos (superseded by CatalogService).
Scraper updated to emit the new grouped format, resume by default, and
save items incrementally.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Switch MaterialDimensions inheritance from TPH (single table with discriminator)
to TPC (table per concrete type) with individual tables per shape. Add Swagger
for dev API exploration, expand SeedController with export/import endpoints and
Alro catalog JSON dataset, and include Python scraper for Alro catalog PDFs.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Part form now supports adding multiple parts at once via a table with
add/remove row controls; edit mode stays single-row
- Shape and size dropdowns lock when editing an existing part
- Results tab replaces split in-stock/purchase cards with a unified table
per material showing source badges (Stock/Purchase) for each bar
- New Purchase List card summarizes materials to order with quantities
- Print styles use repeating thead headers per material for multi-page
cut lists; large cards can now break across pages
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace the standalone ExportData console app and hardcoded SeedController
with generic GET /api/catalog/export and POST /api/catalog/import endpoints.
Import uses upsert semantics with per-item error handling, preserving
existing inventory quantities.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Export tool queries all active materials, stock items, suppliers, and
offerings from the database and writes a clean JSON file for version
control. Includes 616 materials and 810 stock items with part numbers.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Move optimization results UI from separate Results.razor page into
the Edit.razor tabbed editor. Results are now loaded from saved JSON
on page load instead of re-running on every visit. Remove the
standalone optimize button from Jobs index.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add SavedOptimizationResult DTO layer with SerializeResult and
LoadSavedResult methods for JSON round-trip persistence, since
Core types use encapsulated collections that aren't serializable.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add OptimizationResultJson and OptimizedAt columns to Job table.
JobService now saves/clears optimization results and auto-clears
stale results when parts, stock, or cutting tool change.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add "Add to Order List" button on Results page that creates PurchaseItems
from optimization results and locks the job. Add Orders Index page with
tabbed view (Pending/Ordered/All), supplier assignment, status
transitions, and MaterialFilter. Add manual order item creation page.
Add Orders link to navigation menu.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Locked jobs show a warning banner with unlock button on the Edit page.
All form fields, part/stock add/edit/delete buttons are disabled via
fieldset when locked. Jobs Index shows a lock icon badge next to locked
job numbers.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add PurchaseItem entity with status tracking (Pending/Ordered/Received),
supplier and job relationships. Add LockedAt timestamp to Job entity for
controlling editability after materials are ordered. Includes
PurchaseItemService (CRUD + bulk create), JobService Lock/Unlock methods,
EF Core migrations, and DI registration.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The print CSS was hiding all .card elements, which contained the
actual results content. Replaced with compact print-friendly styles:
summary cards display as an inline row, redundant stock summary is
hidden, and spacing is tightened throughout.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Integrate MaterialFilter component for filtering by shape,
type, grade, and free-text search. Pagination now reflects
filtered results.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Use Bootstrap Icons for Edit, Delete, Copy, and Optimize actions
to reduce table column widths and improve visual consistency.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Integrate Pager component into Jobs, Materials, Stock, Suppliers,
and Tools index pages with a page size of 25. Handles page
adjustment on delete when the last page becomes empty.
Also removes the Description column from the Materials table.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Shared Blazor component with page windowing, ellipsis for large
page counts, and "Showing X-Y of Z" summary text.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Adds brief explanatory paragraphs to Jobs, Materials, and Stock index
pages to help users understand each section's purpose.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace default Bootstrap grays with warm off-whites and subtle borders.
Adds consistent styling for cards, forms, headings, and tables.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Allows importing multiple stock items from inventory at once, matching
against materials already in the job's parts list. Includes select
all/none, quantity, and priority controls.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Fix two data issues preventing material loading:
- Update MaterialDimensions DimensionType from class names (e.g.
'AngleDimensions') to configured short names (e.g. 'Angle')
- Set empty Material.Type values to 'Steel' and change column default
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add controllers for suppliers, stock items, jobs, cutting tools, and
packing. Refactor MaterialsController to use MaterialService with
dimension-aware CRUD, search, and bulk operations. Extract DTOs into
dedicated files.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Disable Shape dropdown on existing materials since changing shape would
require completely different dimension properties.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>