Ouvrir le compte et les préférences au paramétrage

Quatre écrans manquaient faute de spécification. Les captures du produit audité
les fournissent : identité de l'entreprise, comportement des plannings, droits
ouverts aux salariés, décompte de paie.

Les préférences sont trois blocs typés, pas un sac de clés-valeurs. Ce n'est pas
de la rigueur gratuite : `smoothOvertimeMonthly` change le calcul des heures
supplémentaires, et un JSON libre rendrait indétectable une clé mal
orthographiée — le réglage paraîtrait actif sans l'être.

Chaque formulaire déclare les clés qu'il gouverne. Une case décochée n'arrive
pas dans le FormData ; sans cette déclaration, enregistrer « Plannings »
remettrait à faux tout « Droits », un formulaire partiel effaçant ce qu'il
n'affiche pas.

Trois réglages portent un avertissement en évidence parce qu'ils déplacent des
heures et non des pixels. Le lissage mensuel des heures supplémentaires suppose
un accord d'aménagement du temps de travail : le décompte hebdomadaire est le
principe, et sans accord l'aménagement est inopposable. Les pauses rémunérées et
l'inclusion des repos dans les heures normales changent la répartition entre
heures normales et majorées. Un interrupteur qui coûte de l'argent ne doit pas
se présenter comme un réglage d'affichage.

La ligne de préférences est créée à la demande : son absence vaut « tous les
défauts ». Semer une ligne à l'installation obligerait à migrer chaque compte au
premier réglage ajouté.

L'adresse va sur le compte et non sur l'établissement : le siège porte
l'identité juridique et figure au registre du personnel, là où l'établissement
porte le SIRET, le fuseau effectif et les plannings.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
MichaelandClaude Opus 5 committed 2026-08-11 12:59:53 +02:00
1 parent f0ef6f12a1
commit d8060eb4a9
11 files changed
+945

No files matched your search

+44
View File
@@ -0,0 +1,44 @@
import Link from 'next/link';
import { AccountIdentityForm } from '@/components/settings/AccountIdentityForm';
import { PageBody, PageHeader } from '@/components/shell/PageHeader';
import { Card, CardHeader, EmptyState } from '@/components/ui/Card';
import { getAccountIdentity } from '@/server/settings/account';
export const metadata = { title: 'Informations du compte · PlanFlow' };
export const dynamic = 'force-dynamic';
export default async function ComptePage() {
const account = await getAccountIdentity();
return (
<PageBody>
<PageHeader
title="Informations du compte"
subtitle="Identité de l’entreprise et siège social"
/>
{account === null ? (
<Card>
<EmptyState title="Compte introuvable" />
</Card>
) : (
<Card>
<CardHeader title={account.name} />
<AccountIdentityForm account={account} />
</Card>
)}
<p className="max-w-[70ch] text-xs leading-[var(--lh-prose)] text-ink-3">
Le siège n’est pas un établissement : il porte l’identité juridique, là
où{' '}
<Link href="/reglages/etablissements" className="underline">
les établissements
</Link>{' '}
portent le SIRET, le fuseau effectif et les plannings. Une entreprise
dont le siège n’ouvre aucun magasin garde donc une adresse ici et aucune
équipe.
</p>
</PageBody>
);
}
+38
View File
@@ -0,0 +1,38 @@
import Link from 'next/link';
import { PreferenceBlock } from '@/components/settings/PreferenceForms';
import { PageBody, PageHeader } from '@/components/shell/PageHeader';
import { Card, CardHeader } from '@/components/ui/Card';
import { getPreferences } from '@/server/settings/account';
export const metadata = { title: 'Réglages de paie · PlanFlow' };
export const dynamic = 'force-dynamic';
export default async function ReglagesPaiePage() {
const preferences = await getPreferences();
return (
<PageBody>
<PageHeader
title="Réglages de paie"
subtitle="Décompte des heures et matricules"
/>
<Card>
<CardHeader title="Décompte" />
<PreferenceBlock group="payroll" preferences={preferences} />
</Card>
<p className="max-w-[70ch] text-xs leading-[var(--lh-prose)] text-ink-3">
Ces trois réglages changent des chiffres, pas un affichage. Une période
déjà verrouillée n’est pas recalculée : le changement vaut pour les
périodes ouvertes, et les{' '}
<Link href="/paie/periodes" className="underline">
instantanés de paie
</Link>{' '}
antérieurs restent tels qu’ils ont été figés. C’est ce qui garde une paie
de mars reproductible après une modification en juin.
</p>
</PageBody>
);
}
@@ -0,0 +1,40 @@
import { PreferenceBlock } from '@/components/settings/PreferenceForms';
import { PageBody, PageHeader } from '@/components/shell/PageHeader';
import { Card, CardHeader } from '@/components/ui/Card';
import { getPreferences } from '@/server/settings/account';
export const metadata = { title: 'Préférences · PlanFlow' };
export const dynamic = 'force-dynamic';
export default async function PreferencesPage() {
const preferences = await getPreferences();
return (
<PageBody>
<PageHeader
title="Préférences"
subtitle="Comportement des plannings et droits ouverts aux salariés"
/>
<Card>
<CardHeader title="Plannings" />
<PreferenceBlock
group="planning"
preferences={preferences}
withEveningTime
/>
</Card>
<Card>
<CardHeader title="Droits" />
<PreferenceBlock group="rights" preferences={preferences} />
</Card>
<p className="max-w-[70ch] text-xs leading-[var(--lh-prose)] text-ink-3">
Ces réglages valent pour tout le compte. Ils s’ajoutent aux capacités des
rôles sans les remplacer : ouvrir un droit ici ne donne rien à qui n’a
pas la capacité correspondante, et le fermer la retire à tout le monde.
</p>
</PageBody>
);
}