"""Assets-specific migration step. Backfills fusion.asset from existing account.asset rows (Enterprise) so users get all their existing assets in the Fusion namespace after switchover.""" import logging from odoo import api, fields, models _logger = logging.getLogger(__name__) # Map Enterprise method names to Fusion method names ENTERPRISE_METHOD_MAP = { 'linear': 'straight_line', 'degressive': 'declining_balance', 'degressive_then_linear': 'declining_balance', # simplified 'manual': 'straight_line', 'unit_of_production': 'units_of_production', 'units_of_production': 'units_of_production', } class FusionMigrationWizard(models.TransientModel): _inherit = "fusion.migration.wizard" def _assets_bootstrap_step(self): """Backfill fusion.asset from account.asset (Enterprise) if it exists.""" result = { 'step': 'assets_bootstrap', 'enterprise_module_present': False, 'created': 0, 'skipped': 0, 'errors': [], } # Check if Enterprise account.asset exists AccountAsset = self.env.get('account.asset') if AccountAsset is None: result['enterprise_module_present'] = False return result result['enterprise_module_present'] = True FusionAsset = self.env['fusion.asset'].sudo() # Iterate Enterprise records company_id = self.company_id.id if 'company_id' in self._fields and self.company_id else None domain = [] if company_id: domain.append(('company_id', '=', company_id)) try: ea_records = AccountAsset.sudo().search(domain, limit=10000) except Exception as e: result['errors'].append(f"Enterprise search failed: {e}") return result for ea in ea_records: try: # Idempotent: skip if a fusion asset with same source name exists existing = FusionAsset.search([ ('name', '=', ea.name), ('cost', '=', getattr(ea, 'original_value', 0) or 0), ('company_id', '=', ea.company_id.id), ], limit=1) if existing: result['skipped'] += 1 continue # Map state — Enterprise has 'draft', 'open' (running), 'paused', 'close' (disposed) ea_state = getattr(ea, 'state', 'draft') state_map = {'draft': 'draft', 'open': 'running', 'paused': 'paused', 'close': 'disposed', 'model': 'draft'} state = state_map.get(ea_state, 'draft') method = ENTERPRISE_METHOD_MAP.get( getattr(ea, 'method', 'linear'), 'straight_line') FusionAsset.create({ 'name': ea.name, 'cost': getattr(ea, 'original_value', 0) or 0, 'salvage_value': getattr(ea, 'salvage_value', 0) or 0, 'acquisition_date': getattr(ea, 'acquisition_date', False) or fields.Date.today(), 'in_service_date': getattr(ea, 'prorata_date', False) or False, 'method': method, 'useful_life_years': getattr(ea, 'method_number', 5) or 5, 'declining_rate_pct': getattr(ea, 'method_progress_factor', 0.2) * 100 if hasattr(ea, 'method_progress_factor') else 20.0, 'company_id': ea.company_id.id, 'state': state, }) result['created'] += 1 except Exception as e: result['errors'].append(f"Asset {ea.id}: {e}") _logger.info( "fusion_accounting_assets migration: %d created, %d skipped, %d errors", result['created'], result['skipped'], len(result['errors'])) return result def action_run_migration(self): """Override to add assets-bootstrap step.""" result = super().action_run_migration() if hasattr(super(), 'action_run_migration') else None try: self._assets_bootstrap_step() except Exception as e: _logger.warning("assets_bootstrap_step failed: %s", e) return result