{% extends "base.html" %} {% block title %}Einstellungen{% endblock %} {% block heading %}Einstellungen{% endblock %} {% block content %} {# v1.7.0: Sub-Navigation als rechte sticky Sidebar (vertikal, gruppiert). Active-Section-Highlight beim Scrollen via IntersectionObserver. Wrapper macht 2-Spalten-Layout: Formular links, Sub-Nav rechts. #}
{# Hier kommt das eigentliche Formular — siehe weiter unten #}
{# ---------- 0. ONBOARDING / DEMO-DATEN ---------- #}

👋 Onboarding

Hilfsmittel für neue Nutzer — Demo-Workflow + Handbuch

Demo-Workflow

Erstellt einen kompletten Beispiel-Datensatz: Kunde → Anfrage → Angebot → Auftrag. Damit kannst du den Vertriebs-Workflow durchklicken ohne echte Daten zu verfälschen.


Vor Pilot-Vorführung: erweiterte Pipeline

Erstellt 6 Kunden + 12 Angebote + 8 Aufträge + 6 Rechnungen + 2 Reklamationen über die letzten 90 Tage. Alle mit Suffix „(DEMO-EXT)“.

Handbuch

180-Seiten-PDF mit allen Modulen, Screenshots und Workflow-Erklärungen. Verfügbar in DE / EN / ZH.

Workflow auf einen Blick

📥 Anfrage

💼 Angebot

📋 Auftrag

🏭 Werkstatt-Freigabe

📦 Lieferschein

🧾 Rechnung

{# === BUG-REPORT v1.10.6 === #}

Fehler an Takoma melden

Wenn etwas nicht funktioniert: kurz beschreiben — das System schickt automatisch die letzten 100 Log-Zeilen, DB-Stats und Versions-Info an info@takoma-digital.com. Damit kann der Support direkt fixen ohne dass du Bildschirme aufnehmen musst.

{# ---------- 1. FIRMENDATEN ---------- #}

Firmendaten

Erscheinen auf Bestelldokumenten, Rechnungen und Reports

{% for label, key, span in [ ("Firmenname", "company_name", 2), ("Adresse", "company_adress", 2), ("PLZ", "company_postcode", 1), ("Stadt", "company_city", 1), ("Telefon", "company_phone", 1), ("E-Mail", "company_mail", 1), ("USt-IdNr.", "company_vat_id", 1), ("Handelsregister", "company_registry", 1), ("Bank — IBAN", "company_iban", 1), ("Bank — BIC", "company_bic", 1), ("Steuernummer", "company_tax_no", 1), ("Geschäftsführer", "company_ceo", 1), ] %}
{% endfor %}
{# ---------- 1a. RECHTLICHES / IMPRESSUM ---------- #} {# ---------- 1b. RECHNUNGSSTELLUNG & E-RECHNUNG ---------- #}

Rechnungsstellung & E-Rechnung

Steuerregime, ZUGFeRD-/XRechnung-Default, Zahlungsziel, Mahnstufen

Heimatland für USt-IdNr-Logik / EORI

Bestimmt Reverse-Charge / Export-Verhalten

Pro Kunde überschreibbar

Mahnstufen (Tage nach Fälligkeit)

Erscheint klein unter den Beträgen auf jeder Rechnung — gilt für alle Dokument-Typen wenn unten nichts spezifisches gesetzt ist

{# ---------- 1d. UPDATE-MANAGER (Status + manueller Check) ---------- #}

Software-Updates

Auto-Check alle 24 Stunden — manueller Re-Check jederzeit möglich

Aktuelle Version
Verfügbare Version
Status
Letzter Check
Release-Notes
{# ---------- 1c. IMAP-AUTO-ANFRAGEN (Webformular → Anfrage) ---------- #}

Webformular-Auto-Lesen (IMAP)

Ungelesene Mails werden automatisch zu Anfragen — alle 10 Minuten geprüft

Default 10 — Schutz vor Server-Banhammer: minimum 1

Leer = alle ungelesenen Mails — sonst nur Mails mit diesem Subject-Pattern


IMAP-Server-Zugangsdaten (z. B. STRATO, IONOS, eigener Mail-Server)

993 für IMAPS (verschlüsselt)

Standard: INBOX

Wird als Plaintext gespeichert (Pilot-Phase). Leer lassen behält den aktuellen Wert.

{# ----- IMAP-Statistik unten ----- #}
{# ---------- 1b. PDF-LAYOUT-ANPASSUNGEN (Brand-Farben + Doc-spezifische Footer) ---------- #}

PDF-Layout & Brand-Farben

Anpassbare Farben und Footer-Texte pro Dokument-Typ

{# ----- Brand-Farben ----- #}

Hex ohne # — z. B. E85D2F

z. B. Brand-Blau, RGB-Hex

Default: #1a1a1a (fast schwarz)

{# ----- Layout-Stil + Logo-Optionen ----- #}
{# ----- v1.7.0: Logo + Briefpapier (Drag&Drop) + Live-Beleg-Vorschau ----- #}

Branding & Beleg-Vorschau (Drag & Drop)

{# v1.18.0: Demo-Briefpapier-Warnung. Sichtbar solange der Kunde noch nicht sein eigenes Briefpapier hochgeladen hat. #} {% if letterhead_is_demo %}
DEMO
Aktuell ist das mitgelieferte Demo-Briefpapier aktiv. Belege werden mit „Beispiel GmbH"-Footer generiert. Lade dein eigenes Briefpapier (einseitiges PDF, A4) hoch, sonst erscheint dieser Platzhalter auf jeder Rechnung an deine Kunden.
{% endif %} {# Logo + Briefpapier-Quick-Upload als 2-Spalten-Block (oben). Beide sind Drag&Drop UND Click-zum-Upload. Der untere Bereich zeigt die Live-Beleg-Vorschau. #}
{% if settings.get('pdf_logo_path') %} Logo
Klicken zum Ersetzen ·
{% else %}
📎 Firmenlogo hochladen
PNG / JPG / SVG · max. 2 MB
{% endif %}
{% if has_letterhead %}
{% if letterhead_is_demo %} Demo-Briefpapier aktiv {% else %} Eigenes Briefpapier aktiv {% endif %}
Klicken zum {% if letterhead_is_demo %}Hochladen{% else %}Ersetzen{% endif %} ·
{% else %}
📄 Briefpapier hochladen
PDF einseitig · max. 5 MB
{% endif %}
{% if has_letterhead %}{% if letterhead_is_demo %}🟡 Vorschau mit Demo-Briefpapier{% else %}🟢 Vorschau mit Briefpapier{% endif %}{% else %}⚪ Vorschau ohne Briefpapier{% endif %}
Live-Vorschau eines Beispiel-Belegs — aktualisiert sich automatisch wenn du Farben, Layout oder Logo-Position oben änderst (kein Speichern nötig).
{# ----- Doc-spezifische Footer ----- #}

Footer-Texte pro Dokument-Typ (überschreiben Standard-Fußnote oben)

{# ---------- 2. GLOBALE EINSTELLUNGEN ---------- #}

Globale Einstellungen

Sprache, Währung, Formate

{# ---------- 3. BELEGNUMMERN ---------- #}

Belegnummern

Format und Zähler je Belegart — Variablen: {YYYY} Jahr · {MM} Monat · #### Counter

{% for label, key in [ ("Bestellung", "ordernum_order"), ("Werkzeugausgabe", "ordernum_rental"), ("Wareneingang", "ordernum_receipt"), ("Lieferschein", "ordernum_delivery"), ("Inventur", "ordernum_inventory"), ] %} {% endfor %}
BelegartFormatNächste NummerZurücksetzen
{{ label }}
{# ---------- 3a. KALKULATION — Stundensätze + Faktoren ---------- #}
{# Schließen das outer settings-form, damit die Calc-Sektion eigenes form hat #}

Kalkulation

Stundensätze pro Bearbeitungs-Schritt + globale Faktoren (Material, Gemeinkosten)

Greift, wenn ein Schritt unten keinen eigenen Satz hat

Aufschlag auf Einkaufspreis → Plan (z.B. 1,15 = +15 %)

Wird in der Nachkalkulation auf die Stundenkosten gerechnet

Stundensätze pro Bearbeitungs-Schritt

{% for s in process_steps %} {% endfor %}
Schritt Code Stundensatz (€/h) Hinweis
{{ s.name }} {{ s.code }} {% if s.hourly_rate is none %}— Default-Satz wird genutzt{% else %}eigener Satz aktiv{% endif %}

Leeres Feld = Default-Stundensatz greift. Änderungen werden beim Verlassen des Felds automatisch gespeichert.

{# Outer settings-form fortsetzen #} {# ---------- 3b. WERKZEUG-WOCHENBUDGET ---------- #}

Werkzeug-Wochenbudget

Maximale Werkzeug- und Verbrauchsmaterial-Kosten pro Woche — wird live im Dashboard angezeigt

{% set budget_val = settings.get('weekly_tool_budget', '500')|float if settings.get('weekly_tool_budget') else 500 %} {{ "{:,.0f}".format(budget_val).replace(",", ".") }} €
0 € 2.000 € 4.000 € 6.000 € 8.000 € 10.000 €
— max. 10.000 € · wird in Dashboard und Auswertungen berücksichtigt
{# ---------- 4. BESTAND & BESCHAFFUNG ---------- #}

Bestand & Beschaffung

Default-Werte für neue Artikel und automatische Bestellauslösung

{# ---------- v1.12.1: Erweiterte Features (Feature-Toggles) ---------- #}

Erweiterte Features · v1.12.1

Optionale Workflows ein-/ausschalten — bleibt persistent in den Settings

{# Feature 1: BOM-Kostenkalkulation mit Zukaufteilen #}
Zukaufteile in BOM-Kostenkalkulation einrechnen
Wenn aktiv, wird der Lieferanten-Einkaufspreis aller Zukaufteile (Schrauben, Lager, Dichtungen) zur Selbstkosten-Summe der Baugruppe addiert. Sonst werden Zukaufteile nur für den Lagerabzug erfasst, fließen aber nicht in den Stück-Preis ein.
Wirkt sofort auf alle BOM-Anzeigen (/items/<id>/bom)
{# Feature 2: Live-Verfügbarkeits-Check im Angebots-Formular #}
Live-Verfügbarkeits-Check im Angebots-Formular
Bei Auswahl eines Kundenteils im Angebot wird sofort geprüft, ob Lager + Produktion reichen. Bei Defizit erscheint Warnung + "+ Fertigungsauftrag" Quick-Action. Gleiches Verhalten wie im Auftrags-Formular.
Wirkt auf /quotes/new
{# Feature 3: Zukaufteile in BOM-Print #}
Zukaufteile im BOM-Print (PDF) anzeigen
Die druckbare Stückliste enthält dann eine zusätzliche Sektion "Zukaufteile / Normalien" mit Norm, Hersteller-Nr und Mengen — nützlich für die Werkstatt oder zum Beilegen ans Angebot.
Wirkt auf /items/<id>/bom/print
{# v1.12.2 Feature 5: Angebots-Follow-up #}
Angebots-Follow-up Erinnerungs-Mails
Wenn aktiv: täglich um 9:00 Uhr werden Angebote mit Status „gesendet" geprüft. Nach 7 Tagen ohne Antwort → höfliche Nachfrage-Mail (Level 1). Nach 14 Tagen → freundliche 2. Nachfrage (Level 2). Idempotent — jedes Level wird max. 1× pro Angebot versendet.
Voraussetzung: SMTP konfiguriert + Kunden-Email vorhanden
{# v1.12.2 Feature 6: Auto-Lieferschein-Entwurf #}
Auto-Lieferschein-Entwurf wenn versandbereit
Wenn alle Positionen eines Auftrags fertig produziert sind UND der Lagerbestand der Kundenteile die Bestellmenge deckt, wird automatisch ein Lieferschein-Entwurf erzeugt. Du musst nur noch bestätigen + verschicken. Idempotent: pro Auftrag max. 1 Auto-Entwurf, dann sperrt der Marker `auto_dn_created_at`.
Trigger: bei jedem Fertigungs-Job-Done eines Kundenteils
{# v1.12.2 Feature 7: EDI-Auto-Auftragsanlage #}
EDI-Auto-Auftragsanlage (Bosch, VDA, Fischer-JSON)
Eingehende EDI-Bestellungen werden geprüft: ist der Sender als Kunde im Stamm UND sind alle Artikel im Stamm vorhanden? → 1-Klick „Als Auftrag übernehmen" Button in der EDI-Inbox. Status der EDI-Nachricht wechselt auf converted. Bei fehlenden Artikeln → Hinweis mit Liste der zu ergänzenden SKUs.
EDI-Inbox: /edi
{# Feature 4: Tägliche Sammelbestellungs-Mail #}
Tägliche Sammelbestellungs-Email (08:00 Uhr)
Wenn aktiv: täglich um 8 Uhr prüft der Scheduler welche Normalien unter Mindestbestand sind. Falls ja, wird eine HTML-Mail mit der konsolidierten Liste pro Lieferant an die Einkaufs-Adresse versendet (siehe Feld unten). Standard: aus (SMTP-Setup erforderlich).

Speichern via "Einstellungen speichern" Button am Seitenende

{# ---------- 4b. PERSONAL / HR ---------- #}

Personal / HR — Defaults & globale Regeln

Vorbelegungen für neue Mitarbeiter · individuelle Werte pro Person bearbeiten

Bestehende Mitarbeiter individuell anpassen

Wenn ein Mitarbeiter nachverhandelt (z.B. mehr Urlaubstage, andere Wochenstunden, Position-Wechsel), erfolgt das pro Person in der Personalakte:
Team & Maschinen → Mitarbeiter wählen → "Akte" — dort lassen sich Jahresurlaub, Wochenstunden, Eintrittsdatum, Position, Arbeitsverhältnis und Notizen einzeln überschreiben.

Die Werte hier in den Settings sind nur Vorlage für neu angelegte Mitarbeiter — bestehende werden nicht überschrieben.

Wird beim Anlegen neuer Mitarbeiter vorbelegt

Werden bei der Werktag-Zählung im Urlaubsantrag abgezogen

{# ---------- 4c. FORMULAR-VERWALTUNG (Messprotokolle) ---------- #}

Formular-Verwaltung — Messprotokolle

Vorlagen für Bauteil-Messungen mit Soll-Werten und Toleranzen

Mess-Vorlagen definieren welche Maße bei einem Bauteil gemessen werden, mit Soll-Wert, Toleranz oben/unten und Einheit. Daraus werden bei der Erfassung automatisch i.O. / n.i.O.-Bewertungen erzeugt.

Bestehende Vorlagen lassen sich dort bearbeiten oder löschen — Messungen werden direkt aus dem Bereich erfasst.

{# ---------- 5. KALIBRIERUNG & PRÜFMITTEL ---------- #}

Kalibrierung & Prüfmittel

DGUV V3, ISO 9001, Messmittel-Überwachung

{# ---------- 6. E-MAIL-TEMPLATES ---------- #}

E-Mail-Templates

Platzhalter: {{ '{{user}}' }} · {{ '{{tool}}' }} · {{ '{{order}}' }} · {{ '{{date}}' }} · {{ '{{company}}' }}

{% for label, key, default in [ ("Werkzeugausgabe-Bestätigung", "tpl_rental_confirm", "Hallo {{user}},\n\nwir bestätigen die Ausleihe von {{tool}}.\n\nViele Grüße,\n{{company}}"), ("Rückgabe-Erinnerung", "tpl_return_reminder", "Hallo {{user}},\n\nbitte denken Sie an die Rückgabe von {{tool}}.\n\nViele Grüße,\n{{company}}"), ("Mahnung Werkzeug überfällig", "tpl_overdue", "Hallo {{user}},\n\n{{tool}} ist seit {{date}} überfällig.\n\nViele Grüße,\n{{company}}"), ("Bestand-Warnung an Lager", "tpl_stock_warning", "Mindestbestand für {{tool}} unterschritten."), ("Bestellbestätigung an Lieferant", "tpl_order_to_vendor", "Sehr geehrte Damen und Herren,\n\nim Anhang unsere Bestellung {{order}}.\n\nMit freundlichen Grüßen\n{{company}}"), ] %}
{% endfor %}
{# ---------- 7. PDF-VORLAGE ---------- #}

PDF-Vorlage

Layout für Bestellungen, Lieferscheine und Rechnungen

{# ---------- 8. SMTP / E-MAIL-VERSAND ---------- #}

E-Mail-Versand (SMTP)

Postausgangsserver für automatische Mails

Verbindung testen

{% set mail_flag = request.query_params.get('mail') %} {% if mail_flag == 'ok' %}

✓ Test-Mail erfolgreich versendet

{{ request.query_params.get('info', '')[:200] }}

{% elif mail_flag == 'fail' %}

✗ Versand fehlgeschlagen

{{ request.query_params.get('info', '')[:200] }}

{% endif %}

Status: {% if mail_configured %}SMTP konfiguriert{% else %}SMTP nicht konfiguriert — oben Host + Absender eintragen + speichern{% endif %}

Speichert alle SMTP-Felder oben & sendet sofort eine Test-Mail.

{# ---------- 8b. MAIL-LOG ---------- #} {% if mail_log %}

Mail-Versand-Log

Letzte {{ mail_log|length }} Versandversuche (Audit-Trail)

{% for m in mail_log %} {% endfor %}
ZeitStatusEmpfängerBetreffInfo
{{ m.created_at[:16] }} {% if m.ok %}OK {% else %}Fehler{% endif %} {{ m.recipients }} {{ m.subject }} {{ m.info }}
{% endif %} {# ---------- 9. BENACHRICHTIGUNGEN ---------- #}

Benachrichtigungen

Wer wird wann informiert

Tägliche Reminder-Mail

Einmal pro Tag eine Sammelmail mit überfälligen Prüfungen, ablaufenden Zertifikaten und fälliger Inventur.

{# ---------- 10. KIOSK / SHOPFLOOR-MODUS ---------- #}

Kiosk-Modus (Shopfloor-Terminal)

Vereinfachtes UI für Werkstatt-Tablet oder Touchscreen

{# ---------- 10.5 SICHERHEIT (2FA + Passwort-Policy + Rate-Limit) ---------- #}

Sicherheit

Zwei-Faktor-Authentifizierung · Passwort-Policy · Login-Rate-Limit

Zwei-Faktor-Authentifizierung (TOTP)

Empfehlung für alle Konten mit Zugriff auf Rechnungen oder Stammdaten.

2FA verwalten

Aktive Sitzungen

„Wo bin ich überall eingeloggt?" — bei Verlust eines Geräts alle Sessions auf einmal beenden.

Sitzungen ansehen

AGB & Lizenzbedingungen

Aktuelle Version + Akzeptanz-Status (welche Version wurde beim Setup akzeptiert).

AGB ansehen

SSO via OpenID Connect

Wenn aktiviert: User mit E-Mail-Match im OIDC-Provider können sich ohne Passwort einloggen. Login via /sso/login.

Workflow-Regeln

Trigger-Aktion-Regeln (z.B. „Rechnung 14 T überfällig → Mahnung 1 + Mail").

Workflows verwalten

EZB-Tageskurse

Mehrwährungs-Support — Konvertierung anhand der EZB-Daily-Rates.

Währungen ansehen

Passwort-Policy

Wird bei „Passwort ändern" geprüft. Greift nicht in bestehende Passwörter ein.

Login-Rate-Limit

Nach N Fehlversuchen wird das Konto temporär gesperrt — schützt gegen Brute-Force.

{# ---------- 11. AUDIT-LOG ---------- #}

Audit-Log

Wer hat wann was geändert — Compliance, Diebstahlschutz

{# ---------- 12. DATENSICHERUNG ---------- #}

Datensicherung

Vollständigen Snapshot der unified.db herunterladen oder Auto-Backup einrichten

{# ---------- 13. CNC-MASCHINEN-ANBINDUNG ---------- #}

Maschinen-Anbindung (CNC-Steuerungen)

DMG Mori, Hwacheon, Mazak, Hermle — mit Fanuc / Siemens SINUMERIK / Heidenhain TNC

Per-Maschine konfigurieren

IP-Adresse, Steuerungs-Modell und Protokoll-Endpoint einzeln je Maschine in Team & Maschinen → Maschine bearbeiten setzen.

{# ---------- 14. REST-API & EXPORTE ---------- #}

REST-API & Daten-Exporte

Externe Tools anbinden — Scanner-Apps, DATEV, BI-Tools

{# ---------- INBOUND WEBHOOKS für Webformular / E-Mail-Bot ---------- #}

Inbound-Webhooks

Externe Systeme (Webformular, E-Mail-Parser) können Anfragen und Bestellungen direkt einliefern. Authentifizierung über den API-Token oben.

▸ Anfrage einliefern (mit Artikel-Positionen + Zeichnungen)
curl -X POST {{ request.base_url|string|trim('/') }}/api/inbound/inquiry \
  -H "Authorization: Bearer {{ settings.get('api_token', 'YOUR_TOKEN') }}" \
  -H "Content-Type: application/json" \
  -d '{
    "customer": {
      "name": "Schmid Werkzeugbau GmbH",
      "email": "einkauf@schmid-wzb.at",
      "country_iso": "AT",
      "vat_id": "ATU99887766"
    },
    "subject": "Anfrage Drehteile Stahl 1.4571",
    "body": "Hallo Takoma, wir benötigen 50 Stk nach Zg-4711.",
    "source": "web",
    "items": [
      {"description": "Drehteil Zg-4711", "qty": 50, "unit": "Stk", "item_code": "ZG-4711"}
    ],
    "attachments": [
      {"filename": "zeichnung.pdf", "url": "https://kunde.de/files/zeichnung.pdf"}
    ]
  }'
▸ Bestellung direkt als Auftrag anlegen
curl -X POST {{ request.base_url|string|trim('/') }}/api/inbound/order \
  -H "Authorization: Bearer {{ settings.get('api_token', 'YOUR_TOKEN') }}" \
  -H "Content-Type: application/json" \
  -d '{
    "customer": {"name": "Beispiel GmbH", "email": "einkauf@beispiel.de"},
    "customer_reference": "PO-12345",
    "due_date": "2026-06-15",
    "priority": "high",
    "lines": [
      {"description": "Spannfutter SK40", "qty": 4, "unit": "Stk", "unit_price": 185.00},
      {"description": "Programmieren CNC", "qty": 12, "unit": "h", "unit_price": 68.50, "discount_pct": 5}
    ]
  }'

Kunden-Matching: System sucht zuerst nach USt-IdNr, dann E-Mail, dann Name+PLZ. Wenn nichts passt, wird ein neuer Kundendatensatz angelegt (B2B, ZUGFeRD-Format, 14 T Zahlungsziel).
Anhänge: Entweder als url (System lädt sie selbst, max. 8 MB) oder content_base64 inline.
Auftrags-Erstellung: Status wird auf confirmed gesetzt — du siehst den neuen Auftrag sofort im To-Do und in der Auftrags-Liste, kannst Stückzahl/Liefertermin nachjustieren.

{# ---------- BERECHTIGUNGEN / LEVEL — eigenes Form mit eigenem POST ---------- #}

Berechtigungen je Level

Wer darf was am Programm und in den Einstellungen ändern — Häkchen setzen, dann speichern

{% if request.query_params.get('perms') == 'saved' %}

✓ Berechtigungen gespeichert

{% endif %}
{% for r in all_roles %} {% endfor %} {% for group, perms in perm_groups %} {% for code, label in perms %} {% for r in all_roles %} {% endfor %} {% endfor %} {% endfor %}
Berechtigung{{ r.name }}
{{ group }}
{{ label }}
{{ code }}

Default-Vorschlag: Administrator = alles · Werkstattleiter = Operativ & Personal · Maschinenbediener = Werkstatt-Aktionen · Auszubildender = nur Verleih

{# / .settings-form-col #}
{# / .settings-layout #} {% endblock %}