fix: Batch selection logic
diff --git a/erpnext/stock/doctype/pick_list/pick_list.json b/erpnext/stock/doctype/pick_list/pick_list.json
index c7aa458..b52e189 100644
--- a/erpnext/stock/doctype/pick_list/pick_list.json
+++ b/erpnext/stock/doctype/pick_list/pick_list.json
@@ -77,7 +77,7 @@
"options": "Pick List Item"
},
{
- "depends_on": "work_order",
+ "depends_on": "eval:doc.purpose==='Material Transfer for Manufacture'",
"description": "Qty of raw materials will be decided based on the qty of the Finished Goods Item",
"fieldname": "for_qty",
"fieldtype": "Float",
@@ -115,7 +115,7 @@
}
],
"is_submittable": 1,
- "modified": "2019-08-26 16:11:03.184637",
+ "modified": "2019-08-27 21:24:50.609986",
"modified_by": "Administrator",
"module": "Stock",
"name": "Pick List",
diff --git a/erpnext/stock/doctype/pick_list/pick_list.py b/erpnext/stock/doctype/pick_list/pick_list.py
index c765343..11a9985 100644
--- a/erpnext/stock/doctype/pick_list/pick_list.py
+++ b/erpnext/stock/doctype/pick_list/pick_list.py
@@ -55,13 +55,19 @@
def get_items_with_warehouse_and_quantity(item_doc, from_warehouses, item_location_map):
available_locations = item_location_map.get(item_doc.item_code)
locations = []
+ skip_warehouse = None
+
+ if item_doc.material_request:
+ skip_warehouse = frappe.get_value('Material Request Item', item_doc.material_request_item, 'warehouse')
+
remaining_stock_qty = item_doc.stock_qty
while remaining_stock_qty > 0 and available_locations:
item_location = available_locations.pop(0)
+
stock_qty = remaining_stock_qty if item_location.qty >= remaining_stock_qty else item_location.qty
qty = stock_qty / (item_doc.conversion_factor or 1)
- uom_must_be_whole_number = frappe.db.get_value("UOM", item_doc.uom, "must_be_whole_number")
+ uom_must_be_whole_number = frappe.db.get_value('UOM', item_doc.uom, 'must_be_whole_number')
if uom_must_be_whole_number:
qty = floor(qty)
stock_qty = qty * item_doc.conversion_factor
@@ -131,7 +137,7 @@
return locations
def get_item_locations_based_on_batch_nos(item_doc):
- batch_qty = frappe.db.sql("""
+ batch_locations = frappe.db.sql("""
SELECT
sle.`warehouse`,
sle.`batch_no`,
@@ -141,27 +147,30 @@
WHERE
sle.batch_no = batch.name
and sle.`item_code`=%(item_code)s
- and IFNULL(batch.expiry_date, '2200-01-01') > %(today)s
+ and IFNULL(batch.`expiry_date`, '2200-01-01') > %(today)s
GROUP BY
`warehouse`,
`batch_no`,
`item_code`
HAVING `qty` > 0
- ORDER BY IFNULL(batch.expiry_date, '2200-01-01')
+ ORDER BY IFNULL(batch.`expiry_date`, '2200-01-01'), batch.`creation`
""", {
'item_code': item_doc.item_code,
'today': today()
}, as_dict=1)
locations = []
- required_qty = item_doc.qty
- for d in batch_qty:
- if d.qty > required_qty:
- d.qty = required_qty
- else:
- required_qty -= d.qty
+ required_qty = item_doc.stock_qty
- locations.append(d)
+ for batch_location in batch_locations:
+ if batch_location.qty >= required_qty:
+ # this batch should fulfill the required items
+ batch_location.qty = required_qty
+ required_qty = 0
+ else:
+ required_qty -= batch_location.qty
+
+ locations.append(batch_location)
if required_qty <= 0:
break
@@ -171,7 +180,6 @@
return locations
-
@frappe.whitelist()
def create_delivery_note(source_name, target_doc=None):
pick_list = frappe.get_doc('Pick List', source_name)
@@ -199,7 +207,9 @@
if dn_item:
dn_item.warehouse = location.warehouse
- dn_item.qty = location.qty
+ dn_item.qty = location.picked_qty
+ dn_item.batch_no = location.batch_no
+ dn_item.serial_no = location.serial_no
update_delivery_note_item(sales_order_item, dn_item, delivery_note)
@@ -355,8 +365,8 @@
item.item_code = location.item_code
item.s_warehouse = location.warehouse
item.t_warehouse = wip_warehouse
- item.qty = location.qty
- item.transfer_qty = location.stock_qty
+ item.qty = location.picked_qty * location.conversion_factor
+ item.transfer_qty = location.picked_qty
item.uom = location.uom
item.conversion_factor = location.conversion_factor
item.stock_uom = location.stock_uom
@@ -375,8 +385,8 @@
item.item_code = location.item_code
item.s_warehouse = location.warehouse
item.t_warehouse = target_warehouse
- item.qty = location.qty
- item.transfer_qty = location.stock_qty
+ item.qty = location.picked_qty * location.conversion_factor
+ item.transfer_qty = location.picked_qty
item.uom = location.uom
item.conversion_factor = location.conversion_factor
item.stock_uom = location.stock_uom