mirror of
https://github.com/frappe/erpnext.git
synced 2026-05-31 10:49:09 +00:00
Merge pull request #48120 from aerele/fix/asset-invoice-cancel-validation
fix(asset-invoice): handle asset invoice cancellation
This commit is contained in:
@@ -1356,7 +1356,9 @@ class SalesInvoice(SellingController):
|
|||||||
if item.is_fixed_asset:
|
if item.is_fixed_asset:
|
||||||
asset = self.get_asset(item)
|
asset = self.get_asset(item)
|
||||||
|
|
||||||
if self.is_return:
|
if (self.docstatus == 2 and not self.is_return) or (
|
||||||
|
self.docstatus == 1 and self.is_return
|
||||||
|
):
|
||||||
fixed_asset_gl_entries = get_gl_entries_on_asset_regain(
|
fixed_asset_gl_entries = get_gl_entries_on_asset_regain(
|
||||||
asset,
|
asset,
|
||||||
item.base_net_amount,
|
item.base_net_amount,
|
||||||
@@ -1369,8 +1371,10 @@ class SalesInvoice(SellingController):
|
|||||||
add_asset_activity(asset.name, _("Asset returned"))
|
add_asset_activity(asset.name, _("Asset returned"))
|
||||||
|
|
||||||
if asset.calculate_depreciation:
|
if asset.calculate_depreciation:
|
||||||
posting_date = frappe.db.get_value(
|
posting_date = (
|
||||||
"Sales Invoice", self.return_against, "posting_date"
|
frappe.db.get_value("Sales Invoice", self.return_against, "posting_date")
|
||||||
|
if self.is_return
|
||||||
|
else self.posting_date
|
||||||
)
|
)
|
||||||
reverse_depreciation_entry_made_after_disposal(asset, posting_date)
|
reverse_depreciation_entry_made_after_disposal(asset, posting_date)
|
||||||
notes = _(
|
notes = _(
|
||||||
@@ -1467,8 +1471,10 @@ class SalesInvoice(SellingController):
|
|||||||
return self._enable_discount_accounting
|
return self._enable_discount_accounting
|
||||||
|
|
||||||
def set_asset_status(self, asset):
|
def set_asset_status(self, asset):
|
||||||
if self.is_return:
|
if self.is_return and not self.docstatus == 2:
|
||||||
asset.set_status()
|
asset.set_status()
|
||||||
|
elif self.is_return and self.docstatus == 2:
|
||||||
|
asset.set_status("Sold")
|
||||||
else:
|
else:
|
||||||
asset.set_status("Sold" if self.docstatus == 1 else None)
|
asset.set_status("Sold" if self.docstatus == 1 else None)
|
||||||
|
|
||||||
|
|||||||
@@ -3135,6 +3135,65 @@ class TestSalesInvoice(FrappeTestCase):
|
|||||||
self.assertEqual(expected_values[i][2], schedule.accumulated_depreciation_amount)
|
self.assertEqual(expected_values[i][2], schedule.accumulated_depreciation_amount)
|
||||||
self.assertEqual(schedule.journal_entry, schedule.journal_entry)
|
self.assertEqual(schedule.journal_entry, schedule.journal_entry)
|
||||||
|
|
||||||
|
def test_depreciation_on_cancel_invoice(self):
|
||||||
|
from erpnext.controllers.sales_and_purchase_return import make_return_doc
|
||||||
|
|
||||||
|
create_asset_data()
|
||||||
|
|
||||||
|
asset = create_asset(
|
||||||
|
item_code="Macbook Pro",
|
||||||
|
purchase_date="2020-01-01",
|
||||||
|
available_for_use_date="2023-01-01",
|
||||||
|
depreciation_start_date="2023-04-01",
|
||||||
|
calculate_depreciation=1,
|
||||||
|
submit=1,
|
||||||
|
)
|
||||||
|
post_depreciation_entries()
|
||||||
|
|
||||||
|
si = create_sales_invoice(
|
||||||
|
item_code="Macbook Pro", asset=asset.name, qty=1, rate=10000, posting_date=getdate("2025-05-01")
|
||||||
|
)
|
||||||
|
return_si = make_return_doc("Sales Invoice", si.name)
|
||||||
|
return_si.posting_date = getdate("2025-05-01")
|
||||||
|
return_si.submit()
|
||||||
|
return_si.reload()
|
||||||
|
return_si.cancel()
|
||||||
|
|
||||||
|
asset.load_from_db()
|
||||||
|
|
||||||
|
# Check if the asset schedule is updated while cancel the return invoice
|
||||||
|
expected_values = [
|
||||||
|
["2023-04-01", 4986.30, 4986.30, True],
|
||||||
|
["2024-04-01", 20000.0, 24986.30, True],
|
||||||
|
["2025-04-01", 20000.0, 44986.30, True],
|
||||||
|
["2025-05-01", 1643.84, 46630.14, True],
|
||||||
|
]
|
||||||
|
for i, schedule in enumerate(get_depr_schedule(asset.name, "Active")):
|
||||||
|
self.assertEqual(getdate(expected_values[i][0]), schedule.schedule_date)
|
||||||
|
self.assertEqual(expected_values[i][1], schedule.depreciation_amount)
|
||||||
|
self.assertEqual(expected_values[i][2], schedule.accumulated_depreciation_amount)
|
||||||
|
self.assertEqual(schedule.journal_entry, schedule.journal_entry)
|
||||||
|
|
||||||
|
si.reload()
|
||||||
|
si.cancel()
|
||||||
|
asset.load_from_db()
|
||||||
|
|
||||||
|
# Check if the asset schedule is updated while cancel the sales invoice
|
||||||
|
expected_values = [
|
||||||
|
["2023-04-01", 4986.30, 4986.30, True],
|
||||||
|
["2024-04-01", 20000.0, 24986.30, True],
|
||||||
|
["2025-04-01", 20000.0, 44986.30, True],
|
||||||
|
["2026-04-01", 20000.0, 64986.30, False],
|
||||||
|
["2027-04-01", 20000.0, 84986.30, False],
|
||||||
|
["2028-01-01", 15013.70, 100000.0, False],
|
||||||
|
]
|
||||||
|
|
||||||
|
for i, schedule in enumerate(get_depr_schedule(asset.name, "Active")):
|
||||||
|
self.assertEqual(getdate(expected_values[i][0]), schedule.schedule_date)
|
||||||
|
self.assertEqual(expected_values[i][1], schedule.depreciation_amount)
|
||||||
|
self.assertEqual(expected_values[i][2], schedule.accumulated_depreciation_amount)
|
||||||
|
self.assertEqual(schedule.journal_entry, schedule.journal_entry)
|
||||||
|
|
||||||
def test_sales_invoice_against_supplier(self):
|
def test_sales_invoice_against_supplier(self):
|
||||||
from erpnext.accounts.doctype.opening_invoice_creation_tool.test_opening_invoice_creation_tool import (
|
from erpnext.accounts.doctype.opening_invoice_creation_tool.test_opening_invoice_creation_tool import (
|
||||||
make_customer,
|
make_customer,
|
||||||
|
|||||||
Reference in New Issue
Block a user