mirror of
https://github.com/frappe/erpnext.git
synced 2026-06-01 19:29:10 +00:00
feat: early payment discount for purchase invoice
This commit is contained in:
committed by
Deepesh Garg
parent
14096fdfc8
commit
c648027473
@@ -753,20 +753,16 @@ def get_outstanding_reference_documents(args):
|
|||||||
def split_invoices_based_on_payment_terms(outstanding_invoices):
|
def split_invoices_based_on_payment_terms(outstanding_invoices):
|
||||||
invoice_ref_based_on_payment_terms = {}
|
invoice_ref_based_on_payment_terms = {}
|
||||||
for idx, d in enumerate(outstanding_invoices):
|
for idx, d in enumerate(outstanding_invoices):
|
||||||
if d.voucher_type == 'Sales Invoice':
|
if d.voucher_type in ['Sales Invoice', 'Purchase Invoice']:
|
||||||
payment_term_template = frappe.db.get_value(d.voucher_type, d.voucher_no, 'payment_terms_template')
|
payment_term_template = frappe.db.get_value(d.voucher_type, d.voucher_no, 'payment_terms_template')
|
||||||
if payment_term_template:
|
if payment_term_template:
|
||||||
allocate_payment_based_on_payment_terms = frappe.db.get_value(
|
allocate_payment_based_on_payment_terms = frappe.db.get_value(
|
||||||
'Payment Terms Template', payment_term_template, 'allocate_payment_based_on_payment_terms')
|
'Payment Terms Template', payment_term_template, 'allocate_payment_based_on_payment_terms')
|
||||||
if allocate_payment_based_on_payment_terms:
|
if allocate_payment_based_on_payment_terms:
|
||||||
payment_schedule = frappe.get_all('Payment Schedule',
|
payment_schedule = frappe.get_all('Payment Schedule', filters={'parent': d.voucher_no}, fields=["*"])
|
||||||
filters={ 'parent': d.voucher_no, 'payment_term': ['is', 'set'] },
|
|
||||||
fields=["*"])
|
|
||||||
|
|
||||||
for payment_term in payment_schedule:
|
for payment_term in payment_schedule:
|
||||||
payment_term_outstanding = flt(payment_term.payment_amount - payment_term.paid_amount)
|
if payment_term.outstanding > 0.1:
|
||||||
|
|
||||||
if payment_term_outstanding > 0.5:
|
|
||||||
invoice_ref_based_on_payment_terms.setdefault(idx, [])
|
invoice_ref_based_on_payment_terms.setdefault(idx, [])
|
||||||
invoice_ref_based_on_payment_terms[idx].append(frappe._dict({
|
invoice_ref_based_on_payment_terms[idx].append(frappe._dict({
|
||||||
'due_date': d.due_date,
|
'due_date': d.due_date,
|
||||||
@@ -778,7 +774,7 @@ def split_invoices_based_on_payment_terms(outstanding_invoices):
|
|||||||
'outstanding_amount': flt(d.outstanding_amount),
|
'outstanding_amount': flt(d.outstanding_amount),
|
||||||
'payment_amount': payment_term.payment_amount,
|
'payment_amount': payment_term.payment_amount,
|
||||||
'payment_term': payment_term.payment_term,
|
'payment_term': payment_term.payment_term,
|
||||||
'allocated_amount': payment_term_outstanding
|
'allocated_amount': payment_term.outstanding
|
||||||
}))
|
}))
|
||||||
|
|
||||||
if invoice_ref_based_on_payment_terms:
|
if invoice_ref_based_on_payment_terms:
|
||||||
@@ -1339,21 +1335,23 @@ def set_paid_amount_and_received_amount(dt, party_account_currency, bank, outsta
|
|||||||
|
|
||||||
def apply_early_payment_discount(paid_amount, received_amount, doc):
|
def apply_early_payment_discount(paid_amount, received_amount, doc):
|
||||||
difference_amount = 0
|
difference_amount = 0
|
||||||
if doc.doctype == "Sales Invoice" and doc.payment_schedule:
|
if doc.doctype in ["Sales Invoice", "Purchase Invoice"] and doc.payment_schedule:
|
||||||
for term in doc.payment_schedule:
|
for term in doc.payment_schedule:
|
||||||
if not term.discounted_amount and term.discount_percentage and getdate(nowdate()) <= term.due_date:
|
if not term.discounted_amount and term.discount_percentage and getdate(nowdate()) <= term.due_date:
|
||||||
discount_amount = term.payment_amount * (term.discount_percentage / 100)
|
discount_amount = term.payment_amount * (term.discount_percentage / 100)
|
||||||
paid_amount -= discount_amount
|
discount_amount_in_foreign_currency = discount_amount * doc.get('conversion_rate', 1)
|
||||||
|
|
||||||
|
if doc.doctype == "Sales Invoice":
|
||||||
|
paid_amount -= discount_amount
|
||||||
|
received_amount -= discount_amount_in_foreign_currency
|
||||||
|
else:
|
||||||
|
received_amount -= discount_amount
|
||||||
|
paid_amount -= discount_amount_in_foreign_currency
|
||||||
|
|
||||||
difference_amount += discount_amount
|
difference_amount += discount_amount
|
||||||
|
|
||||||
if difference_amount and paid_amount != received_amount:
|
if difference_amount:
|
||||||
discount_amount_in_foreign_currency = difference_amount * doc.get('conversion_rate', 1)
|
frappe.msgprint(_("Discount of {} applied as per Payment Term").format(difference_amount), alert=1)
|
||||||
if doc.doctype == "Employee Advance":
|
|
||||||
discount_amount_in_foreign_currency = difference_amount * doc.get('exchange_rate', 1)
|
|
||||||
received_amount -= discount_amount_in_foreign_currency
|
|
||||||
|
|
||||||
if difference_amount:
|
|
||||||
frappe.msgprint(_("Discount of {} applied as per Payment Term").format(difference_amount), alert=1)
|
|
||||||
|
|
||||||
return paid_amount, received_amount, difference_amount
|
return paid_amount, received_amount, difference_amount
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user