Cleanup and fixes of payment terms feature
diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.py b/erpnext/accounts/doctype/payment_entry/payment_entry.py
index 929e1cd..36ff0ac 100644
--- a/erpnext/accounts/doctype/payment_entry/payment_entry.py
+++ b/erpnext/accounts/doctype/payment_entry/payment_entry.py
@@ -505,12 +505,10 @@
 	company_currency = frappe.db.get_value("Company", args.get("company"), "default_currency")
 
 	# Get negative outstanding sales /purchase invoices
-	total_field = "base_grand_total" if party_account_currency == company_currency else "grand_total"
-
 	negative_outstanding_invoices = []
-	if (args.get("party_type") != "Student"):
+	if args.get("party_type") not in ["Student", "Employee"]:
 		negative_outstanding_invoices = get_negative_outstanding_invoices(args.get("party_type"),
-			args.get("party"), args.get("party_account"), total_field)
+			args.get("party"), args.get("party_account"), party_account_currency, company_currency)
 
 	# Get positive outstanding sales /purchase invoices/ Fees
 	outstanding_invoices = get_outstanding_invoices(args.get("party_type"), args.get("party"),
@@ -580,28 +578,34 @@
 
 	return order_list
 
-def get_negative_outstanding_invoices(party_type, party, party_account, total_field):
-	if party_type != "Employee":
-		voucher_type = "Sales Invoice" if party_type == "Customer" else "Purchase Invoice"
-		return frappe.db.sql("""
-			select
-				"{voucher_type}" as voucher_type, name as voucher_no,
-				{total_field} as invoice_amount, outstanding_amount, posting_date,
-				due_date, conversion_rate as exchange_rate
-			from
-				`tab{voucher_type}`
-			where
-				{party_type} = %s and {party_account} = %s and docstatus = 1 and outstanding_amount < 0
-			order by
-				posting_date, name
-			""".format(**{
-				"total_field": total_field,
-				"voucher_type": voucher_type,
-				"party_type": scrub(party_type),
-				"party_account": "debit_to" if party_type == "Customer" else "credit_to"
-			}), (party, party_account), as_dict=True)
+def get_negative_outstanding_invoices(party_type, party, party_account, party_account_currency, company_currency):
+	voucher_type = "Sales Invoice" if party_type == "Customer" else "Purchase Invoice"
+	if party_account_currency == company_currency:
+		grand_total_field = "base_grand_total"
+		rounded_total_field = "base_rounded_total"
 	else:
-		return []
+		grand_total_field = "grand_total"
+		rounded_total_field = "rounded_total"
+
+	return frappe.db.sql("""
+		select
+			"{voucher_type}" as voucher_type, name as voucher_no,
+			if({rounded_total_field}, {rounded_total_field}, {grand_total_field}) as invoice_amount,
+			outstanding_amount, posting_date,
+			due_date, conversion_rate as exchange_rate
+		from
+			`tab{voucher_type}`
+		where
+			{party_type} = %s and {party_account} = %s and docstatus = 1 and outstanding_amount < 0
+		order by
+			posting_date, name
+		""".format(**{
+			"rounded_total_field": rounded_total_field,
+			"grand_total_field": grand_total_field,
+			"voucher_type": voucher_type,
+			"party_type": scrub(party_type),
+			"party_account": "debit_to" if party_type == "Customer" else "credit_to"
+		}), (party, party_account), as_dict=True)
 
 @frappe.whitelist()
 def get_party_details(company, party_type, party, date):
@@ -721,7 +725,10 @@
 	if party_amount:
 		grand_total = outstanding_amount = party_amount
 	elif dt in ("Sales Invoice", "Purchase Invoice"):
-		grand_total = doc.base_grand_total if party_account_currency == doc.company_currency else doc.grand_total
+		if party_account_currency == doc.company_currency:
+			grand_total = doc.base_rounded_total or doc.base_grand_total
+		else:
+			grand_total = doc.rounded_total or doc.grand_total
 		outstanding_amount = doc.outstanding_amount
 	elif dt in ("Expense Claim"):
 		grand_total = doc.total_sanctioned_amount
@@ -730,8 +737,10 @@
 		grand_total = doc.grand_total
 		outstanding_amount = doc.outstanding_amount
 	else:
-		total_field = "base_grand_total" if party_account_currency == doc.company_currency else "grand_total"
-		grand_total = flt(doc.get(total_field))
+		if party_account_currency == doc.company_currency:
+			grand_total = flt(doc.get("base_rounded_total") or doc.base_grand_total)
+		else:
+			grand_total = flt(doc.get("rounded_total") or doc.grand_total)
 		outstanding_amount = grand_total - flt(doc.advance_paid)
 
 	# bank or cash
diff --git a/erpnext/accounts/doctype/payment_schedule/payment_schedule.json b/erpnext/accounts/doctype/payment_schedule/payment_schedule.json
index b068f21..b34f894 100644
--- a/erpnext/accounts/doctype/payment_schedule/payment_schedule.json
+++ b/erpnext/accounts/doctype/payment_schedule/payment_schedule.json
@@ -93,7 +93,7 @@
    "label": "Due Date", 
    "length": 0, 
    "no_copy": 0, 
-   "options": "payment_term.due_date", 
+   "options": "", 
    "permlevel": 0, 
    "precision": "", 
    "print_hide": 0, 
@@ -129,7 +129,7 @@
    "precision": "", 
    "print_hide": 0, 
    "print_hide_if_no_value": 0, 
-   "read_only": 1, 
+   "read_only": 0, 
    "remember_last_selected_value": 0, 
    "report_hide": 0, 
    "reqd": 0, 
@@ -179,7 +179,7 @@
  "issingle": 0, 
  "istable": 1, 
  "max_attachments": 0, 
- "modified": "2017-09-26 05:13:54.187475", 
+ "modified": "2017-11-21 19:23:08.490659", 
  "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 22a2535..a829896 100644
--- a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py
+++ b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py
@@ -255,6 +255,7 @@
 		self.assertEqual(pi.outstanding_amount, 1212.30)
 
 		pi.disable_rounded_total = 0
+		pi.get("payment_schedule")[0].payment_amount = 1512.0
 		pi.save()
 		self.assertEqual(pi.outstanding_amount, 1212.0)
 
@@ -279,7 +280,7 @@
 		jv.submit()
 
 		pi = frappe.copy_doc(test_records[0])
-
+		pi.disable_rounded_total = 1
 		pi.append("advances", {
 			"reference_type": "Journal Entry",
 			"reference_name": jv.name,
@@ -290,9 +291,10 @@
 		})
 		pi.insert()
 
-		pi.update(
-			{"payment_schedule": get_payment_terms("_Test Payment Term Template", pi.posting_date, pi.grand_total)}
-		)
+		pi.update({
+			"payment_schedule": get_payment_terms("_Test Payment Term Template",
+				pi.posting_date, pi.grand_total)
+		})
 
 		pi.save()
 		pi.submit()
@@ -619,7 +621,7 @@
 			"invoice_portion": 40.00
 		})
 		pi.append("payment_schedule", {
-			"due_date": add_days(nowdate(), 45),
+			"due_date": add_days(nowdate(), 25),
 			"payment_amount": 150,
 			"invoice_portion": 60.00
 		})
