fix: account payable currency and value (#36859)

* fix: account payable currency and value

* fix: added party_type and party in accounts payable report

* chore: code cleanup

* fix: customer group test case failure

* fix: added test case of the issue

* fix: filter toggle for party_type

* fix: filter toggle for party_type

* chore: fix typo

---------

Co-authored-by: ruthra kumar <ruthra@erpnext.com>
This commit is contained in:
RitvikSardana 2023-09-02 13:08:08 +05:30 committed by GitHub
parent 2d8363a983
commit e599f75a51
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 132 additions and 44 deletions

View File

@ -37,24 +37,6 @@ frappe.query_reports["Accounts Payable"] = {
} }
} }
}, },
{
"fieldname": "supplier",
"label": __("Supplier"),
"fieldtype": "Link",
"options": "Supplier",
on_change: () => {
var supplier = frappe.query_report.get_filter_value('supplier');
if (supplier) {
frappe.db.get_value('Supplier', supplier, "tax_id", function(value) {
frappe.query_report.set_filter_value('tax_id', value["tax_id"]);
});
} else {
frappe.query_report.set_filter_value('tax_id', "");
}
frappe.query_report.refresh();
}
},
{ {
"fieldname": "party_account", "fieldname": "party_account",
"label": __("Payable Account"), "label": __("Payable Account"),
@ -112,11 +94,38 @@ frappe.query_reports["Accounts Payable"] = {
"fieldtype": "Link", "fieldtype": "Link",
"options": "Payment Terms Template" "options": "Payment Terms Template"
}, },
{
"fieldname": "party_type",
"label": __("Party Type"),
"fieldtype": "Link",
"options": "Party Type",
get_query: () => {
return {
filters: {
'account_type': 'Payable'
}
};
},
on_change: () => {
frappe.query_report.set_filter_value('party', "");
let party_type = frappe.query_report.get_filter_value('party_type');
frappe.query_report.toggle_filter_display('supplier_group', frappe.query_report.get_filter_value('party_type') !== "Supplier");
}
},
{
"fieldname":"party",
"label": __("Party"),
"fieldtype": "Dynamic Link",
"options": "party_type",
},
{ {
"fieldname": "supplier_group", "fieldname": "supplier_group",
"label": __("Supplier Group"), "label": __("Supplier Group"),
"fieldtype": "Link", "fieldtype": "Link",
"options": "Supplier Group" "options": "Supplier Group",
"hidden": 1
}, },
{ {
"fieldname": "group_by_party", "fieldname": "group_by_party",
@ -133,12 +142,6 @@ frappe.query_reports["Accounts Payable"] = {
"label": __("Show Remarks"), "label": __("Show Remarks"),
"fieldtype": "Check", "fieldtype": "Check",
}, },
{
"fieldname": "tax_id",
"label": __("Tax Id"),
"fieldtype": "Data",
"hidden": 1
},
{ {
"fieldname": "show_future_payments", "fieldname": "show_future_payments",
"label": __("Show Future Payments"), "label": __("Show Future Payments"),

View File

@ -0,0 +1,67 @@
import unittest
import frappe
from frappe.tests.utils import FrappeTestCase, change_settings
from frappe.utils import add_days, flt, getdate, today
from erpnext import get_default_cost_center
from erpnext.accounts.doctype.payment_entry.payment_entry import get_payment_entry
from erpnext.accounts.doctype.purchase_invoice.test_purchase_invoice import make_purchase_invoice
from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_sales_invoice
from erpnext.accounts.report.accounts_payable.accounts_payable import execute
from erpnext.accounts.test.accounts_mixin import AccountsTestMixin
from erpnext.selling.doctype.sales_order.test_sales_order import make_sales_order
class TestAccountsReceivable(AccountsTestMixin, FrappeTestCase):
def setUp(self):
self.create_company()
self.create_customer()
self.create_item()
self.create_supplier(currency="USD", supplier_name="Test Supplier2")
self.create_usd_payable_account()
def tearDown(self):
frappe.db.rollback()
def test_accounts_receivable_with_supplier(self):
pi = self.create_purchase_invoice(do_not_submit=True)
pi.currency = "USD"
pi.conversion_rate = 80
pi.credit_to = self.creditors_usd
pi = pi.save().submit()
filters = {
"company": self.company,
"party_type": "Supplier",
"party": self.supplier,
"report_date": today(),
"range1": 30,
"range2": 60,
"range3": 90,
"range4": 120,
}
data = execute(filters)
self.assertEqual(data[1][0].get("outstanding"), 300)
self.assertEqual(data[1][0].get("currency"), "USD")
def create_purchase_invoice(self, do_not_submit=False):
frappe.set_user("Administrator")
pi = make_purchase_invoice(
item=self.item,
company=self.company,
supplier=self.supplier,
is_return=False,
update_stock=False,
posting_date=frappe.utils.datetime.date(2021, 5, 1),
do_not_save=1,
rate=300,
price_list_rate=300,
qty=1,
)
pi = pi.save()
if not do_not_submit:
pi = pi.submit()
return pi

View File

@ -46,8 +46,7 @@ frappe.query_reports["Accounts Receivable"] = {
var customer = frappe.query_report.get_filter_value('customer'); var customer = frappe.query_report.get_filter_value('customer');
var company = frappe.query_report.get_filter_value('company'); var company = frappe.query_report.get_filter_value('company');
if (customer) { if (customer) {
frappe.db.get_value('Customer', customer, ["tax_id", "customer_name", "payment_terms"], function(value) { frappe.db.get_value('Customer', customer, ["customer_name", "payment_terms"], function(value) {
frappe.query_report.set_filter_value('tax_id', value["tax_id"]);
frappe.query_report.set_filter_value('customer_name', value["customer_name"]); frappe.query_report.set_filter_value('customer_name', value["customer_name"]);
frappe.query_report.set_filter_value('payment_terms', value["payment_terms"]); frappe.query_report.set_filter_value('payment_terms', value["payment_terms"]);
}); });
@ -59,7 +58,6 @@ frappe.query_reports["Accounts Receivable"] = {
} }
}, "Customer"); }, "Customer");
} else { } else {
frappe.query_report.set_filter_value('tax_id', "");
frappe.query_report.set_filter_value('customer_name', ""); frappe.query_report.set_filter_value('customer_name', "");
frappe.query_report.set_filter_value('credit_limit', ""); frappe.query_report.set_filter_value('credit_limit', "");
frappe.query_report.set_filter_value('payment_terms', ""); frappe.query_report.set_filter_value('payment_terms', "");
@ -172,12 +170,6 @@ frappe.query_reports["Accounts Receivable"] = {
"label": __("Show Sales Person"), "label": __("Show Sales Person"),
"fieldtype": "Check", "fieldtype": "Check",
}, },
{
"fieldname": "tax_id",
"label": __("Tax Id"),
"fieldtype": "Data",
"hidden": 1
},
{ {
"fieldname": "show_remarks", "fieldname": "show_remarks",
"label": __("Show Remarks"), "label": __("Show Remarks"),

View File

@ -211,11 +211,10 @@ class ReceivablePayableReport(object):
return return
# amount in "Party Currency", if its supplied. If not, amount in company currency # amount in "Party Currency", if its supplied. If not, amount in company currency
for party_type in self.party_type: if self.filters.get("party_type") and self.filters.get("party"):
if self.filters.get(scrub(party_type)): amount = ple.amount_in_account_currency
amount = ple.amount_in_account_currency else:
else: amount = ple.amount
amount = ple.amount
amount_in_account_currency = ple.amount_in_account_currency amount_in_account_currency = ple.amount_in_account_currency
# update voucher # update voucher
@ -426,10 +425,9 @@ class ReceivablePayableReport(object):
# customer / supplier name # customer / supplier name
party_details = self.get_party_details(row.party) or {} party_details = self.get_party_details(row.party) or {}
row.update(party_details) row.update(party_details)
for party_type in self.party_type:
if self.filters.get(scrub(party_type)): if self.filters.get("party_type") and self.filters.get("party"):
row.currency = row.account_currency row.currency = row.account_currency
break
else: else:
row.currency = self.company_currency row.currency = self.company_currency
@ -765,6 +763,7 @@ class ReceivablePayableReport(object):
def prepare_conditions(self): def prepare_conditions(self):
self.qb_selection_filter = [] self.qb_selection_filter = []
self.or_filters = [] self.or_filters = []
for party_type in self.party_type: for party_type in self.party_type:
party_type_field = scrub(party_type) party_type_field = scrub(party_type)
self.or_filters.append(self.ple.party_type == party_type) self.or_filters.append(self.ple.party_type == party_type)
@ -800,6 +799,12 @@ class ReceivablePayableReport(object):
if self.filters.get(party_type_field): if self.filters.get(party_type_field):
self.qb_selection_filter.append(self.ple.party == self.filters.get(party_type_field)) self.qb_selection_filter.append(self.ple.party == self.filters.get(party_type_field))
if self.filters.get("party_type"):
self.qb_selection_filter.append(self.filters.party_type == self.ple.party_type)
if self.filters.get("party"):
self.qb_selection_filter.append(self.filters.party == self.ple.party)
if self.filters.party_account: if self.filters.party_account:
self.qb_selection_filter.append(self.ple.account == self.filters.party_account) self.qb_selection_filter.append(self.ple.account == self.filters.party_account)
else: else:

View File

@ -15,7 +15,6 @@ frappe.require("assets/erpnext/js/financial_statements.js", function () {
fieldtype: "Check", fieldtype: "Check",
default: 1, default: 1,
}); });
console.log(frappe.query_reports["Balance Sheet"]["filters"]);
frappe.query_reports["Balance Sheet"]["filters"].push({ frappe.query_reports["Balance Sheet"]["filters"].push({
fieldname: "include_default_book_entries", fieldname: "include_default_book_entries",

View File

@ -126,6 +126,28 @@ class AccountsTestMixin:
acc = frappe.get_doc("Account", name) acc = frappe.get_doc("Account", name)
self.debtors_usd = acc.name self.debtors_usd = acc.name
def create_usd_payable_account(self):
account_name = "Creditors USD"
if not frappe.db.get_value(
"Account", filters={"account_name": account_name, "company": self.company}
):
acc = frappe.new_doc("Account")
acc.account_name = account_name
acc.parent_account = "Accounts Payable - " + self.company_abbr
acc.company = self.company
acc.account_currency = "USD"
acc.account_type = "Payable"
acc.insert()
else:
name = frappe.db.get_value(
"Account",
filters={"account_name": account_name, "company": self.company},
fieldname="name",
pluck=True,
)
acc = frappe.get_doc("Account", name)
self.creditors_usd = acc.name
def clear_old_entries(self): def clear_old_entries(self):
doctype_list = [ doctype_list = [
"GL Entry", "GL Entry",