🧺
smarpay
Hotline · Agenten-Portal
Zugangsstufen
🔵 Standard — Code abfragen, Tickets erstellen
🔴 Admin — zusätzlich neue Codes generieren
🧺 smarpay Hotline 🔴 Admin 🔵 Standard

📋 Profioffice Anfrage

Waschküche · Code-Problem
— ODER —
Zahlungsnachweis * — eines davon zwingend
— ODER —
TWINT-App: Aktivitäten → Zahlung antippen → Transaktions-Nr.
Kontakt Mieter * (Email oder Mobilnummer — mindestens eines)

Ergebnis PGW

🔍
Angaben eingeben und
auf «Code suchen» klicken
PGW PROD wird abgefragt…
⚠️ Fehler
Code gefunden
Gültig bis:
Transaktion
Nr.
Datum / Zeit
Betrag
Gerät (b-Code)
Mobilnummer

Code direkt dem Mieter mitteilen (mündlich, E-Mail oder SMS).

⚠️ Code abgelaufen
Abgelaufen am:

Gerät: · CHF · Interne ID:

🔒 Neuen Code generieren nur mit Admin-Passwort möglich
💳 TWINT-Rückerstattung
Rückerstattung nur bei TWINT-Zahlung möglich.
Muss manuell im TWINT-Portal durchgeführt werden — smarpay hat keinen direkten Zugang.
Keine Transaktion gefunden
Was prüfen?
  • • Mobilnummer nochmals beim Mieter bestätigen
  • • b-Code vom Aufkleber am Gerät kontrollieren (beginnt mit «b»)
  • • TWINT Transaktions-Nr. anfordern (UUID aus TWINT-App)
  • • Zahlungsdatum und Uhrzeit prüfen
  • • War es tatsächlich ein smarpay-Gerät?

🏢 Verwaltung suchen

🔍
Suche läuft…
Keine Verwaltung gefunden
🏢
Verwaltung auswählen

Rechnungen (smallinvoice)

Lädt…
Keine Rechnungen gefunden

📝 Anfrage erfassen

ℹ️ Bitte zum B2C-Tab wechseln und den Mieter-Prozess durchführen.

📊 Tagesübersicht Transaktionen

