82 lines
2.9 KiB
Python
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'},
|
|
}
|
|
}
|