Die Probezeit hat einen Inhalt -- und man sieht, wer was gesehen hat
Filipe: "wie talente bewertet werden, aufgaben bekommen, analysiert werden von vanvan und mir, alles moegliche, wie gesagt ich will hoch profissionel arbeiten." WAS GEMESSEN FEHLTE Die Stufe "Probe" hatte eine Frist von 30 Tagen, einen Buddy, ein Datum -- und einen Satz: "Nach 30 Tagen: uebernehmen oder sauber beenden." Worauf diese Entscheidung sich gruenden soll, stand nirgends. Eine Probezeit ohne Inhalt ist keine Probe, sondern eine Wartezeit; am dreissigsten Tag entscheidet dann das Bauchgefuehl dessen, der zuletzt etwas gesehen hat. Und: `von_id` stand seit dem Bau in talent_merkmal und wurde nie ausgeliefert. Man sah, DASS ein Merkmal gesetzt ist -- nicht, von wem. Bei zwei Leuten, die unabhaengig beobachten, ist genau das die Auskunft. DER PROBEPLAN Zwoelf Schritte in drei Phasen: mitlaufen -> selbst machen -> allein. Die Reihenfolge ist der Punkt (Discord empfiehlt sie so, in der Ausbildung heisst sie "see one, do one"). Wer die mittlere Stufe ueberspringt, hat am Tag 30 zwei Sorten Kandidaten, die man nicht unterscheiden kann. JEDER SCHRITT HAT EINEN ZUSTAENDIGEN -- sechs das Talent, drei der Buddy, drei die Leitung. Ohne diese Angabe wandern in jeder Probezeit dieselben drei an niemanden: Der Buddy denkt, die Leitung macht es. KEINE PUNKTZAHL. Am Ende stehen drei Fragen, die ein Mensch beantwortet; die Haken sagen nur, ob er genug gesehen hat. Und "entscheidbar" haengt an DREI Schritten, nicht an einer Anzahl: Wer nie allein gearbeitet hat und wen das Team nie beurteilt hat, ueber den weiss man nichts, egal wie viele andere Haken stehen. Neun von zwoelf reichen nicht, drei genuegen -- wenn es die richtigen sind. WAS DAS HINSEHEN GEFUNDEN HAT `.t-schritt` gibt es auf dieser Seite schon -- es ist die Zeile mit dem naechsten Schritt der Trichterstufe. Meine Regeln standen SPAETER in derselben Datei und haetten sie ueberschrieben. Gefunden hat das keine Ueberlegung, sondern das Nachzaehlen im Browser: 13 Elemente mit `.t-schritt`, obwohl der Plan zwoelf hat. ZWEI PRUEFUNGEN WAREN SCHON VORHER ROT (gemessen mit git stash) pruef-schritt (6 rot) und pruef-befinden (4 rot) -- seit den Erweiterungen von heute frueh: aus sechs Befinden-Fragen wurden zwoelf, aus vier Kategorien sechs, und die Personenkachel zaehlt seit heute in Kaesten statt in einem Satz. Die Zahlen standen als feste Werte in den Pruefdateien. Nicht die Zahlen angepasst, sondern ABGELEITET: aus ENTWICKLUNG_BLOECKE und ENTWICKLUNG_PUNKTE.befinden. Eine feste Zahl ist eine Rechnung von gestern; wer sie nachtraegt, traegt sie beim naechsten Mal wieder nach. GEPRUEFT pruef-nachwuchs 123 -> 152. Vier Gegenproben, jede trifft ihr Ziel: Liste auch vor der Probe -> 1 rot, Abhaken ohne Stufenpruefung -> 7 rot, "entscheidbar" nach Anzahl statt nach den drei -> 3 rot, Name nicht mitgeliefert -> 1 rot. Dazu gruen: schritt 65, befinden 75, entwicklung 43, uebergang, neue-seiten, rechtetafel, css-klassen, struktur, deutsche-texte, modi-wortleck.
This commit is contained in:
@@ -70,9 +70,14 @@ import {
|
||||
} from "./workspace-entwicklungs-punkte.js";
|
||||
import {
|
||||
TALENT_STUFEN, TALENT_GRUPPEN, TALENT_MERKMALE, TALENT_WARNZEICHEN,
|
||||
// (Probeplan siehe unten -- eigene Datei, eigener Gegenstand)
|
||||
SCHICHT_WEIT_TAGE, SCHICHT_MAX_TAGE, ERSTER_TAG,
|
||||
TALENT_NACH_SCHLUESSEL, talentStufe, talentNaechste, ansprechtext,
|
||||
} from "./workspace-talent-punkte.js";
|
||||
import {
|
||||
PROBE_PHASEN, PROBE_SCHRITTE, PROBE_WER, PROBE_ALLE, PROBE_FRAGEN,
|
||||
PROBE_NACH_SCHLUESSEL, probeStand,
|
||||
} from "./workspace-probeplan.js";
|
||||
|
||||
export const entwicklungRouter = express.Router();
|
||||
|
||||
@@ -177,6 +182,30 @@ export function tabellen() {
|
||||
und die Stufe braucht ausserdem ein SEIT -- ohne das gibt es
|
||||
keine Standzeit, und ohne Standzeit wird aus dem Trichter wieder
|
||||
eine Liste. */
|
||||
/* WAS IN DER PROBEZEIT SCHON PASSIERT IST (17.09.2026).
|
||||
|
||||
Filipe: "wie talente ... aufgaben bekommen, analysiert werden von
|
||||
vanvan und mir."
|
||||
|
||||
EIGENE TABELLE UND NICHT DIE AUFGABEN: Ein Talent ist ein EINTRAG,
|
||||
kein Zugang -- es gibt keine Person, der man eine Aufgabe geben
|
||||
koennte. Und die Schritte gehoeren nicht alle ihm: drei davon tut
|
||||
der Buddy, drei die Leitung. Eine Aufgabe auf dem Brett waere
|
||||
damit entweder herrenlos oder an der falschen Person.
|
||||
|
||||
MIT von_id UND am, anders als bei den Merkmalen mit Absicht
|
||||
SICHTBAR: Bei einem Schritt zaehlt, WER ihn gesehen hat. "Das
|
||||
Team wurde gefragt" von dir und von der rechten Hand sind zwei
|
||||
verschiedene Auskuenfte. */
|
||||
CREATE TABLE IF NOT EXISTS talent_probe (
|
||||
eintrag_id INTEGER NOT NULL REFERENCES eintraege(id) ON DELETE CASCADE,
|
||||
schluessel TEXT NOT NULL,
|
||||
von_id INTEGER REFERENCES personen(id) ON DELETE SET NULL,
|
||||
am TEXT NOT NULL,
|
||||
notiz TEXT,
|
||||
PRIMARY KEY (eintrag_id, schluessel)
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS talent_stufe (
|
||||
eintrag_id INTEGER PRIMARY KEY REFERENCES eintraege(id) ON DELETE CASCADE,
|
||||
stufe TEXT NOT NULL
|
||||
@@ -890,6 +919,53 @@ function talentKarte(e, merkmale) {
|
||||
eigenen Weg: Er aendert sich mit jedem Klick, und ein Text, den
|
||||
man extra abrufen muss, ist beim Abrufen schon veraltet. */
|
||||
ansprechtext: ansprechtext(e.titel, gesetzt),
|
||||
/* WER WAS GESEHEN HAT (17.09.2026).
|
||||
|
||||
Filipe: "analysiert werden von vanvan und mir."
|
||||
|
||||
`von_id` stand seit dem Bau in der Tabelle und wurde nie
|
||||
ausgeliefert -- man sah, DASS ein Merkmal gesetzt ist, nicht von
|
||||
wem. Bei zwei Leuten, die unabhaengig beobachten, ist genau das
|
||||
die Auskunft: Was ihr BEIDE gesehen habt, ist mehr wert als was
|
||||
einer von euch gesehen hat. */
|
||||
gesehen_von: Object.fromEntries(merkmale
|
||||
.filter((m) => m.eintrag_id === e.id && m.von_name)
|
||||
.map((m) => [m.schluessel, m.von_name])),
|
||||
/* DIE PROBE. Sie steht an der Karte und nicht hinter einem eigenen
|
||||
Abruf -- sonst holt man sie erst, wenn man schon entschieden
|
||||
hat. */
|
||||
probe: probeVon(e.id, stufe.schluessel),
|
||||
};
|
||||
}
|
||||
|
||||
/* =====================================================================
|
||||
DIE PROBEZEIT EINES KANDIDATEN
|
||||
|
||||
Sie wird nur fuer die Stufe "probe" (und danach) gefuellt. An einem
|
||||
Kandidaten, der noch beobachtet wird, waere eine leere Zwoelferliste
|
||||
nur Laerm -- und Laerm, den man dreimal wegliest, liest man auch
|
||||
dann weg, wenn er gilt.
|
||||
===================================================================== */
|
||||
function probeVon(eintragId, stufe) {
|
||||
if (stufe !== "probe" && stufe !== "imteam") return null;
|
||||
const zeilen = db().prepare(`
|
||||
SELECT p.schluessel, p.am, p.notiz, x.name AS von_name
|
||||
FROM talent_probe p
|
||||
LEFT JOIN personen x ON x.id = p.von_id
|
||||
WHERE p.eintrag_id = ?`).all(eintragId);
|
||||
const stand = probeStand(zeilen.map((z) => z.schluessel));
|
||||
const je = new Map(zeilen.map((z) => [z.schluessel, z]));
|
||||
return {
|
||||
...stand,
|
||||
schritte: PROBE_ALLE.map((s) => ({
|
||||
...s,
|
||||
wer_name: PROBE_WER[s.wer] || s.wer,
|
||||
fertig: je.has(s.schluessel),
|
||||
am: je.get(s.schluessel)?.am || null,
|
||||
von: je.get(s.schluessel)?.von_name || null,
|
||||
notiz: je.get(s.schluessel)?.notiz || null,
|
||||
})),
|
||||
fragen: PROBE_FRAGEN,
|
||||
};
|
||||
}
|
||||
|
||||
@@ -900,8 +976,10 @@ entwicklungRouter.get("/workspace/api/talente/lage", (req, res) => {
|
||||
WHERE bereich = 'talente' ORDER BY id DESC LIMIT 300`).all();
|
||||
const merkmale = eintraege.length
|
||||
? db().prepare(
|
||||
`SELECT eintrag_id, schluessel FROM talent_merkmal
|
||||
WHERE eintrag_id IN (${eintraege.map(() => "?").join(", ")})`)
|
||||
`SELECT m.eintrag_id, m.schluessel, x.name AS von_name
|
||||
FROM talent_merkmal m
|
||||
LEFT JOIN personen x ON x.id = m.von_id
|
||||
WHERE m.eintrag_id IN (${eintraege.map(() => "?").join(", ")})`)
|
||||
.all(...eintraege.map((e) => e.id))
|
||||
: [];
|
||||
|
||||
@@ -971,6 +1049,55 @@ entwicklungRouter.put("/workspace/api/talente/:id/merkmal/:schluessel", gleicheH
|
||||
}
|
||||
});
|
||||
|
||||
/* =====================================================================
|
||||
EINEN SCHRITT DER PROBE ABHAKEN (17.09.2026)
|
||||
|
||||
EIN KNOPF, ZWEI RICHTUNGEN -- wie bei den Merkmalen. Ein zweiter
|
||||
Klick nimmt zurueck; ein eigener Weg zum Abwaehlen waere die Stelle,
|
||||
an der die Rechtepruefung irgendwann fehlt.
|
||||
|
||||
NUR AUF DER STUFE "PROBE". Wer einen Schritt abhakt, bevor die Probe
|
||||
laeuft, haekchen einen Zeitraum ab, den es nicht gibt -- und am Tag
|
||||
30 stuende eine volle Liste da, die nichts bedeutet.
|
||||
===================================================================== */
|
||||
entwicklungRouter.put("/workspace/api/talente/:id/probe/:schluessel", gleicheHerkunft,
|
||||
express.json({ limit: "8kb" }), (req, res) => {
|
||||
try {
|
||||
const id = nummer(req.params.id);
|
||||
const schluessel = String(req.params.schluessel || "");
|
||||
const e = id && db().prepare(
|
||||
"SELECT id, bereich FROM eintraege WHERE id = ?").get(id);
|
||||
if (!e || e.bereich !== "talente") return res.status(404).json({ fehler: "nicht_gefunden" });
|
||||
if (!PROBE_NACH_SCHLUESSEL.has(schluessel)) {
|
||||
return res.status(404).json({ fehler: "nicht_gefunden" });
|
||||
}
|
||||
const stand = db().prepare("SELECT stufe FROM talent_stufe WHERE eintrag_id = ?").get(id);
|
||||
if (stand?.stufe !== "probe") {
|
||||
return res.status(409).json({
|
||||
fehler: "Das gehört in die Probezeit – die läuft für ihn gerade nicht.",
|
||||
});
|
||||
}
|
||||
|
||||
const schon = db().prepare(
|
||||
"SELECT 1 AS x FROM talent_probe WHERE eintrag_id = ? AND schluessel = ?")
|
||||
.get(id, schluessel);
|
||||
if (schon) {
|
||||
db().prepare("DELETE FROM talent_probe WHERE eintrag_id = ? AND schluessel = ?")
|
||||
.run(id, schluessel);
|
||||
} else {
|
||||
const notiz = String(req.body?.notiz ?? "").trim().slice(0, 400) || null;
|
||||
db().prepare(
|
||||
"INSERT INTO talent_probe (eintrag_id, schluessel, von_id, am, notiz)"
|
||||
+ " VALUES (?,?,?,?,?)")
|
||||
.run(id, schluessel, req.person.id, jetzt(), notiz);
|
||||
}
|
||||
res.json({ ok: true, fertig: !schon });
|
||||
} catch (f) {
|
||||
console.error("[talente] Probe:", f?.message);
|
||||
res.status(503).json({ fehler: "nicht_verfuegbar" });
|
||||
}
|
||||
});
|
||||
|
||||
/** Buddy und Datum prüfen. Gibt `{ fehlt: [...] }` oder `{ buddyId, schicht }`.
|
||||
*
|
||||
* EINE STELLE, ZWEI AUFRUFER: der Stufenwechsel auf „Probe" und das
|
||||
|
||||
Reference in New Issue
Block a user