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
+193 -7
View File
@@ -54,7 +54,8 @@
"more": "More",
"documents": "Documents",
"kitchen": "Kitchen",
"search": "Search"
"search": "Search",
"housekeeping": "Housekeeping"
},
"dashboard": {
"title": "Overview",
@@ -493,7 +494,10 @@
"colorPurple": "Purple",
"colorRed": "Red",
"colorSkyBlue": "Sky Blue",
"colorYellow": "Yellow"
"colorYellow": "Yellow",
"iconCleaning": "Cleaning",
"attachmentDocumentName": "{{title}} - {{name}}",
"attachmentDocumentDescription": "Attachment uploaded for calendar event \"{{title}}\"."
},
"notes": {
"title": "Board",
@@ -994,8 +998,6 @@
"caldavEmptyState": "No CalDAV accounts connected yet. Add your first account to get started.",
"caldavNameLabel": "Account Name",
"caldavNamePlaceholder": "e.g. My Radicale, iCloud, Nextcloud",
"caldavUrlLabel": "CalDAV Server URL",
"caldavUrlPlaceholder": "https://caldav.icloud.com",
"caldavUrlHint": "The base URL of your CalDAV server",
"caldavUsernameLabel": "Username",
"caldavPasswordLabel": "Password",
@@ -1034,7 +1036,31 @@
"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.",
"breadcrumbLabel": "Pfad",
"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.",
"navigationLabel": "Einstellungsnavigation",
"sectionAdmin": "Administration",
"sectionCloudServices": "Cloud-Dienste",
"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": "Family planning. Secure. Privacy-friendly. Open source.",
@@ -1177,7 +1203,7 @@
"noResults": "No results found."
},
"onboarding": {
"step1Title": "Welcome to Oikos",
"step1Title": "Welcome to {{name}}",
"step1Body": "Your personal family planner. Tasks, calendar, shopping and more all in one place.",
"step2Title": "Navigation & Modules",
"step2Body": "At the bottom you can directly access Dashboard and Calendar. The ··· button opens additional modules like Kitchen, Notes and Contacts.",
@@ -1271,6 +1297,166 @@
},
"dropzoneTitle": "Drop file here or click to choose",
"dropzoneHint": "Drag a file into this area, or use the file picker.",
"selectedFileLabel": "Selected: {{name}}"
"selectedFileLabel": "Selected: {{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": "HouseKeeping",
"calendarItemsFolder": "Calendar items",
"folderBrowserTitle": "Browse folders"
},
"housekeeping": {
"title": "Cleaner workspace",
"bottomNav": "Housekeeping navigation",
"home": "Home",
"tasks": "Tasks",
"report": "Report",
"notCheckedIn": "Not checked in",
"checkedInAt": "Checked in at",
"monthTotal": "Current month · {{count}} sessions",
"dailyRate": "Daily rate",
"extras": "Extras",
"checkIn": "Check in",
"checkOut": "Check out",
"quickSupply": "Missing product",
"supplyName": "Product name",
"supplyPlaceholder": "What is missing?",
"checkedInToast": "Check-in recorded.",
"checkedOutToast": "Check-out recorded.",
"supplyAddedToast": "Added to the shopping list.",
"overdue": "Overdue",
"dueToday": "Due today",
"ok": "OK",
"noTasks": "No housekeeping tasks yet.",
"everyDays": "Every {{days}} days",
"completeTask": "Complete {{name}}",
"taskDoneToast": "Task completed.",
"reportTitle": "Report a problem",
"problemDescription": "Problem description",
"problemPlaceholder": "Example: burnt-out light bulb",
"addPhoto": "Add photo",
"sendReport": "Send report",
"reportSentToast": "Problem reported.",
"recentReports": "Recent reports",
"addTask": "Add task",
"taskName": "Task",
"taskNamePlaceholder": "Example: Clean bathrooms",
"taskArea": "Area",
"taskAreaPlaceholder": "Example: Bathroom",
"taskFrequency": "Frequency",
"createTask": "Create task",
"taskCreatedToast": "Housekeeping task created.",
"dashboard": "Dashboard",
"reports": "Reports",
"visitsThisMonth": "Visits this month",
"lastVisit": "Last visit",
"pendingChores": "Pending chores",
"finishedChores": "Finished chores",
"payments": "Payments",
"pendingPayments": "Pending payments",
"monthlyPayments": "Monthly payments",
"noPaymentData": "No payment data yet.",
"noVisits": "No visits yet",
"noWorkerTitle": "No housekeeper profile",
"noWorkerHint": "Create the worker profile to define contacts, rate, and payment schedule.",
"taskTemplates": "Suggested chores",
"addCustomTask": "Add custom chore",
"noReports": "No reports yet.",
"profileTitle": "Housekeeper profile",
"profilePicture": "Housekeeper profile picture",
"workerName": "Name",
"workerUsername": "Username",
"workerPhone": "Phone",
"workerEmail": "Email",
"workerBirthDate": "Birthday",
"paymentSchedule": "Payment schedule",
"scheduleDaily": "Every visit",
"scheduleTwiceMonthly": "Twice a month",
"scheduleMonthly": "Monthly",
"profileColor": "Profile color",
"workerNotes": "Notes",
"workerSavedToast": "Housekeeper profile saved.",
"staff": "Staff",
"staffTitle": "Housekeeping staff",
"addWorker": "Add housekeeper",
"editWorker": "Edit housekeeper",
"noWorkers": "No housekeepers registered yet.",
"moreWorkers": "+{{count}} more",
"checkInDisabled": "Add a housekeeper before checking in.",
"calendarColor": "Calendar color",
"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": "Clean bathrooms",
"area": "Bathrooms"
},
"mopKitchenFloor": {
"name": "Mop kitchen floor",
"area": "Kitchen"
},
"dustLivingRoom": {
"name": "Dust living room",
"area": "Living room"
},
"changeBedLinens": {
"name": "Change bed linens",
"area": "Bedrooms"
},
"cleanRefrigerator": {
"name": "Clean refrigerator",
"area": "Kitchen"
},
"cleanWindows": {
"name": "Clean windows",
"area": "Whole house"
},
"deepCleanOven": {
"name": "Deep clean oven",
"area": "Kitchen"
},
"washOutdoor": {
"name": "Wash balcony/patio",
"area": "Outdoor"
}
}
},
"userMultiSelect": {
"moreUsers": "weitere",
"nobody": "- Niemand -"
}
}