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
Related Models¶
| 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.