/* ── Anamneza (Chestionarul Bunatatii Personale) ────────────────────────────── Sectiune SEPARATA de Credinte (decizie Marian 24.07). Tot continutul metodologic vine din window.ANAMNEZA (generat din Excelul lui Petre) - NIMIC hardcodat aici. Scoringul = window.AnamnezaScoring (port 1:1 al sheet-ului MOTOR, golden-testat). Fisier autonom fata de app.jsx: nu foloseste functii/constante de acolo. */ const IcAnamneza = (p) => ( ); window.IcAnamneza = IcAnamneza; /* data locala ISO (autonom; identic cu fmtISO din app.jsx) */ function anmISO(d) { const p = (n) => String(n).padStart(2, "0"); return d.getFullYear() + "-" + p(d.getMonth() + 1) + "-" + p(d.getDate()); } /* ── acces la raspunsuri in store.anamneza[credinta][m] ── */ function anmRasp(store, cred, m) { return (store.anamneza && store.anamneza[cred] && store.anamneza[cred][m]) || {}; } function anmSetRasp(set, cred, m, gind, scor) { set((s) => { const an = { ...(s.anamneza || {}) }; const c = { ...(an[cred] || {}) }; const rasp = { ...(c[m] || {}) }; rasp[gind] = scor; c[m] = rasp; /* data completarii: fixata la prima atingere a totalului (50 la B, 150 la formatul A) */ const banca = window.ANAMNEZA.credinte[cred]; const n = banca.itemi.filter((it) => rasp[it.gind] >= 1 && rasp[it.gind] <= 6).length; if (n === banca.itemi.length && !c[m + "_data"]) c[m + "_data"] = anmISO(new Date()); an[cred] = c; return { ...s, anamneza: an }; }); } function anmProgres(banca, rasp) { return banca.itemi.filter((it) => rasp[it.gind] >= 1 && rasp[it.gind] <= 6).length; } /* exportul anamnezei pentru consultant: raspunsuri + rezultate calculate la momentul exportului. SELF-CONTAINED (analizabil fara Excel/banca, inclusiv de un LLM): fiecare masurare completa include per item aria, indicatorul, scala aleasa si TEXTUL afirmatiei alese. Apelat de exportStore din app.jsx (montaj T8); rezultatele NU se persista - se recalculeaza. */ function anamnezaExport(store) { const S = window.AnamnezaScoring; const rezultate = {}; const detaliuItemi = (banca, raw) => banca.itemi.map((it) => { const scor = raw[it.gind]; const a = scor >= 1 && scor <= 6 ? it.afirmatii.find((x) => x.scor === scor) : null; return { gind: it.gind, aria: banca.arii[it.aria - 1].nume, indicator: it.indicator, scor: scor || null, scala: scor ? banca.scale[scor - 1].nume : null, alegere: a ? (a.textRaw || a.text) : null, }; }); Object.keys(window.ANAMNEZA.credinte).forEach((cred) => { const banca = window.ANAMNEZA.credinte[cred]; const raw1 = anmRasp(store, cred, "p1"); const raw2 = anmRasp(store, cred, "p2"); /* credintele cu motor "profiluri" (Recunostinta, Smerenia) NU trec prin motorul Bunatatii - export prin scoringul propriu (montaj 001, coord 24.07) */ if (banca.motor === "profiluri" && window.AnamnezaPlus) { const fa = (raw, dataM) => { const n = banca.itemi.filter((it) => raw[it.gind] >= 1 && raw[it.gind] <= 6).length; if (n !== banca.itemi.length) return null; return { ...window.AnamnezaPlus.rezultatExport(banca, raw), data: dataM || null, itemi: detaliuItemi(banca, raw) }; }; const anP = (store.anamneza || {})[cred] || {}; rezultate[cred] = { _instrument: banca.titlu, _sursa: banca.sursa || null, p1: fa(raw1, anP.p1_data), p2: fa(raw2, anP.p2_data), comparatie: null, }; return; } const r1 = S.evalueaza(banca, raw1); const r2 = S.evalueaza(banca, raw2); const imbraca = (r, raw, dataM) => ({ ...r, stadiuNume: r.stadiuGlobal ? banca.scale[r.stadiuGlobal - 1].stadiu : null, verdict: S.verdict(banca, r), data: dataM || null, itemi: detaliuItemi(banca, raw), }); const an = (store.anamneza || {})[cred] || {}; rezultate[cred] = { _instrument: banca.titlu, _sursa: banca.sursa || null, p1: r1.nCompletate === 50 ? imbraca(r1, raw1, an.p1_data) : null, p2: r2.nCompletate === 50 ? imbraca(r2, raw2, an.p2_data) : null, comparatie: r1.nCompletate === 50 && r2.nCompletate === 50 ? S.comparatie(banca, r1, r2, raw1, raw2) : null, }; }); return { anamneza: store.anamneza || {}, anamneza_rezultate: rezultate }; } window.anamnezaExport = anamnezaExport; /* itemul dupa gind + textul brut al afirmatiei alese (pt. alerte) */ function anmItem(banca, gind) { return banca.itemi[gind - 1]; } function anmTextAles(banca, rasp, gind) { const it = anmItem(banca, gind); const a = it.afirmatii.find((x) => x.scor === rasp[gind]); return a ? a.textRaw : ""; } /* eticheta "ARIA 0X · nume · n/total" - totalul ariei vine din banca (5 la B, 15 la A) */ function anmAriaHead(banca, ariaIdx, rasp) { const aiAriei = banca.itemi.filter((it) => it.aria === ariaIdx); const n = aiAriei.filter((it) => rasp[it.gind] >= 1).length; return { text: "ARIA " + String(ariaIdx).padStart(2, "0") + " · " + banca.arii[ariaIdx - 1].nume, progres: n + " / " + aiAriei.length + (n === aiAriei.length ? " ✓" : "") }; } /* lista canonica a credintelor: window.PRP_CREDINTE din data.js (sursa unica, ordinea lui Petre); fallback defensiv doar pe bancile existente daca data.js lipseste */ function anmToateCredintele() { if (window.PRP_CREDINTE) return window.PRP_CREDINTE; return Object.keys(window.ANAMNEZA.credinte).map((slug) => ({ slug, nume: slug, titlu: slug })); } /* ── sub-ecrane: credinta | chestionar-p1|p2 | rezultat-p1|p2 | comparatie | dashboard ── */ const ANM_ECRANE = ["credinta", "chestionar-p1", "chestionar-p2", "rezultat-p1", "rezultat-p2", "comparatie", "dashboard"]; /* credinta implicita la intrare: prima cu banca de chestionar sosita */ function anmCredImplicita() { const cuBanca = anmToateCredintele().find((c) => window.ANAMNEZA.credinte[c.slug]); return cuBanca ? cuBanca.slug : anmToateCredintele()[0].slug; } /* restaurarea sub-ecranului din hash (#anamneza//) - la refresh sau deep-link */ function anmNavDinHash() { const m = (location.hash || "").match(/^#anamneza\/([a-z-]+)(?:\/([a-z0-9-]+))?$/); if (!m || !anmToateCredintele().some((c) => c.slug === m[1])) return null; const ecran = m[2] && ANM_ECRANE.includes(m[2]) && window.ANAMNEZA.credinte[m[1]] ? m[2] : "credinta"; return { ecran, cred: m[1] }; } /* meniul orizontal cu toate credintele - identic ca forma cu CredinteTabs din sectiunea Credinte (aceleasi clase .cred-tabs/.cred-tab); "lucru" = chestionarul credintei nu a sosit inca */ function AnmTabs({ nav, setNav }) { return (
{anmToateCredintele().map((c) => { const are = !!window.ANAMNEZA.credinte[c.slug]; return ( ); })}
); } /* in interiorul unei credinte, meniul de sus devine meniul SECTIUNILOR ei (cerinta Marian 24.07): aceeasi bara vizuala, dar cu cele 6 sectiuni; gating-ul ramane (title explica de ce e blocata) */ function AnmSectiuniTabs({ banca, cred, nav, setNav, store }) { const n1 = anmProgres(banca, anmRasp(store, cred, "p1")); const n2 = anmProgres(banca, anmRasp(store, cred, "p2")); const nT = banca.itemi.length; const c = anmToateCredintele().find((x) => x.slug === cred) || {}; const sectiuni = [ { ecran: "chestionar-p1", nume: "Chestionar P1", blocat: false }, { ecran: "chestionar-p2", nume: "Chestionar P2", blocat: false }, { ecran: "rezultat-p1", nume: "Rezultat P1", blocat: n1 < nT, deCe: "Se activează la P1 complet (" + n1 + " / " + nT + ")" }, { ecran: "rezultat-p2", nume: "Rezultat P2", blocat: n2 < nT, deCe: "Se activează la P2 complet (" + n2 + " / " + nT + ")" }, { ecran: "comparatie", nume: "Comparație", blocat: n1 < nT || n2 < nT, deCe: "Cere ambele măsurări complete" }, { ecran: "dashboard", nume: "Dashboard", blocat: n1 < nT && n2 < nT, deCe: "Cere cel puțin o măsurare completă" }, ]; return (
{sectiuni.map((s) => ( ))}
); } function AnamnezaView({ store, set }) { const [nav, setNavRaw] = React.useState(() => anmNavDinHash() || { ecran: "credinta", cred: anmCredImplicita() }); /* sub-navigarea intra in istoricul browserului, aliniat cu restul instrumentului: Back din chestionar -> credinta -> restul aplicatiei. Starea anmNav merge in history.state; App-ul isi pastreaza view="anamneza" in acelasi state. */ const setNav = (n) => { setNavRaw(n); try { const hash = "#anamneza/" + n.cred + (n.ecran !== "credinta" ? "/" + n.ecran : ""); history.pushState({ view: "anamneza", credinta: store.credinta, anmNav: n }, "", hash); } catch (e) { /* file:// restrictiv - navigarea ramane in state local */ } }; React.useEffect(() => { const onPop = (e) => { if (e.state && e.state.anmNav) setNavRaw(e.state.anmNav); else if (e.state && e.state.view === "anamneza") setNavRaw({ ecran: "credinta", cred: anmCredImplicita() }); /* alt view: App-ul comuta ecranul si componenta se demonteaza */ }; window.addEventListener("popstate", onPop); return () => window.removeEventListener("popstate", onPop); }, []); const ecran = nav.ecran; const cred = nav.cred; const banca = cred ? window.ANAMNEZA.credinte[cred] : null; const laCredinta = () => setNav({ ecran: "credinta", cred }); let continut; if (!banca) { /* chestionarul credintei nu a sosit inca de la Petre - empty in limbajul sectiunii Credinte */ const c = anmToateCredintele().find((x) => x.slug === cred) || {}; continut = (
Chestionarul este în pregătire la Dr. Petre
Chestionarul pentru {c.titlu || "această credință"} se activează imediat ce sosește de la Dr. Petre - pe modelul Bunătății: 50 de indicatori, câte șase afirmații fiecare, rezultat pe axa Răutate / Bunătate.
); } else if (ecran === "chestionar-p1" || ecran === "chestionar-p2") { const m = ecran.endsWith("p1") ? "p1" : "p2"; continut = setNav({ ecran: "rezultat-" + m, cred })} />; } else if (ecran === "rezultat-p1" || ecran === "rezultat-p2") { const m = ecran.endsWith("p1") ? "p1" : "p2"; /* credintele cu motor "profiluri" au raportul propriu (doc 4) - Bunatatea ramane pe AnmRezultat */ const RezultatEcran = banca.motor === "profiluri" && window.AnamnezaPlus ? window.AnamnezaPlus.Rezultat : AnmRezultat; continut = setNav({ ecran: "chestionar-" + m, cred })} />; } else if (ecran === "comparatie") { continut = banca.motor === "profiluri" && window.AnamnezaPlus ? : ; } else if (ecran === "dashboard") { continut = banca.motor === "profiluri" && window.AnamnezaPlus ? : ; } else { continut = ; } /* bara de sus e contextuala: la nivel de credinte = taburile credintelor; in interiorul unei credinte (sub-ecrane) = meniul sectiunilor ei */ const inSectiune = banca && ecran !== "credinta"; return (
{inSectiune ? : } {continut}
); } window.AnamnezaView = AnamnezaView; /* ── hub-ul unei credinte populate: progrese + cele 6 actiuni (navigarea intre credinte = taburile) ── */ function AnmCredintaHub({ banca, cred, store, setNav }) { const n1 = anmProgres(banca, anmRasp(store, cred, "p1")); const n2 = anmProgres(banca, anmRasp(store, cred, "p2")); const nT = banca.itemi.length; const pct1 = Math.round((n1 / nT) * 100), pct2 = Math.round((n2 / nT) * 100); const go = (ecran) => () => setNav({ ecran, cred }); return (

{banca.titlu}

P1 · start
{n1} / {nT}
P2 · 12 luni
{n2} / {nT}

{banca.texte.ghidCum}

{banca.texte.ghidInstructiune}

    {banca.texte.ghidPasi.map((p, i) =>
  • {p}
  • )}

{banca.texte.footer}

); } /* rand auxiliar sub bara de sectiuni (ex. selectorul P1/P2 din dashboard); intoarcerea la credinta traieste in bara de sectiuni, nu aici */ function AnmRand({ extra }) { if (!extra) return null; return (
{extra}
); } /* ── chestionarul P1 / P2 ── */ function AnmChestionar({ banca, cred, m, store, set, onInapoi, spreRezultat }) { const rasp = anmRasp(store, cred, m); const n = anmProgres(banca, rasp); const nT = banca.itemi.length; const titlu = m === "p1" ? banca.texte.chestTitluP1 : banca.texte.chestTitluP2; const instr = m === "p1" ? banca.texte.chestInstr : banca.texte.chestInstrP2; return (

{titlu}

{n} / {nT}

{instr}

{banca.arii.map((aria) => { const head = anmAriaHead(banca, aria.idx, rasp); return (
{head.text} {head.progres}
{banca.itemi.filter((it) => it.aria === aria.idx).map((it) => (

{it.indicator}

{it.nucleu}

{it.afirmatii.map((a) => ( ))}
))}
); })}
{n < nT ?

Progres: {n} / {nT}. Raportul se activează la completarea integrală.

: }
); } /* ── gating comun: raport cerut sub 50/50 ── */ function AnmGate({ n, onInapoi, spreChestionar }) { return (
Raportul se activează la completarea integrală a chestionarului.

Progres curent: {n} / 50.

{spreChestionar && }
); } /* ── axa Rautate -> Prag zero -> Bunatate (refolosita in raport si dashboard) ── */ function AnmAxa({ banca, stadiu, prefix }) { const nume = stadiu ? banca.scale[stadiu - 1].stadiu : ""; return (

{prefix}{stadiu ? stadiu + " / 6 · " + nume : ""}

{banca.scale.map((sc) => (
{stadiu === sc.num && {"▼"}}
{banca.texte.axaEtichete[sc.num - 1]}
))}
); } /* ── grafice SVG proprii (zero librarii; culorile scalelor vin din date) ── */ function anmPolar(cx, cy, r, deg) { const rad = (deg * Math.PI) / 180; return [cx + r * Math.cos(rad), cy - r * Math.sin(rad)]; } /* radar pe cele 10 arii; a = seria principala (navy), b = optional (gold) */ function AnmRadar({ banca, a, b, max }) { const M = max || 30, cx = 150, cy = 132, R = 96; const pct = (v) => Math.max(0.04, Math.min(1, v / M)); const punct = (i, v) => anmPolar(cx, cy, R * pct(v), 90 - i * 36); const poly = (serie) => serie.map((v, i) => punct(i, v).map((x) => x.toFixed(1)).join(",")).join(" "); const grid = [10, 20, 30].map((g) => Array.from({ length: 10 }, (_, i) => punct(i, g).map((x) => x.toFixed(1)).join(",")).join(" ")); return ( {grid.map((p, k) => ( ))} {Array.from({ length: 10 }, (_, i) => { const [x, y] = punct(i, M); return ; })} {b && } {Array.from({ length: 10 }, (_, i) => { const [x, y] = anmPolar(cx, cy, R + 15, 90 - i * 36); return ( A{i + 1} ); })} ); } /* bare orizontale; rows = [{label, a, b?, culoare?}]; b apare ca bara secundara (gold) */ function AnmBars({ rows, max, sufix }) { const M = Math.max(max || 0, ...rows.map((r) => Math.max(r.a, r.b || 0)), 1); const are2 = rows.some((r) => typeof r.b === "number"); const H = rows.length * (are2 ? 34 : 24) + 6; return ( {rows.map((r, i) => { const y = i * (are2 ? 34 : 24) + 4; const w = (v) => Math.max(2, (v / M) * 180); return ( {r.label} {r.a}{sufix || ""} {are2 && typeof r.b === "number" && ( {r.b}{sufix || ""} )} ); })} ); } /* vitezometrul bunatatii: semicerc din 6 sectoare (culorile scalelor) + ac pe stadiu */ function AnmGauge({ banca, stadiu }) { const cx = 150, cy = 140, R = 104; const arc = (from, to) => { const [x1, y1] = anmPolar(cx, cy, R, from); const [x2, y2] = anmPolar(cx, cy, R, to); return "M " + x1.toFixed(1) + " " + y1.toFixed(1) + " A " + R + " " + R + " 0 0 1 " + x2.toFixed(1) + " " + y2.toFixed(1); }; const acDeg = 180 - (stadiu - 0.5) * 30; const [ax, ay] = anmPolar(cx, cy, R - 26, acDeg); return ( {banca.scale.map((sc) => ( ))} {[1, 2, 3, 4, 5, 6].map((n) => { const [tx, ty] = anmPolar(cx, cy, R + 17, 180 - (n - 0.5) * 30); return {n}; })} {stadiu} / 6 ); } /* ── raportul P1 / P2: sectiunile A-E din Excel + certificatul ── */ function AnmRezultat({ banca, cred, m, store, onInapoi, spreChestionar }) { const rasp = anmRasp(store, cred, m); const n = anmProgres(banca, rasp); if (n < 50) return ; const S = window.AnamnezaScoring; const rez = S.evalueaza(banca, rasp); const verdictTxt = S.verdict(banca, rez); const t = banca.texte; const titlu = m === "p1" ? t.raportTitluP1 : t.raportTitluP2; const dataM = (store.anamneza[cred] || {})[m + "_data"] || ""; const nume = (store.consola && store.consola.nume || "").trim(); const stadiuNume = banca.scale[rez.stadiuGlobal - 1].stadiu; const maxScor = Math.max(...rez.scorArii); const minScor = Math.min(...rez.scorArii); const ariaMax = banca.arii[rez.scorArii.indexOf(maxScor)]; const ariaMin = banca.arii[rez.scorArii.indexOf(minScor)]; const alerteDef = [ { titlu: t.alerteTitluri[0], ginduri: rez.alerte.cruzime, nr: rez.nCru }, { titlu: t.alerteTitluri[1], ginduri: rez.alerte.malitiozitate, nr: rez.nMal }, { titlu: t.alerteTitluri[2], ginduri: rez.alerte.rautate, nr: rez.nRau }, ]; const decMatrici = [ banca.decodificare.stadiu, banca.decodificare.cauze, banca.decodificare.programe, banca.decodificare.impactPersonal, banca.decodificare.impactJur, banca.decodificare.directii, ]; return (

{titlu}

Participant: {nume} {dataM && · Data: {dataM}}

{/* A. rezultat global */}

{t.sectA}

{t.lblScorGlobal}{rez.total} / 300
{t.lblMedia}{rez.media.toFixed(2)}
{t.lblStadiu}{stadiuNume}
= 5 ? "pozitiv" : "negativ")}> {t.lblVerdict}. {verdictTxt}

