Merge branch 'develop'
diff --git a/accounts/doctype/gl_entry/gl_entry.py b/accounts/doctype/gl_entry/gl_entry.py
index d3c6317..694917f 100644
--- a/accounts/doctype/gl_entry/gl_entry.py
+++ b/accounts/doctype/gl_entry/gl_entry.py
@@ -146,11 +146,12 @@
 		webnotes.conn.sql("update `tab%s` set outstanding_amount=%s where name='%s'" %
 		 	(against_voucher_type, bal, against_voucher))
 			
-def validate_frozen_account(account, adv_adj):
+def validate_frozen_account(account, adv_adj=None):
 	frozen_account = webnotes.conn.get_value("Account", account, "freeze_account")
 	if frozen_account == 'Yes' and not adv_adj:
 		frozen_accounts_modifier = webnotes.conn.get_value( 'Accounts Settings', None, 
 			'frozen_accounts_modifier')
+		
 		if not frozen_accounts_modifier:
 			webnotes.throw(account + _(" is a frozen account. \
 				Either make the account active or assign role in Accounts Settings \
diff --git a/accounts/doctype/sales_invoice/pos.js b/accounts/doctype/sales_invoice/pos.js
index adbdca1..1d58f2d 100644
--- a/accounts/doctype/sales_invoice/pos.js
+++ b/accounts/doctype/sales_invoice/pos.js
@@ -19,8 +19,10 @@
 							<table class="table table-condensed table-hover" id="cart" style="table-layout: fixed;">\
 								<thead>\
 									<tr>\
-										<th style="width: 50%">Item</th>\
-										<th style="width: 25%; text-align: right;">Qty</th>\
+										<th style="width: 40%">Item</th>\
+										<th style="width: 9%"></th>\
+										<th style="width: 17%; text-align: right;">Qty</th>\
+										<th style="width: 9%"></th>\
 										<th style="width: 25%; text-align: right;">Rate</th>\
 									</tr>\
 								</thead>\
@@ -60,10 +62,16 @@
 						</div>\
 					</div>\
 					<br><br>\
-					<button class="btn btn-success btn-lg make-payment">\
-					<i class="icon-money"></i> Make Payment</button>\
-					<button class="btn btn-default btn-lg delete-items pull-right" style="display: none;">\
-					<i class="icon-trash"></i> Del</button>\
+					<div class="row">\
+						<div class="col-sm-9">\
+							<button class="btn btn-success btn-lg make-payment">\
+								<i class="icon-money"></i> Make Payment</button>\
+						</div>\
+						<div class="col-sm-3">\
+							<button class="btn btn-default btn-lg remove-items" style="display: none;">\
+								<i class="icon-trash"></i> Del</button>\
+						</div>\
+					</div>\
 					<br><br>\
 				</div>\
 				<div class="col-sm-6">\
@@ -82,7 +90,7 @@
 			me.refresh();
 		});
 
-		this.call_function("delete-items", function() {me.remove_selected_item();});
+		this.call_function("remove-items", function() {me.remove_selected_items();});
 		this.call_function("make-payment", function() {me.make_payment();});
 	},
 	check_transaction_type: function() {
@@ -333,7 +341,7 @@
 		}
 
 		this.disable_text_box_and_button();
-		this.make_payment_button();
+		this.hide_payment_button();
 
 		// If quotation to is not Customer then remove party
 		if (this.frm.doctype == "Quotation") {
@@ -351,8 +359,18 @@
 
 			$(repl('<tr id="%(item_code)s" data-selected="false">\
 					<td>%(item_code)s%(item_name)s</td>\
-					<td><input type="text" value="%(qty)s" \
+					<td style="vertical-align:middle;" align="right">\
+						<div class="decrease-qty" style="cursor:pointer;">\
+							<i class="icon-minus-sign icon-large text-danger"></i>\
+						</div>\
+					</td>\
+					<td style="vertical-align:middle;"><input type="text" value="%(qty)s" \
 						class="form-control qty" style="text-align: right;"></td>\
+					<td style="vertical-align:middle;cursor:pointer;">\
+						<div class="increase-qty" style="cursor:pointer;">\
+							<i class="icon-plus-sign icon-large text-success"></i>\
+						</div>\
+					</td>\
 					<td style="text-align: right;"><b>%(amount)s</b><br>%(rate)s</td>\
 				</tr>',
 				{
@@ -364,27 +382,32 @@
 				}
 			)).appendTo($items);
 		});
