From db433569199cc9fc52327399739486ed241c76c8 Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 9 Aug 2026 10:55:36 +0000 Subject: [PATCH] Corriger la construction de l'image, pour de bon MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `pnpm db:generate` échouait avant même le build : `prisma.config.ts` résolvait DATABASE_URL par `env()`, qui lève dès le **chargement** du fichier de configuration quand la variable manque. Or ce fichier est lu par toutes les commandes du CLI, y compris `generate`, qui ne se connecte à rien — la construction de l'image exigeait donc une base. Ma vérification précédente ne valait rien : j'avais éprouvé `pnpm build` seul, pas `pnpm db:generate && pnpm build`, la ligne qui échoue. Cette fois c'est la commande exacte du Dockerfile qui a été jouée, sans .env, et elle sort en 0. Corrigé au passage, du même genre que la troncature de l'écran de conservation : la liste des périodes de paie s'arrête aux 24 plus récentes sans le dire. Une période créée hors de cette fenêtre semblait ne pas s'être enregistrée. Le total est désormais rapporté. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01Cr9dkEHwbDgkWPnyGj1Rjv --- prisma.config.ts | 14 ++++++++++++-- src/app/(app)/paie/periodes/page.tsx | 8 ++++++++ src/server/payroll/period-queries.ts | 12 +++++++++++- tests/e2e/heures.spec.ts | 4 ++++ 4 files changed, 35 insertions(+), 3 deletions(-) diff --git a/prisma.config.ts b/prisma.config.ts index 1be248d..b59a8e4 100644 --- a/prisma.config.ts +++ b/prisma.config.ts @@ -1,5 +1,5 @@ import 'dotenv/config'; -import { defineConfig, env } from 'prisma/config'; +import { defineConfig } from 'prisma/config'; /** * Prisma 7 moved the migration connection URL out of schema.prisma. @@ -15,6 +15,16 @@ export default defineConfig({ seed: 'tsx prisma/seed.ts', }, datasource: { - url: env('DATABASE_URL'), + /* + * Lu directement plutôt que par `env()`, qui échoue dès le **chargement** + * du fichier de configuration quand la variable manque. + * + * Or ce fichier est chargé par toutes les commandes du CLI, y compris + * `prisma generate`, qui ne se connecte à rien : la construction de l'image + * devenait impossible sans fournir une base au constructeur. Les commandes + * qui ont réellement besoin de l'URL — `migrate` — échouent d'elles-mêmes, + * au moment où elle leur manque. + */ + url: process.env.DATABASE_URL ?? '', }, }); diff --git a/src/app/(app)/paie/periodes/page.tsx b/src/app/(app)/paie/periodes/page.tsx index f758eef..beeca6c 100644 --- a/src/app/(app)/paie/periodes/page.tsx +++ b/src/app/(app)/paie/periodes/page.tsx @@ -68,6 +68,14 @@ export default async function PeriodesPage({ searchParams }: PageProps) { suggestedMonth={view.suggestedMonth} /> + {view.totalPeriods > view.periods.length ? ( +

+ {view.totalPeriods} périodes en tout ; les {view.periods.length} plus + récentes sont affichées. Une période plus ancienne reste consultable + par son mois. +

+ ) : null} + {view.periods.length === 0 ? (

Aucune période. Verrouiller une période fige les heures transmises au diff --git a/src/server/payroll/period-queries.ts b/src/server/payroll/period-queries.ts index c6188f0..d7a1c3e 100644 --- a/src/server/payroll/period-queries.ts +++ b/src/server/payroll/period-queries.ts @@ -39,6 +39,8 @@ export interface PeriodsView { location: { id: string; name: string }; locations: Array<{ id: string; name: string }>; periods: PeriodCard[]; + /** Total en base : la liste est bornée, et le taire induirait en erreur. */ + totalPeriods: number; /** Mois proposé par défaut à la création. */ suggestedMonth: string; canLock: boolean; @@ -62,10 +64,17 @@ export async function getPeriods(locationId?: string): Promise await create.getByLabel('Libellé').fill(label); await create.getByRole('button', { name: 'Créer la période' }).click(); + // La liste est bornée aux 24 périodes les plus récentes : sans nettoyage, les + // restes d'exécutions interrompues finissent par repousser la nouvelle hors + // de l'écran, et le test échoue pour une raison sans rapport avec ce qu'il + // vérifie. const card = page.locator('section').filter({ hasText: label }).first(); await expect(card).toBeVisible();