fix: Account currency validation
diff --git a/erpnext/accounts/doctype/account/account.py b/erpnext/accounts/doctype/account/account.py
index 150f68b..c71ea36 100644
--- a/erpnext/accounts/doctype/account/account.py
+++ b/erpnext/accounts/doctype/account/account.py
@@ -204,7 +204,9 @@
if not self.account_currency:
self.account_currency = frappe.get_cached_value("Company", self.company, "default_currency")
- elif self.account_currency != frappe.db.get_value("Account", self.name, "account_currency"):
+ gl_currency = frappe.db.get_value("GL Entry", {"account": self.name}, "account_currency")
+
+ if gl_currency and self.account_currency != gl_currency:
if frappe.db.get_value("GL Entry", {"account": self.name}):
frappe.throw(_("Currency can not be changed after making entries using some other currency"))
diff --git a/erpnext/accounts/doctype/account/test_account.py b/erpnext/accounts/doctype/account/test_account.py
index efc063d..a6d4488 100644
--- a/erpnext/accounts/doctype/account/test_account.py
+++ b/erpnext/accounts/doctype/account/test_account.py
@@ -241,71 +241,27 @@
for doc in to_delete:
frappe.delete_doc("Account", doc)
+ def test_validate_account_currency(self):
+ from erpnext.accounts.doctype.journal_entry.test_journal_entry import make_journal_entry
-def _make_test_records(verbose=None):
- from frappe.test_runner import make_test_objects
+ if not frappe.db.get_value("Account", "Test Currency Account - _TC"):
+ acc = frappe.new_doc("Account")
+ acc.account_name = "Test Currency Account"
+ acc.parent_account = "Tax Assets - _TC"
+ acc.company = "_Test Company"
+ acc.insert()
+ else:
+ acc = frappe.get_doc("Account", "Test Currency Account - _TC")
- accounts = [
- # [account_name, parent_account, is_group]
- ["_Test Bank", "Bank Accounts", 0, "Bank", None],
- ["_Test Bank USD", "Bank Accounts", 0, "Bank", "USD"],
- ["_Test Bank EUR", "Bank Accounts", 0, "Bank", "EUR"],
- ["_Test Cash", "Cash In Hand", 0, "Cash", None],
- ["_Test Account Stock Expenses", "Direct Expenses", 1, None, None],
- ["_Test Account Shipping Charges", "_Test Account Stock Expenses", 0, "Chargeable", None],
- ["_Test Account Customs Duty", "_Test Account Stock Expenses", 0, "Tax", None],
- ["_Test Account Insurance Charges", "_Test Account Stock Expenses", 0, "Chargeable", None],
- ["_Test Account Stock Adjustment", "_Test Account Stock Expenses", 0, "Stock Adjustment", None],
- ["_Test Employee Advance", "Current Liabilities", 0, None, None],
- ["_Test Account Tax Assets", "Current Assets", 1, None, None],
- ["_Test Account VAT", "_Test Account Tax Assets", 0, "Tax", None],
- ["_Test Account Service Tax", "_Test Account Tax Assets", 0, "Tax", None],
- ["_Test Account Reserves and Surplus", "Current Liabilities", 0, None, None],
- ["_Test Account Cost for Goods Sold", "Expenses", 0, None, None],
- ["_Test Account Excise Duty", "_Test Account Tax Assets", 0, "Tax", None],
- ["_Test Account Education Cess", "_Test Account Tax Assets", 0, "Tax", None],
- ["_Test Account S&H Education Cess", "_Test Account Tax Assets", 0, "Tax", None],
- ["_Test Account CST", "Direct Expenses", 0, "Tax", None],
- ["_Test Account Discount", "Direct Expenses", 0, None, None],
- ["_Test Write Off", "Indirect Expenses", 0, None, None],
- ["_Test Exchange Gain/Loss", "Indirect Expenses", 0, None, None],
- ["_Test Account Sales", "Direct Income", 0, None, None],
- # related to Account Inventory Integration
- ["_Test Account Stock In Hand", "Current Assets", 0, None, None],
- # fixed asset depreciation
- ["_Test Fixed Asset", "Current Assets", 0, "Fixed Asset", None],
- ["_Test Accumulated Depreciations", "Current Assets", 0, "Accumulated Depreciation", None],
- ["_Test Depreciations", "Expenses", 0, None, None],
- ["_Test Gain/Loss on Asset Disposal", "Expenses", 0, None, None],
- # Receivable / Payable Account
- ["_Test Receivable", "Current Assets", 0, "Receivable", None],
- ["_Test Payable", "Current Liabilities", 0, "Payable", None],
- ["_Test Receivable USD", "Current Assets", 0, "Receivable", "USD"],
- ["_Test Payable USD", "Current Liabilities", 0, "Payable", "USD"],
- ]
+ self.assertEqual(acc.account_currency, "INR")
- for company, abbr in [
- ["_Test Company", "_TC"],
- ["_Test Company 1", "_TC1"],
- ["_Test Company with perpetual inventory", "TCP1"],
- ]:
- test_objects = make_test_objects(
- "Account",
- [
- {
- "doctype": "Account",
- "account_name": account_name,
- "parent_account": parent_account + " - " + abbr,
- "company": company,
- "is_group": is_group,
- "account_type": account_type,
- "account_currency": currency,
- }
- for account_name, parent_account, is_group, account_type, currency in accounts
- ],
+ # Make a JV against this account
+ make_journal_entry(
+ "Test Currency Account - _TC", "Miscellaneous Expenses - _TC", 100, submit=True
)
- return test_objects
+ acc.account_currency = "USD"
+ self.assertRaises(frappe.ValidationError, acc.save)
def get_inventory_account(company, warehouse=None):