Files
leocrm/PROGRESS.md
T

16 KiB

LeoCRM — Umbau Progress

Plan: MASTER-PLAN.md Start: 2026-07-23


Phase 0: Vorbereitung & Cleanup

Task Status Datum Notiz
0.1 done 2026-07-23 codebase-vs-requirements.md neu geschrieben, security-review-phase2.md Resolution Summary, architecture.md Implementation Status, MASTER-PLAN.md + PROGRESS.md erstellt
0.2 done 2026-07-23 lucide-react installieren + Icons migrieren
0.3 done 2026-07-23 date-fns installieren + Datum-Formatierung
0.4 done 2026-07-23 hooks.ts aufteilen — 1298 Zeilen → 12 Module + Re-Export-Hub
0.5 done 2026-07-23 calendarStore.ts nach store/ verschoben, stores/ entfernt
0.6 done 2026-07-23 frontend-gap-analysis.md gespeichert (176 Zeilen)
0.7 done 2026-07-23 UI-Design-Richtlinien erstellt (docs/ui-design-guidelines.md, 535 Zeilen)
0.8 done 2026-07-23 Theme-Customization Backend: 4 Felder (primary_color, accent_color, font_family, border_radius) zu model/schema/service, Migration 0023
0.9 done 2026-07-23 Theme-Customization Frontend: SettingsTheme.tsx, themeStore.ts, Route + Nav, i18n keys, Live-Preview, Dark-Mode-Toggle
0.10 done 2026-07-23 RBAC-Audit: 4 Plugins (calendar, dms, entity_links, tags) mit Permissions versehen, 53 Routes mit require_permission abgesichert
0.11 done 2026-07-23 LiteLLM-Cleanup: llm_client.py von httpx auf litellm.acompletion migriert, AI_PROVIDER env var, System-Prompt companies→contacts
0.12 done 2026-07-23 KI-Agent-Framework: docs/plugin-development-guide.md (348 Zeilen), agent_capabilities Feld im PluginManifest
0.13 done 2026-07-23 Heartbeat konfigurierbar: ProactiveSettings um heartbeat_enabled/interval/target_room erweitert, Migration 0024, Schema+Service+Routes, Frontend-UI, Jobs.py nutzt Settings
0.14 done 2026-07-23 Unified Search Field-Level RBAC: resolve_permissions + filter_fields_by_permission in search route, entity-to-module mapping
0.15 done 2026-07-23 Undo/History-System: EntityHistory model+service+routes, Migration 0025, contact_service Integration, HistoryViewer Komponente, ContactDetail Integration, i18n
0.16 done 2026-07-23 Storage Backend: app/core/storage.py (LocalStorage + S3Storage), DMS + Attachments + Mail auf Storage Backend umgestellt, minio zu requirements, S3 env vars
0.17 done 2026-07-23 Import/Export: unified Contact Fields (firstname, surname, email_1, phone_1, mobilephone, function), Company-Import als Contact type=company, Export mit unified Fields, Backward-compat für alte CSV-Spalten
0.18 done 2026-07-23 .gitignore: webui→frontend, python-jose entfernt, pyproject.toml Python 3.12, .env aus Git entfernt, dump.rdb+test.txt gelöscht, JWT-Vars aus .env.docker.example entfernt
0.19 done 2026-07-23 Mail-Salt Security-Fix: per-account random salt (generate_salt), encrypt/decrypt mit salt_b64, backward-compat mit Legacy-Salt, Migration 0026
0.20 done 2026-07-23 AGPL ersetzt: PyMuPDF→pypdf (BSD), OnlyOffice→Collabora (LGPL/MPL), requirements.txt, LICENSE (MIT), THIRD_PARTY_LICENSES.md

Phase 1B: Backend Plugins — entity_type='company' → 'contact'

