Merge pull request #2193 from anandpdoshi/anand-september-15

Recurring fix, cherry-picked nabin's address template fix
diff --git a/erpnext/accounts/doctype/account/account.py b/erpnext/accounts/doctype/account/account.py
index e067c70..7195db8 100644
--- a/erpnext/accounts/doctype/account/account.py
+++ b/erpnext/accounts/doctype/account/account.py
@@ -169,15 +169,13 @@
 
 	def validate_due_date(self, posting_date, due_date):
 		credit_days = (self.credit_days or frappe.db.get_value("Company", self.company, "credit_days"))
-		if credit_days is None:
-			return
-
 		posting_date, due_date = getdate(posting_date), getdate(due_date)
 		diff = (due_date - posting_date).days
 
 		if diff < 0:
 			frappe.throw(_("Due Date cannot be before Posting Date"))
-		elif diff > credit_days:
+
+		elif credit_days is not None and diff > credit_days:
 			is_credit_controller = frappe.db.get_value("Accounts Settings", None,
 				"credit_controller") in frappe.user.get_roles()
 
diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
index 4e5ddf0..20d20d7 100644
--- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
+++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
@@ -71,7 +71,9 @@
 			self.is_opening = 'No'
 
 		self.set_aging_date()
+
 		frappe.get_doc("Account", self.debit_to).validate_due_date(self.posting_date, self.due_date)
+
 		self.set_against_income_account()
 		self.validate_c_form()
 		self.validate_time_logs_are_submitted()
@@ -147,6 +149,10 @@
 		validate_recurring_document(self)
 		convert_to_recurring(self, "RECINV.#####", self.posting_date)
 
+	def before_recurring(self):
+		self.aging_date = None
+		self.due_date = None
+
 	def get_portal_page(self):
 		return "invoice" if self.docstatus==1 else None
 
diff --git a/erpnext/controllers/recurring_document.py b/erpnext/controllers/recurring_document.py
index c7163ae..bdf8b29 100644
--- a/erpnext/controllers/recurring_document.py
+++ b/erpnext/controllers/recurring_document.py
@@ -36,6 +36,9 @@
 				% (doctype, date_field, '%s', '%s'), (next_date, recurring_id)):
 			try:
 				ref_wrapper = frappe.get_doc(doctype, ref_document)
+				if hasattr(ref_wrapper, "before_recurring"):
+					ref_wrapper.before_recurring()
+
 				new_document_wrapper = make_new_document(ref_wrapper, date_field, next_date)
 				send_notification(new_document_wrapper)
 				if commit:
diff --git a/erpnext/utilities/doctype/address_template/address_template.py b/erpnext/utilities/doctype/address_template/address_template.py
index 4ac8054..c8d3470 100644
--- a/erpnext/utilities/doctype/address_template/address_template.py
+++ b/erpnext/utilities/doctype/address_template/address_template.py
@@ -8,16 +8,16 @@
 
 class AddressTemplate(Document):
 	def validate(self):
-		defaults = frappe.db.get_values("Address Template",
-			{"is_default":1, "name":("!=", self.name)})
+		self.defaults = frappe.db.get_values("Address Template", {"is_default":1, "name":("!=", self.name)})
 		if not self.is_default:
-			if not defaults:
+			if not self.defaults:
 				self.is_default = 1
 				frappe.msgprint(_("Setting this Address Template as default as there is no other default"))
-		else:
-			if defaults:
-				for d in defaults:
-					frappe.db.set_value("Address Template", d[0], "is_default", 0)
+
+	def on_update(self):
+		if self.is_default and self.defaults:
+			for d in self.defaults:
+				frappe.db.set_value("Address Template", d[0], "is_default", 0)
 
 	def on_trash(self):
 		if self.is_default:
diff --git a/erpnext/utilities/doctype/address_template/test_address_template.py b/erpnext/utilities/doctype/address_template/test_address_template.py
index 953c852..d4e3de0 100644
--- a/erpnext/utilities/doctype/address_template/test_address_template.py
+++ b/erpnext/utilities/doctype/address_template/test_address_template.py
@@ -20,3 +20,8 @@
 		b.save()
 
 		self.assertEqual(frappe.db.get_value("Address Template", "India", "is_default"), 0)
+
+	def tearDown(self):
+		a = frappe.get_doc("Address Template", "India")
+		a.is_default = 1
+		a.save()