diff --git a/felsokning/app/src/felsokning/__tests__/grind.test.ts b/felsokning/app/src/felsokning/__tests__/grind.test.ts index 5dc6138..042cc44 100644 --- a/felsokning/app/src/felsokning/__tests__/grind.test.ts +++ b/felsokning/app/src/felsokning/__tests__/grind.test.ts @@ -245,3 +245,42 @@ describe("schemat följer domänmodellen", () => { expect([...new Set(avvisade)]).toEqual([]); }); }); + +// ---- En mätning ska loggas som en mätning ------------------------------- +// +// Bakgrund: en kontroll vars krav är "matvarde" loggade bara +// kontroll_utford. Följden var att 56 av metodikernas 153 kontroller — +// drygt en tredjedel — mätte utan att det syntes någonstans: +// felorsaksanalysen nekade "Mätresultat" som underlag trots att +// teknikern just hade mätt, och evidensprofilen i analysvyn underskattade +// systematiskt hur mycket som faktiskt mäts i verkstaden. +// +// Testet låser förhållandet mellan metodikernas krav och den evidens de +// måste ge, så att en framtida kontrolltyp inte kan införas utan att +// någon tar ställning till vilken evidens den producerar. +describe("metodikernas mätkontroller producerar mätevidens", () => { + it("varje kontroll har ett känt krav", async () => { + const { ALLA_METODIKER } = await import("../../../../services/gemensam/metodiker.mjs"); + const kravtyper = new Set(); + for (const m of ALLA_METODIKER) { + for (const steg of m.steg) { + for (const k of steg.kontroller ?? []) if (k.krav) kravtyper.add(k.krav); + } + } + expect([...kravtyper].sort()).toEqual(["foto", "kommentar", "matvarde"]); + }); + + it("KontrollKort loggar ett matvarde när kravet är matvarde", () => { + const kod = readFileSync("src/pages/felsokning/ArendeSida.tsx", "utf8"); + expect(kod).toMatch(/krav === "matvarde" && resultat\.trim\(\)/); + expect(kod).toMatch(/skicka\(\{ typ: "matvarde", beskrivning: kontroll\.text/); + }); + + it('underlagskällan "Mätresultat" godtar just den händelsetypen', async () => { + const { underlagFinns } = await import("../ecm"); + const arende = { + handelser: [{ id: "1", tidpunkt: "", anvandare: "A", handelse: { typ: "matvarde", beskrivning: "Lufttryck", varde: "2,4 bar" } }], + } as never; + expect(underlagFinns(arende, "Mätresultat")).toBe(true); + }); +}); diff --git a/felsokning/app/src/pages/felsokning/ArendeSida.tsx b/felsokning/app/src/pages/felsokning/ArendeSida.tsx index 73b47fc..8ae42f2 100644 --- a/felsokning/app/src/pages/felsokning/ArendeSida.tsx +++ b/felsokning/app/src/pages/felsokning/ArendeSida.tsx @@ -1527,7 +1527,19 @@ function KontrollKort({ steg, skicka }: { steg: NastaSteg; skicka: (h: Handelse) const filRef = useRef(null); const krav = kontroll.krav; - const utford = () => + const utford = () => { + // En kontroll vars krav är ett mätvärde ger ett mätvärde. Tidigare + // loggades bara kontroll_utford, med följden att 56 av metodikernas + // 153 kontroller — drygt en tredjedel — mätte utan att det syntes: + // felorsaksanalysen nekade ”Mätresultat” som underlag, och + // evidensprofilen i analysvyn underskattade systematiskt hur mycket + // som faktiskt mättes. Mätningen loggas därför som det den är. + // + // Utan känt mätdon graderas den E1, inte E4 (QUALITY-AUDIT M-1) — + // ett avläst tal utan spårbart instrument är inte en spårbar mätning. + if (krav === "matvarde" && resultat.trim()) { + skicka({ typ: "matvarde", beskrivning: kontroll.text, varde: resultat.trim() }); + } skicka({ typ: "kontroll_utford", stegId: steg.steg.id, @@ -1535,6 +1547,7 @@ function KontrollKort({ steg, skicka }: { steg: NastaSteg; skicka: (h: Handelse) text: kontroll.text, resultat: resultat.trim() || undefined, }); + }; const kravUppfyllt = krav === "foto" || !krav || resultat.trim().length > 0;