{t.lblDistrib}

{banca.scale.map((sc) => ( {sc.nume}: {rez.distributie[sc.num]} ))}
{/* B. harta celor 10 arii */}

{t.sectB}

{banca.arii.map((a, i) => ( ))}
AriaScor / 30Stadiu
{a.nume} {rez.scorArii[i]} / 30 {rez.stadiiArii[i] ? banca.scale[rez.stadiiArii[i] - 1].stadiu : ""}
{t.steaTop}{ariaMax.nume} {maxScor} / 30
{t.steagPrior}{ariaMin.nume} {minScor} / 30
{/* C. alerte comportamentale */}

{t.sectC}

{alerteDef.map((al, k) => (

{al.titlu}{al.nr} selecții)

{al.ginduri.length === 0 ?

nicio selecție

: al.ginduri.map((gind) => { const it = anmItem(banca, gind); return (
{banca.arii[it.aria - 1].nume} · Ind. {it.ind} {anmTextAles(banca, rasp, gind)}
); })}
))}
{/* D. resurse dezvoltate */}

{t.sectD}

{t.resurse.map((rr, i) => (
{rr}{rez.distributie[4 + i]} indicatori
))}
{/* E. decodificarea stadiului dominant */}

{t.sectE}

STADIUL: {stadiuNume} · {banca.scale[rez.stadiuGlobal - 1].zona}

