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:
1 parent
f0ef6f12a1
commit
d8060eb4a9
11 files changed
+945
No files matched your search
@@ -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>
|
||||
);
|
||||
}
|
||||
@@ -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>
|
||||
);
|
||||
}
|
||||
Reference in new issue
Block a user