+
+		this.wrapper.find(".increase-qty, .decrease-qty").on("click", function() {
+			var item_code = $(this).closest("tr").attr("id");
+			me.selected_item_qty_operation(item_code, $(this).attr("class"));
+		});
 	},
 	show_taxes: function() {
 		var me = this;
 		var taxes = wn.model.get_children(this.sales_or_purchase + " Taxes and Charges", 
 			this.frm.doc.name, this.frm.cscript.other_fname, this.frm.doctype);
 		$(this.wrapper).find(".tax-table")
-			.toggle((taxes && taxes.length && 
-				flt(me.frm.doc.other_charges_total_export || 
-					me.frm.doc.other_charges_added_import) != 0.0) ? true : false)
+			.toggle((taxes && taxes.length) ? true : false)
 			.find("tbody").empty();
 		
 		$.each(taxes, function(i, d) {
-			$(repl('<tr>\
-				<td>%(description)s %(rate)s</td>\
-				<td style="text-align: right;">%(tax_amount)s</td>\
-			<tr>', {
-				description: d.description,
-				rate: ((d.charge_type == "Actual") ? '' : ("(" + d.rate + "%)")),
-				tax_amount: format_currency(flt(d.tax_amount)/flt(me.frm.doc.conversion_rate), 
-					me.frm.doc.currency)
-			})).appendTo(".tax-table tbody");
+			if (d.tax_amount) {
+				$(repl('<tr>\
+					<td>%(description)s %(rate)s</td>\
+					<td style="text-align: right;">%(tax_amount)s</td>\
+				<tr>', {
+					description: d.description,
+					rate: ((d.charge_type == "Actual") ? '' : ("(" + d.rate + "%)")),
+					tax_amount: format_currency(flt(d.tax_amount)/flt(me.frm.doc.conversion_rate), 
+						me.frm.doc.currency)
+				})).appendTo(".tax-table tbody");
+			}
 		});
 	},
 	set_totals: function() {
@@ -427,7 +450,7 @@
 			$(this.wrapper).find('input, button').each(function () {
 				$(this).prop('disabled', true);
 			});
-			$(this.wrapper).find(".delete-items").hide();
+			$(this.wrapper).find(".remove-items").hide();
 			$(this.wrapper).find(".make-payment").hide();
 		}
 		else {
@@ -437,14 +460,14 @@
 			$(this.wrapper).find(".make-payment").show();
 		}
 	},
-	make_payment_button: function() {
+	hide_payment_button: function() {
 		var me = this;
 		// Show Make Payment button only in Sales Invoice
 		if (this.frm.doctype != "Sales Invoice")
 			$(this.wrapper).find(".make-payment").hide();
 	},
 	refresh_delete_btn: function() {
-		$(this.wrapper).find(".delete-items").toggle($(".item-cart .warning").length ? true : false);		
+		$(this.wrapper).find(".remove-items").toggle($(".item-cart .warning").length ? true : false);
 	},
 	add_item_thru_barcode: function() {
 		var me = this;
@@ -466,7 +489,7 @@
 			}
 		});
 	},
-	remove_selected_item: function() {
+	remove_selected_items: function() {
 		var me = this;
 		var selected_items = [];
 		var no_of_items = $(this.wrapper).find("#cart tbody tr").length;
@@ -487,6 +510,7 @@
 				}
 			}
 		});
+
 		this.refresh_grid();
 	},
 	refresh_grid: function() {
@@ -494,6 +518,22 @@
 		this.frm.script_manager.trigger("calculate_taxes_and_totals");
 		this.refresh();
 	},
