Fotograferad mätarställning, versionshistorik och tysk kravbild i foten
---- Mätarställningen ska fotograferas ---------------------------------- Klienten krävde redan fotot: värdefältet visas först efter bilden. Men GRINDEN gjorde det inte, och en regel som bara finns i gränssnittet är en vana — inte en spärr. Det är samma förhållande som QUALITET C-2 gällde, fast åt andra hållet: här var servern svagare, vilket är värre, eftersom servern är den auktoritativa. Skillnaden är hela uppgiftens bevisvärde. En inskriven siffra är teknikerns påstående om vad som stod på mätaren; ett foto visar vad som stod där. Mätarställningen avgör garanti- och försäkringsfrågor i efterhand och är den enda uppgift i ärendet någon kan ha ett intresse av att skriva fel. Evidensgraderingen följer nu med: fotograferad ger E2, inskriven ger E1 och märks som inskriven i rapporten. Undantag finns och måste finnas — slocknad display, oåtkomlig timräknare — men kräver motivering, som det nekade historiksvaret. ---- Versionen räknades aldrig upp -------------------------------------- Systemet påstod "ALVA 1.0" efter tre revisioner, en fakturamodul och en stängd portal. Versionen sa alltså ingenting om vad man fick. Historiken är HÄRLEDD UR VAD SOM FAKTISKT LEVERERATS och varje post pekar på sin commit. En utgåva som inte går att peka på hör inte hemma i listan — en påhittad ändringslogg är samma obefogade säkerhet som produkten finns för att undvika. Första siffran höjs bara när GARANTIERNA ändras, vilket hänt två gånger: 2.0 när fakturan blev ett härlett dokument, 3.0 när TÜV-härdningen ändrade vad loggen garanterar. Nuvarande: 3.1. Och ett fynd på vägen: ritningsstämpeln läste versionen ur den AKTUELLA konstanten, så ett ärende stängt under 1.0 visade 3.1 — precis det stämpelns egen beskrivning säger att den inte ska göra. Avslutshändelsen bär numera versionen, och stämpeln läser den därifrån. Äldre ärenden säger uttryckligen "ej registrerad" i stället för att låna dagens siffra. ---- Tysk kravbild i foten ---------------------------------------------- Listan är tysk därför att § 5 DDG är den strängaste och mest utkrävbara i EU: klarar man den klarar man de andra marknaderna på köpet. Två fällor som är aktuella just nu, och bägge ser fortfarande ut som upplysningar: ODR-LÄNKEN SKA BORT. Förordning 524/2013 upphävdes genom förordning (EU) 2024/3228 och plattformen stängdes 20 juli 2025. Länken har legat i tiotusentals fotnoter sedan 2016 och pekar numera ingenstans. Foten saknar den medvetet. § 5 TMG HETER § 5 DDG sedan 14 maj 2024. Modulen hittar inte på uppgifter. Ett Impressum med påhittad adress är inte ett halvfärdigt Impressum utan ett vilseledande, och skadan större än den tomma rutans. Osatta fält redovisas som en åtgärdslista med rättslig grund, så driften kan spärra en driftsättning på listan i stället för att upptäcka bristen när brevet kommer. 460 enhetstester · genomgången 4/4 · typkontroll ren. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012EQg3rJsrQ1ZNTvkzmQAtt
This commit is contained in:
@@ -30,6 +30,8 @@ import AlvaAnalys from "./pages/alva/Analys";
|
||||
import AlvaFakturor from "./pages/alva/Fakturor";
|
||||
import AlvaIntegration from "./pages/alva/Integration";
|
||||
import AlvaGarantier from "./pages/alva/Garantier";
|
||||
import AlvaImpressum from "./pages/alva/Impressum";
|
||||
import AlvaUtgavor from "./pages/alva/Utgavor";
|
||||
import AlvaForsakring from "./pages/alva/Forsakring";
|
||||
import AlvaSupport from "./pages/alva/Support";
|
||||
import { Portalvakt } from "./pages/alva/Portalvakt";
|
||||
@@ -69,6 +71,10 @@ function AppContent() {
|
||||
<Route path="/alva" element={<AlvaStart />} />
|
||||
<Route path="/alva/ansokan" element={<AlvaAnsokan />} />
|
||||
<Route path="/alva/logga-in" element={<AlvaLoggaIn />} />
|
||||
{/* Lagstadgad information. Nås från foten på varje sida — det är
|
||||
en del av kravet, inte en placering. */}
|
||||
<Route path="/alva/impressum" element={<AlvaImpressum />} />
|
||||
<Route path="/alva/utgavor" element={<AlvaUtgavor />} />
|
||||
{/* Portalen är stängd utan giltig plattformssession — se
|
||||
Portalvakt. Utan konfigurerad plattform finns ingen session
|
||||
att kräva, och vyerna är då märkta som demonstration. */}
|
||||
|
||||
@@ -161,7 +161,11 @@ export const DOKUMENTKLASSER = [
|
||||
// inte Pro Max. En version är ett tillstånd av systemet, inte en
|
||||
// marknadsföringshändelse.
|
||||
|
||||
export const PLATTFORMSVERSION = "ALVA 1.0";
|
||||
// Versionen bor i services/gemensam/version.mjs tillsammans med
|
||||
// historiken. Den stod tidigare som en sträng här och räknades aldrig
|
||||
// upp: systemet påstod "ALVA 1.0" efter tre revisioner, en fakturamodul
|
||||
// och en stängd portal, och versionen sa alltså ingenting om vad man fick.
|
||||
export { PLATTFORMSVERSION, UTGAVOR, NUVARANDE } from "../../../services/gemensam/version.mjs";
|
||||
|
||||
// ---- Rutnät -----------------------------------------------------------
|
||||
//
|
||||
|
||||
@@ -20,8 +20,10 @@ function komplettLogg(extra: Record<string, unknown>[] = []) {
|
||||
return [
|
||||
{ typ: "objekt_identifierat", objekt: { identifierare: "ABC123" } },
|
||||
{ typ: "historik_kontrollerad", kontrollerad: true },
|
||||
{ typ: "matarstallning", lage: "ingaende", varde: "14 200" },
|
||||
{ typ: "matarstallning", lage: "utgaende", varde: "14 205" },
|
||||
// Fotot är en del av kravet, inte en utsmyckning: en inskriven siffra
|
||||
// är teknikerns påstående om vad som stod på mätaren.
|
||||
{ typ: "matarstallning", lage: "ingaende", varde: "14 200", bilagaId: "bil-in" },
|
||||
{ typ: "matarstallning", lage: "utgaende", varde: "14 205", bilagaId: "bil-ut" },
|
||||
{ typ: "reproducering", status: "ja", beskrivning: "Reproducerat vid 88 km/h." },
|
||||
{ typ: "felorsak", avvikelse: "Obalans", orsaker: ["Normalt slitage"], underlag: ["Mätvärde"], sakerhet: "hog" },
|
||||
{ typ: "atgard_utford", beskrivning: "Balanserade hjulen.", utford: true },
|
||||
@@ -450,3 +452,49 @@ describe("grinden räknar rätt sorts evidens per kontrolltyp", () => {
|
||||
expect(hinder).toContain("metodik_kontroller");
|
||||
});
|
||||
});
|
||||
|
||||
// ---- Mätarställningen ska vara fotograferad ----------------------------
|
||||
//
|
||||
// Klienten krävde redan fotot. Grinden gjorde det inte, och en regel som
|
||||
// bara finns i gränssnittet är en vana — inte en spärr. Det är samma
|
||||
// förhållande som C-2 gällde, fast åt andra hållet: här var det servern
|
||||
// som var svagare, vilket är värre, eftersom servern är den auktoritativa.
|
||||
describe("mätarställningen ska vara fotograferad, inte bara inskriven", () => {
|
||||
const utanFoto = () =>
|
||||
komplettLogg().map((h) => (h.typ === "matarstallning" ? { ...h, bilagaId: undefined } : h));
|
||||
|
||||
it("en inskriven siffra utan foto spärrar avslutet", () => {
|
||||
const hinder = grinda(utanFoto(), GENERISK).map((h) => h.id);
|
||||
expect(hinder).toContain("matarstallning_ingaende");
|
||||
expect(hinder).toContain("matarstallning_utgaende");
|
||||
});
|
||||
|
||||
it("hindret säger vad som saknas och vad man gör åt det", () => {
|
||||
const h = grinda(utanFoto(), GENERISK).find((x) => x.id === "matarstallning_ingaende");
|
||||
expect(h.detalj).toMatch(/fotografera/i);
|
||||
});
|
||||
|
||||
it("ett dataUrl-foto duger lika bra som en bilaga", () => {
|
||||
// Offline-läget lagrar bilden inline tills den synkats.
|
||||
const inline = komplettLogg().map((h) =>
|
||||
h.typ === "matarstallning" ? { ...h, bilagaId: undefined, dataUrl: "data:image/png;base64,AA" } : h,
|
||||
);
|
||||
expect(grinda(inline, GENERISK)).toEqual([]);
|
||||
});
|
||||
|
||||
it("ett motiverat undantag ersätter fotot — trasig display, oåtkomlig timräknare", () => {
|
||||
const undantag = komplettLogg().map((h) =>
|
||||
h.typ === "matarstallning"
|
||||
? { ...h, bilagaId: undefined, undantag: "Displayen är slocknad, avläst via diagnosverktyg." }
|
||||
: h,
|
||||
);
|
||||
expect(grinda(undantag, GENERISK)).toEqual([]);
|
||||
});
|
||||
|
||||
it("ett tomt undantag räcker inte — då vore det en väg runt kravet", () => {
|
||||
const tomt = komplettLogg().map((h) =>
|
||||
h.typ === "matarstallning" ? { ...h, bilagaId: undefined, undantag: " " } : h,
|
||||
);
|
||||
expect(grinda(tomt, GENERISK).map((h) => h.id)).toContain("matarstallning_ingaende");
|
||||
});
|
||||
});
|
||||
|
||||
@@ -229,7 +229,17 @@ export type Handelse =
|
||||
*/
|
||||
orsakFastställd?: boolean;
|
||||
}
|
||||
| { typ: "arende_avslutat"; signatur?: string };
|
||||
| {
|
||||
typ: "arende_avslutat";
|
||||
signatur?: string;
|
||||
/**
|
||||
* Versionen som gällde vid avslutet. Ritningsstämpeln läste den ur
|
||||
* den aktuella konstanten, så ett ärende stängt under 1.0 visade
|
||||
* 3.1 — precis det stämpelns egen beskrivning säger att den inte
|
||||
* ska göra.
|
||||
*/
|
||||
plattformsversion?: string;
|
||||
};
|
||||
|
||||
export interface LoggPost {
|
||||
id: string;
|
||||
|
||||
@@ -119,7 +119,21 @@ export function evidensposter(arende: Arende): Evidenspost[] {
|
||||
`${h.beskrivning} = ${h.varde}${h.enhet ? ` ${h.enhet}` : ""} (${märkning})`,
|
||||
);
|
||||
}
|
||||
if (h.typ === "matarstallning" && !h.undantag) lagg(post, "mätarställning", "E2", `${h.lage === "ingaende" ? "In" : "Ut"}: ${h.varde}`);
|
||||
if (h.typ === "matarstallning" && !h.undantag) {
|
||||
// Ett foto på mätaren är E2 — något som visar vad som stod där.
|
||||
// En inskriven siffra utan foto är teknikerns påstående om vad som
|
||||
// stod där, alltså E1. Skillnaden syns i rapporten, eftersom
|
||||
// mätarställningen är det som avgör garanti- och försäkringsfrågor
|
||||
// i efterhand och den enda uppgift någon kan ha ett intresse av att
|
||||
// skriva fel.
|
||||
const fotograferad = Boolean(h.bilagaId || h.dataUrl);
|
||||
lagg(
|
||||
post,
|
||||
"mätarställning",
|
||||
fotograferad ? "E2" : "E1",
|
||||
`${h.lage === "ingaende" ? "In" : "Ut"}: ${h.varde}${fotograferad ? "" : " (inskriven, ej fotograferad)"}`,
|
||||
);
|
||||
}
|
||||
if (h.typ === "arbetsorder_skannad") lagg(post, "dokument", "E5", `Arbetsorder, ${h.falt.length} fält`);
|
||||
if (h.typ === "observation") lagg(post, "observation", "E1", h.text);
|
||||
if (h.typ === "kontroll_utford" && !h.undantag) lagg(post, "kontroll", "E1", h.text);
|
||||
|
||||
@@ -0,0 +1,138 @@
|
||||
// ALVA-SPEC-050 · Impressum och lagstadgad information.
|
||||
//
|
||||
// Sidan visar två saker: uppgifterna, och — så länge de inte är satta —
|
||||
// exakt vilka som fattas och med vilken rättslig grund.
|
||||
//
|
||||
// Att fylla rutorna med påhittade uppgifter vore inte ett halvfärdigt
|
||||
// Impressum utan ett vilseledande, och skadan större än den tomma rutans.
|
||||
// Därför står det som saknas som en åtgärdslista i stället.
|
||||
|
||||
import {
|
||||
AVSKAFFAT,
|
||||
FALT,
|
||||
HANDLINGAR,
|
||||
saknade,
|
||||
} from "../../../../services/gemensam/foretagsuppgifter.mjs";
|
||||
import { Block, Etikett, FARG, Rubrik, Tabell } from "@/alva/komponenter";
|
||||
import { Ram } from "./Ram";
|
||||
|
||||
interface Falt {
|
||||
id: string;
|
||||
rubrik: string;
|
||||
grund: string;
|
||||
kravs: boolean;
|
||||
hjalp: string;
|
||||
}
|
||||
interface Handling {
|
||||
id: string;
|
||||
rubrik: string;
|
||||
grund: string;
|
||||
kravs: boolean;
|
||||
nar: string;
|
||||
}
|
||||
|
||||
// Driftens uppgifter. Sätts vid driftsättning; tomt betyder tomt.
|
||||
const UPPGIFTER: Record<string, string> = {};
|
||||
|
||||
export default function Impressum() {
|
||||
const fattas = saknade(UPPGIFTER) as { id: string; rubrik: string; grund: string }[];
|
||||
|
||||
return (
|
||||
<Ram>
|
||||
<div className="mx-auto max-w-[1040px] px-6 py-12">
|
||||
<Etikett>Legal</Etikett>
|
||||
<div className="mt-2 mb-2">
|
||||
<Rubrik niva={1}>Impressum</Rubrik>
|
||||
</div>
|
||||
<p className="mb-8 max-w-[680px] text-[14px] leading-[22px]" style={{ color: FARG.steel }}>
|
||||
Angaben gemäß § 5 DDG. The requirement set is German because it is the strictest and the most
|
||||
enforceable in the EU — meeting it meets the other markets as a by-product, and spares a
|
||||
second review per country.
|
||||
</p>
|
||||
|
||||
{fattas.length > 0 && (
|
||||
<Block rubrik="Not yet set" beteckning="ALVA-SPEC-050">
|
||||
<p className="mb-4 max-w-[680px] text-[13px] leading-[21px]" style={{ color: FARG.steel }}>
|
||||
The operator’s details have not been configured. They are shown as outstanding rather
|
||||
than filled with placeholder text: an Impressum with an invented address is not an
|
||||
incomplete Impressum but a misleading one, and the harm is greater than an empty field.
|
||||
</p>
|
||||
<Tabell
|
||||
kolumner={["Field", "Legal basis"]}
|
||||
rader={fattas.map((f) => [
|
||||
<span key="r" className="font-semibold">
|
||||
{f.rubrik}
|
||||
</span>,
|
||||
<span key="g" className="font-mono text-[11px]" style={{ color: FARG.steel }}>
|
||||
{f.grund}
|
||||
</span>,
|
||||
])}
|
||||
/>
|
||||
</Block>
|
||||
)}
|
||||
|
||||
<Block rubrik="Required details" beteckning="§ 5 DDG">
|
||||
<Tabell
|
||||
kolumner={["Field", "Value", "Legal basis", "Note"]}
|
||||
rader={(FALT as Falt[]).map((f) => [
|
||||
<span key="r" className="font-semibold">
|
||||
{f.rubrik}
|
||||
{!f.kravs && (
|
||||
<span className="ml-2 text-[10px] uppercase tracking-[0.08em]" style={{ color: FARG.steel }}>
|
||||
conditional
|
||||
</span>
|
||||
)}
|
||||
</span>,
|
||||
<span key="v" className="font-mono text-[12px]" style={{ color: UPPGIFTER[f.id] ? FARG.graphite : FARG.steel }}>
|
||||
{UPPGIFTER[f.id] || "— not set"}
|
||||
</span>,
|
||||
<span key="g" className="font-mono text-[11px]" style={{ color: FARG.steel }}>
|
||||
{f.grund}
|
||||
</span>,
|
||||
<span key="h" className="text-[12px] leading-[19px]" style={{ color: FARG.steel }}>
|
||||
{f.hjalp}
|
||||
</span>,
|
||||
])}
|
||||
/>
|
||||
</Block>
|
||||
|
||||
<Block rubrik="Documents that must be reachable from every page" beteckning="ALVA-SPEC-050">
|
||||
<Tabell
|
||||
kolumner={["Document", "Legal basis", "When it applies"]}
|
||||
rader={(HANDLINGAR as Handling[]).map((h) => [
|
||||
<span key="r" className="font-semibold">
|
||||
{h.rubrik}
|
||||
</span>,
|
||||
<span key="g" className="font-mono text-[11px]" style={{ color: FARG.steel }}>
|
||||
{h.grund}
|
||||
</span>,
|
||||
<span key="n" className="text-[12px] leading-[19px]" style={{ color: FARG.steel }}>
|
||||
{h.nar}
|
||||
</span>,
|
||||
])}
|
||||
/>
|
||||
</Block>
|
||||
|
||||
{/* Den här rutan är sidans egentliga behållning. Två hänvisningar
|
||||
som legat i tiotusentals fotnoter är numera fel, och bägge ser
|
||||
fortfarande ut som upplysningar. */}
|
||||
<Block rubrik="What must no longer be here" beteckning="ALVA-SPEC-050">
|
||||
<Tabell
|
||||
kolumner={["No longer valid", "Basis", "What to do"]}
|
||||
rader={(AVSKAFFAT as { rubrik: string; grund: string; text: string }[]).map((a) => [
|
||||
<span key="r" className="font-semibold">
|
||||
{a.rubrik}
|
||||
</span>,
|
||||
<span key="g" className="font-mono text-[11px]" style={{ color: FARG.steel }}>
|
||||
{a.grund}
|
||||
</span>,
|
||||
<span key="t" className="text-[12px] leading-[19px]" style={{ color: FARG.steel }}>
|
||||
{a.text}
|
||||
</span>,
|
||||
])}
|
||||
/>
|
||||
</Block>
|
||||
</div>
|
||||
</Ram>
|
||||
);
|
||||
}
|
||||
@@ -108,13 +108,43 @@ export function Ram({ children, portal = false }: { children: ReactNode; portal?
|
||||
|
||||
<main>{children}</main>
|
||||
|
||||
{/* Foten bär det som en näringsidkare måste hålla synligt. Listan
|
||||
är byggd mot tyskt krav — § 5 DDG är den strängaste och mest
|
||||
utkrävbara i EU, och den som klarar den klarar de andra på
|
||||
köpet. Se services/gemensam/foretagsuppgifter.mjs.
|
||||
|
||||
Här ligger MEDVETET ingen länk till EU:s ODR-plattform. Den
|
||||
upphävdes genom förordning (EU) 2024/3228 och stängdes den
|
||||
20 juli 2025; en kvarliggande länk är en död hänvisning som ser
|
||||
ut som en lagstadgad upplysning. */}
|
||||
<footer className="border-t" style={{ borderColor: FARG.lightSteel, background: FARG.white }}>
|
||||
<div
|
||||
className="mx-auto flex max-w-[1040px] flex-wrap justify-between gap-4 px-6 py-6 font-mono text-[11px]"
|
||||
style={{ color: FARG.steel }}
|
||||
>
|
||||
<span>{PLATTFORMSVERSION}</span>
|
||||
<span>{ALVA.position}</span>
|
||||
<div className="mx-auto max-w-[1040px] px-6 py-6">
|
||||
<nav aria-label="Legal">
|
||||
<ul className="flex flex-wrap gap-x-6 gap-y-2 text-[12px]">
|
||||
{[
|
||||
["/alva/impressum", "Impressum"],
|
||||
["/alva/dataskydd", "Privacy"],
|
||||
["/alva/villkor", "Terms"],
|
||||
["/alva/tillganglighet", "Accessibility"],
|
||||
["/alva/utgavor", "Release notes"],
|
||||
].map(([till, text]) => (
|
||||
<li key={till}>
|
||||
<Link to={till} style={{ color: FARG.steel }}>
|
||||
{text}
|
||||
</Link>
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
</nav>
|
||||
<div
|
||||
className="mt-6 flex flex-wrap justify-between gap-4 border-t pt-6 font-mono text-[11px]"
|
||||
style={{ borderColor: FARG.lightSteel, color: FARG.steel }}
|
||||
>
|
||||
<Link to="/alva/utgavor" style={{ color: FARG.steel }}>
|
||||
{PLATTFORMSVERSION}
|
||||
</Link>
|
||||
<span>{ALVA.position}</span>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
</div>
|
||||
|
||||
@@ -0,0 +1,75 @@
|
||||
// ALVA-SPEC-002 · Utgåvor.
|
||||
//
|
||||
// Historiken är härledd ur vad som faktiskt levererats, och varje post
|
||||
// pekar på den commit där arbetet finns. En utgåva som inte går att peka
|
||||
// på hör inte hemma i listan.
|
||||
|
||||
import { NUVARANDE, UTGAVOR } from "../../../../services/gemensam/version.mjs";
|
||||
import { Block, Etikett, FARG, Rubrik } from "@/alva/komponenter";
|
||||
import { Ram } from "./Ram";
|
||||
|
||||
interface Utgava {
|
||||
version: string;
|
||||
datum: string;
|
||||
commit: string;
|
||||
rubrik: string;
|
||||
stor?: boolean;
|
||||
andringar: string[];
|
||||
}
|
||||
|
||||
export default function Utgavor() {
|
||||
const utgavor = UTGAVOR as Utgava[];
|
||||
const nu = NUVARANDE as Utgava;
|
||||
|
||||
return (
|
||||
<Ram>
|
||||
<div className="mx-auto max-w-[1040px] px-6 py-12">
|
||||
<Etikett>Release notes</Etikett>
|
||||
<div className="mt-2 mb-2">
|
||||
<Rubrik niva={1}>Versions</Rubrik>
|
||||
</div>
|
||||
<p className="mb-8 max-w-[680px] text-[14px] leading-[22px]" style={{ color: FARG.steel }}>
|
||||
Current release <span className="font-mono">ALVA {nu.version}</span>, {nu.datum}. The second
|
||||
digit moves for new capability. The first moves only when the <em>guarantees</em> change —
|
||||
what the system undertakes about a record. That has happened twice.
|
||||
</p>
|
||||
|
||||
<div className="grid gap-4">
|
||||
{utgavor.map((u) => (
|
||||
<Block key={u.version} rubrik={`ALVA ${u.version} — ${u.rubrik}`} beteckning={u.commit}>
|
||||
<div className="mb-4 flex flex-wrap items-center gap-4">
|
||||
<span className="font-mono text-[12px]" style={{ color: FARG.steel }}>
|
||||
{u.datum}
|
||||
</span>
|
||||
{u.stor && (
|
||||
<span
|
||||
className="border px-2 py-2 text-[10px] font-semibold uppercase tracking-[0.08em]"
|
||||
style={{ borderColor: FARG.graphite, color: FARG.graphite }}
|
||||
>
|
||||
Guarantees changed
|
||||
</span>
|
||||
)}
|
||||
</div>
|
||||
<ul className="grid gap-2">
|
||||
{u.andringar.map((a) => (
|
||||
<li key={a} className="max-w-[680px] text-[13px] leading-[21px]">
|
||||
{a}
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
</Block>
|
||||
))}
|
||||
</div>
|
||||
|
||||
<Block rubrik="How versions are numbered" beteckning="ALVA-SPEC-002">
|
||||
<p className="max-w-[680px] text-[13px] leading-[21px]" style={{ color: FARG.steel }}>
|
||||
ALVA 1.0, ALVA 1.1, ALVA 2.0. Not Summer Edition, not AI Edition, not Pro Max. A version is
|
||||
a state of the system, not a marketing event. A release that cannot be pointed at in the
|
||||
history does not belong in this list — an invented changelog is the same unfounded
|
||||
certainty the product exists to avoid.
|
||||
</p>
|
||||
</Block>
|
||||
</div>
|
||||
</Ram>
|
||||
);
|
||||
}
|
||||
@@ -10,6 +10,7 @@ import { Slutsatspanel } from "@/felsokning/Slutsats";
|
||||
import { sammanfatta } from "../../../../services/gemensam/sammanfattning.mjs";
|
||||
import { grinda } from "../../../../services/gemensam/grind.mjs";
|
||||
import { PLATTFORMSVERSION, arendebeteckning, fasDefinition } from "@/alva/system";
|
||||
import { versionVidAvslut } from "../../../../services/gemensam/version.mjs";
|
||||
import {
|
||||
arAvslutat,
|
||||
arendeidentitet,
|
||||
@@ -1342,7 +1343,7 @@ function GuideFlik({
|
||||
Om felorsaken inte är verifierad: dokumentera en hypotes och utöka felsökningen, eller avsluta ärendet
|
||||
med rekommenderade nästa steg.
|
||||
</p>
|
||||
<StorKnapp variant="fara" disabled={!kanAvslutas} onClick={() => skicka({ typ: "arende_avslutat", signatur: anvandare })}>
|
||||
<StorKnapp variant="fara" disabled={!kanAvslutas} onClick={() => skicka({ typ: "arende_avslutat", signatur: anvandare, plattformsversion: PLATTFORMSVERSION })}>
|
||||
Avsluta felsökning
|
||||
</StorKnapp>
|
||||
{!kanAvslutas && <Avslutshinder hinder={hinder} />}
|
||||
@@ -1423,7 +1424,7 @@ function GuideFlik({
|
||||
<StorKnapp variant="sekundar" onClick={() => setVisaOverlamning(true)}>
|
||||
Lämna över arbete
|
||||
</StorKnapp>
|
||||
<StorKnapp variant="sekundar" disabled={!kanAvslutas} onClick={() => skicka({ typ: "arende_avslutat", signatur: anvandare })}>
|
||||
<StorKnapp variant="sekundar" disabled={!kanAvslutas} onClick={() => skicka({ typ: "arende_avslutat", signatur: anvandare, plattformsversion: PLATTFORMSVERSION })}>
|
||||
Avsluta felsökning
|
||||
</StorKnapp>
|
||||
</div>
|
||||
@@ -2697,7 +2698,11 @@ function Ritningsstampel({ arende }: { arende: Arende }) {
|
||||
["Beteckning", arendebeteckning(arende.nummer)],
|
||||
["Regelpaket", paket.version],
|
||||
["Evidensmodell", `ECM ${ECM_VERSION}`],
|
||||
["Plattform", PLATTFORMSVERSION],
|
||||
// Versionen VID AVSLUTET, inte dagens. Stämpeln läste tidigare den
|
||||
// aktuella konstanten, så ett ärende stängt under 1.0 visade 3.1 —
|
||||
// vilket är exakt det stämpelns beskrivning ovan säger att den inte
|
||||
// ska göra. Ett öppet ärende visar dagens, eftersom det är sant då.
|
||||
["Plattform", avslutad ? versionVidAvslut(avslutad.handelse) : PLATTFORMSVERSION],
|
||||
["Status", avslutad ? "Closed" : "In progress"],
|
||||
["Utgåva", avslutad ? new Date(avslutad.tidpunkt).toISOString().slice(0, 10) : "—"],
|
||||
];
|
||||
|
||||
Reference in New Issue
Block a user