# Haushalt — Aufgabenverwaltung ## Tech-Stack | Schicht | Technologie | |---------|------------| | Backend | Symfony 7.4, PHP 8.2+, Doctrine ORM 3.6 | | Frontend Web | Vue 3 (Composition API), Vite 8, Pinia, Vue Router 4 | | Datenbank | MySQL/MariaDB (utf8mb4) | | CORS | Nelmio CORS Bundle | | Umgebung | DDEV | ## Domain-Modell **TaskSchema** — Vorlage/Template für Aufgaben - Felder: name, status, taskType, category, deadline, startDate, endDate, weekdays, monthDays, yearDays - TaskSchemaStatus: Active (`aktiv`), Completed (`erledigt`), Inactive (`inaktiv`) - TaskSchemaType: Single (`einzel`), Daily (`taeglich`), Multi (`multi`), Weekly (`woechentlich`), Monthly (`monatlich`), Yearly (`jaehrlich`) **Task** — Einzelne Aufgabe (Instanz eines Schemas) - Felder: schema (FK), name (Override), category (Override), categoryOverridden, date, status, createdAt - TaskStatus: Active (`aktiv`), Completed (`erledigt`) - Kann Name und Kategorie pro Instanz überschreiben (`getEffectiveName()`, `getEffectiveCategory()`) - Unique Constraint: (schema_id, date) **Category** — Farbkodierte Kategorie - Felder: id, name, color (Hex #RRGGBB) Enum-Case-Namen sind Englisch, String-Werte bleiben Deutsch (in DB gespeichert). ## Architektur (Backend) ``` Controller → Service (Manager) → Repository → Entity ↓ DTO (Request/Response) ``` **Prinzipien:** - Controller: nur Routing + Response, keine Geschäftslogik - Manager-Services: Geschäftslogik (CRUD, Validierung, Toggle) - DTOs: typisierter Input (Request) und Output (Response) - Validierung: nur auf Request-DTOs (`#[Assert\...]`), nicht auf Entities - Exceptions: `ValidationException` (eigener Listener), `HttpException` (Symfony built-in) - Entities: nur Doctrine-Mapping + Getter/Setter ## Verzeichnisstruktur (Backend) ``` backend/src/ Controller/Api/ CategoryController.php — Category CRUD TaskController.php — Task show/update/delete TaskSchemaController.php — Schema CRUD + week view + toggle DTO/ Request/ — CreateSchemaRequest, UpdateSchemaRequest, UpdateTaskRequest, ToggleRequest, CreateCategoryRequest, UpdateCategoryRequest, SchemaValidationTrait Response/ — TaskResponse, CategoryResponse, WeekViewResponse, DayResponse, ToggleResponse Entity/ Category.php, Task.php, TaskSchema.php Enum/ TaskStatus.php, TaskSchemaStatus.php, TaskSchemaType.php Repository/ CategoryRepository.php, TaskRepository.php, TaskSchemaRepository.php Service/ CategoryManager.php — Category CRUD-Logik TaskManager.php — Task Update/Delete/Toggle TaskSchemaManager.php — Schema CRUD + Sync-Auslösung TaskGenerator.php — Erzeugt Task-Instanzen für Zeiträume TaskSynchronizer.php — Sync nach Schema-Update (löschen/erstellen/reset) DeadlineCalculator.php — Berechnet Fälligkeitsdaten für ein Schema TaskViewBuilder.php — Baut Wochenansicht + Alle-Aufgaben-View TaskSerializer.php — Task/Category → Response-DTOs ``` ## API-Routen ### Categories (`/api/categories`) ``` GET / — Alle Kategorien GET /{id} — Einzelne Kategorie POST / — Erstellen PUT /{id} — Aktualisieren DELETE /{id} — Löschen ``` ### Schemas (`/api/schemas`) ``` GET / — Alle Schemas GET /week?start=DATE — Wochenansicht (7 Tage) GET /all — Alle Schemas sortiert GET /all-tasks — Alle Tasks über alle Schemas GET /{id} — Einzelnes Schema POST / — Erstellen PUT /{id} — Aktualisieren (synchronisiert Tasks) DELETE /{id} — Löschen PATCH /{id}/toggle — Task-Status umschalten ``` ### Tasks (`/api/tasks`) ``` GET /{id} — Task-Details PUT /{id} — Task aktualisieren DELETE /{id} — Task löschen ``` ## Verzeichnisstruktur (Frontend) ``` frontend/src/ views/ HomeView.vue — Startseite, Wochenansicht AllTasksView.vue — Übersicht aller Schemas/Tasks SchemaView.vue — Schema erstellen/bearbeiten TaskDetailView.vue — Einzelne Aufgabe bearbeiten CategoriesView.vue — Kategorien verwalten components/ TaskCard.vue — Aufgaben-Karte (klickbar zum Toggle) DayColumn.vue — Tages-Spalte in Wochenansicht CategoryBadge.vue — Kategorie-Badge mit Farbe Icon.vue — SVG-Icons (eyeOpen, eyeClosed, plus, arrowLeft, save, trash, edit, close) WeekdayPicker.vue — Wochentag-Auswahl (Mo-So) MonthdayPicker.vue — Monatstag-Auswahl (Kalender-Grid) YearPicker.vue — Jahreskalender-Auswahl router/index.js — Routen mit Breadcrumb-Meta services/api.js — REST-Client (fetch-basiert) stores/categories.js — Pinia Store für Kategorien style.css — Globale Styles, CSS-Variablen, Light/Dark Mode App.vue — Root-Layout mit Breadcrumb-Navigation main.js — Vue-App-Init (Pinia + Router) ``` ## Frontend-Routen ``` / → HomeView (Wochenansicht) /tasks/all → AllTasksView (Übersicht) /tasks/new → SchemaView (Schema erstellen) /tasks/:id → TaskDetailView (Aufgabe bearbeiten) /schemas/:id → SchemaView (Schema bearbeiten) /categories → CategoriesView ``` ## Code-Konventionen - **Sprache Code**: Englisch (Klassen, Methoden, Variablen, CSS-Klassen) - **Sprache UI**: Deutsch (Labels, Fehlermeldungen, Platzhalter) - **Enum-Werte**: Deutsch in DB (`aktiv`, `erledigt`, `einzel` etc.), Englisch als PHP-Case-Namen (`Active`, `Completed`, `Single`) - **API-Serialisierung**: Symfony Serializer-Groups für Schema/Category Entities (`schema:read`, `schema:write`, `category:read`, `category:write`), TaskSerializer-Service für Tasks - **Validierung**: Auf Request-DTOs, nicht auf Entities - **Error-Handling**: `HttpException` → Symfony built-in - **Frontend**: Vue 3 Composition API mit `