Merge lane/auftraege in feature/craftvia-mvp

Konflikte gelöst: Header mit Suche (L2) und Glocke (L6), Audit-Labels vereinigt
(ohne doppeltes sync_operation), Navigation mit Benachrichtigungen und Auftragsvorlagen.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-14 12:36:21 +02:00
co-authored by Claude Opus 5
68 changed files with 7286 additions and 36 deletions
+30 -3
View File
@@ -2,7 +2,34 @@
"title": "Dashboard",
"crumb": "Übersicht",
"subtitle": "Willkommen, {name} — {tenant}",
"placeholderTitle": "Dashboard in Umsetzung",
"placeholder": "Hier erscheinen künftig offene Aufträge, heutige Einsätze, freizugebende Berichte und Notdienst-Meldungen.",
"moduleDisabled": "Das angeforderte Modul ist für Ihren Betrieb nicht freigeschaltet."
"moduleDisabled": "Das angeforderte Modul ist für Ihren Betrieb nicht freigeschaltet.",
"workOrdersDisabled": "Das Modul Aufträge ist nicht freigeschaltet – es gibt keine Kennzahlen.",
"filterTitle": "Kennzahlen eingrenzen",
"tiles": {
"open": "Offene Aufträge",
"today": "Heutige Einsätze",
"running": "Laufende Einsätze",
"not_accepted": "Nicht angenommen",
"overdue": "Überfällig",
"reports_in_review": "Berichte zur Prüfung",
"completed": "Abgeschlossen",
"billing": "Zur Abrechnung",
"emergency_new": "Neue Notdienste",
"missing_signatures": "Fehlende Unterschriften",
"sync_conflicts": "Sync-Konflikte"
},
"hints": {
"open": "Noch nicht abgerechnet oder storniert",
"today": "Für heute geplant",
"running": "Unterwegs, in Arbeit, pausiert",
"not_accepted": "Zugewiesen, noch nicht angenommen",
"overdue": "Geplantes Ende überschritten",
"reports_in_review": "Eingereicht, noch nicht freigegeben",
"completed": "Technisch abgeschlossen oder weiter",
"billing": "Bereit zur Abrechnung",
"emergency_new": "Neu oder zur Prüfung",
"missing_signatures": "Unterschrift ausstehend",
"sync_conflicts": "Offline-Änderungen prüfen"
},
"open": "Anzeigen"
}
+1
View File
@@ -7,6 +7,7 @@
"teams": "Teams",
"reports": "Berichte",
"documents": "Dokumente",
"templates": "Auftragsvorlagen",
"settings": "Einstellungen",
"notifications": "Benachrichtigungen",
"audit": "Audit-Protokoll",
+28
View File
@@ -0,0 +1,28 @@
{
"crumb": "Suche",
"title": "Suche",
"placeholder": "Aufträge, Kunden, Objekte, Adressen, Dokumente, Notizen",
"submit": "Suchen",
"hint": "Mindestens 2 Zeichen eingeben.",
"noResults": "Keine Treffer für „{q}“.",
"resultsFor": "Treffer für „{q}“",
"filters": {
"from": "Von",
"to": "Bis",
"status": "Status",
"team": "Team",
"any": "Alle",
"apply": "Filtern",
"reset": "Filter zurücksetzen",
"note": "Zeitraum, Status und Team grenzen Aufträge und alles am Auftrag ein."
},
"sections": {
"workOrders": "Aufträge",
"customers": "Kunden",
"sites": "Objekte",
"contacts": "Ansprechpartner",
"documents": "Dokumente",
"notes": "Notizen"
},
"maxHint": "Es werden höchstens 20 Treffer je Bereich angezeigt."
}
+73
View File
@@ -0,0 +1,73 @@
{
"crumb": "Einstellungen",
"nav": {
"orderTypes": "Auftragsarten",
"checklists": "Checklisten-Vorlagen",
"numbering": "Nummernkreise"
},
"orderTypes": {
"title": "Auftragsarten",
"sub": "Auftragsarten je Betrieb – mit Vorgabe, ob eine Kundenunterschrift nötig ist",
"key": "Schlüssel",
"name": "Bezeichnung",
"signatureRequired": "Unterschrift erforderlich",
"active": "Aktiv",
"sortOrder": "Reihenfolge",
"create": "Auftragsart anlegen",
"save": "Speichern",
"keyHint": "Kleinbuchstaben, Ziffern, Unterstrich – nicht änderbar",
"inactive": "Inaktiv",
"yes": "Ja",
"no": "Nein"
},
"checklists": {
"title": "Checklisten-Vorlagen",
"sub": "Vorlagen je Auftragsart – werden beim Anlegen eines Auftrags übernommen",
"empty": "Noch keine Vorlagen.",
"new": "Neue Vorlage",
"edit": "Bearbeiten",
"name": "Name",
"orderType": "Auftragsart",
"noOrderType": "— keine —",
"active": "Aktiv",
"items": "Checklistenpunkte",
"itemsHint": "Eine Zeile je Punkt. Zusätze: „*“ am Anfang = Pflicht, „[Foto]“ am Ende = mit Foto.",
"photos": "Pflichtfotos",
"photosHint": "Eine Zeile je Pflichtfoto.",
"suggestion": "Standardvorschlag einfügen",
"suggestionHint": "Vorschlag aus den Standardpunkten; vor dem Speichern anpassen.",
"save": "Vorlage speichern",
"itemCount": "{count, plural, =0 {Keine Punkte} one {# Punkt} other {# Punkte}}",
"photoCount": "{count, plural, =0 {keine Pflichtfotos} one {# Pflichtfoto} other {# Pflichtfotos}}",
"inactive": "Inaktiv",
"photoSuffix": "[Foto]"
},
"numbering": {
"title": "Nummernkreise",
"sub": "Präfix und Stellenzahl der fortlaufenden Nummern. Der Zähler läuft immer weiter.",
"key": "Nummernkreis",
"prefix": "Präfix",
"padding": "Stellen",
"next": "Nächste Nummer",
"save": "Speichern",
"keys": {
"work_order": "Aufträge",
"emergency": "Notdienste",
"customer": "Kunden",
"report": "Berichte"
}
},
"saved": "Gespeichert.",
"errors": {
"forbidden": "Dafür fehlt die Berechtigung.",
"invalid": "Eingaben prüfen.",
"not_found": "Nicht gefunden.",
"internal": "Vorgang nicht möglich.",
"validation_failed": "Pflichtfelder prüfen.",
"order_type_key_taken": "Dieser Schlüssel ist bereits vergeben.",
"order_type_not_found": "Auftragsart nicht gefunden.",
"template_not_found": "Vorlage nicht gefunden.",
"duplicate_item_key": "Zwei Checklistenpunkte haben dieselbe Bezeichnung.",
"duplicate_photo_key": "Zwei Pflichtfotos haben dieselbe Bezeichnung."
}
}
+445
View File
@@ -0,0 +1,445 @@
{
"crumb": "Aufträge",
"title": "Aufträge",
"subtitle": "Planen, zuweisen, prüfen und zur Abrechnung freigeben",
"new": "Neuer Auftrag",
"conflictsLink": "Sync-Konflikte",
"allGroups": "Alle",
"empty": "Keine Aufträge für diese Auswahl.",
"resultCount": "{count, plural, =0 {Keine Aufträge} one {# Auftrag} other {# Aufträge}}",
"presetActive": "Kachel-Filter: {name}",
"removePreset": "Kachel-Filter entfernen",
"view": { "cards": "Karten", "table": "Tabelle" },
"pagination": { "prev": "Zurück", "next": "Weiter", "page": "Seite {page} von {pages}" },
"filter": {
"title": "Filter",
"q": "Nummer, Titel, Kunde, Ort",
"from": "Von",
"to": "Bis",
"customer": "Kunde",
"site": "Objekt",
"team": "Team",
"user": "Monteur",
"status": "Status",
"orderType": "Auftragsart",
"priority": "Priorität",
"sort": "Sortierung",
"any": "Alle",
"apply": "Filtern",
"reset": "Zurücksetzen"
},
"sort": {
"plannedStart": "Geplanter Beginn",
"createdAt": "Angelegt",
"updatedAt": "Zuletzt geändert",
"number": "Nummer",
"priority": "Priorität",
"status": "Status",
"asc": "aufsteigend",
"desc": "absteigend"
},
"columns": {
"number": "Nummer",
"title": "Titel",
"customer": "Kunde",
"site": "Objekt",
"planned": "Geplant",
"team": "Team",
"status": "Status",
"priority": "Priorität"
},
"status": {
"draft": "Entwurf",
"review_required": "Prüfung erforderlich",
"planned": "Geplant",
"assigned": "Zugewiesen",
"accepted": "Angenommen",
"en_route": "In Anfahrt",
"in_progress": "In Bearbeitung",
"paused": "Pausiert",
"waiting_material": "Wartet auf Material",
"daily_report_created": "Tagesbericht erstellt",
"technically_completed": "Technisch abgeschlossen",
"signature_pending": "Unterschrift ausstehend",
"in_review": "Zur Prüfung",
"released_for_billing": "Zur Abrechnung freigegeben",
"billed": "Abgerechnet",
"cancelled": "Storniert"
},
"statusGroup": {
"new": "Neu",
"planned": "Geplant",
"en_route": "Unterwegs",
"in_progress": "In Arbeit",
"documentation_incomplete": "Dokumentation unvollständig",
"in_review": "Zur Prüfung",
"ready_for_billing": "Bereit zur Abrechnung",
"billed": "Abgerechnet",
"cancelled": "Storniert"
},
"priority": { "low": "Niedrig", "normal": "Normal", "high": "Hoch", "urgent": "Dringend" },
"billingType": {
"fixed": "Pauschal",
"time_material": "Nach Aufwand",
"maintenance_contract": "Wartungsvertrag",
"warranty": "Gewährleistung"
},
"emergency": "Notdienst",
"unassigned": "Nicht zugewiesen",
"noDate": "Ohne Termin",
"create": {
"title": "Neuer Auftrag",
"sub": "Kunde wählen, Auftrag erfassen",
"stepCustomer": "1. Kunde suchen",
"customerSearch": "Firma, Name, Kundennummer oder Ort",
"searchButton": "Suchen",
"noCustomers": "Kein Kunde gefunden. Kunden werden unter „Kunden“ angelegt.",
"chooseCustomer": "Auswählen",
"changeCustomer": "Anderen Kunden wählen",
"stepDetails": "2. Auftrag erfassen",
"submit": "Auftrag anlegen",
"pending": "Lege an…"
},
"fields": {
"title": "Titel",
"customer": "Kunde",
"site": "Objekt",
"contact": "Ansprechpartner",
"none": "— keine Auswahl —",
"orderType": "Auftragsart",
"priority": "Priorität",
"plannedStart": "Geplanter Beginn",
"plannedEnd": "Geplantes Ende",
"description": "Beschreibung",
"scope": "Leistungsumfang",
"internalNotes": "Hinweise intern (nur Büro)",
"technicianNotes": "Hinweise für Monteure",
"signatureRequired": "Unterschrift erforderlich",
"signatureFromType": "Wie Auftragsart",
"yes": "Ja",
"no": "Nein",
"billingType": "Abrechnungsart",
"externalOrderNumber": "Externe Auftragsnummer",
"offerNumber": "Angebotsnummer",
"status": "Anlegen als",
"timezoneHint": "Zeiten in {tz}"
},
"detail": {
"back": "Zurück zu Aufträgen",
"version": "Version {version}",
"nextStep": "Nächster Schritt",
"moreActions": "Weitere Statusänderungen",
"edit": "Bearbeiten",
"assign": "Zuweisen",
"reassign": "Zuweisung ändern",
"cancel": "Stornieren",
"noActions": "Für Sie ist gerade keine Statusänderung möglich.",
"blockersTitle": "Vor dem Abschluss fehlt noch:",
"tabs": {
"overview": "Übersicht",
"checklist": "Checkliste & Pflichtfotos",
"material": "Material",
"times": "Zeiten",
"photos": "Fotos",
"notes": "Notizen",
"reports": "Berichte",
"documents": "Dokumente",
"history": "Verlauf"
}
},
"overview": {
"customer": "Kunde",
"site": "Objekt",
"contact": "Ansprechpartner",
"planning": "Planung",
"assignment": "Zuweisung",
"team": "Team",
"teamLead": "Teamleiter",
"assignees": "Monteure",
"order": "Auftrag",
"created": "Angelegt",
"updated": "Geändert",
"accessNotes": "Zugang",
"safetyNotes": "Sicherheit"
},
"checklist": {
"items": "Checkliste",
"photos": "Pflichtfotos",
"empty": "Keine Checklistenpunkte.",
"emptyPhotos": "Keine Pflichtfotos.",
"required": "Pflicht",
"optional": "Optional",
"requiresPhoto": "mit Foto",
"done": "Erledigt",
"open": "Offen",
"photoCount": "{count, plural, =0 {Kein Foto} one {# Foto} other {# Fotos}}",
"addItem": "Punkt hinzufügen",
"addPhoto": "Pflichtfoto hinzufügen",
"label": "Bezeichnung",
"applyTemplate": "Vorlage übernehmen",
"template": "Vorlage",
"applyButton": "Übernehmen",
"remove": "Entfernen",
"complete": "Alle Abschluss-Voraussetzungen erfüllt."
},
"material": {
"title": "Material – geplant und tatsächlich",
"empty": "Kein Material geplant oder erfasst.",
"name": "Bezeichnung",
"articleNumber": "Artikelnummer",
"planned": "Geplant",
"actual": "Tatsächlich",
"deviation": "Abweichung",
"unit": "Einheit",
"notes": "Bemerkung",
"reason": "Begründung",
"additional": "Zusätzlich",
"notRecorded": "Noch nicht erfasst",
"add": "Material planen",
"remove": "Entfernen",
"usage": {
"fully_used": "Vollständig verwendet",
"partially_used": "Teilweise verwendet",
"not_used": "Nicht verwendet",
"additional": "Zusätzlich verwendet"
}
},
"times": {
"empty": "Noch keine Zeiten erfasst.",
"person": "Person",
"start": "Beginn",
"end": "Ende",
"duration": "Arbeitszeit",
"minutes": "{minutes} min",
"corrected": "Korrigiert: {reason}",
"sessionStatus": {
"en_route": "Unterwegs",
"running": "Läuft",
"paused": "Pausiert",
"ended": "Beendet"
},
"entryType": {
"travel": "Anfahrt",
"work": "Arbeit",
"break": "Pause",
"material_procurement": "Materialbeschaffung",
"return_travel": "Rückfahrt",
"interruption": "Unterbrechung"
}
},
"photos": {
"empty": "Noch keine Fotos.",
"phase": { "before": "Vorher", "during": "Während", "after": "Nachher" },
"open": "Öffnen",
"inReport": "Im Bericht"
},
"notes": {
"empty": "Keine Notizen.",
"internal": "Hinweise intern",
"technician": "Hinweise für Monteure",
"kind": {
"work_done": "Ausgeführt",
"deviation": "Abweichung",
"problem": "Problem",
"additional_work": "Zusatzarbeit",
"not_executable": "Nicht ausführbar",
"follow_up": "Folgearbeit",
"recommendation": "Empfehlung",
"customer_note": "Kundenhinweis",
"general": "Allgemein"
}
},
"reports": {
"empty": "Noch keine Berichte.",
"type": { "daily": "Tagesbericht", "completion": "Abschlussbericht" },
"status": {
"draft": "Entwurf",
"submitted": "Zur Prüfung",
"team_approved": "Vom Teamleiter freigegeben",
"approved": "Freigegeben",
"rejected": "Zurückgewiesen",
"superseded": "Ersetzt"
},
"open": "Bericht öffnen",
"signature": "Unterschrift: {outcome}",
"signatureOutcome": {
"signed": "unterschrieben",
"customer_absent": "Kunde nicht anwesend",
"refused": "verweigert",
"later": "später",
"not_required": "nicht erforderlich"
},
"billingTitle": "Abrechnung",
"billingHint": "Freigabe nur mit freigegebenem Abschlussbericht.",
"release": "Zur Abrechnung freigeben",
"reject": "Zur Korrektur zurückweisen",
"markBilled": "Als abgerechnet markieren",
"revoke": "Freigabe zurücknehmen"
},
"documents": {
"empty": "Keine Dokumente am Auftrag.",
"upload": "Dokument hochladen",
"file": "Datei (PDF, JPG, PNG, WebP)",
"title": "Titel (optional)",
"category": "Kategorie",
"visibility": "Sichtbarkeit",
"submit": "Hochladen",
"archive": "Entfernen",
"download": "Herunterladen",
"stubHint": "Dateien werden bis zur Anbindung der Dokumentenablage direkt im Objektspeicher abgelegt.",
"categories": {
"order_confirmation": "Auftragsbestätigung",
"technical_drawing": "Technische Zeichnung",
"floor_plan": "Grundriss",
"wiring_diagram": "Schaltplan",
"assembly_instructions": "Montageanleitung",
"safety_document": "Sicherheitsdokument",
"product_document": "Produktunterlage",
"customer_note": "Kundennotiz",
"work_record": "Arbeitsnachweis",
"daily_report": "Tagesbericht",
"completion_report": "Abschlussbericht",
"customer_approval": "Kundenfreigabe",
"photo": "Foto",
"voice_note": "Sprachnotiz",
"signature": "Unterschrift",
"other": "Sonstiges"
},
"visibilities": {
"backoffice_only": "Nur Büro",
"team_lead": "Teamleiter",
"team": "Team",
"customer_report": "Kundenbericht"
}
},
"history": {
"statusChanges": "Statusänderungen",
"audit": "Protokoll",
"empty": "Noch keine Einträge.",
"created": "Angelegt als {status}",
"change": "{from} → {to}",
"by": "von {name}",
"system": "System",
"action": { "create": "Erstellt", "update": "Geändert", "delete": "Gelöscht" }
},
"assign": {
"title": "Auftrag zuweisen",
"sub": "Team wählen, optional einzelne Monteure und Teamleiter",
"team": "Team",
"chooseTeam": "— Team wählen —",
"members": "Einzelne Monteure (optional)",
"teamLead": "Zuständiger Teamleiter",
"teamLeadDefault": "Teamleiter des Teams",
"noTeams": "Keine aktiven Teams. Teams werden unter „Teams“ angelegt.",
"submit": "Zuweisen",
"pending": "Weise zu…"
},
"transition": {
"to": {
"draft": "Als Entwurf",
"review_required": "Zur Prüfung markieren",
"planned": "Einplanen",
"assigned": "Zuweisen",
"accepted": "Annehmen",
"en_route": "Anfahrt starten",
"in_progress": "Arbeit aufnehmen",
"paused": "Pausieren",
"waiting_material": "Wartet auf Material",
"daily_report_created": "Tagesbericht erstellt",
"technically_completed": "Technisch abschließen",
"signature_pending": "Unterschrift ausstehend",
"in_review": "Zur Prüfung geben",
"released_for_billing": "Zur Abrechnung freigeben",
"billed": "Als abgerechnet markieren",
"cancelled": "Stornieren"
},
"correction": "Zur Korrektur zurückweisen",
"revoke": "Freigabe zurücknehmen",
"reasonTitle": "Begründung erforderlich",
"reason": "Begründung",
"reasonPlaceholder": "Kurz beschreiben, warum",
"confirm": "Bestätigen",
"pending": "Speichere…",
"done": "Status geändert."
},
"edit": {
"title": "Auftrag bearbeiten",
"submit": "Speichern",
"pending": "Speichere…",
"saved": "Gespeichert."
},
"conflicts": {
"crumb": "Aufträge",
"title": "Sync-Konflikte",
"sub": "Offline erfasste Änderungen, die nicht automatisch übernommen werden konnten",
"empty": "Keine offenen Konflikte.",
"received": "Eingegangen",
"user": "Gerät / Person",
"operation": "Vorgang",
"entity": "Auftrag",
"baseVersion": "Stand Gerät: Version {base} · aktuell: Version {current}",
"payload": "Inhalt",
"apply": "Übernehmen",
"discard": "Verwerfen",
"applied": "Übernommen.",
"discarded": "Verworfen.",
"applyHint": "Übernehmen wendet den Vorgang erneut auf den aktuellen Stand an – im Namen der Person, die ihn erfasst hat.",
"stubHint": "Übernehmen ist bis zur Anbindung der Synchronisation nur für Statusänderungen möglich."
},
"errors": {
"not_found": "Nicht gefunden oder keine Berechtigung.",
"forbidden": "Dafür fehlt die Berechtigung.",
"invalid": "Eingaben prüfen.",
"conflict": "Der Auftrag wurde inzwischen geändert. Seite neu laden und erneut versuchen.",
"blocked": "Noch nicht möglich – es fehlen Angaben.",
"internal": "Vorgang nicht möglich.",
"validation_failed": "Pflichtfelder prüfen.",
"work_order_not_found": "Auftrag nicht gefunden.",
"customer_not_found": "Kunde nicht gefunden.",
"site_not_found": "Objekt nicht gefunden.",
"contact_not_found": "Ansprechpartner nicht gefunden.",
"site_customer_mismatch": "Das Objekt gehört zu einem anderen Kunden.",
"contact_customer_mismatch": "Der Ansprechpartner gehört zu einem anderen Kunden.",
"order_type_not_found": "Auftragsart nicht gefunden.",
"planned_end_before_start": "Das Ende liegt vor dem Beginn.",
"nothing_to_update": "Keine Änderungen.",
"not_editable": "Der Auftrag kann in diesem Status nicht mehr geändert werden.",
"delete_only_draft": "Nur Entwürfe können gelöscht werden.",
"transition_not_allowed": "Dieser Statuswechsel ist nicht vorgesehen.",
"transition_forbidden": "Diesen Statuswechsel dürfen Sie nicht ausführen.",
"transition_blocked": "Noch nicht möglich – es fehlen Angaben.",
"reason_required": "Bitte eine Begründung angeben.",
"version_conflict": "Der Auftrag wurde inzwischen geändert. Seite neu laden und erneut versuchen.",
"team_not_found": "Team nicht gefunden oder nicht aktiv.",
"user_not_found": "Mindestens eine Person ist nicht aktiv.",
"material_plan_not_found": "Materialposition nicht gefunden.",
"material_in_use": "Zu dieser Position wurde bereits Material erfasst.",
"checklist_item_not_found": "Checklistenpunkt nicht gefunden.",
"checklist_item_checked": "Erledigte Punkte bleiben als Nachweis erhalten.",
"photo_requirement_not_found": "Pflichtfoto nicht gefunden.",
"photo_requirement_has_photos": "Zu diesem Pflichtfoto gibt es bereits Fotos.",
"template_not_found": "Vorlage nicht gefunden.",
"sync_conflict_not_found": "Konflikt nicht gefunden oder bereits erledigt.",
"sync_conflict_already_resolved": "Konflikt wurde bereits erledigt.",
"sync_payload_invalid": "Der Vorgang ist unvollständig.",
"sync_user_inactive": "Die Person ist nicht mehr aktiv.",
"reapply_unsupported": "Dieser Vorgang kann noch nicht übernommen werden.",
"document_not_found": "Dokument nicht gefunden.",
"file_type_not_allowed": "Dateityp nicht erlaubt.",
"file_too_large": "Datei ist leer oder zu groß.",
"file_missing": "Bitte eine Datei wählen.",
"category_invalid": "Kategorie nicht erlaubt.",
"visibility_forbidden": "Diese Sichtbarkeit dürfen Sie nicht vergeben.",
"initial_status_not_allowed": "Dieser Anfangsstatus ist nicht erlaubt."
},
"blockers": {
"checklist_item": "Checkliste: {label}",
"photo_requirement": "Pflichtfoto: {label}",
"running_session": "Ein Einsatz läuft noch",
"field": {
"signature": "Unterschrift fehlt",
"approved_completion_report": "Abschlussbericht ist noch nicht freigegeben"
}
},
"saved": "Gespeichert."
}