1.Work Absence
-If there are employee who doesn’t scan finger print at all on that date it will count as 1 day absence,
1 day absence mean employee doesn’t get paid on that specific day so the calculation will be like this
result = (contract.wage / 30) * days employee missed
start_dt = datetime.datetime.combine(fields.Date.from_string(payslip.date_from), datetime.datetime.min.time()) end_dt = datetime.datetime.combine(fields.Date.from_string(payslip.date_to), datetime.datetime.max.time()) start_dt_str = fields.Datetime.to_string(start_dt) end_dt_str = fields.Datetime.to_string(end_dt) resource_calendar_id = employee._get_resource_calendar() attendance_ids = employee.attendance_ids.filtered(lambda att: att.check_in >= start_dt_str and att.check_out <= end_dt_str) missed_days = 0 for dt in dateutil.rrule.rrule(dateutil.rrule.DAILY, dtstart=start_dt, until=end_dt): if not resource_calendar_id._is_work_day(dt.date(), resource_calendar_id.id): continue if not attendance_ids.filtered(lambda att: fields.Date.from_string(att.check_in) == dt.date() and fields.Date.from_string(att.check_out) == dt.date()): missed_days +=1 result = (contract.wage / 30) * missed_days
2.Late Absence (10 min Quota, 10 Times in a month)
-If an employees who come to late more than 10 minute , for than 10 times, employee will count as 1 Day absence, to calculate day of absence are
result = (contract.wage / 30) * lateabsence(10minconsecutive)
start_dt = datetime.datetime.combine(fields.Date.from_string(payslip.date_from), datetime.datetime.min.time()) end_dt = datetime.datetime.combine(fields.Date.from_string(payslip.date_to), datetime.datetime.max.time()) start_dt_str = fields.Datetime.to_string(start_dt) end_dt_str = fields.Datetime.to_string(end_dt) resource_calendar_id = employee._get_resource_calendar() attendance_ids = employee.attendance_ids.filtered(lambda att: att.check_in >= start_dt_str and att.check_out <= end_dt_str) lates_count = 0 for dt in dateutil.rrule.rrule(dateutil.rrule.DAILY, dtstart=start_dt, until=end_dt): employee_att_ids = attendance_ids.filtered(lambda att: fields.Date.from_string(att.check_in) == dt.date()) if employee_att_ids: emp_check_in = fields.Datetime.from_string(employee_att_ids[0].check_in) calendar_att_ids = resource_calendar_id._get_day_attendances(dt.date(), dt.min.time(), dt.max.time()) if calendar_att_ids: hour, minute = divmod(calendar_att_ids[0].hour_from * 60.0, 60) calendar_start_dt = dt.replace(hour=int(hour), minute=int(minute)) if (emp_check_in - calendar_start_dt).seconds / 60 > 10.0: lates_count += 1 result = (contract.wage / 30) * (lates_count // 11)
3.Late Absence (4 Hours Monthly Quota)
-If an employees came late to work late in 4 hours of total, employee will count as 1 Day absence, to calculate day of absence are
result = (contract.wage / 30) * lateabsence(4hoursquota)
start_dt = datetime.datetime.combine(fields.Date.from_string(payslip.date_from), datetime.datetime.min.time()) end_dt = datetime.datetime.combine(fields.Date.from_string(payslip.date_to), datetime.datetime.max.time()) start_dt_str = fields.Datetime.to_string(start_dt) end_dt_str = fields.Datetime.to_string(end_dt) resource_calendar_id = employee._get_resource_calendar() attendance_ids = employee.attendance_ids.filtered(lambda att: att.check_in >= start_dt_str and att.check_out <= end_dt_str) cumm_lates_minutes= 0.0 for dt in dateutil.rrule.rrule(dateutil.rrule.DAILY, dtstart=start_dt, until=end_dt): employee_att_ids = attendance_ids.filtered(lambda att: fields.Date.from_string(att.check_in) == dt.date()) if employee_att_ids: emp_check_in = fields.Datetime.from_string(employee_att_ids[0].check_in) calendar_att_ids = resource_calendar_id._get_day_attendances(dt.date(), dt.min.time(), dt.max.time()) if calendar_att_ids: hour, minute = divmod(calendar_att_ids[0].hour_from * 60.0, 60) calendar_start_dt = dt.replace(hour=int(hour), minute=int(minute)) late_minutes = (emp_check_in - calendar_start_dt).seconds / 60 cumm_lates_minutes += late_minutes late_hours = cumm_lates_minutes // 60 result = (contract.wage / 30) * (late_hours // 4)
4.OT on Normal Days
If an employee work on normal (Monday-Saturaday) But, the employee continue to work after 17:00 / checkin after 17:00 he or she will receive
result = ((contract.wage / 30) / 8 )*1.5
(1.5 TIMES HOURLY RATE)
5.OT on Holidays
If an employee work on Holiday like sunday and including in days in GLOBAL LEAVES he or she will receive
result = ((contract.wage / 30) / 8 )*2
(TWO TIMES HOURLY RATE)
# cost per hour hour_cost = ((contract.wage / 30) / 8 ) # start calculating overtime cost result = 0.0 if payslip.hr_overtime_line_ids: for line in payslip.hr_overtime_line_ids: if line.work_day_type_id and line.work_day_type_id.is_holiday: result += hour_cost * line.worked_hours * line.work_day_type_id.rate / 100.0 else: result += hour_cost * line.worked_hours * line.rate / 100.0
NOTE: the above code requires the following modules to work properly:
https://www.odoo.com/apps/modules/11.0/to_hr_payroll_attendance/
https://apps.odoo.com/apps/modules/11.0/to_hr_overtime_payroll/