[fix] set default depreciation accounts and test fix
diff --git a/erpnext/accounts/doctype/account/account.json b/erpnext/accounts/doctype/account/account.json
index ce03877..8fc7b55 100644
--- a/erpnext/accounts/doctype/account/account.json
+++ b/erpnext/accounts/doctype/account/account.json
@@ -17,6 +17,7 @@
    "fieldtype": "Section Break", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
    "label": "", 
@@ -41,6 +42,7 @@
    "fieldtype": "Column Break", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
    "length": 0, 
@@ -64,6 +66,7 @@
    "fieldtype": "Data", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 1, 
    "in_list_view": 1, 
    "label": "Account Name", 
@@ -90,6 +93,7 @@
    "fieldtype": "Check", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
    "label": "Is Group", 
@@ -114,6 +118,7 @@
    "fieldtype": "Link", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 1, 
    "in_list_view": 0, 
    "label": "Company", 
@@ -140,6 +145,7 @@
    "fieldtype": "Select", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
    "label": "Root Type", 
@@ -164,6 +170,7 @@
    "fieldtype": "Select", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
    "label": "Report Type", 
@@ -189,6 +196,7 @@
    "fieldtype": "Link", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
    "label": "Currency", 
@@ -214,6 +222,7 @@
    "fieldtype": "Column Break", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
    "length": 0, 
@@ -237,6 +246,7 @@
    "fieldtype": "Link", 
    "hidden": 0, 
    "ignore_user_permissions": 1, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
    "label": "Parent Account", 
@@ -264,6 +274,7 @@
    "fieldtype": "Select", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 1, 
    "in_list_view": 0, 
    "label": "Account Type", 
@@ -271,7 +282,7 @@
    "no_copy": 0, 
    "oldfieldname": "account_type", 
    "oldfieldtype": "Select", 
-   "options": "\nBank\nCash\nDepreciation\nTax\nChargeable\nWarehouse\nReceivable\nPayable\nEquity\nFixed Asset\nCost of Goods Sold\nExpense Account\nRound Off\nIncome Account\nStock Received But Not Billed\nExpenses Included In Valuation\nStock Adjustment\nStock\nTemporary", 
+   "options": "\nAccumulated Depreciation\nBank\nCash\nChargeable\nCost of Goods Sold\nDepreciation\nEquity\nExpense Account\nExpenses Included In Valuation\nFixed Asset\nIncome Account\nPayable\nReceivable\nRound Off\nStock\nStock Adjustment\nStock Received But Not Billed\nTax\nTemporary\nWarehouse", 
    "permlevel": 0, 
    "print_hide": 0, 
    "print_hide_if_no_value": 0, 
@@ -291,6 +302,7 @@
    "fieldtype": "Float", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
    "label": "Rate", 
@@ -317,6 +329,7 @@
    "fieldtype": "Select", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
    "label": "Frozen", 
@@ -343,6 +356,7 @@
    "fieldtype": "Link", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
    "label": "Warehouse", 
@@ -367,6 +381,7 @@
    "fieldtype": "Select", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
    "label": "Balance must be", 
@@ -391,6 +406,7 @@
    "fieldtype": "Int", 
    "hidden": 1, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
    "label": "Lft", 
@@ -414,6 +430,7 @@
    "fieldtype": "Int", 
    "hidden": 1, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
    "label": "Rgt", 
@@ -437,6 +454,7 @@
    "fieldtype": "Data", 
    "hidden": 1, 
    "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
    "in_filter": 0, 
    "in_list_view": 0, 
    "label": "Old Parent", 
@@ -463,7 +481,7 @@
  "issingle": 0, 
  "istable": 0, 
  "max_attachments": 0, 
- "modified": "2015-12-12 10:19:54.365839", 
+ "modified": "2016-03-31 05:15:51.062604", 
  "modified_by": "Administrator", 
  "module": "Accounts", 
  "name": "Account", 
@@ -572,5 +590,7 @@
  ], 
  "read_only": 0, 
  "read_only_onload": 0, 
- "search_fields": ""
+ "search_fields": "", 
+ "sort_order": "ASC", 
+ "track_seen": 0
 }
\ No newline at end of file
diff --git a/erpnext/accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts.py b/erpnext/accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts.py
index 532a015..ee1d007 100644
--- a/erpnext/accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts.py
+++ b/erpnext/accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts.py
@@ -53,7 +53,9 @@
 	            _("Plant and Machinery"): {
 	                "account_type": "Fixed Asset"
 	            },
