Add NOK pricing catalog, credit ledger, success-based charging, and tier-gated model routing
- PricingCatalog.php: single source of truth for plans (free/plus/pro), top-ups, Stripe price env keys, tool costs (0–6 credits), STT variable billing, feature limits - FreeTier.php: monthly-first credit deduction, ledger (user_tool_credit_ledger), STT reservation/settle/release, monthly reset, trial logic - StripeClient.php: canonical SKUs (plus/pro/topup_100/300/1000), legacy aliases kept - stripe-checkout.php: subscription vs payment mode, trial gating, catalog metadata - stripe-webhook.php: idempotent via stripe_events, handles subscription lifecycle + invoice.paid renewal + one-time topup credit grants - All API tools: success-based credit deduction (check before, charge after) - transcribe.php: file-size heuristic reservation, settle from actual provider duration - ask.php + LegalTools.php: ToolModels engine resolution — Pro gets gpt-4o - KorrespondAgent.php + korrespond.php: tier-gated draft deployment — Free/Plus gets gpt-4o-mini, Pro gets gpt-4o - pricing.php: NOK-only, plan cards, top-up packs, Organisation contact card, tool cost table, separate monthly/prepaid balance display - 003_pricing_credit_catalog.sql: ledger and STT reservation tables Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -2,6 +2,7 @@
|
||||
declare(strict_types=1);
|
||||
|
||||
require_once __DIR__ . '/includes/bootstrap.php';
|
||||
require_once __DIR__ . '/includes/PricingCatalog.php';
|
||||
|
||||
function dbnToolsSafeReturn(mixed $value, string $default = '/'): string
|
||||
{
|
||||
@@ -257,13 +258,13 @@ window.DBN_TOOLS_LANG = <?= json_encode($uiLang, JSON_UNESCAPED_UNICODE) ?>;
|
||||
<p class="lt-pricing-strip__sub"><?= htmlspecialchars(dbnToolsT('pricing_strip_sub', $uiLang)) ?></p>
|
||||
<?php $freeName = match($uiLang) { 'no' => 'Gratis', 'uk' => 'Безкоштовно', 'pl' => 'Bezpłatnie', default => 'Free' }; ?>
|
||||
<div class="lt-pricing-strip__tiers">
|
||||
<span class="lt-pricing-strip__tier">€0 <?= htmlspecialchars($freeName) ?></span>
|
||||
<span class="lt-pricing-strip__tier"><?= htmlspecialchars(PricingCatalog::formatNok(0)) ?> <?= htmlspecialchars($freeName) ?></span>
|
||||
<span class="lt-pricing-strip__sep">·</span>
|
||||
<span class="lt-pricing-strip__tier">€9 Light</span>
|
||||
<span class="lt-pricing-strip__tier"><?= htmlspecialchars(PricingCatalog::formatNok(149)) ?> Pluss</span>
|
||||
<span class="lt-pricing-strip__sep">·</span>
|
||||
<span class="lt-pricing-strip__tier lt-pricing-strip__tier--pop">€29 Pro</span>
|
||||
<span class="lt-pricing-strip__tier lt-pricing-strip__tier--pop"><?= htmlspecialchars(PricingCatalog::formatNok(399)) ?> Pro Familie</span>
|
||||
<span class="lt-pricing-strip__sep">·</span>
|
||||
<span class="lt-pricing-strip__tier">€79 Pro+</span>
|
||||
<span class="lt-pricing-strip__tier"><?= $uiLang === 'no' ? 'Organisasjon: kontakt' : 'Organisation: contact' ?></span>
|
||||
</div>
|
||||
<a href="/pricing.php<?= $uiLang !== 'en' ? '?lang=' . urlencode($uiLang) : '' ?>" class="lt-pricing-strip__cta"><?= htmlspecialchars(dbnToolsT('pricing_strip_cta', $uiLang)) ?></a>
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user