import React, { useState, useRef, useEffect } from 'react';
import { FileText, Send, Check, CreditCard, Building2, User, Mail, Phone, MapPin, Edit3, AlertCircle } from 'lucide-react';
const OnboardingSystem = () => {
const [view, setView] = useState('admin'); // 'admin' or 'customer'
const [adminData, setAdminData] = useState({
offerPdf: null,
projectName: '',
projectDescription: '',
price: '',
oneTimeLink: ''
});
const [customerData, setCustomerData] = useState({
company: '',
street: '',
postalCode: '',
city: '',
contactPerson: '',
email: '',
phone: '',
websiteSupport: '',
hostingOption: '',
signature: '',
signatureDate: '',
ipAddress: '',
location: ''
});
const [step, setStep] = useState(1);
const [isDrawing, setIsDrawing] = useState(false);
const canvasRef = useRef(null);
const [paymentMethod, setPaymentMethod] = useState('');
// Generate unique link
const generateLink = () => {
const uniqueId = Math.random().toString(36).substring(2, 15);
setAdminData({...adminData, oneTimeLink: `https://ihr-portal.de/onboarding/${uniqueId}`});
};
// Handle file upload
const handleFileUpload = (e) => {
const file = e.target.files[0];
if (file && file.type === 'application/pdf') {
setAdminData({...adminData, offerPdf: file});
}
};
// Start customer flow
const startCustomerFlow = () => {
if (!adminData.offerPdf || !adminData.projectName) {
alert('Bitte füllen Sie alle erforderlichen Felder aus und laden Sie ein PDF hoch.');
return;
}
setView('customer');
setStep(1);
// Simulate IP and location capture
setCustomerData({
...customerData,
ipAddress: '192.168.1.100',
location: 'Erlangen, DE'
});
};
// Canvas drawing functions
const startDrawing = (e) => {
setIsDrawing(true);
const canvas = canvasRef.current;
const ctx = canvas.getContext('2d');
const rect = canvas.getBoundingClientRect();
const x = e.clientX - rect.left;
const y = e.clientY - rect.top;
ctx.beginPath();
ctx.moveTo(x, y);
};
const draw = (e) => {
if (!isDrawing) return;
const canvas = canvasRef.current;
const ctx = canvas.getContext('2d');
const rect = canvas.getBoundingClientRect();
const x = e.clientX - rect.left;
const y = e.clientY - rect.top;
ctx.lineTo(x, y);
ctx.strokeStyle = '#6d0202';
ctx.lineWidth = 2;
ctx.lineCap = 'round';
ctx.stroke();
};
const stopDrawing = () => {
setIsDrawing(false);
if (canvasRef.current) {
const signatureData = canvasRef.current.toDataURL();
setCustomerData({
...customerData,
signature: signatureData,
signatureDate: new Date().toLocaleString('de-DE')
});
}
};
const clearSignature = () => {
const canvas = canvasRef.current;
const ctx = canvas.getContext('2d');
ctx.clearRect(0, 0, canvas.width, canvas.height);
setCustomerData({...customerData, signature: ''});
};
// Save contract to storage
const finalizeContract = async () => {
const contractData = {
...adminData,
...customerData,
contractId: `CONTRACT-${Date.now()}`,
timestamp: new Date().toISOString()
};
try {
await window.storage.set(
`contract:${contractData.contractId}`,
JSON.stringify(contractData)
);
setStep(9);
} catch (error) {
console.error('Error saving contract:', error);
alert('Fehler beim Speichern des Vertrags');
}
};
// Admin Panel View
if (view === 'admin') {
return (
Admin Panel - Onboarding Link erstellen
Erstellen Sie einen Einmallink für Ihren Kunden
Projektname *
setAdminData({...adminData, projectName: e.target.value})}
className="w-full px-4 py-3 bg-gray-700 border border-gray-600 rounded-lg text-white focus:ring-2 focus:ring-[#6d0202] focus:border-transparent"
placeholder="z.B. Website Redesign für Firma XY"
/>
Projektbeschreibung
Projektpreis (optional)
setAdminData({...adminData, price: e.target.value})}
className="w-full px-4 py-3 bg-gray-700 border border-gray-600 rounded-lg text-white focus:ring-2 focus:ring-[#6d0202] focus:border-transparent"
placeholder="z.B. 5.000,00 € netto"
/>
{adminData.oneTimeLink && (
)}
Link generieren
Kunde-Ansicht testen
);
}
// Customer View
return (
{/* Progress Bar */}
{[1, 2, 3, 4, 5, 6, 7, 8].map((s) => (
= s
? 'bg-gradient-to-r from-[#6d0202] to-[#9d0303] text-white shadow-lg shadow-red-900/50'
: 'bg-gray-700 text-gray-400'
}`}
>
{step > s ? : s}
))}
{/* Step 1: Customer Data */}
{step === 1 && (
Ihre Unternehmensdaten
setStep(2)}
disabled={!customerData.company || !customerData.email}
className="mt-8 w-full bg-gradient-to-r from-[#6d0202] to-[#9d0303] text-white px-6 py-4 rounded-lg font-semibold hover:shadow-lg hover:shadow-red-900/50 transition-all disabled:opacity-50 disabled:cursor-not-allowed"
>
Weiter zum Angebot
)}
{/* Step 2: Offer Review */}
{step === 2 && (
Ihr Angebot
{adminData.projectName}
{adminData.projectDescription && (
{adminData.projectDescription}
)}
{adminData.price && (
Preis: {adminData.price}
)}
Angebots-PDF: {adminData.offerPdf?.name || 'Angebot.pdf'}
PDF herunterladen und ansehen →
Bitte prüfen Sie das Angebot sorgfältig
Laden Sie das PDF herunter und lesen Sie alle Details durch, bevor Sie fortfahren.
setStep(1)}
className="flex-1 bg-gray-700 hover:bg-gray-600 text-white px-6 py-4 rounded-lg font-semibold transition-all"
>
Zurück
setStep(3)}
className="flex-1 bg-gradient-to-r from-[#6d0202] to-[#9d0303] text-white px-6 py-4 rounded-lg font-semibold hover:shadow-lg hover:shadow-red-900/50 transition-all"
>
Angebot bestätigen
)}
{/* Step 3: Website Support Option */}
{step === 3 && (
§ 4 Website-Betreuung und Support
Der Auftraggeber kann optional eine aktive Betreuung der Website für zusätzlich 79,00 € netto pro Monat ,
beginnend zwei Monate nach Vertragsschluss, beauftragen.
setCustomerData({...customerData, websiteSupport: 'active'})}
className={`cursor-pointer p-6 rounded-xl border-2 transition-all ${
customerData.websiteSupport === 'active'
? 'border-[#6d0202] bg-gradient-to-br from-red-900/30 to-red-800/20 shadow-lg shadow-red-900/30'
: 'border-gray-600 bg-gray-700 hover:border-gray-500'
}`}
>
{customerData.websiteSupport === 'active' && }
a) Aktive Betreuung
Diese umfasst u.a.:
Fortlaufende technische Überwachung und Sicherheitsupdates
CMS- und Plugin-Updates
Monitoring der Erreichbarkeit
Funktionsprüfung der Website
Kleinere inhaltliche Änderungen bis zu 30 Minuten pro Monat
Priorisierte Bearbeitung im Support
(Weitere Zeit wird auf Stundenbasis gem. Preisverzeichnis berechnet - 129,00 € netto/Stunde)
setCustomerData({...customerData, websiteSupport: 'none'})}
className={`cursor-pointer p-6 rounded-xl border-2 transition-all ${
customerData.websiteSupport === 'none'
? 'border-[#6d0202] bg-gradient-to-br from-red-900/30 to-red-800/20 shadow-lg shadow-red-900/30'
: 'border-gray-600 bg-gray-700 hover:border-gray-500'
}`}
>
{customerData.websiteSupport === 'none' && }
b) Keine Betreuung
In diesem Fall werden technische Anpassungen und Support auf Stundenbasis gem.
Preisverzeichnis berechnet (129,00 € netto pro Stunde).
setStep(2)}
className="flex-1 bg-gray-700 hover:bg-gray-600 text-white px-6 py-4 rounded-lg font-semibold transition-all"
>
Zurück
setStep(4)}
disabled={!customerData.websiteSupport}
className="flex-1 bg-gradient-to-r from-[#6d0202] to-[#9d0303] text-white px-6 py-4 rounded-lg font-semibold hover:shadow-lg hover:shadow-red-900/50 transition-all disabled:opacity-50 disabled:cursor-not-allowed"
>
Weiter
)}
{/* Step 4: Hosting Option */}
{step === 4 && (
§ 5 Hosting- und Betriebsgebühren
Wichtige Informationen:
Für monatlich abgerechnete Hostinggebühren ist ein gültiges SEPA-Lastschriftmandat verpflichtend
Zu Beginn startet das Hosting als monatliches Abo per Überweisung
Spätestens zwei Monate nach Vertragsschluss wird ein SEPA-Mandat benötigt
Ohne SEPA-Mandat erfolgt automatisch die Umstellung auf jährliche Abrechnung
Bitte wählen Sie Ihre Hosting-Option:
setCustomerData({...customerData, hostingOption: '1-month'})}
className={`cursor-pointer p-6 rounded-xl border-2 transition-all ${
customerData.hostingOption === '1-month'
? 'border-[#6d0202] bg-gradient-to-br from-red-900/30 to-red-800/20 shadow-lg shadow-red-900/30'
: 'border-gray-600 bg-gray-700 hover:border-gray-500'
}`}
>
{customerData.hostingOption === '1-month' && }
1 Monat Laufzeit
25,00 €
pro Monat
• Monatlich, im Voraus
• 14 Tage Kündigungsfrist
setCustomerData({...customerData, hostingOption: '1-year'})}
className={`cursor-pointer p-6 rounded-xl border-2 transition-all ${
customerData.hostingOption === '1-year'
? 'border-[#6d0202] bg-gradient-to-br from-red-900/30 to-red-800/20 shadow-lg shadow-red-900/30'
: 'border-gray-600 bg-gray-700 hover:border-gray-500'
}`}
>
{customerData.hostingOption === '1-year' && }
1 Jahr Laufzeit
BELIEBT
21,00 €
pro Monat
16% Ersparnis
• Jährlich, im Voraus
• 1 Monat Kündigungsfrist
setCustomerData({...customerData, hostingOption: '2-years'})}
className={`cursor-pointer p-6 rounded-xl border-2 transition-all ${
customerData.hostingOption === '2-years'
? 'border-[#6d0202] bg-gradient-to-br from-red-900/30 to-red-800/20 shadow-lg shadow-red-900/30'
: 'border-gray-600 bg-gray-700 hover:border-gray-500'
}`}
>
{customerData.hostingOption === '2-years' && }
2 Jahre Laufzeit
BESTE ERSPARNIS
19,50 €
pro Monat
22% Ersparnis
• Zweijährlich, im Voraus
• 1 Monat Kündigungsfrist
setStep(3)}
className="flex-1 bg-gray-700 hover:bg-gray-600 text-white px-6 py-4 rounded-lg font-semibold transition-all"
>
Zurück
setStep(5)}
disabled={!customerData.hostingOption}
className="flex-1 bg-gradient-to-r from-[#6d0202] to-[#9d0303] text-white px-6 py-4 rounded-lg font-semibold hover:shadow-lg hover:shadow-red-900/50 transition-all disabled:opacity-50 disabled:cursor-not-allowed"
>
Weiter zum Vertrag
)}
{/* Step 5: Contract Content */}
{step === 5 && (
Vertragsinhalte
Webdesign-Vertrag
zwischen {customerData.company} (nachfolgend "Auftraggeber")
und FNO Media (nachfolgend "Auftragnehmer")
§ 1 Vertragsgegenstand
Der Auftragnehmer erstellt für den Auftraggeber eine Website gemäß den vereinbarten Spezifikationen und dem Angebot.
§ 2 Leistungsumfang
Der genaue Leistungsumfang ergibt sich aus dem beigefügten Angebot und umfasst Design, Entwicklung und Implementierung der Website.
§ 3 Vergütung
Die Vergütung richtet sich nach dem beigefügten Angebot. Alle Preise verstehen sich zuzüglich der gesetzlichen Umsatzsteuer.
§ 4 Website-Betreuung
Gewählte Option: {customerData.websiteSupport === 'active' ? 'Aktive Betreuung (79,00 € netto/Monat)' : 'Keine Betreuung'}
§ 5 Hosting
Gewählte Option: {
customerData.hostingOption === '1-month' ? '1 Monat Laufzeit - 25,00 € netto/Monat' :
customerData.hostingOption === '1-year' ? '1 Jahr Laufzeit - 21,00 € netto/Monat' :
'2 Jahre Laufzeit - 19,50 € netto/Monat'
}
§ 6 Urheberrechte
Der Auftragnehmer räumt dem Auftraggeber nach vollständiger Bezahlung ein nicht-exklusives, zeitlich und räumlich unbeschränktes Nutzungsrecht an der erstellten Website ein.
§ 7 Mitwirkungspflichten
Der Auftraggeber stellt alle erforderlichen Inhalte, Texte, Bilder und Zugangsdaten rechtzeitig zur Verfügung.
§ 8 Gewährleistung
Der Auftragnehmer gewährleistet, dass die Website zum Zeitpunkt der Abnahme frei von wesentlichen Mängeln ist.
§ 9 Haftung
Die Haftung richtet sich nach den gesetzlichen Bestimmungen. Bei leicht fahrlässiger Verletzung unwesentlicher Vertragspflichten ist die Haftung ausgeschlossen.
§ 10 Vertragslaufzeit und Kündigung
Der Vertrag wird auf unbestimmte Zeit geschlossen. Die Kündigungsfristen richten sich nach der gewählten Hosting-Option.
§ 11 Datenschutz
Beide Parteien verpflichten sich zur Einhaltung der geltenden Datenschutzbestimmungen, insbesondere der DSGVO.
§ 12 Schlussbestimmungen
Es gilt das Recht der Bundesrepublik Deutschland. Gerichtsstand ist der Sitz des Auftragnehmers.
Bitte lesen Sie den Vertrag sorgfältig durch
Mit Ihrer Unterschrift im nächsten Schritt bestätigen Sie, dass Sie den Vertrag gelesen haben und den Bedingungen zustimmen.
setStep(4)}
className="flex-1 bg-gray-700 hover:bg-gray-600 text-white px-6 py-4 rounded-lg font-semibold transition-all"
>
Zurück
setStep(6)}
className="flex-1 bg-gradient-to-r from-[#6d0202] to-[#9d0303] text-white px-6 py-4 rounded-lg font-semibold hover:shadow-lg hover:shadow-red-900/50 transition-all"
>
Zur Vertragsunterzeichnung
)}
{/* Step 6: Summary before Signature */}
{step === 6 && (
Zusammenfassung Ihrer Auswahl
Unternehmensdaten
Firma
{customerData.company}
Ansprechpartner
{customerData.contactPerson}
Adresse
{customerData.street}, {customerData.postalCode} {customerData.city}
Kontakt
{customerData.email}
{customerData.phone}
Gewählte Optionen
Website-Betreuung
{customerData.websiteSupport === 'active' ? 'Aktive Betreuung (79,00 € netto/Monat)' : 'Keine Betreuung'}
Hosting-Option
{
customerData.hostingOption === '1-month' ? '1 Monat - 25,00 € netto/Monat' :
customerData.hostingOption === '1-year' ? '1 Jahr - 21,00 € netto/Monat' :
'2 Jahre - 19,50 € netto/Monat'
}
Monatliche Gesamtkosten
{
(customerData.websiteSupport === 'active' ? 79 : 0) +
(customerData.hostingOption === '1-month' ? 25 :
customerData.hostingOption === '1-year' ? 21 : 19.50)
},00 € netto
zzgl. gesetzlicher Umsatzsteuer
Wichtiger Hinweis
Im nächsten Schritt werden Sie den Vertrag rechtsverbindlich unterschreiben.
Nach der Unterschrift ist keine Änderung mehr möglich. Bitte prüfen Sie alle Angaben sorgfältig.
setStep(5)}
className="flex-1 bg-gray-700 hover:bg-gray-600 text-white px-6 py-4 rounded-lg font-semibold transition-all"
>
Zurück
setStep(7)}
className="flex-1 bg-gradient-to-r from-[#6d0202] to-[#9d0303] text-white px-6 py-4 rounded-lg font-semibold hover:shadow-lg hover:shadow-red-900/50 transition-all flex items-center justify-center gap-2"
>
Jetzt unterschreiben
)}
{/* Step 7: Signature */}
{step === 7 && (
Vertragsunterzeichnung
Ich, {customerData.contactPerson} , bestätige hiermit im Namen von
{customerData.company} , dass ich den Vertrag vollständig gelesen und verstanden habe
und mit allen Bedingungen einverstanden bin.
Ihre Unterschrift:
Unterschrift löschen und neu zeichnen
Datum und Uhrzeit
{new Date().toLocaleString('de-DE')}
IP-Adresse
{customerData.ipAddress}
Standort
{customerData.location}
Unterzeichner
{customerData.contactPerson}
Rechtsverbindliche Unterschrift
Mit Klick auf "Vertrag abschließen" wird der Vertrag rechtsverbindlich geschlossen.
Eine nachträgliche Änderung ist nicht mehr möglich. Ihre Unterschrift, IP-Adresse und
der Zeitpunkt werden zu rechtlichen Zwecken gespeichert.
setStep(6)}
className="flex-1 bg-gray-700 hover:bg-gray-600 text-white px-6 py-4 rounded-lg font-semibold transition-all"
>
Zurück
Vertrag rechtsverbindlich abschließen
)}
{/* Step 8: Payment Method */}
{step === 8 && (
Vertrag erfolgreich abgeschlossen!
Vielen Dank für Ihr Vertrauen
Zahlungsmethode hinterlegen (Optional)
Sie können jetzt optional eine Zahlungsmethode für die automatische Abrechnung hinterlegen.
Dies können Sie auch später in Ihrem Kundenbereich nachholen.
setPaymentMethod('sepa')}
className={`cursor-pointer p-6 rounded-xl border-2 transition-all ${
paymentMethod === 'sepa'
? 'border-[#6d0202] bg-gradient-to-br from-red-900/30 to-red-800/20'
: 'border-gray-600 bg-gray-700 hover:border-gray-500'
}`}
>
{paymentMethod === 'sepa' && }
SEPA-Lastschrift
Automatische monatliche Abbuchung
setPaymentMethod('card')}
className={`cursor-pointer p-6 rounded-xl border-2 transition-all ${
paymentMethod === 'card'
? 'border-[#6d0202] bg-gradient-to-br from-red-900/30 to-red-800/20'
: 'border-gray-600 bg-gray-700 hover:border-gray-500'
}`}
>
{paymentMethod === 'card' && }
Kreditkarte
Visa, Mastercard, American Express
{paymentMethod === 'sepa' && (
)}
{paymentMethod === 'card' && (
)}
setStep(9)}
className="flex-1 bg-gray-700 hover:bg-gray-600 text-white px-6 py-4 rounded-lg font-semibold transition-all"
>
Später hinterlegen
{paymentMethod && (
setStep(9)}
className="flex-1 bg-gradient-to-r from-[#6d0202] to-[#9d0303] text-white px-6 py-4 rounded-lg font-semibold hover:shadow-lg hover:shadow-red-900/50 transition-all"
>
Zahlungsmethode speichern
)}
)}
{/* Step 9: Final Confirmation */}
{step === 9 && (
Alles erledigt!
Ihr Onboarding wurde erfolgreich abgeschlossen
Was passiert als Nächstes?
1
Vertragsbestätigung per E-Mail
Sie erhalten in Kürze eine E-Mail mit allen Vertragsunterlagen und einer Kopie Ihrer Unterschrift.
2
Projektstart
Unser Team wird sich innerhalb der nächsten 24 Stunden bei Ihnen melden, um die nächsten Schritte zu besprechen.
3
Zugang zum Kundenportal
Sie erhalten Zugangsdaten zu Ihrem persönlichen Kundenportal, wo Sie den Projektstatus jederzeit einsehen können.
Ihre Vertragsdaten
Firma
{customerData.company}
Ansprechpartner
{customerData.contactPerson}
E-Mail
{customerData.email}
Unterschrieben am
{customerData.signatureDate || new Date().toLocaleString('de-DE')}
window.print()}
className="bg-gradient-to-r from-[#6d0202] to-[#9d0303] text-white px-8 py-4 rounded-lg font-semibold hover:shadow-lg hover:shadow-red-900/50 transition-all"
>
Vertragsbestätigung drucken
Bei Fragen erreichen Sie uns unter info@fno-media.de
)}
);
};
export default OnboardingSystem;