Files
Webklar-Kundenbereich/server/services/analyseTexts.js
T
ClaudeandClaude Opus 5.5 78170567b4 Analyse: alle Beendigungswege schalten den Messdienst ab (Kunde/Projekt weg, Domain, Löschfrist, Widerruf Wechsel)
Messdienst: POST /a/admin/sites/:key/off setzt active=0 und offSince einmalig; Portal-Client stopSite.
analyse.js: endAnalyse als gemeinsamer Kern, endAnalyseForCustomer, analyseOnProjectChanged,
analyseDisabled (Sperre/Löschfrist) und täglicher Abgleich runAnalyseReconcile (Projekt/Kunde weg,
Domains nachziehen, K18-Wiederholung, Messdienst für off/disabled, fehlende Entfernen-Tickets nachholen).
Entfernen-Ticket je Abschaltung gekennzeichnet (kein Doppelticket, auch wenn das Speichern der ID scheiterte).
Hooks: Kunde löschen, updateWebsiteProject, withdrawOrder (Wechsel), siteFeatures.disable.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 18:50:36 +00:00

72 lines
4.7 KiB
JavaScript

// Geprüfte Texte der Website-Analyse für WOMS-Tickets (Quelle: banner-portal-mailtexte.md, Fassung 2026-10-02)
// § 6 (Tickets) und § 7 (Textbaustein für die Datenschutzerklärung des Kunden), 1:1 übernommen.
// "veröffentlichen"-Ticket und Grundtexte sind NEU und bewusst kurz.
export const PRIVACY_SNIPPET_DU = [
'Reichweitenmessung',
'Wir messen mit einer eigenen Reichweitenmessung ohne Cookies, wie unsere Website genutzt wird. Solange Du im Banner nichts ausgewählt hast, zählen wir Seitenaufrufe mit Land und Gerätetyp, ohne Kennung. Weitere Daten, etwa von welcher Website Du kommst, Verweildauer und Klicks, erfassen wir nur mit Deiner Einwilligung. Die Messung betreibt für uns die WEBklar GbR als Auftragsverarbeiter auf einem Server in Deutschland. Einzelheiten, Rechtsgrundlagen, Speicherdauer und Deine Rechte, auch Dein Widerspruchsrecht, findest Du unter [Datenschutz bei der Reichweitenmessung](/datenschutz-analyse.html).',
].join('\n')
export const PRIVACY_SNIPPET_SIE = [
'Reichweitenmessung',
'Wir messen mit einer eigenen Reichweitenmessung ohne Cookies, wie unsere Website genutzt wird. Solange Sie im Banner nichts ausgewählt haben, zählen wir Seitenaufrufe mit Land und Gerätetyp, ohne Kennung. Weitere Daten, etwa von welcher Website Sie kommen, Verweildauer und Klicks, erfassen wir nur mit Ihrer Einwilligung. Die Messung betreibt für uns die WEBklar GbR als Auftragsverarbeiter auf einem Server in Deutschland. Einzelheiten, Rechtsgrundlagen, Speicherdauer und Ihre Rechte, auch Ihr Widerspruchsrecht, finden Sie unter [Datenschutz bei der Reichweitenmessung](/datenschutz-analyse.html).',
].join('\n')
const FEATURE = 'Funktion: analyse'
const headLines = ({ name, domains }) => [FEATURE, `Projekt: ${name}`, `Domain(s): ${domains.join(', ')}`]
const lastDomain = (domains) => domains[domains.length - 1]
/** Ticket beim Einschalten: Textbaustein in die Datenschutzerklärung (Quelle § 6 „Beim Einschalten“). */
export function privacyTicketDetails({ name, domains, rebuildNote = '' }) {
return [
...headLines({ name, domains }),
`Zusatzseite: https://${lastDomain(domains)}/datenschutz-analyse.html`,
...(rebuildNote ? [`Veröffentlichung: ${rebuildNote}`] : []),
'',
'1. Textbaustein (siehe unten) in die Datenschutzerklärung der Website einfügen, Link auf /datenschutz-analyse.html.',
'2. Fällt dabei ein offensichtlicher Widerspruch auf (etwa „Wir setzen keine Analyse-Werkzeuge ein“), den Kunden im Chat darauf hinweisen. Die Datenschutzerklärung wird nicht inhaltlich geprüft und ohne Auftrag nicht weiter geändert.',
'3. Liegt die Datenschutzerklärung nicht in unserem Repo (externer Generator): Textbaustein per Chat an den Kunden senden.',
'4. Nicht auf das Stundenkontingent anrechnen (Leistungsbeschreibung Website-Analyse Nr. 4 Abs. 4).',
'',
'Textbaustein (Du-Fassung):',
PRIVACY_SNIPPET_DU,
'',
'Textbaustein (Sie-Fassung, für Datenschutzerklärungen, die siezen):',
PRIVACY_SNIPPET_SIE,
].join('\n')
}
/** Ticket beim Ausschalten (auch Abo-Ende): Quelle § 6 „Beim Ausschalten“. */
export function removalTicketDetails({ name, domains, offSince = '' }) {
return [
...headLines({ name, domains }),
`Zusatzseite: https://${lastDomain(domains)}/datenschutz-analyse.html`,
'',
'1. Prüfen, ob die Website neu veröffentlicht wurde (Skript und Zusatzseite weg). Sonst neu veröffentlichen, spätestens innerhalb von fünf Werktagen.',
'2. Hinweis auf die Reichweitenmessung aus der Datenschutzerklärung entfernen, wenn sie in unserem Repo liegt; sonst den Kunden im Chat bitten, ihn zu entfernen.',
'3. Nicht auf das Stundenkontingent anrechnen.',
...(offSince ? ['', `Abgeschaltet: ${offSince}`] : []), // Kennzeichen je Abschaltung (verhindert doppelte Tickets)
].join('\n')
}
const PUBLISH_REASONS = {
kein_repo: 'Dem Projekt ist kein Repo zugeordnet, die Website wurde nicht automatisch neu veröffentlicht.',
preview_aus: 'Die Vorschau/Veröffentlichung ist für das Projekt ausgeschaltet, die Website wurde nicht automatisch neu veröffentlicht.',
fehler: 'Der automatische Neubau der Website ist fehlgeschlagen.',
}
export const publishReasonText = (reason) => PUBLISH_REASONS[reason] || PUBLISH_REASONS.fehler
/** NEU: Ticket „Website-Analyse veröffentlichen“, wenn der automatische Neubau beim Einschalten nicht lief. */
export function publishTicketDetails({ name, domains, reason }) {
return [
...headLines({ name, domains }),
`Grund: ${publishReasonText(reason)}`,
'',
'Website neu veröffentlichen, damit das Analyse-Skript (Banner) und die Zusatzseite /datenschutz-analyse.html erscheinen.',
'Nicht auf das Stundenkontingent anrechnen.',
].join('\n')
}