Merge branch 'master' of github.com:webnotes/erpnext
diff --git a/accounts/doctype/sales_invoice/sales_invoice.js b/accounts/doctype/sales_invoice/sales_invoice.js
index a8894c5..bc36f58 100644
--- a/accounts/doctype/sales_invoice/sales_invoice.js
+++ b/accounts/doctype/sales_invoice/sales_invoice.js
@@ -25,9 +25,8 @@
 				this.frm.set_df_property("debit_to", "print_hide", 0);
 			}
 		}
-		
 		// if(this.frm.doc.is_pos && this.frm.doc.docstatus===0) {
-		// 	cur_frm.cscript.toggle_pos(true);
+		//   cur_frm.cscript.toggle_pos(true);
 		// }
 	},
 	
diff --git a/hr/doctype/employee/employee.js b/hr/doctype/employee/employee.js
index 92dc7f9..9ee7c61 100644
--- a/hr/doctype/employee/employee.js
+++ b/hr/doctype/employee/employee.js
@@ -30,11 +30,12 @@
 		return this.frm.call({
 			method:"hr.utils.get_leave_approver_list",
 			callback: function(r) {
-				me.frm.fields_dict.employee_leave_approvers.grid
-					.get_field("leave_approver").df.options =
-					$.map(r.message, function(profile) { 
-						return {value: profile, label: wn.user_info(profile).fullname}; 
-					});
+				var df = wn.meta.get_docfield("Employee Leave Approver", "leave_approver",
+					me.frm.doc.name);
+				df.options = $.map(r.message, function(profile) { 
+					return {value: profile, label: wn.user_info(profile).fullname}; 
+				});
+				me.frm.fields_dict.employee_leave_approvers.refresh();
 			}
 		});
 	},
diff --git a/hr/doctype/leave_application/leave_application.js b/hr/doctype/leave_application/leave_application.js
index 8726403..4c7d356 100755
--- a/hr/doctype/leave_application/leave_application.js
+++ b/hr/doctype/leave_application/leave_application.js
@@ -10,7 +10,6 @@
 		cur_frm.set_value("status", "Open");
 		cur_frm.cscript.calculate_total_days(doc, dt, dn);
 	}
