diff --git a/Website/templates/schnell_buchung.html b/Website/templates/schnell_buchung.html index c375a43..78e5955 100644 --- a/Website/templates/schnell_buchung.html +++ b/Website/templates/schnell_buchung.html @@ -163,7 +163,7 @@ margin-top: 1.5rem; } - /* NEU: Loading State UI */ + /* Loading State UI */ #setup-loading-state, #setup-success-state { display: none; @@ -190,7 +190,7 @@ height: 2rem; } - /* NEU: Success State UI */ + /* Success State UI */ .success-icon { width: 70px; height: 70px; @@ -210,7 +210,7 @@ border-radius: 12px; padding: 1.5rem; margin: 1.5rem auto; - max-width: 400px; + max-width: 450px; text-align: left; } @@ -232,9 +232,28 @@ border-radius: 8px; margin-bottom: 1.5rem; } + + .btn.success-btn { + background-color: #1b8a3e; + border-color: #1b8a3e; + color: #fff; + } + .btn.success-btn:hover { + background-color: #146c2e; + border-color: #146c2e; + } @media (max-width: 720px) { .booking-review__grid, .booking-review__form-grid { grid-template-columns: 1fr; } + .booking-review__actions { flex-direction: column; } + .booking-review__actions .btn { width: 100%; min-width: 0; } + } + + /* Verstecke UI-Elemente beim Drucken */ + @media print { + header, footer, nav, .booking-review__actions { display: none !important; } + body { background: white; } + .booking-review__panel { box-shadow: none; border: none; padding: 0; } } {% endblock %} @@ -255,9 +274,11 @@ Paket
{{ package }}
-
- Preis -
{{ package_price }} €
Kauf auf Rechnung (30 Tage)
+ +
+ Zahlungsart +
Kauf auf Rechnung
+ 30 Tage Zahlungsziel nach Bereitstellung
@@ -265,7 +286,6 @@ Die Software-Instanz wird nach dem Absenden sofort für 30 Tage freigeschaltet. Die finale Laufzeit aktiviert sich automatisch nach Zahlungseingang durch Ihren Schulträger. -
@@ -288,10 +308,11 @@ +
2. Rechnungsadresse (Schulträger)
- +
@@ -305,21 +326,30 @@
+
+ + +
3. Technische Einrichtung
- - .euresoftware.de + + .invario-software.de
+ @@ -338,7 +368,7 @@

Instanz wird bereitgestellt

-

Ihre Bestellung war erfolgreich. Die Rechnung wird gerade verschickt.

+

Ihre Bestellung wird verarbeitet. Die Rechnung wird zeitgleich generiert.

Validierung der Daten...

Bitte schließen Sie dieses Fenster nicht. Dies dauert in der Regel 15-30 Sekunden.

@@ -350,7 +380,7 @@
✓

Ihre Schule ist online!

-

Das Setup wurde erfolgreich abgeschlossen. Sie können sich nun einloggen.

+

Das Setup wurde erfolgreich abgeschlossen. Ihre Rechnung wurde an die angegebene E-Mail-Adresse versandt.

Aus Datenschutzgründen (AVV) müssen Sie das generierte Passwort nach dem ersten Login zwingend ändern! @@ -362,7 +392,16 @@

Initial-Passwort: -

- Jetzt zur Schulplattform wechseln + +
@@ -417,7 +456,7 @@ // AJAX Form Submit & Transition to Loading // ========================================== form.addEventListener('submit', async (e) => { - e.preventDefault(); // Verhindert das klassische Neuladen der Seite + e.preventDefault(); errorAlert.style.display = 'none'; submitBtn.disabled = true; @@ -425,7 +464,6 @@ const tenantSlug = formData.get('tenant_slug'); try { - // 1. Schicke Daten ans Backend (muss im Backend JSON zurückgeben!) const response = await fetch(form.action, { method: 'POST', body: formData, @@ -438,11 +476,11 @@ throw new Error(result.error || 'Es gab ein Problem bei der Buchung.'); } - // 2. Erfolg: Formular verstecken, Ladebildschirm zeigen + // Erfolg: Formular verstecken, Ladebildschirm zeigen formState.style.display = 'none'; loadingState.style.display = 'block'; - // 3. Starte Polling + // Starte Polling startPolling(tenantSlug); } catch (error) { @@ -456,10 +494,10 @@ // Polling Logik (Warten auf den Server) // ========================================== async function startPolling(slug) { - // Fake-Texte für den Nutzer, damit er weiß, dass das System arbeitet const statusMessages = [ - "Prüfe Serverkapazitäten...", - "Richte Datenbank ein...", + "Registriere Schuldatenbank...", + "Erstelle Auftragsverarbeitungsvertrag...", + "Generiere Rechnung für Schulträger...", "Konfiguriere Nginx & Zertifikate...", "Führe finale Health-Checks durch..." ]; @@ -472,17 +510,15 @@ } }, 3500); - // Das eigentliche Polling zum Backend const checkStatus = async () => { try { - // Backend-Route, die den Status des tenant_slug abfragt const res = await fetch(`/instance_request/status?slug=${slug}`); const data = await res.json(); if (data.status === 'ready') { // SETUP FERTIG! clearInterval(msgInterval); - showSuccessState(data.url, data.username, data.password); + showSuccessState(data.url, data.username, data.password, data.invoice_url); } else if (data.status === 'failed') { // SETUP FEHLGESCHLAGEN clearInterval(msgInterval); @@ -493,7 +529,6 @@ setTimeout(checkStatus, 3000); } } catch (err) { - // Bei Netzwerkfehlern während des Pollings einfach weiter probieren setTimeout(checkStatus, 3000); } }; @@ -505,7 +540,7 @@ // ========================================== // Erfolgs-Bildschirm anzeigen // ========================================== - function showSuccessState(url, user, pass) { + function showSuccessState(url, user, pass, invoiceUrl) { loadingState.style.display = 'none'; successState.style.display = 'block'; @@ -514,6 +549,13 @@ document.getElementById('success-user').textContent = user; document.getElementById('success-pass').textContent = pass; document.getElementById('btn-go-to-tenant').href = url; + + // Rechnungs-Button einblenden, falls URL vorhanden + const invoiceBtn = document.getElementById('btn-download-invoice'); + if (invoiceUrl) { + invoiceBtn.href = invoiceUrl; + invoiceBtn.style.display = 'inline-flex'; + } } })();