+	selected_item_qty_operation: function(item_code, operation) {
+		var me = this;
+		var child = wn.model.get_children(this.frm.doctype + " Item", this.frm.doc.name, 
+			this.frm.cscript.fname, this.frm.doctype);
+
+		$.each(child, function(i, d) {
+			if (d.item_code == item_code) {
+				if (operation == "increase-qty")
+					d.qty += 1;
+				else if (operation == "decrease-qty")
+					d.qty != 1 ? d.qty -= 1 : d.qty = 1;
+
+				me.refresh();
+			}
+		});
+	},
 	make_payment: function() {
 		var me = this;
 		var no_of_items = $(this.wrapper).find("#cart tbody tr").length;
diff --git a/accounts/report/bank_reconciliation_statement/bank_reconciliation_statement.js b/accounts/report/bank_reconciliation_statement/bank_reconciliation_statement.js
index b93f182..7f32e26 100644
--- a/accounts/report/bank_reconciliation_statement/bank_reconciliation_statement.js
+++ b/accounts/report/bank_reconciliation_statement/bank_reconciliation_statement.js
@@ -8,6 +8,7 @@
 			"label": wn._("Bank Account"),
 			"fieldtype": "Link",
 			"options": "Account",
+			"reqd": 1,
 			"get_query": function() {
 				return {
 					"query": "accounts.utils.get_account_list", 
@@ -22,7 +23,8 @@
 			"fieldname":"report_date",
 			"label": wn._("Date"),
 			"fieldtype": "Date",
-			"default": get_today()
+			"default": get_today(),
+			"reqd": 1
 		},
 	]
 }
\ No newline at end of file
diff --git a/accounts/report/bank_reconciliation_statement/bank_reconciliation_statement.py b/accounts/report/bank_reconciliation_statement/bank_reconciliation_statement.py
index 431a649..5672497 100644
--- a/accounts/report/bank_reconciliation_statement/bank_reconciliation_statement.py
+++ b/accounts/report/bank_reconciliation_statement/bank_reconciliation_statement.py
@@ -3,13 +3,14 @@
 
 from __future__ import unicode_literals
 import webnotes
-from webnotes import _, msgprint
 from webnotes.utils import flt
 
 def execute(filters=None):
 	if not filters: filters = {}
-		
-	columns = get_columns()	
+	
+	debit_or_credit = webnotes.conn.get_value("Account", filters["account"], "debit_or_credit")
+	
+	columns = get_columns()
 	data = get_entries(filters)
 	
 	from accounts.utils import get_balance_on
@@ -20,47 +21,39 @@
 		total_debit += flt(d[4])
 		total_credit += flt(d[5])
 
-	if webnotes.conn.get_value("Account", filters["account"], "debit_or_credit") == 'Debit':
+	if debit_or_credit == 'Debit':
 		bank_bal = flt(balance_as_per_company) - flt(total_debit) + flt(total_credit)
 	else:
 		bank_bal = flt(balance_as_per_company) + flt(total_debit) - flt(total_credit)
 		
 	data += [
-		["", "", "", "Balance as per company books", balance_as_per_company, ""], 
+		get_balance_row("Balance as per company books", balance_as_per_company, debit_or_credit),
 		["", "", "", "Amounts not reflected in bank", total_debit, total_credit], 
-		["", "", "", "Balance as per bank", bank_bal, ""]
+		get_balance_row("Balance as per bank", bank_bal, debit_or_credit)
 	]
-			
-	return columns, data
 	
+	return columns, data
 	
 def get_columns():
 	return ["Journal Voucher:Link/Journal Voucher:140", "Posting Date:Date:100", 
 		"Clearance Date:Date:110", "Against Account:Link/Account:200", 
 		"Debit:Currency:120", "Credit:Currency:120"
 	]
-
-def get_conditions(filters):
-	conditions = ""
-	if not filters.get("account"):
-		msgprint(_("Please select Bank Account"), raise_exception=1)
-	else:
-		conditions += " and jvd.account = %(account)s"
-		
-	if not filters.get("report_date"):
-		msgprint(_("Please select Date on which you want to run the report"), raise_exception=1)
-	else:
-		conditions += """ and jv.posting_date <= %(report_date)s 
-			and ifnull(jv.clearance_date, '4000-01-01') > %(report_date)s"""
-
-	return conditions
 	
 def get_entries(filters):
-	conditions = get_conditions(filters)
-	entries = webnotes.conn.sql("""select jv.name, jv.posting_date, jv.clearance_date, 
-		jvd.against_account, jvd.debit, jvd.credit
-		from `tabJournal Voucher Detail` jvd, `tabJournal Voucher` jv 
-		where jvd.parent = jv.name and jv.docstatus=1 and ifnull(jv.cheque_no, '')!= '' %s
-		order by jv.name DESC""" % conditions, filters, as_list=1)
+	entries = webnotes.conn.sql("""select 
+			jv.name, jv.posting_date, jv.clearance_date, jvd.against_account, jvd.debit, jvd.credit
+		from 
+			`tabJournal Voucher Detail` jvd, `tabJournal Voucher` jv 
+		where jvd.parent = jv.name and jv.docstatus=1 and ifnull(jv.cheque_no, '')!= '' 
+			and jvd.account = %(account)s and jv.posting_date <= %(report_date)s 
+			and ifnull(jv.clearance_date, '4000-01-01') > %(report_date)s
+		order by jv.name DESC""", filters, as_list=1)
 		
