Rechtstexte und B2C-Vertragsabläufe absichern

This commit is contained in:
2026-08-22 14:31:56 +02:00
parent d320a4fd7a
commit a31a235422
58 changed files with 2502 additions and 316 deletions
+106
View File
@@ -0,0 +1,106 @@
<?php
require_once __DIR__ . '/functions.php';
require_once __DIR__ . '/app/billing.php';
require_once __DIR__ . '/app/legal.php';
$pdo = app_db_pdo();
$user = saas_require_login();
if (!saas_can_manage_tenant_settings($user)) {
http_response_code(403);
exit('Kein Zugriff.');
}
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
header('Location: mandant-einstellungen.php');
exit;
}
app_require_csrf();
$planCode = (string)($_POST['plan_code'] ?? '');
$plans = billing_plans();
if (!isset($plans[$planCode]) || $plans[$planCode]['stripe_lookup_key'] === null) {
http_response_code(400);
exit('Ungültiger kostenpflichtiger Tarif.');
}
if (!billing_plan_selectable_for($pdo, (int)$user['tenant_id'], $planCode)) {
http_response_code(400);
exit('Dieser Tarif deckt eure aktuelle Teilnehmerzahl nicht ab.');
}
if (!in_array((string)($user['customer_type'] ?? ''), ['business', 'consumer'], true)) {
http_response_code(400);
exit('Bitte wähle zuerst in den Mandant-Einstellungen, ob der Vertrag geschäftlich oder als Verbraucher geführt wird.');
}
if (!empty($user['contract_ends_at'])) {
http_response_code(409);
exit('Für diesen Vertrag liegt bereits eine Kündigung vor. Bitte nutze das Ticketsystem, wenn du sie zurücknehmen möchtest.');
}
$plan = $plans[$planCode];
$current = billing_fetch_or_init($pdo, (int)$user['tenant_id']);
$isSwitch = !empty($current['stripe_subscription_id']);
?>
<!DOCTYPE HTML>
<html lang="de">
<head>
<title>Tarif kostenpflichtig bestellen Kaffeeliste</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<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></nav>
<header class="major"><h1>Bestellung prüfen</h1></header>
<div class="public-panel order-summary">
<h2><?php echo saas_html($plan['label']); ?></h2>
<p class="public-price"><?php echo saas_html(saas_format_money_cents($plan['price_cents'])); ?> € <span>pro Monat</span></p>
<ul>
<li>Webbasierte Kaffeeliste für bis zu <?php echo (int)$plan['max_participants']; ?> aktive Teilnehmer</li>
<li>Monatliche Abrechnung im Voraus über Stripe; keine Versand- oder Zusatzkosten</li>
<li>Unbefristeter Vertrag, keine Mindestlaufzeit über die laufende Monatsperiode hinaus</li>
<li>Jederzeit kündbar zum Ende der laufenden Abrechnungsperiode</li>
<li>Erforderlich: aktueller Browser, Internetzugang und erreichbare E-Mail-Adresse</li>
<li>Gesetzliche Mängelrechte und Aktualisierungsansprüche bleiben bestehen</li>
</ul>
<?php if ($isSwitch): ?>
<p><b>Tarifwechsel:</b> Die neue Teilnehmergrenze gilt sofort. Für die laufende Periode gibt es keine zusätzliche Belastung oder Gutschrift; ab der nächsten Verlängerung werden <?php echo saas_html(saas_format_money_cents($plan['price_cents'])); ?> € monatlich berechnet.</p>
<?php else: ?>
<p><b>Neubuchung:</b> Nach dieser Bestätigung wirst du zur sicheren Stripe-Zahlungsseite weitergeleitet. Dort wählst du das Zahlungsmittel und schließt die Bestellung abschließend ab.</p>
<?php endif; ?>
<p>Anbieter: Clemens Creutzburg, CTB-IT, In den Sieben Stücken 9d, 30655 Hannover. Kontakt siehe <a href="impressum.php" target="_blank">Impressum</a>.</p>
</div>
<form method="post" action="abo-upgrade.php">
<?php echo app_csrf_field(); ?>
<input type="hidden" name="plan_code" value="<?php echo saas_html($planCode); ?>">
<div>
<input type="checkbox" name="accept_terms" id="accept_terms" value="1" required>
<label for="accept_terms">Ich akzeptiere die <a href="agb.php" target="_blank" rel="noopener">AGB (Stand <?php echo saas_html(APP_TERMS_VERSION); ?>)</a>.</label>
</div>
<div>
<input type="checkbox" name="acknowledge_withdrawal" id="acknowledge_withdrawal" value="1" required>
<label for="acknowledge_withdrawal">Ich habe die <a href="widerruf.php" target="_blank" rel="noopener">Widerrufsbelehrung samt Musterformular (Stand <?php echo saas_html(APP_WITHDRAWAL_VERSION); ?>)</a> erhalten und gelesen.</label>
</div>
<div>
<input type="checkbox" name="request_early_performance" id="request_early_performance" value="1" required>
<label for="request_early_performance">Ich verlange ausdrücklich, dass die kostenpflichtige Leistung vor Ablauf der 14-tägigen Widerrufsfrist beginnt. Mir ist bekannt, dass ich bei Widerruf Wertersatz für die bis dahin erbrachte Leistung schulden kann.</label>
</div>
<p><small>Gesamtpreis: <?php echo saas_html(saas_format_money_cents($plan['price_cents'])); ?> € je monatlicher Abrechnungsperiode. Es findet keine personalisierte Preisbildung statt.</small></p>
<ul class="actions">
<li><button type="submit" class="primary">zahlungspflichtig bestellen</button></li>
<li><a href="mandant-einstellungen.php" class="button">Abbrechen</a></li>
</ul>
</form>
</section>
</div>
<?php echo app_public_legal_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>