171 lines
6.4 KiB
Markdown
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
|
|
```
|