is_open + crosses_midnight fields; employee_id optional (open shifts); company_id computed w/ env.company fallback; drop hard one-per-day UNIQUE (allow split + open). Overnight math in planned_hours/_check_schedule_times/ scheduled_times. _get_fclk_day_plan resolves multiple posted rows into ONE work-window so penalties/overtime/absence stay correct. Migration drops the old constraint defensively. Tests for overnight, window, open shifts. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
42 lines
1.6 KiB
Python
42 lines
1.6 KiB
Python
# -*- 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)
|