# LeoCRM — Codebase vs Requirements (IST-Stand Juli 2026) **Datum:** 2026-07-23 **Prüfer:** Agent Zero **Methode:** Vollständige Code-Inspektion gegen requirements.md und architecture.md --- ## 1. Aktueller Stack | Komponente | Code-Realität | Requirements | Status | |------------|-------------|-------------|--------| | Backend | FastAPI 0.115+ | FastAPI | ✅ kompatibel | | Python | 3.12 (Dockerfile) | 3.12 | ✅ kompatibel | | Datenbank | PostgreSQL 16 + asyncpg | PostgreSQL 16 | ✅ erfüllt | | ORM | SQLAlchemy 2.0 async | SQLAlchemy 2.0 | ✅ erfüllt | | Frontend | React 18 SPA (Vite) | React SPA | ✅ erfüllt | | Auth | Session-based (Redis + HttpOnly Cookie) | Session-based | ✅ erfüllt | | Deployment | Docker Multi-Stage + Coolify | Docker + Coolify | ✅ erfüllt | | Testing | pytest + httpx (Backend), Vitest (Frontend) | pytest + Vitest + Playwright | ⚠️ Playwright fehlt | | KI | LiteLLM + PydanticAI | KI-Copilot | ✅ erfüllt + erweitert | | Search | pgvector + FTS Hybrid (RRF Fusion) | FTS | ✅ übertroffen | ## 2. Projekt-Struktur (IST) ``` app/ ├── main.py — FastAPI app, lifespan, middleware, router wiring ├── config.py — Pydantic Settings (env: LEOCRM_*) ├── deps.py — Auth dependencies, require_permission ├── core/ │ ├── auth.py — Session auth, bcrypt, Redis session store │ ├── tenant.py — Tenant-scoping ORM filter │ ├── permissions.py — RBAC resolver with Redis cache │ ├── permission_registry.py — Central permission catalog │ ├── event_bus.py — In-process async event bus │ ├── service_container.py — DI container │ ├── cache.py — Redis cache wrapper │ ├── jobs.py — ARQ job queue integration │ ├── worker.py — ARQ worker configuration │ ├── audit.py — Audit log + deletion log │ ├── notifications.py — Notification service │ ├── monitoring.py — Prometheus metrics + structlog │ ├── rate_limit.py — Redis-based rate limiting │ ├── middleware.py — CSRF, CORS, request logging │ └── seeds.py — Seed data ├── models/ — 20 SQLAlchemy models (all with TenantMixin) ├── schemas/ — 19 Pydantic schema modules ├── services/ — 18 service modules ├── routes/ — 22 FastAPI routers ├── plugins/ │ ├── base.py — BasePlugin class │ ├── manifest.py — PluginManifest, PluginRouteDef │ ├── registry.py — PluginRegistry (698 lines) │ ├── migration_runner.py — Plugin DB migration runner │ └── builtins/ — 12 built-in plugins ├── workflows/ │ ├── engine.py — Workflow execution engine (306 lines) │ └── code/onboarding.py — Onboarding workflow ├── ai/ │ ├── llm_client.py — LLM client (LiteLLM migration pending) │ └── action_mapper.py — NL→API action mapping └── utils/ frontend/ ├── src/ │ ├── pages/ — 27 pages (~7.826 lines) │ ├── components/ — 70 components (~13.893 lines) │ ├── api/ — 12 API modules (~3.456 lines) │ ├── store/ + stores/ — 5 Zustand stores (~461 lines) │ ├── hooks/ — 5 custom hooks (~247 lines) │ ├── i18n/ — DE + EN (750 keys each) │ └── routes/ — Router + ProtectedRoute ├── package.json — 26 deps, 15 devDeps ├── vite.config.ts — React + Vitest + proxy └── tailwind.config.js — Design tokens, dark mode ``` ## 3. Requirements-Erfüllung ### Core Features (v1) | Feature | Status | Anmerkung | |---------|--------|-----------| | F-AUTH-01: Login/Logout | ✅ | Session + Redis + bcrypt | | F-AUTH-03: User Management | ✅ | CRUD + RBAC | | F-AUTH-04: RBAC | ✅ | Role + Groups + Field-Level | | F-AUTH-05: Password Reset | ✅ | Token-based, 1h expiry | | F-AUTH-06: Custom Roles | ✅ | Role editor in frontend | | F-AUTH-07: Multi-Tenant | ✅ | ORM filter + RLS (Migration 0015) | | F-COMP-01-08: Company CRUD | ⚠️ | Unified Contact Model — Company = Contact type='company'. Company-Routes werden entfernt (Phase 1) | | F-CONT-01-08: Contact CRUD | ✅ | Unified Contact mit type='company'\|'person' + ContactPerson 1:N | | F-CORE-01: Event Bus | ✅ | In-process async, 53 Zeilen | | F-CORE-02: Multi-Tenant | ✅ | TenantMixin + RLS | | F-CORE-03: Plugin System | ✅ | 12 Plugins, Registry, Manifest, Lifecycle | | F-CORE-07: ARQ Job Queue | ✅ | Redis-based, worker.py | | F-CORE-08: Caching | ✅ | Redis cache wrapper | | F-CORE-10: Storage | ❌ | Architecture beschreibt StorageBackend, aber NICHT implementiert. Hardcoded Pfade. (Phase 0.16) | | F-DATA-03: Validation | ✅ | Pydantic auf allen Inputs | | F-DATA-04: PostgreSQL | ✅ | PostgreSQL 16 + asyncpg | | F-PLUGIN-01-02: Plugin System | ✅ | Registry, Manifest, Lifecycle, Migration Runner | | F-SEC-01: CSRF | ✅ | SameSite=Strict + Origin validation | | F-SEC-02: CSP | ✅ | In architecture definiert (Nginx fehlt — Phase 0) | | F-SEARCH-01: Global Search | ✅ | Hybrid FTS + Vector + RRF + KI Query Understanding | | F-AI-01: KI-Copilot | ✅ | LiteLLM + PydanticAI + tool_registry | | F-WF-01: Workflow Engine | ✅ | 306 Zeilen, 4 Step-Types (action/approval/notification/condition) | | F-INFRA-01: Health Check | ✅ | /api/v1/health | | F-INFRA-04: Monitoring | ✅ | Prometheus + structlog | | F-PERF-01: Performance | ⚠️ | Indizes vorhanden, aber kein Virtual Scrolling (Phase 2) | | F-TEST-01: Testing | ⚠️ | Backend + Frontend Tests da, E2E fehlt (Phase 5) | ### Plugin Features (v2) | Plugin | Status | Anmerkung | |--------|--------|-----------| | Calendar | ✅ | 12 Komponenten, ICS, Kanban, Resources, Subtasks | | DMS | ✅ | 9 Komponenten, OnlyOffice (→Collabora Phase 0.20), Share, Bulk | | Mail | ✅ | 13 Komponenten, PGP, Vacation, Rules, Templates, IMAP/SMTP | | Tags | ✅ | TagPicker, TagCloud, BulkTagDialog | | Permissions | ✅ | File/folder permissions, share links | | Entity Links | ✅ | File↔Entity links | | Unified Search | ✅ | Hybrid FTS+Vector, 5 Provider, KI Query Understanding | | AI Assistant | ✅ | Multi-provider LLM, Agents, Tools, Streaming | | AI Proactive | ✅ | Context-aware suggestions, SSE, Heartbeat, Deep Analysis | | Kommunikation | ✅ | WebSocket messaging, MiniApps, Rich Content Blocks | | Report Generator | ⚠️ | Backend da (CSV/Excel/JSON), Frontend fehlt, PDF fehlt (Phase 5.18-5.19) | | System Notifications | ✅ | Participant handler, notification types | ## 4. Bekannte Lücken (im MASTER-PLAN.md eingeplant) | Lücke | Phase | Task | |-------|-------|------| | Storage Backend (S3) | 0 | 0.16 | | Company-Routes entfernen | 1 | 1.1-1.20 | | Plugin-UI-System (PluginRegistry) | 3 | 3.1-3.10 | | Automation & Agents Plugin | 3.5 | 3.11-3.32 | | KI-UI-Steuerung | 4 | 4.1-4.12 | | E2E Tests (Playwright) | 5 | 5.4-5.11 | | Backup-System | 5 | 5.15 | | MCP Integration | 5 | 5.16-5.17 | | Report Frontend + PDF | 5 | 5.18-5.19 | | Custom Fields UI | 5 | 5.20 | | Tasks-Plugin | 5 | 5.21 | | Saved Searches | 5 | 5.22 | | Deduplication | 5 | 5.23 | | PWA | 5 | 5.24 | | Dashboard-System | 5 | 5.25 | | Code-Splitting | 2 | 2.1-2.7 | | Virtual Scrolling | 2 | 2.2-2.6 | | RHF + Zod überall | 6 | 6.1-6.6 | | AGPL-Lizenzen (PyMuPDF, OnlyOffice) | 0 | 0.20 | | RBAC in 4 Plugins | 0 | 0.10 | | Undo/History | 0 | 0.15 | | .env in Git | 0 | 0.18 | | Mail-Salt hardcoded | 0 | 0.19 | ## 5. Statistik | Metrik | Wert | |--------|------| | Backend Python-Zeilen | ~35.800 | | Frontend TS/TSX-Zeilen | ~30.000 | | Test-Zeilen (Backend) | ~17.300 | | Test-Zeilen (Frontend) | ~3.045 | | Plugins | 12 | | API-Endpoints | ~120+ | | DB-Migrationen | 22 | | UI-Komponenten | 12 (+2 zusätzliche) | | Frontend Pages | 27 | | i18n Keys (pro Sprache) | 750 | ## 6. Fazit Die Codebase hat den ursprünglichen Requirements-Review (der SQLite, Jinja2, keine Plugins beschrieb) **weit übertroffen**. Das unified Contact Model, das Plugin-System, die KI-Integration und die Vector Search sind implementiert und funktionieren. Die verbleibenden Lücken sind im `MASTER-PLAN.md` detailliert eingeplant (~590h Gesamt-Aufwand über 8 Phasen + Phase 3.5).