Betalarspåret: beviskraven följer den som betalar — ALVA 3.6
Garantistandarden FGS-1.0 (fabriksgaranti, vagnskadegaranti, försäkring, extern garantigivare, leasing/fleet, goodwill) inarbetad i regelmotorn och bokförd i docs/GARANTISTANDARD-FGS.md (ALVA-DOC-0011): vad som redan var uppfyllt, vad som införs nu, och den ärliga gränsen — ODIS/DISS/SAGA2 är tillverkarsystem; ALVA bär bevispaketet och eskaleringsspåret, den ersätter dem inte. Tre nya händelsetyper i det stängda schemat: betalare (spår, namn, claim-/skadereferens, godkännande), eskalering (öppnad/besvarad, kanal, referens) och reservdel (artikelnummer, serienummer, batch, sparad del). Grinden kräver fastställd betalare för de ärendetyper där någon annan än kunden betalar, godkännande för goodwill och externa garantigivare, och spärrar avslut när en eskalering är öppnad utan dokumenterat svar — matchad per referens. Claim- och skadenummer kan komma ur betalaren, inte bara ur skannad arbetsorder. Tre nya ärendetyper med regelpaketskrav: Body damage warranty, Extended warranty, Leasing or fleet. Betalare, eskalering och reservdel är interna i delningsfiltret — kunden ser åtgärden, inte förhandlingen. Fyndet på vägen, åtgärdat med regressionstest: serverns ärendetypskrav var en tyst no-op. Servern matade den distribuerade paketformen (arendetypRegler) in i en grindfunktion som bara läste den slimmade (arendetyper[typ].krav) — garanti- och försäkringskraven upprätthölls bara som råd i klienten. C-2-mönstret, återuppstånden genom ett filformat. Grinden läser nu båda formerna, och regressionstestet låser att den distribuerade formen spärrar på servern. UI: betalar- och eskaleringspaneler i ärendevyn (panelen visas när ärendetypen kräver den), grindnyckeln grind.eskalering på alla tio språken, regelpaket 2.1 speglat klient/server med likhetstestet intakt. 781 enhetstester, genomgång 4/4 inom budget, portalspärr, integrationstest mot Postgres, typkontroll, lint på baslinjen, artefaktmätning och språkrunda gröna. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012EQg3rJsrQ1ZNTvkzmQAtt
This commit is contained in:
@@ -210,6 +210,24 @@ export function grinda(handelser, metodik, sprak = STANDARD) {
|
||||
krav(`sparr_${frageId}`, nyckel, arJakande(svaret?.svar), "grind.sparr.ej_uppfyllt");
|
||||
}
|
||||
|
||||
// Teknisk eskalering (FGS-1.0 §8, DISS-mönstret): en öppnad förfrågan
|
||||
// till tillverkare eller garantigivare utan dokumenterat svar spärrar
|
||||
// avslutet. Bulletinerna kräver att svaret inväntas innan ytterligare
|
||||
// åtgärder görs — ett ärende som stängs med öppen eskalering har inte
|
||||
// hela orsakskedjan dokumenterad, och garantianspråket kan ogiltigas.
|
||||
{
|
||||
const oppna = new Map();
|
||||
for (const h of av(handelser, "eskalering")) {
|
||||
const nyckel = String(h.referens ?? "").trim();
|
||||
if (h.status === "oppnad") oppna.set(nyckel, h);
|
||||
else if (oppna.has(nyckel)) oppna.delete(nyckel);
|
||||
else if (nyckel === "" && oppna.size === 1) oppna.clear();
|
||||
}
|
||||
krav("eskalering", "grind.eskalering", oppna.size === 0, "grind.eskalering.detalj", {
|
||||
referens: [...oppna.keys()].map((r) => r || "—").join(", "),
|
||||
});
|
||||
}
|
||||
|
||||
// Evidensnivån måste överstiga E0 — annars avslutas ett ärende utan
|
||||
// att någonting alls har dokumenterats.
|
||||
krav(
|
||||
@@ -231,15 +249,33 @@ export function grindaArendetyp(handelser, regelpaket, sprak = STANDARD) {
|
||||
// när typerna hette "Garanti" ska få garantins extra krav även efter
|
||||
// att de bytt språk — se ARENDETYP_ARV.
|
||||
const typ = arendetypNu(av(handelser, "arendetyp_satt").at(-1)?.arendetyp);
|
||||
const regler = regelpaket?.arendetyper?.[typ]?.krav ?? [];
|
||||
// Paketet finns i två former: den distribuerade filens rika form
|
||||
// (arendetypRegler med id/rubrik/detaljVidBrist) och den slimmade
|
||||
// (arendetyper[typ].krav). Servern matade tidigare in den rika formen
|
||||
// i en funktion som bara läste den slimmade — varje ärendetypskrav
|
||||
// blev en tyst no-op på servern, och spärren fanns bara som råd i
|
||||
// klienten. Det är exakt C-2-mönstret, återuppstått genom ett format.
|
||||
const regler = [
|
||||
...(regelpaket?.arendetyper?.[typ]?.krav ?? []),
|
||||
...(regelpaket?.arendetypRegler?.[typ] ?? []).map((r) => ({ typ: r.krav, rubrik: r.rubrik, detalj: r.detaljVidBrist })),
|
||||
];
|
||||
const hinder = [];
|
||||
|
||||
const betalareReferens = () => av(handelser, "betalare").some((h) => String(h.referens ?? "").trim());
|
||||
const uppfyllt = {
|
||||
miltal: () => av(handelser, "matarstallning").length > 0,
|
||||
historik: () => av(handelser, "historik_kontrollerad").some((h) => h.kontrollerad),
|
||||
foto: () => av(handelser, "foto").length > 0,
|
||||
claim: () => harReferens(handelser, ["ao_claim", "claim"]),
|
||||
skadenummer: () => harReferens(handelser, ["ao_skadenummer", "skadenummer"]),
|
||||
// Referensen kan komma ur den skannade arbetsordern ELLER ur en
|
||||
// registrerad betalare — alla verkstäder skannar inte (FGS-1.0 §4).
|
||||
claim: () => harReferens(handelser, ["ao_claim", "claim"]) || betalareReferens(),
|
||||
skadenummer: () => harReferens(handelser, ["ao_skadenummer", "skadenummer"]) || betalareReferens(),
|
||||
// FGS-1.0 §1/§18: betalaren fastställd — spår och namn — innan
|
||||
// ärendet kan stängas i de spår där någon annan än kunden betalar.
|
||||
betalare: () => av(handelser, "betalare").some((h) => String(h.namn ?? "").trim() && String(h.spar ?? "").trim()),
|
||||
// Goodwill och externa garantigivare kräver godkännande/claim
|
||||
// authorization INNAN reparationen ersätts (FGS-1.0 §12).
|
||||
godkannande: () => av(handelser, "betalare").some((h) => String(h.godkannande ?? "").trim()),
|
||||
};
|
||||
|
||||
for (const regel of regler) {
|
||||
@@ -260,6 +296,7 @@ export function grindaArendetyp(handelser, regelpaket, sprak = STANDARD) {
|
||||
id: `arendetyp_${krav}`,
|
||||
nyckel: regel.rubrik ? undefined : "grind.arendetyp.krav",
|
||||
rubrik: regel.rubrik ?? t(sprak, "grind.arendetyp.krav", { krav }),
|
||||
...(regel.detalj ? { detalj: regel.detalj } : {}),
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -54,6 +54,14 @@ export const HÄNDELSESCHEMA = {
|
||||
resultat: ["symptomet_borta", "kvarstar", "delvis", "ej_verifierbar"],
|
||||
beskrivning: "text",
|
||||
},
|
||||
// FGS-1.0: betalarspåret, eskaleringen och reservdelen är händelser i
|
||||
// loggen — inte fritext i en kommentar — så att grinden kan räkna på dem.
|
||||
betalare: {
|
||||
spar: ["fabriksgaranti", "vagnskadegaranti", "forsakring", "extern_garanti", "leasing", "goodwill", "kund"],
|
||||
namn: "text",
|
||||
},
|
||||
eskalering: { status: ["oppnad", "besvarad"], beskrivning: "text" },
|
||||
reservdel: { artikelnummer: "text", beskrivning: "text" },
|
||||
kommentar: { text: "text" },
|
||||
kategori_byte: { kategori: "text" },
|
||||
inaktivitet_forklarad: { text: "text", minuter: "tal" },
|
||||
@@ -91,6 +99,9 @@ export const VALFRIA_FÄLT = {
|
||||
matarstallning: ["undantag", "bilagaId", "bilagaHash", "dataUrl"],
|
||||
|
||||
kontroll_utford: ["resultat", "undantag"],
|
||||
betalare: ["referens", "godkannande"],
|
||||
eskalering: ["referens", "kanal"],
|
||||
reservdel: ["serienummer", "batch", "sparad"],
|
||||
// `kalla` bär härkomsten för värden som kommit in via ett
|
||||
// diagnosprotokoll (ALVA-SPEC-020). Fältet måste vara deklarerat:
|
||||
// integrationen fungerade tidigare bara därför att schemat var öppet.
|
||||
|
||||
@@ -54,6 +54,8 @@ export const DE = {
|
||||
"grind.arendetyp.krav": "Anforderung für diese Vorgangsart: {krav}",
|
||||
"grind.sakerhet": "Konfidenzniveau innerhalb dessen, was die Evidenz trägt",
|
||||
"grind.sakerhet.detalj": "Die angegebene Konfidenz ({niva}) übersteigt, was die Evidenz trägt ({tak}). Evidenz ergänzen oder das Niveau senken — ehrliche Unsicherheit ist Information.",
|
||||
"grind.eskalering": "Technische Eskalationen beantwortet",
|
||||
"grind.eskalering.detalj": "Eine Eskalation ist offen ({referens}). Die Antwort abwarten und dokumentieren, bevor der Vorgang abgeschlossen wird.",
|
||||
|
||||
|
||||
// ---- Abschlussfeststellung (ALVA-RULE-200) ------------------------------
|
||||
|
||||
@@ -81,6 +81,8 @@ export const EN = {
|
||||
"grind.arendetyp.krav": "Requirement for this case type: {krav}",
|
||||
"grind.sakerhet": "Confidence level within what the evidence supports",
|
||||
"grind.sakerhet.detalj": "The stated confidence ({niva}) exceeds what the evidence supports ({tak}). Add supporting evidence, or lower the confidence — honest uncertainty is information.",
|
||||
"grind.eskalering": "Technical escalations answered",
|
||||
"grind.eskalering.detalj": "An escalation is open ({referens}). Await the answer and document it before the case is closed.",
|
||||
|
||||
|
||||
// ---- The closing statement (ALVA-RULE-200) ------------------------------
|
||||
|
||||
@@ -53,6 +53,8 @@ export const ES = {
|
||||
"grind.arendetyp.krav": "Requisito para este tipo de expediente: {krav}",
|
||||
"grind.sakerhet": "Nivel de confianza dentro de lo que sustenta la evidencia",
|
||||
"grind.sakerhet.detalj": "La confianza indicada ({niva}) supera lo que sustenta la evidencia ({tak}). Añadir evidencia que la sustente, o bajar el nivel — la incertidumbre honesta es información.",
|
||||
"grind.eskalering": "Escalaciones técnicas respondidas",
|
||||
"grind.eskalering.detalj": "Hay una escalación abierta ({referens}). Esperar la respuesta y documentarla antes de cerrar el expediente.",
|
||||
|
||||
|
||||
// ---- La conclusión (ALVA-RULE-200) --------------------------------------
|
||||
|
||||
@@ -54,6 +54,8 @@ export const FR = {
|
||||
"grind.arendetyp.krav": "Exigence pour ce type de dossier : {krav}",
|
||||
"grind.sakerhet": "Niveau de confiance dans les limites de ce que les preuves soutiennent",
|
||||
"grind.sakerhet.detalj": "La confiance indiquée ({niva}) dépasse ce que les preuves soutiennent ({tak}). Compléter les preuves, ou abaisser le niveau — une incertitude honnête est une information.",
|
||||
"grind.eskalering": "Escalades techniques traitées",
|
||||
"grind.eskalering.detalj": "Une escalade est ouverte ({referens}). Attendre la réponse et la documenter avant de clôturer le dossier.",
|
||||
|
||||
|
||||
// ---- La conclusion (ALVA-RULE-200) --------------------------------------
|
||||
|
||||
@@ -53,6 +53,8 @@ export const IT = {
|
||||
"grind.arendetyp.krav": "Requisito per questo tipo di pratica: {krav}",
|
||||
"grind.sakerhet": "Livello di confidenza entro quanto sostiene l’evidenza",
|
||||
"grind.sakerhet.detalj": "La confidenza indicata ({niva}) supera quanto sostiene l’evidenza ({tak}). Integrare l’evidenza, oppure abbassare il livello — l’incertezza onesta è informazione.",
|
||||
"grind.eskalering": "Escalation tecniche risolte",
|
||||
"grind.eskalering.detalj": "Un’escalation è aperta ({referens}). Attendere la risposta e documentarla prima di chiudere la pratica.",
|
||||
|
||||
|
||||
// ---- La conclusione (ALVA-RULE-200) -------------------------------------
|
||||
|
||||
@@ -53,6 +53,8 @@ export const NL = {
|
||||
"grind.arendetyp.krav": "Eis voor dit zaaktype: {krav}",
|
||||
"grind.sakerhet": "Betrouwbaarheidsniveau binnen wat het bewijs draagt",
|
||||
"grind.sakerhet.detalj": "De opgegeven betrouwbaarheid ({niva}) overstijgt wat het bewijs draagt ({tak}). Het bewijs aanvullen, of het niveau verlagen — eerlijke onzekerheid is informatie.",
|
||||
"grind.eskalering": "Technische escalaties beantwoord",
|
||||
"grind.eskalering.detalj": "Er staat een escalatie open ({referens}). Wacht het antwoord af en documenteer het voordat de zaak wordt afgesloten.",
|
||||
|
||||
|
||||
// ---- De eindconclusie (ALVA-RULE-200) -----------------------------------
|
||||
|
||||
@@ -55,6 +55,8 @@ export const PL = {
|
||||
"grind.arendetyp.krav": "Wymóg dla tego rodzaju sprawy: {krav}",
|
||||
"grind.sakerhet": "Poziom pewności w granicach tego, co potwierdzają dowody",
|
||||
"grind.sakerhet.detalj": "Podany poziom pewności ({niva}) przekracza to, co potwierdzają dowody ({tak}). Uzupełnić dowody lub obniżyć poziom — uczciwa niepewność to informacja.",
|
||||
"grind.eskalering": "Eskalacje techniczne z odpowiedzią",
|
||||
"grind.eskalering.detalj": "Eskalacja jest otwarta ({referens}). Poczekać na odpowiedź i udokumentować ją przed zamknięciem sprawy.",
|
||||
|
||||
|
||||
// ---- Wniosek końcowy (ALVA-RULE-200) ------------------------------------
|
||||
|
||||
@@ -53,6 +53,8 @@ export const PT = {
|
||||
"grind.arendetyp.krav": "Requisito para este tipo de processo: {krav}",
|
||||
"grind.sakerhet": "Nível de confiança dentro do que a evidência sustenta",
|
||||
"grind.sakerhet.detalj": "A confiança indicada ({niva}) excede o que a evidência sustenta ({tak}). Completar a evidência, ou baixar o nível — a incerteza honesta é informação.",
|
||||
"grind.eskalering": "Escalonamentos técnicos respondidos",
|
||||
"grind.eskalering.detalj": "Há um escalonamento em aberto ({referens}). Aguardar a resposta e documentá-la antes de encerrar o processo.",
|
||||
|
||||
|
||||
// ---- A conclusão (ALVA-RULE-200) ----------------------------------------
|
||||
|
||||
@@ -59,6 +59,8 @@ export const RO = {
|
||||
"grind.arendetyp.krav": "Cerință pentru acest tip de caz: {krav}",
|
||||
"grind.sakerhet": "Nivel de încredere în limitele a ceea ce susțin dovezile",
|
||||
"grind.sakerhet.detalj": "Încrederea indicată ({niva}) depășește ceea ce susțin dovezile ({tak}). Completează dovezile sau coboară nivelul — incertitudinea onestă este informație.",
|
||||
"grind.eskalering": "Escaladări tehnice cu răspuns",
|
||||
"grind.eskalering.detalj": "O escaladare este deschisă ({referens}). Așteaptă răspunsul și documentează-l înainte de închiderea cazului.",
|
||||
|
||||
|
||||
// ---- Concluzia finală (ALVA-RULE-200) -----------------------------------
|
||||
|
||||
@@ -52,6 +52,8 @@ export const SV = {
|
||||
"grind.arendetyp.krav": "Krav för ärendetypen: {krav}",
|
||||
"grind.sakerhet": "Konfidensnivån inom vad underlaget bär",
|
||||
"grind.sakerhet.detalj": "Angiven konfidens ({niva}) överstiger vad underlaget bär ({tak}). Komplettera underlaget, eller sänk nivån — ärlig osäkerhet är information.",
|
||||
"grind.eskalering": "Tekniska eskaleringar besvarade",
|
||||
"grind.eskalering.detalj": "En eskalering är öppen ({referens}). Invänta svaret och dokumentera det innan ärendet avslutas.",
|
||||
|
||||
|
||||
// ---- Slutsatsen (ALVA-RULE-200) -----------------------------------------
|
||||
|
||||
@@ -21,6 +21,20 @@
|
||||
// TÜV-härdningen ändrade vad loggen garanterar.
|
||||
|
||||
export const UTGAVOR = [
|
||||
{
|
||||
version: "3.6",
|
||||
datum: "2026-08-06",
|
||||
commit: "4dea6d2",
|
||||
rubrik: "Betalarspåret: beviskraven följer den som betalar",
|
||||
andringar: [
|
||||
"FGS-1.0 (garantistandarden) inarbetad: betalaren är en händelse i loggen — spår, namn, claim-/skadereferens och godkännande — och grinden kräver den för de ärendetyper där någon annan än kunden betalar. Tre nya ärendetyper: vagnskadegaranti, förlängd garanti och leasing/fleet, med egna regelpaketskrav.",
|
||||
"Eskaleringsspärren (DISS-mönstret): en öppnad teknisk förfrågan till tillverkare eller garantigivare utan dokumenterat svar spärrar avslutet, matchad per referens. Bulletinernas \"invänta svar\" är nu en grindregel, inte ett råd.",
|
||||
"Ett verkligt fynd på vägen: serverns ärendetypskrav var en tyst no-op — servern matade in den distribuerade paketformen i en funktion som bara läste den slimmade, så garanti- och försäkringskraven fanns bara som råd i klienten. C-2-mönstret, återuppstånden genom ett format. Grinden läser nu båda formerna, med regressionstest.",
|
||||
"Claim- och skadenummer kan komma ur den registrerade betalaren, inte bara ur skannad arbetsorder. Goodwill och externa garantigivare kräver dokumenterat godkännande före avslut.",
|
||||
"Reservdelshändelsen: artikelnummer, serienummer, batch och markering att den demonterade delen sparas i väntan på garantibeslut. Betalare, eskalering och reservdel är interna i delningsfiltret — kunden ser åtgärden, inte förhandlingen.",
|
||||
"Kartläggningen av hela FGS-1.0 mot plattformen bokförd i ALVA-DOC-0011, med ärlig gräns: ODIS/DISS/SAGA2 är tillverkarsystem — ALVA bär bevispaketet och eskaleringsspåret, den ersätter dem inte.",
|
||||
],
|
||||
},
|
||||
{
|
||||
version: "3.5",
|
||||
datum: "2026-08-06",
|
||||
|
||||
Reference in New Issue
Block a user