feat: base payment amount in payment schedule
diff --git a/erpnext/accounts/doctype/payment_schedule/payment_schedule.json b/erpnext/accounts/doctype/payment_schedule/payment_schedule.json
index 39eda33..e9f8ba2 100644
--- a/erpnext/accounts/doctype/payment_schedule/payment_schedule.json
+++ b/erpnext/accounts/doctype/payment_schedule/payment_schedule.json
@@ -20,10 +20,13 @@
"discount",
"section_break_9",
"payment_amount",
+ "outstanding",
+ "paid_amount",
"discounted_amount",
"column_break_3",
- "outstanding",
- "paid_amount"
+ "base_payment_amount",
+ "base_outstanding",
+ "base_paid_amount"
],
"fields": [
{
@@ -65,6 +68,7 @@
"fieldtype": "Currency",
"in_list_view": 1,
"label": "Payment Amount",
+ "options": "currency",
"reqd": 1
},
{
@@ -77,7 +81,8 @@
"depends_on": "paid_amount",
"fieldname": "paid_amount",
"fieldtype": "Currency",
- "label": "Paid Amount"
+ "label": "Paid Amount",
+ "options": "currency"
},
{
"fieldname": "column_break_3",
@@ -96,6 +101,7 @@
"fieldname": "outstanding",
"fieldtype": "Currency",
"label": "Outstanding",
+ "options": "currency",
"read_only": 1
},
{
@@ -144,12 +150,34 @@
{
"fieldname": "section_break_4",
"fieldtype": "Section Break"
+ },
+ {
+ "fieldname": "base_payment_amount",
+ "fieldtype": "Currency",
+ "label": "Payment Amount (Company Currency)",
+ "options": "Company:company:default_currency"
+ },
+ {
+ "default": "0",
+ "fieldname": "base_outstanding",
+ "fieldtype": "Currency",
+ "label": "Outstanding (Company Currency)",
+ "options": "Company:company:default_currency",
+ "read_only": 1
+ },
+ {
+ "default": "0",
+ "fieldname": "base_paid_amount",
+ "fieldtype": "Currency",
+ "label": "Paid Amount (Company Currency)",
+ "options": "Company:company:default_currency",
+ "read_only": 1
}
],
"index_web_pages_for_search": 1,
"istable": 1,
"links": [],
- "modified": "2021-04-12 15:39:47.363609",
+ "modified": "2021-04-23 13:55:59.548043",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Payment Schedule",
diff --git a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py
index 50492f5..66be11f 100644
--- a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py
+++ b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py
@@ -397,7 +397,7 @@
pi.update({
"payment_schedule": get_payment_terms("_Test Payment Term Template",
- pi.posting_date, pi.grand_total)
+ pi.posting_date, pi.grand_total, pi.base_grand_total)
})
pi.save()
diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py
index 97bcb00..d7f89b6 100644
--- a/erpnext/controllers/accounts_controller.py
+++ b/erpnext/controllers/accounts_controller.py
@@ -923,20 +923,24 @@
date = self.get("due_date")
due_date = date or posting_date
- if party_account_currency == self.company_currency:
- grand_total = self.get("base_rounded_total") or self.base_grand_total
- else:
- grand_total = self.get("rounded_total") or self.grand_total
+ base_grand_total = self.get("base_rounded_total") or self.base_grand_total
+ grand_total = self.get("rounded_total") or self.grand_total
if self.doctype in ("Sales Invoice", "Purchase Invoice"):
+ base_grand_total = base_grand_total - flt(self.base_write_off_amount)
grand_total = grand_total - flt(self.write_off_amount)
if self.get("total_advance"):
- grand_total -= self.get("total_advance")
+ if party_account_currency == self.company_currency:
+ base_grand_total -= self.get("total_advance")
+ grand_total = flt(base_grand_total / self.get("conversion_rate"), self.precision("grand_total"))
+ else:
+ grand_total -= self.get("total_advance")
+ base_grand_total = flt(grand_total * self.get("conversion_rate"), self.precision("base_grand_total"))
if not self.get("payment_schedule"):
if self.get("payment_terms_template"):
- data = get_payment_terms(self.payment_terms_template, posting_date, grand_total)
+ data = get_payment_terms(self.payment_terms_template, posting_date, grand_total, base_grand_total)
for item in data:
self.append("payment_schedule", item)
else:
@@ -946,7 +950,9 @@
for d in self.get("payment_schedule"):
if d.invoice_portion:
d.payment_amount = flt(grand_total * flt(d.invoice_portion / 100), d.precision('payment_amount'))
+ d.base_payment_amount = flt(base_grand_total * flt(d.invoice_portion / 100), d.precision('payment_amount'))
d.outstanding = d.payment_amount
+ d.base_outstanding = d.base_payment_amount
def set_due_date(self):
due_dates = [d.due_date for d in self.get("payment_schedule") if d.due_date]
@@ -982,22 +988,28 @@
if self.get("payment_schedule"):
total = 0
+ base_total = 0
for d in self.get("payment_schedule"):
total += flt(d.payment_amount)
+ base_total += flt(d.base_payment_amount)
- if party_account_currency == self.company_currency:
- total = flt(total, self.precision("base_grand_total"))
- grand_total = flt(self.get("base_rounded_total") or self.base_grand_total, self.precision('base_grand_total'))
- else:
- total = flt(total, self.precision("grand_total"))
- grand_total = flt(self.get("rounded_total") or self.grand_total, self.precision('grand_total'))
-
- if self.get("total_advance"):
- grand_total -= self.get("total_advance")
+ base_grand_total = self.get("base_rounded_total") or self.base_grand_total
+ grand_total = self.get("rounded_total") or self.grand_total
if self.doctype in ("Sales Invoice", "Purchase Invoice"):
+ base_grand_total = base_grand_total - flt(self.base_write_off_amount)
grand_total = grand_total - flt(self.write_off_amount)
- if total != flt(grand_total, self.precision("grand_total")):
+
+ if self.get("total_advance"):
+ if party_account_currency == self.company_currency:
+ base_grand_total -= self.get("total_advance")
+ grand_total = flt(base_grand_total / self.get("conversion_rate"), self.precision("grand_total"))
+ else:
+ grand_total -= self.get("total_advance")
+ base_grand_total = flt(grand_total * self.get("conversion_rate"), self.precision("base_grand_total"))
+
+ if total != flt(grand_total, self.precision("grand_total")) or \
+ base_total != flt(base_grand_total, self.precision("base_grand_total")):
frappe.throw(_("Total Payment Amount in Payment Schedule must be equal to Grand / Rounded Total"))
def is_rounded_total_disabled(self):
@@ -1237,7 +1249,7 @@
@frappe.whitelist()
-def get_payment_terms(terms_template, posting_date=None, grand_total=None, bill_date=None):
+def get_payment_terms(terms_template, posting_date=None, grand_total=None, base_grand_total=None, bill_date=None):
if not terms_template:
return
@@ -1245,14 +1257,14 @@
schedule = []
for d in terms_doc.get("terms"):
- term_details = get_payment_term_details(d, posting_date, grand_total, bill_date)
+ term_details = get_payment_term_details(d, posting_date, grand_total, base_grand_total, bill_date)
schedule.append(term_details)
return schedule
@frappe.whitelist()
-def get_payment_term_details(term, posting_date=None, grand_total=None, bill_date=None):
+def get_payment_term_details(term, posting_date=None, grand_total=None, base_grand_total=None, bill_date=None):
term_details = frappe._dict()
if isinstance(term, text_type):
term = frappe.get_doc("Payment Term", term)
@@ -1261,10 +1273,11 @@
term_details.description = term.description
term_details.invoice_portion = term.invoice_portion
term_details.payment_amount = flt(term.invoice_portion) * flt(grand_total) / 100
+ term_details.base_payment_amount = flt(term.invoice_portion) * flt(base_grand_total) / 100
term_details.discount_type = term.discount_type
term_details.discount = term.discount
- # term_details.discounted_amount = flt(grand_total) * (term.discount / 100) if term.discount_type == 'Percentage' else discount
term_details.outstanding = term_details.payment_amount
+ term_details.base_outstanding = term_details.base_payment_amount
term_details.mode_of_payment = term.mode_of_payment
if bill_date:
diff --git a/erpnext/public/js/controllers/transaction.js b/erpnext/public/js/controllers/transaction.js
index a0398e7..258262a 100644
--- a/erpnext/public/js/controllers/transaction.js
+++ b/erpnext/public/js/controllers/transaction.js
@@ -1995,6 +1995,7 @@
terms_template: doc.payment_terms_template,
posting_date: posting_date,
grand_total: doc.rounded_total || doc.grand_total,
+ base_grand_total: doc.base_rounded_total || doc.base_grand_total,
bill_date: doc.bill_date
},
callback: function(r) {
@@ -2009,13 +2010,15 @@
payment_term: function(doc, cdt, cdn) {
var row = locals[cdt][cdn];
if(row.payment_term) {
+ debugger;
frappe.call({
method: "erpnext.controllers.accounts_controller.get_payment_term_details",
args: {
term: row.payment_term,
bill_date: this.frm.doc.bill_date,
posting_date: this.frm.doc.posting_date || this.frm.doc.transaction_date,
- grand_total: this.frm.doc.rounded_total || this.frm.doc.grand_total
+ grand_total: this.frm.doc.rounded_total || this.frm.doc.grand_total,
+ base_grand_total: this.frm.doc.base_rounded_total || this.frm.doc.base_grand_total
},
callback: function(r) {
if(r.message && !r.exc) {