BohemianBuddha

case study

Shipment Verification Scanner

roleSole developer
stackC#, WinForms, Infor VISUAL ERP integration
statusIn daily use

Shipment Verification Scanner

Shipping a pack list used to depend on someone remembering every check by hand: has this already shipped, is the customer on credit hold, did the order change since the pack list was printed, does what's actually being scanned match what's on the order. Miss one, and the wrong thing goes out the door — or the right thing goes out against a hold nobody caught.

The problem

Verifying a shipment before it left the building meant cross-referencing several things that lived in different places: the pack list's own status, the customer's account standing, whether the order had been touched since printing, and — line by line — whether the quantity being pulled actually matched what was ordered, what was still open on a delivery schedule, and what was really available. Doing that by eye, under the pressure of getting trucks loaded, is exactly the kind of repetitive cross-check that's easy to skip once and costly to skip wrong.

The approach

A pack list number now gets checked automatically the moment it's entered — does it exist, has it already shipped, is its status clear, is the customer's account in good standing, has the order changed since the list printed — shown as a simple readout before a single item is scanned. From there it's a scan loop: each part scanned is checked live against its order line, its delivery schedule, and what's actually available, with mismatches, overshipments, cancelled lines, and early-shipment violations flagged inline as they happen.

Scanning the same part twice doesn't create a duplicate line — it merges into the existing one and marks it as consolidated, so the running total stays honest rather than silently doubling up:

// Scanning the same part/trace/order-line twice doesn't create a duplicate row —
// it merges into the existing one and flags the line as consolidated.
var existing = ScannedLines.FirstOrDefault(l =>
    l.PartId == scan.PartId && l.TraceId == scan.TraceId && l.OrderLine == scan.OrderLine);

if (existing != null)
{
    existing.Quantity += scan.Quantity;
    existing.IsConsolidated = true;

    if (existing.Quantity > scan.OrderedQuantity)
        existing.IsOvershipment = true;

    return;
}

Nothing reaches the ERP until the whole list has been reviewed and explicitly submitted, as one batch — so a shipment that's half-checked never becomes a shipment that's half-recorded.

The outcome

In daily use for outbound shipping. Every submission is also logged with a timestamped record and an exportable history, so a submitted pack list can be traced or resubmitted later without redoing the scan work.

← back to case studies