OpelToyota

Serviceanfrage

Eines der Service-Angebote für Ihr Fahrzeug zu buchen ist unkompliziert. Einfach das Service-Formular ausfüllen und auf Absenden klicken. Wir kontaktieren Sie und bestätigen die Buchung.

Serviceanfrage

Angaben
Gewünschte Dienstleistungen:
Gewünschte Optionen:
<!DOCTYPE html><html lang="de"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Serviceanfrage</title> <!-- Tailwind CSS laden --> <script src="https://cdn.tailwindcss.com"></script> <style> /* Festlegen der Inter-Schriftart */ body { font-family: 'Inter', sans-serif; background-color: #f3f4f6; /* Heller Hintergrund */ } /* Custom Styles für bessere Lesbarkeit und Interaktion */ .form-label { @apply block text-sm font-medium text-gray-700 mb-1 mt-3; } .form-input, .form-select, .form-textarea { @apply w-full p-3 border border-gray-300 rounded-lg shadow-sm focus:border-indigo-500 focus:ring focus:ring-indigo-200 focus:ring-opacity-50 transition duration-150 ease-in-out; } .checkbox-item { @apply flex items-center p-3 bg-white rounded-lg border border-gray-200 shadow-sm hover:border-indigo-400 transition duration-150 ease-in-out cursor-pointer; } </style></head><body class="p-4 md:p-8"> <div class="max-w-4xl mx-auto bg-white p-6 md:p-10 rounded-xl shadow-2xl"> <header class="mb-8 border-b pb-4"> <h1 class="text-3xl font-extrabold text-gray-900">Serviceanfrage buchen</h1> <p class="mt-2 text-gray-500">Füllen Sie das Formular aus, um uns Ihre Serviceanfrage zu senden. Wir melden uns umgehend bei Ihnen.</p> </header> <form id="serviceForm" onsubmit="handleFormSubmit(event)"> <!-- 1. KUNDENDATEN --> <section class="mb-8"> <h2 class="text-xl font-semibold text-indigo-600 mb-4 border-b pb-2">1. Ihre Kontaktdaten</h2> <div class="grid grid-cols-1 md:grid-cols-2 gap-4"> <div> <label for="firstName" class="form-label">Vorname *</label> <input type="text" id="firstName" name="firstName" class="form-input" required> </div> <div> <label for="lastName" class="form-label">Name *</label> <input type="text" id="lastName" name="lastName" class="form-input" required> </div> </div> <div> <label for="address" class="form-label">Adresse *</label> <input type="text" id="address" name="address" class="form-input" required> </div> <div> <label for="email" class="form-label">E-Mail *</label> <input type="email" id="email" name="email" class="form-input" required> </div> </section> <!-- 2. FAHRZEUGDATEN --> <section class="mb-8"> <h2 class="text-xl font-semibold text-indigo-600 mb-4 border-b pb-2">2. Fahrzeugdetails</h2> <div class="grid grid-cols-1 md:grid-cols-3 gap-4"> <div> <label for="vehicleMake" class="form-label">Marke *</label> <input type="text" id="vehicleMake" name="vehicleMake" class="form-input" required> </div> <div> <label for="vehicleModel" class="form-label">Modell *</label> <input type="text" id="vehicleModel" name="vehicleModel" class="form-input" required> </div> <!-- Text (z.B. AG314314) entfernt --> <div> <label for="licensePlate" class="form-label">Kontrollschild *</label> <input type="text" id="licensePlate" name="licensePlate" class="form-input" required pattern="[A-Z]{2}\s*[0-9]+"> </div> </div> </section> <!-- 3. SERVICE DETAILS --> <section class="mb-8"> <h2 class="text-xl font-semibold text-indigo-600 mb-4 border-b pb-2">3. Service-Details</h2> <!-- Gewünschtes Datum - Hinweis-Text entfernt --> <div> <label for="serviceDate" class="form-label">Gewünschtes Service-Datum *</label> <input type="date" id="serviceDate" name="serviceDate" class="form-input" required onchange="validateDate()"> <p id="dateError" class="text-sm text-red-600 mt-1 hidden"> ⚠️ Dieses Datum ist ungültig. Wir benötigen eine Vorlaufzeit von 3 Tagen und buchen nur von Montag bis Freitag. </p> </div> <!-- Service-Art zu Dienstleistungen geändert und auf Checkboxes umgestellt (Mehrfachauswahl) --> <div class="mt-6"> <label class="form-label !mt-0">Gewünschte Dienstleistungen *</label> <div class="grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 gap-3" role="group"> <label class="checkbox-item"> <input type="checkbox" name="serviceTypes" value="Jahresinspektion" class="text-indigo-600 focus:ring-indigo-500 rounded" onchange="validateServices()"> <span class="ml-3 text-sm font-medium text-gray-700">Jahresinspektion</span> </label> <label class="checkbox-item"> <input type="checkbox" name="serviceTypes" value="Bremsen" class="text-indigo-600 focus:ring-indigo-500 rounded" onchange="validateServices()"> <span class="ml-3 text-sm font-medium text-gray-700">Bremsen</span> </label> <label class="checkbox-item"> <input type="checkbox" name="serviceTypes" value="Pneu-/Radwechsel" class="text-indigo-600 focus:ring-indigo-500 rounded" onchange="validateServices()"> <span class="ml-3 text-sm font-medium text-gray-700">Pneu-/Radwechsel</span> </label> <label class="checkbox-item"> <input type="checkbox" name="serviceTypes" value="Schadenmeldungen" class="text-indigo-600 focus:ring-indigo-500 rounded" onchange="validateServices()"> <span class="ml-3 text-sm font-medium text-gray-700">Schadenmeldungen</span> </label> <label class="checkbox-item"> <input type="checkbox" name="serviceTypes" value="Andere Arbeiten" class="text-indigo-600 focus:ring-indigo-500 rounded" onchange="validateServices()"> <span class="ml-3 text-sm font-medium text-gray-700">Andere Arbeiten</span> </label> </div> <p id="serviceError" class="text-sm text-red-600 mt-1 hidden"> ⚠️ Bitte wählen Sie mindestens eine Dienstleistung aus. </p> </div> </section> <!-- 4. ZUSATZLEISTUNGEN --> <section class="mb-8"> <h2 class="text-xl font-semibold text-indigo-600 mb-4 border-b pb-2">4. Zusatzleistungen</h2> <div class="grid grid-cols-1 sm:grid-cols-2 gap-4"> <label class="checkbox-item"> <input type="checkbox" id="rentalCar" name="extras" value="Ersatzwagen" data-price="50" class="text-indigo-600 focus:ring-indigo-500 rounded"> <span class="ml-3 text-sm font-medium text-gray-700">Ersatzwagen (CHF 50.- / Tag inkl. 100km)</span> </label> <label class="checkbox-item"> <input type="checkbox" id="deluxeWash" name="extras" value="Deluxe-Wäsche" data-price="20" class="text-indigo-600 focus:ring-indigo-500 rounded"> <span class="ml-3 text-sm font-medium text-gray-700">Deluxe-Wäsche (CHF 20.-)</span> </label> <label class="checkbox-item"> <input type="checkbox" id="interiorCleaning" name="extras" value="Innenreinigung" data-price="50" class="text-indigo-600 focus:ring-indigo-500 rounded"> <span class="ml-3 text-sm font-medium text-gray-700">Innenreinigung (CHF 50.-)</span> </label> </div> </section> <!-- Submit Button & Message --> <div class="mt-8 pt-4 border-t"> <button type="submit" id="submitButton" class="w-full py-3 px-4 bg-indigo-600 text-white font-bold text-lg rounded-lg hover:bg-indigo-700 transition duration-200 shadow-md disabled:opacity-50" disabled> Serviceanfrage absenden (Öffnet Ihr E-Mail-Programm) </button> <div id="statusMessage" class="mt-4 p-4 text-center rounded-lg hidden"></div> </div> </form> </div> <script> const DATE_ERROR_MSG = document.getElementById('dateError'); const SERVICE_DATE_INPUT = document.getElementById('serviceDate'); const EXTRAS_CHECKBOXES = document.querySelectorAll('input[name="extras"]'); const SERVICE_CHECKBOXES = document.querySelectorAll('input[name="serviceTypes"]'); const SERVICE_ERROR_MSG = document.getElementById('serviceError'); const SUBMIT_BUTTON = document.getElementById('submitButton'); const STATUS_MESSAGE = document.getElementById('statusMessage'); /** * Setzt das minimale Datum für die Buchung (heute + 3 Tage), wobei Wochenenden übersprungen werden. */ function setMinDate() { const today = new Date(); let minDate = new Date(today); // ÄNDERUNG: Vorlaufzeit auf 3 Tage verkürzt minDate.setDate(today.getDate() + 3); // Stellt sicher, dass das minimale Datum nicht auf ein Wochenende fällt while (minDate.getDay() === 0 || minDate.getDay() === 6) { // 0 = Sonntag, 6 = Samstag minDate.setDate(minDate.getDate() + 1); } // Formatiert das Datum in YYYY-MM-DD const year = minDate.getFullYear(); const month = String(minDate.getMonth() + 1).padStart(2, '0'); const day = String(minDate.getDate()).padStart(2, '0'); const minDateString = `${year}-${month}-${day}`; SERVICE_DATE_INPUT.min = minDateString; } /** * Validiert das ausgewählte Datum auf 3-Tage-Frist und Wochentag (Mo-Fr). * @returns {boolean} True, wenn das Datum gültig ist. */ function validateDate() { // Wenn kein Wert gesetzt ist, ist das Feld per HTML-required ungültig, aber die JS-Prüfung muss warten. if (!SERVICE_DATE_INPUT.value) { return false; } const selectedDate = new Date(SERVICE_DATE_INPUT.value); const today = new Date(); today.setHours(0, 0, 0, 0); // Tagesanfang // 1. Vorlaufzeit prüfen (Verwendet das "min" Attribut) const minAllowedDate = new Date(SERVICE_DATE_INPUT.min); // 2. Wochentag prüfen (0 = Sonntag, 6 = Samstag) const dayOfWeek = selectedDate.getDay(); const isWeekend = (dayOfWeek === 0 || dayOfWeek === 6); let isValid = true; // Prüft, ob das Datum vor dem minimal erlaubten Datum liegt ODER ein Wochenende ist if (selectedDate < minAllowedDate || isWeekend) { DATE_ERROR_MSG.classList.remove('hidden'); SERVICE_DATE_INPUT.classList.add('border-red-500'); isValid = false; } else { DATE_ERROR_MSG.classList.add('hidden'); SERVICE_DATE_INPUT.classList.remove('border-red-500'); } return isValid; } /** * Validiert, ob mindestens eine Dienstleistung ausgewählt wurde. * @returns {boolean} True, wenn mindestens eine Dienstleistung ausgewählt ist. */ function validateServices() { const isServiceSelected = Array.from(SERVICE_CHECKBOXES).some(checkbox => checkbox.checked); if (!isServiceSelected) { SERVICE_ERROR_MSG.classList.remove('hidden'); return false; } else { SERVICE_ERROR_MSG.classList.add('hidden'); return true; } } /** * Kombinierte Validierung aller Felder und Aktivierung/Deaktivierung des Buttons. */ function updateSubmitButtonState() { // checkValidity() prüft HTML5 required Felder (z.B. Textfelder) const isFormValid = document.getElementById('serviceForm').checkValidity() && validateDate() && validateServices(); SUBMIT_BUTTON.disabled = !isFormValid; } // Fügt Event-Listener hinzu, um den Submit-Button-Status bei allen relevanten Änderungen zu aktualisieren SERVICE_DATE_INPUT.addEventListener('change', updateSubmitButtonState); SERVICE_CHECKBOXES.forEach(cb => cb.addEventListener('change', updateSubmitButtonState)); document.getElementById('serviceForm').addEventListener('input', updateSubmitButtonState); // --- Formular-Einreichung und E-Mail-Generierung --- function handleFormSubmit(event) { event.preventDefault(); // Endgültige Validierung if (!validateDate() || !validateServices()) { showStatus('Bitte überprüfen Sie die rot markierten Felder und korrigieren Sie diese.', 'bg-red-100 text-red-700'); return; } const form = document.getElementById('serviceForm'); const formData = new FormData(form); // Sammeln der Daten const customerName = `${formData.get('firstName')} ${formData.get('lastName')}`; const customerEmail = formData.get('email'); const address = formData.get('address'); const serviceDate = formData.get('serviceDate'); const vehicleMake = formData.get('vehicleMake'); const vehicleModel = formData.get('vehicleModel'); const licensePlate = formData.get('licensePlate'); // Sammeln der Dienstleistungen (Mehrfachauswahl) let selectedServices = []; SERVICE_CHECKBOXES.forEach(checkbox => { if (checkbox.checked) { selectedServices.push(checkbox.value); } }); // Sammeln der Extras let totalExtras = 0; let extrasList = []; EXTRAS_CHECKBOXES.forEach(checkbox => { if (checkbox.checked) { const price = parseFloat(checkbox.getAttribute('data-price')); const value = checkbox.value; extrasList.push(`${value} (CHF ${price.toFixed(2)}.-)`); totalExtras += price; } }); // Erstellen des E-Mail-Body-Textes let bodyText = `Sehr geehrte Tinner AG,Ich möchte hiermit eine Serviceanfrage buchen.KUNDENDATEN:Name: ${customerName}Adresse: ${address}E-Mail: ${customerEmail}FAHRZEUGDATEN:Marke: ${vehicleMake}Modell: ${vehicleModel}Kontrollschild: ${licensePlate}GEWÜNSCHTES SERVICE-DATUM:${serviceDate}GEWÄHLTE DIENSTLEISTUNGEN:${selectedServices.join('\n')}ZUSATZLEISTUNGEN:${extrasList.length > 0 ? extrasList.join('\n') : 'Keine Zusatzleistungen gewünscht.'}GESCHÄTZTE ZUSATZKOSTEN (ohne Service):CHF ${totalExtras.toFixed(2)}Ich freue mich auf Ihre Terminbestätigung.Mit freundlichen Grüßen,${customerName}`; // E-Mail-Parameter const recipient = 'info@tinnerag.ch'; const subject = encodeURIComponent(`Serviceanfrage: ${vehicleMake} ${vehicleModel} (${licensePlate})`); const body = encodeURIComponent(bodyText); // Generierung des mailto:-Links const mailtoLink = `mailto:${recipient}?subject=${subject}&body=${body}`; // E-Mail-Programm öffnen window.location.href = mailtoLink; // Statusmeldung anzeigen showStatus('Ihr E-Mail-Programm wurde geöffnet. Bitte senden Sie die Anfrage ab.', 'bg-green-100 text-green-700'); } // --- Hilfsfunktion für Statusmeldungen --- function showStatus(message, className) { STATUS_MESSAGE.textContent = message; STATUS_MESSAGE.className = `mt-4 p-4 text-center rounded-lg ${className}`; STATUS_MESSAGE.classList.remove('hidden'); } // Initialisierung window.onload = () => { setMinDate(); // Stellt sicher, dass der Button-Status beim Laden aktualisiert wird updateSubmitButtonState(); }; </script></body></html>