Backend: TradeEvent Prisma model, NestJS CRUD module with date validation
and tenant isolation. Frontend: Admin Events page with create/edit/delete
modals, dashboard countdown tiles showing upcoming/ongoing/ended events
with progress bars, and useEventCountdown hook for live timer updates.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Sub-rows now have an indigo left border, tinted background and stronger
indent to visually separate them from company rows. Dark mode variants
included. Expanded company row also gets a primary-colored left border.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Companies with linked contacts now show an expand arrow. Clicking it
lazy-loads and displays contacts as indented sub-rows with name,
position, email, phone, type badge and status. Backend gains companyId
filter on GET /contacts for efficient per-company querying.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The voucherlist endpoint returns items with 'id' field, but our interface
defined it as 'voucherId', causing undefined IDs when fetching voucher details.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The Lexware Office API requires voucherStatus as a mandatory parameter
for the /v1/voucherlist endpoint. Without it, the API returns 400 Bad
Request. Using 'any' fetches vouchers regardless of status.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
When importing contact persons from Lexware, if the parent company
is already in the CRM (detected via linkedMap), the companyId is now
passed to createContact so the contact is properly associated.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The backend DTO validation enforces @Max(100) on pageSize. The ImportTab
was requesting pageSize=500, causing a 400 Bad Request. This left the
linkedMap empty and showed import buttons for already-imported contacts.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Import tab now loads all CRM companies/contacts and cross-references
lexwareContactId to detect already-imported entries. Linked contacts show
a green badge and "Öffnen" link instead of import buttons.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- TenantGuard: remove PLATFORM_ADMIN bypass, require tenantId for all users
- lexware-contacts.service: add defensive tenantId check in importAsCompany
and importAsContact with clear BadRequestException message
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Bug in lexware-contacts.service.ts:229 — tenantId: String (type)
instead of tenantId: user.tenantId (value). Affects importCompany,
likely also importContact.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Document white screen fix (missing hooks commit)
- Document server deployment: migrations, seed data, container restart
- Document CRM settings tabbed layout + Lexware import redesign
- List all commits and remaining open items for CRM backend developer
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Backend: new CRUD services/controllers for Industries, AccountTypes,
RelationshipTypes, CompanyRelationships with Prisma schema migration
- Frontend: new hooks, API functions, and types for all config entities
- CompanyDetailPage redesign with ActivityFeed, RelationshipsCard
- CompanyFormModal extended with industry, account type, owner fields
- Activities service now supports companyId filter + includeContacts
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Replace search-only ImportTab with paginated browsable list of all Lexware contacts
- Add expandable Ansprechpartner (contact persons) section per company
- Individual Ansprechpartner can be imported as CRM contacts
- Add pagination controls for navigating large contact lists
- Search filter still available (min. 3 chars, backend MinLength constraint)
- Clean up useLexwareContacts hook with proper query key
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
New admin page under /crm/lexware-sync with two tabs:
- Import: Search Lexware contacts and import as CRM company or contact
- Export: List CRM companies/contacts and push to Lexware Office
Accessible via CRM Settings page (admin-only).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
React hooks must not be called after conditional returns (Rules of Hooks).
Moves all hook calls above the isModuleEnabled check in LexwareSection
and DealVouchersSection to prevent silent component crashes.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- New CrmSettingsContext with localStorage persistence (later swappable to API)
- CrmSettingsPage: toggle switches per CRM module (Kontakte, Unternehmen,
Vorgänge, Pipelines), only accessible for PLATFORM_ADMIN/TENANT_ADMIN
- CrmModuleGuard: route protection for disabled modules (redirect to dashboard)
- Sidebar: NavLinks conditionally rendered based on module settings
- "Einstellungen" NavLink in CRM section (admin-only, gear icon)
- CRM section hidden when all modules disabled and user is not admin
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- New Company CRUD: CompaniesPage (list/search/pagination), CompanyFormModal,
CompanyDetailPage (contacts + deals tables)
- Sidebar: "Unternehmen" NavLink between Kontakte and Vorgänge
- ContactsPage: Company column, ContactFormModal: company search + position field,
ContactDetailPage: company link + position display
- DealsPage: Company column, DealFormModal: company search dropdown,
DealDetailPage: company link in info card
- Types/API/Hooks extended with Company entity, cross-entity query invalidation
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Update INSIGHT-CRM.md with complete Company API documentation,
Contact/Deal changes (companyId, position), and frontend integration
suggestions. Update Summarize.md with current test results.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- PipelinesPage: Stages können jetzt per Doppelklick oder Stift-Icon
inline bearbeitet werden (Name, Farbe) via PATCH endpoint
- DealDetailPage: Nutzt jetzt deal.pipeline.stages direkt statt
separatem usePipeline() API-Call (Backend liefert alle Stages mit)
- UI-Texte: "Deals" → "Vorgänge", "Deal" → "Vorgang" in allen
user-facing Strings (Sidebar, Seiten, Modals, Fehlermeldungen)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- New Company model with full CRUD under /api/v1/crm/companies
- Contact now has companyId relation + position field
- Deal now has companyId relation
- Company detail includes contacts (top 20) and deals (top 10)
- All endpoints include company in responses
- Swagger tags renamed: Deals -> Vorgaenge (Deals)
- Error messages use "Vorgang" instead of "Deal"
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Confirmed all 6 frontend assumptions, documented new PATCH stage
endpoint and HTTPS router. Activity list already supported.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- New PATCH /pipelines/:id/stages/:stageId endpoint to update
stage name, color, and sortOrder
- Added HTTPS (websecure) Traefik router for CRM service
- Both requested by frontend developer via INSIGHT-CRM.md
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Initiale Dokumentation des CRM-Frontend-Status fuer die Abstimmung
zwischen Frontend- und Backend-Entwickler.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Komplette CRM-Frontend-Integration in die bestehende React-GUI:
- Types, API-Client und React Query Hooks für alle CRM-Entitäten
- Kontakte: Liste mit Suche/Filter, Detail mit Aktivitäten-Timeline, Create/Edit Modal
- Deals: Liste mit Pipeline/Stage/Status-Filter, Detail mit Fortschrittsbalken, Create/Edit Modal
- Pipelines: Verwaltungsseite mit klappbaren Cards und Stage-Management
- Aktivitäten: Formular-Modal für Notizen, Anrufe, E-Mails, Meetings, Aufgaben
- CRM-Navigation in Sidebar (aufklappbar, mit Inline-SVG-Icons)
- Routen in App.tsx für alle CRM-Seiten
- Vite-Proxy für lokale CRM-API-Entwicklung
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Core-api router with Host+PathPrefix(/api) was catching CRM requests.
Added Host rule and priority=100 to ensure CRM router takes precedence
for /api/v1/crm/* paths.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
PgBouncer in transaction pool mode strips the search_path startup
parameter, which Prisma needs for the app_crm schema. CRM now
connects directly to PostgreSQL.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Comprehensive briefing for a new Claude Code chat to build the CRM
container service, including: protected paths, architecture overview,
JWT validation, database schema conventions, Docker integration,
multi-tenancy rules, and quick-start guide.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Comprehensive guide (INTEGRATION.md) explaining how external container
applications can integrate with the INSIGHT platform, including:
- Docker network integration and service discovery
- JWT authentication and token validation (RS256)
- API endpoints and communication patterns
- Traefik routing configuration
- Database access via PgBouncer
- Redis caching with namespace conventions
- Frontend sidebar integration
- Security requirements and checklist
- Example docker-compose extension
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Increase min-height from 56px to 68px
- Logo maxHeight 32px → 44px, maxWidth 140px → 160px
- Brand title font-size 1.25rem → 1.5rem
- More padding in brand area
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add Light/Dark/System theme toggle with ThemeContext and CSS variables
- Sidebar fully collapsible (icons-only mode, persisted in localStorage)
- Anwendungen section collapsible with chevron toggle
- Admin "Anpassungen" page: logo upload, sidebar color picker with presets
- Backend branding endpoints (GET/POST /settings/branding) stored in Redis
- Optional custom icon upload for external links (click icon field)
- Backend favicon proxy with HTML parsing for reliable icon loading
- Dark mode CSS variables for all components
- Login page SSO button and error styles use CSS variables
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>