From dc178984aefc3ae01e37989d9e7755749072ce82 Mon Sep 17 00:00:00 2001 From: Deepesh Garg Date: Thu, 15 Dec 2022 14:15:20 +0530 Subject: [PATCH 1/3] fix: Payment Request flow fixes from Order to Payment Entry --- .../accounts/doctype/payment_entry/payment_entry.py | 2 +- .../doctype/payment_request/payment_request.js | 2 +- .../doctype/payment_request/payment_request.py | 11 +++++------ .../buying/doctype/purchase_order/purchase_order.js | 4 ++-- erpnext/public/js/controllers/transaction.js | 4 ++-- 5 files changed, 11 insertions(+), 12 deletions(-) diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.py b/erpnext/accounts/doctype/payment_entry/payment_entry.py index 9354e44d24..052b1df6f5 100644 --- a/erpnext/accounts/doctype/payment_entry/payment_entry.py +++ b/erpnext/accounts/doctype/payment_entry/payment_entry.py @@ -1639,7 +1639,7 @@ def get_payment_entry( ): reference_doc = None doc = frappe.get_doc(dt, dn) - if dt in ("Sales Order", "Purchase Order") and flt(doc.per_billed, 2) > 0: + if dt in ("Sales Order", "Purchase Order") and flt(doc.per_billed, 2) >= 99.99: frappe.throw(_("Can only make payment against unbilled {0}").format(dt)) if not party_type: diff --git a/erpnext/accounts/doctype/payment_request/payment_request.js b/erpnext/accounts/doctype/payment_request/payment_request.js index 901ef1987b..e913912028 100644 --- a/erpnext/accounts/doctype/payment_request/payment_request.js +++ b/erpnext/accounts/doctype/payment_request/payment_request.js @@ -42,7 +42,7 @@ frappe.ui.form.on("Payment Request", "refresh", function(frm) { }); } - if(!frm.doc.payment_gateway_account && frm.doc.status == "Initiated") { + if((!frm.doc.payment_gateway_account || frm.doc.payment_request_type == "Outward") && frm.doc.status == "Initiated") { frm.add_custom_button(__('Create Payment Entry'), function(){ frappe.call({ method: "erpnext.accounts.doctype.payment_request.payment_request.make_payment_entry", diff --git a/erpnext/accounts/doctype/payment_request/payment_request.py b/erpnext/accounts/doctype/payment_request/payment_request.py index d82083cea0..2cc487d9fe 100644 --- a/erpnext/accounts/doctype/payment_request/payment_request.py +++ b/erpnext/accounts/doctype/payment_request/payment_request.py @@ -261,6 +261,7 @@ class PaymentRequest(Document): payment_entry.update( { + "mode_of_payment": self.mode_of_payment, "reference_no": self.name, "reference_date": nowdate(), "remarks": "Payment Entry against {0} {1} via Payment Request {2}".format( @@ -410,12 +411,10 @@ def make_payment_request(**args): else "" ) - existing_payment_request = None - if args.order_type == "Shopping Cart": - existing_payment_request = frappe.db.get_value( - "Payment Request", - {"reference_doctype": args.dt, "reference_name": args.dn, "docstatus": ("!=", 2)}, - ) + existing_payment_request = frappe.db.get_value( + "Payment Request", + {"reference_doctype": args.dt, "reference_name": args.dn, "docstatus": ("!=", 2)}, + ) if existing_payment_request: frappe.db.set_value( diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.js b/erpnext/buying/doctype/purchase_order/purchase_order.js index 06fdea030c..47089f7d85 100644 --- a/erpnext/buying/doctype/purchase_order/purchase_order.js +++ b/erpnext/buying/doctype/purchase_order/purchase_order.js @@ -235,11 +235,11 @@ erpnext.buying.PurchaseOrderController = class PurchaseOrderController extends e cur_frm.add_custom_button(__('Purchase Invoice'), this.make_purchase_invoice, __('Create')); - if(flt(doc.per_billed)==0 && doc.status != "Delivered") { + if(flt(doc.per_billed) < 100 && doc.status != "Delivered") { cur_frm.add_custom_button(__('Payment'), cur_frm.cscript.make_payment_entry, __('Create')); } - if(flt(doc.per_billed)==0) { + if(flt(doc.per_billed) < 100) { this.frm.add_custom_button(__('Payment Request'), function() { me.make_payment_request() }, __('Create')); } diff --git a/erpnext/public/js/controllers/transaction.js b/erpnext/public/js/controllers/transaction.js index 46ac80895c..cf05d06a69 100644 --- a/erpnext/public/js/controllers/transaction.js +++ b/erpnext/public/js/controllers/transaction.js @@ -298,7 +298,7 @@ erpnext.TransactionController = class TransactionController extends erpnext.taxe } make_payment_request() { - var me = this; + let me = this; const payment_request_type = (in_list(['Sales Order', 'Sales Invoice'], this.frm.doc.doctype)) ? "Inward" : "Outward"; @@ -314,7 +314,7 @@ erpnext.TransactionController = class TransactionController extends erpnext.taxe }, callback: function(r) { if(!r.exc){ - var doc = frappe.model.sync(r.message); + frappe.model.sync(r.message); frappe.set_route("Form", r.message.doctype, r.message.name); } } From e25b98b620114ba233a48d3e3a402f40001281b8 Mon Sep 17 00:00:00 2001 From: Deepesh Garg Date: Tue, 20 Dec 2022 11:42:05 +0530 Subject: [PATCH 2/3] chore: Update test case --- .../payment_request/payment_request.py | 62 +++++++++---------- 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/erpnext/accounts/doctype/payment_request/payment_request.py b/erpnext/accounts/doctype/payment_request/payment_request.py index 2cc487d9fe..085ff980d5 100644 --- a/erpnext/accounts/doctype/payment_request/payment_request.py +++ b/erpnext/accounts/doctype/payment_request/payment_request.py @@ -411,44 +411,44 @@ def make_payment_request(**args): else "" ) - existing_payment_request = frappe.db.get_value( + draft_payment_request = frappe.db.get_value( "Payment Request", - {"reference_doctype": args.dt, "reference_name": args.dn, "docstatus": ("!=", 2)}, + {"reference_doctype": args.dt, "reference_name": args.dn, "docstatus": 0}, ) - if existing_payment_request: + existing_payment_request_amount = get_existing_payment_request_amount(args.dt, args.dn) + + if existing_payment_request_amount: + grand_total -= existing_payment_request_amount + + if draft_payment_request: frappe.db.set_value( - "Payment Request", existing_payment_request, "grand_total", grand_total, update_modified=False + "Payment Request", draft_payment_request, "grand_total", grand_total, update_modified=False ) - pr = frappe.get_doc("Payment Request", existing_payment_request) + pr = frappe.get_doc("Payment Request", draft_payment_request) else: if args.order_type != "Shopping Cart": - existing_payment_request_amount = get_existing_payment_request_amount(args.dt, args.dn) - - if existing_payment_request_amount: - grand_total -= existing_payment_request_amount - - pr = frappe.new_doc("Payment Request") - pr.update( - { - "payment_gateway_account": gateway_account.get("name"), - "payment_gateway": gateway_account.get("payment_gateway"), - "payment_account": gateway_account.get("payment_account"), - "payment_channel": gateway_account.get("payment_channel"), - "payment_request_type": args.get("payment_request_type"), - "currency": ref_doc.currency, - "grand_total": grand_total, - "mode_of_payment": args.mode_of_payment, - "email_to": args.recipient_id or ref_doc.owner, - "subject": _("Payment Request for {0}").format(args.dn), - "message": gateway_account.get("message") or get_dummy_message(ref_doc), - "reference_doctype": args.dt, - "reference_name": args.dn, - "party_type": args.get("party_type") or "Customer", - "party": args.get("party") or ref_doc.get("customer"), - "bank_account": bank_account, - } - ) + pr = frappe.new_doc("Payment Request") + pr.update( + { + "payment_gateway_account": gateway_account.get("name"), + "payment_gateway": gateway_account.get("payment_gateway"), + "payment_account": gateway_account.get("payment_account"), + "payment_channel": gateway_account.get("payment_channel"), + "payment_request_type": args.get("payment_request_type"), + "currency": ref_doc.currency, + "grand_total": grand_total, + "mode_of_payment": args.mode_of_payment, + "email_to": args.recipient_id or ref_doc.owner, + "subject": _("Payment Request for {0}").format(args.dn), + "message": gateway_account.get("message") or get_dummy_message(ref_doc), + "reference_doctype": args.dt, + "reference_name": args.dn, + "party_type": args.get("party_type") or "Customer", + "party": args.get("party") or ref_doc.get("customer"), + "bank_account": bank_account, + } + ) if args.order_type == "Shopping Cart" or args.mute_email: pr.flags.mute_email = True From 31c95deb88b376ff86746bc07b07590465594fd0 Mon Sep 17 00:00:00 2001 From: Deepesh Garg Date: Tue, 20 Dec 2022 11:45:51 +0530 Subject: [PATCH 3/3] chore: More fixes --- .../payment_request/payment_request.py | 43 +++++++++---------- 1 file changed, 21 insertions(+), 22 deletions(-) diff --git a/erpnext/accounts/doctype/payment_request/payment_request.py b/erpnext/accounts/doctype/payment_request/payment_request.py index 085ff980d5..fc938014b3 100644 --- a/erpnext/accounts/doctype/payment_request/payment_request.py +++ b/erpnext/accounts/doctype/payment_request/payment_request.py @@ -427,28 +427,27 @@ def make_payment_request(**args): ) pr = frappe.get_doc("Payment Request", draft_payment_request) else: - if args.order_type != "Shopping Cart": - pr = frappe.new_doc("Payment Request") - pr.update( - { - "payment_gateway_account": gateway_account.get("name"), - "payment_gateway": gateway_account.get("payment_gateway"), - "payment_account": gateway_account.get("payment_account"), - "payment_channel": gateway_account.get("payment_channel"), - "payment_request_type": args.get("payment_request_type"), - "currency": ref_doc.currency, - "grand_total": grand_total, - "mode_of_payment": args.mode_of_payment, - "email_to": args.recipient_id or ref_doc.owner, - "subject": _("Payment Request for {0}").format(args.dn), - "message": gateway_account.get("message") or get_dummy_message(ref_doc), - "reference_doctype": args.dt, - "reference_name": args.dn, - "party_type": args.get("party_type") or "Customer", - "party": args.get("party") or ref_doc.get("customer"), - "bank_account": bank_account, - } - ) + pr = frappe.new_doc("Payment Request") + pr.update( + { + "payment_gateway_account": gateway_account.get("name"), + "payment_gateway": gateway_account.get("payment_gateway"), + "payment_account": gateway_account.get("payment_account"), + "payment_channel": gateway_account.get("payment_channel"), + "payment_request_type": args.get("payment_request_type"), + "currency": ref_doc.currency, + "grand_total": grand_total, + "mode_of_payment": args.mode_of_payment, + "email_to": args.recipient_id or ref_doc.owner, + "subject": _("Payment Request for {0}").format(args.dn), + "message": gateway_account.get("message") or get_dummy_message(ref_doc), + "reference_doctype": args.dt, + "reference_name": args.dn, + "party_type": args.get("party_type") or "Customer", + "party": args.get("party") or ref_doc.get("customer"), + "bank_account": bank_account, + } + ) if args.order_type == "Shopping Cart" or args.mute_email: pr.flags.mute_email = True