fix: Added dimensions in financial reports and general ledger
This commit is contained in:
parent
9a05ce10d9
commit
d83cf65be1
@ -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) {
|
||||
|
||||
// }
|
@ -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": [
|
||||
{
|
@ -8,22 +8,26 @@ 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 Dimension(Document):
|
||||
class AccountingDimension(Document):
|
||||
|
||||
def before_insert(self):
|
||||
self.set_fieldname()
|
||||
self.make_dimension_in_accounting_doctypes()
|
||||
self.set_fieldname_and_label()
|
||||
self.make_accounting_dimension_in_accounting_doctypes()
|
||||
|
||||
def on_trash(self):
|
||||
self.delete_dimension()
|
||||
self.delete_accounting_dimension()
|
||||
|
||||
def set_fieldname_and_label(self):
|
||||
if not self.label:
|
||||
self.label = cstr(self.document_type)
|
||||
|
||||
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()
|
||||
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"]
|
||||
@ -31,14 +35,15 @@ class Dimension(Document):
|
||||
df = {
|
||||
"fieldname": self.fieldname,
|
||||
"label": self.label,
|
||||
"fieldtype": "Data",
|
||||
"insert_after": last_created_dimension if last_created_dimension else "project"
|
||||
"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_dimension(self):
|
||||
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"]
|
||||
|
||||
@ -58,8 +63,13 @@ class Dimension(Document):
|
||||
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)
|
||||
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_dimension[0]:
|
||||
return last_created_dimension[0].fieldname
|
||||
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]
|
@ -6,5 +6,5 @@ from __future__ import unicode_literals
|
||||
# import frappe
|
||||
import unittest
|
||||
|
||||
class TestDimension(unittest.TestCase):
|
||||
class TestAccountingDimension(unittest.TestCase):
|
||||
pass
|
@ -16,6 +16,7 @@ from frappe import _
|
||||
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 @@ def set_gl_entries_by_account(
|
||||
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 set_gl_entries_by_account(
|
||||
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 @@ def get_additional_conditions(from_date, ignore_closing_entries, filters):
|
||||
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):
|
||||
|
@ -214,3 +214,24 @@ frappe.query_reports["General Ledger"] = {
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
@ -10,6 +10,7 @@ from frappe import _, _dict
|
||||
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 @@ def get_conditions(filters):
|
||||
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 ""
|
||||
|
||||
|
||||
|
@ -16,6 +16,7 @@ from erpnext.accounts.party import get_party_account_currency, validate_party_fr
|
||||
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 @@ class AccountsController(TransactionBase):
|
||||
'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:
|
||||
|
@ -63,7 +63,7 @@ erpnext.financial_statements = {
|
||||
};
|
||||
|
||||
function get_filters(){
|
||||
return [
|
||||
let filters = [
|
||||
{
|
||||
"fieldname":"company",
|
||||
"label": __("Company"),
|
||||
@ -149,4 +149,27 @@ function get_filters(){
|
||||
"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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user