Gründer-Tickets: 50%-Rabatt-Weitergabe pro Gründer gedeckelt + Pro-Wording korrigiert

Rene: 'ungern jemandem auf ewig die Möglichkeit geben 50% Rabatt zu vergeben —
bei 100 Gründern ein großer Faktor. Ich hätte jedem 25–50 Tickets gegeben.'

- users.founder_referral_tickets (Default 25): Kontingent an 50%-Rabatten,
  die ein Gründer an Geworbene weitergeben kann. Technisch = die ersten N
  VERIFIZIERTEN Geworbenen (nach Anmeldedatum) bekommen 50%, danach 0.
  Unbestätigte verbrauchen kein Ticket. In scheduler.py (Rechnung) + admin.py
  (Vorschau) konsistent.
- BUGFIX nebenbei: admin.py zeigte für referred_by_founder fälschlich 100%
  statt 50% (scheduler war korrekt) — jetzt beide 50%.
- Admin: Grant-Formular bekommt Feld 'Gründer-Tickets' (0–200, Vorbelegung
  aus User-Stand); Endpoint /grant akzeptiert founder_tickets.
- Gründer-Seite + Settings + Admin-Hilfe: 'sobald Bezahlfunktionen aktiv sind'
  raus (Pro kostet bereits); Vorteil 'lebenslang Pro gratis' + '25 Freunde
  zum halben Preis' (Ticket-Framing).
- Tests: test_founder_tickets.py (Cap, Unverified-Schutz, 50%-Bugfix, Grant).
  Suite: 64 passed.
This commit is contained in:
rene 2026-06-08 06:20:19 +02:00
parent 98ec6c36c6
commit 60fb866283
13 changed files with 154 additions and 35 deletions

View file

@ -86,14 +86,14 @@
<title>Ban Yaro</title>
<!-- Theme + theme-color Statusleiste vor CSS setzen -->
<script src="/js/boot-early.js?v=1271"></script>
<script src="/js/boot-early.js?v=1272"></script>
<!-- CSS: Reihenfolge ist wichtig — ?v= zwingt Browser zur Neuladung -->
<link rel="stylesheet" href="/css/design-system.css?v=1271">
<link rel="stylesheet" href="/css/layout.css?v=1271">
<link rel="stylesheet" href="/css/components.css?v=1271">
<link rel="stylesheet" href="/css/utilities.css?v=1271">
<link rel="stylesheet" href="/css/lists.css?v=1271">
<link rel="stylesheet" href="/css/design-system.css?v=1272">
<link rel="stylesheet" href="/css/layout.css?v=1272">
<link rel="stylesheet" href="/css/components.css?v=1272">
<link rel="stylesheet" href="/css/utilities.css?v=1272">
<link rel="stylesheet" href="/css/lists.css?v=1272">
</head>
<body>
@ -620,11 +620,11 @@
<div id="modal-container"></div>
<!-- JS: Reihenfolge ist wichtig — erst Basis, dann Features -->
<script src="/js/api.js?v=1271"></script>
<script src="/js/ui.js?v=1271"></script>
<script src="/js/app.js?v=1271"></script>
<script src="/js/worlds.js?v=1271"></script>
<script src="/js/offline-indicator.js?v=1271"></script>
<script src="/js/api.js?v=1272"></script>
<script src="/js/ui.js?v=1272"></script>
<script src="/js/app.js?v=1272"></script>
<script src="/js/worlds.js?v=1272"></script>
<script src="/js/offline-indicator.js?v=1272"></script>
<!-- Feature-Seiten werden lazy geladen -->
@ -634,7 +634,7 @@
<!-- Boot: Offline-Banner + SW-Registration (extrahiert für CSP) -->
<script src="/js/boot.js?v=1271"></script>
<script src="/js/boot.js?v=1272"></script>
</body>