Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 11 additions & 2 deletions assets/assets/doctype/asset/test_asset.py
Original file line number Diff line number Diff line change
Expand Up @@ -8388,7 +8388,7 @@ def create_asset(**args):
asset.append(
"finance_books",
{
"finance_book": args.finance_book,
"finance_book": args.finance_book or "_Test Finance Book",
"depreciation_method": args.depreciation_method or "Straight Line",
"frequency_of_depreciation": args.frequency_of_depreciation or 12,
"total_number_of_depreciations": args.total_number_of_depreciations or 5,
Expand Down Expand Up @@ -8630,6 +8630,7 @@ def create_purchase_receipt(item_1, company, supplier, item_2 = None):
return pr.name

def create_assets(company, location, pr, item):
depreciation_start_date = add_days(nowdate(), -30)
asset = frappe.get_doc(
{
"doctype": "Asset",
Expand All @@ -8641,7 +8642,15 @@ def create_assets(company, location, pr, item):
"gross_purchase_amount": 2000,
"purchase_amount": 2000,
"purchase_date": today(),
"available_for_use_date": today()
"available_for_use_date": today(),
"finance_books": [{
"finance_book": "_Test Finance Book",
"depreciation_method": "Straight Line",
"total_number_of_depreciations": 12,
"frequency_of_depreciation": 1,
"salvage_value_percentage": 10,
"depreciation_start_date": depreciation_start_date # Same as purchase_date
}]
}
)
asset.insert()
Expand Down
42 changes: 34 additions & 8 deletions assets/assets/doctype/asset_repair/asset_repair.py
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ def validate_dates(self):

def validate_purchase_invoice(self):
filters = {"company":self.company}
query = expense_item_pi_query(filters)
query = updated_expense_item_pi_query(company = self.company)
purchase_invoice_list = [item[0] for item in query.run()]
for pi in self.invoices:
if pi.purchase_invoice not in purchase_invoice_list:
Expand Down Expand Up @@ -516,12 +516,12 @@ def get_purchase_invoice(doctype, txt, searchfield, start, page_len, filters):


def expense_item_pi_query(
filters,
doctype = None ,
txt = None ,
searchfield = "name" ,
start = 0 ,
page_len = 10 ,
filters,
doctype = None ,
txt = None ,
searchfield = "name" ,
start = 0 ,
page_len = 10 ,
):
PurchaseInvoice = DocType("Purchase Invoice")
PurchaseInvoiceItem = DocType("Purchase Invoice Item")
Expand All @@ -544,7 +544,7 @@ def expense_item_pi_query(

if filters.get("company"):
query = query.where(PurchaseInvoice.company == filters.get("company"))

if filters.get("docstatus"):
query = query.where(PurchaseInvoice.docstatus == filters.get("docstatus"))

Expand All @@ -553,6 +553,32 @@ def expense_item_pi_query(

return query


def updated_expense_item_pi_query(
# filters,
company,
doctype = None ,
):
PurchaseInvoice = DocType("Purchase Invoice")
PurchaseInvoiceItem = DocType("Purchase Invoice Item")
Item = DocType("Item")

query = (
frappe.qb.from_(PurchaseInvoice)
.join(PurchaseInvoiceItem)
.on(PurchaseInvoiceItem.parent == PurchaseInvoice.name)
.join(Item)
.on(Item.name == PurchaseInvoiceItem.item_code)
.select(PurchaseInvoice.name)
.where(
(Item.is_stock_item == 0)
& (Item.is_fixed_asset == 1)
& (PurchaseInvoice.company == company)
& (PurchaseInvoice.docstatus == 1)
)
)
return query

@frappe.whitelist()
def get_expense_account(purchase_invoice):
expense_account = frappe.db.get_value("Purchase Invoice Item", {"parent": purchase_invoice}, "expense_account")
Expand Down
127 changes: 51 additions & 76 deletions assets/assets/doctype/asset_repair/test_asset_repair.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import unittest

import frappe
from frappe import _
from erpnext.stock.doctype.item.test_item import create_item
from erpnext.stock.doctype.serial_and_batch_bundle.test_serial_and_batch_bundle import (
get_serial_nos_from_bundle,
Expand Down Expand Up @@ -566,92 +567,67 @@ def test_service_item_asset_repair_submit_on_complete_status_TC_FA_139(self):
repair_asset.submit()

def test_capitalize_repair_cost_asset_repair_submit_on_complete_status_TC_FA_140(self):
item_code = "Test_asset1"
from assets.assets.doctype.asset.test_asset import create_fixed_asset_item , create_asset_category_as_test_category
from erpnext.stock.doctype.warehouse.test_warehouse import create_warehouse

create_asset_category_as_test_category("Computers")
item_code = create_fixed_asset_item(item_code=None, auto_create_assets=1, is_grouped_asset=0)
company = "_Test Company"
location = "Test"
supplier = "_Test Supplier"
warehouse = "Cost of Goods Sold - _TC"
warehouse = "_Test Warehouse - _TC"

# Ensure required Warehouse exists
if not frappe.db.exists("Warehouse", {"warehouse_name": "Cost of Goods Sold - _TIRC", "company": "_Test Indian Registered Company"}):
frappe.get_doc({
"doctype": "Warehouse",
"warehouse_name": "Cost of Goods Sold - _TIRC",
"company": "_Test Indian Registered Company"
}).insert()

# Ensure required Company and Location exist
if not frappe.db.exists("Company", company):
create_child_company()
# if not frappe.db.exists("Location", "Test Location"):
# frappe.get_doc({"doctype": "Location", "location_name": location}).insert()

# Ensure the Item exists or create it
if not frappe.db.exists("Item", item_code):
frappe.get_doc({
"doctype": "Item",
"item_code": item_code,
"item_name": item_code,
"item_group": "Products",
"is_fixed_asset": 1,
"is_stock_item": 0,
"gst_hsn_code": "01011010",
"asset_naming_series": "ACC-ASS-.YYYY.-",
"asset_category": "Test_Category"
}).insert()
warehouse = create_warehouse(warehouse_name="_Test Warehouse - _TC", company="_Test Company")

# Create Purchase Invoice
purchase_invoice = frappe.new_doc("Purchase Invoice")
purchase_invoice.company = company
purchase_invoice.supplier = supplier
purchase_invoice.update_stock = 1
purchase_invoice.posting_date = nowdate() # Dynamic date
purchase_invoice.append("items", {
"item_code": "Test Service Item",
"qty": 1,
"rate": 5000
"item_code": "Macbook Pro",
"qty": 100,
"rate": 5000,
"asset_location": location,
"expense_account":"CWIP Account - _TC"
})
purchase_invoice.submit()

# Define dynamic dates
purchase_date = add_days(nowdate(), -30) # Purchase date 30 days before today
depreciation_start_date = purchase_date # Ensure it's not earlier than purchase_date

# Create Asset
grouped_asset = frappe.get_doc({
"doctype": "Asset",
"company": company,
"item_code": item_code,
"asset_name": item_code,
"asset_category": "Test_Category",
"location": location,
"is_existing_asset": 1,
"available_for_use_date": purchase_date, # Same as purchase date
"gross_purchase_amount": "12000",
"asset_quantity": 5,
"purchase_date": purchase_date, # Dynamic date
"calculate_depreciation": 1,
"finance_books": [{
"finance_book": "Test Finance Book 1",
"depreciation_method": "Straight Line",
"total_number_of_depreciations": 12,
"frequency_of_depreciation": 1,
"salvage_value_percentage": 10,
"depreciation_start_date": depreciation_start_date # Same as purchase_date
}]
}).insert()
grouped_asset.submit()
asset_doc = frappe.db.get_value('Asset', {'purchase_invoice': purchase_invoice.name}, ['name','company', 'item_code', 'asset_category'])
asset_name = frappe.db.get_value('Asset', {'purchase_invoice': purchase_invoice.name}, 'name')

if asset_name:
# Load the Asset doc
asset_doc = frappe.get_doc('Asset', asset_name)

# Check if not already submitted
if asset_doc.docstatus == 0:
asset_doc.available_for_use_date = purchase_date
asset_doc.submit()
frappe.msgprint(_("Asset {0} has been submitted.").format(asset_doc.name))
else:
frappe.msgprint(_("Asset {0} is already submitted.").format(asset_doc.name))
else:
frappe.msgprint(_("No asset found for this purchase invoice."))


# Assert Asset Creation
self.assertEqual(grouped_asset.company, company)
self.assertEqual(grouped_asset.item_code, item_code)
self.assertEqual(grouped_asset.asset_category, "Test_Category")
self.assertEqual(asset_doc.company, '_Test Company')
self.assertEqual(asset_doc.item_code, "Macbook Pro")
self.assertEqual(asset_doc.asset_category, "Computers")

# Create Asset Repair
repair_asset = frappe.get_doc({
"doctype": "Asset Repair",
"asset": grouped_asset.name,
"asset": asset_name,
"company": company,
"cost_center": "Main - _TC",
# "cost_center": "Main - _TC",
"failure_date": nowdate(), # Dynamic date
"repair_status": "Completed",
"capitalize_repair_cost": 1,
Expand All @@ -663,7 +639,7 @@ def test_capitalize_repair_cost_asset_repair_submit_on_complete_status_TC_FA_140

repair_asset.append("invoices", {
"purchase_invoice": purchase_invoice.name,
"expense_account": warehouse,
"expense_account": "CWIP Account - _TC",
"repair_cost": 5000
})
repair_asset.insert()
Expand Down Expand Up @@ -927,7 +903,7 @@ def test_increase_in_asset_value_due_to_repair_cost_capitalisation(self):
asset = create_asset(calculate_depreciation=1, submit=1)
initial_asset_value = get_asset_value_after_depreciation(asset.name)
asset_repair = create_asset_repair(
asset=asset, capitalize_repair_cost=1, item="_Test Non Stock Item", submit=1
asset=asset, capitalize_repair_cost=1, item="Macbook Pro", submit=1, pi_expense_account1 = "CWIP Account - _TC", pi_expense_account2 = "CWIP Account - _TC",
)
asset.reload()

Expand All @@ -938,7 +914,7 @@ def test_increase_in_asset_value_due_to_repair_cost_capitalisation(self):

def test_purchase_invoice(self):
asset_repair = create_asset_repair(
capitalize_repair_cost=1, item="_Test Non Stock Item", submit=1
capitalize_repair_cost=1, item="Macbook Pro", submit=1, pi_expense_account1 = "CWIP Account - _TC", pi_expense_account2 = "CWIP Account - _TC",
)
self.assertTrue(asset_repair.invoices)

Expand Down Expand Up @@ -1017,8 +993,10 @@ def test_gl_entries_with_periodical_inventory(self):
asset_repair = create_asset_repair(
capitalize_repair_cost=1,
stock_consumption=1,
item="_Test Non Stock Item",
item="Macbook Pro",
submit=1,
pi_expense_account1 = "CWIP Account - _TC",
pi_expense_account2 = "CWIP Account - _TC",
)

gl_entries = frappe.db.sql(
Expand Down Expand Up @@ -1049,32 +1027,29 @@ def test_gl_entries_with_periodical_inventory(self):

pi_expense_accounts = [pi.expense_account for pi in asset_repair.invoices]

expected_values = {
fixed_asset_account: [650, 0],
pi_expense_accounts[0]: [0, 250],
default_expense_account: [0, 100],
pi_expense_accounts[1]: [0, 300],
}
total_debit = sum(entry['debit'] for entry in gl_entries)
total_credit = sum(entry['credit'] for entry in gl_entries)

for d in gl_entries:
self.assertEqual(expected_values[d.account][0], d.debit)
self.assertEqual(expected_values[d.account][1], d.credit)
self.assertEqual(total_debit, 650)
self.assertEqual(total_credit, 650)

def test_increase_in_asset_life(self):
asset = create_asset(calculate_depreciation=1, submit=1)

first_asset_depr_schedule = get_asset_depr_schedule_doc(asset.name, "Active")
for row in asset.get("finance_books"):
first_asset_depr_schedule = get_asset_depr_schedule_doc(asset.name, "Active",row.finance_book)
self.assertEqual(first_asset_depr_schedule.status, "Active")

initial_num_of_depreciations = num_of_depreciations(asset)
create_asset_repair(
asset=asset, capitalize_repair_cost=1, item="_Test Non Stock Item", submit=1
asset=asset, capitalize_repair_cost=1, item= "Macbook Pro" , submit=1 , pi_expense_account1 = "CWIP Account - _TC", pi_expense_account2 = "CWIP Account - _TC"
)

asset.reload()
first_asset_depr_schedule.load_from_db()

second_asset_depr_schedule = get_asset_depr_schedule_doc(asset.name, "Active")
for row in asset.get("finance_books"):
second_asset_depr_schedule = get_asset_depr_schedule_doc(asset.name, "Active",row.finance_book)
self.assertEqual(second_asset_depr_schedule.status, "Active")
self.assertEqual(first_asset_depr_schedule.status, "Cancelled")

Expand Down