diff --git a/backend/src/tools/kalkulator3d/routes.js b/backend/src/tools/kalkulator3d/routes.js index 1466324..fc6eb1f 100644 --- a/backend/src/tools/kalkulator3d/routes.js +++ b/backend/src/tools/kalkulator3d/routes.js @@ -5,7 +5,27 @@ const { authenticate } = require('../../middleware/auth'); const router = express.Router(); router.get('/', authenticate, (req, res) => { - res.json(db.prepare('SELECT * FROM calculations WHERE user_id=? ORDER BY created_at DESC').all(req.user.id)); + const uid = req.user.id; + const items = db.prepare('SELECT * FROM calculations WHERE user_id=? ORDER BY created_at DESC').all(uid); + + // Prüfen welche Modelle Dateien haben: Unterordner von "3D-Modelle" mit Dateien + const baseFolder = db.prepare( + "SELECT id FROM folders WHERE user_id=? AND name='3D-Modelle' AND parent_id IS NULL" + ).get(uid); + + let filesMap = {}; + if (baseFolder) { + const rows = db.prepare(` + SELECT f.name, COUNT(fi.id) AS cnt + FROM folders f + LEFT JOIN files fi ON fi.folder_id = f.id + WHERE f.parent_id = ? AND f.user_id = ? + GROUP BY f.id + `).all(baseFolder.id, uid); + for (const r of rows) filesMap[r.name] = r.cnt > 0; + } + + res.json(items.map(i => ({ ...i, has_files: !!filesMap[i.name] }))); }); router.post('/', authenticate, (req, res) => { diff --git a/frontend/src/tools/bestellungen.jsx b/frontend/src/tools/bestellungen.jsx index 50f1aec..13c1d0a 100644 --- a/frontend/src/tools/bestellungen.jsx +++ b/frontend/src/tools/bestellungen.jsx @@ -375,15 +375,25 @@ function BestellungDetail({ id, toast, onBack }) {
GESAMTSUMME
- {PREISE.map(p=>( -
-
{p.emoji}
-
{p.label}
-
- {totals[p.key].toFixed(2)}€ + {PREISE.map(p=>{ + const canSelect = !order.bezahlt && order.custom_price == null && !totals.has_any_custom; + return ( +
canSelect && api(`/tools/bestellungen/${id}`,{method:'PUT',body:{custom_price:totals[p.key]}}).then(u=>{setOrder(u);setForm(f=>({...f,custom_price:totals[p.key].toFixed(2)}));toast(`${p.label}-Preis übernommen`);}).catch(e=>toast(e.message,'error'))} + title={canSelect ? `${p.label}-Preis als Festpreis übernehmen` : undefined} + style={{background:`${p.c}10`,border:`1px solid ${p.c}30`,borderRadius:9,padding:'10px 8px',textAlign:'center', + cursor:canSelect?'pointer':'default', + transition:'background 0.15s', + ...(canSelect?{':hover':{background:`${p.c}20`}}:{})}}> +
{p.emoji}
+
{p.label}
+
+ {totals[p.key].toFixed(2)}€ +
+ {canSelect &&
↑ übernehmen
}
-
- ))} + ); + })}
{totals.has_any_custom && (
diff --git a/frontend/src/tools/kalkulator3d.jsx b/frontend/src/tools/kalkulator3d.jsx index f05c070..b28724f 100644 --- a/frontend/src/tools/kalkulator3d.jsx +++ b/frontend/src/tools/kalkulator3d.jsx @@ -633,7 +633,15 @@ export function SavedList({ toast, mobile }) {
{/* Name + Datum */}
-
{item.name}
+
+
{item.name}
+ {item.has_files && ( + 🖨 Dateien + )} +
{new Date(item.created_at).toLocaleDateString('de-DE')}