Migrationen 003–009, Kundaufträge mit Lieferschein, Abräumen mit Urteil, ntfy/Backup/Zeitfenster, Live-Stream und Mobile-Mehr-Menü.
70 lines
2.7 KiB
HTML
70 lines
2.7 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="de">
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
<title>{{ title }}</title>
|
|
<style>
|
|
:root { color-scheme: light; }
|
|
* { box-sizing: border-box; }
|
|
body { margin: 0; font: 14px/1.4 "Segoe UI", system-ui, sans-serif; color: #111; background: #f3f3f3; }
|
|
.toolbar { display: flex; gap: 0.6rem; padding: 0.8rem 1rem; background: #1a1a1a; color: #eee; }
|
|
.toolbar a, .toolbar button {
|
|
color: #111; background: #f97316; border: 0; border-radius: 8px;
|
|
padding: 0.4rem 0.85rem; font: inherit; font-weight: 650; text-decoration: none; cursor: pointer;
|
|
}
|
|
.toolbar a.ghost { background: transparent; color: #eee; border: 1px solid #555; }
|
|
.sheet {
|
|
max-width: 210mm; margin: 1.2rem auto; padding: 14mm;
|
|
background: #fff; border: 1px solid #ccc; border-radius: 4px;
|
|
}
|
|
h1 { margin: 0 0 4mm; font-size: 18px; }
|
|
.meta { margin-bottom: 8mm; color: #333; font-size: 13px; }
|
|
table { width: 100%; border-collapse: collapse; font-size: 13px; }
|
|
th, td { border-bottom: 1px solid #ddd; padding: 3mm 2mm; text-align: left; }
|
|
th.num, td.num { text-align: right; font-variant-numeric: tabular-nums; }
|
|
@media print {
|
|
body { background: #fff; }
|
|
.toolbar { display: none; }
|
|
.sheet { margin: 0; border: 0; border-radius: 0; }
|
|
}
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<div class="toolbar">
|
|
<button type="button" onclick="window.print()">Drucken</button>
|
|
<a class="ghost" href="/auftraege">Zurück</a>
|
|
</div>
|
|
<article class="sheet">
|
|
<h1>Lieferschein — Auftrag #{{ order.id }}</h1>
|
|
<div class="meta">
|
|
{% if order.customer %}<p><strong>Kunde:</strong> {{ order.customer.name }}{% if order.customer.email %} · {{ order.customer.email }}{% endif %}</p>{% endif %}
|
|
<p><strong>Titel:</strong> {{ order.title }}</p>
|
|
{% if order.due_at %}<p><strong>Fällig:</strong> {{ order.due_at }}</p>{% endif %}
|
|
<p><strong>Status:</strong> {{ order.status }}</p>
|
|
{% if order.notes %}<p>{{ order.notes }}</p>{% endif %}
|
|
</div>
|
|
<table>
|
|
<thead>
|
|
<tr><th>Position</th><th class="num">Menge</th><th class="num">geliefert</th><th class="num">€/Stk</th></tr>
|
|
</thead>
|
|
<tbody>
|
|
{% for item in order.items %}
|
|
<tr>
|
|
<td>{{ item.file_name or item.note or ('Datei #' ~ item.file_id) }}</td>
|
|
<td class="num">{{ item.qty }}</td>
|
|
<td class="num">{{ item.done_ok }}</td>
|
|
<td class="num">{{ '%.2f'|format(item.unit_price) }}</td>
|
|
</tr>
|
|
{% else %}
|
|
<tr><td colspan="4">Keine Positionen.</td></tr>
|
|
{% endfor %}
|
|
</tbody>
|
|
</table>
|
|
{% if order.progress %}
|
|
<p class="meta" style="margin-top:8mm">Fortschritt gesamt: {{ order.progress.label }}</p>
|
|
{% endif %}
|
|
</article>
|
|
</body>
|
|
</html>
|