feat: add housekeeping module for household staff management

* Adding flexible reminder options to birthdays

* Fix database migration merge conflict

* Truncate calendar popup descriptions

* Log app version on backend startup

* Add host-mounted data and backup folders

* feat: add housekeeping module

* fix: align housekeeping UI and add task creation

* refactor: rebuild housekeeping experience

* feat: support multiple housekeeping staff

* feat: integrate housekeeping visits with calendar

* feat: refine housekeeping visits and payments

* feat: add housekeeping staff visit logs

* feat: add housekeeping receipts and document folders

* feat: localize housekeeping folders and chores

* feat: refine housekeeping tabs and document folders

* fix: sync housekeeping tab active state

* feat: use configured app name in onboarding and manifest
This commit is contained in:
Rafael Foster
2026-05-08 15:14:51 -03:00
committed by GitHub
parent d19689a1ab
commit 22ec13e559
38 changed files with 7127 additions and 235 deletions
+250 -7
View File
@@ -54,7 +54,8 @@
"more": "Mer",
"documents": "Dokument",
"kitchen": "Kök",
"search": "Sök"
"search": "Sök",
"housekeeping": "Städning"
},
"dashboard": {
"title": "Översikt",
@@ -205,7 +206,18 @@
"kanbanArchived": "Arkiverad",
"reminderNeedsDueDate": "Ange ett förfallodatum för att aktivera påminnelser för uppgiften.",
"emptyAction": "Skapa uppgift",
"navLabelOverdue": "Uppgifter, {{count}} försenade"
"navLabelOverdue": "Uppgifter, {{count}} försenade",
"bulkArchive": "Archive",
"bulkArchived": "Tasks archived.",
"bulkDelete": "Delete",
"bulkDeleteConfirm": "Delete {{count}} tasks permanently?",
"bulkDeleted": "Tasks deleted.",
"bulkMarkDone": "Mark done",
"bulkMarkOpen": "Mark open",
"bulkSelect": "Bulk select",
"bulkSelectedCount": "{{count}} selected",
"bulkStatusChanged": "Status changed.",
"selectTask": "Select task"
},
"shopping": {
"title": "Shopping",
@@ -479,7 +491,13 @@
"colorSkyBlue": "Himmelsblå",
"colorYellow": "Gul",
"colorGray": "Grå",
"colorCyan": "Cyan"
"colorCyan": "Cyan",
"iconCleaning": "Städning",
"caldavTargetHint": "Choose a CalDAV calendar to sync this event.",
"caldavTargetLabel": "Sync to CalDAV",
"caldavTargetLocal": "Store locally only",
"attachmentDocumentName": "{{title}} - {{name}}",
"attachmentDocumentDescription": "Bilaga uppladdad för kalenderhändelsen \"{{title}}\"."
},
"notes": {
"title": "Anteckningar",
@@ -977,7 +995,72 @@
"addressbookEnabled": "Addressbook enabled",
"addressbookDisabled": "Addressbook disabled",
"addressbooksRefreshed": "Addressbooks refreshed",
"deleteCardDAVAccountConfirm": "Really delete CardDAV account? All synced contacts will remain but lose their CardDAV link."
"deleteCardDAVAccountConfirm": "Really delete CardDAV account? All synced contacts will remain but lose their CardDAV link.",
"sectionHousekeeping": "Housekeeping",
"housekeepingPaymentsTitle": "Payment tasks",
"housekeepingPaymentTasksLabel": "Create a payment task on each housekeeper check-in",
"housekeepingPaymentTasksHint": "When enabled, each check-in creates a task for paying the staff member. Completing that task marks the visit payment as paid.",
"housekeepingPaymentTasksSaved": "Housekeeping payment setting saved.",
"backupSchedulerDisabled": "Disabled",
"backupSchedulerEnabled": "Enabled",
"backupSchedulerHint": "Scheduled backups are created automatically and old backups are rotated.",
"backupSchedulerKeep": "Retention",
"backupSchedulerKeepCount": "{{count}} backups",
"backupSchedulerLastBackup": "Last backup",
"backupSchedulerLastFail": "{{date}} (failed)",
"backupSchedulerLastSuccess": "{{date}} (successful)",
"backupSchedulerNever": "No backup created yet",
"backupSchedulerSchedule": "Schedule",
"backupSchedulerStatus": "Status",
"backupSchedulerTitle": "Automatic Backups",
"backupSchedulerTrigger": "Create backup now",
"backupSchedulerTriggeredToast": "Backup created successfully.",
"backupSchedulerTriggering": "Creating backup...",
"breadcrumbLabel": "Pfad",
"caldavAccountAdded": "CalDAV account added successfully",
"caldavAccountDeleted": "CalDAV account removed",
"caldavAddAccount": "Add CalDAV Account",
"caldavCalendarsToggle": "Show/hide calendars",
"caldavConnectionFailed": "Connection to CalDAV server failed",
"caldavDescription": "Connect multiple CalDAV accounts (iCloud, Nextcloud, Radicale, Baikal, etc.) and choose which calendars to sync.",
"caldavEmptyState": "No CalDAV accounts connected yet. Add your first account to get started.",
"caldavNameLabel": "Account Name",
"caldavNamePlaceholder": "e.g. My Radicale, iCloud, Nextcloud",
"caldavPasswordHint": "For iCloud: Use app-specific password from appleid.apple.com",
"caldavPasswordLabel": "Password",
"caldavRefreshCalendars": "Refresh calendars",
"caldavSyncFailed": "CalDAV sync failed",
"caldavSyncSuccess": "CalDAV sync successful",
"caldavTitle": "CalDAV Calendars",
"caldavUrlHint": "The base URL of your CalDAV server",
"caldavUsernameLabel": "Username",
"calendarDisabled": "Calendar disabled",
"calendarEnabled": "Calendar enabled",
"calendarsRefreshed": "Calendars refreshed",
"deleteAccountConfirm": "Really delete CalDAV account? All synced calendars will be removed.",
"emptyStateAddFirst": "Füge dein erstes Konto hinzu",
"emptyStateNoAccounts": "Noch keine Konten verbunden",
"helpTooltipCalDAV": "CalDAV ermöglicht die Synchronisation von Kalendern mit iCloud, Nextcloud und anderen CalDAV-Servern.",
"helpTooltipCardDAV": "CardDAV ermöglicht die Synchronisation von Kontakten mit iCloud, Nextcloud und anderen CardDAV-Servern.",
"lastSync": "Last synced",
"modulesHint": "Disabled modules disappear from the navigation. Data is preserved and reappears once a module is re-enabled.",
"modulesSaved": "Module visibility saved.",
"modulesTitle": "Active modules",
"navigationLabel": "Einstellungsnavigation",
"sectionAdmin": "Administration",
"sectionCloudServices": "Cloud-Dienste",
"sectionModules": "Modules",
"sectionModulesNav": "Module",
"sectionOpenStandards": "CalDAV & CardDAV",
"sectionPersonal": "Persönlich",
"sectionSync": "Synchronisation",
"statusError": "Fehler",
"statusNeverSynced": "Noch nie synchronisiert",
"statusSynced": "Synchronisiert",
"statusSyncing": "Synchronisiert…",
"syncedAgo": "vor {{time}}",
"tabSyncCalendar": "Kalender",
"tabSyncContacts": "Kontakte"
},
"login": {
"tagline": "Familjeplanering. Säker. Sekretessvänlig. Öppen källkod.",
@@ -1120,7 +1203,7 @@
"customWeeks": "Veckor"
},
"onboarding": {
"step1Title": "Välkommen till Oikos",
"step1Title": "Välkommen till {{name}}",
"step1Body": "Din personliga familjeplanerare. Uppgifter, kalender, shopping och mer allt på ett ställe.",
"step2Title": "Navigering och moduler",
"step2Body": "Nere på skärmen når du direkt Översikt och Kalender. Med ···-knappen öppnar du fler moduler som Kök, Anteckningar och Kontakter.",
@@ -1203,7 +1286,18 @@
},
"dropzoneTitle": "Släpp filen här eller klicka för att välja",
"dropzoneHint": "Dra en fil till området eller använd filväljaren.",
"selectedFileLabel": "Vald: {{name}}"
"selectedFileLabel": "Vald: {{name}}",
"addFolderButton": "Add folder",
"allFolders": "All folders",
"folderLabel": "Folder",
"noFolder": "No folder",
"newFolderTitle": "New folder",
"folderNameLabel": "Folder name",
"createFolderAction": "Create folder",
"folderCreatedToast": "Folder created.",
"housekeepingFolder": "Städning",
"calendarItemsFolder": "Kalenderobjekt",
"folderBrowserTitle": "Bläddra bland mappar"
},
"shortcuts": {
"goKitchen": "Kök",
@@ -1215,5 +1309,154 @@
"goCal": "Kalender",
"goShop": "Inköpslista",
"goNotes": "Anteckningar"
},
"housekeeping": {
"title": "Städyta",
"bottomNav": "Städnavigation",
"home": "Hem",
"tasks": "Uppgifter",
"report": "Rapportera",
"notCheckedIn": "Inte incheckad",
"checkedInAt": "Incheckad kl.",
"monthTotal": "Aktuell månad · {{count}} pass",
"dailyRate": "Dagspris",
"extras": "Extra",
"checkIn": "Checka in",
"checkOut": "Checka ut",
"quickSupply": "Produkt saknas",
"supplyName": "Produkt",
"supplyPlaceholder": "Vad saknas?",
"checkedInToast": "Incheckning sparad.",
"checkedOutToast": "Utcheckning sparad.",
"supplyAddedToast": "Tillagd i inköpslistan.",
"overdue": "Försenad",
"dueToday": "Idag",
"ok": "OK",
"noTasks": "Inga städuppgifter ännu.",
"everyDays": "Var {{days}} dag",
"completeTask": "Slutför {{name}}",
"taskDoneToast": "Uppgift slutförd.",
"reportTitle": "Rapportera problem",
"problemDescription": "Problembeskrivning",
"problemPlaceholder": "Exempel: trasig lampa",
"addPhoto": "Lägg till foto",
"sendReport": "Skicka",
"reportSentToast": "Problem rapporterat.",
"recentReports": "Senaste rapporter",
"addTask": "Lägg till uppgift",
"taskName": "Uppgift",
"taskNamePlaceholder": "Exempel: städa badrum",
"taskArea": "Område",
"taskAreaPlaceholder": "Exempel: badrum",
"taskFrequency": "Frekvens",
"createTask": "Skapa uppgift",
"taskCreatedToast": "Städuppgift skapad.",
"dashboard": "Översikt",
"reports": "Reports",
"visitsThisMonth": "Besök denna månad",
"lastVisit": "Senaste besök",
"pendingChores": "Väntande uppgifter",
"finishedChores": "Klarmarkerade uppgifter",
"payments": "Betalningar",
"pendingPayments": "Väntande betalningar",
"monthlyPayments": "Månadsbetalningar",
"noPaymentData": "Inga betalningsdata ännu.",
"noVisits": "Inga besök ännu",
"noWorkerTitle": "Ingen städprofil",
"noWorkerHint": "Skapa profilen för kontakt, dagspris och betalningsschema.",
"taskTemplates": "Föreslagna uppgifter",
"addCustomTask": "Lägg till egen uppgift",
"noReports": "Inga rapporter ännu.",
"profileTitle": "Städprofil",
"profilePicture": "Profilbild",
"workerName": "Namn",
"workerUsername": "Användarnamn",
"workerPhone": "Telefon",
"workerEmail": "E-post",
"workerBirthDate": "Födelsedag",
"paymentSchedule": "Betalningsschema",
"scheduleDaily": "Varje besök",
"scheduleTwiceMonthly": "Två gånger per månad",
"scheduleMonthly": "Månadsvis",
"profileColor": "Profilfärg",
"workerNotes": "Anteckningar",
"workerSavedToast": "Städprofil sparad.",
"staff": "Personal",
"staffTitle": "Städpersonal",
"addWorker": "Lägg till person",
"editWorker": "Redigera person",
"noWorkers": "Ingen städpersonal registrerad.",
"moreWorkers": "+{{count}} fler",
"checkInDisabled": "Lägg till personal innan incheckning.",
"calendarColor": "Kalenderfärg",
"visitRecordedAt": "Visit recorded at",
"checkedInToday": "Recorded today",
"visitReports": "Staff visit reports",
"noVisitReports": "No staff visits recorded this month.",
"openVisitReport": "Open visit report",
"visitReportDetails": "Visit report",
"paymentPaid": "Paid",
"paymentPending": "Pending",
"totalPayment": "Total payment",
"paymentStatus": "Payment status",
"paymentTask": "Payment task",
"calendarEvent": "Calendar event",
"notAvailable": "Not available",
"calendarVisitTitle": "Housekeeping: {{name}}",
"paymentTaskTitle": "Pay {{name}} for housekeeping",
"paymentTaskDescription": "Housekeeping visit on {{date}}. Amount due: {{amount}}.",
"staffLogTitle": "{{name}} visits",
"staffLogHint": "Edit visit dates, amounts, and linked records.",
"filterMonth": "Month",
"editVisit": "Edit visit",
"deleteVisit": "Delete visit",
"deleteVisitConfirm": "Delete this visit? The linked calendar event and payment task will also be removed.",
"visitDeletedToast": "Visit deleted.",
"visitSavedToast": "Visit updated.",
"visitDate": "Visit date",
"markPaid": "Mark paid",
"visitPaidToast": "Payment marked as paid.",
"receiptUploadTitle": "Upload payment receipt",
"receiptUploadHint": "Attach a payment receipt. It will appear in Documents.",
"receiptDocumentName": "Receipt - {{name}} - {{date}}",
"receiptDocumentDescription": "Payment receipt for {{name}} housekeeping visit on {{date}}.",
"taskTemplateData": {
"cleanBathrooms": {
"name": "Städa badrum",
"area": "Badrum"
},
"mopKitchenFloor": {
"name": "Moppa köksgolvet",
"area": "Kök"
},
"dustLivingRoom": {
"name": "Damma vardagsrummet",
"area": "Vardagsrum"
},
"changeBedLinens": {
"name": "Byt sängkläder",
"area": "Sovrum"
},
"cleanRefrigerator": {
"name": "Rengör kylskåpet",
"area": "Kök"
},
"cleanWindows": {
"name": "Putsa fönster",
"area": "Hela huset"
},
"deepCleanOven": {
"name": "Djuprengör ugnen",
"area": "Kök"
},
"washOutdoor": {
"name": "Tvätta balkong/uteplats",
"area": "Utomhus"
}
}
},
"userMultiSelect": {
"moreUsers": "weitere",
"nobody": "- Niemand -"
}
}
}