Lås inte in ärenden där åtgärden dokumenterades före förslaget

När kundbeskedet blev ett avslutsvillkor i klienten uppstod en fälla:
knappen "Lämna åtgärdsförslag till kund" visades bara när ingen åtgärd
var dokumenterad, och beskedsrutan bara när ett förslag fanns. En
tekniker som skrev åtgärden först hade därmed ingen väg att registrera
beskedet, och ärendet gick inte att stänga.

Grinden avvisade redan sådana ärenden vid synk — villkoret i klienten
flyttade bara upptäckten. Men ett spärrvillkor utan väg ut är ett fel
även när spärren i sig är riktig.

Förslagsknappen står kvar tills ett förslag faktiskt lämnats. Ordningen
förslag → besked → arbete är fortfarande den panelen föreskriver, och
loggen är append-only med tidsstämplar, så ett besked som registreras i
efterhand syns som just det.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012EQg3rJsrQ1ZNTvkzmQAtt
This commit is contained in:
Claude
2026-08-05 17:44:26 +00:00
parent 8daeb41ba1
commit 45967d086e
2 changed files with 33 additions and 1 deletions
@@ -275,3 +275,28 @@ describe("klientens avslutsvillkor täcker hela grindens åtgärdskedja", () =>
expect(rad).toContain("kundbeslut(arende)");
});
});
// ---- Vägen ut måste alltid finnas ---------------------------------------
//
// När kundbeskedet blev ett avslutsvillkor i klienten uppstod en fälla:
// knappen "Lämna åtgärdsförslag till kund" visades bara när ingen åtgärd
// var dokumenterad, och beskedsrutan bara när ett förslag fanns. En
// tekniker som skrev åtgärden först hade därmed inget sätt att registrera
// beskedet — och ärendet gick inte att stänga, utan att gränssnittet
// kunde tala om varför.
//
// Grinden avvisade redan sådana ärenden vid synk; villkoret i klienten
// flyttade bara upptäckten. Ett spärrvillkor utan väg ut är ett fel även
// när spärren i sig är riktig.
describe("kundbeskedet går att registrera även när åtgärden skrevs först", () => {
const kod = readFileSync("src/pages/felsokning/ArendeSida.tsx", "utf8");
it("förslagsknappen döljs inte av att en åtgärd redan är dokumenterad", () => {
expect(kod).toContain("{forslag.length === 0 && !forslagsLage && (");
expect(kod).not.toContain("forslag.length === 0 && !forslagsLage && poster.length === 0");
});
it("beskedsrutan öppnas av att ett förslag finns", () => {
expect(kod).toContain("{forslag.length > 0 && !beslut && (");
});
});
@@ -803,7 +803,14 @@ function AtgardsPanel({ arende, skicka }: { arende: Arende; skicka: (h: Handelse
</p>
)}
{forslag.length === 0 && !forslagsLage && poster.length === 0 && (
{/* Förslaget hör före arbetet, och knappen står därför först. Men
den får inte försvinna när arbetet väl dokumenterats: grinden
kräver kundens besked för utfört arbete, och utan den här vägen
blir ett ärende där teknikern skrev åtgärden först omöjligt att
stänga — utan att någonstans säga varför. Loggen är append-only
med tidsstämplar, så ett besked som registreras i efterhand
syns som just det. */}
{forslag.length === 0 && !forslagsLage && (
<StorKnapp
variant="sekundar"
className="mb-2"