Merge branch 'master' of github.com:webnotes/erpnext
diff --git a/accounts/doctype/account/account.js b/accounts/doctype/account/account.js
index 9a8115e..eb8e765 100644
--- a/accounts/doctype/account/account.js
+++ b/accounts/doctype/account/account.js
@@ -104,7 +104,7 @@
 // Convert group to ledger
 // -----------------------------------------
 cur_frm.cscript.convert_to_ledger = function(doc, cdt, cdn) {
-  $c_obj(cur_frm.get_doclist(),'convert_group_to_ledger','',function(r,rt) {
+  return $c_obj(cur_frm.get_doclist(),'convert_group_to_ledger','',function(r,rt) {
     if(r.message == 1) {  
 	  cur_frm.refresh();
     }
@@ -114,7 +114,7 @@
 // Convert ledger to group
 // -----------------------------------------
 cur_frm.cscript.convert_to_group = function(doc, cdt, cdn) {
-  $c_obj(cur_frm.get_doclist(),'convert_ledger_to_group','',function(r,rt) {
+  return $c_obj(cur_frm.get_doclist(),'convert_ledger_to_group','',function(r,rt) {
     if(r.message == 1) {
 	  cur_frm.refresh();
     }
diff --git a/accounts/doctype/budget_distribution/budget_distribution.js b/accounts/doctype/budget_distribution/budget_distribution.js
index 5abd525..29e5e33 100644
--- a/accounts/doctype/budget_distribution/budget_distribution.js
+++ b/accounts/doctype/budget_distribution/budget_distribution.js
@@ -20,7 +20,7 @@
       refresh_field('budget_distribution_details');
     }
     
-    $c('runserverobj',args={'method' : 'get_months', 'docs' : 
+    return $c('runserverobj',args={'method' : 'get_months', 'docs' : 
 		wn.model.compress(make_doclist(doc.doctype, doc.name))},callback1);
   }
 }
diff --git a/accounts/doctype/c_form/c_form.js b/accounts/doctype/c_form/c_form.js
index 35656e9..0bc9ff1 100644
--- a/accounts/doctype/c_form/c_form.js
+++ b/accounts/doctype/c_form/c_form.js
@@ -34,5 +34,5 @@
 
 cur_frm.cscript.invoice_no = function(doc, cdt, cdn) {
 	var d = locals[cdt][cdn];
-	get_server_fields('get_invoice_details', d.invoice_no, 'invoice_details', doc, cdt, cdn, 1);
+	return get_server_fields('get_invoice_details', d.invoice_no, 'invoice_details', doc, cdt, cdn, 1);
 }
\ No newline at end of file
diff --git a/accounts/doctype/cost_center/cost_center.js b/accounts/doctype/cost_center/cost_center.js
index 96af1cf..7dc4223 100644
--- a/accounts/doctype/cost_center/cost_center.js
+++ b/accounts/doctype/cost_center/cost_center.js
@@ -84,7 +84,7 @@
 }
 
 cur_frm.cscript.convert_to_ledger = function(doc, cdt, cdn) {
-	$c_obj(cur_frm.get_doclist(),'convert_group_to_ledger','',function(r,rt) {
+	return $c_obj(cur_frm.get_doclist(),'convert_group_to_ledger','',function(r,rt) {
 		if(r.message == 1) {
 			cur_frm.refresh();
 		}
@@ -92,7 +92,7 @@
 }
 
 cur_frm.cscript.convert_to_group = function(doc, cdt, cdn) {
-	$c_obj(cur_frm.get_doclist(),'convert_ledger_to_group','',function(r,rt) {
+	return $c_obj(cur_frm.get_doclist(),'convert_ledger_to_group','',function(r,rt) {
 		if(r.message == 1) {
 			cur_frm.refresh();
 		}
diff --git a/accounts/doctype/fiscal_year/fiscal_year.js b/accounts/doctype/fiscal_year/fiscal_year.js
index 6e0ed38..0f70cf5 100644
--- a/accounts/doctype/fiscal_year/fiscal_year.js
+++ b/accounts/doctype/fiscal_year/fiscal_year.js
@@ -24,7 +24,7 @@
 }
 
 cur_frm.cscript.set_as_default = function() {
-	wn.call({
+	return wn.call({
 		doc: cur_frm.doc,
 		method: "set_as_default"
 	});
diff --git a/accounts/doctype/gl_entry/gl_entry.py b/accounts/doctype/gl_entry/gl_entry.py
index 1d0ec8e..60c37a4 100644
--- a/accounts/doctype/gl_entry/gl_entry.py
+++ b/accounts/doctype/gl_entry/gl_entry.py
@@ -151,7 +151,7 @@
 				balance = webnotes.conn.sql("""select sum(debit) - sum(credit) from `tabGL Entry` 
 					where account = %s and ifnull(is_cancelled, 'No') = 'No'""", self.doc.account)
 				balance = account["debit_or_credit"] == "Debit" and \
-					balance[0][0] or -1*balance[0][0]
+					flt(balance[0][0]) or -1*flt(balance[0][0])
 			
 				if flt(balance) < 0:
 					msgprint(_("Negative balance is not allowed for account ") + self.doc.account, 
diff --git a/accounts/doctype/journal_voucher/journal_voucher.js b/accounts/doctype/journal_voucher/journal_voucher.js
index ab4b2b0..867ebbb 100644
--- a/accounts/doctype/journal_voucher/journal_voucher.js
+++ b/accounts/doctype/journal_voucher/journal_voucher.js
@@ -18,10 +18,20 @@
 
 erpnext.accounts.JournalVoucher = wn.ui.form.Controller.extend({
 	onload: function() {
-		this.load_defaults(this.frm.doc);
+		this.load_defaults();
 		this.setup_queries();
 	},
 	
+	load_defaults: function() {
+		if(this.frm.doc.__islocal && this.frm.doc.company) {
+			wn.model.set_default_values(this.frm.doc);
+			$.each(wn.model.get_doclist(this.frm.doc.doctype, this.frm.doc.name, {parentfield: "entries"}),
+				function(i, jvd) { wn.model.set_default_values(jvd); });
+			
+			this.frm.doc.posting_date = get_today();
+		}
+	},
+	
 	setup_queries: function() {
 		var me = this;
 		
@@ -82,23 +92,6 @@
 	}
 }
 
-cur_frm.cscript.load_defaults = function(doc) {
-	if(!cur_frm.doc.__islocal || !cur_frm.doc.company) { return; }
-
-	doc = locals[doc.doctype][doc.name];
-	var fields_to_refresh = wn.model.set_default_values(doc);
-	if(fields_to_refresh) { refresh_many(fields_to_refresh); }
-
-	fields_to_refresh = null;
-	var children = getchildren('Journal Voucher Detail', doc.name, 'entries');
-	if(!children) { return; }
-	for(var i=0; i<children.length; i++) {
-		wn.model.set_default_values(children[i]);
-	}
-	refresh_field('entries');
-}
-
-
 cur_frm.cscript.is_opening = function(doc, cdt, cdn) {
 	hide_field('aging_date');
 	if (doc.is_opening == 'Yes') unhide_field('aging_date');
@@ -108,7 +101,7 @@
 	var d = locals[cdt][cdn];
 	if (d.against_voucher && !flt(d.debit)) {
 		args = {'doctype': 'Purchase Invoice', 'docname': d.against_voucher }
-		get_server_fields('get_outstanding',docstring(args),'entries',doc,cdt,cdn,1,function(r,rt) { cur_frm.cscript.update_totals(doc); });
+		return get_server_fields('get_outstanding',docstring(args),'entries',doc,cdt,cdn,1,function(r,rt) { cur_frm.cscript.update_totals(doc); });
 	}
 }
 
@@ -116,7 +109,7 @@
 	var d = locals[cdt][cdn];
 	if (d.against_invoice && !flt(d.credit)) {
 		args = {'doctype': 'Sales Invoice', 'docname': d.against_invoice }
-		get_server_fields('get_outstanding',docstring(args),'entries',doc,cdt,cdn,1,function(r,rt) { cur_frm.cscript.update_totals(doc); });
+		return get_server_fields('get_outstanding',docstring(args),'entries',doc,cdt,cdn,1,function(r,rt) { cur_frm.cscript.update_totals(doc); });
 	}
 }
 
@@ -141,7 +134,7 @@
 
 cur_frm.cscript.get_balance = function(doc,dt,dn) {
 	cur_frm.cscript.update_totals(doc); 
-	$c_obj(make_doclist(dt,dn), 'get_balance', '', function(r, rt){
+	return $c_obj(make_doclist(dt,dn), 'get_balance', '', function(r, rt){
 	cur_frm.refresh();
 	});
 }
@@ -151,7 +144,7 @@
 cur_frm.cscript.account = function(doc,dt,dn) {
 	var d = locals[dt][dn];
 	if(d.account) {
-		wn.call({
+		return wn.call({
 			method: "accounts.utils.get_balance_on",
 			args: {account: d.account, date: doc.posting_date},
 			callback: function(r) {
@@ -193,7 +186,7 @@
 	}
 	
 	if(in_list(["Bank Voucher", "Cash Voucher"], doc.voucher_type)) {
-		wn.call({
+		return wn.call({
 			type: "GET",
 			method: "accounts.doctype.journal_voucher.journal_voucher.get_default_bank_cash_account",
 			args: {
@@ -207,7 +200,7 @@
 			}
 		})
 	} else if(doc.voucher_type=="Opening Entry") {
-		wn.call({
+		return wn.call({
 			type:"GET",
 			method: "accounts.doctype.journal_voucher.journal_voucher.get_opening_accounts",
 			args: {
diff --git a/accounts/doctype/payment_to_invoice_matching_tool/payment_to_invoice_matching_tool.js b/accounts/doctype/payment_to_invoice_matching_tool/payment_to_invoice_matching_tool.js
index 3230ecf..d8c8c81 100644
--- a/accounts/doctype/payment_to_invoice_matching_tool/payment_to_invoice_matching_tool.js
+++ b/accounts/doctype/payment_to_invoice_matching_tool/payment_to_invoice_matching_tool.js
@@ -49,11 +49,11 @@
 }
 
 cur_frm.cscript.voucher_no  =function(doc, cdt, cdn) {
-	get_server_fields('get_voucher_details', '', '', doc, cdt, cdn, 1)
+	return get_server_fields('get_voucher_details', '', '', doc, cdt, cdn, 1)
 }
 
 cur_frm.cscript.account = function(doc, cdt, cdn) {
-	wn.call({
+	return wn.call({
 		doc: this.frm.doc,
 		method: "set_account_type",
 		callback: function(r) {
diff --git a/accounts/doctype/pos_setting/pos_setting.js b/accounts/doctype/pos_setting/pos_setting.js
index 653b631..c91e4ce 100755
--- a/accounts/doctype/pos_setting/pos_setting.js
+++ b/accounts/doctype/pos_setting/pos_setting.js
@@ -15,7 +15,7 @@
 // along with this program.	If not, see <http://www.gnu.org/licenses/>.
 
 cur_frm.cscript.onload = function(doc,cdt,cdn){
-	$c_obj(make_doclist(cdt,cdn),'get_series','',function(r,rt){
+	return $c_obj(make_doclist(cdt,cdn),'get_series','',function(r,rt){
 		if(r.message) set_field_options('naming_series', r.message);
 	});
 	
diff --git a/accounts/doctype/purchase_invoice/purchase_invoice.js b/accounts/doctype/purchase_invoice/purchase_invoice.js
index e73386f..e71a408 100644
--- a/accounts/doctype/purchase_invoice/purchase_invoice.js
+++ b/accounts/doctype/purchase_invoice/purchase_invoice.js
@@ -118,7 +118,7 @@
 }
 
 cur_frm.cscript.make_bank_voucher = function() {
-	wn.call({
+	return wn.call({
 		method: "accounts.doctype.journal_voucher.journal_voucher.get_default_bank_cash_account",
 		args: {
 			"company": cur_frm.doc.company,
diff --git a/accounts/doctype/purchase_taxes_and_charges_master/purchase_taxes_and_charges_master.js b/accounts/doctype/purchase_taxes_and_charges_master/purchase_taxes_and_charges_master.js
index ba1a06b..626171c 100644
--- a/accounts/doctype/purchase_taxes_and_charges_master/purchase_taxes_and_charges_master.js
+++ b/accounts/doctype/purchase_taxes_and_charges_master/purchase_taxes_and_charges_master.js
@@ -156,7 +156,7 @@
   }
   else if(d.account_head && d.charge_type) {
     arg = "{'charge_type' : '" + d.charge_type + "', 'account_head' : '" + d.account_head + "'}";
-    get_server_fields('get_rate', arg, 'purchase_tax_details', doc, cdt, cdn, 1);
+    return get_server_fields('get_rate', arg, 'purchase_tax_details', doc, cdt, cdn, 1);
   }
   refresh_field('account_head',d.name,'purchase_tax_details');
 }
diff --git a/accounts/doctype/sales_invoice/sales_invoice.js b/accounts/doctype/sales_invoice/sales_invoice.js
index 99f596c..345dbc9 100644
--- a/accounts/doctype/sales_invoice/sales_invoice.js
+++ b/accounts/doctype/sales_invoice/sales_invoice.js
@@ -133,21 +133,25 @@
 	},
 	
 	is_pos: function() {
+		cur_frm.cscript.hide_fields(this.frm.doc);
+		
 		if(cint(this.frm.doc.is_pos)) {
 			if(!this.frm.doc.company) {
 				this.frm.set_value("is_pos", 0);
 				msgprint(wn._("Please specify Company to proceed"));
 			} else {
 				var me = this;
-				this.frm.call({
+				return this.frm.call({
 					doc: me.frm.doc,
 					method: "set_missing_values",
+					callback: function(r) {
+						if(!r.exc) {
+							me.frm.script_manager.trigger("update_stock");
+						}
+					}
 				});
 			}
 		}
-		
-		// TODO toggle display of fields
-		cur_frm.cscript.hide_fields(this.frm.doc);
 	},
 	
 	debit_to: function() {
@@ -191,8 +195,7 @@
 // Hide Fields
 // ------------
 cur_frm.cscript.hide_fields = function(doc) {
-	par_flds = ['project_name', 'due_date', 'is_opening', 'conversion_rate',
-	'source', 'total_advance', 'gross_profit',
+	par_flds = ['project_name', 'due_date', 'is_opening', 'source', 'total_advance', 'gross_profit',
 	'gross_profit_percent', 'get_advances_received',
 	'advance_adjustment_details', 'sales_partner', 'commission_rate',
 	'total_commission', 'advances'];
@@ -222,7 +225,7 @@
 
 
 cur_frm.cscript.mode_of_payment = function(doc) {
-	cur_frm.call({
+	return cur_frm.call({
 		method: "get_bank_cash_account",
 		args: { mode_of_payment: doc.mode_of_payment }
 	});
@@ -248,7 +251,7 @@
 }
 
 cur_frm.cscript.make_bank_voucher = function() {
-	wn.call({
+	return wn.call({
 		method: "accounts.doctype.journal_voucher.journal_voucher.get_default_bank_cash_account",
 		args: {
 			"company": cur_frm.doc.company,
diff --git a/accounts/doctype/sales_taxes_and_charges_master/sales_taxes_and_charges_master.js b/accounts/doctype/sales_taxes_and_charges_master/sales_taxes_and_charges_master.js
index eca6eae..df6aaa9 100644
--- a/accounts/doctype/sales_taxes_and_charges_master/sales_taxes_and_charges_master.js
+++ b/accounts/doctype/sales_taxes_and_charges_master/sales_taxes_and_charges_master.js
@@ -165,7 +165,7 @@
 	}
 	else if(d.account_head && d.charge_type) {
 		arg = "{'charge_type' : '" + d.charge_type +"', 'account_head' : '" + d.account_head + "'}";
-		get_server_fields('get_rate', arg, 'other_charges', doc, cdt, cdn, 1);
+		return get_server_fields('get_rate', arg, 'other_charges', doc, cdt, cdn, 1);
 	}
 	refresh_field('account_head',d.name,'other_charges');
 }
diff --git a/accounts/page/accounts_browser/accounts_browser.js b/accounts/page/accounts_browser/accounts_browser.js
index 30ed5b9..18d43ff 100644
--- a/accounts/page/accounts_browser/accounts_browser.js
+++ b/accounts/page/accounts_browser/accounts_browser.js
@@ -73,7 +73,7 @@
 		})
 		
 	// load up companies
-	wn.call({
+	return wn.call({
 		method:'accounts.page.accounts_browser.accounts_browser.get_companies',
 		callback: function(r) {
 			wrapper.$company_select.empty();
@@ -265,7 +265,7 @@
 			v.master_type = '';
 			v.company = me.company;
 			
-			wn.call({
+			return wn.call({
 				args: v,
 				method:'accounts.utils.add_ac',
 				callback: function(r) {
@@ -312,7 +312,7 @@
 			v.parent_cost_center = node.data('label');
 			v.company = me.company;
 			
-			wn.call({
+			return wn.call({
 				args: v,
 				method:'accounts.utils.add_cc',
 				callback: function(r) {
diff --git a/accounts/page/financial_statements/financial_statements.js b/accounts/page/financial_statements/financial_statements.js
index d562e32..0175da7 100644
--- a/accounts/page/financial_statements/financial_statements.js
+++ b/accounts/page/financial_statements/financial_statements.js
@@ -62,7 +62,7 @@
 	</div>').css({"min-height": "400px"});
 
   // load companies
-  $c_obj('MIS Control','get_comp','', function(r,rt) {    
+  return $c_obj('MIS Control','get_comp','', function(r,rt) {    
     // company
 	erpnext.fs.stmt_company.$input.empty()
 		.add_options(['Select Company...'].concat(r.message.company));
@@ -86,7 +86,7 @@
   	year: erpnext.fs.stmt_fiscal_year.get_value()
   }
 
-  $c_obj('MIS Control', 'get_statement', docstring(arg), function(r,rt) {
+  return $c_obj('MIS Control', 'get_statement', docstring(arg), function(r,rt) {
       var nl = r.message;
       var t = $i('stmt_tree');
       var stmt_type = erpnext.fs.stmt_type.get_value();
diff --git a/buying/doctype/purchase_common/purchase_common.js b/buying/doctype/purchase_common/purchase_common.js
index 87f79a0..dabfcd9 100644
--- a/buying/doctype/purchase_common/purchase_common.js
+++ b/buying/doctype/purchase_common/purchase_common.js
@@ -92,7 +92,7 @@
 				var me = this;
 				var price_list_name = this.frm.doc.price_list_name;
 
-				this.frm.call({
+				return this.frm.call({
 					doc: this.frm.doc,
 					method: "set_supplier_defaults",
 					freeze: true,
@@ -109,7 +109,7 @@
 	supplier_address: function() {
 		var me = this;
 		if (this.frm.doc.supplier) {
-			wn.call({
+			return wn.call({
 				doc: this.frm.doc,
 				method: "set_supplier_address",
 				freeze: true,
@@ -134,7 +134,7 @@
 				item.item_code = null;
 				refresh_field("item_code", item.name, item.parentfield);
 			} else {
-				this.frm.call({
+				return this.frm.call({
 					method: "buying.utils.get_item_details",
 					child: item,
 					args: {
@@ -200,7 +200,7 @@
 		var me = this;
 		var item = wn.model.get_doc(cdt, cdn);
 		if(item.item_code && item.uom) {
-			this.frm.call({
+			return this.frm.call({
 				method: "buying.utils.get_conversion_factor",
 				child: item,
 				args: {
@@ -233,7 +233,7 @@
 	warehouse: function(doc, cdt, cdn) {
 		var item = wn.model.get_doc(cdt, cdn);
 		if(item.item_code && item.warehouse) {
-			this.frm.call({
+			return this.frm.call({
 				method: "buying.utils.get_projected_qty",
 				child: item,
 				args: {
@@ -267,7 +267,7 @@
 	purchase_other_charges: function() {
 		var me = this;
 		if(this.frm.doc.purchase_other_charges) {
-			this.frm.call({
+			return this.frm.call({
 				doc: this.frm.doc,
 				method: "get_purchase_tax_details",
 				callback: function(r) {
diff --git a/buying/doctype/purchase_common/purchase_common.py b/buying/doctype/purchase_common/purchase_common.py
index e14b1ca..d1da223 100644
--- a/buying/doctype/purchase_common/purchase_common.py
+++ b/buying/doctype/purchase_common/purchase_common.py
@@ -76,7 +76,11 @@
 			elif is_submit == 1:
 				# even if this transaction is the latest one, it should be submitted
 				# for it to be considered for latest purchase rate
-				last_purchase_rate = flt(d.purchase_rate) / flt(d.conversion_factor)
+				if flt(d.conversion_factor):
+					last_purchase_rate = flt(d.purchase_rate) / flt(d.conversion_factor)
+				else:
+					msgprint(_("Row ") + cstr(d.idx) + ": " + 
+						_("UOM Conversion Factor is mandatory"), raise_exception=1)
 
 			# update last purchsae rate
 			if last_purchase_rate:
diff --git a/buying/doctype/purchase_order/purchase_order.js b/buying/doctype/purchase_order/purchase_order.js
index 99149bc..360170a 100644
--- a/buying/doctype/purchase_order/purchase_order.js
+++ b/buying/doctype/purchase_order/purchase_order.js
@@ -140,7 +140,7 @@
 }
 
 cur_frm.cscript.get_last_purchase_rate = function(doc, cdt, cdn){
-	$c_obj(make_doclist(doc.doctype, doc.name), 'get_last_purchase_rate', '', function(r, rt) { 
+	return $c_obj(make_doclist(doc.doctype, doc.name), 'get_last_purchase_rate', '', function(r, rt) { 
 		refresh_field(cur_frm.cscript.fname);
 		var doc = locals[cdt][cdn];
 		cur_frm.cscript.calc_amount( doc, 2);
@@ -152,7 +152,7 @@
 	var check = confirm("Do you really want to STOP " + doc.name);
 
 	if (check) {
-		$c('runserverobj', args={'method':'update_status', 'arg': 'Stopped', 'docs': wn.model.compress(make_doclist(doc.doctype, doc.name))}, function(r,rt) {
+		return $c('runserverobj', args={'method':'update_status', 'arg': 'Stopped', 'docs': wn.model.compress(make_doclist(doc.doctype, doc.name))}, function(r,rt) {
 			cur_frm.refresh();
 		});	
 	}
@@ -163,7 +163,7 @@
 	var check = confirm("Do you really want to UNSTOP " + doc.name);
 
 	if (check) {
-		$c('runserverobj', args={'method':'update_status', 'arg': 'Submitted', 'docs': wn.model.compress(make_doclist(doc.doctype, doc.name))}, function(r,rt) {
+		return $c('runserverobj', args={'method':'update_status', 'arg': 'Submitted', 'docs': wn.model.compress(make_doclist(doc.doctype, doc.name))}, function(r,rt) {
 			cur_frm.refresh();
 		});	
 	}
diff --git a/buying/doctype/quality_inspection/quality_inspection.js b/buying/doctype/quality_inspection/quality_inspection.js
index 995119c..7c93209 100644
--- a/buying/doctype/quality_inspection/quality_inspection.js
+++ b/buying/doctype/quality_inspection/quality_inspection.js
@@ -16,7 +16,7 @@
 
 cur_frm.cscript.item_code = function(doc, cdt, cdn) {
 	if (doc.item_code)
-		get_server_fields('get_purchase_receipt_item_details','','',doc,cdt,cdn,1);
+		return get_server_fields('get_purchase_receipt_item_details','','',doc,cdt,cdn,1);
 }
 
 cur_frm.cscript.inspection_type = function(doc, cdt, cdn) {
diff --git a/buying/doctype/supplier/supplier.js b/buying/doctype/supplier/supplier.js
index 5374d50..2aa9b5e 100644
--- a/buying/doctype/supplier/supplier.js
+++ b/buying/doctype/supplier/supplier.js
@@ -55,7 +55,7 @@
 	cur_frm.dashboard.add_doctype_badge("Purchase Receipt", "supplier");
 	cur_frm.dashboard.add_doctype_badge("Purchase Invoice", "supplier");
 
-	wn.call({
+	return wn.call({
 		type: "GET",
 		method:"buying.doctype.supplier.supplier.get_dashboard_info",
 		args: {
diff --git a/controllers/queries.py b/controllers/queries.py
index 219fc74..caa2f6f 100644
--- a/controllers/queries.py
+++ b/controllers/queries.py
@@ -36,12 +36,8 @@
 	return cond
 
 def get_match_cond(doctype, searchfield = 'name'):
-	meta = webnotes.get_doctype(doctype)
-	from webnotes.widgets.search import get_std_fields_list
-	fields = get_std_fields_list(meta, searchfield)
-
 	from webnotes.widgets.reportview import build_match_conditions
-	cond = build_match_conditions(doctype, fields)
+	cond = build_match_conditions(doctype)
 
 	if cond:
 		cond = ' and ' + cond
diff --git a/home/page/latest_updates/latest_updates.js b/home/page/latest_updates/latest_updates.js
index 423f76e..dcdbed9 100644
--- a/home/page/latest_updates/latest_updates.js
+++ b/home/page/latest_updates/latest_updates.js
@@ -9,7 +9,7 @@
 	parent.html('<div class="progress progress-striped active">\
 		<div class="progress-bar" style="width: 100%;"></div></div>')
 	
-	wn.call({
+	return wn.call({
 		method:"home.page.latest_updates.latest_updates.get",
 		callback: function(r) {
 			parent.empty();
diff --git a/hr/doctype/appraisal/appraisal.js b/hr/doctype/appraisal/appraisal.js
index 2289064..3ac62b1 100644
--- a/hr/doctype/appraisal/appraisal.js
+++ b/hr/doctype/appraisal/appraisal.js
@@ -44,7 +44,7 @@
 }
 
 cur_frm.cscript.calculate_total_score = function(doc,cdt,cdn){
-	//get_server_fields('calculate_total','','',doc,cdt,cdn,1);
+	//return get_server_fields('calculate_total','','',doc,cdt,cdn,1);
 	var val = getchildren('Appraisal Goal', doc.name, 'appraisal_details', doc.doctype);
 	var total =0;
 	for(var i = 0; i<val.length; i++){
diff --git a/hr/doctype/employee/employee.js b/hr/doctype/employee/employee.js
index 398d8f8..5522ff2 100644
--- a/hr/doctype/employee/employee.js
+++ b/hr/doctype/employee/employee.js
@@ -40,7 +40,7 @@
 	
 	setup_leave_approver_select: function() {
 		var me = this;
-		this.frm.call({
+		return this.frm.call({
 			method:"hr.utils.get_leave_approver_list",
 			callback: function(r) {
 				me.frm.fields_dict.employee_leave_approvers.grid
@@ -53,7 +53,7 @@
 	},
 	
 	date_of_birth: function() {
-		cur_frm.call({
+		return cur_frm.call({
 			method: "get_retirement_date",
 			args: {date_of_birth: this.frm.doc.date_of_birth}
 		});
@@ -88,7 +88,7 @@
 	
 	validate_salary_structure: function(btn, callback) {
 		var me = this;
-		this.frm.call({
+		return this.frm.call({
 			btn: btn,
 			method: "webnotes.client.get_value",
 			args: {
diff --git a/hr/doctype/expense_claim/expense_claim.js b/hr/doctype/expense_claim/expense_claim.js
index ce3cbea..243075d 100644
--- a/hr/doctype/expense_claim/expense_claim.js
+++ b/hr/doctype/expense_claim/expense_claim.js
@@ -19,7 +19,7 @@
 erpnext.hr.ExpenseClaimController = wn.ui.form.Controller.extend({
 	make_bank_voucher: function() {
 		var me = this;
-		wn.call({
+		return wn.call({
 			method: "accounts.doctype.journal_voucher.journal_voucher.get_default_bank_cash_account",
 			args: {
 				"company": cur_frm.doc.company,
@@ -63,19 +63,19 @@
 			cur_frm.set_value("approval_status", "Draft");
 		cur_frm.cscript.clear_sanctioned(doc);
 	}
-
-	cur_frm.call({
-		method:"hr.utils.get_expense_approver_list",
-		callback: function(r) {
-			cur_frm.set_df_property("exp_approver", "options", r.message);
-		}
-	});
 	
 	cur_frm.fields_dict.employee.get_query = function(doc,cdt,cdn) {
 		return{
 			query:"controllers.queries.employee_query"
 		}	
 	}
+
+	return cur_frm.call({
+		method:"hr.utils.get_expense_approver_list",
+		callback: function(r) {
+			cur_frm.set_df_property("exp_approver", "options", r.message);
+		}
+	});
 }
 
 cur_frm.cscript.clear_sanctioned = function(doc) {
diff --git a/hr/doctype/leave_allocation/leave_allocation.js b/hr/doctype/leave_allocation/leave_allocation.js
index 80445c1..a567275 100755
--- a/hr/doctype/leave_allocation/leave_allocation.js
+++ b/hr/doctype/leave_allocation/leave_allocation.js
@@ -72,7 +72,7 @@
 // ---------------------------------
 calculate_total_leaves_allocated = function(doc, dt, dn) {
   if(cint(doc.carry_forward) == 1 && doc.leave_type && doc.fiscal_year && doc.employee){
-    get_server_fields('get_carry_forwarded_leaves','','', doc, dt, dn, 1);
+    return get_server_fields('get_carry_forwarded_leaves','','', doc, dt, dn, 1);
 	}
   else if(cint(doc.carry_forward) == 0){
     set_multiple(dt,dn,{carry_forwarded_leaves : 0,total_leaves_allocated : flt(doc.new_leaves_allocated)});
diff --git a/hr/doctype/leave_application/leave_application.js b/hr/doctype/leave_application/leave_application.js
index 2715a6c..5d97f95 100755
--- a/hr/doctype/leave_application/leave_application.js
+++ b/hr/doctype/leave_application/leave_application.js
@@ -24,7 +24,7 @@
 		cur_frm.cscript.calculate_total_days(doc, dt, dn);
 	}
 	cur_frm.set_df_property("leave_approver", "options", "");
-	cur_frm.call({
+	return cur_frm.call({
 		method:"hr.utils.get_leave_approver_list",
 		callback: function(r) {
 			cur_frm.set_df_property("leave_approver", "options", $.map(r.message, 
@@ -105,7 +105,7 @@
 	
 cur_frm.cscript.get_leave_balance = function(doc, dt, dn) {
 	if(doc.docstatus==0 && doc.employee && doc.leave_type && doc.fiscal_year) {
-		cur_frm.call({
+		return cur_frm.call({
 			method: "get_leave_balance",
 			args: {
 				employee: doc.employee,
@@ -121,7 +121,7 @@
 		if(cint(doc.half_day) == 1) set_multiple(dt,dn,{total_leave_days:0.5});
 		else{
 			// server call is done to include holidays in leave days calculations
-			get_server_fields('get_total_leave_days', '', '', doc, dt, dn, 1);
+			return get_server_fields('get_total_leave_days', '', '', doc, dt, dn, 1);
 		}
 	}
 }
diff --git a/hr/doctype/leave_control_panel/leave_control_panel.js b/hr/doctype/leave_control_panel/leave_control_panel.js
index f3a635c..88ea067 100644
--- a/hr/doctype/leave_control_panel/leave_control_panel.js
+++ b/hr/doctype/leave_control_panel/leave_control_panel.js
@@ -24,7 +24,7 @@
 // Validation For To Date
 // ================================================================================================
 cur_frm.cscript.to_date = function(doc, cdt, cdn) {
-  $c('runserverobj', args={'method':'to_date_validation','docs':wn.model.compress(make_doclist(doc.doctype, doc.name))},
+  return $c('runserverobj', args={'method':'to_date_validation','docs':wn.model.compress(make_doclist(doc.doctype, doc.name))},
     function(r, rt) {
     var doc = locals[cdt][cdn];
     if (r.message) {
diff --git a/hr/doctype/salary_manager/salary_manager.js b/hr/doctype/salary_manager/salary_manager.js
index d6dcc5c..eb13e15 100644
--- a/hr/doctype/salary_manager/salary_manager.js
+++ b/hr/doctype/salary_manager/salary_manager.js
@@ -28,7 +28,7 @@
 		if (r.message)
 			display_activity_log(r.message);
 	}
-	$c('runserverobj', args={'method':'create_sal_slip','docs':wn.model.compress(make_doclist (cdt, cdn))},callback);
+	return $c('runserverobj', args={'method':'create_sal_slip','docs':wn.model.compress(make_doclist (cdt, cdn))},callback);
 }
 
 
@@ -42,7 +42,7 @@
 			if (r.message)
 				display_activity_log(r.message);
 		}
-		$c('runserverobj', args={'method':'submit_salary_slip','docs':wn.model.compress(make_doclist (cdt, cdn))},callback);
+		return $c('runserverobj', args={'method':'submit_salary_slip','docs':wn.model.compress(make_doclist (cdt, cdn))},callback);
 	}
 }
 
@@ -79,5 +79,5 @@
 
 		loaddoc('Journal Voucher', jv.name);
 	}
-	$c_obj(make_doclist(dt,dn),'get_acc_details','',call_back);
+	return $c_obj(make_doclist(dt,dn),'get_acc_details','',call_back);
 }
diff --git a/hr/doctype/salary_slip/salary_slip.js b/hr/doctype/salary_slip/salary_slip.js
index f6853fc..387b773 100644
--- a/hr/doctype/salary_slip/salary_slip.js
+++ b/hr/doctype/salary_slip/salary_slip.js
@@ -34,7 +34,7 @@
 // Get leave details
 //---------------------------------------------------------------------
 cur_frm.cscript.fiscal_year = function(doc,dt,dn){
-		$c_obj(make_doclist(doc.doctype,doc.name), 'get_emp_and_leave_details','',function(r, rt) {
+		return $c_obj(make_doclist(doc.doctype,doc.name), 'get_emp_and_leave_details','',function(r, rt) {
 			var doc = locals[dt][dn];
 			cur_frm.refresh();
 			calculate_all(doc, dt, dn);
@@ -45,7 +45,7 @@
 
 cur_frm.cscript.leave_without_pay = function(doc,dt,dn){
 	if (doc.employee && doc.fiscal_year && doc.month) {
-		$c_obj(make_doclist(doc.doctype,doc.name), 'get_leave_details',doc.leave_without_pay,function(r, rt) {
+		return $c_obj(make_doclist(doc.doctype,doc.name), 'get_leave_details',doc.leave_without_pay,function(r, rt) {
 			var doc = locals[dt][dn];
 			cur_frm.refresh();
 			calculate_all(doc, dt, dn);
diff --git a/hr/doctype/salary_structure/salary_structure.js b/hr/doctype/salary_structure/salary_structure.js
index 60c159d..6b98988 100644
--- a/hr/doctype/salary_structure/salary_structure.js
+++ b/hr/doctype/salary_structure/salary_structure.js
@@ -20,7 +20,7 @@
   e_tbl = getchildren('Salary Structure Earning', doc.name, 'earning_details', doc.doctype);
   d_tbl = getchildren('Salary Structure Deduction', doc.name, 'deduction_details', doc.doctype);
   if (e_tbl.length == 0 && d_tbl.length == 0)
-    $c_obj(make_doclist(doc.doctype,doc.name),'make_earn_ded_table','', function(r, rt) { refresh_many(['earning_details', 'deduction_details']);});
+    return $c_obj(make_doclist(doc.doctype,doc.name),'make_earn_ded_table','', function(r, rt) { refresh_many(['earning_details', 'deduction_details']);});
 }
 
 cur_frm.cscript.refresh = function(doc, dt, dn){
@@ -40,7 +40,7 @@
 
 cur_frm.cscript.employee = function(doc, dt, dn){
   if (doc.employee)
-    get_server_fields('get_employee_details','','',doc,dt,dn);
+    return get_server_fields('get_employee_details','','',doc,dt,dn);
 }
 
 cur_frm.cscript.modified_value = function(doc, cdt, cdn){
diff --git a/manufacturing/doctype/bom/bom.js b/manufacturing/doctype/bom/bom.js
index 87bc4aa..6f1786f 100644
--- a/manufacturing/doctype/bom/bom.js
+++ b/manufacturing/doctype/bom/bom.js
@@ -27,7 +27,7 @@
 }
 
 cur_frm.cscript.update_cost = function() {
-	wn.call({
+	return wn.call({
 		doc: cur_frm.doc,
 		method: "update_cost",
 		callback: function(r) {
@@ -106,7 +106,7 @@
 var get_bom_material_detail= function(doc, cdt, cdn) {
 	var d = locals[cdt][cdn];
 	if (d.item_code) {
-		wn.call({
+		return wn.call({
 			doc: cur_frm.doc,
 			method: "get_bom_material_detail",
 			args: {
diff --git a/manufacturing/doctype/production_order/production_order.js b/manufacturing/doctype/production_order/production_order.js
index 12f9490..bf4fd8e 100644
--- a/manufacturing/doctype/production_order/production_order.js
+++ b/manufacturing/doctype/production_order/production_order.js
@@ -52,7 +52,7 @@
 }
 
 cur_frm.cscript.production_item = function(doc) {
-	cur_frm.call({
+	return cur_frm.call({
 		method: "get_item_details",
 		args: { item: doc.production_item }
 	});
@@ -62,7 +62,7 @@
 	var doc = cur_frm.doc;
 	var check = confirm("Do you really want to stop production order: " + doc.name);
 	if (check) {
-		$c_obj(make_doclist(doc.doctype, doc.name), 'stop_unstop', 'Stopped', function(r, rt) {cur_frm.refresh();});
+		return $c_obj(make_doclist(doc.doctype, doc.name), 'stop_unstop', 'Stopped', function(r, rt) {cur_frm.refresh();});
 	}
 }
 
@@ -70,7 +70,7 @@
 	var doc = cur_frm.doc;
 	var check = confirm("Do really want to unstop production order: " + doc.name);
 	if (check)
-			$c_obj(make_doclist(doc.doctype, doc.name), 'stop_unstop', 'Unstopped', function(r, rt) {cur_frm.refresh();});
+			return $c_obj(make_doclist(doc.doctype, doc.name), 'stop_unstop', 'Unstopped', function(r, rt) {cur_frm.refresh();});
 }
 
 cur_frm.cscript['Transfer Raw Materials'] = function() {
diff --git a/manufacturing/doctype/production_planning_tool/production_planning_tool.js b/manufacturing/doctype/production_planning_tool/production_planning_tool.js
index 6cd643e..c18c84e 100644
--- a/manufacturing/doctype/production_planning_tool/production_planning_tool.js
+++ b/manufacturing/doctype/production_planning_tool/production_planning_tool.js
@@ -26,19 +26,19 @@
 cur_frm.cscript.sales_order = function(doc,cdt,cdn) {
 	var d = locals[cdt][cdn];
 	if (d.sales_order) {
-		get_server_fields('get_so_details', d.sales_order, 'pp_so_details', doc, cdt, cdn, 1);
+		return get_server_fields('get_so_details', d.sales_order, 'pp_so_details', doc, cdt, cdn, 1);
 	}
 }
 
 cur_frm.cscript.item_code = function(doc,cdt,cdn) {
 	var d = locals[cdt][cdn];
 	if (d.item_code) {
-		get_server_fields('get_item_details', d.item_code, 'pp_details', doc, cdt, cdn, 1);
+		return get_server_fields('get_item_details', d.item_code, 'pp_details', doc, cdt, cdn, 1);
 	}
 }
 
 cur_frm.cscript.download_materials_required = function(doc, cdt, cdn) {
-	$c_obj(make_doclist(cdt, cdn), 'validate_data', '', function(r, rt) {
+	return $c_obj(make_doclist(cdt, cdn), 'validate_data', '', function(r, rt) {
 		if (!r['exc'])
 			$c_obj_csv(make_doclist(cdt, cdn), 'download_raw_materials', '', '');
 	});
diff --git a/projects/doctype/task/task.js b/projects/doctype/task/task.js
index cb2c539..7ecb224 100644
--- a/projects/doctype/task/task.js
+++ b/projects/doctype/task/task.js
@@ -29,7 +29,7 @@
 
 	project: function() {
 		if(this.frm.doc.project) {
-			get_server_fields('get_project_details', '','', this.frm.doc, this.frm.doc.doctype, 
+			return get_server_fields('get_project_details', '','', this.frm.doc, this.frm.doc.doctype, 
 				this.frm.doc.name, 1);
 		}
 	},
diff --git a/public/js/complete_setup.js b/public/js/complete_setup.js
index d66d09a..3a6bad5 100644
--- a/public/js/complete_setup.js
+++ b/public/js/complete_setup.js
@@ -74,7 +74,7 @@
 			var data = d.get_values();
 			if(!data) return;
 			$(this).set_working();
-			$c_obj('Setup Control','setup_account',data,function(r, rt){
+			return $c_obj('Setup Control','setup_account',data,function(r, rt){
 				$(this).done_working();
 				if(!r.exc) {
 					sys_defaults = r.message;
diff --git a/public/js/controllers/stock_controller.js b/public/js/controllers/stock_controller.js
index ccbca4e..e657185 100644
--- a/public/js/controllers/stock_controller.js
+++ b/public/js/controllers/stock_controller.js
@@ -19,22 +19,26 @@
 erpnext.stock.StockController = wn.ui.form.Controller.extend({
 	show_stock_ledger: function() {
 		var me = this;
-		this.frm.add_custom_button("Stock Ledger", function() {
-			wn.route_options = {
-				voucher_no: me.frm.doc.name,
-				from_date: cur_frm.doc.posting_date,
-				to_date: cur_frm.doc.posting_date
-			};
-			wn.set_route('stock-ledger');
-		}, "icon-bar-chart");
+		if(this.frm.doc.docstatus===1) {
+			this.frm.add_custom_button("Stock Ledger", function() {
+				wn.route_options = {
+					voucher_no: me.frm.doc.name,
+					from_date: me.frm.doc.posting_date,
+					to_date: me.frm.doc.posting_date
+				};
+				wn.set_route('stock-ledger');
+			}, "icon-bar-chart");
+		}
+		
 	},
 	show_general_ledger: function() {
-		if(doc.docstatus==1) { 
+		var me = this;
+		if(this.frm.doc.docstatus===1 && cint(wn.defaults.get_default("auto_inventory_accounting"))) { 
 			cur_frm.add_custom_button('Accounting Ledger', function() {
 				wn.route_options = {
-					"voucher_no": doc.name,
-					"from_date": doc.posting_date,
-					"to_date": doc.posting_date,
+					"voucher_no": me.frm.doc.name,
+					"from_date": me.frm.doc.posting_date,
+					"to_date": me.frm.doc.posting_date,
 				};
 				wn.set_route("general-ledger");
 			});
diff --git a/public/js/transaction.js b/public/js/transaction.js
index 7077e02..2cee843 100644
--- a/public/js/transaction.js
+++ b/public/js/transaction.js
@@ -15,8 +15,9 @@
 // along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 wn.provide("erpnext");
+wn.require("app/js/controllers/stock_controller.js");
 
-erpnext.TransactionController = wn.ui.form.Controller.extend({
+erpnext.TransactionController = erpnext.stock.StockController.extend({
 	onload: function() {
 		if(this.frm.doc.__islocal) {
 			var me = this,
@@ -55,7 +56,7 @@
 	onload_post_render: function() {
 		if(this.frm.doc.__islocal && this.frm.doc.company) {
 			var me = this;
-			this.frm.call({
+			return this.frm.call({
 				doc: this.frm.doc,
 				method: "onload_post_render",
 				freeze: true,
@@ -116,7 +117,7 @@
 	price_list_name: function(buying_or_selling) {
 		var me = this;
 		if(this.frm.doc.price_list_name) {
-			this.frm.call({
+			return this.frm.call({
 				method: "setup.utils.get_price_list_currency",
 				args: { 
 					price_list_name: this.frm.doc.price_list_name,
@@ -557,7 +558,7 @@
 	get_terms: function() {
 		var me = this;
 		if(this.frm.doc.tc_name) {
-			this.frm.call({
+			return this.frm.call({
 				method: "webnotes.client.get_value",
 				args: {
 					doctype: "Terms and Conditions",
diff --git a/public/js/website_utils.js b/public/js/website_utils.js
index 519d630..f034be2 100644
--- a/public/js/website_utils.js
+++ b/public/js/website_utils.js
@@ -5,7 +5,7 @@
 // Add / update a new Lead / Communication
 // subject, sender, description
 erpnext.send_message = function(opts) {
-	wn.call({
+	return wn.call({
 		type: "POST",
 		method: "website.helpers.contact.send_message",
 		args: opts,
@@ -202,7 +202,7 @@
 			}
 			window.location.href = "login";
 		} else {
-			wn.call({
+			return wn.call({
 				type: "POST",
 				method: "website.helpers.cart.update_cart",
 				args: {
diff --git a/selling/doctype/customer/customer.js b/selling/doctype/customer/customer.js
index cd530a2..935afb0 100644
--- a/selling/doctype/customer/customer.js
+++ b/selling/doctype/customer/customer.js
@@ -66,7 +66,7 @@
 	cur_frm.dashboard.add_doctype_badge("Delivery Note", "customer");
 	cur_frm.dashboard.add_doctype_badge("Sales Invoice", "customer");
 	
-	wn.call({
+	return wn.call({
 		type: "GET",
 		method:"selling.doctype.customer.customer.get_dashboard_info",
 		args: {
diff --git a/selling/doctype/installation_note/installation_note.js b/selling/doctype/installation_note/installation_note.js
index 5ad698a..b6f094f 100644
--- a/selling/doctype/installation_note/installation_note.js
+++ b/selling/doctype/installation_note/installation_note.js
@@ -78,7 +78,7 @@
 	customer: function() {
 		var me = this;
 		if(this.frm.doc.customer) {
-			this.frm.call({
+			return this.frm.call({
 				doc: this.frm.doc,
 				method: "set_customer_defaults",
 			});
@@ -93,7 +93,7 @@
 	customer_address: function() {
 		var me = this;
 		if(this.frm.doc.customer) {
-			this.frm.call({
+			return this.frm.call({
 				doc: this.frm.doc,
 				args: {
 					customer: this.frm.doc.customer, 
diff --git a/selling/doctype/opportunity/opportunity.js b/selling/doctype/opportunity/opportunity.js
index 80e565a..fb5bae5 100644
--- a/selling/doctype/opportunity/opportunity.js
+++ b/selling/doctype/opportunity/opportunity.js
@@ -86,15 +86,15 @@
 	customer: function() {
 		var me = this;
 		if(this.frm.doc.customer) {
-			this.frm.call({
-				doc: this.frm.doc,
-				method: "set_customer_defaults",
-			});
-			
 			// TODO shift this to depends_on
 			unhide_field(['customer_address', 'contact_person', 'customer_name',
 				'address_display', 'contact_display', 'contact_mobile', 'contact_email', 
 				'territory', 'customer_group']);
+				
+			return this.frm.call({
+				doc: this.frm.doc,
+				method: "set_customer_defaults",
+			});
 		}
 	}, 
 	
@@ -140,7 +140,7 @@
 cur_frm.cscript.item_code = function(doc, cdt, cdn) {
 	var d = locals[cdt][cdn];
 	if (d.item_code) {
-		get_server_fields('get_item_details',d.item_code, 'enquiry_details',doc, cdt,cdn,1);
+		return get_server_fields('get_item_details',d.item_code, 'enquiry_details',doc, cdt,cdn,1);
 	}
 }
 
@@ -165,7 +165,7 @@
 }
 
 cur_frm.cscript.customer_address = cur_frm.cscript.contact_person = function(doc,dt,dn) {		
-	if(doc.customer) get_server_fields('get_customer_address', JSON.stringify({customer: doc.customer, address: doc.customer_address, contact: doc.contact_person}),'', doc, dt, dn, 1);
+	if(doc.customer) return get_server_fields('get_customer_address', JSON.stringify({customer: doc.customer, address: doc.customer_address, contact: doc.contact_person}),'', doc, dt, dn, 1);
 }
 
 cur_frm.cscript.lead = function(doc, cdt, cdn) {
@@ -195,7 +195,7 @@
 	dialog.fields_dict.update.$input.click(function() {
 		args = dialog.get_values();
 		if(!args) return;
-		cur_frm.call({
+		return cur_frm.call({
 			doc: cur_frm.doc,
 			method: "declare_enquiry_lost",
 			args: args.reason,
diff --git a/selling/doctype/quotation/quotation.js b/selling/doctype/quotation/quotation.js
index af49bb3..08ec6ab 100644
--- a/selling/doctype/quotation/quotation.js
+++ b/selling/doctype/quotation/quotation.js
@@ -114,7 +114,8 @@
 
 cur_frm.cscript.lead = function(doc, cdt, cdn) {
 	if(doc.lead) {
-		cur_frm.call({
+		unhide_field('territory');
+		return cur_frm.call({
 			doc: cur_frm.doc,
 			method: "set_lead_defaults",
 			callback: function(r) {
@@ -123,7 +124,6 @@
 				}
 			}
 		});
-		unhide_field('territory');
 	}
 }
 
@@ -152,7 +152,7 @@
 	dialog.fields_dict.update.$input.click(function() {
 		args = dialog.get_values();
 		if(!args) return;
-		cur_frm.call({
+		return cur_frm.call({
 			method: "declare_order_lost",
 			doc: cur_frm.doc,
 			args: args.reason,
diff --git a/selling/doctype/sales_bom/sales_bom.js b/selling/doctype/sales_bom/sales_bom.js
index 7d79340..b67050c 100644
--- a/selling/doctype/sales_bom/sales_bom.js
+++ b/selling/doctype/sales_bom/sales_bom.js
@@ -18,7 +18,7 @@
 	cur_frm.toggle_enable('new_item_code', doc.__islocal);
 	if(!doc.__islocal) {
 		cur_frm.add_custom_button("Check for Duplicates", function() {
-			cur_frm.call_server('check_duplicate', 1)			
+			return cur_frm.call_server('check_duplicate', 1)			
 		}, 'icon-search')
 	}
 }
@@ -34,6 +34,6 @@
 cur_frm.cscript.item_code = function(doc, dt, dn) {
 	var d = locals[dt][dn];
 	if (d.item_code){
-		get_server_fields('get_item_details', d.item_code, 'sales_bom_items', doc ,dt, dn, 1);
+		return get_server_fields('get_item_details', d.item_code, 'sales_bom_items', doc ,dt, dn, 1);
 	}
 }
\ No newline at end of file
diff --git a/selling/doctype/sales_common/sales_common.js b/selling/doctype/sales_common/sales_common.js
index d2461af..0f19fa2 100644
--- a/selling/doctype/sales_common/sales_common.js
+++ b/selling/doctype/sales_common/sales_common.js
@@ -135,7 +135,7 @@
 				msgprint(wn._("Please specify Company"));
 			} else {
 				var price_list_name = this.frm.doc.price_list_name;
-				this.frm.call({
+				return this.frm.call({
 					doc: this.frm.doc,
 					method: "set_customer_defaults",
 					freeze: true,
@@ -154,7 +154,7 @@
 	customer_address: function() {
 		var me = this;
 		if(this.frm.doc.customer) {
-			this.frm.call({
+			return this.frm.call({
 				doc: this.frm.doc,
 				args: {
 					customer: this.frm.doc.customer, 
@@ -183,7 +183,7 @@
 				item.item_code = null;
 				refresh_field("item_code", item.name, item.parentfield);
 			} else {
-				this.frm.call({
+				return this.frm.call({
 					method: "selling.utils.get_item_details",
 					child: item,
 					args: {
@@ -292,7 +292,7 @@
 	warehouse: function(doc, cdt, cdn) {
 		var item = wn.model.get_doc(cdt, cdn);
 		if(item.item_code && item.warehouse) {
-			this.frm.call({
+			return this.frm.call({
 				method: "selling.utils.get_available_qty",
 				child: item,
 				args: {
@@ -484,7 +484,7 @@
 	charge: function() {
 		var me = this;
 		if(this.frm.doc.charge) {
-			this.frm.call({
+			return this.frm.call({
 				doc: this.frm.doc,
 				method: "get_other_charges",
 				callback: function(r) {
@@ -499,7 +499,7 @@
 	shipping_rule: function() {
 		var me = this;
 		if(this.frm.doc.shipping_rule) {
-			this.frm.call({
+			return this.frm.call({
 				doc: this.frm.doc,
 				method: "apply_shipping_rule",
 				callback: function(r) {
diff --git a/selling/doctype/sales_order/sales_order.js b/selling/doctype/sales_order/sales_order.js
index 88442ea..8c1c2d2 100644
--- a/selling/doctype/sales_order/sales_order.js
+++ b/selling/doctype/sales_order/sales_order.js
@@ -101,7 +101,7 @@
 	reserved_warehouse: function(doc, cdt, cdn) {
 		var item = wn.model.get_doc(cdt, cdn);
 		if(item.item_code && item.reserved_warehouse) {
-			this.frm.call({
+			return this.frm.call({
 				method: "selling.utils.get_available_qty",
 				child: item,
 				args: {
@@ -173,7 +173,7 @@
 	var check = confirm("Are you sure you want to STOP " + doc.name);
 
 	if (check) {
-		$c('runserverobj', {
+		return $c('runserverobj', {
 			'method':'stop_sales_order', 
 			'docs': wn.model.compress(make_doclist(doc.doctype, doc.name))
 			}, function(r,rt) {
@@ -188,7 +188,7 @@
 	var check = confirm("Are you sure you want to UNSTOP " + doc.name);
 
 	if (check) {
-		$c('runserverobj', {
+		return $c('runserverobj', {
 			'method':'unstop_sales_order', 
 			'docs': wn.model.compress(make_doclist(doc.doctype, doc.name))
 		}, function(r,rt) {
diff --git a/selling/doctype/sales_order/sales_order.py b/selling/doctype/sales_order/sales_order.py
index 55abf9d..d578a43 100644
--- a/selling/doctype/sales_order/sales_order.py
+++ b/selling/doctype/sales_order/sales_order.py
@@ -375,7 +375,7 @@
 		target.amount = (flt(obj.qty) - flt(obj.delivered_qty)) * flt(obj.basic_rate)
 		target.export_amount = (flt(obj.qty) - flt(obj.delivered_qty)) * flt(obj.export_rate)
 		target.qty = flt(obj.qty) - flt(obj.delivered_qty)
-	
+			
 	doclist = get_mapped_doclist("Sales Order", source_name, {
 		"Sales Order": {
 			"doctype": "Delivery Note", 
@@ -396,7 +396,8 @@
 				"parenttype": "prevdoc_doctype", 
 				"reserved_warehouse": "warehouse"
 			},
-			"postprocess": update_item
+			"postprocess": update_item,
+			"condition": lambda doc: doc.delivered_qty < doc.qty
 		}, 
 		"Sales Taxes and Charges": {
 			"doctype": "Sales Taxes and Charges", 
@@ -416,7 +417,7 @@
 		target.export_amount = flt(obj.export_amount) - flt(obj.billed_amt)
 		target.amount = target.export_amount * flt(source_parent.conversion_rate)
 		target.qty = obj.export_rate and target.export_amount / flt(obj.export_rate) or obj.qty
-	
+			
 	doclist = get_mapped_doclist("Sales Order", source_name, {
 		"Sales Order": {
 			"doctype": "Sales Invoice", 
diff --git a/selling/page/sales_browser/sales_browser.js b/selling/page/sales_browser/sales_browser.js
index 8506bc6..a1578cf 100644
--- a/selling/page/sales_browser/sales_browser.js
+++ b/selling/page/sales_browser/sales_browser.js
@@ -33,7 +33,7 @@
 
 	wrapper.make_tree = function() {
 		var ctype = wn.get_route()[1] || 'Territory';
-		wn.call({
+		return wn.call({
 			method: 'selling.page.sales_browser.sales_browser.get_children',
 			args: {ctype: ctype},
 			callback: function(r) {
@@ -155,7 +155,7 @@
 			v.parent = node.data('label');
 			v.ctype = me.ctype;
 			
-			wn.call({
+			return wn.call({
 				method: 'selling.page.sales_browser.sales_browser.add_node',
 				args: v,
 				callback: function() {
diff --git a/setup/doctype/backup_manager/backup_manager.js b/setup/doctype/backup_manager/backup_manager.js
index c78be3a..870922e 100644
--- a/setup/doctype/backup_manager/backup_manager.js
+++ b/setup/doctype/backup_manager/backup_manager.js
@@ -43,7 +43,7 @@
 	
 	allow_dropbox_access: function() {
 		if(cur_frm.cscript.validate_send_notifications_to()) {
-			wn.call({
+			return wn.call({
 				method: "setup.doctype.backup_manager.backup_dropbox.get_dropbox_authorize_url",
 				callback: function(r) {
 					if(!r.exc) {
@@ -60,7 +60,7 @@
 	
 	allow_gdrive_access: function() {
 		if(cur_frm.cscript.validate_send_notifications_to()) {
-			wn.call({
+			return wn.call({
 				method: "setup.doctype.backup_manager.backup_googledrive.get_gdrive_authorize_url",
 				callback: function(r) {
 					if(!r.exc) {
@@ -72,7 +72,7 @@
 	},
 	
 	validate_gdrive: function() {
-		wn.call({
+		return wn.call({
 			method: "setup.doctype.backup_manager.backup_googledrive.gdrive_callback",
 			args: {
 				verification_code: cur_frm.doc.verification_code
diff --git a/setup/doctype/contact_control/contact_control.js b/setup/doctype/contact_control/contact_control.js
index db0ed91..5c8e571 100755
--- a/setup/doctype/contact_control/contact_control.js
+++ b/setup/doctype/contact_control/contact_control.js
@@ -5,7 +5,7 @@
 // get sates on country trigger
 // -----------------------------
 cur_frm.cscript.get_states=function(doc,dt,dn){
-   $c('runserverobj', args={'method':'check_state', 'docs':wn.model.compress(make_doclist(doc.doctype, doc.name))},
+   return $c('runserverobj', args={'method':'check_state', 'docs':wn.model.compress(make_doclist(doc.doctype, doc.name))},
     function(r,rt){
       if(r.message) {
         set_field_options('state', r.message);
@@ -152,7 +152,7 @@
 	}));
 	if (!go_ahead) return;
 
-	wn.call({
+	return wn.call({
 		method: 'webnotes.model.delete_doc',
 		args: {
 			dt: doctype,
diff --git a/setup/doctype/email_digest/email_digest.js b/setup/doctype/email_digest/email_digest.js
index 5206842..011718f 100644
--- a/setup/doctype/email_digest/email_digest.js
+++ b/setup/doctype/email_digest/email_digest.js
@@ -22,7 +22,7 @@
 	cur_frm.add_custom_button('View Now', function() {
 		doc = locals[dt][dn];
 		if(doc.__unsaved != 1) {
-			$c_obj(make_doclist(dt, dn), 'get_digest_msg', '', function(r, rt) {
+			return $c_obj(make_doclist(dt, dn), 'get_digest_msg', '', function(r, rt) {
 				if(r.exc) {
 					msgprint(err_msg);
 					console.log(r.exc);
@@ -45,7 +45,7 @@
 	cur_frm.add_custom_button('Send Now', function() {
 		doc = locals[dt][dn];
 		if(doc.__unsaved != 1) {
-			$c_obj(make_doclist(dt, dn), 'send', '', function(r, rt) {
+			return $c_obj(make_doclist(dt, dn), 'send', '', function(r, rt) {
 				if(r.exc) {
 					msgprint(err_msg);
 					console.log(r.exc);
@@ -62,7 +62,7 @@
 
 cur_frm.cscript.addremove_recipients = function(doc, dt, dn) {
 	// Get profile list
-	$c_obj(make_doclist(dt, dn), 'get_profiles', '', function(r, rt) {
+	return $c_obj(make_doclist(dt, dn), 'get_profiles', '', function(r, rt) {
 		if(r.exc) {
 			msgprint(r.exc);
 		} else {
diff --git a/setup/doctype/global_defaults/global_defaults.js b/setup/doctype/global_defaults/global_defaults.js
index fa80025..f629ee0 100644
--- a/setup/doctype/global_defaults/global_defaults.js
+++ b/setup/doctype/global_defaults/global_defaults.js
@@ -16,7 +16,7 @@
 
 // Validate
 cur_frm.cscript.validate = function(doc, cdt, cdn) {
-	$c_obj(make_doclist(cdt, cdn), 'get_defaults', '', function(r, rt){
+	return $c_obj(make_doclist(cdt, cdn), 'get_defaults', '', function(r, rt){
 		sys_defaults = r.message;
 	});
 }
\ No newline at end of file
diff --git a/setup/doctype/naming_series/naming_series.js b/setup/doctype/naming_series/naming_series.js
index 07d6f82..663b08f 100644
--- a/setup/doctype/naming_series/naming_series.js
+++ b/setup/doctype/naming_series/naming_series.js
@@ -16,7 +16,7 @@
 
 // Settings
 cur_frm.cscript.onload_post_render = function(doc, cdt, cdn){
-	cur_frm.call({
+	return cur_frm.call({
 		doc: cur_frm.doc,
 		method: 'get_transactions',
 		callback: function(r) {
@@ -45,15 +45,15 @@
 	}
 
 	if(doc.select_doc_for_series)
-		$c_obj(make_doclist(doc.doctype, doc.name),'get_options','',callback)
+		return $c_obj(make_doclist(doc.doctype, doc.name),'get_options','',callback)
 }
 
 cur_frm.cscript.update = function() {
-	cur_frm.call_server('update_series', '', cur_frm.cscript.update_selects)
+	return cur_frm.call_server('update_series', '', cur_frm.cscript.update_selects)
 }
 
 cur_frm.cscript.prefix = function(doc, dt, dn) {
-	cur_frm.call_server('get_current', '', function(r) {
+	return cur_frm.call_server('get_current', '', function(r) {
 		refresh_field('current_value');
 	})
 }
diff --git a/setup/doctype/notification_control/notification_control.js b/setup/doctype/notification_control/notification_control.js
index 619d417..279f5b4 100644
--- a/setup/doctype/notification_control/notification_control.js
+++ b/setup/doctype/notification_control/notification_control.js
@@ -21,6 +21,6 @@
       doc.custom_message = r.message;
       refresh_field('custom_message');
     }
-    $c_obj(make_doclist(cdt, cdn),'get_message',doc.select_transaction, callback)
+    return $c_obj(make_doclist(cdt, cdn),'get_message',doc.select_transaction, callback)
   }
 }
diff --git a/setup/page/setup/setup.js b/setup/page/setup/setup.js
index db752b1..40b67d8 100644
--- a/setup/page/setup/setup.js
+++ b/setup/page/setup/setup.js
@@ -21,36 +21,7 @@
 		completed = 0;
 
 	body.html('<div class="progress progress-striped active">\
-		<div class="progress-bar" style="width: 100%;"></div></div>')
-
-	wn.call({
-		method: "setup.page.setup.setup.get",
-		callback: function(r) {
-			if(r.message) {
-				body.empty();
-				if(wn.boot.expires_on) {
-					$(body).prepend("<div class='text-muted' style='text-align:right'>Account expires on "
-							+ wn.datetime.global_date_format(wn.boot.expires_on) + "</div>");
-				}
-
-				$completed = $('<h4>Setup Completed <span class="completed-percent"></span><h4>\
-					<div class="progress"><div class="progress-bar"></div></div>')
-					.appendTo(body);
-
-				$.each(r.message, function(i, item) {
-					render_item(item)
-				});
-				
-				var completed_percent = cint(flt(completed) / total * 100) + "%";
-				$completed
-					.find(".progress-bar")
-					.css({"width": completed_percent});
-				$(body)
-					.find(".completed-percent")
-					.html("(" + completed_percent + ")");
-			}
-		}
-	});
+		<div class="progress-bar" style="width: 100%;"></div></div>');
 	
 	var render_item = function(item, dependency) {		
 		if(item.type==="Section") {
@@ -68,12 +39,12 @@
 			.appendTo(body);
 
 		$('<div class="col col-lg-1"></div>').appendTo(row);
-			
+		
 		if(item.type==="Link") {
 			var col = $('<div class="col col-lg-5"><b><a href="#'
 				+item.route+'"><i class="'+item.icon+'"></i> '
 				+item.title+'</a></b></div>').appendTo(row);
-			
+		
 		} else {
 			var col = $(repl('<div class="col col-lg-5">\
 					<span class="badge view-link">%(count)s</span>\
@@ -102,12 +73,12 @@
 			col.addClass("col-offset-1");
 		else
 			$('<div class="col col-lg-1"></div>').appendTo(row);
-			
+		
 		if(item.doctype) {
 			var badge = col.find(".badge, .data-link")
 				.attr("data-doctype", item.doctype)
 				.css({"cursor": "pointer"})
-				
+			
 			if(item.single) {
 				badge.click(function() {
 					wn.set_route("Form", $(this).attr("data-doctype"))
@@ -118,10 +89,10 @@
 				})
 			}
 		}
-		
+	
 		// tree
 		$links = $('<div class="col col-lg-5">').appendTo(row);
-		
+	
 		if(item.tree) {
 			$('<a class="view-link"><i class="icon-sitemap"></i> Browse</a>\
 				<span class="text-muted">|</span> \
@@ -134,7 +105,7 @@
 			mylink.click(function() {
 				wn.set_route(item.tree, item.doctype);
 			})
-						
+					
 		} else if(item.single) {
 			$('<a class="view-link"><i class="icon-edit"></i> Edit</a>')
 				.appendTo($links)
@@ -183,7 +154,7 @@
 				wn.route_options = {doctype:$(this).attr("data-doctype")}
 				wn.set_route("data-import-tool");
 			})
-			
+		
 		if(item.links) {
 			$.each(item.links, function(i, link) {
 				var newlinks = $('<span class="text-muted"> |</span> \
@@ -192,11 +163,40 @@
 					.appendTo($links)
 			})
 		}
-			
+		
 		if(item.dependencies) {
 			$.each(item.dependencies, function(i, d) {
 				render_item(d, true);
 			})
 		}
 	}
+
+	return wn.call({
+		method: "setup.page.setup.setup.get",
+		callback: function(r) {
+			if(r.message) {
+				body.empty();
+				if(wn.boot.expires_on) {
+					$(body).prepend("<div class='text-muted' style='text-align:right'>Account expires on "
+							+ wn.datetime.global_date_format(wn.boot.expires_on) + "</div>");
+				}
+
+				$completed = $('<h4>Setup Completed <span class="completed-percent"></span><h4>\
+					<div class="progress"><div class="progress-bar"></div></div>')
+					.appendTo(body);
+
+				$.each(r.message, function(i, item) {
+					render_item(item)
+				});
+				
+				var completed_percent = cint(flt(completed) / total * 100) + "%";
+				$completed
+					.find(".progress-bar")
+					.css({"width": completed_percent});
+				$(body)
+					.find(".completed-percent")
+					.html("(" + completed_percent + ")");
+			}
+		}
+	});
 }
\ No newline at end of file
diff --git a/stock/doctype/delivery_note/delivery_note.js b/stock/doctype/delivery_note/delivery_note.js
index de6e9dc..0c47148 100644
--- a/stock/doctype/delivery_note/delivery_note.js
+++ b/stock/doctype/delivery_note/delivery_note.js
@@ -29,13 +29,15 @@
 	refresh: function(doc, dt, dn) {
 		this._super();
 		
-		if(flt(doc.per_billed, 2) < 100 && doc.docstatus==1) cur_frm.add_custom_button('Make Invoice', this.make_sales_invoice);
+		if(!doc.__billing_complete && doc.docstatus==1) cur_frm.add_custom_button('Make Invoice', this.make_sales_invoice);
 	
 		if(flt(doc.per_installed, 2) < 100 && doc.docstatus==1) 
 			cur_frm.add_custom_button('Make Installation Note', this.make_installation_note);
 
 		if (doc.docstatus==1) {
 			cur_frm.add_custom_button('Send SMS', cur_frm.cscript.send_sms);
+			this.show_stock_ledger();
+			this.show_general_ledger();
 		}
 
 		if(doc.docstatus==0 && !doc.__islocal) {
@@ -112,7 +114,7 @@
 cur_frm.cscript.serial_no = function(doc, cdt, cdn) {
 	var d = locals[cdt][cdn];
 	if (d.serial_no) {
-		 get_server_fields('get_serial_details',d.serial_no,'delivery_note_details',doc,cdt,cdn,1);
+		 return get_server_fields('get_serial_details',d.serial_no,'delivery_note_details',doc,cdt,cdn,1);
 	}
 }
 
diff --git a/stock/doctype/delivery_note/delivery_note.py b/stock/doctype/delivery_note/delivery_note.py
index 7ea512d..81c4b6c 100644
--- a/stock/doctype/delivery_note/delivery_note.py
+++ b/stock/doctype/delivery_note/delivery_note.py
@@ -50,6 +50,13 @@
 			'keyword': 'Delivered'
 		}]
 		
+	def onload(self):
+		billed_qty = webnotes.conn.sql("""select sum(ifnull(qty, 0)) from `tabSales Invoice Item`
+			where delivery_note=%s""", self.doc.name)
+		if billed_qty:
+			total_qty = sum((item.qty for item in self.doclist.get({"parentfield": "delivery_note_details"})))
+			self.doc.fields["__billing_complete"] = billed_qty[0][0] == total_qty
+		
 	def get_contact_details(self):
 		return get_obj('Sales Common').get_contact_details(self,0)
 
diff --git a/stock/doctype/item/item.js b/stock/doctype/item/item.js
index 9af8331..a8401c4 100644
--- a/stock/doctype/item/item.js
+++ b/stock/doctype/item/item.js
@@ -51,7 +51,7 @@
 			var enabled = (r.message == 'exists') ? false : true;
 			cur_frm.toggle_enable(['has_serial_no', 'is_stock_item', 'valuation_method'], enabled);
 		}
-		$c_obj(make_doclist(doc.doctype, doc.name),'check_if_sle_exists','',callback);
+		return $c_obj(make_doclist(doc.doctype, doc.name),'check_if_sle_exists','',callback);
 	}
 }
 
@@ -130,7 +130,7 @@
 
 cur_frm.cscript.tax_type = function(doc, cdt, cdn){
   var d = locals[cdt][cdn];
-  get_server_fields('get_tax_rate',d.tax_type,'item_tax',doc, cdt, cdn, 1);
+  return get_server_fields('get_tax_rate',d.tax_type,'item_tax',doc, cdt, cdn, 1);
 }
 
 
diff --git a/stock/doctype/material_request/material_request.js b/stock/doctype/material_request/material_request.js
index bd5ab82..fe9af31 100644
--- a/stock/doctype/material_request/material_request.js
+++ b/stock/doctype/material_request/material_request.js
@@ -124,7 +124,7 @@
 	var check = confirm("Do you really want to STOP this Material Request?");
 
 	if (check) {
-		$c('runserverobj', args={'method':'update_status', 'arg': 'Stopped', 'docs': wn.model.compress(make_doclist(doc.doctype, doc.name))}, function(r,rt) {
+		return $c('runserverobj', args={'method':'update_status', 'arg': 'Stopped', 'docs': wn.model.compress(make_doclist(doc.doctype, doc.name))}, function(r,rt) {
 			cur_frm.refresh();
 		});
 	}
@@ -135,7 +135,7 @@
 	var check = confirm("Do you really want to UNSTOP this Material Request?");
 	
 	if (check) {
-		$c('runserverobj', args={'method':'update_status', 'arg': 'Submitted','docs': wn.model.compress(make_doclist(doc.doctype, doc.name))}, function(r,rt) {
+		return $c('runserverobj', args={'method':'update_status', 'arg': 'Submitted','docs': wn.model.compress(make_doclist(doc.doctype, doc.name))}, function(r,rt) {
 			cur_frm.refresh();
 		});
 	}
diff --git a/stock/doctype/packing_slip/packing_slip.js b/stock/doctype/packing_slip/packing_slip.js
index e19ab49..d86d64b 100644
--- a/stock/doctype/packing_slip/packing_slip.js
+++ b/stock/doctype/packing_slip/packing_slip.js
@@ -36,7 +36,7 @@
 }
 
 cur_frm.cscript.get_items = function(doc, cdt, cdn) {
-	this.frm.call({
+	return this.frm.call({
 		doc: this.frm.doc,
 		method: "get_items",
 		callback: function(r) {
diff --git a/stock/doctype/purchase_receipt/purchase_receipt.js b/stock/doctype/purchase_receipt/purchase_receipt.js
index a134da1..b393907 100644
--- a/stock/doctype/purchase_receipt/purchase_receipt.js
+++ b/stock/doctype/purchase_receipt/purchase_receipt.js
@@ -28,11 +28,14 @@
 		this._super();
 		
 		if(this.frm.doc.docstatus == 1) {
-			if(flt(this.frm.doc.per_billed, 2) < 100) {
+			if(!this.frm.doc.__billing_complete) {
 				cur_frm.add_custom_button('Make Purchase Invoice', 
 					this.make_purchase_invoice);
 			}
 			cur_frm.add_custom_button('Send SMS', cur_frm.cscript['Send SMS']);
+			
+			this.show_stock_ledger();
+			this.show_general_ledger();
 		}
 
 		cur_frm.add_custom_button(wn._('From Purchase Order'), 
@@ -68,6 +71,10 @@
 		var item = wn.model.get_doc(cdt, cdn);
 		wn.model.round_floats_in(item, ["qty", "received_qty"]);
 		
+		if(!(item.received_qty || item.rejected_qty) && item.qty) {
+			item.received_qty = item.qty;
+		}
+		
 		if(item.qty > item.received_qty) {
 			msgprint(wn._("Error") + ": " + wn._(wn.meta.get_label(item.doctype, "qty", item.name))
 				+ " > " + wn._(wn.meta.get_label(item.doctype, "received_qty", item.name)));
diff --git a/stock/doctype/purchase_receipt/purchase_receipt.py b/stock/doctype/purchase_receipt/purchase_receipt.py
index 62b7a4f..703929c 100644
--- a/stock/doctype/purchase_receipt/purchase_receipt.py
+++ b/stock/doctype/purchase_receipt/purchase_receipt.py
@@ -44,6 +44,13 @@
 			'source_field': 'qty',
 			'percent_join_field': 'prevdoc_docname',
 		}]
+		
+	def onload(self):
+		billed_qty = webnotes.conn.sql("""select sum(ifnull(qty, 0)) from `tabPurchase Invoice Item`
+			where purchase_receipt=%s""", self.doc.name)
+		if billed_qty:
+			total_qty = sum((item.qty for item in self.doclist.get({"parentfield": "purchase_receipt_details"})))
+			self.doc.fields["__billing_complete"] = billed_qty[0][0] == total_qty
 
 	# get available qty at warehouse
 	def get_bin_details(self, arg = ''):
diff --git a/stock/doctype/serial_no/serial_no.js b/stock/doctype/serial_no/serial_no.js
index 0253ffb..8e833d7 100644
--- a/stock/doctype/serial_no/serial_no.js
+++ b/stock/doctype/serial_no/serial_no.js
@@ -54,7 +54,7 @@
 // Supplier
 //-------------
 cur_frm.cscript.supplier = function(doc,dt,dn) {
-	if(doc.supplier) get_server_fields('get_default_supplier_address', JSON.stringify({supplier: doc.supplier}),'', doc, dt, dn, 1);
+	if(doc.supplier) return get_server_fields('get_default_supplier_address', JSON.stringify({supplier: doc.supplier}),'', doc, dt, dn, 1);
 	if(doc.supplier) unhide_field(['supplier_name','address_display']);
 }
 
diff --git a/stock/doctype/stock_entry/stock_entry.js b/stock/doctype/stock_entry/stock_entry.js
index 7032f92..4ade2ff 100644
--- a/stock/doctype/stock_entry/stock_entry.js
+++ b/stock/doctype/stock_entry/stock_entry.js
@@ -25,14 +25,14 @@
 	set_default_account: function() {
 		var me = this;
 		
-		if (sys_defaults.auto_inventory_accounting && !this.frm.doc.expense_adjustment_account) {
-			if (this.frm.doc.purpose == "Sales Return") 
+		if (cint(wn.defaults.get_default("auto_inventory_accounting")) && !this.frm.doc.expense_adjustment_account) {
+			if (this.frm.doc.purpose == "Sales Return")
 				account_for = "stock_in_hand_account";
 			else if (this.frm.doc.purpose == "Purchase Return") 
 				account_for = "stock_received_but_not_billed";
 			else account_for = "stock_adjustment_account";
 			
-			this.frm.call({
+			return this.frm.call({
 				method: "accounts.utils.get_company_default",
 				args: {
 					"fieldname": account_for, 
@@ -78,7 +78,7 @@
 			}
 		};
 		
-		if (sys_defaults.auto_inventory_accounting) {
+		if(cint(wn.defaults.get_default("auto_inventory_accounting"))) {
 			this.frm.add_fetch("company", "stock_adjustment_account", "expense_adjustment_account");
 
 			this.frm.fields_dict["expense_adjustment_account"].get_query = function() {
@@ -105,11 +105,8 @@
 		erpnext.hide_naming_series();
 		this.toggle_related_fields(this.frm.doc);
 		this.toggle_enable_bom();
-		if (this.frm.doc.docstatus==1) {
-			this.show_stock_ledger();
-			if(wn.boot.auto_inventory_accounting)
-				this.show_general_ledger();
-		}
+		this.show_stock_ledger();
+		this.show_general_ledger();
 		
 		if(this.frm.doc.docstatus === 1 && 
 				wn.boot.profile.can_create.indexOf("Journal Voucher")!==-1) {
@@ -142,7 +139,7 @@
 	},
 	
 	get_items: function() {
-		this.frm.call({
+		return this.frm.call({
 			doc: this.frm.doc,
 			method: "get_items",
 			callback: function(r) {
@@ -160,7 +157,7 @@
 	production_order: function() {
 		this.toggle_enable_bom();
 		
-		this.frm.call({
+		return this.frm.call({
 			method: "get_production_order_details",
 			args: {production_order: this.frm.doc.production_order}
 		});
@@ -212,7 +209,7 @@
 	
 	make_return_jv: function() {
 		if(this.get_doctype_docname()) {
-			this.frm.call({
+			return this.frm.call({
 				method: "make_return_jv",
 				args: {
 					stock_entry: this.frm.doc.name
@@ -269,23 +266,23 @@
 }
 
 cur_frm.cscript.delivery_note_no = function(doc,cdt,cdn){
-	if(doc.delivery_note_no) get_server_fields('get_cust_values','','',doc,cdt,cdn,1);
+	if(doc.delivery_note_no) return get_server_fields('get_cust_values','','',doc,cdt,cdn,1);
 }
 
 cur_frm.cscript.sales_invoice_no = function(doc,cdt,cdn){
-	if(doc.sales_invoice_no) get_server_fields('get_cust_values','','',doc,cdt,cdn,1);
+	if(doc.sales_invoice_no) return get_server_fields('get_cust_values','','',doc,cdt,cdn,1);
 }
 
 cur_frm.cscript.customer = function(doc,cdt,cdn){
-	if(doc.customer) get_server_fields('get_cust_addr','','',doc,cdt,cdn,1);
+	if(doc.customer) return get_server_fields('get_cust_addr','','',doc,cdt,cdn,1);
 }
 
 cur_frm.cscript.purchase_receipt_no = function(doc,cdt,cdn){
-	if(doc.purchase_receipt_no)	get_server_fields('get_supp_values','','',doc,cdt,cdn,1);
+	if(doc.purchase_receipt_no)	return get_server_fields('get_supp_values','','',doc,cdt,cdn,1);
 }
 
 cur_frm.cscript.supplier = function(doc,cdt,cdn){
-	if(doc.supplier) get_server_fields('get_supp_addr','','',doc,cdt,cdn,1);
+	if(doc.supplier) return get_server_fields('get_supp_addr','','',doc,cdt,cdn,1);
 
 }
 
@@ -328,7 +325,7 @@
 		'serial_no'		: d.serial_no,
 		'bom_no'		: d.bom_no
 	};
-	get_server_fields('get_item_details',JSON.stringify(args),'mtn_details',doc,cdt,cdn,1);
+	return get_server_fields('get_item_details',JSON.stringify(args),'mtn_details',doc,cdt,cdn,1);
 }
 
 cur_frm.cscript.s_warehouse = function(doc, cdt, cdn) {
@@ -341,7 +338,7 @@
 		'bom_no'		: d.bom_no,
 		'qty'			: d.s_warehouse ? -1* d.qty : d.qty
 	}
-	get_server_fields('get_warehouse_details', JSON.stringify(args), 
+	return get_server_fields('get_warehouse_details', JSON.stringify(args), 
 		'mtn_details', doc, cdt, cdn, 1);
 }
 
@@ -351,7 +348,7 @@
 	var d = locals[cdt][cdn];
 	if(d.uom && d.item_code){
 		var arg = {'item_code':d.item_code, 'uom':d.uom, 'qty':d.qty}
-		get_server_fields('get_uom_details',JSON.stringify(arg),'mtn_details', doc, cdt, cdn, 1);
+		return get_server_fields('get_uom_details',JSON.stringify(arg),'mtn_details', doc, cdt, cdn, 1);
 	}
 }
 
diff --git a/stock/doctype/stock_entry/stock_entry.py b/stock/doctype/stock_entry/stock_entry.py
index 58f17c7..afa3eb4 100644
--- a/stock/doctype/stock_entry/stock_entry.py
+++ b/stock/doctype/stock_entry/stock_entry.py
@@ -554,7 +554,7 @@
 					`tabBOM Item`, `tabItem`
 				where 
 					`tabBOM Item`.parent = %s and 
-					`tabBOM Item`.item_code = tabItem.name
+					`tabBOM Item`.item_code = tabItem.name and
 					`tabBOM Item`.docstatus < 2 
 				group by item_code""", (qty, self.doc.bom_no), as_dict=1)
 			
diff --git a/stock/doctype/stock_reconciliation/stock_reconciliation.js b/stock/doctype/stock_reconciliation/stock_reconciliation.js
index 2e0efd8..2db8cba 100644
--- a/stock/doctype/stock_reconciliation/stock_reconciliation.js
+++ b/stock/doctype/stock_reconciliation/stock_reconciliation.js
@@ -26,7 +26,7 @@
 		var me = this;
 		
 		if (sys_defaults.auto_inventory_accounting && !this.frm.doc.expense_account) {
-			this.frm.call({
+			return this.frm.call({
 				method: "accounts.utils.get_company_default",
 				args: {
 					"fieldname": "stock_adjustment_account", 
@@ -68,6 +68,7 @@
 		} else if(this.frm.doc.docstatus == 1) {
 			this.frm.set_intro("Cancelling this Stock Reconciliation will nullify its effect.");
 			this.show_stock_ledger();
+			this.show_general_ledger();
 		} else {
 			this.frm.set_intro("");
 		}
diff --git a/stock/doctype/stock_uom_replace_utility/stock_uom_replace_utility.js b/stock/doctype/stock_uom_replace_utility/stock_uom_replace_utility.js
index d736ff6..86f5bff 100644
--- a/stock/doctype/stock_uom_replace_utility/stock_uom_replace_utility.js
+++ b/stock/doctype/stock_uom_replace_utility/stock_uom_replace_utility.js
@@ -21,7 +21,7 @@
 	
 	item_code: function() {
 		if(cur_frm.doc.item_code) {
-			cur_frm.call({
+			return cur_frm.call({
 				method: "get_stock_uom",
 				args: { item_code: cur_frm.doc.item_code }
 			});
diff --git a/stock/doctype/warehouse/warehouse.js b/stock/doctype/warehouse/warehouse.js
index 0e9cd33..902f66f 100644
--- a/stock/doctype/warehouse/warehouse.js
+++ b/stock/doctype/warehouse/warehouse.js
@@ -26,6 +26,6 @@
 	var check = confirm("Are you sure you want to merge this warehouse into " 
 		+ doc.merge_with + "?");
 	if (check) {
-		$c_obj(make_doclist(cdt, cdn), 'merge_warehouses', '', '');
+		return $c_obj(make_doclist(cdt, cdn), 'merge_warehouses', '', '');
 	}
 }
\ No newline at end of file
diff --git a/support/doctype/customer_issue/customer_issue.js b/support/doctype/customer_issue/customer_issue.js
index 3620c7e..9535fba 100644
--- a/support/doctype/customer_issue/customer_issue.js
+++ b/support/doctype/customer_issue/customer_issue.js
@@ -26,13 +26,13 @@
 	customer: function() {
 		var me = this;
 		if(this.frm.doc.customer) {
-			this.frm.call({
+			// TODO shift this to depends_on
+			unhide_field(['customer_address', 'contact_person']);
+			
+			return this.frm.call({
 				doc: this.frm.doc,
 				method: "set_customer_defaults",
 			});
-			
-			// TODO shift this to depends_on
-			unhide_field(['customer_address', 'contact_person']);
 		}
 	}, 
 	
@@ -56,7 +56,7 @@
 
 cur_frm.cscript.customer_address = cur_frm.cscript.contact_person = function(doc,dt,dn) {		
 	if(doc.customer) 
-		get_server_fields('get_customer_address', 
+		return get_server_fields('get_customer_address', 
 			JSON.stringify({customer: doc.customer, address: doc.customer_address, contact: doc.contact_person}),'', doc, dt, dn, 1);
 }
 
diff --git a/support/doctype/maintenance_schedule/maintenance_schedule.js b/support/doctype/maintenance_schedule/maintenance_schedule.js
index f8652d7..436caba 100644
--- a/support/doctype/maintenance_schedule/maintenance_schedule.js
+++ b/support/doctype/maintenance_schedule/maintenance_schedule.js
@@ -44,7 +44,7 @@
 	customer: function() {
 		var me = this;
 		if(this.frm.doc.customer) {
-			this.frm.call({
+			return this.frm.call({
 				doc: this.frm.doc,
 				method: "set_customer_defaults",
 			});
@@ -64,7 +64,7 @@
 }
 
 cur_frm.cscript.customer_address = cur_frm.cscript.contact_person = function(doc,dt,dn) {    
-  if(doc.customer) get_server_fields('get_customer_address', JSON.stringify({customer: doc.customer, address: doc.customer_address, contact: doc.contact_person}),'', doc, dt, dn, 1);
+  if(doc.customer) return get_server_fields('get_customer_address', JSON.stringify({customer: doc.customer, address: doc.customer_address, contact: doc.contact_person}),'', doc, dt, dn, 1);
 }
 
 cur_frm.fields_dict['customer_address'].get_query = function(doc, cdt, cdn) {
@@ -90,7 +90,7 @@
   var fname = cur_frm.cscript.fname;
   var d = locals[cdt][cdn];
   if (d.item_code) {
-    get_server_fields('get_item_details',d.item_code, 'item_maintenance_detail',doc,cdt,cdn,1);
+    return get_server_fields('get_item_details',d.item_code, 'item_maintenance_detail',doc,cdt,cdn,1);
   }
 }
 
@@ -101,7 +101,7 @@
     arg.start_date = d.start_date;
     arg.end_date = d.end_date;
     arg.periodicity = d.periodicity;
-    get_server_fields('get_no_of_visits',docstring(arg),'item_maintenance_detail',doc, cdt, cdn, 1);
+    return get_server_fields('get_no_of_visits',docstring(arg),'item_maintenance_detail',doc, cdt, cdn, 1);
   }
   else{
     msgprint("Please enter Start Date and End Date");
@@ -110,7 +110,7 @@
 
 cur_frm.cscript.generate_schedule = function(doc, cdt, cdn) {
   if (!doc.__islocal) {
-    $c('runserverobj', args={'method':'generate_schedule', 'docs':wn.model.compress(make_doclist(cdt,cdn))},
+    return $c('runserverobj', args={'method':'generate_schedule', 'docs':wn.model.compress(make_doclist(cdt,cdn))},
       function(r,rt){
         refresh_field('maintenance_schedule_detail');
       }
diff --git a/support/doctype/maintenance_visit/maintenance_visit.js b/support/doctype/maintenance_visit/maintenance_visit.js
index 9f5fc5d..4257afa 100644
--- a/support/doctype/maintenance_visit/maintenance_visit.js
+++ b/support/doctype/maintenance_visit/maintenance_visit.js
@@ -62,13 +62,13 @@
 	customer: function() {
 		var me = this;
 		if(this.frm.doc.customer) {
-			this.frm.call({
+			// TODO shift this to depends_on
+			cur_frm.cscript.hide_contact_info();
+			
+			return this.frm.call({
 				doc: this.frm.doc,
 				method: "set_customer_defaults",
 			});
-			
-			// TODO shift this to depends_on
-			cur_frm.cscript.hide_contact_info();			
 		}
 	}, 
 });
@@ -86,7 +86,7 @@
 }
 
 cur_frm.cscript.customer_address = cur_frm.cscript.contact_person = function(doc,dt,dn) {		
-	if(doc.customer) get_server_fields('get_customer_address', JSON.stringify({customer: doc.customer, address: doc.customer_address, contact: doc.contact_person}),'', doc, dt, dn, 1);
+	if(doc.customer) return get_server_fields('get_customer_address', JSON.stringify({customer: doc.customer, address: doc.customer_address, contact: doc.contact_person}),'', doc, dt, dn, 1);
 }
 
 cur_frm.fields_dict['customer_address'].get_query = function(doc, cdt, cdn) {
@@ -111,7 +111,7 @@
 	var fname = cur_frm.cscript.fname;
 	var d = locals[cdt][cdn];
 	if (d.item_code) {
-		get_server_fields('get_item_details',d.item_code, 'maintenance_visit_details',doc,cdt,cdn,1);
+		return get_server_fields('get_item_details',d.item_code, 'maintenance_visit_details',doc,cdt,cdn,1);
 	}
 }
 
diff --git a/support/doctype/newsletter/newsletter.js b/support/doctype/newsletter/newsletter.js
index b7e24d2..5842acc 100644
--- a/support/doctype/newsletter/newsletter.js
+++ b/support/doctype/newsletter/newsletter.js
@@ -19,7 +19,7 @@
 	if(!doc.__islocal && !cint(doc.email_sent) && !doc.__unsaved
 			&& inList(wn.boot.profile.can_write, doc.doctype)) {
 		cur_frm.add_custom_button('Send', function() {
-			$c_obj(make_doclist(doc.doctype, doc.name), 'send_emails', '', function(r) {
+			return $c_obj(make_doclist(doc.doctype, doc.name), 'send_emails', '', function(r) {
 				cur_frm.refresh();
 			});
 		})
@@ -30,7 +30,7 @@
 			repl("%(fullname)s <%(email)s>", wn.user_info(doc.owner)));
 	}
 	
-	wn.call({
+	return wn.call({
 		method: "support.doctype.newsletter.newsletter.get_lead_options",
 		type: "GET",
 		callback: function(r) {
diff --git a/support/doctype/support_ticket/support_ticket.js b/support/doctype/support_ticket/support_ticket.js
index d8cc798..34cc5ef 100644
--- a/support/doctype/support_ticket/support_ticket.js
+++ b/support/doctype/support_ticket/support_ticket.js
@@ -23,7 +23,7 @@
 	customer: function() {
 		var me = this;
 		if(this.frm.doc.customer) {
-			this.frm.call({
+			return this.frm.call({
 				doc: this.frm.doc,
 				method: "set_customer_defaults",
 			});			
@@ -93,7 +93,7 @@
 	},
 
 	set_status: function(status) {
-		wn.call({
+		return wn.call({
 			method:"support.doctype.support_ticket.support_ticket.set_status",
 			args: {
 				name: cur_frm.doc.name,
diff --git a/utilities/doctype/rename_tool/rename_tool.js b/utilities/doctype/rename_tool/rename_tool.js
index 66a4399..bba7573 100644
--- a/utilities/doctype/rename_tool/rename_tool.js
+++ b/utilities/doctype/rename_tool/rename_tool.js
@@ -1,5 +1,5 @@
 cur_frm.cscript.refresh = function(doc) {
-	wn.call({
+	return wn.call({
 		method:"utilities.doctype.rename_tool.rename_tool.get_doctypes",
 		callback: function(r) {
 			cur_frm.set_df_property("select_doctype", "options", r.message);
diff --git a/utilities/doctype/sms_control/sms_control.js b/utilities/doctype/sms_control/sms_control.js
index e56315c..e6e14f7 100644
--- a/utilities/doctype/sms_control/sms_control.js
+++ b/utilities/doctype/sms_control/sms_control.js
@@ -17,7 +17,7 @@
 function SMSManager() {
 	var me = this;
 	this.get_contact_number = function(contact, key, value) {
-		$c_obj('SMS Control', 'get_contact_number', {
+		return $c_obj('SMS Control', 'get_contact_number', {
 				contact_name:contact, 
 				value:value,
 				key:key
@@ -63,7 +63,7 @@
 			var v = me.dialog.get_values();
 			if(v) {
 				$(this).set_working();
-				$c_obj('SMS Control', 'send_form_sms', v, function(r,rt) {
+				return $c_obj('SMS Control', 'send_form_sms', v, function(r,rt) {
 					$(this).done_working();
 					if(r.exc) {msgprint(r.exc); return; }
 					msgprint('Message Sent');
diff --git a/website/templates/js/cart.js b/website/templates/js/cart.js
index a22b9f3..ffa084a 100644
--- a/website/templates/js/cart.js
+++ b/website/templates/js/cart.js
@@ -18,7 +18,7 @@
 
 $(document).ready(function() {
 	wn.cart.bind_events();
-	wn.call({
+	return wn.call({
 		type: "POST",
 		method: "website.helpers.cart.get_cart_quotation",
 		callback: function(r) {
@@ -204,7 +204,7 @@
 	},
 	
 	apply_shipping_rule: function(rule, btn) {
-		wn.call({
+		return wn.call({
 			btn: btn,
 			type: "POST",
 			method: "website.helpers.cart.apply_shipping_rule",
@@ -257,7 +257,7 @@
 					}
 				});
 				
-				wn.call({
+				return wn.call({
 					type: "POST",
 					method: "website.helpers.cart.update_cart_address",
 					args: {
@@ -288,7 +288,7 @@
 	},
 	
 	place_order: function() {
-		wn.call({
+		return wn.call({
 			type: "POST",
 			method: "website.helpers.cart.place_order",
 			callback: function(r) {