Files
dogfather-universe/server/support-tabellen.js
T
DogFatherGitandClaude Opus 5 9f5dbb42e3 Support: melden mit Bild, und für die Leitung ein Eingang
Filipe: „da fehlt auch eine support kachel. die jeder sieht. jeder
benutzen kann. jeder kann da probleme von der seite melden und
hinweisen. fotos mit schicken mit einem text. … so einfach wie
möglich, will nichts kompliziertes oder zu viel. kurz und knapp …
bei dogfather und der rechten hand soll die kachel anders gebaut sein
weil die sind die die sich um die probleme kümmern."

WARUM DAS NICHT DER VORHANDENE MELDEWEG IST. Es gibt ihn schon
(hilfe.html) und er sieht aehnlich aus. Drei Unterschiede machen ihn
zu etwas anderem:
  1. Er ist NICHT fuer alle -- in rechte.js steht
     `["gast","hand","admin"]`. Modis, Creator, Scouts, Manager und
     die linke Hand hatten gar keinen Weg, einen kaputten Knopf zu
     melden.
  2. Er kann keine Bilder. Bei „der Knopf tut nichts" ist ein
     Bildschirmfoto die halbe Antwort.
  3. Er ist bewusst schwer: strikter Wechsel, hoechstens drei offene
     Faelle, ein Betreff. Richtig bei einem Vorfall zwischen
     Menschen, zu viel fuer „das Datum steht falsch da".

Deshalb eigen und sehr kurz: EIN Feld, EIN Bild, fertig. Kein
Betreff, keine Kategorie, keine Dringlichkeitsstufe -- wer ein
Formular mit fuenf Feldern sieht, meldet den kleinen Fehler nicht,
und genau die kleinen erfaehrt sonst niemand.

DIE LEITUNG SIEHT ETWAS ANDERES: einen Eingang mit Zahlenband
(neu / in Arbeit / erledigt), drei Filtern und zwei Handgriffen --
„Ich kuemmere mich" und „Erledigt …". Zwei, nicht fuenf; eine
Zuweisung an eine Person und Prioritaeten waeren ein Ticketsystem
fuer zwei Menschen, die nebeneinander sitzen. Das Melde-Feld bleibt
auch fuer sie da, rutscht aber unter den Eingang.

Wer zumacht, schreibt einen Satz dazu -- der Melder sieht nur diesen
Satz, und ohne ihn weiss er nicht, ob etwas behoben wurde oder ob
niemand Zeit hatte. Beide Seiten bekommen eine Benachrichtigung.

UEBERNOMMEN STATT NEU ERFUNDEN:
  * `dateiErkennen` aus workspace-chat.js -- EXPORTIERT, nicht
    abgeschrieben. An ihr haengt die ganze Sicherheit der Uploads
    (der Typ kommt aus den ersten Bytes, nicht aus Name oder
    Content-Type), und eine zweite Fassung waere die, die beim
    naechsten Dateiformat vergessen wird.
  * Die zweigeteilte Sicht und `meldungFuer()` (gibt den Datensatz
    oder null zurueck, nie true/false) aus dem vertraulichen
    Meldeweg.
  * Der Upload-Weg (express.raw, Text im Kopf, Ordner unter
    DATEN_ORDNER, damit die Sicherungspruefung ihn findet).

DIE KACHEL BEKOMMT JEDER -- an EINER Stelle angehaengt: `bereicheFuer`
haengt sie an jede Rollenliste, statt sie in fuenf Listen
einzutragen. Genau so ist heute der Benachrichtigungs-Knopf auf 14
Seiten verschwunden. Dazu der Eintrag in rechte.js (ohne ihn
verschwindet die Kachel lautlos, `nurOffeneKacheln` filtert dagegen)
und in der Browser-Kachelliste fuer die Agentur-Rollen.

