Anwesenheiten Aktionen
Aktionen für Anwesenheit App einrichten.
Aktionen
Fehlende Anwesenheitseinträge anzeigen
Warnung
Diese Funktion wurde Teil von HR Attendance Missing. #DEPRECATED
Navigieren Sie nach Einstellungen > Technisch > Serveraktionen und erstellen Sie einen neuen Eintrag:
- Name:
Fehlende Anwesenheitseinträge anzeigen - Modell:
ir.actions.server - Typ:
Code ausführen - Code:
# Settings
days = 30
offset_days = 3
date_format = '%d.%m.%Y'
employee_domain = [] # [('name', '=', 'Roger Bünter')]
leave_state_domain = ('state', 'not in', ['draft', 'confirm'])
today = datetime.datetime.today() - datetime.timedelta(days=offset_days)
dates = [today - datetime.timedelta(days=d) for d in range(days)]
start_date = today - datetime.timedelta(days=days)
report = '# Missing attendances\n\n'
report += 'Range is from %s until %s.\n' % (start_date.strftime(date_format), today.strftime(date_format))
user_tz = timezone(env.user.tz)
utc_tz = timezone('UTC')
for employee in env['hr.employee'].search(employee_domain):
attendances = env['hr.attendance'].search([
('employee_id', '=', employee.id),
('check_in', '>=', start_date)
])
attendance_dates = attendances.mapped(lambda a: a.check_in.date()) if attendances else []
leaves = env['hr.leave'].search([
leave_state_domain,
('employee_id', '=', employee.id),
'|', ('date_from', '>=', start_date), ('date_to', '>=', start_date),
])
calendar_leaves = env['resource.calendar.leaves'].search([
('calendar_id', '=', employee.resource_calendar_id.id),
# ('work_entry_type_id', '=', 2),
('resource_id', '=', False),
'|', ('date_from', '>=', start_date), ('date_to', '<=', start_date),
])
missing_dates = []
for check_date in dates:
min_check_date = datetime.datetime.combine(check_date.date(), datetime.time.min)
max_check_date = datetime.datetime.combine(check_date.date(), datetime.time.max)
min_check_date_utc = min_check_date - user_tz.utcoffset(check_date)
max_check_date_utc = max_check_date - user_tz.utcoffset(check_date)
work_hours = employee.resource_calendar_id.get_work_hours_count(
min_check_date,
max_check_date,
False
)
active_leaves = leaves.filtered(lambda l:
l.date_from < check_date < l.date_to or
min_check_date <= l.date_from <= max_check_date or
min_check_date <= l.date_to <= max_check_date
)
active_calendar_leaves = calendar_leaves.filtered(lambda l:
l.date_from < check_date < l.date_to or
min_check_date_utc <= l.date_from <= max_check_date_utc or
min_check_date_utc <= l.date_to <= max_check_date_utc
)
has_attendance = check_date.date() in attendance_dates
missing_attendance = work_hours > 0 and not has_attendance and not active_leaves and not active_calendar_leaves
if missing_attendance:
missing_dates.append(check_date.strftime(date_format) + ' (%sh)' % round(work_hours,2))
# raise UserError({
# 'start_date': start_date,
# 'name': employee.name,
# 'check_date': check_date,
# 'missing_attendance': missing_attendance,
# 'work_hours': work_hours,
# 'leaves': leaves.mapped('date_from'),
# 'active_leaves': active_leaves,
# 'calendar_leaves': calendar_leaves[0].date_from,
# 'active_calendar_leaves': active_calendar_leaves,
# 'has_attendance': has_attendance,
# 'min_check_date': min_check_date,
# 'max_check_date': max_check_date,
# 'delta': user_tz.utcoffset(check_date),
# 'min_check_date_utc': min_check_date_utc,
# 'max_check_date_utc': max_check_date_utc,
# }.items())
# raise UserError(missing_dates)
if missing_dates:
report += '\n' + employee.name + ':\n'
for missing_date in missing_dates:
report += '* ' + missing_date + '\n'
raise UserError(report)Diese Serveraktion produziert ein Bericht in folgendem Format:
# Missing attendances
Range is from 08.11.2022 until 08.12.2022.
Abigail Peterson:
- 07.12.2022 (4.0h)
- 06.12.2022 (8.0h)
- 05.12.2022 (8.0h)
...Wenn Sie den Bericht für bestimmte Mitarbeitende deaktivieren möchten, müssen Sie eine Flexible Arbeitszeit erfassen und dem ausgewählten Mitarbeitenden hinterlegen.
Manager können den Bericht aufrufen, wenn Sie mit den folgenden Informationen einen Menüposten erstellen.
- Menü:
Fehlende Anwesenheitseinträge anzeigen - Obermenü:
Abwesenheitszeiten/Berichtswesen - Aktion:
ir.actions.serverFehlende Anwesenheitseinträge anzeigen
Überstunden aktualisieren
Navigieren Sie nach Einstellungen > Technisch > Serveraktionen und erstellen Sie einen neuen Eintrag:
- Name:
Überstunden aktualisieren - Modell:
hr.attendance - Typ:
Code ausführen - Code:
for record in records:
record.write({
'check_out': record.check_out
})
record._update_overtime()Die Aktion mit dem Knopf Kontextuelle Aktion erstellen bestätigen und dann speichern.
In der Listenansicht der Anwesenheiten erscheint nun in der Auswahl Aktion das Menu Überstunden aktualisieren.
Geplante Aktionen
Überstunden entfernen
Mit dieser geplanten Aktion werden registrierte Überstunden der Mitarbeitenden mit einem Arbeitsstundensoll von 0 am Ende des Monats entfernt.
Navigieren Sie nach Einstellungen > Technisch > Automatisierungsregeln und erstellen Sie einen neuen Eintrag:
- Name:
Überstunden entfernen - Modell:
ir.actions.server - Ausführen alle:
1Monat - Nächstes Ausführungsdatum:
01.MM.YYYY 06:00:00 - Anzahl der Anrufe:
-1 - Typ:
Code ausführen - Code:
last_month_until = datetime.date.today().replace(day=1) - datetime.timedelta(days=1)
last_month_from = last_month_until.replace(day=1)
# Get employees with zero hours work time
employees = env['hr.employee'].search([
('resource_calendar_id.hours_per_day', '=', 0.0)
])
messages = []
for employee in employees:
# Get overtimes of last month
overtimes = env['hr.attendance.overtime'].search([
('employee_id', '=', employee.id),
# ('date', '>=', last_month_from),
('date', '<=', last_month_until)
])
if overtimes:
messages.append('Removed these overtime entries for %(name)s:\n' % {'name': employee.name})
messages.extend(["- %s: %s\n" % (o.date, round(o.duration, 2)) for o in overtimes])
overtimes.unlink()
if messages:
log(' '.join(messages))Überstunden aktualisieren
Mit dieser geplanten Aktion werden die Überstunden anhand der Anwesenheit neu berechnet.
Navigieren Sie nach Einstellungen > Technisch > Automatisierungsregeln und erstellen Sie einen neuen Eintrag:
- Name:
Überstunden aktualisieren - Modell:
ir.actions.server - Ausführen alle:
1Woche - Nächstes Ausführungsdatum:
01.MM.YYYY 06:00:00 - Anzahl der Anrufe:
-1 - Typ:
Code ausführen - Code:
# Settings
days = 7
start_date = datetime.datetime.today() - datetime.timedelta(days=days)
attendances = env['hr.attendance'].search([
('check_in', '>=', start_date)
])
attendances._update_overtime()Automatisierungsregeln
Urlaubsanspruch Überstunden aktualisieren
Mit dieser Aktion wird der Anspruch der Abwesenheitsart mit der externen ID __custom__.holiday_status_extra_hours beim Erstellen und Aktualisieren der Anwesenheit aktualisiert.
Erstellen Sie unter Einstellungen > Technisch > Automation > Automatisierungsregeln einen Eintrag mit diesen Werten:
- Name:
Urlaubsanspruch Überstunden aktualisieren - Modell:
hr.attendance - Auslöser: Beim Erstellen und Aktualisieren
- Folgeaktion:
- Code:
holiday_status_id = env.ref('__custom__.holiday_status_extra_hours')
for rec in records:
allocation_id = env['hr.leave.allocation'].search([
('employee_id','=',rec.employee_id.id),
('holiday_status_id', '=', holiday_status_id.id)
], limit=1)
# raise UserError([rec.employee_id.total_overtime, rec.employee_id.total_overtime/8 ,allocation_id.number_of_days])
number_of_days = rec.employee_id.total_overtime/8
if allocation_id.number_of_days < number_of_days:
allocation_id.write({'number_of_days': number_of_days})