This release introduces the ability to cancel in-progress picks with proper inventory handling, enables Picker Mode for Order-by-Order picklists, and adds bulk actions to the picklists page.
Cancel Picking
- New "Cancel Picking" button on the pick page when items have been picked but the order is not fully complete
- Dedicated cancel page showing all picked items with quantities and original locations
- Picker scans a drop-off location where picked items will be placed
- On confirmation: picked items are moved to the drop-off location, committed quantity is re-committed, and a putaway task is created to return items to their original locations
- Order is released back to
awaiting_shipmentfor another picker to pick later - SweetAlert2 confirmation before executing cancellation
- Per-product activity logging for inventory restoration
- Mobile-optimized layout with compact info button
Order-by-Order Picklists in Picker Mode
- "Start Picking" button on the picklist open page enters Picker Mode for Order-by-Order picklists
- Per-order "Start Picking" and "Continue" buttons link directly to scan-bin in Picker Mode
- After completing an order, the system auto-advances to the next pending order in the same picklist
- Context-aware return: redirects back to the picklist page or picker dashboard depending on where the user started
- Picker dashboard now detects active Order-by-Order picklists alongside Picker Mode picklists
Picklist Bulk Actions
- New bulk action bar appears when picklists are selected on the picklists index page
- Print Packing Slips: generates combined PDF and opens native print dialog via PrintJS (no page navigation)
- Cancel Picklists: releases all orders back to the queue (only for picklists where all orders are pending)
- Packing slip print tracking records who printed and when
- Removed unsafe bulk delete button to prevent broken order states
Orders Page Filters
- Added Product Name and UPC fields to the Advanced Filters on the orders page
- Users can now search orders containing a specific product by name, SKU, or UPC
Activity Log Improvements
- "Committed Qty Released" activity logs now include OrderNumber with clickable links across all code paths (OrderProcessingService, FulfillmentController, QualityControlController, InventoryDeductionService)
- Recent Activity dashboard renders HTML links for OrderNumber and Product fields instead of showing escaped HTML
- Activity log labels no longer truncated (removed 15-character limit on field names)
Fulfillment Webhook Fix
- Fixed potential double-deduction of on_hand and double-release of committed_qty for partially-picked orders
- Removed overly aggressive
every()check that skipped deduction for fully-picked orders even when QC hadn't run quantity_pickedis no longer overwritten by webhook — preserves actual picker data
QC Bypass Fix
- "Bypass Selected" now packs the picked quantity instead of the ordered quantity
- Uses
quantity_pickedwhen available, falls back to ordered quantity for orders that skipped picking - Clearer variable names:
$qtyToPack,$alreadyPacked,$qtyToPackNow
Bug Fixes
- Fixed Cancel Picking inventory math: no longer double-counts picked quantity restoration
- Fixed
packing_slipstable insert missing requiredpo_idfield - Fixed
putawaystablesource_typeenum missingpicking_cancelvalue - Fixed
putawaystablesource_idforeign key constraint when creating picking cancel putaways