Projekt P-5050 · Kunde K-1050 · Dok-Nr. P-5050-K3 · Stand 27.10.2026, 13:48 Uhr

Konzept im ÜberblickWas Bululu kann

Kapitel 06 von 16

Verwaltung und Schutz

Wie Ihre Mitarbeiter neue Firmen prüfen, Anfragen beantworten, Firmen und Nutzer betreuen, Werbung einbuchen und Bululu vor Missbrauch schützen.

  • Lesezeit rund 89 Min.
  • Für Verwaltung der 3BS, Betriebe

Auf einen Blick

Das Wichtigste aus diesem Kapitel in einer Minute. Alle Einzelheiten stehen darunter.

  • Sechs Hauptpunkte in einer ArbeitsansichtIhre Verwaltung arbeitet mit Prüfen, Anfragen, Firmen und Nutzer, Werbung, Inhalte und Einstellungen. Die Startseite „Heute zu tun“ zeigt, was zuerst erledigt werden muss.
  • Neue Firmen werden vorab geprüftDie erste Stelle einer neuen Firma wartet auf Ihre Freigabe. Entscheidet bis zum nächsten Werktag um 9 Uhr niemand, geht sie automatisch online und bleibt zum Nachprüfen markiert.
  • Zugang nur mit zweitem SchutzWer in der Verwaltung arbeitet, meldet sich mit Kennwort und zusätzlich mit einem Code aus einer App an, weil dort Bewerberdaten liegen.
  • Melden, sperren, SperrlisteBesucher können Anzeigen melden. Ihre Verwaltung sperrt Stellen, Firmen oder Konten sichtbar mit Grund; die Sperrliste hält Störer nur bei Registrierung und Formularen ohne Konto auf.
  • Jede Handlung wird mit Grund festgehaltenWas Ihre Verwaltung tut, steht im Protokoll. Bewerbungsunterlagen einer Firma öffnet sie nur mit Grund, und jedes Öffnen einer Datei wird festgehalten.
8Stundenbleibt eine Anmeldung in der Verwaltung höchstens gültig
60Minutendauert eine Hilfe „Im Namen von“ einer Firma, dann endet sie von selbst
30Tagewerden Anmeldungen mit IP-Adresse zum Schutz aufbewahrt
Von Ihnen gebraucht
  • Festlegen, ob die Prüfung neuer Firmen zum Start eingeschaltet ist und welche Firmen ohne Prüfung starten.
  • Die Fristen bestätigen, etwa für das Löschen von Bewerbungen und Konten. Bis dahin gelten die vorgeschlagenen Werte.
  • Die E-Mail-Adresse der 3BS nennen, an die Kontaktanfragen und Rückfragen gehen.
Stand 16:48: vollständig (Teil 1 bis 7) · 26.10. ergänzt: E-Mail-Adresse ändern durch die Verwaltung (L2, H135), Hilfe-Artikel pflegbar (L1), Mail-Dienst aus 1a · 26.10. Sicherheit: Sperrliste nach IP, IP-Bereich, Mail und Domain (1.15, H136, ersetzt „Adresse sperren“), Sicherheitsprotokoll der Anmeldungen mit Alarm (1.16, H142), COPLA-Abruf nur auf erlaubte Hosts (1.13); Prüfliste in _planung/sicherheit.md · 26.10. Rollen: Betreiber in zwei Stufen, Verwaltung (3BS) und Super Admin (Nomad, im Hintergrund, früher Rolle „Nomad“); Super-Admin-Konten und technische Karten sind für die Verwaltung unsichtbar (D38, D39), Mail-Versand-Karte (1.11 Nr. 8), Notfall-Handlungen H145 bis H150, Notfallweg über den Server (Karte 0 Teil 11)

Stand 22.10.2026, Nomad. Grundlage: PLAN-BACKEND Fassung 5 (Zeitplan 3, Verwaltung, Werbekunde, Lebensläufe, Sicherheit und Datenschutz, Bundesagentur, Schnittstellen › COPLA-Verwaltung, In der Verwaltung, Betrieb), USABILITY-KONZEPT 3.14 bis 3.20, 5.13 bis 5.20, 7a, TEXTE-UND-MAILS 1.9, 5.5, 6.1, 6.5, 6.6, 7.3, FUNKTIONEN-CHECK, AENDERUNGSLISTE-GESAMTKONZEPT (G02, G13, G15, G16, G40 bis G43, G91, G92), Entwurf B (firmen-bereich.html, mein-bereich.html, anmelden.html, stelle.html, assets/style.css, assets/app.js), Karten 1a, 1b, 2a.

Umfang 3 laut Zeitplan: Verwaltung mit den sechs Hauptpunkten (Prüfen, Anfragen, Firmen und Nutzer, Werbung als Mindestteil, Inhalte als einfache Formulare, Einstellungen) und Betreiber in zwei Stufen (Verwaltung = 3BS, Super Admin = Nomad im Hintergrund; D38, D39), Premium (Anfrage an der Stelle, Freischaltung, Top-Haken), Werbeanfragen (Konfigurator-Anfrage aus 1b-Link, Eingang), Mindestteil der Kampagne (Kunde, Fläche, Zeitraum, Motiv hochladen, Zielseite, Zustand, Zählung; W04 und W05 automatisch; damit erscheint Werbung auf den 1a/1b-Flächen), Missbrauchsschutz (Melden-Knopf, Meldungen, Sperren, Sperrliste nach IP, IP-Bereich, Mail und Domain, Sicherheitsprotokoll der Anmeldungen mit Alarm, Faktor-Pflicht der Verwaltung, Support-Modus mit Protokoll), Datenschutz-Abläufe und Fristen (Löschläufe, Export auf Wunsch, Protokoll mit Grund, Einstellungen › Fristen), Stellen-Abruf aus der COPLA-Verwaltung (Schnittstellen-Block, Abgleich alle 15 Minuten). Nicht in 3 (nur als Abgrenzung, 2b oder später): Werbekampagnen vollständig (Angebot W02, Motivprüfung W03/W06, Änderungen W07/W08, Posten, Belegungs-Zeitleiste, Pausieren, Verlängern, Stornieren, Zwischenstand, Bericht von Hand), Text-Editor (Tiptap) für Ratgeber, Rechtstexte, Mailvorlagen, Seitentexte mit Sprach-Reitern und „Automatisch übersetzen“ (bis dahin pflegt Nomad über das Einspielskript 1b), Bundesagentur-Übertragung (HR-BA-XML; in 3 nur die Einstellungs-Karte mit Zertifikat, Kennwort und Schalter, die Übertragung selbst ist aus), Bewerbungen an COPLA und Stand-Rückmeldung, Import und Export (auch Firmen-Export), KI-Texte, Statistik, Bewerberansprache und Bezahlen, Werbekunden-Konto, Monatswerte-Link, „Bewerbung melden“ für Firmen.

Was 1a/1b/2a schon bauen und hier nur benutzt wird (nicht doppelt geplant): Seitenrahmen, Toasts, Kompaktkopf (1a 1.1); Stellenkarte, Monogramm, Leerzustand, Platzhalter, Sonderseiten (1a 2.1); Seitenkopf, Band, Kontaktformular, Honigfeld, Bremse, Mail-Dienst mit Warteschlange (1a 2.2, Fundament; Honigfeld und Bremse 1b 2.1); Konto-Menü, Reiter, Jetzt wichtig, Ablage, Status-Chip, Fenster, Auswahl-Leiste, Live, Faktor (2a 2.1); Better Auth mit TOTP, Sitzungen, RLS-Rollen, Rechte-Prüfung darf() (2a 2.2); Tabellen firmen, stellen, fachbereiche, einstellungen, protokoll, lieferungen (1a), kontaktanfragen, inhalte, inhalte_fassungen, job_alarme (1b), mail_warteschlange (1a), konten, sitzungen, faktor, konto_tokens, einwilligungen, benachrichtigungen, firmen_nutzer, bewerbungen, dateien, nachrichten (2a); Stellen-Zustände nachbessern und gesperrt (1a zustaende.ts, 2a C20), Adressen /konto/faktor-reset (2a 1.2), Firma löschen durch den Admin (2a 1.13), Konto löschen und Datenexport des Bewerbers (2a 1.9), F10 bis F17 als Nummern (2a C11), die Löschläufe in hintergrund/aufgaben/fristen.ts (2a 2.2; hier ergänzt), Stellen-Werbeflächen mit Platzhalter-Motiv (1a W6, hier mit echten Kampagnen gefüllt).

Fundstellen: B:firmen-bereich.html:117 = Datei und Zeile in entwurf-b/; css:642 = assets/style.css; js:1144 = assets/app.js; K: = gemeinsam/werbung/konfigurator/konfigurator.js (nur Flächenliste); T verwaltung.pruefen.freigeben = Textschlüssel aus TEXTE-UND-MAILS; U 3.15 = Usability-Bildschirm; P Verwaltung = Abschnitt im Plan; FC 1 = Befund im FUNKTIONEN-CHECK.

1

Seiten

Alle Seiten der Verwaltung, vom Prüfen über Anfragen, Firmen, Werbung und Inhalte bis zu Einstellungen, Sperrliste und Datenschutz-Fristen.

Adressen unter /verwaltung/… ohne [locale] (Verwaltung nur Deutsch, P Sprachen; Annahme D1). Alle Seiten liegen in app/verwaltung/ mit eigenem layout.tsx: prüft Sitzung + Betreiber-Stufe (verwaltung oder super_admin; wird mit set_config('app.verwaltung_rolle') an die Zeilensperre gegeben, Teil 3) + bestätigten Faktor auf dem Server (ohne Faktor → /verwaltung/faktor-einrichten, sonst nichts erreichbar; P Sicherheit, U 3.14 Zustand), noindex, feste Sitzungsdauer 8 Stunden (Annahme D2). Aufbau nach D43: Kopf = Seitenrahmen-Kopf aus 1a in Variante „verwaltung“ nur mit Logo und Konto-Menü (2a kontomenue/, Einträge: Mein Konto · Abmelden; im Konto-Knopf klein die Stufe „Verwaltung“ oder „Super Admin“), ohne Hauptmenü im Kopf. Darunter links die feste Menüleiste (Baustein verwaltungsleiste/, Teil 2.1): Heute zu tun · Prüfen · Anfragen · Firmen und Nutzer · Werbung · Inhalte · Einstellungen (Super Admin: alle Karten; Verwaltung: nur Verwaltungskonten, 1.11); Zahl-Kreise (zahl-klein, B:firmen-bereich.html:119, css:631) an Prüfen und Anfragen nur bei offenen Posten, an Werbung nur bei „Motiv fehlt“ (U 3.14); dieselbe 60-Sekunden-Abfrage wie in 2a 1.16 frischt die Zahl-Kreise und die Zahlen von „Heute zu tun“ auf. Kein Bereichskopf mit h1 „Verwaltung“: die h1 der jeweiligen Seite genügt. Rechts daneben die Arbeitsfläche; alle Listen sind kompakte Tabellen aus verwaltungsliste/ (Teil 2.1) mit sortierbaren Spaltenköpfen; Auswahlkästchen gibt es nur, wo eine Sammelaktion besteht (zum Livegang: Prüfen › Freigeben, Als erledigt markieren; Anfragen › Als erledigt markieren). Neue Zeilen aus der Abfrage fügt keine Tabelle selbst ein: über der Tabelle steht die ruhige Zeile T gemeinsam.live.neu „{n} neue … · anzeigen“, erst der Klick lädt sie, Auswahl und Scrollstand bleiben. Am Handy klappt die Leiste in den Burger (1a HandyMenue, Variante verwaltung), Tabellen werden dort zu gestapelten Zeilen.

Öffentliche Seiten, die 3 anfasst: Stelle und Firmenprofil bekommen den Knopf „Anzeige melden“ (1a A6, 1b 1.3), Für Arbeitgeber bekommt die Werbeplanung unter /fuer-arbeitgeber/werbung (1b 1.4 Nr. 6), der Firmenbereich bekommt „Premium anfragen“ und den Top-Haken (2a 1.11 vorbereitet), die Werbeflächen (1a werbeflaeche/) zeigen laufende Kampagnen.

NrSeiteAdresseB-Datei (Bausteine)Daten
1Verwaltung: Übersicht „Heute zu tun“/verwaltungfirmen-bereich.html:102–138 (Kacheln; Bereichskopf entfällt, D43), jetztwichtig (2a)pruefungen, meldungen, kontaktanfragen, premium_anfragen, werbung_kampagnen, zaehler_tag, protokoll
2Prüfen: Liste · Neue Firma · Meldung/verwaltung/pruefen · /verwaltung/pruefen/[id]firmen-bereich.html:140–149 (Pillen, Zeilen), stelle.html (lesend)pruefungen, meldungen, stellen, firmen
3Anfragen: Liste · Kontaktanfrage · Premium-Anfrage/verwaltung/anfragen · /verwaltung/anfragen/[id]:140–149, :151–154 (Zeilen), formularkontaktanfragen, premium_anfragen, werbung_anfragen
4Firmen und Nutzer: Suche · Firmenansicht · Bewerberansicht/verwaltung/firmen · /verwaltung/firmen/[id] · /verwaltung/personen/[id]:140–149, mein-bereich.html:184–192 (Felder)firmen, firmen_nutzer, konten, stellen, bewerbungen (nur Zahlen), protokoll
5Support-Modus „Im Namen von“ (im Firmenbereich 2a)/firma/… mit Leisteneu: support-leistesupport_sitzungen, protokoll
6Werbung: Kampagnen · Kampagne · Flächen/verwaltung/werbung · /verwaltung/werbung/[id] · /verwaltung/werbung/flaechen:140–149, :156–194 (Formular + Vorschau), stelle.html:126–143 (Ablage)werbung_kampagnen, werbung_flaechen, werbung_zaehlung_tag
7Inhalte (einfache Formulare)/verwaltung/inhalte · /verwaltung/inhalte/fachbereiche/[id] · /verwaltung/inhalte/[art]/[id]:212–227 (Formular), :140–149fachbereiche, inhalte, inhalte_fassungen (1b), mailvorlagen
8Einstellungen (Super Admin alle Karten; Verwaltung nur Verwaltungskonten)/verwaltung/einstellungenmein-bereich.html:184–192, 1b FAQ details (css:930–936)einstellungen, verwaltung_konten, verwaltung_einladungen
9Mein Konto (Verwaltung)/verwaltung/konto2a 1.9 Karten 3, 4konten, faktor, benachrichtigungen
10Faktor einrichten (Pflicht), Zielseiten aus Mails/verwaltung/faktor-einrichten · /verwaltung/einladung?t= · /konto/faktor-reset?t= · /konto/faktor-reset/abbrechen?t= · /konto/entsperrt (nur Mail-Ziel)anmelden.html:144–152 (Box)faktor, verwaltung_einladungen, konto_tokens
11Öffentlich: Anzeige melden (Fenster)/stelle/[adresse]#melden · /firmen/[adresse]#meldenstelle.html:103–112 (Dialog-Rahmen), Grund-Pillen wie filter-pillenmeldungen
12Öffentlich: Werbung planen/fuer-arbeitgeber/werbunggemeinsam/werbung/konfigurator (B-Konfigurator, Stil b)werbung_anfragen, dateien
13Firma: Premium anfragen, Top-Haken (im 2a-Firmenbereich)/firma/stellen (Fenster), /firma/stellen/[id] (Haken)firmen-bereich.html:140–149premium_anfragen, stellen.top
14Werbeflächen live (ohne Seite)/api/w/[kampagneId] (Zähl-Weiterleitung)1a werbeflaeche/werbung_kampagnen, werbung_zaehlung_tag
15Sperrliste (unter Firmen und Nutzer)/verwaltung/firmen/sperrlistefirmen-bereich.html:140–149 (Zeilen), grundfenster (Variante sperrliste)sperrliste, anmeldungen (Treffer, zuletzt genutzte IP-Adressen)

1.1 Übersicht „Heute zu tun“

Datei app/verwaltung/page.tsx · Teile in _uebersicht/. U 3.14. Kein Dauer-Knopf im Kopf.

NrBereichBausteineB-FundstelleHinweis
1Heute zu tunBaustein jetztwichtig (2a) in Variante „verwaltung“: h2 T verwaltung.start.heute, höchstens 5 Zeilen, sechste „und {n} weitere“ als Link in den Reiter; Reihenfolge überfällig → Frist heute → morgen → ohne Frist; Wort T verwaltung.start.ueberfaellig im Satz; Zeilen nach T 7.3 (verwaltung.heute.firma → Prüfen, .meldung → Ansehen, .anfragen gebündelt → Anfragen, .rueckfrage → Prüfen, .premium → Entscheiden, .werbung mit .motivFehlt → Kampagne anlegen, .faktor → Ansehen; nur Super Admin: .mails → Ansehen, .uebersetzung → Erneut starten, .schnittstelle.stockt → Ansehen); kein Kollegen-Hinweis zum Livegang (2b.9)box + kachel-Optik wie 2a 1.4 Nr. 2 (B:128–133)Regeln in jetztwichtig/zeilen.ts (2a) ergänzt um verwaltung(rolle). Zeilen für Bundesagentur, Virenprüfung (U 3.14) nur, wenn der Dienst in 3 existiert: Virenprüfung ja (2a C16), Bundesagentur nein (2b) → Zeile fehlt. Leer: T verwaltung.leer.heute / .heuteOhneFrist. Sechste Zeile: T firma.heute.undWeitere.
2Zahlenuebersicht-raster mit fünf kachel (B hat drei): T verwaltung.start.zArbeitgeber, .zBewerber, .zStellen, .zBewerbungen, .zAufrufe, je mit .vorwoche; Handy 2 + 3B:128–133, css:636–639aus fachlich/verwaltung/zahlen.ts (firmen aktiv, konten mit Bewerbung oder Datei, stellen aktiv, bewerbungen 7 Tage, zaehler_tag „stelle_aufruf“ 7 Tage). Nicht ladbar: letzte Werte mit „Stand {zeit}“ (Annahme D3: tägliche Kopie in verwaltung_zahlen_tag). Kein Diagramm, kein Monatswerte-Link (nach Livegang).
3Seit Ihrem letzten Besuchdetails zugeklappt (1b css:930–936) mit h2 T verwaltung.start.protokoll + Datum, Zusammenfassungssatz, darunter Protokollzeilen des Zeitraumsneuprotokoll seit verwaltung_konten.letzter_besuch_am; beim Öffnen der Übersicht wird der Zeitpunkt nach dem Rendern fortgeschrieben. Satz T verwaltung.start.besuchSatz (T 7.7), leer T verwaltung.leer.protokoll.

1.2 Prüfen

Dateien verwaltung/pruefen/page.tsx (Liste) und pruefen/[id]/page.tsx (eine Prüfung: neue Firma oder Meldung), Teile _liste/, _firma/, _meldung/. U 3.15, P Verwaltung Prüfen, P Lebenslauf Stelle und Meldung, FC 1, 2, 10, 21, 31.

