Merge branch 'develop' of https://github.com/frappe/erpnext into dimensions
diff --git a/erpnext/accounts/doctype/dimension/__init__.py b/erpnext/accounts/doctype/dimension/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/erpnext/accounts/doctype/dimension/__init__.py
diff --git a/erpnext/accounts/doctype/dimension/dimension.js b/erpnext/accounts/doctype/dimension/dimension.js
new file mode 100644
index 0000000..4926fff
--- /dev/null
+++ b/erpnext/accounts/doctype/dimension/dimension.js
@@ -0,0 +1,8 @@
+// Copyright (c) 2019, Frappe Technologies Pvt. Ltd. and contributors
+// For license information, please see license.txt
+
+frappe.ui.form.on('Dimension', {
+	// refresh: function(frm) {
+
+	// }
+});
diff --git a/erpnext/accounts/doctype/dimension/dimension.json b/erpnext/accounts/doctype/dimension/dimension.json
new file mode 100644
index 0000000..4937e4d
--- /dev/null
+++ b/erpnext/accounts/doctype/dimension/dimension.json
@@ -0,0 +1,48 @@
+{
+ "autoname": "field:label",
+ "creation": "2019-05-04 18:13:37.002352",
+ "doctype": "DocType",
+ "engine": "InnoDB",
+ "field_order": [
+  "label",
+  "fieldname"
+ ],
+ "fields": [
+  {
+   "fieldname": "label",
+   "fieldtype": "Data",
+   "in_list_view": 1,
+   "label": "Label",
+   "reqd": 1,
+   "unique": 1
+  },
+  {
+   "fieldname": "fieldname",
+   "fieldtype": "Data",
+   "label": "Fieldname"
+  }
+ ],
+ "modified": "2019-05-04 18:59:14.969008",
+ "modified_by": "Administrator",
+ "module": "Accounts",
+ "name": "Dimension",
+ "owner": "Administrator",
+ "permissions": [
+  {
+   "create": 1,
+   "delete": 1,
+   "email": 1,
+   "export": 1,
+   "print": 1,
+   "read": 1,
+   "report": 1,
+   "role": "System Manager",
+   "share": 1,
+   "write": 1
+  }
+ ],
+ "quick_entry": 1,
+ "sort_field": "modified",
+ "sort_order": "ASC",
+ "track_changes": 1
+}
\ No newline at end of file
diff --git a/erpnext/accounts/doctype/dimension/dimension.py b/erpnext/accounts/doctype/dimension/dimension.py
new file mode 100644
index 0000000..524b6ac
--- /dev/null
+++ b/erpnext/accounts/doctype/dimension/dimension.py
@@ -0,0 +1,65 @@
+# -*- coding: utf-8 -*-
+# Copyright (c) 2019, Frappe Technologies Pvt. Ltd. and contributors
+# For license information, please see license.txt
+
+from __future__ import unicode_literals
+import frappe
+from frappe.model.document import Document
+from frappe.custom.doctype.custom_field.custom_field import create_custom_fields
+from frappe.custom.doctype.custom_field.custom_field import create_custom_field
+from frappe import scrub
+
+class Dimension(Document):
+
+	def before_insert(self):
+		self.set_fieldname()
+		self.make_dimension_in_accounting_doctypes()
+
+	def on_trash(self):
+		self.delete_dimension()
+
+	def set_fieldname(self):
+		if not self.fieldname:
+			self.fieldname = scrub(self.label)
+
+	def make_dimension_in_accounting_doctypes(self):
+		last_created_dimension = get_last_created_dimension()
+
+		doclist = ["GL Entry", "Sales Invoice", "Purchase Invoice", "Payment Entry", "BOM", "Sales Order", "Purchase Order",
+			"Stock Entry", "Budget", "Payroll Entry", "Delivery Note"]
+
+		df = {
+			"fieldname": self.fieldname,
+			"label": self.label,
+			"fieldtype": "Data",
+			"insert_after": last_created_dimension if last_created_dimension else "project"
+		}
+
+		for doctype in doclist:
+			create_custom_field(doctype, df)
+
+	def delete_dimension(self):
+		doclist = ["GL Entry", "Sales Invoice", "Purchase Invoice", "Payment Entry", "BOM", "Sales Order", "Purchase Order",
+			"Stock Entry", "Budget", "Payroll Entry", "Delivery Note"]
+
+		frappe.db.sql("""
+			DELETE FROM `tabCustom Field`
+			WHERE  fieldname = %s
+			AND dt IN (%s)""" %
+			('%s', ', '.join(['%s']* len(doclist))), tuple([self.fieldname] + doclist))
+
+		frappe.db.sql("""
+			DELETE FROM `tabProperty Setter`
+			WHERE  field_name = %s
+			AND doc_type IN (%s)""" %
+			('%s', ', '.join(['%s']* len(doclist))), tuple([self.fieldname] + doclist))
+
+		for doc in doclist:
+			frappe.clear_cache(doctype=doc)
+
+
+def get_last_created_dimension():
+	last_created_dimension = frappe.db.sql("select fieldname, max(creation) from `tabDimension`", as_dict=1)
+
+	if last_created_dimension[0]:
+		return last_created_dimension[0].fieldname
diff --git a/erpnext/accounts/doctype/dimension/test_dimension.py b/erpnext/accounts/doctype/dimension/test_dimension.py
new file mode 100644
index 0000000..f726e9d
--- /dev/null
+++ b/erpnext/accounts/doctype/dimension/test_dimension.py
@@ -0,0 +1,10 @@
+# -*- coding: utf-8 -*-
+# Copyright (c) 2019, Frappe Technologies Pvt. Ltd. and Contributors
+# See license.txt
+from __future__ import unicode_literals
+
+# import frappe
+import unittest
+
+class TestDimension(unittest.TestCase):
+	pass