fix: Ability to disable dimensions
diff --git a/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.js b/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.js
index 9a6ea73..f928b0a 100644
--- a/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.js
+++ b/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.js
@@ -6,5 +6,11 @@
document_type: function(frm){
frm.set_value('label', frm.doc.document_type);
frm.set_value('fieldname', frappe.scrub(frm.doc.document_type))
- }
+
+ frappe.db.get_value('Accounting Dimension', {'document_type': frm.doc.document_type}, 'document_type', (r) => {
+ if (r.document_type) {
+ frm.set_df_property('document_type', 'description', "Document type is already set as dimension");
+ }
+ });
+ },
});
diff --git a/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.json b/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.json
index 0e9ab9e..daa1004 100644
--- a/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.json
+++ b/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.json
@@ -7,7 +7,8 @@
"document_type",
"label",
"fieldname",
- "is_mandatory"
+ "is_mandatory",
+ "disable"
],
"fields": [
{
@@ -30,12 +31,19 @@
"reqd": 1
},
{
+ "default": "0",
"fieldname": "is_mandatory",
"fieldtype": "Check",
"label": "Is Mandatory"
+ },
+ {
+ "default": "0",
+ "fieldname": "disable",
+ "fieldtype": "Check",
+ "label": "Disable"
}
],
- "modified": "2019-05-16 13:37:04.240148",
+ "modified": "2019-05-17 20:35:31.014495",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Accounting Dimension",
diff --git a/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.py b/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.py
index 147b808..51388ec 100644
--- a/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.py
+++ b/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.py
@@ -4,19 +4,23 @@
from __future__ import unicode_literals
import frappe
+import json
from frappe.model.document import Document
from frappe.custom.doctype.custom_field.custom_field import create_custom_field
from frappe import scrub
from frappe.utils import cstr
+from frappe.utils.background_jobs import enqueue
class AccountingDimension(Document):
+ def on_update(self):
+ frappe.enqueue(disable_dimension, doc=self)
def before_insert(self):
self.set_fieldname_and_label()
- self.make_accounting_dimension_in_accounting_doctypes()
+ frappe.enqueue(make_accounting_dimension_in_accounting_doctypes, doc=self)
def on_trash(self):
- self.delete_accounting_dimension()
+ frappe.enqueue(delete_accounting_dimension, doc=self)
def set_fieldname_and_label(self):
if not self.label:
@@ -25,90 +29,109 @@
if not self.fieldname:
self.fieldname = scrub(self.label)
- def make_accounting_dimension_in_accounting_doctypes(self):
+def make_accounting_dimension_in_accounting_doctypes(doc):
+ doclist = get_doclist()
- doclist = ["GL Entry", "Sales Invoice", "Purchase Invoice", "Payment Entry", "BOM", "Sales Order", "Purchase Order", "Asset",
- "Stock Entry", "Budget", "Payroll Entry", "Delivery Note", "Sales Invoice Item", "Purchase Invoice Item", "Sales Order Item",
- "Purchase Order Item", "Journal Entry Account", "Material Request Item", "Delivery Note Item", "Purchase Receipt Item",
- "Purchase Order Item"]
+ if doc.is_mandatory:
+ df.update({
+ "reqd": 1
+ })
- if self.is_mandatory:
+ for doctype in doclist:
+
+ df = {
+ "fieldname": doc.fieldname,
+ "label": doc.label,
+ "fieldtype": "Link",
+ "options": doc.document_type,
+ "insert_after": "cost_center"
+ }
+
+ if doctype == "Budget":
df.update({
- "reqd": 1
+ "depends_on": "eval:doc.budget_against == '{0}'".format(doc.document_type)
})
- for doctype in doclist:
+ create_custom_field(doctype, df)
- df = {
- "fieldname": self.fieldname,
- "label": self.label,
- "fieldtype": "Link",
- "options": self.document_type,
- "insert_after": "cost_center"
- }
+ property_setter = frappe.db.exists("Property Setter", "Budget-budget_against-options")
- if doctype == "Budget":
- df.update({
- "depends_on": "eval:doc.budget_against == '{0}'".format(self.document_type)
- })
+ if property_setter:
+ property_setter_doc = frappe.get_doc("Property Setter", "Budget-budget_against-options")
+ property_setter_doc.doc_type = 'Budget'
+ property_setter_doc.doctype_or_field = "DocField"
+ property_setter_doc.fiel_dname = "budget_against"
+ property_setter_doc.property = "options"
+ property_setter_doc.property_type = "Text"
+ property_setter_doc.value = property_setter_doc.value + "\n" + doc.document_type
+ property_setter_doc.save()
- create_custom_field(doctype, df)
-
- property_setter = frappe.db.exists("Property Setter", "Budget-budget_against-options")
-
- if property_setter:
- property_setter_doc = frappe.get_doc("Property Setter", "Budget-budget_against-options")
- property_setter_doc.doc_type = 'Budget'
- property_setter_doc.doctype_or_field = "DocField"
- property_setter_doc.fiel_dname = "budget_against"
- property_setter_doc.property = "options"
- property_setter_doc.property_type = "Text"
- property_setter_doc.value = property_setter_doc.value + "\n" + self.document_type
- property_setter_doc.save()
-
- frappe.clear_cache(doctype='Budget')
- else:
- frappe.get_doc({
- "doctype": "Property Setter",
- "doctype_or_field": "DocField",
- "doc_type": "Budget",
- "field_name": "budget_against",
- "property": "options",
- "property_type": "Text",
- "value": "\nCost Center\nProject\n" + self.document_type
- }).insert(ignore_permissions=True)
- frappe.clear_cache(doctype=doctype)
+ frappe.clear_cache(doctype='Budget')
else:
- create_custom_field(doctype, df)
- frappe.clear_cache(doctype=doctype)
+ frappe.get_doc({
+ "doctype": "Property Setter",
+ "doctype_or_field": "DocField",
+ "doc_type": "Budget",
+ "field_name": "budget_against",
+ "property": "options",
+ "property_type": "Text",
+ "value": "\nCost Center\nProject\n" + doc.document_type
+ }).insert(ignore_permissions=True)
+ frappe.clear_cache(doctype=doctype)
+ else:
+ create_custom_field(doctype, df)
+ frappe.clear_cache(doctype=doctype)
- def delete_accounting_dimension(self):
- doclist = ["GL Entry", "Sales Invoice", "Purchase Invoice", "Payment Entry", "BOM", "Sales Order", "Purchase Order", "Asset",
- "Stock Entry", "Budget", "Payroll Entry", "Delivery Note", "Sales Invoice Item", "Purchase Invoice Item", "Sales Order Item",
- "Purchase Order Item", "Journal Entry Account", "Material Request Item", "Delivery Note Item", "Purchase Receipt Item",
- "Purchase Order Item"]
+def delete_accounting_dimension(doc):
+ doclist = get_doclist()
- 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 `tabCustom Field`
+ WHERE fieldname = %s
+ AND dt IN (%s)""" %
+ ('%s', ', '.join(['%s']* len(doclist))), tuple([doc.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))
+ frappe.db.sql("""
+ DELETE FROM `tabProperty Setter`
+ WHERE field_name = %s
+ AND doc_type IN (%s)""" %
+ ('%s', ', '.join(['%s']* len(doclist))), tuple([doc.fieldname] + doclist))
- budget_against_property = frappe.get_doc("Property Setter", "Budget-budget_against-options")
- value_list = budget_against_property.value.split('\n')[3:]
- value_list.remove(self.document_type)
+ budget_against_property = frappe.get_doc("Property Setter", "Budget-budget_against-options")
+ value_list = budget_against_property.value.split('\n')[3:]
+ value_list.remove(doc.document_type)
- budget_against_property.value = "\nCost Center\nProject\n" + "\n".join(value_list)
- budget_against_property.save()
+ budget_against_property.value = "\nCost Center\nProject\n" + "\n".join(value_list)
+ budget_against_property.save()
- for doc in doclist:
- frappe.clear_cache(doctype=doc)
+ for doctype in doclist:
+ frappe.clear_cache(doctype=doctype)
+
+def disable_dimension(doc):
+ if doc.disable:
+ df = {"read_only": 1}
+ else:
+ df = {"read_only": 0}
+
+ doclist = get_doclist()
+
+ for doctype in doclist:
+ field = frappe.db.get_value("Custom Field", {"dt": doctype, "fieldname": doc.fieldname})
+ if field:
+ custom_field = frappe.get_doc("Custom Field", field)
+ custom_field.update(df)
+ custom_field.save()
+
+ frappe.clear_cache(doctype=doctype)
+
+def get_doclist():
+ doclist = ["GL Entry", "Sales Invoice", "Purchase Invoice", "Payment Entry", "Asset",
+ "Expense Claim", "Stock Entry", "Budget", "Payroll Entry", "Delivery Note", "Sales Invoice Item", "Purchase Invoice Item",
+ "Purchase Order Item", "Journal Entry Account", "Material Request Item", "Delivery Note Item", "Purchase Receipt Item",
+ "Stock Entry Detail", "Payment Entry Deduction"]
+
+ return doclist
+
def get_accounting_dimensions():
accounting_dimensions = frappe.get_all("Accounting Dimension", fields=["fieldname"])
diff --git a/erpnext/accounts/doctype/accounting_dimension/accounting_dimension_dashboard.py b/erpnext/accounts/doctype/accounting_dimension/accounting_dimension_dashboard.py
deleted file mode 100644
index 62a1291..0000000
--- a/erpnext/accounts/doctype/accounting_dimension/accounting_dimension_dashboard.py
+++ /dev/null
@@ -1,12 +0,0 @@
-from __future__ import unicode_literals
-
-from frappe import _
-
-def get_data():
- return {
- 'transactions': [
- {
- 'label': _('Accounting Doctypes')
- }
- ]
- }
\ No newline at end of file