-	cur_frm.set_df_property("leave_approver", "options", "");
 	return cur_frm.call({
 		method:"hr.utils.get_leave_approver_list",
 		callback: function(r) {
diff --git a/patches/august_2013/p01_hr_settings.py b/patches/august_2013/p01_hr_settings.py
index 302611b..d34ef52 100644
--- a/patches/august_2013/p01_hr_settings.py
+++ b/patches/august_2013/p01_hr_settings.py
@@ -1,6 +1,7 @@
 # Copyright (c) 2013, Web Notes Technologies Pvt. Ltd.
 # License: GNU General Public License v3. See license.txt
 
+from __future__ import unicode_literals
 import webnotes
 
 def execute():
diff --git a/public/js/transaction.js b/public/js/transaction.js
index 7a1dc0c..67204f3 100644
--- a/public/js/transaction.js
+++ b/public/js/transaction.js
@@ -32,6 +32,21 @@
 		}
 	},
 	
+	onload_post_render: function() {
+		if(this.frm.doc.__islocal && this.frm.doc.company && !this.frm.doc.customer) {
+			var me = this;
+			return this.frm.call({
+				doc: this.frm.doc,
+				method: "onload_post_render",
+				freeze: true,
+				callback: function(r) {
+					// remove this call when using client side mapper
+					me.set_default_values();
+				}
+			});
+		}
+	},
+	
 	refresh: function() {
 		this.frm.clear_custom_buttons();
 		erpnext.hide_naming_series();
@@ -44,6 +59,17 @@
 		this.calculate_taxes_and_totals();
 	},
 	
+	set_default_values: function() {
+		$.each(wn.model.get_doclist(this.frm.doctype, this.frm.docname), function(i, doc) {
+			var updated = wn.model.set_default_values(doc);
+			if(doc.parentfield) {
+				refresh_field(doc.parentfield);
+			} else {
+				refresh_field(updated);
+			}
+		});
+	},
+	
 	company: function() {
 		if(this.frm.doc.company && this.frm.fields_dict.currency) {
 			if(!this.frm.doc.currency) {
diff --git a/setup/doctype/global_defaults/global_defaults.txt b/setup/doctype/global_defaults/global_defaults.txt
index 8f5b940..fbfa8ca 100644
--- a/setup/doctype/global_defaults/global_defaults.txt
+++ b/setup/doctype/global_defaults/global_defaults.txt
@@ -2,7 +2,7 @@
  {
   "creation": "2013-05-02 17:53:24", 
   "docstatus": 0, 
-  "modified": "2013-08-02 13:45:12", 
+  "modified": "2013-08-06 11:22:22", 
   "modified_by": "Administrator", 
   "owner": "Administrator"
  }, 
@@ -71,7 +71,8 @@
   "read_only": 0
  }, 
  {
-  "description": "Precision for Float fields (quantities, discounts, percentages etc) only for display. Floats will still be calculated up to 6 decimals.", 
+  "default": "3", 
+  "description": "Precision for Float fields (quantities, discounts, percentages etc). Floats will be rounded up to specified decimals. Default = 3", 
   "doctype": "DocField", 
   "fieldname": "float_precision", 
   "fieldtype": "Select", 
diff --git a/stock/doctype/delivery_note/delivery_note.py b/stock/doctype/delivery_note/delivery_note.py
index 26b7f25..679d743 100644
--- a/stock/doctype/delivery_note/delivery_note.py
+++ b/stock/doctype/delivery_note/delivery_note.py
@@ -289,6 +289,9 @@
 				
 				if d['reserved_qty'] < 0 :
 					# Reduce reserved qty from reserved warehouse mentioned in so
+					if not d["reserved_warehouse"]:
+						webnotes.throw(_("Reserved Warehouse is missing in Sales Order"))
+						
 					args = {
 						"item_code": d['item_code'],
 						"voucher_type": self.doc.doctype,
diff --git a/stock/report/warehouse_wise_stock_balance/warehouse_wise_stock_balance.py b/stock/report/warehouse_wise_stock_balance/warehouse_wise_stock_balance.py
index 6ecfe7a..4d42c22 100644
--- a/stock/report/warehouse_wise_stock_balance/warehouse_wise_stock_balance.py
+++ b/stock/report/warehouse_wise_stock_balance/warehouse_wise_stock_balance.py
@@ -29,8 +29,8 @@
 	"""return columns based on filters"""
 	
 	columns = ["Item:Link/Item:100", "Item Name::150", "Description::150", \
-	"Warehouse:Link/Warehouse:100", "Opening Qty::90", \
-	"In Qty::80", "Out Qty::80", "Balance Qty::90", "Company:Link/Company:100"]
+	"Warehouse:Link/Warehouse:100", "Opening Qty:Float:90", \
+	"In Qty:Float:80", "Out Qty:Float:80", "Balance Qty:Float:90", "Company:Link/Company:100"]
 
 	return columns
 
diff --git a/support/doctype/newsletter/newsletter.js b/support/doctype/newsletter/newsletter.js
index 8cbf8fc..0531196 100644
--- a/support/doctype/newsletter/newsletter.js
+++ b/support/doctype/newsletter/newsletter.js
@@ -1,6 +1,17 @@
 // Copyright (c) 2013, Web Notes Technologies Pvt. Ltd.
 // License: GNU General Public License v3. See license.txt
 
+cur_frm.cscript.onload = function(doc) {
+	return wn.call({
+		method: "support.doctype.newsletter.newsletter.get_lead_options",
+		type: "GET",
+		callback: function(r) {
+			set_field_options("lead_source", r.message.sources.join("\n"))
+			set_field_options("lead_status", r.message.statuses.join("\n"))
+		}
+	});
+}
+
 cur_frm.cscript.refresh = function(doc) {
 	erpnext.hide_naming_series();
 	if(!doc.__islocal && !cint(doc.email_sent) && !doc.__unsaved
@@ -11,18 +22,42 @@
 			});
 		})
 	}
+	
+	cur_frm.cscript.setup_dashboard();
 
 	if(doc.__islocal && !doc.send_from) {
 		cur_frm.set_value("send_from", 
 			repl("%(fullname)s <%(email)s>", wn.user_info(doc.owner)));
 	}
-	
-	return wn.call({
-		method: "support.doctype.newsletter.newsletter.get_lead_options",
-		type: "GET",
-		callback: function(r) {
-			set_field_options("lead_source", r.message.sources.join("\n"))
-			set_field_options("lead_status", r.message.statuses.join("\n"))
+}
+
+cur_frm.cscript.setup_dashboard = function() {
+	cur_frm.dashboard.reset();
+	if(!cur_frm.doc.__islocal && cint(cur_frm.doc.email_sent) && cur_frm.doc.__status_count) {
+		var stat = cur_frm.doc.__status_count;
+		var total = wn.utils.sum($.map(stat, function(v) { return v; }));
+		if(total) {
+			$.each(stat, function(k, v) {
+				stat[k] = flt(v * 100 / total, 2);
+			});
+			
+			cur_frm.dashboard.add_progress("Status", [
+				{
+					title: stat["Sent"] + "% Sent",
+					width: stat["Sent"],
+					progress_class: "progress-bar-success"
+				},
+				{
+					title: stat["Sending"] + "% Sending",
+					width: stat["Sending"],
+					progress_class: "progress-bar-warning"
+				},
+				{
+					title: stat["Error"] + "% Error",
+					width: stat["Error"],
+					progress_class: "progress-bar-danger"
+				}
+			]);
 		}
-	})
+	}
 }
\ No newline at end of file
diff --git a/support/doctype/newsletter/newsletter.py b/support/doctype/newsletter/newsletter.py
index cdfd370..b201cc5 100644
--- a/support/doctype/newsletter/newsletter.py
+++ b/support/doctype/newsletter/newsletter.py
@@ -11,6 +11,12 @@
 class DocType():
 	def __init__(self, d, dl):
 		self.doc, self.doclist = d, dl
+		
+	def onload(self):
+		if self.doc.email_sent:
+			self.doc.fields["__status_count"] = dict(webnotes.conn.sql("""select status, count(*)
+				from `tabBulk Email` where ref_doctype=%s and ref_docname=%s
+				group by status""", (self.doc.doctype, self.doc.name))) or None
 
 	def test_send(self, doctype="Lead"):
 		self.recipients = self.doc.test_email_id.split(",")
@@ -74,7 +80,8 @@
 		
 		send(recipients = self.recipients, sender = sender, 
 			subject = self.doc.subject, message = self.doc.message,
-			doctype = self.send_to_doctype, email_field = "email_id")
+			doctype = self.send_to_doctype, email_field = "email_id",
+			ref_doctype = self.doc.doctype, ref_docname = self.doc.name)
 
 		webnotes.conn.auto_commit_on_many_writes = False
 
