Merge pull request #3811 from rmehta/opportunity-customer

[minor] add close button in opportunity and project links in customer
diff --git a/erpnext/__version__.py b/erpnext/__version__.py
index a2bbbf7..b34f021 100644
--- a/erpnext/__version__.py
+++ b/erpnext/__version__.py
@@ -1,2 +1,2 @@
 from __future__ import unicode_literals
-__version__ = '5.5.0'
+__version__ = '5.5.1'
diff --git a/erpnext/accounts/doctype/account/chart_of_accounts/chart_of_accounts.py b/erpnext/accounts/doctype/account/chart_of_accounts/chart_of_accounts.py
index 7729d22..ce3a7fd 100644
--- a/erpnext/accounts/doctype/account/chart_of_accounts/chart_of_accounts.py
+++ b/erpnext/accounts/doctype/account/chart_of_accounts/chart_of_accounts.py
@@ -92,13 +92,13 @@
 				with open(os.path.join(path, fname), "r") as f:
 					_get_chart_name(f.read())
 
-	countries_use_OHADA_system = ["Benin", "Burkina Faso", "Cameroon", "Central African Republic", "Comoros",
-		"Congo", "Ivory Coast", "Gabon", "Guinea", "Guinea Bissau", "Equatorial Guinea", "Mali", "Niger",
-		"Replica of Democratic Congo", "Senegal", "Chad", "Togo"]
-
-	if country in countries_use_OHADA_system:
-		with open(os.path.join(os.path.dirname(__file__), "syscohada_syscohada_chart_template.json"), "r") as f:
-			_get_chart_name(f.read())
+	# countries_use_OHADA_system = ["Benin", "Burkina Faso", "Cameroon", "Central African Republic", "Comoros",
+	# 	"Congo", "Ivory Coast", "Gabon", "Guinea", "Guinea Bissau", "Equatorial Guinea", "Mali", "Niger",
+	# 	"Replica of Democratic Congo", "Senegal", "Chad", "Togo"]
+	#
+	# if country in countries_use_OHADA_system:
+	# 	with open(os.path.join(os.path.dirname(__file__), "syscohada_syscohada_chart_template.json"), "r") as f:
+	# 		_get_chart_name(f.read())
 
 	if len(charts) != 1:
 		charts.append("Standard")
diff --git a/erpnext/accounts/doctype/journal_entry/journal_entry.py b/erpnext/accounts/doctype/journal_entry/journal_entry.py
index f0630ce..80d2435 100644
--- a/erpnext/accounts/doctype/journal_entry/journal_entry.py
+++ b/erpnext/accounts/doctype/journal_entry/journal_entry.py
@@ -192,8 +192,9 @@
 
 				if against_field in ["against_invoice", "against_voucher"]:
 					if (against_voucher[0] !=d.party or against_voucher[1] != d.account):
-						frappe.throw(_("Row {0}: Party / Account does not match with \
-							Customer / Debit To in {1}").format(d.idx, doctype))
+						frappe.throw(_("Row {0}: Party / Account does not match with {1} / {2} in {3} {4}")
+							.format(d.idx, field_dict.get(doctype)[0], field_dict.get(doctype)[1], 
+								doctype, d.get(against_field)))
 					else:
 						payment_against_voucher.setdefault(d.get(against_field), []).append(flt(d.get(dr_or_cr)))
 
diff --git a/erpnext/controllers/buying_controller.py b/erpnext/controllers/buying_controller.py
index 7fd8feb..5ccf29d 100644
--- a/erpnext/controllers/buying_controller.py
+++ b/erpnext/controllers/buying_controller.py
@@ -112,8 +112,8 @@
 					valuation_amount_adjustment -= item.item_tax_amount
 
 				self.round_floats_in(item)
-
-				item.conversion_factor = get_conversion_factor(item.item_code, item.uom).get("conversion_factor") or 1.0
+				if flt(item.conversion_factor)==0:
+					item.conversion_factor = get_conversion_factor(item.item_code, item.uom).get("conversion_factor") or 1.0
 
 				qty_in_stock_uom = flt(item.qty * item.conversion_factor)
 				rm_supp_cost = flt(item.rm_supp_cost) if self.doctype=="Purchase Receipt" else 0.0
