Bulk Stock Count
Bulk Stock Count lets you scan or paste a whole batch of barcodes/SKUs at once — from a USB barcode scanner, an RFID reader acting as a keyboard, or a plain paste — and instantly compares the scanned counts against system stock, highlighting matches, discrepancies, missing items and unknown SKUs, with a one-click fix for any mismatch.
Overview
The core input is a single large text box: paste or scan barcodes/SKUs one per line (each scan from a barcode gun or RFID reader that emulates a keyboard adds a new line automatically), and the page counts duplicate lines as multiple units of the same SKU.
Clicking Compare with System Stock pulls up to 2,000 products and matches every scanned SKU against system stock, classifying each SKU as Match (scanned quantity equals system stock), Discrepancy (scanned but count differs from system), Missing from scan (in the system but not scanned at all), or Not in System (scanned but no matching SKU exists in Products).
Results are shown as four summary tiles (Matched, Discrepancies, Missing, Not in System) plus a full results table sorted with the most actionable rows first — Discrepancy, then Missing, then Not in System, then Match last.
A Fix N Discrepancies button updates system stock to match the scanned count for every row flagged as a discrepancy, in one confirmed action; an Export CSV button downloads the full results table (SKU, Product, System Stock, Scanned Qty, Variance, Status) for offline record-keeping.
Before You Start
- No plan-tier restriction beyond the route's "inventory" feature gate.
- A barcode scanner or RFID reader is not strictly required — any list of SKUs, one per line, pasted into the text box works identically to a live scan.
- Matching relies entirely on the product's SKU field being populated and identical to what is printed/encoded on the physical barcode or tag — products without a SKU cannot be matched.
Step-by-Step Guide
1 Run a bulk stock count
- Scan every item in a section with a USB barcode scanner or RFID reader — each scan appears as its own line in the Scanned Barcodes / SKUs box — or paste a prepared list of SKUs, one per line.
- Check the live "Lines" and "Unique SKUs" counters under the text box to confirm the paste/scan looks right before comparing.
- Click Compare with System Stock — the page fetches your product list and cross-matches every scanned line against it.
2 Review and act on the results
- Check the four summary tiles — Matched, Discrepancies, Missing, Not in System — for a quick read on how clean the count was.
- Scroll the results table (sorted with Discrepancies first) to see per-SKU System Stock, Scanned Qty, Variance (colour-coded green for over-count, red for under-count) and a status label.
- Click Fix N Discrepancies to update system stock to the scanned quantity for every Discrepancy row in one action (a confirmation prompt shows how many corrections will be applied) — the count is then automatically re-run so the table reflects the corrected state.
- Click Export CSV at any point to download the full comparison table for your records.
3 Start a new count
- Click Clear to empty the scan box and discard the current results before starting a fresh count on a different section.
Every Field & Button, Explained
| Field / Button | What it does |
|---|---|
Scanned Barcodes / SKUs box | One barcode/SKU per line; duplicate lines are tallied as multiple units of that SKU. Accepts direct scanner/RFID input or a pasted list. |
Lines / Unique SKUs counter | Live count of total lines entered and how many distinct SKUs that represents. |
Clear | Empties the scan box and clears any existing comparison results. |
Compare with System Stock | Fetches up to 2,000 products and matches every scanned SKU against system stock quantities. |
Matched / Discrepancies / Missing / Not in System tiles | Live counts of each classification from the most recent comparison. |
Fix N Discrepancies | Only shown when at least one Discrepancy exists; after confirmation, updates each discrepant product's stock to the scanned quantity, then re-runs the comparison. |
Export CSV | Downloads the full results table (SKU, Product, System Stock, Scanned Qty, Variance, Status) as a CSV file named with today's date. |
Results table — Variance column | Scanned Qty minus System Stock; positive (green) means more were scanned than the system expected, negative (red) means fewer. |
Results table — Status column | Match (✓), Discrepancy (⚠), Missing from scan (⬜, in system but not scanned), Not in system (?, scanned SKU has no matching product). |
Tips & Best Practices
- Do one physical section or rack at a time and clear between sections — mixing sections in one paste makes it harder to physically locate where a discrepancy actually is.
- Investigate "Not in System" rows before assuming they are a scanning error — they usually mean a SKU was mistyped, relabelled, or belongs to a product that was deleted from Products.
- Export the CSV before clicking Fix Discrepancies if you want an audit trail of what stock looked like immediately before the correction was applied.
Troubleshooting & FAQ
A product I definitely scanned shows as "Not in System".
"Fix Discrepancies" only updates some rows.
The count seems to include items I didn't mean to scan twice.
Comparing fails outright.
🧑💻 Developer Notes
Source component(s):
frontend-app/pos-app-garment/src/pages/garment/RFIDStockCountPage.jsx
Backend endpoints used:
GET /productsPUT /products/:id
Related tables (db-core repositories):
Product
Redux slices:
None — local component state only
Feature flag key: inventory
This is a garment-exclusive sidebar entry point, but it has no garment-specific backend at all: despite the component name RFIDStockCountPage and the "RFID" framing in its help text, it never calls any RFID/hardware API, and it does not call the generic /stock-counts routes mounted in backend/src/server.js (used by the shared StockCountPage feature on other variants) either. It is a fully self-contained, client-side reconciliation tool built on two plain endpoints: GET /products (capped at limit 2000) to read current stock, and PUT /products/:id with only a stock field to apply corrections one product at a time in a for-loop (no bulk-update endpoint). There is no persisted stock-count "session" or audit record on the backend — once you navigate away, the count and its results are gone unless you exported the CSV first. The CSV export function does not escape embedded double-quotes in product names, only wraps each field in quotes, so a product name containing a double-quote character would produce a slightly malformed CSV cell.