Merge pull request #6716 from nabinhait/develop

Change Logs for v7.1
diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.js b/erpnext/stock/doctype/stock_entry/stock_entry.js
index 85166a6..561d20e 100644
--- a/erpnext/stock/doctype/stock_entry/stock_entry.js
+++ b/erpnext/stock/doctype/stock_entry/stock_entry.js
@@ -379,60 +379,6 @@
 	}
 }
 
-cur_frm.cscript.item_code = function(doc, cdt, cdn) {
-	var d = locals[cdt][cdn];
-	if(d.item_code) {
-		args = {
-			'item_code'			: d.item_code,
-			'warehouse'			: cstr(d.s_warehouse) || cstr(d.t_warehouse),
-			'transfer_qty'		: d.transfer_qty,
-			'serial_no	'		: d.serial_no,
-			'bom_no'			: d.bom_no,
-			'expense_account'	: d.expense_account,
-			'cost_center'		: d.cost_center,
-			'company'			: cur_frm.doc.company
-		};
-		return frappe.call({
-			doc: cur_frm.doc,
-			method: "get_item_details",
-			args: args,
-			callback: function(r) {
-				if(r.message) {
-					var d = locals[cdt][cdn];
-					$.each(r.message, function(k, v) {
-						d[k] = v;
-					});
-					refresh_field("items");
-				}
-			}
-		});
-	}
-}
-
-cur_frm.cscript.barcode = function(doc, cdt, cdn) {
-	var d = locals[cdt][cdn];
-	if (d.barcode) {
-		frappe.call({
-			method: "erpnext.stock.get_item_details.get_item_code",
-			args: {"barcode": d.barcode },
-			callback: function(r) {
-				if (!r.exe){
-					frappe.model.set_value(cdt, cdn, "item_code", r.message);
-				}
-			}
-		});
-	}
-}
-
-cur_frm.cscript.uom = function(doc, cdt, cdn) {
-	var d = locals[cdt][cdn];
-	if(d.uom && d.item_code){
-		var arg = {'item_code':d.item_code, 'uom':d.uom, 'qty':d.qty}
-		return get_server_fields('get_uom_details', JSON.stringify(arg),
-			'items', doc, cdt, cdn, 1);
-	}
-}
-
 cur_frm.cscript.validate = function(doc, cdt, cdn) {
 	cur_frm.cscript.validate_items(doc);
 }
@@ -453,18 +399,100 @@
 	erpnext.utils.copy_value_in_all_row(doc, cdt, cdn, "items", "cost_center");
 }
 
-cur_frm.cscript.company = function(doc, cdt, cdn) {
-	if(doc.company) {
-		var company_doc = frappe.get_doc(":Company", doc.company);
-		if(company_doc.default_letter_head) {
-			cur_frm.set_value("letter_head", company_doc.default_letter_head);
-		}
-	}
-}
-
 
 frappe.ui.form.on('Landed Cost Taxes and Charges', {
 	amount: function(frm) {
 		frm.cscript.calculate_amount();
 	}
 })