-	return entries
\ No newline at end of file
+	return entries
+	
+def get_balance_row(label, amount, debit_or_credit):
+	if debit_or_credit == "Debit":
+		return ["", "", "", label, amount, 0]
+	else:
+		return ["", "", "", label, 0, amount]
\ No newline at end of file
diff --git a/config.json b/config.json
index 8499ee8..8e033d5 100644
--- a/config.json
+++ b/config.json
@@ -1,6 +1,6 @@
 {
  "app_name": "ERPNext", 
- "app_version": "3.5.1", 
+ "app_version": "3.6.0", 
  "base_template": "app/portal/templates/base.html", 
  "modules": {
   "Accounts": {
@@ -74,5 +74,5 @@
    "type": "module"
   }
  }, 
- "requires_framework_version": "==3.5.0"
+ "requires_framework_version": "==3.7.0"
 }
\ No newline at end of file
diff --git a/controllers/accounts_controller.py b/controllers/accounts_controller.py
index a65bf26..8d33327 100644
--- a/controllers/accounts_controller.py
+++ b/controllers/accounts_controller.py
@@ -3,7 +3,7 @@
 
 from __future__ import unicode_literals
 import webnotes
-from webnotes import _, msgprint, throw
+from webnotes import _, throw
 from webnotes.utils import flt, cint, today, cstr
 from webnotes.model.code import get_obj
 from setup.utils import get_company_currency
@@ -44,14 +44,13 @@
 	def validate_for_freezed_account(self):
 		for fieldname in ["customer", "supplier"]:
 			if self.meta.get_field(fieldname) and self.doc.fields.get(fieldname):
-				accounts = webnotes.conn.get_values("Account", {"master_type": fieldname.title(), 
-					"master_name": self.doc.fields[fieldname], "company": self.doc.company}, 
-					"freeze_account", as_dict=1)
-				
+				accounts = webnotes.conn.get_values("Account", 
+					{"master_type": fieldname.title(), "master_name": self.doc.fields[fieldname], 
+					"company": self.doc.company}, "name")
 				if accounts:
-					if not filter(lambda x: cstr(x.freeze_account) in ["", "No"], accounts):
-						throw(_("Account for this ") + fieldname + _(" has been freezed. ") + 
-							self.doc.doctype + _(" can not be made."))
+					from accounts.doctype.gl_entry.gl_entry import validate_frozen_account
+					for account in accounts:						
+						validate_frozen_account(account[0])
 			
 	def set_price_list_currency(self, buying_or_selling):
 		if self.meta.get_field("currency"):
diff --git a/hr/report/monthly_salary_register/monthly_salary_register.js b/hr/report/monthly_salary_register/monthly_salary_register.js
index 5d3abcc..32b4ef3 100644
--- a/hr/report/monthly_salary_register/monthly_salary_register.js
+++ b/hr/report/monthly_salary_register/monthly_salary_register.js
@@ -7,7 +7,7 @@
 			"fieldname":"month",
 			"label": wn._("Month"),
 			"fieldtype": "Select",
-			"options": "Jan\nFeb\nMar\nApr\nMay\nJun\nJul\nAug\nSep\nOct\nNov\nDec",
+			"options": "\nJan\nFeb\nMar\nApr\nMay\nJun\nJul\nAug\nSep\nOct\nNov\nDec",
 			"default": ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", 
 				"Dec"][wn.datetime.str_to_obj(wn.datetime.get_today()).getMonth()],
 		},
diff --git a/hr/report/monthly_salary_register/monthly_salary_register.py b/hr/report/monthly_salary_register/monthly_salary_register.py
index 8bd8f36..9b8a84f 100644
--- a/hr/report/monthly_salary_register/monthly_salary_register.py
+++ b/hr/report/monthly_salary_register/monthly_salary_register.py
@@ -59,8 +59,8 @@
 	
 def get_salary_slips(filters):
 	conditions, filters = get_conditions(filters)
