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.
Jobs ansehen und starten
Abschnitt betitelt „Jobs ansehen und starten“Administration > Job-Ausführunglistet alle eingerichteten Jobs mit Zeitplan (Cron), nächster und letzter Ausführung. Mit Run Task startest du einen Job sofort.Administration > Hangfire Dashboardzeigt Details: Verlauf, Protokolle jeder Ausführung und fehlgeschlagene Jobs.
Beide Menüpunkte sind nur mit den entsprechenden Berechtigungen sichtbar.
Jobs konfigurieren
Abschnitt betitelt „Jobs konfigurieren“Jeder Job ist ein Eintrag in der Tabelle conf.IrRecurringJobs:
| Spalte | Bedeutung |
|---|---|
Id | GUID des Eintrags. |
TenantId | Mandant. |
Enabled | 1 = Job ist aktiv. |
HangfireId | Eindeutiger technischer Name, zum Beispiel ch.invoicer.tool.delete.files. |
Description | Bezeichnung, die in der Job-Liste und in Hangfire erscheint. |
CronExpression | Zeitplan im Cron-Format, zum Beispiel 0 6 * * * für täglich um 6 Uhr. |
ClassIdentifier | Vollständiger Klassenname des Jobs im invoiceR oder in einem Plugin. |
MethodName | Methode, die gestartet wird. |
MethodArgumentIdentifier | Klassenname der Konfiguration, in die Configuration eingelesen wird. |
Configuration | JSON mit den Einstellungen des Jobs. |
EnvironmentFilter | Leer: gilt immer. Sonst nur in den genannten Umgebungen, zum Beispiel Production. |
VisibleFilterRoleId, EditFilterRoleId | Optional. Rolle, die den Job sehen beziehungsweise bearbeiten darf. |
SequenceCode, SequenceOrder | Optional, für Batch-Jobs (siehe unten). |
ObjectMappingCode | Optional, 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.
Batch-Jobs
Abschnitt betitelt „Batch-Jobs“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.
Dateien löschen
Abschnitt betitelt „Dateien löschen“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.
| Spalte | Wert |
|---|---|
ClassIdentifier | enio.tool.Plugin.FileDeleter.FileDeleter |
MethodName | CheckFiles |
MethodArgumentIdentifier | enio.tool.Plugin.FileDeleter.FileDeleterArgument |
{ "FolderPath": "D:\\invoiceR\\Import", "MoveToArchiveAfterXDays": 14, "DeleteFromArchiveAfterXDays": 40, "DirectDeleteAfterXDays": null, "ArchiveFolderName": "Archive", "AddTimestampInArchiveFileName": true}| Schlüssel | Bedeutung |
|---|---|
FolderPath | Absoluter Pfad des Ordners auf dem invoiceR-Server. |
MoveToArchiveAfterXDays | Nach so vielen Tagen ohne Änderung wandert eine Datei in den Archiv-Ordner. |
DeleteFromArchiveAfterXDays | Nach so vielen Tagen ohne Änderung wird eine Datei im Archiv-Ordner gelöscht. |
DirectDeleteAfterXDays | Gesetzt: Dateien werden nach so vielen Tagen direkt gelöscht, ohne Archiv-Ordner. |
ArchiveFolderName | Name des Archiv-Unterordners (Standard Archive). |
AddTimestampInArchiveFileName | true ergänzt den Dateinamen beim Verschieben um das letzte Änderungsdatum. |
SQL ausführen
Abschnitt betitelt „SQL ausführen“Führt regelmässig ein SQL-Statement auf der invoiceR-Datenbank aus, zum Beispiel eine Stored Procedure für Aufräumarbeiten.
| Spalte | Wert |
|---|---|
ClassIdentifier | enio.tool.Plugin.SqlExecutor.ExecuteSqlStatement |
MethodName | RunSql |
MethodArgumentIdentifier | enio.tool.Plugin.SqlExecutor.ExecuteSqlStatementArgument |
{ "StatementDescription": "Startet die Prozedur dbo.MeineAufraeumarbeiten", "SqlContent": "EXEC [dbo].[MeineAufraeumarbeiten]", "NumberOfRowsAffectedForNoError": -1}| Schlüssel | Bedeutung |
|---|---|
StatementDescription | Beschreibung, erscheint im Protokoll. |
SqlContent | Auszuführendes SQL. Längere Logik besser in eine Stored Procedure auslagern. |
NumberOfRowsAffectedForNoError | Erwartete Anzahl betroffener Zeilen. Stimmt sie nicht, schlägt der Job fehl. -1 schaltet die Prüfung aus. |
CommandTimeout | Optional. Zeitlimit in Sekunden für lange Statements (Standard 1800). |
Wechselkurse importieren
Abschnitt betitelt „Wechselkurse importieren“Importiert monatliche Durchschnittskurse des Bundesamts für Zoll und Grenzsicherheit (BAZG) und aktualisiert die Wechselkurse im invoiceR.
| Spalte | Wert |
|---|---|
ClassIdentifier | enio.tool.Plugin.CurrencyExchangeRateImport.CurrencyExchangeRateImport |
MethodName | DoImport |
MethodArgumentIdentifier | enio.tool.Plugin.CurrencyExchangeRateImport.CurrencyExchangeRateImportArgument |
{ "Xmlurl": "https://www.backend-rates.bazg.admin.ch/api/xmlavgmonth", "FilterCurrencies": ["USD", "EUR"]}| Schlüssel | Bedeutung |
|---|---|
Xmlurl | Adresse der XML-Datei mit den Kursen des BAZG. |
FilterCurrencies | Währungen, die aktualisiert werden. Leer: alle Währungen. |
Beispiel: Job anlegen
Abschnitt betitelt „Beispiel: Job anlegen“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.
