fix: Select location based on group warehouse
diff --git a/erpnext/stock/doctype/pick_ticket/pick_ticket.js b/erpnext/stock/doctype/pick_ticket/pick_ticket.js
index a2d6cd7..87fad7f 100644
--- a/erpnext/stock/doctype/pick_ticket/pick_ticket.js
+++ b/erpnext/stock/doctype/pick_ticket/pick_ticket.js
@@ -2,6 +2,16 @@
// For license information, please see license.txt
frappe.ui.form.on('Pick Ticket', {
+ setup: (frm) => {
+ frm.set_query('group_warehouse', () => {
+ return {
+ filters: {
+ 'is_group': 1,
+ 'company': frm.doc.company
+ }
+ };
+ });
+ },
refresh: (frm) => {
this.frm.add_custom_button(__('Sales Order'), function() {
erpnext.utils.map_current_doc({
diff --git a/erpnext/stock/doctype/pick_ticket/pick_ticket.py b/erpnext/stock/doctype/pick_ticket/pick_ticket.py
index ce0e552..a1adf9f 100644
--- a/erpnext/stock/doctype/pick_ticket/pick_ticket.py
+++ b/erpnext/stock/doctype/pick_ticket/pick_ticket.py
@@ -9,10 +9,15 @@
class PickTicket(Document):
def set_item_locations(self):
reference_items = self.reference_document_items
+
+ from_warehouses = None
+ if self.group_warehouse:
+ from_warehouses = frappe.db.get_descendants('Warehouse', self.group_warehouse)
+
+ # Reset
self.delete_key('items')
for item in reference_items:
- data = get_items_with_warehouse_and_quantity(item)
-
+ data = get_items_with_warehouse_and_quantity(item, from_warehouses)
for item_info in data:
print(self.append('items', item_info))
@@ -22,22 +27,11 @@
elif frappe.get_cached_value('Item', item_doc.item, 'has_batch_no'):
set_batch_no(item_doc, self)
-def get_available_items(item):
- # gets all items available in different warehouses
- # FIFO
- available_items = frappe.get_all('Bin', filters={
- 'item_code': item,
- 'actual_qty': ['>', 0]
- }, fields=['warehouse', 'actual_qty as qty'], order_by='creation')
-
- return available_items
-
-def get_items_with_warehouse_and_quantity(item_doc):
+def get_items_with_warehouse_and_quantity(item_doc, from_warehouses):
items = []
- item_locations = get_available_items(item_doc.item)
+ item_locations = get_available_items(item_doc.item, from_warehouses)
remaining_qty = item_doc.qty
-
while remaining_qty > 0 and item_locations:
item_location = item_locations.pop(0)
qty = remaining_qty if item_location.qty >= remaining_qty else item_location.qty
@@ -51,11 +45,28 @@
remaining_qty -= qty
if remaining_qty:
- print('---------- {} qty of {} is out of stock. Skipping... -------------'.format(remaining_qty, item_doc.item))
+ frappe.msgprint('{} qty of {} is out of stock. Skipping...'.format(remaining_qty, item_doc.item))
return items
return items
+def get_available_items(item, from_warehouses):
+ # gets all items available in different warehouses
+ # FIFO
+ filters = frappe._dict({
+ 'item_code': item,
+ 'actual_qty': ['>', 0]
+ })
+ if from_warehouses:
+ filters.warehouse = ['in', from_warehouses]
+
+ available_items = frappe.get_all('Bin',
+ fields=['warehouse', 'actual_qty as qty'],
+ filters=filters,
+ order_by='creation')
+
+ return available_items
+
def set_serial_nos(item_doc):
serial_nos = frappe.get_all('Serial No', {
'item_code': item_doc.item,
@@ -91,7 +102,7 @@
batch = batches.pop()
batch_expiry = frappe.get_value('Batch', batch.batch_no, 'expiry_date')
if batch_expiry and batch_expiry <= frappe.utils.getdate():
- print('---------- Batch {} is expired. Skipping... -------------'.format(batch.batch_no))
+ frappe.msgprint('Skipping expired Batch {}'.format(batch.batch_no))
continue
item_doc.batch_no = batch.batch_no
if batch.qty >= item_doc.qty:
@@ -112,5 +123,5 @@
'reference_name': item_doc.reference_name
})
if required_qty:
- print('---------- No batches found for {} qty of {}. Skipping... -------------'.format(required_qty, item_doc.item))
+ frappe.msgprint('No batches found for {} qty of {}. Skipping...'.format(required_qty, item_doc.item))
parent_doc.remove(item_doc)