fix: Remove Pick List Reference Item use Item locations table instead
This commit is contained in:
parent
1cf7270049
commit
f455c92d02
@ -735,33 +735,22 @@ def create_pick_list(source_name, target_doc=None, for_qty=None):
|
|||||||
else:
|
else:
|
||||||
target.delete()
|
target.delete()
|
||||||
|
|
||||||
doc = get_mapped_doc("Work Order", source_name, {
|
doc = get_mapped_doc('Work Order', source_name, {
|
||||||
"Work Order": {
|
'Work Order': {
|
||||||
"doctype": "Pick List",
|
'doctype': 'Pick List',
|
||||||
"validation": {
|
'validation': {
|
||||||
"docstatus": ["=", 1]
|
'docstatus': ['=', 1]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"Work Order Item": {
|
'Work Order Item': {
|
||||||
"doctype": "Pick List Reference Item",
|
'doctype': 'Pick List Item',
|
||||||
"postprocess": update_item_quantity,
|
'postprocess': update_item_quantity,
|
||||||
"condition": lambda doc: abs(doc.transferred_qty) < abs(doc.required_qty)
|
'condition': lambda doc: abs(doc.transferred_qty) < abs(doc.required_qty)
|
||||||
},
|
},
|
||||||
}, target_doc)
|
}, target_doc)
|
||||||
|
|
||||||
# # aggregate qty for same item
|
|
||||||
# item_map = frappe._dict()
|
|
||||||
# for item in doc.items:
|
|
||||||
# item.idx = None
|
|
||||||
# if not item_map.get(item.item_code):
|
|
||||||
# item_map[item.item_code] = item
|
|
||||||
# else:
|
|
||||||
# item_map[item.item_code].qty += item.qty
|
|
||||||
# item_map[item.item_code].stock_qty += item.stock_qty
|
|
||||||
|
|
||||||
# doc.delete_key('items')
|
|
||||||
# doc.set('items', item_map.values())
|
|
||||||
|
|
||||||
doc.for_qty = for_qty
|
doc.for_qty = for_qty
|
||||||
|
|
||||||
|
doc.set_item_locations()
|
||||||
|
|
||||||
return doc
|
return doc
|
@ -998,24 +998,26 @@ def create_pick_list(source_name, target_doc=None):
|
|||||||
target.qty = flt(source.qty) - flt(source.delivered_qty)
|
target.qty = flt(source.qty) - flt(source.delivered_qty)
|
||||||
target.stock_qty = (flt(source.qty) - flt(source.delivered_qty)) * flt(source.conversion_factor)
|
target.stock_qty = (flt(source.qty) - flt(source.delivered_qty)) * flt(source.conversion_factor)
|
||||||
|
|
||||||
doc = get_mapped_doc("Sales Order", source_name, {
|
doc = get_mapped_doc('Sales Order', source_name, {
|
||||||
"Sales Order": {
|
'Sales Order': {
|
||||||
"doctype": "Pick List",
|
'doctype': 'Pick List',
|
||||||
"validation": {
|
'validation': {
|
||||||
"docstatus": ["=", 1]
|
'docstatus': ['=', 1]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"Sales Order Item": {
|
'Sales Order Item': {
|
||||||
"doctype": "Pick List Reference Item",
|
'doctype': 'Pick List Item',
|
||||||
"field_map": {
|
'field_map': {
|
||||||
"parent": "sales_order",
|
'parent': 'sales_order',
|
||||||
"name": "sales_order_item"
|
'name': 'sales_order_item'
|
||||||
},
|
},
|
||||||
"postprocess": update_item_quantity,
|
'postprocess': update_item_quantity,
|
||||||
"condition": lambda doc: abs(doc.delivered_qty) < abs(doc.qty) and doc.delivered_by_supplier!=1
|
'condition': lambda doc: abs(doc.delivered_qty) < abs(doc.qty) and doc.delivered_by_supplier!=1
|
||||||
},
|
},
|
||||||
}, target_doc)
|
}, target_doc)
|
||||||
|
|
||||||
doc.purpose = 'Delivery against Sales Order'
|
doc.purpose = 'Delivery against Sales Order'
|
||||||
|
|
||||||
|
doc.set_item_locations()
|
||||||
|
|
||||||
return doc
|
return doc
|
||||||
|
@ -516,7 +516,7 @@ def create_pick_list(source_name, target_doc=None):
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
'Material Request Item': {
|
'Material Request Item': {
|
||||||
'doctype': 'Pick List Reference Item',
|
'doctype': 'Pick List Item',
|
||||||
'field_map': {
|
'field_map': {
|
||||||
'name': 'material_request_item',
|
'name': 'material_request_item',
|
||||||
'qty': 'stock_qty'
|
'qty': 'stock_qty'
|
||||||
@ -524,4 +524,6 @@ def create_pick_list(source_name, target_doc=None):
|
|||||||
},
|
},
|
||||||
}, target_doc)
|
}, target_doc)
|
||||||
|
|
||||||
|
doc.set_item_locations()
|
||||||
|
|
||||||
return doc
|
return doc
|
@ -30,6 +30,7 @@ frappe.ui.form.on('Pick List', {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
// frm.set_df_property('get_item_locations', 'hidden', frm.is_dirty());
|
||||||
},
|
},
|
||||||
get_item_locations: (frm) => {
|
get_item_locations: (frm) => {
|
||||||
frm.call('set_item_locations');
|
frm.call('set_item_locations');
|
||||||
@ -69,7 +70,6 @@ frappe.ui.form.on('Pick List', {
|
|||||||
frappe.msgprint(__('Quantity must not be more than {0}', [max]));
|
frappe.msgprint(__('Quantity must not be more than {0}', [max]));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
frm.clear_table('items');
|
|
||||||
frm.clear_table('locations');
|
frm.clear_table('locations');
|
||||||
erpnext.utils.map_current_doc({
|
erpnext.utils.map_current_doc({
|
||||||
method: 'erpnext.manufacturing.doctype.work_order.work_order.create_pick_list',
|
method: 'erpnext.manufacturing.doctype.work_order.work_order.create_pick_list',
|
||||||
@ -80,20 +80,13 @@ frappe.ui.form.on('Pick List', {
|
|||||||
});
|
});
|
||||||
},
|
},
|
||||||
material_request: (frm) => {
|
material_request: (frm) => {
|
||||||
frm.clear_table('items');
|
|
||||||
frm.clear_table('locations');
|
|
||||||
erpnext.utils.map_current_doc({
|
erpnext.utils.map_current_doc({
|
||||||
method: 'erpnext.stock.doctype.material_request.material_request.create_pick_list',
|
method: 'erpnext.stock.doctype.material_request.material_request.create_pick_list',
|
||||||
target: frm,
|
target: frm,
|
||||||
source_name: frm.doc.material_request
|
source_name: frm.doc.material_request
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
parent_warehouse: (frm) => {
|
|
||||||
frm.clear_table('locations');
|
|
||||||
frm.refresh_field('locations');
|
|
||||||
},
|
|
||||||
purpose: (frm) => {
|
purpose: (frm) => {
|
||||||
frm.clear_table('items');
|
|
||||||
frm.clear_table('locations');
|
frm.clear_table('locations');
|
||||||
frm.trigger('add_get_items_button');
|
frm.trigger('add_get_items_button');
|
||||||
},
|
},
|
||||||
@ -140,7 +133,7 @@ frappe.ui.form.on('Pick List', {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
frappe.ui.form.on('Pick List Reference Item', {
|
frappe.ui.form.on('Pick List Item', {
|
||||||
item_code: (frm, cdt, cdn) => {
|
item_code: (frm, cdt, cdn) => {
|
||||||
let row = frappe.get_doc(cdt, cdn);
|
let row = frappe.get_doc(cdt, cdn);
|
||||||
if (row.item_code) {
|
if (row.item_code) {
|
||||||
|
@ -14,8 +14,6 @@
|
|||||||
"for_qty",
|
"for_qty",
|
||||||
"column_break_4",
|
"column_break_4",
|
||||||
"parent_warehouse",
|
"parent_warehouse",
|
||||||
"section_break_4",
|
|
||||||
"items",
|
|
||||||
"get_item_locations",
|
"get_item_locations",
|
||||||
"section_break_6",
|
"section_break_6",
|
||||||
"locations",
|
"locations",
|
||||||
@ -38,10 +36,6 @@
|
|||||||
"fieldname": "section_break_6",
|
"fieldname": "section_break_6",
|
||||||
"fieldtype": "Section Break"
|
"fieldtype": "Section Break"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"fieldname": "section_break_4",
|
|
||||||
"fieldtype": "Section Break"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"description": "Items under this warehouse will be suggested",
|
"description": "Items under this warehouse will be suggested",
|
||||||
"fieldname": "parent_warehouse",
|
"fieldname": "parent_warehouse",
|
||||||
@ -64,13 +58,6 @@
|
|||||||
"label": "Work Order",
|
"label": "Work Order",
|
||||||
"options": "Work Order"
|
"options": "Work Order"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"fieldname": "items",
|
|
||||||
"fieldtype": "Table",
|
|
||||||
"label": "Items To Be Picked",
|
|
||||||
"options": "Pick List Reference Item",
|
|
||||||
"reqd": 1
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"fieldname": "locations",
|
"fieldname": "locations",
|
||||||
"fieldtype": "Table",
|
"fieldtype": "Table",
|
||||||
@ -109,7 +96,6 @@
|
|||||||
"options": "Material Request"
|
"options": "Material Request"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"depends_on": "eval: doc.items.length && (doc.items.length > 1 || doc.items[0].item_code) && doc.docstatus === 0",
|
|
||||||
"fieldname": "get_item_locations",
|
"fieldname": "get_item_locations",
|
||||||
"fieldtype": "Button",
|
"fieldtype": "Button",
|
||||||
"label": "Get Item Locations"
|
"label": "Get Item Locations"
|
||||||
@ -124,7 +110,7 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"is_submittable": 1,
|
"is_submittable": 1,
|
||||||
"modified": "2019-08-28 12:27:22.743705",
|
"modified": "2019-08-28 12:49:59.800807",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Stock",
|
"module": "Stock",
|
||||||
"name": "Pick List",
|
"name": "Pick List",
|
||||||
@ -191,7 +177,6 @@
|
|||||||
"write": 1
|
"write": 1
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"quick_entry": 1,
|
|
||||||
"sort_field": "modified",
|
"sort_field": "modified",
|
||||||
"sort_order": "DESC",
|
"sort_order": "DESC",
|
||||||
"track_changes": 1
|
"track_changes": 1
|
||||||
|
@ -17,7 +17,7 @@ from erpnext.selling.doctype.sales_order.sales_order import make_delivery_note a
|
|||||||
|
|
||||||
class PickList(Document):
|
class PickList(Document):
|
||||||
def set_item_locations(self):
|
def set_item_locations(self):
|
||||||
items = self.items
|
item_locations = self.locations
|
||||||
self.item_location_map = frappe._dict()
|
self.item_location_map = frappe._dict()
|
||||||
|
|
||||||
from_warehouses = None
|
from_warehouses = None
|
||||||
@ -26,7 +26,7 @@ class PickList(Document):
|
|||||||
|
|
||||||
# Reset
|
# Reset
|
||||||
self.delete_key('locations')
|
self.delete_key('locations')
|
||||||
for item_doc in items:
|
for item_doc in item_locations:
|
||||||
item_code = item_doc.item_code
|
item_code = item_doc.item_code
|
||||||
if frappe.get_cached_value('Item', item_code, 'has_serial_no'):
|
if frappe.get_cached_value('Item', item_code, 'has_serial_no'):
|
||||||
locations = get_item_locations_based_on_serial_nos(item_doc)
|
locations = get_item_locations_based_on_serial_nos(item_doc)
|
||||||
@ -37,20 +37,21 @@ class PickList(Document):
|
|||||||
self.item_location_map[item_code] = get_available_items(item_code, from_warehouses)
|
self.item_location_map[item_code] = get_available_items(item_code, from_warehouses)
|
||||||
locations = get_items_with_warehouse_and_quantity(item_doc, from_warehouses, self.item_location_map)
|
locations = get_items_with_warehouse_and_quantity(item_doc, from_warehouses, self.item_location_map)
|
||||||
|
|
||||||
|
# hack
|
||||||
|
del item_doc.idx
|
||||||
|
if len(locations) > 1:
|
||||||
|
del item_doc.name
|
||||||
|
|
||||||
for row in locations:
|
for row in locations:
|
||||||
|
stock_qty = row.get('qty', 0) * item_doc.conversion_factor
|
||||||
row.update({
|
row.update({
|
||||||
'item_code': item_code,
|
'stock_qty': stock_qty,
|
||||||
'sales_order': item_doc.sales_order,
|
'picked_qty': stock_qty
|
||||||
'sales_order_item': item_doc.sales_order_item,
|
|
||||||
'material_request': item_doc.material_request,
|
|
||||||
'material_request_item': item_doc.material_request_item,
|
|
||||||
'uom': item_doc.uom,
|
|
||||||
'stock_uom': item_doc.stock_uom,
|
|
||||||
'conversion_factor': item_doc.conversion_factor,
|
|
||||||
'stock_qty': row.get("qty", 0) * item_doc.conversion_factor,
|
|
||||||
'picked_qty': row.get("qty", 0) * item_doc.conversion_factor
|
|
||||||
})
|
})
|
||||||
self.append('locations', row)
|
|
||||||
|
location = item_doc
|
||||||
|
location.update(row)
|
||||||
|
self.append('locations', location)
|
||||||
|
|
||||||
def get_items_with_warehouse_and_quantity(item_doc, from_warehouses, item_location_map):
|
def get_items_with_warehouse_and_quantity(item_doc, from_warehouses, item_location_map):
|
||||||
available_locations = item_location_map.get(item_doc.item_code)
|
available_locations = item_location_map.get(item_doc.item_code)
|
||||||
@ -242,27 +243,6 @@ def create_stock_entry(pick_list):
|
|||||||
|
|
||||||
return stock_entry.as_dict()
|
return stock_entry.as_dict()
|
||||||
|
|
||||||
@frappe.whitelist()
|
|
||||||
def create_stock_entry_with_material_request_items(pick_list):
|
|
||||||
stock_entry = frappe.new_doc('Stock Entry')
|
|
||||||
stock_entry.pick_list = pick_list.get('name')
|
|
||||||
stock_entry.purpose = pick_list.get('purpose')
|
|
||||||
stock_entry.set_stock_entry_type()
|
|
||||||
|
|
||||||
doc = get_mapped_doc("Work Order", source_name, {
|
|
||||||
"Work Order": {
|
|
||||||
"doctype": "Pick List",
|
|
||||||
"validation": {
|
|
||||||
"docstatus": ["=", 1]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"Work Order Item": {
|
|
||||||
"doctype": "Pick List Reference Item",
|
|
||||||
"postprocess": update_item_quantity,
|
|
||||||
"condition": lambda doc: abs(doc.transferred_qty) < abs(doc.required_qty)
|
|
||||||
},
|
|
||||||
}, target_doc)
|
|
||||||
|
|
||||||
@frappe.whitelist()
|
@frappe.whitelist()
|
||||||
def get_pending_work_orders(doctype, txt, searchfield, start, page_length, filters, as_dict):
|
def get_pending_work_orders(doctype, txt, searchfield, start, page_length, filters, as_dict):
|
||||||
return frappe.db.sql("""
|
return frappe.db.sql("""
|
||||||
|
@ -33,8 +33,7 @@
|
|||||||
"fieldname": "qty",
|
"fieldname": "qty",
|
||||||
"fieldtype": "Float",
|
"fieldtype": "Float",
|
||||||
"in_list_view": 1,
|
"in_list_view": 1,
|
||||||
"label": "Qty",
|
"label": "Qty"
|
||||||
"read_only": 1
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"fieldname": "picked_qty",
|
"fieldname": "picked_qty",
|
||||||
@ -100,8 +99,7 @@
|
|||||||
"fieldname": "uom",
|
"fieldname": "uom",
|
||||||
"fieldtype": "Link",
|
"fieldtype": "Link",
|
||||||
"label": "UOM",
|
"label": "UOM",
|
||||||
"options": "UOM",
|
"options": "UOM"
|
||||||
"read_only": 1
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"fieldname": "conversion_factor",
|
"fieldname": "conversion_factor",
|
||||||
@ -121,8 +119,7 @@
|
|||||||
"fieldtype": "Link",
|
"fieldtype": "Link",
|
||||||
"in_list_view": 1,
|
"in_list_view": 1,
|
||||||
"label": "Item",
|
"label": "Item",
|
||||||
"options": "Item",
|
"options": "Item"
|
||||||
"read_only": 1
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"fieldname": "quantity_section",
|
"fieldname": "quantity_section",
|
||||||
@ -171,7 +168,7 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"istable": 1,
|
"istable": 1,
|
||||||
"modified": "2019-08-28 12:34:06.224534",
|
"modified": "2019-08-28 15:56:14.507776",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Stock",
|
"module": "Stock",
|
||||||
"name": "Pick List Item",
|
"name": "Pick List Item",
|
||||||
|
@ -1,8 +0,0 @@
|
|||||||
// Copyright (c) 2019, Frappe Technologies Pvt. Ltd. and contributors
|
|
||||||
// For license information, please see license.txt
|
|
||||||
|
|
||||||
frappe.ui.form.on('Pick List Reference Item', {
|
|
||||||
// refresh: function(frm) {
|
|
||||||
|
|
||||||
// }
|
|
||||||
});
|
|
@ -1,109 +0,0 @@
|
|||||||
{
|
|
||||||
"creation": "2019-07-24 16:11:07.415562",
|
|
||||||
"doctype": "DocType",
|
|
||||||
"editable_grid": 1,
|
|
||||||
"engine": "InnoDB",
|
|
||||||
"field_order": [
|
|
||||||
"item_code",
|
|
||||||
"quantity_section",
|
|
||||||
"qty",
|
|
||||||
"stock_qty",
|
|
||||||
"column_break_5",
|
|
||||||
"uom",
|
|
||||||
"conversion_factor",
|
|
||||||
"stock_uom",
|
|
||||||
"reference_section",
|
|
||||||
"sales_order",
|
|
||||||
"sales_order_item",
|
|
||||||
"material_request",
|
|
||||||
"material_request_item"
|
|
||||||
],
|
|
||||||
"fields": [
|
|
||||||
{
|
|
||||||
"fieldname": "qty",
|
|
||||||
"fieldtype": "Float",
|
|
||||||
"in_list_view": 1,
|
|
||||||
"label": "Qty"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"fieldname": "quantity_section",
|
|
||||||
"fieldtype": "Section Break",
|
|
||||||
"label": "Quantity"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"fieldname": "stock_qty",
|
|
||||||
"fieldtype": "Float",
|
|
||||||
"label": "Stock Qty",
|
|
||||||
"read_only": 1
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"fieldname": "uom",
|
|
||||||
"fieldtype": "Link",
|
|
||||||
"label": "UOM",
|
|
||||||
"options": "UOM"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"fieldname": "stock_uom",
|
|
||||||
"fieldtype": "Link",
|
|
||||||
"label": "Stock UOM",
|
|
||||||
"options": "UOM",
|
|
||||||
"read_only": 1
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"fieldname": "item_code",
|
|
||||||
"fieldtype": "Link",
|
|
||||||
"in_list_view": 1,
|
|
||||||
"label": "Item",
|
|
||||||
"options": "Item"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"fieldname": "column_break_5",
|
|
||||||
"fieldtype": "Column Break"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"fieldname": "reference_section",
|
|
||||||
"fieldtype": "Section Break",
|
|
||||||
"label": "Reference"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"fieldname": "sales_order",
|
|
||||||
"fieldtype": "Link",
|
|
||||||
"label": "Sales Order",
|
|
||||||
"options": "Sales Order",
|
|
||||||
"read_only": 1
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"fieldname": "sales_order_item",
|
|
||||||
"fieldtype": "Data",
|
|
||||||
"label": "Sales Order Item",
|
|
||||||
"read_only": 1
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"fieldname": "conversion_factor",
|
|
||||||
"fieldtype": "Float",
|
|
||||||
"label": "UOM Conversion Factor"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"fieldname": "material_request",
|
|
||||||
"fieldtype": "Link",
|
|
||||||
"label": "Material Request",
|
|
||||||
"options": "Material Request",
|
|
||||||
"read_only": 1
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"fieldname": "material_request_item",
|
|
||||||
"fieldtype": "Data",
|
|
||||||
"label": "Material Request Item",
|
|
||||||
"read_only": 1
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"istable": 1,
|
|
||||||
"modified": "2019-08-27 08:40:21.870638",
|
|
||||||
"modified_by": "Administrator",
|
|
||||||
"module": "Stock",
|
|
||||||
"name": "Pick List Reference Item",
|
|
||||||
"owner": "Administrator",
|
|
||||||
"permissions": [],
|
|
||||||
"sort_field": "modified",
|
|
||||||
"sort_order": "DESC"
|
|
||||||
}
|
|
@ -1,10 +0,0 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
# Copyright (c) 2019, Frappe Technologies Pvt. Ltd. and contributors
|
|
||||||
# For license information, please see license.txt
|
|
||||||
|
|
||||||
from __future__ import unicode_literals
|
|
||||||
# import frappe
|
|
||||||
from frappe.model.document import Document
|
|
||||||
|
|
||||||
class PickListReferenceItem(Document):
|
|
||||||
pass
|
|
Loading…
Reference in New Issue
Block a user