Merge branch 'develop'
diff --git a/erpnext/__version__.py b/erpnext/__version__.py
index be4c111..3fe011f 100644
--- a/erpnext/__version__.py
+++ b/erpnext/__version__.py
@@ -1 +1 @@
-__version__ = '4.9.2'
+__version__ = '4.9.3'
diff --git a/erpnext/accounts/doctype/journal_voucher/journal_voucher.js b/erpnext/accounts/doctype/journal_voucher/journal_voucher.js
index 9174873..4ba4dff 100644
--- a/erpnext/accounts/doctype/journal_voucher/journal_voucher.js
+++ b/erpnext/accounts/doctype/journal_voucher/journal_voucher.js
@@ -213,10 +213,11 @@
 		return;
 
 	var update_jv_details = function(doc, r) {
-		$.each(r.message, function(i, d) {
-			var jvdetail = frappe.model.add_child(doc, "Journal Voucher Detail", "entries");
-			jvdetail.account = d.account;
-			jvdetail.balance = d.balance;
+		var jvdetail = frappe.model.add_child(doc, "Journal Voucher Detail", "entries");
+		$.each(r, function(i, d) {
+			var row = frappe.model.add_child(doc, "Journal Voucher Detail", "entries");
+			row.account = d.account;
+			row.balance = d.balance;
 		});
 		refresh_field("entries");
 	}
@@ -231,7 +232,7 @@
 			},
 			callback: function(r) {
 				if(r.message) {
-					update_jv_details(doc, r);
+					update_jv_details(doc, [r.message]);
 				}
 			}
 		})
@@ -245,7 +246,7 @@
 			callback: function(r) {
 				frappe.model.clear_table(doc, "entries");
 				if(r.message) {
-					update_jv_details(doc, r);
+					update_jv_details(doc, r.message);
 				}
 				cur_frm.set_value("is_opening", "Yes")
 			}
diff --git a/erpnext/accounts/doctype/journal_voucher/journal_voucher.py b/erpnext/accounts/doctype/journal_voucher/journal_voucher.py
index c6299ed..7a833f7 100644
--- a/erpnext/accounts/doctype/journal_voucher/journal_voucher.py
+++ b/erpnext/accounts/doctype/journal_voucher/journal_voucher.py
@@ -385,7 +385,7 @@
 		for d in self.get("entries"):
 			master_type, master_name = frappe.db.get_value("Account", d.account,
 				["master_type", "master_name"])
-			if master_type == "Customer" and master_name:
+			if master_type == "Customer" and master_name and flt(d.debit) > 0:
 				super(JournalVoucher, self).check_credit_limit(d.account)
 
 	def get_balance(self):
diff --git a/erpnext/controllers/stock_controller.py b/erpnext/controllers/stock_controller.py
index 0f8eca4..0a9adc0 100644
--- a/erpnext/controllers/stock_controller.py
+++ b/erpnext/controllers/stock_controller.py
@@ -175,7 +175,7 @@
 					_(self.doctype), self.name, item.get("item_code")))
 
 	def get_sl_entries(self, d, args):
-		sl_dict = {
+		sl_dict = frappe._dict({
 			"item_code": d.get("item_code", None),
 			"warehouse": d.get("warehouse", None),
 			"posting_date": self.posting_date,
@@ -192,7 +192,7 @@
 			"serial_no": d.get("serial_no"),
 			"project": d.get("project_name"),
 			"is_cancelled": self.docstatus==2 and "Yes" or "No"
-		}
+		})
 
 		sl_dict.update(args)
 		return sl_dict
diff --git a/erpnext/hooks.py b/erpnext/hooks.py
index 9a70110..25be39d 100644
--- a/erpnext/hooks.py
+++ b/erpnext/hooks.py
@@ -4,7 +4,7 @@
 app_description = "Open Source Enterprise Resource Planning for Small and Midsized Organizations"
 app_icon = "icon-th"
 app_color = "#e74c3c"
-app_version = "4.9.2"
+app_version = "4.9.3"
 
 error_report_email = "support@erpnext.com"
 
diff --git a/erpnext/public/js/stock_analytics.js b/erpnext/public/js/stock_analytics.js
index a86d7ad..091836f 100644
--- a/erpnext/public/js/stock_analytics.js
+++ b/erpnext/public/js/stock_analytics.js
@@ -131,6 +131,7 @@
 
 			if(me.is_default("warehouse") ? true : me.warehouse == sl.warehouse) {
 				var item = me.item_by_name[sl.item_code];
+				if(item.closing_qty_value==undefined) item.closing_qty_value = 0;
 
 				if(me.value_or_qty!="Quantity") {
 					var wh = me.get_item_warehouse(sl.warehouse, sl.item_code);
diff --git a/erpnext/stock/doctype/delivery_note/delivery_note.py b/erpnext/stock/doctype/delivery_note/delivery_note.py
index 079b7fc..e87a233 100644
--- a/erpnext/stock/doctype/delivery_note/delivery_note.py
+++ b/erpnext/stock/doctype/delivery_note/delivery_note.py
@@ -52,11 +52,15 @@
 			else:
 				df.delete_key("__print_hide")
 
-		toggle_print_hide(self.meta, "currency")
-
 		item_meta = frappe.get_meta("Delivery Note Item")
-		for fieldname in ("rate", "amount", "price_list_rate", "discount_percentage"):
-			toggle_print_hide(item_meta, fieldname)
+		print_hide_fields = {
+			"parent": ["grand_total_export", "rounded_total_export", "in_words_export", "currency", "net_total_export"],
+			"items": ["rate", "amount", "price_list_rate", "discount_percentage"]
+		}
+
+		for key, fieldname in print_hide_fields.items():
+			for f in fieldname:
+				toggle_print_hide(self.meta if key == "parent" else item_meta, f)
 
 	def get_portal_page(self):
 		return "shipment" if self.docstatus==1 else None
diff --git a/erpnext/stock/stock_ledger.py b/erpnext/stock/stock_ledger.py
index edbdb1a..eae1bf6 100644
--- a/erpnext/stock/stock_ledger.py
+++ b/erpnext/stock/stock_ledger.py
@@ -27,7 +27,7 @@
 			if sle.get('is_cancelled') == 'Yes':
 				sle['actual_qty'] = -flt(sle['actual_qty'])
 
-			if sle.get("actual_qty") or sle.voucher_type=="Stock Reconciliation":
+			if sle.get("actual_qty") or sle.get("voucher_type")=="Stock Reconciliation":
 				sle_id = make_entry(sle)
 
 			args = sle.copy()
diff --git a/setup.py b/setup.py
index 4abed79..0e13a53 100644
--- a/setup.py
+++ b/setup.py
@@ -1,7 +1,7 @@
 from setuptools import setup, find_packages
 import os
 
-version = "4.9.2"
+version = "4.9.3"
 
 with open("requirements.txt", "r") as f:
 	install_requires = f.readlines()