UX: Freischalten zeigt Rechnungsentwurf-Nummer im Toast + Confirm-Hinweis (SW by-v980)

This commit is contained in:
rene 2026-05-15 14:01:45 +02:00
parent 04d8ed153b
commit 78f3077317
5 changed files with 16 additions and 7 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 = "979" # muss mit APP_VER in app.js übereinstimmen
APP_VER = "980" # muss mit APP_VER in app.js übereinstimmen
@app.get("/.well-known/assetlinks.json")
async def assetlinks():

View file

@ -1275,12 +1275,13 @@ async def fulfill_upgrade_request(req_id: int, user=Depends(require_admin)):
logging.getLogger(__name__).warning(f"Bestätigungsmail fehlgeschlagen: {e}")
# Offene Rechnungen (sent/draft) des alten Tiers stornieren + neuen Entwurf anlegen
inv_number = None
try:
await _handle_upgrade_invoices(req, tier_label)
inv_number = await _handle_upgrade_invoices(req, tier_label)
except Exception as e:
logger.warning(f"Upgrade-Rechnungslogik fehlgeschlagen für {req['name']}: {e}")
return {"ok": True, "tier": req["tier"], "user": req["name"]}
return {"ok": True, "tier": req["tier"], "user": req["name"], "invoice_number": inv_number}
def _get_discount_info(conn, user_id: int) -> dict:
@ -1379,6 +1380,7 @@ async def _handle_upgrade_invoices(req: dict, new_tier_label: str):
)
logger.info(f"Neuer Rechnungsentwurf {inv_number} für {req['email']} nach Upgrade auf {new_tier_label}")
return inv_number
# ------------------------------------------------------------------

View file

@ -3,7 +3,7 @@
Router, State-Management, Navigation, Initialisierung.
============================================================ */
const APP_VER = '979'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen
const APP_VER = '980'; // ← 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

@ -3610,7 +3610,7 @@ window.Page_admin = (() => {
const tierLabel = { pro: 'Pro', breeder: 'Züchter' }[tier] || tier;
const ok = await UI.modal.confirm({
title: `${name} auf ${tierLabel} freischalten?`,
message: `Der Account wird auf ${tierLabel} gesetzt und eine Bestätigungsmail gesendet.`,
message: `Der Account wird auf ${tierLabel} gesetzt und eine Bestätigungsmail gesendet.\n\nFalls noch keine Rechnung gesendet wurde, wird ein Entwurf automatisch angelegt.`,
confirmText: 'Freischalten',
danger: false,
});
@ -3619,7 +3619,14 @@ window.Page_admin = (() => {
btn.textContent = '…';
try {
const res = await API.post(`/admin/upgrade-requests/${id}/fulfill`);
UI.toast.success(`${res.user} wurde auf ${tierLabel} freigeschaltet.`);
if (res.invoice_number) {
UI.toast.success(
`${res.user} freigeschaltet · Entwurf ${res.invoice_number} unter Rechnungen versenden`,
6000
);
} else {
UI.toast.success(`${res.user} wurde auf ${tierLabel} freigeschaltet.`);
}
_renderTab();
_renderActionItems();
} catch (e) {

View file

@ -3,7 +3,7 @@
Offline-Cache + Push Notifications + Tile-Cache
============================================================ */
const CACHE_VERSION = 'by-v979';
const CACHE_VERSION = 'by-v980';
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