{% extends "base.html" %} {% block title %}Job {{ job.job_uuid[:8] if job.job_uuid else job.id }} — POPS{% endblock %} {% block content %}
{{ job.file_name or job.name }}
{% set s = job.status.value %} {% if job.priority %}Priority{% endif %} {% if s == 'printing' %}printing {% elif s == 'done' %}done {% elif s == 'failed' %}failed {% elif s == 'cancelled' %}cancelled {% else %}queued {% endif %}
{{ job.job_uuid or '—' }}
{# ── Job actions ── #} {% set s = job.status.value %} {% if s not in ('done', 'cancelled') %}
{% if s == 'queued' %} {% elif s == 'printing' %}
{% endif %}
{% endif %}
{# ── Job info ── #}
Job
{% if job.started_at %} {% endif %} {% if job.finished_at %} {% endif %} {% if job.duration_minutes %} {% endif %} {% if job.cost_eur %} {% endif %} {% if job.notes %} {% endif %}
Customer {{ job.customer or '—' }}
Material {{ job.job_material or '—' }}{% if job.job_color %} · {{ job.job_color }}{% endif %}
Printer {{ job.printer.name if job.printer else '—' }}
Bracket {% if job.bracket %}{{ job.bracket.name }}{% else %}—{% endif %}
Created {{ job.created_at.strftime('%d.%m.%Y %H:%M') }}
Started {{ job.started_at.strftime('%d.%m.%Y %H:%M') }}
Finished {{ job.finished_at.strftime('%d.%m.%Y %H:%M') }}
Duration {{ job.duration_minutes }} min
Cost € {{ "%.2f"|format(job.cost_eur) }}
Notes {{ job.notes }}
{# ── STL geometry ── #}
File & Geometry {% if job.file_name and not file_missing %}
Download {% if not job.file_name.endswith('.gcode') %}
{% endif %}
{% endif %}
{% if job.file_name %}
{{ job.file_name }}
{% endif %} {% if file_missing %}
File {{ job.file_name }} not found on disk.
{% elif analysis_failed %}
Analysis failed or timed out — enter values from your slicer below.
{% elif computing %}
Computing geometry…
{% elif stl %}
Bounding box {{ stl.cube_x|round(1) }} × {{ stl.cube_y|round(1) }} × {{ stl.cube_z|round(1) }} mm
Volume {{ stl.volume_ccm }} cm³ {% if stl.manually_set %}manual{% endif %}
Override values
{% elif job.file_name and job.file_name.endswith('.gcode') %}

Geometry not available for gcode files.

{% elif job.file_name %}

Analysis failed — check file format.

{% else %}

No file attached.

{% endif %}
{# ── Estimate ── #} {% if estimation %}
Estimate {{ (estimation.material_factor * 100) | round | int }}% material factor · {{ estimation.print_speed | int }} g/h · {{ estimation.price_per_kg }} €/kg · {{ estimation.printer_cost_per_hour }} €/h printer · {{ estimation.vat_rate }}% VAT
Material & Time
Volume used {{ estimation.material_ccm }} cm³
Weight {{ estimation.weight_g }} g
Print time {% set h = (estimation.print_minutes // 60) %} {% set m = (estimation.print_minutes % 60) %} {% if h %}{{ h }}h {% endif %}{{ m }}min (est.)
Production cost
Filament {{ "%.2f"|format(estimation.filament_cost) }} €
+ 20 % misprint {{ "%.2f"|format(estimation.filament_cost * 1.2) }} €
Printer ({{ estimation.printer_cost_per_hour }} €/h) {{ "%.2f"|format(estimation.printer_cost) }} €
Suggested price
Net (ex. VAT) {{ "%.2f"|format(estimation.net_price) }} €
Gross ({{ estimation.vat_rate }}% VAT) {{ "%.2f"|format(estimation.gross_price) }} €
{% endif %} {# ── Log ── #}
Log
{% if job.logs %} {% for entry in job.logs %} {% endfor %}
{{ entry.created_at.strftime('%d.%m.%Y %H:%M') }} {{ entry.message }}
{% else %}
No log entries.
{% endif %}
{# ── Edit Job Modal ── #} {# ── Add log entry modal ── #} {# ── Start Job Modal ── #} {% if job.status.value == 'queued' %} {% endif %} {% endblock %}