fix: Fetch Payment Terms from Sales/Purchase Orders
diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py
index 147785a..28a9bdd 100644
--- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py
+++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py
@@ -1142,49 +1142,6 @@
 		if update:
 			self.db_set('status', self.status, update_modified = update_modified)
 
-@frappe.whitelist()
-def set_payment_terms_from_po(doc):
-	if isinstance(doc, six.string_types):
-		doc = json.loads(doc)
-
-	purchase_order = doc.get('items')[0].get('purchase_order')
-	
-	if purchase_order and all_items_have_same_po(doc, purchase_order):
-		purchase_order = frappe.get_cached_doc('Purchase Order', purchase_order)
-	else:
-		return
-
-	if has_default_payment_terms(doc) and not has_default_payment_terms(purchase_order):
-		doc['payment_schedule'] = []
-		doc['payment_terms_template'] = purchase_order.payment_terms_template
-
-		for schedule in purchase_order.payment_schedule:
-			payment_schedule = {
-				'payment_term': schedule.payment_term,
-				'due_date': schedule.due_date,
-				'invoice_portion': schedule.invoice_portion,
-				'discount_type': schedule.discount_type,
-				'discount': schedule.discount,
-				'base_payment_amount': schedule.base_payment_amount,
-				'payment_amount': schedule.payment_amount,
-				'outstanding': schedule.outstanding
-			}
-			doc['payment_schedule'].append(payment_schedule)
-
-		return doc
-
-def all_items_have_same_po(doc, purchase_order):
-	for item in doc.get('items'):
-		if item.get('purchase_order') != purchase_order:
-			return False
-	
-	return True
-
-def has_default_payment_terms(doc):
-	if doc.get('payment_schedule')[0].get('invoice_portion') == 100:
-		return True
-	return False
-
 # to get details of purchase invoice/receipt from which this doc was created for exchange rate difference handling
 def get_purchase_document_details(doc):
 	if doc.doctype == 'Purchase Invoice':
diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.py b/erpnext/buying/doctype/purchase_order/purchase_order.py
index eaa502f..a0bac51 100644
--- a/erpnext/buying/doctype/purchase_order/purchase_order.py
+++ b/erpnext/buying/doctype/purchase_order/purchase_order.py
@@ -443,6 +443,8 @@
 	frappe.response.location = '/purchase-invoices/' + doc.name
 
 def get_mapped_purchase_invoice(source_name, target_doc=None, ignore_permissions=False):
+	from erpnext.controllers.accounts_controller import fetch_payment_terms_from_order	
+
 	def postprocess(source, target):
 		target.flags.ignore_permissions = ignore_permissions
 		set_missing_values(source, target)
@@ -489,15 +491,13 @@
 		},
 	}
 
-	if frappe.get_single("Accounts Settings").automatically_fetch_payment_terms == 1:
-		fields["Payment Schedule"] = {
-			"doctype": "Payment Schedule",
-			"add_if_empty": True
-		}
-
 	doc = get_mapped_doc("Purchase Order", source_name,	fields,
 		target_doc, postprocess, ignore_permissions=ignore_permissions)
 
+	automatically_fetch_payment_terms = cint(frappe.db.get_single_value('Accounts Settings', 'automatically_fetch_payment_terms'))
+	if automatically_fetch_payment_terms:
+		fetch_payment_terms_from_order(doc)
+
 	return doc
 
 @frappe.whitelist()
diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py
index cdd865a..f7ea77b 100644
--- a/erpnext/controllers/accounts_controller.py
+++ b/erpnext/controllers/accounts_controller.py
@@ -1803,3 +1803,46 @@
 @erpnext.allow_regional
 def validate_einvoice_fields(doc):
 	pass
