{% extends "base.html" %} {% from "_macros.html" import money, pdf_lang_picker %} {% block title %}{{ order.order_no }}{% endblock %} {% block body_data %}data-page-type="sales_order" data-page-id="{{ order.id }}" data-page-label="{{ order.order_no }}" data-page-sub="{{ order.customer_name_snapshot }}"{% endblock %} {% block breadcrumb %}
Aufträge / {{ order.order_no }}
{% endblock %} {% block heading %}{{ order.order_no }} · {{ order.customer_name_snapshot }}{% endblock %} {% block topbar_actions %} {# ---- Status + Priority badges (klein, links) ---- #}Kunde
{{ order.customer_name_snapshot }}
{{ order.customer_country_iso_snapshot or '—' }} {% if order.customer_vat_id_snapshot %}· {{ order.customer_vat_id_snapshot }}{% endif %} {% if not order.is_business_snapshot %}· B2C{% endif %}
{% if order.customer_contact %}{{ order.customer_contact }} · {{ order.customer_email or '—' }}
{% endif %}Belegdaten
Auftragsdatum: {{ order.order_date }}
Liefertermin: {{ order.due_date or '—' }}
{% if order.customer_reference %}Ihre Bestell-Nr.: {{ order.customer_reference }}
{% endif %}Zahlungsziel: {{ order.payment_terms_days }} Tage
Format: {{ order.preferred_invoice_format }}
Abweichende Lieferadresse
{{ order.shipping_address }}
Tags
Interne Notiz
PDF, JPG, PNG, SVG · max. 8 MB
Noch keine Zeichnungen hochgeladen.
{% endif %}{{ lines|length }} {% if lines|length == 1 %}Position{% else %}Positionen{% endif %} · Rechtsklick auf Position öffnet Zeichnung
| # | Beschreibung | Menge | Einh. | Einzelpr. | Rabatt | USt | Netto | |
|---|---|---|---|---|---|---|---|---|
| {{ ln.line_no }} |
{{ ln.description }}
{% if ln.item_ident %}{{ ln.item_ident }} {% endif %}
{% if ln.qty_delivered %}geliefert: {{ "%.0f"|format(ln.qty_delivered) if ln.qty_delivered == ln.qty_delivered|int else "%.2f"|format(ln.qty_delivered) }} {% endif %}
{% if ln.qty_invoiced %}abgerechnet: {{ "%.0f"|format(ln.qty_invoiced) if ln.qty_invoiced == ln.qty_invoiced|int else "%.2f"|format(ln.qty_invoiced) }} {% endif %}
|
{{ "%.0f"|format(ln.qty_ordered) if ln.qty_ordered == ln.qty_ordered|int else "%.2f"|format(ln.qty_ordered) }} | {{ ln.unit }} | {{ money(ln.unit_price) }} | {{ "%.0f"|format(ln.discount_pct) if ln.discount_pct else '—' }}{% if ln.discount_pct %} %{% endif %} | {% if ln.vat_kind == 'eu_b2b_reverse' %}RC {% elif ln.vat_kind == 'export' %}Export {% else %}{{ "%.0f"|format(ln.vat_rate) }} %{% endif %} | {{ money(ln.line_total_net) }} | {% if editable %} {% endif %} |
| Zwischensumme netto | {{ money(order.subtotal_net) }} | |||||||
| USt | {{ money(order.vat_amount) }} | |||||||
| Gesamtbetrag | {{ money(order.total_gross) }} {{ order.currency }} | |||||||
Stundensatz {{ "%.0f"|format(nachkalk.rate) }} €/h {% if nachkalk.inquiry_no or nachkalk.quote_no %} · Plan aus {% if nachkalk.inquiry_no %}{{ nachkalk.inquiry_no }}{% endif %} {% if nachkalk.quote_no %} / {{ nachkalk.quote_no }}{% endif %} {% else %} · Kein Plan hinterlegt — nur Ist-Werte {% endif %}
| Größe | Plan | Ist | Differenz | Abw. % |
|---|---|---|---|---|
| Stunden | {% if nachkalk.has_plan %}{{ "%.1f"|format(nachkalk.planned.hours) }} h{% else %}—{% endif %} | {{ "%.1f"|format(nachkalk.actual.hours) }} h | {% if nachkalk.has_plan %}{% if nachkalk.variance.hours.diff > 0 %}+{% endif %}{{ "%.1f"|format(nachkalk.variance.hours.diff) }} h{% else %}—{% endif %} | {% if nachkalk.variance.hours.pct is not none %}{% if nachkalk.variance.hours.pct > 0 %}+{% endif %}{{ "%.1f"|format(nachkalk.variance.hours.pct) }} %{% else %}—{% endif %} |
| Stunden-Kosten | {% if nachkalk.has_plan %}{{ money(nachkalk.planned.hour_cost) }}{% else %}—{% endif %} | {{ money(nachkalk.actual.hour_cost) }} | {% if nachkalk.has_plan %}{% if nachkalk.variance.hour_cost.diff > 0 %}+{% endif %}{{ money(nachkalk.variance.hour_cost.diff) }}{% else %}—{% endif %} | {% if nachkalk.variance.hour_cost.pct is not none %}{% if nachkalk.variance.hour_cost.pct > 0 %}+{% endif %}{{ "%.1f"|format(nachkalk.variance.hour_cost.pct) }} %{% else %}—{% endif %} |
| Material | {% if nachkalk.has_plan %}{{ money(nachkalk.planned.material) }}{% else %}—{% endif %} | {{ money(nachkalk.actual.material) }} | {% if nachkalk.has_plan %}{% if nachkalk.variance.material.diff > 0 %}+{% endif %}{{ money(nachkalk.variance.material.diff) }}{% else %}—{% endif %} | {% if nachkalk.variance.material.pct is not none %}{% if nachkalk.variance.material.pct > 0 %}+{% endif %}{{ "%.1f"|format(nachkalk.variance.material.pct) }} %{% else %}—{% endif %} |
| Selbstkosten gesamt | {% if nachkalk.has_plan %}{{ money(nachkalk.planned.total) }}{% else %}—{% endif %} | {{ money(nachkalk.actual.total) }} | {% if nachkalk.has_plan %}{% if nachkalk.variance.total.diff > 0 %}+{% endif %}{{ money(nachkalk.variance.total.diff) }}{% else %}—{% endif %} | {% if nachkalk.variance.total.pct is not none %}{% if nachkalk.variance.total.pct > 0 %}+{% endif %}{{ "%.1f"|format(nachkalk.variance.total.pct) }} %{% else %}—{% endif %} |
| Verkaufspreis (netto) | {% if nachkalk.has_plan %}{{ money(nachkalk.planned.price) }}{% else %}—{% endif %} | {{ money(nachkalk.sold) }} | ||
| Marge | {% if nachkalk.has_plan %}{{ money(nachkalk.planned.margin) }}{% else %}—{% endif %} | {{ money(nachkalk.actual.margin) }} | {% if nachkalk.has_plan %}{% if nachkalk.variance.margin.diff > 0 %}+{% endif %}{{ money(nachkalk.variance.margin.diff) }}{% else %}—{% endif %} | {% if nachkalk.variance.margin.pct is not none %}{% if nachkalk.variance.margin.pct > 0 %}+{% endif %}{{ "%.1f"|format(nachkalk.variance.margin.pct) }} %{% else %}—{% endif %} |
Maschine + Rüstplan zuweisen, dann freigeben → Jobs werden im Aktions-Dashboard und Shopfloor sichtbar
| Position | Stk | Maschine | Rüstplan | Smart-Vorschlag |
|---|---|---|---|---|
|
{{ j.item_ident or '—' }}
{% if j.item_description %} {{ j.item_description[:40] }} {% endif %}
Job #{{ j.id }} · {{ j.ident }}
|
{{ j.qty_target }} |
{% if j.suggested_machine_name %}
🤖 {{ j.suggested_machine_name }} ({{ j.suggested_count }}× in History)
{% endif %}
{% if j.suggested_setup_plan_name %}
📋 Plan: {{ j.suggested_setup_plan_name }}
{% endif %}
{% if j.suggested_machine_id or j.suggested_setup_plan_id %}
{% endif %}
|
Verknüpfte Produktionsjobs
| Auftrags-Nr | Maschine | Operator | Fortschritt | Status |
|---|---|---|---|---|
| {{ j.ident }} | {{ j.machine_name or '—' }} | {{ (j.first_name ~ ' ' ~ j.last_name) if j.first_name else '—' }} | {{ j.qty_done }} / {{ j.qty_target }} | {{ j.status }} |
Priorität
Material-Status
{% if order.material_status %}{{ MATERIAL_STATUS_LABELS.get(order.material_status, order.material_status) }}
{% endif %} {% if order.material_note %}{{ order.material_note }}
{% endif %}{{ progress.completed }} / {{ progress.total }} Schritte erledigt
{% else %}Noch kein Routing zugewiesen
{% endif %}Aktuelle Stufe
{{ progress.current_step.step_name }} {{ 'läuft' if progress.current_step.status == 'running' else 'wartet' }}
{{ pct|round(0,'common')|int }} %
{% endif %} {# Graphischer Stage-Flow — alle Stages immer sichtbar #}Pipeline
Routing einem Fertigungsauftrag zuweisen:
{% for j in fa_jobs %} {% endfor %}Aktueller Status
{% set color = STATUS_COLOR.get(order.status, 'neutral') %}{{ STATUS_LABELS.get(order.status, order.status) }}
Erstellt Lieferschein + Rechnung mit allen offenen Mengen.
Alle Positionen sind ausgeliefert.
{% endif %} {% if delivery_notes %}{% if not delivery_notes %}Erst Lieferschein erzeugen, dann Rechnung.{% else %}Alle gelieferten Mengen sind abgerechnet.{% endif %}
{% endif %} {# Anzahlungen — nur sichtbar solange Auftrag offen #} {% if order.status not in ('cancelled', 'paid') %}| Zeit | Aktion | Benutzer | Detail |
|---|---|---|---|
| {{ a.created_at }} | {{ a.action }} | {{ a.user_name or '—' }} |