mirror of
https://github.com/siop-spelev/siop2.git
synced 2026-08-08 12:41:54 +00:00
feat(r2.3): écrans web exploitation — OT, demandes, préventif, compteurs, urgence
- liste OT (filtres, strie rouge, « immédiat ») ; fiche OT : transitions pilotées par allowedTransitions, clôture grisée avec la garde expliquée, bilan codé (6 selects sur référentiels), checklist Fait→N-A→à faire, activité + commentaires, assignation, annulation motivée - nouvel OT : interrupteur « personne bloquée » qui force la priorité - demandes : table + panneau d'approbation (priorité, assignation, approuver → fiche OT), rejet en modale à motif obligatoire, signalement interne ; statut « Résolue » dérivé de l'OT lié - préventif : tuiles réelles, générer + résumé (« regénérer ne double rien »), gabarits administrables ; compteurs : saisie + historique - tableau de bord réel : bandeau urgence cliquable, KPIs, OT par statut, interventions récentes ; accueil dédié aux rôles sans exploitation - urgence traversante : chip topbar pulsante (60 s), badges de nav - GET /assets/options (auth seule) : le Demandeur peut désigner l'appareil qu'il signale — trou débusqué par l'e2e (49 opérations au contrat) - génération préventive durcie : collision de référence RETENTÉE (plus de saut silencieux), P2003 toléré ; 3 runs Jest complets consécutifs verts - 9 tests Playwright (recette R2 officielle rejouée intégralement), 50 tests API (94,6 % / 78,9 %) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -80,18 +80,37 @@ describe('Préventif & compteurs (e2e)', () => {
|
||||
where: { isActive: true, periodMonths: 1 },
|
||||
});
|
||||
|
||||
// B2 n'avait aucun OT préventif avant 2031-01 → premier contrôle
|
||||
const b2 = await prisma.asset.findUniqueOrThrow({ where: { reference: 'B2' } });
|
||||
const grilleB2 = await prisma.workOrder.findUniqueOrThrow({
|
||||
where: { assetId_periodKey: { assetId: b2.id, periodKey: '2031-01' } },
|
||||
include: { _count: { select: { checklist: true } } },
|
||||
// Un appareil VIERGE créé par ce test (aucune génération n'a pu le toucher)
|
||||
const categorie = await prisma.category.findFirstOrThrow({ where: { kind: 'EQUIPMENT' } });
|
||||
const site = await prisma.location.findFirstOrThrow({ where: { parentId: null } });
|
||||
const vierge = await prisma.asset.create({
|
||||
data: {
|
||||
reference: `PVT-${Date.now().toString(36)}`,
|
||||
brand: 'Test',
|
||||
categoryId: categorie.id,
|
||||
locationId: site.id,
|
||||
},
|
||||
});
|
||||
expect(grilleB2.title).toContain('Premier contrôle');
|
||||
expect(grilleB2._count.checklist).toBe(templatesActifs);
|
||||
try {
|
||||
await http()
|
||||
.post('/preventive/generate')
|
||||
.set(auth(admin))
|
||||
.send({ month: '2031-09' })
|
||||
.expect(200);
|
||||
const grille = await prisma.workOrder.findUniqueOrThrow({
|
||||
where: { assetId_periodKey: { assetId: vierge.id, periodKey: '2031-09' } },
|
||||
include: { _count: { select: { checklist: true } } },
|
||||
});
|
||||
expect(grille.title).toContain('Premier contrôle');
|
||||
expect(grille._count.checklist).toBe(templatesActifs);
|
||||
} finally {
|
||||
await prisma.workOrder.deleteMany({ where: { assetId: vierge.id } });
|
||||
await prisma.asset.delete({ where: { id: vierge.id } });
|
||||
}
|
||||
|
||||
// A1 a un historique préventif (seed juillet) → grille normale.
|
||||
// Mise en service mars 2020 : janvier 2031 n'est le mois ni du 12, ni du 3,
|
||||
// ni du 6 mois (écart 130) → seules les tâches MENSUELLES sont dues.
|
||||
// A1 a toujours un historique préventif (seed) → grille normale.
|
||||
// Mise en service mars 2020 : janvier 2031 (écart 130 mois) n'est le mois
|
||||
// ni du 3, ni du 6, ni du 12 → seules les tâches MENSUELLES sont dues.
|
||||
const a1 = await prisma.asset.findUniqueOrThrow({ where: { reference: 'A1' } });
|
||||
const grilleA1 = await prisma.workOrder.findUniqueOrThrow({
|
||||
where: { assetId_periodKey: { assetId: a1.id, periodKey: '2031-01' } },
|
||||
|
||||
Reference in New Issue
Block a user