Files
Odoo-Modules/fusion_payroll/wizards/hr_employee_sin_wizard.py
2026-02-22 01:22:18 -05:00

82 lines
2.9 KiB
Python

# -*- coding: utf-8 -*-
from odoo import models, fields, api
from odoo.exceptions import UserError, AccessError
class HrEmployeeSinWizard(models.TransientModel):
_name = 'hr.employee.sin.wizard'
_description = 'View/Edit Employee SIN'
employee_id = fields.Many2one(
'hr.employee',
string='Employee',
required=True,
readonly=True,
)
employee_name = fields.Char(
related='employee_id.name',
string='Employee Name',
readonly=True,
)
sin_number = fields.Char(
string='Social Insurance Number',
help='9-digit Social Insurance Number (Format: XXX-XXX-XXX)',
)
sin_number_formatted = fields.Char(
string='SIN (Formatted)',
compute='_compute_sin_formatted',
)
@api.depends('sin_number')
def _compute_sin_formatted(self):
for wizard in self:
if wizard.sin_number:
sin = wizard.sin_number.replace('-', '').replace(' ', '')
if len(sin) == 9:
wizard.sin_number_formatted = f"{sin[0:3]}-{sin[3:6]}-{sin[6:9]}"
else:
wizard.sin_number_formatted = wizard.sin_number
else:
wizard.sin_number_formatted = ''
@api.model
def default_get(self, fields_list):
res = super().default_get(fields_list)
# Check access rights
if not self.env.user.has_group('hr.group_hr_manager') and \
not self.env.user.has_group('account.group_account_manager'):
raise AccessError('Only HR Managers and Accountants can view or edit SIN numbers.')
return res
def action_save(self):
"""Save the SIN number to the employee record"""
self.ensure_one()
# Double-check access rights
if not self.env.user.has_group('hr.group_hr_manager') and \
not self.env.user.has_group('account.group_account_manager'):
raise AccessError('Only HR Managers and Accountants can edit SIN numbers.')
# Format and validate SIN
if self.sin_number:
sin = self.sin_number.replace('-', '').replace(' ', '')
if not sin.isdigit() or len(sin) != 9:
raise UserError('Social Insurance Number must be exactly 9 digits.')
# Store formatted
formatted_sin = f"{sin[0:3]}-{sin[3:6]}-{sin[6:9]}"
self.employee_id.write({'sin_number': formatted_sin})
else:
self.employee_id.write({'sin_number': False})
return {
'type': 'ir.actions.client',
'tag': 'display_notification',
'params': {
'title': 'SIN Updated',
'message': f'Social Insurance Number has been updated for {self.employee_id.name}',
'type': 'success',
'next': {'type': 'ir.actions.act_window_close'},
}
}