Datenschutzerklaerung und Preisliste ergaenzen, Kleinunternehmer-Status korrigieren

datenschutz.php: Entwurf, der die tatsaechliche technische Verarbeitung
beschreibt (Konto- vs. Teilnehmerdaten, Verantwortlicher/Auftrags-
verarbeiter-Trennung, Rechtsgrundlagen, Aufbewahrungspflichten nach
HGB/AO als Begruendung fuer Anonymisieren-statt-Loeschen, Betroffenen-
rechte mit Verweis auf den Selbstbedienungs-Export). Wie AGB deutlich
als pruefungsbeduerftiger Entwurf gekennzeichnet.

preise.php: neue oeffentliche Preisliste mit den vorgeschlagenen Stufen
(gratis bis 10, 3,99 EUR bis 25, 7,99 EUR bis 50, 12,99 EUR bis 150,
auf Anfrage darueber).

Kleinunternehmer-Korrektur (kein Umsatzsteuerpflichtiger mehr):
- impressum.php: USt-IdNr-Zeile entfernt, Hinweis nach Paragraf 19 UStG ergaenzt.
- agb.php Paragraf 4: keine festen Preise mehr im Text, stattdessen Verweis
  auf preise.php; "zzgl. USt" durch Kleinunternehmer-Hinweis ersetzt.

