From b66c54ff5774d59f2b525ca83a47925371016cb4 Mon Sep 17 00:00:00 2001 From: florianspengler Date: Mon, 28 Apr 2025 14:42:05 +0200 Subject: [PATCH] reworked bestellformular --- public/bestellformular/bestellformular.html | 235 +++++++++++++++++--- server.js | 77 ++++++- 2 files changed, 270 insertions(+), 42 deletions(-) diff --git a/public/bestellformular/bestellformular.html b/public/bestellformular/bestellformular.html index b3ece7d..793c685 100644 --- a/public/bestellformular/bestellformular.html +++ b/public/bestellformular/bestellformular.html @@ -15,7 +15,7 @@
-
+

Bestellformular

@@ -37,50 +37,221 @@ - +
+ + + +
+
+ Bestellung absenden
+ const payload = { + user_id: parseInt(userData.kundenNr, 10), + produkte: produkte + }; + + try { + const response = await fetch('/api/bestellung', { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify(payload) + }); + + const result = await response.json(); + + if (response.ok) { + // Bestellung erfolgreich -> Weiterleitung + window.location.href = "/bestellung"; + } else { + alert('Fehler: ' + result.message); + } + + } catch (error) { + console.error('Fehler beim Abschicken der Bestellung:', error); + alert('Serverfehler beim Abschicken der Bestellung.'); + } + }); + + // Artikelnummer prüfen bei Eingabe + formular.addEventListener('input', async function (event) { + if (event.target.classList.contains('ArtikelNrText')) { + if (event.target.value.trim() !== '') { + await pruefeVerfuegbarkeit(event.target); + fuegeNeuesArtikelFeldHinzu(); + } + } + }); + }); + + // Funktion: Verfügbarkeit prüfen + async function pruefeVerfuegbarkeit(inputFeld) { + const artikelnummer = inputFeld.value.trim(); + const verfuegbarkeitDiv = inputFeld.parentElement.querySelector('.verfuegbarkeit'); + const sendButton = document.getElementById('sendOrder'); + + if (artikelnummer.length === 0) { + verfuegbarkeitDiv.textContent = ""; + return; + } + + try { + const response = await fetch(`/api/pruefe-artikel?nummer=${encodeURIComponent(artikelnummer)}`); + const data = await response.json(); + + const artikelDivs = document.querySelectorAll('.Artikel'); + artikelVerfuegbarkeiten = []; + + artikelDivs.forEach(div => { + const artikelNrInput = div.querySelector('.ArtikelNrText'); + const verfDiv = div.querySelector('.verfuegbarkeit'); + + if (artikelNrInput.value.trim() !== '') { + if (artikelNrInput === inputFeld) { + if (data.verfuegbar) { + verfDiv.textContent = "Artikel verfügbar."; + verfDiv.style.color = "green"; + artikelVerfuegbarkeiten.push(true); + } else { + verfDiv.textContent = "Artikel nicht verfügbar!"; + verfDiv.style.color = "red"; + artikelVerfuegbarkeiten.push(false); + } + } else { + // Für andere Felder bisherige Anzeige berücksichtigen + if (verfDiv.textContent.includes("nicht verfügbar")) { + artikelVerfuegbarkeiten.push(false); + } else { + artikelVerfuegbarkeiten.push(true); + } + } + } + }); + + // Button sperren/freigeben + if (artikelVerfuegbarkeiten.every(status => status === true)) { + sendButton.disabled = false; + } else { + sendButton.disabled = true; + } + + } catch (error) { + console.error('Fehler bei der Artikelsuche:', error); + verfuegbarkeitDiv.textContent = "Fehler bei der Prüfung."; + verfuegbarkeitDiv.style.color = "orange"; + sendButton.disabled = true; + } + } + + // Funktion: Neues Artikelfeld hinzufügen + function fuegeNeuesArtikelFeldHinzu() { + const formular = document.getElementById('bestellform'); + const artikelnummerFelder = formular.querySelectorAll('.ArtikelNrText'); + const letztesFeld = artikelnummerFelder[artikelnummerFelder.length - 1]; + + if (letztesFeld && letztesFeld.value.trim() !== '') { + const neueArtikelDiv = document.createElement('div'); + neueArtikelDiv.className = 'Artikel'; + neueArtikelDiv.innerHTML = ` + + + +
+ `; + + const sendButton = document.getElementById('sendOrder'); + formular.insertBefore(neueArtikelDiv, sendButton); + } + } + + // Funktion: Artikel löschen + function loescheArtikel(button) { + const artikelDiv = button.parentElement; + artikelDiv.remove(); + } + + diff --git a/server.js b/server.js index 388aba4..45deb27 100644 --- a/server.js +++ b/server.js @@ -169,27 +169,64 @@ app.post('/api/user/login', (req, res) => { }) app.post('/api/bestellung', (req, res) => { + const { user_id, produkte } = req.body; + // produkte erwartet als Array: [{product_id: 1, quantity: 2}, {product_id: 5, quantity: 1}, ...] - const {user_id, product_id} = req.body; + if (!user_id || !Array.isArray(produkte) || produkte.length === 0) { + return res.status(400).json({ message: 'Ungültige Anfrage: user_id oder Produkte fehlen.' }); + } - const sql1 = 'INSERT INTO webshop.order_details (user_id, payment_id, total) VALUES (?, 1, 0)' - const sql2 = 'INSERT INTO webshop.order_items (user_id, product_id, quantity, order_id) VALUES (?, ?, 1, ?)'; + // Preise der Produkte abrufen + const productIds = produkte.map(p => p.product_id); - db.query(sql1, [user_id, 1, 100.00], (err1, result1) => { - if (err1) { - return res.status(500).json({message: 'Fehler beim Erstellen der Bestellung'}); + const priceQuery = 'SELECT id, price FROM webshop.product WHERE id IN (?)'; + db.query(priceQuery, [productIds], (err, priceResults) => { + if (err) { + console.error('Fehler beim Abrufen der Produktpreise:', err); + return res.status(500).json({ message: 'Serverfehler beim Abrufen der Produktpreise.' }); } - db.query(sql2, [user_id, product_id, result1.insertId], (err2, result2) => { - if (err2) { - return res.status(500).json({message: 'Fehler beim Hinzufügen des Produkts zur Bestellung'}); + if (priceResults.length !== productIds.length) { + return res.status(400).json({ message: 'Eines oder mehrere Produkte existieren nicht.' }); + } + + // Total berechnen + let total = 0; + produkte.forEach(p => { + const dbProduct = priceResults.find(pr => pr.id === p.product_id); + if (dbProduct) { + total += dbProduct.price * p.quantity; + } + }); + + const payment_id = 1; // Zahlungssystem-ID (z.B. 1 = Rechnung, 2 = PayPal, ...) + + const sqlOrder = 'INSERT INTO webshop.order_details (user_id, payment_id, total) VALUES (?, ?, ?)'; + db.query(sqlOrder, [user_id, payment_id, total], (err1, result1) => { + if (err1) { + console.error('Fehler beim Erstellen der Bestellung:', err1); + return res.status(500).json({ message: 'Fehler beim Erstellen der Bestellung.' }); } - res.status(201).json({message: 'Produkt bestellt', id: result2.insertId}); + const orderId = result1.insertId; + + const values = produkte.map(p => [user_id, p.product_id, p.quantity, orderId]); + const sqlItems = 'INSERT INTO webshop.order_items (user_id, product_id, quantity, order_id) VALUES ?'; + + db.query(sqlItems, [values], (err2, result2) => { + if (err2) { + console.error('Fehler beim Einfügen der Order-Items:', err2); + return res.status(500).json({ message: 'Fehler beim Hinzufügen der Produkte zur Bestellung.' }); + } + + res.status(201).json({ message: 'Bestellung erfolgreich!', order_id: orderId, total: total.toFixed(2) }); + }); }); }); }); + + app.post('/api/bestellung/daten', (req, res) => { const user_id = req.body; @@ -209,6 +246,26 @@ app.post('/api/bestellung/daten', (req, res) => { }); }); +app.get('/api/pruefe-artikel', (req, res) => { + const artikelnummer = req.query.nummer; + + if (!artikelnummer) { + return res.status(400).json({ error: 'Keine Artikelnummer angegeben.' }); + } + + const query = 'SELECT id FROM product WHERE id = ?'; + + db.query(query, [artikelnummer], (err, results) => { + if (err) { + console.error('Fehler bei der Artikelsuche:', err); + return res.status(500).json({ error: 'Serverfehler bei der Artikelsuche.' }); + } + + const verfuegbar = results.length > 0; + res.json({ verfuegbar }); + }); +}); + const getIndexRoute = require('./scripts/routes/other/route-index'); app.use('/', getIndexRoute);