diff --git a/packages/api/src/__tests__/assistant-tools-dashboard-detail.test.ts b/packages/api/src/__tests__/assistant-tools-dashboard-detail.test.ts index db0a789..ef87d21 100644 --- a/packages/api/src/__tests__/assistant-tools-dashboard-detail.test.ts +++ b/packages/api/src/__tests__/assistant-tools-dashboard-detail.test.ts @@ -64,6 +64,7 @@ describe("assistant dashboard tools detail aggregation", () => { calendarContextCount: 1, resourceCount: 4, groupCount: 1, + baseAvailableHours: 416.2, calendarLocations: [ { countryCode: "DE", @@ -79,6 +80,10 @@ describe("assistant dashboard tools detail aggregation", () => { remainingCapacityHours: 79.8, overbookedHours: 0, utilizationPct: 80, + effectiveAvailableHours: 400.2, + publicHolidayHoursDeduction: 16, + absenceDayEquivalent: 1.5, + absenceHoursDeduction: 12.5, }, }, ]); @@ -190,6 +195,19 @@ describe("assistant dashboard tools detail aggregation", () => { effectiveAvailableHours: 400.2, }, ], + explainability: { + periodStart: "2026-03-01", + periodEnd: "2026-03-31", + resourceCount: 4, + groupCount: 1, + baseAvailableHours: 416.2, + effectiveAvailableHours: 400.2, + publicHolidayHoursDeduction: 16, + absenceDayEquivalent: 1.5, + absenceHoursDeduction: 12.5, + remainingCapacityHours: 79.8, + overbookedHours: 0, + }, }, ], topResources: [ diff --git a/packages/api/src/__tests__/dashboard-procedure-support.test.ts b/packages/api/src/__tests__/dashboard-procedure-support.test.ts index 985d567..10695dc 100644 --- a/packages/api/src/__tests__/dashboard-procedure-support.test.ts +++ b/packages/api/src/__tests__/dashboard-procedure-support.test.ts @@ -167,8 +167,19 @@ describe("dashboard procedure support", () => { capacityHours: 200.12, utilizationPct: 80, derivation: { + periodStart: "2026-03-01", + periodEnd: "2026-03-31", calendarContextCount: 1, + resourceCount: 5, + groupCount: 2, + baseAvailableHours: 216, + effectiveAvailableHours: 200.12, + publicHolidayHoursDeduction: 8, + absenceDayEquivalent: 1, + absenceHoursDeduction: 7.88, calendarLocations: [{ countryCode: "DE", federalState: "BY", metroCityName: "Munich" }], + remainingCapacityHours: 39.78, + overbookedHours: 0, }, }, ]); @@ -228,6 +239,19 @@ describe("dashboard procedure support", () => { utilizationPct: 80, calendarContextCount: 1, calendarLocations: [{ countryCode: "DE", federalState: "BY", metroCityName: "Munich" }], + explainability: { + periodStart: "2026-03-01", + periodEnd: "2026-03-31", + resourceCount: 5, + groupCount: 2, + baseAvailableHours: 216, + effectiveAvailableHours: 200.12, + publicHolidayHoursDeduction: 8, + absenceDayEquivalent: 1, + absenceHoursDeduction: 7.88, + remainingCapacityHours: 39.78, + overbookedHours: 0, + }, }, ], topResources: [ diff --git a/packages/api/src/__tests__/dashboard-router.test.ts b/packages/api/src/__tests__/dashboard-router.test.ts index 9c96a05..5aeb215 100644 --- a/packages/api/src/__tests__/dashboard-router.test.ts +++ b/packages/api/src/__tests__/dashboard-router.test.ts @@ -757,6 +757,33 @@ describe("dashboard router", () => { totalHours: 320.4, capacityHours: 400.2, utilizationPct: 80, + derivation: { + periodStart: "2026-03-01", + periodEnd: "2026-03-31", + calendarContextCount: 1, + resourceCount: 4, + groupCount: 1, + baseAvailableHours: 416.2, + effectiveAvailableHours: 400.2, + publicHolidayHoursDeduction: 16, + absenceDayEquivalent: 1.5, + absenceHoursDeduction: 12.5, + calendarLocations: [ + { + countryCode: "DE", + countryName: "Germany", + federalState: "BY", + metroCityName: "Augsburg", + resourceCount: 4, + effectiveAvailableHours: 400.2, + }, + ], + bookedHours: 320.4, + capacityHours: 400.2, + remainingCapacityHours: 79.8, + overbookedHours: 0, + utilizationPct: 80, + }, }, ]); vi.mocked(getDashboardTopValueResources).mockResolvedValue([ @@ -823,8 +850,30 @@ describe("dashboard router", () => { totalHoursPerDay: 320.4, capacityHours: 400.2, utilizationPct: 80, - calendarContextCount: 0, - calendarLocations: [], + calendarContextCount: 1, + calendarLocations: [ + { + countryCode: "DE", + countryName: "Germany", + federalState: "BY", + metroCityName: "Augsburg", + resourceCount: 4, + effectiveAvailableHours: 400.2, + }, + ], + explainability: { + periodStart: "2026-03-01", + periodEnd: "2026-03-31", + resourceCount: 4, + groupCount: 1, + baseAvailableHours: 416.2, + effectiveAvailableHours: 400.2, + publicHolidayHoursDeduction: 16, + absenceDayEquivalent: 1.5, + absenceHoursDeduction: 12.5, + remainingCapacityHours: 79.8, + overbookedHours: 0, + }, }, ], topResources: [ diff --git a/packages/api/src/router/dashboard-procedure-support.ts b/packages/api/src/router/dashboard-procedure-support.ts index e5576c8..858ae50 100644 --- a/packages/api/src/router/dashboard-procedure-support.ts +++ b/packages/api/src/router/dashboard-procedure-support.ts @@ -242,6 +242,21 @@ export async function getDashboardDetail(ctx: DashboardProcedureContext, input: utilizationPct: entry.utilizationPct ?? null, calendarContextCount: entry.derivation?.calendarContextCount ?? 0, calendarLocations: entry.derivation?.calendarLocations ?? [], + explainability: entry.derivation + ? { + periodStart: entry.derivation.periodStart, + periodEnd: entry.derivation.periodEnd, + resourceCount: entry.derivation.resourceCount, + groupCount: entry.derivation.groupCount, + baseAvailableHours: entry.derivation.baseAvailableHours, + effectiveAvailableHours: entry.derivation.effectiveAvailableHours, + publicHolidayHoursDeduction: entry.derivation.publicHolidayHoursDeduction, + absenceDayEquivalent: entry.derivation.absenceDayEquivalent, + absenceHoursDeduction: entry.derivation.absenceHoursDeduction, + remainingCapacityHours: entry.derivation.remainingCapacityHours, + overbookedHours: entry.derivation.overbookedHours, + } + : null, })); }