Merge branch 'develop'
diff --git a/erpnext/__version__.py b/erpnext/__version__.py
index 4220bc7..d004216 100644
--- a/erpnext/__version__.py
+++ b/erpnext/__version__.py
@@ -1,2 +1,2 @@
 from __future__ import unicode_literals
-__version__ = '6.12.2'
+__version__ = '6.12.3'
diff --git a/erpnext/accounts/doctype/journal_entry/journal_entry.js b/erpnext/accounts/doctype/journal_entry/journal_entry.js
index b1c355b..479eaaf 100644
--- a/erpnext/accounts/doctype/journal_entry/journal_entry.js
+++ b/erpnext/accounts/doctype/journal_entry/journal_entry.js
@@ -368,10 +368,6 @@
 
 	credit: function(frm, dt, dn) {
 		cur_frm.cscript.update_totals(frm.doc);
-	},
-
-	exchange_rate: function(frm, cdt, cdn) {
-		erpnext.journal_entry.set_debit_credit_in_company_currency(frm, cdt, cdn);
 	}
 })
 
@@ -418,7 +414,7 @@
 
 		if(row.account_currency == company_currency || !frm.doc.multi_currency) {
 			frappe.model.set_value(cdt, cdn, "exchange_rate", 1);
-		} else if (!row.exchange_rate || row.account_type == "Bank") {
+		} else if (!row.exchange_rate || row.exchange_rate == 1 || row.account_type == "Bank") {
 			frappe.call({
 				method: "erpnext.accounts.doctype.journal_entry.journal_entry.get_exchange_rate",
 				args: {
diff --git a/erpnext/accounts/doctype/journal_entry/journal_entry.py b/erpnext/accounts/doctype/journal_entry/journal_entry.py
index eefa0db..ec22483 100644
--- a/erpnext/accounts/doctype/journal_entry/journal_entry.py
+++ b/erpnext/accounts/doctype/journal_entry/journal_entry.py
@@ -295,7 +295,7 @@
 		for d in self.get("accounts"):
 			if d.account_currency == self.company_currency:
 				d.exchange_rate = 1
-			elif not d.exchange_rate or d.account_type=="Bank" or \
+			elif not d.exchange_rate or d.exchange_rate == 1 or \
 				(d.reference_type in ("Sales Invoice", "Purchase Invoice") and d.reference_name):
 					d.exchange_rate = get_exchange_rate(d.account, d.account_currency, self.company,
 						d.reference_type, d.reference_name, d.debit, d.credit, d.exchange_rate)
@@ -350,7 +350,7 @@
 			elif frappe.db.get_value("Account", d.account, "account_type") in ["Bank", "Cash"]:
 				total_amount += (d.debit_in_account_currency or d.credit_in_account_currency)
 				bank_account_currency = d.account_currency
-				
+
 		self.set_total_amount(total_amount, bank_account_currency)
 
 	def set_total_amount(self, amt, currency):
@@ -743,6 +743,11 @@
 		"exchange_rate": get_exchange_rate(account, account_details.account_currency,
 			company, debit=debit, credit=credit, exchange_rate=exchange_rate)
 	}
+
+	# un-set party if not party type
+	if not party_type:
+		grid_values["party"] = ""
+
 	return grid_values
 
 @frappe.whitelist()
diff --git a/erpnext/accounts/doctype/journal_entry_account/journal_entry_account.json b/erpnext/accounts/doctype/journal_entry_account/journal_entry_account.json
index 348c444..9277da5 100644
--- a/erpnext/accounts/doctype/journal_entry_account/journal_entry_account.json
+++ b/erpnext/accounts/doctype/journal_entry_account/journal_entry_account.json
@@ -10,7 +10,7 @@
  "fields": [
   {
    "allow_on_submit": 0, 
-   "bold": 0, 
+   "bold": 1, 
    "collapsible": 0, 
    "fieldname": "account", 
    "fieldtype": "Link", 
@@ -334,7 +334,7 @@
   }, 
   {
    "allow_on_submit": 0, 
-   "bold": 0, 
+   "bold": 1, 
    "collapsible": 0, 
    "fieldname": "debit_in_account_currency", 
    "fieldtype": "Currency", 
@@ -359,7 +359,7 @@
   }, 
   {
    "allow_on_submit": 0, 
-   "bold": 0, 
+   "bold": 1, 
    "collapsible": 0, 
    "fieldname": "debit", 
    "fieldtype": "Currency", 
@@ -408,7 +408,7 @@
   }, 
   {
    "allow_on_submit": 0, 
-   "bold": 0, 
+   "bold": 1, 
    "collapsible": 0, 
    "fieldname": "credit_in_account_currency", 
    "fieldtype": "Currency", 
@@ -433,7 +433,7 @@
   }, 
   {
    "allow_on_submit": 0, 
-   "bold": 0, 
+   "bold": 1, 
    "collapsible": 0, 
    "fieldname": "credit", 
    "fieldtype": "Currency", 
@@ -614,7 +614,7 @@
  "issingle": 0, 
  "istable": 1, 
  "max_attachments": 0, 
- "modified": "2015-11-24 02:36:05.804010", 
+ "modified": "2015-12-02 04:14:37.571883", 
  "modified_by": "Administrator", 
  "module": "Accounts", 
  "name": "Journal Entry Account", 
diff --git a/erpnext/accounts/doctype/tax_rule/tax_rule.js b/erpnext/accounts/doctype/tax_rule/tax_rule.js
index 4b059dc..4c35370 100644
--- a/erpnext/accounts/doctype/tax_rule/tax_rule.js
+++ b/erpnext/accounts/doctype/tax_rule/tax_rule.js
@@ -4,19 +4,26 @@
 cur_frm.add_fetch("customer", "customer_group", "customer_group" );
 cur_frm.add_fetch("supplier", "supplier_type", "supplier_type" );
 
-cur_frm.toggle_reqd("sales_tax_template", cur_frm.doc.tax_type=="Sales");
-cur_frm.toggle_reqd("purchase_tax_template", cur_frm.doc.tax_type=="Purchase");
-
+frappe.ui.form.on("Tax Rule", "tax_type", function(frm) {
+	frm.toggle_reqd("sales_tax_template", frm.doc.tax_type=="Sales");
+	frm.toggle_reqd("purchase_tax_template", frm.doc.tax_type=="Purchase");
+})
 
 frappe.ui.form.on("Tax Rule", "onload", function(frm) {
-	if(frm.doc.__islocal){
+	if(frm.doc.__islocal) {
 		frm.set_value("use_for_shopping_cart", 1);
 	}
 })
 
+frappe.ui.form.on("Tax Rule", "refresh", function(frm) {
+	frappe.ui.form.trigger("Tax Rule", "tax_type");
+})
+
 frappe.ui.form.on("Tax Rule", "use_for_shopping_cart", function(frm) {
-	if(!frm.doc.use_for_shopping_cart && (frappe.get_list("Tax Rule", {"use_for_shopping_cart":1}).length == 0)){
-		frappe.model.get_value("Shopping Cart Settings", "Shopping Cart Settings", "enabled", function(docfield) {
+	if(!frm.doc.use_for_shopping_cart && 
+			(frappe.get_list("Tax Rule", {"use_for_shopping_cart":1}).length == 0)) {
+		frappe.model.get_value("Shopping Cart Settings", "Shopping Cart Settings", 
+				"enabled", function(docfield) {
 			if(docfield.enabled){
 				frm.set_value("use_for_shopping_cart", 1);
 				frappe.throw(__("Shopping Cart is enabled"));
diff --git a/erpnext/accounts/page/accounts_browser/accounts_browser.js b/erpnext/accounts/page/accounts_browser/accounts_browser.js
index 6a2a831..403c1ce 100644
--- a/erpnext/accounts/page/accounts_browser/accounts_browser.js
+++ b/erpnext/accounts/page/accounts_browser/accounts_browser.js
@@ -166,7 +166,10 @@
 				var dr_or_cr = node.data.balance < 0 ? "Cr" : "Dr";
 				if (me.ctype == 'Account' && node.data && node.data.balance!==undefined) {
 					$('<span class="balance-area pull-right text-muted small">'
-						+ format_currency(Math.abs(node.data.balance), node.data.account_currency)
+						+ (node.data.balance_in_account_currency ? 
+							(format_currency(Math.abs(node.data.balance_in_account_currency), 
+								node.data.account_currency) + " / ") : "")
+						+ format_currency(Math.abs(node.data.balance), node.data.company_currency)
 						+ " " + dr_or_cr
 						+ '</span>').insertBefore(node.$ul);
 				}
diff --git a/erpnext/accounts/page/accounts_browser/accounts_browser.py b/erpnext/accounts/page/accounts_browser/accounts_browser.py
index 210c4bf..891a05d 100644
--- a/erpnext/accounts/page/accounts_browser/accounts_browser.py
+++ b/erpnext/accounts/page/accounts_browser/accounts_browser.py
@@ -44,7 +44,12 @@
 				args['parent'], as_dict=1)
 
 	if ctype == 'Account':
+		company_currency = frappe.db.get_value("Company", company, "default_currency")
 		for each in acc:
-			each["balance"] = flt(get_balance_on(each.get("value")))
+			each["company_currency"] = company_currency
+			each["balance"] = flt(get_balance_on(each.get("value"), in_account_currency=False))
+			
+			if each.account_currency != company_currency:
+				each["balance_in_account_currency"] = flt(get_balance_on(each.get("value")))
 
 	return acc
diff --git a/erpnext/hooks.py b/erpnext/hooks.py
index bb68978..744db44 100644
--- a/erpnext/hooks.py
+++ b/erpnext/hooks.py
@@ -7,7 +7,7 @@
 app_description = """ERP made simple"""
 app_icon = "icon-th"
 app_color = "#e74c3c"
-app_version = "6.12.2"
+app_version = "6.12.3"
 app_email = "info@erpnext.com"
 app_license = "GNU General Public License (v3)"
 source_link = "https://github.com/frappe/erpnext"
diff --git a/erpnext/hr/doctype/holiday_list/test_records.json b/erpnext/hr/doctype/holiday_list/test_records.json
index 342bacb..a8cf56b 100644
--- a/erpnext/hr/doctype/holiday_list/test_records.json
+++ b/erpnext/hr/doctype/holiday_list/test_records.json
@@ -8,6 +8,10 @@
     "holiday_date": "2013-01-01"
    },
    {
+    "description": "Republic Day", 
+    "holiday_date": "2013-01-26"
+   },
+   {
     "description": "Test Holiday", 
     "holiday_date": "2013-02-01"
    }
diff --git a/erpnext/hr/doctype/salary_slip/salary_slip.py b/erpnext/hr/doctype/salary_slip/salary_slip.py
index ea7c96e..818c95e 100644
--- a/erpnext/hr/doctype/salary_slip/salary_slip.py
+++ b/erpnext/hr/doctype/salary_slip/salary_slip.py
@@ -4,7 +4,7 @@
 from __future__ import unicode_literals
 import frappe
 
-from frappe.utils import add_days, cint, cstr, flt, getdate, nowdate, rounded
+from frappe.utils import add_days, cint, cstr, flt, getdate, nowdate, rounded, date_diff
 from frappe.model.naming import make_autoname
 
 from frappe import msgprint, _
@@ -20,19 +20,20 @@
 
 	def get_emp_and_leave_details(self):
 		if self.employee:
-			self.get_leave_details()
-			struct = self.check_sal_struct()
+			joining_date, relieving_date = frappe.db.get_value("Employee", self.employee, 
+				["date_of_joining", "relieving_date"])
+				
+			self.get_leave_details(joining_date, relieving_date)
+			
+			struct = self.check_sal_struct(joining_date, relieving_date)
 			if struct:
 				self.set("earnings", [])
 				self.set("deduction", [])
 				self.pull_sal_struct(struct)
 
-	def check_sal_struct(self):
+	def check_sal_struct(self, joining_date, relieving_date):
 		m = get_month_details(self.fiscal_year, self.month)
 		
-		joining_date, relieving_date = frappe.db.get_value("Employee", self.employee, 
-			["date_of_joining", "relieving_date"])
-		
 		struct = frappe.db.sql("""select name from `tabSalary Structure`
 			where employee=%s and is_active = 'Yes'
 			and (from_date <= %s or from_date <= %s) 
@@ -51,69 +52,76 @@
 		make_salary_slip(struct, self)
 
 	def pull_emp_details(self):
-		emp = frappe.db.get_value("Employee", self.employee,
-			["bank_name", "bank_ac_no"], as_dict=1)
+		emp = frappe.db.get_value("Employee", self.employee, ["bank_name", "bank_ac_no"], as_dict=1)
 		if emp:
 			self.bank_name = emp.bank_name
 			self.bank_account_no = emp.bank_ac_no
 
-	def get_leave_details(self, lwp=None):
+	def get_leave_details(self, joining_date=None, relieving_date=None, lwp=None):
 		if not self.fiscal_year:
 			self.fiscal_year = frappe.db.get_default("fiscal_year")
 		if not self.month:
 			self.month = "%02d" % getdate(nowdate()).month
+			
+		if not joining_date:
+			joining_date, relieving_date = frappe.db.get_value("Employee", self.employee, 
+				["date_of_joining", "relieving_date"])
 
 		m = get_month_details(self.fiscal_year, self.month)
-		holidays = self.get_holidays_for_employee(m)
+		holidays = self.get_holidays_for_employee(m['month_start_date'], m['month_end_date'])
 
-		if not cint(frappe.db.get_value("HR Settings", "HR Settings",
-			"include_holidays_in_total_working_days")):
-				m["month_days"] -= len(holidays)
-				if m["month_days"] < 0:
-					frappe.throw(_("There are more holidays than working days this month."))
+		working_days = m["month_days"]
+		if not cint(frappe.db.get_value("HR Settings", None, "include_holidays_in_total_working_days")):
+			working_days -= len(holidays)
+			if working_days < 0:
+				frappe.throw(_("There are more holidays than working days this month."))
 
 		if not lwp:
 			lwp = self.calculate_lwp(holidays, m)
-		self.total_days_in_month = m['month_days']
+		self.total_days_in_month = working_days
 		self.leave_without_pay = lwp
-		payment_days = flt(self.get_payment_days(m)) - flt(lwp)
+		payment_days = flt(self.get_payment_days(m, joining_date, relieving_date)) - flt(lwp)
 		self.payment_days = payment_days > 0 and payment_days or 0
+		
+	def get_payment_days(self, month, joining_date, relieving_date):
+		start_date = month['month_start_date']
+		if joining_date:
+			if joining_date > month['month_start_date']:
+				start_date = joining_date
+			elif joining_date > month['month_end_date']:
+				return
+		
+		if relieving_date:
+			if relieving_date > start_date and relieving_date < month['month_end_date']:
+				end_date = relieving_date
+			elif relieving_date < month['month_start_date']:
+				frappe.throw(_("Employee relieved on {0} must be set as 'Left'").format(relieving_date))
+		else:
+			end_date = month['month_end_date']
+			
+		payment_days = date_diff(end_date, start_date) + 1
 
-
-	def get_payment_days(self, m):
-		payment_days = m['month_days']
-		emp = frappe.db.sql("select date_of_joining, relieving_date from `tabEmployee` \
-			where name = %s", self.employee, as_dict=1)[0]
-
-		if emp['relieving_date']:
-			if getdate(emp['relieving_date']) > m['month_start_date'] and \
-				getdate(emp['relieving_date']) < m['month_end_date']:
-					payment_days = getdate(emp['relieving_date']).day
-			elif getdate(emp['relieving_date']) < m['month_start_date']:
-				frappe.throw(_("Employee relieved on {0} must be set as 'Left'").format(emp["relieving_date"]))
-
-		if emp['date_of_joining']:
-			if getdate(emp['date_of_joining']) > m['month_start_date'] and \
-				getdate(emp['date_of_joining']) < m['month_end_date']:
-					payment_days = payment_days - getdate(emp['date_of_joining']).day + 1
-			elif getdate(emp['date_of_joining']) > m['month_end_date']:
-				payment_days = 0
+		if not cint(frappe.db.get_value("HR Settings", None, "include_holidays_in_total_working_days")):
+			holidays = self.get_holidays_for_employee(start_date, end_date)
+			payment_days -= len(holidays)
 
 		return payment_days
 
-	def get_holidays_for_employee(self, m):
+	def get_holidays_for_employee(self, start_date, end_date):
 		holidays = frappe.db.sql("""select t1.holiday_date
 			from `tabHoliday` t1, tabEmployee t2
 			where t1.parent = t2.holiday_list and t2.name = %s
 			and t1.holiday_date between %s and %s""",
-			(self.employee, m['month_start_date'], m['month_end_date']))
+			(self.employee, start_date, end_date))
+			
 		if not holidays:
 			holidays = frappe.db.sql("""select t1.holiday_date
 				from `tabHoliday` t1, `tabHoliday List` t2
 				where t1.parent = t2.name and t2.is_default = 1
 				and t2.fiscal_year = %s
-				and t1.holiday_date between %s and %s""", (self.fiscal_year,
-					m['month_start_date'], m['month_end_date']))
+				and t1.holiday_date between %s and %s""", 
+				(self.fiscal_year, start_date, end_date))
+		
 		holidays = [cstr(i[0]) for i in holidays]
 		return holidays
 
@@ -148,11 +156,10 @@
 		from frappe.utils import money_in_words
 		self.check_existing()
 
-		if not (len(self.get("earnings")) or
-			len(self.get("deductions"))):
-				self.get_emp_and_leave_details()
+		if not (len(self.get("earnings")) or len(self.get("deductions"))):
+			self.get_emp_and_leave_details()
 		else:
-			self.get_leave_details(self.leave_without_pay)
+			self.get_leave_details(lwp = self.leave_without_pay)
 
 		if not self.net_pay:
 			self.calculate_net_pay()
diff --git a/erpnext/hr/doctype/salary_slip/test_salary_slip.py b/erpnext/hr/doctype/salary_slip/test_salary_slip.py
index 9eda231..387c593 100644
--- a/erpnext/hr/doctype/salary_slip/test_salary_slip.py
+++ b/erpnext/hr/doctype/salary_slip/test_salary_slip.py
@@ -25,11 +25,11 @@
 		la.submit()
 
 	def tearDown(self):
-		frappe.db.set_value("HR Settings", "HR Settings", "include_holidays_in_total_working_days", 0)
+		frappe.db.set_value("HR Settings", None, "include_holidays_in_total_working_days", 0)
 		frappe.set_user("Administrator")
 
 	def test_salary_slip_with_holidays_included(self):
-		frappe.db.set_value("HR Settings", "HR Settings", "include_holidays_in_total_working_days", 1)
+		frappe.db.set_value("HR Settings", None, "include_holidays_in_total_working_days", 1)
 		ss = frappe.copy_doc(test_records[0])
 		ss.insert()
 		
@@ -43,18 +43,46 @@
 		self.assertEquals(ss.net_pay, 14867.74)
 
 	def test_salary_slip_with_holidays_excluded(self):
-		frappe.db.set_value("HR Settings", "HR Settings", "include_holidays_in_total_working_days", 0)
+		frappe.db.set_value("HR Settings", None, "include_holidays_in_total_working_days", 0)
 		ss = frappe.copy_doc(test_records[0])
 		ss.insert()
 		
-		self.assertEquals(ss.total_days_in_month, 30)
-		self.assertEquals(ss.payment_days, 29)
-		self.assertEquals(ss.earnings[0].e_modified_amount, 14500)
+		self.assertEquals(ss.total_days_in_month, 29)
+		self.assertEquals(ss.payment_days, 28)
+		self.assertEquals(ss.earnings[0].e_modified_amount, 14482.76)
 		self.assertEquals(ss.earnings[1].e_modified_amount, 500)
 		self.assertEquals(ss.deductions[0].d_modified_amount, 100)
-		self.assertEquals(ss.deductions[1].d_modified_amount, 48.33)
-		self.assertEquals(ss.gross_pay, 15000)
-		self.assertEquals(ss.net_pay, 14851.67)
+		self.assertEquals(ss.deductions[1].d_modified_amount, 48.28)
+		self.assertEquals(ss.gross_pay, 14982.76)
+		self.assertEquals(ss.net_pay, 14834.48)
+		
+	def test_payment_days(self):
+		# Holidays not included in working days
+		frappe.db.set_value("HR Settings", None, "include_holidays_in_total_working_days", 0)
+		
+		# set joinng date in the same month
+		frappe.db.set_value("Employee", "_T-Employee-0001", "date_of_joining", "2013-01-11")
+		
+		ss = frappe.copy_doc(test_records[0])
+		ss.insert()
+		
+		self.assertEquals(ss.total_days_in_month, 29)
+		self.assertEquals(ss.payment_days, 19)
+		
+		# set relieving date in the same month
+		frappe.db.set_value("Employee", "_T-Employee-0001", "relieving_date", "2013-01-28")
+		ss.save()
+		self.assertEquals(ss.total_days_in_month, 29)
+		self.assertEquals(ss.payment_days, 16)
+		
+		# Holidays included in working days
+		frappe.db.set_value("HR Settings", None, "include_holidays_in_total_working_days", 1)
+		ss.save()
+		self.assertEquals(ss.total_days_in_month, 31)
+		self.assertEquals(ss.payment_days, 17)
+		
+		frappe.db.set_value("Employee", "_T-Employee-0001", "date_of_joining", "2001-01-11")
+		frappe.db.set_value("Employee", "_T-Employee-0001", "relieving_date", None)
 
 	def test_employee_salary_slip_read_permission(self):
 		self.make_employee("test_employee@example.com")
diff --git a/erpnext/patches/v4_4/make_email_accounts.py b/erpnext/patches/v4_4/make_email_accounts.py
index 1acd8de..126acfc 100644
--- a/erpnext/patches/v4_4/make_email_accounts.py
+++ b/erpnext/patches/v4_4/make_email_accounts.py
@@ -35,7 +35,7 @@
 			"enable_incoming": "sync_support_mails",
 			"email_id": "mail_login",
 			"password": "mail_password",
-			"pop3_server": "mail_server",
+			"email_server": "mail_server",
 			"use_ssl": "use_ssl",
 			"signature": "support_signature",
 			"enable_auto_reply": "send_autoreply",
@@ -59,7 +59,7 @@
 				"enable_incoming": "extract_emails",
 				"email_id": "username",
 				"password": "password",
-				"pop3_server": "host",
+				"email_server": "host",
 				"use_ssl": "use_ssl",
 			}
 
diff --git a/erpnext/patches/v6_8/move_drop_ship_to_po_items.py b/erpnext/patches/v6_8/move_drop_ship_to_po_items.py
index 1c2a57a..06d158e 100644
--- a/erpnext/patches/v6_8/move_drop_ship_to_po_items.py
+++ b/erpnext/patches/v6_8/move_drop_ship_to_po_items.py
@@ -4,6 +4,9 @@
 	frappe.reload_doctype("Purchase Order")
 	frappe.reload_doctype("Purchase Order Item")
 
+	if not frappe.db.has_column("Purchase Order", "delivered_by_supplier"):
+		return
+
 	for po in frappe.get_all("Purchase Order", filters={"delivered_by_supplier": 1}, fields=["name"]):
 		purchase_order = frappe.get_doc("Purchase Order", po)
 
diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.js b/erpnext/stock/doctype/stock_entry/stock_entry.js
index e9fc134..3965417 100644
--- a/erpnext/stock/doctype/stock_entry/stock_entry.js
+++ b/erpnext/stock/doctype/stock_entry/stock_entry.js
@@ -148,11 +148,11 @@
 					$.each(["from_bom", "bom_no", "fg_completed_qty", "use_multi_level_bom"], function(i, field) {
 						me.frm.set_value(field, r.message[field]);
 					})
-					
+
 					if (me.frm.doc.purpose == "Material Transfer for Manufacture" && !me.frm.doc.to_warehouse)
 						me.frm.set_value("to_warehouse", r.message["wip_warehouse"]);
-					
-					
+
+
 					if (me.frm.doc.purpose == "Manufacture") {
 						if(r.message["additional_costs"].length) {
 							$.each(r.message["additional_costs"], function(i, row) {
@@ -160,7 +160,7 @@
 							})
 							refresh_field("additional_costs");
 						}
-						
+
 						if (!me.frm.doc.from_warehouse) me.frm.set_value("from_warehouse", r.message["wip_warehouse"]);
 						if (!me.frm.doc.to_warehouse) me.frm.set_value("to_warehouse", r.message["fg_warehouse"]);
 					}
@@ -171,7 +171,7 @@
 	},
 
 	toggle_enable_bom: function() {
-		this.frm.toggle_enable("bom_no", !in_list(["Manufacture", "Material Transfer for Manufacture"], this.frm.doc.purpose));
+		this.frm.toggle_enable("bom_no", !!!this.frm.doc.production_order);
 	},
 
 	add_excise_button: function() {
@@ -252,11 +252,11 @@
 	if(doc.purpose == "Material Receipt") {
 		cur_frm.set_value("from_bom", 0);
 	}
-	
+
 	// Addition costs based on purpose
-	cur_frm.toggle_display(["additional_costs", "total_additional_costs", "additional_costs_section"], 
+	cur_frm.toggle_display(["additional_costs", "total_additional_costs", "additional_costs_section"],
 		doc.purpose!='Material Issue');
-	
+
 	cur_frm.fields_dict["items"].grid.set_column_disp("additional_cost", doc.purpose!='Material Issue');
 }
 
@@ -405,4 +405,4 @@
 
 cur_frm.cscript.posting_date = function(doc, cdt, cdn){
 	erpnext.get_fiscal_year(doc.company, doc.posting_date);
-}
\ No newline at end of file
+}
diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.py b/erpnext/stock/doctype/stock_entry/stock_entry.py
index 79cd8de..9702972 100644
--- a/erpnext/stock/doctype/stock_entry/stock_entry.py
+++ b/erpnext/stock/doctype/stock_entry/stock_entry.py
@@ -170,10 +170,8 @@
 	def validate_production_order(self):
 		if self.purpose in ("Manufacture", "Material Transfer for Manufacture"):
 			# check if production order is entered
-			if not self.production_order:
-				frappe.throw(_("Production order number is mandatory for stock entry purpose manufacture"))
-			# check for double entry
-			if self.purpose=="Manufacture":
+
+			if self.purpose=="Manufacture" and self.production_order:
 				if not self.fg_completed_qty:
 					frappe.throw(_("For Quantity (Manufactured Qty) is mandatory"))
 				self.check_if_operations_completed()
diff --git a/erpnext/utilities/doctype/contact/contact.py b/erpnext/utilities/doctype/contact/contact.py
index bfab79f..dff05bc 100644
--- a/erpnext/utilities/doctype/contact/contact.py
+++ b/erpnext/utilities/doctype/contact/contact.py
@@ -4,6 +4,7 @@
 from __future__ import unicode_literals
 import frappe
 from frappe.utils import cstr
+from frappe import _
 
 from erpnext.controllers.status_updater import StatusUpdater
 
@@ -61,6 +62,10 @@
 @frappe.whitelist()
 def invite_user(contact):
 	contact = frappe.get_doc("Contact", contact)
+
+	if not contact.email_id:
+		frappe.throw(_("Please set Email ID"))
+
 	if contact.has_permission("write"):
 		user = frappe.get_doc({
 			"doctype": "User",
diff --git a/setup.py b/setup.py
index ffaee6b..66d4dcc 100644
--- a/setup.py
+++ b/setup.py
@@ -1,6 +1,6 @@
 from setuptools import setup, find_packages
 
-version = "6.12.2"
+version = "6.12.3"
 
 with open("requirements.txt", "r") as f:
 	install_requires = f.readlines()