Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 27 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,33 @@ jobs:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: gh release upload ${{ github.ref_name }} AndiGeneratorNET-${{ steps.version.outputs.version }}-sbom.spdx.json

# Der Abschnitt „## <Version>“ aus CHANGELOG.md wird zum Text des Releases. Fehlt er, bleibt der Text leer.
- name: Release Notes aus CHANGELOG.md
continue-on-error: true
shell: pwsh
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
$version = '${{ steps.version.outputs.version }}'
$zeilen = @(Get-Content CHANGELOG.md -Encoding utf8)
$start = -1
for ($i = 0; $i -lt $zeilen.Count; $i++) {
if ($zeilen[$i] -match ('^## ' + [regex]::Escape($version) + '(\s|$)')) { $start = $i; break }
}
if ($start -lt 0) {
Write-Host "Kein Abschnitt '## $version' in CHANGELOG.md - der Release-Text bleibt leer."
exit 0
}
$ende = $zeilen.Count
for ($i = $start + 1; $i -lt $zeilen.Count; $i++) {
if ($zeilen[$i] -match '^## ') { $ende = $i; break }
}
$text = ''
if ($ende -gt $start + 1) { $text = ($zeilen[($start + 1)..($ende - 1)] -join "`n").Trim() }
$text += "`n`nAlle Änderungen: [CHANGELOG.md](${{ github.server_url }}/${{ github.repository }}/blob/${{ github.ref_name }}/CHANGELOG.md)"
Set-Content -Path release-notes.md -Value $text -Encoding utf8
gh release edit ${{ github.ref_name }} --notes-file release-notes.md

# Linux (Chromebooks mit Linux-Entwicklungsumgebung, auch andere Linux-Systeme): eigenständig veröffentlichen und als
# Debian-Paket und tar.gz an das Release hängen, das der Windows-Job angelegt hat. Getestet wird im Windows-Job.
linux:
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ optimierung-log.txt
abdeckung-log.txt
messen-log.txt
inselvergleich-*.txt
korrekturvergleich/
bildschirmfotos-log.txt

# Private Originaldaten (Klarnamen) – öffentlich nur die anonymisierte Kopie unter testdaten/
Expand Down
38 changes: 38 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
# Änderungen

Was sich von Version zu Version für Anwender ändert. Die Einzelheiten stehen in der [Anleitung](Doku/ANLEITUNG.md), die technische Geschichte im [Migrationsplan](Doku/MIGRATIONSPLAN.md).

## 0.9.6

### Neu

- **Absturzschutz:** Ein unerwarteter Fehler beendet das Programm nicht mehr still. Der aktuelle Plan wird als gemerkter Plan „Notfallsicherung“ abgelegt, die Einzelheiten kommen in `fehlerprotokoll.txt` im Datenordner, und eine Meldung sagt, wo sie liegen. Das gilt auch, wenn eine laufende Generierung abbricht.
- Die Oberfläche ist auch auf einem anders eingestellten System deutsch (Monatsnamen, Zahlen, Datumsformate); leere Zeitfelder zeigen „Stunde“ und „Minute“.
- **Leitstand** (vorher Maschinenraum): Rechenkerne, Schaubild Inseln → Koordinator → bester Plan mit einem grünen Punkt je Verbesserung und einem Kasten, was sich geändert hat; im Automodus die angehobenen Gewichte.
- **Verlauf:** Kosten bzw. Verstöße A, B und C seit dem Start, mit den Phasen des Automodus.
- **Gesicherter Plan:** Bevor ein Plan durch einen Neustart oder das Schließen verloren ginge, wird er gesichert bzw. mit dem bisher gesicherten verglichen und nachgefragt.
- **Spielplandaten:** Kalender der spielfreien Tage mit Grund im Tooltip, Wunschtermine als Kärtchen mit Ziehen und Ablegen (Strg kopiert) und Vorschlag der üblichen Uhrzeit, Setzliste per Ziehen, einheitliche Knöpfe neben den Listen, Marken und Änderungspunkte in der Seitenliste.

### Geändert

