134 lines
5.4 KiB
Python
134 lines
5.4 KiB
Python
"""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',
|
|
}
|