-	salary_slips = webnotes.conn.sql("""select * from `tabSalary Slip` where docstatus = 1 %s""" % 
-		conditions, filters, as_dict=1)
+	salary_slips = webnotes.conn.sql("""select * from `tabSalary Slip` where docstatus = 1 %s
+		order by employee, month""" % conditions, filters, as_dict=1)
 	
 	if not salary_slips:
 		msgprint(_("No salary slip found for month: ") + cstr(filters.get("month")) + 
diff --git a/patches/1401/p01_move_related_property_setters_to_custom_field.py b/patches/1401/p01_move_related_property_setters_to_custom_field.py
new file mode 100644
index 0000000..cf9221b
--- /dev/null
+++ b/patches/1401/p01_move_related_property_setters_to_custom_field.py
@@ -0,0 +1,25 @@
+# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
+# License: GNU General Public License v3. See license.txt
+
+import webnotes
+
+def execute():
+	webnotes.reload_doc("core", "doctype", "custom_field")
+	
+	cf_doclist = webnotes.get_doctype("Custom Field")
+
+	delete_list = []
+	for d in webnotes.conn.sql("""select cf.name as cf_name, ps.property, 
+			ps.value, ps.name as ps_name
+		from `tabProperty Setter` ps, `tabCustom Field` cf
+		where ps.doctype_or_field = 'DocField' and ps.property != 'previous_field'
+		and ps.doc_type=cf.dt and ps.field_name=cf.fieldname""", as_dict=1):
+			if cf_doclist.get_field(d.property):
+				webnotes.conn.sql("""update `tabCustom Field` 
+					set `%s`=%s where name=%s""" % (d.property, '%s', '%s'), (d.value, d.cf_name))
+				
+				delete_list.append(d.ps_name)
+	
+	if delete_list:
+		webnotes.conn.sql("""delete from `tabProperty Setter` where name in (%s)""" % 
+			', '.join(['%s']*len(delete_list)), tuple(delete_list))
\ No newline at end of file
diff --git a/patches/patch_list.py b/patches/patch_list.py
index d291d76..04a9288 100644
--- a/patches/patch_list.py
+++ b/patches/patch_list.py
@@ -263,5 +263,6 @@
 	"patches.1311.p08_email_digest_recipients",
 	"execute:webnotes.delete_doc('DocType', 'Warehouse Type')",
 	"patches.1312.p02_update_item_details_in_item_price",
+	"patches.1401.p01_move_related_property_setters_to_custom_field",
 	"patches.1401.p01_make_buying_selling_as_check_box_in_price_list",
 ]
\ No newline at end of file
diff --git a/setup/doctype/company/company.py b/setup/doctype/company/company.py
index 12281b4..88d9dca 100644
--- a/setup/doctype/company/company.py
+++ b/setup/doctype/company/company.py
@@ -5,7 +5,7 @@
 import webnotes
 from webnotes import _, msgprint
 
-from webnotes.utils import cstr
+from webnotes.utils import cstr, cint
 import webnotes.defaults
 
 
@@ -237,21 +237,28 @@
 		account.insert()
 
 	def set_default_accounts(self):
-		accounts = {
+		def _set_default_accounts(accounts):
+			for a in accounts:
+				account_name = accounts[a] + " - " + self.doc.abbr
+				if not self.doc.fields.get(a) and webnotes.conn.exists("Account", account_name):
+					webnotes.conn.set(self.doc, a, account_name)
+			
+		_set_default_accounts({
 			"default_income_account": "Sales",
 			"default_expense_account": "Cost of Goods Sold",
 			"receivables_group": "Accounts Receivable",
 			"payables_group": "Accounts Payable",
-			"default_cash_account": "Cash",
-			"stock_received_but_not_billed": "Stock Received But Not Billed",
-			"stock_adjustment_account": "Stock Adjustment",
-			"expenses_included_in_valuation": "Expenses Included In Valuation"
-		}
+			"default_cash_account": "Cash"
+		})
 		
-		for a in accounts:
-			account_name = accounts[a] + " - " + self.doc.abbr
-			if not self.doc.fields.get(a) and webnotes.conn.exists("Account", account_name):
-				webnotes.conn.set(self.doc, a, account_name)
+		if cint(webnotes.conn.get_value("Accounts Settings", None, "auto_accounting_for_stock")):
+			_set_default_accounts({
+				"stock_received_but_not_billed": "Stock Received But Not Billed",
+				"stock_adjustment_account": "Stock Adjustment",
+				"expenses_included_in_valuation": "Expenses Included In Valuation"
+			})
+		
+		
 
 	def create_default_cost_center(self):
 		cc_list = [