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>
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
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.