diff --git a/erpnext/crm/doctype/newsletter/newsletter.py b/erpnext/crm/doctype/newsletter/newsletter.py
index 30fd101..83d3caf 100644
--- a/erpnext/crm/doctype/newsletter/newsletter.py
+++ b/erpnext/crm/doctype/newsletter/newsletter.py
@@ -138,8 +138,6 @@
 		_("Click here to verify")
 	)
 
-	print url
-
 	content = """
 	<p>{0}. {1}.</p>
 	<p><a href="{2}">{3}</a></p>
diff --git a/erpnext/hooks.py b/erpnext/hooks.py
index e973b9f..79f70f7 100644
--- a/erpnext/hooks.py
+++ b/erpnext/hooks.py
@@ -27,7 +27,7 @@
 """
 app_icon = "icon-th"
 app_color = "#e74c3c"
-app_version = "5.5.0"
+app_version = "5.5.1"
 github_link = "https://github.com/frappe/erpnext"
 
 error_report_email = "support@erpnext.com"
diff --git a/erpnext/manufacturing/doctype/production_order/production_order.js b/erpnext/manufacturing/doctype/production_order/production_order.js
index 8202f43..657756d 100644
--- a/erpnext/manufacturing/doctype/production_order/production_order.js
+++ b/erpnext/manufacturing/doctype/production_order/production_order.js
@@ -152,7 +152,9 @@
 			method: "erpnext.manufacturing.doctype.production_order.production_order.get_item_details",
 			args: { item: doc.production_item },
 			callback: function(r) {
-				cur_frm.set_value(r.message);
+				$.each(["description", "stock_uom", "bom_no"], function(i, field) {
+					cur_frm.set_value(field, r.message[field]);
+				});
 			}
 		});
 	},
@@ -187,8 +189,8 @@
 
 	bom_no: function() {
 		return this.frm.call({
-		doc: this.frm.doc,
-		method: "set_production_order_operations"
+			doc: this.frm.doc,
+			method: "set_production_order_operations"
 		});
 	},
 
diff --git a/erpnext/projects/doctype/time_log_batch/time_log_batch.py b/erpnext/projects/doctype/time_log_batch/time_log_batch.py
index eaccc8c..55d5937 100644
--- a/erpnext/projects/doctype/time_log_batch/time_log_batch.py
+++ b/erpnext/projects/doctype/time_log_batch/time_log_batch.py
@@ -15,6 +15,8 @@
 
 	def validate(self):
 		self.set_status()
+		self.total_hours = 0.0
+		self.total_billing_amount = 0.0
 		for d in self.get("time_logs"):
 			tl = frappe.get_doc("Time Log", d.time_log)
 			self.update_time_log_values(d, tl)
diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.js b/erpnext/stock/doctype/stock_entry/stock_entry.js
index d5bdde7..04ef935 100644
--- a/erpnext/stock/doctype/stock_entry/stock_entry.js
+++ b/erpnext/stock/doctype/stock_entry/stock_entry.js
@@ -133,11 +133,12 @@
 		var me = this;
 		this.toggle_enable_bom();
 
