Merge pull request #1798 from nabinhait/v4-hotfix

Account common get_query
diff --git a/erpnext/controllers/buying_controller.py b/erpnext/controllers/buying_controller.py
index accaeb4..afccdfa 100644
--- a/erpnext/controllers/buying_controller.py
+++ b/erpnext/controllers/buying_controller.py
@@ -52,9 +52,8 @@
 			validate_warehouse_company(w, self.company)
 
 	def validate_stock_or_nonstock_items(self):
-		if not self.get_stock_items():
-			tax_for_valuation = [d.account_head for d in
-				self.get("other_charges")
+		if self.meta.get_field("other_charges") and not self.get_stock_items():
+			tax_for_valuation = [d.account_head for d in self.get("other_charges")
 				if d.category in ["Valuation", "Valuation and Total"]]
 			if tax_for_valuation:
 				frappe.throw(_("Tax Category can not be 'Valuation' or 'Valuation and Total' as all items are non-stock items"))
diff --git a/erpnext/controllers/queries.py b/erpnext/controllers/queries.py
index a4d2b52..789e7a3 100644
--- a/erpnext/controllers/queries.py
+++ b/erpnext/controllers/queries.py
@@ -236,13 +236,21 @@
 				'page_len': page_len})
 
 def get_account_list(doctype, txt, searchfield, start, page_len, filters):
-	if isinstance(filters, dict):
-		if not filters.get("group_or_ledger"):
-			filters["group_or_ledger"] = "Ledger"
-	elif isinstance(filters, list):
-		if "group_or_ledger" not in [d[0] for d in filters]:
-			filters.append(["Account", "group_or_ledger", "=", "Ledger"])
+	filter_list = []
 
-	return frappe.widgets.reportview.execute("Account", filters = filters,
+	if isinstance(filters, dict):
+		for key, val in filters.items():
+			if isinstance(val, (list, tuple)):
+				filter_list.append([doctype, key, val[0], val[1]])
+			else:
+				filter_list.append([doctype, key, "=", val])
+
+	if "group_or_ledger" not in [d[1] for d in filter_list]:
+		filter_list.append(["Account", "group_or_ledger", "=", "Ledger"])
+
+	if searchfield and txt:
+		filter_list.append([doctype, searchfield, "like", "%%%s%%" % txt])
+
+	return frappe.widgets.reportview.execute("Account", filters = filter_list,
 		fields = ["name", "parent_account"],
 		limit_start=start, limit_page_length=page_len, as_list=True)
diff --git a/erpnext/stock/doctype/delivery_note/delivery_note.js b/erpnext/stock/doctype/delivery_note/delivery_note.js
index fb94b88..10fe650 100644
--- a/erpnext/stock/doctype/delivery_note/delivery_note.js
+++ b/erpnext/stock/doctype/delivery_note/delivery_note.js
@@ -118,10 +118,10 @@
 }
 
 cur_frm.cscript['Make Packing Slip'] = function() {
-	n = frappe.model.make_new_doc_and_get_name('Packing Slip');
-	ps = locals["Packing Slip"][n];
-	ps.delivery_note = cur_frm.doc.name;
-	loaddoc('Packing Slip', n);
+	frappe.model.open_mapped_doc({
+		method: "erpnext.stock.doctype.delivery_note.delivery_note.make_packing_slip",
+		frm: cur_frm
+	})
 }
 
 var set_print_hide= function(doc, cdt, cdn){
diff --git a/erpnext/stock/doctype/delivery_note/delivery_note.py b/erpnext/stock/doctype/delivery_note/delivery_note.py
index da7dd7a..1600950 100644
--- a/erpnext/stock/doctype/delivery_note/delivery_note.py
+++ b/erpnext/stock/doctype/delivery_note/delivery_note.py
@@ -346,3 +346,19 @@
 	}, target_doc)
 
 	return doclist
+
+@frappe.whitelist()
+def make_packing_slip(source_name, target_doc=None):
+	doclist = get_mapped_doc("Delivery Note", source_name, 	{
+		"Delivery Note": {
+			"doctype": "Packing Slip",
+			"field_map": {
+				"name": "delivery_note"
+			},
+			"validation": {
+				"docstatus": ["=", 0]
+			}
+		}
+	}, target_doc)
+
+	return doclist
diff --git a/erpnext/stock/doctype/material_request/material_request.py b/erpnext/stock/doctype/material_request/material_request.py
index f8f0d09..9951fc8 100644
--- a/erpnext/stock/doctype/material_request/material_request.py
+++ b/erpnext/stock/doctype/material_request/material_request.py
@@ -48,7 +48,7 @@
 
 	def validate_schedule_date(self):
 		for d in self.get('indent_details'):
-			if d.schedule_date < self.transaction_date:
+			if d.schedule_date and d.schedule_date < self.transaction_date:
 				frappe.throw(_("Expected Date cannot be before Material Request Date"))
 
 	# Validate
diff --git a/erpnext/stock/doctype/packing_slip/packing_slip.js b/erpnext/stock/doctype/packing_slip/packing_slip.js
index acdd27e..9788290 100644
--- a/erpnext/stock/doctype/packing_slip/packing_slip.js
+++ b/erpnext/stock/doctype/packing_slip/packing_slip.js
@@ -18,7 +18,7 @@
 
 cur_frm.cscript.onload_post_render = function(doc, cdt, cdn) {
 	if(doc.delivery_note && doc.__islocal) {
-			cur_frm.cscript.get_items(doc, cdt, cdn);
+		cur_frm.cscript.get_items(doc, cdt, cdn);
 	}
 }
 
diff --git a/erpnext/stock/get_item_details.py b/erpnext/stock/get_item_details.py
index 9c251b8..cdf5aa1 100644
--- a/erpnext/stock/get_item_details.py
+++ b/erpnext/stock/get_item_details.py
@@ -255,7 +255,7 @@
 
 	args = frappe._dict(args)
 	out = frappe._dict()
-	if not args.get("item_code"): return
+	if args.get("doctype") == "Material Request" or not args.get("item_code"): return out
 
 	if not args.get("item_group") or not args.get("brand"):
 		args.item_group, args.brand = frappe.db.get_value("Item",