CLAUDE.md still listed GetAverageCostAsync/GetLastPurchasePriceAsync, which
Task 1 of the vendor-data removal already deleted. Also stop tracking the
Playwright MCP browser session logs left behind by Task 10's smoke test.
Ten-task plan ordered so the build stays green at each step: strip
consumers first (StockItemService/DTOs/Controller, Stock/Edit.razor,
Suppliers/Orders pages, Jobs/Edit.razor, CatalogService), delete the
now-unused services, then remove the entities and migrate the schema
last. Closes with CutList.Mcp cleanup and a manual smoke test.
Scopes out Supplier, SupplierOffering, PurchaseItem, and cost tracking
as out-of-scope for a 1D nesting optimizer, while fixing the actual
reported bug (read-only stock length field) and keeping a stripped
quantity-only transaction log.
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>
Point API client at the deployed service port and clear logging
providers to prevent interference with MCP stdio transport.
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>
Add HTTP client methods for job CRUD, parts, stock, packing, and
cutting tool endpoints. Includes response DTOs for all job-related
API responses.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Document new Job entity fields, serialization DTOs, JobService
optimization methods, and merged Results tab in Edit page.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
PowerShell script to publish CutList.Web, register as a Windows
Service with auto-restart on failure, and optionally open firewall.
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>
Precompute suffix sums of remaining item volumes and use them
to prune branches that cannot beat the current best solution.
Raises DefaultMaxItems from 20 to 25 (~84ms worst case).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Comprehensive rewrite covering all three projects, entity definitions,
service APIs, page routes, shared components, and key patterns including
purchase flow and job locking conventions.
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>