DEV: Sequence genartion for Employee Code

This commit is contained in:
Bhagya-K 2026-06-15 10:59:42 +05:30
parent 54541998c5
commit 8877a4ebc4
11 changed files with 117 additions and 20 deletions

View File

@ -1,5 +1,5 @@
from . import resource_calendar_period from . import resource_calendar_period
from . import late_coming_request from . import late_coming_request
from . import ot_request from . import ot_request
from . import attendance_data
from . import hr_employee_inherit from . import hr_employee_inherit
from . import attendance_data

View File

@ -104,6 +104,19 @@ class AttendanceAnalytics(models.Model):
shift_name = fields.Char( shift_name = fields.Char(
string='Shift' string='Shift'
) )
attendance_mode = fields.Selection(
related='employee_id.attendance_mode',
string='Attendance Mode',
store=True,
readonly=True,
)
work_mode = fields.Selection(
[
('office', 'Office'),
('wfh', 'Work From Home'),
],
string='Work Mode'
)
@api.depends('late_minutes') @api.depends('late_minutes')
def _compute_late_time(self): def _compute_late_time(self):
@ -305,17 +318,12 @@ class AttendanceAnalytics(models.Model):
self.env.cr.execute(""" self.env.cr.execute("""
CREATE OR REPLACE VIEW attendance_analytics AS ( CREATE OR REPLACE VIEW attendance_analytics AS (
WITH employee_dates AS ( WITH employee_dates AS (
SELECT SELECT
emp.id AS employee_id, emp.id AS employee_id,
emp.department_id, emp.department_id,
emp.resource_calendar_id, emp.resource_calendar_id,
emp.attendance_mode,
generate_series( generate_series(
DATE(emp.create_date), DATE(emp.create_date),
CURRENT_DATE, CURRENT_DATE,
@ -323,7 +331,6 @@ class AttendanceAnalytics(models.Model):
)::date AS date )::date AS date
FROM hr_employee emp FROM hr_employee emp
WHERE emp.active = true WHERE emp.active = true
), ),
@ -430,6 +437,7 @@ class AttendanceAnalytics(models.Model):
row_number() OVER() AS id, row_number() OVER() AS id,
ed.employee_id, ed.employee_id,
ed.department_id, ed.department_id,
ed.attendance_mode AS attendance_mode,
rc.id AS shift_id, rc.id AS shift_id,
rc.name AS shift_name, rc.name AS shift_name,
ed.date, ed.date,

View File

@ -10,7 +10,7 @@ class HREmployee(models.Model):
) )
attendance_mode = fields.Selection( attendance_mode = fields.Selection(
[ [
('office', 'Office Based'), ('office', 'Office'),
('remote', 'Remote'), ('remote', 'Remote'),
('hybrid', 'Hybrid'), ('hybrid', 'Hybrid'),
('shift', 'Shift Based'), ('shift', 'Shift Based'),
@ -19,6 +19,10 @@ class HREmployee(models.Model):
default='office', default='office',
tracking=True, tracking=True,
) )
work_mode = fields.Selection([
('office', 'Office'),
('wfh', 'Work From Home'),
], default='office')
def _compute_attendance_analytics_count(self): def _compute_attendance_analytics_count(self):

View File

@ -51,6 +51,7 @@ class ResourceCalendar(models.Model):
'dayofweek': day.code, 'dayofweek': day.code,
'hour_from': rec.shift_start_time, 'hour_from': rec.shift_start_time,
'hour_to': rec.shift_end_time, 'hour_to': rec.shift_end_time,
'work_mode': 'office',
})) }))
# Single write operation # Single write operation
@ -110,4 +111,12 @@ class ResourceCalendarDepartmentGrace(models.Model):
grace_period = fields.Integer( grace_period = fields.Integer(
string="Grace Period (Minutes)", string="Grace Period (Minutes)",
required=True required=True
) )
class ResourceCalendarAttendance(models.Model):
_inherit = 'resource.calendar.attendance'
work_mode = fields.Selection([
('office', 'Office'),
('wfh', 'Work From Home'),
])

View File

@ -23,6 +23,7 @@
<field name="is_compensation_pending"/> <field name="is_compensation_pending"/>
<field name="late_approved"/> <field name="late_approved"/>
<field name="shift_id"/> <field name="shift_id"/>
<field name="attendance_mode"/>
<!-- <field name="shift_name"/>--> <!-- <field name="shift_name"/>-->
<field name="status" <field name="status"
widget="badge" widget="badge"
@ -136,9 +137,13 @@
</record> </record>
<menuitem id="menu_attendance_analytics" <menuitem id="menu_attendance_analytics"
name="Attendance Data" name="Attendances"
parent="hr_attendance.menu_hr_attendance_root" parent="hr_attendance.menu_hr_attendance_root"
action="action_attendance_analytics"
sequence="50"/> sequence="50"/>
<menuitem id="menu_attendance_analytics_data"
name="Attendance Data"
parent="menu_attendance_analytics"
action="action_attendance_analytics"
sequence="-51"/>
</odoo> </odoo>

