Files
CapaKraken/packages/application/src/index.ts
T
Hartmut e1368c7ef7 feat: Sprint 4 — scenario planner, report builder, comments, dashboard widgets
What-If Scenario Planner (G5):
- New /projects/[id]/scenario page with side-by-side baseline vs scenario
- simulate mutation: pure cost/hours/headcount/utilization computation
- apply mutation: creates real PROPOSED assignments from scenario
- Impact cards: cost delta, hours delta, headcount, skill coverage %
- Per-resource utilization impact table with over-allocation warnings
- "What-If" button added to project detail page

Custom Report Builder (G7):
- New /reports/builder page with full config panel
- Entity selector (resource/project/assignment), column picker, filter builder
- Dynamic Prisma query with eq/neq/gt/lt/contains/in operators
- Sortable results table with pagination (50/page)
- CSV export via exportReport mutation
- Sidebar nav link under Analytics

Collaboration Layer (G8):
- Comment model in Prisma (entityType/entityId, replies, @mentions, resolved)
- comment router: list, count, create, resolve, delete
- @mention parsing with notification creation + SSE delivery
- CommentInput with @mention autocomplete (arrow nav, Enter/Tab confirm)
- CommentThread with avatar, timestamp, reply, resolve, delete
- Integrated as "Comments" tab in estimate workspace with count badge

Dashboard Widgets:
- BudgetForecastWidget: progress bars per project, burn rate, exhaustion date
- SkillGapWidget: supply vs demand per skill, shortage/surplus indicators
- ProjectHealthWidget: 3-dimension health circles + composite score
- 3 new application use-cases + dashboard router queries
- All registered in widget-registry with lazy imports

Co-Authored-By: claude-flow <ruv@ruv.net>
2026-03-19 21:47:47 +01:00

140 lines
4.2 KiB
TypeScript

export {
createDemandRequirement,
type DemandRequirementWithRelations,
} from "./use-cases/allocation/create-demand-requirement.js";
export { updateDemandRequirement } from "./use-cases/allocation/update-demand-requirement.js";
export {
createAssignment,
type AssignmentWithRelations,
} from "./use-cases/allocation/create-assignment.js";
export { updateAssignment } from "./use-cases/allocation/update-assignment.js";
export { buildAllocationReadModel } from "./use-cases/allocation/build-allocation-read-model.js";
export {
buildSplitAllocationReadModel,
type BuildSplitAllocationReadModelInput,
type SplitAssignmentRecord,
type SplitDemandRequirementRecord,
} from "./use-cases/allocation/build-split-allocation-read-model.js";
export {
listAssignmentBookings,
type AssignmentBookingWithFallback,
type ListAssignmentBookingsInput,
} from "./use-cases/allocation/list-assignment-bookings.js";
export {
isChargeabilityActualBooking,
isChargeabilityRelevantProject,
isImportedTbdDraftProject,
} from "./use-cases/allocation/chargeability-bookings.js";
export {
countPlanningEntries,
type CountPlanningEntriesInput,
type CountPlanningEntriesResult,
} from "./use-cases/allocation/count-planning-entries.js";
export {
countEstimateHandoffPlanningEntries,
type CountEstimateHandoffPlanningEntriesInput,
} from "./use-cases/allocation/count-estimate-handoff-planning-entries.js";
export {
fillDemandRequirement,
type FillDemandRequirementResult,
} from "./use-cases/allocation/fill-demand-requirement.js";
export {
fillOpenDemand,
type FillOpenDemandResult,
} from "./use-cases/allocation/fill-open-demand.js";
export {
findAllocationEntry,
loadAllocationEntry,
type AllocationEntryResolution,
} from "./use-cases/allocation/load-allocation-entry.js";
export {
updateAllocationEntry,
type UpdateAllocationEntryInput,
type UpdateAllocationEntryResult,
} from "./use-cases/allocation/update-allocation-entry.js";
export {
deleteAllocationEntry,
type DeleteAllocationEntryResult,
} from "./use-cases/allocation/delete-allocation-entry.js";
export {
deleteDemandRequirement,
type DeleteDemandRequirementResult,
} from "./use-cases/allocation/delete-demand-requirement.js";
export {
deleteAssignment,
type DeleteAssignmentResult,
} from "./use-cases/allocation/delete-assignment.js";
export {
getDashboardOverview,
getDashboardPeakTimes,
getDashboardTopValueResources,
getDashboardDemand,
getDashboardChargeabilityOverview,
type GetDashboardPeakTimesInput,
type GetDashboardTopValueResourcesInput,
type GetDashboardDemandInput,
type GetDashboardChargeabilityOverviewInput,
getDashboardBudgetForecast,
type BudgetForecastRow,
getDashboardSkillGaps,
type SkillGapRow,
getDashboardProjectHealth,
type ProjectHealthRow,
} from "./use-cases/dashboard/index.js";
export {
cloneEstimate,
createEstimate,
listEstimates,
getEstimateById,
updateEstimateDraft,
submitEstimateVersion,
approveEstimateVersion,
createEstimateRevision,
createEstimateExport,
createEstimatePlanningHandoff,
type CloneEstimateInput,
type EstimateWithDetails,
type EstimateListItem,
} from "./use-cases/estimate/index.js";
export {
recomputeResourceValueScores,
type RecomputeResourceValueScoresInput,
} from "./use-cases/resource/index.js";
export {
assessDispoImportReadiness,
parseMandatoryDispoReferenceWorkbook,
parseDispoChargeabilityWorkbook,
parseDispoPlanningWorkbook,
parseResourceRosterMasterWorkbook,
parseDispoRosterWorkbook,
persistDispoImportReadiness,
stageDispoReferenceData,
stageDispoChargeabilityResources,
stageDispoRosterResources,
stageDispoPlanningData,
stageDispoProjects,
stageDispoImportBatch,
commitDispoImportBatch,
type AssessDispoImportReadinessInput,
type CommitDispoImportBatchInput,
type CommitDispoImportBatchResult,
type DispoImportReadinessIssue,
type DispoImportReadinessReport,
type StageDispoReferenceDataResult,
type StageDispoChargeabilityResourcesResult,
type StageDispoRosterResourcesResult,
type StageDispoPlanningResult,
type StageDispoProjectsResult,
type StageDispoImportBatchInput,
type StageDispoImportBatchResult,
} from "./use-cases/dispo-import/index.js";