update
This commit is contained in:
@@ -4,6 +4,7 @@
|
||||
|
||||
from datetime import datetime, timedelta
|
||||
from odoo import models, fields, api
|
||||
from .tz_utils import get_local_today, get_local_day_boundaries
|
||||
|
||||
|
||||
class HrEmployee(models.Model):
|
||||
@@ -117,8 +118,14 @@ class HrEmployee(models.Model):
|
||||
|
||||
def _get_fclk_scheduled_times(self, date):
|
||||
"""Return (scheduled_in_dt, scheduled_out_dt) for a given date.
|
||||
|
||||
Uses employee shift if assigned, otherwise global settings.
|
||||
The configured hours are interpreted in the employee's local
|
||||
timezone and converted to naive-UTC datetimes so they can be
|
||||
compared with Odoo's UTC-based ``fields.Datetime.now()``.
|
||||
"""
|
||||
import pytz
|
||||
|
||||
self.ensure_one()
|
||||
if self.x_fclk_shift_id:
|
||||
in_hour = self.x_fclk_shift_id.start_time
|
||||
@@ -133,8 +140,24 @@ class HrEmployee(models.Model):
|
||||
out_h = int(out_hour)
|
||||
out_m = int((out_hour - out_h) * 60)
|
||||
|
||||
scheduled_in = datetime.combine(date, datetime.min.time().replace(hour=in_h, minute=in_m))
|
||||
scheduled_out = datetime.combine(date, datetime.min.time().replace(hour=out_h, minute=out_m))
|
||||
tz_name = (
|
||||
self.resource_id.tz
|
||||
or (self.user_id.partner_id.tz if self.user_id else False)
|
||||
or self.company_id.partner_id.tz
|
||||
or 'UTC'
|
||||
)
|
||||
local_tz = pytz.timezone(tz_name)
|
||||
utc = pytz.UTC
|
||||
|
||||
local_in = local_tz.localize(
|
||||
datetime.combine(date, datetime.min.time().replace(hour=in_h, minute=in_m))
|
||||
)
|
||||
local_out = local_tz.localize(
|
||||
datetime.combine(date, datetime.min.time().replace(hour=out_h, minute=out_m))
|
||||
)
|
||||
|
||||
scheduled_in = local_in.astimezone(utc).replace(tzinfo=None)
|
||||
scheduled_out = local_out.astimezone(utc).replace(tzinfo=None)
|
||||
return scheduled_in, scheduled_out
|
||||
|
||||
def _get_fclk_scheduled_hours(self):
|
||||
@@ -150,39 +173,44 @@ class HrEmployee(models.Model):
|
||||
|
||||
def _compute_absence_counts(self):
|
||||
ActivityLog = self.env['fusion.clock.activity.log'].sudo()
|
||||
today = fields.Date.today()
|
||||
month_start = today.replace(day=1)
|
||||
year_start = today.replace(month=1, day=1)
|
||||
|
||||
for emp in self:
|
||||
today = get_local_today(self.env, emp)
|
||||
month_start = today.replace(day=1)
|
||||
year_start = today.replace(month=1, day=1)
|
||||
month_start_utc, _ = get_local_day_boundaries(self.env, month_start, emp)
|
||||
year_start_utc, _ = get_local_day_boundaries(self.env, year_start, emp)
|
||||
emp.x_fclk_absences_this_month = ActivityLog.search_count([
|
||||
('employee_id', '=', emp.id),
|
||||
('log_type', '=', 'absent'),
|
||||
('log_date', '>=', datetime.combine(month_start, datetime.min.time())),
|
||||
('log_date', '>=', month_start_utc),
|
||||
])
|
||||
emp.x_fclk_absences_this_year = ActivityLog.search_count([
|
||||
('employee_id', '=', emp.id),
|
||||
('log_type', '=', 'absent'),
|
||||
('log_date', '>=', datetime.combine(year_start, datetime.min.time())),
|
||||
('log_date', '>=', year_start_utc),
|
||||
])
|
||||
|
||||
def _compute_overtime(self):
|
||||
Attendance = self.env['hr.attendance'].sudo()
|
||||
today = fields.Date.today()
|
||||
week_start = today - timedelta(days=today.weekday())
|
||||
month_start = today.replace(day=1)
|
||||
|
||||
for emp in self:
|
||||
today = get_local_today(self.env, emp)
|
||||
week_start = today - timedelta(days=today.weekday())
|
||||
month_start = today.replace(day=1)
|
||||
week_start_utc, _ = get_local_day_boundaries(self.env, week_start, emp)
|
||||
month_start_utc, _ = get_local_day_boundaries(self.env, month_start, emp)
|
||||
|
||||
week_atts = Attendance.search([
|
||||
('employee_id', '=', emp.id),
|
||||
('check_in', '>=', datetime.combine(week_start, datetime.min.time())),
|
||||
('check_in', '>=', week_start_utc),
|
||||
('check_out', '!=', False),
|
||||
])
|
||||
emp.x_fclk_overtime_this_week = sum(a.x_fclk_overtime_hours or 0 for a in week_atts)
|
||||
|
||||
month_atts = Attendance.search([
|
||||
('employee_id', '=', emp.id),
|
||||
('check_in', '>=', datetime.combine(month_start, datetime.min.time())),
|
||||
('check_in', '>=', month_start_utc),
|
||||
('check_out', '!=', False),
|
||||
])
|
||||
emp.x_fclk_overtime_this_month = sum(a.x_fclk_overtime_hours or 0 for a in month_atts)
|
||||
|
||||
Reference in New Issue
Block a user