View File

@ -97,10 +97,14 @@
] ]
</field> </field>
</record> </record>
<menuitem id="menu_late_coming_request" <menuitem id="menu_late_coming_request_perm"
name="Permission Requests" name="Permission Requests"
parent="hr_attendance.menu_hr_attendance_root" parent="menu_attendance_analytics"
action="action_late_coming_request"
sequence="30"/> sequence="30"/>
<menuitem id="menu_late_coming_request"
name="Late Coming Requests"
parent="menu_late_coming_request_perm"
action="action_late_coming_request"
sequence="31"/>
</odoo> </odoo>

View File

@ -92,7 +92,7 @@
<menuitem id="menu_overtime_request" <menuitem id="menu_overtime_request"
name="Overtime Requests" name="Overtime Requests"
parent="hr_attendance.menu_hr_attendance_root" parent="menu_late_coming_request_perm"
action="action_overtime_request" action="action_overtime_request"
sequence="35"/> sequence="35"/>

View File

@ -77,10 +77,22 @@
</page> </page>
</xpath> </xpath>
<xpath expr="//sheet/notebook"
position="inside">
<page string="Hybrid Schedule Details">
<field name="attendance_ids">
<list editable="bottom">
<field name="name"/>
<field name="dayofweek"/>
<field name="hour_from"
widget="float_time"/>
<field name="hour_to"
widget="float_time"/>
<field name="work_mode"/>
</list>
</field>
</page>
</xpath>
</field> </field>
</record> </record>
</odoo> </odoo>

View File

@ -26,6 +26,7 @@
'security/ir.model.access.csv', 'security/ir.model.access.csv',
'data/cron.xml', 'data/cron.xml',
'data/mail.xml', 'data/mail.xml',
'data/sequence.xml',
'views/res_config_settings.xml', 'views/res_config_settings.xml',
'views/hr_employee.xml', 'views/hr_employee.xml',
'views/bank_details.xml', 'views/bank_details.xml',

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data noupdate="1">
<record id="seq_hr_employee" model="ir.sequence">
<field name="name">Employee Sequence</field>
<field name="code">hr.employee.running</field>
<field name="padding">4</field>
</record>
</data>
</odoo>

View File

@ -33,7 +33,19 @@ class HrEmployeeBase(models.AbstractModel):
('AB-', 'AB-'), ('AB-', 'AB-'),
], string="Blood Group") ], string="Blood Group")
@api.constrains('employee_id')
def _check_employee_code_unique(self):
for rec in self:
if rec.employee_id:
duplicate = self.search([
('id', '!=', rec.id),
('employee_id', '=', rec.employee_id)
], limit=1)
if duplicate:
raise ValidationError(
_("Employee Code '%s' already exists.") % rec.employee_id
)
@api.constrains('identification_id') @api.constrains('identification_id')
def _check_identification_id(self): def _check_identification_id(self):
@ -158,6 +170,37 @@ class HrEmployee(models.Model):
previous_company_pf_no = fields.Char(string='Previous Company PF No') previous_company_pf_no = fields.Char(string='Previous Company PF No')
previous_company_uan_no = fields.Char(string='Previous Company UAN No') previous_company_uan_no = fields.Char(string='Previous Company UAN No')
def _generate_employee_code(self, vals):
location = self.env['hr.work.location'].browse(
vals.get('work_location_id')
)
department = self.env['hr.department'].browse(
vals.get('department_id')
)
loc_code = location.location_number or location.name or "GEN"
dept_code = getattr(department, 'code', False) or department.name or "GEN"
year = fields.Date.today().year
seq = self.env['ir.sequence'].next_by_code(
'hr.employee.running'
) or '0001'
return f"{loc_code}-{dept_code}-{year}-{seq}"
@api.model_create_multi
def create(self, vals_list):
for vals in vals_list:
if not vals.get('employee_id'):
vals['employee_id'] = self._generate_employee_code(vals)
return super().create(vals_list)
def hr_employee_event_remainder(self): def hr_employee_event_remainder(self):
self.send_birthday_reminders() self.send_birthday_reminders()
today = fields.Date.today() today = fields.Date.today()