mirror of
https://github.com/frappe/erpnext.git
synced 2026-05-06 23:10:26 +00:00
test: add unit test for common party with foreign currency
(cherry picked from commit 740a04a704)
# Conflicts:
# erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py
This commit is contained in:
@@ -44,7 +44,7 @@ class TestSalesInvoice(FrappeTestCase):
|
|||||||
from erpnext.stock.doctype.stock_ledger_entry.test_stock_ledger_entry import create_items
|
from erpnext.stock.doctype.stock_ledger_entry.test_stock_ledger_entry import create_items
|
||||||
|
|
||||||
create_items(["_Test Internal Transfer Item"], uoms=[{"uom": "Box", "conversion_factor": 10}])
|
create_items(["_Test Internal Transfer Item"], uoms=[{"uom": "Box", "conversion_factor": 10}])
|
||||||
create_internal_parties()
|
# create_internal_parties()
|
||||||
setup_accounts()
|
setup_accounts()
|
||||||
frappe.db.set_single_value("Accounts Settings", "acc_frozen_upto", None)
|
frappe.db.set_single_value("Accounts Settings", "acc_frozen_upto", None)
|
||||||
|
|
||||||
@@ -3679,6 +3679,7 @@ class TestSalesInvoice(FrappeTestCase):
|
|||||||
self.assertEqual(res[0][0], pos_return.return_against)
|
self.assertEqual(res[0][0], pos_return.return_against)
|
||||||
|
|
||||||
|
|
||||||
|
<<<<<<< HEAD
|
||||||
def check_gl_entries(doc, voucher_no, expected_gle, posting_date):
|
def check_gl_entries(doc, voucher_no, expected_gle, posting_date):
|
||||||
gl_entries = frappe.db.sql(
|
gl_entries = frappe.db.sql(
|
||||||
"""select account, debit, credit, posting_date
|
"""select account, debit, credit, posting_date
|
||||||
@@ -3688,6 +3689,199 @@ def check_gl_entries(doc, voucher_no, expected_gle, posting_date):
|
|||||||
order by posting_date asc, account asc""",
|
order by posting_date asc, account asc""",
|
||||||
(voucher_no, posting_date),
|
(voucher_no, posting_date),
|
||||||
as_dict=1,
|
as_dict=1,
|
||||||
|
=======
|
||||||
|
def _create_opening_roundoff_account(self, company_name):
|
||||||
|
liability_root = frappe.db.get_all(
|
||||||
|
"Account",
|
||||||
|
filters={"company": company_name, "root_type": "Liability", "disabled": 0},
|
||||||
|
order_by="lft",
|
||||||
|
limit=1,
|
||||||
|
)[0]
|
||||||
|
|
||||||
|
# setup round off account
|
||||||
|
if acc := frappe.db.exists(
|
||||||
|
"Account",
|
||||||
|
{
|
||||||
|
"account_name": "Round Off for Opening",
|
||||||
|
"account_type": "Round Off for Opening",
|
||||||
|
"company": company_name,
|
||||||
|
},
|
||||||
|
):
|
||||||
|
frappe.db.set_value("Company", company_name, "round_off_for_opening", acc)
|
||||||
|
else:
|
||||||
|
acc = frappe.new_doc("Account")
|
||||||
|
acc.company = company_name
|
||||||
|
acc.parent_account = liability_root.name
|
||||||
|
acc.account_name = "Round Off for Opening"
|
||||||
|
acc.account_type = "Round Off for Opening"
|
||||||
|
acc.save()
|
||||||
|
frappe.db.set_value("Company", company_name, "round_off_for_opening", acc.name)
|
||||||
|
|
||||||
|
def test_opening_invoice_with_rounding_adjustment(self):
|
||||||
|
si = create_sales_invoice(qty=1, rate=99.98, do_not_submit=True)
|
||||||
|
si.is_opening = "Yes"
|
||||||
|
si.items[0].income_account = "Temporary Opening - _TC"
|
||||||
|
si.save()
|
||||||
|
|
||||||
|
self._create_opening_roundoff_account(si.company)
|
||||||
|
|
||||||
|
si.reload()
|
||||||
|
si.submit()
|
||||||
|
res = frappe.db.get_all(
|
||||||
|
"GL Entry",
|
||||||
|
filters={"voucher_no": si.name, "is_opening": "Yes"},
|
||||||
|
fields=["account", "debit", "credit", "is_opening"],
|
||||||
|
)
|
||||||
|
self.assertEqual(len(res), 3)
|
||||||
|
|
||||||
|
def _create_opening_invoice_with_inclusive_tax(self):
|
||||||
|
si = create_sales_invoice(qty=1, rate=90, do_not_submit=True)
|
||||||
|
si.is_opening = "Yes"
|
||||||
|
si.items[0].income_account = "Temporary Opening - _TC"
|
||||||
|
item_template = si.items[0].as_dict()
|
||||||
|
item_template.name = None
|
||||||
|
item_template.rate = 55
|
||||||
|
si.append("items", item_template)
|
||||||
|
si.append(
|
||||||
|
"taxes",
|
||||||
|
{
|
||||||
|
"charge_type": "On Net Total",
|
||||||
|
"account_head": "_Test Account Service Tax - _TC",
|
||||||
|
"cost_center": "_Test Cost Center - _TC",
|
||||||
|
"description": "Testing...",
|
||||||
|
"rate": 5,
|
||||||
|
"included_in_print_rate": True,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
# there will be 0.01 precision loss between Dr and Cr
|
||||||
|
# caused by 'included_in_print_tax' option
|
||||||
|
si.save()
|
||||||
|
return si
|
||||||
|
|
||||||
|
def test_rounding_validation_for_opening_with_inclusive_tax(self):
|
||||||
|
si = self._create_opening_invoice_with_inclusive_tax()
|
||||||
|
# 'Round Off for Opening' not set in Company master
|
||||||
|
# Ledger level validation must be thrown
|
||||||
|
self.assertRaises(frappe.ValidationError, si.submit)
|
||||||
|
|
||||||
|
def test_ledger_entries_on_opening_invoice_with_rounding_loss_by_inclusive_tax(self):
|
||||||
|
si = self._create_opening_invoice_with_inclusive_tax()
|
||||||
|
# 'Round Off for Opening' is set in Company master
|
||||||
|
self._create_opening_roundoff_account(si.company)
|
||||||
|
|
||||||
|
si.submit()
|
||||||
|
actual = frappe.db.get_all(
|
||||||
|
"GL Entry",
|
||||||
|
filters={"voucher_no": si.name, "is_opening": "Yes", "is_cancelled": False},
|
||||||
|
fields=["account", "debit", "credit", "is_opening"],
|
||||||
|
order_by="account,debit",
|
||||||
|
)
|
||||||
|
expected = [
|
||||||
|
{"account": "_Test Account Service Tax - _TC", "debit": 0.0, "credit": 6.9, "is_opening": "Yes"},
|
||||||
|
{"account": "Debtors - _TC", "debit": 145.0, "credit": 0.0, "is_opening": "Yes"},
|
||||||
|
{"account": "Round Off for Opening - _TC", "debit": 0.0, "credit": 0.01, "is_opening": "Yes"},
|
||||||
|
{"account": "Temporary Opening - _TC", "debit": 0.0, "credit": 138.09, "is_opening": "Yes"},
|
||||||
|
]
|
||||||
|
self.assertEqual(len(actual), 4)
|
||||||
|
self.assertEqual(expected, actual)
|
||||||
|
|
||||||
|
def test_common_party_with_foreign_currency_jv(self):
|
||||||
|
from erpnext.accounts.doctype.account.test_account import create_account
|
||||||
|
from erpnext.accounts.doctype.opening_invoice_creation_tool.test_opening_invoice_creation_tool import (
|
||||||
|
make_customer,
|
||||||
|
)
|
||||||
|
from erpnext.accounts.doctype.party_link.party_link import create_party_link
|
||||||
|
from erpnext.buying.doctype.supplier.test_supplier import create_supplier
|
||||||
|
from erpnext.setup.utils import get_exchange_rate
|
||||||
|
|
||||||
|
creditors = create_account(
|
||||||
|
account_name="Creditors USD",
|
||||||
|
parent_account="Accounts Payable - _TC",
|
||||||
|
company="_Test Company",
|
||||||
|
account_currency="USD",
|
||||||
|
account_type="Payable",
|
||||||
|
)
|
||||||
|
debtors = create_account(
|
||||||
|
account_name="Debtors USD",
|
||||||
|
parent_account="Accounts Receivable - _TC",
|
||||||
|
company="_Test Company",
|
||||||
|
account_currency="USD",
|
||||||
|
account_type="Receivable",
|
||||||
|
)
|
||||||
|
|
||||||
|
# create a customer
|
||||||
|
customer = make_customer(customer="_Test Common Party USD")
|
||||||
|
cust_doc = frappe.get_doc("Customer", customer)
|
||||||
|
cust_doc.default_currency = "USD"
|
||||||
|
test_account_details = {
|
||||||
|
"company": "_Test Company",
|
||||||
|
"account": debtors,
|
||||||
|
}
|
||||||
|
cust_doc.append("accounts", test_account_details)
|
||||||
|
cust_doc.save()
|
||||||
|
|
||||||
|
# create a supplier
|
||||||
|
supplier = create_supplier(supplier_name="_Test Common Party USD").name
|
||||||
|
supp_doc = frappe.get_doc("Supplier", supplier)
|
||||||
|
supp_doc.default_currency = "USD"
|
||||||
|
test_account_details = {
|
||||||
|
"company": "_Test Company",
|
||||||
|
"account": creditors,
|
||||||
|
}
|
||||||
|
supp_doc.append("accounts", test_account_details)
|
||||||
|
supp_doc.save()
|
||||||
|
|
||||||
|
# enable common party accounting
|
||||||
|
frappe.db.set_single_value("Accounts Settings", "enable_common_party_accounting", 1)
|
||||||
|
|
||||||
|
# create a party link between customer & supplier
|
||||||
|
party_link = create_party_link("Supplier", supplier, customer)
|
||||||
|
|
||||||
|
# create a sales invoice
|
||||||
|
si = create_sales_invoice(
|
||||||
|
customer=customer,
|
||||||
|
currency="USD",
|
||||||
|
conversion_rate=get_exchange_rate("USD", "INR"),
|
||||||
|
debit_to=debtors,
|
||||||
|
do_not_save=1,
|
||||||
|
)
|
||||||
|
si.party_account_currency = "USD"
|
||||||
|
si.save()
|
||||||
|
si.submit()
|
||||||
|
|
||||||
|
# check outstanding of sales invoice
|
||||||
|
si.reload()
|
||||||
|
self.assertEqual(si.status, "Paid")
|
||||||
|
self.assertEqual(flt(si.outstanding_amount), 0.0)
|
||||||
|
|
||||||
|
# check creation of journal entry
|
||||||
|
jv = frappe.get_all(
|
||||||
|
"Journal Entry Account",
|
||||||
|
{
|
||||||
|
"account": si.debit_to,
|
||||||
|
"party_type": "Customer",
|
||||||
|
"party": si.customer,
|
||||||
|
"reference_type": si.doctype,
|
||||||
|
"reference_name": si.name,
|
||||||
|
},
|
||||||
|
pluck="credit_in_account_currency",
|
||||||
|
)
|
||||||
|
self.assertTrue(jv)
|
||||||
|
self.assertEqual(jv[0], si.grand_total)
|
||||||
|
|
||||||
|
party_link.delete()
|
||||||
|
frappe.db.set_single_value("Accounts Settings", "enable_common_party_accounting", 0)
|
||||||
|
|
||||||
|
|
||||||
|
def set_advance_flag(company, flag, default_account):
|
||||||
|
frappe.db.set_value(
|
||||||
|
"Company",
|
||||||
|
company,
|
||||||
|
{
|
||||||
|
"book_advance_payments_in_separate_party_account": flag,
|
||||||
|
"default_advance_received_account": default_account,
|
||||||
|
},
|
||||||
|
>>>>>>> 740a04a704 (test: add unit test for common party with foreign currency)
|
||||||
)
|
)
|
||||||
|
|
||||||
for i, gle in enumerate(gl_entries):
|
for i, gle in enumerate(gl_entries):
|
||||||
|
|||||||
Reference in New Issue
Block a user