Merge lane/testphase in feature/craftvia-mvp

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

# Conflicts:
#	prisma/schema.prisma
#	scripts/test-e2e-tenant-isolation.ts
#	src/server/backup/topology.ts
#	src/server/db.ts
#	src/server/dsgvo/pii-fields.ts
This commit is contained in:
2026-09-15 19:16:19 +02:00
83 changed files with 4703 additions and 23 deletions
+2 -1
View File
@@ -21,5 +21,6 @@
"openMenu": "Open menu",
"closeMenu": "Close menu",
"timeApprovals": "Time approvals",
"billing": "Billing"
"billing": "Billing",
"dataExport": "Data export"
}
+269
View File
@@ -0,0 +1,269 @@
{
"meta": {
"title": "Try for free",
"confirmTitle": "Confirm trial",
"termsTitle": "Terms of use",
"privacyTitle": "Privacy"
},
"public": {
"heading": "Try Craftvia for free",
"intro": "Set up in minutes. No payment details, no automatic renewal.",
"benefit1": "Plan work orders, record jobs on mobile, reports with signature",
"benefit2": "Choose the end date – afterwards your data stays readable and exportable",
"benefit3": "Optional sample data to try everything right away",
"haveAccount": "Already have an account?",
"login": "Sign in",
"terms": "Terms of use",
"privacy": "Privacy"
},
"steps": {
"company": "Company",
"account": "Admin account",
"period": "Trial period",
"setup": "Setup",
"summary": "Summary"
},
"progress": "Step {current} of {total}",
"progressLabel": "Progress",
"fields": {
"companyName": "Company name",
"sector": "Trade",
"sectorChoose": "Please choose (optional)",
"sectorOther": "Trade (free text)",
"companySize": "Company size",
"companySizeNone": "Not specified",
"adminName": "Your name",
"email": "E-mail address",
"emailHint": "The address is your sign-in name. We will send you a confirmation link.",
"password": "Password",
"passwordHint": "Requirements: {policy}",
"showPassword": "Show password",
"trialEndDate": "Trial until",
"sampleData": "Start with sample data",
"sampleDataHint": "Three customers, sites, one team and four work orders in different states. You can delete them at any time.",
"modules": "Modules",
"modulesHint": "All modules are preselected. Deselect modules you do not need – you can change this later.",
"acceptTerms": "I accept the {link}.",
"acceptPrivacy": "I have read the {link}.",
"required": "Required",
"website": "Website (leave empty)"
},
"sectors": {
"shk": "Plumbing, heating, air conditioning",
"electrical": "Electrical",
"roofing": "Roofing and facades",
"carpentry": "Carpentry and interior fit-out",
"painting": "Painting and decorating",
"facility": "Building services and facility",
"construction": "Construction and installation",
"metal": "Metalwork",
"other": "Other trade"
},
"sizes": {
"1_5": "1–5 employees",
"6_20": "6–20 employees",
"21_50": "21–50 employees",
"51_200": "51–200 employees",
"200_": "more than 200 employees"
},
"period": {
"until": "Trial until {date} ({days, plural, one {# day} other {# days}})",
"range": "Possible: {min} to {max}",
"afterEnd": "After the end date your data stays readable and exportable. Unless converted to the full version, we delete it 30 days later."
},
"summary": {
"intro": "Please check your details.",
"sampleYes": "with sample data",
"sampleNo": "without sample data",
"modulesCount": "{count} of {total} modules",
"edit": "Edit",
"noSector": "no trade specified"
},
"actions": {
"back": "Back",
"next": "Next",
"submit": "Start trial",
"submitting": "Sending …",
"checking": "Checking …"
},
"sent": {
"title": "Almost done – please confirm your e-mail",
"body": "We have sent you an e-mail. Click the link in it to start your trial.",
"hint": "The link is valid for 24 hours. No e-mail? Check your spam folder or start the signup again.",
"again": "Start signup again"
},
"errors": {
"company_required": "Please enter the company name (at least 2 characters).",
"too_long": "The input is too long.",
"invalid_choice": "Please choose an entry from the list.",
"name_required": "Please enter your name.",
"email_invalid": "Please enter a valid e-mail address.",
"password_policy": "The password does not meet the requirements.",
"date_invalid": "Please choose a valid date.",
"date_too_early": "The end date must be tomorrow at the earliest.",
"date_too_late": "The end date is too far in the future.",
"modules_required": "Please select at least one module.",
"terms_required": "Please accept the terms of use.",
"privacy_required": "Please confirm the privacy notice.",
"invalid_request": "The request was incomplete. Please reload the page.",
"rate_limited": "Too many attempts. Please try again in a few minutes.",
"failed": "That did not work. Please try again."
},
"confirm": {
"title": "Start trial",
"intro": "Confirm your signup. We then set up your account and sign you in right away.",
"company": "Company",
"until": "Trial until",
"sampleData": "Sample data",
"yes": "yes",
"no": "no",
"button": "Set up now",
"pending": "Setting up …",
"invalid": "The link is invalid or has already been used.",
"expired": "The link has expired. Please start the signup again.",
"rate_limited": "Too many attempts. Please try again in a few minutes.",
"toSignup": "Go to “Try for free”",
"toLogin": "Go to sign-in"
},
"legal": {
"back": "Back to signup",
"placeholder": "Placeholder – the binding text will be provided by the operator before go-live.",
"termsBody1": "The trial is free of charge and ends automatically on the chosen date. No contract for paid use is concluded.",
"termsBody2": "After the end the data stays readable and exportable for 30 days. Unless converted to the full version, it is deleted afterwards.",
"privacyBody1": "We process your details (company name, name, e-mail address) to set up and support the trial. Passwords are stored as a secure hash only.",
"privacyBody2": "Unconfirmed signups are deleted after a few days. Trial data is deleted after expiry as described in the terms of use."
},
"banner": {
"endsIn": "{days, plural, =0 {Trial ends today.} =1 {Trial ends tomorrow.} other {Trial ends in # days.}}",
"endsOn": "Last day: {date}.",
"expired": "Trial expired – read-only access.",
"deletion": "Data will be deleted on {date}.",
"contact": "Full version or extension: {email}",
"contactGeneric": "Full version or extension? Contact your Craftvia representative.",
"export": "Export data"
},
"onboarding": {
"title": "Getting started",
"welcome": "Welcome! Your trial is ready.",
"progress": "{done} of {total} done",
"hide": "Hide",
"markDone": "Mark as done",
"markOpen": "Reopen",
"open": "Open",
"auto": "detected",
"doneLabel": "Done",
"openLabel": "Open",
"items": {
"company": { "title": "Check company details", "text": "Address, phone and e-mail appear on reports." },
"team": { "title": "Create a team", "text": "Teams group technicians for planning and assignment." },
"technician": { "title": "Invite a technician", "text": "An invitation link is enough – the person sets their own password." },
"first_order": { "title": "Create or import the first work order", "text": "Enter it manually or upload a work order PDF." },
"mobile": { "title": "Open the mobile app", "text": "Open /m on your smartphone and add it to the home screen." }
}
},
"export": {
"crumb": "Organisation",
"title": "Data export",
"sub": "All data of your company as a ZIP file",
"contents": "Included: customers, contacts, sites, teams, work orders, times, material, reports, milestones and billing as CSV and JSON plus all stored files (documents, report PDFs, photos).",
"readOnlyHint": "The export stays available after the trial has expired.",
"request": "Create export",
"requested": "Export requested. The file is ready in a few minutes – reload the page then.",
"listTitle": "Recent exports",
"empty": "No export created yet.",
"created": "Requested",
"state": "Status",
"file": "File",
"status": { "queued": "Waiting", "running": "In progress", "done": "Ready", "failed": "Failed", "expired": "Expired" },
"download": "Download",
"expires": "until {date}",
"errors": {
"export_running": "An export is already running. Please wait until it has finished.",
"failed": "The export could not be requested."
}
},
"platform": {
"newTrial": "Create trial tenant",
"filter": "Filter",
"filterAll": "All",
"filterTrial": "Trial",
"filterFull": "Full",
"colPlan": "Version",
"badgeFull": "Full version",
"badgeUntil": "Trial until {date}",
"badgeExpired": "expired – read-only",
"badgeDeletion": "Deletion on {date}",
"badgeDeleted": "deleted",
"wizard": {
"crumb": "Platform operations",
"title": "Create trial tenant",
"sub": "Create a tenant with an end date; the admin receives an invitation to set a password.",
"sectionCompany": "1. Company",
"sectionAdmin": "2. Administrator",
"sectionPeriod": "3. Trial period",
"sectionSetup": "4. Setup",
"companyName": "Company name",
"sector": "Trade (optional)",
"adminName": "Name",
"adminEmail": "E-mail address",
"adminHint": "New addresses receive the existing invitation link (valid for 7 days). Existing accounts are only linked.",
"endDate": "Trial until",
"endDateHint": "Any date up to one year ahead.",
"sampleData": "With sample data",
"submit": "Create trial tenant",
"submitting": "Creating …",
"cancel": "Cancel"
},
"card": {
"title": "Trial",
"plan": "Version",
"until": "Last day",
"state": "State",
"stateActive": "running",
"stateExpired": "expired – read-only",
"stateConverted": "converted to full version",
"stateDeleted": "deleted",
"deletion": "Deletion",
"deletionNone": "not scheduled",
"source": "Origin",
"sourceSelf": "Self-service signup",
"sourcePlatform": "Platform wizard",
"extend": "Change / extend end date",
"convert": "Convert to full version",
"end": "End trial now",
"schedule": "Schedule deletion",
"cancel": "Cancel deletion",
"created": "Trial tenant created.",
"invited": "The invitation was sent to the administrator.",
"done": "Change saved."
},
"ops": {
"extendTitle": "Change end date",
"extendText": "New last trial day. If it lies in the future, the tenant is writable again immediately; reminders are rescheduled.",
"convertTitle": "Convert to full version",
"convertText": "The tenant stays writable permanently and is never deleted automatically.",
"endTitle": "End trial now",
"endText": "The tenant is read-only from now on. A scheduled deletion moves to 30 days from today.",
"scheduleTitle": "Schedule deletion",
"scheduleText": "Deletion 30 days after the end, at the earliest in 7 days (notice mail to the admins).",
"cancelTitle": "Cancel deletion",
"cancelText": "The tenant will not be deleted automatically. It stays read-only after expiry.",
"confirm": "I confirm this change.",
"submit": "Execute",
"submitting": "Executing …",
"close": "Close"
},
"errors": {
"confirm_required": "Please tick the confirmation.",
"invalid_input": "Please check your input.",
"date_invalid": "Please choose a valid date.",
"date_in_past": "The end date must not lie in the past.",
"date_too_late": "The end date is more than one year ahead.",
"not_a_trial": "This tenant is not a trial.",
"tenant_deleted": "The tenant has already been deleted.",
"platform_admin_required": "Only platform full administrators may do this.",
"tenant not found": "Tenant not found.",
"failed": "The action failed."
}
}
}