{banca.decodificare.definitie[rez.stadiuGlobal - 1]}

{t.decTitluri.map((dt, i) => (

{dt}

    {decMatrici[i][rez.stadiuGlobal - 1].map((b, j) =>
  • {b}
  • )}
))}
{/* certificatul de profil personal */}

{t.certificat.titlu}

{t.certificat.sub}

{nume}

{t.certificat.parcurs}

{t.certificat.lblStadiu}

{banca.scale[rez.stadiuGlobal - 1].nume}

{banca.decodificare.programe[rez.stadiuGlobal - 1][0]}

{t.certificat.dataPrefix}{dataM}

{t.certificat.footer}

); } /* semnal compact pentru delte numerice */ function anmDelta(d) { if (d > 0) return "▲ +" + d; if (d < 0) return "▼ " + d; return "= 0"; } function AnmComparatie({ banca, cred, store, onInapoi }) { const S = window.AnamnezaScoring; const t = banca.texte; const raw1 = anmRasp(store, cred, "p1"); const raw2 = anmRasp(store, cred, "p2"); const n1 = anmProgres(banca, raw1), n2 = anmProgres(banca, raw2); if (n1 < 50 || n2 < 50) return ; const r1 = S.evalueaza(banca, raw1); const r2 = S.evalueaza(banca, raw2); const c = S.comparatie(banca, r1, r2, raw1, raw2); const an = store.anamneza[cred] || {}; const nume = (store.consola && store.consola.nume || "").trim(); const st = (x) => banca.scale[x - 1].stadiu; /* semnalele metodologice = textele EXACTE ale lui Petre (formulele F9/F13, extrase in banca) */ const semnalPol = r1.stadiuGlobal >= 5 ? (r2.stadiuGlobal >= 5 ? t.compSemnalPol[0] : t.compSemnalPol[1]) : (r2.stadiuGlobal >= 5 ? t.compSemnalPol[2] : t.compSemnalPol[3]); const semnalVeto = r1.vetoActiv && !r2.vetoActiv ? t.compSemnalVeto[0] : !r1.vetoActiv && r2.vetoActiv ? t.compSemnalVeto[1] : r1.vetoActiv ? t.compSemnalVeto[2] : t.compSemnalVeto[3]; /* B14: semnalul de idealizare, in toate cele 4 variante ale lui */ const I = t.compIdealizare; const idealTxt = r1.idealizat && r2.idealizat ? I.ambele[0] + r1.nMax + I.ambele[1] + r2.nMax + I.ambele[2] : r2.idealizat ? I.doarP2[0] + r2.nMax + I.doarP2[1] : r1.idealizat ? I.doarP1[0] : I.fara[0]; const idealPozitiv = !r1.idealizat && !r2.idealizat; const randuriA = [ { lbl: t.compRanduriA[0], p1: r1.stadiuGlobal, p2: r2.stadiuGlobal, d: anmDelta(c.deltaStadiu) }, { lbl: t.compRanduriA[1], p1: st(r1.stadiuGlobal), p2: st(r2.stadiuGlobal), d: semnalPol }, { lbl: t.compRanduriA[2], p1: r1.total, p2: r2.total, d: anmDelta(c.deltaTotal) }, { lbl: t.compRanduriA[3], p1: Math.round(r1.pctBunatateReala * 100) + "%", p2: Math.round(r2.pctBunatateReala * 100) + "%", d: anmDelta(Math.round(c.deltaPct * 100)) + " pp" }, { lbl: t.compRanduriA[4], p1: r1.nNeg, p2: r2.nNeg, d: anmDelta(c.deltaNeg) }, { lbl: t.compRanduriA[5], p1: r1.vetoActiv ? "DA" : "NU", p2: r2.vetoActiv ? "DA" : "NU", d: semnalVeto }, ]; return (

{t.compTitlu}

Participant: {nume} · P1: {an.p1_data || ""} · P2: {an.p2_data || ""}

{/* A. verdict comparativ */}

{t.compA}

{randuriA.map((r, i) => ( ))}
Indicator de sintezăP1 · start P2 · 12 luniSemnal
{r.lbl}{r.p1} {r.p2}{r.d}
{idealTxt}

{t.compSinteza}

{c.deltaStadiu === 0 ? "Stadiul dominant a rămas " + st(r1.stadiuGlobal) + "." : "Stadiul dominant s-a mutat de la " + st(r1.stadiuGlobal) + " la " + st(r2.stadiuGlobal) + "."}

{/* B. migrarea celor 50 de alegeri pe scale */}

{t.compB}

({ label: sc.nume, a: c.migrareScale[i].p1, b: c.migrareScale[i].p2, culoare: sc.culoare, }))} max={50} />

