e1368c7ef7
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>
140 lines
4.2 KiB
TypeScript
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";
|