Files
3d-druck-kostenkalkulator/index.html
Claude 7507f768a3 feat: MVP 3D-Druck Kostenkalkulator
- Single-Page HTML-App mit allen 18 Eingabefeldern
- 12 Berechnungen live (calc.js, reine Funktionen)
- LocalStorage-Persistenz, Mehrfach-Projekte via Sidebar
- Excel Im-/Export ueber SheetJS (vendored, MIT)
- Drag&Drop + File-Picker-Import
- Apple-Swiss-Styling, responsive
- Vorlagen-Excel mit 3 Reitern (Eingabe/Kalkulation/Angebot), Formeln referenzieren Eingabe
- openpyxl-Script fuer reproduzierbaren Template-Build
- 5 Test-Szenarien validiert

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-23 21:15:25 +02:00

155 lines
6.8 KiB
HTML

<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>3D-Druck Kostenkalkulator</title>
<meta name="description" content="Apple-Swiss minimalistischer Kostenkalkulator fuer 3D-Druck-Auftraege. Lokal, ohne Backend." />
<link rel="stylesheet" href="assets/styles.css" />
</head>
<body>
<div class="app">
<aside class="sidebar" id="sidebar">
<div class="sidebar__header">
<h1 class="logo">3D-Druck<br/><span>Kalkulator</span></h1>
</div>
<div class="sidebar__actions">
<button class="btn btn--primary" id="btn-new">Neues Projekt</button>
</div>
<nav class="projects" id="projects"></nav>
<div class="sidebar__footer">
<small>v0.1 MVP</small>
</div>
</aside>
<main class="main">
<header class="main__header">
<h2 id="current-project-name">Unbenanntes Projekt</h2>
<div class="toolbar">
<button class="btn" id="btn-duplicate">Duplizieren</button>
<button class="btn btn--danger" id="btn-delete">Loeschen</button>
<button class="btn" id="btn-import">Excel Import</button>
<input type="file" id="file-input" accept=".xlsx" hidden />
<button class="btn btn--primary" id="btn-export">Excel Export</button>
</div>
</header>
<div class="dropzone" id="dropzone">
<p>Excel-Datei hier ablegen zum Importieren</p>
</div>
<div class="content">
<section class="section">
<h3>Projekt</h3>
<div class="grid">
<label>Projektname<input type="text" data-field="projectName" /></label>
<label>Kunde / Auftrag<input type="text" data-field="customer" /></label>
</div>
</section>
<section class="section">
<h3>Material</h3>
<div class="grid">
<label>Materialtyp
<select data-field="materialType">
<option value="PLA">PLA</option>
<option value="PETG">PETG</option>
<option value="ABS">ABS</option>
<option value="ASA">ASA</option>
<option value="TPU">TPU</option>
<option value="Resin">Resin</option>
<option value="Sonstiges">Sonstiges</option>
</select>
</label>
<label>Materialkosten (EUR/kg)<input type="number" step="0.01" min="0" data-field="materialCostPerKg" /></label>
<label>Materialverbrauch (g)<input type="number" step="0.1" min="0" data-field="materialUsageG" /></label>
</div>
</section>
<section class="section">
<h3>Maschine &amp; Energie</h3>
<div class="grid">
<label>Druckzeit (h)<input type="number" step="0.01" min="0" data-field="printTimeH" /></label>
<label>Maschinenstundensatz (EUR/h)<input type="number" step="0.01" min="0" data-field="machineRate" /></label>
<label>Stromverbrauch (kWh)<input type="number" step="0.01" min="0" data-field="powerKwh" /></label>
<label>Strompreis (EUR/kWh)<input type="number" step="0.001" min="0" data-field="powerPrice" /></label>
</div>
</section>
<section class="section">
<h3>Nachbearbeitung</h3>
<div class="grid">
<label>Nachbearbeitungszeit (min)<input type="number" step="1" min="0" data-field="postMin" /></label>
<label>Nachbearbeitungs-Stundensatz (EUR/h)<input type="number" step="0.01" min="0" data-field="postRate" /></label>
</div>
</section>
<section class="section">
<h3>Versand &amp; Extras</h3>
<div class="grid">
<label>Verpackungskosten (EUR)<input type="number" step="0.01" min="0" data-field="packagingCost" /></label>
<label>Versandkosten (EUR)<input type="number" step="0.01" min="0" data-field="shippingCost" /></label>
<label>Ruestkosten (EUR)<input type="number" step="0.01" min="0" data-field="setupCost" /></label>
</div>
</section>
<section class="section">
<h3>Kalkulation</h3>
<div class="grid">
<label>Ausschussrisiko (%)<input type="number" step="0.1" min="0" data-field="scrapPct" /></label>
<label>Gewinnaufschlag (%)<input type="number" step="0.1" min="0" data-field="marginPct" /></label>
<label>Stueckzahl<input type="number" step="1" min="1" data-field="quantity" value="1" /></label>
<label>Individueller Zuschlag/Rabatt (EUR)<input type="number" step="0.01" data-field="individualAdjustment" /></label>
<label>MwSt (%)<input type="number" step="0.1" min="0" data-field="vatPct" value="19" /></label>
<label class="full">Notizen<textarea data-field="notes" rows="2"></textarea></label>
</div>
</section>
<section class="result" id="result">
<h3>Ergebnis</h3>
<div class="result__grid">
<div class="result__cell">
<span class="label">Stueckpreis netto</span>
<strong id="r-unitNet">0,00 &euro;</strong>
</div>
<div class="result__cell result__cell--primary">
<span class="label">Stueckpreis brutto</span>
<strong id="r-unitGross">0,00 &euro;</strong>
</div>
<div class="result__cell">
<span class="label">Gesamtpreis brutto</span>
<strong id="r-totalGross">0,00 &euro;</strong>
</div>
<div class="result__cell">
<span class="label">Marge</span>
<strong id="r-margin">0,00 &euro;</strong>
</div>
</div>
<details class="breakdown">
<summary>Detailaufstellung</summary>
<table>
<tbody>
<tr><th>Materialkosten</th><td id="r-c1">0,00 &euro;</td></tr>
<tr><th>Maschinenkosten</th><td id="r-c2">0,00 &euro;</td></tr>
<tr><th>Energiekosten</th><td id="r-c3">0,00 &euro;</td></tr>
<tr><th>Nachbearbeitungskosten</th><td id="r-c4">0,00 &euro;</td></tr>
<tr><th>Gesamtherstellungskosten</th><td id="r-c5">0,00 &euro;</td></tr>
<tr><th>Ausschuss-Zuschlag</th><td id="r-c6">0,00 &euro;</td></tr>
<tr><th>Zwischensumme netto</th><td id="r-c7">0,00 &euro;</td></tr>
<tr><th>Kundenpreis netto</th><td id="r-c9">0,00 &euro;</td></tr>
</tbody>
</table>
</details>
</section>
</div>
</main>
</div>
<script src="assets/xlsx.full.min.js"></script>
<script src="assets/calc.js"></script>
<script src="assets/state.js"></script>
<script src="assets/excel.js"></script>
<script src="assets/app.js"></script>
</body>
</html>