Files
Odoo-Modules/fusion_clock/tests/test_settings.py
gsinghpal f7ec1e28f9 feat(fusion_clock): province-aware automatic unpaid break (2-tier)
Statutory unpaid break now deducts automatically from worked hours on every path - portal, kiosk, NFC, auto-clock-out cron, AND manual backend entry.

- new fusion.clock.break.rule per-province table (seed Ontario 5h->30, 10h->+30), resolved from the employee's company province with a global default fallback
- x_fclk_break_minutes is now a single idempotent stored compute (statutory(worked_hours) + penalties), replacing the 4 duplicated write sites (_apply_break_deduction x3 callsites + auto-clock-out cron + penalty write)
- retire break_threshold_hours (superseded by per-rule break1_after_hours); post-migrate drops the param and recomputes historical breaks
- 11 tests all green; module install + 19.0.4.1.0 migration verified on modsdev

Bump 19.0.4.0.3 -> 19.0.4.1.0.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-01 00:15:42 -04:00

44 lines
2.1 KiB
Python

# -*- coding: utf-8 -*-
from odoo.tests import tagged, TransactionCase
@tagged('-at_install', 'post_install', 'fusion_clock')
class TestFusionClockSettings(TransactionCase):
"""The fusion_clock Boolean settings are persisted explicitly as
'True'/'False' so they can actually be turned OFF (a config_parameter
Boolean can't — Odoo deletes the row on a falsy value)."""
def _save(self, vals):
self.env['res.config.settings'].create(vals).set_values()
def test_boolean_toggle_off_persists(self):
ICP = self.env['ir.config_parameter'].sudo()
self._save({'fclk_enable_overtime': False})
self.assertEqual(ICP.get_param('fusion_clock.enable_overtime'), 'False')
# reopening Settings shows it OFF
self.assertFalse(self.env['res.config.settings'].get_values()['fclk_enable_overtime'])
def test_boolean_toggle_back_on_persists(self):
ICP = self.env['ir.config_parameter'].sudo()
self._save({'fclk_enable_overtime': False})
self._save({'fclk_enable_overtime': True})
self.assertEqual(ICP.get_param('fusion_clock.enable_overtime'), 'True')
self.assertTrue(self.env['res.config.settings'].get_values()['fclk_enable_overtime'])
def test_default_on_boolean_when_param_absent(self):
ICP = self.env['ir.config_parameter'].sudo()
# set_param with a falsy value deletes the row → simulates "never set"
ICP.set_param('fusion_clock.enable_ip_fallback', False)
self.assertTrue(self.env['res.config.settings'].get_values()['fclk_enable_ip_fallback'])
def test_default_off_boolean_when_param_absent(self):
ICP = self.env['ir.config_parameter'].sudo()
ICP.set_param('fusion_clock.enable_kiosk', False)
self.assertFalse(self.env['res.config.settings'].get_values()['fclk_enable_kiosk'])
def test_dead_settings_removed(self):
fields = self.env['res.config.settings']._fields
self.assertNotIn('fclk_grace_period_minutes', fields)
self.assertNotIn('fclk_weekly_overtime_threshold', fields)
self.assertNotIn('fclk_break_threshold_hours', fields)