Add IsIncoming inventory flag and catalog-to-incoming powder flow in item wizard

- InventoryItem.IsIncoming: marks powder ordered but not yet received; enables QR code
  printing on work orders while the shipment is in transit
- InventoryController.CreateIncomingFromCatalog: POST endpoint creates a 0-balance inventory
  record from a PowderCatalogItem and returns it in wizard-compatible shape
- item-wizard.js: custom coat tab now searches the platform powder catalog as a fallback;
  catalog results show an 'Add as Incoming Order' option; createIncomingFromCatalog POSTs
  to server and selects the new item without a page refresh
- QuoteItemCoatDto: CatalogItemId + AddAsIncoming fields so the wizard can signal server-side
  incoming-item creation during quote save
- Inventory Create/Edit/Index views: IsIncoming badge and field
- IInventoryAiLookupService: minor interface update
- Migration: AddInventoryIsIncoming

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-05-08 20:47:19 -04:00
parent f40d58ac2e
commit fc35fd123c
10 changed files with 10038 additions and 22 deletions
@@ -43,6 +43,7 @@ public class InventoryItemDto
public string? Location { get; set; }
public string? Notes { get; set; }
public bool IsActive { get; set; }
public bool IsIncoming { get; set; }
public DateTime? DiscontinuedDate { get; set; }
public DateTime CreatedAt { get; set; }
public bool IsLowStock { get; set; }
@@ -74,6 +75,7 @@ public class InventoryListDto
public int? PrimaryVendorId { get; set; }
public string? PrimaryVendorName { get; set; }
public bool IsActive { get; set; }
public bool IsIncoming { get; set; }
public bool IsLowStock { get; set; }
public bool IsOutOfStock { get; set; }
public bool HasSamplePanel { get; set; }
@@ -217,6 +219,9 @@ public class CreateInventoryItemDto
[Display(Name = "Sample Panel on Wall")]
public bool HasSamplePanel { get; set; }
[Display(Name = "Incoming / On Order")]
public bool IsIncoming { get; set; }
}
public class UpdateInventoryItemDto : CreateInventoryItemDto
@@ -47,8 +47,10 @@ public interface IInventoryAiLookupService
/// <summary>
/// Fetch cure specs, color families, finish, and clear-coat data from a known product URL.
/// Skips the Serper search step; used after a catalog hit to augment catalog fields.
/// When <paramref name="tdsFallbackUrl"/> is supplied and cure specs are still null after
/// the main fetch, the TDS page is tried automatically before returning.
/// </summary>
Task<InventoryAiLookupResult> LookupByUrlAsync(string url, string? colorName);
Task<InventoryAiLookupResult> LookupByUrlAsync(string url, string? colorName, string? tdsFallbackUrl = null);
/// <summary>
/// Read a powder label photo and extract manufacturer, color name, SKU, and cure specs