From 352e6494f3e858c5e96c3b285020a64e4a972337 Mon Sep 17 00:00:00 2001 From: Shreya Shah Date: Wed, 26 Sep 2018 15:38:34 +0530 Subject: [PATCH] Contact and email fields in Payment Entry (#15490) * Add contact_person and contact_email fields to Payment Entry * Minor fix * Map contact details while making Payment Entry * Update payment_entry.py --- .../doctype/payment_entry/payment_entry.js | 57 +++++++++------ .../doctype/payment_entry/payment_entry.json | 70 ++++++++++++++++++- .../doctype/payment_entry/payment_entry.py | 8 +-- 3 files changed, 110 insertions(+), 25 deletions(-) diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.js b/erpnext/accounts/doctype/payment_entry/payment_entry.js index 9215e5f3662..b0795caf238 100644 --- a/erpnext/accounts/doctype/payment_entry/payment_entry.js +++ b/erpnext/accounts/doctype/payment_entry/payment_entry.js @@ -23,7 +23,6 @@ frappe.ui.form.on('Payment Entry', { } } }); - frm.set_query("party_type", function() { return{ "filters": { @@ -31,7 +30,17 @@ frappe.ui.form.on('Payment Entry', { } } }); - + frm.set_query("contact_person", function() { + if (frm.doc.party) { + return { + query: 'frappe.contacts.doctype.contact.contact.contact_query', + filters: { + link_doctype: frm.doc.party_type, + link_name: frm.doc.party + } + }; + } + }); frm.set_query("paid_to", function() { var account_types = in_list(["Receive", "Internal Transfer"], frm.doc.payment_type) ? ["Bank", "Cash"] : [frappe.boot.party_account_types[frm.doc.party_type]]; @@ -114,6 +123,11 @@ frappe.ui.form.on('Payment Entry', { frm.events.set_dynamic_labels(frm); }, + contact_person: function(frm) { + frm.set_value("contact_email", ""); + erpnext.utils.get_contact_details(frm); + }, + hide_unhide_fields: function(frm) { var company_currency = frm.doc.company? frappe.get_doc(":Company", frm.doc.company).default_currency: ""; @@ -146,7 +160,7 @@ frappe.ui.form.on('Payment Entry', { frm.toggle_display("set_exchange_gain_loss", (frm.doc.paid_amount && frm.doc.received_amount && frm.doc.difference_amount && ((frm.doc.paid_from_account_currency != company_currency || - frm.doc.paid_to_account_currency != company_currency) && + frm.doc.paid_to_account_currency != company_currency) && frm.doc.paid_from_account_currency != frm.doc.paid_to_account_currency))); frm.refresh_fields(); @@ -208,7 +222,7 @@ frappe.ui.form.on('Payment Entry', { }); } else { if(frm.doc.party) { - frm.events.party(frm); + frm.events.party(frm); } if(frm.doc.mode_of_payment) { @@ -230,13 +244,16 @@ frappe.ui.form.on('Payment Entry', { }, party: function(frm) { + if (frm.doc.contact_email || frm.doc.contact_person) { + frm.set_value("contact_email", ""); + frm.set_value("contact_person", ""); + } if(frm.doc.payment_type && frm.doc.party_type && frm.doc.party) { if(!frm.doc.posting_date) { frappe.msgprint(__("Please select Posting Date before selecting Party")) frm.set_value("party", ""); return ; } - frm.set_party_account_based_on_party = true; return frappe.call({ @@ -302,7 +319,7 @@ frappe.ui.form.on('Payment Entry', { frm.set_value("target_exchange_rate", frm.doc.source_exchange_rate); } frm.set_value("received_amount", frm.doc.paid_amount); - + } else { frm.events.received_amount(frm); } @@ -350,7 +367,7 @@ frappe.ui.form.on('Payment Entry', { ]); } } - }); + }); } }, @@ -402,7 +419,7 @@ frappe.ui.form.on('Payment Entry', { } }) }, - + posting_date: function(frm) { frm.events.paid_from_account_currency(frm); }, @@ -415,7 +432,7 @@ frappe.ui.form.on('Payment Entry', { frm.set_value("target_exchange_rate", frm.doc.source_exchange_rate); frm.set_value("base_received_amount", frm.doc.base_paid_amount); } - + frm.events.set_unallocated_amount(frm); } @@ -425,17 +442,17 @@ frappe.ui.form.on('Payment Entry', { target_exchange_rate: function(frm) { frm.set_paid_amount_based_on_received_amount = true; - + if (frm.doc.received_amount) { frm.set_value("base_received_amount", flt(frm.doc.received_amount) * flt(frm.doc.target_exchange_rate)); - - if(!frm.doc.source_exchange_rate && + + if(!frm.doc.source_exchange_rate && (frm.doc.paid_from_account_currency == frm.doc.paid_to_account_currency)) { frm.set_value("source_exchange_rate", frm.doc.target_exchange_rate); frm.set_value("base_paid_amount", frm.doc.base_received_amount); } - + frm.events.set_unallocated_amount(frm); } frm.set_paid_amount_based_on_received_amount = false; @@ -468,14 +485,14 @@ frappe.ui.form.on('Payment Entry', { frm.events.allocate_party_amount_against_ref_docs(frm, frm.doc.received_amount); else frm.events.set_unallocated_amount(frm); - + frm.set_paid_amount_based_on_received_amount = false; }, - + reset_received_amount: function(frm) { if(!frm.set_paid_amount_based_on_received_amount && (frm.doc.paid_from_account_currency == frm.doc.paid_to_account_currency)) { - + frm.set_value("received_amount", frm.doc.paid_amount); if(frm.doc.source_exchange_rate) { @@ -483,7 +500,7 @@ frappe.ui.form.on('Payment Entry', { } frm.set_value("base_received_amount", frm.doc.base_paid_amount); } - + if(frm.doc.payment_type == "Receive") frm.events.allocate_party_amount_against_ref_docs(frm, frm.doc.paid_amount); else @@ -549,7 +566,7 @@ frappe.ui.form.on('Payment Entry', { (frm.doc.payment_type=="Receive" && frm.doc.party_type=="Customer") || (frm.doc.payment_type=="Pay" && frm.doc.party_type=="Supplier") || (frm.doc.payment_type=="Pay" && frm.doc.party_type=="Employee") || - (frm.doc.payment_type=="Receive" && frm.doc.party_type=="Student") + (frm.doc.payment_type=="Receive" && frm.doc.party_type=="Student") ) { if(total_positive_outstanding > total_negative_outstanding) frm.set_value("paid_amount", @@ -694,7 +711,7 @@ frappe.ui.form.on('Payment Entry', { frm.set_value("unallocated_amount", unallocated_amount); frm.trigger("set_difference_amount"); }, - + set_difference_amount: function(frm) { var difference_amount = 0; var base_unallocated_amount = flt(frm.doc.unallocated_amount) * @@ -753,7 +770,7 @@ frappe.ui.form.on('Payment Entry', { frappe.msgprint(__("Row #{0}: Reference Document Type must be one of Purchase Order, Purchase Invoice or Journal Entry", [row.idx])); return false; } - + if(frm.doc.party_type=="Employee" && !in_list(["Expense Claim", "Journal Entry"], row.reference_doctype) ) { diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.json b/erpnext/accounts/doctype/payment_entry/payment_entry.json index 679c97fdd1a..bc9062b96c9 100644 --- a/erpnext/accounts/doctype/payment_entry/payment_entry.json +++ b/erpnext/accounts/doctype/payment_entry/payment_entry.json @@ -376,6 +376,40 @@ "translatable": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "party", + "fieldname": "contact_person", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Contact", + "length": 0, + "no_copy": 0, + "options": "Contact", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_in_quick_entry": 0, @@ -441,6 +475,40 @@ "translatable": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "contact_person", + "fieldname": "contact_email", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Email", + "length": 0, + "no_copy": 0, + "options": "Email", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_in_quick_entry": 0, @@ -1972,7 +2040,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2018-09-11 15:44:28.647566", + "modified": "2018-09-25 14:38:48.312629", "modified_by": "Administrator", "module": "Accounts", "name": "Payment Entry", diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.py b/erpnext/accounts/doctype/payment_entry/payment_entry.py index 6a361a4bfa2..aec3d1b0148 100644 --- a/erpnext/accounts/doctype/payment_entry/payment_entry.py +++ b/erpnext/accounts/doctype/payment_entry/payment_entry.py @@ -299,12 +299,12 @@ class PaymentEntry(AccountsController): if self.payment_type == "Receive" \ and self.base_total_allocated_amount < self.base_received_amount + total_deductions \ and self.total_allocated_amount < self.paid_amount + (total_deductions / self.source_exchange_rate): - self.unallocated_amount = (self.base_received_amount + total_deductions - + self.unallocated_amount = (self.base_received_amount + total_deductions - self.base_total_allocated_amount) / self.source_exchange_rate elif self.payment_type == "Pay" \ and self.base_total_allocated_amount < (self.base_paid_amount - total_deductions) \ and self.total_allocated_amount < self.received_amount + (total_deductions / self.target_exchange_rate): - self.unallocated_amount = (self.base_paid_amount - (total_deductions + + self.unallocated_amount = (self.base_paid_amount - (total_deductions + self.base_total_allocated_amount)) / self.target_exchange_rate def set_difference_amount(self): @@ -790,7 +790,6 @@ def get_reference_details(reference_doctype, reference_name, party_account_curre @frappe.whitelist() def get_payment_entry(dt, dn, party_amount=None, bank_account=None, bank_amount=None): doc = frappe.get_doc(dt, dn) - if dt in ("Sales Order", "Purchase Order") and flt(doc.per_billed, 2) > 0: frappe.throw(_("Can only make payment against unbilled {0}").format(dt)) @@ -877,7 +876,8 @@ def get_payment_entry(dt, dn, party_amount=None, bank_account=None, bank_amount= pe.mode_of_payment = doc.get("mode_of_payment") pe.party_type = party_type pe.party = doc.get(scrub(party_type)) - + pe.contact_person = doc.get("contact_person") + pe.contact_email = doc.get("contact_email") pe.ensure_supplier_is_not_blocked() pe.paid_from = party_account if payment_type=="Receive" else bank.account