diff --git a/addons/hr/models/hr_employee.py b/addons/hr/models/hr_employee.py
index 1b0eb784eba984..28ecdb5d747155 100644
--- a/addons/hr/models/hr_employee.py
+++ b/addons/hr/models/hr_employee.py
@@ -216,10 +216,8 @@ def _lang_get(self):
}
"""
- permit_no = fields.Char('Work Permit No', groups="hr.group_hr_user", tracking=True)
visa_no = fields.Char('Visa No', groups="hr.group_hr_user", tracking=True)
visa_expire = fields.Date('Visa Expiration Date', groups="hr.group_hr_user", tracking=True)
- work_permit_expiration_date = fields.Date('Work Permit Expiration Date', groups="hr.group_hr_user", tracking=True)
has_work_permit = fields.Binary(string="Work Permit", groups="hr.group_hr_user")
work_permit_scheduled_activity = fields.Boolean(default=False, groups="hr.group_hr_user")
work_permit_name = fields.Char('work_permit_name', compute='_compute_work_permit_name', groups="hr.group_hr_user")
@@ -258,6 +256,8 @@ def _lang_get(self):
related='version_id.country_id.code',
groups="hr.group_hr_user"
)
+ permit_no = fields.Char(related='version_id.permit_no', inherited=True, readonly=False, groups="hr.group_hr_user", tracking=True)
+ work_permit_expiration_date = fields.Date(related='version_id.work_permit_expiration_date', readonly=False, groups="hr.group_hr_user", tracking=True)
# Direct subordinates
parent_id = fields.Many2one('hr.employee', 'Manager', tracking=True, index=True,
domain="['|', ('company_id', '=', False), ('company_id', 'in', allowed_company_ids)]")
diff --git a/addons/hr/models/hr_version.py b/addons/hr/models/hr_version.py
index 1e0a2c9fd0f175..753460244368f4 100644
--- a/addons/hr/models/hr_version.py
+++ b/addons/hr/models/hr_version.py
@@ -149,6 +149,8 @@ def _get_hr_responsible_domain(self):
departure_apply_date = fields.Date(related='departure_id.apply_date', groups="hr.group_hr_user")
resource_calendar_id = fields.Many2one('resource.calendar', inverse='_inverse_resource_calendar_id', check_company=True, string="Working Hours", index='btree_not_null', tracking=1)
+ permit_no = fields.Char(string='Work Permit No', groups="hr.group_hr_user", tracking=1)
+ work_permit_expiration_date = fields.Date(string='Work Permit Expiration Date', groups="hr.group_hr_user", tracking=1)
hours_per_week = fields.Float(string="Hours per Week", compute='_compute_hours_per_week', store=True, readonly=False)
hours_per_day = fields.Float(string="Hours per Day", compute='_compute_hours_per_day', store=True, readonly=False)
is_flexible = fields.Boolean(compute='_compute_is_flexible', store=True, groups="hr.group_hr_user")
diff --git a/addons/hr/views/hr_employee_views.xml b/addons/hr/views/hr_employee_views.xml
index 74f6252d3774b1..1dc3577a490285 100644
--- a/addons/hr/views/hr_employee_views.xml
+++ b/addons/hr/views/hr_employee_views.xml
@@ -388,7 +388,7 @@
to
-
+
diff --git a/addons/hr_holidays/models/hr_work_entry_type.py b/addons/hr_holidays/models/hr_work_entry_type.py
index 0473b4b3e9514e..1fe00371990683 100644
--- a/addons/hr_holidays/models/hr_work_entry_type.py
+++ b/addons/hr_holidays/models/hr_work_entry_type.py
@@ -279,7 +279,7 @@ def _search_max_leaves(self, operator, value):
def _search_virtual_remaining_leaves(self, operator, value):
def is_valid(work_entry_type):
- return not work_entry_type.requires_allocation or op(work_entry_type.virtual_remaining_leaves)
+ return not work_entry_type.requires_allocation or op(work_entry_type.virtual_remaining_leaves, value)
op = PY_OPERATORS.get(operator)
if not op:
return NotImplemented
diff --git a/addons/hr_holidays/static/src/components/accrual_level/accrual_levels.scss b/addons/hr_holidays/static/src/components/accrual_level/accrual_levels.scss
index f6a930fd221024..93843403dfabfa 100644
--- a/addons/hr_holidays/static/src/components/accrual_level/accrual_levels.scss
+++ b/addons/hr_holidays/static/src/components/accrual_level/accrual_levels.scss
@@ -10,7 +10,7 @@
}
.o_accrual {
- .o_field_accrual, .o_field_selection, .o_field_filterable_selection {
+ .o_field_accrual, .o_field_selection, .o_field_day_selection, .o_field_filterable_selection {
width: fit-content !important;
&:not(.o_readonly_modifier) > *:first-child {
diff --git a/addons/hr_holidays/static/src/components/day_selection/day_selection.js b/addons/hr_holidays/static/src/components/day_selection/day_selection.js
new file mode 100644
index 00000000000000..d8b7e967f03176
--- /dev/null
+++ b/addons/hr_holidays/static/src/components/day_selection/day_selection.js
@@ -0,0 +1,37 @@
+import { registry } from "@web/core/registry";
+import { SelectionField, selectionField } from "@web/views/fields/selection/selection_field";
+
+export class DaySelection extends SelectionField {
+ static props = {
+ ...SelectionField.props,
+ month: { type: String, optional: true },
+ };
+
+
+ get options() {
+ const options = super.options;
+ const selectedMonth = this.props.record.data[this.props.month];
+
+ if (!selectedMonth) return options;
+
+ // 2000 because it's a leap year
+ const maxDays = new Date(2000, parseInt(selectedMonth), 0).getDate();
+
+ return options.filter(option => parseInt(option[0]) <= maxDays);
+ }
+}
+
+export const daySelection = {
+ ...selectionField,
+ component: DaySelection,
+ extractProps({ attrs }) {
+ const props = selectionField.extractProps(...arguments);
+ props.month = attrs.month;
+ return props;
+ },
+ fieldDependencies: ({ attrs }) => [
+ { name: attrs.month, type: "selection" },
+ ],
+};
+
+registry.category("fields").add("day_selection", daySelection);
diff --git a/addons/hr_holidays/tests/test_hr_work_entry_type.py b/addons/hr_holidays/tests/test_hr_work_entry_type.py
index aca98678c86190..80bd2ae9d61f69 100644
--- a/addons/hr_holidays/tests/test_hr_work_entry_type.py
+++ b/addons/hr_holidays/tests/test_hr_work_entry_type.py
@@ -232,3 +232,31 @@ def test_change_count_days_as(self):
with self.assertRaises(ValidationError):
work_entry_type.count_days_as = 'working'
+
+ def test_search_virtual_remaining_leaves(self):
+ """Test search method on virtual_remaining_leaves"""
+ employee = self.env['hr.employee'].create({'name': 'Test Employee'})
+
+ allocated_work_entry_type = self.env['hr.work.entry.type'].create({
+ 'name': 'Test Time Off',
+ 'code': 'Test Time Off 5',
+ 'requires_allocation': True,
+ 'request_unit': 'day',
+ })
+
+ self.env['hr.leave.allocation'].sudo().create({
+ 'state': 'confirm',
+ 'work_entry_type_id': allocated_work_entry_type.id,
+ 'employee_id': employee.id,
+ 'number_of_days': 10,
+ }).action_approve()
+
+ env_with_context = self.env['hr.work.entry.type'].with_context(employee_id=employee.id)
+
+ types_greater_than_5 = env_with_context.search([('virtual_remaining_leaves', '>', 5)])
+
+ self.assertIn(
+ allocated_work_entry_type,
+ types_greater_than_5,
+ "Search failed: Should have found the work entry type within search results"
+ )
diff --git a/addons/hr_holidays/views/hr_leave_accrual_views.xml b/addons/hr_holidays/views/hr_leave_accrual_views.xml
index 0630b086ad787e..b86cf12769401f 100644
--- a/addons/hr_holidays/views/hr_leave_accrual_views.xml
+++ b/addons/hr_holidays/views/hr_leave_accrual_views.xml
@@ -36,17 +36,17 @@
on the
-
+
of
and the
-
+
of
on the
-
+
of
@@ -204,7 +204,7 @@
options="{'links': {'other': 'carryover_custom_date'}, 'observe': 'carryover'}"/>
: the
-
of