# 3D-Druck Kostenkalkulator Apple-Swiss-minimalistischer Kostenkalkulator fuer 3D-Druck-Auftraege. Einzeldatei-Browser-App ohne Backend, ohne Build-Step, ohne externe Runtime-Calls. ## Setup / Start Einfach `index.html` im Browser oeffnen: ```bash open index.html ``` Alternativ auf einem beliebigen Webserver hosten (`python3 -m http.server 8000`, dann `http://localhost:8000`). Die App funktioniert offline. Alle Daten liegen im LocalStorage des Browsers. ## Features (MVP) - Single-Page-HTML-App, Vanilla JS, keine Frameworks, kein Build - Alle 18 Eingabefelder laut Spec - Alle 12 Berechnungen live ohne "Berechnen"-Button - Excel-Export (`.xlsx`) ueber SheetJS (vendored) - Excel-Import per Drag&Drop und File-Picker - LocalStorage-Persistenz, mehrere Projekte, Sidebar mit Liste / Neu / Duplizieren / Loeschen - Apple-Swiss-Style (8pt-Raster, system-ui-Font, viel Whitespace, dezente Farben) - Ergebnis-Kachel prominent: Stueckpreis netto + brutto, Gesamt, Marge - Responsive (Desktop / Tablet / Mobile) - Default-Sprache DE - **Mitgelieferte Vorlage:** `templates/3D-Druck-Kostenkalkulator.xlsx` mit Reitern "Eingabe" (Werte), "Kalkulation" (Formeln), "Angebot" (Druck-Ansicht). Formeln referenzieren "Eingabe", sodass Aenderungen live durchschlagen. ## Berechnungslogik 1. Materialkosten = Verbrauch(g) * (Preis/kg / 1000) 2. Maschinenkosten = Druckzeit(h) * Maschinenstundensatz 3. Energiekosten = Druckzeit * Stromverbrauch * Strompreis 4. Nachbearbeitungskosten = (Min/60) * Nachbearb.-Stundensatz 5. Gesamtherstellungskosten = 1+2+3+4 + Ruest + Verpackung + Versand 6. Ausschuss-Zuschlag = 5 * Ausschussrisiko 7. Zwischensumme netto = 5 + 6 8. Marge = 7 * Gewinnaufschlag 9. Kundenpreis netto = 7 + 8 +/- individueller Zuschlag/Rabatt 10. Stueckpreis netto = 9 / Stueckzahl 11. Stueckpreis brutto = 10 * (1 + MwSt) 12. Gesamtpreis brutto = 11 * Stueckzahl 5 Test-Szenarien validiert: siehe `tests/manual-scenarios.md`. ## Dateistruktur ``` . ├── index.html ├── assets/ │ ├── styles.css │ ├── calc.js # 12 Berechnungen, reine Funktionen │ ├── state.js # LocalStorage + Defaults │ ├── excel.js # SheetJS Im-/Export │ ├── app.js # UI-Controller │ └── xlsx.full.min.js # SheetJS Community Edition (MIT), vendored ├── templates/ │ └── 3D-Druck-Kostenkalkulator.xlsx ├── scripts/ │ └── generate-template.py # openpyxl, erzeugt die Vorlage ├── tests/ │ └── manual-scenarios.md └── README.md ``` ## Template neu bauen ```bash python3 -m venv .venv .venv/bin/pip install openpyxl .venv/bin/python scripts/generate-template.py ``` ## Offen fuer Sprint 2 - `.xlsm` mit VBA-Makros (`ImportFromWebApp`, `ExportToAngebot`, `AngebotAlsPdf`, "Historie"-Reiter) - 3 Farb-Varianten (hell / dunkel / Accent) inkl. Theme-Switcher - DE/EN Sprach-Toggle fuer alle Oberflaechen-Texte - Lighthouse-Score-Polish (>= 95 Performance + A11y + Best Practices) - Etsy-Preview-PNGs (1000x1000) - Etsy-Listing-Text DE + EN - Angebots-Druck-Ansicht direkt in der HTML-App (PDF-Export via `window.print`) - Inter-WOFF2-Font vendored (aktuell `system-ui`-Fallback) ## Bekannte Einschraenkungen im MVP - Druckzeit ist im UI als Dezimalstunden eingabbar (nicht als h:m-Picker) - Stromkosten werden aus `Stromverbrauch * Strompreis * Druckzeit` berechnet (keine separaten Fixwert-Eingabe) - Import liest nur den "Eingabe"-Reiter (keine Rekonstruktion aus "Kalkulation") ## Lizenz Proprietaer — Einzelplatz-Lizenz, nicht zur Weiterverbreitung. Etsy-kompatible Lizenz folgt in Sprint 2.