Skip to content

Commit

Permalink
refactor: validate due date code and message according to doctype (#4…
Browse files Browse the repository at this point in the history
…5126)

* refactor: change message of date comparision and refactor code

* refactor: commonify function call for sales and purchase invoice

* refactor: remove redundant mandatory error validation
  • Loading branch information
iamejaaz authored Jan 8, 2025
1 parent 2b45321 commit 81d8f25
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 35 deletions.
51 changes: 29 additions & 22 deletions erpnext/accounts/party.py
Original file line number Diff line number Diff line change
Expand Up @@ -621,34 +621,41 @@ def get_due_date_from_template(template_name, posting_date, bill_date):
return due_date


def validate_due_date(posting_date, due_date, bill_date=None, template_name=None):
def validate_due_date(posting_date, due_date, bill_date=None, template_name=None, doctype=None):
if getdate(due_date) < getdate(posting_date):
frappe.throw(_("Due Date cannot be before Posting / Supplier Invoice Date"))
doctype_date = "Date"
if doctype == "Purchase Invoice":
doctype_date = "Supplier Invoice Date"

if doctype == "Sales Invoice":
doctype_date = "Posting Date"

frappe.throw(_("Due Date cannot be before {0}").format(doctype_date))
else:
if not template_name:
return
validate_due_date_with_template(posting_date, due_date, bill_date, template_name)

default_due_date = get_due_date_from_template(template_name, posting_date, bill_date).strftime(
"%Y-%m-%d"
)

if not default_due_date:
return
def validate_due_date_with_template(posting_date, due_date, bill_date, template_name):
if not template_name:
return

if default_due_date != posting_date and getdate(due_date) > getdate(default_due_date):
is_credit_controller = (
frappe.db.get_single_value("Accounts Settings", "credit_controller") in frappe.get_roles()
)
if is_credit_controller:
msgprint(
_("Note: Due / Reference Date exceeds allowed customer credit days by {0} day(s)").format(
date_diff(due_date, default_due_date)
)
)
else:
frappe.throw(
_("Due / Reference Date cannot be after {0}").format(formatdate(default_due_date))
default_due_date = format(get_due_date_from_template(template_name, posting_date, bill_date))

if not default_due_date:
return

if default_due_date != posting_date and getdate(due_date) > getdate(default_due_date):
is_credit_controller = (
frappe.db.get_single_value("Accounts Settings", "credit_controller") in frappe.get_roles()
)
if is_credit_controller:
msgprint(
_("Note: Due Date exceeds allowed customer credit days by {0} day(s)").format(
date_diff(due_date, default_due_date)
)
)
else:
frappe.throw(_("Due Date cannot be after {0}").format(formatdate(default_due_date)))


@frappe.whitelist()
Expand Down
20 changes: 7 additions & 13 deletions erpnext/controllers/accounts_controller.py
Original file line number Diff line number Diff line change
Expand Up @@ -671,21 +671,15 @@ def validate_due_date(self):
if frappe.flags.in_import and getdate(self.due_date) < getdate(posting_date):
self.due_date = posting_date

elif self.doctype == "Sales Invoice":
if not self.due_date:
frappe.throw(_("Due Date is mandatory"))
elif self.doctype in ["Sales Invoice", "Purchase Invoice"]:
bill_date = self.bill_date if self.doctype == "Purchase Invoice" else None

validate_due_date(
posting_date,
self.due_date,
self.payment_terms_template,
)
elif self.doctype == "Purchase Invoice":
validate_due_date(
posting_date,
self.due_date,
self.bill_date,
self.payment_terms_template,
posting_date=posting_date,
due_date=self.due_date,
bill_date=bill_date,
template_name=self.payment_terms_template,
doctype=self.doctype,
)

def set_price_list_currency(self, buying_or_selling):
Expand Down
8 changes: 8 additions & 0 deletions erpnext/public/js/controllers/transaction.js
Original file line number Diff line number Diff line change
Expand Up @@ -1037,6 +1037,14 @@ erpnext.TransactionController = class TransactionController extends erpnext.taxe
due_date() {
// due_date is to be changed, payment terms template and/or payment schedule must
// be removed as due_date is automatically changed based on payment terms

// if there is only one row in payment schedule child table, set its due date as the due date
if (this.frm.doc.payment_schedule.length == 1){
this.frm.doc.payment_schedule[0].due_date = this.frm.doc.due_date;
this.frm.refresh_field("payment_schedule");
return
}

if (
this.frm.doc.due_date &&
!this.frm.updating_party_details &&
Expand Down

0 comments on commit 81d8f25

Please sign in to comment.