Zum Inhalt springen

Wiederkehrende Jobs

Viele Aufgaben erledigt der invoiceR zeitgesteuert im Hintergrund: Postfach abrufen, Stammdaten synchronisieren, Belege ans ERP übergeben, Benutzer importieren und vieles mehr. Diese wiederkehrenden Jobs (auch Recurring Jobs oder Cron-Jobs genannt) führt die Komponente Hangfire aus.

  • Administration > Job-Ausführung listet alle eingerichteten Jobs mit Zeitplan (Cron), nächster und letzter Ausführung. Mit Run Task startest du einen Job sofort.
  • Administration > Hangfire Dashboard zeigt Details: Verlauf, Protokolle jeder Ausführung und fehlgeschlagene Jobs.
Seite Job-Ausführung mit der Liste der Jobs, Spalten Id, Job, Cron und dem Knopf Run Task

Beide Menüpunkte sind nur mit den entsprechenden Berechtigungen sichtbar.

Jeder Job ist ein Eintrag in der Tabelle conf.IrRecurringJobs:

SpalteBedeutung
IdGUID des Eintrags.
TenantIdMandant.
Enabled1 = Job ist aktiv.
HangfireIdEindeutiger technischer Name, zum Beispiel ch.invoicer.tool.delete.files.
DescriptionBezeichnung, die in der Job-Liste und in Hangfire erscheint.
CronExpressionZeitplan im Cron-Format, zum Beispiel 0 6 * * * für täglich um 6 Uhr.
ClassIdentifierVollständiger Klassenname des Jobs im invoiceR oder in einem Plugin.
MethodNameMethode, die gestartet wird.
MethodArgumentIdentifierKlassenname der Konfiguration, in die Configuration eingelesen wird.
ConfigurationJSON mit den Einstellungen des Jobs.
EnvironmentFilterLeer: gilt immer. Sonst nur in den genannten Umgebungen, zum Beispiel Production.
VisibleFilterRoleId, EditFilterRoleIdOptional. Rolle, die den Job sehen beziehungsweise bearbeiten darf.
SequenceCode, SequenceOrderOptional, für Batch-Jobs (siehe unten).
ObjectMappingCodeOptional, wird nur von einzelnen Jobs verwendet.

Änderungen an der Tabelle wirken erst, wenn der Job Wiederkehrende Hangfire-Jobs anmelden (Id ch.invoicer.fix.setupRecurringJobs) gelaufen ist. Er läuft einmal täglich von selbst; nach einer Änderung startest du ihn über Administration > Job-Ausführung oder im Hangfire Dashboard von Hand. Er registriert alle aktiven Jobs neu und entfernt Jobs, die nicht mehr konfiguriert sind.

Sollen mehrere Jobs immer nacheinander laufen (zum Beispiel erst Stammdaten importieren, dann Belege exportieren), fasst du sie zu einem Batch zusammen:

  • SequenceCode: bei allen Jobs des Batches dieselbe Zahl.
  • SequenceOrder: Reihenfolge innerhalb des Batches.

Der Batch erscheint als eigener Job BatchJob_<SequenceCode> und übernimmt den Zeitplan des ersten Jobs. Die CronExpression der übrigen Jobs im Batch wird nicht mehr berücksichtigt.

Löscht alte Dateien in einem Ordner auf dem invoiceR-Server, zum Beispiel temporäre Import-Dateien. Dateien können zuerst in einen Archiv-Unterordner verschoben und später endgültig gelöscht werden.

SpalteWert
ClassIdentifierenio.tool.Plugin.FileDeleter.FileDeleter
MethodNameCheckFiles
MethodArgumentIdentifierenio.tool.Plugin.FileDeleter.FileDeleterArgument
{
"FolderPath": "D:\\invoiceR\\Import",
"MoveToArchiveAfterXDays": 14,
"DeleteFromArchiveAfterXDays": 40,
"DirectDeleteAfterXDays": null,
"ArchiveFolderName": "Archive",
"AddTimestampInArchiveFileName": true
}
SchlüsselBedeutung
FolderPathAbsoluter Pfad des Ordners auf dem invoiceR-Server.
MoveToArchiveAfterXDaysNach so vielen Tagen ohne Änderung wandert eine Datei in den Archiv-Ordner.
DeleteFromArchiveAfterXDaysNach so vielen Tagen ohne Änderung wird eine Datei im Archiv-Ordner gelöscht.
DirectDeleteAfterXDaysGesetzt: Dateien werden nach so vielen Tagen direkt gelöscht, ohne Archiv-Ordner.
ArchiveFolderNameName des Archiv-Unterordners (Standard Archive).
AddTimestampInArchiveFileNametrue ergänzt den Dateinamen beim Verschieben um das letzte Änderungsdatum.

Führt regelmässig ein SQL-Statement auf der invoiceR-Datenbank aus, zum Beispiel eine Stored Procedure für Aufräumarbeiten.

SpalteWert
ClassIdentifierenio.tool.Plugin.SqlExecutor.ExecuteSqlStatement
MethodNameRunSql
MethodArgumentIdentifierenio.tool.Plugin.SqlExecutor.ExecuteSqlStatementArgument
{
"StatementDescription": "Startet die Prozedur dbo.MeineAufraeumarbeiten",
"SqlContent": "EXEC [dbo].[MeineAufraeumarbeiten]",
"NumberOfRowsAffectedForNoError": -1
}
SchlüsselBedeutung
StatementDescriptionBeschreibung, erscheint im Protokoll.
SqlContentAuszuführendes SQL. Längere Logik besser in eine Stored Procedure auslagern.
NumberOfRowsAffectedForNoErrorErwartete Anzahl betroffener Zeilen. Stimmt sie nicht, schlägt der Job fehl. -1 schaltet die Prüfung aus.
CommandTimeoutOptional. Zeitlimit in Sekunden für lange Statements (Standard 1800).

Importiert monatliche Durchschnittskurse des Bundesamts für Zoll und Grenzsicherheit (BAZG) und aktualisiert die Wechselkurse im invoiceR.

SpalteWert
ClassIdentifierenio.tool.Plugin.CurrencyExchangeRateImport.CurrencyExchangeRateImport
MethodNameDoImport
MethodArgumentIdentifierenio.tool.Plugin.CurrencyExchangeRateImport.CurrencyExchangeRateImportArgument
{
"Xmlurl": "https://www.backend-rates.bazg.admin.ch/api/xmlavgmonth",
"FilterCurrencies": ["USD", "EUR"]
}
SchlüsselBedeutung
XmlurlAdresse der XML-Datei mit den Kursen des BAZG.
FilterCurrenciesWährungen, die aktualisiert werden. Leer: alle Währungen.
INSERT INTO conf.IrRecurringJobs
(Id, TenantId, Enabled, HangfireId, Description, CronExpression,
ClassIdentifier, MethodName, MethodArgumentIdentifier, Configuration)
VALUES
(NEWID(), 1, 1, N'ch.invoicer.tool.delete.files', N'Import-Dateien aufräumen', N'5 3 * * *',
N'enio.tool.Plugin.FileDeleter.FileDeleter', N'CheckFiles',
N'enio.tool.Plugin.FileDeleter.FileDeleterArgument',
N'{ "FolderPath": "D:\\invoiceR\\Import", "DirectDeleteAfterXDays": 30 }');

Danach Wiederkehrende Hangfire-Jobs anmelden starten.