Files
haushalt/CLAUDE.md
Marek Lenczewski 576bfed36d update
2026-03-31 08:48:24 +02:00

6.4 KiB

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
  • Entities: Doctrine-Mapping + Getter/Setter + berechnete Felder via Serializer-Groups

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/                   — 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

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 auf allen Entities (schema:read, task:read, category:read)
  • Validierung: Auf Request-DTOs, nicht auf Entities
  • Error-Handling: HttpException → Symfony built-in
  • Frontend: Vue 3 Composition API mit <script setup>, fetch-basierter API-Client

Development

# DDEV starten
ddev start

# Backend
ddev exec "cd backend && php bin/console cache:clear"
ddev exec "cd backend && php bin/console doctrine:migrations:migrate --no-interaction"

# Frontend
ddev exec "cd frontend && npm install"
ddev exec "cd frontend && npm run dev -- --host 0.0.0.0"

# URLs
Frontend: https://haushalt.ddev.site:5173
API:      https://haushalt.ddev.site/api