PGW · alle Transaktionen eines Tages
abgeschlossene Transaktion(en) am
Total:
Zeit Gerät Mobilnummer Betrag Zahlung Code SubMerchant Status
📭
Keine Transaktionen gefunden
⚠️ Neuen Code generieren?
Diese Aktion erstellt im PGW PROD einen neuen Canastra-Code.
Gerät (b-Code)
Interne Geräte-ID
Betrag CHF
⚠️ Bitte sicherstellen, dass Transaktion und Betrag korrekt sind. Der generierte Code wird direkt im Produktionssystem erstellt.
` Mobilfunknummer: ${f.kontaktMobil || '–'}`, ` Mobilnummer Zahlung: ${f.mobilnr || '–'}`, ` TWINT-Ref: ${f.twintRef || '–'}`, '
', `PGW-Ergebnis: ${statusLabel}`, r?.code ? ` Code: ${r.code} (gültig bis ${r.validDate})` : '', r?.txDate ? ` Transaktion: #${r.txId} vom ${r.txDate} ${r.txTime} | CHF ${r.amount?.toFixed(2)} | Gerät: ${r.deviceRef}` : '', ].filter(Boolean).join('
'); try { const ticket = await apiPost('/api/freshdesk-ticket', { subject, description: lines, email: f.email || f.kontaktMobil || 'hotline@smarpay.eu', type: situation === 'found' ? 'Waschküche' : 'Problem', priority: situation === 'expired' ? 3 : 2, tags: ['profioffice', 'b2c', situation], }); this.b2c.ticketCreated = true; this.b2c.ticketId = ticket.id; this.toast('✅ Ticket #' + ticket.id + ' erstellt', 'success'); } catch (e) { this.toast('Ticket-Fehler: ' + e.message, 'error'); } }, // ── B2B: Verwaltung suchen ──────────────────────────────────────────── debouncedSearch() { clearTimeout(this._searchTimer); if (this.b2b.q.length < 2) { this.b2b.customers = []; return; } this._searchTimer = setTimeout(() => this.searchCustomer(), 400); }, async searchCustomer() { this.b2b.searching = true; try { const data = await apiGet('/api/smallinvoice', { action: 'search', q: this.b2b.q }); this.b2b.customers = data.items || []; } catch (e) { this.toast('smallinvoice: ' + e.message, 'error'); } finally { this.b2b.searching = false; } }, async selectCustomer(c) { this.b2b.selected = c; this.b2b.invoices = []; this.b2b.form.email = c.email || ''; this.b2b.ticketCreated = false; this.b2b.loadingInvoices = true; try { const data = await apiGet('/api/smallinvoice', { action: 'invoices', id: c.id }); this.b2b.invoices = data.items || []; if (this.b2b.invoices[0]) console.log('Invoice keys:', JSON.stringify(Object.keys(this.b2b.invoices[0]))); if (this.b2b.invoices[0]) console.log('First invoice:', JSON.stringify(this.b2b.invoices[0])); } catch (e) { this.toast('Rechnungen: ' + e.message, 'error'); } finally { this.b2b.loadingInvoices = false; } }, // ── B2B: Freshdesk Ticket ───────────────────────────────────────────────────── async createB2BTicket() { const c = this.b2b.selected; const f = this.b2b.form; const errs = []; if (!c) errs.push('Verwaltung (Kunde auswählen)'); if (!f.adresse) errs.push('Adresse Gebäude'); if (!f.datum) errs.push('Datum Zahlung'); if (!f.betrag) errs.push('Betrag (CHF)'); if (!f.mobilnr_email && !f.mobilnr) errs.push('Email oder Mobilnummer Mieter'); if (!f.mobilnr && !f.twintRef) errs.push('Zahlungsnachweis (Mobilnummer oder TWINT-Ref)'); if (!f.problemtyp) errs.push('Problemtyp'); if (errs.length) { this.toast('⚠️ Pflichtfelder fehlen: ' + errs.join(' · '), 'error'); return; } const subject = `B2B – ${c?.name || c?.company_name || '?'} – ${f.problemtyp || 'Anfrage'}`; const lines = [ 'B2B Verwaltungs-Anfrage:', '
', `Verwaltung: ${c?.name || c?.company_name || '–'}`, `Kundennummer: ${c?.number || c?.id || '–'}`, `E-Mail Verwaltung: ${f.email || c?.email || '–'}`, '
', `Adresse Gebäude: ${f.adresse || '–'}`, `Datum / Uhrzeit: ${f.datum || '–'} ${f.uhrzeit || ''}`, `Betrag: CHF ${f.betrag || '–'}`, '
', 'Kontakt Mieter:', ` E-Mail Mieter: ${f.mobilnr_email || '–'}`, ` Mobilnummer: ${f.mobilnr || '–'}`, ` TWINT-Ref: ${f.twintRef || '–'}`, '
', `Vermieter / Ansprechpartner: ${f.vermieter || '–'}`, `Begünstigter / Liegenschaft: ${f.beguenstigter || '–'}`, '
', `Problemtyp: ${f.problemtyp || '–'}`, `Details: ${f.details || '–'}`, ].filter(Boolean).join('
'); this.b2b.ticketLoading = true; try { const ticket = await apiPost('/api/freshdesk-ticket', { subject, description: lines, email: f.email || f.mobilnr_email || c?.email || 'hotline@smarpay.eu', type: 'Billing', priority: 2, group: 'hotline', tags: ['b2b', 'verwaltung'], }); this.b2b.ticketCreated = true; this.b2b.ticketId = ticket.id; this.b2b.ticketUrl = ticket.url || ''; this.toast('✅ Ticket #' + ticket.id + ' erstellt', 'success'); } catch (e) { this.toast('Ticket-Fehler: ' + e.message, 'error'); } finally { this.b2b.ticketLoading = false; } }, // ── Toast ─────────────────────────────────────────────────────────────────────── toast(msg, type = 'success') { const id = Date.now(); this.toasts.push({ id, msg, type }); setTimeout(() => { this.toasts = this.toasts.filter(t => t.id !== id); }, 4500); }, }; // end smarpayApp }

🔄 Neuen Code generieren

Achtung:
Gerät: