Abo-Angebote im Ticketsystem: Sammelliste, neues Angebot, Kunden-Reiter Abo & Angebote

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
ClaudeandClaude Opus 5.5 committed 2026-10-02 03:05:12 +00:00
1 parent 109aef6805
commit 281c49d406
7 files changed
+321 -1

No files matched your search

+7 -1
View File
@@ -17,6 +17,7 @@ import ChatThread from '../components/chat/ChatThread'
import AboStatusCard from '../components/customer/AboStatusCard'
import CustomerFunktionen from '../components/customer/CustomerFunktionen'
import CreditsView from '../components/credits/CreditsView'
import OffersView from '../components/offers/OffersView'
import KundenansichtButton from '../components/customer/KundenansichtButton'
import { getCustomerPortalStatus } from '../lib/teamApi'
import { formatLastLogin } from '../lib/lastLogin'
@@ -109,7 +110,12 @@ export default function CustomerDetailPage() {
{activeTab === 'invoices' && <CustomerInvoices customer={customer} onShowOverview={() => setTab('overview')} />}
{activeTab === 'projects' && <CustomerProjects customerId={customer.$id} />}
{activeTab === 'chat' && <Card><ChatThread customerId={customer.$id} customerName={customer.name} /></Card>}
{activeTab === 'abo' && <AboStatusCard customerId={customer.$id} />}
{activeTab === 'abo' && (
<>
<AboStatusCard customerId={customer.$id} />
<div style={{ marginTop: 16 }}><OffersView customerId={customer.$id} customerName={customer.name} /></div>
</>
)}
{activeTab === 'gutschriften' && <CreditsView customerId={customer.$id} />}
{activeTab === 'funktionen' && <CustomerFunktionen customerId={customer.$id} />}
{activeTab === 'protokoll' && <CustomerViewLog customerId={customer.$id} />}
+13
View File
@@ -0,0 +1,13 @@
import { PageHeader } from '../components/ui'
import OffersView from '../components/offers/OffersView'
// Kunden -> Abo-Angebote: individuelle Angebote aller Kunden (Stripe-Coupon je Angebot)
export default function OffersPage() {
return (
<div className="page">
<PageHeader title="Abo-Angebote" subtitle="Individuelle Angebote für das Wartungs- oder Hosting-Abo" />
<OffersView />
<p className="area-muted" style={{ marginTop: 12 }}>Ein Angebot legt sofort einen einmal einlösbaren Coupon in Stripe an. Ohne laufendes Abo wird er beim Abschluss angewendet (und schaltet die Bestellung für diesen Kunden frei), bei laufendem Abo gilt er ab der nächsten Abbuchung. Nach den Angebotsmonaten gilt automatisch wieder der reguläre Preis.</p>
</div>
)
}