diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py index f6d4eee518..37548ea9b8 100644 --- a/erpnext/controllers/accounts_controller.py +++ b/erpnext/controllers/accounts_controller.py @@ -89,7 +89,7 @@ class AccountsController(TransactionBase): self.validate_currency() if self.doctype == 'Purchase Invoice': - self.validate_paid_amount() + self.calculate_paid_amount() if self.doctype in ['Purchase Invoice', 'Sales Invoice']: pos_check_field = "is_pos" if self.doctype=="Sales Invoice" else "is_paid" @@ -135,22 +135,23 @@ class AccountsController(TransactionBase): else: df.set("print_hide", 1) - def validate_paid_amount(self): + def calculate_paid_amount(self): if hasattr(self, "is_pos") or hasattr(self, "is_paid"): is_paid = self.get("is_pos") or self.get("is_paid") - if cint(is_paid) == 1: - if flt(self.paid_amount) == 0 and flt(self.outstanding_amount) > 0: - if self.cash_bank_account: - self.paid_amount = flt(flt(self.outstanding_amount), self.precision("paid_amount")) - self.base_paid_amount = flt(self.paid_amount * self.conversion_rate, - self.precision("base_paid_amount")) - else: - # show message that the amount is not paid - self.paid_amount = 0 - frappe.throw( - _("Note: Payment Entry will not be created since 'Cash or Bank Account' was not specified")) - else: - frappe.db.set(self, 'paid_amount', 0) + + if is_paid: + if not self.cash_bank_account: + # show message that the amount is not paid + frappe.throw(_("Note: Payment Entry will not be created since 'Cash or Bank Account' was not specified")) + + if cint(self.is_return) and self.grand_total > self.paid_amount: + self.paid_amount = flt(flt(self.grand_total), self.precision("paid_amount")) + + elif not flt(self.paid_amount) and flt(self.outstanding_amount) > 0: + self.paid_amount = flt(flt(self.outstanding_amount), self.precision("paid_amount")) + + self.base_paid_amount = flt(self.paid_amount * self.conversion_rate, + self.precision("base_paid_amount")) def set_missing_values(self, for_validate=False): if frappe.flags.in_test: diff --git a/erpnext/controllers/sales_and_purchase_return.py b/erpnext/controllers/sales_and_purchase_return.py index b713958b1b..859529204b 100644 --- a/erpnext/controllers/sales_and_purchase_return.py +++ b/erpnext/controllers/sales_and_purchase_return.py @@ -246,6 +246,8 @@ def make_return_doc(doctype, source_name, target_doc=None): elif doc.doctype == 'Purchase Invoice': doc.paid_amount = -1 * source.paid_amount doc.base_paid_amount = -1 * source.base_paid_amount + doc.payment_terms_template = '' + doc.payment_schedule = [] if doc.get("is_return") and hasattr(doc, "packed_items"): for d in doc.get("packed_items"): diff --git a/erpnext/public/js/controllers/taxes_and_totals.js b/erpnext/public/js/controllers/taxes_and_totals.js index 7cf2181e42..2ece711040 100644 --- a/erpnext/public/js/controllers/taxes_and_totals.js +++ b/erpnext/public/js/controllers/taxes_and_totals.js @@ -44,6 +44,12 @@ erpnext.taxes_and_totals = erpnext.payments.extend({ this.calculate_contribution(); } + // Update paid amount on return/debit note creation + if(this.frm.doc.doctype === "Purchase Invoice" && this.frm.doc.is_return + && (this.frm.doc.grand_total > this.frm.doc.paid_amount)) { + this.frm.doc.paid_amount = flt(this.frm.doc.grand_total, precision("grand_total")); + } + this.frm.refresh_fields(); },