UX: Freischalten zeigt Rechnungsentwurf-Nummer im Toast + Confirm-Hinweis (SW by-v980)
This commit is contained in:
parent
04d8ed153b
commit
78f3077317
5 changed files with 16 additions and 7 deletions
|
|
@ -408,7 +408,7 @@ async def serve_media(path: str, request: _Request):
|
||||||
raise _HE(404, "Nicht gefunden.")
|
raise _HE(404, "Nicht gefunden.")
|
||||||
return _media_response(filepath)
|
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")
|
@app.get("/.well-known/assetlinks.json")
|
||||||
async def assetlinks():
|
async def assetlinks():
|
||||||
|
|
|
||||||
|
|
@ -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}")
|
logging.getLogger(__name__).warning(f"Bestätigungsmail fehlgeschlagen: {e}")
|
||||||
|
|
||||||
# Offene Rechnungen (sent/draft) des alten Tiers stornieren + neuen Entwurf anlegen
|
# Offene Rechnungen (sent/draft) des alten Tiers stornieren + neuen Entwurf anlegen
|
||||||
|
inv_number = None
|
||||||
try:
|
try:
|
||||||
await _handle_upgrade_invoices(req, tier_label)
|
inv_number = await _handle_upgrade_invoices(req, tier_label)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.warning(f"Upgrade-Rechnungslogik fehlgeschlagen für {req['name']}: {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:
|
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}")
|
logger.info(f"Neuer Rechnungsentwurf {inv_number} für {req['email']} nach Upgrade auf {new_tier_label}")
|
||||||
|
return inv_number
|
||||||
|
|
||||||
|
|
||||||
# ------------------------------------------------------------------
|
# ------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
Router, State-Management, Navigation, Initialisierung.
|
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 APP_VERSION = '1.6.0'; // ← semantische Version, wird bei make release gesetzt
|
||||||
const IS_STAGING = location.hostname === 'staging.banyaro.app';
|
const IS_STAGING = location.hostname === 'staging.banyaro.app';
|
||||||
// Cache-Bust-Parameter nach Update-Reload sofort entfernen
|
// Cache-Bust-Parameter nach Update-Reload sofort entfernen
|
||||||
|
|
|
||||||
|
|
@ -3610,7 +3610,7 @@ window.Page_admin = (() => {
|
||||||
const tierLabel = { pro: 'Pro', breeder: 'Züchter' }[tier] || tier;
|
const tierLabel = { pro: 'Pro', breeder: 'Züchter' }[tier] || tier;
|
||||||
const ok = await UI.modal.confirm({
|
const ok = await UI.modal.confirm({
|
||||||
title: `${name} auf ${tierLabel} freischalten?`,
|
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',
|
confirmText: 'Freischalten',
|
||||||
danger: false,
|
danger: false,
|
||||||
});
|
});
|
||||||
|
|
@ -3619,7 +3619,14 @@ window.Page_admin = (() => {
|
||||||
btn.textContent = '…';
|
btn.textContent = '…';
|
||||||
try {
|
try {
|
||||||
const res = await API.post(`/admin/upgrade-requests/${id}/fulfill`);
|
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();
|
_renderTab();
|
||||||
_renderActionItems();
|
_renderActionItems();
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
Offline-Cache + Push Notifications + Tile-Cache
|
Offline-Cache + Push Notifications + Tile-Cache
|
||||||
============================================================ */
|
============================================================ */
|
||||||
|
|
||||||
const CACHE_VERSION = 'by-v979';
|
const CACHE_VERSION = 'by-v980';
|
||||||
const CACHE_STATIC = `${CACHE_VERSION}-static`;
|
const CACHE_STATIC = `${CACHE_VERSION}-static`;
|
||||||
const CACHE_TILES = 'ban-yaro-tiles-v1'; // bleibt über SW-Updates erhalten
|
const CACHE_TILES = 'ban-yaro-tiles-v1'; // bleibt über SW-Updates erhalten
|
||||||
const CACHE_API = 'ban-yaro-api-v1'; // API-Response-Cache
|
const CACHE_API = 'ban-yaro-api-v1'; // API-Response-Cache
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue