Goods receiving

A React block (a whole screen) in Beamline's Inventory app.

Goods received against purchase orders and invoices. Cards grouped by purchase order or invoice, each line once whichever way (a line keeps both sources, the other ones named on the card); exact search on a whole PO number, invoice number or product, nothing exact said. A card shows what's received against what was ordered, sizes not counted yet, and its issues; each size's received count is typed in (not counted stays empty, never 0) with its state in words (all in, short by, over by); counts are a draft until Save counts, a save someone else beat keeps the entries until Reload, a failure keeps them. Issues per size: flagged and resolved counts per kind (damaged, misprinted, wrong item, short in the box), resolved never above flagged, what's still open announced, the received count untouched; read only without permission, a failed save said. Notes: the receiving note (edited, or read only) apart from each purchase order's note under its own heading, an empty PO note said; a note changed meanwhile keeps your text under theirs; closing returns focus to the card. Mark received in bulk: the scope (every card not fully received, or one card) previewed with how many sizes, lines and units change before anything happens; Cancel changes nothing; progress while it runs; lines the host couldn't mark listed with why; a scope that changed since the preview is refused and previewed again.

Use it for

  • Counting in goods by size against purchase orders and invoices, with damaged or wrong items flagged apart from the counts.
  • A shop or warehouse marking deliveries received in bulk after seeing exactly what changes.

Not for

Anatomy

  • toolbar: group by purchase order or invoice, exact search, Mark received
  • card: source and vendor, also on, progress and counts, issues summary, Notes; lines with sizes (size, ordered, received typed without steppers, state, issues on attention until something is flagged); unsaved count, Save counts
  • issues: kinds with flagged and resolved, what's still open, Done
  • notes: the receiving note, each PO's note under its heading
  • bulk: scope, the preview of what changes, Mark received; progress; the result

States

  • card: partial, uncounted, all in, short, over, unsaved, saving, saved, conflict, failed
  • issues: none, open, partly resolved, all resolved, resolved over flagged, read only, save failed
  • notes: empty, receiving note only, several POs, editing, conflict, read only
  • bulk: preview, nothing to change, running, complete, partial failure, stale scope
  • search: no exact match

Keyboard

  • Every count is a labelled number field naming the size and product; each size's issues open from a labelled button
  • The bulk dialog opens with Cancel focused; the notes dialog returns focus to its card

Motion

Progress fills while a bulk mark runs. Nothing runs at rest.

Props

PropTypeDefaultDescription
lines (required)ReceiptLine[]—
poNotesPurchaseOrderNote[]—
receivingNotesRecord<string, string>—Receiving notes by card ("po:PO-1042", "invoice:INV-88").
canEditNotesboolean—
canEditIssuesboolean—
onSaveCounts((card: string, deltas: ReceiptDelta[]) => Promise<unknown>)—Saves one card's counts; reject with ReceiptConflict when someone saved it first.
onSaveIssues((lineId: string, size: string, issues: Issue[]) => Promise<unknown>)—
onSaveNote((card: string, body: string) => Promise<unknown>)—Saves a receiving note; reject with NoteConflict when it changed meanwhile.
onReloadLines(() => ReceiptLine[])—The lines as saved now, after a conflict.
onBulk((lineIds: string[], onProgress: (done: number) => void) => Promise<BulkResult>)—Marks lines received; report progress, resolve with any it couldn't, reject with StaleScope if they changed.
defaultGroupByGroupBy—
defaultQuerystring—
localestring—
classNamestring—Classes on the documented visual root; no override by default.
styleCSSProperties—Inline styles on the documented visual root; no overrides by default.
refRef<HTMLDivElement>—Receives the documented native target or imperative handle; omitted by default.

Built from

Dependencies

lucide-react

Import

import { GoodsReceiving } from "@beamline/goods-receiving";

Get it

Goods receiving is part of Beamline UI. Install the parts you need in your React app as compiled packages or editable source. Get Beamline · Connect your agent

More in Inventory

  • Stock count: A shelf counted. Count: the products on it with counted units, not counted (an empty field that changes nothing) kept apart from a counted zero, expected…
  • Inventory counts: Recurring stock counts from plan to shelf: a phone-first count of one occurrence where an untouched part reads not counted and a zero reads counted, none…
  • Purchase order desk: Purchase orders for stock from draft to closed. The list of orders with status (ready for review on warning, approved, ordered and partly received on…
  • Restock desk: Restocking from suppliers' own shops. Items low on stock (below the minimum on danger, at it on warning, unknown said) beside the chosen item with how…
  • Stock alerts: Alerts on stock counts and expiry dates. Counts of alerts gone off (danger) and close (warning) in the header. A table: item and type, the rule in words…
  • Inventory finder: Find stock and act on what's found. A rail of filters: name or SKU; folders with or without their subfolders (folders the person can't see said as not…
  • Item setup: Setting items up for scanning and records. Barcodes: scanned codes waiting to be linked, each with its symbology, when and who; Look it up brings a…
  • Bulk item edit: Many items corrected at once. Pick a folder, with its subfolders or not (fixed once anything is edited), up to a limit said. The items in a grid: name…
  • Kit builder: A kit (bundle) made of standalone products, and how many its parts' stock can make. Sell as a kit; the parts in one kit with units per kit, removable…
  • Serial allocation: A receipt line's serial numbers. Serials generated from a first serial and how many (its digits counted up, padding kept; a first serial without digits…
  • Stock moves: Where stock went, and moving it. The ledger lists movements newest first: moves on info, stock added on success, stock taken out on warning; each with…
  • Scan station: A warehouse scanner, phone-first. Home: one scan field that also takes typing (and says so when the scanner isn't connected), each code named as what it…
  • Pack station: A packing bench. Scanner, scale and printer each said, on the warning tone when away. Find the shipment by scanning or typing its number (none found…
  • Shipment split: An order's lines split across shipments. A table of lines with what was ordered and a column per shipment (new ones marked); a line already shipped can't…
  • Route plan: A day's delivery routes in the service's zone. The day at a glance: routes, routes without a driver (warning), stops running late (danger), stops done…
  • Job materials: Materials sent out to jobs and pick lists. Jobs: the list (draft, active on info, completed on success) beside the chosen job with its site, dates (the…
  • Service tasks: A fleet shop's maintenance setup. Tasks: active and archived, searchable, main tasks and their subtasks told apart in words, archiving refused while…
  • Owner records: Who a customer is and what they own, at the front desk. New customer: name, phone and email checked as typed against existing customers; each likely…
  • Sample storage: Where physical items are kept (rooms, freezers, shelves, racks, boxes) and acting on several at once. The storage tree is browsed apart from moving: Move…
  • Sample ledger: Materials used in a record and the containers they came from, plus pooling. Subtracting a used amount writes a stock movement with its unit and the…

Part of Beamline UI: polished, editable React components and complete screens for custom applications. Build your own style from any look; tokens, fonts, radii, motion; not only colours.