- Datenmodell: Tenant.tier (Default PROFI), lotseChatSeats, lotseChatHardLimit;
Tabelle lotse_chat_seats (RLS, TENANT_MODELS, pii-fields), Index für die
Monatszählung der Chat-Nachrichten (Migration 20260921100000_pakete)
- src/lib/plans.ts: Stufenregeln, 150 Chats je Platz, Mehrverbrauch in 100er-Paketen
- src/server/plan.ts: effektive Freischaltung = Stufe UND TenantModule, genutzt von
requireModule, assertModuleEnabled, API, Sync (Offline-Op → rejected mit Klartext),
Navigation, isLotseEnabled und planningAccess (Planung nur in Profi)
- Lotse-Chat: Platzprüfung (no_seat), Testphase ohne Platz, Kontingent mit
hartem Limit (quota_exhausted); Platzvergabe durch den Mandanten-Admin
- Betreiber: Stufe/Plätze/hartes Limit im Mandantendetail mit Bestätigung
und Plattform-Audit, Verbrauch laufender Monat/Vormonat, Stufe als Badge
- Demo-Seed: demo = Profi mit 3 Plätzen, demo2 = Basis
- Tests: test-pakete-{rules,gates,seats}
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
94 lines
5.3 KiB
JSON
94 lines
5.3 KiB
JSON
{
|
||
"tier": {
|
||
"BASIS": "Basis",
|
||
"PROFI": "Profi"
|
||
},
|
||
"colTier": "Paket",
|
||
"notInTier": "Nur im Paket Profi",
|
||
"profiHint": {
|
||
"title": "Im Paket Profi enthalten",
|
||
"text": "Diese Funktion gehört zum Paket Profi. Ihr Betrieb nutzt das Paket Basis – für ein Upgrade wenden Sie sich bitte an Ihren Craftvia-Ansprechpartner."
|
||
},
|
||
"admin": {
|
||
"title": "Paket & Lotse-Chat",
|
||
"sub": "Paket des Betriebs, Chat-Plätze für Monteure und Verbrauch im laufenden Monat",
|
||
"package": "Paket",
|
||
"trial": "Testphase (alle Funktionen)",
|
||
"packageReadOnly": "Paket und Anzahl der Chat-Plätze legt der Anbieter fest. Hier vergeben Sie die gekauften Plätze an Ihre Monteure und Teamleiter.",
|
||
"basisHint": "Lotse und Lotse-Chat sind im Paket Profi enthalten. Bereits vergebene Plätze und Chatverläufe bleiben gespeichert und sind nach einem Wechsel zu Profi wieder verfügbar.",
|
||
"seatsTitle": "Chat-Plätze",
|
||
"seatsCount": "{assigned} von {purchased} Plätzen vergeben",
|
||
"trialSeats": "Während der Testphase dürfen alle Monteure und Teamleiter den Lotse-Chat nutzen – Plätze müssen nicht vergeben werden (Kontingent: {perSeat} Chats je Person und Monat).",
|
||
"noSeatsBought": "Noch keine Chat-Plätze gebucht. Plätze bucht der Anbieter für Ihren Betrieb.",
|
||
"overbooked": "Mehr Plätze vergeben als gebucht ({purchased}). Nur die zuerst vergebenen Plätze gelten – bitte Plätze entziehen.",
|
||
"noFieldUsers": "Keine aktiven Nutzer mit Feldrolle (Monteur, Teamleiter).",
|
||
"seatAssigned": "Platz vergeben",
|
||
"seatOverbooked": "Über der Platzanzahl",
|
||
"seatNone": "Kein Platz",
|
||
"assign": "Platz vergeben",
|
||
"revoke": "Platz entziehen",
|
||
"assignLabel": "Chat-Platz an {name} vergeben",
|
||
"revokeLabel": "Chat-Platz von {name} entziehen",
|
||
"saved": "Chat-Platz gespeichert.",
|
||
"usageTitle": "Verbrauch {month}",
|
||
"usageText": "{used} von {quota} Chats",
|
||
"quotaRule": "Kontingent: {perSeat} Chats je vergebenem Platz und Monat, gemeinsam für den Betrieb (Basis: {basis}). Ein Chat ist eine Nachricht an den Lotsen.",
|
||
"warn80": "{percent} % des Monatskontingents sind genutzt.",
|
||
"exhausted": "Das Monatskontingent ist ausgeschöpft. Weitere Chats werden als Mehrverbrauch in Paketen à {pack} berechnet.",
|
||
"hardLimitReached": "Das Monatskontingent ist ausgeschöpft. Der Lotse-Chat ist bis zum Monatsende gesperrt (hartes Limit).",
|
||
"overage": "Mehrverbrauch: {overage} Chats – entspricht {packs, plural, one {# Paket} other {# Paketen}} à {pack} Chats.",
|
||
"perUserCaption": "Chats je Nutzer im laufenden Monat",
|
||
"perUserName": "Nutzer",
|
||
"perUserChats": "Chats",
|
||
"errors": {
|
||
"no_seats_left": "Alle gebuchten Plätze sind vergeben. Bitte zuerst einen Platz entziehen oder weitere Plätze beim Anbieter buchen.",
|
||
"not_eligible": "Diese Person kann keinen Chat-Platz erhalten (keine aktive Feldrolle).",
|
||
"not_in_plan": "Der Lotse-Chat ist im Paket Profi enthalten.",
|
||
"disabled": "Lotse ist für diesen Betrieb ausgeschaltet.",
|
||
"forbidden": "Dafür fehlt die Berechtigung.",
|
||
"trial_expired": "Testphase abgelaufen – nur Lesezugriff.",
|
||
"failed": "Speichern nicht möglich."
|
||
}
|
||
},
|
||
"platform": {
|
||
"title": "Paket & Lotse-Chat",
|
||
"tier": "Paket",
|
||
"trialProfi": "Testphase = Profi",
|
||
"seats": "Chat-Plätze",
|
||
"seatsValue": "{assigned} vergeben / {purchased} gebucht",
|
||
"hardLimit": "Hartes Limit",
|
||
"hardLimitOn": "an – Sperre beim Kontingent",
|
||
"hardLimitOff": "aus – Mehrverbrauch wird gezählt",
|
||
"rule": "{perSeat} Chats je vergebenem Platz und Monat (Zeitzone des Mandanten); Mehrverbrauch in Paketen à {pack}.",
|
||
"currentMonth": "Laufender Monat · {month}",
|
||
"previousMonth": "Vormonat · {month}",
|
||
"chats": "{used} von {quota} Chats",
|
||
"overage": "Mehrverbrauch {overage} Chats → {packs, plural, one {# Paket} other {# Pakete}} à {pack}",
|
||
"noOverage": "Kein Mehrverbrauch",
|
||
"edit": "Paket ändern …",
|
||
"editTitle": "Paket & Chat-Plätze ändern",
|
||
"editText": "Die Änderung wirkt sofort für alle Nutzer des Mandanten und wird im Plattform-Audit protokolliert.",
|
||
"tierHint": {
|
||
"BASIS": "Ohne KI und Planung: kein Lotse, keine Plantafel/Live-Lage, keine Abrechnungsübersicht, kein Notdienst, kein Auftragsimport.",
|
||
"PROFI": "Alle Funktionen inkl. Planung, Abrechnungsübersicht, Notdienst, Import und Lotse."
|
||
},
|
||
"downgradeHint": "Wechsel zu Basis: Daten bleiben erhalten, nur der Zugriff endet. Zurück zu Profi ist alles wieder da.",
|
||
"seatsInput": "Gebuchte Chat-Plätze",
|
||
"seatsHint": "Der Mandanten-Admin vergibt die Plätze an Nutzer mit Feldrolle.",
|
||
"hardLimitInput": "Hartes Limit",
|
||
"hardLimitHint": "Nach Ausschöpfen des Monatskontingents wird der Chat gesperrt statt Mehrverbrauch zu zählen.",
|
||
"confirm": "Ich habe die Auswirkungen geprüft und bestätige die Änderung.",
|
||
"submit": "Speichern",
|
||
"submitting": "Speichern …",
|
||
"close": "Schließen",
|
||
"saved": "Paket gespeichert.",
|
||
"errors": {
|
||
"confirm_required": "Bitte die Änderung bestätigen.",
|
||
"invalid_input": "Bitte Eingaben prüfen (Plätze 0–1000).",
|
||
"tenant_archived": "Der Mandant ist archiviert.",
|
||
"platform_admin_required": "Nur Voll-Administratoren dürfen das Paket ändern.",
|
||
"failed": "Speichern nicht möglich."
|
||
}
|
||
}
|
||
}
|