odex30_standard/attendances/tests/test_flexible_hours_computa...

136 lines
4.5 KiB
Python

# -*- coding: utf-8 -*-
from odoo.tests import TransactionCase
class TestFlexibleHoursComputation(TransactionCase):
"""Test cases for flexible hours calculation in resource.calendar"""
def setUp(self):
"""Setup test data - calendar for flexible hours"""
super(TestFlexibleHoursComputation, self).setUp()
self.calendar = self.env['resource.calendar'].create({
'name': 'Flexible Hours Test Calendar',
})
def test_flexible_hours_full_day_calculation(self):
"""
Arrange: Full day calendar with flexible days enabled
Act: Trigger compute
Assert: total_flexible_hours = working_hours * number_of_flexi_days
"""
# Arrange
self.calendar.write({
'is_flexible': True,
'is_full_day': True,
'working_hours': 8.0,
'number_of_flexi_days': 5,
'full_min_sign_in': 8.0, # Add
'full_max_sign_in': 9.0, # Add
'full_min_sign_out': 16.0, # Add
'full_max_sign_out': 17.0, # Add
})
# Act
self.calendar.compute_flexible_hours()
# Assert
self.assertEqual(self.calendar.total_flexible_hours, 40.0,
"Flexible hours for full day should be 8 * 5 = 40 hours")
def test_flexible_hours_disabled_returns_zero(self):
"""Calendar with is_flexible=False should return 0"""
# Arrange - Add ALL fields to pass constraints
self.calendar.write({
'is_flexible': False,
'is_full_day': True,
'full_min_sign_in': 8.0,
'full_max_sign_in': 9.0, # Add
'full_min_sign_out': 16.0,
'full_max_sign_out': 17.0, # Add
'working_hours': 8.0, # Must match time difference
'number_of_flexi_days': 5,
})
# Act
self.calendar.compute_flexible_hours()
# Assert
self.assertEqual(self.calendar.total_flexible_hours, 0.0)
def test_flexible_hours_shift_mode_calculation(self):
"""Shift calendar flexible hours"""
# Arrange - Add ALL shift fields
self.calendar.write({
'is_flexible': True,
'is_full_day': False,
'shift_one_min_sign_in': 6.0,
'shift_one_max_sign_in': 7.0, # Add
'shift_one_min_sign_out': 14.0,
'shift_one_max_sign_out': 15.0, # Add
'shift_one_working_hours': 8.0,
'shift_two_min_sign_in': 14.0,
'shift_two_max_sign_in': 15.0, # Add
'shift_two_min_sign_out': 22.0,
'shift_two_max_sign_out': 23.0, # Add
'shift_two_working_hours': 8.0,
'number_of_flexi_days': 3,
})
# Act
self.calendar.compute_flexible_hours()
# Assert
expected = (8.0 + 8.0) * 3
self.assertEqual(self.calendar.total_flexible_hours, expected)
def test_flexible_hours_with_zero_days(self):
"""Zero flexible days should return 0"""
# Arrange
self.calendar.write({
'is_flexible': True,
'is_full_day': True,
'full_min_sign_in': 8.0,
'full_max_sign_in': 9.0, # Add
'full_min_sign_out': 16.0,
'full_max_sign_out': 17.0, # Add
'working_hours': 8.0,
'number_of_flexi_days': 0,
})
# Act
self.calendar.compute_flexible_hours()
# Assert
self.assertEqual(self.calendar.total_flexible_hours, 0.0)
def test_flexible_hours_recompute_on_working_hours_change(self):
"""Flexible hours should update when working hours change"""
# Arrange - Add ALL fields
self.calendar.write({
'is_flexible': True,
'is_full_day': True,
'full_min_sign_in': 8.0,
'full_max_sign_in': 9.0,
'full_min_sign_out': 16.0,
'full_max_sign_out': 17.0,
'working_hours': 8.0,
'number_of_flexi_days': 5,
})
self.calendar.compute_flexible_hours()
initial_hours = self.calendar.total_flexible_hours
# Act - Change times to match 10 hours
self.calendar.write({
'full_min_sign_out': 18.0, # Change to 10 hours
'full_max_sign_out': 19.0,
'working_hours': 10.0,
})
self.calendar.compute_flexible_hours()
# Assert
self.assertEqual(initial_hours, 40.0)
self.assertEqual(self.calendar.total_flexible_hours, 50.0)