Skip to content

Fixed Asset Sale Wizard Documentation

Overview

The Fixed Asset Sale Wizard (account.fixed.asset.sell) handles the sale of fixed assets to third parties with proceeds. This wizard creates journal entries to remove the asset from books, clear accumulated depreciation, record sale proceeds, and recognize gain or loss on the transaction. The wizard properly accounts for the difference between sale price and book value.


Model Information

Model Name: account.fixed.asset.sell Display Name: Sell Asset Name Field: None Key Fields: None Transient: Yes (not persisted to database)

Features

  • ✅ Automated sale journal entries
  • ✅ Gain/loss calculation
  • ✅ Sale proceeds recording
  • ✅ Asset status update
  • ✅ Journal selection
  • ✅ Audit trail with description

Key Fields Reference

Wizard Fields

Field Type Required Description
asset_id Many2One Yes (readonly) Asset being sold
date Date Sale date
price Decimal Sale price (excluding tax)
sale_acc_id Many2One Account to debit for sale proceeds
gain_loss_acc_id Many2One Gain/loss recognition account
journal_id Many2One Journal for entry

Default Values: - date: Current date - asset_id: From context (refer_id)


API Methods

1. Sell Asset

Method: sell(ids, context)

Processes asset sale and creates journal entries.

Behavior: 1. Validates journal exists 2. Creates journal entry with four lines: - Credit fixed asset account (remove asset) - Debit accumulated depreciation (clear depreciation) - Debit sale account (record proceeds) - Credit/debit gain/loss account (difference) 3. Posts journal entry 4. Updates asset state to "sold" 5. Sets disposal date

Journal Entry for Gain:

Dr  Accumulated Depreciation     X,XXX
Dr  Cash/AR Account              X,XXX  (sale price)
    Cr  Fixed Asset Account              X,XXX  (purchase price)
    Cr  Gain on Asset Sale                X,XXX  (sale price - book value)

Journal Entry for Loss:

Dr  Accumulated Depreciation     X,XXX
Dr  Cash/AR Account              X,XXX  (sale price)
Dr  Loss on Asset Sale           X,XXX  (book value - sale price)
    Cr  Fixed Asset Account              X,XXX  (purchase price)

Example:

# Sell asset
wizard_id = get_model("account.fixed.asset.sell").create({
    "asset_id": asset_id,
    "date": "2025-01-15",
    "price": 35000.00,  # Sale price
    "sale_acc_id": cash_account_id,
    "gain_loss_acc_id": gain_loss_account_id,
    "journal_id": general_journal_id
})

result = get_model("account.fixed.asset.sell").sell([wizard_id])

# Returns navigation to asset form
# Asset state now "sold", date_dispose set


Common Use Cases

Use Case 1: Sell Asset at Gain

# Asset sold above book value (gain)
asset = get_model("account.fixed.asset").browse([asset_id])[0]

# Purchase Price: $100,000
# Accumulated Dep: $60,000
# Book Value: $40,000
# Sale Price: $50,000
# Gain: $10,000

wizard_id = get_model("account.fixed.asset.sell").create({
    "asset_id": asset_id,
    "date": "2025-01-15",
    "price": 50000.00,
    "sale_acc_id": cash_account_id,
    "gain_loss_acc_id": gain_loss_account_id,
    "journal_id": general_journal_id
})

result = get_model("account.fixed.asset.sell").sell([wizard_id])

# Journal entry:
# Dr  Accumulated Depreciation  60,000
# Dr  Cash                      50,000
#     Cr  Fixed Asset                   100,000
#     Cr  Gain on Sale                   10,000

print(f"✓ Asset sold with ${50000 - asset.book_val:,.2f} gain")

Use Case 2: Sell Asset at Loss

# Asset sold below book value (loss)
asset = get_model("account.fixed.asset").browse([asset_id])[0]

# Purchase Price: $100,000
# Accumulated Dep: $60,000
# Book Value: $40,000
# Sale Price: $30,000
# Loss: $10,000

wizard_id = get_model("account.fixed.asset.sell").create({
    "asset_id": asset_id,
    "date": "2025-01-15",
    "price": 30000.00,
    "sale_acc_id": cash_account_id,
    "gain_loss_acc_id": gain_loss_account_id,
    "journal_id": general_journal_id
})

result = get_model("account.fixed.asset.sell").sell([wizard_id])

# Journal entry:
# Dr  Accumulated Depreciation  60,000
# Dr  Cash                      30,000
# Dr  Loss on Sale              10,000
#     Cr  Fixed Asset                   100,000

print(f"✓ Asset sold with ${asset.book_val - 30000:,.2f} loss")

Use Case 3: Sell Asset at Book Value (No Gain/Loss)