-	            _("Accumulated Depreciations"): {}
+	            _("Accumulated Depreciation"): {
+	            	"account_type": "Accumulated Depreciation"
+	            }
 	        },
 	        _("Investments"): {
 	        	"is_group": 1
@@ -89,7 +91,7 @@
 	                "account_type": "Expense Account"
 	            },
 	            _("Depreciation"): {
-	                "account_type": "Expense Account"
+	                "account_type": "Depreciation"
 	            },
 	            _("Entertainment Expenses"): {
 	                "account_type": "Expense Account"
diff --git a/erpnext/accounts/doctype/asset/asset.json b/erpnext/accounts/doctype/asset/asset.json
index bf46074..b23b472 100644
--- a/erpnext/accounts/doctype/asset/asset.json
+++ b/erpnext/accounts/doctype/asset/asset.json
@@ -108,7 +108,7 @@
    "print_hide_if_no_value": 0, 
    "read_only": 1, 
    "report_hide": 0, 
-   "reqd": 1, 
+   "reqd": 0, 
    "search_index": 0, 
    "set_only_once": 0, 
    "unique": 0
@@ -576,14 +576,14 @@
  ], 
  "hide_heading": 0, 
  "hide_toolbar": 0, 
- "idx": 0, 
+ "idx": 72, 
  "in_create": 0, 
  "in_dialog": 0, 
  "is_submittable": 1, 
  "issingle": 0, 
  "istable": 0, 
  "max_attachments": 0, 
- "modified": "2016-03-30 05:25:56.710106", 
+ "modified": "2016-03-31 05:02:49.890116", 
  "modified_by": "Administrator", 
  "module": "Accounts", 
  "name": "Asset", 
@@ -609,26 +609,6 @@
    "share": 1, 
    "submit": 1, 
    "write": 1
-  }, 
-  {
-   "amend": 1, 
-   "apply_user_permissions": 0, 
-   "cancel": 1, 
-   "create": 1, 
-   "delete": 1, 
-   "email": 1, 
-   "export": 1, 
-   "if_owner": 0, 
-   "import": 1, 
-   "permlevel": 0, 
-   "print": 1, 
-   "read": 1, 
-   "report": 1, 
-   "role": "Accounts Manager", 
-   "set_user_permissions": 0, 
-   "share": 1, 
-   "submit": 1, 
-   "write": 1
   }
  ], 
  "read_only": 0, 
diff --git a/erpnext/accounts/doctype/asset/asset.py b/erpnext/accounts/doctype/asset/asset.py
index d6547a6..3b141f6 100644
--- a/erpnext/accounts/doctype/asset/asset.py
+++ b/erpnext/accounts/doctype/asset/asset.py
@@ -10,60 +10,60 @@
 
 class Asset(Document):
 	def validate(self):
-		self.set_status()
+		self.status = self.get_status()
 		self.validate_fixed_asset_item()
 		self.validate_asset_values()
 		self.set_depreciation_settings()
 		self.make_depreciation_schedule()
 		self.validate_depreciation_settings_in_company()
-		
+
 	def on_submit(self):
 		self.set_status()
-		
+
 	def on_cancel(self):
 		self.validate_cancellation()
 		self.delete_depreciation_entries()
 		self.set_status()
-		
+
 	def validate_fixed_asset_item(self):
 		item = frappe.get_doc("Item", self.item_code)
 		if item.disabled:
 			frappe.throw(_("Item {0} has been disabled").format(self.item_code))
 		if item.is_stock_item:
 			frappe.throw(_("Item {0} must be a non-stock item").format(self.item_code))
-			
+
 	def validate_asset_values(self):
 		if flt(self.expected_value_after_useful_life) >= flt(self.gross_purchase_amount):
 			frappe.throw(_("Expected Value After Useful Life must be less than Gross Purchase Amount"))
-			
+
 		if not flt(self.gross_purchase_amount):
 			frappe.throw(_("Gross Purchase Amount is mandatory"), frappe.MandatoryError)
-			
+
 		if not self.current_value and self.next_depreciation_date:
 			self.current_value = flt(self.gross_purchase_amount)
 		else:
 			if flt(self.current_value) > flt(self.gross_purchase_amount):
 				frappe.throw(_("Current Value After Depreciation must be less than equal to {0}")
 					.format(flt(self.gross_purchase_amount)))
-							
+
 	def set_depreciation_settings(self):
 		asset_category = frappe.get_doc("Asset Category", self.asset_category)
-		
+
 		for field in ("depreciation_method", "number_of_depreciations", "number_of_months_in_a_period"):
 			if not self.get(field):
 				self.set(field, asset_category.get(field))
-				
+
 	def make_depreciation_schedule(self):
 		self.schedules = []
 		if not self.get("schedules") and self.next_depreciation_date:
 			accumulated_depreciation = 0
 			value_after_depreciation = flt(self.current_value)
 			for n in xrange(self.number_of_depreciations):
