syncBillingCandidates (idempotent, Event-Hook für work_order.released_for_billing und report.approved), Aufstellung ohne Preise (nur freigegebene Zeiten, Fahrzeit getrennt, Pausen informativ, Anfahrten-Zählung, Material), markBilled mit eingefrorenem Snapshot und Positionszuordnung, voidBilling mit Grund und neuem offenen Eintrag (billed → released_for_billing nur über applyTransition-Option billingVoid), Meilenstein-Flow mit Events, Job billing-pdf (Dokument other/backoffice_only), Sync-Op milestone.reach. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
251 lines
10 KiB
JSON
251 lines
10 KiB
JSON
{
|
||
"crumb": "Abrechnung",
|
||
"title": "Abrechnungsübersicht",
|
||
"subtitle": "Abgeschlossene Aufträge, bestätigte Meilensteine und freigegebene Tagesberichte für die Buchhaltung. Keine Preise, keine Rechnungen.",
|
||
"hm": "{value} h",
|
||
"tabs": { "open": "Offen", "billed": "Abgerechnet", "voided": "Storniert" },
|
||
"filter": {
|
||
"title": "Filter",
|
||
"q": "Suche",
|
||
"qPlaceholder": "Auftragsnummer oder Kunde",
|
||
"from": "Zeitraum von",
|
||
"to": "Zeitraum bis",
|
||
"customer": "Kunde",
|
||
"team": "Team",
|
||
"kind": "Art",
|
||
"any": "Alle",
|
||
"apply": "Anwenden",
|
||
"reset": "Zurücksetzen"
|
||
},
|
||
"list": {
|
||
"noPermission": "Die Abrechnungsübersicht ist für Ihre Rolle nicht freigeschaltet.",
|
||
"empty": {
|
||
"open": "Nichts offen – alle Einträge sind abgerechnet.",
|
||
"billed": "Noch keine Einträge abgerechnet.",
|
||
"voided": "Keine stornierten Einträge."
|
||
},
|
||
"selectHint": "Einträge auswählen und gemeinsam drucken.",
|
||
"print": "Abrechnungsblätter drucken",
|
||
"select": "Auswahl",
|
||
"selectRow": "{number} auswählen",
|
||
"order": "Auftrag",
|
||
"customerSite": "Kunde / Objekt",
|
||
"section": "Art / Abschnitt",
|
||
"period": "Zeitraum",
|
||
"work": "Arbeitszeit",
|
||
"travel": "Fahrzeit",
|
||
"trips": "Anfahrten",
|
||
"material": "Material",
|
||
"readySince": "Bereit seit",
|
||
"billedAt": "Abgerechnet am",
|
||
"voidedAt": "Storniert am",
|
||
"pending": "{value} h offene Zeiten",
|
||
"invoice": "Rechnung {number}",
|
||
"pagination": "Seiten",
|
||
"prev": "Zurück",
|
||
"next": "Weiter",
|
||
"page": "Seite {page} von {pages}"
|
||
},
|
||
"kind": { "order_completion": "Auftragsabschluss", "milestone": "Meilenstein", "daily_report": "Tagesbericht" },
|
||
"status": { "open": "Offen", "billed": "Abgerechnet", "voided": "Storniert" },
|
||
"milestoneStatus": { "open": "Offen", "reached": "Erreicht gemeldet", "confirmed": "Bestätigt", "billed": "Abgerechnet" },
|
||
"detail": {
|
||
"back": "Zur Abrechnungsübersicht",
|
||
"title": "Abrechnungsblatt {number}",
|
||
"markBilled": "Als abgerechnet markieren",
|
||
"pdf": "PDF",
|
||
"print": "Druckansicht",
|
||
"changeInvoice": "Rechnungsnummer ändern",
|
||
"void": "Stornieren",
|
||
"openOrder": "Zum Auftrag",
|
||
"photos": "Fotos",
|
||
"report": "Bericht {number} · v{version}",
|
||
"done": {
|
||
"billed": "Als abgerechnet markiert. Die Aufstellung ist eingefroren, das PDF wird erstellt.",
|
||
"voided": "Storniert. Die Positionen sind wieder frei – hier ist der neue offene Eintrag.",
|
||
"invoice": "Rechnungsnummer gespeichert."
|
||
},
|
||
"pdfPending": "Das PDF-Abrechnungsblatt wird erstellt.",
|
||
"pdfRequest": "PDF erneut anstoßen",
|
||
"pdfRequested": "PDF-Erstellung angestoßen.",
|
||
"voidedInfo": "Storniert am {at} von {by}"
|
||
},
|
||
"bill": {
|
||
"title": "Als abgerechnet markieren",
|
||
"sub": "Die Rechnung stellt Ihre Buchhaltung außerhalb von Craftvia.",
|
||
"submit": "Abgerechnet",
|
||
"pending": "Wird gespeichert …",
|
||
"invoiceNumber": "Rechnungsnummer (optional)",
|
||
"invoiceHint": "Nummer aus Ihrer Buchhaltung, falls schon vorhanden.",
|
||
"pendingWarning": "{value} h offene Zeiten ({count}) sind noch nicht freigegeben und nicht enthalten.",
|
||
"confirmPending": "Trotzdem abrechnen – offene Zeiten bleiben außen vor",
|
||
"freezeHint": "Die Aufstellung wird eingefroren; enthaltene Zeiten und Materialien können kein zweites Mal abgerechnet werden."
|
||
},
|
||
"invoice": { "title": "Rechnungsnummer ändern", "submit": "Speichern" },
|
||
"void": {
|
||
"title": "Abrechnung stornieren",
|
||
"sub": "Zeiten und Material werden wieder frei, ein neuer offener Eintrag entsteht.",
|
||
"submit": "Stornieren",
|
||
"pending": "Wird storniert …",
|
||
"reason": "Grund"
|
||
},
|
||
"print": {
|
||
"back": "Zur Übersicht",
|
||
"count": "{count, plural, =1 {1 Abrechnungsblatt} other {# Abrechnungsblätter}}",
|
||
"print": "Drucken",
|
||
"empty": "Keine Einträge ausgewählt."
|
||
},
|
||
"tab": {
|
||
"milestones": "Meilensteine",
|
||
"milestonesHint": "Erreichte Meilensteine bestätigen – danach erscheinen sie in der Abrechnungsübersicht.",
|
||
"noMilestonesHint": "Ohne Meilensteine wird bei mehrtägigen Aufträgen jeder freigegebene Tagesbericht als Abschnitt abrufbar.",
|
||
"noMilestones": "Keine Meilensteine definiert.",
|
||
"reachedBy": "Erreicht gemeldet von {name} am {at}",
|
||
"confirmedBy": "Bestätigt von {name} am {at}",
|
||
"rejected": "Zuletzt abgelehnt: {reason}",
|
||
"up": "Nach oben",
|
||
"down": "Nach unten",
|
||
"delete": "Löschen",
|
||
"confirm": "Bestätigen",
|
||
"reject": "Ablehnen",
|
||
"rejectReason": "Grund der Ablehnung",
|
||
"add": "Meilenstein anlegen",
|
||
"newTitle": "Titel",
|
||
"newTitlePlaceholder": "z. B. Rohinstallation abgeschlossen",
|
||
"newDescription": "Beschreibung",
|
||
"records": "Abrechnungseinträge",
|
||
"noRecords": "Noch keine Abrechnungseinträge.",
|
||
"open": "Öffnen"
|
||
},
|
||
"mobile": {
|
||
"title": "Meilensteine",
|
||
"rejected": "Vom Büro abgelehnt: {reason}",
|
||
"waiting": "Gemeldet – wartet auf Bestätigung durch das Büro.",
|
||
"queued": "Gespeichert – wird übertragen, sobald Verbindung besteht.",
|
||
"sent": "Erreicht gemeldet.",
|
||
"note": "Notiz",
|
||
"notePlaceholder": "Notiz (optional)",
|
||
"reachAria": "{title} als erreicht melden",
|
||
"confirmReach": "Jetzt melden",
|
||
"reach": "Erreicht melden",
|
||
"cancel": "Abbrechen"
|
||
},
|
||
"sheet": {
|
||
"title": "Abrechnungsblatt",
|
||
"dailyReportOf": "Tagesbericht vom {date}",
|
||
"period": "Zeitraum",
|
||
"status": "Status",
|
||
"invoiceNumber": "Rechnungsnummer",
|
||
"noAccounting": "Aufstellung für die Buchhaltung – keine Rechnung, ohne Preise."
|
||
},
|
||
"section": {
|
||
"order": "Auftragsdaten",
|
||
"time": "Zeiten",
|
||
"trips": "Anfahrten",
|
||
"material": "Material",
|
||
"texts": "Zusatzleistungen, Abweichungen, offene Restarbeiten",
|
||
"reports": "Berichte und Unterschrift"
|
||
},
|
||
"field": {
|
||
"customer": "Kunde",
|
||
"customerNumber": "Kundennummer",
|
||
"billingAddress": "Rechnungsadresse",
|
||
"site": "Objekt",
|
||
"orderNumber": "Auftragsnummer",
|
||
"externalOrderNumber": "Externe Auftragsnummer",
|
||
"offerNumber": "Angebotsnummer",
|
||
"title": "Auftrag",
|
||
"orderType": "Auftragsart",
|
||
"billingType": "Abrechnungsart",
|
||
"team": "Team",
|
||
"section": "Abschnitt",
|
||
"workDates": "Einsatztage",
|
||
"billedAt": "Abgerechnet",
|
||
"billingNotes": "Abrechnungshinweise des Kunden"
|
||
},
|
||
"billingType": { "fixed": "Festpreis", "time_material": "Nach Aufwand", "maintenance_contract": "Wartungsvertrag", "warranty": "Gewährleistung" },
|
||
"time": {
|
||
"hm": "{value} h",
|
||
"empty": "Keine freigegebenen Zeiten in diesem Abschnitt.",
|
||
"person": "Person",
|
||
"work": "Arbeit",
|
||
"travel": "Fahrzeit",
|
||
"materialProcurement": "Materialbeschaffung",
|
||
"total": "Summe",
|
||
"breaks": "Pausen (Info)",
|
||
"manual": "davon manuell nachgetragen (freigegeben): {value} h",
|
||
"sum": "Gesamt",
|
||
"breaksInfo": "Fahrzeit = Anfahrt + Rückfahrt. Pausen sind nur zur Information aufgeführt und nicht in den Summen enthalten.",
|
||
"pendingHint": "{value} h offen ({count} Einträge), noch nicht freigegeben – nicht enthalten.",
|
||
"runningHint": "Eine Zeit läuft noch und ist nicht enthalten."
|
||
},
|
||
"trips": {
|
||
"count": "{count, plural, =0 {Keine Anfahrt} =1 {1 Anfahrt} other {# Anfahrten}}",
|
||
"rule": "Gemeinsame Anfahrt einer Kolonne zählt als eine Fahrt."
|
||
},
|
||
"material": {
|
||
"name": "Bezeichnung",
|
||
"articleNumber": "Art.-Nr.",
|
||
"quantity": "Menge",
|
||
"planned": "Geplant",
|
||
"status": "Status",
|
||
"reason": "Abweichungsgrund",
|
||
"undocumented": "Nicht erfasst",
|
||
"empty": "Kein Material in diesem Abschnitt.",
|
||
"used": "Verwendetes Material",
|
||
"additional": "Zusätzlich verwendetes Material",
|
||
"notUsed": "Nicht verwendete Planpositionen",
|
||
"notUsedInfo": "Nur zur Information."
|
||
},
|
||
"materialStatus": { "fully_used": "Vollständig verwendet", "partially_used": "Teilweise verwendet", "not_used": "Nicht verwendet", "additional": "Zusätzlich" },
|
||
"texts": {
|
||
"fromReport": "({number})",
|
||
"empty": "Keine Angaben in den Berichten.",
|
||
"additionalWork": "Zusatzleistungen",
|
||
"deviations": "Abweichungen",
|
||
"openItems": "Offene Restarbeiten"
|
||
},
|
||
"reports": {
|
||
"empty": "Kein freigegebener Bericht in diesem Abschnitt.",
|
||
"number": "Bericht",
|
||
"type": "Art",
|
||
"date": "Datum",
|
||
"approvedAt": "Freigegeben",
|
||
"signature": "Unterschrift",
|
||
"noSignature": "Keine Unterschrift"
|
||
},
|
||
"reportType": { "daily": "Tagesbericht", "completion": "Abschlussbericht" },
|
||
"outcome": { "signed": "Unterschrieben", "customer_absent": "Kunde nicht anwesend", "refused": "Unterschrift verweigert", "later": "Wird nachgereicht", "not_required": "Nicht erforderlich" },
|
||
"pdf": {
|
||
"documentTitle": "Abrechnungsblatt {number} – {kind}",
|
||
"page": "Seite {page} von {pages}",
|
||
"recordId": "Eintrag-ID",
|
||
"created": "Erstellt"
|
||
},
|
||
"errors": {
|
||
"not_found": "Nicht gefunden oder keine Berechtigung.",
|
||
"forbidden": "Dafür fehlt die Berechtigung.",
|
||
"invalid": "Eingaben prüfen.",
|
||
"conflict": "Der Eintrag wurde inzwischen geändert. Seite neu laden.",
|
||
"blocked": "Noch nicht möglich.",
|
||
"internal": "Vorgang nicht möglich.",
|
||
"validation_failed": "Pflichtfelder prüfen.",
|
||
"billing_record_not_found": "Abrechnungseintrag nicht gefunden.",
|
||
"billing_record_not_open": "Der Eintrag ist nicht mehr offen.",
|
||
"billing_record_not_billed": "Der Eintrag ist nicht abgerechnet.",
|
||
"pending_time_entries": "Es gibt noch offene Zeiten. Bitte bestätigen, dass sie nicht enthalten sind.",
|
||
"positions_already_billed": "Einige Positionen wurden inzwischen anders abgerechnet. Seite neu laden.",
|
||
"milestone_not_found": "Meilenstein nicht gefunden.",
|
||
"milestone_not_open": "Nur offene Meilensteine können geändert werden.",
|
||
"milestone_not_confirmable": "Dieser Meilenstein kann nicht bestätigt werden.",
|
||
"milestone_not_reached": "Nur gemeldete Meilensteine können abgelehnt werden.",
|
||
"not_editable": "Der Auftrag kann in diesem Status nicht mehr geändert werden.",
|
||
"work_order_not_found": "Auftrag nicht gefunden.",
|
||
"work_order_status": "Für diesen Auftrag ist das nicht mehr möglich.",
|
||
"transition_blocked": "Der Auftragsstatus kann nicht zurückgesetzt werden – es fehlen Angaben.",
|
||
"transition_forbidden": "Diesen Statuswechsel dürfen Sie nicht ausführen.",
|
||
"reason_required": "Bitte einen Grund angeben.",
|
||
"version_conflict": "Der Auftrag wurde inzwischen geändert. Seite neu laden."
|
||
}
|
||
}
|