Billing Phase 1: Tarifstatus-Datenmodell und Tariflogik je Mandant
Vorbereitung fuer Stripe Billing (Zahlungseinzug) + bestehendes Dolibarr des Kunden (Rechnungsstellung/Buchhaltung) statt eines eigenen Rechnungs- systems oder eines zusaetzlichen ERP nur fuer Kaffeeliste - Begruendung in docs/billing.md. - Neue Tabelle tenant_billing (plan_code, subscription_status, sowie bereits vorbereitete, noch ungenutzte Felder fuer Stripe/Dolibarr-IDs). - app/billing.php: billing_plans() als einzige Quelle der Tarifstufen (synchron mit preise.php), billing_required_plan_code() anhand aktiver Teilnehmerzahl, billing_check_tenant() vergleicht gebuchten mit benoetigtem Tarif - rein informativ, kein Enforcement, solange Stripe nicht angebunden ist. - Neue Mandanten starten automatisch auf plan_code='free' bei der Registrierung. - mandant-einstellungen.php zeigt Owner/Admin ihren aktuellen Tarif und Teilnehmerstand, mit Hinweis bei Bedarf einer hoeheren Stufe. - Back-Office zeigt zusaetzlich zur Mandantenliste den gebuchten und (falls abweichend) den tatsaechlich benoetigten Tarif. Live getestet: Tarifgrenzen (10/25/50/150) mit einem Mandanten unter und einem ueber dem Freikontingent geprueft, UI in Mandant-Einstellungen und Back-Office verifiziert. Alle M8-Isolations-/Rollenmatrix-Tests weiterhin gruen. Phase 2 (Stripe) und Phase 3 (Dolibarr-Sync) folgen, sobald Test-Keys beziehungsweise Sandbox-Zugang vorliegen. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
+10
-1
@@ -2,11 +2,13 @@
|
||||
|
||||
require_once __DIR__ . '/functions.php';
|
||||
require_once __DIR__ . '/app/platform-admin.php';
|
||||
require_once __DIR__ . '/app/billing.php';
|
||||
|
||||
$pdo = app_db_pdo();
|
||||
$user = app_require_platform_admin($pdo);
|
||||
|
||||
$tenants = app_backoffice_fetch_tenants($pdo);
|
||||
$billingPlans = billing_plans();
|
||||
|
||||
include 'header.php';
|
||||
include 'headerline.php';
|
||||
@@ -24,17 +26,24 @@ include 'nav.php';
|
||||
<th>Kunde</th>
|
||||
<th>Kürzel</th>
|
||||
<th>Status</th>
|
||||
<th>Tarif</th>
|
||||
<th>Erstellt</th>
|
||||
<th>Teilnehmer (aktiv/gesamt)</th>
|
||||
<th>Saldensumme</th>
|
||||
<th></th>
|
||||
</tr>
|
||||
<?php foreach ($tenants as $tenant): ?>
|
||||
<?php $tenantRequiredPlan = billing_required_plan_code((int)$tenant['active_participant_count']); ?>
|
||||
<tr>
|
||||
<td><?php echo saas_html($tenant['name']); ?></td>
|
||||
<td><?php echo saas_html($tenant['slug']); ?></td>
|
||||
<td><?php echo saas_html($tenant['status']); ?></td>
|
||||
<td><?php echo saas_html($tenant['created_at']); ?></td>
|
||||
<td>
|
||||
<?php echo saas_html($billingPlans[$tenant['plan_code']]['label'] ?? $tenant['plan_code']); ?>
|
||||
<?php if ($tenantRequiredPlan !== $tenant['plan_code']): ?>
|
||||
<br><small>benötigt: <?php echo saas_html($billingPlans[$tenantRequiredPlan]['label'] ?? $tenantRequiredPlan); ?></small>
|
||||
<?php endif; ?>
|
||||
</td>
|
||||
<td><?php echo (int)$tenant['active_participant_count']; ?> / <?php echo (int)$tenant['participant_count']; ?></td>
|
||||
<td><?php echo saas_html(saas_format_money_cents((int)$tenant['balance_cents'])); ?> €</td>
|
||||
<td><a href="backoffice-mandant.php?tenant_id=<?php echo (int)$tenant['id']; ?>" class="button">Ansehen</a></td>
|
||||
|
||||
Reference in New Issue
Block a user