05933a08ca
- V8 migration: audit_events table (JSONB metadata, immutable by design) - AuditEvent entity + AuditEventType enum (18 event types) - AuditService: log events, paginated query, PDF export - AuditController: GET /api/v1/audit (paginated, filtered), GET export - AuditEventRepository with JPQL filtered queries - Frontend: /audit-log page (read-only, filterable, timezone-aware) - PDF export button for Behörde inspections - Sidebar: 'Protokoll' under new Compliance section - PdfReportGenerator: generateAuditReport method added - 10-year retention, REVOKE DELETE documented - Full i18n (de/en) with 18 event type translations
449 lines
16 KiB
JSON
449 lines
16 KiB
JSON
{
|
||
"common": {
|
||
"appName": "CannaManage",
|
||
"loading": "Loading...",
|
||
"save": "Save",
|
||
"cancel": "Cancel",
|
||
"delete": "Delete",
|
||
"edit": "Edit",
|
||
"create": "Create",
|
||
"search": "Search",
|
||
"filter": "Filter",
|
||
"export": "Export",
|
||
"back": "Back",
|
||
"next": "Next",
|
||
"confirm": "Confirm",
|
||
"yes": "Yes",
|
||
"no": "No",
|
||
"noData": "No data available"
|
||
},
|
||
"nav": {
|
||
"dashboard": "Dashboard",
|
||
"members": "Members",
|
||
"stock": "Stock",
|
||
"distributions": "Distributions",
|
||
"compliance": "Compliance",
|
||
"reports": "Reports",
|
||
"settings": "Settings",
|
||
"staff": "Staff",
|
||
"portal": "Member Portal"
|
||
},
|
||
"auth": {
|
||
"login": "Sign In",
|
||
"logout": "Sign Out",
|
||
"email": "Email address",
|
||
"password": "Password",
|
||
"forgotPassword": "Forgot password?",
|
||
"resetPassword": "Reset Password",
|
||
"loginButton": "Sign In",
|
||
"loggingIn": "Signing in...",
|
||
"loginSubtitle": "Sign in to your cannabis club",
|
||
"invalidCredentials": "Invalid email address or password.",
|
||
"networkError": "Connection error. Please try again.",
|
||
"sessionExpired": "Your session has expired. Please sign in again.",
|
||
"emailInvalid": "Please enter a valid email address.",
|
||
"passwordRequired": "Please enter your password.",
|
||
"passwordTooShort": "Password must be at least 8 characters.",
|
||
"footerText": "Secure management for your cannabis cultivation club"
|
||
},
|
||
"dashboard": {
|
||
"title": "Dashboard",
|
||
"activeMembers": "Active Members",
|
||
"distributionsToday": "Distributions Today",
|
||
"stockLevel": "Stock Level",
|
||
"monthlyQuota": "Monthly Quota",
|
||
"quickActions": "Quick Actions",
|
||
"newDistribution": "New Distribution",
|
||
"addMember": "Add Member",
|
||
"recentDistributions": "Recent Distributions",
|
||
"stockByStrain": "Stock by Strain",
|
||
"date": "Date",
|
||
"member": "Member",
|
||
"strain": "Strain",
|
||
"amount": "Amount (g)",
|
||
"staff": "Staff",
|
||
"grams": "g",
|
||
"today": "Today",
|
||
"trend": "+{value}% vs last month",
|
||
"quotaUsed": "{value}% used",
|
||
"distributionCount": "{count} distributions, {grams}g"
|
||
},
|
||
"members": {
|
||
"title": "Member Management",
|
||
"addMember": "Add Member",
|
||
"name": "Name",
|
||
"email": "Email",
|
||
"status": "Status",
|
||
"memberSince": "Member Since",
|
||
"quota": "Quota",
|
||
"actions": "Actions",
|
||
"edit": "Edit",
|
||
"active": "Active",
|
||
"suspended": "Suspended",
|
||
"expelled": "Expelled",
|
||
"back": "Back to List",
|
||
"save": "Save",
|
||
"create": "Create Member",
|
||
"firstName": "First Name",
|
||
"lastName": "Last Name",
|
||
"dateOfBirth": "Date of Birth",
|
||
"phone": "Phone",
|
||
"memberNumber": "Member Number",
|
||
"joinedAt": "Joined At",
|
||
"notes": "Notes",
|
||
"notesPlaceholder": "Optional notes about the member...",
|
||
"under21Warning": "Under 21 — reduced quota (30g/month)",
|
||
"ageError": "Members must be at least 18 years old.",
|
||
"saved": "Changes saved.",
|
||
"created": "Member created successfully.",
|
||
"search": "Search name or email...",
|
||
"perPage": "Per page",
|
||
"showing": "{from}–{to} of {total}",
|
||
"previous": "Previous",
|
||
"next": "Next",
|
||
"noResults": "No members found.",
|
||
"notFound": "Member not found.",
|
||
"personalInfo": "Personal Information",
|
||
"membershipInfo": "Membership"
|
||
},
|
||
"stock": {
|
||
"title": "Stock & Batches",
|
||
"newBatch": "New Batch",
|
||
"stockOverview": "Stock Overview",
|
||
"batchId": "Batch ID",
|
||
"strain": "Strain",
|
||
"thc": "THC %",
|
||
"cbd": "CBD %",
|
||
"status": "Status",
|
||
"available": "Available",
|
||
"availableGrams": "Available (g)",
|
||
"receivedAt": "Received",
|
||
"actions": "Actions",
|
||
"statusAvailable": "Available",
|
||
"statusRecalled": "Recalled",
|
||
"statusDepleted": "Depleted",
|
||
"recall": "Recall",
|
||
"recallConfirm": "Really recall this batch? All open distributions with this batch will be blocked.",
|
||
"recallTitle": "Recall Batch",
|
||
"recallSuccess": "Batch recalled.",
|
||
"totalBatches": "Total Batches",
|
||
"availableStock": "Available Stock",
|
||
"recalledBatches": "Recalled Batches",
|
||
"strainCount": "Strains",
|
||
"filterAll": "All",
|
||
"filterAvailable": "Available only",
|
||
"filterRecalled": "Recalled only",
|
||
"addBatch": "Add Batch",
|
||
"strainName": "Strain Name",
|
||
"amount": "Amount (g)",
|
||
"supplier": "Supplier / Origin",
|
||
"harvestDate": "Harvest Date",
|
||
"notes": "Notes",
|
||
"notesPlaceholder": "Optional notes about the batch...",
|
||
"created": "Batch created successfully.",
|
||
"grams": "g",
|
||
"confirmRecall": "Confirm Recall",
|
||
"lowStock": "Low"
|
||
},
|
||
"distributions": {
|
||
"title": "Distributions",
|
||
"newDistribution": "New Distribution",
|
||
"todaySummary": "Today: {count} distributions, {grams}g distributed",
|
||
"dateTime": "Date/Time",
|
||
"member": "Member",
|
||
"strain": "Strain",
|
||
"amount": "Amount (g)",
|
||
"staff": "Staff",
|
||
"status": "Status",
|
||
"completed": "Completed",
|
||
"locked": "Locked (immutable)",
|
||
"filterToday": "Today",
|
||
"filterWeek": "This Week",
|
||
"filterMonth": "This Month",
|
||
"searchMember": "Search member...",
|
||
"step1": "Select Member",
|
||
"step2": "Check Quota",
|
||
"step3": "Strain & Amount",
|
||
"step4": "Confirmation",
|
||
"selectMember": "Search member (name or number)...",
|
||
"memberBlocked": "Member is blocked — distribution not possible.",
|
||
"under21Info": "Reduced quota: 30g/month (under 21)",
|
||
"dailyRemaining": "Daily remaining",
|
||
"monthlyRemaining": "Monthly remaining",
|
||
"selectBatch": "Select batch",
|
||
"available": "available",
|
||
"amountLabel": "Amount in grams",
|
||
"exceedsDaily": "Exceeds daily limit ({limit}g).",
|
||
"exceedsMonthly": "Exceeds monthly limit ({limit}g).",
|
||
"exceedsBatch": "Insufficient stock in this batch.",
|
||
"confirm": "Confirm Distribution",
|
||
"summary": "Summary",
|
||
"success": "Distribution recorded successfully.",
|
||
"grams": "g",
|
||
"date": "Date",
|
||
"monthlyQuota": "Monthly Quota",
|
||
"remaining": "Remaining"
|
||
},
|
||
"reports": {
|
||
"title": "Reports",
|
||
"monthly": "Monthly Report",
|
||
"monthlyDesc": "Overview of all distributions in the selected month, including member quotas and stock changes.",
|
||
"memberList": "Member List",
|
||
"memberListDesc": "Complete member list with status, quota utilization and contact details.",
|
||
"recall": "Recall Report",
|
||
"recallDesc": "All batches with recall status and affected distributions for regulatory reporting.",
|
||
"downloadPdf": "Download as PDF",
|
||
"downloadCsv": "Download as CSV",
|
||
"preview": "Show Preview",
|
||
"generating": "Generating report...",
|
||
"downloaded": "{name} downloaded.",
|
||
"selectMonth": "Select month",
|
||
"selectStatus": "Filter by status",
|
||
"allStatuses": "All",
|
||
"activeOnly": "Active",
|
||
"suspendedOnly": "Suspended",
|
||
"dateFrom": "From",
|
||
"dateTo": "To",
|
||
"previewTitle": "Report Preview",
|
||
"totalDistributions": "Total Distributions",
|
||
"totalGrams": "Total Grams",
|
||
"uniqueMembers": "Unique Members",
|
||
"averagePerMember": "Avg per Member",
|
||
"topStrains": "Top Strains",
|
||
"affectedDistributions": "Affected Distributions",
|
||
"affectedMembers": "Affected Members",
|
||
"recalledBatches": "Recalled Batches",
|
||
"close": "Close",
|
||
"complianceNote": "This report is suitable for submission to the responsible authority.",
|
||
"complianceBadge": "§19 KCanG compliant",
|
||
"auditTrail": "All reports are generated with timestamps. The underlying distribution data is immutable (audit trail).",
|
||
"memberNumber": "No.",
|
||
"name": "Name",
|
||
"status": "Status",
|
||
"joinedAt": "Joined",
|
||
"usage": "Usage",
|
||
"strain": "Strain",
|
||
"grams": "Grams",
|
||
"percent": "Share",
|
||
"batchId": "Batch ID",
|
||
"recalledAt": "Recalled on",
|
||
"reason": "Reason",
|
||
"distributed": "Distributed",
|
||
"original": "Original"
|
||
},
|
||
"portal": {
|
||
"title": "My Area",
|
||
"login": "Member Login",
|
||
"loginSubtitle": "Sign in to the member portal",
|
||
"email": "Email address",
|
||
"password": "Password",
|
||
"loginButton": "Sign In",
|
||
"loggingIn": "Signing in...",
|
||
"invalidCredentials": "Invalid email address or password.",
|
||
"networkError": "Connection error. Please try again.",
|
||
"welcome": "Welcome back, {name}!",
|
||
"dashboard": "Overview",
|
||
"quota": "My Quota",
|
||
"history": "Distribution History",
|
||
"profile": "Profile",
|
||
"settings": "Settings",
|
||
"logout": "Sign Out",
|
||
"dailyQuota": "Daily Quota",
|
||
"monthlyQuota": "Monthly Quota",
|
||
"remaining": "remaining",
|
||
"used": "used",
|
||
"of": "of",
|
||
"lastDistribution": "Last Distribution",
|
||
"noDistributions": "No distributions this month yet.",
|
||
"memberSince": "Member since",
|
||
"memberNumber": "Member number",
|
||
"nextAvailable": "Next available",
|
||
"nextAvailableTomorrow": "Tomorrow at 00:00",
|
||
"changePassword": "Change Password",
|
||
"currentPassword": "Current Password",
|
||
"newPassword": "New Password",
|
||
"confirmPassword": "Confirm Password",
|
||
"passwordChanged": "Password changed successfully.",
|
||
"passwordMismatch": "Passwords do not match.",
|
||
"club": "My Club",
|
||
"quotaWarning": "Warning: You have already used {percent}% of your monthly quota.",
|
||
"under21Notice": "For members under 21: Reduced quota of 30g/month (§19 Abs. 3 KCanG).",
|
||
"grams": "g",
|
||
"date": "Date",
|
||
"strain": "Strain",
|
||
"amount": "Amount",
|
||
"recordedBy": "Recorded by",
|
||
"noHistory": "No distributions recorded yet.",
|
||
"personalInfo": "Personal Information",
|
||
"language": "Language",
|
||
"theme": "Theme",
|
||
"themeLight": "Light",
|
||
"themeDark": "Dark",
|
||
"themeSystem": "System",
|
||
"german": "German",
|
||
"english": "English",
|
||
"quickInfo": "Quick Info",
|
||
"todayAvailable": "Available today",
|
||
"monthAvailable": "Available this month",
|
||
"limitReached": "Limit reached",
|
||
"pagination": "{from}–{to} of {total}",
|
||
"previous": "Previous",
|
||
"next": "Next",
|
||
"allMonths": "All months",
|
||
"footerText": "Cannabis cultivation club — Secure member management",
|
||
"adminLogin": "Go to Admin Login"
|
||
},
|
||
"staff": {
|
||
"title": "Staff",
|
||
"invite": "Invite New Member",
|
||
"name": "Name",
|
||
"email": "Email",
|
||
"role": "Role",
|
||
"permissions": "Permissions",
|
||
"status": "Status",
|
||
"actions": "Actions",
|
||
"active": "Active",
|
||
"revoked": "Revoked",
|
||
"invited": "Invited",
|
||
"editPermissions": "Edit Permissions",
|
||
"revokeAccess": "Revoke Access",
|
||
"revokeConfirm": "Really revoke access for {name}? The staff member will no longer be able to sign in.",
|
||
"revokeSuccess": "Access revoked.",
|
||
"inviteTitle": "Invite Staff Member",
|
||
"inviteDesc": "Invite a new team member via email and assign permissions.",
|
||
"inviteEmail": "Email address",
|
||
"inviteRole": "Role template",
|
||
"roleAusgabe": "Distribution",
|
||
"roleLager": "Stock",
|
||
"roleVorstand": "Board",
|
||
"roleCustom": "Custom",
|
||
"inviteSend": "Send Invitation",
|
||
"inviteSuccess": "Invitation sent to {email}.",
|
||
"permRecordDistribution": "Record Distribution",
|
||
"permViewMemberList": "View Member List",
|
||
"permViewMemberQuota": "View Quota",
|
||
"permAddMember": "Add Members",
|
||
"permViewStock": "View Stock",
|
||
"permRecordStockIn": "Record Stock In",
|
||
"permViewComplianceReport": "View Reports",
|
||
"permManageGrowCalendar": "Manage Grow Calendar",
|
||
"savePermissions": "Save",
|
||
"permissionsSaved": "Permissions updated.",
|
||
"cancel": "Cancel",
|
||
"noStaff": "No staff members yet."
|
||
},
|
||
"api": {
|
||
"loading": "Loading...",
|
||
"error": "Failed to load data.",
|
||
"retry": "Try again",
|
||
"offline": "No connection to server — data may be outdated.",
|
||
"networkError": "Network error. Please check your connection.",
|
||
"unauthorized": "Session expired. Please sign in again.",
|
||
"forbidden": "You do not have permission for this action.",
|
||
"notFound": "Resource not found.",
|
||
"quotaExceeded": "Quota exceeded.",
|
||
"serverError": "Server error. Please try again later."
|
||
},
|
||
"consent": {
|
||
"title": "Privacy Consent",
|
||
"dataProcessing": "Data Processing",
|
||
"dataProcessingDesc": "I consent to the processing of my personal data (name, email, date of birth, distribution history) for the purpose of club management. Legal basis: Art. 6(1)(a) GDPR.",
|
||
"marketing": "Marketing Notifications",
|
||
"marketingDesc": "I would like to receive information about new features and offers.",
|
||
"accept": "I agree",
|
||
"reject": "Decline and delete account",
|
||
"required": "Required",
|
||
"revoke": "Revoke consent",
|
||
"revokeWarning": "Without consent for data processing, the service cannot be used.",
|
||
"granted": "Granted on",
|
||
"revoked": "Revoked"
|
||
},
|
||
"dsgvo": {
|
||
"title": "Privacy",
|
||
"export": "Export my data",
|
||
"exportDesc": "Download all data stored about you as a JSON file (Art. 15 GDPR).",
|
||
"exportButton": "Download data",
|
||
"exporting": "Compiling data...",
|
||
"exported": "Data export downloaded.",
|
||
"delete": "Delete account and data",
|
||
"deleteDesc": "All personal data will be irreversibly deleted or anonymized (Art. 17 GDPR). Distribution data will be retained in anonymized form (legal retention requirement).",
|
||
"deleteButton": "Permanently delete account",
|
||
"deleteConfirm": "Are you sure? This action cannot be undone.",
|
||
"deleteSuccess": "Your account has been deleted. You will now be logged out."
|
||
},
|
||
"billing": {
|
||
"title": "Plan & Billing",
|
||
"currentPlan": "Current Plan",
|
||
"trial": "Free Trial",
|
||
"starter": "Starter",
|
||
"pro": "Pro",
|
||
"enterprise": "Enterprise",
|
||
"trialEnds": "Trial ends on {date}",
|
||
"trialExpired": "Your trial has expired. Choose a plan to continue.",
|
||
"trialDaysLeft": "{days} days remaining",
|
||
"memberLimit": "Member limit",
|
||
"membersUsed": "{used} / {limit} members",
|
||
"price": "{price}/month",
|
||
"nextBilling": "Next billing date",
|
||
"upgrade": "Upgrade plan",
|
||
"manageBilling": "Manage payment details",
|
||
"invoices": "Invoices",
|
||
"noInvoices": "No invoices yet.",
|
||
"starterDesc": "For small clubs up to 30 members",
|
||
"proDesc": "For growing clubs up to 100 members",
|
||
"enterpriseDesc": "For large clubs — unlimited members",
|
||
"starterPrice": "€19",
|
||
"proPrice": "€49",
|
||
"enterprisePrice": "On request",
|
||
"selectPlan": "Select plan",
|
||
"active": "Active",
|
||
"pastDue": "Past due",
|
||
"canceled": "Canceled"
|
||
},
|
||
"audit": {
|
||
"title": "Audit Log",
|
||
"subtitle": "Immutable log of all operations (10-year retention)",
|
||
"timestamp": "Timestamp",
|
||
"type": "Type",
|
||
"description": "Description",
|
||
"actor": "Actor",
|
||
"entity": "Entity",
|
||
"filterType": "Filter by event type",
|
||
"filterDateFrom": "From",
|
||
"filterDateTo": "To",
|
||
"filterActor": "Search actor",
|
||
"exportPdf": "Export as PDF",
|
||
"exporting": "Generating PDF...",
|
||
"exported": "Audit log exported.",
|
||
"allTypes": "All types",
|
||
"immutable": "Immutable",
|
||
"timezone": "Europe/Berlin",
|
||
"retentionNote": "Retention period: 10 years (KCanG-compliant)",
|
||
"types": {
|
||
"DISTRIBUTION_RECORDED": "Distribution recorded",
|
||
"DISTRIBUTION_VOIDED": "Distribution voided",
|
||
"MEMBER_CREATED": "Member created",
|
||
"MEMBER_UPDATED": "Member updated",
|
||
"MEMBER_SUSPENDED": "Member suspended",
|
||
"MEMBER_EXPELLED": "Member expelled",
|
||
"BATCH_CREATED": "Batch created",
|
||
"BATCH_RECALLED": "Batch recalled",
|
||
"LOGIN_SUCCESS": "Login",
|
||
"LOGIN_FAILED": "Failed login",
|
||
"LOGOUT": "Logout",
|
||
"PASSWORD_CHANGED": "Password changed",
|
||
"STAFF_INVITED": "Staff invited",
|
||
"STAFF_PERMISSIONS_CHANGED": "Permissions changed",
|
||
"STAFF_REVOKED": "Access revoked",
|
||
"CONSENT_GRANTED": "Consent granted",
|
||
"CONSENT_REVOKED": "Consent revoked",
|
||
"DATA_EXPORTED": "Data exported",
|
||
"DATA_DELETED": "Data deleted",
|
||
"SUBSCRIPTION_STARTED": "Subscription started",
|
||
"SUBSCRIPTION_CANCELED": "Subscription canceled",
|
||
"PAYMENT_RECEIVED": "Payment received",
|
||
"PAYMENT_FAILED": "Payment failed"
|
||
}
|
||
}
|
||
}
|