|
|
@ -20,13 +20,13 @@ from erpnext.stock.doctype.purchase_receipt.purchase_receipt import ( |
|
|
|
) |
|
|
|
from erpnext.stock.doctype.purchase_receipt.test_purchase_receipt import make_purchase_receipt |
|
|
|
|
|
|
|
|
|
|
|
class TestAsset(unittest.TestCase): |
|
|
|
class AssetSetup(unittest.TestCase): |
|
|
|
def setUp(self): |
|
|
|
set_depreciation_settings_in_company() |
|
|
|
create_asset_data() |
|
|
|
frappe.db.sql("delete from `tabTax Rule`") |
|
|
|
|
|
|
|
class TestAsset(AssetSetup): |
|
|
|
def test_purchase_asset(self): |
|
|
|
pr = make_purchase_receipt(item_code="Macbook Pro", |
|
|
|
qty=1, rate=100000.0, location="Test Location") |
|
|
@ -89,6 +89,252 @@ class TestAsset(unittest.TestCase): |
|
|
|
doc.set_missing_values() |
|
|
|
self.assertEqual(doc.items[0].is_fixed_asset, 1) |
|
|
|
|
|
|
|
def test_scrap_asset(self): |
|
|
|
pr = make_purchase_receipt(item_code="Macbook Pro", |
|
|
|
qty=1, rate=100000.0, location="Test Location") |
|
|
|
|
|
|
|
asset_name = frappe.db.get_value("Asset", {"purchase_receipt": pr.name}, 'name') |
|
|
|
asset = frappe.get_doc('Asset', asset_name) |
|
|
|
asset.calculate_depreciation = 1 |
|
|
|
asset.available_for_use_date = '2020-01-01' |
|
|
|
asset.purchase_date = '2020-01-01' |
|
|
|
asset.append("finance_books", { |
|
|
|
"expected_value_after_useful_life": 10000, |
|
|
|
"depreciation_method": "Straight Line", |
|
|
|
"total_number_of_depreciations": 10, |
|
|
|
"frequency_of_depreciation": 1 |
|
|
|
}) |
|
|
|
asset.submit() |
|
|
|
|
|
|
|
post_depreciation_entries(date=add_months('2020-01-01', 4)) |
|
|
|
|
|
|
|
scrap_asset(asset.name) |
|
|
|
|
|
|
|
asset.load_from_db() |
|
|
|
self.assertEqual(asset.status, "Scrapped") |
|
|
|
self.assertTrue(asset.journal_entry_for_scrap) |
|
|
|
|
|
|
|
expected_gle = ( |
|
|
|
("_Test Accumulated Depreciations - _TC", 36000.0, 0.0), |
|
|
|
("_Test Fixed Asset - _TC", 0.0, 100000.0), |
|
|
|
("_Test Gain/Loss on Asset Disposal - _TC", 64000.0, 0.0) |
|
|
|
) |
|
|
|
|
|
|
|
gle = frappe.db.sql("""select account, debit, credit from `tabGL Entry` |
|
|
|
where voucher_type='Journal Entry' and voucher_no = %s |
|
|
|
order by account""", asset.journal_entry_for_scrap) |
|
|
|
self.assertEqual(gle, expected_gle) |
|
|
|
|
|
|
|
restore_asset(asset.name) |
|
|
|
|
|
|
|
asset.load_from_db() |
|
|
|
self.assertFalse(asset.journal_entry_for_scrap) |
|
|
|
self.assertEqual(asset.status, "Partially Depreciated") |
|
|
|
|
|
|
|
def test_gle_made_by_asset_sale(self): |
|
|
|
pr = make_purchase_receipt(item_code="Macbook Pro", |
|
|
|
qty=1, rate=100000.0, location="Test Location") |
|
|
|
|
|
|
|
asset_name = frappe.db.get_value("Asset", {"purchase_receipt": pr.name}, 'name') |
|
|
|
asset = frappe.get_doc('Asset', asset_name) |
|
|
|
asset.calculate_depreciation = 1 |
|
|
|
asset.available_for_use_date = '2020-06-06' |
|
|
|
asset.purchase_date = '2020-06-06' |
|
|
|
asset.append("finance_books", { |
|
|
|
"expected_value_after_useful_life": 10000, |
|
|
|
"depreciation_method": "Straight Line", |
|
|
|
"total_number_of_depreciations": 3, |
|
|
|
"frequency_of_depreciation": 10, |
|
|
|
"depreciation_start_date": "2020-12-31" |
|
|
|
}) |
|
|
|
asset.submit() |
|
|
|
post_depreciation_entries(date="2021-01-01") |
|
|
|
|
|
|
|
si = make_sales_invoice(asset=asset.name, item_code="Macbook Pro", company="_Test Company") |
|
|
|
si.customer = "_Test Customer" |
|
|
|
si.due_date = nowdate() |
|
|
|
si.get("items")[0].rate = 25000 |
|
|
|
si.insert() |
|
|
|
si.submit() |
|
|
|
|
|
|
|
self.assertEqual(frappe.db.get_value("Asset", asset.name, "status"), "Sold") |
|
|
|
|
|
|
|
expected_gle = ( |
|
|
|
("_Test Accumulated Depreciations - _TC", 20392.16, 0.0), |
|
|
|
("_Test Fixed Asset - _TC", 0.0, 100000.0), |
|
|
|
("_Test Gain/Loss on Asset Disposal - _TC", 54607.84, 0.0), |
|
|
|
("Debtors - _TC", 25000.0, 0.0) |
|
|
|
) |
|
|
|
|
|
|
|
gle = frappe.db.sql("""select account, debit, credit from `tabGL Entry` |
|
|
|
where voucher_type='Sales Invoice' and voucher_no = %s |
|
|
|
order by account""", si.name) |
|
|
|
|
|
|
|
self.assertEqual(gle, expected_gle) |
|
|
|
|
|
|
|
si.cancel() |
|
|
|
self.assertEqual(frappe.db.get_value("Asset", asset.name, "status"), "Partially Depreciated") |
|
|
|
|
|
|
|
# CWIP: Capital Work In Progress |
|
|
|
def test_cwip_accounting(self): |
|
|
|
pr = make_purchase_receipt(item_code="Macbook Pro", |
|
|
|
qty=1, rate=5000, do_not_submit=True, location="Test Location") |
|
|
|
|
|
|
|
pr.set('taxes', [{ |
|
|
|
'category': 'Total', |
|
|
|
'add_deduct_tax': 'Add', |
|
|
|
'charge_type': 'On Net Total', |
|
|
|
'account_head': '_Test Account Service Tax - _TC', |
|
|
|
'description': '_Test Account Service Tax', |
|
|
|
'cost_center': 'Main - _TC', |
|
|
|
'rate': 5.0 |
|
|
|
}, { |
|
|
|
'category': 'Valuation and Total', |
|
|
|
'add_deduct_tax': 'Add', |
|
|
|
'charge_type': 'On Net Total', |
|
|
|
'account_head': '_Test Account Shipping Charges - _TC', |
|
|
|
'description': '_Test Account Shipping Charges', |
|
|
|
'cost_center': 'Main - _TC', |
|
|
|
'rate': 5.0 |
|
|
|
}]) |
|
|
|
|
|
|
|
pr.submit() |
|
|
|
|
|
|
|
expected_gle = ( |
|
|
|
("Asset Received But Not Billed - _TC", 0.0, 5250.0), |
|
|
|
("CWIP Account - _TC", 5250.0, 0.0) |
|
|
|
) |
|
|
|
|
|
|
|
pr_gle = frappe.db.sql("""select account, debit, credit from `tabGL Entry` |
|
|
|
where voucher_type='Purchase Receipt' and voucher_no = %s |
|
|
|
order by account""", pr.name) |
|
|
|
|
|
|
|
self.assertEqual(pr_gle, expected_gle) |
|
|
|
|
|
|
|
pi = make_invoice(pr.name) |
|
|
|
pi.submit() |
|
|
|
|
|
|
|
expected_gle = ( |
|
|
|
("_Test Account Service Tax - _TC", 250.0, 0.0), |
|
|
|
("_Test Account Shipping Charges - _TC", 250.0, 0.0), |
|
|
|
("Asset Received But Not Billed - _TC", 5250.0, 0.0), |
|
|
|
("Creditors - _TC", 0.0, 5500.0), |
|
|
|
("Expenses Included In Asset Valuation - _TC", 0.0, 250.0), |
|
|
|
) |
|
|
|
|
|
|
|
pi_gle = frappe.db.sql("""select account, debit, credit from `tabGL Entry` |
|
|
|
where voucher_type='Purchase Invoice' and voucher_no = %s |
|
|
|
order by account""", pi.name) |
|
|
|
|
|
|
|
self.assertEqual(pi_gle, expected_gle) |
|
|
|
|
|
|
|
asset = frappe.db.get_value('Asset', |
|
|
|
{'purchase_receipt': pr.name, 'docstatus': 0}, 'name') |
|
|
|
|
|
|
|
asset_doc = frappe.get_doc('Asset', asset) |
|
|
|
|
|
|
|
month_end_date = get_last_day(nowdate()) |
|
|
|
asset_doc.available_for_use_date = nowdate() if nowdate() != month_end_date else add_days(nowdate(), -15) |
|
|
|
self.assertEqual(asset_doc.gross_purchase_amount, 5250.0) |
|
|
|
|
|
|
|
asset_doc.append("finance_books", { |
|
|
|
"expected_value_after_useful_life": 200, |
|
|
|
"depreciation_method": "Straight Line", |
|
|
|
"total_number_of_depreciations": 3, |
|
|
|
"frequency_of_depreciation": 10, |
|
|
|
"depreciation_start_date": month_end_date |
|
|
|
}) |
|
|
|
asset_doc.submit() |
|
|
|
|
|
|
|
expected_gle = ( |
|
|
|
("_Test Fixed Asset - _TC", 5250.0, 0.0), |
|
|
|
("CWIP Account - _TC", 0.0, 5250.0) |
|
|
|
) |
|
|
|
|
|
|
|
gle = frappe.db.sql("""select account, debit, credit from `tabGL Entry` |
|
|
|
where voucher_type='Asset' and voucher_no = %s |
|
|
|
order by account""", asset_doc.name) |
|
|
|
|
|
|
|
|
|
|
|
self.assertEqual(gle, expected_gle) |
|
|
|
|
|
|
|
def test_expense_head(self): |
|
|
|
pr = make_purchase_receipt(item_code="Macbook Pro", |
|
|
|
qty=2, rate=200000.0, location="Test Location") |
|
|
|
|
|
|
|
doc = make_invoice(pr.name) |
|
|
|
|
|
|
|
self.assertEqual('Asset Received But Not Billed - _TC', doc.items[0].expense_account) |
|
|
|
|
|
|
|
def test_asset_cwip_toggling_cases(self): |
|
|
|
cwip = frappe.db.get_value("Asset Category", "Computers", "enable_cwip_accounting") |
|
|
|
name = frappe.db.get_value("Asset Category Account", filters={"parent": "Computers"}, fieldname=["name"]) |
|
|
|
cwip_acc = "CWIP Account - _TC" |
|
|
|
|
|
|
|
frappe.db.set_value("Asset Category", "Computers", "enable_cwip_accounting", 0) |
|
|
|
frappe.db.set_value("Asset Category Account", name, "capital_work_in_progress_account", "") |
|
|
|
frappe.db.get_value("Company", "_Test Company", "capital_work_in_progress_account", "") |
|
|
|
|
|
|
|
# case 0 -- PI with cwip disable, Asset with cwip disabled, No cwip account set |
|
|
|
pi = make_purchase_invoice(item_code="Macbook Pro", qty=1, rate=200000.0, location="Test Location", update_stock=1) |
|
|
|
asset = frappe.db.get_value('Asset', {'purchase_invoice': pi.name, 'docstatus': 0}, 'name') |
|
|
|
asset_doc = frappe.get_doc('Asset', asset) |
|
|
|
asset_doc.available_for_use_date = nowdate() |
|
|
|
asset_doc.calculate_depreciation = 0 |
|
|
|
asset_doc.submit() |
|
|
|
gle = frappe.db.sql("""select name from `tabGL Entry` where voucher_type='Asset' and voucher_no = %s""", asset_doc.name) |
|
|
|
self.assertFalse(gle) |
|
|
|
|
|
|
|
# case 1 -- PR with cwip disabled, Asset with cwip enabled |
|
|
|
pr = make_purchase_receipt(item_code="Macbook Pro", qty=1, rate=200000.0, location="Test Location") |
|
|
|
frappe.db.set_value("Asset Category", "Computers", "enable_cwip_accounting", 1) |
|
|
|
frappe.db.set_value("Asset Category Account", name, "capital_work_in_progress_account", cwip_acc) |
|
|
|
asset = frappe.db.get_value('Asset', {'purchase_receipt': pr.name, 'docstatus': 0}, 'name') |
|
|
|
asset_doc = frappe.get_doc('Asset', asset) |
|
|
|
asset_doc.available_for_use_date = nowdate() |
|
|
|
asset_doc.calculate_depreciation = 0 |
|
|
|
asset_doc.submit() |
|
|
|
gle = frappe.db.sql("""select name from `tabGL Entry` where voucher_type='Asset' and voucher_no = %s""", asset_doc.name) |
|
|
|
self.assertFalse(gle) |
|
|
|
|
|
|
|
# case 2 -- PR with cwip enabled, Asset with cwip disabled |
|
|
|
pr = make_purchase_receipt(item_code="Macbook Pro", qty=1, rate=200000.0, location="Test Location") |
|
|
|
frappe.db.set_value("Asset Category", "Computers", "enable_cwip_accounting", 0) |
|
|
|
asset = frappe.db.get_value('Asset', {'purchase_receipt': pr.name, 'docstatus': 0}, 'name') |
|
|
|
asset_doc = frappe.get_doc('Asset', asset) |
|
|
|
asset_doc.available_for_use_date = nowdate() |
|
|
|
asset_doc.calculate_depreciation = 0 |
|
|
|
asset_doc.submit() |
|
|
|
gle = frappe.db.sql("""select name from `tabGL Entry` where voucher_type='Asset' and voucher_no = %s""", asset_doc.name) |
|
|
|
self.assertTrue(gle) |
|
|
|
|
|
|
|
# case 3 -- PI with cwip disabled, Asset with cwip enabled |
|
|
|
pi = make_purchase_invoice(item_code="Macbook Pro", qty=1, rate=200000.0, location="Test Location", update_stock=1) |
|
|
|
frappe.db.set_value("Asset Category", "Computers", "enable_cwip_accounting", 1) |
|
|
|
asset = frappe.db.get_value('Asset', {'purchase_invoice': pi.name, 'docstatus': 0}, 'name') |
|
|
|
asset_doc = frappe.get_doc('Asset', asset) |
|
|
|
asset_doc.available_for_use_date = nowdate() |
|
|
|
asset_doc.calculate_depreciation = 0 |
|
|
|
asset_doc.submit() |
|
|
|
gle = frappe.db.sql("""select name from `tabGL Entry` where voucher_type='Asset' and voucher_no = %s""", asset_doc.name) |
|
|
|
self.assertFalse(gle) |
|
|
|
|
|
|
|
# case 4 -- PI with cwip enabled, Asset with cwip disabled |
|
|
|
pi = make_purchase_invoice(item_code="Macbook Pro", qty=1, rate=200000.0, location="Test Location", update_stock=1) |
|
|
|
frappe.db.set_value("Asset Category", "Computers", "enable_cwip_accounting", 0) |
|
|
|
asset = frappe.db.get_value('Asset', {'purchase_invoice': pi.name, 'docstatus': 0}, 'name') |
|
|
|
asset_doc = frappe.get_doc('Asset', asset) |
|
|
|
asset_doc.available_for_use_date = nowdate() |
|
|
|
asset_doc.calculate_depreciation = 0 |
|
|
|
asset_doc.submit() |
|
|
|
gle = frappe.db.sql("""select name from `tabGL Entry` where voucher_type='Asset' and voucher_no = %s""", asset_doc.name) |
|
|
|
self.assertTrue(gle) |
|
|
|
|
|
|
|
frappe.db.set_value("Asset Category", "Computers", "enable_cwip_accounting", cwip) |
|
|
|
frappe.db.set_value("Asset Category Account", name, "capital_work_in_progress_account", cwip_acc) |
|
|
|
frappe.db.get_value("Company", "_Test Company", "capital_work_in_progress_account", cwip_acc) |
|
|
|
|
|
|
|
class TestDepreciationMethods(AssetSetup): |
|
|
|
def test_schedule_for_straight_line_method(self): |
|
|
|
pr = make_purchase_receipt(item_code="Macbook Pro", |
|
|
|
qty=1, rate=100000.0, location="Test Location") |
|
|
@ -195,449 +441,112 @@ class TestAsset(unittest.TestCase): |
|
|
|
asset.save() |
|
|
|
self.assertEqual(asset.status, "Draft") |
|
|
|
|
|
|
|
expected_schedules = [ |
|
|
|
["2030-12-31", 33333.50, 83333.50], |
|
|
|
["2031-12-31", 6666.50, 90000.0] |
|
|
|
] |
|
|
|
|
|
|
|
schedules = [[cstr(d.schedule_date), d.depreciation_amount, d.accumulated_depreciation_amount] |
|
|
|
for d in asset.get("schedules")] |
|
|
|
|
|
|
|
self.assertEqual(schedules, expected_schedules) |
|
|
|
|
|
|
|
def test_schedule_for_prorated_straight_line_method(self): |
|
|
|
pr = make_purchase_receipt(item_code="Macbook Pro", |
|
|
|
qty=1, rate=100000.0, location="Test Location") |
|
|
|
|
|
|
|
asset_name = frappe.db.get_value("Asset", {"purchase_receipt": pr.name}, 'name') |
|
|
|
asset = frappe.get_doc('Asset', asset_name) |
|
|
|
asset.calculate_depreciation = 1 |
|
|
|
asset.purchase_date = '2030-01-30' |
|
|
|
asset.is_existing_asset = 0 |
|
|
|
asset.available_for_use_date = "2030-01-30" |
|
|
|
asset.append("finance_books", { |
|
|
|
"expected_value_after_useful_life": 10000, |
|
|
|
"depreciation_method": "Straight Line", |
|
|
|
"total_number_of_depreciations": 3, |
|
|
|
"frequency_of_depreciation": 12, |
|
|
|
"depreciation_start_date": "2030-12-31" |
|
|
|
}) |
|
|
|
|
|
|
|
asset.save() |
|
|
|
|
|
|
|
expected_schedules = [ |
|
|
|
["2030-12-31", 27534.25, 27534.25], |
|
|
|
["2031-12-31", 30000.0, 57534.25], |
|
|
|
["2032-12-31", 30000.0, 87534.25], |
|
|
|
["2033-01-30", 2465.75, 90000.0] |
|
|
|
] |
|
|
|
|
|
|
|
schedules = [[cstr(d.schedule_date), flt(d.depreciation_amount, 2), flt(d.accumulated_depreciation_amount, 2)] |
|
|
|
for d in asset.get("schedules")] |
|
|
|
|
|
|
|
self.assertEqual(schedules, expected_schedules) |
|
|
|
|
|
|
|
def test_depreciation(self): |
|
|
|
pr = make_purchase_receipt(item_code="Macbook Pro", |
|
|
|
qty=1, rate=100000.0, location="Test Location") |
|
|
|
|
|
|
|
asset_name = frappe.db.get_value("Asset", {"purchase_receipt": pr.name}, 'name') |
|
|
|
asset = frappe.get_doc('Asset', asset_name) |
|
|
|
asset.calculate_depreciation = 1 |
|
|
|
asset.purchase_date = '2020-01-30' |
|
|
|
asset.available_for_use_date = "2020-01-30" |
|
|
|
asset.append("finance_books", { |
|
|
|
"expected_value_after_useful_life": 10000, |
|
|
|
"depreciation_method": "Straight Line", |
|
|
|
"total_number_of_depreciations": 3, |
|
|
|
"frequency_of_depreciation": 10, |
|
|
|
"depreciation_start_date": "2020-12-31" |
|
|
|
}) |
|
|
|
asset.submit() |
|
|
|
asset.load_from_db() |
|
|
|
self.assertEqual(asset.status, "Submitted") |
|
|
|
|
|
|
|
frappe.db.set_value("Company", "_Test Company", "series_for_depreciation_entry", "DEPR-") |
|
|
|
post_depreciation_entries(date="2021-01-01") |
|
|
|
asset.load_from_db() |
|
|
|
|
|
|
|
# check depreciation entry series |
|
|
|
self.assertEqual(asset.get("schedules")[0].journal_entry[:4], "DEPR") |
|
|
|
|
|
|
|
expected_gle = ( |
|
|
|
("_Test Accumulated Depreciations - _TC", 0.0, 30000.0), |
|
|
|
("_Test Depreciations - _TC", 30000.0, 0.0) |
|
|
|
) |
|
|
|
|
|
|
|
gle = frappe.db.sql("""select account, debit, credit from `tabGL Entry` |
|
|
|
where against_voucher_type='Asset' and against_voucher = %s |
|
|
|
order by account""", asset.name) |
|
|
|
|
|
|
|
self.assertEqual(gle, expected_gle) |
|
|
|
self.assertEqual(asset.get("value_after_depreciation"), 0) |
|
|
|
|
|
|
|
# WDV: Written Down Value |
|
|
|
def test_depreciation_entry_for_wdv_without_pro_rata(self): |
|
|
|
pr = make_purchase_receipt(item_code="Macbook Pro", |
|
|
|
qty=1, rate=8000.0, location="Test Location") |
|
|
|
|
|
|
|
asset_name = frappe.db.get_value("Asset", {"purchase_receipt": pr.name}, 'name') |
|
|
|
asset = frappe.get_doc('Asset', asset_name) |
|
|
|
asset.calculate_depreciation = 1 |
|
|
|
asset.available_for_use_date = '2030-01-01' |
|
|
|
asset.purchase_date = '2030-01-01' |
|
|
|
asset.append("finance_books", { |
|
|
|
"expected_value_after_useful_life": 1000, |
|
|
|
"depreciation_method": "Written Down Value", |
|
|
|
"total_number_of_depreciations": 3, |
|
|
|
"frequency_of_depreciation": 12, |
|
|
|
"depreciation_start_date": "2030-12-31" |
|
|
|
}) |
|
|
|
asset.save(ignore_permissions=True) |
|
|
|
|
|
|
|
self.assertEqual(asset.finance_books[0].rate_of_depreciation, 50.0) |
|
|
|
|
|
|
|
expected_schedules = [ |
|
|
|
["2030-12-31", 4000.00, 4000.00], |
|
|
|
["2031-12-31", 2000.00, 6000.00], |
|
|
|
["2032-12-31", 1000.00, 7000.0], |
|
|
|
] |
|
|
|
|
|
|
|
schedules = [[cstr(d.schedule_date), flt(d.depreciation_amount, 2), flt(d.accumulated_depreciation_amount, 2)] |
|
|
|
for d in asset.get("schedules")] |
|
|
|
|
|
|
|
self.assertEqual(schedules, expected_schedules) |
|
|
|
|
|
|
|
def test_pro_rata_depreciation_entry_for_wdv(self): |
|
|
|
pr = make_purchase_receipt(item_code="Macbook Pro", |
|
|
|
qty=1, rate=8000.0, location="Test Location") |
|
|
|
|
|
|
|
asset_name = frappe.db.get_value("Asset", {"purchase_receipt": pr.name}, 'name') |
|
|
|
asset = frappe.get_doc('Asset', asset_name) |
|
|
|
asset.calculate_depreciation = 1 |
|
|
|
asset.available_for_use_date = '2030-06-06' |
|
|
|
asset.purchase_date = '2030-01-01' |
|
|
|
asset.append("finance_books", { |
|
|
|
"expected_value_after_useful_life": 1000, |
|
|
|
"depreciation_method": "Written Down Value", |
|
|
|
"total_number_of_depreciations": 3, |
|
|
|
"frequency_of_depreciation": 12, |
|
|
|
"depreciation_start_date": "2030-12-31" |
|
|
|
}) |
|
|
|
asset.save(ignore_permissions=True) |
|
|
|
|
|
|
|
self.assertEqual(asset.finance_books[0].rate_of_depreciation, 50.0) |
|
|
|
|
|
|
|
expected_schedules = [ |
|
|
|
["2030-12-31", 2279.45, 2279.45], |
|
|
|
["2031-12-31", 2860.28, 5139.73], |
|
|
|
["2032-12-31", 1430.14, 6569.87], |
|
|
|
["2033-06-06", 430.13, 7000.0], |
|
|
|
] |
|
|
|
|
|
|
|
schedules = [[cstr(d.schedule_date), flt(d.depreciation_amount, 2), flt(d.accumulated_depreciation_amount, 2)] |
|
|
|
for d in asset.get("schedules")] |
|
|
|
|
|
|
|
self.assertEqual(schedules, expected_schedules) |
|
|
|
|
|
|
|
def test_depreciation_entry_cancellation(self): |
|
|
|
pr = make_purchase_receipt(item_code="Macbook Pro", |
|
|
|
qty=1, rate=100000.0, location="Test Location") |
|
|
|
|
|
|
|
asset_name = frappe.db.get_value("Asset", {"purchase_receipt": pr.name}, 'name') |
|
|
|
asset = frappe.get_doc('Asset', asset_name) |
|
|
|
asset.calculate_depreciation = 1 |
|
|
|
asset.available_for_use_date = '2020-06-06' |
|
|
|
asset.purchase_date = '2020-06-06' |
|
|
|
asset.append("finance_books", { |
|
|
|
"expected_value_after_useful_life": 10000, |
|
|
|
"depreciation_method": "Straight Line", |
|
|
|
"total_number_of_depreciations": 3, |
|
|
|
"frequency_of_depreciation": 10, |
|
|
|
"depreciation_start_date": "2020-12-31" |
|
|
|
}) |
|
|
|
asset.submit() |
|
|
|
post_depreciation_entries(date="2021-01-01") |
|
|
|
|
|
|
|
asset.load_from_db() |
|
|
|
|
|
|
|
# cancel depreciation entry |
|
|
|
depr_entry = asset.get("schedules")[0].journal_entry |
|
|
|
self.assertTrue(depr_entry) |
|
|
|
frappe.get_doc("Journal Entry", depr_entry).cancel() |
|
|
|
|
|
|
|
asset.load_from_db() |
|
|
|
depr_entry = asset.get("schedules")[0].journal_entry |
|
|
|
self.assertFalse(depr_entry) |
|
|
|
|
|
|
|
def test_scrap_asset(self): |
|
|
|
pr = make_purchase_receipt(item_code="Macbook Pro", |
|
|
|
qty=1, rate=100000.0, location="Test Location") |
|
|
|
|
|
|
|
asset_name = frappe.db.get_value("Asset", {"purchase_receipt": pr.name}, 'name') |
|
|
|
asset = frappe.get_doc('Asset', asset_name) |
|
|
|
asset.calculate_depreciation = 1 |
|
|
|
asset.available_for_use_date = '2020-01-01' |
|
|
|
asset.purchase_date = '2020-01-01' |
|
|
|
asset.append("finance_books", { |
|
|
|
"expected_value_after_useful_life": 10000, |
|
|
|
"depreciation_method": "Straight Line", |
|
|
|
"total_number_of_depreciations": 10, |
|
|
|
"frequency_of_depreciation": 1 |
|
|
|
}) |
|
|
|
asset.submit() |
|
|
|
|
|
|
|
post_depreciation_entries(date=add_months('2020-01-01', 4)) |
|
|
|
|
|
|
|
scrap_asset(asset.name) |
|
|
|
|
|
|
|
asset.load_from_db() |
|
|
|
self.assertEqual(asset.status, "Scrapped") |
|
|
|
self.assertTrue(asset.journal_entry_for_scrap) |
|
|
|
|
|
|
|
expected_gle = ( |
|
|
|
("_Test Accumulated Depreciations - _TC", 36000.0, 0.0), |
|
|
|
("_Test Fixed Asset - _TC", 0.0, 100000.0), |
|
|
|
("_Test Gain/Loss on Asset Disposal - _TC", 64000.0, 0.0) |
|
|
|
) |
|
|
|
|
|
|
|
gle = frappe.db.sql("""select account, debit, credit from `tabGL Entry` |
|
|
|
where voucher_type='Journal Entry' and voucher_no = %s |
|
|
|
order by account""", asset.journal_entry_for_scrap) |
|
|
|
self.assertEqual(gle, expected_gle) |
|
|
|
|
|
|
|
restore_asset(asset.name) |
|
|
|
|
|
|
|
asset.load_from_db() |
|
|
|
self.assertFalse(asset.journal_entry_for_scrap) |
|
|
|
self.assertEqual(asset.status, "Partially Depreciated") |
|
|
|
|
|
|
|
def test_asset_sale(self): |
|
|
|
pr = make_purchase_receipt(item_code="Macbook Pro", |
|
|
|
qty=1, rate=100000.0, location="Test Location") |
|
|
|
|
|
|
|
asset_name = frappe.db.get_value("Asset", {"purchase_receipt": pr.name}, 'name') |
|
|
|
asset = frappe.get_doc('Asset', asset_name) |
|
|
|
asset.calculate_depreciation = 1 |
|
|
|
asset.available_for_use_date = '2020-06-06' |
|
|
|
asset.purchase_date = '2020-06-06' |
|
|
|
asset.append("finance_books", { |
|
|
|
"expected_value_after_useful_life": 10000, |
|
|
|
"depreciation_method": "Straight Line", |
|
|
|
"total_number_of_depreciations": 3, |
|
|
|
"frequency_of_depreciation": 10, |
|
|
|
"depreciation_start_date": "2020-12-31" |
|
|
|
}) |
|
|
|
asset.submit() |
|
|
|
post_depreciation_entries(date="2021-01-01") |
|
|
|
|
|
|
|
si = make_sales_invoice(asset=asset.name, item_code="Macbook Pro", company="_Test Company") |
|
|
|
si.customer = "_Test Customer" |
|
|
|
si.due_date = nowdate() |
|
|
|
si.get("items")[0].rate = 25000 |
|
|
|
si.insert() |
|
|
|
si.submit() |
|
|
|
|
|
|
|
self.assertEqual(frappe.db.get_value("Asset", asset.name, "status"), "Sold") |
|
|
|
|
|
|
|
expected_gle = ( |
|
|
|
("_Test Accumulated Depreciations - _TC", 20392.16, 0.0), |
|
|
|
("_Test Fixed Asset - _TC", 0.0, 100000.0), |
|
|
|
("_Test Gain/Loss on Asset Disposal - _TC", 54607.84, 0.0), |
|
|
|
("Debtors - _TC", 25000.0, 0.0) |
|
|
|
) |
|
|
|
|
|
|
|
gle = frappe.db.sql("""select account, debit, credit from `tabGL Entry` |
|
|
|
where voucher_type='Sales Invoice' and voucher_no = %s |
|
|
|
order by account""", si.name) |
|
|
|
|
|
|
|
self.assertEqual(gle, expected_gle) |
|
|
|
|
|
|
|
si.cancel() |
|
|
|
self.assertEqual(frappe.db.get_value("Asset", asset.name, "status"), "Partially Depreciated") |
|
|
|
|
|
|
|
def test_asset_expected_value_after_useful_life(self): |
|
|
|
pr = make_purchase_receipt(item_code="Macbook Pro", |
|
|
|
qty=1, rate=100000.0, location="Test Location") |
|
|
|
|
|
|
|
asset_name = frappe.db.get_value("Asset", {"purchase_receipt": pr.name}, 'name') |
|
|
|
asset = frappe.get_doc('Asset', asset_name) |
|
|
|
asset.calculate_depreciation = 1 |
|
|
|
asset.available_for_use_date = '2020-06-06' |
|
|
|
asset.purchase_date = '2020-06-06' |
|
|
|
asset.append("finance_books", { |
|
|
|
"expected_value_after_useful_life": 10000, |
|
|
|
"depreciation_method": "Straight Line", |
|
|
|
"total_number_of_depreciations": 3, |
|
|
|
"frequency_of_depreciation": 10 |
|
|
|
}) |
|
|
|
asset.save() |
|
|
|
accumulated_depreciation_after_full_schedule = \ |
|
|
|
max(d.accumulated_depreciation_amount for d in asset.get("schedules")) |
|
|
|
|
|
|
|
asset_value_after_full_schedule = (flt(asset.gross_purchase_amount) - |
|
|
|
flt(accumulated_depreciation_after_full_schedule)) |
|
|
|
|
|
|
|
self.assertTrue(asset.finance_books[0].expected_value_after_useful_life >= asset_value_after_full_schedule) |
|
|
|
|
|
|
|
# CWIP: Capital Work In Progress |
|
|
|
def test_cwip_accounting(self): |
|
|
|
pr = make_purchase_receipt(item_code="Macbook Pro", |
|
|
|
qty=1, rate=5000, do_not_submit=True, location="Test Location") |
|
|
|
|
|
|
|
pr.set('taxes', [{ |
|
|
|
'category': 'Total', |
|
|
|
'add_deduct_tax': 'Add', |
|
|
|
'charge_type': 'On Net Total', |
|
|
|
'account_head': '_Test Account Service Tax - _TC', |
|
|
|
'description': '_Test Account Service Tax', |
|
|
|
'cost_center': 'Main - _TC', |
|
|
|
'rate': 5.0 |
|
|
|
}, { |
|
|
|
'category': 'Valuation and Total', |
|
|
|
'add_deduct_tax': 'Add', |
|
|
|
'charge_type': 'On Net Total', |
|
|
|
'account_head': '_Test Account Shipping Charges - _TC', |
|
|
|
'description': '_Test Account Shipping Charges', |
|
|
|
'cost_center': 'Main - _TC', |
|
|
|
'rate': 5.0 |
|
|
|
}]) |
|
|
|
|
|
|
|
pr.submit() |
|
|
|
|
|
|
|
expected_gle = ( |
|
|
|
("Asset Received But Not Billed - _TC", 0.0, 5250.0), |
|
|
|
("CWIP Account - _TC", 5250.0, 0.0) |
|
|
|
) |
|
|
|
|
|
|
|
pr_gle = frappe.db.sql("""select account, debit, credit from `tabGL Entry` |
|
|
|
where voucher_type='Purchase Receipt' and voucher_no = %s |
|
|
|
order by account""", pr.name) |
|
|
|
|
|
|
|
self.assertEqual(pr_gle, expected_gle) |
|
|
|
|
|
|
|
pi = make_invoice(pr.name) |
|
|
|
pi.submit() |
|
|
|
|
|
|
|
expected_gle = ( |
|
|
|
("_Test Account Service Tax - _TC", 250.0, 0.0), |
|
|
|
("_Test Account Shipping Charges - _TC", 250.0, 0.0), |
|
|
|
("Asset Received But Not Billed - _TC", 5250.0, 0.0), |
|
|
|
("Creditors - _TC", 0.0, 5500.0), |
|
|
|
("Expenses Included In Asset Valuation - _TC", 0.0, 250.0), |
|
|
|
) |
|
|
|
|
|
|
|
pi_gle = frappe.db.sql("""select account, debit, credit from `tabGL Entry` |
|
|
|
where voucher_type='Purchase Invoice' and voucher_no = %s |
|
|
|
order by account""", pi.name) |
|
|
|
|
|
|
|
self.assertEqual(pi_gle, expected_gle) |
|
|
|
expected_schedules = [ |
|
|
|
["2030-12-31", 33333.50, 83333.50], |
|
|
|
["2031-12-31", 6666.50, 90000.0] |
|
|
|
] |
|
|
|
|
|
|
|
asset = frappe.db.get_value('Asset', |
|
|
|
{'purchase_receipt': pr.name, 'docstatus': 0}, 'name') |
|
|
|
schedules = [[cstr(d.schedule_date), d.depreciation_amount, d.accumulated_depreciation_amount] |
|
|
|
for d in asset.get("schedules")] |
|
|
|
|
|
|
|
asset_doc = frappe.get_doc('Asset', asset) |
|
|
|
self.assertEqual(schedules, expected_schedules) |
|
|
|
|
|
|
|
month_end_date = get_last_day(nowdate()) |
|
|
|
asset_doc.available_for_use_date = nowdate() if nowdate() != month_end_date else add_days(nowdate(), -15) |
|
|
|
self.assertEqual(asset_doc.gross_purchase_amount, 5250.0) |
|
|
|
def test_schedule_for_prorated_straight_line_method(self): |
|
|
|
pr = make_purchase_receipt(item_code="Macbook Pro", |
|
|
|
qty=1, rate=100000.0, location="Test Location") |
|
|
|
|
|
|
|
asset_doc.append("finance_books", { |
|
|
|
"expected_value_after_useful_life": 200, |
|
|
|
asset_name = frappe.db.get_value("Asset", {"purchase_receipt": pr.name}, 'name') |
|
|
|
asset = frappe.get_doc('Asset', asset_name) |
|
|
|
asset.calculate_depreciation = 1 |
|
|
|
asset.purchase_date = '2030-01-30' |
|
|
|
asset.is_existing_asset = 0 |
|
|
|
asset.available_for_use_date = "2030-01-30" |
|
|
|
asset.append("finance_books", { |
|
|
|
"expected_value_after_useful_life": 10000, |
|
|
|
"depreciation_method": "Straight Line", |
|
|
|
"total_number_of_depreciations": 3, |
|
|
|
"frequency_of_depreciation": 10, |
|
|
|
"depreciation_start_date": month_end_date |
|
|
|
"frequency_of_depreciation": 12, |
|
|
|
"depreciation_start_date": "2030-12-31" |
|
|
|
}) |
|
|
|
asset_doc.submit() |
|
|
|
|
|
|
|
expected_gle = ( |
|
|
|
("_Test Fixed Asset - _TC", 5250.0, 0.0), |
|
|
|
("CWIP Account - _TC", 0.0, 5250.0) |
|
|
|
) |
|
|
|
asset.save() |
|
|
|
|
|
|
|
gle = frappe.db.sql("""select account, debit, credit from `tabGL Entry` |
|
|
|
where voucher_type='Asset' and voucher_no = %s |
|
|
|
order by account""", asset_doc.name) |
|
|
|
expected_schedules = [ |
|
|
|
["2030-12-31", 27534.25, 27534.25], |
|
|
|
["2031-12-31", 30000.0, 57534.25], |
|
|
|
["2032-12-31", 30000.0, 87534.25], |
|
|
|
["2033-01-30", 2465.75, 90000.0] |
|
|
|
] |
|
|
|
|
|
|
|
schedules = [[cstr(d.schedule_date), flt(d.depreciation_amount, 2), flt(d.accumulated_depreciation_amount, 2)] |
|
|
|
for d in asset.get("schedules")] |
|
|
|
|
|
|
|
self.assertEqual(gle, expected_gle) |
|
|
|
self.assertEqual(schedules, expected_schedules) |
|
|
|
|
|
|
|
def test_expense_head(self): |
|
|
|
# WDV: Written Down Value method |
|
|
|
def test_depreciation_entry_for_wdv_without_pro_rata(self): |
|
|
|
pr = make_purchase_receipt(item_code="Macbook Pro", |
|
|
|
qty=2, rate=200000.0, location="Test Location") |
|
|
|
qty=1, rate=8000.0, location="Test Location") |
|
|
|
|
|
|
|
doc = make_invoice(pr.name) |
|
|
|
asset_name = frappe.db.get_value("Asset", {"purchase_receipt": pr.name}, 'name') |
|
|
|
asset = frappe.get_doc('Asset', asset_name) |
|
|
|
asset.calculate_depreciation = 1 |
|
|
|
asset.available_for_use_date = '2030-01-01' |
|
|
|
asset.purchase_date = '2030-01-01' |
|
|
|
asset.append("finance_books", { |
|
|
|
"expected_value_after_useful_life": 1000, |
|
|
|
"depreciation_method": "Written Down Value", |
|
|
|
"total_number_of_depreciations": 3, |
|
|
|
"frequency_of_depreciation": 12, |
|
|
|
"depreciation_start_date": "2030-12-31" |
|
|
|
}) |
|
|
|
asset.save(ignore_permissions=True) |
|
|
|
|
|
|
|
self.assertEqual('Asset Received But Not Billed - _TC', doc.items[0].expense_account) |
|
|
|
self.assertEqual(asset.finance_books[0].rate_of_depreciation, 50.0) |
|
|
|
|
|
|
|
def test_asset_cwip_toggling_cases(self): |
|
|
|
cwip = frappe.db.get_value("Asset Category", "Computers", "enable_cwip_accounting") |
|
|
|
name = frappe.db.get_value("Asset Category Account", filters={"parent": "Computers"}, fieldname=["name"]) |
|
|
|
cwip_acc = "CWIP Account - _TC" |
|
|
|
expected_schedules = [ |
|
|
|
["2030-12-31", 4000.00, 4000.00], |
|
|
|
["2031-12-31", 2000.00, 6000.00], |
|
|
|
["2032-12-31", 1000.00, 7000.0], |
|
|
|
] |
|
|
|
|
|
|
|
frappe.db.set_value("Asset Category", "Computers", "enable_cwip_accounting", 0) |
|
|
|
frappe.db.set_value("Asset Category Account", name, "capital_work_in_progress_account", "") |
|
|
|
frappe.db.get_value("Company", "_Test Company", "capital_work_in_progress_account", "") |
|
|
|
schedules = [[cstr(d.schedule_date), flt(d.depreciation_amount, 2), flt(d.accumulated_depreciation_amount, 2)] |
|
|
|
for d in asset.get("schedules")] |
|
|
|
|
|
|
|
# case 0 -- PI with cwip disable, Asset with cwip disabled, No cwip account set |
|
|
|
pi = make_purchase_invoice(item_code="Macbook Pro", qty=1, rate=200000.0, location="Test Location", update_stock=1) |
|
|
|
asset = frappe.db.get_value('Asset', {'purchase_invoice': pi.name, 'docstatus': 0}, 'name') |
|
|
|
asset_doc = frappe.get_doc('Asset', asset) |
|
|
|
asset_doc.available_for_use_date = nowdate() |
|
|
|
asset_doc.calculate_depreciation = 0 |
|
|
|
asset_doc.submit() |
|
|
|
gle = frappe.db.sql("""select name from `tabGL Entry` where voucher_type='Asset' and voucher_no = %s""", asset_doc.name) |
|
|
|
self.assertFalse(gle) |
|
|
|
self.assertEqual(schedules, expected_schedules) |
|
|
|
|
|
|
|
# case 1 -- PR with cwip disabled, Asset with cwip enabled |
|
|
|
pr = make_purchase_receipt(item_code="Macbook Pro", qty=1, rate=200000.0, location="Test Location") |
|
|
|
frappe.db.set_value("Asset Category", "Computers", "enable_cwip_accounting", 1) |
|
|
|
frappe.db.set_value("Asset Category Account", name, "capital_work_in_progress_account", cwip_acc) |
|
|
|
asset = frappe.db.get_value('Asset', {'purchase_receipt': pr.name, 'docstatus': 0}, 'name') |
|
|
|
asset_doc = frappe.get_doc('Asset', asset) |
|
|
|
asset_doc.available_for_use_date = nowdate() |
|
|
|
asset_doc.calculate_depreciation = 0 |
|
|
|
asset_doc.submit() |
|
|
|
gle = frappe.db.sql("""select name from `tabGL Entry` where voucher_type='Asset' and voucher_no = %s""", asset_doc.name) |
|
|
|
self.assertFalse(gle) |
|
|
|
# WDV: Written Down Value method |
|
|
|
def test_pro_rata_depreciation_entry_for_wdv(self): |
|
|
|
pr = make_purchase_receipt(item_code="Macbook Pro", |
|
|
|
qty=1, rate=8000.0, location="Test Location") |
|
|
|
|
|
|
|
# case 2 -- PR with cwip enabled, Asset with cwip disabled |
|
|
|
pr = make_purchase_receipt(item_code="Macbook Pro", qty=1, rate=200000.0, location="Test Location") |
|
|
|
frappe.db.set_value("Asset Category", "Computers", "enable_cwip_accounting", 0) |
|
|
|
asset = frappe.db.get_value('Asset', {'purchase_receipt': pr.name, 'docstatus': 0}, 'name') |
|
|
|
asset_doc = frappe.get_doc('Asset', asset) |
|
|
|
asset_doc.available_for_use_date = nowdate() |
|
|
|
asset_doc.calculate_depreciation = 0 |
|
|
|
asset_doc.submit() |
|
|
|
gle = frappe.db.sql("""select name from `tabGL Entry` where voucher_type='Asset' and voucher_no = %s""", asset_doc.name) |
|
|
|
self.assertTrue(gle) |
|
|
|
asset_name = frappe.db.get_value("Asset", {"purchase_receipt": pr.name}, 'name') |
|
|
|
asset = frappe.get_doc('Asset', asset_name) |
|
|
|
asset.calculate_depreciation = 1 |
|
|
|
asset.available_for_use_date = '2030-06-06' |
|
|
|
asset.purchase_date = '2030-01-01' |
|
|
|
asset.append("finance_books", { |
|
|
|
"expected_value_after_useful_life": 1000, |
|
|
|
"depreciation_method": "Written Down Value", |
|
|
|
"total_number_of_depreciations": 3, |
|
|
|
"frequency_of_depreciation": 12, |
|
|
|
"depreciation_start_date": "2030-12-31" |
|
|
|
}) |
|
|
|
asset.save(ignore_permissions=True) |
|
|
|
|
|
|
|
# case 3 -- PI with cwip disabled, Asset with cwip enabled |
|
|
|
pi = make_purchase_invoice(item_code="Macbook Pro", qty=1, rate=200000.0, location="Test Location", update_stock=1) |
|
|
|
frappe.db.set_value("Asset Category", "Computers", "enable_cwip_accounting", 1) |
|
|
|
asset = frappe.db.get_value('Asset', {'purchase_invoice': pi.name, 'docstatus': 0}, 'name') |
|
|
|
asset_doc = frappe.get_doc('Asset', asset) |
|
|
|
asset_doc.available_for_use_date = nowdate() |
|
|
|
asset_doc.calculate_depreciation = 0 |
|
|
|
asset_doc.submit() |
|
|
|
gle = frappe.db.sql("""select name from `tabGL Entry` where voucher_type='Asset' and voucher_no = %s""", asset_doc.name) |
|
|
|
self.assertFalse(gle) |
|
|
|
self.assertEqual(asset.finance_books[0].rate_of_depreciation, 50.0) |
|
|
|
|
|
|
|
# case 4 -- PI with cwip enabled, Asset with cwip disabled |
|
|
|
pi = make_purchase_invoice(item_code="Macbook Pro", qty=1, rate=200000.0, location="Test Location", update_stock=1) |
|
|
|
frappe.db.set_value("Asset Category", "Computers", "enable_cwip_accounting", 0) |
|
|
|
asset = frappe.db.get_value('Asset', {'purchase_invoice': pi.name, 'docstatus': 0}, 'name') |
|
|
|
asset_doc = frappe.get_doc('Asset', asset) |
|
|
|
asset_doc.available_for_use_date = nowdate() |
|
|
|
asset_doc.calculate_depreciation = 0 |
|
|
|
asset_doc.submit() |
|
|
|
gle = frappe.db.sql("""select name from `tabGL Entry` where voucher_type='Asset' and voucher_no = %s""", asset_doc.name) |
|
|
|
self.assertTrue(gle) |
|
|
|
expected_schedules = [ |
|
|
|
["2030-12-31", 2279.45, 2279.45], |
|
|
|
["2031-12-31", 2860.28, 5139.73], |
|
|
|
["2032-12-31", 1430.14, 6569.87], |
|
|
|
["2033-06-06", 430.13, 7000.0], |
|
|
|
] |
|
|
|
|
|
|
|
frappe.db.set_value("Asset Category", "Computers", "enable_cwip_accounting", cwip) |
|
|
|
frappe.db.set_value("Asset Category Account", name, "capital_work_in_progress_account", cwip_acc) |
|
|
|
frappe.db.get_value("Company", "_Test Company", "capital_work_in_progress_account", cwip_acc) |
|
|
|
schedules = [[cstr(d.schedule_date), flt(d.depreciation_amount, 2), flt(d.accumulated_depreciation_amount, 2)] |
|
|
|
for d in asset.get("schedules")] |
|
|
|
|
|
|
|
self.assertEqual(schedules, expected_schedules) |
|
|
|
|
|
|
|
def test_discounted_wdv_depreciation_rate_for_indian_region(self): |
|
|
|
# set indian company |
|
|
@ -678,6 +587,7 @@ class TestAsset(unittest.TestCase): |
|
|
|
# reset indian company |
|
|
|
frappe.flags.company = company_flag |
|
|
|
|
|
|
|
class TestDepreciationBasics(AssetSetup): |
|
|
|
def test_depreciation_without_pro_rata(self): |
|
|
|
asset = create_asset(item_code="Macbook Pro", calculate_depreciation=1, |
|
|
|
available_for_use_date=getdate("2019-12-31"), total_number_of_depreciations=3, |
|
|
@ -811,7 +721,7 @@ class TestAsset(unittest.TestCase): |
|
|
|
has_pro_rata = asset.check_is_pro_rata(asset.finance_books[0]) |
|
|
|
self.assertTrue(has_pro_rata) |
|
|
|
|
|
|
|
def test_expected_value_after_useful_life(self): |
|
|
|
def test_expected_value_after_useful_life_greater_than_purchase_amount(self): |
|
|
|
"""Tests if an error is raised when expected_value_after_useful_life(110,000) > gross_purchase_amount(100,000).""" |
|
|
|
|
|
|
|
asset = create_asset(item_code="Macbook Pro", calculate_depreciation=1, |
|
|
@ -921,6 +831,99 @@ class TestAsset(unittest.TestCase): |
|
|
|
|
|
|
|
self.assertEqual(len(asset.schedules), 1) |
|
|
|
|
|
|
|
def test_depreciation_entry_cancellation(self): |
|
|
|
pr = make_purchase_receipt(item_code="Macbook Pro", |
|
|
|
qty=1, rate=100000.0, location="Test Location") |
|
|
|
|
|
|
|
asset_name = frappe.db.get_value("Asset", {"purchase_receipt": pr.name}, 'name') |
|
|
|
asset = frappe.get_doc('Asset', asset_name) |
|
|
|
asset.calculate_depreciation = 1 |
|
|
|
asset.available_for_use_date = '2020-06-06' |
|
|
|
asset.purchase_date = '2020-06-06' |
|
|
|
asset.append("finance_books", { |
|
|
|
"expected_value_after_useful_life": 10000, |
|
|
|
"depreciation_method": "Straight Line", |
|
|
|
"total_number_of_depreciations": 3, |
|
|
|
"frequency_of_depreciation": 10, |
|
|
|
"depreciation_start_date": "2020-12-31" |
|
|
|
}) |
|
|
|
asset.submit() |
|
|
|
post_depreciation_entries(date="2021-01-01") |
|
|
|
|
|
|
|
asset.load_from_db() |
|
|
|
|
|
|
|
# cancel depreciation entry |
|
|
|
depr_entry = asset.get("schedules")[0].journal_entry |
|
|
|
self.assertTrue(depr_entry) |
|
|
|
frappe.get_doc("Journal Entry", depr_entry).cancel() |
|
|
|
|
|
|
|
asset.load_from_db() |
|
|
|
depr_entry = asset.get("schedules")[0].journal_entry |
|
|
|
self.assertFalse(depr_entry) |
|
|
|
|
|
|
|
def test_asset_expected_value_after_useful_life(self): |
|
|
|
pr = make_purchase_receipt(item_code="Macbook Pro", |
|
|
|
qty=1, rate=100000.0, location="Test Location") |
|
|
|
|
|
|
|
asset_name = frappe.db.get_value("Asset", {"purchase_receipt": pr.name}, 'name') |
|
|
|
asset = frappe.get_doc('Asset', asset_name) |
|
|
|
asset.calculate_depreciation = 1 |
|
|
|
asset.available_for_use_date = '2020-06-06' |
|
|
|
asset.purchase_date = '2020-06-06' |
|
|
|
asset.append("finance_books", { |
|
|
|
"expected_value_after_useful_life": 10000, |
|
|
|
"depreciation_method": "Straight Line", |
|
|
|
"total_number_of_depreciations": 3, |
|
|
|
"frequency_of_depreciation": 10 |
|
|
|
}) |
|
|
|
asset.save() |
|
|
|
accumulated_depreciation_after_full_schedule = \ |
|
|
|
max(d.accumulated_depreciation_amount for d in asset.get("schedules")) |
|
|
|
|
|
|
|
asset_value_after_full_schedule = (flt(asset.gross_purchase_amount) - |
|
|
|
flt(accumulated_depreciation_after_full_schedule)) |
|
|
|
|
|
|
|
self.assertTrue(asset.finance_books[0].expected_value_after_useful_life >= asset_value_after_full_schedule) |
|
|
|
|
|
|
|
def test_gle_made_by_depreciation_entries(self): |
|
|
|
pr = make_purchase_receipt(item_code="Macbook Pro", |
|
|
|
qty=1, rate=100000.0, location="Test Location") |
|
|
|
|
|
|
|
asset_name = frappe.db.get_value("Asset", {"purchase_receipt": pr.name}, 'name') |
|
|
|
asset = frappe.get_doc('Asset', asset_name) |
|
|
|
asset.calculate_depreciation = 1 |
|
|
|
asset.purchase_date = '2020-01-30' |
|
|
|
asset.available_for_use_date = "2020-01-30" |
|
|
|
asset.append("finance_books", { |
|
|
|
"expected_value_after_useful_life": 10000, |
|
|
|
"depreciation_method": "Straight Line", |
|
|
|
"total_number_of_depreciations": 3, |
|
|
|
"frequency_of_depreciation": 10, |
|
|
|
"depreciation_start_date": "2020-12-31" |
|
|
|
}) |
|
|
|
asset.submit() |
|
|
|
asset.load_from_db() |
|
|
|
self.assertEqual(asset.status, "Submitted") |
|
|
|
|
|
|
|
frappe.db.set_value("Company", "_Test Company", "series_for_depreciation_entry", "DEPR-") |
|
|
|
post_depreciation_entries(date="2021-01-01") |
|
|
|
asset.load_from_db() |
|
|
|
|
|
|
|
# check depreciation entry series |
|
|
|
self.assertEqual(asset.get("schedules")[0].journal_entry[:4], "DEPR") |
|
|
|
|
|
|
|
expected_gle = ( |
|
|
|
("_Test Accumulated Depreciations - _TC", 0.0, 30000.0), |
|
|
|
("_Test Depreciations - _TC", 30000.0, 0.0) |
|
|
|
) |
|
|
|
|
|
|
|
gle = frappe.db.sql("""select account, debit, credit from `tabGL Entry` |
|
|
|
where against_voucher_type='Asset' and against_voucher = %s |
|
|
|
order by account""", asset.name) |
|
|
|
|
|
|
|
self.assertEqual(gle, expected_gle) |
|
|
|
self.assertEqual(asset.get("value_after_depreciation"), 0) |
|
|
|
|
|
|
|
def create_asset_data(): |
|
|
|
if not frappe.db.exists("Asset Category", "Computers"): |
|
|
|
create_asset_category() |
|
|
|