# -*- coding: utf-8 -*- # Copyright 2026 Nexa Systems Inc. # License OPL-1 (Odoo Proprietary License v1.0) # # One-time port of Odoo Enterprise Planning data into the native Fusion Clock # models, so a deployment that previously used the `planning` bridge keeps all # its roles, employee role assignments and shifts after `planning` / # `fusion_planning` are removed. # # Guarded: a no-op on Community / fresh installs where planning data is absent. # Idempotent: a marker param stops it re-running. import logging from odoo import api, SUPERUSER_ID _logger = logging.getLogger(__name__) _MARKER = 'fusion_clock.planning_migrated' def migrate(cr, version): """Port Odoo Planning data into the native models, once. The heavy lifting lives in fusion.clock.schedule._fclk_port_planning_data so it can be unit tested on an Enterprise clone where planning is installed.""" env = api.Environment(cr, SUPERUSER_ID, {}) # Phase B drops the hard one-shift-per-day uniqueness so split/open shifts # are allowed. Odoo drops removed declarative constraints on upgrade, but be # explicit so the upgrade can never leave the old constraint behind. cr.execute( "ALTER TABLE fusion_clock_schedule " "DROP CONSTRAINT IF EXISTS fusion_clock_schedule_employee_date_unique") ICP = env['ir.config_parameter'].sudo() if ICP.get_param(_MARKER): _logger.info("Fusion Clock: planning data already migrated; skipping.") return counts = env['fusion.clock.schedule'].sudo()._fclk_port_planning_data() ICP.set_param(_MARKER, '1') _logger.info("Fusion Clock: planning -> native migration done: %s", counts)