"""Asset disposal wizard (sale, scrap, donation, lost).""" from odoo import _, api, fields, models from odoo.exceptions import UserError class FusionDisposalWizard(models.TransientModel): _name = "fusion.disposal.wizard" _description = "Asset Disposal Wizard" asset_id = fields.Many2one( 'fusion.asset', required=True, default=lambda self: self._default_asset(), ) company_id = fields.Many2one(related='asset_id.company_id') currency_id = fields.Many2one(related='asset_id.currency_id') book_value = fields.Monetary(related='asset_id.book_value', readonly=True) disposal_type = fields.Selection([ ('sale', 'Sale'), ('scrap', 'Scrap'), ('donation', 'Donation'), ('lost', 'Lost / Stolen'), ], required=True, default='sale') disposal_date = fields.Date(required=True, default=fields.Date.today) sale_amount = fields.Monetary(default=0.0) sale_partner_id = fields.Many2one('res.partner') notes = fields.Text() estimated_gain_loss = fields.Monetary(compute='_compute_gain_loss') @api.model def _default_asset(self): ctx = self.env.context if ctx.get('active_model') == 'fusion.asset': return ctx.get('active_id') return False @api.depends('sale_amount', 'book_value', 'disposal_type') def _compute_gain_loss(self): for w in self: if w.disposal_type == 'sale': w.estimated_gain_loss = w.sale_amount - w.book_value else: w.estimated_gain_loss = -w.book_value def action_dispose(self): self.ensure_one() if self.asset_id.state == 'disposed': raise UserError(_("Asset already disposed.")) partner = self.sale_partner_id if self.disposal_type == 'sale' else None self.env['fusion.asset.engine'].dispose_asset( self.asset_id, sale_amount=self.sale_amount if self.disposal_type == 'sale' else 0, sale_date=self.disposal_date, sale_partner=partner, disposal_type=self.disposal_type, ) return { 'type': 'ir.actions.act_window', 'res_model': 'fusion.asset', 'res_id': self.asset_id.id, 'view_mode': 'form', 'target': 'current', }