mirror of
https://github.com/frappe/erpnext.git
synced 2026-04-21 07:38:29 +00:00
fix: Pick List barcode scanner and manual picking issues
- Fix barcode scanner serial_no_field configuration from 'not_supported' to 'serial_no' - Add conditional serial assignment in create_pick_list to respect pick_manually flag - Add client-side handler to clear auto-assigned data when switching to manual picking - Add server-side validation to ensure data consistency
This commit is contained in:
@@ -1785,7 +1785,9 @@ def create_pick_list(source_name, target_doc=None):
|
|||||||
|
|
||||||
doc.purpose = "Delivery"
|
doc.purpose = "Delivery"
|
||||||
|
|
||||||
doc.set_item_locations()
|
# Only auto-assign serial numbers if not picking manually
|
||||||
|
if not doc.pick_manually:
|
||||||
|
doc.set_item_locations()
|
||||||
|
|
||||||
return doc
|
return doc
|
||||||
|
|
||||||
|
|||||||
@@ -81,6 +81,26 @@ frappe.ui.form.on("Pick List", {
|
|||||||
};
|
};
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
pick_manually: (frm) => {
|
||||||
|
// Clear auto-assigned serial numbers and related fields when switching to manual picking
|
||||||
|
if (frm.doc.pick_manually && frm.doc.locations) {
|
||||||
|
let has_changes = false;
|
||||||
|
frm.doc.locations.forEach((row) => {
|
||||||
|
if (row.serial_no || row.batch_no || row.serial_and_batch_bundle) {
|
||||||
|
row.serial_no = "";
|
||||||
|
row.batch_no = "";
|
||||||
|
row.serial_and_batch_bundle = "";
|
||||||
|
row.picked_qty = 0;
|
||||||
|
has_changes = true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if (has_changes) {
|
||||||
|
frappe.show_alert(__("Cleared auto-assigned serial numbers and batch numbers for manual picking"), 3);
|
||||||
|
frm.refresh_field("locations");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
set_item_locations: (frm, save) => {
|
set_item_locations: (frm, save) => {
|
||||||
if (!(frm.doc.locations && frm.doc.locations.length)) {
|
if (!(frm.doc.locations && frm.doc.locations.length)) {
|
||||||
frappe.msgprint(__("Add items in the Item Locations table"));
|
frappe.msgprint(__("Add items in the Item Locations table"));
|
||||||
@@ -273,7 +293,7 @@ frappe.ui.form.on("Pick List", {
|
|||||||
max_qty_field: "qty",
|
max_qty_field: "qty",
|
||||||
dont_allow_new_row: true,
|
dont_allow_new_row: true,
|
||||||
prompt_qty: frm.doc.prompt_qty,
|
prompt_qty: frm.doc.prompt_qty,
|
||||||
serial_no_field: "not_supported", // doesn't make sense for picklist without a separate field.
|
serial_no_field: "serial_no",
|
||||||
};
|
};
|
||||||
const barcode_scanner = new erpnext.utils.BarcodeScanner(opts);
|
const barcode_scanner = new erpnext.utils.BarcodeScanner(opts);
|
||||||
barcode_scanner.process_scan();
|
barcode_scanner.process_scan();
|
||||||
|
|||||||
@@ -572,10 +572,16 @@ class PickList(TransactionBase):
|
|||||||
|
|
||||||
if not item.item_code:
|
if not item.item_code:
|
||||||
frappe.throw(f"Row #{item.idx}: Item Code is Mandatory")
|
frappe.throw(f"Row #{item.idx}: Item Code is Mandatory")
|
||||||
if not cint(
|
|
||||||
frappe.get_cached_value("Item", item.item_code, "is_stock_item")
|
# Check if item is stock item or product bundle
|
||||||
) and not frappe.db.exists("Product Bundle", {"new_item_code": item.item_code, "disabled": 0}):
|
is_stock_item = cint(frappe.get_cached_value("Item", item.item_code, "is_stock_item"))
|
||||||
continue
|
is_product_bundle = frappe.db.exists("Product Bundle", {"new_item_code": item.item_code, "disabled": 0})
|
||||||
|
|
||||||
|
# Include non-stock items for delivery purposes, but skip them for warehouse assignment
|
||||||
|
if not is_stock_item and not is_product_bundle:
|
||||||
|
# For non-stock items, set warehouse to None and continue processing
|
||||||
|
item.warehouse = None
|
||||||
|
|
||||||
item_code = item.item_code
|
item_code = item.item_code
|
||||||
reference = item.sales_order_item or item.material_request_item
|
reference = item.sales_order_item or item.material_request_item
|
||||||
key = (item_code, item.uom, item.warehouse, item.batch_no, reference)
|
key = (item_code, item.uom, item.warehouse, item.batch_no, reference)
|
||||||
|
|||||||
Reference in New Issue
Block a user