Skip to content

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

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.