fix: payment allocation in invoice payment schedule (#36440)
* fix: payment allocation in invoice payment schedule
* test: payment allocation for payment terms
* chore: linting issues
diff --git a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py
index 55d0203..ce7ada3 100644
--- a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py
+++ b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py
@@ -1791,6 +1791,52 @@
rate = flt(sle.stock_value_difference) / flt(sle.actual_qty)
self.assertAlmostEqual(returned_inv.items[0].rate, rate)
+ def test_payment_allocation_for_payment_terms(self):
+ from erpnext.buying.doctype.purchase_order.test_purchase_order import (
+ create_pr_against_po,
+ create_purchase_order,
+ )
+ from erpnext.selling.doctype.sales_order.test_sales_order import (
+ automatically_fetch_payment_terms,
+ )
+ from erpnext.stock.doctype.purchase_receipt.purchase_receipt import (
+ make_purchase_invoice as make_pi_from_pr,
+ )
+
+ automatically_fetch_payment_terms()
+ frappe.db.set_value(
+ "Payment Terms Template",
+ "_Test Payment Term Template",
+ "allocate_payment_based_on_payment_terms",
+ 0,
+ )
+
+ po = create_purchase_order(do_not_save=1)
+ po.payment_terms_template = "_Test Payment Term Template"
+ po.save()
+ po.submit()
+
+ pr = create_pr_against_po(po.name, received_qty=4)
+ pi = make_pi_from_pr(pr.name)
+ self.assertEqual(pi.payment_schedule[0].payment_amount, 1000)
+
+ frappe.db.set_value(
+ "Payment Terms Template",
+ "_Test Payment Term Template",
+ "allocate_payment_based_on_payment_terms",
+ 1,
+ )
+ pi = make_pi_from_pr(pr.name)
+ self.assertEqual(pi.payment_schedule[0].payment_amount, 2500)
+
+ automatically_fetch_payment_terms(enable=0)
+ frappe.db.set_value(
+ "Payment Terms Template",
+ "_Test Payment Term Template",
+ "allocate_payment_based_on_payment_terms",
+ 0,
+ )
+
def test_offsetting_entries_for_accounting_dimensions(self):
from erpnext.accounts.doctype.account.test_account import create_account
from erpnext.accounts.report.trial_balance.test_trial_balance import (
diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py
index 37a18d8..b2cfc39 100644
--- a/erpnext/controllers/accounts_controller.py
+++ b/erpnext/controllers/accounts_controller.py
@@ -1756,8 +1756,13 @@
)
self.append("payment_schedule", data)
+ allocate_payment_based_on_payment_terms = frappe.db.get_value(
+ "Payment Terms Template", self.payment_terms_template, "allocate_payment_based_on_payment_terms"
+ )
+
if not (
automatically_fetch_payment_terms
+ and allocate_payment_based_on_payment_terms
and self.linked_order_has_payment_terms(po_or_so, fieldname, doctype)
):
for d in self.get("payment_schedule"):