From 72255fae8047c9eb321224ae33bf54458fb7b0d1 Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Sat, 6 May 2023 10:40:41 +0530 Subject: [PATCH 1/2] fix: child acc will inherit acc currency if explicitly specified (cherry picked from commit abe691c03d833e9d2ed230daf2640da040b1be1e) --- erpnext/accounts/doctype/account/account.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/erpnext/accounts/doctype/account/account.py b/erpnext/accounts/doctype/account/account.py index 6635d3e733b..bbe4c54a71a 100644 --- a/erpnext/accounts/doctype/account/account.py +++ b/erpnext/accounts/doctype/account/account.py @@ -201,8 +201,11 @@ class Account(NestedSet): ) def validate_account_currency(self): + self.currency_explicitly_specified = True + if not self.account_currency: self.account_currency = frappe.get_cached_value("Company", self.company, "default_currency") + self.currency_explicitly_specified = False gl_currency = frappe.db.get_value("GL Entry", {"account": self.name}, "account_currency") @@ -248,8 +251,10 @@ class Account(NestedSet): { "company": company, # parent account's currency should be passed down to child account's curreny - # if it is None, it picks it up from default company currency, which might be unintended - "account_currency": erpnext.get_company_currency(company), + # if currency explicitly specified by user, child will inherit. else, default currency will be used. + "account_currency": self.account_currency + if self.currency_explicitly_specified + else erpnext.get_company_currency(company), "parent_account": parent_acc_name_map[company], } ) From e451916803682b2a1db8061b53a585395d076af6 Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Mon, 8 May 2023 13:30:39 +0530 Subject: [PATCH 2/2] test: currency inheritance on child accounts (cherry picked from commit f6ea8fd8d7a98d19bc6ec0d43ae06ffe31d1e3ff) --- .../accounts/doctype/account/test_account.py | 55 +++++++++++++++++++ .../setup/doctype/company/test_records.json | 25 +++++++++ 2 files changed, 80 insertions(+) diff --git a/erpnext/accounts/doctype/account/test_account.py b/erpnext/accounts/doctype/account/test_account.py index 3a360c48c43..62303bd723f 100644 --- a/erpnext/accounts/doctype/account/test_account.py +++ b/erpnext/accounts/doctype/account/test_account.py @@ -5,10 +5,13 @@ import unittest import frappe +from frappe.test_runner import make_test_records from erpnext.accounts.doctype.account.account import merge_account, update_account_number from erpnext.stock import get_company_default_inventory_account, get_warehouse_account +test_dependencies = ["Company"] + class TestAccount(unittest.TestCase): def test_rename_account(self): @@ -188,6 +191,58 @@ class TestAccount(unittest.TestCase): frappe.delete_doc("Account", "1234 - Test Rename Sync Account - _TC4") frappe.delete_doc("Account", "1234 - Test Rename Sync Account - _TC5") + def test_account_currency_sync(self): + """ + In a parent->child company setup, child should inherit parent account currency if explicitly specified. + """ + + make_test_records("Company") + + frappe.local.flags.pop("ignore_root_company_validation", None) + + def create_bank_account(): + acc = frappe.new_doc("Account") + acc.account_name = "_Test Bank JPY" + + acc.parent_account = "Temporary Accounts - _TC6" + acc.company = "_Test Company 6" + return acc + + acc = create_bank_account() + # Explicitly set currency + acc.account_currency = "JPY" + acc.insert() + self.assertTrue( + frappe.db.exists( + { + "doctype": "Account", + "account_name": "_Test Bank JPY", + "account_currency": "JPY", + "company": "_Test Company 7", + } + ) + ) + + frappe.delete_doc("Account", "_Test Bank JPY - _TC6") + frappe.delete_doc("Account", "_Test Bank JPY - _TC7") + + acc = create_bank_account() + # default currency is used + acc.insert() + self.assertTrue( + frappe.db.exists( + { + "doctype": "Account", + "account_name": "_Test Bank JPY", + "account_currency": "USD", + "company": "_Test Company 7", + } + ) + ) + + frappe.delete_doc("Account", "_Test Bank JPY - _TC6") + frappe.delete_doc("Account", "_Test Bank JPY - _TC7") + def test_child_company_account_rename_sync(self): frappe.local.flags.pop("ignore_root_company_validation", None) diff --git a/erpnext/setup/doctype/company/test_records.json b/erpnext/setup/doctype/company/test_records.json index 19b6ef27ac3..e21bd2a3ce8 100644 --- a/erpnext/setup/doctype/company/test_records.json +++ b/erpnext/setup/doctype/company/test_records.json @@ -80,5 +80,30 @@ "chart_of_accounts": "Standard", "enable_perpetual_inventory": 1, "default_holiday_list": "_Test Holiday List" + }, + { + "abbr": "_TC6", + "company_name": "_Test Company 6", + "is_group": 1, + "country": "India", + "default_currency": "INR", + "doctype": "Company", + "domain": "Manufacturing", + "chart_of_accounts": "Standard", + "default_holiday_list": "_Test Holiday List", + "enable_perpetual_inventory": 0 + }, + { + "abbr": "_TC7", + "company_name": "_Test Company 7", + "parent_company": "_Test Company 6", + "is_group": 1, + "country": "United States", + "default_currency": "USD", + "doctype": "Company", + "domain": "Manufacturing", + "chart_of_accounts": "Standard", + "default_holiday_list": "_Test Holiday List", + "enable_perpetual_inventory": 0 } ]