fix: company wise deferred accounting fields in item (#37023)

* fix: move deferred accounts in accounting section

* fix: move deferred check boxes in item accounting

* fix: show company wise acc in filters

* fix: fetch item deferred account from child table

* fix: tests using deferred acc

* refactor: use cached value

* fix: cached value call

* feat: patch to migrate deferred acc

* fix: hardcode education module doctypes in patch

* chore: resolve conflicts

---------

Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
This commit is contained in:
Gursheen Kaur Anand 2023-09-16 21:25:31 +05:30 committed by GitHub
parent 34bb64e41a
commit 099468e3cf
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 117 additions and 56 deletions

View File

@ -1164,7 +1164,7 @@ class TestPurchaseInvoice(unittest.TestCase, StockTestMixin):
item = create_item("_Test Item for Deferred Accounting", is_purchase_item=True)
item.enable_deferred_expense = 1
item.deferred_expense_account = deferred_account
item.item_defaults[0].deferred_expense_account = deferred_account
item.save()
pi = make_purchase_invoice(item=item.name, qty=1, rate=100, do_not_save=True)

View File

@ -2322,7 +2322,7 @@ class TestSalesInvoice(unittest.TestCase):
item = create_item("_Test Item for Deferred Accounting")
item.enable_deferred_revenue = 1
item.deferred_revenue_account = deferred_account
item.item_defaults[0].deferred_revenue_account = deferred_account
item.no_of_months = 12
item.save()
@ -3102,7 +3102,7 @@ class TestSalesInvoice(unittest.TestCase):
item = create_item("_Test Item for Deferred Accounting")
item.enable_deferred_expense = 1
item.deferred_revenue_account = deferred_account
item.item_defaults[0].deferred_revenue_account = deferred_account
item.save()
si = create_sales_invoice(

View File

@ -81,7 +81,7 @@ class TestDeferredRevenueAndExpense(FrappeTestCase, AccountsTestMixin):
self.create_item("_Test Internet Subscription", 0, self.warehouse, self.company)
item = frappe.get_doc("Item", self.item)
item.enable_deferred_revenue = 1
item.deferred_revenue_account = self.deferred_revenue_account
item.item_defaults[0].deferred_revenue_account = self.deferred_revenue_account
item.no_of_months = 3
item.save()
@ -150,7 +150,7 @@ class TestDeferredRevenueAndExpense(FrappeTestCase, AccountsTestMixin):
self.create_item("_Test Office Desk", 0, self.warehouse, self.company)
item = frappe.get_doc("Item", self.item)
item.enable_deferred_expense = 1
item.deferred_expense_account = self.deferred_expense_account
item.item_defaults[0].deferred_expense_account = self.deferred_expense_account
item.no_of_months_exp = 3
item.save()

View File

@ -341,5 +341,6 @@ erpnext.patches.v14_0.single_to_multi_dunning
execute:frappe.db.set_single_value('Selling Settings', 'allow_negative_rates_for_items', 0)
erpnext.patches.v15_0.correct_asset_value_if_je_with_workflow
erpnext.patches.v15_0.delete_woocommerce_settings_doctype
erpnext.patches.v14_0.migrate_deferred_accounts_to_item_defaults
# below migration patch should always run last
erpnext.patches.v14_0.migrate_gl_to_payment_ledger

View File

@ -47,13 +47,16 @@ def execute():
for doctype in doctypes:
frappe.delete_doc("DocType", doctype, ignore_missing=True)
portal_settings = frappe.get_doc("Portal Settings")
for row in portal_settings.get("menu"):
if row.reference_doctype in doctypes:
row.delete()
portal_settings.save()
titles = [
"Fees",
"Student Admission",
"Grant Application",
"Chapter",
"Certification Application",
]
items = frappe.get_all("Portal Menu Item", filters=[["title", "in", titles]], pluck="name")
for item in items:
frappe.delete_doc("Portal Menu Item", item, ignore_missing=True, force=True)
frappe.delete_doc("Module Def", "Education", ignore_missing=True, force=True)

View File

@ -41,7 +41,7 @@ def execute():
for card in cards:
frappe.delete_doc("Number Card", card, ignore_missing=True, force=True)
titles = ["Lab Test", "Prescription", "Patient Appointment"]
titles = ["Lab Test", "Prescription", "Patient Appointment", "Patient"]
items = frappe.get_all("Portal Menu Item", filters=[["title", "in", titles]], pluck="name")
for item in items:
frappe.delete_doc("Portal Menu Item", item, ignore_missing=True, force=True)

View File

@ -0,0 +1,39 @@
import frappe
def execute():
try:
item_dict = get_deferred_accounts()
add_to_item_defaults(item_dict)
except Exception:
frappe.db.rollback()
frappe.log_error("Failed to migrate deferred accounts in Item Defaults.")
def get_deferred_accounts():
item = frappe.qb.DocType("Item")
return (
frappe.qb.from_(item)
.select(item.name, item.deferred_expense_account, item.deferred_revenue_account)
.where((item.enable_deferred_expense == 1) | (item.enable_deferred_revenue == 1))
.run(as_dict=True)
)
def add_to_item_defaults(item_dict):
for item in item_dict:
add_company_wise_item_default(item, "deferred_expense_account")
add_company_wise_item_default(item, "deferred_revenue_account")
def add_company_wise_item_default(item, account_type):
company = frappe.get_cached_value("Account", item[account_type], "company")
if company and item[account_type]:
item_defaults = frappe.get_cached_value("Item", item["name"], "item_defaults")
for item_row in item_defaults:
if item_row.company == company:
frappe.set_value("Item Default", item_row.name, account_type, item[account_type])
break
else:
item_defaults.append({"company": company, account_type: item[account_type]})
frappe.set_value("Item", item["name"], "item_defaults", item_defaults)

View File

@ -350,18 +350,20 @@ $.extend(erpnext.item, {
}
}
frm.fields_dict['deferred_revenue_account'].get_query = function() {
frm.fields_dict["item_defaults"].grid.get_field("deferred_revenue_account").get_query = function(doc, cdt, cdn) {
return {
filters: {
"company": locals[cdt][cdn].company,
'root_type': 'Liability',
"is_group": 0
}
}
}
frm.fields_dict['deferred_expense_account'].get_query = function() {
frm.fields_dict["item_defaults"].grid.get_field("deferred_expense_account").get_query = function(doc, cdt, cdn) {
return {
filters: {
"company": locals[cdt][cdn].company,
'root_type': 'Asset',
"is_group": 0
}

View File

@ -69,6 +69,13 @@
"variant_based_on",
"attributes",
"accounting",
"deferred_accounting_section",
"enable_deferred_expense",
"no_of_months_exp",
"column_break_9s9o",
"enable_deferred_revenue",
"no_of_months",
"section_break_avcp",
"item_defaults",
"purchasing_tab",
"purchase_uom",
@ -84,10 +91,6 @@
"delivered_by_supplier",
"column_break2",
"supplier_items",
"deferred_expense_section",
"enable_deferred_expense",
"deferred_expense_account",
"no_of_months_exp",
"foreign_trade_details",
"country_of_origin",
"column_break_59",
@ -98,10 +101,6 @@
"is_sales_item",
"column_break3",
"max_discount",
"deferred_revenue",
"enable_deferred_revenue",
"deferred_revenue_account",
"no_of_months",
"customer_details",
"customer_items",
"item_tax_section_break",
@ -657,20 +656,6 @@
"oldfieldname": "max_discount",
"oldfieldtype": "Currency"
},
{
"collapsible": 1,
"fieldname": "deferred_revenue",
"fieldtype": "Section Break",
"label": "Deferred Revenue"
},
{
"depends_on": "enable_deferred_revenue",
"fieldname": "deferred_revenue_account",
"fieldtype": "Link",
"ignore_user_permissions": 1,
"label": "Deferred Revenue Account",
"options": "Account"
},
{
"default": "0",
"fieldname": "enable_deferred_revenue",
@ -681,21 +666,7 @@
"depends_on": "enable_deferred_revenue",
"fieldname": "no_of_months",
"fieldtype": "Int",
"label": "No of Months"
},
{
"collapsible": 1,
"fieldname": "deferred_expense_section",
"fieldtype": "Section Break",
"label": "Deferred Expense"
},
{
"depends_on": "enable_deferred_expense",
"fieldname": "deferred_expense_account",
"fieldtype": "Link",
"ignore_user_permissions": 1,
"label": "Deferred Expense Account",
"options": "Account"
"label": "No of Months (Revenue)"
},
{
"default": "0",
@ -904,6 +875,20 @@
"fieldname": "accounting",
"fieldtype": "Tab Break",
"label": "Accounting"
},
{
"fieldname": "column_break_9s9o",
"fieldtype": "Column Break"
},
{
"fieldname": "section_break_avcp",
"fieldtype": "Section Break"
},
{
"collapsible": 1,
"fieldname": "deferred_accounting_section",
"fieldtype": "Section Break",
"label": "Deferred Accounting"
}
],
"icon": "fa fa-tag",
@ -912,7 +897,7 @@
"index_web_pages_for_search": 1,
"links": [],
"make_attachments_public": 1,
"modified": "2023-08-28 22:16:40.305094",
"modified": "2023-09-11 13:46:32.688051",
"modified_by": "Administrator",
"module": "Stock",
"name": "Item",

View File

@ -19,7 +19,11 @@
"selling_defaults",
"selling_cost_center",
"column_break_12",
"income_account"
"income_account",
"deferred_accounting_defaults_section",
"deferred_expense_account",
"column_break_kwad",
"deferred_revenue_account"
],
"fields": [
{
@ -108,11 +112,34 @@
"fieldtype": "Link",
"label": "Default Provisional Account",
"options": "Account"
},
{
"fieldname": "deferred_accounting_defaults_section",
"fieldtype": "Section Break",
"label": "Deferred Accounting Defaults"
},
{
"depends_on": "eval: parent.enable_deferred_expense",
"fieldname": "deferred_expense_account",
"fieldtype": "Link",
"label": "Deferred Expense Account",
"options": "Account"
},
{
"depends_on": "eval: parent.enable_deferred_revenue",
"fieldname": "deferred_revenue_account",
"fieldtype": "Link",
"label": "Deferred Revenue Account",
"options": "Account"
},
{
"fieldname": "column_break_kwad",
"fieldtype": "Column Break"
}
],
"istable": 1,
"links": [],
"modified": "2022-04-10 20:18:54.148195",
"modified": "2023-09-04 12:33:14.607267",
"modified_by": "Administrator",
"module": "Stock",
"name": "Item Default",

View File

@ -696,7 +696,11 @@ def get_default_discount_account(args, item):
def get_default_deferred_account(args, item, fieldname=None):
if item.get("enable_deferred_revenue") or item.get("enable_deferred_expense"):
return (
item.get(fieldname)
frappe.get_cached_value(
"Item Default",
{"parent": args.item_code, "company": args.get("company")},
fieldname,
)
or args.get(fieldname)
or frappe.get_cached_value("Company", args.company, "default_" + fieldname)
)