Skip to content

Commit fbc14ed

Browse files
committed
refactor(admin): deduce active campaign year from campaignStartDate (#3263, #3241)
1 parent 97d644f commit fbc14ed

14 files changed

Lines changed: 54 additions & 419 deletions

File tree

packages/app/src/e2e/admin.e2e.ts

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,13 +29,10 @@ test("admin user can access /admin/parametres and sees settings page", async ({
2929
level: 1,
3030
}),
3131
).toBeVisible();
32-
await expect(
33-
page.getByRole("heading", { name: "Année de campagne active", level: 2 }),
34-
).toBeVisible();
3532
await expect(
3633
page.getByRole("heading", { name: "Échéances de campagne", level: 2 }),
3734
).toBeVisible();
3835
await expect(
39-
page.getByRole("spinbutton", { name: /année de campagne active/i }),
40-
).toBeVisible();
36+
page.getByRole("heading", { name: "Année de campagne active", level: 2 }),
37+
).not.toBeVisible();
4138
});

packages/app/src/modules/admin/settings/ActiveYearForm.tsx

Lines changed: 0 additions & 107 deletions
This file was deleted.

packages/app/src/modules/admin/settings/AdminSettingsPage.tsx

Lines changed: 5 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,16 @@
11
import { getCurrentYear } from "~/modules/domain";
22
import { api, HydrateClient } from "~/trpc/server";
33

4-
import { ActiveYearForm } from "./ActiveYearForm";
54
import { CampaignDeadlinesForm } from "./CampaignDeadlinesForm";
65

