fix: Added dimensions in financial reports and general ledger
diff --git a/erpnext/accounts/doctype/dimension/__init__.py b/erpnext/accounts/doctype/accounting_dimension/__init__.py
similarity index 100%
rename from erpnext/accounts/doctype/dimension/__init__.py
rename to erpnext/accounts/doctype/accounting_dimension/__init__.py
diff --git a/erpnext/accounts/doctype/dimension/dimension.js b/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.js
similarity index 78%
rename from erpnext/accounts/doctype/dimension/dimension.js
rename to erpnext/accounts/doctype/accounting_dimension/accounting_dimension.js
index 4926fff..0676731 100644
--- a/erpnext/accounts/doctype/dimension/dimension.js
+++ b/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.js
@@ -1,7 +1,7 @@
// Copyright (c) 2019, Frappe Technologies Pvt. Ltd. and contributors
// For license information, please see license.txt
-frappe.ui.form.on('Dimension', {
+frappe.ui.form.on('Accounting Dimension', {
// refresh: function(frm) {
// }
diff --git a/erpnext/accounts/doctype/dimension/dimension.json b/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.json
similarity index 76%
rename from erpnext/accounts/doctype/dimension/dimension.json
rename to erpnext/accounts/doctype/accounting_dimension/accounting_dimension.json
index 4937e4d..13902d6 100644
--- a/erpnext/accounts/doctype/dimension/dimension.json
+++ b/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.json
@@ -4,6 +4,7 @@
"doctype": "DocType",
"engine": "InnoDB",
"field_order": [
+ "document_type",
"label",
"fieldname"
],
@@ -13,19 +14,25 @@
"fieldtype": "Data",
"in_list_view": 1,
"label": "Label",
- "reqd": 1,
"unique": 1
},
{
"fieldname": "fieldname",
"fieldtype": "Data",
"label": "Fieldname"
+ },
+ {
+ "fieldname": "document_type",
+ "fieldtype": "Link",
+ "label": "Document Type",
+ "options": "DocType",
+ "reqd": 1
}
],
- "modified": "2019-05-04 18:59:14.969008",
+ "modified": "2019-05-09 15:30:55.339917",
"modified_by": "Administrator",
"module": "Accounts",
- "name": "Dimension",
+ "name": "Accounting Dimension",
"owner": "Administrator",
"permissions": [
{
diff --git a/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.py b/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.py
new file mode 100644
index 0000000..93a25e7
--- /dev/null
+++ b/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.py
@@ -0,0 +1,75 @@
+# -*- 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
+from frappe.utils import cstr
+
+class AccountingDimension(Document):
+
+ def before_insert(self):
+ self.set_fieldname_and_label()
+ self.make_accounting_dimension_in_accounting_doctypes()
+
+ def on_trash(self):
+ self.delete_accounting_dimension()
+
+ def set_fieldname_and_label(self):
+ if not self.label:
+ self.label = cstr(self.document_type)
+
+ if not self.fieldname:
+ self.fieldname = scrub(self.label)
+
+ def make_accounting_dimension_in_accounting_doctypes(self):
+ last_created_accounting_dimension = get_last_created_accounting_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": "Link",
+ "options": self.document_type,
+ "insert_after": last_created_accounting_dimension if last_created_accounting_dimension else "project"
+ }
+
+ for doctype in doclist:
+ create_custom_field(doctype, df)
+
+ def delete_accounting_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_accounting_dimension():
+ last_created_accounting_dimension = frappe.db.sql("select fieldname, max(creation) from `tabAccounting Dimension`", as_dict=1)
+
+ if last_created_accounting_dimension[0]:
+ return last_created_accounting_dimension[0].fieldname
+
+def get_accounting_dimensions():
+ accounting_dimensions = frappe.get_all("Accounting Dimension", fields=["fieldname"])
+
+ return [d.fieldname for d in accounting_dimensions]
diff --git a/erpnext/accounts/doctype/dimension/test_dimension.py b/erpnext/accounts/doctype/accounting_dimension/test_accounting_dimension.py
similarity index 78%
rename from erpnext/accounts/doctype/dimension/test_dimension.py
rename to erpnext/accounts/doctype/accounting_dimension/test_accounting_dimension.py
index f726e9d..b4368c4 100644
--- a/erpnext/accounts/doctype/dimension/test_dimension.py
+++ b/erpnext/accounts/doctype/accounting_dimension/test_accounting_dimension.py
@@ -6,5 +6,5 @@
# import frappe
import unittest
-class TestDimension(unittest.TestCase):
+class TestAccountingDimension(unittest.TestCase):
pass
diff --git a/erpnext/accounts/doctype/dimension/dimension.py b/erpnext/accounts/doctype/dimension/dimension.py
deleted file mode 100644
index 524b6ac..0000000
--- a/erpnext/accounts/doctype/dimension/dimension.py
+++ /dev/null
@@ -1,65 +0,0 @@
-# -*- 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/report/financial_statements.py b/erpnext/accounts/report/financial_statements.py
index 2140315..7f0cbaa 100644
--- a/erpnext/accounts/report/financial_statements.py
+++ b/erpnext/accounts/report/financial_statements.py
@@ -16,6 +16,7 @@
from frappe.utils import (flt, getdate, get_first_day, add_months, add_days, formatdate)
from six import itervalues
+from erpnext.accounts.doctype.accounting_dimension.accounting_dimension import get_accounting_dimensions
def get_period_list(from_fiscal_year, to_fiscal_year, periodicity, accumulated_values=False,
company=None, reset_period_on_fy_change=True):
@@ -348,20 +349,23 @@
additional_conditions += " and account in ({})"\
.format(", ".join([frappe.db.escape(d) for d in accounts]))
+ gl_filters = {
+ "company": company,
+ "from_date": from_date,
+ "to_date": to_date,
+ }
+
+ for key, value in filters.items():
+ if value:
+ gl_filters.update({
+ key: value
+ })
+
gl_entries = frappe.db.sql("""select posting_date, account, debit, credit, is_opening, fiscal_year, debit_in_account_currency, credit_in_account_currency, account_currency from `tabGL Entry`
where company=%(company)s
{additional_conditions}
and posting_date <= %(to_date)s
- order by account, posting_date""".format(additional_conditions=additional_conditions),
- {
- "company": company,
- "from_date": from_date,
- "to_date": to_date,
- "cost_center": filters.cost_center,
- "project": filters.project,
- "finance_book": filters.get("finance_book")
- },
- as_dict=True)
+ order by account, posting_date""".format(additional_conditions=additional_conditions), gl_filters, as_dict=True)
if filters and filters.get('presentation_currency'):
convert_to_presentation_currency(gl_entries, get_currency(filters))
@@ -375,6 +379,8 @@
def get_additional_conditions(from_date, ignore_closing_entries, filters):
additional_conditions = []
+ accounting_dimensions = get_accounting_dimensions()
+
if ignore_closing_entries:
additional_conditions.append("ifnull(voucher_type, '')!='Period Closing Voucher'")
@@ -395,6 +401,11 @@
if filters.get("finance_book"):
additional_conditions.append("ifnull(finance_book, '') in (%(finance_book)s, '')")
+ if accounting_dimensions:
+ for dimension in accounting_dimensions:
+ if filters.get(dimension):
+ additional_conditions.append("{0} in (%({0})s)".format(dimension))
+
return " and {}".format(" and ".join(additional_conditions)) if additional_conditions else ""
def get_cost_centers_with_children(cost_centers):
diff --git a/erpnext/accounts/report/general_ledger/general_ledger.js b/erpnext/accounts/report/general_ledger/general_ledger.js
index 2826760..7db8786 100644
--- a/erpnext/accounts/report/general_ledger/general_ledger.js
+++ b/erpnext/accounts/report/general_ledger/general_ledger.js
@@ -214,3 +214,24 @@
}
]
}
+
+let dimension_filters = get_dimension_filters();
+
+dimension_filters.then((dimensions) => {
+ dimensions.forEach((dimension) => {
+ frappe.query_reports["General Ledger"].filters.push({
+ "fieldname": dimension["fieldname"],
+ "label": __(dimension["label"]),
+ "fieldtype": "Link",
+ "options": dimension["document_type"]
+ });
+ });
+});
+
+async function get_dimension_filters() {
+ let dimensions = await frappe.db.get_list('Accounting Dimension', {
+ fields: ['label', 'fieldname', 'document_type'],
+ });
+
+ return dimensions;
+}
diff --git a/erpnext/accounts/report/general_ledger/general_ledger.py b/erpnext/accounts/report/general_ledger/general_ledger.py
index 44ca8d3..033b9ba 100644
--- a/erpnext/accounts/report/general_ledger/general_ledger.py
+++ b/erpnext/accounts/report/general_ledger/general_ledger.py
@@ -10,6 +10,7 @@
from erpnext.accounts.utils import get_account_currency
from erpnext.accounts.report.financial_statements import get_cost_centers_with_children
from six import iteritems
+from erpnext.accounts.doctype.accounting_dimension.accounting_dimension import get_accounting_dimensions
def execute(filters=None):
if not filters:
@@ -195,6 +196,13 @@
if match_conditions:
conditions.append(match_conditions)
+ accounting_dimensions = get_accounting_dimensions()
+
+ if accounting_dimensions:
+ for dimension in accounting_dimensions:
+ if filters.get(dimension):
+ conditions.append("{0} in (%({0})s)".format(dimension))
+
return "and {}".format(" and ".join(conditions)) if conditions else ""
diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py
index 155a996..4f4084a 100644
--- a/erpnext/controllers/accounts_controller.py
+++ b/erpnext/controllers/accounts_controller.py
@@ -16,6 +16,7 @@
from erpnext.accounts.doctype.pricing_rule.utils import validate_pricing_rules
from erpnext.exceptions import InvalidCurrency
from six import text_type
+from erpnext.accounts.doctype.accounting_dimension.accounting_dimension import get_accounting_dimensions
force_item_fields = ("item_group", "brand", "stock_uom", "is_fixed_asset", "item_tax_rate", "pricing_rules")
@@ -365,6 +366,14 @@
'party': None,
'project': self.get("project")
})
+
+ accounting_dimensions = get_accounting_dimensions()
+ dimension_dict = frappe._dict()
+
+ for dimension in accounting_dimensions:
+ dimension_dict[dimension] = self.get(dimension)
+
+ gl_dict.update(dimension_dict)
gl_dict.update(args)
if not account_currency:
diff --git a/erpnext/public/js/financial_statements.js b/erpnext/public/js/financial_statements.js
index 36746cd..77e67c4 100644
--- a/erpnext/public/js/financial_statements.js
+++ b/erpnext/public/js/financial_statements.js
@@ -63,7 +63,7 @@
};
function get_filters(){
- return [
+ let filters = [
{
"fieldname":"company",
"label": __("Company"),
@@ -149,4 +149,27 @@
"options": erpnext.get_presentation_currency_list()
}
]
+
+ let dimension_filters = get_dimension_filters()
+
+ dimension_filters.then((dimensions) => {
+ dimensions.forEach((dimension) => {
+ filters.push({
+ "fieldname": dimension["fieldname"],
+ "label": __(dimension["label"]),
+ "fieldtype": "Link",
+ "options": dimension["document_type"]
+ });
+ });
+ });
+
+ return filters;
+}
+
+async function get_dimension_filters() {
+ let dimensions = await frappe.db.get_list('Accounting Dimension', {
+ fields: ['label', 'fieldname', 'document_type'],
+ });
+
+ return dimensions;
}