Commit Graph

9 Commits

Author SHA1 Message Date
Erik Thiele
b0e6b1b9f2 JET-Design-Wortmarke im Kopf und auf der Rechnung
Die Logos stammen aus der Shop-Webseite (assets/img/logo). Im Seitenkopf
stehen beide SVG-Varianten im Markup, CSS blendet die zum Theme passende
ein -- der Dark-Mode-Schalter laedt die Seite nicht neu.

Fuer den Rechnungsdruck liegt die Wortmarke zusaetzlich als JPEG bei,
weil fpdf2 kein SVG setzen kann. logo_datei() waehlt aus: hochgeladenes
Logo vor mitgelieferter Marke, Textkopf nur noch als Notnagel.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-08 14:25:52 +02:00
Erik Thiele
1b3ef82db4 Knopf "Neues Projekt" zum Leeren des Arbeitsstands
Bisher liess sich ein neuer Auftrag nur von Hand beginnen: Namen
ueberschreiben, jede Position neu ausfuellen und auf der Rechnungsseite
Kundendaten und Rechnungsnummer leeren. Wurde der letzte Schritt
vergessen, stand der alte Kunde auf der neuen Rechnung.

- POST /projekte/neu setzt nur PROJEKT_FELDER zurueck (Name, Positionen,
  Kundendaten, Rechnungsnummer, Datum auf heute). Betriebswerte wie
  Marge, Stundenlohn, Drucker, Steuer und Firmendaten bleiben.
- GET /projekte liefert zusaetzlich 'ungespeichert'. Der Knopf fragt nur
  nach, wenn der offene Stand wirklich nicht als Projekt gesichert ist.
- Der Vergleich ignoriert 'datum' und 'geaendert', sonst waere ein
  gespeichertes Projekt am naechsten Tag faelschlich "ungespeichert".

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-22 11:59:20 +02:00
Erik Thiele
c42fecacb9 Mehrere Positionen pro Auftrag und Projektverwaltung
Bisher liess sich pro Rechnung nur ein Teil kalkulieren. Ein Objekt aus
mehreren Teilen musste in getrennten Rechnungen abgebildet werden.

Positionen:
- Die Kalkulation arbeitet mit einer Positionsliste statt einem
  Einzelteil. Bezeichnung, Material, Preis/kg, Druckzeit, Arbeitszeit
  und Stueckzahl gelten je Position -- verschiedene Teile nutzen oft
  unterschiedliche Filamente und brauchen unterschiedlich viel Nacharbeit.
- Drucker, Strom, Stundenlohn, Marge und Steuer bleiben auftragsweit.
- Jede Position wird eine eigene Rechnungszeile mit Menge, Einzelpreis
  und Zeilensumme. Bei vielen Positionen bricht das PDF auf weitere
  Seiten um.
- Die Auftragssumme ist die Summe der bereits gerundeten Zeilen, damit
  die Rechnung zeilenweise nachrechenbar bleibt.
- saubere_positionen() normalisiert jede Liste aus Config oder Client
  (Typen, Wertebereiche, Obergrenze 50); es bleibt immer mindestens
  eine Position bestehen.
- Alte Configs mit den Flachfeldern werden in eine einzelne Position
  migriert, die Altfelder entfernt.
- sammlePositionen() liefert null auf Seiten ohne Positionsliste, damit
  ein Tastendruck auf der Einstellungs- oder Rechnungsseite die
  Positionen nicht loescht.

Projekte:
- Benannte Kalkulationen lassen sich speichern und wieder laden,
  Ablage in druckkalkulation_projekte.yaml (ein Mapping fuer alle
  Projekte, Schluessel ist der Projektname).
- Gesichert werden nur PROJEKT_FELDER: Name, Positionen, Kundendaten,
  Rechnungsnummer, Rechnungs- und Leistungsdatum. Betriebswerte gehoeren
  bewusst nicht dazu -- sonst wuerde das Laden eines alten Projekts den
  aktuellen Stundenlohn oder das Steuerregime ueberschreiben.
- Neue Routen: GET /projekte sowie POST /projekte/{speichern,laden,loeschen}.
- Eigenes Lock, gleiche atomare Schreibtechnik wie die Config.
- Ueberschreiben, Laden bei ungespeicherten Aenderungen und Loeschen
  fragen jeweils nach.
- Der offene Autosave-Debounce wird vor dem Speichern durchgedrueckt,
  damit wirklich der aktuelle Stand ins Projekt geht.

Die beiden Teile stehen in einem Commit, weil die Aenderungen in app.py,
script.js und index.html ineinandergreifen und ein aufgetrennter
Zwischenstand nicht als solcher getestet wurde.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-22 11:38:26 +02:00
Erik Thiele
4f3c6763ca Arbeitszeit in die Kalkulationsseite verschoben 2026-07-02 14:35:37 +02:00
Erik Thiele
23d4c180a6 Stromverbrauch/Strompreis in Einstellungen verschoben 2026-07-02 14:31:35 +02:00
Erik Thiele
4eb2c9e71d Einstellungen ausgelagert: eigene Seite für Druckerabschreibung, Arbeitskosten, Gewinnmarge
- Neue /settings-Route mit eigener Seite (Einstellungen für Drucker, Arbeit, Marge)
- Settings-Cards aus index.html entfernt
- /save_config merged mit bestehenden Werten (kein Überschreiben)
- Navigation im Header: Kalkulation ↔ Einstellungen (alle Seiten)
- Port auf 5001 geändert (macOS AirPlay blockiert 5000)
2026-07-02 14:29:03 +02:00
Erik Thiele
44e63c8cd6 Stückzahl in Projektinformationen verschoben 2026-07-02 13:13:43 +02:00
Erik Thiele
0c62e8aa78 Stückzahl-Feld: Formular, Rechnungsvorschau, PDF 2026-07-02 13:10:29 +02:00
Erik Thiele
73631b415d Flask-Web-App statt Tkinter: Live-Berechnung, PDF-Rechnung, Dark Mode, Tabler CSS 2026-06-30 20:46:52 +02:00