fix: Batch selection logic
This commit is contained in:
parent
c5e0838890
commit
8f32ac0edd
@ -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",
|
||||
|
@ -55,13 +55,19 @@ class PickList(Document):
|
||||
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 @@ def get_item_locations_based_on_serial_nos(item_doc):
|
||||
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 @@ def get_item_locations_based_on_batch_nos(item_doc):
|
||||
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 @@ def get_item_locations_based_on_batch_nos(item_doc):
|
||||
|
||||
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 @@ def create_delivery_note(source_name, target_doc=None):
|
||||
|
||||
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 @@ def update_stock_entry_based_on_work_order(pick_list, stock_entry):
|
||||
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 @@ def update_stock_entry_based_on_material_request(pick_list, stock_entry):
|
||||
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
|
||||
|
Loading…
Reference in New Issue
Block a user