import type { WebhookDeliveryStatus } from "@/lib/webhooks/types"; import type { JobName, JobRunStatus } from "./types"; /** Same wording as JOB_LABELS_DE in the backend. */ export const JOB_LABELS: Record = { "daily-evaluation": "Tägliche Auswertung", "task-templates": "Aufgaben aus Vorlagen", cleanup: "Aufräumen", "app-backup": "App-Backup", rekey: "Schlüssel umstellen", "voice-transcribe": "Sprachnotizen abschreiben", }; export const JOB_RUN_STATUS_LABELS: Record = { RUNNING: "Läuft", SUCCEEDED: "Erfolgreich", FAILED: "Fehlgeschlagen", } as const; export const WEBHOOK_DELIVERY_STATUS_LABELS: Record = { PENDING: "Offen", PROCESSING: "Wird zugestellt", DELIVERED: "Zugestellt", FAILED: "Fehlgeschlagen", }; export const DOMAIN_EVENT_LABELS: Record = { InspectionRecorded: "Durchsicht erfasst", InspectionCorrected: "Durchsicht korrigiert", VarroaMeasured: "Varroamessung erfasst", VarroaCorrected: "Varroamessung korrigiert", TreatmentRecorded: "Behandlung erfasst", TreatmentCorrected: "Behandlung korrigiert", FeedingRecorded: "Fütterung erfasst", FeedingCorrected: "Fütterung korrigiert", HarvestRecorded: "Ernte erfasst", HarvestCorrected: "Ernte korrigiert", ColonyStatusChanged: "Volksstatus geändert", ColonyEnded: "Volk beendet", BatchBottled: "Charge abgefüllt", BottlingCorrected: "Abfüllung korrigiert", StockChanged: "Bestand geändert", TaskCreated: "Aufgabe angelegt", TaskUpdated: "Aufgabe geändert", TaskCompleted: "Aufgabe erledigt", WithdrawalEnded: "Wartezeit beendet", TaskDue: "Aufgabe fällig", QueenAged: "Königin gealtert", VarroaMeasurementDue: "Varroamessung fällig", InspectionOverdue: "Durchsicht überfällig", ColonySplit: "Ableger angelegt", QueenAssigned: "Königin zugewiesen", ExtractionRecorded: "Schleuderung erfasst", ExtractionCorrected: "Schleuderung korrigiert", HoneyBatchRecorded: "Honigcharge angelegt", HoneyBatchCorrected: "Honigcharge korrigiert", PhenologyReported: "Pflanzenmeldung erfasst", PhenologyCorrected: "Pflanzenmeldung korrigiert", PhenologyRecomputeRequested: "Saison neu berechnen angefordert", WinterCheckRecorded: "Winterkontrolle erfasst", SeasonPhaseChanged: "Saisonabschnitt gewechselt", ColonyCreated: "Volk angelegt", ColonyMoved: "Volk umgesetzt", ApiaryChanged: "Stand geändert", TskReferenceDayReached: "TSK-Stichtag erreicht", HiveChanged: "Beute geändert", VoiceCaptureReady: "Sprachnotiz fertig", VoiceCaptureFailed: "Sprachnotiz fehlgeschlagen", }; /** The oldest open event is this old (seconds) before the worker counts as stuck. */ export const QUEUE_STALE_WARNING_SECONDS = 600; const SECONDS_PER_MINUTE = 60; const SECONDS_PER_HOUR = 3600; const SECONDS_PER_DAY = 86400; /** "vor 3 Min." / "vor 2 Std." / "vor 2 Tagen". */ export function formatAge(seconds: number): string { if (seconds < SECONDS_PER_MINUTE) { return "vor wenigen Sekunden"; } if (seconds < SECONDS_PER_HOUR) { return `vor ${Math.floor(seconds / SECONDS_PER_MINUTE)} Min.`; } if (seconds < SECONDS_PER_DAY) { return `vor ${Math.floor(seconds / SECONDS_PER_HOUR)} Std.`; } const days = Math.floor(seconds / SECONDS_PER_DAY); return days === 1 ? "vor 1 Tag" : `vor ${days} Tagen`; } /** "1 Versuch" / "8 Versuche". */ export function attemptsLabel(attempts: number): string { return attempts === 1 ? "1 Versuch" : `${attempts} Versuche`; }