# Asset sold exactly at book value
asset = get_model("account.fixed.asset").browse([asset_id])[0]

# Book Value: $40,000
# Sale Price: $40,000
# No gain or loss

wizard_id = get_model("account.fixed.asset.sell").create({
    "asset_id": asset_id,
    "date": "2025-01-15",
    "price": asset.book_val,  # Sell at book value
    "sale_acc_id": cash_account_id,
    "gain_loss_acc_id": gain_loss_account_id,
    "journal_id": general_journal_id
})

result = get_model("account.fixed.asset.sell").sell([wizard_id])

# Journal entry:
# Dr  Accumulated Depreciation  60,000
# Dr  Cash                      40,000
#     Cr  Fixed Asset                   100,000
# (No gain/loss line - $0 difference)

print("✓ Asset sold at book value (no gain/loss)")

Use Case 4: Sell Vehicle with Trade-In

# Vehicle sold to dealer as trade-in
vehicle = get_model("account.fixed.asset").browse([vehicle_id])[0]

# Depreciate to sale date
sale_date = "2025-01-15"
get_model("account.fixed.asset").depreciate([vehicle_id], sale_date)

# Refresh to get updated book value
vehicle = get_model("account.fixed.asset").browse([vehicle_id])[0]

# Trade-in value: $25,000
# Book value: $30,000
trade_in_value = 25000.00

wizard_id = get_model("account.fixed.asset.sell").create({
    "asset_id": vehicle_id,
    "date": sale_date,
    "price": trade_in_value,
    "sale_acc_id": ar_account_id,  # AR for trade-in credit
    "gain_loss_acc_id": gain_loss_account_id,
    "journal_id": general_journal_id
})

result = get_model("account.fixed.asset.sell").sell([wizard_id])

print(f"✓ Vehicle traded in for ${trade_in_value:,.2f}")
print(f"  Loss on trade-in: ${vehicle.book_val - trade_in_value:,.2f}")

Use Case 5: Sell Computer Equipment

# Sell obsolete computers
computers = get_model("account.fixed.asset").search_browse([
    ["type_id.code", "=", "COMP"],
    ["book_val", "<", 5000],  # Low value
    ["state", "=", "registered"]
])

sale_date = "2025-01-15"
total_proceeds = 0
total_gain_loss = 0

for asset in computers:
    # Depreciate first
    get_model("account.fixed.asset").depreciate([asset.id], sale_date)
    asset = get_model("account.fixed.asset").browse([asset.id])[0]

    # Sell at market value (typically below book)
    sale_price = asset.book_val * 0.6  # 60% of book value

    wizard_id = get_model("account.fixed.asset.sell").create({
        "asset_id": asset.id,
        "date": sale_date,
        "price": sale_price,
        "sale_acc_id": cash_account_id,
        "gain_loss_acc_id": gain_loss_account_id,
        "journal_id": general_journal_id
    })

    result = get_model("account.fixed.asset.sell").sell([wizard_id])

    total_proceeds += sale_price
    total_gain_loss += (sale_price - asset.book_val)

    print(f"✓ Sold {asset.number}: ${sale_price:,.2f}")

print(f"\nTotal proceeds: ${total_proceeds:,.2f}")
print(f"Total loss: ${abs(total_gain_loss):,.2f}")

Use Case 6: Sell Asset on Credit

# Asset sold with payment terms (AR)
asset = get_model("account.fixed.asset").browse([asset_id])[0]

# Sale with 30-day terms
sale_date = "2025-01-15"
sale_price = 45000.00

# Depreciate to sale date
get_model("account.fixed.asset").depreciate([asset_id], sale_date)

# Sell - debit AR instead of cash
ar_account_id = get_model("account.account").search([
    ["code", "=", "1200"]  # Accounts Receivable
])[0]

wizard_id = get_model("account.fixed.asset.sell").create({
    "asset_id": asset_id,
    "date": sale_date,
    "price": sale_price,
    "sale_acc_id": ar_account_id,  # AR instead of cash
    "gain_loss_acc_id": gain_loss_account_id,
    "journal_id": general_journal_id
})

result = get_model("account.fixed.asset.sell").sell([wizard_id])

print(f"✓ Asset sold on credit for ${sale_price:,.2f}")
print("  Payment due in 30 days")

Use Case 7: Complete Sale with Customer Invoice

# Create customer invoice for asset sale
# Then record asset disposal

# 1. Create sales invoice
invoice_id = get_model("account.invoice").create({
    "type": "out",
    "contact_id": buyer_id,
    "date": "2025-01-15",
    "lines": [
        ("create", {
            "description": f"Used Equipment - {asset.name}",
            "qty": 1,
            "unit_price": 50000.00,
            "account_id": asset_sale_income_id,
            "tax_id": vat_rate_id
        })
    ]
})