TON 44 GERECHNET, NICHT GEWAEHLT -- und dabei zweimal danebengelegen:
  * Ich habe erst einen eigenen Modus in kachel-farben.mjs gebaut.
    `tools/kachel-farbe-einzeln.mjs` gibt es aber seit dem 22.09. fuer
    genau diesen Zweck. Meine Dopplung ist wieder weg.
  * Von Hand hatte ich #bcdbff eingetragen. pruef-kachelfarben lehnte
    es ab (Buntheit 0,060, verlangt sind 0,12) -- und das vorhandene
    Werkzeug verteidigte es trotzdem, weil sein Abstand gut war. Ein
    Werkzeug, das einen regelwidrigen Zustand haelt, weil er zufaellig
    gut misst, behebt genau den Fehler nicht, fuer den es da ist.
    Behoben: Zuerst die Regeln, dann der Abstand. Ergebnis #fd6401,
    Abstand 0,0914 (engstes vorhandenes Paar: 0,0154).

DREI MESSFEHLER VON MIR, die wie schwere Befunde aussahen: `fetch`
verwirft den Host-Kopf (die Community kommt nur auf crew. herein),
die Community bestaetigt ihr Alter (`alter_ok`), und die Startroute
heisst /api/ich. Alle drei stehen in pruef-treff.mjs richtig.

Ein ECHTER Fehler kam dazu: support.html lud bereiche.js nicht, und
kopf.js stuerzte mit „Cannot read properties of undefined (reading
'LEITUNG')" ab -- sichtbar nur in der Browserkonsole. Und
pruef-css-klassen fand sofort, dass auch wahl.js fehlte.

Gemessen: pruef-support 45 Pruefungen, 0 Fehler (alle neun Rollen
kommen herein, jede sieht die Kachel, als Bild getarntes HTML wird
abgelehnt, eine fremde Meldung bleibt fremd, erledigt bleibt
erledigt). Dazu 24 Messungen am Bild in drei Groessen. Gruen:
pruef-kachelfarben (22), pruef-css-klassen.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-24 01:32:55 +02:00

128 lines
5.7 KiB
JavaScript