-		return this.frm.call({
-			method: "get_production_order_details",
+		return frappe.call({
+			method: "erpnext.stock.doctype.stock_entry.stock_entry.get_production_order_details",
 			args: {production_order: this.frm.doc.production_order},
 			callback: function(r) {
 				if (!r.exc) {
+					me.frm.set_value(r.message);
 					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);
diff --git a/erpnext/stock/stock_ledger.py b/erpnext/stock/stock_ledger.py
index c92663f..c0d5cd0 100644
--- a/erpnext/stock/stock_ledger.py
+++ b/erpnext/stock/stock_ledger.py
@@ -300,22 +300,21 @@
 
 				# select first batch or the batch with same rate
 				batch = self.stock_queue[index]
-				if batch[0]:
-					if qty_to_pop >= batch[0]:
-						# consume current batch
-						qty_to_pop = qty_to_pop - batch[0]
-						self.stock_queue.pop(index)
-						if not self.stock_queue and qty_to_pop:
-							# stock finished, qty still remains to be withdrawn
-							# negative stock, keep in as a negative batch
-							self.stock_queue.append([-qty_to_pop, outgoing_rate or batch[1]])
-							break
+				if qty_to_pop >= batch[0]:
+					# consume current batch
+					qty_to_pop = qty_to_pop - batch[0]
+					self.stock_queue.pop(index)
+					if not self.stock_queue and qty_to_pop:
+						# stock finished, qty still remains to be withdrawn
+						# negative stock, keep in as a negative batch
+						self.stock_queue.append([-qty_to_pop, outgoing_rate or batch[1]])
+						break
 
-					else:
-						# qty found in current batch
-						# consume it and exit
-						batch[0] = batch[0] - qty_to_pop
-						qty_to_pop = 0
+				else:
+					# qty found in current batch
+					# consume it and exit
+					batch[0] = batch[0] - qty_to_pop
+					qty_to_pop = 0
 
 		stock_value = sum((flt(batch[0]) * flt(batch[1]) for batch in self.stock_queue))
 		stock_qty = sum((flt(batch[0]) for batch in self.stock_queue))
diff --git a/erpnext/stock/utils.py b/erpnext/stock/utils.py
index 4f1e427..ee4303b 100644
--- a/erpnext/stock/utils.py
+++ b/erpnext/stock/utils.py
@@ -133,20 +133,19 @@
 		qty_to_pop = abs(qty)
 		while qty_to_pop and previous_stock_queue:
 			batch = previous_stock_queue[0]
-			if batch[0]:
-				if 0 < batch[0] <= qty_to_pop:
-					# if batch qty > 0
-					# not enough or exactly same qty in current batch, clear batch
-					available_qty_for_outgoing += flt(batch[0])
-					outgoing_cost += flt(batch[0]) * flt(batch[1])
-					qty_to_pop -= batch[0]
-					previous_stock_queue.pop(0)
-				else:
-					# all from current batch
-					available_qty_for_outgoing += flt(qty_to_pop)
-					outgoing_cost += flt(qty_to_pop) * flt(batch[1])
-					batch[0] -= qty_to_pop
-					qty_to_pop = 0
+			if 0 < batch[0] <= qty_to_pop:
+				# if batch qty > 0
+				# not enough or exactly same qty in current batch, clear batch
+				available_qty_for_outgoing += flt(batch[0])
+				outgoing_cost += flt(batch[0]) * flt(batch[1])
+				qty_to_pop -= batch[0]
+				previous_stock_queue.pop(0)
+			else:
+				# all from current batch
+				available_qty_for_outgoing += flt(qty_to_pop)
+				outgoing_cost += flt(qty_to_pop) * flt(batch[1])
+				batch[0] -= qty_to_pop
+				qty_to_pop = 0
 
 		return outgoing_cost / available_qty_for_outgoing
 
diff --git a/erpnext/templates/pages/product_search.py b/erpnext/templates/pages/product_search.py
index 236fe5c..f4c4534 100644
--- a/erpnext/templates/pages/product_search.py
+++ b/erpnext/templates/pages/product_search.py
@@ -33,7 +33,7 @@
 
 	for d in data:
 		d.route = ((d.parent_website_route + "/") if d.parent_website_route else "") \
-			+ d.page_name
+			+ (d.page_name or "")
 
 	return [get_item_for_list_in_html(r) for r in data]
 
diff --git a/setup.py b/setup.py
index 96cdbc0..264ec61 100644
--- a/setup.py
+++ b/setup.py
@@ -1,6 +1,6 @@
 from setuptools import setup, find_packages
 
-version = "5.5.0"
+version = "5.5.1"
 
 with open("requirements.txt", "r") as f:
 	install_requires = f.readlines()