76
/**
8-
* Backoffice page to edit global platform variables: active campaign year
9-
* and per-year campaign deadlines (GIP publication, campaign start, CSE and
10-
* declaration deadlines).
7+
* Backoffice page to edit per-year campaign deadlines (GIP publication,
8+
* campaign start, CSE and declaration deadlines). The active campaign year is
9+
* now deduced from the `campaignStartDate` field and no longer edited here.
1110
*/
1211
export async function AdminSettingsPage() {
1312
const overview = await api.adminSettings.getOverview();
14-
const fallbackYear = getCurrentYear();
15-
const initialYear = overview.activeCampaignYear ?? fallbackYear;
13+
const initialYear = overview.configuredYears.at(-1) ?? getCurrentYear();
1614

1715
return (
1816
<HydrateClient>
@@ -22,17 +20,7 @@ export async function AdminSettingsPage() {
2220
les campagnes de déclaration.
2321
</p>
2422

25-
<section aria-labelledby="active-year-heading" className="fr-mt-4w">
26-
<h2 className="fr-h3" id="active-year-heading">
27-
Année de campagne active
28-
</h2>
29-
<ActiveYearForm
30-
fallbackYear={fallbackYear}
31-
initialActiveYear={overview.activeCampaignYear}
32-
/>
33-
</section>
34-
35-
<section aria-labelledby="deadlines-heading" className="fr-mt-6w">
23+
<section aria-labelledby="deadlines-heading" className="fr-mt-4w">
3624
<h2 className="fr-h3" id="deadlines-heading">
3725
Échéances de campagne
3826
</h2>

packages/app/src/modules/admin/settings/__tests__/ActiveYearForm.test.tsx

Lines changed: 0 additions & 106 deletions
This file was deleted.

packages/app/src/modules/admin/settings/__tests__/AdminSettingsPage.test.tsx

Lines changed: 9 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -13,18 +13,6 @@ vi.mock("~/trpc/server", () => ({
1313
HydrateClient: ({ children }: { children: React.ReactNode }) => children,
1414
}));
1515

16-
vi.mock("../ActiveYearForm", () => ({
17-
ActiveYearForm: (props: {
18-
initialActiveYear: number | null;
19-
fallbackYear: number;
20-
}) =>
21-
React.createElement("div", {
22-
"data-testid": "active-year-form",
23-
"data-initial": props.initialActiveYear ?? "",
24-
"data-fallback": props.fallbackYear,
25-
}),
26-
}));
27-
2816
vi.mock("../CampaignDeadlinesForm", () => ({
2917
CampaignDeadlinesForm: (props: {
3018
initialYear: number;
@@ -40,9 +28,8 @@ vi.mock("../CampaignDeadlinesForm", () => ({
4028
import { AdminSettingsPage } from "../AdminSettingsPage";
4129

4230
describe("AdminSettingsPage", () => {
43-
it("renders both sections and passes overview data to the forms", async () => {
31+
it("renders the deadlines section and passes configured years to the form", async () => {
4432
getOverviewMock.mockResolvedValue({
45-
activeCampaignYear: 2027,
4633
configuredYears: [2025, 2026, 2027],
4734
});
4835
render(await AdminSettingsPage());
@@ -52,31 +39,25 @@ describe("AdminSettingsPage", () => {
5239
name: /paramètres de la plateforme/i,
5340
}),
5441
).toBeInTheDocument();
55-
expect(
56-
screen.getByRole("heading", {
57-
level: 2,
58-
name: /année de campagne active/i,
59-
}),
60-
).toBeInTheDocument();
6142
expect(
6243
screen.getByRole("heading", { level: 2, name: /échéances de campagne/i }),
6344
).toBeInTheDocument();
64-
const active = screen.getByTestId("active-year-form");
65-
expect(active.getAttribute("data-initial")).toBe("2027");
45+
expect(
46+
screen.queryByRole("heading", { name: /année de campagne active/i }),
47+
).not.toBeInTheDocument();
6648
const deadlines = screen.getByTestId("campaign-deadlines-form");
6749
expect(deadlines.getAttribute("data-initial-year")).toBe("2027");
6850
expect(deadlines.getAttribute("data-years")).toBe("2025,2026,2027");
6951
});
7052

71-
it("falls back to the current calendar year when none is configured", async () => {
53+
it("falls back to the current calendar year when no year is configured", async () => {
7254
getOverviewMock.mockResolvedValue({
73-
activeCampaignYear: null,
7455
configuredYears: [],
7556
});
7657
render(await AdminSettingsPage());
77-
const active = screen.getByTestId("active-year-form");
78-
expect(active.getAttribute("data-initial")).toBe("");
79-
const fallback = Number(active.getAttribute("data-fallback"));
80-
expect(fallback).toBe(new Date().getFullYear());
58+
const deadlines = screen.getByTestId("campaign-deadlines-form");
59+
expect(deadlines.getAttribute("data-initial-year")).toBe(
60+
String(new Date().getFullYear()),
61+
);
8162
});
8263
});

packages/app/src/modules/admin/settings/__tests__/schemas.test.ts

Lines changed: 1 addition & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { describe, expect, it } from "vitest";
22

3-
import { campaignDeadlinesFormSchema, setActiveYearSchema } from "../schemas";
3+
import { campaignDeadlinesFormSchema } from "../schemas";
44

55
const validDates = {
66
decl1ModificationDeadline: "2026-06-01",
@@ -68,27 +68,3 @@ describe("campaignDeadlinesFormSchema", () => {
6868
expect(result.success).toBe(false);
6969
});
7070
});
71-
72-
describe("setActiveYearSchema", () => {
73-
it("accepts a valid year", () => {
74-
const result = setActiveYearSchema.safeParse({ activeCampaignYear: 2026 });
75-
expect(result.success).toBe(true);
76-
});
77-
78-
it("rejects years below FIRST_DECLARATION_YEAR", () => {
79-
const result = setActiveYearSchema.safeParse({ activeCampaignYear: 1999 });
80-
expect(result.success).toBe(false);
81-
});
82-
83-
it("rejects years above 2100", () => {
84-
const result = setActiveYearSchema.safeParse({ activeCampaignYear: 2200 });
85-
expect(result.success).toBe(false);
86-
});
87-
88-
it("rejects non-integer years", () => {
89-
const result = setActiveYearSchema.safeParse({
90-
activeCampaignYear: 2026.5,
91-
});
92-
expect(result.success).toBe(false);
93-
});
94-
});

packages/app/src/modules/admin/settings/index.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,4 @@ export {
55
campaignDeadlinesFormSchema,
66
campaignYearSchema,
77
getCampaignDeadlinesByYearSchema,
8-
type SetActiveYearInput,
9-
setActiveYearSchema,
108
} from "./schemas";

packages/app/src/modules/admin/settings/schemas.ts

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -53,12 +53,6 @@ export type CampaignDeadlinesFormValues = z.output<
5353
typeof campaignDeadlinesFormSchema
5454
>;
5555

56-
export const setActiveYearSchema = z.object({
57-
activeCampaignYear: campaignYearSchema,
58-
});
59-
60-
export type SetActiveYearInput = z.infer<typeof setActiveYearSchema>;
61-
6256
export const getCampaignDeadlinesByYearSchema = z.object({
6357
year: campaignYearSchema,
6458
});

0 commit comments

Comments
 (0)