diff --git a/erpnext/accounts/doctype/payment_request/payment_request.py b/erpnext/accounts/doctype/payment_request/payment_request.py index 48f7e70f3e7..52722942674 100644 --- a/erpnext/accounts/doctype/payment_request/payment_request.py +++ b/erpnext/accounts/doctype/payment_request/payment_request.py @@ -149,6 +149,15 @@ class PaymentRequest(Document): ).format(self.grand_total, amount) ) + def on_change(self): + ref_doc = frappe.get_doc(self.reference_doctype, self.reference_name) + advance_payment_doctypes = frappe.get_hooks("advance_payment_receivable_doctypes") + frappe.get_hooks( + "advance_payment_payable_doctypes" + ) + if self.reference_doctype in advance_payment_doctypes: + # set advance payment status + ref_doc.set_advance_payment_status() + def on_submit(self): if self.payment_request_type == "Outward": self.db_set("status", "Initiated") @@ -172,13 +181,6 @@ class PaymentRequest(Document): elif self.payment_channel == "Phone": self.request_phone_payment() - advance_payment_doctypes = frappe.get_hooks("advance_payment_receivable_doctypes") + frappe.get_hooks( - "advance_payment_payable_doctypes" - ) - if self.reference_doctype in advance_payment_doctypes: - # set advance payment status - ref_doc.set_total_advance_paid() - def request_phone_payment(self): controller = _get_payment_gateway_controller(self.payment_gateway) request_amount = self.get_request_amount() @@ -217,14 +219,6 @@ class PaymentRequest(Document): self.check_if_payment_entry_exists() self.set_as_cancelled() - ref_doc = frappe.get_doc(self.reference_doctype, self.reference_name) - advance_payment_doctypes = frappe.get_hooks("advance_payment_receivable_doctypes") + frappe.get_hooks( - "advance_payment_payable_doctypes" - ) - if self.reference_doctype in advance_payment_doctypes: - # set advance payment status - ref_doc.set_total_advance_paid() - def make_invoice(self): ref_doc = frappe.get_doc(self.reference_doctype, self.reference_name) if hasattr(ref_doc, "order_type") and ref_doc.order_type == "Shopping Cart": diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py index d90e09ec858..c9e8e4e4231 100644 --- a/erpnext/controllers/accounts_controller.py +++ b/erpnext/controllers/accounts_controller.py @@ -1924,32 +1924,43 @@ class AccountsController(TransactionBase): self.db_set("advance_paid", advance_paid) - self.set_advance_payment_status(advance_paid, order_total) + self.set_advance_payment_status() - def set_advance_payment_status(self, advance_paid: float | None = None, order_total: float | None = None): + def set_advance_payment_status(self): new_status = None - # if money is paid set the paid states - if advance_paid: - new_status = "Partially Paid" if advance_paid < order_total else "Fully Paid" - if not new_status: - prs = frappe.db.count( - "Payment Request", - { - "reference_doctype": self.doctype, - "reference_name": self.name, - "docstatus": 1, - }, - ) - if self.doctype in frappe.get_hooks("advance_payment_receivable_doctypes"): - new_status = "Requested" if prs else "Not Requested" - if self.doctype in frappe.get_hooks("advance_payment_payable_doctypes"): - new_status = "Initiated" if prs else "Not Initiated" + stati = frappe.get_list( + "Payment Request", + { + "reference_doctype": self.doctype, + "reference_name": self.name, + "docstatus": 1, + }, + pluck="status", + ) + if self.doctype in frappe.get_hooks("advance_payment_receivable_doctypes"): + if not stati: + new_status = "Not Requested" + elif "Requested" in stati or "Failed" in stati: + new_status = "Requested" + elif "Partially Paid" in stati: + new_status = "Partially Paid" + elif "Paid" in stati: + new_status = "Fully Paid" + if self.doctype in frappe.get_hooks("advance_payment_payable_doctypes"): + if not stati: + new_status = "Not Initiated" + elif "Initiated" in stati or "Failed" in stati or "Payment Ordered" in stati: + new_status = "Initiated" + elif "Partially Paid" in stati: + new_status = "Partially Paid" + elif "Paid" in stati: + new_status = "Fully Paid" if new_status == self.advance_payment_status: return - self.db_set("advance_payment_status", new_status) + self.db_set("advance_payment_status", new_status, update_modified=False) self.set_status(update=True) self.notify_update()