feat(planning): ship holiday-aware planning and assistant upgrades

This commit is contained in:
2026-03-28 22:49:28 +01:00
parent 2a005794e7
commit 4f48afe7b4
151 changed files with 17738 additions and 1940 deletions
@@ -10,6 +10,7 @@ vi.mock("@capakraken/application", async (importOriginal) => {
getDashboardDemand: vi.fn(),
getDashboardTopValueResources: vi.fn(),
getDashboardChargeabilityOverview: vi.fn(),
getDashboardBudgetForecast: vi.fn(),
};
});
@@ -29,6 +30,7 @@ import {
getDashboardDemand,
getDashboardTopValueResources,
getDashboardChargeabilityOverview,
getDashboardBudgetForecast,
} from "@capakraken/application";
import { dashboardRouter } from "../router/dashboard.js";
import { createCallerFactory } from "../trpc.js";
@@ -302,4 +304,52 @@ describe("dashboard router", () => {
);
});
});
describe("getBudgetForecast", () => {
it("returns budget forecast rows with calendar location context", async () => {
vi.mocked(getDashboardBudgetForecast).mockResolvedValue([
{
projectId: "project_1",
projectName: "Alpha",
shortCode: "ALPHA",
clientId: "client_1",
clientName: "Client One",
budgetCents: 100_000,
spentCents: 40_000,
remainingCents: 60_000,
burnRate: 10_000,
estimatedExhaustionDate: "2026-06-30",
pctUsed: 40,
activeAssignmentCount: 2,
calendarLocations: [
{
countryCode: "DE",
countryName: "Germany",
federalState: "BY",
metroCityName: "Munich",
activeAssignmentCount: 2,
burnRateCents: 10_000,
},
],
},
]);
const caller = createProtectedCaller({});
const result = await caller.getBudgetForecast();
expect(result).toHaveLength(1);
expect(result[0]).toMatchObject({
projectName: "Alpha",
activeAssignmentCount: 2,
calendarLocations: [
expect.objectContaining({
countryCode: "DE",
federalState: "BY",
metroCityName: "Munich",
}),
],
});
expect(getDashboardBudgetForecast).toHaveBeenCalledTimes(1);
});
});
});