Compare commits

..

No commits in common. "db4d5cb1b6593cc2add7b3acf8b2b413d53c0696" and "a9f7923716f95cdb33a4e065ea3afff14f2c1ac7" have entirely different histories.

8 changed files with 6 additions and 57 deletions

View file

@ -408,7 +408,7 @@ async def serve_media(path: str, request: _Request):
raise _HE(404, "Nicht gefunden.")
return _media_response(filepath)
APP_VER = "970" # muss mit APP_VER in app.js übereinstimmen
APP_VER = "969" # muss mit APP_VER in app.js übereinstimmen
@app.get("/.well-known/assetlinks.json")
async def assetlinks():

View file

@ -1312,7 +1312,7 @@ async def _handle_upgrade_invoices(req: dict, new_tier_label: str):
""", (
inv_number, req["user_id"], req["name"], req["email"], billing_address,
description, period, price, price, price,
f"Jahresbeitrag gem. AGB. Bei vorzeitiger Kündigung keine anteilige Rückerstattung; Zugang bleibt bis Laufzeitende bestehen. (Upgrade von {req.get('old_tier','Standard')} auf {new_tier_label})",
f"Automatisch bei Upgrade von {req.get('old_tier','Standard')} auf {new_tier_label}.",
))
invoice_id = conn.execute("SELECT last_insert_rowid()").fetchone()[0]
conn.execute(

View file

@ -258,7 +258,7 @@ async def _create_renewal_invoice_draft(user: dict, expires: date, tier_label: s
invoice_number, user["id"], user["name"], user["email"], billing_address,
description, period,
price, price, price,
f"Jahresbeitrag gem. AGB. Bei vorzeitiger Kündigung keine anteilige Rückerstattung; Zugang bleibt bis Laufzeitende bestehen. (Automatisch erstellt, Ablauf: {expires.strftime('%d.%m.%Y')})",
f"Automatisch erstellt — Abo läuft am {expires.strftime('%d.%m.%Y')} ab.",
))
conn.execute(
"INSERT INTO invoice_items (invoice_id, description, quantity, unit_price, total) VALUES (?,?,1,?,?)",

View file

@ -3,7 +3,7 @@
Router, State-Management, Navigation, Initialisierung.
============================================================ */
const APP_VER = '970'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen
const APP_VER = '969'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen
const APP_VERSION = '1.6.0'; // ← semantische Version, wird bei make release gesetzt
const IS_STAGING = location.hostname === 'staging.banyaro.app';
// Cache-Bust-Parameter nach Update-Reload sofort entfernen

View file

@ -3645,7 +3645,6 @@ window.Page_admin = (() => {
recipient_address: address || '',
service_period: _period,
items: [{ description: tierItem.description, quantity: 1, unit_price: tierItem.unit_price }],
notes: 'Jahresbeitrag gem. AGB. Bei vorzeitiger Kündigung keine anteilige Rückerstattung; Zugang bleibt bis Laufzeitende bestehen.',
});
});
});

View file

@ -238,36 +238,6 @@ window.Page_datenschutz = (() => {
style="${S.a}">www.lda.bayern.de</a>
</p>`)}
${sec('Abonnement &amp; Kündigung', `
<p style="${S.p}">
Ban Yaro Pro und das Züchter-Paket sind Jahresabonnements mit einer Laufzeit von
12 Monaten ab Freischaltung.
</p>
<p style="${S.p};margin-top:var(--space-3)">
<strong>Laufzeit &amp; Verlängerung:</strong> Das Abonnement läuft 12 Monate ab dem
Tag der Freischaltung. Nach Ablauf verlängert es sich auf unbestimmte Zeit mit einer
Kündigungsfrist von einem Monat zum Monatsende, sofern nicht vorher gekündigt wird
(§&nbsp;309 Nr.&nbsp;9 BGB).
</p>
<p style="${S.p};margin-top:var(--space-3)">
<strong>Zahlung:</strong> Der Jahresbeitrag (29&nbsp;EUR für Pro, 49&nbsp;EUR für
Züchter) wird einmalig für die gesamte Laufzeit im Voraus fällig.
</p>
<p style="${S.p};margin-top:var(--space-3)">
<strong>Kündigung:</strong> Die Kündigung kann jederzeit in den Einstellungen der App
erfolgen. Der Zugang bleibt bis zum Ende der bezahlten Laufzeit erhalten.
</p>
<p style="${S.p};margin-top:var(--space-3)">
<strong>Erstattung:</strong> Bei vorzeitiger Kündigung durch den Nutzer erfolgt keine
anteilige Rückerstattung des Jahresbeitrags. Der Zugang bleibt bis zum Ende der
bezahlten Laufzeit vollständig bestehen.
</p>
<p style="${S.p};margin-top:var(--space-3)">
<strong>Widerrufsrecht:</strong> Da die Nutzung sofort nach Freischaltung beginnt und
der Nutzer dem ausdrücklich zustimmt, erlischt das 14-tägige Widerrufsrecht gemäß
§&nbsp;356 Abs.&nbsp;4 BGB mit Beginn der Nutzung.
</p>`)}
${sec('Speicherdauer', `
<p style="${S.p}">
Deine Daten werden vollständig gelöscht, sobald du deinen Account löschst

View file

@ -313,18 +313,6 @@ window.Page_settings = (() => {
font-size:var(--text-xs);color:#c05000;line-height:1.6;margin-top:var(--space-2)">
💡 Tipp: Trag deine <strong>Rechnungsadresse</strong> im Profil ein dann können wir die Rechnung vollständig ausstellen.
</div>` : ''}
<div style="margin-top:var(--space-3);padding:var(--space-3);border-radius:var(--radius-md);
background:var(--c-surface-raised,rgba(0,0,0,.04));">
<label style="display:flex;align-items:flex-start;gap:var(--space-2);cursor:pointer;
font-size:var(--text-xs);color:var(--c-text-secondary);line-height:1.5">
<input type="checkbox" id="widerruf-checkbox"
style="margin-top:2px;flex-shrink:0;accent-color:${color}">
<span>
Ich stimme zu, dass mein Zugang sofort nach Freischaltung beginnt, und bestätige,
dass ich damit mein 14-tägiges Widerrufsrecht verliere (§&nbsp;356 Abs.&nbsp;4 BGB).
</span>
</label>
</div>
${breederForm}
</div>`,
footer: `
@ -342,13 +330,6 @@ window.Page_settings = (() => {
</button>`
});
const widerrufBox = document.getElementById('widerruf-checkbox');
const sendBtn = document.getElementById('upgrade-request-send-btn');
if (sendBtn) sendBtn.disabled = true;
widerrufBox?.addEventListener('change', () => {
if (sendBtn) sendBtn.disabled = !widerrufBox.checked;
});
document.getElementById('upgrade-request-send-btn')?.addEventListener('click', async () => {
const btn = document.getElementById('upgrade-request-send-btn');
if (!btn) return;
@ -382,8 +363,7 @@ window.Page_settings = (() => {
}
try {
const widerrufAt = new Date().toLocaleString('de-DE');
const res = await API.auth.upgradeRequest(tier, `[Widerrufsrecht akzeptiert am ${widerrufAt}]`);
const res = await API.auth.upgradeRequest(tier);
UI.modal.close();
if (res.already) {
UI.toast.info('Deine Anfrage liegt bereits vor — wir melden uns bald.');

View file

@ -3,7 +3,7 @@
Offline-Cache + Push Notifications + Tile-Cache
============================================================ */
const CACHE_VERSION = 'by-v970';
const CACHE_VERSION = 'by-v969';
const CACHE_STATIC = `${CACHE_VERSION}-static`;
const CACHE_TILES = 'ban-yaro-tiles-v1'; // bleibt über SW-Updates erhalten
const CACHE_API = 'ban-yaro-api-v1'; // API-Response-Cache