diff --git a/src/app/(app)/planning/semaine/page.tsx b/src/app/(app)/planning/semaine/page.tsx
index f0652aa..7ff81bb 100644
--- a/src/app/(app)/planning/semaine/page.tsx
+++ b/src/app/(app)/planning/semaine/page.tsx
@@ -100,10 +100,28 @@ export default async function SemainePage({ searchParams }: PageProps) {
) : null}
+ {/* Le planning s'ordonne par équipe : sans équipe, il n'y a pas de ligne
+ où poser un créneau, même quand des salariés sont rattachés à
+ l'établissement. Dire ce qui manque ne suffit pas — l'écran dit aussi
+ où le créer, sans quoi le message se lit « il n'y a personne ». */}
{board.sections.length === 0 ? (
-
- Cet établissement n’a pas encore d’équipe.
-
+
+
+ Cet établissement n’a pas encore d’équipe.
+
+
+ Le planning se construit équipe par équipe : chacune porte son propre
+ état de publication. Créez-en une dans{' '}
+
+ Réglages · Établissements
+
+ , puis rattachez-y les salariés depuis l’onglet « Planification et
+ accès » de leur fiche.
+
+
) : null}
{board.sections.map((section) => (
diff --git a/src/server/install/install.ts b/src/server/install/install.ts
index aedf099..311a871 100644
--- a/src/server/install/install.ts
+++ b/src/server/install/install.ts
@@ -115,6 +115,13 @@ export async function installAccount(
},
});
+ // Une première équipe. Le planning s'ordonne par équipe : sans elle,
+ // l'établissement neuf n'a aucune ligne où poser un créneau, et l'écran de
+ // planning annonce « pas encore d'équipe » à qui vient de tout installer.
+ await tx.team.create({
+ data: { accountId: account.id, locationId: location.id, name: 'Équipe' },
+ });
+
// Étiquettes, types d'absence, convention d'amorce, conservation et jours
// fériés. Ce ne sont pas des exemples : sans eux, l'instance a le schéma et
// rien à quoi l'accrocher — pas de demande d'absence saisissable, pas de
diff --git a/src/server/settings/locations.ts b/src/server/settings/locations.ts
index e2c8ae8..05787e4 100644
--- a/src/server/settings/locations.ts
+++ b/src/server/settings/locations.ts
@@ -101,6 +101,15 @@ export async function createLocationAction(
} as never,
});
+ // Une première équipe, tout de suite. Le planning s'ordonne par équipe :
+ // un établissement qui n'en a aucune ne se planifie pas, et rien ne le
+ // dit avant la première semaine à couvrir — où le message « pas encore
+ // d'équipe » se lit « il n'y a personne ». Elle se renomme, et rien
+ // n'empêche d'en ajouter d'autres.
+ await db.team.create({
+ data: { locationId: created.id, name: 'Équipe', position: 0 } as never,
+ });
+
await recordAudit(db, {
actorMembershipId: actor.membershipId,
action: 'location.create',
diff --git a/tests/integration/installation.test.ts b/tests/integration/installation.test.ts
index 95ac314..818cb52 100644
--- a/tests/integration/installation.test.ts
+++ b/tests/integration/installation.test.ts
@@ -118,6 +118,14 @@ describeIfDb('première installation', () => {
});
expect(location.timezone).toBe('America/Martinique');
expect(location.name).toBe('Siège');
+
+ // Et une première équipe : sans elle, le planning n'a aucune ligne où
+ // poser un créneau, et l'écran annonce « pas encore d'équipe » à qui
+ // vient d'installer l'instance.
+ const teams = await tx.team.findMany({
+ where: { locationId: location.id },
+ });
+ expect(teams).toHaveLength(1);
},
);
});