Task Status Datum Notiz
1.9 done 2026-07-23 entity_links Plugin: entity_type pattern ^(company
1.10 done 2026-07-23 unified_search Plugin: CompanySearchProvider → ContactSearchProvider, index_company → index_contact, events company.created/updated → contact.created/updated, search_engine mapping aktualisiert
1.11 done 2026-07-23 calendar Plugin: entity_type pattern ^(company
1.12 done 2026-07-23 tags Plugin: entity_type pattern ^(company
1.13 done 2026-07-23 mail Plugin: company_id → contact_id in model, schemas, routes, services
1.14 done 2026-07-23 test_sample Plugin: company.created → contact.created
1.15 done 2026-07-23 Event Names Unify: Alle company.created/updated/deleted → contact.created/updated/deleted
1.16 done 2026-07-23 DB Migration 0027: entity_type 'company' → 'contact' in entity_links, tag_assignments, calendar_entry_links, addresses; mails company_id → contact_id
1.17 done 2026-07-23 Backend Tests Update: test_companies.py, test_unified_search.py, test_entity_links.py, test_calendar.py, test_tags.py, test_ai_proactive.py, test_tenant.py — entity_type='company' → 'contact'
1.18 done 2026-07-23 Permission-Registry-Cleanup: companies:read/write/delete aus CORE_PERMISSIONS entfernt (bereits in 1A)
1.19 done 2026-07-23 Addresses entity_type='company' → 'contact' in address_service.py (bereits in 1A)
1.20 done 2026-07-23 conftest.py Update: Company → Contact, CompanyContact → ContactPerson, TRUNCATE ohne companies/company_contacts

Phase 1B Gesamt: Complete


Phase 1C: Frontend — Unified Contact UI

Task Status Datum Notiz
1.18 done 2026-07-23 Contact-Detail-Route /contacts/:id mit React.lazy
1.19 done 2026-07-23 ContactList Type-Filter Toggle (Alle/Firmen/Personen)
1.20 done 2026-07-23 ContactDetail ContactPerson-Verwaltung (bereits vorhanden)
1.21 done 2026-07-23 ContactEditModal für beide Types (bereits vorhanden)
1.22 done 2026-07-23 Company-Hooks aus hooks.ts entfernt
1.23 done 2026-07-23 Frontend Type-Definitions aktualisiert (calendar, tags, search, mail, types)
1.24 done 2026-07-23 Dashboard.tsx aktualisiert (keine Änderung nötig)
1.25 done 2026-07-23 GlobalSearchResults.tsx aktualisiert
1.26 done 2026-07-23 ContactFolderTree in ContactList integriert (bereits vorhanden)
1.27 done 2026-07-23 React Hook Form + Zod in ContactEditModal
1.28 done 2026-07-23 Frontend-Tests aktualisiert, tsc --noEmit OK (nur pre-existing Dms-Fehler)

Phase 1C Gesamt: Complete


Phase 1-7: Noch nicht gestartet

Siehe MASTER-PLAN.md für alle Tasks.

Phase 2: Code-Splitting & Virtual Scrolling

Task Status Datum Notiz
2.1 done 2026-07-23 React.lazy + Suspense für 25 Pages, PageLoader Komponente
2.2 done 2026-07-23 @tanstack/react-virtual installiert
2.3 done 2026-07-23 DataGrid Virtual Scrolling (useVirtualizer, 53px rows, 10 overscan, auto-skip <50)
2.4 done 2026-07-23 MailList Virtual Scrolling (80px rows, 8 overscan, auto-skip <50)
2.5 done 2026-07-23 ContactList Virtual Scrolling (list/table/cards, dynamic row estimate)
2.6 done 2026-07-23 FileExplorer + FileGrid virtualisiert, AuditLog via DataGrid
2.7 done 2026-07-23 Manual chunks: react-vendor, tanstack, ui, i18n. Vite build OK (3212 modules, ~9s)

Phase 2 Gesamt: Complete (Commit a8331fb)

Phase 1: Unified Contact Model — Vollendung (Backend + Frontend)

Task Status Datum Notiz
1.1 done 2026-07-23 app/routes/companies.py entfernt
1.2 done 2026-07-23 app/services/company_service.py entfernt
1.3 done 2026-07-23 app/models/company.py entfernt (war shim)
1.4 done 2026-07-23 app/schemas/company.py entfernt
1.5 done 2026-07-23 action_mapper.py: Company-Intents → Contact-Intents
1.6 done 2026-07-23 workflows/engine.py: company.created → contact.created
1.7 done 2026-07-23 worker.py: index_company entfernt
1.8 done 2026-07-23 seeds.py: keine Company-Seed-Daten gefunden
1.9 done 2026-07-23 entity_links: entity_type → ^contact$, company.deleted → contact.deleted
1.10 done 2026-07-23 unified_search: CompanySearchProvider → Contact, index_company → index_contact, events unified
1.11 done 2026-07-23 calendar: entity_type → ^contact$, CalendarType='company' beibehalten
1.12 done 2026-07-23 tags: entity_type → ^(contact
1.13 done 2026-07-23 mail: company_id → contact_id in model/schemas/routes/services
1.14 done 2026-07-23 test_sample: company.created → contact.created
1.15 done 2026-07-23 Alle company.* events → contact.* events vereinheitlicht
1.16 done 2026-07-23 DB-Migration 0027: entity_type company→contact, mails.company_id→contact_id
1.17 done 2026-07-23 Backend-Tests aktualisiert (test_companies, test_unified_search, test_entity_links, etc.)
1.18 done 2026-07-23 Permission-Registry: companies:read/write/delete entfernt, CORE_FIELD_DEFINITIONS aktualisiert
1.19 done 2026-07-23 Addresses: entity_type → ^contact$ only
1.20 done 2026-07-23 conftest.py: Company→Contact, CompanyContact→ContactPerson, TRUNCATE bereinigt
1.21 done 2026-07-23 Contact-Detail-Route /contacts/:id mit React.lazy
1.22 done 2026-07-23 Company-Hooks aus hooks.ts entfernt
1.23 done 2026-07-23 Frontend Type-Definitions aktualisiert (calendar, tags, search, mail, types)
1.24 done 2026-07-23 Dashboard.tsx aktualisiert (keine Änderung nötig)
1.25 done 2026-07-23 GlobalSearchResults.tsx: type 'company' → 'contact'
1.26 done 2026-07-23 ContactFolderTree in ContactList (bereits vorhanden)
1.27 done 2026-07-23 React Hook Form + Zod in ContactEditModal
1.28 done 2026-07-23 Frontend-Tests aktualisiert, tsc --noEmit OK (nur pre-existing Dms.tsx errors)

Phase 1 Gesamt: Complete (Commits: 879106c, 5d79b4f, b15a62b)

Verifikation Phase 1

  • App startet OK (245 Routes)
  • Python Syntax OK für alle geänderten Dateien
  • Frontend: 251/265 Tests pass (14 pre-existing failures: Dms/Mail/ShareDialog)
  • Backend-Tests: können nicht ausgeführt werden (kein PostgreSQL im Container) ⚠️
  • Keine verbleibenden company.* Events oder companies: Permissions

Phase 3: Plugin-UI-System

Phase 3 Gesamt: Complete (Commit fc96a2f)

Phase 3.5: Automation & Agents Plugin

Phase 3.5 Gesamt: Complete (Commit 5dc6f29)

Phase 4: KI-UI-Steuerung

# Status Datum Was gemacht wurde
4.1 done 2026-07-23 UI-Command-Protokoll: JSON schema mit 6 command types (navigate, filter, open_contact, modal, tab, settings) in schemas.py
4.2 done 2026-07-23 WebSocket-Endpoint /ws/ai-ui-control + REST endpoints (POST /command, GET /command/{id}/status, GET /online-users) in ai_ui_control plugin
4.3 done 2026-07-23 useAIUIControl hook: WS client mit auto-reconnect, command dispatch, feedback sending
4.4 done 2026-07-23 Command: Navigate — useNavigate() für Route-Wechsel
4.5 done 2026-07-23 Command: Filter — URL-Search-Params + store pendingFilter
4.6 done 2026-07-23 Command: Open Contact — navigate zu /contacts/:id
4.7 done 2026-23 Command: Modal — store activeModal, ContactDetail syncs personModalOpen
4.8 done 2026-07-23 Command: Tab — store activeTab, ContactDetail syncs via useEffect
4.9 done 2026-07-23 Command: Settings — navigate zu /settings/:section + pendingSettings
4.10 done 2026-07-23 UI-Action-Feedback: sendFeedback via WS, store lastFeedback
4.11 done 2026-07-23 Visuelle KI-Indikation: AIUIControlIndicator component (Bot icon, toast, pulse animation)
4.12 done 2026-07-23 18 Vitest tests: command protocol, store actions, feedback, visual indication

Phase 4 Gesamt: Complete

Verifikation Phase 4

  • TSC: 0 neue errors (nur 2 pre-existing Dms.tsx errors)
  • Vitest: 18/18 AI UI Control tests pass
  • Keine neuen Regressionen (AppShell tests waren pre-existing failing)
  • Backend: ai_ui_control plugin mit WS + REST, service_container registration
  • Frontend: useAIUIControl hook, aiUIControlStore, AIUIControlIndicator, i18n DE/EN
  • Neue Dateien: 8 (plugin: __init__.py, plugin.py, routes.py, schemas.py, websocket_manager.py; frontend: store, hook, API, indicator, tests)

Phase 5: API-Vollständigkeit & Frontend-Anbindung

Batch 1 (Tasks 5.1-5.3)

| # | Status | Datum | Was gemacht wurde | ||---|--------|------|-------------------| | 5.1 | done | 2026-07-23 | API-Audit: docs/api-audit.md mit 158 UI-Funktionen in 24 Kategorien, alle per API erreichbar. 0 fehlende Endpoints. UI-State (Sidebar/Tab/Filter) durch Task 5.2 abgedeckt. 9 Tests (Audit-Dokument + Endpoint-Reachability) | | 5.2 | done | 2026-07-23 | User-Preferences-API: Model (UserPreference mit TenantMixin), API Router (GET/PUT/DELETE /api/v1/user/preferences), Migration 0028, Frontend API + useUserPreferences hook mit uiStore-Sync, i18n DE/EN, 13 Backend-Tests (CRUD, Tenant-Isolation, CSRF, RBAC) | | 5.3 | done | 2026-07-23 | Workflow-API-Frontend-Modul: frontend/src/api/workflows.ts mit TypeScript types + React Query hooks (CRUD, Instances, Advance/Cancel), 13 Frontend-Tests |

Phase 5 Batch 1 Gesamt: Complete

Verifikation Phase 5 Batch 1

  • TSC: 0 neue errors (nur 2 pre-existing Dms.tsx errors)
  • Backend Tests: 22/22 pass (13 user_preferences + 9 api_audit)
  • Frontend Tests: 13/13 pass (workflows.test.ts)
  • 3 Commits mit klaren Messages
  • TenantMixin für neues DB-Model (UserPreference)
  • RBAC (require_permission) für alle neuen API-Routes
  • i18n (de.json, en.json) für Frontend-Änderungen
  • Keine .env committet
  • Bestehende Patterns verwendet: apiClient, Zustand stores, React Query hooks

Neue Dateien Phase 5 Batch 1

  • docs/api-audit.md — API-Audit-Dokument
  • app/models/user_preference.py — UserPreference SQLAlchemy Model
  • app/routes/user_preferences.py — User Preferences API Router
  • alembic/versions/0028_user_preferences.py — Migration
  • frontend/src/api/userPreferences.ts — Frontend API module
  • frontend/src/hooks/useUserPreferences.ts — useUserPreferencesSync hook
  • frontend/src/api/workflows.ts — Workflow API frontend module
  • frontend/src/api/__tests__/workflows.test.ts — Workflow API tests
  • tests/test_user_preferences.py — User preferences backend tests
  • tests/test_api_audit.py — API audit tests

Modifizierte Dateien Phase 5 Batch 1

  • app/main.py — user_preferences router import + include_router
  • app/routes/__init__.py — user_preferences import
  • app/core/permission_registry.py — user_preferences:read/write permissions
  • app/core/permissions.py — user_preferences in legacy role permissions
  • tests/conftest.py — UserPreference model import + Contact seed fix (industry field)
  • frontend/src/i18n/locales/de.json — userPreferences i18n
  • frontend/src/i18n/locales/en.json — userPreferences i18n