"""Create-asset-from-invoice-line wizard. Reads an account.move.line as the source, pre-fills name/cost/category, and optionally calls the AI useful-life predictor for suggestions.""" from odoo import _, api, fields, models from odoo.exceptions import UserError from ..services.useful_life_predictor import predict_useful_life class FusionCreateAssetWizard(models.TransientModel): _name = "fusion.create.asset.wizard" _description = "Create Fusion Asset from Invoice Line" source_invoice_line_id = fields.Many2one( 'account.move.line', string='Source Invoice Line', default=lambda self: self._default_source_line(), ) name = fields.Char(required=True) cost = fields.Monetary(required=True) salvage_value = fields.Monetary(default=0.0) currency_id = fields.Many2one( 'res.currency', required=True, default=lambda self: self.env.company.currency_id, ) category_id = fields.Many2one('fusion.asset.category') method = fields.Selection([ ('straight_line', 'Straight Line'), ('declining_balance', 'Declining Balance'), ('units_of_production', 'Units of Production'), ], required=True, default='straight_line') useful_life_years = fields.Integer(default=5) declining_rate_pct = fields.Float(default=20.0) acquisition_date = fields.Date(required=True, default=fields.Date.today) in_service_date = fields.Date(default=fields.Date.today) ai_suggested_years = fields.Integer(readonly=True) ai_suggested_method = fields.Char(readonly=True) ai_rationale = fields.Text(readonly=True) ai_confidence = fields.Float(readonly=True) @api.model def _default_source_line(self): ctx = self.env.context if ctx.get('active_model') == 'account.move.line': return ctx.get('active_id') return False @api.onchange('source_invoice_line_id') def _onchange_source_invoice_line_id(self): if not self.source_invoice_line_id: return line = self.source_invoice_line_id if not self.name: self.name = line.name or line.move_id.name or 'New Asset' if not self.cost: self.cost = abs(line.balance) if line.balance else (line.price_unit * line.quantity) if line.currency_id and not self.currency_id: self.currency_id = line.currency_id @api.onchange('category_id') def _onchange_category_id(self): if self.category_id: self.method = self.category_id.method self.useful_life_years = self.category_id.useful_life_years self.declining_rate_pct = self.category_id.declining_rate_pct if self.category_id.salvage_value_pct and self.cost: self.salvage_value = round( self.cost * self.category_id.salvage_value_pct / 100, 2) def action_ai_suggest(self): """Call AI useful-life predictor.""" self.ensure_one() if not self.name and not self.source_invoice_line_id: raise UserError(_("Need a name or source invoice line first.")) description = self.name if self.source_invoice_line_id and self.source_invoice_line_id.name: description = self.source_invoice_line_id.name partner_name = None if self.source_invoice_line_id and self.source_invoice_line_id.partner_id: partner_name = self.source_invoice_line_id.partner_id.name suggestion = predict_useful_life( self.env, description=description, amount=self.cost, partner_name=partner_name, ) self.write({ 'ai_suggested_years': suggestion.get('useful_life_years'), 'ai_suggested_method': suggestion.get('depreciation_method'), 'ai_rationale': suggestion.get('rationale'), 'ai_confidence': suggestion.get('confidence'), 'useful_life_years': suggestion.get('useful_life_years'), 'method': suggestion.get('depreciation_method'), }) return { 'type': 'ir.actions.act_window', 'res_model': self._name, 'res_id': self.id, 'view_mode': 'form', 'target': 'new', } def action_create_asset(self): """Create the fusion.asset record + link to source invoice line.""" self.ensure_one() if not self.cost: raise UserError(_("Cost is required.")) Asset = self.env['fusion.asset'] asset = Asset.create({ 'name': self.name, 'cost': self.cost, 'salvage_value': self.salvage_value, 'currency_id': self.currency_id.id, 'category_id': self.category_id.id if self.category_id else False, 'method': self.method, 'useful_life_years': self.useful_life_years, 'declining_rate_pct': self.declining_rate_pct, 'acquisition_date': self.acquisition_date, 'in_service_date': self.in_service_date, 'source_invoice_line_id': self.source_invoice_line_id.id if self.source_invoice_line_id else False, 'company_id': self.env.company.id, }) if self.source_invoice_line_id: self.source_invoice_line_id.fusion_asset_id = asset.id return { 'type': 'ir.actions.act_window', 'res_model': 'fusion.asset', 'res_id': asset.id, 'view_mode': 'form', 'target': 'current', }