bară colorată = P1 · bară aurie = P2

{/* C. harta ariilor comparativ */}

{t.compC}

{banca.arii.map((a, i) => { const ca = c.arii[i]; const semn = ca.stadiu2 > ca.stadiu1 ? "▲ salt de stadiu" : ca.stadiu2 < ca.stadiu1 ? "▼ regres de stadiu" : "= stadiu stabil"; return ( ); })}
AriaScor P1Scor P2 ΔSemnal
{a.nume}{ca.scor1} / 30 {ca.scor2} / 30 {anmDelta(ca.scor2 - ca.scor1)} {semn}

navy = P1 · auriu = P2

{/* D. miscarea celor 50 de indicatori */}

{t.compD}

{t.compMisc[0]}{c.indicatori.progres}
{t.compMisc[1]}{c.indicatori.stationari}
{t.compMisc[2]}{c.indicatori.regres}
{t.compMisc[3]}{c.indicatori.ramasiNegativ}
{t.compMisc[4]}{Math.round(c.indicatori.rataProgres * 100)}%
); } function AnmDashboard({ banca, cred, store, onInapoi }) { const S = window.AnamnezaScoring; const t = banca.texte; const raw1 = anmRasp(store, cred, "p1"); const raw2 = anmRasp(store, cred, "p2"); const n1 = anmProgres(banca, raw1), n2 = anmProgres(banca, raw2); const [sel, setSel] = React.useState(n2 === 50 ? "p2" : "p1"); if (n1 < 50 && n2 < 50) return ; const raw = sel === "p1" ? raw1 : raw2; const nSel = sel === "p1" ? n1 : n2; const rez = nSel === 50 ? S.evalueaza(banca, raw) : null; return (
} />

{t.dashTitlu}

{t.dashSelector} {sel.toUpperCase()}

{!rez ? (
Măsurarea {sel.toUpperCase()} nu e completă.

Progres: {nSel} / 50.

) : (
{t.dashStadiu} {banca.scale[rez.stadiuGlobal - 1].stadiu}
{t.dashScor} {rez.total} / 300 {" "}bunătate reală {Math.round(rez.pctBunatateReala * 100)}%
= 5 ? "pozitiv" : "negativ")}> {S.verdict(banca, rez)}

{t.dashVitezPrefix}{rez.stadiuGlobal} / 6

{t.dashTop}

    {rez.topArii.map((idx) => (
  1. {banca.arii[idx - 1].nume} {rez.scorArii[idx - 1]} / 30
  2. ))}

{t.dashPrior}

    {rez.bottomArii.map((idx) => (
  1. {banca.arii[idx - 1].nume} {rez.scorArii[idx - 1]} / 30
  2. ))}

Profil pe cele 10 arii (scor / 30)

Distribuția celor 50 de alegeri pe cele 6 scale

({ label: sc.nume, a: rez.distributie[sc.num], culoare: sc.culoare, }))} max={50} />
)}
); }