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

171 lines
6.4 KiB
Markdown

# 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
```bash
# 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
```