@@ -634,7 +636,7 @@
 
 		expected_gl_entries = sorted([
 			[pi.credit_to, 0.0, 100.0, add_days(nowdate(), 15)],
-			[pi.credit_to, 0.0, 150.0, add_days(nowdate(), 45)],
+			[pi.credit_to, 0.0, 150.0, add_days(nowdate(), 25)],
 			["_Test Account Cost for Goods Sold - _TC", 250.0, 0.0, None]
 		])
 
diff --git a/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py
index f00e60e..2c85172 100644
--- a/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py
+++ b/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py
@@ -64,7 +64,7 @@
 		si.insert()
 
 		self.assertTrue(si.payment_schedule)
-		self.assertEqual(si.payment_schedule[0].due_date, si.due_date)
+		self.assertEqual(getdate(si.payment_schedule[0].due_date), getdate(si.due_date))
 
 	def test_sales_invoice_calculation_base_currency(self):
 		si = frappe.copy_doc(test_records[2])
diff --git a/erpnext/accounts/party.py b/erpnext/accounts/party.py
index 5af63eb..7bccfe8 100644
--- a/erpnext/accounts/party.py
+++ b/erpnext/accounts/party.py
@@ -320,7 +320,8 @@
 				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)))
+				frappe.throw(_("Due / Reference Date cannot be after {0}")
+					.format(formatdate(default_due_date)))
 
 @frappe.whitelist()
 def set_taxes(party, party_type, posting_date, company, customer_group=None, supplier_type=None,
diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py
index a352e4c..fa8e356 100644
--- a/erpnext/controllers/accounts_controller.py
+++ b/erpnext/controllers/accounts_controller.py
@@ -26,9 +26,12 @@
 		return self.__company_currency
 
 	def onload(self):
-		self.get("__onload").make_payment_via_journal_entry = frappe.db.get_single_value('Accounts Settings', 'make_payment_via_journal_entry')
+		self.get("__onload").make_payment_via_journal_entry \
+			= frappe.db.get_single_value('Accounts Settings', 'make_payment_via_journal_entry')
+
 		if self.is_new():
-			relevant_docs = ("Quotation", "Purchase Order", "Sales Order", "Purchase Invoice", "Purchase Order")
+			relevant_docs = ("Quotation", "Purchase Order", "Sales Order",
+				"Purchase Invoice", "Sales Invoice")
 			if self.doctype in relevant_docs:
 				self.set_payment_schedule()
 
@@ -59,21 +62,18 @@
 			self.validate_paid_amount()
 
 	def validate_invoice_documents_schedule(self):
-		if self.get("payment_schedule"):
-			self.set_due_date()
-			self.validate_payment_schedule()
-		else:
-			self.set_payment_schedule()
-			self.set_due_date()
+		self.validate_payment_schedule_dates()
+		self.set_due_date()
+		self.validate_invoice_portion()
+		self.set_payment_schedule()
+		self.validate_payment_schedule_amount()
 		self.validate_due_date()
 		self.validate_advance_entries()
 
 	def validate_non_invoice_documents_schedule(self):
-		if self.get("payment_schedule"):
-			self.validate_invoice_portion()
-			self.validate_payment_schedule_amount()
-		else:
-			self.set_payment_schedule()
+		self.validate_invoice_portion()
+		self.set_payment_schedule()
+		self.validate_payment_schedule_amount()
 
 	def validate_all_documents_schedule(self):
 		if self.doctype in ("Sales Invoice", "Purchase Invoice") and not self.is_return:
@@ -628,22 +628,24 @@
 		posting_date = self.get("posting_date") or self.get("transaction_date")
 		date = self.get("due_date")
 		due_date = date or posting_date
+		grand_total = self.get("rounded_total") or self.grand_total
 
-		if self.get("payment_terms_template") and not self.get("payment_schedule"):
-			data = get_payment_terms(self.payment_terms_template, posting_date, self.grand_total)
-			for item in data:
-				self.append("payment_schedule", item)
-		elif not self.get("payment_schedule"):
-			data = dict(due_date=due_date, invoice_portion=100, payment_amount=self.grand_total)
-			self.append("payment_schedule", data)
+		if not self.get("payment_schedule"):
+			if self.get("payment_terms_template"):
+				data = get_payment_terms(self.payment_terms_template, posting_date, grand_total)
+				for item in data:
+					self.append("payment_schedule", item)
+			else:
+				data = dict(due_date=due_date, invoice_portion=100, payment_amount=grand_total)
+				self.append("payment_schedule", data)
+		else:
+			for d in self.get("payment_schedule"):
+				d.payment_amount = grand_total * flt(d.invoice_portion) / 100
 
 	def set_due_date(self):
-		self.due_date = max([d.due_date for d in self.get("payment_schedule")])
-
-	def validate_payment_schedule(self):
-		self.validate_payment_schedule_dates()
-		self.validate_invoice_portion()
-		self.validate_payment_schedule_amount()
+		due_dates = [d.due_date for d in self.get("payment_schedule") if d.due_date]
+		if due_dates:
+			self.due_date = max(due_dates)
 
 	def validate_payment_schedule_dates(self):
 		dates = []
@@ -661,24 +663,27 @@
 
 		if li:
 			duplicates = '<br>' + '<br>'.join(li)
-			frappe.throw(_("Rows with duplicate due dates in other rows were found: {list}").format(list=duplicates))
-
+			frappe.throw(_("Rows with duplicate due dates in other rows were found: {list}")
+				.format(list=duplicates))
 
 	def validate_payment_schedule_amount(self):
-		total = 0
-		for d in self.get("payment_schedule"):
-			total += flt(d.payment_amount)
+		if self.get("payment_schedule"):
+			total = 0
+			for d in self.get("payment_schedule"):
+				total += flt(d.payment_amount)
 
-		if total != self.grand_total:
-			frappe.throw(_("Total Payment Amount in Payment Schedule must be equal to Grand Total"))
+			grand_total = self.get("rounded_total") or self.grand_total
+			if total != grand_total:
+				frappe.throw(_("Total Payment Amount in Payment Schedule must be equal to Grand / Rounded Total"))
 
 	def validate_invoice_portion(self):
-		total_portion = 0
-		for term in self.payment_schedule:
-			total_portion += flt(term.get('invoice_portion', 0))
+		if self.get("payment_schedule"):
+			total_portion = 0
+			for term in self.payment_schedule:
+				total_portion += flt(term.get('invoice_portion', 0))
 
-		if flt(total_portion, 2) != 100.00:
-			frappe.msgprint(_('Combined invoice portion must equal 100%'), raise_exception=1, indicator='red')
+			if flt(total_portion, 2) != 100.00:
+				frappe.throw(_('Combined invoice portion must equal 100%'), indicator='red')
 
 	def is_rounded_total_disabled(self):
 		if self.meta.get_field("disable_rounded_total"):
diff --git a/erpnext/patches.txt b/erpnext/patches.txt
index 923b25d..04dfe9f 100644
--- a/erpnext/patches.txt
+++ b/erpnext/patches.txt
@@ -460,12 +460,8 @@
 erpnext.patches.v9_0.set_pos_profile_name
 erpnext.patches.v9_0.remove_non_existing_warehouse_from_stock_settings
 execute:frappe.delete_doc_if_exists("DocType", "Program Fee")
-erpnext.patches.v8_10.add_due_date_to_gle
 erpnext.patches.v8_10.update_gl_due_date_for_pi_and_si
-erpnext.patches.v8_10.add_payment_terms_field_to_supplier
 erpnext.patches.v8_10.change_default_customer_credit_days
-erpnext.patches.v8_10.add_payment_terms_field_to_supplier_type
-erpnext.patches.v8_10.change_default_supplier_type_credit_days
 erpnext.patches.v9_0.update_employee_loan_details
 erpnext.patches.v9_2.delete_healthcare_domain_default_items
 erpnext.patches.v9_1.create_issue_opportunity_type
diff --git a/erpnext/patches/v8_10/add_due_date_to_gle.py b/erpnext/patches/v8_10/add_due_date_to_gle.py
deleted file mode 100644
index ec5e003..0000000
--- a/erpnext/patches/v8_10/add_due_date_to_gle.py
+++ /dev/null
@@ -1,7 +0,0 @@
-from __future__ import unicode_literals
-import frappe
-
-
-def execute():
-	if not frappe.db.has_column("GL Entry", "due_date"):
-		frappe.db.sql("ALTER TABLE `tabGL Entry` ADD COLUMN `due_date` DATE NULL")
diff --git a/erpnext/patches/v8_10/add_payment_terms_field_to_supplier.py b/erpnext/patches/v8_10/add_payment_terms_field_to_supplier.py
deleted file mode 100644
index b507b2a..0000000
--- a/erpnext/patches/v8_10/add_payment_terms_field_to_supplier.py
+++ /dev/null
@@ -1,9 +0,0 @@
-from __future__ import unicode_literals
-import frappe
-
-
-def execute():
-	if not frappe.db.has_column("Customer", "payment_terms"):
-		frappe.db.sql("ALTER TABLE `tabCustomer` ADD COLUMN `payment_terms` VARCHAR(140) NULL")
-	if not frappe.db.has_column("Supplier", "payment_terms"):
-		frappe.db.sql("ALTER TABLE `tabSupplier` ADD COLUMN `payment_terms` VARCHAR(140) NULL")
diff --git a/erpnext/patches/v8_10/add_payment_terms_field_to_supplier_type.py b/erpnext/patches/v8_10/add_payment_terms_field_to_supplier_type.py
deleted file mode 100644
index 78b8943..0000000
--- a/erpnext/patches/v8_10/add_payment_terms_field_to_supplier_type.py
+++ /dev/null
@@ -1,7 +0,0 @@
-from __future__ import unicode_literals
-import frappe
-
-
-def execute():
-	if not frappe.db.has_column("Supplier Type", "payment_terms"):
-		frappe.db.sql("ALTER TABLE `tabSupplier Type` ADD COLUMN `payment_terms` VARCHAR(140) NULL")
diff --git a/erpnext/patches/v8_10/change_default_customer_credit_days.py b/erpnext/patches/v8_10/change_default_customer_credit_days.py
index 9008a43..d2bc3ec 100644
--- a/erpnext/patches/v8_10/change_default_customer_credit_days.py
+++ b/erpnext/patches/v8_10/change_default_customer_credit_days.py
@@ -3,67 +3,49 @@
 
 
 def execute():
+	frappe.reload_doc("selling", "doctype", "customer")
+	frappe.reload_doc("buying", "doctype", "supplier")
+	frappe.reload_doc("setup", "doctype", "supplier_type")
 	frappe.reload_doc("accounts", "doctype", "payment_term")
 	frappe.reload_doc("accounts", "doctype", "payment_terms_template_detail")
 	frappe.reload_doc("accounts", "doctype", "payment_terms_template")
 
 	payment_terms = []
-	customers = []
-	suppliers = []
-	credit_days = frappe.db.sql(
-		"SELECT DISTINCT `credit_days`, `credit_days_based_on`, `customer_name` from "
-		"`tabCustomer` where credit_days_based_on='Fixed Days' or "
-		"credit_days_based_on='Last Day of the Next Month'")
+	records = []
+	for doctype in ("Customer", "Supplier", "Supplier Type"):
+		credit_days = frappe.db.sql("""
+			SELECT DISTINCT `credit_days`, `credit_days_based_on`, `name`
+			from `tab{0}`
+			where
+				(credit_days_based_on='Fixed Days' and credit_days is not null)
+				or credit_days_based_on='Last Day of the Next Month'
+		""".format(doctype))
 
-	credit_records = ((record[0], record[1], record[2]) for record in credit_days)
-	for days, based_on, customer_name in credit_records:
-		payment_term = make_payment_term(days, based_on)
-		template = make_template(payment_term)
-		payment_terms.append('WHEN `customer_name`="%s" THEN "%s"' % (customer_name, template.template_name))
-		customers.append(customer_name)
+		credit_records = ((record[0], record[1], record[2]) for record in credit_days)
+		for days, based_on, party_name in credit_records:
+			if based_on == "Fixed Days":
+				pyt_template_name = 'Default Payment Term - N{0}'.format(days)
+			else:
+				pyt_template_name = 'Default Payment Term - EO2M'
 
-	begin_query_str = "UPDATE `tabCustomer` SET `payment_terms` = CASE "
-	value_query_str = " ".join(payment_terms)
-	cond_query_str = " ELSE `payment_terms` END WHERE "
+			if not frappe.db.exists("Payment Terms Template", pyt_template_name):
+				payment_term = make_payment_term(days, based_on)
+				template = make_template(payment_term)
+			else:
+				template = frappe.get_doc("Payment Terms Template", pyt_template_name)
 
-	if customers:
-		frappe.db.sql(
-			begin_query_str + value_query_str + cond_query_str + '`customer_name` IN %s',
-			(customers,)
-		)
+			payment_terms.append('WHEN `name`="%s" THEN "%s"' % (party_name, template.template_name))
+			records.append(party_name)
 
-	# reset
-	payment_terms = []
-	credit_days = frappe.db.sql(
-		"SELECT DISTINCT `credit_days`, `credit_days_based_on`, `supplier_name` from "
-		"`tabSupplier` where credit_days_based_on='Fixed Days' or "
-		"credit_days_based_on='Last Day of the Next Month'")
+		begin_query_str = "UPDATE `tab{0}` SET `payment_terms` = CASE ".format(doctype)
+		value_query_str = " ".join(payment_terms)
+		cond_query_str = " ELSE `payment_terms` END WHERE "
 
-	credit_records = ((record[0], record[1], record[2]) for record in credit_days)
-	for days, based_on, supplier_name in credit_records:
-		if based_on == "Fixed Days":
-			pyt_template_name = 'Default Payment Term - N{0}'.format(days)
-		else:
-			pyt_template_name = 'Default Payment Term - EO2M'
-
-		if not frappe.db.exists("Payment Term Template", pyt_template_name):
-			payment_term = make_payment_term(days, based_on)
-			template = make_template(payment_term)
-		else:
-			template = frappe.get_doc("Payment Term Template", pyt_template_name)
-
-		payment_terms.append('WHEN `supplier_name`="%s" THEN "%s"' % (supplier_name, template.template_name))
-		suppliers.append(supplier_name)
-
-	begin_query_str = "UPDATE `tabSupplier` SET `payment_terms` = CASE "
-	value_query_str = " ".join(payment_terms)
-	cond_query_str = " ELSE `payment_terms` END WHERE "
-
-	if suppliers:
-		frappe.db.sql(
-			begin_query_str + value_query_str + cond_query_str + '`supplier_name` IN %s',
-			(suppliers,)
-		)
+		if records:
+			frappe.db.sql(
+				begin_query_str + value_query_str + cond_query_str + '`name` IN %s',
+				(records,)
+			)
 
 
 def make_template(payment_term):
diff --git a/erpnext/patches/v8_10/change_default_supplier_type_credit_days.py b/erpnext/patches/v8_10/change_default_supplier_type_credit_days.py
deleted file mode 100644
index 448bdbe..0000000
--- a/erpnext/patches/v8_10/change_default_supplier_type_credit_days.py
+++ /dev/null
@@ -1,39 +0,0 @@
-import frappe
-from erpnext.patches.v8_10.change_default_customer_credit_days import make_payment_term, make_template
-
-
-def execute():
-	payment_terms = []
-	supplier_types = []
-
-	credit_days = frappe.db.sql(
-		"SELECT DISTINCT `credit_days`, `credit_days_based_on`, `supplier_type` from "
-		"`tabSupplier Type` where credit_days_based_on='Fixed Days' or "
-		"credit_days_based_on='Last Day of the Next Month'")
-
-	records = ((record[0], record[1], record[2]) for record in credit_days)
-
-	for days, based_on, supplier_type in records:
-		if based_on == "Fixed Days":
-			pyt_term_name = 'N{0}'.format(days)
-		else:
-			pyt_term_name = 'EO2M'
-
-		if not frappe.db.exists("Payment Term", pyt_term_name):
-			payment_term = make_payment_term(days, based_on)
-			make_template(payment_term)
-		else:
-			payment_term = frappe.get_doc("Payment Term", pyt_term_name)
-
-		payment_terms.append('WHEN `supplier_type`="%s" THEN "%s"' % (supplier_type, payment_term.payment_term_name))
-		supplier_types.append(supplier_type)
-
-	begin_query_str = "UPDATE `tabSupplier Type` SET `payment_terms` = CASE "
-	value_query_str = " ".join(payment_terms)
-	cond_query_str = " ELSE `payment_terms` END WHERE "
-
-	if supplier_types:
-		frappe.db.sql(
-			begin_query_str + value_query_str + cond_query_str + '`supplier_type` IN %s',
-			(supplier_types,)
-		)
diff --git a/erpnext/patches/v8_10/update_gl_due_date_for_pi_and_si.py b/erpnext/patches/v8_10/update_gl_due_date_for_pi_and_si.py
index f54ff80..8596e66 100644
--- a/erpnext/patches/v8_10/update_gl_due_date_for_pi_and_si.py
+++ b/erpnext/patches/v8_10/update_gl_due_date_for_pi_and_si.py
@@ -6,6 +6,8 @@
 
 
 def execute():
+	frappe.reload_doc("accounts", "doctype", "gl_entry")
+
 	kwargs = get_query_kwargs()
 
 	for kwarg in kwargs:
diff --git a/erpnext/public/js/controllers/transaction.js b/erpnext/public/js/controllers/transaction.js
index b70e467..91aafc9 100644
--- a/erpnext/public/js/controllers/transaction.js
+++ b/erpnext/public/js/controllers/transaction.js
@@ -1153,7 +1153,7 @@
 				args: {
 					terms_template: this.frm.doc.payment_terms_template,
 					posting_date: this.frm.doc.posting_date || this.frm.doc.transaction_date,
-					grand_total: this.frm.doc.grand_total
+					grand_total: this.frm.doc.rounded_total || this.frm.doc.grand_total
 				},
 				callback: function(r) {
 					if(r.message && !r.exc) {
@@ -1172,7 +1172,7 @@
 				args: {
 					term: row.payment_term,
 					posting_date: this.frm.doc.posting_date || this.frm.doc.transaction_date,
-					grand_total: this.frm.doc.grand_total
+					grand_total: this.frm.doc.rounded_total || this.frm.doc.grand_total
 				},
 				callback: function(r) {
 					if(r.message && !r.exc) {