253 lines
6.8 KiB
Python
253 lines
6.8 KiB
Python
# Copyright (c) 2022, Frappe Technologies Pvt. Ltd. and Contributors
|
|
# MIT License. See license.txt
|
|
|
|
import frappe
|
|
from frappe.tests.utils import FrappeTestCase
|
|
from frappe.utils import flt, today
|
|
|
|
from erpnext.accounts.report.general_ledger.general_ledger import execute
|
|
|
|
|
|
class TestGeneralLedger(FrappeTestCase):
|
|
def test_foreign_account_balance_after_exchange_rate_revaluation(self):
|
|
"""
|
|
Checks the correctness of balance after exchange rate revaluation
|
|
"""
|
|
# create a new account with USD currency
|
|
account_name = "Test USD Account for Revalutation"
|
|
company = "_Test Company"
|
|
account = frappe.get_doc(
|
|
{
|
|
"account_name": account_name,
|
|
"is_group": 0,
|
|
"company": company,
|
|
"root_type": "Asset",
|
|
"report_type": "Balance Sheet",
|
|
"account_currency": "USD",
|
|
"parent_account": "Bank Accounts - _TC",
|
|
"account_type": "Bank",
|
|
"doctype": "Account",
|
|
}
|
|
)
|
|
account.insert(ignore_if_duplicate=True)
|
|
# create a JV to debit 1000 USD at 75 exchange rate
|
|
jv = frappe.new_doc("Journal Entry")
|
|
jv.posting_date = today()
|
|
jv.company = company
|
|
jv.multi_currency = 1
|
|
jv.cost_center = "_Test Cost Center - _TC"
|
|
jv.set(
|
|
"accounts",
|
|
[
|
|
{
|
|
"account": account.name,
|
|
"debit_in_account_currency": 1000,
|
|
"credit_in_account_currency": 0,
|
|
"exchange_rate": 75,
|
|
"cost_center": "_Test Cost Center - _TC",
|
|
},
|
|
{
|
|
"account": "Cash - _TC",
|
|
"debit_in_account_currency": 0,
|
|
"credit_in_account_currency": 75000,
|
|
"cost_center": "_Test Cost Center - _TC",
|
|
},
|
|
],
|
|
)
|
|
jv.save()
|
|
jv.submit()
|
|
# create a JV to credit 900 USD at 100 exchange rate
|
|
jv = frappe.new_doc("Journal Entry")
|
|
jv.posting_date = today()
|
|
jv.company = company
|
|
jv.multi_currency = 1
|
|
jv.cost_center = "_Test Cost Center - _TC"
|
|
jv.set(
|
|
"accounts",
|
|
[
|
|
{
|
|
"account": account.name,
|
|
"debit_in_account_currency": 0,
|
|
"credit_in_account_currency": 900,
|
|
"exchange_rate": 100,
|
|
"cost_center": "_Test Cost Center - _TC",
|
|
},
|
|
{
|
|
"account": "Cash - _TC",
|
|
"debit_in_account_currency": 90000,
|
|
"credit_in_account_currency": 0,
|
|
"cost_center": "_Test Cost Center - _TC",
|
|
},
|
|
],
|
|
)
|
|
jv.save()
|
|
jv.submit()
|
|
|
|
# create an exchange rate revaluation entry at 77 exchange rate
|
|
revaluation = frappe.new_doc("Exchange Rate Revaluation")
|
|
revaluation.posting_date = today()
|
|
revaluation.company = company
|
|
revaluation.set(
|
|
"accounts",
|
|
[
|
|
{
|
|
"account": account.name,
|
|
"account_currency": "USD",
|
|
"new_exchange_rate": 77,
|
|
"new_balance_in_base_currency": 7700,
|
|
"balance_in_base_currency": -15000,
|
|
"balance_in_account_currency": 100,
|
|
"current_exchange_rate": -150,
|
|
}
|
|
],
|
|
)
|
|
revaluation.save()
|
|
revaluation.submit()
|
|
|
|
# post journal entry to revaluate
|
|
frappe.db.set_value(
|
|
"Company", company, "unrealized_exchange_gain_loss_account", "_Test Exchange Gain/Loss - _TC"
|
|
)
|
|
revaluation_jv = revaluation.make_jv_for_revaluation()
|
|
revaluation_jv.cost_center = "_Test Cost Center - _TC"
|
|
for acc in revaluation_jv.get("accounts"):
|
|
acc.cost_center = "_Test Cost Center - _TC"
|
|
revaluation_jv.save()
|
|
revaluation_jv.submit()
|
|
|
|
# check the balance of the account
|
|
balance = frappe.db.sql(
|
|
"""
|
|
select sum(debit_in_account_currency) - sum(credit_in_account_currency)
|
|
from `tabGL Entry`
|
|
where account = %s
|
|
group by account
|
|
""",
|
|
account.name,
|
|
)
|
|
|
|
self.assertEqual(balance[0][0], 100)
|
|
|
|
# check if general ledger shows correct balance
|
|
columns, data = execute(
|
|
frappe._dict(
|
|
{
|
|
"company": company,
|
|
"from_date": today(),
|
|
"to_date": today(),
|
|
"account": [account.name],
|
|
"group_by": "Group by Voucher (Consolidated)",
|
|
}
|
|
)
|
|
)
|
|
|
|
self.assertEqual(data[1]["account"], account.name)
|
|
self.assertEqual(data[1]["debit"], 1000)
|
|
self.assertEqual(data[1]["credit"], 0)
|
|
self.assertEqual(data[2]["debit"], 0)
|
|
self.assertEqual(data[2]["credit"], 900)
|
|
self.assertEqual(data[3]["debit"], 100)
|
|
self.assertEqual(data[3]["credit"], 100)
|
|
|
|
def test_ignore_exchange_rate_journals_filter(self):
|
|
# create a new account with USD currency
|
|
account_name = "Test Debtors USD"
|
|
company = "_Test Company"
|
|
account = frappe.get_doc(
|
|
{
|
|
"account_name": account_name,
|
|
"is_group": 0,
|
|
"company": company,
|
|
"root_type": "Asset",
|
|
"report_type": "Balance Sheet",
|
|
"account_currency": "USD",
|
|
"parent_account": "Accounts Receivable - _TC",
|
|
"account_type": "Receivable",
|
|
"doctype": "Account",
|
|
}
|
|
)
|
|
account.insert(ignore_if_duplicate=True)
|
|
# create a JV to debit 1000 USD at 75 exchange rate
|
|
jv = frappe.new_doc("Journal Entry")
|
|
jv.posting_date = today()
|
|
jv.company = company
|
|
jv.multi_currency = 1
|
|
jv.cost_center = "_Test Cost Center - _TC"
|
|
jv.set(
|
|
"accounts",
|
|
[
|
|
{
|
|
"account": account.name,
|
|
"party_type": "Customer",
|
|
"party": "_Test Customer USD",
|
|
"debit_in_account_currency": 1000,
|
|
"credit_in_account_currency": 0,
|
|
"exchange_rate": 75,
|
|
"cost_center": "_Test Cost Center - _TC",
|
|
},
|
|
{
|
|
"account": "Cash - _TC",
|
|
"debit_in_account_currency": 0,
|
|
"credit_in_account_currency": 75000,
|
|
"cost_center": "_Test Cost Center - _TC",
|
|
},
|
|
],
|
|
)
|
|
jv.save()
|
|
jv.submit()
|
|
|
|
revaluation = frappe.new_doc("Exchange Rate Revaluation")
|
|
revaluation.posting_date = today()
|
|
revaluation.company = company
|
|
accounts = revaluation.get_accounts_data()
|
|
revaluation.extend("accounts", accounts)
|
|
row = revaluation.accounts[0]
|
|
row.new_exchange_rate = 83
|
|
row.new_balance_in_base_currency = flt(
|
|
row.new_exchange_rate * flt(row.balance_in_account_currency)
|
|
)
|
|
row.gain_loss = row.new_balance_in_base_currency - flt(row.balance_in_base_currency)
|
|
revaluation.set_total_gain_loss()
|
|
revaluation = revaluation.save().submit()
|
|
|
|
# post journal entry for Revaluation doc
|
|
frappe.db.set_value(
|
|
"Company", company, "unrealized_exchange_gain_loss_account", "_Test Exchange Gain/Loss - _TC"
|
|
)
|
|
revaluation_jv = revaluation.make_jv_for_revaluation()
|
|
revaluation_jv.cost_center = "_Test Cost Center - _TC"
|
|
for acc in revaluation_jv.get("accounts"):
|
|
acc.cost_center = "_Test Cost Center - _TC"
|
|
revaluation_jv.save()
|
|
revaluation_jv.submit()
|
|
|
|
# With ignore_err enabled
|
|
columns, data = execute(
|
|
frappe._dict(
|
|
{
|
|
"company": company,
|
|
"from_date": today(),
|
|
"to_date": today(),
|
|
"account": [account.name],
|
|
"group_by": "Group by Voucher (Consolidated)",
|
|
"ignore_err": True,
|
|
}
|
|
)
|
|
)
|
|
self.assertNotIn(revaluation_jv.name, set([x.voucher_no for x in data]))
|
|
|
|
# Without ignore_err enabled
|
|
columns, data = execute(
|
|
frappe._dict(
|
|
{
|
|
"company": company,
|
|
"from_date": today(),
|
|
"to_date": today(),
|
|
"account": [account.name],
|
|
"group_by": "Group by Voucher (Consolidated)",
|
|
"ignore_err": False,
|
|
}
|
|
)
|
|
)
|
|
self.assertIn(revaluation_jv.name, set([x.voucher_no for x in data]))
|