/* =====================================================================
DER SUPPORT — Tabellen (24.09.2026)
Filipe: „da fehlt auch eine support kachel. die jeder sieht. jeder
benutzen kann. jeder kann da probleme von der seite melden und
hinweisen. fotos mit schicken mit einem text. … es geht drum dass
die leute einfach ein text mit einem foto schicken und dan die
rechte hand und dogfather es bekommen. es sehen in dieser support
kachel. also bei dogfather und der rechten hand soll die kachel
anders gebaut sein weil die sind die die sich um die probleme
kümmern."
---------------------------------------------------------------------
WARUM DAS NICHT DER VERTRAULICHE MELDEWEG IST
Es gibt ihn schon (hilfe.html, hilfe_faelle) und er sieht auf den
ersten Blick gleich aus. Drei Unterschiede machen ihn zu etwas
anderem:
1. ER IST NICHT FÜR ALLE. In rechte.js steht
`"/workspace/hilfe.html": ["gast", "hand", "admin"]` — Modis,
Creator, Scouts, Manager und die linke Hand haben ihn nicht.
Das Team selbst hatte damit gar keinen Weg, einen kaputten
Knopf zu melden.
2. ER KANN KEINE BILDER. Bei „der Knopf oben rechts tut nichts"
ist ein Bildschirmfoto die halbe Antwort. Ein Meldeweg ohne
Bild führt zu drei Rückfragen.
3. ER IST BEWUSST SCHWER. Strikter Wechsel (melden → warten →
antworten → warten), drei offene Fälle höchstens, ein Betreff.
Das ist richtig, wenn es um einen Vorfall zwischen Menschen
geht. Für „das Datum steht falsch da" ist es zu viel.
Deshalb eine eigene, sehr kurze Sache: EIN Feld, EIN Bild, fertig.
Kein Betreff, keine Kategorie, keine Dringlichkeitsstufe. Wer ein
Formular mit fünf Feldern sieht, meldet den kleinen Fehler nicht —
und genau die kleinen sind es, die sonst niemand erfährt.
---------------------------------------------------------------------
DREI STÄNDE, NICHT FÜNF
„neu" Niemand hat es angesehen.
„in_arbeit" Jemand kümmert sich — sichtbar auch für den Melder,
damit er weiß, dass es angekommen ist.
„erledigt" Zu. Mit einer Antwort, wenn es etwas zu sagen gab.
Eine vierte Stufe („abgelehnt") gibt es absichtlich nicht. Ein
Hinweis, den man nicht umsetzt, wird trotzdem erledigt — mit einem
Satz warum. „Abgelehnt" ist eine Tür, die man dem zuschlägt, der
sich die Mühe gemacht hat.
---------------------------------------------------------------------
DAS BILD LIEGT AUF DER PLATTE, NICHT IN DER DATENBANK
Dieselbe Entscheidung wie bei Chat-Anhängen und der Dateiablage: Ein
Bildschirmfoto sind ein bis fünf Megabyte, und eine SQLite-Datei,
die man täglich sichert, soll das nicht tragen. In der Tabelle steht
nur der Dateiname; der Ordner steht in workspace-support.js über
`join(DATEN_ORDNER, …)` — genau dieses Muster liest
tools/wiederherstellung-proben.mjs, um zu prüfen, ob die Sicherung
ihn mitnimmt.
DIESE DATEI IMPORTIERT NICHTS — derselbe Grund wie bei
hilfe-tabellen.js und treff-tabellen.js: Sie wird aus dem Bauplan in
workspace.js aufgerufen und darf keinen Kreis erzeugen.
===================================================================== */
/** Die drei Stände einer Meldung.
*
* Hier und nicht als Zeichenkette an zwanzig Stellen — ein Tippfehler
* in einem `WHERE stand = 'neu'` findet lautlos nichts. */
export const SUPPORT_STAND = {
neu: "neu",
inArbeit: "in_arbeit",
erledigt: "erledigt",
};
/** Wie lange eine erledigte Meldung aufbewahrt wird.
*
* Neunzig Tage. Lang genug, um ein wiederkehrendes Problem zu
* erkennen („das hatten wir im Juli schon"), kurz genug, dass
* Bildschirmfotos aus dem Arbeitsalltag nicht ewig herumliegen.
* Aufgeräumt wird im Rundgang, nicht beim Lesen — sonst hängt das
* Löschen davon ab, dass jemand die Seite öffnet. */
export const AUFBEWAHRUNG_TAGE = 90;
export function supportTabellen(d) {
d.exec(`
CREATE TABLE IF NOT EXISTS support_meldungen (
id INTEGER PRIMARY KEY AUTOINCREMENT,
/* ON DELETE SET NULL und nicht CASCADE: Wird ein Zugang
gelöscht, ist der gemeldete Fehler immer noch da. Die Meldung
verliert ihren Absender, nicht ihren Inhalt. */
person_id INTEGER REFERENCES personen(id) ON DELETE SET NULL,
/* Der Name wird MITGESCHRIEBEN, nicht nur verknüpft. Sonst steht
nach einem Rollenwechsel oder einer Löschung „—" neben einer
Meldung, zu der jemand etwas fragen möchte. */
von_name TEXT,
von_rolle TEXT,
text TEXT NOT NULL,
/* WO ES PASSIERT IST. Kommt nicht aus einem Auswahlfeld, sondern
aus der Adresse, von der aus gemeldet wurde — eine Angabe, die
niemand tippen muss und die trotzdem stimmt. */
seite TEXT,
/* Was der Browser über sich sagt, gekürzt. Bei „geht bei mir
nicht" ist das die erste Frage, und sie erübrigt sich damit. */
geraet TEXT,
bild_datei TEXT,
bild_typ TEXT,
bild_breite INTEGER,
bild_hoehe INTEGER,
stand TEXT NOT NULL DEFAULT 'neu'
CHECK (stand IN ('neu','in_arbeit','erledigt')),
antwort TEXT,
erstellt TEXT NOT NULL,
geaendert TEXT NOT NULL,
erledigt_am TEXT,
erledigt_von INTEGER REFERENCES personen(id) ON DELETE SET NULL
);
/* Die Leitung fragt „was ist offen?", der Melder „was ist meins?".
Zwei Indizes für zwei Fragen. */
CREATE INDEX IF NOT EXISTS idx_support_stand
ON support_meldungen(stand, id DESC);
CREATE INDEX IF NOT EXISTS idx_support_person
ON support_meldungen(person_id, id DESC);
`);
}