From 05425d414cb20a9b6b52bb4d0708edd81fa5eb14 Mon Sep 17 00:00:00 2001 From: Himanshu Warekar Date: Tue, 23 Jul 2019 16:58:13 +0530 Subject: [PATCH 01/17] fix: change agreement fulfilled to ongoing --- erpnext/support/doctype/issue/issue.py | 1 + 1 file changed, 1 insertion(+) diff --git a/erpnext/support/doctype/issue/issue.py b/erpnext/support/doctype/issue/issue.py index 98d8c99809..58e2076858 100644 --- a/erpnext/support/doctype/issue/issue.py +++ b/erpnext/support/doctype/issue/issue.py @@ -210,6 +210,7 @@ class Issue(Document): self.service_level_agreement_creation = now_datetime() self.set_response_and_resolution_time(priority=self.priority, service_level_agreement=self.service_level_agreement) + self.agreement_fulfilled = "Ongoing" self.save() def get_expected_time_for(parameter, service_level, start_date_time): From 6d0c6a17d971c944b50b7c928f53f08d0eef05ed Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Tue, 23 Jul 2019 23:13:33 +0530 Subject: [PATCH 02/17] fix: multi currency bank reco issue --- .../doctype/bank_transaction/bank_transaction.py | 14 +++++++++++--- .../bank_reconciliation/bank_reconciliation.py | 2 -- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/erpnext/accounts/doctype/bank_transaction/bank_transaction.py b/erpnext/accounts/doctype/bank_transaction/bank_transaction.py index f943b34581..4e5057048f 100644 --- a/erpnext/accounts/doctype/bank_transaction/bank_transaction.py +++ b/erpnext/accounts/doctype/bank_transaction/bank_transaction.py @@ -45,7 +45,7 @@ class BankTransaction(StatusUpdater): def clear_linked_payment_entries(self): for payment_entry in self.payment_entries: allocated_amount = get_total_allocated_amount(payment_entry) - paid_amount = get_paid_amount(payment_entry) + paid_amount = get_paid_amount(payment_entry, self.currency) if paid_amount and allocated_amount: if flt(allocated_amount[0]["allocated_amount"]) > flt(paid_amount): @@ -80,9 +80,17 @@ def get_total_allocated_amount(payment_entry): AND bt.docstatus = 1""", (payment_entry.payment_document, payment_entry.payment_entry), as_dict=True) -def get_paid_amount(payment_entry): +def get_paid_amount(payment_entry, currency): if payment_entry.payment_document in ["Payment Entry", "Sales Invoice", "Purchase Invoice"]: - return frappe.db.get_value(payment_entry.payment_document, payment_entry.payment_entry, "paid_amount") + + paid_amount_field = "paid_amount" + if payment_entry.payment_document == 'Payment Entry': + doc = frappe.get_doc("Payment Entry", payment_entry.payment_entry) + paid_amount_field = ("base_paid_amount" + if doc.paid_to_account_currency == currency else "paid_amount") + + return frappe.db.get_value(payment_entry.payment_document, + payment_entry.payment_entry, paid_amount_field) elif payment_entry.payment_document == "Journal Entry": return frappe.db.get_value(payment_entry.payment_document, payment_entry.payment_entry, "total_credit") diff --git a/erpnext/accounts/page/bank_reconciliation/bank_reconciliation.py b/erpnext/accounts/page/bank_reconciliation/bank_reconciliation.py index 36c939996f..bd4b4d7e0b 100644 --- a/erpnext/accounts/page/bank_reconciliation/bank_reconciliation.py +++ b/erpnext/accounts/page/bank_reconciliation/bank_reconciliation.py @@ -124,8 +124,6 @@ def check_matching_amount(bank_account, company, transaction): 'txt': '%%%s%%' % amount }, as_dict=True) - frappe.errprint(journal_entries) - if transaction.credit > 0: sales_invoices = frappe.db.sql(""" SELECT From b590f8931093de81a805bef429292afd90758b44 Mon Sep 17 00:00:00 2001 From: deepeshgarg007 Date: Sun, 14 Jul 2019 19:28:56 +0530 Subject: [PATCH 03/17] fix: Default Accounting Dimensions in doctypes --- .../accounting_dimension/accounting_dimension.json | 9 ++++++++- erpnext/public/js/utils.js | 2 +- erpnext/public/js/utils/dimension_tree_filter.js | 3 +++ 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.json b/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.json index 6a4dc5c34f..0fab74d522 100644 --- a/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.json +++ b/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.json @@ -9,6 +9,7 @@ "document_type", "label", "fieldname", + "default_dimension", "mandatory_for_bs", "mandatory_for_pl", "disabled" @@ -53,9 +54,15 @@ "fieldname": "mandatory_for_pl", "fieldtype": "Check", "label": "Mandatory For Profit and Loss Account" + }, + { + "fieldname": "default_dimension", + "fieldtype": "Dynamic Link", + "label": "Default Dimension", + "options": "document_type" } ], - "modified": "2019-07-14 17:25:01.307948", + "modified": "2019-07-14 19:16:25.405924", "modified_by": "Administrator", "module": "Accounts", "name": "Accounting Dimension", diff --git a/erpnext/public/js/utils.js b/erpnext/public/js/utils.js index 0252f38931..1c5e98eb7d 100755 --- a/erpnext/public/js/utils.js +++ b/erpnext/public/js/utils.js @@ -69,7 +69,7 @@ $.extend(erpnext, { return []; } let dimensions = await frappe.db.get_list('Accounting Dimension', { - fields: ['label', 'fieldname', 'document_type'], + fields: ['label', 'fieldname', 'document_type', 'default_dimension'], filters: { disabled: 0 } diff --git a/erpnext/public/js/utils/dimension_tree_filter.js b/erpnext/public/js/utils/dimension_tree_filter.js index 549f95e039..4a82edda69 100644 --- a/erpnext/public/js/utils/dimension_tree_filter.js +++ b/erpnext/public/js/utils/dimension_tree_filter.js @@ -14,6 +14,9 @@ erpnext.doctypes_with_dimensions.forEach((doctype) => { onload: function(frm) { erpnext.dimension_filters.then((dimensions) => { dimensions.forEach((dimension) => { + if (dimension['default_dimension']) { + frm.set_value(dimension['fieldname'], dimension['default_dimension']); + } frappe.model.with_doctype(dimension['document_type'], () => { if (frappe.meta.has_field(dimension['document_type'], 'is_group')) { frm.set_query(dimension['fieldname'], { From 7d270edf799b316832106f478d50d11a23c60d9c Mon Sep 17 00:00:00 2001 From: deepeshgarg007 Date: Wed, 17 Jul 2019 15:38:21 +0530 Subject: [PATCH 04/17] fix: Added default dimension and filter in bootinfo --- .../accounting_dimension.js | 68 +++++++++++-------- .../accounting_dimension.json | 12 ++-- .../accounting_dimension.py | 8 +++ .../accounting_dimension_detail/__init__.py | 0 .../accounting_dimension_detail.json | 47 +++++++++++++ .../accounting_dimension_detail.py | 10 +++ .../journal_entry_account.json | 4 +- .../sales_invoice_item.json | 3 +- .../accounts_payable/accounts_payable.js | 15 ++-- .../accounts_payable_summary.js | 15 ++-- .../accounts_receivable.js | 15 ++-- .../accounts_receivable_summary.js | 14 ++-- .../budget_variance_report.js | 7 +- .../report/general_ledger/general_ledger.js | 15 ++-- .../profitability_analysis.js | 7 +- .../report/sales_register/sales_register.js | 15 ++-- .../report/trial_balance/trial_balance.js | 6 +- erpnext/public/js/financial_statements.js | 14 ++-- erpnext/public/js/utils.js | 14 ---- .../public/js/utils/dimension_tree_filter.js | 41 +++++++---- erpnext/startup/boot.py | 18 +++++ 21 files changed, 219 insertions(+), 129 deletions(-) create mode 100644 erpnext/accounts/doctype/accounting_dimension_detail/__init__.py create mode 100644 erpnext/accounts/doctype/accounting_dimension_detail/accounting_dimension_detail.json create mode 100644 erpnext/accounts/doctype/accounting_dimension_detail/accounting_dimension_detail.py diff --git a/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.js b/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.js index ffb6d5e597..bb4d514981 100644 --- a/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.js +++ b/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.js @@ -8,41 +8,48 @@ frappe.ui.form.on('Accounting Dimension', { frm.add_custom_button(__('Show {0}', [frm.doc.document_type]), function () { frappe.set_route("List", frm.doc.document_type); }); - } - frm.set_query('document_type', () => { - return { - filters: { - name: ['not in', ['Accounting Dimension', 'Project', 'Cost Center']] - } - }; - }); - - let button = frm.doc.disabled ? "Enable" : "Disable"; - - frm.add_custom_button(__(button), function() { - - frm.set_value('disabled', 1 - frm.doc.disabled); - - frappe.call({ - method: "erpnext.accounts.doctype.accounting_dimension.accounting_dimension.disable_dimension", - args: { - doc: frm.doc - }, - freeze: true, - callback: function(r) { - let message = frm.doc.disabled ? "Dimension Disabled" : "Dimension Enabled"; - frm.save(); - frappe.show_alert({message:__(message), indicator:'green'}); - } + frm.set_query('document_type', () => { + return { + filters: { + name: ['not in', ['Accounting Dimension', 'Project', 'Cost Center']] + } + }; }); - }); + + let button = frm.doc.disabled ? "Enable" : "Disable"; + + frm.add_custom_button(__(button), function() { + + frm.set_value('disabled', 1 - frm.doc.disabled); + + frappe.call({ + method: "erpnext.accounts.doctype.accounting_dimension.accounting_dimension.disable_dimension", + args: { + doc: frm.doc + }, + freeze: true, + callback: function(r) { + let message = frm.doc.disabled ? "Dimension Disabled" : "Dimension Enabled"; + frm.save(); + frappe.show_alert({message:__(message), indicator:'green'}); + } + }); + }); + } }, document_type: function(frm) { + frm.set_value('label', frm.doc.document_type); frm.set_value('fieldname', frappe.model.scrub(frm.doc.document_type)); + if (frm.is_new()){ + let row = frappe.model.add_child(frm.doc, "Accounting Dimension Detail", "dimension_defaults"); + row.reference_document = frm.doc.document_type; + frm.refresh_fields("dimension_defaults"); + } + frappe.db.get_value('Accounting Dimension', {'document_type': frm.doc.document_type}, 'document_type', (r) => { if (r && r.document_type) { frm.set_df_property('document_type', 'description', "Document type is already set as dimension"); @@ -50,3 +57,10 @@ frappe.ui.form.on('Accounting Dimension', { }); }, }); + +frappe.ui.form.on('Accounting Dimension Detail', { + dimension_defaults_add: function(frm, cdt, cdn) { + let row = locals[cdt][cdn]; + row.reference_document = frm.doc.document_type; + } +}) \ No newline at end of file diff --git a/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.json b/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.json index 0fab74d522..19fa9bf837 100644 --- a/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.json +++ b/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.json @@ -9,7 +9,7 @@ "document_type", "label", "fieldname", - "default_dimension", + "dimension_defaults", "mandatory_for_bs", "mandatory_for_pl", "disabled" @@ -56,13 +56,13 @@ "label": "Mandatory For Profit and Loss Account" }, { - "fieldname": "default_dimension", - "fieldtype": "Dynamic Link", - "label": "Default Dimension", - "options": "document_type" + "fieldname": "dimension_defaults", + "fieldtype": "Table", + "label": "Dimension Defaults", + "options": "Accounting Dimension Detail" } ], - "modified": "2019-07-14 19:16:25.405924", + "modified": "2019-07-16 18:00:11.365510", "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 314849847c..218ab596e3 100644 --- a/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.py +++ b/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.py @@ -144,6 +144,14 @@ def toggle_disabling(doc): frappe.clear_cache(doctype=doctype) + dimension_filters = frappe.db.sql(""" + SELECT label, fieldname, document_type + FROM `tabAccounting Dimension` + WHERE disabled = 0 + """, as_dict=1) + + return dimension_filters + def get_doctypes_with_dimensions(): 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", diff --git a/erpnext/accounts/doctype/accounting_dimension_detail/__init__.py b/erpnext/accounts/doctype/accounting_dimension_detail/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/accounts/doctype/accounting_dimension_detail/accounting_dimension_detail.json b/erpnext/accounts/doctype/accounting_dimension_detail/accounting_dimension_detail.json new file mode 100644 index 0000000000..f46a065271 --- /dev/null +++ b/erpnext/accounts/doctype/accounting_dimension_detail/accounting_dimension_detail.json @@ -0,0 +1,47 @@ +{ + "creation": "2019-07-16 17:53:18.718831", + "doctype": "DocType", + "editable_grid": 1, + "engine": "InnoDB", + "field_order": [ + "company", + "reference_document", + "default_dimension" + ], + "fields": [ + { + "fieldname": "company", + "fieldtype": "Link", + "in_list_view": 1, + "label": "Company", + "options": "Company", + "reqd": 1 + }, + { + "fieldname": "reference_document", + "fieldtype": "Link", + "hidden": 1, + "label": "Reference Document", + "options": "DocType", + "read_only": 1 + }, + { + "fieldname": "default_dimension", + "fieldtype": "Dynamic Link", + "in_list_view": 1, + "label": "Default Dimension", + "options": "reference_document", + "reqd": 1 + } + ], + "istable": 1, + "modified": "2019-07-16 18:54:52.202378", + "modified_by": "Administrator", + "module": "Accounts", + "name": "Accounting Dimension Detail", + "owner": "Administrator", + "permissions": [], + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1 +} \ No newline at end of file diff --git a/erpnext/accounts/doctype/accounting_dimension_detail/accounting_dimension_detail.py b/erpnext/accounts/doctype/accounting_dimension_detail/accounting_dimension_detail.py new file mode 100644 index 0000000000..17cf549fc4 --- /dev/null +++ b/erpnext/accounts/doctype/accounting_dimension_detail/accounting_dimension_detail.py @@ -0,0 +1,10 @@ +# -*- 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 + +class AccountingDimensionDetail(Document): + pass diff --git a/erpnext/accounts/doctype/journal_entry_account/journal_entry_account.json b/erpnext/accounts/doctype/journal_entry_account/journal_entry_account.json index e4acf5a03d..8728950286 100644 --- a/erpnext/accounts/doctype/journal_entry_account/journal_entry_account.json +++ b/erpnext/accounts/doctype/journal_entry_account/journal_entry_account.json @@ -258,6 +258,7 @@ "print_hide": 1 }, { + "collapsible": 1, "fieldname": "accounting_dimensions_section", "fieldtype": "Section Break", "label": "Accounting Dimensions" @@ -269,12 +270,13 @@ ], "idx": 1, "istable": 1, - "modified": "2019-05-25 22:14:02.715509", + "modified": "2019-07-16 17:12:08.238334", "modified_by": "Administrator", "module": "Accounts", "name": "Journal Entry Account", "owner": "Administrator", "permissions": [], + "sort_field": "modified", "sort_order": "DESC", "track_changes": 1 } \ No newline at end of file diff --git a/erpnext/accounts/doctype/sales_invoice_item/sales_invoice_item.json b/erpnext/accounts/doctype/sales_invoice_item/sales_invoice_item.json index 465df277fd..779ac4f656 100644 --- a/erpnext/accounts/doctype/sales_invoice_item/sales_invoice_item.json +++ b/erpnext/accounts/doctype/sales_invoice_item/sales_invoice_item.json @@ -764,6 +764,7 @@ "label": "Image" }, { + "collapsible": 1, "fieldname": "accounting_dimensions_section", "fieldtype": "Section Break", "label": "Accounting Dimensions" @@ -782,7 +783,7 @@ ], "idx": 1, "istable": 1, - "modified": "2019-06-28 17:30:12.156086", + "modified": "2019-07-16 16:36:46.527606", "modified_by": "Administrator", "module": "Accounts", "name": "Sales Invoice Item", diff --git a/erpnext/accounts/report/accounts_payable/accounts_payable.js b/erpnext/accounts/report/accounts_payable/accounts_payable.js index cfcc575718..5e07d080fb 100644 --- a/erpnext/accounts/report/accounts_payable/accounts_payable.js +++ b/erpnext/accounts/report/accounts_payable/accounts_payable.js @@ -115,13 +115,12 @@ frappe.query_reports["Accounts Payable"] = { } } -erpnext.dimension_filters.then((dimensions) => { - dimensions.forEach((dimension) => { - frappe.query_reports["Accounts Payable"].filters.splice(9, 0 ,{ - "fieldname": dimension["fieldname"], - "label": __(dimension["label"]), - "fieldtype": "Link", - "options": dimension["document_type"] - }); +frappe.boot.dimension_filters.forEach((dimension) => { + frappe.query_reports["Accounts Payable"].filters.splice(9, 0 ,{ + "fieldname": dimension["fieldname"], + "label": __(dimension["label"]), + "fieldtype": "Link", + "options": dimension["document_type"] }); }); + diff --git a/erpnext/accounts/report/accounts_payable_summary/accounts_payable_summary.js b/erpnext/accounts/report/accounts_payable_summary/accounts_payable_summary.js index 006068a266..426de6782d 100644 --- a/erpnext/accounts/report/accounts_payable_summary/accounts_payable_summary.js +++ b/erpnext/accounts/report/accounts_payable_summary/accounts_payable_summary.js @@ -99,13 +99,12 @@ frappe.query_reports["Accounts Payable Summary"] = { } } -erpnext.dimension_filters.then((dimensions) => { - dimensions.forEach((dimension) => { - frappe.query_reports["Accounts Payable Summary"].filters.splice(9, 0 ,{ - "fieldname": dimension["fieldname"], - "label": __(dimension["label"]), - "fieldtype": "Link", - "options": dimension["document_type"] - }); +frappe.boot.dimension_filters.forEach((dimension) => { + frappe.query_reports["Accounts Payable Summary"].filters.splice(9, 0 ,{ + "fieldname": dimension["fieldname"], + "label": __(dimension["label"]), + "fieldtype": "Link", + "options": dimension["document_type"] }); }); + diff --git a/erpnext/accounts/report/accounts_receivable/accounts_receivable.js b/erpnext/accounts/report/accounts_receivable/accounts_receivable.js index 2a45454bac..816e43898a 100644 --- a/erpnext/accounts/report/accounts_receivable/accounts_receivable.js +++ b/erpnext/accounts/report/accounts_receivable/accounts_receivable.js @@ -173,13 +173,12 @@ frappe.query_reports["Accounts Receivable"] = { } } -erpnext.dimension_filters.then((dimensions) => { - dimensions.forEach((dimension) => { - frappe.query_reports["Accounts Receivable"].filters.splice(9, 0 ,{ - "fieldname": dimension["fieldname"], - "label": __(dimension["label"]), - "fieldtype": "Link", - "options": dimension["document_type"] - }); +frappe.boot.dimension_filters.forEach((dimension) => { + frappe.query_reports["Accounts Receivable"].filters.splice(9, 0 ,{ + "fieldname": dimension["fieldname"], + "label": __(dimension["label"]), + "fieldtype": "Link", + "options": dimension["document_type"] }); }); + diff --git a/erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.js b/erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.js index a7c0787fcd..d63af8b3f3 100644 --- a/erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.js +++ b/erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.js @@ -117,13 +117,11 @@ frappe.query_reports["Accounts Receivable Summary"] = { } } -erpnext.dimension_filters.then((dimensions) => { - dimensions.forEach((dimension) => { - frappe.query_reports["Accounts Receivable Summary"].filters.splice(9, 0 ,{ - "fieldname": dimension["fieldname"], - "label": __(dimension["label"]), - "fieldtype": "Link", - "options": dimension["document_type"] - }); +frappe.boot.dimension_filters.forEach((dimension) => { + frappe.query_reports["Accounts Receivable Summary"].filters.splice(9, 0 ,{ + "fieldname": dimension["fieldname"], + "label": __(dimension["label"]), + "fieldtype": "Link", + "options": dimension["document_type"] }); }); diff --git a/erpnext/accounts/report/budget_variance_report/budget_variance_report.js b/erpnext/accounts/report/budget_variance_report/budget_variance_report.js index f2a33a83ee..33dc555a95 100644 --- a/erpnext/accounts/report/budget_variance_report/budget_variance_report.js +++ b/erpnext/accounts/report/budget_variance_report/budget_variance_report.js @@ -63,8 +63,7 @@ frappe.query_reports["Budget Variance Report"] = { ] } -erpnext.dimension_filters.then((dimensions) => { - dimensions.forEach((dimension) => { - frappe.query_reports["Budget Variance Report"].filters[4].options.push(dimension["document_type"]); - }); +frappe.boot.dimension_filters.forEach((dimension) => { + frappe.query_reports["Budget Variance Report"].filters[4].options.push(dimension["document_type"]); }); + diff --git a/erpnext/accounts/report/general_ledger/general_ledger.js b/erpnext/accounts/report/general_ledger/general_ledger.js index ea82575b80..74a1ea70ac 100644 --- a/erpnext/accounts/report/general_ledger/general_ledger.js +++ b/erpnext/accounts/report/general_ledger/general_ledger.js @@ -159,13 +159,12 @@ frappe.query_reports["General Ledger"] = { ] } -erpnext.dimension_filters.then((dimensions) => { - dimensions.forEach((dimension) => { - frappe.query_reports["General Ledger"].filters.splice(15, 0 ,{ - "fieldname": dimension["fieldname"], - "label": __(dimension["label"]), - "fieldtype": "Link", - "options": dimension["document_type"] - }); +frappe.boot.dimension_filters.forEach((dimension) => { + frappe.query_reports["General Ledger"].filters.splice(15, 0 ,{ + "fieldname": dimension["fieldname"], + "label": __(dimension["label"]), + "fieldtype": "Link", + "options": dimension["document_type"] }); }); + diff --git a/erpnext/accounts/report/profitability_analysis/profitability_analysis.js b/erpnext/accounts/report/profitability_analysis/profitability_analysis.js index d6864b54f7..2656a7e7b5 100644 --- a/erpnext/accounts/report/profitability_analysis/profitability_analysis.js +++ b/erpnext/accounts/report/profitability_analysis/profitability_analysis.js @@ -105,9 +105,8 @@ frappe.require("assets/erpnext/js/financial_statements.js", function() { "initial_depth": 3 } - erpnext.dimension_filters.then((dimensions) => { - dimensions.forEach((dimension) => { - frappe.query_reports["Profitability Analysis"].filters[1].options.push(dimension["document_type"]); - }); + frappe.boot.dimension_filters.forEach((dimension) => { + frappe.query_reports["Profitability Analysis"].filters[1].options.push(dimension["document_type"]); }); + }); diff --git a/erpnext/accounts/report/sales_register/sales_register.js b/erpnext/accounts/report/sales_register/sales_register.js index 442aa1262e..105f5a29c1 100644 --- a/erpnext/accounts/report/sales_register/sales_register.js +++ b/erpnext/accounts/report/sales_register/sales_register.js @@ -68,13 +68,12 @@ frappe.query_reports["Sales Register"] = { ] } -erpnext.dimension_filters.then((dimensions) => { - dimensions.forEach((dimension) => { - frappe.query_reports["Sales Register"].filters.splice(7, 0 ,{ - "fieldname": dimension["fieldname"], - "label": __(dimension["label"]), - "fieldtype": "Link", - "options": dimension["document_type"] - }); +frappe.boot.dimension_filters.forEach((dimension) => { + frappe.query_reports["Sales Register"].filters.splice(7, 0 ,{ + "fieldname": dimension["fieldname"], + "label": __(dimension["label"]), + "fieldtype": "Link", + "options": dimension["document_type"] }); }); + diff --git a/erpnext/accounts/report/trial_balance/trial_balance.js b/erpnext/accounts/report/trial_balance/trial_balance.js index 73d2ab3898..dc6d07e2bb 100644 --- a/erpnext/accounts/report/trial_balance/trial_balance.js +++ b/erpnext/accounts/report/trial_balance/trial_balance.js @@ -94,10 +94,8 @@ frappe.require("assets/erpnext/js/financial_statements.js", function() { "parent_field": "parent_account", "initial_depth": 3 } -}); -erpnext.dimension_filters.then((dimensions) => { - dimensions.forEach((dimension) => { + frappe.boot.dimension_filters.forEach((dimension) => { frappe.query_reports["Trial Balance"].filters.splice(5, 0 ,{ "fieldname": dimension["fieldname"], "label": __(dimension["label"]), @@ -107,3 +105,5 @@ erpnext.dimension_filters.then((dimensions) => { }); }); + + diff --git a/erpnext/public/js/financial_statements.js b/erpnext/public/js/financial_statements.js index 89cb13d981..5feedd3e15 100644 --- a/erpnext/public/js/financial_statements.js +++ b/erpnext/public/js/financial_statements.js @@ -129,14 +129,12 @@ function get_filters(){ } ] - erpnext.dimension_filters.then((dimensions) => { - dimensions.forEach((dimension) => { - filters.push({ - "fieldname": dimension["fieldname"], - "label": __(dimension["label"]), - "fieldtype": "Link", - "options": dimension["document_type"] - }); + frappe.boot.dimension_filters.forEach((dimension) => { + filters.push({ + "fieldname": dimension["fieldname"], + "label": __(dimension["label"]), + "fieldtype": "Link", + "options": dimension["document_type"] }); }); diff --git a/erpnext/public/js/utils.js b/erpnext/public/js/utils.js index 1c5e98eb7d..0a363a04fd 100755 --- a/erpnext/public/js/utils.js +++ b/erpnext/public/js/utils.js @@ -63,20 +63,6 @@ $.extend(erpnext, { me.show_serial_batch_selector(grid_row.frm, grid_row.doc); }); }, - - get_dimension_filters: async function() { - if (!frappe.model.can_read('Accounting Dimension')) { - return []; - } - let dimensions = await frappe.db.get_list('Accounting Dimension', { - fields: ['label', 'fieldname', 'document_type', 'default_dimension'], - filters: { - disabled: 0 - } - }); - - return dimensions; - } }); diff --git a/erpnext/public/js/utils/dimension_tree_filter.js b/erpnext/public/js/utils/dimension_tree_filter.js index 4a82edda69..22b4834dfb 100644 --- a/erpnext/public/js/utils/dimension_tree_filter.js +++ b/erpnext/public/js/utils/dimension_tree_filter.js @@ -7,25 +7,40 @@ erpnext.doctypes_with_dimensions = ["GL Entry", "Sales Invoice", "Purchase Invoi "Landed Cost Item", "Asset Value Adjustment", "Loyalty Program", "Fee Schedule", "Fee Structure", "Stock Reconciliation", "Travel Request", "Fees", "POS Profile"]; -erpnext.dimension_filters = erpnext.get_dimension_filters(); - erpnext.doctypes_with_dimensions.forEach((doctype) => { frappe.ui.form.on(doctype, { onload: function(frm) { - erpnext.dimension_filters.then((dimensions) => { - dimensions.forEach((dimension) => { - if (dimension['default_dimension']) { - frm.set_value(dimension['fieldname'], dimension['default_dimension']); + frappe.boot.dimension_filters.forEach((dimension) => { + frappe.model.with_doctype(dimension['document_type'], () => { + if (frappe.meta.has_field(dimension['document_type'], 'is_group')) { + frm.set_query(dimension['fieldname'], { + "is_group": 0 + }); } - frappe.model.with_doctype(dimension['document_type'], () => { - if (frappe.meta.has_field(dimension['document_type'], 'is_group')) { - frm.set_query(dimension['fieldname'], { - "is_group": 0 - }); - } - }); }); }); + }, + + company: function(frm) { + if(frm.doc.company) { + frappe.boot.dimension_filters.forEach((dimension) => { + frm.set_value(dimension['fieldname'], frappe.boot.default_dimensions[frm.doc.company][dimension['document_type']]); + }); + } + }, + + items_add: function(frm, cdt, cdn) { + frappe.boot.dimension_filters.forEach((dimension) => { + var row = frappe.get_doc(cdt, cdn); + frm.script_manager.copy_from_first_row("items", row, [dimension['fieldname']]); + }); + }, + + accounts_add: function(frm, cdt, cdn) { + frappe.boot.dimension_filters.forEach((dimension) => { + var row = frappe.get_doc(cdt, cdn); + frm.script_manager.copy_from_first_row("accounts", row, [dimension['fieldname']]); + }); } }); }); \ No newline at end of file diff --git a/erpnext/startup/boot.py b/erpnext/startup/boot.py index 4ca43a89b8..7d70cc2349 100644 --- a/erpnext/startup/boot.py +++ b/erpnext/startup/boot.py @@ -39,6 +39,8 @@ def boot_session(bootinfo): party_account_types = frappe.db.sql(""" select name, ifnull(account_type, '') from `tabParty Type`""") bootinfo.party_account_types = frappe._dict(party_account_types) + load_dimension_filters(bootinfo) + load_default_dimensions(bootinfo) def load_country_and_currency(bootinfo): country = frappe.db.get_default("country") @@ -49,6 +51,22 @@ def load_country_and_currency(bootinfo): number_format, smallest_currency_fraction_value, symbol from tabCurrency where enabled=1""", as_dict=1, update={"doctype":":Currency"}) +def load_dimension_filters(bootinfo): + bootinfo.dimension_filters = frappe.db.sql(""" + SELECT label, fieldname, document_type + FROM `tabAccounting Dimension` + WHERE disabled = 0 + """, as_dict=1) + +def load_default_dimensions(bootinfo): + default_dimensions = frappe.db.sql("""SELECT parent, company, default_dimension + FROM `tabAccounting Dimension Detail`""", as_dict=1) + + bootinfo.default_dimensions = {} + for dimension in default_dimensions: + bootinfo.default_dimensions.setdefault(dimension['company'], {}) + bootinfo.default_dimensions[dimension['company']][dimension['parent']] = dimension['default_dimension'] + def update_page_info(bootinfo): bootinfo.page_info.update({ "Chart of Accounts": { From f1f79ff1e14308cd31ef752469278f79bc1f7cf1 Mon Sep 17 00:00:00 2001 From: deepeshgarg007 Date: Thu, 18 Jul 2019 08:54:15 +0530 Subject: [PATCH 05/17] fix: Remove dimensions from boot --- .../accounting_dimension.json | 18 +--------- .../accounting_dimension.py | 34 ++++++++++++++----- .../accounting_dimension_detail.json | 24 +++++++++++-- erpnext/accounts/doctype/gl_entry/gl_entry.py | 16 ++++----- .../accounts_payable/accounts_payable.js | 2 +- .../accounts_payable_summary.js | 2 +- .../accounts_receivable.js | 2 +- .../accounts_receivable_summary.js | 2 +- .../budget_variance_report.js | 2 +- .../report/general_ledger/general_ledger.js | 2 +- .../profitability_analysis.js | 2 +- .../report/sales_register/sales_register.js | 2 +- .../report/trial_balance/trial_balance.js | 2 +- erpnext/public/js/financial_statements.js | 2 +- .../public/js/utils/dimension_tree_filter.js | 18 +++++++--- erpnext/startup/boot.py | 18 ---------- 16 files changed, 79 insertions(+), 69 deletions(-) diff --git a/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.json b/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.json index 19fa9bf837..cf6dc7a8fa 100644 --- a/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.json +++ b/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.json @@ -1,6 +1,4 @@ { - "_comments": "[]", - "_liked_by": "[]", "autoname": "field:label", "creation": "2019-05-04 18:13:37.002352", "doctype": "DocType", @@ -10,8 +8,6 @@ "label", "fieldname", "dimension_defaults", - "mandatory_for_bs", - "mandatory_for_pl", "disabled" ], "fields": [ @@ -43,18 +39,6 @@ "label": "Disable", "read_only": 1 }, - { - "default": "0", - "fieldname": "mandatory_for_bs", - "fieldtype": "Check", - "label": "Mandatory For Balance Sheet" - }, - { - "default": "0", - "fieldname": "mandatory_for_pl", - "fieldtype": "Check", - "label": "Mandatory For Profit and Loss Account" - }, { "fieldname": "dimension_defaults", "fieldtype": "Table", @@ -62,7 +46,7 @@ "options": "Accounting Dimension Detail" } ], - "modified": "2019-07-16 18:00:11.365510", + "modified": "2019-07-17 16:49:31.134385", "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 218ab596e3..90cc50d419 100644 --- a/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.py +++ b/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.py @@ -144,14 +144,6 @@ def toggle_disabling(doc): frappe.clear_cache(doctype=doctype) - dimension_filters = frappe.db.sql(""" - SELECT label, fieldname, document_type - FROM `tabAccounting Dimension` - WHERE disabled = 0 - """, as_dict=1) - - return dimension_filters - def get_doctypes_with_dimensions(): 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", @@ -163,9 +155,33 @@ def get_doctypes_with_dimensions(): return doclist def get_accounting_dimensions(as_list=True): - accounting_dimensions = frappe.get_all("Accounting Dimension", fields=["label", "fieldname", "mandatory_for_pl", "mandatory_for_bs", "disabled"], filters={"disabled": 0}) + accounting_dimensions = frappe.get_all("Accounting Dimension", fields=["label", "fieldname", "disabled"]) if as_list: return [d.fieldname for d in accounting_dimensions] else: return accounting_dimensions + +def get_checks_for_pl_and_bs_accounts(): + dimensions = frappe.db.sql("""SELECT parent, company, mandatory_for_pl, mandatory_for_bs + FROM `tabAccounting Dimension Detail`""", as_dict=1) + + return dimensions + +@frappe.whitelist() +def get_dimension_filters(): + dimension_filters = frappe.db.sql(""" + SELECT label, fieldname, document_type + FROM `tabAccounting Dimension` + WHERE disabled = 0 + """, as_dict=1) + + default_dimensions = frappe.db.sql("""SELECT parent, company, default_dimension + FROM `tabAccounting Dimension Detail`""", as_dict=1) + + default_dimensions_map = {} + for dimension in default_dimensions: + default_dimensions_map.setdefault(dimension['company'], {}) + default_dimensions_map[dimension['company']][dimension['parent']] = dimension['default_dimension'] + + return dimension_filters, default_dimensions_map diff --git a/erpnext/accounts/doctype/accounting_dimension_detail/accounting_dimension_detail.json b/erpnext/accounts/doctype/accounting_dimension_detail/accounting_dimension_detail.json index f46a065271..1ccef6cc7a 100644 --- a/erpnext/accounts/doctype/accounting_dimension_detail/accounting_dimension_detail.json +++ b/erpnext/accounts/doctype/accounting_dimension_detail/accounting_dimension_detail.json @@ -6,10 +6,13 @@ "field_order": [ "company", "reference_document", - "default_dimension" + "default_dimension", + "mandatory_for_bs", + "mandatory_for_pl" ], "fields": [ { + "columns": 2, "fieldname": "company", "fieldtype": "Link", "in_list_view": 1, @@ -26,16 +29,33 @@ "read_only": 1 }, { + "columns": 2, "fieldname": "default_dimension", "fieldtype": "Dynamic Link", "in_list_view": 1, "label": "Default Dimension", "options": "reference_document", "reqd": 1 + }, + { + "columns": 3, + "default": "0", + "fieldname": "mandatory_for_bs", + "fieldtype": "Check", + "in_list_view": 1, + "label": "Mandatory For Balance Sheet" + }, + { + "columns": 3, + "default": "0", + "fieldname": "mandatory_for_pl", + "fieldtype": "Check", + "in_list_view": 1, + "label": "Mandatory For Profit and Loss Account" } ], "istable": 1, - "modified": "2019-07-16 18:54:52.202378", + "modified": "2019-07-17 23:34:33.026883", "modified_by": "Administrator", "module": "Accounts", "name": "Accounting Dimension Detail", diff --git a/erpnext/accounts/doctype/gl_entry/gl_entry.py b/erpnext/accounts/doctype/gl_entry/gl_entry.py index 84276eae10..80e518644d 100644 --- a/erpnext/accounts/doctype/gl_entry/gl_entry.py +++ b/erpnext/accounts/doctype/gl_entry/gl_entry.py @@ -12,7 +12,7 @@ from erpnext.accounts.party import validate_party_gle_currency, validate_party_f from erpnext.accounts.utils import get_account_currency from erpnext.accounts.utils import get_fiscal_year from erpnext.exceptions import InvalidAccountCurrency -from erpnext.accounts.doctype.accounting_dimension.accounting_dimension import get_accounting_dimensions +from erpnext.accounts.doctype.accounting_dimension.accounting_dimension import get_checks_for_pl_and_bs_accounts exclude_from_linked_with = True class GLEntry(Document): @@ -86,19 +86,19 @@ class GLEntry(Document): account_type = frappe.db.get_value("Account", self.account, "report_type") - for dimension in get_accounting_dimensions(as_list=False): + for dimension in get_checks_for_pl_and_bs_accounts(): if account_type == "Profit and Loss" \ - and dimension.mandatory_for_pl and not dimension.disabled: - if not self.get(dimension.fieldname): + and self.company == dimension.company and dimension.mandatory_for_pl and not dimension.disabled: + if not self.get(frappe.scrub(dimension.parent)): frappe.throw(_("Accounting Dimension {0} is required for 'Profit and Loss' account {1}.") - .format(dimension.label, self.account)) + .format(dimension.parent, self.account)) if account_type == "Balance Sheet" \ - and dimension.mandatory_for_bs and not dimension.disabled: - if not self.get(dimension.fieldname): + and self.company == dimension.company and dimension.mandatory_for_bs and not dimension.disabled: + if not self.get(frappe.scrub(dimension.parent)): frappe.throw(_("Accounting Dimension {0} is required for 'Balance Sheet' account {1}.") - .format(dimension.label, self.account)) + .format(dimension.parent, self.account)) def check_pl_account(self): diff --git a/erpnext/accounts/report/accounts_payable/accounts_payable.js b/erpnext/accounts/report/accounts_payable/accounts_payable.js index 5e07d080fb..8eb670de51 100644 --- a/erpnext/accounts/report/accounts_payable/accounts_payable.js +++ b/erpnext/accounts/report/accounts_payable/accounts_payable.js @@ -115,7 +115,7 @@ frappe.query_reports["Accounts Payable"] = { } } -frappe.boot.dimension_filters.forEach((dimension) => { +erpnext.dimension_filters.forEach((dimension) => { frappe.query_reports["Accounts Payable"].filters.splice(9, 0 ,{ "fieldname": dimension["fieldname"], "label": __(dimension["label"]), diff --git a/erpnext/accounts/report/accounts_payable_summary/accounts_payable_summary.js b/erpnext/accounts/report/accounts_payable_summary/accounts_payable_summary.js index 426de6782d..5f0fdc9f2c 100644 --- a/erpnext/accounts/report/accounts_payable_summary/accounts_payable_summary.js +++ b/erpnext/accounts/report/accounts_payable_summary/accounts_payable_summary.js @@ -99,7 +99,7 @@ frappe.query_reports["Accounts Payable Summary"] = { } } -frappe.boot.dimension_filters.forEach((dimension) => { +erpnext.dimension_filters.forEach((dimension) => { frappe.query_reports["Accounts Payable Summary"].filters.splice(9, 0 ,{ "fieldname": dimension["fieldname"], "label": __(dimension["label"]), diff --git a/erpnext/accounts/report/accounts_receivable/accounts_receivable.js b/erpnext/accounts/report/accounts_receivable/accounts_receivable.js index 816e43898a..4551973ac6 100644 --- a/erpnext/accounts/report/accounts_receivable/accounts_receivable.js +++ b/erpnext/accounts/report/accounts_receivable/accounts_receivable.js @@ -173,7 +173,7 @@ frappe.query_reports["Accounts Receivable"] = { } } -frappe.boot.dimension_filters.forEach((dimension) => { +erpnext.dimension_filters.forEach((dimension) => { frappe.query_reports["Accounts Receivable"].filters.splice(9, 0 ,{ "fieldname": dimension["fieldname"], "label": __(dimension["label"]), diff --git a/erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.js b/erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.js index d63af8b3f3..0120608a8f 100644 --- a/erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.js +++ b/erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.js @@ -117,7 +117,7 @@ frappe.query_reports["Accounts Receivable Summary"] = { } } -frappe.boot.dimension_filters.forEach((dimension) => { +erpnext.dimension_filters.forEach((dimension) => { frappe.query_reports["Accounts Receivable Summary"].filters.splice(9, 0 ,{ "fieldname": dimension["fieldname"], "label": __(dimension["label"]), diff --git a/erpnext/accounts/report/budget_variance_report/budget_variance_report.js b/erpnext/accounts/report/budget_variance_report/budget_variance_report.js index 33dc555a95..24511871fd 100644 --- a/erpnext/accounts/report/budget_variance_report/budget_variance_report.js +++ b/erpnext/accounts/report/budget_variance_report/budget_variance_report.js @@ -63,7 +63,7 @@ frappe.query_reports["Budget Variance Report"] = { ] } -frappe.boot.dimension_filters.forEach((dimension) => { +erpnext.dimension_filters.forEach((dimension) => { frappe.query_reports["Budget Variance Report"].filters[4].options.push(dimension["document_type"]); }); diff --git a/erpnext/accounts/report/general_ledger/general_ledger.js b/erpnext/accounts/report/general_ledger/general_ledger.js index 74a1ea70ac..4a287060b3 100644 --- a/erpnext/accounts/report/general_ledger/general_ledger.js +++ b/erpnext/accounts/report/general_ledger/general_ledger.js @@ -159,7 +159,7 @@ frappe.query_reports["General Ledger"] = { ] } -frappe.boot.dimension_filters.forEach((dimension) => { +erpnext.dimension_filters.forEach((dimension) => { frappe.query_reports["General Ledger"].filters.splice(15, 0 ,{ "fieldname": dimension["fieldname"], "label": __(dimension["label"]), diff --git a/erpnext/accounts/report/profitability_analysis/profitability_analysis.js b/erpnext/accounts/report/profitability_analysis/profitability_analysis.js index 2656a7e7b5..889ede5a82 100644 --- a/erpnext/accounts/report/profitability_analysis/profitability_analysis.js +++ b/erpnext/accounts/report/profitability_analysis/profitability_analysis.js @@ -105,7 +105,7 @@ frappe.require("assets/erpnext/js/financial_statements.js", function() { "initial_depth": 3 } - frappe.boot.dimension_filters.forEach((dimension) => { + erpnext.dimension_filters.forEach((dimension) => { frappe.query_reports["Profitability Analysis"].filters[1].options.push(dimension["document_type"]); }); diff --git a/erpnext/accounts/report/sales_register/sales_register.js b/erpnext/accounts/report/sales_register/sales_register.js index 105f5a29c1..9dee656d4a 100644 --- a/erpnext/accounts/report/sales_register/sales_register.js +++ b/erpnext/accounts/report/sales_register/sales_register.js @@ -68,7 +68,7 @@ frappe.query_reports["Sales Register"] = { ] } -frappe.boot.dimension_filters.forEach((dimension) => { +erpnext.dimension_filters.forEach((dimension) => { frappe.query_reports["Sales Register"].filters.splice(7, 0 ,{ "fieldname": dimension["fieldname"], "label": __(dimension["label"]), diff --git a/erpnext/accounts/report/trial_balance/trial_balance.js b/erpnext/accounts/report/trial_balance/trial_balance.js index dc6d07e2bb..f15b5b1a19 100644 --- a/erpnext/accounts/report/trial_balance/trial_balance.js +++ b/erpnext/accounts/report/trial_balance/trial_balance.js @@ -95,7 +95,7 @@ frappe.require("assets/erpnext/js/financial_statements.js", function() { "initial_depth": 3 } - frappe.boot.dimension_filters.forEach((dimension) => { + erpnext.dimension_filters.forEach((dimension) => { frappe.query_reports["Trial Balance"].filters.splice(5, 0 ,{ "fieldname": dimension["fieldname"], "label": __(dimension["label"]), diff --git a/erpnext/public/js/financial_statements.js b/erpnext/public/js/financial_statements.js index 5feedd3e15..63e057c39d 100644 --- a/erpnext/public/js/financial_statements.js +++ b/erpnext/public/js/financial_statements.js @@ -129,7 +129,7 @@ function get_filters(){ } ] - frappe.boot.dimension_filters.forEach((dimension) => { + erpnext.dimension_filters.forEach((dimension) => { filters.push({ "fieldname": dimension["fieldname"], "label": __(dimension["label"]), diff --git a/erpnext/public/js/utils/dimension_tree_filter.js b/erpnext/public/js/utils/dimension_tree_filter.js index 22b4834dfb..9d4c435240 100644 --- a/erpnext/public/js/utils/dimension_tree_filter.js +++ b/erpnext/public/js/utils/dimension_tree_filter.js @@ -7,10 +7,18 @@ erpnext.doctypes_with_dimensions = ["GL Entry", "Sales Invoice", "Purchase Invoi "Landed Cost Item", "Asset Value Adjustment", "Loyalty Program", "Fee Schedule", "Fee Structure", "Stock Reconciliation", "Travel Request", "Fees", "POS Profile"]; +frappe.call({ + method: "erpnext.accounts.doctype.accounting_dimension.accounting_dimension.get_dimension_filters", + callback: function(r){ + erpnext.dimension_filters = r.message[0]; + erpnext.default_dimensions = r.message[1]; + } +}); + erpnext.doctypes_with_dimensions.forEach((doctype) => { frappe.ui.form.on(doctype, { onload: function(frm) { - frappe.boot.dimension_filters.forEach((dimension) => { + erpnext.dimension_filters.forEach((dimension) => { frappe.model.with_doctype(dimension['document_type'], () => { if (frappe.meta.has_field(dimension['document_type'], 'is_group')) { frm.set_query(dimension['fieldname'], { @@ -23,21 +31,21 @@ erpnext.doctypes_with_dimensions.forEach((doctype) => { company: function(frm) { if(frm.doc.company) { - frappe.boot.dimension_filters.forEach((dimension) => { - frm.set_value(dimension['fieldname'], frappe.boot.default_dimensions[frm.doc.company][dimension['document_type']]); + erpnext.dimension_filters.forEach((dimension) => { + frm.set_value(dimension['fieldname'], erpnext.default_dimensions[frm.doc.company][dimension['document_type']]); }); } }, items_add: function(frm, cdt, cdn) { - frappe.boot.dimension_filters.forEach((dimension) => { + erpnext.dimension_filters.forEach((dimension) => { var row = frappe.get_doc(cdt, cdn); frm.script_manager.copy_from_first_row("items", row, [dimension['fieldname']]); }); }, accounts_add: function(frm, cdt, cdn) { - frappe.boot.dimension_filters.forEach((dimension) => { + erpnext.dimension_filters.forEach((dimension) => { var row = frappe.get_doc(cdt, cdn); frm.script_manager.copy_from_first_row("accounts", row, [dimension['fieldname']]); }); diff --git a/erpnext/startup/boot.py b/erpnext/startup/boot.py index 7d70cc2349..4ca43a89b8 100644 --- a/erpnext/startup/boot.py +++ b/erpnext/startup/boot.py @@ -39,8 +39,6 @@ def boot_session(bootinfo): party_account_types = frappe.db.sql(""" select name, ifnull(account_type, '') from `tabParty Type`""") bootinfo.party_account_types = frappe._dict(party_account_types) - load_dimension_filters(bootinfo) - load_default_dimensions(bootinfo) def load_country_and_currency(bootinfo): country = frappe.db.get_default("country") @@ -51,22 +49,6 @@ def load_country_and_currency(bootinfo): number_format, smallest_currency_fraction_value, symbol from tabCurrency where enabled=1""", as_dict=1, update={"doctype":":Currency"}) -def load_dimension_filters(bootinfo): - bootinfo.dimension_filters = frappe.db.sql(""" - SELECT label, fieldname, document_type - FROM `tabAccounting Dimension` - WHERE disabled = 0 - """, as_dict=1) - -def load_default_dimensions(bootinfo): - default_dimensions = frappe.db.sql("""SELECT parent, company, default_dimension - FROM `tabAccounting Dimension Detail`""", as_dict=1) - - bootinfo.default_dimensions = {} - for dimension in default_dimensions: - bootinfo.default_dimensions.setdefault(dimension['company'], {}) - bootinfo.default_dimensions[dimension['company']][dimension['parent']] = dimension['default_dimension'] - def update_page_info(bootinfo): bootinfo.page_info.update({ "Chart of Accounts": { From acc0958ead357df9bcc5691af386ccbea28d90d1 Mon Sep 17 00:00:00 2001 From: deepeshgarg007 Date: Thu, 18 Jul 2019 18:14:12 +0530 Subject: [PATCH 06/17] fix: Patch --- .../v12_0/update_ewaybill_field_position.py | 25 ++++++++++--------- 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/erpnext/patches/v12_0/update_ewaybill_field_position.py b/erpnext/patches/v12_0/update_ewaybill_field_position.py index d0291d2123..c0230c4395 100644 --- a/erpnext/patches/v12_0/update_ewaybill_field_position.py +++ b/erpnext/patches/v12_0/update_ewaybill_field_position.py @@ -10,18 +10,19 @@ def execute(): field = frappe.db.get_value("Custom Field", {"dt": "Sales Invoice", "fieldname": "ewaybill"}) - ewaybill_field = frappe.get_doc("Custom Field", field) + if field: + ewaybill_field = frappe.get_doc("Custom Field", field) - ewaybill_field.flags.ignore_validate = True + ewaybill_field.flags.ignore_validate = True - ewaybill_field.update({ - 'fieldname': 'ewaybill', - 'label': 'e-Way Bill No.', - 'fieldtype': 'Data', - 'depends_on': 'eval:(doc.docstatus === 1)', - 'allow_on_submit': 1, - 'insert_after': 'tax_id', - 'translatable': 0 - }) + ewaybill_field.update({ + 'fieldname': 'ewaybill', + 'label': 'e-Way Bill No.', + 'fieldtype': 'Data', + 'depends_on': 'eval:(doc.docstatus === 1)', + 'allow_on_submit': 1, + 'insert_after': 'tax_id', + 'translatable': 0 + }) - ewaybill_field.save() \ No newline at end of file + ewaybill_field.save() \ No newline at end of file From 22a4857a3c305c3f92a73be286ceaf9c1b34214a Mon Sep 17 00:00:00 2001 From: deepeshgarg007 Date: Thu, 18 Jul 2019 18:29:34 +0530 Subject: [PATCH 07/17] fix: Codacy Fixes --- .../doctype/accounting_dimension/accounting_dimension.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.js b/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.js index bb4d514981..d5f39b5cd3 100644 --- a/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.js +++ b/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.js @@ -63,4 +63,4 @@ frappe.ui.form.on('Accounting Dimension Detail', { let row = locals[cdt][cdn]; row.reference_document = frm.doc.document_type; } -}) \ No newline at end of file +}); \ No newline at end of file From 5dfe4df23b8dd282fdbda33ab7ce4ae4970bdf6a Mon Sep 17 00:00:00 2001 From: deepeshgarg007 Date: Sat, 20 Jul 2019 17:53:29 +0530 Subject: [PATCH 08/17] fix: Set query fix --- .../accounting_dimension/accounting_dimension.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.js b/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.js index d5f39b5cd3..88b11dd678 100644 --- a/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.js +++ b/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.js @@ -4,19 +4,19 @@ frappe.ui.form.on('Accounting Dimension', { refresh: function(frm) { + frm.set_query('document_type', () => { + return { + filters: { + name: ['not in', ['Accounting Dimension', 'Project', 'Cost Center', 'Accounting Dimension Detail']] + } + }; + }); + if (!frm.is_new()) { frm.add_custom_button(__('Show {0}', [frm.doc.document_type]), function () { frappe.set_route("List", frm.doc.document_type); }); - frm.set_query('document_type', () => { - return { - filters: { - name: ['not in', ['Accounting Dimension', 'Project', 'Cost Center']] - } - }; - }); - let button = frm.doc.disabled ? "Enable" : "Disable"; frm.add_custom_button(__(button), function() { From 1c1f6f90bb8280a92b5090954a1615ea08ee24c3 Mon Sep 17 00:00:00 2001 From: deepeshgarg007 Date: Mon, 22 Jul 2019 12:41:48 +0530 Subject: [PATCH 09/17] fix: Test Cases for accounting dimensions --- .../test_accounting_dimension.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/erpnext/accounts/doctype/accounting_dimension/test_accounting_dimension.py b/erpnext/accounts/doctype/accounting_dimension/test_accounting_dimension.py index 527ddcc80f..7de7c108a2 100644 --- a/erpnext/accounts/doctype/accounting_dimension/test_accounting_dimension.py +++ b/erpnext/accounts/doctype/accounting_dimension/test_accounting_dimension.py @@ -28,11 +28,20 @@ class TestAccountingDimension(unittest.TestCase): "doctype": "Accounting Dimension", "document_type": "Location", "mandatory_for_pl": 1 - }).insert() + }) + + dimension1.append("dimension_defaults", { + "company": "_Test Company", + "reference_document": "Location", + "default_dimension": "Block 1", + "mandatory_for_pl": 1 + }) + + dimension1.insert() + dimension1.save() else: dimension1 = frappe.get_doc("Accounting Dimension", "Location") dimension1.disabled = 0 - dimension1.mandatory_for_pl = 1 dimension1.save() def test_dimension_against_sales_invoice(self): From 3d15128b91038b476fe1440e7ebd2f04ae61fc2a Mon Sep 17 00:00:00 2001 From: deepeshgarg007 Date: Tue, 23 Jul 2019 08:32:37 +0530 Subject: [PATCH 10/17] fix: Test cases for accounting dimensions --- .../doctype/accounting_dimension/test_accounting_dimension.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/erpnext/accounts/doctype/accounting_dimension/test_accounting_dimension.py b/erpnext/accounts/doctype/accounting_dimension/test_accounting_dimension.py index 7de7c108a2..c75ba825a4 100644 --- a/erpnext/accounts/doctype/accounting_dimension/test_accounting_dimension.py +++ b/erpnext/accounts/doctype/accounting_dimension/test_accounting_dimension.py @@ -27,14 +27,13 @@ class TestAccountingDimension(unittest.TestCase): dimension1 = frappe.get_doc({ "doctype": "Accounting Dimension", "document_type": "Location", - "mandatory_for_pl": 1 }) dimension1.append("dimension_defaults", { "company": "_Test Company", "reference_document": "Location", "default_dimension": "Block 1", - "mandatory_for_pl": 1 + "mandatory_for_bs": 1 }) dimension1.insert() From 82661372f72f1905380ffe06d6318b246a62a0e2 Mon Sep 17 00:00:00 2001 From: deepeshgarg007 Date: Fri, 26 Jul 2019 09:12:30 +0530 Subject: [PATCH 11/17] fix: Add accounting dimensions to subscription and opening invoice tool --- .../accounting_dimension.py | 7 +- .../opening_invoice_creation_tool.json | 14 +- .../opening_invoice_creation_tool.py | 8 + .../opening_invoice_creation_tool_item.json | 15 +- .../doctype/subscription/subscription.json | 1099 ++++------------- .../doctype/subscription/subscription.py | 13 + .../subscription_plan/subscription_plan.json | 723 ++--------- erpnext/patches.txt | 1 + ...counting_dimensions_in_missing_doctypes.py | 38 + .../public/js/utils/dimension_tree_filter.js | 5 +- 10 files changed, 440 insertions(+), 1483 deletions(-) create mode 100644 erpnext/patches/v12_0/create_accounting_dimensions_in_missing_doctypes.py diff --git a/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.py b/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.py index 90cc50d419..61f699f6ab 100644 --- a/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.py +++ b/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.py @@ -96,13 +96,13 @@ def delete_accounting_dimension(doc): frappe.db.sql(""" DELETE FROM `tabCustom Field` - WHERE fieldname = %s + WHERE fieldname = %s AND dt IN (%s)""" % #nosec ('%s', ', '.join(['%s']* len(doclist))), tuple([doc.fieldname] + doclist)) frappe.db.sql(""" DELETE FROM `tabProperty Setter` - WHERE field_name = %s + WHERE field_name = %s AND doc_type IN (%s)""" % #nosec ('%s', ', '.join(['%s']* len(doclist))), tuple([doc.fieldname] + doclist)) @@ -150,7 +150,8 @@ def get_doctypes_with_dimensions(): "Purchase Order Item", "Journal Entry Account", "Material Request Item", "Delivery Note Item", "Purchase Receipt Item", "Stock Entry Detail", "Payment Entry Deduction", "Sales Taxes and Charges", "Purchase Taxes and Charges", "Shipping Rule", "Landed Cost Item", "Asset Value Adjustment", "Loyalty Program", "Fee Schedule", "Fee Structure", "Stock Reconciliation", - "Travel Request", "Fees", "POS Profile"] + "Travel Request", "Fees", "POS Profile", "Opening Invoice Creation Tool", "Opening Invoice Creation Tool Item", "Subscription", + "Subscription Plan"] return doclist diff --git a/erpnext/accounts/doctype/opening_invoice_creation_tool/opening_invoice_creation_tool.json b/erpnext/accounts/doctype/opening_invoice_creation_tool/opening_invoice_creation_tool.json index 7d2d5a11a8..bc9241802d 100644 --- a/erpnext/accounts/doctype/opening_invoice_creation_tool/opening_invoice_creation_tool.json +++ b/erpnext/accounts/doctype/opening_invoice_creation_tool/opening_invoice_creation_tool.json @@ -10,7 +10,9 @@ "create_missing_party", "column_break_3", "invoice_type", + "accounting_dimensions_section", "cost_center", + "dimension_col_break", "section_break_4", "invoices" ], @@ -59,11 +61,21 @@ "fieldtype": "Link", "label": "Cost Center", "options": "Cost Center" + }, + { + "collapsible": 1, + "fieldname": "accounting_dimensions_section", + "fieldtype": "Section Break", + "label": "Accounting Dimensions" + }, + { + "fieldname": "dimension_col_break", + "fieldtype": "Column Break" } ], "hide_toolbar": 1, "issingle": 1, - "modified": "2019-06-13 11:45:31.405267", + "modified": "2019-07-25 14:57:33.187689", "modified_by": "Administrator", "module": "Accounts", "name": "Opening Invoice Creation Tool", diff --git a/erpnext/accounts/doctype/opening_invoice_creation_tool/opening_invoice_creation_tool.py b/erpnext/accounts/doctype/opening_invoice_creation_tool/opening_invoice_creation_tool.py index 5fa7b48c09..ce8aba75b2 100644 --- a/erpnext/accounts/doctype/opening_invoice_creation_tool/opening_invoice_creation_tool.py +++ b/erpnext/accounts/doctype/opening_invoice_creation_tool/opening_invoice_creation_tool.py @@ -7,6 +7,7 @@ import frappe from frappe import _, scrub from frappe.utils import flt, nowdate from frappe.model.document import Document +from erpnext.accounts.doctype.accounting_dimension.accounting_dimension import get_accounting_dimensions class OpeningInvoiceCreationTool(Document): @@ -173,6 +174,13 @@ class OpeningInvoiceCreationTool(Document): "currency": frappe.get_cached_value('Company', self.company, "default_currency") }) + accounting_dimension = get_accounting_dimensions() + + for dimension in accounting_dimension: + args.update({ + dimension: item.get(dimension) + }) + if self.invoice_type == "Sales": args["is_pos"] = 0 diff --git a/erpnext/accounts/doctype/opening_invoice_creation_tool_item/opening_invoice_creation_tool_item.json b/erpnext/accounts/doctype/opening_invoice_creation_tool_item/opening_invoice_creation_tool_item.json index afa7229e53..4ce8cb95b1 100644 --- a/erpnext/accounts/doctype/opening_invoice_creation_tool_item/opening_invoice_creation_tool_item.json +++ b/erpnext/accounts/doctype/opening_invoice_creation_tool_item/opening_invoice_creation_tool_item.json @@ -15,7 +15,9 @@ "outstanding_amount", "column_break_4", "qty", - "cost_center" + "accounting_dimensions_section", + "cost_center", + "dimension_col_break" ], "fields": [ { @@ -92,10 +94,19 @@ "fieldtype": "Link", "label": "Cost Center", "options": "Cost Center" + }, + { + "fieldname": "accounting_dimensions_section", + "fieldtype": "Section Break", + "label": "Accounting Dimensions" + }, + { + "fieldname": "dimension_col_break", + "fieldtype": "Column Break" } ], "istable": 1, - "modified": "2019-06-13 11:48:08.324063", + "modified": "2019-07-25 15:00:00.460695", "modified_by": "Administrator", "module": "Accounts", "name": "Opening Invoice Creation Tool Item", diff --git a/erpnext/accounts/doctype/subscription/subscription.json b/erpnext/accounts/doctype/subscription/subscription.json index c9305164f0..29cb62a397 100644 --- a/erpnext/accounts/doctype/subscription/subscription.json +++ b/erpnext/accounts/doctype/subscription/subscription.json @@ -1,926 +1,245 @@ { - "allow_copy": 0, - "allow_events_in_timeline": 0, - "allow_guest_to_view": 0, - "allow_import": 0, - "allow_rename": 0, - "autoname": "ACC-SUB-.YYYY.-.#####", - "beta": 0, - "creation": "2017-07-18 17:50:43.967266", - "custom": 0, - "docstatus": 0, - "doctype": "DocType", - "document_type": "", - "editable_grid": 1, - "engine": "InnoDB", + "autoname": "ACC-SUB-.YYYY.-.#####", + "creation": "2017-07-18 17:50:43.967266", + "doctype": "DocType", + "editable_grid": 1, + "engine": "InnoDB", + "field_order": [ + "customer", + "cb_1", + "status", + "subscription_period", + "start", + "cancelation_date", + "trial_period_start", + "trial_period_end", + "column_break_11", + "current_invoice_start", + "current_invoice_end", + "days_until_due", + "cancel_at_period_end", + "generate_invoice_at_period_start", + "sb_4", + "plans", + "sb_1", + "tax_template", + "sb_2", + "apply_additional_discount", + "cb_2", + "additional_discount_percentage", + "additional_discount_amount", + "sb_3", + "invoices", + "accounting_dimensions_section", + "dimension_col_break" + ], "fields": [ { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "customer", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Customer", - "length": 0, - "no_copy": 0, - "options": "Customer", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 1, - "translatable": 0, - "unique": 0 - }, + "fieldname": "customer", + "fieldtype": "Link", + "in_list_view": 1, + "label": "Customer", + "options": "Customer", + "reqd": 1, + "set_only_once": 1 + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 1, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "cb_1", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "allow_on_submit": 1, + "fieldname": "cb_1", + "fieldtype": "Column Break" + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "status", - "fieldtype": "Select", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Status", - "length": 0, - "no_copy": 0, - "options": "\nTrialling\nActive\nPast Due Date\nCancelled\nUnpaid", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "fieldname": "status", + "fieldtype": "Select", + "label": "Status", + "options": "\nTrialling\nActive\nPast Due Date\nCancelled\nUnpaid", + "read_only": 1 + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "subscription_period", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Subscription Period", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "fieldname": "subscription_period", + "fieldtype": "Section Break", + "label": "Subscription Period" + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "start", - "fieldtype": "Date", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Subscription Start Date", - "length": 0, - "no_copy": 0, - "options": "", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 1, - "translatable": 0, - "unique": 0 - }, + "fieldname": "start", + "fieldtype": "Date", + "label": "Subscription Start Date", + "set_only_once": 1 + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "cancelation_date", - "fieldtype": "Date", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Cancelation Date", - "length": 0, - "no_copy": 0, - "options": "", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "fieldname": "cancelation_date", + "fieldtype": "Date", + "label": "Cancelation Date", + "read_only": 1 + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 1, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "trial_period_start", - "fieldtype": "Date", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Trial Period Start Date", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 1, - "translatable": 0, - "unique": 0 - }, + "allow_on_submit": 1, + "fieldname": "trial_period_start", + "fieldtype": "Date", + "label": "Trial Period Start Date", + "set_only_once": 1 + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "eval:doc.trial_period_start", - "fieldname": "trial_period_end", - "fieldtype": "Date", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Trial Period End Date", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 1, - "translatable": 0, - "unique": 0 - }, + "depends_on": "eval:doc.trial_period_start", + "fieldname": "trial_period_end", + "fieldtype": "Date", + "label": "Trial Period End Date", + "set_only_once": 1 + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "column_break_11", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "fieldname": "column_break_11", + "fieldtype": "Column Break" + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "current_invoice_start", - "fieldtype": "Date", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Current Invoice Start Date", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "fieldname": "current_invoice_start", + "fieldtype": "Date", + "label": "Current Invoice Start Date", + "read_only": 1 + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "current_invoice_end", - "fieldtype": "Date", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Current Invoice End Date", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "fieldname": "current_invoice_end", + "fieldtype": "Date", + "label": "Current Invoice End Date", + "read_only": 1 + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "default": "0", - "description": "Number of days that the subscriber has to pay invoices generated by this subscription", - "fieldname": "days_until_due", - "fieldtype": "Int", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Days Until Due", - "length": 0, - "no_copy": 0, - "options": "", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "default": "0", + "description": "Number of days that the subscriber has to pay invoices generated by this subscription", + "fieldname": "days_until_due", + "fieldtype": "Int", + "label": "Days Until Due" + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "cancel_at_period_end", - "fieldtype": "Check", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Cancel At End Of Period", - "length": 0, - "no_copy": 0, - "options": "", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "default": "0", + "fieldname": "cancel_at_period_end", + "fieldtype": "Check", + "label": "Cancel At End Of Period" + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "generate_invoice_at_period_start", - "fieldtype": "Check", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Generate Invoice At Beginning Of Period", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "default": "0", + "fieldname": "generate_invoice_at_period_start", + "fieldtype": "Check", + "label": "Generate Invoice At Beginning Of Period" + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 1, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "", - "fieldname": "sb_4", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Plans", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "allow_on_submit": 1, + "fieldname": "sb_4", + "fieldtype": "Section Break", + "label": "Plans" + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 1, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "plans", - "fieldtype": "Table", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Plans", - "length": 0, - "no_copy": 0, - "options": "Subscription Plan Detail", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "allow_on_submit": 1, + "fieldname": "plans", + "fieldtype": "Table", + "label": "Plans", + "options": "Subscription Plan Detail", + "reqd": 1 + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "sb_1", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Taxes", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "fieldname": "sb_1", + "fieldtype": "Section Break", + "label": "Taxes" + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "tax_template", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Sales Taxes and Charges Template", - "length": 0, - "no_copy": 0, - "options": "Sales Taxes and Charges Template", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "fieldname": "tax_template", + "fieldtype": "Link", + "label": "Sales Taxes and Charges Template", + "options": "Sales Taxes and Charges Template" + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "", - "description": "", - "fieldname": "sb_2", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Discounts", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "fieldname": "sb_2", + "fieldtype": "Section Break", + "label": "Discounts" + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "apply_additional_discount", - "fieldtype": "Select", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Apply Additional Discount On", - "length": 0, - "no_copy": 0, - "options": "\nGrand Total\nNet total", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "fieldname": "apply_additional_discount", + "fieldtype": "Select", + "label": "Apply Additional Discount On", + "options": "\nGrand Total\nNet total" + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "", - "fieldname": "cb_2", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "fieldname": "cb_2", + "fieldtype": "Column Break" + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "", - "fieldname": "additional_discount_percentage", - "fieldtype": "Percent", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Additional DIscount Percentage", - "length": 0, - "no_copy": 0, - "options": "", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "fieldname": "additional_discount_percentage", + "fieldtype": "Percent", + "label": "Additional DIscount Percentage" + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 1, - "columns": 0, - "depends_on": "", - "fieldname": "additional_discount_amount", - "fieldtype": "Currency", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Additional DIscount Amount", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "collapsible": 1, + "fieldname": "additional_discount_amount", + "fieldtype": "Currency", + "label": "Additional DIscount Amount" + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "default": "", - "depends_on": "eval:doc.invoices", - "fieldname": "sb_3", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Invoices", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "depends_on": "eval:doc.invoices", + "fieldname": "sb_3", + "fieldtype": "Section Break", + "label": "Invoices" + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 1, - "columns": 0, - "depends_on": "", - "fieldname": "invoices", - "fieldtype": "Table", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Invoices", - "length": 0, - "no_copy": 0, - "options": "Subscription Invoice", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "collapsible": 1, + "fieldname": "invoices", + "fieldtype": "Table", + "label": "Invoices", + "options": "Subscription Invoice" + }, + { + "collapsible": 1, + "fieldname": "accounting_dimensions_section", + "fieldtype": "Section Break", + "label": "Accounting Dimensions" + }, + { + "fieldname": "dimension_col_break", + "fieldtype": "Column Break" } - ], - "has_web_view": 0, - "hide_heading": 0, - "hide_toolbar": 0, - "idx": 0, - "image_view": 0, - "in_create": 0, - "is_submittable": 0, - "issingle": 0, - "istable": 0, - "max_attachments": 0, - "modified": "2018-10-14 10:38:55.545540", - "modified_by": "Administrator", - "module": "Accounts", - "name": "Subscription", - "name_case": "", - "owner": "Administrator", + ], + "modified": "2019-07-25 18:45:38.579579", + "modified_by": "Administrator", + "module": "Accounts", + "name": "Subscription", + "owner": "Administrator", "permissions": [ { - "amend": 0, - "cancel": 0, - "create": 1, - "delete": 1, - "email": 1, - "export": 1, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "System Manager", - "set_user_permissions": 0, - "share": 1, - "submit": 0, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "System Manager", + "share": 1, "write": 1 - }, + }, { - "amend": 0, - "cancel": 0, - "create": 1, - "delete": 1, - "email": 1, - "export": 1, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "Accounts User", - "set_user_permissions": 0, - "share": 1, - "submit": 0, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "Accounts User", + "share": 1, "write": 1 - }, + }, { - "amend": 0, - "cancel": 0, - "create": 1, - "delete": 1, - "email": 1, - "export": 1, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "Accounts Manager", - "set_user_permissions": 0, - "share": 1, - "submit": 0, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "Accounts Manager", + "share": 1, "write": 1 } - ], - "quick_entry": 0, - "read_only": 0, - "read_only_onload": 0, - "search_fields": "", - "show_name_in_global_search": 0, - "sort_field": "modified", - "sort_order": "DESC", - "title_field": "", - "track_changes": 1, - "track_seen": 0, - "track_views": 0 -} + ], + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1 +} \ No newline at end of file diff --git a/erpnext/accounts/doctype/subscription/subscription.py b/erpnext/accounts/doctype/subscription/subscription.py index 858359eccb..6d01897e8f 100644 --- a/erpnext/accounts/doctype/subscription/subscription.py +++ b/erpnext/accounts/doctype/subscription/subscription.py @@ -9,6 +9,7 @@ from frappe import _ from frappe.model.document import Document from frappe.utils.data import nowdate, getdate, cint, add_days, date_diff, get_last_day, add_to_date, flt from erpnext.accounts.doctype.subscription_plan.subscription_plan import get_plan_rate +from erpnext.accounts.doctype.accounting_dimension.accounting_dimension import get_accounting_dimensions class Subscription(Document): @@ -241,6 +242,15 @@ class Subscription(Document): invoice.posting_date = self.current_invoice_start invoice.customer = self.customer + ## Add dimesnions in invoice for subscription: + accounting_dimensions = get_accounting_dimensions() + + for dimension in accounting_dimensions: + if self.get(dimension): + invoice.update({ + dimension: self.get(dimension) + }) + # Subscription is better suited for service items. I won't update `update_stock` # for that reason items_list = self.get_items_from_plans(self.plans, prorate) @@ -280,6 +290,9 @@ class Subscription(Document): invoice.save() invoice.submit() + for dimension in accounting_dimensions: + invoice.load_from_db() + return invoice def get_items_from_plans(self, plans, prorate=0): diff --git a/erpnext/accounts/doctype/subscription_plan/subscription_plan.json b/erpnext/accounts/doctype/subscription_plan/subscription_plan.json index 453521d04d..9f79066235 100644 --- a/erpnext/accounts/doctype/subscription_plan/subscription_plan.json +++ b/erpnext/accounts/doctype/subscription_plan/subscription_plan.json @@ -1,612 +1,163 @@ { - "allow_copy": 0, - "allow_guest_to_view": 0, - "allow_import": 0, - "allow_rename": 1, - "autoname": "field:plan_name", - "beta": 0, - "creation": "2018-02-24 11:31:23.066506", - "custom": 0, - "docstatus": 0, - "doctype": "DocType", - "document_type": "", - "editable_grid": 1, - "engine": "InnoDB", + "allow_rename": 1, + "autoname": "field:plan_name", + "creation": "2018-02-24 11:31:23.066506", + "doctype": "DocType", + "editable_grid": 1, + "engine": "InnoDB", + "field_order": [ + "plan_name", + "currency", + "column_break_3", + "item", + "section_break_5", + "price_determination", + "column_break_7", + "cost", + "price_list", + "section_break_11", + "billing_interval", + "column_break_13", + "billing_interval_count", + "payment_plan_section", + "payment_plan_id", + "column_break_16", + "payment_gateway", + "accounting_dimensions_section", + "dimension_col_break" + ], "fields": [ { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "plan_name", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Plan Name", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "fieldname": "plan_name", + "fieldtype": "Data", + "in_list_view": 1, + "label": "Plan Name", + "reqd": 1, "unique": 1 - }, + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "currency", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Currency", - "length": 0, - "no_copy": 0, - "options": "Currency", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "fieldname": "currency", + "fieldtype": "Link", + "label": "Currency", + "options": "Currency" + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "column_break_3", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "fieldname": "column_break_3", + "fieldtype": "Column Break" + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "item", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Item", - "length": 0, - "no_copy": 0, - "options": "Item", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "fieldname": "item", + "fieldtype": "Link", + "in_list_view": 1, + "label": "Item", + "options": "Item", + "reqd": 1 + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "section_break_5", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "fieldname": "section_break_5", + "fieldtype": "Section Break" + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "default": "", - "fieldname": "price_determination", - "fieldtype": "Select", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Price Determination", - "length": 0, - "no_copy": 0, - "options": "\nFixed rate\nBased on price list", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "fieldname": "price_determination", + "fieldtype": "Select", + "label": "Price Determination", + "options": "\nFixed rate\nBased on price list", + "reqd": 1 + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "column_break_7", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "fieldname": "column_break_7", + "fieldtype": "Column Break" + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "eval:doc.price_determination==\"Fixed rate\"", - "fieldname": "cost", - "fieldtype": "Currency", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Cost", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "depends_on": "eval:doc.price_determination==\"Fixed rate\"", + "fieldname": "cost", + "fieldtype": "Currency", + "in_list_view": 1, + "label": "Cost" + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "eval:doc.price_determination==\"Based on price list\"", - "fieldname": "price_list", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Price List", - "length": 0, - "no_copy": 0, - "options": "Price List", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "depends_on": "eval:doc.price_determination==\"Based on price list\"", + "fieldname": "price_list", + "fieldtype": "Link", + "label": "Price List", + "options": "Price List" + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "section_break_11", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "fieldname": "section_break_11", + "fieldtype": "Section Break" + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "default": "Day", - "fieldname": "billing_interval", - "fieldtype": "Select", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Billing Interval", - "length": 0, - "no_copy": 0, - "options": "Day\nWeek\nMonth\nYear", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "default": "Day", + "fieldname": "billing_interval", + "fieldtype": "Select", + "in_list_view": 1, + "label": "Billing Interval", + "options": "Day\nWeek\nMonth\nYear", + "reqd": 1 + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "column_break_13", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "fieldname": "column_break_13", + "fieldtype": "Column Break" + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "default": "1", - "description": "Number of intervals for the interval field e.g if Interval is 'Days' and Billing Interval Count is 3, invoices will be generated every 3 days", - "fieldname": "billing_interval_count", - "fieldtype": "Int", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Billing Interval Count", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "default": "1", + "description": "Number of intervals for the interval field e.g if Interval is 'Days' and Billing Interval Count is 3, invoices will be generated every 3 days", + "fieldname": "billing_interval_count", + "fieldtype": "Int", + "label": "Billing Interval Count", + "reqd": 1 + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "payment_plan_section", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Payment Plan", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "fieldname": "payment_plan_section", + "fieldtype": "Section Break", + "label": "Payment Plan" + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "payment_plan_id", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Payment Plan", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "fieldname": "payment_plan_id", + "fieldtype": "Data", + "label": "Payment Plan" + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "column_break_16", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "fieldname": "column_break_16", + "fieldtype": "Column Break" + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "payment_gateway", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Payment Gateway", - "length": 0, - "no_copy": 0, - "options": "Payment Gateway Account", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "fieldname": "payment_gateway", + "fieldtype": "Link", + "label": "Payment Gateway", + "options": "Payment Gateway Account" + }, + { + "collapsible": 1, + "fieldname": "accounting_dimensions_section", + "fieldtype": "Section Break", + "label": "Accounting Dimensions" + }, + { + "fieldname": "dimension_col_break", + "fieldtype": "Column Break" } - ], - "has_web_view": 0, - "hide_heading": 0, - "hide_toolbar": 0, - "idx": 0, - "image_view": 0, - "in_create": 0, - "is_submittable": 0, - "issingle": 0, - "istable": 0, - "max_attachments": 0, - "modified": "2018-06-20 16:59:54.082358", - "modified_by": "Administrator", - "module": "Accounts", - "name": "Subscription Plan", - "name_case": "", - "owner": "Administrator", + ], + "modified": "2019-07-25 18:35:04.362556", + "modified_by": "Administrator", + "module": "Accounts", + "name": "Subscription Plan", + "owner": "Administrator", "permissions": [ { - "amend": 0, - "cancel": 0, - "create": 1, - "delete": 1, - "email": 1, - "export": 1, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "System Manager", - "set_user_permissions": 0, - "share": 1, - "submit": 0, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "System Manager", + "share": 1, "write": 1 } - ], - "quick_entry": 0, - "read_only": 0, - "read_only_onload": 0, - "show_name_in_global_search": 0, - "sort_field": "modified", - "sort_order": "DESC", - "track_changes": 1, - "track_seen": 0 + ], + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1 } \ No newline at end of file diff --git a/erpnext/patches.txt b/erpnext/patches.txt index 398c6020a0..33d4f55ae0 100644 --- a/erpnext/patches.txt +++ b/erpnext/patches.txt @@ -624,4 +624,5 @@ erpnext.patches.v11_1.update_default_supplier_in_item_defaults erpnext.patches.v12_0.update_due_date_in_gle erpnext.patches.v12_0.add_default_buying_selling_terms_in_company erpnext.patches.v12_0.update_ewaybill_field_position +erpnext.patches.v12_0.create_accounting_dimensions_in_missing_doctypes erpnext.patches.v11_1.set_status_for_material_request_type_manufacture diff --git a/erpnext/patches/v12_0/create_accounting_dimensions_in_missing_doctypes.py b/erpnext/patches/v12_0/create_accounting_dimensions_in_missing_doctypes.py new file mode 100644 index 0000000000..1796c53c14 --- /dev/null +++ b/erpnext/patches/v12_0/create_accounting_dimensions_in_missing_doctypes.py @@ -0,0 +1,38 @@ +from __future__ import unicode_literals +import frappe +from frappe.custom.doctype.custom_field.custom_field import create_custom_field + +def execute(): + accounting_dimensions = frappe.db.sql("""select fieldname, label, document_type, disabled from + `tabAccounting Dimension`""", as_dict=1) + + if not accounting_dimensions: + return + + count = 1 + for d in accounting_dimensions: + + if count%2 == 0: + insert_after_field = 'dimension_col_break' + else: + insert_after_field = 'accounting_dimensions_section' + + for doctype in ["Subscription Plan", "Subscription", "Opening Invoice Creation Tool", "Opening Invoice Creation Tool Item"]: + + field = frappe.db.get_value("Custom Field", {"dt": doctype, "fieldname": d.fieldname}) + + if field: + continue + + df = { + "fieldname": d.fieldname, + "label": d.label, + "fieldtype": "Link", + "options": d.document_type, + "insert_after": insert_after_field + } + + create_custom_field(doctype, df) + frappe.clear_cache(doctype=doctype) + + count += 1 \ No newline at end of file diff --git a/erpnext/public/js/utils/dimension_tree_filter.js b/erpnext/public/js/utils/dimension_tree_filter.js index 9d4c435240..10855ea3e6 100644 --- a/erpnext/public/js/utils/dimension_tree_filter.js +++ b/erpnext/public/js/utils/dimension_tree_filter.js @@ -5,7 +5,7 @@ erpnext.doctypes_with_dimensions = ["GL Entry", "Sales Invoice", "Purchase Invoi "Purchase Order Item", "Journal Entry Account", "Material Request Item", "Delivery Note Item", "Purchase Receipt Item", "Stock Entry Detail", "Payment Entry Deduction", "Sales Taxes and Charges", "Purchase Taxes and Charges", "Shipping Rule", "Landed Cost Item", "Asset Value Adjustment", "Loyalty Program", "Fee Schedule", "Fee Structure", "Stock Reconciliation", - "Travel Request", "Fees", "POS Profile"]; + "Travel Request", "Fees", "POS Profile", "Opening Invoice Creation Tool", "Opening Invoice Creation Tool Item"]; frappe.call({ method: "erpnext.accounts.doctype.accounting_dimension.accounting_dimension.get_dimension_filters", @@ -25,6 +25,9 @@ erpnext.doctypes_with_dimensions.forEach((doctype) => { "is_group": 0 }); } + if (frm.is_new() && frappe.meta.has_field(doctype, 'company') && frm.doc.company) { + frm.set_value(dimension['fieldname'], erpnext.default_dimensions[frm.doc.company][dimension['document_type']]); + } }); }); }, From 724be6eca27f167f872f19d777934d84503fb2ee Mon Sep 17 00:00:00 2001 From: deepeshgarg007 Date: Sat, 27 Jul 2019 19:06:36 +0530 Subject: [PATCH 12/17] fix: GL entry validation fix --- .../doctype/accounting_dimension/accounting_dimension.py | 5 +++-- .../accounting_dimension/test_accounting_dimension.py | 1 - erpnext/accounts/doctype/gl_entry/gl_entry.py | 8 ++++---- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.py b/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.py index 61f699f6ab..1f418de47b 100644 --- a/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.py +++ b/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.py @@ -164,8 +164,9 @@ def get_accounting_dimensions(as_list=True): return accounting_dimensions def get_checks_for_pl_and_bs_accounts(): - dimensions = frappe.db.sql("""SELECT parent, company, mandatory_for_pl, mandatory_for_bs - FROM `tabAccounting Dimension Detail`""", as_dict=1) + dimensions = frappe.db.sql("""SELECT p.label, p.disabled, p.fieldname, c.company, c.mandatory_for_pl, c.mandatory_for_bs + FROM `tabAccounting Dimension`p ,`tabAccounting Dimension Detail` c + WHERE p.name = c.parent""", as_dict=1) return dimensions diff --git a/erpnext/accounts/doctype/accounting_dimension/test_accounting_dimension.py b/erpnext/accounts/doctype/accounting_dimension/test_accounting_dimension.py index c75ba825a4..104880f6f3 100644 --- a/erpnext/accounts/doctype/accounting_dimension/test_accounting_dimension.py +++ b/erpnext/accounts/doctype/accounting_dimension/test_accounting_dimension.py @@ -108,7 +108,6 @@ def disable_dimension(): dimension1.save() dimension2 = frappe.get_doc("Accounting Dimension", "Location") - dimension2.mandatory_for_pl = 0 dimension2.disabled = 1 dimension2.save() diff --git a/erpnext/accounts/doctype/gl_entry/gl_entry.py b/erpnext/accounts/doctype/gl_entry/gl_entry.py index 80e518644d..4944c8f76f 100644 --- a/erpnext/accounts/doctype/gl_entry/gl_entry.py +++ b/erpnext/accounts/doctype/gl_entry/gl_entry.py @@ -90,15 +90,15 @@ class GLEntry(Document): if account_type == "Profit and Loss" \ and self.company == dimension.company and dimension.mandatory_for_pl and not dimension.disabled: - if not self.get(frappe.scrub(dimension.parent)): + if not self.get(frappe.scrub(dimension.fieldname)): frappe.throw(_("Accounting Dimension {0} is required for 'Profit and Loss' account {1}.") - .format(dimension.parent, self.account)) + .format(dimension.label, self.account)) if account_type == "Balance Sheet" \ and self.company == dimension.company and dimension.mandatory_for_bs and not dimension.disabled: - if not self.get(frappe.scrub(dimension.parent)): + if not self.get(frappe.scrub(dimension.fieldname)): frappe.throw(_("Accounting Dimension {0} is required for 'Balance Sheet' account {1}.") - .format(dimension.parent, self.account)) + .format(dimension.label, self.account)) def check_pl_account(self): From d9f3ba5fdacbac81391b4051152bace359523d83 Mon Sep 17 00:00:00 2001 From: deepeshgarg007 Date: Sun, 28 Jul 2019 10:30:32 +0530 Subject: [PATCH 13/17] fix: Reload doc in patch --- .../v12_0/create_accounting_dimensions_in_missing_doctypes.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/erpnext/patches/v12_0/create_accounting_dimensions_in_missing_doctypes.py b/erpnext/patches/v12_0/create_accounting_dimensions_in_missing_doctypes.py index 1796c53c14..b71ea66594 100644 --- a/erpnext/patches/v12_0/create_accounting_dimensions_in_missing_doctypes.py +++ b/erpnext/patches/v12_0/create_accounting_dimensions_in_missing_doctypes.py @@ -3,6 +3,9 @@ import frappe from frappe.custom.doctype.custom_field.custom_field import create_custom_field def execute(): + + frappe.reload_doc('accounts', 'doctype', 'accounting_dimension') + accounting_dimensions = frappe.db.sql("""select fieldname, label, document_type, disabled from `tabAccounting Dimension`""", as_dict=1) From f37fb82069b7bb244b62acd2da55f0bf605c2212 Mon Sep 17 00:00:00 2001 From: deepeshgarg007 Date: Mon, 29 Jul 2019 08:58:56 +0530 Subject: [PATCH 14/17] fix: Code cleanup --- erpnext/accounts/doctype/gl_entry/gl_entry.py | 4 ++-- erpnext/accounts/doctype/subscription/subscription.py | 3 --- erpnext/public/js/utils/dimension_tree_filter.js | 3 ++- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/erpnext/accounts/doctype/gl_entry/gl_entry.py b/erpnext/accounts/doctype/gl_entry/gl_entry.py index 4944c8f76f..078e05816d 100644 --- a/erpnext/accounts/doctype/gl_entry/gl_entry.py +++ b/erpnext/accounts/doctype/gl_entry/gl_entry.py @@ -90,13 +90,13 @@ class GLEntry(Document): if account_type == "Profit and Loss" \ and self.company == dimension.company and dimension.mandatory_for_pl and not dimension.disabled: - if not self.get(frappe.scrub(dimension.fieldname)): + if not self.get(dimension.fieldname): frappe.throw(_("Accounting Dimension {0} is required for 'Profit and Loss' account {1}.") .format(dimension.label, self.account)) if account_type == "Balance Sheet" \ and self.company == dimension.company and dimension.mandatory_for_bs and not dimension.disabled: - if not self.get(frappe.scrub(dimension.fieldname)): + if not self.get(dimension.fieldname): frappe.throw(_("Accounting Dimension {0} is required for 'Balance Sheet' account {1}.") .format(dimension.label, self.account)) diff --git a/erpnext/accounts/doctype/subscription/subscription.py b/erpnext/accounts/doctype/subscription/subscription.py index 6d01897e8f..f13ca4c49e 100644 --- a/erpnext/accounts/doctype/subscription/subscription.py +++ b/erpnext/accounts/doctype/subscription/subscription.py @@ -290,9 +290,6 @@ class Subscription(Document): invoice.save() invoice.submit() - for dimension in accounting_dimensions: - invoice.load_from_db() - return invoice def get_items_from_plans(self, plans, prorate=0): diff --git a/erpnext/public/js/utils/dimension_tree_filter.js b/erpnext/public/js/utils/dimension_tree_filter.js index 10855ea3e6..f1c92091a8 100644 --- a/erpnext/public/js/utils/dimension_tree_filter.js +++ b/erpnext/public/js/utils/dimension_tree_filter.js @@ -5,7 +5,8 @@ erpnext.doctypes_with_dimensions = ["GL Entry", "Sales Invoice", "Purchase Invoi "Purchase Order Item", "Journal Entry Account", "Material Request Item", "Delivery Note Item", "Purchase Receipt Item", "Stock Entry Detail", "Payment Entry Deduction", "Sales Taxes and Charges", "Purchase Taxes and Charges", "Shipping Rule", "Landed Cost Item", "Asset Value Adjustment", "Loyalty Program", "Fee Schedule", "Fee Structure", "Stock Reconciliation", - "Travel Request", "Fees", "POS Profile", "Opening Invoice Creation Tool", "Opening Invoice Creation Tool Item"]; + "Travel Request", "Fees", "POS Profile", "Opening Invoice Creation Tool", "Opening Invoice Creation Tool Item", "Subscription", + "Subscription Plan"]; frappe.call({ method: "erpnext.accounts.doctype.accounting_dimension.accounting_dimension.get_dimension_filters", From 107c07e5cbb63aabf5f715f3fe00cd3e8e7721d5 Mon Sep 17 00:00:00 2001 From: deepeshgarg007 Date: Mon, 29 Jul 2019 14:57:33 +0530 Subject: [PATCH 15/17] fix: Opening balance not getting calculated in trail_balance_report --- erpnext/accounts/report/trial_balance/trial_balance.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/erpnext/accounts/report/trial_balance/trial_balance.py b/erpnext/accounts/report/trial_balance/trial_balance.py index b6ddaa8e85..10e977acbf 100644 --- a/erpnext/accounts/report/trial_balance/trial_balance.py +++ b/erpnext/accounts/report/trial_balance/trial_balance.py @@ -123,11 +123,12 @@ def get_rootwise_opening_balances(filters, report_type): if accounting_dimensions: for dimension in accounting_dimensions: - additional_conditions += """ and {0} in (%({0})s) """.format(dimension) + if filters.get(dimension): + additional_conditions += """ and {0} in (%({0})s) """.format(dimension) - query_filters.update({ - dimension: filters.get(dimension) - }) + query_filters.update({ + dimension: filters.get(dimension) + }) gle = frappe.db.sql(""" select From 40e35048b87234eb82409da09f164db30ec9bbd2 Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Mon, 29 Jul 2019 17:14:39 +0530 Subject: [PATCH 16/17] fix: can't compare datetime.date to unicode --- erpnext/selling/doctype/quotation/quotation.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/selling/doctype/quotation/quotation.py b/erpnext/selling/doctype/quotation/quotation.py index cc73e76bf3..46009f45e4 100644 --- a/erpnext/selling/doctype/quotation/quotation.py +++ b/erpnext/selling/doctype/quotation/quotation.py @@ -34,7 +34,7 @@ class Quotation(SellingController): self.with_items = 1 def validate_valid_till(self): - if self.valid_till and self.valid_till < self.transaction_date: + if self.valid_till and getdate(self.valid_till) < getdate(self.transaction_date): frappe.throw(_("Valid till date cannot be before transaction date")) def has_sales_order(self): From 403968b2f7f458e6ce7934f93b1b3bfbeaf6fe4a Mon Sep 17 00:00:00 2001 From: Sahil Khan Date: Tue, 30 Jul 2019 13:29:07 +0550 Subject: [PATCH 17/17] bumped to version 12.0.3 --- erpnext/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/__init__.py b/erpnext/__init__.py index 04f741e14b..5e2669368b 100644 --- a/erpnext/__init__.py +++ b/erpnext/__init__.py @@ -5,7 +5,7 @@ import frappe from erpnext.hooks import regional_overrides from frappe.utils import getdate -__version__ = '12.0.2' +__version__ = '12.0.3' def get_default_company(user=None): '''Get default company for user'''