尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證création de logiciel de forma
翻譯準備中
取自儲存庫 README
正在載入完整 README。
檢視完整 README ↗Logiciel SaaS pour les organismes testeurs certifiés (OTC) CACES® : préparation des sessions de test, passage des tests sur tablette (y compris hors connexion), puis délivrance et vérification des certificats.
« Certipilot » est un nom de code provisoire, centralisé dans
lib/constants.ts. CACES® est une marque déposée de la Cnam : le nom de l'application ne doit pas la contenir.
Structure : app/ (pages et actions), components/, lib/rules/ (règles métier pures,
testées à 100 %), lib/offline/ (base locale et synchronisation de l'application testeur),
lib/certificates/ et lib/export/ (PDF et ZIP), supabase/migrations/ (schéma, RLS,
triggers de conformité).
corepack enable)pnpm install
cp .env.example .env.local
pnpm db:start # démarre Supabase en local (Postgres, Auth, Storage)
pnpm supabase status # affiche l'URL et les clés à copier dans .env.local
Renseignez dans .env.local les valeurs API URL, anon key et service_role key
affichées par pnpm supabase status.
pnpm dev
L'application est disponible sur http://localhost:3000. Le Studio Supabase local est sur http://127.0.0.1:54323 et les e-mails envoyés (invitations) sont visibles dans Mailpit sur http://127.0.0.1:54324.
pnpm db:reset recrée la base à partir des migrations de supabase/migrations et du
jeu de données supabase/seed.sql.
| Commande | Contenu |
|---|---|
pnpm test | Tests unitaires (Vitest) |
pnpm test:coverage | Tests unitaires avec couverture ; les règles métier de lib/rules/ doivent être couvertes à 100 % |
pnpm test:db | Tests de la base (isolation entre organisations par la RLS, triggers) ; nécessite pnpm db:start |
pnpm test:e2e | Parcours principaux dans un navigateur, sur ordinateur et sur tablette (Playwright) ; la première fois : pnpm exec playwright install chromium. Le rechargement de l'application testeur sans réseau n'est vérifié qu'avec une version de production (pnpm build && pnpm start, ce que fait l'intégration continue) |
pnpm lint et pnpm typecheck | Qualité du code |
Si Supabase ne peut pas tourner en local, les tests de la base fonctionnent aussi sur un
PostgreSQL 16 classique. Le script crée une base jetable avec une imitation minimale des
schémas auth et storage de Supabase, puis applique les migrations et le seed :
ADMIN_DATABASE_URL=postgresql://postgres:[email protected]:5432/postgres pnpm db:test-bootstrap
DATABASE_URL=postgresql://postgres:[email protected]:5432/certipilot_test pnpm test:db
C'est ce que fait l'intégration continue.
supabase/migrations/ : le schéma, la RLS, les triggers de conformité et d'audit, le
stockage et le référentiel par défaut (les 8 recommandations, leurs catégories et deux
grilles d'exemple). Ce référentiel est copié dans chaque organisme à son inscription,
qui peut ensuite l'adapter. Les grilles d'exemple ne sont pas officielles et sont
marquées « À VALIDER avec un testeur ».supabase/seed.sql : un organisme de démonstration, pour le développement local
uniquement. Comptes (mot de passe certipilot-demo) :
[email protected], [email protected],
[email protected], [email protected]. La « Session du jour
(démo) » attribue deux épreuves pratiques du jour à testeur1 (Marc Testeur), et un
historique de trois certificats délivrés il y a environ cinq ans alimente les
renouvellements du tableau de bord.Le testeur se connecte sur la tablette et arrive sur /testeur : la liste de ses
candidats du jour. Tant que la tablette a du réseau, les épreuves du jour (grilles,
photos des candidats) sont téléchargées dans la tablette (IndexedDB, via Dexie).
Ensuite tout se fait sans réseau : contrôle d'identité (type et numéro de pièce, case « vérifié » horodatée), démarrage de l'épreuve, notation critère par critère avec le score en direct et le chronomètre, résultat, puis signature au doigt. Chaque action est mise dans une file d'attente et envoyée dans l'ordre dès le retour du réseau. Le serveur refait tous les contrôles (identité, testeur, engin, calcul du résultat) : si une modification est refusée, elle reste sur la tablette avec le message d'erreur et peut être renvoyée une fois le problème corrigé.
L'indicateur en haut de l'écran affiche « Hors ligne », « Synchronisation en cours »,
« Synchronisé » ou « Erreur de synchronisation ». Avec une version de production
(pnpm build && pnpm start), un service worker (public/sw.js) garde aussi la page
disponible hors connexion : elle se recharge même sans réseau, et peut être installée
sur l'écran d'accueil de la tablette.
Sur la page d'une session, le bouton « Délivrer le certificat » apparaît pour un candidat
dès que la théorie (QCM, et QCM-IPR pour la R.482) et au moins une catégorie pratique sont
réussies. La base refait ces contrôles, numérote le certificat (PRÉFIXE-ANNÉE-000001) et
calcule la fin de validité depuis le référentiel (5 ans par défaut, 10 ans pour la R.482,
modifiable par recommandation ou par catégorie). Seuls le responsable et le secrétariat
délivrent.
Le PDF (lib/certificates/) est généré côté serveur avec @react-pdf/renderer : photo du
candidat, catégories obtenues uniquement, dates, et un QR code vers la page publique
/verifier/[jeton]. Il est rangé dans le bucket privé certificates et téléchargé par une
URL signée d'une minute. Un certificat ne se modifie jamais : il peut seulement être
révoqué par le responsable, avec un motif, et la page de vérification affiche alors
« Révoqué ».
Les photos des candidats sont réenregistrées en JPEG (800 px maximum, sans métadonnées EXIF ni GPS) au moment de l'envoi.
Sur la page d'une session, le responsable du centre peut « Exporter le dossier d'audit (ZIP) ». L'archive contient, en CSV lisibles dans Excel : la session, les testeurs et leurs CACES® personnels, les engins et leur dernière vérification périodique, les candidats et leur contrôle d'identité, les résultats de théorie, les épreuves pratiques (testeur, engin, horaires, score), la grille de chaque épreuve critère par critère, les signatures, les certificats PDF et le journal des modifications (qui a fait quoi, quand). Chaque export est lui-même tracé dans le journal.
anon et la clé
service_role (Project Settings › API).pnpm supabase login
pnpm supabase link --project-ref <référence-du-projet>
pnpm supabase db push # applique supabase/migrations, sans les données de démo
Ne lancez jamais supabase/seed.sql en production.vercel.json place les fonctions à Paris (cdg1).
Ajoutez les variables d'environnement :
NEXT_PUBLIC_APP_URL : l'adresse publique (utilisée dans les QR codes et les
invitations) ;NEXT_PUBLIC_SUPABASE_URL et NEXT_PUBLIC_SUPABASE_ANON_KEY ;SUPABASE_SERVICE_ROLE_KEY (secrète, jamais exposée au navigateur)./inscription pour créer le premier organisme et son compte responsable, puis
invitez le secrétariat et les testeurs depuis « Utilisateurs ».Les photos, pièces d'identité, signatures et certificats sont dans des buckets privés, servis uniquement par des URL signées de courte durée. La durée de conservation des données des candidats se règle dans « Organisme » (10 ans par défaut) ; la purge RGPD anonymise les candidats hors délai et efface leurs photos.