+
+def fetch_payment_terms_from_order(doc):
+	"""
+		Fetch Payment Terms from Purchase/Sales Order on creating a new Purchase/Sales Invoice.
+	"""
+
+	if doc.doctype == "Sales Invoice":
+		po_or_so = doc.get('items')[0].get('sales_order')
+		po_or_so_doctype = "Sales Order"
+		po_or_so_doctype_name = "sales_order"
+	else:
+		po_or_so = doc.get('items')[0].get('purchase_order')
+		po_or_so_doctype = "Purchase Order"
+		po_or_so_doctype_name = "purchase_order"
+
+	if po_or_so and all_items_have_same_po_or_so(doc, po_or_so, po_or_so_doctype_name):
+		po_or_so = frappe.get_cached_doc(po_or_so_doctype, po_or_so)
+	else:
+		doc.set_payment_schedule()
+		return
+
+	doc.payment_schedule = []
+	doc.payment_terms_template = po_or_so.payment_terms_template
+
+	for schedule in po_or_so.payment_schedule:
+		payment_schedule = {
+			'payment_term': schedule.payment_term,
+			'due_date': schedule.due_date,
+			'invoice_portion': schedule.invoice_portion,
+			'discount_type': schedule.discount_type,
+			'discount': schedule.discount,
+			'base_payment_amount': schedule.base_payment_amount,
+			'payment_amount': schedule.payment_amount,
+			'outstanding': schedule.outstanding
+		}
+		doc.append("payment_schedule", payment_schedule)
+
+def all_items_have_same_po_or_so(doc, po_or_so, po_or_so_fieldname):
+	for item in doc.get('items'):
+		if item.get(po_or_so_fieldname) != po_or_so:
+			return False
+	
+	return True
\ No newline at end of file
diff --git a/erpnext/selling/doctype/sales_order/sales_order.py b/erpnext/selling/doctype/sales_order/sales_order.py
index 41f57a3..a58c381 100755
--- a/erpnext/selling/doctype/sales_order/sales_order.py
+++ b/erpnext/selling/doctype/sales_order/sales_order.py
@@ -621,6 +621,8 @@
 
 @frappe.whitelist()
 def make_sales_invoice(source_name, target_doc=None, ignore_permissions=False):
+	from erpnext.controllers.accounts_controller import fetch_payment_terms_from_order
+
 	def postprocess(source, target):
 		set_missing_values(source, target)
 		#Get the advance paid Journal Entries in Sales Invoice Advance
@@ -693,6 +695,10 @@
 		}
 	}, target_doc, postprocess, ignore_permissions=ignore_permissions)
 
+	automatically_fetch_payment_terms = cint(frappe.db.get_single_value('Accounts Settings', 'automatically_fetch_payment_terms'))
+	if automatically_fetch_payment_terms:
+		fetch_payment_terms_from_order(doclist)
+
 	return doclist
 
 @frappe.whitelist()
diff --git a/erpnext/stock/doctype/delivery_note/delivery_note.py b/erpnext/stock/doctype/delivery_note/delivery_note.py
index 4808e94..1628f93 100644
--- a/erpnext/stock/doctype/delivery_note/delivery_note.py
+++ b/erpnext/stock/doctype/delivery_note/delivery_note.py
@@ -414,6 +414,8 @@
 
 @frappe.whitelist()
 def make_sales_invoice(source_name, target_doc=None):
+	from erpnext.controllers.accounts_controller import fetch_payment_terms_from_order
+
 	doc = frappe.get_doc('Delivery Note', source_name)
 
 	to_make_invoice_qty_map = {}
@@ -503,6 +505,10 @@
 		}
 	}, target_doc, set_missing_values)
 
+	automatically_fetch_payment_terms = cint(frappe.db.get_single_value('Accounts Settings', 'automatically_fetch_payment_terms'))
+	if automatically_fetch_payment_terms:
+		fetch_payment_terms_from_order(doc)
+
 	return doc
 
 @frappe.whitelist()
diff --git a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py
index 82c87a8..cf6cac2 100644
--- a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py
+++ b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py
@@ -583,6 +583,7 @@
 @frappe.whitelist()
 def make_purchase_invoice(source_name, target_doc=None):
 	from erpnext.accounts.party import get_payment_terms_template
+	from erpnext.controllers.accounts_controller import fetch_payment_terms_from_order
 
 	doc = frappe.get_doc('Purchase Receipt', source_name)
 	returned_qty_map = get_returned_qty_map(source_name)
@@ -654,6 +655,10 @@
 		}
 	}, target_doc, set_missing_values)
 
+	automatically_fetch_payment_terms = cint(frappe.db.get_single_value('Accounts Settings', 'automatically_fetch_payment_terms'))
+	if automatically_fetch_payment_terms:
+		fetch_payment_terms_from_order(doclist)
+
 	return doclist
 
 def get_invoiced_qty_map(purchase_receipt):