Fixed Asset Disposal Wizard Documentation¶
Overview¶
The Fixed Asset Disposal Wizard (account.fixed.asset.dispose) handles the disposal of fixed assets when they are scrapped, discarded, or otherwise removed from service without sale proceeds. This wizard creates the necessary journal entries to remove the asset from the books, write off remaining book value as a loss, and update the asset status to "sold" (disposed).
Model Information¶
Model Name: account.fixed.asset.dispose
Display Name: Fixed Asset Dispose
Name Field: None
Key Fields: None
Transient: Yes (not persisted to database)
Features¶
- ✅ Automated disposal journal entries
- ✅ Book value write-off
- ✅ Asset status update
- ✅ Loss account specification
- ✅ Audit trail with description
Key Fields Reference¶
Wizard Fields¶
| Field | Type | Required | Description |
|---|---|---|---|
asset_id |
Many2One | Yes (readonly) | Asset being disposed |
date |
Date | ✅ | Disposal date |
loss_acc_id |
Many2One | ✅ | GL account for disposal loss |
Default Values:
- date: Current date
- asset_id: From context (refer_id)
API Methods¶
1. Dispose Asset¶
Method: dispose(ids, context)
Processes asset disposal and creates journal entries.
Behavior: 1. Finds general journal 2. Creates journal entry with three lines: - Credit fixed asset account (remove asset) - Debit accumulated depreciation (clear depreciation) - Debit loss account (write off book value) 3. Posts journal entry 4. Updates asset state to "sold" 5. Sets disposal date
Journal Entry Created:
Dr Accumulated Depreciation X,XXX (total depreciation)
Dr Loss on Asset Disposal X,XXX (book value)
Cr Fixed Asset Account X,XXX (purchase price)
Example:
# Dispose of asset
wizard_id = get_model("account.fixed.asset.dispose").create({
"asset_id": asset_id,
"date": "2025-01-15",
"loss_acc_id": loss_account_id
})
result = get_model("account.fixed.asset.dispose").dispose([wizard_id])
# Returns navigation to asset form
# Asset state now "sold", date_dispose set
Common Use Cases¶
Use Case 1: Dispose Fully Depreciated Asset¶
# Asset with zero book value (fully depreciated)
asset = get_model("account.fixed.asset").browse([asset_id])[0]
print(f"Asset: {asset.name}")
print(f"Purchase Price: ${asset.price_purchase:,.2f}")
print(f"Book Value: ${asset.book_val:,.2f}")
if asset.book_val == 0:
# No loss to record
wizard_id = get_model("account.fixed.asset.dispose").create({
"asset_id": asset_id,
"date": "2025-01-15",
"loss_acc_id": loss_account_id
})
result = get_model("account.fixed.asset.dispose").dispose([wizard_id])
# Journal entry:
# Dr Accum. Depreciation 50,000
# Dr Loss on Disposal 0 (no loss)
# Cr Fixed Asset 50,000
print("✓ Fully depreciated asset disposed")
Use Case 2: Dispose Asset with Remaining Book Value¶
# Asset scrapped with remaining value (loss on disposal)
asset = get_model("account.fixed.asset").browse([asset_id])[0]
# Purchase: $100,000
# Accumulated Dep: $60,000
# Book Value: $40,000 (this becomes a loss)
wizard_id = get_model("account.fixed.asset.dispose").create({
"asset_id": asset_id,
"date": "2025-01-15",
"loss_acc_id": loss_on_disposal_account_id
})
result = get_model("account.fixed.asset.dispose").dispose([wizard_id])
# Journal entry:
# Dr Accum. Depreciation 60,000
# Dr Loss on Disposal 40,000 (book value written off)
# Cr Fixed Asset 100,000
print(f"✓ Asset disposed with ${asset.book_val:,.2f} loss")
Use Case 3: Dispose Damaged Equipment¶
# Equipment damaged beyond repair
damaged_asset_id = get_model("account.fixed.asset").search([
["number", "=", "FA-2025-001"]
])[0]
asset = get_model("account.fixed.asset").browse([damaged_asset_id])[0]
# Ensure depreciation is up to date
from datetime import date
today = date.today().strftime("%Y-%m-%d")
get_model("account.fixed.asset").depreciate([damaged_asset_id], today)
# Dispose
wizard_id = get_model("account.fixed.asset.dispose").create({
"asset_id": damaged_asset_id,
"date": today,
"loss_acc_id": loss_account_id
})
result = get_model("account.fixed.asset.dispose").dispose([wizard_id])
print(f"✓ Damaged equipment {asset.number} disposed")
Use Case 4: Bulk Disposal¶
# Dispose multiple obsolete assets
obsolete_asset_ids = get_model("account.fixed.asset").search([
["type_id.code", "=", "OLD-COMP"],
["state", "=", "registered"]
])
disposal_date = "2025-01-15"
loss_account_id = get_model("account.account").search([
["code", "=", "8100"] # Loss on Asset Disposal
])[0]
for asset_id in obsolete_asset_ids:
asset = get_model("account.fixed.asset").browse([asset_id])[0]
# Depreciate to date
get_model("account.fixed.asset").depreciate([asset_id], disposal_date)
# Dispose
wizard_id = get_model("account.fixed.asset.dispose").create({
"asset_id": asset_id,
"date": disposal_date,
"loss_acc_id": loss_account_id
})
result = get_model("account.fixed.asset.dispose").dispose([wizard_id])
print(f"✓ Disposed {asset.number}: {asset.name}")
print(f"\n✓ Disposed {len(obsolete_asset_ids)} obsolete assets")
Use Case 5: Disposal with Documentation¶
# Dispose asset with supporting documentation
asset = get_model("account.fixed.asset").browse([asset_id])[0]
# 1. Attach disposal documentation
import base64
with open("disposal_approval.pdf", "rb") as f:
doc_data = base64.b64encode(f.read()).decode()
doc_id = get_model("document").create({
"title": f"Disposal Approval - {asset.number}",
"file": doc_data,
"related_id": f"account.fixed.asset,{asset_id}"
})
# 2. Add comment
get_model("message").create({
"related_id": f"account.fixed.asset,{asset_id}",
"body": "Asset disposed due to equipment failure. " +
"Approved by Operations Manager."
})
# 3. Dispose
wizard_id = get_model("account.fixed.asset.dispose").create({
"asset_id": asset_id,
"date": "2025-01-15",
"loss_acc_id": loss_account_id
})
result = get_model("account.fixed.asset.dispose").dispose([wizard_id])
print("✓ Asset disposed with documentation")
Use Case 6: Verify Disposal Journal Entry¶
# Dispose and verify accounting entries
asset = get_model("account.fixed.asset").browse([asset_id])[0]
purchase_price = asset.price_purchase
book_value_before = asset.book_val
accum_dep = purchase_price - book_value_before
print(f"PRE-DISPOSAL VALUES")
print(f"Purchase Price: ${purchase_price:,.2f}")
print(f"Accumulated Depreciation: ${accum_dep:,.2f}")
print(f"Book Value: ${book_value_before:,.2f}")
print()
# Dispose
wizard_id = get_model("account.fixed.asset.dispose").create({
"asset_id": asset_id,
"date": "2025-01-15",
"loss_acc_id": loss_account_id
})
result = get_model("account.fixed.asset.dispose").dispose([wizard_id])
# Find journal entry
move = get_model("account.move").search_browse([
["narration", "=", f"Dispose fixed asset [{asset.number}] {asset.name}"]
], limit=1)[0]
print(f"JOURNAL ENTRY: {move.number}")
print("=" * 60)
for line in move.lines:
if line.debit:
print(f"Dr {line.account_id.name:40} ${line.debit:>10,.2f}")
else:
print(f" Cr {line.account_id.name:38} ${line.credit:>10,.2f}")
print("=" * 60)
Best Practices¶
1. Depreciate Before Disposal¶
# Good: Depreciate to disposal date first
disposal_date = "2025-01-15"
get_model("account.fixed.asset").depreciate([asset_id], disposal_date)
# Then dispose
wizard_id = get_model("account.fixed.asset.dispose").create({
"asset_id": asset_id,
"date": disposal_date,
"loss_acc_id": loss_account_id
})
result = get_model("account.fixed.asset.dispose").dispose([wizard_id])
# Avoid: Disposing without final depreciation
# (Results in incorrect book value)
2. Use Appropriate Loss Account¶
# Good: Dedicated disposal loss account
loss_acc = get_model("account.account").search([
["code", "=", "8100"], # Loss on Asset Disposal
["type", "=", "expense"]
])[0]
# Allows separate tracking of disposal losses
3. Document Disposal Reason¶
# Add comment explaining disposal
get_model("message").create({
"related_id": f"account.fixed.asset,{asset_id}",
"body": f"Disposal reason: Equipment failure\n" +
f"Approval: Manager XYZ\n" +
f"Disposal method: Scrap"
})
4. Verify Asset State After Disposal¶
# After disposal, verify state
asset = get_model("account.fixed.asset").browse([asset_id])[0]
assert asset.state == "sold", "Asset state should be 'sold'"
assert asset.date_dispose == "2025-01-15", "Disposal date should be set"
assert asset.book_val == 0, "Book value should be zero"
print("✓ Disposal verified")
Accounting Impact¶
Example Disposal Entries¶
Scenario 1: Fully Depreciated Asset
Asset Cost: $50,000
Accumulated Depreciation: $50,000
Book Value: $0
Journal Entry:
Dr Accumulated Depreciation 50,000
Cr Fixed Asset 50,000
No loss recorded (fully depreciated)
Scenario 2: Partially Depreciated Asset
Asset Cost: $100,000
Accumulated Depreciation: $60,000
Book Value: $40,000
Journal Entry:
Dr Accumulated Depreciation 60,000
Dr Loss on Disposal 40,000
Cr Fixed Asset 100,000
Loss of $40,000 recorded
Scenario 3: Recently Purchased Asset
Asset Cost: $80,000
Accumulated Depreciation: $5,000
Book Value: $75,000
Journal Entry:
Dr Accumulated Depreciation 5,000
Dr Loss on Disposal 75,000
Cr Fixed Asset 80,000
Significant loss of $75,000
Disposal vs. Sale¶
When to Use Disposal (this wizard):¶
- Asset scrapped/destroyed
- Asset abandoned
- Asset given away (no proceeds)
- Asset donated
- Asset obsolete with no value
When to Use Sale (different wizard):¶
- Asset sold to third party
- Sale proceeds received
- Trade-in value obtained
- See:
account.fixed.asset.sell
Related Models¶
| Model | Relationship | Description |
|---|---|---|
account.fixed.asset |
Many2One | Asset being disposed |
account.account |
Many2One | Loss account |
account.journal |
Referenced | General journal |
account.move |
Creates | Disposal journal entry |
Version History¶
Last Updated: 2025-12-16 Model Version: account_fixed_asset_dispose.py Framework: Netforce
Additional Resources¶
- Fixed Asset Documentation:
account.fixed.asset - Asset Sale Documentation:
account.fixed.asset.sell - Journal Entry Documentation:
account.move
This documentation is generated for developer onboarding and reference purposes.