commit 28952b6c5f1eabb3e49dbd844215ff3a0b34409e Author: Henry Date: Sat Mar 14 14:33:02 2026 +0000 Initial commit: Waldseilgarten CRM Project Documentation - README with project overview - TDD (Technical Design Document) - AI Council Review with critical analysis - User Stories (27 stories, 120 SP) - Architecture documentation Stack: NestJS + React + PostgreSQL + Redis Server: waldseilgarten (85.199.86.188) diff --git a/README.md b/README.md new file mode 100644 index 0000000..0f6655a --- /dev/null +++ b/README.md @@ -0,0 +1,140 @@ +# Waldseilgarten Herrenberg CRM + +**Ein modernes CRM- und Projektmanagementsystem fΓΌr den Waldseilgarten Herrenberg** + +--- + +## 🎯 Projekt-Übersicht + +Das Waldseilgarten CRM ist eine maßgeschneiderte LΓΆsung fΓΌr das Kunden- und Projektanagement des Waldseilgarten Herrenberg. Es vereint CRM-FunktionalitΓ€ten mit Projektmanagement, Dokumentenverwaltung und E-Mail-Integration. + +### Kernfunktionen + +| Modul | Status | Beschreibung | +|-------|--------|--------------| +| πŸ” Authentifizierung | βœ… Geplant | JWT-basierte Auth mit Rollen | +| πŸ‘₯ Kundenverwaltung | βœ… Geplant | Firmen, Ansprechpartner, Historie | +| πŸ“ Projektmanagement | βœ… Geplant | Projekte, Aufgaben, Meilensteine | +| πŸ“„ Dokumentenverwaltung | βœ… Geplant | Upload, Versionierung, SeaDrive | +| πŸ“§ E-Mail-Integration | βœ… Geplant | IMAP-Sync, Zuordnung | +| πŸ“… Kalender-Integration | βœ… Geplant | Google Calendar Sync | + +--- + +## πŸ—οΈ Tech Stack + +### Backend +- **Framework:** NestJS (Node.js) +- **Datenbank:** PostgreSQL 18 +- **Cache:** Redis 7 +- **ORM:** TypeORM +- **Auth:** Passport + JWT + +### Frontend +- **Framework:** React 19 + TypeScript +- **Build:** Vite +- **UI:** shadcn/ui + Tailwind CSS +- **State:** Zustand +- **Queries:** TanStack Query + +### DevOps +- **Container:** Podman +- **Orchestrierung:** podman-compose +- **Reverse Proxy:** Traefik +- **SSL:** Let's Encrypt + +--- + +## πŸ“ Projektstruktur + +``` +waldseilgarten-herrenberg-crm/ +β”œβ”€β”€ docs/ +β”‚ β”œβ”€β”€ TDD.md # Technical Design Document +β”‚ β”œβ”€β”€ AI_COUNCIL_REVIEW.md # Architektur-Review +β”‚ β”œβ”€β”€ USER_STORIES.md # Anforderungen +β”‚ └── ARCHITECTURE.md # Systemarchitektur +β”œβ”€β”€ src/ # Source Code (wird vom Server gespiegelt) +β”œβ”€β”€ tests/ # Test-Suite +β”œβ”€β”€ config/ # Konfigurationsdateien +└── README.md # Diese Datei +``` + +--- + +## πŸš€ Schnellstart + +### Voraussetzungen +- Podman installiert +- Zugriff auf Server: `waldseilgarten` (85.199.86.188) + +### Deployment + +```bash +# Auf dem Server (waldseilgarten) +ssh b0rbor4d@85.199.86.188 +cd ~/projects/waldseilgarten-crm + +# Container starten +podman-compose up -d + +# Status prΓΌfen +podman ps +``` + +### URLs +| Service | URL | +|---------|-----| +| Frontend | https://crm.waldseilgarten-herrenberg.de | +| API | https://api.waldseilgarten-herrenberg.de | +| Traefik | https://traefik.waldseilgarten-herrenberg.de | + +--- + +## πŸ“‹ Dokumentation + +- **[TDD](docs/TDD.md)** - Technisches Design-Dokument +- **[AI Council Review](docs/AI_COUNCIL_REVIEW.md)** - Kritisches Architektur-Review +- **[User Stories](docs/USER_STORIES.md)** - Detaillierte Anforderungen +- **[Architektur](docs/ARCHITECTURE.md)** - Systemarchitektur & Datenfluss + +--- + +## πŸ—“οΈ Roadmap + +### Phase 1: Foundation (Woche 1-3) +- βœ… User Auth +- βœ… Kundenverwaltung +- βœ… Projektmanagement +- βœ… Dashboard + +### Phase 2: Dokumente (Woche 4) +- πŸ”„ Upload & Download +- πŸ”„ Lokale Speicherung + +### Phase 3: Aufgaben (Woche 5) +- ⏳ Task-Management +- ⏳ Kanban-Board + +### Phase 4: E-Mail (Woche 6-7) +- ⏳ IMAP-Integration +- ⏳ E-Mail-Zuordnung + +### Phase 5: Erweiterungen (Woche 8-11) +- ⏳ Google Calendar +- ⏳ SeaDrive Sync +- ⏳ Reporting + +--- + +## πŸ‘₯ Kontakt + +**Entwicklung:** Insight-IT GmbH +**Kunde:** Waldseilgarten Herrenberg +**Stand:** MΓ€rz 2026 + +--- + +## πŸ“œ Lizenz + +MIT Β© 2026 Florian Hartmann / Waldseilgarten Herrenberg diff --git a/docs/AI_COUNCIL_REVIEW.md b/docs/AI_COUNCIL_REVIEW.md new file mode 100644 index 0000000..fe6ea3d --- /dev/null +++ b/docs/AI_COUNCIL_REVIEW.md @@ -0,0 +1,370 @@ +# AI Council Review +# Waldseilgarten Herrenberg CRM + +**Sitzung:** 2026-03-14 +**Reviewer:** AI Council (interne Rollen) +**Dokument:** TDD v1.0 + +--- + +## 🎭 Rollenverteilung + +| Rolle | PersΓΆnlichkeit | Aufgabe | +|-------|----------------|---------| +| **πŸ¦… Architekt** | VisionΓ€r, großes Bild | Gesamtstruktur, Skalierung | +| **πŸ” Skeptiker** | Kritisch, Detailorientiert | Schwachstellen finden | +| **⚑ Pragmatiker** | Praktisch, erfahren | Umsetzbarkeit prΓΌfen | +| **πŸ›‘οΈ Security-Experte** | Paranoid, grΓΌndlich | Sicherheitsrisiken | +| **πŸ’° Product-Manager** | Nutzerfokus, ROI | GeschΓ€ftswert | + +--- + +## 1. Executive Summary + +**Gesamturteil:** βœ… **GO fΓΌr Phase 1** mit kleineren Anpassungen + +Der vorgeschlagene Stack (NestJS + React) ist solide und passt zum Skill-Level der vorhandenen Entwicklung. Die modulare Architektur ermΓΆglicht iteratives Vorgehen. + +**Kritische Punkte:** +- SeaDrive-Integration als Optional markieren (hohe KomplexitΓ€t) +- IMAP-Worker frΓΌh testen (potenzielles Risiko) +- Google Calendar OAuth gut dokumentieren + +--- + +## 2. Detaillierte Reviews + +### πŸ¦… Architektur-Review + +**StΓ€rken:** +- βœ… Klare ModularitΓ€t durch NestJS +- βœ… API-First Ansatz +- βœ… TypeScript durchgehend +- βœ… Container-Setup solide + +**Empfehlungen:** +1. **CQRS fΓΌr Reports erwΓ€gen** + - Aktuell: Direkte DB-Queries + - Besser: Read-Models fΓΌr komplexe Reports + - Grund: Performance bei großen Datenmengen + +2. **Event-Driven Architecture** + - Statt: Direkte Service-Aufrufe + - Besser: Events fΓΌr Cross-Cutting Concerns + - Beispiel: `ProjectCreatedEvent` β†’ EmailNotification + +3. **Caching-Strategie definieren** + - Redis fΓΌr Sessions βœ… + - ZusΓ€tzlich: Query-Result-Caching + - TTL-Strategie dokumentieren + +**Bewertung:** 8/10 + +--- + +### πŸ” Skeptiker-Review + +**Probleme identifiziert:** + +#### 1. **IMAP-Integration unterschΓ€tzt?** +``` +Problem: IMAP ist komplexer als gedacht +- Verschiedene Server-Implementierungen +- Connection-Handling bei Timeouts +- Sync-Strategie (Delta vs. Full) + +Empfehlung: +- Proof-of-Concept in Woche 1 +- Library: imapflow (moderner als node-imap) +- Fallback: Manuelle E-Mail-Erfassung +``` + +#### 2. **SeaDrive = Hohe KomplexitΓ€t** +``` +Problem: SeaDrive/Seafile Integration +- FUSE-Filesystem im Container +- Rechte-Management komplex +- Sync-Konflikte + +Empfehlung: +- Als "Phase 2+" markieren +- Alternative: S3-kompatible API +- Oder: Seafile REST API direkt nutzen +``` + +#### 3. **Fehlende Rate-Limiting** +``` +Problem: Keine API-Rate-Limits definiert +- Login-Endpunkte vulnerable +- Upload-Endpunkten ohne Limits + +Empfehlung: +- nestjs-rate-limiter hinzufΓΌgen +- Spezifische Limits pro Endpoint: + - /auth/login: 5/min pro IP + - /upload: 10/min pro User +``` + +#### 4. **Fehlende Input-Validierung Details** +``` +Problem: "class-validator" erwΓ€hnt, aber keine Details +- Welche Decorators? +- Custom Validators? + +Empfehlung: +- @IsEmail() fΓΌr E-Mails +- @Length() fΓΌr PasswΓΆrter (min 8) +- @Matches() fΓΌr komplexe Regeln +- Sanitization (XSS-Prevention) +``` + +**Bewertung:** 6/10 (wichtige Details fehlen) + +--- + +### ⚑ Pragmatiker-Review + +**Umsetzbarkeit:** βœ… Gut + +**ZeitschΓ€tzungen:** + +| Phase | TDD-SchΓ€tzung | Realistisch | Risiko | +|-------|---------------|-------------|--------| +| Phase 1 | 2-3 Wochen | 3-4 Wochen | Mittel | +| Phase 2 | 1 Woche | 1-2 Wochen | Niedrig | +| Phase 3 | 1 Woche | 1 Woche | Niedrig | +| Phase 4 | 2 Wochen | 3-4 Wochen | Hoch | +| Phase 5 | 4-5 Wochen | 6-8 Wochen | Mittel | + +**Gesamt:** 11 Wochen β†’ **Realistisch: 14-18 Wochen** + +**Empfehlungen:** + +1. **MVP reduzieren** +``` +Statt: +- Multi-Tenant +- SSO +- 2FA + +Zuerst: +- Single-Tenant +- Lokale Auth +- Einfaches Passwort +``` + +2. **Feature-Flags nutzen** +```typescript +// Statt: Code auskommentieren +if (config.features.emailIntegration) { + // IMAP-Feature +} +``` + +3. **Vorhandenen Code nutzen** +- Backend ist bereits teilweise implementiert +- Frontend existiert bereits +- Fokus: Integration & Bugfixing + +**Bewertung:** 7/10 + +--- + +### πŸ›‘οΈ Security-Review + +**Kritisch:** + +#### 1. **JWT-Secret in .env** +``` +Problem: JWT_SECRET in docker-compose.yml sichtbar +Risiko: Bei Repo-Leak kompromittiert + +Empfehlung: +- Docker Secrets oder +- Environment-Injection bei Deployment +- RegelmÀßige Rotation (alle 90 Tage) +``` + +#### 2. **Fehlende SQL-Injection Tests** +``` +Problem: TypeORM schΓΌtzt, aber keine expliziten Tests + +Empfehlung: +- Test-Cases fΓΌr: + - ' OR '1'='1 + - UNION SELECT + - Time-based Blind SQLi +``` + +#### 3. **File Upload Security** +``` +Problem: Upload-Endpunkte ohne Details +Risiken: +- MIME-Type spoofing +- Path traversal +- Malware-Upload + +Empfehlung: +- Magic-Bytes-Check (nicht nur Extension) +- ClamAV-Integration +- Upload-Verzeichnis außerhalb Webroot +- Dateigrâßen-Limit (10MB) +``` + +#### 4. **CORS zu offen?** +```yaml +# Aktuell: +CORS_ORIGINS: "*" + +# Besser: +CORS_ORIGINS: "https://waldseilgarten-herrenberg.de" +``` + +#### 5. **Fehlende Audit-Logs** +``` +Problem: Wer hat wann was gemacht? + +Empfehlung: +- Audit-Log Tabelle +- Loggen: Login, Daten-Γ„nderungen, LΓΆschungen +- UnverΓ€nderlich speichern +``` + +**Bewertung:** 5/10 (mehrere kritische LΓΌcken) + +--- + +### πŸ’° Product-Manager-Review + +**GeschΓ€ftswert:** βœ… Hoch + +**Nutzer-Jobs:** + +| Job | Wichtigkeit | ErfΓΌllung im TDD | +|-----|-------------|------------------| +| Kunden finden | Kritisch | βœ… Gut | +| Projekte verfolgen | Kritisch | βœ… Gut | +| Dokumente ablegen | Wichtig | βœ… Gut | +| E-Mails zuordnen | Wichtig | ⚠️ Komplex | +| Termine syncen | Nice-to-have | ⚠️ Optional | + +**Konkurrenz-Analyse:** +- HubSpot: Zu teuer, zu komplex +- Pipedrive: Gut, aber nicht self-hosted +- **Dieses CRM:** Perfekte Nische + +**Empfehlungen:** + +1. **Onboarding-Flow** +``` +Fehlt im TDD: +- Erstkonfiguration Wizard +- Beispieldaten generieren +- Tutorial/Tour +``` + +2. **Mobile-First nicht vergessen** +``` +TDD erwΓ€hnt PWA, aber: +- Keine Mobile-Optimierung Details +- Touch-Gestures? +- Offline-Modus? +``` + +3. **Export-Funktion** +``` +Kritisch fΓΌr Kunden: +- "Meine Daten gehΓΆren mir" +- CSV/Excel Export +- JSON-Export fΓΌr Migration +``` + +**Bewertung:** 7/10 + +--- + +## 3. Konsens-Empfehlungen + +### βœ… Beibehalten +- NestJS + React Stack +- PostgreSQL + Redis +- Modulare Architektur +- Docker/Podman Setup + +### πŸ”„ Anpassen + +#### 1. **SeaDrive β†’ Optional** +``` +Statt: Pflicht-Feature +Besser: Phase 2+ mit Fallback +``` + +#### 2. **IMAP zuerst testen** +``` +Aktion: Proof-of-Concept in Woche 1 +Falls zu komplex: Manuelle Erfassung +``` + +#### 3. **Security Hardening** +``` +Muss: +- Rate-Limiting +- JWT-Secret-Management +- File-Upload Security +- Audit-Logging +``` + +#### 4. **Zeitplan realistisch** +``` +Statt: 11 Wochen +Realistisch: 14-18 Wochen +``` + +### ❌ HinzufΓΌgen + +| Feature | PrioritΓ€t | Aufwand | +|---------|-----------|---------| +| Rate-Limiting | Kritisch | Klein | +| Audit-Logging | Hoch | Mittel | +| Feature-Flags | Hoch | Klein | +| Data-Export | Hoch | Klein | +| API-Doku (Swagger) | Mittel | Klein | + +--- + +## 4. Final Voting + +| Rolle | Score | Verdict | +|-------|-------|---------| +| πŸ¦… Architekt | 8/10 | βœ… GO | +| πŸ” Skeptiker | 6/10 | ⚠️ GO mit Bedenken | +| ⚑ Pragmatiker | 7/10 | βœ… GO | +| πŸ›‘οΈ Security | 5/10 | ⚠️ GO nach Hardening | +| πŸ’° Product | 7/10 | βœ… GO | + +### **Endergebnis: 6.6/10** β†’ βœ… **GO mit Anpassungen** + +--- + +## 5. Action Items + +| # | Aufgabe | Verantwortlich | Deadline | +|---|---------|----------------|----------| +| 1 | Rate-Limiting implementieren | Backend | Phase 1 | +| 2 | IMAP Proof-of-Concept | Backend | Woche 1 | +| 3 | Security-Checkliste erstellen | Security | Vor Deployment | +| 4 | SeaDrive als Optional markieren | PM | Dokumentation | +| 5 | Zeitplan anpassen (14-18 Wochen) | PM | Roadmap | +| 6 | Feature-Flags Setup | Architekt | Phase 1 | + +--- + +## 6. Follow-Up Review + +**Termin:** Nach Phase 1 Completion +**Ziel:** Validierung der Annahmen, Anpassung fΓΌr Phasen 2-5 + +--- + +**Review abgeschlossen:** 2026-03-14 +**NΓ€chster Schritt:** TDD anpassen basierend auf Empfehlungen diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md new file mode 100644 index 0000000..ac03690 --- /dev/null +++ b/docs/ARCHITECTURE.md @@ -0,0 +1,541 @@ +# Systemarchitektur +# Waldseilgarten Herrenberg CRM + +**Version:** 1.0 +**Datum:** 2026-03-14 + +--- + +## 1. Architektur-Übersicht + +Das Waldseilgarten CRM folgt einer **Layered Architecture** mit klaren Trennungen zwischen: +- **Presentation Layer** (React Frontend) +- **API Layer** (NestJS Controllers) +- **Business Layer** (NestJS Services) +- **Data Layer** (TypeORM + PostgreSQL) + +``` +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ PRESENTATION LAYER β”‚ +β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ +β”‚ β”‚ React β”‚ β”‚ Zustand β”‚ β”‚ TanStack β”‚ β”‚ +β”‚ β”‚ Components β”‚ β”‚ Store β”‚ β”‚ Query β”‚ β”‚ +β”‚ β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ +β”‚ β”‚ β”‚ +β”‚ β–Ό HTTPS β”‚ +β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ +β”‚ API LAYER β”‚ +β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ +β”‚ β”‚ NestJS Controllers β”‚ β”‚ +β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ +β”‚ β”‚ β”‚ Auth β”‚ β”‚ Customersβ”‚ β”‚ Projectsβ”‚ β”‚Documents β”‚ β”‚ β”‚ +β”‚ β”‚ β”‚Controllerβ”‚ β”‚Controllerβ”‚ β”‚Controllerβ”‚ β”‚Controllerβ”‚ β”‚ β”‚ +β”‚ β”‚ β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ +β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ +β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ +β”‚ β–Ό β–Ό β–Ό β–Ό β”‚ +β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ +β”‚ BUSINESS LAYER β”‚ +β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ +β”‚ β”‚ NestJS Services β”‚ β”‚ +β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ +β”‚ β”‚ β”‚ Auth β”‚ β”‚ Customersβ”‚ β”‚ Projectsβ”‚ β”‚Documents β”‚ β”‚ β”‚ +β”‚ β”‚ β”‚ Service β”‚ β”‚ Service β”‚ β”‚ Service β”‚ β”‚ Service β”‚ β”‚ β”‚ +β”‚ β”‚ β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ +β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ +β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ +β”‚ β–Ό β–Ό β–Ό β–Ό β”‚ +β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ +β”‚ DATA LAYER β”‚ +β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ +β”‚ β”‚ TypeORM Repository β”‚ β”‚ +β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ +β”‚ β”‚ β”‚ +β”‚ β–Ό β”‚ +β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ +β”‚ β”‚ PostgreSQL 18 β”‚ β”‚ +β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ +β”‚ β”‚ β”‚ +β”‚ β–Ό β”‚ +β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ +β”‚ β”‚ Redis 7 β”‚ β”‚ +β”‚ β”‚ (Cache / Sessions) β”‚ β”‚ +β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ +``` + +--- + +## 2. Backend-Architektur + +### 2.1 Modulstruktur + +``` +backend/src/ +β”œβ”€β”€ app.module.ts # Root-Modul +β”œβ”€β”€ main.ts # Bootstrap +β”‚ +β”œβ”€β”€ common/ # Shared Resources +β”‚ β”œβ”€β”€ decorators/ +β”‚ β”œβ”€β”€ filters/ # Exception Filters +β”‚ β”œβ”€β”€ guards/ # Auth Guards +β”‚ β”œβ”€β”€ interceptors/ # Logging, Transform +β”‚ └── pipes/ # Validation Pipes +β”‚ +β”œβ”€β”€ config/ # Konfiguration +β”‚ β”œβ”€β”€ database.config.ts +β”‚ β”œβ”€β”€ app.config.ts +β”‚ └── redis.config.ts +β”‚ +β”œβ”€β”€ auth/ # Phase 1 +β”‚ β”œβ”€β”€ auth.module.ts +β”‚ β”œβ”€β”€ auth.controller.ts +β”‚ β”œβ”€β”€ auth.service.ts +β”‚ β”œβ”€β”€ dto/ +β”‚ β”‚ β”œβ”€β”€ login.dto.ts +β”‚ β”‚ └── register.dto.ts +β”‚ β”œβ”€β”€ entities/ +β”‚ β”‚ └── user.entity.ts +β”‚ └── guards/ +β”‚ └── jwt-auth.guard.ts +β”‚ +β”œβ”€β”€ customers/ # Phase 1 +β”‚ β”œβ”€β”€ customers.module.ts +β”‚ β”œβ”€β”€ customers.controller.ts +β”‚ β”œβ”€β”€ customers.service.ts +β”‚ β”œβ”€β”€ dto/ +β”‚ β”‚ β”œβ”€β”€ create-customer.dto.ts +β”‚ β”‚ └── update-customer.dto.ts +β”‚ └── entities/ +β”‚ β”œβ”€β”€ customer.entity.ts +β”‚ └── contact.entity.ts +β”‚ +β”œβ”€β”€ projects/ # Phase 1 +β”‚ β”œβ”€β”€ projects.module.ts +β”‚ β”œβ”€β”€ projects.controller.ts +β”‚ β”œβ”€β”€ projects.service.ts +β”‚ β”œβ”€β”€ dto/ +β”‚ └── entities/ +β”‚ β”œβ”€β”€ project.entity.ts +β”‚ └── project-member.entity.ts +β”‚ +β”œβ”€β”€ documents/ # Phase 2 +β”‚ β”œβ”€β”€ documents.module.ts +β”‚ β”œβ”€β”€ documents.controller.ts +β”‚ β”œβ”€β”€ documents.service.ts +β”‚ β”œβ”€β”€ storage/ +β”‚ β”‚ β”œβ”€β”€ local.storage.ts +β”‚ β”‚ └── seadrive.storage.ts +β”‚ └── entities/ +β”‚ └── document.entity.ts +β”‚ +β”œβ”€β”€ tasks/ # Phase 3 +β”‚ β”œβ”€β”€ tasks.module.ts +β”‚ β”œβ”€β”€ tasks.controller.ts +β”‚ β”œβ”€β”€ tasks.service.ts +β”‚ └── entities/ +β”‚ └── task.entity.ts +β”‚ +└── email/ # Phase 4 + β”œβ”€β”€ email.module.ts + β”œβ”€β”€ email.controller.ts + β”œβ”€β”€ email.service.ts + β”œβ”€β”€ imap/ + β”‚ └── imap.service.ts + └── entities/ + └── email.entity.ts +``` + +### 2.2 Request Flow + +``` +Request + β”‚ + β–Ό +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ Traefik β”‚ β†’ SSL-Terminierung, Routing +β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”˜ + β”‚ + β–Ό +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ Middleware β”‚ β†’ CORS, Helmet, Compression +β”‚ (Global) β”‚ +β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”˜ + β”‚ + β–Ό +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ Guards β”‚ β†’ JWT Validation +β”‚ (Optional) β”‚ +β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”˜ + β”‚ + β–Ό +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ Pipes β”‚ β†’ DTO Validation +β”‚ (Transform) β”‚ +β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”˜ + β”‚ + β–Ό +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ Controller β”‚ β†’ Route Handler +β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”˜ + β”‚ + β–Ό +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ Service β”‚ β†’ Business Logic +β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”˜ + β”‚ + β–Ό +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ Repository β”‚ β†’ TypeORM +β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”˜ + β”‚ + β–Ό +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ PostgreSQL β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ +``` + +--- + +## 3. Datenbank-Schema + +### 3.1 Entity Relationship Diagram + +``` +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ users β”‚ β”‚ customers β”‚ β”‚ projects β”‚ +β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ +β”‚ id (PK) β”‚ β”‚ id (PK) β”‚ β”‚ id (PK) β”‚ +β”‚ email │◄─────── created_by β”‚ β”‚ customer_id │──────► +β”‚ password_hashβ”‚ β”‚ company_name β”‚ β”‚ name β”‚ +β”‚ first_name β”‚ β”‚ industry β”‚ β”‚ description β”‚ +β”‚ last_name β”‚ β”‚ website β”‚ β”‚ status β”‚ +β”‚ role β”‚ β”‚ phone β”‚ β”‚ priority β”‚ +β”‚ is_active β”‚ β”‚ email β”‚ β”‚ start_date β”‚ +β”‚ created_at β”‚ β”‚ address β”‚ β”‚ end_date β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ notes β”‚ β”‚ budget β”‚ + β”‚ tags[] β”‚ β”‚ created_by │◄───── + β”‚ created_at β”‚ β”‚ created_at β”‚ + β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ + β”‚ β”‚ + β”‚ β”‚ + β–Ό β–Ό + β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” + β”‚ contacts β”‚ β”‚project_members + β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ + β”‚ id (PK) β”‚ β”‚ id (PK) β”‚ + β”‚ customer_id │──────►│ project_id β”‚ + β”‚ first_name β”‚ β”‚ user_id β”‚ + β”‚ last_name β”‚ β”‚ role β”‚ + β”‚ email β”‚ β”‚ joined_at β”‚ + β”‚ phone β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ + β”‚ position β”‚ + β”‚ is_primary β”‚ + β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ +``` + +### 3.2 ZusΓ€tzliche Tabellen (SpΓ€tere Phasen) + +``` +documents: + - id (PK) + - name + - original_name + - storage_path + - mime_type + - size_bytes + - project_id (FK) + - uploaded_by (FK) + - created_at + +tasks: + - id (PK) + - title + - description + - status + - priority + - due_date + - project_id (FK) + - assigned_to (FK) + - created_by (FK) + +emails: + - id (PK) + - message_id (IMAP) + - subject + - from_address + - to_addresses + - body_text + - body_html + - received_at + - project_id (FK, nullable) + - customer_id (FK, nullable) +``` + +--- + +## 4. Frontend-Architektur + +### 4.1 Komponenten-Struktur + +``` +frontend/src/ +β”œβ”€β”€ components/ +β”‚ β”œβ”€β”€ ui/ # shadcn/ui Basis-Komponenten +β”‚ β”‚ β”œβ”€β”€ button.tsx +β”‚ β”‚ β”œβ”€β”€ input.tsx +β”‚ β”‚ β”œβ”€β”€ dialog.tsx +β”‚ β”‚ └── ... +β”‚ β”‚ +β”‚ β”œβ”€β”€ layout/ # Layout-Komponenten +β”‚ β”‚ β”œβ”€β”€ Sidebar.tsx +β”‚ β”‚ β”œβ”€β”€ Header.tsx +β”‚ β”‚ └── MainLayout.tsx +β”‚ β”‚ +β”‚ β”œβ”€β”€ forms/ # Formular-Komponenten +β”‚ β”‚ β”œβ”€β”€ CustomerForm.tsx +β”‚ β”‚ β”œβ”€β”€ ProjectForm.tsx +β”‚ β”‚ └── LoginForm.tsx +β”‚ β”‚ +β”‚ └── data-display/ # Daten-Visualisierung +β”‚ β”œβ”€β”€ DataTable.tsx +β”‚ β”œβ”€β”€ StatCard.tsx +β”‚ └── ActivityFeed.tsx +β”‚ +β”œβ”€β”€ pages/ # Route-Komponenten +β”‚ β”œβ”€β”€ auth/ +β”‚ β”‚ └── Login.tsx +β”‚ β”œβ”€β”€ dashboard/ +β”‚ β”‚ └── Dashboard.tsx +β”‚ β”œβ”€β”€ customers/ +β”‚ β”‚ β”œβ”€β”€ CustomerList.tsx +β”‚ β”‚ └── CustomerDetail.tsx +β”‚ β”œβ”€β”€ projects/ +β”‚ β”‚ β”œβ”€β”€ ProjectList.tsx +β”‚ β”‚ └── ProjectDetail.tsx +β”‚ └── documents/ +β”‚ └── DocumentList.tsx +β”‚ +β”œβ”€β”€ hooks/ # Custom Hooks +β”‚ β”œβ”€β”€ useAuth.ts +β”‚ β”œβ”€β”€ useCustomers.ts +β”‚ └── useProjects.ts +β”‚ +β”œβ”€β”€ services/ # API-Clients +β”‚ └── api.ts # Axios-Instance +β”‚ +β”œβ”€β”€ store/ # Zustand Store +β”‚ β”œβ”€β”€ authStore.ts +β”‚ └── uiStore.ts +β”‚ +β”œβ”€β”€ types/ # TypeScript Types +β”‚ └── index.ts +β”‚ +└── utils/ # Hilfsfunktionen + β”œβ”€β”€ formatters.ts + └── validators.ts +``` + +### 4.2 State Management + +``` +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ Zustand Store β”‚ +β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ +β”‚ β”‚ +β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ +β”‚ β”‚ authStore β”‚ β”‚ uiStore β”‚ β”‚ +β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ +β”‚ β”‚ β€’ user β”‚ β”‚ β€’ sidebar β”‚ β”‚ +β”‚ β”‚ β€’ token β”‚ β”‚ β€’ theme β”‚ β”‚ +β”‚ β”‚ β€’ isAuth β”‚ β”‚ β€’ notificationsβ”‚ β”‚ +β”‚ β”‚ β€’ login() β”‚ β”‚ β€’ modalState β”‚ β”‚ +β”‚ β”‚ β€’ logout() β”‚ β”‚ β€’ setTheme() β”‚ β”‚ +β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ +β”‚ β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ + +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ TanStack Query β”‚ +β”‚ (Server State) β”‚ +β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ +β”‚ β”‚ +β”‚ β€’ useCustomers() β†’ GET /api/customers β”‚ +β”‚ β€’ useCustomer(id) β†’ GET /api/customers/:id β”‚ +β”‚ β€’ useCreateCustomer() β†’ POST /api/customers β”‚ +β”‚ β€’ useUpdateCustomer() β†’ PUT /api/customers/:id β”‚ +β”‚ β”‚ +β”‚ Features: β”‚ +β”‚ β€’ Caching β”‚ +β”‚ β€’ Background Refetching β”‚ +β”‚ β€’ Optimistic Updates β”‚ +β”‚ β€’ Error Handling β”‚ +β”‚ β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ +``` + +--- + +## 5. Deployment-Architektur + +### 5.1 Server-Layout + +``` +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ Ubuntu 24.04 LTS β”‚ +β”‚ (waldseilgarten) β”‚ +β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ +β”‚ β”‚ +β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ +β”‚ β”‚ Podman Runtime β”‚ β”‚ +β”‚ β”‚ β”‚ β”‚ +β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ +β”‚ β”‚ β”‚ Traefik β”‚ β”‚ Backend β”‚ β”‚ Frontend β”‚ β”‚ β”‚ +β”‚ β”‚ β”‚ :80/:443 β”‚ β”‚ :3001 β”‚ β”‚ :3000 β”‚ β”‚ β”‚ +β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ +β”‚ β”‚ β”‚ β”‚ +β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ +β”‚ β”‚ β”‚ PostgreSQL β”‚ β”‚ Redis β”‚ β”‚ Worker β”‚ β”‚ β”‚ +β”‚ β”‚ β”‚ :5432 β”‚ β”‚ :6379 β”‚ β”‚ (IMAP) β”‚ β”‚ β”‚ +β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ +β”‚ β”‚ β”‚ β”‚ +β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ +β”‚ β”‚ +β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ +β”‚ β”‚ Volumes β”‚ β”‚ +β”‚ β”‚ β”‚ β”‚ +β”‚ β”‚ ~/projects/waldseilgarten-crm/data/ β”‚ β”‚ +β”‚ β”‚ β”œβ”€β”€ db/ β†’ PostgreSQL Daten β”‚ β”‚ +β”‚ β”‚ β”œβ”€β”€ redis/ β†’ Redis Persistenz β”‚ β”‚ +β”‚ β”‚ └── uploads/ β†’ Dokumente β”‚ β”‚ +β”‚ β”‚ β”‚ β”‚ +β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ +β”‚ β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ +``` + +### 5.2 Netzwerk-Architektur + +``` +Internet + β”‚ + β–Ό +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ Cloudflare β”‚ (Optional: CDN, DDoS-Protection) +β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”˜ + β”‚ + β–Ό +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ Router β”‚ 85.199.86.188 +β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”˜ + β”‚ + β–Ό +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ Traefik β”‚ Port 80/443 +β”‚ (Reverse β”‚ +β”‚ Proxy) β”‚ +β””β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”˜ + β”‚ β”‚ + β–Ό β–Ό +β”Œβ”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β” +β”‚:3000 β”‚ β”‚:3001 β”‚ +β”‚Frontendβ”‚ β”‚Backendβ”‚ +β””β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”˜ +``` + +--- + +## 6. Sicherheitsarchitektur + +### 6.1 Authentifizierungs-Flow + +``` +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ Client β”‚ β”‚ Server β”‚ +β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”˜ + β”‚ β”‚ + β”‚ POST /api/auth/login β”‚ + β”‚ { email, password } β”‚ + │───────────────────────────────────────▢│ + β”‚ β”‚ + β”‚ β”‚ bcrypt.compare() + β”‚ β”‚ + β”‚ { access_token, user } β”‚ + │◀───────────────────────────────────────│ + β”‚ β”‚ + β”‚ Store in memory (Zustand) β”‚ + β”‚ β”‚ + β”‚ GET /api/customers β”‚ + β”‚ Authorization: Bearer {token} β”‚ + │───────────────────────────────────────▢│ + β”‚ β”‚ + β”‚ β”‚ JWT.verify() + β”‚ β”‚ + β”‚ { customers } β”‚ + │◀───────────────────────────────────────│ + β”‚ β”‚ +``` + +### 6.2 Autorisierungs-Matrix + +| Feature | Admin | Manager | User | +|---------|-------|---------|------| +| Benutzer verwalten | βœ… | ❌ | ❌ | +| Alle Kunden sehen | βœ… | βœ… | βœ… | +| Alle Projekte sehen | βœ… | βœ… | ⚠️* | +| Projekt anlegen | βœ… | βœ… | ❌ | +| Eigene Daten Γ€ndern | βœ… | βœ… | βœ… | +| Reports exportieren | βœ… | βœ… | ❌ | +| System-Einstellungen | βœ… | ❌ | ❌ | + +*User sieht nur zugewiesene Projekte + +--- + +## 7. Monitoring & Observability + +### 7.1 Health Checks + +``` +GET /api/health +{ + "status": "healthy", + "timestamp": "2026-03-14T14:30:00Z", + "version": "1.0.0", + "checks": { + "database": { + "status": "up", + "responseTime": "12ms" + }, + "cache": { + "status": "up", + "responseTime": "3ms" + }, + "storage": { + "status": "up", + "freeSpace": "45GB" + } + } +} +``` + +### 7.2 Logging-Struktur + +```typescript +{ + "timestamp": "2026-03-14T14:30:00Z", + "level": "info", + "context": "CustomersService", + "message": "Customer created", + "metadata": { + "customerId": "uuid", + "userId": "uuid", + "duration": "45ms" + }, + "requestId": "req-uuid" +} +``` + +--- + +**Ende der Architektur-Dokumentation** diff --git a/docs/TDD.md b/docs/TDD.md new file mode 100644 index 0000000..83ca5bc --- /dev/null +++ b/docs/TDD.md @@ -0,0 +1,459 @@ +# Technical Design Document (TDD) +# Waldseilgarten Herrenberg CRM + +**Version:** 1.0 +**Datum:** 2026-03-14 +**Autor:** AI-Assistent (Henry) +**Status:** Entwurf + +--- + +## 1. Executive Summary + +### 1.1 Ziel +Entwicklung eines modernen CRM- und Projektmanagementsystems fΓΌr den Waldseilgarten Herrenberg mit Fokus auf: +- Kunden- und Kontaktverwaltung +- Projekt-Tracking +- Dokumentenmanagement +- E-Mail-Integration + +### 1.2 Tech Stack +| Schicht | Technologie | +|---------|-------------| +| Backend | NestJS (Node.js 22) | +| Frontend | React 19 + Vite | +| Datenbank | PostgreSQL 18 | +| Cache | Redis 7 | +| Container | Podman | +| Proxy | Traefik | + +### 1.3 Architekturprinzipien +- **ModularitΓ€t:** Klare Trennung in Feature-Module +- **Type-Safety:** TypeScript durchgehend +- **API-First:** REST API als zentrale Schnittstelle +- **Containerized:** VollstΓ€ndig containerisiert + +--- + +## 2. Systemarchitektur + +### 2.1 High-Level Architektur + +``` +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ Client β”‚ +β”‚ (React + Vite) β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ + β”‚ HTTPS +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ Traefik β”‚ +β”‚ (Reverse Proxy + SSL) β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ + β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” + β–Ό β–Ό β–Ό +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ Frontend β”‚ β”‚ Backend β”‚ β”‚ Worker β”‚ +β”‚ (nginx) β”‚ β”‚ (NestJS) β”‚ β”‚ (IMAP) β”‚ +β”‚ :3000 β”‚ β”‚ :3001 β”‚ β”‚ β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ + β”‚ + β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” + β–Ό β–Ό β–Ό +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ PostgreSQL β”‚ β”‚ Redis β”‚ β”‚ Local β”‚ +β”‚ (DB) β”‚ β”‚ (Cache) β”‚ β”‚ Storage β”‚ +β”‚ :5432 β”‚ β”‚ :6379 β”‚ β”‚ β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ +``` + +### 2.2 Backend-Module + +``` +backend/src/ +β”œβ”€β”€ auth/ # Phase 1: Authentifizierung +β”œβ”€β”€ customers/ # Phase 1: Kundenverwaltung +β”œβ”€β”€ projects/ # Phase 1: Projektmanagement +β”œβ”€β”€ dashboard/ # Phase 1: Statistiken +β”œβ”€β”€ documents/ # Phase 2: Dokumentenverwaltung +β”œβ”€β”€ tasks/ # Phase 3: Aufgabenmanagement +β”œβ”€β”€ email/ # Phase 4: E-Mail-Integration +β”œβ”€β”€ calendar/ # Phase 5: Google Calendar +└── common/ # Shared Utilities +``` + +### 2.3 Datenbank-Schema (Phase 1) + +```sql +-- Users +CREATE TABLE users ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + email VARCHAR(255) UNIQUE NOT NULL, + password_hash VARCHAR(255) NOT NULL, + first_name VARCHAR(100), + last_name VARCHAR(100), + role VARCHAR(20) DEFAULT 'user', + is_active BOOLEAN DEFAULT true, + created_at TIMESTAMP DEFAULT NOW(), + updated_at TIMESTAMP DEFAULT NOW() +); + +-- Customers +CREATE TABLE customers ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + company_name VARCHAR(255) NOT NULL, + industry VARCHAR(100), + website VARCHAR(255), + phone VARCHAR(50), + email VARCHAR(255), + address TEXT, + notes TEXT, + tags TEXT[], + created_by UUID REFERENCES users(id), + created_at TIMESTAMP DEFAULT NOW(), + updated_at TIMESTAMP DEFAULT NOW() +); + +-- Contacts (Ansprechpartner) +CREATE TABLE contacts ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + customer_id UUID REFERENCES customers(id) ON DELETE CASCADE, + first_name VARCHAR(100) NOT NULL, + last_name VARCHAR(100) NOT NULL, + email VARCHAR(255), + phone VARCHAR(50), + position VARCHAR(100), + is_primary BOOLEAN DEFAULT false, + created_at TIMESTAMP DEFAULT NOW(), + updated_at TIMESTAMP DEFAULT NOW() +); + +-- Projects +CREATE TABLE projects ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + name VARCHAR(255) NOT NULL, + description TEXT, + customer_id UUID REFERENCES customers(id) ON DELETE SET NULL, + status VARCHAR(50) DEFAULT 'new', + priority VARCHAR(20) DEFAULT 'medium', + start_date DATE, + end_date DATE, + budget DECIMAL(12,2), + created_by UUID REFERENCES users(id), + created_at TIMESTAMP DEFAULT NOW(), + updated_at TIMESTAMP DEFAULT NOW() +); + +-- Project Members +CREATE TABLE project_members ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + project_id UUID REFERENCES projects(id) ON DELETE CASCADE, + user_id UUID REFERENCES users(id) ON DELETE CASCADE, + role VARCHAR(50) DEFAULT 'member', + joined_at TIMESTAMP DEFAULT NOW(), + UNIQUE(project_id, user_id) +); +``` + +--- + +## 3. API-Design + +### 3.1 Authentication + +```typescript +// POST /api/auth/login +interface LoginRequest { + email: string; + password: string; +} + +interface LoginResponse { + access_token: string; + user: { + id: string; + email: string; + first_name: string; + last_name: string; + role: string; + }; +} + +// POST /api/auth/register +interface RegisterRequest { + email: string; + password: string; + first_name: string; + last_name: string; +} +``` + +### 3.2 Customers + +```typescript +// GET /api/customers +interface ListCustomersQuery { + page?: number; + limit?: number; + search?: string; + industry?: string; + tags?: string[]; +} + +// POST /api/customers +interface CreateCustomerRequest { + company_name: string; + industry?: string; + website?: string; + phone?: string; + email?: string; + address?: string; + notes?: string; + tags?: string[]; +} + +// GET /api/customers/:id +interface CustomerResponse { + id: string; + company_name: string; + industry?: string; + website?: string; + phone?: string; + email?: string; + address?: string; + notes?: string; + tags: string[]; + contacts: Contact[]; + projects: ProjectSummary[]; + created_at: string; + updated_at: string; +} +``` + +### 3.3 Projects + +```typescript +// POST /api/projects +interface CreateProjectRequest { + name: string; + description?: string; + customer_id?: string; + status?: 'new' | 'active' | 'on_hold' | 'completed' | 'cancelled'; + priority?: 'low' | 'medium' | 'high' | 'urgent'; + start_date?: string; + end_date?: string; + budget?: number; +} + +// GET /api/projects/:id +interface ProjectResponse { + id: string; + name: string; + description?: string; + customer?: CustomerSummary; + status: string; + priority: string; + start_date?: string; + end_date?: string; + budget?: number; + members: ProjectMember[]; + documents_count: number; + tasks_count: number; + created_at: string; + updated_at: string; +} +``` + +--- + +## 4. Sicherheit + +### 4.1 Authentifizierung +- JWT-based Authentication +- Access Token: 24h GΓΌltigkeit +- Refresh Token: 7 Tage GΓΌltigkeit (optional) +- bcrypt fΓΌr Passwort-Hashing (10 rounds) + +### 4.2 Autorisierung +- Rollenbasierte Zugriffskontrolle (RBAC) +- Rollen: `admin`, `manager`, `user` +- Guards auf Controller-Ebene + +### 4.3 Datenschutz +- HTTPS enforced +- SQL Injection Prevention (TypeORM) +- XSS Prevention (React escaping) +- CSRF Protection + +--- + +## 5. Deployment + +### 5.1 Container-Setup + +```yaml +# docker-compose.yml +version: '3.8' + +services: + postgres: + image: postgres:18-alpine + environment: + POSTGRES_USER: ${POSTGRES_USER} + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} + POSTGRES_DB: ${POSTGRES_DB} + volumes: + - ./data/db:/var/lib/postgresql/data + networks: + - crm-network + + redis: + image: redis:7-alpine + command: redis-server --requirepass ${REDIS_PASSWORD} + volumes: + - ./data/redis:/data + networks: + - crm-network + + backend: + build: ./backend + environment: + NODE_ENV: production + POSTGRES_HOST: postgres + REDIS_HOST: redis + labels: + - "traefik.enable=true" + - "traefik.http.routers.crm-api.rule=Host(`api.crm.waldseilgarten-herrenberg.de`)" + networks: + - crm-network + + frontend: + build: ./frontend + labels: + - "traefik.enable=true" + - "traefik.http.routers.crm-frontend.rule=Host(`crm.waldseilgarten-herrenberg.de`)" + networks: + - crm-network + +networks: + crm-network: + driver: bridge +``` + +### 5.2 Traefik-Konfiguration + +```yaml +# traefik/dynamic/crm.yml +http: + routers: + crm-api: + rule: "Host(`api.waldseilgarten-herrenberg.de`)" + service: crm-api + entryPoints: + - websecure + tls: + certResolver: le + + crm-frontend: + rule: "Host(`waldseilgarten-herrenberg.de`)" + service: crm-frontend + entryPoints: + - websecure + tls: + certResolver: le + + services: + crm-api: + loadBalancer: + servers: + - url: "http://waldseilgarten-backend:3001" + + crm-frontend: + loadBalancer: + servers: + - url: "http://waldseilgarten-frontend:3000" +``` + +--- + +## 6. Testing + +### 6.1 Test-Strategie +- **Unit Tests:** Jest fΓΌr Services +- **Integration Tests:** Supertest fΓΌr API +- **E2E Tests:** Playwright fΓΌr Frontend + +### 6.2 Test-Abdeckung +- Mindestens 80% fΓΌr kritische Pfade +- Auth-Flows vollstΓ€ndig testen +- API-Endpunkte validieren + +--- + +## 7. Monitoring & Logging + +### 7.1 Logging +- Structured Logging (Winston) +- Log-Level: ERROR, WARN, INFO, DEBUG +- Request-Logging via Middleware + +### 7.2 Health Checks +``` +GET /api/health +{ + "status": "healthy", + "database": "connected", + "cache": "connected", + "version": "1.0.0" +} +``` + +--- + +## 8. Nicht-funktionale Anforderungen + +| Anforderung | Ziel | +|-------------|------| +| Performance | API-Response < 200ms (p95) | +| VerfΓΌgbarkeit | 99.9% Uptime | +| Skalierung | Horizontal skalierbar | +| Backup | TΓ€gliche DB-Backups | +| Wartung | Zero-Downtime Deployments | + +--- + +## 9. Risiken & Mitigation + +| Risiko | Wahrscheinlichkeit | Impact | Mitigation | +|--------|-------------------|--------|------------| +| IMAP-Integration komplex | Hoch | Mittel | FrΓΌhes Proof-of-Concept | +| SeaDrive-KompatibilitΓ€t | Mittel | Mittel | Fallback zu lokalem Storage | +| Performance bei vielen Dokumenten | Mittel | Hoch | Pagination, Lazy Loading | +| Browser-KompatibilitΓ€t | Niedrig | Niedrig | Moderne Browser voraussetzen | + +--- + +## 10. NΓ€chste Schritte + +1. **Setup** (Tag 1) + - Repository initialisieren + - Docker-Compose Setup + - Datenbank-Migrations + +2. **Phase 1: Auth** (Tag 2-3) + - Login/Register API + - JWT-Implementation + - Frontend Auth-Flow + +3. **Phase 1: Kunden** (Tag 4-5) + - CRUD API + - Frontend Forms + - Listen-View + +4. **Review** (Tag 6) + - Code Review + - Testing + - Deployment auf Staging + +--- + +**Ende des TDD** diff --git a/docs/USER_STORIES.md b/docs/USER_STORIES.md new file mode 100644 index 0000000..07baabf --- /dev/null +++ b/docs/USER_STORIES.md @@ -0,0 +1,427 @@ +# User Stories +# Waldseilgarten Herrenberg CRM + +**Dokument:** Anforderungsspezifikation +**Format:** Job Stories (Jobs-to-be-done) +**PrioritΓ€t:** MoSCoW (Must/Should/Could/Won't) + +--- + +## Phase 1: Foundation + +### πŸ” Authentifizierung + +#### US-001: Als Mitarbeiter mΓΆchte ich mich einloggen +``` +Job: Mich im System authentifizieren + +Akzeptanzkriterien: +- Login mit E-Mail und Passwort +- JWT-Token wird generiert +- Fehlerhafte Logins werden protokolliert +- Session lΓ€uft nach 24h ab + +PrioritΓ€t: MUST +Story Points: 3 +``` + +#### US-002: Als Admin mΓΆchte ich neue Benutzer anlegen +``` +Job: Team-Mitglieder dem System hinzufΓΌgen + +Akzeptanzkriterien: +- E-Mail, Name, Rolle festlegen +- Automatische Willkommens-E-Mail +- Passwort-Reset-Link generieren +- Rollen: Admin, Manager, User + +PrioritΓ€t: MUST +Story Points: 3 +``` + +#### US-003: Als Benutzer mΓΆchte ich mein Passwort Γ€ndern +``` +Job: Meine Zugangsdaten verwalten + +Akzeptanzkriterien: +- Altes Passwort zur BestΓ€tigung +- Neues Passwort muss Richtlinien erfΓΌllen (8 Zeichen, etc.) +- Alle Sessions werden invalidiert + +PrioritΓ€t: SHOULD +Story Points: 2 +``` + +--- + +### πŸ‘₯ Kundenverwaltung + +#### US-101: Als User mΓΆchte ich einen neuen Kunden anlegen +``` +Job: Eine neue Firma im System erfassen + +Akzeptanzkriterien: +- Pflichtfelder: Firmenname +- Optional: Branche, Website, Telefon, E-Mail, Adresse +- Tags hinzufΓΌgen (z.B. "VIP", "LangjΓ€hrig") +- Automatische Kundennummer generieren +- Duplikat-Erkennung (Γ€hnliche Namen warnen) + +PrioritΓ€t: MUST +Story Points: 5 +``` + +#### US-102: Als User mΓΆchte ich Kunden suchen +``` +Job: Schnell einen Kunden finden + +Akzeptanzkriterien: +- Volltextsuche ΓΌber Firmenname +- Filter: Branche, Tags, Erstellungsdatum +- Sortierung: Name, Datum, letzte AktivitΓ€t +- Pagination (20 pro Seite) + +PrioritΓ€t: MUST +Story Points: 5 +``` + +#### US-103: Als User mΓΆchte ich Kundendetails ansehen +``` +Job: Alle Informationen zu einem Kunden einsehen + +Akzeptanzkriterien: +- Übersicht: Stammdaten, Kontakte, Projekte +- AktivitΓ€tshistorie (letzte Γ„nderungen) +- Dokumente des Kunden anzeigen +- Projekte des Kunden listen + +PrioritΓ€t: MUST +Story Points: 3 +``` + +#### US-104: Als User mΓΆchte ich einen Ansprechpartner hinzufΓΌgen +``` +Job: Kontaktpersonen zu einer Firma erfassen + +Akzeptanzkriterien: +- Name, Position, E-Mail, Telefon +- Als "Hauptansprechpartner" markieren +- Mehrere Kontakte pro Firma +- Schnell-Anruf/-E-Mail Buttons + +PrioritΓ€t: MUST +Story Points: 3 +``` + +#### US-105: Als Manager mΓΆchte ich Kunden exportieren +``` +Job: Kundenliste fΓΌr externe Nutzung exportieren + +Akzeptanzkriterien: +- CSV-Export +- Excel-Export +- Auswahl: Alle oder gefilterte Liste +- Datenschutz-konform (nur notwendige Daten) + +PrioritΓ€t: SHOULD +Story Points: 3 +``` + +--- + +### πŸ“ Projektmanagement + +#### US-201: Als User mΓΆchte ich ein neues Projekt anlegen +``` +Job: Ein Projekt fΓΌr einen Kunden starten + +Akzeptanzkriterien: +- Projektname, Beschreibung +- Kunde auswΓ€hlen (oder neu anlegen) +- Zeitraum: Start- und Enddatum +- Budget (optional) +- Status: Neu, Aktiv, Abgeschlossen, etc. +- PrioritΓ€t: Niedrig, Mittel, Hoch, Dringend + +PrioritΓ€t: MUST +Story Points: 5 +``` + +#### US-202: Als User mΓΆchte ich Projektmitglieder zuweisen +``` +Job: Team-Mitglieder einem Projekt zuordnen + +Akzeptanzkriterien: +- Benutzer aus Liste auswΓ€hlen +- Rolle festlegen: Leiter, Mitglied, Beobachter +- Mitglieder sehen Projekt in ihrer Liste +- Benachrichtigung an neue Mitglieder + +PrioritΓ€t: MUST +Story Points: 3 +``` + +#### US-203: Als User mΓΆchte ich den Projektstatus Γ€ndern +``` +Job: Fortschritt des Projekts dokumentieren + +Akzeptanzkriterien: +- Status: Neu β†’ Aktiv β†’ Abgeschlossen +- Status-Γ„nderung mit Kommentar +- Historie aller Status-Γ„nderungen +- Automatische Benachrichtigung an Kunden (optional) + +PrioritΓ€t: MUST +Story Points: 3 +``` + +#### US-204: Als Manager mΓΆchte ich alle Projekte sehen +``` +Job: Überblick ΓΌber alle laufenden Projekte + +Akzeptanzkriterien: +- Dashboard mit KPIs +- Anzahl Projekte pro Status +- Umsatz pro Projekt (falls Budget gesetzt) +- Filter: Meine Projekte, Alle, Nach Kunde + +PrioritΓ€t: SHOULD +Story Points: 5 +``` + +--- + +### πŸ“Š Dashboard + +#### US-301: Als User mΓΆchte ich ein Dashboard sehen +``` +Job: Schnellen Überblick ΓΌber meine Arbeit + +Akzeptanzkriterien: +- Meine offenen Projekte +- Meine Aufgaben (spΓ€ter) +- Ungelesene E-Mails (spΓ€ter) +- Aktuelle AktivitΓ€ten + +PrioritΓ€t: MUST +Story Points: 5 +``` + +#### US-302: Als Manager mΓΆchte ich Team-Statistiken sehen +``` +Job: Team-Performance ΓΌberwachen + +Akzeptanzkriterien: +- Projekte pro Mitarbeiter +- AktivitΓ€ts-Log +- Response-Zeiten (spΓ€ter) + +PrioritΓ€t: SHOULD +Story Points: 5 +``` + +--- + +## Phase 2: Dokumentenverwaltung + +#### US-401: Als User mΓΆchte ich Dokumente hochladen +``` +Job: Dateien zu einem Projekt speichern + +Akzeptanzkriterien: +- Drag & Drop Upload +- Mehrere Dateien gleichzeitig +- Fortschrittsanzeige +- UnterstΓΌtzte Formate: PDF, Office, Bilder +- Max. 50MB pro Datei + +PrioritΓ€t: MUST +Story Points: 5 +``` + +#### US-402: Als User mΓΆchte ich Dokumente herunterladen +``` +Job: Gespeicherte Dateien abrufen + +Akzeptanzkriterien: +- Einzelner Download +- Mehrfach-Auswahl (ZIP) +- Vorschau fΓΌr PDF/Bilder +- Download-Tracking + +PrioritΓ€t: MUST +Story Points: 3 +``` + +#### US-403: Als User mΓΆchte ich Dokumente versionieren +``` +Job: Aktualisierte Dateien hochladen + +Akzeptanzkriterien: +- Neue Version hochladen +- Alte Versionen anzeigen +- Auf alte Version zurΓΌcksetzen +- Versionsnummer automatisch erhΓΆhen + +PrioritΓ€t: SHOULD +Story Points: 5 +``` + +--- + +## Phase 3: Aufgabenmanagement + +#### US-501: Als User mΓΆchte ich Aufgaben erstellen +``` +Job: To-Dos zu einem Projekt hinzufΓΌgen + +Akzeptanzkriterien: +- Titel, Beschreibung +- FΓ€lligkeitsdatum +- PrioritΓ€t +- ZustΓ€ndigen zuweisen +- Projekt zuordnen + +PrioritΓ€t: MUST +Story Points: 5 +``` + +#### US-502: Als User mΓΆchte ich Aufgaben als erledigt markieren +``` +Job: Fortschritt dokumentieren + +Akzeptanzkriterien: +- Checkbox fΓΌr Erledigt +- Erledigungsdatum +- Wer hat erledigt? +- Kommentar zur Erledigung + +PrioritΓ€t: MUST +Story Points: 3 +``` + +#### US-503: Als User mΓΆchte ich ein Kanban-Board sehen +``` +Job: Aufgaben visuell organisieren + +Akzeptanzkriterien: +- Spalten: Offen, In Arbeit, Erledigt +- Drag & Drop zwischen Spalten +- Filter nach ZustΓ€ndigem +- Farbcodierung nach PrioritΓ€t + +PrioritΓ€t: SHOULD +Story Points: 8 +``` + +--- + +## Phase 4: E-Mail-Integration + +#### US-601: Als Admin mΓΆchte ich ein IMAP-Postfach verbinden +``` +Job: E-Mails automatisch importieren + +Akzeptanzkriterien: +- IMAP-Server, Port, SSL +- Benutzername, Passwort +- Test-Verbindung +- Sync-Intervall (z.B. alle 15 Min) + +PrioritΓ€t: MUST +Story Points: 8 +``` + +#### US-602: Als User mΓΆchte ich E-Mails sehen +``` +Job: Importierte E-Mails im CRM ansehen + +Akzeptanzkriterien: +- Absender, Betreff, Datum +- HTML- und Text-Ansicht +- AnhΓ€nge anzeigen/downloaden +- Als gelesen/ungelesen markieren + +PrioritΓ€t: MUST +Story Points: 5 +``` + +#### US-603: Als User mΓΆchte ich E-Mails zuordnen +``` +Job: E-Mails Kunden/Projekten zuweisen + +Akzeptanzkriterien: +- Manuelle Zuordnung zu Projekt +- Zuordnung zu Kunde +- Automatische VorschlΓ€ge (Absender) +- Mehrere E-Mails gleichzeitig zuordnen + +PrioritΓ€t: MUST +Story Points: 5 +``` + +--- + +## Phase 5: Erweiterungen + +#### US-701: Als User mΓΆchte ich Google Calendar verbinden +``` +Job: Termine synchronisieren + +Akzeptanzkriterien: +- OAuth-Login mit Google +- Zwei-Wege-Sync +- Projekt-Termine als Calendar-Events +- Aufgaben-Fristen als Erinnerungen + +PrioritΓ€t: COULD +Story Points: 8 +``` + +#### US-702: Als Manager mΓΆchte ich Berichte exportieren +``` +Job: Projektberichte erstellen + +Akzeptanzkriterien: +- PDF-Export +- Projekt-Zusammenfassung +- Zeitraum auswΓ€hlen +- Logo/Branding + +PrioritΓ€t: COULD +Story Points: 5 +``` + +#### US-703: Als User mΓΆchte ich SeaDrive synchronisieren +``` +Job: Dokumente mit Seafile syncen + +Akzeptanzkriterien: +- SeaDrive-Account verbinden +- AusgewΓ€hlte Ordner syncen +- Konflikt-Resolution +- Offline-Zugriff + +PrioritΓ€t: COULD +Story Points: 13 +``` + +--- + +## Übersicht + +| Phase | Stories | SP | MUST | SHOULD | COULD | +|-------|---------|----|------|--------|-------| +| 1 | 15 | 47 | 11 | 4 | 0 | +| 2 | 3 | 13 | 2 | 1 | 0 | +| 3 | 3 | 16 | 2 | 1 | 0 | +| 4 | 3 | 18 | 3 | 0 | 0 | +| 5 | 3 | 26 | 0 | 0 | 3 | +| **Gesamt** | **27** | **120** | **18** | **6** | **3** | + +**Velocity-SchΓ€tzung:** 20 SP/Woche +**Gesamt-Dauer:** ~6 Wochen (Nur MUST) / ~9 Wochen (Alles) + +--- + +**Ende User Stories**