jan@dunkel.tech
dunkel.Tech
Odoo

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.

Eigene Cronjobs in Odoo

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 Methode send_performance_review_reminder auf dem gesamten Modell (model.) aus."

  • interval_type: Definiert die Frequenz. Wir nutzen days in Kombination mit interval_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:

  1. Zielbestimmung: Wir nutzen dateutil.relativedelta, um präzise das Datum in einem Monat zu berechnen (target_date).

  2. Filterung: Zuerst filtern wir alle Mitarbeiter grob vor, die ein Startdatum haben.

  3. Exakte Prüfung: Im Loop prüfen wir Monat und Tag des hired_date gegen den Monat und Tag des target_date. Nur wenn beides übereinstimmt, ist es genau ein Monat vor dem Jahrestag.

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

Mehr aus Odoo
E-Mails mit Odoo versenden
18. October 2025

E-Mails mit Odoo versenden

Warum eigene E-Mails in Odoo? Odoo ist eine mächtige Plattform, aber manchmal reicht die Standardfunktionalität nicht aus. Du möchtest vielleicht: Eine spezielle Benachrichtigung versenden, wenn ein bestimmtes Kriterium in deinem benutzerdefinierten Modul erfüllt ist. Eine E-Mail mit dynamischen Inhalten an einen externen Dienstleister schicken. Ein einzigartiges Design für Transaktions-E-Mails verwenden, das nicht zum Standard passt. Der einfachste und robusteste Weg in Odoo ist die Verwendung von E-Mail-Templates (XML) in Kombination mit Python-Code (API-Aufrufe). So trennst du das Design vom Code und profitierst von Odoos integrierter E-Mail-Infrastruktur.

Mehr erfahren
Die eigene Odoo Extension
11. July 2025

Die eigene Odoo Extension

In diesem Beitrag zeige ich, wie man in Odoo eine bestehende App – in unserem Fall die HR-App (Human Resources) – technisch erweitert. Wir erstellen eine eigene Erweiterung, mit der sich die Standard-Ansicht der Mitarbeiterliste auf Listenansicht umstellen lässt. Zusätzlich erweitern wir das zugehörige Datenmodell um ein eigenes benutzerdefiniertes Feld, das sich direkt im Backend verwenden lässt. Der Artikel richtet sich an Entwickler:innen, die bestehende Odoo-Module gezielt anpassen und eigene Funktionen integrieren möchten – ohne die Kernlogik zu verändern.

Mehr erfahren