Eigene Cronjobs in Odoo
Was sind Cronjobs in Odoo? In Odoo sind Cronjobs (auch bekannt als Scheduled Actions oder Geplante Aktionen) das Herzstück der Automatisierung. Sie ermöglichen es dir, Python-Code zu bestimmten, wiederkehrenden Zeiten auszuführen, ohne dass ein Benutzer eingreifen muss. Typische Anwendungsfälle sind: Tägliches Abholen von Wechselkursen. Wöchentliches Versenden von Marketing-E-Mails. Automatische Lagerbereinigungen. In diesem Artikel zeigen wir, wie du einen benutzerdefinierten Cronjob erstellst, um Mitarbeiter automatisch an ihr jährliches Performance-Gespräch zu erinnern – einen Monat vor ihrem Jahrestag.
Das geplante Action (Cronjob) in XML definieren
Der Cronjob selbst wird als Datensatz des Modells ir.cron in einer XML-Datei deines Moduls definiert (z.B. in data/cron_jobs.xml).
<odoo>
<data noupdate="1">
<record id="ir_cron_performance_review_reminder" model="ir.cron">
<field name="name">Jährliche Erinnerung: Performance Review</field>
<field name="model_id" ref="hr.model_hr_employee"/>
<field name="code">model.send_performance_review_reminder()</field>
<field name="interval_number">1</field>
<field name="interval_type">days</field>
<field name="user_id" ref="base.user_root"/>
</record>
</data>
</odoo>
Wichtige Felder in der XML:
model_id: Verweist auf das Odoo-Modell, das die Python-Methode enthält, die wir ausführen möchten (hier:hr.employee).code: Dies ist der entscheidende Aufruf. Er sagt Odoo: "Führe die Methodesend_performance_review_reminderauf dem gesamten Modell (model.) aus."interval_type: Definiert die Frequenz. Wir nutzendaysin Kombination mitinterval_number1, um den Job täglich um Mitternacht laufen zu lassen. Die eigentliche Logik, ob etwas zu tun ist, liegt im Python-Code.
Die Python-Logik zum Senden der E-Mail
Im Modell, das du in der XML (hr.employee) angegeben hast, musst du nun die Methode send_performance_review_reminder() definieren. Diese Methode führt die eigentliche Geschäftslogik aus.
Voraussetzung: Du benötigst das E-Mail-Template aus dem vorherigen Blog-Artikel, das du unter dem Namen dein_modul.email_template_performance_reminder gespeichert hast.
from odoo import api, fields, models
from dateutil.relativedelta import relativedelta
from datetime import date
class HrEmployee(models.Model):
_inherit = 'hr.employee'
def send_performance_review_reminder(self):
"""
Wird täglich vom Cronjob aufgerufen.
Findet Mitarbeiter, deren Startdatum in genau einem Monat liegt,
und sendet ihnen eine E-Mail.
"""
# Hole das benötigte E-Mail-Template
template = self.env.ref('dein_modul.email_template_performance_reminder', raise_if_not_found=False)
if not template:
return
# 1. Definiere das Zieldatum (heute + 1 Monat)
target_date = date.today() + relativedelta(months=1)
# 2. Finde alle relevanten Mitarbeiter
employees_to_notify = self.search([
('hired_date', '!=', False),
('hired_date', '<=', target_date), # Grobe Filterung
])
# 3. Iteriere und prüfe das exakte Datum
for employee in employees_to_notify:
# Nur fortfahren, wenn das Einstellungsdatum bekannt ist
if not employee.hired_date:
continue
# Prüfe, ob der Monat und Tag des Einstellungsdatums dem Zieldatum entsprechen
# (Das Jahr wird ignoriert, da es sich um ein jährliches Ereignis handelt)
if employee.hired_date.month == target_date.month and \
employee.hired_date.day == target_date.day:
# E-Mail senden
try:
template.send_mail(
employee.id,
force_send=True,
raise_exception=True
)
except Exception as e:
# Fehlerbehandlung
pass
return True
Erklärung der Python-Logik:
Zielbestimmung: Wir nutzen
dateutil.relativedelta, um präzise das Datum in einem Monat zu berechnen (target_date).Filterung: Zuerst filtern wir alle Mitarbeiter grob vor, die ein Startdatum haben.
Exakte Prüfung: Im Loop prüfen wir Monat und Tag des
hired_dategegen den Monat und Tag destarget_date. Nur wenn beides übereinstimmt, ist es genau ein Monat vor dem Jahrestag.E-Mail-Versand: Das
template.send_mail(employee.id, ...)sendet die E-Mail. Es ist das gleiche Prinzip wie im vorherigen Artikel: Der Mitarbeiter-Record (employee.id) wird als Kontext (object) für das E-Mail-Template verwendet.
Fazit: Automation nach Plan
Die Kombination aus XML-Definition und Python-Logik ist der Standardweg für die Automatisierung in Odoo:
XML regelt wann und was aufgerufen wird (
model_id,code,interval_type).Python regelt wie die Geschäftslogik ausgeführt und die E-Mail versendet wird.
Mit diesem Muster kannst du nahezu jede wiederkehrende Aufgabe in deinem Odoo-System automatisieren und sicherstellen, dass kritische Termine wie Performance-Gespräche nie vergessen werden.