Grotti 3.0.0: Aufträge, Wartung, SSE, Ausschuss-Dialog, UI-Umbau.
Migrationen 003–009, Kundaufträge mit Lieferschein, Abräumen mit Urteil, ntfy/Backup/Zeitfenster, Live-Stream und Mobile-Mehr-Menü.
This commit is contained in:
1 parent
0236278929
commit
8e88efc094
45 files changed
+3121
-122
No files matched your search
@@ -0,0 +1,69 @@
|
||||
<!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>
|
||||
Reference in new issue
Block a user