@@ -91,8 +98,10 @@
 @webnotes.whitelist()
 def get_lead_options():
 	return {
-		"sources": ["All"] + webnotes.conn.sql_list("""select distinct source from tabLead"""),
-		"statuses": ["All"]+ webnotes.conn.sql_list("""select distinct status from tabLead""")
+		"sources": ["All"] + filter(None, 
+			webnotes.conn.sql_list("""select distinct source from tabLead""")),
+		"statuses": ["All"] + filter(None, 
+			webnotes.conn.sql_list("""select distinct status from tabLead"""))
 	}
 
 
diff --git a/website/helpers/blog.py b/website/helpers/blog.py
index 005bdb8..f8f7a42 100644
--- a/website/helpers/blog.py
+++ b/website/helpers/blog.py
@@ -41,7 +41,7 @@
 	import webnotes.utils
 	
 	for res in result:
-		from webnotes.utils import global_date_format, get_fullname
+		from webnotes.utils import global_date_format
 		res['published'] = global_date_format(res['creation'])
 		if not res['content']:
 			res['content'] = webnotes.webutils.get_html(res['page_name'])
@@ -101,28 +101,11 @@
 		doctype='Comment', 
 		email_field='comment_by', 
 		subject='New Comment on Blog: ' + blog.title, 
-		message='%(comment)s<p>By %(comment_by_fullname)s</p>' % args)
+		message='%(comment)s<p>By %(comment_by_fullname)s</p>' % args,
+		ref_doctype='Blog Post', ref_docname=blog.name)
 	
 	return comment_html.replace("\n", "")
 
-@webnotes.whitelist(allow_guest=True)
-def add_subscriber(name, email_id):
-	"""add blog subscriber to lead"""
-	name = webnotes.conn.sql("""select name from tabLead where email_id=%s""", email)
-	
-	from webnotes.model.doc import Document
-	if name:
-		lead = Document('Lead', name[0][0])
-	else:
-		lead = Document('Lead')
-	
-	if not lead.source: lead.source = 'Blog'
-	lead.unsubscribed = 0
-	lead.blog_subscriber = 1
-	lead.lead_name = name
-	lead.email_id = email
-	lead.save()
-
 def get_blog_content(blog_page_name):
 	import webnotes.webutils
 	content = webnotes.webutils.get_html(blog_page_name)