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.

Veröffentlicht am 25.10.2025

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.