b0e55786c3
AI Assistant (HartBOT): - Chat panel with inline layout, session persistence, message history (up-arrow recall) - OpenAI function calling with 20+ tools (search, navigate, create/cancel allocations, update status) - RBAC-aware tool filtering, fuzzy search with word-level matching - Navigation actions (router.push) and data invalidation after mutations - Country/metro city/org unit/role filtering on resource search Demand Filling Enhancements: - Two-phase fill modal: plan multiple resources, then confirm & assign all at once - Availability preview per resource (available/partial/conflict days, existing bookings) - Coverage bar showing demand hours distribution across assigned resources - Fill demand from project detail page (new Assign button per demand) - Fixed: filled demands no longer shown on timeline, demand bars no longer overlap Budget per Role: - DemandRequirement.budgetCents field (schema + API + UI) - Project wizard step 3: budget input per role with allocation summary bar - Project detail: allocated vs booked budget per demand - Fill demand modal: role budget display with cost estimates - AllocationModal: budget field for demand editing Project Favorites: - User.favoriteProjectIds (JSONB) with toggle API - Star button on projects list and detail page (optimistic updates) - "My Projects" dashboard widget (favorites + responsible person projects) Project Management: - Edit project from detail page (ProjectModal integration) - Edit demands from detail page (AllocationModal integration) - Admin-only project deletion (cascades assignments + demands) - Create user accounts from admin panel Timeline Fixes: - Country multi-select filter with backend support - URL param sync for same-page navigation (AI assistant integration) - Demand lane stacking (no more overlapping bars) - Single-day booking resize handles (always visible, min 6px) - Single-day resize allowed (start === end) - "All Clients" toggle (select all / deselect all) Other Fixes: - crypto.randomUUID fallback for non-secure contexts - Chat message limit raised (200 max, client sends last 40) - Status dropdown portal (no longer clipped by table overflow) - Cents display restored in budget views (2 decimal places) - Allocations grouped view with project sub-groups (collapsed by default) - Server-side resource search for project wizard (no 500 limit) Co-Authored-By: claude-flow <ruv@ruv.net>
6.2 KiB
6.2 KiB
Plan: Budget per Role / Demand
Anforderungsanalyse
Jede Staffing-Demand (Rolle) in einem Projekt soll ein eigenes Budget bekommen. Aktuell gibt es nur ein einziges budgetCents auf Projektebene. Ziel:
- DemandRequirement bekommt ein
budgetCentsFeld (wie viel Budget ist dieser Rolle zugewiesen) - StaffingRequirement (JSONB auf Project) bekommt ein optionales
budgetCentsFeld fuer den Wizard - Project Wizard Step 3 zeigt Budget-Input pro Rolle + verbleibendes unverteiltes Projekt-Budget
- Project Detail Page zeigt pro Demand: zugewiesenes Budget vs. gebuchtes Budget (aus Assignments berechnet)
- Fill Demand Modal zeigt verbleibendes Rollen-Budget beim Zuweisen von Ressourcen
Architektur-Entscheidung
budgetCents als explizite Spalte auf DemandRequirement (nicht in metadata JSONB), weil:
- Typsicher, indizierbar, aggregierbar via SQL
- Konsistent mit dem Muster auf
Project.budgetCents - Default
0= kein Budget zugewiesen (abwaertskompatibel)
Betroffene Pakete & Dateien
| Paket | Dateien | Art der Aenderung |
|---|---|---|
packages/db |
prisma/schema.prisma |
edit — budgetCents auf DemandRequirement |
packages/shared |
src/types/project.ts |
edit — budgetCents? auf StaffingRequirement |
packages/shared |
src/types/allocation.ts |
edit — budgetCents auf DemandRequirementRecord |
packages/shared |
src/schemas/allocation.schema.ts |
edit — budgetCents in CreateDemandRequirementSchema |
packages/api |
src/router/allocation.ts |
edit — budgetCents durchreichen in create/update |
packages/api |
src/router/project.ts |
edit — bei Demand-Erstellung aus Wizard budgetCents uebernehmen |
apps/web |
src/components/projects/ProjectWizard.tsx |
edit — Step 3: Budget-Input pro Rolle + Restbudget-Anzeige |
apps/web |
src/components/projects/ProjectDemandsTable.tsx |
edit — Spalten: Allocated Budget, Booked Budget |
apps/web |
src/components/allocations/FillOpenDemandModal.tsx |
edit — Rollen-Budget-Anzeige |
Task-Liste
Task 1: Prisma Schema — budgetCents auf DemandRequirement
Datei: packages/db/prisma/schema.prisma
budgetCents Int @default(0)auf DemandRequirement hinzufuegenpnpm db:pushausfuehren (generiert Prisma Client)- Dev-Server neustarten (
.next/Cache loeschen)
Task 2: Shared Types aktualisieren
Dateien:
packages/shared/src/types/project.ts—budgetCents?: numberaufStaffingRequirementpackages/shared/src/types/allocation.ts—budgetCents: numberaufDemandRequirementRecordpackages/shared/src/schemas/allocation.schema.ts—budgetCents: z.number().int().min(0).default(0)inCreateDemandRequirementBaseSchema
Task 3: API — budgetCents durchreichen
Datei: packages/api/src/router/allocation.ts
createDemandRequirement—budgetCentsaus Input an Prisma create weitergebenupdateDemandRequirement—budgetCentsupdatebar machencheckResourceAvailability— optional: gebuchte Kosten vs. Rollen-Budget zurueckgeben
Datei: packages/api/src/router/project.ts
- Bei Projekt-Erstellung mit StaffingReqs: wenn
staffingReq.budgetCentsvorhanden, an DemandRequirement weitergeben
Task 4: Project Wizard Step 3 — Budget-Input pro Rolle
Datei: apps/web/src/components/projects/ProjectWizard.tsx
- Pro StaffingRequirement-Karte: neues Feld "Role Budget (EUR)" (Input, konvertiert zu Cents)
- Oben im Step: Anzeige "Project Budget: X EUR | Allocated: Y EUR | Remaining: Z EUR"
- Farbkodierung: gruen wenn alles verteilt, amber wenn Rest, rot wenn ueberallokiert
- Budget-Wert wird in
state.staffingReqs[i].budgetCentsgespeichert
Task 5: Project Detail Page — Budget-Spalten pro Demand
Datei: apps/web/src/components/projects/ProjectDemandsTable.tsx
- Neue Spalte "Allocated Budget" — zeigt
demand.budgetCentsformatiert als EUR - Neue Spalte "Booked Budget" — berechnet: Summe der
dailyCostCents * Arbeitstagealler Assignments dieses Demands- Hinweis: Die Demand-Daten vom Server enthalten
assignments[]— daraus berechnen
- Hinweis: Die Demand-Daten vom Server enthalten
- Neue Spalte "Remaining" — Allocated minus Booked
- Farbkodierung: gruen wenn unter Budget, rot wenn ueber Budget
Task 6: Fill Demand Modal — Rollen-Budget anzeigen
Datei: apps/web/src/components/allocations/FillOpenDemandModal.tsx
- Im Demand-Summary oben: "Role Budget: X EUR | Booked: Y EUR | Remaining: Z EUR"
- Beim Hinzufuegen einer Ressource zum Plan: geschaetzte Kosten anzeigen (LCR * verfuegbare Stunden)
- Warnung wenn geplante Kosten das Rollen-Budget ueberschreiten
Abhaengigkeiten
- Task 1 → Task 2 → Task 3 (sequentiell: Schema → Types → API)
- Task 4 benoetigt Task 2 (StaffingRequirement-Typ mit budgetCents)
- Task 5 benoetigt Task 1+3 (budgetCents auf DemandRequirement + API liefert es)
- Task 6 benoetigt Task 5 (gleiche Berechnung)
- Task 4 und Task 5 koennen parallel nach Task 3
Akzeptanzkriterien
pnpm db:pushlaeuft ohne Fehlerpnpm test:unit— alle Tests gruenpnpm --filter @planarchy/web exec tsc --noEmit— keine neuen Errors- Project Wizard Step 3: Budget-Input pro Rolle sichtbar, Restbudget wird live berechnet
- Project Detail
/projects/[id]: Demands-Tabelle zeigt Allocated / Booked / Remaining Budget - Fill Demand Modal: Rollen-Budget und geschaetzte Kosten sichtbar
- Bestehende Projekte/Demands funktionieren weiterhin (budgetCents default 0)
Risiken & offene Fragen
- Abwaertskompatibilitaet:
@default(0)stellt sicher, dass bestehende Demands kein Budget haben (0 = nicht gesetzt). UI sollte "Not set" anzeigen wenn 0. - Budget-Berechnung Booked:
dailyCostCentsist pro Tag. Gebuchte Kosten =dailyCostCents * Anzahl Arbeitstage im Zeitraum. Diese Berechnung existiert bereits im Engine-Paket (computeBudgetStatus). - StaffingReqs JSONB: Die
staffingReqsauf Project sind JSONB. Aeltere Projekte haben keinbudgetCentsdarin — der Wizard mussbudgetCents ?? 0defaulten. - Budget-Ueberschreitung: Soll weiterhin erlaubt sein (Warnung, kein Block) — konsistent mit dem bestehenden Ansatz bei Projekt-Budget.