NrBereichBausteineB-FundstelleHinweis
1Listepanel-kopf h2 „Prüfen“ + Satz „{n} offen, {m} überfällig“; Pillen Alle · Neue Firmen · Meldungen (filter-pillen, nur wenn beide Arten vorkommen); Tabelle (verwaltungsliste/, D43) mit Auswahlkästchen und den Spalten Art-Chip (status), Firma, Stelle, Ort, seit, Frist (T verwaltung.pruefen.frist), Hinweise (leise Wörter „Freemail“, T .erneut, T .rueckfrage); bei Meldungen „{n} Meldungen“ gebündelt je Anzeige; die ganze Zeile öffnet die Prüfung, kein Knopf je ZeileB:140–149, css:641–659, js:1144–1152 (ohne Monogramm, ohne Herz)Sortierung älteste zuerst, überfällige oben (P Listen). Darunter details „Automatisch freigegeben, nachprüfen ({n})“ (Zeilen mit „Prüfen“, Knopf „In Ordnung“ schließt ohne Mail). Auswahl-Leiste (2a auswahl/) für „Freigeben“ und „Als erledigt markieren“ mehrerer (P Auswählen), Rückgängig 10 s. Neue Prüfungen aus der 60-Sekunden-Abfrage nur als Zeile T gemeinsam.live.neu über der Tabelle. Satz T verwaltung.pruefen.listeSatz, Gruppe T .nachpruefen, Knopf T .inOrdnungKnopf (T 7.7). Leer: T verwaltung.leer.pruefen.
2Neue Firma: KopfZurück-Zeile, h1 T verwaltung.pruefen.firmaTitel, Chip „Neue Firma · Frist {frist}“, rechts Pfeile „Vorherige / Nächste“ (icon-btn)neu (Aufbau wie 2a 1.5 Nr. 2)Pfeile laufen durch die Liste in ihrer Reihenfolge.
3Neue Firma: linksdie Stelle als 1a-Stellenseite lesend (_stelle/* mit vorschau-Flag: ohne Bewerben, ohne Klebeleiste, ohne Werbung); darunter Firmenprofil-Kurzform (1b _profil/FirmenKopf, UeberUns, Ansprechperson)stelle.html, 1a 1.4Prüfobjekt ist die Stelle (U).
4Neue Firma: Prüfkartebox mit drei Blöcken: Firma (Name, Anschrift, Telefon als tel-Link, E-Mail des Admins, registriert am, „E-Mail bestätigt“, Nutzer n); Hinweise vom System als Sätze (aus fachlich/pruefung/hinweise.ts: Domain passt zum Firmennamen, Freemail-Liste, Vorwahl zum Ort, externe Links im Text, Text kürzer 200 Zeichen, Gehalt fehlt, gleicher Firmenname vorhanden) + Textlink „Im Handelsregister suchen“ (https://www.handelsregister.de mit Name als Suchbegriff, neues Fenster); Entscheidung: T .freigeben (btn-primary) · T .ablehnenKnopf (btn-rand) · „…“ (mehr-menue: T .frage, T .firmaSperren, „Stelle im Namen der Firma korrigieren“ → 1.4 Support)box css:74, mehr-menue B:103–112, css:634Freigeben: Aktion firmaFreigeben() → firmen.geprueft true, Stelle pruefung → aktiv, Google/Job-Alarm frei; Toast T 3.2 mit Rückgängig 10 s, Mail F10 danach; Ansicht springt zur nächsten Prüfung. Eingeklappter Satz „Die Firma bekommt diese E-Mail“ mit Vorschau (Baustein mailvorschau/, Teil 2).
5Neue Firma: Ablehnen-FensterFenster (2a fenster/, Variante mit Vorlage): Titel T .ablehnenTitel, Satz T .ablehnenHinweis, Grund-Pillen Pflicht (T .grundKeinBetrieb, .grundUnvollstaendig, .grundRegeln, .grundDoppelt; Optik filter-pillen mit aria-pressed), Feld T .satzFirma, Mail-Vorschau eingeklappt, Knopf T .ablehnenstelle.html:103–112, css:657–659Aktion stelleAblehnen(): Stelle → nachbessern (nachbessern_grund = Pillen-Schlüssel + Satz), Firma bleibt aktiv/ungeprüft, Prüfung abgelehnt; Mail F16 nach 10 s (verzögert, 2a dienste/verzoegert). Firma sieht Chip „Bitte ergänzen: {grund}“ (T 5.4) + Zeile firma.heute.nachbessern (2a 1.10); „Veröffentlichen“ (2a 1.11, C22) setzt immer pruefung mit erneut_eingereicht → neue Prüfungszeile (pruefung_art nachbesserung) mit T .erneut, auch wenn die Firma inzwischen geprüft ist oder noetig.ts sonst nein sagen würde (FC 1). Nach außen nie „unseriös“ (U 5.13: Pille intern, Mailtext aus T F16).
6Neue Firma: Frage an die FirmaFenster mit Vorlage T .frageVorlage, Knopf T .frageSendenfenster/Mail F17 mit Knopf „Antworten“ (mailto an einstellungen.betreiber.kontakt_mail_3bs, Betreff „Rückfrage {nummer}“); Prüfung → zustand rueckfrage, frist_am + 3 Werktage (Pause der Auto-Freigabe); nach 2 Werktagen Zeile verwaltung.heute.rueckfrage. Keine Antwort-Erkennung (FC 10 Vorschlag, P übernommen).
7Neue Firma: NotizFeld „Notiz (nur Verwaltung)“, speichert sofort (P Zwischenspeichern)mein-bereich.html:184–190 (Feld)pruefungen.notiz.
8Meldung: Kopf + linkswie Nr. 2/3 mit Titel der Stelle oder Firmenname, Chip „{n} Meldungen“; links die Anzeige bzw. das 1b-Firmenprofil lesend
9Meldung: rechtsKarten je Meldung (Grund T oeffentlich.melden.grundFalsch/.grundUnserioes/.grundDiskriminierend/.grundBesetzt/.grundAnderes aus T 1.3, Text, Zeit, Absender: Konto-Name · „ohne Konto, E-Mail angegeben“ · „anonym“); Block Firma (Name, seit, Stellen n, „{n} frühere Meldungen, erledigt am …“); Entscheidung: T .inOrdnung (btn-primary) · T .offlineNehmen (btn-rand, Grund-Fenster wie Nr. 5 → Stelle nachbessern + nachbessern_pille, F16; die Firma bessert nach und „Veröffentlichen“ führt immer über eine neue Prüfzeile mit erneut_eingereicht, 2a C22, auch bei geprüfter Firma) · „…“: T .stelleSperren (hart: Fenster verwaltung.sperre. mit Grund; Stelle → gesperrt, sperr_grund; Mail F22 an die Firma (T 6.4), Grund-Pillen T verwaltung.sperre.pille (T 7.7); nur Verwaltung entsperrt) · T .firmaSperren (→ 1.4 Sperren-Fenster) · T .melderAntworten (mailto, nur mit Mail)box, zeileJede Entscheidung setzt alle Meldungen der Anzeige auf erledigt/offline/gesperrt und schickt V06 an Melder mit E-Mail (FC 21). An gesperrten Stellen hier und in 1.4 Nr. 3 der Knopf T .stelleEntsperren (→ aktiv, Rückgängig 10 s; FC 2). Meldung zu einem Firmenprofil: nur „Erledigt“ und „Firma sperren“ (Annahme D4).
9aListe: Prüfung neuer Firmen an/ausim „…“ der Listen-Werkzeugleiste (mehr-menue rechts im panel-kopf, neben der Auswahl-Leiste) der eine Eintrag T verwaltung.pruefen.schalter „Prüfung neuer Firmen ausschalten“ bzw. „Prüfung neuer Firmen einschalten“, ohne Unterpunkt, für Verwaltung und Super Admin; Ausschalten mit Folgen-Satz T .schalterAusSatz und Rückgängig 10 s, Protokoll; aus: Satz T .schalterAus oben in der Liste mit Textlink „wieder einschalten“, offene Prüfungen bleiben und laufen wie bisher abmehr-menue B:103–112einstellungen.pruefung.neue_firmen; wirkt nur auf neue Veröffentlichungen.
10ZuständeStelle inzwischen beendet/gelöscht: Zeile weg, Protokoll „erledigt: Stelle beendet“, Firma bleibt ungeprüft (FC 31); geöffnet: Satz + „Nächste“. Kollege hat offen: kein Satz zum Livegang (2b.9; dann aus pruefungen.geoeffnet_von/_am, 5 Minuten). Unbestätigte Firma: kann nicht veröffentlichen (2a 1.11: Fehlertext am Knopf), darum gibt es vor konten.bestaetigt_am keine Prüfung, kein F21, kein V01.Sätze T verwaltung.pruefen.stelleWeg und .kollegeOffen (T 7.7).

Prüfung entsteht in stelleVeroeffentlichen() (2a 3.2): Die Aktion fragt fachlich/pruefung/noetig.ts; Prüfung nötig, wenn firmen.geprueft false ist UND einstellungen.pruefung.neue_firmen an UND firmen.pruefstufe = normal UND die Firma kein aktives Premium hat (premium_bis ≥ heute). Dann setzt sie zustand pruefung und ruft in derselben Transaktion fachlich/pruefung/anlegen.ts pruefungAnlegen(stelleId): Zeile in pruefungen (art neue_firma, oder nachbesserung bei erneut_eingereicht), frist_am = nächster Werktag 9:00 ab Veröffentlichung (Annahme D5), V01 in die Warteschlange; 2a legt F21 dazu. Kein Hintergrund-Hook, keine Verschiebung der Frist. Sonst geht die Stelle sofort aktiv und auch an Google und Job-Alarm, es entsteht keine Prüfung, keine Mail F21/V01/F10; Protokollzeile „ohne Prüfung veröffentlicht ({grund}: Schalter aus · Stufe ohne Prüfung · Premium)“. Da geprueft nach jeder Freigabe true ist, trifft die Prüfung in der Regel nur die erste Stelle; nach Ablehnen oder „Stelle beendet“ während der Prüfung bleibt geprueft false, und die nächste Veröffentlichung läuft wieder über die Prüfung. Automatische Freigabe nach Frist: Hintergrund pruefung-frist.ts (stündlich): Stelle aktiv, firmen.geprueft true (die Firma gilt als freigegeben, weitere Stellen gehen sofort online; F10 sagt der Firma genau das), Prüfung → auto_frei (Gruppe „nachprüfen“ als Marke für den zweiten Blick der Verwaltung; „In Ordnung“ schließt sie, „Stelle sperren“/„Firma sperren“ bleiben über 1.4 möglich), Mails F10 an Firma und V02 an Verwaltung; 2 Stunden vor Ablauf Erinnerungs-Mail an Verwaltung (U 5.20; Mail V08, T 6.5) (Annahme D27). Systemhinweise der Prüfkarte: T verwaltung.pruefen.hinweis*, Textlink T .handelsregister, Mail-Vorschau T .mailVorschau (T 7.7).

1.3 Anfragen

Dateien verwaltung/anfragen/page.tsx, anfragen/[id]/page.tsx (Kontakt oder Premium; Werbung öffnet nicht hier, sondern „Kampagne anlegen“ → 1.6). U 3.16, P Verwaltung Anfragen, P Lebenslauf Kontaktanfrage und Premium, FC 11, 25, 32.

NrBereichBausteineB-FundstelleHinweis
1Listepanel-kopf h2 „Anfragen“ + Satz „{n} offen, älteste seit {alter}“; zwei Pillenreihen T verwaltung.anfragen.art (Alle · .kontakt · .premium · .werbung) und Zustand (Offen · In Bearbeitung · Beantwortet, Standard Offen; Wörter T 5.5 status.anfrage.*); Tabelle (verwaltungsliste/, D43) mit Auswahlkästchen und den Spalten Art-Chip, Absender (Name, Firma), Rolle, erste Textzeile, seit, „übernommen von {name}“; die Zeile öffnet die Anfrage, bei Werbung steht in der letzten Spalte T verwaltung.werbung.kampagneNeuB:140–149, css:641–659Sortierung älteste zuerst (frist_am aus 1b). Auswahl-Leiste „Als erledigt markieren“. Leer: T verwaltung.leer.anfragen. Kollege bearbeitet: T verwaltung.anfragen.uebernommenVon (T 7.7). Zahl-Kreis in der Menüleiste = offene Zeilen.
2Kontaktanfrage: Kopf + TextZurück, Name, Rolle, „vor {alter}“, Pfeile; Text groß; Kontaktzeile (E-Mail, Telefon tel-Link, Einwilligung mit Datum); Zusammenhang-Satz, wenn die Mail zu einem Konto gehört („Hat ein Bewerber-Konto seit …, {n} Bewerbungen“ / „Admin von {firma}, {n} aktive Stellen“ mit Link → 1.4)neuÖffnen setzt zustand in_bearbeitung + uebernommen_von (ohne Knopf). Rückläufer-Satz (P Betrieb) erst Abschnitt 4 (mail_warteschlange Rückläufer-Felder), hier nicht.
3Kontaktanfrage: AntwortVorlagen-Pillen T verwaltung.anfragen.vorlage (vorlage.verwaltung.kennwort, .stelleNichtSichtbar, .kontoLoeschen, .allgemein aus mailvorlagen), Textfeld vorausgefüllt (Platzhalter beim Einfügen ersetzt), Knopf T .antworten (btn-primary); Textlinks T .ohneAntwort, T .anBetreiber (nur Verwaltung), „…“ im Kopf: T verwaltung.sperrliste.zurSperrliste „Zur Sperrliste“ (Verwaltung und Super Admin; öffnet das Sperrlisten-Fenster aus 1.15 mit Art E-Mail-Adresse und dem Absender vorbelegt); Notiz internformular css:546, filter-pillenAktion kontaktanfrageAntworten(): Rückgängig 10 s, dann Mail V05 (Antwortadresse betreiber.kontakt_mail_3bs), zustand beantwortet. ohneAntwort → erledigt; anBetreiber → weitergegeben + Zeile beim Super Admin (T verwaltung.heute.weitergegeben, T 7.7); Zur Sperrliste → sperrlisteEintragen() (1.15, H136): künftige Anfragen, Job-Alarme, Meldungen und Werbeanfragen dieser Adresse werden still verworfen, Registrierung und Anmelden zeigen die neutrale Meldung (Annahme D6).
4Premium-AnfrageKopf Firma, „angefragt vor {alter}“, Link → 1.4; Karte: Stellen der Firma (n aktiv, Titel), frühere Premium-Phasen, Nachricht der Firma, Ansprechperson mit Telefon; Laufzeit höchstens 90 Tage je Freischaltung; · Textknopf T .angebotGeschickt (danach T .angebotGeschicktAm + T .angebotZuruecknehmen) · T .premiumAblehnen (btn-rand, Fenster mit Grund-Pillen Pflicht „Zurzeit nicht möglich“ · „Firma noch zu neu“ · „Sonstiges“ + Satz + Vorschau + „Ablehnen und E-Mail senden“)formular, boxAktion premiumFreischalten(): firmen.premium_bis, firmen.top_plaetze, premium_phasen-Zeile mit betrag_netto, premium_anfragen → freigeschaltet; Toast mit Rückgängig 10 s, dann F11. Ablehnen → abgelehnt, F12 nach 10 s. Premium schon aktiv: Hauptknopf T verwaltung.anfragen.verlaengernBis. Grund-Pillen T verwaltung.anfragen.premiumPille* (T 7.7).
5Werbeanfrage in der ListeZeile zeigt Firma, Fläche + Zeitraum („Startseite, 14 Tage ab 3.11.“), „Motiv hochgeladen“ oder „Motiv folgt per E-Mail“, Knopf „Kampagne anlegen“ → /verwaltung/werbung/neu?anfrage=Anfrage → zustand uebernommen; die Kampagne ist das Ding (U 3.16). FC 32: Knopf heißt „Kampagne anlegen“, T 7.3 verwaltung.heute.werbung stimmt damit.

1.4 Firmen und Nutzer

Dateien verwaltung/firmen/page.tsx (Suche + Liste), firmen/[id]/page.tsx (Firmenansicht), personen/[id]/page.tsx (Bewerberansicht), Teile _suche/, _firma/, _person/. U 3.17, P Verwaltung Firmen und Nutzer, P Lebensläufe Firma, Nutzer, Bewerberkonto, FC 3, 9, 14.

NrBereichBausteineB-FundstelleHinweis
1Suche + Listeh2 „Firmen und Nutzer“, eingabe mit Fokus T verwaltung.firmen.suche (ab 3 Zeichen, Server-Aktion suchen() über Firmenname, Nutzername, E-Mail, Stellentitel; ohne JS: GET-Formular); Pillen Rolle (Alle · Firmen · Firmennutzer · Bewerber) und Zustand (Alle · Aktiv · Gesperrt · Unbestätigt = firmen.bestaetigt_am bzw. konten.bestaetigt_am leer); Tabelle (verwaltungsliste/, D43; ohne Auswahlkästchen, es gibt keine Sammelaktion) je Rolle mit eigenen Spalten: Firma: Monogramm/Logo, Name, Ort, Stellen ({m} aktiv), Nutzer, Zustand-Chip (T 5.5 status.firma. + „Premium bis {datum}“), zuletzt aktiv; Bewerber: Initialen, Name, E-Mail, Bewerbungen, Chip status.konto., zuletzt aktiv; Firmennutzer: Name, E-Mail, Firma, Rolle; ganze Zeile ist Linkunternehmen.html:102–107 (Suchfeld, css:1271), B:140–149Ohne Suche: zuletzt aktiv, 25 je Seite, „Mehr laden“ (1a MehrLaden). Leer: T verwaltung.firmen.leer (T 7.7), nach Suche T verwaltung.leer.suche. Rechts oben Knopf T verwaltung.firmen.anlegen (btn-rand, siehe Nr. 1a).
1aFirma anlegen (Verwaltung)Fenster (2a fenster/): Felder T .anlegenName, .anlegenOrt (PLZ + Ort wie 2a Registrierung), .anlegenPerson, .anlegenMail (erste Admin-Person), Knopf T .anlegenKnopfneu (Felder wie 2a Firmen-Registrierung)Für Firmen, die Bululu selbst aufnimmt (COPLA Burg, Import): Firma bestätigt und geprüft (geprueft_von = Verwaltungskonto), Einladung mit Rolle Admin über 2a team.ts, aber mit der eigenen Mail F02b „Ihr Firmenbereich für {firma} bei Bululu ist eingerichtet“, Toast T .anlegenOk, Sprung in die Firmenansicht; die eingeladene Person legt Konto oder meldet sich an und ist Admin. Gleiche Firma (Name + PLZ) schon da → Satz mit Link statt Anlegen. Nomad 26.10.
2Firmenansicht: KopfLogo, Name, Ort, Chips (Zustand, Premium bis, registriert am, „Unbestätigt seit {n} Tagen“ (bestaetigt_am leer) + Knopf „Bestätigungs-Mail erneut senden“ (F01), „Schnittstelle aktiv“ T verwaltung.schnittstelle.chip); die Prüfstufe liegt nicht im Kopf, sondern in der zugeklappten Karte „Einstellungen dieser Firma“ direkt darunter; Support-Leiste rechts: T verwaltung.firmen.imNamenVon (btn-rand) · „Sperren“/„Entsperren“ (Textlink, T verwaltung.sperre.knopf/.entsperren) · „…“: Premium freischalten/beenden (Fenster wie 1.3 Nr. 4; Beenden → premium_bis heute, F13 sofort, FC 25) · T .nutzerUmhaengen · „Neuen Admin ernennen“ (Verwaltung und Super Admin, nur bei einer Firma ohne aktive Admin-Person: Fenster mit Nutzer-Auswahl oder E-Mail, Grund-Feld; H146) · „Firma löschen“ (nur Super Admin, Fenster mit Kennwort, Export-ZIP vorher, Folgen-Satz; Aktion aus 2a fachlich/firma/loeschen.ts, F18)bereich-kopf__zeile B:96–112, mehr-menue, check (Schalter)Kein farbiger Knopf (U). Sprungmarken Stellen · Nutzer · Bewerbungen · Protokoll · Notizen (Textlinks, keine Reiter).
2aFirmenansicht: Karte „Einstellungen dieser Firma“details T verwaltung.firmen.einstellungenKarte, zugeklappt, direkt unter dem Kopf, eine Zeile: solange firmen.geprueft false ist: T verwaltung.firmen.pruefstufe „Diese Firma vor der ersten Stelle prüfen“ mit Pillen „Ja“ · „Nein“ (aria-pressed, speichert sofort, Protokoll mit Grund-Satz freiwillig); bei aktivem Premium Satz T .pruefstufePremium „Premium-Firmen werden nicht geprüft.“ statt der Pillen; Chip T .pruefstufeChip „Ohne Prüfung“ in der Firmenliste nur bei Stufe ohne und noch nicht freigegeben; ist die Firma freigegeben (geprueft true), steht dort statt der Pillen nur der Satz T .pruefstufeFreigegeben „Freigegeben am {datum}. Weitere Stellen gehen sofort online.“details wie 2a Einstellungenfirmen.pruefstufe; Verwaltung und Super Admin. Offene Prüfung der Firma wird beim Umschalten auf „Ohne Prüfung“ zu freigegeben wie bei H95, mit F10 an die Firma (sie erfährt so, dass ihre Stelle jetzt bei Google und im Job-Alarm ist); Protokoll pruefstufe_geaendert.
3Firmenansicht: StellenListe wie 2a 1.11 Nr. 1 lesend (Status-Chip, Restlaufzeit, Bewerbungszahl); Zeile öffnet /stelle/[adresse]?vorschau= (2a) lesend; an gesperrten Stellen Knopf T verwaltung.pruefen.stelleEntsperren (Rückgängig 10 s); Schnittstellen-Stellen mit T firma.stellen.gepflegtExternB:140–149, js:1144Änderungen nur über Support-Modus.
4Firmenansicht: NutzerTabelle (verwaltungsliste/) je Nutzer: Name, E-Mail, Rolle-Chip, „Anmeldung geschützt ✓/–“, zuletzt angemeldet, Chip „Rücksetzung läuft, Link am {datum} {uhrzeit}“ + Textlink „Abbrechen“; „…“: T verwaltung.firmen.kennwortLink · T .faktorZuruecksetzen · T .mailAendern „E-Mail-Adresse ändern“ (H135, Ablauf unter 1.4a) · „In andere Firma umhängen“ · „Rolle ändern“ · „Entfernen“ (fehlt beim letzten Admin); über der Liste Knopf T verwaltung.firmen.nutzerEinladen (E-Mail + Rolle Admin/Recruiter + Grund-Feld Pflicht → 2a team.ts, Mail F02 mit {einladender} = „Bululu“, angelegte Konten ohne Kennwort als Zeilen „wartet auf Kennwort“ mit „Zurückziehen“, wie 2a 1.14). Einladen und Umhängen durch die Verwaltung: nur mit Grund, Protokoll, und Mail F02a „Bululu hat {name} als {rolle} in Ihr Team eingeladen“ an alle Admins der Zielfirma; Umhängen ist eine Einladung, die die Person annimmt (F02), kein stilles Anhängen; Rolle Admin nur bei einer Firma ohne aktive Admin-Person (H146), sonst RecruiterB:140–149Kennwort-Link: A01 sofort, Toast T verwaltung.ok.linkGesendet („gültig 1 Stunde“ steht in A01). Chip während der Wartezeit T verwaltung.firmen.faktorChip + .faktorAbbrechen, Umhängen-Satz T .umhaengenSatz, gelöscht T .geloeschtChip (T 7.7). Faktor zurücksetzen: Fenster mit drei Sätzen (Codes-Hinweis, Pflicht-Haken T .faktorIdentitaet, Grund-Feld). Bei faktor.art app: Knopf „Zurücksetzen in 24 Stunden per Link“ → faktor_ruecksetzungen (Teil 3), sofort A08 mit „Abbrechen“ (/konto/faktor-reset/abbrechen?t=: Seite zeigt an, Knopf „Zurücksetzen abbrechen“ per POST → Zielseite „Zurücksetzen abgebrochen“, Protokoll), nach 24 h A04 mit /konto/faktor-reset?t= (Seite zeigt an, Knopf „Schutz neu einrichten“ per POST löscht die faktor-Zeile, Konto meldet sich ohne Faktor an und richtet ihn neu ein; FC 9; _planung/sicherheit.md Nr. 29). Bei faktor.art mail: Knopf „Zurücksetzen per Link“ ohne Wartezeit, sofort A04, kein A08. Rolle ändern/Entfernen/Umhängen → 2a fachlich/firma/team.ts mit Verwaltungs-Protokoll; Umhängen-Fenster: Zielfirma per Suche, Folgen-Satz, Rolle Recruiter als Standard.
5Firmenansicht: Bewerbungennur Zahlen je Stelle („{stelle}: {n}, davon {m} neu“), keine Namen; Textlink T verwaltung.firmen.unterlagenOeffnen → Grund-Fenster (T .unterlagenFrage, Pillen T .unterlagenSupport, .unterlagenMeldung, Satz T .unterlagenSatz, Knopf T .unterlagenKnopf) → danach Liste der Bewerbungen dieser Firma lesend mit Datei-Download (2a /api/datei mit Rolle Verwaltung + Grund)boxÖffnen durch die Verwaltung setzt nie „Gesichtet“ und schreibt kein geoeffnet_am (FC 14: status.ts prüft Rolle). Jeder Datei-Zugriff → protokoll (aktion datei_geoeffnet, grund). Die Freigabe gilt 60 Minuten (support_sitzungen, Annahme D7).
6Firmenansicht: Protokoll, Notizenol Protokollzeilen (protokoll, firma_id), neueste zuerst, 50 + „Mehr“ (H129; Bewerberansicht ebenso mit konto_id); Notiz-Feld speichert sofort (firmen.notiz_verwaltung)Namen handelnder Super-Admin-Konten zeigt die Verwaltung als „Betreiber“ (T protokoll.betreiber, anzeigeName() Teil 2, D39); gilt überall, wo eine Verwaltungsperson genannt wird (Protokoll, „In Bearbeitung von“, „Gesperrt seit … von“, „von {name}“ in der Sperrliste, „Seit Ihrem letzten Besuch“).
7Sperren-Fenster (Firma)Fenster T verwaltung.sperre.titel, Grund-Pillen Pflicht aus der gemeinsamen Liste fachlich/sperre/gruende.ts, Satz T .grund, Haken T verwaltung.sperrliste.ipHaken „Auch die zuletzt genutzten IP-Adressen sperren ({anzahl} aus den letzten 30 Tagen, 7 Tage lang)“ mit Folgen-Satz T .ipHakenFolge darunter, Mail-Vorschau eingeklappt, Knopf „Sperren und E-Mail senden“fenster/Aktion firmaSperren(): firmen.zustand gesperrt, sperr_grund, gesperrt_von/_am; mit Haken je IP eine Sperrlisten-Zeile (art ip, 7 Tage, Grund Betrug/Spam „mit Sperre von {firma}“, H136; wirkt nur auf Registrieren und Formulare ohne Konto); Stellen offline (1a Sichtbarkeit prüft Firma), Firmennutzer sehen fehler.gesperrt.firma (2a), Bewerber sehen 410 (1b 1.3) und in ihrer Bewerbung den Satz fehler.postfach.firmaGesperrt (2a 1.5 Nr. 3); Rückgängig 10 s, dann F14. Entsperren: zustand aktiv (bzw. entsperrt-Marke im Protokoll), Stellen wieder online, F15. Chip „Gesperrt seit {datum} von {name}: {grund}“.
8BewerberansichtName, E-Mail, Telefon, registriert, Zustand-Chip status.konto.*, „{n} Bewerbungen ({m} offen)“, Job-Alarme n, Einwilligungen (Art, Datum, Textfassung aufklappbar; aus 2a einwilligungen); Aktionen (btn-rand/Text): Kennwort-Link senden · Zweiten Faktor zurücksetzen (wie Nr. 4) · E-Mail-Adresse ändern (wie Nr. 4, 1.4a, H135) · Sperren (Fenster wie Nr. 7; der IP-Haken erscheint nur bei Grund Betrug/Spam, liest anmeldungen dieses Kontos, Mail B18) / Entsperren (B19) · Daten exportieren (2a export.ts, A05 an die Person) · Konto löschen (nur Super Admin, Kennwort der Verwaltungsperson, 2a loeschen.ts, A06) · „Öffnen (mit Grund)“ → Lebenslauf-Datei und Bewerbungen lesendmein-bereich.html:184–192 (Feldoptik)Sperre: konten.zustand gesperrt, Anmelden → fehler.gesperrt.konto (2a); offene Bewerbungen bleiben bei den Firmen sichtbar, Postfach schreibgeschützt mit Satz T konto.postfach.kontoGesperrt (T 7.7; FC 3). Firma gelöscht: 30 Tage mit Chip „Gelöscht, Export vorhanden“, nur Super Admin, lesend (firmen.geloescht_am aus 2a).

1.4a E-Mail-Adresse ändern

Zum Livegang ändert nur die Verwaltung die Adresse eines bestätigten Kontos (Firmennutzer und Bewerber; wer den Arbeitgeber wechselt, verliert sonst Bewerbungen und Postfach). Selbstbedienung in den Einstellungen bleibt Idee für 2b (Plan Ideen); die Einstellungen zeigen die Adresse lesend und nennen den Weg „rufen Sie uns an oder schreiben Sie uns“, die Kontaktseite hat das Anliegen „E-Mail-Adresse ändern“ vorwählbar (1b Kontakt, Parameter anliegen=adresse). Ablauf: Fenster (2a fenster/, Variante aus grundfenster/) mit Feld „Neue E-Mail-Adresse“ (T verwaltung.firmen.mailAendernNeu), Pflicht-Haken „Identität geprüft“ (T .mailAendernIdentitaet, dieselbe Prüfung wie beim Faktor-Zurücksetzen, Nr. 4), Grund-Feld (Pflicht), Knopf „Link an die neue Adresse senden“ (T .mailAendernKnopf). Aktion mailAendernBeantragen(kontoId, neueMail, grund) in fachlich/konto/mailAendern.ts: vergeben → fehler.feld.mailVergeben (T 4.2); sonst konto_tokens (2a) zweck adresse_neu mit wert = neue Adresse, 24 Stunden; sofort Mail A10 „Neue E-Mail-Adresse bestätigen“ an die neue Adresse (Link) und A11 „Ihre E-Mail-Adresse wird geändert“ an die alte; Protokoll mail_aenderung_beantragt mit Grund. Bis zur Bestätigung gilt die alte Adresse, und solange eine Adressänderung offen ist oder in den letzten 24 Stunden widersprochen wurde, lehnt der Server Kennwort-Link und Faktor-Rücksetzung für dieses Konto ab (fehler.konto.adresseOffen); Chip am Nutzer T .mailAendernChip „Neue Adresse {mail} wartet auf Bestätigung bis {datum}“. Zielseite /konto/adresse-bestaetigt?t= (1.12): GET zeigt nur „Fast geschafft: noch ein Tipp“ mit Satz „Danach melden Sie sich mit {mail} an.“ und einem Knopf „Ja, {mail} ist meine Adresse“; erst der POST ruft mailAendernBestaetigen(token) (_planung/sicherheit.md Nr. 29): schreibt konten.mail um, beendet alle Sitzungen des Kontos, Protokoll mail_geaendert, Mail A02-ähnlich entfällt (A11 war die Sicherheitsmail); Satz T konto.adresseBestaetigt.titel/.text, Knopf „Anmelden“. Abgelaufener Token → T 4.4 fehler.token.abgelaufen (vorhanden). Rechte: Verwaltung und Super Admin; Firmen-Admins haben diesen Weg nicht (sie entfernen und laden neu ein).

1.5 Support-Modus „Im Namen von“ (im Firmenbereich 2a)

Kein eigener Bildschirm: Knopf T verwaltung.firmen.imNamenVon öffnet ein Fenster (T .grundFrage, Pillen „Telefon-Support“ · „Fehler beheben“ · „Stelle auf Wunsch der Firma anlegen“ · „Prüfung“, Satz; Pillen T verwaltung.firmen.supportPille*, T 7.7) → Aktion supportStarten(firmaId, grund) schreibt support_sitzungen (Ende +60 Minuten) und setzt sitzungen.firma_id + sitzungen.support_id; danach Weiterleitung auf /firma. Das 2a-Layout (firma)/layout.tsx zeigt bei support_id die Leiste support-leiste über dem Kopf (volle Breite, nicht schließbar; T verwaltung.firmen.leiste, Knopf T .leisteBeenden; Optik Orange --orange-50/--orange-dunkel css:14/16, neuer Baustein mit vorhandenen Werten, U 3.17) und darf() (2a) blendet Einladen, Zusage, Absagen, Nachricht senden, Notizen (lesen und schreiben; der Notiz-Block fehlt im Support-Modus ganz), Team, Firma löschen und Premium anfragen aus (Satz an der Stelle: T verwaltung.firmen.supportGesperrt, T 7.7; Zeile bei der Firma danach T firma.heute.supportHinweis). Jede Änderung → protokoll (support_id, grund) und als Zeile im Firmenbereich der Firma (T firma.heute.supportHinweis, T 7.7; Quelle: protokoll mit support_id, gezeigt in 2a 1.10 „Heute zu tun“ als Information ohne Knopf, Annahme D8). Ende: „Beenden“ oder Hintergrund nach 60 Minuten (sitzungen.support_id leer, firma_id leer). Verwaltungskonten haben nie firmen_nutzer-Zeilen (Annahme D9).

1.6 Werbung (Mindestteil)

Dateien verwaltung/werbung/page.tsx (Kampagnen), werbung/neu/page.tsx?anfrage= und werbung/[id]/page.tsx (dasselbe Formular), werbung/flaechen/page.tsx; Teile _liste/, _formular/, _flaechen/. U 3.18 Mindestteil, P Werbekunde, P Lebenslauf Werbeanfrage, FC 4, 20.

NrBereichBausteineB-FundstelleHinweis
1Kampagnen-Listeh2 „Werbung“ + Satz „{n} laufen, {m} geplant, {k} Anfragen offen“; Gruppen (keine Pillen bis 8): Braucht Aufmerksamkeit (Anfrage ohne Kampagne, Start ≤ 3 Tage ohne Motiv, endet ≤ 3 Tage) · Läuft · Geplant · Beendet (details mit Zahl); je Gruppe eine Tabelle (verwaltungsliste/, D43): Kunde, Fläche + Format in Kundenwörtern, Zeitraum, Zustand-Chip (T 5.5 status.werbung.*), T verwaltung.werbung.zaehlung bei Läuft/Beendet, rechts ein Knopf: Anfrage → „Kampagne anlegen“ · Motiv fehlt → T verwaltung.werbung.motivAnfordern „Motiv anfordern“ (sendet W06 an den Kunden, einmal je Kampagne, danach Satz „angefordert am {datum}“; H130) · Beendet → „Bericht senden“ nur bei fehlgeschlagenem Versand; „…“ oben rechts: T .flaechen, T .ohneAnfrageB:140–149, details 1bZustände Angebot/Angenommen/Motiv da setzt die Verwaltung von Hand im Formular (P Lebenslauf: „zum Livegang trägt Nomad den Zustand von Hand ein“); „läuft“ und „beendet“ setzt das Datum (Hintergrund). Satz T verwaltung.werbung.satz, Chip T .wartetMotiv, Kollision T .kollision, Flächen-Schalter T .eigenwerbung / .flaecheAktiv / .freiAb (T 7.7). Leer: T verwaltung.leer.werbung.
2Kampagne (Formular)formular box zweispaltig mit Vorschau rechts (editor-layout B:166–194): Felder T verwaltung.werbung.kunde (Name, Firma, E-Mail, Telefon; aus werbung_anfragen vorbelegt), T .preisNetto (Pflicht, bevor der Zustand „angenommen“ gesetzt wird; vorbelegt aus einstellungen.preise je Fläche und Woche, nach unten nur mit Grund;, T .flaeche (select aus werbung_flaechen: Start · Trefferliste · Suchbegriffe · Seitenleiste · Stellenseite · Ratgeber, K:49–86), Format (aus der Fläche abgeleitet, Maße stehen dran), T .zeitraum (von/bis, Kollision mit anderer Kampagne derselben Fläche als Satz am Feld, keine Sperre), T .motiv: Ablage (2a ablage/, T .motivHochladen: JPG, PNG, WebP, GIF bis 2 MB; der Browser prüft die Maße vor dem Hochladen als Satz und kodiert JPG/PNG/WebP neu (Metadaten weg), GIF bleibt unverändert; der Server prüft Typ, Größe, Maße und Viren und speichert ohne Neukodierung (2a C35, N-2); Textanzeige für Trefferliste/Suchbegriffe: Felder Firma, Titel, Text, Knopf mit Zeichengrenzen aus K:99), T .zielseite (https, Pflicht), T .vorlesetext (Pflicht), T .zustand (select status.werbung.*), Notiz intern; rechts Vorschau der Fläche (1a Werbeflaeche mit dem Motiv, Gerät umschaltbar); unten Zählung je Tag als Tabelle (bei Läuft/Beendet) und Protokoll; Knöpfe: „Speichern“ fällt (speichert je Feld sofort, P Zwischenspeichern) · T .starten „Kampagne planen“ (setzt geplant, prüft Pflichtfelder) · „…“: T .beenden (Rückgängig 10 s, dann W05 wie am Ende)B:156–194, stelle.html:126–143, K:49–86, 99Angebot, Motivprüfung, Posten, Belegungs-Zeitleiste, Pausieren, Verlängern, Stornieren, Zwischenstand: 2b (Schlüssel bleiben in T 1.9 ungenutzt). Werbung erscheint, wenn zustand geplant/laeuft, Motiv vorhanden, heute im Zeitraum (fachlich/werbung/aktiv.ts), sonst Platzhalter/Eigenmotiv (1a W6, U 3.18 „Eigenwerbung wenn frei“).
3Flächen und Belegungsechs box-Karten aus werbung_flaechen: Seite, Formate mit Maßen, Geräte, Belegung der nächsten 60 Tage als Zeilenliste (Kunde, Zeitraum; keine Zeitleiste im Mindestteil, Annahme D10), „Frei ab {datum}“; je Fläche Schalter „Wenn frei: Eigenwerbung zeigen“ (Standard an; aus = Fläche verschwindet, 1a Werbeflaeche liest eigenwerbung) und „Fläche aktiv“ (nur Super Admin; aus = nicht im Konfigurator)box, check css:563Regeln je Fläche nur lesend als Satz.
4ZählungEinblendung zählt der Server beim Rendern der Fläche (ohne Cookies, ohne IP; zaehler-Muster 1a), Klick über /api/w/[id] (Weiterleitung 302 auf zielseite, zählt werbung_zaehlung_tag.klicks)1a zaehler/Motiv-Link im Markup = /api/w/[id], rel „sponsored noopener“.

Hintergrund werbung-lauf.ts (täglich 00:05): geplant + start ≤ heute + Motiv → laeuft + W04; laeuft + ende < heute → beendet + W05 mit Zahlen; geplant ohne Motiv am Starttag → Chip „wartet auf Motiv“ + Zeile bei der Verwaltung; der Zeitraum verschiebt sich nicht von selbst: Nomad schickt W08 von Hand (Textvorlage aus mailvorlagen im Mailprogramm) und trägt den neuen Zeitraum im Formular ein (2b automatisch, dann auch W07). W04 am Starttag (T 6.6), nicht am Vortag (FC 20: T gilt, U 3.22 M4 weicht ab; Annahme D11).

1.7 Werbung planen (öffentlich, Werbekunde)

Datei (oeffentlich)/fuer-arbeitgeber/werbung/page.tsx · Teile _planung/ (Client-Baustein Werbeplanung.tsx aus dem B-Konfigurator, Stil b). U 3.21/3.23 (FC 13: U 3.21 gilt = sechs Flächen, Format abgeleitet, Laufzeit-Pillen 7/14/30 + Wunsch-Start, Textanzeige-Felder; T 1.10 werbung.* vorhanden, keine aktive Fläche T werbung.keineFlaeche, T 7.7), 1b 1.4 Nr. 6 (Knopf-Ziel), 1a W6 (Flächen-Platzhalter verlinken hierher). Schritte: 1 Fläche(n) wählen (Karten aus werbung_flaechen aktiv, Vorschau in der Nachbildung K vorschau()), 2 Format/Laufzeit/Wunsch-Start/Motiv (Ablage 2a, oder „Motiv folgt per E-Mail“, oder Textanzeige-Felder), 3 Kontakt (Name, Firma, E-Mail, Telefon, Datenschutz-Haken, Zusage-Satz „Angebot innerhalb eines Werktags“), Knopf „Unverbindlich anfragen“ (T werbung.anfrageSenden). Keine Beträge (P Werbekunde; PREISE und Rechner aus K entfallen). Aktion werbeanfrageAnlegen() → gesperrte Adresse oder IP (gesperrt() in dienste/sperrliste.ts, 1.15) → Erfolg ohne Datensatz; sonst werbung_anfragen (zustand anfrage, frist_am + 1 Werktag) + dateien (zweck werbemotiv, konto_id leer, anfrage_id gesetzt) → Mails W01 (Kunde, mit Vorschaubild als Anhang: Annahme D12 = Miniatur der Nachbildung, erzeugt beim Senden aus dem Motiv; ohne Motiv kein Bild) und V04 (Verwaltung); Zielseite T 3.3 „Werbeanfrage gesendet“ mit Frist-Satz. Honigfeld + Bremse (1b). Ohne JS: Schritte als POST-Seiten (Muster 2a W1 A).

1.8 Anzeige melden (öffentlich)

bausteine/melden/MeldenDialog.tsx (Client, Fenster 2a fenster/) an Stelle (1a 1.4 Nr. 12 „Anzeige melden“ am Seitenende; der in 1a weggelassene Knopf kommt jetzt) und Firmenprofil (1b 1.3; Textlink „Firma melden“ unter den Eckdaten): Grund-Pillen Pflicht aus T 1.3 (oeffentlich.melden.grundFalsch · .grundUnserioes · .grundDiskriminierend · .grundBesetzt · .grundAnderes; Titel, Text, Mail-Feld und Knopf oeffentlich.melden.titel/.text/.mail/.senden, Firmenprofil .firma), Textfeld freiwillig (2.000 Zeichen), E-Mail freiwillig (angemeldet: Konto-Mail vorbelegt), Knopf „Meldung senden“; Erfolg T oeffentlich.stelle.meldenGesendet + .meldenGesendetText (T 7.7). Aktion meldungAnlegen() → meldungen (gemeldet) + V03 an Verwaltung (je Person abschaltbar) + Zeile in Heute zu tun; Bremse 3 je Stunde und Adresse/IP-Hash, Honigfeld. Ohne JS: /stelle/[adresse]/melden als POST-Seite.

1.9 Premium im Firmenbereich (2a ergänzt)

In 2a 1.11 Nr. 1 vorbereitet: Zeilen-„…“ bekommt „Premium anfragen“ (nur Admin, T firma.stellen.premiumAnfragen; nur wenn funktionen.premium an und kein premium_bis ≥ heute und keine offene Anfrage) → kleines Fenster (freiwilliger Satz, Knopf „Anfragen“) → premium_anfragen (angefragt) + V04 (Premium) an Verwaltung; Firma sieht Zeile firma.heute.premiumAngefragt („Premium angefragt am {datum}, Bululu meldet sich“, vorhanden in T 7.2; FC 25). Mit premium_bis ≥ heute: Haken „Als Top-Stelle“ im Stellenformular und Satz „{belegt} von {top_plaetze} Top-Plätzen belegt“ (T 1.8 prüfen); sind alle belegt, fehlt der Haken an den übrigen (P Lebenslauf Premium). 1a topStellen() liest stellen.top + firmen.premium_bis (unverändert). Ablauf: 5 Tage vorher Zeile T firma.heute.premiumAblauf (T 7.2), am Tag F13 (Hintergrund premium-ablauf.ts), stellen.top bleibt gespeichert, wirkt nicht.

1.10 Inhalte als einfache Formulare

Datei verwaltung/inhalte/page.tsx (eine Liste mit Art-Pillen Fachbereiche · Mailvorlagen · Ratgeber · Rechtstexte · Seitentexte, T verwaltung.inhalte.*), inhalte/fachbereiche/[id]/page.tsx, inhalte/[art]/[id]/page.tsx. U 3.19, aber zum Livegang ohne Tiptap-Editor (Zeitplan 2b „Text-Editor … bis dahin pflegt Nomad sie“). Die beiden Hilfe-Artikel (1b 1.6, Rubrik „Hilfe“: hilfe-bewerber, hilfe-betriebe) werden hier wie Ratgeber gepflegt, drei Sprachen. Was 3 baut (Annahme D13, „Inhalte als einfache Formulare“ laut Zeitplan):

NrArtFormularHinweis
1FachbereicheListe: Name, Stellen (n aktiv), Job-Alarme (n), Suchbegriffe (Zahl + erste drei), Zustand (Aktiv · Ausgeblendet · Zusammengeführt); über der Liste der Satz T verwaltung.fachbereiche.rasterHinweis, wenn die Zahl der aktiven Fachbereiche auf dem Handy einspaltig würde (ungerade; 1b D-11, Regel „keine allein stehende Kachel“); geöffnet: Name je Sprache (de/en/tr/ar Felder), Suchbegriffe je Sprache als Chips (fachbereiche.begriffe, 1a), Schalter „Auf der Startseite zeigen“ (angezeigt_auf_start), Symbol (select aus 1b KAT_ICON-Schlüsseln); Aktionen: T verwaltung.inhalte.zusammenfuehren (btn-rand, Fenster mit Ziel-Auswahl + Folgen-Satz „{n} Stellen, {m} Job-Alarme und {k} Suchbegriffe wandern nach „{ziel}“. Der Name bleibt als Suchbegriff.“ → „Zusammenführen“, Rückgängig 10 s, dann unumkehrbar) · „Ausblenden“ (Text, nur bei 0 Stellen) · „…“: „Neuer Fachbereich“Aktion fachbereichZusammenfuehren(): stellen.fachbereich_id, job_alarme.fachbereich_id umhängen, begriffe vereinigen + alter Name, zustand zusammengefuehrt + zusammengefuehrt_in (1a Felder). Keine Mail an Firmen. Reihenfolge-Pfeile (U) erst mit „feste Reihenfolge“: nicht gebaut (Ideen).
2MailvorlagenListe: Name aus Nutzersicht, Satz wann sie geht, geändert von/wann; geöffnet: Betreff-Feld, Text als einfaches Textfeld (Absätze, Platzhalter als {vorname}-Chips über dem Feld zum Einfügen; Pflicht-Platzhalter nicht löschbar: Satz), „Vorschau mit Beispieldaten“ (rechte Spalte wie Stellenformular), „Testmail an mich“, Knopf „Veröffentlichen“ (btn-primary) + „Entwurf gespeichert {uhrzeit}“Tabelle mailvorlagen (Teil 3) überschreibt die Vorlagen aus dienste/mail/vorlagen/ (1b/2a) nur im Textteil (Betreff, Absätze); Rahmen bleibt Code. Nur de. Vorlagen für Firmen (vorlage.firma.) und Verwaltung (vorlage.verwaltung.) ebenso.
3Ratgeber, Rechtstexte, SeitentexteListe mit Zustand-Chip (Online · Entwurf · „Übersetzung veraltet (EN, TR)“ aus inhalte_fassungen.quelle_geaendert_am); geöffnet: Titel, Teaser, Rubrik, Bild (Ablage 2a, Zweck ratgeberbild → dateien mit konto_id leer; der Browser verkleinert auf 1.600 px und kodiert WebP (2a verkleinern.ts, C35), der Server prüft nur; öffentlich über /api/datei/[id] sobald der Inhalt veröffentlicht ist (2a ausliefern.ts Fall „öffentlich“); inhalte.bild_datei_id, Teil 3; der Pfad inhalte.bild aus dem 1b-Einspielskript bleibt Rückfall), Textfeld als bereinigtes HTML im Textfeld (1b inhalt/bereinigen.ts beim Speichern; kein Editor, Annahme D13), Sprach-Pillen DE · EN · TR (Fassung je Sprache), „Vorschau“ (btn-rand, öffnet die 1b-Seite mit ?vorschau=), „Veröffentlichen“; Rechtstexte zusätzlich: Fassungen-Liste (inhalte_fassungen_historie, Teil 3), Nachfrage-Fenster vor dem Veröffentlichen (einzige Rückfrage, U 3.19), kein Löschen; Ratgeber: „Neuer Artikel“, Löschen mit Papierkorb 30 Tage (geloescht_am) + Rückgängig 10 s; Seitentexte: Satz „steht auf {seite}, Block {block}“ mit Link„Automatisch übersetzen“, „Als geprüft markieren“: 2b (Stellen übersetzt die Hintergrundaufgabe aus Karte 2a 1.18; Inhalte werden nicht automatisch übersetzt, Nomad pflegt die Fassungen). Entwurf 14 Tage → Zeile Heute zu tun der Person (T verwaltung.inhalte.entwurfAlt, T 7.7). Weitere Sätze T verwaltung.inhalte.* (T 7.7).

1.11 Einstellungen (Super Admin; die Verwaltung sieht nur Nr. 7)

Datei verwaltung/einstellungen/page.tsx · Teile _einstellungen/ je Karte (Client). Acht details-Karten (1b css:930–936), nur die erste offen; jede Einstellung wirkt sofort (Toast + Protokoll), gefährliche mit Rückgängig 10 s und Folgen-Satz. Verwaltung (3BS): die Seite zeigt nur Karte Nr. 7 (Verwaltungskonten der eigenen Stufe, H150); die Karten 1 bis 6 und 8 stehen nicht im Markup und werden nicht als gesperrt gezeigt (D39); eine Aktion dieser Karten per direktem Aufruf → 403 mit fehler.rechte.betreiber „Dafür ist der Betreiber zuständig.“ + Knopf „Zur Übersicht“ (2a Fehlerseite Fall Rechte). U 3.20.

NrKarteInhaltHinweis
1Funktionen (T verwaltung.einst.freischaltungen)je Funktion check-Schalter + Satz: lebenslaufBaukasten, mappePdf, deckblatt, kiTexte, uebersetzung, premium, werbung (einstellungen.funktionen, 1a/2a)Aus → Oberfläche verschwindet (1a istFrei). Folgen-Satz mit Zahl im Rückgängig-Toast.
2Fristen (T .fristen)Zeilen „Name · Wert · Standard · Zurück auf Standard“: Prüffrist (prueffrist_werktage 1), Kontaktanfrage-Frist (kontaktanfrage_werktage 1), Stellenlaufzeit (laufzeit_tage 30), Ablauf-Mail (ablauf_mail_tage 5; auch B13), Bewerbungsentwurf (entwurf_tage 7), Bewerbung ohne Antwort der Firma abschließen, Premium-Standardlaufzeit (premium_tage 30), Top-Plätze je Freischaltung (top_plaetze_standard 3), Papierkorb (papierkorb_tage 30; Verwaltung, Firma und Bewerber, 2a 1.17), Pausierte Stelle: offene Bewerbungen abschließen (pausiert_abschluss_monate 6, 2a 1.11 Nr. 4), Rückgängig-Sekunden (10), Löschfristen (bewerbung_monate 6, konto_inaktiv 24 + 3, job_alarm_monate 12, protokoll_monate 12, konto_unbestaetigt_tage 30, anmeldungen_tage 30, geraete_monate 12), Sperrliste Standardfrist (sperrliste_tage_ip 7 für IP-Adressen und IP-Bereiche, sperrliste_tage_standard 30 für E-Mail und Domain; 2a-Sitzungen bleiben von IP-Einträgen immer unberührt), Sitzungen (sitzung.bewerber_tage 30, firma_tage 14, verwaltung_stunden 8)einstellungen.fristen (2a) ergänzt. Löschfrist-Änderung: Satz „gilt ab dem nächsten Nachtlauf, betrifft heute {n} …“.
3Übersetzung (T .uebersetzung)Sprachen live als Schalter (de fest, en, tr, ar; einstellungen.sprachen_frei), Schalter T .uebersetzungAuto „Anzeigen automatisch übersetzen“ (einstellungen.uebersetzung.anzeigen_automatisch), Zustand des Dienstes T .uebersetzungStand „Letzte Übersetzung {zeit} · {n} Fehler · {zeichen} Zeichen diesen Monat“ (einstellungen.uebersetzung.letzte_am, .fehler_anzahl, zaehler_tag uebersetzung_zeichen), Knopf T .uebersetzungErneut „Übersetzung erneut starten“ (setzt alle Zeilen fehler in stellen_uebersetzungen auf wartet, reiht die Aufgabe je Stelle ein, fehler_anzahl = 0); Dienst, Aufgabe und Tabelle: Karte 2a 1.18 (H143)Sprache aus → Folgen-Satz + Rückgängig. ar nur schaltbar, wenn Sprachdateien vorhanden (2b). Schalter aus → laufende Aufgaben enden leer, vorhandene Übersetzungen bleiben sichtbar; Folgen-Satz im Rückgängig-Toast.
4KI-Texte (T .ki)Schalter (= funktionen.kiTexte), Modell lesend, Verbrauch (Zahl), Hinweistext-Linkzum Livegang aus; Verbrauch 0.
5Bundesagentur (T .bundesagentur)Zustands-Satz, Ablage T .zertifikat (.p12), Feld T .zertKennwort, Knopf „Speichern“ (einziger Speichern-Knopf), Schalter T .uebertragung (zum Livegang aus und gesperrt mit Satz „Übertragung kommt nach dem Livegang“, Annahme D14), Übertragungs-Protokoll leerZertifikat und Kennwort verschlüsselt in einstellungen (Schlüssel aus Umgebungsvariable), nie wieder angezeigt, nur „hinterlegt am“. Die Übertragung (HR-BA-XML, Hintergrund) ist 2b.
6BetriebVirenprüfung (Zustand, gesperrte Dateien n), Sicherung (letzte, Größe; Werte aus Betrieb-Skript, Abschnitt 4), Sitzungen „Alle Verwaltungssitzungen abmelden“, Fehlerprotokoll (Link GlitchTip aus einstellungen), Wartung „Wartung einschalten“ mit Ende-Zeit (Rückgängig 10 s; setzt einstellungen.wartung, Webserver zeigt 1a wartung.html), Erlaubte Hosts für Schnittstellen-Abrufe (T .betriebHosts, Chips je Host, einstellungen.schnittstelle.erlaubte_hosts, 1.13), Schwellen der Anmeldungen (einstellungen.sicherheit, drei Zahlenfelder: Wartezeit je IP ab n Fehlversuchen in 15 Minuten (bremse_ip_fehlversuche 50, 2a 1.1 Nr. 3), Alarm je IP, Alarm je Konten, 1.16)T verwaltung.einst.betrieb* und .konten* (T 7.7, Hosts und Schwellen T 7.10).
7Verwaltungskonten (beide Stufen; einzige Karte für die Verwaltung)Liste Name · E-Mail · Stufe-Chip (Super Admin · Verwaltung) · Faktor ✓ · zuletzt angemeldet · „…“ (T verwaltung.einst.kontenRolle „Stufe ändern“, T .kontenEntfernen, T .kontenKennwortLink „Kennwort-Link senden“, T .kontenFaktor „Zweiten Faktor zurücksetzen“); „Einladen“ (btn-rand): E-Mail + Stufe → verwaltung_einladungen (Token 7 Tage) + Mail V07; Zielseite /verwaltung/einladung?t=: Kennwort festlegen (Konto in konten, Stufe in verwaltung_konten), danach Faktor-Pflicht-Seite2a Team-Muster (1.14)Super Admin: sieht alle Konten, darf alles (H119, H145, H147); das letzte Super-Admin-Konto ist nicht entfernbar und nicht abstufbar (Satz T .kontenLetzterSuperAdmin); Hochstufen auf Super Admin beendet alle Sitzungen des Kontos. Verwaltung (3BS): sieht nur Konten der Stufe Verwaltung (Super-Admin-Konten fehlen in Liste und Zahl, Zeilensperre Teil 3), lädt nur mit Stufe Verwaltung ein, entfernt (nicht das letzte Verwaltungskonto, Satz T .kontenLetzteVerwaltung; H150); „Stufe ändern“, Kennwort-Link und Faktor-Rücksetzung fehlen bei ihr, stattdessen Satz T .kontenBetreiberHilfe „Ausgesperrt? Schreiben Sie an {betreiber_mail}.“ (einstellungen.betreiber.absender_mail, Postfach liest Nomad, Karte 0 Teil 5). Faktor zurücksetzen wie 1.4 Nr. 4 (Identität geprüft, Grund, 24 Stunden, A08/A04) plus Betriebsmail an alle Super Admins (1.16); das eigene Konto hat diese Menüpunkte nie (anderes Super-Admin-Konto oder Notfallweg Karte 0 Teil 11, H149).
8Mail-Versand (T verwaltung.einst.mail)Zustands-Zeilen T .mailZustand: Server und Benutzer aus den Plattform-Variablen SMTP_HOST/SMTP_USER (Karte 0 Teil 4), „Kennwort hinterlegt“ ohne Wert, Umgebung, Tagesgrenze (MAIL_TAGESGRENZE, Karte 0 Teil 5), Umleitung „alle Mails an {adresse}“, solange MAIL_TEST_EMPFAENGER gesetzt ist (Karte 0 Teil 3); letzte erfolgreiche Zustellung (mail_warteschlange); Warteschlange wartet/fehler je Zahl mit den letzten Fehlern (aus Nr. 6 hierher gezogen; Rückläufer erst Abschnitt 4); Felder Absenderadresse T .mailAbsender, Anzeigename T .mailAbsenderName, Antwortadresse für Kontaktanfragen T .mailAntwortAn (einstellungen.betreiber.absender_mail, .absender_name, .kontakt_mail_3bs); Knopf T .mailPruefen „Testmail an mich senden“ → Mail an das eigene Konto über die Warteschlange, Toast T .mailPruefenOk oder Satz T .mailPruefenFehler mit dem Fehlertext des Mailservers1b FAQ details, mein-bereich.html:184–192Nur Super Admin (H148). Zugangsdaten bleiben Plattform-Variablen und sind hier nie änderbar (D40): der Kennwort-Link, mit dem jeder Ausgesperrte wieder hereinkommt, hängt am Mail-Versand, und der Mail-Dienst läuft seit 1a vor jeder Einstellungs-Seite; Wechsel: Karte 0 Teil 4.

1.12 Mein Konto, Faktor-Pflicht, Zielseiten

  • /verwaltung/konto: Karten Kennwort und Zweiter Faktor aus 2a 1.9 (Nr. 3, 4; Abschalten gesperrt mit Satz, weil Pflicht) + Benachrichtigungen T verwaltung.konto.bnPruefen (V01), .bnMeldungen (V03), .bnAnfragen (V04), .bnBetrieb (nur Super Admin; Betriebsmails: Warteschlange, Virenprüfung, Schnittstelle stockt, Betriebsmeldung ohne Mail-Vorlage (nur Super Admin, technisch), D24); V02 und V05 bis V07 nicht abschaltbar.
  • /verwaltung/faktor-einrichten: 2a faktor/FaktorEinrichten in der Anmelden-Box (B anmelden.html:144–152) mit Satz „Für die Verwaltung ist der zweite Faktor Pflicht, weil hier Bewerberdaten liegen.“ (T verwaltung.faktorPflicht, T 7.7); bis dahin ist nur diese Seite erreichbar (2a „halbe Sitzung“ 1.2). Nur die App (TOTP), für beide Stufen (Verwaltung und Super Admin): die Wahl „Code per E-Mail“ (2a 1.9 Nr. 4) fehlt hier, Satz T konto.einst.faktorVerwaltungApp „Für die Verwaltung gilt nur die App.“ (T 7.10). Begründung: Ein Code per E-Mail schützt nicht, wenn das Postfach selbst übernommen ist, und die Verwaltung sieht Bewerberdaten aller Firmen. Ein Konto mit Faktor-Art mail, das eine Verwaltungsrolle bekommt, muss die App einrichten, bevor /verwaltung aufgeht (Annahme D34).
  • /konto/faktor-reset?t= und /konto/faktor-reset/abbrechen?t= (2a reserviert): Zielseiten im Box-Muster, beide nach _planung/sicherheit.md Nr. 29: GET zeigt nur an („Schutz neu einrichten?“ bzw. „Zurücksetzen abbrechen?“) mit genau einem Knopf; erst der POST wirkt: Reset löscht faktor und meldet an, Abbrechen setzt faktor_ruecksetzungen.abgebrochen_am + Protokoll; Texte T 3.3 „Zurücksetzen abgebrochen“ (vorhanden). /konto/entsperrt: kein eigener Bildschirm, B19 führt auf /anmelden. /konto/adresse-bestaetigt?t= (H135, 1.4a): Zielseite im Box-Muster, Token aus A10; GET zeigt „Neue Adresse {mail} bestätigen?“ mit Knopf, erst der POST schreibt konten.mail um und führt auf /anmelden.
  • Aus einer Mail gekommen: nach Anmeldung und Faktor landet man in der Aufgabe (weiter= nur /verwaltung-Adressen).

1.13 COPLA-Stellen-Abruf (Schnittstellen-Block, nur Super Admin)

In der Firmenansicht (1.4) ein Block T verwaltung.schnittstelle.titel (nur Rolle Super Admin; 3BS sieht den Chip T .chip): Schalter T .abrufen + Feld T .adresse (https-URL der Stellenliste /api/stellen?voll=1), Tabelle T .zuordnung (Quelle-Bereich → Bululu-Fachbereich; Zeilen entstehen aus den Werten, die der Abruf liefert, unzugeordnete stehen oben mit „bitte zuordnen“), Schlüssel-Zeile T .schluessel + T .neuerSchluessel (Schlüssel wird einmal angezeigt, beide 7 Tage gültig; P Sicherheit der Schnittstelle), T .abgleichen, Stand-Zeile T .stand; T .weiterleiten und T .zieladresse erst 2b (nicht gezeigt). Schutz vor Abrufen ins eigene Netz (SSRF, _planung/sicherheit.md Nr. 17): die Adresse muss https sein und ihr Host in einstellungen.schnittstelle.erlaubte_hosts stehen (der Super Admin trägt ihn in Einstellungen › Betrieb ein; zum Livegang nur der COPLA-Host); private und lokale Netze (127/8, 10/8, 172.16/12, 192.168/16, ::1, fc00::/7) sind abgelehnt, auch nach Namensauflösung; Weiterleitungen werden nicht gefolgt; Zeitgrenze 10 Sekunden, Antwort höchstens 5 MB; Fehler → Satz am Feld T .adresseNichtErlaubt (T 7.10). Hintergrund schnittstelle-abruf.ts alle 15 Minuten je Firma mit abrufen = an: GET mit Signatur (Zeitstempel + Inhalt, HMAC mit dem Schlüssel, 5 Minuten; höchstens 60 je Minute), Abgleich über stellen.fremde_kennung (= COPLA-Kurzname, herkunft schnittstelle, lieferung_id je Lauf): neu → anlegen + aktiv (Firma geprueft, keine Prüfung), geändert → aktualisieren (Felder-Zuordnung fachlich/schnittstelle/zuordnung.ts: Titel, Aufgaben → aufgaben, Profil → brauchen, Wir bieten → bieten, Eckdaten → beschaeftigungsart, Kontakt → Ansprechperson in die Rückfall-Felder ansprech_anrede/-vorname/-nachname/-telefon (1a A21; ansprechperson_id bleibt leer, die Anzeige liest die Rückfall-Felder); mehrere Orte: erster = Standort, weitere in stellen_orte für die Umkreissuche, Annahme D15; englische Fassung → stellen_uebersetzungen en mit stand geprueft), fehlt → beendet (Bewerbungen bleiben, B14 neutrale Fassung). Keine Laufzeit, keine F08/F09 (laeuft_bis leer, 2a ablauf.ts überspringt herkunft schnittstelle; FC 12). Im COPLA-Firmenbereich (2a 1.11): Zeilen mit T firma.stellen.gepflegtExtern, ohne Bearbeiten/Verlängern/Beenden/Kopieren; Bewerbungen normal, F03/F04 an COPLA-Nutzer (bis 2b). Stockt der Abgleich > 1 Stunde: Zeile T .stockt beim Super Admin + Betriebsmail. Protokoll je Lauf (lieferungen: zeilen_gesamt/ok/fehler). COPLA-Seite (bululu.py im COPLA-Repo) kommt erst 2b; für den Abruf reicht die vorhandene Liste /api/stellen?voll=1 (P), die Signatur prüft Bululu nur, wenn COPLA sie liefert (Annahme D16: zum Livegang Abruf ohne Signatur, nur https + Schlüssel als Bearer, sobald COPLA den Schlüssel kennt).

1.14 Datenschutz-Abläufe und Fristen (ohne Seite)

  • Hintergrund fristen.ts (2a) ergänzt um: Bewerbungen 6 Monate nach Abschluss (Absage, Zusage, Zurückziehen, Stelle beendet, automatischer Abschluss 6 Monate nach Ablauf einer pausierten Stelle; FC 23) löschen (Dateien, Nachrichten, Einladungen, Notizen mit), Konten 24 Monate ohne Anmeldung → A07, 3 Monate später A06 + Anonymisierung (2a loeschen.ts), unbestätigte Konten ohne Bewerbung 30 Tage, Job-Alarme ohne Konto 12 Monate (1b), Stellen nur durch die Firma oder mit ihr (pausierte Stellen bleiben, 2a C24), Protokoll 12 Monate (Person unkenntlich: wer → leer, Zeile bleibt), Papierkorb 30 Tage (Inhalte der Verwaltung; Stellen, Entwürfe und Notizen der Firma; Job-Alarme und Bewerbungsentwürfe der Bewerber, 2a 1.17), Werbeanfragen ohne Kampagne 14 Tage → nicht_angenommen (P), Meldungen erledigt nach 12 Monaten, Prüfungen erledigt nach 12 Monaten, support_sitzungen nach 12 Monaten, faktor_ruecksetzungen nach 30 Tagen, Werbe-Zählung je Tag 25 Monate (wie zaehler_tag), Kontaktanfragen beantwortet nach 12 Monaten (Annahme D17 für alle Fristen ohne Plan-Wert). Werte aus einstellungen.fristen.
  • Export auf Wunsch (Bewerberansicht): 2a export.ts, Mail A05 an die Person, Protokoll „export_angestossen“ mit Grund „auf Wunsch der Person“.
  • Protokoll mit Grund: jede Verwaltungshandlung → protokoll (wer = Verwaltungskonto, rolle, aktion, ding, firma_id, grund, support_id); Unterlagen öffnen zusätzlich je Datei.
  • Einwilligungen (2a): Rechtstext-Fassungen (1.10 Nr. 3) liefern die Textfassung-Kennung für neue Einwilligungen; alte bleiben auf ihrer Fassung.
  • Kunde bestätigt die Fristen (P Mail Punkt 5); bis dahin gelten die Standardwerte, änderbar ohne Code (1.11 Nr. 2).
  • Neu 26.10.: anmeldungen (Sicherheitsprotokoll, 2a Teil 3) nach 30 Tagen löschen (einstellungen.fristen.anmeldungen_tage); konto_geraete (bekannte Geräte je Konto für Mail A13, 2a Teil 3) nach 12 Monaten (einstellungen.fristen.geraete_monate); abgelaufene Sperrlisten-Einträge täglich aufheben (sperrliste-ablauf.ts, 1.15); beides ohne Mail. Die Datenschutzerklärung nennt Sicherheitsprotokoll (IP, 30 Tage) und Sperrliste (RECHTSTEXTE P-5050-RT, 2.7 und 2.14; Karte 0 E15).

1.15 Sperrliste

Datei verwaltung/firmen/sperrliste/page.tsx · Teile _sperrliste/ (Liste.tsx, Eintrag.tsx als Client-Fenster). Erreichbar über den Textlink T verwaltung.sperrliste.link „Sperrliste ({anzahl})“ rechts oben in Firmen und Nutzer (neben „Firma anlegen“, 1.4 Nr. 1), aus der Kontaktanfrage („Zur Sperrliste“, 1.3 Nr. 3) und aus dem Alarm (1.16). Ersetzt „Adresse sperren“ (nur Super Admin, nur E-Mail) vollständig; die Tabelle gesperrte_adressen entfällt zugunsten von sperrliste (Teil 3). Sicherheits-Prüfliste: _planung/sicherheit.md Nr. 11, 14.

NrBereichBausteineB-FundstelleHinweis
1Listepanel-kopf h2 T verwaltung.sperrliste.titel „Sperrliste“ + Satz T .satz; Pillen Art und Zustand (Aktiv · Abgelaufen/aufgehoben, Standard Aktiv); Tabelle (verwaltungsliste/, D43): Art-Chip, Wert (Domain mit „@“ davor; IP-Bereich als CIDR ab 2b.9), „bis {datum}“ oder „unbefristet“, „von {name}“, Grund-Pille als Chip (+ Satz, wenn vorhanden), T .treffer „{anzahl} Treffer, zuletzt {datum}“ bzw. .trefferKeiner; rechts Textknopf T .aufheben; oben rechts btn-rand T .hinzufuegenB:140–149, css:641–659Sortierung neueste zuerst, 50 je Seite, „Mehr laden“. Leer: T .leer. Aufheben: Rückgängig 10 s, dann aufgehoben_am/_von, Protokoll sperrliste_aufgehoben.
2Eintrag-FensterFenster (2a fenster/, Variante aus grundfenster/): Pillen T .art (.artIp · .artMail · .artDomain; .artIpBereich erst 2b.9), Feld T .wert (Prüfung je Art: IPv4/IPv6 gültig, CIDR mit Präfix ≥ /24 bei IPv4 und ≥ /48 bei IPv6, E-Mail gültig, Domain ohne „@“), Grund als Pillen Pflicht (eine gemeinsame Liste für Sperrliste und Sperren-Fenster, fachlich/sperre/gruende.ts: T verwaltung.sperre.pilleBetrug · .pilleRegeln · .pilleBelaestigung · .pilleWunsch („Auf Wunsch der Firma“, nur im Firmen-Sperren-Fenster) · .pilleSonstiges; Einfachheit V3, End-Check Befund 28) + freiwilliger Satz T .grundSatz, Frist-Pillen T .frist (.frist7 · .frist30 · .frist90 · .fristUnbefristet; bei IP und IP-Bereich 7 vorgewählt, bei E-Mail und Domain 30; „Unbefristet“ nur Super Admin; die Verwaltung sieht die Pillen IP-Bereich und Unbefristet nicht, D39), Hinweis-Satz T .ipHinweis bei IP und IP-Bereich, Knopf T .knopf „Sperren“stelle.html:103–112 (Dialog), filter-pillenAktion sperrlisteEintragen(); doppelt (aktive Zeile mit gleicher Art und gleichem Wert) → Satz T .doppelt mit Frist der vorhandenen Zeile; Freemail-Domain (Liste aus hinweise.ts) → Satz T .freemail, kein Eintrag; Toast T .ok. Aus der Kontaktanfrage, dem Alarm und dem Haken in den Sperren-Fenstern (1.4 Nr. 7, 8) kommt das Fenster vorbelegt.
3Wirkungdienste/sperrliste.ts `gesperrt({ip, mail}) → {gesperrt: boolean, grund: 'ip''mail'} liest aktive Zeilen (Ablauf leer oder in der Zukunft): IP exakt oder im CIDR (inet <<= cidr), Mail exakt (citext) oder Domain-Teil. Aufrufer vor dem Schreiben: 2a kontoAnlegen, firmaRegistrieren, bewerbenCodeAnfordern (Konto-Anlage per Code im Bewerben-Fenster, C36), 1b kontaktanfrageAnlegen, jobAlarmAnlegen, 3 meldungAnlegen, werbeanfrageAnlegen prüfen IP und Mail; 2a anmelden und bewerbungSenden` (vorhandenes Konto) prüfen die Sperrliste nicht, weder IP noch Mail oder Domain. Das Eintrag-Fenster zeigt bei Mail und Domain vorher „{n} bestehende Konten mit dieser Adresse/Domain bleiben unberührt“. Anonyme Formulare (Kontakt, Job-Alarm, Melden, Werbeanfrage): Erfolg anzeigen, nichts schreiben, keine Mail (D6). Registrieren: neutrale Meldung T fehler.gesperrt.neutral („Das hat gerade nicht geklappt. Bitte versuchen Sie es später noch einmal oder rufen Sie uns an …“), nichts schreiben; die Meldung nennt weder Sperre noch Grund. Damit gilt ohne Ausnahme: Wer ein Konto hat, merkt von der Sperrliste nichts, auch beim Bewerben; Konto und Firma sperrt die Verwaltung sichtbar (1.4). Jeder Treffer zählt treffer_anzahl und letzter_treffer_am (keine weitere Speicherung).Eine Prüfung, acht Aufrufer; Test pruefung/fachlich/sperrliste/wirkung.test.ts je Aufrufer. Treffer-Zähler ohne IP-Speicherung des Treffers.
4RechteVerwaltung und Super Admin: Einträge Art IP-Adresse, E-Mail-Adresse, Mail-Domain mit Frist 7/30/90 Tage anlegen und aufheben (auch fremde Einträge); Standard 7 Tage bei IP, 30 bei E-Mail und Domain. Nur Super Admin: Frist „unbefristet“. Art IP-Bereich (CIDR) kommt erst nach dem Livegang, das Enum kennt den Wert schon. Server lehnt ab, nicht nur ausgeblendet (fehler.rechte.betreiber).Teil 4 H136.
5ZuständeEintrag läuft ab → Zeile wandert in „Abgelaufen/aufgehoben“ (Hintergrund sperrliste-ablauf.ts täglich 00:10 setzt aufgehoben_am mit Grund „abgelaufen“); aufgehobene Zeilen 12 Monate lesbar, dann gelöscht (fristen.ts).

1.16 Sicherheitsprotokoll der Anmeldungen und Alarm

Kein eigener Bildschirm. Die Tabelle anmeldungen (2a Teil 3; IP, Gerät grob, Zeit, Ergebnis, 30 Tage) schreibt 2a bei jeder Anmeldung. Abschnitt 3 nutzt sie an drei Stellen: (a) Haken „Auch die zuletzt genutzten IP-Adressen sperren“ in den Sperren-Fenstern (1.4 Nr. 7, 8) liest die IP-Adressen der letzten 30 Tage je Konto bzw. je Nutzer der Firma; (b) Firmen- und Bewerberansicht zeigen unter „Protokoll“ zusätzlich eine zugeklappte Gruppe T verwaltung.firmen.anmeldungen „Anmeldungen (30 Tage)“ mit Zeit, Ergebnis, Gerät, IP (volle Adresse, nur Verwaltung) (H129 ergänzt); (c) Alarm: Hintergrund anmeldungen-alarm.ts (alle 10 Minuten) prüft die letzte Stunde gegen feste Schwellen (100 Fehlversuche je IP, 20 Konten je IP; einstellbar erst 2b.9): über 100 Fehlversuche von einer IP, oder Fehlversuche gegen über 20 verschiedene Konten von einer IP → Betriebsmail (D24) an Super-Admin-Konten mit bnBetrieb + Zeile T verwaltung.heute.sperrlisteAlarm „Von {ip} kamen in der letzten Stunde {anzahl} fehlgeschlagene Anmeldungen.“ mit Knopf „Sperrliste“ (öffnet das Eintrag-Fenster vorbelegt mit der IP, 7 Tage, Grund Betrug/Spam); dieselbe IP löst höchstens einmal je 6 Stunden aus (alarme Zeile in protokoll, aktion alarm_anmeldungen). Dazu ohne Schwelle: Anmeldung eines Verwaltungskontos von neuem Gerät nur als Zeile T verwaltung.heute.neuesGeraet in „Heute zu tun“ beim Super Admin; Faktor eines Verwaltungskontos abgeschaltet oder zurückgesetzt → Betriebsmail und Zeile. Kein automatisches Sperren (nichts zu strikt, Annahme D35); die Entscheidung trifft der Super Admin mit einem Klick.

2

Bausteinkatalog-Ergänzung (nur Neues gegenüber 1a/1b/2a)

Welche neuen Bauteile die Verwaltung braucht; sie nutzt dieselbe Optik wie der übrige Bereich, kein zweites Design.

Dieser Abschnitt beschreibt nur die technische Umsetzung. Mit dem Schalter „Technische Angaben“ blenden Sie ihn ein.

Regel wie 1a: CSS von B bleibt in stile/b/; Neues nur beim Baustein mit vorhandenen Werten. Die Verwaltung nutzt dieselben Bausteine wie die Bereiche (kein zweites Design, P Verwaltung „im B-Design“).

2.1 Neue gemeinsame Bausteine

Baustein (Ordner)DateienAus B: HTMLAus B: CSS-KlassenAus B: app.jsBenutzt von
grundfenster/GrundFenster.tsx (Client: Fenster 2a mit Grund-Pillen Pflicht, freiwilligem Satz, eingeklappter Mail-Vorschau, Knopf „… und E-Mail senden“), gruende.ts (Pillen-Listen je Zweck: ablehnen, offline, sperreFirma, sperreKonto, premiumAblehnen, support, unterlagen)stelle.html:103–112 (Dialog), firmen-bereich.html:143–146 (Pillen)dialog, dialog__kopf, filter-pillen (aria-pressed), formular, felddata-dialog-zuPrüfen (Ablehnen, Offline, Sperren), Anfragen (Premium ablehnen), Firmen (Sperren, Support, Unterlagen), Personen (Sperren)
mailvorschau/MailVorschau.tsx (details „Die Firma bekommt diese E-Mail“ mit gerendertem Text der Vorlage mit echten Werten)1b FAQ detailsdetails-Optik css:930–936GrundFenster, Freigeben, Premium freischalten, Mailvorlagen-Formular
supportleiste/SupportLeiste.tsx (feste Leiste über dem Kopf, T verwaltung.firmen.leiste, Knopf Beenden), supportleiste.css (Werte --orange-50, --orange-dunkel css:14,16; Höhe wie kopfzeile)neu (U 3.17)neue Klasse support-leiste(firma)/layout.tsx bei sitzungen.support_id
verwaltungsliste/Tabelle.tsx (kompakte Tabelle nach D43: table mit sortierbaren Spaltenköpfen als Knöpfe mit aria-sort, Sortierung in der Adresse; Zeilenhöhe 40 px, ganze Zeile als Link auf das erste Feld; Auswahlkästchen nur in Varianten mit Sammelaktion, dann Auswahl-Leiste aus 2a auswahl/; am Handy gestapelte Zeilen; Varianten pruefen · anfragen · firmen · nutzer · kampagnen · sperrliste), NeuZeile.tsx, Gruppen.tsx (details mit Zahl für „nachprüfen“, „Beendet“), Pfeile.tsx („Vorherige / Nächste“ im Detailkopf, icon-btn)firmen-bereich.html:140–149 (Chips, Pillen; die B-Zeilen werden zur Tabelle, D43)status, status--*, filter-pillen, icon-btn; neue Klassen vtabelle, vtabelle__kopf in verwaltungsliste/tabelle.css mit Farben und Schrift aus Bjs:1152 Pillenalle Verwaltungslisten
verwaltungsleiste/Leiste.tsx (feste Menüleiste links nach D43: Einträge mit Zahl-Kreis zahl-klein, aktueller Punkt mit aria-current, 220 px breit; am Handy im Burger), eintraege.ts (Einträge je Stufe aus darf())firmen-bereich.html:119 (Zahl-Kreis)zahl-klein, Farben und Schrift aus Bapp/verwaltung/layout.tsx
hinweise/SystemHinweise.tsx (Sätze mit ✓ oder ohne, aus fachlich/pruefung/hinweise.ts)neuhaken-liste (ueber-uns.html:138–154, 1b)Prüfen (Firma), Werbung (Motiv-Prüfpunkte)
melden/MeldenDialog.tsx (Client; Fenster mit Grund-Pillen aus T 1.3, Text, E-Mail), MeldenKnopf.tsxstelle.html:103–112dialog, filter-pillen, formularStelle (1a Seitenende), Firmenprofil (1b)
werbeplanung/Werbeplanung.tsx (Client, drei Schritte), Flaechenwahl.tsx, Nachbildung.tsx (Vorschau der Fläche mit Motiv, Gerät umschaltbar), Textanzeige.tsx, werbeplanung.css (= konfigurator.css aus gemeinsam/werbung/konfigurator, unverändert)gemeinsam/werbung/konfigurator (Markup), K:49–86 FLAECHEN, K:99 NATIV_MAX, K:741 vorschau(), K:800 belegung(), K:532/592 pruefMotiv/motivSlotkonfigurator.css komplettK wird nicht als Ganzes übernommen; PREISE (K:23–37), berechne (K:123), summe (K:143) entfallenWerbung planen (öffentlich), Kampagnen-Formular (Vorschau rechts)
schalter/Schalter.tsx (check-Haken als Schalter mit Satz und sofortiger Wirkung, Toast, Rückgängig-Variante)mein-bereich.html:190–191 (Haken), css:563–564checkEinstellungen, Flächen, Schnittstelle, Benachrichtigungen (Verwaltung)

Erweiterungen vorhandener Bausteine: seitenrahmen/Kopf.tsx + HandyMenue.tsx (1a) Variante „verwaltung“; jetztwichtig/zeilen.ts (2a) bekommt verwaltung(rolle) (T 7.3) und die Firmen-Zeilen nachbessern, premiumAngefragt, premiumAblauf (T 7.2), supportHinweis (T 7.7); statuschip/ (2a) bekommt die Wörter T 5.5 status.firma/.konto/.meldung/.anfrage/.werbung/.premium; werbeflaeche/Werbeflaeche.tsx (1a) liest Kampagne über fachlich/werbung/aktiv.ts (Motiv, Zielseite → /api/w/[id], Vorlesetext als alt) und eigenwerbung-Schalter (aus → Fläche fehlt im Markup); Stellenkarte.tsx Variante „firma“ (2a) zeigt Chips „Bitte ergänzen: {grund}“, „Gesperrt“, „Wird in Ihrer Verwaltung gepflegt“; (firma)/layout.tsx (2a) bindet SupportLeiste und reicht support an darf(); stelle/[adresse]/_stelle/Seitenende.tsx (1a) bekommt den Melden-Knopf, firmen/[adresse]/_profil/Eckdaten.tsx (1b) den Textlink „Firma melden“; fenster/Fenster.tsx (2a) Variante „mit Kennwort der Verwaltungsperson“ (Konto/Firma löschen); ablage/ (2a) Zweck werbemotiv (GIF erlaubt, 2 MB) und zertifikat (.p12, nur Speicherung verschlüsselt); Fehlerseite.tsx Fall „Dafür ist der Betreiber zuständig“.

2.2 Fachlich und Dienste (neu)

OrdnerDateienInhalt
fachlich/verwaltung/rolle.ts (Typ Verwaltungsrolle super_admin · verwaltung wie D38; istVerwaltung(sitzung), nurSuperAdmin()), zahlen.ts (fünf Kennzahlen + Vorwoche, Tageskopie), heute.ts (Zeilen für Heute zu tun je Rolle, Reihenfolge nach Frist), letzterBesuch.ts erst mit 2b.9 (1.1 Nr. 3), konten.ts (einladen, annehmen, rolle, entfernen, letztes Super-Admin-Konto), suche.ts (Firmen, Nutzer, Bewerber, Stellentitel; ab 3 Zeichen; 25 je Seite)Rechte-Tabelle Rolle × Handlung in Teil 4; jede Aktion ruft darf() (2a) mit Rolle super_admin/verwaltung
fachlich/pruefung/noetig.ts (pruefungNoetig(firma): geprueft false UND Schalter an UND Stufe normal UND kein Premium; D25), anlegen.ts (pruefungAnlegen(stelleId), von 2a stelleVeroeffentlichen() in derselben Transaktion gerufen: Zeile in pruefungen, frist_am, V01 in die Warteschlange), freigeben.ts (Rückgängig 10 s → firmen.geprueft, Stelle aktiv, F10), ablehnen.ts (→ nachbessern, F16), frage.ts (F17, Frist + 3 Werktage, Zustand rueckfrage), frist.ts (Hintergrund: 2 h vorher Erinnerung, Ablauf → auto_frei + F10 + V02), inOrdnung.ts, hinweise.ts (Domain, Freemail-Liste, Vorwahl aus plz-Tabelle, Links, Textlänge, Gehalt, Namensdublette), felder.tsPrüfung ist eigenes Ding (Tabelle pruefungen), die Stelle trägt nur den Zustand
fachlich/meldung/anlegen.ts (meldungAnlegen aus Stelle/Firmenprofil, V03, Bremse), entscheiden.ts (erledigt · offline → nachbessern + F16 · stelleSperren · firmaSperren; V06 an Melder), entsperren.ts (Stelle), felder.ts (Gründe T 1.3)
fachlich/anfrage/liste.ts (alle drei Arten in einer Liste: kontaktanfragen, premium_anfragen, werbung_anfragen über eine Sicht anfragen_gesamt), kontakt/antworten.ts (Übernahme beim Öffnen, Vorlage füllen, V05 verzögert, ohneAntwort, anBetreiber; „Zur Sperrliste“ ruft fachlich/sperrliste/eintragen.ts), premium/anfragen.ts (Firma: Anfrage + V04), premium/entscheiden.ts (freischalten, verlängern, angebotGeschickt, ablehnen; F11/F12/F13), premium/ablauf.ts (Hintergrund: Zeile 5 Tage vorher, F13 am Tag, vorzeitiges Ende)
fachlich/firma/ergänzt: sperren.ts (Firma sperren/entsperren, F14/F15, Rückgängig), support.ts (supportStarten/Beenden, 60 Minuten, Sperrliste der Handlungen im Support: einladen, zusage, absage, nachricht_senden, notiz_lesen, notiz_schreiben, team, firma_loeschen, premium_anfragen), nutzerUmhaengen.ts, unterlagen.ts (Grund-Freigabe 60 Minuten, Protokoll je Datei), notiz.ts2a loeschen.ts, team.ts werden mit Verwaltungs-Protokoll aufgerufen
fachlich/konto/ergänzt: sperren.ts (Bewerberkonto sperren/entsperren, B18/B19, Postfach-Schreibschutz über status.ts), faktorRuecksetzen.ts (beantragen → A08, abbrechen, nach 24 h A04, einlösen), kennwortLink.ts (A01 durch Verwaltung)
fachlich/werbung/anfrage.ts (werbeanfrageAnlegen, W01 mit Miniatur, V04; Verfall 14 Tage), kampagne.ts (anlegen aus Anfrage oder ohne, Feld sofort speichern, planen mit Pflichtprüfung, beenden mit Rückgängig), lauf.ts (Hintergrund täglich: laeuft + W04, beendet + W05, wartet auf Motiv), aktiv.ts (aktiveKampagne(flaeche, geraet) für 1a Werbeflaeche), zaehlung.ts (einblendung beim Rendern, klick über /api/w), flaechen.ts (sechs Flächen aus K:49–86 als Daten, Schalter eigenwerbung/aktiv), motiv.ts (Maßprüfung je Format auf dem Server; kein Neuspeichern, C35), felder.ts (Zustände status.werbung.*)Posten, Angebot, Motivprüfung-Workflow, Belegungs-Zeitleiste: 2b
fachlich/inhalte/ergänzt: schreiben.ts (Fassung je Sprache speichern mit bereinigen, veröffentlichen, Rechtstext-Fassung mit Historie, Papierkorb), mailvorlagen.ts (lesen mit Rückfall auf Code-Vorlage, speichern, Pflicht-Platzhalter prüfen, Testmail), fachbereich/zusammenfuehren.ts, fachbereich/schreiben.tsdienste/mail/vorlagen/* lesen Betreff/Text aus mailvorlagen, wenn vorhanden
fachlich/schnittstelle/abruf.ts (GET mit Schlüssel, Antwort prüfen), abgleich.ts (neu/geändert/fehlt über fremde_kennung, Lieferung je Lauf), zuordnung.ts (Felder + Fachbereich-Tabelle aus firmen_schnittstellen.zuordnung), schluessel.ts (erzeugen, verschlüsselt speichern, 7 Tage doppelt), stand.tsnichts COPLA-spezifisches im Code (P)
fachlich/einstellungen/lesen.ts (typisiert je Schlüssel), schreiben.ts (mit Protokoll, Rückgängig-Varianten, Folgen-Sätze), geheim.ts (Zertifikat/Kennwort/Schlüssel verschlüsseln mit BULULU_GEHEIM_SCHLUESSEL)
dienste/sperrliste.ts (neu, neben dienste/bremse.ts aus 1b)gesperrt({ip, mail}) → {gesperrt, grund} liest sperrliste (Teil 3; IP exakt oder im CIDR, Mail exakt oder Domain); rufen vor dem Schreiben: 2a kontoAnlegen, firmaRegistrieren, anmelden, bewerbungSenden, 1b kontaktanfrageAnlegen, jobAlarmAnlegen, 3 meldungAnlegen, werbeanfrageAnlegen; anonyme Formulare zeigen Erfolg und schreiben nichts (D6), Registrieren/Anmelden/Bewerben zeigen fehler.gesperrt.neutral (1.15 Nr. 3); treffer(id) zählteine Prüfung, acht Aufrufer
fachlich/sperrliste/eintragen.ts (`sperrlisteEintragen({art, wert, grund, tagenull}): Prüfung je Art, Rechte verwaltung/super_admin, Freemail-Sperre, Dublette, Protokoll sperrliste_eintrag), aufheben.ts (Rückgängig 10 s, Protokoll), liste.ts (Filter Art/Zustand, 50 je Seite), ipsAusAnmeldungen.ts (letzteIps(kontoIds[], tage=30) → ip[]` für den Haken in den Sperren-Fenstern), felder.ts (Arten, Fristen 7/30/90/unbefristet)1.15; Test je Datei in pruefung/fachlich/sperrliste/
fachlich/datei/ (2a, ergänzt)ausliefern.ts Fall „öffentlich“ (ohne Sitzung): logo mit dateien.zustand geprueft, werbemotiv einer Kampagne geplant/laeuft, ratgeberbild eines veröffentlichten Inhalts; hochladen.ts erlaubt konto_id leer für werbemotiv, zertifikat, ratgeberbildMonogramm.tsx (1a), Werbeflaeche.tsx (1a), Ratgeber (1b) laden darüber
fachlich/rechte.tsergänzt: Rollen super_admin, verwaltung, support (= Firmenbereich mit Sperrliste); darf() prüft zusätzlich support
dienste/db/rls.tsRolle bululu_<u>_verwaltung (Karte 0 Teil 7, einzige Quelle): liest alle Firmen; schreibt nur über Aktionen mit Protokoll-Pflicht (Annahme D18 mit Ausnahmeliste); SET LOCAL app.stufe (verwaltung oder super_admin) für die Zeilensperre auf verwaltung_konten (D39)db/migrationen/0004_verwaltung.sql
dienste/mail/vorlagen/v01–v08, w01, w04, w05, w06 (gesendet; w06 über den Knopf „Motiv anfordern“), w02, w03, w07, w08 (nur als Textvorlage in mailvorlagen für das Mailprogramm, nicht versendet; 2b), f10–f17, f22, b18, b19, a04, a08; betriebsmail.tsx (Warteschlange, Virenprüfung, Schnittstelle stockt, Bundesagentur-Zertifikat läuft ab: ohne Nummer)Nummern nach T 6.3 bis 6.6
hintergrund/aufgaben/pruefung-frist.ts (stündlich), premium-ablauf.ts (täglich), werbung-lauf.ts (täglich 00:05), werbeanfrage-verfall.ts (täglich), schnittstelle-abruf.ts (alle 15 Minuten), support-ende.ts (jede Minute: abgelaufene Support-Sitzungen beenden), faktor-ruecksetzung.ts (stündlich: nach 24 h A04), fristen.ts (2a, ergänzt nach 1.14, auch anmeldungen 30 Tage), zahlen-tageskopie.ts (täglich), protokoll-anonymisieren.ts (täglich), sperrliste-ablauf.ts (täglich 00:10: abgelaufene Einträge aufheben, 1.15), anmeldungen-alarm.ts (alle 10 Minuten: Schwellen aus einstellungen.sicherheit, Betriebsmail + Zeile, 1.16)pg-boss wie 1a
sprachen/de/verwaltung.json (T 1.9, 7.3), status.json (5.5 ergänzt), melden.json (T 1.3 Gründe), werbung.json (T 1.10 werbung.; en/tr nur für werbung. und melden.*, Verwaltung nur de)

2.3 Nur in 3 (seitenspezifisch)

OrtDateien
app/verwaltung/layout.tsx · page.tsx · _uebersicht/HeuteZuTun.tsx · Zahlen.tsx (LetzterBesuch.tsx erst 2b.9)Rahmen prüft Rolle + Faktor
…/pruefen/page.tsx · _liste/PruefListe.tsx (Client, Auswahl) · pruefen/[id]/page.tsx · _firma/Pruefkarte.tsx · Entscheidung.tsx (Client) · Notiz.tsx · _meldung/Meldungen.tsx · Entscheidung.tsx
…/anfragen/page.tsx · _liste/AnfragenListe.tsx · anfragen/[id]/page.tsx · _kontakt/Antwort.tsx (Client) · Zusammenhang.tsx · _premium/Entscheidung.tsx (Client)
…/firmen/page.tsx · _suche/Suche.tsx (Client) · Ergebnisse.tsx · firmen/[id]/page.tsx · _firma/Kopf.tsx · SupportLeisteStart.tsx (Client) · Stellen.tsx · Nutzer.tsx (Client, „…“) · Bewerbungen.tsx · Unterlagen.tsx (Client) · Protokoll.tsx · Notiz.tsx · Schnittstelle.tsx (Client, nur Super Admin) · personen/[id]/page.tsx · _person/Kopf.tsx · Aktionen.tsx (Client) · Einwilligungen.tsx
…/werbung/page.tsx · _liste/Kampagnen.tsx · werbung/neu/page.tsx · werbung/[id]/page.tsx · _formular/KampagneFormular.tsx (Client) · Vorschau.tsx · Zaehlung.tsx · werbung/flaechen/page.tsx · _flaechen/Flaeche.tsx (Client, Schalter)
…/inhalte/page.tsx · _liste/InhalteListe.tsx · inhalte/fachbereiche/[id]/page.tsx · _fachbereich/Formular.tsx (Client) · Zusammenfuehren.tsx · inhalte/[art]/[id]/page.tsx · _inhalt/InhaltFormular.tsx (Client) · MailvorlageFormular.tsx (Client) · Fassungen.tsx · inhalte/[art]/neu/page.tsx (nur ratgeber)
…/einstellungen/page.tsx · _einstellungen/Funktionen.tsx · Fristen.tsx · Uebersetzung.tsx · Ki.tsx · Bundesagentur.tsx · Betrieb.tsx · Verwaltungskonten.tsx (alle Client)nur Super Admin
…/konto/page.tsx · faktor-einrichten/page.tsx · einladung/page.tsx
…/firmen/sperrliste/page.tsx · _sperrliste/Liste.tsx (Client, Pillen) · Eintrag.tsx (Client, Fenster) · _firma/Anmeldungen.tsx (zugeklappte Gruppe, auch in _person/)1.15, 1.16
(oeffentlich)/konto/faktor-reset/page.tsx · faktor-reset/abbrechen/page.tsxZielseiten
(oeffentlich)/fuer-arbeitgeber/werbung/page.tsx · _planung/Schritt1.tsx · Schritt2.tsx · Schritt3.tsx · Erfolg.tsx
(oeffentlich)/stelle/[adresse]/melden/page.tsx · firmen/[adresse]/melden/page.tsxohne JS
(firma)/firma/stellen/_liste/PremiumAnfragen.tsx (Client) · _formular/TopHaken.tsxergänzt 2a
app/api/w/[id]/route.ts · app/api/schnittstelle/… entfällt (Bululu ruft nur ab)Zähl-Weiterleitung
db/migrationen/0004_verwaltung.sql + rueckweg · musterdaten/verwaltung.ts (2 Verwaltungskonten Nomad/3BS mit Faktor-Stummel, 1 Prüfung, 2 Meldungen, 3 Anfragen je Art, 2 Kampagnen, 6 Flächen, Mailvorlagen-Kopien)nur Testumgebung

Nicht übernommen aus B (bewusst): „…“-Menü des Firmenbereichs mit Werbung planen / Rechnungen / Statistiken / Pakete (B:104–111; P Menüs); Konfigurator-Preise und Rechner (K:23–37, 123–143); data-folgt="Bald verfügbar." (nichts zeigen, was es nicht gibt); umschalter.js (Entwurfs-Umschalter, nur B-Vorschau).

3

Datenmodell-Ergänzung

Wie Prüfungen, Meldungen, Premium, Werbung, Sperrliste und Verwaltungskonten gespeichert werden.

Dieser Abschnitt beschreibt nur die technische Umsetzung. Mit dem Schalter „Technische Angaben“ blenden Sie ihn ein.

Migration db/migrationen/0004_verwaltung.sql mit Rückweg; Regeln wie 1a/2a (UUID v7, angelegt_am/geaendert_am, echte Felder für Filterbares). Tabellen aus 1a/1b/2a werden nur ergänzt.

verwaltung_konten: konto_id PK FK konten, rolle enum verwaltung_rolle (super_admin, verwaltung), eingeladen_von FK konten leer, beigetreten_am, entfernt_am leer. Letzter Super Admin: Prüfung im Code + Trigger (nicht entfernbar, nicht abstufbar). Faktor-Pflicht: faktor (2a) muss existieren, sonst nur /verwaltung/faktor-einrichten. Zeilensperre (D39): Zeilen mit rolle super_admin liest nur eine Sitzung mit app.verwaltung_rolle = super_admin (Policy auf verwaltung_konten; verwaltung_einladungen mit rolle super_admin ebenso); die Verwaltung bekommt sie in keiner Liste, Zahl oder Suche. Stufe ändern nur durch Super Admin (H145). verwaltung_einladungen: id, mail citext, rolle, token_hash eindeutig, eingeladen_von FK, laeuft_ab_am (7 Tage), angenommen_am leer. Die Verwaltung legt nur rolle verwaltung an (Server prüft, H150). verwaltung_benachrichtigungen: konto_id FK, art enum (pruefen, meldungen, anfragen, betrieb), an boolean; PK (konto_id, art); fehlende Zeile = an.

pruefungen

FeldTypHinweis
iduuid PK
firma_idFK firmen
stelle_idFK stellen, leer erlaubtdie geprüfte Stelle (in der Regel die erste der Firma); bei „erneut eingereicht“ dieselbe Stelle in einer neuen Zeile; leer bei art aenderung, wenn sich nur der Firmenname geändert hat
artenum pruefung_art: neue_firma, nachbesserung, aenderungnachbesserung = erneut eingereicht nach Ablehnen oder Offline nehmen (2a C22); aenderung = Titel- oder Firmennamen-Änderung in den ersten 30 Tagen nach geprueft_am (D27); Meldungen haben eine eigene Tabelle; der Typ erlaubt später „stichprobe“ (Ideen)
zustandenum pruefung_zustand: offen, rueckfrage, auto_frei, freigegeben, abgelehnt, erledigt_beendet, in_ordnungP Lebenslauf; auto_frei = Gruppe „nachprüfen“
frist_amtimestamptznächster Werktag 9:00; bei Rückfrage + 3 Werktage
erneut_eingereichtboolean, Standard falseWort an der Zeile
rueckfrage_am, rueckfrage_textleerF17
erinnert_amleer2 h vor Frist
geoeffnet_von, geoeffnet_amFK konten, leerwer die Prüfung zuletzt geöffnet hat (Protokoll; der Kollegen-Hinweis daraus kommt erst mit 2b.9)
entschieden_von, entschieden_am, grund_pille, grund_satzleer
notiztext leer
Index(zustand, frist_am); (firma_id)

meldungen

FeldTypHinweis
iduuid PK
ziel_artenum meldung_ziel: stelle, firmaMelden-Knopf auf Stelle und Firmenprofil
stelle_id, firma_idFK, firma_id immer gesetztBündelung je Ziel
grundenum meldung_grund: falsche_angaben, unserioes, benachteiligt, besetzt, anderesT 1.3
texttext leer (2.000)
melder_konto_idFK leerangemeldet
melder_mailcitext leerfür V06 und „dem Melder antworten“
zustandenum meldung_zustand: gemeldet, in_pruefung, erledigt, offline, stelle_gesperrt, firma_gesperrtT 5.5 status.meldung.*
entschieden_von, entschieden_amleerEntscheidung gilt für alle Meldungen des Ziels
Index(zustand, angelegt_am); (stelle_id); (firma_id)keine IP

premium_anfragen: id, firma_id FK, stelle_id FK leer (von welcher Stelle aus), konto_id FK (Admin), nachricht leer, zustand enum premium_zustand (angefragt, in_bearbeitung, freigeschaltet, abgelehnt), frist_am timestamptz (angelegt + 1 Werktag, für die Sortierung der Sicht anfragen_gesamt), angebot_am leer, entschieden_von/_am, bis_datum leer, top_plaetze leer, grund_pille, grund_satz, notiz; Index (zustand, frist_am), (firma_id). premium_phasen: id, firma_id FK, von date, bis date, top_plaetze smallint, betrag_netto numeric(10,2) Pflicht (nach dem Anlegen nicht änderbar, Korrektur nur als neue Zeile;, zahlung_id leer (ab Paket A1), grund text leer, angelegt_von FK konten, angelegt_am, beendet_am leer, beendet_grund text leer; jede Freischaltung, Verlängerung und jedes vorzeitige Ende schreibt eine Zeile; firmen.premium_bis bleibt als schnelle Kopie der jüngsten Phase; Grundlage für „frühere Premium-Phasen“ (1.3 Nr. 4) und die spätere Abrechnung je Monat.

firmen (ergänzt): pruefstufe enum pruefstufe: normal, ohne; Standard normal, geprueft_von FK leer, geprueft_am, gesperrt_von, gesperrt_am, sperr_pille enum, entsperrt_am, notiz_verwaltung text, premium_von (Verwaltungskonto), premium_angelegt_am. premium_bis, top_plaetze, sperr_grund, geprueft aus 1a bleiben. konten (ergänzt): zustand gesperrt kommt aus 2a (konto_zustand aktiv, gesperrt, geloescht; „registriert“ gibt es nicht, D19), hier dazu gesperrt_von/_am, sperr_pille, sperr_grund, entsperrt_am. stellen (ergänzt): nachbessern_pille enum (kein_betrieb, unvollstaendig, regeln, doppelt; auch für Offline nehmen), gesperrt_von/_am; nachbessern_grund, sperr_grund (1a) bleiben als Satz. sperrliste (26.10., ersetzt gesperrte_adressen): id uuid PK, art enum sperr_art (ip, ip_bereich, mail, mail_domain), wert text (Anzeige, so wie eingegeben), netz cidr leer (bei ip als /32 bzw. /128, bei ip_bereich der Bereich; Index GIST für <<=), mail citext leer (bei mail), domain citext leer (bei mail_domain), grund_pille enum sperr_pille Pflicht (Schlüssel aus fachlich/sperre/gruende.ts, wie firmen.sperr_pille), grund_satz text leer, gesperrt_von FK konten, angelegt_am, laeuft_ab_am timestamptz leer (leer = unbefristet, nur Super Admin), aufgehoben_am leer, aufgehoben_von FK leer, aufhebe_grund text leer („abgelaufen“ oder frei), treffer_anzahl integer Standard 0, letzter_treffer_am leer. Eindeutig (art, wert) bei aufgehoben_am leer (Teil-Index). Wirkung und Aufrufer: 1.15 Nr. 3. Aufgehobene Zeilen 12 Monate, dann gelöscht. konto_tokens (2a, ab 3 genutzt): zweck adresse_neu mit wert = neue Adresse und 24 Stunden Laufzeit für H135; genutzt_am setzt konten.mail um (1.4a). Keine neue Tabelle.

support_sitzungen: id, verwaltung_konto_id FK, firma_id FK, grund_pille enum (telefon, fehler, stelle_anlegen, pruefung), grund_satz, begonnen_am, endet_am (+60 Minuten), beendet_am leer, unterlagen_frei boolean (Grund-Fenster „Unterlagen öffnen“ nutzt dieselbe Tabelle mit grund_pille unterlagen_support/unterlagen_meldung; Annahme D7). sitzungen (2a) bekommt support_id FK leer. faktor_ruecksetzungen: id, konto_id FK, beantragt_von FK (Verwaltung), identitaet_geprueft boolean, grund, beantragt_am, link_ab_am (+24 h), token_hash eindeutig, abgebrochen_am leer, eingeloest_am leer, abbruch_token_hash eindeutig. protokoll (1a/2a, ergänzt): support_id FK leer, grund_pille text leer, person_entfernt_am (Anonymisierung nach 12 Monaten: wer → leer). Aktionen aus 3: firma_freigegeben, stelle_abgelehnt, rueckfrage, meldung_entschieden, stelle_gesperrt/entsperrt, firma_gesperrt/entsperrt, konto_gesperrt/entsperrt, support_begonnen/beendet, support_aenderung, datei_geoeffnet, kennwort_link, faktor_reset_beantragt/abgebrochen/eingeloest, nutzer_umgehaengt, rolle_geaendert, nutzer_entfernt, firma_geloescht, konto_geloescht, export_angestossen, premium_*, anfrage_*, kampagne_*, inhalt_*, fachbereich_zusammengefuehrt, einstellung_geaendert, schnittstelle_*, sperrliste_eintrag, sperrliste_aufgehoben, alarm_anmeldungen. Neu 26.10. (Rollen): admin_ernannt, verwaltung_rolle_geaendert, notfall_server (wer leer, grund = Skriptaufruf). Anzeige des Handelnden: anzeigeName(konto, betrachterRolle) in fachlich/verwaltung/anzeigename.ts liefert für Super-Admin-Konten „Betreiber“ (T protokoll.betreiber), wenn der Betrachter die Stufe Verwaltung hat; gespeichert bleibt immer das echte Konto, Super Admins sehen den Namen (D39).

werbung_flaechen: schluessel text PK (start, trefferliste, suchbegriffe, seitenleiste, stellenseite, ratgeber), name, seite, formate jsonb (nur Anzeige: Liste {geraet, breite, hoehe, art}; nie gefiltert), geraete text[], eigenwerbung boolean Standard true, aktiv boolean Standard true, sortierung. Werte aus K:49–86 als Migrations-Daten. werbung_anfragen: id, gruppe_id uuid (mehrere Flächen in einer Planung = mehrere Zeilen mit gleicher gruppe_id), name, firma, mail citext, telefon leer, flaeche_schluessel FK, format text, laufzeit_tage smallint, wunsch_start date, von, bis (berechnet), motiv_datei_id FK dateien leer (Datei mit zweck werbemotiv, konto_id leer, anfrage_id = diese Zeile), textanzeige jsonb leer (Firma, Titel, Text, Knopf; nur Anzeige), nachricht leer, einwilligung_am, zustand enum werbeanfrage_zustand (anfrage, uebernommen, nicht_angenommen), frist_am (+1 Werktag), kampagne_id FK leer; Index (zustand, frist_am), (gruppe_id). dateien (2a, ergänzt): zweck um werbemotiv, zertifikat, ratgeberbild erweitert; konto_id leer erlaubt für diese drei Zwecke; anfrage_id FK werbung_anfragen leer (Eigentümer-Ersatz beim Werbemotiv, bis die Kampagne entsteht); kampagne_id FK werbung_kampagnen leer; inhalt_id FK inhalte leer (ratgeberbild). Öffentliche Auslieferung nur nach 2a ausliefern.ts Fall „öffentlich“. werbung_kampagnen

FeldTypHinweis
iduuid PK
anfrage_idFK leer„ohne Anfrage“
kunde_name, kunde_firma, kunde_mail, kunde_telefontextaus der Anfrage vorbelegt
flaeche_schluesselFK werbung_flaechen
formattextabgeleitet
von, bisdateZeitraum
motiv_datei_idFK dateien leerim Browser neu kodiert (C35), Maße vom Server geprüft
textanzeigejsonb leerTrefferliste/Suchbegriffe
suchbegriffetext[] leernur Fläche suchbegriffe
zielseitetext, Pflicht beim Planenhttps
vorlesetexttext, Pflicht beim Planenalt
zustandenum werbung_zustand: angebot, angenommen, motiv_da, geplant, laeuft, pausiert, beendet, storniertT 5.5; bis 2b von Hand außer laeuft/beendet
start_mail_am, ende_mail_am, bericht_fehler, motiv_angefordert_amleerW04/W05; motiv_angefordert_am = W06 gesendet (H130)
wartet_auf_motivbooleanChip
grundtext, leerGrund bei Preis unter der Liste oder 0; NP 22)
betrag_nettonumeric(10,2), Pflicht ab zustand angenommenPreis der Kampagne; danach nicht änderbar, Korrektur als Storno und neue Kampagne; zahlung_id leer ab Paket A1
angelegt_von, notiz
Index(zustand, von); (flaeche_schluessel, von, bis)Kollisions-Satz

werbung_zaehlung_tag: kampagne_id FK, tag date, einblendungen integer, klicks integer; PK (kampagne_id, tag). 25 Monate. Keine IP, keine Cookies. mailvorlagen: schluessel text PK (mail.b.angekommen …, vorlage.firma.einladung …, vorlage.verwaltung.kennwort …), name_anzeige, wann_satz, betreff, text (Absätze mit {platzhalter}), pflicht_platzhalter text[], zustand enum (entwurf, veroeffentlicht), entwurf_betreff, entwurf_text, geaendert_von, veroeffentlicht_am. Fehlt die Zeile: Code-Vorlage gilt. inhalte (1b, ergänzt): bild_datei_id FK dateien leer (Ratgeber-Bild aus der Ablage, zweck ratgeberbild; die Seite liest es vor inhalte.bild), geloescht_am leer (Papierkorb 30 Tage), entwurf_seit (Zeile nach 14 Tagen), geaendert_von FK, seite_hinweis text (Seitentexte: „Startseite, Block Für Arbeitgeber“), seite_adresse. Mailvorlagen liegen in der eigenen Tabelle mailvorlagen, nicht in inhalte. inhalte_fassungen_historie: id, inhalt_id FK, sprache, html, gueltig_von, gueltig_bis leer, veroeffentlicht_von; nur Rechtstexte; einwilligungen.textfassung_id (2a) verweist auf id, einwilligungen.textfassung trägt zusätzlich Schlüssel + Stand als Text. fachbereiche (1a, ergänzt): ausgeblendet boolean Standard false; Begriffe je Sprache stehen in fachbereiche_fassungen (1a Teil 3, eine Zeile je Sprache, sprache als Text), keine Spalten je Sprache. firmen_schnittstellen: firma_id PK FK, abrufen boolean, adresse text, schluessel_verschluesselt text, schluessel_alt_verschluesselt leer, schluessel_alt_bis leer, schluessel_hinterlegt_am, zuordnung jsonb (Quelle-Bereich → fachbereich_id; nur Anzeige und Abgleich, nie gefiltert), weiterleiten boolean Standard false (2b), zieladresse leer (2b), letzter_abgleich_am, letzter_stand jsonb (anzahl, neu, beendet), stockt_seit leer, fehler_text leer. stellen_orte: stelle_id FK, plz_id FK, ort text; PK (stelle_id, plz_id). Weitere Orte einer Schnittstellen-Stelle für die Umkreissuche (1a suchen() bekommt OR über stellen_orte, Annahme D15). verwaltung_zahlen_tag: tag date PK, arbeitgeber, bewerber, stellen_aktiv, bewerbungen_woche, aufrufe_woche integer. einstellungen (ergänzt): pruefung {neue_firmen: true} (Schalter auf Prüfen, Verwaltung und Super Admin); fristen + {prueffrist_werktage: 1, kontaktanfrage_werktage: 1 (1b B9), ablauf_mail_tage: 5 (F08, B13), premium_tage: 30, papierkorb_tage: 30, rueckgaengig_sekunden: 10, job_alarm_monate: 12, protokoll_monate: 12, meldungen_monate: 12, support_minuten: 60, faktor_reset_stunden: 24, werbeanfrage_tage: 14, anmeldungen_tage: 30, geraete_monate: 12 (2a Teil 3 konto_geraete), sperrliste_tage_ip: 7, sperrliste_tage_standard: 30}; sicherheit {bremse_ip_fehlversuche: 50 (2a 1.1 Nr. 3), alarm_fehlversuche_ip: 100, alarm_konten_ip: 20} (1.16); schnittstelle {erlaubte_hosts: []} (1.13, nur Super Admin in Einstellungen › Betrieb); sitzung (2a) + {verwaltung_stunden: 8}; bundesagentur {zertifikat_verschluesselt, kennwort_verschluesselt, hinterlegt_am, uebertragung: false}; uebersetzung {anzeigen_automatisch: true, letzte_am, fehler_anzahl} (schreibt die Aufgabe aus Karte 2a 1.18; Anzeige 1.11 Nr. 3); wartung {an: false, bis: null}; betrieb {glitchtip_url}; preise {premium_30_tage, werbung je Fläche und Woche} (nur Super Admin, Protokoll;; funktionen + {bewerberansprache: false}; top_plaetze_standard (1a) bleibt. lieferungen (1a): erste Nutzung durch schnittstelle-abruf.ts (art schnittstelle, firma_id, Zeilenzahlen).

Zeilensperre (RLS): Rollen nach Karte 0 Teil 7 (einzige Quelle). bululu_<u>_verwaltung liest alles; Schreiben nur über Aktionen in fachlich/, Trigger verlangt eine protokoll-Zeile je Transaktion (Annahme D18, mit Ausnahmeliste für Merk- und Entwurfsspalten). Verwaltungskonten haben keine firmen_nutzer-Zeile. Der Support-Modus läuft NICHT als Verwaltungsrolle, sondern auf dem Pool der Konto-Rolle bululu_<u>_konto mit SET LOCAL app.konto_id (Verwaltungskonto), app.firma_id (Support-Firma) und app.support_id: so greifen die Firmen-Policies, darf() wendet die Sperrliste des Support-Modus an (Einladen, Zusage, Absage, Nachricht, Notizen lesen und schreiben, Team, Firma löschen, Premium anfragen), bewerbungs_notizen hat die Policy „nicht bei gesetztem app.support_id“, und fachlich/datei/ausliefern.ts prüft app.support_id als Erstes: Unterlagen im Support-Modus nur über den Weg „Öffnen (mit Grund)“ (H110) mit Protokollzeile datei_geoeffnet, nie als „Firma der Bewerbung“.

3.2 Abfragen und Aktionen 3 (Signaturen)

  • heuteZuTun(rolle, kontoId) → Zeile[] (höchstens 5 + Rest-Zahl), zahlen() → {arbeitgeber, bewerber, stellenAktiv, bewerbungenWoche, aufrufeWoche, vorwoche, stand}, seitLetztemBesuch(kontoId).
  • pruefungen({filter, seite}), pruefung(id), firmaFreigeben(id) (verzögert 10 s), stelleAblehnen(id, pille, satz), frageStellen(id, text), inOrdnung(id), pruefungenFreigeben(ids[]).
  • meldungAnlegen({zielArt, zielId, grund, text, mail}), meldungEntscheiden(zielId, entscheidung, pille?, satz?), stelleEntsperren(stelleId).
  • anfragen({art, zustand, seite}), anfrageOeffnen(id) (übernimmt), kontaktAntworten(id, text), ohneAntwort(id), anBetreiber(id), sperrlisteEintragen({art, wert, grund, tage}) (tage null = unbefristet, nur Super Admin), sperrlisteAufheben(id) (verzögert 10 s), sperrliste({art, zustand, seite}), letzteIps(kontoIds[]), premiumAnfragen(firmaId, stelleId, text), premiumFreischalten(id, bis, topPlaetze, preisNetto, grund?), premiumVerlaengern(firmaId, bis, preisNetto, grund?), premiumAblehnen(id, pille, satz), premiumBeenden(firmaId), angebotGeschickt(id, zurueck?).
  • suchen({q, rolle, zustand, seite}), firmaAnsicht(id), personAnsicht(id), protokollLesen(firmaId | kontoId, seite), firmaSperren(id, pille, satz), firmaEntsperren(id), kontoSperren(id, pille, satz), kontoEntsperren(id), supportStarten(firmaId, pille, satz), supportBeenden(), unterlagenFreigeben(firmaId | kontoId, pille, satz), kennwortLinkSenden(kontoId), faktorRuecksetzen(kontoId, identitaet, grund), faktorRuecksetzungAbbrechen(token), faktorRuecksetzungEinloesen(token), nutzerUmhaengen(kontoId, vonFirma, nachFirma, grund), bestaetigungErneut(firmaId).
  • werbeanfrageAnlegen(eingabe), kampagneAnlegen(anfrageId?), kampagneFeld(id, feld, wert), kampagnePlanen(id), kampagneBeenden(id) (verzögert), motivAnfordern(id) (W06 einmal je Kampagne), aktiveKampagne(flaeche, geraet) → Motiv | null, klick(kampagneId), flaecheSchalter(schluessel, feld, wert).
  • inhaltSpeichern(art, id, sprache, felder), inhaltVeroeffentlichen(id), rechtstextVeroeffentlichen(id) (neue Fassung), inhaltLoeschen(id) (Papierkorb), mailvorlageSpeichern(schluessel, betreff, text), mailvorlageTest(schluessel, an), fachbereichZusammenfuehren(von, nach) (verzögert 10 s), fachbereichSpeichern(id, felder).
  • einstellungSetzen(schluessel, wert) → {folgenSatz}, verwaltungEinladen(mail, rolle) (Stufe Verwaltung darf nur rolle verwaltung), verwaltungEinladungAnnehmen(token, kennwort), verwaltungRolle(kontoId, rolle) (nur Super Admin, H145), verwaltungEntfernen(kontoId), verwaltungKennwortLink(kontoId) und verwaltungFaktorRuecksetzen(kontoId, identitaet, grund) (nur Super Admin, nie eigenes Konto, H147), verwaltungskonten(betrachterRolle) (filtert super_admin für die Verwaltung), anzeigeName(kontoId, betrachterRolle), adminErnennen(firmaId, kontoId | mail, grund) (beide Stufen, H146), mailVerbindungPruefen() (H148), alleVerwaltungssitzungenBeenden(), wartung(an, bis). Notfallskript ohne App: db/verwaltung/notfall.ts (H149).
  • schnittstelleSchalter(firmaId, feld, wert), schluesselErzeugen(firmaId) → Klartext einmalig, jetztAbgleichen(firmaId), abgleichen(firmaId) (Hintergrund) → lieferungen.
4

Handlungen je Rolle in 3

Jeder Knopf der Verwaltung mit seiner Wirkung, getrennt nach Verwaltung, Betreiber, Firmen und Besuchern.

Aus der Aktionen-Matrix (FUNKTIONEN-CHECK, Werbekunde, Verwaltung, Automatismen) und P Verwaltung. Nummern laufen nach 2a weiter (H88 ff.). Tests wie 1a bis 2a ohne Browser (PGlite mit RLS, Testing Library im jsdom, Mails aus der Warteschlange); je Verwaltungs-Endpunkt ein Test mit Rolle verwaltung gegen Super-Admin-Handlungen (403) und ein Test, dass die zugehörigen Knöpfe und Karten im Markup der Verwaltung fehlen (D39) und mit Firmen-Sitzung gegen /verwaltung in pruefung/rechte/verwaltung.test.ts.

Rollen-Aufbau: Bewerber · Firma (Admin = Hauptrolle, Recruiter = Mitarbeiter) · Betreiber in zwei Stufen: Verwaltung (3BS, der Kunde) und Super Admin (Nomad, im Hintergrund, übergeordnet; für die Verwaltung unsichtbar).

Rolle × Handlung (Verwaltung) (P Verwaltung, FC Matrix): beide Stufen: Übersicht, Prüfen (alles), Anfragen (alles, auch „Zur Sperrliste“), Firmen und Nutzer (Support, Sperren, Entsperren, Premium, Umhängen, Kennwort-Link, Faktor zurücksetzen, Unterlagen mit Grund, Export auf Wunsch), Sperrliste (IP-Adresse, E-Mail-Adresse, Mail-Domain mit Frist 7/30/90 Tage; aufheben), Werbung (alles außer „Fläche aktiv“), Inhalte (alles), Mein Konto. Nur Super Admin: Einstellungen (alle Karten), Firma löschen, Bewerberkonto löschen, Sperrliste mit IP-Bereich oder „unbefristet“, Alarm-Zeilen der Anmeldungen, Fläche aktiv, Schnittstellen-Block, Betriebs-Zeilen in „Heute zu tun“, „Seit Ihrem letzten Besuch“ mit Technik-Einträgen, Mail-Versand (H148), Super-Admin-Konten sehen, Stufe ändern (H145), Kennwort-Link und Faktor-Rücksetzung für Verwaltungskonten (H147), Notfallweg über den Server (H149). Verwaltung zusätzlich zu beiden: Konten der eigenen Stufe einladen und entfernen (H150). Support-Modus (Verwaltung im Firmenbereich): alles der Rolle Admin außer Einladen, Zusage, Absagen, Nachricht senden, Notizen (lesen und schreiben), Team, Firma löschen, Premium anfragen. Firmen-Admin zusätzlich: Premium anfragen; Firmen-Admin und Recruiter: Top-Haken (Teil 4, H91). Besucher: Melden, Werbung planen. Verstoß → 403 fehler.rechte.betreiber „Dafür ist der Betreiber zuständig.“ (Server lehnt ab); Knöpfe, Karten und Listen der Super-Admin-Handlungen fehlen im Markup der Verwaltung ganz, eine direkt aufgerufene Super-Admin-Seite antwortet 404 (D39).

NrRolle · BildschirmKnopf/Link (Wortlaut T)WirkungTest (Datei · prüft)
H88Besucher · Stelle, Firmenprofil„Anzeige melden“ / „Firma melden“ → „Meldung senden“meldungen gemeldet; V03 an Verwaltung mit eingeschalteter Benachrichtigung; Zeile in Heute zu tun; Bremse 3/Stundepruefung/seiten/melden.test.ts · Grund Pflicht, Mail freiwillig, zweite Meldung derselben Anzeige bündelt in einer Prüfzeile
H89Besucher · Werbung planen„Unverbindlich anfragen“werbung_anfragen anfrage mit frist_am; W01 (Kunde), V04 (Verwaltung); Zielseite mit Frist-Satz; keine Beträge im Markuppruefung/seiten/werbung-planen.test.ts · sechs aktive Flächen, inaktive fehlen, Motiv-Maße als Satz nicht als Sperre, kein „€“ im HTML
H90Firmen-Admin · Stellen„Premium anfragen“ → „Anfragen“premium_anfragen angefragt, V04 Premium; Zeile firma.heute.premiumAngefragt; Recruiter: Knopf fehlt + Server lehnt abpruefung/seiten/firma-premium.test.ts · zweite Anfrage bei offener → Hinweis statt Zeile; mit premium_bis ≥ heute fehlt der Knopf
H91Firmen-Admin/Recruiter · Stelle bearbeitenHaken „Als Top-Stelle“stellen.top; nur mit premium_bis ≥ heute und freiem Platz; Satz „{n} von {m}“firma-premium.test.ts · bei 3 von 3 fehlt der Haken an der vierten Stelle; topStellen() (1a) zeigt sie
H92Verwaltung · AnmeldenCode bestätigen; ohne Faktor → Einrichtungs-Seitenur mit faktor-Zeile öffnet /verwaltung; Sitzung 8 hpruefung/seiten/verwaltung-layout.test.ts · Konto ohne Faktor sieht nur /verwaltung/faktor-einrichten; Firmen-Sitzung → fehler.rechte; verwaltung auf /verwaltung/einstellungen sieht nur die Karte Verwaltungskonten (Karten 1 bis 6 und 8 fehlen im Markup); einstellungSetzen als verwaltung → 403 fehler.rechte.betreiber
H93Verwaltung · ÜbersichtZeilen-Knöpfe Prüfen · Ansehen · Anfragen · Entscheiden · Kampagne anlegen · Erneut startenSprung in die Aufgabe; Reihenfolge überfällig → heute → morgen → ohne Frist; Betriebs-Zeilen nur Super Adminpruefung/fachlich/verwaltung/heute.test.ts · 7 offene Posten ergeben 5 Zeilen + „und 2 weitere“; Kontaktanfragen gebündelt; verwaltung ohne Mail-Zeile
H94Verwaltung · Prüfen (Liste)„Prüfen“, „In Ordnung“, Pillen, Sammel „Freigeben“öffnet; In Ordnung schließt auto_frei ohne Mail; Sammel verzögert 10 spruefung/seiten/pruefen.test.ts · Pillen nur bei beiden Arten; überfällige oben; Sammel-Freigabe schreibt n Protokollzeilen und n F10 nach 10 s
H95Verwaltung · Neue Firma„Freigeben“firmen.geprueft, Stelle aktiv, JSON-LD/Sitemap frei, Job-Alarm nimmt sie; Toast Rückgängig 10 s; F10 danach; nächste Prüfungpruefung/fachlich/pruefung/freigeben.test.ts · Rückgängig innerhalb 10 s: keine Mail, Zustand pruefung; nach 10 s: Mail in Warteschlange, google.ts liefert JSON-LD
H96Verwaltung · Neue Firma„Ablehnen“ → Pille → „Ablehnen und E-Mail senden“Stelle nachbessern + Pille + Satz; Firma bleibt aktiv/ungeprüft; F16 nach 10 s; Firma: Chip „Bitte ergänzen“, Zeile firma.heute.nachbessern; „Veröffentlichen“ → immer pruefung + erneut_eingereicht + neue Prüfzeile (art nachbesserung, C22)pruefung/fachlich/pruefung/ablehnen.test.ts · Stelle liefert 410 öffentlich; F16 enthält Pillen-Text nach außen („Angaben unvollständig“), nie „unseriös“; erneut eingereicht trägt Wort; auch eine geprüfte Firma landet nach Offline nehmen + Veröffentlichen in der Prüfliste
H97Verwaltung · Neue Firma„…“ → „Frage an die Firma stellen“ → „Frage senden“F17 mit mailto-Knopf; zustand rueckfrage; frist_am + 3 Werktage; nach 2 Werktagen Zeile verwaltung.heute.rueckfragepruefung/fachlich/pruefung/frage.test.ts · Auto-Freigabe läuft erst nach der verlängerten Frist
H98Automatik · Prüffrist2 h vorher Erinnerung; Ablauf → auto_freiStelle aktiv, firmen.geprueft true, F10 + V02, Gruppe „nachprüfen“ (D27)pruefung/hintergrund/pruefung-frist.test.ts · Werktagsrechnung (Freitag 16:00 → Montag 9:00), Erinnerung genau einmal; zweite Stelle der Firma nach auto_frei geht ohne Prüfung aktiv
H99Verwaltung · Meldung„Erledigt, bleibt online“ · „Offline nehmen“ · „…“ Stelle sperren · Firma sperren · Dem Melder antwortenZustände erledigt/offline(nachbessern + F16)/stelle_gesperrt/firma_gesperrt (F14); V06 an Melder mit Mail; mailtopruefung/fachlich/meldung/entscheiden.test.ts · drei Meldungen derselben Stelle werden zusammen erledigt, drei V06 nur an Melder mit Mail; gesperrte Stelle 410 + fehler.stelle.gesperrt für die Firma
H100Verwaltung · Meldung, Firmenansicht › Stellen„Stelle entsperren“gesperrt → aktiv, Rückgängig 10 s; laeuft_bis unverändert (Annahme D20)entsperren.test.ts · nur Verwaltung; Firma hat keinen Weg (darf() lehnt ab)
H101Verwaltung · Anfragen (Liste)Pillen Art/Zustand; „Öffnen“; „Kampagne anlegen“; Sammel „Als erledigt markieren“Öffnen → in_bearbeitung + uebernommen_von; Werbung → /werbung/neu?anfrage=pruefung/seiten/anfragen.test.ts · drei Arten in einer Liste nach frist_am; Öffnen durch zweite Person zeigt „übernommen von“
H102Verwaltung · KontaktanfrageVorlage-Pille · „Antwort senden“ · „Ohne Antwort erledigen“ · „An den Betreiber weitergeben“ (3BS) · „Zur Sperrliste“ (Verwaltung und Super Admin)V05 nach 10 s mit Reply-To 3BS, zustand beantwortet; erledigt; weitergegeben + Zeile beim Super Admin; Sperrlisten-Fenster vorbelegt mit der Absenderadresse (H136)pruefung/fachlich/anfrage/kontakt.test.ts · Vorlage mit ersetzten Platzhaltern; Reply-To aus einstellungen.betreiber; gesperrte Adresse: Kontaktformular meldet Erfolg, schreibt nichts
H103Verwaltung · Premium-Anfrage„Premium freischalten bis“ (+ Top-Plätze) · „Angebot geschickt“ / „Zurücknehmen“ · „Premium ablehnen“ · „Verlängern bis“firmen.premium_bis/top_plaetze, F11 nach 10 s; in_bearbeitung mit Datum; abgelehnt + F12; verlängert ohne neue Mail (Annahme D21); jede Freischaltung, Verlängerung und jedes Ende schreibt eine Zeile premium_phasen mit betrag_netto (Pflicht,pruefung/fachlich/anfrage/premium.test.ts · Firma sieht danach Haken; premium_phasen-Zeile je Freischaltung und Verlängerung; ohne Preis keine Freischaltung, Preis 0 nur Super Admin; Ablehnen-Pille Pflicht
H104Automatik · Premium5 Tage vorher Zeile bei der Firma; Ablauf → F13; „Premium beenden“ (Verwaltung) → F13 soforttop-Haken wirkungslos, stellen.top bleibtpruefung/hintergrund/premium-ablauf.test.ts · topStellen() leer nach Ablauf
H105Verwaltung · Firmen und NutzerSuche ab 3 Zeichen; Pillen Rolle/Zustand; Zeile öffnetTreffer in Firmenname, Nutzer, E-Mail, Stellentitelpruefung/fachlich/verwaltung/suche.test.ts · 2 Zeichen → nichts; Stellentitel findet Firma; ohne Suche „zuletzt aktiv“
H106Verwaltung · Firmenansicht„Im Namen dieser Firma handeln“ → Pille → Start; „Beenden“support_sitzungen, sitzungen.firma_id/support_id, Leiste im Firmenbereich; Einladen/Zusage/Absagen/Nachricht/Notizen/Team/Firma löschen/Premium anfragen gesperrt; Protokoll je Änderung; Zeile bei der Firma; Ende nach 60 Minutenpruefung/fachlich/firma/support.test.ts · darf('einladen') und darf('notiz_lesen') false im Support, Bewerbungsseite ohne Notiz-Block und RLS liefert keine bewerbungs_notizen-Zeile; Stelle bearbeiten schreibt protokoll mit support_id; Hintergrund beendet nach 60 Minuten; Öffnen einer Bewerbung setzt kein geoeffnet_am (FC 14)
H107Verwaltung · Firmenansicht„Sperren und E-Mail senden“ · „Entsperren“firmen gesperrt (Pille, Satz, wer, wann), Stellen 410, Firmennutzer fehler.gesperrt.firma, Bewerber: 410 Profil + Postfach-Satz; Rückgängig 10 s dann F14; Entsperren → aktiv, Stellen online, F15pruefung/fachlich/firma/sperren.test.ts · Bewerbung bleibt im Zustand, Postfach schreibgeschützt (FC 6); Entsperren stellt laeuft_bis nicht neu (D20)
H108Verwaltung · Firmenansicht „…“„Premium freischalten/beenden“ · „Nutzer umhängen“ · „Firma löschen“ (Super Admin, Kennwort)wie H103/H104; Umhängen: Zielfirma, Rolle recruiter, Grund Pflicht → Einladung (F02 an die Person, F02a an die Admins der Zielfirma), erst die Annahme hängt um, Protokoll mit Grund; Löschen: 2a loeschen.ts mit Export-ZIP, F18pruefung/fachlich/firma/umhaengen.test.ts · letzter Admin nicht umhängbar (fehler.team.letzterAdmin); ohne Grund keine Aktion; F02 und F02a in der Warteschlange; vor der Annahme bleibt die Person in der alten Firma; loeschen.test.ts (2a) mit Rolle super_admin, verwaltung → Rechte-Fehler
H109Verwaltung · Firmenansicht › Nutzer „…“„Link zum Zurücksetzen des Kennworts senden“ · „Zweiten Faktor zurücksetzen“ · „In andere Firma umhängen“ · „Rolle ändern“ · „Entfernen“A01 sofort; Art app: faktor_ruecksetzungen + A08 sofort, A04 nach 24 h, Abbrechen-Link; Art mail: A04 sofort ohne A08 und ohne Wartezeit (1.4 Nr. 4); Rolle/Entfernen über 2a team.ts mit Protokollpruefung/fachlich/konto/faktor-ruecksetzen.test.ts · ohne Pflicht-Haken keine Aktion; Abbrechen innerhalb 24 h → kein A04; Art mail → A04 sofort, kein A08; Einlösen löscht faktor, nächste Anmeldung ohne Code; Entfernen beim letzten Admin fehlt
H110Verwaltung · Firmenansicht › Bewerbungen„Unterlagen öffnen“ → Pille → „Öffnen und protokollieren“support_sitzungen (unterlagen) 60 Minuten; Liste lesend; jeder Download protokoll datei_geoeffnet mit Grund; nie „Gesichtet“pruefung/fachlich/firma/unterlagen.test.ts · /api/datei ohne Freigabe → 403; mit Freigabe → 200 + Protokoll; bewerbungen.geoeffnet_am bleibt leer
H111Verwaltung · Bewerberansicht„Kennwort-Link senden“ · „Zweiten Faktor zurücksetzen“ · „Sperren“ / „Entsperren“ · „Daten exportieren“ · „Konto löschen“ (Super Admin) · „Öffnen (mit Grund)“wie H109; Sperre: konten gesperrt, B18, Anmelden → fehler.gesperrt.konto, Bewerbungen bei Firmen sichtbar, Postfach schreibgeschützt; Entsperren B19; Export A05 an die Person; Löschen 2a loeschen.ts + A06pruefung/fachlich/konto/sperren.test.ts · Firma sieht Bewerbung mit Satz; Bewerber-Sitzung endet; Entsperren → aktiv
H112Verwaltung · Werbung„Kampagne anlegen“ (aus Anfrage / ohne) · Felder (sofort gespeichert) · „Kampagne planen“ · „…“ „Vorzeitig beenden“werbung_kampagnen; Anfrage → uebernommen; Planen prüft Fläche, Zeitraum, Motiv oder Textanzeige, Zielseite, Vorlesetext → geplant; Beenden Rückgängig 10 s → beendet + W05pruefung/seiten/werbung-verwaltung.test.ts · Planen ohne Zielseite → fehler.feld.*; Kollision zeigt Satz, blockiert nicht; verwaltung darf alles außer „Fläche aktiv“
H113Automatik · WerbungStart → laeuft + W04; Ende → beendet + W05 mit Zahlen; Starttag ohne Motiv → wartet_auf_motiv; Anfrage 14 Tage ohne Kampagne → nicht_angenommenpruefung/hintergrund/werbung-lauf.test.ts · W05 enthält Klicks und Einblendungen aus werbung_zaehlung_tag; W04 genau einmal
H114Besucher · WerbeflächeMotiv-Klick/api/w/[id] zählt Klick, 302 auf zielseite; Einblendung beim Rendern gezählt; ohne Kampagne Eigenmotiv (eigenwerbung an) oder keine Flächepruefung/bausteine/werbeflaeche/kampagne.test.ts · aktiveKampagne() nach Fläche, Gerät, Zeitraum, Zustand geplant/laeuft mit Motiv; eigenwerbung aus → kein ad-zone im Markup; alt = vorlesetext; rel sponsored
H115Verwaltung · Flächen„Wenn frei: Eigenwerbung zeigen“ · „Fläche aktiv“ (Super Admin)werbung_flaechen Felder; Werbeplanung zeigt nur aktivepruefung/fachlich/werbung/flaechen.test.ts · verwaltung „Fläche aktiv“ → Rechte-Fehler
H116Verwaltung · Inhalte › FachbereicheFelder sofort · „Auf der Startseite zeigen“ · „Zusammenführen mit …“ → „Zusammenführen“ · „Ausblenden“ · „Neuer Fachbereich“Stellen, Job-Alarme, Begriffe wandern; Rückgängig 10 s, dann zusammengefuehrt; 1a Listen zeigen den Fachbereich nicht mehr; Ausblenden nur bei 0 Stellenpruefung/fachlich/inhalte/fachbereich.test.ts · alter Name als Begriff findet Stellen; Rückgängig stellt alles zurück; Ausblenden mit Stellen → Fehler
H117Verwaltung · Inhalte › MailvorlagenFelder · Platzhalter-Chip · „Vorschau mit Beispieldaten“ · „Testmail an mich“ · „Veröffentlichen“mailvorlagen; Pflicht-Platzhalter fehlt → Satz, Veröffentlichen gesperrt; Mail-Dienst nutzt die Zeilepruefung/fachlich/inhalte/mailvorlagen.test.ts · B05 nach Änderung trägt neuen Betreff; Vorlage ohne {link} nicht veröffentlichbar; Testmail in Warteschlange an eigene Adresse
H118Verwaltung · Inhalte › Ratgeber, Rechtstexte, SeitentexteFelder · Sprach-Pillen · „Vorschau“ · „Veröffentlichen“ (Rechtstext mit Nachfrage) · „Neuer Artikel“ · „Löschen“ (Papierkorb)inhalte_fassungen, bereinigen.ts; Rechtstext → Historie mit gueltig_von; Löschen → geloescht_am, Rückgängig 10 s; 1b-Seiten zeigen die neue Fassungpruefung/fachlich/inhalte/schreiben.test.ts · Skript-Tag wird entfernt; Rechtstext-Historie wächst, alte Einwilligung verweist weiter auf alte id; ?vorschau= nur für Verwaltung
H119Super Admin · EinstellungenSchalter Funktionen · Fristen (Wert, Zurück auf Standard) · Übersetzung · KI · Bundesagentur „Speichern“/Schalter (gesperrt) · Betrieb (Alle Verwaltungssitzungen abmelden, Wartung einschalten) · Verwaltungskonten (Einladen, Stufe ändern, Entfernen; H145, H147) · Mail-Versand (H148)sofort + Toast + Protokoll; gefährliche Rückgängig 10 s; Zertifikat/Kennwort verschlüsselt, nie wieder lesbar; Wartung → einstellungen.wartung; V07 an Eingeladene; Einladung-Zielseite → Konto + Rolle + Faktor-Pflichtpruefung/seiten/einstellungen.test.ts · Funktion aus → istFrei() false und 2a-Oberfläche ohne Baustein; Frist-Änderung wirkt im nächsten fristen.ts-Lauf; letzter Super Admin nicht entfernbar; verwaltung → Rechte-Seite; Zertifikat in der DB nicht im Klartext
H120Super Admin · Firmenansicht › Schnittstelle„Stellen abrufen“ (Schalter) + Adresse · Zuordnung · „Neuen Schlüssel erzeugen“ · „Jetzt abgleichen“firmen_schnittstellen; Abgleich: neu → aktiv mit fremde_kennung, geändert → aktualisiert, fehlt → beendet; Stand-Zeile; stockt > 1 h → Zeile + Betriebsmail; Chip für 3BSpruefung/fachlich/schnittstelle/abgleich.test.ts · Stummel-Liste mit 3 Stellen: zweiter Lauf ohne Änderung schreibt nichts; entfernte Stelle → beendet, Bewerbung bleibt; laeuft_bis leer; keine F08/F09; mehrere Orte → stellen_orte und Umkreistreffer von jedem Ort; unzugeordneter Bereich → Stelle als Entwurf + Zeile „bitte zuordnen“ (Annahme D22)
H121Automatik · Fristentäglicher Lauf nach 1.14Löschungen je Frist; Protokoll anonymisiert; Werbeanfragen verfallenpruefung/hintergrund/fristen.test.ts (2a ergänzt) · je Frist ein Datensatz davor/danach; Zusage zählt als Abschluss (FC 23); Konto 24 Monate → A07, 27 → A06
H122Verwaltung · Mein KontoKennwort · Zweiter Faktor (Abschalten gesperrt) · Benachrichtigungen je Art · Abmelden2a-Karten; verwaltung_benachrichtigungen; V01/V03/V04 je Schalter, V02/V05–V07 immerpruefung/seiten/verwaltung-konto.test.ts · Faktor-Abschalten → fehler.rechte-Satz; V01 geht nur an Konten mit bnPruefen an
H123Verwaltung · jede ListeAuswahl (Strg/Umschalt-Klick, Strg+A, Esc), Leiste „{n} ausgewählt“ · „Freigeben“ · „Als erledigt markieren“Sammelaktion verzögert 10 s; Ergebnis-Satz „{ok} von {n} erledigt“ (T gemeinsam.auswahl.ergebnis, vorhanden; FC 26)pruefung/bausteine/auswahl/verwaltung.test.ts · gemischte Auswahl (Firma + Meldung) bietet nur „Als erledigt markieren“
H124Verwaltung (Verwaltung/Super Admin) · Prüfen„…“ › „Prüfung neuer Firmen ausschalten“ bzw. „Prüfung neuer Firmen einschalten“einstellungen.pruefung.neue_firmen; Rückgängig 10 s; Protokoll; danach veröffentlichte erste Stellen gehen ohne Prüfung sofort aktiv (kein F21/V01)pruefung/fachlich/pruefung/noetig.test.ts · Schalter aus → stelleVeroeffentlichen liefert aktiv, keine pruefungen-Zeile; offene Prüfungen bleiben
H125Verwaltung (Verwaltung/Super Admin) · Firmenansicht„Diese Firma vor der ersten Stelle prüfen: Ja / Nein“, nur solange die Firma nicht freigegeben istfirmen.pruefstufe; offene Prüfung → freigegeben mit F10 (wie H95), firmen.geprueft true; Premium aktiv = ohne Prüfungnoetig.test.ts · Firma mit Stufe ohne und Schalter an → keine Prüfung; freigegebene Firma zeigt statt der Pillen den Satz pruefstufeFreigegeben; Premium abgelaufen + Stufe normal → wieder Prüfung bei der nächsten Veröffentlichung einer Firma mit geprueft false
H126Verwaltung · Firmen und Nutzer„Firma anlegen“ → „Anlegen und Einladung senden“firmen (bestätigt, geprüft), firmen_einladungen Rolle admin, F02b; Protokollpruefung/fachlich/firma/verwaltung-anlegen.test.ts · doppelte Firma (Name + PLZ) wird nicht angelegt; Mail F02b mit Namen des Verwaltungskontos, ohne Ansprechperson „Guten Tag,“; Einladung angenommen → firmen_nutzer admin
H127Verwaltung · Firmenansicht › Nutzer„Person einladen“ (E-Mail, Rolle, Grund Pflicht) · „Zurückziehen“firmen_einladungen; F02 an die Person, F02a an alle Admins der Firma; Protokoll mit Grund; Rolle Admin nur bei Firma ohne aktive Admin-Person (H146)verwaltung-anlegen.test.ts · Verwaltung kann in jede Firma einladen; ohne Grund keine Einladung; F02a an die Admins; Firma ohne Admin bekommt beim Annehmen den ersten Admin
H129Verwaltung (Verwaltung/Super Admin) · Firmenansicht › Protokoll, BewerberansichtProtokoll lesen, „Mehr“protokoll je firma_id bzw. konto_id, neueste zuerst, 50 je Seite; Personen nach 12 Monaten unkenntlich (person_entfernt_am)pruefung/fachlich/verwaltung/protokoll.test.ts · fremde Firma liefert keine Zeilen (RLS bululu_<u>_verwaltung liest, Firmen-Sitzung bekommt 403); anonymisierte Zeile ohne Namen
H130Verwaltung (Verwaltung/Super Admin) · Werbung„Motiv anfordern“ (Kampagne ohne Motiv)W06 an kunde_mail mit Startdatum, werbung_kampagnen.motiv_angefordert_am, Protokoll kampagne_motiv_angefordert; danach Satz „angefordert am {datum}“ statt Knopfpruefung/fachlich/werbung/motiv-anfordern.test.ts · zweiter Klick sendet keine zweite Mail; Kampagne mit Motiv zeigt den Knopf nicht
H135Verwaltung (Verwaltung/Super Admin) · Firmenansicht › Nutzer „…“, Bewerberansicht„E-Mail-Adresse ändern“ → Fenster (neue Adresse, Haken Identität geprüft, Grund) → „Link an die neue Adresse senden“; Zielseite „Adresse bestätigt“konto_tokens adresse_neu (24 h), A10 an die neue, A11 an die alte Adresse, Chip „wartet auf Bestätigung“, Protokoll; Bestätigen schreibt konten.mail um, beendet alle Sitzungen; vergeben → fehler.feld.mailVergeben (1.4a, L2)pruefung/fachlich/konto/mail-aendern.test.ts · ohne Haken keine Aktion; bis zur Bestätigung meldet die alte Adresse an, die neue nicht; nach Bestätigung umgekehrt, Sitzungen weg; Firmen-Admin hat die Aktion nicht (darf() lehnt ab); abgelaufener Token → fehler.token.abgelaufen
H136Verwaltung (Verwaltung/Super Admin) · Sperrliste, Kontaktanfrage, Sperren-Fenster (Firma, Bewerber)„Eintrag hinzufügen“ → Fenster (Art, Wert, Grund, Frist 7/30/90/unbefristet) → „Sperren“ · „Aufheben“ · „Zur Sperrliste“ (Kontaktanfrage) · Haken „Auch die zuletzt genutzten IP-Adressen sperren“sperrliste-Zeile mit Grund-Pille und Frist (Standard 7 Tage bei IP, 30 bei E-Mail und Domain), Protokoll sperrliste_eintrag; Aufheben nach Rückgängig 10 s; Haken legt je IP aus anmeldungen (30 Tage) eine Zeile an; Wirkung 1.15 Nr. 3: anonyme Formulare Erfolg ohne Datensatz, Registrieren/Anmelden/Bewerben fehler.gesperrt.neutral; Treffer gezähltpruefung/fachlich/sperrliste/eintragen.test.ts, wirkung.test.ts, rechte · IP im CIDR trifft, Domain trifft alle Adressen, Frist abgelaufen trifft nicht; verwaltung ohne IP-Bereich und ohne unbefristet (Server lehnt ab); Freemail-Domain abgelehnt; Dublette zeigt Satz; gesperrte Registrierung schreibt nichts und zeigt die neutrale Meldung; bestehende Sitzung bleibt
H142Hintergrund · Sicherheitsprotokoll, SperrlisteFristen und Alarmfristen.ts löscht anmeldungen nach 30 Tagen; sperrliste-ablauf.ts hebt abgelaufene Einträge auf; anmeldungen-alarm.ts: über 100 Fehlversuche je Stunde von einer IP oder gegen über 20 Konten → Betriebsmail (D24) + Zeile verwaltung.heute.sperrlisteAlarm beim Super Admin mit Knopf „Sperrliste“ (Fenster vorbelegt), höchstens einmal je IP und 6 Stunden; Faktor eines Verwaltungskontos aus/zurückgesetzt → Betriebsmail ohne Schwelle; Verwaltungskonto von neuem Gerät → nur Zeile „Heute zu tun“, keine Mail (1.16, sicherheit Nr. 21); kein automatisches Sperrenpruefung/hintergrund/anmeldungen-alarm.test.ts, sperrliste-ablauf.test.ts · Schwelle 100 löst aus, 99 nicht; zweite Auslösung derselben IP in 6 Stunden unterdrückt; abgelaufene Zeile wird aufgehoben, unbefristete nicht; anmeldungen älter 30 Tage weg
H145Super Admin · Einstellungen › Verwaltungskonten „…“„Stufe ändern“ (Verwaltung ↔ Super Admin) · „Entfernen“verwaltung_konten.rolle; Protokoll verwaltung_rolle_geaendert; letztes Super-Admin-Konto: Satz statt Menüpunkt, Server lehnt ab; Hochstufen beendet alle Sitzungen des Kontos (Faktor-App bleibt); eigenes Konto nicht änderbarpruefung/fachlich/verwaltung/konten.test.ts · verwaltung darf nicht hochstufen (403 fehler.rechte.betreiber); letzter Super Admin nicht abstufbar und nicht entfernbar; Liste für verwaltung enthält keine super_admin-Zeile, auch nicht in der Zahl
H146Verwaltung (beide Stufen) · Firmenansicht „…“„Neuen Admin ernennen“ (nur bei einer Firma ohne aktive Admin-Person) → Fenster: vorhandenen Nutzer wählen oder E-Mail, Grund → „Ernennen“vorhandener Recruiter → firmen_nutzer.rolle admin (2a team.ts, Mail wie bei „Rolle ändern“); neue Adresse → Einladung mit Rolle Admin (F02, {einladender} = „Bululu“); Protokoll admin_ernannt mit Grund; Chip T verwaltung.firmen.ohneAdminChip „Ohne Admin“ in Firmenliste und Firmenansichtpruefung/fachlich/firma/admin-ernennen.test.ts · Firma mit aktivem Admin zeigt den Knopf nicht und der Server lehnt ab; Recruiter wird admin und sieht Team; neue Adresse erzeugt eine Einladung admin; Stufe verwaltung und Stufe super_admin dürfen beide ernennen
H147Super Admin · Einstellungen › Verwaltungskonten „…“„Kennwort-Link senden“ · „Zweiten Faktor zurücksetzen“ (für Konten beider Stufen)wie 1.4 Nr. 4: A01 sofort; Faktor: Identität geprüft + Grund → faktor_ruecksetzungen, A08 sofort mit „Abbrechen“, A04 nach 24 h; zusätzlich Betriebsmail an alle Super Admins (1.16); eigenes Konto: Menüpunkte fehlen, Server lehnt abpruefung/fachlich/verwaltung/konten.test.ts · verwaltung sieht die Menüpunkte nicht und bekommt 403; Super Admin auf das eigene Konto → 403; Rücksetzung eines Super-Admin-Kontos erzeugt die Betriebsmail; nach A04 richtet das Konto den Faktor neu ein, bevor /verwaltung aufgeht
H148Super Admin · Einstellungen › Mail-VersandFelder Absender, Anzeigename, Antwortadresse (sofort gespeichert) · „Testmail an mich senden“einstellungen.betreiber.absender_mail/.absender_name/.kontakt_mail_3bs, Protokoll einstellung_geaendert; Testmail über die Warteschlange an das eigene Konto; Zustands-Zeilen aus den Plattform-Variablen, Kennwort nie als Wertpruefung/seiten/einstellungen.test.ts · Karte fehlt im Markup für verwaltung; Testmail liegt in mail_warteschlange mit Empfänger = eigene Adresse; SMTP_PASS erscheint nirgends in der Antwort; ungültige Absenderadresse → fehler.feld.mail
H149Nomad · Server (Notfallweg ohne Oberfläche)db/verwaltung/notfall.ts faktor-loeschen <mail> --bestaetigen · … super-admin <mail> --bestaetigen · … sitzungen-beenden --bestaetigennur auf dem Server mit DATABASE_URL, kein Weg über die App: löscht die faktor-Zeile eines Kontos und beendet seine Sitzungen (nächste Anmeldung richtet den Faktor neu ein) · legt ein Super-Admin-Konto an oder stuft ein vorhandenes hoch (A01 an die Adresse) · beendet alle Verwaltungssitzungen; jede Handlung → protokoll notfall_server (wer leer, grund = Aufruf) + Betriebsmail an alle Super Admins; Betriebshandbuch Karte 0 Teil 11 Kapitel 11pruefung/db/notfall.test.ts · Konto ohne faktor meldet sich an und landet auf /verwaltung/faktor-einrichten; zweites Super-Admin-Konto entsteht mit rolle super_admin; ohne --bestaetigen nur Ausgabe, keine Änderung; erstes-konto.ts (Karte 4 T4) bleibt nur für leere verwaltung_konten
H150Verwaltung · Einstellungen › Verwaltungskonten„Einladen“ (nur Stufe Verwaltung) · „Entfernen“ (nicht das letzte Verwaltungskonto)verwaltung_einladungen mit rolle verwaltung + V07; Entfernen → entfernt_am, Sitzungen beendet, Protokoll; Super-Admin-Konten nie in Liste, Zahl oder Protokollnamen (anzeigeName → „Betreiber“); Satz T .kontenBetreiberHilfe statt Kennwort-Link und Faktorpruefung/rechte/verwaltung.test.ts · Einladung mit rolle super_admin durch verwaltung → 403; Liste ohne super_admin-Zeile; letztes Verwaltungskonto zeigt T .kontenLetzteVerwaltung; Protokollzeile einer Super-Admin-Handlung zeigt „Betreiber“ für verwaltung und den Namen für super_admin
5

Zustände je Seite

Was jede Seite zeigt, wenn nichts zu tun ist, etwas lädt, ein Fehler auftritt oder ein Eintrag nicht mehr da ist.

SeiteleerlädtFehlernicht gefunden / Rechtenicht mehr verfügbar
Verwaltung (Layout)entfälltLadebalken 1afehler.netz.*keine Verwaltungsrolle → fehler.rechte. (2a Fehlerseite) mit „Zur Startseite“; verwaltung auf Nomad-Seite → „Dafür ist der Betreiber zuständig“ + „Zurück zur Übersicht“; Sitzung abgelaufen → fehler.sitzung. + Anmelden mit weiter=Faktor fehlt → nur /verwaltung/faktor-einrichten
Übersicht„Nichts offen. Nächste Frist: …“ / ohne Frist zweiter Satz (T verwaltung.leer.heute / .heuteOhneFrist)Platzhalter je Block (1a)Zahlen nicht ladbar → Tageskopie mit „Stand {zeit}“, kein roter Kasten
Prüfen (Liste)„Nichts zu prüfen.“ (T verwaltung.leer.pruefen), mit nächster FristPlatzhalter-ZeilenLadefehler-Baustein
Prüfung (geöffnet)entfälltServer-SeiteFreigabe scheitert → Satz am Knopf, Eingaben bleiben, „Erneut versuchen“Prüfung unbekannt → 404; „Kollege hat offen“ erst 2b.9Stelle beendet/gelöscht → Satz „Die Stelle wurde inzwischen beendet. Nichts mehr zu tun.“ + „Nächste“
Anfragen (Liste)„Keine offene Anfrage.“ (T verwaltung.leer.anfragen)Platzhalter-Zeilen
Anfrage (geöffnet)entfälltAntwort scheitert → Satz, Text bleibt404Premium schon aktiv → Hauptknopf „Verlängern bis“; Anfrage erledigt → nur lesend mit Zustand
Firmen und Nutzerohne Suche am ersten Tag „Noch keine Firmen. …“; nach Suche „Nichts gefunden für „{q}“. …“ (T verwaltung.firmen.leer, T 7.7; nach Suche T verwaltung.leer.suche)Suchvorschläge live, Platzhalter
Firmenansicht / BewerberansichtAbschnitte ohne Inhalt fehlenServer-SeiteAktion scheitert → Satz am Knopf404; verwaltung sieht Löschen/Schnittstelle nichtgelöscht → 30 Tage lesend mit Chip „Gelöscht, Export vorhanden“ (nur Super Admin), danach 404; gesperrt → Chip + Entsperren
Sperrliste„Die Sperrliste ist leer.“ (T verwaltung.sperrliste.leer)Platzhalter-ZeilenWert ungültig → fehler.feld.* am Feld; Dublette → Satz mit Frist; Freemail-Domain → Satz, kein Eintragverwaltung sieht Pille „IP-Bereich“ und Frist „Unbefristet“ nicht (Server lehnt ab, fehler.rechte.betreiber)abgelaufene und aufgehobene Einträge in der zweiten Pille, 12 Monate lesbar
Support-Modus (Firmenbereich)wie 2awie 2aSperrliste → Knöpfe fehlen + Satznach 60 Minuten Leiste weg, nächste Aktion → Rechte-Fehler mit Hinweis
Werbung (Liste)„Keine Kampagnen. Anfragen kommen über „Werbung planen“ …“ (T verwaltung.leer.werbung)Platzhalter
Kampagneentfälltje Feld „Gespeichert {uhrzeit}“Motiv: fehler.datei.* (Maße als Satz, kein Fehler); Zielseite leer beim Planen → fehler.feld.pflicht; Kollision → Satz404beendet/storniert → lesend
Flächenentfällt (sechs feste)verwaltung: „Fläche aktiv“ fehlt
Werbung planen (öffentlich)entfälltSchritt-Wechsel sofort; Upload mit FortschrittFeldfehler; Honigfeld still; gesperrte Adresse → Erfolg ohne Datensatzkeine aktive Fläche → Seite zeigt Satz T werbung.keineFlaeche (T 7.7) + Kontaktformular
Melden (Fenster)entfälltGrund fehlt → fehler.feld.; Bremse → fehler.versuche.Stelle nicht sichtbar → kein Knopf (1a 410-Seite)
Inhalte (Liste/Formular)Papierkorb leer → Gruppe fehltje Feld sofortbereinigen entfernt Unerlaubtes still; Pflicht-Platzhalter fehlt → Satz + Veröffentlichen gesperrt404gelöscht → im Papierkorb 30 Tage mit „Wiederherstellen“
Einstellungenentfälltje KarteDienst gestört → Satz in der Karte + Zeile in Heute zu tunverwaltung → Rechte-Seite
Faktor einrichten, Zielseiten (Reset, Abbrechen, Einladung)entfälltServer-SeiteToken falsch/abgelaufen → fehler.link.* (1b) ohne „neu anfordern“ (Verwaltung muss neu beantragen; Satz T verwaltung.einladung.ungueltig, T 7.7)
6

Dateien mit geschätzter Größe und Wegweiser-Zeilen

Liste der Programmdateien mit geschätztem Umfang, nur für die Programmierung.

Dieser Abschnitt beschreibt nur die technische Umsetzung. Mit dem Schalter „Technische Angaben“ blenden Sie ihn ein.

Richtwert 600 Zeilen, Notbremse 1.500; Schätzungen in Zeilen; nur Neues und Geändertes gegenüber 1a/1b/2a.

6.1 Dateiliste

DateiZ.Inhalt
app/verwaltung/layout.tsx · page.tsx · _uebersicht/HeuteZuTun.tsx · Zahlen.tsx (LetzterBesuch.tsx erst 2b.9)90 · 50 · 80 · 90 · 90Rahmen mit Rollen- und Faktor-Prüfung; Übersicht
…/pruefen/page.tsx · _liste/PruefListe.tsx · [id]/page.tsx · _firma/Pruefkarte.tsx · Entscheidung.tsx · Notiz.tsx · _meldung/Meldungen.tsx · Entscheidung.tsx60 · 180 · 80 · 160 · 200 · 40 · 140 · 180Liste mit Auswahl; Prüfkarte; Fenster über grundfenster/
…/anfragen/page.tsx · _liste/AnfragenListe.tsx · [id]/page.tsx · _kontakt/Antwort.tsx · Zusammenhang.tsx · _premium/Entscheidung.tsx60 · 160 · 80 · 200 · 60 · 220
…/firmen/page.tsx · _suche/Suche.tsx · Ergebnisse.tsx · [id]/page.tsx · _firma/Kopf.tsx · SupportLeisteStart.tsx · Stellen.tsx · Nutzer.tsx · Bewerbungen.tsx · Unterlagen.tsx · Protokoll.tsx · Notiz.tsx · Schnittstelle.tsx · personen/[id]/page.tsx · _person/Kopf.tsx · Aktionen.tsx · Einwilligungen.tsx60 · 140 · 120 · 100 · 160 · 120 · 90 · 240 · 80 · 120 · 80 · 40 · 220 · 80 · 80 · 260 · 60Firmenansicht als Detailseite mit Sprungmarken
…/werbung/page.tsx · _liste/Kampagnen.tsx · neu/page.tsx · [id]/page.tsx · _formular/KampagneFormular.tsx · Vorschau.tsx · Zaehlung.tsx · flaechen/page.tsx · _flaechen/Flaeche.tsx60 · 160 · 40 · 80 · 340 · 120 · 80 · 60 · 120Mindestteil
…/inhalte/page.tsx · _liste/InhalteListe.tsx · fachbereiche/[id]/page.tsx · _fachbereich/Formular.tsx · Zusammenfuehren.tsx · [art]/[id]/page.tsx · [art]/neu/page.tsx · _inhalt/InhaltFormular.tsx · MailvorlageFormular.tsx · Fassungen.tsx60 · 140 · 60 · 200 · 120 · 80 · 40 · 260 · 220 · 80einfache Formulare, kein Editor
…/einstellungen/page.tsx · _einstellungen/Funktionen.tsx · Fristen.tsx · Uebersetzung.tsx · Ki.tsx · Bundesagentur.tsx · Betrieb.tsx · Verwaltungskonten.tsx80 · 120 · 160 · 120 · 60 · 140 · 180 · 180
…/konto/page.tsx · faktor-einrichten/page.tsx · einladung/page.tsx80 · 60 · 120
(oeffentlich)/konto/adresse-bestaetigt/page.tsx · fachlich/konto/mailAendern.ts · grundfenster (Variante mailAendern) · dienste/mail/vorlagen/a10.tsx · a11.tsx · pruefung/fachlich/konto/mail-aendern.test.ts60 · 110 · +40 · 40 · 40 · 120H135 (L2, 26.10.)
(oeffentlich)/konto/faktor-reset/page.tsx · faktor-reset/abbrechen/page.tsx60 · 50Zielseiten
…/firmen/sperrliste/page.tsx · _sperrliste/Liste.tsx · Eintrag.tsx · _firma/Anmeldungen.tsx · dienste/sperrliste.ts · fachlich/sperrliste/ (5) · hintergrund/aufgaben/sperrliste-ablauf.ts · anmeldungen-alarm.ts · pruefung/fachlich/sperrliste/.test.ts (3) · pruefung/hintergrund/anmeldungen-alarm.test.ts · sperrliste-ablauf.test.ts60 · 160 · 200 · 80 · 90 · ~320 · 40 · 90 · je 80–160 · 100 · 60H136, H142 (Sicherheit 26.10.)
(oeffentlich)/fuer-arbeitgeber/werbung/page.tsx · _planung/Schritt1.tsx · Schritt2.tsx · Schritt3.tsx · Erfolg.tsx60 · 160 · 260 · 160 · 50Konfigurator aus B, Stil b
(oeffentlich)/stelle/[adresse]/melden/page.tsx · firmen/[adresse]/melden/page.tsx60 · 60ohne JS
(firma)/firma/stellen/_liste/PremiumAnfragen.tsx · _formular/TopHaken.tsx100 · 60ergänzt 2a
bausteine/grundfenster/ · mailvorschau/ · supportleiste/ · verwaltungsliste/ · verwaltungsleiste/ · hinweise/ · melden/ · werbeplanung/ · schalter/*220 · 80 · 90 · 340 · 90 · 60 · 180 · 520 · 80werbeplanung.css = konfigurator.css (unverändert, ~400 Z. kopiert)
fachlich/verwaltung/ (6 Dateien) · pruefung/ (9) · meldung/ (4) · anfrage/ (7) · firma/sperren.ts · support.ts · nutzerUmhaengen.ts · unterlagen.ts · notiz.ts · konto/sperren.ts · faktorRuecksetzen.ts · kennwortLink.ts · werbung/ (9) · inhalte/schreiben.ts · mailvorlagen.ts · fachbereich/ (2) · schnittstelle/ (5) · einstellungen/ (3)560 · 620 · 260 · 560 · 120 · 160 · 80 · 100 · 40 · 120 · 180 · 50 · 760 · 220 · 180 · 200 · 460 · 240je Datei unter 150 Z.
dienste/mail/vorlagen/v01–v07, w01–w08, f10–f17, b18, b19, a04, a08, betriebsmailje 30–60
hintergrund/aufgaben/pruefung-frist.ts · premium-ablauf.ts · werbung-lauf.ts · werbeanfrage-verfall.ts · schnittstelle-abruf.ts · support-ende.ts · faktor-ruecksetzung.ts · zahlen-tageskopie.ts · protokoll-anonymisieren.ts · fristen.ts (ergänzt)90 · 70 · 120 · 40 · 120 · 40 · 60 · 50 · 40 · +120
app/api/w/[id]/route.ts40Zähl-Weiterleitung
dienste/db/schema/* (17 neue Tabellen) · db/migrationen/0004_verwaltung.sql + rueckweg · musterdaten/verwaltung.ts~500 · 420 · 220
sprachen/de/verwaltung.json · melden.json · werbung.json (+ en/tr für melden, werbung) · status.json (ergänzt)Schlüssel aus T 1.3, 1.9, 1.10, 5.5, 7.3, 7.7 (neu)
pruefung/seiten/.test.ts (9) · fachlich/*/.test.ts (18) · hintergrund/.test.ts (4) · bausteine/*.test.ts (3) · rechte/verwaltung.test.tsje 80–240Teil 4

6.2 Zeilen für ARCHITEKTUR.md

Seite → Dateien:

  • Verwaltung-Rahmen = app/verwaltung/layout.tsx · Bausteine seitenrahmen (Variante verwaltung), kontomenue · dienste/auth, fachlich/verwaltung/rolle · Tests verwaltung-layout.test.ts, rechte/verwaltung.test.ts
  • Übersicht = app/verwaltung/page.tsx + _uebersicht/* · Bausteine jetztwichtig (Variante verwaltung) · fachlich/verwaltung (heute, zahlen, letzterBesuch) · hintergrund zahlen-tageskopie · sprachen verwaltung.json (7.3) · Tests heute.test.ts
  • Prüfen = app/verwaltung/pruefen/ · Bausteine verwaltungsliste, grundfenster, mailvorschau, hinweise, auswahl (2a), 1a _stelle/ lesend · fachlich/pruefung, fachlich/meldung · dienste/mail (V01, V02, V03, V06, F10, F16, F17) · hintergrund pruefung-frist · Tests pruefen.test.ts, fachlich/pruefung/, fachlich/meldung/
  • Anfragen = app/verwaltung/anfragen/ · Bausteine verwaltungsliste, grundfenster · fachlich/anfrage (kontakt, premium) · dienste/mail (V04, V05, F11, F12, F13) · hintergrund premium-ablauf, werbeanfrage-verfall · Tests anfragen.test.ts, fachlich/anfrage/
  • Firmen und Nutzer = app/verwaltung/firmen/, personen/ · Bausteine verwaltungsliste, grundfenster, supportleiste (im 2a-Firmenbereich), schalter · fachlich/verwaltung/suche, fachlich/firma (sperren, support, nutzerUmhaengen, unterlagen), fachlich/konto (sperren, faktorRuecksetzen, kennwortLink), fachlich/schnittstelle · dienste/mail (F14, F15, F18, B18, B19, A01, A04, A08, A05, A06) · hintergrund support-ende, faktor-ruecksetzung, schnittstelle-abruf · Tests suche.test.ts, fachlich/firma/, fachlich/konto/, fachlich/schnittstelle/*
  • Werbung = app/verwaltung/werbung/, (oeffentlich)/fuer-arbeitgeber/werbung/, app/api/w/[id] · Bausteine werbeplanung, ablage (2a), werbeflaeche (1a, erweitert), schalter · fachlich/werbung · dienste/mail (W01, W04, W05, W06; W02, W03, W07, W08 nur Vorlagen) · hintergrund werbung-lauf · Tests werbung-planen.test.ts, werbung-verwaltung.test.ts, fachlich/werbung/*, bausteine/werbeflaeche/kampagne.test.ts
  • Inhalte = app/verwaltung/inhalte/ · Bausteine verwaltungsliste, ablage, mailvorschau, 1b inhalt/bereinigen · fachlich/inhalte (schreiben, mailvorlagen, fachbereich) · Tests fachlich/inhalte/
  • Einstellungen = app/verwaltung/einstellungen/, konto/, faktor-einrichten/, einladung/ · Bausteine schalter, faktor (2a) · fachlich/einstellungen, fachlich/verwaltung/konten · dienste/mail (V07, betriebsmail) · Tests einstellungen.test.ts, verwaltung-konto.test.ts
  • Melden = bausteine/melden/*, (oeffentlich)/stelle/[adresse]/melden, firmen/[adresse]/melden · fachlich/meldung/anlegen · Tests melden.test.ts
  • Datenschutz und Fristen = hintergrund/aufgaben/fristen.ts (ergänzt), protokoll-anonymisieren.ts · fachlich/einstellungen/lesen (fristen) · Tests hintergrund/fristen.test.ts

Regeln für diese Karte: jede Verwaltungshandlung läuft über eine Aktion in fachlich/ mit Protokoll-Zeile in derselben Transaktion (Trigger); keine Seite liest die Datenbank direkt; Verwaltungs-Mails heißen nach der Nummer; nichts COPLA-Spezifisches im Code (Zuordnung in firmen_schnittstellen).

7

Offene Punkte (Weichen), Annahmen, Textschlüssel

Getroffene Entscheidungen mit Begründung, was vor dem Bau noch zu klären ist und Ideen für später.

7.1 Weichen (A = mein Vorschlag, je A entschieden als Annahme)

NrWeicheAB
W1Inhalte zum Livegang: Zeitplan sagt „Inhalte als einfache Formulare“, U 3.19 beschreibt den Tiptap-Editor, 2b sagt „Text-Editor … bis dahin pflegt Nomad sie“.einfache Formulare mit Textfeld für bereinigtes HTML (Ratgeber, Rechtstexte, Seitentexte), Mailvorlagen als Textfeld mit Platzhalter-Chips, Fachbereiche vollständig; Tiptap und Übersetzen-Knöpfe 2b (Annahme D13). Für den Nutzer: Super Admin und Verwaltung können Texte ab dem Livegang ändern, nur ohne Formatierknöpfe.nur Fachbereiche und Mailvorlagen; Ratgeber, Rechts- und Seitentexte bis 2b allein über das Einspielskript (1b)
W2Werbeplanung öffentlich: U 3.21 (sechs Flächen, Laufzeit-Pillen, Wunsch-Start, Textanzeige) gegen U 3.23/T 1.10 (drei Flächen, von/bis). FC 13.U 3.21 gilt, T 1.10 werbung.* ist vollständig (T 7.7). Für den Werbekunden: alle sechs Flächen aus B wählbar, Zeitraum über Laufzeit und Wunsch-Start.drei Flächen, von/bis wie T 1.10
W3COPLA-Abruf ohne COPLA-seitige Änderung: Plan nennt Signatur je Sendung, die COPLA-Seite (bululu.py) kommt aber erst 2b.zum Livegang Abruf der vorhandenen Liste über https mit Schlüssel als Bearer-Kopfzeile (Bululu-Seite prüft Signatur, sobald COPLA sie liefert; Annahme D16). Für COPLA: nichts zu tun außer Schlüssel hinterlegen, sobald die Liste ihn verlangt.Signatur Pflicht ab Livegang, dafür bululu.py (Teil 1: Schlüsselprüfung an /api/stellen) in Abschnitt 3 vorziehen (ein halber Tag, COPLA-Deploy nötig)
W4W04 am Starttag (T 6.6) oder am Vortag (U 3.22 M4). FC 20.Starttag, Wortlaut T „seit heute“ (Annahme D11). Für den Kunden: die Mail kommt, wenn die Werbung schon zu sehen ist, mit Knopf „Werbung ansehen“.Vortag, W04-Text auf „ab morgen“ ändern
W5Verwaltungs-Adressen ohne Sprachpräfix (/verwaltung) oder unter /de/verwaltung.ohne Präfix (nur Deutsch, kein hreflang; Annahme D1). Für die Verwaltung: kürzere Adresse, Mails verlinken direkt./de/verwaltung, proxy.ts leitet um
W6Zahlen der Übersicht live rechnen oder Tageskopie.Tageskopie verwaltung_zahlen_tag + Wochenwerte live aus zaehler_tag (Annahme D3); „Zahlen nicht ladbar“ zeigt den letzten Tag. Für die Verwaltung: Zahlen bis auf den Vortag, Veränderung zur Vorwoche echt.alles live je Aufruf (langsam bei 5 Zählabfragen)
W7Meldung zu einem Firmenprofil: welche Entscheidungen.nur „Erledigt“ und „Firma sperren“ (kein Offline/Nachbessern für ein Profil; Annahme D4).zusätzlich „Profil leeren“ (Beschreibung und Logo entfernen) mit Mail; nicht beauftragt

7.2 Annahmen

NrAnnahme
D1Verwaltung unter /verwaltung ohne [locale]; alle Texte nur de (P Sprachen).
D2Verwaltungs-Sitzung 8 Stunden fest („feste Höchstdauer“, P Sicherheit), kein „angemeldet bleiben“; Wert in einstellungen.sitzung.verwaltung_stunden (neben bewerber_tage und firma_tage aus 2a).
D3Kennzahlen: Tageskopie + Wochenwerte live (W6 A).
D4Meldung zu Firmenprofil: Erledigt oder Firma sperren (W7 A).
D5Prüffrist = nächster Werktag 9:00 nach Veröffentlichung (Werktage Mo–Fr, Feiertage NRW aus fester Liste in fachlich/pruefung/werktage.ts); Zeitzone Europe/Berlin.
D6Gesperrte Adresse: Formulare zeigen Erfolg, schreiben nichts, keine Mail (kein Hinweis an Spammer).
D7Unterlagen-Freigabe nach Grund-Fenster gilt 60 Minuten (wie Support) und liegt in support_sitzungen.
D8Die Zeile „Bululu hat am … auf Ihren Wunsch …“ im Firmenbereich ist eine Jetzt-wichtig-Zeile ohne Knopf, 7 Tage sichtbar, aus protokoll mit support_id.
D9Verwaltungskonten sind nie Firmennutzer oder Bewerber (eigene Adressen, z. B. verwaltung@…); ein Konto mit Verwaltungsrolle verliert die Bewerber-Reiter.
D10Flächen-Belegung zum Livegang als Liste (Kunde, Zeitraum) statt Zeitleiste; Zeitleiste 2b.
D11W04 am Starttag (W4 A).
D12W01-Vorschaubild = Miniatur der Nachbildung mit dem Motiv (PNG, Anhang); ohne Motiv kein Bild.
D13Inhalte als einfache Formulare, HTML-Textfeld mit Bereinigung (W1 A).
D14Bundesagentur-Karte zum Livegang: Zertifikat und Kennwort speicherbar, Schalter „Übertragung“ gesperrt mit Satz; Übertragung 2b.
D15Mehrere Orte einer Schnittstellen-Stelle: erster = Standort, weitere in stellen_orte; 1a suchen() findet über beide.
D16COPLA-Abruf ohne Signatur bis bululu.py da ist (W3 A).
D17Fristen ohne Plan-Wert: Meldungen, Prüfungen, Support-Sitzungen, beantwortete Kontaktanfragen 12 Monate; Faktor-Rücksetzungen 30 Tage; Werbe-Zählung 25 Monate.
D18Protokoll-Pflicht zuerst im Code: jede Verwaltungsaktion in fachlich/ schreibt ihre protokoll-Zeile in derselben Transaktion (fachlich/aktion.ts verlangt sie, Test je Aktion). Der Trigger (Schreibzugriff der Rolle bululu_<u>_verwaltung ohne protokoll-Zeile in derselben Transaktion schlägt fehl) kommt mit einer Ausnahmeliste für Merk- und Entwurfsspalten, die sofort speichern: pruefungen.geoeffnet_von/_am, meldungen.uebernommen_von, Notiz-Felder (firmen.notiz_verwaltung, Bewerber-Notiz), Werbung-Formularfelder; Notizen protokollieren einmal je Fokus-Verlust, nie je Tastendruck.
D19konten.zustand kommt unverändert aus 2a (aktiv, gesperrt, geloescht); „unbestätigt“ ist kein Zustand, sondern bestaetigt_am leer (Chip und Filter „Unbestätigt“ lesen dieses Feld). 3 ergänzt nur die Sperr-Felder gesperrt_von/_am, sperr_pille, sperr_grund, entsperrt_am.
D20Entsperren einer Stelle oder Firma verändert laeuft_bis nicht (Laufzeit lief während der Sperre weiter).
D21Premium verlängern: neues bis-Datum ohne eigene Mail (F11 nur bei Freischaltung); Satz im Toast. Verlängern verlangt wie Freischalten den Preis (Liste einstellungen.preise, Abweichung nach unten nur mit Grund) und schreibt eine premium_phasen-Zeile.
D22Unzugeordneter Quell-Bereich beim COPLA-Abruf: Stelle als Entwurf, Zeile „bitte zuordnen“ beim Super Admin; nach Zuordnung nächster Lauf veröffentlicht.
D23Rückgängig-Sekunden: fest 10 aus einstellungen.fristen.rueckgaengig_sekunden, für alle Rollen gleich, auch die Verwaltung; kein Wert je Konto. dienste/verzoegert.ts liest nur die Einstellung.
D24Betriebsmails (Warteschlange, Virenprüfung, Schnittstelle stockt, Zertifikat) gehen an Super-Admin-Konten mit bnBetrieb an; ohne Nummer in T, Vorlage betriebsmail.tsx.
D25Prüfung neuer Firmen: 3BS prüft selbst; global abschaltbar auf der Seite Prüfen (nicht in den Nomad-Einstellungen, weil 3BS schalten soll); je Firma Stufe „ohne Prüfung“, wirksam bis zur ersten Freigabe; Premium-Firmen werden nicht geprüft; Schalter und Firmenzeile sagen beide „Prüfung neuer Firmen“ bzw. „vor der ersten Stelle prüfen“. Weitere Kundenstufen gibt es nicht; was 3BS dazu festlegen soll (Schalter zum Livegang an oder aus, welche Firmen ohne Prüfung), kommt in den Abschlussbericht für den Auftraggeber.
D26Rollen in Firmen: jede Firma legt ihre Mitarbeiterkonten selbst über „Team“ an (Einladung, 2a); Rollen zum Livegang Admin und Recruiter mit den Rechten aus _planung/rolle-ding-handlung.md; ein Konto kann in mehreren Firmen Mitglied sein. Die Verwaltung kann Firmen anlegen und Personen einladen (H126/H127), damit z. B. COPLA Burg auf unsere Freischaltung hin Admin seiner Firma wird. Zugang als Vermittler zu den sichtbaren Bewerberprofilen kommt mit nur auf Wunsch.
D27Änderung von Titel oder Firmenname in den ersten 30 Tagen nach geprueft_am landet als art aenderung in der Gruppe „nachprüfen“. Automatische Freigabe nach Frist setzt firmen.geprueft true (die Firma gilt als freigegeben, F10 stimmt, weitere Stellen gehen sofort online); die Prüfung bleibt als auto_frei in der Gruppe „nachprüfen“ als Marke für den zweiten Blick. Prüfung nötig ist allein eine Frage von geprueft false plus D25, nicht von „erste Stelle“.
D28Logos, Werbemotive und Ratgeber-Bilder liegen wie alle Dateien in dateien (nie unter /public) und werden über /api/datei/[id] ohne Sitzung ausgeliefert, sobald sie frei sind: Logo nach bestandener Virenprüfung (dateien.zustand geprueft), Werbemotiv bei Kampagne geplant/laeuft, Ratgeber-Bild bei veröffentlichtem Inhalt. Dateien ohne Konto (Werbekunde, Verwaltung) haben konto_id leer.
D29Melde-Gründe und Melden-Fenster nutzen die T-1.3-Schlüssel oeffentlich.melden.* (grundFalsch, grundUnserioes, grundDiskriminierend, grundBesetzt, grundAnderes, titel, text, mail, senden, firma); Enum meldung_grund bildet sie 1:1 ab (falsche_angaben, unserioes, benachteiligt, besetzt, anderes).
D30W06 „Motiv anfordern“ ist der eine Werbe-Knopf mit Mail im Mindestteil (H130), weil T und Mail-Liste ihn vorsehen; W02, W03, W07, W08 bleiben bis 2b Textvorlagen für das Mailprogramm, und Nomad trägt Zustand und Zeitraum von Hand ein.
D31E-Mail-Adresse ändern (L2, 26.10.): zum Livegang nur durch die Verwaltung nach Identitätsprüfung (H135, 1.4a), Token 24 Stunden, Bestätigung an die neue und Hinweis an die alte Adresse, alle Sitzungen enden; Selbstbedienung in den Einstellungen bleibt 2b.
D32Hilfe-Artikel (L1, 26.10.) sind Inhalte der Art ratgeber mit Rubrik „Hilfe“ und werden unter Inhalte › Ratgeber gepflegt; kein eigener Inhaltstyp.
D33Sperrliste: eine Tabelle sperrliste für IP-Adresse, IP-Bereich, E-Mail-Adresse und Mail-Domain ersetzt gesperrte_adressen und „Adresse sperren“; Frist Standard 7 Tage bei IP und 30 bei E-Mail und Domain (7/30/90 wählbar), alle Einträge (IP, E-Mail, Domain) wirken nur auf Registrieren, die Konto-Anlage per Code im Bewerben-Fenster und Formulare ohne Konto, nie auf Anmelden und Bewerben mit Konto und nie auf bestehende Sitzungen (D44, 1.15 Nr. 3); „unbefristet“ nur Super Admin, IP-Bereiche erst 2b.9; 3BS darf sonst alles; Freemail-Domains sind nicht sperrbar. Neutrale Meldung für Registrieren und die Konto-Anlage per Code, Erfolg ohne Datensatz für anonyme Formulare (D6 bleibt).
D34Zweiter Faktor der Verwaltung bleibt App-Pflicht (1.12), auch wenn Bewerber und Firmen den E-Mail-Code wählen dürfen (2a 1.9 Nr. 4); ein Verwaltungskonto mit Art mail muss vor dem ersten Zugriff auf /verwaltung die App einrichten.
D35Alarm bei Häufung fehlgeschlagener Anmeldungen (1.16) meldet nur (Betriebsmail + Zeile mit vorbelegtem Sperrlisten-Fenster), sperrt nie von selbst; Schwellen 100 Fehlversuche je Stunde und IP bzw. 20 Konten je Stunde und IP in einstellungen.sicherheit, änderbar ohne Code.
D36Sicherheitsprotokoll anmeldungen (2a Teil 3) wird 30 Tage aufbewahrt (einstellungen.fristen.anmeldungen_tage) und ist die einzige Stelle, an der Bululu IP-Adressen von Personen speichert (neben der Sperrliste selbst); die Verwaltung sieht die Zeilen je Firma und je Konto unter „Protokoll“ (1.16 b), Nutzer sehen in der Geräte-Liste nur die gekürzte IP ihrer eigenen Anmeldungen (2a 1.9 Nr. 5). Nennung in der Datenschutzerklärung: Karte 0 E15.
D37COPLA-Abruf (1.13) nur auf Hosts aus einstellungen.schnittstelle.erlaubte_hosts, keine privaten Netze, keine Weiterleitungen (Schutz vor Abrufen ins eigene Netz, _planung/sicherheit.md Nr. 17); die Liste pflegt der Super Admin in Einstellungen › Betrieb.
D38Rollen-Aufbau: Bewerber · Firma (Admin = Hauptrolle, Recruiter = Mitarbeiter) · Betreiber in zwei Stufen: Verwaltung (3BS, der Kunde) und Super Admin (Nomad, im Hintergrund, übergeordnet). Die frühere Rolle „Nomad“ ist die Stufe Super Admin (umbenannt, Enum super_admin; 3BS = Enum verwaltung). In Texten für den Kunden heißt die Stufe „Betreiber“, nie „Nomad intern“.
D39Super-Admin-Konten sind für die Verwaltung unsichtbar: nicht in der Liste der Verwaltungskonten, nicht in der Zahl, nicht als Name im Protokoll (dort „Betreiber“, anzeigeName()), nicht in „Seit Ihrem letzten Besuch“; gespeichert bleibt immer das echte Konto, Super Admins sehen den Namen. Technische Karten (1.11 Nr. 1 bis 6 und 8), Schnittstellen-Block, Pillen IP-Bereich und Unbefristet fehlen im Markup der Verwaltung (nicht gesperrt angezeigt); eine direkt aufgerufene Super-Admin-Seite → Sonderseite 404 (1a), eine direkt aufgerufene Aktion → 403 fehler.rechte.betreiber.
D40SMTP-Zugangsdaten bleiben Plattform-Variablen (Karte 0 Teil 4); die Karte Mail-Versand (1.11 Nr. 8) zeigt Zustand und Absenderfelder, nie das Kennwort. Grund: der Kennwort-Link als Rettungsweg hängt am Mail-Versand, eine falsche Eingabe in der Oberfläche dürfte ihn nicht abschneiden, und der Mail-Dienst läuft seit 1a vor jeder Einstellungs-Seite. Nomad' Wunsch „Zugangsdaten wie das Bundesagentur-Zertifikat“ ist damit nur für das Zertifikat und den COPLA-Schlüssel umgesetzt; Weiche, falls er SMTP doch in der Oberfläche will.
D41Die Verwaltung (3BS) pflegt ihre eigenen Konten selbst (Einladen und Entfernen mit Stufe Verwaltung, H150); Kennwort-Link und Faktor-Rücksetzung für Verwaltungskonten macht nur der Super Admin (H147), damit ein übernommenes Verwaltungskonto keine Kollegen aussperren oder übernehmen kann. Ersetzt Karte 4 L-A5 (vorher: nur Nomad lädt Verwaltungskonten ein).
D42Notfallweg: sperrt sich das letzte Super-Admin-Konto aus (Faktor-App und Wiederherstellungscodes verloren), gibt es keinen Weg über die App; Nomad führt auf dem Server db/verwaltung/notfall.ts aus (H149, Karte 0 Teil 11 Kapitel 11). Zum Livegang bestehen immer zwei Super-Admin-Konten (Karte 4 T4), damit der Normalfall über H147 läuft; die Wiederherstellungscodes beider Konten liegen am Ort von Karte 0 E6.
D44IP-Sperren mit Maß: IP-Einträge der Sperrliste wirken nur auf Registrieren und die Formulare ohne Konto, nie auf Anmelden und Bewerben mit Konto; Standardfrist 7 Tage (E-Mail und Domain 30); der Haken „auch die IP-Adressen sperren“ erscheint in den Sperren-Fenstern nur beim Grund Betrug/Spam und nennt seine Folgen; die Wartezeit beim Anmelden greift je IP erst ab 50 Fehlversuchen in 15 Minuten mit eigenem Satz. Grund: Mobilfunk- und Firmennetze teilen eine Adresse, Unbeteiligte dürfen davon nichts merken; wer stört, wird über Konto oder Firma gesperrt.
D43Aussehen der Verwaltung: Der Kopf ist derselbe wie auf der Seite (Entwurf B: Logo, Konto-Menü, Farben). Darunter eine eigene, dichte Arbeitsansicht: feste Menüleiste links mit den Hauptpunkten (das Hauptmenü steht nur dort, nicht im Kopf), kompakte Tabellen mit Sortieren, Auswahlkästchen nur bei einer Sammelaktion, kleine Abstände, keine Bilder oder Teaser; Farben und Schrift aus B. Die Firmenbereich-Bausteine aus B bleiben die Grundlage für Formulare, Fenster, Chips und Knöpfe; Listen sind Tabellen aus verwaltungsliste/.

7.3 Textschlüssel

Am 26.10. in T 7.10 (Sicherheit): verwaltung.sperrliste. (titel, satz, link, hinzufuegen, art, artIp, artIpBereich, artMail, artDomain, wert, grund, frist, frist7, frist30, frist90, fristUnbefristet, ipHinweis, ipHaken, freemail, doppelt, treffer, trefferKeiner, aufheben, aufgehoben, zurSperrliste, knopf, ok, leer), verwaltung.firmen.anmeldungen, verwaltung.heute.sperrlisteAlarm, verwaltung.schnittstelle.adresseNichtErlaubt, verwaltung.einst.betriebHosts, fehler.gesperrt.neutral; konto.einst.faktorVerwaltungApp (1.12). Am 26.10. (Rollen, T 7.7 und 7.10): verwaltung.einst.kontenKennwortLink, .kontenFaktor, .kontenLetzteVerwaltung, .kontenBetreiberHilfe, verwaltung.einst.mail, .mailZustand, .mailAbsender, .mailAbsenderName, .mailAntwortAn, .mailPruefen, .mailPruefenOk, .mailPruefenFehler, verwaltung.firmen.adminErnennen, .adminErnennenSatz, .adminErnennenKnopf, .ohneAdminChip, protokoll.betreiber; umbenannt: verwaltung.anfragen.anBetreiber (vorher anNomad), fehler.rechte.betreiber/.betreiberKnopf (vorher nomad), verwaltung.einst.kontenLetzterSuperAdmin (vorher LetzterNomad); gestrichen: verwaltung.sperrliste.fristSatz (die Verwaltung sieht die Pillen nicht). Alle übrigen Schlüssel in T 7.7, Mails V08/F22 in T 6.5/6.4. Am 26.10. in T 7.9: verwaltung.firmen.mailAendern, .mailAendernTitel, .mailAendernNeu, .mailAendernIdentitaet, .mailAendernGrund, .mailAendernKnopf, .mailAendernChip, .mailAendernOk, konto.adresseBestaetigt.titel, .text; Mails A10 und A11 in T 6.3. Am 26.10. in T 7.7 ergänzt: je Enum-Wert ein Schlüssel für die Status-Chips (status.firma.registriert/.aktiv/.gesperrt/.geloescht/.ungeprueft/.unbestaetigt, status.konto., status.meldung., status.anfrage., status.werbeanfrage., status.werbung., status.premium., status.pruefung., status.alarm., status.team., status.einladung.*; T 5.5 nennt nur die Wörter), dazu verwaltung.werbung.motivAngefordert. T 7.7 legt 77 neue Schlüssel an (Übersicht, Prüfen mit sieben Systemhinweisen, Sperren, Anfragen, Firmen und Nutzer, Werbung, Inhalte, Einstellungen, dazu die Sätze für Firma, Bewerber und Besucher). V08 „Frist läuft in 2 Stunden ab“ (mail.v.fristErinnerung), F22 „Ihre Stelle wurde gesperrt“ (mail.f.stelleGesperrt, Muster F14). Betriebsmails (Warteschlange, Virenprüfung, Schnittstelle stockt, Zertifikat; D24): Betriebsmeldung ohne Mail-Vorlage (nur Super Admin, technisch), betriebsmail.tsx setzt den Text aus den Werten.

Weiter genutzt (vorhanden): T 1.3 (Melde-Gründe), 1.9 (verwaltung., firma.stellen.gepflegtExtern), 1.10 (werbung. mit sechs Flächen, Laufzeit, Wunsch-Start, Textanzeige-Feldern, Zusage), 2 (verwaltung.leer.heute, .heuteOhneFrist, .pruefen, .anfragen, .werbung, .suche, .protokoll), 3.2 (verwaltung.ok.linkGesendet, .faktorGeplant), 3.3 („Werbeanfrage gesendet“, „Zurücksetzen abgebrochen“), 4.4 (fehler.gesperrt., fehler.rechte., fehler.rechte.verwaltungFaktor, fehler.postfach.firmaGesperrt, .bewerberGesperrt, fehler.stelle.gesperrt), 5.5, 6.1 (vorlage.verwaltung.), 6.3 (A01, A04, A08), 6.4 (F10–F17), 6.5 (V01–V07), 6.6 (W01–W08), 7.2 (firma.heute.nachbessern, .premiumAngefragt, .premiumAblauf, .kollege, .undWeitere), 7.3 (verwaltung.heute.), gemeinsam.auswahl.* (Leiste, Alle auswählen, Aufheben, Ergebnis).

7.4 Sonstiges, vor dem Bau zu klären (keine Weiche, aber Material)

  • Wer prüft neue Arbeitgeber (Nomad in der Pauschale oder 3BS): offen beim Kunden (G02); beide Rollen können es, die Benachrichtigung V01 schaltet jede Person selbst.
  • 3BS-Adresse für Kontaktanfragen und Rückfragen (kontakt_mail_3bs, Sammel-Anfrage am Ende, Karte 4 Teil 1a Z3): bis dahin Reply-To = Absenderadresse (1b).
  • Feiertagsliste NRW für die Werktagsrechnung (D5) als feste Datei; jährlich ergänzen.
  • Freemail-Liste für die Systemhinweise (gmx, web.de, gmail, outlook, yahoo, t-online, icloud) in fachlich/pruefung/hinweise.ts.
  • GlitchTip-Adresse, Sicherungs-Werte, ClamAV-Zustand kommen aus Abschnitt 4 (Betrieb); die Betrieb-Karte zeigt bis dahin „nicht verbunden“.
  • COPLA: Schlüssel-Übergabe an COPLA vor dem Livegang (W3), Fachbereich-Zuordnung Chemie/Nuklear/Industrie beim ersten Abgleich von Hand.
  • FC 1, 2, 3, 9, 10, 11, 14, 21, 25, 31, 32 sind hier umgesetzt; FC 4 über den Mindestteil; FC 12 a–c über D16/1.13, 12 d bleibt 2b; FC 13 über W2; FC 20 über W4; FC 26/27 als Schlüssel in 7.3.

7.5 Ideen (nicht geplant)

  • Stichprobe nach der Freigabe (1 von 10 neuen Stellen geprüfter Firmen als Prüfzeile; pruefung_art stichprobe ist im Enum vorgesehen).
  • Automatische Antwort-Erkennung bei Rückfragen (Mail-Eingang an Bululu statt mailto).
  • Reihenfolge-Pfeile für Fachbereiche mit Schalter „feste Reihenfolge“.
  • Monatswerte-Link für Nomad unter der Zahlenreihe (nach Livegang mit monatswerte).
  • Belegungs-Zeitleiste, Posten, Angebot aus dem System (2b, nicht Idee, nur Abgrenzung).
  • 20-Minuten-Durchgang der Verwaltung mit Herrn Schiffke vor der Schulung (P Ideen).
  • Einstellungs-Karte „Betreiber“ in der Oberfläche (Werte liegen schon in einstellungen.betreiber, 1b).