- 4 disposal types: sale, scrap, donation, lost
- mail.thread tracking on type / date / sale amount / partner
- gain_loss_amount computed:
- sale: sale_amount - book_value_at_disposal
- scrap / donation / lost: -book_value_at_disposal (full loss)
- ondelete='restrict' on asset_id (cannot delete an asset with disposal)
- move_id placeholder for engine-created journal entry
- 4 new tests (59 total)
Made-with: Cursor
57 lines
1.8 KiB
Python
57 lines
1.8 KiB
Python
"""Asset disposal records (sale, scrap, donation)."""
|
|
|
|
from odoo import api, fields, models
|
|
|
|
|
|
DISPOSAL_TYPES = [
|
|
('sale', 'Sale'),
|
|
('scrap', 'Scrap'),
|
|
('donation', 'Donation'),
|
|
('lost', 'Lost / Stolen'),
|
|
]
|
|
|
|
|
|
class FusionAssetDisposal(models.Model):
|
|
_name = "fusion.asset.disposal"
|
|
_description = "Asset Disposal Record"
|
|
_order = "disposal_date desc, id desc"
|
|
_inherit = ['mail.thread']
|
|
|
|
asset_id = fields.Many2one(
|
|
'fusion.asset', required=True, ondelete='restrict', tracking=True,
|
|
)
|
|
company_id = fields.Many2one(related='asset_id.company_id', store=True)
|
|
currency_id = fields.Many2one(related='asset_id.currency_id', store=True)
|
|
|
|
disposal_type = fields.Selection(
|
|
DISPOSAL_TYPES, required=True, default='sale', tracking=True,
|
|
)
|
|
disposal_date = fields.Date(
|
|
required=True, default=fields.Date.today, tracking=True,
|
|
)
|
|
sale_amount = fields.Monetary(
|
|
default=0.0, tracking=True,
|
|
help="Cash received (for sale disposal type).",
|
|
)
|
|
sale_partner_id = fields.Many2one('res.partner', tracking=True)
|
|
|
|
book_value_at_disposal = fields.Monetary(
|
|
readonly=True,
|
|
help="Asset book value at disposal date.",
|
|
)
|
|
gain_loss_amount = fields.Monetary(compute='_compute_gain_loss', store=True)
|
|
notes = fields.Text()
|
|
|
|
move_id = fields.Many2one(
|
|
'account.move', readonly=True, copy=False,
|
|
help="Journal entry created for this disposal.",
|
|
)
|
|
|
|
@api.depends('sale_amount', 'book_value_at_disposal', 'disposal_type')
|
|
def _compute_gain_loss(self):
|
|
for d in self:
|
|
if d.disposal_type == 'sale':
|
|
d.gain_loss_amount = d.sale_amount - d.book_value_at_disposal
|
|
else:
|
|
d.gain_loss_amount = -d.book_value_at_disposal
|