{{ row.title }}
+{{ row.summary }}
+ + {% if row.meta %} + + {% endif %} + + {% if row.url %} + + {% endif %} + + {% if row.details %} +-
+ {% for item in value %}
+
- {{ item }} + {% endfor %} +
diff --git a/backend/locale/en/LC_MESSAGES/django.mo b/backend/locale/en/LC_MESSAGES/django.mo index 48580ec..5f4707a 100644 Binary files a/backend/locale/en/LC_MESSAGES/django.mo and b/backend/locale/en/LC_MESSAGES/django.mo differ diff --git a/backend/locale/en/LC_MESSAGES/django.po b/backend/locale/en/LC_MESSAGES/django.po index a510bc3..0cea342 100644 --- a/backend/locale/en/LC_MESSAGES/django.po +++ b/backend/locale/en/LC_MESSAGES/django.po @@ -2,30 +2,342 @@ msgid "" msgstr "" "Project-Id-Version: tubco-portal\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-03-25 19:40+0000\n" +"POT-Creation-Date: 2026-03-25 23:02+0000\n" "PO-Revision-Date: 2026-03-24 00:00+0000\n" "Language: en\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: workflows/models.py:55 +#: workflows/forms.py:338 +#, python-format +msgid "" +"Das Übergabedatum muss mindestens %(days)s Tage in der Zukunft liegen " +"(frühestens %(date)s)." +msgstr "" + +#: workflows/models.py:55 workflows/views.py:180 msgid "Eingereicht" msgstr "Submitted" -#: workflows/models.py:56 +#: workflows/models.py:56 workflows/views.py:181 msgid "In Bearbeitung" msgstr "Processing" -#: workflows/models.py:57 -#, fuzzy +#: workflows/models.py:57 workflows/models.py:372 workflows/views.py:182 msgid "Abgeschlossen" msgstr "Completed" -#: workflows/models.py:58 workflows/templates/workflows/welcome_emails.html:112 +#: workflows/models.py:58 workflows/models.py:312 +#: workflows/templates/workflows/requests_dashboard.html:190 +#: workflows/templates/workflows/welcome_emails.html:112 workflows/views.py:183 msgid "Fehlgeschlagen" msgstr "Failed" +#: workflows/models.py:65 +msgid "Herr" +msgstr "" + +#: workflows/models.py:65 +msgid "Frau" +msgstr "" + +#: workflows/models.py:65 +msgid "Divers" +msgstr "" + +#: workflows/models.py:75 +msgid "befristet" +msgstr "" + +#: workflows/models.py:75 +msgid "unbefristet" +msgstr "" + +#: workflows/models.py:138 +#: workflows/templates/workflows/onboarding_intro_session.html:32 +msgid "Abteilung" +msgstr "Department" + +#: workflows/models.py:139 +msgid "Geräte" +msgstr "" + +#: workflows/models.py:140 +msgid "Software" +msgstr "" + +#: workflows/models.py:141 +#, fuzzy +#| msgid "Vorgänge" +msgid "Zugänge" +msgstr "Requests" + +#: workflows/models.py:142 +msgid "Workspace-Gruppen" +msgstr "" + +#: workflows/models.py:143 +msgid "Ressourcen" +msgstr "" + +#: workflows/models.py:144 +msgid "Telefonnummern" +msgstr "" + +#: workflows/models.py:170 +msgid "Automatisch" +msgstr "" + +#: workflows/models.py:171 workflows/views.py:86 +msgid "Stammdaten" +msgstr "Master data" + +#: workflows/models.py:172 workflows/views.py:87 +msgid "Vertrag" +msgstr "Contract" + +#: workflows/models.py:173 workflows/views.py:88 +msgid "IT-Setup" +msgstr "IT setup" + +#: workflows/models.py:174 workflows/views.py:89 +msgid "Abschluss" +msgstr "Finish" + +#: workflows/models.py:177 workflows/models.py:258 +#: workflows/templates/workflows/home.html:66 +#: workflows/templates/workflows/onboarding_form.html:25 +#: workflows/templates/workflows/requests_dashboard.html:68 +msgid "Onboarding" +msgstr "Onboarding" + +#: workflows/models.py:178 workflows/models.py:259 +#: workflows/templates/workflows/home.html:82 +#: workflows/templates/workflows/requests_dashboard.html:78 +msgid "Offboarding" +msgstr "Offboarding" + +#: workflows/models.py:216 +#, fuzzy +#| msgid "Onboarding" +msgid "Onboarding: IT" +msgstr "Onboarding" + +#: workflows/models.py:217 +#, fuzzy +#| msgid "Offboarding-Anfrage speichern" +msgid "Onboarding: Allgemeine Info" +msgstr "Save offboarding request" + +#: workflows/models.py:218 +#, fuzzy +#| msgid "Onboarding starten" +msgid "Onboarding: Visitenkarte" +msgstr "Start onboarding" + +#: workflows/models.py:219 +#, fuzzy +#| msgid "Onboarding" +msgid "Onboarding: HR Works" +msgstr "Onboarding" + +#: workflows/models.py:220 +#, fuzzy +#| msgid "Onboarding starten" +msgid "Onboarding: Schlüssel" +msgstr "Start onboarding" + +#: workflows/models.py:221 +msgid "Onboarding: Referenz Anfordernde Person" +msgstr "" + +#: workflows/models.py:222 +#, fuzzy +#| msgid "Welcome E-Mails" +msgid "Onboarding: Welcome E-Mail" +msgstr "Welcome Emails" + +#: workflows/models.py:223 +#, fuzzy +#| msgid "Offboarding" +msgid "Offboarding: IT" +msgstr "Offboarding" + +#: workflows/models.py:224 +#, fuzzy +#| msgid "Offboarding-Anfrage speichern" +msgid "Offboarding: Allgemeine Info" +msgstr "Save offboarding request" + +#: workflows/models.py:225 +#, fuzzy +#| msgid "Offboarding starten" +msgid "Offboarding: HR Works Deaktivierung" +msgstr "Start offboarding" + +#: workflows/models.py:226 +msgid "Offboarding: Referenz Anfordernde Person" +msgstr "" + +#: workflows/models.py:262 +msgid "Immer" +msgstr "" + +#: workflows/models.py:263 workflows/models.py:341 +msgid "Enthält" +msgstr "" + +#: workflows/models.py:264 workflows/models.py:342 +msgid "Ist gleich" +msgstr "" + +#: workflows/models.py:265 +msgid "Ist aktiv/Ja" +msgstr "" + +#: workflows/models.py:266 +#, fuzzy +#| msgid "inaktiv" +msgid "Ist inaktiv/Nein" +msgstr "inactive" + +#: workflows/models.py:308 +#: workflows/templates/workflows/welcome_emails.html:104 +msgid "Geplant" +msgstr "Scheduled" + +#: workflows/models.py:309 +#: workflows/templates/workflows/welcome_emails.html:106 +msgid "Pausiert" +msgstr "Paused" + +#: workflows/models.py:310 +#: workflows/templates/workflows/welcome_emails.html:108 +msgid "Abgebrochen" +msgstr "Cancelled" + +#: workflows/models.py:311 +#: workflows/templates/workflows/welcome_emails.html:110 +msgid "Gesendet" +msgstr "Sent" + +#: workflows/models.py:334 workflows/tasks.py:575 +msgid "Geräte und Arbeitsplatz" +msgstr "Devices and workplace" + +#: workflows/models.py:335 workflows/tasks.py:576 +msgid "Konten und Berechtigungen" +msgstr "Accounts and permissions" + +#: workflows/models.py:336 workflows/tasks.py:577 +msgid "Software und Tools" +msgstr "Software and tools" + +#: workflows/models.py:337 workflows/tasks.py:578 +msgid "Prozesse und Hinweise" +msgstr "Processes and notes" + +#: workflows/models.py:340 +msgid "Immer anzeigen" +msgstr "Always show" + +#: workflows/models.py:343 +msgid "Ist Ja / aktiv" +msgstr "Is yes / active" + +#: workflows/models.py:344 +msgid "Ist Nein / inaktiv" +msgstr "Is no / inactive" + +#: workflows/models.py:371 +msgid "Entwurf" +msgstr "Draft" + +#: workflows/tasks.py:591 +#, python-format +msgid "%(item)s übergeben und Grundfunktionen erklärt" +msgstr "%(item)s handed over and basic functions explained" + +#: workflows/tasks.py:593 +#, python-format +msgid "%(item)s gezeigt bzw. Nutzung erklärt" +msgstr "%(item)s shown or usage explained" + +#: workflows/tasks.py:595 +#, python-format +msgid "Telefonnummer / Direktwahl erklärt: %(value)s" +msgstr "Phone number / direct extension explained: %(value)s" + +#: workflows/tasks.py:597 +msgid "Arbeitsplatz, Geräte und allgemeine Nutzung besprochen" +msgstr "Workplace, devices, and general usage reviewed" + +#: workflows/tasks.py:599 +#, python-format +msgid "%(item)s Zugang erklärt" +msgstr "%(item)s access explained" + +#: workflows/tasks.py:600 +#, python-format +msgid "%(item)s Gruppe / Berechtigung erläutert" +msgstr "%(item)s group / permission explained" + +#: workflows/tasks.py:602 +#, python-format +msgid "Dienstliche E-Mail-Adresse erläutert: %(value)s" +msgstr "Work email address explained: %(value)s" + +#: workflows/tasks.py:604 +#, python-format +msgid "Gruppenpostfach erklärt: %(item)s" +msgstr "Group mailbox explained: %(item)s" + +#: workflows/tasks.py:606 +msgid "Zugänge, Konten und Anmeldelogik besprochen" +msgstr "Accesses, accounts, and login logic reviewed" + +#: workflows/tasks.py:608 +#, python-format +msgid "%(item)s Einführung durchgeführt" +msgstr "%(item)s introduction completed" + +#: workflows/tasks.py:609 +#, python-format +msgid "%(item)s zusätzlich besprochen" +msgstr "%(item)s discussed additionally" + +#: workflows/tasks.py:611 +msgid "Benötigte Standardsoftware und tägliche Nutzung erklärt" +msgstr "Required standard software and daily usage explained" + +#: workflows/tasks.py:614 +msgid "Passwortregeln und sicherer Umgang besprochen" +msgstr "Password rules and secure handling reviewed" + +#: workflows/tasks.py:615 +msgid "Dateiablage, Nextcloud und Freigaben erklärt" +msgstr "File storage, Nextcloud, and sharing explained" + +#: workflows/tasks.py:616 +msgid "Kommunikationswege und Support-Prozess erklärt" +msgstr "Communication channels and support process explained" + +#: workflows/tasks.py:619 +#, python-format +msgid "%(item)s als zusätzliche Ausstattung besprochen" +msgstr "%(item)s discussed as additional equipment" + +#: workflows/tasks.py:621 +#, python-format +msgid "Zusätzlicher Zugang besprochen: %(item)s" +msgstr "Additional access discussed: %(item)s" + +#: workflows/tasks.py:623 +#, python-format +msgid "Übergabe-/Nachfolgekontext besprochen: %(value)s" +msgstr "Handover / successor context reviewed: %(value)s" + #: workflows/templates/registration/login.html:4 #: workflows/templates/registration/login.html:19 msgid "Anmeldung" @@ -45,7 +357,7 @@ msgstr "Sign in" #: workflows/templates/workflows/audit_log.html:4 #: workflows/templates/workflows/audit_log.html:15 -#: workflows/templates/workflows/home.html:134 +#: workflows/templates/workflows/home.html:124 msgid "Audit Log" msgstr "" @@ -55,7 +367,7 @@ msgstr "" #: workflows/templates/workflows/audit_log.html:23 #: workflows/templates/workflows/audit_log.html:54 -#: workflows/templates/workflows/requests_dashboard.html:163 +#: workflows/templates/workflows/requests_dashboard.html:161 #: workflows/templates/workflows/welcome_emails.html:91 msgid "Aktion" msgstr "Action" @@ -97,7 +409,8 @@ msgid "Zeit" msgstr "" #: workflows/templates/workflows/audit_log.html:55 -#: workflows/templates/workflows/requests_dashboard.html:157 +#: workflows/templates/workflows/request_timeline.html:62 +#: workflows/templates/workflows/requests_dashboard.html:156 msgid "Typ" msgstr "Type" @@ -109,7 +422,25 @@ msgstr "" msgid "Details" msgstr "" -#: workflows/templates/workflows/audit_log.html:81 +#: workflows/templates/workflows/audit_log.html:78 +#, fuzzy +#| msgid "Vorgänge" +msgid "Betroffene Vorgänge" +msgstr "Requests" + +#: workflows/templates/workflows/audit_log.html:85 +msgid "Gelöscht" +msgstr "" + +#: workflows/templates/workflows/audit_log.html:86 +msgid "Ungültig" +msgstr "" + +#: workflows/templates/workflows/audit_log.html:87 +msgid "Ergebnis" +msgstr "" + +#: workflows/templates/workflows/audit_log.html:95 #, fuzzy #| msgid "Noch keine Vorgänge vorhanden." msgid "Noch keine Audit-Einträge vorhanden." @@ -117,7 +448,7 @@ msgstr "No requests available yet." #: workflows/templates/workflows/form_builder.html:4 #: workflows/templates/workflows/form_builder.html:14 -#: workflows/templates/workflows/home.html:119 +#: workflows/templates/workflows/home.html:134 msgid "Form Builder" msgstr "Form Builder" @@ -178,14 +509,14 @@ msgid "Label (EN)" msgstr "Label (EN)" #: workflows/templates/workflows/form_builder.html:95 -#: workflows/templates/workflows/integrations_setup.html:225 +#: workflows/templates/workflows/integrations_setup.html:258 #: workflows/templates/workflows/intro_builder.html:69 msgid "Aktiv" msgstr "Active" #: workflows/templates/workflows/form_builder.html:96 #: workflows/templates/workflows/form_builder.html:111 -#: workflows/templates/workflows/integrations_setup.html:227 +#: workflows/templates/workflows/integrations_setup.html:260 #: workflows/templates/workflows/intro_builder.html:70 #: workflows/templates/workflows/intro_builder.html:106 #: workflows/templates/workflows/requests_dashboard.html:247 @@ -251,7 +582,7 @@ msgstr "Save field text" #: workflows/templates/workflows/handbook.html:4 #: workflows/templates/workflows/handbook.html:15 -#: workflows/templates/workflows/home.html:129 +#: workflows/templates/workflows/home.html:144 msgid "Handbook" msgstr "Handbook" @@ -412,10 +743,12 @@ msgid "Nextcloud:" msgstr "Nextcloud:" #: workflows/templates/workflows/home.html:40 +#: workflows/templates/workflows/integrations_setup.html:63 msgid "aktiv" msgstr "active" #: workflows/templates/workflows/home.html:40 +#: workflows/templates/workflows/integrations_setup.html:63 msgid "inaktiv" msgstr "inactive" @@ -426,10 +759,12 @@ msgid "E-Mail:" msgstr "Email:" #: workflows/templates/workflows/home.html:43 +#: workflows/templates/workflows/integrations_setup.html:121 msgid "Testmodus" msgstr "Test mode" #: workflows/templates/workflows/home.html:43 +#: workflows/templates/workflows/integrations_setup.html:121 msgid "Produktion" msgstr "Production" @@ -445,12 +780,6 @@ msgstr "Apps" msgid "Wählen Sie den gewünschten Prozess." msgstr "Choose the desired process." -#: workflows/templates/workflows/home.html:66 -#: workflows/templates/workflows/onboarding_form.html:25 -#: workflows/templates/workflows/requests_dashboard.html:68 -msgid "Onboarding" -msgstr "Onboarding" - #: workflows/templates/workflows/home.html:67 msgid "" "Neue Mitarbeitende erfassen, PDF mit Briefkopf erstellen, Benachrichtigungen " @@ -471,11 +800,6 @@ msgstr "Email routing" msgid "Onboarding starten" msgstr "Start onboarding" -#: workflows/templates/workflows/home.html:82 -#: workflows/templates/workflows/requests_dashboard.html:78 -msgid "Offboarding" -msgstr "Offboarding" - #: workflows/templates/workflows/home.html:83 msgid "" "Mitarbeitende suchen, Daten vorbefüllen, Offboarding-Dokumente erzeugen und " @@ -520,6 +844,7 @@ msgstr "Search" #: workflows/templates/workflows/home.html:102 #: workflows/templates/workflows/onboarding_intro_session.html:41 +#: workflows/templates/workflows/request_timeline.html:70 #: workflows/templates/workflows/welcome_emails.html:89 msgid "Status" msgstr "Status" @@ -540,9 +865,13 @@ msgstr "Admin Apps" msgid "Konfiguration, Tests und Steuerung." msgstr "Configuration, tests, and controls." +#: workflows/templates/workflows/home.html:119 +msgid "Integrationen" +msgstr "Integrations" + #: workflows/templates/workflows/home.html:120 -msgid "Felder, Schritte und Optionen verwalten." -msgstr "Manage fields, steps, and options." +msgid "Nextcloud- und E-Mail-Setup." +msgstr "Nextcloud and email setup." #: workflows/templates/workflows/home.html:121 #: workflows/templates/workflows/home.html:126 @@ -554,41 +883,37 @@ msgstr "Manage fields, steps, and options." msgid "Öffnen" msgstr "Open" -#: workflows/templates/workflows/home.html:124 +#: workflows/templates/workflows/home.html:125 +msgid "Wichtige Admin-Aktionen nachvollziehen und prüfen." +msgstr "" + +#: workflows/templates/workflows/home.html:129 +#: workflows/templates/workflows/welcome_emails.html:4 +msgid "Welcome E-Mails" +msgstr "Welcome Emails" + +#: workflows/templates/workflows/home.html:130 +msgid "Geplante Welcome Mails verwalten." +msgstr "Manage scheduled welcome emails." + +#: workflows/templates/workflows/home.html:135 +msgid "Felder, Schritte und Optionen verwalten." +msgstr "Manage fields, steps, and options." + +#: workflows/templates/workflows/home.html:139 #: workflows/templates/workflows/intro_builder.html:4 #: workflows/templates/workflows/intro_builder.html:17 msgid "Einweisungs-Builder" msgstr "Introduction Builder" -#: workflows/templates/workflows/home.html:125 +#: workflows/templates/workflows/home.html:140 msgid "Checklistenpunkte für das Einweisungsprotokoll konfigurieren." msgstr "Configure checklist items for the introduction protocol." -#: workflows/templates/workflows/home.html:130 +#: workflows/templates/workflows/home.html:145 msgid "Project wiki and developer documentation in one place." msgstr "Project wiki and developer documentation in one place." -#: workflows/templates/workflows/home.html:135 -msgid "Wichtige Admin-Aktionen nachvollziehen und prüfen." -msgstr "" - -#: workflows/templates/workflows/home.html:139 -msgid "Integrationen" -msgstr "Integrations" - -#: workflows/templates/workflows/home.html:140 -msgid "Nextcloud- und E-Mail-Setup." -msgstr "Nextcloud and email setup." - -#: workflows/templates/workflows/home.html:144 -#: workflows/templates/workflows/welcome_emails.html:4 -msgid "Welcome E-Mails" -msgstr "Welcome Emails" - -#: workflows/templates/workflows/home.html:145 -msgid "Geplante Welcome Mails verwalten." -msgstr "Manage scheduled welcome emails." - #: workflows/templates/workflows/home.html:149 msgid "Django Admin" msgstr "Django Admin" @@ -597,7 +922,7 @@ msgstr "Django Admin" msgid "Vollständige Datenverwaltung." msgstr "Full data management." -#: workflows/templates/workflows/home.html:196 +#: workflows/templates/workflows/home.html:157 msgid "Tipp: Die letzten Vorgänge sehen Sie jederzeit im Anfragen Dashboard." msgstr "Tip: You can always see the latest requests in the Requests Dashboard." @@ -610,6 +935,7 @@ msgstr "Back to home" #: workflows/templates/workflows/includes/app_header.html:17 #: workflows/templates/workflows/offboarding_success.html:30 #: workflows/templates/workflows/onboarding_success.html:29 +#: workflows/templates/workflows/request_timeline.html:55 msgid "Zum Dashboard" msgstr "Go to dashboard" @@ -635,142 +961,212 @@ msgstr "Setup Mail" msgid "E-Mail Routing & Vorlagen" msgstr "Email routing & templates" -#: workflows/templates/workflows/integrations_setup.html:55 +#: workflows/templates/workflows/integrations_setup.html:21 +msgid "Workflow-Regeln" +msgstr "" + +#: workflows/templates/workflows/integrations_setup.html:57 msgid "Nextcloud speichern" msgstr "Save Nextcloud" -#: workflows/templates/workflows/integrations_setup.html:57 -#: workflows/templates/workflows/integrations_setup.html:97 +#: workflows/templates/workflows/integrations_setup.html:58 +#, fuzzy +#| msgid "Nextcloud-Test" +msgid "Nextcloud-Test starten" +msgstr "Nextcloud test" + +#: workflows/templates/workflows/integrations_setup.html:62 +#: workflows/templates/workflows/integrations_setup.html:120 +#: workflows/templates/workflows/requests_dashboard.html:230 +msgid "Status:" +msgstr "Status:" + +#: workflows/templates/workflows/integrations_setup.html:65 +#, fuzzy +#| msgid "Nextcloud speichern" +msgid "Nextcloud schalten" +msgstr "Save Nextcloud" + +#: workflows/templates/workflows/integrations_setup.html:71 +msgid "" +"Schaltet den produktiven Nextcloud-Upload sofort für alle nachfolgenden " +"Vorgänge ein oder aus." +msgstr "" + +#: workflows/templates/workflows/integrations_setup.html:72 +#: workflows/templates/workflows/integrations_setup.html:130 msgid "Leeres Passwortfeld lässt das bestehende Passwort unverändert." msgstr "Leaving the password field empty keeps the current password unchanged." -#: workflows/templates/workflows/integrations_setup.html:91 +#: workflows/templates/workflows/integrations_setup.html:106 +#, fuzzy +#| msgid "Absenderadresse (optional)" +msgid "Absenderadresse" +msgstr "Sender address (optional)" + +#: workflows/templates/workflows/integrations_setup.html:111 msgid "SMTP SSL" msgstr "SMTP SSL" -#: workflows/templates/workflows/integrations_setup.html:92 +#: workflows/templates/workflows/integrations_setup.html:112 msgid "SMTP TLS" msgstr "SMTP TLS" -#: workflows/templates/workflows/integrations_setup.html:95 +#: workflows/templates/workflows/integrations_setup.html:115 msgid "Mail speichern" msgstr "Save mail settings" -#: workflows/templates/workflows/integrations_setup.html:106 +#: workflows/templates/workflows/integrations_setup.html:116 +#, fuzzy +#| msgid "SMTP-Test" +msgid "SMTP-Test starten" +msgstr "SMTP test" + +#: workflows/templates/workflows/integrations_setup.html:123 +#, fuzzy +#| msgid "E-Mail Modus" +msgid "E-Mail Modus schalten" +msgstr "Email mode" + +#: workflows/templates/workflows/integrations_setup.html:129 +msgid "" +"Im Testmodus werden Systemmails umgeleitet. In Produktion werden sie an die " +"echten Empfänger gesendet." +msgstr "" + +#: workflows/templates/workflows/integrations_setup.html:139 msgid "It onboarding email" msgstr "IT onboarding email" -#: workflows/templates/workflows/integrations_setup.html:110 +#: workflows/templates/workflows/integrations_setup.html:143 msgid "General info email" msgstr "General info email" -#: workflows/templates/workflows/integrations_setup.html:114 +#: workflows/templates/workflows/integrations_setup.html:147 msgid "Business card email" msgstr "Business card email" -#: workflows/templates/workflows/integrations_setup.html:118 +#: workflows/templates/workflows/integrations_setup.html:151 msgid "Hr works email" msgstr "HR Works email" -#: workflows/templates/workflows/integrations_setup.html:122 +#: workflows/templates/workflows/integrations_setup.html:155 msgid "Key notification email" msgstr "Key notification email" -#: workflows/templates/workflows/integrations_setup.html:126 +#: workflows/templates/workflows/integrations_setup.html:159 msgid "Diese Empfänger werden für condition-based E-Mail Routing genutzt." msgstr "These recipients are used for condition-based email routing." -#: workflows/templates/workflows/integrations_setup.html:153 +#: workflows/templates/workflows/integrations_setup.html:186 msgid "E-Mail Routing & Vorlagen speichern" msgstr "Save email routing & templates" -#: workflows/templates/workflows/integrations_setup.html:159 +#: workflows/templates/workflows/integrations_setup.html:192 msgid "Bedingungsregeln für zusätzliche E-Mails" msgstr "Conditional rules for additional emails" -#: workflows/templates/workflows/integrations_setup.html:160 +#: workflows/templates/workflows/integrations_setup.html:193 msgid "Zusätzliche Regeln laufen nach dem Standard-Routing." msgstr "Additional rules run after the standard routing flow." -#: workflows/templates/workflows/integrations_setup.html:167 -#: workflows/templates/workflows/integrations_setup.html:238 +#: workflows/templates/workflows/integrations_setup.html:200 +#: workflows/templates/workflows/integrations_setup.html:271 msgid "Regelname" msgstr "Rule name" -#: workflows/templates/workflows/integrations_setup.html:171 -#: workflows/templates/workflows/integrations_setup.html:242 +#: workflows/templates/workflows/integrations_setup.html:204 +#: workflows/templates/workflows/integrations_setup.html:275 msgid "Event" msgstr "Event" -#: workflows/templates/workflows/integrations_setup.html:179 -#: workflows/templates/workflows/integrations_setup.html:250 +#: workflows/templates/workflows/integrations_setup.html:212 +#: workflows/templates/workflows/integrations_setup.html:283 msgid "Feldname" msgstr "Field name" -#: workflows/templates/workflows/integrations_setup.html:183 -#: workflows/templates/workflows/integrations_setup.html:254 +#: workflows/templates/workflows/integrations_setup.html:216 +#: workflows/templates/workflows/integrations_setup.html:287 #: workflows/templates/workflows/intro_builder.html:67 msgid "Operator" msgstr "Operator" -#: workflows/templates/workflows/integrations_setup.html:191 -#: workflows/templates/workflows/integrations_setup.html:262 +#: workflows/templates/workflows/integrations_setup.html:224 +#: workflows/templates/workflows/integrations_setup.html:295 msgid "Vergleichswert" msgstr "Comparison value" -#: workflows/templates/workflows/integrations_setup.html:195 -#: workflows/templates/workflows/integrations_setup.html:266 +#: workflows/templates/workflows/integrations_setup.html:228 +#: workflows/templates/workflows/integrations_setup.html:299 #: workflows/templates/workflows/welcome_emails.html:87 msgid "Empfänger" msgstr "Recipients" -#: workflows/templates/workflows/integrations_setup.html:199 -#: workflows/templates/workflows/integrations_setup.html:270 +#: workflows/templates/workflows/integrations_setup.html:232 +#: workflows/templates/workflows/integrations_setup.html:303 msgid "Template Key (optional)" msgstr "Template key (optional)" -#: workflows/templates/workflows/integrations_setup.html:201 -#: workflows/templates/workflows/integrations_setup.html:272 +#: workflows/templates/workflows/integrations_setup.html:234 +#: workflows/templates/workflows/integrations_setup.html:305 msgid "-- Custom Betreff/Body verwenden --" msgstr "-- Use custom subject/body --" -#: workflows/templates/workflows/integrations_setup.html:208 -#: workflows/templates/workflows/integrations_setup.html:279 +#: workflows/templates/workflows/integrations_setup.html:241 +#: workflows/templates/workflows/integrations_setup.html:312 msgid "Custom Subject (optional)" msgstr "Custom subject (optional)" -#: workflows/templates/workflows/integrations_setup.html:212 -#: workflows/templates/workflows/integrations_setup.html:283 +#: workflows/templates/workflows/integrations_setup.html:245 +#: workflows/templates/workflows/integrations_setup.html:316 msgid "Custom Body (optional)" msgstr "Custom body (optional)" -#: workflows/templates/workflows/integrations_setup.html:216 -#: workflows/templates/workflows/integrations_setup.html:287 +#: workflows/templates/workflows/integrations_setup.html:249 +#: workflows/templates/workflows/integrations_setup.html:320 msgid "Custom Subject (EN, optional)" msgstr "Custom subject (EN, optional)" -#: workflows/templates/workflows/integrations_setup.html:220 -#: workflows/templates/workflows/integrations_setup.html:291 +#: workflows/templates/workflows/integrations_setup.html:253 +#: workflows/templates/workflows/integrations_setup.html:324 msgid "Custom Body (EN, optional)" msgstr "Custom body (EN, optional)" -#: workflows/templates/workflows/integrations_setup.html:226 -#: workflows/templates/workflows/integrations_setup.html:296 +#: workflows/templates/workflows/integrations_setup.html:259 +#: workflows/templates/workflows/integrations_setup.html:329 msgid "PDF anhängen" msgstr "Attach PDF" -#: workflows/templates/workflows/integrations_setup.html:231 +#: workflows/templates/workflows/integrations_setup.html:264 msgid "Noch keine zusätzlichen Regeln vorhanden." msgstr "No additional rules configured yet." -#: workflows/templates/workflows/integrations_setup.html:235 +#: workflows/templates/workflows/integrations_setup.html:268 msgid "Neue Regel hinzufügen" msgstr "Add new rule" -#: workflows/templates/workflows/integrations_setup.html:301 +#: workflows/templates/workflows/integrations_setup.html:334 msgid "Regeln speichern" msgstr "Save rules" +#: workflows/templates/workflows/integrations_setup.html:344 +#, fuzzy +#| msgid "Hardware-Übergabetermin" +msgid "Vorlauf Hardware-Übergabe (Tage)" +msgstr "Hardware handover date" + +#: workflows/templates/workflows/integrations_setup.html:356 +#, fuzzy +#| msgid "Regeln speichern" +msgid "Workflow-Regeln speichern" +msgstr "Save rules" + +#: workflows/templates/workflows/integrations_setup.html:358 +msgid "" +"Steuert den Mindestvorlauf für das gewünschte Übergabedatum der Geräte im " +"Onboarding-Formular." +msgstr "" + #: workflows/templates/workflows/intro_builder.html:18 msgid "Checklistenpunkte für das Einweisungs- und Übergabeprotokoll verwalten." msgstr "Manage checklist items for the introduction and handover protocol." @@ -918,7 +1314,8 @@ msgstr "" #: workflows/templates/workflows/offboarding_success.html:23 #: workflows/templates/workflows/onboarding_success.html:22 -#: workflows/templates/workflows/requests_dashboard.html:188 +#: workflows/templates/workflows/request_timeline.html:104 +#: workflows/templates/workflows/requests_dashboard.html:185 msgid "PDF öffnen" msgstr "Open PDF" @@ -1017,13 +1414,10 @@ msgid "Mitarbeitende Person" msgstr "Employee" #: workflows/templates/workflows/onboarding_intro_session.html:31 +#: workflows/templates/workflows/request_timeline.html:66 msgid "Name" msgstr "Name" -#: workflows/templates/workflows/onboarding_intro_session.html:32 -msgid "Abteilung" -msgstr "Department" - #: workflows/templates/workflows/onboarding_intro_session.html:33 msgid "Berufsbezeichnung" msgstr "Job title" @@ -1033,6 +1427,7 @@ msgid "Dienstliche E-Mail" msgstr "Work email" #: workflows/templates/workflows/onboarding_intro_session.html:35 +#: workflows/views.py:413 msgid "Vertragsbeginn" msgstr "Contract start" @@ -1089,7 +1484,7 @@ msgid "Alles zurücksetzen" msgstr "Reset all" #: workflows/templates/workflows/onboarding_intro_session.html:90 -#: workflows/templates/workflows/requests_dashboard.html:204 +#: workflows/templates/workflows/requests_dashboard.html:203 msgid "Live-Protokoll" msgstr "Live protocol" @@ -1104,7 +1499,7 @@ msgid "Live-Protokoll erzeugen" msgstr "Generate live protocol" #: workflows/templates/workflows/onboarding_intro_session.html:98 -#: workflows/templates/workflows/requests_dashboard.html:208 +#: workflows/templates/workflows/requests_dashboard.html:207 msgid "Live-Protokoll öffnen" msgstr "Open live protocol" @@ -1285,6 +1680,26 @@ msgid "" "and then the English value." msgstr "" +#: workflows/templates/workflows/request_timeline.html:4 +#: workflows/templates/workflows/request_timeline.html:51 +msgid "Request Timeline" +msgstr "" + +#: workflows/templates/workflows/request_timeline.html:74 +#: workflows/templates/workflows/requests_dashboard.html:158 +msgid "E-Mail" +msgstr "Email" + +#: workflows/templates/workflows/request_timeline.html:78 +msgid "Hardware-Übergabetermin" +msgstr "Hardware handover date" + +#: workflows/templates/workflows/request_timeline.html:130 +#, fuzzy +#| msgid "Noch keine Vorgänge vorhanden." +msgid "Noch keine Timeline-Einträge vorhanden." +msgstr "No requests available yet." + #: workflows/templates/workflows/requests_dashboard.html:34 msgid "" "Steuert Onboarding- und Offboarding-Prozesse an einem Ort. Die Oberfläche " @@ -1364,75 +1779,60 @@ msgstr "%(count)s entries visible" msgid "Nach Name oder E-Mail suchen" msgstr "Search by name or email" -#: workflows/templates/workflows/requests_dashboard.html:137 -msgid "" -"Datensätze können direkt in der Tabelle gefiltert, geöffnet, geprüft oder " -"gelöscht werden." -msgstr "" -"Records can be filtered, opened, checked, or deleted directly in the table." - -#: workflows/templates/workflows/requests_dashboard.html:144 +#: workflows/templates/workflows/requests_dashboard.html:143 #: workflows/templates/workflows/welcome_emails.html:78 msgid "ausgewählt" msgstr "selected" -#: workflows/templates/workflows/requests_dashboard.html:145 +#: workflows/templates/workflows/requests_dashboard.html:144 msgid "Auswahl löschen" msgstr "Delete selection" -#: workflows/templates/workflows/requests_dashboard.html:158 +#: workflows/templates/workflows/requests_dashboard.html:157 msgid "Person" msgstr "Person" #: workflows/templates/workflows/requests_dashboard.html:159 -msgid "E-Mail" -msgstr "Email" - -#: workflows/templates/workflows/requests_dashboard.html:160 -msgid "Erstellt" -msgstr "Created" - -#: workflows/templates/workflows/requests_dashboard.html:161 msgid "Dokument" msgstr "Document" -#: workflows/templates/workflows/requests_dashboard.html:162 -#: workflows/templates/workflows/requests_dashboard.html:201 +#: workflows/templates/workflows/requests_dashboard.html:160 +#: workflows/templates/workflows/requests_dashboard.html:200 msgid "Einweisung" msgstr "Introduction" -#: workflows/templates/workflows/requests_dashboard.html:190 +#: workflows/templates/workflows/requests_dashboard.html:187 msgid "Noch nicht verfügbar" msgstr "Not available yet" -#: workflows/templates/workflows/requests_dashboard.html:206 +#: workflows/templates/workflows/requests_dashboard.html:205 msgid "Einweisung öffnen" msgstr "Open introduction" -#: workflows/templates/workflows/requests_dashboard.html:213 +#: workflows/templates/workflows/requests_dashboard.html:212 msgid "Standard-Einweisungs-PDF" msgstr "Standard introduction PDF" -#: workflows/templates/workflows/requests_dashboard.html:218 +#: workflows/templates/workflows/requests_dashboard.html:217 msgid "Neu erzeugen" msgstr "Regenerate" -#: workflows/templates/workflows/requests_dashboard.html:220 +#: workflows/templates/workflows/requests_dashboard.html:219 msgid "Standard-PDF öffnen" msgstr "Open standard PDF" -#: workflows/templates/workflows/requests_dashboard.html:224 +#: workflows/templates/workflows/requests_dashboard.html:223 msgid "PDF erzeugen" msgstr "Generate PDF" -#: workflows/templates/workflows/requests_dashboard.html:231 -msgid "Status:" -msgstr "Status:" - -#: workflows/templates/workflows/requests_dashboard.html:235 +#: workflows/templates/workflows/requests_dashboard.html:234 msgid "Nicht relevant" msgstr "Not relevant" +#: workflows/templates/workflows/requests_dashboard.html:238 +msgid "Timeline" +msgstr "" + #: workflows/templates/workflows/requests_dashboard.html:242 msgid "Erneut versuchen" msgstr "" @@ -1519,22 +1919,6 @@ msgstr "Scheduled for" msgid "Gesendet am" msgstr "Sent at" -#: workflows/templates/workflows/welcome_emails.html:104 -msgid "Geplant" -msgstr "Scheduled" - -#: workflows/templates/workflows/welcome_emails.html:106 -msgid "Pausiert" -msgstr "Paused" - -#: workflows/templates/workflows/welcome_emails.html:108 -msgid "Abgebrochen" -msgstr "Cancelled" - -#: workflows/templates/workflows/welcome_emails.html:110 -msgid "Gesendet" -msgstr "Sent" - #: workflows/templates/workflows/welcome_emails.html:132 msgid "Fortsetzen" msgstr "Resume" @@ -1547,80 +1931,327 @@ msgstr "Cancel" msgid "Keine geplanten Welcome E-Mails vorhanden." msgstr "No scheduled welcome emails available." -#: workflows/views.py:76 -msgid "Stammdaten" -msgstr "Master data" - -#: workflows/views.py:76 +#: workflows/views.py:86 msgid "Person, Rolle, Abteilung" msgstr "Person, role, department" -#: workflows/views.py:77 -msgid "Vertrag" -msgstr "Contract" - -#: workflows/views.py:77 +#: workflows/views.py:87 msgid "Beschäftigung und Termine" msgstr "Employment and dates" -#: workflows/views.py:78 -msgid "IT-Setup" -msgstr "IT setup" - -#: workflows/views.py:78 +#: workflows/views.py:88 msgid "Geräte, Software und Zugänge" msgstr "Devices, software, and access" -#: workflows/views.py:79 -msgid "Abschluss" -msgstr "Finish" - -#: workflows/views.py:79 +#: workflows/views.py:89 msgid "Notizen und Freigabe" msgstr "Notes and approval" -#: workflows/views.py:308 +#: workflows/views.py:190 +#, fuzzy +#| msgid "Vorgänge" +msgid "Vorgänge gelöscht" +msgstr "Requests" + +#: workflows/views.py:191 +msgid "Vorgang gelöscht" +msgstr "" + +#: workflows/views.py:192 +msgid "Vorgang erneut angestoßen" +msgstr "" + +#: workflows/views.py:193 +#, fuzzy +#| msgid "Einweisung" +msgid "Einweisungs-PDF erzeugt" +msgstr "Introduction" + +#: workflows/views.py:194 +#, fuzzy +#| msgid "Live-Protokoll erzeugen" +msgid "Live-Protokoll erzeugt" +msgstr "Generate live protocol" + +#: workflows/views.py:195 +#, fuzzy +#| msgid "Einweisung wurde zurückgesetzt." +msgid "Einweisung zurückgesetzt" +msgstr "Introduction was reset." + +#: workflows/views.py:196 +#, fuzzy +#| msgid "Einweisung wurde als Entwurf gespeichert." +msgid "Einweisung als Entwurf gespeichert" +msgstr "Introduction was saved as draft." + +#: workflows/views.py:197 +#, fuzzy +#| msgid "Einweisung wurde als abgeschlossen gespeichert." +msgid "Einweisung abgeschlossen" +msgstr "Introduction was saved as completed." + +#: workflows/views.py:198 +msgid "Formularoption gelöscht" +msgstr "" + +#: workflows/views.py:199 +#, fuzzy +#| msgid "Optionen speichern" +msgid "Formularoptionen gespeichert" +msgstr "Save options" + +#: workflows/views.py:200 +#, fuzzy +#| msgid "Feldtexte speichern" +msgid "Feldtexte gespeichert" +msgstr "Save field text" + +#: workflows/views.py:201 +#, fuzzy +#| msgid "Offboarding-Anfrage speichern" +msgid "Formularlayout gespeichert" +msgstr "Save offboarding request" + +#: workflows/views.py:202 +msgid "Einweisungs-Checkpunkt gelöscht" +msgstr "" + +#: workflows/views.py:203 +msgid "Einweisungs-Checkpunkt hinzugefügt" +msgstr "" + +#: workflows/views.py:204 +#, fuzzy +#| msgid "Checkliste speichern" +msgid "Einweisungs-Checkliste gespeichert" +msgstr "Save checklist" + +#: workflows/views.py:205 +#, fuzzy +#| msgid "Welcome E-Mails" +msgid "Welcome E-Mail sofort ausgelöst" +msgstr "Welcome Emails" + +#: workflows/views.py:206 +#, fuzzy +#| msgid "Welcome-Einstellungen speichern" +msgid "Welcome E-Mail Einstellungen gespeichert" +msgstr "Save welcome settings" + +#: workflows/views.py:207 +msgid "Welcome E-Mail Sammelaktion ausgeführt" +msgstr "" + +#: workflows/views.py:208 +#, fuzzy +#| msgid "Welcome E-Mails" +msgid "Welcome E-Mail pausiert" +msgstr "Welcome Emails" + +#: workflows/views.py:209 +#, fuzzy +#| msgid "Welcome E-Mails" +msgid "Welcome E-Mail fortgesetzt" +msgstr "Welcome Emails" + +#: workflows/views.py:210 +#, fuzzy +#| msgid "Welcome E-Mails" +msgid "Welcome E-Mail abgebrochen" +msgstr "Welcome Emails" + +#: workflows/views.py:211 +#, fuzzy +#| msgid "SMTP-Test" +msgid "SMTP-Test gesendet" +msgstr "SMTP test" + +#: workflows/views.py:212 +#, fuzzy +#| msgid "Nextcloud-Test" +msgid "Nextcloud-Testupload ausgeführt" +msgstr "Nextcloud test" + +#: workflows/views.py:213 +#, fuzzy +#| msgid "Nextcloud schalten" +msgid "Nextcloud-Modus umgeschaltet" +msgstr "Toggle Nextcloud" + +#: workflows/views.py:214 +msgid "E-Mail-Modus umgeschaltet" +msgstr "" + +#: workflows/views.py:215 +#, fuzzy +#| msgid "Integrationen Setup" +msgid "Integrationen gespeichert" +msgstr "Integrations Setup" + +#: workflows/views.py:216 +#, fuzzy +#| msgid "Welcome-Einstellungen speichern" +msgid "Nextcloud-Einstellungen gespeichert" +msgstr "Save welcome settings" + +#: workflows/views.py:217 +#, fuzzy +#| msgid "Welcome-Einstellungen speichern" +msgid "Mail-Einstellungen gespeichert" +msgstr "Save welcome settings" + +#: workflows/views.py:218 +#, fuzzy +#| msgid "E-Mail Routing & Vorlagen speichern" +msgid "E-Mail-Routing gespeichert" +msgstr "Save email routing & templates" + +#: workflows/views.py:219 +#, fuzzy +#| msgid "Offboarding-Anfrage speichern" +msgid "Benachrichtigungsregeln gespeichert" +msgstr "Save offboarding request" + +#: workflows/views.py:401 +#, fuzzy +#| msgid "Anfrage gespeichert" +msgid "Anfrage erstellt" +msgstr "Request saved" + +#: workflows/views.py:403 +#, fuzzy, python-format +#| msgid "Sitzungsstatus" +msgid "Status: %(status)s" +msgstr "Session status" + +#: workflows/views.py:415 +#, fuzzy +#| msgid "Geplant für" +msgid "Geplanter Start" +msgstr "Scheduled for" + +#: workflows/views.py:425 +msgid "Geräteübergabe / Hardware-Abholung" +msgstr "" + +#: workflows/views.py:427 +msgid "Geplanter Hardware-Termin" +msgstr "" + +#: workflows/views.py:436 +#, fuzzy +#| msgid "Noch nicht verfügbar" +msgid "PDF verfügbar" +msgstr "Not available yet" + +#: workflows/views.py:462 +#, fuzzy +#| msgid "Einweisung" +msgid "Einweisungssitzung" +msgstr "Introduction" + +#: workflows/views.py:474 +#, fuzzy +#| msgid "Welcome E-Mails" +msgid "Welcome E-Mail" +msgstr "Welcome Emails" + +#: workflows/views.py:500 msgid "Sie haben keine Berechtigung für diese Aktion." msgstr "You do not have permission for this action." -#: workflows/views.py:317 +#: workflows/views.py:509 msgid "Keine Einträge ausgewählt." msgstr "No entries selected." -#: workflows/views.py:353 +#: workflows/views.py:552 #, python-format msgid "%(count)s Eintrag/Einträge gelöscht." msgstr "%(count)s entry/entries deleted." -#: workflows/views.py:355 +#: workflows/views.py:554 #, python-format msgid "%(count)s Auswahl(en) konnten nicht verarbeitet werden." msgstr "%(count)s selection(s) could not be processed." -#: workflows/views.py:357 +#: workflows/views.py:556 msgid "Keine passenden Einträge gefunden." msgstr "No matching entries found." -#: workflows/views.py:521 +#: workflows/views.py:726 msgid "Einweisungs- und Übergabeprotokoll wurde erzeugt." msgstr "Introduction and handover protocol was generated." -#: workflows/views.py:539 +#: workflows/views.py:744 msgid "Einweisungsprotokoll aus Live-Status wurde erzeugt." msgstr "Introduction protocol from live status was generated." -#: workflows/views.py:569 +#: workflows/views.py:774 msgid "Einweisung wurde zurückgesetzt." msgstr "Introduction was reset." -#: workflows/views.py:583 +#: workflows/views.py:788 msgid "Einweisung wurde als abgeschlossen gespeichert." msgstr "Introduction was saved as completed." -#: workflows/views.py:596 +#: workflows/views.py:801 msgid "Einweisung wurde als Entwurf gespeichert." msgstr "Introduction was saved as draft." +#, fuzzy +#~| msgid "Nextcloud speichern" +#~ msgid "Nextcloud deaktivieren" +#~ msgstr "Save Nextcloud" + +#, fuzzy +#~| msgid "Nextcloud schalten" +#~ msgid "Nextcloud aktivieren" +#~ msgstr "Toggle Nextcloud" + +#~ msgid "Aktiv/Inaktiv direkt umschalten." +#~ msgstr "Switch active/inactive directly." + +#~ msgid "Deaktivieren" +#~ msgstr "Disable" + +#~ msgid "Aktivieren" +#~ msgstr "Enable" + +#~ msgid "Zwischen Testmodus und Produktion wechseln." +#~ msgstr "Switch between test mode and production." + +#~ msgid "Auf" +#~ msgstr "To" + +#~ msgid "SMTP Einstellungen" +#~ msgstr "SMTP Settings" + +#~ msgid "Server und Absender in der Backend-UI." +#~ msgstr "Server and sender in the backend UI." + +#~ msgid "Verbindungstests" +#~ msgstr "Connection tests" + +#~ msgid "Nextcloud-Test" +#~ msgstr "Nextcloud test" + +#~ msgid "SMTP-Test" +#~ msgstr "SMTP test" + +#~ msgid "Testupload und Testmail auslösen." +#~ msgstr "Trigger test upload and test email." + +#~ msgid "Erstellt" +#~ msgstr "Created" + +#~ msgid "" +#~ "Datensätze können direkt in der Tabelle gefiltert, geöffnet, geprüft oder " +#~ "gelöscht werden." +#~ msgstr "" +#~ "Records can be filtered, opened, checked, or deleted directly in the " +#~ "table." + #~ msgid "Back to Home" #~ msgstr "Back to home" diff --git a/backend/workflows/forms.py b/backend/workflows/forms.py index 9752b8a..2cea892 100644 --- a/backend/workflows/forms.py +++ b/backend/workflows/forms.py @@ -1,9 +1,11 @@ from django import forms from pathlib import Path -from django.utils.translation import get_language +from datetime import timedelta +from django.utils import timezone +from django.utils.translation import get_language, gettext as _ from .form_builder import apply_form_field_config -from .models import EmployeeProfile, FormOption, OffboardingRequest, OnboardingRequest +from .models import EmployeeProfile, FormOption, OffboardingRequest, OnboardingRequest, WorkflowConfig YES_NO_CHOICES = [('', '--'), ('ja', 'Ja'), ('nein', 'Nein')] @@ -222,6 +224,11 @@ class OnboardingRequestForm(forms.ModelForm): self.requester_email = (kwargs.pop('requester_email', '') or '').strip().lower() super().__init__(*args, **kwargs) + config = WorkflowConfig.objects.order_by('id').first() + self.handover_lead_days = max(0, int(getattr(config, 'device_handover_lead_days', 5) or 5)) + minimum_handover_date = timezone.localdate() + timedelta(days=self.handover_lead_days) + self.fields['handover_date'].widget.attrs['min'] = minimum_handover_date.isoformat() + self.fields['full_name'].label = 'Name' full_name_initial = (self.initial.get('full_name') or '').strip() if full_name_initial and not self.initial.get('first_name') and not self.initial.get('last_name'): @@ -322,6 +329,18 @@ class OnboardingRequestForm(forms.ModelForm): if has('successor_name') and cleaned.get('successor_required_choice') == 'ja' and not cleaned.get('successor_name'): self.add_error('successor_name', 'Bitte Name der Vorgängerperson eintragen.') + handover_date = cleaned.get('handover_date') + if has('handover_date') and handover_date: + minimum_date = timezone.localdate() + timedelta(days=getattr(self, 'handover_lead_days', 5)) + if handover_date < minimum_date: + self.add_error( + 'handover_date', + _('Das Übergabedatum muss mindestens %(days)s Tage in der Zukunft liegen (frühestens %(date)s).') % { + 'days': getattr(self, 'handover_lead_days', 5), + 'date': minimum_date.strftime('%Y-%m-%d'), + }, + ) + return cleaned def save(self, commit=True): diff --git a/backend/workflows/migrations/0034_workflowconfig_device_handover_lead_days.py b/backend/workflows/migrations/0034_workflowconfig_device_handover_lead_days.py new file mode 100644 index 0000000..dadbe4d --- /dev/null +++ b/backend/workflows/migrations/0034_workflowconfig_device_handover_lead_days.py @@ -0,0 +1,18 @@ +# Generated by Django 5.1.5 on 2026-03-25 22:21 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('workflows', '0033_offboardingrequest_last_error_and_more'), + ] + + operations = [ + migrations.AddField( + model_name='workflowconfig', + name='device_handover_lead_days', + field=models.PositiveIntegerField(default=5, verbose_name='Vorlauf Geräteübergabe (Tage)'), + ), + ] diff --git a/backend/workflows/models.py b/backend/workflows/models.py index 2d01754..b68b1f1 100644 --- a/backend/workflows/models.py +++ b/backend/workflows/models.py @@ -62,7 +62,7 @@ class OnboardingRequest(models.Model): gender = models.CharField( max_length=20, blank=True, - choices=[('herr', 'Herr'), ('frau', 'Frau'), ('divers', 'Divers')], + choices=[('herr', _('Herr')), ('frau', _('Frau')), ('divers', _('Divers'))], verbose_name='Anrede', ) job_title = models.CharField(max_length=255, blank=True, verbose_name='Berufsbezeichnung') @@ -72,7 +72,7 @@ class OnboardingRequest(models.Model): employment_type = models.CharField( max_length=20, blank=True, - choices=[('befristet', 'befristet'), ('unbefristet', 'unbefristet')], + choices=[('befristet', _('befristet')), ('unbefristet', _('unbefristet'))], verbose_name='Beschäftigungsverhältnis', ) employment_end_date = models.DateField(null=True, blank=True, verbose_name='Enddatum (nur bei befristet)') @@ -135,13 +135,13 @@ class OnboardingRequest(models.Model): class FormOption(models.Model): CATEGORY_CHOICES = [ - ('department', 'Abteilung'), - ('device', 'Geräte'), - ('software', 'Software'), - ('access', 'Zugänge'), - ('workspace_group', 'Workspace-Gruppen'), - ('resource', 'Ressourcen'), - ('phone', 'Telefonnummern'), + ('department', _('Abteilung')), + ('device', _('Geräte')), + ('software', _('Software')), + ('access', _('Zugänge')), + ('workspace_group', _('Workspace-Gruppen')), + ('resource', _('Ressourcen')), + ('phone', _('Telefonnummern')), ] category = models.CharField(max_length=40, choices=CATEGORY_CHOICES) @@ -167,15 +167,15 @@ class FormOption(models.Model): class FormFieldConfig(models.Model): PAGE_CHOICES = [ - ('', 'Automatisch'), - ('stammdaten', 'Stammdaten'), - ('vertrag', 'Vertrag'), - ('itsetup', 'IT-Setup'), - ('abschluss', 'Abschluss'), + ('', _('Automatisch')), + ('stammdaten', _('Stammdaten')), + ('vertrag', _('Vertrag')), + ('itsetup', _('IT-Setup')), + ('abschluss', _('Abschluss')), ] FORM_CHOICES = [ - ('onboarding', 'Onboarding'), - ('offboarding', 'Offboarding'), + ('onboarding', _('Onboarding')), + ('offboarding', _('Offboarding')), ] form_type = models.CharField(max_length=20, choices=FORM_CHOICES) @@ -213,17 +213,17 @@ class FormFieldConfig(models.Model): class NotificationTemplate(models.Model): TEMPLATE_CHOICES = [ - ('onboarding_it', 'Onboarding: IT'), - ('onboarding_general_info', 'Onboarding: Allgemeine Info'), - ('onboarding_business_card', 'Onboarding: Visitenkarte'), - ('onboarding_hr_works', 'Onboarding: HR Works'), - ('onboarding_key', 'Onboarding: Schlüssel'), - ('onboarding_reference', 'Onboarding: Referenz Anfordernde Person'), - ('onboarding_welcome', 'Onboarding: Welcome E-Mail'), - ('offboarding_it', 'Offboarding: IT'), - ('offboarding_general_info', 'Offboarding: Allgemeine Info'), - ('offboarding_hr_works_disable', 'Offboarding: HR Works Deaktivierung'), - ('offboarding_reference', 'Offboarding: Referenz Anfordernde Person'), + ('onboarding_it', _('Onboarding: IT')), + ('onboarding_general_info', _('Onboarding: Allgemeine Info')), + ('onboarding_business_card', _('Onboarding: Visitenkarte')), + ('onboarding_hr_works', _('Onboarding: HR Works')), + ('onboarding_key', _('Onboarding: Schlüssel')), + ('onboarding_reference', _('Onboarding: Referenz Anfordernde Person')), + ('onboarding_welcome', _('Onboarding: Welcome E-Mail')), + ('offboarding_it', _('Offboarding: IT')), + ('offboarding_general_info', _('Offboarding: Allgemeine Info')), + ('offboarding_hr_works_disable', _('Offboarding: HR Works Deaktivierung')), + ('offboarding_reference', _('Offboarding: Referenz Anfordernde Person')), ] key = models.CharField(max_length=60, choices=TEMPLATE_CHOICES, unique=True) @@ -255,15 +255,15 @@ class NotificationTemplate(models.Model): class NotificationRule(models.Model): EVENT_CHOICES = [ - ('onboarding', 'Onboarding'), - ('offboarding', 'Offboarding'), + ('onboarding', _('Onboarding')), + ('offboarding', _('Offboarding')), ] OPERATOR_CHOICES = [ - ('always', 'Immer'), - ('contains', 'Enthält'), - ('equals', 'Ist gleich'), - ('is_true', 'Ist aktiv/Ja'), - ('is_false', 'Ist inaktiv/Nein'), + ('always', _('Immer')), + ('contains', _('Enthält')), + ('equals', _('Ist gleich')), + ('is_true', _('Ist aktiv/Ja')), + ('is_false', _('Ist inaktiv/Nein')), ] name = models.CharField(max_length=120) @@ -305,11 +305,11 @@ class NotificationRule(models.Model): class ScheduledWelcomeEmail(models.Model): STATUS_CHOICES = [ - ('scheduled', 'Geplant'), - ('paused', 'Pausiert'), - ('cancelled', 'Abgebrochen'), - ('sent', 'Gesendet'), - ('failed', 'Fehlgeschlagen'), + ('scheduled', _('Geplant')), + ('paused', _('Pausiert')), + ('cancelled', _('Abgebrochen')), + ('sent', _('Gesendet')), + ('failed', _('Fehlgeschlagen')), ] onboarding_request = models.OneToOneField(OnboardingRequest, on_delete=models.CASCADE) @@ -331,17 +331,17 @@ class ScheduledWelcomeEmail(models.Model): class IntroChecklistItem(models.Model): SECTION_CHOICES = [ - ('workplace', 'Geräte und Arbeitsplatz'), - ('accounts', 'Konten und Berechtigungen'), - ('software', 'Software und Tools'), - ('process', 'Prozesse und Hinweise'), + ('workplace', _('Geräte und Arbeitsplatz')), + ('accounts', _('Konten und Berechtigungen')), + ('software', _('Software und Tools')), + ('process', _('Prozesse und Hinweise')), ] OPERATOR_CHOICES = [ - ('always', 'Immer anzeigen'), - ('contains', 'Enthält'), - ('equals', 'Ist gleich'), - ('is_true', 'Ist Ja / aktiv'), - ('is_false', 'Ist Nein / inaktiv'), + ('always', _('Immer anzeigen')), + ('contains', _('Enthält')), + ('equals', _('Ist gleich')), + ('is_true', _('Ist Ja / aktiv')), + ('is_false', _('Ist Nein / inaktiv')), ] section = models.CharField(max_length=30, choices=SECTION_CHOICES) @@ -368,8 +368,8 @@ class IntroChecklistItem(models.Model): class OnboardingIntroductionSession(models.Model): STATUS_CHOICES = [ - ('draft', 'Entwurf'), - ('completed', 'Abgeschlossen'), + ('draft', _('Entwurf')), + ('completed', _('Abgeschlossen')), ] onboarding_request = models.OneToOneField(OnboardingRequest, on_delete=models.CASCADE) @@ -412,6 +412,7 @@ class WorkflowConfig(models.Model): nextcloud_password_override = models.CharField(max_length=255, blank=True, verbose_name='Nextcloud Passwort (Override)') nextcloud_directory_override = models.CharField(max_length=255, blank=True, verbose_name='Nextcloud Verzeichnis (Override)') sync_interval_seconds = models.PositiveIntegerField(default=60, verbose_name='Sync-Intervall (Sekunden)') + device_handover_lead_days = models.PositiveIntegerField(default=5, verbose_name='Vorlauf Geräteübergabe (Tage)') welcome_email_delay_days = models.PositiveIntegerField(default=5, verbose_name='Welcome E-Mail Verzögerung (Tage)') welcome_sender_email = models.EmailField(blank=True, verbose_name='Welcome E-Mail Absender') welcome_include_pdf = models.BooleanField(default=True, verbose_name='Welcome E-Mail mit PDF-Anhang') diff --git a/backend/workflows/static/workflows/css/admin_tools.css b/backend/workflows/static/workflows/css/admin_tools.css index 876f90b..8d6bf8c 100644 --- a/backend/workflows/static/workflows/css/admin_tools.css +++ b/backend/workflows/static/workflows/css/admin_tools.css @@ -11,6 +11,16 @@ label { display: block; margin-bottom: 4px; font-size: 12px; color: #334155; fon input, select, textarea { width: 100%; box-sizing: border-box; border: 1px solid #cbd5e1; border-radius: 8px; padding: 8px 9px; background: #fff; } textarea { min-height: 120px; font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; font-size: 12px; } .actions { margin-top: 10px; display: flex; gap: 8px; flex-wrap: wrap; } +.toggle-row { margin-top: 10px; display: inline-flex; align-items: center; gap: 10px; padding: 8px 10px 8px 12px; border: 1px solid #d8e3f0; border-radius: 999px; background: linear-gradient(180deg, rgba(255,255,255,0.98), rgba(246,249,255,0.94)); box-shadow: inset 0 1px 0 rgba(255,255,255,0.9), 0 6px 14px rgba(16, 32, 57, 0.05); } +.toggle-copy { display: inline-flex; align-items: center; gap: 4px; white-space: nowrap; font-size: 12px; font-weight: 700; color: #30445f; } +.toggle-label, .toggle-value { white-space: nowrap; } +.switch-toggle { display: inline-flex; align-items: center; justify-content: center; border: 0; background: rgba(255,255,255,0.72); padding: 3px; border-radius: 999px; cursor: pointer; box-shadow: inset 0 1px 0 rgba(255,255,255,0.95); } +.switch-track { position: relative; width: 52px; height: 28px; border-radius: 999px; border: 1px solid rgba(16, 32, 57, 0.12); background: linear-gradient(180deg, #dfe6ef, #cfd7e2); transition: background 0.18s ease, border-color 0.18s ease; box-shadow: inset 0 1px 2px rgba(16, 32, 57, 0.08), inset 0 -1px 0 rgba(255,255,255,0.4); } +.switch-thumb { position: absolute; top: 2px; left: 2px; width: 22px; height: 22px; border-radius: 50%; background: linear-gradient(180deg, #ffffff, #f1f5fb); box-shadow: 0 2px 6px rgba(16, 32, 57, 0.22), inset 0 1px 0 rgba(255,255,255,0.95); transition: transform 0.18s ease; } +.switch-toggle.on .switch-track { background: linear-gradient(180deg, #2caf57, #248b44); border-color: #1f7a3b; } +.switch-toggle.on .switch-thumb { transform: translateX(24px); } +.switch-toggle.off .switch-track { background: linear-gradient(180deg, #d55252, #b83939); border-color: #9d3030; } +.switch-toggle:focus-visible .switch-track, .switch-toggle:hover .switch-track { box-shadow: 0 0 0 3px rgba(0, 0, 120, 0.12); } .hint { margin-top: 6px; color: #64748b; font-size: 12px; } .toolbar { display: flex; justify-content: space-between; align-items: center; gap: 10px; margin-bottom: 10px; flex-wrap: wrap; } .switch { display: flex; gap: 8px; flex-wrap: wrap; margin-bottom: 12px; } diff --git a/backend/workflows/static/workflows/css/home.css b/backend/workflows/static/workflows/css/home.css index 417d94a..fe7efa9 100644 --- a/backend/workflows/static/workflows/css/home.css +++ b/backend/workflows/static/workflows/css/home.css @@ -150,6 +150,12 @@ display: flex; gap: 8px; flex-wrap: wrap; + align-items: center; + } + + .status-switch-form { + margin: 0; + display: inline-flex; } .status-pill { @@ -160,6 +166,125 @@ padding: 8px 12px; font-size: 12px; font-weight: 700; + min-height: 38px; + display: inline-flex; + align-items: center; + } + + .status-pill-neutral { + background: + linear-gradient(180deg, rgba(255,255,255,0.98), rgba(246,249,255,0.94)); + box-shadow: + inset 0 1px 0 rgba(255,255,255,0.9), + 0 6px 14px rgba(16, 32, 57, 0.05); + } + + .status-pill-switch { + display: inline-flex; + align-items: center; + gap: 10px; + padding: 8px 8px 8px 12px; + min-height: 38px; + background: + linear-gradient(180deg, rgba(255,255,255,0.98), rgba(246,249,255,0.94)); + box-shadow: + inset 0 1px 0 rgba(255,255,255,0.9), + 0 6px 14px rgba(16, 32, 57, 0.05); + } + + .status-switch-copy { + display: inline-flex; + flex-direction: row; + align-items: flex-start; + gap: 4px; + min-width: 0; + line-height: 1; + } + + .status-switch-label { + font-size: 12px; + font-weight: 700; + letter-spacing: normal; + text-transform: none; + opacity: 1; + } + + .status-switch-value { + font-size: 12px; + font-weight: 700; + letter-spacing: normal; + } + + .status-switch-label, + .status-switch-value, + .status-pill-switch .status-switch-copy { + white-space: nowrap; + } + + .switch-toggle { + display: inline-flex; + align-items: center; + justify-content: center; + border: 0; + background: rgba(255,255,255,0.72); + padding: 3px; + border-radius: 999px; + cursor: pointer; + box-shadow: inset 0 1px 0 rgba(255,255,255,0.95); + } + + .switch-track { + position: relative; + width: 52px; + height: 28px; + border-radius: 999px; + border: 1px solid rgba(16, 32, 57, 0.12); + background: linear-gradient(180deg, #dfe6ef, #cfd7e2); + transition: background 0.18s ease, border-color 0.18s ease; + box-shadow: + inset 0 1px 2px rgba(16, 32, 57, 0.08), + inset 0 -1px 0 rgba(255,255,255,0.4); + } + + .switch-thumb { + position: absolute; + top: 2px; + left: 2px; + width: 22px; + height: 22px; + border-radius: 50%; + background: linear-gradient(180deg, #ffffff, #f1f5fb); + box-shadow: + 0 2px 6px rgba(16, 32, 57, 0.22), + inset 0 1px 0 rgba(255,255,255,0.95); + transition: transform 0.18s ease; + } + + .switch-toggle.on .switch-track { + background: linear-gradient(180deg, #2caf57, #248b44); + border-color: #1f7a3b; + } + + .switch-toggle.on .switch-thumb { + transform: translateX(24px); + } + + .switch-toggle.off .switch-track { + background: linear-gradient(180deg, #d55252, #b83939); + border-color: #9d3030; + } + + .switch-toggle:focus-visible .switch-track, + .switch-toggle:hover .switch-track { + box-shadow: 0 0 0 3px rgba(0, 0, 120, 0.12); + } + + .status-pill-switch.ok .status-switch-value { + color: var(--ok-ink); + } + + .status-pill-switch.warn .status-switch-value { + color: var(--warn-ink); } .status-pill.ok { diff --git a/backend/workflows/tasks.py b/backend/workflows/tasks.py index 06355b6..56c305d 100644 --- a/backend/workflows/tasks.py +++ b/backend/workflows/tasks.py @@ -8,7 +8,7 @@ from celery import shared_task from django.contrib.auth import get_user_model from django.conf import settings from django.utils import timezone -from django.utils.translation import gettext as _, get_language +from django.utils.translation import gettext as _, get_language, override from jinja2 import Template from pypdf import PageObject, PdfReader, PdfWriter from xhtml2pdf import pisa @@ -570,88 +570,64 @@ def _build_intro_sections_from_admin(request_obj: OnboardingRequest, language_co def build_intro_sections_for_request(request_obj: OnboardingRequest, language_code: str | None = None) -> list[dict]: lang = _normalized_lang(language_code or get_language()) - section_titles = { - 'de': { - 'workplace': 'Geräte und Arbeitsplatz', - 'accounts': 'Konten und Berechtigungen', - 'software': 'Software und Tools', - 'process': 'Prozesse und Hinweise', - }, - 'en': { - 'workplace': 'Devices and workplace', - 'accounts': 'Accounts and permissions', - 'software': 'Software and tools', - 'process': 'Processes and notes', - }, - } - devices = _split_multiline(request_obj.needed_devices) - software = _split_multiline(request_obj.needed_software) - accesses = _split_multiline(request_obj.needed_accesses) - groups = _split_multiline(request_obj.needed_workspace_groups) - resources = _split_multiline(request_obj.needed_resources) - extra_hardware = _split_multiline(request_obj.additional_hardware) - extra_software = _split_multiline(request_obj.additional_software) - group_mailboxes = _split_multiline(request_obj.group_mailboxes) + with override(lang): + section_titles = { + 'workplace': _('Geräte und Arbeitsplatz'), + 'accounts': _('Konten und Berechtigungen'), + 'software': _('Software und Tools'), + 'process': _('Prozesse und Hinweise'), + } + devices = _split_multiline(request_obj.needed_devices) + software = _split_multiline(request_obj.needed_software) + accesses = _split_multiline(request_obj.needed_accesses) + groups = _split_multiline(request_obj.needed_workspace_groups) + resources = _split_multiline(request_obj.needed_resources) + extra_hardware = _split_multiline(request_obj.additional_hardware) + extra_software = _split_multiline(request_obj.additional_software) + group_mailboxes = _split_multiline(request_obj.group_mailboxes) - workplace_items = [] - for item in devices: - if lang == 'en': - workplace_items.append(f'{item} handed over and basic functions explained') - else: - workplace_items.append(f'{item} übergeben und Grundfunktionen erklärt') - for item in resources: - if lang == 'en': - workplace_items.append(f'{item} shown or usage explained') - else: - workplace_items.append(f'{item} gezeigt bzw. Nutzung erklärt') - if request_obj.phone_number: - if lang == 'en': - workplace_items.append(f'Phone number / direct extension explained: {request_obj.phone_number}') - else: - workplace_items.append(f'Telefonnummer / Direktwahl erklärt: {request_obj.phone_number}') - if not workplace_items: - workplace_items.append('Workplace, devices, and general usage reviewed' if lang == 'en' else 'Arbeitsplatz, Geräte und allgemeine Nutzung besprochen') + workplace_items = [] + for item in devices: + workplace_items.append(_('%(item)s übergeben und Grundfunktionen erklärt') % {'item': item}) + for item in resources: + workplace_items.append(_('%(item)s gezeigt bzw. Nutzung erklärt') % {'item': item}) + if request_obj.phone_number: + workplace_items.append(_('Telefonnummer / Direktwahl erklärt: %(value)s') % {'value': request_obj.phone_number}) + if not workplace_items: + workplace_items.append(_('Arbeitsplatz, Geräte und allgemeine Nutzung besprochen')) - account_items = [f'{item} access explained' if lang == 'en' else f'{item} Zugang erklärt' for item in accesses] - account_items.extend([f'{item} group / permission explained' if lang == 'en' else f'{item} Gruppe / Berechtigung erläutert' for item in groups]) - if request_obj.work_email: - account_items.insert(0, f'Work email address explained: {request_obj.work_email}' if lang == 'en' else f'Dienstliche E-Mail-Adresse erläutert: {request_obj.work_email}') - if group_mailboxes: - account_items.extend([f'Group mailbox explained: {item}' if lang == 'en' else f'Gruppenpostfach erklärt: {item}' for item in group_mailboxes]) - if not account_items: - account_items.append('Accesses, accounts, and login logic reviewed' if lang == 'en' else 'Zugänge, Konten und Anmeldelogik besprochen') + account_items = [_('%(item)s Zugang erklärt') % {'item': item} for item in accesses] + account_items.extend([_('%(item)s Gruppe / Berechtigung erläutert') % {'item': item} for item in groups]) + if request_obj.work_email: + account_items.insert(0, _('Dienstliche E-Mail-Adresse erläutert: %(value)s') % {'value': request_obj.work_email}) + if group_mailboxes: + account_items.extend([_('Gruppenpostfach erklärt: %(item)s') % {'item': item} for item in group_mailboxes]) + if not account_items: + account_items.append(_('Zugänge, Konten und Anmeldelogik besprochen')) - software_items = [f'{item} introduction completed' if lang == 'en' else f'{item} Einführung durchgeführt' for item in software] - software_items.extend([f'{item} discussed additionally' if lang == 'en' else f'{item} zusätzlich besprochen' for item in extra_software]) - if not software_items: - software_items.append('Required standard software and daily usage explained' if lang == 'en' else 'Benötigte Standardsoftware und tägliche Nutzung erklärt') + software_items = [_('%(item)s Einführung durchgeführt') % {'item': item} for item in software] + software_items.extend([_('%(item)s zusätzlich besprochen') % {'item': item} for item in extra_software]) + if not software_items: + software_items.append(_('Benötigte Standardsoftware und tägliche Nutzung erklärt')) - process_items = ( - [ - 'Password rules and secure handling reviewed', - 'File storage, Nextcloud, and sharing explained', - 'Communication channels and support process explained', + process_items = [ + _('Passwortregeln und sicherer Umgang besprochen'), + _('Dateiablage, Nextcloud und Freigaben erklärt'), + _('Kommunikationswege und Support-Prozess erklärt'), ] - if lang == 'en' - else [ - 'Passwortregeln und sicherer Umgang besprochen', - 'Dateiablage, Nextcloud und Freigaben erklärt', - 'Kommunikationswege und Support-Prozess erklärt', - ] - ) - if extra_hardware: - process_items.extend([f'{item} discussed as additional equipment' if lang == 'en' else f'{item} als zusätzliche Ausstattung besprochen' for item in extra_hardware]) - if request_obj.additional_access_text: - process_items.extend([f'Additional access discussed: {item}' if lang == 'en' else f'Zusätzlicher Zugang besprochen: {item}' for item in _split_multiline(request_obj.additional_access_text)]) - if request_obj.successor_name: - process_items.append(f'Handover / successor context reviewed: {request_obj.successor_name}' if lang == 'en' else f'Übergabe-/Nachfolgekontext besprochen: {request_obj.successor_name}') + if extra_hardware: + process_items.extend([_('%(item)s als zusätzliche Ausstattung besprochen') % {'item': item} for item in extra_hardware]) + if request_obj.additional_access_text: + process_items.extend([_('Zusätzlicher Zugang besprochen: %(item)s') % {'item': item} for item in _split_multiline(request_obj.additional_access_text)]) + if request_obj.successor_name: + process_items.append(_('Übergabe-/Nachfolgekontext besprochen: %(value)s') % {'value': request_obj.successor_name}) custom_intro_items = _build_intro_sections_from_admin(request_obj, lang) intro_sections_raw = [ - ('workplace', section_titles.get(lang, section_titles['de'])['workplace'], workplace_items), - ('accounts', section_titles.get(lang, section_titles['de'])['accounts'], account_items), - ('software', section_titles.get(lang, section_titles['de'])['software'], software_items), - ('process', section_titles.get(lang, section_titles['de'])['process'], process_items), + ('workplace', section_titles['workplace'], workplace_items), + ('accounts', section_titles['accounts'], account_items), + ('software', section_titles['software'], software_items), + ('process', section_titles['process'], process_items), ] sections = [] diff --git a/backend/workflows/templates/workflows/audit_log.html b/backend/workflows/templates/workflows/audit_log.html index b47d3c7..c1903ab 100644 --- a/backend/workflows/templates/workflows/audit_log.html +++ b/backend/workflows/templates/workflows/audit_log.html @@ -67,14 +67,28 @@
{{ row.details|default:"{}" }}{{ row.details|default:"{}" }}
+ {% endif %}
+ {% trans "Zentrale Arbeitsfläche für Anfragen, PDF-Generierung, E-Mail-Workflows und Ablage in Nextcloud." %}
{% trans "Nextcloud- und E-Mail-Setup." %}
+{% trans "Öffnen" %} +{% trans "Wichtige Admin-Aktionen nachvollziehen und prüfen." %}
+{% trans "Öffnen" %} +{% trans "Geplante Welcome Mails verwalten." %}
+{% trans "Öffnen" %} +{% trans "Felder, Schritte und Optionen verwalten." %}
{% trans "Öffnen" %} @@ -131,64 +146,10 @@ {% trans "Öffnen" %}{% trans "Wichtige Admin-Aktionen nachvollziehen und prüfen." %}
-{% trans "Öffnen" %} -{% trans "Nextcloud- und E-Mail-Setup." %}
-{% trans "Öffnen" %} -{% trans "Geplante Welcome Mails verwalten." %}
-{% trans "Öffnen" %} -{% trans "Vollständige Datenverwaltung." %}
{% trans "Öffnen" %}Server und Absender in der Backend-UI.
- Öffnen -Aktiv/Inaktiv direkt umschalten.
- -Zwischen Testmodus und Produktion wechseln.
- -Testupload und Testmail auslösen.
-{{ row.summary }}
+ + {% if row.meta %} + + {% endif %} + + {% if row.url %} + + {% endif %} + + {% if row.details %} +