/* ===================================================================== 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); `); }