- **Fehler des Originals korrigiert:** Ein Wunschtermin gilt beim Zurücksetzen eines Spiels nicht mehr fälschlich als frei; beim Füllen über die Auswärtskoppel wird kein schon terminiertes Spiel mehr umgesetzt; das Startraster legt bei ungerader Mannschaftszahl alle Spieltage an; beim letzten Spieltag zählen alle Überlappungen (die Kosten können dadurch etwas höher sein als im alten AndiGenerator).
- **Pflichtspieltag bei ungerader Mannschaftszahl:** Die zwangsläufig spielfreie Mannschaft wird nicht mehr bestraft, wenn sie in der Woche davor spielt (abschaltbar in den Einstellungen).
- Kopfzeile: ▶ Start / ⏸ Pausieren und ✕ Schließen / ■ Stopp; das Verfahren wird mit zwei Segmentknöpfen gewählt.
- Die Frage „nur Rückrunde planen?“ nennt den Beginn der Rückrunde.

## 0.9.5 (10.10.2026)

### Neu

- Version für Macs (Apple-Chip und Intel) und für Windows auf ARM (Snapdragon).

## 0.9.4 (05.10.2026)

### Neu

- **Automodus:** Die Suche lenkt sich selbst über die Gewichte – erst Pflichtregeln (Stufe A), dann Wünsche (B), dann die übrige Güte (C).
- Pakete für Chromebooks und Linux; die Bildschirmfotos der Anleitung entstehen automatisch.

## 0.9.3 (01.10.2026)

Erste öffentliche Beta: vollständige Portierung des AndiGenerators von Andreas Hofmann nach C#/.NET 10 mit neuer Oberfläche – Optimierung und Bewertung wie im Original, alle Ansichten, Spielplandaten, Export für click-TT, Druck und Excel, Installation und Updates über GitHub Releases.
4 changes: 2 additions & 2 deletions CODE_SIGNING.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
Die Programmdateien und das Setup von AndiGenerator.NET sollen künftig digital signiert werden, damit Windows sie als vertrauenswürdig erkennt.

