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
@@ -386,7 +386,7 @@
</div>
</div>
<!-- Notes -->
<!-- Notes & Status -->
<div class="mb-4">
<h5 class="border-bottom pb-2 mb-3">
<i class="bi bi-journal-text me-2 text-primary"></i>Notes
@@ -397,6 +397,17 @@
<textarea asp-for="Notes" class="form-control" rows="3"></textarea>
<span asp-validation-for="Notes" class="text-danger"></span>
</div>
<div class="col-12">
<div class="form-check">
<input asp-for="IsIncoming" class="form-check-input" id="IsIncoming" />
<label class="form-check-label fw-semibold" for="IsIncoming">
<i class="bi bi-truck me-1 text-warning"></i>Incoming / On Order
</label>
</div>
<small class="text-muted d-block mt-1">
Check this when the powder has been ordered but not yet received. It will appear with an "Incoming" badge in the inventory list and can be selected on quotes so staff can print QR codes while the powder is in transit. Pricing will charge for the full ordered quantity.
</small>
</div>
</div>
</div>
@@ -398,6 +398,17 @@
<textarea asp-for="Notes" class="form-control" rows="3"></textarea>
<span asp-validation-for="Notes" class="text-danger"></span>
</div>
<div class="col-12">
<div class="form-check">
<input asp-for="IsIncoming" class="form-check-input" id="IsIncoming" />
<label class="form-check-label fw-semibold" for="IsIncoming">
<i class="bi bi-truck me-1 text-warning"></i>Incoming / On Order
</label>
</div>
<small class="text-muted d-block mt-1">
Uncheck once the powder has been received to mark it as regular in-stock inventory.
</small>
</div>
</div>
</div>
@@ -275,7 +275,13 @@
<span class="fw-semibold">@((item.QuantityOnHand * item.UnitCost).ToString("C"))</span>
</td>
<td>
@if (item.IsActive)
@if (item.IsIncoming)
{
<span class="badge bg-warning bg-opacity-25 text-warning-emphasis">
<i class="bi bi-truck me-1"></i>Incoming
</span>
}
else if (item.IsActive)
{
<span class="badge bg-success bg-opacity-10 text-success">
<i class="bi bi-check-circle me-1"></i>Active