fix: update payment entry references (#33274)
* fix: set_amounts after deductions and losses are set
* test: difference_amount changes after update_references_in_payment_entry
* chore: linter
* fix: use kwargs instad of destructing a dict
[skip ci]
* fix(test): test payment entry difference_amount after payment reconciliation.
diff --git a/erpnext/accounts/test/test_utils.py b/erpnext/accounts/test/test_utils.py
index 882cd69..3aca60e 100644
--- a/erpnext/accounts/test/test_utils.py
+++ b/erpnext/accounts/test/test_utils.py
@@ -3,11 +3,14 @@
import frappe
from frappe.test_runner import make_test_objects
+from erpnext.accounts.doctype.payment_entry.payment_entry import get_payment_entry
+from erpnext.accounts.doctype.purchase_invoice.test_purchase_invoice import make_purchase_invoice
from erpnext.accounts.party import get_party_shipping_address
from erpnext.accounts.utils import (
get_future_stock_vouchers,
get_voucherwise_gl_entries,
sort_stock_vouchers_by_posting_date,
+ update_reference_in_payment_entry,
)
from erpnext.stock.doctype.item.test_item import make_item
from erpnext.stock.doctype.purchase_receipt.test_purchase_receipt import make_purchase_receipt
@@ -73,6 +76,47 @@
sorted_vouchers = sort_stock_vouchers_by_posting_date(list(reversed(vouchers)))
self.assertEqual(sorted_vouchers, vouchers)
+ def test_update_reference_in_payment_entry(self):
+ item = make_item().name
+
+ purchase_invoice = make_purchase_invoice(
+ item=item, supplier="_Test Supplier USD", currency="USD", conversion_rate=82.32
+ )
+ purchase_invoice.submit()
+
+ payment_entry = get_payment_entry(purchase_invoice.doctype, purchase_invoice.name)
+ payment_entry.target_exchange_rate = 62.9
+ payment_entry.paid_amount = 15725
+ payment_entry.deductions = []
+ payment_entry.insert()
+
+ self.assertEqual(payment_entry.difference_amount, -4855.00)
+ payment_entry.references = []
+ payment_entry.submit()
+
+ payment_reconciliation = frappe.new_doc("Payment Reconciliation")
+ payment_reconciliation.company = payment_entry.company
+ payment_reconciliation.party_type = "Supplier"
+ payment_reconciliation.party = purchase_invoice.supplier
+ payment_reconciliation.receivable_payable_account = payment_entry.paid_to
+ payment_reconciliation.get_unreconciled_entries()
+ payment_reconciliation.allocate_entries(
+ {
+ "payments": [d.__dict__ for d in payment_reconciliation.payments],
+ "invoices": [d.__dict__ for d in payment_reconciliation.invoices],
+ }
+ )
+ for d in payment_reconciliation.invoices:
+ # Reset invoice outstanding_amount because allocate_entries will zero this value out.
+ d.outstanding_amount = d.amount
+ for d in payment_reconciliation.allocation:
+ d.difference_account = "Exchange Gain/Loss - _TC"
+ payment_reconciliation.reconcile()
+
+ payment_entry.load_from_db()
+ self.assertEqual(len(payment_entry.references), 1)
+ self.assertEqual(payment_entry.difference_amount, 0)
+
ADDRESS_RECORDS = [
{
diff --git a/erpnext/accounts/utils.py b/erpnext/accounts/utils.py
index 1e573b0..445dcc5 100644
--- a/erpnext/accounts/utils.py
+++ b/erpnext/accounts/utils.py
@@ -611,11 +611,6 @@
new_row.docstatus = 1
new_row.update(reference_details)
- payment_entry.flags.ignore_validate_update_after_submit = True
- payment_entry.setup_party_account_field()
- payment_entry.set_missing_values()
- payment_entry.set_amounts()
-
if d.difference_amount and d.difference_account:
account_details = {
"account": d.difference_account,
@@ -627,6 +622,11 @@
payment_entry.set_gain_or_loss(account_details=account_details)
+ payment_entry.flags.ignore_validate_update_after_submit = True
+ payment_entry.setup_party_account_field()
+ payment_entry.set_missing_values()
+ payment_entry.set_amounts()
+
if not do_not_save:
payment_entry.save(ignore_permissions=True)
diff --git a/erpnext/www/book-appointment/__init__.py b/erpnext/www/book-appointment/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/erpnext/www/book-appointment/__init__.py
diff --git a/erpnext/www/book-appointment/verify/__init__.py b/erpnext/www/book-appointment/verify/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/erpnext/www/book-appointment/verify/__init__.py