**Kostenlose Code-Signierung bereitgestellt von [SignPath.io](https://about.signpath.io), Zertifikat von der [SignPath Foundation](https://signpath.org).**
*(Die Aufnahme in das Programm der SignPath Foundation ist beantragt. Bis zur Zusage sind die veröffentlichten Dateien noch nicht signiert.)*
*(Die SignPath Foundation hat den ersten Antrag im Oktober 2026 abgelehnt: Das Projekt sei öffentlich noch nicht bekannt genug. Eine erneute Bewerbung ist ausdrücklich möglich, sobald es breiter genutzt wird. Bis dahin sind die veröffentlichten Dateien nicht signiert; eine bezahlte Signierung ist derzeit nicht vorgesehen. Die Herkunftsnachweise von GitHub (siehe unten) belegen trotzdem, dass jede Datei aus diesem Repository gebaut wurde.)*

Signiert werden ausschließlich Dateien, die aus dem Quellcode dieses Repositorys gebaut werden:

Expand Down Expand Up @@ -44,4 +44,4 @@ Links, die Sie im Programm anklicken (z. B. zum Lizenztext), öffnen Ihren Brows

### English summary

Free code signing provided by SignPath.io, certificate by SignPath Foundation (application pending; releases are unsigned until approval). Only binaries built from this repository by GitHub Actions are signed, and every signing request is approved manually. Committer, reviewer and approver: Peter Buchmann (@PBuchmann), using multi-factor authentication. Privacy: the program does not transfer any data to other networked systems, except for an update check against GitHub at startup, which sends no user data and can be turned off in the *About* dialog.
Free code signing provided by SignPath.io, certificate by SignPath Foundation (first application declined in October 2026 for lack of public visibility; we will reapply once the project is more widely used – until then releases are unsigned, but carry GitHub build provenance attestations). Only binaries built from this repository by GitHub Actions are signed, and every signing request is approved manually. Committer, reviewer and approver: Peter Buchmann (@PBuchmann), using multi-factor authentication. Privacy: the program does not transfer any data to other networked systems, except for an update check against GitHub at startup, which sends no user data and can be turned off in the *About* dialog.
6 changes: 5 additions & 1 deletion CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,16 @@ Auf `main` wird nicht direkt gepusht. Jede Änderung läuft über einen eigenen

Kleine, in sich abgeschlossene Pull Requests lassen sich schneller prüfen als große.

## Neue Version

Was sich für Anwender ändert, kommt mit jedem Pull Request in [CHANGELOG.md](CHANGELOG.md) unter **Unveröffentlicht**. Vor einer neuen Version wird diese Überschrift zu `## x.y.z (Datum)`; danach den Tag `vx.y.z` auf `main` setzen. Der Release-Workflow übernimmt den Abschnitt der Version als Text des Releases auf GitHub.

## Code-Stil

- **Warnungen sind Fehler** – auch die von StyleCop und SonarAnalyzer. Einstellungen in `.editorconfig` und `stylecop.json`.
- **Deutsche Fachbegriffe** für Klassen, Methoden und Variablen (`Mannschaft`, `Spieltag`, `Wunschtermin`), technische Begriffe englisch, wo sie üblich sind (`Command`, `ViewModel`). Kommentare und XML-Dokumentation auf Deutsch.
- **Schichten einhalten:** Domain ← Engine ← Persistence ← Application ← Presentation ← UI ← Desktop; Rendering zeichnet für Bildschirm und PDF. Die Presentation-Schicht kennt Avalonia nicht. Die Architekturtests prüfen das.
- **Referenzmodell:** `src/AndiGenerator.Engine/Referenz` ist eine bewusst wörtliche Portierung des Originals und dient als Maßstab der Paritätstests. Änderungen dort nur, wenn das Verhalten des Originals falsch übertragen wurde.
- **Referenzmodell:** `src/AndiGenerator.Engine/Referenz` ist eine bewusst wörtliche Portierung des Originals und dient als Maßstab der Paritätstests. Änderungen dort nur, wenn das Verhalten des Originals falsch übertragen wurde, oder als abschaltbare Korrektur eines Fehlers des Originals (`Domain.Optionen.Korrekturen`; `Berechnungsoptionen.Original` rechnet weiter wie das Original).
- **Fachliche Abweichungen vom Original** nur nach Absprache und als Eintrag im Migrationsplan (Abschnitt Befunde/Entscheidungen).

## Dateikopf und Lizenz
Expand Down
9 changes: 6 additions & 3 deletions Doku/ANLEITUNG.md
Original file line number Diff line number Diff line change
Expand Up @@ -392,7 +392,7 @@ Gewichten lässt sich auf drei Ebenen, die sich addieren:

![Gewichtung im Detailfeld](Anleitung/Bilder/09-gewichtung.png)

**In den Einstellungen** (links unter *Staffel*) finden Sie alle Gewichtungen auf einer Seite: die allgemeinen Plankosten, die Mannschaftskosten und die Gewichtung je Mannschaft. Auch hier gilt jede Änderung sofort. **Standard wiederherstellen …** setzt alles auf die Ausgangswerte zurück.
**In den Einstellungen** (links unter *Staffel*) finden Sie alle Gewichtungen auf einer Seite: die allgemeinen Plankosten, die Mannschaftskosten und die Gewichtung je Mannschaft. Unter den Mannschaftskosten stehen außerdem die Freitagsregel für die 60-km-Regel und die Regel für den Pflichtspieltag bei ungerader Mannschaftszahl (siehe [Pflichtspieltage](#pflichtspieltage)). Auch hier gilt jede Änderung sofort. **Standard wiederherstellen …** setzt alles auf die Ausgangswerte zurück.

![Einstellungen](Anleitung/Bilder/10-einstellungen.png)

Expand Down Expand Up @@ -535,7 +535,7 @@ An einzelnen Tagen soll gar nicht gespielt werden – etwa weil die Relegationst

Hier legen Sie fest, wie viele Spiele jede Mannschaft in einem Zeitraum mindestens machen muss – etwa mindestens ein Spiel zwischen dem 14. und 18. April oder mindestens drei Spiele im November.

Setzen Sie Pflichtspieltage sparsam ein: Sie nehmen dem Programm Freiheit und verschlechtern den Plan meist. Sinnvoll sind sie vor allem für einen gemeinsamen letzten Spieltag, falls das Programm ihn nicht ohnehin so plant. Bei **ungerader Mannschaftszahl** muss am Pflichtspieltag zwangsläufig eine Mannschaft pausieren und bekäme sonst in einer Woche zwei Spiele. Verlängern Sie dann den Zeitraum, oder löschen Sie die Pflichtspieltage und lassen Sie das Programm den letzten Spieltag über die Kosten optimieren.
Setzen Sie Pflichtspieltage sparsam ein: Sie nehmen dem Programm Freiheit und verschlechtern den Plan meist. Sinnvoll sind sie vor allem für einen gemeinsamen letzten Spieltag, falls das Programm ihn nicht ohnehin so plant. Bei **ungerader Mannschaftszahl** muss am Pflichtspieltag zwangsläufig eine Mannschaft pausieren. Das Original bestraft diese Mannschaft immer; AndiGenerator.NET lässt in einem Pflichtzeitraum mit einem Spiel genau eine fehlende Mannschaft zu, wenn sie in der Woche davor gespielt hat – sie spielt dann also am vorletzten Spieltag. Abschalten lässt sich das in den **Einstellungen** (*Bei ungerader Mannschaftszahl darf am Pflichtspieltag eine Mannschaft spielfrei sein …*); dann gilt die Strafe wie im Original.

### Manuell festgelegte Begegnungen

Expand Down Expand Up @@ -578,7 +578,7 @@ In der Standardgewichtung haben die Kostenarten schon ein sinnvolles Verhältnis

**Länge Spieltage** – Ein Spieltag soll sich über möglichst wenige Tage erstrecken.

**Überlappung letzter Spieltag** und **Länge letzter Spieltag** – dasselbe, nur für den letzten Spieltag. Er soll möglichst kurz sein und so liegen, dass alle Mannschaften zuletzt nur noch ein Spiel haben.
**Überlappung letzter Spieltag** und **Länge letzter Spieltag** – dasselbe, nur für den letzten Spieltag. Er soll möglichst kurz sein und so liegen, dass alle Mannschaften zuletzt nur noch ein Spiel haben. Anders als im Original zählen beim letzten Spieltag alle Überlappungen mit früheren Spieltagen, nicht nur die mit dem ältesten; die Kosten können deshalb etwas höher sein als im alten AndiGenerator.

**Vereinsinterne Spiele am Anfang** – Mannschaften desselben Vereins sollen zu Beginn jeder Halbrunde gegeneinander spielen.

Expand Down Expand Up @@ -646,6 +646,9 @@ Im Bayerischen TTV werden Hallenbelegung und Spiele der Nachbarmannschaften bei
**Wird mein Rechner während der Generierung langsam?**
Das Programm lässt einen Prozessorkern frei und rechnet mit niedriger Priorität, damit andere Programme bedienbar bleiben. Wer den Rechner in Ruhe lassen möchte, pausiert die Generierung.

**Das Programm meldet einen unerwarteten Fehler.**
Dann ist etwas schiefgegangen, womit das Programm nicht gerechnet hat. Es beendet sich dabei nicht, sondern merkt den aktuellen Plan als **Notfallsicherung** (Sie finden ihn unter **Start mit** und in der Planauswahl der Ansichten) und schreibt die Einzelheiten in die Datei `fehlerprotokoll.txt` im Datenordner (unter Windows `%LOCALAPPDATA%\AndiGenerator.NET`); die Meldung nennt den genauen Pfad. Sie können weiterarbeiten, sicherer ist aber, den Plan zu exportieren oder zu merken und das Programm neu zu starten. Bricht eine laufende Generierung ab, steht das in der Statuszeile, und der beste Plan ist ebenso als Notfallsicherung gemerkt. Helfen Sie, den Fehler zu beheben: Schicken Sie das Fehlerprotokoll mit einer kurzen Beschreibung, was Sie gerade getan haben, über die [Fehlermeldungen auf GitHub](https://github.com/PBuchmann/AndiGenerator.NET/issues). Das Protokoll enthält keine Spielplandaten, kann aber Dateipfade Ihres Rechners nennen.

---

*AndiGenerator.NET – Portierung des AndiGenerators von Andreas Hofmann. Freie Software unter der GNU General Public License Version 3.*
Binary file modified Doku/Anleitung.pdf
Binary file not shown.
Loading
Loading