Footer-Links auf allen oeffentlichen und internen Seiten um Datenschutz
und Preise ergaenzt.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-16 23:12:25 +02:00
co-authored by Claude Sonnet 5
parent 2e44bb208d
commit d08621b616
12 changed files with 247 additions and 9 deletions
+10 -6
View File
@@ -53,12 +53,14 @@
Funktionsumfang im Kern erhalten bleibt.</p> Funktionsumfang im Kern erhalten bleibt.</p>
<h2>§ 4 Preise und Zahlungsbedingungen</h2> <h2>§ 4 Preise und Zahlungsbedingungen</h2>
<p>Es gelten die zum Zeitpunkt des Vertragsschlusses veröffentlichten <p>Es gelten die jeweils aktuellen, unter <a href="preise.php">Preise</a>
Preise, gestaffelt nach der Anzahl aktiver Teilnehmer des Kunden. Die veröffentlichten Preise, gestaffelt nach der Anzahl aktiver Teilnehmer des
Preise verstehen sich zzgl. der jeweils gültigen gesetzlichen Kunden. Der Anbieter ist gemäß § 19 UStG von der Umsatzsteuer befreit; die
Umsatzsteuer, soweit anwendbar. Die Abrechnung erfolgt monatlich im genannten Preise sind Endpreise ohne gesonderten Ausweis von
Voraus. Bei Überschreiten einer Teilnehmerstufe während der Laufzeit wird Umsatzsteuer. Die Abrechnung erfolgt monatlich im Voraus. Bei
automatisch zur nächsthöheren Preisstufe gewechselt.</p> Überschreiten einer Teilnehmerstufe während der Laufzeit wird automatisch
zur nächsthöheren Preisstufe gewechselt. Preisänderungen werden dem Kunden
vor Wirksamwerden in Textform angekündigt.</p>
<h2>§ 5 Pflichten des Kunden</h2> <h2>§ 5 Pflichten des Kunden</h2>
<p>Der Kunde ist für die Rechtmäßigkeit der Verarbeitung <p>Der Kunde ist für die Rechtmäßigkeit der Verarbeitung
@@ -116,6 +118,8 @@
<footer class="public-footer-links"> <footer class="public-footer-links">
<a href="impressum.php">Impressum</a> <a href="impressum.php">Impressum</a>
<a href="agb.php">AGB</a> <a href="agb.php">AGB</a>
<a href="datenschutz.php">Datenschutz</a>
<a href="preise.php">Preise</a>
</footer> </footer>
<script src="assets/js/jquery.min.js"></script> <script src="assets/js/jquery.min.js"></script>
+129
View File
@@ -0,0 +1,129 @@
<?php require_once __DIR__ . '/app/bootstrap.php'; ?>
<!DOCTYPE HTML>
<html lang="de">
<head>
<title>Datenschutzerklärung Kaffeeliste</title>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no" />
<link rel="stylesheet" href="assets/css/main.css" />
<link rel="stylesheet" href="assets/css/public.css" />
</head>
<body class="is-preload public-page">
<div class="public-shell">
<section class="public-section public-legal">
<nav class="public-nav" aria-label="Hauptnavigation">
<strong><a href="landing.php">Kaffeeliste</a></strong>
<ul class="actions">
<li><a href="login.php" class="button">Login</a></li>
</ul>
</nav>
<header class="major">
<h1>Datenschutzerklärung</h1>
</header>
<div class="hint-box error">
<p><b>Hinweis: Dies ist ein Entwurf</b>, der die tatsächliche
technische Datenverarbeitung dieser App wiedergibt, aber vor
Produktivbetrieb rechtlich geprüft werden sollte.</p>
</div>
<h2>1. Verantwortlicher</h2>
<p>
Clemens Creutzburg<br>
In den Sieben Stücken 9d<br>
30655 Hannover<br>
E-Mail: <a href="mailto:info@ctb-it.de">info@ctb-it.de</a>
</p>
<p>Ein Datenschutzbeauftragter ist gesetzlich nicht vorgeschrieben und
daher nicht bestellt.</p>
<h2>2. Zwei Rollen: Verantwortlicher und Auftragsverarbeiter</h2>
<p>Registrierst du ein Kundenkonto, sind wir für die Daten deines
Kundenkontos selbst (Name, E-Mail, Kundenname) Verantwortlicher im Sinne
der DSGVO. Für die Daten der Teilnehmer, die du innerhalb deines
Mandanten anlegst (z. B. Kolleginnen und Kollegen), verarbeiten wir die
Daten dagegen ausschließlich in deinem Auftrag und nach deiner Weisung
du bist insoweit selbst Verantwortlicher, wir sind Auftragsverarbeiter.
Die Einzelheiten regelt ein separater Auftragsverarbeitungsvertrag (AVV).</p>
<h2>3. Welche Daten wir verarbeiten</h2>
<p><b>Kundenkonto (Login):</b> E-Mail-Adresse, Anzeigename,
Passwort (nur als Hash gespeichert, im Klartext nicht einsehbar),
Zeitpunkt der letzten Anmeldung, Bestätigungsstatus der E-Mail-Adresse.</p>
<p><b>Teilnehmer innerhalb eines Mandanten:</b> Name, E-Mail-Adresse,
optional ein PayPal-Anzeigename, sowie die Buchungshistorie (Striche,
Einzahlungen, Salden).</p>
<p><b>Technische Daten:</b> ein Sitzungs-Cookie
(<code>kaffeeliste_session</code>, ausschließlich technisch notwendig,
kein Tracking, keine Werbe- oder Analyse-Cookies), sowie zur Abwehr von
Missbrauch die IP-Adresse bei Login-, Registrierungs- und
Passwort-Reset-Versuchen (automatisiert nach kurzer Zeit gelöscht) und in
Protokollen sicherheitsrelevanter Admin-Aktionen.</p>
<p>Diese App bindet keine externen Analyse- oder Tracking-Dienste
(z. B. Google Analytics) und keine Werbenetzwerke ein.</p>
<h2>4. Zwecke und Rechtsgrundlagen</h2>
<p>Die Verarbeitung erfolgt zur Erfüllung des Nutzungsvertrags über die
Kaffeeliste-App (Art. 6 Abs. 1 lit. b DSGVO), zur Wahrung berechtigter
Interessen an einem sicheren und missbrauchsfreien Betrieb (Art. 6 Abs. 1
lit. f DSGVO, z. B. Rate-Limiting, Protokollierung sicherheitsrelevanter
Aktionen) sowie, soweit einschlägig, zur Erfüllung rechtlicher
Aufbewahrungspflichten (Art. 6 Abs. 1 lit. c DSGVO, siehe Ziffer 6).</p>
<h2>5. E-Mail-Versand</h2>
<p>Wir versenden E-Mails für Passwort-Zurücksetzung, E-Mail-Bestätigung,
Einladungen sowie optionale Stand-Benachrichtigungen. Der Versand erfolgt
über den Mailserver unseres Hosting-Anbieters. Gespeichert werden dabei
Betreff, Versandstatus und Zeitpunkt, nicht der vollständige Mailinhalt.</p>
<h2>6. Speicherdauer</h2>
<p>Kontodaten werden gespeichert, solange das Kundenkonto besteht.
Buchungsdaten (Striche, Einzahlungen) sind kassenrelevante Unterlagen und
unterliegen den gesetzlichen Aufbewahrungspflichten nach § 257 HGB
beziehungsweise § 147 AO (in der Regel sechs bis zehn Jahre). Entfernst du
einen Teilnehmer, werden Name und E-Mail-Adresse deshalb anonymisiert statt
gelöscht, während die Buchungshistorie für die Kassenführung erhalten
bleibt. Eine vollständige Löschung deines gesamten Mandanten einschließlich
aller Buchungen kannst du jederzeit selbst über die Mandanten-Löschung
auslösen.</p>
<h2>7. Deine Rechte</h2>
<p>Du hast das Recht auf Auskunft (Art. 15 DSGVO), Berichtigung
(Art. 16 DSGVO), Löschung (Art. 17 DSGVO), Einschränkung der Verarbeitung
(Art. 18 DSGVO), Datenübertragbarkeit (Art. 20 DSGVO) sowie Widerspruch
gegen die Verarbeitung (Art. 21 DSGVO). Als Mandanten-Inhaber oder
-Administrator kannst du einen vollständigen Export deiner Daten
jederzeit selbst über die Funktion „Datenexport" herunterladen. Für
Anfragen wende dich an die oben genannte Kontaktadresse. Dir steht zudem
ein Beschwerderecht bei einer Datenschutzaufsichtsbehörde zu, insbesondere
bei der für unseren Sitz zuständigen Behörde (Landesbeauftragte für den
Datenschutz Niedersachsen).</p>
<h2>8. Sicherheit</h2>
<p>Wir setzen unter anderem folgende technische Maßnahmen ein: verschlüsselte
Übertragung (TLS), gehashte Passwörter, serverseitige Zugriffskontrolle je
Mandant, Schutz vor automatisierten Anmeldeversuchen (Rate-Limiting),
Schutz vor Cross-Site-Request-Forgery sowie ein Protokoll
sicherheitsrelevanter Admin-Aktionen.</p>
<h2>9. Hosting</h2>
<p>Diese App wird auf Servern innerhalb der Europäischen Union betrieben.</p>
<p><a href="landing.php">&larr; Zurück zur Startseite</a></p>
</section>
</div>
<footer class="public-footer-links">
<a href="impressum.php">Impressum</a>
<a href="agb.php">AGB</a>
<a href="datenschutz.php">Datenschutz</a>
</footer>
<script src="assets/js/jquery.min.js"></script>
<script src="assets/js/browser.min.js"></script>
<script src="assets/js/breakpoints.min.js"></script>
<script src="assets/js/util.js"></script>
<script src="assets/js/main.js"></script>
</body>
</html>
+2
View File
@@ -61,6 +61,8 @@ $result = $token !== ''
<footer class="public-footer-links"> <footer class="public-footer-links">
<a href="impressum.php">Impressum</a> <a href="impressum.php">Impressum</a>
<a href="agb.php">AGB</a> <a href="agb.php">AGB</a>
<a href="datenschutz.php">Datenschutz</a>
<a href="preise.php">Preise</a>
</footer> </footer>
<script src="assets/js/jquery.min.js"></script> <script src="assets/js/jquery.min.js"></script>
+1 -1
View File
@@ -82,7 +82,7 @@ if ($saasNavUser !== null) {
<!-- Footer --> <!-- Footer -->
<footer id="footer"> <footer id="footer">
<p class="copyright">&copy; Copyright: Clemens Creutzburg All rights reserved. Design: <a href="http://html5up.net">HTML5 UP</a> · <a href="impressum.php">Impressum</a> · <a href="agb.php">AGB</a></p> <p class="copyright">&copy; Copyright: Clemens Creutzburg All rights reserved. Design: <a href="http://html5up.net">HTML5 UP</a> · <a href="impressum.php">Impressum</a> · <a href="agb.php">AGB</a> · <a href="datenschutz.php">Datenschutz</a> · <a href="preise.php">Preise</a></p>
</footer> </footer>
+5 -2
View File
@@ -33,8 +33,9 @@
<h2>Kontakt</h2> <h2>Kontakt</h2>
<p>E-Mail: <a href="mailto:info@ctb-it.de">info@ctb-it.de</a></p> <p>E-Mail: <a href="mailto:info@ctb-it.de">info@ctb-it.de</a></p>
<h2>Umsatzsteuer-Identifikationsnummer</h2> <h2>Umsatzsteuer</h2>
<p>Gemäß § 27a Umsatzsteuergesetz: DE347068189</p> <p>Gemäß § 19 UStG (Kleinunternehmerregelung) wird keine Umsatzsteuer
berechnet und ausgewiesen.</p>
<h2>Verantwortlich für den Inhalt nach § 18 Abs. 2 MStV</h2> <h2>Verantwortlich für den Inhalt nach § 18 Abs. 2 MStV</h2>
<p>Clemens Creutzburg, Anschrift wie oben.</p> <p>Clemens Creutzburg, Anschrift wie oben.</p>
@@ -62,6 +63,8 @@
<footer class="public-footer-links"> <footer class="public-footer-links">
<a href="impressum.php">Impressum</a> <a href="impressum.php">Impressum</a>
<a href="agb.php">AGB</a> <a href="agb.php">AGB</a>
<a href="datenschutz.php">Datenschutz</a>
<a href="preise.php">Preise</a>
</footer> </footer>
<script src="assets/js/jquery.min.js"></script> <script src="assets/js/jquery.min.js"></script>
+2
View File
@@ -137,6 +137,8 @@
<footer class="public-footer-links"> <footer class="public-footer-links">
<a href="impressum.php">Impressum</a> <a href="impressum.php">Impressum</a>
<a href="agb.php">AGB</a> <a href="agb.php">AGB</a>
<a href="datenschutz.php">Datenschutz</a>
<a href="preise.php">Preise</a>
</footer> </footer>
<script src="assets/js/jquery.min.js"></script> <script src="assets/js/jquery.min.js"></script>
+2
View File
@@ -111,6 +111,8 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
<footer class="public-footer-links"> <footer class="public-footer-links">
<a href="impressum.php">Impressum</a> <a href="impressum.php">Impressum</a>
<a href="agb.php">AGB</a> <a href="agb.php">AGB</a>
<a href="datenschutz.php">Datenschutz</a>
<a href="preise.php">Preise</a>
</footer> </footer>
<script src="assets/js/jquery.min.js"></script> <script src="assets/js/jquery.min.js"></script>
+2
View File
@@ -111,6 +111,8 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
<footer class="public-footer-links"> <footer class="public-footer-links">
<a href="impressum.php">Impressum</a> <a href="impressum.php">Impressum</a>
<a href="agb.php">AGB</a> <a href="agb.php">AGB</a>
<a href="datenschutz.php">Datenschutz</a>
<a href="preise.php">Preise</a>
</footer> </footer>
<script src="assets/js/jquery.min.js"></script> <script src="assets/js/jquery.min.js"></script>
+2
View File
@@ -104,6 +104,8 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
<footer class="public-footer-links"> <footer class="public-footer-links">
<a href="impressum.php">Impressum</a> <a href="impressum.php">Impressum</a>
<a href="agb.php">AGB</a> <a href="agb.php">AGB</a>
<a href="datenschutz.php">Datenschutz</a>
<a href="preise.php">Preise</a>
</footer> </footer>
<script src="assets/js/jquery.min.js"></script> <script src="assets/js/jquery.min.js"></script>
+80
View File
@@ -0,0 +1,80 @@
<?php require_once __DIR__ . '/app/bootstrap.php'; ?>
<!DOCTYPE HTML>
<html lang="de">
<head>
<title>Preise Kaffeeliste</title>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no" />
<link rel="stylesheet" href="assets/css/main.css" />
<link rel="stylesheet" href="assets/css/public.css" />
</head>
<body class="is-preload public-page">
<div class="public-shell">
<section class="public-section public-legal">
<nav class="public-nav" aria-label="Hauptnavigation">
<strong><a href="landing.php">Kaffeeliste</a></strong>
<ul class="actions">
<li><a href="login.php" class="button">Login</a></li>
<li><a href="register.php" class="button primary">Registrieren</a></li>
</ul>
</nav>
<header class="major">
<h1>Preise</h1>
<p>Ein Preis pro Mandant, gestaffelt nach der Anzahl aktiver Teilnehmer
keine Preise pro Kopf, keine versteckten Kosten.</p>
</header>
<table>
<tr>
<th>Aktive Teilnehmer</th>
<th>Preis pro Monat</th>
</tr>
<tr>
<td>bis 10</td>
<td>kostenlos</td>
</tr>
<tr>
<td>bis 25</td>
<td>3,99 €</td>
</tr>
<tr>
<td>bis 50</td>
<td>7,99 €</td>
</tr>
<tr>
<td>bis 150</td>
<td>12,99 €</td>
</tr>
<tr>
<td>mehr als 150</td>
<td>auf Anfrage</td>
</tr>
</table>
<p>Beim Überschreiten einer Stufe wird automatisch zur nächsthöheren
gewechselt. Gemäß § 19 UStG wird keine Umsatzsteuer berechnet die
genannten Beträge sind die tatsächlich zu zahlenden Endpreise.</p>
<ul class="actions">
<li><a href="register.php" class="button primary big">Kostenlos einrichten</a></li>
</ul>
<p>Details zu Laufzeit und Zahlungsbedingungen stehen in den
<a href="agb.php">AGB</a>.</p>
</section>
</div>
<footer class="public-footer-links">
<a href="impressum.php">Impressum</a>
<a href="agb.php">AGB</a>
<a href="datenschutz.php">Datenschutz</a>
</footer>
<script src="assets/js/jquery.min.js"></script>
<script src="assets/js/browser.min.js"></script>
<script src="assets/js/breakpoints.min.js"></script>
<script src="assets/js/util.js"></script>
<script src="assets/js/main.js"></script>
</body>
</html>
+2
View File
@@ -123,6 +123,8 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
<footer class="public-footer-links"> <footer class="public-footer-links">
<a href="impressum.php">Impressum</a> <a href="impressum.php">Impressum</a>
<a href="agb.php">AGB</a> <a href="agb.php">AGB</a>
<a href="datenschutz.php">Datenschutz</a>
<a href="preise.php">Preise</a>
</footer> </footer>
<script src="assets/js/jquery.min.js"></script> <script src="assets/js/jquery.min.js"></script>
+10
View File
@@ -21,6 +21,16 @@ $checks = [
'path' => 'agb.php', 'path' => 'agb.php',
'contains' => ['Allgemeine Geschäftsbedingungen', 'Entwurf'], 'contains' => ['Allgemeine Geschäftsbedingungen', 'Entwurf'],
], ],
[
'label' => 'Preise',
'path' => 'preise.php',
'contains' => ['Preise', '3,99', '7,99', '12,99', '§ 19 UStG'],
],
[
'label' => 'Datenschutzerklärung',
'path' => 'datenschutz.php',
'contains' => ['Datenschutzerklärung', 'Verantwortlicher', 'Auftragsverarbeiter'],
],
[ [
'label' => 'Dashboard', 'label' => 'Dashboard',
'path' => 'index.php', 'path' => 'index.php',