test: Add unit tests
diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
index 1047e88..e2ed9d3 100644
--- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
+++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
@@ -521,52 +521,53 @@
self.set_paid_amount()
def on_update_after_submit(self):
- needs_repost = 0
+ if hasattr(self, "repost_required"):
+ needs_repost = 0
- # Check if any field affecting accounting entry is altered
- doc_before_update = self.get_doc_before_save()
- accounting_dimensions = get_accounting_dimensions() + ["cost_center", "project"]
+ # Check if any field affecting accounting entry is altered
+ doc_before_update = self.get_doc_before_save()
+ accounting_dimensions = get_accounting_dimensions() + ["cost_center", "project"]
- # Check if opening entry check updated
- if doc_before_update.get("is_opening") != self.is_opening:
- needs_repost = 1
-
- if not needs_repost:
- # Parent Level Accounts excluding party account
- for field in (
- "additional_discount_account",
- "cash_bank_account",
- "account_for_change_amount",
- "write_off_account",
- "loyalty_redemption_account",
- "unrealized_profit_loss_account",
- ):
- if doc_before_update.get(field) != self.get(field):
- needs_repost = 1
- break
-
- # Check for parent accounting dimensions
- for dimension in accounting_dimensions:
- if doc_before_update.get(dimension) != self.get(dimension):
- needs_repost = 1
- break
-
- # Check for child tables
- if self.check_if_child_table_updated(
- "items",
- doc_before_update,
- ("income_account", "expense_account", "discount_account"),
- accounting_dimensions,
- ):
+ # Check if opening entry check updated
+ if doc_before_update.get("is_opening") != self.is_opening:
needs_repost = 1
- if self.check_if_child_table_updated(
- "taxes", doc_before_update, ("account_head",), accounting_dimensions
- ):
- needs_repost = 1
+ if not needs_repost:
+ # Parent Level Accounts excluding party account
+ for field in (
+ "additional_discount_account",
+ "cash_bank_account",
+ "account_for_change_amount",
+ "write_off_account",
+ "loyalty_redemption_account",
+ "unrealized_profit_loss_account",
+ ):
+ if doc_before_update.get(field) != self.get(field):
+ needs_repost = 1
+ break
- self.validate_accounts()
- self.db_set("repost_required", needs_repost)
+ # Check for parent accounting dimensions
+ for dimension in accounting_dimensions:
+ if doc_before_update.get(dimension) != self.get(dimension):
+ needs_repost = 1
+ break
+
+ # Check for child tables
+ if self.check_if_child_table_updated(
+ "items",
+ doc_before_update,
+ ("income_account", "expense_account", "discount_account"),
+ accounting_dimensions,
+ ):
+ needs_repost = 1
+
+ if self.check_if_child_table_updated(
+ "taxes", doc_before_update, ("account_head",), accounting_dimensions
+ ):
+ needs_repost = 1
+
+ self.validate_accounts()
+ self.db_set("repost_required", needs_repost)
def check_if_child_table_updated(
self, child_table, doc_before_update, fields_to_check, accounting_dimensions
@@ -585,11 +586,14 @@
@frappe.whitelist()
def repost_accounting_entries(self):
- self.docstatus = 2
- self.make_gl_entries_on_cancel()
- self.docstatus = 1
- self.make_gl_entries()
- self.db_set("repost_required", 0)
+ if self.repost_required:
+ self.docstatus = 2
+ self.make_gl_entries_on_cancel()
+ self.docstatus = 1
+ self.make_gl_entries()
+ self.db_set("repost_required", 0)
+ else:
+ frappe.throw(_("No updates pending for reposting"))
def set_paid_amount(self):
paid_amount = 0.0
diff --git a/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py
index 301d3e1..ed04747 100644
--- a/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py
+++ b/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py
@@ -2728,6 +2728,31 @@
check_gl_entries(self, si.name, expected_gle, add_days(nowdate(), -1))
+ # Update Invoice post submit and then check GL Entries again
+
+ si.load_from_db()
+ si.items[0].income_account = "Service - _TC"
+ si.additional_discount_account = "_Test Account Sales - _TC"
+ si.taxes[0].account_head = "VAT 5% - _TC"
+ si.save()
+
+ si.load_from_db()
+ self.assertTrue(si.repost_required)
+
+ si.repost_accounting_entries()
+
+ expected_gle = [
+ ["_Test Account Sales - _TC", 22.0, 0.0, nowdate()],
+ ["Debtors - _TC", 88, 0.0, nowdate()],
+ ["Service - _TC", 0.0, 100.0, nowdate()],
+ ["VAT 5% - _TC", 0.0, 10.0, nowdate()],
+ ]
+
+ check_gl_entries(self, si.name, expected_gle, add_days(nowdate(), -1))
+
+ si.load_from_db()
+ self.assertFalse(si.repost_required)
+
def test_asset_depreciation_on_sale_with_pro_rata(self):
"""
Tests if an Asset set to depreciate yearly on June 30, that gets sold on Sept 30, creates an additional depreciation entry on its date of sale.
@@ -3269,6 +3294,7 @@
"""select account, debit, credit, posting_date
from `tabGL Entry`
where voucher_type='Sales Invoice' and voucher_no=%s and posting_date > %s
+ and is_cancelled = 0
order by posting_date asc, account asc""",
(voucher_no, posting_date),
as_dict=1,