-				schedule_date = add_months(self.next_depreciation_date, 
+				schedule_date = add_months(self.next_depreciation_date,
 					n * cint(self.number_of_months_in_a_period))
-					
+
 				depreciation_amount = self.get_depreciation_amount(value_after_depreciation)
-				
+
 				self.append("schedules", {
 					"schedule_date": schedule_date,
 					"depreciation_amount": depreciation_amount,
@@ -71,10 +71,10 @@
 				})
 				accumulated_depreciation += flt(depreciation_amount)
 				value_after_depreciation -= flt(depreciation_amount)
-									
+
 	def get_depreciation_amount(self, depreciable_value):
 		if self.depreciation_method == "Straight Line":
-			depreciation_amount = (flt(self.current_value) - 
+			depreciation_amount = (flt(self.current_value) -
 				flt(self.expected_value_after_useful_life)) / cint(self.number_of_depreciations)
 		else:
 			factor = 200.0 /  cint(self.number_of_depreciations)
@@ -85,45 +85,51 @@
 				depreciation_amount = flt(depreciable_value) - flt(self.expected_value_after_useful_life)
 
 		return depreciation_amount
-		
+
 	def validate_cancellation(self):
 		if self.status not in ("Submitted", "Partially Depreciated", "Fully Depreciated"):
 			frappe.throw(_("Asset cannot be cancelled, as it is already {0}").format(self.status))
-				
+
 		if self.purchase_invoice:
 			frappe.throw(_("Please cancel Purchase Invoice {0} first").format(self.purchase_invoice))
-		
+
 	def delete_depreciation_entries(self):
 		total_depreciation_amount = 0
 		for d in self.get("schedules"):
 			if d.journal_entry:
 				frappe.get_doc("Journal Entry", d.journal_entry).cancel()
-			
+
 				d.db_set("journal_entry", None)
 				total_depreciation_amount += flt(d.depreciation_amount)
 		self.db_set("current_value", (self.current_value + total_depreciation_amount))
-		
+
 	def validate_depreciation_settings_in_company(self):
 		company = frappe.get_doc("Company", self.company)
-		for field in ("accumulated_depreciation_account", "depreciation_expense_account", 
+		for field in ("accumulated_depreciation_account", "depreciation_expense_account",
 			"disposal_account", "depreciation_cost_center"):
 				if not company.get(field):
 					frappe.throw(_("Please set {0} in Company {1}")
 						.format(company.meta.get_label(field), self.company))
-	
-	def set_status(self, status=None):
-		if not status:
-			if self.docstatus == 0:
-				status = "Draft"
-			elif self.docstatus == 1:
-				status = "Submitted"
-				if self.journal_entry_for_scrap:
-					status = "Scrapped"
-				elif flt(self.current_value) <= flt(self.expected_value_after_useful_life):
-					status = "Fully Depreciated"
-				elif flt(self.current_value) < flt(self.gross_purchase_amount):
-					status = 'Partially Depreciated'
-			elif self.docstatus == 2:
-				status = "Cancelled"
 
-		self.db_set("status", status)
\ No newline at end of file
+	def set_status(self, status=None):
+		'''Set asset and update status'''
+		if not status:
+			status = self.get_status()
+		self.db_set("status", status)
+
+	def get_status(self):
+		'''Returns status based on whether it is draft, submitted, scrapped or depreciated'''
+		if self.docstatus == 0:
+			status = "Draft"
+		elif self.docstatus == 1:
+			status = "Submitted"
+			if self.journal_entry_for_scrap:
+				status = "Scrapped"
+			elif flt(self.current_value) <= flt(self.expected_value_after_useful_life):
+				status = "Fully Depreciated"
+			elif flt(self.current_value) < flt(self.gross_purchase_amount):
+				status = 'Partially Depreciated'
+		elif self.docstatus == 2:
+			status = "Cancelled"
+
+		return status
diff --git a/erpnext/controllers/recurring_document.py b/erpnext/controllers/recurring_document.py
index 42b847e..a036760 100644
--- a/erpnext/controllers/recurring_document.py
+++ b/erpnext/controllers/recurring_document.py
@@ -1,5 +1,6 @@
 from __future__ import unicode_literals
 import frappe
+import calendar
 import frappe.utils
 import frappe.defaults
 
@@ -166,14 +167,24 @@
 
 		elif not (doc.from_date and doc.to_date):
 			frappe.throw(_("Period From and Period To dates mandatory for recurring {0}").format(doc.doctype))
-			
+
 def validate_recurring_next_date(doc):
 	posting_date = doc.get("posting_date") or doc.get("transaction_date")
 	if getdate(posting_date) > getdate(doc.next_date):
 		frappe.throw(_("Next Date must be greater than Posting Date"))
 
-	if getdate(doc.next_date).day != doc.repeat_on_day_of_month:
-		frappe.throw(_("Next Date's day and Repeat on Day of Month must be equal"))
+	next_date = getdate(doc.next_date)
+	if next_date.day != doc.repeat_on_day_of_month:
+
+		# if the repeat day is the last day of the month (31)
+		# and the current month does not have as many days,
+		# then the last day of the current month is a valid date
+		lastday = calendar.monthrange(next_date.year, next_date.month)[1]
+		if doc.repeat_on_day_of_month < lastday:
+
+			# the specified day of the month is not same as the day specified
+			# or the last day of the month
+			frappe.throw(_("Next Date's day and Repeat on Day of Month must be equal"))
 
 def convert_to_recurring(doc, posting_date):
 	if doc.is_recurring:
@@ -181,13 +192,13 @@
 			doc.db_set("recurring_id", doc.name)
 
 		set_next_date(doc, posting_date)
-		
+
 		if doc.next_date:
 			validate_recurring_next_date(doc)
-		
+
 	elif doc.recurring_id:
 		doc.db_set("recurring_id", None)
-	
+
 def validate_notification_email_id(doc):
 	if doc.notify_by_email:
 		if doc.notification_email_address:
diff --git a/erpnext/setup/doctype/company/company.py b/erpnext/setup/doctype/company/company.py
index 6689d66..97a689a 100644
--- a/erpnext/setup/doctype/company/company.py
+++ b/erpnext/setup/doctype/company/company.py
@@ -30,16 +30,16 @@
 		self.validate_abbr()
 		self.validate_default_accounts()
 		self.validate_currency()
-		
+
 	def validate_abbr(self):
 		self.abbr = self.abbr.strip()
-		
+
 		if self.get('__islocal') and len(self.abbr) > 5:
 			frappe.throw(_("Abbreviation cannot have more than 5 characters"))
 
 		if not self.abbr.strip():
 			frappe.throw(_("Abbreviation is mandatory"))
-			
+
 		if frappe.db.sql("select abbr from tabCompany where name!=%s and abbr=%s", (self.name, self.abbr)):
 			frappe.throw(_("Abbreviation already used for another company"))
 
@@ -111,6 +111,8 @@
 		self._set_default_account("default_cash_account", "Cash")
 		self._set_default_account("default_bank_account", "Bank")
 		self._set_default_account("round_off_account", "Round Off")
+		self._set_default_account("accumulated_depreciation_account", "Accumulated Depreciation")
+		self._set_default_account("depreciation_expense_account", "Depreciation")
 
 		if cint(frappe.db.get_single_value("Accounts Settings", "auto_accounting_for_stock")):
 			self._set_default_account("stock_received_but_not_billed", "Stock Received But Not Billed")
@@ -159,6 +161,7 @@
 
 		frappe.db.set(self, "cost_center", _("Main") + " - " + self.abbr)
 		frappe.db.set(self, "round_off_cost_center", _("Main") + " - " + self.abbr)
+		frappe.db.set(self, "depreciation_cost_center", _("Main") + " - " + self.abbr)
 
 	def before_rename(self, olddn, newdn, merge=False):
 		if merge:
diff --git a/erpnext/shopping_cart/test_shopping_cart.py b/erpnext/shopping_cart/test_shopping_cart.py
index 9b0278d..17fc73e 100644
--- a/erpnext/shopping_cart/test_shopping_cart.py
+++ b/erpnext/shopping_cart/test_shopping_cart.py
@@ -191,7 +191,8 @@
 		frappe.set_user("test_cart_user@example.com")
 
 	def login_as_customer(self):
-		self.create_user_if_not_exists("test_contact_customer@example.com")
+		self.create_user_if_not_exists("test_contact_customer@example.com",
+			"_Test Contact For _Test Customer")
 		frappe.set_user("test_contact_customer@example.com")
 
 	def remove_all_items_from_cart(self):
@@ -199,7 +200,7 @@
 		quotation.set("items", [])
 		quotation.save(ignore_permissions=True)
 
-	def create_user_if_not_exists(self, email):
+	def create_user_if_not_exists(self, email, first_name = None):
 		if frappe.db.exists("User", email):
 			return
 
@@ -208,7 +209,7 @@
 			"user_type": "Website User",
 			"email": email,
 			"send_welcome_email": 0,
-			"first_name": email.split("@")[0]
+			"first_name": first_name or email.split("@")[0]
 		}).insert(ignore_permissions=True)
 
 test_dependencies = ["Sales Taxes and Charges Template", "Price List", "Item Price", "Shipping Rule", "Currency Exchange",