fix: Make get party account method return a list instead of a single default account.

This commit is contained in:
Gursheen Anand 2023-06-12 11:06:03 +05:30
parent b65e58c1ae
commit 7591f1010b
13 changed files with 106 additions and 132 deletions

View File

@ -36,7 +36,7 @@
"index_web_pages_for_search": 1, "index_web_pages_for_search": 1,
"istable": 1, "istable": 1,
"links": [], "links": [],
"modified": "2023-06-05 14:15:42.053150", "modified": "2023-06-06 14:15:42.053150",
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "Accounts", "module": "Accounts",
"name": "Party Account", "name": "Party Account",

View File

@ -712,7 +712,6 @@ frappe.ui.form.on('Payment Entry', {
if(r.message) { if(r.message) {
var total_positive_outstanding = 0; var total_positive_outstanding = 0;
var total_negative_outstanding = 0; var total_negative_outstanding = 0;
console.log(r.message);
$.each(r.message, function(i, d) { $.each(r.message, function(i, d) {
var c = frm.add_child("references"); var c = frm.add_child("references");
c.reference_doctype = d.voucher_type; c.reference_doctype = d.voucher_type;

View File

@ -60,6 +60,7 @@ class PaymentEntry(AccountsController):
def validate(self): def validate(self):
self.setup_party_account_field() self.setup_party_account_field()
self.set_missing_values() self.set_missing_values()
self.set_liability_account()
self.set_missing_ref_details() self.set_missing_ref_details()
self.validate_payment_type() self.validate_payment_type()
self.validate_party_details() self.validate_party_details()
@ -86,35 +87,34 @@ class PaymentEntry(AccountsController):
def on_submit(self): def on_submit(self):
if self.difference_amount: if self.difference_amount:
frappe.throw(_("Difference Amount must be zero")) frappe.throw(_("Difference Amount must be zero"))
book_advance_payments_as_liability = frappe.get_value(
"Company", {"company_name": self.company}, "book_advance_payments_as_liability"
)
if book_advance_payments_as_liability:
self.get_liability_account()
self.make_gl_entries() self.make_gl_entries()
self.update_outstanding_amounts() self.update_outstanding_amounts()
self.update_advance_paid() self.update_advance_paid()
self.update_payment_schedule() self.update_payment_schedule()
self.set_status() self.set_status()
def get_liability_account(self): def set_liability_account(self):
liability_account = get_party_account(self.party_type, self.party, self.company, is_advance=True) book_advance_payments_as_liability = frappe.get_value(
if self.party_type == "Customer": "Company", {"company_name": self.company}, "book_advance_payments_as_liability"
msg = "Book Advance Payments as Liability option is chosen. Paid From account changed from {0} to {1}.".format( )
frappe.bold(self.paid_from), if not book_advance_payments_as_liability:
frappe.bold(liability_account), return
) root_type = frappe.get_value(
frappe.db.set_value("Payment Entry", self.name, "paid_from", liability_account) "Account", {"name": self.party_account, "company": self.company}, "root_type"
self.paid_from = liability_account )
else: if (root_type == "Liability" and self.party_type == "Customer") or (
msg = "Book Advance Payments as Liability option is chosen. Paid To account changed from {0} to {1}.".format( root_type == "Asset" and self.party_type == "Supplier"
frappe.bold(self.paid_to), ):
frappe.bold(liability_account), return
) liability_account = get_party_account(
frappe.db.set_value("Payment Entry", self.name, "paid_to", liability_account) self.party_type, self.party, self.company, include_advance=True
self.paid_to = liability_account )[1]
frappe.msgprint(_(msg), title="Warning", indicator="orange") self.set(self.party_account_field, liability_account)
return liability_account msg = "Book Advance Payments as Liability option is chosen. Paid From account changed from {0} to {1}.".format(
frappe.bold(self.party_account),
frappe.bold(liability_account),
)
frappe.msgprint(_(msg), alert=True)
def on_cancel(self): def on_cancel(self):
self.ignore_linked_doctypes = ( self.ignore_linked_doctypes = (
@ -354,13 +354,6 @@ class PaymentEntry(AccountsController):
elif self.party_type == "Employee": elif self.party_type == "Employee":
ref_party_account = ref_doc.payable_account ref_party_account = ref_doc.payable_account
if ref_party_account != self.party_account:
frappe.throw(
_("{0} {1} is associated with {2}, but Party Account is {3}").format(
d.reference_doctype, d.reference_name, ref_party_account, self.party_account
)
)
if ref_doc.doctype == "Purchase Invoice" and ref_doc.get("on_hold"): if ref_doc.doctype == "Purchase Invoice" and ref_doc.get("on_hold"):
frappe.throw( frappe.throw(
_("{0} {1} is on hold").format(d.reference_doctype, d.reference_name), _("{0} {1} is on hold").format(d.reference_doctype, d.reference_name),
@ -893,11 +886,9 @@ class PaymentEntry(AccountsController):
if self.party_account: if self.party_account:
if self.payment_type == "Receive": if self.payment_type == "Receive":
against_account = self.paid_to against_account = self.paid_to
self.party_account = self.paid_from
dr_or_cr = "credit" dr_or_cr = "credit"
else: else:
against_account = self.paid_from against_account = self.paid_from
self.party_account = self.paid_to
dr_or_cr = "debit" dr_or_cr = "debit"
party_dict = self.get_gl_dict( party_dict = self.get_gl_dict(
@ -927,8 +918,8 @@ class PaymentEntry(AccountsController):
{ {
dr_or_cr: allocated_amount_in_company_currency, dr_or_cr: allocated_amount_in_company_currency,
dr_or_cr + "_in_account_currency": d.allocated_amount, dr_or_cr + "_in_account_currency": d.allocated_amount,
"against_voucher_type": d.reference_doctype, "against_voucher_type": "Payment Entry",
"against_voucher": d.reference_name, "against_voucher": self.name,
} }
) )
@ -973,7 +964,7 @@ class PaymentEntry(AccountsController):
args_dict[dr_or_cr] = 0 args_dict[dr_or_cr] = 0
args_dict[dr_or_cr + "_in_account_currency"] = 0 args_dict[dr_or_cr + "_in_account_currency"] = 0
dr_or_cr = "debit" if dr_or_cr == "credit" else "credit" dr_or_cr = "debit" if dr_or_cr == "credit" else "credit"
args_dict["account"] = self.get_liability_account() args_dict["account"] = self.party_account
args_dict[dr_or_cr] = invoice.allocated_amount args_dict[dr_or_cr] = invoice.allocated_amount
args_dict[dr_or_cr + "_in_account_currency"] = invoice.allocated_amount args_dict[dr_or_cr + "_in_account_currency"] = invoice.allocated_amount
gle = self.get_gl_dict( gle = self.get_gl_dict(

View File

@ -134,32 +134,18 @@ erpnext.accounts.PaymentReconciliationController = class PaymentReconciliationCo
this.frm.trigger("clear_child_tables"); this.frm.trigger("clear_child_tables");
if (!this.frm.doc.receivable_payable_account && this.frm.doc.party_type && this.frm.doc.party) { if (!this.frm.doc.receivable_payable_account && this.frm.doc.party_type && this.frm.doc.party) {
frappe.call({
method: "erpnext.accounts.party.get_party_account",
args: {
company: this.frm.doc.company,
party_type: this.frm.doc.party_type,
party: this.frm.doc.party
},
callback: (r) => {
if (!r.exc && r.message) {
this.frm.set_value("receivable_payable_account", r.message);
}
this.frm.refresh();
}
});
frappe.call({ frappe.call({
method: "erpnext.accounts.party.get_party_account", method: "erpnext.accounts.party.get_party_account",
args: { args: {
company: this.frm.doc.company, company: this.frm.doc.company,
party_type: this.frm.doc.party_type, party_type: this.frm.doc.party_type,
party: this.frm.doc.party, party: this.frm.doc.party,
is_advance: 1 include_advance: 1
}, },
callback: (r) => { callback: (r) => {
if (!r.exc && r.message) { if (!r.exc && r.message) {
this.frm.set_value("default_advance_account", r.message); this.frm.set_value("receivable_payable_account", r.message[0]);
this.frm.set_value("default_advance_account", r.message[1]);
} }
this.frm.refresh(); this.frm.refresh();
} }

View File

@ -7,8 +7,8 @@
"field_order": [ "field_order": [
"company", "company",
"party_type", "party_type",
"party",
"column_break_4", "column_break_4",
"party",
"receivable_payable_account", "receivable_payable_account",
"default_advance_account", "default_advance_account",
"col_break1", "col_break1",
@ -188,20 +188,19 @@
"options": "Cost Center" "options": "Cost Center"
}, },
{ {
"depends_on": "eval:doc.party_type", "depends_on": "eval:doc.party",
"fieldname": "default_advance_account", "fieldname": "default_advance_account",
"fieldtype": "Link", "fieldtype": "Link",
"label": "Default Advance Account", "label": "Default Advance Account",
"mandatory_depends_on": "doc.party_type", "mandatory_depends_on": "doc.party_type",
"options": "Account", "options": "Account"
"reqd": 1
} }
], ],
"hide_toolbar": 1, "hide_toolbar": 1,
"icon": "icon-resize-horizontal", "icon": "icon-resize-horizontal",
"issingle": 1, "issingle": 1,
"links": [], "links": [],
"modified": "2023-06-05 20:09:58.925427", "modified": "2023-06-09 13:02:48.718362",
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "Accounts", "module": "Accounts",
"name": "Payment Reconciliation", "name": "Payment Reconciliation",

View File

@ -1677,7 +1677,7 @@ class TestPurchaseInvoice(unittest.TestCase, StockTestMixin):
party_type="Supplier", party_type="Supplier",
party="_Test Supplier", party="_Test Supplier",
paid_from="Cash - _TC", paid_from="Cash - _TC",
paid_to=get_party_account("Supplier", "_Test Supplier", "_Test Company", is_advance=True), paid_to="Creditors - _TC",
paid_amount=1000, paid_amount=1000,
) )
pe.submit() pe.submit()

View File

@ -3327,7 +3327,7 @@ class TestSalesInvoice(unittest.TestCase):
payment_type="Receive", payment_type="Receive",
party_type="Customer", party_type="Customer",
party="_Test Customer", party="_Test Customer",
paid_from=get_party_account("Customer", "_Test Customer", "_Test Company", is_advance=True), paid_from="Debtors - _TC",
paid_to="Cash - _TC", paid_to="Cash - _TC",
paid_amount=1000, paid_amount=1000,
) )

View File

@ -365,7 +365,7 @@ def set_account_and_due_date(
@frappe.whitelist() @frappe.whitelist()
def get_party_account(party_type, party=None, company=None, is_advance=False): def get_party_account(party_type, party=None, company=None, include_advance=False):
"""Returns the account for the given `party`. """Returns the account for the given `party`.
Will first search in party (Customer / Supplier) record, if not found, Will first search in party (Customer / Supplier) record, if not found,
will search in group (Customer Group / Supplier Group), will search in group (Customer Group / Supplier Group),
@ -380,9 +380,6 @@ def get_party_account(party_type, party=None, company=None, is_advance=False):
return frappe.get_cached_value("Company", company, default_account_name) return frappe.get_cached_value("Company", company, default_account_name)
if is_advance and party_type in ["Customer", "Supplier"]:
return get_party_advance_account(party_type, party, company)
account = frappe.db.get_value( account = frappe.db.get_value(
"Party Account", {"parenttype": party_type, "parent": party, "company": company}, "account" "Party Account", {"parenttype": party_type, "parent": party, "company": company}, "account"
) )
@ -409,6 +406,9 @@ def get_party_account(party_type, party=None, company=None, is_advance=False):
if (account and account_currency != existing_gle_currency) or not account: if (account and account_currency != existing_gle_currency) or not account:
account = get_party_gle_account(party_type, party, company) account = get_party_gle_account(party_type, party, company)
if include_advance and party_type in ["Customer", "Supplier"]:
advance_account = get_party_advance_account(party_type, party, company)
return [account, advance_account]
return account return account

View File

@ -8,7 +8,7 @@ frappe.ui.form.on("Supplier", {
frm.set_value("represents_company", ""); frm.set_value("represents_company", "");
} }
frm.set_query('account', 'accounts', function (doc, cdt, cdn) { frm.set_query('account', 'accounts', function (doc, cdt, cdn) {
var d = locals[cdt][cdn]; let d = locals[cdt][cdn];
return { return {
filters: { filters: {
'account_type': 'Payable', 'account_type': 'Payable',
@ -19,7 +19,7 @@ frappe.ui.form.on("Supplier", {
}); });
frm.set_query('advance_account', 'accounts', function (doc, cdt, cdn) { frm.set_query('advance_account', 'accounts', function (doc, cdt, cdn) {
var d = locals[cdt][cdn]; let d = locals[cdt][cdn];
return { return {
filters: { filters: {
"root_type": 'Asset', "root_type": 'Asset',

View File

@ -885,18 +885,15 @@ class AccountsController(TransactionBase):
amount_field = "credit_in_account_currency" amount_field = "credit_in_account_currency"
order_field = "sales_order" order_field = "sales_order"
order_doctype = "Sales Order" order_doctype = "Sales Order"
party_account = [
get_party_account(party_type, party=party, company=self.company, is_advance=True)
]
else: else:
party_type = "Supplier" party_type = "Supplier"
party = self.supplier party = self.supplier
amount_field = "debit_in_account_currency" amount_field = "debit_in_account_currency"
order_field = "purchase_order" order_field = "purchase_order"
order_doctype = "Purchase Order" order_doctype = "Purchase Order"
party_account = [ party_account = [
get_party_account(party_type, party=party, company=self.company, is_advance=True) get_party_account(party_type, party=party, company=self.company, include_advance=True)[1]
] ]
order_list = list(set(d.get(order_field) for d in self.get("items") if d.get(order_field))) order_list = list(set(d.get(order_field) for d in self.get("items") if d.get(order_field)))

View File

@ -20,8 +20,8 @@ frappe.ui.form.on("Customer", {
frm.set_query('customer_group', {'is_group': 0}); frm.set_query('customer_group', {'is_group': 0});
frm.set_query('default_price_list', { 'selling': 1}); frm.set_query('default_price_list', { 'selling': 1});
frm.set_query('account', 'accounts', function(doc, cdt, cdn) { frm.set_query('account', 'accounts', function(doc, cdt, cdn) {
var d = locals[cdt][cdn]; let d = locals[cdt][cdn];
var filters = { let filters = {
'account_type': 'Receivable', 'account_type': 'Receivable',
'company': d.company, 'company': d.company,
"is_group": 0 "is_group": 0
@ -36,7 +36,7 @@ frappe.ui.form.on("Customer", {
}); });
frm.set_query('advance_account', 'accounts', function (doc, cdt, cdn) { frm.set_query('advance_account', 'accounts', function (doc, cdt, cdn) {
var d = locals[cdt][cdn]; let d = locals[cdt][cdn];
return { return {
filters: { filters: {
"root_type": 'Liability', "root_type": 'Liability',

View File

@ -16,34 +16,35 @@ cur_frm.cscript.set_root_readonly = function(doc) {
} }
} }
//get query select Customer Group frappe.ui.form.on("Customer Group", {
cur_frm.fields_dict['parent_customer_group'].get_query = function(doc,cdt,cdn) { setup: function(frm){
return { frm.set_query('parent_customer_group', function (doc) {
filters: { return {
'is_group': 1, filters: {
'name': ['!=', cur_frm.doc.customer_group_name] 'is_group': 1,
} 'name': ['!=', cur_frm.doc.customer_group_name]
} }
} }
});
cur_frm.fields_dict['accounts'].grid.get_field('account').get_query = function(doc, cdt, cdn) { frm.set_query('account', 'accounts', function (doc, cdt, cdn) {
var d = locals[cdt][cdn]; return {
return { filters: {
filters: { "account_type": 'Receivable',
"account_type": 'Receivable', "company": locals[cdt][cdn].company,
"company": d.company, "is_group": 0
"is_group": 0 }
} }
} });
}
cur_frm.fields_dict['accounts'].grid.get_field('advance_account').get_query = function(doc, cdt, cdn) { frm.set_query('advance_account', 'accounts', function (doc, cdt, cdn) {
var d = locals[cdt][cdn]; return {
return { filters: {
filters: { "root_type": 'Liability',
"root_type": 'Liability', "company": locals[cdt][cdn].company,
"company": d.company, "is_group": 0
"is_group": 0 }
} }
});
} }
} });

View File

@ -16,34 +16,35 @@ cur_frm.cscript.set_root_readonly = function(doc) {
} }
}; };
// get query select Customer Group frappe.ui.form.on("Supplier Group", {
cur_frm.fields_dict['parent_supplier_group'].get_query = function() { setup: function(frm){
return { frm.set_query('parent_supplier_group', function (doc) {
filters: { return {
'is_group': 1, filters: {
'name': ['!=', cur_frm.doc.supplier_group_name] 'is_group': 1,
} 'name': ['!=', cur_frm.doc.supplier_group_name]
}; }
}; }
});
cur_frm.fields_dict['accounts'].grid.get_field('account').get_query = function(doc, cdt, cdn) { frm.set_query('account', 'accounts', function (doc, cdt, cdn) {
var d = locals[cdt][cdn]; return {
return { filters: {
filters: { 'account_type': 'Payable',
'account_type': 'Payable', 'company': locals[cdt][cdn].company,
'company': d.company, "is_group": 0
"is_group": 0 }
} }
}; });
};
cur_frm.fields_dict['accounts'].grid.get_field('advance_account').get_query = function(doc, cdt, cdn) { frm.set_query('advance_account', 'accounts', function (doc, cdt, cdn) {
var d = locals[cdt][cdn]; return {
return { filters: {
filters: { "root_type": 'Asset',
"root_type": 'Asset', "company": locals[cdt][cdn].company,
"company": d.company, "is_group": 0
"is_group": 0 }
} }
});
} }
}; });