/* ===================================================================== DER VERTRAULICHE MELDEWEG -- Tabellen (19.09.2026) Filipe: „es soll auch eine kategorie also eine hauptkachel geben wo die community leute sich anonym melden können wenn sie probleme haben. so wie ein support sie melden was und müssen dan auf die antwort warten, dan können die erst antworten dan wieder auf antwort von mir warten und immer so weiter bis ich es zu mache. rechte hand und dogfather sollen zugriff auf diese anonyme nachrichten haben. also anonym für die anderen. keiner soll sie sehen in dem sinne aber wir sollen sehen wer die geschrieben hat, den namen." --------------------------------------------------------------------- „ANONYM" HEISST HIER VERTRAULICH -- UND DAS MUSS DRANSTEHEN Der Melder ist NICHT anonym: DogFather und die rechte Hand sehen seinen Namen, genau so hat Filipe es bestellt, und es ist auch richtig so (ohne Namen kann man niemandem helfen und keine Maßnahme ergreifen). Anonym ist er gegenüber allen ANDEREN -- kein anderes Mitglied, kein Modi, niemand sonst sieht diese Fälle. DAS IST EIN UNTERSCHIED, DER AUF DIE SEITE GEHÖRT. Wer glaubt, niemand wisse, dass er es war, schreibt anders -- und fühlt sich hinterher getäuscht. Der Satz „DogFather und die rechte Hand sehen deinen Namen. Sonst niemand." steht deshalb im Formular, bevor man tippt, und nicht im Kleingedruckten darunter. --------------------------------------------------------------------- WARUM DER STRIKTE WECHSEL Filipe will: melden -> warten -> antworten -> warten. Immer abwechselnd. Das ist keine technische Einschränkung, sondern die eigentliche Idee: 1. Es sagt IMMER, wer am Zug ist. Ein Verlauf, in den beide jederzeit schreiben können, endet damit, dass niemand weiß, ob noch eine Antwort kommt. 2. Es schützt den, der meldet. Wer aufgeregt ist, schreibt sonst fünf Nachrichten hintereinander -- und liest die Antwort dann als Reaktion auf die letzte statt auf alles. 3. Es schützt den, der antwortet. Ein Fall mit drei offenen Fragen wird nicht beantwortet, er wird verschoben. Geschlossen wird nur von der Leitung. Ein Fall, den der Melder selbst zumachen kann, wird in einem schlechten Moment zugemacht. --------------------------------------------------------------------- DIESE DATEI IMPORTIERT NICHTS -- derselbe Grund wie bei treff-tabellen.js: Sie wird aus dem Bauplan in workspace.js aufgerufen und darf keinen Kreis erzeugen. ===================================================================== */ /** Die drei Zustände eines Falls. * * Sie stehen hier und nicht als Zeichenkette an zwanzig Stellen -- * ein Tippfehler in einem `WHERE status = 'offen'` findet lautlos * nichts. * * „wartet_auf_antwort" Der Melder hat geschrieben, die Leitung ist dran. * „antwort_da" Die Leitung hat geantwortet, der Melder ist dran. * „geschlossen" Erledigt. Nur die Leitung setzt das. */ export const FALL_STAND = { wartet: "wartet_auf_antwort", antwort: "antwort_da", zu: "geschlossen", }; /** Wie lange ein geschlossener Fall aufgehoben wird (Tage). * * NICHT FÜR IMMER. Hier stehen die empfindlichsten Texte des ganzen * Hauses -- jemand beschreibt ein Problem, oft mit anderen Menschen * darin. Was niemand mehr braucht, soll auch nicht mehr da sein. * * 90 Tage, weil ein Fall manchmal wieder aufkommt („das ist schon * wieder passiert") und man dann nachlesen können muss, was damals * vereinbart wurde. Länger hilft niemandem. */ export const AUFBEWAHRUNG_TAGE = 90; export function hilfeTabellen(d) { d.exec(` /* EIN FALL. Nicht "Ticket" -- das Wort kennt hier niemand. "betreff" ist kurz und steht in der Liste; der eigentliche Text ist die erste Nachricht. Das trennt "worum geht es" von "was ist passiert" und macht eine Liste von zwanzig Fällen lesbar. "person_id" MIT ON DELETE CASCADE: Wer sein Konto verliert, verliert auch seine Fälle. Ein Fall ohne Melder ist eine Beschwerde von niemandem -- daran kann man nichts mehr klären, und aufheben sollte man ihn erst recht nicht. */ CREATE TABLE IF NOT EXISTS hilfe_faelle ( id INTEGER PRIMARY KEY AUTOINCREMENT, person_id INTEGER NOT NULL REFERENCES personen(id) ON DELETE CASCADE, betreff TEXT NOT NULL, stand TEXT NOT NULL DEFAULT 'wartet_auf_antwort' CHECK (stand IN ('wartet_auf_antwort','antwort_da','geschlossen')), erstellt TEXT NOT NULL, geaendert TEXT NOT NULL, geschlossen_am TEXT, geschlossen_von INTEGER REFERENCES personen(id) ON DELETE SET NULL ); /* DIE NACHRICHTEN. "von_leitung" statt eines Rollennamens: Wer geantwortet hat, ist für den Melder unerheblich -- er soll nicht überlegen müssen, ob eine Antwort von DogFather mehr gilt als eine von der rechten Hand. Für das Protokoll bleibt "von_id". Das ist ausserdem stabil gegen Rollenwechsel: Wird jemand später etwas anderes, bleibt seine Antwort trotzdem eine der Leitung. */ CREATE TABLE IF NOT EXISTS hilfe_nachrichten ( id INTEGER PRIMARY KEY AUTOINCREMENT, fall_id INTEGER NOT NULL REFERENCES hilfe_faelle(id) ON DELETE CASCADE, von_id INTEGER REFERENCES personen(id) ON DELETE SET NULL, von_leitung INTEGER NOT NULL DEFAULT 0, text TEXT NOT NULL, erstellt TEXT NOT NULL, /* Wann der jeweils andere es gelesen hat. Nur dafür da, dem Melder zu zeigen, dass seine Meldung angekommen ist -- das ist die erste Frage, die jemand hat, der etwas Unangenehmes geschrieben hat. */ gelesen_am TEXT ); CREATE INDEX IF NOT EXISTS idx_hilfe_faelle_person ON hilfe_faelle (person_id, geaendert DESC); CREATE INDEX IF NOT EXISTS idx_hilfe_faelle_stand ON hilfe_faelle (stand, geaendert DESC); CREATE INDEX IF NOT EXISTS idx_hilfe_nachrichten_fall ON hilfe_nachrichten (fall_id, id); `); }