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/ (2a 2.2; hier ergänzt), Stellen-Werbeflächen mit Platzhalter-Motiv (1a W6, hier mit echten Kampagnen gefüllt).
Fundstellen: B:firmen-bereich. = 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. = Textschlüssel aus TEXTE-UND-MAILS; U 3. = Usability-Bildschirm; P Verwaltung = Abschnitt im Plan; FC 1 = Befund im FUNKTIONEN-CHECK.
Seiten
Alle Seiten der Verwaltung, vom Prüfen über Anfragen, Firmen, Werbung und Inhalte bis zu Einstellungen, Sperrliste und Datenschutz-Fristen.
Adressen unter / ohne [locale] (Verwaltung nur Deutsch, P Sprachen; Annahme D1). Alle Seiten liegen in app/ mit eigenem layout.: prüft Sitzung + Betreiber-Stufe (verwaltung oder super_admin; wird mit set_ 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.
| Nr | Seite | Adresse | B-Datei (Bausteine) | Daten |
|---|---|---|---|---|
| 1 | Verwaltung: Übersicht „Heute zu tun“ | /verwaltung | firmen-bereich.html:102–138 (Kacheln; Bereichskopf entfällt, D43), jetztwichtig (2a) | pruefungen, meldungen, kontaktanfragen, premium_anfragen, werbung_kampagnen, zaehler_tag, protokoll |
| 2 | Prüfen: Liste · Neue Firma · Meldung | /verwaltung/pruefen · /verwaltung/pruefen/[id] | firmen-bereich.html:140–149 (Pillen, Zeilen), stelle.html (lesend) | pruefungen, meldungen, stellen, firmen |
| 3 | Anfragen: Liste · Kontaktanfrage · Premium-Anfrage | /verwaltung/anfragen · /verwaltung/anfragen/[id] | :140–149, :151–154 (Zeilen), formular | kontaktanfragen, premium_anfragen, werbung_anfragen |
| 4 | Firmen 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 |
| 5 | Support-Modus „Im Namen von“ (im Firmenbereich 2a) | /firma/… mit Leiste | neu: support-leiste | support_sitzungen, protokoll |
| 6 | Werbung: 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 |
| 7 | Inhalte (einfache Formulare) | /verwaltung/inhalte · /verwaltung/inhalte/fachbereiche/[id] · /verwaltung/inhalte/[art]/[id] | :212–227 (Formular), :140–149 | fachbereiche, inhalte, inhalte_fassungen (1b), mailvorlagen |
| 8 | Einstellungen (Super Admin alle Karten; Verwaltung nur Verwaltungskonten) | /verwaltung/einstellungen | mein-bereich.html:184–192, 1b FAQ details (css:930–936) | einstellungen, verwaltung_konten, verwaltung_einladungen |
| 9 | Mein Konto (Verwaltung) | /verwaltung/konto | 2a 1.9 Karten 3, 4 | konten, faktor, benachrichtigungen |
| 10 | Faktor 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]#melden | stelle.html:103–112 (Dialog-Rahmen), Grund-Pillen wie filter-pillen | meldungen |
| 12 | Öffentlich: Werbung planen | /fuer-arbeitgeber/werbung | gemeinsam/werbung/konfigurator (B-Konfigurator, Stil b) | werbung_anfragen, dateien |
| 13 | Firma: Premium anfragen, Top-Haken (im 2a-Firmenbereich) | /firma/stellen (Fenster), /firma/stellen/[id] (Haken) | firmen-bereich.html:140–149 | premium_anfragen, stellen.top |
| 14 | Werbeflächen live (ohne Seite) | /api/w/[kampagneId] (Zähl-Weiterleitung) | 1a werbeflaeche/ | werbung_kampagnen, werbung_zaehlung_tag |
| 15 | Sperrliste (unter Firmen und Nutzer) | /verwaltung/firmen/sperrliste | firmen-bereich.html:140–149 (Zeilen), grundfenster (Variante sperrliste) | sperrliste, anmeldungen (Treffer, zuletzt genutzte IP-Adressen) |
1.1 Übersicht „Heute zu tun“
Datei app/ · Teile in _. U 3.14. Kein Dauer-Knopf im Kopf.
| Nr | Bereich | Bausteine | B-Fundstelle | Hinweis |
|---|---|---|---|---|
| 1 | Heute zu tun | Baustein 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/ (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. |
| 2 | Zahlen | uebersicht-raster mit fünf kachel (B hat drei): T verwaltung.start.zArbeitgeber, .zBewerber, .zStellen, .zBewerbungen, .zAufrufe, je mit .vorwoche; Handy 2 + 3 | B:128–133, css:636–639 | aus fachlich/ (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_). Kein Diagramm, kein Monatswerte-Link (nach Livegang). |
| 3 | Seit Ihrem letzten Besuch | details zugeklappt (1b css:930–936) mit h2 T verwaltung.start.protokoll + Datum, Zusammenfassungssatz, darunter Protokollzeilen des Zeitraums | neu | protokoll seit verwaltung_; 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/ (Liste) und pruefen/ (eine Prüfung: neue Firma oder Meldung), Teile _, _, _. U 3.15, P Verwaltung Prüfen, P Lebenslauf Stelle und Meldung, FC 1, 2, 10, 21, 31.
| Nr | Bereich | Bausteine | B-Fundstelle | Hinweis |
|---|---|---|---|---|
| 1 | Liste | panel-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 Zeile | B: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. |
| 2 | Neue Firma: Kopf | Zurü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. |
| 3 | Neue Firma: links | die Stelle als 1a-Stellenseite lesend (_ mit vorschau-Flag: ohne Bewerben, ohne Klebeleiste, ohne Werbung); darunter Firmenprofil-Kurzform (1b _, UeberUns, Ansprechperson) | stelle.html, 1a 1.4 | Prüfobjekt ist die Stelle (U). |
| 4 | Neue Firma: Prüfkarte | box 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/: 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:634 | Freigeben: 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). |
| 5 | Neue Firma: Ablehnen-Fenster | Fenster (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 .ablehnen | stelle.html:103–112, css:657–659 | Aktion 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_ → neue Prüfungszeile (pruefung_art nachbesserung) mit T .erneut, auch wenn die Firma inzwischen geprüft ist oder noetig. sonst nein sagen würde (FC 1). Nach außen nie „unseriös“ (U 5.13: Pille intern, Mailtext aus T F16). |
| 6 | Neue Firma: Frage an die Firma | Fenster mit Vorlage T .frageVorlage, Knopf T .frageSenden | fenster/ | Mail F17 mit Knopf „Antworten“ (mailto an einstellungen.betreiber.kontakt_mail_3bs, Betreff „Rückfrage {nummer}“); Prüfung → zustand rueckfrage, frist_ + 3 Werktage (Pause der Auto-Freigabe); nach 2 Werktagen Zeile verwaltung.heute.rueckfrage. Keine Antwort-Erkennung (FC 10 Vorschlag, P übernommen). |
| 7 | Neue Firma: Notiz | Feld „Notiz (nur Verwaltung)“, speichert sofort (P Zwischenspeichern) | mein-bereich.html:184–190 (Feld) | pruefungen.notiz. |
| 8 | Meldung: Kopf + links | wie Nr. 2/3 mit Titel der Stelle oder Firmenname, Chip „{n} Meldungen“; links die Anzeige bzw. das 1b-Firmenprofil lesend | ||
| 9 | Meldung: rechts | Karten 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, zeile | Jede 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). |
| 9a | Liste: Prüfung neuer Firmen an/aus | im „…“ 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 ab | mehr-menue B:103–112 | einstellungen.pruefung.neue_firmen; wirkt nur auf neue Veröffentlichungen. |
| 10 | Zustände | Stelle 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/; 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/ 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. (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/ (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.
| Nr | Bereich | Bausteine | B-Fundstelle | Hinweis |
|---|---|---|---|---|
| 1 | Liste | panel-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.kampagneNeu | B:140–149, css:641–659 | Sortierung ä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. |
| 2 | Kontaktanfrage: Kopf + Text | Zurü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. |
| 3 | Kontaktanfrage: Antwort | Vorlagen-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 intern | formular css:546, filter-pillen | Aktion 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). |
| 4 | Premium-Anfrage | Kopf 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, box | Aktion 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). |
| 5 | Werbeanfrage in der Liste | Zeile 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/ (Suche + Liste), firmen/ (Firmenansicht), personen/ (Bewerberansicht), Teile _, _, _. U 3.17, P Verwaltung Firmen und Nutzer, P Lebensläufe Firma, Nutzer, Bewerberkonto, FC 3, 9, 14.
| Nr | Bereich | Bausteine | B-Fundstelle | Hinweis |
|---|---|---|---|---|
| 1 | Suche + Liste | h2 „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 Link | unternehmen.html:102–107 (Suchfeld, css:1271), B:140–149 | Ohne 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). |
| 1a | Firma anlegen (Verwaltung) | Fenster (2a fenster/): Felder T .anlegenName, .anlegenOrt (PLZ + Ort wie 2a Registrierung), .anlegenPerson, .anlegenMail (erste Admin-Person), Knopf T .anlegenKnopf | neu (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. |
| 2 | Firmenansicht: Kopf | Logo, 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_ B:96–112, mehr-menue, check (Schalter) | Kein farbiger Knopf (U). Sprungmarken Stellen · Nutzer · Bewerbungen · Protokoll · Notizen (Textlinks, keine Reiter). |
| 2a | Firmenansicht: 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 Einstellungen | firmen.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. |
| 3 | Firmenansicht: Stellen | Liste 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.gepflegtExtern | B:140–149, js:1144 | Änderungen nur über Support-Modus. |
| 4 | Firmenansicht: Nutzer | Tabelle (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 Recruiter | B:140–149 | Kennwort-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; _ 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. |
| 5 | Firmenansicht: Bewerbungen | nur 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. prüft Rolle). Jeder Datei-Zugriff → protokoll (aktion datei_geoeffnet, grund). Die Freigabe gilt 60 Minuten (support_sitzungen, Annahme D7). |
| 6 | Firmenansicht: Protokoll, Notizen | ol 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“). | |
| 7 | Sperren-Fenster (Firma) | Fenster T verwaltung.sperre.titel, Grund-Pillen Pflicht aus der gemeinsamen Liste fachlich/, 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}“. |
| 8 | Bewerberansicht | Name, 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 lesend | mein-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/: vergeben → fehler.feld.mailVergeben (T 4.2); sonst konto_ (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 / (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) (_ 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)/ 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/ (Kampagnen), werbung/ und werbung/ (dasselbe Formular), werbung/; Teile _, _, _. U 3.18 Mindestteil, P Werbekunde, P Lebenslauf Werbeanfrage, FC 4, 20.
| Nr | Bereich | Bausteine | B-Fundstelle | Hinweis |
|---|---|---|---|---|
| 1 | Kampagnen-Liste | h2 „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 .ohneAnfrage | B:140–149, details 1b | Zustä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. |
| 2 | Kampagne (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. 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, 99 | Angebot, 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/), sonst Platzhalter/Eigenmotiv (1a W6, U 3.18 „Eigenwerbung wenn frei“). |
| 3 | Flächen und Belegung | sechs 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:563 | Regeln je Fläche nur lesend als Satz. |
| 4 | Zählung | Einblendung 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. (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)/ · Teile _ (Client-Baustein Werbeplanung. 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/ (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. 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.), stellen.top bleibt gespeichert, wirkt nicht.
1.10 Inhalte als einfache Formulare
Datei verwaltung/ (eine Liste mit Art-Pillen Fachbereiche · Mailvorlagen · Ratgeber · Rechtstexte · Seitentexte, T verwaltung.inhalte.*), inhalte/, inhalte/. 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):
| Nr | Art | Formular | Hinweis |
|---|---|---|---|
| 1 | Fachbereiche | Liste: 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). |
| 2 | Mailvorlagen | Liste: 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. |
| 3 | Ratgeber, Rechtstexte, Seitentexte | Liste 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/ · Teile _ 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.
| Nr | Karte | Inhalt | Hinweis | |
|---|---|---|---|---|
| 1 | Funktionen (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. | |
| 2 | Fristen (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. | |
| 4 | KI-Texte (T .ki) | Schalter (= funktionen.kiTexte), Modell lesend, Verbrauch (Zahl), Hinweistext-Link | zum Livegang aus; Verbrauch 0. | |
| 5 | Bundesagentur (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 leer | Zertifikat und Kennwort verschlüsselt in einstellungen (Schlüssel aus Umgebungsvariable), nie wieder angezeigt, nur „hinterlegt am“. Die Übertragung (HR-BA-XML, Hintergrund) ist 2b. | |
| 6 | Betrieb | Virenprü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). | |
| 7 | Verwaltungskonten (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-Seite | 2a 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). |
| 8 | Mail-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 Mailservers | 1b FAQ details, mein-bereich.html:184–192 | Nur 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
/: 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/ konto /: 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).verwaltung/ faktor-einrichten /undkonto/ faktor-reset?t= /(2a reserviert): Zielseiten im Box-Muster, beide nachkonto/ faktor-reset/ abbrechen?t= _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).planung/ sicherheit. md /: kein eigener Bildschirm, B19 führt auf /anmelden.konto/ entsperrt /(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.konto/ adresse-bestaetigt?t= - 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 /), 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, _ Nr. 17): die Adresse muss https sein und ihr Host in einstellungen. 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. 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/: 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_ 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 / (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.(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.ts - 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_(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 (geraete sperrliste-ablauf., 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).ts
1.15 Sperrliste
Datei verwaltung/ · Teile _ (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_ entfällt zugunsten von sperrliste (Teil 3). Sicherheits-Prüfliste: _ Nr. 11, 14.
| Nr | Bereich | Bausteine | B-Fundstelle | Hinweis | |
|---|---|---|---|---|---|
| 1 | Liste | panel-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 .hinzufuegen | B:140–149, css:641–659 | Sortierung neueste zuerst, 50 je Seite, „Mehr laden“. Leer: T .leer. Aufheben: Rückgängig 10 s, dann aufgehoben_am/_von, Protokoll sperrliste_aufgehoben. | |
| 2 | Eintrag-Fenster | Fenster (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/: 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-pillen | Aktion 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. | |
| 3 | Wirkung | dienste/ `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.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/ je Aufrufer. Treffer-Zähler ohne IP-Speicherung des Treffers. | |
| 4 | Rechte | Verwaltung 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. | ||
| 5 | Zustände | Eintrag läuft ab → Zeile wandert in „Abgelaufen/aufgehoben“ (Hintergrund sperrliste-ablauf. 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. (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.
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/; 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) | Dateien | Aus B: HTML | Aus B: CSS-Klassen | Aus B: app.js | Benutzt 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, feld | data-dialog-zu | Prü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 details | details-Optik css:930–936 | GrundFenster, 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_ in verwaltungsliste/tabelle.css mit Farben und Schrift aus B | js:1152 Pillen | alle 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 B | app/verwaltung/layout.tsx | |
| hinweise/ | SystemHinweise.tsx (Sätze mit ✓ oder ohne, aus fachlich/pruefung/hinweise.ts) | neu | haken-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.tsx | stelle.html:103–112 | dialog, filter-pillen, formular | Stelle (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/motivSlot | konfigurator.css komplett | K wird nicht als Ganzes übernommen; PREISE (K:23–37), berechne (K:123), summe (K:143) entfallen | Werbung 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–564 | check | Einstellungen, Flächen, Schnittstelle, Benachrichtigungen (Verwaltung) |
Erweiterungen vorhandener Bausteine: seitenrahmen/ + HandyMenue. (1a) Variante „verwaltung“; jetztwichtig/ (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/ (1a) liest Kampagne über fachlich/ (Motiv, Zielseite → /api/w/[id], Vorlesetext als alt) und eigenwerbung-Schalter (aus → Fläche fehlt im Markup); Stellenkarte. Variante „firma“ (2a) zeigt Chips „Bitte ergänzen: {grund}“, „Gesperrt“, „Wird in Ihrer Verwaltung gepflegt“; (firma)/ (2a) bindet SupportLeiste und reicht support an darf(); stelle/ (1a) bekommt den Melden-Knopf, firmen/ (1b) den Textlink „Firma melden“; fenster/ (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. Fall „Dafür ist der Betreiber zuständig“.
2.2 Fachlich und Dienste (neu)
| Ordner | Dateien | Inhalt | |
|---|---|---|---|
| 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.ts | Prü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_), 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.ts | 2a 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.ts | dienste/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.ts | nichts 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_) | ||
| 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ählt | eine Prüfung, acht Aufrufer | |
| fachlich/sperrliste/ | eintragen.ts (`sperrlisteEintragen({art, wert, grund, tage | null}): Prüfung je Art, Rechte verwaltung/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, ratgeberbild | Monogramm.tsx (1a), Werbeflaeche.tsx (1a), Ratgeber (1b) laden darüber | |
| fachlich/rechte.ts | ergänzt: Rollen super_admin, verwaltung, support (= Firmenbereich mit Sperrliste); darf() prüft zusätzlich support | ||
| dienste/db/rls.ts | Rolle bululu_ (Karte 0 Teil 7, einzige Quelle): liest alle Firmen; schreibt nur über Aktionen mit Protokoll-Pflicht (Annahme D18 mit Ausnahmeliste); SET LOCAL app. (verwaltung oder super_admin) für die Zeilensperre auf verwaltung_konten (D39) | db/ | |
| 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)
| Ort | Dateien |
|---|---|
| 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.tsx | Zielseiten |
| (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.tsx | ohne JS |
| (firma)/firma/stellen/_liste/PremiumAnfragen.tsx (Client) · _formular/TopHaken.tsx | ergä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).
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/ 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. (Policy auf verwaltung_konten; verwaltung_ 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
| Feld | Typ | Hinweis |
|---|---|---|
| id | uuid PK | |
| firma_id | FK firmen | |
| stelle_id | FK stellen, leer erlaubt | die 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 |
| art | enum pruefung_art: neue_firma, nachbesserung, aenderung | nachbesserung = 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) |
| zustand | enum pruefung_zustand: offen, rueckfrage, auto_frei, freigegeben, abgelehnt, erledigt_beendet, in_ordnung | P Lebenslauf; auto_frei = Gruppe „nachprüfen“ |
| frist_am | timestamptz | nächster Werktag 9:00; bei Rückfrage + 3 Werktage |
| erneut_eingereicht | boolean, Standard false | Wort an der Zeile |
| rueckfrage_am, rueckfrage_text | leer | F17 |
| erinnert_am | leer | 2 h vor Frist |
| geoeffnet_von, geoeffnet_am | FK konten, leer | wer die Prüfung zuletzt geöffnet hat (Protokoll; der Kollegen-Hinweis daraus kommt erst mit 2b.9) |
| entschieden_von, entschieden_am, grund_pille, grund_satz | leer | |
| notiz | text leer | |
| Index | (zustand, frist_am); (firma_id) |
meldungen
| Feld | Typ | Hinweis |
|---|---|---|
| id | uuid PK | |
| ziel_art | enum meldung_ziel: stelle, firma | Melden-Knopf auf Stelle und Firmenprofil |
| stelle_id, firma_id | FK, firma_id immer gesetzt | Bündelung je Ziel |
| grund | enum meldung_grund: falsche_angaben, unserioes, benachteiligt, besetzt, anderes | T 1.3 |
| text | text leer (2.000) | |
| melder_konto_id | FK leer | angemeldet |
| melder_mail | citext leer | für V06 und „dem Melder antworten“ |
| zustand | enum meldung_zustand: gemeldet, in_pruefung, erledigt, offline, stelle_gesperrt, firma_gesperrt | T 5.5 status.meldung.* |
| entschieden_von, entschieden_am | leer | Entscheidung 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. 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_, top_, sperr_, 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_, sperr_ (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/, 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/ 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
| Feld | Typ | Hinweis |
|---|---|---|
| id | uuid PK | |
| anfrage_id | FK leer | „ohne Anfrage“ |
| kunde_name, kunde_firma, kunde_mail, kunde_telefon | text | aus der Anfrage vorbelegt |
| flaeche_schluessel | FK werbung_flaechen | |
| format | text | abgeleitet |
| von, bis | date | Zeitraum |
| motiv_datei_id | FK dateien leer | im Browser neu kodiert (C35), Maße vom Server geprüft |
| textanzeige | jsonb leer | Trefferliste/Suchbegriffe |
| suchbegriffe | text[] leer | nur Fläche suchbegriffe |
| zielseite | text, Pflicht beim Planen | https |
| vorlesetext | text, Pflicht beim Planen | alt |
| zustand | enum werbung_zustand: angebot, angenommen, motiv_da, geplant, laeuft, pausiert, beendet, storniert | T 5.5; bis 2b von Hand außer laeuft/beendet |
| start_mail_am, ende_mail_am, bericht_fehler, motiv_angefordert_am | leer | W04/W05; motiv_angefordert_am = W06 gesendet (H130) |
| wartet_auf_motiv | boolean | Chip |
| grund | text, leer | Grund bei Preis unter der Liste oder 0; NP 22) |
| betrag_netto | numeric(10,2), Pflicht ab zustand angenommen | Preis 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_ (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_), 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_ (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_ 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_ mit SET LOCAL app. (Verwaltungskonto), app. (Support-Firma) und app.: 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/ prüft app. 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)undverwaltungFaktorRuecksetzen(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/(H149).verwaltung/ notfall. ts schnittstelleSchalter(firmaId, feld, wert),schluesselErzeugen(firmaId) → Klartext einmalig,jetztAbgleichen(firmaId),abgleichen(firmaId)(Hintergrund) → lieferungen.
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/.
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).
| Nr | Rolle · Bildschirm | Knopf/Link (Wortlaut T) | Wirkung | Test (Datei · prüft) |
|---|---|---|---|---|
| H88 | Besucher · Stelle, Firmenprofil | „Anzeige melden“ / „Firma melden“ → „Meldung senden“ | meldungen gemeldet; V03 an Verwaltung mit eingeschalteter Benachrichtigung; Zeile in Heute zu tun; Bremse 3/Stunde | pruefung/seiten/melden.test.ts · Grund Pflicht, Mail freiwillig, zweite Meldung derselben Anzeige bündelt in einer Prüfzeile |
| H89 | Besucher · Werbung planen | „Unverbindlich anfragen“ | werbung_anfragen anfrage mit frist_am; W01 (Kunde), V04 (Verwaltung); Zielseite mit Frist-Satz; keine Beträge im Markup | pruefung/seiten/werbung-planen.test.ts · sechs aktive Flächen, inaktive fehlen, Motiv-Maße als Satz nicht als Sperre, kein „€“ im HTML |
| H90 | Firmen-Admin · Stellen | „Premium anfragen“ → „Anfragen“ | premium_anfragen angefragt, V04 Premium; Zeile firma.heute.premiumAngefragt; Recruiter: Knopf fehlt + Server lehnt ab | pruefung/seiten/firma-premium.test.ts · zweite Anfrage bei offener → Hinweis statt Zeile; mit premium_bis ≥ heute fehlt der Knopf |
| H91 | Firmen-Admin/Recruiter · Stelle bearbeiten | Haken „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 |
| H92 | Verwaltung · Anmelden | Code bestätigen; ohne Faktor → Einrichtungs-Seite | nur mit faktor-Zeile öffnet /verwaltung; Sitzung 8 h | pruefung/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 |
| H93 | Verwaltung · Übersicht | Zeilen-Knöpfe Prüfen · Ansehen · Anfragen · Entscheiden · Kampagne anlegen · Erneut starten | Sprung in die Aufgabe; Reihenfolge überfällig → heute → morgen → ohne Frist; Betriebs-Zeilen nur Super Admin | pruefung/fachlich/verwaltung/heute.test.ts · 7 offene Posten ergeben 5 Zeilen + „und 2 weitere“; Kontaktanfragen gebündelt; verwaltung ohne Mail-Zeile |
| H94 | Verwaltung · Prüfen (Liste) | „Prüfen“, „In Ordnung“, Pillen, Sammel „Freigeben“ | öffnet; In Ordnung schließt auto_frei ohne Mail; Sammel verzögert 10 s | pruefung/seiten/pruefen.test.ts · Pillen nur bei beiden Arten; überfällige oben; Sammel-Freigabe schreibt n Protokollzeilen und n F10 nach 10 s |
| H95 | Verwaltung · 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üfung | pruefung/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 |
| H96 | Verwaltung · 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 |
| H97 | Verwaltung · 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.rueckfrage | pruefung/fachlich/pruefung/frage.test.ts · Auto-Freigabe läuft erst nach der verlängerten Frist |
| H98 | Automatik · Prüffrist | 2 h vorher Erinnerung; Ablauf → auto_frei | Stelle 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 |
| H99 | Verwaltung · Meldung | „Erledigt, bleibt online“ · „Offline nehmen“ · „…“ Stelle sperren · Firma sperren · Dem Melder antworten | Zustände erledigt/offline(nachbessern + F16)/stelle_gesperrt/firma_gesperrt (F14); V06 an Melder mit Mail; mailto | pruefung/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 |
| H100 | Verwaltung · 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) |
| H101 | Verwaltung · 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“ |
| H102 | Verwaltung · Kontaktanfrage | Vorlage-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 |
| H103 | Verwaltung · 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 |
| H104 | Automatik · Premium | 5 Tage vorher Zeile bei der Firma; Ablauf → F13; „Premium beenden“ (Verwaltung) → F13 sofort | top-Haken wirkungslos, stellen.top bleibt | pruefung/hintergrund/premium-ablauf.test.ts · topStellen() leer nach Ablauf |
| H105 | Verwaltung · Firmen und Nutzer | Suche ab 3 Zeichen; Pillen Rolle/Zustand; Zeile öffnet | Treffer in Firmenname, Nutzer, E-Mail, Stellentitel | pruefung/fachlich/verwaltung/suche.test.ts · 2 Zeichen → nichts; Stellentitel findet Firma; ohne Suche „zuletzt aktiv“ |
| H106 | Verwaltung · 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 Minuten | pruefung/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) |
| H107 | Verwaltung · 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, F15 | pruefung/fachlich/firma/sperren.test.ts · Bewerbung bleibt im Zustand, Postfach schreibgeschützt (FC 6); Entsperren stellt laeuft_bis nicht neu (D20) |
| H108 | Verwaltung · 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, F18 | pruefung/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 |
| H109 | Verwaltung · 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 Protokoll | pruefung/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 |
| H110 | Verwaltung · 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 |
| H111 | Verwaltung · 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 + A06 | pruefung/fachlich/konto/sperren.test.ts · Firma sieht Bewerbung mit Satz; Bewerber-Sitzung endet; Entsperren → aktiv |
| H112 | Verwaltung · 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 + W05 | pruefung/seiten/werbung-verwaltung.test.ts · Planen ohne Zielseite → fehler.feld.*; Kollision zeigt Satz, blockiert nicht; verwaltung darf alles außer „Fläche aktiv“ |
| H113 | Automatik · Werbung | Start → laeuft + W04; Ende → beendet + W05 mit Zahlen; Starttag ohne Motiv → wartet_auf_motiv; Anfrage 14 Tage ohne Kampagne → nicht_angenommen | pruefung/hintergrund/werbung-lauf.test.ts · W05 enthält Klicks und Einblendungen aus werbung_zaehlung_tag; W04 genau einmal | |
| H114 | Besucher · Werbefläche | Motiv-Klick | /api/w/[id] zählt Klick, 302 auf zielseite; Einblendung beim Rendern gezählt; ohne Kampagne Eigenmotiv (eigenwerbung an) oder keine Fläche | pruefung/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 |
| H115 | Verwaltung · Flächen | „Wenn frei: Eigenwerbung zeigen“ · „Fläche aktiv“ (Super Admin) | werbung_flaechen Felder; Werbeplanung zeigt nur aktive | pruefung/fachlich/werbung/flaechen.test.ts · verwaltung „Fläche aktiv“ → Rechte-Fehler |
| H116 | Verwaltung · Inhalte › Fachbereiche | Felder 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 Stellen | pruefung/fachlich/inhalte/fachbereich.test.ts · alter Name als Begriff findet Stellen; Rückgängig stellt alles zurück; Ausblenden mit Stellen → Fehler |
| H117 | Verwaltung · Inhalte › Mailvorlagen | Felder · Platzhalter-Chip · „Vorschau mit Beispieldaten“ · „Testmail an mich“ · „Veröffentlichen“ | mailvorlagen; Pflicht-Platzhalter fehlt → Satz, Veröffentlichen gesperrt; Mail-Dienst nutzt die Zeile | pruefung/fachlich/inhalte/mailvorlagen.test.ts · B05 nach Änderung trägt neuen Betreff; Vorlage ohne {link} nicht veröffentlichbar; Testmail in Warteschlange an eigene Adresse |
| H118 | Verwaltung · Inhalte › Ratgeber, Rechtstexte, Seitentexte | Felder · 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 Fassung | pruefung/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 |
| H119 | Super Admin · Einstellungen | Schalter 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-Pflicht | pruefung/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 |
| H120 | Super 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 3BS | pruefung/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) |
| H121 | Automatik · Fristen | täglicher Lauf nach 1.14 | Löschungen je Frist; Protokoll anonymisiert; Werbeanfragen verfallen | pruefung/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 |
| H122 | Verwaltung · Mein Konto | Kennwort · Zweiter Faktor (Abschalten gesperrt) · Benachrichtigungen je Art · Abmelden | 2a-Karten; verwaltung_benachrichtigungen; V01/V03/V04 je Schalter, V02/V05–V07 immer | pruefung/seiten/verwaltung-konto.test.ts · Faktor-Abschalten → fehler.rechte-Satz; V01 geht nur an Konten mit bnPruefen an |
| H123 | Verwaltung · jede Liste | Auswahl (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“ |
| H124 | Verwaltung (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 |
| H125 | Verwaltung (Verwaltung/Super Admin) · Firmenansicht | „Diese Firma vor der ersten Stelle prüfen: Ja / Nein“, nur solange die Firma nicht freigegeben ist | firmen.pruefstufe; offene Prüfung → freigegeben mit F10 (wie H95), firmen.geprueft true; Premium aktiv = ohne Prüfung | noetig.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 |
| H126 | Verwaltung · Firmen und Nutzer | „Firma anlegen“ → „Anlegen und Einladung senden“ | firmen (bestätigt, geprüft), firmen_einladungen Rolle admin, F02b; Protokoll | pruefung/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 |
| H127 | Verwaltung · 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 |
| H129 | Verwaltung (Verwaltung/Super Admin) · Firmenansicht › Protokoll, Bewerberansicht | Protokoll 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 |
| H130 | Verwaltung (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 Knopf | pruefung/fachlich/werbung/motiv-anfordern.test.ts · zweiter Klick sendet keine zweite Mail; Kampagne mit Motiv zeigt den Knopf nicht |
| H135 | Verwaltung (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 |
| H136 | Verwaltung (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ählt | pruefung/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 |
| H142 | Hintergrund · Sicherheitsprotokoll, Sperrliste | Fristen und Alarm | fristen.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 Sperren | pruefung/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 |
| H145 | Super 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 änderbar | pruefung/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 |
| H146 | Verwaltung (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 Firmenansicht | pruefung/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 |
| H147 | Super 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 ab | pruefung/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 |
| H148 | Super Admin · Einstellungen › Mail-Versand | Felder 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 Wert | pruefung/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 |
| H149 | Nomad · Server (Notfallweg ohne Oberfläche) | db/ · … super-admin <mail> --bestaetigen · … sitzungen-beenden --bestaetigen | nur 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 11 | pruefung/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. (Karte 4 T4) bleibt nur für leere verwaltung_konten |
| H150 | Verwaltung · 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 Faktor | pruefung/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 |
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.
| Seite | leer | lädt | Fehler | nicht gefunden / Rechte | nicht mehr verfügbar |
|---|---|---|---|---|---|
| Verwaltung (Layout) | entfällt | Ladebalken 1a | fehler.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 Frist | Platzhalter-Zeilen | Ladefehler-Baustein | ||
| Prüfung (geöffnet) | entfällt | Server-Seite | Freigabe scheitert → Satz am Knopf, Eingaben bleiben, „Erneut versuchen“ | Prüfung unbekannt → 404; „Kollege hat offen“ erst 2b.9 | Stelle 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ällt | Antwort scheitert → Satz, Text bleibt | 404 | Premium schon aktiv → Hauptknopf „Verlängern bis“; Anfrage erledigt → nur lesend mit Zustand | |
| Firmen und Nutzer | ohne 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 / Bewerberansicht | Abschnitte ohne Inhalt fehlen | Server-Seite | Aktion scheitert → Satz am Knopf | 404; verwaltung sieht Löschen/Schnittstelle nicht | gelö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-Zeilen | Wert ungültig → fehler.feld.* am Feld; Dublette → Satz mit Frist; Freemail-Domain → Satz, kein Eintrag | verwaltung 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 2a | wie 2a | Sperrliste → Knöpfe fehlen + Satz | nach 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 | |||
| Kampagne | entfällt | je Feld „Gespeichert {uhrzeit}“ | Motiv: fehler.datei.* (Maße als Satz, kein Fehler); Zielseite leer beim Planen → fehler.feld.pflicht; Kollision → Satz | 404 | beendet/storniert → lesend |
| Flächen | entfällt (sechs feste) | verwaltung: „Fläche aktiv“ fehlt | |||
| Werbung planen (öffentlich) | entfällt | Schritt-Wechsel sofort; Upload mit Fortschritt | Feldfehler; Honigfeld still; gesperrte Adresse → Erfolg ohne Datensatz | keine aktive Fläche → Seite zeigt Satz T werbung.keineFlaeche (T 7.7) + Kontaktformular | |
| Melden (Fenster) | entfällt | Grund fehlt → fehler.feld.; Bremse → fehler.versuche. | Stelle nicht sichtbar → kein Knopf (1a 410-Seite) | ||
| Inhalte (Liste/Formular) | Papierkorb leer → Gruppe fehlt | je Feld sofort | bereinigen entfernt Unerlaubtes still; Pflicht-Platzhalter fehlt → Satz + Veröffentlichen gesperrt | 404 | gelöscht → im Papierkorb 30 Tage mit „Wiederherstellen“ |
| Einstellungen | entfällt | je Karte | Dienst gestört → Satz in der Karte + Zeile in Heute zu tun | verwaltung → Rechte-Seite | |
| Faktor einrichten, Zielseiten (Reset, Abbrechen, Einladung) | entfällt | Server-Seite | Token falsch/abgelaufen → fehler.link.* (1b) ohne „neu anfordern“ (Verwaltung muss neu beantragen; Satz T verwaltung.einladung.ungueltig, T 7.7) |
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
| Datei | Z. | Inhalt |
|---|---|---|
| app/verwaltung/layout.tsx · page.tsx · _uebersicht/HeuteZuTun.tsx · Zahlen.tsx (LetzterBesuch.tsx erst 2b.9) | 90 · 50 · 80 · 90 · 90 | Rahmen 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.tsx | 60 · 180 · 80 · 160 · 200 · 40 · 140 · 180 | Liste mit Auswahl; Prüfkarte; Fenster über grundfenster/ |
| …/anfragen/page.tsx · _liste/AnfragenListe.tsx · [id]/page.tsx · _kontakt/Antwort.tsx · Zusammenhang.tsx · _premium/Entscheidung.tsx | 60 · 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.tsx | 60 · 140 · 120 · 100 · 160 · 120 · 90 · 240 · 80 · 120 · 80 · 40 · 220 · 80 · 80 · 260 · 60 | Firmenansicht 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.tsx | 60 · 160 · 40 · 80 · 340 · 120 · 80 · 60 · 120 | Mindestteil |
| …/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.tsx | 60 · 140 · 60 · 200 · 120 · 80 · 40 · 260 · 220 · 80 | einfache Formulare, kein Editor |
| …/einstellungen/page.tsx · _einstellungen/Funktionen.tsx · Fristen.tsx · Uebersetzung.tsx · Ki.tsx · Bundesagentur.tsx · Betrieb.tsx · Verwaltungskonten.tsx | 80 · 120 · 160 · 120 · 60 · 140 · 180 · 180 | |
| …/konto/page.tsx · faktor-einrichten/page.tsx · einladung/page.tsx | 80 · 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.ts | 60 · 110 · +40 · 40 · 40 · 120 | H135 (L2, 26.10.) |
| (oeffentlich)/konto/faktor-reset/page.tsx · faktor-reset/abbrechen/page.tsx | 60 · 50 | Zielseiten |
| …/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.ts | 60 · 160 · 200 · 80 · 90 · ~320 · 40 · 90 · je 80–160 · 100 · 60 | H136, H142 (Sicherheit 26.10.) |
| (oeffentlich)/fuer-arbeitgeber/werbung/page.tsx · _planung/Schritt1.tsx · Schritt2.tsx · Schritt3.tsx · Erfolg.tsx | 60 · 160 · 260 · 160 · 50 | Konfigurator aus B, Stil b |
| (oeffentlich)/stelle/[adresse]/melden/page.tsx · firmen/[adresse]/melden/page.tsx | 60 · 60 | ohne JS |
| (firma)/firma/stellen/_liste/PremiumAnfragen.tsx · _formular/TopHaken.tsx | 100 · 60 | ergänzt 2a |
| bausteine/grundfenster/ · mailvorschau/ · supportleiste/ · verwaltungsliste/ · verwaltungsleiste/ · hinweise/ · melden/ · werbeplanung/ · schalter/* | 220 · 80 · 90 · 340 · 90 · 60 · 180 · 520 · 80 | werbeplanung.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 · 240 | je Datei unter 150 Z. |
| dienste/mail/vorlagen/v01–v07, w01–w08, f10–f17, b18, b19, a04, a08, betriebsmail | je 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.ts | 40 | Zä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.ts | je 80–240 | Teil 4 |
6.2 Zeilen für ARCHITEKTUR.md
Seite → Dateien:
- Verwaltung-Rahmen =
app/· Bausteine seitenrahmen (Variante verwaltung), kontomenue · dienste/auth, fachlich/verwaltung/rolle · Tests verwaltung-layout.test.ts, rechte/verwaltung.test.tsverwaltung/ layout. tsx - Übersicht =
app/+verwaltung/ page. tsx _· Bausteine jetztwichtig (Variante verwaltung) · fachlich/verwaltung (heute, zahlen, letzterBesuch) · hintergrund zahlen-tageskopie · sprachen verwaltung.json (7.3) · Tests heute.test.tsuebersicht/ * - Prüfen =
app/· Bausteine verwaltungsliste, grundfenster, mailvorschau, hinweise, auswahl (2a), 1averwaltung/ pruefen/ _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/stelle/ - Anfragen =
app/· 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/verwaltung/ anfragen/ - 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/· 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.tsapi/ w/ [id] - Inhalte =
app/· Bausteine verwaltungsliste, ablage, mailvorschau, 1b inhalt/bereinigen · fachlich/inhalte (schreiben, mailvorlagen, fachbereich) · Tests fachlich/inhalte/verwaltung/ 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/· fachlich/meldung/anlegen · Tests melden.test.ts[adresse]/ melden - Datenschutz und Fristen =
hintergrund/(ergänzt),aufgaben/ fristen. ts protokoll-anonymisieren.· fachlich/einstellungen/lesen (fristen) · Tests hintergrund/fristen.test.tsts
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).
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)
| Nr | Weiche | A | B |
|---|---|---|---|
| W1 | Inhalte 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) |
| W2 | Werbeplanung ö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 |
| W3 | COPLA-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) |
| W4 | W04 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 |
| W5 | Verwaltungs-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 |
| W6 | Zahlen der Übersicht live rechnen oder Tageskopie. | Tageskopie verwaltung_ + 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) |
| W7 | Meldung 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
| Nr | Annahme |
|---|---|
| D1 | Verwaltung unter /verwaltung ohne [locale]; alle Texte nur de (P Sprachen). |
| D2 | Verwaltungs-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). |
| D3 | Kennzahlen: Tageskopie + Wochenwerte live (W6 A). |
| D4 | Meldung zu Firmenprofil: Erledigt oder Firma sperren (W7 A). |
| D5 | Prüffrist = nächster Werktag 9:00 nach Veröffentlichung (Werktage Mo–Fr, Feiertage NRW aus fester Liste in fachlich/); Zeitzone Europe/Berlin. |
| D6 | Gesperrte Adresse: Formulare zeigen Erfolg, schreiben nichts, keine Mail (kein Hinweis an Spammer). |
| D7 | Unterlagen-Freigabe nach Grund-Fenster gilt 60 Minuten (wie Support) und liegt in support_sitzungen. |
| D8 | Die Zeile „Bululu hat am … auf Ihren Wunsch …“ im Firmenbereich ist eine Jetzt-wichtig-Zeile ohne Knopf, 7 Tage sichtbar, aus protokoll mit support_id. |
| D9 | Verwaltungskonten sind nie Firmennutzer oder Bewerber (eigene Adressen, z. B. verwaltung@…); ein Konto mit Verwaltungsrolle verliert die Bewerber-Reiter. |
| D10 | Flächen-Belegung zum Livegang als Liste (Kunde, Zeitraum) statt Zeitleiste; Zeitleiste 2b. |
| D11 | W04 am Starttag (W4 A). |
| D12 | W01-Vorschaubild = Miniatur der Nachbildung mit dem Motiv (PNG, Anhang); ohne Motiv kein Bild. |
| D13 | Inhalte als einfache Formulare, HTML-Textfeld mit Bereinigung (W1 A). |
| D14 | Bundesagentur-Karte zum Livegang: Zertifikat und Kennwort speicherbar, Schalter „Übertragung“ gesperrt mit Satz; Übertragung 2b. |
| D15 | Mehrere Orte einer Schnittstellen-Stelle: erster = Standort, weitere in stellen_orte; 1a suchen() findet über beide. |
| D16 | COPLA-Abruf ohne Signatur bis bululu.py da ist (W3 A). |
| D17 | Fristen ohne Plan-Wert: Meldungen, Prüfungen, Support-Sitzungen, beantwortete Kontaktanfragen 12 Monate; Faktor-Rücksetzungen 30 Tage; Werbe-Zählung 25 Monate. |
| D18 | Protokoll-Pflicht zuerst im Code: jede Verwaltungsaktion in fachlich/ schreibt ihre protokoll-Zeile in derselben Transaktion (fachlich/ verlangt sie, Test je Aktion). Der Trigger (Schreibzugriff der Rolle bululu_ 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. |
| D19 | konten.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. |
| D20 | Entsperren einer Stelle oder Firma verändert laeuft_bis nicht (Laufzeit lief während der Sperre weiter). |
| D21 | Premium verlängern: neues bis-Datum ohne eigene Mail (F11 nur bei Freischaltung); Satz im Toast. Verlängern verlangt wie Freischalten den Preis (Liste einstellungen., Abweichung nach unten nur mit Grund) und schreibt eine premium_phasen-Zeile. |
| D22 | Unzugeordneter Quell-Bereich beim COPLA-Abruf: Stelle als Entwurf, Zeile „bitte zuordnen“ beim Super Admin; nach Zuordnung nächster Lauf veröffentlicht. |
| D23 | Rückgängig-Sekunden: fest 10 aus einstellungen.fristen.rueckgaengig_sekunden, für alle Rollen gleich, auch die Verwaltung; kein Wert je Konto. dienste/ liest nur die Einstellung. |
| D24 | Betriebsmails (Warteschlange, Virenprüfung, Schnittstelle stockt, Zertifikat) gehen an Super-Admin-Konten mit bnBetrieb an; ohne Nummer in T, Vorlage betriebsmail.tsx. |
| D25 | Prü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. |
| D26 | Rollen in Firmen: jede Firma legt ihre Mitarbeiterkonten selbst über „Team“ an (Einladung, 2a); Rollen zum Livegang Admin und Recruiter mit den Rechten aus _; 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“. |
| D28 | Logos, 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. |
| D29 | Melde-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). |
| D30 | W06 „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. |
| D31 | E-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. |
| D32 | Hilfe-Artikel (L1, 26.10.) sind Inhalte der Art ratgeber mit Rubrik „Hilfe“ und werden unter Inhalte › Ratgeber gepflegt; kein eigener Inhaltstyp. |
| D33 | Sperrliste: 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). |
| D34 | Zweiter 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. |
| D35 | Alarm 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. |
| D36 | Sicherheitsprotokoll 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. |
| D37 | COPLA-Abruf (1.13) nur auf Hosts aus einstellungen.schnittstelle.erlaubte_hosts, keine privaten Netze, keine Weiterleitungen (Schutz vor Abrufen ins eigene Netz, _ Nr. 17); die Liste pflegt der Super Admin in Einstellungen › Betrieb. |
| D38 | Rollen-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“. |
| D39 | Super-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. |
| D40 | SMTP-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. |
| D41 | Die 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). |
| D42 | Notfallweg: 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/ 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. |
| D44 | IP-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. |
| D43 | Aussehen 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. (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., verwaltung., verwaltung., verwaltung., fehler.; konto. (1.12). Am 26.10. (Rollen, T 7.7 und 7.10): verwaltung., ., ., ., verwaltung., ., ., ., ., ., ., ., verwaltung., ., ., ., protokoll.; umbenannt: verwaltung. (vorher anNomad), fehler./. (vorher nomad), verwaltung. (vorher LetzterNomad); gestrichen: verwaltung. (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., ., ., ., ., ., ., ., konto., .; 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.), F22 „Ihre Stelle wurde gesperrt“ (mail., Muster F14). Betriebsmails (Warteschlange, Virenprüfung, Schnittstelle stockt, Zertifikat; D24): Betriebsmeldung ohne Mail-Vorlage (nur Super Admin, technisch), betriebsmail. 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).