Abo: Testkonten zahlen per Rabatt nur 0,50 EUR (ABO_TEST_EMAILS)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
7237ec729d
commit
90e85f5989
4 files changed
+27
No files matched your search
@@ -624,6 +624,7 @@ function renderAboOffer(card, data, { ended } = {}) {
|
|||||||
</div>
|
</div>
|
||||||
<div class="abo-order hidden" id="abo-order">
|
<div class="abo-order hidden" id="abo-order">
|
||||||
<h3>Ihre Bestellung</h3>
|
<h3>Ihre Bestellung</h3>
|
||||||
|
${data.testAccount ? '<div class="abo-alert">Testkonto: Bei Stripe wird ein Test-Rabatt verrechnet, abgebucht werden nur 0,50 € pro Monat.</div>' : ''}
|
||||||
<label class="abo-check"><input type="checkbox" id="abo-terms">
|
<label class="abo-check"><input type="checkbox" id="abo-terms">
|
||||||
<span>Ich habe die <a href="/abo-bedingungen.html" target="_blank" rel="noopener">Vertragsbedingungen mit Leistungsbeschreibung und Auftragsverarbeitungsvertrag</a> gelesen und stimme ihnen zu. Die <a href="/abo-bedingungen.html#widerruf" target="_blank" rel="noopener">Widerrufsbelehrung</a> habe ich zur Kenntnis genommen.</span></label>
|
<span>Ich habe die <a href="/abo-bedingungen.html" target="_blank" rel="noopener">Vertragsbedingungen mit Leistungsbeschreibung und Auftragsverarbeitungsvertrag</a> gelesen und stimme ihnen zu. Die <a href="/abo-bedingungen.html#widerruf" target="_blank" rel="noopener">Widerrufsbelehrung</a> habe ich zur Kenntnis genommen.</span></label>
|
||||||
|
|
||||||
|
|||||||
@@ -84,6 +84,12 @@ export const config = {
|
|||||||
.split(',')
|
.split(',')
|
||||||
.map((s) => s.trim().toLowerCase())
|
.map((s) => s.trim().toLowerCase())
|
||||||
.filter(Boolean),
|
.filter(Boolean),
|
||||||
|
// Testkonten zahlen nur den Stripe-Mindestbetrag (0,50 €) ueber einen Rabatt auf den echten Preis
|
||||||
|
testEmails: (process.env.ABO_TEST_EMAILS || '')
|
||||||
|
.split(',')
|
||||||
|
.map((s) => s.trim().toLowerCase())
|
||||||
|
.filter(Boolean),
|
||||||
|
testCouponId: 'WEBKLAR-TEST-050',
|
||||||
},
|
},
|
||||||
|
|
||||||
smtp: {
|
smtp: {
|
||||||
|
|||||||
@@ -79,6 +79,7 @@ router.get('/', requireSession, async (req, res) => {
|
|||||||
const ledger = sub ? await getLedger(customerId, { active }) : null
|
const ledger = sub ? await getLedger(customerId, { active }) : null
|
||||||
return res.json({
|
return res.json({
|
||||||
available: isStripeConfigured() && isPilotAllowed(customer),
|
available: isStripeConfigured() && isPilotAllowed(customer),
|
||||||
|
testAccount: config.abo.testEmails.includes(String(customer?.email || '').toLowerCase()),
|
||||||
termsVersion: config.abo.termsVersion,
|
termsVersion: config.abo.termsVersion,
|
||||||
subscription: publicSubscription(sub),
|
subscription: publicSubscription(sub),
|
||||||
ledger,
|
ledger,
|
||||||
|
|||||||
@@ -265,6 +265,22 @@ async function getOrCreateStripeCustomer(customer) {
|
|||||||
return created.id
|
return created.id
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Rabatt fuer Testkonten: 49,50 € auf jede Abrechnung -> es werden nur 0,50 € abgebucht. */
|
||||||
|
async function ensureTestCoupon() {
|
||||||
|
const stripe = getStripe()
|
||||||
|
const existing = await stripe.coupons.retrieve(config.abo.testCouponId).catch(() => null)
|
||||||
|
if (existing) return existing.id
|
||||||
|
const created = await stripe.coupons.create({
|
||||||
|
id: config.abo.testCouponId,
|
||||||
|
name: 'Testzugang WEBklar (0,50 €)',
|
||||||
|
amount_off: config.stripe.priceAmountCents - 50,
|
||||||
|
currency: 'eur',
|
||||||
|
duration: 'forever',
|
||||||
|
metadata: { webklar: 'wartungs-abo-test' },
|
||||||
|
})
|
||||||
|
return created.id
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Stripe Checkout fuer das Abo. Der Kunde hat seine Bestellung vorher im Portal
|
* Stripe Checkout fuer das Abo. Der Kunde hat seine Bestellung vorher im Portal
|
||||||
* abgegeben ("Zahlungspflichtig bestellen"); hier hinterlegt er die Zahlungsart.
|
* abgegeben ("Zahlungspflichtig bestellen"); hier hinterlegt er die Zahlungsart.
|
||||||
@@ -284,6 +300,8 @@ export async function createAboCheckout(customer, consent) {
|
|||||||
getOrCreateStripeCustomer(customer),
|
getOrCreateStripeCustomer(customer),
|
||||||
])
|
])
|
||||||
const lateStart = consent.startChoice === 'nach_frist'
|
const lateStart = consent.startChoice === 'nach_frist'
|
||||||
|
const isTestAccount = config.abo.testEmails.includes(String(customer.email || '').toLowerCase())
|
||||||
|
const testCoupon = isTestAccount ? await ensureTestCoupon() : null
|
||||||
// Stripe-Metadaten: max. 500 Zeichen je Wert
|
// Stripe-Metadaten: max. 500 Zeichen je Wert
|
||||||
const meta = {
|
const meta = {
|
||||||
webklarCustomerId: customer.$id,
|
webklarCustomerId: customer.$id,
|
||||||
@@ -311,6 +329,7 @@ export async function createAboCheckout(customer, consent) {
|
|||||||
...(lateStart ? { trial_period_days: config.abo.lateStartTrialDays } : {}),
|
...(lateStart ? { trial_period_days: config.abo.lateStartTrialDays } : {}),
|
||||||
},
|
},
|
||||||
metadata: meta,
|
metadata: meta,
|
||||||
|
...(testCoupon ? { discounts: [{ coupon: testCoupon }] } : {}),
|
||||||
custom_text: {
|
custom_text: {
|
||||||
submit: {
|
submit: {
|
||||||
message: lateStart
|
message: lateStart
|
||||||
|
|||||||
Reference in new issue
Block a user