feat: Fetch Payment Terms from linked Purchase Order

This commit is contained in:
GangaManoj 2021-07-09 00:53:42 +05:30
parent d45ebaf61c
commit 5a62467a3e
2 changed files with 59 additions and 1 deletions

View File

@ -508,6 +508,8 @@ frappe.ui.form.on("Purchase Invoice", {
}
}
}
frm.events.set_payment_terms(frm);
},
refresh: function(frm) {
@ -570,4 +572,21 @@ frappe.ui.form.on("Purchase Invoice", {
company: function(frm) {
erpnext.accounts.dimensions.update_dimension(frm, frm.doctype);
},
})
set_payment_terms: function (frm) {
frappe.call({
'method': 'erpnext.accounts.doctype.purchase_invoice.purchase_invoice.set_payment_terms_from_po',
'args': {
doc: frm.doc
},
'callback': (r) => {
if (r.message) {
var doc = frappe.model.sync(r.message)[0];
console.log("doc: ", doc)
frappe.set_route("Form", doc.doctype, doc.name);
}
}
});
},
})

View File

@ -7,6 +7,8 @@ import frappe, erpnext
from frappe.utils import cint, cstr, formatdate, flt, getdate, nowdate, get_link_to_form
from frappe import _, throw
import frappe.defaults
import json
import six
from erpnext.assets.doctype.asset_category.asset_category import get_asset_category_account
from erpnext.controllers.buying_controller import BuyingController
@ -1171,6 +1173,43 @@ class PurchaseInvoice(BuyingController):
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 linked_po_has_payment_terms(doc, purchase_order) and all_items_have_same_po(doc, purchase_order):
purchase_order = frappe.get_cached_doc('Purchase Order', purchase_order)
doc['payment_terms_template'] = purchase_order.payment_terms_template
doc['terms'] = 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 linked_po_has_payment_terms(doc, purchase_order):
return not doc.get('payment_schedule') and purchase_order
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
# 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':