get_model("account.invoice").post([invoice_id])

# 2. Record asset sale (fixed asset side)
wizard_id = get_model("account.fixed.asset.sell").create({
    "asset_id": asset_id,
    "date": "2025-01-15",
    "price": 50000.00,  # Matches invoice
    "sale_acc_id": ar_account_id,
    "gain_loss_acc_id": gain_loss_account_id,
    "journal_id": general_journal_id
})

result = get_model("account.fixed.asset.sell").sell([wizard_id])

print("✓ Asset sale invoice and disposal recorded")

Best Practices

1. Depreciate Before Sale

# Good: Depreciate to sale date first
sale_date = "2025-01-15"
get_model("account.fixed.asset").depreciate([asset_id], sale_date)

# Then sell with accurate book value
wizard_id = get_model("account.fixed.asset.sell").create({
    "asset_id": asset_id,
    "date": sale_date,
    "price": sale_price,
    ...
})

# Avoid: Selling without final depreciation
# Results in incorrect gain/loss

2. Use Correct Sale Account

# Cash sale
{"sale_acc_id": cash_account_id}

# Credit sale
{"sale_acc_id": accounts_receivable_id}

# Trade-in
{"sale_acc_id": trade_in_receivable_id}

3. Separate Gain/Loss Account

# Good: Dedicated gain/loss account
gain_loss_acc = get_model("account.account").search([
    ["code", "=", "8200"],  # Gain/Loss on Asset Sale
    ["type", "=", "other"]
])[0]

# Enables separate reporting of asset sale results

4. Record Sale Price Excluding Tax

# Sale price should be net amount (before VAT/sales tax)
{
    "price": 50000.00  # Excluding VAT
}

# VAT handled separately through sales invoice if needed

5. Document Sale Transaction

# Add sale details to asset
get_model("message").create({
    "related_id": f"account.fixed.asset,{asset_id}",
    "body": f"Asset sold to: ABC Company\n" +
            f"Sale price: ${sale_price:,.2f}\n" +
            f"Invoice: INV-2025-001\n" +
            f"Payment terms: Net 30"
})

Accounting Impact

Gain on Sale Example

Asset Details: - Purchase Price: $80,000 - Accumulated Depreciation: $50,000 - Book Value: $30,000 - Sale Price: $40,000 - Gain: $10,000

Journal Entry:

Dr  Accumulated Depreciation  50,000
Dr  Cash                      40,000
    Cr  Fixed Asset                     80,000
    Cr  Gain on Asset Sale              10,000

Impact: - Assets decreased: $80,000 (asset) - $50,000 (accum dep) = $30,000 - Cash increased: $40,000 - Income increased: $10,000 (gain) - Net effect: $40,000 cash for $30,000 book value asset


Loss on Sale Example

Asset Details: - Purchase Price: $100,000 - Accumulated Depreciation: $40,000 - Book Value: $60,000 - Sale Price: $45,000 - Loss: $15,000

Journal Entry:

Dr  Accumulated Depreciation  40,000
Dr  Cash                      45,000
Dr  Loss on Asset Sale        15,000
    Cr  Fixed Asset                    100,000

Impact: - Assets decreased: $100,000 - $40,000 = $60,000 - Cash increased: $45,000 - Expense increased: $15,000 (loss) - Net effect: $45,000 cash for $60,000 book value asset


Sale vs. Disposal

When to Use Sale (this wizard):

  • Asset sold to buyer
  • Sale proceeds received
  • Trade-in value obtained
  • Asset transferred with compensation

When to Use Disposal (different wizard):

  • Asset scrapped
  • Asset abandoned
  • Asset donated (no proceeds)
  • Asset destroyed
  • See: account.fixed.asset.dispose

Gain/Loss Tax Treatment

Accounting vs. Tax: - Book Gain/Loss: Based on accounting book value - Tax Gain/Loss: Based on tax book value - These may differ if using different depreciation methods

Consult tax advisor for: - Capital gains tax implications - Depreciation recapture rules - Section 179/bonus depreciation adjustments


Model Relationship Description
account.fixed.asset Many2One Asset being sold
account.account Many2One Sale and gain/loss accounts
account.journal Many2One Journal for entry
account.move Creates Sale journal entry

Version History

Last Updated: 2025-12-16 Model Version: account_fixed_asset_sell.py Framework: Netforce


Additional Resources

  • Fixed Asset Documentation: account.fixed.asset
  • Asset Disposal Documentation: account.fixed.asset.dispose
  • Journal Entry Documentation: account.move
  • Invoice Documentation: account.invoice

This documentation is generated for developer onboarding and reference purposes.