+
+frappe.ui.form.on('Stock Entry Detail', {
+	qty: function(frm, cdt, cdn) {
+		frm.events.set_serial_no(frm, cdt, cdn);
+	},
+
+	s_warehouse: function(frm, cdt, cdn) {
+		frm.events.set_serial_no(frm, cdt, cdn);
+	},
+	barcode: function(doc, cdt, cdn) {
+		var d = locals[cdt][cdn];
+		if (d.barcode) {
+			frappe.call({
+				method: "erpnext.stock.get_item_details.get_item_code",
+				args: {"barcode": d.barcode },
+				callback: function(r) {
+					if (!r.exe){
+						frappe.model.set_value(cdt, cdn, "item_code", r.message);
+					}
+				}
+			});
+		}
+	},
+	uom: function(doc, cdt, cdn) {
+		var d = locals[cdt][cdn];
+		if(d.uom && d.item_code){
+			var arg = {'item_code':d.item_code, 'uom':d.uom, 'qty':d.qty}
+			return get_server_fields('get_uom_details', JSON.stringify(arg),
+				'items', doc, cdt, cdn, 1);
+		}
+	},
+	item_code: function(doc, cdt, cdn) {
+		var d = locals[cdt][cdn];
+		if(d.item_code) {
+			args = {
+				'item_code'			: d.item_code,
+				'warehouse'			: cstr(d.s_warehouse) || cstr(d.t_warehouse),
+				'transfer_qty'		: d.transfer_qty,
+				'serial_no	'		: d.serial_no,
+				'bom_no'			: d.bom_no,
+				'expense_account'	: d.expense_account,
+				'cost_center'		: d.cost_center,
+				'company'			: cur_frm.doc.company,
+				'qty'				: d.qty
+			};
+			return frappe.call({
+				doc: cur_frm.doc,
+				method: "get_item_details",
+				args: args,
+				callback: function(r) {
+					if(r.message) {
+						var d = locals[cdt][cdn];
+						$.each(r.message, function(k, v) {
+							d[k] = v;
+						});
+						refresh_field("items");
+					}
+				}
+			});
+		}
+	}
+})
+
+frappe.ui.form.on('Stock Entry', {
+	company: function(doc, cdt, cdn) {
+		if(doc.company) {
+			var company_doc = frappe.get_doc(":Company", doc.company);
+			if(company_doc.default_letter_head) {
+				cur_frm.set_value("letter_head", company_doc.default_letter_head);
+			}
+		}
+	},
+	set_serial_no: function(doc, cdt, cdn) {
+		var d = frappe.model.get_doc(cdt, cdn);
+		if(!d.item_code && !d.s_warehouse && !d.qty) return;
+		var	args = {
+				'item_code'	: d.item_code,
+				'warehouse'	: cstr(d.s_warehouse),
+				'qty'		: d.qty
+			};
+			frappe.call({
+				method: "erpnext.stock.doctype.stock_entry.stock_entry.get_serial_no",
+				args: {"args": args},
+				callback: function(r) {
+					if (!r.exe){
+						frappe.model.set_value(cdt, cdn, "serial_no", r.message);
+					}
+				}
+			});
+		},
+})
diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.py b/erpnext/stock/doctype/stock_entry/stock_entry.py
index cf3d604..a60e945 100644
--- a/erpnext/stock/doctype/stock_entry/stock_entry.py
+++ b/erpnext/stock/doctype/stock_entry/stock_entry.py
@@ -8,7 +8,7 @@
 from frappe.utils import cstr, cint, flt, comma_or, getdate, nowdate, formatdate, format_time
 from erpnext.stock.utils import get_incoming_rate
 from erpnext.stock.stock_ledger import get_previous_sle, NegativeStockError
-from erpnext.stock.get_item_details import get_bin_details, get_default_cost_center, get_conversion_factor
+from erpnext.stock.get_item_details import get_bin_details, get_default_cost_center, get_conversion_factor, process_args, get_serial_nos_by_fifo
 from erpnext.manufacturing.doctype.bom.bom import validate_bom_no
 import json
 
@@ -486,7 +486,8 @@
 			'conversion_factor'		: 1,
 			'batch_no'				: '',
 			'actual_qty'			: 0,
-			'basic_rate'			: 0
+			'basic_rate'			: 0,
+			'serial_no'				: ''
 		}
 		for d in [["Account", "expense_account", "default_expense_account"],
 			["Cost Center", "cost_center", "cost_center"]]:
@@ -867,3 +868,16 @@
 		}
 
 	return ret
+
+@frappe.whitelist()
+def get_serial_no(args):
+	if isinstance(args, basestring):
+		args = json.loads(args)
+	args = frappe._dict(args)
+
+	if args.get('warehouse'):
+		if frappe.get_value('Item', {'item_code': args.item_code}, "has_serial_no") == 1:
+			args = json.dumps({"item_code": args.get('item_code'),"warehouse": args.get('warehouse'),"qty": args.get('qty')})
+			args = process_args(args)
+			serial_no = get_serial_nos_by_fifo(args)
+			return serial_no
\ No newline at end of file
diff --git a/erpnext/stock/get_item_details.py b/erpnext/stock/get_item_details.py
index e5dd735..f8410af 100644
--- a/erpnext/stock/get_item_details.py
+++ b/erpnext/stock/get_item_details.py
@@ -75,7 +75,7 @@
 
 	if args.get("doctype") in ("Sales Invoice", "Delivery Note"):
 		if item_doc.has_serial_no == 1 and not args.serial_no:
-			out.serial_no = get_serial_nos_by_fifo(args, item_doc)
+			out.serial_no = get_serial_nos_by_fifo(args)
 
 	if args.transaction_date and item.lead_time_days:
 		out.schedule_date = out.lead_time_date = add_days(args.transaction_date,
@@ -339,7 +339,7 @@
 	return pos_profile and pos_profile[0] or None
 
 
-def get_serial_nos_by_fifo(args, item_doc):
+def get_serial_nos_by_fifo(args):
 	if frappe.db.get_single_value("Stock Settings", "automatically_set_serial_nos_based_on_fifo"):
 		return "\n".join(frappe.db.sql_list("""select name from `tabSerial No`
 			where item_code=%(item_code)s and warehouse=%(warehouse)s