fix: multiple fixes related Deferred Accounting

(cherry picked from commit 277c1101fc)
This commit is contained in:
Lakshit Jain
2025-07-06 14:55:45 +05:30
committed by ruthra kumar
parent dbe107345c
commit a4633d6e75
4 changed files with 68 additions and 11 deletions

View File

@@ -40,6 +40,13 @@ class TestProcessDeferredAccounting(unittest.TestCase):
si.save() si.save()
si.submit() si.submit()
original_gle = [
["Debtors - _TC", 3000.0, 0, "2023-07-01"],
[deferred_account, 0.0, 3000, "2023-07-01"],
]
check_gl_entries(self, si.name, original_gle, "2023-07-01")
process_deferred_accounting = frappe.get_doc( process_deferred_accounting = frappe.get_doc(
dict( dict(
doctype="Process Deferred Accounting", doctype="Process Deferred Accounting",
@@ -63,6 +70,12 @@ class TestProcessDeferredAccounting(unittest.TestCase):
] ]
check_gl_entries(self, si.name, expected_gle, "2023-07-01") check_gl_entries(self, si.name, expected_gle, "2023-07-01")
# cancel the process deferred accounting document
process_deferred_accounting.cancel()
# check if gl entries are cancelled
check_gl_entries(self, si.name, original_gle, "2023-07-01")
change_acc_settings() change_acc_settings()
def test_pda_submission_and_cancellation(self): def test_pda_submission_and_cancellation(self):

View File

@@ -2497,6 +2497,10 @@ class TestSalesInvoice(FrappeTestCase):
for gle in gl_entries: for gle in gl_entries:
self.assertEqual(expected_values[gle.account]["cost_center"], gle.cost_center) self.assertEqual(expected_values[gle.account]["cost_center"], gle.cost_center)
@change_settings(
"Accounts Settings",
{"book_deferred_entries_based_on": "Days", "book_deferred_entries_via_journal_entry": 0},
)
def test_deferred_revenue(self): def test_deferred_revenue(self):
deferred_account = create_account( deferred_account = create_account(
account_name="Deferred Revenue", account_name="Deferred Revenue",
@@ -2551,6 +2555,10 @@ class TestSalesInvoice(FrappeTestCase):
self.assertRaises(frappe.ValidationError, si.save) self.assertRaises(frappe.ValidationError, si.save)
@change_settings(
"Accounts Settings",
{"book_deferred_entries_based_on": "Months", "book_deferred_entries_via_journal_entry": 0},
)
def test_fixed_deferred_revenue(self): def test_fixed_deferred_revenue(self):
deferred_account = create_account( deferred_account = create_account(
account_name="Deferred Revenue", account_name="Deferred Revenue",
@@ -2558,10 +2566,6 @@ class TestSalesInvoice(FrappeTestCase):
company="_Test Company", company="_Test Company",
) )
acc_settings = frappe.get_doc("Accounts Settings", "Accounts Settings")
acc_settings.book_deferred_entries_based_on = "Months"
acc_settings.save()
item = create_item("_Test Item for Deferred Accounting") item = create_item("_Test Item for Deferred Accounting")
item.enable_deferred_revenue = 1 item.enable_deferred_revenue = 1
item.deferred_revenue_account = deferred_account item.deferred_revenue_account = deferred_account
@@ -2601,10 +2605,6 @@ class TestSalesInvoice(FrappeTestCase):
check_gl_entries(self, si.name, expected_gle, "2019-01-30") check_gl_entries(self, si.name, expected_gle, "2019-01-30")
acc_settings = frappe.get_doc("Accounts Settings", "Accounts Settings")
acc_settings.book_deferred_entries_based_on = "Days"
acc_settings.save()
def test_validate_inter_company_transaction_address_links(self): def test_validate_inter_company_transaction_address_links(self):
def _validate_address_link(address, link_doctype, link_name): def _validate_address_link(address, link_doctype, link_name):
return frappe.db.get_value( return frappe.db.get_value(
@@ -2853,7 +2853,9 @@ class TestSalesInvoice(FrappeTestCase):
self.assertEqual(si.items[0].rate, rate) self.assertEqual(si.items[0].rate, rate)
self.assertEqual(target_doc.items[0].rate, rate) self.assertEqual(target_doc.items[0].rate, rate)
check_gl_entries(self, target_doc.name, pi_gl_entries, add_days(nowdate(), -1)) check_gl_entries(
self, target_doc.name, pi_gl_entries, add_days(nowdate(), -1), voucher_type="Purchase Invoice"
)
def test_internal_transfer_gl_precision_issues(self): def test_internal_transfer_gl_precision_issues(self):
# Make a stock queue of an item with two valuations # Make a stock queue of an item with two valuations
@@ -4587,6 +4589,8 @@ def check_gl_entries(doc, voucher_no, expected_gle, posting_date, voucher_type="
) )
gl_entries = q.run(as_dict=True) gl_entries = q.run(as_dict=True)
doc.assertGreater(len(gl_entries), 0)
for i, gle in enumerate(gl_entries): for i, gle in enumerate(gl_entries):
doc.assertEqual(expected_gle[i][0], gle.account) doc.assertEqual(expected_gle[i][0], gle.account)
doc.assertEqual(expected_gle[i][1], gle.debit) doc.assertEqual(expected_gle[i][1], gle.debit)

View File

@@ -692,7 +692,18 @@ def make_reverse_gl_entries(
query.run() query.run()
else: else:
if not immutable_ledger_enabled: if not immutable_ledger_enabled:
set_as_cancel(gl_entries[0]["voucher_type"], gl_entries[0]["voucher_no"]) gle_names = [x.get("name") for x in gl_entries]
# if names are available, cancel only that set of entries
if not all(gle_names):
set_as_cancel(gl_entries[0]["voucher_type"], gl_entries[0]["voucher_no"])
else:
frappe.db.sql(
"""UPDATE `tabGL Entry` SET is_cancelled = 1,
modified=%s, modified_by=%s
where name in %s and is_cancelled = 0""",
(now(), frappe.session.user, tuple(gle_names)),
)
for entry in gl_entries: for entry in gl_entries:
new_gle = copy.deepcopy(entry) new_gle = copy.deepcopy(entry)

View File

@@ -79,6 +79,14 @@ class Deferred_Item:
return - estimated amount to post for given period return - estimated amount to post for given period
Calculated based on already booked amount and item service period Calculated based on already booked amount and item service period
""" """
if self.filters.book_deferred_entries_based_on == "Months":
# if the deferred entries are based on service period, use service start and end date
return self.calculate_monthly_amount(start_date, end_date)
else:
return self.calculate_days_amount(start_date, end_date)
def calculate_monthly_amount(self, start_date, end_date):
total_months = ( total_months = (
(self.service_end_date.year - self.service_start_date.year) * 12 (self.service_end_date.year - self.service_start_date.year) * 12
+ (self.service_end_date.month - self.service_start_date.month) + (self.service_end_date.month - self.service_start_date.month)
@@ -105,6 +113,19 @@ class Deferred_Item:
return base_amount return base_amount
def calculate_days_amount(self, start_date, end_date):
base_amount = 0
total_days = date_diff(self.service_end_date, self.service_start_date) + 1
total_booking_days = date_diff(end_date, start_date) + 1
already_booked_amount = self.get_item_total()
base_amount = flt(self.base_net_amount * total_booking_days / flt(total_days))
if base_amount + already_booked_amount > self.base_net_amount:
base_amount = self.base_net_amount - already_booked_amount
return base_amount
def make_dummy_gle(self, name, date, amount): def make_dummy_gle(self, name, date, amount):
""" """
return - frappe._dict() of a dummy gle entry return - frappe._dict() of a dummy gle entry
@@ -245,6 +266,10 @@ class Deferred_Revenue_and_Expense_Report:
else: else:
self.filters = frappe._dict(filters) self.filters = frappe._dict(filters)
self.filters.book_deferred_entries_based_on = frappe.db.get_singles_value(
"Accounts Settings", "book_deferred_entries_based_on"
)
self.period_list = None self.period_list = None
self.deferred_invoices = [] self.deferred_invoices = []
# holds period wise total for report # holds period wise total for report
@@ -289,7 +314,11 @@ class Deferred_Revenue_and_Expense_Report:
.join(inv) .join(inv)
.on(inv.name == inv_item.parent) .on(inv.name == inv_item.parent)
.left_join(gle) .left_join(gle)
.on((inv_item.name == gle.voucher_detail_no) & (deferred_account_field == gle.account)) .on(
(inv_item.name == gle.voucher_detail_no)
& (deferred_account_field == gle.account)
& (gle.is_cancelled == 0)
)
.select( .select(
inv.name.as_("doc"), inv.name.as_("doc"),
inv.posting_date, inv.posting_date,