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):