Erstumsetzung: OAMC Turnierauswertung (AP 0–7, 9)

* Datenmodell + Alembic-Initialmigration (Plan §4), Seed Saison 2026
* Wertungs-Engine (Plan §3.3), regelbasiert je Kategorie/Saison
  - Abnahmetest gegen die Ergebnisliste 2026-05-31
* Meisterschaftsberechnung mit Streichresultaten + Tie-Break
  (PLATZHALTER-Punktetabelle, O-1 offen)
* Ingest-API (idempotent, dry_run) inkl. Excel-Leser und Fahrer-Matching/Merge
* Zeitmessungs-Endpoint (Batch, idempotent, unzugeordnet/unplausibel) + SSE-Anzeige
  - Mess-Pi-Client bewusst NICHT enthalten (docs/zeitmessung-endpoint.md)
* Frontend: öffentliche Seiten + internes Backend (Jinja2/HTMX, kein Build)
* Auslieferung: Docker (multi-arch) + docker-compose sowie Debian-Paket/APT-Repo
* 57 Tests grün gegen echte PostgreSQL-Testdatenbank

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
linus
2026-09-05 18:49:00 +02:00
co-authored by Claude Sonnet 5
commit 03f6fdb0d9
115 changed files with 8041 additions and 0 deletions
@@ -0,0 +1,31 @@
{% extends "base.html" %}
{% block title %}Meisterschaftsstand · {{ projekt }}{% endblock %}
{% block content %}
<h1>Meisterschaftsstand</h1>
<p>Saison {{ bericht.saison_jahr }} · Kategorie {{ bericht.kategorie }} ·
{{ bericht.laeufe_gewertet }} von {{ bericht.laeufe_gesamt }} Läufen gewertet
(Rest = Streichresultate)</p>
{% for h in bericht.hinweise %}
<p class="hinweis">{{ h }}</p>
{% endfor %}
<table>
<thead><tr><th>Platz</th><th>Fahrer</th><th class="num">Punkte</th><th class="num">Siege</th>
<th class="num">Streich­resultate</th></tr></thead>
<tbody>
{% for z in bericht.zeilen %}
{% set f = fahrer_map.get(z.fahrer_id) %}
<tr>
<td>{{ z.platz }}</td>
<td>{% if f %}<a href="/fahrer/{{ f.id }}">{{ f.anzeigename }}</a>{% else %}#{{ z.fahrer_id }}{% endif %}</td>
<td class="num">{{ '%.0f' % z.punkte_gesamt }}</td>
<td class="num">{{ z.anzahl_siege }}</td>
<td class="num">{{ z.gestrichene_laeufe | length }}</td>
</tr>
{% else %}
<tr><td colspan="5">Noch keine gewerteten Läufe.</td></tr>
{% endfor %}
</tbody>
</table>
{% endblock %}