Stock entry fixes: incoming rate, toggle display of bom related fields
diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.js b/erpnext/stock/doctype/stock_entry/stock_entry.js
index 34f0ecb..b630f64 100644
--- a/erpnext/stock/doctype/stock_entry/stock_entry.js
+++ b/erpnext/stock/doctype/stock_entry/stock_entry.js
@@ -129,10 +129,14 @@
 	},
 
 	get_items: function() {
+		var me = this;
+		if(!this.frm.doc.fg_completed_qty || !this.frm.doc.bom_no)
+			frappe.throw(__("BOM and Manufacturing Quantity are required"));
+		
 		if(this.frm.doc.production_order || this.frm.doc.bom_no) {
 			// if production order / bom is mentioned, get items
 			return this.frm.call({
-				doc: this.frm.doc,
+				doc: me.frm.doc,
 				method: "get_items",
 				callback: function(r) {
 					if(!r.exc) refresh_field("items");
@@ -161,8 +165,9 @@
 			args: {production_order: this.frm.doc.production_order},
 			callback: function(r) {
 				if (!r.exc) {
-					if (me.frm.doc.purpose == "Material Transfer" && !me.frm.doc.to_warehouse)
+					if (me.frm.doc.purpose == "Material Transfer for Manufacture" && !me.frm.doc.to_warehouse)
 						me.frm.set_value("to_warehouse", r.message["wip_warehouse"]);
+					me.frm.set_value("from_bom", 1);
 				}
 			}
 		});
@@ -353,6 +358,24 @@
 
 	cur_frm.cscript.toggle_enable_bom();
 
+	if(doc.purpose == 'Purchase Return') {
+		doc.customer = doc.customer_name = doc.customer_address =
+			doc.delivery_note_no = doc.sales_invoice_no = null;
+		doc.bom_no = doc.production_order = doc.fg_completed_qty = null;
+	} else if(doc.purpose == 'Sales Return') {
+		doc.supplier=doc.supplier_name = doc.supplier_address = doc.purchase_receipt_no=null;
+		doc.bom_no = doc.production_order = doc.fg_completed_qty = null;
+	} else if (doc.purpose == 'Subcontract') {
+		doc.customer = doc.customer_name = doc.customer_address =
+			doc.delivery_note_no = doc.sales_invoice_no = null;
+	} else {
+		doc.customer = doc.customer_name = doc.customer_address =
+			doc.delivery_note_no = doc.sales_invoice_no = doc.supplier =
+			doc.supplier_name = doc.supplier_address = doc.purchase_receipt_no = null;
+	}
+	if(in_list(["Material Receipt", "Sales Return", "Purchase Return"], doc.purpose)) {
+		cur_frm.set_value("from_bom", 0);
+	}
 }
 
 cur_frm.fields_dict['production_order'].get_query = function(doc) {
diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.json b/erpnext/stock/doctype/stock_entry/stock_entry.json
index e19a803..126da73 100644
--- a/erpnext/stock/doctype/stock_entry/stock_entry.json
+++ b/erpnext/stock/doctype/stock_entry/stock_entry.json
@@ -141,6 +141,7 @@
    "search_index": 1
   }, 
   {
+   "depends_on": "eval:in_list([\"Material Issue\", \"Material Transfer\", \"Manufacture\", \"Repack\", \t\t\t\t\t\"Subcontract\", \"Material Transfer for Manufacture\"], doc.purpose)", 
    "fieldname": "from_bom", 
    "fieldtype": "Check", 
    "label": "From BOM", 
@@ -201,7 +202,7 @@
    "read_only": 0
   }, 
   {
-   "depends_on": "eval:!inList([\"Sales Return\", \"Purchase Return\"], doc.purpose)", 
+   "depends_on": "from_bom", 
    "fieldname": "bom_no", 
    "fieldtype": "Link", 
    "label": "BOM No", 
@@ -210,7 +211,7 @@
    "read_only": 0
   }, 
   {
-   "depends_on": "eval:inList([\"Manufacture\", \"Repack\"], doc.purpose)", 
+   "depends_on": "from_bom", 
    "fieldname": "additional_operating_cost", 
    "fieldtype": "Currency", 
    "label": "Additional Operating Cost", 
@@ -227,7 +228,7 @@
   }, 
   {
    "allow_on_submit": 0, 
-   "depends_on": "eval:!inList([\"Sales Return\", \"Purchase Return\"], doc.purpose)", 
+   "depends_on": "from_bom", 
    "description": "As per Stock UOM", 
    "fieldname": "fg_completed_qty", 
    "fieldtype": "Float", 
@@ -246,7 +247,7 @@
   }, 
   {
    "default": "1", 
-   "depends_on": "eval:!inList([\"Sales Return\", \"Purchase Return\"], doc.purpose)", 
+   "depends_on": "from_bom", 
    "description": "Including items for sub assemblies", 
    "fieldname": "use_multi_level_bom", 
    "fieldtype": "Check", 
@@ -257,7 +258,7 @@
   }, 
   {
    "allow_on_submit": 0, 
-   "depends_on": "eval:!inList([\"Sales Return\", \"Purchase Return\"], doc.purpose)", 
+   "depends_on": "from_bom", 
    "fieldname": "get_items", 
    "fieldtype": "Button", 
    "hidden": 0, 
@@ -669,7 +670,7 @@
  "is_submittable": 1, 
  "issingle": 0, 
  "max_attachments": 0, 
- "modified": "2015-03-03 01:53:07.157141", 
+ "modified": "2015-03-03 18:09:12.035606", 
  "modified_by": "Administrator", 
  "module": "Stock", 
  "name": "Stock Entry", 
diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.py b/erpnext/stock/doctype/stock_entry/stock_entry.py
index a76e2b7..547ead6 100644
--- a/erpnext/stock/doctype/stock_entry/stock_entry.py
+++ b/erpnext/stock/doctype/stock_entry/stock_entry.py
@@ -278,14 +278,15 @@
 					self.posting_date, self.posting_time, d.actual_qty, d.transfer_qty), NegativeStockError)
 
 			# get incoming rate
-			if not flt(d.incoming_rate) or d.s_warehouse or self.purpose == "Sales Return" or force:
-				incoming_rate = flt(self.get_incoming_rate(args), self.precision("incoming_rate", d))
-				if incoming_rate > 0:
-					d.incoming_rate = incoming_rate
+			if not d.bom_no:
+				if not flt(d.incoming_rate) or d.s_warehouse or self.purpose == "Sales Return" or force:
+					incoming_rate = flt(self.get_incoming_rate(args), self.precision("incoming_rate", d))
+					if incoming_rate > 0:
+						d.incoming_rate = incoming_rate
 
-			d.amount = flt(d.transfer_qty) * flt(d.incoming_rate)
-			if not d.t_warehouse:
-				raw_material_cost += flt(d.amount)
+				d.amount = flt(d.transfer_qty) * flt(d.incoming_rate)
+				if not d.t_warehouse:
+					raw_material_cost += flt(d.amount)
 
 
 		self.add_operation_cost(raw_material_cost, force)
@@ -293,10 +294,10 @@
 	def add_operation_cost(self, raw_material_cost, force):
 		"""Adds operating cost if Production Order is set"""
 		# set incoming rate for fg item
-		if self.purpose in ("Manufacture", "Repack"):
+		if self.purpose in ["Manufacture", "Repack"]:
 			number_of_fg_items = len([t.t_warehouse for t in self.get("items") if t.t_warehouse])
 			for d in self.get("items"):
-				if (d.t_warehouse and number_of_fg_items == 1):
+				if d.bom_no or (d.t_warehouse and number_of_fg_items == 1):
 					operation_cost_per_unit = 0.0
 					if self.production_order:
 						operation_cost_per_unit = self.get_operation_cost_per_unit(d.bom_no, d.qty)
@@ -540,6 +541,9 @@
 		return ret
 
 	def get_items(self):
+		if not self.fg_completed_qty or not self.bom_no:
+			frappe.throw(_("BOM and Manufacturing Quantity are required"))
+			
 		self.set('items', [])
 		self.validate_production_order()